svn update: 48959 (latest:48959)
authorYoumin Ha <youmin.ha@samsung.com>
Tue, 18 May 2010 07:15:01 +0000 (16:15 +0900)
committerYoumin Ha <youmin.ha@samsung.com>
Tue, 18 May 2010 07:15:01 +0000 (16:15 +0900)
709 files changed:
AUTHORS [new file with mode: 0644]
COPYING [new file with mode: 0644]
COPYING-PLAIN [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
INSTALL [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
NEWS [new file with mode: 0644]
README.in [new file with mode: 0644]
autogen.sh [new file with mode: 0755]
configure.ac [new file with mode: 0644]
debian/SVN_REV [new file with mode: 0644]
debian/_original/changelog [new file with mode: 0644]
debian/_original/compat [new file with mode: 0644]
debian/_original/control [new file with mode: 0644]
debian/_original/copyright [new file with mode: 0644]
debian/_original/libevas-dev.install [new file with mode: 0644]
debian/_original/libevas-doc.dirs [new file with mode: 0644]
debian/_original/libevas-doc.doc-base [new file with mode: 0644]
debian/_original/libevas-engines-extras.install [new file with mode: 0644]
debian/_original/libevas-engines.install [new file with mode: 0644]
debian/_original/libevas-svn-01.install [new file with mode: 0644]
debian/_original/libevas-svn-01.shlibs [new file with mode: 0644]
debian/_original/rules [new file with mode: 0755]
doc/.cvsignore [new file with mode: 0644]
doc/Doxyfile [new file with mode: 0644]
doc/Makefile.am [new file with mode: 0644]
doc/e.css [new file with mode: 0644]
doc/evas.dox.in [new file with mode: 0644]
doc/foot.html [new file with mode: 0644]
doc/head.html [new file with mode: 0644]
doc/img/_.gif [new file with mode: 0644]
doc/img/b.png [new file with mode: 0644]
doc/img/e.png [new file with mode: 0755]
doc/img/e_big.png [new file with mode: 0755]
doc/img/evas.eps [new file with mode: 0644]
doc/img/evas.fig [new file with mode: 0644]
doc/img/evas.png [new file with mode: 0644]
doc/img/evas.xcf [new file with mode: 0644]
doc/img/evas_big.eps [new file with mode: 0644]
doc/img/evas_big.png [new file with mode: 0644]
doc/img/evas_mini.png [new file with mode: 0644]
doc/img/evas_small.png [new file with mode: 0644]
doc/img/foot_bg.png [new file with mode: 0755]
doc/img/head_bg.png [new file with mode: 0755]
doc/img/hilite.png [new file with mode: 0644]
doc/img/menu_bg.png [new file with mode: 0755]
doc/img/menu_bg_current.png [new file with mode: 0755]
doc/img/menu_bg_hover.png [new file with mode: 0755]
doc/img/menu_bg_last.png [new file with mode: 0755]
doc/img/menu_bg_unsel.png [new file with mode: 0755]
doc/img/n.gif [new file with mode: 0644]
doc/img/n.png [new file with mode: 0644]
doc/img/t.gif [new file with mode: 0644]
doc/img/t.png [new file with mode: 0644]
doc/img/tl.gif [new file with mode: 0644]
doc/img/tl.png [new file with mode: 0644]
evas-cairo-x11.pc.in [new file with mode: 0644]
evas-direct3d.pc.in [new file with mode: 0644]
evas-directfb.pc.in [new file with mode: 0644]
evas-fb.pc.in [new file with mode: 0644]
evas-opengl-glew.pc.in [new file with mode: 0644]
evas-opengl-sdl.pc.in [new file with mode: 0644]
evas-opengl-x11.pc.in [new file with mode: 0644]
evas-quartz.pc.in [new file with mode: 0644]
evas-software-16-ddraw.pc.in [new file with mode: 0644]
evas-software-16-wince.pc.in [new file with mode: 0644]
evas-software-16-x11.pc.in [new file with mode: 0644]
evas-software-buffer.pc.in [new file with mode: 0644]
evas-software-ddraw.pc.in [new file with mode: 0644]
evas-software-gdi.pc.in [new file with mode: 0644]
evas-software-qtopia.pc.in [new file with mode: 0644]
evas-software-sdl.pc.in [new file with mode: 0644]
evas-software-x11.pc.in [new file with mode: 0644]
evas-xrender-x11.pc.in [new file with mode: 0644]
evas-xrender-xcb.pc.in [new file with mode: 0644]
evas.pc.in [new file with mode: 0644]
evas.spec.in [new file with mode: 0644]
m4/ac_attribute.m4 [new file with mode: 0644]
m4/efl_doxygen.m4 [new file with mode: 0644]
m4/efl_fnmatch.m4 [new file with mode: 0644]
m4/efl_path_max.m4 [new file with mode: 0644]
m4/efl_pthread.m4 [new file with mode: 0644]
m4/evas_check_engine.m4 [new file with mode: 0644]
m4/evas_check_loader.m4 [new file with mode: 0644]
m4/evas_converter.m4 [new file with mode: 0644]
m4/evas_dither.m4 [new file with mode: 0644]
m4/evas_scaler.m4 [new file with mode: 0644]
src/.cvsignore [new file with mode: 0644]
src/Makefile.am [new file with mode: 0644]
src/bin/Makefile.am [new file with mode: 0644]
src/bin/evas_cserve_main.c [new file with mode: 0644]
src/bin/evas_cserve_tool.c [new file with mode: 0644]
src/examples/Makefile.am [new file with mode: 0644]
src/examples/evas-buffer-simple.c [new file with mode: 0644]
src/lib/.cvsignore [new file with mode: 0644]
src/lib/Evas.h [new file with mode: 0644]
src/lib/Makefile.am [new file with mode: 0644]
src/lib/cache/.cvsignore [new file with mode: 0644]
src/lib/cache/Makefile.am [new file with mode: 0644]
src/lib/cache/evas_cache.h [new file with mode: 0644]
src/lib/cache/evas_cache_engine_image.c [new file with mode: 0644]
src/lib/cache/evas_cache_image.c [new file with mode: 0644]
src/lib/cache/evas_preload.c [new file with mode: 0644]
src/lib/canvas/.cvsignore [new file with mode: 0644]
src/lib/canvas/Makefile.am [new file with mode: 0644]
src/lib/canvas/evas_async_events.c [new file with mode: 0644]
src/lib/canvas/evas_callbacks.c [new file with mode: 0644]
src/lib/canvas/evas_clip.c [new file with mode: 0644]
src/lib/canvas/evas_data.c [new file with mode: 0644]
src/lib/canvas/evas_events.c [new file with mode: 0644]
src/lib/canvas/evas_focus.c [new file with mode: 0644]
src/lib/canvas/evas_font_dir.c [new file with mode: 0644]
src/lib/canvas/evas_key.c [new file with mode: 0644]
src/lib/canvas/evas_key_grab.c [new file with mode: 0644]
src/lib/canvas/evas_layer.c [new file with mode: 0644]
src/lib/canvas/evas_main.c [new file with mode: 0644]
src/lib/canvas/evas_map.c [new file with mode: 0644]
src/lib/canvas/evas_name.c [new file with mode: 0644]
src/lib/canvas/evas_object_box.c [new file with mode: 0644]
src/lib/canvas/evas_object_gradient.c [new file with mode: 0644]
src/lib/canvas/evas_object_gradient2.c [new file with mode: 0644]
src/lib/canvas/evas_object_gradient2_linear.c [new file with mode: 0644]
src/lib/canvas/evas_object_gradient2_radial.c [new file with mode: 0644]
src/lib/canvas/evas_object_image.c [new file with mode: 0644]
src/lib/canvas/evas_object_inform.c [new file with mode: 0644]
src/lib/canvas/evas_object_intercept.c [new file with mode: 0644]
src/lib/canvas/evas_object_line.c [new file with mode: 0644]
src/lib/canvas/evas_object_main.c [new file with mode: 0644]
src/lib/canvas/evas_object_polygon.c [new file with mode: 0644]
src/lib/canvas/evas_object_rectangle.c [new file with mode: 0644]
src/lib/canvas/evas_object_smart.c [new file with mode: 0644]
src/lib/canvas/evas_object_smart_clipped.c [new file with mode: 0644]
src/lib/canvas/evas_object_table.c [new file with mode: 0644]
src/lib/canvas/evas_object_text.c [new file with mode: 0644]
src/lib/canvas/evas_object_textblock.c [new file with mode: 0644]
src/lib/canvas/evas_rectangle.c [new file with mode: 0644]
src/lib/canvas/evas_render.c [new file with mode: 0644]
src/lib/canvas/evas_smart.c [new file with mode: 0644]
src/lib/canvas/evas_stack.c [new file with mode: 0644]
src/lib/canvas/evas_stats.c [new file with mode: 0644]
src/lib/canvas/evas_transform.c [new file with mode: 0644]
src/lib/cserve/Makefile.am [new file with mode: 0644]
src/lib/cserve/evas_cs.h [new file with mode: 0644]
src/lib/cserve/evas_cs_client.c [new file with mode: 0644]
src/lib/cserve/evas_cs_main.c [new file with mode: 0644]
src/lib/cserve/evas_cs_mem.c [new file with mode: 0644]
src/lib/cserve/evas_cs_server.c [new file with mode: 0644]
src/lib/engines/.cvsignore [new file with mode: 0644]
src/lib/engines/Makefile.am [new file with mode: 0644]
src/lib/engines/common/.cvsignore [new file with mode: 0644]
src/lib/engines/common/Makefile.am [new file with mode: 0644]
src/lib/engines/common/evas_blend.h [new file with mode: 0644]
src/lib/engines/common/evas_blend_main.c [new file with mode: 0644]
src/lib/engines/common/evas_blend_private.h [new file with mode: 0644]
src/lib/engines/common/evas_blit_main.c [new file with mode: 0644]
src/lib/engines/common/evas_convert_color.c [new file with mode: 0644]
src/lib/engines/common/evas_convert_color.h [new file with mode: 0644]
src/lib/engines/common/evas_convert_colorspace.c [new file with mode: 0644]
src/lib/engines/common/evas_convert_colorspace.h [new file with mode: 0644]
src/lib/engines/common/evas_convert_gry_1.c [new file with mode: 0644]
src/lib/engines/common/evas_convert_gry_1.h [new file with mode: 0644]
src/lib/engines/common/evas_convert_gry_4.c [new file with mode: 0644]
src/lib/engines/common/evas_convert_gry_4.h [new file with mode: 0644]
src/lib/engines/common/evas_convert_gry_8.c [new file with mode: 0644]
src/lib/engines/common/evas_convert_gry_8.h [new file with mode: 0644]
src/lib/engines/common/evas_convert_grypal_6.c [new file with mode: 0644]
src/lib/engines/common/evas_convert_grypal_6.h [new file with mode: 0644]
src/lib/engines/common/evas_convert_main.c [new file with mode: 0644]
src/lib/engines/common/evas_convert_main.h [new file with mode: 0644]
src/lib/engines/common/evas_convert_rgb_16.c [new file with mode: 0644]
src/lib/engines/common/evas_convert_rgb_16.h [new file with mode: 0644]
src/lib/engines/common/evas_convert_rgb_24.c [new file with mode: 0644]
src/lib/engines/common/evas_convert_rgb_24.h [new file with mode: 0644]
src/lib/engines/common/evas_convert_rgb_32.c [new file with mode: 0644]
src/lib/engines/common/evas_convert_rgb_32.h [new file with mode: 0644]
src/lib/engines/common/evas_convert_rgb_8.c [new file with mode: 0644]
src/lib/engines/common/evas_convert_rgb_8.h [new file with mode: 0644]
src/lib/engines/common/evas_convert_yuv.c [new file with mode: 0644]
src/lib/engines/common/evas_convert_yuv.h [new file with mode: 0644]
src/lib/engines/common/evas_cpu.c [new file with mode: 0644]
src/lib/engines/common/evas_draw.h [new file with mode: 0644]
src/lib/engines/common/evas_draw_main.c [new file with mode: 0644]
src/lib/engines/common/evas_font.h [new file with mode: 0644]
src/lib/engines/common/evas_font_draw.c [new file with mode: 0644]
src/lib/engines/common/evas_font_load.c [new file with mode: 0644]
src/lib/engines/common/evas_font_main.c [new file with mode: 0644]
src/lib/engines/common/evas_font_query.c [new file with mode: 0644]
src/lib/engines/common/evas_gradient.h [new file with mode: 0644]
src/lib/engines/common/evas_gradient2_linear.c [new file with mode: 0644]
src/lib/engines/common/evas_gradient2_main.c [new file with mode: 0644]
src/lib/engines/common/evas_gradient2_radial.c [new file with mode: 0644]
src/lib/engines/common/evas_gradient_angular.c [new file with mode: 0644]
src/lib/engines/common/evas_gradient_linear.c [new file with mode: 0644]
src/lib/engines/common/evas_gradient_main.c [new file with mode: 0644]
src/lib/engines/common/evas_gradient_private.h [new file with mode: 0644]
src/lib/engines/common/evas_gradient_radial.c [new file with mode: 0644]
src/lib/engines/common/evas_gradient_rectangular.c [new file with mode: 0644]
src/lib/engines/common/evas_gradient_sinusoidal.c [new file with mode: 0644]
src/lib/engines/common/evas_image.h [new file with mode: 0644]
src/lib/engines/common/evas_image_data.c [new file with mode: 0644]
src/lib/engines/common/evas_image_fill_main.c [new file with mode: 0644]
src/lib/engines/common/evas_image_load.c [new file with mode: 0644]
src/lib/engines/common/evas_image_main.c [new file with mode: 0644]
src/lib/engines/common/evas_image_private.h [new file with mode: 0644]
src/lib/engines/common/evas_image_save.c [new file with mode: 0644]
src/lib/engines/common/evas_image_scalecache.c [new file with mode: 0644]
src/lib/engines/common/evas_intl/evas_intl_arabic.c [new file with mode: 0644]
src/lib/engines/common/evas_intl/evas_intl_arabic.h [new file with mode: 0644]
src/lib/engines/common/evas_intl_utils.c [new file with mode: 0644]
src/lib/engines/common/evas_intl_utils.h [new file with mode: 0644]
src/lib/engines/common/evas_line.h [new file with mode: 0644]
src/lib/engines/common/evas_line_main.c [new file with mode: 0644]
src/lib/engines/common/evas_map_image.c [new file with mode: 0644]
src/lib/engines/common/evas_map_image.h [new file with mode: 0644]
src/lib/engines/common/evas_map_image_core.c [new file with mode: 0644]
src/lib/engines/common/evas_map_image_internal.c [new file with mode: 0644]
src/lib/engines/common/evas_map_image_loop.c [new file with mode: 0644]
src/lib/engines/common/evas_op_add/.cvsignore [new file with mode: 0644]
src/lib/engines/common/evas_op_add/Makefile.am [new file with mode: 0644]
src/lib/engines/common/evas_op_add/op_add_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_add/op_add_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_add/op_add_mask_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_add/op_add_mask_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_add/op_add_pixel_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_add/op_add_pixel_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_add/op_add_pixel_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_add/op_add_pixel_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_add/op_add_pixel_mask_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_add/op_add_pixel_mask_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_add_main_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/.cvsignore [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/Makefile.am [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/op_blend_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/op_blend_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/op_blend_color_neon.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/op_blend_mask_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/op_blend_mask_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/op_blend_mask_color_neon.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/op_blend_pixel_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/op_blend_pixel_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/op_blend_pixel_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/op_blend_pixel_color_neon.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_neon.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend/op_blend_pixel_neon.c [new file with mode: 0644]
src/lib/engines/common/evas_op_blend_main_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/.cvsignore [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/Makefile.am [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_color_neon.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_mask_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_mask_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_mask_color_neon.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_pixel_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_pixel_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_pixel_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_pixel_color_neon.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_pixel_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_neon.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_pixel_neon.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy_main_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mask/.cvsignore [new file with mode: 0644]
src/lib/engines/common/evas_op_mask/Makefile.am [new file with mode: 0644]
src/lib/engines/common/evas_op_mask/op_mask_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mask/op_mask_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mask/op_mask_mask_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mask/op_mask_mask_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mask/op_mask_pixel_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mask/op_mask_pixel_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mask/op_mask_pixel_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mask/op_mask_pixel_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mask_main_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mul/.cvsignore [new file with mode: 0644]
src/lib/engines/common/evas_op_mul/Makefile.am [new file with mode: 0644]
src/lib/engines/common/evas_op_mul/op_mul_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mul/op_mul_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mul/op_mul_mask_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mul/op_mul_mask_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mul/op_mul_pixel_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mul/op_mul_pixel_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mul/op_mul_pixel_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mul/op_mul_pixel_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_mul_main_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_sub/.cvsignore [new file with mode: 0644]
src/lib/engines/common/evas_op_sub/Makefile.am [new file with mode: 0644]
src/lib/engines/common/evas_op_sub/op_sub_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_sub/op_sub_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_sub/op_sub_mask_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_sub/op_sub_mask_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_sub/op_sub_pixel_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_sub/op_sub_pixel_color_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_sub/op_sub_pixel_color_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_sub/op_sub_pixel_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_.c [new file with mode: 0644]
src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_i386.c [new file with mode: 0644]
src/lib/engines/common/evas_op_sub_main_.c [new file with mode: 0644]
src/lib/engines/common/evas_pipe.c [new file with mode: 0644]
src/lib/engines/common/evas_pipe.h [new file with mode: 0644]
src/lib/engines/common/evas_polygon.h [new file with mode: 0644]
src/lib/engines/common/evas_polygon_main.c [new file with mode: 0644]
src/lib/engines/common/evas_rectangle.h [new file with mode: 0644]
src/lib/engines/common/evas_rectangle_main.c [new file with mode: 0644]
src/lib/engines/common/evas_regionbuf.c [new file with mode: 0644]
src/lib/engines/common/evas_scale_main.c [new file with mode: 0644]
src/lib/engines/common/evas_scale_main.h [new file with mode: 0644]
src/lib/engines/common/evas_scale_sample.c [new file with mode: 0644]
src/lib/engines/common/evas_scale_smooth.c [new file with mode: 0644]
src/lib/engines/common/evas_scale_smooth.h [new file with mode: 0644]
src/lib/engines/common/evas_scale_smooth_scaler.c [new file with mode: 0644]
src/lib/engines/common/evas_scale_smooth_scaler_down.c [new file with mode: 0644]
src/lib/engines/common/evas_scale_smooth_scaler_downx.c [new file with mode: 0644]
src/lib/engines/common/evas_scale_smooth_scaler_downx_downy.c [new file with mode: 0644]
src/lib/engines/common/evas_scale_smooth_scaler_downy.c [new file with mode: 0644]
src/lib/engines/common/evas_scale_smooth_scaler_noscale.c [new file with mode: 0644]
src/lib/engines/common/evas_scale_smooth_scaler_up.c [new file with mode: 0644]
src/lib/engines/common/evas_scale_span.c [new file with mode: 0644]
src/lib/engines/common/evas_scale_span.h [new file with mode: 0644]
src/lib/engines/common/evas_tiler.c [new file with mode: 0644]
src/lib/engines/common_16/.cvsignore [new file with mode: 0644]
src/lib/engines/common_16/Makefile.am [new file with mode: 0644]
src/lib/engines/common_16/evas_soft16_dither_mask.c [new file with mode: 0644]
src/lib/engines/common_16/evas_soft16_font.c [new file with mode: 0644]
src/lib/engines/common_16/evas_soft16_image_scaled_sampled.c [new file with mode: 0644]
src/lib/engines/common_16/evas_soft16_image_unscaled.c [new file with mode: 0644]
src/lib/engines/common_16/evas_soft16_line.c [new file with mode: 0644]
src/lib/engines/common_16/evas_soft16_main.c [new file with mode: 0644]
src/lib/engines/common_16/evas_soft16_point_blend.c [new file with mode: 0644]
src/lib/engines/common_16/evas_soft16_polygon.c [new file with mode: 0644]
src/lib/engines/common_16/evas_soft16_rectangle.c [new file with mode: 0644]
src/lib/engines/common_16/evas_soft16_scanline_blend.c [new file with mode: 0644]
src/lib/engines/common_16/evas_soft16_scanline_fill.c [new file with mode: 0644]
src/lib/file/.cvsignore [new file with mode: 0644]
src/lib/file/Makefile.am [new file with mode: 0644]
src/lib/file/evas_module.c [new file with mode: 0644]
src/lib/file/evas_module.h [new file with mode: 0644]
src/lib/file/evas_path.c [new file with mode: 0644]
src/lib/file/evas_path.h [new file with mode: 0644]
src/lib/imaging/.cvsignore [new file with mode: 0644]
src/lib/imaging/Makefile.am [new file with mode: 0644]
src/lib/imaging/evas_imaging.c [new file with mode: 0644]
src/lib/include/.cvsignore [new file with mode: 0644]
src/lib/include/Makefile.am [new file with mode: 0644]
src/lib/include/evas_blend_ops.h [new file with mode: 0644]
src/lib/include/evas_cairo_common.h [new file with mode: 0644]
src/lib/include/evas_common.h [new file with mode: 0644]
src/lib/include/evas_common_soft16.h [new file with mode: 0644]
src/lib/include/evas_inline.x [new file with mode: 0644]
src/lib/include/evas_macros.h [new file with mode: 0644]
src/lib/include/evas_mmx.h [new file with mode: 0644]
src/lib/include/evas_options.h [new file with mode: 0644]
src/lib/include/evas_private.h [new file with mode: 0644]
src/lib/main.c [new file with mode: 0644]
src/modules/.cvsignore [new file with mode: 0644]
src/modules/Makefile.am [new file with mode: 0644]
src/modules/engines/.cvsignore [new file with mode: 0644]
src/modules/engines/Makefile.am [new file with mode: 0644]
src/modules/engines/buffer/.cvsignore [new file with mode: 0644]
src/modules/engines/buffer/Evas_Engine_Buffer.h [new file with mode: 0644]
src/modules/engines/buffer/Makefile.am [new file with mode: 0644]
src/modules/engines/buffer/evas_engine.c [new file with mode: 0644]
src/modules/engines/buffer/evas_engine.h [new file with mode: 0644]
src/modules/engines/buffer/evas_outbuf.c [new file with mode: 0644]
src/modules/engines/cairo_common/.cvsignore [new file with mode: 0644]
src/modules/engines/cairo_common/Makefile.am [new file with mode: 0644]
src/modules/engines/cairo_common/evas_cairo_common.h [new file with mode: 0644]
src/modules/engines/cairo_common/evas_cairo_main.c [new file with mode: 0644]
src/modules/engines/cairo_common/evas_cairo_private.h [new file with mode: 0644]
src/modules/engines/cairo_x11/.cvsignore [new file with mode: 0644]
src/modules/engines/cairo_x11/Evas_Engine_Cairo_X11.h [new file with mode: 0644]
src/modules/engines/cairo_x11/Makefile.am [new file with mode: 0644]
src/modules/engines/cairo_x11/evas_engine.c [new file with mode: 0644]
src/modules/engines/cairo_x11/evas_engine.h [new file with mode: 0644]
src/modules/engines/cairo_x11/evas_x_main.c [new file with mode: 0644]
src/modules/engines/direct3d/.cvsignore [new file with mode: 0644]
src/modules/engines/direct3d/Evas_Engine_Direct3D.h [new file with mode: 0644]
src/modules/engines/direct3d/Makefile.am [new file with mode: 0644]
src/modules/engines/direct3d/array.h [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_buffer.c [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_context.cpp [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_context.h [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_device.cpp [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_device.h [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_image_cache.cpp [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_image_cache.h [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_main.cpp [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_object.cpp [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_object.h [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_object_font.cpp [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_object_font.h [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_object_image.cpp [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_object_image.h [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_object_line.cpp [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_object_line.h [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_object_rect.cpp [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_object_rect.h [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_scene.cpp [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_scene.h [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_shader_pack.cpp [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_shader_pack.h [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_vertex_buffer_cache.cpp [new file with mode: 0644]
src/modules/engines/direct3d/evas_direct3d_vertex_buffer_cache.h [new file with mode: 0644]
src/modules/engines/direct3d/evas_engine.c [new file with mode: 0644]
src/modules/engines/direct3d/evas_engine.h [new file with mode: 0644]
src/modules/engines/direct3d/ref.h [new file with mode: 0644]
src/modules/engines/directfb/Evas_Engine_DirectFB.h [new file with mode: 0644]
src/modules/engines/directfb/Makefile.am [new file with mode: 0644]
src/modules/engines/directfb/evas_engine.c [new file with mode: 0644]
src/modules/engines/directfb/evas_engine.h [new file with mode: 0644]
src/modules/engines/directfb/polygon.c [new file with mode: 0644]
src/modules/engines/fb/.cvsignore [new file with mode: 0644]
src/modules/engines/fb/Evas_Engine_FB.h [new file with mode: 0644]
src/modules/engines/fb/Makefile.am [new file with mode: 0644]
src/modules/engines/fb/evas_engine.c [new file with mode: 0644]
src/modules/engines/fb/evas_engine.h [new file with mode: 0644]
src/modules/engines/fb/evas_fb.h [new file with mode: 0644]
src/modules/engines/fb/evas_fb_main.c [new file with mode: 0644]
src/modules/engines/fb/evas_outbuf.c [new file with mode: 0644]
src/modules/engines/gl_common/.cvsignore [new file with mode: 0644]
src/modules/engines/gl_common/Makefile.am [new file with mode: 0644]
src/modules/engines/gl_common/evas_gl_common.h [new file with mode: 0644]
src/modules/engines/gl_common/evas_gl_context.c [new file with mode: 0644]
src/modules/engines/gl_common/evas_gl_font.c [new file with mode: 0644]
src/modules/engines/gl_common/evas_gl_image.c [new file with mode: 0644]
src/modules/engines/gl_common/evas_gl_line.c [new file with mode: 0644]
src/modules/engines/gl_common/evas_gl_polygon.c [new file with mode: 0644]
src/modules/engines/gl_common/evas_gl_private.h [new file with mode: 0644]
src/modules/engines/gl_common/evas_gl_rectangle.c [new file with mode: 0644]
src/modules/engines/gl_common/evas_gl_shader.c [new file with mode: 0644]
src/modules/engines/gl_common/evas_gl_texture.c [new file with mode: 0644]
src/modules/engines/gl_common/shader/compile-s3c6410.sh [new file with mode: 0755]
src/modules/engines/gl_common/shader/compile-sgx.sh [new file with mode: 0755]
src/modules/engines/gl_common/shader/font_frag.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/font_frag.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/font_frag_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/font_frag_s3c6410.asm [new file with mode: 0644]
src/modules/engines/gl_common/shader/font_vert.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/font_vert.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/font_vert_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_bgra_frag.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_bgra_frag.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_bgra_frag_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_bgra_nomul_frag.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_bgra_nomul_frag.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_bgra_nomul_frag_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_bgra_nomul_vert.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_bgra_nomul_vert.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_bgra_nomul_vert_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_bgra_vert.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_bgra_vert.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_bgra_vert_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_frag.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_frag.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_frag_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_frag_s3c6410.asm [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_nomul_frag.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_nomul_frag.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_nomul_frag_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_nomul_vert.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_nomul_vert.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_nomul_vert_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_vert.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_vert.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/img_vert_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/make-c-bin.sh [new file with mode: 0755]
src/modules/engines/gl_common/shader/make-c-str.sh [new file with mode: 0755]
src/modules/engines/gl_common/shader/rect_frag.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/rect_frag.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/rect_frag_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/rect_frag_s3c6410.asm [new file with mode: 0644]
src/modules/engines/gl_common/shader/rect_vert.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/rect_vert.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/rect_vert_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/tex_frag.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/tex_frag.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/tex_frag_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/tex_frag_s3c6410.asm [new file with mode: 0644]
src/modules/engines/gl_common/shader/tex_nomul_frag.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/tex_nomul_frag.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/tex_nomul_frag_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/tex_nomul_vert.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/tex_nomul_vert.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/tex_nomul_vert_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/tex_vert.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/tex_vert.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/tex_vert_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/yuv_frag.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/yuv_frag.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/yuv_frag_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/yuv_frag_s3c6410.asm [new file with mode: 0644]
src/modules/engines/gl_common/shader/yuv_nomul_frag.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/yuv_nomul_frag.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/yuv_nomul_frag_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/yuv_nomul_vert.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/yuv_nomul_vert.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/yuv_nomul_vert_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/yuv_vert.h [new file with mode: 0644]
src/modules/engines/gl_common/shader/yuv_vert.shd [new file with mode: 0644]
src/modules/engines/gl_common/shader/yuv_vert_bin_s3c6410.h [new file with mode: 0644]
src/modules/engines/gl_glew/.cvsignore [new file with mode: 0644]
src/modules/engines/gl_glew/Evas_Engine_GL_Glew.h [new file with mode: 0644]
src/modules/engines/gl_glew/Makefile.am [new file with mode: 0644]
src/modules/engines/gl_glew/evas_engine.c [new file with mode: 0644]
src/modules/engines/gl_glew/evas_engine.h [new file with mode: 0644]
src/modules/engines/gl_glew/evas_glew_win32_main.c [new file with mode: 0644]
src/modules/engines/gl_sdl/Evas_Engine_GL_SDL.h [new file with mode: 0644]
src/modules/engines/gl_sdl/Makefile.am [new file with mode: 0644]
src/modules/engines/gl_sdl/evas_engine.c [new file with mode: 0644]
src/modules/engines/gl_sdl/evas_engine.h [new file with mode: 0644]
src/modules/engines/gl_x11/.cvsignore [new file with mode: 0644]
src/modules/engines/gl_x11/Evas_Engine_GL_X11.h [new file with mode: 0644]
src/modules/engines/gl_x11/Makefile.am [new file with mode: 0644]
src/modules/engines/gl_x11/evas_engine.c [new file with mode: 0644]
src/modules/engines/gl_x11/evas_engine.h [new file with mode: 0644]
src/modules/engines/gl_x11/evas_x_main.c [new file with mode: 0644]
src/modules/engines/quartz/Evas_Engine_Quartz.h [new file with mode: 0644]
src/modules/engines/quartz/Makefile.am [new file with mode: 0644]
src/modules/engines/quartz/README [new file with mode: 0644]
src/modules/engines/quartz/evas_engine.c [new file with mode: 0644]
src/modules/engines/quartz/evas_engine.h [new file with mode: 0644]
src/modules/engines/quartz/evas_quartz_private.h [new file with mode: 0644]
src/modules/engines/software_16/.cvsignore [new file with mode: 0644]
src/modules/engines/software_16/Makefile.am [new file with mode: 0644]
src/modules/engines/software_16/evas_engine.c [new file with mode: 0644]
src/modules/engines/software_16_ddraw/.cvsignore [new file with mode: 0644]
src/modules/engines/software_16_ddraw/Evas_Engine_Software_16_DDraw.h [new file with mode: 0644]
src/modules/engines/software_16_ddraw/Makefile.am [new file with mode: 0644]
src/modules/engines/software_16_ddraw/evas_ddraw_buffer.cpp [new file with mode: 0644]
src/modules/engines/software_16_ddraw/evas_ddraw_main.cpp [new file with mode: 0644]
src/modules/engines/software_16_ddraw/evas_engine.c [new file with mode: 0644]
src/modules/engines/software_16_ddraw/evas_engine.h [new file with mode: 0644]
src/modules/engines/software_16_sdl/.cvsignore [new file with mode: 0644]
src/modules/engines/software_16_sdl/Evas_Engine_SDL_16.h [new file with mode: 0644]
src/modules/engines/software_16_sdl/Makefile.am [new file with mode: 0644]
src/modules/engines/software_16_sdl/evas_engine.c [new file with mode: 0644]
src/modules/engines/software_16_sdl/evas_engine.h [new file with mode: 0644]
src/modules/engines/software_16_wince/.cvsignore [new file with mode: 0644]
src/modules/engines/software_16_wince/Evas_Engine_Software_16_WinCE.h [new file with mode: 0644]
src/modules/engines/software_16_wince/Makefile.am [new file with mode: 0644]
src/modules/engines/software_16_wince/evas_engine.c [new file with mode: 0644]
src/modules/engines/software_16_wince/evas_engine.h [new file with mode: 0644]
src/modules/engines/software_16_wince/evas_wince_ddraw_buffer.cpp [new file with mode: 0644]
src/modules/engines/software_16_wince/evas_wince_fb_buffer.c [new file with mode: 0644]
src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c [new file with mode: 0644]
src/modules/engines/software_16_wince/evas_wince_gdi_buffer.c [new file with mode: 0644]
src/modules/engines/software_16_x11/.cvsignore [new file with mode: 0644]
src/modules/engines/software_16_x11/Evas_Engine_Software_16_X11.h [new file with mode: 0644]
src/modules/engines/software_16_x11/Makefile.am [new file with mode: 0644]
src/modules/engines/software_16_x11/evas_engine.c [new file with mode: 0644]
src/modules/engines/software_16_x11/evas_engine.h [new file with mode: 0644]
src/modules/engines/software_16_x11/evas_x_buffer.c [new file with mode: 0644]
src/modules/engines/software_ddraw/.cvsignore [new file with mode: 0644]
src/modules/engines/software_ddraw/Evas_Engine_Software_DDraw.h [new file with mode: 0644]
src/modules/engines/software_ddraw/Makefile.am [new file with mode: 0644]
src/modules/engines/software_ddraw/evas_ddraw_buffer.c [new file with mode: 0644]
src/modules/engines/software_ddraw/evas_ddraw_main.cpp [new file with mode: 0644]
src/modules/engines/software_ddraw/evas_engine.c [new file with mode: 0644]
src/modules/engines/software_ddraw/evas_engine.h [new file with mode: 0644]
src/modules/engines/software_ddraw/evas_outbuf.c [new file with mode: 0644]
src/modules/engines/software_gdi/Evas_Engine_Software_Gdi.h [new file with mode: 0644]
src/modules/engines/software_gdi/Makefile.am [new file with mode: 0644]
src/modules/engines/software_gdi/evas_engine.c [new file with mode: 0644]
src/modules/engines/software_gdi/evas_engine.h [new file with mode: 0644]
src/modules/engines/software_gdi/evas_gdi_buffer.c [new file with mode: 0644]
src/modules/engines/software_gdi/evas_gdi_main.c [new file with mode: 0644]
src/modules/engines/software_gdi/evas_outbuf.c [new file with mode: 0644]
src/modules/engines/software_generic/.cvsignore [new file with mode: 0644]
src/modules/engines/software_generic/Makefile.am [new file with mode: 0644]
src/modules/engines/software_generic/evas_engine.c [new file with mode: 0644]
src/modules/engines/software_qtopia/.cvsignore [new file with mode: 0644]
src/modules/engines/software_qtopia/Evas_Engine_Software_Qtopia.h [new file with mode: 0644]
src/modules/engines/software_qtopia/Makefile.am [new file with mode: 0644]
src/modules/engines/software_qtopia/evas_engine.c [new file with mode: 0644]
src/modules/engines/software_qtopia/evas_engine.h [new file with mode: 0644]
src/modules/engines/software_qtopia/evas_outbuf.c [new file with mode: 0644]
src/modules/engines/software_qtopia/evas_qt_main.cpp [new file with mode: 0644]
src/modules/engines/software_sdl/.cvsignore [new file with mode: 0644]
src/modules/engines/software_sdl/Evas_Engine_SDL.h [new file with mode: 0644]
src/modules/engines/software_sdl/Makefile.am [new file with mode: 0644]
src/modules/engines/software_sdl/evas_engine.c [new file with mode: 0644]
src/modules/engines/software_sdl/evas_engine.h [new file with mode: 0644]
src/modules/engines/software_x11/.cvsignore [new file with mode: 0644]
src/modules/engines/software_x11/Evas_Engine_Software_X11.h [new file with mode: 0644]
src/modules/engines/software_x11/Makefile.am [new file with mode: 0644]
src/modules/engines/software_x11/evas_engine.c [new file with mode: 0644]
src/modules/engines/software_x11/evas_engine.h [new file with mode: 0644]
src/modules/engines/software_x11/evas_xcb_buffer.c [new file with mode: 0644]
src/modules/engines/software_x11/evas_xcb_buffer.h [new file with mode: 0644]
src/modules/engines/software_x11/evas_xcb_color.c [new file with mode: 0644]
src/modules/engines/software_x11/evas_xcb_color.h [new file with mode: 0644]
src/modules/engines/software_x11/evas_xcb_main.c [new file with mode: 0644]
src/modules/engines/software_x11/evas_xcb_outbuf.c [new file with mode: 0644]
src/modules/engines/software_x11/evas_xcb_outbuf.h [new file with mode: 0644]
src/modules/engines/software_x11/evas_xlib_buffer.c [new file with mode: 0644]
src/modules/engines/software_x11/evas_xlib_buffer.h [new file with mode: 0644]
src/modules/engines/software_x11/evas_xlib_color.c [new file with mode: 0644]
src/modules/engines/software_x11/evas_xlib_color.h [new file with mode: 0644]
src/modules/engines/software_x11/evas_xlib_main.c [new file with mode: 0644]
src/modules/engines/software_x11/evas_xlib_outbuf.c [new file with mode: 0644]
src/modules/engines/software_x11/evas_xlib_outbuf.h [new file with mode: 0644]
src/modules/engines/xrender_x11/.cvsignore [new file with mode: 0644]
src/modules/engines/xrender_x11/Evas_Engine_XRender_X11.h [new file with mode: 0644]
src/modules/engines/xrender_x11/Makefile.am [new file with mode: 0644]
src/modules/engines/xrender_x11/evas_engine.c [new file with mode: 0644]
src/modules/engines/xrender_x11/evas_engine.h [new file with mode: 0644]
src/modules/engines/xrender_x11/evas_engine_xcb_font.c [new file with mode: 0644]
src/modules/engines/xrender_x11/evas_engine_xcb_gradient.c [new file with mode: 0644]
src/modules/engines/xrender_x11/evas_engine_xcb_image.c [new file with mode: 0644]
src/modules/engines/xrender_x11/evas_engine_xcb_render.c [new file with mode: 0644]
src/modules/engines/xrender_x11/evas_engine_xcb_ximage.c [new file with mode: 0644]
src/modules/engines/xrender_x11/evas_engine_xlib_font.c [new file with mode: 0644]
src/modules/engines/xrender_x11/evas_engine_xlib_gradient.c [new file with mode: 0644]
src/modules/engines/xrender_x11/evas_engine_xlib_image.c [new file with mode: 0644]
src/modules/engines/xrender_x11/evas_engine_xlib_render.c [new file with mode: 0644]
src/modules/engines/xrender_x11/evas_engine_xlib_ximage.c [new file with mode: 0644]
src/modules/loaders/.cvsignore [new file with mode: 0644]
src/modules/loaders/Makefile.am [new file with mode: 0644]
src/modules/loaders/edb/.cvsignore [new file with mode: 0644]
src/modules/loaders/edb/Makefile.am [new file with mode: 0644]
src/modules/loaders/edb/evas_image_load_edb.c [new file with mode: 0644]
src/modules/loaders/eet/.cvsignore [new file with mode: 0644]
src/modules/loaders/eet/Makefile.am [new file with mode: 0644]
src/modules/loaders/eet/evas_image_load_eet.c [new file with mode: 0644]
src/modules/loaders/gif/.cvsignore [new file with mode: 0644]
src/modules/loaders/gif/Makefile.am [new file with mode: 0644]
src/modules/loaders/gif/evas_image_load_gif.c [new file with mode: 0644]
src/modules/loaders/jpeg/.cvsignore [new file with mode: 0644]
src/modules/loaders/jpeg/Makefile.am [new file with mode: 0644]
src/modules/loaders/jpeg/evas_image_load_jpeg.c [new file with mode: 0644]
src/modules/loaders/pmaps/.cvsignore [new file with mode: 0644]
src/modules/loaders/pmaps/Makefile.am [new file with mode: 0644]
src/modules/loaders/pmaps/evas_image_load_pmaps.c [new file with mode: 0644]
src/modules/loaders/png/.cvsignore [new file with mode: 0644]
src/modules/loaders/png/Makefile.am [new file with mode: 0644]
src/modules/loaders/png/evas_image_load_png.c [new file with mode: 0644]
src/modules/loaders/svg/.cvsignore [new file with mode: 0644]
src/modules/loaders/svg/Makefile.am [new file with mode: 0644]
src/modules/loaders/svg/evas_image_load_svg.c [new file with mode: 0644]
src/modules/loaders/tiff/.cvsignore [new file with mode: 0644]
src/modules/loaders/tiff/Makefile.am [new file with mode: 0644]
src/modules/loaders/tiff/evas_image_load_tiff.c [new file with mode: 0644]
src/modules/loaders/xpm/.cvsignore [new file with mode: 0644]
src/modules/loaders/xpm/Makefile.am [new file with mode: 0644]
src/modules/loaders/xpm/evas_image_load_xpm.c [new file with mode: 0644]
src/modules/savers/.cvsignore [new file with mode: 0644]
src/modules/savers/Makefile.am [new file with mode: 0644]
src/modules/savers/edb/.cvsignore [new file with mode: 0644]
src/modules/savers/edb/Makefile.am [new file with mode: 0644]
src/modules/savers/edb/evas_image_save_edb.c [new file with mode: 0644]
src/modules/savers/eet/.cvsignore [new file with mode: 0644]
src/modules/savers/eet/Makefile.am [new file with mode: 0644]
src/modules/savers/eet/evas_image_save_eet.c [new file with mode: 0644]
src/modules/savers/jpeg/.cvsignore [new file with mode: 0644]
src/modules/savers/jpeg/Makefile.am [new file with mode: 0644]
src/modules/savers/jpeg/evas_image_save_jpeg.c [new file with mode: 0644]
src/modules/savers/png/.cvsignore [new file with mode: 0644]
src/modules/savers/png/Makefile.am [new file with mode: 0644]
src/modules/savers/png/evas_image_save_png.c [new file with mode: 0644]
src/modules/savers/tiff/.cvsignore [new file with mode: 0644]
src/modules/savers/tiff/Makefile.am [new file with mode: 0644]
src/modules/savers/tiff/evas_image_save_tiff.c [new file with mode: 0644]
win32/common/config.h [new file with mode: 0644]
win32/patch/evas.diff [new file with mode: 0644]
win32/set_env.bat [new file with mode: 0644]
win32/vs8/engine_buffer.vcproj [new file with mode: 0644]
win32/vs8/engine_direct3d.vcproj [new file with mode: 0644]
win32/vs8/engine_gl_glew.vcproj [new file with mode: 0644]
win32/vs8/engine_software_ddraw.vcproj [new file with mode: 0644]
win32/vs8/engine_software_gdi.vcproj [new file with mode: 0644]
win32/vs8/engine_software_generic.vcproj [new file with mode: 0644]
win32/vs8/evas.sln [new file with mode: 0644]
win32/vs8/libevas.vcproj [new file with mode: 0644]
win32/vs8/loader_eet.vcproj [new file with mode: 0644]
win32/vs8/loader_gif.vcproj [new file with mode: 0644]
win32/vs8/loader_jpeg.vcproj [new file with mode: 0644]
win32/vs8/loader_pmaps.vcproj [new file with mode: 0644]
win32/vs8/loader_png.vcproj [new file with mode: 0644]
win32/vs8/loader_tiff.vcproj [new file with mode: 0644]
win32/vs8/loader_xpm.vcproj [new file with mode: 0644]
win32/vs8/modules.sln [new file with mode: 0644]
win32/vs8/saver_eet.vcproj [new file with mode: 0644]
win32/vs8/saver_png.vcproj [new file with mode: 0644]
win32/vs8/saver_tiff.vcproj [new file with mode: 0644]
win32/vs8/start.bat [new file with mode: 0644]
win32/vs8/start_modules.bat [new file with mode: 0644]
win32/vs9/engine_buffer.vcproj [new file with mode: 0644]
win32/vs9/engine_software_gdi.vcproj [new file with mode: 0644]
win32/vs9/engine_software_generic.vcproj [new file with mode: 0644]
win32/vs9/evas.sln [new file with mode: 0644]
win32/vs9/libevas.vcproj [new file with mode: 0644]
win32/vs9/loader_eet.vcproj [new file with mode: 0644]
win32/vs9/loader_gif.vcproj [new file with mode: 0644]
win32/vs9/loader_jpeg.vcproj [new file with mode: 0644]
win32/vs9/loader_pmaps.vcproj [new file with mode: 0644]
win32/vs9/loader_png.vcproj [new file with mode: 0644]
win32/vs9/loader_tiff.vcproj [new file with mode: 0644]
win32/vs9/loader_xpm.vcproj [new file with mode: 0644]
win32/vs9/saver_eet.vcproj [new file with mode: 0644]
win32/vs9/saver_png.vcproj [new file with mode: 0644]
win32/vs9/saver_tiff.vcproj [new file with mode: 0644]
win32/vs9/start.bat [new file with mode: 0755]

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..fce4857
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,20 @@
+Carsten Haitzler <raster@rasterman.com>
+Till Adam <till@adam-lilienthal.de>
+Steve Ireland <sireland@pobox.com>
+Brett Nash <nash@fluffyspider.com.au>
+Tilman Sauerbeck <tilman@code-monkey.de>
+Corey Donohoe <atmos@atmos.org>
+Yuri Hudobin <glassy_ape@users.sourceforge.net>
+Nathan Ingersoll <ningerso@d.umn.edu>
+Willem Monsuwe <willem@stack.nl>
+Jose O Gonzalez <jose_ogp@juno.com>
+Bernhard Nemec <Bernhard.Nemec@viasyshc.com>
+Jorge Luis Zapata Muga <jorgeluis.zapata@gmail.com>
+Cedric Bail <cedric.bail@free.fr>
+Gustavo Sverzut Barbieri <barbieri@gmail.com>
+Vincent Torri <vtorri at univ-evry dot fr>
+Tim Horton <hortont424@gmail.com>
+Tom Hacohen <tom@stosb.com>
+Mathieu Taillefumier <mathieu.taillefumier@free.fr>
+Iván Briano <ivan@profusion.mobi>
+Gustavo Lima Chaves <glima@profusion.mobi>
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..9690c3f
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,32 @@
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies of the Software and its Copyright notices. In addition publicly
+documented acknowledgment must be given that this software has been used if no
+source code of this software is made available publicly. Making the source
+available publicly means including the source for this software with the
+distribution, or a method to get this software via some reasonable mechanism
+(electronic transfer via a network or media) as well as making an offer to
+supply the source on request. This Copyright notice serves as an offer to
+supply the source on on request as well. Instead of this, supplying
+acknowledgments of use of this software in either Copyright notices, Manuals,
+Publicity and Marketing documents or any documentation provided with any
+product containing this software. This License does not apply to any software
+that links to the libraries provided by this software (statically or
+dynamically), but only to the software provided.
+
+Please see the COPYING-PLAIN for a plain-english explanation of this notice
+and its intent.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/COPYING-PLAIN b/COPYING-PLAIN
new file mode 100644 (file)
index 0000000..376875e
--- /dev/null
@@ -0,0 +1,33 @@
+Plain English Copyright Notice
+
+This file is not intended to be the actual License. The reason this file
+exists is that we here are programmers and engineers. We aren't lawyers. We
+provide licenses that we THINK say the right things, but we have our own
+intentions at heart. This is a plain-english explanation of what those
+intentions are, and if you follow them you will be within the "spirit" of
+the license.
+
+The intent is for us to enjoy writing software that is useful to us (the
+AUTHORS) and allow others to use it freely and also benefit from the work we
+put into making it. We don't want to restrict others using it. They should
+not *HAVE* to make the source code of the applications they write that
+simply link to these libraries (be that statically or dynamically), or for
+them to be limited as to what license they choose to use (be it open, closed
+or anything else). But we would like to know you are using these libraries.
+We simply would like to know that it has been useful to someone. This is why
+we ask for acknowledgement of some sort.
+
+You can do what you want with the source of this software - it doesn't
+matter. We still have it here for ourselves and it is open and free to use
+and download and play with. It can't be taken away. We don't really mind what
+you do with the source to your software. We would simply like to know that
+you are using it - especially if it makes it to a commerical product. If you
+simply e-mail all the AUTHORS (see COPYING and AUTHORS files) telling us, and
+then make sure you include a paragraph or page in the manual for the product
+with the copyright notice and state that you used this software, we will be
+very happy. If you want to contribute back modifications and fixes you may have
+made we will welcome those too with open arms (generally). If you want help
+with changes needed, ports needed or features to be added, arrangements can
+be easily made with some dialogue.
+
+Carsten Haitzler <raster@rasterman.com>
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..a4b76cb
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,17 @@
+COMPILING and INSTALLING:
+
+please see the README file.
+
+NB: you will need pkgconfig package (available for debian and for redhat -
+try www.rpmfind.net if you're lost, or go to the pkgconfig website:
+http://www.freedesktop.org/software/pkgconfig/ ) if your are taking this from 
+CVS and having to run ./autogen.sh)
+
+NOTE: for compilation with MinGW, fnmatch.h is probably missing.
+      That file can be found here:
+http://www.koders.com/c/fid2B518462CB1EED3D4E31E271DB83CD1582F6EEBE.aspx
+      It should be installed in the mingw include directory.
+
+NOTE: for the OpenGL engine on Windows, the glew library:
+http://glew.sourceforge.net/
+      is needed.
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..1e000f4
--- /dev/null
@@ -0,0 +1,165 @@
+ACLOCAL_AMFLAGS = -I m4
+
+SUBDIRS = src doc
+
+MAINTAINERCLEANFILES = \
+Makefile.in \
+aclocal.m4 \
+config.guess \
+config.h.in \
+config.sub \
+configure \
+install-sh \
+ltconfig \
+ltmain.sh \
+missing \
+mkinstalldirs \
+stamp-h.in \
+build-stamp \
+configure-stamp \
+depcomp \
+README \
+evas-cairo-x11.pc \
+evas-directfb.pc \
+evas-fb.pc \
+evas-opengl-x11.pc \
+evas-opengl-sdl.pc \
+evas-opengl-glew.pc \
+evas-quartz.pc \
+evas-software-buffer.pc \
+evas-software-qtopia.pc \
+evas-software-x11.pc \
+evas-software-16-x11.pc \
+evas-xrender-x11.pc \
+evas-xrender-xcb.pc \
+evas-software-gdi.pc \
+evas-software-ddraw.pc \
+evas-software-16-ddraw.pc \
+evas-direct3d.pc \
+evas-software-16-wince.pc \
+evas-software-sdl.pc \
+evas.pc \
+evas.spec \
+$(PACKAGE_TARNAME)-$(PACKAGE_VERSION).tar.gz \
+$(PACKAGE_TARNAME)-$(PACKAGE_VERSION).tar.bz2 \
+$(PACKAGE_TARNAME)-$(PACKAGE_VERSION)-doc.tar.bz2 \
+m4/libtool.m4 \
+m4/lt~obsolete.m4 \
+m4/ltoptions.m4 \
+m4/ltsugar.m4 \
+m4/ltversion.m4
+
+bin_SCRIPTS =
+
+EXTRA_DIST = \
+AUTHORS \
+COPYING \
+COPYING-PLAIN \
+autogen.sh \
+README.in \
+README \
+evas.pc.in \
+evas-cairo-x11.pc.in \
+evas-directfb.pc.in \
+evas-fb.pc.in \
+evas-opengl-x11.pc.in \
+evas-opengl-sdl.pc.in \
+evas-opengl-glew.pc.in \
+evas-software-buffer.pc.in \
+evas-software-qtopia.pc.in \
+evas-software-x11.pc.in \
+evas-software-16-x11.pc.in \
+evas-xrender-x11.pc.in \
+evas-xrender-xcb.pc.in \
+evas-software-gdi.pc.in \
+evas-software-ddraw.pc.in \
+evas-software-16-ddraw.pc.in \
+evas-direct3d.pc.in \
+evas-software-16-wince.pc.in \
+evas-software-sdl.pc.in \
+evas.spec.in evas.spec
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = evas.pc
+
+if BUILD_ENGINE_SOFTWARE_X11
+pkgconfig_DATA += evas-software-x11.pc
+endif
+
+if BUILD_ENGINE_SOFTWARE_16_X11
+pkgconfig_DATA += evas-software-16-x11.pc
+endif
+
+if BUILD_ENGINE_DIRECTFB
+pkgconfig_DATA += evas-directfb.pc
+endif
+
+if BUILD_ENGINE_FB
+pkgconfig_DATA += evas-fb.pc
+endif
+
+if BUILD_ENGINE_BUFFER
+pkgconfig_DATA += evas-software-buffer.pc
+endif
+
+#if BUILD_ENGINE_SOFTWARE_QTOPIA
+#pkgconfig_DATA += evas-software-qtopia.pc
+#endif
+
+if BUILD_ENGINE_GL_X11
+pkgconfig_DATA += evas-opengl-x11.pc
+endif
+
+if BUILD_ENGINE_GL_SDL
+pkgconfig_DATA += evas-opengl-sdl.pc
+endif
+
+if BUILD_ENGINE_QUARTZ
+pkgconfig_DATA += evas-quartz.pc
+endif
+
+if BUILD_ENGINE_GL_GLEW
+pkgconfig_DATA += evas-opengl-glew.pc
+endif
+
+#if BUILD_ENGINE_CAIRO_X11
+#pkgconfig_DATA += evas-cairo-x11.pc
+#endif
+
+if BUILD_ENGINE_XRENDER_X11
+pkgconfig_DATA += evas-xrender-x11.pc
+endif
+
+if BUILD_ENGINE_XRENDER_XCB
+pkgconfig_DATA += evas-xrender-xcb.pc
+endif
+
+if BUILD_ENGINE_SOFTWARE_GDI
+pkgconfig_DATA += evas-software-gdi.pc
+endif
+
+if BUILD_ENGINE_SOFTWARE_DDRAW
+pkgconfig_DATA += evas-software-ddraw.pc
+endif
+
+if BUILD_ENGINE_SOFTWARE_16_DDRAW
+pkgconfig_DATA += evas-software-16-ddraw.pc
+endif
+
+if BUILD_ENGINE_DIRECT3D
+pkgconfig_DATA += evas-direct3d.pc
+endif
+
+if BUILD_ENGINE_SOFTWARE_16_WINCE
+pkgconfig_DATA += evas-software-16-wince.pc
+endif
+
+if BUILD_ENGINE_SOFTWARE_SDL
+pkgconfig_DATA += evas-software-sdl.pc
+endif
+
+.PHONY: doc
+
+doc:
+       @echo "entering doc/"
+       $(MAKE) -C doc doc
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/README.in b/README.in
new file mode 100644 (file)
index 0000000..b0897f9
--- /dev/null
+++ b/README.in
@@ -0,0 +1,277 @@
+Evas @VERSION@
+
+Evas is a clean display canvas API for several target display systems
+that can draw anti-aliased text, smooth super and sub-sampled scaled
+images, alpha-blend objects much and more.
+
+Requirements:
+-------------
+
+Must:
+  libc libm freetype2.1.9+
+
+Recommended:
+  libX11 libXext libXrender fontconfig libpng libjpeg eet libpthread
+
+Optional:
+  XCB SDL OpenGL Qtopia librsvg libtiff libgif edb DirectFB
+
+--------------------------------------------------------------------------
+Evas as of 0.9.9 has a new (and incompatible) API. Why? It's much cleaner
+and more compact. Designed for portable access to different display systems.
+It is also much more optimised internally, uses much less ram than previous
+Evas libraries, and is tiny. Evas when compiled for the Ipaq is a grand
+total of 191Kb (thats all of Evas minus libjpeg, libpng, libz (required for 
+libpng), and minus freetype (required for font rendering)). I have plans that 
+may involve having an alternative font engine other than freetype to minimise
+requirements, and having a native (optional) image loader for an image
+format that may end up being custom to evas, but will minimise code &
+requirements especially for embedded use.
+
+Evas uses very little RAM too (try profiling it in memprof if you want to 
+know) most of the ram allocated, if you look, is for freetype itself,
+image pixel data, and font glyph data. You can't really avoid this, though
+evas tries to share this data as much as possible and not duplicate where it
+can. Feel free to point me at sensible memory optimisations etc. though :) I 
+want this baby to be lean, mean tiny, fast and do everything from your 
+massive multi-cpu desktop with gobs of ram and disk to a tiny watch.
+
+Evas also supports full UTF-8 for text object strings, thus allowing for
+full internationalised text strings (if your font gives you all the
+characters). I've tested with quite a few fonts and it works quite well.
+Though this requires a unicode compatible font with unicode charmap support
+(cyberbit is quite good actually as a font). For now Evas draws the fonts
+only from left to right, so arabic, hebrew etc. won't display quite right,
+direction-wise, but the characters do.
+
+--------------------------------------------------------------------------
+if you want to know what options to enable
+./configure --help
+
+Notes:
+  the small dither mask is faster on the ipaq, but is not as good looking. on
+    desktop machines it makes no speed difference so only use
+    --enable-small-dither-mask if you are compiling for the ipaq
+  you need at least 1 image loader if you want to load images.
+  gcc 3.0.x on solaris screws up the jpeg code so erroring out doesn't work.
+    use gcc 3.2 on solaris.
+
+--------------------------------------------------------------------------
+notes on features:
+
+SCALING:
+--enable-scale-sample
+
+this enables the sampling scaler code. this is the fastest image scaling
+code, but also the lowest quality. when scaling up pixels will become blocky
+and when scaling down you will see shimmering/aliasing artifacts. this is a
+speed vs. quality tradeoff
+
+--enable-scale-smooth
+
+this is the nicest looking scaler that is not that much slower than
+tri-linear, but it looks really good. it also uses mipmaps and is optimised
+heavily. it is recommended to always use this unless you are really
+struggling for speed and are qilling to forego the quality
+
+DITHERING:
+--enable-small-dither-mask
+
+this uses a 4x4 dither mask instead of 128x128. on desktop boxes these days
+(pentium, pentium2, amd etc.) the speed difference is not really measurable,
+but the quality of the 128x128 dither mask is quite a lot better. patterns
+of dithering are much less noticable, so it is recommended to not enable
+this unless you are struggling for speed. the compaq ipaq for example shows
+a slowdown with this large a dither mask so enabling a small dither mask is
+recommended unless you really want to forego the speed.
+
+ENGINES:
+--enable-software-x11
+
+this enables the software x11 rendering engine that renders to X drawable
+targets using highly optimised software routines. there is no hardware
+assist here. this engine requires X11 to be installed to build (and run).
+This is a godo generic engine that is fast and can run in X for good
+development and debugging purposes.
+
+--enable-software-xcb
+this enable the software xcb rendering engine. It allows the same
+features than the software x11 engine. It require the XCB and XCBImage
+libraries. For the test programs, XCBICCCM is also needed.
+
+--enable-fb
+
+this is the software framebuffer driving engine. this uses the linux
+framebuffer device (/dev/fb<x>) and will currently just inherit the current
+framebuffer settings on the fb device and use them to run in. this engine is
+almost fully functional except for the fb management itself. i'd be quite
+happy for people to help out with fixing up the fb init & management code to
+properly set up a vt and release it etc. this engine is specifically geared
+towards peoel writing minimalist display systems for embedded devices such
+as the ipaq, zaurus, etc. it also scales up to high-res desktop systems as
+well and performs outstandingly. i have measured up to 67% speedup over X11
+using the fb driver insetad of X11.
+
+--enable-direcfb
+
+this is the direct fb engine that uses direcftb (http://www.directfb.org) on
+linux to access the framebuffer with (or maybe without) acceleration. for
+people making set-top boxes or just wanting an alternative to X this is
+really good. it may also be useful for embedded devices supported by
+directfb that offer acceleration (otherwise the fb driver will likely be
+faster).
+
+--enable-sdl
+
+this is the sdl engine that uses sdl library (http://www.libsdl.org). This
+library should work on many operating system.
+
+
+CPU:
+--enable-cpu-c
+
+this enabled the c code. you can actually build the code withotu the c
+fallback code and only have the mmx routines for example. it is suggested to
+always use this regardless uness you have some definite size issues with the
+code.
+
+--enable-cpu-mmx
+
+this enables the mmx optimised routines. this works for pentium, pentium2,
+pentium3, pentium4, athlon and duron processors. it can get quite
+considerable speedups, souse it if you can. ppc owners just have to live with
+the c fallback functions unfortunately as no one has provided any ALTIVEC asm 
+routines yet. :) arm owners will also have to rely on the c fallback
+routines as i haven't managed to come up with any arm assembly that actually
+can beat the c code (when compiled with all optimisations) in speed.
+
+--enable-cpu-sse
+
+this enables sse optimizations availbale in he pentium3 and 4 cpus (not
+athlon and duron or pentium 2 or pentium cpu's). ppc owners just have to
+live with the c fallback functions unfortunately as no one has provided any
+ALTIVEC asm routines yet. :) arm owners will also have to rely on the c
+fallback routines as i haven't managed to come up with any arm assembly that 
+actually can beat the c code (when compiled with all optimizations) in speed.
+
+IMAGE LOADERS:
+--enable-image-loader-png
+
+this enables the loader code that loads png files using libpng. there may be
+call for embedded devices later that have custom written small image
+loaders that uses less disk space than libpng to load custom format images.
+for now this is the only loader so you may as well include it.
+
+--enable-image-loader-jpeg
+
+this enables the loader code that loads jpeg files using libjpeg.
+
+CONVERTERS:
+--enable-convert-16-rgb-565
+
+the most common converter you'll want for 16bpp. this means 5 bits for red,
+6 bits for green and 5 bits for blue are used.
+
+--enable-convert-16-rgb-555
+
+this is a converter for what many people know as "15 bit" color. you might
+want to enable this for X output as it used to be common to find many cards
+that do this.
+
+--enable-convert-16-rgb-444
+
+this converter outputs to 12bit packed (int 16 bit WORDS).
+
+--enable-convert-16-rgb-ipq
+
+this converter was written specifically for the ipaq (and may apply to
+similarly configured devices) because it lies about its screen depth. it
+says it is 16bit 565 (that means 5 upper bits of the WORD are red, the next 6
+bits are for green abd the next 5 for blue) but in fact only the upper 4
+bits of each color component (red green and blue) are significant and work,
+so effectively the display is 12 bits of color, not 16, but padded out to
+fill 16bits, with unused bits in the color masks. X on the ipaq advertises
+it as a full 16bpp 565 display (i can't remember what the linux framebuffer
+advertised it as) and so many lumps of code can be fooled into rendering
+data badly because they think the output will look as the expect. This
+renderer assuems the upper 4 bits fo each color primitie only are
+significant and renders accordingly. this produces nice quality images on
+the ipaq and even still works in 16bpp 565 on your pc. it is highly
+recommended to use this renderer if your target is an ipaq or your device
+dislpays similar qualities of the ipaq for display purposes.
+
+--enable-convert-16-rgb-rot-0
+
+this enables the 16bpp converters to run with 0 degrees rotation - this is 
+normal display and you should really include this (though it is optional if you
+only ever want to do portrait mode - perhaps like on an ipaq embedded device)
+
+--enable-convert-16-rgb-rot-270
+
+this enables the portrait mode (270 degree rotation) converteres for 16bpp.
+this is the standard display mode for things like pocketpc on the ipaq and
+the zaurus etc. thsi si a optimized part of the rendering pipeline to allow
+portrait display with a much lower overhead than doing it through X.
+
+--enable-convert-24-rgb-888
+
+To be documented...
+
+--enable-convert-24-bgr-888
+
+To be documented...
+
+--enable-convert-32-rgb-8888
+
+To be documented...
+
+--enable-convert-32-bgr-8888
+
+To be documented...
+
+--enable-convert-32-rgb-rot-0
+
+To be documented...
+
+--enable-convert-32-rgb-rot-270
+
+To be documented...
+
+...
+
+
+------------------------------------------------------------------------------
+COMPILING AND INSTALLING:
+
+  ./configure
+  make
+(as root unless youa re installing in your users directories):
+  make install
+      
+------------------------------------------------------------------------------
+BUILDING PACKAGES:
+
+RPM: To build rpm packages:
+  
+  sudo rpm -ta @PACKAGE@-@VERSION@.tar.gz
+
+You will find rpm packages in your system /usr/src/redhat/* dirs (note you may
+not need to use sudo or root if you have your own ~/.rpmrc. see rpm documents
+for more details)
+
+DEB: To build deb packages:
+
+  tar zvf @PACKAGE@-@VERSION@.tar.gz
+  cd @PACKAGE@-@VERSION@
+  dpkg-buildpackage -us -uc -rfakeroot
+  cd ..
+  rm -rf @PACKAGE@-@VERSION@
+
+You will find all the debian source, binary etc. packages put in the directory
+where you first untarred the source tarball.
+
+
+NOTES:
+
+For the arm optimizations you want to try:
+  export CFLAGS="-O2 -march=armv5te -mcpu=arm1136jf-s -fomit-frame-pointer"
diff --git a/autogen.sh b/autogen.sh
new file mode 100755 (executable)
index 0000000..995ff2f
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+rm -rf autom4te.cache
+rm -f aclocal.m4 ltmain.sh
+
+touch README
+
+echo "Running aclocal..." ; aclocal $ACLOCAL_FLAGS -I m4 || exit 1
+echo "Running autoheader..." ; autoheader || exit 1
+echo "Running autoconf..." ; autoconf || exit 1
+echo "Running libtoolize..." ; (libtoolize --copy --automake || glibtoolize --automake) || exit 1
+echo "Running automake..." ; automake --add-missing --copy --gnu || exit 1
+
+if [ -z "$NOCONFIGURE" ]; then
+       ./configure "$@"
+fi
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..e865dd8
--- /dev/null
@@ -0,0 +1,1526 @@
+# get rid of that stupid cache mechanism
+rm -f config.cache
+
+# rw_PROG_OBJC_WORKS
+# Check whether the Objective C compiler works.
+AC_DEFUN([rw_PROG_OBJC_WORKS],
+[AC_REQUIRE([AC_PROG_OBJC])dnl
+AC_CACHE_CHECK([whether the Objective C compiler works],
+               [rw_cv_prog_objc_works],
+               [AC_LANG_PUSH([Objective C])
+                AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
+                               [rw_cv_prog_objc_works=yes],
+                               [rw_cv_prog_objc_works=no])
+                AC_LANG_POP([Objective C])])
+])
+
+AC_INIT([evas], [0.9.9.063], [enlightenment-devel@lists.sourceforge.net])
+release="ver-pre-svn-05"
+AC_PREREQ([2.52])
+AC_CONFIG_SRCDIR([configure.ac])
+AC_CONFIG_MACRO_DIR([m4])
+AC_CANONICAL_BUILD
+AC_CANONICAL_HOST
+AC_ISC_POSIX
+
+AM_INIT_AUTOMAKE([1.6 dist-bzip2])
+AM_CONFIG_HEADER([config.h])
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+
+AC_LIBTOOL_WIN32_DLL
+define([AC_LIBTOOL_LANG_F77_CONFIG], [:])dnl
+AC_PROG_LIBTOOL
+
+VMAJ=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $1);}'`
+VMIN=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $2);}'`
+VMIC=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $3);}'`
+SNAP=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $4);}'`
+version_info=`expr $VMAJ + $VMIN`":$VMIC:$VMIN"
+AC_SUBST(version_info)
+
+EFL_CHECK_PATH_MAX
+
+### Needed information
+
+case "$host_os" in
+   mingw32ce* | cegcc*)
+      MODULE_ARCH="$host_os-$host_cpu"
+      ;;
+   *)
+      release_info="-release $release"
+      MODULE_ARCH="$host_os-$host_cpu-$release"
+      ;;
+esac
+AC_SUBST(release_info)
+AC_SUBST(MODULE_ARCH)
+AC_DEFINE_UNQUOTED(MODULE_ARCH, "$MODULE_ARCH", "Module architecture")
+
+# weird debian etch bug where pthread_barrier doesn't work without adding
+# this.
+CFLAGS="${CFLAGS=} -D_GNU_SOURCE"
+AC_SUBST(CFLAGS)
+
+want_fontconfig="auto"
+want_fribidi="auto"
+want_evas_cserve="yes"
+
+want_evas_engine_buffer="yes"
+want_evas_engine_software_xlib="no"
+want_evas_engine_xrender_x11="no"
+want_evas_engine_gl_x11="no"
+want_evas_engine_gl_sdl="no"
+want_evas_engine_cairo_x11="no"
+want_evas_engine_software_xcb="no"
+want_evas_engine_xrender_xcb="no"
+want_evas_engine_software_gdi="no"
+want_evas_engine_software_ddraw="no"
+want_evas_engine_direct3d="no"
+want_evas_engine_quartz="no"
+want_evas_engine_gl_glew="no"
+want_evas_engine_software_sdl="no"
+want_evas_engine_fb="no"
+want_evas_engine_directfb="no"
+want_evas_engine_software_qtopia="no"
+want_evas_engine_software_16_x11="no"
+want_evas_engine_software_16_ddraw="no"
+want_evas_engine_software_16_wince="no"
+
+want_evas_image_loader_edb="yes"
+want_evas_image_loader_eet="yes"
+want_evas_image_loader_gif="yes"
+want_evas_image_loader_jpeg="yes"
+want_evas_image_loader_pmaps="yes"
+want_evas_image_loader_png="yes"
+want_evas_image_loader_svg="yes"
+want_evas_image_loader_tiff="yes"
+want_evas_image_loader_xpm="yes"
+
+want_evas_font_loader_eet="yes"
+
+case "$host_os" in
+   mingw32ce* | cegcc*)
+      want_fontconfig="no"
+      want_evas_engine_software_16_wince="yes"
+      want_evas_image_loader_edb="no"
+      want_evas_image_loader_gif="no"
+      want_evas_image_loader_svg="no"
+      want_evas_image_loader_tiff="no"
+      ;;
+   mingw*)
+      want_evas_engine_software_gdi="yes"
+      want_evas_engine_software_ddraw="yes"
+      want_evas_engine_direct3d="yes"
+      want_evas_engine_software_16_ddraw="yes"
+      want_evas_image_loader_edb="no"
+      want_evas_image_loader_svg="no"
+      ;;
+   darwin*)
+      want_evas_engine_software_xlib="auto"
+      want_evas_engine_quartz="auto"
+      ;;
+   *)
+      want_evas_engine_software_xlib="auto"
+      want_evas_engine_xrender_x11="auto"
+      want_evas_engine_software_16_x11="auto"
+      ;;
+esac
+
+requirement_evas=""
+
+
+### Additional options to configure
+
+# when used, that option makes configure script fails when
+# a requirement is selected, but not met.
+use_strict="no"
+AC_ARG_ENABLE([strict],
+   AC_HELP_STRING([--enable-strict], [enable strict checking mode. @<:@default==disabled@:>@]),
+   [use_strict="yes"],
+   [use_strict="no"])
+
+# Simple X11 build/link
+AC_ARG_ENABLE([simple-x11],
+   AC_HELP_STRING([--enable-simple-x11], [enable simple x11 linking]),
+   [
+    if test "x${enableval}" = "xyes" ; then
+       want_evas_simple_x11="yes"
+    else
+       want_evas_simple_x11="no"
+    fi
+   ])
+
+
+### Checks for programs
+
+m4_ifdef([AC_PROG_OBJC],
+   [
+    AC_PROG_OBJC
+    _AM_DEPENDENCIES(OBJC)
+   ],
+   [
+    AC_CHECK_TOOL([OBJC], [gcc])
+    AC_SUBST([OBJC])
+    AC_SUBST([OBJCFLAGS])
+   ])
+
+rw_PROG_OBJC_WORKS
+
+AC_PROG_CXX
+AC_PROG_CC
+
+# pkg-config
+PKG_PROG_PKG_CONFIG
+
+# Check whether pkg-config supports Requires.private
+if $PKG_CONFIG --atleast-pkgconfig-version 0.22; then
+   pkgconfig_requires_private="Requires.private"
+else
+   pkgconfig_requires_private="Requires"
+fi
+AC_SUBST(pkgconfig_requires_private)
+
+# doxygen program for documentation building
+EFL_CHECK_DOXYGEN([build_doc="yes"], [build_doc="no"])
+
+
+### Checks for libraries
+
+# Evil library for compilation on Windows CE
+
+case "$host_os" in
+   mingw* | cegcc*)
+      PKG_CHECK_MODULES([EVIL], [evil])
+      AC_DEFINE(HAVE_EVIL, 1, [Set to 1 if evil package is installed])
+      requirement_evas="evil ${requirement_evas}"
+   ;;
+esac
+
+## strong dependencies
+
+# Eina
+PKG_CHECK_MODULES([EINA], [eina-0])
+
+# Freetype
+PKG_CHECK_MODULES([FREETYPE], [freetype2 >= 9.3.0])
+
+requirement_evas="freetype2 eina-0 ${requirement_evas}"
+
+## optional dependencies
+
+# FontConfig
+have_fontconfig="no"
+AC_ARG_ENABLE([fontconfig],
+   AC_HELP_STRING([--disable-fontconfig],
+      [disable fontconfig for finding fonts. @<:@default=enabled@:>@]),
+   [
+    if test "x${enableval}" = "xyes" ; then
+       want_fontconfig="yes"
+    else
+       want_fontconfig="no"
+    fi
+   ])
+
+
+if test "x${want_fontconfig}" = "xyes" -o "x${want_fontconfig}" = "xauto" ; then
+   PKG_CHECK_MODULES([FONTCONFIG],
+      [fontconfig],
+      [
+       have_fontconfig="yes"
+       AC_DEFINE(HAVE_FONTCONFIG, 1, [have fontconfig searching capabilities])
+       requirement_evas="fontconfig ${requirement_evas}"
+      ],
+      [
+       if test "x${want_fontconfig}" = "xyes" -a "x${use_strict}" = "xyes" ; then
+          AC_MSG_ERROR([Fontconfig not found (strict dependencies checking)])
+       fi
+      ])
+fi
+
+# fribidi support
+have_fribidi="no"
+AC_ARG_ENABLE([fribidi],
+   AC_HELP_STRING([--disable-fribidi],
+      [disable bidirectional text support. @<:@default=enabled@:>@]),
+   [
+    if test "x${enableval}" = "xyes" ; then
+       want_fribidi="yes"
+    else
+       want_fribidi="no"
+    fi
+   ])
+
+if test "x${want_fribidi}" = "xyes" -o "x${want_fribidi}" = "xauto" ; then
+   PKG_CHECK_MODULES([FRIBIDI],
+      [fribidi],
+      [
+       have_fribidi="yes"
+       AC_DEFINE(HAVE_FRIBIDI, 1, [have fribidi support])
+       requirement_evas="fribidi ${requirement_evas}"
+      ],
+      [
+       if test "x$want_fribidi" = "xyes" -a "x$use_strict" = "xyes" ; then
+          AC_MSG_ERROR([Fribidi not found (strict dependencies checking)])
+       fi
+      ])
+fi
+
+if test "x${have_fribidi}" = "xno"; then
+  HAS_BIDI=0
+fi
+
+### Checks for header files
+AC_HEADER_STDC
+
+
+### Checks for types
+
+
+### Checks for structures
+
+
+### Checks for compiler characteristics
+AC_C_CONST
+AC_C_BIGENDIAN
+AC_C___ATTRIBUTE__
+AM_PROG_CC_STDC
+
+WIN32_CPPFLAGS=""
+case "$host_os" in
+   mingw32ce* | cegcc*)
+      WIN32_CPPFLAGS="-D_WIN32_WCE=0x0420"
+      ;;
+   mingw*)
+      WIN32_CPPFLAGS="-D_WIN32_WINNT=0x0500"
+      ;;
+esac
+AC_SUBST(WIN32_CPPFLAGS)
+
+WIN32_CFLAGS=""
+case "${host_os}" in
+   cegcc*)
+      WIN32_CFLAGS="-mwin32"
+   ;;
+esac
+AC_SUBST(WIN32_CFLAGS)
+
+
+### Checks for linker characteristics
+lt_enable_auto_import=""
+case "${host_os}" in
+   mingw* | cegcc*)
+      AC_DEFINE(EFL_EVAS_BUILD, 1, [Define to mention that evas is built])
+      lt_enable_auto_import="-Wl,--enable-auto-import"
+   ;;
+esac
+AC_SUBST(lt_enable_auto_import)
+
+
+### Checks for library functions
+
+# alloca
+AC_FUNC_ALLOCA
+
+# fnmatch
+EFL_CHECK_FNMATCH([], [AC_MSG_ERROR([Cannot find fnmatch()])])
+
+# dlopen
+dlopen_libs=""
+case "$host_os" in
+  mingw32ce* | cegcc*)
+# managed by evil
+    AC_DEFINE(HAVE_DLADDR)
+  ;;
+  mingw*)
+# nothing on mingw platform
+  ;;
+  *)
+    AC_CHECK_FUNCS(dlopen, res=yes, res=no)
+    if test "x$res" = "xyes"; then
+      AC_CHECK_FUNCS(dladdr, AC_DEFINE(HAVE_DLADDR))
+    else
+      AC_CHECK_LIB(dl, dlopen, res=yes, res=no)
+      if test "x$res" = "xyes"; then
+        AC_CHECK_LIB(dl, dladdr, AC_DEFINE(HAVE_DLADDR))
+        dlopen_libs=-ldl
+      else
+        AC_MSG_ERROR(Cannot find dlopen)
+      fi
+    fi
+esac
+AC_SUBST(dlopen_libs)
+
+# (shm_open (for cache server)
+AC_ARG_ENABLE([evas-cserve],
+   AC_HELP_STRING([--disable-evas-cserve],
+      [disable shared cache server support. @<:@default=enabled@:>@]),
+   [
+    if test "x${enableval}" = "xyes" ; then
+       want_evas_cserve="yes"
+    else
+       want_evas_cserve="no"
+    fi
+   ])
+AC_MSG_CHECKING(whether to build shared cache server and support)
+AC_MSG_RESULT(${want_evas_cserve})
+
+if test "x${want_evas_cserve}" = "xyes" ; then
+   AC_MSG_CHECKING([whether shm_open() is present])
+   LIBS_save=${LIBS}
+   LIBS="${LIBS} -lrt"
+   AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM(
+         [[
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+         ]],
+         [[
+int fd;
+fd = shm_open("/", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
+shm_unlink("/");
+         ]])],
+      [want_evas_cserve="yes"],
+      [want_evas_cserve="no"])
+   LIBS=${LIBS_save}
+   AC_MSG_RESULT([${want_evas_cserve}])
+fi
+
+if test "x${want_evas_cserve}" = "xyes" ; then
+  AC_DEFINE(EVAS_CSERVE, 1, [Shared caceh server.])
+fi
+
+AM_CONDITIONAL([EVAS_CSERVE], [test "x${want_evas_cserve}" = "xyes"])
+
+
+
+#######################################
+## GL force flavor gles
+gl_flavor_gles="no"
+AC_MSG_CHECKING(whether to build GLES flavor of GL)
+AC_ARG_ENABLE(gl-flavor-gles,
+  AC_HELP_STRING([--enable-gl-flavor-gles], [enable gles falvor of gl instead of standard]),
+  [
+      if test "x$enableval" = "xyes" ; then
+        AC_MSG_RESULT(yes)
+        gl_flavor_gles="yes"
+      else
+        AC_MSG_RESULT(no)
+        gl_flavor_gles="no"
+      fi
+  ], [
+      AC_MSG_RESULT(no)
+      gl_flavor_gles="no"
+  ]
+)
+
+#######################################
+## GLES variety sgx
+gles_variety_sgx="no"
+AC_MSG_CHECKING(whether to build GLES variety for SGX)
+AC_ARG_ENABLE(gles-variety-sgx,
+  AC_HELP_STRING([--enable-gles-variety-sgx], [GLES variety SGX 3D unit]),
+  [
+      if test "x$enableval" = "xyes" ; then
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(GLES_VARIETY_SGX, 1, [Imagination SGX GLES2 support])
+        gles_variety_sgx="yes"
+      else
+        AC_MSG_RESULT(no)
+        gles_variety_sgx="no"
+      fi
+  ], [
+      AC_MSG_RESULT(no)
+      gles_variety_sgx="no"
+  ]
+)
+
+#######################################
+## GLES variety s3c6410
+gles_variety_s3c6410="no"
+AC_MSG_CHECKING(whether to build GLES variety for s3c6410)
+AC_ARG_ENABLE(gles-variety-s3c6410,
+  AC_HELP_STRING([--enable-gles-variety-s3c6410], [GLES variety s3c6410 3D unit]),
+  [
+      if test "x$enableval" = "xyes" ; then
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(GLES_VARIETY_S3C6410, 1, [Samsung S3c6410 GLES2 support])
+        gles_variety_s3c6410="yes"
+      else
+        AC_MSG_RESULT(no)
+        gles_variety_s3c6410="no"
+      fi
+  ], [
+      AC_MSG_RESULT(no)
+      gles_variety_s3c6410="no"
+  ]
+)
+
+#####################################################################
+## Engines
+
+EVAS_CHECK_ENGINE([buffer], [${want_evas_engine_buffer}], [no], [Buffer])
+
+EVAS_CHECK_ENGINE([software-xlib], [${want_evas_engine_software_xlib}], [yes], [Software Xlib])
+
+EVAS_CHECK_ENGINE([xrender-x11], [${want_evas_engine_xrender_x11}], [yes], [XRender X11])
+
+EVAS_CHECK_ENGINE([gl-x11], [${want_evas_engine_gl_x11}], [yes], [OpenGL X11])
+
+# disable cairo engine for the release
+#EVAS_CHECK_ENGINE([cairo-x11], [${want_evas_engine_cairo_x11}], [yes], [Cairo X11])
+
+EVAS_CHECK_ENGINE([software-xcb], [${want_evas_engine_software_xcb}], [no], [Software XCB])
+
+EVAS_CHECK_ENGINE([xrender-xcb], [${want_evas_engine_xrender_xcb}], [no], [XRender XCB])
+
+EVAS_CHECK_ENGINE([software-gdi], [${want_evas_engine_software_gdi}], [no], [Software GDI])
+
+EVAS_CHECK_ENGINE([software-ddraw], [${want_evas_engine_software_ddraw}], [no], [Software DirectDraw])
+
+EVAS_CHECK_ENGINE([direct3d], [${want_evas_engine_direct3d}], [no], [Direct3D])
+
+EVAS_CHECK_ENGINE([quartz], [${want_evas_engine_quartz}], [no], [Quartz])
+
+EVAS_CHECK_ENGINE([gl-glew], [${want_evas_engine_gl_glew}], [no], [OpenGL Glew])
+
+EVAS_CHECK_ENGINE([software-sdl], [${want_evas_engine_software_sdl}], [no], [Software SDL])
+
+EVAS_CHECK_ENGINE([gl-sdl], [${want_evas_engine_gl_sdl}], [yes], [OpenGL SDL])
+
+EVAS_CHECK_ENGINE([fb], [${want_evas_engine_fb}], [no], [Framebuffer])
+
+EVAS_CHECK_ENGINE([directfb], [${want_evas_engine_directfb}], [no], [DirectFB])
+
+# disable cairo engine for the release
+#EVAS_CHECK_ENGINE([software-qtopia], [${want_evas_engine_software_qtopia}], [no], [Qtopia])
+
+EVAS_CHECK_ENGINE([software-16-x11], [${want_evas_engine_software_16_x11}], [yes], [Software X11 16 bits])
+
+EVAS_CHECK_ENGINE([software-16-ddraw], [${want_evas_engine_software_16_ddraw}], [no], [Software DirectDraw 16 bits])
+
+EVAS_CHECK_ENGINE([software-16-wince], [${want_evas_engine_software_16_wince}], [no], [Software Windows CE 16 bits])
+
+# common cairo
+#have_evas_engine_cairo_common="no"
+#if test "x${have_evas_engine_cairo_x11}" = "xyes" ; then
+#   have_evas_engine_cairo_common="yes"
+#   AC_DEFINE([BUILD_ENGINE_CAIRO_COMMON], [1], [Generic Cairo Rendering Support])
+#fi
+#AM_CONDITIONAL([BUILD_ENGINE_CAIRO_COMMON], [test "x$have_evas_engine_cairo_common" = "xyes"])
+
+# common gl
+have_evas_engine_gl_common="no"
+if test "x$have_evas_engine_gl_x11" = "xyes" \
+   || test "x$have_evas_engine_gl_x11" = "xstatic" \
+   || test "x$have_evas_engine_gl_glew" = "xyes" \
+   || test "x$have_evas_engine_gl_glew" = "xstatic" \
+   || test "x$have_evas_engine_gl_sdl" = "xyes" \
+   || test "x$have_evas_engine_gl_sdl" = "xstatic"; then
+   have_evas_engine_gl_common="yes"
+fi
+
+if test "x$have_evas_engine_gl_common" = "xyes"; then
+   evas_engine_gl_common_libs=""
+   AC_DEFINE(BUILD_ENGINE_GL_COMMON, [1], [Generic OpenGL Rendering Support])
+fi
+
+AC_SUBST([evas_engine_gl_common_libs])
+
+AM_CONDITIONAL(BUILD_ENGINE_GL_COMMON, [test "x$have_evas_engine_gl_common" = "xyes"])
+
+# gl_sdl
+if test "x$have_evas_engine_gl_sdl" = "xyes" || test "x$have_evas_engine_gl_sdl" = "xstatic" ; then
+   AC_CHECK_DECL(SDL_GL_CONTEXT_MAJOR_VERSION,
+      [AC_DEFINE(HAVE_SDL_GL_CONTEXT_VERSION, [1], [SDL_GL version attributes present])],,
+      [#include <SDL/SDL_video.h>])
+fi
+
+if test "x$gl_flavor_gles" = "xyes"; then
+   AC_CHECK_DECL(SDL_OPENGLES,
+      [AC_DEFINE(HAVE_SDL_FLAG_OPENGLES, [1], [SDL_OPENGLES flag is present])],,
+      [#include <SDL/SDL_video.h>])
+fi
+
+# SDL primitive
+sdl_primitive="no"
+
+AC_ARG_ENABLE([sdl-primitive],
+   [AC_HELP_STRING([--enable-sdl-primitive], [])],
+   [sdl_primitive=${enableval}]
+)
+AC_MSG_CHECKING([whether to use SDL primitive when possible])
+AC_MSG_RESULT([${sdl_primitive}])
+
+if test "x${sdl_primitive}" = "xyes" ; then
+   AC_DEFINE([ENGINE_SDL_PRIMITIVE], [1], [Use SDL primitive when possible])
+fi
+
+# if software generic need to be build as part of libevas.so
+have_static_software_generic="no"
+AC_ARG_ENABLE([static-software-generic],
+   [AC_HELP_STRING([--enable-static-software-generic], [Build software generic engine as part of libevas])],
+   [have_static_software_generic=${enableval}]
+)
+AC_MSG_CHECKING([Whether to build software generic engine as part of libevas])
+AC_MSG_RESULT([${have_static_software_generic}])
+
+AM_CONDITIONAL(EVAS_STATIC_BUILD_SOFTWARE_GENERIC, test "x${have_static_software_generic}" = "xyes")
+if test "x${have_static_software_generic}" = "xyes"; then
+   AC_DEFINE(EVAS_STATIC_BUILD_SOFTWARE_GENERIC, [1], [Build software generic engine as part of libevas])
+fi
+
+# if software_xlib or software_xcb are available, define everything needed for X11
+have_evas_engine_software_x11="no"
+if test "x$have_evas_engine_software_xlib" = "xstatic" -o "x$have_evas_engine_software_xcb" = "xstatic" ; then
+   have_evas_engine_software_x11="static"
+else
+   if test "x$have_evas_engine_software_xlib" = "xyes" -o "x$have_evas_engine_software_xcb" = "xyes" ; then
+      have_evas_engine_software_x11="yes"
+   fi
+fi
+
+if test "x$have_evas_engine_software_xlib" = "xstatic" ; then
+   have_evas_engine_software_xlib="yes"
+fi
+
+if test "x$have_evas_engine_software_xcb" = "xstatic" ; then
+   have_evas_engine_software_xcb="yes"
+fi
+
+if test "x$have_evas_engine_software_x11" = "xyes" -o "x$have_evas_engine_software_x11" = "xstatic" ; then
+   AC_DEFINE(BUILD_ENGINE_SOFTWARE_X11, [1], [Build software X11 engines])
+fi
+
+if test "x$have_evas_engine_software_x11" = "xstatic" ; then
+   AC_DEFINE(EVAS_STATIC_BUILD_SOFTWARE_X11, [1], [Build software X11 engines as part of libevas])
+fi
+
+AM_CONDITIONAL([BUILD_ENGINE_SOFTWARE_X11], [test "x${have_evas_engine_software_x11}" = "xyes" -o "x${have_evas_engine_software_x11}" = "xstatic"])
+AM_CONDITIONAL([EVAS_STATIC_BUILD_SOFTWARE_X11], [test "x${have_evas_engine_software_x11}" = "xstatic"])
+
+AC_SUBST(have_evas_engine_software_xlib)
+AC_SUBST(have_evas_engine_software_xcb)
+
+# if software 16 x11 is enabled - build software_16 (the generic 16bit
+# engine). later enable it fb_16 or other "16" bit engines are enabled.
+have_evas_engine_software_16="no"
+if test "x$have_evas_engine_software_16_x11" = "xyes" -o "x$have_evas_engine_software_16_x11" = "xstatic"; then
+   have_evas_engine_software_16="yes"
+fi
+if test "x$have_evas_engine_software_sdl" = "xyes" -o "x$have_evas_engine_software_sdl" = "xstatic"; then
+   have_evas_engine_software_16="yes"
+fi
+if test "x$have_evas_engine_software_16_ddraw" = "xyes" -o "x$have_evas_engine_software_16_ddraw" = "xstatic"; then
+   have_evas_engine_software_16="yes"
+fi
+if test "x$have_evas_engine_software_16_wince" = "xyes" -o "x$have_evas_engine_software_16_wince" = "xstatic"; then
+   have_evas_engine_software_16="yes"
+fi
+AM_CONDITIONAL(BUILD_ENGINE_SOFTWARE_16, test "x$have_evas_engine_software_16" = "xyes")
+
+# if software 16 need to be build as part of libevas.so
+have_static_software_16="no"
+AC_ARG_ENABLE([static-software-16],
+   [AC_HELP_STRING([--enable-static-software-16], [Build software 16 engine as part of libevas])],
+   [have_static_software_16=${enableval}]
+)
+AC_MSG_CHECKING([Whether to build software 16 engine as part of libevas])
+AC_MSG_RESULT([${have_static_software_16}])
+
+AM_CONDITIONAL(EVAS_STATIC_BUILD_SOFTWARE_16, test "x${have_static_software_16}" = "xyes")
+if test "x${have_static_software_16}" = "xyes"; then
+   AC_DEFINE(EVAS_STATIC_BUILD_SOFTWARE_16, [1], [Build software 16 engine as part of libevas])
+fi
+
+#####################################################################
+## Image loaders
+
+EVAS_CHECK_IMAGE_LOADER([Edb], [${want_evas_image_loader_edb}])
+
+EVAS_CHECK_IMAGE_LOADER([Eet], [${want_evas_image_loader_eet}])
+EVAS_CHECK_FONT_LOADER([${want_evas_font_loader_eet}])
+
+EVAS_CHECK_IMAGE_LOADER([Gif], [${want_evas_image_loader_gif}])
+
+have_evas_image_saver_jpeg="no"
+EVAS_CHECK_IMAGE_LOADER([Jpeg], [${want_evas_image_loader_jpeg}])
+
+dnl Windows has no sigsetjmp function, nor equivalent.
+dnl So we disable the jpeg saver.
+dnl TODO: must find a workaround
+case "$host_os" in
+   mingw* | cegcc*)
+      ;;
+   *)
+      if test "x${have_evas_image_loader_jpeg}" = "xyes" ; then
+         have_evas_image_saver_jpeg="yes"
+      fi
+      ;;
+esac
+AM_CONDITIONAL([BUILD_SAVER_JPEG], [test "x${have_evas_image_saver_jpeg}" = "xyes"])
+
+EVAS_CHECK_IMAGE_LOADER([PMAPS], [${want_evas_image_loader_pmaps}])
+
+EVAS_CHECK_IMAGE_LOADER([PNG], [${want_evas_image_loader_png}])
+
+EVAS_CHECK_IMAGE_LOADER([SVG], [${want_evas_image_loader_svg}])
+
+EVAS_CHECK_IMAGE_LOADER([Tiff], [${want_evas_image_loader_tiff}])
+
+EVAS_CHECK_IMAGE_LOADER([XPM], [${want_evas_image_loader_xpm}])
+
+
+#####################################################################
+## Cpu based optimizations
+
+#######################################
+## PTHREADS
+pthread_cflags=""
+pthread_libs=""
+build_pthreads="no"
+has_pthreads="no"
+need_pthreads="no"
+# basic pthread support
+AC_CHECK_HEADER(pthread.h,
+  [
+   has_pthreads="yes"
+  ],
+  [
+   has_pthreads="no"
+  ]
+)
+
+# sched_getaffinity pthread_attr_setaffinity_np
+AC_CHECK_HEADERS(pthread.h sched.h,
+      [
+        AC_CHECK_LIB(pthread, pthread_attr_setaffinity_np,
+          [
+            AC_CHECK_LIB(pthread, pthread_barrier_wait,
+              [ build_pthreads="yes" ],
+              [ build_pthreads="no" ]
+            )
+          ],
+          [ build_pthreads="no" ]
+        )
+      ],
+      [ build_pthreads="no" ]
+)
+
+#######################################
+## Pthread
+AC_MSG_CHECKING(whether to build pthread code)
+AC_ARG_ENABLE(pthreads,
+  AC_HELP_STRING([--enable-pthreads], [enable threaded rendering]),
+  [
+      if test "x$enableval" = "xyes" ; then
+        if test "x$build_pthreads" = "xyes"; then
+          AC_MSG_RESULT(yes)
+          AC_DEFINE(BUILD_PTHREAD, 1, [Build Threaded Rendering])
+          build_pthreads="yes"
+         need_pthreads="yes"
+        else
+          if "x$use_strict" = "xyes"; then
+            AC_MSG_ERROR(pthreads headers or functions not found (strict dependencies checking))
+          else
+            AC_MSG_RESULT(no: pthread headers or functions not found)
+          fi
+        fi
+      else
+        AC_MSG_RESULT(no)
+        build_pthreads="no"
+      fi
+  ],
+  [
+    AC_MSG_RESULT($build_pthreads)
+    if test "x$build_pthreads" = "xyes" ; then
+      AC_DEFINE(BUILD_PTHREAD, 1, [Build Threaded Rendering])
+      need_pthreads="yes"
+    fi
+  ]
+)
+
+#######################################
+## Pipe Renderer
+build_pipe_render="no"
+AC_MSG_CHECKING(whether to build Threaded Pipe Rendering support)
+AC_ARG_ENABLE(pipe-render,
+  AC_HELP_STRING([--enable-pipe-render], [enable threaded pipe rendering support]),
+  [ build_pipe_render=$enableval ]
+)
+AC_MSG_RESULT($build_pipe_render)
+
+AC_MSG_CHECKING(whether we can build Threaded Pipe Rendering support)
+if test \( "x$build_pipe_render" = "xyes" -o "x$build_pipe_render" = "xauto" \); then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(BUILD_PIPE_RENDER, 1, [Build pipe render support])
+  build_pipe_render="yes"
+  need_pthreads="yes"
+else
+  AC_MSG_RESULT(no)
+  build_pipe_render="no"
+fi
+
+#######################################
+## Async events
+build_async_events="auto"
+AC_MSG_CHECKING(whether to build Async Events support)
+AC_ARG_ENABLE(async-events,
+  AC_HELP_STRING([--enable-async-events], [enable async events support]),
+  [ build_async_events=$enableval ]
+)
+AC_MSG_RESULT($build_async_events)
+
+AC_MSG_CHECKING(whether we can build Async Events support)
+if test "x$build_async_events" = "xyes" || test "x$build_async_events" = "xauto" ; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(BUILD_ASYNC_EVENTS, 1, [Build async events support])
+  build_async_events="yes"
+else
+  AC_MSG_RESULT(no)
+  build_async_events="no"
+fi
+
+#######################################
+## Async image preload
+build_async_preload="auto"
+AC_MSG_CHECKING(whether to build Async Image Preload support)
+AC_ARG_ENABLE(async-preload,
+  AC_HELP_STRING([--enable-async-preload], [enable async image preloading support]),
+  [ build_async_preload=$enableval ]
+)
+AC_MSG_RESULT($build_async_preload)
+
+AC_MSG_CHECKING(whether we can build Async Image Preload support)
+if test \( "x$build_async_preload" = "xyes" -o "x$build_async_preload" = "xauto" \) -a "x$build_async_events" = "xyes"; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(BUILD_ASYNC_PRELOAD, 1, [Build async image preload support])
+  build_async_preload="yes"
+  need_pthreads="yes"
+else
+  AC_MSG_RESULT(no)
+  build_async_preload="no"
+fi
+
+#######################################
+## Link with pthread if needed
+AC_MSG_CHECKING(whether we should link with pthread)
+if test "x$need_pthreads" = "xyes"; then
+  AC_MSG_RESULT(yes)
+  pthread_cflags=""
+  pthread_libs="-lpthread"
+else
+  AC_MSG_RESULT(no)
+fi
+
+#######################################
+## MMX
+build_cpu_mmx="no"
+case $host_cpu in
+  i*86)
+    build_cpu_mmx="yes"
+    ;;
+  x86_64)
+    build_cpu_mmx="yes"
+    ;;
+  amd64)
+    build_cpu_mmx="yes"
+    ;;
+esac
+AC_MSG_CHECKING(whether to build mmx code)
+AC_ARG_ENABLE(cpu-mmx,
+  AC_HELP_STRING([--enable-cpu-mmx], [enable mmx code]),
+  [
+      if test "x$enableval" = "xyes" ; then
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(BUILD_MMX, 1, [Build MMX Code])
+        build_cpu_mmx="yes"
+      else
+        AC_MSG_RESULT(no)
+        build_cpu_mmx="no"
+      fi
+  ],
+  [
+    AC_MSG_RESULT($build_cpu_mmx)
+    if test "x$build_cpu_mmx" = "xyes" ; then
+      AC_DEFINE(BUILD_MMX, 1, [Build MMX Code])
+    fi
+  ]
+)
+
+#######################################
+## SSE
+build_cpu_sse="no"
+case $host_cpu in
+  i*86)
+    build_cpu_sse="yes"
+    ;;
+  x86_64)
+    build_cpu_sse="yes"
+    ;;
+  amd64)
+    build_cpu_sse="yes"
+    ;;
+esac
+AC_MSG_CHECKING(whether to build sse code)
+AC_ARG_ENABLE(cpu-sse,
+  AC_HELP_STRING([--enable-cpu-sse], [enable sse code]),
+  [
+      if test "x$enableval" = "xyes" ; then
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(BUILD_SSE, 1, [Build SSE Code])
+        build_cpu_sse="yes"
+      else
+        AC_MSG_RESULT(no)
+        build_cpu_sse="no"
+      fi
+  ],
+  [
+    AC_MSG_RESULT($build_cpu_sse)
+    if test "x$build_cpu_sse" = "xyes" ; then
+      AC_DEFINE(BUILD_SSE, 1, [Build SSE Code])
+    fi
+  ]
+)
+
+#######################################
+## ALTIVEC
+build_cpu_altivec="no"
+case $host_cpu in
+  *power* | *ppc*)
+    build_cpu_altivec="auto"
+    ;;
+esac
+altivec_cflags=""
+AC_MSG_CHECKING(whether to build altivec code)
+AC_ARG_ENABLE(cpu-altivec,
+  AC_HELP_STRING([--enable-cpu-altivec], [enable altivec code]),
+  [ build_cpu_altivec=$enableval ],
+  [
+    if test ! "x$build_cpu_altivec" = "xauto"; then
+      build_cpu_altivec="no"
+    fi
+  ]
+)
+AC_MSG_RESULT($build_cpu_altivec)
+
+if test "x$build_cpu_altivec" = "xyes"; then
+   AC_CHECK_HEADER(altivec.h,
+     [
+        AC_DEFINE(BUILD_ALTIVEC, 1, [Build Altivec Code])
+        AC_DEFINE(HAVE_ALTIVEC_H, 1, [Have altivec.h header file])
+        build_cpu_altivec="yes"
+     ],
+     [
+       save_CFLAGS=$CFLAGS
+       save_CPPFLAGS=$CPPFLAGS
+       CFLAGS=$CFLAGS" -maltivec"
+       CPPFLAGS=$CPPFLAGS" -maltivec"
+       unset ac_cv_header_altivec_h
+       AC_CHECK_HEADER(altivec.h,
+         [
+            AC_DEFINE(BUILD_ALTIVEC, 1, [Build Altivec Code])
+            AC_DEFINE(HAVE_ALTIVEC_H, 1, [Have altivec.h header file])
+            build_cpu_altivec="yes"
+         ],
+         [
+            if test "x$build_cpu_altivec" = "xyes" -a "x$use_strict" = "xyes" ; then
+              AC_MSG_ERROR(Altivec not found (strict dependencies checking))
+            fi
+            build_cpu_altivec="no"
+         ]
+       )
+       CFLAGS=$save_CFLAGS
+       CPPFLAGS=$save_CPPFLAGS
+     ]
+   )
+fi
+
+if test "x$build_cpu_altivec" = "xyes"; then
+   AC_MSG_CHECKING(whether to use altivec compiler flag)
+   if test "x$GCC" = "xyes"; then
+      if echo "int main(){return 0;}" | ${CPP} -faltivec - > /dev/null 2>&1; then
+         altivec_cflags="-faltivec"
+         AC_DEFINE(BUILD_ALTIVEC, 1, [Build Altivec Code])
+      elif echo "int main(){return 0;}" | ${CPP} -maltivec - > /dev/null 2>&1; then
+         altivec_cflags="-maltivec"
+         AC_DEFINE(BUILD_ALTIVEC, 1, [Build Altivec Code])
+      fi
+   fi
+  AC_MSG_RESULT($altivec_cflags)
+   CFLAGS="$CFLAGS $altivec_cflags"
+fi
+
+#######################################
+## NEON
+build_cpu_neon="no"
+case $host_cpu in
+  armv7*)
+    build_cpu_neon="yes"
+    ;;
+esac
+AC_MSG_CHECKING(whether to build neon code)
+AC_ARG_ENABLE(cpu-neon,
+  AC_HELP_STRING([--enable-cpu-neon], [enable neon code]),
+  [
+      if test "x$enableval" = "xyes" ; then
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(BUILD_NEON, 1, [Build NEON Code])
+        build_cpu_neon="yes"
+      else
+        AC_MSG_RESULT(no)
+        build_cpu_neon="no"
+      fi
+  ],
+  [
+    AC_MSG_RESULT($build_cpu_neon)
+    if test "x$build_cpu_neon" = "xyes" ; then
+      AC_DEFINE(BUILD_NEON, 1, [Build NEON Code])
+    fi
+  ]
+)
+
+#######################################
+## C
+build_cpu_c="yes"
+AC_MSG_CHECKING(whether to build c code)
+AC_ARG_ENABLE(cpu-c,
+  AC_HELP_STRING([--enable-cpu-c], [enable C code]),
+  [
+      if test "x$enableval" = "xyes" ; then
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(BUILD_C, 1, [Build plain C code])
+        build_cpu_c="yes"
+      else
+        AC_MSG_RESULT(no)
+        build_cpu_c="no"
+      fi
+  ], [
+      AC_MSG_RESULT($build_cpu_c)
+      if test "x$build_cpu_c" = "xyes" ; then
+        AC_DEFINE(BUILD_C, 1, [Build plain C code])
+      fi
+  ]
+)
+
+#######################################
+## MAGIC_DEBUG
+want_evas_magic_debug="yes"
+AC_MSG_CHECKING(whether to check magic for evas object)
+AC_ARG_ENABLE(evas-magic-debug,
+  AC_HELP_STRING(
+    [--disable-evas-magic-debug],
+    [disable MAGIC_DEBUG check when people pass in wrong object type. [[default=enabled]]]
+  ),
+  [ want_evas_magic_debug="$enableval" ]
+)
+AC_MSG_RESULT($want_evas_magic_debug)
+
+AM_CONDITIONAL(EVAS_MAGIC_DEBUG, test "x$want_evas_magic_debug" = "xyes")
+if test "x$want_evas_magic_debug" = "xyes"; then
+  AC_DEFINE(EVAS_MAGIC_DEBUG, 1, [complain when peole pass in wrong object types etc.])
+fi
+
+#####################################################################
+## ARGB engine options
+
+#######################################
+## Nearest sampling scaler
+EVAS_CHECK_SCALER([scale-sample], [sampling scaler], [scaler_sample="yes"], [scaler_sample="no"])
+## Smooth super and sub sampling scaler
+EVAS_CHECK_SCALER([scale-smooth], [smooth scaler], [scaler_smooth="yes"], [scaler_smooth="no"])
+
+#######################################
+## YUV -> ARGB converter
+conv_yuv="no"
+conv_yuv="yes"
+AC_MSG_CHECKING(whether to build yuv converter code)
+AC_ARG_ENABLE(convert-yuv,
+  AC_HELP_STRING([--enable-convert-yuv], [enable yuv converter code]),
+  [
+      if test "x$enableval" = "xyes" ; then
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(BUILD_CONVERT_YUV, 1, [YUV Converter Support])
+        conv_yuv="yes"
+      else
+        AC_MSG_RESULT(no)
+        conv_yuv="no"
+      fi
+  ], [
+      AC_MSG_RESULT($conv_yuv)
+      if test "x$conv_yuv" = "xyes" ; then
+        AC_DEFINE(BUILD_CONVERT_YUV, 1, [YUV Converter Support])
+      fi
+  ]
+)
+
+#####################################################################
+## Output rendering features
+
+#######################################
+## Small dither mask instead of big one (lower quality)
+EVAS_CHECK_DITHER([small-dither-mask], [small dither mask], [conv_small_dither="yes"], [conv_small_dither="no"])
+## Alternate Line dither mask instead of big one (lower quality - but fastest)
+EVAS_CHECK_DITHER([line-dither-mask], [line dither mask], [conv_line_dither="yes"], [conv_line_dither="no"])
+## No dither mask at all for 16bpp
+EVAS_CHECK_DITHER([no-dither-mask], [conversion to 16bpp without dither mask], [conv_no_dither="yes"], [conv_no_dither="no"])
+
+#######################################
+## Convert to 8bpp RGB 332
+EVAS_CONVERT_COLOR(8, RGB, 332, [yes])
+## Convert to 8bpp RGB 666
+EVAS_CONVERT_COLOR(8, RGB, 666, [yes])
+## Convert to 8bpp RGB 232
+EVAS_CONVERT_COLOR(8, RGB, 232, [yes])
+## Convert to 8bpp RGB 222
+EVAS_CONVERT_COLOR(8, RGB, 222, [yes])
+## Convert to 8bpp RGB 221
+EVAS_CONVERT_COLOR(8, RGB, 221, [yes])
+## Convert to 8bpp RGB 121
+EVAS_CONVERT_COLOR(8, RGB, 121, [yes])
+## Convert to 8bpp RGB 111
+EVAS_CONVERT_COLOR(8, RGB, 111, [yes])
+## Convert to 16bpp RGB 565
+EVAS_CONVERT_COLOR(16, RGB, 565)
+## Convert to 16bpp BGR 565
+EVAS_CONVERT_COLOR(16, BGR, 565)
+## Convert to 16bpp RGB 555
+EVAS_CONVERT_COLOR(16, RGB, 555)
+## Convert to 16bpp RGB 444
+EVAS_CONVERT_COLOR(16, RGB, 444)
+
+#######################################
+## Convert to 16bpp RGB 565 (444 ipaq)
+conv_16_rgb_ipq="yes"
+AC_MSG_CHECKING(whether to build 16bpp 565 (444 ipaq) converter code)
+AC_ARG_ENABLE(convert-16-rgb-ipq,
+  AC_HELP_STRING([--disable-convert-16-rgb-ipq], [disable 16bpp 565 (444 ipaq) converter code]),
+  [
+      if test "x$enableval" = "xyes" ; then
+        AC_DEFINE(BUILD_CONVERT_16_RGB_454645, 1, [16bpp 565 (444 ipaq) Converter Support])
+        conv_16_rgb_ipq="yes"
+      else
+        conv_16_rgb_ipq="no"
+      fi
+  ], [
+      if test "x$conv_16_rgb_ipq" = "xyes" ; then
+        AC_DEFINE(BUILD_CONVERT_16_RGB_454645, 1, [16bpp 565 (444 ipaq) Converter Support])
+      fi
+  ]
+)
+AC_MSG_RESULT($conv_16_rgb_ipq)
+
+#######################################
+## Convert to 16bpp RGB with rotation of 0
+EVAS_CONVERT_ROT(16, RGB, 0)
+## Convert to 16bpp RGB with rotation of 180
+EVAS_CONVERT_ROT(16, RGB, 180)
+## Convert to 16bpp RGB with rotation of 270
+EVAS_CONVERT_ROT(16, RGB, 270)
+## Convert to 16bpp RGB with rotation of 90
+EVAS_CONVERT_ROT(16, RGB, 90)
+
+#######################################
+## Convert to 24bpp RGB 888
+EVAS_CONVERT_COLOR(24, RGB, 888)
+## Convert to 24bpp BGR 888
+EVAS_CONVERT_COLOR(24, BGR, 888)
+## Convert to 32bpp RGB 8888
+EVAS_CONVERT_COLOR(32, RGB, 8888)
+## Convert to 32bpp RGBX 8888
+EVAS_CONVERT_COLOR(32, RGBX, 8888)
+## Convert to 32bpp BGR 8888
+EVAS_CONVERT_COLOR(32, BGR, 8888)
+## Convert to 32bpp BGRX 8888
+EVAS_CONVERT_COLOR(32, BGRX, 8888)
+
+#######################################
+## Convert to 24bpp RGB 666 (666 ezx)
+conv_24_rgb_ezx="yes"
+AC_MSG_CHECKING(whether to build 24bpp 666 (666 ezx) converter code)
+AC_ARG_ENABLE(convert-24-rgb-ezx,
+  AC_HELP_STRING([--disable-convert-24-rgb-ezx], [disable 24bpp 666 (666 ezx) converter code]),
+  [
+      if test "x$enableval" = "xyes" ; then
+        AC_DEFINE(BUILD_CONVERT_24_RGB_666, 1, [24bpp 666 (666 ezx) Converter Support])
+        conv_24_rgb_ezx="yes"
+      else
+        conv_24_rgb_ezx="no"
+      fi
+  ], [
+      if test "x$conv_24_rgb_ezx" = "xyes" ; then
+        AC_DEFINE(BUILD_CONVERT_24_RGB_666, 1, [24bpp 666 (666 ezx) Converter Support])
+      fi
+  ]
+)
+AC_MSG_RESULT($conv_24_rgb_ezx)
+
+#######################################
+## Convert to 32bpp RGB 666 (666 ezx)
+conv_32_rgb_ezx="yes"
+AC_MSG_CHECKING(whether to build 32bpp 666 (666 ezx) converter code)
+AC_ARG_ENABLE(convert-32-rgb-ezx,
+  AC_HELP_STRING([--disable-convert-32-rgb-ezx], [disable 32bpp 666 (666 ezx) converter code]),
+  [
+      if test "x$enableval" = "xyes" ; then
+        AC_DEFINE(BUILD_CONVERT_32_RGB_666, 1, [32bpp 666 (666 ezx) Converter Support])
+        conv_32_rgb_ezx="yes"
+      else
+        conv_32_rgb_ezx="no"
+      fi
+  ], [
+      if test "x$conv_32_rgb_ezx" = "xyes" ; then
+        AC_DEFINE(BUILD_CONVERT_32_RGB_666, 1, [32bpp 666 (666 ezx) Converter Support])
+      fi
+  ]
+)
+AC_MSG_RESULT($conv_32_rgb_ezx)
+
+#######################################
+## Convert to 32bpp RGB with rotation of 0
+EVAS_CONVERT_ROT(32, RGB, 0)
+## Convert to 32bpp RGB with rotation of 180
+EVAS_CONVERT_ROT(32, RGB, 180)
+## Convert to 32bpp RGB with rotation of 270
+EVAS_CONVERT_ROT(32, RGB, 270)
+## Convert to 32bpp RGB with rotation of 90
+EVAS_CONVERT_ROT(32, RGB, 90)
+
+#######################################
+## Convert to 8bpp grayscale with 256 value, no palette
+EVAS_CONVERT_COLOR(8, GRY, 1)
+## Convert to 8bpp grayscale with 16 value, no palette
+EVAS_CONVERT_COLOR(8, GRY, 16)
+
+#######################################
+## Convert to 8bpp grayscale, 64-palette
+conv_8_grayscale_64="yes"
+AC_MSG_CHECKING(whether to build 8bpp grayscale 64-palette converter code)
+AC_ARG_ENABLE(convert-8-grayscale-64,
+  AC_HELP_STRING([--disable-convert-8-grayscale-64], [disable 8bpp grayscale 64-palette converter code]),
+  [
+     if test "x$enableval" = "xyes"; then
+       AC_DEFINE(BUILD_CONVERT_8_GRAYSCALE_64, 1, [8bpp Grayscale 64-palette Converter Support])
+       conv_8_grayscale_64="yes"
+     else
+       conv_8_grayscale_64="no"
+     fi
+  ], [
+     if test "x$conv_8_grayscale_64" = "xyes"; then
+       AC_DEFINE(BUILD_CONVERT_8_GRAYSCALE_64, 1, [32bpp Grayscale 64-palette Converter Support])
+     fi
+  ]
+)
+AC_MSG_RESULT($conv_8_grayscale_64)
+
+## valgrind
+want_valgrind="no"
+have_valgrind="no"
+
+AC_MSG_CHECKING(whether to enable build with valgrind)
+AC_ARG_ENABLE(valgrind,
+  AC_HELP_STRING([--enable-valgrind], [enable valgrind fixes to stop false reports]),
+  [ want_valgrind=$enableval ]
+)
+AC_MSG_RESULT($want_valgrind)
+
+if test x$want_valgrind = "xyes"; then
+  PKG_CHECK_MODULES(VALGRIND, valgrind >= 2.4.0,
+    [
+      AC_DEFINE(HAVE_VALGRIND, 1, [Valgrind support])
+      have_valgrind=yes
+      requirement_evas="valgrind ${requirement_evas}"
+    ],
+    [
+      if test "x$want_valgrind" = "xyes" -a "x$use_strict" = "xyes" ; then
+        AC_MSG_ERROR([Valgrind not found (strict dependencies checking)])
+      fi
+    ]
+  )
+fi
+
+## Examples
+
+install_examples="yes"
+AC_ARG_ENABLE([install-examples],
+   AC_HELP_STRING([--disable-install-examples],
+                  [disable installing examples (compiled or just source).
+                   @<:@default==enabled@:>@]),
+   [
+    if test "x${enableval}" = "xyes" ; then
+       install_examples="yes"
+    else
+       install_examples="no"
+    fi
+   ],
+   [install_examples="yes"])
+AM_CONDITIONAL([INSTALL_EXAMPLES], [test "x${install_examples}" = "xyes"])
+
+build_examples="no"
+AC_ARG_ENABLE([build-examples],
+   AC_HELP_STRING([--enable-build-examples],
+                  [enable building examples. @<:@default==disabled@:>@]),
+   [
+    if test "x${enableval}" = "xyes" ; then
+       build_examples="yes"
+    else
+       build_examples="no"
+    fi
+   ],
+   [build_examples="no"])
+AM_CONDITIONAL([BUILD_EXAMPLES], [test "x${build_examples}" = "xyes"])
+
+
+#####################################################################
+## Fill in flags
+
+AC_SUBST(altivec_cflags)
+AC_SUBST(pthread_cflags)
+AC_SUBST(pthread_libs)
+AC_SUBST(requirement_evas)
+
+
+#####################################################################
+## Output
+
+AC_OUTPUT([
+Makefile
+evas-directfb.pc
+evas-fb.pc
+evas-opengl-glew.pc
+evas-opengl-x11.pc
+evas-opengl-sdl.pc
+evas-quartz.pc
+evas-software-buffer.pc
+evas-software-x11.pc
+evas-software-16-x11.pc
+evas-xrender-x11.pc
+evas-xrender-xcb.pc
+evas-software-gdi.pc
+evas-software-ddraw.pc
+evas-software-16-ddraw.pc
+evas-direct3d.pc
+evas-software-16-wince.pc
+evas-software-sdl.pc
+evas.pc
+doc/evas.dox
+doc/Makefile
+src/Makefile
+src/bin/Makefile
+src/lib/Makefile
+src/lib/canvas/Makefile
+src/lib/file/Makefile
+src/lib/imaging/Makefile
+src/lib/cache/Makefile
+src/lib/cserve/Makefile
+src/lib/engines/Makefile
+src/lib/engines/common/Makefile
+src/lib/engines/common/evas_op_add/Makefile
+src/lib/engines/common/evas_op_blend/Makefile
+src/lib/engines/common/evas_op_copy/Makefile
+src/lib/engines/common/evas_op_mask/Makefile
+src/lib/engines/common/evas_op_mul/Makefile
+src/lib/engines/common/evas_op_sub/Makefile
+src/lib/engines/common_16/Makefile
+src/modules/Makefile
+src/modules/engines/Makefile
+src/modules/engines/software_generic/Makefile
+src/modules/engines/software_gdi/Makefile
+src/modules/engines/software_ddraw/Makefile
+src/modules/engines/direct3d/Makefile
+src/modules/engines/software_16_wince/Makefile
+src/modules/engines/software_x11/Makefile
+src/modules/engines/fb/Makefile
+src/modules/engines/buffer/Makefile
+src/modules/engines/directfb/Makefile
+src/modules/engines/gl_common/Makefile
+src/modules/engines/gl_glew/Makefile
+src/modules/engines/gl_x11/Makefile
+src/modules/engines/gl_sdl/Makefile
+src/modules/engines/quartz/Makefile
+src/modules/engines/xrender_x11/Makefile
+src/modules/engines/software_sdl/Makefile
+src/modules/engines/software_16/Makefile
+src/modules/engines/software_16_x11/Makefile
+src/modules/engines/software_16_ddraw/Makefile
+src/modules/engines/software_16_sdl/Makefile
+src/modules/loaders/Makefile
+src/modules/loaders/edb/Makefile
+src/modules/loaders/eet/Makefile
+src/modules/loaders/gif/Makefile
+src/modules/loaders/jpeg/Makefile
+src/modules/loaders/png/Makefile
+src/modules/loaders/tiff/Makefile
+src/modules/loaders/xpm/Makefile
+src/modules/loaders/svg/Makefile
+src/modules/loaders/pmaps/Makefile
+src/modules/savers/Makefile
+src/modules/savers/edb/Makefile
+src/modules/savers/eet/Makefile
+src/modules/savers/jpeg/Makefile
+src/modules/savers/png/Makefile
+src/modules/savers/tiff/Makefile
+src/lib/include/Makefile
+src/examples/Makefile
+README
+evas.spec
+])
+
+#disabled for the release:
+# evas-cairo-x11.pc
+# evas-software-qtopia.pc
+# src/modules/engines/cairo_common/Makefile
+# src/modules/engines/cairo_x11/Makefile
+# src/modules/engines/software_qtopia/Makefile
+
+
+#####################################################################
+## Info
+
+echo
+echo
+echo
+echo "------------------------------------------------------------------------"
+echo "$PACKAGE $VERSION"
+echo "------------------------------------------------------------------------"
+echo
+echo "Configuration Options Summary:"
+echo
+echo "Engines:"
+echo "  Software Memory Buffer.....: $have_evas_engine_buffer"
+echo "  Software X11...............: $have_evas_engine_software_x11 (Xlib: $have_evas_engine_software_xlib) (XCB: $have_evas_engine_software_xcb)"
+echo "  XRender X11................: $have_evas_engine_xrender_x11 (XCB: $have_evas_engine_xrender_xcb)"
+echo $ECHO_N "  OpenGL X11.................: $have_evas_engine_gl_x11 $ECHO_C"
+if test "x$have_evas_engine_gl_x11" = "xyes"; then
+   echo "(GLES: $gl_flavor_gles) (SGX: $gles_variety_sgx) (s3c6410: $gles_variety_s3c6410)"
+else
+   echo
+fi
+#echo "  Cairo X11..................: $have_evas_engine_cairo_x11"
+echo "  Software GDI...............: $have_evas_engine_software_gdi"
+echo "  Software DirectDraw........: $have_evas_engine_software_ddraw"
+echo "  Direct3d...................: $have_evas_engine_direct3d"
+echo "  Quartz.....................: $have_evas_engine_quartz"
+echo "  OpenGL Glew................: $have_evas_engine_gl_glew"
+echo "  Software SDL...............: $have_evas_engine_software_sdl (primitive: $sdl_primitive)"
+echo $ECHO_N "  OpenGL SDL.................: $have_evas_engine_gl_sdl $ECHO_C"
+if test "x$have_evas_engine_gl_sdl" = "xyes"; then
+   echo "(GLES: $gl_flavor_gles) (SGX: $gles_variety_sgx) (s3c6410: $gles_variety_s3c6410)"
+else
+   echo
+fi
+echo "  Software Framebuffer.......: $have_evas_engine_fb"
+echo "  DirectFB...................: $have_evas_engine_directfb"
+#echo "  Software Qtopia............: $have_evas_engine_software_qtopia"
+echo "  Software 16bit ............: $have_evas_engine_software_16"
+echo "  Software 16bit X11.........: $have_evas_engine_software_16_x11"
+echo "  Software 16bit Directdraw..: $have_evas_engine_software_16_ddraw"
+echo "  Software 16bit WinCE.......: $have_evas_engine_software_16_wince"
+echo "  Software 16bit SDL.........: $have_evas_engine_software_sdl (primitive: $sdl_primitive)"
+# FIXME: opengl engine needs to be fixed and tested lots for all drivers
+echo
+echo "Image Loaders:"
+echo "  EDB.....................: $have_evas_image_loader_edb"
+echo "  EET.....................: $have_evas_image_loader_eet"
+echo "  GIF.....................: $have_evas_image_loader_gif"
+echo "  JPEG....................: $have_evas_image_loader_jpeg (region: $have_jpeg_region)"
+echo "  PMAPS...................: $have_evas_image_loader_pmaps"
+echo "  PNG.....................: $have_evas_image_loader_png"
+echo "  SVG.....................: $have_evas_image_loader_svg"
+echo "  TIFF....................: $have_evas_image_loader_tiff"
+echo "  XPM.....................: $have_evas_image_loader_xpm"
+# FIXME: need to add modular image loader system
+# FIXME: add more image loader modules
+echo
+echo "Font Sourcing Systems:"
+echo "  EET.....................: $have_evas_font_loader_eet"
+echo
+echo "Font Searching Systems:"
+echo "  Fontconfig..............: $have_fontconfig"
+echo "  Fribidi.................: $have_fribidi"
+# FIXME: add non freetype2 font engine support
+# FIXME: make freetype2 optional
+echo
+echo "CPU Specific Extensions:"
+echo "  Fallback C Code.........: $build_cpu_c"
+echo "  MMX.....................: $build_cpu_mmx"
+echo "  SSE.....................: $build_cpu_sse"
+echo "  ALTIVEC.................: $build_cpu_altivec"
+echo "  NEON....................: $build_cpu_neon"
+echo "  Thread Support..........: $build_pthreads"
+echo
+echo "Features:"
+echo "  MAGIC_DEBUG.............: $want_evas_magic_debug"
+echo "  Cache Server............: $want_evas_cserve"
+echo
+echo "  Threaded Pipe Rendering.: $build_pipe_render"
+echo "  Async Events............: $build_async_events"
+echo "  Async Image Preload.....: $build_async_preload"
+echo
+echo "ARGB Software Engine Options:"
+echo "  Sampling Scaler.........: $scaler_sample"
+echo "  Smooth Scaler...........: $scaler_smooth"
+# FIXME: add an mmx scaler routine
+echo "  YUV Converter...........: $conv_yuv"
+# FIXME: add more YUV format and colorvariant support
+echo
+echo "ARGB Conversion Options:"
+echo "  Smaller Dither Mask.....: $conv_small_dither"
+echo "  Line Dither Mask........: $conv_line_dither"
+echo "  No Dither Mask for 16bpp: $conv_no_dither"
+echo "  8bpp RGB 332............: $conv_8_rgb_332"
+echo "  8bpp RGB 666............: $conv_8_rgb_666"
+echo "  8bpp RGB 232............: $conv_8_rgb_232"
+echo "  8bpp RGB 222............: $conv_8_rgb_222"
+echo "  8bpp RGB 221............: $conv_8_rgb_221"
+echo "  8bpp RGB 121............: $conv_8_rgb_121"
+echo "  8bpp RGB 111............: $conv_8_rgb_111"
+echo "  8bpp Grayscale (256)....: $conv_8_gry_1"
+echo "  8bpp Grayscale (16).....: $conv_8_gry_16"
+echo "  8bpp Grayscale 64-pal...: $conv_8_grayscale_64"
+# FIXME: add grayscale and B&W support
+echo "  16bpp RGB 565...........: $conv_16_rgb_565"
+echo "  16bpp BGR 565...........: $conv_16_bgr_565"
+echo "  16bpp RGB 555...........: $conv_16_rgb_555"
+echo "  16bpp RGB 444...........: $conv_16_rgb_444"
+echo "  16bpp RGB 565 (444 ipaq): $conv_16_rgb_ipq"
+# FIXME: add 555 (444 ipaq) support
+# FIXME: add 30bpp support
+# FIXME: add palletted support
+# FIXME: add 8bpp and below rotation
+echo "  16bpp Rotation 0........: $conv_16_rgb_rot_0"
+echo "  16bpp Rotation 90.......: $conv_16_rgb_rot_90"
+echo "  16bpp Rotation 180......: $conv_16_rgb_rot_180"
+echo "  16bpp Rotation 270......: $conv_16_rgb_rot_270"
+echo "  24bpp RGB 888...........: $conv_24_rgb_888"
+echo "  24bpp BGR 888...........: $conv_24_bgr_888"
+echo "  24bpp RGB 666 (666 ezx).: $conv_24_rgb_ezx"
+# FIXME: add 24bpp rotation
+echo "  32bpp RGB 8888..........: $conv_32_rgb_8888"
+echo "  32bpp RGBX 8888.........: $conv_32_rgbx_8888"
+echo "  32bpp BGR 8888..........: $conv_32_bgr_8888"
+echo "  32bpp BGRX 8888.........: $conv_32_bgrx_8888"
+echo "  32bpp RGB 666 (666 ezx).: $conv_32_rgb_ezx"
+echo "  32bpp Rotation 0........: $conv_32_rgb_rot_0"
+echo "  32bpp Rotation 90.......: $conv_32_rgb_rot_90"
+echo "  32bpp Rotation 180......: $conv_32_rgb_rot_180"
+echo "  32bpp Rotation 270......: $conv_32_rgb_rot_270"
+echo
+echo "Documentation.............: ${build_doc}"
+echo "Examples..................: install:${install_examples} build:${build_examples}"
+echo
+echo "Compilation............: make (or gmake)"
+echo "  CPPFLAGS.............: $CPPFLAGS"
+echo "  CFLAGS...............: $CFLAGS"
+echo "  CXXFLAGS.............: $CXXFLAGS"
+echo "  LDFLAGS..............: $LDFLAGS"
+echo
+echo "Installation...........: make install (as root if needed, with 'su' or 'sudo')"
+echo "  prefix...............: $prefix"
+echo
+if test "x${have_static_module}" = "xyes" ; then
+echo -e "\0033\01331;31mWarning\0033\01331;0m: You are trying to link statically one or more modules to Evas."
+echo "         You must know what you are doing, or else you will have a lot of problems."
+echo "         And Kenny will be killed."
+echo "         Think about that."
+echo
+fi
diff --git a/debian/SVN_REV b/debian/SVN_REV
new file mode 100644 (file)
index 0000000..6127e16
--- /dev/null
@@ -0,0 +1,2 @@
+Revision 48959
+Last Changed Rev 48959
diff --git a/debian/_original/changelog b/debian/_original/changelog
new file mode 100644 (file)
index 0000000..ec9bbae
--- /dev/null
@@ -0,0 +1,11 @@
+evas (0.9.9.060+svnYYYYMMDD-1) unstable; urgency=low
+
+  * Clean up changelog
+
+ -- quaker <quaker66@gmail.com>  Thu, 22 Apr 2009 18:27:21 +0100
+
+evas (0.9.9.050+svnYYYYMMDD-1) unstable; urgency=low
+
+  * Clean up changelog
+
+ -- quaker <quaker66@gmail.com>  Tue, 21 Apr 2009 19:13:59 +0100
diff --git a/debian/_original/compat b/debian/_original/compat
new file mode 100644 (file)
index 0000000..1e8b314
--- /dev/null
@@ -0,0 +1 @@
+6
diff --git a/debian/_original/control b/debian/_original/control
new file mode 100644 (file)
index 0000000..7f53495
--- /dev/null
@@ -0,0 +1,105 @@
+Source: evas
+Section: libs
+Priority: optional
+Maintainer:  Debian Pkg-e Team <pkg-e-devel@lists.alioth.debian.org>
+Uploaders: Albin Tonnerre <albin.tonnerre@gmail.com>,
+ Niv Sardi <xaiki@debian.org>, Xavier Oswald <x.oswald@free.fr>,
+ Jan Lübbe <jluebbe@debian.org>,
+ Nikita V. Youshchenko <yoush@debian.org>
+Build-Depends: debhelper (>= 6), cdbs, libeet-dev (>= 1.1.0), libeina-dev (>= 0.0.2.060+svnYYYYMMDD),
+ libfreetype6-dev, libpng12-dev | libpng-dev, libx11-dev, libxrender-dev,
+ x11proto-xext-dev, zlib1g, libjpeg62-dev, libtiff4-dev, libgif-dev,
+ libfontconfig1-dev, libglu1-mesa-dev, mesa-common-dev, libxpm-dev,
+ librsvg2-dev, doxygen, pkg-config, libtool
+Standards-Version: 3.8.1
+Homepage: http://www.enlightenment.org
+
+Package: libevas-svn-01
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, libevas-engines (>= 0.9.9.060+svnYYYYMMDD)
+Provides: libevas0
+Conflicts: libevas0
+Description: Enlightenment DR17 advanced canvas library
+ Evas is an advanced canvas library, providing six engines for rendering: X11,
+ OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows
+ and Qtopia.
+ .
+ Due to its simple API, evas can be developed with rapidly, and cleanly.
+ .
+ This package contains the core library and a set of image loaders and/or savers
+ for various formats: eet, gif, jpeg, png, svg, tiff and xpm
+
+Package: libevas-doc
+Architecture: all
+Section: doc
+Depends: ${misc:Depends}
+Enhances: libevas-dev
+Description: Evas API Documentation
+ Evas is an advanced canvas library, providing six engines for rendering: X11,
+ OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows
+ and Qtopia.
+ Due to its simple API, evas can be developed with rapidly, and cleanly.
+ .
+ This package provides development documentation (html and manpages) for the
+ Evas library.
+
+Package: libevas-dev
+Section: libdevel
+Architecture: any
+Depends: ${misc:Depends}, libevas-svn-01 (= ${binary:Version}), libjpeg62-dev, libx11-dev,
+ libfreetype6-dev, libfontconfig1-dev, libeet-dev, pkg-config, libeina-dev (>= 0.0.2.060+svnYYYYMMDD)
+Suggests: libevas-doc
+Description: Enlightenment DR17 advanced canvas library development files
+ Evas is an advanced canvas library, providing six engines for rendering: X11,
+ OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows
+ and Qtopia.
+ .
+ Due to its simple API, evas can be developed with rapidly, and cleanly.
+ .
+ This package provides headers and static libraries required to develop against
+ evas.
+
+Package: libevas-dbg
+Architecture: any
+Section: debug
+Depends: ${misc:Depends}, libevas-svn-01 (= ${binary:Version})
+Priority: extra
+Description: enlightenment advanced canvas library
+ Evas is an advanced canvas library, providing six engines for rendering: X11,
+ OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows
+ and Qtopia.
+ .
+ This package contains unstripped shared libraries. It is provided primarily
+ to provide a backtrace with names in a debugger, this makes it somewhat
+ easier to interpret core dumps. The libraries are installed in
+ /usr/lib/debug and are automatically used by gdb.
+
+Package: libevas-engines
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Conflicts: libevas-0.9.9.050a-engines
+Description: Evas module providingg the framebuffer render engine
+ Evas is an advanced canvas library, providing six engines for rendering: X11,
+ OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows
+ and Qtopia.
+ Due to its simple API, evas can be developed with rapidly, and cleanly.
+ .
+ This package contains the following Evas engine modules:
+  - buffer
+  - software/genenric
+  - software/X11
+  - xrender/X11
+
+Package: libevas-engines-extras
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, libevas-engines
+Conflicts: libevas-0.9.9.050a-engines-extras
+Description: Evas module providing the Xrender engine
+ Evas is an advanced canvas library, providing six engines for rendering: X11,
+ OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows
+ and Qtopia.
+ Due to its simple API, evas can be developed with rapidly, and cleanly.
+ .
+ This package contains some extra Evas engine modules:
+  - GL/X11
+  - Framebuffer
diff --git a/debian/_original/copyright b/debian/_original/copyright
new file mode 100644 (file)
index 0000000..3353e50
--- /dev/null
@@ -0,0 +1,38 @@
+This package was debianized by Debian Pkg-e Team <pkg-e-devel@lists.alioth.debian.org> 
+Sat, 07 Jul 2007 09:29:10 +0000.
+
+It was downloaded from http://download.enlightenment.org/
+
+Upstream Authors: 
+
+       Enlightenment team <enlightenment-devel@lists.sourceforge.net>
+
+Copyright:
+
+       Copyright (C) 2000 Carsten Haitzler and various contributors (see AUTHORS)
+    src/modules/engines/fb/evas_fb.h: Copyright (c) 1999 - Carsten Haitzler
+    src/modules/engines/fb/evas_fb_main.c: Copyright (c) 1999 - Carsten Haitzler
+
+License:
+
+  Permission is hereby granted, free of charge, to any person obtaining a
+  copy of this software and associated documentation files (the "Software"),
+  to deal in the Software without restriction, including without limitation
+  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+  and/or sell copies of the Software, and to permit persons to whom the
+  Software is furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in
+  all copies of the Software, its documentation and marketing & publicity
+  materials, and acknowledgment shall be given in the documentation,
+  materials and software packages that this Software was used.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+  THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+On Debian systems, the complete text of the BSD License can be found
+in `/usr/share/common-licenses/BSD'.
diff --git a/debian/_original/libevas-dev.install b/debian/_original/libevas-dev.install
new file mode 100644 (file)
index 0000000..b2b373c
--- /dev/null
@@ -0,0 +1,4 @@
+debian/tmp/usr/include/*
+debian/tmp/usr/lib/lib*.a
+debian/tmp/usr/lib/pkgconfig/*
+debian/tmp/usr/lib/libevas.so
diff --git a/debian/_original/libevas-doc.dirs b/debian/_original/libevas-doc.dirs
new file mode 100644 (file)
index 0000000..fc70dc0
--- /dev/null
@@ -0,0 +1 @@
+usr/share/doc/libevas-doc
diff --git a/debian/_original/libevas-doc.doc-base b/debian/_original/libevas-doc.doc-base
new file mode 100644 (file)
index 0000000..397f3dd
--- /dev/null
@@ -0,0 +1,10 @@
+Document: evas
+Title: Evas Guide
+Author: Carsten Haitzler
+Abstract: This document describes Evas API
+ and provides sample C code.
+Section: Programming/C
+
+Format: HTML
+Index: /usr/share/doc/libevas-doc/html/index.html
+Files: /usr/share/doc/libevas-doc/html/*.html
diff --git a/debian/_original/libevas-engines-extras.install b/debian/_original/libevas-engines-extras.install
new file mode 100644 (file)
index 0000000..45a5936
--- /dev/null
@@ -0,0 +1,2 @@
+debian/tmp/usr/lib/evas/modules/engines/fb/*/module.so
+debian/tmp/usr/lib/evas/modules/engines/gl_x11/*/module.so
diff --git a/debian/_original/libevas-engines.install b/debian/_original/libevas-engines.install
new file mode 100644 (file)
index 0000000..7a83942
--- /dev/null
@@ -0,0 +1,4 @@
+debian/tmp/usr/lib/evas/modules/engines/buffer/*/module.so
+debian/tmp/usr/lib/evas/modules/engines/software_generic/*/module.so
+debian/tmp/usr/lib/evas/modules/engines/software_x11/*/module.so
+debian/tmp/usr/lib/evas/modules/engines/xrender_x11/*/module.so
diff --git a/debian/_original/libevas-svn-01.install b/debian/_original/libevas-svn-01.install
new file mode 100644 (file)
index 0000000..4fb48cb
--- /dev/null
@@ -0,0 +1,3 @@
+debian/tmp/usr/lib/libevas-*.so.*
+debian/tmp/usr/lib/evas/modules/loaders/*/*/*.so
+debian/tmp/usr/lib/evas/modules/savers/*/*/*.so
diff --git a/debian/_original/libevas-svn-01.shlibs b/debian/_original/libevas-svn-01.shlibs
new file mode 100644 (file)
index 0000000..d095002
--- /dev/null
@@ -0,0 +1 @@
+libevas-ver-pre-svn-01 0 libevas-svn-01 (>= 0.9.9.060+svnYYYYMMDD)
diff --git a/debian/_original/rules b/debian/_original/rules
new file mode 100755 (executable)
index 0000000..382ac9e
--- /dev/null
@@ -0,0 +1,81 @@
+#!/usr/bin/make -f
+
+include /usr/share/cdbs/1/class/autotools.mk
+include /usr/share/cdbs/1/rules/debhelper.mk
+
+DEB_CONFIGURE_SCRIPT := ./autogen.sh
+DEB_MAKE_CLEAN_TARGET := distclean
+CFLAGS += -fvisibility=hidden -ffast-math
+LDFLAGS += -fvisibility=hidden
+
+DEB_DH_STRIP_ARGS := --dbg-package=libevas-dbg
+
+ifeq (hppa,$(DEB_HOST_ARCH))
+       arch_flags += --disable-pthreads
+else
+       arch_flags += --enable-pthreads
+endif
+
+ifeq (amd64,$(DEB_HOST_ARCH))
+       arch_flags += --enable-cpu-sse
+endif
+
+DEB_CONFIGURE_EXTRA_FLAGS := --enable-strict \
+       --enable-fontconfig \
+       --enable-software-x11 \
+       --enable-fb \
+       --enable-buffer \
+       --enable-gl-x11 \
+       --enable-xrender-x11 \
+       --enable-image-loader-gif \
+       --enable-image-loader-png \
+       --enable-image-loader-jpeg \
+       --enable-image-loader-eet \
+       --enable-font-loader-eet \
+       --enable-image-loader-tiff \
+       --enable-image-loader-xpm \
+       --enable-image-loader-svg \
+       --enable-scale-sample \
+       --enable-scale-smooth \
+       --enable-convert-yuv \
+       --enable-small-dither-mask \
+       --enable-convert-8-rgb-332 \
+       --enable-convert-8-rgb-666 \
+       --enable-convert-8-rgb-232 \
+       --enable-convert-8-rgb-222 \
+       --enable-convert-8-rgb-221 \
+       --enable-convert-8-rgb-121 \
+       --enable-convert-8-rgb-111 \
+       --enable-convert-16-rgb-565 \
+       --enable-convert-16-bgr-565 \
+       --enable-convert-16-rgb-555 \
+       --enable-convert-16-rgb-444 \
+       --enable-convert-16-rgb-ipq \
+       --enable-convert-16-rgb-rot-0 \
+       --enable-convert-16-rgb-rot-180 \
+       --enable-convert-16-rgb-rot-270 \
+       --enable-convert-16-rgb-rot-90 \
+       --enable-convert-24-rgb-888 \
+       --enable-convert-24-bgr-888 \
+       --enable-convert-32-rgb-8888 \
+       --enable-convert-32-rgbx-8888 \
+       --enable-convert-32-bgr-8888 \
+       --enable-convert-32-bgrx-8888 \
+       --enable-convert-32-rgb-rot-0 \
+       --enable-convert-32-rgb-rot-180 \
+       --enable-convert-32-rgb-rot-270 \
+       --enable-convert-32-rgb-rot-90 \
+       --disable-image-loader-edb \
+       --enable-doc \
+       --disable-rpath $(arch_flags)
+
+build/libevas-doc::
+       cd $(DEB_SRCDIR)/doc && make doc
+
+install/libevas-doc::
+       mkdir -p debian/libevas-doc/usr/share/doc/libevas-doc
+       cp -R $(DEB_SRCDIR)/doc/html debian/libevas-doc/usr/share/doc/libevas-doc/
+
+clean::
+       [ ! -f Makefile ] || make distclean
+       rm -f evas-*.tar.bz2 evas-*.cdbs-config_list
diff --git a/doc/.cvsignore b/doc/.cvsignore
new file mode 100644 (file)
index 0000000..cc370ed
--- /dev/null
@@ -0,0 +1,3 @@
+html
+latex
+man
diff --git a/doc/Doxyfile b/doc/Doxyfile
new file mode 100644 (file)
index 0000000..d1c0539
--- /dev/null
@@ -0,0 +1,139 @@
+PROJECT_NAME           = Evas
+PROJECT_NUMBER         =
+OUTPUT_DIRECTORY       = .
+INPUT                  = evas.dox ../src/lib
+IMAGE_PATH             = img
+OUTPUT_LANGUAGE        = English
+GENERATE_HTML          = YES
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = head.html
+HTML_FOOTER            = foot.html
+HTML_STYLESHEET        = e.css
+HTML_ALIGN_MEMBERS     = YES
+ENUM_VALUES_PER_LINE   = 1
+GENERATE_HTMLHELP      = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+GENERATE_CHI           = NO
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = YES
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+INTERNAL_DOCS          = NO
+STRIP_CODE_COMMENTS    = NO
+CASE_SENSE_NAMES       = YES
+SHORT_NAMES            = NO
+HIDE_SCOPE_NAMES       = NO
+VERBATIM_HEADERS       = NO
+SHOW_INCLUDE_FILES     = NO
+JAVADOC_AUTOBRIEF      = YES
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = NO
+INHERIT_DOCS           = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+DISTRIBUTE_GROUP_DOC   = NO
+TAB_SIZE               = 8
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ALIASES                = 
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 30
+OPTIMIZE_OUTPUT_FOR_C  = YES
+OPTIMIZE_OUTPUT_JAVA   = NO
+SHOW_USED_FILES        = NO
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+FILE_PATTERNS          =
+RECURSIVE              = YES
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXAMPLE_PATH           = ../src/examples
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = YES
+INPUT_FILTER           = 
+FILTER_SOURCE_FILES    = NO
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+ALPHABETICAL_INDEX     = YES
+COLS_IN_ALPHA_INDEX    = 2
+IGNORE_PREFIX          = evas_ _evas_ Evas_ _Evas_ EVAS_ _EVAS_
+GENERATE_TREEVIEW      = NO
+TREEVIEW_WIDTH         = 250
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = 
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = NO
+LATEX_BATCHMODE        = NO
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+GENERATE_MAN           = YES
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = YES
+GENERATE_XML           = NO
+XML_SCHEMA             = 
+XML_DTD                = 
+GENERATE_AUTOGEN_DEF   = NO
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = NO
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = NO
+INCLUDE_PATH           =
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = 
+SKIP_FUNCTION_MACROS   = YES
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+CLASS_DIAGRAMS         = NO
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = NO
+CLASS_GRAPH            = NO
+COLLABORATION_GRAPH    = NO
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = NO
+INCLUDED_BY_GRAPH      = NO
+GRAPHICAL_HIERARCHY    = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+MAX_DOT_GRAPH_WIDTH    = 512
+MAX_DOT_GRAPH_HEIGHT   = 512
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+SEARCHENGINE           = NO
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644 (file)
index 0000000..1022871
--- /dev/null
@@ -0,0 +1,32 @@
+MAINTAINERCLEANFILES = Makefile.in evas.dox
+
+.PHONY: doc
+
+PACKAGE_DOCNAME = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)-doc
+
+if EFL_BUILD_DOC
+
+doc-clean:
+       rm -rf html/ latex/ man/ xml/ $(PACKAGE_DOCNAME).tar*
+
+doc: all doc-clean
+       $(efl_doxygen)
+       cp img/* html/
+       rm -rf $(PACKAGE_DOCNAME).tar*
+       mkdir -p $(PACKAGE_DOCNAME)/doc
+       cp -R html/ latex/ man/ $(PACKAGE_DOCNAME)/doc
+       tar cf $(PACKAGE_DOCNAME).tar $(PACKAGE_DOCNAME)/
+       bzip2 -9 $(PACKAGE_DOCNAME).tar
+       rm -rf $(PACKAGE_DOCNAME)/
+       mv $(PACKAGE_DOCNAME).tar.bz2 $(top_srcdir)
+
+clean-local: doc-clean
+
+else
+
+doc:
+       @echo "Documentation not built. Run ./configure --help"
+
+endif
+
+EXTRA_DIST = Doxyfile $(wildcard img/*.*) e.css head.html foot.html evas.dox.in
diff --git a/doc/e.css b/doc/e.css
new file mode 100644 (file)
index 0000000..12b1ae5
--- /dev/null
+++ b/doc/e.css
@@ -0,0 +1,442 @@
+/*
+    Author:
+        Andres Blanc <andresblanc@gmail.com>
+       DaveMDS Andreoli <dave@gurumeditation.it>
+
+    Supported Browsers:
+        ie7, opera9, konqueror4 and firefox3
+
+        Please use a different file for ie6, ie5, etc. hacks.
+*/
+
+
+/* Necessary to place the footer at the bottom of the page */
+html, body {
+       height: 100%;
+       margin: 0px;
+       padding: 0px;
+}
+
+#container {
+       min-height: 100%;
+       height: auto !important;
+       height: 100%;
+       margin: 0 auto -53px;
+}
+
+#footer, #push {
+       height: 53px;
+}
+
+
+* html #container {
+       height: 100%;
+}
+
+/* Prevent floating elements overflowing containers */
+.clear {
+       clear: both;
+       width: 0px;
+       height: 0px;
+}
+
+/* Flexible & centered layout from 750 to 960 pixels */
+.layout {
+       max-width: 960px;
+       min-width: 760px;
+       margin-left: auto;
+       margin-right: auto;
+}
+
+body {
+       /*font-family: Lucida Grande, Helvetica, sans-serif;*/
+       font-family: "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif
+}
+
+/* Prevent design overflowing the viewport in small resolutions */
+#container {
+       padding-right: 17px;
+       padding-left: 17px;
+       background-image: url(head_bg.png);
+       background-repeat: repeat-x;
+}
+
+#header {
+       width: 100%;
+       height: 102px;
+}
+
+#header h1 {
+       width: 63px;
+       height: 63px;
+       background-image: url(e.png);
+       background-repeat: no-repeat;
+       position: absolute;
+       margin: 0px;
+}
+
+#header h1 span {
+       display: none;
+}
+
+#header h2 {
+       display: none;
+}
+
+/* .menu-container is used to set properties common to .menu and .submenu */
+#header .menu-container {
+}
+
+#header .menu-container ul {
+       list-style-type: none;
+       list-style-position: inside;
+       margin: 0;
+}
+
+#header .menu-container li {
+       display: block;
+       float: right;
+}
+
+#header .menu {
+       height: 63px;
+       display: block;
+       background-image: url(menu_bg.png);
+       background-repeat: repeat-x;
+}
+
+#header .menu ul {
+       height: 100%;
+       display: block;
+       background-image: url(menu_bg_last.png);
+       background-repeat: no-repeat;
+       background-position: top right;
+       padding-right: 17px;
+}
+
+#header .menu li {
+       height: 100%;
+       text-align: center;
+       background-image: url(menu_bg_unsel.png);
+       background-repeat: no-repeat;
+}
+
+#header .menu a {
+       height: 100%;
+       display: block;
+       color: #cdcdcd;
+       text-decoration: none;
+       font-size: 10pt;
+       line-height: 59px;
+       text-align: center;
+       padding: 0px 15px 0px 15px;
+}
+
+#header .menu li:hover {
+       background-image: url(menu_bg_hover.png);
+       background-repeat: no-repeat;
+}
+
+#header .menu li:hover a {
+       color: #FFFFFF;
+}
+
+#header .menu li.current {
+       background-image: url(menu_bg_current.png);
+       background-repeat: no-repeat;
+}
+
+#header .menu li.current a {
+       color: #646464;
+}
+
+
+/* Hide all the submenus but the current */
+#header .submenu ul {
+       display: none;
+}
+
+#header .submenu .current {
+       display: block;
+}
+
+#header .submenu {
+       font: bold 10px verdana,'Bitstream Vera Sans',helvetica,arial,sans-serif;
+       margin-top: 10px;
+}
+
+#header .submenu a {
+       color: #888888;
+       text-decoration: none;
+       font-size: 0.9em;
+       line-height: 15px;
+       padding:0px 5px 0px 5px;
+}
+
+#header .submenu a:hover {
+       color: #444444;
+}
+
+#header .submenu li {
+       border-left: 1px solid #DDDDDD;
+}
+
+#header .submenu li:last-child {
+       border-left: 0;
+}
+
+#header .doxytitle {
+       position: absolute;
+       font-size: 1.8em;
+       font-weight: bold;
+       color: #444444;
+       line-height: 35px;
+}
+
+#header small {
+       font-size: 0.4em;
+}
+
+#footer {
+       background-image: url(foot_bg.png);
+       width: 100%;
+}
+
+#footer table {
+       width: 100%;
+       text-align: center;
+       white-space: nowrap;
+       padding: 5px 30px 5px 30px;
+       font-size: 0.8em;
+       font-family: "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif;
+       color: #888888;
+}
+
+#footer td.copyright {
+       width: 100%;
+}
+
+/*
+    Author:
+        Andres Blanc <andresblanc@gmail.com>
+       DaveMDS Andreoli <dave@gurumeditation.it>
+
+    Supported Browsers:
+        ie7, opera9, konqueror4 and firefox3
+
+        Please use a different file for ie6, ie5, etc. hacks.
+*/
+
+
+/* Necessary to place the footer at the bottom of the page */
+html, body {
+       height: 100%;
+       margin: 0px;
+       padding: 0px;
+}
+
+#container {
+       min-height: 100%;
+       height: auto !important;
+       height: 100%;
+       margin: 0 auto -53px;
+}
+
+#footer, #push {
+       height: 53px;
+}
+
+
+* html #container {
+       height: 100%;
+}
+
+/* Prevent floating elements overflowing containers */
+.clear {
+       clear: both;
+       width: 0px;
+       height: 0px;
+}
+
+/* Flexible & centered layout from 750 to 960 pixels */
+.layout {
+       max-width: 960px;
+       min-width: 760px;
+       margin-left: auto;
+       margin-right: auto;
+}
+
+body {
+       /*font-family: Lucida Grande, Helvetica, sans-serif;*/
+       font-family: "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif
+}
+
+/* Prevent design overflowing the viewport in small resolutions */
+#container {
+       padding-right: 17px;
+       padding-left: 17px;
+       background-image: url(head_bg.png);
+       background-repeat: repeat-x;
+}
+
+#header {
+       width: 100%;
+       height: 102px;
+}
+
+#header h1 {
+       width: 63px;
+       height: 63px;
+       background-image: url(e.png);
+       background-repeat: no-repeat;
+       position: absolute;
+       margin: 0px;
+}
+
+#header h1 span {
+       display: none;
+}
+
+#header h2 {
+       display: none;
+}
+
+/* .menu-container is used to set properties common to .menu and .submenu */
+#header .menu-container {
+}
+
+#header .menu-container ul {
+       list-style-type: none;
+       list-style-position: inside;
+       margin: 0;
+}
+
+#header .menu-container li {
+       display: block;
+       float: right;
+}
+
+#header .menu {
+       height: 63px;
+       display: block;
+       background-image: url(menu_bg.png);
+       background-repeat: repeat-x;
+}
+
+#header .menu ul {
+       height: 100%;
+       display: block;
+       background-image: url(menu_bg_last.png);
+       background-repeat: no-repeat;
+       background-position: top right;
+       padding-right: 17px;
+}
+
+#header .menu li {
+       height: 100%;
+       text-align: center;
+       background-image: url(menu_bg_unsel.png);
+       background-repeat: no-repeat;
+}
+
+#header .menu a {
+       height: 100%;
+       display: block;
+       color: #cdcdcd;
+       text-decoration: none;
+       font-size: 10pt;
+       line-height: 59px;
+       text-align: center;
+       padding: 0px 15px 0px 15px;
+}
+
+#header .menu li:hover {
+       background-image: url(menu_bg_hover.png);
+       background-repeat: no-repeat;
+}
+
+#header .menu li:hover a {
+       color: #FFFFFF;
+}
+
+#header .menu li.current {
+       background-image: url(menu_bg_current.png);
+       background-repeat: no-repeat;
+}
+
+#header .menu li.current a {
+       color: #646464;
+}
+
+
+/* Hide all the submenus but the current */
+#header .submenu ul {
+       display: none;
+}
+
+#header .submenu .current {
+       display: block;
+}
+
+#header .submenu {
+       font: bold 10px verdana,'Bitstream Vera Sans',helvetica,arial,sans-serif;
+       margin-top: 10px;
+}
+
+#header .submenu a {
+       color: #888888;
+       text-decoration: none;
+       font-size: 0.9em;
+       line-height: 15px;
+       padding:0px 5px 0px 5px;
+}
+
+#header .submenu a:hover {
+       color: #444444;
+}
+
+#header .submenu li {
+       border-left: 1px solid #DDDDDD;
+}
+
+#header .submenu li:last-child {
+       border-left: 0;
+}
+
+#header .doxytitle {
+       position: absolute;
+       font-size: 1.8em;
+       font-weight: bold;
+       color: #444444;
+       line-height: 35px;
+}
+
+#header small {
+       font-size: 0.4em;
+}
+
+#footer {
+       background-image: url(foot_bg.png);
+       width: 100%;
+}
+
+#footer table {
+       width: 100%;
+       text-align: center;
+       white-space: nowrap;
+       padding: 5px 30px 5px 30px;
+       font-size: 0.8em;
+       font-family: "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif;
+       color: #888888;
+}
+
+#footer td.copyright {
+       width: 100%;
+}
+
+pre.fragment {
+        font-family: monospace;
+        background-color: #e9e9e9;
+        border: 1px solid #d9d9d9;
+        padding: 10px;
+}
diff --git a/doc/evas.dox.in b/doc/evas.dox.in
new file mode 100644 (file)
index 0000000..7247c9a
--- /dev/null
@@ -0,0 +1,320 @@
+/**
+
+@mainpage Evas
+
+@image html  e_big.png
+
+@version @PACKAGE_VERSION@
+@author Carsten Haitzler <raster@@rasterman.com>
+@author Till Adam <till@@adam-lilienthal.de>
+@author Steve Ireland <sireland@@pobox.com>
+@author Brett Nash <nash@@nash.id.au>
+@author Tilman Sauerbeck <tilman@@code-monkey.de>
+@author Corey Donohoe <atmos@@atmos.org>
+@author Yuri Hudobin <glassy_ape@@users.sourceforge.net>
+@author Nathan Ingersoll <ningerso@@d.umn.edu>
+@author Willem Monsuwe <willem@@stack.nl>
+@author Jose O Gonzalez <jose_ogp@@juno.com>
+@author Bernhard Nemec <Bernhard.Nemec@@viasyshc.com>
+@author Jorge Luis Zapata Muga <jorgeluis.zapata@@gmail.com>
+@author Cedric Bail <cedric.bail@@free.fr>
+@author Gustavo Sverzut Barbieri <barbieri@@profusion.mobi>
+@author Vincent Torri <vtorri@@univ-evry.fr>
+@author Tim Horton <hortont424@@gmail.com>
+@author Tom Hacohen <tom@@stosb.com>
+@author Mathieu Taillefumier <mathieu.taillefumier@@free.fr>
+@author Iván Briano <ivan@@profusion.mobi>
+@author Gustavo Lima Chaves <glima@@profusion.mobi>
+
+@date 2000-2010
+
+@section toc Table of Contents
+
+@li @ref intro
+@li @ref work
+@li @ref compiling
+@li @ref install
+@li @ref next_steps
+@li @ref intro_example
+
+
+@section intro What is Evas?
+
+Evas is a clean display canvas API for several target display systems that
+can draw anti-aliased text, smooth super and sub-sampled scaled images,
+alpha-blend objects much and more.
+
+It abstracts any need to know much about what the characteristics of your
+display system are or what graphics calls are used to draw them and how. It
+deals on an object level where all you do is create and manipulate objects
+in a canvas, set their properties, and the rest is done for you.
+
+Evas optimises the rendering pipeline to minimise effort in redrawing changes
+made to the canvas and so takes this work out of the programmers hand,
+saving a lot of time and energy.
+
+It's small and lean, designed to work on embedded systems all the way to
+large and powerful multi-cpu workstations. It can be compiled to only have
+the features you need for your target platform if you so wish, thus keeping
+it small and lean. It has several display back-ends, letting it display on
+several display systems, making it portable for cross-device and
+cross-platform development.
+
+@subsection intro_not_evas What Evas is not?
+
+Evas is not a widget set or widget toolkit, however it is their
+base. See Elementary (http://docs.enlightenment.org/auto/elementary/)
+for a toolkit based on Evas, Edje, Ecore and other Enlightenment
+technologies.
+
+It is not dependent or aware of main loops, input or output
+systems. Input should be polled from various sources and feed them to
+Evas. Similarly, it will not create windows or report windows updates
+to your system, rather just drawing the pixels and reporting to the
+user the areas that were changed. Of course these operations are quite
+common and thus they are ready to use in Ecore, particularly in
+Ecore_Evas (http://docs.enlightenment.org/auto/ecore/).
+
+
+@section work How does Evas work?
+
+Evas is a canvas display library. This is markedly different from most
+display and windowing systems as a Canvas is structural and is also a state
+engine, wheras most display and windowing systems are immediate mode display
+targets. Evas handles the logic between a structural display via its' state
+engine, and controls the target windowing system in order to produce
+rendered results of the current canvases state on the display.
+
+Immediate mode display systems retain very little, or no state. A program
+will execute a series of commands, as in the pseudo code:
+
+@verbatim
+draw line from position (0, 0) to position (100, 200);
+
+draw rectangle from position (10, 30) to position (50, 500);
+
+bitmap_handle = create_bitmap();
+scale bitmap_handle to size 100 x 100;
+draw image bitmap_handle at position (10, 30);
+@endverbatim
+
+The series of commands is executed by the windowing system and the results
+are displayed on the screen (normally). Once the commands are executed the
+display system has little or no idea of how to reproduce this image again,
+and so has to be instructed by the application how to redraw sections of the
+screen whenever needed. Each sucessive command will be executed as
+instructed by the application and either emulated by software or sent to the
+graphics hardware on the device to be performed.
+
+The advantage of such a system is that it is simple, and gives a program
+tight control over how something looks and is drawn. Given the increasing
+complexity of displays and demands by users to have better looking
+interfaces, more and more work is needing to be done at this level by the
+internals of widget sets, custom display widgets and other programs. This
+means more and more logic and display rendering code needs to be written
+time and time again, each time the application needs to figure out how to
+minimise redraws so that display is fast and interactive, and keep track of
+redraw logic. The power comes at a high-price, lots of extra code and work.
+Programmers not very familiar with graphics programming will often make
+mistakes at this level and produce code that is sub optimal. Those familiar
+with this kind of programming will simply get bored by writing the same code
+again and again.
+
+For example, if in the above scene, the windowing system requires the
+application to redraw the area from 0, 0 to 50, 50 (also referred as
+"expose event"), then the programmer must calculate manually the
+updates and repaint it again:
+
+@verbatim
+Redraw from position (0, 0) to position (50, 50):
+
+// what was in area (0, 0, 50, 50)?
+
+// 1. intersection part of line (0, 0) to (100, 200)?
+      draw line from position (0, 0) to position (25, 50);
+
+// 2. intersection part of rectangle (10, 30) to (50, 500)?
+      draw rectangle from position (10, 30) to position (50, 50)
+
+// 3. intersection part of image at (10, 30), size 100 x 100?
+      bitmap_subimage = subregion from position (0, 0) to position (40, 20)
+      draw image bitmap_subimage at position (10, 30);
+@endverbatim
+
+The clever reader might have noticed that, if all elements in the
+above scene are opaque, then the system is doing useless paints: part
+of the line is behind the rectangle, and part of the rectangle is
+behind the image. These useless paints tends to be very costly, as
+pixels tend to be 4 bytes in size, thus an overlapping region of 100 x
+100 pixels is around 40000 useless writes! The developer could write
+code to calculate the overlapping areas and avoid painting then, but
+then it should be mixed with the "expose event" handling mentioned
+above and quickly one realizes the initially simpler method became
+really complex.
+
+Evas is a structural system in which the programmer creates and manages
+display objects and their properties, and as a result of this higher level
+state management, the canvas is able to redraw the set of objects when
+needed to represent the current state of the canvas.
+
+For example, the pseudo code:
+
+@verbatim
+line_handle = create_line();
+set line_handle from position (0, 0) to position (100, 200);
+show line_handle;
+
+rectangle_handle = create_rectangle();
+move rectangle_handle to position (10, 30);
+resize rectangle_handle to size 40 x 470;
+show rectangle_handle;
+
+bitmap_handle = create_bitmap();
+scale bitmap_handle to size 100 x 100;
+move bitmap_handle to position (10, 30);
+show bitmap_handle;
+
+render scene;
+@endverbatim
+
+This may look longer, but when the display needs to be refreshed or updated,
+the programmer only moves, resizes, shows, hides etc. the objects that they
+need to change. The programmer simply thinks at the object logic level, and
+the canvas software does the rest of the work for them, figuring out what
+actually changed in the canvas since it was last drawn, how to most
+efficiently redraw he canvas and its contents to reflect the current state,
+and then it can go off and do the actual drawing of the canvas.
+
+This lets the programmer think in a more natural way when dealing with a
+display, and saves time and effort of working out how to load and display
+images, render given the current display system etc. Since Evas also is
+portable across different display systems, this also gives the programmer
+the ability to have their code ported and display on different display
+systems with very little work.
+
+Evas can be seen as a display system that stands somewhere between a widget
+set and an immediate mode display system. It retains basic display logic,
+but does very little high-level logic such as scrollbars, sliders, push
+buttons etc.
+
+
+@section compiling How to compile using Evas ?
+
+Evas is a library your application links to. The procedure for this is very
+simple. You simply have to compile your application with the appropriate
+compiler flags that the @p pkg-config script outputs. For example:
+
+Compiling C or C++ files into object files:
+
+@verbatim
+gcc -c -o main.o main.c `pkg-config --cflags evas`
+@endverbatim
+
+Linking object files into a binary executable:
+
+@verbatim
+gcc -o my_application main.o `pkg-config --libs evas`
+@endverbatim
+
+You simply have to make sure that pkg-config is in your shell's PATH (see
+the manual page for your appropriate shell) and evas.pc in /usr/lib/pkgconfig
+or its path is in the PKG_CONFIG_PATH environment variable. It's that simple
+to link and use Evas once you have written your code to use it.
+
+Since the program is linked to Evas, it is now able to use any advertised
+API calls to display graphics in a canvas managed by Evas, as well as use
+the API calls provided to manage data as well.
+
+You should make sure you add any extra compile and link flags to your
+compile commands that your application may need as well. The above example
+is only guaranteed to make Evas add it's own requirements.
+
+
+@section install How is it installed?
+
+Simple:
+
+@verbatim
+./configure
+make
+su -
+...
+make install
+@endverbatim
+
+@section next_steps Next Steps
+
+After you understood what Evas is and installed it in your system you
+should proceed understanding the programming interface for all
+objects, then see the specific for the most used elements. We'd
+recommend you to take a while to learn Ecore
+(http://docs.enlightenment.org/auto/ecore/) and Edje
+(http://docs.enlightenment.org/auto/edje/) as they will likely save
+you tons of work compared to using just Evas directly.
+
+Recommended reading:
+
+@li @ref Evas_Object_Group
+@li @ref Evas_Object_Rectangle
+@li @ref Evas_Object_Image
+@li @ref Evas_Object_Text
+@li @ref Evas_Smart_Object_Group and @ref Evas_Smart_Group to define
+    an object that provides custom functions to handle clipping,
+    hiding, moving, resizing, setting the color and more. These could
+    be as simple as a group of objects that move together (see @ref
+    Evas_Smart_Object_Clipped). These smart objects can implement what
+    ends to be a widget, providing some intelligence (thus the name),
+    like a button or check box.
+
+@section intro_example Introductory Example
+
+@include evas-buffer-simple.c
+
+
+
+@todo (1.0) Need a way ot scaling an image and just PRODUCING the output (scaling direct to target buffe r- no blend/copy etc.)
+@todo (1.0) Could improve evas's scaling down code to limit multiple samples per output pixel to maybe 2x2?
+@todo (1.0) Document API
+@todo (1.0) Evas needs to check delete_me member for all object functions
+@todo (1.0) Evas engine that renders to Evas_Objects
+@todo (1.0) OpenGL engine needs to use texture meshes
+@todo (1.0) OpenGL engine needs texture cache and size setting
+@todo (1.0) OpenGL Engine needs YUV import API to YUV texture
+@todo (1.0) All engines need pixel import API
+@todo (1.0) Add parital render through composite layer api to engines
+@todo (1.0) Move callback processing to a queue and do it asynchronously???
+@todo (1.0) Add button grabbing
+@todo (1.0) Add generic object method call system
+@todo (1.0) Add callbacks set for smart object parents to be set on all child smart objects too.
+@todo (1.0) Add font load query calls (so we know if a font load failed)
+@todo (1.0) Add font listing calls
+@todo (1.0) Add ability to check image comments & disk format
+@todo (1.0) Add fontset support
+@todo (1.0) Export engine rendering API cleanly to Evas API
+@todo (1.0) Add smart object ability to provide rendering callback
+@todo (1.1) Make freetype optional and put in optional graymap font engine
+@todo (1.1) Free images if object invisible (and put back in chache)
+@todo (1.1) Check robustness of malloc/calloc/realloc failures.
+@todo (1.1) Add memory use reduction code if any allocations fail
+@todo (1.1) If image loads fails due to memory allocatue failure, load reduced res version
+@todo (1.1) If image load fails due to memory allocation failure, try split it up into tiles and demand-load them
+@todo (1.2) Add external image loaders (application provided callbacks to load)
+@todo (1.2) Add loadable image loader module support (evas loads file.so)
+@todo (1.2) Add external image loader modules (application provides path to file.so)
+@todo (1.3) Add X11 primtive engine (ie pixmap)
+@todo (1.3) Add immediate mode drawing commands to image objects
+@todo (1.3) Fix FB engine to allocate vt and release properly
+@todo (1.4) Add ellipse objects (circle, arc, ellipse etc.)
+@todo (1.5) Make software engine draw lines & polys etc. with aa
+@todo (1.5) Add radial gradients to gradient objects
+@todo (1.5) Add Symbian Engine
+@todo (1.6) Add PalmOS Engine
+@todo (1.6) Add Apple OpenGL Engine
+@todo (1.7) Document engine API and other internals
+@todo (1.7) Allow any object to clip any other object, and not just rectangles
+@todo (1.8) Add more evas demos
+@todo (1.9) Write the error mechanism in evas_xcb_buffer.c
+@todo (1.9) Rewrite the render xcb engine
+@todo (1.10) Improve Win32 Direct3D Engine
+
+*/
diff --git a/doc/foot.html b/doc/foot.html
new file mode 100644 (file)
index 0000000..78ef911
--- /dev/null
@@ -0,0 +1,19 @@
+ <div id="push"></div>
+ </div> <!-- #content -->
+  </div> <!-- .layout -->
+ </div> <!-- #container -->
+  <div id="footer">
+    <table><tr>
+      <td class="poweredby"><img src="doxygen.png"></td>
+      <td class="copyright">Copyright &copy;$year Enlightenment</td>
+      <td class="generated">Docs generated $datetime</td>
+    </tr></table>
+  </div>
+
+
+</body>
+</html>
diff --git a/doc/head.html b/doc/head.html
new file mode 100644 (file)
index 0000000..48032d9
--- /dev/null
@@ -0,0 +1,66 @@
+<html>
+<head>
+    <title>$title</title>
+    <meta http-equiv="content-type" content="text/html;charset=UTF-8">
+    <meta name="author" content="Andres Blanc" >
+    
+    <link rel="icon" href="img/favicon.png" type="image/x-icon">
+    <link rel="shortcut icon" href="img/favicon.png" type="image/x-icon">
+    <link rel="icon" href="img/favicon.png" type="image/ico">
+    <link rel="shortcut icon" href="img/favicon.png" type="image/ico">
+
+    <link rel="stylesheet" type="text/css" media="screen" href="e.css">
+    <link rel="stylesheet" type="text/css" media="screen" href="edoxy.css">
+</head>
+
+<body>
+
+<div id="container">
+
+<div id="header">
+<div class="layout">
+    
+    <h1><span>Enlightenment</span></h1>
+    <h2><span>Beauty at your fingertips</span></h2>
+
+    <div class="menu-container">
+        <div class="menu">
+            <ul>
+               <li class="current"><a href="http://web.enlightenment.org/p.php?p=docs">Docs</a></li>
+                <li><a href="http://trac.enlightenment.org/e">Tracker</a></li>
+                <li><a href="http://www.enlightenment.org/p.php?p=contact">Contact</a></li>
+                <li><a href="http://www.enlightenment.org/p.php?p=contribute">Contribute</a></li>
+                <li><a href="http://www.enlightenment.org/p.php?p=support">Support</a></li>
+                <li><a href="http://www.enlightenment.org/p.php?p=download">Download</a></li>
+                <li><a href="http://www.enlightenment.org/p.php?p=about">About</a></li>
+                <li><a href="http://www.enlightenment.org/p.php?p=news">News</a></li>
+                <li><a href="http://www.enlightenment.org/">Home</a></li>
+            </ul>
+        </div>
+    </div>
+
+    <div class="doxytitle">
+        $projectname Documentation <small>at $date</small>
+    </div>
+
+    <div class="menu-container">
+        <div class="submenu">
+            <ul class="current">
+                <li><a href="todo.html">Todo</a></li>
+                <li><a href="files.html">Files</a></li>
+                <li><a href="annotated.html">Data Structures</a></li>
+                <li><a href="globals.html">Globals</a></li>
+                <li><a href="modules.html">Modules</a></li>
+                <li><a href="pages.html">Related Pages</a></li>
+               <li class="current"><a href="index.html">Main Page</a></li>
+            </ul>
+        </div>
+    </div>
+
+
+    <div class="clear"></div>
+</div>
+</div>
+
+<div id="content">
+<div class="layout">
diff --git a/doc/img/_.gif b/doc/img/_.gif
new file mode 100644 (file)
index 0000000..60fa7a1
Binary files /dev/null and b/doc/img/_.gif differ
diff --git a/doc/img/b.png b/doc/img/b.png
new file mode 100644 (file)
index 0000000..6fbfc2b
Binary files /dev/null and b/doc/img/b.png differ
diff --git a/doc/img/e.png b/doc/img/e.png
new file mode 100755 (executable)
index 0000000..b3884a5
Binary files /dev/null and b/doc/img/e.png differ
diff --git a/doc/img/e_big.png b/doc/img/e_big.png
new file mode 100755 (executable)
index 0000000..d42aeb4
Binary files /dev/null and b/doc/img/e_big.png differ
diff --git a/doc/img/evas.eps b/doc/img/evas.eps
new file mode 100644 (file)
index 0000000..dccb8e9
--- /dev/null
@@ -0,0 +1,149 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: evas.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 3c
+%%CreationDate: Wed Oct 23 16:18:00 2002
+%%For: raster@dugong.fluffyspider.com.au (The Rasterman)
+%%BoundingBox: 0 0 404 396
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+newpath 0 396 moveto 0 0 lineto 404 0 lineto 404 396 lineto closepath clip newpath
+-8.0 450.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+       /endangle exch def
+       /startangle exch def
+       /yrad exch def
+       /xrad exch def
+       /y exch def
+       /x exch def
+       /savematrix mtrx currentmatrix def
+       x y tr xrad yrad sc 0 0 1 startangle endangle arc
+       closepath
+       savematrix setmatrix
+       } def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+%%Page: 1 1
+10 setmiterlimit
+ 0.06000 0.06000 sc
+%
+% Fig objects follow
+%
+% Ellipse
+n 3450 4200 3300 3300 0 360 DrawEllipse gs 0.00 setgray ef gr 
+% Ellipse
+n 3825 4200 3000 3000 0 360 DrawEllipse gs col7 1.00 shd ef gr 
+% Ellipse
+n 1725 4200 600 600 0 360 DrawEllipse gs 0.00 setgray ef gr 
+% Ellipse
+n 6238 4200 600 600 0 360 DrawEllipse gs 0.00 setgray ef gr 
+% Rotated Ellipse
+gs
+3225 4200 tr
+-90.000 rot
+n 0 0 600 600 0 360 DrawEllipse 90.000 rot
+gs 0.00 setgray ef gr gr
+
+% Rotated Ellipse
+gs
+4725 4200 tr
+-270.001 rot
+n 0 0 600 600 0 360 DrawEllipse 270.001 rot
+gs 0.00 setgray ef gr gr
+
+% Rotated Ellipse
+gs
+3225 4132 tr
+-90.000 rot
+n 0 0 545 545 0 360 DrawEllipse 90.000 rot
+gs col7 1.00 shd ef gr gr
+
+% Rotated Ellipse
+gs
+4725 4268 tr
+-270.001 rot
+n 0 0 545 545 0 360 DrawEllipse 270.001 rot
+gs col7 1.00 shd ef gr gr
+
+% Arc
+n 6306.0 4200.0 545.0 180.0 0.0 arc
+6306.0 4200.0 l 5761.0 4200.0 l gs col7 1.00 shd ef gr 
+% Arc
+n 6170.0 4200.0 545.0 180.0 0.0 arcn
+6170.0 4200.0 l 5625.0 4200.0 l gs col7 1.00 shd ef gr 
+$F2psEnd
+rs
diff --git a/doc/img/evas.fig b/doc/img/evas.fig
new file mode 100644 (file)
index 0000000..a585901
--- /dev/null
@@ -0,0 +1,25 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter  
+500.00
+Single
+-2
+1200 2
+6 150 900 6825 7500
+1 4 0 0 0 0 48 0 20 0.000 1 0.0000 1725 4200 600 600 1125 4200 2325 4200
+1 4 0 0 0 0 50 0 20 0.000 1 0.0000 3450 4200 3300 3300 150 4200 6750 4200
+1 4 0 0 0 7 49 0 20 0.000 1 0.0000 3825 4200 3000 3000 825 4200 6825 4200
+-6
+6 5625 3600 6900 4800
+6 5625 3600 6900 4800
+5 2 0 0 0 7 30 0 20 0.000 0 0 0 0 6306.000 4200.000 5761 4200 6306 3655 6851 4200
+5 2 0 0 0 7 30 0 20 0.000 0 1 0 0 6170.000 4200.000 5625 4200 6170 4745 6715 4200
+-6
+1 4 0 0 0 0 40 0 20 0.000 1 0.0000 6238 4200 600 600 5638 4200 6838 4200
+-6
+1 4 0 0 0 0 40 0 20 0.000 1 1.5708 3225 4200 600 600 3225 4800 3225 3600
+1 4 0 0 0 7 39 0 20 0.000 1 1.5708 3225 4132 545 545 3225 4677 3225 3587
+1 4 0 0 0 0 40 0 20 0.000 1 4.7124 4725 4200 600 600 4725 3600 4725 4800
+1 4 0 0 0 7 39 0 20 0.000 1 4.7124 4725 4268 545 545 4725 3723 4725 4813
diff --git a/doc/img/evas.png b/doc/img/evas.png
new file mode 100644 (file)
index 0000000..47597a8
Binary files /dev/null and b/doc/img/evas.png differ
diff --git a/doc/img/evas.xcf b/doc/img/evas.xcf
new file mode 100644 (file)
index 0000000..2fdf355
Binary files /dev/null and b/doc/img/evas.xcf differ
diff --git a/doc/img/evas_big.eps b/doc/img/evas_big.eps
new file mode 100644 (file)
index 0000000..97535e4
--- /dev/null
@@ -0,0 +1,45178 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.11 by Peter Kirchgessner
+%%Title: /home/raster/C/ecore/doc/img/ecore_big.eps
+%%CreationDate: Fri Feb 21 15:39:04 2003
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 0 0 171 171
+%%EndComments
+%%BeginPreview: 255 256 1 256
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000001000080000000000000000000000000
+% 0000000000000000000000000000000001400100000000000000000000000000
+% 0000000000000000000000000000020002400240000000000000000000000000
+% 0000000000000000000000000000010005500150000000000000000000000000
+% 0000000000000000000000000000028002900520000000000000000000000000
+% 0000000000000000000000000000014005240a48010000000000000000000000
+% 000000000000000000000000000002500aa80aa4024000000000000000000000
+% 000000000000000000000000000001480a492848048000000000000000000000
+% 000000000000000000000000000005542aaa2a944a2000000000000000000000
+% 0000000000000000000000000100054895525520894800000000000000000000
+% 00000000000000000000000000a005552a94aa55142000000000000000000000
+% 0000000000000000000000000140054a2aa55488294800000000000000000000
+% 00000000000000000000000000a80aa8d5555525525400000000000000000000
+% 00000000000000000000000001542aaaaaaaaaa9548092000000000000000000
+% 00000000000000000000000001520aaaaa955492a52a05000000000000000000
+% 0000000000000000000000000155555555555525524849000000000000000000
+% 00000000000000000000000001541552aaaaaaaaa92294800000000000000000
+% 0000000000000000000000400155aaabffdd552aa49452a00000000000000000
+% 00000000000000000000000001552af5556feaaaaaa54a400000000000000000
+% 00000000000000000000005002aaaf5affd57d55491524980000000000000000
+% 0000000000000000000000280aaab555557bd6d55254a9500000000000000000
+% 00000000000000000000001602aaaaaabdad7d754aaa85200000000000000000
+% 00000000000000000000002952adaab6d56ad7dea952a8824000000000000000
+% 000000000000000000000015456b56aaab5b5d75452a25540000000000000000
+% 00000000000000000000002a8adcaad5b56aabdfdaa549009000000000000000
+% 00000000000000000000002aa563555aadad6ab5655494aa0200000000000000
+% 00000000000000000000002aadad6aab6ab5ad6fdaaa4924a000000000000000
+% 00000000000000000000002ab2aaad6d56d6b5aaba9492520800000000000000
+% 00000000000000000000002aad5555aadaaad557eca92554a100000000000000
+% 0000000000000000000400aab2aad55555b556aabaaa48aa8800000000000000
+% 00000000000000000000002b6d555ab6db56aad56fa92b552200000000000000
+% 00000000000000000002825552aaab55556adaaaaa9244aa4800000000000000
+% 00000000000000000000a02dad55aaadb6ad55555fd493555000000000000000
+% 00000000000000000002a4ab5555556aaad5ab55556a4aaa8480000000000000
+% 00000000000000000000aa2caaaaadadb6b6b55555aa936aa800000000000000
+% 0000000000000000000155d75555557b6d5556aaaaf525550000000000000000
+% 000000000000000000015528aaaabfdfdbedaaaaaaae936aa800000000000000
+% 00000000000000000000ab6f5555ea5576bab555556aaaaa8100000000000000
+% 00000000000000000000acd155555adfddef5555555b45552800000000000000
+% 00000000000000000002ab2eaaafd5a9775ad55554ad76d48000000000000000
+% 00000000000000000000ad52aabaab56ddf7f5555292aaaa5000000000000000
+% 00000000000000000004b555556ead6ab75d5aaaaaadaaa90000000000000000
+% 00000000000000000001555555b155b6ddf7f6aa95555554a000000000000000
+% 00000000000000001408755556eebaaaaaad5f555492aaa20000000000000000
+% 000000000000000009129aaaab515555557bf5aaaaab55548000000000000000
+% 0000000000000000056aaaaaadaeaaab6aaeaf555294aaa10000000000000000
+% 0000000000000000055555555b52aaad5555faf4aa52aa941000000000000000
+% 000000000000000002aaaaaad4ad55555555afaa9548aaa10000000000000000
+% 000000000000000001552aab6aaaaaaaaaaafafaa928554a0000000000000000
+% 00000000000000000156d556aaaaaaaaaaaaadad25402a900000000000000000
+% 00000000000000000155555555555555555556d6aa482aa48000000000000000
+% 000000000000000000aaaaaad555555555555b5a928015280000000000000000
+% 000000000000000004aaaaad9555555555552aab540015420000000000000000
+% 0000000000000000006aaab66aaaaaaaaaaaa75521000aa84000000000000000
+% 000000000000000005555555555555555554aaaac80005520000000000000000
+% 0000000000000000006aaad555555555554a955540000aa48000000000000000
+% 00000000000000000915555aaaaaaaaaaaa952aaa00005520000000000000000
+% 0000000000000000005555aaaaaaaaaaaa9528aaa00002489000000000000000
+% 000000000000000005555555555555555554a57aa00012aa2000000000000000
+% 0000000000000000002aab555555555554aa880d500042554000000000000000
+% 0000000000000000095555555552aaaaaa912036a80201548000000000000000
+% 000000000000000000555555554a55554954000d501000952800000000000000
+% 000000000000000002aaaaaaaaaaaaa92a420017284000554100000000000000
+% 0000000000000000005555555554952552900004d40000952800000000000000
+% 000000000000000005aaaaaaaa8952aa4920000ba8000052a200000000000000
+% 000000000000000000aaad555552554954400005540000954800000000000000
+% 000000000000000000aaaaaaaa8494aa42800002d200004aa480000000000000
+% 0000000000000000035555555528a510942a0002aa00002aa900000000000000
+% 0000000000000000015555555480094400000004ea0000495200000000000000
+% 0000000000000000015555555554922800000001540000255440000000000000
+% 000000000000000002aaaaaaa4aa0000000000015400004aa900000000000000
+% 000000000000000002aaaaaa95494400000000027500002aaa48000000000000
+% 000000000000000002aad55554aa5020000000005a0000456a80000000000000
+% 000000000000000005552aaaaa928a8900000000a90000125420000000000000
+% 00000000000000000552d55524aa5250000000015a0000256a80000000000000
+% 0000000000000000054aa924aa912484400000002d00000aaaa8000000000000
+% 0000000000000000052aa55549254929000000013a000024b500000000000000
+% 000000000000000005555aaaaa489540080000002500000aad50000000000000
+% 00000000000000000aaaaa5492a52914000000013c000022b544000000000000
+% 00000000000000000aaaaaa2aa925241000000005500000a6d28000000000000
+% 00000000000000000aaaab552a554a9400000000950000255aa0000000000000
+% 000000000000000015555554b554a921000000002c000009754a000000000000
+% 00000000000000000aaaaaa97d529244000000012a0000252ea0000000000000
+% 00000000000000002aaab5452f4aa510000000002d0000095aaa000000000000
+% 00000000000000000aa556a8fbd52880000000002a0000255d50000000000000
+% 0000000000000000252aaa856ef4852400000000b400000936a5000000000000
+% 00000000000000001aa56a28ddbd280000000000ac0000255b50000000000000
+% 00000000000000005255ad457bef4aa0000000005400000956aa400000000000
+% 0000000000000000154aa8926f7bd10a000000002c0000253d50800000000000
+% 00000000000000002a52b524dadef450000000002a000012abaa000000000000
+% 00000000000000005495a89277b5bd00000000003400004a7ea8800000000000
+% 000000000000000012a55249dd6fef040000000004000012ab52000000000000
+% 0000000000000000552ab524b7dabbd0000000000000004abed4800000000000
+% 000000000000000014a9a092ed6feef000000000000000126b52000000000000
+% 000000000000000092a55524b55abbbc000000000000004abea8800000000000
+% 000000000000000035556249d6ab6eef0000000000000092b5d5000000000000
+% 000000000000000044958892aab5bbbbc0000000000000253f54200000000000
+% 00000000000000009552aa48b5556eeef000000000000094b5a9400000000000
+% 00000000000000000aaaa125555555bbbc0000000000004afed4000000000000
+% 0000000000000000a9254a90aaaaad6eef0000000000012555aa800000000000
+% 00000000000000000aaa944a544556dbdbc0000000000094ff54000000000000
+% 0000000000000000aaa952a4a91255b6bef000000000012ab5a9400000000000
+% 00000000000000000a4a49125249555df7bc000000000252ff6a000000000000
+% 0000000000000000aaa924a948922aab5def000000000095d5a9200000000000
+% 00000000000000000a92aa9252008556f77bc00000000554ff54400000000000
+% 0000000000000000a52a49254892295aaddef00000000125aad5000000000000
+% 000000000000000014a49254920044a5bb77be0000000a55ff54400000000000
+% 00000000000000008a92aa924400092aaeddeb80000002ab6ad5000000000000
+% 0000000000000000255492495000809555b77f4000001491ff54400000000000
+% 00000000000000004a4a495524000a22aaeddbf000000557aad2800000000000
+% 80000000000000009551552490800049555b76de00002aab7f54000000000000
+% 0000000000000000052a4a9552000004aad6dff700001257ead5000000000000
+% 80000000000000005549245244000091155bb55de0004aa6df50400000000000
+% 00000000000000000aaa92aaa80000024aaaefff7800155ff5aa800000000000
+% 8000000000000000a54929492100000011555aabde00952dbea8000000000000
+% 00000000000000000aaa452aaa000004a4ab6ffef780355feb55000000000000
+% 8000000000000000254928a494000000024aaaabbde128bb7d50400000000000
+% 000000000000000009524a955200000008955b7eef786937d6aa000000000000
+% 800000000000000052c952524a0000000122aad5bbdf104efda4800000000000
+% 00000000000000000554894aa900000000092abbeef6d0abaaa8000000000000
+% 000000000000000012a92aaa552000000444a2aebbbfe012fea5000000000000
+% 800000000000000024b252494a80000000110155d6eda02baaa8000000000000
+% 800000000000000002a9255552400000000200aabdbbc011fb52000000000000
+% 000000000000000014aa949295400000000000256bef000aad44000000000000
+% 800000000000000001592aaa54a0000000020014aebb00057550000000000000
+% 0000000000000000155651254a9000000008200a95d600026d49000000000000
+% 800000000000000000ad4aaaa954000000008015557c00055aa0000000000000
+% 00000000000000000a569494952a00000054000495a80000aa88000000000000
+% 8000000000000000015552aaaaa4800001010002aaaf50013551000000000000
+% 000000000000000008aba525249540000454240252b1ea004a80000000000000
+% 8000000000000000022d54a955525000910080009552b5402aa8000000000000
+% 000000000000000000abd295292a8aa524aa0000a4a2afe81500000000000000
+% 800000000000000004556952a549524892009200554152be0aa8000000000000
+% 00000000000000000112b52a54aa552a495400019200ab6bc500000000000000
+% 800000000000000000554aa54a9292a5240148056a0152dd5150000000000000
+% 00000000000000000220aa54a955544892aa008aaa00a555aa02000000000000
+% 8000000000000000008a5392952492aa4840a215d4004ab6aad0000000000000
+% 00000000000000000029285552aaaa9292950856a00029555504000000000000
+% 80000000000000000084956a4a4924a449204156a0004aaaaa50000000000000
+% 000000000000000000292a955555552aa44a955aa80012aaaa80000000000000
+% 800000000000000000024554a924929112900576aa00292aaa54800000000000
+% 000000000000000000549a954aaaaa4a49255ad4158005555540000000000000
+% 800000000000000000012a55a92524a95248ab541520148aaa94000000000000
+% 00000000000000000014d552aaa8aa9224935da0165402a95549000000000000
+% 80000000000000000022b4955a4a924a922cb54014880a455522200000000000
+% 0000000000000000002aad24a7a95528a555f500192501155554400000000000
+% 80000000000000000045a95296d692a52afd8a08125442a2aaa9000000000000
+% 0000000000000000002d6c8a51fd6a556b5552204a92814a5552400000000000
+% 80000000000000000055aa52aa57b7db5daaa58004aa2892aaa9100000000000
+% 000000000000000000aab52552bd6aaaaa5506a109294254aaaa420000000000
+% 8000000000000000005b5496cb47dd6b555055500a952892aaa9100000000000
+% 000000000000000001aaad25527577aaa92505240455422aaaaa400000000000
+% 80000000000000000155684d490b2d6d54885494054a54925555290000000000
+% 0000000000000000005b5d35a4aa5bb542e28249225549255552400000000000
+% 80000000000000000002a8aa9295445295142927849552555554920000000000
+% 000000000000000000295955492a2aa924a904aac2a54aa4aaaa440000000000
+% 8000000000000000000552aaa4aaa4aa49545247a11554955551100000000000
+% 00000000000000000052b9556955495492a90492f2aaaaaaaaa4a08000000000
+% 8000000000000000000552ada255255525244257a8455555554a040000000000
+% 000000000000000000aaaab568aa92aa4955148afd5555555524a00000000000
+% 800000000000000000055555e355495492aa82a3544aaaaaaa91080000000000
+% 00000000000000000052b555a95525552512a916ea92aaaaaa4a200000000000
+% 8000000000000000008aaaabe2aa92aa48abc2535d5555555490000000000000
+% 00000000000000000012aaab6aaaa55592a5648ad549555aaa44800000000000
+% 80000000000000000084aaafc555c954a529c92555b6aaab5490080000000000
+% 00000000000000000029577aeaabc54bc49572536aaad5b55221000000000000
+% 80000000000000000082aad7aaab55559253d12555555aaaaa84000000000000
+% 00000000000000000014556d4aabc52b454ab49556aaab555420000000000000
+% 800000000000000000214ab7d55754abe893d922aab6d55aa940000000000000
+% 00000000000000000084955a9557e556c52aaa4aaaaaaaaaa408000000000000
+% 800000000000000000012aadeaaed54da947752aaaaab55552a0000000000000
+% 000000000000000000124ab7555dea57f22dac92aad6d6aa9400000000000000
+% 8000000000000000000012aadf5ba556b4956b65555aaaaa4940000000000000
+% 000000000000000000024955b5f7692fe2a75aaaaaab55555208000000000000
+% 8000000000000000000012aadeaeeaad5915ab5555556aa88440000000000000
+% 0000000000000000000084ab55fbd24ffa4b756aaadaaaa52880000000000000
+% 80000000000000000000292ab6aeff5aafa6ad56d556d5524200000000000000
+% 00000000000000000000025555fbabf7faddd5aaadaaaa889010000000000000
+% 80000000000000000000088aad56feaeaf76b6b5555b55520480000000000000
+% 00000000000000000000212955bbabfbfadb5ad6daaaaa24a000000000000000
+% 800000000000000000000245556d7eaeafb6eb5b555555480000000000000000
+% 0000000000000000000000125557d5fbfadb5ab56aaaaa410400000000000000
+% 8000000000000000000004a4955abb56adb6d6d6ad5554941000000000000000
+% 0000000000000000000000012aaad6fdf76dbb6db55552200000000000000000
+% 80000000000000000000004a49555b575adb6aaaaaaaa9400000000000000000
+% 00000000000000000000000092ab6aedb76dadb6d55524088000000000000000
+% 800000000000000000000009255556b6dadb7555555249400000000000000000
+% 000000000000000000000020089555556db6ab6daaa492100000000000000000
+% 8000000000000000000000009252aadbaaaad555551244400000000000000000
+% 0000000000000000000000000125555555b6ad5554a490800000000000000000
+% 800000000000000000000000244895555aaab555524904000000000000000000
+% 000000000000000000000000011252aaaaaaaaaaaa9020800000000000000000
+% 80000000000000000000000004448a5555555555442244000000000000000000
+% 000000000000000000000000001124aaaaaaaa49294000000000000000000000
+% 8000000000000000000000000104491252aaa492440800000000000000000000
+% 0000000000000000000000000020024924952924912080000000000000000000
+% 8000000000000000000000000001289249224489240000000000000000000000
+% 0000000000000000000000000004022492492922008000000000000000000000
+% 8000000000000000000000000000008924924208540000000000000000000000
+% 0000000000000000000000000000121000249441000000000000000000000000
+% 8000000000000000000000000000002249010008000000000000000000000000
+% 0000000000000000000000000000000000482200240000000000000000000000
+% 8000000000000000000000000000004001024020000000000000000000000000
+% 0000000000000000000000000000000220000000000000000000000000000000
+% 8000000000000000000000000000000000080000000000000000000000000000
+% 0000000000000000000000000000000000004000000000000000000000000000
+% 8000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 8000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 8000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 8000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+%%EndPreview
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+0.000028 0.000028 translate
+% Translate to begin of first scanline
+0.000000 170.078740 translate
+170.078740 -170.078740 scale
+% Image geometry
+1720 1720 8
+% Transformation matrix
+[ 1720 0 0 1720 0 0 ]
+% Strings to hold RGB-samples per scanline
+/rstr 1720 string def
+/gstr 1720 string def
+/bstr 1720 string def
+{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop}
+true 3
+%%BeginData:      3234763 ASCII Bytes
+colorimage
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~>
+JcC<$JcC<$JcC<$JcF=$jo0i2JcC<$JcC<$OT0h~>
+JcC<$JcC<$JcC<$JcF=$jo0i2JcC<$JcC<$OT0h~>
+JcC<$JcC<$JcC<$JcF=$jo0i2JcC<$JcC<$OT0h~>
+JcC<$JcC<$JcC<$JcFX-d/JUrJcC<$JcC<$SH"*~>
+JcC<$JcC<$JcC<$JcFX-d/JUrJcC<$JcC<$SH"*~>
+JcC<$JcC<$JcC<$JcFX-d/JUrJcC<$JcC<$SH"*~>
+JcC<$JcC<$JcC<$JcFg2a8UYiJcC<$JcC<$T`9N~>
+JcC<$JcC<$JcC<$JcFg2a8UYiJcC<$JcC<$T`9N~>
+JcC<$JcC<$JcC<$JcFg2a8UYiJcC<$JcC<$T`9N~>
+JcC<$JcC<$JcC<$JcFs6^]&faJcC<$JcC<$V#Pr~>
+JcC<$JcC<$JcC<$JcFs6^]&faJcC<$JcC<$V#Pr~>
+JcC<$JcC<$JcC<$JcFs6^]&faJcC<$JcC<$V#Pr~>
+JcC<$JcC<$JcC<$JcG'9]DdB]JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcG'9]DdB]JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcG'9]DdB]JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcG3=[/PXVJcC<$JcC<$W;hA~>
+JcC<$JcC<$JcC<$JcG3=[/PXVJcC<$JcC<$W;hA~>
+JcC<$JcC<$JcC<$JcG3=[/PXVJcC<$JcC<$W;hA~>
+JcC<$JcC<$JcC<$JcG<@Y5X"PJcC<$JcC<$X8d\~>
+JcC<$JcC<$JcC<$JcG<@Y5X"PJcC<$JcC<$X8d\~>
+JcC<$JcC<$JcC<$JcG<@Y5X"PJcC<$JcC<$X8d\~>
+JcC<$JcC<$JcC<$JcG?AW;_AJJcC<$JcC<$YlB4~>
+JcC<$JcC<$JcC<$JcG?AW;_AJJcC<$JcC<$YlB4~>
+JcC<$JcC<$JcC<$JcG?AW;_AJJcC<$JcC<$YlB4~>
+JcC<$JcC<$JcC<$JcGHDU],iEJcC<$JcC<$ZN#F~>
+JcC<$JcC<$JcC<$JcGHDU],iEJcC<$JcC<$ZN#F~>
+JcC<$JcC<$JcC<$JcGHDU],iEJcC<$JcC<$ZN#F~>
+JcC<$JcC<$JcC<$JcGNFT)QJ(qu20HJcC<$JcC<$rr7K~>
+JcC<$JcC<$JcC<$JcGNFT)QJ(qu20HJcC<$JcC<$rr7K~>
+JcC<$JcC<$JcC<$JcGNFT)QJ(qu20HJcC<$JcC<$rr7K~>
+JcC<$JcC<$JcC<$JcGTHRJt_9ec(."JcC<$JcCl4J,~>
+JcC<$JcC<$JcC<$JcGTHRJt_9ec(."JcC<$JcCl4J,~>
+JcC<$JcC<$JcC<$JcGTHRJt_9ec(."JcC<$JcCl4J,~>
+JcC<$JcC<$JcC<$JcG]KeGeq8dJhu%bPm(mJcC<$JcD&9J,~>
+JcC<$JcC<$JcC<$JcG]KeGeq8dJhu%bPm(mJcC<$JcD&9J,~>
+JcC<$JcC<$JcC<$JcG]KeGeq8dJhu%bPm(mJcC<$JcD&9J,~>
+JcC<$JcC<$JcC<$JcFF&hYkq&m/O]sJcC<$JcC<$Sc=3~>
+JcC<$JcC<$JcC<$JcFF&hYkq&m/O]sJcC<$JcC<$Sc=3~>
+JcC<$JcC<$JcC<$JcFF&hYkq&m/O]sJcC<$JcC<$Sc=3~>
+JcC<$JcC<$JcC<$K)aX*eG[hpr;Wr!JcC<$JcC<$U&TW~>
+JcC<$JcC<$JcC<$K)aX*eG[hpr;Wr!JcC<$JcC<$U&TW~>
+JcC<$JcC<$JcC<$K)aX*eG[hpr;Wr!JcC<$JcC<$U&TW~>
+JcC<$JcC<$JcC<$L&^$/bPd"krVhBJJcC<$JcDJEJ,~>
+JcC<$JcC<$JcC<$L&^$/bPd"krVhBJJcC<$JcDJEJ,~>
+JcC<$JcC<$JcC<$L&^$/bPd"krVhBJJcC<$JcDJEJ,~>
+JcC<$JcC<$JcC<$aT(c/df82'm/?DNm/;M7rVhBJJcC<$JcDSHJ,~>
+JcC<$JcC<$JcC<$aT(c/df82'm/?DNm/;M7rVhBJJcC<$JcDSHJ,~>
+JcC<$JcC<$JcC<$aT(c/df82'm/?DNm/;M7rVhBJJcC<$JcDSHJ,~>
+JcC<$JcC<$JcC<$dJq_qm/Pi>nbq;Anbn%<s8ITLJcC<$JcDYJJ,~>
+JcC<$JcC<$JcC<$dJq_qm/Pi>nbq;Anbn%<s8ITLJcC<$JcDYJJ,~>
+JcC<$JcC<$JcC<$dJq_qm/Pi>nbq;Anbn%<s8ITLJcC<$JcDYJJ,~>
+JcC<$JcC<$JcC<$f`.38oDR2:o)4.=!<.QLJcC<$JcDbMJ,~>
+JcC<$JcC<$JcC<$f`.38oDR2:o)4.=!<.QLJcC<$JcDbMJ,~>
+JcC<$JcC<$JcC<$f`.38oDR2:o)4.=!<.QLJcC<$JcDbMJ,~>
+JcC<$JcC<$JcC<$h>`Z;o_n+Rq"sCToDO7>!<.QLJcC<$JcDkPJ,~>
+JcC<$JcC<$JcC<$h>`Z;o_n+Rq"sCToDO7>!<.QLJcC<$JcDkPJ,~>
+JcC<$JcC<$JcC<$h>`Z;o_n+Rq"sCToDO7>!<.QLJcC<$JcDkPJ,~>
+JcC<$JcC<$JcC<$i;\u>p&4IZj88BEo_j@?JcC<$JcC<$YQ'+~>
+JcC<$JcC<$JcC<$i;\u>p&4IZj88BEo_j@?JcC<$JcC<$YQ'+~>
+JcC<$JcC<$JcC<$i;\u>p&4IZj88BEo_j@?JcC<$JcC<$YQ'+~>
+JcC<$JcC<$JcC<$jo:GAp&4O\fDG4<oDQQ*nbpr9JcC<$JcC<$Z2]=~>
+JcC<$JcC<$JcC<$jo:GAp&4O\fDG4<oDQQ*nbpr9JcC<$JcC<$Z2]=~>
+JcC<$JcC<$JcC<$jo:GAp&4O\fDG4<oDQQ*nbpr9JcC<$JcC<$Z2]=~>
+JcC<$JcC<$JcC<$kl6bDpAO^_bkq)2o_m)7i;MC/JcC<$JcC<$ZN#F~>
+JcC<$JcC<$JcC<$kl6bDpAO^_bkq)2o_m)7i;MC/JcC<$JcC<$ZN#F~>
+JcC<$JcC<$JcC<$kl6bDpAO^_bkq)2o_m)7i;MC/JcC<$JcC<$ZN#F~>
+JcC<$JcC<$JcC<$l2QqGp&4X_`r#H,o_mD@eG\5&JcC<$JcC<$[Jta~>
+JcC<$JcC<$JcC<$l2QqGp&4X_`r#H,o_mD@eG\5&JcC<$JcC<$[Jta~>
+JcC<$JcC<$JcC<$l2QqGp&4X_`r#H,o_mD@eG\5&JcC<$JcC<$[Jta~>
+JcC<$JcC<$JcC<$li3.Ip&4X__>Es(o)7YK`r4ipJcC<$JcC<$\,Us~>
+JcC<$JcC<$JcC<$li3.Ip&4X__>Es(o)7YK`r4ipJcC<$JcC<$\,Us~>
+JcC<$JcC<$JcC<$li3.Ip&4X__>Es(o)7YK`r4ipJcC<$JcC<$\,Us~>
+JcC<$JcC<$JcC<$mJi@KpAOa`l20fCkkk,PnGVeSjSeTGli#iBJcC<$JcC<$\c70~>
+JcC<$JcC<$JcC<$mJi@KpAOa`l20fCkkk,PnGVeSjSeTGli#iBJcC<$JcC<$\c70~>
+JcC<$JcC<$JcC<$mJi@KpAOa`l20fCkkk,PnGVeSjSeTGli#iBJcC<$JcC<$\c70~>
+JcC<$JcC<$JcC<$n,JXOp&4[`m/,W8m/-PTbPgAsnGVGIJcC<$JcC<$])R9~>
+JcC<$JcC<$JcC<$n,JXOp&4[`m/,W8m/-PTbPgAsnGVGIJcC<$JcC<$])R9~>
+JcC<$JcC<$JcC<$n,JXOp&4[`m/,W8m/-PTbPgAsnGVGIJcC<$JcC<$])R9~>
+JcC<$JcC<$JcC<$nc+mRp&4X_n,)\PnbMbPmec\Tg&9=roDReMJcC<$JcC<$]`3K~>
+JcC<$JcC<$JcC<$nc+mRp&4X_n,)\PnbMbPmec\Tg&9=roDReMJcC<$JcC<$]`3K~>
+JcC<$JcC<$JcC<$nc+mRp&4X_n,)\PnbMbPmec\Tg&9=roDReMJcC<$JcC<$]`3K~>
+JcC<$JcC<$JcC<$oDdGAi;Md:nbr7\n,)kUi;**CmecYSjSd-so_mtPJcC<$JcC<$^&NT~>
+JcC<$JcC<$JcC<$oDdGAi;Md:nbr7\n,)kUi;**CmecYSjSd-so_mtPJcC<$JcC<$^&NT~>
+JcC<$JcC<$JcC<$oDdGAi;Md:nbr7\n,)kUi;**CmecYSjSd-so_mtPJcC<$JcC<$^&NT~>
+JcC<$JcC<$JcC<$p&EhHd/ES8meunXnb`(Wo(i"SnbMtVn,)VPp&4+PiVW3DpAO1RJcC<$JcC<$
+^]/f~>
+JcC<$JcC<$JcC<$p&EhHd/ES8meunXnb`(Wo(i"SnbMtVn,)VPp&4+PiVW3DpAO1RJcC<$JcC<$
+^]/f~>
+JcC<$JcC<$JcC<$p&EhHd/ES8meunXnb`(Wo(i"SnbMtVn,)VPp&4+PiVW3DpAO1RJcC<$JcC<$
+^]/f~>
+JcC<$JcC<$JcC<$pAa%LY5S+m!W/qhqt^*_q;_8Dq>'mUqpkVoqt9m\rTO63s+13$s+13ds*t~>
+JcC<$JcC<$JcC<$pAa%LY5S+m!W.oKqt^*_q;_8Dq>'mUqpkVoqt9m\rTO63s+13$s+13ds*t~>
+JcC<$JcC<$JcC<$pAa%LY5S+m!W,siqt^*_q;_8Dq>'mUqpkVoqt9m\rTO63s+13$s+13ds*t~>
+JcC<$JcC<$JcC<$pAa+NYl4:nrVQW.p\Xg`q"`S;q"aa^mebr?bPV#2p\j@UJcC<$JcC<$_>f#~>
+JcC<$JcC<$JcC<$pAa+NYl4:nrVQVWp\Xg`q"`S;q"aa^mebr?bPV#2p\j@UJcC<$JcC<$_>f#~>
+JcC<$JcC<$JcC<$pAa+NYl4:nrVQUrp\Xg`q"`S;q"aa^mebr?bPV#2p\j@UJcC<$JcC<$_>f#~>
+JcC<$JcC<$JcC<$q#BCRmeu2Dir/NIqYU9*qtp6dq>&D4q>'j_lhg/K^AI[&p\j@UJcC<$JcC<$
+`;b>~>
+JcC<$JcC<$JcC<$q#BCRmeu2Dir/NIqYU8Sqtp6dq>&D4q>'j_lhg/K^AI[&p\j@UJcC<$JcC<$
+`;b>~>
+JcC<$JcC<$JcC<$q#BCRmeu2Dir/NIqYU7nqtp6dq>&D4q>'j_lhg/K^AI[&p\j@UJcC<$JcC<$
+`;b>~>
+JcC<$JcC<$JcC<$qu>dWnboflp\OrjrOr7.qYL'ameH8FmJ-MQqYHKSq#'pclMcA7JcC<$JcE^h
+J,~>
+JcC<$JcC<$JcC<$qu>dWnboflp\OrLrK7-WqYL'ameH8FmJ-MQqYHKSq#'pclMcA7JcC<$JcE^h
+J,~>
+JcC<$JcC<$JcC<$qu>dWnboflp\OqkrE'$rqYL'ameH8FmJ-MQqYHKSq#'pclMcA7JcC<$JcE^h
+J,~>
+JcC<$JcC<$JcC<$rVu!YoDPrlp%ncj]`#P@qYU*XpuD,<q"jg_qSi?sqW[nPr;$<Vrdk*#s+13$
+s2P(h~>
+JcC<$JcC<$JcC<$rVu!YoDPrlp%n`Jr/pmQqt]aVj7i'<qYC!a`V\rsl218Rq>KUXJcC<$JcC<$
+`rCP~>
+JcC<$JcC<$JcC<$rVu!YoDPrlp&"Vfqtg3cnG)&<nG)kUqYJ2.lMBcBq#'sdlMcA7JcC<$JcEai
+J,~>
+JcC<$JcC<$JcC<$rr;-[o_n1Tm/,T9nG<9g]Y+6W!P\F,q=OIVpZhJHp[\+Uq>'m9qq:i6qt^0c
+rTjH6s+13$s+13js*t~>
+JcC<$JcC<$JcC<$rr;-[o_n1Tm/,T9nG<6FOSk4@qYL$[q"OOJp@n=Pq"jg^qU>>pqX47Vr;$<W
+rdk*#s+13$s2Y.i~>
+JcC<$JcC<$JcC<$rr;-[o_n1Tm/,T9nG<5h<r?#!qYL$[q"OOJp@n=Pq"jg^qU>>pqX47Vr;$<W
+rdk*#s+13$s2Y.i~>
+JcC<$JcC<$JcC<$!<;6]pAOU\e,/\5lMCVYXT#m3]`>eFq=OIXpYY]?p[e1Vq>'m]qZ+\"qsXCM
+q=FIPqt^0crTsN7s+13$s+13ks*t~>
+JcC<$JcC<$JcC<$!<;6]pAOU\e,/\5lMCYZN0*q!rV?*\q=ie?q=jLUqYBs`p\OrUkPO`En+lSO
+nGE%Zq>K[ZJcC<$JcC<$aT$b~>
+JcC<$JcC<$JcC<$!<;6]pAOU\e,/\5lMCYZ=]YE$rV?*\q=ie?q=jLUqYBs`p\OqmkPO`En+lSO
+nGE%Zq>K[ZJcC<$JcC<$aT$b~>
+JcC<$JcC<$JcC<$kl1;Sp&(lfrqcYrrOi0Ds1\1$qY0aXl1OfEqY0XWqYBj]rVQW8n,)YOhtd!B
+nb`1\q>K[ZJcC<$JcC<$b5Zt~>
+JcC<$JcC<$JcC<$kl1;Sp&(lfrqcYRs,d,?p%\CXp\*kEp\+IXo_A:YpA4abs-<'MnbV/=pA4=V
+qY^0fm/DS9JcC<$JcEmmJ,~>
+JcC<$JcC<$JcC<$kl1;Sp&(lfrqcXt!EW>!=7u@bp\4CGp%S1Vp[n7Wq=a[`qu9deqsjO?q=a[T
+qtg6drTsN7s+13$s+13ms*t~>
+JcC<$JcC<$JcC?%l2LDTpACugqtg>nrOi-Cs1\=(qtKs\g\(F:qY0XWq>'g^!3?+>kPFZCoD%nP
+q>0[Zqu$9gli)J8JcC<$JcEsoJ,~>
+JcC<$JcC<$JcC?%l2LDTpACugqtg>OrfI#>q=sj]qY&\:qY'd[o_A7Xq"auOrfu[Cn+lSMo(i+X
+o)&=^q>KXYJcC<$JcC<$bl<1~>
+JcC<$JcC<$JcC?%l2LDTpACugqtg=qpfI:dqtKs\g\(F:qY0XWq>'g^!*T;'kPFZCoD%nPq>0[Z
+qu$9gli)J8JcC<$JcEsoJ,~>
+JcC<$JcC<$JcCE'l2LGUp\_)hq>1-es/H(2rOi0DrkA@+r:g']de3M2qtKaXq"aja!36%<!6=U*
+o(h2<p\FX]o_\L_qYf^YJcC<$JcC<$ci8L~>
+JcC<$JcC<$JcCE'l2LGUp\_)hq>1-es,-l<rfI#>rV6<bqY&A1qtBp]o_A4Wr;$DSrKZmKo(h2<
+p\FX]o_\L_qYf^YJcC<$JcC<$ci8L~>
+JcC<$JcC<$JcCE'l2LGUp\_)hq>1-es&o2"!a&N*rV6<bqY&A1qtBp]o_A4Wr;$CrrE/Rco(h2<
+p\FX]o_\L_qYf^YJcC<$JcC<$ci8L~>
+JcC<$JcC<$JcCH(l2LJVq#'"G!;b(>q"jpas/Q+2rk/-AqtL$^nb)2>o(DnRqtKaXp\=lja2e.u
+q"jOVeG/k8qYKj]qY^3gl2H86JcC<$JcF0uJ,~>
+JcC<$JcC<$JcCH(l2LJVq#'"G!;b(>q"jpas,?u=rfI#>qtL$^nb)2>o(DnRqtKaXp\=fMqj$sQ
+nbL]0q>'m`o_\L_qYf[XJcC<$JcC<$df4g~>
+JcC<$JcC<$JcCH(l2LJVq#'"G!;b(>q"jpas'#5"!a&N*qtL$^nb)2>o(DnRqtKaXp\=emqcNXi
+nbL]0q>'m`o_\L_qYf[XJcC<$JcC<$df4g~>
+JcC<$JcC<$JcCK)lMgVXq#'ITh"p=5pA4U\ri5t0rk/3C!kuABqtB^Up[n"Ip@S%NqtBp]o(`1Z
+!ij;]r5S:&aS>W-qtfs^qu$<hk5Kr3JcC<$JcF=$J,~>
+JcC<$JcC<$JcCK)lMgVXq#'ITh"p=5pA4U\rf$i;rK.#@!g8]?qtB^Up[n"Ip@S%NqtBp]o(`1Z
+!0?uAnbL9$qYC$bo_\O`qYfRUJcC<$JcC<$f)L7~>
+JcC<$JcC<$JcCK)lMgVXq#'ITh"p=5pA4U\r`],!r`B2&p\X[Wp%S+KoChhLp&"I[p[\+Xq#FUp
+=Rl4.q"jg`qXj[^r;-BSrdk*#s+13$s474#~>
+JcC<$JcC<$JcCN*li-\Xq>B[X\GH$srqQJmr4;sAqRun%p@\:Siq*$=p@\=VqtK[Vs/Q(=rPn[/
+j7r$9meH\Tqtg!_qu$9gir4N/JcC<$JcFR+J,~>
+JcC<$JcC<$JcCN*li-\Xq>B[X\GH$srqQJOr/^i=r/q!Pp@\:Siq*$=p@\=VqtK[Vs,[#Aq>'(G
+mJ$&Dqt^-cp&"Xaq>K=PJcC<$JcC<$h>`!~>
+JcC<$JcC<$JcCN*li-\Xq>B[X\GH$srqQIrpfIGs!*B0np@\:Siq*$=p@\=VqtK[Vs&f>'qcN[i
+j7r$9meH\Tqtg!_qu$9gir4N/JcC<$JcFR+J,~>
+JcC<$JcC<$JcCW-lMgVXq>BaZo_RSCjne`IqY:&i!5/6A!5/0Aq"=OVqX`n@q=FLUp@\=VqtKgZ
+s/Q+>!QN1Y`o[!Op[\+Vq>C*_qtg6erS@I(s+13$s+141s*t~>
+JcC<$JcC<$JcCW-lMgVXq>BaZo_RSCjne`IqY:&K!0I,>rfI)@!0[-Mqt0aVkOSH?qt0UTqtBp]
+pA"ZKs-3SKr0?C=h=pL8qt^0dpA=^aqYf7LJcC<$JcC<$j8XW~>
+JcC<$JcC<$JcCW-lMgVXq>BaZo_RSCjne`IqY:%n!*K%ur)iaeqt0aVkOSH?qt0UTqtBp]pA"Yj
+r`B#"jnR[+o(`+Xr;--aqY^3gh>W!*JcC<$JcFd1J,~>
+JcC<$JcC<$JcCZ.lMgVXqY]m\p\N84q>0[Xq"XfeqRZa?qRuh"r:KmXh"(@6qt0XUqtBm\qtU/j
+s2Y/Zs2FuWmJ->Jkk=cFp%\F[r;--aqu$9gg\ud(JcC<$JcFp5J,~>
+JcC<$JcC<$JcCZ.lMgVXqY]m\p\N84q>0[Xq"XfGs,d,=s,d2A!0[9Qr:KmXh"(@6qt0XUqtBm\
+qtU/Os-<PIrfumGo_7SCp\4@Uqt^0dpA=abq>K(IJcC<$JcC<$kPp&~>
+JcC<$JcC<$JcCZ.lMgVXqY]m\p\N84q>0[Xq"Xejs&f(ur)imir:KmXh"(@6qt0XUqtBm\qtU.n
+qcEc!mJ->Jkk=cFp%\F[r;--aqu$9gg\ud(JcC<$JcFp5J,~>
+JcC<$JcC<$JcCZ.m/HhZqY]s^q"jXYk4ms3o(W3`rhoS(s1J6Br:KmXnac;AnacSKr:KaVqtBgZ
+s/Q%<s2P&Ws2Od-p%S"Mp@\%NqY0^Yr;$9epA=abq>JtFJcC<$JcC<$m/MS~>
+JcC<$JcC<$JcCZ.m/HhZqY]s^q"jXYk4ms3o(`0A!g/S+qi:`=rK7,Cr:KmXnac;AnacSKr:KaV
+qtBgZs,d2Er075HpA"=Tnb2\LoCi%TpA"R]r;--aqu$9gf`$I%JcC<$JcG*:J,~>
+JcC<$JcC<$JcCZ.m/HhZqY]s^q"jXYk4ms3o(`/dr`K"uqcNdgqt'@KoC;AAqt'aXp\"FWq"Oel
+pfIJtpA"=Tnb2\LoCi%TpA"R]r;--aqu$9gf`$I%JcC<$JcG*:J,~>
+JcC<$JcC<$JcC]/li-bZqY^!_q>0j]eG/b5m.gVTrMTJ'rk/-A!;-3\p%%26o^_qOr:KaVqY'm^
+ri5q;s2OuU!64R'p%IJ>q"FUZpA"R]r;--aqu$<hbl31nJcC<$JcGQGJ,~>
+JcC<$JcC<$JcC]/li-bZqY^!_q>0j]eG/b5m.gVTrJLc@Ocbb&NrY:?OoLREo_e=Ro&T?5o)/+W
+o_8%TpAOabOStI@PQ7!=p\"7@p%\7Xp\+C[q>C*_qtp<frQP7ls+13$s+14Gs*t~>
+JcC<$JcC<$JcC]/li-bZqY^!_q>0j]eG/b5m.gVTr)s#$qH*Pr!;-3\p%%26o^_qOr:KaVqY'm^
+r`]"s!*Jdcp%IJ>q"FUZpA"R]r;--aqu$<hbl31nJcC<$JcGQGJ,~>
+JcC<$JcC<$JcCc1li-bZqY^!_qYL$`ZhXIms/,dnpq-O<qn<%$p[\1Nkj\H=p@A.Qr:K^UqXsui
+WiH!;s2OrTq=jRUfCf"6qtKj[rV?BfpA=abq>J;3JcC<$JcCB&J,~>
+JcC<$JcC<$JcCc1li-bZqY^!_qYL$`ZhXImr/CZ=s,d;Cqi:`=rfR2Cs7?!UqXNe=qXO:Mr:BjY
+p@\:U!frG)r0@)Bq=jRUfCf"6qtKj[rV?BfpA=abq>J;3JcC<$JcCB&J,~>
+JcC<$JcC<$JcCc1li-bZqY^!_qYL$`ZhXImqH<f"qcEVrs7?!UqXNe=qXO:Mr:BjYp@\:U"'Jf2
+=S5bkp\"73p%nCZp\4I]q>C*_qtp<erPebes+13$s+C?%~>
+JcC<$JcC<$JcCi3li-bZqY^$`qYL'aZhXCks7ZAes18'=rOi!?qss[TqXEe=q=+=Pp[\7Rr:K[T
+!;?Ajr5\fVqo/:&kOnWBmIgAMr:g!]rV?Bfp\Xgbq>J#+JcC<$JcC`0J,~>
+JcC<$JcC<$JcCi3li-bZqY^$`qYL'aZhXCks7ZAKrK72DOSb(=OT(C@P5FhJnbVb?n+lJNnb;VP
+oDJ7Ro`4^aO8P:<PkOh6p%\1Hp&"I\p\=O^q>C*`qtg6drOr2]s+13$s,I&/~>
+JcC<$JcC<$JcCi3li-bZqY^$`qYL'aZhXCks7Z=lr`T8'qcESqqss[TqXEe=q=+=Pp[\7Rr:K[T
+!;?@o!*Jkpp@d\Bq"3tHqtBs^q"Xg`r;-0bqY^0f^&ET_JcC<$NW4M~>
+JcC<$JcC<$JcCu7l2LMWqu$9e"0''4qtp6dq<n%>pZ;2Fp\X[^V>e(&]DT>=]`@X$nbhn5n,)VP
+nbD\QoDJ7Tp&1lea8a0V`;mpBp#>W9p&+O]p\=O^q>C*`qtp<drOVuZs+13$s-!D4~>
+JcC<$JcC<$JcCu7l2LMWqu$9e",r?=qtp6dq<n%>pZ;2Fp\X[^MYrV<Oc]L%rf@,Br/q'Nr:0^S
+hXC@2r:0RQr:BjYp\"KGqj$uA!0ugAiq2m9r:^'_q"Xg`r;-0bqu$6f])I9\JcC<$P5g%~>
+JcC<$JcC<$JcCu7l2LMWqu$9e"'AY%qtp6dq<n%>pZ;2Fp\X[]<rcA%=oVV%=85kto)/%UnD<X2
+nGMhOo)/+Wo_8%W=oVUr=6]D;o^qhSpAF[[q#1$dqY0mar:p6%rdk*#s+135s*t~>
+JcC<$JcC<$JcD,;k5P5Uqu$3c!iWlKr;-<do(]rnq=aj]s.oUir4;^9rk/-A!:g!VoC)5;oC)VH
+r:0RQr:BjYr:U#fq8`NTqo&QTnFcJHmIU)Ep@\@WrV-*^rV?Bfp\Xjcq#.i(JcC<$JcCr6J,~>
+JcC<$JcC<$JcD,;k5P5Uqu$3c!fW5&r;-<do(]rnq=aj]qhbB9r/q&BqiC`<!0R2B!:g!VoC)5;
+oC)VHr:0RQr:BjYr:U#Lrfm>Gq31lEnFcJHmIU)Ep@\@WrV-*^rV?Bfp\Xjcq#.i(JcC<$JcCr6
+J,~>
+JcC<$JcC<$JcD,;k5P5Uqu$3cs&]8&r;-<do(]rnq=aj]q,[Pur`K5'qcEPp!:g!VoC)5;oC)VH
+r:0RQr:BjYr:U"kn5o,Pp%7YCp[n1Pr:^*`q"Xg`r;-0bqu$6f]DdB]JcC<$PQ-.~>
+JcC<$JcC<$JcD8?jSnuRqu$0b!3#n3!P\F.q=OIVpYPW2p\4CXp&(TdV7HK7qn)g>qn3"!p[@nF
+o^2GAp@%qKrUKXQr:BgXs/>ssrPnoXrl>&YqS`HSq=XLSo(2VHp%/%Pp\"LYrV-*^rV?Egp\Xgb
+q#.f'JcC<$JcD&9J,~>
+JcC<$JcC<$JcD8?jSnuRqu$0b!0$o=!K[*Tq=OIVpYPW2p\4CXp%sXHOo1@BOo1:=OSb1@nFuDH
+me#oAme6,InGVnOo)/+Vo`'sOO8Y=AQ2$RDQ21+Io^_VJo(DVNo_8%WpAOa\q#1$eqY0m`r:p6%
+rdk*#s+139s*t~>
+JcC<$JcC<$JcD8?jSnuRqu$0br`B5'=Shsko_A1ThY-@2p\+IVqc=#)='&L+=]nl)=8,esnFuDH
+me#oAme6,InGVnOo)/+Vo`&%n=moGfp%S+LoCqhKoD8+Rp&4U_p\=O^q>L0aqtg6crOVuZs+13$
+s-E\8~>
+JcC<$JcC<$JcDGDi;WTOqu$0bs7u_nrk8EJ^Ads%q"a[Vp@.b2p@\+UV#Rt+]"@mOr4Dp?qn;mq
+r9j:Gq<[hBqsO7JrUBaTq""=R!;-8gs/>q:s2Y#Vqo/TTp[n4OiUZj:qt0[VrV$3aqY:!arVH9c
+qY^*d\c.0[JcC<$Rf@m~>
+JcC<$JcC<$JcDGDi;WTOqu$0bs7u_SrK%#?rqZ9_q=jOTnFbW2p%A3>rK7&A!0I,>rK%#Ar0$sG
+r9j:Gq<[hBqsO7JrUBaTq""=R!;-2Lr07/Fq3:oEp[n4OiUZj:qt0[VrV$3aqY:!arVH9cqY^*d
+\c.0[JcC<$Rf@m~>
+JcC<$JcC<$JcDGDi;WTOqu$0bs8)[r!EWD&q=aUZp[n1Kp"f?7p%h_p=BAR+=BSd/r)`VpqsXIN
+p?h\Bp?hbFq!\1Nr:0RQqssg[r)iAgp[n4OiUZj:qt0[VrV$3aqY:!arVH9cqY^*d\c.0[JcC<$
+Rf@m~>
+JcC<$JcC<$JcDVIh>[6Kqu$0brqcYmr4_n"qtKmZeb/h5m.CGPUnmpbrji$?rOVs>rOi!?!:TmS
+qX*G3qsF=Lq!\1NrUKUP!V</cV?"U2`WF-!`r!aT`W5Z)o@<F/oDJ7Vp&4U`p\FU_q>C*`qtg6`
+rOVuZs+13$s.01?~>
+JcC<$JcC<$JcDVIh>[6Kqu$0brqcYRrfI/@pA"OZq"E82qtBCL!;-,Fr/h,FOcklhrK$o=s,m5B
+!:TmSqX*G3qsF=Lq!\1NrUKUP!;$2Lrf6o@rK[/Bs-3TVp@Hi*qt'aXq=X^[rqH6`rV?Bfp\Xgb
+p&2K$JcC<$JcD;@J,~>
+JcC<$JcC<$JcDVIh>[6Kqu$0brqcInpA"OZq"E82qtBCL!;-%f!*K5%"'A]/=T)=p=9.ggmeZ>5
+m/-2JmeH8LnGVnNnc8:\=9D].=B=ik!;-!VeaiV/r:KgXrV$6bq=spar;-0bqY^$b])I9\JcC<$
+Sc=3~>
+JcC<$JcC<$JcDbMgA^sIqu$0brV?TkVl0F+qtU'_qY%Glr:L#br2'D'!4r0Ar4;m>rOi!?r9`5)
+r9aINq="7NrUK^S!iDfjrh]_7`VIOL`W!mWoBc&5nauDMoDS=Wp&4U`p\FU_q>L0`qtg6^rO`&[
+s+13$s.KCB~>
+JcC<$JcC<$JcDbMgA^sIqu$0brV?TkN/[atrf?sOqtKs\\FodlqMP<7qiLrCOc]O&rK.#@rK@*G
+g?eb)rU0LMr:'[Tq=4THN/[aqqiq&Eq3:lDs7>UJlLFN;r:BmZq=X^[rqH6`rV?EgpA=^aoDQ<#
+JcC<$JcDDCJ,~>
+JcC<$JcC<$JcDbMgA^sIqu$0brV?Niq,mOhqtKs\\FodlqH*\t!EWD&<s2W.=BJW'=8Q)"=8c8!
+mFpq)mJZJKn,2\RnbM_U=o;D%<pj&hoBc&5nauDMoDS=Wp&4U`p\FU_q>L0`qtg6^rO`&[s+13$
+s.KCB~>
+JcC<$JcC<$JcE"Tec,FDqY^*br;-Hhs/5_-rqQEcqtB@Kp@R,4q=O[Xrh]Ogrj`$?rk&$<!5&6C
+q7ZOhkNhj.rU'ROq!\1Nr:0dWrMBUlVZ+L6`VIOI`UiZonaQ&Cnb2PPoDS=Xp&4U`p\FU_q>L0`
+qtU*ZrP/>_s+13$s.]OD~>
+JcC<$JcC<$JcE"Tec,FDqY^*br;-Hhs,?r=rK$sQr:g*^lh0uDg\(C7rq$,Hr/(E7r/h&DOc]R'
+rK-u?rK?pAkNhj.rU'ROq!\1Nr:0dWqi(K<!gT"7r0@)Brg!*Gp@7YAq!n(KrU^![qXsg\rqH6`
+rV?EgpA=X_nbp6%JcC<$JcDJEJ,~>
+JcC<$JcC<$JcE"Tec,FDqY^*br;-Hhs&f;&r)isnr:g*^lh0uDg\(C7rq$+jqc3c"=BPQ(#?Y,2
+=B8I(=8Z2#=8c7qm-!^.m/?>MmeH8LnGMhUo)Dhl=oVV(<W?+f=7c"VnaQ&Cnb2PPoDS=Xp&4U`
+p\FU_q>L0`qtU*ZrP/>_s+13$s.]OD~>
+JcC<$JcC<$JcE=]c2RS<qu$3cr;-Bfs/5\,r:g-_oC^f/p%A"Mqt'iaqP=)#!4r0AqRQ[=rk/'?
+rTsFIl0A-2q!@tHrU0LMr:'[TqkaG6`5MYoqo8<Jr:9XQp$hYCp@.tLq""CTrq-'[rV$6bq=spa
+rVH6bp\a=T`r:PhJcC<$V>l&~>
+JcC<$JcC<$JcE=]c2RS<qu$3cr;-Bfs,?o<rK$mNr:]aTg%=t1p%8.Qs,-Z0rK%&BOT(@DP*(k*
+O8Y1=Oo:IAm/-,5lMBiAm/?>MmeQ>LnGVnSMu].>Pl6mBPl?sGo(_bJnFc8DnGDbNo)81Zo_S7Z
+pAXg^q#1$eqY'g\r9F7#rdk*#s+13Hs*t~>
+JcC<$JcC<$JcE=]c2RS<qu$3cr;-Bfs&f2#r`K*mr:]aTg%=t1p%8.Qs&\tr!`rK+r`9>,=]ed,
+<``B#=T;J$=T.U`lfm^2lhKiFmJZJKn,2\RnbuYi=TVW(<W6%f=8_Xanb)DEn+Q8JnbD\RoD\CY
+p&4U`p\FU_q>L0`qtL$RrPnhfs+13$s/#aG~>
+JcC<$JcC<$JcELbbPq>9qu$0brVHHf!r/[krP&<Frk8C,r:]gVq"3Y=lLalCr:9c^s.o[kr42d<
+qmud=!5/*?rp0IHl08*1r9O.ErU'ROq!\4OqPO50rl+fToYp^tp[I53qsaORq==LUrq-'[rq?<b
+qY:$br;--apAEhHdf+gtJcC<$VuM8~>
+JcC<$JcC<$JcELbbPq>9qu$0brVHHf!r._5rK-r<!;HEbp%A+PjR_[/q"+FSr/1N2s,-Z7r/h&B
+O,s7$qiUl@rp0IHl08*1r9O.ErU'ROq!\4OqMb-4s-<DErK[9Mp[I53qsaORq==LUrq-'[rq?<b
+qY:$br;--apAEhHdf+gtJcC<$VuM8~>
+JcC<$JcC<$JcELbbPq>9qu$0brVHHf!r,l"q,[T!p\aaXp%\1?oBPuCoDJ1W=8u>$=8l5%='/T(
+=8c8$<rQ2"=T)>#=T7X`lKRR1lMTuCm/?>MmeH8MnG68b<W?+g=8VO^nDj!7nGMhPo)81Zo_S7[
+pAOa^q#1$dqY'g[r87J$rdk*#s+13Js*t~>
+JcC<$JcC<$JcEai`r>f4qY^*br;-BfrqQJjrkA<D!l"C%p@\:Sp%.bFht-R4q5".g\@DLJ!4r0A
+rji0C]"7mQ!5/*?rp&A)r9F7Hq<\(IrU0ILqPO2/rl+oWo#:IpeaNG*rUK^Srq$*\qt9s^rV-0`
+rV?Bfp&"F[gAT_(JcC<$JcD_LJ,~>
+JcC<$JcC<$JcEai`r>f4qY^*br;-BfrqQJOrfI#<s7Z0ZqXjIPo((]0p@A$:!/^N5rfR2As,[,?
+qiUl@rp&A)r9F7Hq<\(IrU0ILqMaa)rg!?LeaNG*rUK^Srq$*\qt9s^rV-0`rV?Bfp&"F[gAT_(
+JcC<$JcD_LJ,~>
+JcC<$JcC<$JcEai`r>f4qY^*br;-BfrqQIppfILhp@\:Sp%.bFht-R4q,dJp!`rK+r`B&#r`9&#
+r`K,#s&]8&rp&A)r9F7Hq<\(IrU0ILqH3Vps&SVjqXE&(r:'[Tq==OVrUg![rq?<bqY:$br;-*`
+p&*PBg&?R&JcC<$WW.J~>
+JcC<$JcC<$JcEso_Z'?/qu$3cr;-Bfr:p8hrkA3AqXsaXqX_Dk!:ff[!kGhNrODp>rO`!=rjr0C
+pq?LflKIs+rTa@Iq<\(IrU0XQrMTUkqo&HP!64TKnF,Q.p@%qKrpfjUrq$*\qt9s^rqH6`rV?Bf
+o_\.Uh>Q..JcC<$JcDeNJ,~>
+JcC<$JcC<$JcEso_Z'?/qu$3cr;-Bfr:p8MrfI#<s,QsKqt0aV^%)0npPSa-rfR2A!0@)?q2t]?
+q<@2.p?DP@rTj:GrU'ROrU9Q@o996?qNUrDnF,Q.p@%qKrpfjUrq$*\qt9s^rqH6`rV?Bfo_\.U
+h>Q..JcC<$JcDeNJ,~>
+JcC<$JcC<$JcEso_Z'?/qu$3cr;-Bfr:p7np/h+`qt0aV^%)0np/h5o!*B/%r`B)$"'8K'<rQ2#
+=Su5$=BG=_lKIs+rTa@Iq<\(IrU0XQq,mJns&SVjnF,Q.p@%qKrpfjUrq$*\qt9s^rqH6`rV?Bf
+o_\.Uh>Q..JcC<$JcDeNJ,~>
+JcC<$JcC<$JcF*s_#F--qY^*brVHHfqtU/f!kl=^pq?\"r:KmX^%2'j!2]Xir1j;&s1&$<!4r-@
+r4;m>!5/*?!9sFFki_j,q<@kCrTj:GrU'ROqPOA4_u%C>`VT&tmcs39me?2LnGVnSo)A7[o_S7[
+pAXg_q#'scqXXOIr8dh7rdk*#s+13Os*t~>
+JcC<$JcC<$JcF*s_#F--qY^*brVHHfqtU/L!frG)qiC`:rq63]qt%MlqsjE;p5o<:q2kE7s,mBH
+r93A-qrmk?rTa@Iq<\(IrU0N@!LB#CPl?sFPl6mDn+Z88mJ?8Fn,DhTnb_nVoD\CYp&=[ap\O[_
+q>C*[qrmt=rS[[+s+13$s/c6N~>
+JcC<$JcC<$JcF*s_#F--qY^*brVHHfqtT_`rq63]qt%MlqsaYfpf@Dsr`0##r`K/$r`B8(<E3*!
+<rc@u<rhL_kih4,kkXKAlM^&Em/?>MmeU#d='#2us&SSiqX=1HlL"H9p[A+NrUKdUrq$-]qXsj]
+rqH9ar;$9eo)%YKjSe$9JcC<$JcDhOJ,~>
+JcC<$JcC<$JcF7"^Adp+qY^*br;-BfqY:#cs1SHHpq?\!r:BLMj72R.p[S1NpS7_us1&$<!4r-@
+r4;p?s1J3A!PZ8FkNM(*kPaW?l2BoGlhToHmJa!\VZ=[6_u7OH`W!gR`VT#tmHX'7mJQDJn,DhU
+nb_nVoD\CZp&4U`p\O[_q>C*Yqqq><rSmg-s+13$s0)HQ~>
+JcC<$JcC<$JcF7"^Adp+qY^*br;-BfqY:#Js,[2AqiC`:rq--[o((i2mdg,Br:'H;oT0'8qN1K7
+s-!<CkiVd*rTO(ArTa@Iq<\+Jrep]5!g]+:oT]9=rfm>GqX4.GlKnB7r9jCLrp]pWqssaXrq-*\
+rV$6bqY:!ar;,p[hu)j>ir4N/JcC<$YQ'+~>
+JcC<$JcC<$JcF7"^Adp+qY^*br;-BfqY1%kr`/Slrq--[o((i2mdg,Br:'G]r`K/#!*B/%r`B)$
+"'8K&<rQ/#=Sl/#=BGF`kiVd*rTO(ArTa@Iq<\+Jr`B#"!`rE'qc3YsmoTARq!IA5qX+4Kq="=P
+rpfmVrq$-]qt9p]rqH9ar;$9enGD,@m/>rCJcC<$JcDqRJ,~>
+JcC<$JcC<$JcF=$^]*s*qY^*brVHKgq=jsarM9LioY(4pp%%kIm-s3.q!e:Op7qVtrj_p;!4r-@
+r4;p?rk/'?o]H#3o&fl5rTO+BrTa@Iqs=<YqkjD3r58NPqSi9Kr5JR#g[+k*rU0ONrUBgVqssdY
+rq-*\rq?<bqY:!ar;,aVi;E'Bj8OW0JcC<$Z2]=~>
+JcC<$JcC<$JcF=$^]*s*qY^*brVHKgq=jsarJU`7plGB6rU]^Qp[RV>kOJ?:rpTQ;l]Ck'!0[!:
+qW7;1r9+%BqW[tDrTj@Is,-Z2s-EYLop#?=s-3GHqsE/)r9aINqX=CPrpfmVs7?6^qt9s^rV-0`
+r;$9elhfW<n,;;GJcC<$JcE"TJ,~>
+JcC<$JcC<$JcF=$^]*s*qY^*brVHKgq=k$c<E9$!oN2"_p%%kIm-s3.q!e:Op/_/p!*B/#!*B/%
+r`B)$"'8K&<qTPdk5+31k5=E@kkaQBlM^&Gm/L,]=8u=u<W?,"<rc@o<rc:umG%"*mJZJLn,;bT
+nb_nWoD\CZp&=[`p\O[_q>C*Tqr%D@rT!m.s+13$s0;TS~>
+JcC<$JcC<$JcFC&_>a-+q>C!ar;-BfqY:'a!2]Xirk/<Er4W-Crk8'sqsj=Jp$^i.p[A$TqkF,$
+!P#]>\G`r<])B5A]"@sQ!5&3Bq7ZgjpuV;3puV84rTF1Dq<@kCrTjLMs.oLf!lMspqSN<Oqo/?K
+r5J6nmHaE2rU'UPqX=FQrpfpWrq$-]qt9s^rqH6`r;$6dj87s9oDRbLJcC<$JcE%UJ,~>
+JcC<$JcC<$JcFC&_>a-+q>C!ar;-BfqY:'a!0$l7rf7&>r/^c9p[\4Oo^MPBi:-L0r/(<,s,[5A
+mZ@.)!g;^.puV;3puV84rTF1Dq<@kCrTjLMs,-Z2!gK":rg!2Aq3:rEr0?j>mHaE2rU'UPqX=FQ
+rpfpWrq$-]qt9s^rqH6`r;$6dj87s9oDRbLJcC<$JcE%UJ,~>
+JcC<$JcC<$JcFC&_>a-+q>C!ar;-BfqY:'ar)WDjp[\4Oo^MPBi:-L0p/_2q"]nf-<`W<#=T2D$
+=9DT(<EAcos5s+<puM53pZDG;roj1BrTa@Is6TbdqH!f"='&F'qc3Yss&T2&o2bomo'Gc0o^)PD
+rpKXOrp]pWr:9jYrq-*\rq??cq=sm`qtf@Mjo"`KjSj`1JcC<$ZN#F~>
+JcC<$JcC<$JcFI(_uB9+q>Bs`rVHKgqY:$`!;?>drOi3DrOr0Bs1S@$qsjOP_X@KmoqMGr!P#]=
+\Gj&=])K;F]">Pb]=\$Sq7Qdiq;h80q;hG7q<%Y=roj1BrTXCKpnS%h_o'F2q8<*Kq8E0Lr9X4E
+mcsW6q!@tHrpK[Prp]pWr:9jYrq-*\rq??cq=sm`qtetBmel_Uk5Kr3JcC<$Zi>O~>
+JcC<$JcC<$JcFI(_uB9+q>Bs`rVHKgqY:$`!VVHMMZ8_:NrY4=O8Ft8o)%tRnA=VomeVb;L]3A8
+O84k;O8"b/OT=M=jS%X0jSS'7k5FKBkkXKAl2^/FM?Jj%Pa7X7Q1gI6Q2L"DlgF'6lhKiFmJcPN
+n,DhUnbhtWoD\CZp&=[ap\FU^q>:$@qsOCSrT=*1s+13$s0M`U~>
+JcC<$JcC<$JcFI(_uB9+q>Bs`rVHKgqY:$`!;?=knlPb[qsjOP_X@Kmoi:un"]nf-<`W<"=T;J%
+=9DW)<`\lp!9O%;p>bu0qrRY9rTF1Dq<@kC!:0D\#$4f)='&F'qc3Ys!*B/%oiM/or9X4EmcsW6
+q!@tHrpK[Prp]pWr:9jYrq-*\rq??cq=sm`qtetBmel_Uk5Kr3JcC<$Zi>O~>
+JcC<$JcC<$JcFO*`r>K+q>Bs`r;-BfqY:'arq?8c!5/<Es1J?EqRch!r:0^S_XI?hoqMGrs0r'>
+rODj;s18-?s1/3Br4Mj=jl?:"rT3k;roa7Dq<7qFV>6qc_uI[O_uI[O`V[UN`Vo,slL4!6lMKoD
+m/?>NmelPQnG_tUo)A7[o_eC\pAXg^q"sm`qUPK6r:U$Mrdk*#s+13Ys*t~>
+JcC<$JcC<$JcFO*`r>K+q>Bs`r;-BfqY:'arq?8Irf.&@NfO+"qi1]:o)/%UnA=Yjmeqq:LAm;7
+O84n;O84n0OlbX$jSe39k5OQBkkXHClM-88PQ@&8rK[/Bns01>pZh53qWdtDqX"1JrpK^Qrp]pW
+r:9jYrq--]rV$6bq=sj_qYJb>o)/1Zjo0i2JcC<$[f:j~>
+JcC<$JcC<$JcFO*`r>K+q>Bs`r;-BfqY:'arq?@mr`9)#nlGh^r:0^S_XI?hoi:uns&T>*=&r@'
+r)iu#r`B5'<`\iojl?:"rT3k;roa7Dq<7nEpf@Dos&B/%=&rB"<W?,"=8uCp=8u>"lhB]5l2']B
+lh]uHmJcPOn,DhUnbhtWoD\C[p&4U`p\FU]q>0s<qss[XrT4$0s+13$s0hrX~>
+JcC<$JcC<$JcFU,c2R#,q#'j_r;-BfqY:'arUp6ar1j;)rk8?Erk80@!:g!Vp$^#jqsF'NrOMd7
+rji'?r4E!?!5&3Bpq?XdnDa-$rT*t>q<%\>rTO4Eq5++e!6"lSs2=lR!6"lSs2=`PrP\QOs6AG)
+r9F7HqX"4KrpK^Qrp]sXqssdYrq-*\rq?<bq=sj_q"iG9o_eF]kl-/5JcC<$\,Us~>
+JcC<$JcC<$JcFU,c2R#,q#'j_r;-BfqY:'arUp6ar/(H5r/Uc;qi1]:nbhnLn&b"pmIc54OT1C:
+O8t@<ORnV5j7)($j8J'<jn\'<kPaWCl1^&8Q2[$EQ2$U7Q2g.*l29iFlh]uImJcPOn,DhVnb_nW
+oD\CZp&=[`p\FU]q=sg7qt0g[rTO63s+13$s0r#Y~>
+JcC<$JcC<$JcFU,c2R#,q#'j_r;-BfqY:'arUp6ar)`o!nlGh]r:'CJamT&noi:rmr`B)"!*B)#
+!*B,$!`rE'oN2"OnDa-$rT*t>q<%\>rTO4EpK%8m!*/tuqc3Yss&]5&oN2&ns6AG)r9F7HqX"4K
+rpK^Qrp]sXqssdYrq-*\rq?<bq=sj_q"iG9o_eF]kl-/5JcC<$\,Us~>
+JcC<$JcC<$JcFX-e,JP/pAFU\rVHKgq=ss`rq??aqkO2(s1SBD!583@!5&!oq<m)+rU0:Er9X'M
+r42[6rji'?r4E!?!5&3Bpq?^emc"'&puD>6roNt<roa:Ep8%c-rPSZRrPJWRrkncSpr36NrPefT
+!6+]sm-+0-rTa@Iqs==Ls6fgRrp]pWr:9mZ!n6f6qt9s^rV-*^qYBj]eGJt;p\j=TJcC<$JcE7[
+J,~>
+JcC<$JcC<$JcFX-e,JP/pAFU\rVHKgq=ss`rq??as,$]1s,Ho9!0@#;s,@#=p[@qGh<k1/oBlJB
+oS3:*s,[2A!0R/?s,[&=o9'(4mc"'&puD>6roNt<roa:Ep5/j8rKR/Dplt`B!1*AEpZ_&.p?DP@
+rTj@IrpBaRr9sXSrpfpWs76;^o^r%Rrq?<bq"X^]pA3;9pAF[`kl-/5JcC<$\Gq'~>
+JcC<$JcC<$JcFX-e,JP/pAFU\rVHKgq=ss`rq??as&](unQ5JRq<m)+rU0:Er9X&Ur)ir"s&T/$
+r)`r#rE',&<`\ios5NJ*qr7D2rT*t>q<%\>roj&Vr`&ntrDreqs&T/$s&eqqr`8dXm-+0-rTa@I
+qs==Ls6fgRrp]pWr:9mZ!`\gaqt9s^rV-*^qYBj]eGJt;p\j=TJcC<$JcE7[J,~>
+JcC<$JcC<$JcF^/f`(%3o_e=XrVHHfqY:'arq?9_qkX5(s1S*<s1A3tr9j@IiU$I/md0nHpn@Vr
+q7-C6!4r*?!P5oA]_B,+i;;L2iqh^6jSn9:k5XW<V>nO5_u@UR_Z7XS_uI[L`W*mT`W!gOkj.F.
+kkXKBlM^&Hm/HDPmelPQnGi%VncJF3e,K":p&=[`p\4IYq="18qtBs_rTX<4s+13$s1//[~>
+JcC<$JcC<$JcF^/f`(%3o_e=XrVHHfqY:'arq?9_qhb<3ooB!1r9sROq!I&,qsEh<rJ(*$r/go=
+s,[5CqiLf<r/gN4m,7d"r8RS5rT*t>q<%_?p58m8rKR>I!1*SKr0.2HrfmDIrg*>Eq<7/-qWRb>
+rp'IJr9XFMs6fgRrp]sXr:0p\S=KTNqt9s^rV-']q>'LUh#$gCq#0IVJcC<$JcE:\J,~>
+JcC<$JcC<$JcF^/f`(%3o_e=XrVHHfqY:'arq?9_pf?odr9sROq!I&,qsEh<rDiVlr)io!s&K,$
+qcEi"rE')%<qBDZi;;L2iqh^6jSn9:k5XWA<WlE'<`N/u<<#tu<WQ9&qc3Yss&]5&oiM,nq<7/-
+qWRb>rp'IJr9XFMs6fgRrp]sXr:0p\<)ikhqt9s^rV-']q>'LUh#$gCq#0IVJcC<$JcE:\J,~>
+JcC<$JcC<$JcFa0h#?C5o)/.Wr;-BfqY:$`rq?9_rM9Ffpq-U=r4E0E]Xteer9jLM`U*QhqP*h[
+qmlO4rODp>qRc^=pV$@[s53A)r8IV6qW%S9rT4"?s.oCc!li3urPSWQrkncSs2+iTn\tIFqrd5+
+qrdqAqW\"Erp0LKrpBaRr9sXSs7-*Z"M3(2oCMtRqt9s^rV-$\p\F%LjSS`Mq#0IVJcC<$JcE@^
+J,~>
+JcC<$JcC<$JcFa0h#?C5o)/.Wr;-BfqY:$`rq?9_rJCN0r/LH2r/LXBr9_JirTj<7qM"g.rJpu@
+Oo1=>O8G%2Ondl7hsoY&iVhd4j8S-<jo+?AM>)o,Q2QsIPlR-JQ2[$JQ2d*IQ2HsEQ2Bb/k54??
+kkaQClMg,Im/HDPmelPQnGi%XncY;LSFc@Oo_\=\pAOaZq"OUJqW.PKr:p6Trdk*#s+13^s*t~>
+JcC<$JcC<$JcFa0h#?C5o)/.Wr;-BfqY:$`rq?9_r`/_onlPbWr9_JirTj;[qGd>or`B)"!*B&"
+!*B)#!*8\mpu)20n_j?(rSm\6roF%>rT=,[qc<VprD`ess&K/%<r5l"<``@)=S5bo<r;(Ek54??
+kkaQClMg,Im/HDPmelPQnGi%XncW2s<:f_\o_\=\pAOaZq"OUJqW.PKr:p6Trdk*#s+13^s*t~>
+JcC<$JcC<$JcFj3i;Vp<m/6GOr;-Bfq=ss`rq?6^!q`:ar1j#!!5&0Ark&3ArU'1Bjm2[-p$;SA
+!297`qk<ksq7-C6s18*>rk.s<s53J*q;:u*ro*h8qW%S9rT4'TpSIo0s2FoRs2=rTrknlU`5M2b
+rP[RTrTF.Cqs"+Frp0LKs6]jSr9s[Trp^!"rR:c;s7H0\rq?9ao_@tPl2'`Cq#'sdl2H86JcC<$
+^&NT~>
+JcC<$JcC<$JcFj3i;Vp<m/6GOr;-Bfq=ss`rq?6^!q_>+r.t3/pl>93rU'1Bjm2[-p$;SA!/:9(
+qh=m.rJpu@Oo1==O8"b3OoO>2hYH((i;V^6iqh^7jSe3?M>)o+Q2QsIPlR-JQ2[$JQ2d*IQ2?mE
+Q/:[%kPaWAl2KuIlhp,LmJlVPn,MnVnGnpSSGr-[o_S7[pAF[Wq!n1EqWn%Rr;$<Urdk*#s+13`
+s*t~>
+JcC<$JcC<$JcFj3i;Vp<m/6GOr;-Bfq=ss`rq?6^!;,nanlPeWo'GK(p[%S=rTXA^qGmDlqH3c!
+rDio"oiUcds53J*q;:u*ro*h8qW%S9rT4&Zqc<SorD`ess&K5'<E)rs<W?,"=8uCq=8c1Vk5FKA
+kkjWDlMg,Im/QJQmelPRnG_qX>l@Y$oDeIZp&=[_p[n7Nq<@bAqtU*brTX<4s+13$s1SG_~>
+JcC<$JcC<$JcFm4iVr3BlMU,Jr;-?eqY:'arq?6^rq-#]pq6X=rOi*@s17skq!7)-q!7V<r9<gH
+s1&'=!k>eOppg=6s18*>rk.s<n_O&urSRG/ro*h8qW%V:rhTFfrhKP7rl+uX`;IOQ`;daS_udip
+`::hF`;eu_jnIp9kPj]Bl2U&Jlhp,LmJlVPn,MkZ\[p8=rmCl=oCMtRqXsg\rV,mXlM9oFmJH_W
+q>KUXJcC<$JcEIaJ,~>
+JcC<$JcC<$JcFm4iVr3BlMU,Jr;-?eqY:'arq?6^rq-,Ere^K2q2Y?3p[%\@k3Da-p$2J>o7d+(
+!frG)rK$u@r/gf:n<!1rqVM2.q;D82rSm\6s5a09pkf';r0@8Gs-<VMr0@8Gs-<VKrg!;Fr0@<E
+kN2I#rTF1Dqs".Grp0LKs6]jSr9s[T!LB)MSHABRoD\CYp&4U_p[\+Eq="1Iqt^0crTaB5s+13$
+s1\M`~>
+JcC<$JcC<$JcFm4iVr3BlMU,Jr;-?eqY:'arq?6^rq-+hr`AttnlPSPq!7)-q!7V<r9<fPr)a#%
+=BPQ(s&T/$oiUcdn_O&urSRG/ro*h8qW%V:r`/\nr`/qss&K)"s&T8%<)iiss&T/$s&eqqrDrs\
+kN2I#rTF1Dqs".Grp0LKs6]jSr9s[Ts'5J$!qPsSrq-'[rV$3ao(_MGn+uGKq>C'elMcA7JcC<$
+^Ai]~>
+JcC<$JcC<$JcFs6ir8HGkksfEqtg9eq=ss`rq?6^rq$3^qkO1c!5&0A!5&6Crk&3CrO`*@!4i'p
+r9O.CjQZU-n*0D:rj_s<!P#]8\GWl;])B8>]_/u(h>H..htl:1iVhd7j85YNV>d7ja8O!Z`Pf^n
+_u@RS_u%CC`Vd[IjS\'3jS\-8k5OQCkks]ElMp2Jm/QJQmelMT\^T%*dK&k;oD\CYp&4U^pZqV>
+q=OOQqt^0crTjH6s+13$s1eSa~>
+JcC<$JcC<$JcFs6ir8HGkksfEqtg9eq=ss`rq?6^rq$9`Lku"ds+pH0qi:N4rTsIJq!-r)r9Eb8
+nqHt&!KW??O8k@?OSY%.OR(a#hYl@.i;V^6ir.p7M>E)0QMQmHPlI$KQMZsIPl?pJPl?sDQMd$@
+jS\'3jS\-8k5OQCkks]ElMp2Jm/QJQmelMRQMR-Po)A7[o_S7ZpAF[Nq!.\IqXFCXr;$<Wrdk*#
+s+13bs*t~>
+JcC<$JcC<$JcFs6ir8HGkksfEqtg9eq=ss`rq?6^rq$9`<`]0#pf?rerTsIJq!-r)r9Eb8nl5Kg
+!EWD%=8u;'='/R-pK6ufleVKqrSRJ0ro*h8rT!cTq,[Gos&Atts&T/$!`i9"r`/u!r`9)%p/h/m
+p#Q&2p>l/5q<%\>roj:Erp'OLr9XINs6fgR!*oA"!:p-\rq-'[rV$0`lhKc@o_S(Sq>C'eli)J8
+JcC<$^]/f~>
+JcC<$JcC<$JcG!7jSn`KlMTlCqtg6dq=ss`rq?6^rq-3]q4[l#rk&0B!kZ+XrOW'BrO`*@s1/-p
+qs);frTO9SoV)2ms1&0?\bEW4\H'5>]D]D8^$shOh>Q40htl:1iVhd0U][HhaN+4us2=lRrknfS
+qo&'Er5@^Wr8dh<qr[n@roj=Frp'OLrTsONs6fpUs1.sRs760\rq-'[r:^$^jS83>p\OFWqY^0f
+li)J8JcC<$_#Jo~>
+JcC<$JcC<$JcG!7jSn`KlMTlCqtg6dq=ss`rq?6^rq-3]re^Q/pPo*2q2PC>qs);frTNg+qN(`=
+OSk1>OoLLCO8b7<O7A>$h"TY'hYuF/i;V^6ir"W0M>rG5QMHgGPlI$KQMZsIPl$a@QMd$0j8A!:
+jnn3>kPj]Dl2KuJli$2LmJlVSn,J^LScA9[oD\CYp&+O\pZ2,<q=jaUqtg6drTjH6s+13$s1nYb~>
+JcC<$JcC<$JcG!7jSn`KlMTlCqtg6dq=ss`rq?6^rq-3]r`B&!!*Aqro2kqWqs);frTNfOqH*c"
+=T)>$<WH4n=RoP_h"TY'hYuF/i;V^6iq?CP<WQ9&r)E_rr`/u!s&T2#r`&nts&S\lr)Vq>r8dh<
+qr[n@roj=Frp'OLrTsONs6fpUs',:us760\rq-'[r:^$^jS83>p\OFWqY^0fli)J8JcC<$_#Jo~>
+JcC<$JcC<$JcG'9jo4lMmel)Aqtg6dq=sp_rq?6^s7H<^s76,_rLj8(])K>A]`5VD]_f>>])K8?
+lLX8hkksWAT`:_\T_c/#\[]2\ppg:5!4r-@rk.m:pY,Gtr7q,(rndV2qr%M5rh]Ccs.oe=a2e+t
+s2=lRrknfSr5A0Fr5AQonDa-$rT*t>qr[n@s60CFs6BXMrTsON"7E_1e+hAjo)A7[o_J1XpA+I=
+q"=IYqXXO[r;-BXrdk*#s+13es*t~>
+JcC<$JcC<$JcG'9jo4lMmel)Aqtg6dq=sp_rq?6^s7H<^s76,ErJ1'*rf6c5s6B4?e*-_mnV-e#
+!frG)rK$u@s,[5ArfI#<nW<M!q:ki&q;)&,rSRM1s5Es4reUH.s,$iDQMHgGPlI$KQMZpIPkp[@
+QMd$Hj7)($j8J'<jnn3>kPscDl2U&Kli$2Lm/l^AQM6sLo)A7[o_J1XpA+I=q"=IYqXXO[r;-BX
+rdk*#s+13es*t~>
+JcC<$JcC<$JcG'9jo4lMmel)Aqtg6dq=sp_rq?6^s7H<^s76+io2bHas6B4?e*-_mnPo<d!`rK+
+r`B,#!*AepnlPS>q:ki&q;)&,rSRM1s5EWNs&T/$!*9"t!*&qts&T/$!*0"t!``9%nlP`irT!D,
+p#H#3roO%>roa=Fr9=7Hs6KXMrp9dT>?gi$rpp'[rq-$Zr:]s\h>$[=q>0[ZqY^3gli)J8JcC<$
+_Z,,~>
+JcC<$JcC<$JcG*:k5P#Onbh>Bq>1$bq=sp_rq?6^rq-6^rUTo\rLa.arjr-As1J?C"2)7W])K>?
+])K5?\GPOdkg\emk4,)E\+mK5\bN]5\H'5>])oXY]_/r<]^FMPg\oq(h>Q40hu2L3V>$bfbK7fF
+r5ScTrknKKo#:OF!93A(qr7G3roF(?r9""As60CFs6BXMrTjOOrj`$XpX9$2rq$-]q"=OXq"NV>
+p\FX]o_\L_q>K[ZJcC<$JcEXfJ,~>
+JcC<$JcC<$JcG*:k5P#Onbh>Bq>1$bq=sp_rq?6^rq-6^rUKrEreLH,!/L6,rf6`4qs!q?eE?_k
+pkAR!!0?u<s,[2Arf75EOcb`eO8b7<O7A>"gATe)h"ok*hYuF2huSXjrJ:9+!go=?p6GZDo9K*:
+r079Am,@j$q;_J8roO(?roa=Fr9=7Hs6KXM!:BcOp7;0Qrq$-]q"=OXq"NV>p\FX]o_\L_q>K[Z
+JcC<$JcEXfJ,~>
+JcC<$JcC<$JcG*:k5P#Onbh>Bq>1$bq=sp_rq?6^rq-6^rUTnfrDiMko2khRq<6>kqr[EJpfIT!
+=BPQ(!`iB(oN:]d!*8OArS.;+qVD,,rnm\4s&AYkr`9)#r)Ebs<W6&!<rl?%r_rr!<`\cmr)NgW
+m,@j$q;_J8roO(?roa=Fr9=7Hs6KXM!:Bbip/M"]rq$-]q"=OXq"NV>p\FX]o_\L_q>K[ZJcC<$
+JcEXfJ,~>
+JcC<$JcC<$JcG0<kPk2RoDIGAq"jm`q"Xj_rq?6^rq-3]rUTiYrLs2$s18BG]=YZR]D9&;\c92;
+kkaJek4YJGTDuCp\,a)7\G`r>]">TR]E,^Yot:@<o@`llrnID,qVD/-s53jOoV;T4b/hX$`rF$V
+_tV+?`Vd[?i;;L3iqqd8jSn9=k5XWEkl'cFlMp2Lm/FQqe,%MldJWS7oDS=Vp%nCQpYtuDq>0s[
+qtg6erTsN7s+13$s2=qf~>
+JcC<$JcC<$JcG0<kPk2RoDIGAq"jm`q"Xj_rq?6^rq-3]rUTi?rJ1!(rf6c5r94"?c0"_Sr.Y03
+qN1];!0I2@r/^o>rfI#<nW<@qpY,W$rS78*rnd\4s+p<(!go=?op,QCo9K*:r0?U+qr.M5qr@\:
+roO(?s6'FGrTX=Hs6K[Nrg*>Mrg`oWrq$*\q"=LWo(V/=q>'m`o_\L_qYfd[JcC<$JcE[gJ,~>
+JcC<$JcC<$JcG0<kPk2RoDIGAq"jm`q"Xj_rq?6^rq-3]rUThcrDinupK$idr94"?c0"OqpK7Gs
+!*K5%s&S_no2bomo@`llrnID,qVD/-s5*fSr)<Pnr)N_t!*8tsr)Wi!!*9%t!``9%nlP`ileq[!
+rSm_7roF(?r9"%Bs60FGrp'OLrp9Vgoi1k[rq$*\q"=LWo(V/=q>'m`o_\L_qYfd[JcC<$JcE[g
+J,~>
+JcC<$JcC<$JcG3=kl1;Sp&*\DpA4[^p\=a^rV$-]s7H<^r:0jXrh0+]!5&0?"M;=Y]=S!R!P5i>
+])K8>\GbU:k5"-;T`(M]T)PA^T)Q4n\,a)6\Gj#A]">Se]^ri:]_pCVf_jFugATe*h"oh,UA:S]
+U]nucbK@oHr5ScUrPSBJo>UUFk2?3srSmb8roF+@r9"%Bs60FGs6BULrji!VqpPJks7-$XrU^$\
+p@\.Qm.]lAqYC!ap&"XaqYfg\JcC<$JcE[gJ,~>
+JcC<$JcC<$JcG3=kl1;Sp&*\DpA4[^p\=a^rV$-]s7H<^r:0jXreC9)rf$o<p5T'3pl578cfY&b
+rIt9+pkAa$rf?o;rf7&@rK$r>rf@)@qiC9/r7C_rr7Uo"rS.>,qV;.,q2"p)rg3_QQM$OCQLgC;
+QMZs0i;MX5ir%j9jT"?>k5XWEkl'cGlMg,KQMI*LSH&-Wo)81Zo_.tOp?_P?q"jg_qXsa_r;-BZ
+rdk*#s+13gs*t~>
+JcC<$JcC<$JcG3=kl1;Sp&*\DpA4[^p\=a^rV$-]s7H<^r:0jXr`/eqr`/_opf@Grr)`j[cfY&b
+rD`\nq,I&is&T2&rDs##=7o\e=8u>!fD+"rg%jA#g]$")h>C1H;u]es<rH)"<r5np<rZ5$<rGu!
+<E</l=8Q%\i;MX5ir%j9jT"?>k5XWEkl'cGlMg,K>P(npnbhtVoD\CUp%J+Gp[%\Oq>0s\qtp<f
+rU'T8s+13$s2=qf~>
+JcC<$JcC<$JcG9?kl1;SpAEkGo_SF[p\=^]rq?6^rq-3]r:9mX!hc6\rh'7brh0(us1A9A!kZ%T
+rji'?rji$<!4V^bg#_th!oolErLWhUrgj+\rjVX3!4hj6rj`0C]=Y_go=b1:o%3flrRq&$rnIG-
+rn[CE!2KFes31Md!m8R(r5ScUrPSBJo>UUFs53M+q;:u*ro*k9r8[e;s5j4As6'FGrTX@IrOM^P
+s3gnorpfmVrq$'[o_%_Inb;MIqt^-cp&"XaqYfj]JcC<$JcE^hJ,~>
+JcC<$JcC<$JcG9?kl1;SpAEkGo_SF[p\=^]rq?6^rq-3]r:9mX!/CB+reCB2!06`3s,Ql6pZC/j
+pZ)>7q1\Qrrf?o;rf7&@rK$r>rf7&@qN(60!KW?5fDO;"g%sG%g]$"-h>)g+M#3&-QiWP>oT]EB
+q3:rGrK[/Dqj%3=p"oN%pu)/1ro3k9roF+@rT=.Cs60FGs6BQKpmq>QrpfmVrq$'[o_%_Inb;MI
+qt^-cp&"XaqYfj]JcC<$JcE^hJ,~>
+JcC<$JcC<$JcG9?kl1;SpAEkGo_SF[p\=^]rq?6^rq-3]r:9mX!*/nsrD`o"<E8fpq,dSsr)`XT
+g#_th!9<cOqG[GrpK7Gs!*K2$!EN:p=S#Vo<q=l?f_sM"gA]k+h#?.,;YX2j<rH)"<r5no<WQ9&
+rDWhu<`\fnqc<aSp"oN%pu)/1ro3k9roF+@rT=.Cs60FGs6BPerD`\pr)E[cqssaXr:KXSnFlDH
+n+ceUqtg!_qu$<hmf%e;JcC<$`W(G~>
+JcC<$JcC<$JcG<@l2LGUp\a+LnbW%Vp\=[\rq?6^rq-3]r:9mXs7#`TpppI;rji0C]"7aKrj`!;
+s5s4?g>qqem[a?dp:(+5pUL76!4r0As1J!;s1J$UpXfDsrRq&$rnI1@s.]Ogs.fkDbfn8RaiF:u
+s2FrSpr)dCqS_p[qVM2.qV_D4ro3k9s5a4ArT=.Cs60IHrODpXpXB/jrm:`8rpfmVrU]sZme-#A
+p@n.Qqt^0dpA=abqYfj]JcC<$JcEaiJ,~>
+JcC<$JcC<$JcG<@l2LGUp\a+LnbW%Vp\=[\rq?6^rq-3]r:9mXs7#i>s+UN-rf-r<oo9!3pl5=9
+qrQPmp#H"(!/:#trf?o;rJpr?rK$r>rf7&@qN(91s,Zj(pXfDsrRq&$rnI.%reUT2r0RMOQL'n:
+QMm*EQMQm:h>6",htl:2iVqj7j8\3?jo+?AkPscFl2?nJT(efRS,i'Xnb_nUoDJ7Kp$VPIp[\+V
+q>C*_qtp<frU0Z9s+13$s2P(h~>
+JcC<$JcC<$JcG<@l2LGUp\a+LnbW%Vp\=[\rq?6^rq-3]r:9mXs7$%hr`/hr"'&B&<VTVk=8l7u
+=9%F[jkAegirE$S;Z9Vl<<#tu=85ns<rcA$<rl?'oiUifs&SgDpXfDsrRq&$rnI9J!)iVks&T&!
+!*8tsqGmSrr_rr!<`\fnqH!.BqVM2.qV_D4ro3k9s5a4ArT=.Cs60IHrEK.ur)NYo!:^!Xqss^W
+r:KFMme6AKo(`+Xr;--aqu$<hmf%e;JcC<$`rCP~>
+JcC<$JcC<$JcGBBl2LGUq#'CRnG;hRp%\L[rV$-]rq-3]r:9mXrpTpVp7MN!\[o?M\cB;?])T>@
+](ro9\Gs&8jO*#dipN?;[f3c4\,a#;\,a)6\Gj&=]DfJ8]`>_CeG7Ymf(mqrf`'S%gAdfCT_P2d
+U<Us,bfe2OaSWs[`Pf^4_tV+@`VRO=h>H./htu@3iVqj8j8\3?jo+?AkPs`G\,Nl=\^].'df@hq
+d/q\anG_tSo)81Wo]>c<pA"CTq"smbqY'g`r;6H\rdk*#s+13js*t~>
+JcC<$JcC<$JcGBBl2LGUq#'CRnG;hRp%\L[rV$-]rq-3]r:9mXrpTpVr.k6*s+UE2rf6Z2!06i6
+qrH/brSm6u!07&>qN1Z:!0I)=!0I2@!0I&<oT0'6r7(Pmr7:\qrRh,&r7^Xqqj@DM!L8o;Q2d0K
+Q2-aBQ0[9(hYuF0i;_d8ir.p;jT"??k5XWEkl$bJQCa]BSc##XnG_tSo)81Wo]>c<pA"CTq"smb
+qY'g`r;6H\rdk*#s+13js*t~>
+JcC<$JcC<$JcGBBl2LGUq#'CRnG;hRp%\L[rV$-]rq-3]r:9mXrpU!X<E8lrrDikus&Jqs"BAK(
+='#9$r`8quqrH/brSmiUrDNPlr)EYqrE&esr`9)%qcEGmoN)#nr7(Pmr7:\qrRh,&r7_$H!)iPi
+r`8qu!*9"tq,[Mqs&9&"<`\fnqGuq<r8.G1qr%M5ro3n:s5a4ArT=.Cs6'Gcr`T;+qGdAmr)E^c
+rpfjUrU]pYjn89>q"OIVqt^0dpA=abqu,s^JcC<$JcEdjJ,~>
+JcC<$JcC<$JcGECl2LJVq>BUVnG;bPoD&:YrV$*\rq-6^r:9jWs7$$Vqk3kZ"M2.S]".gOs1/-?
+rj`$?rOE!>\[h^LrjVO[guA4irgrbQrLEnrrjVa6s0qX1rji'@s1J!;!5.jOrRLktqUb`!rRh1A
+rLWt[rh01_rltJe"3\j/a8EsW`W*mV_tV+A`VIIAh"]_)hYuF1i;V^8ir.p;jT"??k5XWE[KO(L
+\CB%&e,RkrdJqSmnG_tRo)/+To]#Q=pA+IVq#'scqY'g`r;6H\rdk*#s+13ls*t~>
+JcC<$JcC<$JcGECl2LJVq>BUVnG;bPoD&:YrV$*\rq-6^r:9jWs7$$VqhP0*s+UB1rf6<(o]+`d
+qr.'urIb-1rf?o;nrNg4r/^K3!0?["rRLktqUb`!rRq+'onWF3s-E_Orfll:rg*PKqNgrBnD*fp
+rndY3r8@S5s5O";s5a4ArT=.Cr0@;RpRV2Orp]pWq==ITq=N\>q"FOXpA"R]r;--aqu$?imf%e;
+JcC<$ao?k~>
+JcC<$JcC<$JcGECl2LJVq>BUVnG;bPoD&:YrV$*\rq-6^r:9jWs7$$Vqc<Vp!`W0"r`0#!qc<_s
+!`iB'r`B"urE&XOguA4i!)renr_rSks&Jtuq,mAmoiUlg!*8X>rRLktqUb`!rRq*H!)rbmr)3Sq
+r`8u!!*9)!!`i<$q,[Mqs&AtuoN1ihnD*fprndY3r8@S5s5O";s5a4ArT=.Cr`T8)qGdAmqc*Ra
+rpfgTr:BaViq<*?q=jUXr;$9epA=abqu,s^JcC<$JcEjlJ,~>
+JcC<$JcC<$JcGHDlMgSWq>B[XoD8%RnG)qUrV$*\rq-3]r:9mXs7$!UrLj"Z!MI%%\c02>\H'5<
+\HKFQ\@B*K\Gir=[c?EDinWMgi;0#BSG\lUS,g%t[K*f4\Gs&2\G`u;])]M9^%KkKeG[qsf)!tu
+f_qB>T),)YT`348bQH&2aiF>!s2G#Vs24TLoYpXEp=fAtrS78*rnd\4r8@V6s5O";s5a4AroO?h
+ZaI6MrRCSjs3^nprm:]6rp]pWq"":Qp%7D>q=a^[p\=[^r;-0bqu$?imf%e;JcC<$b5Zt~>
+JcC<$JcC<$JcGHDlMgSWq>B[XoD8%RnG)qUrV$*\rq-3]r:9mXs7$!UrJ1?+rIt93rJgf:l](r)
+q;U2gq;D+&r.Fp!rdt33rf-u>q2k3/rfI&=oT8appXK/lrmpqt!8.+%pP8[6"IYXDQ^7W8n!3m<
+s-<DGq3C[-qV1u(qVD/-s53b4s5F";rT!q=s5j7B"Hnt5Q'M<>pRV5P!h8ZIrp]pWq"":Qp%7D>
+q=a^[p\=[^r;-0bqu$?imf%e;JcC<$b5Zt~>
+JcC<$JcC<$JcGHDlMgSWq>B[XoD8%RnG)qUrV$*\rq-3]r:9mXs7$!UrDr_o!*&qtr`9&!rDrnt
+rDio"qc<Yss5Wq7gu8(er)3DjqGdJpqH*MqpK.#ioiLh8pXK/lrmpqt!8-m@rDW_rs&K/%=T2A%
+<rQ,!<WH.q<rZ/#<)rouoN1ihp=fAtrS78*rnd\4r8@V6s5O";s5a4AroX5^!a&T.pf./kqc*Ua
+rp]pWq"":Qp%7D>q=a^[p\=[^r;-0bqu$?imf%e;JcC<$b5Zt~>
+JcC<$JcC<$JcGHDli-_Yq>BaZpA4@Um.gMQr:^![rq-3]r:9mXrp]mT!:KNQ!M?t$\c98>\H9@Q
+\G`u7\Giu:[eet5i;_[7SbnrWRfJoPRfT%grO)^8qRHL5p:(48]",EO])]M:^&$.QdeqSieGe"s
+f)O@tSc,/WT)kV1rltGd"3\j/a8EsW`W*mV_t_1@`VROAgATe*h##q-hYuF2i;_d9ir.p;jT"<A
+Z2V$0ZaK_\pX92ldF%s?rpTjUrUKXQp[dqIm.L8LqtKj[rV?Bfp\Xmdqu,s^JcC<$JcEpnJ,~>
+JcC<$JcC<$JcGHDli-_Yq>BaZpA4@Um.gMQr:^![rq-3]r:9mXrp]mT!:Kc?s+^H*#_\4uNK0!X
+NfN@`qVfu_s53[*on!3sO8Y(=O8=t/NrkE*OSk14OS[B$deqSieGe"sf)O@pLAHZ*RJ`ETR@'>-
+QN!-KPlR'?Q2R$KQ2$[AQ1*H*g]$"*h>c@2hu2L5iW%p9j8\3?jnt8CPF\9DT(efRS,f&Xn,DhT
+nb;VKoC;J>p&"I[p\4I]q>C*`qu$BhrU0Z9s+13$s3(Fm~>
+JcC<$JcC<$JcGHDli-_Yq>BaZpA4@Um.gMQr:^![rq-3]r:9mXrp]mT!:Kbcq,IDorDiht!*/tu
+r`/Ymr)`aRe_pJbrDNDhqc!Pqq,dGqoiM,p!a/W,r)iYoqU,/fr6tJkrmgtus47?N;c?Tm;ZK_p
+;uKVn;uTes<WQ9(r`9)#r`/u!!*/hqrDikunlPZgn(R`prnRD,s5*b4rS[_7s5O";s5a4Ar)Wl#
+pJh&jr)<YprpTjUrUKXQp[dqIm.L8LqtKj[rV?Bfp\Xmdqu,s^JcC<$JcEpnJ,~>
+JcC<$JcC<$JcGKEli-_YqY]m\p\ORYl1k/Mr:]sZrq-3]r:9jWs7#sTs6fWS".u0V])9)E\@T8^
+\[]/[\c0)=\bWc7\,Wl:[Hlc7hu2F1SGerQRK/iURfBkq[K*f5\G`o1\-':Q\[qdP!5/$=nBq3_
+rR:Vmrm_&#SFrHQT)PA^cN)8ic2Gifb/q^%`rF$X_uR^N_u[iqn\tCDo\'#nrnIG-r8%D0s53e5
+s5F";rSmn=ricO1ZEhs.psf5js3gqprm:T3rp]mVoCDMEoCVSGr:^'_p\=^_rVH9cr;?Hjmf%e;
+JcC<$bl<1~>
+JcC<$JcC<$JcGKEli-_YqY]m\p\ORYl1k/Mr:]sZrq-3]r:9jWs7#sTs6flA!/CB)re192rJgi;
+l&G#ekhl?qpOiHsq1A^.O8Y(=O8=t/NrkE*OSk15ORUZrdf%YkeGdu!eqNXK!/LN@rL!VQs-EtV
+Q'@MuQ'@O,Pl[29rKdJKpQk]Ao\'#nrnIG-r8%D0s53e5s5F";rSmn=qi^fHrLWqXr1*eVr9sXS
+rUKLMoCMSGnb)hRr:fs\rV?Egp\Xmdqu,s^JcC<$JcEsoJ,~>
+JcC<$JcC<$JcGKEli-_YqY]m\p\ORYl1k/Mr:]sZrq-3]r:9jWs7#sTs6fV^r`&qtr)N\r!*0#!
+!``3!p/_,n!*8FDkhl?qrDNDhq,I)ir)iVnr`B;+=BAU+r`JnrnBq3_rR:Vmrm_/&;GpFlqc*Ai
+s&]/!$s$G3=BAR)<`N.#<`Srrr`'##='"imqc<@BptG`%rnRG-s5*e5rS[_7s5O";!9F#Ypf.)i
+r)E\pr9sXSrUKLMoCMSGnb)hRr:fs\rV?Egp\Xmdqu,s^JcC<$JcEsoJ,~>
+JcC<$JcC<$JcGQGli-_YqY]s^q"ja\kP4lIr:]pYrq-3]r:9jWs7#sTs6fpSqOdh\r13o"rji!;
+!4r0?rO;s=\@B*K\Gir;\Giu:[K<kpi:l-ghYQ(-S,/TRS,JfRR0'h+\,Ni9\,*W5\+[<6\[o>_
+rk%m;r6P/bpsK)hrR:\opRM#Lrm(\lbg"E2bQQ)0a2Z*t`WX9!`5BLg`9kPC`;/$]f_sM"gA]k,
+h#-".hZ)L3i;_d9iW/$9YQ1s-e+hGje,Ri!dEp7dmeZDNnGMhEo()DIo^qhSpAF[\q#'sdqY9sb
+r;6H]rdk*#s+13ps*t~>
+JcC<$JcC<$JcGQGli-_YqY]s^q"ja\kP4lIr:]pYrq-3]r:9jWs7#sTs6fpSs+^H*qh4p.rJ^f;
+r/C]8mZ%8)pYXueqVC[o!.t0%qi:];qN1Z:!0Hr9!g&P+rK$Z6r6P/bpsK)hrR:\opP&Bsr0dMN
+s-X(XQBd`"Q'M<4pQbT@!1!5Crg!<2qUkc"qV(r's4mP.s5*e5rS[_7s5F+?OcfR)qORPUr13bU
+!LrNRn,;bRna>u=oD%tMp&+O]p\FU^q>L0bqtp<grU9`:s+13$s3:Ro~>
+JcC<$JcC<$JcGQGli-_YqY]s^q"ja\kP4lIr:]pYrq-3]r:9jWs7#sTs6fpSpf@>ns&AnrrDinu
+r`0)#<)iQlrDs&$i8F@einjOfpJ^cboiM)or`9)%q,dPt#$G&0=BAU,pK.:=psAf`rmLbor7(^D
+qG[5is&/u"=',?#"BJT+=BGK&!*/Yls&B&"m8s9fq:GJqrRq&$rnIJ.r8%D0s53e5s5F";!omBb
+r)`VlqGmGm!E8F_n,;bRna>u=oD%tMp&+O]p\FU^q>L0bqtp<grU9`:s+13$s3:Ro~>
+JcC<$JcC<$JcGTHm/HhZqY]s^qYL!_kkOoHqtBgXrUg*\qssdWrp]mTs6fmR!:9ZW!2'(Y!4r0?
+r4)a:s0r3@\@B#Wrj_g6rO2a6q;0i]!o0<9oUGlLrgEeRs0hs:rjDg9ppg=4!P#W7\-TXV]",D`
+]=Y`N^%]hLchu/ddJhSne+K7,Sc-k:c-4DVrlbPhb/hWC`W!mV`;daN`9bGC`:;IXf_sM$gA]k,
+h#6(/hZ)L3i;_a:iii9as4%(tpXK,i"k(fGd*U,<meZDMnGDb=o(VbPo_.tUpAOa]q#1$dqY9sc
+r;6H]rdk*#s+13qs*t~>
+JcC<$JcC<$JcGTHm/HhZqY]s^qYL!_kkOoHqtBgXrUg*\qssdWrp]mTs6fmR!:9Z<pk8[,s,R)<
+!0$f7rf$<*q;0i]!8R@%oR[(&qi1Z;plPK9!0Hu:"-AY-OSt77OS@&tchu/ddJhSne,P.!K`-W#
+LARD<R/`QZR$X,(Q'@Q!r06r@qj%5IoTfKBn^m`lrRq,&rnIJ.rS@M1s53e5s5="<Oo1C;Sc#)W
+Sc"uXS,VjPn,2\Pn`TK;oD8+Qp&+O^p\FU_q>C*aqu$BhrU9`:s+13$s3CXp~>
+JcC<$JcC<$JcGTHm/HhZqY]s^qYL!_kkOoHqtBgXrUg*\qssdWrp]mTs6fmR!:9S`r)Nbtr`&eq
+rDrqus&T+uoiD)os&SsPg>)bar)<)aoN1unr`9)%q,dSus&f>(r`B,%pfI48qp52eqU,;jrmUO=
+q,@Gr<``B$<<Q?)=BAT'<WH.l<WZ9%<pWlf<q4f?f_sM$gA]k,h#6(/hZ)L3i;_a9ir3'^=BASt
+<;BPl;ufkrmeZDMnGDb=o(VbPo_.tUpAOa]q#1$dqY9scr;6H]rdk*#s+13qs*t~>
+JcC<$JcC<$JcGTHm/Hk[qY^!_qYL'alM1)Iq=aRUrUg*\qssaVs7#sTs6fpSs6T`Xs.B4\rgj(Z
+!4r0?#.V.P\%&rYrj_g6$FmRS[^W]S[^NTPrjChCo%a6!s.'(Xp6tuKrg<Yms0r$:!4Va5rjMp<
+\,!N6\bs&=]DoP?^&?4IcMc)fd/),idf#[7SGeuYSGA`ScN2>9qof/cb/q^&`W4!W`;[[N`9bJ@
+ebRelfDaG%g&0S(g]-(-h>c@3hu2L3YPtcteGReqdf7_ociEJ4meQ>KnFuJ9o(qtTo_8%WpAOa]
+q#1$eqY9scr;6H^rdk*#s+13qs*t~>
+JcC<$JcC<$JcGTHm/Hk[qY^!_qYL'alM1)Iq=aRUrUg*\qssaVs7#sTs6fpSs6TK6re1<(s,I&=
+s,I&;qi1T6mu?Dao%a6!s+C<&n:CV!qi1Z;plPK9!0Hu:"H\b.OHBI&plPI!o?R<\rQtDg!n)aT
+rIb!#s+U?)!1<\PrL!VQ!go=?r0@,CpQb35r71Voq:GVurn75's4dS/rS@M1s53e5rK7)B"J20T
+S=KMJrLWqXr1*eV!:BdRq="4Mp[RG;qXaUVp\"LYrV--_rV?Egq"t!equ-$`JcC<$JcF$qJ,~>
+JcC<$JcC<$JcGTHm/Hk[qY^!_qYL'alM1)Iq=aRUrUg*\qssaVs7#sTs6fpSs6T;WrD`_qrDrqu
+s&K5%<)clk<WH5#<oi*-h#?(+<;TVf<:X,i=T2A%=SZ%u=T;P&=8uCu=8gD8cMc)fd/),idecr<
+;u9Po<<?3&<rQ)&<``C*='+ll!``9%lrX,8q:>Anrn.5'r7_2*s4mS/s5*e5rS[QU!E`@q<;KVm
+<<#ksmJcPLn,)VKn`TK>oDA1Sp&4U_p\FU_q>L0bqu$BhrUBf;s+13$s3CXp~>
+JcC<$JcC<$JcGWImJcq[qu$-aqYL'ameHJLq"FCRrUg'[qssaVs7#sTs6fpSrTjQXTDY;ZSH,2Z
+RfL&!\c9/E\%&oV\@K,ZrO2j:\$l7Er3lL1s5!>&l.c*h!h5XIqjIANr0dPO!13Vls0r$:!4Va5
+rjMs=\$u4D!4i'>rk&0Br4VjKqp"r^rQkJis3^Y2!h5^Mr13eV!1j&6!RAsebQH&2aiOG#!6+rU
+rkn]Q!QE"E`V@s[ebn"qfDaG&g&0S(g]-(.h>c@3hZ2U2Y5kfteGReqdK%\nd/NG2me?2GnFQ2<
+o)&%Vo_A+XpAOa]q#:*fqY9scr;6H]rdk*#s+13ss*t~>
+JcC<$JcC<$JcGWImJcq[qu$-aqYL'ameHJLq"FCRrUg'[qssaVs7#sTs6fpSrTsB7q1SU(s,?i7
+rJ^6*s5!>&l.c*h#(hDWJ:N-!rIFlupji=&r/Uf<q2kT:!0Hu:"H\b.OHBI&q2k?pqp"r^rQkJi
+s3^IkrIk0(!/CK?rL*VOs-WtVQ^3s9Q2-[=Q1C79eGIeof)+(uf`0Y&gAfq-h#?.0hZ)I5i;/Q=
+P+J89Sc5/YSc#)WSc##XS,VgRme?2GnFQ2<o)&%Vo_A+XpAOa]q#:*fqY9scr;6H]rdk*#s+13s
+s*t~>
+JcC<$JcC<$JcGWImJcq[qu$-aqYL'ameHJLq"FCRrUg'[qssaVs7#sTs6fpSrTsJ_p/_,kr)N\r
+s&K)""'&<"<Us2jh=TLeg\]\+<)Z`n;Z9Vf<<$"j=8l>$<rc@u=8l;%=oDD%=SZ%mbkoZ\cMc)g
+d/VMh;Y<rm<)lq!='&H%<<ZE)=BJX+n5]Qk<p`u`eGIeof)+(uf`0Y&gAfq-h#?.0hZ)I5i;$OU
+<W,ns;uBVk<W#hr;uZ1_me?2GnFQ2<o)&%Vo_A+XpAOa]q#:*fqY9scr;6H]rdk*#s+13ss*t~>
+JcC<$JcC<$JcG]KmJcq[qu$0b!3Q.pqt]aVp%S1Ro_&.SrU]pWrpg$Xr9s[Rs6]aN!:0QS!1j(Y
+r0m\trji'=rO2g9\,Nl>\$i`SrjMj9qR6:/q:jc[!87@?rL*VQqjIDMs-E_nr3lX7s0_p:ppg@5
+rj`!;qmZX:rOW!?rk/3CoZR0VrQY/`s3L8)rL<eVqp,;gc25`bb5o`+rPeoX`5MVlrPS`U`9tVD
+e+;)fec+.tfDaG&g&9Y)g]-(-h#Q=-Y6!)#o$mTd#h%,Jd*^4em-O`=r9j4Gp$hYEo()_MrUfpY
+rV$3aqY:$brVH?er;?Hjn,@n<JcC<$dJn^~>
+JcC<$JcC<$JcG]KmJcq[qu$0b!/UOKqt]aVp%S1Ro_&.SrU]pWrpg$Xr9s[Rs6]aN!:0Q:qLnj%
+q2PB4qi1T6qi1W7pl5+(hV%t_rdaZks+'urs,?r:r/Uf<q2kW;rfHr:!0I2B!g&J(q2k6lr65,a
+q9K#drdsZmre:<<rL*VOs-`nSs-EVKpltK;op5U+o@3`hrmq#!rn.8(rS%;+s4mS/!8dO6rLX%[
+rLEnYr1<hWr1*eVs6TaPr9j4Gp$hYEo()_MrUfpYrV$3aqY:$brVH?er;?Hjn,@n<JcC<$dJn^~>
+JcC<$JcC<$JcG]KmJcq[qu$0b!)rdkqt]aVp%S1Ro_&.SrU]pWrpg$Xr9s[Rs6]aN!UEbW<rH"s
+<<-"t<W6%u<<Q?&<)clg<r(M,g&Th&;tEug;uThg=8uD&=8l=u=8Z1o=7j]6bl,f^cMu5i;u9Jb
+;uTc!<``@'r`/u!s&f;&n5]Qk<pj&ge+;)fec+.tfDaG&g&9Y)g]-(-h#Q=-=oVP&<W?#!;cN]o
+s&Aeor)E\ps6TaPr9j4Gp$hYEo()_MrUfpYrV$3aqY:$brVH?er;?Hjn,@n<JcC<$dJn^~>
+JcC<$JcC<$JcG`LmJct\qY^'a!rBI0rqcNfoD&(Sp@e%Lqt0jYqXXXUs7#sTs6fmRrTsRM"R;SM
+SXobMpmV>r\[h^LrjVp9#e.=R\$i`Q[^Q1C!k5VHqmHI2rjD+HnCdcms-inSrL3bSqj@DMr0@>j
+r3lX7s0h[3s0r!;s0qs:rji!=rk&-As1S0LpWNNZrQY;dr0mPOp6kuNqTf2fc25]lbK@rI`l5s:
+`Pf^n_u7LS`Ph5aqU55hq:,Dos47,"s4IA)rS%;+s4mY1poabIe'mm;rR:bos3^hmrTsLMqsNqA
+o^M\Hp@A.QrUfpYrq?<bqY:'crVH<drVZQkn,@n<JcC<$df4g~>
+JcC<$JcC<$JcG`LmJct\qY^'a!rA+:rqcNfoD&(Sp@e%Lqt0jYqXXXUs7#sTs6fmRrTsRM!pYJn
+qLn^!q2PB4qi1T6qi1Q5qMjjqnCdcms+'`kq0r?ns,?o9rJpl<qN1`<rfI#<s,d2A!g&J(qN1Ho
+pWNNZrQY;dpO`*k!/19;rL*VOs-X(YQ^3o%Pa1p+pQbT@rg!?.qU>8irmh&"r7Cu$s4RA)s4dS/
+s5!I4r1<qZr1!bXr1<kXr1*bUrTsLMqsNqAo^M\Hp@A.QrUfpYrq?<bqY:'crVH<drVZQkn,@n<
+JcC<$df4g~>
+JcC<$JcC<$JcG`LmJct\qY^'a!r?%urqcNfoD&(Sp@e%Lqt0jYqXXXUs7#sTs6fmRrTsRM!:'8Y
+r)N\pr`/tts&K&!r`'##<E/rto2b53nCdcms&8_ms&8Vjs&8ksnlGlp=',B'qcEYspK.+3pWNNZ
+rQY;dr)E/arD`r#='&H%<W?,"=9)G$<WH.l<WQ9&moTA6qU>8irmh&"r7Cu$s4RA)s4dS/s5!HQ
+rDiu"<)i`ns&Ahpr)EYorTsLMqsNqAo^M\Hp@A.QrUfpYrq?<bqY:'crVH<drVZQkn,@n<JcC<$
+df4g~>
+JcC<$JcC<$JcGcMmJct\qu$0brqZW*riZ4qo_A7Vp@dqIqt0jYq==OTs7#sTrpKgRrTsRMs69[M
+SXobMp6u,q]".dL!4Vm7"1YhL[edE2[f3Z8['fn?rj;a5pY"lbq:GP4rg3\RrL!JKqj.)es0r$:
+pUL74rjW$=\@;IIrOMp=rO`$@rQ+cUr6"iYrQG>fR$[N6rL*PO!7(Ge"4#08bPo`cb6,o/a2\+t
+rl"`Prl"]Q!6"iT!6"`Qp<ifdrR:Yns4.,"rR_)%s4RA)!ScE)YQ)uNdaRd:r6tYnr6bB-r9a@K
+lL4Q<qXO@Or:Bp[qXsg\rqH9arV?Hhq"t$fqu-$`JcC<$JcF0uJ,~>
+JcC<$JcC<$JcGcMmJct\qu$0brqZVYre^ULo_A7Vp@dqIqt0jYq==OTs7#sTrpKgRrTsRMs69UK
+pOrO"re191s,?o9rf$`6rf$`6qi(E3pY"lbq:GXsrdXorr."Bgrf$f8rJpl<qN1`<rf@/AOSt7?
+OSt:COH5J"OT!8qao'<WbPfWdc%(<BJGt,rK)1,sR/NHPR/`TSQii\@Q'Ls*op#NCqj$m&r6kPm
+qpbYrrmq&"s4IA)rRq;,h"m05OT1mMT)YAYS,f,YT)>/WSGo#Sm/68Imcs9:nG;\Mo)/+Yo_S7Z
+pAXg_q#1$fqY9sdr;6H^rdk*#s+13us*t~>
+JcC<$JcC<$JcGcMmJct\qu$0brqZUtr_rdko_A7Vp@dqIqt0jYq==OTs7#sTrpKgRrTsRMs69UK
+q,[;ks&8kqs&K(us&K&!r)E_rr`/MipY"lbq:GODpf$lc!EWD&<q9;n=BAT'=92K*rE&kupfIF8
+prWHVq9/`\!mOYAlr3j_s&T/$#Zar*<`W:(=',?$s&J_mp/_5pqH*C<r6kPmqpbYrrmq&"s4IA)
+rRq;,h"Y%P<W,r!<E/fns&Ahpr)EYoqX".IqX3Y;q=+7Nq""@Srq-'[rV$6bqY:$brqcEerVZQk
+nG\"=JcC<$df4g~>
+JcC<$JcC<$Jc>`MmJct\qu$0brV?Q)\,NN1q=XOZp\FOMp%n=XoD.tVnc&%Un,DbTmJZDOli68M
+l2R:ES,U"t\Gs&;[f<c8\,Wl;[C#q@"gk\G[^EO>[/[Q6[/JY9fDjFtR.lsCQ2n>h[f<i:[e@32
+\,Nl>\%&oVrj_s<rOW!?rk.dBr5no[r6+c"r0[ALrm(De%F35Bbfe2Rbfe2PaiML$`W!gR_u@UP
+`W*mT`W*mS`V\$UdJ_Mme,7_qec45!fDjM'g&9Y)Y5b^(Xp)#UdF$Cko$mTds3gels6KIHqX+%F
+mI0o@r:0URrU^![qt9p]rqH9arqZNhq>:-gqu-$`JcC<$JcF4!J,~>
+JcC<$JcC<$Jc>`MmJct\qu$0brV?\\ObejNq=XOZp\FOMp%n=XoD.tVnc&%Un,DbTmJZDOli68M
+l1p#2L&?W'NW+n8NW+n6NW+n7NVSP2NW%MgfDjG#J,OiqI/n`oI/n`pIK+crIJf''NW"n9O8=q<
+O8b4AO-'=$s,d2A!K`B>OR^Eiao0B[bPltfJ,b$!Jc(,tK*$XmRJN<MRJrTRRK&WVQ^3o%o9A^/
+qp>&arR1\or7(bss47/#s4IA)rS%:5s,m5@!h>gPrLX%[r1!bXr1<hWr1*bUs6KIHqX+%FmI0o@
+r:0URrU^![qt9p]rqH9arqZNhq>:-gqu-$`JcC<$JcF4!J,~>
+JcC<$JcC<$Jc>`MmJct\qu$0brV?Ot=T25!q=XOZp\FOMp%n=XoD.tVnc&%Un,DbTmJZDOli68M
+l2"HV<W?,!;uK\q<W?%u<W6%s<<-"t<Us2hf\tH^f)/M?;ts;o<``C)r`8Sk!E`G&=92K*rE&o!
+pfI",r5no[r6+h4s&8kqqbmJmqc*`!='&H%<W?)%='/O*rDrquoiCcfs&T&!qp>&arR1\or7(bs
+s47/#s4IA)rS%9Rs&o;&"'JT'<W,r!<E/ios&Aeor)EYos6KIHqX+%FmI0o@r:0URrU^![qt9p]
+rqH9arqZNhq>:-gqu-$`JcC<$JcF4!J,~>
+JcC<$JcC<$JcG-:qYg?ipA=da!r9=7rN>qjqtKp[n+HJJqt'URrUKmVr9sXQs6]dOs6K^MrTX<O
+pRD,O"1u.U\c0,<\,Ni9[19XS[^ENM['d<K[C*HN[JI61[JmQ,fC%5dec2$4Qi*0HQ2d0LQiFJi
+[f<i:[dpp1\%&rWrODj;rjr*@s1J9LprE0NrlP/^s-N\MqNpuEs-Wl3rm(De"4#08bl5ckbfe2P
+b/_N@`VmaQ_uI[P`W*mT`W!gT`V7^Vd/)/hdf7eoeGn)!f)=5#fE'[ZpTFPCs3Ukqe+2#ee,Ien
+dJrM1lh9]>mIfo<n,2\RnbMbToDS=Yp&=[ap\O[aq>L0cqu-HirUBf;s+13$s4%(!~>
+JcC<$JcC<$JcG-:qYg?ipA=da!r7t@reLQ2q"Xa\q=a:Mq"4ITq""CRrp]jSrpKgRrTsRMs6BRI
+n:Uk'NK*mqrJgf8qi1T6r/LH0rf-X'mah6b!IoR_IJ]!&NW"n8O8"_;O-#J&O8k=?Ont1;`q[UL
+aSs<\b5HbgIf4cqJH(3"JcLB$Jcp^XR$jB=R/WNQR/`TSR/`NQQ1U=0Q1rW&d/)/hdf7eoeGn)!
+f)=5#fE'[ZpQ5EFs.0+[s.0(X!1j%ZrLNkVrgWrQrTj1Dp[.YAo'cMGrUK^Srq$*\qt9s^rqH9a
+rqZNhq>:-gqu-$`JcC<$JcF7"J,~>
+JcC<$JcC<$JcG-:qYg?ipA=da!r5r#rDWLdqtKp[n+HJJqt'URrUKmVr9sXQs6]dOs6K^MrTX8]
+qGmDn!*&qrrD`ess&B"ur`8bno2bS:mah6bs&AVhqc*Jns&K2&=BGK&nlP`k!`rK+r`B#"q,dL6
+prE0NrlP/^peq&hqGdGm!)i_pr`9&#!*9)!s&T)"rDrqup/^ifr`9#"pWrcaqU,;js3pnqs4./#
+rR_)%&)#Z;='/O*=BJX,=B&7"<W,r!<E/ios&Ahpr)EYos6BRKp?_P@p$VD>r:'[Tq==OVrUg![
+rq??cqY:'crVH?erVZQknG\"=JcC<$eGk%~>
+JcC<$JcC<$JcG0;qYg?ip\XmbrqZT&r3#tmqtL!]nFcSKq=F@OrUKmVqsXOPs6]dOrp0ULrosIH
+pRD,OrL3o$]"5HO\Gs&;[f3]6[K*`6Zi[S@[/RK/ZiIN5[/AMDeb.GjR/<6LQM6[CQN+;l[J@64
+\$id:\-BFP\@8rW\G`u;])TDA]_BDB`r3sRaS;)!QhZpPREWn#c-FW4cNDJ;bfot-"Nnj,`Pqeo
+qnrHPqo/QQrl+fRp!3N^rQtJirmLhqrRCkts47/#!8.%KrQtSl!RfHgeGRepdeqJml2BoFlgjE9
+mJ-,Bn,;bSnbVhUoDS=Yp&=[ap\Xabq>L0cqu-HirUBf;s+13$s4.."~>
+JcC<$JcC<$JcG0;qYg?ip\XmbrqZSUrJ1H1r:p0`qtBOPq"4CRp[\:Qrp]gRrpKgRrTsOLs6BUJ
+s60'-rIY-2NVe\6NW+n7NVnb7NV&/0NVqAreb.GjIeJ3eIf+TqI#X-`N;\b8Nr4t4O9Uc-OH5Ha
+OSk7;OS?`k`r3sRaSgPbIf4cpJ-(:PJGk'!QiNQMR/WNQR/`TSQi`V?Q1L70Q1`H$ci)5gdJhSo
+e,@erec45!f)XItOSt^LSc,/[Sc"uXSc,/XSc##WRfM^OlMTu=m.TiAme-&InGVnRo)A7Zo_\=\
+pAXg`q#:*fqYC$er;6H^rdk*#s+14#s*t~>
+JcC<$JcC<$JcG0;qYg?ip\XmbrqZRqr)<OgqtL!]nFcSKq=F@OrUKmVqsXOPs6]dOrp0ULrosIH
+s&T"sqGmSrr`&kqrD`br!`W0"r`8bno2be?n(%*\!*0"tqc!Gmoi1ukr`9&$!*B,"nlPcl"BS]-
+=',9$q,d=0qo8TTq8i>/r)<Gkr_r\or`9&#!*9)!s&T)"r`9"up/^ifr)WL9rQkGhr6bMls3pqr
+s4./#rRV&%rDresrD`esrDir!<;TVo<;KVm<;oerl2BoFlgjE9mJ-,Bn,;bSnbVhUoDS=Yp&=[a
+p\Xabq>L0cqu-HirUBf;s+13$s4.."~>
+JcC<$JcC<$K)b9<qYg?ip\XmbrV6cp[C!0AYHG%3q#'m`p@ItPo_J+No)8+WnGD\Rmf2\Pm/QDO
+lM]uIkQ'fAReN<O])oOS\c'&<[emH6[^EOAZi[S@[/RK,ZiJY=eG@YeQiEBFQ2d0LZiIN0[f3c3
+\,a#5\Gs&<\G`rB]">Pc]=bfR`:_+J`r3pZaHi+iQMm*KQMQsFR/bA7c-FSZcHjl:cNDJ;bfp".
+s2kGca2Q$r`;@IP`;@OQ`;[aT`:hIOcMl/hd/;;kdf7epeGn)!ec==qY5Q`Id/qbFe+;)ee,Rkq
+d/qbDdJ`>-lMKo8m.fuFme?2KnGVnSo)A7[o_\=\pAXg`q#1$fqYC$er;?N_rdk*#s+14#s*t~>
+JcC<$JcC<$K)b9<qYg?ip\XmbrV6QjO,o.rL]NA-r:g*^oC_nNq=F7LrUKjUqsXOPs6]aNs6K^M
+rTX@G!9a64on3:)qMbB4s,?l8r/CW7oS`e#k1'7Vn9t4`r-eR(r/CT6rf6l:s,[5AplPN:s,d/@
+qiL]nou6mLrPnu\IX_6DqgSBkqge@,rgEbQ#+:jGQ^=#'o9B-;s-3AFp<EEYrm1Sjr6bPms3pqr
+s4./#!8%42q2kQFs.0(Zs.0(X!1j([r13_Ts-ruOr9F1Fmd0`9qsO4IrUBdUqssaXrq-*\rq??c
+qtU-crqcHfrVZTlnG\"=JcC<$ec1.~>
+JcC<$JcC<$K)b9<qYg?ip\XmbrV6Qj<`W2t;ZQUjp\X[Up%\1ToCVVPnbqtSn,DbTmJQ>Nli68K
+l2TrIkOqmV<)rcor_r_os&B%ur`/qupf6re!7g5]qU>FDr)E)arDrr#!*B,"nlPZis&])"qH*R4
+ou6mLrPnoZqbdDmr_iSkq,@Ap<;]`"<``='='#<#s&T,#rDrkspK$rgr`8a;q9Jucrm:Sjs3gqr
+rRCkts4.2%r)W\rrD`esr)Nhu<;TSo<;BPk<<#nql29iDlgF-7mJH>Gn,;bSnb_nVoD\CZp&=[a
+p\Xaaq>U6dqu-HjrUBf;s+13$s4.."~>
+JcC<$JcC<$KE(B=qu-Hjp\XmbrV?Hfs0Vg1s0)F)s7cHbo_&%Pq=F1Jr:0aTqsXOPrpBXMs6K^M
+rTX@Gs5sCEqjR2Is189Brj`$<rj`!:qm?O7[C!=>Zi7<3[Ipp(eFD#]df,U1QN*<KQMd$GPQmDZ
+Za@*I[JI?1\,*T7\,!Q5\,Wu;\H]XW]=PVd]_02?`;.@R`g2q_Q2R$FQi>5.c2Z&icd;[;!mSs5
+qof#^#KXp(`Pf[4`;@IP`;@OQ`;dgU`;@aSbl,f`cMl/id/;;kdf7eqeGn(lY5HZHd/h\Eo$mTd
+rR1Ylq<@eAq!7A7qsF=Lq=":OrpfmVrq$-]qt9s^rqH<brqZQiq>:-gr;H-aJcC<$JcF=$J,~>
+JcC<$JcC<$KE(B=qu-Hjp\XmbrV?Hfs,[2:r.tCIr:]dUq=OLSo()_KrUB^QrpKdQr9XILs6BRI
+s60LG!9X65o7R('!0-u:!/pf7rf$o:r/LT4rf-Q/qpb/bp<rqgqgAElrd=Tks*jrqrd=[(r/CW7
+r/U]9s,[5Aq2kT:s,d2AqiLKgr5AEM!64GUqLA.)s-`kRs-`nSs-EbPQ1L7;Q2[$GQ2Ac$bl,f`
+cMl/id/;;kdf7eqeGn(rO8G%:SH#/YT)YAXS,f/VSc,)WS,)=GlM0]5m/-2JmeQ>MnG_tTo)A7[
+o_\=\pAXg`q#:*gqYC$er;?N_rdk*#s+14$s*t~>
+JcC<$JcC<$KE(B=qu-Hjp\XmbrV?Hfs&T/!r)<Xir:]dUq=OLSo()_KrUB^QrpKdQr9XILs6BRI
+s60LG!p3K_mo93`rD`ess&B"ur`8eooN(k=n^I3[r`/hpoMtcfr)Wi"qc<8hr)ir"r)iesou$^G
+q8E?Rr)3Pnr`&\lq,@Dr<E/lr"BJT)=',?#s&T,#rDrkspK$uhr`8p>qTSo_qp,2es3U\ks3gqr
+rm^tuqH!Mqr)E\rrDir!<;KMn<;BPm<;fbkl20c@lgF-:mJQDJn,;bTnb_nVoD\CZp&=[ap\Xab
+q>U6dqu-HjrUBf;s+13$s474#~>
+JcC<$JcC<$K`CK>qu-Hjp\Xpcr;$<drj;^1rilF+rV#sXqXjXUnacSIrUBXOrpKdQrTsOLs6BRI
+s60LGs5s9Ko:,cMrjr-?"h;%O\@8pA[K!W3Zi@B4[J%!-e+M/WdIW\%Q2?dPPE_<=['R-H[C,k>
+rO;X5!4Vd6s0r!;rj`$?r4DR;r58KOrl+o%!1!MIpQbWArg*W.rlk>c$I6uEcd0n]bfn8QrQG5`
+#KXp(`Pf[3`;@FP`;@OP`;dgV_uRsObPfZac2>leci;AjdJqYpe,RqsXn]%!chl)hd/h\Eo@3]e
+r6kPks601@q!.V>oBcDBr9jFMrp]pWqssaXrq--]rq??cqtU0drqcHfrVZTlnG\"=JcC<$fDg@~>
+JcC<$JcC<$K`CK>qu-Hjp\Xpcr;$<drf@):re^Z2rV#sXqXjXUnacSIrUBXOrpKdQrTsOLs6BRI
+s60LGs5j<7mXtLus,?u9rJ^N2qi(Q7oSih!p!W9Uo6gRbpjE'fr/LW5rf-i9qi:c>O84n;O8b7>
+Oo1=4_Yh=M`;[aPIJeQiIJnWpIfPi.R/NHQR/`TSR/`KRQBh*,rKRDJQ2QsGPlStubPfZac2>le
+ci;AjdJqYpe,RqmO8b4@S,8`USc,/[SbnrPSc##VS,_^Gl1jQ<lgsK@mJQDKn,DhUnb_nVoD\C[
+p&=[ap\Xabq>U6dqu-HjrUBf;s+13$s4@:$~>
+JcC<$JcC<$K`CK>qu-Hjp\Xpcr;$<dr`8kprV#sXqXjXUnacSIrUBXOrpKdQrTsOLs6BRIs60LG
+s5j;]mSs*_!E)kp<<#qu<;ons<qo\f<r^YAddGNW<;T\p<r>tt<<#no<WQ9(qc<5grE0)$qcN_s
+o>:FCrP\]Sr)3PnpJh/ks&Atts&B#!!EE+s<<-)!<rc;!<W?,"=8c1u<VTVf=8u;$b4EgTbl5lb
+cMu5jd/DAldf7ere,`NKqc<Ys!*/nqs&K"u!EE+r;u]hn<W#hp;uc(Tl1jQ<lgsK@mJQDKn,DhU
+nb_nVoD\C[p&=[ap\Xabq>U6dqu-HjrUBf;s+13$s4@:$~>
+JcC<$JcC<$L&^T?qu-Hjq"t!crV??cs0Md4riu[3Yct=7p\"FUqXa:KqXOIPq="=NrpBXMrp0UL
+rTX@Gs6'@Cs-iPKrLEku#e@IU\@8uW\$l+?s0VX/osF,6pX&rdpm1]?rfm5B"1#;@Zi7?3[JRE2
+\,*T7\,!Q6\,Wu:\H'5>]DfV@_=thG_tfPfPlR-LQiG8.bl,cncd:%bcd'eZbfe0-bQ#]faMu3<
+`;.=M`;IUP_u[iqqoS`Xq9/c]s3:Jes3L_lrR(YnriPpts3LShs3Ukqe+;)ee,7YmdJrD.kjn!4
+lM9c>m/?>MmeZDOnG_tUo)A7[o_eC]pAamaq#:*gqYC$er;?N_rdk*#s+14&s*t~>
+JcC<$JcC<$L&^T?qu-Hjq"t!crV??crf@&9re^Z2p\"FUqXa:KqXOIPq="=NrpBXMrp0ULrTX@G
+s6'@Cm=Y@ss,?u9",r.sN;8J0N;nn1N:#$ed/VGeI/&$gHMi-fHM`^"N;eh7Nr+k<OH94!s,[2A
+r/pr>rkS<FpVQpIq0i0ipO3!hrg3>GrL*\Qs-`nSs-EbPQ1U=>Q26^GQ'D0fqo\`XrlkDer6G>g
+s3U_ls3g\'rK.&Kqjd\WrLX%[qjdGPr1*_Ts6'@Eo',o6q<Rb@rU'ROqX=FQrpfpWrq$-]r:U'_
+s7cEcrqZQiq>:-gr;H-aJcC<$JcFC&J,~>
+JcC<$JcC<$L&^T?qu-Hjq"t!crV??cr`8hop\"FUqXa:KqXOIPq="=NrpBXMrp0ULrTX@Gs6'@C
+r)EVnp/Lof!E)kp<<#qu<;ont<qfVf<pe</d/VGi<:3ca;ufqq<WQ9(qc<5grE0)$qcNbtrkS<F
+pVQpIr)3Yp;cE?gqGmMq!EE+u<W?+u<rc;!<W?,"=8c2!<VKPe<rc:uans6VbPo`cc2>leci;Aj
+dJqYo<Vfbq<rl9#qG[GprDir!<;TSo<;BPl<;fbqkPaW8l1aK=lh9]DmJZJLn,DhUnbhtWoD\C[
+p&=[bp\Xabq>U6dqu-HjrUBf;s+13$s4I@%~>
+JcC<$JcC<$L&^W@qu-Hjq"t!crV?<brj2R/riuI,r:U![qt'CLqXOIPp[A+LrU'OLrp0ULrTX@G
+s6'@Cs5iX;rjr*>!4_s9!4Dg5rO)X3qQon&rmCGdp!<N\rg*AFs-3GFoo]Td['[0G['[6KqmQI4
+qmc[8q7-I6s1&$<!4r0ApV6U@rPAHLs-*/@op,NBrlb5`s31tud*U+bcHXSWbKA#OrlPAca2Q$9
+pr!*Lr5JTP!6+]RrQ5#\qof#`rltDes3L_lrmCYGqQBhDqU#8i!RfHgeGReodeqJmk5=E>kjRd3
+lMKoBm/HDNmecJPnGi%Uo)J=\o_eC]pAamaq#:*gqYL*er;?N`rdk*#s+14&s*t~>
+JcC<$JcC<$L&^W@qu-Hjq"t!crV?<bs,[2?repc5re^RGr:KmXo()YIqsa@KrpKaPr9XFKs6BRI
+s60LGrT=.Am=Y:q!0$l7rf$`6q2><5oo/mtp<`KYqp,1gq0VOUqi1N4s,Ho9q2b?5s,[2Ar/pu?
+pV6U@rPAHLs*XNg!.ONfr0R/FrL*\Qs-X"WQ^=#'o9B3=qNLuFpW3<TrQ>#\s31JerQbGhs3Ubm
+!KE-;O8P+=S,/ZTSc,/[SbnrPSc,)VRfMUKkPOK3l1sWAlhKiGmJZJMn,DhVnb_nWoD\C[p&=[b
+p\Xabq>U6equ$BirUKl<s+13$s4I@%~>
+JcC<$JcC<$L&^W@qu-Hjq"t!crV?<br`0##pf.1ar:KmXo()YIqsa@KrpKaPr9XFKs6BRIs60LG
+rT=.Ar`&nrr_ibppJgufs&/bor)N_spJpuhrmCGdp!<N\p/V,lpJq&h!*/nsr`B"un5oTks&])"
+rE&a.qnW0HrPJS4p/CcdqGmJp#$"W%<E3(#rDru"r)Nbt!*B,"rDiSmoiLn/rQ5#\qof#`rltDe
+s3L_lrmCF?!EW:p<;fhu<E/io!*&borD`\n!9X4BqrmM5q<IkCq!A"IrU0ROrp]sXqssdYrq--]
+rq?BdqtU0drqcKgr;?Kknc"+>JcC<$f`-I~>
+JcC<$JcC<$LB$`Aqu-Hjq"t$drV?9a!;HGt!4;^2s0DX/!;69^r:BROqXOFOp@%tJrU'LKs6K[L
+rTX@Gs6'@Cs5a:Bj6W97])T>@\,a#:[K*`7[/IE4[.q!%[/828cMu/cQ2d*KPQ-gDOnk1<OoM`e
+[/[K4[/RK2[f*]4\Giu7\Giu;\Gj#=])K>=^@]2=_"s8jPkLCBQN,2.bP]Tabm_qFd*L%`c-4DS
+b0/!-aooi,`Podj_u.IP`Vd[Na8!aSaoBN]bPo`cc2Gohcd:&<XT#?uY5Q]Dd/VJpdaQ\;eGRen
+deqMjk5+9:kjdp7lMTuDm/HDOmecJPnGi%Vo)A7\o_\=]pAXgaq#:*gqYC$er;?N_rdk*#s+14(
+s*t~>
+JcC<$JcC<$LB$`Aqu-Hjq"t$drV?9a"o"%;O,o7uMuS\6M#d5Ho_e=Qo(qnQnFl>LmeuPMm/QDN
+lM]uIkl9iEk5XNDjQ#TZqi(T7rJUZ6qi0s$qp4TRs3:CerHe<coQp@nr/CZ8qi:H4qiLf<s,d2A
+rfI#koY:@?qL&*er-nHiqNprDrL*\Q#+:jGQ^=#'o9B3=qNUisprNEUs2t8_rlkDerQYSmd*R`2
+NW+t7OSt[GSH#/XT)YAYSGA`RSG\lSk5+9:kjdp7lMTuDm/HDOmecJPnGi%Vo)A7\o_\=]pAXga
+q#:*gqYC$er;?N_rdk*#s+14(s*t~>
+JcC<$JcC<$LB$`Aqu-Hjq"t$drV?9a!V]Xo=8Gqr;ulUho_e=Qo(qnQnFl>LmeuPMm/QDNlM]uI
+kl9iEk5XNGjPs3<;uT\p;tO&c;u]_q;uK\n<W6%n<VTVlcg/mVc2(H=<;ohr<<#tr<rZ1s<<#tq
+<rZ7u<q'2j=T2D"=T)=u^@]2=_"pt);tX)i<W#kt<W5tt<W?+u<rc;!<W?)"=8c1u<VKPf=8Ku4
+aSj6\b5BH^bl>rdc2u>=d.LE@=&i8p<<#tt<WQ3"qbmJoqGmGmr)<OUqWI\<n`fr9r9O1FrpB^Q
+qsXORs7-$Xrq$0^qt:!_rqH?crqZQiq>:-gr;H-aJcC<$JcFI(J,~>
+JcC<$JcC<$L]?iBqu-Hjq"t$drV?<brqHGu!jSr4r3ZL0riuLqrU]^QqXOFOp$_hHrU'LKrp0UL
+r9=7Fs6'@Cs5j:A!9<F8"Ics6]".dLqmQI1s0_j5qm-@0Za9G6p<N?UqTJr)rfmDGs-!)<rK@#>
+s0;d6['[0Grj;^5r3lR5qmcX7qmcX7s1&'="1l+V]_9&:^AG\APP17@Q2HsJPld8pbl#Z^bR)P?
+d*U+ac-4DTrlY8as2kJda2Q$9pr!!I!6+lSrl+`RrQ"cUs2k8_rQG5bs3:Mfri?%"riQ+$!7(Ph
+qp>Aj!RfHgeGRendf%Snjn@j4kP496l29iFlh]uImJcPOn,DhVnbhtXoD\C[p&Fabp\agcq>L0d
+qu-HjrUBf;s+13$s4dR(~>
+JcC<$JcC<$L]?iBqu-Hjq"t$drV?<brqHGRrf6o8s,6l6s7H9]p%%tLqXF1Hr9jONqs==Js6BOH
+s60LGrT=.As5X1?o7Hdj!06r9!0$l7rJ^Z6m>Ubap!*?W!.4Nfpj)LXq2P?3rJg`8plG<6rf@)@
+rK7,A!5/$=r4`'CqL&!bqL/KoIX_*ZpmD#Jqj@DMs-E8@rKRGKPEZ!1rl+`RrQ"cUs2k8_rQG5b
+s3:Mfr/C]:rf?u=!1NkUqjd\WrLX%[qOIAPr1*_Ts5it:q<.P:p$)D>rTj=HrpB^Qr9sXSs7-$X
+s7?6^r:U*`rqH?crqZNhqYU6hr;H-aJcC<$JcFL)J,~>
+JcC<$JcC<$L]?iBqu-Hjq"t$drV?<brqHFor`8kqr`&pirU]^QqXOFOp$_hHrU'LKrp0ULr9=7F
+s6'@Cs5j:A!om3Xr_`_pr)EVpq,I2hs&/kqr`&eqr`8bnq,[47p!*?W!*/horDN\qoMtlir`/eq
+s&](umoKKkr`B#"r`9*4p:^C<qnMu*p/C]bqc3\sr`&nts&T,#s&T"sqc<YqpK%#irl+`RrQ"cU
+s2k8_rQG5bs3:Mfo2Yol<E8cmr`'##<E/fn!*&epr)EVns5it:q<.P:p$)D>rTj=HrpB^Qr9sXS
+s7-$Xs7?6^r:U*`rqH?crqZNhqYU6hr;H-aJcC<$JcFL)J,~>
+JcC<$JcC<$M#ZrCqu-Hjq"t'erV?<brV$KhZ*:I9Y5>U*Zi@?2oCqhQnbVbIn,)POmJ?2Kli-2I
+l2TuIkPaQCjo=E@j7Jf<S,\rWRK'o!\d,dU\@8rU[^H+CrNlR4rj;O.!4)U1qR$.EpWW9Qs-*5@
+oTB!3#a)BtZEpmEZa9Y<rjD[4rjVd7rjMp<\,Ei9[fEr:\H0:Rn\"h6s1\;mp6>TBq3D*)bfp".
+r6,Jlcd:"acHXSWbPoZabQ#]faN)9=`;%7D`:_+J`r=$UaT'B^b5KN`bl>raX8f:#XoGR'cMc)d
+d/VJodaRg;r6tVmr6YN*r8mM3q<.Y=pZ_YArTj@IrpB^Qr9s[TrpfsXrq$0^r:U'_s7cEcs7uWi
+qYU6hr;H-aJcC<$JcFO*J,~>
+JcC<$JcC<$M#ZrCqu-Hjq"t'erV?<brV$<cr/Uc9rf$i7s,-jJp[\4OqXF.GqsOFMqX"4Irp'FG
+s60LGrT=.As5a1>l[o.sqi(T7rJUW5r/LH0!/pZ3qp"lZoZQrSs*=<aqKW*fN;/D3N;\b6NqeY9
+OH9@%rf@)@rK.)An\"h6s1\;VoR6Oapm;#J!13PLrgEYNs-NbOoT]<>s-3MH!0m/qrPniWqoJfZ
+s2t;`s31MfqMkN8rf@)@!goCErL<\Ss.0+[s.0%WpmqARr0m]Ir8mM3q<.Y=pZ_YArTj@IrpB^Q
+r9s[TrpfsXrq$0^r:U'_s7cEcs7uWiqYU6hr;H-aJcC<$JcFO*J,~>
+JcC<$JcC<$M#ZrCqu-Hjq"t'erV?<brV$Ef<``B#<r5ns<<)Rao)%tRnFZ2HmeuPLm/H>MlMToH
+kl9iEk5XQCjSn3=;?0Y_<;KPn;ZB\p<;fhq<qfVj<r:/9bk0*P<<#ks<;0Dh<;fhn<rZ7t<pWoc
+=T;Im]`#PD^A1\!;u'Dh<WH/!<<#tu<rQ2#<r5no<rH%n<qf\g`VmgUa8<sXaoBN^bQ#fdc1>!8
+<<#tq;ufkr<;fhs<;TSo<;BPm<;]YpjS\-1k5"3;kkF??lM^&Gm/HDOmelPRnG_tVo)A7\o_eC]
+pAamaq#C0gqYL*fr;?N_rdk*#s+14*s*t~>
+JcC<$JcC<$M?!&Dqu-Hjq>:-erV?<brqHEc"gG25XfST%[/[Q5[/RE.o)/%TnFZ2HmelJJm/H>M
+lMToGkl9iEk5XQCjSn3>iq&T<ReiHP]DfAA\Gir;[f3Z?[^EKK['[6J[/.*3['I!DZhq-0bjWaM
+b5%4iOnt1>Z2_-0ZN@M?Zi7?2[J[K3\,Ei8[fO"JrODj9!4`!<q7?F7qRlTeoT]0;s2kAcbl#Z^
+bR)S@d*L%`c-4DTrlY8as2kGb`l5mq_uIUM_tq=K_u.IK`W!mWa8F$YaoBN^bPnO<X8f:$XT5O&
+cMu2kd*MX:rm:bpe+D/fe,7Yld/`5)jSJ!/k5+9=kkXKAlMg,Im/HDOmelPRnGi%Vo)J=]o_eC]
+pAambq#:*gqYC$er;?N^rdk*#s+14,s*t~>
+JcC<$JcC<$M?!&Dqu-Hjq>:-erV?<brqHEcrf6c5rf$i7qXXRSqsa7HqsOCLq<\+Hrp'FGrojCF
+rT=.As5a1>s5NHurIb-1qi(T7rJLc:Mi<VmNV\S9NJrdRqMbHun&tLKnTt4^qKi!`s,?`4rf$f8
+qi:K5!K`B@OT(=@OSt=<])'&8]`*?VI.Vj_IeT3/R/`NLR/`TOR/`KRQBh0.!L8oJQ2d*KPP`8q
+`;.CO`rF*WaT'B^b5KKbMi<VkNW5%=NsLi7R$jD4S",uFSH#/YT)YAYSGA`RSG\iVj8A!7jmqR1
+kPXQ>l2BoHlhp,KmJcPOn,MnWnbhtXoDeI\p&=[bp\agcq>U6dqu-HjrU9`:s+13$s5*d+~>
+JcC<$JcC<$M?!&Dqu-Hjq>:-erV?<brqHEc!*Abmr`/gcr:0[Ro^D\Fr9a=Hrp0RKr9=4Es6'@C
+s5j:Aro=%<s&82^qG[Dls&8nrrDiespf7/ks30rTpr`8/rDikuqGmMorDWYpq,RJsqGurar)`r#
+qRZO8qRlf)qbm&bq,@>orDj#%<`W6";ufqt<rQ2#<r5no<rQ+p<WQ9&q,dI2r5AEMrl4uYr5eo[
+s2t;`r`/VlrD`esqc*Sos&Aqss&Ako!*&epr)ESm!9="<qW7;1qWIe?q<@kCrp0LKrpB^Qr9s[T
+s7-$Xs7?9_r:U'_s7cHdrqZQiq>:-gr;H*`JcC<$JcFU,J,~>
+JcC<$JcC<$M?!&Dr;HQkq>:-erV?<brqHEc#5,1&XK8J&qm6@2rj;[2rpp$Xqsa:IqsO@Kq<\(G
+rp'CFs60LGr9"%@s5a1>s5O(;lBqge]=YYc\brr9[0*eD['T\;q6U+,s0MU0r6+lXprWKUrf[;D
+r0$W5q2kT\!4)U1!jo;?rj;X3rO2^7r4)^7!P#W<\G`l:\Gj#=](NW3])K;AP4t15Pl$aGQN##-
+bKTn-rlbbnbg+P]cd0n]bfn90ap6,4b/q`E`PhbnrkeNLr5ABIr58NPqo/TTrl=uYs2b;abPnL?
+WqrdrXT$QGcMu5dcihbEdF-MBe,[tneGRendeqMij8.j4jn.^5kPaW@l2KuIlhg&KmJcPPn,DhV
+nbr%XoDeI\p&Facp\Xabq>U6equ$BirU'T8s+13$s5O'/~>
+JcC<$JcC<$M?!&Dr;HQkq>:-erV?<brqHEc!qhS6rf-r:qi1T6repdHrUKdSp$_eGqsF4GrTjIJ
+qs".Es6'=Bs5j:Aro=%<s5EO$s+:3%s+:91#`an(N/WaUN/[[mrf$f8pl,62qMb?qpr`BRrQ+MT
+r-SBgq0Dsu!KE-9NW4t9NVeb6NrY4<O8b7>O8b7@OnH9_])K>?IJS?[IK+cjQi<BOQhm'LRJ`HO
+QN<D;p65TCPl6mIPQ6pB_Yh=N`;@OR`r=$WaT'?_b00dBrf$]5s,R)G".>UIS+rNRSc,/[SbnrQ
+Sc##US,;7BjS@p0k5=E@kkaQClMg,Hm/QJPmeuVRnGi%Wo)A7\o_eC^pAamaq#:*gqYL*er;?N\
+rdk*#s+140s*t~>
+JcC<$JcC<$M?!&Dr;HQkq>:-erV?<brqHEc!;64i!*/epr`/sgrUKdSp$_eGqsF4GrTjIJqs".E
+s6'=Bs5j:Aro=%<s5E-?q,78kr_rhrr)N_spf7/kr6+lXprWKUqGdDnpf@;mr)EYorDi>flrX-f
+!*Aj(r4;m>qbd8hmo06cs&K"u!`rE'r`&ntr`8u!!*8tsqc<\rq,RMt<r,nm_Yh=N`;@OR`r=$W
+aT'?_b00Z^pf@;ls&Jnpr_ierrDiksqbmJoqGmGmr)<LQqW.J6o]H)7rTO+Brp'LKqs=@MrpKaR
+rp]sXrUTsZs7H6^s7ZKeqtU0drqcKgr;?KkmJ_\:JcC<$ir=N~>
+JcC<$JcC<$MZ</Er;HQkq>:-erqZEcrqHBbs7HZ"XK/A#Wi<A3r3QO5[']h=rpfsVp@%nHqsF.E
+r9O@Iqs"+Ds6'=Bs5j:Aro=%<s5<t9nX96@"IZj4]=\'Qr3u^6rNlR2r3Z7*s0D[2rNuFCn&YOL
+qN:]=nr`g2!4)U/!4)U1qR$70rO2^7r4)X5rj_p9!4`$=!4qs8pUU<drf[/Bns'';rQ55cbfe0.
+bPo]mbKS8Xd*L%`bfn90b5]Whb/qcH`l5mq_u7IK_u@UN_>(nH_u@UQ`W!mWa8X-aaeku6W2Zcq
+WqrdocN;D<chbuidF-JBe,@eqe,.Yme,7Ymd/hVRp#Gl/qW7J6rTF.Cqs"+Frp0LKs6]jSr9s[T
+s7-$Xs7?9_r:U*`rqH?crqZQiqYU3gqu,j[JcC<$JcFm4J,~>
+JcC<$JcC<$MZ</Er;HQkq>:-erqZEcrqHBbs7QDOqMb<2s,?r8rpfsVp@%nHqsF.Er9O@Iqs"+D
+s6'=Bs5j:Aro=%<s5<t9nUpakrdk'.!07#:rf%)?Mi3IMMuJ\6NVJJ4Mu/J0am[=Na7+EQHi/3e
+GlWj'MueouqMkN6rJg]7r/Ui<r/^i=rK$r>s,m)dpUU3Mqg@dZp6YcGrKm2ErKdMLp65TCPl6mI
+Pkr5k_Z%IP`;R[S`rF*Ya8j?ZMuJ\3NW#4HR@9V7q4.JUr1<qZqjdJQr1*\S!93\3q;hD6pZDG;
+rTO.Crp'LKr9XINs6fgRs7$'Yr:9mZs7H6^s7ZHdr:p9erqcKgr;?Hjli)J8JcC<$k5Tr~>
+JcC<$JcC<$MZ</Er;HQkq>:-erqZEcrqHBbs7Q:js&T5%<V]\p<W;OenFl>JmecDGm/62KlMKiF
+kl9iDk5XQCjSn3>ir@s;i:0eC;uBSr;c6Nm;[69#;GpFl<)icqs&K,$pf72lqT83Is2Y"9!*/kr
+r)E_rrDiYm!)reqn5emWrE'&$ppg(/s%rborDEMkm8F'e<E9$!s&T5%<W5tt<W6%t=8Ptu<`f3"
+r`/bp!EW>!=8Kc._Z%IP`;R[S`rF*Ya8j?]<r5nn<r5kr<Vobo;ZKeq<W?%q;ZKen<W#ho;ZPhM
+j8%d4jnIp9kPaWAl2KuIlhp,LmJlVPn,MnWnbhtXoDeI\p&Fabp\agcq>U6equ$BhrTjH6s+13$
+s5s?3~>
+JcC<$JcC<$MuW8Fr;HQkq>:-erqZEcrqHEcr:U)j"feQ#W4',2ZiIN3[/TRhn,2VNmIooFli$,F
+l2KoHkPXKBjo=E?j8\-=iVqd-RJE6KRK'hs])T>=[fa(G['Tb=!42X2pp:"+s0M^3ouQsLqo7KT
+s0;^2ZEjJ9qR$4/rjMg8r4)U4s1&';!4`!<qmQ@1r4)]es,m2Bm?@UmrQ>,_!6Y;arlb_mbg"J\
+cd'eZbfg".s2tVhaiVWD`Ph_mr5/?K!6"iNqnW0Hqni?Ms2=iSs2G5_aJG`1VZ*IoW2]crr2]V=
+qToAmdaHUnrRCborRCbor6kMj!RTg&iq)4,jS\-8k5FKBkkjWElMg,Im/QJQmeuVSnG_tVo)J=]
+o_eC^pAXgaq#:*gqYL*er;6HVrdk*#s+148s*t~>
+JcC<$JcC<$MuW8Fr;HQkq>:-erqZEcrqHEcr:TrG!/pi8r/LW5rp][Nr9jILp?_bDrTa7DrojCF
+r9"%@s5a.=s5O(;ro!O'rdt-#!.t#ts,?r:rf$i9!K;s9M?&S5N;eh3N;nh6N:k9fa8<jVHMr3_
+HM`'_HN/s,N/`gWqMkN6rJg]7r/^l<r/^l>rK$r>!0R/eqR?C4rI"Wnqg@dZ!1*>Frg<YNopG]E
+!1!8Br0@;HrP/6FrPABJrkncSr5J]U!QW:XMtr>3NVo.GR@9V7q4.JUrLX%[qOIDQr1*YR!9*h7
+oAf].r8mb:rTF1Dqs".Grp0LKs6]jSrU9dUrpfsXs7?9_r:U*`rqH?crqZQiqYU3gqu,aXJcC<$
+JcG$8J,~>
+JcC<$JcC<$MuW8Fr;HQkq>:-erqZEcrqHEcr:U"is&K,"pK%8nrp][Nr9jILp?_bDrTa7DrojCF
+r9"%@s5a.=s5O(;ro!EJq,@2js&8qss&/kqs&Anpr`&hrs&K/%<qo\n<qXQ0a8<mQ<;KVc<;]_r
+<;]bc<pWod=SoQ'\,<c7;=mc^;uK\p;Zg*%<E9$!s&T5%<W5tt<W6%t=8Ptu<`f3"r`/bpqH*X1
+qnW0Hqni?Ms2=iSs2G)[aST$8<W#no<<#tq<;fbq<<#tu<;KMn<;T\n<;TSoiVVX+j8.j7jn\';
+kPj]Bl2U&Jlhp,LmJlVQn,MnVnbr%YoDeI\p&Fabp\agcq>U6equ$BhrTO63s+13$s6BW7~>
+JcC<$JcC<$N;rAGqu-Kkq>:-erqZEcrqHEcqt1#jWMofq"1>SE[Ipp(n,2VNmIooEli$,El2KoG
+kPXKBjo=E?j8\-=iVqd8htEK7R/NHPQiak0\c02?\-TRP[^W`R['R+<ZiIH2[.q!-ZMh-,a8*aJ
+`TrZcOS=n:Z2q59rNl@-rO)X5s0qp9q7$C6rjMm;rji':o!\LX!0I/As-!DGm?@Xlao9H]b5f]a
+bPo]ebKS92cNMP<bfn90b5]Wgb/qcH`Ph\lrPJEK!5A0ArP8EKr5/KOs2=lT!QLr7V>R1rVl6Pn
+WiE,#d.bl_cihbEdaQ\DeGI_oeGRendf%Pqd*LY.qr.D2o],l1rT3n<roa:Er9=4Gs6KULs6]jS
+rU9dUs7-'Ys7?9_r:U*`rqH?crqZQiqYU3gqu,^WJcC<$JcG*:J,~>
+JcC<$JcC<$N;rAGqu-Kkq>:-erqZEcrqHEcqt9lGrep`6rJg]5qsXINqsF+Dr9O=Hq<@nBroa4A
+s5j:ArT!q;s5Et8s53X)!.s`lrf$i9rf$i9!K;s9M?&S5N;eh3N;nh7N;LZk`q@:NHMi-dHMDjZ
+HN&m)N/dgsqi1W7rJg`8r/^f:rK$u?rK$r>s0_F+r-[US!L8uEQiEHMQhHgFQhH[DPlR'JPl[,`
+p:pRArk\NLs24lTrP\cVregQ1qMYKCQ^@Z<".>UIS,&TSSc,/[SbnrQSc##URf]&:i;;L0iq2:/
+jSe3:k5OQCkks]ElMp2Jm/QJQmeuVSnGi%Wo)J=]o_eC^pAXgaq#:*gqYL*er;6HUrdk*#s+14:
+s*t~>
+JcC<$JcC<$N;rAGqu-Kkq>:-erqZEcrqHEcqt9tjrDrqup/_/mqsXINqsF+Dr9O=Hq<@nBroa4A
+s5j:ArT!q;s5Et8s53WPr`&_mpf.8ls&9"t;Z9Sp<;TVo<;fhs<WQ9&pf7;oqoANPou5oipf6c`
+lrX0gs0_F+r)*2dr)*GkrDW\p%TQJ-=BAO'<``=&='&F&r`&ntr`8u!qc*Yt=8c2!<V]\q<rc;"
+<rfu.^\ttI_>M1M_uI[R`;mpQ<r5ns<qoYo<Vobo;u9Pk;ZKen<W#hn;ubeQiVMR+j8A!:jne-=
+kPj]Cl2KuJlhp,LmJlVQn,MnWnbr%YoDeI\p&Fabp\agcq>U6equ$BhrTF02s+13$s6Tc9~>
+JcC<$JcC<$NW8JHqu-Kkq>:-erqZHdrqHEcqt:!]!36$tri5t*oX+YerU0UNp?__Cr9F+BrTO7D
+r9"%@roF%<s5O(;ro!h6s5*O<p6krJrg3Yrr42j;rjDp<[^EL@ZN@M?Zi7?,Zi790ZN/#9`VRLQ
+_s3B^OSP"=Z2V$0Z*O>7qm?7.s0hp9rOD[4s1&';!k>eOpU'h*qN(Q9!g8b2mZ[dla3">'s2tem
+bK@uNbKS2RbK\?3cNMP<bfn90b5]Wgb/q`F`Ph\lr5&KP_Z%IM^&5V@^])%K_>M1M_Z@]prM9Ii
+r20Ll#,nGuWN+=lpWr``s3^kps3pqrq9o>nr6kMjrQtSjq;D,.qVq80rT*q=qr[n@roj=Frp'OL
+rTsROs6fjSs7$'YrUTsZs7H9_s7ZHdr:p9erqcKgr;?Hjk5Kr3JcC<$mf.e~>
+JcC<$JcC<$NW8JHqu-Kkq>:-erqZHdrqHEcqt:!]rf$`4r/CW7qi(RDrU0UNp?__Cr9F+BrTO7D
+r9"%@roF%<s5O(;ro!h6s5*X)mXb=qrf-l8s,@5AMi3IMMi7Rnrf-]3repc7!64TKqSWBOrHe*_
+mWnklrf$r;NW+t8N<"q8NW5(=Nr4t:Nr>%=OSt7?OS?-Z[JP@DIK"]gI0,XuQM-[FR/30DR/WEP
+QM$ICQ'D95qn;pAqS3$Fs2"WMs2+lU`VYPiMu/J5R/WHOQiibFS"'5Ds.0+[s.0%WrgieRrL<hU
+q;D,.qVq80rT*q=qr[n@roj=Frp'OLrTsROs6fjSs7$'YrUTsZs7H9_s7ZHdr:p9erqcKgr;?Hj
+k5Kr3JcC<$mf.e~>
+JcC<$JcC<$NW8JHqu-Kkq>:-erqZHdrqHEcqt:!]!*B,"s&T2#r)Netqc<\rs6opSr9a4Er9O:G
+q<@kAroa4As5j7@rT!q;s5Et8s53k5qc3)as&K(us&8qs"]J;s;c?Zm;ZKep<W?)#='#&qs&K->
+o#:ID!5n;*s&8bnnQ#$YlW4'gpU'h*ohkWbq,./ir_ierr`/r"s&BA+=&r@'=&r=#<;ons<rH+s
+<<6-%rDrntpf7Ds<rQ1t^&5V@^])%K_>M1M_Z@]poiD)mrDrYls&JqqrDWSmqc!Mo!*/bmqc!=K
+qVh;1pZ)55rT3q=roa:ErTX=Hs6KXMs6]jSrU9dUs7-'Yrq$0^rUp3arqH?crqZQiqYU3gqu,[V
+JcC<$JcG0<J,~>
+JcC<$JcC<$O8nYIr;HQkq>:-erqZHdrqHEcqt9s\!i`3"rMfe(pU'n,s6fjQp[%hDqs*t@roj=D
+r9""?s5a+<s5O(;ro!h6s5!b3q3^lD!go=@r0I>nrOMp:%^rdR[^<EJZEpmEZa7$GpTsh(!42XC
+qS`6Jqni&hrK-r>pQ597s0;L-rNlC.qmHF3s0qs:q7$C6s0r$<!4h^-!4;BZ"-AY-P5^[9PQJeC
+aSj9]b65u2b0%p,bl>iebg-46#0tK;bfe/OrlYJfaiMNB`;ION_?7]m_o)8^rOr3EqnN0Hs2"ZN
+!5nf2rM9Cg!2fXk!iXJmpWr]_!7Ceos3pqrq:#8ir6bGh!71Z%o\fW*qr7G3rT*t>qr[qAroj=F
+rp'OLrTsROs6fjSs7$'YrUU![s7H9_s7ZHdr:p9erqcKgr;?HjjSj`1JcC<$nc++~>
+JcC<$JcC<$O8nYIr;HQkq>:-erqZHdrqHEcqt9s\rf$f6s,$f7o8N_;rU'@Gr9O7Fq!%eArTF+@
+roO1@r8[h:s5Et8s53k5!8[R)!.juspjr?nr/CZ8r/:l?N/NUOMMmDkMu\k3N;eb8N;^`l`;7CK
+_Z+rWHi89bH1lRaN;S\8Nr"_8N;S\8O8b1;O8P%:NrY:?NrY:5ZN.B2I.;X`IeJ0kPa.R.Qi<BK
+QhHgHQN<D;p65ZEPa.O/]`#PC^AG\F_#M7L_>qLHMZ/P4N;o:CQNW\DR[]fASH#/YT)YAYSH#/S
+SG\iVRf;4:i;;L1iq_X5jSn9<k5XWDkl'cFlMp2Km/QJQmeuVSnGi%Wo)J=]o_nI_pAXgaq#:*g
+qYL*er;6HRrdk*#s+14?s*t~>
+JcC<$JcC<$O8nYIr;HQkq>:-erqZHdrqHEcqt9s\rDro!!E3"q<rQ+u<rQ,!meuPIm/62HlM0WC
+kl']Bk5OKBjS\'<irA!:i;_^7h>lC0<Us,`<W?"t<!?2u;H$LnqbmJoqc*\u='#&q!*9';qS`6J
+qni&+pf%2llrEISlrWeb!jkj'o25Ncq,./irDW\pr`BJ.<E3($<`W:&<W5tr<W?+u<rc;"<<-)!
+=8c2"<VTSs=&rC(pq6R=rkA9Es1nZNrPAQPr`/JhpJh/mqGdDlqc*Gkoi1fernmA+qr.G3q;_G7
+roO%>s6'CFrTX=Hs6KXMs6]jSrU9dUs7-'Ys7?9_rUp3arqH?crqZQiqYU3gqu,UTJcC<$JcG9?
+J,~>
+JcC<$JcC<$PQ1"Kqu-Hjq>:0frV??crqHHdqt9s\s7?&crO)[4s0_a2rj;anq!@qEr9F%@rTO4C
+qr[n>s5a+<s5O(;rS[_5!8d\1qj@,Gs-WhQqN_5n\[oBN\Giu;[0*kF[Bok<"LGJAZaBG4riuO1
+qnr$Brk\DmpQ5<8pQ5?9rilR2Z*L\4Zi%3,[K!]7\,Wu5\,Wu<[fO"Lr3?+(s0M3U!0I2Bs-!AF
+plkot_o0R9rQ>/`rQ5,`rlkDc"jG9;cd0l8bl>idb5TQfb/q`F`l.blrPAZS_SWn]]D9,=^&GbE
+^]2+L_#V@OUAgqeV#@.iVZ!Fkd.bl_ciDJke,@ele,7YldJV>kci)_tht5k)iVhd4j8S-=jo"9?
+kPscEl2U&Kli$2MmJlVQn,MnWnbr%YoDeI]p&Fabp\agcq>U6equ$BhrT*s/s+13$s762?~>
+JcC<$JcC<$PQ1"Kqu-Hjq>:0frV??crqHHdqt9s\s765LqMYB2s,6N.!:BRJr9O:GpZ_Y?rTF(?
+roO1@r8[h:s5Eq7s5*h5rS@L*s+0Hcs,6i7s,Hr8"-&7uMuJS6Mt2i+MZA_5_t1bE_>/HUHLlFV
+HN&m%NW+t1NW5(=Nr>%9Nr>"=OSt7<Z21d+Zhf(<I/nZiI0>[qPEhF,Qi<BPQMd'MR$[T8s-EbP
+Q1gFEQ'@NEqn)[:rk8<FrP/BJs1nfSLl$uaMZ8P5MZ/M6N;].AQNW\DR[]fBSH#/XT)YAYSH#/S
+SG\iVRf2+?ht5k)iVhd4j8S-=jo"9?kPscEl2U&Kli$2MmJlVQn,MnWnbr%YoDeI]p&Fabp\agc
+q>U6equ$BhrT*s/s+13$s762?~>
+JcC<$JcC<$PQ1"Kqu-Hjq>:0frV??crqHHdqt9s\s7?7kqc<es<Vohq<W?,!<<2F]m/62IlM'QA
+kl']Ak5OKBjS\'<irA!9i;_[7hYl:1<Uj&\<W?"t<!?2u;H$LnqbmJoqc*f#='&C%<r,hn_t1bE
+_>.($;ZKeh<<-(s<UEiS=8]?"ZN%64;c6Na;#jMi;?'Pk;u]qu=:&&/<E<1%<``=%r`&hrs&T,#
+s&T(u!*9)#rDrqupf7Ju<`Zg/]D9,=^&GbE^]2+L_#V@L<V0>b<<#tq<;fbl<;TVe<;TVmhYZ4&
+i;DR4iqh^7jSn9=k5OQDkl'cGlMp2Km/QJQmeuVSnGi%Wo)J=]o_nI_pAXgaq#:*gqYL*er;6HR
+rdk*#s+14@s*t~>
+JcC<$JcC<$Q2g1Lqu-Hjq>:0frV??cs7cNdqt:!]rpp-\rMfaqr3ZO3rO)O0rjD^kr9O:Gq!%_?
+rTF%>roO.?rT!n:s5Eq7s5*h5rS7M0g\mN6R/r\Ap6Gij\@K2^rO<-B[^NTO[^ENLriuR2[.:O)
+ZEpn6_YV+F^]BOXrK-u?jcBJHrilR2Z*CV4Zhq-+[K!]7\,Wu5\,Nl<\%24:riu6Zr/U]9rK.#@
+!0[8DrfdT%_Sa@5ao0?^bP]KabKS30b6?,8cd0n]rlkDc!6Y;a"j4p-a2Z'p_u%=K\bs&;]DT>@
+^&PhF^Au(HUAgqeV#@.iVZ3OodJ_GdchbugdJhVmeG.MjdeqMkd/VGih>?(*htQ(-iVqj6j8S-=
+jo+?@kPscEl2U&Kli$2Mm/ZSQn,MnWnbr%YoDeI]p&Fabp\agcq>U6equ$BhrT!m.s+13$s7H>A~>
+JcC<$JcC<$Q2g1Lqu-Hjq>:0frV??cs7cNdqt:!]rpp0]N;eb6N;nh9M?&S,Mu\k9m/62IlM0WA
+kl']@k5OKAjSe-<irA!9i;_[7hYl74gtRC2k^W_nMi7Oms,Hr8"-&7uMuJS6Mt)`-Mi<Vk_YV+F
+_#&HVHi&-\H22dbN;\b8NqA>2O8k7<O8=n8NrkE(O7ogWZ1NG>IK+]pIJS?jIK,E3P*;/rp6YfH
+!13\Nrg3YPs-NPKs-EbPQ1U==\bs&;]DT>@^&PhF^Au(JM#W>3M?&M4MZ8P5L]`KkMi7M#r0IPR
+R@9V7q4.GTrgs.\qOISVpRM2Os-ilAqqh2,pYc#/ro3h8roF(?rT=+Bs60FGs6BXMrTsRO!:KgS
+s7$'YrUU![s7H9_s7ZHdr:p9erqcKgr;?Hjj8OW0JcC<$o`'F~>
+JcC<$JcC<$Q2g1Lqu-Hjq>:0frV??cs7cNdqt:!]rpp-\rE&r"s&/qt<W#nr<W?+u<W2:^lhp&C
+l29cDkPF??jo4?>j8S'<iVh^7hZ2O3h#Z<cmo8mY#uji%<)Z[m;c?Zm;ZKeo<<ZE)=&i7$qGmC/
+qSE$D!E2np;uK\f;u]hg<<-(s<UEiT=8&ltZ2IW!;X[K\;Z9Vo=8l;.<`N.#='&F(<`T)tr`&r!
+rE'#"rD`hur`B&!s&Jbnr42a:rO`!?rk8?GrP&?Jq,R)g!*/\ks&Jqqr)<MmqG[&dqc!FKqqh2,
+pYc#/ro3h8roF(?rT=+Bs60FGs6BXMrTsRO!:KgSs7$'YrUU![s7H9_s7ZHdr:p9erqcKgr;?Hj
+j8OW0JcC<$o`'F~>
+JcC<$JcC<$RK)ONqYg?iq>:0frqZHdrqHEcr:U']s7?6\s/Gjp"1>MD[JmN5[e@--li$,Cl2BiD
+kPF?>jo=E=j8\-=iVh^7huDR3h#cBdg]!T;RJiNQQh6RJQ+"03]"5EM\,Wo9[0!eDZi763Za@+0
+Zi7f;_"PMENfT7qOSt71OSk1>Yl:m0ZE^[?r3Q:-q6^42rO2d:pp^43pTOS#!06r;p5]$2rK%&B
+P5CIC^]_Kk`Q-+!aoKW_ao]c1bl5chc-FY]cHZ=3!R&Xbb65u/a2Z*p_u.CM\G<]6])TD?]`5\E
+^A=T(U&UheU].(fV$!TmdF%p>pWr]_!7L_m!7^hnr6kMjr6YJip"fN%r87>.rSdb8r8[e;s5j1@
+s6'FGrTOCKlg+N9s6]jSrpTmVs7-'Ys7?9_rUp3arqH?crqZQiq>:*fqu,FOJcC<$JcGTHJ,~>
+JcC<$JcC<$RK)ONqYg?iq>:0frqZHdrqHEcr:U']s7?6\s,6`4regi8Mi77e!0-sCrTa.ArTO1B
+qW@b<s5a(;s5O(;rS[_5s5*_1"5MYcJ`VF]MtW,0N<+urre^]6mu77^qS;g>oQoeJs*=['rJ^]7
+s,Q`2"HJP(NfO$uqMtH6pTOS#!.4Tjr-SHkq0hj^rfI;HPa.O-QiEESQ^3s9QiEHOQi!-OQ^3p/
+Pl8,f\c',>]DT>A^&Gb@M#N81M?&M4L]N?jqj@;J"IPUFS"'5DrLNt[s.0%Ws./nSr1!_Tp"fN%
+r87>.rSdb8r8[e;s5j1@s6'FGrTOCKlg+N9s6]jSrpTmVs7-'Ys7?9_rUp3arqH?crqZQiq>:*f
+qu,FOJcC<$JcGTHJ,~>
+JcC<$JcC<$RK)ONqYg?iq>:0frqZHdrqHEcr:U']s7?6\s&]/$r`0,!;cHcp<Wc?$<)rou!``3!
+rTjFIpZ_Y?r9*q=rT4(?qr@_9s5Eq7s53k5rS7P1gY;L&qbmJooMtlis&B2$;c?Xpr_`er<)i`n
+qGdMsrDreqrk\HHp:gZ+;H!'arD`Smqc*Mo!*8tsm8j-d!*8bopTOS#!)i\mpJUW\qbmAor`B5&
+<EB*#"'/K(<W,ns<W?,"<s)K)<`]0!!*9)#rDinup/_.%q76I8s1A3As1SEGs&StroiD)moi1rk
+qc*GkrD`YmrD`>dp"fN%r87>.rSdb8r8[e;s5j1@s6'FGrTOCKlg+N9s6]jSrpTmVs7-'Ys7?9_
+rUp3arqH?crqZQiq>:*fqu,FOJcC<$JcGTHJ,~>
+JcC<$JcC<$SH%dOqu-Hjq"t'erqZHdrqHEcr:U']s7?3[qPsRprNug;[C!<L[eI3/lM0WAkl']?
+k5FE@jSS!;ir7p8i;_^7hYu@2h#H./g&RN;RJiKQQh6UBPm4Y)\%&uZ\G`o:[f3W8[C!:>Z3%A>
+[.CU([._92^AknGN<G9&O-#IsO84n8O84e:YH[o/qm6=0!42[3q6^42rO2d:pp^43qQ9_!m>h()
+rf@2DP*5a,%)9Tn_8O=5b0%iKb00_*s31Gb"jP?<cd'f6bR)J8bKJ&MaN)<>qSW<Ls0hg6rODa8
+rjr-Ar4Mm#r1O1dUSI^_r6bMjpWr``!R]?ce,7YldJV>mcd(;Bh"KS%hYl@.i;V^7ir%j:jT"?>
+k5XTEkl'cGlMp2Lm/QJQmeuSUnF?&Io)J=]o_nI_pAXgaq#:*gqYC$dr;-BIrdk*#s+14Ms*t~>
+JcC<$JcC<$SH%dOqu-Hjq"t'erqZHdrqHEcr:U']s7?3[qMbH4!/gZ3oo&m1rp':Cr94+Bq<%Y;
+roEt:s5O%:rS[_5s5*b2s4mY/s4[L'q1%g_qMY--!f`.sre^f9N/W\eMu\k2^\Y\E^%m!5H2ig%
+N;eh9NqA;6NfT6]Nr4t6Nr4t7Xo5EoHiJKiIIhjbOTUf3Q'V-1!LT5QQMm0MR/E<JQiWM<p6>Tc
+qmZO6qml^;s1A3As+gN.r.b?0M2D4h!f;_hq3_)H"IPUFR[a,CrLNt[s.0%Ws./nSr1!_T!8ID+
+p>,Z'rSRJ0ro*k9r8[h<s5j1@s5sCGrTX@Is6K[Ns6]jSrU0gWnaZSKs7?9_rUp3arqH?crqZQi
+q>:*fqYf4KJcC<$JcGcMJ,~>
+JcC<$JcC<$SH%dOqu-Hjq"t'erqZHdrqHEcr:U']s7?3[r`K2%s&T/""Ar&q<)rfrs&8tur`0)#
+<)ik^q!%_?rTF"=rT4%>qr@_9ro*h6s53k5rn[V0s4dS-qGdAks&APh!)rkrs&B%ur_j##;c6Ll
+;cNWmq,R>nr`&r!p:pI<s1SA.s&/kqr)3Gk!*&\moi(um<`]0!lrO$cs&ShpqQ9_!!)rGdr_rGd
+r)3Gos&]A)<`N3"<s)K)<`T)ts&K)"s&T5%=8l5(<E<+#='+rns0hg6rODa8rjr-Ar4N&0rDrhr
+pK%2loi(okqc*GkrD`Yms&AJd!8ID+p>,Z'rSRJ0ro*k9r8[h<s5j1@s5sCGrTX@Is6K[Ns6]jS
+rU0gWnaZSKs7?9_rUp3arqH?crqZQiq>:*fqYf4KJcC<$JcGcMJ,~>
+JcC<$JcC<$TE"$Pqu-Hjq"t'erqZHdrqHEcr:U*^rq$'Yr2Taq%&g)3[^ENO[C!<K[^Pt=qW[tB
+rTEt<rT4%>qW%V8ro*h6s53k5rS@M/s4dP,!87@<s-WbOo9TEAr075h!OfK:\Gs&;[K*`7ZiIN5
+Zi@?#ZN.c;^AGV?]_mchNr+n:Nr>%<OSFn6NrP(?Yck;0Yl_/7ZMh-/ZiIH3[.q'#\,No9XS]-c
+Nr+n:OT1ICP5^[F^]2(R_SjI8b0%j&ao]c1bl,]bc2Gofc2Prbb6?&1aN)<>q833Lp9st0rj_m:
+rjr-ApnIYZ!huHcrMBA<!7:JdqTo8jddbfadf7_od/;5icMuVqg\]e$h>Q4/htu@3iVqj8j8\3>
+jo+<CkNM..l2U#Kli$2Mm/ZSQn,MnWnc&+ZoDeI]p&=[bp\agcq>U6dqtp<frS.=&s+13%s*t~>
+JcC<$JcC<$TE"$Pqu-Hjq"t'erqZHdrqHEcr:U*^rq$'Yr/CQ3!/gW2oo/b3rTO4Cpu_P:roEq9
+s5O%:rS[_5s5*_1s4mY/rn7A*r.+Ehpji?nqMY--!0-u9s,-`4oo&mcqnDs@qRlfRpNca_l$<8d
+rf$i9rf6W1"HJP(NfO(!pQ#66rN,munTt7`pjMg_rK.5GPEhE!p6PfIQi<<LQiEHMQi*3OQBh3/
+p9st0rj_m:rjr-Ar.b9.rJ1E-reCQ2M2D4h!/^N=r0IPRR@0M5pmh;Rrgj+\qjd\WpRM/Ns-iuA
+qqM#'ptbo*rSRM1s5Et:rT!q=roO+@!pAe2rTX@I!:0UMs6TgSrU9dUs7-*Zs7?9_rUp0`s7cHd
+rqZQiq>:'eqYf1JJcC<$K)^?~>
+JcC<$JcC<$TE"$Pqu-Hjq"t'erqZHdrqHEcr:U*^rq$'Ys&]2#r)Ent;H$Lo<W,r#<E)ptr`0)#
+<)i_YrTO4Cpu_P:roEq9s5O%:rS[_5s5*_1s4mY/rn7A*r)ESmqc*8hr_rkrr`&nt!*&qr##nN!
+;H$Lnqc!Moqc3Vr!EW>$<<0f2^AGV?]E1u.;>*of;uK\p<W?%u<VBDl;Zp*"<E</u<UEic=8l7p
+=8f5tXT2;i;Z0Pm;Ya2f;?0br=8l;(=&i7$r`9/%=&o/ts&K)"s&T5%=8Q%t=7]Jd[f3c8\GWo:
+])TD?<W,tt<VKPj<UWoa;uK\m;u]hd;ubSKg\]e$h>Q4/htu@3iVqj8j8\3>jo+<CkNM..l2U#K
+li$2Mm/ZSQn,MnWnc&+ZoDeI]p&=[bp\agcq>U6dqtp<frS.=&s+13%s*t~>
+JcC<$JcC<$U&X3QqYg?iq>:0frqZHdrqHHdr:U']s7?0Zs7-&fri$=)Vl$l0[^NQN[^<ELosOkb
+rTO4Cq<%V:roEq9ro3q9r8@V4s5*_1s4dV/rRq>+f\$1in!=!=qNM,j['d?OrjVs;rjMj7rNuR1
+s0;d6ZEpmCqQg1-rj)[5]tO*OrO_ocs,I)?q2YH8!fi>%pQ,<6s,I&;s0)O-Yl1j,YQ2!-Zi7<3
+Zi7?2[/dZ6[/dZ-\,Nl;Wqi^]Nq\V7OT1IBP5`3%^qmn+`lQ<Fanj-]bKS3/b5ffdc2c,fbl#Wf
+b/q`F`l.em!lW!or3ZF1qR6C4s1&!;oqM>W"JVZeV5<t7pWr]_!7C;brR1\ms3U\irm(>nqqM))
+q;)#+rnmY3ro*n:rT!q=s5j4As6'FGrosIJs6K[Ns6]jSrpTmVs7-*Zs7?9_rUp3arqH?crqZQi
+q"t!eq>K%HJcC<$L&ZZ~>
+JcC<$JcC<$U&X3QqYg?iq>:0frqZHdrqHHdr:U']s7?0Zs7-&Hr/:Q3qMY$*!KH@Bkl']?k5=??
+jSIp9ir7p7i;_^7hYl:1g]6+-g&fs[f`$E`J,"rsN;eb8MYrD/Mu\e8Muo!P^%K&:]D$UHGj9SQ
+MuJ\7NW5%2NW+t7O8+b7NrZ3UX7(E6I/A?cI/K*0P*;/rQM-XGR$[f<rg3YPq3V&I!LB#JPQI,7
+Pl.oe[JI?2\,Wu9\bCmWLAlr2Ll$tGMYNS:QNW\DR@9W@SG\rVScG>ZSH#/TSG\lUReb\7g\oq'
+h>Q40hu)F3iW%p9j8\3?jo+?AkPscFl2U&Kli-8NmJlVRn,MnWnc&+ZoDeI]p&Fabp\agcq>U6c
+qu$BfrS%7%s+13(s*t~>
+JcC<$JcC<$U&X3QqYg?iq>:0frqZHdrqHHdr:U']s7?0Zs7-%gr)F#%;Gg=i;cHasr`08(<)cjt
+<`W6";ul1]kl']?k5=??jSIp9ir7p7i;_^7hYl:1g]6+-g&fs[f]uN:<Vf\p;u]hr<W#eq;ZBYq
+<;TVo<;T\n<rZ/$<kZ3>]`#GB;t<id;sRBe;cQgs<E</u<V'5k=8Z+t=8c1q<rf8rWrQ)f;Z0Pm
+;Ys>k;Z9Vp;?0bq=8l;(=&i7$r)Wkur)E\rs&K,$pf@AqpJq>s<`].*rO)L1rjVp;r42W'rDrqu
+pf@/inPo?`rD`Yms&AJdq:b`#rS75)rSIP2r8@S5s5O";s5a4ArT=.Cs60IHs6BXMrp9[Ps6fmT
+s7$'Yrpp*\s7H9_s7ZHdr:p9erqcEer;?BhgAZ['JcCH(J,~>
+JcC<$JcC<$U]9BRqYg?iq>:0frqZHdrqHHdr:U']s7?0Zs7$*Yr2KdsVu<Ll[K!Z<[C3HM[Iq!,
+kP=9=jo+9:j8J!;iVVR5huDR3h>c:1g\oh0g"=s/Q^@0,!1!;Cs0_m6s0hm8!4Mg5s0D^4rj2R/
+pp9t*s0M[:r4Dj;rjhiaq2YH6q2Y<4s,R,=rf$l]ric:*s0)L/rNlL1!jf8@rNuX6r3ZO5osat2
+po=1NrK$f8s,[2?pQ,<8!0R8DrP&WR_8=13ai_cJqT8l_bfp%/!6tMgs3:Per6#8daiDHA`;RUR
+_uR^NZi.91[J[K4\,Wu/UALYaUB&[8d/_PgchbugdJ_Mce,@_odJqSkcN2>Dr7Uhur7h2*qq_8.
+rnmY3s5F";rT!q=s5j4A!pAe2rTOCKlg+Q:s6]jSrpTmVs7-*Zs7?9_rUp3arqH?crqZQiq"ssd
+q>K"GJcC<$M#Vu~>
+JcC<$JcC<$U]9BRqYg?iq>:0frqZHdrqHHdr:U']s7?0Zs7$*Yr/CZ6re^]4regT2oo&m1rTF"=
+rT4"=qW%P6s5Ek5s53k5rS@M/s4dM+"khP\f78D4J+nlrN;eb8MYrD/N;nh9N;^Ee]DK2=\bCCE
+GjBYPMuJ\7N<#"2NW+t7O8+b8O8,aOHi8?gHi&3hIJ/'cOTgo4Q'IZ$pQkoJQi<9PQ^F-=R/**J
+QiWM<r075H!0m;crNuR3r3lU6s1%fYq1em(!f2]"pR(lF"IPUFR[a,CrLNnYrgj"Xs./qTr0m_U
+f_jFsgAK_(h##q,hYuF1i;_d9ir.p;jT"??joX`0kl'`IlKdd8m/QJQmf)\TnGi%Xo)J=]o_nI_
+pAXgaq#:*gqY9sbr;$<Erdk*#s+p]*~>
+JcC<$JcC<$U]9BRqYg?iq>:0frqZHdrqHHdr:U']s7?0Zs7$*Yr)WhtrD`bns&/krs&K)"!*0"t
+#$"])<E3!trTF"=rT4"=qW%P6s5Ek5s53k5rS@M/s4dM+"52>ZfA]a3<`E!rr)ESms&/kq!*&kp
+r`&\nr`9&!rOi'?qmud;!E<"h;Z9Vk<<#ni<!$!!<W5tt<r>th<WH4u<rQ2!<r,nmWqoWl;u0Dj
+;uKVk;?'Pl;u0Sp=9DW*<EB$!s&K"ss&B,$=',/tr`Akqs&T2$q6U%,rjD[4rjVp;oi2&o=',2u
+!*&\mnPoBarD`Miqbm5g!8.5&pY,Q"rS7;+rndY3r8@V6s5O";s5a4ArT41Ekii!0!p]+;rp9[P
+s6fmTs7$'Yrpp*\s7H9_s7ZHdr:p9erqcEequ$9gg&?R&JcCQ+J,~>
+JcC<$JcC<$VZ5WSqu-Eiq>:0frqZHdrqHHdr:U*^rq$*Zrpg$Xri-+#W2HMirMBM$s0hp7!4;C,
+qW@b<rT*h8rSmh8qr%M3rndV0s4mY/rn@D*s4I>&n<X*>s-3DEr07/e!4Dd6!OoN:[K!W4ZN7A<
+rNcF/!4)O/riuO1r4;U4!4_c_rf6f6q2YB6rf6u;!K<$:YlCp+Z2Us-ZMh-0[/[K4[/IB6[^ELA
+[0*kH\$l(@!4_j'q2Y31!06Z3rK.#Ar4`BM_8F74rQ4oY!mAg3rlY>dc2Q#gc2GlcbQ#]faN)??
+`;RUR_uR(?ZMCj+[/[Q3[K*#kUALVcU<q9]d/_Pgchc#dde2)edf7_od/;5hfDO;!g%a;"g]$"*
+h>c@2hu2L5iW%p9j8\3?jo4EBkPscFl2U#Kli$/OmI'EAn,MnWnc&+ZoDeI]p&Fabp\agcq>U6c
+qtp<drRh+#s+13.s*t~>
+JcC<$JcC<$VZ5WSqu-Eiq>:0frqZHdrqHHdr:U*^rq$*Zrpg$Xrf$l8reg`4s+pZ3qMY'+!0-j;
+rT4"=qW%P6ro*b4s53h4rS@M/s4dP,s4RG)rn$+YpP\g*repf6qht?1s,-l9r4;U4!4_]Iq0;UY
+rcn9b!.+U%!fW%qrf$i9!06]2rf6l:pPo67q5F+9pNusfqgA?jp3c_!"Ho"7Q'V-1#FLjDQC!r*
+Qi<BIQNW\BQBda6PlI!KZ2Cp'Zi7?3[J[K,L\QW(LBE?hQ^@H6r0IPRR@0M5q4.DSrLWtYs.'+[
+pRM/Nrn%)#r7Ul!rS.>,qq_;/rnm\4s5F";rT!q=s5j7Bs6'FGrosIJ!:0UM!q#FDrpTmVs7-*Z
+s7?9_rUp3arqH?crqZQiq"ssdq#/kEJcC<$MuS;~>
+JcC<$JcC<$VZ5WSqu-Eiq>:0frqZHdrqHHdr:U*^rq$*Zrpg$Xr`9&!r)E\r$W0f!;GpFm<)lq!
+<W5qt<W6##<E)rok5FE?jSIp8ir7p6i;_^6hYl:1h#H..gAfk+f`'L]<<#tt;uBVj;ZKep;uTbl
+<W6#!<W'H%\H'/<<<#ks;Z'Gn;Yj>k<;KMn<;ohm<!ZK'<`N.!<*!&t<V'5k=8Q%u=8Q%r=8Afj
+;YO)i;Z0Pm;Ya2i;Z9Sp=Sc+u=9;Q)<r5tu<W5tt<W?,"=85hq=85hr<rfN'ZMCj+[/[Q3[e*Q"
+<rQ1s<rZ.n<Uj&c;uK\k;u0Df;uYDHf_jFtgATe*h##q-hYuF2i;_d9ir.p;jT"?@k5XWEkl0iH
+l2^/KliQSBmf)\TnGi%Xo)J=]o_nI_pAXgaq#:*gqY9sbr:p6Crdk*#s,6o-~>
+JcC<$JcC<$WW1oUqYg?iq"t'erqZHds7cNdr:U*^s7?0Zs7--Ys6g5oWiE"pVPg;grh]V%rjMd5
+oX=e^roO+>q;_G5ro*b4rnmb4r8%D.s4dM+s4ID)rRV/&eX)X!QMZsGPk:.CZEppFZaB\>!k5VG
+rNuO0"1#8=Zi.01Za0M8riuO1r42^7rO;'OpQ#!-r364)#-bD<YctC<rj2U2s0Ma4#.:nI[^NTN
+rj;j:\$rgC[fX(K\,*#sNp2W&OT1FC^AP_K^qmq-aSj6Xao]c1bl,]cbg$.4s3:Mds3(Gb"j+j+
+a2Q!q_Z7XQYl(d*ZMV!.[/[Q3U%4rVT`EF:d.u)hd.u#dciVVAdJVGke,7Yne,@_odJqSkcN)Pj
+fDXA"g%sG%g]$"+h>c@3hu)C6iSrkqj8\0?jo+<CkNM./l2U#Kli$/OmI'EAn,MnWnc&+ZoDeI]
+p&=[bp\agcq>L0bqtp<crR_%"s+132s*t~>
+JcC<$JcC<$WW1oUqYg?iq"t'erqZHds7cNdr:U*^s7?0Zs7--Ys6ouH!/pf5s,$c3!/LQ2rJLZ7
+repK/!fc@)roO+>q;_G5ro*b4rnmb4r8%D.s4dM+s4ID)rRV/&eUW23J,autMZ8V7MYi>,N;ne9
+MY`8.N;ne9N;U6`\G`o.H2Dj]H2DjbH2W'eMZSiqMuAV,N<,'!rJpc9qMkW<NfNt6pNuFXqgJ6e
+!0I&>"Ho"7QBq62rKdJM!LT5QR.cjJQBda6PQ7!HYl(d*ZMV!.[/[Q*L\QT)LRA(-pR(lF"IPUF
+R[a8G!1j+ZrLNnYq47;Nr0m];pXfArr7Ur#rnIG-r8%D0s53b4!o`.urT!q=!9O1A!pAe2rosIJ
+!:0UM!q#FDrpTmVs7-*Zs7?9_rUp0`s7cHdrqZNhq"ssdp\i_CJcC<$O8j_~>
+JcC<$JcC<$WW1oUqYg?iq"t'erqZHds7cNdr:U*^s7?0Zs7--Ys6oqf!*/qrs&K/#;uBMn;uTbr
+<<-)!;ufqt<WlE%<9E?Bjo+99j8J!:iVVR4huDR2h>c:1g\ok+f`9\'f)sUS<E8Nfs&8\ls&8ns
+!`W)sr)EJjs&Atrr)EJlr`8s-qmcU6qc*Pnr)EPls&AtrrDNMkrD`_qs&Atts&9#!<r>ti<rZ7u
+<rZ7u<rH+rVZKan;>O2^;uKVf;?'Ph=8l>$<r5tu<W5tt<W?,"=8>nr=8,_q=8]<#Z2V'+Zi@E4
+[II5s<rQ2!<rH"l<V'/j<E/iorD`SkqGR/g!7pnrrRh&$qV(r'rnRG-s5*e5r87Y8io9pss5X1A
+rT41Ekii$1s69UMrTjUQmdC)Cs7$'Yrpp*\s7H9_rq?Bdr:p9erVH<dqu$3efD^@$JcCf2J,~>
+JcC<$JcC<$XT./VqYg?iq"t'erqZHdrqHHdr:U*^s7?0Zs7--YrpKlgWrAprVZ*FkV#Ib'[^ERA
+[K!Z8[J.-/jS@j7ir7p5i;_^6hYc40h#H.-gAfk+f`'M&f)O8#Qhm$EQ2[$>P6[8UZEggDZaB_>
+s0_p8rNuO0s0DX1rNZI1ZM_'.ZN%H4\,!K+N:`)0Nq&,.N;Tp[Y6(r6Z2Us-ZMq30[/[K4Zj*qH
+[C3NO[/RH9[^W`S[f!T8\@;I6rh][Vqi:];s,Q]3s,d8Arf@,@q2bZ?^:sQ\"i.sk`5]mrans3]
+bKTq."3f$8cMl)ebl>ldap#o.a2c0;rPST;q69k's0DR/q4[JUr1X/:q9])frQtGfr6YGjr6kPm
+p!Wies3Ubkrmgqtpt,JsrRq)%rnIG-rS@M1rnm_5s5F";rSmt?jlQL(s5sCGrTOCKlg+Q:!q#FD
+rpTmVs7-*Zs7?9_rUp0`s7cHdrV?Hhp\XgbpANYCJcC<$P5g%~>
+JcC<$JcC<$XT./VqYg?iq"t'erqZHdrqHHdr:U*^s7?0Zs7--YrpKlHMuJV6M>i>1L]320MuSb8
+MtW)0NW/#7j8J!:iVML4hu;L1h>c:1g\ok+g&K_(fDjG%eGt-hJ,FcqJ,OirI0"eFreg`6qhkE3
+pl+p)r/CZ6s1&!9q6oj>!-n0^q0;j`!.+Wir/1W8Mi7OmoSim3NW"n7O8=k;O,j49rh][Cqg8?j
+s*O9`qgJ9f!e$/lqiM&FPEhE!QM-[DQN*<LR.cjJQBda6Pl7f]Yl:p-ZM_',L]3&'L\ZZ*Q^Ic=
+pmCuG!1<bR!1NhUrga%ZrLNnYq47;NrgWo;r7:YprRh)%qqD&(rnRJ.s5*b4ro!h8s5O";!p&J)
+roX7D!9jCG!p]+;rp0^RmdC)Cs7$'Yrpp*\s7H9_rq?Bdr:p6drqcBdqY^'cf`$I%JcCo5J,~>
+JcC<$JcC<$XT./VqYg?iq"t'erqZHdrqHHdr:U*^s7?0Zs7--YrpKkh<W5tt<W6%u<<,tq;?0Yo
+<<#r#;cH^rr`0#!r`&mXq;_G5ro*_3s53h4r8%D.s4dM+s4RG)rn%2$s4%*Ln5T!X!)ibq!`W)s
+r)EMkr_rkrqGd5i!`lh@r3uL1qc!Jls&8kq!)r_nr_rbnqc!Gm!*/qrr`/tt!EE1u<V0>l=8Q%u
+=8Gtt=8o&qVZ'Kn;?'Po;u]be;u0De;#jMh=8c5&=&rB"=8u;$<W5tt<W?,"=8>nr=8,boYPGF%
+Z2_--ZgLij<r>ql<Us,h<<-"r;uK\k;u0Di;uY>Ff(dkqf_sM#gA]k+h#6(/hYuF3i;_d9ir.m=
+jQ5M&k5XTEkl'`IlKdd8liQSBmf)\TnGi%Xo)J=]o_nI^pAambq#1$fqY0m`r:^*Ardk*#s-!D4~>
+JcC<$JcC<$YlEMXqYg<hq"t'erqZHds7cNdr:U*^s7?3[s7-*XrU1&mW2QVkVPU/dV>d7j[/IB:
+[^EQO[C3L8[eo+air.j4i;VX5hYc40h#?(,gAfk+f`'M&f)O;#eGGR.Q2[$EPPUI@PQ%ieZi@?1
+[K!Z8[JmN6Za0S:rj)R1rNZL2ZEjG8s0DI/r3ZR4N:r2.N9ZE$N;nh5YlCm2Yd1O<Yd(M5Zi@E2
+ZNmkG[^EQP[']h?"LbeK[^Q+C!P#W;V#68RNpr,.OT(C@OSb1?O9:WX^:sQ\"i.sk`5]mrans6X
+b6#o4cMc#dbl>ldb5]T``rX/trknc<r3$"%qlp+*s0D?l!huB^qkEt]rm1)\r6P>grR(PkrR:Gf
+s3^hms3LSlrRLhsq:GVurn72&s4dS/r8%D0s53h6s5F";ro=%>!9O1A!pAe2rojLLlg+Q:s6TgS
+rpTmVs7-*Zs7?9_rUp0`s7cEcrqZNhq"smbpAN\DJcC<$PQ-.~>
+JcC<$JcC<$YlEMXqYg<hq"t'erqZHds7cNdr:U*^s7?3[s7-*XrU9]Bs+pc4M>i>2L]!&.MuSb9
+MtW)0NVhc8ir.j4i;VX5hYc40h#?(,gAfk+f`'M&f)O;#eG+OlJGt&nIe\?jMZ8V3MZ/P0N:r2.
+N;nh3[f!N5[,ZH0GklXbGl3L"N;nh6N:r82NWb?%NfB(rO8=k;O,j17k'[#Rq0W0jrK-r>"d5(7
+Q'Ra0Qi36MQi*6EQNEJ<Q2[$JXo,@#YPYR(Z2_--L]3#3Knb>;L5,S\qhG-;s-NeQpR(lF!1<bR
+!1NkVpmqATq47;Ns-ro8rRLhsq:GVurn72&s4dS/r8%D0s53h6s5F";ro=%>!9O1A!pAe2rojLL
+lg+Q:s6TgSrpTmVs7-*Zs7?9_rUp0`s7cEcrqZNhq"smbpAN\DJcC<$PQ-.~>
+JcC<$JcC<$YlEMXqYg<hq"t'erqZHds7cNdr:U*^s7?3[s7-*XrU0tk<)cjt<`W<$<rZ2!;uBMn
+;uKZ'<E)mr<E3(#<E3!tqr@\8rSdV2rnm_3r8%D.rnID*s4RG)rn%2$s4./!nPoHcs&&ns;H!Kk
+s&/eorD`nu;cETnqG[)epf7-ur3ZO3rDNVn!)iens&&hqp/LcbrD`bp!`W)sr`&kss&9#!<r>th
+<WH4u<rZ7t<rZ8"U]OFk;Z9Pn;XIEU;ZBSp;HEQorE',&<`]-"s&K,"r`&nts&K5'<`N/s<rQ1q
+<r]<"Y5PR$YlD!.ZKtTh<WH.u<;0Da<<#qu<;TVm<;BJi;Z'JjeG[qqf(mqsf`'S$gAfq-h#-".
+hZ)L4i;_d9ir8!<j8e<?joX`0kl0fJlKdd8m/QGQmf)\TnGi%Xo)J=]o_nI^pAamaq#:*fqY9s`
+r:^*Brdk*#s-*J5~>
+JcC<$JcC<$ZiAeZq>L3gq>:-erqZHds7cNdrUp0^s7?3[s7--Yr9jdVWMl_mrh]^mV#6tf[/IB8
+[^EQO[IUd)ir.j4i;VX5hYZ./h#?(,gAfk+f_sD'f%&=MeGn"kQ2[$EPOt"?Z*:L<rNZF1rjDd7
+s0Vg4riuO1rNZF0rNZL2ZEjG8s0DX3r3ZC.oS`[,qi1T6pPo-1s,6l6"0\r5YPtd+Y6_D=ZEUR<
+ZEpn:[/I<9['mEN[^NTNrj;d8\,Ec6[fEr;U\TuIOSk1>OT1C?OSFq=P*,[*s1JBGrP&NO_8F74
+aSa0Wb5BH_bl>udc2PrebQ#`baTBN&`;[XSXSApsY5YX'YkFdiT`1YbUACPabg-46n'M$ZrQtMj
+rR1Ynp!Wies3UelrmUYlrRLktqUb`!rn75's4dS/rS@M1s53h6s5<t;rSmt?jlQL(!pAe2rojLL
+lg+Q:s6TgSrpTmVs7-*Zs7?9_rUp0`s7cEcrqZNhp\Xdao_mPDJcC<$Q2c@~>
+JcC<$JcC<$ZiAeZq>L3gq>:-erqZHds7cNdrUp0^s7?3[s7--Yr9j^TMMh:f!/UQ.r/1H2rf$l8
+pP]*3rSme7qV_A1rndP.s4mV.rS%;)s4I;%!nPoPrm^tsqLAHordX]lp3d1'M2I1KMi*AhMZ8V2
+N:`&-N;nh8[J[E0Zf??2GklX_Gl*F!Mu\e5N:r82NWb?%NfB(sO84e9O8bpSHi/9kIJ/'gIJ\Eg
+IJJ6jIJf3)OTgo4Q'IZ$p6YcEs-NSLpQkoHQ2[!JXSApsY5YX'Yl0@ULAll.KS>-ZLAQc*L'!^/
+Qh-UBQN3EPR/i`TSGA`ST(nlPSH#)Xe+hGkec"(qfDaG%g&0S(g]-(-h>c@3hu;R6i;hm9ir\<'
+jo4BDkNM./klU/9li-8Nm/ZSRn,MnWnc&+ZoDeI]p&=[bp\Xabq>L0aqt^0^rS.=&s+138s*t~>
+JcC<$JcC<$ZiAeZq>L3gq>:-erqZHds7cNdrUp0^s7?3[s7--Yr9j^T<E9$!!*B/#r)N\o"B&/r
+;H*Hls&8qsrDiksrSme7qV_A1rndP.s4mV.rS%;)s4I;%!nPoPrm^tso2PZe!)iYjs&/hpr_`bs
+<;fhs;u9Po;u]hr;tj8d<W9E([/@9/;#jMn;ZK_p;?'Mo;ta/j;uTbr;uK\i;uTbq<W?##<E<+!
+r`/Pj!*B%u!*Ats!*B/pr_i\l!)iJgs&Ahno25Wg<`\usrE')%<r5tu<rZ2"<!QE(<``@'<E8os
+r`Anr!3GstriZ7(rNPTfrDrqur)EDjo2P`i!*&kprD`PjqbmAkrmUYlrRLktqUb`!rn75's4dS/
+rS@M1s53h6s5<t;rSmt?jlQL(!pAe2rojLLlg+Q:s6TgSrpTmVs7-*Zs7?9_rUp0`s7cEcrqZNh
+p\Xdao_mPDJcC<$Q2c@~>
+JcC<$JcC<$[K#"\q#1*fq>:-erqZHds7cNdrUp0^s7?3[s7--YrU9dS!puqarMBRjqP4(trNuX6
+r3cL3!4DU1s5Eh4rSRV2qq_8,s4dJ*s4RG)rR_)#s4.+us3h"sdJ0"+PkpU8Oogc-Z2V!-Z2q59
+rj;^5!OfB7ZN.9,Z2h60ZN%92ZLkL&Z2fdRMtDu(NW"h8MuJV4YQ1m+YlCm4Z*L[>Z*CU@Zi7?1
+ZN.B1[Ka.H['d<M\,<]6\,W/sNrY:>On+V0OoLUCP5pjH]`5_F^]2(Q_8F74aN=G&s2k2]r6,,a
+s3CPerlkDcrlPDc`l?!8_u-S6XS]."Y5b^)T_Y;YT`:\cT_b>abg"GYrQju[rm1Sjr6bJkrR:Gf
+rmCbms3^enr6tJkrRLnuqq(l#rn78(s4dS/rS@M1!8mb5!o`.uro=%>!9O4Bs5sCGrosIJ!:0XN
+s6TgSrU0gWnaZVLs7?9_r:U*`s7cEcrqZNhp&"R_oDRJDJcC<$R/_[~>
+JcC<$JcC<$[K#"\q#1*fq>:-erqZHds7cNdrUp0^s7?3[s7--YrU9dS!UYdAM>i>1LB*)+MZ&J4
+N;nh1Muo!tiVML2hu;L0h>Z40g\fe*g&K_'fDjG%ec+(udfInEr."ZqrdXWjpO3'h!/gc4s,-r9
+M2D1gs,6`4oS`[,pp9t*!-mRMs*F]js*FWhqfqsqs,6r9qi(6.r/Uf:!07#=qMkW<TqVI4r-\?h
+qgA?jqgA<iq0W3kO8G%;OT^i3Q'I[/Qi36MQhm*DQiEBOPl.T\XS]."Y5b^)L&d#-LAlo*K`?c*
+LAZi,LB!V1R/E9NR/WKRS,JlQSc,/USbS`TdJ_Mke+qMlec+.sfDjM&g&9Y)g]-(-h>c=3hu2I7
+iSrkrj8\0?jo4EBk5a`Fl2U#Kli-8Nm/ZSQmfN"Knc&+ZoDeI\p&Facp\Xabq>L0_qt^0]rS7C'
+s+13;s*t~>
+JcC<$JcC<$[K#"\q#1*fq>:-erqZHds7cNdrUp0^s7?3[s7--YrU9dS!:BV`qc3Vpr)<Smqc*So
+s&Aqss&B$WqV_>0rndP.rnRP.r7_2(s4I;%s475#rm^ts!RfBg<;f_q;Yj8j;Z9Vn;ZBSo<W5tt
+<W?"p<<#ns<;ohj<;BPhZi79-;#jMn;u]bq;?'Pn;t*c[;uK\p<W?%t<<-"s<V0;l=8Q"u=8Gr!
+=.u>d;Z'Al;Z'Mk;uK\o;ZTcnoMPci<E</q=8l>%<rc:t<t&,0<E)su<`W:'<`N/s<rH+s<rB#s
+XS]."Y5b^*<9mQ`<rQ+s<;0Da<<#qu<;]\n<;BJh;ZB\qdJ_Mke+qMlec+.sfDjM&g&9Y)g]-(-
+h>c=3hu2I7iSrkrj8\0?jo4EBk5a`Fl2U#Kli-8Nm/ZSQmfN"Knc&+ZoDeI\p&Facp\Xabq>L0_
+qt^0]rS7C's+13;s*t~>
+JcC<$JcC<$\Gt:^q#1*fq"t$drqZHds7cNdrUp0^s7?3[s7--YrU9dSs6Tfarh]^mV"pbeU9h6$
+[JdQ6[J730i;MR4hYZ..h#?(+gAfk+f_sG%f)O;!e-+7Kda?J<Q2?gEPOjq@OcYWbZ*F;4riuL/
+"gbSD[C3IAZN@G;Z2Cm-Zi.30Zi@?0Zi.3-YlM$#MZ&J,N;/D0N;\\4YQ1m+YQV/6Z*L\7Yl_5;
+Zi.91ZN7G@rO)d8[']h?!4Vm7s0r$$rf7&@rK$r>qiUN4pQ5H=rf[PN]Xthh^:sT]s1efS`5]m?
+ao9B\ao0B[bQ#fdcMYrebl>lbaoof*`l5jlWr9!tXSo:#TDbG[U%k;XT`iQ_c-FW5cgT6\ci2;h
+dJ_Mle+V5hdJqSgdJ_Mle,%Snec+.tfDjM'g&0P*gYCT_h>c=3hu;R6iW%p:irS6&roX7D!9jFH
+s69UMrp9[P!:KjTs7$'Yrpp*\s7H6^s7ZKeqtU-crVH3ap\aX]hYr*+JcD2=J,~>
+JcC<$JcC<$\Gt:^q#1*fq"t$drqZHds7cNdrUp0^s7?3[s7--YrU9dSs6]`@rJ:K/rIt</qhkB2
+rJU`7pPf-3ro!b4rndP.rnRM-r7_2(s4I;%s475#rR:u!daHOjq1/?lrI4cps*jin$%@;MI!^3f
+I#<g\M>iD3M>iD3MuJ\8MZA_.MuJY8Zi.3-YlM$,Gj0MKHM`!fGlN'bMuS_9NW+k:MuJ\/NW"n;
+N<#";O8=n:T`0<9I/&-gI/SKlHiSNbHineYO,s1"rfI>IQ'IZ$p6Y`Ds-NSLpQtoG!0m>[rN#q!
+rN6'QqM,!'qh5!'!/CB+rg3/Br0IPRR@0M5rLE\SrLWhUq4.6-rR1YnqUGMprmq#!s4IA)r7V5,
+gt_kas5!b5ro!h8s5O%<!T`AAk5XTEkl0iHl2^/Lm/QGQmf)\TnGi%Xo)J=]o_eC^pAamaq#1$e
+qXsa[r:BmDrdk*#s-it<~>
+JcC<$JcC<$\Gt:^q#1*fq"t$drqZHds7cNdrUp0^s7?3[s7--YrU9dSs6]edq,R;kr)<Smqc*So
+s&Aqsr`&mTrSRV2qq_8,rnIA)s4RG)rR_)#s4.(t"OkfIdF%Pb!)rVirDW\nrDESprDWbsr_r_o
+s&8nrs&8YkqGdO%rNc@+!O,Ju;#jMn;u]bp;#jMn;t3i[;uK\p<<-"s<<-"s<V0;l=8Q"u=8Gtt
+T`.gh;uTYs;,U=kqc*MmrD`_o!)i\kq,.>o<`N1$q,dMss&T2$qH")+<E3!u<E<.%=&r=$r)W_s
+r)WZorN#q!rN6#to2YchrDihtrDibppJpfas&B%ur)<Pnq,@/gs&8^?rR1YnqUGMprmq#!s4IA)
+r7V5,gt_kas5!b5ro!h8s5O%<!T`AAk5XTEkl0iHl2^/Lm/QGQmf)\TnGi%Xo)J=]o_eC^pAama
+q#1$eqXsa[r:BmDrdk*#s-it<~>
+JcC<$JcC<$]`6X`q#1'eq"t'erV?BdrqHHdr:U*^s7?3[s7--YrU9dSs6]jQrh]anUndp`rM0Ce
+s0;X2p9jq/"LkhI[^Q1ErO2a`rndM-rnRM-r7_2(rn.2$s475#rm^tss3gno!mm0rrK[5Drfd&=
+r/gu@rK$u`ril@+$*pnE[C*HMZa6t:Z2Cm-Zi%-/Zi@?2ZN.9*YQ0U[MZ&D0MZ&J/N;\_9N;eh2
+N;\\4YlCm/Z*:F9rNQI/ZEgh7[/RB4['fnAs0_m6rjDU2!1s1Os,[/@s,[2AqiUN4pQ>E;!0dAo
+!PQ5H^BhWk_8=.1a2uI&aSs<Zb5KN`bl>udc2Z#fbPfQeaMu6=W2TZoqPsOq"0A#aT)P>^T_P5X
+T`:VaT`1Yab6,u5cHcC7nBh3]r6YDirR1Ynq9o/f!mo9>rQtAfrR1YnqpbVqs47,"s4IA)rRq>-
+gt_ka!oDhlrnmk:_o)K6!p&J)roO7Ekl0iHl2^/Lm/QGQmeuSUnF?&Jo)J=]o_eC^pAXg`q#:*e
+qXsaZr:BmFrdk*#s-s%=~>
+JcC<$JcC<$]`6X`q#1'eq"t'erV?BdrqHHdr:U*^s7?3[s7--YrU9dSs6]jQs+pc6M>i>1L]3&.
+L&Zr/M>W80MuJ\8Mt`/3NSiXmhYQ(-h#?(+gAfk*f_sG%f)O;"eGn"tdf.Vqd!pQDJGOcpIeA-h
+I/83iMZ/J3MZ/J3MZ/P5N:;c*Mu^-XYQ/tIGl)ddHLuL]H2r6iHM)OaH?o@Frepu>N/W[Qrf$Q1
+rf6u;!07#=qi1ZJr-S?hq0hp`qKr$c!e$/lrf?r<#*G(4Q'IZ$p6Y`Ds-N_P!1EhRpQtoGs/>mq
+qPsOq"0@-.K`6]%LAlo(K`?`+LAlr.R/NBBR/E9NR/WKRRf&]OSc,/USbelVci)5ddJ_Mle,.Yo
+ec44ufDjM'g&9V+gYCT_h#cHjhu;O8iK00#ir\<'jo4BCkNMp0s69UMrp9[P!:KgS!q>aMrpp*\
+s7H6^s7ZHdqtU0dr;-*`pAFO\i;S<-JcD5>J,~>
+JcC<$JcC<$]`6X`q#1'eq"t'erV?BdrqHHdr:U*^s7?3[s7--YrU9dSs6]jQpJpufrDW\n!)rep
+s&8qsrDihrs53h4qVD/+rnIA)s4RD(rR_)#s4.+us3q"rrm:_moMkfgqGR/gs&/bls&Jtr!``2u
+r)E\p"BAE#;cEBhqc*X$poj`srDNYmrDNYos&/hn!)i_nqc!Por`&Ddr)E\r!*&qtr`&ksk#MJR
+r_rhpr_rhps&8eoohtigqbd/e!)rhspfIDrpK.Aq$<:&*<E<.%=&r=$r)W_srDrrsrMfXnri6%#
+r)E8fr)EYq!*8tsr)EGkq,IAmr)E\r!*&kprD`SkqbdJocd2R:q9f/hrR:Ynrmh&"r7Cu$s4RA)
+!o)McrS7P3hr"Fk!oZpNro4(@jlQL(!U&\Gl2U#Kli-8Nm/ZSQmfN"Knc&+ZoDeI\p&Fabp\Xab
+q>C*^qtBsZrS[[+s+13>s*t~>
+JcC<$JcC<$^AlmcpAOmdp\XpcrqZHds7cNdrUp3_rq$*Zs7$*YrU9dSs6]gPs/#mpUnja_U]-tk
+TqJZrZaBJ7s0`*?[^ENO[emQ1h>Z4/g\fe)g&K_&fDjG%ec!u!e'c\DdJqSnch<V%PP:7<OT:LA
+O8k4AYd(J2YlCs4ZEpmE['d:?ZMh'&ZN%92Z2q;9r3-+&"-&7tMuJV4M>W80Mt)`+Mtr>1Mu0aY
+Y6;,7YHY81Ylh59ZEsJ9rj)X4[JmT7[JmQ3[J[H8O-#HcplPK;rf@,@ooT39rK@#>!Kt(m]E,^[
+rkA`S_84",a2lBErlG&[r6"u]"O,09bfp%1!mJj2rQ52^`l@qSrM]^prMg9pS"-%@StD[KTqS3T
+rLs.^rLa+_!29A7"3f$8cMl/aciDDgd/MAjd/DAidf%YjdeqMjcMc)fd.u)gdf._neGe"uf)=5#
+f`0Y'g&g$ah#?.0h?Mlqi;^^4ir8!<j8e<@jp1)5kiq?slKeH9s6TgSrU0gWnaZVLs7?9_r:U*`
+rqH<brV?EgoDA7ZoDR\JJcC<$SH"*~>
+JcC<$JcC<$^AlmcpAOmdp\XpcrqZHds7cNdrUp3_rq$*Zs7$*YrU9dSs6]gPs,$i6M#<&.LAZ`,
+LPUfaMZ/P5N;nh1Mu\k6h>Z4/g\fe)g&K_&fDjG%ec!u!e'c\DdJqSnch;kgIK=kGomQjfs*OWh
+!f2\jrJCQ3r/(H2s,6l8n;@=+Yl(^(Y5`hAH2`-WGlW*`Gl`5:q2>62!f`.trepc7pPo04rf$o<
+rf?r:!.+Nhr-\Hkrd4]mp3c[_qg8EmO8Y1>O8P(DOckroQ'Ra0Qi36MQi<?PRJiNLQNEJ>QMdZZ
+W;`dpWr%DMKS>-VLAlo,K`$Q(L'!-sR/NBBR/E9NR/WKSR[a;HpmqATq47GRr6G8erQtAfrmLep
+r7(_rs47/#s4IA)rRq>-gt_nbs5!t;i8DtCOQ-9"s5X1AroOIKkih9qlK[^7m/QGQmeuSUnF?&J
+o)J=]o_eC^pAXg`q#1$eqXaUXr:BmHrdk*#s.'+>~>
+JcC<$JcC<$^AlmcpAOmdp\XpcrqZHds7cNdrUp3_rq$*Zs7$*YrU9dSs6]gPpf6udrDW_o!)rep
+r_rhrrDiksqVD/+rnIA)rn7>(r7Cu"s4.(t!n5TGrmCbms3L77qbm2f!)ibms&&ns<)riq!*/kp
+s&8nrs&8Vjr)Ea$r3-+&qG[8hr_iepr_WYnnl#Ndo2GNcs&B%ur`/qsr`/,^"&r9"<;9Dk<;oer
+;YF#h;Yj8f;?9]tr)WPnr`Jnrs&KA)<)lq!<``?#<<H9'<`]-"r`8rprM]^prMolrrD`;erD`es
+!*8qrs&9#!<;0Dg<;ohq<<#tu<;]\n<;BJj;Z+i=ci)5ddJhSne,7_pec45!fDjM'g&9V+gYCT`
+h>c=9hr*F::/BmKj8\0?jo4BIkNM-ol0@R"rp9[P!:KgS!q>aMrpp*\s7H6^s7ZHdqtU-crVH-_
+pAFO\ir4N/JcD8?J,~>
+JcC<$JcC<$_>i3fpAOgbq"t$drV?BdrqHHdr:U*^s7?3[s7--YrU9dSs6]gP!:0W\"/M]fV#I+i
+U7qRZ#bS9(Z*L^D[C5n=#.D"M[C*HOqmZU]rnRM-qqD)'rn./#s475#rRCkrs3gnos3LhncHc0K
+qNLc=qiUf<rf7YqZ*CO<Yct=8Z*CU?Za7$H[/RB2Yl_/7Z1tX(ZN@G8Y557$NK!jponr[*oo/^)
+rJ^`6s0)@)s/uR1Yck:8rilR0ZEgh7[/RB4['fnA!4Dg5rO)X5s,R/ArK6l:!0R8BqN(N8s,m8C
+qN1c@qRcjB^AbkQ^qmk)`Q-'Aao0<Zao0B\b6#o4c2PrdblZ,4bPfQaaMn+TqPX=k%&oY`R[]h<
+SXuFFTqVFZ!297^rLa+_!6Y8`s31Jfs3LGdrQkGhrQkMjrR(Slr6tJirR(Vhq9JrbrQtGhrmLep
+rRChss47/#s4@>)rRq>-gt_nb!oDi7rPSZps5X.?!9O4B!pAe2rojIKli-8Nm/ZSQmfN"Knc&+Z
+oDeI\p&Fabp\Xaaq>C*[qt9mZrSmg-s+13Bs*t~>
+JcC<$JcC<$_>i3fpAOgbq"t$drV?BdrqHHdr:U*^s7?3[s7--YrU9dSs6]gP"7(f"M#E,.LAQ](
+LB`QkMMd=LMZ/P5N;eb1Muo!ph>Z4/g\]_)g&BY%fDjG%ec""te,RkqdJqPpcd'i1J,auhIK+]p
+Hhi!fM#W;3MZ&A3MYr>1MZ8V7N!"uqMi..bs/u4#s*EXLq0;g_!IB%eMuAS9NJrhqMuJ\0NW+t;
+N<#"<O8Y+=HMMpbHiSToI/83fI/&$gI/SHnIf#6+O8P(FOcu#pQ'R`&R/!$IQMm0MQiNQQR/*'K
+QMm]WVuEUpWVD)IKS>-VLA6K&LAI8-R/E9NR/WKVR[]e:SGA`RT)"rUSGpe/cMc)fd/25idf._o
+eGe"uf)=5#fDsV'g&g$ah#?+2hVZWXNsCd+ioB([jQ6C'!pAe2rojIKli-8Nm/ZSQmfN"Knc&+Z
+oDeI\p&Fabp\Xaaq>C*[qt9mZrSmg-s+13Bs*t~>
+JcC<$JcC<$_>i3fpAOgbq"t$drV?BdrqHHdr:U*^s7?3[s7--YrU9dSs6]gP!:0J]pf%Q"<)cdq
+<)Zap;uT\l<<#ns<;fhs<<(eRh#?(*gAfk*f_jA$f)O;!eGn"tdf.YociVP=cLXs(;u';o<)Zaq
+<W,ks<Vf\p;uTbr;ta2h<WB5uXoD;i;uBPd;u'>g;ZK_p;uBVk<W5ts<U!Qa<;fes<;9Aq<)Z[m
+;,R6hr)3Snpeguf!`N0%r)WPnr`Jnrs&T,!r)Wbr"'/K(<r?&!<rJolVuEUpWVf]o<<#ts<qfVm
+<;9Jm;uouupJq#grDW_qs&K%tr_r_oq,@5irlt8arQkGhqpGDkrmUhqrmh&"rR_)%!87>)!o)Mc
+rnRY4hfeuo#>a@=j5]4]jo4BDkNM./klL)8rp9[P!:KgS!q>aMrpp*\s7H6^s7ZHdqtU-cr;-!]
+p&+I\ir4N/JcDABJ,~>
+JcC<$JcC<$_Z/?hp&4abp\XpcrV?BdrqHEcrUp3_s7?3[s7--YrU9dS!:BaOs6BZ]r1s@f"eq]`
+TV%kUSd2F%Yd1UB[C5n=s0`-@[C*HO\%)@Fs4dG)rn7>(r7Cr!s4.(ts3q"rrmCbms3L\i!6t)!
+!0d8BqiUZ8(6>])Z*:I9Yck77Yd(L>Za7$GZEga?rilC,qm-1,!j\r1r2fpX!0$l7pknm*repi8
+rJ^E-rf$i7ric7(s0)I-!jAi4rNZC.!42U1s0Ma4"LY\H[C-"@rNug;O,f6]O8P.6OSOt6OSt:A
+OSk7@OoW,j]F;Kf^V@S"_84%.a2uI#aSs<Zb5TQcbg"E2bl>ogbfft-!QiF^V#@.hVZ!CmRJ`NR
+SH#,bStD[LTq\9TqOmbY!m/U-rlb>c!6tMgs3LGdp!<ZbrR(SlqpYGjrQtVgrQP5bq9Jucrm:Pi
+s3gnqrRCkts47/#!nc2Zrn@D,!8RS0!<;r6s5O%<!T`AAjoX`0kl0fIlKeH9s6TgSrpTmVs7-*Z
+s7?9_r:U*`rqH9arV?Bfnb`"Wo_mkMJcC<$T`9N~>
+JcC<$JcC<$_Z/?hp&4abp\XpcrV?BdrqHEcrUp3_s7?3[s7--YrU9dS!:BaOs6BZ@r.k<,r.Y*&
+reCW4M2@+Jre^`8MuAV7Mu8M6NW+n:NW7c1gA]e*f_jA#f)O;!eGn"tdf.Yod/VGkc2c,bJ,aug
+IK+]pHhVjcM#W;3M#N52MYr>1MZ8V7Mu\e8MY)i,Xo,:#HK0;DGl)adMYW2/MunutN;eb6N;/D4
+Nr=q;NrG+>NWaZRH$Xf6HhVp`Hi8?fHi/9kI/o?*OT(==O9gu4Pa.Q#Q^=*8Qi36KQiEEQRJiNK
+Qi<fZV>d@jVu;5JK)1*$KS>-VLAur-LAZ`+Q'V<6nX06@!1<bR"IbgLS=KDGqk!\UrL<l2rQP5b
+q9Jucrm:Pis3gnqrRCkts47/#!nc2Zrn@D,!8RS0!6Y5#!g)F$ro4%?jo4BDkNM./klL)8rp9[P
+!:KjTs7$'Yrpp*\s7H6^s7ZHdqY:$br;,s\p&+I\jSj`1JcDDCJ,~>
+JcC<$JcC<$_Z/?hp&4abp\XpcrV?BdrqHEcrUp3_s7?3[s7--YrU9dS!:BaOs6KP^p/D,o<)cfp
+<;ohr;YsGn;uTbq<W5ttg\]_(g&K_&fDaA$ec""te,RkqdJqSnci22ic1P!*;ZTcpq,75k!E<"s
+;ufkr;ufqo;ufkr<;ohj<;fhsXo,:";WLdL;ZB\p;?0Sn;u9Pj<W5ts<V9Am<VTSt<)Z^p<;ont
+<;9Al;YX,f;YO&f;ZB\p=8Z+n=8uCr<rc;"<W#nr<<?3&<r?&!<rSonV>d@jVuBZp;u]hp<W,to
+<W#es<EArrr`&Pjq,I;ks&B"urD`eqqc*GkrDEX=rQP5bq9Jucrm:Pis3gnqrRCkts47/#!nc2Z
+rn@D,!8RS0!cq(1r_<Mjio9st!T`AAjoX`0kl0fIlKeH9s6TgSrpTmVs7-*Zs7?9_r:U*`rqH9a
+rV?Bfnb`"Wo_mkMJcC<$T`9N~>
+JcC<$JcC<$`;eTkp&4^apA=gbrqZHdrqHHdr:U*^s7?3[s7--YrU0gUmHsl=!pf.:r1s@f!MZ:d
+TDb>fSZ]-"Z*LaE[^Q%?s0`'>[^EQPrjVj9rn@A)rn./#s472"rRCkrs3gkns3LblrQYJhbfosK
+!0d;ErKI/BrK.,BOnOn:YQ(j-Yl(^(YQ1s,Z2h61Z2Cj+Z2Cp*Zi7$)WW\<?NJrh[MuAV/MuAV6
+MZA_8YPbX)Y6;)7YHY80Z2_*0Zi%31ZN[_D[C3NOrNuR3!0@)=!KW?@OnOn4O7n\8Oo:ICP5r2i
+]FMWi^VIY$_Sa=3a2uHEa8O*Yans6\b6#o4c2>cec-+</b5S14V#I1jVYuq]RfAoXSc>8]TDkM_
+U&1M]TE!%5b5TTabQ,oecMl/bd.P]bd/;;ide_Gjdf7\pb5'6[bl,f_cMu5id/;;kdf._oe,n1O
+f)=2%f\+sWg'$0ch#%'H_ZA`Uro4%?jo4BDkNM./klL)8rp9[P!:KgS!q>aMrUU![s7H9_rq??c
+qY:$bqtfdYp&+L]jo0i2JcDMFJ,~>
+JcC<$JcC<$`;eTkp&4^apA=gbrqZHdrqHHdr:U*^s7?3[s7--YrU0gUmHsl=!pf.:r.k<,s+U6$
+rJ(]8M2I4LMMd@OMuJ\8Mu&D2NW.Z2g&BY%fDjG$ec""te,RkpdJqPnci),jc-4E/J,aufIK+]p
+HhMd]M#W;3MYi81MZ8V7N;nh9MY2o,X8]-VH1uRZGlW`tMuAS9NJrhqMuAV0NW5%;N<#"<NrXM)
+H2W'fHiJKmHi8?fHi8?fHi/9kI/o?)OT1CAO:723OHG]iQ'IZ$Q^=*8Qi36KQiEEQRJiNMQi<cV
+V#I1jVYu/GK)1*$KS>-TLAcf-Pa.R3Qi!-MQhZsGQN3EPR08tJS"-#ESberUSc>2[b5'6[bl,f_
+cMu5id/;;kdf._oe,n1Of)=2%f\+sWg'$0cgr@J5NrkF%ir7s=jQ6C'!pAe2rojIKli-8Nm/ZSQ
+mfN"Knbr%YoDeI]p&=[ap\O[`q>:$Wqt9m[rT4$0s+13Fs*t~>
+JcC<$JcC<$`;eTkp&4^apA=gbrqZHdrqHHdr:U*^s7?3[s7--YrU0gUmHsl=!pf.:rDibpr_r\n
+s&K(u#uaf&<E)mq;GpHk<<#np<;fhrgA]e)f_jA$f)F4ueGn"tdf%SnciDDjc2u87bkG$.;u9Jk
+;>jAp;cH^pr`&hps&8tuq,@>mr`&kqpJh,lri?$u!)rhojAY\Kr)*Glqc*Dlr`&ksoiD)mqc<_r
+r_rhrr`&qtpJV&ilr!^Zs&/nur`Attq,dSup/h8prDibrr`'&$='&H#=8nukV#I1jVY='Z<W#et
+<E</t<W5tt<<-"n<V]Vm;u]hs<W#er;u0Jk;u]_qb5'6[bl,f_cMu5id/;;kdf._oe,n1Of)=2%
+f\+sWg'$0cgi7B6:&[lh:Z:=4irS6&roO:Fkii$1!UB"Mm/QGQmeuSUnF?&Io)J=]o_nI^pAXg_
+q#1$cqX==Sr:U$Mrdk*#s.fUE~>
+JcC<$JcC<$`rFloo_nR_pA=gbrV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6K^M!9sKYrhBLf
+T`(M]T)Y>gXfeh1Yd(OA[C3O?[0="J[^EQPrjVj9!87A(qq(l!rmgtss3q"rrR(Yls3L\is31Vh
+bKKgJooo?;rK6r<rK$r>#*4eJYHY:9ric@)rNQ:+!OB'2Z2Cj*Z2M!,Zi-p(WW.qWN<"q-MZAY0
+MuAS7MuJ\7Mt`2/YPbX)YQ(j,YQ(j+Z2V$0['Tb=s0Da5[JmT7[JdH6[?$CHNWY?(OHK@#!0R5A
+qN(?3!0R5Crf[Ao]D9)O]t_=t^qmn*`5]j>aiMNCaN4>%qo\r^!R/gdbQH,6bfg".s.TCcrhKFf
+qO.AP!LoVXSc>8]TDkM`U%k;\aT0K]bQ#cdc2Q#fchYr[cN;J@df.YmdeM;jdK%\oao0BYbPo`a
+c2>ldci;AidJqYpe,@ereH"2!f)jUXg&B\,p%ZK$_ZA`Uro47EjlPXekND(.klL)8rp9[P!:KgS
+!q>aMrUU![s7H6^s7ZHdq=spaqtfaXpAFU^k5Kr3JcDPGJ,~>
+JcC<$JcC<$`rFloo_nR_pA=gbrV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6K^M!9sK<re:E,
+p4W<u#)J+nMi3INr/CW5qi(K5!87A(qq(l!rmgtss3q"rrR(Yls3L\is31VhbKKg5s*jQfs*Xip
+!.=cmom6@g!/gZ1reg`6"H87sMMh+crMomskB[)RqKW'crd"KfpNZdrMYW2/MunutN;eb5N;AP5
+Nr4k<O*Z-MH2N!gHNJM?HMi-iI/83^I/\KlHi]=iqN1`<s,d8A$BUC5Pa.N"QC!r*q3V&GrKdSQ
+R@4#@r0RGWrM':drM9CEqL\Qr!ec8]p4iU3!1*JJqj7AMq3_)H!1<bR!1NnVs.&nUpn%JU!1a&1
+rQ=u[rlk>cr6G;fs3U\ks3gqrrRCkt!7q,#!nc2Zrn7Cg`;>VpO9+>"ro47EjlPXekND(.klL)8
+rp9[P!:KgS!q>aMrUU![s7H6^s7ZHdq=spaqtfaXpAFU^k5Kr3JcDPGJ,~>
+JcC<$JcC<$`rFloo_nR_pA=gbrV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6K^M!U3V^<;fbk
+<;ont<<#nq<!-&s;H*Kms&8hprD`jNrn.,"s472"rRCkrs3gkns3Uelrm(Pg!mJj2pepc`rDNJh
+rDEVorDWbqr`&hps&8tuq,@>mr`&kqpJh/mrMomsr_ieroi(cds%rbop/:rhr_r_mq,.)hqGd>l
+r`&ks!EN4p<rZ1u<rZ/"<;ohr<;ons<;]Yt<)Z^n;X.-Y;ZBer=8Z+p=8uCr=8u>"<W,ts<<-(r
+=9"umUAgqdV"RdT<<Q9"<*!&r<W5tt<<-"o<V]Vl;u]hs<Us,g;ZK_pao0BYbPo`ac2>ldci;Ai
+dJqYpe,@ereH"2!f)jUXg&B\+DK,MJr_<MjiSsjs#NY".k2tjikl0fIlKeH9s6TgSrU0gWnaZSK
+s7?9_r:U*`rqH6`rV??emec_Up&4%PJcC<$V#Pr~>
+JcC<$JcC<$aT(,ro_nO^p&"^arV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6K^Ms69QZs.]Uh
+T`(M^T)5&cXfeh1YHbF@[C3O?[0X4M[^ENO[^WaE\GXtYf)F4teGn"tdf%Snd/VGjc2u87bl5cc
+b5RXuPPgUBOnt.@O,f8!O8k4?NW-*fYd(I9Y-5"2YHRl.!O8s0YlM!+Yl:p+ZMh-.W;_bTN<5&s
+MuJV-MZAY0MsZK&Xobf0YPbU/YHY77YHY81Z2V'/Zi7<6Za@*IrjDg7rj2`eO,s-trf?r<rfR2A
+qiCH4!0R)?s1/3Bq7I0N^V@S"_8=+/`lH3CaSs3[aSj6Xb5]Z]bQc>9bfe/OT_Y;]UA:5TRK8nJ
+rLEt\TCnlUaT0K]bQ#fdc2Z)fchc#\cN)>kdK%\mdeD5jdeq2bao0BZbPo`bc2>leci2;idJqVp
+e,@ereH"2"fDjJ*g"Plarl"WM!TE&;is4Z,jlY^gkNMp0!UB"Mm/QGQmeuSUnF?&Io)J=]o_eC^
+pAOa^q#'saqX47Sr:^*Prdk*#s/#aG~>
+JcC<$JcC<$aT(,ro_nO^p&"^arV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6K^Ms69Q=s+^Q-
+p4WI"!/CE,#)J+nMi3INr/CW5qi(K5r7Cu"rmgqrs3q"rrR(Yls3LYh!mSs5rlY;ardXfos*alo
+!.Fios*a]j!.4BbqhY9-reLT3M#<,/MYrD4MY;u,W;(Z;Gk64ZHKoeUM>iD0MuAS9NJrhqMu8P1
+NW+t:NW+8#H1lRYHh;^^HiK0-O84kJO-#HaO-#HdPa.N"QC!r*q3V&Grg3YPs-`hQrKdMWq4[h_
+q1JNqr.>!&re:3's+gT<!L8uIQi*6MQhm*IQN3EPR08tJS"-#DSbJ`USc$S-ao0BZbPo`bc2>le
+ci2;idJqVpe,@ereH"2"fDjJ*g"O'OqiCZ:!TE&;is4Z,jlY^gkNMp0!UB"Mm/QGQmeuSUnF?&I
+o)J=]o_eC^pAOa^q#'saqX47Sr:^*Prdk*#s/#aG~>
+JcC<$JcC<$aT(,ro_nO^p&"^arV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6K^Ms69J]r)<;g
+r`';);c?Xq<E)mp;cETnr_rbprDidIs472"r7(bqs3gkns3UelrQYJhbfp(0!6Y.9oMbWbr)*Gk
+s&8kq!`N&sr_rtu;GpHe<<#nr<<#nj;ufqsVu]jrrD`Gg!)i\k!)iDes&/Pfr)<Gkqc3Vpr)NJl
+s&K)"r`&qtr_reqs&K%trDW\pr_iepkY_=[rE&ntq,dSup/h8prDiesrD`huqc<cjq4[h_nl5'X
+s&/qt<W6%r<W5qt<W5to<V]Vm;u]hr<Vobq<V]Vo;uF`8ao0BZbPo`bc2>leci2;idJqVpe,@er
+eH"2"fDjJ*g"L1Wqb@#a!`.e7ro47EjlPXekND(.klL)8rp9[P!:KgS!q>aMrUU![s7H6^s7ZEc
+qY:!aqYKXWpAFX_kPg&4JcDSHJ,~>
+JcC<$JcC<$aoC8to_nO^p&"[`rV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6B[MrTOH\USFQV
+rLX(]q4.qaX/rJ,YHP18['d?Nq6^I9\$`WP[^WaD\Gt.Zec""se,RkpdJqSnci)/hblGudb6,o/
+acuF]rK@,Aq2bT;pPo65riZC-Z*F50qQBq(Z2(X'Z2M!-Zi6m#N!#&uN/RUks,6`2s,-l7pl"^%
+",i+sMuBd[YHG),YQD#4Yl:j+YlD!-ZN%9/[/[Q6[K<kD[/5j`NVeb9O8b4AOc]O(s,d,=pQ5E;
+q3(`g!5&'>%)0Kk^qde'`5Ta:aiXM%!6G)[rQ>,_qTK)ebfn8QrLa%]s.T.Sr0dYUSGo)ZScGDW
+TE*.5aT0K]bQ#cfc-FW3chl)]cN)Agde;,i`r3sSaSs<\b59B]bl5lccMu5jd/DAldf7eqe,n1O
+f)F8'io]OorP\QM%H-4)ioB([jlPXekND(.km-M>lg4!*mI'rA!q>aMrUU![s7H6^rq??cq"Xd_
+qYKUVp\adakPg&4JcDYJJ,~>
+JcC<$JcC<$aoC8to_nO^p&"[`rV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6B[MrTOE>L5(EU
+K`6Z,KS>0XLBWNlMi3IMqi(N4r/CQ5s472"rRChqs3gkns3UelrQbGf!6kDb"3Sa-J,+QmIIhj_
+Hi&-hHN8BhM#W8/L]N?gqhb?1rJU]5pP]$Kqg&!^s*=Hcqg&0ems,+^H$OXjLl)+gqht<0rep]5
+qMkN8rf-Pqr-A?gr-J0coR-L^"-8P*O84kJO-#HaO-#HePa.N"Q^=),q3V)HrKmPOs-`hQrg3SU
+rLj1ap4N3nre(3'pP&[5rfdGKQMQsGR/NBKR/NBOR/WKVR[]e:SGA`LScHe/a83mVao9H[bPo`b
+c2Grfci;AjdJqYpe,Ihue^i=Nf)r4^\%DR!qiD9FiSrkWj5f=`k2tjikl0fOlKdd&m-X3.rU0gW
+naZSKs7?9_r:U'_rqH3_r;$3cmJHYUp\j:SJcC<$VuM8~>
+JcC<$JcC<$aoC8to_nO^p&"[`rV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6B[MrTX;\r)<>h
+!`N&trDikr!*&qt"&r2t;YsGn;uK\n<WCYLec""se,RkpdJqSnci)/hblGudb6#i.ao#'/;t<fd
+;u0Gp;cH]p<!-&s;H**bs&8hps&K"srhoWmpJ_#gqGI8jpJV&io25B`qGd>lr`&eqpf@Aor)EYo
+p/D#jrD`eq!)iAbr_iSirDrkur)WVps&etrs&T,!r)Wbr!*9#!rLa%]s.Ss^nl>Zgr_ihs<W6%r
+<W?%u<W,no<V]Vm;u]hq<W,ns<VTMn`r3sSaSs<\b59B]bl5lccMu5jd/DAldf7eqe,n1Of)F8'
+A7fOjqG$o`%H-4)ioB([jlPXekND(.km-M>lg4!*mI'rA!q>aMrUU![s7H6^rq??cq"Xd_qYKUV
+p\adakPg&4JcDYJJ,~>
+JcC<$JcC<$bQ$Q#oDSF]oDAL_rV?<bs7cNdr:U*^s7?3[s7$*YrU9dS!:BaO!pf.:rosIHs.]Rf
+rLa+]q47MTs/ZO/Y-+t3Z*UjG[e[<3[^Z4DrjVj9r7(bqrmLbms3UelrQbGfs31Jcs2kDbaN3k7
+!0[;Cq2bT;qMtK5r3$.+ZMUd*YHIi-!O/j(Yl:p,ZN%63VPX$G!/p`3r/(9-q2>!+r/:T6s,6cW
+!3c=)s/uF,ric@+s0;R/s0MX1!4Dg7!O[paNr=t8NWP9'OT(@EOHGZepQ,-3!KiQAP5r5o\cBA<
+]F;Nh^VIY$_SjF5aN;O%`rO3Yao0B\bP]Tac2Yufb5._0TD"]KRKT+MSXlAOTD>/[b5TN_b5BH_
+bQ?&7cMPrbd.u#fcMl,idJ;5be,I>b`r=$TaSs<\b5BH_bl5lccMu5jd/MGmdK%bpe-=ISf%Jj;
+jnm!m_[YP_io9"YjQ,Fbk3(pkroj[Qlg*p(mHs??mfN"Knbr%YoD\C[p&=[ap\=O\q>'mSqtU*`
+rTO63s+13Ls*t~>
+JcC<$JcC<$bQ$Q#oDSF]oDAL_rV?<bs7cNdr:U*^s7?3[s7$*YrU9dS!:BaO!pf.:rosIHs+UN-
+pk8R!re1<+qhG?2MMd=LMYiA3Mu/J3NVq<+e,IeodJqSnci)/hc2Z#ebQ#]daiMQuIfFiiI.;R]
+HMWHsL]3)1M2;%cs,-c5regN0!N)^iH1uR]GPcUdH$FT(H2MpeH2i-hL]E;2MYi>.N;eb4N;S\7
+NW>(.H2`-hH2;jaHglF_O8k:AO84kJO-#HaO-#HeQ'IZ$Q^=),qNq/HrKmPOs-`kRrg3JQs.At:
+q1ATu!/1?*qM#',Q'M?5!L8uIQi*6LQi!0KQiEHPR08tJS"-#@Sc#)Y`VmgUa83mVao9H\bQ#fc
+c2Grfci;AkdJqVpe,@c#e^i<LWiiZ*O84kHi8N\Tj5]4]jlY^gkNMp0#O:X@m-O-,meuSUnF?&I
+o)J=\o_eC]pAXg]q"sm_qX+1Tr:g0Rrdk*#s/H$K~>
+JcC<$JcC<$bQ$Q#oDSF]oDAL_rV?<bs7cNdr:U*^s7?3[s7$*YrU9dS!:BaO!pf.:rosIHs&Aqq
+p/M#i!EE+t<W>tt<;okt<;ohg<;fhpeGn"sdf%Snd/VGjcMu/hbl5fcao]]+aSo*<;X[Q_;Z9Vn
+;?0Yo<;]\p<<#nr<;oec<<#nq<;ons<!0"o;cETnpJV&ipJLofpf%2jpJLrgs&&YlqGd>lrD`_q
+qc3f#<`W5t<;ohc;ufkl;Yj>d;Z'So=8Z+q=8uCr=8u>"<W#nr<W#qpT)YGY<<#ni<;0Dl<;f_r
+<)rltr`/nrs&K"sqc3GkrDW_qr)N_qs&Jkorl+iUrl=lVrlP/^r6,,arltDes3L_lrmCbo!7Unr
+#1_;U?=75RpeC]^%H-4)ioB([jQ5OdkND(.km-M>lg4!*mI'rA!q>aMrUU![rq--]rq??cq"Xa^
+q>0LUq#'mbkl-/5JcD_LJ,~>
+JcC<$JcC<$bl?]%o_nL]oDAI^rV??crqHEcr:U*^s7?3[s7$*YrU9dS!:BdPs6K^MrosIH!p?>P
+rh'1]r13YR%'-J3Y-+t3Yd1XD[C5q>qmQL5rODjUs3ghms3UelrQbGfs31Jcs2tA`rl>)[nWX!9
+!g/S,qN(]<q2Y<2r3$1,ZEO,-rN?7+Z2Lm,YPk[2Z*:L<ZEggCV#H>QMu/G5Mu/D0M><&+Mt`2.
+MuJY9MlllZ!3cC+!O8m,YPtd*Z2_-/Zi.6:[C3N&N/`gWNqeV5NrP1?O9:W,O-''rq2bW>P5:@C
+]"@sQ!5&*?!58BH$,FBo_o0O6aN;O%`rO3Yao0B\bPfWhc-FSXbab4%Sc>;\R/`TSR/<<IRK]1N
+SXl@Drh'1`rh'>6b0'_*!6Y5_rlbGgcHc=5qp>/brQYGjdJ;5ce,RA_`W!mUa8F$Xao9H]bPo`c
+c2Q#gci;AkdJqVpe,Ii#e^2dtgr9-.qSNd#iSieVj5f:_k2tjikl0fIlKeH9s6TgSrU9dU!:g$Y
+s7?6^r:U'_rV-']qt^$`n,)kWq#0IVJcC<$WrIS~>
+JcC<$JcC<$bl?]%o_nL]oDAI^rV??crqHEcr:U*^s7?3[s7$*YrU9dS!:BdPs6K^MrosIH!p>;l
+q1Sa$q1Jd&LAHZ/M2I1KMMqCkrJUT4rJgg*s3ghms3UelrQbGfs31Jcs2tA`rl>)[qL8Elq0`3h
+!.=WirHeBgqKhsns+gN.qhb?1rJUZ4q256Kq0D^Zr-.p\np1.XrcnKgreUT2s,-]3qMbE3qi(H4
+s,Q8fr-J6en9k4rs,[5ApQ5B8$BUC6Q'IZ$Q^=),qNq/HrKmPO!1EeQs-NbUrLNt[rdt0&s+:'!
+r.=j!s+LB*qhG6;Q'M?5!L8uHQi3<MQhm*KQiEHPR08tJS"-#<Sc?Y)`W!mUa8F$Xao9H]bPo`c
+c2Q#gci;AkdJqVpe,Ii#eY&\8Wf[1?pQ,jBiSieVj5f:_k2tjikl0fIlKeH9s6TgSrU9dU!:g$Y
+s7?6^r:U'_rV-']qt^$`n,)kWq#0IVJcC<$WrIS~>
+JcC<$JcC<$bl?]%o_nL]oDAI^rV??crqHEcr:U*^s7?3[s7$*YrU9dS!:BdPs6K^MrosIH"6WW^
+;tj8e;u]hp<W>tt<;okt<;ohh<;fhre,RkodJqSnci)/hc2Z#ebQ#`bao9?]a5p8!;?0Yn<;BGo
+<)Z`p<!#ur;Xm`c;uTbq<W5r!Uf(.g<;9Dl;Z'Df;YX2j;Ya/i;Z9Sp;Yj>g<;T\o<;]bo<WQ9&
+rDWYos&8_mrDWSmpeprepJUlhrE&quq,dSup/h8prDibrr`'/'='&F(S=KPKs.9$cr)<8fpf7>n
+!)ibo!E<(u<rH%s<<#ts<;T\k<;fbq<;T\q<<#tp<<'o5`W!mUa8F$Xao9H]bPo`cc2Q#gci;Ak
+dJqVpe,Ii"eQQ0`@.m=o:(C(XiSieVj5f:_k2tjikl0fIlKeH9s6TgSrU9dU!:g$Ys7?6^r:U'_
+rV-']qt^$`n,)kWq#0IVJcC<$WrIS~>
+JcC<$JcC<$cMuu)o_nL]nb`7\rV?<brqHHdr:U*^s7?3[s7--YrU0gUmHso>s6B[MrTOIKkND!$
+rh'1]s./hQs/QF,Xfeh1YHY:<p9je+s0r!;s3gknrm:\krQbGfs31Gb!m8X,rlG,[!lgFfrK@)B
+rK78HP*(n&OT(=;Nqn\3Y6(r5YPbR'Xo5F%Yl1d)YR.M;Yd(I=ZEoLKrJUN2rep9'qht6.qhtK5
+!/piYr3$('s0)O/Yl([)Yl(d+ZMq3/ZiIN4Muo!!NqA>2Nr>"=Nr4t9NW>.:O91Q-P5:CB\cBAA
+](ru=^&GbQ^qmn*`5Ta;aiOG$qoSfZrlb5`"3o-9bl!t1SGnlOR.m$JRfAiWSGo,ZT`1VgTZ>-p
+b0'_*!6Y5_rlbGgcHc=5qp>2cr6>>idJ;5ee,R;`_u@UO`W!mVa8<sXaoBN^bQ#fdc2Gohcd:&<
+dJqW#e'u=ZcdULb`VROL_[YP_iSrnXjQ,Fbk3(pkrojLLlg+Q:!q#FDrpTmVs7-'Ys7?9_qt9s^
+rV-$\qYBs`n,)nXq#0LWJcC<$X8d\~>
+JcC<$JcC<$cMuu)o_nL]nb`7\rV?<brqHHdr:U*^s7?3[s7--YrU0gUmHso>s6B[MrTOLLkNCu]
+L&?W(L%U-!K`Hl(LB*//MZ8V5N;\\4N;eh:df%Smd/VGjcMu/hbl,]db/qd)aT'9^`dWC8I0>"I
+I=-G@HN8HhHNJM?Hi/3fHhr$gH2*3qL\uu)M>rJ4MuJV1MtqYdGl;jcGk64XGlN$hGl<HuM>rJ0
+Mu8P4MuJY8MuJ\6NV.PsHLlF[HMi$gHN&9_I/K&uOT(:JOHGcmQ'R`&Q^F0:Qi36LQi<?PRJiKQ
+Qi*?QSGn*9K):2sK)UE%K`6`)L]!G:PQ@&8q3V&IrKm>I!gf:Arg<bTrgWqXnt#ftrPSWQqo/QS
+rl=oWs2k;`rQG5bs3:Mf!mf6?rmCbo$IdLlSY2aTOH>NapQ5E;%H-4(ioB([jQ5OdkND(.klU/9
+li-5PmI'EAn,MnWnbr%YoDeI[p&=[`p\+CYq>'mUqtU*arTaB5s+13Ns*t~>
+JcC<$JcC<$cMuu)o_nL]nb`7\rV?<brqHHdr:U*^s7?3[s7--YrU0gUmHso>s6B[MrTOFJkND"&
+<:j)h<;T\q;ZKeq<W?"u;tX,h<WCMGdJhMmci)/hc2Z#db6#i.ao9B]`ra7Z;uKVl;uKV`;uBVj
+;Zp&u<)cfq<!#ur;Xm`b;u]hr<W?%u;ZB\q<;0>[;YX/j;Yj8i;ZBYq;Ya8f<;]bo<;]br<WZ9%
+<r>nf<;]\m<;oho;Yj>j;YsAm;YsMm=8c1q=8uCr=8u>"<W#ns<<H9'='#6gs.''erD`eq!)iGf
+r`&Vlr_i\n!E<(u<rH%s<<#ts<;T\l<;]\p<;0Dj<<'i6_u@UO`W!mVa8<sXaoBN^bQ#fdc2Goh
+cd:&<dJqW!e'qB"=^,2):&[lt:Z13jioB([jQ5OdkND(.klU/9li-5PmI'EAn,MnWnbr%YoDeI[
+p&=[`p\+CYq>'mUqtU*arTaB5s+13Ns*t~>
+JcC<$JcC<$ci<,+o_nL]nb`7\r;$3arqHHdr:U*^rq$-[s7--YrU0gUmHso>s6B[MrosIHs6'FE
+!2'4]!1ihRr0m\eri?I/Y-+t3Z*UgF[C5q>qmQO6rj`!Us3UbkrQbGfs31Gbs2k>`rQ#,^`l?!:
+plYW@rK@2CpQ5B8qi:B0!3Z7'!jJr6riZ4%r2p((Yl(^)YQ1m+YQ;#7rf$c5qMbE3onrI$r/CE/
+rf$fX!NrR'Xp)#5Yd(F:ric@+qm$1,s0M^3rJU]7mZ%4+!0-r;r/L`:qMtZ=Oo1CBPQ&,q]=PSc
+q7H^@rkAZQ_8=./`Q%nurl5#[qoSi[rQG,_!mT$8rL3bUqj7/HpR2#L!h5^Nrh'1_s.Kh?a2l?E
+b/qcJbKJ-/bPo]ec-FW4chl)bci),icd;F7r6kY^qni<Lrl"]Qs2P&Yr5eo[s2t;`s3(JfrQYJj
+d*Vd>"k(-#_o^4&`VROL_uJX&iSrnXjQ,Fbk3(pkrojLLlg+Q:!q#FDrpTmVs7-'Ys7?6^qt9s^
+rV-$\q>'j_n,)qYq>KRWJcC<$XoEn~>
+JcC<$JcC<$ci<,+o_nL]nb`7\r;$3arqHHdr:U*^rq$-[s7--YrU0gUmHso>s6B[MrosIHs6'FE
+re1E,Kn]5Rr.>!'reC<*#De4oMMm@MMuJ\6Mu8P5NW7E+d/MAicMu/hbl,`baoKQ^a99Q'`l5pr
+I/eWmI.Vd]HMr3dHN&3bM#W8.M#)u.MYrA4MYrD,H16(UGQ)j]H2)X`H2EC!M2I2eMu8P5MuJ\8
+MuJ\8NVdtsH2W'_GlW*fH2W!eH2W'`HiJKjO7eV6Ns:]/Pa.N"QM-[EQMm0GR/NKRS,7d5K):3"
+K)L?$K`6])LB!&+Q2d'MQ'Ra3Qi<BNQhZpLQ^F0=RK&cVSFW3N_>D+J_u@UO`W*sWa8F$YaoBN^
+bQ#cdc2Gohcd:&<d0J*`Pa@l3Ocf<urK7-<$fU+*j5f:_k2tjikl0fJlKdd8liQSBmf)\TnGi%W
+o)J=\o_\=\pAOaZq"aa]qX==Wr;$<Urdk*#s/l<O~>
+JcC<$JcC<$ci<,+o_nL]nb`7\r;$3arqHHdr:U*^rq$-[s7--YrU0gUmHso>s6B[MrosIHs6'FE
+qc*&`!`W0!rD`nu;cN`r!EN4l<;ontdJqSmci)/hc2Z#dbQ#]bao09`a2Z-<`V<=2;u'>f;tj8b
+;Zp&u<)cfq<!6,t;H$Te<<#kt<)`cqs&K%rs&8nrpJ^W\p/CuhqGI8jr_ierrDN\or_rYmr)NYo
+r)Nbt!*/nor_rMir)<Sor)<Mkr)<Jjr)3Vq;u0Pn=8Z+p=8uD$<rc:u=8u>#<Vohr<<?3&=8eTf
+S,6+c<)Z`o;Y3oe<;BMo;uT\o;[$-#<`W:&rDieq!*/tsqc3Gk"]J;t;cH`i<W,ks_>D+J_u@UO
+`W*sWa8F$YaoBN^bQ#cdc2Gohcd:&<d07rs;cQn$o1f3Z%Su$@iSrnXjQ,Fbk3(pkrojLLlg+Q:
+!q#FDrpTmVs7-'Ys7?6^qt9s^rV-$\q>'j_n,)qYq>KRWJcC<$XoEn~>
+JcC<$JcC<$dJr>-p&4U^nGE+ZrV?<brV-?cr:U*^s7?3[s7--YrU0gUmHso>s6B[MrosIH!9a@D
+!9O0N!1j+Z!1WnVq3qemX/rD)Xfeh1YHY=>p9jh,rjN!>d*L&9cMu/hbl,`bb5]T_aT'9\`r3jW
+`09kWs,m&;rf@#<s,I#:qMbT;O0#M]Y5tl4riZ:'s/c.$!O&a*YQ(g,YPta+Z2T^ZMu&D3MtMu-
+MuJV2MuJ\/MuS_9Mu0XTXp)#5Yd(F:ric@+qm$1,s0D^4rJLT4s,>utqMkW<OHKF's-!Gprji3D
+]"5NL]E#YE^Bq]l_SjC3`lQ9Crl>&[qoSl\rQG,_!R8phQiNQKQhm*ERJiQUS=Q8NT*V*`TuP*m
+aN2O'aTK]/bKTt/rlbGgcHc@6rQkSkd.u#dc2l8<p<rrhrkSNLqni?Mrl"]Qs2P)Zr5eo[s2t>a
+s31MfrltVld*U2>^&c$dqo/HNq8<6j$fU+*j5f:_k2tjikl0fJlKdd8liQSBmf)\TnGi%Wo)A7\
+o_S7[pAF[Xq"aa]qXOIYr;$<Vrdk*#s/uBP~>
+JcC<$JcC<$dJr>-p&4U^nGE+ZrV?<brV-?cr:U*^s7?3[s7--YrU0gUmHso>s6B[MrosIH!9a@D
+!9O36!JZ=-KE-Z&K_^9#L&Zo(LBWKjMM[4Jrepc7rJUT4"-([Rchu)gc2Z#dbQ#`bao9B]`rO-X
+`;mjPI.Vd]HN&9kHN&3fHMr*hLA6T)L\uu)M>rJ5MZ\ipMi.Ikpj):Pqfi'bpj)RXs*4ThqhY9/
+!/gW2r/CW5rf$l8rf$\urH\'^qg%p\qfr0fpj<$gqN(W;!0@#=!KiKCNs1W.Pa.N"qj.;KrKmJK
+rKm8G!1ES4qL\?lre19)!euJcqj%/F!gT(;q3V)JrKmJM!13PLrL!\TS,JlMSc6G(_>D+K_u@UO
+`W*sXa8F$YaoBN_bQ#fdc2Puucd:%dQBd\uQBIAmOHG\$OSb1?i!\N'j5]4]jlY^gkNMp0!p]+;
+rp0^RmdC)Cs7$'YrUTsZs7H0\rq?9ap%\@Yq>0XYq>C'elMcA7JcDnQJ,~>
+JcC<$JcC<$dJr>-p&4U^nGE+ZrV?<brV-?cr:U*^s7?3[s7--YrU0gUmHso>s6B[MrosIH!9a@D
+!9O,Xn5BBd;cNWo!`W)tr`'##<E8Wi"'*^ochu)gc2Z#dbQ#`bao9B]`rO-X`<!nUnP]6_pf.8l
+r_iJh!E<"p<!6,t;H$Tb;ufkr<!-,u;cETnp/;#j;cE9cpeq/jrDEGis&/qr<;ohr;Z9Vk<;]bo
+<;]_r<r,_j;ts>g;ts8h;u9Ji;ZTirq,[Gqr)WVps&f8%s&T/$!*9)#!*9%uqc<\r!EN;$QiNQR
+<;BJi;Y3o_<<6&tr_i_o"]SK&<``?#<W5tt<W,no<V]St;c6Ll<)iQkr`&m4rk\KKrkn`Rqo/TT
+s2Y&Ys2k;`rlb>cs3:Pg#g^lEd8j7G;cN?_r([_ti8ESRj5]4]jlY^gkNMp0!p]+;rp0^RmdC)C
+s7$'YrUTsZs7H0\rq?9ap%\@Yq>0XYq>C'elMcA7JcDnQJ,~>
+JcC<$JcC<$df8J/pAO^_nGE+Zr;$0`rqHEcr:U*^s7?3[s7--YrpTmTs6]gP!pf.:rosIH!9a@D
+s5j9Ps.'.[rgWhUqO@JS"0/E&XT#@%Y5b[,Z*Uh3[/m_FrjMg8!4`$RrltJerQG5`s2k8]s2Y/Z
+rl+oU!5n_us-!>E!0[8BqN1`<qi:]9rJ^T4"HJP(XKMH(s02L*riQ4%riH:*YHY50Xobf2Yl:j(
+N;JP1N;nh)MZ8V7MZ8V6N:Vu(XoGO/Xfek3Yd(F:riZ=+riuL/s0;R/r/1K3s,>utqMtT:rK.&A
+s,mGI]"@sQ"1u.U]D9,>^AkqS_8=+.`Q#s>aiOJ%s2b5^!6G/]s2t;`rQGJjcBjocQ'V02r0[8I
+rgNkVs-s:aStDXJTuI#N!QW:ZaT0K\bPo`bcMZ#ed.biicHXVZcdDF6qnN-Grk\KKrkn`RrPecU
+s2Y)Z!m/U-rQ>8dc-?75!71SW!5JBLqo&?Krnmh9ir7s=jQ6C'!U&\GklU/9li-5PmI'EAn,MnW
+nbhtXoD\CYp&4U^p[n7Wq>'mXqt^0crTjH6s+13Rs*t~>
+JcC<$JcC<$df8J/pAO^_nGE+Zr;$0`rqHEcr:U*^s7?3[s7--YrpTmTs6]gP!pf.:rosIH!9a@D
+s5j67!JQ4+KD^DtK*6j^KnY9WLBNHkM2I2hMuSb7Mu8M6NW.6&c2Z#dbQ#`bao9B]a8a0Y`W*jV
+_tJKPHhi!eHiJEjH2N!dGlWToM#W8-M#W;3M#E2/MZ8V6MYDDaGl)^aGklXVGl!6rM>rJ1MZ\or
+N/[aorJ^`6q0;g_s*FTgpNl^^rHS3brHeBgrd=^+!0I/?s,d8Ar/gr@rf7/COcu(0QM[!OQC!r(
+Qi36KQi!-OQ^F05Jc(,mKDU?%K`[!aPkp[EPQI,9QMQsHR/NBMR/`NMR/NERR[a,CqjmW!rkSNL
+qni?Mrl"cSrl4uYrQ#&^b0'\+!mJp6rlteqR$X,(P`q;or/pl<qN:d8!TE&;irS6&roO7Ekl0fJ
+lKdd8liQSBmf)\TnGi%Vo)J=\o_S7ZpAF[Wq"jg^qXXOZr;$<Wrdk*#s0)HQ~>
+JcC<$JcC<$df8J/pAO^_nGE+Zr;$0`rqHEcr:U*^s7?3[s7--YrpTmTs6]gP!pf.:rosIH!9a@D
+s5j2YmSa3b;c?Zm<W?"s<W?,"<V05j<W:;Cc2Z#dbQ#`bao9B]a8a0Y`W*jV_u*I5;Z0Pn;Y!cc
+<<#nq;YF&h;ufkp<!?2u;H$Rqr`&ksrDWbqr)EYos&/boohtigr_rAc!`Mupr)<;er_rhrr_rhp
+r_rYm!EE+u<W#hp<V]Ph;tj8g;u]be;u9Jk;ZK_j<r?%u<r#hs=T)>$<rZ5(<``@'<rH%s<X;c-
+<E3($Q^F0;<;TSp<)`cooi(ihr)Nbts&B/#;c?Tm;[$-#<`W:'rDihrs&K"sr)NMk"]J;s;cH`i
+<<-"q^])%J_>D+K_u@UQ`W!mWa8O'\ai_d)b6#o4c2PumcWO@N<Duff:&7WahuVfrro4%?jo4BC
+kNMp0!p]+;rp0^RmdC)Cs7$'Yr:9mZrq-'[rV$0`o_A:Yq>0[Zq>C'eli)J8JcDqRJ,~>
+JcC<$JcC<$e,SV1p\jg`n,*"Yr;$0`rV-<br:U*^s7?3[s7--YrpTmTs6]gP!pf.:rojLJkNDj,
+"m+h+SXl;MS,AfPS,]#XRg,mnX/rD)Xo>I+YHbC?[.q'/[K<qH[f3c9c2Z#cbQ#`bao9B]a8a0Y
+`W*mV_uIUJPPpXEOnk+=O8Fq;NVnb2NW+q>X/rH#Y5tl4rN6.&riH(#!NrX)Y5b[+Ycmq_qMY<2
+s,6i5s,$]3s,$H,p5Ag*s,6]Ts/la3Y-5%5Z*:I9YHY81Z2_-/Z29FXMu&CsNVSV3O8b4AOcoUQ
+s18<C]D9,>^AkqS^r""-`Q#s>aiOJ%s2b5^!6G/]s2t;`rQGMkQBmc"Q'I[3Qhm*JRK&ZQRJr]S
+Sc>;]TDlh0`W=-$r5er]qTJo_rm(GfrQt;b"jYB;cHsu4df7#[^AG\E_#D1J_Z%IQ`;R[T`rF*X
+aT'?^b5KKbbg"E3^&>\@`Vd[N_uIUQhuVfrro4%?jo4BCkNMp0!p]+;rp9[P!:KgSs7$'YrUTsZ
+rq-'[rV$-_o_A7XqYKd[qY^0fm/DS9JcDtSJ,~>
+JcC<$JcC<$e,SV1p\jg`n,*"Yr;$0`rV-<br:U*^s7?3[s7--YrpTmTs6]gP!pf.:rojLJkNDj,
+"m+h+L5(B\KD^DuKDpQ(KD^K#LBWKjMM[4JrJLZ7r/:N4s3:Sfr6,,_s2k8]s2Y/Zrl+oUs24lR
+o6gF^q0N$es*FWhqKi*cs+UN/pk\s*r.tB0s+pZ2rJLW5!/gZ!!-nKgoQ^C[rHS-^s*4Edq0;d\
+s*4?qs,$c5q2>93repc7s,6Ysnp0kRp3HX`r-SEjrJpr?rK$u?s,[)>s,m;A"-AY/Q2[*LQN3?N
+QNWV@Q^4!:QMm0JR/`KPJG4WkK)L?%K)L>sK`?c*Pl$aFPQI,9QMQsHR/NBMR/`NMR/NERR[`u?
+!hI$<rkA9ErkSNLr5/HNs2=lTs2P)ZrQ,#\!6Y8`!mJp6rKmYQQBqN6s-!ADr/g]9rnmh9ir7s=
+jQ6C'!U&\GklU/9li-8Nm/ZSQn,MnWnbr%XoD\CYp&4U]p[n7Vq>0sYqtg6drTsN7s+13Ss*t~>
+JcC<$JcC<$e,SV1p\jg`n,*"Yr;$0`rV-<br:U*^s7?3[s7--YrpTmTs6]gP!pf.:rojLJkNDj,
+"Qe_*<)i0^"&Vur<;TYs<)Zcq<W?,"<V9>kc2Z#cbQ#`bao9B]a8a0Y`W*mV_uIUQ;XIE^;Yj>j
+;YF#l<)Zaq;u9Ms;c6Lm<W5tq<<?,u;uBSq;c<Tns&B"ss&/\lr)*MnmS`p\p/:ohs&B%ur_rhp
+r_rSkr`/kqs&Jhls&8hnq,I)eq,I/grDNSm!)iPlrE&quq,dSurE'#"s&T>(='&F'rDies#Zk&,
+<E>EO;cENlr_reqq,@;krDW\ppJq5ms&/nqrDNl!<E<.%=8Z(u<<#ts<;]bk<!?2u;H$Oop/V.+
+rkA9ErkSNLr5/HNs2=lTs2P)ZrQ,#\!6Y8`$-^Z=>?b96=B8Go:&%K_huVfrro4%?jo4BCkNMp0
+!p]+;rp9[P!:KgSs7$'YrUTsZrq-'[rV$-_o_A7XqYKd[qY^0fm/DS9JcDtSJ,~>
+JcC<$JcC<$ec4h3p\jjan,*"Yqt^'_rV-<br:U']s7?3[s7--YrpTmT!:BdPs6K^MrojgSkND!i
+jlPR`j.2_>S,AfKRg#7ZWiE,$riQ1&"L#&7ZaBM8s0hp9!k,SIrQG2_s2k8]s2Y/ZrP\iV_o)Jj
+s2"Al!0[;CrK.#>r/Uf:q2G'-"0/E(Y5>C'Z*4/0"0JZ*XSo7%Y-7c+!jAhfrf$T0!0$o8regW1
+!/g]2pkf'.regZ4pPK$1MMh22%'H_7YHP18Yct=7Yd",3s0;X0pPJs/pl,64s,?i7q2G<4q2Y?5
+s,[AEOcm8cr4;p?!4qs<&&#]l^VI_(`5Ta:aN;NDa8X0[aT0E]aoBN_bP]QcQ'7F2PlI!KQMQsG
+R/WNOR/`QWR[]e:SbnuY`;[^X`lH0Ar5er]q9&c_rm(GfrQt>c!7(Sg!m]0?pX9#Qrk8<FqnN0H
+rk\NLs24lTrPefVs2Y,[s2b8`rQG5RrOr6Fpr33MqnrBL"Q/.qiSsjs!T`AAjoOZ/rosIJ!:0XN
+s6]jSrpTmVs7-$Xrq$-]q=X[ZqtKaXq>'m`o_\L_qYfd[JcC<$Z2]=~>
+JcC<$JcC<$ec4h3p\jjan,*"Yqt^'_rV-<br:U']s7?3[s7--YrpTmT!:BdPs6K^MrojdRkND!i
+jlPR`j+RA`re1#us+CK,JqAROLA6N-M2I.HMMh1erJ^]urlY8_rlG,[s2P#V!lW!orke]OoR-I]
+qg/9hrd+Kfq0N!breC0'!/LK.s,$c3re^T2s,-l'rd"He!."6^r-&-cqfhm]!."BbpNH[`GB`h<
+!f;elq2>93repc7qKVISr-IdVrd+Qjr-\F'!0I/?s,d8Ar/gr@rf7/CP*D72QN*9WQC!r(QC!r(
+Qi36LQi*3PQ%+;_JG4WmK)UE#K)UDsK`./3Q2d'LQ'V64rL!PMrL!SNrL!POs-`qWopkunrk8<F
+qnN0Hrk\NLs24lTrPefVs2Y,[s2b8`rQG5-r0RJNrKI8ErfR2Ap5oL8i8ESRro4%?jo4BCkNMp0
+s69UMrp9[Ps6fmTs7$'Yr:9jYrq-$Zr:^$^o_A7XqYKj]qY^3gm/DS9JcE"TJ,~>
+JcC<$JcC<$ec4h3p\jjan,*"Yqt^'_rV-<br:U']s7?3[s7--YrpTmT!:BdPs6K^MrojaQkND!i
+jlPR`j6KYD;ZBSq;cH`n<<?,u;uTer<rZ1n<;k#>b5]T_aT'<\`r3jX`5BLl_Z.IL;Xm]b;Yj>i
+;YX2j;?]uu<)Zapqc*So!`Dutr`&eq!`W)sr)ESms&&hor_iVlrDNYmlVd^\p/:oh##\K%<)Zap
+r_i_oq,I;mrD`Jg!)rbmqbmJoqG[Akqc!MoqG[;irDN\opK%2nrDr_qs&f5$s&K>*<`W:'<`]0!
+r`9&#s&K/#Q2FSQ<;]\m;Z9Vn<;9Jn<;KMs<)lt#='#6!s&B"urD`\pq,@>mr_`er<)iTlrOi-C
+rkA9Es1nWMr5/KOs2=lTs2P)ZrlG,]!6Y8`s'#D+!a8`.ohG-T"Q/.qiSsjs!T`AAjoOZ/rosIJ
+!:0XNs6]jSrpTmVs7-$Xrq$-]q=X[ZqtKaXq>'m`o_\L_qYfd[JcC<$Z2]=~>
+JcC<$JcC<$fDk(6p\jjan,)tXqt^$^rqHBbr:U*^rq$*Zs7$*YrU9dS!:BdPs6B[MrosIH!9a@D
+s5a7Aro4'MS"';FoUGiK"K/9"X/u9%riQC-Z*UgEppL.1rO2pQb0%iJrQ,#Zs2P#V!lW!orke]O
+s1nJpqNCl@qiCf=qi1Z9o8N^/rJ^cV!irE*ql^7/YHG%1XfST$XT,F'YPkU,N/`gUN;8D2N;eb4
+M>rA5M26ueM>N2-M>`>2M$&QjM2M4f!K)a4XT5O%XTkr1Xfek3Z2Us.YH\#2s0;W]pPS^'pPf*0
+r/CZ8pl>95s,d8A!K`HC\bs&=])]G;]FV]i^V@S$_o0O6a2lBDa2e2#s2bDbaiV]JrQG/`!L/fG
+PQ7!JQMQsIR/WNMQj&nHR[]h<rLO).`5MYo"3/C&aSs<]b4s-[c2Pugd/MAid.biicHXVZcd;F7
+rk&'?rk8<Fr4i9Irk\QMs24lTrPefV!6>)[s2b;abPo-R]`,SE`:q7L`;RUN_?AcSi8N\pirS6&
+roO7Ekl0iHl2^/Lm/QJQmf)\TnG_tUo)J=[o_J1XpA=UUq"jg`qXj[]r;$<Yrdk*#s0DZT~>
+JcC<$JcC<$fDk(6p\jjan,)tXqt^$^rqHBbr:U*^rq$*Zs7$*YrU9dS!:BdPs6B[MrosIH!9a@D
+s5a7Aro<s0!/19&!/10#rdk3&J:RQPpkJm,MZ/J4MYN,0N!.>Hb/qd(aT'<\`r3jX`5BLl_Z.IP
+_"N0THi&-hHi89iHi89hH2N!gH2i3hH2WHtL[p9$M>rD1M>iD3HN/9gGQ<$bGk6.VGlN!fGl)^a
+Foul1G'Ek-!I&_cL]E;0M#W;3MYW/1N;\Y7N;.Y`H2`'YH2`-iHiAElHi&j(OSt7?OT1C>OT1IB
+NsCc0Pa.Q$QC%T:#+(XAQ^=#)rg*MLrL!G3p4<3pre('!re('#r06r@s-EJIrL!SNrL!SN!LT;S
+R/NERR[`u?rk&'?rk8<Fr4i9Irk\QMs24lTrPefV!6>)[s2b;abPmh-Qi<?PP5LODP5^RDOS"Y<
+hr*GOir7s=jQ6C'!U&\Gl2U#Kli-8NmJlVRn,MnVnbhtXoDS=Wp&+O\p[e1Vq>:$\qtg6drU'T8
+s+13Us*t~>
+JcC<$JcC<$fDk(6p\jjan,)tXqt^$^rqHBbr:U*^rq$*Zs7$*YrU9dS!:BdPs6B[MrosIH!9a@D
+s5a7Aro<NI!`DrqrDNYm"Ahrn;cNTns&8nsr`9"upf%C>b0%iJrQ,#Zs2P#V!lW!orke]Os1nJ/
+k>V=Wr)<Vns&8kor`&kqqc*Mm!*0"tr)Eet;cEZpr)3Snr_`Vlqc!DikYhCW!`2`kqbd\u;HHn"
+<)lmsr_i_oq,I;ms&9%s;H!Bhr)3Plr)3PnpJLugr)3Pnr`&_mrDNVns&&hop/_)mrDr_qs&f8%
+r`05)<`W:'<`]3"rDrr"s&K,!qc!#a!)r_lr_ierqc3Ysr`/ttqc!Mps&T/$!*8ts!`W0"r`&eq
+pf%Dq;GpFm<;0Dl]DK8?^&GbD^]2+K_>V7N_uI[R`W*pXa8X0[aT9Q-r`T8)s'#M-9_M3Q:'BJ4
+i8N\pirS6&roO7Ekl0iHl2^/Lm/QJQmf)\TnG_tUo)J=[o_J1XpA=UUq"jg`qXj[]r;$<Yrdk*#
+s0DZT~>
+JcC<$JcC<$f`117q#1!cn,)qWqt^$^rV-<bqt:!]s7?0Z!qGdLrU9dS!:BdPs6B[MrosIH!9a@D
+!p/M(ro4"<qjd5Hr0dbdWN*#"rN6%$!O8s0[/%-0[f*Z8ao0<\a8a0X`W*jV_u7FR_8*kc^\j;o
+P5UO<O9(E&r/LB.s,-r;Mi@Um"cTI]X/rK$Y5kg+Y5bU)XK29#!3Q4&rJ^N0rJUf9MMh@hq2#$,
+rJLN0!/UN/!/UW0",MejM#<)0XT#@%Y5GC+Y,nb.YHY;2YQ:r3rilK[M=QPsMuSY7Mu8J3MuSb7
+NW"n2NrY:?\bs&<]D0#L^;%Fu_8=+/`lH-AaiMNCrQ#/aaN;QHb5KN`bkdS(Q2[*FQi<BNRJiNQ
+RK&`URg>OTSXuFk_o0Lm`<4-#aN4>%rlY,]"3f$8cMZ#ed.biicHXVZcd;L9rji$>rk&'?s1SEG
+r4i9Is2"ZNs24lTrl+oW!6>)[!QhqO]DoMD^&GtE`VmaS_u%:S_;F2/iSsjs!T`AAjoOZ/rosIJ
+!:0XNs6]jSrU9dUs7-!Wrq$*\q"=RYqtK^Wqt^-cp&"U`qYfg\JcC<$Zi>O~>
+JcC<$JcC<$f`117q#1!cn,)qWqt^$^rV-<bqt:!]s7?0Z!qGdLrU9dS!:BdPs6B[MrosIH!9a@D
+!p/M(ro4"<q1J^#q1JZur.4j%!JcF)LB33grJ:N3pl#02!6P2\s2Y/ZrPefT!5ncP!l;[frkJ5U
+s*OBard46_pNZamre:E.nqd=&reUQ1"H%MOH$T41!."Ken9=nWqKDp_rce?br,qgY!/LN/!/^W0
+s,$c5qMP?4repMqms,"[GB\<0GPHF]H2DpfHN8HmHhrd'OSt7?OT1C>O9gu1O,oBbPEhI4Qhm!J
+Qi*0JQiEHQJ,k0!JFnElK)L?"K)UE!K_q#.Q2d0GQNEP@R/NBMR/WETR$jA0R/NERR[a&Arji$>
+rk&'?s1SEGr4i9Is2"ZNs24lTrl+oW!6>)[!6P/)s-E_Qrf[2Cs-!DE!0Zr9"Q/.qiSsjs!T`AA
+joOZ/rosIJ!:0XNs6]jSrU9dUs7-!Wrq$*\q"=RYqtK^Wqt^-cp&"U`qYfg\JcC<$Zi>O~>
+JcC<$JcC<$f`117q#1!cn,)qWqt^$^rV-<bqt:!]s7?0Z!qGdLrU9dS!:BdPs6B[MrosIH!9a@D
+!p/M(ro4"<pJ^ufr_rVj"Ahrm<)iZn"&i0!<W,tt<V]Soao0<\a8a0X`W*jV_u7FR_8*kc^\h"%
+;u]h`;tj2h<;ohn<;fbo<;]_u<)Z^pr)3et;,L4h;c<Kks&/_kmns-_r_i_mrD3JkqbmGms&TA)
+=&i7"<;oep;uT_r<W,nq<W>qr;Y3i\;Z0Gm;Ya2i;Ya5k<;ohr;Z9Sr;Gg<a<r?%t<r#es=T)=t
+<WQ9&rDiess&T8#<)ifpmSj0br)3Mms&Anr"BSW)<E9#tr)3i"<E3(#='&H"<<6'!rD`\ppf%Dq
+;GpFm<;BPn\c02>]DK8@^&GbD^]2+L_>V7N_uI[S`W*pXa8X-]a]_mI=oVY*>Q.=k:%M*`:Z(*g
+iSsjs!T`AAjoOZ/rosIJ!:0XNs6]jSrU9dUs7-!Wrq$*\q"=RYqtK^Wqt^-cp&"U`qYfg\JcC<$
+Zi>O~>
+JcC<$JcC<$g&L=9q#1!cnGE%Xqt^!]rV-9ar:U']s7?3[s7--YrU0gUmHso>s6B[MrosIH!9a@D
+$0C7/j5].YiLHG3RfJoTS,/Q[W2HSoX/i>(XfVK(s02R0rj;L/!4Mm9s2b5\s2P#Vs24oTrPJTN
+!5STKs1SPtPEYp-q2tZ;"-AS)Nr4n/N:r/5W2ckuXKDB'#I(D7Y-"h-X8T+#X0)B(rJ^K/s,6u:
+MZ/J+M#<,/L]E;0M#N82M#2u,M#<)0XT#@%Y5GC+Y,nb.YHY;0YQM.cLktk`onrR'qMP60!0$f7
+r/UQ5!4`!<r4;m>pq.-O^V@S#_Sa@4a2c<DaN)?ta9'K+b5TQaQ26aEQ2d0DQiEHPRK&`TRK&`S
+S,]#YSc-M*`W*sXaSa0[b59?^bl5occi)5bcNVV=c-FY_qU5DRqml^;rk&*@s1SEGrP/BJs2"ZN
+!lMsprl+oW"NSTo]"7jPs1J?Lp;R$LrPSTNrkS`pi8ESRro4%?jo4BIkNM-ol0@R"rTsRO!:KgS
+rp]sXqssaXrUfmXqtBp]o_A=Zqtg!_qu$<hmJ_\:JcE+WJ,~>
+JcC<$JcC<$g&L=9q#1!cnGE%Xqt^!]rV-9ar:U']s7?3[s7--YrU0gUmHso>s6B[MrosIH!9a@D
+#Nb%-j5].YiVJ3,K_pE#K)^B%K)L9#L'NEeLPCP=LPG\]!JlX4M>rJ.MuUlua8a0X`W*jV_u7IP
+_#V:M^]2%BI/\KSHM2XaL'*-aL55>Ure^Z2re^Z$s*=Ebs*=Whp36IYr-/*_!-e?as*"HdpiZFV
+!/LN/!/^W0s,$c5qMPB5MtqSrGjfqXGkuXYGl)dbH3&A?rd+X*qMtW<rJpr?rf?u=#a(41O-#Kf
+Q'VB8pm(oFrg*PMs*auuJGt*"JFS3jK)UB)KS+o/re($"qNU`>s-EMJs-NhRR/NBMR/WEPR/WKR
+R/NESR[]fBSH$+r\c02>]DT>A^&GbE^]2+L_>V4P_o0Lm`W*pZa2jPCQN*<NP5LO@P4Oe=hr*GO
+ir7s=jQ6C'#Nt=7l07Kuli$2Mm/ZSQn,DhVnb_nVoDS=Vp&"I[p[n7Xq>:$]qtp<frU'T8s+13W
+s*t~>
+JcC<$JcC<$g&L=9q#1!cnGE%Xqt^!]rV-9ar:U']s7?3[s7--YrU0gUmHso>s6B[MrosIH!9a@D
+#Nb%-j5].YiV6@L;?0Yh;?Kio:f73ks&B%urDikr!`W0"r`8ttqc*U:s2Y/ZrPefT!5ncPs1n]N
+rkJKIs&/nqnP]Eelr3XV!)`Yns&8eorDNet;c?Zn<<-"p;uT\h;tNr\;Z0Jm;Z9Pn;#O8j;Z9Vp
+;Z0\s<W?%t;Z9Vo<<#tt<<#tr;>X2_;>a>k;>j>g;?'P`;Z]io;=moe=8Z+q<rcA$=85hp<W6%u
+;uKYq;tj8j;tj5l;c<TnrD`_qr`9/%<E8uss&05';cHas<`W:'<r5kt<)rlrrDiSk"]J;s;cH`m
+<WBT+\c02>]DT>A^&GbE^]2+L_>V4P_o0Lm`W*pYa2n*[s'#Cqq+^BS"]+%6i8N\pirS6&roOIK
+kih9qlK[^6m/QGQmeuVRnGi%Uo)A7Zo_A+VpA=UVq"smaqXsa_r;-BZrdk*#s0VfV~>
+JcC<$JcC<$gAgF:q#1$dnb`.YqYBm\rV-9aqt:!]rq$*Zs7--YrU0gUmHso>s6B[MrojLJkNDj,
+!TiDAj8\*>iSaO$r0mSRr0mPO$E0l#WiN2%Xf\\,riQ=+Z*O>8q6^@6\$sAsrPefT!5ncPs1n]N
+rP&HK]tM)XP5g^GP5(1>O91K'Nr"b-N:`#4VlHbtX0&Q%YPt^)XTGT)X8]1%X/rK$N;eb8N;e_=
+MMm@LM2D+cs+gQ/pP8L!q1es+r/(HTriQ4'r2g.*XK8S.YPbX)L]<2+M<ToqMZSiqMuJ\8NVSV7
+NrY:?O8l`h\biu;]D0#L^;%Fu_8=.0`lH-AaiMNCqT&f]b0%nmq3:iCo9TNGR@3uAqO7MUSbpA(
+`W*pXaSX*Zb59?^bl,icci)5bcNVV=c-F\`qpGJQrjVm:qmla<rk&*@s1SHHrP/BJs2"]Os2+iT
+rl"lWrji'?rO`!Gp;R$Lrkn`PrP8Zohr*GOir7s=jQ6C'!pAe2rojLLlg+Q:s6]jSrU9dUrpfmV
+rq$'[p\"FWqtKaXr;$6dpA=abqYfg\JcC<$[f:j~>
+JcC<$JcC<$gAgF:q#1$dnb`.YqYBm\rV-9aqt:!]rq$*Zs7--YrU0gUmHso>s6B[MrojLJkNDj,
+!TiDAj8\*CiS]??JqJ^TK_pDuK):*-Knb;9LPCP=LPCP=M#N/1Ll2.fs,-W1s2P#Vs24oTrPJTN
+!5SQJ"2;I^]_d*THN8BkHiJEkH0fkLGlWQsL&d#"M#N82L]E;1HN/9aGlDpdG5c^[G5HF\Fp)r2
+G'.p&Fo$:]L]*#/M>W20M>rJ0MZA"tGQ)jVGlW*fG5ugbGQ2mfH2;d]H2i0jI/SElNr"e:OSt4?
+OT(==O9gu1OH5KcPEhI4QhZjHQ2['LQi;F7It6j9!eQ&Vr.Fj!s+LH<q3:W=s-EMJs-W\MrL!SN
+!1<bR!1<_Q!1NnVqj[YprjVm:qmla<rk&*@s1SHHrP/BJs2"]Os2+iTrl##[Q'IZ%r0I8Dr0.#@
+oT9=6hr*GOir7s=jQ6C'!pAe2rojLLlg+Q:s6]jSrU9dUrpfmVrq$'[p\"FWqtKaXr;$6dpA=ab
+qYfg\JcC<$[f:j~>
+JcC<$JcC<$gAgF:q#1$dnb`.YqYBm\rV-9aqt:!]rq$*Zs7--YrU0gUmHso>s6B[MrojLJkNDj,
+!TiDAj8\*AiS[X5;Z'J^;ZBYs;,C-h<<#tu<;ol#<)Zar<W6%s<W#hr`r3mV_uR^R_Z.FP_#;"M
+^:h4mnPfEblr3OS!)reps&8hprDN\qr_rhrr`&qtr_reqr_rhrr_ikr;cEZnoMP?\rDEPlr)*>h
+r_rhp!*K2$s&K(ur_i_or`&ntr`&blqbZcZqG@)erDN8d"]A8s;Gg<_<r?%r<r5qu=T)=r<rH"u
+<r>ng<;]Yp<;ohn<<#nn<<#qu<rQ/#<rQ+t<!uW(<)Zar<E<.%='#2uqc*MopJ_;p;GpFm<;TYq
+[f3c8\GNi:])K>>]`5\F^AYhH_#M7M_Z.LR`;[^V``i1@!DZAg9_hEQ:'KM3i8ESRro4%?jo4BD
+kNM./klU/9li-8NmJlVQn,MnVnb_nVoDJ7Tp&"I[p[n7Yq>:$^qtp<frU'T8s+13Ys*t~>
+JcC<$JcC<$g]-R<q#1$do)&7ZqYBj[rV-9aqt9s\s7?0Zs7--YrpTmTs6]gP!pf.:roj[OkND!i
+jlPS&irnB#iS`YjS,A]TS,/TLR0T[gVl?\sXK;E'riQ@,Yd(P6[/%-0[f48G_uR^R_Z.IP_#D+K
+^&YkG]E#S=P5LIBO8k7;NUr,+MuSb9MuSb8M[-2YWiE,#XKME'riZ:'s/Z.#!3>aNreg]3reUH,
+!/CK.reCE+reCH.pk\^#qhY9Q!3H1%s/u:%"g4u/Xfnr-Yl':PM#N7tMYN)0N;8J4Nr+k;OT)ch
+\biu;]DoPD^&>SS]tV7r^qmn+`Q#s=aiVWEq8`WZb*2gh!0d;Erg!MLoU#NEs-ihSrLE`&rP\iX
+a2n/"s2t5^!6kDerQkGhps/rcrlkMid*_g?!4D^4rjVm:r42j=rk&-As1SHHrP&EL_86,fs2+oV
+\@DLJs186Bs2FoSp;R$L!5nfQqnWHmhr*GOir7s=jQ6C'!pAe2rojLLlg+N9!q#FDr9s[TrpfmV
+rU]sZp\"FWqtKdYr;$9epA=abqYfg\JcC<$\,Us~>
+JcC<$JcC<$g]-R<q#1$do)&7ZqYBj[rV-9aqt9s\s7?0Zs7--YrpTmTs6]gP!pf.:roj[OkND!i
+jlPS&is=Z'iS`XGJqJ^TK_pDsK)L9#J..-dL4tA;L5(J=L51T`L\lo.MY`81`W*jV_u7IP_>h=M
+^]2"J^&GYE]Dd3VHi89cH1-(VH2i3jH2i3iGl`YRr.Y3,o8*C&!/UMus*=Ebrce9`rce0]q/l[\
+r,qs[q/u^\rH/0tLPPha!/^W0s,$c5r/:T"q02UYp3?X_rHJ9brce*]q0E!dr-SF'qMtW<rJpr?
+rf?u=#a(41O-#NhQ'VB8rg!PLr0@DLQBqJu!e5`Nl[f"dre(-%rIt9:q3:W=s-EMJs-W\MrL!SN
+!1<VNs-iqVrL<kqqmQL5rj_m:s183ArOi0Ds1\HH!l2Xgrke]Q!6"f#!1*VN!1*JEr0.#@oT9=6
+hr*GOir7s=jQ6C'!pAe2rojLLlg+N9!q#FDr9s[TrpfmVrU]sZp\"FWqtKdYr;$9epA=abqYfg\
+JcC<$\,Us~>
+JcC<$JcC<$g]-R<q#1$do)&7ZqYBj[rV-9aqt9s\s7?0Zs7--YrpTmTs6]gP!pf.:roj[OkND!i
+jlPS&irnB#iS`Ym;Z9V`;?p,u;H$Ii:f@9ls&B%ur`')#;c?Xqr`9&!!*9)!r`&m9s24oTrPJTN
+s1nWKs1SKHrk&<E;H!0ds&/emr_i;cqbmGms&/kqr_ibpr)E\pqc*Djs&B"urDWJjqblu^pJUre
+r_ibno2>TjrE'#!s&Atqr_reqr`/bkr(ul[pJClerDN8dr_i_m!*B/#!*/borE&eqr)Wl#rE'#"
+!*B%ur`/nq!`Drqoi1Zaoi1lis&T,#!*9)!rDWbqrD`ess&K/%<r,hn<;fhl;ufkr;?Bcr<;fes
+[JRE3\,No8\c98?]D]DB^&PhF^B23e_>_=O_Z7XR>5_S->$4Ws:/1^]qG$HS"lA.pi8N\pirS6&
+roO:Fkii$1!p]+;rTjUQmdC#As7$$Xqss^Wr:KaVqtBp]p%\I\r;--aqu$<hmJ_\:JcE4ZJ,~>
+JcC<$JcC<$h#H[=q>L-eo)&:[qYBj[r:g0`qt9s\rq$*Zs7--YrU9dS!:BaO!pf.:roj[OkND!i
+jlPS&irS/urnme6rgNhUrgNkVq3q/Js-O1kVl6MlWiN2%XfSW'Xotr4Z*Ue9[/%*3[`$)$rke]O
+s1nWKs1\NHrk&9D](V<eOoLOCNrY4=NV\V6MtW,0Mtr>2M[-2YW2ckuXKMN*!j8`1riZ:'s/Z1$
+oo/m.s,$l7Lku%cre:T3L5(D:LAHW'LAlu,M"6<$M#N/3Lo[SXrN-(&r2g1+XfSY.YH[VRs+gZ3
+m#(Rrs,?f6rJpl<!fi>&rj_p;qmug>rk/9ErO`KN^;%Fu_8=.0`Q.qu!6=oVs,mMKPa%Aqqiq)F
+s-E>Es-WeRqj[MRq8E9Os2G)[aSO$Tb5oi3rm(Mhs3Lemd.biicHXVZcd;X=!42[3s0_a4rjVp;
+r42j=s1A6Bs1SHHrkJKK!5\ZOrODg:s1/3Brl+fRp;R'Ms24lRqS<?lhr*GOir7sCjQ5Lck3(pk
+rosIJ!:0UMs6]jSr9s[TrpfjUr:BmZp@\=VqtKgZr;$9ep\XjcqYfj]JcC<$\Gq'~>
+JcC<$JcC<$h#H[=q>L-eo)&:[qYBj[r:g0`qt9s\rq$*Zs7--YrU9dS!:BaO!pf.:roj[OkND!i
+jlPS&irS/urnmn9JqJ^TK`$K$K)L?%K)U?"J-gm_L5(D:LPCP=re:H/M#N2,M>rJ1MZUi7_u@OQ
+_>h=M^]2%J^&GYF]=RuhrHnKhs*4Thp3HU_s*=Heqg&!`rcnO!L&?Z*L]*#/L\Zc*M>DMuH2)Ua
+GPQF]GPQFWFng(QFoHIbFbkg.rJ1H1r.tB0s,-f6rcn3^q0;g_qfr$_s*"Bcqfi*drHS0as*F]l
+"F>EANK*pt!KW9>NrY:@O8k=?O8Y.GOcYZcOHPinQ2[-KQ2m3JQ2m3KIf=isJEh^bK)L?%K`$Q(
+Q2$U=Q2d0FQN3ENQi3<NQN3EKR/i]TS,JiWZi7?3[JRE3\,Wu9\c98@]D]DB^&PhG^]2(L_>_=J
+PlR-LQhcgDPPLC6OTjV!i8ESRro47EjlPXekND(.l2U#Kli$2MmJlVPn,MnVnbVhSoDS=Tp&"I[
+p\+C[q>C*`qtp<frU0Z9s+13[s*t~>
+JcC<$JcC<$h#H[=q>L-eo)&:[qYBj[r:g0`qt9s\rq$*Zs7--YrU9dS!:BaO!pf.:roj[OkND!i
+jlPS&irS/urnme6r_i_ol;IX\!`;ckr_rktr`&nt"B8;u<)iitr`&r!r`/tt!lW!orke]Os1nWK
+s1\NHrk&9D])>P);uK\q;ZK_m;>jDl;u]bl;u9Jg;uT\p;uBVp;uT_t;cH`m;u]hq;u]es<W#hq
+;u]ba;>*o_;>jDj;#jMn;#jMn=T2A(<`N*tr_i_orD`\ls&/kor(ur]ohbZcrDN8dr_i_ms&]2#
+s&Jkqr)`Yoq,dPr!*B%u!*/qqs&/kqoMkWbp/Lriqc<bur`/_m"]\T(='&H!<W#hp<VKGr;c6Ll
+<)ifr!42[3s0_a4rjVp;r42j=s1A6Bs1SHHrkJKK!5\ZOqc`r$!*]@t!DZAg9_qKQ:'KM3i8ESR
+ro47EjlPXekND(.l2U#Kli$2MmJlVPn,MnVnbVhSoDS=Tp&"I[p\+C[q>C*`qtp<frU0Z9s+13[
+s*t~>
+JcC<$JcC<$h>cg?q>L-eoDAC\qYBgZr:g0`qXsj[s7?0Zs7--YrU9dS!:BaO!pf.:rojIIkPjWD
+jT+B@irS/urnn%=hO9n&S!ofES,/TLRJiKXVPgAjW2ckurN$"$riQC-Yd1UArj;O0rke]Os1nWK
+s1\NHrk/9C!kPqQr0%#@$BUC3OH5E]NfB$WqhkH5qhtE3s,H]1rJM2FVl-JnWiN5'YHP16Y-5&.
+Y5bU*XK/GqN!5,sMM[1GreLE+qh>$&r.Y0*reCK0q1nm&pP8aKs/c4%!NrO&XTbl0XKA[\nqR7%
+M<TopMuAV4NW5"=NVnh:O8cZe\c0/C\[oAa]DfGD^:jKX!58BHs1niT`Poj;pW3AurK@,Cr07/F
+rg*8Erg<\RrL<_TpVd*Ns2G)[aSO!Yb59?abg"GYrQkMjp!3fec-=P[d/MJjZi@E3[J[K4\,Wu:
+\c98@]D]DB]`>eG^]2(L_>Cb@\H'5=`Vd[J`W*mV_uIUM_%>J\i8ESRioB([jlPXekND(.l2U&K
+li-8NmJcPOn,MnVnbMbSoDJ7Sp&"I\p\4I\q>C*_qu$BgrU0Z9s+13\s*t~>
+JcC<$JcC<$h>cg?q>L-eoDAC\qYBgZr:g0`qXsj[s7?0Zs7--YrU9dS!:BaO!pf.:rojIIkPjWD
+jT+B@irS/urnmt;hLgH6K`$K%K)C6$K)C2sJ-:OZKnb<WL&m'creCK0qhY<1r/:Qks2"`NrkJKI
+s1SEEs18EF\[d*8rd4Qhrd"Kfn9OhUs*=Edr-89rre:E,reCH/!f;_gq2#'-rHeHgq0;m_o61+U
+s*"?`!-J0^!-@gT!-S'Ys+pZ0reLQ2r.tB0regZ!pilOYr-A![s*"Bcqfi*drHS0aqg&6hrf-o;
+!KW9:O8k=?O84k?Ocu&qQN!6LQ2m3LQN)I5If4cqJF.pbK)UB&K`$Q'Q2-[=Q2d0FQN3ENQi3<N
+QN3EKR/i]TS,SrTZi@E3[J[K4\,Wu:\c98@]D]DB]`>eG^]2(L_>'8rQC%?/!0d/?oT9^Ahr*GO
+io9"YjQ5Lck3(pkrosIJs6K[Ns6]gRr9s[TrpfgTrU]sZp@\=Vr:fs\r;$9epA=dcqYfj]JcC<$
+\c70~>
+JcC<$JcC<$h>cg?q>L-eoDAC\qYBgZr:g0`qXsj[s7?0Zs7--YrU9dS!:BaO!pf.:rojIIkPjWD
+jT+B@irS/urnn(>hGR6M;c6Lll;IX\"&_rm;u9Pn<<Q9";cH`q<rZ2"<rZ/"<;sc7_>h=M^]2%J
+^&G\E])oRS\boA';ZKep;uTYp;>jDl;ts8g;u]bk;uKVn;uBVp;uT_t;cH`h;ts>l;u9Gk;"dc[
+;X.-X=T2A(<`N*tr_i_os&Akms&/kor(ur]ohbZcrDNMk!)i_nrDNVls&]/"s&Jkqr)`Yoq,dPr
+!*B,"qc!Gks&8MgqG[8js&B%uqc3Jo!`i<$pf.8ns&T/$!*8qrr)EVppJ_;p;GpFm<;onpZi@E3
+[J[K4\,Wu:\c98@]D]DB]`>eG^]2(L_>.:6=o;%r:/1^]qG$HS&Dl=&i8N\Tj5]4^jlY^gkNMp0
+s6BXMrp9[PrpK^Qs7$$Xq==LUr:K^UqtBs^p\=[^r;--ar;?Eimf%e;JcE:\J,~>
+JcC<$JcC<$hZ)p@q>L0foDAF]qYBgZr:g-_qXsj[rq$'Ys7--YrU0gUmHso>s6B[MrosIH!9a@D%
+cud4j5].YiS`YOhqm1XqO@;LrL!YSrgEYN%&]u$W2HVpX/rD)XKDK)"L#&7ZEsM:qm?LA^qfras
+1\NHrk/9C!4r->rf[/@rf@2BNfEsqoo&9tqMPKQVl6Pori6:+Y->.6Y-+u-Y5bU(XS7\RMuS\6M
+$&QhLPG\[s+CB)re(?*KS98Wr.b6,onN3rrN#t"rN-($rN-4*XfR83reL0$!JcL0M=-8tMuJ\1N
+V\\6\GWo:\d>pY]">Se]Y2%mrO`-ErkJKL"N/3t`lInrrKI5Dr0.,EqN_)Hpm;#JrL*\SrL<eV!
+5nNKs2G#X!QW:XaoBN]bQ#iecMc)hd.P]kcHXVZcdC1hZ*F;6r3QC0s0_d5s0r$<rOMs>s1A9Cs
+1SHHs1\TC\,3]7\ba;D`:h1L`;daT_YV(VhV[8LiSrkWj5f:_roO:Fkii$1!p]+;rTsROrpK^Qr
+p]pWq==ITr:K^Ur:^'_p\=^_r;-0bqu$?imf%e;JcE=]J,~>
+JcC<$JcC<$hZ)p@q>L0foDAF]qYBgZr:g-_qXsj[rq$'Ys7--YrU0gUmHso>s6B[MrosIH!9a@D
+&EW!6j5].YiS`YOhqm1AKS9>Wr.=p#s+:0"pj`O%KS>/7L&H`-LPCQ]L]<2.M#`G2MZU`1_#D+K
+^AknG]`5SD])B2=I/J?iHN/9fGk?:NHMVmfK8'/V"c/"lLkgc`L]N?grd+QhrcnEds*4Neq/ua^
+r-&*_"*A[.G5cX[FSp4LFT.*qL]3)0M>W20M#rQYGQ)jVG5umeGlW*`GQ)dcGPZOaH2W!aH2Dmf
+Hi8s'NWG3$q2bQ;rK$c9"Hen5Q'VE9rKdJKrI=fqr."]rmt(:drdt3(re1?:rK[2Cr078JrK[DK
+nsB<Brg*VPq3_5OrgWqXs0;R/r3QC0s0_d5s0r$<rOMs>s1A9Cs1SHHs1\PupQb'-o8sF;hr*GO
+io9"YjQ,G%joX`0kl0fJlKdd7m/QJPmelPQnG_tRo)/+Wo_.tUpAF[Zq#1$dqY0mar;6H\rdk*#
+s185\~>
+JcC<$JcC<$hZ)p@q>L0foDAF]qYBgZr:g-_qXsj[rq$'Ys7--YrU0gUmHso>s6B[MrosIH!9a@D%
+cud4j5].YiS`YOhqm0er)<2b!)rShs&8qo!)rkr!``3!r`&qtr_ierr`9&!r`0/%<5HAcrkJKIs
+1SEEs189BrOM`%oi(ifr_rVjs&&bnp/Cid"&i)r;uBVp;uTbr;ZKej;uK\l;ZK_p;>a8a;>F,g;
+>sD[;>aPq<s)K'<)`cor_rYjr_ibnqG?l_ohbWbrDNMkr)*MnrDNVlr`B&!s&Jkqr)`VnqH*\ts
+&]5$qG[;i!)rDe"&i/u;u'Dh<<-(q<ruE&<Vo`%<E)pt<E<.%='#/tr)EVppJ_Gt;GpFm<)lr'Z
+2V',Zi7?3[J[K5\,Wu:\c98@]DfJC^&PhH^AqF3=o__%:B4/h9_hEP:(,q9i8ESRioB([jQ6C'!
+pAe2rojLLlg+N9s6]gRr9sXSrpfgTr:BjYp@\@Wr:fs\rV?Bfp\Xjcqu,s^JcC<$])R9~>
+JcC<$JcC<$i;`-Bq>L0fo_\L]qt]p[qtL'_q=XaZrq$'Ys7--YrU9dSs6]gPs6B[MrosIH!9a@D
+!TiDAis=Z'iS`YOhqm2bS,&KQRJiTRRJN9\VPg;hW2HVpWiW;(XK8Q'Y5ba+Z2h60[/IE3^]2%J
+^&G\E]DoJA\HKFO[uupOOoCFDO,f4uN:MnsN;8A8N2<GNW2]cs#HY)4YHY45YPt[)Xn[kTMuS\6
+M>rA5LPCQ_L&H])K*6dYK7\aSK`6]$LAur/L4t?YLA-K$X8f7(XfSY,XT#@%Y5X1TL\-<&LPUca
+M=HJuMuSb3N<5-"NW"n8\,j.Orj`HK\[o>_]">Se]Y2%mrk&9F^AbnI_$.`q`Q#s=r5ei"s-!GG
+qNLlBrK[AJpQtlHrg<bTr1!_Vs24QKs2G#X!6>)[r5nu]rQ>>fc-=PZrQkMjp!3fec-=P\dJU6J
+Z2_--Zi7?3[JdQ6\,Wu:\c98@]DfGH]sb>V[^Z.Ds1.sEs2=QKrl"iSs2+ZL%,Kdti8ESQioB([
+jQ6C'!pAe2rosIJs6KXMs6]gRr9sXSrUK[Rr:BjYp\"IXr:g!]rV?Bfp\Xmdqu,s^JcC<$]DmB~>
+JcC<$JcC<$i;`-Bq>L0fo_\L]qt]p[qtL'_q=XaZrq$'Ys7--YrU9dSs6]gPs6B[MrosIH!9a@D
+!TiDAis=Z'iS`YOhqm2gK`6W%K)^K&K)C2oJ-L[\KS>/8L&H`+L]3&-LBE?fLku"d!/g`5rkJKI
+s1SEEs1A<Brj`0A\$pa4qg8<gl$;lHpiummL&-N.Ll$qELkgcaM#Vf#H2i-^GP64[Fo-7\Fng(Y
+F8p:\F7=;OL]iKhLkgcbL]E;1M#W>2GQ)j[GPu^bGPudWGP-4WH2DmfHi&g$Nqn_9OSk19O9Lc0
+Pa.N"rg3SLrI4cr!.OcorIFBgqh"d!s+LE+s-3JIrfdDJrKR8Gs-EVKs-E5BrL!SN!1<SM!1NnV
+r361*s0DR/rj;^5rO2a8s1&$<s186Brk&6Erf[>Hpm(--oT9R<hV[8LiSieVj5f:_roO:Fkii$1
+s6BXMrTsROrpK^Qrp]mVq""@Sr:KaVr:^'_q"Xg`r;-0br;?Hjmf%e;JcE@^J,~>
+JcC<$JcC<$i;`-Bq>L0fo_\L]qt]p[qtL'_q=XaZrq$'Ys7--YrU9dSs6]gPs6B[MrosIH!9a@D
+!TiDAis=Z'iS`YOhqm2d;ta,f;tNuf;[?8t;H$Oo<E)rs<<-"t;[$-#<`W4#rDrp4s1\NHrk/9C
+s183?!k>_Kp/:K\q,7,fs&/Vjq,.;n;H$Nl<<#nq<9[?[;>a8a;>jAn;c<QkrD;oZ!*B)#s&T>(
+<E3!sr_`_ppeh&hr_`Jfpeglar_`\lr_`Jhs&8hns&8emrE&qus&Jkqr)`VnqH*\ts&\tor)2WU
+s&B%urDikuq,dPqr)E\rs&B"us&T/$!*8qrr)EVppJ_;p;GpFm<;a!"Z2_--Zi7?3[JdQ6\,Wu:
+\c98@]DfGG]j"WA=nl1r:B=3apJ(0Q%,Kdti8ESQioB([jQ6C'!pAe2rosIJs6KXMs6]gRr9sXS
+rUK[Rr:BjYp\"IXr:g!]rV?Bfp\Xmdqu,s^JcC<$]DmB~>
+JcC<$JcC<$i;`0Cq>L3gpA4liqtp6eq=XO[p\aa\p&=U_oDJ1Ync/+Wn,MhUmJcGRlg!d7klU)3
+kPjTEjlHF$!TN);huV`lrn[F?opYoKr0[MPrL!V_!N)doW;ik$X/rG)XKDK)s0)U1ZEpn9[/RH7
+^:h5Z]`5VD])K8?\,a#;[K)KfOoCFEO,f3ZrJ^E-s,6r9pPf*0!0$T/&Z)A'Vl?\tX/rJ-YHY45
+YHG&)N;eb8MZ/J3L]W?dLAci)K`?]'JcLH%KE-`&L@p9"LAZi)LA\(VXKAS*Xf\](Xo3tCLB!&-
+L]E;!MYrD1N;SY8Nr4k;Njnqr!P,f@\I6!Z]",D`]=Y_g]tOBW%_]Tk^VIY%_o0O6a2c9BqNCiA
+s-3GFrKR>Irg*;Frg<VO!1NkUs.')+p;I!Ms2OrWrlP/^rlYGgc-=PZrQkMjp<N`arlkVld&sOT
+YPYR(Z2V'-Zi@E3[JdN8\%&sH\HBFT]=e-Orj;a8qmbk/s2=oSs2+ZL#Mn7oi8ESQir7s=jQ6C'
+s5sCGrTX@Is6KXMs6]gRqsXORrUK[Rr:BjYp\"IXrV-*^rV?Egp\XmdqYfm^JcC<$]`3K~>
+JcC<$JcC<$i;`0Cq>L3gpA4lEqtp6eq=XO[p\aa\p&=U_oDJ1Ync/+Wn,MhUmJcGRlg!d7klU)3
+kPjTEjlHF$!TN);huV`lrn[U-!/(-"s+C<&r.4Nks+LT/KnY88rIt<-reCE-rJ:E/s,-f6!ku@]
+rk/9Cs183?s0r'<rjDfSqg80cpj)j`pNcU]rcnKiom-RjqM#0/LkpnDL]3,/HN&0iGk6.TG5cXS
+FT-@\EWC1QFSp4[L]`EgLkkqbs,$`2rHA0apicX\rHA-`s*3sUq0;a]qK`.#qi1Q7q2YN;r/^]9
+$B^L9Q'IZ$Q^="dqgSNos+(#srIFHirdsrus+LE+rfmAHq3:iCrg*PKs-E5BrL!SN!1<VNrgEtZ
+Y-+t3qlp+*rj)L/s0Vd5rO)d:\@DLJ"1l+V]_dolPlR'JQ0=D/OoLUAOU'_!hr*GOiSsjs!T`AA
+k5XTEkl'cGlMp2Km/QJPmecJPnGVnPo)/+Wo_8%VpAOa\q#1$eqY0mbr;-B\rdk*#s1JA^~>
+JcC<$JcC<$i;`0Cq>L3gpA4kiqtp6eq=XO[p\aa\p&=U_oDJ1Ync/+Wn,MhUmJcGRlg!d7klU)3
+kPjTEjlHF$!TN);huV`lrn[QPpJUido25Qcr_its;,^Fn<W5tt<<-"s;u]i!<`N/u<W^"K^&G\E
+]DoJA\c9/>\,Ni.;YO,c;Yj8j;YX2c;?Kiq;cENl!)rkr!E2tq;uK\g;ZK_p;>sDb;>sJm;ZK_o
+;>a5j;>a8d;>a5j=8l;'='/Q'<rZ2";ZK_f;>3le;>sDi;>O,a;=mcc;u9Gm<rH,!<rQ+p<rH+n
+<r,kt<qTDi;?0YS<<#tt<r,kt<rQ+s<;ol%<)lq!<``>t<W#hp<VTMn;uTYu;cKp&YHRi-s0;R/
+rNlO2rjD^5!k5\LrOE6G]=Y^Z>?b64=T2J(=oMV!:B4/b:%(g^h;7&Ii8NYSro4%?jo4EBk5a`E
+l2U&Kli$2MmJcPNn,DhTnbD\QoDJ7Tp&+O^p\=O^q>L0aqu$BgrU9`:s+13_s*t~>
+JcC<$JcC<$iW&9Dq>L3gp%nd\W;ZSiq=XO\p\aa[p&=U_oDA+Ync&%Vn,MeUmJZAQlg!d7km-G8
+kN:pgjlHF$!TN);huV`lrnRS0qj[ALr0dMNrgEYNs/5mori#gr"K\`,XKDH(!jJr7rj2R1!4Dd<
+!kZ%Trji'=s0r!9!O\*cOTCN'rJg]5qMXs(rJU]5p5AsI$)XZ!W2Zl!X0&T)YQM&3Y)N@>rJ^c7
+!fDhkreUT0s+^H*s+L<&rIP3*KS4u2L&HbtL&Qf,L\QW$X8f=%X9,N*XS[_>LAlu.M"li#MYrD1
+N:r82NW?Qd\Gs/>\I6!Z]",A_]=Y_g]tOBW!58BH"Mhjj`5V_q!6=kts-*GHrKI5Frg!MLpQtoI
+qjIGPr1!Z&p;I!Ms2G&Zr5eo[rQ>,_"O,-8cHcF8s3UGbs3:\jcHlKlriZ7(r364+s0DR/s0Vg6
+rjMj9s1&'=!kPeIrjMg6!4Vp:s2O9As24oTrPJHJ!o;_jrnmh9ir7s>jQ5M&joX`0kl0iHlMp2J
+m/QJPmecJOnGVnOo)/+Xo_8%WpAOa]q#'sdqY9scr;-B\rdk*#s1SG_~>
+JcC<$JcC<$iW&9Dq>L3gp%nd#L&LlFq=XO\p\aa[p&=U_oDA+Ync&%Vn,MeUmJZAQlg!d7km-G8
+kN:pgjlHF$!TN);huV`lrnRY2KS0,Qs+C<&r.4Kj#ChG]KS5&6L&H`+L]3&,L]3,-M>rG5MuC9i
+]=PTQ\c92>\,Nf:[=%arqg/*ar-7s]r-J<es*46_re1*%!/UW2!f)SfrHeEenTXnSrcS'ZrcA$[
+r,_gWolU(PreLQ0q1o$-qf_p^!-\6^s*"EdrH@@JqKVj^qK`0hN;S\5Nqn_9OSk.?OH9@%"Hek2
+Q'M<6!.FZls*t#ur."`snq$gmpk/KtrKR;Hplt`Brg*SLs-E5Br0[MN!1<SMs-`qWriQ1&ric7(
+s0;U0r3QF1s0_j7s0r$<rj`$?q31fCs-3PIk`Yq-rK@&?!o;_jrnmh9ir7s>jQ5M&joX`0kl0iH
+lMp2Jm/QJPmecJOnGVnOo)/+Xo_8%WpAOa]q#'sdqY9scr;-B\rdk*#s1SG_~>
+JcC<$JcC<$iW&9Dq>L3gp%nbt<;l[jq=XO\p\aa[p&=U_oDA+Ync&%Vn,MeUmJZAQlg!d7km-G8
+kN:pgjlHF$!TN);huV`lrnRV1;ta,c;t<fn;c-Fk;c-Cj;cHcr<;onr;uTc"<`N.#<rKZ4]=PTQ
+\c92>\,Nf9[J*T!;ZK_p;ZK_m;u9Gm;uTZ!;,U7h;,U<b;u';l;c<Tnr)E\pr_rqt<)`Tlq,@;m
+!E2nh;?'Mo;>O2j;ZK_m;?'Jm;>a8h;><rh<``B$=9)G%<rZ1i;>O,g;>j>i;>O,`;=.9];ZKks
+=8l8"<V]\o=8,bl=7]Ah;?0YR<;fko<rc;#<W#hq<<cE&<`W:'<r#bo<;fhk<<#ku;H$QoXo>L&
+YPbX)Z2_--Zi@E4[JmW7\,Wu;\HocK=B\p5>$+o+>5qb*;#!id:AR]P:'08.hu;O7iSsjs!p&J)
+roO:Fkii$1s6BXMr9XINrpK[PrUBdUp[\7RrUfjWrV$3aq=sm`rVH<dr;?Ein,@n<JcEF`J,~>
+JcC<$JcC<$irABEqYg<hp&"ab!Vr\kq=XO\p\X[Zp&=U^oDJ1Ync/+Wn,MhUmJcJPli68Lkm-G8
+kN:pgjlHF$!TN);huV`lrnRV1g\dQ:Rf&TOR/`TLR/WuaVPjEls/Q+#"0JZ+Xo>I*YHY:;rj2R1
+!kZ%Trji'=s0r!9#dq%HZ]L92OHBF'!KW9>NV8>2MuSb7NW4q;Mu8P5Mu/D+MuKRPVZ<^qWr]?*
+ricC*r/LZ6s,-u:M2@&fL]<,*K`Hf)KD^?"K*$^[LAci+K^sisLAZc)LAS%OXoGI&Xnmb;L&m'c
+pke[$rJUT4pPo04!OfK9\,s4P])K5J]",D_\[oDb]Y(qkrO`-ErkAZQ_8=.0`l@b9!0d8D#*Y:9
+Q'IZ$p6Y]EqjRGPqnr-G!6+rWqoJfZrQ>,_"3f$7cMc)hd.P`ac2apEXSf4"Y5b^'YlD!.ZMh-0
+[/[Q5[f<f:\Gif;['d<M[f3Z7\,No;`ok;B`5BLk_Y_.Nh;7&ghuVfrro4(@jlQL(s5sCGrTX@I
+s6KULrpB^QqX=CPrUK[Rr:BjYq=X^[rV--_rV?Egq"ssdr;H'_JcC<$^Ai]~>
+JcC<$JcC<$irABEqYg<hp&"ab!Q'Qfq=XO\p\X[Zp&=U^oDJ1Ync/+Wn,MhUmJcJPli68Lkm-G8
+kN:pgjlHF$!TN);huV`lrnRY2gOo?Ss+C<&r.4Kj!e5ZJre1K.Knb>9rItE0L4tB]L]*&-M>iA6
+]=PTQ\c92>\,Nf<[C!<Ipj;maqK_p^pNcaard"Bcrd"Nir-A<q!J?+&L&d#.M#`>1HN&3gGk-%_
+G'A.RG'.s*FSg+ZFSKqWErU4SFS^(PL]DSpG5ZUbG5ZOcFEMbMrce?bms"bUr-/!^qK_p`!dflb
+r/LW7qi:f?O-':#!K`B@O9^o2PEhE!Q@8OW!.XosrI4ftnq$^jqLea"qiq)Fq31oFQN!0JQ3*>;
+QL^C?R/`KQR/*-NR]HFhr2ot$s0)@)s0;U0rNlO2s0_j7s0i$=P4t1>Pld26PNS)/Oo(==OTO@q
+hu;O7iSsjs!p&J)roX7D!9jCGs6BXMr9XFMrpKXOrUBdUq""@Sr:KgXrV$3aq=sparVH<dqu$Bj
+mf%e;JcEIaJ,~>
+JcC<$JcC<$irABEqYg<hp&"ab!G>C/q=XO\p\X[Zp&=U^oDJ1Ync/+Wn,MhUmJcJPli68Lkm-G8
+kN:pgjlHF$!TN);huV`lrnRV1g\k"M;u9Jh;t<id;Z]io;Z9T":fC:l<)lmsr`/nq!*&krs&K35
+]"7mOs1&*<rjDp:['[17;YsDk;Z9Vl;Z0Pn;?Bcp;Yj;l;Yj;n;H$Ni;ZB\p<!$'!;uKYq;tj8h
+;ZTcpr_s,$;Gg=i;,U<j;>*lg;c<Kis&/hnr)!DjohY]j=',?&"BSW(<D`6`q,%&frD<Gir(mJm
+:f1*h;Z'D[;Z9Vp<WZ?'=8c2!<Vof#=&rC(<`f#rr)`hq!*&YjrDEVom8X'bq,I5lqH!Ytr`/kq
+r)Nbts&T2$q,RAmrDiSkr_iftriH%"riZ:)r364+s0DU0s0Vg6rjMj9!4_r/"^,#4=]ef*=oqi'
+;"mcc:AdiP:'08.hu;O7iSsjs!p&J)roX7D!9jCGs6BXMr9XFMrpKXOrUBdUq""@Sr:KgXrV$3a
+q=sparVH<dqu$Bjmf%e;JcEIaJ,~>
+JcC<$JcC<$j8\KFqYg<hpA=da!;uhps7uB`qtL$^q"=UXrq$$Xrpg$Xr9s[R!:BaOs6B[MrosIH
+!9a@D''838j5].YiS`YOhqm2FgtUT;rL<VOr0d)B!LKY^VZEZmri#js"fn`,XK8Q'Xokl3Yd+/5
+s0Va8!k>_KrjMj7!4;a3q2bZ?O,j-tpl,64repi:rJpl9!/pc6!/pZ1pl#*I"/_uoW;Wb(Y->-i
+NJrjUN/NYnMuS\7M#W81LA?N'K`-Q%K):3!L&H]%L&ZhtL&Qi'X8f:%XS%;8L&d#-M#<,'MYrD1
+N:`)2[C3RC\,s4P])9)@]",A_rk&3Cs1SEE!58BH"2Maj`:fAoPQ$gFQ2[!OQ'R`&R$dl>s-NeQ
+qO%;NrgN_R!1`l&pr*3Orl+rYr5eo[rQ>,_"3f$8cMc)hd.P`bcMjjCX8f:!Xo>L'YPk^*Z2_-.
+ZN@MA[JmW5Zi@E4[K!]7[/mbHrPn'?!6"lSrPJHJ%Gfmuhr*GOio9"YjQ,G%k5XWEkl'cGlMp2J
+m/HDOmeZDMnGVnPo)/+Xo_J1YpAOa]q#1$eqY9scr;6H]rdk*#s1eSa~>
+JcC<$JcC<$j8\KFqYg<hpA=da"ic4LL&(Q<q"sg`pA"=Zo`"IZo)A1ZnGMbTmJuYQm/QAOlMg&J
+kQ'fFjq?e:jQ#:[io/hRhr!;Hh;$c>gA?L%KDgE"Jb4HmJ,XlsKDpT)KE?j^L&H`.LPCM;reLH.
+rJCQ3rOE!>\$u@Fs0Vj6rj2BHqg/9fs*4NgpiuOYrd"Qir-86e!IB+jHN&0mK7no1K_gE+LP^k6
+HN&3dGjoqWFoZ[^FR4)BFSg.WL]E5/M#VVkFoZ[`F96T.G4p.YG5-:\Gl2d^Gku^]HN&m$NVeb6
+O8b7>O8k=AO8b4COcu#pp4!$krdY3(J:N-!J:RTLs+:6$s+16%qL\NqrIk!2s-<DE"I5:=Q'M<6
+!gT(;nsB6@!13JKri5sus/c.#riZ:)rNQ=,s0DU0!joACrjMcgq3(lEQ'M<3i0*u"%Gfmuhr*GO
+io9"YjQ,G%k5XWEkl'cGlMp2Jm/HDOmeZDMnGVnPo)/+Xo_J1YpAOa]q#1$eqY9scr;6H]rdk*#
+s1eSa~>
+JcC<$JcC<$j8\KFqYg<hpA=da!,;F3s7uB`qtL$^q"=UXrq$$Xrpg$Xr9s[R!:BaOs6B[MrosIH
+!9a@D''838j5].YiS`YOhqm2FgtUT;r_ihs;uBPi;t<id;[lT&;,U7h;c?Ok;cH^rr`&ntrDN\q
+r)E_trOE!>\$u@Fs0Vj6rj28qr_r\l!)rbmn5K<ap/Cle"&i)r;uT_r<U`uf;uKSr;cH[or_ibp
+s&/emo2>Nar_i_mqb[;ip/(chs&]/$!EW:n;>*fg;,U:hq,%#e!)WVkr_i\ll;IU^!`rE(rDrnt
+qc<Ys!EN:r<rZ7h;u]bq;smW_<Vf\j<r5r"<`N/s<;]br<rZ5$<r,ho<;fhp;ufkq<<#nrWrB(!
+XSf4"Y5b^(YlD!.ZMh*2['d=@[K0Q7r)a>0>$>'2=B\m':Jam^:BXEe:/+IW:&n)^:(?%9hr!AM
+iSrkWj5f:_roX7Ds60FGs6BXMr9XFMrpKXOr:'[Tq""@SrUfpYrV$3aq=sparVH<dr;?Hjn,@n<
+JcELbJ,~>
+JcC<$JcC<$jT"TGqYg<hpA=da"o8/tWMlciq#'map@n7Yo`"IZo)A1YnGVhUmf2\QliQM<lMg&J
+kQ'fFjoOT)ro4CGiSi_Qhqm5Gh;$cagA[T<RerNOQiNQMR/<3RV5C/gVPa?k!i`3#r2]n#riQ@,
+Yd(M5Zi@B6\@8sH[f<`8[/I<3ZEa4e!KW9;NV\V5NW+n:NW5"?NJrhpMuJY8Mu/D,MuJ\6V$X#t
+Vl6VsWiN:^rf$W1"cA.nLkpi\L&Zi)KDpK"K*,=\>$Lo.s'#M,>5hY(>5X*QK`-W)LA@kNXbQM&
+m=tXrs+pN.pko!-qMbE5rf$c7s0Vm9\,Ef<\[oBM\HBFR\[qdPs1JBFrk&6ErkAKL_Y'&lPPp^P
+Q'R`&QBd]"QC%00rgEeTqj[VUpqumFs2G#Xs2Y&Ys2k5^s2tPhc-=PZrQkMjp!3]bWN#cps/Z1$
+r2p"%s0)C*s0;U0rj2X3!O]62Zi@E4[K!]7[/d]6`r<sW`:(\E`;[[R_YV(Sh;7&Hi8ESQir7s>
+jQ5M&k5XWEkl'cGlMp2Jm/HDNmeZDMnGVnPo)81Xo_S7ZpAOa^q#1$eqY9scr;6H]rdk*#s1nYb~>
+JcC<$JcC<$jT"TGqYg<hpA=da"o66^KS5'Rq#'map@n7Yo`"IZo)A1YnGVhUmf2\QliQM<lMg&J
+kQ'fFjoOT)ro4CGiSi_Qhqm5Gh;$cag@p3rJb4HmJ,F`rK7s5X",)A_L%pE%L]3,.M>rG7\@8sH
+[f<`8[/I<5ZE\e)rd4Wlqg/9f!I/h[GkZL`H2r6hGQ<$gHN&9fH3AkRKS+sRL&cT!H22^^G5ug\
+G62r1Fo$4YF8o#:;,I0dr_NSjr_NVk;#GG0F8LapLPUccFnTtYFo?C`F`qs%GPu^]GPud`GPZRY
+H2MsgNW+n7NW5"=NW+t9O8b7>O8k=AO8k=AOT:UDIKP(KIXh<F!.Xrts+(3$Jc:3!Jb"EfKDgJu
+PlI$FPlI$KQN*6HQL^C=R/*0MWV`^qX8f:!XoGR(YPk^*Z2_-/Zi@B5[?CKP!0[2Bs-*MKr0.,C
+s,lH,qN2'>hV[5Ki8NYSro4(@jlQL(s6'FGrTX@Is6KULrpB[PqX=@OrUK[RrU]sZqXsg\rV-0`
+rV?Egq"t!equ-!_JcC<$_#Jo~>
+JcC<$JcC<$jT"TGqYg<hpA=da!r6VJr`&Xer:g-_p\"LWrq$$Xrpg!WrU9dSs6]dO!pf.:rosIH
+!9a@D!TiDAisXl*iS`YOhVR)EgtVh^r_rkrrDNGinl#Hc$WKu$;,U7h;c?Rk;u9Po<<6&sr_ier
+rD`r#\@8sH[f<`8[/I<3ZE`Oin5K3^oMYcf;Z0P];ufkp;Z'Gn;Z9Vo;Z0Jf;?/iW49%AA4T@JH
+3]fDa3]m:;!)WViqb[8ls&]2%!*Abhp.tig;GpBf;#4&f;Z0Gn;H*0br_`Sk!*0#!!`rE(rDrnt
+qc<Ys!EN:r<p`fc<;ohb<;]bn;uouupf@8nr`/hpr)Nbts&T2$qGmGmrDibps&8nr!`Q(tql9[s
+s/c.#s/uC*rNQ=,s0DX1s0Mg7=oMS)=o;D$=oVS->#%gg:f.-es%`Jfs%WPgpJ1]`oM,\JhV[5K
+i8NYSro4(@jlQL(s6'FGrTX@Is6KULrpB[PqX=@OrUK[RrU]sZqXsg\rV-0`rV?Egq"t!equ-!_
+JcC<$_#Jo~>
+JcC<$JcC<$jT"WHqu-EipA=darV?KnrM]Yhr:g-_p\"LWrU]pWrpg!Wr9s[Rs6]gPs6K^MrojLJ
+kNDj,!TiDAirS/urnmh7hYu=3gtVh^!nj'4qO7;L!1<_Qq3^uEs/#^m#H"DtW2ZesX8T+"Xo>L'
+Y6(r5ZMq07['mEN[C!=?ZNIM<Z*=%c!KW9:NVe\6NVn_:NJrkqN;\Y7N;eb6MYN,-MufcPrhTds
+Vl-PrWr@tVMuS\7MZnurMi*CKreUT/re1H+>$G81>Q%b)=oMS)>l%\(>5h\)=oqo3=T2P)>5qh,
+=o__%=9D^-X/c-!s+^3#qh>*)o7d=%Lktnapko!-qMbH6qi(N6rj;g9\$u@H!kGnRr4)p@\[f<N
+]DoMD^&GYH]tV7roTK6<rfdJLQBqN:rg*SNpmD)Lrg<\Qs-ieR!M%+&_t_1M`W*pXa8<sXao9H]
+bQ#iecMc)hd.P`bVuN^pWVidrX8f:!XoGR(YPtd+Z2_*4Za$d@ZMh*0[/IE2[ee#A`::hE`;[[R
+_Y_1Lh>c=3hu;O7iSsjss5X1ArT41Ekihs/s6BXMqs=:KrpKUNr:'[Tq==LUrUfpYrq?<bqY:$b
+rVH?er;?Hjn,@n<JcERdJ,~>
+JcC<$JcC<$jT"WHqu-EipA=darV6W?b_1Y'L&C`Dp\aaZp&4O]oDA+Xnc&%Un,MhUmJcJPli68L
+klU)3kPjTEjlHF$!TN);huV`lrnRV1g]#n,g%^0rJb4HmJ,OiqJ,b0$K`[!^K_U9)KnbA=L]3,-
+M$AjG[^ENM[/RB6ZE^[=q0W0hr-JBg!-n?apNZ=Us*4Qho6LOlKS4u1r.Y9.H@#O8qKVm]rc\<c
+!+l+,s&&Yi"]8)l:f1'd:]=/r:Jah_:/4V]:&[rh:]=,_:]#qJL])AhFoZ[`F96T.G4p.YG5?F[
+Gl;j_GkH@]HN0!(N;S\8NW>(<Nr4t;OSt7?OT1@BOHKEhr."`qs*t#uqge`trIO`qs+C6$q1J["
+!1!;Cs-<SJs-<VKs-<VM!1!AGnsB3?qO.A]s/>prr2Tdts/c.#s/uC*rilF-s0;d6Ocbfip65N@
+qNLi>k*#V(s5!_3!8me6!TE&;j8\0?jo+<CkNM.-l2U&Klhg&ImJcPLn,2\RnbMbSoDS=Wp&=[`
+p\O[`q>L0cqu$BhrU9`:s+13ds*t~>
+JcC<$JcC<$jT"WHqu-EipA=darV?J1!)rkrr:p3ar:]mXrUg'[qssaVrp]jSs6fpSrp9[Ns6BUJ
+!pJh1roO7CjSn0?io0mp!T2c5h#Z<crn7M.<)cdor_rhrp/C]`r_rers&&eo#>nAs;c?Ol;u9Po
+<<,qr;u]hq<WBN-[K!W5ZNIM<Z*<7dqG[Dnr)<Gio2>`g;H$Km;t*cc;uBPm;ZSg?r]^<ErB:9E
+4ZrX(!'L6B!'L6B#Wb%04$,Pf4?EI)ofN:;3]d7?s&]5&nko*W"&Vro;>F&b;>=&h;tX&c;>sGo
+<)ris!*B,"r`/hrrDs##=8Gtt;u]bj;ZK_l;uT_r;sdQ`<VfYq<EJoqr)Wl!r`/kqqc3Yss&]"r
+r)EVpr)E\pr`&oqs/>prr2Tdts/c.#s/uC*rilF-s0;d6=BJ^/r`T;)r)io#r_EJhs%rVgr(m#]
+r(lu\s5!_3!8me6!TE&;j8\0?jo+<CkNM.-l2U&Klhg&ImJcPLn,2\RnbMbSoDS=Wp&=[`p\O[`
+q>L0cqu$BhrU9`:s+13ds*t~>
+JcC<$JcC<$jo=`Iqu-EipA=dar;$?l"fS>tW;-/cp\aa[p&+I\oDA+Xnc&%Un,MhUmJZDOlN$5K
+km-G8kN:pgjlHF$!TN);huV`lrnRh7gY1B7f[u\mRfAlWReiEPRf8`NR.lsIV>d@nVPjEls/H("
+rN$"$rN6I1YctF=Za7'H[/RE3Z2h0/YQ:qiqiCi>NqJD3N;eh/N;SS6N:Vu)MuolQVZ*FkVZNm!
+N;eb3M?&M2KE[!]KN_Vcr`]P2>$G06=o;G'>l@n*>QA"-=T_i4>$Lr.s'#D+r*&u#s&f;(s'#E'
+rN#s&!*]>(q1\g&qh=`us+gW1rJC6*rJU6*rf-la"h(nL\@B*K])9)@]",A_rO`!?"22F3PP(+=
+PQ$dLQ'Rc(R/E<FR/!*FRf]+t`:h+E`;dgV`W4'Va8j?\b5KN`c2Z)fci;Adci9m?VuEXpWVidr
+X8f:"XoGO(YPk^'Z2_-.ZN.B2[K!]8a8EsW`Vd[F`V[UQ_u@OM_>`6khV\=j!o`.uro4(@jlQL(
+s6'FGr9=7Hrp0IJrU'ROq=":OrUK^SrU^![qXsj]rqH9arV?Egq>:*fqu-$`JcC<$_>f#~>
+JcC<$JcC<$jo=`Iqu-EipA=dar:pWCcH_)rKn]<sr:g-_q"=RWrU]pWrpg!Wr9s[Rs6]dOs6B[M
+rTORNkND!ijlPS&irS/urnmh7hYu=8gtUQ:g"=sQK):,kJG4NoKS08Xs+CH-L5#MZ!JQ:,L]3,.
+M#t)l[/RE3Z2h0/YQD"UHi/6kHi/3iGlW*`GQ)jeH2MpZH1?1]KS08W!J?+)L&cQ!H2;amG@tN"
+A7T7`APuJ+;?0Sn:^Koo:f1(d:f1%cr_NDf!DcPk:BOEg9ht=VrD*AerD*6G!/LDFrcS0_!-S6^
+!-S6`q02a[qfhm]qfhs_om-O_rJgi9rJgf:s,I#<rK$r>rK$u?s,R20J,FcqIfP#uIfb(KJ,Xut
+JcC?"JbOcpKD^?!KDgH(Pa1s,!1!PJs-<VKs-3YOQ'M64n<a$>qjIJ]r29Oms/Gprs/Z1$rN6+&
+!3c@*!3uKbs-!/@s-3ADs-!;Bk*#V(rnRV3hu;O8iSrkrir\<'jo4EBkPscDl2U&Jlhg&ImJZJK
+n,;bSnbMbSoDS=Xp&=[ap\O[`q>L0cqu$BhrUBf;s+13ds*t~>
+JcC<$JcC<$jo=`Iqu-EipA=dar:pV9Df8NP<)iYfr:g-_q"=RWrU]pWrpg!Wr9s[Rs6]dOs6B[M
+rTORNkND!ijlPS&irS/urnmh7hYu=9gtUQ:g"=qVr_rbpqG[Am!)rkps&&\ls&/nsr)Eer;,dHk
+"]A8t;H$Nk<<#tu;ZB\p<<#r"[C!=?Zi@<2Z2Us-YN/UX;uTbn;uKVa;Zfop;H!Hlo2G`h2?#H4
+2$>fr4[)(/4oRVK4[(qj4?WL&!B`OD48h8H4Zkkh3]fGbqDnO9rB(9G3]]>a4?WUC"]e],=?&;=
+2ZPc3;>3lh;,U:hq,$rcpeq)iohtZar_`o#<)lt"<Vfbq<Vohq=8Gts;uT\j;u]bm;r1IS<`euq
+rDru"r`/kqqc*`!='&Gu<W#hq<W#hq;Z]pqVYm@kW;ijpWrK."XSo:$XoP[(YQ1s,=T;P'=o__'
+=T;P%:Amud:Ado_:ARcZ:B'&MhV\=j!o`.uro4(@jlQL(s6'FGr9=7Hrp0IJrU'ROq=":OrUK^S
+rU^![qXsj]rqH9arV?Egq>:*fqu-$`JcC<$_>f#~>
+JcC<$JcC<$k5XiJqu-Eip\XmbrV?Hfrr<"r!iW#qrqH?aq"=RWrU]mVrpg!Wr9s[Rs6]dOs6K^M
+rosIH!9a@Ds5aFFj5].YiVqaDhqm2Fgt^Z<g=b-1fDM-<Rf&TQRf8`PR.lsIQ33JLUo"'f#cFPt
+W2Q\qX/l6$s/l:'s/uL.Z*O>7s0;X0rNH@,Y*&UC!KW9>NW4q=NJrhlNV&2+MZSiqMuJ\4Mti81
+VZ*FkVu;PPJcLB#JcgR0?!R>4$sZt>>Zt95>$>-6>?q,2rETA*#$P59>?b96r*')($X-Y9>Zt?8
+>$4s0=o);%>Q.h*XT#7&W`r\2qcWr&rE9/Tqh=d!rJ(B/pPJg*rJLZ7rJUN2s,-l9rf-i`!OfK:
+\,a)=])9)@]",A_rO`!?s-!DGpQGK="I,1;QC%K9!13JJpmM,MqO@N&!6"TKq8<9PrPncVrlP/^
+rQ>;ec-FW6ci;AdcN'd?V>mFjVuEXpWVrjsX8f:"XTbl2YHY::ricI/ZEjG8!4;^4"1H:ka8O$W
+`Vd[G`V[UQ_u7IL_$\uRh;7&Hi8ESQir8!<jT"?@k5XWEkks]ElMg,Hm/?>MmeQ>MnGVnQo)A7Z
+o_\=[pAXg_q#:*fqYC$dr;?N^rdk*#s2+ed~>
+JcC<$JcC<$k5XiJqu-Eip\XmbrV?HfrltY"K7no3rqH?aq"=RWrU]mVrpg!Wr9s[Rs6]dOs6K^M
+rosIH!9a@Ds5aFFj5].YiVqaDhqm2Fgt^Z<g=b-1fD:*rJbFWgJ,as(ItNE,KS>,7KSB5V!elA`
+reLK/rJCQ\s0;X0rNH@,Y'g1ps*Ofnr-JBg!-n3]s*4Ngqfqg[ms=nb"+u;^LAcAtAc?3E@q9([
+A7JR9;?0Sn:^0cm:f1+f;#X>e;#=&e:Amrg;#X5p:/+JX9hnIW:]=,dL]E5*:&@W_Fo?LZGPlXW
+G5umbGPl^\H2i*hH2`-fN<5&uNrG%;NrP+<Nr>%<OSt4DOH4j>It.BFrdalq!.b$!qgng!rIP$#
+qh"g"qL\Wts+LE:!1!,>rfmYOQ'R`$Q2Hs;Qi!0IR/j&^V>mFjVuEXpWVrjsX8f:"XTP`0YH[qe
+!0[&>!0m>Drf[2Ak*#V($JaInhV[5Ki8NYSro=%>s5j7Bs6'FGr9=4Grp0IJrU'ROq=":OrUK^S
+rq$*\qt9p]rqH9arqZNhq>:*fr;H*`JcC<$_Z,,~>
+JcC<$JcC<$k5XiJqu-Eip\XmbrV?Hfrbqg6!`DrrrqH?aq"=RWrU]mVrpg!Wr9s[Rs6]dOs6K^M
+rosIH!9a@Ds5aFFj5].YiVqaDhqm2Fgt^Z<g=b-1fDAPC;uT_s;c<Qkr)*Mnr`&nts&9G-;,U7h
+:f1(f;H$Ll;u9Po<<H/t;cEZps&K**s0;X0rNH=+Y3Jmb;uBPm;u]bo;ZKem;u]ba;uKVm;uBVl
+2#]?42#]];4oRVL5<V+k4Zkk*3sIf/4$>\f48h8H4Zkhg4$>Yer]($@3B@'us#9m9q`4U9s#C'=
+r`',&='/N`3;b]82Z,H42ZHYO;#aDm;?0Sl;#!od;ZBVn;ZB\f;Ys>j;ZBc%<*!%"<E<,t<rQ)!
+=8l5$='#9$r)Weq"&_un;Yj>j;Z'JM<<#u!=8#\n<rc;#<W#ho<W6#"='#,srD`_qr)EYo!2TUj
+s/,^lri#jrrMomus/c1$"0Si2Yl%W&=oMS)=o;A%=o1tm:]*uc:B=3dqbHu`oM,bKh;-rFhr*GO
+iSsjss5a4AroX7Ds60CFrp'LKqs=:KrU0LMrUBdUq==OVrUg![rV$6bqY:'crVH?er;?Kkn,@n<
+JcEUeJ,~>
+JcC<$JcC<$kPsrKqu-Eip\Xpcr;$9crr;qps/>niq"=UXrU]jUrpg!Wr9sXQs6]dOs6B[MrTOCI
+kNDj,&EW!6j5].XiS`YOhVR)EgtVh^"PMGZf@Knis-itUqjRMPr0[8GrKdGLs.o[k"K/,pVPjEl
+!ii<%riH.%riZ:)s0)X2ZEga?rilF+"0Sc.Oo1=@NrY4>NW+n9MuSb6NVJJ4NW"h5Mu&D2MtW)7
+V5C)dV5:&erdk6)>[:Y4>QA"-=o_e+=o__)>52>%>Qn>8>$5$5r*&u%rE9J3>$>'2='&L+r)Wr%
+=]tW*s'#J+riH+""0,R0>5MJ&>5_V'=T2CqLAlu.M"cc)MYrA4N;AJ2N;eb7N;Bp^\,Nl;\c029
+\H'5=])]MCP5ga?P5UUEPQI,9QgpI<RJ`NPS,]#X_Z7XJ_u%CP`VmdVa8O*Yao9H]b6#o5cMc)h
+d.krbV#I4jVYm@lW;ijqWrK."XT#@"Z2Us-Z2Cp-Zi7?7b/q`FrPnfTr5A3GqnrKPqni<Js1efn
+h;-rEhu;O8iSrkrj8\0?jo+?AkPj]Cl2KuIlh]uHmJcPLn,;bSnbVhUoDS=Yp&=[ap\O[aq>L0c
+qu$BirU9`:s+13fs*t~>
+JcC<$JcC<$kPsrKqu-Eip\Xpcr;$9cs3:VgrIk3)rV$$ZrUg'[q==OTrp]jSrpKgRrTsRM!:'OI
+!pJh1roOdRjQ,@]io/kSi8<DJh;-l@rn7M.f[na+pk&Krr.+furdacnrI4`q$%dh_K8##6KS5'Y
+L&d#-L&m!_reLN0rJ:T]Z*F;4s/uL,Xf_AFrd+Qhp36O]rd"<apj)7Q#_Re_KS4u2L1C3nq,.2i
+rD3hu:Jakb;Gg7e;Gm?gr_`PhqbR5es%`_n:Jajd9`e'a:&Ic_:&Icb:&B_HL\X[=9EIp^9_`i1
+G4'SOGkcR`GlE!cN<5&uNrG%;NrP+;NrG+=OT(=?IfFopIKG"LJGaosJGt,nK)L6(Jq8K)JqNiM
+s+C?)s+UH:!1!,>r0@;Jrg!GJn<a$>r0dJYrh]Xlr29Rns/Gsss/Z1$riQ!Y!0[)?!0m;Crf[2A
+k*#\*s,[E>h;-rEhu;O8iSrkrj8\0?jo+?AkPj]Cl2KuIlh]uHmJcPLn,;bSnbVhUoDS=Yp&=[a
+p\O[aq>L0cqu$BirU9`:s+13fs*t~>
+JcC<$JcC<$kPsrKqu-Eip\Xpcr;$9crbqd5!`N&trV$$ZrUg'[q==OTrp]jSrpKgRrTsRM!:'OI
+!pJh1roOdRjQ,@]io/kSi8<DJh;-l@rn7M.f[na+rD`Pj!*&qr!)ibmrDNYos&8turD`br!)i\k
+s&/kq!E)kn<<#r#<)QXnr_ru"ZE^\6YlCm.Y-"hq;ZBVn;Z9Vm;?0Ym;W:UW;,U7hrDWYPs#pEI
+r]pHIrB:BL4[(tj4o@GB3s.T+4$<@$!'L6B"?eh-3&pgr#<4Y%2`N`V3W1r83<;)ur]'m9r]'mW
+"]e],=#`2;2ZPc62>f?62`Nhs;?'Mo;>a8c;>sJl;?'Po;tNu_;>sT#<E<.#<E<,t<rZ/#<`f9$
+!EW>$=8l5#;Z9Sp;Z0Gm;YsDl;YsDL<!--$<`erpr`9/%<E8oqr)N_s!EW=u<W#hp<W#hr;uEHj
+V>mFjVuN^qWVrjsX8f:#Xo)?$=Sl8!=9).n:Amud:ARcb:A@WW:'KG/h;7#Grnmk:io9sts5X1A
+rT=.Croj:Erp'LKqX"1JrpKUNrUBdUqXXXWrUg![rq??cqY:'crVH?er;?Kkn,@n<JcEXfJ,~>
+JcC<$JcC<$kl:&Lqu-Eiq"t!crV?<bs8N,up\^oiW:p&[r:KsZqXXUTrp]jSrpKgRrTsRMs6BUJ
+s6'IGroX7B!9F.>!TN);huV`lrnRq:gY1B7g"=p.f%'bhqO7;Lr0[8GrKdDK$'qE`V5:&dVl$?j
+W;ijtX8T+"Xo5C&YPta0ZEUR:YHIl,s/c6_rfI/@!07&<rf$l8re^`7N;eh6MunorN;\b8N;AJ.
+Mu\e1N":8[Gbq:6VPU,dW*N\6?!R82r*',)!a8f5r`]G->[%,3rEB5*r)s2,>$P>3>7"J;>[1H9
+=BJX,r`KA-=BJ^/r`B2(>5DD$=T;G$X9P]*X/]B.=o;A&=^(`+r`K&!s&T#Os+gN.qMG0.oS`^-
+qhkK6[/.01\,Nl;\c',9\bs)=P5^[>P5URIPa.Q#Qh$O>RJ`NOS,]#I_tq:O`VmdVa8O*XaoBN_
+bQ#cec-H:6s3USfs.]Lfr1s@hs/,^ls/>ssri6"!!j&T0r3?7*!3uI-s0Ds;[E?Y6aN)<s`VmaG
+`VdXS_tq7M_>V.Lh#?+1hV\=js5<t;rSmt?jlQI'roa=Fqs"+Frp0FIrU'ROq="=PrUKdUrU^$\
+qt9s^rqH9arqZNhq>:-gqu-$`JcC<$`;b>~>
+JcC<$JcC<$kl:&Lqu-Eiq"t!crV?<b"4#03_Yf&fL%b?8r:KsZqXXUTrp]jSrpKgRrTsRMs6BUJ
+s6'IGroX7B!9F.>!TN);huV`lrnRq:gY1B7g"=p.f%'\Ms+:<'rdjfopj`6krI4isK)UB-KS>/6
+KS>/7qh></L5(J=Lku"ds02O,!3Z='s/c$Crd+Qhs*4Hcs*4Qfs*4NgpNZLZms5.B>?c`5KDgH'
+LAk!L;>j;k;>a;l;>sAn;,U9g;#4&h;#F)k:eje^r_WJe!)<Gf!)NShs%WMgr_;uZqhP6-q+^BQ
+s%<?9olfqNr-8$_qfi*dqMbQ8NK4!trJgl;rJpo=rK%#?rdOirr-nWp!.aus!.b$!pO`$gr.=j!
+s+Tg(r0@;Jrg!GJn<a$>rL*\[rhKCes/#amr29Rns/H!ts/Q4&O-'1"!0[,@s-3>Crf[5Bjc]Y+
+rK%$7rnRV3hu;R6i;hm9ir\<'jo+?@kPscCl2KuIlh]uHmJZJKn,DhTnb_nUoD\CZp&=[ap\O[a
+q>L0cqu-HirUBf;s+13gs*t~>
+JcC<$JcC<$kl:&Lqu-Eiq"t!crV?<bs).pSC&Us3;H$Qgq=X[XrU]mVrUKmVr9sXQs6]dOs6K^M
+rosIH!9a@Ds5a7Aro4%=iVqa9hqn@g$JaCig=b03f@SU(r`&Mgr)*Gks&/nsr`/nrrDikrr_Wu"
+:f1+g;c?Rm;u9Po<<?&s;uT`"<Nr^2YHIl,s/b`gs&&eo"&i/u;t<iK;[4p,/Q#DC;H!Kmr]U<H
+r]^0ArB(?I4?P\e4?GScr]L*?!'L0@!BE+:3<2#;3"7f+3''&Y3&ir[3&ir[rAjd:!]W+trAXd;
+r`',&='/N`3;b]82Z,H12?Gfs3W(l8;#X;l;Ys>j;Z0Jm;ZBYq;Z9Pe;Ys;k;Z0W#<E<.#<E<,s
+<WZ9%=8l7u<sD]';H$Ll;Z9Mn;Ya8k;YsDK<<#ti<rQ/%<`N/s<;]bo<r5no<;]bq<!-&sU8%X^
+r1s@hs/,^ls/>ssri6"!"0>U->5_V'=T;P(=T;P&=T;1n:Amue:AI]c:A.KU:&s)Kh#ZBiro!h8
+!93t;!p&J)rT=+Bs60@Erp'LKqX"1JrU0LMrp]mVqss^Wrq-*\rq??cqY:'crVH?erVZQknG\"=
+JcE[gJ,~>
+JcC<$JcC<$l2U2NqYg?ip\XpcrV?6`"TSDnna-.N!3#hgrUg'[q==OTrUBaRrpKgRrTsRMs6BRI
+!pJh1roO:DjQ-=#!TN);huV`lrnRb5gY1B7f`'J'f%'\frgN_PqO%&ErKdDKrg"(lUnji`VP^8g
+Vl6PoWiN3"XT,F$XoP[)YlCm*XTY`+X-&PDOT(:BNfB%tN;nh8MZ8V7Mu\k7N;\\7N!#&uMi@Fh
+oo/os!dJp6rH\p+V5C)dV5:&e>[1Q?>lIt-?2n.+>Qe89?!LY4=oqr5>5MM6>[:Q<=^#'7>$>$2
+=]ei)>5hY+=BSf)=Sl8#=T)D%=T>H,WiN2#>?b8.=92Q.r)s#$qcEbtrDilQqM>*,r/1-)rf$`4
+!fXLnqm?I5\,No8])&u;]D[oiPQ$^FPPpXEPPp^IQ'Rd2QiNQRR.ZmFRf&WT_X>>=_uRdU`r=$X
+aSj3\b5KN`bl>rdci;AhchsL9UAq"eV#I4jVZ!CoW2ZcqWrK4&YH[r0ricC-r3H@/s2tSgaiVWE
+`r!aQ`:CnH`;[[N_Y_+Kh#?+2hV[5ihu_lsir8!<jT"?>k5XWDkkjWDlMg,Fm/HDNmeZDNnG_tT
+o)A7[o_\=\pAXg_q#:*gqYC$dr;?N_rdk*#s2=qf~>
+JcC<$JcC<$l2U2NqYg?ip\XpcrV?6`"O+m%]<qHg!/:@DrUg'[q==OTrUBaRrpKgRrTsRMs6BRI
+!pJh1roO:DjQ-=#!TN);huV`lrnRb5gY1B7f`'J)f%#A(r.>!$rdjfopj`6krI=fq"G28ZK7j/W
+!JH1*L&d#-L&m!_reLN0re^ZXriH7'X/l&Crd+Qhs*4Hcqfr*cs*+NfqKVa[p3HdH?!I84s'5_<
+K7nmUKEd-,:f1(d;#O8d;#aDm;#O8k:]X?erD*Vo:Jah`:f%$b!DcGb:'F?e9heAXr(R5f9hkU^
+r_<>dr_<<H!/LAEnP&pTrClm-pilOYr-A0a!."C""H8>#NK*jr!0-r;rf7&@rI4WnrdOir!e,WK
+rIFlupOWI!JqEWGrIY'%rIjO%qj%2IrK[AJn<`s<r1X+as.fOgrh]XlrMK^qWN#lss,[2AqN:f@
+qNCuGPa(s,s-!;Bjc]M&!8RS0!oDhlrnmk:io9sts5a4Ar9"%Broj7Drp'LKq<\+JrU0ONrUBgV
+qssaXrq-*\rq??cqY:'crqcHfr;?KknG\"=JcE[gJ,~>
+JcC<$JcC<$l2U2NqYg?ip\XpcrV?6`"E/*iARYO7!`Drqr:U$\rU]jUrpfsVr9sXQs6]dOs6K^M
+rTOCIkNDj,!p/M(ro4%=iVqa9hqn@g"l.kdg=b-Xf*0aU<)cjspJ_)irDEPlr_ierr`/nrrDa5)
+;GpFj;Gg:f;,L6h;u9Po<W>ts;uTbrY5YO)XK/Dt;?Tor;H$Nn;ZBVo;?0Yp;ufkf;X@<_0/!5U
+s"FC)"YrqQ;,U<k;u\u[4T[`-48qAA49%GC3rh>@4Sh,A4?Ybgr]:0A3&pmt(-"642`E]U3]T/Z
+3BB2]3&`fW3'')[r\jg;q`=^:rAsp<s&B&"r`B+Zr&4U6r&+C1!]N)!r&FU5!Dubn;>jDj;#jMn
+;ZK_p;>*ob;#sQprDj,&<`W4#<`T-""]\T(<E<3#<rQ2!;ZB\o;?9WmnPf0]r_r5as&/nur_rr!
+<`Scm!EW>$<W#hn<W#np<Vobm<W?%rU&LedU]%"fV>mFkVZNfrWW&n"=]ed/r)s5+=BJ^/qcNhn
+q+gobr(cTSoM,DArnRY4hr"Fk!o`.uro=%>s5j1@s6'CFqs"+Frp0CHrpB[PqX=CPrpfmVrq$-]
+qt9s^rqH9arqZQiq>:*fr;H-aJcC<$`;b>~>
+JcC<$JcC<$l2U2Nqu-Hjp\XpcrV?9arq?TinE]/mVYm=mW:g)\rU]mVrUKmVqsXOPs6]aNs6K^M
+rosIHs6'CD($4N;j5].YiS`YOhqm2Fgt^Z<g=b-Xf)jOReGYm9Rf&TPQiNKPR/!$HQMm0JQ3jIc
+UnsobV5L2grhot!X/i>'riQ.%#HtA9Xf\\*X8]-tOT(=@NrP+<N;e_:MMmDfN;JM5N;&81Mu\e4
+Mu\2'GlDspH?k-qJqAW/KVeXEs.o^nqHWr(s',P.qca#)!aAi5r`fA,#@1P;=B\p5>5VP&>5h_,
+>$:i.r)ru%!*T,$r`T,#"'M_,WrB(!>6%h(=92Q.r)s#$qcEbtr)Ei"<E<3#M#E2-MXu`+N;AJ3
+[/762[f3c:\bs&8\bqWaPPp[DPQI,9QhQmGR/i]TR/i]ORJiTPRff1u_SYcZqo&KQ!65#YrlG)\
+s2t;`s31MfrQkMjrm(bpc_$i&T_tM`UAgqdV#R:kVZ!CmW;Ne"YHY80Z2_'.Z2Ls8ZcpY:bK@rK
+aN)<t`Vd[L`V@CN_u.CO_>M+KgAp%.h#ZBiro!h8s5O%<s5a1@rT=+Broj7Drp'IJqX"4KrU0ON
+rp]pWqssaXrq-*\rq??cqtU0drVHBfr;?KknG\"=JcE^hJ,~>
+JcC<$JcC<$l2U2Nqu-Hjp\XpcrV?9arq?T4]!JN;L&?T)L%YB9rU]mVrUKmVqsXOPs6]aNs6K^M
+rosIHs6'CD($4N;j5].YiS`YOhqm2Fgt^Z<g=b-Xf)jOReGY%!K)C2uJ,k)uJG=WmIf4cpIK4cn
+KE$W1L4k56L4tA;re:K0KnfS^s+p]3s/c@(X/l6"qKr3frHSBfr-/$_rd"He!-e<bp3HR^r`fV2
+>[(E<>lJ:6AHHIVKD^B'K8'.uoMPTa!`)Qfr_NPjs%iYk!DcPk:'49d:/:darD!Di:/1^_#Ye&g
+:/4MY:/1CVr(R/dqhY)CpIkQ[qb6u^pe:R.rHJ6as*+-\!."Ec!0$]4s,R,=r/Lc:r/Lc<r-n?h
+rdFisrdb!!p4E6qs+19&K)'utK)^K$KE-_lPl$aGQ2m0KQ2[*=Qi*3SR@'V=TV24Vs.]LfrM9Ii
+s/,am!3#gVrfI#>"-Sk4Pl?mHQN!-DPQ-gDOnt4@POF\7Oo1=@gAp%.h#ZBiro!h8s5O%<s5a1@
+rT=+Broj7Drp'IJqX"4KrU0ONrp]pWqssaXrq-*\rq??cqtU0drVHBfr;?KknG\"=JcE^hJ,~>
+JcC<$JcC<$l2U2Nqu-Hjp\XpcrV?9arq?S0A7/\H;Z0Jm;?6Cfo_nCXo)8+XnGD\Rmf2\Pm/QDO
+lMg&Jkl9iFjq["=jQ#:[io/hRhr!;Hh;$f?g=k64rmq>)e^RT!<;9Dk;?0Sn;YsDm<<#ts<;ff$
+<)Z[m;,gHm;$]uq;,U:j;c6Qm<";o-<E2sq;c?XpXf\\*X8]-q;Yj>i;?0Yp;ufki;?0Sn;XmZk
+0.nk//h\k10)dU/1GgsG;>jDl;uJfW49.PA4Sh,A4?Yegr]L3@s#C$=!B<%;3<(r;3!;6#3]T5"
+3!VB&2`NfY2`LUn!&sU2r&4pA3`T0\<``B_3;b]82Z,H12?Gfs3W:u=2`URk!''pTr)*Gkr)*Jl
+s&8kos%rboqGI8mrDiu"<`]0!r`02&<`W4$=8l5$=&])rs&8blr)<Vnqc!Mo!)rYlqbuu`##eK&
+<DugqrDiPls&T2$r`/kqqc3SqqGmDlr)Nbrs.B=ar1X.brhKFfs/#amrMKXor`TG-=BJ^/rE9>,
+=BJ^/rE0(q!_uNeq+gobr(d)a!)W;`ohPPA!8RS0!T)`5i;_d9ir8!<jSn9>k5OQCkkjWDlM^&F
+m/HDNmeZDOnG_tTo)A7[o_\=\pAXg`q#:*fqYL*er;?N_rdk*#s2G"g~>
+JcC<$JcC<$lMp;Oqu-Hjp\XpcrV?9arq?TinE]/mgA.ZHo_nCWo)A1XnGD\Rmf2\Pm/QDOlM]rK
+ki_..k5XNCjSn0Iio/kSi8<DJh;-l@rn7P/f[na+ec+(tS,SlSR/iWPQi<BIQi!*JQi33]V5L/c
+V5:&cVPg;iVl6VrX8]4"Xo5F&YQ1a'WrK'pO91K'Nr=q;N;JP/N;AJ3MY`80Mu\e8Gl`/8rH]!-
+K7ec-K7nl/Kn>#1KqtRDV?3TlW;9^)>[:T>>?b97>?q,2s'5S0"'f&6=T)J&=o__)=o_e+=o__(
+>5qb(=q+V<=^"s1>$G07>$4s0oN;3qXSo4"=o__'=Sc2"=Sl2!<r>r%<`N1%=&rB$M>2trMZC*_
+ZiRSArNuX6rjVs=r4;j;qi^W9rK7;IPa.Q$pR(oIpmV2MqjRMRrgX#+_u@OA_u.IP`;mpV`rO3Z
+aoBN]b6Q89c-FY]d*Va;!7:\9s.B:`rLs7cs.fOgs/#am!iN-%rN?1(s02I,!3lI-rNc@E"j4s.
+aN)<t`TtJ@_u@OO_>M(Mg=tE^h>c=3hu;R6iW%p9j8\3?jo"9?kPj]Bl2KuHlh]uHmJcPNn,;bT
+nbhtWoD\C[p&=[ap\Xabq>L0dqu$BirUBf;s+13is*t~>
+JcC<$JcC<$lMp;Oqu-Hjp\XpcrV?9arq?Zk]!JK:UkOO"K`C]CoD.tVnbqtSn,DbTmJQ>Nli68K
+klU)3kPjWDjT+B@isXl*iS`YOhVR)EgtVh^"khP[f@JLOeGb+"K)C0"JGaorJG=WkIf=isIKFqF
+Jc(0!K`Hf*K`Qp`qhG**s+p]3!3?+!s/GjArHeHg!-nEcqfr*coQ^.Vr`fb6>[1K<?"IPWA,TsD
+AnP[eA7gIHrIb9*Kn`J(:]OAi;#F)h;#X8j;#X8i;#*oe:ARc`:&n#f:B+&f:('ci9MJ5V9he;U
+:/:LW!/LK.qG$]X!)*2_r_)rY!DRb8GPu^`GOTkWMueosqMkN8s,Hr:!0-u<qgS3frI+csJGt,k
+K)L?"K)U?!JcLH&K`6\jPl$^IQBd^5PlR-EQN3?KQi!-MRJi`WTDkM^U&UkeU]%"gV>mCmVu)PR
+OSb.DP*;,pPEZ!2s-38As-!;Bl&u"-r/_!6gYDeas5!b5ro!h8s5O";s5a4Ar9""Aroj7Drp'IJ
+qX"1JrpK[PrUBgVr:9jYrq--]rq??cqtU0drVHBfr;?KknG\"=JcEaiJ,~>
+JcC<$JcC<$lMp;Oqu-Hjp\XpcrV?9arq?ZkA7/\H=]//q;$'Yfo_nCWo)A1XnGD\Rmf2\Pm/QDO
+lM]rKki_..k5XNCjSn0Iio/kSi8<DJh;-l@rn7P/f[na+ec+&"<E)or<;]\l;Yj>l<;onp<<#r'
+;c6Lj;,U@lrD<er;,^@k;GpHj<<#r&<)QXn<)fptWrK'o;Yj>i;?Kis<)`Hfr_`Ympf%/E"t_G\
+0.nk5r\=I0r%nR71c.'e;>jDl;tN3P48h8J3]T2[3&ruY3&ggrs#16F3&`cU3&rrX3W:uE3BB,Y
+2`WiY2`L^q"ZA4q2E!Ml2YT013!E8]<E<1'qD\:/r&+U83'$mrpc&.2r)*Gk##S2n;,L4hr_reo
+r)!GlrDEMnr)W_qr`0;)<`W4$=&r3trDEVoq,7/irDNSmoi1`cq,I;kr`&ks"]e]);c?Zo<VBJn
+<rc;#<W#ho<W#nq<<6'!r)EPn!*&ogs.B:`rLs7cs.fOgs/#am!2o`u"Bei/=]t],"Bei/=]t`+
+rD*AgqG-ubr(cTSohGSBgYDeas5!b5ro!h8s5O";s5a4Ar9""Aroj7Drp'IJqX"1JrpK[PrUBgV
+r:9jYrq--]rq??cqtU0drVHBfr;?KknG\"=JcEaiJ,~>
+JcC<$JcC<$lMp>Pqu-Hjq"t$drV?9arV-?c#jUL.g=F]MVl'Bi!iY_^qXXUTrp]dQs6fmRr9XIL
+s6BRIs60LGroO:DjQ-=#!TN);huV`lrnS.@gY1B7g"=p.f%&:"e'a_TrgNbQ!1<\Nrg<DGrKdDK
+r0@nlVPU)bV5C,dVl$AjW2ZbsriH+$$EgS8Y-4k)WMlbnqiLi=!07#;!0$`3qi(B0r/1E1s,6r)
+rd"Ni%>9@eJV/W/K7ec.K7nmUJd$dXJqBhqrhf^l!N2mk>Q7t)>ln55=oMS+>[(D2>Q7k2>?Y35
+>$5&(=oVS5>$5$4=]np4=]ej2=]kH%pf[u,X/rA%X/fE-=o2=t=oVV$=8l7u<<Q?&<``B"<r.^A
+MuU-_ZiRSArNuX7rjVs=r4;p=qi^W9r/q2HPa.Q#op>`IqjRJQq3q8Os.')*!5ncPnAG4CrP\cV
+rl>&[rQ5)^r6#,bc2Puicd:&;ci0L5T)YG_T_tM`UAq"fU]@IpX8oC%Y5PO(YkbR(Z2r4or6#8d
+aiMNC`r3m@`;RRR_Yh7I^]W<Fgt_nb!oDhlro!h8s5O";s5a1@r9""Aroj7DrTaCJqX"4KrpKXO
+s7$$XqssdYrq-*\s7ZHdqtU0drqcHfrVZQknc"+>JcEaiJ,~>
+JcC<$JcC<$lMp>Pqu-Hjq"t$drV?9arV-?c"gY8/US+7YL&?T*L%Fp4o)8+XnG;VRmf)VOm/QDO
+lM]uIkl9iFjoXZ*jSn0?io0mp!T2c5h%8Arg=k65f[na+e^W*tdY!2OK)U?$JGXiqJG+KkIf4cr
+IL1FMI"R$&K7nl1re1K.Knb;8r.Y</L5(K_L^8j;WMuhpVgNmjHi&*jH$FT4GPcXaH2;acGPQL_
+H2ChNARo@^AS,QRAc?<AAcH9FARo=_A;#U6KE?d[LAFaH:]!ug:]+#k:JO\\r_Ebq:JO\]:/+L_
+:BaHf:JX_]q+go`##%`b:/4MWnP0!X!/LK.qb?fYr_*/_r_)rY!DQ8e9Diu/GPHF^G5umeMueos
+qMkN8s,Hl8qgS3fr-eZrJGt,oK)^DkK)^K%K`?c+PNnD1Q2d-OQ'@O4PlR-EQN3?KQi!0LSc#)Z
+TDtS^U&UkeU].%hNr"h7OSb.BP*;,prK[AHpQPW?r/p<.r/pl<"5;Mbh#?+2hV[5ii;_d9ir.p;
+jSn9=k5OQCkkjWClMg,Gm/HDOmeZDPnG_tTo)J=\o_\=]pAXg`q#:*gqYC$er;6H_rdk*#s2P(h~>
+JcC<$JcC<$lMp>Pqu-Hjq"t$drV?9arV-?c#[^k@>$5!-;H!Ei!`JX]qXXUTrp]dQs6fmRr9XIL
+s6BRIs60LGroO:DjQ-=#!TN);huV`lrnS(>gY1B7g"=p.f%&:"e'e.nr)<Pls&8nrr)3Spr`/hp
+s&B/#;c6Nm;?'T);c-Fi;G^4g;H$Ll;H*Nn"'&<#<;of#<2upsW2QWe;?0Yk;?Bcp;ta,e;>jDl
+;ZJKM/cdUXr%\7.rA4s>1c7*G1c.'J2)R3h;>a>l;u&NU3rV/<3<)#83<(oB3]K)X3'')\r\t*C
+2`NfV2`^jrs#0j8#WO_"1c70L2`L(]"]SK%<``E"2ZP`61]TE12?Giu3W1r42uP`72uZ\Y;,C(d
+;,[Blr_iYks&/emr)NYqr)N_s!*/tun5B0_!)i_nnl5Qdq,I;krD`esr`0/'<DugqrDiPls&T2$
+r`/kqr)NYqr)Ebs<W#hn<W8QeT)YG_T_tM`UAq"fU]=Qo=o__)=9)M&=p8&2=BSd/qbI/eqG-ub
+r(cTSohGVCgYCT`h#cHjhu;R6iW%p9j8\3>jo"9?kPj]Bl2BoHlh]uImJcPMn,MnVnb_nWoD\CZ
+p&Fabp\Xabq>U6dqu-HirUKl<s+13is*t~>
+JcC<$JcC<$li6DPr;HNjq>:-erV?9arqHBb$0:!te^;[cVl-EiVZ<[mo)A1XnGD\Rmf)VOm/QDO
+lM]uIkl9iFk5XNCjSn3>iW.s:i!SAuh;-lAgY1B7f`'J-f%&:"e'cX5rgNbQs-WbOrg<VMrKdJM
+rKdDKqj%SSVl$AgUnsrcV5F3h"f\H$X/rE%XoGO+YHG(-rhoUS!0@,>s,I&;qMY0.r/:E/$]A7n
+>$6)pH?t3sK)UH'K*$a[KDgB'K7\aSJd$d\KS<[-rhf^l!iDo&ra#P/s'#M-=o;G*>?kB9rEK8)
+s'#J+r`T;+rEB)$!a&T/qca,*>[%,0r*')%qH<c#!*fD*!*T<%"feW(W`iR&=Sc2#=92K(rE&u!
+r)El#<E3+%q,[Mss,-W1s,-Q/rj2X3!O]<6[/m_FrjW0C]",D`OcfO(rfdAFplk`@s-!MKQ'V<6
+qO%8MrL*_UrLEnWrL3VQ!1Nl'!5n]No#(FErP\cVrl>&[rQ5)^r6#,bc2Pukcd:%bci0F6SGo)X
+T)PA^T`(SaU'%0iWiQ-#!3Q7'rN?4*qQ^(+s31Pfr6#8daiMNC`r<s@`;[XS_Y_1H_#N*hgYDea
+s5*e5ro!h8s5O";roF+@qr[n@roj4Crp'LKqX"4KrpK[Ps7$$Xr:9jYrq--]rq?BdqtU0drqcHf
+rVZTlnG\"=JcEdjJ,~>
+JcC<$JcC<$li6DPr;HNjq>:-erV?9arqHBb#-Fi"TV%dGrIt3'!/:=@rpfsVqsXOPrpBXMs6K^M
+rTX@Gs6'CDs5a7Aro=%<!9*q8$K'^rh;$f?g=k64rmqD+e^W*tda<^HJcLB#JGXiqJGaoqIfFor
+If4crIK4fpHi\kOrIY*'q1Sj(L]3#6LPCP=LPUbCW;`^kHiSNkHN/9iGQ;sbGl2jbGlN!bGQUoD
+<)ij%!F977Ac?9EB4b^dAH$-JA7]:_ARo@_A7\\lqh+s(r(mPo:f'q`;"RQ`:B+)i:&.Na:]=,h
+:]4&g:]F2i:&duf:&dlg9hnI_9_M0^:/+I^:B-+JL]E5.:%q?[9DqQ`9E.]b9D_B`9hbIXs%N*0
+!-n<`!-nL%!KE'7NW5%=N<P?%NfJO9qgSNos*j`ms*juts+'rsrIXotoRd*qqh+s%rKHQ3r0@;J
+!gT"7rK[/Erg*GJrg<\Ss.'(ZrLX"\s.K=as.TLgrf6l:qiL`<"Hnt4Pa;95rfm2Arf[2Am#q7.
+qiLj3!ScE/h>c@3hu;R6iW%p9j8S->jnn3>kPj]Al2KuIlh]uImJcPNn,MnVnbhtWoD\C[p&=[b
+p\Xabq>U6dqu-HjrUBf;s+13js*t~>
+JcC<$JcC<$li6DPr;HNjq>:-erV?9arqHBb$!g_<=]nj/<)QWl;#jMko)A1XnGD\Rmf)VOm/QDO
+lM]uIkl9iFk5XNCjSn3>iW.s:i!SAuh;-lAgY1B7f`'J-f%&:"e'cWDr`&kqs&Akor`&_mq,IAo
+"&r2s;Z'B"<)Zao;,L4f;,L7jr_`_prDWl!<)lrt;ZTjrrhnUNqG@Vu6:!q(/hSe01,:Zb1^,Zl
+1c@0Hr\XX4!&jg6s"jj:2)RQprDNVnq`47-#Wat*3&`iY3]R'u!]N,!r\jj<3;YZ72ZGZ72ZG`9
+2Z#H)2?5]62ZH_W<EB*#q_nL4rA4L3q_eL73B@$tq_nR92`L[pq`"O7"&Mil;Z9Vp;Ys>j;Z0Jj
+<W#nq<W?)$<E*#u;ZBSq;Gg<j;ZBVj;Y!cZ;ufkk<<#no;ufkq<WuQ);c?XprDiSms&T8&<E8oq
+r)NYqrDiYmrDiids.'(ZrLX"\s.K=as.TLgr`T)$!*T;'!*T8(r)rnlr_NAcrD3>dlqd:Ls4RM.
+h#?.0hZ)L4i;_d9ir.p:jT"?=k5OQCkkaQClMg,Gm/HDOmecJQnG_tUo)A7[o_eC]pAamaq#:*g
+qYC$er;?N_rdk*#s2Y.i~>
+JcC<$JcC<$m/QPRqu-Hjq"t$drV?<brV-<brq-KLe^;[caN""Qs76-Yrp]dQrpKdQr9XILrp'IH
+s6'IGrT41CjQ-=#)rfi8i8EMMhVI#CgY:H9g"=p.f%/C$eC2jndJfU6RK&]VR@*r>s-WhQq3M&I
+rKdDKqNh/H';25#V50raVPU/fVPg>jWN*##XSo7*Y-5"2VP^3eOT(=@NW>(9N;eb0N;SV5M?-sd
+rEB/(s'5S0!+Gh6#(qS]JV&H(rIY9-K7dE7?2\".V>R1kV5O8sq-3f$s&o>*r)s5+>$G05r*')&
+s'#;(!ErV&<WZB+=o;J&=Sc2!>5_Y4>$7l+X/`5$W`iR&=Sl8#=9)G%<rZ8$<r5l"<`N.$=8>nr
+=8u:tMu/D/MuC!\[/RH<[^WcV\[oA_r/p]9p6,NAQMHmFR/NHNRfAlUSG8TRRK18(_>qLL_XtbD
+`;[^U`r=$YaSj6\b5BH_bl5lkcd:%bR[X/Drga"ZrLX%]s.K@brhp($WiN2%Xfei*YQ(j(YlM*.
+blGucb6?&1aN)<?rl+0@rkncQqSE'Es4[M-!8RS0s5*e5ro!h8s5Nt:roF+@qr[n@roj4Crp'IJ
+qs==Ls6fdQrp]sXr:9jYs7H6^rq??cr:p6drqcKgrVZQknc"+>JcEgkJ,~>
+JcC<$JcC<$m/QPRqu-Hjq"t$drV?<brV-<brq->gTV)4S!1a"Ar.P+@rUKmVqX=FOrpBXMs6K[L
+rTX@G!9a=C!p/M(ro4sWiSi_Qhr!;Hh;$c>g=k64f@SU)e^W*tda?JAJcLB#JGXirJH(,pIfFor
+If4cqIK4foHi\_Krdt6)KDgK(K`6]'LB!#1L51Q`M#X=PV>GW?Hi/3eH2`$gH2`'cH2MpeG5umc
+<<#ns;?9]or_rhr!`N&trac(>rac">"(YtRAH#L*;#l7HKE6^Zqb[#_s%`PhqG.&d!_uNerD!>g
+r_EJh!DZGf:AITd9MJ8Wr_3#[qb@0HL]*#/L]'s@9`%K_9`@]b9`@Zc9M>=X!DQ8c9E%Wb9DE`1
+G5QOaGl!BrNVne:NVn4uIeA3iJGXoqK)L8mK)UE$K`?Z)Pl6g3Pl-gHQ2m3LPl?sIQM[$IQMQsJ
+Rf&ZSSH#/YT)YG_T`1Y_Nr4t8OSb.@P*>m2rK[AHplk]?r/pB0qN:Z:s4[M-!8RS0s5*e5ro!h8
+s5Nt:roF+@qr[n@roj4Crp'IJqs==Ls6fdQrp]sXr:9jYs7H6^rq??cr:p6drqcKgrVZQknc"+>
+JcEgkJ,~>
+JcC<$JcC<$m/QPRqu-Hjq"t$drV?<brV-<brq-=s=]t]*"&r2s;Z'Dlo)8+XnG;VQmf)VOm/QDN
+lM]uIkQ'fEjoXZ*jSn0Yio/kSi8<GKh;-l@gY1B7f[na+f%&:"e'cXkqc*Sq!*&kps&B"sqbmDl
+r)E\r"B8;t;cEZns%s/%9N+nh;,U7h;,L9j;ZB\p<;fhq;u`]pV;5&K;#s!NrBUTS5sR_#5Q3nO
+5<V1o1c5%ds"jd82)Y@trB:3Yr)3PnqD\O:3][!qr]9s;!]N,#rAXa9rAP'C2`<QO2E!KP2E1Ro
+!]N"qq`"+)rAXa7##eK$<`W:'q_nL4rA4L3q_eF5q`+I3!]W+trAa[5s#:'?3&pn9!)iVirDNYm
+qGmJpr)Nbt!*0"roMPNaq,78mqbuNSs&/o!r)Nesr_rhrr`/\ns&]2"qc*Jnr)WbrqGdDns-ikT
+rga"ZrLX%]s.K@b!a&T.r`];*r`TG-=BJ^/rEB2'q+gob!_uNerD*;er(cWToM5G?s4[P/rn[V2
+s53h6s5F";r8[e;s5j.?roa:EqW\"ErTj@IrpBaRqsXORs7-$Xrq$0^r:U'_rqH?crV?HhqYU6h
+qu-'aJcC<$aT$b~>
+JcC<$JcC<$mJlYSqu-Hjq"t$drqZEcrV-<br:L<FdE]qWa2GmpVZ<UlVZEadrUB^QrpKdQqs=@K
+rp'IHs60LGroX7B!9F.>s5F%;rnmh7hYu=3gtVh^%GBCcf@JL%eC2mpdF$>;RKAnER/30EQN*<N
+QMd*HQMm'VT;SQ_UnsobV5:)erhodq!3?+#riH=+YHF^tqiLf<s,R&;r/CZ6pl,00!KE!8=TDY'
+>Q7t.?2n==?t!JO?!U]??2In+?2\%.?2n72>6(MtV?*Nkq-3Ss!*T8(!a/]1r`]D,=o;J'>6A,6
+=]t`*"B\`-=',<#!a&T.r*')%qH<c#r*'J2WiN5$X/i7(=o2=u=oMP'=8u;$=8l7t<<Q?&<EE9$
+<WH5!<rZ8$<W6&!Mtr8/Mu9p[[/RH5[f3c:\bM<]P5(4CPa.Q#q3V)JqjI;Ls-rtWr1!\S!Q)bQ
+_>qLJ_Y:tF`;[aSa8a6[aoBN\bQ#fcc3VbCd$U2gR@9TBS,]#YSc,/[TDPPkWN*#"XKAZ(YQ(j(
+Z2`,JblGudbQ#]eaiMNBrPe*@rPSZPqSE'Ern7G.gt_nbs5*e5rS[_7s5Nt:roF+@qr[k?roj7D
+rp'LKqs==LrpK^Qs7$$Xr:9mZrq--]s7ZHdr:p9erVHBfrVZTlnG\"=JcEjlJ,~>
+JcC<$JcC<$mJlYSqu-Hjq"t$drqZEcrV-<br:L;fT:MRES=>uFL&HZ*L%5-2qsXOPrpBULs6K[L
+rTX@Gs6'CDs5a7Aro=%<!9*q8!T2c5h#Z<crn7q:f[na+e^W*te'cXkd"6k#rI=ltr.+`qpjW6m
+rdOcps*arrqgAEl"bVDYK7nmUK`Hf)L&?Z+LPGe`"GinMI!km>pj2j`s*4Ed!dK!9rHJBXB2AM'
+s&B"s!`Drpr_rhr"]JB";cH`k;uT\n;#jMl;>Z"IK8&ejq+grcrD!Vo:/+JY:f'n_pJ1EVs%`Pe
+p.bH[!_nE)rJ1H/rD!#[rC[5d91qtW9E.]b9*%^ZrCd8e9MG@Ws%NGcr_366r-&'`!-n<ur/LZ8
+pjMmcoR?jkqLSWts+BfmrIY*'re(68rK@8HPO=\4Q2d-MQ2[$IQ2HsHQi36IQiEHQRK&`RS,]#Y
+Sc,/[TDjiJNr>%9OSb.CP*_N$QMd$JPkUC@P5UO0P5:=<OT*r8gYCT`h>c@3hu2L5iW%p8j8S->
+jnn3=kPj]Bl2KuIlhg&JmJcPOn,MnVnbhtXoD\C[p&Fabp\agcq>L0dqu-HjrUBf;s+13ls*t~>
+JcC<$JcC<$mJlYSqu-Hjq"t$drqZEcrV-<br:U(m!E`M(=9Mc+<)QWl;#sSbrUB^QrpKdQqs=@K
+rp'IHs60LGroX7B!9F.>s5F%;rnmh7hYu=3gtVh^%GBCcf@JL%eC2mpdF$>;<Vobo;ts5j;uK\p
+<W?%q;uTZ(;bL(h;c-Fi;G^4h;H*Qm!)rhqr`')#;cBNghGOA42>oWI5sdq)5X@Y"5X7P!5!D4&
+4odhF55m\G4?E@;s&/nWrAjj<pGr75s#L*=pbr=82`EWQr\a^7rAad:rAXj;2E(Fko/?M*#<#L[
+<E<.%=8OoV2Z5H42>]962`NcWr]'d6!]W+tq`+L4"#r;#3;tr6;?'Mr;c6Iiq,RDpqc3Smnko?`
+qG[;kr);`Wr_rhur)No!;H$Nn<;onm<WQ9&r`/kqqc3Sqr)NSmr`/ucs-`nUr1!_Vs.0+[s.B6l
+s&oA*rEK5(r`T/&!*T%kqbR/crD3Aelqd7Krn7G.gt_nbs5*e5rS[_7s5Nt:roF+@qr[k?roj7D
+rp'LKqs==LrpK^Qs7$$Xr:9mZrq--]s7ZHdr:p9erVHBfrVZTlnG\"=JcEjlJ,~>
+JcC<$JcC<$mJlYSr;HQkq"t$drqZEcrV-<bqt13AcHF>M`5BIdVZEacqX=FOrpBULs6K[LrTX@G
+s6'CDs5j:Aro47CiSi_Qhr!;ih%SSug=k64f[na+e^W*tda?Ihd*MZZs-`kRs-N>Cs-E_OqNq&E
+r07V]Vl$AgUnsrcV5F3h!i`,uriH(#!jAc%r/go=!06r9pl,62r/;#EN/*.AJ:N&pG]n<0<s;W+
+=-]&:rg*hWIsulu?=3\;s',_5>[:WA?2e(5?!^iC>c":rVZ3IpVl3g(p0%H!r`];*r`T>*>Q.h*
+>6nM=>$4s.<``B#=Su8!<rZ8%=o;J&=Sc2!>5VS2>,nX)WiN2#>$:`)r)ru#s&]5$!*B/#qc*c"
+<E3+%r`0##r)Wi!s&Jqsqhk?1qQp1.rj;g:\@DO#rfI#>qNCT:!L/lJQN*9QR$X0=R.m$HRfAlU
+SG\iZR[h73_u7FP_tCn@_u7OR`;mpVa8a6[aoBN\bQ#cec-H=7!13VNs-`nUr1!_Vs.'.]q5=Ls
+WiN2%XfhZ,ril=*rm(Mfs31Gb"j4s/aN)=!`W*mS_t(bE_uIUM_>M+Kg&B\,gYCT`h>c@3hu2L5
+iVqj7j8S->jne-=kPj]Bl2KuIlhp,KmJlVPn,DhVnbhtXoD\C[p&Fabp\agcq>U6equ$BirUKl<
+s+13ls*t~>
+JcC<$JcC<$mJlYSr;HQkq"t$drqZEcrV-<bqt12dSXuCBS!ocCK`Qp^re(<+nG;VQmf)VNm/QDN
+lM]uIkl9iFk5XQCjSn0Eio/kSi8<GKrnS=EgY1B7f\"g-f%&:"e'cXkd*U*jJbFWnJ,"KmIfOro
+J,artIJ\EkI0+kMK)L<%K_^<&L55b_reCW2LPV^QrHn9bpj)ma!."Nf$YsHhAn>I]?X6o@>l%4q
+Fo?IeG[k/l@oW;&r)!Po;,L9j;?;H'rIb<+Kn`B!r_E)]qG.#a##7rh:JOVYr_<GfrCd2cqbHl[
+s%`Pep.bH[!_nE)rJ1H/r_<)[qF^f^rCd/ar_!;d92#7X!_l?^r(I&`s%E5_!-e?arc\?epl,-1
+s,R),rd=TkqL80gs*jor!.b$!rdt$"oRd$ore1<("-\t6P5^XHP`q="PkgUBPlI$EQ2m9MQM[$H
+R/`TSRf&ZTSH#,[T)=THNr>%9OSb.?P5^gJQMd$JPkUCAP5LI/P5:==OT4#5g&g$ah#?.0hZ)L3
+i;_d8ir%j9jT"?<k5OQCkkjWDlMg,Im/HDPmelPQnGi%Vo)J=\o_eC^pAXgaq#:*gqYL*er;?N`
+rdk*#s2k:k~>
+JcC<$JcC<$mJlYSr;HQkq"t$drqZEcrV-<bqt9tk!a/W-r`T5"r_i\l!E/F`n,DbSmJH8Mli-2J
+l2TuIkPjWDjo=E@is4T&iS`YOhqn@g'\qHsg=b-2f@SU(eC;sqdF$=fcW:$Fpf.5kpeh/l<)icq
+rD`Mi$qaMu<)QRj;Gg=i;cEZn!)rhqr`',$;cBGg;<1Ua3&NQM1GLU;0.eb.3]d4$!'9sFr\OX5
+55d_F56!eG4q'S:4$,Sf4[(r*;,U?l;ZB\q3W1r:3Vk]82u>T62ubf92$Gls2`<QQr]'j8r]'j:
+r\ss<2E(Fko/?M*#<#L[<E<.%=8OoV2Z5H42>T622uku<3;YW93&`en3;b];3&rrXr&Fa:rDESm
+s&8qqpf7;orDihpq,%,gqGI2hq,@;mqGZHSs&/u"=',<#!`W&rrD`brp/_/mrD`VnrDrhrqc*Pp
+!13VNs-`nUr1!_Vs.'.]qcNl$s'#A*rEB2'r*&ehqbR/cr_NGelqd:Ls4RD*!o)Mcrn[V2s53e5
+s5Et:r8[e;s5j+>roa:Eqs"+Frp0LKrpBaRr9sXSs7-$Xs7?6^r:U*`rqH?crqZQiqYU3gr;H0b
+JcC<$ao?k~>
+JcC<$JcC<$mf2bTqu-Hjq>:-erqZEcrqHEcqXsm\!mJd,rkecR_#1)1VZ!FmW;c8amf)VOm/H>N
+lMToHkl9iEjoXZ*jSn3>iW.s:i!\H!hVI#CgY:H9g"?;U$eEkXeC2jndEp4bRf8`PQiNKOQ1pU?
+QhZmEPmin@SYi9^V50rbVPU-fVuN[rWN6$"riH4(O8Y1>NrY4;NVJJ1M[5E)MM6b7IX?D?G6W;E
+JU`3$JGaosJ-^USJR2Ve?<pe7>R+P>?!UcA?!dM8#?tA:?!1:+V>[7mV5L6e>PVJ&>67u4>Q.n-
+>Q7k,=oDD%<r>qt=8c7u=8c2!=SuA%=Sc2!>5VS2>$7o-WiE,">$:`)r)ru#s&]5$!*B/#qc*c"
+<E3+%r`9&#rDrr"s&JkqregZ4"L>A>Za0S:rj;[4!0?o:qiUf>plk`Bs-<VMs-NSLqO.>MrgE\Q
+qO7MSS,L2(_u7FP_t1b>_Z7XS`;mpV`rO3ZaoBN\b6Q89c-FY]QBqN:rL!SPs-inUp8A7rWiN2%
+Xfek2rNQ:+r6G;d!6kAa"j4s/aN)=!`W*mS_t(bE_uIUM_>M(Lf\-8Xs4dS/rn[V2s53b4s5F";
+qr@\:roO%>roa:Eqs".Grp0LKrpBaRr9sXSs7-'Yrq$0^r:U*`rqH?crqZQiqYU3gr;H0bJcC<$
+b5Zt~>
+JcC<$JcC<$mf2bTqu-Hjq>:-erqZEcrqHEcqXsm\!hPpPrgEnUQ\>9j!/CK+s+UI@rU0[Pr9XFK
+s6BOHs60LGrT41CjQ-=#s5F%;rnn1AhVR)EgtUT;g=b-Xf*p6\eC;sqdF$=ec@UW@JGt&nIeeKk
+IK4fnI/eWpHiebKK)UE&K_^?!LAco*HhVj]H2VspGA_/.AS#=Y?<g_6>lS7C@:E_U@:NbV@UinW
+@q8O6;?9]or_X,&;,U7h;Gg:h;G^/BKDgH)K8#$Y;"[WZ:'49e9hkU^r_</]s%WDdpJ(Z_r_3#[
+r(d8d!/LN/!/LPJpItBU!)3>as%NDb!_c6[r_*;dr_38`s%NGcq+Ud2rc\?epPf*2!K;F*IJ\Eh
+IJeQhJ,OipJ,b$!Jc12sKD'oqKDpQ(KDq)7PlHpHP5pjHPOOh4Q2HjHQ1UC?QiEBNQi3<NRK&`S
+S,&'CNr>%9OSb1<QiEBLQ2HmHPPUI?OmJ8-Oo1:Af\-8Xs4dS/rn[V2s53b4s5F";qr@\:roO%>
+roa:Eqs".Grp0LKrpBaRr9sXSs7-'Yrq$0^r:U*`rqH?crqZQiqYU3gr;H0bJcC<$b5Zt~>
+JcC<$JcC<$mf2bTqu-Hjq>:-erqZEcrqHEcqXsm\!EiP(=TVc0=T28";uT\o;#sQnrpTgRrpBXM
+rp0ULr9=7Fs6'@C!p/M(ro=%<!9*q8$fBgth;-l@gY1B7f`'J3f%&:"e'cXkd*L!<<E8ior)<Ag
+!E2tp<W#hk;u]`!8Q/Pe;c3Nls&&epr_ibprD`br!)rkok>E?\2)R3G1,1C6/M/S-1c$mA1GgmF
+1G^jF2)I0I5!T$1rB1TR4$,Jd4Zbbi4Zbei48q5@;Gm?i"B8;Z2`LFis#9s;!]Dtrr\aU3"#r5!
+3;5B23;kl:2uko:2Z,N*2Z,N62?d&[<`W:'q_nL5rA4L3qDS@5!'1$<q_nR92`LRmrAOg<3B0"t
+3<;0$r\t*Z;GpFl;H!6hr`0#!oMPTar)*Aiq,78mqGZKTs&8nts&T5%<W6##<)QZm<;onl<rQ+t
+;up!"rDibrr)NVns&K)brg3SNrgEeTrL<Ras&oA*rEK5(r`T5(oM59ZrD*>fr(cTSohGP?g&B_*
+g]-(.h>c@3hu)F4iW%p7j8S-=jnn3>kPj]Bl2U&Jlhp,KmJlVPn,DhVnbr%XoDeI\p&Fabp\agc
+q>U6equ$BirUKl<s+13ms*t~>
+JcC<$JcC<$mf2eUqu-Hjq>:-erqZEcrqHEcqt9s\$M2E\`5BL0^q[X]rMKXmr20OnrpKdQqs==J
+s6BOHs60LGrT=.A!9F+=!oi1trnmh7hYu=3gtVh^"khP[f@JLOe-jaRdF$=ecH_iGR$df<r0@)D
+p6Y`Ds-<SLs-<SJ%[3'=SYi<^V50raVPU,drMK^rW2fiuriQ-\!frA%qMk6.'T83<O,SjJJ:Dol
+G^"CXK7ST(JV!fM$A!\WJ:<$"JmDYgrEL.E>[:ZB?!LT=>?bB>>Zt<:>[r,CV66ZmVZ3Rm>Q.e-
+>?kD2>m">8=^1l/$X$S8>$4s/<`W4#<r5ks<rH.t=8c/)='/R->$>-6r`K#"rEB,'$!LK4XK&;$
+W`iR&=Su>#=T;J&<WH5#<r5l!<`N.$r)Nf!rDrr"s&Jbnrepf^"1,;>ZMq30[/Z0cNrkE(O8G%9
+Oo:I>PQ-mHQ2d-MQhQmGRJN<NRK&`PS,\oWS,C,'_u7FP_stV>_Z7XS`;mpWa8a6ZaoBN\b6,u5
+c-H6Ps-EYNrL!VQs-iSY#cXi)XK8P,YHRo/s0;IHs3:Sfr6#8daiMQD`r3mV`;IOD`;daR_YV+H
+_#N$eg&B_*g]-(-h>c@3hu2L4iW%p7j8S-=jnn3>kPj]Cl2KuJlhp,KmJlVPn,MnWnbhtXoDeI\
+p&Fabp\agcq>U6equ-HjrUKl<s+13ms*t~>
+JcC<$JcC<$mf2eUqu-Hjq>:-erqZEcrqHEcqt9s\$M0gYS!oe5Q^*hhr.P-*rIb0)rpKdQqs==J
+s6BOHs60LGrT=.A!9F+=!oi1trnmh7hYu=3gtVh^"khP[f@JLOe-OOOdF$=ecH_"?JGaorJGt&p
+IeJ9iIeS6hHO,%OK7\]-KS,$UL&Zl-L]3&-L])Q"HMi'eHM;[mG]7S;BkV'f@UEDFr`fG6raPn;%
+:NaVA7B"X@:NeX;c6Qg;ZBT);Gg:h;Gg7f:Jb)%EIEIlr.P*(rD3>dr(m>f!)<>c!DcJg:%V-Y:
+&Ri]:&duf9_M3Y:B+#gL]*#/L]1$B9_h<]9`.N`9`@Zd9M8%X9E7fd9`7Wa9`I`d9M>:WrCd07!
+I0OsMunucHi8BgI/A?jIeeKlIf=ipJ,k0!K)L>qK):0#K`6W&PQ-mIP5g^GPl6g9PkgUCPlI$?Q
+N*<LQ2d0LQi3<ORK&`MNW5%:O8G%:Oo(LFQMd$HPl?mCP5LI/P5:==OT3r5g&B_*g]-(-h>c@3h
+u2L4iW%p7j8S-=jnn3>kPj]Cl2KuJlhp,KmJlVPn,MnWnbhtXoDeI\p&Fabp\agcq>U6equ-Hjr
+UKl<s+13ms*t~>
+JcC<$JcC<$mf2eUqu-Hjq>:-erqZEcrqHEcqt9s\!;$.l"^5&2=]n]&<;oeo;#jMnmf)VNm/H>N
+lMToHkl9iEk5XNCjSe*?io/kqhuV`lrnRV1g]#n1g"=p.f%'cL#Lh,KdEp4bcM^`9;u0Dk;ZKen
+<W,nn;u9H$92\_g;c-Fi;c-Fj;uT\p;uK\p<W>qq;ZBV_;@5HE3&NQK1GCF6/cI@01c$mA1,LgF
+1c$re2$,Tm2?#f=4WcaJ4?GVf4Zkeh4?PYc3BB5`3BKDm7S-HT;H$Ik<)``Tr&4U6r&+L2rAFd;
+3&`cUrAXa7p,Dt1rAjj:!&sj7rAX=+r&=X6!E<(u<WH4u2ZPc71]TE02ZG`:3W;#:2ubi=3B&nn
+3;kcA3&rrX3]T5^3Vtf8;YF)k<`8Qeqb[5grDN/am8X*cr)EYorDrr"s&K&!!`W&rr)E\rp/_2n
+r)<\s<rH%r<r>tq;ufqrQ2d0LQi3<ORK&`L=T;P(>5VV(>5h\)>4YMd:]=,f:]*uS:\@K_fDsV(
+gAfq-h#6(/hZ)L3i;V^8iqqd8jSn9<k5OQCkks]ElMp2Jm/HDPmelPRnGi%Vo)J=]o_eC^pAXga
+q#:*gqYL*fr;?N`rdk*#s2t@l~>
+JcC<$JcC<$n,MkUr;HQkq>:-erqZEcrqHEcqt9s\s76E7`5BL0_#;"JV>R4kVZ!CmW;c2]m/QDN
+lMToHkl9iEk5XQCjSn3>iW.s:i"Y)*hVI#CgtUQ:g"=s/f@JL%eC2kFd0n=IcHa\&R$a5,QBqE5
+s-E/@s-ESJs-E\MrfdGIP5^RLS=c^VVkg,cVZ*FjVuN[qWVrprO8k79NV\V6QP#CBNerICJ:2ci
+H$X[eJUi6$rdPK1IsulsIXZm!?<plB?!U]?r*9A/?=*V8s'6(;>?kHHIZp\5Y-+k,V>I+iVu9d!
+>Pq\)=T_c/>$Co."B\`+<`T&ur`&r!qc*Yt=8l>!=8c/)='/R->$>-7r`K#"rEB,'$!LK4XK&;$
+X'/['=Su>#=T;J"<r5ku<`N/s<WH5"<WQ9&r`/Vlr3?@0ZMh--Nr"h7OSk7?P5:CBPl?sIQM?jD
+RJiNORJNEORK18'_>qLP_>qLB_Y_4N`;[^U`r=$YaSj6\b59?dbg"CrPE_=0Q2d0MQi<BBW!oZ*
+X/rG*Y-5%5Yd(J/cMu/hbl#Wfb/q`Ga2\(ss2=iQpVd*NrknfSr5/<Hr4iEdf\"mVgAfq-h#6(/
+hZ)L2i;V^7ir%j9jSn9<k5OQDkkjWElMg,Jm/HDPmeuVSnG_tVo)J=]o_eC^pAXgaq#:*gqYL*f
+r;?N`rdk*#s3(Fm~>
+JcC<$JcC<$n,MkUr;HQkq>:-erqZEcrqHEcqt9s\s76DaS!oe5QMm'LK7s2W!JZ=-KE-`*mJH8M
+li-2Il2TuIkPaQCjo=E@j8\*=iVqaLhqm5Gh;$f?g=k64f[na+e^W*tdf.W!d*L"_c%1Cqr."]r
+m!o%ardFQhr-JKmIY7WO!J?(#K`Qp`rJ(5rqg&-dqKWTmEGo`0B4YXa?s[,D?<^q=@L$CP@UiqY
+@:T:G!b>e>r_i_opJV#g%T$#!;,C+jATN?SKS+l-qLej&r_3Dg:]=,h:&Rie:]F2g:&duc:%V-Y
+:&Ri_9`n-b:/:d^p.bK\r_3BJr.tAIp.Y9T!)3;`!)3Ab"&)?\9`7]c9`7Ta9`.Q]9`%K^Mtr>2
+HiJHnIJnQnHi/9hIK"]lJ,FcpJ,4]qJbk#pK(afsPl?mGPlHpHP5pjEPOk%7Q2QsIQ1C7@PQ-mF
+Q2d0MQi<?PN:i/1Nr4t8OSt=?QN3EPQiEBMQ2HmEPPgUAOmeJ-Oo1:Cf@\a/rn@D,s4mS/s5*e5
+r8@S5ro3k9roF(?qr[n@s60@Es6BULrTsONs6fjSs7$$XrUU![s7H6^s7ZHdr:p9erqcKgrVZTl
+nc"+>JcEpnJ,~>
+JcC<$JcC<$n,MkUr;HQkq>:-erqZEcrqHEcqt9s\s7?4m!*]>(s&oM'<)Zcp;Z9Mn;Z?(\m/QDN
+lMToHkl9iEk5XQCjSn3>iW.s:i"Y)*hVI#CgtUQ:g"=s/f@JL%eC2kFd0.hBcHa]6<:*W`<;T\q
+<;9Df;?f`e<`;sp;>a>l;uTYp;uBVo;?'Pm;?'Pm;u0Dl3r_2>2$5Zk1,8b\#qmnf1,:R>1c.)h
+1BfWm2Dd<Lr]^?F#<k434?Ybh48q8@48q>O3]T5]4?Pkr7nH9C8Oi\W"B88s;cEZQ!B)h52?5]6
+2uko:3;5B32YK*/3;kl:2uko92Z5T+2Z,N62??cWr`0##q_nL5rA4L3qDS@5!'1$<rAXa9!'0g6
+rAXU6s#L-?q)ACT<qoYp;Y*c_;#O8i;Xm]R<;fhq<;ohp<rQ2#<W?)%<E)jpr)E\rp/_2nr)<\s
+<rH%r<rH%q<<&0^Pl-gHQN*<NR/^=^=T;P(>5qe.>[(G0>4GAb:]=,f:]*u^:]F8d:\@Hbf@\a/
+rn@D,s4mS/s5*e5r8@S5ro3k9roF(?qr[n@s60@Es6BULrTsONs6fjSs7$$XrUU![s7H6^s7ZHd
+r:p9erqcKgrVZTlnc"+>JcEpnJ,~>
+JcC<$JcC<$n,MnVr;HQkq>:-erqZHdrqHEcqt9s\rpp<a`5BL0_#(kIV5F3h!2f^ms/>n_rp0RK
+r9=7Fs6'@Cs5j:Aro=%<s5Et8!T2c5h$2ZhgY1B7f`'J9f%&:"e'cXkd*L"_c-=J#R$X/*qN_)H
+n!F'?rK[DKrg!MJs-*ADs.01e#cFMpV5C,dV5F6is/6.$X/rC`NfX1"s,I&;rJg`6s-FRcOH>EW
+LOsu#H[0m]K7\])It<'!J:;uurdXs"ra#S0r*9S7>[:Z@?<pc>qcs;3G);^fX9#?%rN$%"V>R1k
+V5O8q!*T;'!*APgr`&r!qc*Yt=8l>!=8c/,='/R-=^#$6=]ef&=oDP%>7"J9X/rA%X/fE,qcNc!
+rE0)$qc<So!`i<$rDiu"<`f6#"BSW(?![)'rNZO3ZEoPdNrP.?Nr>%:OT(CAP5CFCPl6mHQN!6H
+QiNQRR/NEQR/WNQRf&ZRRKAtq_u7IP_u@OQ_sYD>_Z7XS`VmjWaSa0Vb5oi3rf[8Es-3JIrg*#O
+"0&<$XT#=(Y-5(6ps/l`s31Da"j4s.a2c4!`W!gR_th7L`W*mV_u.CJ_>M+KfDjJ'g&9Y)g]-(-
+h>c@3hu)F3iVqj7j8S-=jnn3?kPj]Cl2U&Jli$2MmJlVPn,MnWnbr%YoD\C\p&=[bp\agcq>U6e
+qu-HjrUKl<s+13os*t~>
+JcC<$JcC<$n,MnVr;HQkq>:-erqZHdrqHEcqt9s\rpp<aS!oe4QMm*KQ2uVkr.P</KnP,5L&LB;
+li-2Il2TuIkPaQCjo=E@j8\-=iVqa9hqn@g#2Itfg=k64rmq_4e^W*tda?Ihcd'h\c-1`hrdOrt
+J,OoaJ,autIIMUcIY37OKE$T*L4oGX#DS"hL5'u!HMVpcHMi$rF)c/:Ch[QpA78eMr`fG4raQ%>
+@prpG@g$7N@q8O;;ZBYr;H*?gqG@>n?u'ucK):*!JGb'%KnG*X:&n#e9`Iie:'+-b:&[i\:%M'X
+:&drh9htFWs%WVi9MG.Sr_EDd!/LK.s%W2\q+C]]r(@#`r_!Gh91qrP9hkU\rC[;f91r/\9DhK[
+9E0qJN;S&&I/eQnI/J?hI/\QnIeeKmIf=ilJH(3$KDpK$K*-^XK7`cK!ecc%rfd>Gs,mGIPa)!-
+o9B-;rKR;HoToK>rfdAHrK[AJs,?T0!07#=qiLf>s-NYNs-N_NrK[8ErKI/Br/pN4oo]06s4@;'
+!87>)s4dS/rS@M1s53b4ro*k9r8[e;roO%>s6'CFr9=7Hrp0OLs6]jSr9s[Ts7-'Ys7?6^rUp0`
+s7cHdrqZQiqYU6hr;H0bJcC<$bl<1~>
+JcC<$JcC<$n,MnVr;HQkq>:-erqZHdrqHEcqt9s\rpp6_=]nr,=U826=]eR#<)cfp;ZBSp;H*P\
+rp0RKr9=7Fs6'@Cs5j:Aro=%<s5Et8!T2c5h$2ZhgY1B7f`'J6f%&:"e'cXkd*L"_c-=I3<;ohr
+;YX2i<<#qu<;0Dm<;9Di;Z0Po9*\Ep<)ZXl;H*Qm!)rkp!)rhqq,./irDWVls#LiS3&`WN1G^^:
+/hS_.1GgmA1,LgGr\G9H1c@3L2EsAh4Ztti4ZY_f4?>Vg48q;@4:+)13BBAk77Tm=qaLQUr_`r"
+;GpFm2`L^qq`"F4s#0p9oeuk/p,Dq0r]0s;!&sg6r\sX2!&a[4r&=X6"]SK%<`W<!2ZPc71]TE0
+2ZG`:3W1r:2ubi;3Vtf92ZPi92uYi;56Eo,3]Zsp!`i<%rDikqo25B]r)*>ho2G-XqGmMos&/qt
+<W,r*=&rC&<E<.#;c6Qk;ufqm<rQ+s<<$"t<W,qu<;fhp<;r'[PQ-mGQ2[*L=T;Os=T;P(>5VV'
+=o_@g:B"#h;#X8i:Amud:AI]a;#!iZ:B/rGfDsV'gAfq-h#6(/hZ)L2i;V^7ir%j9jSn9<k5XWD
+kks]FlMg,Jm/QJQmelPRnGi%Wo)J=\o_nI^pAambq#:*gqYL*fr;?N`rdk*#s31Ln~>
+JcC<$JcC<$nGi"Wqu-HjqYU6frqZHdrqHEcqt9s\s7?3[!lMmjqnN0Hs/#Xk!2f^m!N>Aali68J
+l2KoHkPaQCjo=E?ir\6!iVqaHhqm5Gh;$f?g=k65f[na+ec+&.e'cXkd*L"_c-4ASR$X-6PlR-=
+QiEBOPm3J<Q'R`$Q2[!JPPgUDOUR_NVPg>gUnsrcV5:'fVuN[rWfR%;!0-r9s,I&;-^g?gP*(ib
+Lk^V7IXHHfH$G!nJpr3!J:N3$IXcluJV%67?X-lC?2e.3>[:\8>RXnE?!CTA?=S,5R&I(`X9,H&
+X8]+%WMlViV>[7oVcHl$=6N]a<<-(s<<-)!=8uA*=&r@'=8c/"=8l;+=^#$6=]ef%=oMV&>6nD8
+WiW8$WiK:s=T;P&=T;J#<r,er<rQ+u<WZ9%=8c/#='kl3!FB.,<rK<(Nr=t2Nr>%<OT(CAP5CFF
+Pa.Q"rKdDKopGQCrgNhUrL*kY_84"+rPAQPrPJTPm_]"A#/nEs`5T^8rQ"rZr5nfY!mHdhr0%&C
+s-*MKm&15iWiN5'Xfeh1YkQHBc2Z#cb6?&1aN)<?rl+lTr58EMqo/TRs24fPqSE*F!7q/$s4@>)
+rS%;+s4mS/rnd\4r8@S5ro3k9roF(?r9""As60CFs6BXMr9XINs6fjSs7$'YrUTsZs7H9_s7ZHd
+r:p9erqcNhr;?Nlnc"+>JcEsoJ,~>
+JcC<$JcC<$nGi"Wqu-HjqYU6frqZHdrqHEcqt9s\s7?3[!h,LBrK[DK"IGL.K7s)Ts+CE,m/H>N
+lMToGkl9iEk5XQCjSe*?io/kqi"4f&hVI#CgtUQ:g"G$0f@JLOe-sgSdF$=ecHa\YbKGD6IK4lr
+JF%dcIfFidI/\HuIY*3)JqJ]/LAHW(L&d#%H2i3jGn>+=EGo`1BkV'f@piYK>[:S4A,fsJA7K1[
+@UiqX@q8M9;c6OnpJM)j;Gg9i;$9m,CNb7)JcC9#J,Xm&K7nl1KS>)5:&RcM:%M'X:&drh9htIX
+r_<Mh9MG.Sr_EDd!/CE-oM#'R!)3;`!)3Ab!)3Ab!_c<_r_38`!DHGj;?0Yo9_qE^MuSb'HiAEl
+IK"]jIfOrsJ,"QoJbt&hKDpQ'P5pjHPQ-jNPEM)mPa(p+o9B6>r072Gop5W?r0%&Cs-*MKrJ^B.
+s,R)>qiLf>q3_2Krg*MJqiq&Cr0$u?ooem.r/^p0rn%2&!87>)s4dS/rS@J0s53b4ro*k9r8[e;
+roO(?roa=Fr9=7Hs6KULs6]jSrU9dUs7-'Yrq$0^rUp3arqH?crqZQiqtp<hrVc9cJcC<$bl<1~>
+JcC<$JcC<$nGi"Wqu-HjqYU6frqZHdrqHEcqt9s\s7?3["'Si1=T2J%=9MN#<)Zco;ZBSp;XFDK
+s6BOHrojCFrT=.As5a.=!oi1trnn@FhVR)Egt^Z<g=b03f@SU(rmVA*da?Ihcd'h\bfe1.r)3Ai
+s&AMgs&B"sr_i\nqbmDls&/kh#?"N#;c-Fj;uTYp;uT\p;ZKem;>jDm;u]bq3sn#/3Ar]O1c$j>
+0`<U31c$mA1,CaC1c7*Jr\X[6r]gEG(-XfB4$>Yg3]fJd3]fA_3]f;^5=._+qF:KTr^QoV"&Vrn
+;uTYt<&cfq2Z>Q62uGT52uPZ.2ZPc02uGZ83W:u<2uGT52u,B22?#N32ubc:;cWft!EV2W2ZPc7
+1]TE02ZG`:3W1r:2ubi;3Vtf92ZPi92ZPl956=)23VYQ9<`N1#r)3Gis&/YirD<Mk!E)ej;Y3oV
+<;T\n<!$*#<W,r!='#<#s&K5%;c6Qk;ufqm<rQ+t<!H?'<`N+!<W6#"<E/osrD`fZr0%&Cs-*MK
+r)iu%o2u#qr`]>+r`T>!:[q3[:]F8k:]4&e:]*ub:]!u`:]*rf:]*rff)F;$fDsV'gAfq-h#6(.
+hZ)L2i;V^7ir%j9jSn9=k5OQDkks]FlMp2Jm/QJQmeuVSnGi%Wo)A7\o_nI_pAXgaq#:*gqYU0f
+r;HTardk*#s31Ln~>
+JcC<$JcC<$nc/+Xqu-HjqYU6frqZHdrqHEcr:U']rq$'Y!Q)YM^\knIV#[CkVZ<UmVuN^qlMToH
+kl0cDk5XQCjSe*?io/kqi;_[7hYu=3gtVh^!SQ-)f*0aUeC;sqrm;)"cd'h\bfe2PQ^7E3s-E/@
+s-E\Ms-*YOQBmc"rfdAFq2l)USY`6]Vkg,cV5C)crMT[os,R,=s,I)=qhubfQ^<ktO,SmLJq8E"
+G^4OYK7\Z)IXm!!Jpr2uJ:W5W?XI(:?2e.@>[:WA?!U]A?!:TAAp9-&rN,suri-=)W2QSiUnOKV
+Uo"!ds/5luk>qR^!*8qrr`B,%"BSW)=',?$!*B/%#$G,6>?P'1q-!]#r*'G1=fSR(WiE,#nlYlm
+r)WYo!*9)!r`0;)<``=&?=$uFr`oM1ra5G$rNcH-rJ^f;rf$u>NK*msrK$o>r0%&C!L/lFQN!6C
+R/*0FRK/iV_>_@O_>qLP_Z.ON_>qFF_Z.LX`5BL2`Pojq`rO3XaT0K_b6,o1bE)Xas,m5Bl)4id
+WiN5'Xfel#cMu/hbl#Zaaooi-a2Z-u`W!gS_u.IK`W*mV_uIUK_>_4PeCE.$rn%2&s4RD*rnIJ.
+rS@J0s53_3s5Et:r8[e;roO(?s6'FGr9=7Hs6KXMs6]jSrU9dUs7-$Xs7?9_rUp3arqH?cs7uZj
+qYU6hr;H3cJcC<$bl<1~>
+JcC<$JcC<$nc/+Xqu-HjqYU6frqZHdrqHEcr:U']rq$'Y!1<\L!LB)NR/_d=K_gE&K`?c+lMToH
+kl0cDk5XQCjSe*?io/kqi;_[7hYu=3gtVh^!SQ-)f*0aUeC;sqrm;"ucd'h\bfe2PrI4crrda?b
+s*jurpO)[]#CM,UJqAW-K`$N0KS>,7L3\&hGkcOsF`MJ@DJX'$An#7Y?sHr@>[q=C@fKpCARf4Z
+@prkGr_i_o!E)kn;@?E#;,U7f;,UG'CO#c.rI=ltqgSQns*F`urIb9,KS>-A:%M'X:&drh9htIX
+r_<Mh9MG.Ss%`Jd!/CB,pIt<S!)3;`!)3Ab!)3Ab!_c<_r_3>brDWYmr_iejq+L^F!fU#TmX+n\
+r-nBip4*-oqL\<krIk06rfmGHs-*\NP*2#nPkC74PlI$HPl?sAQ2m!FOT1I@P5gI=N:W&/NrP1;
+OT1I;R/`NQQMd$FPl6gDP5(18P4Oh7O9="_f%0iPs4IA)rn@A+s4mS/rnd\4qr%M5ro3k9roF(?
+r9"%Bs60CFs6BXMrTsROs6fjSs7$'Yr:9mZs7H9_s7ZHdr:p<frqcKgrVZTlo)=4?JcEsoJ,~>
+JcC<$JcC<$nc/+Xqu-HjqYU6frqZHdrqHEcr:U']rq$'Y"Bei/=]tZ)!a/](rDWVls%rkr;sNZG
+l2TuHkPaQCjo=E?ir\6!iVqd8hZ2O4h#Z<crn7D+f`'J+f%&:"e'e6C$..#DcHXSVbK<c];Z'Jn
+<:Eof<<#nr;Z0Pd;@Q;m;-$Up;Gg=i;c6Llr_ibpqGI,fr]:oV3&WQM1bpd?0.nk//i,@@0JG=@
+1c$rc2?#i=4UjG84$>Yg3]]Db3^#Mar]1*E5XYK>rC?fUs$[Jg77K^77T!&];c?Rl<)Yb9r&=O3
+r\sa5lSn`$s#L'<!&sg6r\sX2q_e:1s#'pW<E9$!!*B(W!&jd4s#'[3s#:!=rAad8s#:!=q`+U7
+"?8>!4[&[,s$-QKpc&FX<E<*b5lFU[;?'Pe;>!iZ;smWa<Vf\p<rZ1u<WQ9&r`/u!"'&8t;uT_u
+;cH^rpK%8nrDWr#<`W4"<W,r"<E)rs<W5qtO8b7@Oo1C<=T;Oq=T;P$=p%Vu:f$UV!)NSjs%iSg
+rD3Aer(m,bpeUlar_NMg"4YlPf)F;$f`0Y(gA]k,h#6(.hZ)L1i;_d8ir%j9jSn9=k5XWEkks]F
+lMp2Km/QJQmeuVSnGi%Vo)J=]o_nI_pAXgaq#C0hqYL*fr;?Nardk*#s31Ln~>
+JcC<$JcC<$nc/+Xqu-Kkq>:0frqZHdrqHEcr:U']rq$'Y!V+#'^\kkIVZ*FiVZ<UnVuN^ol2TuH
+kPaQCjo=E?j8\*=iVqd8hZ2O4h>c71g]#nCg"=p.f%/C$eC2jndEp4bcHXVXbKJ%qr0R>Is-N_P
+o9]HB!1!PJs-<SJ!L&]>OoLs[Uo(#eV50rbVPU,drhodVrJg`6s-XFcP*(faLP:;0I=-?cH$=Lb
+rdk*"&Uo4ZJUi6#JV%07>[:ZA?<pq;?2n72>mOY@?!UfSJWlu0XT#7!W<B/tV5:!cUAghcT`Ld^
+r20Lls&\Aap/M)nr`9,&=8l5#=8c/"=8l;+=^#$6=]ef%=o2D&>6.o1ri?(!s/Y]mr`B"uqGdMr
+r`/qu"'&]9?iF@4?XE_;!+,S1qc3\srNcH-s'5S`"H8>"N/[aqrJpo=!0I,@s-!AF!L/lFQN!6A
+R/<<HRfAiZ_nj1+rkn`P!5ncP!5nZM!5\?Fs24iSrl"lWrPnoZqoJi\rlYAcNfO(!rfI/Bs/5+[
+#-"W'XKAV-oZmK]rlk>as2kGcaN)=!`W*mS_u.IK`W*mV_uIUL_>h:Ne,Ihue^i=NfDjM'g&9Y)
+g]-(,h>Z:2htu@3iVqj7j8S->jo"9@kPscDl2U&Kli$2MmJlVQn,MnWnbr%YoDeI]p&Fabp\agd
+q>U6equ-HjrUTr=s+13ps*t~>
+JcC<$JcC<$nc/+Xqu-Kkq>:0frqZHdrqHEcr:U']rq$'Y!V)KTQ2d-MQi*3NK`6T(K_gB(KS>-Y
+l2TuHkPaQCjo=E?j8\*=iVqd8hZ2O4h>c71g]#nBg"=p.f%/C$eC2jndEp4bcHXVXbKJ'*J+nKb
+J,XooI.)CaI"R$&rdt<+KnY3XL&ZGpGlN$uF`VSBDJNs!ARf7Y?=!P8!*fG4!+c(<$tEgY@q/tX
+A5Z?(;cNZm%T?8(;H$Fi;Gg7f>A%u)rdk*""FklLIt.EGs*a`j!d]-<r.P''j\>>?r_<Df!DQ>a
+:&[lh9h\7L:&g"HM"j[;9)qZ`9)qZb9)qZb9*J!`9h\Mcqc!Gkr)<Gbregc8rDN04!.=]ms*jlq
+s+(&tpON9prdk-$rIY'%s+:9's+L?'r.G'7rfd>Gs-*JI"I"t2PEbX%mZda:pm1r?rK$r>s,m>=
+rep]5s,Hl6rf$o<rf@#>rfQoAs-NbOr0@/DrKI8Eoo]'5oo]37!7Uqs!nGlQrn%2&s4RA)s4dS/
+r8%A/s53_3s5Et:r8[e;s5j1@s6'FGr9=7Hs6KXMs6]jSrU9dUs7-'Ys7?9_rUp3arqH?cs7uZj
+qYU6hr;H3cJcC<$c2W:~>
+JcC<$JcC<$nc/+Xqu-Kkq>:0frqZHdrqHEcr:U']rq$'Y!:fke!*T;)##\;r;cHXnr)*Sn;H!JX
+s60IFrT=.As5a.=s5F%;ro!h6!8d_2s4dV/rn8.@f[na+f%&:"e'cXkd*L"_c-=JUbKBWZr`&nt
+r`8Vjr_rkrr_iYmo25ce92\bg<)`co!)rkp!`Muppeh&hs#UWM3B/lP2)6pA0J>%3r[n=/1G^a@
+rA4I2$oTq"1d=2f4[(qi4?`[+%6?R64$#Md3BKAh6:FBC8,Ga^77K^77R]a87Rd;Dr^?``##eDt
+;cG_9q`"I3r\s[3m5Oo%!'1$<!&sg6r\sX2q_e@2s#9s9s&8tur`0##r&4U6rA=O3q_eL73'$ps
+r\sj:!'0p9!]N8+rB1-Er'13H!^Ak4qDeIT!*0"`!'gBZp/(ig;>*oZ;t!]b<V]Vn<rZ1u<WQ9&
+r`/u!!`W)rrDWhs<)rWmr`/nr"]\T(<E)rr<WZ9#<;ol!<0!";O8b7@OoJMY=T;Oo=9Vi2>$5$+
+r_NSjnP0'[r_WVjrD*>fr(d/cq,$l_s%`Jf!D_,Ce,n1Of)F;$f`0Y'gAfq-h#-"-hZ)L1i;_d8
+ir%j9jT"?>k5XWEkks]FlMp2Km/QJQmeuVSnGi%Wo)J=]o_nI_pAXgaq#C0hqYL*fr;?Nardk*#
+s3:Ro~>
+JcC<$JcC<$nc/.Yqu-Kkq>:0frqZHdrqHEcr:U*^rq$'Yrpfj"qnN?4VPU,drMT[ms/5mqrojCF
+r9"%@s5a.=s5F%;rSRb7hVS7f!SlH/g'66_f[na+ec+&.e'cXkd*L"_c-4ASb/qa&R/30HR.cmG
+Q2m3LPlI$KPQ6pHP4Xn:S-Y[_VPg8dV5C-hV#[FjNW+khR@'A*OH>EVL4au'H['aWGB\RhJq8N'
+It!!!IsuluK4&"k?!^fC?X?uC?!gk9?2n46?#b[kX8]42XK&;"Vkp2bU8"EXU8"@[TE1aZrLX7b
+SXlUSV>d@lVuKi]<q]Mn<rQ/$=BG<!!*B/%#$G,6>?Y-2q-!Mss&oB&"g"`(X/fY"=T2D"<r,hr
+<rZG-?=-uEra5Y2!FK14>l\4,?iO1,<W06'>Q7q/?!dDerf-o;!frG)r/po@pm1lFnsKBDpmV2O
+"N/*m_8?2hrk\ZQrPAQPqniBLotpaHrl"fT!65#Ys2b)Zs2kJfb)D=>rf6u=rh][nl)=W]"KJN(
+Xj-I_s3:Sfr6#8daiVWE`r3mV`;ION`;7IP`;daT_Y_1K^]Ms5e,Ihue^i=Mf)jUXg&0S(g]-(,
+h>Z:2htu@3iVqj7j8\3>jo+?AkPscEl2KrJli$2MmJlVQn,MnWnbr%YoDeI]p&Fabp\jmdq>U6e
+qu-HkrUKl<s+13qs*t~>
+JcC<$JcC<$nc/.Yqu-Kkq>:0frqZHdrqHEcr:U*^rq$'YrpfuQ!1*VNqj@D:s+:<)pP&V1s6'=B
+s5j:ArT!q;!9*n7!oMkkrnRV1g]#n2g"=s/f@JLOe.C*WdF$=ecHa\YbKJ&MaFA^0JG=WoIf=cm
+I.)F^H4#"JJqAW,K7ei3K`6]#GRek<Ec>o4BkM$f@UEJH>Q.e+@f9gK@:EbYA7K(Y@:N56;H$Ol
+;uT\p;u]_r;,I6h"]AWBG_1PHJHC@NJ,XosI/nWnI/A6jH2DpfGm&eQK7npWL$VM69`.WU9`@`d
+:A%?\:'+-`9^b^UL\ur.<;B5]9)qZ`9)qZb9E.]c;?Bft<W5tq;uBPh;uKAgMZA_6;?0YgHiAEj
+IJeTnJH(,sJH(,uJH(3"K)U>tJcLH%K`?](KER!^KTq`#PQ$gHPQ-jMP*(rlPjjn+PlI$FQ33D2
+NK*ptrf?u7rep`6rf-c5rf$u>O,s4#!Ki`AR/`NQQMd$FPl?mGP4at6P4t+9O93kZe,Ihue^i=M
+f)jUXg&0S(g]-(,h>Z:2htu@3iVqj7j8\3>jo+?AkPscEl2KrJli$2MmJlVQn,MnWnbr%YoDeI]
+p&Fabp\jmdq>U6equ-HkrUKl<s+13qs*t~>
+JcC<$JcC<$nc/.Yqu-Kkq>:0frqZHdrqHEcr:U*^rq$'Yrpfkf!*T2&s&&horDWMirojCFr9"%@
+s5a.=s5F%;rSRb7hVS7f!SlH/g'66_f[na+ec+&.e'cXkd*L"_c-4ASb/qa&<;KVl<q]Pm<;fbq
+<;TVe;?Kci8k]+]"&Vro;uTYp;ts5i3sRf,3ArZN1c#%a.kNA+/M8e81GLU>1GgmD1c7-I2*X;g
+4[(qk4$>Yg4$#Jd3]]Ab3^,i!7f>jU7fPmY7R]cE7K>jT6iBCR6ULc;s&')!<)QUm<&cl52ZPc7
+2u5H"2to932uGT52u,B/2>f?82)\E5<W6#"=$?L@!&jd4s#'[3!]N)!rAad8s#C$=r'(-D!'^?E
+!'^<Fs$-QKr'('=r`0#!r]pKJ!^KX]pJLQ\o2G*Wr`/_m!*0#!s&K"u"'8N'<W6##<)Z`p<<#kt
+<)rWmr`/nr!``9%r`&hs!*0"t"BAE[NK*ptrf?tYqH3`"pfRJrr`B8*>$=f$:]O;]:&n)h;#a>i
+:B"&e:Adoa;"7<_daQ\Ee,n1Of)=2%f\+sUgAfq-h#-"-hZ)L1i;_d8ir%j:jSn9>k5XWEkl'cF
+l2^/Km/QJQmeuVSnGi%Wo)J=]o_nI_pAXgbq#:*gqYL*fr;HTardk*#s3CXp~>
+JcC<$JcC<$o)J4Yr;HTlq>:0frqZHdrqHEcr:U*^rq$'Ys7-*X!5AEHqnN<M_l'C2V>[=lVZ3Rn
+VuZ#Yk5XQCjSe-=irA!:i;_[7hYu=4gtUT_g'ZNcf@SU)e^W*tdf.W%d*L"_c-4ASb/q`GnX/s8
+!1*GG!L/fIP5(1:OT1gYSY`6]VPL#bV5C)cr/DGMR[KP-OcYNYL4t/)H?sdYG^+dgJ,F`qIK"`r
+IMd]g?=$oD?!grF>[1WA>@(N>?>"YOWi`?$XU2&0Wi;qnU8+KWrLj1aqk*n[rga([S,SiXUo(!e
+V?*Srk#V1Us&T)"q,RJsr`B2(>5h_,=]kK&q-"&,=KAL(X/`2#qI',$r`B"urDaJ:?!UcC?!UcD
+?!UcD?X@&G?XE_;!+,D,!FAe*Z3@L;>?kE=ra,M]rf%&@O,oBarfR5Drf[AIQ2-aDQh-UCRJ`KT
+S!ofFRg>P%_SX.*_Sa:j_Z.OP_>qLN_Z%CG_>qLO`;[^U`r=$YaSa0[b5]Z`N;ee:Nr5aUVl?Z]
+W!96$WiN2Fc1oTaci25ic2Z#cb6?&1aN2EArPefTrPSNNqSiHPs24lRrk\QKrm:eqe'n<Gs4%,#
+rR_)%s4R>(s4dP.r8%D0rnmY3s5Et:rT!n<s5j4As6'FGrTX@Is6KXM!q#FDrU9dUs7-'Ys7?9_
+rUp3as7cHdrqZTjqYU6hr;H3cJcC<$cMrC~>
+JcC<$JcC<$o)J4Yr;HTlq>:0frqZHdrqHEcr:U*^rq$'Ys7-*X"I5:=Q^@T:".>U2K`6W&K`Hf'
+K`L<6k5XQCjSe-=irA!:i;_[7hYu=4gtUT_g'ZNcf@SU)e^W*tdf.W%d*L"_c-4ASb/q`GnUUFb
+!.OlppjD[[qK`QtIY*3(JV/T.KnY26qfr-`&9;c/ChdWpA7AqQ?!:E9>[dS?s'Yn;qdTS8"B&/s
+<)`]m!`Mrnr_N_p=(QK)r.=s"#C_/OIXQTjHiABoH[9u5HN&0jG^'.1s+CQ.KS5&4L$VP69`7]V
+9`@`d:A%?\:B+#g9^b^UL\uu+<<#ns9_M*Z9`.N`9`@ri;u]_s<)lrt<;]\m;YF#h9DseH;Z9Sp
+HMMpdI/\QoIf+]iJGt&tJ-(:RK)C3!K)U<%JqNoQrIt68rfdAHrfdAH"Hnn2PEbL!ns'0>qNh)=
+rf$u>Mi7Ljr/:T6rf-c5rf$u>O,s7$!g/h9pmD)Ls-NkSQBqH6qiq)DrfZr:qNCW9r/gp*!n,QH
+rm^tu!7q,#s4IA)r7_2*rnRG-s5*b4r8@V6ro3n:roF+@rT=.Cs60FGs6BXMrTjUQmdC&Bs7$'Y
+rUU![s7H9_s7ZKer:p9es8)ThrVZTlo)=4?JcF$qJ,~>
+JcC<$JcC<$o)J4Yr;HTlq>:0frqZHdrqHEcr:U*^rq$'Ys7-*X!*B/%!*T2&$X6k6;Gg@k<)QXm
+;>X5kkPXKBjo=E?j8\-=iVqd8hZ2O4h#cBdg]#n6g"=p.f%/C$eC2kFd0n=IcHa\YbKJ&MaN4?[
+s&JbnoMtZcr)<Agqb[Pm9MA;`;cEWm!`MupqbdAT#Wat*2`3HL1,/\\r@\(*r\5NO2)@!D2)R3J
+2*X8f5!1ti4Zkee3]fGb3]oMh6q9g<r($cVr^HiV!(?cQqaCHNs$-WO5=,36"&Vrn<;obr<&jJ.
+!]Dnnr&3t%pG`.3r&4O5q)8%+r\jd6s&8tur`0##r&k'C48^u52?Gfs3W1r;2Zu6,5!M:056!bG
+55m_F55[YF5QF%E4odSA<WH+u5lX(J5kn4J;Y3oU;ufqo<;fhs<rQ+t<WH5#<W?)%<E)mqr`&kq
+!*/ep!EW>#<W5r!<E<-!;ufqt<WlE%<)lrsN;ee:NquiR=T2Iu=T)>#=T;P(;>a5j:[q0]:Jame
+:]4&f:]4&c:\moZ:]A`CdaQ\EeGn&!f)=5#f`0Y&gAfq,h#-".hYuF1i;_d8ir.p:jT"??k5XWE
+kl'cGlMp2KliQSBmeuVSnGi%Wo)J=]o_nI_pAambq#:*hqYL*fr;?Nardk*#s3CXp~>
+JcC<$JcC<$o)J7Zqu-KkqYU6frqZKerqHEcr:U*^rq$*Zrpg$Xs6op$!PlJJ_#M7U_54',V5:'f
+VuNXoVuN^pk5XQCjSe-=irA!:i;_[7hYu@2g]6+.g&]mZrmq2%ec+&1e'cXkd*L"_c-4ASb/q`G
+a2[\;q3V,Irg*VNrg!DG!0dAEplYE7"Hf4FSYc=_"JqojV5F3N&t55TP`h/fM2$_7I!g3aG]n=_
+rdPH-IsufoIXQ]qJ:N8[?X@(<>l\40>mahB>[DN5Vm*>*XT#=0X/rA$WMQDbUS+9Rr1EkX!hGjN
+rgF.]R$X/)QBn>DV>d@lVZ9f\<r>qt<r>ts<rZ7r<WH5#=92Q.r`]D+=SZ+q=p8&2=KAO)ri5Ns
+ra5\3ra5S0r`p"??!UcD?!UcD?X@&G?XE_;!+,D,s'G]1"gM99>[1S5?N,o_NW5%=O8b4@Oo:FF
+PE_;sqj.)FopG]Gr0mMPs.',,s2+fP!lDjmrke]QrPAQPqni?KpVI!L`5V_orl+iVs2b,[s2kAc
+MZ/P6N;0=NWV3:jWVECrWN*#Bbg"E1cMPrecMu/hbl#Wfb/q`Ga2\(ss2=rTq8E-Krl"iSs2+fP
+rP8H[rm:eqe'n<Gs4./#rR_)%s4R>(s4dS/r8%A/s53b4ro*n:rT!n<s5j4As6'FGrTOCKlg+N9
+s6]jSrpTmVs7-'Y!qZ'Vr:U*`s7cHds7uZjqYU9ir;H3cJcC<$cMrC~>
+JcC<$JcC<$o)J7Zqu-KkqYU6frqZKerqHEcr:U*^rq$*Zrpg$Xs6frRrg*YQQi*3RR@9OsK`6T(
+K_L3"k5XQCjSe-=irA!:i;_[7hYu@2g]6+.g&]mZrmq2%ec+&1e'cXkd*L"_c-4ASb/q`Ga2[\#
+q1&<jrI"TkqL&'bqK`9kH?sskrdt-%s+UDrs)eZhEGo].BP(db?srt=!Erb,@fBm9@K0g9A,K71
+;H$Ik;c?Okr_Wi*E.<OnKDgE%Jc1$#I=$?gI//*eH2i*kGBS.RrcSQiFE;MVK7ei1re9]5r_3;c
+rCd8e9MP=Vr_3AfohGE\s%NJeq+Ui_pItXCreLT1M#:6C;u]hs;u]_q;uKSt;c6Lm<E9#tr)<Mk
+oi(gIr)3Jl!.+QiqKr9krI4]pq1/Bms+'lq!.t0#!eQ&Wr.P!%rKR;Fs-3MHs-*YLOctunqi_#C
+oons2!1!DH!/gc6s,?i5qMP<2s,?r:qMbE5!fi>&rfI)FqO%5L"IPOBQBqK7qNUuCrfZr:qNCW9
+rK.'+rm:eqe'n<Gs4./#rR_)%s4R>(s4dS/r8%A/s53b4ro*n:rT!n<s5j4As6'FGrTOCKlg+N9
+s6]jSrpTmVs7-'Y!qZ'Vr:U*`s7cHds7uZjqYU9ir;H3cJcC<$cMrC~>
+JcC<$JcC<$o)J7Zqu-KkqYU6frqZKerqHEcr:U*^rq$*Zrpg$Xs6fqir`K8*=oDP&>Q7S';,U=k
+pJV"Qs5j:ArT!q;s5Et8s5*h5rn[V0!8IM,!SQ-)f)aIQrmV\3da?Ihcd'h\bfe2PaiMQD``,o;
+<VBJh<W?%t<W,nk;ts8e;$^&o9M88`;c6Qn;?0Yo;?&]]3]T/Z2E(Oi!AQ5+0,#rk1GUdB0ekI@
+1G^jE2)R3J5<o-1%m)p;4$>Ye4?>Mc5!qh38GYgV7fGgZ7R]d66iBCY6UF((5X@V"62EqJ5mBS=
+5Yt<T<;obr;`OA-!&jd5r\j1'pG`.3r&4O5q)7h%!E<(t<r>)\4T.A;49I`15<o-2!^/Y.r]U<H
+r'(-D!'^BFs$$?Fs$-QKpce[X!*&q_s$-HIqbd,dr_`VloMamOr)Nbtr`/nt$!1,+<E<.#<)Z`p
+<;oer<V9Dl<W5tt<WH/!<!--$<`T,u!EG$VMuSb1=8Z1q=o;D#=8uA*=]/-p;>j>k:[q0]:Jame
+:]=,f:]F2c:\mo[:]Jf@d/qbFe,Iksec45!fDjM'g&0S(g]-(,h>Z:2hu)F3iW%p9j8S->jo+?A
+kPscEklU/9li$2MmJlVRn,MnWnbr"[oCV\Qp&Facp\agdq>U6equ6NkrUTr=s+13qs*t~>
+JcC<$JcC<$oDe@[qu-KkqYU6frqZKerqHHdr:U']s7?0Zs7-*XrpTj$!PlJJ^];4L^]gR4Vkp5e
+rhoams/5mq"/k8AjSe-=irA!:i;_^7hYu=9gtUT;g=b03rmqt;e^W*tdaHOjd*L"_c-4ASb/q`G
+a2Z*cQhm$JQ2d*KP5pdFPPgU=Oo(7>OTq#>S>E*[VuEM+VMpt2R$3\oNerLEJ:)]hG^+LXrdY-"
+J:N)rrdF`os+:/Ts'Pb2$=@"D>]H%5Yck11rN-C-X/i8"VPU#^U&CYaTDtJ`SXfSG!1EhQ!L9#M
+Q3NS;PE_l>V>[:kVrh%X<<-(t<W6&!=85er=8l;&=^(f/pK@;q"^+r0X/rE%WqBcs?iOI3?i==0
+>n11H?!^lE?!^lF?=$uG?N+45?=.&G?Me+0?N.53Z!1H3>lA"/?2fi_NrP1?O8tFAP5^XHPa.O4
+QMQsER/`QUR$j?@RJ`NNS,]#Y_Z.OR_Z.FR_Sa:j_Z.OQ_Z.ON_Yq=G_?.Wn`W!gT`;mpWa8a6X
+aTBVAM>iD,VZNfrWV3:jWVEClWW('Bbg"E2cMGlecMl)gbQ,iaaooi-a2c4!`Uq+F`W!gU_uIUR
+_>h=Nc2l8<rQt\pe'n<Gs4./#rR_&$s4R>(s4dS/r8%A/s53b4s5F";r8[h<s5j4As5sCGrTX@I
+s6K[Ns6]jSrpTmVs7-'Ys7?9_rUp3as7cHds7uZjqtp?ir;H3cJcC<$ci8L~>
+JcC<$JcC<$oDe@[qu-KkqYU6frqZKerqHHdr:U']s7?0Zs7-*XrpTiQ!LT5JR/Vd<KDpT)K`$N+
+K]V:UrT!q;s5Et8s53k5rnRh7gY:H9g"G$Wf,*#geC;sqda?Ihcd'h\bfe2PaiMQD`l7P"qg\Wp
+rdF`mr-S6epj;mard+fjH@(9rK)L<3Km.W[EH#i4C1q3j@UNUB>R+JA@q/qW@q,FG!FT@8@fKs9
+;uTZ";c6Ol:f1P?re(9(r.4s#JGaiuH[L0frd"isH?jd\G^"=Sr-/-_!d&L)rGqpWre(6(rIsW5
+r_3;cr_38br(I/d9MGF[!)E2]r_E/]rCm&^!/LQ0!JcL/<:Wuf<<#nn;?]us;H-Xrr`&eor)32d
+rJUSOqc!K@qg8Blr-nNms+(-!!.arrrdairrdt0$s+:6&re13'!0d>FrfdAHrfdAH"Hek2Pa)'/
+rf[#>nrs->qj.8=regN0qhkB2s,?r:qi(K5"-/G'OSbCERJ`HNR/r\Arg*MJqiq&Cs-!#:qNCW9
+s,d9+!RK-kd/qbFe,Iksec45!fDaG&g&0S(g]-(,h>Z:2hu)F4iW%p8j8\3?jo+?Ak5a`El2U&K
+li-8NmJlVRn,MnWnbr%YoDeI]p&Facp\agdq>U6fqu-HjrUTr=s+13rs*t~>
+JcC<$JcC<$oDe@[qu-KkqYU6frqZKerqHHdr:U']s7?0Zs7-*XrpThh!ErY)>5MP';?0Sn;u]bq
+;>X5mjlGM$j8\-=iVqd8huDR4h$;`igY1B7g"?;U)V3HgeC2jodF$=ecHa\YbKJ&MaN2EA`Dfi;
+p/_&jpf-lapepudr_`hf9M/4];uTYp;>rZW3<qH$2D[-E1+rMY,q^u.1GU[?1GUdD1GgsH1c7-T
+4Zttj4Zbeh4?>Pc3^5u'8OuGL7fZ$X71;XS7RTU26ps@,5sRa26N9@O5lX(K5lEnL:f1(gr_`bq
+<:i-L2Z,H42XWNu2uko82Z>Z22Y/d,<)rltr&k$BrB'g;"$Jh45Q3hN4Zkhi5!D4/56!bG55m_F
+55[YF5QF%D55nR_<;o/_5Pm_F;>=&g;>jDk;u]bl;s%$\<E<0"<W?,!<W,r)=&i4"<`W4"<)`cq
+s&/qt<V9Dk<<Q9$<`W6"<!--$<`T,us,$`4s&f"sr)i_sr)io!"B\Mu;H!Kkr_NSjn4j$\:f.-e
+r_E&\qG?l]s3:Ykd/D>ndaQ\EeGn)!f)=5"f`0Y&gAfq-h#-"-hZ)L2i;_d9ir%j:jT"??k5XTE
+kl'cGlMp2Lm/QJQmf)\TnGi%Wo)J=]o_nI_pAambq#C0hqYU0gr;?Nardk*#s3L^q~>
+JcC<$JcC<$oDe@[r;HTlq>:0frqZKerqHEcrUp0^s7?0Zs7--Yr9jX"rkJEI"2DXd^AYeNV5C/f
+V5:'fVuNXoVZE`orT!q;s5Et8s53k5rnRY2gY;_]!SQ-)f)aIQrmV,#da?Ihci22tc-4ASb/q`G
+a2Z*;m[*j;rK[AH!0d2@plYH8r/iIgS=?CPVP^2dUm.%*O,JdJKn4]"H?aXWGCb6oIt)lrIXZfr
+J:N*!K7a#-!+5\2#[^hB?$;aBYcmu,s/c7$!i`)prhKFcs.BRgSt;IAS!s>C!LB)LQ3EP:PE_;o
+rfI/@"-01RV>d@lVrh%X<<-(t<W6&!=85er=8l;&=^(f/pK@Gur`KG/=]ee,XK;E$pL*f(ra,V3
+rEfJ/s'G_2$XR1H?!^lF?=$uG?N+7.?Me+0?N7>1YlJ#->lJ(.>le2irf6u=s,m;DrK@;IQ'M?7
+qNq)Hrg<hVR@4#Bs-j"Wqj[STrPAQPrk\ZOrkncQrkn]O!5n]Nrk\?G"N/0s`Ph_o!65#Y!6G&Z
+s+p]3oVVbhWN#Tis/Gdlr6#,bc2Graci;;ic2YufbP]KcaiMNB`r<sL`;7IQ`;daS_Z.FQ^s2l(
+!mf6?rmCbo!7Unrs4./#rR_&$s4R>(s4dS/r8%A/s53e5s5Et:rT!q=!9O1As6'FGrosIJs6K[N
+s6]jSrpTmVs7-'Y!qZ'VrUp3arqHBdrqZQiqtp?ir;H3cJcC<$d/SU~>
+JcC<$JcC<$oDe@[r;HTlq>:0frqZKerqHEcrUp0^s7?0Zs7--Yr9jWOrg3SN!LK2NQi;[;K)gT"
+K`Hf)j8\-=iVqd8huDR4h#cBdg]#n-g"?;U!S5g#e-4=LdF$=erltnrbfe2PaiMQD`l5phJGXir
+If=coI/J?eI/&'cHMi*lD0^J\rdki8K7e/^DJNs!An5C\?sQu@>$GEEr+#b9!b5\Kr+#Y'!)i_n
+s&'%u@<dKZKS05Ts+(6%It.HHs*OopI!^/<HN/6kG]s(1rcJ3_rcA$Ys)J!Vrb_pYDM3XpKS9>Y
+!)2fTrCd2crCm/ar(I/d9MGF[!)E2]r_E/]qFpi^!/LK.r)E2b!`W)sqbmGms&&nt<E9#tr)<Gi
+pJ_!JrDNJj!)i]A!.FcoqL8Kqpj`9nqgnTqre(-%rIt98qih)ErfmGHrfdPJP*;)oqih#BpQP04
+!1!MKs+p]3pko03Mu/D2MuSb8NVe\5N<G9&O-l=5QNEPBRJiNNR/r\Arg*MJqiq&Cs-!#:qNCW9
+!KbS*c2u>=d/MGmdK%bpeGn)!f)=5"f`0Y&gAfq-h#-"-hZ)L3i;_d8ir.p;j8e<?k5XWEkl0iH
+lMp2Lm/QJQmf)\TnGi%WncJFTo_nI_pAXgbq#:*gqYU0gr;?Nardk*#s3Udr~>
+JcC<$JcC<$oDe@[r;HTlq>:0frqZKerqHEcrUp0^s7?0Zs7--Yr9jVfr`T5(r`]G->?_#1r_`hq
+;GpHg;?0Smj8\-=iVqd8huDR4h#cBdg]#n-g"?;U!S5g#e-4=LdF$=erltttbfe2PaiMQD`l5ns
+<VBJj<VTPc;ts8f;>a<$5YOjL;,^Ck;c5V82`:Rks"YEG/hSe1/h]"91GgjA0f([C1c$sF2)[<V
+r]U9C%6Qg94Zb_f3^,r'8OuDK7fZ$W7K5g_6pj=06pj4*5l<tK62s4K5Q<tQ5<_:q5!;+-4U4h^
+;H$Ik;cNBJs#0^2mPji!r&4O5q)7h%!`W0"r`8q[oK34=5!D414pF/44?Yhk5Q!_F4TI\F4o[_A
+5PRGB<Wc?$<'^FIqEP$Fq,7/gr_iYms&/\lk#D@\s&T,!s&]2"r`9&##ZXi(<`N.!<)`cqs&/ns
+o2bij'i\16<`N*u<E3(#<E+d1M2>87='/T!=8Z1q=o;D#=8Ytq;>sAl:[q3[:]F8k:]4&[:\mo^
+:B8Z=c2u>=d/MGmdK%bpeGn)!f)=5"f`0Y&gAfq-h#-"-hZ)L3i;_d8ir.p;j8e<?k5XWEkl0iH
+lMp2Lm/QJQmf)\TnGi%WncJFTo_nI_pAXgbq#:*gqYU0gr;?Nardk*#s3Udr~>
+JcC<$JcC<$o`+I\r;HQkqYU9grqZHds7cNdrUp0^s7?0Zs7--YrU9aRs1eNJ"M_[b]tOEZ#e[dG
+V5L5fV5F6irhf[m"fUJ@io/kqi;_^7hYu@2g]6+.g)o##f[na+f%&:"e'c[ldEp4bcHXSVbK@rJ
+aN)<>`Ph53rg*PKqNLuDplb00qN1`H!M-(dV@KGuLkg_8IXZWjG^4OWGQ*-mIKb4LIt3#urdb$#
+r*B_;?=.#E?=$fAH_gYF!3Z:&ri?=(WMZMeU8%U[s.BUhSt;IAS!o]AQ3NV<P*D/nOo:C@O8b.D
+NJrjVUnspeVZ3RV<r>qt<r>ts<rZ7r<WH5#=92Q.r`f,"rEB,%s&]H*XK8G$WqTos?iFC3?i==1
+?2n72?2n72>le8=ra,V3r*B8-qd9A0s0DX/!*fG-!F9%0>le27rf./COH>TeP5LODPQ7!JQM[$G
+R/WNMReN<NSH$G%_>qFO_uIUR_u.CO_u7IN_=teL_o0O5`;R[T`WF3%aSa-\L558roVhehqPa;7
+s3(JfrQb8cs3CYhrlbAcr5o/aaN)<?rl+QKq8NBPs24iQ"Mr:*c-?75!mf6?rmCbos3pqrs4./#
+rR_&$s4R>(s4dS/r8%D0s53b4s5F";ro=%>s5j4As5sCGrTOCKlg+N9!q#FDrpTmVs7-*Zs7?9_
+rUp3as7cHds7uZjqtp?ir;H3cJcC<$d/SU~>
+JcC<$JcC<$o`+I\r;HQkqYU9grqZHds7cNdrUp0^s7?0Zs7--YrU9aRs-NbQ!gf:@rg*SNrg!PL
+re16&re:B*r.P:6io8qUro!h6s5*b2s4dV/rn8IIf\"g-f%/C$eC2jodF$=ecHa\YbKJ&MaN2EA
+`PodfJGaorIfFfrI.r!aI.;R[H3/A<I/\^@JV/SgB4bX^@UEDG>[(B8@:NeU@UinW@q&nW@q9(Z
+;cEZp!)i\m#>n</I>*B.KDgB&JUm]Ks*jro!.=`krHSQiGB\1OF8^.YEW'kODZ=SRCBT<CK7npW
+L&Od8:&%E\:&I]b9`RlW:&[o]:&.K^9`TtJL]N9er)E)_qbm>jr)ESmqGR&dr/:JNqbmMn;>tqC
+IJeQhJ,aupJ,OoqJbjutKDL9#L&R;5PQ6pHPlHsIPQm>7P*;)oPl6gEP4t1:PQ6pDPQ7!JQ2u_q
+p5As0!/pW0",i+tNV\V5NW5%;R/N?QR$jB@R/E?SR$X,)r0@/DrKI8Eoo]'5q2kd&bg"E3c2u>=
+d/MGmdf7epeGn)!f)=5"f`0Y&gAfq-h#-".hZ)L2i;_d9ir8!<jT"??k5XTEkl'`IlKdd7liQSB
+mf)\TnGi%Xo)J=]o_nI_pAambq#C0hqYU0gr;?Nardk*#s3Udr~>
+JcC<$JcC<$o`+I\r;HQkqYU9grqZHds7cNdrUp0^s7?0Zs7--YrU9aRs&o>)r`fA*r*0.us&&ep
+r_ibnr)*[Xio8qUro!h6s5*b2s4dV/rn8OKf\"g-f%/C$eC2jodF$=ecHa\YbKJ&MaN2EA`Pobp
+<VBJk<Vobb;t3c^;?'<!92SYe;,^@N1c$m@0eWDXs"4j<1G^a@0etUC2)I-I1c7-Tr]U9Cs#gTL
+4Zkbe4$Q778H;<Y8,l'U7K,[R6ioV>62a+S5sRY!5X7R44p!l25578@4T7JG:f1(gr_`_poJce.
+qDI\"p,Mt.r\sX2r&"I2q)&.Or`/u!r&s[7"$Jh35Q3hP4Zkhi4[)(o55[PD55m_F55@G<56"Xc
+<E)p_rBL0Es$-EZrDEMkrDW\nqbuTUr`/u!r`/u"r`/qu"]n`(<)luu<W,nr;ZKeg<rQ)1<)lt"
+<E)pt<E<.#L5/c/<rQ2#=RoPn=Sc2!=T2D!;Z0Jl:]O;]:&n)h;#a>i:@q?X;#*lhbKS5UrltSk
+d*Vd>s3gqrrRCkts47/#rn.8(r7_2*s4mP.s5*e5r8@V6s5O%<s5a4ArT=.C!9jCG!p]+;rTjUQ
+mdC)Cs7$'Yrpp*\s7H9_s7ZKer:p<frqcNhrVZTlo)=4?JcF*sJ,~>
+JcC<$JcC<$o`+I\r;HTlqYU9grqZHds7cNdrUp0^s7?3[rpg$XrU9dSs6]j$s1efQ^:h4m]`,SL
+]XkYaV5:)frh]Ulrhf[m!iW$Uro!h6s5*b2s4dV/rn@D*!8.;&!S5g#e/$N]dF$=fcd'h\bfe2P
+aiMQD`l5p8_t]SlQN!0IPlI!LP`u'/m?.F1s,[)>#*YUJV5C,frhUW]H$4FWGBe^iJUW&tIsl`p
+IXZfrIXm&X?=$uF?iFC3>m+M<?@f0VYQ1m+XoPU'X9,E#VZ*=jUAghjU7e0QSt;MPS,ATTP`q8m
+qiCf=rJgl;repi8rJ^c9!i2]irhf^nlW+!erDrhr!*9"tr`0##pJq8qr`B2(>5hb#=oDP%=oVS-
+X/rD&WN,]#q-X,-s'P_2ra#P1s'>Y2s'>S0!+#S1rE]A.qd9A0s0DX/!*fG-q-=),?!NHiOT1I@
+P6$o5rKdJM!go=@qj@ANqO7)Hs.'))q83-Ks2+fRr5/KOrPJNLpVHpKq8EKVa2c9BrQ,&:mAK?M
+qTAo`c2>l`ci;;jc2PoebP]KbaiMNBrPeHJq8NBPs24lR!6Y;a!mJp6rltSkd*Va=s3^nrrRChs
+s47/#s4I>(rS%8*s4mS/s5*e5r8@V6!93t;s5a4AroX7Ds60IHs69UMrTjUQmdC)Cs7$'Yrpp*\
+s7H9_s7ZKer:p<frqcNhrVZTlo)=4?JcF-tJ,~>
+JcC<$JcC<$o`+I\r;HTlqYU9grqZHds7cNdrUp0^s7?3[rpg$XrU9dSs6]iQ"IPOBQBh?5s-3YM
+PCrjfrdt9*Kn]MZrIk9*iVqd8huDR4h>c71g]#q,f`9\(f)aIQrmV_4da?Ihd*L"_c-4ASb/q`G
+a2Z*;`5DP'r.+TmrdFosI!kj=rHnTlrd=*[s*F]jrH\TlFF/@erdt-%!af8;rEBD6@:WhVraQ:E
+@preU@:EbX;cEZp"&`)s<;ohr;#t?]re:B)rdt0$s+(-!#(:lHH[L3frHeHgrc\?crcA0]EW0qU
+Du"8PD/3qdD#J,PKS+o1K`6](9^tjP9`7]`9^tgY:/+I^:A.EX9`@`dL]3)1LPYk-mSj!\r)<Mm
+r)<GipJ_!Jqbm;i!`;inqgS<is*jut!e>cMqgeZsqL\^!pk8[$rKI,C!0dDHs-*JI#*Y45PEV5q
+rKI2CpQPH<rfd8E!gT(;regH.repi8pkf03N/`hnN;ee:Nr5:DQN3EPRJiNNR0/hCQBqH6qiq,E
+rK?i9q3(W;!6Y;a!mJp6rltSkd*Va=s3^nrrRChss47/#s4I>(rS%8*s4mS/s5*e5r8@V6!93t;
+s5a4AroX7Ds60IHs69UMrTjUQmdC)Cs7$'Yrpp*\s7H9_s7ZKer:p<frqcNhrVZTlo)=4?JcF-t
+J,~>
+JcC<$JcC<$o`+I\r;HTlqYU9grqZHds7cNdrUp0^s7?3[rpg$XrU9dSs6]hhs'#G,s'#G*!*]>*
+s&oD"r_`ns;c6Ol;Z9Pl;?9YRro!h6s5*b2s4dV/rn@D*!8.;&!S5g#e/-T^dF$=fcd'h\bfe2P
+aiMQD`l5p8_c6G4q,R;kr)<Vpqbul[s&&emrD<\o78-?Pr)3_r/h\k1r\+:-!AlV21&s-/1`/)+
+1c7K\4[(qh4[(tk4?>Pc5=\798OuGM7fZ$X7K5gW7/fRR6i]UM63BJ;5="p+rB:0Cs#g?Eq`P$X
+;,L<l;?0Yf2ubf52#oQ&2tf622?Gfq2Z>Z22Z,H22#K32<;fes<r>,Q4T@PF5!T$1!'U<D"?eq5
+5!Jg+s#g9EqEOa=s&K5%<)c-\5Pm\K5<qJ3;Z0Jm;YsDl;Z'JT<!$'!<r5ku<``B%<W6#&=&r:"
+<EB*!rD`bp!*/SjrD`l!<W5tt<W,tt<<-)!=8uCn=8uD&=o)5&='/O*qGR8hr_NSjnP0'[r_WVj
+rD)u\q,$ra!6Y;a!mJp6rltSkd*Va=s3^nrrRChss47/#s4I>(rS%8*s4mS/s5*e5r8@V6!93t;
+s5a4AroX7Ds60IHs69UMrTjUQmdC)Cs7$'Yrpp*\s7H9_s7ZKer:p<frqcNhrVZTlo)=4?JcF-t
+J,~>
+JcC<$JcC<$p&FR]r;HQkqYU9grqZKerqHHdr:U*^s7?3[s7-*XrU9dSs6U$W^VIV!]tF6S!4r0?
+$+I@>V5C/gV51!fVuERlVZbr8hqm5hh>c:1g]#n-g"?;U*S/ckeC;sqda?Ihcd'h\bfn8Rb/q`G
+a2Z*;`5BIfQhHaFQ2?gFPl[,5rf[#<q2kT<s,d2?(1gucA<WORVPU/fV59u2F`i4`I=6QmrdG<,
+I=H`qIsurV?!^lE@/aI:?!^lACm2.&Yl([(X9,H%VuELlTaRNfTqJ'NSt;I@S"'DE&!rTIP`q5k
+OH5E^NK&jTNVJG4MuJ\7N<#dRV>d=lVs@C`=8l8"<<H9%<`]0!q,RJqr)Nf!r`BG/>$G37=]o0A
+qcWl$r)s&%#-4i,X/W,!pgEo)ra,V3rEfJ/s'G_2s'G_2rE]J0ra,M.ra,J/s'G`2rilH-rET2)
+"']&9>lKiaP5^XGPa235!13JJrgEVOoUGlNs2+fPq83-Ks2+fRr5/KOrPJNLpqd'L`;7IQ`rF*Z
+aT'B^VWt)LW;+O:bg$(2qTo2es3:Sfs3(DarlG5_a2\(sou-gJ!6"lUs2=rT"2`1%b5TQcbg"E3
+cMu5jd/MGmdf7epeGn(uf)=5#f`'S&gAfq-h#-".hZ)L4i;_d9ir.p;j8e<?joX`0kl0iHl2^/K
+liQSBmf)\TnGi%Xo)J=]o_nI_pAamcq#:*hqYL*gr;?Nardk*#s3^js~>
+JcC<$JcC<$p&FR]r;HQkqYU9grqZKerqHHdr:U*^s7?3[s7-*XrU9dSs6TgQrKdMMq3CuE"-\k/
+KDpQ(K)pRWre:B*rIkE.i8<GKhYu@2h#H..g&]mZrmr1Ae^`1!e'c[ldEp4bcHXSWbKJ&MaN2EA
+`Pod5_Xi9TIK=kEqg8-do6^F^rd4ZkrHSBDr_t(^H@1?sJqJZ-K3DD\@:*GO@UikV@q/qV@:E_U
+@T-0(<E/rrrDWkq=`]>sL&Zf'K)^B$Ift1II!^8?HiA?kGmnq@GBS.PF`_YEEH#mpDuX_TD#eDH
+C]A5LCB0%eK)gT(L&4R8:&%B_9ht[^rClWRr_EGes&Akiq+Uc^!/LQ0!f)Sfpf-i`qbm>jr)ESm
+qGR&dr/:GMqbmSo;GpBkIfFltIf"WpIfFomJGt,rK)L>sK`?`.PE_8pqNM;MPa.JsPE_;qP5^[F
+Pl6gEP5(7:Pl-aEPQ@&+rJLB.rJU`7rJLT2"cA4rN/`hnN;nn6R/WERR$jB?R/E?SR$X,)r0@2E
+s-*ADoo]39!0R8Dr/q$$!6Y;a!mJp6rm(Pis3Ubms3gqrrRCktrmq&"s4I>(rS%;+s4mP.s5*e5
+ro!h8s5O";s5X1ArT41Ekii$1s69UMrTjUQmdC)Cs7$'Yrpp*\s7H9_s7ZKerV6Bfs8)Thrqu]m
+o)=4?JcF-tJ,~>
+JcC<$JcC<$p&FR]r;HQkqYU9grqZKerqHHdr:U*^s7?3[s7-*XrU9dSs6U9^=^#$6>$5!1=]np3
+>Q.h+=TD=u;?Kco;H*Qms&&_m"]=48hqm5hh>c:1g]#n-g"?;U*nJlleC;sqda?Ihcd'h\bfn8R
+b/q`Ga2Z*;`5BGlqH!Jnr)EJjr`&bnoMYWbr_ibnrD<MQs#)Q#9MA>^;c6Ll;D'RT1GU^A1,:X?
+1GpsF1c%!G2*X5e5!(ni5!(ni3]]Dk84Z<Dr^d#Y#=_3Q7R]a87fGdS6j,kD6UO0<63'=M563r1
+r]^?F#!P144$5YhpcSF:"&Mil;uTYp;tN$K2Z#?32XNHt3;b]62uY`84T78:2>]602#pVS<W?+p
+4o%5?4TR`2r]U<Fr]C<H5!M4pqE=j@r]^0Cpce^Y"'&<"5l<kD5Qa595XPHI!)iVks&/_mj&H%Z
+s&B&"r`')%=&r=$rDj)'<`E%!<rQ+t<;oer<Us2i<W?)"<W5ts<W6%u<<-)!=8uCo=8l>%=o)8#
+<rc1p;Z9Pl:]O;]:&n)h;#a>i:@q?\:]O;j;#F,haT0K_b6#o4c2Q#gci;AkdJqYpe,@erec+.u
+fDjM&g&9Y)g]-(,h>c@3hu;R6iW%p9j8\0?jo+<CkNM./l2U#Kli$/OmI'EAn,MnWnc&+ZoDeI]
+p&Facp\jmdq>^<fqu6NkrUTr=s+13ts*t~>
+JcC<$JcC<$p&FR]r;HTlqYU9grqZKerqHHdrUp0^s7?3[s7--YrU9dSrpBaP#/J!f]t:nerOW!=
+"LtnK['Tb.!N;pqV>dClVZ*IpW2JMOh>c:1g]#n3g"=s/f@JO'rmVh7da?Ihd*L"_c-4ASb/q`G
+a2Z*;`5BI/_>0GqQN*6KQ2m3KPl-gGPQ?u2p6#?9ooBJl@q9#GVPK->S>N.^V?E`kIsunGI2I<Z
+IXZ]qIt*#W?!UfD?sd5H?!^i@Jul6UYQ:r0riZ:&#cju)VPL#_TV;=W".u0VRf8c^R$j;.Q^3l"
+P5^OHO,f-XN/R=e!/pf7rf-rRs/#am"H]:XaC5'Ws'Yn;rK%VTR%C%KT:D73P*(ohP*2*$SGlRf
+<V]\q<W,qu=8l;)@:E_WA,0R5@f9g7@fKm:Ws#N)WN)un@/++/?N4C2?N+71?N4=2?N4=0?3":1
+?Mn+.?Me+0?N7>1YlJ#,>l%_,>[@;5!0R8Ds-!MKQ'M?7!13MKrgEbSs-`nUrgNnXrgO1`SXc4>
+S"-"drke]Oq83-Ks2+fRr5/KOrPJNLs2"cPqn`BO`;.@S`lH-@rMJkXnYl3*!R/gdcMPrecMu/h
+bQ,ibb5]T`a8s?$rPeHJs2FuUs2FuU!5nfW!m/U-rlb>c!6tMgs3L_lrR(Yns3pqrs4.,"rR_)%
+s4R>(s4dS/rS@M1s53h6s5F";ro=%>s5j7Bs5sCGrosIJs6K[N!q#FDrpTmV!:g$Ys766_rUp3a
+s7cHds7uZjqtp?ir;H6dJcC<$dJn^~>
+JcC<$JcC<$p&FR]r;HTlqYU9grqZKerqHHdrUp0^s7?3[s7--YrU9dSrpBaPs-EbPQ2-[EP6d>6
+OcYZWK7npVK*$^[L&Qc(K`Qk`rn[V0s4dP,#MIb^f@SU)ec+&9e'cXkd*U+acHXSVbK@rJaN)<>
+`Pf[2_SPkoqgJQoI/\KeI.M^]HMi$q<DujqI=-EYH$b2CJd6jZK4/4u@:T7E$=dOR@q&qW<)Q[q
+rDNr#;cH^mBS)!<K`QgZrIY$"!e>cMr-\Hi!d]-;rceBcrcJ?cF)c/<rGMgVD/=$(qJ>b=!/1?(
+#)%\NI=nG!r`B8*=BT\DEtNM;H@1-fG]n1NF*)JFF`_nRr_<>bmnNa\p/Lidr`&oQs+g`3Lkth*
+oMbTar)<Mmr)<Dhpf%*KqGR5ir_`qt;GhpnIX_*Bpji?ppk&HsqLnm&rf[DJPEYj-$'UU=Q'7Dr
+P`q:0PQ-mGPPp[EP5pdCPPLI?PPp@:MYW2.Mu\e7MZ/G9MMmFPNK*dn!0-fArg*\RR@3u?rL*\Q
+!gf4=r0@5Frfd8Coo]9;rfR5DrK7*#!m/U-rlb>c!6tMgs3L_lrR(Yns3pqrs4.,"rR_)%s4R>(
+s4dS/rS@M1s53h6s5F";ro=%>s5j7Bs5sCGrosIJs6K[N!q#FDrpTmV!:g$Ys766_rUp3as7cHd
+s7uZjqtp?ir;H6dJcC<$dJn^~>
+JcC<$JcC<$p&FR]r;HTlqYU9grqZKerqHHdrUp0^s7?3[s7--YrU9dSrpBaP$!LP;>$+m.=BSf*
+>5h\)=T;7u;ZBSs;c6Ol;Z9Pl;?9YOrn[V0s4dP,#MIb^f@SU)ec+&:e'cXkd*U+acHXSVbK@rJ
+aN)<>`Pf[2_SK7K<r>tp<;]\m<;BJl;ufkn;Yj8g;#`Ec2)IN_5!Vh9;Gg@k;,^@J1,Sna)Ds?-
+1c.'J2*a>g5!(nh4Zbeh3]]Ps84Z<Dr^d#Ys%!>a7R]a87Rd;D"@PUE6::Z;s$6fR5sIRt4T7MN
+4?bni4ZbYb4$3-uqE5Qi;,U=j;F!T8=$],=5<_=u4Zttl4o@JD5Q3hI4?`X,!C/mC2to<12?5l=
+4o%2?48h5;3W;)><;ont<qniQ49@Z05Q3kG4Tml15!M7,4o[VG4[)(*5P[JD<`T,u!'pEGr'1<J
+5X><8pf%2jr);WTrDrqu!*9)!%TZY3<E3($<`W:&<)cn!r`/nrs&0&"<E<.#oN(uls&K2$<)ifr
+r`9"u!*9)#s&ekor`K2'qH*c";ts8i;>j;k:[q0]:Jame:]4&\:]F8j:]F8i:]AE:ai_d*bQ#cd
+c2Q#gci;AjdJqYpe,@erec+.ufDjM'g&0S(g]-(-h>c@3hu;R6iW%p:j8\3?jo4EBk5a`Fl2U&K
+li-5PmI'EAn,MkWnbr%Yo)SF]p&Facp\agdq>U6fqu-HjrU^#>s+13ts*t~>
+JcC<$JcC<$pAa[^r;HTlqYU9grqZKerqHHdr:U*^s7?3[s7--YrU9dSs6]dO"hq[_]=GHK\HKFO
+[^EI@ZMp[(Vl6MiUo+-hs/,^l"PqkggY;_]!nl5Yrmq2%ec+&!e'e6C(XULRcHXSWbKJ&MaN2EA
+`Pod5_SX.)QM[$GQMQmFPkpXHP`q:)OoCIBO8b1;O8ihlA,rS-V@'#iR[T_:VPU/eVuEM0I=-Hl
+IXc`pIXciS?!UfD?XR5H?!^f?K)DnRYQ1g)XpD/2XK/@uV50mcT`q0`TV%jHrgO4_R?s;-Q^*f"
+P5^OGO,f-WN;\\,N!tNAV4!R1PFnPA\>He8N<#%=C]A5XCi=94EcZ>EF`m\*rc8$Y)/a;/DJa6R
+OckihOH>C0WPP1"U7%3G<E3?(?34JA@/aR9@q9*G@K'a7A,Kg9@K3A2XK/>#Wq]uo?i==1?2n72
+?2n72?2\(0?2e1,?2n7/?iOI4ZMq*/>5__&>m=P>>[:T>>Q0chPE_>tQBqN:q3V/MrgNeR".PgN
+Sc,)YSH5=QrL<o-_u@OQ_>1tI_uIUR_u.@O_u.CM_#hKi_>D(M_o2Ai!lh(5r2/bWo;M?*!R/ge
+cMGldcMu/hbQ,ibb5]T`a8s?$rPe9Es2FuU!QN1ZaT'?^b5TTabl>recMu5jd/DAldf7epeGn)!
+f)4/"f`0Y'gAfq-h#6(/hZ)L4i;_d9ir8!<j8e<@k5XTEkl'`IlKdd8liQSBmf)\Tn,W"WncJFT
+o_nI_pAambq#C0hqYU0gr;HTbrdk*#s3gpt~>
+JcC<$JcC<$pAa[^r;HTlqYU9grqZKerqHHdr:U*^s7?3[s7--YrU9dSs6]dOs-<YMplbcBOcfX)
+"-8OrKDpQ(K)pRWre:B*rIkE.h;$f?g]#n.g"=sVf)aIQrmUttdf.W0d*L"_c-4DTbK@rJaN)<>
+`Pf[2_SO%[J,F`rI=2!?npL7[q0N'd%TZP/<.97BH?saVF*W(arIP]8KS3cA@:<YT?t*ST@oQB+
+<E)rs;u]f";c%+]LAll-K7s/Srdk*!!.Fcmrd4Zj!dJp5rH8BfFE2DAEH(kps)%jSD#J/FD#A'#
+D1R"UFE;PMH[CR!L21XBD-p[X?sd8K?t!MSA7]@bB4kgfA7K%W@:3JM?XWkOs).jR#]#0GNdH/$
+G]`pZpf.Ap<E8`lq,@8ls+gW1!f)Sfpf-laqGR5ir)ESmq,6udr/:DLr)<Vns%rhq;,@1?qg\<i
+!.jlrrIap!!JQd;P6-u4PPC@IQ'@JrPa%Aprf[>Hr0.)B!gAe1qigl@rKI)8p5Ag,!/pf5reU]6
+Mi@Ik!0$Z>s-NbQs-`ePrL!eUQ^=#(rK[;Frfd8Cn<*a6rfI6$a8X0[aT0K_bQ#fdc2Q#gci;Aj
+dJqYpe,@erec44ufDjM'g&9Y)g]-(-h>c@3hu;R6iW%p:j8\0?jo4EBk5a`EklU/9li-5PmI'EA
+n,MkWnbr"[oCV\Rp&Facp\agdq>U6fqu-HkrUTr=s+13us*t~>
+JcC<$JcC<$pAa[^r;HTlqYU9grqZKerqHHdr:U*^s7?3[s7--YrU9dSs6]dO#[:J8=B8L*=BYW,
+rE9,%!a/Atr_`hq;c6Qn;ZBVm;?]qRgt^Z=rn7G,f\$2T!S5g#e,e%Hrm;P/cd'h\bfn8Rb/q`G
+a2Z*;`5BI/_8'(J<r5np<;TVj<;f_q<;oku<)`Zls&&Sg/iPaJ2F'Ml5!D(i3_N+D;,^Cj;c?RL
+0f([D1G^jE2E!fa4[(tj4$>Yg4$#Dfr^d&\r^cuX!_,[Mr^?iW7K,[S6j#eC6UCZ;s$7,[5<qCq
+4Zkki4?Yhh4?WR&s#U0ApcK!K5rq4n4[)(o5!M4p1B'*06Nf_A6:!s;6iBFQ6O#qG6UX:.6N07`
+6:4$s2)dBL2)R9U5!_@r5X%C23;l&<4T@S?49.JA3r:r:3r`1Y<W?+p4nq,@4[)+055m_F49@]2
+5578C4?Yklq*4[=!EN5"<;JiW5R'G<5X@_&5k@nT<)`Qkr_r>dr)Wht!*9)!%9?P2<E3($<`W:&
+<)cot<W#hr;Zp'"<`N/l<rZ2"<rZ1t<rZ8$<rZ/"<rQ2#=S#Vo=T2J#=T27o;Z9Pm;#a>]:'+3f
+;#X8i:@:pX;#X5k`lJ)"s2b8`rlb>cs3:Pgs3L_lrR(Yns3pqrs4./#r7Cu$s4RA)s4dS/rS@M1
+s53h6s5F";ro=%>!9O4Bs5sCGrTOCKlg+Q:!q#FDrpTmV!:g$Y!qZ'VrUp3as7cHds7uZjqtp?i
+rVc<dJcC<$df4g~>
+JcC<$JcC<$pAa[^r;HTlqYU9grqZKes7cQer:U*^s7?3[s7--YrU9dSs6]dOs6C-+\[T)Z\@B#X
+\@/iRZi.30Z2LL%W2HJfV>dClVZ!Fmg]#q,f`9\(f-8ere^W*te'cXkd*L%`cHXSVbK@rJaN)<>
+`Pf[2_SO%&QMQsGQMQmFPkgRFP`tg'!g&J(r/Uc;+(\tnA#Q9$Un=*ER$*\pP+8DHV5C/eV5/Ng
+I=H]qJ,EUZ?!guF?!goB?^Ubr!O/^*XpV;4XK/A"VPL#^UAgkcTE(S_S,\oVQj/nCQ'IMqOoCFE
+O,T!Uq2>93,^"$EDfBQ_[B-gGNKBBJH$k0nJ:`H0NfT9_MMm:%A7]@bAS(jN#%hFXAnGUaraGe8
+*K>u8MQNo(Mi*7AJ:MrgEc5l5D/58qOG^$EVPA22@00qLA,9X5@f9g7@L-CMX/i>&WMuom@.mq.
+?sin>rE]G0s'>Y2s'>V1s'>V1qHa,-rEoP1rj)R/!*]>+!F8t/?2n.4?!LZ?>lIq/P*D72QMm0H
+Qi`\ERf/WTR[a8Hrg`qYs.01[!lr9trke]Oq83-Ks2+fRr5&HOr5/HLs2+cOr5&KP`;@OQV?!Ii
+VX(/PVuY!4b5oi3rQb8crm(Pg"3f$6bPoZaaTKW)a2\+tn&57F!6"lU!QN1ZaT'?^b5KKbbg"E2
+cMu2jd/;;kdf7epeGn)!f)=5#f`'S'gAfq-h#6(/h>lI3i;_a9ir8!<jT"?@joX`0kl0fJlKdd8
+liQSBmf)\Tn,W"WncJFTo_nI_pAamcq#:*hqYU0gr;?Nbrdk*#s3gpt~>
+JcC<$JcC<$pAa[^r;HTlqYU9grqZKes7cQer:U*^s7?3[s7--YrU9dSs6]dOs6BZLrfRJLP*1rj
+P*,^)rJpr=re(6(s+:H+K7nr4re19)!ef=_rn@D*!8.;&+kG2oeC;srda?Ihcd0n^c-4ASb/q`G
+a2Z*;`5BI/_8*hXJ,=ZqI=2$@nU1.ZqK`g#<E)ptIXHNhG]\%JDf9E3H@pkKK)^K'@Kp7M@UikG
+;uTbo;Zp&u;,MQ9L&HZ&K)^E%IfOrsIK+]oHNe_@H$FOWrcSBdF)l=#EW'hTD#eDJC]A2fAn#4X
+@UaV:J;&_oDJs'!C2@a(Ci436FT$@aG?eGQ?M7_.?<plDra5\Ms*"j0NM:E3Df'?-BOtZP@1QaS
+DJa6+J;&K#A5uW/<E8`lq,@;m#?-D5LkphAM"jsA;u0Di;u9Pm;u'>f;u]hpMu$?M;uT\p;$Bip
+:Jju<r."Ej!.jrtqh+Zss-3MH!gJn4pll#KP`q;qP`q:0P5pjFPQ$aFPQ$aCPPULDPQ$L:MY;u*
+Mu\e8MZ&A5MMmGiN<#=9R/`TPR/NEYR$X/*QBdc$Q2HmGPPp[5OoLREOoE<#`lJ)"s2b8`rQ>8d
+c-?44s3C\lr6bPms3pqrs4./#rR_)%rn7;)s4dS/rS@M1!8mb5s5<t;ro=%>s5j7B!pAe2rojLL
+lg+Q:!q#FDrpTmV!:g$Y!qZ'VrUp3as7cKerqZTjqtp?ir;H6dJcC<$df4g~>
+JcC<$JcC<$pAa[^r;HTlqYU9grqZKes7cQer:U*^s7?3[s7--YrU9dSs6]dOs6Bbh=&rE$=T;M*
+=BSf)=T;S(;?'Mu;,U:j;c6Nm;>sGp;;9k)gAfh+f`'JHf%&=#eC2mpdF$=ecd'h\bfe2PaiMQD
+`l5p8_ns:,^qWnG<r>tp<;]Yq<)`ZnrDN\qr`&qsrDNVlq,%)M"Z/)$5X%F349%;C3&O,ur_`kt
+;GpFkr\XX2s#(KS4?Yhi4$5Yg4?>Mb4%)V18P/nPqF:]X7R]d77/fOY6pj:.6:4(+r]piU5<_7o
+4$>bi3rD,=3rM)=3r_Vh6q0dA5<_4o4u4uP6:F=57R]a87n,s<85;oU:/1[^'22+o9hnM[:ejb]
+9h\5T9hS;Z:&[p);FX/H7Rfg76pj:.6:4*u2)R9U5<h>%r]L3Dq)eX=rAsg9r]:'Yr`/u!pc\C7
+!^/_3r]^<Es#^?H5<ej*"$A_155@G=4p4nd<E)ro5Q*kI5Q<tP5sdk&5sb$>r)<et;GpFlrD`eq
+pf.,ks&B&"r`'D.=&r=$<``=&=&r:"<rQ+s<<#ku<*!'!<V9Am<W6(r<rZ8!<rZ8#=S#Vo=T2J%
+=9)7t;ts8i;>sAl:\d`c:]=,h:]=)j:Jame:]=,W:]F5k:]A<6`lJ)"s2b8`rQ>8dc-?44s3C\l
+r6bPms3pqrs4./#rR_)%rn7;)s4dS/rS@M1!8mb5s5<t;ro=%>s5j7B!pAe2rojLLlg+Q:!q#FD
+rpTmV!:g$Y!qZ'VrUp3as7cKerqZTjqtp?ir;H6dJcC<$df4g~>
+JcC<$JcC<$pAa^_r;HTlqYU9grqZKes7cNdrUp3_s7?3[s7--YrU9dSs6]dO#4(R>\@/lVr3u^6
+#.1\@ZEga?ricBurh]Xn"fA,lVPg?kVYm=og=b03rmq5&e^aZK!RoKrd2C<WcHa\Ybfe2PaiMQD
+`l5p8_ns:,^q[XMqNq#DpQY`Cr0%,DqiUl>s,m>C!0@&<)NSK@@qB2KVPTuZR[9>(O,SmLJW-(g
+VPU2grhT[EIXh?'s'Pe4#@CeD?sR&EGPn]HYc[o-s/l=&"KJDtUndp`rh0CdTqD=S#Fh-LR$X/(
+Q2ZsPOcYWbNf/jTrJM_P^m^@TS[*0MDJsH2K8#&9MN!U.AnPdmBObO`ARtOKr+H%C!G?-GB_c<?
+B)cKIAnYgiAnM$Us'ldQ@uH8hKnP)0I<]p_MNEdZO+;VGP5A\e@f9g7@L-CM@&pB1Wi<#n@.mt-
+?ij\A?N"10?N4=2?N+71?N+41?MRn,?Me(0?N.81YlS$4r*95,r`fS3>[:T>rEK5dr0R;Jqj@e[
+S"-">SXc1>SXo_Nrgj)0!QDtU_Z.FQ_Sc5es24lRs24cO!5ncPrPANNrk\NL!5n`RoqqAZrMKLj
+or.o5oZI9Zc2Graci;8oc-FVZc-6./s2bAaa2c4!`ULhF`W*mV`W*pXa8X0[aoBN_bQ#cdc2Grf
+ci;AjdJqYpe,7_qec45!fDjM'g&9V+gYCT_h#cHjhu;R6iW%p:ir\<'jo4BDkNM./klU/9li-5P
+mI'EAmfN"Knc&+ZoDeI^p&Facp\agdq>U6fqu-HkrUTr=s+14!s*t~>
+JcC<$JcC<$pAa^_r;HTlqYU9grqZKes7cNdrUp3_s7?3[s7--YrU9dSs6]dO#4(R>OcY]gr/pr>
+s,[&;re(3's+:E*KS>-ZK`6]*KEKr]g"?;U!nPoPrmUttdf.W2d*L"_c-4DTbK@rJaN)<>`Pf[2
+_SO%&^\NBZIf"WpIfFiaI//-dHN$qE<%36BH[9mYEcH&8B4badD0^M]JqAW+K7mZB@T-9+;cQdq
+;cH[p;H$G%rIt*#&V>RbIt)oqI!pEjI=$<gH?jc7GQ2giF`MMBEcCtqs(qdSD>\2pCMfA]F*N"c
+@q/tW@:F(kE,p#BG@+]b?XI5L?=@8L@:<MNraGe6!+Gb6s'Yt<@:K.CraH"=@UW\SrF#P3#@LtI
+@!QskE;j_`C1h*oF*2SIF_tr=FSJi2;uKZ!LPUbALPY_)oMbTar)<JlrDWMiqc!Jnr/:DLr_rbn
+s%rqt;,:"c;>u(<J,k/qK)L>sKEHpnPa)02"I,+6Pa2*0!L8oKP6-u4P5^XFPl6gEP5gaFP5LO@
+Pl-I9MYE&/N;JP4MZ&A5MMmGjNW5@9R/`TQR/E?XR$X,*Q^3r&Q2HmGPPp[6OoCOD`;dgV`W4'Y
+aT'B^b5TTabQ,odcMu5jd/DAldf7eoeGn)!f)=5#f`0Y'g&g$ah#6%1hV[5ii;_d9ir7s>jQ5M&
+joX`0kl0fJlKdd8liQSBmf)YVnF?&Jo)J=]o`"O`pAambq#C0hqYU0gr;HTbrdk*#s3q!u~>
+JcC<$JcC<$pAa^_r;HTlqYU9grqZKes7cNdrUp3_s7?3[s7--YrU9dSs6]dO"mbI=<`N2s=9)M%
+=92Q.r`T4tr_`ns;c6Ol;Z9Pm;ZBSrg=b03rmq5&e^aZK!RoKrd2C<WcHa\Ybfe2PaiMQD`l5p8
+_ns:,^q[WaqH!Mor)E/as&B"u!E<"s;Z9Pj:a7nY2Dd6T5<_7n4$#A\2`*?I1-\H+;Gg@k;,^@K
+2E!]^4[&d,$U$U73]fGb5=nC;8cD9[8,l-[7g2=N77K[5r^6]Rr^-ZOr^-WNs$$ZP4?Ybh55dSF
+5!;%+3W_E:5Q3h\5=eIC:/+MQ77Kd;7Rp*G9h\5U9`7]d9`@cd:&n)g:B+,g:]O8`:]sQj:JOX^
+:B+,h:&[oi:eaje8.A$V779^=91hiM8Ou$/q`Fj?rAsg9rAjpXr`/u!pc\C7"[,%65<_:14o[VH
+5!M4nq)ngB4[)(*5Q!_F56*nH<W?%p5Q3qI5Q<tQ5sdk&5X@^,;uT_r;uKVo;u]eu;c6Qh;ug"t
+<rQ,!<rZ2"<sr&/<E<1%<``@%<EB*!rD`bp!`W3$r`/Ymr)`_qpfIGso2kros&o;&s&/eopeq)g
+r_NSjpeL`_s%`Sis%r\jr_DoXr_WX5s2G#X!6>)[s2k;`rlb>c!6tJfs3L_lrR(Yns3pnqs4./#
+rR_)%s4RA)!o)McrS7P3hr"Fks5F";ro4(@jlQL(!pAe2rojLLlg+Q:!q#FDrpKpXnaZVLs7?9_
+rq6<bs7cHds7uZjqtp?irVc<dJcC<$e,Op~>
+JcC<$JcC<$p]'g`r;HTlqYU9grqZKes7cNdrUp3_s7?3[s7--YrU9dS!:BaOs6K^M!U7&l\,Ec8
+ZiIH0Z2_'-Y5kBtV$3`pVkp2crhodnr20PIrn%2$!7h(u!RoKrd/hV?rlt\lbfe2Pao9?ia2Z*;
+`5BI/_8*h#^&=5sQhQg>PlR'HP5:==OT1C>NZ)J=ARq:-VPKoXS!]M*OGnsLIX?EeG+5#!V>d@l
+V>FR%?XR5K?2e.1P5_]fYcb,-Y5YO-X/`(oUna^`UA^c4St):>R[9G/Q^!_tP*;#jO,f6ZN/sBp
+O-lHG\rW"oGC>'[Ci*haBa&'\AnPairb;CF$#+'cC2.HsBP;,WC(=oiBkhF"CMRa%Chmj'C]8,M
+C]%rEC]A2YBl%HrBkhEsAn>Ocrb2=E!fV54raZIcF)l28NJt9YU7#M$@f9g7@L-CM@&pB1Wi<#n
+@.mt-?ij\A?N"10?N4=1?N4=2?N+41?MRn,?Me(0?N.81YlS$4r*95,r`fS3>[:T>rEB8,rg*JK
+r0R\VR[TY4R[a5FrgNtZSXoYL"N\X(`5DPj!l;akqSN9M!5e`QrPJTPrPJNLs2+`Ns2+fR!lW's
+ntu&WrhfOipo+57s2suW!R/gecMPohcHji9cMu,hbl,ZfaiMQD`lA"snAGLL_SX4/`;[^W`lH.!
+a9'K+b5KKbbg"E2cMu5jd/DAldf7epeGn)!f)=5#f`0Y'g&g$ah#?.0hZ)L4hu_lsir7s>jQ5M&
+joX`0kl0fJlKdd8liHMArU0gWnaZVLs766_rUp3as7cKerqZTjqtp?ir;H6dJcC<$e,Op~>
+JcC<$JcC<$p]'g`r;HTlqYU9grqZKes7cNdrUp3_s7?3[s7--YrU9dS!:BaOs6K^M!U5^FOo:@E
+O-#HaO84e9NW"M0K`?Z/JqJ`1KnP-XK`QkZrn%2$!7h(u!RoKrd/hV?rlt\lbfe2Pao9?ia2Z*;
+`5BI/_8*h#^&3BPIK4f`I/J?fH5T^^<E40hH[9p[F`VP@CM7?k@U<;E>BtOIrIP-(KN1tM;uoot
+r)3Yo;KDbjqh+p#s+13"#(CuJIXQTlrd4Zk!."Qg"F#$4FE@G$s)/$ZDf'?/rbW*gG&heQLPK_b
+@V0@mA,]p9?NFJ?r*]M4s'c+>@UinYraGk;r+$"CA7K1]AS1pQ$=m^ZB4baeAnGUbrac:DA7K+[
+A7kdN#%M1Q@UiqYqI'Y;H=gMk?=%AXra>tICkRUlGlC\<;uKZ!L5:Y@LPY_)oMbTaqc!DlrDWMi
+qc!Jns,-r;Mi7F0r_rbns%rtu;,:"c;,[7@!.Xrt!.jlrrIap!s+LN?Pa)02rfdJJPa2*0!L8oK
+P6-u4P5^XFPl6gEP5gaEP5^[DPkp=<MZ8P3MXQK&MZ/J4M?/WorJgcBnsKHFrL!POrg<\Os-E\M
+r075Fr0$Q3"d6a>_o0Lm`<+'"a8X-]ai_d)b6#o4c2Grfci;AjdJqYpe,@erec45!fDjM'g&9V+
+gYCT`h>c@3hu;O8iSrkrir\<'jo4BDkNM./klU/9li-5OmI'rA!q>aMrpp*\!;-6_s7ZKerV6Bf
+s8)WirVZTloDX=@JcF4!J,~>
+JcC<$JcC<$p]'g`r;HTlqYU9grqZKes7cNdrUp3_s7?3[s7--YrU9dS!:BaOs6K^M"R/oe='5H'
+qH3c#"^5&3=BJZ(;>sH!;,^@k;c6Lj;>jAn;:tm"s4.2#rmUttdf.Vpd*M^:"jP97bK@s+a:-,/
+`Pod5_SX.)^V@J[<r#_q<:!N`<;okt<;f_p;>a6'2`<NO4[2.o4?P\c3Ar`P1c$lc0+0C+92\Vc
+;c-Ik5!Am-s#pBE$9C:33]f`#8P)HErC?lYs%!&W!_,RGrBpTQrBpTOr]pQL5lNnG4odbF4;pCG
+4#&ra5!;(o5;G#^6UaI>9MJ5V92/,U9`7`b9a"3c:/4O^:B45g;?'Jm;>sDl;#sKjqG7i$:/=\`
+:f1%c:Jjqc:esnb;G^0g;#a>k:)-K!;,0tX9heAV779I/6o6_a5<_7mrAsg9rAjpXr`/u!pc\C7
+"$Jh45Q*bM4Zkhi5<_4*4Tdf05!Jd,r'(-F!'^B^s&AhZr]pHIs$-fT6:!k%5s[j6;ZK_k;uKVl
+;uTYp;u'Dm=8Z+u<W?)+<E<1&<`N.$='#<%!`W0#r`/nrr_iku<`]0!r)No"<`iK%=8Q%l=8l=n
+=8uD&=oVV(;?'Pm;ts8i;>sAl:]*rg9htO\s%WPir_WVjrD)fW"]3(Q_o0Lm`<+'"a8X-]ai_d)
+b6#o4c2Grfci;AjdJqYpe,@erec45!fDjM'g&9V+gYCT`h>c@3hu;O8iSrkrir\<'jo4BDkNM./
+klU/9li-5OmI'rA!q>aMrpp*\!;-6_s7ZKerV6Bfs8)WirVZTloDX=@JcF4!J,~>
+JcC<$JcC<$q#Bm`r;HTlqYU9gs7uTfrqHHdrUp3_s7?3[s7--YrU0gUmHsl=s6K^Ms69KjrjDd4
+!4)O-rilF+s/lF*Unn!ds/>pn"K&)pVPa6gs4.2#rmV>)daHOjd*U+acHXT4b8&1AaN2EA`Pod5
+_SX.)^V@Lr]U"hJop5N@rKIAKP`u$.rK6r<rf@)>+_>1q@pu:4V4jNNR?s,"NJWC?IscTeG'A.]
+R[p=PV5C0iV#Xj$?jU1H?X6uZY-G79r3$(%#ct)+Vkp2bUSIg_rh0@eTDk;[Rf/U.Q^!YqP*1rg
+Nf/a_Nha>!OHb*CItNN:O)8lLAn5OdB4u!mBkV6rBkh<pBl%U#CMs,i$>s]uDJsH4DfBZ5rbhpZ
+E,fo<rGqjV!cW'rrbhaTs).mVrc&-\E,BE0DJ];f$#FHqChm^!CMRV_C(k5lA7]@bMh6>"F)Gf3
+NO>CQ@q5FG#[q+KX/rD'WN,`$p0S/7?XI,G?!U]@?=*V:s'G_2s'G\1!+,J,s'GS0!+,Z1s02T.
+>Pqb)?2n.4?!LZ?>l@n,>lU,gQi39ORJ`KRS,AfUS,SrXSc>;]T*Cn/aN)??_u%:N_u@LQ_>_=O
+_Z7RQ_u7IP_u7IN_>hCO_>hCO_tp51V>-qZVuERiVtm:kaoBNUb6#o4c2Greci)/hci;;iblGrd
+b5TKaaN)=!`UUkI^qp#e!lMsprl"rYa2e2#s2b8`rQG5bs3:Mfs3L_lrR(Yns3pqrs4./#rn%2&
+s4RD*s4dS/rn[V2!8me6s5<t;ro=%>!9O4B!pAe2rojIKli-8Nm/ZSRn,MkWnbr"[oCV\Ro`Fj]
+p\agdq>U6fqu-HkrUTr=s+14"s*t~>
+JcC<$JcC<$q#Bm`r;HTlqYU9gs7uTfrqHHdrUp3_s7?3[s7--YrU0gUmHsl=s6K^Ms69KD#*4k,
+O-#Haq2YH6!0$l/re19'"GDJ_KS9;Xs+LF'!7h(u$e*PPdF$=fcd'h\bl5cub/q`Ga2Z*;`5BI/
+_8*h#^:h2XJ+S3iIJ/'fIJeKjHiA?kGlUnE<#JS^H[C'_G'%bDDJ<cr@piVK>?Y68@X3<QrIY'%
+!JFGN;[HE$;,LYPKnY25rIb-%s+13"#(CrJIXZZmrd4Zk!dT$8rceBb"*AR'E;a_TDA-`$GB/(g
+LM_!ECM[j-G'@D*?=3V<"CbbI@:T:G"CktRARtdO"Cu(UB4h-V"D;=ZBkdHX!blC_rFu7Erb2LK
+BkV0orb)4D$tj9eAnPgkB4b[dAnCsP!b,_OraQUN@:<PP@:*DeDJE`m@:3M\KR8(C;uKYqLAlu0
+LPY_)oMb]d!Dubk;uBVn;u'>g;uTbrMZSiqMu$?M;uT\n;?'Jm;?'PmJH(,uJH(2qK)L>tK`6Z-
+Q^3l#rfd8E!1!DF"dP=9PE_=0P5pjGPQ$aEPQ$aDP5pjDMuJV5M>`>#Mu/A7M2I4LN;eh8QgpIC
+RJiKQRJWBOQi<<NQ2HmHPPgU6OTE86rk\`S`5MYo!li:$rlG,]!6Y8`s31MfrQbGhs3U_ls3gqr
+rRCkts472$s4IA)rn@D,s4mV0s5!b5ro!h8!94"<s5X1AroO:Fkii$1!UB"Mm/QGQmf)\Tn,W"W
+ncJFTo_nFap@n=Zq#C0hqYU0gr;HTbrdk*#s4%(!~>
+JcC<$JcC<$q#Bm`r;HTlqYU9gs7uTfrqHHdrUp3_s7?3[s7--YrU0gUmHsl=s6K^Ms60Mar`92&
+='/Q&=Sl5$=T)>";>jDl;u]bq;>jDm;?,2Iec+&+e'c[ldEp7dcHa\YrlYqsaiMQD`l5p8_ns:,
+^q[Xu]tF;Eq,IDolr3p`s&K(ur_j_5;,L.d2`ETO1I+/g5!:th3]T/W1G^d@0/*;W$S=)*9N"_c
+;c-Ik;Z8cd4$5Yg3]]Jr8P)HErC?lYs%!&W!(QcP"@GLC5skQ:"[G::5!(h&4<6%;5X%Cs4>\oa
+7n#j984uKG9MSAY9hS5W9heDZr_<nq:f1(c;,0n_:f("c;#O/l;,U:hr_EYk9MJ5TrCmDg92&&S
+rD*Gk;Z0Jm;ZBT!:f:.g;,U7grD3et:f("e;,C%b:]=*!9MSAZ7R]^56:+'s5<_@03W1u=<;ont
+<qniQ49I`15<o*1#<b134[2+m4Sh2C4?Yklq*4d@s$$KIr`/ttqEOpDs$-NKr^$QLs$6ZP62aa^
+;Z0Mo;Z0Po;Z'Jl;ZB\l<!$*%=8Z+u<W?)+<E<.%<`N.$='#<%!`W0#r`/nrs&/nsr`9"ur)Wi!
+r`K)"qc<Dls&ekor`K2'"B\Mu;H!Ekq,72hrD3Pk:/:a^!)EAds%WPir_WVjrD)iX!PlPN_?.Wn
+`;[^W`lH.!aT'?^b5KN`bl>rdcMu5jd/DAldf7epeGn)!f)F;$f`0Y(gAfq-h#?.0h>lI4i;_a9
+ir8!<j8e<@joX`0kl0fIlKeH9s6TgSrpTmV!:g$Y!qZ'VrUg6cp\4U\s7uZjqtp?irVc<dJcC<$
+eGk%~>
+JcC<$JcC<$q#Bm`rVc]mqYU9grqZKes7cQerUp3_s7?3[s7--YrU0gUmHsl=s6B[MrTX?j!4Dg5
+!4)L,rilF+rN67)XJDZkV>mIrVPU)crhodnr29PDs3gtrrm:bnci22nc-4ASb/sY(%`cT.`Pf[2
+_SO%&^V7CorfmMKQ1pUAQ2?gDP5UO@OT1@AOT(:dARo@`W2?DcTUVF<Q^!VjM2$S0I!U!\Fb#$o
+J:NiRV5C)dVuEM!?=7)G?Y>q7Z*=//s/cC)X/W#rV#R4iU+W47TqJ*NS=H(;R[BM1Q^*bsPEV/^
+^QFnTZ&b&pJ;&rDWebA#BP1siB4tsmBDuTTC27R"DJjB1DfBZ6E,]grErU+WEW:%[FE@G's)nZi
+F`VVEF*;\JrGr!]FoHIcEccDEFoHI_ErL1[F8p7\EW1"XE?B4=E,KT4D/=*+C27NtDJa*&An5Xi
+AqGANDf(Sr[ANq4"(>SFX8]4#Wq]uq?OC1J?X@&E?!LZA?N+71?N4=2?N+41?MRn,?N+:=?=.&G
+?*^c@Z<LQ2>l@t)>l@n+>QC)gQiEHPRJrWTS,So\SXc4>S,SrXSc>;[TE!"9aN)??_u%:N_u@OQ
+_#qQl_nuAirPJTPrPJNL!5e]Ns2"c4r2'IjoVV8YrMKFhql'J8s2suW!R/gdcMu5gcMu5jcMl&g
+bPoZ`aTBQ(`r3mI`;dRQ^qp#e!lMsprl+oW!6>&Z!m/U-rQG5bs3:Pgs3L_lrR(Yns3pqrs4./#
+rn%2&s4RD*s4[P/rS7P3hr"Fk!TE&;j8\0?jo4BIkNM-ol0@R"rp9[P!:KjT!q>aMrpp*\s7H<`
+s7ZKerV6Bfs8)WirVZWmo)=4?JcF7"J,~>
+JcC<$JcC<$q#Bm`rVc]mqYU9grqZKes7cQerUp3_s7?3[s7--YrU0gUmHsl=s6B[MrTX?D!KW9<
+O8=n7N<+urrIb*&s+:?(KDpT)K`6]*K`9L$df@hqd/hV?rlt\lbfe2Pao9?ka2Z*;`5BI/_8*h#
+^:h2YJ+A$gIJ&!eIJeKmHiJBlHiA=?<`N*uIXHKgH$"1NEc5f.BP(d_?<pc>=^kiM@UaA'JqJZ,
+K7\`/<)`co!`sZ$re16&!.t3$s*k6$I!pHmI!u!@rd"NgrceBb"E\[(E,kkq&8ISRGBngXDJF!,
+G'Amg?XE_>!b,PFra?"A@V'([ARtaN!+u+@"DDF]Bl!]_!,24Ds(_XMC]8&LCM`i_!GlQLC'&*a
+CAqoKCMIV`B`i$_BPI<V!bZ1ZralLKA7T7_A7K+Y@:9(A$XdjcA78k_Ck[=:;uKYqLAm#/L\Oj@
+;uKSp;,[6hr)EVnq,7)grDWlWN/NYk;Z0Pn;Z0Jm;#aDl;Z)"GJ:W:HK)L>tK`-T-QC!o%Pl?mE
+PQ7!FPQd>:PEV5qr0%,FrKI5Ds-*DEs-!G?r/1Q4repc5s,$Z2mu."!"cJ>!NL6+3QfOP6Qi<<N
+Q2HmHPPgU7OoN/s^qp#e!lMsprl+oW!6>&Z!m/U-rQG5bs3:Pgs3L_lrR(Yns3pqrs4./#rn%2&
+s4RD*s4[P/rS7P3hr"Fk!TE&;j8\0?jo4BIkNM-ol0@R"rp9[P!:KjT!q>aMrpp*\s7H<`s7ZKe
+rV6Bfs8)WirVZWmo)=4?JcF7"J,~>
+JcC<$JcC<$q#Bm`rVc]mqYU9grqZKes7cQerUp3_s7?3[s7--YrU0gUmHsl=s6B[MrTX>`s&K5'
+=BAT'=Su;%=T);&=BAQ%;>sH!;,^@k;c6Lj;>sJn;?#)Fdf@hqd/hV?rlt\lbfe2Pao9?na2Z*;
+`5BI/_8*h#^:h0Z<`\rp!*&;`!*&qts&B"s!*&qq'/qg-1I")f5!1ng3B9#W1c7'E1&W^C/MT"8
+1,26l;,U7i;Gg@j5!:qg4?Q&(8OuGK8,bpW7eoFT6UF+*6N0:N5lX&+4Zb_f4Zkf$4[)"m0f2?g
+7Rp!D:/"GX9MA2T:/=\\:JOY^:/+P^;,Bt]:f1(c:/+P[;,I6f"Ar&o:f.*dqbRDk:/=\`rD3Pj
+:JUmcr(dMn;,9q`;G[9h#Z+8o:f(%d:f@6hs&8qps&/ko'MqS#:esn_:JX\S6UX:/2)[W^3B@%!
+!*&qts&SnXpcJXA5!M:14pO554?Ynm4?WI'"$A_155@G@56!kI56"U`<)rcZrBU?Hs$6TMs$6TM
+!^]1<r)3Pnr_iMirDNYoq,IAps&],!rD`l!<W,r!<EB$!"'/B$<rQ+t<<#ku<*!&u<W?+u=8uD!
+=8Q%l=8uCo=8uD&=oD4t;Z'Jh;ZBVl:]X?er(R/dqG7,d!)NSjs%iSgnPB2"!PlPN_?.Wn`;[aU
+`W4'Xa9'K+b5KN`bl>recMu5jd/DAldf7epeGn)!f)F;$f`0Y(gAfn-h#6%1hV[5ihuVfrro=%>
+!9O4B#Nt=7l07Kuli-8Nm/ZSRmfN"Knc&+ZoDeI^p&Facp\jmdq>^<gqu-HkrUTr=s+14"s*t~>
+JcC<$JcC<$q>^!ar;HTlqtpBhrqZKes7cQer:U*^!;$0[s7--YrpTmTs6]dO!pf.:rTORNkI%\'
+ZEg_5Z2V!,YPkU(Xo>@%T;;I_!iDoprhTUlrhfanr20VGe'e6C!RT0lc2l26rlZ"uaiMQD`l5p8
+_ns:,^q[Xu]tD"irfdDJp6G`EQMZsGPl?mHP5ULCOSOt;AJSfcVkg,_Ssl(5PECi^L4t,(I!Bm[
+GlE<pJ.d<\I#=D_VPU2eVPU+q@[F@(YPbR'XVIq<WMcShUna]ZU8+ESTqS*KS=>t9rg=XjQBm\r
+V4!C7V7r.>ItiiAMJ?g>BP1mjB`;WKBkh?sCi4+hD[:<&F)l;@E,fmrEY3D9G'.tOGBe@XH?jg_
+G^+L[qKr-f%!m2CGBeCXG^"@TG'3_+!-S3_rcS3^.<T`RFE;JAEcH,@Ec>r9DJsE2Df0?+CiF0%
+Anl%?J9GmNCQ<1F?sp&7XT,<q@.mq7?sd8I?<pf@?!^k8>mF\A?=$oB?!d>4s'G\3$=7(H?<skB
+Z*IS<r*92+qcs&'r`fS1Q^=),rL*\S!1WtXrgj%Ys.'7`SXuGOT)d%5aTKW)a2Ihk!5ncP"i8'n
+_ns:i_u7FP_u.CI_>U51VZ!@eVZ*LlVY[4iVuWaoVY[4jW;`[pb5KH^b4EdVbl#cdchu)gci;;j
+bll86bKA!,aTBQ(`r3mK_u[QcrkAKL_>_=O_Z7XS`W*sXa8X0[aoBN_bQ#fdc2Grfci;AjdJqYp
+e,Iksec45"fDjM'g&B_*gAp%.h>c=3hu;O8iSrkrirS6&roOIKkih9qlK[^7liQSBmf)YVnF?&J
+o)J:]o_nI_pAamcq#C0hqYU0gr;HTcrdk*#s4%(!~>
+JcC<$JcC<$q>^!ar;HTlqtpBhrqZKes7cQer:U*^!;$0[s7--YrpTmTs6]dO!pf.:rTOCIkE#V&
+"-8J'O8=n7N<G2uMMcr_KDpQ'K)gT(K`Hf)K`d"Xe'e6C!RT0lc2l26rlZ"uaiMQD`l5p8_ns:,
+^q[Xu]tD"imsY7bmX5"\rHeKE&l_eXH@'p[FE;G@DJ<ctA7AkPrEK;3!+c(;"_1nTH$Y,AJd6p]
+;,h[lKS98Us+1K,J:E&sI!pJCIK+ZoHN/9jGlDpdFV]";EH5iDG&hkXMJd-EDfg/G@:3GM@/XO6
+@f0a@ARo=`BP1uVBEDm_CAqoYCMIX#C27R"Ci!m'C27R"D#J5NDZ=PMD$+ZmCi0&c%;T]nCM[d%
+Ci+!)CMIV`CB/)IC'&*aCAhfOBkV0mBP1piAH$-SA7]7\@UW\Q@<ud'@U`__?XHc3LAm#/L\Oj@
+;uKSp;,[3grD`_oq,7)grDWlWN/NYk;Z0Pn;Z0Jm;#aDk;ZD7HJ,k/qK)L?#K`?c+K`-W)QN*9Q
+Q'7I3PPgXFQ26^KQ'@JrPa(p+s-!AFrf[5;s,6i5s,6i5!/^Q0rep]3pl#$,rJLZ7rg<YNjI#t6
+s-E\M!LB#LPlHsFP4Xk;]tXK\!PlPN_Z.LR`;[aU`rF*YaT'B^b5TTabl>rdcMu5jd/DAldf7eq
+eGn)!f)F;$f`0Y(gAfn-h#?.0h>lI4hu_lsir7s=jQ6C'#Nt=7l07Kuli-5PmI'EAmfN"Knc&+Z
+o)SF]p&Facp\jmeq>U6fqu-HkrU^#>s+14"s*t~>
+JcC<$JcC<$q>^!ar;HTlqtpBhrqZKes7cQer:U*^!;$0[s7--YrpTmTs6]dO!pf.:rTO@HkP\H]
+=8uD&=Thi0=]ef*=8uA&=8l5#;#O8j;Z9Sp<;obq;>jAp;:O(Crm:bnci22jc-611'["P=aN)<>
+`Pf[2_SO%&^V7Co]Y!i:!*&Vir)EVns&B"ur`&hps#1?D1dF5h4?GSb3B&lSr\OR/r%8gA0etL=
+1GpsR9M88\;c6Ik;ER!.8OuEDrC7)^84Q-=77B]B7/fRQ6N07\69me#5<M"\69[Oq5!Ln'72/6_
+9h\8S:/">U:/=VZ:JXe^9i"F[:^9`k:JFSY:/:X]"&Vfg:]4&g:]F/k:esja:]!ug:]=,d:^Bon
+:JOY];,:$e;>sDk:Bs]k:Jaqb;c3Kk"Ahuo;,I0g#uOJp:esq`:/==X6j?"96p`pq<;ont<qniQ
+49I`15<o*1"[+t14[2./4T%>E4?Yklq*4d@s$-NIs&B)!<VerY5lO"J5lX.M5lX.M6N9=N;ZB\o
+;YX2i;ZB\k<;fht=8Q%s<<6-#rDir!<r?#"<`T-"!*/qrs&/u!<`]3"s&f8%!*JDcr`Jhpr)`qs
+rDESmr)<Dhs&&\j!DcJg9`Rr_:]=2j:]4&[:BA/CrkAKL_>_=O_Z7XS`W*sXa8X0[aoBN_bQ#fd
+c2Grfci;AjdJqYpe,Iksec45"fDjM'g&B_*gAp%.h>c=3hu;O8iSrkrirS6&roOIKkih9qlK[^7
+liQSBmf)YVnF?&Jo)J:]o_nI_pAamcq#C0hqYU0gr;HTcrdk*#s4%(!~>
+JcC<$JcC<$qu?0br;HTlqYU9gs7uTfs7cNdrUp3_s7?6\s7--YrU0gUmHsl=!pf.:rosIHs5s`q
+ZEga>Z*:I;Yd",1r3$($rMp!$Unn!d"fS>rV51!fVZ<UkVuP-ed*L%`cHXSWbKJ&MaN2EA`l5p8
+_ns:,^q[Xu]tD"i])IrnQ1gOAQ2HmGP5pdEOoLO@O"#BeA7T8LVPBiRR$X#!O,A[HJ:;omH$=F`
+It<0$IXc`mJU`6%S"6FQrhf[k!3Z=)!3Z='#ct),Vkp2bUSIg_s.KCc/>&K'S"#k7R$j;,QAClj
+T!sfGI"R67X,1P(C1h3pB5)$qBPVF$Ci40/E,tns!HW;\F9cr4GBeR`I!YO6s*FZis*F]lrd+Kh
+rd=Zk!.+Ke"aG<=H@'u;HPV!UG^+FVH$FRWF`hkNF`qqNG'.nIFT->(E-$&@EcH&<DJsK7E,K]:
+DeWm$B7tYPDf0B-BWS;8Wr?B&@.mq7?sd8I?!U]??!^k8?2\(2?!LY0?2n71?OC+H?X@$DZE^]>
+>Pqb)?2In)>Q.k0>?Y0srgEeT!1WtXrLF"]SXo\Mr1F#3rlG8`a2c-q_Z.OP_?Icm_o'@.rkn]O
+!5n`Or4rB/p8.P]s/5dlqPX=k!2odmqksFl"/j>bb5KH^b4EdVc2Greci)/gci;;jbmM\<bK@uL
+aiMNC`r3mL_umZc]tXK\!PlPN_Z.OR`;[^W`lH-uaT'?^b5KN`bl>rdcMu5jd/MGmdf7epe,n1O
+f)F;$fDsV'g'?BfgtgfChV\=j#N=\%j5]4]jo4BCkNMp0s69UMrp0[Qmf)\Tn,W"Xo)J=]o`"O`
+pAamcq#:*hqYU0gr;HTbrdk*#s4.."~>
+JcC<$JcC<$qu?0br;HTlqYU9gs7uTfs7cNdrUp3_s7?6\s7--YrU0gUmHsl=!pf.:rosIHs5sQG
+NK0'[O84h6N<"n7M?$QQKDpQ(K)pRVre1?*r.QAKdF$=ecd'h\bfn8Rb/q`Ga2Z-<`Pf[2_SO%&
+^V7Co]XtcRIfFihIK4f`I/eOBH<aHM<)e9nH?aOQEc>o1B4b^b?sd2E>?YNF@q/qU@UWVR@q9.r
+H\;9Ks+:<)r.G$$s+(N-It)loI=?QlI=(s>rcnKgrce?a&9;c1D00iFL2LpEDKBuYG$k5V&Rf-W
+@:EbX@q9+^AS,LcBP1uVBa\`mC27U$D/=*.DfGJir,)LOqecCNrbVOMqeZ(Fr,2OQrb`'[Ci!m(
+Chmg&CM`rb"_qgfCMIV^C&_icB4bgiAnG[gAnP[b@UWYODeNWi@:3JMLkphApf-larDNYmq,@5k
+"&i)r;u'>g;uK\qMueiqqGR8jrDNVl!)WYlqbdHFJbaorKD^DuL&RD<QN3<KPPpaGQ26^KQ'@Jr
+Pa(p+s-!AF!/^W2s,6i5s,6i5!/^Q0repZ2pl#'-rJL`FR$d]9k*Z+6rg!PLrfmDGr0$`8"2)=\
+^AbkJ^qp#es24lTrl"rYa2e/"s2b8`rQG5bs3:Mfs3L_lrmCbos3pqr!nGlQrn%2&!87>)#M\%h
+h;-rEhu;O=iSrkWj5f:_roO7Ekl0iHl2^/LliHMArpTmV!:g'Zs7?9_rq6<bs7cKerqZTjqtp?i
+rVc<dJcC<$ec1.~>
+JcC<$JcC<$qu?0br;HTlqYU9gs7uTfs7cNdrUp3_s7?6\s7--YrU0gUmHsl=!pf.:rosIHs6'A^
+s&]2%!a/W.rE'&$r`K2%!*9)#!(QoarDE\q;H*Qm!)`Yl-W/:=d*L%`cHXSWbKJ&MaN2EA`l5p8
+_ns:,^q[Xu]tD"i\l;X/<V]Vd;tj8j<W5rP;_0jd1c%?[5!1ke3B9#U2)I-F1+k14/hSq80ekF=
+1GUdE1Ggp\92\Vb;c-Ij;FpaV#Y7ET7n,s:6q-o>rBgQOrBV,^5X.Fq4[2+o5;P,c77]pC:/"DW
+r_=/(:/4V\9MS;X:/FSY:JOYY:JO\]r_<Yn:/=V]:f$LVr_WPhrD<Jhs%r\jr_NSjr_WJhs%i_l
+;>sB%;,:"c;,C+d;,L.d;,U6i;C#+=;,U7h;,:.h;,L4g;,U4c:esh\7n#d46pj=.<E3(#4Ztq)
+4nq,A4[)(prB:BJ4?Pbk55dVA4Tdc.4[&U*r'(-Fs$$H_!E<(q5Q*kH5Q="K5la1L62s:N5QF.L
+;YF#h;Z9Vo;ufqs<;]bs=8Q%t<VTVm<rl?%r`0#!r)E\p!*0#!s&T2&r`9)%k#_Oap/h2p!`Mup
+rDESmrDWJhs&&\j!DcJh:&du_:]F8j:]=,\:BS8C]tXK\!PlPN_Z.OR`;[^W`lH-uaT'?^b5KN`
+bl>rdcMu5jd/MGmdf7epe,n1Of)F;$fDsV'g'?BfgtgfChV\=j#N=\%j5]4]jo4BCkNMp0s69UM
+rp0[Qmf)\Tn,W"Xo)J=]o`"O`pAamcq#:*hqYU0gr;HTbrdk*#s4.."~>
+JcC<$JcC<$rVuBdqu-KkqYU9gs7uTfrqHHdrUp3_s7?3[!qGdLrU0gUmHso>s6K^MrosIH"R"q0
+ZEa;2"0\r4YPbR'XT5I%X8]+#=/;YkV#mQnW;`XlVZ<UlVZG/jrluM.bfe2Pb/q`Ga2Z*;`5BI/
+_8*h#^:h1l]=PP`rKR>IpQk]Aqiq,Es-!>Cs,d8A)gZ..ARq^:UnO6EQB[DhLk^J1I=-<bH$=dj
+Jc1*+IXcs!It<8[@%3\cV#dHkrh]Ur'!/.6W2?DeUSFWZU7n6QTqS'KrgNqWRJrR&NO>(HXL==@
+Ko;(OCM7KsB4u!lC27R$Ci"$,E,fi:EH6)@FEM_LH[bmBs*jurs*OioHMDjeHMr-hHN/?kHMr3h
+I/SBlHM`!fGQ<$eHN&6kI/SKlIf=a$H[0m]G'8+SGlDmdFWkjJEcZ8BEc?&>EH5u9E,p)CFE2A<
+Bl%L:Huj4EMmB@_oO%T(ra,q=?XI,F?!LW?ra,P/rE]P2>[7&0s'G_4s'G_4!FB(1Z2e,+>l@t)
+>l@n+>lRt2=^%5^R[a5Fs./tWqk*l1rlG8`a2c-q_Z.ON_>qLP_Z.OP_>qLO_Z.IPU\(DXVZ3Rl
+VY[4jW;idpVY[4iW;k'@b5KH^b4EdVc2Greci)/gci;;jblQ&3rlY8_"N\X(`lA"spVd*Ds1JBF
+!5AHI!l2Xgrk\`S`5MYos2P)ZrlG,]s2t;`s31Mfrm(Pis3U_l!n,QHrR:o!f%0iPs4@>)rn@D,
+!8RS0#N"@qi8ESQir7s=jQ6C'!U&\GklU/9li-5OmI'uBs6p$Yrpp*\!;-6_s7ZKerV6EgrqcNh
+rqu]moDX=@JcF:#J,~>
+JcC<$JcC<$rVuBdqu-KkqYU9gs7uTfrqHHdrUp3_s7?3[!qGdLrU0gUmHso>s6K^MrosIH"6\h/
+NV8D1N<+urqhbE2;>c(HK`-N'K`6Z*K`-T+K[A'Ec5b*QbKJ&NaiMQD`l5p8_ns:,^q[Xu]tD"i
+]",BKIJ/*iII)=_HX'VN<=aM*H?j[TEH#Z,B4k^`?XE_:"Bo8E@U]4E$=RIS@q9.L<I/tDrdt-%
+"GDAZJV!fN#Ch/LIXZZmIK"QnHN&1-G]n:SG'.qKBo@(\K8+;ZEHQJJ@UNMN?srtC&7]9^A7fFb
+AnPgjBP2!nC2Elb!H)oQErU.ZE;4AKD?+PND?+PQD#J5KD"qlFDZ=YTDZ4PSDYe;ODZ=SRC]/&U
+CMIX$C2.O!BkdEW'P1liBPM6nA7K(X@;]dh@Ua/,LPPk.mSj*_s&&SjrD`eq!E)kl;YsDk<;hdP
+;Z0Pm;ZBSp;Gd?iqbdGlJbaotKDL8tK`ID;QN*9OQ2HjEPlI$DPlHpJPa2!,s-!D=qMP<2n;@1&
+qhk0,r/1K3s-`nSq3U62rKmPMs-<SJrfd8CpQ>Kfs1JBF!5AHI!l2Xgrk\`S`5MYos2P)ZrlG,]
+s2t;`s31Mfrm(Pis3U_l!n,QHrR:o!f%0iPs4@>)rn@D,!8RS0#N"@qi8ESQir7s=jQ6C'!U&\G
+klU/9li-5OmI'uBs6p$Yrpp*\!;-6_s7ZKerV6EgrqcNhrqu]moDX=@JcF:#J,~>
+JcC<$JcC<$rVuBdqu-KkqYU9gs7uTfrqHHdrUp3_s7?3[!qGdLrU0gUmHso>s6K^MrosIH"R"q0
+<`]3$rE'&&rE'&$rE0#"r`0"gr)*Gkr_ierr_`_nrDE\od*M^:*6l^NbK@uLaN2EA`Pod5_SX.)
+^V@Lr]Y(kf\[gs'rD`_qr`&kss&9+P2`ETNr]^NJ4$#A]r\Y!<1,:L70.nn11B'!.1B'*02%)2s
+1c7H^92&5\;,dEk"@u!P7n3DFq*Yi_6pj=.5X@Y$5<hCc83K1%4Z*.-$:mic9M8)T:/+JYrCmPk
+:/+S\:JOYZr_EGg!DlYe:]X?gmSX!\r(m8fs%iVjr_NDfrD<Vo;,R0ds%iSiqG.Dp:esnb:fC1f
+;Z9Vp;$Tor:f(+g;,I6i#>n8m:ea\S7/fOV2Et5C4n1W84[/j0r]UKK4?Pbk5Q*_B4o[YE4o%>?
+56!kI55eLX5Q*kH5Q<tM5sdj962s:N5QX8<;Xm]c<;ons<<#ts<WH5!<rH%n<r5qu<W6#!<W#hr
+;u]nt=8uD&=8uCb=8uCq=8l>%;u]bo;?'Pm;ts8j;>j>k:B4/g9`Rr^:]F8j:]=,^:]J',]`5YF
+^AbkK^qmkd_?.Wn`;[aU`rF*YaT'B^b5KN`bl>recMu5jd/D>ndaQ\De,n1Of)F;$fDsV(gAfn-
+h#?+7hV[5Ki8NYSro4%?jo4BCkNMp0!p]+;rp0[Qmf)\Tn,W"Xo)J:]o_nI_pAamcq#C0hqYU0h
+r;?Nbrdk*#s4.."~>
+JcC<$JcC<$!<;Kdqu-KkqYU9grqZKes7cQerUp3_s7?3[!qGdLrU0gUmHso>s6K^MrojLJkNDj,
+#-kD:YHP17ric4%!j/Q*rN#ms%%MmEUnsobWMcViV5F6i!2f[ls3:Yibl5chb/q`Ga2\+t&B)K'
+_SO%&^V7Co]Xtbc\[_X'rg!,As-<GF!0dDFr/k3FH=pl%AWNacTUM77P`:QUJq/5rH?aUVK7\]*
+JUW)tI=H`sJ:W;[@UtS0Odr2DV5L2fV5:2kVkp2cUS=NXU7n9RU7n0LS=?":R@0D(PE20@Oa;\:
+O,RlPBF/BcCM[^$Ci400rc%mXs)\?cGC+i;JH(-!JGjutIfFfuI!^0cq0W*erH\Eh!IK4nHMr3h
+I/SEgH2i*mH$Xd^H$]F9s*XusI=?YDIJnQkI4BPgGB\1SGB\:SG'.kKFE;PFEH?2CDfK]6F`hkL
+EcH&5CM86ADfCVkU\8'n?N4@<?sd8I?!U]??2e1/?2e11?2n1)?2n72?iOI4?NFJ=rNc9)rE]G.
+!+#P.rEK8+s&oM->$@ElSG8]QTDm"4aoBE`a2Z'p_Z.ON_Z.OQ_Z.OP_>qLP_Z$;1V"CMJVY-kd
+W;k$?bQ#``aoBNUb5oi3rQbDgrQbGhrm(Pg!R/adb5]T`aT'9^`l5pk`!Eob]=Y_g]tM/Z^B23e
+_>_=O_Z7XR`W*pXa8O*ZaoBN^b6#o4c2GrfcN)>jdJqVpe,Iksec45"f*Bs]g"P07gYDea%,Tn!
+i8ESQioB([jQ6C'!U&\GklL)8rp0^RmdC)C!q>aMrpg-^o^r.Us7ZKerV6EgrqcNhrqu]moDX=@
+JcF:#J,~>
+JcC<$JcC<$!<;Kdqu-KkqYU9grqZKes7cQerUp3_s7?3[!qGdLrU0gUmHso>s6K^MrojLJkNDj,
+!KN08Nr+e:N/RUkrJ:Q&D#K"cK`6T(K`6Z*K`$Q(c2l26rlYJfaiMQD`r<pg`5BI/_8*h#^:h1l
+]=PP`\GL^KIf=c`HlZEl<E3"9I!^*\F)l26B4kaa?X@#C>$>HH@prhTr*o\9&7f9M<E+!sEI!.g
+JqAW,K7s5S#CUuJIXQTlIJnNlGli56GQ)apFDZ)=G_L$KDK9rE@UK(Bs'c[P@Urt[AS,OeBP2!n
+C27X$DJsN7noFbMs)@dPqJH:MqecCNrbVOMr+u.Fs).jR#]=R!DJjB2DJo>irGDUPrGDaTDJX0,
+rG;LL");UeCA_c^BPD'mAnPgmBk_6lAmo.VD.R3dD/4Q!mSj*_s&&SjrD`eq!E)kl;YsDk<;hdP
+;Z0Pm;ZBSp;Gd?iqbdGl;#,_<K_pK'Q2['NQ^3p6PQ$gHQ2-[DP6$o5plkE/s,6?'repQ/repf8
+!/pf5repfDs-`nSq3U93r0RGL!1!MI"-\t6PQ$a>OU/M/]=Y_g]tM/Z^B23e_>_=O_Z7XR`W*pX
+a8O*ZaoBN^b6#o4c2GrfcN)>jdJqVpe,Iksec45"f*Bs]g"P07gYDea%,Tn!i8ESQioB([jQ6C'
+!U&\GklL)8rp0^RmdC)C!q>aMrpg-^o^r.Us7ZKerV6EgrqcNhrqu]moDX=@JcF:#J,~>
+JcC<$JcC<$!<;Kdqu-KkqYU9grqZKes7cQerUp3_s7?3[!qGdLrU0gUmHso>s6K^MrojLJkNDj,
+s&K,$nlYfkrDiql9`7if;Z9Sp<;obq;>a>lc2l26rlYJfaiMQD`r<pg`5BI/_8*h#^:h1l]=PP`
+\GK1m;uK\j<>/=_2`ETO4$Pnk4$,J^2)I-F0e`GW#rF@j0JYC>1Gguf1__f34[);/6qgHU;,^@i
+;c6%R779T>6o.1u6pj:+5sRb%5;58b4[(\k77KgB9M8#Q9hnDX:/+DV9i"S]:/4MY:JOY\:Jjtc
+;,I3eohYZb;"%9];#=&e;#a>k;#O2i:]OAl;#O5m;Gg<f:]O;i;"d[&:eje];,C+e;G^1f:f1(d
+<)?Ii:fC4j;H*Qm$W0\r9he)F6UNai54Uf:4[/j0r]UKK4?Pbk5Q*_B4o[YE4o%>?56!kI55eI]
+5l3eE5lX(J5QX5<5lO(L6N04O6:!p.;u]hq<W?%t<W6&!=8Z+t<VTVm<rl?%r`0#!rD`_rrDs,(
+='&L+i)fq\r)`l"rDW_orDESmrDWJhs&&_k!`)QdrCm8ep.t]b"]%rk:JO[Y:C+MB]=Y_g]tM/Z
+^B23e_>_=O_Z7XR`W*pXa8O*ZaoBN^b6#o4c2GrfcN)>jdJqVpe,Iksec45"f*Bs]g"P07gYDea%
+,Tn!i8ESQioB([jQ6C'!U&\GklL)8rp0^RmdC)C!q>aMrpg-^o^r.Us7ZKerV6EgrqcNhrqu]mo
+DX=@JcF:#J,~>
+JcC<$JcC?%mJd"]rVZNhrqcWir:p<ds7ZB`!qc*UrUU!Y!:]sU!q,ICrp9[Ns6BUJ!pJh1roO7C
+YkbL#Xob`,XSf-uWrK%$W16qbV#I4iW;`XhVZtDibfe2Pao9?ra2Z*;`5BI/_8*h#^:h1l]=PP`
+\@;@#oToKArfmAFrK@,A/:)YUAn>MOUnO?JQ^!PgKS+`!G^"CWGCY6qK7JE#IXHWrItE6(?t*W/
+\$u@H"e2BdV5C-gV>m:mUnXTYrh1p<Tq.^DS"#h6@CM_sYdopFLQ%O9BPD-nB5)*rBk_="D/XE4
+E,p#BFa/@fKDgE%Jc1,uIfP#tJ,autIK+ZrH[:#7Hi89hH2i3jHieY@HMr3hI/\KgH2i*iH$]I8
+"F>EAH@,X=qgJBiqL/9hs*=loGB\4SF`m\,rcAusFE2GGEcQ)<FED\HEcGr3BnLYLDiBOEq-X),
+s'H%>?XI,F?!LW?ra,P/ra,V1s'5>)s'G_4s'G_4!FB(1ZMIi)?2n.0?2\%,>Q.n-=o__)>5auj
+SberST)d(6b5TN_a9'E%`;@FO_u%=N_u7FP_u@OQ_ZI]LUAgqfV"LSFVYR.iW;as>bQ#``aoBNU
+b5oi3rQbGhr6G>grm(Pg!R/adap?,3aiMNC`l5pm_uR=H\Hf^X]=bei]tXK\s1eWNrPAWR`5MYo
+s2P)ZrQ#&^b0'\+s3(JfrQbGh!7:\l!n,QHrm^tu!7q/$s4@>)rn7D-h#?+<hV[5Ki8NYSj5]4]
+jo4BCkNMp0!UB"Mlj)qGmdKW6nF?MKs766_rUp3as7cKes7uZjr;6HjrVc<dJcC<$f)L7~>
+JcC<$JcC?%mJd"]rVZNhrqcWir:p<ds7ZB`!qc*UrUU!Y!:]sU!q,ICrp9[Ns6BUJ!pJh1roO7C
+NVSV4N<+urqhk9-!IRcBKE$W'K)gT$Ka,fGbfe2Pao9?ra2Z*;`5BI/_8*h#^:h1l]=PP`\@;?`
+p4!$imsG.@?N*q8;gj";F`VSCChRBi?sHr?r`fA2(Lpo_@UWYR@UiqY@oZK,FGl$6Mi2n6KDgE%
+K*?[PIXHQlr-SHhs*,-!GBS.0Nco]#LMppHG'mb,@/aR;?t*VVA,^'>AcQNDBa&6fCMn05rc%pW
+rGhjX!c`7#pi?CSs)@dPq/-1LqecCNrbVOMr+u1Gs).gQ!cDppqel=Mr,)LOokjbHrbVUO!c)Xh
+rbMOK(hm_uBkh?rAnG^iBkh9nART"bAn#1cCO>PLr_ibnq,@5ks&/qr;u'>g;uK\oN;?HN;uKVo
+;#jMm;>X5m;,C*fK)UDtK`$Q'Q2['NQ^3p6PPp^GQ2-[DP6$o5qi_&:M>iD4M>E,0Mu\e*MZ8V/
+MZ8V6Mu\e7MZ8V6R/`TSR/**3R/E<NQ2m3IPlHsHP514?\Gj#D]">Se]Y2"mrkJKK!5\WN!lMsp
+rl+oWs2Y)Z!m/U-rQG5b!6tJfs3C\lrQt\pe'n<Gs4%,#rn%2&!87A*!ScE/h$i/thr*GOiSrnX
+jQ,G%joOZ/rojIKli-5UmI'E2n*oi:rpp*\!;-6_s7ZKerV6EgrqcQirVZWmo)=4?JcF=$J,~>
+JcC<$JcC?%mJd"]rVZNhrqcWir:p<ds7ZB`!qc*UrUU!Y!:]sU!q,ICrp9[Ns6BUJ!pJh1roO7C
+=7KDj=8u;$<W6#"91SnWs&/bnqGIOBbfn8Rb/sY((!">5`Pf[2_SO%&^V7Co]Xtbc\[]-G;XRK]
+<;KVp/.=Hq2)@K]4Zkee3&WYn1''!\r[nI.0ek@<0ekF>r\OU5r\P3N4Zu5.:/4JU8l8J`;H$Cj
+;>3I*6:=1-69mh%6:".,5!V:g6q0a>:/">U9hnGV9h\5T:f0n_:/+I^:'49i:f.'cs%r_m!)WYj
+qG@2hs%r_k!)W/^r_WJfrD<Mis%rYi"Ahrm:f.'e!`DlmqG7/fr_W8`s%rVhr_Oe6:Jatf;,^=g
+;Gg@i;GpFl;Gp=g;Gp=e;,'eU6:=1!2F$js!BiXG5Q3hM4Zkhi5!T!.r&k-E4$>b&5Q!_F5Q<qG
+<<,;]5Q*kI5Q3nK5skN9s$H]Ms$H`Oo2GZgs&B,"<E/lrr`0##r)WbrpK%5o!EN5!<WZ6$<W#ns
+=8uA&=8l=e=8uA&=8c2"=8l>"=8uD#;u]bo;?'Pm;ts8j;>j>k:]F2h9`Rr^:]4,i:]F2b:B7p(
+\Hf^X]=bei]tXK\s1eWNrPAWR`5MYos2P)ZrQ#&^b0'\+s3(JfrQbGh!7:\l!n,QHrm^tu!7q/$
+s4@>)rn7D-h#?+<hV[5Ki8NYSj5]4]jo4BCkNMp0!UB"Mlj)qGmdKW6nF?MKs766_rUp3as7cKe
+s7uZjr;6HjrVc<dJcC<$f)L7~>
+JcC<$JcC?%mJd%^r;?EgrqcWirV6Bds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'OI!pJh1roX7B
+!p$PfrN?7)Xo>I)XfSW$X8f4!WW/muVkos`V#R7qVl?VlV5C-hVZ<UnVuOs?ar8CCaN)<>`Pf^4
+_SX.)^V@Lr]Y(kf\[f5Z[el?^QN!0LPl6gEP5gXfH?jgLAn>POV4sTPQ^!SiL4t/)G]n4PJ:N6$
+IsuosIsq<G#D.M7@:N]0\,<`A[Bl<kVPU,dVuELmU\pf6T:MLBS"#gW@V21,OHbBRO-"6mCM7Bs
+BPVBuCMdm,DK9c=Fa&(ZJc13#KD^?$Jc1,uIfP#uJ,ausI0"_Brd+EfrHeEf"aYNCI!^2;Hi8?l
+HN8BiGm&A;H$FT3Gm&G?H?sr;I/SKiI/SKhI/J?jHN&+2G]n1PF`hkLFE;MBEccADE,]i;FE;G@
+CMniOE,KQNU\nKt?Mn.6?<piA>[@>8rE]D/s'5Y1>PMM(?3"@3?N4@9?<skBZa0C3ra#P/!+#P.
+r*02+s&oD*rE92kr13eXpn.T0rlY5^s2b5[!6"cO!5n]Nrkn]O!5nfQrM'7c!2T=bl)+BTs/,Xj
+!3#k=rlb>arQ5)^oZI9Zc2Grfchu)gci;;iblc25b00e,#0Fp+`l?!:qSWHD\%)FJ#J.OZ]Y(qk
+^AYeJ^qmkd_Z.LR`;R[T`rF*YaT'B^b5TTabl>recMu5jd/MDodaQ\Ee,n1Of)F8%f\-8X+PY],
+h;-rEhr*GOiSrnXjQ,Fbk3(pkl07Kulg4!*mI'uB!q>aMrpg-^o^r.Us7ZKerV6EgrqcNhrqu]m
+oDX=@JcF=$J,~>
+JcC<$JcC?%mJd%^r;?EgrqcWirV6Bds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'OI!pJh1roX7B
+!9F$;r/C`9Mu&>/M>`51I/JWsK`6W(K`6Z*K`6]*bQ#^'aiMQD`l5p8`5BI/_8*h#^:h1l]=PP`
+\@8p<IK+cqII_dc>S:=C<)lnGH[0aVEc>o1An5@W>lIkA@:E_U@:<YS@UNYR@q9+L<)Zb=Mi*Dk
+MZellH$Y,BK)UB'KREcG!.+Wis*4Qf(Nrk]=F#=3EG]`>H"18j?t!PS@q0%[Ac?9HBkV3qCMRj0
+rcJ0]!-8$X!-%jU"*/C%EVOSSE<'tQDt7cGD>nAMD>\5GD#eJPD$4`pDJj=jDZ+M<DZ=VaDJa3+
+D/3p'C27X#C2*Z\'5)#nAnG^kBP;!iA7BIk@q&k^Ie-M;;ZBVi;uK\q;ZTcpq,7)gs&B"srJU_T
+qGR;krDNYm!)ibmqbdDkr_NTHr.FctrIt69rK[MOQBh?2oT]?=!L/lKPQ-I=M#`G3M>N/4Mi<UQ
+mu%.'pPT!/repi8re^]6rL!SP!1<)=s-W>Cs-E\Mr0.2FrK@#>!k,SJrj`9F]=Y_g]tM/Y^B23e
+_>_=O_Z7XR`W*sXa8X0[aoBN_bQ#fdc2Q#gci;Akd/qbFe,Ihue^i=Nf)aOWrn8LLgt^`AhVR/J
+i8NYSj5]4]jlY^gkNM0plK[^%m-X3.rpKpXnaZVL!qZ'Vrq6<bs7cKes7uZjqtpBjr;H6dJcC<$
+f)L7~>
+JcC<$JcC?%mJd%^r;?EgrqcWirV6Bds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'OI!pJh1roX7B
+!9ElV"'J`-=Sl/$<`N0!<rQ/#9DhZd;ZB\q<;obq;>sJnbQ#^'aiMQD`l5p8`5BI/_8*h#^:h1l
+]=PP`\@8pD;Y*ie;ZB\m<;fhs//Kfr2Dd9V5!D(j3B9#T1c$j>/1rM+1GJe_"#;Sd2?#E72)I-S
+r]L?P9hnF^9E%Ne92\Va;c3NlrC$TOs$@bl5sR_$5s@If1djf':esbY:/F\]9hnDX;,'h^9MPI\
+!Du\m;>sDi:]F8j;#jGl:]!uf;?'Jm:B45];>j>g:]4,i:B=<hrD*Pm;,L.dr)!Sp;,C(brD<Mi
+!)W8_!)WVir_WPhrD3Vo:f:1grDE\o:K.6j&Q;P);,L4g:Jan^7mfU075[:(497T/r]gBG"[+t1
+4[)+/4T%>E4?G\hq*4d@s$-NIs&B,$<C-IGr]pKJrBL?Lr':<Lr]pKMs$6WMoi(cfpf7>p!*B)!
+rDiPlr`92&<E<0!<W6%s=8uA&=8l=e=8l;%=8c2"=8l>#<rcA!;u]bo;?'Pm;u'>j;>j>k:B4/g
+9`Rr`:]!rg:]=,b:BIu6\Gj#D]">Se]Y2"mrP&EL_86,fs2+iTrPefVs2Y,[s2k;`rlb>cs3:Pg
+s3L_lrm:eqe'n<G!nGlQrmq2'g&B\JgYCT?h;7#Gi8ESQioB([jQ5OdkND'nl0@R"m-O-,mf)YV
+nF?&JncJFTo`"O`pAamcq#C0hqYU0hr;?Nbrdk*#s474#~>
+JcC<$JcCE'm/Hq]r;?EgrqcWir:p<ds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'RJs60LGroOaQ
+jQ,@(YHG(4Y-"h/Xf\]#WrT0uW<&rprhKXdA#,q"V>dFnV#[ChV]Eq%aN2EB`l5p8_ns:,^q[Xu
+]tD"i]",A]\$i`QmZn!@QBd]!rfd8Cs*>K/B4b^dW2?>^R[98#N/34;I!^']Fb,,CJ,as+I=H`u
+ItE9*?t!JORJaPp[JdEBZBC`RVPU2gV5:&_TUhXDrgP(!@:a+gFaA[tP&G2QCM7<qC2@U!D/F31
+DfKoEH[UHsKD:#uKDgE$Jc:2qJ,ausI0"_Brd+Hgs*=`lH@#O8"+#<AI/A9gI/eNnHMr-hGlN'g
+Gl;pfHiJBlHiAElIJ\BmH[Pg@qgA3dr-JBg#'tN=GB\4Src\<a(3FS=EH?5DEH6&>FEDMBC2L5$
+E,TQLra5V1rEoP1#$kJ=?!UcCrE]D/s'5Y1>PMM(?3"@3?N4@:?<skCZa*m5>lJ%+>l.b*>QS,5
+=oDM(>Pt&lT(elVbPoZ`aTT]*`l5jm_>qLN_Z%IO_>qLNUA^kdV"geMVYm:jVYm@lW;Og<bQ#``
+aoBNTb5fcacMu5gcMu5jcMl)gbl>lcaoTW)rl4uWr58TCrjDj:\Gj#?]">TR]E5d\^AbnI^];4L
+_?.Wn`;RXV`lH-uaT'?^b5KKbbg"E3cMu5jd/MDtdaQ[peCE+#rmrXPg"G*5gY:N>h;7#Gi8ESQ
+ioB([jlPXekNM-ol0@U#m-O--mdKW6nF?MKs766_rUp3a!;HEds7u]kqtp?irVc?eJcC<$f)L7~>
+JcC<$JcCE'm/Hq]r;?EgrqcWir:p<ds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'RJs60LGroO=E
+jQ,A!Nr=t;Mu\e3MYr>2L]iKfL4!,$KE$W(KE$W%KcS=XaN2EB`l5p8_ns:,^q[Xu]tD"i]",A]
+\$i`QqgS?hs*jrq!doEEpO*!G(LL3B<)n?nH$47MEG]B$A78eM>?b9@@esO5@K9p;AH5a0;Z_3$
+MZ/M6M>`2:KQ29iK7\].JqJaUH2i-gG7f""=^5<EBQ%s9ARf.W?t*VTraZ@IA7]FeBPM:!DK>`"
+s)n<_s)\3\rc.sWpi6(Ls)A$Xpi#_@!c;air,)@JoPOVH"`A0oDJa:jDs2'=DuFYTDuX_QC]S<f
+rbE9aBPD0oC2%9mB5)$nB4k^`PA"H8?u#C6s&&qt;Gg<e;uK\q;ZTcpq,7)gs&B"srJU_TqGR;k
+rDNJhqbdDkr_NSlr.Fctre1?<rg!JKs-EbPPl$[:Pl?jKPa.#[p5/^)"cJ=tMMmDdMY2o*MZ8V7
+N;SV3R/`QSR-U+<R.$@BQBhB4!0dAEr/guerjDj:\Gj#?]">TR]E5d\^AbnI^];4L_?.Wn`;RXV
+`lH-uaT'?^b5KKbbg"E3cMu5jd/MDtdaQ[peCE+#rmrXPg"G*5gY:N>h;7#Gi8ESQioB([jlPXe
+kNM-ol0@U#m-O--mdKW6nF?MKs766_rUp3a!;HEds7u]kqtp?irVc?eJcC<$f)L7~>
+JcC<$JcCE'm/Hq]r;?EgrqcWir:p<ds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'RJs60LGroO=E
+jQ,@s=T;M(=Sc)!<rQ+u<r?#"91]"Yr_i_o!E<"p;B<p%aN2EB`l5p8_ns:,^q[Xu]tD"i]",A]
+\$i`QnPfBa"&i/t;uBVo<W4Nd2`<KN5X%@o3]T2Z1c.!B0.ee//2K"71B'$.2#fE82Dm<Kr]L?D
+7nuhY9DhC18OZ<N;Gg@j;,^@[6pj:-5X@\$5X@\&6:F=685E#U92A8W9hnAV:]3ri9hnDX;#=/i
+;>j>h:]F8j;#jGl:]!uf;?'Jl:\%B\;#F,c:]XEirD*Pm;,L.dqGI5frD;uZ!)WVir_WMgs%r\j
+s%`Sjs%rkp;,L6i:_Q]%;,U7i;c-Ik:JaeZ;a`r?6oFg'#X(@85<_7q5!Am-!^8h3r]L*A"$AY.
+4o%>?56!kI4p=qe<`MIOq`k'Fs$-HIq`t3Kr]pKMs$6ZM5k\.T;uouupf7/krDiPlr`9)#qc3Ys
+r)`_ss&]5&mT0Bjr`K5&rDrr"qH*_qqc!MmrDESmr)<Dhs&&\js%`VirCm8eqbQu`!)NShqbI4"
+rjDj:\Gj#?]">TR]E5d\^AbnI^];4L_?.Wn`;RXV`lH-uaT'?^b5KKbbg"E3cMu5jd/MDtdaQ[p
+eCE+#rmrXPg"G*5gY:N>h;7#Gi8ESQioB([jlPXekNM-ol0@U#m-O--mdKW6nF?MKs766_rUp3a
+!;HEds7u]kqtp?irVc?eJcC<$f)L7~>
+JcC<$JcCE'm/Hq]r;?Egs8)`jr:p<ds7ZEas7H?_rUL$[nF6GGs6]mSrp9[N!:'OI!pJh1roOLJ
+jQ,@]YHG(3riH7)XfVN&"feW(WiN2uW<fE!V50o^U7><aV#R7qW2Z_mV5C-eVuOgAa2Z*;`5DSk
+&])8t^V7Co]Xtbc\[],W[^EL<QN!6FQN!-MP`u*0+d%(sHt[/)AuDN#TUV@7OH#-OIX-9aG'/:b
+JU`,tI=HbGJ-UXW?t!JO@%[D-!OoK8Zi@<:Z*9=ZV5C)dV#I4iRj"2uNf\.#G_:j<Df9E+BP2$p
+Chmd%Df9T8F*N(aLPCJ7mt(Ojr.+Wns*jop!IT7nHMi-iHN/9jHMr*kH@($eqg86gs*FfnH$T@5
+!."Qgs*4]kH$Xi:H2r<kHiSTnHi\SArd4TlrI"EfqKi0erd"frI!^0aG]e91FoQV"FE;GCF*2YG
+Ec?)BEcQ/5D1d"NDMn?urEoS2!+#S/s'>Y2rE]D/s'5Y1>PMM(?3+D>rEfV4?*aI9!+#G+ra#D+
+qcj)*!aAi2qc`rhqOdeZs.B>6s3(DarlG;aa2Z*9oYUUFs2+Z-qP4%cq5*;Pr2'Cir29D6s3(Gb
+rQ5)^o?.-Xr6G>gr6G>grltMgrlkDcrlP>aa2Z-u`Vm^VZa@.>[K3kIrji'?!5&6Cs1JEHrP&EL
+_86,fs24lTrl+oWs2Y,[s2k;`rlb>c!6tMgs3C\lrmCbo!7Uqs)V*Eif@S[-g"P07gYCW@hVR/J
+i8N\Tj5]4^roO7Ekl0fIlKeH9!U]=SmfN"Knc&(\oCV\Sp&Facp\jmeq>U6fqu6NlrU^#>s+14$
+s*t~>
+JcC<$JcCE'm/Hq]r;?Egs8)`jr:p<ds7ZEas7H?_rUL$[nF6GGs6]mSrp9[N!:'OI!pJh1roO@F
+jQ,@]r/Uc9!K;s3MYr>2L]E5/L&lWur.G$&re(6(qh>'k"inX%`Pf[n_@aW"^V@Lr]Y(kf\[f5Z
+[^NTNr-nHirdOTirHoen>[LK3<E4HpH$4:OE,B9$AR\qN>?Y0<@U`bR@UWbT@UoCJ#$"W$<E+=&
+rJLZ4reCc6KS5&4EI!1hrIY'%rc]K.G].Y1@qTV!H":Gn@:<VR@Us"\AnGUfBPD3uEHZJIqfVs^
+rH&*^EcV+urc%[Qpi?CSpM]V?!GuZMD>\5CD$+ZoDJoDi!H)iND?+PFDZ+MPE;skSE;shUD$Ffn
+CMdj%CAqrIBE;m^ralROBP;$k@:O1e@UX(NqbmMn;uKVo;>F/h<<#kt;H*Bhr_j#!;c?Xp;cEXR
+!)r_lr_rbnqGI,f!)`YjrIalus+UK=rg!JKs-EbPPkpU:PlHsIL]<2'M>`;4Mi@Rlpkn^%r/1K3
+s,?r8qO%;N!1<)=s-W5@!LB#KPQ6pGP5ULEZa@.>[K3kIrji'?!5&6Cs1JEHrP&EL_86,fs24lT
+rl+oWs2Y,[s2k;`rlb>c!6tMgs3C\lrmCbo!7Uqs)V*Eif@S[-g"P07gYCW@hVR/Ji8N\Tj5]4^
+roO7Ekl0fIlKeH9!U]=SmfN"Knc&(\oCV\Sp&Facp\jmeq>U6fqu6NlrU^#>s+14$s*t~>
+JcC<$JcCE'm/Hq]r;?Egs8)`jr:p<ds7ZEas7H?_rUL$[nF6GGs6]mSrp9[N!:'OI!pJh1roO@F
+jQ,@]qH*l'=BAL'rDru"r)NbtqH!\j8Gl?a;ZBYr<)`Zls2YAa`l5p8_u@Lb_8*h#^:h1l]=PP`
+\@8oT[C#I&rDEVoq,@>or[e(.s"tWY5!D(i3B9#U1bpd=/M/S,1,1L=1,1OBrAFU3r]U9C"@u9]
+92#.Sr^dGf6qU<S;,U=h;c<T\(-jZ=4[;A'7Rp!F:/">U9h\8T9hnJXr_EVj:/4[\;Z0Jl;#3ud
+;$'Qi:]!ue;?'Jm:B45_;>a8g:\mof;#jGk:BOEj:f.'e!`Dllr_NJhnPB0]r_NJhr(m>hs%iPh
+s%a_3;,C+d:Jaqe:f:4k:f:1g;Gg7k:f1%]9LhH<6T$t(49I`15!T!0!'U<D!^8h3r]L*A"$AY.
+4o%>?56!kI4oeU^<WPNPq`k'Fs$-HIq`t3Kr]pKMs$?WKp/CohpJq&jr)NJl#Zk&,<E<.#<`]#t
+p/p`a"B\f0=BGK&r`B#"r_iVls&/em!)i\mq,75ir)!Dh!)EJe!)EMhohYWar_EAe!jf8ArjDj:
+\Gj&=\cBAA]`5YF^AYeJ^qmkd_Z.OR`;[aU`rF*YaT'B^b5TTabQ,oecMu2jd/MGmdK%bqe/Hlg
+f%8O+f\,!4gY:N>h;7#Gi8ESRioB([jo4BCkNMp0!UB"MliHMArpKpXnaZVL!qZ'Vrq6<bs7cKe
+s7uZjqtpBjrVc?eJcC<$f)L7~>
+JcC<$JcCK)li-e[rVZNhrqcWirV6Bds7ZEas7?<_rUL$[nF6GGs6]mSrp9[N!:'RJs6'IGroX7B
+!9F.>"6-GbY5PL&X8o<uWWK6$WrAt$W2HMhUnn!a#b[ZXPGG"NV5F6j!i;ckqkjG6rl#Yk_ns:,
+^q[Xu]tD"i]",A]\$i`Q['TOns-NGFs-3VLPQ$^gH@(!OB4b_RV5'WOR?s(sLkUA,HZs[VIXcp!
+J:;orJ:RWK#%1nJ?XR?GrjW!<[f*Q4ZMq*VYck42R]**[V5C,dMO0Zp\W_K!OD\rOCM@NuCi*s)
+Ci=95EHQSXr.k<,!/19%s+0ors+1&tqg\Wpr-\TnHiA?iHiJEkH2i3hGli;=I/83fI/eNoH?oF5
+!."Qg"*o-9H2MsgHhr-fHN8HlI/nZgHi&-gH2i3jHi/7*I=-<cH?XRUG'8"MF)l>CF`VMCDuOeb
+Ec#KMHZ3k\ZX-u:?NshB?!LW=?2e1/?2e11>le27pg!u.?XI.<?NOP>ZMq01?2@h*?2In*>Q7n,
+>QS,5=o)>%SH,8ZTDtM_T)d"4aoKW`b5TKdaN)<>_o)/as24`.s.]Rgq4dqcq5)uGrMTJ6s3(Gb
+rQ5)^o?.-Yr6G>grQb>e!RAshbl>ldaooi-a2Z-u`W*j[ZEpmE['fnA!OoT<\c95@]DfJC^&PhG
+^]2(L_>V4P_o0Ll`<+'"a8X0[aoBN_b6#o4c2Q#gcN)>kd0J+Ke'umte^j`O!SH*)g'ZTih;-rE
+hr*GOir7s=jQ6C'$g6a<l0@R"m-O-,mf)YUnF?MKs766_rUg6cp\4X]rqZTjqtpBjr;H6dJcC<$
+fDg@~>
+JcC<$JcCK)li-e[rVZNhrqcWirV6Bds7ZEas7?<_rUL$[nF6GGs6]mSrp9[N!:'RJs6'IGroX7B
+!9F.>$0$u)NfK*YN/NVgMZ&D3L]E5-L&u^LGl<9oK`?](K`$N(`r<pm`5BI/_8*h#^:h1l]=PP`
+\@8oT[C!:;IeeEkIK=kEq0i9j)-^BQ<`N.#IX?B`FEDP@BkM!e?X6l?=^kh=@KBnFqdTJ&#$$;5
+Mi3IMrJ1B+s+CT/JqAW#KS08Us+:_pDKU,YDJO39@q9%WrF-+EARo@aAnYglCN',orcS-^s)n<_
+s)\3\rc.mUrc%pYrGhUQ!HE)TDZXfpDt7fAD>e;CD>eAMD>e>PD>e>PD=qfCDuO_TDu+GODuOVn
+Ci*s(CMR[!BPD-pBOtdfBP2$l@:4Cq@ps8/rDN_p;uKVo;#jMj;uTbq;Z]iq;u0Al;uT\p;u]hs
+;uMXT;u0Dk;u9Jk;#sKjr)*Mlqb[9EqLnm&rKdGJrg*SN!L8oGPP::APPg19M"QW%MYrD-MX-3#
+N;nh3R/`QSR-U+=R-p:AQBhB4!0dAEs,dJjZa7$G[JmT8\%)FJs1/3Brk/9Es1\KIs1eWNrPAWR
+`5MVn!li:$rlG,]s2t>a!mJp6rm(Pi!7:_m#L_)MeC<%!f)F8%f\-8X$JX@lh;7#Gi8ESRro4%?
+jo4BMkNM0plK[^%m-X3.rpKmWnc&+Zo)SF]o`Fj]p\jmdq>^<gqu6NkrU^#>s+14%s*t~>
+JcC<$JcCK)li-e[rVZNhrqcWirV6Bds7ZEas7?<_rUL$[nF6GGs6]mSrp9[N!:'RJs6'IGroX7B
+!9F.>!od<`r`K2'"'AT(<rQ/#<r5ns<rZ5$<rQ2"<WYld:]4/i;Z9Sp<;TPn`r<pm`5BI/_8*h#
+^:h1l]=PP`\@8oT[C!:0;uT\p;u0H8/1iD42E!EX5!D(i3]T,V1c$mA0.ee.0etI=1,1OBr\a^3
+$U$^;4$,W":.n5P8c;9\8cM="7n-$>8l8J`:fC4i1bM!V5;>Sq85N)U9MJ:]:&dui9ht[^s%WPj
+oMYTarD<>drD<Vm:J^mbr)*Jj!`)WhoMPN_qbR&bs%rbmrD*DipJCoer_NPjr(d;fohYTar_EVm
+;,L0f:B45j:\moc:C9ip:esh`;G^.f;#X>n;c*Hk&5uG&:/";L6:3^s4?Pbi5!T!0rB13G5<]!.
+r&k0F4$>_jqEOmAs$-NI!*0#!!CB'K5Q3qJ5Q*kE5la7N5lX1N62a%C;uTbh<Vfbo<V0>l<rc:q
+=8#b`<s)Q-=]kN%rE0"rqc!MmrD<Pmr)<Ags&&\js%`Vir_<Df!)N2_!`)QdrD*U&Za7$G[JmT8
+\%)FJs1/3Brk/9Es1\KIs1eWNrPAWR`5MVn!li:$rlG,]s2t>a!mJp6rm(Pi!7:_m#L_)MeC<%!
+f)F8%f\-8X$JX@lh;7#Gi8ESRro4%?jo4BMkNM0plK[^%m-X3.rpKmWnc&+Zo)SF]o`Fj]p\jmd
+q>^<gqu6NkrU^#>s+14%s*t~>
+JcC<$JcCN*li-e[rVZNhrqcWir:p<ds7ZEas7H?_rpp*Z!:^!Vs6fpSrp0mUlK[Wukih4/k5XNC
+jSn3>ir?+aXKAV+XK2)qri$1%Vkp5cUSFQWrgs=^S6)M^rhTgtWMl_kVPa<is2>hn_ns:,^qd_"
+^:h1l]=PP`\@8oT[C!9Gm$@X9,F"CTH[0sPB4b_PUnjQOR$EksM2$S0I<TmYG(,!lIsufpJc:0(
+KOS=r?t+9W\-'1GZEsM8rilL.Y5YL7X/qb[V59cmNh*qLLQ.^?Df#Dfs(i!WDJjB5F*)YSK_U<(
+L4t<[K)^B&J:[KIrdjrsqg\Wpr-\TnHiA?iHiJEkH2i3hGlW0dHi&3jHN8BiGlN'eGlN'eHM`*h
+HN8HmHN8HmI/nZlHiJEkHhr'fH2i3jHi/9kI/n`qIK+R3H?XOTG&qhLEH6)@FEDMBE--2CB52:7
+F)YuSrEfb8?!U]?>@%57rE]D/s'5Y1>PVP-?=.&G?N"44?<sl9ZN.<->lJ%+>l@n,>5qh1>?Y05
+>Pq\(T)PA]T)YD_ao0?^bPoZ`aoBEaa2Q!7otpO!!i)Kaq4dqcq5*/Lrho[kpWENZs2t;^s2srV
+!6tJfrm1Pgr6GJjc-4E2bQ#]faiMNB`r<p_`3HSQZa7$G[JmT9\%&sI\H9@S]DfJC]`>eF^B23e
+_>_=O_uI[S`W*pXa8O'\ai_d*b6#o4c2Puncd:%ddF-IlrmUu!f)F8%f\-8X$JX@lh;7#Gi8ESR
+ro4@HjlY^gkih9qlKeH9!U]=SmfN"Knc&(\oCV\Sp&Facp\jmeq>^<gqu-HkrU^#>s+14%s*t~>
+JcC<$JcCN*li-e[rVZNhrqcWir:p<ds7ZEas7H?_rpp*Z!:^!Vs6fpSrp0mUlK[Wukih4/k5XNC
+jSn3>iW5%!rf$u<Mi7:drJ:Q2L\c`-KmJ,Dr.G$&re(6(rIt9j(rX>/_SO%'^V@Lr]Y(kf\[f5Z
+[^NTNZa0LXpjN0ks*aZis'$=G<`W4$I!U*]FEDJ?C1q0g?XI&B=^,<Era?"=@:N_U@qGX=s&B),
+MZ/M7MMV7e!/CH+rdt6'Jc:02H?k-pFGt3bM/dHVHt6_p@fBm;AH-3@B)ZKGC2J"dG5cX`Foul/
+FERS)!crC&rc.jTrc%pYrGhUQ!HE)TDZXfpDt7fAD>nACD>eAMD?"MQD>nGQD=qfCDuO_TDu+GO
+DZXlrDuOVaD/=')Chmg$BkV-mBk_2YBE)ZF@L6O]A7B"a;c?RmrDNYm!)iYlr`&kq!`Drqp/:oh
+s&B"s!/pf7qGR;kqbmAi!DlYk;ZBVl;#Z+EK`?c(QN!0KQ33J>Q'D*.qNV#8!/UW0s+g]4M"cc'
+MZ&J-MXZQ'N;SV6Qhd$KR/iW?QiEHAQiE?OQ2HjHPPpXMOg20sZa7$G[JmT9\%&sI\H9@S]DfJC
+]`>eF^B23e_>_=O_uI[S`W*pXa8O'\ai_d*b6#o4c2Puncd:%ddF-IlrmUu!f)F8%f\-8X$JX@l
+h;7#Gi8ESRro4@HjlY^gkih9qlKeH9!U]=SmfN"Knc&(\oCV\Sp&Facp\jmeq>^<gqu-HkrU^#>
+s+14%s*t~>
+JcC<$JcCN*li-e[rVZNhrqcWir:p<ds7ZEas7H?_rpp*Z!:^!Vs6fpSrp0mUlK[Wukih4/k5XNC
+jSn3>iW<1`=8l>-=B/@%<``@'qc3Pp!*B"t!_Q*Vr)*Jlr_ihs;uKVo`>HP2_SX.)^q[Xu]tD"i
+]",A]\$i`Q['R(.;uKSo;u9N2.k3,12`ETZ5!D(i3B9#V1G^a?/hJ\-/c@C61,1XD1c@0J5<V(j
+4[;a@9*%XVrC[&\"\;-R84Q/K71r6e;Gf5A4[2+f7Rp$F:/+JW9`@`l:/+JW:J=M[;"@Na;#jGk
+;>sDg:B45i;>F&d;?'Go:Jam[;>j>f:\mof;>a5`;$9]k:Jamd:]=,^:B45i:BF?i;#F,h;#X8e
+;#O09:esk`:JXe`:Janc;c$=e;,^Cm;,C(g;G]qY91;396T7.k5!T!0rB13G5<]!.r&k0F4$>_j
+q`jsAs$-NI!*/tu!'pEGr]pKJrBU6G!(-ZM!(-ZNrBL'Us&8u!p/Uohr)NYqs&K"uo2kZglrX3h
+s&o(uqbm;is&/em!)i_npeq,hrD<Jh!)EMf!_uNeo2#Ka:/:das02a5Za7$G[JmT9\%&sI\H9@S
+]DfJC]`>eF^B23e_>_=O_uI[S`W*pXa8O'\ai_d*b6#o4c2Puncd:%ddF-IlrmUu!f)F8%f\-8X
+$JX@lh;7#Gi8ESRro4@HjlY^gkih9qlKeH9!U]=SmfN"Knc&(\oCV\Sp&Facp\jmeq>^<gqu-Hk
+rU^#>s+14%s*t~>
+JcC<$JcCT,lMg\ZrVZNhrqcWir:p<ds7ZEas7H?_rpp*Z!:]sU!q,ICrp0^PlK\B5!U/_Gk5XNC
+jSn0Aio/juriH+"pT"7m&ZDV*V59u_US=HST:hjKSsu>NV#R:kW!'#sV5C-gV]!Fj_SX.)^V@Lr
+]Y(kf\[f5Z[^NTNZa6sBm$@X9)jGVpHY7#)AS@p8S=5e/P)Y9PK78/lGB\4\Jc:--J:E'"It<5]
+?XI8OOT)`p[^39GZEpjBrim]PYH=n-WiW8$V5'0=S?8!+MN`""DJO$&Ci!m)D/aQ;GC+uAM"c])
+L&m!]rdk6'J:N4GK)^DtJGam!IXQWlrd=lrH[:#:HiJEjH2i3hH2i3eHi/9jHi&'fH2MpeH2W$h
+Hi/9eHN8HmI/nZnHi89iHhr'gH2`*iHhr-dIK+[%H$Xd^G'%nLG'.j(F8p7pE,p#ACM7LgG]I\[
+?XI,F?!LW=?2e1/?2e10>l\+(?2n:3?N"48?<skB['R(7>lJ%+>lIt,>5qh1>?Y04>PhV(T)YG]
+ScYP*ao0?^bPoZ`aoBEaa2Q!7q83-)p7hAX!2TFej/2gRrMBS<pWENZs2t;^s2suW!R/gecMl/g
+cMYujcHXSWrlb>a"3JX)`r<paYHY79ZEggC['[7?[f<f:\Gj&=\cBAA]`5\F^AbnI^];4L_?.Wn
+`;[aU`rF*Ya9'K+b5TQhbg"DXcHjh`rm:bpe,Ihte^j`O!SH*)g'-6dh;-rFrnn.BioB([jlPXe
+kNMp0#3tO@m-X3.rpKmWnc&+Zo)SF^p&Facp\jmeq>U6gqu-HkrU^#>s+14%s*t~>
+JcC<$JcCT,lMg\ZrVZNhrqcWir:p<ds7ZEas7H?_rpp*Z!:]sU!q,ICrp0^PlK\B5!U/_Gk5XNC
+jSn0Dio/jVNK&nrMti/1Mi.IireL?)"bhV_H[LGDKDpQ(KDpQ'Kc.hH_SX.)^V@Lr]Y(kf\[f5Z
+[^NTNZa6sBr-nHirdFiqq0X)b>[:E4<E3(HH$+1KEGoN'AS#7T>[(B8@UoCG#%M(M@U`kZr_rr!
+<-%tr!K)^3L])o?KS+o/K7ST(J:E#sC34]QDJaE=raZ";raQ7F@qB4`BkV6tE:\8QFo?I`Fo6@]
+F8p:[EVseUEW1"XEVOSSE;OSRDZ=YGDYe5LD";HADZ">ODZ+GOD?+PLD?+VRDYnANE;skPE;jeU
+E;skTD?"MPD>\/VBkV3oC2%?mBkV5[@Kr!/@q':Q;uKVo;#jMh;ZKer;Z]iq;ta,h;u]hs;u_dT
+N;?HO;u9Jl;?'Gm;>a>l;>X2iKDU<%L&@88Q2['RQ^3o$PEV1,PQ-mHLB<<gM#N2-M"li'M?&S.
+MXHE%N;\\6Qhd$KR/iW?QiEHAQiE?OQ2HjHPQ$^PYHY79ZEggC['[7?[f<f:\Gj&=\cBAA]`5\F
+^AbnI^];4L_?.Wn`;[aU`rF*Ya9'K+b5TQhbg"DXcHjh`rm:bpe,Ihte^j`O!SH*)g'-6dh;-rF
+rnn.BioB([jlPXekNMp0#3tO@m-X3.rpKmWnc&+Zo)SF^p&Facp\jmeq>U6gqu-HkrU^#>s+14%
+s*t~>
+JcC<$JcCT,lMg\ZrVZNhrqcWir:p<ds7ZEas7H?_rpp*Z!:]sU!q,ICrp0^PlK\B5!U/_Gk5XNC
+jSn0Mio/iu='/U-=&r=$<``@'q,R#es%E8er_i_o!*&np)8sG0_SO%&^V7Co]Xtbc\[],W[^EKK
+Za-k+;uKSo;uKZ0.kN>32`3HL5!:tg3&rrU1G^d@0E*R(/c@F(1(c?#2)[9K5<V(k4@Mk89M.lJ
+r_!/]s%!Mf84Q0>77K^76:<L+57]M=77U'J9hS2S9MS8V:/(R\m8<p]r_WVlrD<Aes%rVjqb[/e
+rD<,`rD<;cqG72i;#O/i;"mfe;#X8j;#X8h:A%B_;#O2i;#jGj:]F8k:\did:]F5k:]!rr:Jah_
+;,C%d;,U1gr_ibp%8g&&;G'SS:.@T<2a0J)55dVG5!M404Sq8D4$>_jq`jsAs$-NIs&K&!!($KH
+r]pKJrBU6G!(-ZM!(-ZNr'1!U!E<+m<VTVn<<-)!<<#ts<qBDg=S5bq=SGks=T2Iu=Sbqm;u]bo
+;#jMl;ts8j;>O)h:B!rg:/CFW%Sohp:Tq",Z*L[AZa@*IrjMj9!4`$=s1/3Brk/9Es1\KIs1eWN
+rPAWR`5MYos2P)Zrl>/_b0'_,#L(H;cHab^d/MDndaS3F!S,d#f)aOWrn7P1gtgfChu;O@iSrnX
+jQ5Lck3(t-km$G=m-O-,mf)YUnF?MKs766_rq6<bs7cKes7uZjr;6HjrVc?eJcC<$fDg@~>
+JcC<$JcCZ.l2LSYrVZKgrqcZjr:p9cs7ZEa!qc*UrUL$[nF6GG!q,ICrp0^PlK\B5!U/_Gk5XNC
+jSn0Hio/kSXK/G'X/`/nWXl),Vl$>fUna]ZTqJ'PTV)4T%[ro3UnjiaVPpJmVkp8frhgRL_8*h#
+^:q:n]Xtbc\[],W[^EKKZE^Y%QMd$JBJ=d\BkM$jV5'ZPR$3VkLkpY3H?aXWG(5'oJ:E#sIt3*#
+JRMnm@Uc(A\$iTJZa-q:ZMq*PYcY".X/`8$VPB6?UV`7NN1G!-D/3j"Chmm*Df^)HI>%QSs+pB(
+s+UQ-KDpH*JUi9%JbjutJbaioIfb(II/\QoHi\S?rHnQjr-A<grH\EhqKr-fs*F`lqfr-dr-86e
+rH\Hjr-\<e!.=co!.=`lrd+Niqg/6es*FQhrd=]npO!9mH?jg\G'S7QFoHFsFa%kFEHH57Bk`TV
+EcGuR?!U]?>@%57rE]G0s'>Y0!*fG-qcs;1?X@(;?NXV?ZEjJ9qHWu)r*95*s&oY1>[1K:=]nu*
+>5FflaN;R&aoKWab5TN_a90H$`5DMiqk<t_s.T@bqP4(dqPF"brho.\rhodns3(DarQ5#\s3(Gb
+rQ5)^o?.?^c-=PZcd2O7!71Sg!mSs5rlb>a%EZ]2`l5p"YHP17Z*L\7ZN7G@rjMj9!4`$=s186B
+rk&<G^:sT]s1nZNrke]Q!6"lUs2P)Zrl>>db0%oNbfn?2c4J=Kd*^7he'lgre^i='f@\dUg'-6d
+h;-rFrnmt=ioB([jo4BRkNM0plKdd&m-X6/n*fc9nc&(\oCV\Sp&Facp\sseq>^<gqu6NlrU^#>
+s+14%s*t~>
+JcC<$JcCZ.l2LSYrVZKgrqcZjr:p9cs7ZEa!qc*UrUL$[nF6GG!q,ICrp0^PlK\B5!U/_Gk5XNC
+jSn0Fio/kSNJrgSMti2/MuJS5M#W52L55\]r.G,tHtE5.s+LB(s+LB*(W+#(^V@Ls]tD"i]",A]
+\$i`Q['R'CYkrnJIJSBmIJ\C,>?Y<==&r@%H[0dVF)Yu1B4k^]?!RA4$XmOS@UW_S@:E_W@fB@,
+<<IZ-Mi.FfrIkE.K7ec.Jc:0<Isui]FF/pcE-6YAA7T+XA7T1\AS#OgC2\1]G5l^bFoZ[`F9HZ,
+F)l=#EVj_SEW:(YEVXVVEH#mpDuOYSDt7fBD?"GBD>nGND?"MPD>nDQD>S5MDuOYNDuO_TDZFbR
+DuX_TDuXeVDZ4JQDZ"GPD@gZ$CMI[$CM@NtBPM3mAnYlW@0LslARf.ar_ibn!)iJgnl#Kds&B"s
+s,6l8qGR;kqbmDjs%i\mr)3PlqG70Eqh4j4rg!GJ!gf4<rfdAFrKI59r.t<,r.t-)nqu^jrf$l8
+pm:rHs-WkSfpD](s-<PIs-*JG#Hk86YctC<ZMq02['fnAs0i!<rji'?s1A9C!kl=^rkJKKs2"]O
+s2+iTrl+oWs2Y,[#Kb-2bKJ,Rc2Q!"cd:%ddF-LmeC<%"f%8O+g&B\/gYCW@hV\=j"l\J$j5f>$
+jq-_>l07L!lg4!*mdBQ4nF?&JncJFTo`"O`pAamdq#:*hqYU0hr;HTcrdk*#s4@:$~>
+JcC<$JcCZ.l2LSYrVZKgrqcZjr:p9cs7ZEa!qc*UrUL$[nF6GG!q,ICrp0^PlK\B5!U/_Gk5XNC
+jSn0Jio/kS='/U-=&r=$<rQ1u<W?%u<Us/l8kVkU;?'Pn;ZKeq;A[3d^q[Xu^:h1l]=PP`\@8oT
+[C!9GZ*<^rr)*_t<'s#(/NE_es#p`O3]K,Y2)I*D1B&p+/cRR/0etL<2#]B42#f]E4$Get91qlK
+8cD?]8cM<a7n-!>7fGgf7RTQr4Zttd7n-'H:JOSW:B!oe:]=)j9i"XM;Z0Dl;>sDg:]F8h;>a8e
+;$'Qk;"RW_;#*o^;#O/i;"mfe;#X8j;#X8h:A7Q`;#X5m:f1(dr(d;hr_EMjpJ:fc!)N>c!`)Zh
+rD3et;G^:k;H$On;#XB!8P2TJ7RKR22?#f<4T[f34oRS@4Tdc.4[/^,r'(-Fs$$H_r`0"bq`k$E
+!'gEIq`t3Kr]pEJr'(0HqG[Dpoi:cfs&Jqq!``9$r`8Vlr)i\ppK78n!*K5'qH3Ynr_WYnqc!Mm
+rD<Pmr)<AgrDEMi!DcJi9`\!bo2,H_s%Wg%YHP17Z*L\7ZN7G@rjMj9!4`$=s186Brk&<G^:sT]
+s1nZNrke]Q!6"lUs2P)Zrl>>db0%oNbfn?2c4J=Kd*^7he'lgre^i='f@\dUg'-6dh;-rFrnmt=
+ioB([jo4BRkNM0plKdd&m-X6/n*fc9nc&(\oCV\Sp&Facp\sseq>^<gqu6NlrU^#>s+14%s*t~>
+JcC<$JcCc1kl1JXr;?BfrqcWirV6Bds7ZEas7?<_rUL$[nF6GGs6]mSrp0^PlK\B5!U/_Gk5XNC
+jSn0?io0mp!T0sWWWT6#WN#cp!i`,rrh][krM'@erLj4`rgj7`S<KFCrhTRj#,nN!W26AgrhgOI
+^V@Lr]Y(kf\[f5Z[^NTNZa6sBYd!P]rfo-LBk:jbA79#HV4a?HQB[AfL4FYuG]n:SIt*$!I=?Zo
+J:W<(@:<MOA"C-=[Bm4;ZN%0QZEUL6XKAM(Wi9QABUcr*M4/F)EGTB)D/a</DfKlDH\;-L!/U<'
+s+UQ-KDpH&Jc:3"Jbt'!JbXcnIfb(II/\QoHi\S?rHnQjr-A<grH\EhqKr-fs*F`lqfr-dr-86e
+rH\Hjr-\<erI+Tjrd+Qjom6L^s*XcnpO*!fs*Po6H?sj[Fa%nLFE;MGG&qYCF*2/2Bo[^`EG\ud
+>?bD4?N"10?N4=2>QA"->l.h*?N"45?<skBrj2H+rE]>+r`fD+#?b;:>?Y04>P_M'=o=ina2lBE
+rQ5,`rlY5^#0=j)`5BL0rh0.^s.]Icr1X4eUAUedV#."dVZ*ClVZ!F^VZ*LlVZ+d=b5KHYb5]Zb
+b5]T`b4EdXbg"E'c32D9bfe3/apuP6`l>*^Xfek2YctC;ZMq03['d=@[K<qJ\Gj&=\cBAA]`5\F
+^AbnI^];4M_Z.OR`;[^W`lH.!a8sE*rlb>c"jP?<cd0u;d0e=NeC<%!f%8O+g&B\<gYCW@hV[8L
+iSrkWj5f=ak3(t-klL)8rp0[Qmf)YUnF?MKs766_rq6<bs7cKes7u]kqtpBjr;H6dJcC<$f`-I~>
+JcC<$JcCc1kl1JXr;?BfrqcWirV6Bds7ZEas7?<_rUL$[nF6GGs6]mSrp0^PlK\B5!U/_Gk5XNC
+jSn0?io0mp!T/h/MZ8S9MM[2hM#W52L55_^s+UE)s+:ApHVjWmre1<()h`isKn[=W^V7Co]Xtbc
+\[],W[^EKKZa-j?Yjm2BIJnO=>$G-3='/R'I=$6`FE)55BOt^\?<gW:>%(iK@:3PQ?t*SVAH#O7
+<E+:&Mi*:FL5,Y\re(f7JqAQ)J:E&R?!_c7Ec?F*A.2pU@Us"ZAS,RfC2ItUG5cUcG'.p(F8p:[
+EVaYSEW:(ZEVOPUEH#mpDuOYSDt7fBD#eDAD>nGND?"MQD>e>PD>\;MDuOYNDZFbLDuX\YDfBZ6
+DJoGj!,hRM!cDporG;pWCM@HpBPV9pB5)&Y@0CmmA7K'I;?9Wmoi(BY##eK#;cAU4rf$\Or_r\l
+r_`\l!)`Yls&&Sgr.G'8qj.5HrK[SQQBdYtrfR>;LPP\]",DVcL\uu'M#`G4MtW%pMuJ\6MtiY7
+QiNKKQK"81Q2m3JPlHpSXKAV-YHP17Z*CV6ZN@MA[JmT9\%&sI\c95@]DfJC^&PhG^]2(L_>_=O
+_uI[S`<+'"a8X-\aiaV+s3(YkcHab^d/ME"daQ^qe^`7&f@\dUg(N/qh;-rFi8ESRioB([jlY^g
+kl0fIlKeH9!U]=SmfDqJrpp*\!;-9`s7ZKerV6Egs8)Wirqu]moDX=@JcFC&J,~>
+JcC<$JcCc1kl1JXr;?BfrqcWirV6Bds7ZEas7?<_rUL$[nF6GGs6]mSrp0^PlK\B5!U/_Gk5XNC
+jSn0?io0mp"lEE`=&r?#<WQ9&rDihrr`/Pjs&B+g91\tXs&/bnr_aNI^V@Lr]Y(kf\[f5Z[^NTN
+Za6sBYd!Xrqbm>Zs$@S\5<_1k4#o8X2)6mA/h\h0/Mf.:0f(L>2#]?>1d*u`5!2;,91__S9)_E]
+8.\9^84H';7R]a<8k_E52+C.8:('ck:JFMX:/=SZ:/L"L!)`ShqbR/erDEJhqG@;j;,Hm^rD<8b
+pe^ob!)WDerD3Gir_NMgpeUfar_ESl;,Q^Vs%i\knkf9\(/n(+;,U7i:fC:i:fC=k8P2TJ770I2
+r]^<E!^8h4r]L'@"$8V.55IMA56!kI56"X^<WGG_5Q*hI5Q*kE5la7N5lX+N5XG<4!C/mI;Z]s"
+<qTJh<qoYl<<-)!=8uCt<rcA%=oVV!=8,et=]kQ&"^"o1>$4u+=8Ytq;#jMn;u9Jk;#jMl;ts8h
+;>j;l:JUm`!DZG^;#a;uXKAV-YHP17Z*CV6ZN@MA[JmT9\%&sI\c95@]DfJC^&PhG^]2(L_>_=O
+_uI[S`<+'"a8X-\aiaV+s3(YkcHab^d/ME"daQ^qe^`7&f@\dUg(N/qh;-rFi8ESRioB([jlY^g
+kl0fIlKeH9!U]=SmfDqJrpp*\!;-9`s7ZKerV6Egs8)Wirqu]moDX=@JcFC&J,~>
+JcC<$JcCl4k5P8Vr;?BfrqcWir:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJ!U/_Gk5XNC
+jSn0?io0mp"5ht8Wr/joWWB)trMBUlV#@&!U7n<TTq@pJSXl:@Ru*T)rhKUlVl0Nm#H">pVPg?+
+^&GYU]=PP`\@8oT[C!9HZ*:I9Y3qT.Q"F`BARf1X@U`_P?CI4EO,8XBI!g0`GBJFdJUW#tIt*!"
+J:WA_?X[H4\@B!GZi@?2Yop?VY-"e+WiN2#P%J?@Dj?9PEcGo1Bl%[(CMn*4G'JK)L]<)7LPCS>
+L4t>6KDpK&JcC9#Jc(-"JbO]mIft4JI!pGBI/J?kHM`!fHN&3hHMW!dI/eNnHM_seH2MpeH2W$h
+Hi8?fHNSYDI!kj=rHeHiom6O_rd=]np3c[_*-usXG'A.TG'7kHF*2PEFE2P<Ch\lZE,ge?>@%57
+r*9J4?!U]?>Q.n)?2e1.?NXV?ZEjJ9qHWu)r*95*s&oY1>?kB9=]nu*>5qb)Scm'SaN;R"b5TKe
+aN)<=T:_eNT`CbaU&1SaU]7%iUSO^_V>[:iV>mFlVsgM^VuNXlbQ#``ans6\bPTHRbQ#fdc1B6\
+c2Z#fbPoWeaiDE%XT#=,Y-5%5Yd(I=rj)[5[C-"Bs0i!<rji'?s1A9C!kl=^rkJKK!5\WN!lMsp
+rl"oXa8X0[aT0K_b5oi3rltPjd/MEGdaQ^qe^`7&f@\d1g=tB;h;-rFi8ESRj5]4]jlY^gkiq?s
+lg*p(mI'E2n*ol;rpg*]o_nFap@n=[q#C0hqY^6hr;HTcrdk*#s4I@%~>
+JcC<$JcCl4k5P8Vr;?BfrqcWir:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJ!U/_Gk5XNC
+jSn0?io0mp!T2c.MZ8V7MZ/J4M#N2-LAuu,K`$H)CjLJ\r.G$&re(6(s+LKf^&GYU]=PP`\@8oT
+[C!9HZ*:I9Y46u@IK+Zs>$G-4r)aJ2=BBTcDJNot@UEGH>?Y50@KKtGA,Tm:A-HOD<)lnBrepf3
+"GhedKnfS[!eZ)WrdbW2Ir8Ou?t=7uI:[#$@U`kYrac4EBkV7"luiPTG'8"OG5cUeG'.nJErC%Z
+ErL(YDuahSE;sqXErU.TErU.ZE;a_RDZ=YGDY.cGDY@rHDZ"AODZ4MPD?+PNDZ4SQDXD?HDJsH4
+E,TXmD#eJJDuOYSDZFYRC_LT!C2%?pCM7?mBkUpa@<ua#@rD9Doi(lg!)`Jg#uOSu;cH^p;i?S5
+N;?HO;u]_q;>sJm;?'Gm;>jDl;><ueKE.85QN!0JQ3<P?Q'7F2L\HT-LPCP=L]3,)M#`G3MtMto
+MuJ\8MtWM6QiNKJQK"81Q2m3JPQI&LXT#=,Y-5%5Yd(I=rj)[5[C-"Bs0i!<rji'?s1A9C!kl=^
+rkJKK!5\WN!lMsprl"oXa8X0[aT0K_b5oi3rltPjd/MEGdaQ^qe^`7&f@\d1g=tB;h;-rFi8ESR
+j5]4]jlY^gkiq?slg*p(mI'E2n*ol;rpg*]o_nFap@n=[q#C0hqY^6hr;HTcrdk*#s4I@%~>
+JcC<$JcCl4k5P8Vr;?BfrqcWir:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJ!U/_Gk5XNC
+jSn0?io0mp"Q/';=&o,ur`/kqs&K)"!*/borD`r!5"\KF;?'Pn;ZKer;?=MFrk&fS]",A]\$i`Q
+['R*DYct=6nPfBarBg]U5sdn*r^%ej3]AoQ1GL[=0.nk.1GU[>1GL[B1c7-I2*F#a4@Vq98kK"S
+s%32\&4]8^7n,p:77K.,8kVf67S3SS$Va;i9h\8V:ej_Z:uG4O;>X2d:]4,g;>j>U;>j>d:\dib
+:B45d;#jGk:B45i:]=,d:\mod:B=9hr_W&Zs%i\kn5'6b:esn`r_XS4;H$Lk;GpFi;,^Cb8kM`E
+6:<ds4Zttl5<f'0!'L0B"$8V.55IMA56!kI56"X^<WGG_5Q*kI5Q3qE62a%M5sRa656=)75Q4R]
+<;oqk<W,tu;tj8i<W?,"<ruK,=Sc)!=T)D&=SGnn=T2J'=Sl/"=T)A(=BAT#;Z9Mp;H$Nk;Z0Gp
+;H$Oor_rVjr)*Dh!DcJi9`\!bo2#KaX/u<&#Hk86YctC;ZMq03['d=@[f<f:\Gj&=])TDA]E5d\
+^AbnI^];4L_?.Wn`;[^V`lJ)"s2b8`rlY>dc2Puhcd;[=0@J>!eCE+#f@S[.g=k<9gtgfChr*GO
+ioB([jQ5OdkNM0plKdd&m-X6/n*fc9nc&([oCW"S!quB_rV6EgrqcQirVZWmoDX=@JcFC&J,~>
+JcC<$JcCo5k5P5Ur;?EgrqcWir:p<drq??as7H?_rpp*Z!:]sU!Uf@Sm/QAOlMg#Qki_-kk2k^c
+ro4%=iVqa=hqm4iWN#lqs/H4$WiE%srhf^l!2TOfs.]Oe!hc-Vrga%ZrgO"YR@RFYU`ZM3W2Z_o
+V5C,fVnB[S]",A]\$i`Q['R*EZ*:I9Y-%5[s-3_!BkCperaH%@@:3GK@K'XA?\NrTH$=IUJ:E1M
+IfY"JrIG6-@UNSRQFOH5r3ITQZ*LU;XfSS'X/r=aQ]Ys"DfKi<Ec#Q+CiO60E-->LI>.$Cs+Uc6
+L5(J<KnY3XJc^LRJGt,uK)^E%J,+WmIfk+HI!ts@rHnNiqg&3fs*=QhqKr0grd+Wjqfr-dr-/3e
+r-A?ird=Herd=WjrHeHip3QR^r-\KjqL&!`'mt:PH?j[YGB\+MF)uGGF)c8AC2.J^G63,;?2e1.
+>mObB?!LW=>?kG2?2\+,?NON=ZMq3,>l@t+>l@n,=oMV->$5!4q-*f$"J3WRaN4A&qTAfZ!6G/2
+s.JqVpS.Y_qka4frMBOkrho4^rhfdobl#Zab5KHZb5]Z^b4EdVbl5lYc2c,gbl>lcaoKN^WWB0%
+riH7)YHRr0!O8s0Zi@B4[JmW7\,Wu;\H9@S]DfJC]`>eG^]2+L_>_:V_o0L4`Q#p<rl@7Eb0%oN
+bg"DXcHjkadF$CkeC<%!f%8O+g"P07gtgfChV[8LiSrnXjQ5OdkNM-ol0@U$m-X3.n*fc8nc&(\
+oCV\Sp&F^cp\jmdq>^<gqu6NlrU^#>s+14&s*t~>
+JcC<$JcCo5k5P5Ur;?EgrqcWir:p<drq??as7H?_rpp*Z!:]sU!Uf@Sm/QAOlMg#Qki_-kk2k^c
+ro4%=iVqa:hqm5hM?&M2MZ8V7MZ/J3L]E5-LAlo,K_^6%H@&KeKDgK'K,B8oKS@(O]=PP`\@8oT
+[C!9HZE^X<YHG"tIKb.I>$G-4r`B/'rE0)#rDs;9?sR#@>$GHFA,]s;@0pFPA7K1M<)ln@repf3
+!JlL0L&Zf-K7\aSJJ`lSDf]>tARoCaAn,:Z@q9+]AnPjnDfp3fG5l[eG'.tOrH/3aF)l=#F8p:[
+EW9tXDu=SSEW:(ZEVa_UEW:"VDu=MQDt7f=D?"MJD>eAMD?"MQD>nDQD>S5MDuFSBDuOYSD[16"
+DJj<.DJo2er,2OQrb_[OrG2FI%qo]mBkM-n@U`bZB5)'p;Z0Mo;Yj>l;?0Sj;Z0Jl;?]uu<)\^5
+rf$\Os&8blrD<Sl;>jDl;>3lgKTqbuQN!0JQ3!><r.k6,s+gQ/!JcF/L]<2+M>iD1MtW%oMuJY9
+MjX4)qNq8Lq3L$,rK[GKrKR;]!NW=$XTGZ/YPta,Z*OA8s0Md6rjMj9s1&'=!kQ"Urk/9E!5AHI
+s1nZNrk\oX`5KX6`l?'ua?@Yfb0.uPc-=PZcd:%ddF-LneCE+#f@S[.g=k<:h;-rEhr*GOioB([
+jlY^gkih9qlKdg'mHs?1n*oi:rpg-^o^r.Us7QHerV6Bfs8)Wirqu`noDX=@JcFC&J,~>
+JcC<$JcCo5k5P5Ur;?EgrqcWir:p<drq??as7H?_rpp*Z!:]sU!Uf@Sm/QAOlMg#Qki_-kk2k^c
+ro4%=iVqa>hqm3k<`W6"<Wc?$<E8oqrDiVnq,IMt8kV_R;>sGq<)Z^pr_id/'"b`c\[],W[^EKK
+Za-j?Yck43nPfHcr'LTQ6:+%+r^-ZPr]qPl1,1F8/hS\21,1L>0f([E1c7*I5!(kh7S6?H8cD?^
+8cM<q7n?0@7R]d87Puna9M8)T9MJ8V9`@cl:JFVZ9i"Vbh,45Mqb[,brD<GirD<Dh!)W,]rD<8b
+rD3Pk:f.$b!)WGf!)WVi!)WVis%`Jfpe^ob!)`_lmS<j[:[([e:Jate;c-Cj;H$Fh;Gg7h;Z9;f
+7g;OU4[)%o557;@497T/qEOj@s$$QK<E9$!!($KHrBL?IrBU3FrBLHN5X@[65Q="K56=b_<W6%k
+<W#ej<;ons<rZ8#=TDS%=8uD#=TDRt=8Q+u=oVV#=8lA&=92K%qGR;i!`DrqqbmAi!`DrrrDWMi
+r)*Dh!DcJi9`\!boMGOe!NW=$XTGZ/YPta,Z*OA8s0Md6rjMj9s1&'=!kQ"Urk/9E!5AHIs1nZN
+rk\oX`5KX6`l?'ua?@Yfb0.uPc-=PZcd:%ddF-LneCE+#f@S[.g=k<:h;-rEhr*GOioB([jlY^g
+kih9qlKdg'mHs?1n*oi:rpg-^o^r.Us7QHerV6Bfs8)Wirqu`noDX=@JcFC&J,~>
+JcC<$JcCu7jo5,Tr;?BfrqcWir:p<ds7ZEas7?<_rUL$[nF6GG!q,ICrp0[OlMg#Qki_-kk2k^c
+ro4%=iVqa<hqm2FWVrb"WN)qtWMl`oV?3TiV#6tjU7n9RTDkG^SH,2ZS,\oZR?F%@rhLR2Vl6Sn
+W2?DfVRsFM\[],W[^EKKZa-j?Yck43XmhVZI!0.6Ac?-H@preP?XR8K?sm>Ira,e9@qK:_raQFI
+@:E\S@:3PP?t>J3\[MCA+L/5VY,n\(X/r:`R#n)XEH-#>F)5T+D/aH4F*MqXKSK8W!/C-$!JZ=+
+LAuu-K`$E'JUi:LJcC?%JHC@OJ,+WmIfk+HI!ts@rHnKhr-A<g!."KgqKr3hrd+ZlH2DjdH2i*k
+H$FRZr-JBjpj<$e!.4]mr-SEhrHn6aqKr0grHnBgpNupfrd>?(H$Xa[G'J4SF`MSIF`_\Hrb;[R
+G'e^jJR2[]?2n72?2n10>Q7t+?2\+,?NOQ>ZMq3,>l@t+>l@n,=oMY*=TM]1q-*f$s2G,\aN4>%
+qo\f-!M?%\U&Uk_U&(JbUSO^`V>I.gV>mFkVsgM_VuP!Abl#Zab5KHZb5]Z^b4EdXbg"E'c2c,g
+bl>ldao]\`WW&n&X/rD)Xfeh1ricI/ZEjJ9!joACrjMj9!4`$=s1/3BrO`3F^:sT]!l2Xgrk\]R
+`;[aU`WaE(aN;QHrl[%?c-FV\cd:(edaQ^qe^`7&f@\d1g=tE=h;7&Ii8N\Tj5]4^k2tjjl07Ku
+lg4!*mf)Y[nF?&>o(2JFrq6<bs7cKes7u]kqtpBjr;H9eJcC<$f`-I~>
+JcC<$JcCu7jo5,Tr;?BfrqcWir:p<ds7ZEas7?<_rUL$[nF6GG!q,ICrp0[OlMg#Qki_-kk2k^c
+ro4%=iVqa>hqm2FMMd8gM?&S6MZ8P3L]E5.LAci*K_^6'Joc99K)L?$K`-N;KY+h+\[],W[^EKK
+Za-j?Yck43XmgcC?!:H8=]bT*r)a)'=BAO)rDj#%=BAT'<WlN+<``B!<<I<$Mi7Ohre:B*!J5t&
+JJN]PE,pAaAn>RcB4GC[@q9._B4u'uF8^7YFoZ[TG4p%\FE;JCrc8'[rc.sWs)7gSs)J'Zs)ImU
+s)J'XrGVUOs)7IGp20eHpMKkHr+uFOrGD:HrbqgS!c;gmq/?1KrbqaQ$#ad%Df0H0D/O7cDu=MQ
+DuO_UD?OlpCi!ncCB%rLC1h6qraH%>BPVI*E;if8;Z'Jn;?0Sj;Z0Jl;?]uu<)\^5rf$\Os&8bl
+"]8)n;,C-g;Z9Pf;#ca[Q26gGQ2d0GLB*/-LB`QkM26tCL]*&-M>E,.MtW%nMuSb9R/iWJQhm'L
+Qhcs,Qi33MQ2[!KW2]cr#HOr-Xf\b/YPta-Z*L\7ZN@MA[JmW7[fEr;\c95@]D]AD]tV5[^B23e
+_>_:P_o2Pns2G5_aN2KFb5TR=bg"GYcd0tcdF-LneCE+#f@S[.g=k<:h;-rFi8ESRioB([jlY^g
+kiq?slKdg'mI'uB#Oq9Ro()DDo`"O`pAamcq#C0iqYU0hr;?Ncrdk*#s4I@%~>
+JcC<$JcCu7jo5,Tr;?BfrqcWir:p<ds7ZEas7?<_rUL$[nF6GG!q,ICrp0[OlMg#Qki_-kk2k^c
+ro4%=iVqaDhqm2F<`W4$<E)st<VTPm<W?,!<W6%q<W6#$<CBGLr)*Jlr)4;-]=PP`\@8oT[C!9H
+ZE^X<YHG"0n5BH@-pp?ir'CHP6::`=4$c5$5sRb%69mb"5!D1r5<_:r5X.Fr4?Pbs8kVcJ8P2TH
+8OuBB7n?*<7R]a'1-Rod9he;V:/">V9`@cd:'49g<`/Wi!)_fT!)`Yjq+prcrDEPjqb[>inkfHb
+;,R9gqG.,e:]=2j:]F8g:B45d;#jGl:]F8j:]F2f:\R]a:]4,Y:]F5k:[1dU;%QQ":esnb;c6Li
+<)?Lm;c6Tn8d@gV8kVc?5<ej*s#^<F55IM@56!hK5#kV^<WGG_5Q*hI5Q*kD62<eE5Q="K5Q=[_
+<W6%o<<-"p;u'Dj<W6#%='/U.=Sl2"=T)D&=Sc+n=T)D%=Su7u=T27q;Z9Mp;H$Nk;Z0Go;H$Qo
+;ts8h;>a5j:]=)g:&n)_:][Mori-4(XK8P+Y-+u-YQD)8ZMq03['d=@[f<f:\Gj&=\cBA@]E5d\
+^AbkK^qmkd_?%Qmrl+oW"in^*aiV^)b;%5ccHab^d*^7he'umte^i@(f\,!4gYCW@hV[8LiSrkW
+j5f=ak3(sml0@R"m-O--rpL*]naZ2@oCMVRp&Facp\jmeq>^<gqu6NkrUg)?s+14&s*t~>
+JcC<$JcD#8k5P5Uqu$9erqcWir:p<ds7ZEas7H?_rpg-\nF6GG!q,ICrp0[OlMg#Qki_-kk2k^c
+ro4%=iVqa9hqn@grhfaprM]grVuERnV>d:iU]7%jTqJ'NrLX%[!1a%Xs-itT#\]ZtM56rDW2KTm
+(8Rh)\[f5Z[^NTNZa6sBYct=6Xf\[io9LDFG("abIqN5#@UWSL?t!DM?sd2I?t!GPAn>O`A,Kg8
+@4Ykq?t5;/\[SrP['[0GZ*LU;XK/A&WMc/IUU?GEO)f;\CM@^+EH$)HH@^eKLA6N(L@g6$LAlo*
+L'!'^K`-N&JcC9!JcC?%Jc:/oJGt&uIK=hErI"NirHeBeq0Mmas*Xfms*=Zjr-86e!-nKg!dK!9
+rH\KkI//-fHN&<hHiA?jHhD^^HiABnI=2!?qgA*a!.=Zl)Ld*ZH?sg\GBS1RF)uAEEd;b?Bl%R&
+E,TT"rE]G0!+#G+r*B8-rEoP1!O8s0Zi=>/>l7n*>lIt-=oMY*=TM]1q-*f$s2G&ZrlG&[s2tA4
+qk!h[!204_rM'7as.BIfTV8(WUAq%eV>@(fV>mFlVs^DaVp3K1qof#^rQ4rZs3(;^o?.3Zc-?13
+rQY8cs3:SfrlY;arhfdqWW&muX/u<&s/l@*rilF-!4)U1s0Md6rjMj9!4`$=s186Brk&<G^:sT]
+!PlPN_Z.LR`;[^V`lJ)"!QiL`b7;b@cHab^d*^7he'umtf)F8Hf\,!4gYCW@hV[8LiSrnXjQ5Od
+kND'nl0@U$m-X3.n*fc8nc&(\oCV\So`Fj]p\jmeq>U6gqu-HkrUg)?s+14&s*t~>
+JcC<$JcD#8k5P5Uqu$9erqcWir:p<ds7ZEas7H?_rpg-\nF6GG!q,ICrp0[OlMg#Qki_-kk2k^c
+ro4%=iVqa9hqn@gre^K/re^Q/r.b-'re1*"s+1>LH@0`3KD^B=K7\c0\[f5Z[^NTNZa6sBYct=6
+Xf\[Qo6q0U>$YHA@TQZ7=BAU+=B>E&!a&K(rDs>.='&F'='&F(<`])t"EKH[Mhq@fre:B*s+;2@
+JUr8uDfU5ZEcH86An>I]A7T7`BPVI*FT$=`G'.s)FoZ[TG5-4[F9$C\ErU1\ErL(YDuahRE;sqW
+EXHf,EcH,>EcH)<E;XYOD?+VHDY@rGD?4Tlq/-(Js(qjSD/F1gD>A)JDuOVRDZ"GKDZ4SRDZ=YT
+DujlprbVXQp2BnIrGVUQ!cDjmrbW9aCM[d#BkV3nC1q$b@UN\U@UT16s&/hprDNVlr)3Jjr_i\n
+s,6l8!)rbms&8_k"Ahrm:f70hr_`Dds-*MKqNh/HnV7+#rJC?+s,$Q/rJUB,l&,Y&R@0H8Qhm'L
+Qhcs,Qi33NQ'D9G!N<!sWWB0%riQ4'!3cC+s02R0rj2X3!4Dg7s0i!<rji'?s1A9C!kl=^rkAKL
+_>_=O_Z7XS`<"!!rl>,^b5TQobg"GYcd0tcdF-LneCE.Lf-K#%g=k<:h;-rFi8ESRj5]4^k2tji
+kiq?slg4!*mI'H3nF5uIncJFTo`"Lbp@n=[q#C0hqY^6hr;HTdrdk*#s4I@%~>
+JcC<$JcD#8k5P5Uqu$9erqcWir:p<ds7ZEas7H?_rpg-\nF6GG!q,ICrp0[OlMg#Qki_-kk2k^c
+ro4%=iVqa9hqn@gs&B)!<VKJm;uT_s<EB&us&Sqqr`9&!"B6gB92>I`rDFJ3;c6Rm\[f5Z[^NTN
+Za6sBYct=6Xf\[&o2>iE.P!&&/NEVo%mrWK6:+%*5X@\&5X.Lt55mbr5!M7s5<_7o4$?&+91hcI
+8kMZH84Z6A84H$;7R\pm5<^qo852oS9hS=^:&dri:K:<k;>=#h;<1UT;>a8d:]4)j;,I6h!)WPi
+s%r;as%r_mrD3Mj:Amug:'+3f;#X8j;#=&_;#jGl:B45i:]F2f:\R]a:]4,Y:ZkRO;&`>,:Jjqe
+;,U4h;,gFl;H$Fa8kDWI9gh?55!Jd*s#g<EqEOa=s&K&!!C9!K5PRMC5la7N62<eE5Q="K5Q=[a
+<E</s<VBAk<!$'!<;T\n<rZ8#=Su8#=T)D&=T)=g=Sl1u=T27p;Z9Mp;H$Nk;Z0Go;H-Wp;ts8h
+;>a5j:]=&i:/=[[;#[?nW2]cr!NW=$XoGO(YPtd+YlM*/Zi@B4[JmW7[fEr;\c98@]DfGE]tV5[
+^B)-drke]Q!6"lU!QN1Za8sE*rlYeqc-FV\cd:(edaQ^qe^j`O,hUf(g=tE=h;7&Ii8N\Uj5f=a
+k3(pkl07L!m-O-,mdKW6nF?MK!qZ'Vrq-?dp\4X]s7uZjr;6HjrVcBfJcC<$f`-I~>
+JcC<$JcD):k5P2Tr;??erqcWir:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp0mUlK[Wukih4/joOT)
+ro4%=iVqa9hqn@g!8RILs/>sqs/#dmrM9Ffs.]Od!2'1\rgbR0S"#k8R@'A.QBRe=UnjiaW2Q\o
+WMZMg\$i`Q['R*EZ*:I9Y-"h-X/_HXQ48:dI=6HjB5"EKW23j-ra?7D?=.#I@:*JUA7]7]A,Kg9
+@4bqs?t5G3\[]&R['[0GZEg^<XK/A&WiDS]XF,kcEcc;<C2S!1Ecu\TJqf#6r.b$&reC*$!/CK,
+s+^N,!ec2Yrdt#u!.b$!!.b&uq1/En!IfIpI/A9hHMi'aHMW!gI/eQmHMi$^H2N!aHi89jHiJKk
+Hi89iHhMd\HN8HkHhr-aHiJKkIK+cpJ,X^-H?jXWG'A"IFE;PIBkqBsD16MDNrE>a?3":/>QJ&6
+r*B8-!af>Br*BB/rj2W1r*9/*r*95*#[1A7>?b65>$Lf+s&oBA!6>)[s2k51qO[_Z!201^rhBCc
+r1O(`r1X4eV#7(cVYm7jVZ*L_VZ3RmblGubbQ#``ans6\bPTHRb5fcbc2Q#ec2>leblGudb5nH:
+rhfdqWW&n&X/rD)Xfeh1rilF-!4)U1s0Vg6rjDm;\@DOK!kQ"Urk&<G^:sT]!PlPN_Z.L``5T^8
+`lH0AaiV]KbKS61c6gladF$CkeC<%"f@S[.g=k<9gtgfChr*GOioB([jlY^gkiq?sli-5OmI'uB
+!V#XYncJFTo`"O`p&Ojcq#:*hqY^6hr;HTcrdk*#s4RF&~>
+JcC<$JcD):k5P2Tr;??erqcWir:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp0mUlK[Wukih4/joOT)
+ro4%=iVqa9hqn@g!o/WhrJCT3reg`4r.t<+qh>$&q1As)K7ec,FF-i9re(-%rdtim[^NTNZa6sB
+Yct=6Xf\\*WdXPh!FAt/?3t%A<e5gMHWX<LrDru"r`9/%='5E&"^"i,=&rB!<<RB%N/NPlL]<&1
+L4k54rdkE,IsZ?aJSB+JralRL@q0%\Anc!uEclMHr,i'aF`mV*rcRdTpiQX[F*%;#s)\0Zs)A!V
+qf)OS"EJL%EcV(ts)@jRm;DW7qJQ+Grb_^QrbMgVDJj<.DJa7dD?=`oDZ+DPDZ"GKDZ4SOD?+VS
+DZ=SRDYJ)IDZ"GLE!^N%D/O0,CM[d%rb2LMBkh*dra?"HA7BIU;H!KmrDNVlr)3JjrDNSm!/pi8
+qGR>lqGIGn:f1(dr)3MkpJCmS!1!JJrJ:$"s+p]3pk\s,regZ2s,-c5p583ps,?oE!1<GGqNq8L
+q3L`@rg*&?s-EYL!Mu[mVZE`qri-4(XK8P+Y-+u-YlCs.ZMq31[/[Q5[K<qJ\Gj#?]">TR]E5d\
+^AbkJ^qp#es2,>b`Poj:a2l?Dai_fMbg$.4-I:&ddF-LneCE.%f@\d1g=tB;h;-rFi8ESRj5]4^
+k2tjjl07L!rp0[Qmf)YUnF?MK!qZ'Vrq6<b!;HHerqZTjr;6HjrVc?eJcC<$g&HR~>
+JcC<$JcD):k5P2Tr;??erqcWir:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp0mUlK[Wukih4/joOT)
+ro4%=iVqa9hqn@g!Sg]Q;ufko<;ohr<;TYq<qfSo<rH#%<)QR]91]"Yr_ibqs&0S/\$i`Q['R*E
+Z*:I9Y-"h-X/](j;[Y-+.kN>*3&X,i5X,07r]pTP5sbK:)*pJO5!D1r5<_:r5X.Fr4?G\q91qlK
+8P2VS8HVLR84`_L#t6[75!;A)7nleV9a"3c:/4jc;>F,h;<:^U;>sDe:]4)n;,C(d;,I0fr_W5a
+r_WVlrD<Mhr_NMg!`)Whr_NPjr(d;hpJCoeq+q#c!)WViqG@#arD;rY!DlSV;#!lf;#X6-;,C4i
+;,^7f;cQ^n8P2NF84Gs63'KJg55[SD4T@S@5PI>A<W6&!5l<k@5lX+M6N0:H5l<hN5sIS5<)lut
+<<-"j;uTbs<r#bn<WH5#=Su8"=T)A&=T)=k=S>hr=Su+n;Z9Mp;H$Nk;Z0Go;H-Wp;ts8h;>a5j
+:B!rg:/CU\!Mu[mVZE`qri-4(XK8P+Y-+u-YlCs.ZMq31[/[Q5[K<qJ\Gj#?]">TR]E5d\^AbkJ
+^qp#es2,>b`Poj:a2l?Dai_fMbg$.4-I:&ddF-LneCE.%f@\d1g=tB;h;-rFi8ESRj5]4^k2tjj
+l07L!rp0[Qmf)YUnF?MK!qZ'Vrq6<b!;HHerqZTjr;6HjrVc?eJcC<$g&HR~>
+JcC<$JcD/<jSo#Squ$9erqcWir:p9cs7ZEa!qc*Urpp*Zs7$$V!Uf@Sm/QAOlMg#Kki_s-!TiDA
+irS/urnmh7hYu=3gtV_("fA2qVPU-gV#@(gU&q$\TDP5[SH>=NS,SiVRJ`BVJsoc<Unjibr2:4'
+V7*e=Za6sBYct=6Xf\\*Wq;SjH$t*gI:m2oXf/+oTU_C:@:!;IrEok@AS#C_@q/sG@LHs\?t!TB
+\[f5XZaB_<)mZ`RYHFq,XGWF,\sA/7FEDJ?CMn-3EclVWKDpT)LAuu+LA?W(LA$B+L4t;6KnfS\
+s+CB)rIXots+(*"rI=WnrdXrs!.Fcmqg89fr-A*aqKi9kH[Ga<!."Ker-A<grd"Kh"F5<?H[>[<
+qK`0hI/A9iHMr3aHMMpfI/J?fI.r!fI/JBmIf"WpJ/`i[H[0mYGB\4QE-?AKCM7HsCi+E<DN%k-
+?=!M7s'#J.r*B;."(,GD?i471ZN%63>[@53rE]>+r`]Y3=^#$6=]np4q-*f$s2P)ZqjmSTrh'4`
+qP!n_s.T=_s.TCc!McIgV>6tgV<FcWVp,+a!6kAarlY2]qo\r^qo\NR!6kDds3CPer6G>e#L(B7
+Unji`VZ*IoW2]crs/Q.$riH7)YHRr0!jT&:rj)[5[C-"Bs0i!<rji'?!5&6C!kl=^rkAKL_>_:P
+_o2Pn!QN1Za?I_gbKJ,Sc-FV\d*^7he'umtf%8O+g"P07gtgfChr*GOioB([jlY^gkih9qlKdg'
+mI'E2n*ol;o()DDo`"O`pAamcq#C0iqYU0hr;HTcrdk*#s4RF&~>
+JcC<$JcD/<jSo#Squ$9erqcWir:p9cs7ZEa!qc*Urpp*Zs7$$V!Uf@Sm/QAOlMg#Kki_s-!TiDA
+irS/urnmh7hYu=3gtVdbre^Z4re^W1s+gW/q1\g$pO`Htrdb,_H;ONlrIbf9JqLM>['R*EZ*:I9
+Y-"h-X/bf@%pWCI?=6i8JqAGuH?XLREr9#=<WQ9(pfIJr$!C8.<`OX.N/NSmM#W/QL4k23JqAQ)
+C2e0KE,g)6B4b[a@qB4`BkhU,F`heKF`_a(Fnp4[Fn9eOFoQR`F8^.ZF8g1ZE;skRE;jhZEcH)>
+qf2XTqetk>pMKbErGDRPrb_XPrG2OPDJoAhqJH:Orbh[O!,h^QnS\AFr,21GrGMLNqJcFR")r0q
+DuOSdChmg"BPM3p@q&qV@Uj%]@Vo$B;uKVn;>a>j;>jDk;ZMaTN;6?O;u0Ap;,C+e;#F5j;>3oe
+PQ@&8reLH.nV?ams,$c5rJCH0s,6]1l&,S$R/NEQR.ZgBQiNKKQM-[EQLL7@Q3EPLUnsobrhfdq
+WW&ptWrT7#XTGZ/YPta-Z*L\7ZN@MA[JmW7[fEr;\c95@]DfGE]tV5[^B)-drk\]R`;[^V`lJ)"
+50:sjbKS5UcHab_dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^k2tjjkiq?slg4!*mdBQ4nF?&>
+o(2JFrq6<bs7cKes7u]kqtpBjrVc?eJcC<$g&HR~>
+JcC<$JcD/<jSo#Squ$9erqcWir:p9cs7ZEa!qc*Urpp*Zs7$$V!Uf@Sm/QAOlMg#Kki_s-!TiDA
+irS/urnmh7hYu=3gtVd,r_r_or_reqrDikupJh8q<E/rt!*&qq"$&tC;Z0Jl;A3#.;H($3['R*E
+Z*:I9Y-"h-X/bej!%Rt!(G7X(6U="%4?P\e3C,tt6:!q'69mb!55mbQ5!M7s5WM"i4?`[:"A23V
+8kT(S"%YpQ8H)'b2)7<[1Iao1:JCa^#u42i9hnG`;,L0c;>F,h;<1UT;>sDe:\mo`;>sDb;>j>k
+;>sAn:JO[a:]=)i:Jh!c!)WPg!)WVks&/em!)WJe!)EGfqb[&`r_W&Zk>:qNqbR\r:f1%f:K(1i
+<)lmqr^mGf91_T@6T.(kpc\I<pHARWr`0%c5l3e@5lX+M6N0:H5l<hP5sIS5<)lsu<:a&g<;oqq
+<Vfbr=8l;%=85nt=TDS&=8uD&=o)7j<rcA";u'>j;$'Wo;u9Jk;$'Zq<;ohk;Z0Jk:]X?er_3Dg
+:\dieV#R7kVZ*IoW2]crs/Q.$riH7)YHRr0!jT&:rj)[5[C-"Bs0i!<rji'?!5&6C!kl=^rkAKL
+_>_:P_o2Pn!QN1Za?I_gbKJ,Sc-FV\d*^7he'umtf%8O+g"P07gtgfChr*GOioB([jlY^gkih9q
+lKdg'mI'E2n*ol;o()DDo`"O`pAamcq#C0iqYU0hr;HTcrdk*#s4RF&~>
+JcC<$JcD5>jSnuRqu$9erVHNhr:p<ds7ZEas7H?_rpg-\nF6GG#O_!Hm-O'(lMg#Kki_s-!TiDA
+irS/urnn.@hVI#CgtUP[Vl0Nks/,pqV5=0er1a:dT`1S\T)Y>^S=BJG!13PL*L`R8VPU/fVl6Sn
+WMZMuZa-j?Yck43XfSS'Wi;9XQ61BpH[L0QB:c6)Vl$5ZR$O#!MM?\1H?j^HAS#C^@q#@cs*t2\
+?t!UF\HB@LZaB_<)mZ`RYcb(/X.YiM_h3u/FDu/6DfTo?Fa/LjK_pH)L4t?\LA6Q&LAcl4L51P=
+LPLV<re13'!JH+)K)1&tJH(2uJ,=cqJ,XlsIJnQiHi89gH22d_HNAM@rd+Tir-80cs*FWhs*=`l
+H@#O:r-JBgs*=`nI!YL5rd"Qkq0Mj`s*X`kqgA-bs*X`ms*jlqrIFot%siSJG^4FTG'%eKGB7tC
+D#S/RCiXQ6?=$q9>lS".>l7n-?N4C4?iXR3?N7>2ZNFH<>[@;5rE]>+r`]Y3=^#$6=]np4q-*f$
+s2G&ZqjmSTrLa+_qk="`rh97_rh9:b!McIhV>[:hVs(#SblGucbQ#`_ans6\bPTHRb5fcbc2Z)e
+c2Z)ebm;P:U8+N[V5:'gVZE`qri6"!!3H1%s/l@*rilF-!4)U1s0Md6rjMj9!4`$=!kQ"Urk&9F
+^Abk]^qmk(_Sa:0`Poj;a2l?Db0.uPc2Q!7cd:(edaQ^qe^i@(f\,!4gYCW@hV[8LiSrnXjQ5Od
+kNM0plKeH9#4:jIn*oi:rpg*]o_nFap@n=[q#C0iqYU0hr;HTcrdk*#s4RF&~>
+JcC<$JcD5>jSnuRqu$9erVHNhr:p<ds7ZEas7H?_rpg-\nF6GG#O_!Hm-O'(lMg#Kki_s-!TiDA
+irS/urnn%=hVI#CgtUQ^MZ/J3MZ8P4M#W80LAQ]&K_^9"K)C0'H@/tMKS0/T&V>YAZa-j?Yck43
+XfSS'Wi:F@IMlBm?!^i>=*]CHI!U*^FE2>:BOtX]?!LQ8qcEf-$XmLT<E3(#Mi<UQM>i>2K`Qp^
+rdtr;JUqrdHAuccG%PAr@q9.^BPM=%ErL1\FoQObF`_a)Fng.YFo$7bF`qqNG'<Y's)\6^r,N'a
+EcQ/>E,]`6qf)IQ!-8$X")r7"E;FM?DYS)EDZ4MQDZ+GPD?+PQD#\>PDYn;JDZ=YSDZ+DPDZ"GC
+DZ=YQDY\5NDuahSD?4ZnrGVRPrc.jT%W?6&Ci+$)C2.EqBkM-grF,k=ARo9L;uKVn;>X8j;>jDk
+;ZMaTN:BdK;,C+e;#F5j;>3oePQ7$JL]*%uL\?Q'M>rJ4L]E;1MZ8V1MWp&qR/iWIQhm'LQhcs@
+Qi<<?QiE?UU8+N[V5:'gVZE`qri6"!!3H1%s/l@*rilF-!4)U1s0Md6rjMj9!4`$=!kQ"Urk&9F
+^Abk]^qmk(_Sa:0`Poj;a2l?Db0.uPc2Q!7cd:(edaQ^qe^i@(f\,!4gYCW@hV[8LiSrnXjQ5Od
+kNM0plKeH9#4:jIn*oi:rpg*]o_nFap@n=[q#C0iqYU0hr;HTcrdk*#s4RF&~>
+JcC<$JcD5>jSnuRqu$9erVHNhr:p<ds7ZEas7H?_rpg-\nF6GG#O_!Hm-O'(lMg#Kki_s-!TiDA
+irS/urnn.@hVI#CgtUO]<)iiqr)E\prD`brrDrkss&T%ts&B"uqG[Vj91i&Z;>jDm<<#nsZOO4F
+Yct=6Xf\\*WiE$rpJW.`-nQu%3&Wue5sIIq4$,G^3&E?F0J=t/5<qCr5<h@11^,[!4$5Z%r_!5_
+r_!/]"%YpP8H)'a1I")f77TpF9`@cc:B+)q:/b"d:f1(d;#X>l;?0Sh;Z0Jh;?0S];?B]l;"d]^
+;#4&e;"dcb;#aDl:]aEf:B"&g:'"-ep.kZbr_`\nr)*8cs%`JfrD<2`r_NVk;"7?F;"mic;#aB'
+:esn`:Jjtf;,L4g;cHUnr^mAd9M%T?69b0-qEO^<!*0#!!C9!J5PRJD62j4N62<eD56X><5?(T_
+n5B?e<W6%t<W?,!=8c2"=7o\q=o2=t=oMM(='5&qrD`_oqGR8h!`DrqqbmAi!`N&tr_rSirDEMi
+!DcJi9`\!bqG7BjUSO]^V5F6i!N<!sWrK+"XT#@%XoP[)YlCs.ZMq31ZiIN5[f<f:\Gj#?]">TR
+]E,^[rkB/__84"*_o'F3`Q#s=aN2KGbKJ,Srluh9d*^7he'umtf%8O+g"P07gtgfChr*GOioB([
+jlY^gkiq?sli-5TmI'H3nF5uIncA@SrUg6cp\4X]s7u]kqtpBjrVc?eJcC<$g&HR~>
+JcC<$JcD;@jSnuRqu$6drqcWiqtU3cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA
+irS/urnn+?hVI#CgtUQ:g&7cNVl$>fV>d:hUB70`T`1S\T)Y>^S=BJGs-WhSqj7SMRolP`Uo!se%
+]$D8Yct=6XfSS'Wi;qppm)tJFa\XbI;!2oWMcYiSX>_.Nf/XEIsQ?_Fb#!kIt@TJ#(M5WJm_tsr
+j`-?[Bm7>ZQ6?VZ*:C5XJhn[Y*Os5O)o>XDfTo?G'S^mKnY25qh5$)re:?+s+^`3LPLV>r.b0*s
++U]4L51P=L&Qc'K`QjZrdsutr.+]pr.+`qrdOfnq0W'drH\3bq0N-iHiA<kH2DjcH2`-dH2i3iH
+i/3hH2i3jHN8BaHh_pXHhr-fHiJKmHiJKkIK+coJ,XusIfk4NH[>[:"a,$5FE;F#FpVr!BkqO2E
+Gf)hrETA,!*oJ.ra,V3s'Ph6r*KB.!OH&1?2\%,?2Rt,>6nD8>$G05=^#&*>5q_-`lH,%rgikVr
+h'1_qP!k^!29@arLs4brhBIhrh]RjqkjFkr29"\prrZZs2t;^qTAi]qo\QSs31Gds3CVgrQb>cs
+.K[lUSFW\V5:'gV['0"WN)u!X/u<&s/l@*rilF-!4)U1s0Md6rjMj9!4`$=!kQ"Urk&9F^AbkJ^
+qp#e!Q2kT`@]*MaN2KGbKJ,Rc-FV\d*^7he'umtf%8O+g"P07h;-rFi8ESRj5]4^k2tjjrojUOl
+g4!*mf)YUnF?MK!qZ'Vrq6<b!;HHes7uZjr;6HjrVcBfJcC<$g&HR~>
+JcC<$JcD;@jSnuRqu$6drqcWiqtU3cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA
+irS/urnn.@hVI#CgtUQ:fo#ccreg`4reLQ0rJ(6(qh4ctrIXot!ciWarIb$$%tfJ>Z*:I9Y-"e+
+WiE%sVtb]`>Zk?=?XQr9Jpr)nH?XIODes-"@piVI>$59C@:<YS@fBjDAn4nA<f;oqMi%Fhs+LK.
+L&HW1JU2K^JT>dYG\@"d$"da^C2J!3FEDU&F9?Z-FERS)rcS6a"Eem2Fa!\*qK<6hG'8"OG'.qL
+F`hg*FTQZ+F8BqVEW:"XDu4MOE<(%YEW:"XEVXP?DYe5EDZ=SQDZ+GPD?+PQD#%rED?=`oDYn;L
+Ds;08DuXeTDuX_TDZF\SDu+GPEW'kVE>`e:Df0E1D/F')Bk_<qBP1d_@:E\ZA78D8r_i\lqbmDj
+rDNSms,-r;ND]7E"Aqum;,I6i!Dubo;>3ljPa.P1LPPhamt^[oqhb9-!f;ekp58*mq3_5Mp6YTB
+!13MIpQtiEn<a0K#GRugUnji`VZ*IuW2ZbrWiN2%riQ4'!3cC+s02R0rj2X3!4Dg7s0i!<rj`*A
+]=\'T!PQ5H^B)-drk\]R`;[_-`lH0Aai_fMbfn>WcHjkbdF-LneCE.%f@\d1g=tH>hV[8LiSrnX
+jQ5OdkNMp0"mYF?m-X6?mfDqJrpg-^o^r.Us7QHerV6EgrqcQirVZWmo_sFAJcFF'J,~>
+JcC<$JcD;@jSnuRqu$6drqcWiqtU3cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA
+irS/urnn+?hVI#CgtUQ:g&4kI<<#nq<!$'#<W,tt<W6%t<W5tq<Vo_t6qTsIr_`Vl&6)S+ZE^X<
+YHG"/X/`2!W2KDh!\>cOr[emF1dODl4[(ti3]B#S2)?p>/hJV.1G\qcs"js:1c7-R3^$:<9*7aX
+91o1T(J%%c7n6$,2*O/[77p<M:JOVZ:/"DX:]=8n;GmEi!`;cjr_`\n!)`_n!)`\mr)*;g!)`,]
+!`;cjp.tQ^qGI5g!DcPd;>a8j;?'Go:JOX_:]=)i:Jga\r_`YmrD<PkqG7)cr(m>hohYN_mSE%C
+q,.)es%rbmr_F>,;,C%`:f((f;,U@m;c6Id8kMZI7RKQ<4o.D;56"X_<WPKOq`jj@!($TNs$6ZN
+5Q!bH62a"Q5X@Y"<)lsbnl#Qg<W,qu<W6%t=8u>#=8l>%=nPnf=oVUr=8>eq;u0Dk;$'Wo;u0Dj
+;$'Zq<;ohl;Z'Dj:]aEf:&[lf:]+&hTa.<eUSO]^V5F6i#H4W$WiE,#XT#@%XoP[)YlCs.ZMq31
+ZiIN5[f<f:\Gj#?]">TR]E,^[rkAKL_>_:P_o2Pn/]PiPaN;TJbKS2TcHab_dF$CkeC<%"f@S[.
+g=k<;h;7&Ii8N\Uj5f=ak3(t-klpA<m-O--rpKmWnc&(\oCV\Sp&F^cp\jmeq>U6gqu-HkrUg)?
+s+14's*t~>
+JcC<$JcDABjSnuRqY^-crqcWiqtU3cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp13^lK[Wuki_-kk2k[b
+j5].Xrnmh7hYu=7gtUQ:g"?5"rh]UirhKLf!29=_qk!hY#+V0PR[KS2r0dGL#+J\cVPU/frMU1)
+VQd8,Xf\\*WiE%sVtlVoI<KpbI=>a>Xf87qURmm>Q][/\KRS:IGQW,=J:@HH$@[PXJ72hqVRa7H
+rNuU2!4)U/'X+WuS!(FKLQdpDFE28=EccPOKS98Ws+L-#reCH.!JZC)LAlu*L&cr+K`$N(K`6T!
+JbsurJ,FirJ,OipI//-fHMr-bHMMmgI!bj=!."Kerd"Hgqg&3frd4Qhr-8BjH[C)3HhVjWHi&3g
+Hhr-fIK+coJ,OosJ,Fg5I!^-bH?jXXG][nIF*;>6CMIU#E,gkCr`oJ-s'5P/ra,V3s'Ph6r*KB.
+!OH&1?2e+-?2In+>6nD8=^,'4=^,,+>5qb*`WF1_SbSfTTDkM\U&C_cT`Cb^U&UkdUB%+hV>[:j
+VuN^kVt[(fVuERebQ,icao]c/b5KHZb5]Z^b4EgTbl>ofcMl)dcMu/hbl=@9U&UheU].%iV5F6i
+!iW)tri-%#XK;E'!j8`1ricI/ZEjJ9#ILnH[^NZS\Gj$<]">Se]Y2"m^V@S"_8=(,`5KX6`lH0A
+ai_fMbfn>WcHjkbdF-Lne^i@(f\,!4gYCW@hV[8LiSrnXjQ5OdkNM0plKdg'mHs?1n*ol;o()DD
+o`"O`pAamdq#:*hqY^6hr;HTcrdk*#s4[L'~>
+JcC<$JcDABjSnuRqY^-crqcWiqtU3cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp13^lK[Wuki_-kk2k[b
+j5].Xrnmh7hYu=7gtUQ:g"?7[s,-f4s+p]1rJ(<*q1SWtq1AKp"aX!nK7nmSKFEI:YHG"0XK/A$
+WMl`jINDj">[CfH<E=^$I!U*`FE2>;BP:pb?sHo?>%(lK@JjU7AH,X5<e$'eMi%Fhs+LN/KnTGX
+&o2B*MK!KYHY6u&AS5RgCM\!3r,hs[rcA-_qfMg[s)nEcG5-4XG5QI_G5cUiFEM_JF`heJF8KtY
+EH;"ts)7sVr,DCMs)A!Xq/>Y<qJGtE!,_[Prb_XP!,_^O!GuZMD>J,ODf0IjD#eJQDs2*7DuXeQ
+DuOYRDu=SREVsbUEVsheDf0H0DJa3+C2%?qB5;&V@KU+N@rM?Er)*Air_`VlrDW`S",r4:;>a;l
+;u';t;,C+e:f1+g;,[BjpJ;$XQ'P4$L]*%uL\ci%M>`81M=ui(MZA_1MuJ\7MZB.>R/iWJQhm'L
+Qhcs@Qi36?QiE`YU&UheU].%iV5F6i!iW)tri-%#XK;E'!j8`1ricI/ZEjJ9#ILnH[^NZS\Gj$<
+]">Se]Y2"m^V@S"_8=(,`5KX6`lH0Aai_fMbfn>WcHjkbdF-Lne^i@(f\,!4gYCW@hV[8LiSrnX
+jQ5OdkNM0plKdg'mHs?1n*ol;o()DDo`"O`pAamdq#:*hqY^6hr;HTcrdk*#s4[L'~>
+JcC<$JcDABjSnuRqY^-crqcWiqtU3cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp13^lK[Wuki_-kk2k[b
+j5].Xrnmh7hYu=7gtUQ:g"?7%pf%5nq,RJqr)WbrrD`_qq,@Mi78QiZ;>jDm<")^0YHG"0XK/A$
+WMl`k;ZfuM-nG9K+u_AF5sIOs4?GV`3&ENK0etC6/1WG21GUaB1c$sF1Hdc_rC[,^r_*5^*_8dj
+84PQk5!gto7nl`S:/=VY9i+S\<)?Fh;c?Rkr_NSlr_WVlqbdDkrDNMir)3Mkm8<p]r(dAj:Jh!c
+qb[,dr_NVk;#!ob;#aAq:esk^:&Rle:'"-epJ1ie;,R9irD<PkqbR/cmSEgYm8)qBq,.)es%rho
+:J^jar_F2(;H$Fh;H$Ur;bB\S8kViF75mC/56!eG55RS=56"X_<WYQP5lEqA5QF+L6N9=P5X503
+!($QJ#=(R?5?(W`61RqT<)rfrpfIAqs&o%tnQ>iooiLle!)r_lr_W_p;cEQkrD<Vo;cN]oq,7,f
+rD3Jir([5frD<Nes.TIe!2KOh!Mu[mVZNfrWW&n!X/rE%XTGZ/YPta-Z*L\7ZNmkF[C3NQ\%)FJ
+<4]]R]Y(qk^;%Fu^qmn)_o0L4`Q#s>aN;TJbKS2TcHab_dF$CkeCE.%f@\d1g=tE=h;7&Ii8N\U
+j5f=ak3(sml0@U$m-X3.n*fc9nac8BoCW%Ts7ZKerqQKgs8)ZjrVZWmoDX=@JcFI(J,~>
+JcC<$JcDDCjo5&Rqu$3crqcThr:p<drq?<`!qc*UrUL$[nF6GG!Uf@Sm/QA]lKRQski_*jjlGL_
+j5T%si!\H!h;-lAgY1B7f[p,"rh]Ogs.]XiTqV@Uqk!hYs-s1[R@0HAR0&bDRJN9WQ^h0SVPU/g
+W2]cps/cR.X/`2!W2HPjqN`+HI!pBlBP;%ZW2?D`R[BG)Mhct:H[Bs[FanpjrI5'$Jq\ed?t,)o
+\H');[/[K3Z4sOHXf%\XXd>!;G&q_CDfKlFH\-qHL&Zi"L%C&uL\c`*L&H]'L&Zf-K7\^RJH1<$
+JbsurJ,OorJ,XosIK+]iHi89iH2)^^HiJHnHiA?hGlE!dH3/A<HN&3iH38M?H[>[:!.+Qg!.+Qi
+"FPQCI!kj=pNlFXqL&3fqL&3hs*jips+(&tr.+cts*PK,H$FRXG'A%GF`qS;C1h9rF`MC!>lS%.
+>lJ%.?N4C4?iXR3?N.52ZX!K8s'5J-qcs,)#[1A6>?Y04>?go,s&oBA!lnDDpn%GVrh0.^rM'%[
+rM'=e!MlRiVZ3RnW;3@dVZ!FmV=i%4bPfT`b5f]aans6\bPTHRbPTN^c2>lec2X@?T:hjNTq\<W
+rhKRkVZ*LnVuWgrWrK+"XT#='Y-5&.YQD)8ZMq08['d<M[^W`Urj`'@]DfGD]tXK\!PlPN_DK0K
+`Poj;aN2KGbKJ,ScHab_dF$CkeC<%"f@S[.g=k<:h;-uHi8N\Uj5f=ak3(sml0@U6liukFn*fc8
+nc&([oCW%Ts7ZKerV6Egs8)Wirqu`noDX=@JcFI(J,~>
+JcC<$JcDDCjo5&Rqu$3crqcThr:p<drq?<`!qc*UrUL$[nF6GG!Uf@Sm/QA]lKRQski_*jjlGL_
+j5T%si!nT#h;-lAgY1B7f[kt:reg]3reLQ0rJ(<*pk8Qtpk&?n"+Y_qK)UE#KF<F7XfSS'Wi;qp
+Vl'<>**ccU?=?o;<e5^IH['XRE,B<%A7K"R>?Y0=@U]7Fs'l7DAnG%C<c7nq!/gc3s+M;EKnP)2
+KR%]`JTGp_AnP[f@qB@iCiON;rH/'\!-J3]pN6"Lqf_aW!d&R-rH/'\qf2^WErC"XDuahSE;snX
+E;OYSDujrtq/>Y<qJGe@!,_XO!,_[NqJH+Is)7pTs(qjSD/F1iDs;07DZFbPDuX_RDu=SREW'kV
+EVskVEs6N$Df'B.rbDUNBP_A]@glgT@Us"Y;Gp@h:f1*f;Z9Pl;Z0MtMi<US;,R9is&8_k#uOMr
+;,C+f;Gg?k;>3liPa.P1:]6+<L\uu%M>W/0M>)o)MuSb2MuAV7MZ9(=R/iWOQiEHPQhm'LQhcs@
+Qi36AQiEW^T:hjNTq\<WrhKRkVZ*LnVuWgrWrK+"XT#='Y-5&.YQD)8ZMq08['d<M[^W`Urj`'@
+]DfGD]tXK\!PlPN_DK0K`Poj;aN2KGbKJ,ScHab_dF$CkeC<%"f@S[.g=k<:h;-uHi8N\Uj5f=a
+k3(sml0@U6liukFn*fc8nc&([oCW%Ts7ZKerV6Egs8)Wirqu`noDX=@JcFI(J,~>
+JcC<$JcDDCjo5&Rqu$3crqcThr:p<drq?<`!qc*UrUL$[nF6GG!Uf@Sm/QA]lKRQski_*jjlGL_
+j5T%si!nT#h;-lAgY1B7f[j&#q,I;moN(lis&Anrs&Atrr)<_r91SqXr_a5)<)]p$XK/A$WMl_m
+VGm@k!%\%"&hZ.&2a9Pk5<M%i3&`WN1,:R;r[\d>1G^dB1GgsF2)@EX4[_t:91_`K9E%Kj84Q-?
+7l<Fn4Z,c%r_Ebo9heAV;,:0j;?'Gq;,U=j;>O,h;>a>k;>sJk;>X8j;=.6];>a5h;#O2e;#4&h
+;#a;k;#!ob;#aDm:BF9c:&Rle:B+/b:B=9hr)*Yp;Gp@grD3;cohPQaqbR2fmSE%Cpeh#es%rbm
+r_NGgr_`Yk$W0\s;Gg4g;HHgk9E%Nc9LD3:r]^?Fs$$<EpHJUWs&T+ar]g*A#=1[D6:!n&5Q!bH
+62a"R5X@Y"<)lsb5Q4R]<;9An<)lrq<r,no=T;P'=T;J#=RfPo=SPtt<q]Jm;u'>k;$'Wo;u9Jk
+;$'Wo<;fbk;Z9Pj:]O;h:(0op:S+/MTV/!PU8+L_U]I<hrhodp!3,sts/Q.$riH7)YHRr0!jT&:
+rj)j:[C*HO\$rmH\H0:Rrk&9F^AbkJ^qp#e1rI8N`Q#s>aN;TJbKS5VcHjkbdF-LneCE.%f@\d1
+g=tE=h;@/KiSrnXjQ5OdkNM0plKeH9#4:jIn*oi:rpg*]o`"O`pAamcq#C0iqYU0hr;HTcrdk*#
+s4[L'~>
+JcC<$JcDDCk5P/Squ$3crVHNhr:p9cs7ZEas7H?_rpp*Z!:^!V#O_!Hm-O'(lMg#dki_*jjlPR`
+j5T%Vi8EMLh;-lAgY1B7f[naSV?!IjV#R4iU&q$]T_tGZT)YA]S,o+Jr0dSPs-`_Ns-FIi=/Vpl
+Vl-JkW2Q\sX/`2!W2HPjV#6MnG]\=\I:m2(XJi(nSsbt3P)G-MJ:%9?%sNSSIXlouIt*$&JV7H?
+F8i]M\,Nc7Zi76EYcj"TNk1L3RZV]6Ec?#>Fa8RlK_L3#K_C,kLAlr1L4tA9re:E,rIk*&s+:<'
+r.+j"rIP!!!eGlPrI=crrdXlqrd=copj;scs*=Bcq0W-h"+,??H2W!eH2)^bH2W'fH2i3gH2`-g
+Hi8?iHh_pXHi&3gHhr-fIK+clIfP#uJ,=cqJc:3"Hjb7FH$FOWF`VYICi')c$#G!/Dd6OO>?kG4
+?2e11?iOL6?i47/Z2e//>l\.,?2In+>6nD8=^,'4=^,,,>5h\)`WF1_<rS]iSc>;[TDbG\U&C_[
+U&C\cU].%hV>R4_VtHneV=Vn2bPfT`b5f]]aoBN`bPTHRbP]T^c2>ifc(4j*#G7Z^TqS3TU].%o
+V5C,fVl6Pnri6"!!3H1%s/l@*rilF-!4)U1#ILnH[^NZS\Gj#>]"@sS6+t"I^VI\%_SX4/`Poj;
+aN2KGbKJ,ScHab_dF$CkeC<%"f@S^0g=tE=h;7&Ii8N\Uj5f=ak3(sml0@U$m-X6?mfDqJrpg-^
+o^r.U!quB_rV6Egs8)Wirqu`noDX=@JcFI(J,~>
+JcC<$JcDDCk5P/Squ$3crVHNhr:p9cs7ZEas7H?_rpp*Z!:^!V#O_!Hm-O'(lMg#dki_*jjlPR`
+j5T%Vi8EMLh;-lAgY1B7f[naSMYr>2L]E5.LAlo&K_pDrK)C3!J-1*oK7iuQ$*:2-Wi;qpVl$9f
+IN2Tp?=.&@=&jj$I<p*ZF)l/3B4YR\?!CN:@U`aE@LQaWARo@a<`NLbN/W\oM#W/EL4k54K5>OI
+M/RB\HtR,)AS5XlCiOOqFT$7\FSg.RFRsYPG5ZR`FT6L`F9$I_F96N*F8BqSEW9tXDu=SSE<'tT
+EVseODte,LD>A)FD<u0<D#/#GDZ=VWDJa3+rbVXQrbq%=q/?:PqJZ@Nrbq^Rrc.mUs)IpVrcA'Z
+#B4U"D/O3,D#S/MB4V!Os'c7KA7AG6;,C+er)3MkrDNSm"cJ>!NDWRP;Z9Vj;@-2s:f1%d;Gp@i
+r_`Dd"I,1;:J^tGmt^drpPB*3M2@%EM2D"bqhtH4onrg-rL!DKs-W\Ms-WSJ!LT5LQM-[DQLpLD
+Sc52cT:hjNTq\9VrhKdqVP^8hW2Q]pWrK+"XT#@%XoP[)YlCs.ZMq08['d<M[^W`Urj`'@]DfH/
+]tV7r^qmk(_Sa=2`Q#s>aN;TJbKS5VcHjkbdF-LneCE.%f@em3gYCW@hV[8LiSrnXjQ5OdkNM0p
+lKdg'mI'uB!V#XYncJFTo`"Lbp@n=[q#C0iqYU0hr;HTcrdk*#s4[L'~>
+JcC<$JcDDCk5P/Squ$3crVHNhr:p9cs7ZEas7H?_rpp*Z!:^!V#O_!Hm-O'(lMg#dki_*jjlPR`
+j5T%Vi8EMLh;-lAgY1B7f[naO<;fet<)r`p!*/tur)Nbrr)E_rr)<Pnr_ihi7JTj]<!fY,WiE%s
+Vl-DfrDX2*.k)u"/N5RH5s[_!r]:cQ2`*?G0eb42/hA\31GUaB1c.#f2$lE-5>FjF8kM`Lr^dhq
+7n-$-0g.`V84QBM:JO_]:/=__<;oeq;>sAl;>sGn;>O)h;>X8j;>jDk;>X8j;=.6];>j;h;#O2d
+;#4#k:esk`q,-ub##S2m:JOVYr_NJfs%rGc!DlYh;?9Wkr_NDdm8*^XmSE%Cq,.)es%rho:J^ja
+r)*Jj$rTku;H-Lk<Dumq92,:V#X^pG5!D+m5!Jj.pHJUWs&T+as$-3Br]p]T6:!n&5Q!bH62a"R
+5X@Y"<)lsb5Q+RW;u]hs<W#np=8>tr=TV],=8c7j=oVV(=8Gqt;ta2j;u'>j;?'Pn;>sJl;$'Wo
+<;ohm;ZB\q;?9WkqbR,bs%`Wcrgj@eTV/!PU8"F^U^*`nVPg>jW2]crs/Q.$riQ4'!3cC+s02R0
+rj)j:[C*HO\$rmH\H0:Rrk(P1^;%Fu_84"*_o0O5`lH0Aai_fMbg"GYcd:(edaQ^qe^i@(g"P07
+gtgfChr*GOioB([jlY^gkiq?slg4!*mf)YUnF?MK!qZ'Vrq-?dp\4X]s7u]kqtpBjrVc?eJcC<$
+gAc[~>
+JcC<$JcDJEk5P/SqY^*brqcThr:p9cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-'BS<8
+j5T%Vi8EMLh;-lAgY1B7f`'J'VPX3drhBUjTqS-PrL`nWs.01["IkjKR@4&ArgEVMs-NbQ"]p8P
+Vl$BiW!KE&W2HPjV50CUQ54jiI=-EjB4md7W2?5YR$EtrM2$Y2H2`$uJUi6$I=H`pIY33&?smLD
+\H04Jrj;^3'XG*NYDU2f^4qZ@F`__GEH65KIY7WRs+L0$s+L*"re:E,pP/[&#)7hbKnb;8r.P!%
+!eZ)Vr.4m"rdjutrI=fsrI=fqrI"ZnrHeNlrHnKh!."?cpj<$g"+,??H2`'fH1uXbGl`5:rd"Wk
+G^0%0rd+TkqgA<gpj)pfo6^@^r-S9frd=ltI=?Y<J,=cqJc:3"JIR'TI<g$]GBe7ODf9K/rb;XQ
+CiaQT>?h)3s'>V1s'Pe6!+5Y1rNZE.pKdZ$r`]Y3=]ns4>$5'6qHEo%#$Amca&lDEr13kZrh'.^
+rLs.`p7_M\s.fRhs/#XjoV_AZr6+lZ!6b;_s2tDbqT8]YrQ4lXq9/][r6>/b!h5^Nrgj@eTV/!P
+U8"F^U]RBiVZ*IpW2ZcqWWB0%riQ4'!3cC+s02R0rj)X4[JmTB\%&rY\[oDb]Y(qlrkC_6_8=(,
+`5T^8a2l?Db0.uPc-FV\d*^7he'uq!f@S[.g=k<:h;7&Ii8N\Uj5f=ak3(sml0@U$m-X6/n*fc9
+rpg-^o^r.Us7QHerV6EgrqcQirqu`noDX=@JcFI(J,~>
+JcC<$JcDJEk5P/SqY^*brqcThr:p9cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-'BS<8
+j5T%Vi8EMLh;-lAgY1B7f`'M&MYr>2L]rQgL51M<re:0$qLeNordjor"ArreKS0/T#cal&Vl-Dg
+Uj`5k(0t$J?!gu@<d9(@H?aUTEH#],ARo4Tr`]V:@:<YR@UimH@g$@B<E>%WN!"omLkkt`re(r$
+S9Tm/G(=4<AS5RdCM[m/FEMa*FS0_MFT-C_FSBqUG5cX_F9$I_F9$I_FT-@YEr0kUDuahSDuanW
+E;aeQE;FMID?=ZmD>S5HD=)3@D>\5ID>J,RDf0H0Ci')frGUq<q/67Pq/?4Ls)7gSs)IsUs)IpV
+rcA!X(N=;3DJa6,CMIQtB4PI\@preUARfUT;#X>j;Z9Pl;Z0N!Mi<XT:f1+gr_rSi$rKht;,C+f
+;Gg=i;,R'a"dG:<:JXg^L]<2,L\ur/LPYSZs+pZ2q25'-rJ^E-r0[;J!1<VLs-WMHop5H@rKd,C
+!h5^Nrgj@eTV/!PU8"F^U]RBiVZ*IpW2ZcqWWB0%riQ4'!3cC+s02R0rj)X4[JmTB\%&rY\[oDb
+]Y(qlrkC_6_8=(,`5T^8a2l?Db0.uPc-FV\d*^7he'uq!f@S[.g=k<:h;7&Ii8N\Uj5f=ak3(sm
+l0@U$m-X6/n*fc9rpg-^o^r.Us7QHerV6EgrqcQirqu`noDX=@JcFI(J,~>
+JcC<$JcDJEk5P/SqY^*brqcThr:p9cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-'BS<8
+j5T%Vi8EMLh;-lAgY1B7f`'M#<;fhs<<#tq<rZ2!<qKAl<;TVo<;KMr78?`Y;>jB";cKcrW2HPj
+V5.)i<@KII.kE8(2`*]a5<V+k3]K)X2DHsA/hAV,0JP@>1,CgF1GgpE4ZYc&r_"5'91qlK8OuBB
+82X4-5=J+89heDX;,0k\;,U7gr)3Plr_N\o;GpBg:]OAl;?Bcp;Z0Jl;Z0Jj;Z'D[;?0Pl:]4,g
+:\moa;$0Wj:Jgmbq+q8m:esk^9ht[`r_<Mj:f-m^!DlYh;?9Wkr_NDdmSEdXmn`(BqGI5gs%rbm
+r_NDfqbd;g'iRt+;c-Ci;cH[j91_`J85)B<2a'>'55[Y>56"X_<rP>a5P7;@5m9VB5s[b#r'16J
+rBCTR5sRY6<`VIM5lOa[;uKYq<W,tp=85nr=oVS(=8c7i=oVS(=8Gtt;ta/j;ts8i;?'Pn;>sJl
+;#jMn;ts8j;u]_r;,I-crD*Ag!h5^Nrgj@eTV/!PU8"F^U]RBiVZ*IpW2ZcqWWB0%riQ4'!3cC+
+s02R0rj)X4[JmTB\%&rY\[oDb]Y(qlrkC_6_8=(,`5T^8a2l?Db0.uPc-FV\d*^7he'uq!f@S[.
+g=k<:h;7&Ii8N\Uj5f=ak3(sml0@U$m-X6/n*fc9rpg-^o^r.Us7QHerV6EgrqcQirqu`noDX=@
+JcFI(J,~>
+JcC<$JcDPGk5P/SqY^*brVHKgr:p9cs7ZEas7H?_rpp*Zs7$'Ws6]mSrp0jTlK[Wuki_s-)!0i=
+j5T(Wi8EMLh;-lAgY1B7f[na+etr>@rM0@crh0:`pn%MVs-s(YrgEhTrL!VQo9]M[rMKUn25dCP
+W2HPiUnjcOQ@!h%H[^ETB4\'@VP0WMQB[DeKn=c"H$FL_It)utIt2uuJV/Pa?t6VD\H');[/[HH
+ZEpj?X-]uSM4A^1FE2AAFa8CfKD^H&K_U9$K_L3#LAlo%LB!&/L&m!]rIt0&rIk?,K7\^RJc13"
+Jc1,sJ,b&uJ,OipI/nZnHN8HlHi86jH22d\HiJHsH[:!`G^045p3Q[_s*=`lG^0%0r-A?ir-\Eh
+pj2LXqL&6gqL&6irdONiq1&HrrIFlu*.i`hH[C'`H$FOUE,]Z2ChdU#Cj0o=>?b?;?![G9s'Pe6
+!+5Y1rNZE.pg*`$r`]Y3=]ns4>$5'6qHEo%#$Ajba&lDErLNt[s.B4^rh94`qk=%_rh9=crM9Fh
+r20+apSRf1q98l^r6#&_!6Y/[rQ>)\q9&NVr65)`rltM4rgNqYSc52cT:hjNTq\9VrhTRj!2fan
+!iW)tri-%#XK;E'!NrX*YlCs.ZMq02['fnA!OoT<\Nd[;]Y(ql^;%Fu_8=(,`5T^8a2l?Db0.uP
+c-FV\d*^:jeC<%"f@S[.g=tE=h;7&Ii8N\UjQ5OdkNM0plKeH9$gmBNn*ol;o()DDo`"O`pAamd
+q#C0hqY^6ir;?Ncrdk*#s4[L'~>
+JcC<$JcDPGk5P/SqY^*brVHKgr:p9cs7ZEas7H?_rpp*Zs7$'Ws6]mSrp0jTlK[Wuki_s-)!0i=
+j5T(Wi8EMLh;-lAgY1B7f[na+er'E_reLZ3L51Q`LAuu(K_^8pK)L8qJ36Y\KS4u2K7noWW2HPi
+Unjc7IU62_?!gu>=&sg!H[0jYEH#`.ARf.S>[(B@@:<VR@UinY@qB4O<E=tUMu\b7M#E&-KEZ^F
+JoGaYrb)7C"__XeDfKgsFT6L`FS0_LFT6L_FSL"VG5cX[F96T,FT$:XEr0kODuanVE;jkRE;FMJ
+D?F`nD/K2gphfD9!,_XMqec(F"`8'lD/F1iDs;08DuXeQDu=MQDuFYSEW'kVEVXVTF89heEGo`5
+Df'B-Ch[QsA7K(YraH(EA7AA3;,R9ir_`VlrDNlXN/`fn;>sJn;ts6!;,C(d:f1+g;,U:h;>3lj
+Pa.M0:JgnCreUH,rJ:H.s+pB*reUN0r/1<.r/CB.qO%)H!1<VLs-WMHop5H@rKd2E!1NnV!M#_[
+Sd1m\TV8'RU8.^`s.o^mrhfgrWN#ls!irE(riH4(YPtd+YlM*/ZN7G@rjDj:\Gj$']">Vf]tV4q
+^VI\&_Sa=2`Q#s>aN;TJbKS5VcHjkbdaQ^qe^i@(f\,!5gtgfChr*GOioB+]k2tjjl07L!rp1$[
+mdKW6naZ2@oCMVRp&Facp\ssfq>U6gqu6NkrUg)?s+14(s*t~>
+JcC<$JcDPGk5P/SqY^*brVHKgr:p9cs7ZEas7H?_rpp*Zs7$'Ws6]mSrp0jTlK[Wuki_s-(Zj`<
+j5T(Wi8EMLh;-lAgY1B7f[na+f)8SH<W5qt<W#nr<<-(j<<-"q;u]hl;ZK;d;?0Sm;CSTDVl-Ae
+Un^pi.k)u!/1ie<1dF8g4Zkbb3&`]M1,(C7/hJb41G^dBr\Og82)@EW5#2)M!(m/_s%35]'LkVM
+5!^tp7o)rV:f'qa:/b%g;cEKis&&em"Ar&p;,R3e!)`_n!E2no;>jDl;>a>i;=7<a;,C%ar)!;e
+qb[,d!)WYjqGHu`s%`\k9ht[`r_<Mj:f-p_s%i\mq,.2irD3;cpeUobq+pudmSDtAqbd;gs&&bk
+q+q&gqbR8irD3i!:f:4h;,U=k9MGFX#Y7WW6:3n!5!Jm/pHJUWs&T+as$-6CrBUTS6:!n&5Q!bH
+62WqS5sRY6<`VIM5ZC_\;uBSp<W6%t=8l8#=8>tr=o2=h=oVS(=8Z+t;ta/j;ts8i;?'Pn;>sJl
+;#jMn;ts8j;u]_r;,I-crD!?]rgNqYSc52cT:hjNTq\9VrhTRj!2fan!iW)tri-%#XK;E'!NrX*
+YlCs.ZMq02['fnA!OoT<\Nd[;]Y(ql^;%Fu_8=(,`5T^8a2l?Db0.uPc-FV\d*^:jeC<%"f@S[.
+g=tE=h;7&Ii8N\UjQ5OdkNM0plKeH9$gmBNn*ol;o()DDo`"O`pAamdq#C0hqY^6ir;?Ncrdk*#
+s4[L'~>
+JcC<$JcDSHkPk8TqY^'arVHKgr:p9cs7ZEas7H?_rUL$[nF6GG&FSrQm-O'(lKRQski_*jjlHF$
+"leM!i8<Djh$Vrlg=k64f@SU(ebu<CUB%%fU&L\bTD5#VSc>5[RfStGrg3bRR$mH2!36$q1oI:M
+W2HMhUnjc[Q?I\(H[TR?AZDZ*U7[j?Q&UWSKReAoG]n=^Jq&9$IXcs#KS+td@@dD.!4Vm5rj!,V
+MiG!.NMCW;EH#r?G^G$rK_gE$K_U6$K_L3#LAlo%LB!#3L4t>7K`6]'K`-W)KE-Z&Jc(-"Jc1,s
+IfP#tJ,XopI/nZoHiAElHh;XYHiJHrH[9s_GlE!]HMr-hH3/A:GklX_H2r<iI/J?dHLcF[I/J?f
+I/\QnIK=qIp4)mg!.k*!r.4m"%"EYPG'SCZG'%bFD/K8d$#47&F)P8f>[:Y7?N4C4?iXR3?N%/0
+>khV$>lIq5>$5!4>$>'5>P_P'=ThjGa2_<]=8nciTDP;\U&:Y`U&:S`U&UheU\pqeV>R4fVt$Y[
+bPBB^bPfT_b5f]]ao0B\ana*SbPfZ_c2Z)hR/i]TRfT%Mrgj1`TV2:X#GRugUnji`VZ*LnVuWgr
+WWK6&XT#=&Y-7i/s03'>Za7$G[C3NQ\%&uZ]"@sS5/"\F^VI\&_Sa=2`Q#s>aN;TJbKS5Vcd:(e
+daQ^qe^rF*g"P07gtgiEi8ESRj5]4^k2tjjl07L!m-O--rpKmWnc&([oCW%Ts7ZKerqQKgs8)Zj
+rVZWmo_sFAJcFI(J,~>
+JcC<$JcDSHkPk8TqY^'arVHKgr:p9cs7ZEas7H?_rUL$[nF6GG&FSrQm-O'(lKRQski_*jjlHF$
+"leM!i8<Djh$Vrlg=k64f@SU(ebt@)M#<&-L&cr)K_L,nK)C2nJ.REeKS+r2K7p/"V50o^U4-;F
+>o@$O=&j`sH[0gVEH,c-ARo4U>[(B:@UikVraQ=I@q9._<E=F(N/WYnL]E2/Kb8uFDK(5JFF\"9
+An>ReCi+-4qfMj\s)dpT!H`J[FT6L_FSL"VG5cXXFT-@YErL%[E,fmgE;sqRE;FMKDZ=PTDJa7h
+DYS)8D?+POD#8)ED?+PQD#\>PDZ4S=DX_TCDZ4PXE,T]7EH1nqs)IjT!-A!WrG`$\DfBT4DJoGg%
+;]NbA7B(Y@;9=_:f1*g;Z9Pl;Z0MoMuJ\?:f1(f;H$Nl;?0Sn;@HE!:f1%d;Gp@i;Gg<c:^3/LP
+tt1P;#H+IM#2u-M#<#.M"li)M#<,-MY`8/N;&8+R/*-MR/<3OR$j?8Qh?[@Qi36FQiEHRRf8cWS
+=TYN!hZ-Yrh0RkUSFW\V5:'gVuN[qWW&n!X/rE%XT>T.rilF-%^NFI['[6L[^W`U\[f;`rk(G.^
+;%Fu_8=(,`5T^8a2l?Db0.uPc-FY^dF$CkeC<%#f@\d1g=tE=hV[8LiSrnXjQ5OdkNM0plKdg'm
+I'uB!V#XYncA@Srq6<bs7cNfrqZTjr;6HjrVcBfJcC<$gAc[~>
+JcC<$JcDSHkPk8TqY^'arVHKgr:p9cs7ZEas7H?_rUL$[nF6GG&FSrQm-O'(lKRQski_*jjlHF$
+"leM!i8<Djh%8Arg=k64f@SU(ePoLJ<`N/u<;ont<qoYp<;]br<r>qt<;]\o<:s2i;?0Sm;C\TA
+V50o^U/`Wn/1W>42Dm]`5!:th3B/rS1G^a>0.nh-1,CaB1c%!G2#]?:4$6&.91qnV9E.T`8.A'N
+5!;+f7nQNN:esh_r_W\p;Z'Jh;?Kcm:f73ir_`Yks&&bns&8knrDNSkr)3Dhn5B9`!`2Zgqb[5e
+qb[,d!)WYjqbd&`s%`\k9ht[`r_<Mj:f-s`r_WAf!)WYjqG-i^r_E8br_W&Zk"tnOr_WVl!)WYj
+q+q&gr)!DjqbRAn:f(*i;@$6'92%rL91hbS6NTD755[Y>4oeU^<rYGa5PdVH5<qL45m9VB5s[b#
+r'16Jr'(TU5X/4K<^8l65u^c]qGdJpr`9&#rDrr"q,mMsr)i>hs&]8&rDrhpp/D#jqGI>m;Z9Pn
+;Z9Pm;Z0Gm;Z9Vj;Z9Vp;?9WkpeUpX!1NnV!M#_[ScYOWT`1ViU8+KZUnsobrhodp!3,st!irE(
+riH4(YPtd+Yn"(GZa@*I[^NZS\@K/]]DfH,]tV7r^qmn)_o0O5`lH0Aai_fMbg"GZd*^7he'umt
+f@S[.g=k<:h;7&Ii8N\Uj5f=ak3(sml0@U$m-X6?mfDqJrpg*]o`"O`pAamdq#:*hqY^6hr;HTd
+rdk*#s4[L'~>
+JcC<$JcDYJkPk5SqY^'arVHKgqtU3cs7ZB`s7?<_rUL$[nF6GG)=HnZm-O'(lKRQski_*jjlGL_
+j5T%Ui8<Djh$`#mg=k64f@SU(eC=Jns.]Rgrh9:`!2'%Xr13kXs-s%Vs-WhQpQtrIq3_2K!2fan
+s/7cOUnjc[TqQm`I=,^@Bm-DNUS4'DQ][,[L4FYsH$FRcJ:E*!Isum!K7\bb@>2;(\[]&Trj;^2
+&%$J[QEGt2Q?@=kEHHGRJbt,tL&?W"K`Hf$L&Qi*L%pB(LPCN^K`6])KE6d[rIt9)!/(6$qh"ct
+!.arr!.b&urI4Zm!.=cmrd=]lom6=Ys*Xims*4ZjH$T(/r-8<hH2`'aH2N!cI/\KeHLcFZI/J?g
+I/SKjIeS?aJGausJf'#cH[0p_GBe=SC3"3/C2%I$PB1YI>[:Y7?N4C4@/F:/Z2e/)?27b*>6nD8
+=^,'5=^,,,>5q_5=N/>$=BAU+SXl@Eqk3n]rM'7aqk*q_rhBFf!2TLgqkj:hntu0)q98l^rQ>/`
+!6Y,ZrQ>)\q9&KUrQP2a$C@-IR@9S6S"-">rgj1`TV2:X!huHbrhKRkVZ*LnVuWgrWWK6&XT#=&
+Y-7i/$aI"CZa7$H[C3NQ\Gj$)]">Vf]tV7r^qmn)_o0O5`lH0Aai_fMc-FV\d*^7he'uq!f@S[.
+g=tE=h;7&IiSrnXjQ5OdkNM0plKdg'mI'uB!V#XYncJFTo`"Lbp@n=[q#C0iqY^6hr;HTdrdk*#
+s4[L'~>
+JcC<$JcDYJkPk5SqY^'arVHKgqtU3cs7ZB`s7?<_rUL$[nF6GG)=HnZm-O'(lKRQski_*jjlGL_
+j5T%Ui8<Djh$`#mg=k64f@SU(eC=JSs+pW/rIt<+rIjlspO`6mp430m!/(6's+C?I+etd*Tj;#5
+?<(!,?@.!DGB7hFD.mQo@UNGG>?bTH@:E^F@g?OSAS+tCCQ&1NreUN-&qj\DFb+IYI:m/'AnPst
+E--2CqK2a[s)dpT!d&R-qfMg[rH.gWr,r'_olU1Src/'[EcV/!!cW.!rbqjUr,;XUrbqsXE,fmn
+E;FMKDZ"AMDYS)8D?+PPD#/#DD?=ZkD#S;ODs2*.Du=MMDuObTE;jkJErC"WEXm)-Df0E/Ci!m$
+AnPXbA,]p?Ht6\`;>jDl;>jDk;ZMaTN<W3V;,U:j;uKVo;>sH%;,C(d:f1+g;,U:h;>3lkPa.M0
+:JamdL]*&+L]3,.LB*/*M>W2-M>N2-Mu/J/Mu&eBQ^F09R/iWPQi<BFQh?[AQi*0FQiEEXR@9S6
+S"-">rgj1`TV2:X!huHbrhKRkVZ*LnVuWgrWWK6&XT#=&Y-7i/$aI"CZa7$H[C3NQ\Gj$)]">Vf
+]tV7r^qmn)_o0O5`lH0Aai_fMc-FV\d*^7he'uq!f@S[.g=tE=h;7&IiSrnXjQ5OdkNM0plKdg'
+mI'uB!V#XYncJFTo`"Lbp@n=[q#C0iqY^6hr;HTdrdk*#s4[L'~>
+JcC<$JcDYJkPk5SqY^'arVHKgqtU3cs7ZB`s7?<_rUL$[nF6GG)=HnZm-O'(lKRQski_*jjlGL_
+j5T%Ui8<Djh$`#mg=k64f@SU(eC=Iu!*/tsnl>]hrDiht"]\N%<E)rr;uK\f;u0DlUb&:8TqO"g
+/M&h=2E*ia4Zkef2`NWP1,1L:/M/M/1G^dB1GpsF2)I-Q3^Z^B9,:,m91_]G7n>^,5!DG,;,C"`
+:esqa;u9Jk;u'>k;#sKjr_i\ls%i\mr_i_o!)ien"&`&r;Z'Dk;Yj8^;?fur;Gg:f:\mod:]!ud
+;$'Wm;#X5j;#F2a;#a>j:B"&g:'+3f;#3ue:]OAg;?0Sm:\mi_:]4&b:]F8Y:ZbLN;>j>k;>sA_
+;#aDk;#aAm;Z9K";,gFj;,U:k<(p$b8d%mU6p<g45PI>A<W6&!5lO"E5Qa595skQ:s$H`O!C/mI
+5QF+J5Q="T5?(Za5X.M";u'Dm<W6%u=8l8#=8H%q=o;Cg=oVV'=8>eh;ufkm;Z0Jm;Z9Pm;Z0Gm
+;Z9Vj;ZB\p;?9WkqG.HbR$a;1R[]e:S=TYN!hZ-Yrh0CfUSIga!Mu[mVuN[qWW&n!X/rE%XT>T.
+ricd8ZEggC['d<M[^WdG\O!g=]Y(ql^V@S#_SX4/`Poj;aN2KGbKJ/UcHjkbdF-Lne^i@(f\,!5
+gtgfChr*JQj5]4^k2tjjl07L!m-O--rpKmWnc&(\oCV\So`Fj]p\jmeq>^<hqu-HkrUg)?s+14(
+s*t~>
+JcC<$JcD\KkPk8TqY^'ar;-EgqY:*brq?<`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-(?OW;
+j5T%Ui8<GKh;-l@g=k64f@SU(rm^tD!McCfU&L_aTDG/VSc>5[Rf]%HRJrQKR/NBIQk>[NQDpdZ
+Vl-JkUS=HUTV%firb!=OV5'WOQ^!YmLkU>+G^4OWJU`/uIt*!!Jq8K)@:=T_])B#O['R'EGF"i<
+LR`O2F`_\JH[g[&L5#MXrIt-%nq@."Kn]M\rIss"s+UK+re:?)!JQ4+L&Q`*K)L8rK)^B%JG4Ql
+If+TuI!^3fI!pDAHhMdYHiJHnHMi'\HMVpdGklX`H2r<iI/SEdHLcF[I/J?jI/eQnI/\QjIeS?b
+JGaurK)UB:I!U*aG'J:WEcH&7BkhC"DNo3^>lJ%/?N"7.?Mq,(?27b*>6\86=^,'5=oMY&>5q_-
+=N/>$r`B;)=Iu.Wr1O"^rhB:`rLa.ar1X1eq5+"dr29Rlqka.dp<39Us3(A`s2tDbqT8]Yr5ncW
+q9/][rQPS5Q^=),R@0NCRfT%Mrgs.^!20=bs.TLgrhKUlVPa?j!N<!sWrK+"XT#=&Y-7i/!O8s0
+ZUM7/[^NZS\@K/]]=bei^;%Fu_8=(,`5T^8a2l?Db0/#RcHab_dF-LneCE.%f\,!4gYCWAhr*GO
+ioB(\k2tjjl07L!rp0gUmdKW6nc&(\oCV\So`Fj]p\jmeq>^<gqu6NlrUg)?s+14(s*t~>
+JcC<$JcD\KkPk8TqY^'ar;-EgqY:*brq?<`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-(?OW;
+j5T%Ui8<GKh;-l@g=k64f@SU(rm^q(!/UT/reCE+re0utpk&<momm$k!JH+'KEn9HTqS-OSlbnk
+&Uo(QG'.hDDJEfp@p`JF>?PG7@K0dCA7K.ZA7S\?AW-PH!/^]2re;,?A9<0XEI;G4AnPdkDfKi=
+F`_\GqK)^[rcIgS!-J3_s)\<bFEIM)rH.dVrH80`p2p:Ts)S*Y!-8'YrbqjWrbqjUpi$=RE,fmn
+E;FMLDYn;MDYJ#7DZ">JD>.oQD/=$*D/O91k\fm.rGMLN!cW.!r,DXTnoF_Lqf3EmE,TZ4Df'?,
+C2%Bl@U`bS@XM]q;>jDl;>jDk;[JAANJrfn;,U:jrDNVlr_a)#:f("c:f:1g;H!KkpeV*XQ'G-@
+r_NTMr.t6*reUT0reUB,r.t6,qhjd!q3_2K!1<SM!1<\Nrg<DGoToB@r0I5H#F:^CR$a;0Rf8cW
+S=TYNs.9:arh9@d!2KOh!i;ckrhfdqWW&ptWrT7#XT>T.ricF.ZMq1!['d?N\$rlX\[oDc]Y2%o
+^VI\&_Sa=2`Q#s>aN;TJbg"GYcd:(fe'umtf%8R-g=k<:h;7&Ii8N\Uj5oFckNM0plKeH9"mtaH
+n*olHncJFTo`"Lbp@n=[q#C0iqYU0hr;HTdrdk*#s4[L'~>
+JcC<$JcD\KkPk8TqY^'ar;-EgqY:*brq?<`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-(?OW;
+j5T%Ui8<GKh;-l@g=k64f@SU(rm^sK!``2ur`&Mir`&hrr`02&<)cjt<;oho<:Wua;CeN:TqS-O
+SiAVb2F'Gi4?P\`2`*EJ0JP43/hJb41GUaB2D[0H1Gh6U6;RSR!)!5`s%*bl839!u5"8(<:JOb^
+;,U:hr_r\lrDWMir_`Vl#Z4Js;,C.h;H!Km!)ien"&`&r;Z'Dk;Yj8`;Z9Mn;Z9Mq:esnbr)!>f
+qb[2f##\;p:JXe`r)*/as%`\j:/:dar_<Mj:f.$brD3Jkq,.2hrD3;cq+pubq+q#emSDtApe_5l
+;,L.d:J^RYs&&bls&&_ms%sG+;GU1g;,L7l;bTeV91hfM6Ua3:5PI>A<W,qu5lO"E5Qa595skQ:
+s$H`O!C/mI5QF+J5Q="W5?(Z`5X.M"6W@&cr)<Yrr`9#"!*9&"r)i\rr)ieuqcNYss&f;&pJ^id
+!)r\krD<Pmr_`Ymr)!Glr_rVjs&8np!Du\j:C!2PQ^F/.R@=,E!M#_[T)YD_T`1YbU&^tfU]RBi
+VZ*IoW2]crs/Q.$riH4(YPta,Z*OA87C9J2[^W`U\[f;`]Y(ql^V@S#_SX4/`Poj;aN2KGbKS5V
+cHjkbdaQ^qe^i@)g"P07gtgiEi8ESRj5]7`k3(sml0@U6lileEn*fc9rpg-^o^r.U!quB_rV6Eg
+s8)Wirqu`no_sFAJcFI(J,~>
+JcC<$JcDbMkl1AUq>Bp_rVHKgqtU0brq?<`s7H?_rpp*Z!:^!Vs6]mSrp0jTlK[Wuki_s-"m+h*
+j5T%si!nT#h;-l@g=k64f@SU(rmV"uUS@[[rh04^qk!YTs.'+X!h#FCrg3MLr0R8Is-NYL!1!M\
+.&`i4T:VXFS7SUqU7Rg@QBR8_KReDqH?aXaJUi6!J:<$#JqJed@=%m`!4Mm7(UUNSZ@A:RQ&D8X
+G'.nJG^b:!L51M<L&-K%L&?VoL&Zl/Knb?ZL%pE%L&Q`*L&Qc*K`Hf*L&Q`*K)L8sK)U>qJ,Fcn
+I0"_Brd4`pI/\KdHM)UcI!bd:o6U:Zrcn6ar-A?irI"QjpNl@VqgA<grd=`m!.=`nqgSQps*jfo
+p43!jrdt'#'SLp_H['g^GB\4ODeWs'BkqO%FE%4b!FB(1?i+1-ZM7`$>lS"0>$5#-=p%o2>?gu.
+s&fG+`Q-$r=9+ukT`1Y`UALYaT`(SaUAptgV"pkaVYm@lVYd4fVZ+a=bl#Z_aoKW]bl>lbb5]Wb
+b506Yb5KHWb5'6Ybl>rePl[2;rg3bTR[X5F#Fq?USt;RHT`1YbU&^tfU]RBiVZ*IoW2]cr&?Dn6
+Xf\b/YHY79Z*L^B['fnA::IaD\[oDc]Y2%o^VI\&_Sa=2`Q#s>ai_fMbg"GZd*^7he'uq!f@S[/
+g=tE=h;7)JiSrnXjQ5OdkNM0plKdg'mI'H3nF?&>o(2JFrq6<b!;HHes7u]kqtpBjrVcBfJcC<$
+gAc[~>
+JcC<$JcDbMkl1AUq>Bp_rVHKgqtU0brq?<`s7H?_rpp*Z!:^!Vs6]mSrp0jTlK[Wuki_s-"m+h*
+j5T%si!nT#h;-l@g=k64f@SU(rmV&!M2@&eL]3&,L&Qc*K)gT%KD:&oJb=QiIfOrsK`?ZATqJ$L
+St2BNI=-<`FE;D=C1^sc?sR#A>Q/+3@K'a@ARf7`<E3T.Mu\b7L_kf"L4s8_M/[NdBk_0kBPVR.
+F*;_LF`dV(qfDg\rcIgS!-J3_s)e9`!d&R-qfMRTs*"Ebs)\6^q/lUW!-8$X!-8'Yqf)RRq/H@P
+!cW.!q/H1KqJQ4JrbhFHm;;o@r+u7IpMTtHs(qdSDs)$.Du=MNDZXltEVseSEV"5LEVjeUErg2u
+rbi*\D/<s$D.I-d@K'^:A7P=2rDO#\NK&mU;,L4h;uKVn;>jDm:^9io;,U:h;H!KkpeV*XQ'G-@
+r_NSirJ:?+qhY0,!/gc4qhY0,qMO^!rg3\Rr0[GL!1<VN!1<\Nrg<VMrg*PMoToB@r0I;JrfmMM
+Qi<?RR@9TDRg5ISSXuFFT:l1Ws.TLgrhKUlVPa?j!N<!sWXu54XKAV-Y-5(6Z*CU@Za@.>[SF<A
+\[f;`]Y(ql^V@S#_SX4/`Poj;aN;TJbKS5Vcd:(edaQ^rf%8O+g=k<:h;-rGi8N\Uj5f=ak3(sm
+l0@U$m-X60n*ol;o()DDo`"O`p&Ojcq#C0iqYU0hr;HTdrdk*#s4[L'~>
+JcC<$JcDbMkl1AUq>Bp_rVHKgqtU0brq?<`s7H?_rpp*Z!:^!Vs6]mSrp0jTlK[Wuki_s-"m+h*
+j5T%si!nT#h;-l@g=k64f@SU(rmV"u<E/rr!*&ep!*8tsrD`_q#?Fi(;c?Xq<Vf\a;u]es;uTZ:
+;,X*\T:VXFS2EPr5!1ng2E*TP0etI:/1iG-1,C^ArA=L2"$J\3:]<ue9)_H`8cD6h4?l4j7S6HN
+:/FV^;>sJl;u0Dk;ts8j;>O2j;$Bir;c6Omr_ibn!)iepr)*GkqGHrarD<Pmr_`GerD3;erDESm
+!`;cir_WMip/(cbs%`Mgr_<Ji;#=&d:]OAi;ZBSo;#O2e:AI]b:AIZc;!q-@;#*ug:]OA]:^9iq
+;,C(b;,R9ir)*Jl#>e>s;,C4n9`@Zf8kVfF7/]@M5kmMC<W,qu5lO"E5R]kB5sdn(5sdn(5sR[4
+5QF+J5Q="]5?(Z`5X.M"6UFdP<E)su<`]#tr)iVpr)ieuqH3Pr!E`G&;ZKel;u'Am;u'>e;>sJl
+;#jMn;uT\p;>jDm;u]_s;,C*f:]?U[QC%T<!h#LGrgO._SXl@DT:_eUU&UheU].%jV5C-hVZE`q
+ri-O1XK8P+Y-+t4Yd(I=Za7$HrjGS2\@K/]]=bei^;%Fu_8=(,`5T^8a2lBFbKJ,ScHjkbdF-Ln
+e^i@(f\5'6gtgfCi8ESRj5]4^k2tjjl07L!m-O--n*fc9nac8BoCW%Ts7QHerV6Egs8)Wirqu`n
+o_sFAJcFI(J,~>
+JcC<$JcDeNkl1AUq>Bp_rVHKgqtU0brq?<`s7H?_rUL$[nF6GG-1:0fm-O'(lKRQskND!ijlGI^
+io8qTi8<DIh;$c=g=b-1f@JLOe,n+IUALY`T`1S[T)+u\S=>t8R/WHPQiNQQR/<6KR/WHMQMd!e
+VPg>jSt;LCS"#k7T:;46PE(HQJUVrjG]e.ZrI,$%IY*3)Jmi(urON!<rj<WNZa,gaNNnk3ZupP9
+EccVYJVJu:LPLV=L&?T,K7no3L&?VoL&Zl/Knb?ZL%pE$L&Zf+L&Qc&L&Q`*KDgAtK)U>qJ,Fcn
+IJnQnI/nZoHhVjYHNAM?rcnKgqg&6fq0MsarHS-`r-A?ird=WjpNlCWqgA<grI"Wl!.=coqL/Eo
+rI4Zos+(-!q1/?nrdt'#rIb6'I=(m;$[Qu-BPqX#BPVL,E;a&B?N+=/?Mq,)?2.\)>7"J9=^#!5
+=^#$6qca#&$!>3ea&lGH=BS`'T_b>^T_G/YU&q*cV"pkbVYd7kVY[.fVYA:5b5]Z]bQ,i^b506Y
+b5KHWb5'6YbQ?%QPl?pKQC%T<s-WkUrgNtZSXobO#G7Z^TqS3TU].(hV#[ClVZE`qri-@,XK8P+
+Y-5%5Yd(M5ZVe*;[^NZT\[f;`]Y(ql^V@S#_SX4/`Pom=aN;TJbK\>Xcd:(fe'umtf%8R-g=k?<
+h;7&Ii8WeWjQ5OdkNM0plKdg'mI'H3nF5u=o(2JFrq6<b!;HHes7u]kqtpBjrVc?eJcC<$g])d~>
+JcC<$JcDeNkl1AUq>Bp_rVHKgqtU0brq?<`s7H?_rUL$[nF6GG-1:0fm-O'(lKRQskND!ijlGI^
+io8qTi8<DIh;$c=g=b-1f@JLOe-"1JM2;(breCE+qLng"pk&9lomlphr-nWu'SE!KSXc1=R[JAB
+F)c,6B4YR]?<dD4r*fV8#%_:TA5uW1rJU`7reMGHKnXD_E.`1SMJ-^:BPD=&EcZGKG'8"NFT-@]
+F9$CYFS9eUFT$=cFEM_JF`mS'p2pCZFoHI_F89qWEr^7ZE<(%YEVj\TDtn;ODZXltEVXSMDu+AL
+D?"MHD>7uKD>.oJD>\5JD>.oLD/=%fD?"P<DXhZCDYn>QE,kborc.XP!-/!YrGh[Ss)\0[$#jg#
+D/O6.Chm\_@fTs:@KC"LpJUrg$&jk'N/UV2;GpHl;Z0Jl;ZBPu;,C+f;Gg=ir_`Ge"I,1::J^sd
+!)EKKqhP0,r/(E1re^Q/qhb0,qhkH5oo&R3rg3YPqO%>Nr0RDMr0RDKrg3SLrKmGJqj78IrKdPK
+Pl?pKQC%T<s-WkUrgNtZSXobO#G7Z^TqS3TU].(hV#[ClVZE`qri-@,XK8P+Y-5%5Yd(M5ZVe*;
+[^NZT\[f;`]Y(ql^V@S#_SX4/`Pom=aN;TJbK\>Xcd:(fe'umtf%8R-g=k?<h;7&Ii8WeWjQ5Od
+kNM0plKdg'mI'H3nF5u=o(2JFrq6<b!;HHes7u]kqtpBjrVc?eJcC<$g])d~>
+JcC<$JcDeNkl1AUq>Bp_rVHKgqtU0brq?<`s7H?_rUL$[nF6GG-1:0fm-O'(lKRQskND!ijlGI^
+io8qTi8<DIh;$c=g=b-1f@JLOe,n+I<;oer<:X&g<;TYt<)Z^pr`&tu<W,nd;ZKep;uKVoSg0er
+S"#k74?GS_3&icO1,(C6/hJV01G^dB1c7*H2)IHW5>V,K#t[ZY/hfCQ2+C@?:BXKh;,gEl;Z'Jk
+;?Tip;H$Nh;?0Si;ZBSt;H$Ll;cEZn"]8/q;c?Tk;#jMi;>*od;#jMm;><ue:]!ue;?'Mo;>j>g
+;>*ff:JO[`:]4#h:JgsbqbR8iqbmGk!)WViqbHr_r_E;cs%r,Zk"tkNlVIX[;GmEi!)`YlrD<Vm
+;,[<h"]A/o<D?6e8chXR7/fFN5QF%E55\F]5lO"E5lX%U5sdn(5sdn(5sR[45QF+J56=)95Q4X_
+62j+M6:(QMs&T"uqcNc!rEB2'q,mJrqH3Ss!E`Ls;u]hs<W#er;u'>e;>sJl;?'Po;ZK_o;>jDm
+;u]_r;,I3e!L&cIPl[2;rg<_R!1NnV!h>gPrgj@eTV/!PU8"F^V#R7kVZ*IoW2]cr$`gA1Xf\b0
+YHY79ZMq1-['d?N\%&uZ]">Vf]tV7r^qmn)_o0O5a2l?Db0.uQcHab_dF-LneCE.%f\,!4gtgfC
+hr*GPj5]4^k2tjjl07L!m-O--n*fc8nac8BoCW%Ts7QHerV6Egs8)Wirqu`noDX=@JcFL)J,~>
+JcC<$JcDhOkl1AUqY^$`r;-BfqtU0brq?<`s7H?_rUL$[nF6GG#O_!Hm-O'(lMg#Oki_*jjlHF$
+(ZOE3i8<DIh;$c=g=b-1f@JL&eC;sqdJT^9T`1PbStDYST),#WS,\l[R$X2-R@3u?qj7>Mrg3JI
+rKSe&R]!'\Vk'?IS!ob4R$<ksM2$_6H?aXWG(G-lIt)osJUrK+KOJD`rji*=rj<]PZa,U\S@=3A
+Q#h(kF*<%^K8>DALkphAL4t?ZK`?])KE-`(K_^<%K_pK"LAci#LAci'K`?`/KS>,5K`6W&Jbt&u
+JH15qJ,=ZqI=2$Bs*Xcn!.=cmpj2LX!.+Thr-JBgq0N!br-8$_rHeKjrd=Wjpj2IWqgA<grd=]l
+rI+Qls*t#sqgSTrrdX`oqgn`ur.G!%rIkl5I!9gZG^+FRA8,jpC1qF$F)V%`!+,Y3qd03+!*oA+
+pg!i'!*]A)s&oM->$G5.=q=b<=N8A$=BJ^.=BD/fT:l.V"/)?\T_Y;YU&q*cV"pkaVZ*LmVY[.f
+V?"j7bPoZabPTK`bP96Vao0B\ammLRbPfZbP5g^GPl?pQQC!r*R$jA2rgWqX!1j+\!hZ-Yrh0@e
+U].(hV#[ClVZE`qri-""XT#=&Y-7i/9!P\.Za@-K[^WcW\[oDc]Y2%o^VI\&_Sa=2`lH0Aai_fN
+c-FV]dF$CkeCE.%f@em3gYCWAhr*GOioB+]k2tjjl07L!m-O--rpKmWnc&([oCW%Ts7ZKerqQNh
+rqcQirqu`noDX=@JcFL)J,~>
+JcC<$JcDhOkl1AUqY^$`r;-BfqtU0brq?<`s7H?_rUL$[nF6GG#O_!Hm-O'(lMg#Oki_*jjlHF$
+(ujN4i8<DIh;$c=g=b-1f@JL&eC;sqd>7aVr.b3)!ec8]re19'pk&6komlmgrI+cjE;kM*K:SO%
+S!ob4Qu?q[BP(d`?<g]<>%7J>s'l"<s().@!``9Jrepi8reLo9KnX>aG_U*aIVSjq"_r!sF*;g-
+GQ2gfF`_a)F8p@^F8L(QEr^=TFo?FRFoHL_F8g7aF*)MFF8g4VEVj_TDu"AODZk$!EH#jnE;FML
+DZ"AODZ+DPD#/#EDZ=SJDZ=SQD#J5EDZ=SRD#\>RDJsIWDXhZCDZ"DSE,fmsE;OYLErU.YEr9qS
+EWU<&ErC(ZDuOV`D/=!'An5F]@UikVARkL5rDO#]NK&mU:f1+g;uKVm;>sJn;#X>l;ZBSo;Z9Pg
+;#cabPtt1P:esiBq1ns*re^Q1re^Q/r/(9-qMYB4p58p=pR(rHs-W\O!1<YMrg<VMrg*PMrKdDK
+rKd;HrKdJMs-!DG!0mJJ#F:^CR$a;0Rf8fVS,f,ZScYOWT`1VcU8.^`s.o^mrhfdqWW&muX/u<&
+!NrX*YY)1+Za7$H[^NZT\[f;`]Y(ql^V@S#_SX4/`Q#s>aN;TJbg"GYd*^7he'uq!f@S^0g=tE=
+hV[8LiSrnYjlY^gkiq?slg4!*mf)YUnF?MK!V>s_p&Facp\ssfq>U6gqu6NlrU^#>s+14)s*t~>
+JcC<$JcDhOkl1AUqY^$`r;-BfqtU0brq?<`s7H?_rUL$[nF6GG#O_!Hm-O'(lMg#Oki_*jjlHF$
+)rfi7i8<DIh;$c=g=b-1f@JL&eC;sqd8NtC<;0Dm<rQ+u<;TYq<;oer<;fhp<:j,e<;f_r3Ape6
+,>k#%S"#k7R$]fm3&WTK0eb74/M&S21GUaB2D[0I1Gq6Y8GYsl8OuB01-[rk8P`,W:Jabb;,L0f
+;Z0Pl;ZBVo;?0Yd;ZB\o;YsDk;Z9Sp;Ys;k;Ya2`;YX,f:]O;i;#X8f;#X;q:f:1g:f-sbp.tfd
+:/:a`rD*2bqbR8iqbmGkrD38bqG7)cq+q#emn`%Aq,.,fs&&;_#>nAs;,C%b;>jDg;?'Gn;,I3h
+&5uS/9h\/Q8kDWD6pEn$5X5'.r)Ne_r]g6Es$$lW6:*t(6:*t(5X.L35QF+J56=)95Q4X_62j.L
+5lapa<r5tr=Sc2!>5h\#=Sc1s=SQ#!<:j,h<<#ts;ufkl;Ya2h;Z0Jm;ZBYq;Z9Pk;ZB\q;@$,r
+:J[.:PEV71Pm<VAQ^F/.R@=,Es-s([rgj1`TV2:X!MZ@gV#R7kVZ*IoW2]cr!NW=$XT>T.rif#"
+ZEpmE[C3NQ\@K/]]=bei^;%Fu_8=(,`5Ta:aN2KGbKS5VcHstddaQ^rf%8O,g=k<:h;7&Ii8N\U
+jQ5OdkNM0plKdg'mI'uB!V#XYncA@Srq6<bs7cNfs7uZjr;6KkrVc?eJcC<$g])d~>
+JcC<$JcDkPl2LMWq>Bp_r;-BfqY:'arq?<`s7H?_rUL$[nF6GGs6]mSrp0[OlMg#nki_*jjlPR`
+j5T%Ui8<DIh;$c=g=b-1f@JL&eC;sqdF$=7U&1MZTDkG[Sc>2^S!ob5rg<_Rr0[>Irg<\OqNh,G
+"IbU9L40'!%%E]RR$a5+Q&13IIsV*<%sEMSI=6WpIXm!&JqINAB)]@A\,NcJ['R'#V4ktfSTT+#
+F`hnWJVB![M>rD3LB<3aL&?W(KDC2rK`Hf'L&-Q&L%^9#L&-K$K`Hf*K)gN$Jc(-!JH15qJ,=Zq
+I=2$Bs*Xcn!.=cmpj2mc!.+Bd!.+ThrHeKhq0Msar-8$_rHeKjrd=ZkpNlCWq0`0grI"Wl!.=co
+s*arrrI+`rrI4Zos+(&tqgeWrs*t0%JqElPs+L6&'n:UYH[9s_G'@\8D/*m$Ci+64?!Ue8?i47/
+Z2q::qH`l$s'#J,r`T8)"'Jf3>Pq\)=oVV(`X'Ue=BSa.=*pS7T_kGYUAptgV"pkaVZ*LmVZ*Fg
+V?5,ibkK<[b5]Z^bQ,i]b506Yb5KHPaoKWabl<h*P5g^GPl?pQQC!r*R$jA2rgWqX!1j+\!hZ-Y
+rh0@eU].(hV$3`oVl6Pnri0&#XKAV-Y-5(6Z*L^B['d?N\%&uZ]">Vf]tV7r^qmn)`5T^8a2lBF
+bKJ,TcHjkbdaQ^qe^rF*g"P39h;-rGi8N\Uj5f=akNM0plKdg'mI'E2n*olHncA@Srq6<bs7cNf
+s7uZjr;6KkrVc?eJcC<$g])d~>
+JcC<$JcDkPl2LMWq>Bp_r;-BfqY:'arq?<`s7H?_rUL$[nF6GGs6]mSrp0[OlMg#nki_*jjlPR`
+j5T%Ui8<DIh;$c=g=b-1f@JL&eC;sqdF$<rL\li&K`Hf)KD:&pJan9eJ,Xm>Ec5]&?A*uaS!ob4
+R$X,(BP(a`?X$]<>%1oK?t*PSA,^!@AQ;c3repi8reM2AKnXAjH]N5sBk_<pBl.j0F*RS+s)nHd
+FEIM's)e9^r,hUQ!-ImVrH.XRs)e0["E\^,FE@G%r,DdWEH1kps)7^PrbhpYEH,r9qf)CMqJH=N
+DZ4MQDZ4MQD#/#FDZ=SIDZ=SQD#S;ED?+PQC]eNlDK"`VnSe>Cs).mTrbhgVEW'kSEV=DQEW1"U
+EVOSSEr^7[F8p4ZDZF\SD?"DNA-HFP@UWhWq,7/i$&jk'N/US1;GpHl;Z0Jl;ZBSm;>sGo;,[Bj
+pe_!T#F/(\:f'q_A,:u[M#N8.MYr;2M#E/2MM_1eqhtH4pPT*AR@3f:rg3YPqj@GOrg*\RQ^@]=
+r0RDKrg3SLrKmJKqNq/H#FCR8P*2#mPl?pQQC!r*R$jA2rgWqX!1j+\!hZ-Yrh0@eU].(hV$3`o
+Vl6Pnri0&#XKAV-Y-5(6Z*L^B['d?N\%&uZ]">Vf]tV7r^qmn)`5T^8a2lBFbKJ,TcHjkbdaQ^q
+e^rF*g"P39h;-rGi8N\Uj5f=akNM0plKdg'mI'E2n*olHncA@Srq6<bs7cNfs7uZjr;6KkrVc?e
+JcC<$g])d~>
+JcC<$JcDkPl2LMWq>Bp_r;-BfqY:'arq?<`s7H?_rUL$[nF6GGs6]mSrp0[OlMg#mki_*jjlPR`
+j5T%Ui8<DIh;$c=g=b-1f@JL&eC;sqdF$<?p/V)mpJq5mr_rhrrDihroMbTcr_j^n1bp[6;GpA]
+R[KP1Q^3mp2)6m@0.\\,0J`S_$oBgu2)I-P5!2M391o1V&kPVb2F0Jj7S$9N9hnGX:f:1ir_`Sk
+r_r_ms&&5_r_rhpqG[>jr_iepr)*GkrD<Vm;,R3g!)`_nr)!GjrDEMi"A_ij;,I6fqb[8h"]/)p
+;,C*b;>*fe:JUjar(d)aqb[,e!)`YiqbHr_r_E8b!)W)Zk"u(T!)WSjrD<Jjs%r_mpJCle##\;p
+:JakbrDNJhrD3Jkr_aA+:f11k<D6(Y9MA)O77BF+5X5'.r)Wh_s$-<E$pR$E6:!n(6:!n&5<o-4
+s$6WMrBC?K5sYEL!($TLs$6ZU<r?%q=Sc2!>5h\#=T2Ir=Sl5'=B/="r_ierpf%2ls&K"s!)rYj
+q,.,hrDESms&/nqr_`Sks&8qq#uOMpOcbfiPEV71Pm<VAQ^F/.R@=,Es-s([rgj1`TV2:X!MZ@g
+V#R7pVPg>jW2]cr=0&F)Xfeh1YctC<Za7$H[^NZT\[f;`]Y(ql^V@S#_SX71`Q#s>ai_fMbg+M[
+d*^:jeC<%#f@\d1gYCW@hVd>NioB([jlYail07L!m-O--mdKW6nc&([oCW%Ts7ZKerqQNhrqcQi
+rqu`noDX=@JcFL)J,~>
+JcC<$JcDqRl2LJVqY^!_r;-BfqY:'arq?<`s7H?_rUU!Y!:^!Vs6]mSrp0jTlK[Wuki_s-$0C7.
+j5T%Ui8<Djh%AGsg=k64f@SU(eC;sqdF$=eq4RVWrLX"ZrgX@cR[TY4R$jA0R$X37Qi<?PQhZjt
+Q(OM*L4XZ!IAa!?R@'A.QBd`"PBqFtG]eReIXQZpIY!$&K7dWBA@/qZ\,E]I['GgXR[&f(GB\1R
+FaAOhLl@8iM#`A1LB*&*K`6W#K_^?%K`$Q"LAlo)L&cr*LAci'K`-T)K`6T(K)C2tK)U<$JG=Wk
+IfFfnI/n`qI/nZoHhi!dHNJM?HMMmfHN&0jG^9:7rd"<cr-A3bqK`!b!.4]mr-S3bnU'kTrd4Tl
+!.Olp!e,WKrdOcps+(#sqge]trdb$"s+:*"!/16're;/;I!g6cH$X^ZD/4*)C1qF$F`(Jk?hn%,
+Z2q::qH`l$s'#J,r`T8)"'Jf3>Pq\)=oVV(`WsRe=BSa.=+^4?rLrnY!2TIfr20CioVM];d*D@.
+rlY8aqof&`pr`HTrQ>)\n]D6_bfl-0OcbfiPEV71Pld8<Qi<?WR@9S6S"-">rgs.^!20=b!MZ@g
+UgU$rVPg>jW2ZesX/rD)Xfek3Yd(L?Za@*I[^NZU\[oDc]Y2%o^VI\&_o0O5`lQ6Cb0/#RcHaea
+dF-Lne^i@)g"P07h;-rFi8EVTj5f=ak3(sml0@U$m-X60n*olHncJFTo`"Lbp@n=[q#C0iqY^6i
+r;HTcrdk*#s4dR(~>
+JcC<$JcDqRl2LJVqY^!_r;-BfqY:'arq?<`s7H?_rUU!Y!:^!Vs6]mSrp0jTlK[Wuki_s-$0C7.
+j5T%Ui8<Djh%AGsg=k64f@SU(eC;sqdF$=eq1ed#!/1?(pk&9loRQ[c#_$r;Ch7$[?XNec%[i]O
+Q^3o%P`oHY>[1HBrF,_8#\7FUA7ehC<J^X5reLi8L4sJbGAqVQrb2XOC2J!3F*DhOr-/-`!HiM_
+F8p@]F8^4QF7aVSFSp7]FS^.ZFSp1_FE;PGF8g4XE<:*!EVj_TDu"AODZk$!EGodmE;FMLD?4Tl
+rb_[Qrb_[OqJH+Irb_@Hs)%dPrb_:F#An9nD/F0.Ds2*/Du=JQDuFPTE,fmsE;X_PEWC+YErU.Z
+Er'eMEWL6%rcA*]"*&9uDuOS]Ci*or@q9%Y@U`qZq,72j#)nP$N/US1qGR8hr_ibmr_`Ym!Dubo
+;><ufPR!IL:Jak`:2'HY!/UW2qhk6,p58a*qi(?/!h5XHp6biGs-W\O!1<bPqj@;Jrg*PMrKdDK
+rKd;HrK[_MOHGZgP*;)orfmPNQ^@]=#FV$LS"#q<Sc55\T)bP`T`Lm_rhNquVP^8hW2Q\qWiN5&
+Xf\b0YctC<Za7$G[C3NQ\[f;`]Y(ql^V@S#_Sa=2`Q$!?ai_fNc-FV]dF$CkeCE.%f\,!4gYL]B
+hr*GPj5]4^k2tjjl07L!m-O--n*fc9rpg-^o^r.U!quB_rV6Egs8)Zjrqu`noDX=@JcFL)J,~>
+JcC<$JcDqRl2LJVqY^!_r;-BfqY:'arq?<`s7H?_rUU!Y!:^!Vs6]mSrp0jTlK[Wuki_s-$0C7.
+j5T%Ui8<Djh%AGsg=k64f@SU(eC;sqdF$=epf.>o<W6%n<W5r!;cH`n<Uj#a<!ZD^2)6j:.4m.N
+;@f1_R$X,(Q'@Id/hAV,0JWM^+uD/62)R0P4ZlD29M.oM91hcH2Ej8[7n6EQ9M\D\;c6Olr)*>h
+!)rbmr_`/_r_rhpq,@8js&8qqr)*GkrD<Pkr_`Sk!)`_nr)!GjrDEMi"A_ij;,I6f!DlYl;#aDm
+;#aGm;#jMj;>*i`:]4&a:]+#h;>O/j;#F,e:A@Wa:AIZc;"%3A:]OAk;#X>k;#O5k;#O8d:^Bor
+;G^1c:f1*h;Ya2g;#O8k:^'Wm;,gOtr(@5c91)*45X5'.r)Wh_s$-BG!^T(9r^-WNs$H`O!^Jt7
+r]pKL!'pKI!^K%:r`&qar]pKL"@uTq=BG<#pfRT#qcWi!s&nqqrE0;+='&C%<;f_q<;9Dl<<#ts
+;ufkl;Ya2h;Z0Jm;ZBYq;Z9Pk;ZB\q;@68tO-#KdP*2#mPl?pLQC!s;Qj9%JR[]e:S=TYNs.9:a
+rh0@eU].&sV5C,fVl6PnWiE,$XKAV-YHY79ZEpmE['d?N\%0&\]=bei^;%Fu_8=+.`Poj<aN;TJ
+bg"GYd*^7he'uq!f@\d1g=tH>hV[8LioB([jlY^gkiq?slg4!*mdKW6nc&(\oCV\So`Fj]p\jme
+q>^<hqu6NlrU^#>s+14)s*t~>
+JcC<$JcDtSl2LMWqY^!_r;-BfqY:'arq?9_s7H?_rUU!Y!:]sU!Uf@SljrFIlKRQskND!ijlGI^
+io0mp(>n!)h;$c=g=b-1f@JL%eC2jndEp4bqk3kZrLWqXs.'+Y!1NhRs-WDEs-WhQpm*D!P`CHG
+IXQWnB5OQEQ^3o%P`q8nOa2(mJUi3!JUW*!K7ebb@Usbq]!qXG&@ActO-l2kWHNN1F*2t^Jr9Pd
+!/pc3!/UT/!/CE)r.Fm"qM"p%r.Xs$re:9)"GMSbKnfMZs+CB)rIk3)#)%V]JqJZ,rIOlurIFs!
+pj`6k!e#HDr-\Qord=iqH[GO6rHeTlH[>O8s*F]js*+Nhrd+Qhpj2marHS-`r-A?ird=Wjq0MRX
+npLIa!.=cos*jrqs*artrI4Zos+(&tqLJTsrdb$"rdt'#!/16'qh>c7I<p0bH$FRWAnu@#C2%I%
+F`1R\?N%/1:gEm'pK[`&!*]A)s&oM->$G5/>5qb*=:3'gaB2PI=BJU\\GMruU%=uZUSRgaqkj7g
+p87l:!n#B?p<3HXs3(;`!R&X`ans6Zao0B\ammLSbDuR_!K`HCP5g^GPl?pLQC!s;Qj9%JR[]e:
+S=TYN!hZ-Yrh0@eU].%iV5F6i!N<!sWWfH)Xf\b0rif8)ZEpmE[C3NQ\[f;`]Y(ql^V@V%_Sa=2
+`lH0Ab0.uPc-FY^dF-LneCN7'f\5'6gtgiEi8ESRj5f=ak3(sml0@U$m-X60n*ol;o()DEo`"Lb
+p@n=[q#C0iqY^6hr;HTdrdk*#s4dR(~>
+JcC<$JcDtSl2LMWqY^!_r;-BfqY:'arq?9_s7H?_rUU!Y!:]sU!Uf@SljrFIlKRQskND!ijlGI^
+io0mp(>n!)h;$c=g=b-1f@JL%eC2jndEp4bqhG$&rIjlrqLS3fp4!p#De`cg?XI2K<a(00Q^3o%
+P`q8nO]u!nraH"=@prnXrac"/!+c(frJ:K.%V]m+E--bHCM@ErE,ouBpNQU[s)n'WrcIdR!-ImV
+rcJ'\#BY*2FEM\JFoHLXF8p7]EH;"ts)7sXqf)OQpi-4Ns)A!Vqf)FNq/-4MDZ4MQDZ=SQD#8)G
+DZ4MHDZ=SRD#\AEDZ=SRD#\>RDJsIXDXhZCDZ=YSDZ=VTEW'kSEVa_UE<(%XE<(%TEVFMPF8g7_
+F`DC"DZ4J[ChI<iA7AtV@:a!G;Z9T"N/`gU:f("dqbmAir_ibmr_`Ym!Dubo;><rpPa.M0:Jak`
+9l,[`L]</1M>W8-M=lc&Mu/J0MuK1HR[Nl:rg3YPqj@GOrg3DIs-N_Nrg3SLrKmJKqNq5J!07&>
+!K`HCP5g^GPl?pLQC!s;Qj9%JR[]e:S=TYN!hZ-Yrh0@eU].%iV5F6i!N<!sWWfH)Xf\b0rif8)
+ZEpmE[C3NQ\[f;`]Y(ql^V@V%_Sa=2`lH0Ab0.uPc-FY^dF-LneCN7'f\5'6gtgiEi8ESRj5f=a
+k3(sml0@U$m-X60n*ol;o()DEo`"Lbp@n=[q#C0iqY^6hr;HTdrdk*#s4dR(~>
+JcC<$JcDtSl2LMWqY^!_r;-BfqY:'arq?9_s7H?_rUU!Y!:]sU!Uf@SljrFIlKRQskND!ijlGI^
+io0mp(>n!)h;$c=g=b-1f@JL%eC2jndEp4bqc3Vpqc3Yqr)NVnr)N_qnPf9`+#Yr0/h8G'/hK%A
+;GrjIQ'IStP*1q[/M&S31GgpE2#]?O1H[c_5tXgC8kVfL8P(a$4YoW$:esk^:/b%erDNPjoht]b
+n5B6a!)iVkr_ibps&/blrDNVlr_NSlr_i_m!`DlnrDESk"&Vll;>sDk:C'co;,C%b:f1*d;#aGm
+;#jMk;>*i_:]4&a:]+#h;>X5l;,I-cr_E2`r_E;cs%r/[k"u(Tr(mAjrD<8dq+q&gr_`kq:JXea
+r_iPhr)!Dj!DlSj;?'N(:f:1k9M.rN8kM`D6pO!455eLb:d@915Pm\L5sRY#6:1Z;"[YL@5X.L4
+5lX+M5lEnK5X@[7<<,>a5QjA<8PrXd=Su>%=SGtu=Su=n=T2G.=BAR(<E<+!rDN\qpf%2ls&K"s
+!)rPgr)*GkrDESms&/nqr_`Vlr_rhp!07&>!K`HCP5g^GPl?pLQC!s;Qj9%JR[]e:S=TYN!hZ-Y
+rh0@eU].%iV5F6i!N<!sWWfH)Xf\b0rif8)ZEpmE[C3NQ\[f;`]Y(ql^V@V%_Sa=2`lH0Ab0.uP
+c-FY^dF-LneCN7'f\5'6gtgiEi8ESRj5f=ak3(sml0@U$m-X60n*ol;o()DEo`"Lbp@n=[q#C0i
+qY^6hr;HTdrdk*#s4dR(~>
+JcC<$JcE"TlMgSWqY^$`r;-?eqY:'arq?9_s7H?_rUU!Ys7$$V&FSrQm-O'(lKRQski_*jjlHF$
+)rfi7i8<DIh;$c=g=b-1f@JL%eC2jndEp4bcMaF9TDP5VSc>5ZRfJoVRK&ZQQN3EIQi<BPQhm!`
+SXP[sJTlQmIV<DsX/MqoQ'@JqP*(k*Nt?hiIXZfrJ:`H-K4AG$]"5EM[2--UKT2=`N3IMOG'J7]
+J;&rBNfB!VMu8D3M#E)0L5#SZr.Fp#q1\d#rIt$$!/:<)"GMSaKnfMZs+CB)re19)!ec2YrIY!!
+rIP'&K)U<$JG=WmIK=kEr-eTord=iqH[GO6rd4TiqKi9iH$TC6!."Qird"<crH\<cq0Dpbs*O`m
+rHn<cnU'kTrd4Tl!.OlpqgS3fqLAWuJ:IQKs+13%rIb-'s+LH+re:<*(57EqKn+SuH$Xa[G^!_6
+E,99&CmB*^pKmj)!Dm%u?2%V(>Q.e)=ohc0r`fA*s&o>'$HC--=BJ^.=&tBlrLj.`qP+"bqk=+d
+V#."gVYI(_VZ"jBccu1,rlP5aqTJu`b43URb4<[PaofhHNfO+"!K`HCP5g^GPl?sJQ2m9NQi`\E
+Rf8cWS=TYNs.9:arh0@eU].%iV5F6i"fSE#WiN6#X]2I,YctC<Za7$H[^N]V\[oDc]Y2%o^qmn)
+`5T^8a2lBFbKS5VcHstddaZdsf%8R-g=tE=h;7)JiSrnXjlY^gkiq?slg4!*mdKW6nF?)?oCMVR
+o`Fj]p\jmeq>^<hqu-HkrUg)?s+14)s*t~>
+JcC<$JcE"TlMgSWqY^$`r;-?eqY:'arq?9_s7H?_rUU!Ys7$$V&FSrQm-O'(lKRQski_*jjlHF$
+)rfi7i8<DIh;$c=g=b-1f@JL%eC2jndEp4bcM`LtL&6Q'KD0umJb"?dIg't7D.R*Yra-+:<e5gM
+KS5VTPEM)kOT(:Q@UNVQ@q&qXA7]@Q<`Y3=N/@Ois+V,!Dg$)AM.pa>C2S$2Ed)eSGkcL^G5l[b
+FSKqVFS'VSFS'\UFSg1cFEM\IF`__JrcJ0]!-7sXs)S!Vs)7sXqf)OQpi-4Ns)A!Vqf)FNpMU"J
+rb_^QrG;@JqJQ:Lp20qKCi')foPX\Gs(hdSDJjCVDXhZCD?+VRD?+VQE;FSPErL%YEr9nWE;FSL
+ErC(WFT6IdEH#l7DZ+DYAn,@^@UikoAn1^9rDNoZNJp\1;,R6hr)*Gks%r\l"B&/r;,[?iq+qE_
+Q'G-@:esh\EJaUKs+pW2qMFg$qht?1q2>6A!h,OFp6biG!1<VN!1<bPq3_2KrK[MOR$di=s-WhQ
+qj.2Is-<_GNfO+"!K`HCP5g^GPl?sJQ2m9NQi`\ERf8cWS=TYNs.9:arh0@eU].%iV5F6i"fSE#
+WiN6#X]2I,YctC<Za7$H[^N]V\[oDc]Y2%o^qmn)`5T^8a2lBFbKS5VcHstddaZdsf%8R-g=tE=
+h;7)JiSrnXjlY^gkiq?slg4!*mdKW6nF?)?oCMVRo`Fj]p\jmeq>^<hqu-HkrUg)?s+14)s*t~>
+JcC<$JcE"TlMgSWqY^$`r;-?eqY:'arq?9_s7H?_rUU!Ys7$$V&FSrQm-O'(lKRQski_*jjlHF$
+)rfi7i8<DIh;$c=g=b-1f@JL%eC2jndEp4bcM^cC<<#ks<;onq<<#tq<;BPo<:Eia<#.GO1G::/
+/1rM62FTnr;GrdEPEM)kOT(==1]B3;2)I*P4[2S591f+Us%*DP4?YJj9i:mc#u4Aq;,^@k;c6Nj
+;>X5k;uKVl;=IKU;ZK_p;ZK_m;>jDl;>sAl;>sJm;#jMk;?'Gn;,I6hs%r\j"]/&n:espe;>O,h
+;ZBVo;Ys>b;#3ue:A@W_:]OAi;?9WkqbR2dpeUlaq+guemn`%A!)`Jep/1Z_"&Vro;>s>l:f73i
+q,.)es&&emr_NPk!DlYl;@??"91_cK9M8#H76gQ2r`0.u5X7Ouq`k<N5X.P$6Mj%M5X.L45QX5<
+5lEnK5X@[7<<,>_5Qs_V=]eg0r`K,%r)iDjoiV5s!*K5%r`'##<E/oq!*&_l!*&qtrDWbqp/:cb
+r_i_m"B&/s;H!Bhs&/kqs&&oXNfO+"!K`HCP5g^GPl?sJQ2m9NQi`\ERf8cWS=TYNs.9:arh0@e
+U].%iV5F6i"fSE#WiN6#X]2I,YctC<Za7$H[^N]V\[oDc]Y2%o^qmn)`5T^8a2lBFbKS5VcHstd
+daZdsf%8R-g=tE=h;7)JiSrnXjlY^gkiq?slg4!*mdKW6nF?)?oCMVRo`Fj]p\jmeq>^<hqu-Hk
+rUg)?s+14)s*t~>
+JcC<$JcE%UlMgVXqY^$`qtg9eq=ss`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#rki_*jjlGL_
+j5T%Ui8<DIh;$c=g=b-1f@JL%eC2jndEp4bcHW#STDY8]SY#VI!1a%Xs-`qUrg<_PrL!>Gs-NeQ
+qNa<XS!/haI"-KkJ7rStW2HMhVl,`AP*(ieO,f3YIt*!"JqSf/@q9&1]"#2U[C*BKDiC$JNNIDM
+GC"RaJqs>bs,I2@N/WYlM#`A1LB<3aL&H]'KD^DuL&H]'L%pB&L&?]'K`Hl*L&Zf+KDgK'K`Zp[
+KDgE#Jc:9$K)gN&JH15qJ,XosI/nZmIK+cqI0"_BpNljdr-J<g"F>E@H$T@5rHeHgq0N!br-8'`
+r-A?irI"Qjq0MOWo6gOa"FPWGIX_9EqL8$c!J#[tJH(-!JH(3#K)L?%KE-`*K`?c*L'r]gKS>,7
+Lk'l"H@#R8$[69"DJs<(D3Ap6:AJ5rZN!`$>l.h$>lS"5=]eg1=^"s2r`fA*s&o>'%`ZQ1=BJ^.
+=&tZsTV/!Pq4dna!MlLgU&h$bqka:hq5<q`r6PJjc2#Nabfe3/aoKW]bQ5o0o#^pSn]CaPrepo<
+NfO+"!K`HCP5g^GPl?sJQ2m9NQi`\ERf8cWS=TYN&>,VgTqS3TUSO]^V5C/gW2]cr=0&F)Xfek3
+Yd(L?Za@-K\%&uZ]">Vg^;%Fu_8=+.`Q#s>aND]Lbg+M[d*^:jeCE.%f\,!4gtgfChr*JQj5]4^
+k3(sml0@U$m-X60n*oi:o()DDo`"O`p&Ojcq#C0iqY^6hr;HTdrdk*#s4dR(~>
+JcC<$JcE%UlMgVXqY^$`qtg9eq=ss`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#rki_*jjlGL_
+j5T%Ui8<DIh;$c=g=b-1f@JL%eC2jndEp4bcHV)tL&$E$KD:&tJcC8uJb"?fIk+K>DJ<Qd?s[5L
+<`am%I<p6nKThR^OcYWbNfB!,@Us"YA7]:O<`X:$N/IUjs+UtiDg$)ALM:O=CMn-4FT-ObH2i-b
+GQ)dcFoQR_Er^=\F8^4RF8p@TFT?O]Fo6=bF`__JFEIM'#]b!-EcQ5BEcV(tpi-4NpMg+Ms)A!V
+qf)IOp20kIrGDUPrG;@JqJQ:Lp20qKCi')foPOYGrbMRPrbq"<no+GDs)7mSs)7gSq/Q@Rrc&!Y
+EH(ns!-%dSq/ZFTs)\6^rcJ0_#'P31E,]`5rG;RJAc?0C@:FUq9htXbrDN`UNW)cS;>a>i;>sJn
+;#X;n;H$Kj;>O)s;3[?2:JXe_:/,nhrJ1E0regK-reg`4qMP--qi(?/rgWqVs-`\M!h#FCrg*VP
+qO%>Nrg3GJs-N_N!gf:ArKmPOs-NSJrKmMB!f`5#rf7)AOoCODP5pjHQ2d-MQi<?RR@9TDRfT%M
+rgj[nTV/!PU8"EYUnsobVl-Jmri0&#XKAV-YHY79ZEpmE[C3QS\[f;`]Y2%o^VI\&_o0O6a2l?E
+bKJ,TcHjkbdaQ^rf%8R-g=k?<h;7&IiSrnXjQ5Oekiq?slg4!*mdKW6nF?)?oCMVRp&F^cp\jme
+q>^<hqu-HkrUg)?s+14)s*t~>
+JcC<$JcE%UlMgVXqY^$`qtg9eq=ss`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#rki_*jjlGL_
+j5T%Ui8<DIh;$c=g=b-1f@JL%eC2jndEp4bcHT?g<;fbq<<#tr<;ons<;fhs<;]br<:Noc<&QEg
+1GCC2/1iJ+3&Eod5<_;0;Nm9,OcYWbNfAuR1GgsF2)R0R4[)8-91_`K91_]B4?YJj9`.]i;c-Im
+<;]Yp;Yj8g;ZB\o;Z0J];Y<rg;Z9Sp;Ys>i;ZBVm;#4#h;Z'Di;#X>l;#X5l:f1*h;#X>i:^9cm
+;Gp@h;H!EioMGE\r_EDf!)EMhqbR8iqbdDkqG7)cpeUlaqbR2fmn`(Bs&&MeohkW`s&&eo!)WYj
+!`2cmp/1ids&&emr_E_p;,U4f:fRBk"&i)l8cD?c9MIlK:AI*R<rZ"r5lX(G5QsG=5=%V&rBUQO
+5sRY!r]gcU69mb"5!M:u5lOa`62WtK8l>Rj!*K/%qcN;ioiV5ss&f;&rD`o"<E/oq!*&qr!*&kp
+!`W0"r)<Ypp/:fcr_i_m"B&/s;H!?gs&/kqrepo<NfO+"!K`HCP5g^GPl?sJQ2m9NQi`\ERf8cW
+S=TYN&>,VgTqS3TUSO]^V5C/gW2]cr=0&F)Xfek3Yd(L?Za@-K\%&uZ]">Vg^;%Fu_8=+.`Q#s>
+aND]Lbg+M[d*^:jeCE.%f\,!4gtgfChr*JQj5]4^k3(sml0@U$m-X60n*oi:o()DDo`"O`p&Ojc
+q#C0iqY^6hr;HTdrdk*#s4dR(~>
+JcC<$JcE(VlMgVXqY^$`r;-?eqY:$`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#Kki_s-,N\"H
+j5T%Ui8<DIh;$c=g=b-1f@JL%eC2jndEp4bc-4A'TDkGSSH>=NS,SlMR/WHPR/N?OR/WHLQ9Lh-
+ObeO3I=6W[BWeJ8VPBcOQBJ/.OH5H_NJrgSMh$D3K7m`E@U?XV\$WQN['XalQ^*N1GBnF[H@UU'
+N;SY<NfB!VMYr;2M#E)/LAlo*K`6W%K_^?#K`-VqLA$?$KE-Z'KE?j\KDU9!Jc:9$K)gN&JH15q
+J,XosI/nZmIK+cqI0"_BpNljdr-J?hrH\HhrHJ<frd+Ngqg/-br-8'`r-A?ird=Wjq0MRXo6gOa
+s*Xip!.OoqqL8!b!J#[uJGt&uJGt-"K)UB'KSBAXs+UK-s+UK+s+LZ4Ll%"?H[Ga<%!d&ABPqa*
+CM@U1F%uX/r*BB/r_WGsp07l-=]eg1=^"s2r`fD+r`T5&$WkBj=BJ^.=&tp%[JZd!U&LecV#R4f
+UAq%eV>d@fVt[(bciMJ;qTJl^!6bAa!6b5_!R&XVaoBNRao9E`MMqIm!f`5#rf7;GOcbfiPEV71
+Q2d-MQi<BPR/i]TRfT%MrgjLiTV/!PU8+KZUnssfVbj=kWiE,$Xf\b0YctC<Za7$H[^WcW\[oDc
+]tV7r_8=(,`Poj;aN;TJbg"GZd*^7ieC<($f@\g2gYCWAhr*GPj5]4^k2tmll0@U$m-X6?mfr:O
+o()DDo`"O`p&Ojcq#C0iqYU0hr;HTdrdk*#s4dR(~>
+JcC<$JcE(VlMgVXqY^$`r;-?eqY:$`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#Kki_s-,N\"H
+j5T%Ui8<DIh;$c=g=b-1f@JL%eC2jndEp4bc-4@bL%p?$K*$XWKD^?#Jc1,uJbXceIj9&UCh7$Y
+?=%&B<e>pPI!U$ZEc-PmOH5H_NJrgSMdp4+A7ba@"'(>>MuJP4L'D!oG&VMWCAquNDK9c?r-86e
+rcn9`rc\<arcJ0]s)e6]r,h[SrcIUOpN6@Ts)J*\rGqaSrG_dTrc%jTpMg+Ms)A!VrbqpWE,bbo
+n885CrG;FL!GlWMDZ+GHDZ=SRD#S;EDZ=PUCi+$,rbq%=nSe>C!,qjSs)7gSpi6:RrGh[QqJl=O
+r,Vm\F8g:]FV].EGBe.HE,TT2DJa6)An5F^@Ua"^:&[oc;ZMdU;#X>i;Z9Mo:f73is%r\l!`Drp
+qbd2ds&&f]s%a#!:JOW2MMd1FLl%#_M#`G3M>E,+Mu/J0Mu9(ERfAfPR/WKRR/WEPR/33NR/WHJ
+R/`NPQ3*D?R/NBOR/`NLQN!3OMMqIm!f`5#rf7;GOcbfiPEV71Q2d-MQi<BPR/i]TRfT%MrgjLi
+TV/!PU8+KZUnssfVbj=kWiE,$Xf\b0YctC<Za7$H[^WcW\[oDc]tV7r_8=(,`Poj;aN;TJbg"GZ
+d*^7ieC<($f@\g2gYCWAhr*GPj5]4^k2tmll0@U$m-X6?mfr:Oo()DDo`"O`p&Ojcq#C0iqYU0h
+r;HTdrdk*#s4dR(~>
+JcC<$JcE(VlMgVXqY^$`r;-?eqY:$`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#Kki_s--0=4J
+j5T%Ui8<DIh;$c=g=b-1f@JL%eC2jndEp4bc-4@1<)Z`p<;fhq<;okt<;]bp<;onr<;ohr<;'8i
+<$4.X1G::./1iG42afqr5<V+h4#^'"OH5H_NJrgSM`!<i2&e\@5!2M384cHI8P)6:4YoT#:Jstb
+:f:1i;H*Qor)<DgrDNVnrDNVlmo&[S!)iYjs&/hnr)!&`qb[;is%r\j!`2`kr_WSkr(mVo:f:1g
+;,U<j;=dW]:]=,g:]F2h:]!rg;>X5k;#3ue:A@Wa:A[id;".9B:]OAl:]OAi;"[]`;#aDm;?0Sm
+:B=<johk`cs&&ems%aJ.;,U:j;GU+c;H$Ll;H$Oi8kVfK91;9Dr_EAT!*9(q!C9!M5Q!bM5sRY#
+6:1W:"@,7=5X565$pd3F5<_7q5X@Y"<E8o]!_ZBgr)s&%!*B)#qH<f$q-!Amr`K8(=8Pu!<`N/u
+;Z]os;uTbp;Z]ou<W#er;ta,e;>sJm;$9cq;c6Ni;?'Mq;i6M4Muo!!NrG(EOHGZgP*;)org!ML
+!13\Ps-WkUrgNqYSc52gT:hjNTq\<WUnjiarhiSkWN)u!XKAV-YHY79ZEpmE[C3QS\[f;`]Y2%o
+^VRe(_o9U7a2lBFbKS5Vcd:(ee'umuf@S[/g=tE=hV[8LioB([jlY^hl07L!m-O--rpL'\nac8B
+oCW%Ts7QHerV6Egs8)Wirqu`no_sFAJcFL)J,~>
+JcC<$JcE+WlMgYYqY^3e!*K3sr;-?eq=ss`rq?6^s7H?_rUU!Ys7$$Vs6]mSrp0[OlMg#Kki_s-
+,N\"Hj5T%Ui8<DIh;$c=g=b-1f@JL%eC2jndEp4bcHOJTTDkGSSH57MrgNkTnX'<CrL!SN0UA&l
+Q=l_ON.cY/I!pKXB!&#0VP0HGR$!>_ViQn!NJrgSMM[1GK4AD#@'7#K[C-"@%<6H6J;ps\H$FX]
+JqAmUN<G9$N/W\nM>rD1LB*).L&?W(KD^DuL&H]'L%U0%Knb?]K`Hf)Ka!3bKnP,3rIb6+KS0/R
+r.4m"s+:<'rdb'"pj`9l!e#HDr-eTord=fpHhVgeI!bj="*o3>Hi89jH2VsfH2`-hH2DpaH2W!`
+H2W'hHiJKkHhi!WHh2XaHiJHpI=?YEIJJ?dJ,XoqJ,b&sJ,b'!JcC?%KDpN(KDpN(L&Qi*KER!`
+Ll$ufM@kAbI!L!`H?j^IDf9N/Bl%s5r_EJhra,P"qH`f"#[:J7=^"s3=]t`.r`T;)rE'M1aN7Oe
+=]ea+V73k,UA^ecU&^tfV#R4iUAgqfV#7(hVY-k`VYSR>ccu=0rlbAcrlP5aqoo)`!6XlSs2slR
+"j2[YMMd>kMuo!!NrG(@OHG\)Op@28Pa.N"QC%T<!h#LGrgNqYSc52]T:l1W?)"*iUnsobVl-Jm
+WiE,$Xf\b0YctC<Za7$I[^WcW\\#Me]tV7s_8=+.`Pom=aND]Lbg+M[dF$CleCE.%f\,!5gtgiE
+i8ESSj5f=ak3(smlKdg'mI'E2n*olHncA@Srq6<b!;HHes7u]kqtpBjrVcBfJcC<$g])d~>
+JcC<$JcE+WlMgYYqY^3e!)idmr;-?eq=ss`rq?6^s7H?_rUU!Ys7$$Vs6]mSrp0[OlMg#Kki_s-
+,N\"Hj5T%Ui8<DIh;$c=g=b-1f@JL%eC2jndEp4bcHOJTL&-JsK)gN%Jc1*!Jb=NoIt79C,?/c&
+Bk(LX?XR;D<J#[IHZsRQEc#N&KTD1SNJrgSMM[1GAGoO1KoCrhM#W2??t3baFGjjKC27^-Ecu\Q
+rHS<erHS3`rH80`rcJ0]rcJ0]qfMUSrcI^R!d&R-rcA-]r,hjXr,VRPrc%jTrc%jTpMg+M!-%pU
+rbqpWE,bbonS\ADs(h[Nr+uIND>S5MD>S2ND>eAPD#eDOD=h`DD>nJ;DXq`DDZ=YSDZ=YQE;=MQ
+EW^<#E,k_ns)A$Xr,MRRq/cOWs)eBdGBa%2&TVi0DJa9-DJWosA7]7[@qK9N:B+,h;uKPl;>a>k
+;#sKjr_ibmr_W_p;c<Kiqb[8hs-<U[##J)j9n/%XreU'#qhk0,r/CK1qj[VSs-`_Nrg<bRrg*VP
+qjIJOrg3GJs-N_N!gf:ArKmPOs-NSJ"db(&MMd>kMuo!!NrG(@OHG\)Op@28Pa.N"QC%T<!h#LG
+rgNqYSc52]T:l1W?)"*iUnsobVl-JmWiE,$Xf\b0YctC<Za7$I[^WcW\\#Me]tV7s_8=+.`Pom=
+aND]Lbg+M[dF$CleCE.%f\,!5gtgiEi8ESSj5f=ak3(smlKdg'mI'E2n*olHncA@Srq6<b!;HHe
+s7u]kqtpBjrVcBfJcC<$g])d~>
+JcC<$JcE+WlMgYYqY^3e!(Qqar;-?eq=ss`rq?6^s7H?_rUU!Ys7$$Vs6]mSrp0[OlMg#Kki_s-
+,3@nGj5T%Ui8<DIh;$c=g=b-1f@JL%eC2jndEp4bcHOJTr`&eqqc*>jrDWbsoi(rj<;KPm<&uZj
+1GCF2.kE;)3&3cc5Wq7l4#f/W1fBBqNfB!VMi*@JLc%=X5!;J18P)QJ8P)6:77B^?:Jstb;#=,j
+;uK\o;ZK_k;>sJm;uBPn;>a;l;tX&Z;u]bm;>jDm;>a8`;>X2i;?'Jl:BXKk;,C*f;>j>k:BjWn
+;Gg:h;Z0Jd:]aKj;#=&f:B"&h:B"&e:]OAi;?0Sk:BOEh:/:R[r_E>dr_W)[j\YtSp/(T_s&&ho
+qbRAl;GpBj:B45_;$9]m;,C*g:BOHl;H*Nl&Pl5";,L7h;cc^g92%uM9LM>K:B+,h55e:Y5sYE6
+r'1EO5X.P$6N'1Q5X@\$5Q3qJ64,tB5!D1q5sRY7<Vo#a9Mn\j=oMM'=8Q+u=oDP(>Q7n(=oVV'
+=o)8"=oVS(<;TZ%<`N.!;c?Xp;cEWor_ikt<E8uss&8Vhr)*Gkr_Wer;c?RlqG@DoM2@+IMuJY:
+NK0%uNrkE*OoCLKPE_;sQ'R`&rg3bTR[X5F!M#_[ScPIVrh3VlUSO]^V5C/gW2ZesX/rG*Y-5(6
+Z*L^B['mEP\@K/^]Y(ql^VI\&_o0O5a2l?EbKJ,TcHjncdaZdsf%8R-g=tE=hV[8LiT&tZjlY^g
+kiqBum-O--mdKW6nc&([oCW%Ts7QHerV6Egs8)Wirqu`no_sFAJcFL)J,~>
+JcC<$JcE.Xli-_Yqu$6ds0D_&r;-?eq=sp_rq?9_rq-6^rUU!Ys7$$Vs6]mSrp10]lK[Wuki_-k
+k2k[aj5T%si#:M0h;-l@g=b-1f@JL%eC2jndEp4bcHOJTb5Iq*Sc>5[S,Si@R/<3kSXGUrJ9ZNn
+Iq`T!XJr%lSXPn0Nf&UFJ9d-5N/NSmM$\unL14SN\@8lRrj32lF*<(o[Wd"BH?t3qMN<enN<bK'
+N/EONM2D4fr.k6)rIk3'r.Om"rIk-'onE[)L5(D9KS92UqLep(KS08U!.k-$rIP!#s+C9$!.aio
+rdFlrI/A?lIf=cqHi86jHi/3iHiJElGm&G?H[:#;H2MmeH2`-hH2W'gGlW0iH2Dj^H2W'hHiJKk
+Hhi!UHhMjdHiJKnI/n`qIJ83cIfY"HrdOlss*t-"If=isJH(3#K)^K'K`?](KEHp_Kn]JY"GV\f
+Ll)%e'7Y=UH?jd^G]RP:DJO!%D09bl:B"&d;#=Pt>QA(*>R4P:=BSg1>$5&.>Q.e+=oDG2=3/Kc
+=]nj.?E:QCUA^ecUAq"fV#@(eV#@.iVY$e`VYAF<ccl7/rlbMgb0%oNqof)ab4`sVaT'B^b43RR
+M#N54MMmDlMuo!!NrG(@OHG\)Op@28Pa.N"QC%T<CRLW[S"#q<SXuFFT:hmOU8+KZUnsrdVl6Sp
+WiN5'Xfek3Yd(L?['d?N\%&u[]=bej^V@S$_Sa=2`lH0Bb0/#RcHjkbdaQ^rf%8R-g=tE=h;@/K
+iSrnYjlY^gkiq?slg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Wirqu`no_sFAJcFL)J,~>
+JcC<$JcE.Xli-_Yqu$6ds,R0Wr;-?eq=sp_rq?9_rq-6^rUU!Ys7$$Vs6]mSrp10]lK[Wuki_-k
+k2k[aj5T%si#:M0h;-l@g=b-1f@JL%eC2jndEp4bcHOJTb5-ecKE$Q&Jc1*!Jc(&tJ,4]jIi``P
+D.R*Y?XR8D<e>mOH?sdWEc>c*A7K"RNJrgSMZ/G<Lkg^c<cF"UM>i;@L2171CitYMCMIU%F)lI"
+GlE!dGl2d`G5ZL_F8g:]F8L(SF8g:PFTur1F`__HF8^4XF8U(VE<'tWEW:"VDuXeTDte5NDuXeU
+DuXeVDuXeUDt.`ED?"DPC]/,MC]J>LDZ4MODZ=SODZ4JOD=h`ED#eJQDrts0Du=JQDuOYSDu=SM
+EW'nXEVOMQEW:"VEVXYNF8g7^Fa!b.r-/lrE,TW2DJj<-AS,L`@prk[A55o!:]!uf;>a>k;#sKj
+r_ibmr_W_p;c<Kiqb[8hs-<U[#Z+;l;1sgaLktSXqMP--qMb<0q4%DQs-`_Nrg<nVQ^=),qj@GO
+rKm>Is-N_N!gf:ArKmPOs-NSJ!/UW2!fDnorepo<NfO+"!g&P,rfRMMPa%GuQBmm:Qtr+YR[]e:
+S=Q7CT:_dMTq\<WUnjiaVl-JmWiE,$Xf\b0YctC<Za@-K[^WcW]">Vf^;%Fu_SX4/`Q#s>ai_fN
+c-FY^dF-Lne^i@)g"P39h;-uHi8N\UjQ5OdkNM0plKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^<g
+qu6NlrUg)?s+14)s*t~>
+JcC<$JcE.Xli-_Yqu$6ds&9!qr;-?eq=sp_rq?9_rq-6^rUU!Ys7$$Vs6]mSrp10]lK[Wuki_-k
+k2k[aj5T%si#:M0h;-l@g=b-1f@JL%eC2jndEp4bcHOJTb5,-8<;TYs<)lrs;ufqr<;ohm<;KPn
+<$""V1bUC//1iG52FKhq5!D(h3]ArR1GLU:NJrgSMZ/GNLkg^K5"&"78P;]K8Mrk'6qC!K;GU(b
+;c6Nm;>sJk<<#nr;Yj8i;Z0Pn;Z9Pk;?0Yg;Y!cc;Z'Dk;ZBVk;#*rg;#X>h;#aDm;#X5n:f1(d
+;#O8i;#a;q:f:1g;,U<k;=[Q\:]=,h:]=,g:]4,i;>jDm;#jGk:BaKi:esh]peUlaqbR2fn5&mW
+r_MuZ!)`Abr)*Djr)!Djs&/kns%`Vkn593^r_EVm;GpHk;ZB\p;#aB&;Gg=j9he8Q8kD]E6r$MV
+:]!rh5sYE6rBU?J"$](<6N0:N5lX+N5X565s$@&Y5<_7q5=%P!<E8r^"[Pj[;HR'#=8H&!=oV\'
+>Q7n"=nc%u<W?%r<=)]+<E)mq<)cdprD`eqs&B"urDWbqoht]br_i_m"B&/s;H!?g!/UW2!fDno
+repo<NfO+"!g&P,rfRMMPa%GuQBmm:Qtr+YR[]e:S=Q7CT:_dMTq\<WUnjiaVl-JmWiE,$Xf\b0
+YctC<Za@-K[^WcW]">Vf^;%Fu_SX4/`Q#s>ai_fNc-FY^dF-Lne^i@)g"P39h;-uHi8N\UjQ5Od
+kNM0plKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^<gqu6NlrUg)?s+14)s*t~>
+JcC<$JcE1Yli-_Yqu$0bs0D]-rqcThq"Xj_rq?6^rq-6^rUU!Ys7$$Vs6]mSrp1$YlK[Wukih3l
+k2k\'iud:>i8EMLh;-l@g=k64f@JL%eC2jndEp4bcHXPUb/sURpmqAR!1NkSoU,ZFq3_,I%%`oM
+Ne;_,I=-QZB!2-3)k`^hQB$oZL4F\sG'KpCMM[1GLPCP;KS-_@[JmNFQ)o1[O1KO\H@:*kJr5_Q
+O,j$q!fi8!reg`4reUK-!/CH+rIb0'r.Oj!re16(onNBus+L3%r.G-*KS05Ts+(0%r.4m"s+C9$
+!.aiordFlrI/A<lIf4]pHiA?jHi86jHiA?kH2i6kHN&3eGQ<$gHN&3gHM`!aGku^`H2r<kI/J?f
+HKTYQI/SBoI!pHmrdFKhqL8WsI=6Qnr."`qrdXru!.k*#qh"m%re:6&"GV\fLl)%es,7SAH@'p^
+H$X[UAohj,C2K,U:/:daqb[/qs'5S0q-420>$+p2=^"s3r`fA*rE0)$$cpFl=]nj.A[8eQ[/H["
+U8+L_U]@1dV#@.iVX^S`VYAI;cN)2cbPo]gbK@uNbPTKabKBP#rQ#)_b0%j)aS3gVLB*/0M#rQm
+MuJY:NK0%uNrkE*OoCLKPE_;sQ'R`&rg4(]R[T_8S=Q4BStD\TTj"1cUnjiaVl-JmWiE,$Xf\b0
+YctC<Za@-K[^WfX]">Vg^;%J"_Sa=2`Q-'@b0.uQcHaeadF6Upf%8O,g=k<;h;7&IiSrnYjlY^g
+kiq?slg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Wirqu`no_sFAJcFL)J,~>
+JcC<$JcE1Yli-_Yqu$0bs,R.XrqcThq"Xj_rq?6^rq-6^rUU!Ys7$$Vs6]mSrp1$YlK[Wukih3l
+k2k\'iud:>i8EMLh;-l@g=k64f@JL%eC2jndEp4bcHXPUb/sX9!el;\p4N9os+(*"s+(#s!e>cM
+q1/En.<fcLBk(IU?XI5C<e>dKH['^UE,96#ARJnN>$Q`=MM[1GLPCP;KS,0]M%>DsE.MY<G)g9P
+C2@d.Ed7S/qKVp`rcn?br,r'_rH&$\rcA-]qK2OSs)ddRr,hs[rcJ!XrGqdTs)7sXrc%gSs)@pT
+pMg.Ns)@sU!-%pU!-%mTnS\>C!c2Xgrb_XN!,_UNrb_XPrb_UO!c;airGD1ErG;OPrbqXNrbq:D
+rbqdRqeuCMs)7mSs)7jTpi6:R!-.aPs)J'Xrc.[Qq/cRX!HiSbGPl^cH3/,+Du=GQCLd?S"_(th
+Akl,#:]!uf;>a>k;#sKjr_`bo;#X;n;H$Kj;>X2h;?)p]:Bs]l:037/MMUeZqhk9/q2><3rf$i7
+!1N_Qs-itUqO%8M"IPOBR$dc=!1<bPpmD)Jrg!VPR$di=s-WhQqj.8;!/UW2!fDnorepo<NfO+"
+!g&P,rfRMMPa%GuQBmm:Qj]=NR[]e:SXl@DT:l1W>,%dfUnsrdVl6SpWiN5'Xfek3Yd(L?['d?N
+\%0&\]=bhk^VI\&_o0O5a2l?EbKJ/UcHstde'umuf@S^0g=tH>hV[8MioB+]k2tjjl07L!m-O--
+n*fc9rpg*]o`"O`p&Ojcq#C0iqYU0hr;HTdrdk*#s4dR(~>
+JcC<$JcE1Yli-_Yqu$0bs&8tfrqcThq"Xj_rq?6^rq-6^rUU!Ys7$$Vs6]mSrp1$YlK[Wukih3l
+k2k\'iud:>i8EMLh;-l@g=k64f@JL%eC2jndEp4bcHXPUb/sW_!`i<$qc*Jns&Atts&B"u!`i<#
+r)3Yr;cEKkrDPj<2)I$@.k</'/N>UR5sIOr4?GM]2Dd0D0.nk1;N$EhM26qAL4t;58P)QJ8kCZu
+6q'[@;,L+c:f:.g;Z0Jl;?0Yo<<#nr;Yj8h;Z0Po;Z9Pk;ZB\i;Xm]c;Ys>k;Z9Pj;#*ug:]OAh
+;#aDm;#X5m:f1(dr)*Dhs%`Yl;Z9Mn;Z0Jd:]O;j;#F,f:&n)g:B"&g;#X>k;Z9Mn;#X5p:/=\_
+:JO[[:]F2d:]=2\:\did:[h3\;=dW_;>sGn;>j>k;?'Mt;,C(b:JgRYr_WVjs%r_n!)rhor_rhp
+rD3u$;GpIo9h\/Q8kMcF:/:daqbR;Z5lO"H5lO%O5=%V&r^$QLs$6ZN5Q3qJ63'=N56!kI5n6+Z
+<Brf65X7Y2;,U=o=8>r!=^(Z+!*\tspfRMqr`&hr#$+`(<)cdqr_rbps&8qss&K"s!)rPgr)*Gk
+r_Wer;c?RlqbdBK!/UW2!fDnorepo<NfO+"!g&P,rfRMMPa%GuQBmm:Qj]=NR[]e:SXl@DT:l1W
+>,%dfUnsrdVl6SpWiN5'Xfek3Yd(L?['d?N\%0&\]=bhk^VI\&_o0O5a2l?EbKJ/UcHstde'umu
+f@S^0g=tH>hV[8MioB+]k2tjjl07L!m-O--n*fc9rpg*]o`"O`p&Ojcq#C0iqYU0hr;HTdrdk*#
+s4dR(~>
+JcC<$JcE4Zli-bZqY^'as8)c%!*B*oq=sp_rq?6^s7H<^rUU!Ys7$$Vs6]mSrp9[N!:'RJ.d6'X
+k2k[bj5].Xi8EMLh;-l@g=k64f@SU'eC2jndEp4bcHXSVb/q_rq47DQ!h5XIrL!eUQ^=)+r0[DK
+qO%5J.[lQ]L4=DqIt26GYH4V"V4O'APE(KUKn"DmG^t<rVhp4bLPCP;KS+o/rj3-(R%'G-fQVUe
+I=-[!MuJk@OH5FrN<P9!MMd7IreUK-!/CH+p4W3ps+L?)onNBure1-%r.G-*KS05Ts+(0%r.4m"
+!J?"&JH15qIft4MIXQV@I/n`qI0+eCHiA?jHhr'fGlW3jHN/9eGQ<$gHN&3gHN/6jHN&3dGku^a
+HN/?lI/J?hHK';OI/SBoI!pElrdFHgqL8KorI"`rIt.EGrI4m!JV!fPqh+p%!el;[rIb3*L]3)0
+M>`;3MuASHIX?BdG^4OXEG9B1CMI[qE_cU0qb[/q!*oM/q-420>$+p2=^"s3r`]G-=^(c+s&TTL
+a]M\K=BB@K\$`UBT`Us`U\LVcUSRjbs/,=a!N)dfciVP=bkfN^bQQ,3b0/!*bQ5o0p<!9S"3J^.
+ao0<Vao7"rLPUccM#rQmMuJY:NK0%uNrkE*OoCLKPE_;sQ'R`&rg3_SRf8cWS=TYN?([d`Tq\<X
+UnsrcVl-JnWiN5'Xfek3Yd(O@['d?O\@K/^]Y(qm^VI_'_o9U7aN2KHbKS8WcdC.geC<%#f@\g2
+gYL]Bhr*JQj5]7`k3(sml0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kqtpBjrVcBfJcC<$g])d~>
+JcC<$JcE4Zli-bZqY^'as8)bV!)`[iq=sp_rq?6^s7H<^rUU!Ys7$$Vs6]mSrp9[N!:'RJ.HosW
+k2k[bj5].Xi8EMLh;-l@g=k64f@SU'eC2jndEp4bcHXSVb/qa(K`Hf&KDpN)K7`fJs+'opqLJNo
+4*#4R@piJI@:<8>Jq/2qHZsOPDe`lq@UNMG>[q;TKSbM?LPCP;KS+o/M2-h*EHuSKW+g$_Ci4<7
+GPla_Gl)ddGl2d`FoZ[`F9$CTFSp4YFRaMOFT-@]FS^%\EcH)>qf2XT!-/!WrGM[Tr,;=K!,qjU
+qJQ@Qrbq=ErGDRM!c2^jrG;=Jrb_[QrGDLN!c;airGD4FrG;OPrbq^Pqeu"BrGVUOrGVUO!,qjS
+s)7gSq/Q@R!-.dQs)J!V!-.^Qq/cRX!-\<brHJTnH@(!bEGoc7rbW!YBk1ge@q&r5APW5#qb[8h
+r)3Mk!DlYm;?p&q:f1(f;c<Kir)!>hs-<U[#>e2k>DnDsM"?K"MYi>0N;8A3N;f:ARfJoVRJN<M
+R08nDQ^F0;R/iWRQhZsJQi<9PQ^F0=QiEHQQi36LL'!-dM#N54MMmDlMuo!!NrG(@OHG\)Op@28
+Pa.N"QC%T<!L]DURfT%MrgmDfTV8'RUSO]^VP^8hW2ckuXKAV-YHY79Za7$H[^WcW\\#Me]t_=t
+_SX40`Q$!?aihlOcHab`dF-Ooe^rF*g=k<;h;7&IiSrnXjlY^gkiq?slg4!*mdKW6nc&([oCW%T
+s7QHerV6Egs8)Wirqu`no_sFAJcFL)J,~>
+JcC<$JcE4Zli-bZqY^'as8)ap!(Hh]q=sp_rq?6^s7H<^rUU!Ys7$$Vs6]mSrp9[N!:'RJ.HosW
+k2k[bj5].Xi8EMLh;-l@g=k64f@SU'eC2jndEp4bcHXSVb/qa(<WH.r<;fhq<;]bp<WH+u;u]bp
+;u0Jl;[bTA0eP%-/1iG52FKh0579P63]AoR1,1I9/M@#Y*)_WLLPLV=KnP)2JkJ^-0JYgL8QSef
+:f("f;,R<jrDEPlr_rhrr_rhpq,.)gr_rhpr_`Pjs&8\jnPfHcqbdAkrDEGgqGI8h!)`Shs&&em
+r_EVm;,L0f;$Bcn:f'q`r)!Glr_`>b!)NSjrD32`rD3GirDESmr_WYlrD*Mj:Jame:A@Tb:ARcc
+;".9W;#X8Z:]OA`;#X>j;?0Sm;#aAn;GmEi!)NSjnkoE`r_EVm;,U?k;Z9Vm;?Tip:f($g;@-8q
+91qlL927iLr_NDf!C9!M5Q*kH5m'>:6:1Z;s$6TM!C/mK5ScXP5sIOs5<hG"5?1]K5X.M!6r-ZX
+;YaGp=oV\)>Q%at=nl+s<W,nr<<?3$<W,nr;uK\q;u]hs<W,ks;tX&d;>sJm;$9cq;c6Nl;>u:O
+LPUccM#rQmMuJY:NK0%uNrkE*OoCLKPE_;sQ'R`&rg3_SRf8cWS=TYN?([d`Tq\<XUnsrcVl-Jn
+WiN5'Xfek3Yd(O@['d?O\@K/^]Y(qm^VI_'_o9U7aN2KHbKS8WcdC.geC<%#f@\g2gYL]Bhr*JQ
+j5]7`k3(sml0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kqtpBjrVcBfJcC<$g])d~>
+JcC<$JcE4Zm/Hk[qu$-arqZf)['Wq;q>'gap\sm`p&=U`oDJ1Znc/+Xn,MeUmJcJPlN$5Lkpko[
+k2tdejQ#:[iS`YOhVI#CgY1B7f[na+e^W'rdF$=ecHa\YbK@rJaS_V-SH#/ZSH#)VRK&ZGQhm*L
+QURF3Nei74I=?ZtAn\?HVP^#UR[B.pL4Xu)H$4F_K7SW-KSP;:KnP)2Jq8K'I]edMO4AH#H@:9q
+K8YqWP*1rhO,f3Yq2PB3s,$f5reUK-!/CH+p4W3ps+L?)p4iHure1-%r.G-*KS08UpjrHs!eZ)V
+rIO`n"FbiLI=1d;$[d;JH?spbI!^0cH2`-gGli>=HN&3dGl;sfGli;;HMVpaGklX`HN/?lI/J?h
+HL6(ZHLcCbI!pHmrdFWl!.FiqqL8KorI+]ps*srqrdP!"JV!fPs+:<'re(3's+C<(!JQ:-M#W>2
+MZ8V4N"_2!IX??eH?aXNDej6-Bl/*9:J^jar_`Jsq-420>$+p2=^"s3r`]G-=^(c+s&TZNa]M\K
+=BBUR\$iZKUAgqbV#I+iU87dbrhfUk!2fFeo[!ZccHQ..rlbMgb0%oNrQGAebfe0&ao09_ai_cJ
+rQ+iWs+UH,!f)SfreU]6Mi7Rns,@#=rf7,BOcfX+#EtC:Q'IZ$Qi<@`R@9V7S=H.AStD[LTq\9V
+UnjiaVl-JmWiN5'Xfek3Z*L^B['mEP\@K2_]Y2%o^qmn*`5Ta:aN;TJbg"GZd*^:jeCE.%f\,!5
+gtgiEi8N\Uj5f@bkNM0plKdg'mI'H3nF?MK!V>s_p&Facp\ssfq>^<gqu6NlrUg)?s+14)s*t~>
+JcC<$JcE4Zm/Hk[qu$-arqcVTs&&jmq=sp_rq?6^rq-6^r:9mXs7$$Vs6]mSrp9[N!:'RJ/a2B[
+k2k^cj5].Xi8EMLh;-l@g=k64f@SU(eC2jndEp4bcHXSVb/q`GKnP-VKDpQ(KE$PsJcC8rJ,4]q
+IlhakCLppZ?=.)M<EFd$I!U!ZFE),1An5=X?!:KEA7K1^A;>noKnP)2Jq8K'@srEXG,8ngCi+*3
+F*IJ+qKVj^s*4Kdr,r'_rH&$\oQ:%QrH.UQqfMgYs)e*Y"*/C$Er9qSE;XVSE;OSKDuahUE;"5@
+DZ"AOCBA<hD>e;IDZ4JQDZ"AMDZ=POD=h`ED#eJQDuX_NDt%ZDDu4GODu=MQDuOVSDu=SLEW0tY
+EVFDPEVsbUEVa\UEW1"SErgB*r-/-bs*=Tjrd+Ta&8uH)DJj9&A7]=_@q01`:J^jarDEJjs&&em
+!)`_n#>n;o;,L4i;Ys>h;#O8kPmU8^:eshpMi3IKL\?T$MYi>0N;8D3Mu]:FRe`EQRf8`OR/WKV
+R$X/,R/NESR$j?@QhZsJQi<9PQ^F0=QiEHQQi<<NL&Qf.LPUccM#rQmMuJ\8N<#"<NrkE*OoCLK
+PE_;sQ'R`&rg78bR[]e:S=Q7CT:hmOU8"EYUnsrdVl6SpX/rG*Y-5(7ZEpmE[^NZT\[oDc]tV7s
+_8=+.`Q#s>ai_fNc-FY^dF-Lne^i@)g"P39h;7&IiSrnXjQ>Ufkiq?slg4!*mdKW6nc&([oCW%T
+s7ZKerqQNhs8)Wirqu`no_sFAJcFL)J,~>
+JcC<$JcE4Zm/Hk[qu$-arqcUns$d"aq=sp_rq?6^rq-6^r:9mXs7$$Vs6]mSrp9[N!:'RJ/a2B[
+k2k^cj5].Xi8EMLh;-l@g=k64f@SU(eC2jndEp4bcHXSVb/q`G<`N/s<;ono<;fhq<WQ3"r)3Mm
+qGdJn*&fc30.\S)/1iJ42aK_n4Ztkg3&`]P0ek@8/hd/Z)Dj7*L5(D8K7ec,JUfF24[;P=:f1"c
+;c?RkrDNVl!`2`kr_i_o!*&nqs&/em!)WYl$W9i";H$Ll;Gg7f;>X8k;u'>g;Z]os<;TVm;Z'Dl
+;Z0Ji;#=,`;#X>l;#a;k;#*rl:f1%c:Jgg`p/(cbs%rVhrD!>grD*>fr_WPj!`Dlmr_WPh"\qii
+:JO[R:]=2\:\did:[h3\;>3oe:]F8i;>sGn;>j>k;?'Po;#sKhrD<;e!)WSjr_WVj"&Mim;uKVn
+;ZTcnqbmGks%j2(;Gg=g:/";R8kDB<:J^jar_`YZrBU?J"$]%;6N0:N5lX+N5X565'L>&O5<_7q
+5=%S"<E2=M5<qJ&:Jq*hrE0#$r*&VnpK.DprDi_o"BAK'<E8usr_rbps&8qsrDiks!)rPgr)*Gk
+r_Wer;c?Rlr_`]Lre:K0Lku%e!fDnorf$l:!07&>!g&P,rfRMMPa%GuQBmm:Qt;\SS"#q<SXuFF
+TV8'RU8+N[V5C/gW2ZetXKAV-YHY:;Za7$I[^WcW]">Vg^;%J"_Sa=2`lH0Bb0/#RcHjkbdaQ^r
+f%8R-g=tE=hV[8MioB([k2tjjl07L!m-O--n*fc9rpg*]o`"O`pAamdq#C0iqYU0hr;HTdrdk*#
+s4dR(~>
+JcC<$JcE:\m/HhZqu$0br;$Nk['d=@=Sqmlp\sm`p&=U`oDJ1Znc/+Xn,MeUmJcJPlN$5LklL#2
+roPWjjQ#:[iS`YOhVI#CgY1B7f[na+e^W*tdF$=ecHa\YbK@rJaN'jBrLEhW!1a"W!1NhRs-WeP
+rg*AHqNs@2S<T%cH[L3hIqE;pWMZYhSskt2O,SmJJUDTaJ:N3%J:iN0L4t;6K7ec,J:O,KXc0i9
+G^P!lKS59^PQ-dKOcYWaNW+n6NW"e8M?8WjM#<#.LAci!K_U6$K`-VuLAZc(K`?`/KS>)5L&?T)
+KnK>Upjr?prIOZl!e,NEr-\QmrdFfos*FusH[C-fH[9u9HMr-hHN&3gGQ;seGlE$gGm8S?H$Xa]
+HN&3dGku^`H2r<kI/SEiHL6(YHN&9jHMr3jHN/<oI!pElrdFHgqgSTpr-e?hrdXourdt0&s+:9'
+!/1<'s+CN/L51S@rJCQ3s,6f6'TJ-4H[L-bHZsaZCi*s)Ci+*5E_lR/r_`\nqd'#&#[:J7=^"s2
+>$Co0s&fA+=oMP'=9$DB=UA87>(*lh[^<<7qkX7erLsChUnspeVZ3RmVYm@kW;WXcciMJ<q9/c]
+"O"s1bKKk.rQ>2`prWKU!6P5_!6P2\r5ntk!ec8]re:K0Lku%es,$f7rf$l:!07&>!g&P,rfR;G
+Pl?pUQC!r*R$jD3S"#q=rgm;cTV8'RUSO]^VPg>jWN*##Xf\b0Yd(L?ZaI6M\%0&\]Y(qm^VI_'
+_o9U7aN2NIbK\>Xd*^:jeCE.%f\,!5gtgiEi8EVTj5f=akNM0plKdg'mI'H3nF?MK#kR]\p%A%P
+p\4[^s7u]kqtpBjrVcBfJcC<$g])d~>
+JcC<$JcE:\m/HhZqu$0br;$Ehrf@%VqtU-arq?6^rq-6^r:9mXs7$$Vs6]mSrp9[N!:'RJ!U/_G
+js]?Pj5].Xi8EMLh;-l@g=k64f@SU(eC;spdEp4bcHXSVb/q`Ga+T-EKDgK&KDpJrJH15qJ,Fir
+Il_[iBjt=R?XR8A<e>gJH[0gXEc>i.AR]+T=^#<G@q9([A7fJ.KS4u1Jq8H&FDuePNG33FDK'Z=
+GPHI^GQN/8GklXbGlDpbFoZ[`F9$CSFT$7_FEM_JnoakPrH&!\s)S0\rcA*[s)A$Zr,MUQol'MB
+qJQ@Orbq=ErG;[RCMRa'rG2INqelCM!,h[Nrb_dSCi'&eoPXYFs).jTs).UMn8A5Dr,2IOr,)LQ
+rbhaSr,DIOrc/!Yp2C"Or,DIP!-/!YqJu^[Fa!Y+s*4Qhs*OWhs)A!U%<$'"Ch76jARf.YB4Xm9
+;#X>h;ZBVn;#X>t;,C(d;,U=jqbd8frDET[!DZGi:^(EgMi*=GpPJd)qht<0qMYB4rgEeTq3qGS
+R@3l<rg<nVQ^=),rL*SN!13MKs-N_N!13\PrKmPOs-EnTK7ei2L&Qf.LPUccM>rG5MuJ\8N<#"<
+NrkE*OoCLEPEc'3$^R-GR$a;1R[]e:Sc53aT:hmOU8+N[V5C/gW2ZetXKAV-YHY:;Za7'J[^WfX
+]"G\h^V@S$_Sa@3`lQ6DbKJ/UcHstee'uq!f@\d1gYCWAhr*GPj5]4^k3(sml0@U$m-X60n*olH
+nd+jZo_%nNp@n=\q#C0iqYU0hr;HTdrdk*#s4dR(~>
+JcC<$JcE:\m/HhZqu$0br;$Ehr`&kdqtU-arq?6^rq-6^r:9mXs7$$Vs6]mSrp9[N!:'RJ!U/_G
+js]?Pj5].Xi8EMLh;-l@g=k64f@SU(eC;spdEp4bcHXSVb/q`Ga&Q.<<;fhl<;fhq<WQ/ur)3Mm
+qG\S92`*3?.k</'/iPXR5s@Ls4?>J]2Dm6E0eY+11c$pEr\G?I22-^:K7ec,J:KO?5"A7@:esqd
+;c6Ki;Z9Pm;#aDm;Ya8j;ZBVn;#O8k;?p,u;Gg7e;,R6hs&8hns&/nqqbmPq<E/iorDNPjs&/em
+qb[/eohbZcs%r\j!)WGfs%i_l;#O5k;#X>c;#X8j;#F,g:&n)f:B"&g;#X;n;Gg<j;#O2i:'=?h
+:JO[R:]=2\:\did:[h0\;>*id:]F8j;>sGn;>a5l;,U<k;#sKhrD<;e"Ahrm;GmBh!`)WiqbmAk
+!E)el;ZBZ':f1%d;c-Ik9MJ2Sr^m5[78NeWr_`\n!'gEIr]pWN5XIg:62s4M5lj58r]h/`69mau
+4[2.r5sJ@L5sRY!5XnOHr_`_ukZRR\r`&ksqGdJq!*/qrr_rbps&8qsrDiksr_rSir)*Djr_X##
+;c?Rl;1jLSKn]M\!f)Sfre^Z4!/pi8s,@#=rf7,BOcfX+!L&cIPm`nEQ^F/.R[T_8S=TYN>+_I]
+Tq\<XUnsrdVl6SpX/rG*Y-5(7ZEpmF[^NZU\[oGd]t_=t_SX40`Q$!?b0.uQcHaeadaQ^rf%8R-
+g=tE=hV[8LioB([jlYail07L!m-O--n*fc9rpg?do^qhLp@e7TrqQNhs8)Wirqu`no_sFAJcFL)
+J,~>
+JcC<$JcE=]m/Hk[qu$0br;-Bf"gthL\6)l4q#0sdpA=O^o`"I\o)J7[nGVhUmJuYRm/QAOlMg#K
+ki_s-.coaOj5T%Ui8<GKh;$c=g=b-1f@JL%eC2jnd*L"_c-4ASaiMQD`grZjrLNtYqjRSSr0dSP
+!13VLqNq&G4(k"CMLp)$I=PsBR]NBaUS"!CQ]R)ZKn+PsG'A@eJUrE*KS>,8LUr+iJUi99Qc+WY
+GBnI_JV8`9P5LODP5gXGOH,>"N;JV4MZ\inM2;(b!/CH+on<*o!/1<)p4`U%K`6](KER!^KS>*Y
+L&?T(KDgDtJc:6&JV&LQJHULQIsukCIfY"GrI"frI=-Hkrd=`m#C:`DI!g9eH2`-fH2i3iH2Vsi
+GBe@Xrd+He#'tQ?H?a^\qKVj^r-AKmI!g9fq0MIUpj2jbrd"]oI!pHmrdFWl!.FiqqL8KorI+Hi
+rdXrurdjrus+:]4K7\`.KS5&6LPL]aM>rJ5Mu8P6NrP.PKm\8pH[0p]EGBB1D/3pMF&2^1r_`Ym
+s&8l%q-3u*>$1`+s'#D+s&fA+=oMP'=9$DB=U826@>),![^<=;U]@1eU'@BgV5:&cV>I.fVuEXo
+Vt87;cd:"`q9/c]s2tGcbP]T_b5f][ao09_ai_cJrQ+oY!.t3&!ec8]re:K0Lku%es,$f7rf$l:
+!07&>!g&P,rfR;GPl?pKQC%T<@[W[SS"-">St;RITqS3UUnjiaVl-JnWiN5'Xfnt5Z*L^C[C3QS
+\[oDc]tV7s_8=+.`Q#s>aihlOcHaeadF6Upf%8R-g=tE=h;@/KiT&tZjlYail07L!m-O--n*fc9
+rpg?do^qhLp@e7TrqQNhs8)Wirqu`no_sFAJcFL)J,~>
+JcC<$JcE=]m/Hk[qu$0br;-Bf"cne.P#>3Wq#0sdpA=O^o`"I\o)J7[nGVhUmJuYRm/QAOlMg#K
+ki_s--fsFLj5T%Ui8<GKh;$c=g=b-1f@JL%eC2jnd*L"_c-4ASaiMQD`r:VhK_pE%JcULUpjrHq
+s*t#urdXfq*e.11ChI-[?<pu@=*9(BI!KsZF)c&1An>@X?!:HAqd^ISAS#M6K7\Z)J8o[kEJ8+B
+D/XB8Fa3n2!.+KerHS?f!-n9a!-nKer,r'_rH&$\oQ:%Q"*A[.FRjPTFE@G'"ESU)F*.D&!ci@'
+rc7gSr,D:Hs)A!Vq/H7M"E&-qDf>/`rGDRNs(_XOD>e8ND>S5JD?"DWD/O3.DJa3+rGD4FrGDFL
+pi#\?rbq[Or,;RPs)7mS!,qdSpMp4R!-.sV!-.^Os)IpVrc.sYqJua\F`qs+GQ2mhH$Xi5H4b:=
+E,TZ4Df'2tAn5F^@XMc`r)!Air_ibpr_`_nr_WSl"Aqul;,R<jqbd;gr)*KZ$;OAn:fV:hMi*=G
+q2+s*qht<0q2>0=s-ieRs-itUq3_/Ls-NhRR/EBDR/`NPQ3*D?R/NBOR/`KRQ@f*g!ec8]re:K0
+Lku%es,$f7rf$l:!07&>!g&P,rfR;GPl?pKQC%T<@[W[SS"-">St;RITqS3UUnjiaVl-JnWiN5'
+Xfnt5Z*L^C[C3QS\[oDc]tV7s_8=+.`Q#s>aihlOcHaeadF6Upf%8R-g=tE=h;@/KiT&tZjlYai
+l07L!m-O--n*fc9rpg?do^qhLp@e7TrqQNhs8)Wirqu`no_sFAJcFL)J,~>
+JcC<$JcE=]m/Hk[qu$0br;-Bf"]SK%<^oRXq#0sdpA=O^o`"I\o)J7[nGVhUmJuYRm/QAOlMg#K
+ki_s-.coaOj5T%Ui8<GKh;$c=g=b-1f@JL%eC2jnd*L"_c-4ASaiMQD``6#<rDiMirDihts&8ts
+r)3PnqG[VP2Dd*=.fM"53&a)g5X%=m4?GJ\1c7$C0/+t2qD8(-$VZ2)JUi8/5!VP/:&[ug;ZBVo
+;?0Yo;Z9Mr:esna;>jAn;cNZnr_`_nr_WMirDEVmr_WVlr)*Mnr)3Pn!)i\m"&r9"<;]\n;Z'Al
+;Ys>h;#=,_;#aDm;#X8i;#4&g;#X;p:f1%d;>!cb:B45g:]=)h:]*ue:]F8f;?'Jm:C0cl:JOY]
+:esh]qbI2ep.tZank]'Xr_NMis%i;as&&Mer_EMjr)*Jl!)`\ks%rborD<PjrD<;er_NYn;Gm<f
+!)`Vkr_ikr;,R6hr_jG/:Jjte;,L7j;+s_X91hcL6VmVVr_`Yms&8n^r]pWN5XIg:62s4M62s1K
+5SQLN5X.Cp5<hD!5?1]L5X.Iu85E+^;X%?W=Su.t<<6&trDWl!<`W5t<<#np;uoosr)NbrrDWMi
+r)*Gkr_Wkt;c?Rl;1ee"!ec8]re:K0Lku%es,$f7rf$l:!07&>!g&P,rfR;GPl?pKQC%T<@[W[S
+S"-">St;RITqS3UUnjiaVl-JnWiN5'Xfnt5Z*L^C[C3QS\[oDc]tV7s_8=+.`Q#s>aihlOcHaea
+dF6Upf%8R-g=tE=h;@/KiT&tZjlYail07L!m-O--n*fc9rpg?do^qhLp@e7TrqQNhs8)Wirqu`n
+o_sFAJcFL)J,~>
+JcC<$JcE@^m/Hk[qu$0br;-Bf"o,O8\@K0L=T8'npA=O^o`+O\o)J7[nGVhUmJuYRm/QAOlMg#K
+ki_s-.-9OMj5T(Wi8EMLh;-l@g=k32f@JL%eC2jndEg+`c-4ASb/hZE`l7kHs.&tUrgNkT"dk^G
+R$X0;QMm0FQmQF6Nei:1I=-NWBs"A3VP0EEQ'@;cKn4]"G'ALgJq8Q,KSG/7L]4jq]7GKuOdql0
+G'\LaIt`Q6rf[2Cs-!DE!g&J&rf$`6!0$i6re^T/s+^H*re(9*q1SBop4`U%K`6]%KER!^KS>-Z
+K`6W'K(sorJdR'\Jq8H'J:E&tIenNpI=2!Ard=`ord=Zkrd4iqH$O^^qg&3frd"Kfs*+Kf!."Qi
+r-A<grcnQiH$T72rH\Ef!."Nhs*Ocnpj2=Srd"<cs*O`ks*FfpI=D0DqL/EmrI4Wn!.OlppjW0k
+s+(*"s+1]2Jq8N*K7ec-K7ei2LAlu+M>rJ5Mu8P6NrP1?OV!"jH?jg^H$=1BDK0N/D=r&L;#X>k
+;Z0Po?27b*>6%e(=TDY(>Q7h,>$:i,s&TWMa]VeN=_Wi(\$iZKrM0Fgqk=+dV#7(dVYd:kW;`^c
+d/VDmcHZ4/rQP5`rQP2_!6Y)YrQ#)_b0%j)aSj3^JV&LQK*$^[L&Qi,LB*/0M>rG5MuJ\8N<#"<
+O*m%OOcklkPE_>tQBml)R$jD3S"#q=St;RITqS3UUnjiaVl6SpWiN5'Y-5(6ZEpmE[^NZU\[oGd
+]t_=u_SX71`lH0Bb0/#RcHjncdaZdtf@S^0g>(N?hr*GOj5]4^k2tmll0@U$m-X60n*ol;o()DE
+o_%nNp@n=\q#C0iqYU0hr;HTdrdk*#s4dR(~>
+JcC<$JcE@^m/Hk[qu$0br;-Bf#l'LDP*1r+;H!MgrV$-]rq-6^r:9mXs7$!Us6]mSrp9[N!:'RJ
+!U/_GjsoKRj5].YiS`YOhVI#CgY1B6f@SU(eC;sqdF$:ccHXSVbK@oIa2Z)NKDpPtK)gMuJcC9#
+J+\<q<,l_c@9WY;&li"bIscNdF)u>=CM.0e?s[&AraZ"=raZdVAS,M6NK&mJJ8fLSEdVS:D/XB8
+FF*\,!dK!9rHRs[rc\NhF`qqNFmjGNEr^=NFTHT*rcA6`EcZ:"F8p7aF)l;@EH(hqqJc4J#&\?t
+E,]`6qJc=MrbhaSno"ABs(q^N!GlWOC]J>LDZ"AND#S;OD?4Tjr,)+Erb_LLq/>b?rbq^Pr,;OO
+!,qjSs)7dRpi-=TEW'kVEV=AOEVskUEW:(VErgB*rc\3`s*+NhpNlje"EJI"DJoGj#\[a]ARo7[
+^LmC?r_`YmrDN_p;>sDk;?Tin:f1*h;Ys>i;#O6#:m@5?:JakkDi9O2LkkkaqMP0.q2G--qj@GQ
+q4%DQs-`_NrL*VOrL*5Ds-N_N!gf:ArKmPOs-Ee<JqEuS!ec8]reCH.!/UW2s,$f7rf$l:!07&>
+I#sJQP*2#mPa.N"QC!u+R@9S6S"-%@StD[LTq\<XUnsrdW2ZesX/rG+YHY7:Za7$I[^WfX]"G\h
+^V@V%_SjF5a2lBFbKS5VcdC.geC<($f@em3gtgfDi8ESSj5f=ak32'olKdg'mI'H3nF?&>o(2MG
+p%A%Pp\4[^s7u]kqtpBjrVcBfJcC<$g])d~>
+JcC<$JcE@^m/Hk[qu$0br;-Bf!r,_pr`9"frqHBbqt9s\s7?0Zs7--YrU9dS!:BdPs6B[MrojII
+kPjTljlGI^io8qTi8<DIh;$c=g=Y$/f%&:"e'cXkcd'h\bfe2PaN2EA`V`a-<;TYs<)Z`n;?0Yk
+<#dJI1+t1./1`D42F0Vm5!:qf3&``P1,1I9/1rdV1DM`(1c%g":/-:i/j;KV8P`/[:fC7irDEDh
+r_Wep:JXearDE\q<)icor_`ep:f.$dr_`_nrD3Jkp/:Za"&r9#<;]\m;YEud:]X?grDE2`s&&em
+s%iSiqGI5gr_`Yks&&Jdp.tZ_!)NMfr_NPjqbdAis%iYis%`_l:Jajd:Amuf:A.K_;"IKX;#X8i
+;#X8a:]OAd;#X5j;#F/k;GmBhs&&eor_`PhqGI5g!`;inqbR8iqbmGms&/hnr)3PnrDX>);G^4e
+;GpIj92%uP8P2fJr)!Air_i\ns$6TM"[>7=6:!p:5lX.M5Q3n^5sdh$4Zu"o5X@Y8<C&l75=.q;
+;>sJY=nl+u=8Ptr<<?,u;uTbp<Vo_q;u'Dk<W5tr;tj2h;>sJm;$Tut;c6MEJqEuS!ec8]reCH.
+!/UW2s,$f7rf$l:!07&>I#sJQP*2#mPa.N"QC!u+R@9S6S"-%@StD[LTq\<XUnsrdW2ZesX/rG+
+YHY7:Za7$I[^WfX]"G\h^V@V%_SjF5a2lBFbKS5VcdC.geC<($f@em3gtgfDi8ESSj5f=ak32'o
+lKdg'mI'H3nF?&>o(2MGp%A%Pp\4[^s7u]kqtpBjrVcBfJcC<$g])d~>
+JcC<$JcEC_m/Hk[qu$3cr;-?erqQK&!P5oB=9/*ppA4I^o`"I[o)J7[nGVhUmJuYRm/QAOlMg#P
+ki_-kk2k\'j!E^Di8EMLh;-l@g=k64f@JL%eC2jndEp1ac-4ASb/hZE`l5ogrgj(Zr1!YR!h#FC
+rg<hTQ^@W9!13JJs-G.)QB6fLG'\OcA9+ZJVP0TKQBR;bKnFi$H$=I]It<3)K7nu6LkiRQrjrSJ
+Cn[,ZG'JF_JV8f<r0$uAs-!DE!g&J&rf$]5r/1Z7M26ueL]<,,L&Q`*L%p>oL%^6%KnTGZqLf',
+KS5&5KS9>WrIXfqs+:9%!ePuSrdb#us*jfo!I]@pIJnNnIJnQlHiABnH[5U:qg&3frd"NgrceBe
+!."Qir-A<gqg&'`rH\Be!."Nh"+,ECHh_pTHNJM=H2`-hH2W$hHiA?kHNJSCIf=cmIfFiqIenNo
+If4]mIK4lsIf=isJGk$!K)L8tK)^H,KSG5:LPYncreg`6rJUl=NfT6_rK7,/rd"oqH['@CE,KN,
+DfttSr_`\nqc!N#qHX&)!*K2&!*]>*s&fA+=oMP'<t*0l=^#!3E0Ic?[^<==U]@1fU&q*cV"pkd
+VY?tgcgfB^cN2>9qTJi]rQG/`rQG5`prWHTprWPds+(0%rIY0)Kn]M\!f)Sfre^Z4!/pi8!f`5#
+rf7)AOoCLEPEc'3!LB)OQtr+YS"#q=St;RITqS3UUnjibVl6SpWiN8(Y-5(7ZEppG[^WcW]">Vg
+^;%J"_Sa@3a2l?EbKS5Vcd:(fe'uq"f@\g2gYL]Bi8ESRj5f=ak32'olKdg'mI'H3nF?&>o(2MG
+p%A%Pp\4[^s7u]kqtpBjrVcBfJcC<$g])d~>
+JcC<$JcEC_m/Hk[qu$3cr;-?erqQGS"HlV[;YU1aqXsm\rq$'Ys7--YrU9dS!:BdPs6B[MrojXN
+kND!ijlHF$.,s4Di8<DIh;$c=g=b-1f%&:"e'cXkd*Bq]bfe2PaN2EA`PmI^KS9&O!.srroRQsk
++*DR>@UE8D?XQl>IscQeG]RkCC1_'f?sd2D>@V,QAH$-BB4bagr/D.h?[?^=BkhL&EHH;JHM2Xa
+GQ<$eGkH=fG^"=SF`hkMFo6=]F7jYREr^=NFTHT*rcA-]rc7sYr,MjYE,b_pqJc4J#&\?tE,]`6
+qJc@NrGDURnS\8A!,VXMs)%^N!,_UNrGDOMrb_XPs(qXNoPOYGq/5tGnS\>Er,2CMrbhaSrb_^S
+qJc.JrG_aUpi-7Qr,VaUrc7mWs)n<ar-&-crd"<c#((`FI=6*QrGN!XChI9jARo:\BDbU*;?'Pk
+;u]_p;#O;l;#aDl;Ys>j;#F0":m@5?:JakoFGl'7Lkknbqhk0,qi(B0!1<VN!1N_Qs-itUqO%5L
+rL!POnsKHDrKdJMs-WhQs-Wh:s+(0%rIY0)Kn]M\!f)Sfre^Z4!/pi8!f`5#rf7)AOoCLEPEc'3
+!LB)OQtr+YS"#q=St;RITqS3UUnjibVl6SpWiN8(Y-5(7ZEppG[^WcW]">Vg^;%J"_Sa@3a2l?E
+bKS5Vcd:(fe'uq"f@\g2gYL]Bi8ESRj5f=ak32'olKdg'mI'H3nF?&>o(2MGp%A%Pp\4[^s7u]k
+qtpBjrVcBfJcC<$g])d~>
+JcC<$JcEC_m/Hk[qu$3cr;-?erqQIns&T:k7Rm.OpA4I^o`"I[o)J7[nGVhUmJuYRm/QAOlMg#P
+ki_-kk2k\'j!<XCi8EMLh;-l@g=k64f@JL%eC2jndEp1ac-4ASb/hZE`l5pq<VBDl;ZKeo<W?%u
+;uBMn;uBVp;]IbT1G::-/1iG33']\k4Zb\c2`3BK0eb77/MAs[1D_l(1c70K1eg\>9h\&M4YoT(
+:Jjnc;c<KiqGR;i"Ahli:f70h!`N&tqc!Mm!`;cjqbd>j!)`\ks&&Mgpeq8o<E3#r;uBPe;>sDl
+:B45i;=m]b;>sAl:]4,d;?'Jl;>j;k;>!c[:]=,h:]*ue:]F8h;#jGl:]F2h:B4/h:]F2g:]4&^
+:]F8^:\did:]=2i:\IWb;>3od:B45e;>j;m;,U<j;>a8j;#jMm;>sAo;,U:hr(mAjqbmGm!)i_l
+rDNYoqG[Glr_NSlr_s,!9MS2Q8Ou8I;#X>l;YsAq5XIb$5lO(M62j.L62s1K5Sl^Q5X.Fq5<hD!
+5ZLfM5X.J#8P`2];Gla_pfRPt!)r_nr`&qtr_rhrs&B)!<Us,f<W?%r;tj2g;>X8k;u_CJJH1<#
+K*$^[L&Qf.LPUccM>rG5MuJY:NK0%uNrb?)rfR;GPl?pKQC%T<CRLW\S"-%@StD[LTq\<XUnsue
+W2ZesX0&M,YHY:;Za@-K\%&u[]=bhk^VI\&_o9U8aN2NIbg"GZd*^:jeCE1&f\5'6h;-rGi8N\U
+jQ5Odkiq?slg4!*mdKW6naZ2@oCV\Jp%J+Rp\ssfq>^<gqu6NlrUg)?s+14)s*t~>
+JcC<$JcEC_mJct\qu$3cr;-Bfr:gK+\%0)_^;'YLqXsj[rq$*Zrpg$XrU0gUmHso>s6B[MrojXN
+kND!ijlHF$-K="Bi8<DIh;$c=g=b-1f@JI$e'cXkd*L"^bfe2PaiMNB`Pocergj(ZrL<eT"IYXE
+Q^Ic?!go=@rK[GMqj@>K->B$9Mh6;*It20EXf/+pSXPq3Nf/[JJUD`eG(5!mJ:`<)L4t><rjr-A%
+:<^[^67&mH[L?rLQ.GmP5UUEP5gXGOH5G$N;AM6N;\\7MZ8M3L]<,+L&Zi)L&6PrL%g?%L&Zi+L%
+g9"K`Hf*KDgDsJcC?%JHg^WJUi9#J,XonJ,F`nHiSTnI/\KkHi\P=rd+Kfrd+Qhs*4QfrceEgrd
++Kf!.+Wi!dK!9qKW!brHS6d!df<Br-J?fs*FTi!.=Ec!d]-;rd+QhqKi0gs*XcnqL8El!.Oco!.
+Olpr-nZqs*jrss+(#u!.t0#s+16%rdk?,KS>/8LPYncrJLW5rf$l:s,[2AqiUl+%!d5FH?X4FDJ
+O'+\9.^Hr_`Ymqc!Mo!F/k,>lS".=T)A&>5_\*=TM]/r`K2%&'2jq>$>'QS%#l8['<N)U\phfUS
+O^]V>d@dVZG)hn^.<^!RAsbb5fcabPfZ`b5f]Zao'6UaT-hiJH(0#K)L<'KS>-ZL'!-dM#N82M?
+&S6N!G?&NfT6_OHKO*F-DiRQ'R`&R$a;1S"#q=St;RITqS3UUnjibVl6SpWiW>)Y->.8Za7$I[^
+WfX]"G\i^V@V%_o0O6a2lBGbK\>Yd*^:jeCE.%f\5'6h;-rGi8N\UjQ5OdkNV6rlg4!*mdKW6na
+Z2@oCV\Jp%J+Rp\ssfq>^<gqu6NlrUg)?s+14)s*t~>
+JcC<$JcEC_mJct\qu$3cr;-Bfr:g;TOSt:DP#G7VqXsj[rq$*Zrpg$XrU0gUmHso>s6B[MrojXN
+kND!ijlHF$.H9=Ei8<DIh;$c=g=b-1f@JI$e'cXkd*L"^bfe2PaiMNB`PocJK7npQKDpJsJbXco
+Ij\3;E+rce?sd>E=+YmKH?OFPE,00#AR]"P>?YNG@q0%YAS,RdB9)qM%p*%CM0Ph2DJsH8G'J@\
+HM2X[GkH=aG^"=Sr,qFLrc8']n9+bQs)S6`F*%>$s)\$W!c`0ur,MRPphp7PDf9UoDu+GNDuFPR
+Dt.`DD?"GPCBA<hD>e;IDZ+GOD#S;OD?4Tjr,)+E!,_LKpi#\?rbq^Pr,;OOrbhjUDf>Mlp2U%M
+rGhXPs)IpVrc.mWr,Vp]F`m\,!I&_dG5umeH2;jeHiJKlIK"0oDJsB/Ch@6iA7K/8B)YX+;>sJj
+;u]hs;#O;l;#aAo;Gg?h;>sDi;%QQgPtk+O:h+d/Mi*=G8Vr<$MYE&+N;AG5Q^IW;!1N_Qs-itU
+pm;&Lr0[GNnsKHDrKdJMs-WeP!.Xuus+(0%rIY0)Kn]M\!f)Sfre^Z4!/pi8#E=b(O,oBaOoCMb
+PE_>tQBml)R$jD4S"-%@StD[LTq\<XUnsueW2ZesXKAV-YctC=Za@0L\%0&\]Y(tn^VRe)`5Ta:
+aN;WKc-FY^dF-Lne^i@)g=k<;h;7)JiSrnYjlY^gl07L!m-O--n*fc9nac8Bo^qhLp@e7TrqQNh
+s8)Wirqu`no_sFAJcFL)J,~>
+JcC<$JcEC_mJct\qu$3cr;-Bfr:p+hr^QbWrq-3]rUTsXs7$!U!q,ICrp9[N!:'RJ#3b75k2tdd
+ro5<aiS`YOhVI#CgY1B7f[na+eC;sqdF$=ecHXSVbK@rJa2Z*;`;N^2<;f_q<;T\q<<#ns;Z0Mo
+<;f`C0K1gC/h8J(/N>UR5X.Fo4?GJ\2Dm6E0/"k/1GgjA1G^jE2)I-`r_3bo7S-6:7o)rY:f:6j
+;Z'Dg;Z9Mr:esk`;>sJn;u]et;c<Nls&&kp;#4&h;?0Sn;#X>d;Ya8k<;okt<;fbo;Y<od;#a;k
+;#O8`;#aDl:]O;i;#4&h;#X>j:]OAd;"d]a:B+,g:Amug;#F/j;#X8j:B+,i:B"&h:B"&f:A.K_
+;"IKX;#X8i;#X8h;#aD_;#O2c;>j>k;?'Pn;>a8j;?'Pm;?'Gr;,U:h:f73g!)`Vks&/nqqbd>j
+s&8\l&5uG&;G^@k;,U+]9hJ&N:.,"Wr_`Ymqc!Mo!^T%9r^$TNr]pKLs$-HI(I:;N5!;+p5X@Y8
+<'`c65=A.?;,U:h3pg)E=9;Q&;u0Jm<<-"s;Zp'"<E)uh<;fhs<;fbh;Z0Ji;?9^Grdb$"!.t0%
+!ec8]re:K0Lku%es,$f7req)ANfK0]OH>V(P&lhOQ'IZ$Q^F/.R[]e:SXuFFTV8'RUSO]^Vl-Jm
+WiE/&Xfen4Z*UdD[^NZU\[oGd^;%G!_Sa=2`lH0BbKJ/Ucd:(fe'uq!f@\g2gYL]Bi8ESRj5f=a
+k3)!nlKdg'mI'H3nF?&>o(2MGp%A%Pp\4[^s7u]kqtpBjrVcBfJcC<$g])d~>
+JcC<$JcEF`mJct\qu$3crVHHfqY19)\[oJg^Vg%QrUp0^rq$'Ys7--YrU9dSs6]gPs6B[Mrol-#
+kND!ijlGL_j5T%Ui8<DIh;$c=g=b-1f@JL%e'cXkd*L"^bfe2PaiMNB`Pod4rLNtYrL<eT"IYXD
+Q^Ic?!go=@rg*SNs-WYL(hfD#M1^/'IXc$DXJi"kSXPk/NJ`IDIX1p;s*bi;J:`H-KnbA<]"5Mc
+?Y<tbF5;%bI"?p)MZ&\5P5gaGP5gXKOH5E]NJrhnN<"q9MuS\7M>`5*K`Hf)L&6PrL%g<%L&Qc)
+L%p?$L&Zi+KDgE$JH15tJcC?%JH:@Rrdb#urdO`o!.OiorHnTnrI"TkrHnTjrd+Hes*FWhs*4Qf
+s*+Nhrd+He!.+Wi!dK!9qKW!brceEgr-AEkI!bd;s*=WjmX#"]H$TC8rd"<cs*F`nr-eHkrdFfq
+qg\Tos*acn!e5ZJrI=itpOW?rs+13%#(qS_L5(J>re^Q1s,6o9s,@/AO,oBarK7)B!/gc'%XEDI
+G&hG=Dej-,G&pJVr_`Ymqc!Jn!EEA&>lS".=T)A&>5_Y-=]ej1r`K2%!Q`C^=p\G_U:7V?['?j1
+r1X7fUnmd^s/,Og!m]-<n^.<^!RApab5fcabPfZ`b5f]Zao'6VaT?p@J,XuuJH1<#K*$^[L&Qi,
+LB*/0M>rG5MuJZ_NK0$[O-#KdP*2#nPa.N"Q^F/.R[]e:SXuFFTV8'RUSO]_Vl-JmWiN5'Y-5(7
+ZEppG[^WcW]">Vg^V@S$_SjF5a2lBFbKS8Wd*^:jeCE.%f\,!5gtgiEi8N\UjQ5OdkNV6rlg4!*
+mdKW6naZ2@oCV\Jp%J+Rp\ssfq>^<gqu6NlrUg)?s+14)s*t~>
+JcC<$JcEF`mJct\qu$3crVHHfqY1&PrfI8FPEl,FrUp0^rq$'Ys7--YrU9dSs6]gPs6B[Mrol0$
+kND!ijlGL_j5T%Ui8<DIh;$c=g=b-1f@JL%e'cXkd*L"^bfe2PaiMNB`Pod4KDpQ#KD^>rJbsuo
+Ii)1*ChI0^?=7/B<e5^IH$=@NDe`oq@UEF?>7+kLA7K+\AS,RdBDmeu=C#3?AuTN]DJsN<GPujg
+HM2XZGkQCbG^"=SrcJ9cF`m.ps)\3^n9"_Qrc8-_F*%"p!c`0urGhgU!,qgTq/?:Ns).mVrbq[Q
+qeuFN!,qFGr,)IMs(_[PD/K8g!,_UNr,)FLrb_[Q!GuZND<u09Dt%ZDDu=MMDuOYODu+GHEW0qU
+EVOMQEVskUEVskUErpH+FoHObGBWt0!-nKgqKi0g!.=]m!If7lD[pZ'DJX#tAn>L_@qK:K;#X>k
+;YsDl;uourr_ibms%rhq;,[9gr_WPjs%j/hPtk+O;.tB9Mi*@HLAHf$Mu8P3MuS_;Q^F0:R/i]O
+S,\oXR$m`:!1EbPrL*5Ds-N\Ms-NbQs-Ee9It.HJs+(0%rIY0)Kn]M\s+^T1re^Z4!/pi8I#X/H
+O,oBbOcklkPa%GuQC!u+R@9V7S=Q7CT:hmOU8+N[VPg>jWN*##Xfek3Z*L^C[C3QS\[oDc]t_=t
+_SX71`lH0Bb0/#ScHstee'uq!f@\d1gYCWAhr*JQj5f=ak3)!nlKdg'mI'H3nF?&>o(2MGp%A%P
+p\4[^s7u]kqtpBjrVcBfJcC<$g])d~>
+JcC<$JcEF`mJct\qu$3crVHHfqY9th"BAAg7Rm@Lrq-3]r:9mXs7$!Us6fpSrp9[N!:'RJ0^.]_
+k2tddjQ#:[iS`YOhVI#CgY1B7f[na+e^W'rdF$=ecHXSVbK@rJa2Z*;`5;IQpf.2j!*&hqs&AYi
+(G@[%0J+b*/M9"?5sRXt4$#A\2Dd-D0`<X+1bpoe1Dr#,2Dm<c9i"JS8kDWM<DH@f;,U7h;c?Rl
+r)*;gr_`\l$;XJq;,U:j;cH^pr_iYmpJCrh;>sDk;>3ua;u]hr<<-"s;uKVc;$0Wj:Jh!es%i\k
+pe^rer_NSjrD<>fs%r\lrD3Jkp/(HYr_EJhrD*>fr_WMi!)WYjs%`Sis%`Sir_EGgrD*&^r_W2^
+q,%&dr_WSir)!Air_NSlp/(`a!)WJgr_WVlr_ibnqb[;ir_i_ms%iep;GpBi:]OAi;ZBYq;Ys>k
+;Z9Vg<<#c+:Jahc:fC4a:/";S8OPsC;#X>k;YsDl;uou`r^$iU5X7P"5sIU45Sl^O5<_4p5<qM"
+<E)7L5<hV2:Jk"f;,d9n!*JtupK.Dsr_rYmr`/kp!`W0"p/D#lr)EVps&Aqqp/:idqbdKEIt.HJ
+s+(0%rIY0)Kn]M\s+^T1re^Z4!/pi8I#X/HO,oBbOcklkPa%GuQC!u+R@9V7S=Q7CT:hmOU8+N[
+VPg>jWN*##Xfek3Z*L^C[C3QS\[oDc]t_=t_SX71`lH0Bb0/#ScHstee'uq!f@\d1gYCWAhr*JQ
+j5f=ak3)!nlKdg'mI'H3nF?&>o(2MGp%A%Pp\4[^s7u]kqtpBjrVcBfJcC<$g])d~>
+JcC<$JcEIamJct\qu$6dr;-Bfq=k9j\@K8c^;7e0>5hV(p&=U_oDJ1Znc/+Wn,MhUmJcJPlN$5L
+kqVDbkN:pgjQ,@]io/hRhqm2FgtUQ:g"=p.f%&:"da?Ihcd'h[bKJ&MaN)<>`Pf[2rLNkUs-itU
+!LT5QR/WKWR$X,)Q^@Z<r0JUBB:4j:Is?EhJ7`JpVPU)YR$NekKS4o(H$4=\J:W6&K7s5X!f+@u
+rjrT0B4u:,G^4[eKnYDFr/pc;!0dDFs,d>DNrG%<N;JV5MuS\7M#`A2LB*)$L&?VsL%g<%L&Qc)
+L%g6%KnP-YK*$UUK)U<$JGXltK)C3!JH(,uIf"TpIf4]mHiSTnI/\KlHi\S>rd+Hes*FZis*4Ne
+s*+Nhrd+Kfrd+Kfqfr*crHJTnH?sj^H@1'dr-A?grd+!Z!d]-;rd+QhqKi-fs*X`mrI4]n!.Oco
+rdOlqrI4`q!.Olrs+'Zks+1E,KnY89L]3/-MZ8S?N/`gWNfT6_OSt=?OqEn2I!pEiG^+CLD/O6,
+DL$A$r_`Ymqc!Jnr`/o%s'#J*r`K5'r*02'!ErY*=T;G3aN7Xi>%<;e\$rfQZ*=,"!McIiV>d:i
+V>d@fVuG!Acgf?accsbZpri]]rQG/`rQ>2`pW<?Sr5ntes*jutrdb$"!.t3&s+LE+re:K0Lku%e
+#E"FtN/WaUNrG(?OHKO*E0HNOQ'Rc(R$jD4S"-%@StD[LTq\<XV5C/gWN)u!Xf\b1Yd(O@['mEP
+\[f>b]tV7s_8=+/`Q-'Ab0/#ScHjnce'uq!f@\d1gYCWAhr*JQj5f=ak3(smlKdg'mI'H3nF?&>
+o(2MGp%A%Pp\4[^s7u]kr;6HjrVcBfJcC<$g])d~>
+JcC<$JcEIamJct\qu$6dr;-Bfq=k6iOH>TePE_?!rDEXgrq-3]r:9mXs7$!Us6fpSrp9[N!:'RJ
+1$If`k2tddjQ#:[iS`YOhVI#CgY1B7f[na+e^W*sdF$=ecHaYWbK@rJa2Z*;`5BIjK`$K!K)1&o
+JGamD<`3pRA6rJJ?=?l8J9uTgF`_S=Bk1a`?X6i<@U`kXA7T7_B4YZPN=0i6?tEtdCi435Fa<k2
+s*FBapiuOY"*f$5G5cXaG5l^RF96N*FRXDQFT-=^FE@(p!-.sVs)J$W!,qgTq/?:Ns).mVrbq[Q
+r,;LN!,qFGr,)IMs(_XOD>e8ND>S5KD>nAOD>nDQD#A/9DYe;?DZ4SQDYnANDYnALE:n5ME;jkP
+E;sqUErC"TErL+[FT-F\G5c^cGlN'cHN/?iIJnU+FDl/:Df'?-An,C`@q04b;#X>k;YsDl<;ons
+;ZBSl;#jMk;>sDj;?'H%Pa,$?:f_CcMi3ILLPG_aoo&a,!/pc6rg3YPqjIJQq3qDRRJ*$JRJiNO
+RIZaFQi36MQiEHQIK+crJ,XuuJH1<$KE$W)L&Qf.LPUccM$JorMi<USNK4"!!K`HCP&QVLQ'IZ%
+R$a;1S"#q=St;RITqS3UUnsrdVl?\rX0&M,YctC=Za@0L\%0&]]Y2%o^qmn*`Pom=ai_fNcHab`
+dF6Uqf%8R-g=tE=hV[8MioB+]k2tjjl0@U$m-X60n*ol;o()DEo_%nNp@n=\q#C0iqY^6hr;HTd
+rdk*#s4dR(~>
+JcC<$JcEIamJct\qu$6dr;-Bfq=k-f<`N1$<;oer7K,aVp&=U_oDJ1Znc/+Wn,MhUmJcJPlN$5L
+kqVDbkN:pgjQ,@]io/hRhqm2FgtUQ:g"=p.f%&:"da?Ihcd'h[bKJ&MaN)<>`Pf[2rDiVlrDN\q
+r)N_q!)rhqr)4[l0/bU?/1N2&/N5RR5<_7m3]K&V1bg^</hJ\21GU`b1D;T&1c%j#:JFM?8kM`P
+:/Feb;H!Eks&/blq,72hr_WSk"]A8t<)cfp;Z0Mo;Y<oe;#aDd;Ya5k<;fhs<;fbp;Y*`c;#X5j
+;#X>l:]O;d;#X>k:]O;i;#4&h;#aDj:]OAd;"d]a:&n)f:B"&h;#=,h:]F2h:B4/h:]F2h:]*u]
+:]F8_:\[cc:]=2i:]4,e;>!ca:\[fd;#aDl;ZBVl;#aDk;Z9Mr:f1+g;>a5j;>O/k;c<Kis&/eo
+oMcB!:Jk"d;Gp@e92A5S8P)<Hr_`Ymqc!Jnr`/qa#=1U>5=%S"5Q*hd5sIRt4[)(q5sSFL5s[_#
+7SQZU;Gp@j=]eg0rE/espK7Gpr_r\nrDibo!`W0"p/M&lrD`_qs&Aqqp/:idrDNZDs*jutrdb$"
+!.t3&s+LE+re:K0Lku%e#E"FtN/WaUNrG(?OHKO*E0HNOQ'Rc(R$jD4S"-%@StD[LTq\<XV5C/g
+WN)u!Xf\b1Yd(O@['mEP\[f>b]tV7s_8=+/`Q-'Ab0/#ScHjnce'uq!f@\d1gYCWAhr*JQj5f=a
+k3(smlKdg'mI'H3nF?&>o(2MGp%A%Pp\4[^s7u]kr;6HjrVcBfJcC<$g])d~>
+JcC<$JcEIamf*(]r;?<dr;-Bfq=ss`#eRa`^r+47cIDeprq$'Yrpg$XrU9dSs6]gPs6B[Mrol?)
+kND!ijlPR`j5T%Ui8<DIh;$c=g=b-1f@JL%eC2gmd*L"_c-+;QaiMNB`Pod5_SMe6S=KSJrgNhS
+s-W\O!1<bPqj@>K2enkKO+i"2I"-]\YH"LtTUV@9NerLDI<g']JUi6&JV8]1L5(D:]"5McTX/6J
+FEi+ZJ:rW6NW,%<On=h:OTCQ)rf-r:qi(T7repf6!f;_hreLN.onE9rp4`6q#).__KS5&5pOiO#
+re1<(!eGrTrdb'"qgea!r.+p"It.BFqgSTprI+Efrd4Wl!.4Zjqg&3frd"NgrceBe!."Qir-8Km
+H$Xa\H$T72rd"Herd+Tird4Qhs*=QhmsG([rd+Qhq0N'fr-\HkrI4cps*jiprI+`prI+m!J:E#s
+rI4ftnUUpsK7nr4L51TaM>W81MuJ_9NrP1?OSt=@P5g^XP*:BDH[L3cG'.S>CMdm+JUdYrs&/\l
+r`&ks!ENJ(>6%e)=TDS%>Q7e+>$:i,s&TZNa]hqPCQ>^0\$iZKYl(3qU].%kUSOZ\rh]Ukq5=2:
+s3LDc!71Vj"4,6:bk]H[bl>lbbl,]bb4s*TaSs9]I/\QoIfFosJH(0#K)L<'KS>-ZL'!-dM#N5F
+MMmCON/`jXO,oBbOcklkPa.N"Qi<@`R@B\9SXuFFTV8'SUnjiaVl6SpX/rG+YHY:;Za@-K\%&u[
+]Y(tn^qmn*`5Ta;aND]Mc-FY_dF6Upf%8R-g=tE=hV[8MioB+]k2tjjl0@U$m-X60n*ol;o()DE
+o_%nNp@nO\s7u]kr;6HjrVcBfJcC<$g])d~>
+JcC<$JcEIamf*(]r;?<dr;-Bfq=ss`s,dMKPE_B"R@X:Srq$'Yrpg$XrU9dSs6]gPs6B[Mrol9'
+kND!ijlPR`j5T%Ui8<DIh;$c=g=b-1f@JL%eC2gmd*L"_c-+;QaiMNB`Pod5_SLnYr.Fs"s+10$
+qLSHmrI5niFDu#)?=.&I@T\84I!U!ZF)c#/@q&eN>?YKG@Us$KAHQOWAS(h"$Zq53@qKIkCiFH<
+Gkl^dHM2XYGkcOcG^"?0FoHRaFmsJRF*-kn!d&L(rc@^Ps)J$Ws)J$W!,qgTq/?:Nqeu@Nr,:q>
+r+uFMrbDOND>e8ND>S5LD>nAND?"MMD<l*9Dt%ZDDu=MMDuX_ODu+GHEW0qUEVOJQEVjeSEVskW
+Er^=\FoQUdF`qs-GQ2pfH2;gfH[Pd?qL/rpE,TZ6DJX#tAn>L_A8lJd;?'Pj;uTbq<<Q?#;,C*f
+;#jMk;>sDj;?'H%Pa,$?:g7srMi3ILLPGecoSWd0Mi7Ci!1<bPs-W\Os-iqV!1NkU!LfGNR/EBP
+R/NHER/WHNQN*9PR!em]s*jutrdb$"!.t0%!ec8]re:K0Lku%e'T.g,N/WaVNfT6_OcbfiPE_>t
+QC%T<AXT$WS=Q7CT:hmOUSO]^VPgAlWiN5'Y-5(7ZEppG[^WcW]"G\i^VI\&_o0O6aN2NIbg"GZ
+dF$FmeCN7(g"P39h;7&IiSrnYjlY^gkiqBum-O--n*fc9nac8Bo^qhLp@e7Zq#C0iqY^6hr;HTd
+rdk*#s4dR(~>
+JcC<$JcEIamf*(]r;?<dr;-Bfq=ss`s&K,!rDW_o!(?fUrq$'Yrpg$XrU9dSs6]gPs6B[Mrol9'
+kND!ijlPR`j5T%Ui8<DIh;$c=g=b-1f@JL%eC2gmd*L"_c-+;QaiMNB`Pod5_SK5Ppf.,h!*&qt
+pJh)i(,7a)1+k(-/M/S66U<q!4Zb_a2Dd6Fr[n@-1GgjD1]B3D2)[<J9hnDV018N.:/Fba:Jt0j
+;Z9Vp;Z'Df;Z0Jm;#O8k;u]f";c6Ij;Z9Vo;YEuf:]OAd;YX/j<;]_r<;fbp;Y*cc;#a;k;#O5l
+:f$j_r_`Yk!)NPiqGI8hs&&8^pJ:`_!)NMfr_NPjr)!Gjr_NPhs%iYir_NPhr_NJfp.tZao2#-X
+s%iVjr_NPjpJLW\r_EMjq,.,fs&&bns&&Yi!)`YlqGI/e!)`MhqbdAkr)<Gk!)r_n%oQ8&;,U1g
+;G9bY9M8#N9)_]f;Yj>k<;ol)<^K)<5X.J!5sR[55QX595Q3hY5<qM"<E)7M5=%h9:f1+g;,d3k
+qH<Ppr`&kqqc*Pp!`W)rr_ikt<E8cmr)NbrrDiksrDWDfrDEPl!.=cos*jutrdb$"!.t0%!ec8]
+re:K0Lku%e'T.g,N/WaVNfT6_OcbfiPE_>tQC%T<AXT$WS=Q7CT:hmOUSO]^VPgAlWiN5'Y-5(7
+ZEppG[^WcW]"G\i^VI\&_o0O6aN2NIbg"GZdF$FmeCN7(g"P39h;7&IiSrnYjlY^gkiqBum-O--
+n*fc9nac8Bo^qhLp@e7Zq#C0iqY^6hr;HTdrdk*#s4dR(~>
+JcC<$JcELbmJd"]qu$6drVHKgq=sp_s7Qo7^V[t2bgG,&>$+j.oDJ1Znc/+Vn,MeUmJZAQlg!d7
+kqhPdkN:pgjlGI^io/hRhr!;Hh;$c=g"=p.f%&:"e'cXjcd'h\bfe/NaN2B?`Pf[2_8,u=s-s%W
+pmM)J!13MKs-FjUB:G-DJUDorIqNGtWMZJaR@'4uM2$V2GBe:\It3-(re1H0KSI):]*l$2Rr`e!
+I=[$(M2qFos,lr:s,dMIO,f6[N/[Xn!0$o8"H&%mLku"b!/C0#qh4ZspP&m+KS+o1Kn]8S!/:E*
+s+:T.JqAQ)J:N3$rIFs#r.+p"It.BFqgSTprI+Wl!.Ffnrd4TkrHe?drd+Qh!-nKercnEgqg&3f
+s*4ZjH$T72rd"Kf#C1WAH$O^_Hi&*hH2W'XHNJM=H2`-hH2`-iH2i3iHi&3hI/n`pI/n`lJ,+Nq
+It3#tr."3e!J5t'Ka*9eLl$tGM>iD2MuSe:NrP1>OSt=AP5g^KP*;)oMZ/&'H4"h7DJsE.DMj!B
+;>sJj;uTbp<W6%u>6%e)=TDS%>6A#1>$:i,#Zk-LaBMhOF-cg7"Lb\BY[d[,rM'FgUSId`s.o^m
+q5=/9s3LDcs3L\k"4#08bk]HZbQ,ibbl,]bb4s*UaT'B^HiJKmIK+crJ,XuuJH1<$KE$W)L&Qf3
+LPUbCM2I1Krepl;NrG(COHG]hPEc'3BU5!PR$jG5S=Q7CT:hmPUSO]^Vl-JnWiN5'Y->.8Za7$I
+[^`lZ]=bhl^VRe)`5Ta;aND]Lc-FY^dF-Oof%8R-g=tE=hV[8MioB(\k2tjjl0@U$m-X60n*ol;
+o()DEo_%nNp@nO\s7u]kr;6HjrVcBfJcC<$g])d~>
+JcC<$JcELbmJd"]qu$6drVHKgq=sp_s7QnaPEV5sR%'eK;Gg:hoDJ1Znc/+Vn,MeUmJZAQlg!d7
+kr.bgkN:pgjlGI^io/hRhr!;Hh;$c=g"=p.f%&:"e'cXjcd'h\bfe/NaN2B?`Pf[2_8(\UK)L?%
+K)L9#K):,nJH(*A>uPi_BOP4S?sm#9Jpr)mG]\"FBkCmb?X6l?@q&qZAH$-AB4YZPN=1A[FD#<&
+D/XH;G^B.3s*FBap3?CY!dJp4rH8-`rcS!X!-S'Ymr\eUF)l;BF7XDPEW0qWEW:"XDuFYNDuX_P
+Du4MODuFPRDt7fCD$=`kCM[j)rG;@Kr,)FLrb_[Q!,VRMlYcN:n8A5DrGMLNrbhRN!cW'rrG_LN
+rG_aUpMg"Mqf2OS$ZgE4F`_bKG'.qNG5c^cGlN'dH3/G@I/\QhIK4TkE"-`'Des#sB4YU`F)OoQ
+r_iVlr`&hrr`9%qrD<PmqGI5gr_`\ls-3OZ$;b,SN/NUOM2-gap5Ap-repT2s-WePs-W\Os-iqV
+s-iqV!LfGNR/<9OR/NHER/`NOQN*<OHiJKmIK+crJ,XuuJH1<$KE$W)L&Qf3LPUbCM2I1Krepl;
+NrG(COHG]hPEc'3BU5!PR$jG5S=Q7CT:hmPUSO]^Vl-JnWiN5'Y->.8Za7$I[^`lZ]=bhl^VRe)
+`5Ta;aND]Lc-FY^dF-Oof%8R-g=tE=hV[8MioB(\k2tjjl0@U$m-X60n*ol;o()DEo_%nNp@nO\
+s7u]kr;6HjrVcBfJcC<$g])d~>
+JcC<$JcELbmJd"]qu$6drVHKgq=sp_s7QIn<;ohr;?g-*77K^8oDJ1Znc/+Vn,MeUmJZAQlg!d7
+kqhPdkN:pgjlGI^io/hRhr!;Hh;$c=g"=p.f%&:"e'cXjcd'h\bfe/NaN2B?`Pf[2_8,hFq,78m
+r`/bnrDOac/iPUA0.JM(/N>UR5s@Fo4$,AY1bga>0J5"81,Ahc%Poq"2)@s$:JFMA4u?#1r_N\p
+<)HNk;Z9Vp;Z'Df;YO#o;H$Oo;c6Ii;Z9Vn;YErg:f7!c!Dubi;ZKep<W5tt;uT\c;$0Wj:Jh!e
+s%iDdr_`Yk!)NPiqGI8hs&&_k!)`GdrD*DgqbR2ds%iSgr_NMir)!Gjr_NPhs%iYis%iVhr_NJf
+p.tZaoM>6Yr_NMir_EMjpJLW\r_EMjq,.)e!)`\m!)`Shqbm;gr(mAjpeprcs&/eoqGdJnqG[c"
+;,C+e:f1.g:Ad`e8k`)Zr_iVlr`&hrr`07i5X.J!5sR[55QX5:5Q3hZ5<qM"<E2=N5=8"=:f1+g
+;,]XR=T2Ip=T;D$<;ohn<;ol'<)Z[m;c?Xq<VKJi<<-"s<W?%s;tj2g;?'PoHiJKmIK+crJ,Xuu
+JH1<$KE$W)L&Qf3LPUbCM2I1Krepl;NrG(COHG]hPEc'3BU5!PR$jG5S=Q7CT:hmPUSO]^Vl-Jn
+WiN5'Y->.8Za7$I[^`lZ]=bhl^VRe)`5Ta;aND]Lc-FY^dF-Oof%8R-g=tE=hV[8MioB(\k2tjj
+l0@U$m-X60n*ol;o()DEo_%nNp@nO\s7u]kr;6HjrVcBfJcC<$g])d~>
+JcC<$JcEOcmJd"]r;?<drVHKgq=ss`rUpf9_8O@8cdpt7l!%:l=BP.brpg$XrU9dSs6]dO!pf.:
+rojgSkND!ijlPR`j5T%si$I:;h;-l@g=k64f@JL%eC2jnd*L"_c-4ARaiMQC`Pod5_SO%&r1*eV
+qjHl>+`(h[OGA@2IXZ$EAuqr-Un!m>P`(6NJ:)QbG(5$nK7ejVL'!-l])K;LMj_;7T6Yd5JqSu@
+plPN<oTK6:"H\\)NfF$sr/C]8regf7M>i>0L]<,&L&-JsL%pE&Ka!-^K7no3pOiO#re1<(!J,k%
+JcC6$JUm]M!.t-"!e>cMrI4Wns*joprHnTnrI"TkrI"Qiqg&3frHSBfrceBe!."Qir-A9fs*4Zj
+H$T:3rd"He#C1WAH$O^_Hi&*hH2W'XHiA<jHN&3gH2r6iHN/?lHiSNlI/SKnIfFfrIe\EhIKY.N
+J:E%GJ+/!iK7s5X!JZC-M>rJ3MZo'!NK0$[rK-u?!0[8Ds-3PK%tT.VH[C']F`)&6Chdg+K)S[E
+;uTbq<W#nt>Q%\)=SuA*=]ej1r`B_5=NJQf>$?6C\$rfS['HoMqP*q`rhKRkVZ!FmV?!OjcMu5a
+d/MAkcj%e?bfn8Rb5BHWbl#Wab4s*Ua9Kb4H@(!dI/\QoIfFosJH(0#K)UE&K`?c+LB!#/M#N6L
+MMmCON/`jXO,oBbP*2#mPa.N"Q^F//S"#q=St;RJTq\<XV5C/gWN)u"Xfek3Z*L^C[C3QT\\#Mf
+^;%J#_SjF5a2lBGbK\>Yd*^:keCN7'g"P39h;7&IiSrnXjlY^gkiqBum-O--n*fc9rpg*]o`"O`
+p&Ojcq#C0iqY^6hr;QZdrdk*#s4dR(~>
+JcC<$JcEOcmJd"]r;?<drVHKgq=ss`rUpecPEV8tR\-IXY>\=r;H!)Vrpg$XrU9dSs6]dO!pf.:
+rojgSkND!ijlPR`j5T%si$I:;h;-l@g=k64f@JL%eC2jnd*L"_c-4ARaiMQC`Pod5_SO%&rdt*$
+qgnd!qgnHk(fjUVD.R*Z?sm);<e5^HH?OCNDJE`o@:0"<"CknNAS(jQ!bZ+brJ_2%G)C?jC2S!1
+FEW!*Hi89aH1cFYGli57G5ZR`G5cXZF9$IYFRXGQF9$CNEWC+YDuanWE;skTE;FMPDZ"GME;OSP
+D?+VGDZ"AOD#\8PCi+%gC]J>LDZ"AND#S;ODZ"A:DYe;?DZ=YQDZ"GPDYe;OE;skUE;OVTE;aeT
+E;sqOE;FVQEVsh[FEM_JFSp:]G5ldcGlN'eHN/<lI/\QeILgO=E,KT3DJNcpAn5@\A8qNGqG[Am
+r`/ks"]/&n;Gg?g;>sDk;?'JmPlFMd:h>$5Mi3ILLPAq+Mu8J4MuAV7MZA_6R/`NQR/<<ORf8fU
+RfAiXR[No;pR1T>s-N\M#+'X^H[C-frdFfqs*t#us+(0%re(6(s+UK-s+^T1reYQNMi3OQNK0$[
+O-#KeP*;)oQ'IZ%R$a>3S"-%@StD^MU8+N\VPg>kWiE/&Y-5(7ZEppG[^WfX]=bhk^VI_'`5Ta:
+aN;WKc-FY^dF-Oof%8O,g=tE=hV[8MioB(\k2tjjl0@U$m-X60n*olHncA@Srq6<b!;HHes7u]k
+r;6Hjrr)HfJcC<$g])d~>
+JcC<$JcEOcmJd"]r;?<drVHKgq=ss`rUp4jr_rhp"]JQ1@73Q`7fW&Ync/+Wn,MhUmJZAQlg!d7
+kmQ_<kN:pgjlGI^io0mp-/[S8h;$c=g=b-1f%&:"e'cXjcd'h\bfe/NaN2B?`Pf[2_8*h^<;0;k
+<;onq<;fbq;BIVI2D[!<.P!)13&X&e5!:tg3B&iQ1,1F8/h]%:1Gf"e%lH7&786QQ9K#+"77^3N
+;#X>p;,U:jrDNYos&/blq,6ra$;sf%<)Z[l;,U:jr)3/a!E)km;?B]n;Z0Mo<;oer<;T\q<<#ns
+;Z'Dl;#!li:esk`rDESjq,%&frD3Jir_WDf!)WYlrD3Jkp/(]`!)EDer_EJhrD*>fs%rSir_NMg
+s%`Vir_NPhr_NGepJ:cboM>3Xr_NPjr_NPjpJLW\r_EMjr_WYlrDEMi!)`_ns&&VhqGR5gr)!>i
+!)`\mq,./irDWSmr_r\n!)rkr%o?,#:Jt(i:eaYX91hcK8cDWa;uTbq<W#l%5X.M"5sR[55S-4H
+5<_7q5<qM"<E2=N5=A*B;#aDp;,][M=T;P#=Su1t;u9Pn<<6&tr_`hs<)lrm<;0Dl<;fbi;Z0Gs
+;L3Y9H[L5?IK+crJ,XuuJH1<$KE$W)L&Zo-LB*/0M/S90Mi<USNfK0]OHG]hPEV5rQ'Rc(R$sM6
+S=Q7CT:qsQUSO``Vl-MoWiW>*YHY:;Za@-K\%0&]]Y2%o^r!t,`Q#s>aihlPcHjkbdaZdtf@S^0
+gYCWAhr*JQj5]7`k3(smlKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^<hqu-HlrU^#>s+14)s*t~>
+JcC<$JcERdmJd"]r;?<drVHKgqY:$`rq??a&B)Q.c-tG,kNhO&>$+j.naZVJrU9dSs6]gPs6K^M
+rojgSkND!ijlPR`j5T%si$[F=h;-l@g=k64f@JL%eC2jndEg+`c-4ARaiMQD`Pod5_SO%&^Rb@o
+!h5XIrgE,?-#&j8O,&7/DJNotBWJ,2UR[g>OGegFJ9uQeJ:N6&Kn=u3L4k<[]*k=(WM#`*G^P0u
+M2V(hrK6f:s,dGGO,f6[rf$c7!0$o8!/g`2rJ1B,p4`BspP&Bs!el;\rdt6)L%g6#L&Qc*K)pOT
+rdk*"!J,e"JH1<"JHC@OJ,OinIfOrrIJeHmIJnQmHi8?jHM`!fHN&3iGlDpeGQ<$gHMi'fH38G;
+H$T72rd"Kf!dT*<rd"Njqg&6frHdpZ!d]-;rd+Qhrd+TirH\QmI!^5=I/89kIeeKhIfFrpJ,b&h
+JH:CVre1W4LP^kDM2@+Irepf8s,I&=!0@)?rK6u@s-3MJ&!)0dIX6BdG&_;9C2.O%FoG;9;uTbp
+<Vfbp=TDS%>6A#1>$:i,&6DuTaBMkVJY]ca[^NQJY]0K6rM0@f!i;cjqkj27!71>br6PDf!6kGc
+!6Y5_q98]Y!6Y)YqoJ_^s*OcnrdFfqs*t#us+(0%re(6(!/:E,s+^T1reUZ5MuJZKNK0'\OHGZg
+P*;,qQ'Rc(R$sM6S=Q7CTV8'RUnjiaVl6SpX/rG+YctC=ZaI6N\@K2`]Y;.r_8=+/`Q-'AbKJ/U
+cd:(feC<%#f@em4gtgiEi8N\UjQ5OdkNM0qlg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Zjrqu`n
+oDX=@JcFL)J,~>
+JcC<$JcERdmJd"]r;?<drVHKgqY:$`rq??as-+"YR@U+PY-G:;;Gp@inaZVJrU9dSs6]gPs6K^M
+rojgSkND!ijlPR`j5T%si$R@<h;-l@g=k64f@JL%eC2jndEg+`c-4ARaiMQD`Pod5_SO%&^]&fb
+KDpK"JH1<#Jb4I2<HE.qA7/SE=]\X)J:2cjG'%\>BP(d`?X$e6@g?RTAS#LcAWHbL$[6cCGC4.?
+E,fuBH1lUbHLuLUGku[eG^"?/FT?UaFng(YFnp.KFTQZ+F74,LEW0nWEW0qWDuFYODuOYPDu4MO
+Du=JQDt7fDD?"GPCB86grG2INqel@LrbVRNs).^Nl>HH:n8A5DrGMLNrbhRN!-%mTs)@mUs)@sW
+r,D[UpMg.Pr,VgW!-%pWr,Mp^F`heJr,r$_s*+Hes*=Ng!IK4nIIqt"I=#pPDJsK3ChI<jA7T1\
+B)Y^*;uTbp<Vf_s;,[0dr_O8*;Gg7ePa"s><,-rBMi3IML5&t/Mu8J4MZAY3Mu/nAQN3ELRK&`T
+S,8WSRJ3*ERIHUDQi36KHN/?lI/\QoIfFosJH(0#K)UE&KE-`*LB!#/M#N53MMqImBT8%5O-#Kd
+P*2#nQ'IZ%R$a>3S"-%@StMdNU84T]VPgAlWiN5'Y->.8Za7'J\%&u[]Y(tn^qmn*`Pom=aihlP
+cHjkbdaZdsf@S^0gYCWAhr*JQj5f=ak3(smlKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^<hqu6Nl
+rU^#>s+14)s*t~>
+JcC<$JcERdmJd"]r;?<drVHKgqY:$`rq??a$<:#&;H$\'@:E\Sr^?lXnaZVJrU9dSs6]gPs6K^M
+rojgSkND!ijlPR`j5T%si$R@<h;-l@g=k64f@JL%eC2jndEg+`c-4ARaiMQD`Pod5_SO%&^\q.)
+;tj8k;uTZL0K1gD/hJJ33&ifR5sIRt4$#>[2)R*B0/"q71,:[B1GgpH2)@s&:J<K!4uPr+:Jq*h
+!)`\mr_rhps&8qqr)*8fpJD/n;cH^p;Gg<i;?0Sn;Y3ff;H$Nk;ZBSo;Z9Vp<;oer<;T\q<<#ns
+;Z'Dl;#X;l;#F/m:esk`rDESjq,%&frD3Jir_WDf!`2`kr(mAjp/(HYr_<Ghr(d5es%rVj!)WYj
+s%`Sis%`Phs%`PhrD*&^r_W5_pe^rcr_WSi!)WDep/(`a!)WYls%r\l!DlSk;#XAm;>O,h;>a>i
+;>X2g;?0Sm;?0Pi;?'Pm;uK\q;Z]iq;u0Gr<E)su;uKN"<)QRg:/+AS8kVSO;YsDl<;fhn<WkZR
+5sR[35Rp"B5!M:t5s\LN5s[b)9)_Wi;H$Fk5P/(W=o2=u<W5qn<;oku<)`co!)rkspJgrgrD`\n
+pJUrerHeKjs*Xfos*jutrdb$"!.t3&s+CB+reCH.!/UW2!K)g7N+e32O,oBbOcklkPa.N"Q^F//
+S"#q=St;UKTq\?YV5C/hWN*##Xfen4Z*UdE[^WcW]"G\i^VI\&_o9U8aN;WKc-FY^dF-Ooe^rF+
+g=tE=hV[8MioB+]k2tjjl0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kr;6KkrVc?eJcC<$g])d~>
+JcC<$JcERdmf*+^qu$6drVHKgqY:'arV$3_s2>/`d+I4;l2BuQ='A[,=Rc7Ws6fpSrp9[Ns6BUJ
+3p>bik2tdejQ#:[iSi_Qhqm2FgtUQ:g"=p.f$r3uda?IhcHa\YbKJ#KaN)<>`5BI.^q[XuSXc1=
+rgNhSp6bZB-@0BrOc!deDJO$&BWeA5VP0HFQ&^fVKn"GnG_(EuJqSf4L4tGKrOWE<NlI'FH$k-s
+L5kherK6f:s,dGGO,f6[rf$c7!0$o8!/g`2rJ1?+p4`BspkAKt!JQ4*KCsltL&Q`-K7\Z+rdk*"
+!J,e"JH1<"JHC@OJ,OinIfOrrIJ8-hHi8?jHMVpeHN&0iGl;jdGQ<$gHMi'gHN/6lG^4T2GlE!f
+GR&M?H?jd^H[GL5mX+qYrd+TirH\HhrHeEhrI"Nk"+5NFIeeKhIKG"LJGXiqJF\6mJqSgVKa<Hi
+M2@%FM2I2iMuSb9NW5%;OSk7<PQ-mGPnB=7I!g9fH?FFKDf0<*D/XGmqc!Gmr`/bp!*B/&!*K/'
+"'J`/=o;D%aT#HOB8EUt\$i`PZESNMUA^kbU^*`nVPU,dVTnq^!71>br6GGhbfp(0s2t;`q98`Z
+!6Y&XrQ#%bH$T@7s*F`nrI+]p!.Xrt!eGrTrdt9*Kn]M\!JcL1M/8'-Mi<USNfT6_OHG]hPE_>t
+QC+&-R[]e:SXuIHTq\<XUo(&fWN)u"Xfek3Z*L^C[^N]V]">Vg^V@V%_o9U8aN;TJbg+M\dF-Ln
+e^rF+g=tE=hV[8MioB+]k2tjkl0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kr;6KkrVcBfJcC<$
+gAc[~>
+JcC<$JcERdmf*+^qu$6drVHKgqY:'arV$3_&X/HGS"Z^\Yd1R>Y>/"n;,Zo]n,MhUmJcJPli68L
+kr.bgkN:pgjlGI^io/kSi8<DIh;$c=g=b-1f@JI$e'cXkd*Bq]bfe2OaN2EA`Pf[2_8*h#^A<HT
+JbFTs>ZGi^BDl$6=W:IpJ:)`gFE2>:BkCmb?<^ZF@qB1^AS5XfB6O65$@ZuVFae(BE-$/IoR$R`
+om-4TqKW-eGBW_'q/lUYqK24L!H`DNEWC+YDuanWE;skTE;FMPDZ"GME;XYADYn8ND#S2NCi0,e
+!,_UNrGDOMrb_[Qr,(_:qJYh?rbqdRqeuLPq/?:PrGM[Tqf2US!-.pUs)IdPrc.mW!-/!Ws)IsW
+!crL,rcJ'\s*"Eds*4NgrHeKjrdFEfrI#6!E,]`6DJa-#An>O_@Us%Jqc!Gmr`/bp!EW1o;>sB*
+;,U7f:m@2?:K_RiN/NUOMMHpoqMY0,qhkH@qNq;MR/33NRf/`QRK/cLR/36?R/`NQQ3);VH2W'h
+HN8HlIK+`rJ,Om!JV&LQK*$^[L&Qf-LPYqdCl4./N/WaVO,oBaOcklkPa.N"R$a;1S"#q=StD[L
+U8+N[VPg>kWiE/&Y-5(7ZEppH[^`lZ]=bhl^VRe)`Pom=ai_fNcHaeadaQ^rf@S^0gYCWAhr*JQ
+j5f=ak3)!nlKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^<hqu6NlrUg)?s+14(s*t~>
+JcC<$JcERdmf*+^qu$6drVHKgqY:'arV$3_&Q;S);H@"0@U`bR>sCbI77QeEn,MhUmJcJPli68L
+kr@nikN:pgjlGI^io/kSi8<DIh;$c=g=b-1f@JI$e'cXkd*Bq]bfe2OaN2EA`Pf[2_8*h#^/S))
+;u]hs<V]Vo;[?8K0/bXA4$#G%3#";;5sILq4$#;Z2)@!B0.nk61Gpuf2#fHB2+1/79M@E/5t=[H
+;>3ub;uT\n;>=&a;$Bir<)cdor_WYnrDESmr)!GlqG@5jr_r_ms&&eos&8nr!`N&tqc3Yq!)rkp
+r)*Jjr_WYlr)!Pm:JXgc;?'Gf;#X>j:]O;j;#4&h;#aD_;#O/i:A[ic:&n)f:B"&h;#F/j;#X8j
+:B+,i:B+,h:B"&f:A.Ha:f6j\pJCibr_WVjs%rJfohbW`rDEPj##S2m:Jakbr_ibnqb[8hrDNPj
+qbR8ir_ibnr_`bo;#=,h;Z0Pn<<#ns;ZB\m<;TZ-<)?Fh:f1(g:eaPV91qiI6W3e[rD`brq,RW"
+5s[b#q`t*Es$6TMs&K%a!Coi_:]sZp;,]aQ=T2J#=9)=t<<?,u;u0Jm<<6&tr_`_pr`/\lq,R;k
+r_rPhs%riBH$T@7s*F`nrI+]p!.Xrt!eGrTrdt9*Kn]M\!JcL1M/8'-Mi<USNfT6_OHG]hPE_>t
+QC+&-R[]e:SXuIHTq\<XUo(&fWN)u"Xfek3Z*L^C[^N]V]">Vg^V@V%_o9U8aN;TJbg+M\dF-Ln
+e^rF+g=tE=hV[8MioB+]k2tjkl0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kr;6KkrVcBfJcC<$
+gAc[~>
+JcC<$JcEUemf*+^qu$6drVHNhqY:$`rq?6^#P?$\e_K3Km/HAVm-*P6=]\`)n,MhUmJZDOlN$5K
+kre1mkN:pgjlGI^io/kSi8<DIh;$c=g=b-1f@JL%e'cXkd*L"^bfe2PaN2EA`Pf[2_SEq$^:g&,
+S"#lFRJ<0DQR-TfD/*cuC2[m'B4nBGVPTuQQ^3\iLOsu#H$"OgJqJ]/KnkA;rOWH$PeDjIG^Fpn
+KoM/bOSt=8P5gXIOH5B]NW"h7N<"q:MZAY5M#E,-LA$>uK_U8rL&m!]rIacr!/:E*"+u2VK)U?$
+J,t4OpjiKsIt.BFqgSTprI+Efs*O]lrHe?drd+Qh!-nKercnEgr-A9f"F56:H$T:3rd"Hes*FZi
+rd4Qh!."Nhrd+Wmo6UObH$TC8rd"Khs*=Tir-SBir-\WoI=D$B!J#[rIKG"LJGOcpJFe=(JqJ`0
+KnY8;Ll$qDM2@+IMi7Rns,@&>O8Y1=OT:RDP6@&4PE_=1PnKCLPC@n,H?sj\EGTT2Ci"!3;YsDl
+<;fhn<rQ2#=TDS%>6A#1=]tZ)s2b4E$>ts3\$rfS['HobrM'7cqkX.d!m8a3q9Audp<```"4#08
+bl5fcb5KNZbkoQ`b4j$Wa96^3G^4T5HN/<lI/SKnIK4lrJ-(:RK)UB6KS>,7L51P?M2@+IMi<US
+NrG)JOHG]hPE_>tQ^F/.R[]e;St;RJTq\<XV5C/hWN*#$Xfnt5ZEppG[^WfY]=bhl^VRe)`5Td<
+ai_fNcHaeadaQ^rf@S^0gYCWAhr*JQj5f=ak3)!nlKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^<h
+qu6NlrUg)?s+14(s*t~>
+JcC<$JcEUemf*+^qu$6drVHNhqY:$`rq?6^&bM?UT;/BhZ*LX=Xf83q;Gg?kn,MhUmJZDOlN$5K
+kr7hhkN:pgjlGI^io/kSi8<DIh;$c=g=b-1f@JL%e'cXkd*L"^bfe2PaN2EA`Pf[2_SEq$^:jGr
+oRZae*aW)W>[(?7>?P*1=+YmKH?aINEGK3!@piVJ>@V2Srac^SBP(k:NK&s:F,=jdC2@g/Fa3J(
+rd+6_om$=Y!dJp4pN?:RrcS'Zn9"bRF7+&KEW0nWEW0qWDuFYODuOYPDu4MODs_H>D#eDOC]A8M
+D#8,JD>nAND?"MPD<Ys7Dt%ZDDuFSNDuX_ODuXeSDZFbSEW0qWEVsbUEV=ANEW'nXEW0nWEVshY
+F*)R'FSp:]G5ladGl;pdH38MAI=:a:r-]0+I;s1CDf9N0B4Y^eA7K.^;YsDl<;fhn<rQ1q;>sB+
+;,U7f:m@2>:L&"!NJi^PMMHpsHiAp(N/RLhr/:Q@pmCoG!1NnVr0dYSRdujERIHUDQN`\!G^+LZ
+rHeKj!.=`ns*artrI=s#JqEuS&;5akL5(J=Ll$tGMMmFPNK4"!@??V7P*;,qQ'[l*R@9V7SXuFF
+TqS3UUnsrdW2ZetXf\e2Yd1UB[C3QT]">Vg^V@V%_o0O7aN;TJbg+M\dF-Lne^rF+g=tE=hV[8M
+ioB+]k2tjkl0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kr;6KkrVcBfJcC<$gAc[~>
+JcC<$JcEUemf*+^qu$6drVHNhqY:$`rq?6^"nYYi<*EW-@K^+G>Zt8/70#gVn,MhUmJZDOlN$5K
+krItjkN:pgjlGI^io/kSi8<DIh;$c=g=b-1f@JL%e'cXkd*L"^bfe2PaN2EA`Pf[2_SEq$^:dKF
+p/:rjrDiYms&1"%4$5Vd3BB2[3&ic]5X.Co3]]2Y1bpg?0.nh51,C`c1_MZ(1ege@9K,.#77g9P
+;GpFj;u0Dg;uT\n;>3ua;$Bir<)cdope_#hr)!GlqG@5jr_r_mr_Wnu;cH^r<)Zck<<-"t;Z'Dl
+;#X>l;#O5n:esk`rDESjq,%&fq,$obs%r_mnPK0[!)EDer_EJhrD*>fr_WMir_NMgs%`Vir_NPh
+r_NJfp.tZaohY<Yr_NMir_EMjpe_)h:J^^]s%`Vkr_`Yks%s(u:/=\_;,L4g;>O,g;>jDk;>X/i
+;>sJm;?'Mq;,C*e;>jDk;u]hs;u]bq;u9Pj<=2]*<DZIf:fC:i:B!oi91hiF;YsDl<;fhn<rQ2#
+5la.H5lEqI5lX.M<W>>m6V1!J;,L4i;,]bQr`B/'qcNi#r)iqtqc*f!;c?Xp<W,nr<<-"s;?Bcr
+<VBDf<Vobn;u';p;0R80H$T@7s*F`nrI+]p!.Xrt!eGrTrdtc8KnY89LPL\BM2I1KN/WaVrf:KL
+OcklkPa.N#R$a;1S"#t?StD^MU8+N\VPgAlWiN8(YHY7:Za@-K\%0)^]Y2(p_8=+.`Q-'Ab0/#S
+cHstee'uq"f@em4gtgiEi8N\UjQ5OdkNV6rlg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Zjrqu`n
+o_sFAJcFI(J,~>
+JcC<$JcEUemf*+^r;??erVHNhqY:$`rq?6^s7?K:dFmI?li-8\m-3Wlj&]Dd='4nYmHsl=s6B[M
+rosIH!9a@Ds5c6$j5].XiS`YOhVI#CgY1B7f[na+e^W*sdF$=ecHXSVbK@oIa2Z*:_ns:+^V@Lr
+]UYL]R[TY4pmCcA-#[[<BkhC"D/3isBrS)/U7Id@P)G0OJp_ihGCbBtK7nr3LP9LB]*jC^Tq%Ws
+H[LI&M2h"drK6i;s,d>DO8b.;N;\_9N;e_8MZ/G0L\uo%L&$DtL%pB(KnP-YKCsltL&Q`-K7\Z+
+rdk*""+buRJGOfuJ:E(HIf"TpIf4]hI/eQlI/SBgH2`-hH2VpgG^"H4HMi'fH38G;H$T72rd"Kf
+!I9"jGli;=Hi/0iH2W'WHiA?kGlW0iH2`-hH2i3hHi8<mI=2$B"+5NFIenNoJGFZoJGOcoJFnBt
+JqJ]/KS>/9r.tB0s,-i7rf$l:s,[,?rfI2Drf[JJPEV5qrKS(_Q^F/.MLBo"H?saYD/F3.C2Im1
+r)<Pnr`/bprE'#$r*'2)=T2J%=:`Kp>[)B=[^W`S[^<?EKVJ@=qP=(d"3Sg2c2#Wbch>``cN)8i
+bl>lcb5KNZbkoQ`b4j$XaSpD`GlN'fHN/<lI/SKnIK4lsJH(3#K)^K'KE-`*L&m'creY?HMi<US
+NK0'\OHG]hPE_>uQ^F/.R[]h<St;UKTqeEZVPg>kWiN5'Y->.8Za7'J\%0&]]Y2%o_8=+.`Q$!?
+b0/#ScHstee'uq"f@em4gtgiEi8N\UjQ5OdkNV6rlg4!*mdKW6nc&([oCW%T!quB_rV6Egs8)Zj
+rqu`no_sFAJcFI(J,~>
+JcC<$JcEUemf*+^r;??erVHNhqY:$`rq?6^s7@(nS=uj_Yd1O=XfA:rVbU,e;,ZiMmHsl=s6B[M
+rosIH!9a@Ds5burj5].XiS`YOhVI#CgY1B7f[na+e^W*sdF$=ecHXSVbK@oIa2Z*:_ns:+^V@Lr
+]_mBTJc:3"J,=cr?N4:/>5q_T<`ad#H?j^VEc,W)A7JtQ>[1cK@V'+_B4kd[NK&s3EdMqWC2@g-
+Fa&0%HiA?aH1cFYGlr;8G'<V&qK2a[q/l+K!d&L)n8ePKrbqjWrc%mUrc%[OrbhXPqf)IOm;Di=
+s(q^N!c2^jrbMXQDJf>irGDOMrb_[Qr,(_:qJYnAs)7pT!,qjSqeuLPq/67Pr,;RRrc.mU!-.pU
+s)IdPrGhgW!-.sV!-.sX!-A$ZqfVp^s*+BdrHeKks*aQhr-eNm!-eE]rb`!VAnG[f@q&t\r)<Pn
+r`/bprDru$q,./g'N%b*:f*CA:JYGENK&jSMMd1DBm]i<!/pW0rJUW@pmCoG!1NnVr0mYRs-WhQ
+iL'Y3rceBes*=Qhs*F`nrI+]p!.Xuus+13%s+C?)!/:E,!JcL1M.qj*N/WaUNfT6_OcklkPa.Q$
+R$a;1S"-%@StMdNUSO]_Vl-MoX/rG+YctC=ZaI6N\[f>b]tV7t_Sa=2`lQ6DbKS8Wd*^:jeCE1&
+g"P39h;7&IiSrnYjlY^gl07L!m-O--n*fc9rpg*]o`"Lbp@n=[q#C0iqY^6ir;HTdrdk*#s4[L'~>
+JcC<$JcEUemf*+^r;??erVHNhqY:$`rq?6^s7@((;cm:5@U`bQ>?Y-1=[5DF77Q_5mHsl=s6B[M
+rosIH!9a@Ds5c&tj5].XiS`YOhVI#CgY1B7f[na+e^W*sdF$=ecHXSVbK@oIa2Z*:_ns:+^V@Lr
+]Mql);ZKer<W5tt;u9NI4$5Se4$#D_2`N]Q69m^t4?GP^2Dm6F0.nk11,:XA1c7*I1cnE-9J8.c
+1eCD<r_`_npJUcb!)i_lpepob"]A8u<)Z]i;#jMl;?'Pk;$'Wo;u9Gt;,C+f;cHasr`&Ym"&r2s
+;Z'Dl;#X>l;#X>l;#a;k;#O8k:]=/j:]4,h;>F&b;?'Jm;=RK]:B4/e:]=,h:]4#k:JO\^;#F/j
+;#X8j:B+,i:B"&h:B"&f:A.Hb:f1'^:\7K`:B45j:B45d;#sKhpJClc!)WYlrD3Yp:ejb^;#F2e
+;#O8j;Z'Di:]OAl;Z9Pn;?0Sn;#O8h;Z0Mq<)Z`p;?0Ym<;KSq<)rlr%T$"u;G^7e9h\5R8k;NA
+r)<Pnr`/bprDs#%5Pm_F5Q="J5n?sp5s[q2:/=_a;H$Fk6V@>\s&eqsrD`Yo"]SE!<)clr<;okt
+<;oeq;tO&b<Vobh;u]bpGQ2pfH2W'hHN8HlIK+`rJ,XuuJcC?%KE$T)L&Qf-LPYqdBo7h-N/`gW
+O,oBbP*2#nQ'Rc(R$jD4S=Q7CTV8'SUnjlcVl?\sXKAY0Yd(O@[C3QT\\#Mf^;%M$_o0O6aN2NI
+bg+M\dF-Lne^rF+g=tE=hV[8MioB+]k2tjkl0@U$m-X60n*olHncA@Srq-?dp\4X]s7u]kr;6Kk
+rVcBfJcC<$gAc[~>
+JcC<$JcEXfmf*+^r;??erqcThqY:'arq?6^rq-6^"4c5gli$2OlK/$)#3"QH>$"g.rTsRMs6BUJ
+s6'IGroQ-#jQ,@]io/kSi8<DIh;$c=g=b-1f@JL%eC)ald*L"_bfe2PaiMNB`Pf[2_SO"%^:h1k
+S=BMHp6bWA-?*j>C2.HtDJXo<BWS2/VP0QKQB@/\K7J>pG(5-rJq\l4L5:\]rjrZ?Njk%tH$t3r
+LQ.CWO,rgmrfR,A!0R5C#*G"/O,f3ZrJ^]7!0$o8!/gc3r.k3)pP&Hsq1\Tu!el;\rIafs!/:E*
+"+u2VK)U?"J,t4OqLJ]uIt.BFr-n]qrI+Efs*O]l!.4]kqK`*ercnKgrHJ9d!."Qir-A9f"*o-:
+H2DjcH2VsgH$]I8!d]3?rH\Hhr-J?h!.=EcrHeKhqKi*c!.+Qird=`os*Xip"+5NFIf"WpJ,k)u
+IKb4MIXcluqg\QpoRR!ordt?,KnbA<r.tB0s,$f7rf$l:!fi>&rK.&As-!DGs-!DGs-3JIs-NbQ
+&Xf#SIscTgH[9mWCiXE0CMn:m;uTbp<Vfbo=8uD#>6.l/r`T5&&6[)r>[2]L[^W`S[^<?EMk^-E
+qP=(drlP8cc2,`cch>``cN)5hbl>lcb5KNZbkoQ`b4j$XG5ZXbGlN'fHN/<lI/SHpIXckHJH(0#
+K)UB1KS>,7L51P?M2@+Jret?HNfT6_OckllQ'IZ%R$a>3S"-%@T:hmPUSO``Vl6VqXKAY/Yd(O@
+[C3QS\[oGd^;%J#_SjF5aN2NIbg+M\dF-Lne^rF+g=k?<hV[8MioB+]k2tjkl0@U$m-X60n*olH
+ncA@Srq-?dp\4X]s7u]kr;6KkrVcBfJcC<$gAc[~>
+JcC<$JcEXfmf*+^r;??erqcThqY:'arq?6^rq-6^".uBhYPtd8Y,\CrVP^2e;c6Ij;Z5t^li68L
+l2TrIkPjU#jlGL_j5T%Vi8EMLh;-l@g=k64f@SU(eC;podEp4bcHOJTb/q`F`l5m6_SX.(^V7Co
+]DR9ZJH1<!JH16!J,Om>?<g`=>Zt96>%:T6JU_umGB\+ID/!Qk@UEAE@q9%YrFZ(C&q5h"NdPf$
+FeihkEH65IH[C'bo6^I_qKW'crH\'\rHSWmH$OXYGBS0)Fo$4ZFo$4LFTQZ+F7=5MEW9tYDfPbq
+s)7mUqJZ=Mr,;LPr,:t?qec@Ls(_XOD>e8ND>S5LD>nAND?"MPD<Ys7Dt.]HDf0IdDuX_ODuXeS
+DuO_TEW0qWEW'kVEVFGNEW0tYEW'hVEW'nXF8L(UFoQXbGPugcH3&A?rdFKhr-eEj%WZK,DJsB/
+Bk:mgAR]1^r)<SorDi\pr)`o#qGI8h(f=1.:f*CA:JbYPNK&jSMMd1DD0q5#Mi7CgrJUT?pmCoG
+!1NnVr0mYRs-WePigBahrHJ9ds*=Qhs*F`nrI"`rIt.HJs+(0%rdtT3KnY89LPL\BM2I5jN+7j-
+O,oBbP*2&pQ'Rc(R$sM6S=Q7DTV8*TUnsrdW2cl!Xfek3Z*UdE[^WcW]"G\i^VI_'`5Ta;aND]M
+cHaeadaQ^rf@S^0g>(N@hr*JQj5f=ak3)!nlKdg'mI'H3nF?MK!V>s_o`Fj]p\jmeq>^<hqu6Nl
+rUg)?s+14(s*t~>
+JcC<$JcEXfmf*+^r;??erqcThqY:'arq?6^rq-6^!`iK3raH.@?!:<1=BJX-r^HiVrTsRMs6BUJ
+s6'IGroQ*"jQ,@]io/kSi8<DIh;$c=g=b-1f@JL%eC)ald*L"_bfe2PaiMNB`Pf[2_SO"%^:h1k
+<;'5k<)rosrDWYo!^8\.rAkKM3%m6K5X@Rs5!1h`2`ENIr\+=(r\=I0r\P?J2)Ij":J<Z/5Y4sQ
+;G^1e;H$Ij;>O2b;ZK_o;>=&b;$Bir<)cdonkoEbqb[>kr_r_m"]8)n;H$Nn<W?%n<<H3!;H!Ei
+s%r\ls%r\ls%r_k!)WVks%iVj!)NPis&&_k!)NPiqGI8h!)`5^r_NPhqbR2d!)NMfr_NPjr)!Gj
+r_NPhs%iYis%iYir_NGepJ1ie;,Hp]oMGQ`r)!/c!`2ZgpJClc!)WYlr_WVl"&DZf;#=,e;#O8j
+;Z'Di:]OAl;Z9Pn;?0Sm;#O8i;Yj>k;?0Ym<;0Dj<";\u;,:+h:f'hY9MA#N7/U!_<;fhn<r?&!
+=SkA_5Q="J5n?sp5se%6:/=_a;H$Fk6V@2Xs'#8%r)EPn#ZO`$<)cjt<)ifr!)rkps&8Phq,R;k
+p/D!7rHJ9ds*=Qhs*F`nrI"`rIt.HJs+(0%rdtT3KnY89LPL\BM2I5jN+7j-O,oBbP*2&pQ'Rc(
+R$sM6S=Q7DTV8*TUnsrdW2cl!Xfek3Z*UdE[^WcW]"G\i^VI_'`5Ta;aND]McHaeadaQ^rf@S^0
+g>(N@hr*JQj5f=ak3)!nlKdg'mI'H3nF?MK!V>s_o`Fj]p\jmeq>^<hqu6NlrUg)?s+14(s*t~>
+JcC<$JcEXfn,E4_r;??erqcThqY:'arq?6^rq-3]"5;\sm/HAQlK8**%cH=*iE08c='4hUlg*j$
+rojLJkNDj,3p#G`j5].XiS`YOhVI#CgY1B7f[na+e^W*tdF$=ecHaYWbK@rJa2Z*;_ns:,^V@Lr
+]XtbER[TY4p6bfF!1<bP1N75KC2%BtD1@(KB<.u.Un4!AP`:NTK785nG^tI#K7er5LPCYt]Y'Z"
+\Y?$II"-g(NVnn;O7SJ3Oo:ICOoCLJOcYWbNfB%sN;\_9N;e_8MZ/G0L\uo$L&$DuL&$K'L&Zi)
+KD'ruL&Q`/K7\Z+JV!`L!J,dtJHC@OJ,FcnIft4KI=-J;I/eQlHiSNmHMVpeHN&0iGl2afG^4U]
+r-A9f"*o-9H2;dbH2VsfHMr-hHhVjcHiJKeHi&-hH2;jcGlW0hHi8<lIJeKmI/n`nJ,b'!J,Xm"
+IsultJGOcpJFe<lK)UB'KSBD\!JlO1M#W;4MMqFls,@)?O,s7$!0R8D!0dDFrf[>HrfmPNQ^@Z<
+&=JoFI=-?gH?OILDes6(Dfu"Wr`&hrq,[GqrE'&'r`]M/=BSg1r`B_7aN7[tKVl2e\$i`PZETLd
+r1j.brhTV:rQ>/aqTf,ep<```"jP67bfe3/b5KNZbkoQ`b4s*YFoQX`GQ2pfH2`-iHiJKmIK+cr
+J,Xs'JV&K+K7no3re:T3Ll$tGMuJZJNK0'\OHPcjPa.N"Q^F20S"#t?StMdNUSO]_Vl6SpX0&M-
+Yd(L?['mEQ\[oGd^;%J#_SjF5aN2NIbg"G[dF-Lne^rF+g=k?<hV[8MioB+]k2tmll0@U$m-X60
+n*ol<o(2JFrq-?dp\4[^s7uZjr;6KkrVcBfJcC<$gAc[~>
+JcC<$JcEXfn,E4_r;??erqcThqY:'arq?6^rq-3]%&'W%Yd(I:X/MkkVPF-e$;OJs;,ZcIlg*j$
+rojLJkNDj,2<Eo[j5].XiS`YOhVI#CgY1B7f[na+e^W*tdF$=ecHaYWbK@rJa2Z*;_ns:,^V@Lr
+]XtcSK)C3"K):-!JH(,tJ-94b>ZtD3=qk@R<`Xd"I!TsWEc5`*An5=W>[:k<AH?FUrb)b$NK%q$
+Lj4PdD/aN<Gl2pfHM)XaHMVpeGlE!]Gl;pfGQE)7rceBcq/uLTs)n-ZnoatSs)[[Ms)J'X")i0u
+E;jeTE;FMPDYnAME;jbVDK"o[qec@Ls(_XOD>e;ND>eAMD>nAND#eJOD<c$7Dt7fGDuX_LDuX_N
+DZFbSDu=PSEW0qWEVsbUEV=ANEW'qVDuanUEWC1YFT$=^FT-F_Focf3rH\Bgs*O]mpO<$gqL8Ho
+!.+W`s).pUC]7oJAR]4arDW\prDiYorE&r"qb\5-;,L4g:f*CA:K2+]NK&jSMMd1DEdNb'Mtr80
+MZB%>QhZsER/i]TS,A]TRJrTPQfOP6FoQX`GQ2pfH2`-iHiJKmIK+crJ,Xs'JV&K+K7no3re:T3
+Ll$tGMuJZJNK0'\OHPcjPa.N"Q^F20S"#t?StMdNUSO]_Vl6SpX0&M-Yd(L?['mEQ\[oGd^;%J#
+_SjF5aN2NIbg"G[dF-Lne^rF+g=k?<hV[8MioB+]k2tmll0@U$m-X60n*ol<o(2JFrq-?dp\4[^
+s7uZjr;6KkrVcBfJcC<$gAc[~>
+JcC<$JcEXfn,E4_r;??erqcThqY:'arq?6^rq-3]&6W:I@U`bP>$+g,=B/I+=[2mS#"ItGlg*j$
+rojLJkNDj,2<Eo[j5].XiS`YOhVI#CgY1B7f[na+e^W*tdF$=ecHaYWbK@rJa2Z*;_ns:,^V@Lr
+]XtcI;ZKeo;uK\p4>AoY4$#DR/iY^S5!M1l4$#;Z2)I'C0.ee31Gq!G2)I3K1egh@/j;NZ92/8\
+;c?OlrDNVlr)38fr_ibnpJUib"]A8u<)Z]c;?'Pk;#jMn;uKVo;$9]m;H$Nn<W?%n<<H3!;H!Ei
+s%r\ls%r\ls%r_k!)WYl!`2Zgr_NSjr_WSkrD3JirD<>fs%i\mn50*[!)EAdr_<GhqbI/es%rVj
+!`2Zgr_EJh!)EMhs%`PhrD*&^!`2`jp.t9Vs%iPhq,./g!)NPi!)`Yjs%iVj!)`_ls%rnp:/=\_
+r)*;er_`VlrD<Sl;>j;k;>sJn;?'Mq;,C'f;#O8i;Yj>l;?0Yl<;0Di<!ZE!;,C+f;c?Bh9E.Ta
+7/^'`<;fhm<rH+u=StGa5Q3qI5mLCh5sn1::/Cjd"B//q78!P^r*&u#s&Jtrqc*bu;c?Xpr`&qt
+rD`hrr_ibpoMkWdqc*;gs)n?brHJ9ds*=Tis*OcnrdFfqs*t#u#D%JYK7ei1L&Qf1LPUeDMMqIm
+B8qq4O-#NfPE_>tQC!u,R[]e;St;UKTqeEZVPgAlWiN8(YHY:;Za@0L\@K2`]Y;.r_SX71`lQ6D
+bKS5Vd*^:jeCE1&g"P08h;7&IiSrnYjlY^hl07L!m-O--n*fc9o()DDo`"Lbp@n=\q#C0hqY^6i
+r;HTdrdk*#s4[L'~>
+JcC<$JcE[gn,E4_r;??erqcThqY:'arq?6^rq-6^rpg9Tm-O-,lK8**%H-4)iS`SJ?!CE4=R,2M
+klU)3kPjTEjlHF$1ZIBPi8EMLh;-l@g=k64f@SU(eC;sqdEp4bcHXSVb/q`F`l5p8_SX.)^V7Co
+]=PPBRf8`KR/`NPR/`L/EGfW-NeDk3It)'CWi;niS!]P(MM[+>I!KmZJV&N+K8,)8Ll/gWEjM"S
+S!SGJK858CqiLf<nrWj5rK@,A#Ek41O,f6[NW"h6N<Y?"Mi*@IM#<&+LA$>tK_gDuLAuu-K`-Pt
+K`?c*KE[![JV&H(r."g!JGOfuJ:E(HIf+ZuIXQWlIJ8-hHi8?jHMVpeHN&3gG63#5GlE$eH2`*l
+H$FU[qfr'brceHhHN&3iH2r<jH2r6gHN/?lI.hpaHN/9eHMr*hHN&6lH@,X=s*ainrd=cqqgSTr
+rI5!"It)osJGOcpJFe<lK)L?%L&Qi0LkgeBre^Z5rJ^c9s,[)>q3(cAs-3PKs-E\O!LT5PR/`Qc
+Jp_rmH?j^TD/aE/C2\2m;uK\p<V]\o=8Z/+=^,*6>$+p2=oMM6=ie]iCQ#='\$rfS['Hp'r1j+a
+s/#b;rQ52bc-?.2s3LDcr6GAfr6,)^r6+u]qTAl]q8rYYs)n?brHJ9ds*=Tis*OcnrdFfq!.Xuu
+s+(0%rdt6)L&Qf1LPUeDMMqImArVk4OHG]hPE_>tQ^F/.R[]h<StD[LU8+N\Vl-MoX/rG+YctF>
+['d?P\[oDc^;%J"_SjF5a2lEHbg"GZdF-Lne^rF+g=tE=hV[8MioB+]k2tmll0@U$m-X60n*ol<
+o(2JFrq-?dp\4[^s7u]kqtpBjrVcBfJcC<$gAc[~>
+JcC<$JcE[gn,E4_r;??erqcThqY:'arq?6^rq-6^rpgGsYd(I:X/VtmVPBsdV$Nll<)ZXk;X3QG
+klU)3kPjTEjlHF$1ZIBPi8EMLh;-l@g=k64f@SU(eC;sqdEp4bcHXSVb/q`F`l5p8_SX.)^V7Co
+]=PP)K):,uK)U?$JcLB!J0A6)?!M,S?=72M<`ad!H?aRREG]H'A7AnO>$GKHA7T7`rFl4j$X8.(
+OaMUnD/aQ?H2DsfHM;aeI!bj=qK`$a!."6^s*4WiH2W!eGQ)d^FTHT*qfMg[qK2:Ns)e9^n8ePK
+s)8'YEH#mrDuO_PDuOYODu=SRDZO`om;Df<!,VXMs)%^N!H)cQDZ"AOD#S;ODZ+GMD?+VDDYe;F
+D?+PPD?=`oDYA#KDYe;OE;a_PDuanWDuanUE;sqPE;jkUEWC+YDuanUEWC1XFT$=`FEMa*G5lgc
+H2i3jHN8HlIJA9hIJSElIhI9_F)Q#9Df'<(AnP[c@qB7N;uK\p<V]\o=8Z/A=]&$m;,L.e;,U:g
+:m@5@>&]7VNJi^PMMR"1I#EpXMZ8V7Q2I!CR/33NRf8fSRK/cTR/<65R/_:.FoQX`GQ2pfH2`-i
+HiJKmIK+`rJ,XuuJH1<$K)pXZre:T3Ll$tGMuJZINK9-^OcklkPa.N#R$a;1S"-%@T:hmPUSO`a
+Vl?\sXKAY0Yd1UB[C3TU]">Vh^VI\&`5Ta:aND]Mc-FY_daQ^rf@S^0gYCWAhr*JQj5f=ak32'o
+lKdg'mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<gqu6NlrUg)?s+14(s*t~>
+JcC<$JcE[gn,E4_r;??erqcThqY:'arq?6^rq-6^rpg%rraH+>>$+g+=B/H$=U/%s77K^8lK\?4
+!pJh1roO7CjSn0oio/kSi8<DIh;$c=g=b-1f@JL%eC2jnd*L"_c-4ARaiMNB`Pod4_SO%&^:h1k
+]".6-rD`_X'JV3k/1iJ42aBSk4Zb\a2E!BJ0eiS[s"Y9G1c.'G2Dm?d:G"Ff5Y4dJ;,L.eqGR;i
+r)38fn5B0]"]A8u<)Z]d;>sJj;#jMm;uT\p;$Bcn;H$Lnr`&qtpf.Ap;c<Kis%r\ls%r\ls%r_k
+!)WYl!`2Zgr_NSjr_WSkrD3JirD<>fs%i\mnPK0[!)EDer_EJhrD!Jk:/=\_qbd>gs%`Sis%`Ph
+!)EJgrD*&^s&&Jcq+q&er)!Dhr)!2d!)WYjr_WVlrD<Jhr_NSlr_Nbq:ejb];#F2e;#X>j;Yj8i
+:]OAl;Z9Pn;ZBPp:Jamc;>jDi;u]_q;u'De<V]T*;,:%d;c?Oh9MA)P8P;HM;uK\p<V]\o=8Z/+
+=[55:5X.Iu5lEtR<E)7P8PW#Vr_Wht;,TkU=o2D"=oMG"<;KVo;ZKem<<6&tr_ibpo2PTeqGd5g
+s)e9`s*"?bs*4Qhrd+Tks*Xfos*artrdb$"!.t3&!JH1+L'<?gM2@+JretHKO,oBbP*2#nQ'I]'
+R$jD4S=Q7DTV8*TUnsueWN*##Xfen4ZEppG[^`lZ]=bkm^qmn+`Q#s>b0/#RcHjnde'uq"f@em4
+gtgiEi8N\UjQ5Odkiq?slg4!*mdKW6nac8BoCW%T!quB_rqQNhs8)Wirqu`no_sFAJcFI(J,~>
+JcC<$JcE^hmf*._r;??erqcThqY:'arq?9_rq-3]rUL`fm-X6-kMtR]iSieUiSWJHgeh6X='5Id
+s60LGroO7CjSn0?io0mp0AkXBh;$c=g=b-1f@JL%eC2jnd*L"_c-4ARaiMQC`Pod4_SO%&^:h1k
+]",A?Rf8`HR/WElI@lmkMLg/)JV.QGWMQGaR[98!M1pY5I!9gcJc:97KS+o4LmkrgOdWe?dWg1j
+KnkZ`OT(=3OT(C@P5C@AOSt1>NW"h6NW4q?Mi*@IM#<&+LA$>sK_pK!LAuu-K`-PtK`6]*KE6^W
+rIOls!J,duJHC@OJ,=]mIfOrrIJ8-hHiABmHiA?fH2`-hH2VpiG^"FZHMi'eHN/3iH2;dbH2W!c
+Gl`5<pNlgcs*XTgq0N'dqg/0c!IB+lHMr3kIJeKmIK+crIft4MIt3(JIfOrsJ,XurJ,OohJc13&
+KS>0YL]<21M#iKlr/:`;NfT8"OS=nCPE_;sQ'Rc'qj8%bR$jA%IXQTjH$41CDf0B,DK\tW<;onn
+<r?%t=T2G->?Y34=^"u-=:\QUaBWbL['mHQ[^NQKYd")$qP=.frlGAebK@uNc-?.2s3LDcr6GAf
+r6,,_qoel\qTAl]qoSeYrcS6arHJ9d!."Nhs*Ocnrd=isIt.HJ!J,k%K6)^"Knb>;Ll$tGMi<US
+NfT6_OcklkPa.Q$R$a>3S"6.BTV8'SUnsrdW2cl!Xfek3Z*UgF[^WfY]=bhl^qmn*`Q#s>aihoQ
+cHjnde'uq"f@em4gtgiEi8N\UjQ5Odkiq?slg4!*mdKW6nac8Bo^r.U!quB_rqQNhs8)ZjrVZWm
+o_sFAJcFI(J,~>
+JcC<$JcE^hmf*._r;??erqcThqY:'arq?9_rq-3]rUL`+Yd(F7Wi)\jV50raVPU&_Ude6\;,[DX
+s60LGroO7CjSn0?io0mp0AkXBh;$c=g=b-1f@JL%eC2jnd*L"_c-4ARaiMQC`Pod4_SO%&^:h1k
+]",A'K):,uJcLB#K)^E#J21DREGfGu?!q)N=&j`sHZsRPDes&sA78eK>@D#PA7]@`AnPe&NK%k!
+M0,G,DJsT?H22gdHM;dcI/eNhH16(YGl`/8rHS<crc\-\!H`D[FT-FYFRsYTFT6FOErU.ZDuahU
+E;jeTE;FMPDYnAME;XYDD?4TlqJ?CPCMRa'D>n>QD/O4iDZ"AND#S8ODZ+GMD?+VCDYe;HDZ=SP
+DZ=YTDYJ)LDY\2NE;XYOE!1)uE,fmqDuanPE;aeUEWC+XDuanUEr0tWFoQR`FoQUdGBeB2H2i3j
+Hi8BfIf+WjIf=fsJGt*1H?!nBE,KK,AnP^d@Uj"KrD`brq,[DprE0&%)c9F/;,C+e;Gp=fPa,$N
+Fc26=Mi3IMLk^Y3Mti20MuJtBQ^Ic=pR(fF!1NnVr0dVRrL!GJl^7WmrcS6arHJ9d!."Nhs*Ocn
+rd=isIt.HJ!J,k%K6)^"Knb>;Ll$tGMi<USNfT6_OcklkPa.Q$R$a>3S"6.BTV8'SUnsrdW2cl!
+Xfek3Z*UgF[^WfY]=bhl^qmn*`Q#s>aihoQcHjnde'uq"f@em4gtgiEi8N\UjQ5Odkiq?slg4!*
+mdKW6nac8Bo^r.U!quB_rqQNhs8)ZjrVZWmo_sFAJcFI(J,~>
+JcC<$JcE^hmf*._r;??erqcThqY:'arq?9_rq-3]rULS0@U`bO=]\X+='/U.>$4s0=Z-1I!(QtP
+s60LGroO7CjSn0?io0mp/`5F@h;$c=g=b-1f@JL%eC2jnd*L"_c-4ARaiMQC`Pod4_SO%&^:h1k
+]",B>;uT`7.Q]OG0eFn,/MB%>5s@Fp4#o5Y2)?s@0J5!W1(Q2t1c$sG2FUA:2a0Js<)EQl!*&_k
+r_`SkpJ^NYrD<_r;cH^p;Y*cb;Ys;k;Z0Pn;?p&q:f1+h;cN`r!*&\m!E2nn;?'Jl;?'Jl;?'Jm
+:B45j;>sAj:]O;j;#X>e;#4#l:f1(d:\.E^:]F2e:]=,h:]4#k:JO\^;#F/j;#X8j:B+,i:B+,i
+:B"&e:A7Nc:f1'_:]!ug:]!ug:]+&b;>sAi:]OAj;#a>f;#aAq:JO\];#=,f;#O8j;Ya2i:]OAl
+;Z9Pn;?0Pm:]F8k;$'Qk;>jDj;u]_q;u'De<VKGo;c-Ek:^Kup91qrO8kMKMrD`brq,[DprE0&%
+#!bC<5<hCurBUZg<'`rF:JO^b;$9fp;H$3b>5MJ#<W5to<W5nt<EArr!E<"s;ZB\o;ufqn<;T\l
+<;KPlFT-F_G5ZXbGQ<$fHN/?lI/\NqIXckHJ,t4Qre#9FKnY89LPUeDMMmFPNK0'\OHG]hPE_>u
+Q^F//S"#t?StMdNUSO``Vl6VqXKAY/Yd(OA[C3QT]">Vg^VI\&_o9X9aN;WLc-FY_daQ^rf@S^0
+gYCWAhr*JQj5f=ak32'olKdg'mI'H3nF?)?oCV\So`Fj]p\ssfq>^<hqu-HkrUg)?s+14(s*t~>
+JcC<$JcE^hn,E7`r;??erqcThqtU0brq?6^rq-3]r:1$]mI'B*jndsHhqm2FgXt"W>$+j.kih4/
+k5XNCjSn0?io0mp/`5F@h;$c=g=b-1f@JL%eC2jndEg+`c-4ARaiMQD`Pod5_SO%&^:h1l]",BN
+Rf8`HQo(.VCndA\Lk0l$Jq@X7W26AaR[91tMhck4H[0d`JV&Q/KnbA<MS$N?Ybe"lR<sF8Ll7>i
+OSk1<OT1C;OSt=@P5LFCOH9="r/CT6rf$l7s+pT.r.ap!pk8R!q1ep's+L?'pOrO"s+CE*K)L8u
+J,t4Oqgeg!It.?ErI4frr-e<e!.4Zl!.4]kqK`*ercnKgr-&6fH$Xf8H2W$kH$FRZqfr'brHJ<g
+rd"Ni!.4Hds*Ocnpj;g_s*=EdrcnNjHiA<kHiAEmIJnQmIJeQoIfP#pJ,OoqJ,XuhJc:<%K`6]3
+LPCS>LkpnEMYrG5N<5-$O8b4@Onk.FPEM,oQ'IZ$rKdSQQ^@Z<&Xf)VJpVlmH$=FNCiX?,CN<AQ
+<;fhn<r?%t=Su>%=p%l0>$:i,%p?up>^;dH[^W`S[^<?EYl:EoU]RC6aSs9cb0.rMbKS6.cMu5a
+d/D8kcHZ:1s2t5^qonr\s2t8]s)\-\rcS6arHJ9d!."Nhs*F`nrdFfq!.Xuus+,NKK7ei1Knb>;
+Ll$tGMi<USNfT6_OckllQ'IZ&R$jD4S=Q7DTqS3VUo(&gWN*#$Xfnt6Za7'J\%0&]]Y2(p_8=+/
+`lH0BbKS5VcdC1ieCE1&g"P39h;7&IiSrnYjlYail07L!m-O--n*fc9o()DEo_%nNp@n=\q#C0i
+qY^6hr;QZdrdk*#s4[L'~>
+JcC<$JcE^hn,E7`r;??erqcThqtU0brq?6^rq-3]r:1$]Z*CI4W;`[nV#[CkU^EroUJ=]a;,ZWA
+kPjWDjT+B@irS/urnoBchVI#CgY1B7f[na+e^W*tda?IgcHa\YbK@rJaN)9=`5BI.^q[Us]Y(hd
+\c.3XJbaorJ2:G3H#db5@9d/K@9.l,H[BsZEc5`,ARo1T>ZtQGA7]@bBP2$mNf@1jI!:9qCi=?:
+GC'%2rHeEhs*FZkrd=`mqK_RTs*=Hcs*+HcqK;gZqfMg[piQ.Ns)e9^n8ePK!cW'rrc%jTrc%^P
+rbhUOrG_XPn888DDYn;ND#\8OCi0,es)%^Pr,)FLrbVXQrGDIM!,q=DqJZ.Hrb_UO!cMsop2BtK
+qJZCQrGVRPs)7pV!-.pUs)IdPrc.pX!-.sV!-.mVr,hm[rcJ0_s)nHfG^014s*=]mI/SKgIf4]k
+If4cpJcC<3F)Gr9DJX*$AS#Ia@V&L;<;fhn<r?%t=Su;3:f1(d;,L4h:f*FB:Le_MNW4q:M?J`i
+L4"pTM?&S5Pld8<R/WHHR/33NRf8fTRfAfSR/!$9R/_7+FT-F_G5ZXbGQ<$fHN/<lI/\QoIK4ls
+JH(1IJqJ]/KS>/8LPUeDMMmFPNK0'\OHG]hPa.N"R$a;1S"-%@T:qsQUnjlcW2ZetXf\e2Z*UdE
+[^WfX]=bhl^VRe)`Q#s>aihoQcHjnde'uq"f@em4gtgiEi8N\UjQ5Oekiq?slg4!*mdKW6nac8B
+o^qhLp@e7TrqQNhs8)ZjrVZZnoDX=@JcFI(J,~>
+JcC<$JcE^hn,E7`r;??erqcThqtU0brq?6^rq-3]r:1-`@U`YI='&L+r`K5)r`T5(#[9M^7R]f1
+ki_s-s5a7Aro4%=iVqaehqm2FgtUQ:g"=p.f%&:"e'cXkcd'h\bfe/NaN2E@`Pf[2_8*h"]tD"h
+\[hQ8s&/Ph),qt=3ArZI/1E,%/iGpZ5!;%k3]8oR1GLT_/eTlo1GgpG2)I-J9i3H!4uGu1;"IT`
+;>X8e;smQ_;$Bir<)cdoo25Kbqb[>krDW\n#>n;o;,U:j<;okt<;0An;c<Njr_WSks%r\ls%r_k
+!)WYlr_NMi!)NSjr_`GeqG@Al;,L.co2,E^s%`Ger_<GhqbI/es%rVj!)WYjs%`Si!)EMh!)EJg
+rD*&^s%rbmpJ:Z_r_NGgs%iPhq,%2i:J^pcs&&_kr_NAe"]8)k:JXg`;>a8i;>sJg;?'Go;,U<k
+;?'Mo;>j;j:]XEir_`VlrDW_os&8bnp/Uid&62\+:/Fec;,BkX9M8#N8Q5UfrDi\pr)`i!r)j1f
+5X.Iu5lEtR<E)7R92JAZr_Wes;,U=br`]/$!*&hqrD`\p!*&qr!``9%qc*Yr;uTYp;uBSp<VTPj
+<Vobl;u^q;FT-F_G5ZXbGQ<$fHN/<lI/\QoIK4lsJH(1IJqJ]/KS>/8LPUeDMMmFPNK0'\OHG]h
+Pa.N"R$a;1S"-%@T:qsQUnjlcW2ZetXf\e2Z*UdE[^WfX]=bhl^VRe)`Q#s>aihoQcHjnde'uq"
+f@em4gtgiEi8N\UjQ5Oekiq?slg4!*mdKW6nac8Bo^qhLp@e7TrqQNhs8)ZjrVZZnoDX=@JcFI(
+J,~>
+JcC<$JcEain,E4_r;?BfrVHNhqtU0brq?6^rq-6^r:9jWs6]pQk5FB@iXb)-hqm5Gg=F]saBVkM
+=6KSFs5a7Aro4%=iVqahhqm2FgtUQ:g"=p.f%&:"e'cXkd*Bq]bfe2OaN2E@`Pf[2_8*h"]tD"h
+\[f5=Rf8`TR/`NKR/WF/Hto7?PDFd>IY)9GXf/%iS=5b,M26q<I<g$\JV/Q.KSG/8LP`XUR@:aN
+k'DE,LPUtQOnk+:O8P+=O8=t;OoCOAOTLW*O8Y(=NW"h6NW4t;M?/Qir.k3)p4`9prIt$$s+UK+
+rIaitre:B*!J?"&JbjooJHC@OJ,=]nIg(:LI=-HkpNusfrHnTlrd+Eds*FZiqf`$brd+NgrHeKg
+!."EcrH\Ber-8<hHhMacHiAEgHh_peH2;jcH2i6jHMr3kIJeKlIJeNpIt7<DrIFirrdaQj"bMAZ
+KS5'WLB!&/M#W;3MuAV7NW5%=O8k=AOoCLDOo1CBP6R8:Q'R`&QMm-QR$X2-RJiQcMgg#$H?XRS
+CM[g&BlJ2o<;fhm<rH+u=Sc/<>$+p2=]ea-=ieZkJ>0K\\$rfR['Hp?USI[]"/X&YaSs<\b6,o1
+bg$%1!71>brQbMibl#Zab59B]bQ>u3bkoQ`b5B?]ErL.YFT6L`G5ZXbGlN'fH3/G@I/\PDIXcit
+J:W9'K7ei1Knb>;Ll$tGMi<USNfT6_P*2#nQ'Rc(R$sM6SXuIHTq\<XV5L5jWiN5'Y->1:Za@0M
+\@K5a]t_=u_Sa@3a2lBGbg"GZdF-Lne^rF+g=tE=hV[8MioB+]k3(sml0@U$mI'H3nF5u=o(2MG
+p%A%P!;HHes7u]kr;6KkrVcBfJcC<$g&HR~>
+JcC<$JcEain,E4_r;?BfrVHNhqtU0brq?6^rq-6^r:9jW"0o&2WVrapV%9H"UnjiaVPKrXRo3-]
+;<Rr@s5a7Aro4%=iVqaghqm2FgtUQ:g"=p.f%&:"e'cXkd*Bq]bfe2OaN2E@`Pf[2_8*h"]tD"h
+\[f5%q18Hqrdk'!+C.ujE,9&n?sd>C<e>dIH$4:LDJ<]oA7/\I>@V2SAnM$T%VTI7NH00!Gd;.'
+E--;Mp3Zaar-SEh!.4]ms*Oclr-A-`!."?as*=Hcs*+HcqK;gZqfMg[piQ.Ns)e9^n8ePK!cW'r
+rc%jTs)@dPrbhUOrG_aS!cDppmV_o=s(q^N!GlWOD#\ANDZ"AND#\>PDZ+GMDZ=YDDYe;IDZ4MO
+DZ=YTDYJ)LDY\2NE;XYOE!(#tE,kbo!-.pU!-.sVrc.mW!-/!W!-.mV!-A'[rcS0]s)n?bs*4He
+s*=]mI/SKmIK4fpIf4]jIf=fsJGt,uJcL&oE!pQ"Bk:me@Uiq\<)ifrq,[GqrE/o!s%rbmrDESk
+s-3X`BR]r?s,6o7",M\dI//X"Mu8h?QN!9OQhZsDRJiWRRfAfRR/**JQiNKEQiM1+F8^4\FoQX`
+GQ2pfH2W$jH[L5?I=H]qIt3'#JV&N,KS5&6L51SAM2I4MN/`jYO-#NfPE_>uQ^F//S"#t?T:hmP
+USO`aVl?\sXKAY0Z*L^C[^WcW]=bhl^VRe)`Pom=aihoQcHjnde'uq"f@em4gtgiEi8N\UjQ5Oe
+kiq?slg4$,n*fc8nac8Bo^qhLp@\L\rV6Egs8)Zjrqu`no_sFAJcFF'J,~>
+JcC<$JcEain,E4_r;?BfrVHNhqtU0brq?6^rq-6^r:9jW"CbbC=BPQ+s&f>*r`KV4>?kE:>$49_
+7RcM>k5XNCjSn0?io0mp0&POAh;$c=g=b-1f@JL%eC2jndEp1ac-4ASaiMQD`Pod5_SO%&^:h1l
+]",A]r)<Plq,@8l*@ER$2)6j:.kE;42*jJk4Zb_c2`<NL0eb750/>?_1_Vc(2)@*a:GG$u7Slr[
+:fL=j;cEHhrDEAgq,?ra!)renr_Wes<)cdoo25Kbr)*JlrDW\ns%rqr;,U:j<;okt<;0An<)WWk
+r_WSks%r\ls%r_k!)WYlr_NPjs%iVjr_`GeqbdAis&&;_r_NPhqbR2d!)NJe!)NSjr)*Ghs%`Ph
+!)EMh!)EJgrD*)_!`2`jpJ:Z_r_NDfs%iPhq,.,erD3Jkr)!DhqG7An:esh^:f.!crD<JjrDNPj
+!)ien"Ahrm;H!Kk!`DllrD3Ags&&\lrDN\or_req!`N&tp/Uuh"B/8u<)ros#ZFPq;,L7h9hkRY
+"&)*^<;fhm<rH+u=Sc/%5X.L45lO%S<E):T9MeM\r_Wes;,U=bpf[Vrqc3Sor)Er#;c?Xq<`])t
+!E<"s;?0Yn<<#to<;ol!<)lrq<;TSoErL.YFT6L`G5ZXbGlN'fH3/G@I/\PDIXcitJ:W9'K7ei1
+Knb>;Ll$tGMi<USNfT6_P*2#nQ'Rc(R$sM6SXuIHTq\<XV5L5jWiN5'Y->1:Za@0M\@K5a]t_=u
+_Sa@3a2lBGbg"GZdF-Lne^rF+g=tE=hV[8MioB+]k3(sml0@U$mI'H3nF5u=o(2MGp%A%P!;HHe
+s7u]kr;6KkrVcBfJcC<$g&HR~>
+JcC<$JcEain,E7`r;?BfrVHNhqtU0brq?6^s7H<^r:9jWs6pB]kN1jgkN(X_iSXXk'\qBkd)sAD
+='A^-=Q\`+jQ#:[io0mp1uI0Gh;$c=g=b-1f@JL%eC2jndEp1ac-4ASaiMQD`l5m6_SO%&^:h1l
+]",A][[NYQR$di=pm<n)IV>7=NeW"6IXu*FX/W"lSXGe,MMR">H?aX`K7\c/K8##8LPrc]\"'(i
+H$k*pLQ.FZrfR&=r/^c;r/^c;rfR2Cr/gu@rf@&=!0-r9qi(`;Mi*@Ir.k3)p4`9prIt$$s+UK+
+rIaitre:B*!J?"&JbjopJcC6#J,=]mIg(:LI=-HkpjE*grHnZnH@#C4s*FZiqf`*eH@#O8r-JBf
+!."HdrH\?dr-@s]s*Ocnpj;g_s*=EdrcnNjHiA<kHiAEmIJeKlI0P.KI=?WpJGF]mJGt&sJFe?l
+K)^K'K`?c*LAlu.L]WEkMuJ\7N<#"<NrY:@OoLUEOo1CBP6-u6Q2R!KQi<9gQ^F,,R@9S4R@9@i
+I=$BfG]n"BDJWs&G#\E?q,[GqrE/ht(g'pE=]ea-=ieZrLoIhk\$rfR['Hp?USI^^!2]Y7s2b8`
+r6#,bc25cdch5Z`cN2>8r6,,_qoeu_s2tDdqo\u^rlP1[s)S-\r,hs]s*"?bs*4Qhrd+Tk!.=co
+s*artrd]'@JqJ]/KS>/8LPUeDMMmFPNK0']OcklkQ'IZ%R$jD4S=Z=ETqS6WV5C/hWiE/&Y->.9
+Za@0M\@K5a]tV7t_Sa@3a2lBGbg"GZdF-Lne^rF+g=tE=hV[8MioB+]k3(sml0@X%mI'H3nF?&>
+o(2MQp&F^cp\jmeq>^<hqu6NlrUg)?s+14's*t~>
+JcC<$JcEain,E7`r;?BfrVHNhqtU0brq?6^s7H<^r:9jWs6q57Wi2kqWhuViV50o`VPg;dTq.X=
+:/Xqd;Wd*%jQ#:[io0mp0AkXBh;$c=g=b-1f@JL%eC2jndEp1ac-4ASaiMQD`l5m6_SO%&^:h1l
+]",A][ePFRK)1$BJ6l5tE+rfg@:3ME=+YmJH?XFMD.mQn@pN;D@Us"\A7]EQBF\a9=+bdAKkbFD
+F*;hUI.hpcHMi-gH3ASBI!^5>HMr-cGlN'bGlN'cGlN!eG5?@\F8U.ZFng(NFT?O_F7=5ME<U<"
+DfBW6rbqgUr,2UTDuFSODu=SRDZXfpDu+>OD>A&MD/T2e!,VXMs)%^Ns)%aQr,)FLrbVXQrGDIM
+!,q=DqJZ.Hrb_UO!cMsoq/6:QDuOYNDuXeSDuFYSDuXbVEV=AOEW0qUEW0tYEW'kRErU4YFT6L]
+FT6IcG'A1UrH\Eh!df<BrI+]ps*alqr-eBis*k$!rIOlu%t8P<Df9N1CM.6kARf4_<;fhm<rH+u
+=SQ&!;#O8k;#cd^<c*KgNW4q:M?AZhL4&iT#E+k4Pa%GuQMm0NQhZsDRJiWRRfAfQR/30KR/`KQ
+R.lsIEW:(ZF8U.[FoQX`GQ2pfH2`-iHN8HmIK+`rJ,Xt>JV&N,KS5&6L51SAM2I4MN/`jYOHG]h
+PEhE!Q^F20S"-(AT:qsRUnsrdW2cl!Xfen4ZEppH\%&u\]Y2%o_8=+/`Q-'AbKS5VcdC1ieCE1&
+g"P39h;7&IiSrnYjlYail07L"m-X60n*ol;o()DErq6<b!;HHes7u]kr;6KkrVcBfJcC<$g&HR~>
+JcC<$JcEain,E7`r;?BfrVHNhqtU0brq?6^s7H<^r:9jWs6p4u>$5$5>[%&.$!LP<?!LW==]drg
+70uHGjlGL_j5T(WrnoHehVI#CgY1B7f[na+e^W*tda?IhcHa\YbKJ#KaN)<>`5BI.^q[Us]Y(hd
+\[]*I;u9Ji;uKZ;-nmV=1G:4//1rk>5X7Ot4$#>Z2`*6C0.nk41GUdCr\Op=1c8#Z2a0)k;#X;o
+<)QXor_rVjrDE;eqG[)cs&8kor_Wer<)cdoo25HarDESmrDW\ns%s)!;,U:j<)cjt<;0An<)WWk
+rD3Jkr_WSks%r_k!)WYlr_NPjs%iYkr_`GeqGI8hs&&;_s%iYiqbR2ds%iMe!`)Whr)!Gjr_NPh
+s%iYis%`VirD3Aep.k`d;,I!_qb[8fr)!Dhr)!2d!`2ZgrD<Mkr(mAhq+q8m:JO\]:f.!cr_WPj
+r_iYks&/ko!)WYl!)i_l!)WSh"].uk:f1*f;Ya8k<<#ks<;'>i<<#kt<)``prDNqu:f0ta;,C$e
+9*7dZ6WF"aq,[GqrE/hts$-KJr]pch<'s5O:esmd;$9fp;H$3`=oD=t<W#hp<<Q9";cHcr<r>qu
+<)`co!)rhqr`/bnr`/tt!*/nqrDW`9s)S-\r,hs]s*"?bs*4Qhrd+Tk!.=cos*artrd]'@JqJ]/
+KS>/8LPUeDMMmFPNK0']OcklkQ'IZ%R$jD4S=Z=ETqS6WV5C/hWiE/&Y->.9Za@0M\@K5a]tV7t
+_Sa@3a2lBGbg"GZdF-Lne^rF+g=tE=hV[8MioB+]k3(sml0@X%mI'H3nF?&>o(2MQp&F^cp\jme
+q>^<hqu6NlrUg)?s+14's*t~>
+JcC<$JcEdjn,E4_rVZKgrVHNhqtU0brq?6^s7H<^r:9mXrpUorl/q3nl0%'dio/hQhqd)>e'6"O
+^:LdZ>$+j.ro=%<38rfRhr!;Hh;$c=g=b-1f@JL%eC2jndEp4bc-4ASaiMQD`l5m6_SO%&^V.:m
+]",A][^MWmR@*o=qj@DM+FSWMR?NYcIXcftBP+3?VP'HGR#[,[L4OYqGCY6tK7s5Y%Z-"R]Si#e
+No521K8>DHrf[8CqN1W9s,d8A!0I&<r/go?!0[8B!0I/?s,I)=rJ^T4",i%nM#<&+LA$>rK`-W"
+LAuu,K`6VuK`6]*KE6^WrIP!!!.XrtqgecuJ,=]mIg(:LI=-Hkpj<'grI"Wls*FNerd+Ti!-nEc
+"*f*;HMr-fH2r6cGl;peGl2jZH2r<kI/A6kH@,F5s*=HerH\Eird+Qks*aclqgJKnpj`0krdXot
+o7?pnrdt<+Knb<\LAlu.L]iTnMi<VoN<#";O8Y1@P5^UAOp$u5Pa.O2Q3ihBQ^=),R@9P3rL+4K
+IXQQhG'7bADf'3'EHD+Zq,[GqrE/es(KspE>$+j-=ie[%O0H($\$rfR['Hp?U].(gV>J=5aT0K]
+b5fc_c2c2ad/;2jcHQ40s2t8_rQP&[!m8X,rGhjXs)\*[s)n?brHJ9d!."Nh!df<Brd=frJ,Xt8
+JV&N,KS5&6L51SAM2I4MN/is[OHG]iPa.Q$R$jD4S=Q7DTV8*UUo(&gWiE/&Y->.9Za@0L\@K2`
+]tV7t_Sa@3a2lBGbg"GZdF-Lne^rF+g=tE=hVd>Nj5]4^k3(sml0I^&mI'H3nF?MK!V>s_p&F^c
+p\jmeq>^<hqu6NlrUg)?s+14's*t~>
+JcC<$JcEdjn,E4_rVZKgrVHNhqtU0brq?6^s7H<^r:9mXrpU6_XJr5"XJr%nVZ*D&Vl6MiU7[sC
+QB[S3;c-Ciro=%<1u[BNhr!;Hh;$c=g=b-1f@JL%eC2jndEp4bc-4ASaiMQD`l5m6_SO%&^V.:m
+]",A][^Ps^!.t-"s*uk0>ubl^Bk(FV?t*5=IX?BbF`MJ<Bk:gb?!CNB@qB1_B4tplB9%seF,>(D
+Ci468GC0=:o6UXeH[C'bHi/3gHiA?iH2;dbH2;dcH2;dcGQ)daFTQZ-FoHI[FT-FXFS'\UFT$:N
+ErU+_E,TZ6DfG\os)@mS!H;uUDZ"GNE;jbWDJsIiD?+PLD?4TlqJ?@OCMRa'rG;LNrGMOMrbVFJ
+r,2OQmr%u?q/61KrGMXRs).XN")r0rDYe;OE;OSQE;jeHE;sqWE;jkVEWC+XDuanUErU4YFT-F\
+FT6L`GQ2peH2`*kH[L5>I/n`qIK+cnIJSBpIsultrIOlus+:f'E,]`6Chm]qAn>O`AnM$Bq,[Gq
+rE/es!Er=u;?'JmPmpr;LQ.:PMi3IMLk^Y3reg]5rK[DIs-3SMrKmSOpmCoG!1NnVr0mYRqj@8I
+rL!8ErGhjXs)\*[s)n?brHJ9d!."Nh!df<Brd=frJ,Xt8JV&N,KS5&6L51SAM2I4MN/is[OHG]i
+Pa.Q$R$jD4S=Q7DTV8*UUo(&gWiE/&Y->.9Za@0L\@K2`]tV7t_Sa@3a2lBGbg"GZdF-Lne^rF+
+g=tE=hVd>Nj5]4^k3(sml0I^&mI'H3nF?MK!V>s_p&F^cp\jmeq>^<hqu6NlrUg)?s+14's*t~>
+JcC<$JcEdjn,E4_rVZKgrVHNhqtU0brq?6^s7H<^r:9mXrpU-\>?Y69?X3M3!a8i7ra#V1>5hY.
+=@>SI77R::s5Gloi8EMMhVI#CgY1B7f[na+e^W*tda?Ihcd'eZbKJ#KaN)<>`5BI.^q[Xt]Y(hd
+\[])Vr_r\lr_r_o(apgd2Dd-@.kE5(3&Wuc4Ztkf2`EWN1G\q^(,I^'1Gh!G1c7-b:c:I$7p8_d
+;,U@lr`&kqs&/korDNSkoht]dqGI;lr_i_or_i_m"B&2u;c<0`rDNVl!)i_nrDEu":f1+g;cH^r
+<E/]m!E<"q;?'Go:Japf;#X>l;#a;k;#X>k:]F8k:]F8j;><ua;?'Jm;#jD_;#a>k:A[id:&n)e
+:B+,i;#F/j;#X8j:B+)i:B"#h:Amue:A7Nc:f1*a:]!uf:]!ug:]4,b;>sAj;#aD_;#a8j:]4,e
+;>sDk;>sJj;?'Mp;,I6h!)ibm!E)bi:]F8k;>jDf;ZKer;ta5h<;]Yr<)Zcn;[uZ$;,C(d;G0\V
+91hiN6iL*]<rH+u=SGr!>!N!Or]pch<(';Q:espe;$9co;H$3b=o21r<W,np<<Q9";cHcq<rH"u
+<;f\p;uK\p<Vf\n<W5tt;uK\p;uL_9ErU4YFT6L`G5ZXbGQ<$fH3/G@I/\NpIXh?ID1R:kK7no3
+L5(J>M2@+JN/WdXO-#KePE_>uQ^F20S"-%@T:hmPUnjlcW2cl!Xfen4ZEppH[^`lZ]Y2%o_8=+/
+`Q-'AbKS5VcdC1ieCE1&g"P39h;7)JiT&tZjlYail07O#m-X60n*olHncA@Srq6<b!;HHes7u]k
+r;6KkrVcBfJcC<$g&HR~>
+JcC<$JcEdjnG`=`rVZKgrVHNhqtU0brq?9_rq-6^r:9jWs7$!Us6<MJl/gsbio/hRhqd#:d*'DD
+]XYDWZW^L5=QAE"iS`YOhVR)EgtUQ:g"=p.f%&:"e'cXkd*L"^bfe2PaN2EA`Pf[2_8*h#]tD"i
+\[f5Y[^H+&!1<\NrL!SNs*ZP4RZWGZI"$TsAn7m=W1TNJQ&UZSJUMfgG(G9sKnG/7Lkgi!Ek%@(
+W1&'_L51feP5^U?OSk1=OSFn6OSP"=OSt7?NW>(;N;AM9N/EIKr.k3)p4`9prIt$$s+UH*re'ru
+re:B*!/(3#s*t*!rIFlu"G22UIt.?ErI=fq!e#HEpNusfrHnTlrd+Eds*FZiqf`*dH$]F7r-AEi
+G^912r-A9dr-@s]s*Ocnqg/BjH[GR7s*=EdrcnNjHiA?iHiSTlI/\O!I!pElIXcitqLABms*sut
+oR[$ordt3(r.Y0*s+gT0",`"pN;\b7O84q8Op.&6Q'@Q!rg*SL#*tUAQ^F20rgE_R&Y"`-I!U-a
+GB.M;Dej!'G#_Q<<rH+u=SQ%r>5hS8=ie[,QFF<2\$rfR['Hp?USIdaqSrZYaiaP)!6k;b!71Ac
+r6GDhbl5cfb0.rMqof#`pWET[ao$/XErU4YFT6L`G5c^cGlN'gH3/G@I/\NpIXh?ICk71jK7nr4
+L5(J>M2I4MN/`jYO-,TgPEhE!R$a;2S"6.CTV8*UUo(&gWN*#$Y-5(8Za@0L\@K2`]tV7t_Sa@3
+a2lBGbg"G[dF-Lne^rF+g=tE=hVd>Nj5]4_k3(smlKdg'mI'H3nF?MK!V>s_o`Fj]p\jmeq>^<h
+qu6NlrUg)?s+14's*t~>
+JcC<$JcEdjnG`=`rVZKgrVHNhqtU0brq?9_rq-6^r:9jWs7$!U"KSW,XJl&o8uJYfVkg&YR@';(
+OcYW%;c-HQio/kSi8<DJh;-l@g=k64f@SU(eC;sqdF$=ecHXSVbK@oIa2Z*:_ns7*^V@Ip]Xt_b
+\@/iRoR[!ls'@?XEc#H!?=72N<E=TsH?XIQDeiur@piPG>@V2RAS#OfBP1t<?%d<CK7[oWF*;j,
+I/&'gI/83dHMr3iHMr-cGl;paGQ<$bGQ;seG5ZR`F9$I_F8U.ZFng(NFT?O^F7F;NE<U<"DfBW6
+rbqgUr,2UTDuFSODuFYRDZO`oq/-1Lq/-4MDYn;ND#\8OCi0,es)%aQqec=Ks(qaRrGDLNrbq7C
+qeu7Irb_UO!cMsoq/?:PrbhRN!-%gRrc%jTrGVaVpMg+Os)@pVrc7sV!-.mVs)\*[s)n6]rcS6b
+s*4QhrH\KkI//3jIf"QgIKG"LJGt,sK)UB(I;s6*D[L;pARoC_@q94P<V]\o=8c7r=oDP&;?'Jm
+PlY99rf%5CMi3IMLk^Y3I/T!$Q2[!KQ'V$/qO%>PrgWhSs-`bO!1*PLrg<AFr,M^Vs)\*[s)n?b
+rceBes*=Ti!df<Brd=frJ,Xt7JV&N,KS>,7L51SAMMmFPNK0'\OcklkQ'IZ&R$jG5SXuIHTq\?Y
+VPgAlWiN8)YHY==['mEQ\[oGe^;%M$_o9U8aN;WLc-F\`daQ^rf@S^0gYCWAi8ESSj5f@bkNM0q
+lg4!*mdKW6nc&([oCW%T!quB_rV6Egs8)Zjrqu`no_sFAJcFF'J,~>
+JcC<$JcEdjnG`=`rVZKgrVHNhqtU0brq?9_rq-6^r:9jWs7$!U"C,5??X*J3%U*+C?XR8J>Zt<6
+=BAO(r^Ah:j5T%Vi8EMLhVI#CgY1B7f[na+e^W*tda?Ihcd'eZbKJ&LaN)<>`5BI.^q[Xt]Y(ke
+\[])V[Jj,&;ZB\m<#d;90/bXA0.SS*0/b^Q5<V+j3]K&U1b^U8/hSpY1D)H$1GpsG:,=gl1e^\B
+:Jk(hr)EYos&/ems&/emohkfh<;ohm;ZB\q;Z0Po;Z9Mr;H$On;Z'Al;YO&f;Z9Mn;Z'Jl;?p&q
+;,U:j;cNBh!E<"q;$9]k:Japf;#X>l;#a;k;#X>k:]F8k:]F8j;><ua;?'Go;,C'[;#X8j:A[id
+:&n)e:B+,i;#F2i:]F2h:B4/c:]4&_:BF?i;#!i_;#X8g;#a>h;#*ri:esmc:]OA_:]jKg:J^pc
+qbdAirDEPlr)*Gk!Du\h;#jGi:BjWk:Jakb;>jDc;tX/i<;BGm<;KMo<)``l$WBnr9hS2Q91hTP
+<V]\o=8c7r=oDP'5lO%S<E)F[:f'qar_Whs;,L4`9)Vog<;fhq<;]`!<)Z^p<W#ns<<,ts;ZB\o
+<;oku<)`]or`/nrrDW_qs&8i8rc8$[r,hs]s*"Bcs*4Qhrd"WmI!kpA!IfOtJ8BdgK7ei2Knb>;
+Ll%"IN/WaVO,oEdP*;/rQC+&-S"#t?T:hmPUnjlcW2ZetXfek3ZEppH[^`lZ]Y2%o_8=+/`Q-'A
+bKS5Vd*^:jeCE1&g"P39h;7)JiT&tZk2tjjl0@U$m-X60n*olHncA@Srq-?dp\4X]s7u]kr;6Kk
+rVcBfJcC<$g&HR~>
+JcC<$JcEgkn,E7`r;?BfrqcThqtU3crq?9_rq-6^r:9jWs7$!U=RPPClfdEiio9"WiSNDDe'5tM
+^:C\ZZa$^:>$+j.iS`YOhVR)EgtUQ:g"=p.f%&:"e'cXkd*L"^bfe2PaN2EA`Pf[2_SEq$]tD"i
+\[f5Z[^EK1R@*l<s-WbO21985S</MXH%(?sBOn->Un3s@P)bEUJphlhG_1O#KnG,6LPLc"Ocm\C
+h0OL%LP_+TOckn*Ont1;O8b79O8=t7OT:LAO8k4?NW"h4N<G2uMM[/eL])u$L%p?#L%g?%L&Qc)
+KD1'!L&Q`*KDgB#J,k)tJGas"J:E(GIf4a"IXQWlI!ta:!.4Zls*F`lq0E!drd"Bb!dK$;rH\Bg
+!IK.fGl;pdGl;p[H2r<kI/SEkH2r<eHN/9eHMr-hHiJBlHiAEmIJ\EkIK+]pIK+fsJGOcmJ,k)s
+JFnEmK)^H*KS>,5re:B,s+gW1s,$l9N/[aq!07&>!0I#=rfRAGP*;+.Pl6jOPa.Q#Q^=*;RJrZS
+Rh(j:I!g6aG]dnADe`s"QW<i^rE&r"pK@Gu!F&b,<tSTVaF'Pf[^NZS[^EKJYcsmtrhTV7qSrZY
+aiaP)!6k>cs3LDcr6GAfrQG,]nB:fMr,M^Vs)\-\s)n?brHJ9d!."Qis*F`nrd=frJ,Xt;JV&N,
+KS>/8LPUeDMMmFPNK9-^OckomQ'Rc(R@9V8St;UKU8+N\Vl-MoX0&M-Yd(OA[C3TU]"G_j^VRe)
+`Pom=aihoQcHstee'uq"f\,!5h;-rGi8WeWjQ>UfkiqBum-O--n*fc9o()DDo`"Lbp@n=\q#C0i
+qYU0hr;HTdrdk*#s4RF&~>
+JcC<$JcEgkn,E7`r;?BfrqcThqtU3crq?9_rq-6^r:9jWs7$!U"n&LrY,eK"VG*qfWi;tpUS"$C
+Q^!VoO,f3Z;Gg:hiS`YOhVR)EgtUQ:g"=p.f%&:"e'cXkd*L"^bfe2PaN2EA`Pf[2_SEq$]tD"i
+\[f5Z[^EL<JHC@QJc1*>>uu8kCh7$[?XdJG<I]@@GB@nECM.3g?X$c?@q>RM!,2@E$ttW;EfP:E
+Ci=<8GC0:9p3Zacr-S9dr-SHir-A-`rH[pXrc\6_rcJ-\r,hp\piQ.N!-J0\noF_L")r0sE;XYS
+E;a\VE,T[nDZ"GOE;jeUD?+VOD?+PLDYS)KD#\8OCi0,es)%aQr,)FLqJH.Js)7@DqJZ1Irb_UO
+s)7pTq/6@SDf0IhDuXeRDuO_TDuO_UEVOMOE<'tUEW:%ZEW0nWEVa_UF8U+[Fo-:\FoHUbGR&M?
+H?jg`H[PX;"+GZHI/SKgIK=qKrIOitrIYW3Ec>u9DJa-$An>L`@XhDR<rH+u=SGts=o_e+;?'Jm
+PlYEBrf%5CMi3IMLk^Y3I/]$(Pl-gGPQ@&9o9fBB!1NnVr0dVRqO%;KrKmMNpQtkur,M^Vs)\-\
+s)n?brHJ9d!."Qis*F`nrd=frJ,Xt;JV&N,KS>/8LPUeDMMmFPNK9-^OckomQ'Rc(R@9V8St;UK
+U8+N\Vl-MoX0&M-Yd(OA[C3TU]"G_j^VRe)`Pom=aihoQcHstee'uq"f\,!5h;-rGi8WeWjQ>Uf
+kiqBum-O--n*fc9o()DDo`"Lbp@n=\q#C0iqYU0hr;HTdrdk*#s4RF&~>
+JcC<$JcEgkn,E7`r;?BfrqcThqtU3crq?9_rq-6^r:9jWs7$!U"R]W*@:&n89Nte/?t!JO?<^T:
+=]\X(<E)sd77B])i8EMLhVI#CgY1B7f[na+e^W*tda?Ihcd'eZbKJ&LaN)<>`5BI/^q[Xt]Y(ke
+\[],W[C#p3r_i_oqc"C\0fV'I0.\P'/M8n<5sILo4$#8Y1c-p?r\"4+">hnk1Go(g#Z!?A5XnpQ
+;GmElrD`\ns&/emr)*Mlohkcgr_rkrqGR8j!)ibo!)ien!)iep!)i_ls&/Sgr_`ep;H!EkrDEkt
+:f1+g;c?Zf<<?,u;Z0Gq:esk`;>sDl;>sDl:B45j;>sAk;#a>k;#X>e;#4&h:]aKj:\.E_:]=,e
+:]4#g:]!lg:Jamc;#jGl:]F2i:]F2i:B4/g:]4&^:]F;e:\moe:]!ug:]4,b;>sAj;#aD_;#X8g
+;#=)i;#F2j;Z'Dj;?0Ph;#jGf:]=2j;>jDd;ZKei<W?%g;u]f#<Du[i;,@0f#>@c`8kDWL<V]\o
+=8c7q=oDM*><kIQ5mLCh7nZZT:Jh$f"]A2p;G'R\=TDCr<;fhq<;]`!<)Z^p<W,ts<<,ts;ZB\o
+<;ol!<)Z`o<;ons<;]\p<;pk7EW1"YF8^4\FoQX`GQ2mfH2`-iHN8HmI0"eHrd\s=JqJ]/Knb>;
+Ll$tGMi<USO,oBbP*;,qQC!u,R[]h=StMdOUSO`aVl?\sXf\e2Z*UgF[^`lZ]Y2%o_8=+/`Q-'A
+bKS5Vd*^:jeCE1'g"P3:h;7)JioB([k2tjjl0@U$m-X60n*ol<o(2JFrq-?dp\4[^s7u]kqtpBj
+rVcBfJcC<$g&HR~>
+JcC<$JcEgknG`@ar;?BfrqcThr:p9crq?9_rq-6^r:9mXs7#sTs6_&tmd'&sj5]4\io&_Lf$VUX
+^Ugk\Za$^;XfSR+=BOM=hYu=cgtUQ:g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pf[2_SEq$^:_+j
+]",>[[^EKKR$dQ5s(a6VQ]?iMIsur`Bp,KqURms@Oc,'PJUD`fItE6+L5:S=M2SudZ]q&ZGC"dn
+M2hIrs-!ADpQ5?7rfHo9q2kK9!0I/?s,I)=r/CN4"H87sMMV.breC<(!/1<)pk8X#pP/^%re19'
+pOrR#re(9(rIOru!.Xuuqgeg!It.?ErI=ir"+>QFIJ8*hHiAElHN8BfH2i3jGlW*eG6<)8H@#R9
+r-A?gq0;g_rcn?dom6Xbrd=]lrd+Tkq0N'dqKi*c!IB+lHMr3kIJ\EkIK"TqI=?\FJGOcgJG"Kn
+K)^H-KS>,5KS>-ZLB!#9Ll%"HMi<USNK0%uNuX7DOHGWeOHGZgP*(liPE_8pPa.JuQ'@Q!QBmm:
+Qi`\CRJiTQRgtmBI=-BgGBS"CDf9<'E;<Q5=8c7r=o;J'>6%h*<t\ZWaF^4s[^NZS[^EKJYcsmt
+V>eL2`ra?(b5BE_bko]cch>``cN)5gbP]NQbPuM[E;X_UErL.YFT6L`G5c^cGQ<$gHN/<lI/\Np
+IXh?IDh3LmK7nr5L51SAM2I4MNK0'\OckllQ'I]'R$sM7SXuIITqeE[Vl-MoX0&M-Yd(OA[C3TU
+]"G_j^VRe)`Pom=aihoQcHstee'ut#f\,!5h;-uHi8WeWjlY^gl07L!m-O--n*fc9o()DEo`"Lb
+p@n=\q#C0iqY^6hr;QZdrdk*#s4RF&~>
+JcC<$JcEgknG`@ar;?BfrqcThr:p9crq?9_rq-6^r:9mXs7#sTs6^0[Ycb"(VPgDmri-^4V4sNL
+R$EhrO,f3ZN/NTm;,Z?0hYu=agtUQ:g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pf[2_SEq$^:_+j
+]",>[[^EKKqLSKns'IC#E,&oj@:*GF=)i_<H?aOOD/*Zo@p`MH@Uit^B4tskBkiZ5Jol0gC2Ip1
+G'Wt4p3Zacr-S9dr-SHir-A-`rH\!Z"F569G'<h,s)e0[rcJ*]pN6(N!-J0\noF_L")r0sE;XYS
+E;a\VE,T[nDZ"GOE;jbWDJsIiD?+PLD?4TlqJ?4KrbDLNrG;IMrbhXNrbVFJrGMUQmr%u?q/61K
+rGD[TDJo8gs)A!Uq/67PqeuIQrbqdTrc.^PpMg4SEW'kPErU4ZF9$I[F9?Z/GBa%2s*F]j$@7&G
+I!pBjI!pBirdFforI+Hi!IoXuJc(,rK+3$DDfBT2CM@BnB4>C_q,[GqrE/htr*',)r_`\ls-3V!
+J,YE:N/NUOMMR"AI!gj9PEc!1rfdGKQh-U@R/i]TS,A]TRJN<NQMm0LR/!$JDuO_REW:(YF8^4\
+FoQXaGQ2mfH2`-iHN8HmI0"eHrd\p<JqJ]/Knb>;Ll$tGMi<XUO,oEdP*D5sQ^F//S"-%@T:qsR
+UnsueWN*#$Xfnt6Za@-K\@K2`]tV7t_Sa@3a2lBGbg"G[dF-Lnf%8R-g=tH>hr*GPj5]7`k3)!n
+lKdg'mI'H3nF?)?oCV\So`Fj]p\ssfq>^<hqu-HlrU^#>s+14's*t~>
+JcC<$JcEgknG`@ar;?BfrqcThr:p9crq?9_rq-6^r:9mXs7#sTs6^!V@UWO@=V4kD?=75O@:3AF
+>$+j,<E3!tr`'+j7Rl=nhYu=cgtUQ:g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pf[2_SEq$^:_+j
+]",>[[^EKK;cEZnrDWVn)FHqQ2)-d9.kE842EO2h4Zkbd2`<KK0eY.3r\FL1!&aa4"u]433'K)k
+r_NYo<)WTmr_r_m"&Vlk;>a>l;tj2i;uTbm;YX/j;Z9Mn;Z9Sp;Z'Dk;YX,d;Z'Jl;Z9Pm;?9]q
+oMkrl;c<Qk#uFDn:f1%b:f1*h;#a;k;#X>k:]F8k:]F8j;><ua;$9]m;,:!Z;#a>k:A[id:&n)d
+:'+3f;#F/j;#X8j:B+)i:AI]a:A7Nc:f1'a:\moe:]+&h:]+&b;>sAi:]OA_;#X8f;"[Zc;Z'Dj
+;YX)h;#3rj:/=Y^;#X>j;Z'Gs;H$Il;cNBh!*&Jes&Aqs!E)_l:^9ci9hS2P9254_rE&r"pf[Mu
+s'#Lg5lO(L<<Yld:f'qar_Wu";,L4`8m,%i;u'Dl<W#ho<<H3!;cNZqr`&tu;uT\p;uK\q<W?%u
+;uK\p<W5tq;Z]p:DuO_REW:(YF8^4\FoQXaGQ2mfH2`-iHN8HmI0"eHrd\p<JqJ]/Knb>;Ll$tG
+Mi<XUO,oEdP*D5sQ^F//S"-%@T:qsRUnsueWN*#$Xfnt6Za@-K\@K2`]tV7t_Sa@3a2lBGbg"G[
+dF-Lnf%8R-g=tH>hr*GPj5]7`k3)!nlKdg'mI'H3nF?)?oCV\So`Fj]p\ssfq>^<hqu-HlrU^#>
+s+14's*t~>
+JcC<$JcEjln,E7`r;?EgrVHNhqtU0bs7ZB`rq-6^r:9mXs7#sTs6fmR(?suAjQ>OaiSiYHe'#bH
+]XG2QZ*1@6ri61$>$+j.rnT?bgY1B7f[na+e^W*tda?Ihcd'h[bKJ&MaN)<>`P]R0_8!b!]tCtg
+\[],W[C!9GR$dW7rbMOK/89fdIXZi\Br\21Tq.R;PDt<OIsQBaJV&W0KnkA;Ll8m@P/N=9H[UO%
+M3%Rsrf[;DpQ5<6s,d#:plPN<"H\b.OHBI&s,R,=rJ^W5"cS@tMM[/eL])u%L&$E#L%g?%L&Qc)
+KD1'!L&Q`.K7SQ(JbjorJHURUJ:N.GIf4crIKP"GI=:^7s*OclqK`'ds*4Thr-&3eH$]I8rH\Nl
+H?o=2rH\?dr-@s]!.4]mrd4Ti!.4Kes*=HercnZnH[C'bHiAEmIJ\EkIK+ZsI=?ZqrIFfqoRQXd
+s+:6&!JH1+K`?c+LAlu.M$8cpMi<XTrf7#>q2kW=!0[>D!0[;Es-3PKs-3PKs-<YOrL!VQrL3bU
+rL+4[IsuZiH$F@HDf9?&DKYhWrE&r"pf[MurEK8&#$K$gM6"+prO*'@['Hp?USGfI`l@nrs2Y5_
+b5BE_c25fdch>``cN)5gbP]NRb5cGZDuXeREW:(ZF8^4\FoQXaGQ2pfH2`*jH[Pg@!IfOtJ9-9n
+K7ei2L5(J>M2I4MN/`mZOHG]iPa.Q%R$jG5SXuIHTq\?ZVPgAmX/rG,Yd(O@[C3TU]"G\i^VRe)
+`Pom=b0/#ScHsteeC<($f\,!5h;-uHiSrnYjlY^hl07L!m-O--n*fc9o()DEo_%nNp@nO\s7u]k
+r;6KkrVcBfJcC<$f`-I~>
+JcC<$JcEjln,E7`r;?EgrVHNhqtU0bs7ZB`rq-6^r:9mXs7#sTs6fpS'X4^=VPpMpX/`5$Vk]lR
+R?j%uNfO*urego:;Gg:hrnT9`gY1B7f[na+e^W*tda?Ihcd'h[bKJ&MaN)<>`P]R0_8!b!]tCtg
+\[],W[C!9Gr.4]p!a]5@r`oM6ra-FM<`ss%H['^UEc,W'ARf"O>@V/UAS1pS%;9I9H#epeX_hur
+FEi--I.r!dI/J?fHMi-gHN&0jG^'(1rH\!Z"F569GBWq-s)e0[rcJ*]pN6(N"E\^*F*$nmrc&9a
+DJsK4Df0K3E,bbo!H;uTDZ"GOE;jbWDJsIiD?+PMDZ=PRDYe2QChmg&D>e;ND>nGMD>nAJD>nGP
+DsqT?Du";MD>eAPDuX_NDZarsDJo;hs)@jRrc%jTrc%gUr,;[VE:n5LDuanSErL.ZFT6L[FT6Oa
+GQ2pfHN&0jH@,I8!e#HErd=]npjW6m!.b'"r.=`s%toIRE,]`5D/*ZoB4PL_B)>X-=8c7r=o;J%
+>6%P";#cd]D2%qJs,.5AM26n@I!h-APa)*2rfdGKQh-U@R/i]TS,A]TRJW?QQ^3s9Qi<BJQN1q&
+DuXeREW:(ZF8^4\FoQXaGQ2pfH2`*jH[Pg@!IfOtJ9-9nK7ei2L5(J>M2I4MN/`mZOHG]iPa.Q%
+R$jG5SXuIHTq\?ZVPgAmX/rG,Yd(O@[C3TU]"G\i^VRe)`Pom=b0/#ScHsteeC<($f\,!5h;-uH
+iSrnYjlY^hl07L!m-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$f`-I~>
+JcC<$JcEjln,E7`r;?EgrVHNhqtU0bs7ZB`rq-6^r:9mXs7#sTs6fpS&n50N=]o!8?XR>S@UWPI
+>?P$.r)EVpr^?fVrnTBcgY1B7f[na+e^W*tda?Ihcd'h[bKJ&MaN)<>`P]R0_8!b!]tCtg\[],W
+[C!9G;c?Tm;uBVo74q%s6n^&@/1rk?5<qCq4$#A\2`!3B0J4q51,^pF2)@*H2GQ:q5Y"sT;H$Fk
+;Ya;l;uBMq;,C(dqbmGmpeq,jr_rkrqbm2fs&/ko!)iep!)i_lrDNDfqbmAkrDNVlr_`bq<:j/l
+<)Z]n;$g&p:Janb:Jancr_WVj!)WYlr_NPjs%iYks&&MeqG@Al;,L+bo2,H_s%`Ger_<GhqbI/e
+s%rVj"Ahli:/:da!)EAdr(cu^!`2`jq+pi`r_NDfs%iSiq,%,gr_NMis&&;_r_NGgmSWs]qb[Gl
+;,L0d:]F2i:]F8k;>a>j;uT\o;tO&i<:Wue<<#r2<)lq!;bp4f:fC7f9h\5Q8k;>H<rH+u=SQ%s
+>5_\*5lX.M<<5ZdrD<Jj#uXVt;G'P[;H$Ni<;onq<;]bq;ZKhq<rQ)$<)Z[mr_rbps&B%ur_rbp
+r`/qsrDN_rDZ4SSE;OYTErU4ZFT6L`G5c^cGlN'gH3&A?rd=frJ,Xt>JV&N,KS>/8LPUeEMi<US
+O,oBbP*;,qQC+&-S"#t?T:hmPUnsrdW2co"Xfnt6Za7'J\@K2`]Y;.s_Sa@3a2lEHbg+M\dF-Oo
+f%8R-g=tH>hr*JQj5f=ak32'olKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`no_sFAJcFC&
+J,~>
+JcC<$JcEjlnG`=`rVZKgrqcWiqtU0bs7ZB`rq-6^r:9mXs7$!UrpKgRs6LKajlP[fjl>@Ygss]k
+_S*FcZE^U:Y5YL%WB$oS=]ee^gtUQ:g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Poa3_SO"%^:h1k
+]",>[[^EKKZE]dapm:tq05>38BP(k*JnJbsW2?8WR[B+pKSY/)H?OpmKS5&7KnkMB]W@<hW-E`@
+KntbPP5LIAP5g[=OSk1>OS=h3OT1I@OT(=@NrG%;N;JS7N;e_9M2;(brJ('#q1S^#pP/^%re16&
+pk8[$re(E+JUi<&qgeWr"G22TJ:IEErI=ir"+>QFIJA0iHi8?lHiJEgH2i3iH2MmdGlN*hH2`-i
+HN8BfGl2jcGl;p[H2r<kI/eQkH2r<fHN/9eHMr*iH@,X;rHnTnqgABkrd4cqIXh<Hqg\6gp433q
+rIb-(re1<*s+^Q/reUl;Mi3ORNK0%uNrb?'qiCi@P5^UBOoU^FPQ7!JPlI!KQMm0MR/`TRRfAlT
+RfAidKmnDrH?XROD/X6'Cj#YVrE&r"pf[Q!r*02+r`B-@"-Kmu\,E`B[C!6DYbRu4`Q#ppa8a3]
+aiaP)!6tDdrm1>cr6GAfrQG&[p<3DPrbqdTr,MaWs)\-\s)n?brc\EgH$TC8!IK4nI;s^cJ:N3&
+K7ei2L5(J>M2@+JN/`jYOHG]iPa.Q$R$jG5SXuIHTq\?YVPgAmX/rG,Yd(OA[C3TU]"G_j^VRe)
+`Q#s>b0/#ScHsteeC<($f\5'7h;7&IiSrnYjlYail07L!m-X60n*ol;o()DErq6<b!;HHes7u]k
+r;6KkrVcBfJcC<$f`-I~>
+JcC<$JcEjlnG`=`rVZKgrqcWiqtU0bs7ZB`rq-6^r:9mXs7$!UrpKgRs6KoiW2ZesXT#7,WhlAY
+R?s,!NfO*urepc52Mk@0;Vg-_g=k64f@SU(eC;sqdF$=ecHaYWbK@rJa2Z*;_ns:,^V@Lr]Xtbc
+\@8oS['R'Crdjlqs'Gb4rEU:G>@Cu@<e#LDG]\%JChdKl@UEDFAn5IaB)ZHCBF9`JFE`=OD/jW@
+H1u^\Hi8?iHNJM=H2W'eHi/3iGlW*gGQ)jcH1Q:\H2i'gG5ZR`FSp4ZFT$@VFS0bZFE;JDF7OAN
+E=$Q$DfBW5DJsH4rGV^T!,qdQr,;OQrbhjUDf>Ji!,_OL!Gu`OD?"GPCB86grG;LNrbhUMs(qOK
+rGMUQmr%u?q/61KrGD[TDJo8gs)A!Uq/67PqeuIQrbqdTrGh^Ro5XbK!-.pW!c`7$rcA'\s)n3\
+rc\<cs*4Qis*=Wj#((`EI!^6frd4]ord=ZmpjN6nJGk&tK)(&tKE-2pE!^E!CM.6kAR]1^r)Wbt
+rE/htrEB,'s'5P"s-3V+M>`G6M[G>uLk^Y3I$9bYPl-gGPQ@&9nsK<B!1NnVr0dVRqj7GOQBqK9
+rg<SLrGMUQrc%dTs)S-\rH/'^s*"Bc!dK!9rd"TlI/\P6IXcluJV&N,KS>/8LPUeDMMmFQNfT9a
+P*;,qQC!u,S"#t?T:hmPUnjlcW2co"Xfnt6Za@-K\@K2`]tV7t_Sa@4a2lEHbg+M\dF-Oof%8R.
+g>(N@hr*JQj5f=akNM0plKdg(mdKW6naZ2@oCW%Ts7QHerV6Egs8)Zjrqu`no_sFAJcFC&J,~>
+JcC<$JcEjlnG`=`rVZKgrqcWiqtU0bs7ZB`rq-6^r:9mXs7$!UrpKgRs6LJ*=]o!8?XR>SA7AkM
+>?Y-/<)Z^p<;]`T<)Z4T7bukSg=k64f@SU(eC;sqdF$=ecHaYWbK@rJa2Z*;_ns:,^V@Lr]Xtbc
+\@8oS['R'Cr)<Jl,"+jf6UX:06UE@X2`<lb4?Ybe2`EWN1GLO9/i5=@1Gh!Hr\Y$X3'8uj:Janc
+;c<?hs&8hn"&Vlk;>X8k;Z]io;>O/j;uT_r;u'>f;uTYq;,[Bl!)i_lrDNDfqbmAkr)3Plr_`er
+<)iNj!`W)rrD<kt:JXea:esnb;>sDl:B45j;>s>k;#X5j;#X>d;#4#k:f1(co2,E^s%`Ger_<Gh
+qb@,er_WMir_NPhs%iYiqG7&bpJ1ie;,I'aq,%&dr)!Dhr)!2dr_NJh!)`8_r_NDfmns$]r_`Vj
+s%rbmqbR5er_NPjs&&_mrDW\nr_ieroi1uknl,Nes&K(us&K&!s%j)#:f:.f9hJ&O8PDPM<rH+u
+=SQ%t>5VV)>R!GZ5ZLfV:]4,h;$g,t;,U"Y;c6Omq,I>nr)ESor_ierr)Wes##nN!;H$OnrD`es
+!*&qrrD`brs&AqqrGMUQrc%dTs)S-\rH/'^s*"Bc!dK!9rd"TlI/\P6IXcluJV&N,KS>/8LPUeD
+MMmFQNfT9aP*;,qQC!u,S"#t?T:hmPUnjlcW2co"Xfnt6Za@-K\@K2`]tV7t_Sa@4a2lEHbg+M\
+dF-Oof%8R.g>(N@hr*JQj5f=akNM0plKdg(mdKW6naZ2@oCW%Ts7QHerV6Egs8)Zjrqu`no_sFA
+JcFC&J,~>
+JcC<$JcEjlnG`@ar;?EgrVHNhr:p9crq?<`rq-6^r:9mXs7$!Us6fpSrTkTgk3(mhjQ,=Wf[7gY
+^:1MVZ*:F7XK/D%WMl\jUnmuls4T0[f[na+e^W*tda?Ihcd'h[bKJ&MaN)<>`P]R0_8!b!]tCtg
+\[],W[C!9GZ*9U_qNh2JrbF*#Bk_6nAn>RcAZDZ)TUD47NJiODIscNcJ:iK.KnbA<Ll%I]]StWm
+I=I$.OT(F@OoCODOnXt8O8k=9O84n;Oo1=>NrY4=NW4t7N<"q:MZSclM#E,-LA-DtK`6]!LAuu,
+K`-Q!K`6])KEQmXJ:W:KJGk$%Jq8H&J,4WmJ,as"I=-Hkpj<'grI"Wls*FNes*FZirHJ9d"F5<>
+H$T@7!df6=q0;g_rcn?dom-Ubrd=]lrH\Hjpj2scqKi-d"aYNBH?sr;HiSTlI/\QnHie_FJ,Fip
+J+eBoIt3(CJc13%KSBAXs+UK-s+gW2s,$i8N;eh:NrP.@OH9:#qiUi?s-*AFs-<VMrKdSQR@4#B
+".PaJRJrZSRgkC,J9u]fF`M;=C2%ILr`8u!rE/htr*'&'r*98's2Y2-rjVj7$FR7IYcsq!`Poj:
+qoA`X!6P,]!6tDdrm1>crQbMibl,`[b5'6YDZ4SRE;X_UErU4ZFT6L`G5c^cGQ<$gH3&A?rdAR2
+It3'#JqJ]/Knb>;Ll%"IN/WdXO-#NfPEhE"R$jD4S=Z=FTq\?YVPgAmWiW>+Yd(O@[C3TU]"G_j
+^VRe)`Q#s>b0/#Scd:(feCE.%f\5'7h;7&IiSrnYjlYail07O#m-X60n*olHncA@Srq-?dp\4X]
+!;ZWjr;6KkrVcBfJcC<$f`-I~>
+JcC<$JcEjlnG`@ar;?EgrVHNhr:p9crq?<`rq-6^r:9mXs7$!Us6fpSrTk,rWN3)$X/i>&VkKZM
+Q]mPmNrG%:MuSYpM26qB;,L6Fg=b-1f@JL%eC2jndEp4bcHOJTb/q`F`l5p7_SX.(^V7Co]=PP_
+\$i]OZa-j?JV!WIs'Gb4rE]G-(L:6K>CV$GG]\"HCM79i@:*;FA7T7`Ac??BBF8ZuM0#V4D/jZA
+HhMj]Hi8?iHN8BjH2i3gHi/3iGlW*fGQ2pdH1Q:\Gli57GPu[`FT$:[FT$@VFS0bZFE;JDF7OAN
+E<0uqrGMdUDf9UnDuXbVDuFSNDuFYSDZXfpDt.]GD/T5fs(q^Ns)%^Ns)%aQr,)FLqJH4LrGV1C
+qJZ1Irb_UOs)7pTq/6@SDf0IhDZFbRDuO_TDuO_REVseLE<1#urGVaVqf2gZEcQ5BrcJ-^qfMj]
+rc\EgH$]I8s*F]l"akZEH[L2;I/\QgIfFrsJc:8sKD^B4Km[lZDfBQ/BP(gd@q're<rH+u=SQ%s
+>5_\'>lRY#PlQ%+NW4nAMM[.DL4"B4rfm>GrfdDKnX03A!1NnVrL3bSqj7GOQBqK9rg<VMr,2LP
+rc%dTs)S-\rH/'^s*"Bcs*+Nhrd"TlI/\P0IXcluJV&N,KS>/8LPUeEMi<UTO,oBcP*;/rQ^F20
+S"-(ATV8*UUo(&gWiE/&YHY:<ZaI6O\[oGe^;%M$_o9X9aND]McHjkbdaZguf@\g2gtgiEi8N\U
+jQ5Oekiq?tm-O--n*fc9rpg*]o`"Lbp@n=[p]1-hqY^6ir;HTdrdk*#s4I@%~>
+JcC<$JcEjlnG`@ar;?EgrVHNhr:p9crq?<`rq-6^r:9mXs7$!Us6fpSrTk5%=^56>?t*_Z@piSI
+>$"a(;c?Xpr)GjY;c?Xp77Kc#g=b-1f@JL%eC2jndEp4bcHOJTb/q`F`l5p7_SX.(^V7Co]=PP_
+\$i]OZa-j?;cH[oqc*Sa*CN7`6UX:.6UO1/5sILo4?>G\2Dd'@0.nk41,Llf2#fE@1bLpU7oW;^
+:fC7jp/D#jqbmAiqbmGm!)ibmr)3Pns&8tspepufr)3Mm!)i\k"&`&q;Ya2e;Z0Pl;ZBVn;?Bcr
+<:j/k;c<Qk#uFDn:f1%b:f1*h;#a;k;#X>k:B45j:B45j;>3oa;?'Jm;#jD`;#X8j:Adoe:B+,e
+:'+3f;#F/j;#X8j:B+)i:AI]a:A7Nc:f1'c:\did:]!ug:]4,c;$'Qi:]4)i;=RK^:]!u^;#jGi
+;>jDl;>a5k;,I*bs%`Sir_WVlrDNVnr_i\noi1uknl,Kd!*0"t!*/qt%9$)#:f:.b:/+AT8kMeV
+<rH+u=SQ%s>5_\'>Qd>X<E2Zh;#X>l;ZBVo9)V]a<;onq<;fes<;oer<;]er<<Q9";GpHj<<#qu
+<;ohp<;okt<;fbnDZ4SRE;X_UErU4ZFT6L`G5c^cGQ<$gH3&A?rdAR2It3'#JqJ]/Knb>;Ll%"I
+N/WdXO-#NfPEhE"R$jD4S=Z=FTq\?YVPgAmWiW>+Yd(O@[C3TU]"G_j^VRe)`Q#s>b0/#Scd:(f
+eCE.%f\5'7h;7&IiSrnYjlYail07O#m-X60n*olHncA@Srq-?dp\4X]!;ZWjr;6KkrVcBfJcC<$
+f`-I~>
+JcC<$JcEjlnc&FarVZKgrqcWiqtU3crq?9_s7H?_r:9mXs7$!Us6fpSrTkNikNM*ljlPR]gX=6_
+^U^bYZEUO8XfJM&WMcShrM0Fgr`Cl,f@SU(eC;sqdF$=ecHa\XbK@rJaMu3<`59C-^q[Us]Xtbc
+\@8oS['R*DYcsL^r0RGL"`.siC2%G^AcQEAAg1\oA"8mOP`1EOJphoiGCbC#KnbD=LQ&j0Nm+/a
+I=Hp,Nr,";OoLUDOnb%9O8k=9O7JD1O8Ot;N;JS7N;e_:MM[/fL])u)K`Hf*L&$E$L%^9$L&Qc(
+KDC3"L&Zf0K7\Z)JV!]Krdk*$"+buQJ,=]nJ,XluI=-J;HiSNlI/eQnHMVpeHN&3gGQ2miH$Xd^
+rHeKj"+#6;H2DjbH2W!cH1cI`HiAEmHi/0iHhi!fH2;jcGl`5<rd+Qks*aclrdFcn!e#QJrIFfq
+omd*nJ:R?Ere(*$s+UH,#)A"kM2I1Krf-o;rK$i;!KiK@OT:RDPQ-jMPE_;sQ2R!QQ^F/.R@9QB
+RK/cSRf/]dQ%X[7I!BaSCiO?-CN!6SrE&r"pf[Q!rEK)&"'<RbTDl=u[L0FLZ`p[0UrC<m`r!gV
+a8j?Zb5ffacMl/ad/D8kcHQ71!m8X,qo\o]s2tAb!,_UNrbqdTrGhgWs)\0]s)n?brc\EgH$TC8
+DgQk[I=?WpJ:N3&K7ei2L51SAM2I7NNK0']OckonQ'Rf)R[]h<StMdOUSOcbW2cl!Xfen5Za7'J
+\@K2`]tV7t_Sa@4a2lEHbg+P]dF6Uqf%8R.g>(N@hr*JQj5f=akNM0qlg4!*mdKW6nc&([oCW%T
+!quB_rqQNhs8)Wirqu`no_sFAJcFC&J,~>
+JcC<$JcEjlnc&FarVZKgrqcWiqtU3crq?9_s7H?_r:9mXs7$!Us6fpSrTjRNX8]1/X/rJ*WM5uQ
+Q^!SmNrG"<N;\Y9M26ucLGMe*;V9UQf%&:"e'cXkd*L"_c-+;QaiMQC`Pod4_SO%&^:h1k]",>[
+[^EKKZa$a=JV!`Ls*k)X?XE_;s'#J/rEBh<>?Z2jEc>`)@q8qP?!ClOrau1D$tj=8EH..kJ8K7H
+G'W_-p3ZacrHnQjrd"Niqg89fs*4ThrHJ9drH\!Zs*=Wh!I&_dFoHL]F8g:[Fn^"NFTcf-EcZ<m
+ErU+\E,TXmDZalqDfGYns)7sVrGMOOrG_^R!H)iID?+VRDYn8SChmg&D/K8gs)%^Pr,)FLs(qaR
+rGDRPrGV.BqJZ1Irb_UO!cMsoq/6@SDf0IhDuXeRDuO_TDuO_SEVseKEVj\TEVskWEW:%ZF8g:\
+FoQO`FoHIdF`qqPGBj"1!.+EeqgAEl!IfOoIKG"LJGt,uK)1,tK`6Z+Jogp1"`A-kAS5TRAH,^/
+=8c7r=oDP&>PVM+:mI;or/L`7#)\7nL5()'rKR5FrfdDKnX03ArL<bSs-`bO!gf4=rKmMNrKdM$
+qelCOrc%gUrc8$[rcJ0_s*"Bc!dK!9rd&L0I!pElIXcluJV&N,KS>/9Ll$tGN/WaVO-#KePEhE!
+R$a>3S=Q7ETq\<XVPgAmWiW>*Yd(O@[C3TU]"G_j^VRe)`Q#s>b0/#Scd:(geCE.%f\5'7h;7&I
+iSrnYjlYail0@U$m-X60n*olHncA@Srq-?dp\4[^s7u]kqtpBjrVcBfJcC<$f`-I~>
+JcC<$JcEjlnc&FarVZKgrqcWiqtU3crq?9_s7H?_r:9mXs7$!Us6fpSrTk6a>$P?>?t*_[ARSkL
+>$+g);c?Xpr)N_ps&B"u!*&qe0%ee-f%&:"e'cXkd*L"_c-+;QaiMQC`Pod4_SO%&^:h1k]",>[
+[^EKKZa$a=qGdJn*C`Ic6UO7/6:4+,6UaC069@.f2`EQL0eb43/M]*\1_2H#1cA)d4[;S6:Jt"f
+;H*6f"B/2r;,R9is&&Yks&8qqr_`Sks&8qss&8_kqc!GkrDN\oqb[Jo;c?RlqGI5i!`MuprDWVl
+s&&bns&/nsoMkoj;Z0H#:esk`;,C%b;,L.dr_EMjr_`Yj!)WYj!)WYlpe^fas%ibo:f$[Zr_EMh
+qbR2ds%iPfs%iYkr)*Ghs%`Sis%`DdrD*&^s&&Sfq,%&dr)!DhrD<8dr_NMis&&;_r_NGgohb]c
+qbd>jr_`\l!)NPiqG7)cs%iYkr_`Vls&8nprDN\qp/M)lo2GE`s&B)#<W,r/;c$=h;,U4a92&)R
+8kW2crE&r"pf[Q!rEK)&"$fjd9DhWc;?'Po;?'8e;u'Dl<W#hp<<-"t;ZKhq<rQ)%<)Z[m;u9Po
+<<-"t;uK\p<<-"t;ZL\3DZ4SRE;aeUErU4[FT6L`G5c[eG^4T6H>e.XI=6QnIt3'#JqJ]/KnbA=
+M2@+KN/`jYOHG]iQ'IZ&R$sM7SXuLJU8+N]Vl6VqXKAY0Z*UdE[^`lZ]Y2%o_8=+/`lH0CbKS8X
+d*^=le^i@)g=k?<hV[8MioB+]k3(smlKdg'mI'H3nF?MK!V>s_o`Fj]p\ssfq>^<gqu6NlrUg)?
+s+14&s*t~>
+JcC<$JcEmmnc&FarVZKgrqcWir:p9crq?<`rq-6^rUTsXs7$!Us6fpSrTsRM!p]"5roFjRh:9`g
+^Ugk\ZE^X;Y,eV&W2HJgrM26EU8"EX=P)-SeC;sqdF$=ecHa\XbK@rJaMu3<`59C-^q[Us]Xtbc
+\@8oT['R*DYcsMmQi<9TI;,?gBPD,WAcuXQ@q90MA/gD_L4Xf!H@pg%KnY>;KnkP+Su@S(H[gR#
+M3.Rsr/q#BrfQu;n;m.%qiC]8!0$f7!0$o8s,$f4rJ1<*r.P-(re:3%rIss"s+UH*rIap!re:B*
+"bVDXJ:W:KJGt-"JcgRSIt.?ErI=fqrdFQhs*O]l!df6>qK`*ercnKgrce?drd"QirHeKj"+#3:
+H2DjbH2`'dH1cL`HiJKmHi86jHh_peH2;jdGl`5<rd"Qkrd4]oqgABkrd4cqIXh9Gr."Ejs*k$!
+p4<3qqLej&rJ(?.s+pl9Mi<XTrJpi;q2kN:s-!8Cs-3PKs-<eQQC!u+rgEbSrgEbSr1!_T%>]FZ
+I<g!VD/X6*BPhki=8c7s=oDP%>PVP(>lr)QVZ+('[Ka.HZ`p[0V#J=5`r!gVa8jB\b5oi3qp,2e
+p<`fb!RApfb5f]aao'9abKA#Nb5H2SDZ4SSE;X_UErU4ZF96T.G5c]2G^4R\H@(!dI=6QoJ:N3&
+K7ei2L5(J>M2I4MNK0']OckomQ'Rf)R[]h<StD^NUSO`aW2cl!Xfen5Za7'J\@K2`]tV7t_Sa@4
+aN2NIbg+P]dF6Uqf@S^0gYCWAi8ESSj5f@bkNM0qlg4!*mdKW6nac8BoCW%T!quB_rqQNhs8)Zj
+rVZWmo_sFAJcFC&J,~>
+JcC<$JcEmmnc&FarVZKgrqcWir:p9crq?<`rq-6^rUTsXs7$!Us6fpSrTsRM&*g6tX0&S-Whc8V
+Q^*\oNrG"<N;e_;MM[.FqhP0*/lUBQe^W*tda?Ihcd'h\bKJ&MaN2B?`PfX1_8*h"]tCtg\[],W
+[^<BIZ*:H`r.+cr"^Y5R>[:S5>l._+>[%,0)JWkp@p`PKAn,CaAnPagB4tIkIrqf0DK0`AnpL.X
+rI"Qjs*FZird+Efs*F]j!-nHds*4HeoQ^C]s*+QgG5cX`F9Q`-F)uGFr,qaUolUCZF)l>CnoFbM
+!cW'qrGMdUDf9UoDuO\UDuFSODuFYPDt@iHDuOYOD?"GPCB86grG;LNrGMRNrbVRN!,hdQrbh[Q
+mr&#@q/61KrGMXR!,hUNs)8$XDJo;h!-%gRrc%jTrc%dTr,D@LqeuOTr,VgWrc8![rH/-_FoHL_
+FoQXbGPZUbH3&A=qg86gs*afo!.Ffps*k$!rIOp!qLea"rIt9)$$L<,DJj6)An>ZTA,p3>=8c7s
+=oDP%>PVP(>lp9sJc(N-M[#&qLk^Y3I/T<.Q2QpIQLU@?R/i]RS,SlVRJW?PQ^7Q9"IPOCQ^@Yf
+qelCOs)@mUs)S-\rH&*`G'<k/H$FU[H?spbI!pElIt3'#JqJ]/Knb>;Ll%"IN/`jYOHG]iPa.Q%
+R$sM7SXuIIU8+N\Vl6VqXKAY0Z*UdE[^`lZ]Y2%o_8=+/`lQ6DbKS8Xd*^=le^rF+g=tE=hVd>N
+j5]4_k3(smlKdg'mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<hqu-HkrUg)?s+14&s*t~>
+JcC<$JcEmmnc&FarVZKgrqcWir:p9crq?<`rq-6^rUTsXs7$!Us6fpSrTsRM''`b/?t*_\An#(O
+>$+g);c?XprD`hsr_req!*0"ts&L^Af@JL%eC2jndEp4bcHXPUb/q`G`l5p8_SX.)^V7Co]=PP_
+\$i`PZa6p@YkqE!;ZeI'3^id2'1G8U6:=1-68g\W0eP%11,:[C2>o?;2Cp[K7p&Sc:]+/a<!#ur
+;Z0Je;ZB\q;Z9Pk;ZB\p;ufkm;Yj>k;Z0Mo;Ys>k;?Bcp;Ya2i;?Bcp;Z0Pl;ZBVn;ZBYq<:j/k
+;c<Qk$W'Vp:f1%b:f1(d;#X5j;#X>k:BXKi:Jame;><ua;$9]m;,C'[;#a>k:A[id:&n)e:&n)h
+;#O5k;#X8j:B+)i:B"#h:Amue:A7Nc:f1'c:\did:]!ug:]4,c;$'Qi:]4)i;=RK^:]!u^;?'Jj
+;>sJm;?'Jm:]=2e:]4&g:]F8k;>a;l;uT\n;u]hk<<-"h;ts>k<W#nt<=Mc%;,U:g:J4AT8kM`C
+rE&r"q-!Z"r*/u%s'5\+>tt5nr_`\ns&&egrDWMkr`/kqrD`hsr_iku<`T-"r`')#;c?Rmqc*Sq
+!`W)sr)<f!<)lmrrGDFLrbqgUr,MaWs)\-\!d/[0rc`X4H$O^^H[C-gI=?ZrJ:W<)K7nr5L51SA
+MMmFQNfT9aP*;,qQC+&.S"-%@T:r!SUnsufWiE/&Y->1;ZaI6O\[oGe^;%M$_o9X:aND]McHjkb
+e'uq"f@em4gtgiFi8N_VjQ>UfkiqBum-O--n*fc9o()DDo`"Lbp@n=\q#C0iqY^6hr;HTdrdk*#
+s4I@%~>
+JcC<$JcEpnnG`@ar;?EgrqcWiqtU3crq?9_s7H?_rUTsXs7$!Us6fpSrp9[Ns6BXKroOjShUg&n
+_7[7aZa-j>YH4b(W2KWkrhM?FU7n<VUnaYdeC;sqdF$=ecHa\XbK@rJaMu3<`5BI.^q[Us]Xtbc
+\[T#U['R*DYct;/Qi<:*KR[a/S<JbAAnGUdAn,:[A7]4\A7]@aBkh=-J:`E+KnkG<Ar*FU_3C@:
+It``?PEYj+r/puAs,m)<q2bQ9qN(Q9!0?o:qi:`;rf$o:qi(T7repf6!/^Z0r.b-'!/1?*qLng$
+p4iU$re16&qLng$s+CQ.Jq8H'Jc(&tJc:6'JUi6"qgSKnrdOippjE*grHnZnH@#F5s*FZi!dJp5
+rceEgq0E3kH?ja[H2DjbH2`'dH1cI`HiAElHi86jHhi!fH2;jcH2i6kH2r<kI/eWlI/\QnHiebH
+J,OoqJ+eElIfP#nJH1<$K)pXXr.P$'s+pZ2",`%rNW"n9O84n8Oo:IAPQ-jJQ'D95".#:?R/NEQ
+Rf/ZQRf8fSRLbF.H@1$]Ec>o6C2%R/=',?&q-!W!rEK&%rETG1Xo>g.[Ka.HZ`p[;V#J@0`ra?(
+b5BE_bkfWach,Qccd'c5bPfQ]b5]ZaaoH8VD>S5MDuO_SEW:(ZF8^1^F`qs-G6W;;H$Xd`I/\P8
+IXcluJV&N,KS>/9Ll$tHN/WdXO-,TgPa.Q$R$jG5SXuIITqeE[Vl6VqXKAY0Z*UdE[^`lZ]Y2(p
+_8=.0`lQ9EbK\>YdF$Fme^rF+g=tH>hVd>Oj5]7`k3)!nlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Eg
+s8)Zjrqu`noDX=@JcFC&J,~>
+JcC<$JcEpnnG`@ar;?EgrqcWiqtU3crq?9_s7H?_rUTsXs7$!Us6fpSrp9[Ns6:-ZXfSY.Y,eFm
+S!]M(O,o>#NW+h:MM_=gr.k3)/;I-QeC2jndEp4bcHXPUb/q`G`l5p8_ns7*^V7Co]=PP`\$i`P
+Za6p@YcdqTrdP;b?WMAlDJ*3Z>?Y50>6J,6>$4u,=oV\*>81@Q@qB4`AnPaWDL$AaH%BjPF*;iu
+I.hpdI/J<kHN&3hHMW!gHN/6jGl;jdGl2jZGlN'gGQ;pdFoHIdF*)JEFEIG'p2p"N"E\^*F*$nm
+s)A*ZDf5Ml"`A6sE,T[nDuahTDZ"GOE;OSMD?+PODZ=YSDYn;ND#\;ND>n>QD/O4hDZ+GPD#J5N
+DZ=SQDZ+MCDYe;IDZ4MOD?=`oDY\2QE,TW3qJZCQqeuIQrbqdTrGhaSp2TtK"`\R'EH6+!EW:%\
+F*)O#FoQR`FoHOdGBeCXrH\Eh!IK.iHi/9jIJnWpIK"]qJ,b&tJc:9#K)gN&KDgK&L&?T7HZF+E
+Df'9%AS,I_A7ntFrE/kur*'&'pg!c'!FCNYNW4n@MM[.DL4t$SPl-gGPQ@&8nX06B!1NbR!h,OF
+qj7DNQMm0MR/WEPD#J5JDZ4SRE;aeVErU4ZF96T.G5c[iG^4R\H@(&=I<0jeJ:N3&K7ei2L51SA
+M2R=ONfT6`P*2&pQC!u,S"#t?T:qsRUnsufWiE/&Y->1;ZaI6O\[oGe^V@V%`5Ta;ai_fOcHjnc
+e'uq"f@em4h;-rGi8WeWjlY^gl07L!m-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVc?eJcC<$
+f`-I~>
+JcC<$JcEpnnG`@ar;?EgrqcWiqtU3crq?9_s7H?_rUTsXs7$!Us6fpSrp9[Ns6:3\?=./RB4k^]
+>[(<2<)cdq<;fes<;ohm<%q<Q=&i3heC;sqdF$=ecHa\XbK@rJaMu3<`5BI.^q[Us]Xtbc\[T#U
+['R*DYct;/<;of%.k*242DQsR6iKCQ6U^o?"%5LC6iKFO5Qrbq0f:aEr\P-L6SL\i85;rY;,^=i
+;H$Nd<!-#q:f.-gs&&hqqbmDl!)ienr)3Mms&8tsq,7&fr_i\n!)i\ks&/kq!)iVis&&ns;H!Hl
+r)3PlrDEYp<:j/k<)WZl$W'Vp:f1%b:f1(d;#X5j;#X>k:BXKi:Jame;><ua;$'Qk;=[Q_:]F2e
+:]F2i:]4#k:JO\^;#F/j;#X8j:B+)i:B"#h:Amuf:A.K`;>O)`;#X8g;#a>i;#!oe:]=2j;=[Q_
+:]!u^;>sDj;>jDm;#jGk:B45e:]4&f:B45j;>jAm;uT\n;u]hk<<-"h;ts>j<W6#'<E)pt<Dufo
+;$'Ne:&[cf8jl`^rE/kur*'&'pg!c'!FAP!;#X>l;Z9Mn9)_cb<;fhq<;]_r<;oet<E<-!<rQ)!
+<;ohn<<#tu<<#nq<<#tt;ugb5D>S5MDuO_SEW:(ZF8^1^F`qs-G6W;;H$Xd`I/\P8IXcluJV&N,
+KS>/9Ll$tHN/WdXO-,TgPa.Q$R$jG5SXuIITqeE[Vl6VqXKAY0Z*UdE[^`lZ]Y2(p_8=.0`lQ9E
+bK\>YdF$Fme^rF+g=tH>hVd>Oj5]7`k3)!nlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`n
+oDX=@JcFC&J,~>
+JcC<$JcEpnnG`@arVZNhrVHNhr:p9cs7ZB`s7H?_rUU!Ys7$!Us6fpSrTsRMs6BUJs5t$ViRuT!
+_nNXfZa-j>Y-"_(W2KTjs.f^kU7qCW.FZ_mdEp4bcHXPUb/q`G`l5p8_ns7*^V7Co]=PP`\$i`P
+Za6p@Yck2.Qi<9WJpqI*R?E;WItIZ3,%>%mARf4\A7]@aC27KqB4tsjAnPXbB=>+1U;(u'JVT/F
+rKI,Ar/puAs,m&;qN(Z:qN(Q9rf?o;qiCc;s,I&;r/C]8rJL]6M>W/-LAZ`*K`6]%K`-VuLAuu,
+K`-Q"K`6Z2L4k54Jq8H'Jc1,tJc:6'JUi6"qgSKns*joppjE*grHnZnH@#F5s*FZi!dJp5rceEg
+qKi0g"F>?<H$T:3rd"HerH\'^s*Ocnrd4Tis*OQfs*=HercnNjHiA?iHiSTlI/\QnHie_GJ,Fiq
+J+eElIfP#nJcC?$K)pXXrIb0)re:`7LkpnEMMmFQNW"n9O84n8Oo1CAPQ$gHPm<P=QC!u+R@*i=
+rgNhUqO.nWJ:)ZiF`_S=DJ<g&Qrj5gq-!Z"rEK&%rE]D/!4Dg8rO*'@['R!@YGB+U`Q%eq!m&L+
+r6#)aqp,/dp!E`b!R8jebPfQ]b5]Zbb5Q5VD>J/MDuO_SEW:(ZF8^1^F`qs-G6)r6rd&7)I!pEl
+It3'#JqJ]/Knb><M2@+KN/`mZOHPckQ'Rc(R@B\:StD^MUSO`aW2ZeuXfen5Za7'J\@K2`]t_=u
+_SjF5aN;TJc-FY_daQ^rf@\d1gYL]Ci8EVTj5oFckiq?slg4!*rpL6anac8Bo^qhLp@e7Zq#C0i
+qY^6ir;HTdrdk*#s4@:$~>
+JcC<$JcEpnnG`@arVZNhrVHNhr:p9cs7ZB`s7H?_rUU!Ys7$!Us6fpSrTsRMs6BUJ'X"[DXJ_b]
+R$NnsO,f3ZN/W[QMM_:fs+^W0L\uo,L]<)Xe'cXkd*L"_c-+;QaiMQC`Pod5_SO%&^:h1k]",A\
+[^NQLZa$a=YH@eSrdP_l?<2/fCh7'`@U!#?>$G-5=^"s2=BSf*>7t%A=^"s1='/L\JTQ0uC2Is4
+GOBkYHN8BfHiAEjHN8BkH2`-iHN8HlHiA<lH$K:3s*4HeoQ^@\s*+NerH8-^"`nd,F*)O%FnTqN
+FTcf-EcZ<mErU+\E,TXmDZt#sE,]`6rGVaTrGMOOrG_XPoksbIrbhUM"`.siCi+%gC]J>LDZ+DP
+D#J5NDZ=SPDZ4SCDYnAIDZ=SPDZ=VTDY\5NDusrqDYe8OE;OSQE;jeTE;X_SE;";KE!C<&EcH)>
+ErL%ZEc_5%qK2d[rcS6a!-eBdrH\?fr-S?hqgANpI=;*DrdXrurdk$"s+:<'rIb*&re:3%$%I#8
+DfBQ/C1h2YA-%3^rE/kurEB/(pg!c'ra#S_r/L`7#)\7nL5(D0rfm>GrfdGKQgpI@R/i]QS,\rW
+RJWBOQMm0MR/`NPD#S;JDZ=YSE;aeVErU4ZF96T.G5c[dG^9:7BR>,TI=?ZrJ:W<)K7nr5L5:\C
+MN!LRO,oBcP*D5tQ^F21S"6.CTqS6WV5L8kWiW>*Yd(O@[C3TU]"G_k^VRe*`Q$!@b0/&TcdC1i
+eCE1'g"P3:h;@/KioB(\k2tmll0@U$m-Xf@$h3]Wo(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+14%
+s*t~>
+JcC<$JcEpnnG`@arVZNhrVHNhr:p9cs7ZB`s7H?_rUU!Ys7$!Us6fpSrTsRMs6BUJ'4PNdBOkLT
+>?Fs,<)Zar<E<+"<;ohm<!--$<E8us.FZ_mdEp4bcHXPUb/q`G`l5p8_ns7*^V7Co]=PP`\$i`P
+Za6p@Yck2.<;of*.4R)41bp^8/1s:V6ppr?!(6`P!^T.>r]pHI&O&HF5sRRs9K,*o8l/A];H$Nn
+;ZB\f;uooprD3Pm;H!KmrDNVn!)ienr)3Jl!E<"n;Yj>k;Z9Vp;Ys>k;ZBYq;Ya2i;?Bcp;Z0Pl
+;Z9Pm;?9]qoMkok;Z9Pn;#a;s:f1%b:f1(d;#X5u:f1(d:JXe`:JXe`r_`GeqbdAis&&>`r_EMh
+qbR2ds%iSgr_NPj!)ibmr_NPhs%iYis%iYir_NMgp.k`d;,I*bpe^udqb[;grD<;e!`2ZgrD3Jk
+nPK3\r)!)ar_WPjrDNYm!)WVis%rMerD*Ag!)WVkq,72js&B"u!*&hqs&Ako!*&_l!E<"o<;ons
+<WH.u<;oer;#X;q;GKnZ:/1^]!*B,$q-!Z"rEK&%rE]D/!)NMhr_`\nr_WYfrDWPlrDieqr)E_r
+r_ir"<`N.#rDiepqc*Sqs&B"srD`ess&Au6rb_LLs)7mUrGhjXs)\-\!d/[0rc\BfH2`,'H[L6i
+IXcluJV&N,KS>/8Ll$tGN/WaWO-#NfPa.Q$R$jG5SXuIITqeE[Vl6SpXKAY0Z*UdE[^`lZ]Y2(p
+_8=.0`lQ9EbK\>YdF-Lne^rI,g=tH>hr*GPj5]7`k32'olKdg'mJcP^nF?)?oCV\Jp%J+RrV6Eg
+s8)Zjrqu`no_sFAJcF@%J,~>
+JcC<$JcEpnnc&Ibr;?EgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!U!q,ICrTsRMs6BUJs6(HbinMo&
+`4rmk['Hs?Y,nY&W2HJfV59u`US=HUr1X1brLt[ed*L"_bfe2PaiMQC`Pod5_SO%&^:h1k]",A\
+[^NQLZa$a=YH=r+QiE@(J:V@(P`UWLJqJehXK>rCAR]+ZAS,LdCMINpBP;$jAn>LaB6'WDMq`T0
+KSY]dPP^O@OoCODOnXt6O8k7:O8P+<O8G%9O8k7?NW4t8N<"q9MZJ]lr.k3)rIt9)re:6&rIss"
+s+UE)re('#re1W4KS4u0JUi<&rIFlurIP-&J:E(GIf4crIf=ciI/eQlI/\HhH2i3iGli57GQ)ge
+H22aiH[:!`G^9.1rd"Kfr-A0c!.4Wi!.4]mrd4Ti!.4Nfs*=HerH\Eis*=Zlrd=`or-\Klrd4cq
+IXh9Gr."Ejs*k-$JUr@IJcC?%K*$^YKDpN(L&Qi,L]<21M>rJ7N/daqrK$c9r/pr@rKI5F"dP=;
+QBmm:R/WKRR/WNPRfAlPRLPU:J:)]eFE;;:Chda)rE/kurEB/(q-<l(rE]J2rO;a6$FR7JYct=,
+`5T^8qo8cZaiaP)!6k>crm15`s3C\irQ>2`rQ5#\s3(FXrG;IMqelCOs)@mU!ci@'rH*4*G'8(R
+G^+L[H@(!dI=6QoJ:N3&K7el4L51SAMMmFQNfT9aP*;/rQ^F21S"6.CTqS6WV5L8kWiW>*Yd(OA
+[C3TU]"G_k^qmn+`Q$!@bKJ/UcdC1ieCN7(g"P3:h;@/LioB+]k3(sml0@X%mI'H3nF?MK!V>s_
+o`Fj]p\ssfq>U6gqu6NlrUg)?s+14%s*t~>
+JcC<$JcEpnnc&Ibr;?EgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!U!q,ICrTsRMs6BUJ'^2d*Xf8%a
+R$X"uOH,<[N/W[QMM_:fs+^]2LPCN^LB!&.L+.n4dEp4bcHOJTb/q`G`l5p8_ns7*^V7Co]=PP`
+\$i`PZa6p@Yck12rdb#u%piXCF_tr*?=IDS<e5j+>Q.h(=Tr&6>?b65r`Th7='&F0FaeD3D/XH;
+H%(21I._jbI/\HmHMr-hHN/?lI/\KkHN/6hGQ2pcH1Z@\H2i*hG5ZR`F9Q`-FE;MFqfVXTp2pFY
+F)q8$o5akN!cW'qqeuLRs)7jT!,qgRr,;OQr,;4FrbqdRqeZIPCMRa'rG2INr,2IMs(qXNs).jR
+rGMUQn8A)@q/61KrGDXSDYS,PE,TW3qJZCQr,;RRrbqdTr,MXRp2TtKs)S*Y!-8'Y!HN8\FS0eV
+G5Z[`H2W'fHi/9gI0+kGIK"]qJ,XusJc:9$KE$Q&KDgK'L%g6#F8g+aDJX!"An>I^AGoX+=oDP&
+>PVP&?2\(0?i,i_MuSY;Lk^Y<I/]B.Q2[!KQ'_'/qj@GQqj[VS!1E\Ns-EVMs-Wh%rG;IMqelCO
+s)@mU!ci@'rH*4*G'8(RG^+L[H@(!dI=6QoJ:N3&K7el4L51SAMMmFQNfT9aP*;/rQ^F21S"6.C
+TqS6WV5L8kWiW>*Yd(OA[C3TU]"G_k^qmn+`Q$!@bKJ/UcdC1ieCN7(g"P3:h;@/LioB+]k3(sm
+l0@X%mI'H3nF?MK!V>s_o`Fj]p\ssfq>U6gqu6NlrUg)?s+14%s*t~>
+JcC<$JcEpnnc&Ibr;?EgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!U!q,ICrTsRMs6BUJ%HqA:Bk:^W
+>?P$-<E)rq<<-"t;u0Gq<E<+"qG\iid*L"_bfe2PaiMQC`Pod5_SO%&^:h1k]",A\[^NQLZa$a=
+YH=r+<<#l+-Rpc-1bp^7/M/Y96:(T;!(6ZNs$?ZM'gFrI5<qJ"5Wq:m1He309i4Y`;,^Em;ZB\f
+;uooqrD3Pm;H!Kmr)3Pn!)ibmrDNPlpeprer_i_os&/_ks&/kq!)iVir_`bq;Z'Jk;ZBVn;?9]q
+oMkok;uTYo;#a>j:^'Wk;,L.dr_F##;,L.c:Jak`:Jakb;Gm3cqb[Dk;,Qj[r_EMhqbR2d!)NMf
+s%iYkr)!Gjr_NPhs%`Vir_NPhr_NMgp.k`d;,I-cpe^rcr)!DhrD<8dr_NMis&&>`r_NDfp/1fc
+r_`Sks%rbmr_NPjpeUi`s%iSjpeq,js&B"us&Anrs&Akos&A_kqGdDns&K5%<)Zco;[l]&;,L.e
+:eXSU:/"8PrE/kurEB/(q-<l(rE]J2qb[8hs&/ko!DlDe;u0Jm<W#ho<<Z?#;cHduqGmMnqG[Gp
+r`&nrrD`ess(hRLrb_OMrbqgUr,DdYF*%;%G'.tOGB\:VH$Xd`H[L6iIXcluJV&N,Knb>;Ll%"I
+N/`jYOHG]iQ'I]'R@B\:StD^MUSO`aW2ZeuXfen5Za@-K\@K2`]t_A!_SjF5aN;WKc-FY_daQ^s
+f@\d1gYL]Ci8N\UjQ5Oekiq?sm-O--n*fc9rpg*]o`"Lbp@n=\q#C0hqY^6ir;HTdrdk*#s4@:$~>
+JcC<$JcEsonG`@arVZNhrVHQiqtU3crq?<`s7H<^rUU!Ys7$!U!q,ICrTsRMs6BUJs6(?`jPA>/
+`k]3q['R$AY,nY&W2?DeUnsl_U]$nbUApqdUA^c2cHOJTb/q`G`l5p8_ns7*^V7Co]XkYa\$i`P
+Za6sAYck12XT"P>Q@41SS!K"_IY!-*BWS;5V5.R2A7]@aBkqEsAnbpiB4YXbAnH1U^m'%jJ;/rD
+plkW=r/q#BrfQu;qN(Z:qN(Q9r/^c;qiCc;!0-u:r/C]8rJL`7M2;+cr.b0(s+LB*qh4p%p4iU$
+rIk0&qh4s&s+^Q,"bVDXJ:W:NJGk&uK)^B'J:E(HIf+]qIf=cjI/\KlHiSNmHM`!fHN&0jG^'+2
+!."Bd!IK.kH2;dcH2VsfHN&3eH2r<iHN/?lI/\KkHN/?fHN/9eHN&0jH@,X;rHnTnqgABkrd4cr
+It.EIr."Ejs*k0%JUr?%qLSWtrIb'%!/:E,s+^f7M2@+JN/[[prK$c9"d+n/OHG\(P5^[BPQI,9
+Qhd$JRJiQSS+W3[M10l"H?F7HE,06&EHPCZ=oDP&>PVP&?2\+/?i@J4[L9LM['6d<V8U<k`l@qs
+!m&L+r6#)aqp,,cp<`ic!6tJc!6Y8^rQ5,`rbMIKrGDFLs)7pVr,DdYF*%>&s)e<brc`L0H$O^^
+H[L6iIXcluJV&N,KS>/9Ll%"IN/`jYOHG]iQ'I]'R@9V9StD^MUSO`aW2cl!Xfnt6Za@0L\@K5a
+]t_A"_SjF6aN;WLc-F\`daZdtf@\g2gtgiEi8N\UjQ5OekiqBum-O--n*fc9o()DDo`"Lbp@n=\
+q#C0iqYU0hr;HTdrdk*#s4@:$~>
+JcC<$JcEsonG`@arVZNhrVHQiqtU3crq?<`s7H<^rUU!Ys7$!U!q,ICrTsRMs6BUJs6(*YY,\7f
+R$X&"OH5B\N/NROMM_:fs+gW/re:B,s+^W0L&-NLcHOJTb/q`G`l5p8_ns7*^V7Co]XkYa\$i`P
+Za6sAYck12XT!_UIp66'F)Yi$?2e=<=+PpNH[8lo=WCOH>[(B7>$5$4=]ea,<ap62H"q5:Ed)hZ
+IXZ_7I._jaI/eQnHN&3iHN/?jHiSNkH2r3hGQ2pcH1Z@\H2i*hGPu[aF9Q`-FE;MFqfVXTp2pFY
+F)q8$o5akN!-%mT!-%pUs)7sVrG_dTrbhXPr,DRPoksbIrGMOMs(q^Ns)%aO!,_UNrG;ONrGDRP
+rb_UOs)7@Dqeu7Is)%^Pp2BtMrbhRN!-%gRrc%jTrc%gUr,D@LqJZFTqJlOUrcA0`G5HC^FT-F_
+FoZabGl;pdHMr3gI/&-hIfForJGt,qK)UE$KE-`!KFW-EEGfZ1BkM'iA7B+^=SZ+u>5_\$>l@t,
+?N+=/NW4q:M?J`iL4t$SPl-gGPQ@&9nsK<B!1NeSs-`qUqO%;KrKdMOrbMIKrGDFLs)7pVr,DdY
+F*%>&s)e<brc`L0H$O^^H[L6iIXcluJV&N,KS>/9Ll%"IN/`jYOHG]iQ'I]'R@9V9StD^MUSO`a
+W2cl!Xfnt6Za@0L\@K5a]t_A"_SjF6aN;WLc-F\`daZdtf@\g2gtgiEi8N\UjQ5OekiqBum-O--
+n*fc9o()DDo`"Lbp@n=\q#C0iqYU0hr;HTdrdk*#s4@:$~>
+JcC<$JcEsonG`@arVZNhrVHQiqtU3crq?<`s7H<^rUU!Ys7$!U!q,ICrTsRMs6BUJs6'dPBkCdY
+>?P'/<W5tt<<?-"<;ohm<;fhq<%CsJ<)lq!<mJq4bK@rJaMu3<`5BI.^q[Us]Y(hd\[T#U['R*E
+Yct=5XfVM$'N6A.3]8iM/LrJ,0/l3`5!;"q6::`=s$7Dc5<_=t5<qG!5Wq7l5!VY6:/Onf;cN`p
+r_ibpoi(uk;GmBhr_ibpr)3Pn!)ibmrDNPlpeprerDNVn!)iYjs&&kr;Ya2h;?9]or)<Mks&&bn
+!`N&toi2#l;uTYo;#a>j:^'Wk;,L.dr_Enu;,L.c:Jak`:Jame;>F&b;$'Qk;=[Q^:B4/e:]F2i
+:]4&f:]F8h;$]uo:JOY\:JO[a:]F2i:]=,_:BF?i;#=&_;#a>g;#a>i;#*uf:]4)i;=[Q_:]!u^
+;>sDj;>a;m;,I6fs%rJdrD*Ag!)WVkq,75ks&B"us&Att"&r9"<;f_t<)Zaqp/CferD`o"<E/]k
+#uFJr:f(%c:.n1X8c_=^q-!Z"rEK)&rE]A.ra5P!r_`\ns%rkp92eaf;u9Pn<W#ho<<Z?#;cHdu
+qc*Vqr_rYm!*0"ts&8kq!*0#6rG;FLqelFPs)@mU!ci@'rcJ0_!-\?cFa/1WH?spcI=6QoJ:N3&
+K7ei2L51SAMMmFQNfT9aP*;/rQ^F20S"6.CTqS6WV5L8lWiW>+Yd(OA[^N]V]=bhl^r!t,`Q-'A
+bKS5Vd*^:keCN7(g=k?<hV[8MioB+]k3(smlKdg'mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<gqu6Nl
+rUg)?s+14%s*t~>
+JcC<$JcEsonc&Ibr;?EgrqcWir:p<drq?<`s7H<^rUU!Ys7$$Vs6fpSrTsRM!:'OIs6(?`k24b7
+a2,I!['R$AY,nY&W2?DeUnsl^UA^eaUApqeUAU_aTH_S%aiMQC`Pod5_SO%&^:h1l]",A][^NTM
+Za-g>YH=q.X8\G<IXe&YPDb'AIt35bXJr+rU77R:O(Ms<CM7<mBkV*kAn>LbFaTFKd<U4lLQ.Gj
+PPUIAOoLUDOnb%7O8b1:O8P+;O8P+:O8k4?NW+n7N<"q9MZScmM#E,,LAci+K`6]'K`$PtLAuu+
+K`6W$K`6]*LAuo-K7a&Qrdarurdt0$!e>cMr-nNm!.OoqrHnTnrI"Tkrd4]mrd+Hes*FZi!I/hf
+GlN'cHN/<pH?ja\H2DjcH2`$hH$]I8!IB+kH2r<iH2r<kI/\KkH2r<fHN/9eHMr-hHiJBlHiABm
+IJ\EkIK"TqI=?\DJGjukJGt$#J:W6$qLSTsre(0&s+UK-s+gW1s+pi8Mi<YpNWG3$rf?r<!0R/?
+s,dAGOco^-qiq,G!LB)OQiNKPR/NHPRK/iLRLYgIJU;ciGB7_@Df'0*G5>A?>5_\$>l@t,?Me+/
+[h#pV[^NTN['6d<V8U<k`l@tts2Y5_b5BE_c25f^chYrfcN)5gb5f]`ao0B[C]/)KD>S5NDuO_S
+E<:0%F8g:]FT?UaG6)r6rd&L0I!pElIt3'#K7ei2L5(M@M2R=ONfT9aP*;,qQ^F20S"6.CTV8-V
+V5L8lWiW>+Yd(OA[^N]V]=bhl^r""-`Q-'AbKS8Wd*^:ke^i@)g=k?<hV[8Mj5]4_k3(smlKdg'
+mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<hqu-HkrUg)?s+14%s*t~>
+JcC<$JcEsonc&Ibr;?EgrqcWir:p<drq?<`s7H<^rUU!Ys7$$Vs6fpSrTsRM!:'OIs6'sUk,Y>M
+R?s2%OcPK]N/R[ms,$`2!/LQ.re:B,s+^`3Knb>9rJ(<*,0S-NaN2B?`Pf[2_8*h"]tD"h\[f5Y
+[^EHJZEUR:Xf\\*rdb#T/9l,OBOP7V@UrJiIXQQgF`VM==]ej4>?Y-4=^"s2=BAR3Ap&EmCMe$4
+G^fXA!IfIdI.Vd_I/S?oH$Xd`Hi/9hH2r6iGQ2pcH1Q:\H2i*hGPu[^FT6C^FSg4TFS9hYFE;L%
+F7XGPE<U<"DfBW6rbqgU!,qgTs)7mSr,;LPr,;OO!,q^OrbqaQr+uURCMRa'D>n>OD>\;GD?"MQ
+D>nGPDt%Z@Du";MD>e>QDf5>g")r0rDYe8OE;OSQE;jeTE;X_SE;";JE;stTE<^H)FEDYKG5$.Z
+FoZabGl;pdHMr3hI/&-hIf=irJGk&uJcLB$K)L?$KE-_tKFN6IE,TW1CM.9lARf:aqH<c#rEK)&
+rE]A.qd9;]$&je#MMd4EL4t$SPl-gGPQ@&9nsK<B!1NeSs-`qUqO%;KrKmFtrG;IMqelFPrc%gU
+!ci@'rcJ0_!-\?c!I/nhH>e.XI=6QoJ:N3'K7nr5L5:\CMi<UTO-#KePE_?!R$jD4SXuIHTqeE[
+Vl6VqXKA\1Z*UgG[^`l[]Y2(q_Sa=2a2lBGbg+M\dF-Opf%8R.g>(N@hr*JRj5f@bkNM0qlg4!*
+mdKW6nac8BoCW%T!quB_rqQNhs8)ZjrVZWmo_sFAJcF@%J,~>
+JcC<$JcEsonc&Ibr;?EgrqcWir:p<drq?<`s7H<^rUU!Ys7$$Vs6fpSrTsRM!:'OIs6'dPk%8%-
+>?P'0<rQ(u<W5ts;u0Jm<W#hr<W?"u<W6#E<E./aaiMQC`Pod5_SO%&^:h1l]",A][^NTMZa-g>
+YH=q.X8Z)u.2Y''1bgU5/M8Y56:!e!4?PVa2aThr5sRX55Q3nW5sRV"4$GW(:/Fhd<)`cqs&8ko
+!)rPis&/nqr_`\ls&&epr)3Pn!)ibmrDNPlpeprerDNVn!)iYjs&&kr;Ya2h;?9]or)<Mks&&bn
+!`N&toi;#jr_`\ls%iVj"]%rl;,C*g:]=2s:esk`:esk`;#X>f;#4#j:f1*g:]OAe;"mcb:B+,g
+:B"&h;#F2i:]F2i:B4/h:]F2h:]F2_:BF?i;#F,`;#X8g;#a>i;#*ri:esmc:]OA_;#X8g;"dcb
+;#X>i;?9WkrD*DipJ:`_s%`VkrDEDhs&8nrs&K(us&K"srDN_r;uTbi;u0Jm<<?3#<:s2i;ZBQ"
+;,9t^:.n2O91/PYrEB/(q-<l(rEfA.r)!Ais&/ko"&MWh;Z9Vl<;onq<;]bq;Z]p!<r5ks<;ohm
+;ufqt<<#nq<;^P1D#S;KDZ=YSE;abXEcZ=$FT6I`G5c[dG^9:7DgQk[I=?ZrJ:W?*KS>/8Ll$tH
+N/WdXOHG]iPa.T&R@9V9StD[LUSO`aW2cl!Xfnt6Za@0L\@K5a]t_A"_o0O7aN;WLcHaeadaZgu
+f@\g2gtgiEi8N_VjQ>UfkiqBum-O--n*fc9o()DDo`"Lbp@n=\q#C0iqY^6hr;HTdrdk*#s4@:$~>
+JcC<$JcEsonc&IbrVZNhrqcWir:p9cs7ZB`s7H?_rUU!Ys7$$Vs6fpSrTjUOlK\?4)sHJJk2t=A
+aMYa&['R'BY,nY&W2?DeUna`\U]$nbUA1G]T`(KYaMu3<`5BI.^q[Xt]Y(hd\[])V[Bm3FYct=6
+XfSS'Q\0^$U77@$JpW'%LhEihV5BuXS<f4mKSG,,B4tskAnG[dA7oqH]8aOPJ;&f@ooo-5r/pc9
+qN(W9qN(T:r/^c;rJq)AO,f6[rf$c7s,?r8!fDhjrJ1<*rIt9)re:9'r.Xj!s+UE)re(-%rIt9+
+s+CE*K)L9"JGt,uK)^B'J:E(HIf"TpIf=coHiSTnI/\KlHiSNmHMi'gHN&3fGlN'bH3S_BH$OX[
+H2DjdH2W!fHN/6lH@(#<H2r<iHN/?lI/SEkHN/?fHN/9gH3&A=rcnNjHiA?jI/eWlI/\QoHie_F
+J,FipJ+eEmIft:QJUi:JJc(-"KDgK&L&Zo-LB`QkM2I4LN;AP7O8G"=Oo(7?OTgo1P*2#mr072G
+"dYLAR$a6=R/E?QR[Nf:&=]2\Oaqk.H['^QD/O*'DnPsMrEB/(q-<l(rEf>-rjN6C\$i`Q['['A
+YGM6:rl4rXs2Y2^qo\uaqp+o]r6PPlcHXT4b5f]`ao9H[C]/)KD>S5NDuXeTEW:(ZF8g91F`qqP
+GBe@XH?spcI=6QoJ:N3&K7nr5L5:\CMN!LSO,oEdPE_>uR$jD4SXuIITqeE[Vl6VqXKA\1Z*UgG
+\%&u\]Y;.r_Sa@3a2lEHbg+P]dF6Uqf@S^0gYCWAi8EVTj5oFckNV6rlg4!*mdKW6nac8Bo^qhL
+p@e7Zq#C0iqY^6ir;HTcrdk*#s4@:$~>
+JcC<$JcEsonc&IbrVZNhrqcWir:p9cs7ZB`s7H?_rUU!Ys7$$Vs6fpSrTjUOlK\?4&Er<?k2rP4
+R[9>(OcYT_N/R[ms,$c3s+gT.re:B,s+^T/r.P9.Knb;8rId=daMu3<`5BI.^q[Xt]Y(hd\[])V
+[Bm3FYct=6XfSS'J7;hdH#mk7?sR5OAQ=>3H[0jZF)c&/An5@X>Q.b9>$4s/=BAmNLin\pDfKoG
+r-n`rII_dVHi&3jHi/3hHi8<lHi86oH$FOWG^0.3o6C:\s*+NfrH8$[s)S0^qfVXTp2pFYF)q5#
+oQ'tO"`SBuE,T^pDu+GQDuOYPDu=SPDuFPRDu4GNDuFSOD$4ZjCM[kdD#8,KD#eDND>nGPD>nGQ
+DsqT@Dtn5MD>eAGDuXeVDYe;OE;OSQE;skUE;X_RE;";KDujs!qJlOU"ES[-G'<V&s)nBdr-80c
+rHeEhrd=Hgs*jorrdarus+16%rIXs"!JH*sKF`ckIrfRIDf0?(BOt[`A=36srEB/(q-<l(rEf>-
+rJ_,BMi3ILLk^Y<I/]B.Q2[!JQLU@>R/i]QRfJoVRJWBOQN!6JC]/)KD>S5NDuXeTEW:(ZF8g91
+F`qqPGBe@XH?spcI=6QoJ:N3&K7nr5L5:\CMN!LSO,oEdPE_>uR$jD4SXuIITqeE[Vl6VqXKA\1
+Z*UgG\%&u\]Y;.r_Sa@3a2lEHbg+P]dF6Uqf@S^0gYCWAi8EVTj5oFckNV6rlg4!*mdKW6nac8B
+o^qhLp@e7Zq#C0iqY^6ir;HTcrdk*#s4@:$~>
+JcC<$JcEsonc&IbrVZNhrqcWir:p9cs7ZB`s7H?_rUU!Ys7$$Vs6fpSrTjUOlK\?4&Er<?k2p,Y
+>?Y-1<`N*u<E9#tr_rVls&Jtrs&K(us&K&!s&K(u:fYTV`Pod5_SO%&^V.:m]",A][^NTMZa-g>
+YHG"/X/],L.5<kA1GCC2/MAb85s[_"4?Y\a2`*9H0ebgW5!D4s5sRUt4$Gl!8kr5[;Gm?ks&8ko
+!)rVkrDW\nr)*;gs&8qqr_`SkrDWJhqG[>jr_iepqGI8j!E2nl;>sGo;c<Nlr)3Plr_ibp!*&Vk
+s&8nos%r_k$W'\s:Janc:f'q`;#X>k:]F5k:]=2i;>F&c;?'Jm;>j;k;>3o]:]=)h:]4&f:]F8h
+;#jGl:]F2i:B4/h:]F2i:]F2_:BF?i;#F,_;#a>g;#a>i;#*uf:]=2j;=[Q_:]!u^;>sDj;>jAn
+;,HdYr_EJh!)WSjqbmGmrDWo"<)cjtrD`_oqc*So!)iYlpf%;p<)iBd$rBf!;GU+b91qiK92>@e
+rEB/(q-<l(rEf>-r)!Ais&/ko"Ah`i;H!Kmr)EYqr)EVp!*&qr!`W3$qc*Vqr_rbp"'&<"<W5tt
+;uTbnC]/)KD>S5NDuXeTEW:(ZF8g91F`qqPGBe@XH?spcI=6QoJ:N3&K7nr5L5:\CMN!LSO,oEd
+PE_>uR$jD4SXuIITqeE[Vl6VqXKA\1Z*UgG\%&u\]Y;.r_Sa@3a2lEHbg+P]dF6Uqf@S^0gYCWA
+i8EVTj5oFckNV6rlg4!*mdKW6nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTcrdk*#s4@:$~>
+JcC<$JcF!pnG`@arVZNhrqcWir:p<drq?<`s7H?_rUU!Ys7$!U!q,ICrTjUOlK\B5s60LGroOgS
+ai(p)[Bm0DY,nY&W2?DeV#@%gUAgkbUA1G]TECgXT:c(R9>n`b_8*h#]tD"h\[f5Y[^EHJZEUR:
+Y-"e+Wi:JsBUkHOL4au.K4SYsW26;_R[TJ%M2-k:I!^U&LPh"HMi3U<SAhRSI=I!0Oo(=<PP:7;
+OnXt7O8k7:O8Y1:O8b7>O8b1>NW4t7NW4t:MZScmM#E,+LAlo,K`6]'K_pJtLAuu+K`6W%K`-W)
+LAuo-K7a&Qrdb!!rIY'#!e>cMr-nNm!.OoqrHnTnrI"Tkrd=Zjr-A<grd"Eds*=Hes*F`lrH\9b
+rd"Kf$$giCH$O^_H[:#;Hi86jHiAEjHiJBlHhi!fH2MshH[>[:"aYNBH?sr;HiSTlI/\QnHie_G
+J,OoqJ+eEmIft:QJUi:JJc(-"KE$T*K7s5XreCH.s,$c5!fN"sqMkQ:r/_/GOH>NbO-#J%OTL]0
+PPg[DPm*J?R$a5,rg<\Q".5LFRIcjISGo&gR"Kg9H?XLRD/X<+CR4m$rEB2)q-<l(rEf;,s'Yl9
+$F[FP[^EKLYct=-rl"fUrl>&[!6P,]!6tAcp!<Wa!RK'jbl>idb5KE^b5#iOD#S;KDZ=YTE;aeV
+EWC1[FT6I`G5c]&G^4U]H[L6iIXcluJV&N,Knb>;M2@+KN/`mZOckomQ'Rf*R[]h=T:qsRUnsuf
+WiN5'YHY==['mHS\\#Mg^VRe)`Q$!?b0/&TcdC.heCE1'g"P3:h;@/LioB+]k3(sml0@X%mI'H3
+nF?MK!V>s_o`Fj]p\ssfq>U6gqu6NlrUg)?s+14$s*t~>
+JcC<$JcF!pnG`@arVZNhrqcWir:p<drq?<`s7H?_rUU!Ys7$!U!q,ICrTjUOlK\B5s60LGroORL
+S!]M+P*(fcN/R[mreU]4LPPk`re:B,s+^T/pP&R!rI[:c`5BI.^q[Xt]Y(hd\[])V[Bm3FYct=6
+XfSS'WF'"4FDu#+@:3ST<E4X"H[BsXF)Po-ARo4V?>!k_BP@?Y$"8"<KP>@DF*E!0IfFosIe.sX
+Hhr-iHi89iHi8?kHiJBoH$FRXrcnBeo6C:\s*+NfrH8!Z!HWA[FnTqOFTQZ+ErC(OErU+_E,TZ6
+DfG\oqJcIQrbhXPr,DRPrGDURr,2FNrGMRNs(q^Ns)%aO!,_UNphg"Jrb_[Qrbq:DqJZ1Is)%[O
+qelIRrGMdWDf0IhDZFbRDuO_TDuO_SEVseLEVaVSEr'eUEWgH*F`qs&FoQXbGPudbH2W'fHi8?e
+I/n`oJ,OosJcC?%Jc:9#K*-^XKS/lL!/:E,#D@2=DfBN/C&V`E@fUuU=oDP'>PVP&?2\+*?iOO5
+N<tQ%Mi*@IL5(D0rfm>GrfdDKnX03AqO7JRrL*VO".,=>QhbFqD#S;KDZ=YTE;aeVEWC1[FT6I`
+G5c]&G^4U]H[L6iIXcluJV&N,Knb>;M2@+KN/`mZOckomQ'Rf*R[]h=T:qsRUnsufWiN5'YHY==
+['mHS\\#Mg^VRe)`Q$!?b0/&TcdC.heCE1'g"P3:h;@/LioB+]k3(sml0@X%mI'H3nF?MK!V>s_
+o`Fj]p\ssfq>U6gqu6NlrUg)?s+14$s*t~>
+JcC<$JcF!pnG`@arVZNhrqcWir:p<drq?<`s7H?_rUU!Ys7$!U!q,ICrTjUOlK\B5s60LGroORL
+>?Y-2=&i4!<E9#ts&8Yk!*/qrr`&qtr`/u!s&K%trDbhq_ns7*^V@Ip]XkYa\@/iRZa6sAYck43
+XK/A#-n-l12DHm9/M8\81-n,g4Ztnf3]ArR0etF9qDAR92EX2j9MA5Y;YF&g;?0Yi<;TVo;Z0Jl
+;?0Yp;Z9Vp;ZBVl;Z0Ph;Yj>i;ZBYq;Yj8h;Ya2h;?9]or)<Mks&&_m!E2tj<<6&tr_`\ls%a#!
+;,C%b;,L.d:JXgd;>sAk:]O;j;#X>f;#=,i;#aDk:]OAe;"mcc:B+,g:B"&h;#F0!:esk^:/=Y\
+:/=Y\:B"&h:A%Ba:f1'f:\IWa:]+&h:]4,c;$'Qi:]4)i;=RK^:]+&_;>sDj;>a;l;#F)h;"d]b
+:B+,i;#O8g;ZB\o;ufqt;ufqs<;f_u<)lpt<;ohr;Yj>h<!6-!<E)re;[l]);Gg7e:/">U91hfL
+r)ru%r`f2'rE]A.q-X/0rD<Jjs&/ko"Ah`i;H!Kmr)EYqr)EVp!*&qr"'&B&<;]_r<;ohp<<#r#
+<)lmsr_ierq.oqFrb_OMs)7pVrGhjX!-A-]s)e<brc`4(H$Xd`I!pElIt3'#JqJ]0L5(J?M2I7N
+NK9-_P*;,qQC+)/S"-(BTqS6WV5L8lX/rG,Yd1UB[^WfX]=bkm_8=+/`lQ6DbK\>YdF$Fme^rI,
+g=tH>hr*JQj5f=akNM0plKmm)mdKW6nc&([oCW%T!quB_rqQNhrqcQirqu`no_sFAJcF=$J,~>
+JcC<$JcF!pnc&IbrVZNhrqcWir:p9cs7ZEas7H?_rUU!Ys7$$Vs6fpSrTjUOlK\B5s60LGroOgS
+jMepH\$NBFYH=h(W2HJfV#@(gUApqcUA1G]T`:YaSc,/YSO^K1^V.:m]=GJ^[^NTMZa-j?YHG"/
+X/`.tJ8(L>NJ3"7J;%X8XJVegSsu(2O,/LDJ:2m"LPUeFM2R@KJ=i[jH%1O&N03t"rKHl:plYB6
+r/^i;qN(W;q2bN:rf@&=rf$o:qMbK6regl9M26ueL\li*L&Qc*L&?W$L%g?%L&Qc(KDgK%L&Zl1
+KnP,3K)L6#JGausK)^B'J:E(IIenNoIf=coHiSToI/\KkI/SBhH2i3iH2W!eH2;gkH[:!`G^4T3
+GlE!fGR/S@H?jd_H[:#:Hi86jHiAEgHhi!fH2MsgHi83jH@,X;rd=`or-\Klrd4cqIXh9GrI=Nk
+rdXs!rdalsr.=s$!ec2YrIt9+s+gW2re^u>NK0!YNK0!Yrf?r<rK$u?rfI8FPEYp/rK[DK$C@-H
+Q^F,+R$jA0rL*>I!LoVXSIV6]ML^,$G'7qED/O*'DuNo<>5_\%>l@t,?M\%-@/jXC\$icS[^EKM
+Yct=,rl"fUrl>&[!6Y2^!6t;ao?RK`bfp(0!6Y8^phThErb_OMs)7pVrG_mZF*%>&EclPKGB\:W
+H$Xd`I!pElIt3*%K7ei2L51SAMMmFQO,oEdPE_>uR$jD4S=Z@HTqeE\Vl6VrXKA\1ZEppH\%0)_
+]Y;.s_Sa@4aN;TJc-FY_daQ^sf@\d1gYL]Ci8N\UjQ5Oekiq?tm-O--n*fc9rpg*]o`"Lbp@n=\
+q#C0iqYU0hr;HTdrdk*#s474#~>
+JcC<$JcF!pnc&IbrVZNhrqcWir:p9cs7ZEas7H?_rUU!Ys7$$Vs6fpSrTjUOlK\B5s60LGroORL
+jHu:!PEM#fNK!gnre^W0rItK0L5(J=LA-E#K`$K$JOdMj^V.:m]=GJ^[^NTMZa-j?YHG"/X/`.t
+?WM5eBk(U[@:N>gJUMfhGBInECM%-g?sd;RB4bgiBPD0jBR+s%D/O?9GCBC<s*t#s!.FKenU(.\
+rHnNis*O]lrd4Zk!."HdrH\!Zs*=Whs*+HbqfDm\FEIG'p2p%O!d&L(rH%UOs)A9_DfBZ6E,T[j
+E;skUDZ+MNE;XYQD?+VQDZ"GODZ+DUChmg&D/K8g!,_XOphftIrb_[Qrbq:DqJZ1Is)%^Pp2BtM
+s).[Os)@mSrc%jTrc%dTrG_IMqJZITEr0kVErU1`FEMbLFSU(ZG5c^aGl;pdHMr3hI/\NoI/SHn
+If"WoJGk$#Jq8LOK)^H'K)L>oKE-`(L(/iZE,]`5CM@EnAn5C_r`T2'rEK,'rE]A.qHs2/s'bqe
+$&je#MM[.DL4t$SPl6mGPQ7$>R/<<JRfJoVRJ`ERQ^3s4C]/)KD>S5NDuXeTE<:0%F8g9%F`qqP
+GBeCYH?spcI=6QoJ:W<)K7nr5LPUeEMi<XVO-,ThPa.Q%R@9V8StD^MUSOcbW2co"Xfnt7Za@0M
+\[oGd^;%M$_o9X:ai_fOcHjnde'ut#f\,!5h;-uHiSrnYjlYail07O#m-X60n*olHncA@Srq-?d
+p\4[^s7u]kqtpBjrVcBfJcC<$f)L7~>
+JcC<$JcF!pnc&IbrVZNhrqcWir:p9cs7ZEas7H?_rUU!Ys7$$Vs6fpSrTjUOlK\B5s60LGroORL
+jB>\g=B8F$<E8us"]JB#<)clk<;BPo<WH.u<;KTb^q[Xt]Y(ke\[])V[Bm3FZ*:F7XfSS'WMh7!
+2Dm6C/M&M,3'ono5!;%j3&iiR1bg^<0JkXE2Dm<K2(C^P2c*4F;Gp@ip/Cuhs&8\lq,78krDESm
+r_iepr_rPhr_rSiqG[;is&/nqqGI/gq,./iqG[8h!)`\m!E2tj<<6&srD<bq:JXea:f.-gs%r_k
+!)WYls%iVj!)NSjr_`Yk!)NSjqGI8hs&&_k!)`JepeUlas%iSgr_NPjr)!\q:JX_\:JXab:]F2h
+:B4/^:]F8h:\IWb:]!ug:]4,c;>sAj;#aD`;#X8g;"dcc;#F2h;?9WknPB0[s%iVjrD<et;,U7h
+;H$Ne<;f_u<)lpt<;ohr;Yj>h;ufkq<:3Zk;Gg:h:f1"`9M>=Vr`T2'rEK,'rE]A.qHs2/s'bn'
+r_Wr!;c-Cg92e_dr_r_or`/kqrD`hsr_ir"<`N*urD`hsr_rbprDiksr_rT-rG;IMqelFPs)@pV
+!ci@'rcE1'G'8(RG^4R\H@($fI=?ZrJV&N,KS>/9Ll%"IN/`mZOckomQ'Rf*R[]h=T:qsRUo(&g
+WiN5'YHY==['mHS]"G\i^VRe)`Q$!@b0/&TcdC1ieCN7(g"P3:h;@/LioB+]k3(sml0I^&mI'H3
+nF?MK!V>s_o`Fj]p\ssfq>^<gqu6NlrUg)?s+14$s*t~>
+JcC<$JcF!pnc&IbrVZNhrqcWir:p<ds7ZEas7H?_rUU!Ys7$!U!q,ICrTjUOlK\B5s6'IGrT4^R
+jQ+.j\?rQGYH=k*W2QShV#@(gUApqcUA1G]T`:VbSt,bMs.'(Z8"?'<]Y(ke\[])V[C!9GZ*:F7
+XfSS'WMl_lS<8haJ:N6*B!/24VPTiPQB$u_KS+f%I"d<2Ll7+KNJaLMOHb*CKo(hRPPLC@POjt3
+Oo(7<O8b.CO,f9^NfO+"s,d/>"-/G'OSt7?Nr=q;N;AM6N;e_;MM[1GreLB*re:?)s+UB(qh=d!
+s+UH*re(-%rIt9+"GMM^K7a&Q!.b'"!J5n$K)^B'J:E(IIenQmIK"WoIK"WnHi8?jHMr-hHN&3g
+GlE!aH3/G>HN&3eGlE!fGQ<$gH3AM>I!^2<Hi86jHiAEgHhi!fH2MshH[>[:!IB+lH2r<kHiSTl
+I/\QnHiebHJ,OoqJ+eEmIfY(Nrdalsr.=s$s+CE*K`-W)L'!-dM>iA5Mi@Ll!07&>!K`BAOSt7?
+OSt=APPg[BPl[5=rg*SN#FLpIR$a;/RJ!$KS,JoXT)YDmNIZA&H$==LD/=$'Dcp6B>5_\%>l@t,
+?MRt-@/XO5\,Wl<[C!=?YQgoA`5T^8`r=$Ya8jB\b6#o4c2#ZVcN;D9bl5faanKTLD#S;KDZ=YT
+E;jkWErU4\FT6I`G5c]0G^4U]H[L6iIXcluJV/T.KnbA=M2I4MNK9-_P*;,qQC+)/S"6.CTqS6W
+VPgAmX0&M-Yd1UC[^WfY]Y2(p_8=.0`lQ9FbK\>ZdF-Oof%8R.g>(N@hr*JRj5f@bkNM0qlg4!*
+mdKW6nac8Bo^qhLp@e7TrqQNhs8)Zjrqu`noDX=@JcF=$J,~>
+JcC<$JcF!pnc&IbrVZNhrqcWir:p<ds7ZEas7H?_rUU!Ys7$!U!q,ICrTjUOlK\B5s6'IGrT4LL
+jQ)YnP`h/hNJrepMZ/G4M#N2,LB!#/LA-E#K`$H&K)C3"K)`J9]=GJ^[^NTNZa-j?YHG"/X/`.t
+Vl"NOC1CX[@UiGjJ:2ciG'%\>C1q-f?sR.=B)cKPBPM6qHB35uD/XH=HMW*iJ,artIIhj]HN8Hk
+Hi&3gHiJElHiJHuH[L3fH[:!`qfr-d!I/n]GlN'gGQ;seFo-7^F*)O%FnTqOFTQZ+ErC(OErU+a
+E,T]7DfBW5q/H@Ps).aQqf)IOrbhaSrGMLNrGMRN"DhjhCi0,eqel4HrGMRN!,hdSn8A)@q/64L
+r,24H")r0rDYe8OE;OSQE;jeTE;aeSE;";KDujs!qJcd]F)uGGG'8"MqK;g]rce9brH\?frd4Tk
+rd=corI"Zpqg\Qp"+buRK)U?#K)^K'K)UDoK_gE6KmRfYE,KN.B4kge@qAeGr`]8)qHWu)rEf;,
+ra>\5rf-r9!fDhjre:K%Q'D33rKI;JnX06B!1NbR!1NnTr0RMOQM51nD#S;KDZ=YTE;jkWErU4\
+FT6I`G5c]0G^4U]H[L6iIXcluJV/T.KnbA=M2I4MNK9-_P*;,qQC+)/S"6.CTqS6WVPgAmX0&M-
+Yd1UC[^WfY]Y2(p_8=.0`lQ9FbK\>ZdF-Oof%8R.g>(N@hr*JRj5f@bkNM0qlg4!*mdKW6nac8B
+o^qhLp@e7TrqQNhs8)Zjrqu`noDX=@JcF=$J,~>
+JcC<$JcF!pnc&IbrVZNhrqcWir:p<ds7ZEas7H?_rUU!Ys7$!U!q,ICrTjUOlK\B5s6'IGrT4@H
+jQ'HG=BAQ&<Vobq<<?-"<VKJg<W6#!<W5tk<WB]K]=GJ^[^NTNZa-j?YHG"/X/`.tVkuC01B&g@
+/MB"M5s@Ls4?>J^2Dm6E0eY4;2)R<Lr\Y'<3'To,:/Xnc;H-Wp;u9Jm;uTYp;tj8f;ZK_n;#jMj
+;tX&g;tj2h;ZTcpr)3Pn!)iVis&&kr;Ya2i;Yj>h;?0Sm;?9]qoi2#l;Z0Gs:esnb;,C*g;?'Jm
+:B45j;?'Gk:]O;j;#X>k:]O;j;#4#h;#X>k;#aDe;#X5j;#F,g:&n)g:B"&h;#=)t:esk^:JX_\
+:JX_\r_EMhoM>H_rD3,`r_NGgs%iSiq,%2i:J^pc!)`;`r_NDfp/1fcrDEMk!Du\_:BF9e:]=2c
+;?'Po;ZTirpf.2j!*&qt!*&qrs&/Ykr)E\pr`&;a&QDb1;G^1e:f1"_9M8#N7p0!o>5_\%>l@t,
+?MRt-@/XO5;#X;m;H*Ql!D?Aj;ZB\n<;onr<;]_r<;oet<E<-!<;okt<;ohp<;fhs<<#nkC]/)K
+D>S5NDuXeUEW:(ZF8p@^FT?UaGB\:WH?spcI=6QoJ:N3'K7nr5LPUeEMi<XVO-,ThPa.Q%R@9V9
+StD^MUSOcbW2co#Xfnt7ZaI6N\[oGe^V@V%`5Ta;aihlPcHsteeC<($f\5'7h;7&IiT&tZk2tjj
+l0@U$m-X60n*ol<o(2MGp%A%Pp\4[^s7u]kr;6KkrVc?eJcC<$f)L7~>
+JcC<$JcF!pnc&Lcr;?HhrqcWir:p<drq?<`s7H?_rUL$[nF6DFs6]mSrTjUOlK\B5s6'IGrT4^R
+jQ,@]\[AcJYH=n+WMcViV#@(fU&^nbUALVbTV;@Xs.9FcSXc7AqOIDO4h.r/[C!9GZ*:F7XfSS'
+WMl_lV50l=I=Hj&B<A,0VPK`MQ]I/_KS+f%H\I93M2R7KNKoIC\9N@NKoD,mPPLCAPQ$^FOnb+2
+Oo:C>O8b1>O8P%;NrY:?O8b1:O8k4CNK0!XN;AM6N;eb8M?/QireLB*re1K.K7nr4rIk$$pP/^%
+re19'r.P$&s+UZ1KS4u0rIFs!rdbE.JV&N+Jq8K'It.EGqgSTprI+Zms*alord4Wl!.4ZjrH\Eh
+rd"Herd"?ds*Ocl!dK!9qfr*crceEgrd"]mH[L0drHnKh!.4]mpj;j`s*=Qhs*O]is*Ocl!.4]m
+!.F`lrdFcn!e#QJrIFfqp430m"Fu&SJ:RNJr.=s$s+LE)r.Y0*s+pW2!fW+tr/L`:s,RPLO-#Ea
+O,o<^O-#J&OT:R@Pl-gEQN!3PR$j<>QiNQIRK/lUSH,8[T+$j4I=-?aFE228D/=.h>5hb%>lJ%-
+?MRt-@/XO5@fNn?[^WZO[/R96Y/J8t`Q#ps`ra?(b5BE_bl,f`cL]?`cHON3bQ#]aCA2NBD#S;L
+DZ=YTE;aeVEWC1[F9-N-rc`""H$Xd`I!pElIt3'#JqJ`1L51SAMMmFQO,oEdPE_>uR$jD4SXuII
+U8+N]Vl6VrXfen4ZEpsI\@K2`]t_A!_SjF6aN;WLcHaeadaZguf@em4gtgiFi8N_VjlY^gl07L!
+m-O-=mfi4No()DErq6<b!;HHes7u]kr;6KkrVcBfJcC<$ec1.~>
+JcC<$JcF!pnc&Lcr;?HhrqcWir:p<drq?<`s7H?_rUL$[nF6DFs6]mSrTjUOlK\B5s6'IGrT4LL
+jQ,@]Q'7>jNJrepMZ/J4M#W81L&d#.LB!#/LAQZ)K`6]'K`6W'K)C2sJhX^C[^EKKZE^X;Y-"e+
+Wi;qpVPU)`@U<MQ@on51I!^-]F)c&3B4PL\?!_,UAnYlWBaJcuO,RgkEH6;Oq0r<ms*jrqpO)[]
+rd=]lqgA0cs*Xin"akZDH?sl6GlN$iG^8n*s*=Tg!-eEbqfDm\FEIG'p2p%O!d&L(rH%UOs)A9_
+DfBZ6E,T[jE;skVDZ"GME;XYRDZ=YRDYnANDZ4MQD#\8OCi0/f!,_UNq/-(JrG;OPrbq:DqJYtC
+qelIRrGMdWDf0IhDZFbRDuO_TDuO_SEVseLEVj\UEH:nqs)J<bFEMbMF`dJ&s*"?brHS9drHeEh
+rI"Wns*XcnqLAKp"+buRJGt,uJc^RVK)UDpKE-`&LAll8Ir]LIDf0B)B4YU`Ac5g3>PVP'?2\+*
+?iFI3@K'a9NW4n<MM[/gL'!'oPl-gGPQ@&9nX06B!1NeSs-iqTr0[M!pM9_Drb_RNs)7pVrGhjX
+!-A-]!HiSbG@u/GH?spcI=6QoJ:N3&K7nr5LPUeEMi<XVO-,ThPa.Q%R@9V9StD^NUSOcbW2co#
+Y->.9ZaI6O\[oGe^VI\&`5Td<aihoRcHsteeCE.%g"P39h;7)JiT&t[k2tjkl0@U$m-Xf@"n;'Q
+o(2MQp&F^cp\jmeq>^<hqu6NlrUg)?s+14#s*t~>
+JcC<$JcF!pnc&Lcr;?HhrqcWir:p<drq?<`s7H?_rUL$[nF6DFs6]mSrTjUOlK\B5s6'IGrT4@H
+jQ,@]=BJW'<W#hn<VKJj<<?-"<W,r"<E)rf<B[k#[^EKKZE^X;Y-"e+Wi;qpVPU)`/hAV-0/l6a
+5!D+l3B9&X1c$j@0/#.=2)d?L1c.-R5Yb!J;,C4jr`&kqqbmDls&&hqq,I,f!)i_l!)iYloMPZf
+pJUuh!E)ko;ZBYq;Ya2g;Ya2i;Yj>h;?0Sm;?9]qoi2#l;Z0Gs:esnb;,C*g;?'Jm:B45j;?'Gk
+:]O;j;#X>k:]O;j;#=,i;#X>k;#aDe;#X5j;#F,g:&n)g:B"&h;#F2j;#a;n:/=Y\r_NPhn5''\
+rD3&^!)NJgs%iSiq,.,e"&Vlk;=RK^:]+&_;>sDj;>jAn;,HXUrD<;es&/kq#?4W$;cH[p;uTbp
+;ZKer<<-"t;u]bk;uBVp;u]h`;uK\r;uTW";Gg1a9M8#N8c;il>PVP'?2\+*?iFI3@K'a9;#X>l
+;uTVp:fI?ks&0#!;cH`p<W,np<<-"t;Z]s"<W5ts<W,kp<;fhs<<$_-C]/)KD>\;ODuXeTEW:%Z
+F8g7^Fa!b.B6\]JH@($fI=?ZrJ:W<)KS>/9Ll%"IN/`mZOckomQ'Rf*R[]k>T:r!SUo(&gWiN8)
+YctF>[C3TU]"G_k^qmn+`Q-'AbKS8Wd*^:ke^i@*g=tE=hVd>Nj5]7`k3)!nlKdg'mJcPXnF?)?
+oCW%Ts7QHerV6Egs8)Zjrqu`no_sFAJcF:#J,~>
+JcC<$JcF$qnc&IbrVZNhrqcWir:p<ds7ZEas7H?_rUU!Y!:]sUs6]mSrTjUOlK\B5s6'IGroX7B
+!9F.>%H=h'Z*1:2Wi;qoV5:!dU\LS]U&:S`T*1aVS=H/LS-#1MSGJ`TS,f&XRQ.XZZ*:F7XfSS'
+WMl_lV50l\TmqcNB<A,2VP0KLR#m5]L4al#H\@-1M2R:ON3T(Ufm/(#LQ.MoP5LIBOopo2P*,O&
+nWEg4qi:uBO,o<]NK0%pO8Y+:O8Y+=N<"q6N<"q:MuSY9M26ueL\li+K`m']KS>-YK_gDsLAuu,
+K`6W&K`$Q(L'33`KS+mPJc:6+K7\]+JUi6"rI4Wn!.Olprd4]ord=Zkrd4]mrHeEfs*FZirHS?f
+q0E6lH?sj]H$T:3rd"Kfr-ABjI/J?iH2r<kI.hpbHN/9hHN/<lHN&0jH@,X;"FGNDI=;!?s*alo
+!e#NIr.+`qp43-ls+10"qgnZs"bVJ]K7ejUL&Zl/LPUfdM?&S5N!53"NK&sYqN(Z:s,[2ArfI2D
+qNUoCqj.8Ks-WhQrg3\RopYoNr1+OnT:_^HSXG+ZI!KmWE,BQ0D/WT]rEK,'ra#J/q-X,/rF,V5
+s0i->\$`TMricI,`5MYorPnu\aiaP)!6k>brQb#\!mSs5rlY;`rbD1CrG;IMr,2OQs)@sWs)J*\
+rcE+%G'8(RG^4U]H[L6iIXcluJV&N-KnbA=M2I4MNK9-_P*;,qQC+)/S"6.CTq\?YVPgDnX0&P/
+Z*UdE[^`l[]Y2(q_Sa=2a2lEHbg+P]dF6Uqf@S^0gYL]Ci8EVTjQ5Oekiq?sm-O--n*fc9rpg*]
+o`"Lbp@n=\q#C0iqY^6hr;HTdrdk*#s4.."~>
+JcC<$JcF$qnc&IbrVZNhrqcWir:p<ds7ZEas7H?_rUU!Y!:]sUs6]mSrTjUOlK\B5s6'IGroX7B
+!9F.>#3(i0O,]*VregZ2!/UW0#_n+iL5(J=L5,V[s+LB*rIk0&rIXruqL\]t34#oqYck43XK/A#
+W2HMhUnaZX?t<hKJpr,pGB@nHD/!Wm@:*;HAnG[hB5)*oJ9uaECi499G^o:5s*aWhom?^drHnBg
+qKr3hrHnQj!."Hds*4ZjH$T%,s*=Tg"*\p2Fng(VFnTqOFTQZ+ErC(OErU.VE;skPE;skVDZ"GM
+E;XYRD?+VRDYe;MDZ4JVChmg&D/K8g!,_XOq/-(JrGDRPrbq=EqJYtCqelIRrGV^T!cMsoqeuLR
+qeuLRrbqdTr,M[Sp2TqJqJlLTs)S?cG'8"MFSg4[G5ZX`GQW59H$T@7rHnNks*aoprI+NlqLJNq
+qL\a"oS!6uqM+s&%YJkBEGfW0BkCpd@q8bHrEK,'ra#J/q-X,/rF,V5s,I&:!fDhjre:E,qN_&E
+!L9#HQiNKMR/E?PRerTSRf8`RR/UjpC]/)KD>\;ODuXeUEW:%ZF8g9#F`qqPGBeCZH@($fI=?Zr
+J:W<)KS>/9Ll%"IN/`mZOckomQ'Rf*R[]k>T:r!TUo(&hWiN8)Yd(O@[C3TU]=bhl^r""-`Q-'B
+bKS8Xd*^=le^rF+g=tH>hr*GPj5f=akNM0plKmm)mdKW6nc&([oCW%T!quB_rqQNhs8)ZjrVZWm
+o_sFAJcF:#J,~>
+JcC<$JcF$qnc&IbrVZNhrqcWir:p<ds7ZEas7H?_rUU!Y!:]sUs6]mSrTjUOlK\B5s6'IGroX7B
+!9F.>"6*Ea<rQ+t<<#qu<rH%o<;T\q;ufqr<rQ(f<W5oUZa-j?YHG"/X/`.tVl$;dUS=G60/#1K
+5X.Fq4?5G_2`!6D0J>(91c73K2)R9O4Z?;6;,U7hrD`_o!)ibms&/kqs&&hqq,I,f!)i_l!)iSj
+lVd^\!`DrqrDNYos&/\jr)3Pl!)ibm!)iVkqbdDkrDEYp<:s5l;c<Qk##J)l;,L.dr_`\ls%`Vk
+r_`\kqG@/gr_NSjr_WJhs%r\lr_NSlp/(`a!)WVir_EJhrD*Agr_WMis%ikp:/4S\:B"&h:@V-Z
+;#X8X;#a>i;#*uf:BXKk:f1*\;#X8g;"dcc;#F2h;?0S]:]+&b;#jMg;uTbp;ZKer<<-"t;u]bj
+;uTbp;ZKe`;ZKep<<,ts;$p6!:esbW84uNX>5_\%>lJ%-?MRt-@/XO3@fK:(;?'So;#sKlrDNYp
+!`N&tr)N_qr`'#!<E/rr!``9$rD`esrDW\pr)E_rrbD1CrG;IMr,2OQs)@sWs)J*\rcE+%G'8(R
+G^4U]H[L6iIXcluJV&N-KnbA=M2I4MNK9-_P*;,qQC+)/S"6.CTq\?YVPgDnX0&P/Z*UdE[^`l[
+]Y2(q_Sa=2a2lEHbg+P]dF6Uqf@S^0gYL]Ci8EVTjQ5Oekiq?sm-O--n*fc9rpg*]o`"Lbp@n=\
+q#C0iqY^6hr;HTdrdk*#s4.."~>
+JcC<$JcF$qnc&IbrVZNhs8)`jr:p<drq?<`s7H?_rpp*Zs7$$Vs6fpSrp0^PlK\B5s6'IGroX7B
+!9F.>s5FIGZEUI4X/W"pV59u`rM0.^rLs7a#+qQ]T:VXFrgX._S=H(<SGJ]TSGo#RRPV(IX/`.t
+Vl$;dUS=HTT:TbuVPU)^R[0.rMM6b7H?t:"LPUeDN/MJE]9/D,JVArAPEYj+r/puArK6o=mu[U3
+qMt`=O,f8"N<#"8O8Y+9O8k7?NW4t6N<"q9MZ\inLku%cqhG-)"GDD\KSBAXqM"Zus+UH*re(0&
+r.Y0*"bhV_K7\^OJc:6$KDpH'JUm`LrdO`o!.Olprd4]ord=Zkrd4]mrd+Ngs*FZircnBeq0E*h
+H@#R9qfr'bs*+NhrH\KkI/A9jH3/G>HiAEbHiJElH2W'gHi86iHiJBlHiABmIJ\EkIK"TqIXckG
+JGaokJGt$!J:[]MqgnZs"bVJ]K7ejTK`d'bLPc"f!fN"qr/CZ8!06o:rf7#>s,d8C!KrZCPl6mE
+QM[$IQiNQJRK8nJr1+RoT:_^HSXl@AL44PsG'7hBE,09.>5hb&>l@t-?MRt-@/XO1@Kp>O[^WZO
+[/R92Xi/0W`VmgYaN;U&b5fc`c2Q#ZcN;A8bl5faCA2NBD#S;MDZ=YTE;abXEcZ=$FEDYKGB\:V
+H$Xd`I!pEmJ:N3&K7nr5LPUeEMi<XVO-,ThPa.T&R@B\:StD^NUnjlcWN*&%Y->1;['mEQ\\#Mg
+^VI_(`Q#s>b0/&TcdC.heCE1'g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCMVRo`Fj]p\ssf
+q>^<hqu6NlrU^#>s+14#s*t~>
+JcC<$JcF$qnc&IbrVZNhs8)`jr:p<drq?<`s7H?_rpp*Zs7$$Vs6fpSrp0^PlK\B5s6'IGroX7B
+!9F.>s5F7AOH,9XMi.Cg!/UN-!euJcreCB*re1<*rIk-%rIXruqL\`u!.t-"+0DWFWi;qpVPU)`
+U7n6PSl^JjH[9pXEGfN(AR](S?2J7DC2$UkLj"5bDfU#HIt.$<s*aWhom?^drHn?fqKr6irHnQj
+s*=NercnNhH1Z@\H2i*kGBS+OpiQFVp2p%O!d&L(rH%UOs)J'X!-/!Ws)7^Ps)7pT!H2rVDu4MO
+DuOVSDuFSMDuOYQD$4ZjCM[kdD#8,HD>\;MD#eJPDt.`ADtIrEDuXeTDZarsDJo;h!-%gRrc%jT
+rc%gUr,DCMqJZITEr9qVErU1aFEVhMFEID&rc\6aqKW$crd+NirHnTnrd=]n!.OcoqLJQrqL\a"
+oS!6uqM+s&%u,jmFE);=DJNouB4GI_>5hb&>l@t-?MRt-@/XO1@Kp>%Mi3ILM#N,/L&.)6PQ@&9
+pm;&Jr0[AL!1NeSs-iqTrg<Y!pM9_Drb_UOs)7pVrG_mZF*%>&FEMbNGBe@XH?spcI=6TqJ:W<)
+KS>/9Ll%"IN/`mZOckomQ'[l+S"#t?T:r!TUo(&hWiW>*Yd(OA[^N]V]=bkm^r"".`lH0CbK\>Y
+dF$Fme^rI,g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8BoCW%T!quB_rqQNhs8)Zjrqu`noDX=@
+JcF:#J,~>
+JcC<$JcF$qnc&IbrVZNhs8)`jr:p<drq?<`s7H?_rpp*Zs7$$Vs6fpSrp0^PlK\B5s6'IGroX7B
+!9F.>s5F(<=8c,'<)Z^q<E<0!<VfYq<EB&ur_rktrDiu"<)i?e!*&hos&:kXXK/A#W2HMhUnaZX
+TV%f65s@Iq5!1ea2`<NK1,(@<2)R3K1c7*=2*OK':/Fbb;H$Ln<;]\p;Z9Pi;?0Yl<;0;k;Z0Gm
+;YO,e;?0Sb;Z9Sq;H*Nlr_iepq,.)gs%rborDESmqG[8h!)`\m!E2tj<<6#rrD<bq:Janc:f.-g
+s%r_kr_W_n:J^g`r_`MgqbdAir_`Yk!)`Gds%`Vkr(m;e!)NPgr_NPjqbdAi#u=;l:JOY]:JO[S
+:]F8j:[M!Y:]+&c;$'Qi:]4)i;=RK_:]!u_;>j>i;>jAn;,H[Vr)!/cp/CujrDN\qr`&qtr_rhp
+pf%/ks&/ts;cN*^!*&hq%TZM);,^:g:eaYX84uNXr`f5(rE]D/q-X,/rF,P3!Fnt*;?'So;#jGj
+;ZB_r;ZKep<W5ts<<Z?%<)Z^pr`/nr!EE+u;uK\n<W-\,C]/)KD>eAPDuXeTE<:0%F8g9'F`qtQ
+G^+L[H@($fI=HctJV&N-KnbA=M2I4MNK9-_P*;,qQ^F21S"6.CTq\?YVPgDnXKAY0Z*UgG[^`l[
+]Y;.r_Sa@4a2lEHc-FY_dF6Uqf@\d1gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DDo`"Lbp@n=\
+q#C0iqY^6ir;HTcrdk*#s4.."~>
+JcC<$JcF$qnc&LcrVZNhrqcWirV6Bds7ZEas7H?_rpp*Zs7$$Vs6fpSrp9[N!:'RJs6'IGroX7B
+!9F.>s5F=Ci308aX/`(qrhTUjrM0.^rLs4`s.B=_s.0%W"e1sLS!ofAS+rHNR4P;7VPU)`U7n6P
+St;IAV59`OQB[DcKS4o'H\R92MM[.IN,=okZZpkLLPq>pPQ$a>OoLU@Oo1C1OT:L=NrY4<NVSY6
+Nr4t<NrP+=N;AM6N;\Y:MM[.FreLB*s+LT/K7no3rIk$$pP/^%re19're10&s+U]2KS4r.K):,t
+JcLH&JcUFQrdXrsqgSWsIf4]pI/eWoI/\KlI/eNpH@'u:H2i3iH2`'fH2`*tH[:!bH@(!bH?a^\
+qfr'bs*4Kgs*F`nr-SEhs*O`moQp[dH$Xc7HN&6kHN&0jH@,X;rd=`or-\Klrd4cqIXh<Hr."Ej
+s*k0%JUr?%qgnZss+:H-K7ei1r.P</LPUeEMZ/P2N!,-#NfT5"O8P%<Ns(Q,Ockq)Pl-gDQMQsJ
+QiNQJRKAtKSGf#YScPITrLFOlT:CjhI=$0]Ec5l2C2e?#>P_V(?2\++?i=C3@JOC4@g0?M\$`WN
+ricR.`5KX6`r=$Ya8sE*r6#)aqp#,co$7H`bfn8Rr+btArbVRNr,2OQs)@sWs)J*\rcA0`G5c]-
+G^4U]H[L6iIt3'#JqJ`1L51SAMMmFQO,oEdPE_?!R$jG5SXuLJU84W`Vl?\tXfnt6Za@0M\[f>b
+^;%M$_o9X:ai_fOcHjndeC<($f\5'7h;7&IiT&tZk2tjjl0@U$m-X60n*ol<o(2MGp%A%Pp\jme
+q>^<hqu6NlrUg)?s+14"s*t~>
+JcC<$JcF$qnc&LcrVZNhrqcWirV6Bds7ZEas7H?_rpp*Zs7$$Vs6fpSrp9[N!:'RJs6'IGroX7B
+!9F.>s5F.>i/WfrMu/A2M"ui)LAlo*K`?`-KS+sVKDgDuJbjulJJtJbVPU)`U7n6PSt;IAH[9jW
+E,TN(ARo1T?2eIHBP2!mBjPq<M/$pIFEi65J,XopIJSElIJA3_HiJKlHh`!bHN8HkHiJBlH2Mpd
+Gl`/8oQ^@\s*+WiG'.s&FSp:TFSBnZFE;L$F7aMQEW9tXEW0qWDu"APDuX\WDfBW5qJc@Ns).jT
+rbhOMrbh[O"DhjhCi0/f!,_UNs(qaRrb_OMrG;OPrGV7EqJYtCr,;USrGV^Ts).[Os)@mSrc%jT
+rc%gUr,D@LqeuRUEr9qVErU1_FEMbLrcJ$[rc\6aqfr-drHeEhqL&9j!.OcoqLJNqqLS^"oS!3t
+qM,!'s+V,@LkKnjE,KN.C1q6k@q04W>P_V(?2\++?i=C3@JOC4@g.jMMi*CJre:N/Q'I[6Q2[!K
+Q'_95s-N\Oqj@GQqO7JRrgEeRr+btArbVRNr,2OQs)@sWs)J*\rcA0`G5c]-G^4U]H[L6iIt3'#
+JqJ`1L51SAMMmFQO,oEdPE_?!R$jG5SXuLJU84W`Vl?\tXfnt6Za@0M\[f>b^;%M$_o9X:ai_fO
+cHjndeC<($f\5'7h;7&IiT&tZk2tjjl0@U$m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?
+s+14"s*t~>
+JcC<$JcF$qnc&LcrVZNhrqcWirV6Bds7ZEas7H?_rpp*Zs7$$Vs6fpSrp9[N!:'RJs6'IGroX7B
+!9F.>s5F(<i;HX[<)Z^q<E<0!<Vf\o<rQ+u;ufqs<WH/!<:Nuf<;ohp<<#ns<#V^5VPU)`U7n6P
+St;IA5!M.j3B9&V1bga=0E*g@2Dm<K1dXDl9MA2Y:f:4i;H*Qo!)renrDEGi!)r_npJV&ir)!Gl
+pJ^re!)`>cr_ihq;uKVn;ZK_k;>jDm;#jMl;#jMj;u9Gm;>jAn;cNEi!E2np;$Kim:f1(d;#X>l
+:]X?gr_W_n:J^g`r_`\l!)NSjqGI8hr_`\ls&&Jds%`Vkr(m;e!)NPgr_NPjr_X/';,L.d:JO\]
+:/=\^:/:=Tr_WVjmnj$[!`2ZgrD<;er_NMis&&>`r_NGgp/1fcrDEMk!Du\]:]!ua;#jMf;ZKeq
+;ZKer<<?,u;uT\h;u]eu;c6NY;u]ho<<H9';,[?i!`2Zdr^m8`6sEml>lJ%-?M\%-@/aU1@fKpA
+:f1(d;cEZm!)WVl"]JB";c?Zm<W?%t<W?%t;ZKer<W,kt<E/rr"&r9"<;fhpCA2NCD#S;LDZ=YT
+E;jkWEWC1[F9-N-rc`I/H$Xd`I!pEmJ:N3&K7nr5LPUeEMi<XVO-,ThPa.T&R@B\:StMdOUnsue
+WN*&%YHY:<['mHS\\#Mg^VRe)`Q$!@b0/&TcdC1jeCN7(g=k?<hV[8Mj5]4_k3(smlKdg'mI'H3
+nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`no_sFAJcF7"J,~>
+JcC<$JcF$qo)ARcrVZNhrqcZjr:p<ds7ZB`!qc*UrUU!Y!:]sU!q,ICrp9[N!:'RJs6'IGroX7B
+!9F.>s5F@Di8C`=X/`(qVZ*FjU\UY^U&L_bTDtJ_SbeiVS,8ZNS+rHOR4NiQL4H+rUS=HUT:VXE
+S"#h:S!K%nLkLJ4H[^['MMR1HN/_h9b0kN`KSkcePQ$a4Oo1C2OoCI=O8Ot;Nr"h8Nr4q<NrG%<
+N;AM6N;\Y8MM_=gs+gK+s+UE)!/:E*q1\Qtre:B*re(3'qh>')"bhV^Jq8ONJbam%JUi9#IsukE
+J,WCD;ufkq<!cQ*='/U-='&a9rF#J.rEoS2ra5k8H@'sbrd+Tiqfr$a!I/ngH3&A?qg8?hrd4Wl
+oR$U`r-J<grH\Eis*=Zlrd4]oqgABks*OlrIXh9GrI=Nks*k*#JV!fNqgn]ts+C?)!eZ/Zr.Y0*%
+YojsMMd=LMi3OPN/WaUrJpo=r/Uf<s,d8Cs-*;Dr07;KQ2R$KQiEBOQiEHQRJ30MRfJuVSc55ZS
+c>8lT:VX5I=6BeG&qV?Chn$:qHX#*rEf>-ra>\5qI9D5s'u8@\$`WNricR.`5KX6`r=$Ya8sE*r
+6#)aqp#,co?RNac-4E/CA2NCD#S;LDZ=YTE;jkWEWC1[F9-N-rc`7)H$Xd`I!pEmJ:N3&K7nr5L
+PUeEMi<XVO-,ThQ'I]'R@B_;StMdOUnsufWN*&%YHY==['mHS]"G_j^VRe*`Q$!@bKS5Vd*^:ke
+^i@)g=tE=hVd>Oj5]7`k3)!nlKdg'mdKW6naZ2@oCW%T!quB_rqQNhrqcQirqu`no_sFAJcF7"J
+,~>
+JcC<$JcF$qo)ARcrVZNhrqcZjr:p<ds7ZB`!qc*UrUU!Y!:]sU!q,ICrp9[N!:'RJs6'IGroX7B
+!9F.>s5F.>i8BUoMu/A1M#2u)LAuu+K`6Z*K`$K#K)1&rK(aa:?>a:]V50l\TqS*MSt):>R<E[k
+Ch[KmARJbNB4koWB*rBf@W7I%Bl7s7H2N0kIf+WjIf=ciI.hpdI/SEeI.VadH?oC4s*=-Zs*=Wh
+!I&_dFnp.WFnTqOFT?O\F7aJQEW0nWEW0nWDtn;ODZt#sDfBW5r,DL*oh>?Xs&/qr;uKSp<)`co
+r)<Pl!`<fPrb_RNrG;OPr,;.DqJZ"Dr,;RRs).mVrbqgSqJQ@QqeuIQs)7mUr,M[Sp2TqJqf2RT
+#BP!/G'8"MFSg4ZG5ZXaGQ`58G^4T5HN&9eI/eWpIenQjJGk&rK(FZpL&-Q'L&Zo-L]</>LO!lY
+D/O0(B4b^c@qb^Dra#J/qHs50rF,P3rF>k<s,6o7!/UW/",3#*QMd$JPQ@):pmD&Irg<SN!1NbR
+!1NnTqeGk@rbVRNr,2OQs)@sWs)J*\rcA0`G5c]'G^4U]H[L6iIt3'#JqJ`1L51SAMMmFQO,oEd
+PEhE"R$jG6SXuLJU84W`W2ZeuXfnt7Za@0M\[oGe^;%M$`5Ta;aihoQcHsteeCE.%f\5*8h;7)J
+ioB(\k2tjkl0@U$m-a?2nF?&>o(2MQo`Fj]p\ssfq>U6gqu6NlrUg)?s+14"s*t~>
+JcC<$JcF$qo)ARcrVZNhrqcZjr:p<ds7ZB`!qc*UrUU!Y!:]sU!q,ICrp9[N!:'RJs6'IGroX7B
+!9F.>s5FIGi8@U7<E)mq<)lq!rDi\n!*0#!s&K%t!*/qt!``3!nl>Tes&8kqr_jmc0J"]MUnaZX
+Tq@pJS=?"94?>M^2Dm6E0J>+:2)[Dm2$l*+4[;t>;,:%frDNSmqbmAiqbdDmq,I,f!)i_l!)iMh
+r)3MkoMY]fqGR>l!)iVir)3Ag!)iYlqbdDkrDEYp<;';n<)Z]n;$Kim:f1(d;#X;o:esk`r_W\m
+:\did;?'Gm:]=2g;>rKQ2u5K62uY`82uY];4?GScpcS=7"ZoRZ;,L0g:]F2i;#a;[:]F8j:[_-[
+:]!ua;$'Qi:]4)i;=RK_:]+&_;>sDi;>jAm;!h'U;#X;l;#O8b;ZKeq;ZKer<<?,u;uT\g;ZTir
+r_i#[!*&hqs&T/$!*9(r"Ahrk;+pj[!(?Zgra#J/qHs50rF,P3rF>k<s%rho;cEZm!)WVl!`N&t
+r_r\os&Atts&Atr!*&qtrDWet<;of"<)lms<E8p2pM9bErb_RNs)7pVrc.sY!-A-]!HiSbGA_YN
+H?spcI=6TqJ:W<)KS>/9Ll%"IN/`mZOckonQ'[l+S"-%@TV8*UV5L8kWiW>+Yd1UB[^WfY]Y2%o
+_8=.0`lQ9Fbg"G[dF-Opf%8R.gYCWAi8EVTj5oFckNV6rlg4!+n*fc9nac8Bo`"Lbp@n=\q#C0h
+qY^6ir;HTdrdk*#s4%(!~>
+JcC<$JcF'rnc&IbrVZQirqcWirV6Bds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'RJs6'IGroX7B
+!9F.>&)uR,i8EMMX/`+rVP^2dV#I.bUALVaT`1S`T)YA]S,f&WS-,7LR@4&Cr1!JMrL"XSP_F['
+TU_aMTq@pJS=?"9R$a5#Lkg\8IX?BoreLu@M2R@6G,<Z5JqSuCrKI/Bm#h70s,d;Cnr`j3r/Ui<
+rJ^f;qN(Q7rJpr=rJ^f9qMkN6regf7M>i>1L\uo+L&Q`*L&Qc$L%g?$L&Zi+KDgK#Ka3?dKnP)1
+JV*iO!J5n%JcLH%Jd-dVJ5fNJ<;fbq<;ohn;ufkq<!cQ*='/U-='&a9rF#G-ra5\3"CGPE?X<V:
+r`oM/r-8-b!I/nhHN/<lI/J?jH2r<jI.VaeH?jf6HN&6kHN&0mH@'saHiAEmIJeKlIK"TqI=HbF
+JGaokJGt$!J:[]Mqgn]ts+C?)s+:<)r.Y0*$AXFoMMd=LMi3OPrepi:rJpo=qi1Z;rf@2DP*>a,
+q3CrF!13YMs-EeSR@3f<s-s%YrLNqZrLNt[&YGYdT:V'oIX??aF)c,5Ci@#b>lJ%-?M\%.@/XO1
+@f9g8AH0.=[/dT5YQ_/I`5T^8rl>&[!6P,]!6kGe!mJp6rm(,]!m]$6qeGk@rG;IMrGMXRs)@sW
+s)J*\rcE%#G'8(RG^4U]H[L6iIXls"JqJ`1L51SAMMmFQO,oEdPEhE"R$jG6St;UKUSO`aW2co"
+Xfnt7ZaI6N\[oGe^VI_'`5Td<aihoRcd:(geCE1&g"P3:h;@/KioB+]k3(sml0@X%mI'H3nF?MK
+!V>s_o`Fj]p\ssfq>^<hqu-HlrU^#>s+14"s*t~>
+JcC<$JcF'rnc&IbrVZQirqcWirV6Bds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'RJs6'IGroX7B
+!9F.>$0'q&i8EMMMi3JiM>i>.L\c`*L&Qc)K`Hf(KD^>sJc:8oJK.s5@pi>\F/#A%T:VXES"#h5
+R$VT#AS#7W?!_.AB+&BeBk(_$T58FcG'a+:r-nQlq0r?lpO*!f!.+Hfrd=ZkpjD^\!IB%gGlN'f
+GQ<$_GlN'hGQE#3rcS!XrH7gUpN6IXqfDCM!-/!W!-/!W!,qXOs).pUDuE<.9DqQ[9D2'Y9E%lf
+;?9`qrDNPlrDE\o;H!BhrG;OPr,;IM!,_OLqeu+Eo5FYHqJZCQr,;RRrbqdTrGhaSpMp%Kqf2RT
+#BP!/G'8"MFSg4ZG5ZXaGQ`58G^4T5HMr3dHie_FIenQiJGt,sJcgXYKS0#PrIt*&!/:E,s+gT0%
+Z-!hEcH&9D/3cqA7T2:r*95,rEf>-ra>\5qI9D5rF?%iMi*CJre:N/Q'I[5Q2d'KQM6dGQi<BLR
+JE<RR[KT@CA2NBD#S;MDZ=YTE;jkWEWC1[FDc5EG'A.TH$Xd`I!pElJ:N3&K7nr5LPUeEMi<XVO
+-,ThQ'I]'R@B_<StMdPUnsufWiN5'YHY==[C3QT]"G_k^r!t,`Q-'AbKS8Xd*^=le^rF+g=tH>h
+r*GPj5f=akNM0plKmm)mdKW6nc&([oCW%T!quB_rqQNhs8)ZjrVZZnoDX=@JcF7"J,~>
+JcC<$JcF'rnc&IbrVZQirqcWirV6Bds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'RJs6'IGroX7B
+!9F.>#iah%i8EMM<E/rr!*&hqqGdJprDj##<)clq<rZ/"<:Nu`<;f`;-86r"0f_+cTqS*MSt):>
+R@'A.2`3BI0eb761c7-LrA=jJ6oe(=;G^:jqGR>lqbmAiqbmGmqGdJn!)i\m!)i_l!)iMhr)3Mk
+oMY]fqGR>l!)iVi!E)eo;ZBSo;Z0Jm;YsDi;?0Sm;?9]qp/M,m;uBJs:esnb;,C*g;$0Wj:Jh$f
+!DlSf;#aDl:]NBM2Z>Z72Z>Z32uko:2ZG`82ZGo>3WM8:4S_,B4?GYfr&Y'F:Jah^:@V-Z;#a>[
+;#X8j;#X5j;#*uf:]=2j;=[Q`:]!u_;>j>i;>jAm;=.0V;#X;l;#O8];ZKer<<?,u;uT\g;ZTir
+r_i;c!*&en!*&hqs&T,#%Tle0:Jt"b:JaeY8P2QLr*95,rEf>-ra>\5qI9D5rFGq*!`2for_WYl
+rDE\q<)iiqqGdMpr`&qtrDNbs<E8uss&B%ur_ir!<E3!uqeGk@rG;IMrGMXRs)@sWs)J*\rcE%#
+G'8(RG^4U]H[L6iIXls"JqJ`1L51SAMMmFQO,oEdPEhE"R$jG6St;UKUSO`aW2co"Xfnt7ZaI6N
+\[oGe^VI_'`5Td<aihoRcd:(geCE1&g"P3:h;@/KioB+]k3(sml0@X%mI'H3nF?MK!V>s_o`Fj]
+p\ssfq>^<hqu-HlrU^#>s+14"s*t~>
+JcC<$JcF'ro)ARcrVZNhrqcZjr:p<ds7ZEas7H?_rpp*Zs7$$Vs6]mSrp9[N!:'RJs6'IGroX7B
+!9F.>&E;[-i8EMMhPmHOVP^2dUnn!bqP*n]s.K@`s.97]!1a"Ws-s+ZRf8`SRfAlRRK/cTRf/Wr
+J!5S;BqCiVL7t62St):>R[BJ/Q'I)XJp_ljK8GMDreh)"F*E\?H\-p-OSk=?P3S20P5g[COSP"=
+OSt=?OSk.>Nr=q;Nr"h7NrP.ANfT4mN<"q:MZJ]lreUQ/r.b3)re(?,KS9,SpP/[$s+LE)re1-%
+#DRqdKS+l-K)L6$Jq<oQ"BJT(<)rfp!EE+t;u]hq;uBVp;uTbr<<lQ+=BS^,?XNb>q-O&-s'>h8
+?sm>IrEfJ/!aJr7r*0/GrH\NlI!kj=s*F]lrI"6as*=Kfrd4Wi!IB+lHMr3kIJ\ElIK"TqI=?\E
+JGaojJH(*"J:[]MqgnZs#(qS^K7ei1r.PE2LPUeDMMd=LrJUZ6"c\P%NfK1tNW>.>O9:W.P*>d-
+q3;&JQ'R^5Q3<PAR$jB;Rf8cVSG\oXT)>/VT)P>jOb%n,H?aILE,0</Qi:7g?2e1,?i=C3@JXI3
+A,Ts;AHTEL[C#q;"g,_]`Pojra8a3\ans6]bl5lebQ,oecL]?_cHZ3#pM9bErb_RNs).mVrGd7+
+F)uGFF`qqPGBeCZH@($fI=?]sJV&N-KnbA=M2I4MNK90`P*;/sQ^F52S=Z@GTqeE\Vl6VrXfen4
+ZEpsI\@K5a]t_A"_o9U8aND]McHjnce'uq"f\,!5h;-uHiSrnYjlYail0@U$m-X60n*ol<o(2MG
+p%A%Pp\jmeq>^<hqu6NlrUg)?s+14!s*t~>
+JcC<$JcF'ro)ARcrVZNhrqcZjr:p<ds7ZEas7H?_rpp*Zs7$$Vs6]mSrp9[N!:'RJs6'IGroX7B
+!9F.>$0'q&i8EMMhM[9fM>i>.L\uo+L&Zi*K`Hf(KD^?$JHLFRJUm6@/7*.%?rhDkCh063St;IA
+S!o_3Q^*hK@pr_L?=[_`BkM-o?=RSiJo,IKGC9=<r-nQlq0r<kpjE*grHe?fs*XclpO)U[!."Ec
+!."Nf!."9_s*=Whs*+HbpiQIWp2p%O!-J*ZoPsqOrbqjWpi-7,s%EAar_*2^r_*5aq+LKV"A;E^
+92#7_r)*Sp<)`cor_ihq;uKSq;,U<a;?(S3DZ=SNDYe;EDZ"DQE;4AODYe8OE;OSRE;jeTE;aeS
+E;";KDujs!rGhdVs)S9aG'8$-FSp:ZG5ZXbGlN!fGlN'fHMr3eI/eWpIenQjJGt,sJcp^ZKS+pO
+K`6]%L&cr,LAlu-M#N5>IWBFIDes0&An>I^J,W^O?2e1,?i=C3@JXI3A,Ts;AHRjJMMV7d",3#*
+QMZpJPa;'2rg3VOqjI8L!LfGQCA2NCD#S;LDZ=VTE;ad)EcZ;DFEMbMGB\:WH?spcI=6QpJ:W<)
+KS>/9Ll%"IN/`m[OckonQC!u-S"-(BTV8-VVPgAmX0&P/Yd1UC[^`l[]Y2(q_Sa@3a2lEHbg+P^
+dF6Uqf@\d1gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$
+e,Op~>
+JcC<$JcF'ro)ARcrVZNhrqcZjr:p<ds7ZEas7H?_rpp*Zs7$$Vs6]mSrp9[N!:'RJs6'IGroX7B
+!9F.>#iah%i8EMMhGjJQ!*&epqGdJps&T,!!E<(s<piuc;ufkr<;f`H-86r"0fV$G0;5#0St):>
+R[BJ/Q'F3^0eb761c7-L1c7-W6q'R::/Fed;u'>k;u0Dl;?'Po;uKSo;u0Jn;uKVn;u]bo;#jMe
+;Zfop;,[?ioMPZfqGR>l!)iPgr_ibn!)ibms&/_mqbdDkrDEYp<;';m<)`]l"].uk;,L0g;$0Wj
+:Jh$f!DlSi:]i[92E:[orAFU5!]N"qr\sd6r\s^6!&sj7s#9s9s#g<Br]Bs=q)ngB4$5Y'3rhGB
+56!_F54hYN;#a>Z;#a>j;#X8d;$'Qi:]4)i;=RK_:]+&_;>sDj;>jAn;,H[VqG@2hs%r\l!)iAd
+!*&qts&8tsr_i\n!*&bmrDEYp<:!N`<;]bq<rQ2"=T21t:^9im:/+>Q8P]7irE]D/qHs2/raGY4
+rF>e:rac1/:fC<l;#jGk;?9]qrDN\qpJh2mrDW\qrD`es!*&qr!*&qtqJ,b?rbVRNr,2OQ!-%mV
+I<'CMFEDYKG'A.TH$Xd`I!pElJ:N3&K7nr5LPUeEMi<XVOHG]iQ'Rc(R[]h=T:hmQUo(&gWiN8)
+YctF>[C3TU]=bhl^r"".`Q-'BbKS8XdF$Fme^rI,g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8B
+o^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#s3q!u~>
+JcC<$JcF*snc&IbrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6fpSrp0^PlK\B5!U/_Gk5XNC
+jSn0Lio/kSi8<GKh5I6KVPU-gV#I.dUAU_`TEUsZSt2FBr0mbXR[X,A!LfMSRfAcURf&R(J!>V;
+C7LcUM1^M<St):>R[BJ/Q'IStP'q_5LPCVAMi*F?G'][$IY*<4q31`>nr`m4rfR5DrfR/@qN:c=
+s,m8AqiC]8s,Qu;r/Uf<!fi>%oSij0regf7M>i>1L\li+L&Q`,KnP-SL%g?%L&Qc*KDpQ#KaEKf
+KnP)1JV&H(qcWr$"BST'<*&lq!EE+t;u]hq;uBVo;u]hs<<ZE)=BS^,ra5Y4!FK./?N+:4?=3\>
+!+#P0r`oV2>?kG2>6eD;>[2T%I!kj=s*=ZlrI"6a!IB%gHN&6kHN&3iHiJBlHiABmIJ\EkIK"Tp
+IXh9GrI=Nks*k*#JV!fNqgn]ts+:H-K7ei1r.Y0*#D\+lMMd=LMYrA4N;eh:NW>.:Nr>%@Ockq*
+Pl$^GPl?pKQBhB6s-EeSR@3i=rgWqXpRV2Qr1=IcJphrjGBIhDChmsT>[786rEfA.rF#V5q-s>5
+rFGh;"1P\G[/R91Xi14X!65#Ys2Y2_r6,,arltJe!6tMgo?RE^qeGh?rbVRNr,2OQ!-%mVGB.bG
+FEDYKG'A.TH$Xd`I!pElJ:N3&K7nr5LPUeEN/WdXOHG]jQ'Rf)R[]h=T:qsRUo(&hWiN8)Yd(OA
+[^N]V]=bkm_8=+/`lQ9EbK\>YdF-Oof%8R.g>(N@hr*JRj5f@bkNV6rlg4!*mdKW6nac8Bo`"O`
+p&Ojcq#C0iqY^6ir;HTdrdk*#s3q!u~>
+JcC<$JcF*snc&IbrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6fpSrp0^PlK\B5!U/_Gk5XNC
+jSn0Gio/kSi8<GKh2;#breUH,rJ(-%!ec2Xre(3%"+c&TJc(&hJLuCYCgpdQFE220@Us)BS=?":
+R$a5*Q'@Jq?X@AXAnPdiBk_!eBmXT4EH?>QqLAElr-eEjrdFQhrd4Tir-SHkr-S3doR$U`qfi*d
+rHJ<fp3?U_s*4Qf!d8^/piQIWp2p%Os)e0[oPsqOrbr![E,\QIrCmMj9h\5Q91qnU9E%Q_9E%W]
+9D;*_92&#P9E%lg;?Kco<)``ns&8qq!)rkp!)`_nqb[>kr_Wnu;,C+d;,_B3D>S5JDtS#GDZFbO
+DuX_ODZFbRDuO_TDuXeSEW'kMEVsePEW'qXF8p=_G'3e+r,qp\r-/0cs*+Kfs*=TirHn?f!e#NH
+r-n`rJ,Fg"It3'#Jbt'!K*$^YKD1&tL%g?$L]3,-M%5&VE,TZ2CM@BmA7U-o>lJ%-?Me+.@/aU1
+@fBm9AGg!@Mi*CJrItB=QBqE5!L/rFQi`S?Qi<BMR/i]ORfJoSCA)HBD#S;LDZ=VTE;ad#EcZ;D
+FEMbMGB\:WH?spcI=6QpJ:W<)KS>/9Ll%"JN/is\OckroQC+&.S"-(BTqS6WVPgDnX0&P/Z*UgG
+[^`l[]Y;.s_Sa@4aN;TJc-FY_daZdtf@\g2gtgiEi8N_VjQ>Ufl07L!m-O--n*fc9o()DErq6<b
+!;HHes7u]kr;6KkrVcBfJcC<$e,Op~>
+JcC<$JcF*snc&IbrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6fpSrp0^PlK\B5!U/_Gk5XNC
+jSn0Fio/kSi8<GKh>U=Q<;BPj<<#qu<r>tq<piuc<<#ks<;]ZF,qg_t0fV$G0.\b1St):>R[BJ/
+Q'IStOt\RH2)I0L1c7-E6q'X?:JanemSa$]!`Drqr)3Pnr)EYorDNVn!)ibm!)iJg!)iViohkcg
+qGR>l!)iPgr_ibn!)ibms&/_mqbdDkrDEYp<;';m<)`]l!DlSk;#jGk;$0Wj:Jh$fs#10B2Dm?M
+2`<Vm2Z5N52?Gfq2Z>Z62Z>Z33;kc82ubf949@T*3rV5;4S_,?48qA@3se#55<_7o4?bqnr]^3T
+r_NSjmSNmYs%r\j!)WJgr_NMi!)`8_s%iPhp/1fcr)*Gk!Du\]:\die;?'Jm;?'Pc;ZKer<W?%u
+;u]bo;ZKel;uT\[;ZKep<W6%u=8c5'=]83qrD3_p9hS&M8R,O"?2\+,?i=C3@JOC3A,Ts9AHPe+
+;cEZm!)WVl!E2tr;ta5h;uTeq<<#qu<;oet<)lrqCA)HBD#S;LDZ=VTE;ad#EcZ;DFEMbMGB\:W
+H?spcI=6QpJ:W<)KS>/9Ll%"JN/is\OckroQC+&.S"-(BTqS6WVPgDnX0&P/Z*UgG[^`l[]Y;.s
+_Sa@4aN;TJc-FY_daZdtf@\g2gtgiEi8N_VjQ>Ufl07L!m-O--n*fc9o()DErq6<b!;HHes7u]k
+r;6KkrVcBfJcC<$e,Op~>
+JcC<$JcF*snc&LcrVZNhrqcZjr:p<ds7ZEas7H?_rpp*Zs7$$V!q,ICrp0^PlK\B5#O(@6k2tde
+jSn0Jio/kSi8<GKh;-k`VZ*FkV#I.eUAU_`TEUsZSt2FBrgO"YS"#lGR08nFR$a<?RKAnGRe`@'
+R"(KTJn^^AObJC?L5;t$S!o_3Q^*i#PEM&iL4tG?MMd7LZZ^i:GC>.#Nfs4%r0$W5r/gr@rf[;D
+r/gf<plPB6!07#;!06o:r/Lo@NfT6]oo/s1regf7M>`81L\li+L&Qc*K`Hf%L%^9$L&Zi+KDpQ"
+Ka!3bKnNT5qcO>2>?P'0=B&:$<E3("r)<\s<;fbp<;ohn<;oer<;ol#='/U-=8lS,@/jU6?2It-
+?NFJ?ra5b5?2e10?2\%+>6S89>[1H9r`oGL!d]3?rI"6as*=NgrHnNh!.+Wk!.+Wls*afmrdFcn
+!e#QJrIFfqpON6ms+10"qgn]ts+C?)!eZ/Zr.Y0*!f)Sgr/1B0!0$o:pl><7"-Jb0PPg[BPlR'G
+Q2R$JQNEPBRJE<MRfJuQSbo#TT+%*>I=$6`F`VG<Ci41j?2\+,?i=C3@JXI3A,Ts6AcK.<[/R91
+Xi14X!65#Ys2Y2_qoer_s3(Jfrm(/^qJ,_>rbVRNr,2OQ!-%mVEcQ5BFEDYKG'A.TH$Xd`I!pEm
+J:N3&K7nr5LP^kFN/WdXOHPckQ'Rf*R[]k>T:r!TUo(&hWiW>*Yd(OA[^WfY]Y(tn_8=.0`lQ9F
+bg"G[dF-Opf%8U/gYCWAi8EVTj5oFckiq?slg4$,n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6hr;HTd
+rdk*#s3q!u~>
+JcC<$JcF*snc&LcrVZNhrqcZjr:p<ds7ZEas7H?_rpp*Zs7$$V!q,ICrp0^PlK\B5#O(@6k2tde
+jSn0Hio/kSi8<GKh;-l`M>W2.L\uo&Ka!-^JqAW-rdt*"s+(-!s+'`ms*u"nDdd$RFE),,@:NhZ
+Jt&6uR$a5*Q'@JqOc]NS%VTKgBnKu5ODAZRFaALcqLAElr-eBis*aWhs*OZirHnQlr-S3do6UI_
+qfr-drceEgp3?U_s*4Qf!d8^/piQFVpiQ4Ps)e-Zol:+R:/Cd_rD!5a"\ME[8kVeT9DqK_9E%W`
+9*.^Y9D;*_92&#P9E%lg;ZBSp<)``nr_r_ms&&bnr)!Glr)!bs;,C+g;c6Lj;>tJ0Dt\)HDuXeV
+DZFbRDuX_PDuXeSDuO_TDuO_SEVseMEVsePEW'qXF8p@^G5cU\Fo?L]GQ2pfGQ2pfH2W'fHhr-i
+IK+cpIfb(KJ,Om#It3'#Jbt&rKD:,uL%g?$L]*&-M>rA?J9#RIDes0%AnGR`Ac?!6?Me+.@/aU2
+@f9g8AGKg:M?&J2L'!X+QMQjHQhQjKQC!s;R/EBORf&ZOCA)HBD#S;LDZ=VTE;acsEcZ;DFEMbM
+GB\:WH?spcI=6TqJ:W<)KS>/9M2@+KN/is\P*2&pQC+)/S"6.CTq\?YVPgDnXKAY0Z*UgG\%0)_
+]Y;.s_SjF5aN;WLc-F\`daZguf@em4gtgiFi8WeWjlY^hl07L!m-X60n*olHncA@Srq-?dp\4[^
+s7u]kr;6HjrVcBfJcC<$e,Op~>
+JcC<$JcF*snc&LcrVZNhrqcZjr:p<ds7ZEas7H?_rpp*Zs7$$V!q,ICrp0^PlK\B5#O(@6k2tde
+jSn0Jio/kSi8<GKh;-jb<;9Ji<;KVm<piud<;BH";C4+J.PNb;1G16X0+C4:S!o_3Q^*i#PEM&i
+rA>!A2)R3J6UXRA:JXkgpeq&fp/:ifr_i_or)E\pr)3Pn!)i_l!)iMh!)ien!)ibmohtfgqbmGm
+s&/VhrDEYn;Z0Jm;Yj>i;?0Sn;ZBYq<;';m<)WWks%r\l!)WVk"].3=3B&tt2[))s2E!KRpbr+/
+r\jX4r\ja7qDeF3s#9s9s#^BF3]T8#48V/94o[VC4T7DK4?btn5!;"j5!T!0#!G.54]"sNm83gY
+r_WVj!)WJg!`2Zgr_WVlnkf?^qb[#ar_WMirDEVlmSEXTs&&ems&&eoo2>Wgr`/tts&8qqrDW_q
+q,@8jnl#Nfq,78mrDihtrE'#$rE0,!r_WPh"ADH\8PB%grEfA.rF#V5qI9D5rFG_8!`2for_WYl
+rDEYp<;oer<;'>i;uTeq<<#qu<;oer<;LA'C]8/LD>\;ODZFbTEH6)@F*)MHG'8(RG^4U]H[L6i
+It3'#JqJ`1L51VBMN!LSO-#NfPa.Q%R@9V9StD^NUnjlcWN*&%Y->1;['mHS]"G\i^VRe*`Q$!@
+bKS5Vd*^:ke^i@*g=tE=hVd>Oj5]7`k32'olKdg(mdKW6nc&([oCW%T!quB_rqQNhs8)ZjrVZWm
+o_sFAJcF4!J,~>
+JcC<$JcF*so)ARcrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp9[N!:'RJ#O(@6k2tde
+jSn0Kio/kSi8<GKh;-lAVPa?hs.oXhrM'4`r1F4cSt;LDSGo#WRf/ZPR/WKUR[KS4rL*\Qs-Y!s
+J!5G:Bq1KML4Y/6Lomh`VjNj<Q'IStP*(ieNfApQre^uEFb6W>JV8f?rf[2CqNCE3r/gc;r/gc;
+plPE7!07#;!06o:r/Lo@NfK0\oo/s1regi8M2D4fs+gK+s+UH*p4`3ps+UK+s+C<(qLo)T>$>'3
+>5MG/>$G*3=BJR&<`]3"!EN5"<!--"<E8urr`&kqr_rqt<)iiqs&B"u#$4o0=BAj:ra>b5!FB(/
+?N+=3?3FVC?sd4=?N+7/>l7e7>[(E;>?Y69>[:W>Hi/9aHNAG<qg/6g!.+Wird+ZlHiABmIJ\Ek
+IK+ZrI=?\EJGaokJGt$!J:[]Mqgn]ts+C?)s+:<)qh50-LPUeDrJLW5$Asb!Mi<XSNK&sXqi1oB
+OH5KbOckq+Pl$aGPQ@&6rg!GJs-NbQs-`\OrL<hWpmq>Spn&(iRY6*:H$=FRD/F*+E*ZcK?M\%.
+@/aU2@f9g8AGKg:B)f7=[/R91Xi14X!65#Ys2Y2_qoeu`rlbAerm(2_qeGe>rbVRNr,)RSE,bbq
+!HN8\F9-N-rc`C-H$Xd`I!pHnJ:N3'K7nu6LP^kGN/`jYOHPckQ'Rf*S"#t?TV8*UV5L8kWiW>+
+Yd1UC[^WfY]Y2(q_SX71a2lEHbg+P]dF6Uqf@\d1gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DE
+o_%nNp@nO\s7u]kr;6KkrVc?eJcC<$e,Op~>
+JcC<$JcF*so)ARcrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp9[N!:'RJ#O(@6k2tde
+jSn0Iio/kSi8<GKh;-lAr/(?-rJ1<*q1Sj&KDpH&KDpK$JH16!J,XuoJc($K?#3nW<-3%nA7/tZ
+AqYbeI@-CgQ'IStP*(ieNf@[aBPD."ASm$7DfTuIrI4]pqL8?jq0r?lpO*!fr-J<grd=ZkpjD[[
+!."Ec!."Qg!."9_s*=Tg"*\p2Fng(VFng(PFoQR\F89hX:JO^a:&n)h:'F?e9h\8Ur_*>c9`@Wb
+91o.UrC[)_r_38`s%<;ape1f`9MA)PrDW_o"Ar&o;cEWmr_r_ms&&bnr)!GlqGI8hs&8qqs&&eo
+!)`W3pMTnIs)@aOs).[O!-%gRrc%mUrc%gUr,DCMr,DXT!-8'Yr,N$`FED\LF`_a&Fo6F]GQ2pe
+GQ2pfH2W'gHiABmHiAEmIK+cqJ,XlsJ,OotJ,b$!Jc(,rKD:,tL%pE$L]3,.M>i;<M1TefE,TT/
+BkM&WAH,s7?M\%.@/aU2@f9g8AGKg:B)d_gM#E&0Q'Ra4PlR0GQii\@QC%T<r0dGN!1Wk#okXPC
+rb_RN!cN$srG_jYF8g7^Fa!b.Ed2kUH@($fIXcluJV/T.L5(J?M2R=PNfT9bP*D5tR$jG5SXuLJ
+U84W`W2ZeuXfnt7ZaI6N\[oGe^VI_'`5Td<b0/#Scd:(geCE1'g"P3:h;@/LioB+]k3(smlKdg'
+mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`noDX=@JcF4!J,~>
+JcC<$JcF*so)ARcrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp9[N!:'RJ#O(@6k2tde
+jSn0Kio/kSi8<GKh;-lA<)iZnpJh)kr)W2br`&\l+&XF=.4[)12)6g90J>(E5sdc&R$X)'P`q8m
+OH5E]2Z>Q?1H.Zi852rX:fI0fqGHubpJ^uhs&8hns&/nqr)!Glp/:rhpeg]^!)rho"]8/q;c?Tj
+;$'Qk;>sGo;,[?is&/\lr)3Pls&/kq!*&Yl!E;tp;?'Jl;&2tg2``lX3&roX2`EWQ2)R9O3&W`S
+2u5H32?,T22uY`62u>Q72uY`82ubf949dl.3]T5_48V/94TRZ,r]L-@!Bi[H56!_G4[8m/rB:-D
+mnj!Zs%r\j!)WMh!`2ZgrD3Jknkf<]r)!,brD<GirDEVmm8*RTs&&bls&&eooMbch!*0"tr_iep
+r_reqpeq/jr_ierohtiiq,78mrDiesr`B,%qcOD.;,C(b:esk\91hcK?![G9qHs50raGY4rF>e:
+q.9S<!`2cmr_WYlrDEYp<;oer<;0Am<;]\o<W,ns<W,knC@uBAD#S;LD?=`qE;abWEc_5%!HiSb
+GB.qRH?spcI=?ZrJ:W?*KSG5:M2@.LNK0']P*2&pQC+)0S"6.DTq\?ZVl6SpXKA\1ZEpsI\%0)_
+]t_A"_SjF6aND]McHjkbe'uq"f\,!5h;-uHiSrnYjlYail0@U$m-X60n*ol<o(2MGp%A%Pp\jme
+q>^<hqu6NlrU^#>s+14!s*t~>
+JcC<$JcF*so)ARcrVZQirqcZjr:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJ!pJh1roO7C
+jSn0Kio/kSi8<GKh;-lAgSXtHrhTOgrhB=arLj1_s.97]!1a%Xs-ikRs-NeQrg<_R!1<_Qq3W[_
+PCe=!SskanJVJo9YH=h&UnsECQ'@JqOcYWaNJrgQM1<.GMk>BKL5(ljOT:RBPPLC4Oo:C<Oo1=;
+Onb%8NrY4>N<#"8O8Fq>O,f9]oo/s1rJL]6M>i>2L\li+L&Qc!L%U0&KnP,3rIk0("'f&6=T)G$
+=Tqo1>$G*3r`B/"qGdPs<W5r"<E)ptr)<Vpr_req!`N&tr_rhrs&B2&='/U5ra5\5s'Gh6?![>6
+s'Pe4!+5_5!+#P0r`oS1>?q)1!*oJ,!Er_,>R"J=>?b?;I._gdH2DpdHiA9nH@(!bHiAEmIJeKl
+IK"TpIXh9GrI=Nks*k*#JV!fNqgn]t#(qS^K7ei1r.P9.LPUbCr/(l?MMm@MMi<USNK0"qNrG+>
+O9:W.P*>j/qj%,ErK[AJs-NbQrgEVOrL<hWpRV8Spn.PY%%2m"I<p'[F_u&5CiB;ZqHs50rF,P3
+raYn;q.9M:s0Vj6ricF*`;[aSa8a3\b59B]blZ,4bl,i\chqPNC]/)KD>eAPDuXeUEW:%ZF8g7^
+Fa!b.Cj:5OH@('gIXcluJqJ]/L5(M@M2R=PNfT<cPE_?!R$jG6SXuLJUSO`aW2co#Xfnt7ZaI6O
+\\#Mf^VI_(`Q#s>b0/&TcdC1ieCN7(g=k?<hV[8Mj5]4_k3(smlKdg'mI'H3nF?)?oCW%Ts7QHe
+rV6Egs8)Zjrqu`no_sFAJcF0uJ,~>
+JcC<$JcF*so)ARcrVZQirqcZjr:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJ!pJh1roO7C
+jSn0Jio/kSi8<GKh;-lAg\m!-M#<&+LA6H(K7\[RK):*#J:E%IJ,XuqJbssJ?>O"U<-<4s@UNbX
+B7tkdI<p7,Q'IStP*(ieNfB!VB4tV-L2qc\E-$2MrdFcprdX<ardFQhs*OZir-SHkrHn<eo6UI`
+qKN!crceEgp3?R^s*+WiG'.s,F9$I]FSp:VFS0bVFSg.XErSrA:/=V\:/=V[:]=,h9`\!_rCm>e
+92,7U"A;?Z92#1Ts%E>brCd/_s%E,\s%EAcr)<Pl"&Vrp;uKVo;uBPn;>jDa;$0]p;H!Kk##\;q
+:f1).photIs)@dPs).[Os)@mSrc%jTs)@mUrG_IMrG_UQr,VgY"*A^0FoHL\Fo6F\G5umeGQ2pf
+H2W'fHiJKnHiJKmIK+crJ,XosJ,XuuJ,b$!Jc(,qKDC2uL%g?$L]3,/M>`80M$\iVE,]`3CM@Bm
+rac"7qHs50rF,P3raYn;q.9M:s,$f4rItB=QBqH6s-EDH!gf4=rL!MNqjRFtokXMBrb_UOs)7pV
+rc.sY!-A-]!HiSbGAMMLH?spdI=?ZrJ:`E+KSG5;M2@.LNK0'^P*;,qQ^F21S=Q7ETqeE[Vl6Vr
+Xf\e2ZEpsI\@K5a]t_A"_o9X9aND]NcHjnde'ut#f\5'7h;7&IiT&tZk2tjjl0@U$m-X60n*ol<
+o(2MQp&F^cp\jmeq>^<hqu6NlrUg)?s+13us*t~>
+JcC<$JcF*so)ARcrVZQirqcZjr:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJ!pJh1roO7C
+jSn0Kio/kSi8<GKh;-lAgJmrJp/D#lqc<)ar`&_ms&(3k/h/;(2`<HF/28h46:4"%4[#-sQ'@Jq
+OcYWaNJrfR2(1OQ7n6AS;>3ua;?'Ph;u]ho;uBVp;uBPn;ZK_n;#jMf;u]bk;>!fe;uKSt;,U:j
+;c<?er_`bo;Z0Jm;Yj>i;ZBVo;ZBYq<;';m<)WWks%j(`3]]8[3]B&Y3B&qs2[))s2)[ERr\aj;
+2Dd;f2Z>Q92E*TTrAX^6rAXU5!&sj7s#9m=s#U0?!]iD)q`O[;!'C-Ar]:*CrB:9G4?`U+r&sp@
+oMGQ`r_WVj!)WJg!`2Zgr_WVlr(mAhq,%&dr)!)ar_WMir_`bo;!q-T:]OAl;#aDm;Y3of;ufqt
+<;oer;Z9Vo<;9Al;Z9Sp<:s2i<;KPn<;fhr<rQ/#=Sl8#=9;E!;>a5n9M7uK9`AAp?iFI3@JXI4
+A,Ts6Ac63B:f:3j;#jGk;ZB_p;u]ht<;KSu<)Z^p;cN`rrD`esr_r`0okXMBrb_UOs)7pVrc.sY
+!-A-]!HiSbGAMMLH?spdI=?ZrJ:`E+KSG5;M2@.LNK0'^P*;,qQ^F21S=Q7ETqeE[Vl6VrXf\e2
+ZEpsI\@K5a]t_A"_o9X9aND]NcHjnde'ut#f\5'7h;7&IiT&tZk2tjjl0@U$m-X60n*ol<o(2MQ
+p&F^cp\jmeq>^<hqu6NlrUg)?s+13us*t~>
+JcC<$JcF-tnc&LcrVZNhs8)`jr:p<ds7ZEa!qc*Urpp*Zs7$$V!q,ICrp0[OlMg&JkQ'fFjoOT)
+ro4RLiSi_Qhqm5Gh;$f?g=iC"rhTOgrhB=arLj1_s.0:_S=KSJs-inSs-WeP#+1aER@'A0rKmSO
+rg57'R!k-LJSCU>NeN%;Knuh5Wi;kjR[KD)PEM&iO,f3YN/EI:VSSO>I=m<2rf[;D!0[5CqNCN6
+!K`H@OSY+<OSY+7OSb+=NrP(=Nr"h6NW>.>NqJA3N;\Y8MM_=gs+gK+s+UH*p4`0o&VYmkK7nn`
+>[(H<>?Y06>?Y5/=U&&3>$G36=oMM+<*!%!<;]br<rQ(u<<?-"<;]Yp<;ohq<!#ut<;f`%<)lq!
+='/U5?XNe?ra5\2qHaD6?=.&I?sd4<?N+44>[(H<rEK;,r`]D,>Q.k0?!LT<r`oJ-q0Vp`rd4Wi
+r-SBi!.FfnrI"ZnrdFfrrIFfqpON9n!e>iQrdalsrIY'%"GDD[KS98Ws+UT1Ll)%e"cJ7rMMmDl
+N;\b6Nr>%=O91Q-PPpaCQ2QsGQ2[*LQiEHPRJNBOS,SrPSc,/TTDY>lS;DcDHZsXTDf9B-DdHcI
+?iFI3@JaO4A,Ts7Ac66>B*#EIrica3`5T^8a2c9AaN4A'rQG2b!mJj3rm(5`rbD%?rbVRNr,2OQ
+s)@sWs)J*\rcDt!G'A.TH$Xd`I!pElIt3*%K7el4L5:\DMi<XVO-,ThQ'I]'R[]h=T:hmQUo(&g
+WiN8)Yd(OA[C3TU]=bkm_8=+/`lQ9FbK\>ZdF-Oof%8R.gYCWAi8EVTj5oFckiq?slg4$,n*fc9
+rpg*]o`"Lbp@n=\q#C0iqY^6hr;HTdrdk*#s3gpt~>
+JcC<$JcF-tnc&LcrVZNhs8)`jr:p<ds7ZEa!qc*Urpp*Zs7$$V!q,ICrp0[OlMg&JkQ'fFjoOT)
+ro4RLiSi_Qhqm5Gh;$f?g=hC?rJ:B,r.b!##D@\[JV&K)JGt*#J:IQIrdXot"+buQJbjmM>\meT
+<-*"nA7/nWAqGV`IXHE_FDmD-P*(ieNfB!VMMYYgNHo8TEccMRIXZ]nrI4`qmXG1apO)serHeBg
+rd=ZkpjD^\!.+?`!."9_rd"Ng"*\p2FoHI_Fo6@ZFng(OFT?O]F8o&>:Jah_:B"#l:/=SZ:]4#h
+9htU\"&)E^8c)*d91hfL91hiK8kT(Us%NAar^m/`pe:]\s%N>hrDNYms&8hn!)rens&&_mr)!Gl
+pegufs%rkr;,L0f;>b>/DuXeODuX_ODZFbTDuFYSDuO_SEVseMEW'kQEVskWEs$N,G'3e+r,qp\
+r-&-crce?ds*=Qhrd4Zms*OcnrI"`rIt.EG!.XuurdOs!Jc(,qKDL8uL%g?#L]3,0M>`8.M$\i[
+EGoc5CM@Kqrac%8qd9>1rF,S4rF>e:qITV;rFZ.gM#E&0Pa7X7Plm>;QBq94!gf4=rg<SNr0mV"
+o5">Arb_RNs)7pVrc.sY!-A-]CisoFGBeCZH@($fI=?ZrJV&N,Knb><M2I4MNK9-_P*;/rQ^F52
+S=Z@GTqeE\Vl6VrXfen5Za@-K\@K5a^;%M$_o9X:aihlPcHsteeC<($f\5*8h;7)JioB(\k2tml
+l0@U$mI'H3nF?MK!V>s_o`Fj]p\ssfq>^<hqu-HkrUg)?s+13us*t~>
+JcC<$JcF-tnc&LcrVZNhs8)`jr:p<ds7ZEa!qc*Urpp*Zs7$$V!q,ICrp0[OlMg&JkQ'fFjoOT)
+ro4LJiSi_Qhqm5Gh;$f?g=l=%pJ_,mqGuu`r`&_m.T.TG.4Qu/2)6g90JG.G6U3h!4?GP^P`q8m
+OH5E]N/WXN/iu<f9MSG_rDWJhqGI5iq,@8lqc!Gmr_rbnr_ieprD<PmohtigpegQZs%rkr;c?Tg
+;>sGo;,[?is&/\lr)3Pls&&ns<)iQk&QDY+;)gQs3B0#\3&irX3B&tq2Zkoq2E:Um">qtk1c>+f
+r\a^6r]'m9rAOX6qDeF3s#9m=s#U0?s#L-AqE4d@!'^BF!B`IB4T7DL4?btn5!;"k5!M704T[f1
+4oIPF5<f'0q,%&ds%r\jpe_&g:]4)i;>j>k:\[cd:]!u_;>sDi;>sGo;,H[Vq+q&gr_WSks&/Mg
+qc*Djr`&Mgs&A_kr`&\l!*&nsrDrr"!*K,$r)aG/:f1"c;,C%_91hfN?=*M9ra>\5qdTM6rFGb9
+rFZ"@s&/hn!)WYm!)rkrr_rhs!*&ep"]SE!<)Zcq<W,l!<E)mqrbD%?rbVRNr,2OQs)@sWs)J*\
+rcDt!G'A.TH$Xd`I!pElIt3*%K7el4L5:\DMi<XVO-,ThQ'I]'R[]h=T:hmQUo(&gWiN8)Yd(OA
+[C3TU]=bkm_8=+/`lQ9FbK\>ZdF-Oof%8R.gYCWAi8EVTj5oFckiq?slg4$,n*fc9rpg*]o`"Lb
+p@n=\q#C0iqY^6hr;HTdrdk*#s3gpt~>
+JcC<$JcF-to)ARcrVZQirqcWirV6Ees7ZEas7H?_rpp*Z!:^!Vs6]mSrp0^PlK\B5!U/_Gjr!4@
+jQ#:[iSi_Qhr!;Hh;$f?g=k5VUnsmdU]."bU&L_bT)tUTSc5/YRg,=LR$jA0R/<6MQiNKPR/*'u
+D3BF&BUtHLK7\f3MQO"ZVPBoWR[0%lP*(ieNfB!VMM\@(aj,*ZKSPQdP5pdFOT:RBPPUI6Oo(7=
+OT:RDOo:C=Onb%8O8k7>N<#"9O8"\-NW4t:MZJ]lreUT0qhG*(s+L*"onEm/KO.ng?!CN=>[(<6
+r`^+@=^#!3>$5$6>Zk33='&=$<E<+!<;TZ!<`N*u<E9#tqbmPq;cEZp!`N&trDN\qr`/u""Bf/@
+?XNe?s'Pe3pg3u-s'Pn8?![G9r`oV2>?kG3>Q7t->Q7n+>6%q+>Q7t,>Q0!IH3/G>HN&9iHMi-h
+HiSTnI//0kIXh<Hr."HkrdXs!rdalsrIY'%"GDD[KS98Ws+UT1Ll)%e"cJ7rMMd>kN;\b9NrP+=
+NX1]+O-#HcP*2%.Pl$aDPl?sHQ3*D?R/WNNRf/`SSG/TRT(elSTF@EPJU;cgG&qV?C2@hc?i=C3
+@JXI4A,Ts7Ac66=B*)bS[/R96Xi/2t`lH.!a8j?ZaoKZbblZ,4bl5ofcN)8eci7bOC]/)KD>\;O
+DuXeUE<:0%F8g9*F`qtQG^4U]H[L6iIXcm!JqJ`1L51SAMN!LSO-#KePa.Q%R$sM8StD^NUnjlc
+WN*&%Y->1;['mHS]"G\i^VRe*`Q-'AbKS8Wd*^=le^rF+g=tH>hr*JQj5f=akNM0plg4!*mdKW6
+nac8BoCV_Kp@e7TrqQNhs8)Zjrqu`noDX=@JcF0uJ,~>
+JcC<$JcF-to)ARcrVZQirqcWirV6Ees7ZEas7H?_rpp*Z!:^!Vs6]mSrp0^PlK\B5!U/_Gjq["=
+jQ#:[iSi_Qhr!;Hh;$f?g=k5:r.t?-r.b$$%YTOhK7\Z*Jq8H&JUr?$rI4`qoRJGmCgUXOFE)&)
+@:Nh]K7\N!H?aUUEG]BPOcYWaNJrgRM0sN1Rqlk]FEr<6If=coIfFobIK4fiI/eQkHMr3gI/eQl
+HiSNlI.VadH?o70s*=<_s*=Wh!I&_dFoQO`Fo6@ZFng(OFTQZ+;>sAq:Jak`:JUg`!_lEcrD!Af
+:Adfl9MJ,O8P2QH9DqH`91o1V"%l-V9)_K`9`7W_9(u$Z9*%^crDWYms&&epqbdDmrDNVlr_iYk
+!)iShrDNYm"B&)o:f.*fr_NT4r,;RRq/?:NqJQ@QrGVUQs)7mUrGhaSpMp.NqJlFRs)\3^!HrVb
+FSp:ZG5QOaGl;jdGlN'fHMr0jI/\HmI/SKnIK4lrIfFotJGt&uJGb#oKDU>uL%g?$L]3)0M>N,+
+M%#)`EH#i6CM@KqA7]<K?i=C3@JXI4A,Ts7Ac66=B*)b(M#E&0Pa7X7Q2R$CQi`V?Qi<BLRJiTS
+C@c6>D#S;LDZ=YTE;jhYEcZ=$FE_kNGB\:WH?spcI=6QoJ:W<)KS>/9Ll%"JN/is\OckroQC+&.
+S"6.CTq\?YVPgDnXKAY0Z*UgG\%0)_]Y;.s_SjF6aN;WLcHaeae'uq"f@em4h;-uHiSrnYjlYai
+l07O#m-X60n*ol<o(2JFp%A%Pp\4[^s7u]kr;6KkrVc?eJcC<$df4g~>
+JcC<$JcF-to)ARcrVZQirqcWirV6Ees7ZEas7H?_rpp*Z!:^!Vs6]mSrp0^PlK\B5!U/_GjqQq<
+jQ#:[iSi_Qhr!;Hh;$f?g=k6T<W#hr;u]hs<W?)"<W6%c<W#ho;^s=O-n?o.2DHg90JG.G6U<n!
+4ZbY`2`-\[OH5E]N/WXN1Hn-%9MeSa;Z0Ph;YX)h;YX2j<;TVl<<#np;ZBYq;Z0Jm;YsAm;Z0Mo
+;YX,Y;?Tip;H$Kf;>sJj;?'Po;ZK_o;uBPn;?'Mq;cH`i<W>/^4#m4"#rjq*3&s#Z3]K+r2Zkoq
+2`Udp!]N"qrA+I22>K002#oQ53;tl92Z>Z33;bZ82a..&#!4k+3BB2_q)e[@55m_F49.JB4T7DL
+4?btn5!;%k5!M7.4TIVA55dYE55nCX:]=2j:B45e;$'Qi:]=/j;>j>j:\did:]+&`;>sDi;>jAm
+;!q-T:]OAk;#aDm;YF&b<;KPn<:j,h<;0>i<;KMn<;]bq<rZ5$=Su=t=:A8/;,C(d:f'n[8kDbS
+?i=C3@JXI4A,Ts7Ac66=B*)aE;Z9Mn;#X>m;uTbq;u]kt<;TYs<)Z`p<;onr<!63#;eg(=C]/)K
+D>\;ODuXeUE<:0%F8g9*F`qtQG^4U]H[L6iIXcm!JqJ`1L51SAMN!LSO-#KePa.Q%R$sM8StD^N
+UnjlcWN*&%Y->1;['mHS]"G\i^VRe*`Q-'AbKS8Wd*^=le^rF+g=tH>hr*JQj5f=akNM0plg4!*
+mdKW6nac8BoCV_Kp@e7TrqQNhs8)Zjrqu`noDX=@JcF0uJ,~>
+JcC<$JcF0unc&LcrVZNhrqcZjr:p<ds7ZEa!qc*Urpp*Z!:]sU!Uf@Sm/QAOlMg#Kki_s-)!0i>
+j5].YiS`YOhqm2FgtUT;g=b,SV5=0drhB:`rh0:`!M5k[SH#&ZR[O)@qj.;Kqj.;Kqj/gMP(J=#
+S<]%fJ;/c5Y-"UuV4a<GP)Y?VL4kVKNJrgSM5$$:T6Pg=L67`"P5pdFOT:RBPQ$^FOo:I9Ont15
+OT:L>Onb%9O8b1>N<#"8O84h-N<"q:MZJ]lreUT0qhG*(s+L*"pP/NMs',M.#?k56>?kB:=oDM1
+=^#'7=]nj.=&]*!"]\N#;cH`o<W?,"<<#tt<;TSq<)Z`p;ufkr<;ohr<<#tu<s2W7@:3IA@/jU6
+?2%\*?NX\C?=!P:ra#P/!F8t.>6%q->Q7n+>Q7t,>Q7t->6%q->Q/pKHiA?jHiA?kHiJHnHiAEm
+IJnQmI/n`qI0+kIJ,XurJ+eEmIfY(NrIFcrrdt0&s+CB)re13'",;SeM>W52MuAM5MuJ\5N=Co-
+NK0$[NfT6_OHG]irKR5Fr07/Frg!VPR$dl@qjRJQrLEVQrgrkVq4J.gNdc>'G'7qHD/=!+r*TG2
+raGY4raYn;qITV;r+H"B!O]<6YQh5J`Poj;a8X-[ans3\bl5igbfe60cMu2jcMZ#XC]/)KD>\;O
+DZFbTEHZADF*)MHF`qtQG^4U]H[L6iIXls"JqJ`1L51SAMN!LSO-#NfPa.Q%R@9V9StMdOUnsuf
+WN*&%YHY==[C3QT]"G_k^r""-`Q-'BbKS8XdF$Fmf%8R-g>(N@hr*JQj5f@bkNM0qlg4!*mdKW6
+nac8Bo`"O`p&Ojcq#C0iqY^6ir;HTdrdk*#s3^js~>
+JcC<$JcF0unc&LcrVZNhrqcZjr:p<ds7ZEa!qc*Urpp*Z!:]sU!Uf@Sm/QAOlMg#Kki_s-($4N;
+j5].YiS`YOhqm2FgtUT;g=b-UM#N2.LA?Q&K`?Z,Jq8N)r."csqgSQpr."csqg^.sCg^[OFDkl(
+?Y!YXK7\MuHZsURDJNs!AR^^]NJrgSM0X)lI;<_BFF*q7s*jrqr-eWqm=#%`qgAElrd=`mr-J<g
+pj<0jI!g;?I.M[bHMDaaH1lL_H2i*iGBWt.!d&R-r,hjZpiQ7Qr_Wbo;,L0g:BF9e;#O/k9hnL_
+:'"'arD!;b#>If_8P;ZJ8c)-X9*e-]8P2TJ92&%W9E%N`9DD3[9E.uj;uKVo;#sQnp/:ler_iYk
+!)i_l!)WYlrDNYm!)ien!)WVks%ihq:f1).rc%XNs).^Ps)@pTrG_aSrc%jVr,D@Lrc%[Qr,Ms^
+FED\LFoHL\Fo?L]G5umdGQ2pfH2MsjH[:$drd+Wmr-\TpJ,F`sIt3(JIfP#sK)(&pK_pJtLAlu&
+M"ul9L3moZE,KH*BP1jdAc,p7@/aU2@fBm9AGTm9B)H<@BE=!IrIt<:r07AMQ^4!:QiNKNQi`V?
+Qi<BLRK&`FC]/)KD>\;ODZFbTEHZADF*)MHF`qtQG^4U]H[L6iIXls"JqJ`1L51SAMN!LSO-#Nf
+Pa.Q%R@9V9StMdOUnsufWN*&%YHY==[C3QT]"G_k^r""-`Q-'BbKS8XdF$Fmf%8R-g>(N@hr*JQ
+j5f@bkNM0qlg4!*mdKW6nac8Bo`"O`p&Ojcq#C0iqY^6ir;HTdrdk*#s3^js~>
+JcC<$JcF0unc&LcrVZNhrqcZjr:p<ds7ZEa!qc*Urpp*Z!:]sU!Uf@Sm/QAOlMg#Kki_s-($4N;
+j5].YiS`YOhqm2FgtUT;g=b-R<W,nr;uK]!<`N.#<r,hr<;]_r<;KVp<&%BP<)Zap;_0UP.P3S9
+0eP%30/#XX5s@Fp4#o5X2)?s@O,o9ZN/NNL4??#-;,:%gr)<Agpe_#hpf%2lqc!Dls&8hns&/nq
+r)!GlqGRAlr_ieppJLHY"Ar&p;c<?er_iVjs&/kq!)ibor)3Pls&&ns<)i]o#<Y(14$>\c3W:uC
+3]K)[3B0&ZqDSd>2E*TR2)[BO2D[8h1B9912?5]82Z>Q72E1Upr\sg7r\s[5!&sg6s#pBE#!4k+
+3BB2_pcJXA5!;(+4T.>B4[8p0"?ek05<es-!'L*ArB19J5!;&)r_WSipe_&g:]=2j;>j>k:\did
+:]+&_;>sDi;>sGn;=76U:]OAk;#aDm;YF&b<;KPn<:j,g<;0>j<;BJm<;ons<rZ5$=Su=t=T;G2
+=A_pl;,U4e:.n2M9Di/r@/aU2@fBm9AGTm9B)H<@B`D!0;#jGl;?Bcr<;oet<)lrt<;]_t<)Z`p
+<;onr;ufqfC]/)KD>\;ODZFbTEHZADF*)MHF`qtQG^4U]H[L6iIXls"JqJ`1L51SAMN!LSO-#Nf
+Pa.Q%R@9V9StMdOUnsufWN*&%YHY==[C3QT]"G_k^r""-`Q-'BbKS8XdF$Fmf%8R-g>(N@hr*JQ
+j5f@bkNM0qlg4!*mdKW6nac8Bo`"O`p&Ojcq#C0iqY^6ir;HTdrdk*#s3^js~>
+JcC<$JcF0uo)ARcrVZNhs8)`jrV6Ees7ZEas7H?_rpg-\nF6GG!q,ICrp0[OlMg&JkQU/3k2k^c
+ro4%=iVqaFhqm2Fgt^Z<g=b-1f;5;BU]."cU&L\dT:VVPS->CPS"#k7r0[AJrKdGLs-ESL.;=]j
+K:SKsMhle8L52n5VPU)^SX>V%M2?t>JU`Z<N/NO"R^JZ4JVJpXPlHsIP5g[EP5LODP44S7OHKI&
+mZI:+qiCc;s,@#=qN(B2oo/s1regu<M27"ELPPb]re:B*p4`?t!*oJ.s'5S0$<pb>>Zk36>?kB:
+qH=S<>$5!1=BAF&='TE[BN8#1<)cjsr`/u!"'&<#<W5tl;[$0#;c?Xpr_rhrs&B8(=(#KH@:0"A
+s'Gh6?![84ra5\5!af5=ra,V1r`fG/r*'/+rEB8*r`fD-s'#S/>?kG4>6%q,>Q7n,HN&9iHN/<n
+I!^5>HiSTnI/\O"IXQZnIXZcsJGOciJH(*#J:W:NJGXosK)UB*KS+o1K`$N,L51SAM>W52MuJV6
+MuJ\6N<#"<NW"kAO-#HcP*;+/Pl?pKPa202rK[AJ!gf:ArgEYPrgWeTpmqGVoq2&Q%ABGUIscTe
+FE;J>C2K.5?iFI4@JXI4A,Ts7Ac66>BDQ9A[/R96Xi/2t`lH.!a8j?ZaoKZbblZ,4c2Q#gci;;i
+cgbfLD#S;LDZ=YTE;jkWEWC1[F9-N-rc`""H$Xd`I!pHnJ:N3'K7nu6LP^kGN/`jYOHPflQ'[l+
+S"-%@TV8-VV5L8lX0&P.Yd1UC[^`l[]Y;.r_Sa@4aN2NIc-FY_daZdtf@\g2gtgiFi8WeWjlY^h
+l07L!m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6Hjrr)HfJcC<$dJn^~>
+JcC<$JcF0uo)ARcrVZNhs8)`jrV6Ees7ZEas7H?_rpg-\nF6GG!q,ICrp0[OlMg&JkQU/3k2k^c
+ro4%=iVqaDhqm2Fgt^Z<g=b-1fDLI(L]3&(L&Qc)KDpK#J,k)qIf=irJH(,sJ1=K0?=J)!DJ3Te
+@q9/&JphulG]n+GChREk@:EZ)N/W[O>'GUICiFH<Hi8BlIfFioIfFocIfFioI/\QoI/eQkHMi-b
+HieYBHiAEaHN8BeGlE!^GlN'hGlMskG'.qLF`m\*!HWA\Fng(TFT>><;?'Gn;,Hs^#Yn/k:/=V[
+9ht[^!DH,b9+"Ep?<9fm8kDTH8cD?[9)qT`8H;B^9)qZ`9E%N`9DD3\9)qoi<;ohr;?]oq;,L7j
+p/:ofrDNPj!)ibm!)WVkrDEYn;Z9Mn;#O8k:^0cn;,L4f;#,&0DYe8OE;a_RDusrsDuO_UEVaYK
+EW0qQEVsh\F*)MHG'3e+r,qp\r-&-crceBerd"Hg!IK.iHi/<gIfFltJGjruJ:[ZNq1JKrqM"Zu
+reL6(pPB9+EcH#7CM@HpA7U,f?iFI4@JXI4A,Ts7Ac66>BDQ9AM>`//Pl-dKQC!o(rKmSOr0RPP
+QC%T<qj@GQnSA)>rb_RNs)7pVrc.sY!-A-]!HiSbG@u/GH?spcI=?ZrJ:W?*KSG5:M2@.LNK0']
+P*;,qQ^F21S=Q7ETqeE[Vl6VrXfek3ZEpsI\@K5a^;%J#_o9X:aND]NcHjndeC<($f\5'7h;7)J
+ioB(\k2tmll0@U$mI'H3nF?MK!V>s_o`Fj]p\ssfq>^<hqu-HlrU^#>s+13ts*t~>
+JcC<$JcF0uo)ARcrVZNhs8)`jrV6Ees7ZEas7H?_rpg-\nF6GG!q,ICrp0[OlMg&JkQU/3k2k^c
+ro4%=iVqaDhqm2Fgt^Z<g=b-1fD/GG<;oer<;KSp<r,hr<;]_u<)Zaqr)NSm),i%<.4R>:1bgU6
+0JG.I5sRUr5!(ba2`3Dj0b,msN/W[O8No1+:Jakd;Yj>e;Ya2i;Ya8j<;]\m<<#np;ZBYq;Z'Al
+;Yj;l;Z9Vp;YX,Z;ZBSq;H$Kf;$'Wo;Ys>j;?9]orDWVls&&eo!E2tq<<53Dr]C<F4?PVbr\t!@
+3&itu2uku82ubc>2`N`R3&ggp"$/D"2#T312#T?42uY`72#oT63<(r:2Z5T32uko92?5l=4o[YE
+3r_5?3WM8;4T@VE4o7A@3se&65<_7o4?Pekq`OsB4o7GA4UF>:5!;%k5#4sNq,%/h:]4)i;>j>k
+:\[cd:]!u_;>sDi;>sGo;,H^WpeUrfr_WVlr_iSk!`Drqq,I/g!*&VirD`Mir`&kq!)i_n!*&ns
+r`0##r)s&%s&]/$s&T_3='/R&;G^1e:eshZ8kMbU?iFI4@JXI4A,Ts7Ac66>BDQ<?;#jGl;?Bcr
+<;oet<)lrt<;]`!<)Z^p<;onr;ufqgC]/)KD>\;ODuXeUEW:%ZF8g7^Fa!b.B6\]JH@($fIXclu
+JV/T.L5(J?M2R=PNfT9bPE_?!R$jG6SXuLJUSO`aW2co#Y-5(8ZaI6O\\#Mg^VI_(`Q$!?b0/&T
+cdC1jeCN7(g=k?<hVd>Oj5]7`k32'olKdg(mdKW6nc&([oCW%T!quB_rqQNhs8)ZjrVZZnoDX=@
+JcF-tJ,~>
+JcC<$JcF4!nc&IbrVZQirqcZjr:p<ds7ZEa!qc*Urpp*Z!:^!Vs6]mSrp0mUlK[Wukih4/joOT)
+ro4OKiS`YOhqm2Fgt^Z<g=b-XfDhZGU]."eU&L_bT)kOSrLEkV!h,OFr0[AJr0@>LrKdDK.qsrk
+K;"d"NJ)b9LM3imVPU/_R[B8!MM[(@J:ET=NJiX%CR0'iJVT#FQ2[$IP5pdFOT:RBPQ$a7Ont1<
+OoCO;Onb"=O,j1"rf7#<qN(B2oo/s1repf6s+pf5LPPb]re:B*p4`L#!aK&<r`on:?!LW?>[(H;
+>Zt;0>Q7k/>?P-6r`Tk<>$5$3=BJO;H\RN<MhuRcrDWet<;ont<Wc?$<E8uspf%#gs&8qss&B5'
+=(#HG@JsU6?NOP>?2._/?sd;L?iF@2?N4=1>lS+.>Q7t->6%k+>Q7t.>6A&5>[7)/s'#G*s*O`k
+s*FfpH[Ga>s*ains*alq"atiKIt3(GJ+nKmJ,b*!JGXorK)^H+KS+o1K`$Q(L'!-dM>W57Mi*FM
+Mi7RnrJgi;s,Hu;s,[2A"Hek2Pa)-3qipuCs-<eSR$a;0qO7DQqjdGPs.8nUpn/.kU7mZuH[C$[
+EcGu3Cm&0)@/aU2@fBm9AGTm:B)H<:BF2&NYct7J`Poj;rQ"u\qoSo_rlkMgbK^%3!71Vh!717P
+r+u@Lr,2OQs)@pVHua:LFEDYJG'A.TH$Xd`I!pElIt3*%K7el4LPUeEMi<XVO-,ThQ'Rc(R[]h=
+T:qsRUo(&hWiN8)Yd(OA[^WfX]=bkm_8=.0`lQ9Fbg+M\dF-Opf@S^0gYL]Ci8N\UjQ5Oekiq?t
+m-O--n*fc9o()DDo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$d/SU~>
+JcC<$JcF4!nc&IbrVZQirqcZjr:p<ds7ZEa!qc*Urpp*Z!:^!Vs6]mSrp0mUlK[Wukih4/joOT)
+ro4OKiS`YOhqm2Fgt^Z<g=b-XfDLI(L]<,)L&H])KE$Q'Jc1*!J,+QmIfP#tJ,OmH;eTHFG]Rb;
+@p`bX=+c*RI!g-\Ec5c.An5@Y@;0FjMhtVEH>7;;F`dM/rdOipr-eWqm=#%`qgAElr-\Hhqg8-d
+"+,EBHiAEbHNAG<q0;map3?U_rceWkG'.qLF`m\*!HWA\Fng(XFoG;<;$Kio:f("c;#3uf:B+*$
+:/=V\:/4MY9MA/S8kW5pB`;fLCL:$>9)_E]8c_RWr_!5`r^d)^r_*8brCd,^s%E/]s%EAjs&Atr
+s&'"t;Gg:i;ta,h;>jDj;?'Pi;>jAs;,U:h;,C*f;>sDl;#jMn:]OAjDZF\ODuXeTDu=PSDuO_U
+EVaYKEW0qQEVskWEs$N,G'3e+r,qp\r-&-crce?ds*=Qhq0W$fq0r3js+1-#q1JKrqM"ZureLK/
+!/^T/pPBB;M1'A_E,KK+C1h$fI:)t]raGY4raYn;qITY<r+Ge<!/^Z/!0mGIs-EYNrg<\OrKmYQ
+QC%T<qjI%kr+u@Lr,2OQs)@pVHua:LFEDYJG'A.TH$Xd`I!pElIt3*%K7el4LPUeEMi<XVO-,Th
+Q'Rc(R[]h=T:qsRUo(&hWiN8)Yd(OA[^WfX]=bkm_8=.0`lQ9Fbg+M\dF-Opf@S^0gYL]Ci8N\U
+jQ5Oekiq?tm-O--n*fc9o()DDo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$d/SU~>
+JcC<$JcF4!nc&IbrVZQirqcZjr:p<ds7ZEa!qc*Urpp*Z!:^!Vs6]mSrp0mUlK[Wukih4/joOT)
+ro4OKiS`YOhqm2Fgt^Z<g=b-XfD/GH<;f_q<:a,i<;fhs<;oer<;fhm<%BFN-S%8;1bpX50JGIR
+5sRUr4ZbYa2`3BG1,(C?2)U;K8P;ZM:Jk(i;H3Kkpepla!)iVkr`&bnqGdDkr_ieprD<PmqG[Dl
+r_ieppJLKZs%rkr;c?Ti;>jDh;?'Mp;c<Qmr)3Pls&&tu<)l(Cr]CEI3]oJd4?5M&3!VH'3B9&Y
+2`gan%lQ@+2`3TU4$,Sh4?GS_2#T321c>4i!&sm8r\X[6rAag9rAOX6qDeF3s#g<Es#^KI3]T2]
+3]m."!Bi[H4oRPF4$5Y)3se#55<h=p4Zkklq`OsB4o7GA4oRYF4Tdf05=#$As%iVj!)`Yjs%iGe
+r_NGgpJLodr)*Gk!Du\]:\dfe;>sDk;?'Pj;Z]iq;u'DZ;uK\i;uK\q;ZK_n;u]hr<W6&!=T)D&
+=T;J$=T;J&<Y/>7=]eR":f'qa:ejYT91rXk@/aU2@fBm9AGTm:B)H<:B`1d.;#X>o;cH`q;Z]ou
+<W,nq<<6&tr`&ksrD`B(r+u@Lr,2OQs)@pVHua:LFEDYJG'A.TH$Xd`I!pElIt3*%K7el4LPUeE
+Mi<XVO-,ThQ'Rc(R[]h=T:qsRUo(&hWiN8)Yd(OA[^WfX]=bkm_8=.0`lQ9Fbg+M\dF-Opf@S^0
+gYL]Ci8N\UjQ5Oekiq?tm-O--n*fc9o()DDo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$d/SU~>
+JcC<$JcF7"nc&IbrVZNhs8)`jrV6Ees7ZEas7H?_rpg-\nF6GG#O_!Hm-O'(lMg#Kki_s-!TiDA
+irS/urnmh7hYu=7gtUQ:g"?;U!nO0CrhKIes.TIcrgs4_Sc5/ZS,SlURJiNNQh6UDQS4_bK7]ee
+PDt3DK8=3BXehqkTpqF5Nf&UIKn,&@NfB'(@r-(+IY<K9Pa%GuPa)02!0[>D!0[8DrfZc5qN1W;
+r0$l<plP?5s,R)<qiCN4oSij0rJLi:M2@%DL\li*L&Zi"Ka)^+?!^cB?N".<>[CZ>>[(E9>$G37
+>Q%_9>?Y67>Zt96=BK6^NfT-Yr/1W-DHm*>s&B%ur`',&<E3!u<W5tm;ZTitqc*So!*&qts'P_5
+rF#Y4s'5Y3?i"+-?iXR4>ln><?2e+/?2\"->lIt->5h_2>[(E9>?b?;rEB>,>?h)1#[(85H?spb
+I!bg>!.FfnrdFfq!e#NHpODmes*k'"Jc1,rJc:9$K*6j[K7npUL&Zl:LPUeEMM[4JMi*FMMi7Rn
+rJgi;rf-l:#`k(/OckolPa)04qipuCs-<eSR$a;0qO7DQqjdJQrgrhUq4Ie]TV;@Z%&&f7I!^-]
+Ec>r4Cm4j+raG\5rF>h;qITV;rFbn=rb2J>Yct8/`<"!!rQ"u\qo\l^s2tDerltMirQb%Nr+u@L
+qelFPs)@sWs)J*\rcE.&G'8(RG^4U]H[L6iIXls"JqJ`1L51SAMN!LSO-#NfPa.Q%R@9V9StD^N
+UnsueWN*&%YHY==['mHS]"G_k^r!t,`Q-'BbKS8XdF$Fme^rI,g>(N@hr*JQj5f@bkNM0qlg4!*
+mdKW6nac8Bo`"Lbp@n=\q#C0hqY^6ir;HTdrdk*#s3Udr~>
+JcC<$JcF7"nc&IbrVZNhs8)`jrV6Ees7ZEas7H?_rpg-\nF6GG#O_!Hm-O'(lMg#Kki_s-!TiDA
+irS/urnmh7hYu=7gtUQ:g"?;U!nN0areUQ/!/C<'re1<(rdt-#rdXuupjW!fs*u&.BOY@nF)>W#
+?X[MIJqAAuH['[RDej&tARf-IC&_oR<E`gABl.j2GkldfIf=cYIK4fnI/eWmI/\HmHMW!bI/SEk
+I.VadH?o=2rd"3^rd"Ng!I&_bFoHI`F*.;%q/cXA;uTYq;,[9gr_WJfr([>i9hnI_:&R`f<+0W]
+qJ6FM>#%[^8P)NGrCR;f9M7uM8P)PQ9)qZa9DqK_9DV<^9Dqch<;ohr;?]oq;Gg=jp/:le!`Dln
+r)*Jlq,.)gs%rns;,L.drDEMir_`\ls%rkpDf0IhDZFbTDu=SSDt\/DEW:"REVskWF8p=_G'3e+
+r,qp\s*"QgGB\<2GQ)jeH2W'hHNJM?HN&6kI/SKhIf"TrJ:W:NK)(&oK_pJtLAco&M"cc+MZ8M@
+I;s4FDJNs#An,D$ra>_6qdTM6rabk:rFZ"@ph9Y@rJ(68s-EYNrg<\OrL!VN!13\Pr0d1mr+u@L
+qelFPs)@sWs)J*\rcE.&G'8(RG^4U]H[L6iIXls"JqJ`1L51SAMN!LSO-#NfPa.Q%R@9V9StD^N
+UnsueWN*&%YHY==['mHS]"G_k^r!t,`Q-'BbKS8XdF$Fme^rI,g>(N@hr*JQj5f@bkNM0qlg4!*
+mdKW6nac8Bo`"Lbp@n=\q#C0hqY^6ir;HTdrdk*#s3Udr~>
+JcC<$JcF7"nc&IbrVZNhs8)`jrV6Ees7ZEas7H?_rpg-\nF6GG#O_!Hm-O'(lMg#Kki_s-!TiDA
+irS/urnmh7hYu=7gtUQ:g"?;U!7psG!*&nqs&AVjs&Anr!*&qrs&Attq,A@i/Li512Dd0@/2&\:
+6U<n#4$>Yc3B&fN0etF?2Z>Q>77U$G9i"Vb;Z0Sl;ts8c;#jMh;u]ho;u0Jm;ZK_p;ZK_o;?'Pk
+;u]bp;ZK_i;#sQnoMY]ds&&kr;Ya2g;Yj8j;?9]or)<Pls&&eo%Pg114$5Sf4?P\f4?GSbr\t'B
+3''&Z3W;#82uY`82[q`/4Ztnj4Zb_f4?GP]r%e=0rAO[7r\jd6!&jd8s#9m7r\s[5r\j^;!'U<D
+#<Fk*3]]>b4o.8C5<_4nrB(*B4T7DL4?bto5!D+l4[2(+4TIVA55[SD56!eG49If55<o*D!DlSe
+;#a>e:]aEf:]+&_;>sDi;?'Mp;,H[Vr(mJk:f($g;#X>l;Yj>l;?0Yk<:!Q]<;0>j<!#ur;Z'Jn
+<;ons<WQ9(r`T8'r`B)$s&]2#!EWD&=U\D0;,C(b:f'k[8P;bV@/aU3@f9g9AGTm9B)QB;B`;`F
+;#jGl;?Bcr<;oet<)lrs<;fhs;uTbq<W5tiC]&#JD>S5NDuXeUEW:%ZF8g9$F`qqPGBeCZH@($f
+I=?]sJV&N-KnbA=M2I7NNfT9bP*D5tR$jD4SXuIIU84W`Vl?\tXfnt7Za@0M\[oGe^VI_'`5Td<
+b0/#ScdC.heCE1'g"P6;hV[8MioB+^k3(smlKdg'mI'H3nF?)?oCW%T!quB_rqQNhrqcQirqu`n
+o_sFAJcF*sJ,~>
+JcC<$JcF7"nc&IbrVZQirqcZjr:p<ds7ZEa!qc*Urpp*Z!:^!Vs6]mSrp0[OlMg#Uki_-kk2k[b
+j5].Xrnn.@hVI#CgtUQ:g"?;U"4l#PV#I.hUApqeT`1S`SckUSS=?#IRf/ZSR/<6HQ2m3IQ5u<V
+LkBK;Ss>1cI>3SkXKA=rUS+'EQ&^]WL4k&7rf%5E>[qViGC>.!OStCDQ2[$JPQ-gGOoLUBPQ-g8
+Ont1;Oo(=;Onb%7O8k7?NVee3NqA;2N;\Y<MM[1GLPPb]re:B*q1T0$G^*M"?<gfC?!dJ8s',_5
+>[(B8>PD;0=^,*5>%DuBOH>N^N;8A4HY<=Ws&K(us&K)"rDihrpeq;p<E3!ur`&nrs&B"u"^YPE
+@:E[D@/jU6>le8=qHa//ra5b6?M[t->lS+0>Q7k->?q/3s'#G,!Erb->6A&5>[753!*]A+s'#A(
+"'U)!HiABmIJnQnIJSEeJ+nKnIfY(NrIFcrrdt0&!ec2Yre13'%YfapM2I1IMMd=LMi*CMrf$c7
+!07&<rJpo=#*=t1P*;,prg!AFqj%2Is-NbQ!1E_QrgW_RqORVWp7M/R!hZ-Zr1XXoOb.t,G'.hE
+DeX!NM>gr[@fBm:AGTm9B)QB;B`)QMZ*:I7`l5p:a8O'Zao9H_aT0K^c2Yrec2Puicd'i/C\qrH
+D>\;ODuXeTE<:0%F8g8tF`qtQG^+L[H@($fIXcluJV/T.L5(J?M2R=PNfT9bPE_?!R$jG5SXuLJ
+U84W`W2co#Xfnt7ZaI6O\\#Mf^VI_(`Q$!?b0/&TcdC1jeCN7(g=k?<hVd>Nj5]7`k32'olKdg(
+mdKW6nc&([oCW%T!quB_rqQNhs8)ZjrVZZnoDX=@JcF*sJ,~>
+JcC<$JcF7"nc&IbrVZQirqcZjr:p<ds7ZEa!qc*Urpp*Z!:^!Vs6]mSrp0[OlMg#Uki_-kk2k[b
+j5].Xrnn.@hVI#CgtUQ:g"?;U"4l#PM>i>2LB*)*L&H])KDpK$JcC8rIK4fqIK=qIqgTT9DIm9Y
+H#dh:@:!GT=+Z$OI!U$ZFE))0ARo7Xrb2^SBieJJASZ1(FF!Y0rdOlqkC*DZqgABkrI"9br-\Kj
+"FPQCI!kR5s*=ZjqKVsap3?U_s*+QgG5QL^F9-H)qfVgYra#P&r_ibn#Z=Mr;,:"b:Jgm`r([_t
+9heAX9MADpDJsH2Ci/ua"(G;'9)M9[8dJ'`91qlK8P2VS9)qZa9DqK_9DV<_92baf!*&qrs&'"t
+;Gp@i;ta,g;?'Pk;?'Po;>sDk;>jDm;$9co;,C*f;?'H#;,C+e;G^1e;G^1eqelIRrGVRP!,qOL
+pMp4Ppi67Qs)\3^!HrVaFSp:[G5lagG'A.TrHJ9ds*=Ng"+,?@HN&6kI/SKhIf"TrJ:W:NK)(&p
+K_^>sLAQc%M"lf,MZ/GBMMZ_%EH#c0Bk_0hA:87m@JXI4A,^$8Ac66>BD?0<C&WheL&@59QN!6M
+R/WHNR/`HPQi<BORIt@mD#J5KDZ=YTE;abXEcZ=$FDQ)CGB\:VH$Xd`I!pHnJ:N3'K7nu6LP^kG
+N/`jYOHPflQ'[l+S"#t?TV8*UV5L8lX0&M-Yd1UC[^`l[]Y2(q_Sa@4aN2NIc-FY_daZdtf@\g2
+gtgiFi8N_VjlY^hl07L!m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6Hjrr)HfJcC<$d/SU~>
+JcC<$JcF7"nc&IbrVZQirqcZjr:p<ds7ZEa!qc*Urpp*Z!:^!Vs6]mSrp0[OlMg#Uki_-kk2k[b
+j5].Xrnn.@hVI#CgtUQ:g"?;U!nPoOqc*VqrDW_qo2Pcir)E_rrDWVoqG\Ii/1NA72`*6?.ki\;
+6U<n#4$>Yc3Ar`M0etF?2Z>T67KuO\:Jane;uBVk;ts8d;?'Pi;u]ho;u0Ji;u]bo;#jMj;u]bq
+;ZK_i;#sQno25]g;GpFkq,.)gqGI8j!E2no;uKSt;(sa\4[&a+"?S_-4?WU(r]'p<!':*>r]'j8%
+Q67)2E!NW5<_7o4?Yehr]C-B!^/V(r%e@12?#N62uY`82?,T53<(r:2Z>Z33!2)t2EUn#!'U<Ds
+#L<D3]]>b4o.8C5!M1nrB0s=$9^U<5!D+l4?ktkr&k$Bq`ap@!C&dI4UF585X7Ou5Z(<Qq,%)eq
++q/h:/=[`;"mid;#F2i;?0P]:]+#k:JakbrD<Mks&/\ls&&hqq,H]Zr)EGir`&nrr_iYm!*&qts
+&T/$rE9/&rE'#$s&]2#!EWD%=oVS4;,U4e:/=_]91_`L2u[7^@fBm:AGTm9B)QB;B`)TD;$Kiq;
+GpFm<;oet<)lrs<;fhs;Z]ou<;okt<:t&(D#J5KDZ=YTE;abXEcZ=$FDQ)CGB\:VH$Xd`I!pHnJ
+:N3'K7nu6LP^kGN/`jYOHPflQ'[l+S"#t?TV8*UV5L8lX0&M-Yd1UC[^`l[]Y2(q_Sa@4aN2NIc
+-FY_daZdtf@\g2gtgiFi8N_VjlY^hl07L!m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6Hjrr)HfJ
+cC<$d/SU~>
+JcC<$JcF=$nG`@arVZNhs8)`jrV6Ees7ZEas7H?_rpg-\nF6GG!Uf@Sm/QAblKRQski_*jjlPR`
+j5T%Vi8EMLrnRb5gY1B7f`'J1f%&:"Unjc\U7n9RrLa+]!M,b[S,SlTRJrTOQi<9PQ'Ra7Q2?jq
+MLfH7SWnq`KntS"XfSCrVOs9BPE1TVKn4]2NfB$YJ7NP:H%:U&P5LREQ2d*JPPgUCPPgU?OT:R>
+Ont1<Oo(=;Onb%7O8k7?N<#"9O84h-N<"q:MZ\inM2;.dr.b3)!/16'#'P99G^!FurEfM0"C>A?
+?![G7!*]A+rE9Y7>$>'5=^#'6Apoi,Pl?aFNK!Ui!f1r,r_s)%<)cjt<`]0!r`&Vjs&B)!<W5tt
+;u]f"<F&p<@/XO5@/jR:?<piC?i+.0?i=@4?i"(->R"J=>?b98>l@k/>$G37rEBA->?kG4>6%q,
+>Q.e4=]eg1>$66#I=;'As*XrtIt.HH!.aiopON9n"Fu&SJ:RKIrdt-%!JH+)K`$N,L51SAM>`;3
+MuAM5MuJ\5N<#"<NW"n;Ns:].P*2#mPl?sFPkp[FQ3<PAR$jB?Rf8fPSGJfVT),&ZT`1SZT`:Ya
+TE(\aUApu!TostSI!9^TE,KH,PB()?qdTP7rabk:rau+Aph9S>rb;_DYct7L`Pom<rQ"u\rlY8_
+!6bAd!mJj3rQYGicM),OD#A/JDZ4SSE;jkWEWC1[FE_kNG'A.TH$Xd`I!pElIt3*%K7el4LPUeE
+Mi<XVO-,ThQ'Rc(R[]h=T:hmQUo(&hWiN8)Yd(OA[^WfX]=bkm_8=.0`lQ9Fbg"G[dF-Opf@S^0
+gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$ci8L~>
+JcC<$JcF=$nG`@arVZNhs8)`jrV6Ees7ZEas7H?_rpg-\nF6GG!Uf@Sm/QAblKRQski_*jjlPR`
+j5T%Vi8EMLrnRb5gY1B7f`'J)f%&:"rJ1N1L5,V[rIk0&rdt*"s*t*!qgSNmqgSHm)fTCs<HrV(
+An#=`AQOJ7I<p9bF)c,6Bk:g_?i4UDA6`VUCN"9:I.r'YIf=iiIK4fmHiSTnI.Vd_I/J<kI.M[c
+H?o@3rH\*]s*=Wh!I&_bFoHI`F*.;%s)\HL?!L]B;cEZnr_`\l#uOMr:esn_:JXga:]F/u:JOVY
+:/kbDEc>r7DZ+GJC]eEY;G-jYr^m;d9MA)Or^m,^s%<>crCd)]r_*,^qbml%;c?Rl;,L4g;,^Ef
+;Z9Pn;Yj5j;Z9Mn;#F2h;?]oq;,L.drDESkrD<Pmr_NSmr_Nbq:iC8kE;a_QE;shWE,kYlpMp4P
+r,MaWs)J!Xs)\3^!d/[/rcJ'\r-&$_!-nHds*4Qhr-A?ird+Qj!.=`npjW-js*t*#rIXp!pk8Hs
+pkJ[$"GhhhLPPkbqM>90M2;.f!/gc4%XiD;Df0<(BkCjcIU$;iqdTP7rabk:rau+Aph9S>rbDFe
+!/:?9s-EVMs-WePrg3bRQBqK:s-`UsqeZ1Ir,2LPs)@sWs)J*\rcE@,G'8(RG^4U]H[L6iIXcm!
+JqJ]0L51SAMMmFQO,oEdPEhH#R$sM7StD[LUSOcbWN*#$Y->1;['mHS\\#Mg^VRe*`Q$!@bKS5V
+d*^:ke^rF+g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#
+s3L^q~>
+JcC<$JcF=$nG`@arVZNhs8)`jrV6Ees7ZEas7H?_rpg-\nF6GG!Uf@Sm/QAblKRQski_*jjlPR`
+j5T%Vi8EMLrnRb5gY1B7f`'J)f%&:"r)Nbrr_rhro2YfirDiksr_rhrqc3So*AT/r0KD$I0J>%4
+0fVNd5!M.m4#o;[2)@!B0/YZe2$P^(92/2Z;>sMk<;KPj;YErf;Ya8j<;TVk<;KPm;Z9Mn;Yj>k
+;?9]opJLrg!)rMf"Ar&p;c<EgrDNJhs&&kr;Z'Jn;Z8EN1&sK949n#24$5Vg3]d4!!BE.;3<2&<
+2[_T(2`<TR4?l(r5!Js/s#^WM4?P\e4?Pbi3]6jl!Al\52Z>Z82Z>Q72E1Ups#9p8rAXU5!B2q6
+4:=;74?>M`3BB2_4?`R(!BraI4oRS@3s%Q/5Q3kH4T@SF4T%>C4?`U+r&t'E#!P154?btpr]^EK
+5P\.U:]!rk;,C"`:]+&`;>sDj;>jAn;,H^Wq+q&grD<Mks&/\ls&&hqq,H]Zqc*Air`&nrr_iYm
+s&B"ur`0##rE0,&r)Wr%=',?$s&T2&r`Kk9='&L%;,L.c:JjhY84lQ2@:B%BraYq<qITY<rFbn=
+r+Z.Fr_Wbo;c6Nm<;of#<)lms;cH`q<<?,u;u9ShC\qrGD>\;NDuXeUEW:%ZF8g9*F`qqPGBeCZ
+H@($fI=?ZrJV&N,KnbA=M2I4MNK9-_P*;/sQ^F52S=Z@GTqeE\Vl?\sXfen5Za@0M\[f>b^;%M$
+`5Ta;aihoQcHsteeCE1&g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zj
+rqu`no_sFAJcF'rJ,~>
+JcC<$JcF@%nG`@arVZNhrqcZjr:p<ds7ZEa!qc*Urpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA
+iuR.<i8EMLhVI#CgY1B7f\"g-f%&:"e"rk8US4BSrLa+]"eD0QS!ofER/r\CrL!SNrKdJK!g]+9
+rg!GJ.#Eh4BqUoWM1UA7LM3lmV5L,^R[94uM2I"=IZ08FNfBNsE--JXKnfDf!1!PJs-*ADrfd8C
+qN:c?qN:W9rK6u?q2tH6q2YW<NK&tqO8"\-N<"q:MZ\inM2;.dr.b*&s*"Efrc\BL?2S"9?!^fC
+?<g]??!LS2>Q%_9>?P-4>&AkXPa.JsOHGWarepl6MYN)5J8SRj<)ros!EE1u<W,nl;ZKeq<W?%u
+;u]hs?2n42@/XO4?j0nD?!UcDqHj,."(,>>>l@t->lS+0>6A&5>[784$!LP;>$>08>?Y50>l%\(
+=oqi/=oMS1=^$3$I=-HkIf=isIfFroJ+nKmIfk4PJ:RKIrIY'%"GDD[KS98W"GV\fLl(nas,6l8
+rJ^f;rf-l:rf@)A!g8b2pQYT@$C$gAQC!r*R@0M3rgNhUq4.;Ps.9(Z!20=`q4R_Z!MH.aU(F)q
+UnO!&I!^'[FDl)6CoDLR@fBm:AGTm:B)QB<B_uNAC'1cGYc[oEs2Y)Z!6P5_s2b8arlkMgbKTt2
+s3LRXq/#tGqelCOs)@sWs)S-\s)e9`E-?GLG^+L[H@($fIXcluJV/T.KnbA>M2I7NNfT9bP*D5t
+R$jD4SXuIIU84W_Vl?\tXfnt7Za@0M\[oGe^VI_'`5Td<b0/#ScdC.heCE1'g"P6;hV[8Mj5]4_
+k3)!nlKdg'mI0N5naZ2@oCW%T!quB_rqQNhs8)Wirqu`no_sFAJcF'rJ,~>
+JcC<$JcF@%nG`@arVZNhrqcZjr:p<ds7ZEa!qc*Urpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA
+itgY5i8EMLhVI#CgY1B7f\"g-f%&:"e,>+&LAZc(K`?])K)L6(J:W6$It.BFrI+]p!.FiqrI=i[
+).6KhEc#Dr@qB1PK7SDtH?aOODej$!@praBBa8a'@q][sF*7,'nUCIeomQmhoR-=Yr-\Bgs*XHc
+!d]-;qfr'bp3?U_s*+QgG5QL^F9-H)rH8-Es'5b4?!UB.rDNYm%oQ2#:f("b:Jae^:Jah_:Amug
+:('ck=D)buF)l5<DJoDis(hCG!bPS1qapcZ"%u<\9)_E]9)D9[9)_K]9`@rj;Z9T&<)Z^n;Gg:h
+;,L4ipJV#g!`2cmqGI8js%rbmr)*Djs%rns;,L.drDESkr_WYnr_WVls%r_ms%rZ4qeuXUE,fmn
+Dujrtq/QFRr,MaWs)J!Xrc80`F`qp,FSp:ZG5-:]GlE!eH2r<kHN&6kI/JEgIf+]qJH(0%Jq8ON
+KD:,pL&-Q#LBNEgLkgcbM#E/6MM[.FM2:q`%"<8:DJa0'BP(ddKj+@_raYq<qITY<rFbq>qe>tC
+re:E,r0@;Jpm:uI!gf4=r0[@sq/#tGqelCOs)@sWs)S-\s)e9`E-?GLG^+L[H@($fIXcluJV/T.
+KnbA>M2I7NNfT9bP*D5tR$jD4SXuIIU84W_Vl?\tXfnt7Za@0M\[oGe^VI_'`5Td<b0/#ScdC.h
+eCE1'g"P6;hV[8Mj5]4_k3)!nlKdg'mI0N5naZ2@oCW%T!quB_rqQNhs8)Wirqu`no_sFAJcF'r
+J,~>
+JcC<$JcF@%nG`@arVZNhrqcZjr:p<ds7ZEa!qc*Urpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA
+itgY5i8EMLhVI#CgY1B7f\"g-f%&:"e,<;H<;oer<:j/k<)ros$rp8,<E)pr;cH^r<E/osr_s.W
+/1N>61bpa:r\#BQ6U<n"4?Yed3B&fP1,:L@2DmBM1d=]/:/Fed;,U:jr)EJjr)35c!)iSjs&Ako
+qGd;ir_ibn!)iYlr_ibp!)iPgs&8Pf"Ar&p;c<EgrDNJhs&';);GpFl0JG791,C^L55mYL4Zkeg
+4?GVbqD\^@3B9&Z2`E_p2Zc$'62a%L5!]*1!B`OE49%GB49%DF5!1b\r\FU42)Y@ks#9s9r\Xm<
+2`E]U2`L[nr\s[5r]C0Br]CQO4?P\d3]T5^4$5\'49Rf35!;(.4Sq2I4?bto5!D+l4[2(,4o[YA
+55dVM5!M4o4Zkkl5lO"J5QO)7rD<Miqb[;i!`)Qer)!,brD<JjrDEYn;"%3P;#aDl;YsDm;?0Yk
+<;]\p;YF#i;H*Ekq,@8ls&8kor)3Vq<W,r!='5H)s&f5$!a&N*r)Ni"=T2J'=T2A2=Ai$n:ejb]
+9M7uL:Fl<OraYq<qITY<rFbq>qe>tC"&_un;#XDm<;of#<)lms;cH`q<<?,u;uBYmC\_fED>S5M
+DuXeUEW:(ZF8p@^F`;MJGBe@XH?spcI=?ZrJ:W?*KS>/9M2@+KN/is\P*2&pQC+)/S"6.CTq\?Z
+VPgDnXKA\1ZEppH\%0)_]t_A"_SjF6aND]McHjnce'uq"f\,!6h;7&IiT&tZk2tjkl0@U$m-X91
+nF?&>o(2MQo`Fj]p\ssfq>^<gqu6NlrUg)?s+13rs*t~>
+JcC<$JcFC&n,E7`rVZNhs8)`jrV6Bd!;?Bas7H?_rpg-\nF6GG!Uf@SljN.ElKRQskND!ijlHF$
+*TH&9i8<GKh;-l@g=k64f[na+e^W*td\W_6U7n:ZTDtJdSXc1=R[X2CrKm_SR$X,*rg*JIs-3MJ
+/=)QdClF*`Tp_%"K8>>=B<A54VPToSQB@2bM2$S4N/`gWNiJ2HGC>$sLR%Osrfd8Cs-*ADq2t]?
+qN:];qN:]=q2tH6q2YZ=NK&sYr/^W5oSij0regc6re^W0r.b0(!-nHfs*+Nhra#;*s'5S0r`fD-
+s'#J+r`TP2>$5!PQ^F';PR!D6P)bN]N/[al!f;hmq25E&BN.r2<W5tt<r>tr<;BGm<;]br<<#ks
+<;p2'?N"=2@/jU6>le8=qd'8.rEoV4r`oM/ra#M.s'>Y/s'#G-s'#q9>?Y68>$P99>$>-8?2@e)
+=pS85=]np3=^##-IK"]uIXcitq1&*gs*k-$JUi:IJc13#K*6j[K7npUL&Zl/LPUf^MZ8V6N;\_9
+NrG%9NrP1?OoLUEPP:=?Pm<P=Q'Rc'R$dl@rgNhUq4.>QrgrtY!hc0Xq4R\Y!MH.aUAgqfU^a#_
+IsZNeG'%YAD/>_grF5_8rabn;rFZ%Aph9V?qeH+Gs0)L*rl4uYrQ"u\rlY8_!6bAd!mJj3rltSk
+CMWW[r,)=KrbqgUrGhjX!-A-]D0:#FGB\:WH?spcI=6QoJ:N6(K8#&7Ll$tHN/`jYOHPflQ'[l+
+S"#t?TV8*UV5L8lX/rG,Yd1UC[^`l[]Y2(q_Sa@4aN2NIc-FY_daZdtf@\g2gtgiFi8WeWjlY^h
+l07L!m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$cMrC~>
+JcC<$JcFC&n,E7`rVZNhs8)`jrV6Bd!;?Bas7H?_rpg-\nF6GG!Uf@SljN.ElKRQskND!ijlHF$
+(ZOE3i8<GKh;-l@g=k64f[na+e^W*tdf,%(LPCQ]L&Qc*KE$Q%Jc1-!J,XonI0+kGIK"[GIsuiH
+BOb(fEc#DsB4b[TJUi/rH['XPDJNru@pre\Bkh?rJ9$9UCiFH:npU%Ws*s]j!.Ffns*a`koR$Oa
+qKi3ioQpXcH$T=4!I8qhH1lL_H2`$gGPlU_F9Q`-F`gqqrETY7?W9s%;Gg<j;ZBSu:f1%b:esmd
+;#a>k:B+*&:/=Y[?upI5F)l;?Df0H0D/O4hC\MWH@T?%t8cD<c9M7uM8P/nRqb-iZs%E8`r_rhp
+s&8qss&8hn!`;iopJV#g!`2`lqGI8js&&emr)*Gks%s,$;,L.d;,L4h:f.'er_Nkt:f("d:f'r+
+qeuXUE,]gkE:S#KErU.XErL+^FEMbLrcJ'\r-%jZs*4NgrH\Hjrd+Qjs*Xcnq0r6krdY-&Jq8N*
+r.FctpkAR!onWO&qhb9-p5'3,Ec>o5Ch[QpAS$<rrF5_8rabn;rFZ%Aph9V?qeH+Gs+UN-r078J
+pQtlH!gf4>rL!V#p2'YDqelCOs)@pVs)J*\rcE""G'8(RG^4U]H[L6iIXcluJqJ]0L5(M@M2R=P
+NfT9bPE_?!R$jG5SXuLJU84W`W2co"Xfnt7ZaI6O\\#Mf^VI_(`Q$!?b0/&TcdC1jeCN7(g=k?<
+hVd>Oj5]7`k32'olKdg(mdKW6nc&([oCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcF$qJ,~>
+JcC<$JcFC&n,E7`rVZNhs8)`jrV6Bd!;?Bas7H?_rpg-\nF6GG!Uf@SljN.ElKRQskND!ijlHF$
+(ZOE3i8<GKh;-l@g=k64f[na+e^W*tdf!2G<!#ut<;TYq<;T\o;ufkr;ufqp<!$'!<;fhs<!Xs*
+.ks%A1,(9Y0,ul<69[Rq4ZbV_2`<KI1,(UE2)[<P5!2S8;,L<k;?0Yn<;BJj;YEuf;Ya8k<;fbj
+<;KPm;Z9Mn;YsDk;?9]opJCrh;tNrk;,U:j;c<HhrDNJhs&&tu;Go5'r\4L11G_2m49.PD4;^4C
+3]T2[3&rrX3]]8]3&ifT3&`cS4@):25QO)7rB1-Eq`Fg?s#^6C"$Jh/2Z>N42#fH42?5]82ZGZ7
+2?5]82uko92Z>Z72uko:3;u&?49%GC4TRZ,r&Om@4?`O'"$\t44oIM@3se#55<h=q4Zkklr]L-B
+!'L-B!BiXG4o[bH4o[VF5=#34s$-ZN5XJ<H:]!rk;,9q_:]4,`;?'Jk;>a;l;!q-P;#aDl;YsDm
+;?0Yk<;]\p;YsAm<;f_s;H$Nk<;BJl;ufkp;Z'Jn<;fhu='5H)s&f5$!E`G#<WQ9(r`T8'r)X/+
+;Gp=f:/4SYrC[,BrF5_8rabn;rFZ%Aph9V?qeH+Gs%rbmr_reqr_j##<E)pr;cN`r!`W)trDil5
+p2'YDqelCOs)@pVs)J*\rcE""G'8(RG^4U]H[L6iIXcluJqJ]0L5(M@M2R=PNfT9bPE_?!R$jG5
+SXuLJU84W`W2co"Xfnt7ZaI6O\\#Mf^VI_(`Q$!?b0/&TcdC1jeCN7(g=k?<hVd>Oj5]7`k32'o
+lKdg(mdKW6nc&([oCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcF$qJ,~>
+JcC<$JcFC&nG`=`rVZQirqcWirV6Ees7ZEa!qc*Urpp*Z!:^!V#O_!Hm-O'(lMg#Tki_*jjlPR`
+j5T%si!&#ph;-l@rn7n9f[na+e^W*tda?I;U8"@\TDkDbSXZ+;Rf&TPR/WHMQMd$HPl6jrClNmt
+Tq.@%K8##7B<A25VkfoPQ]I/bL4t8/Mi3UTNK9C4c[CD"LR%Lrrfd8Crfd8CqN:f@q2t]=!KiK?
+Oo(=;Onb%6NrtE%NK3ptpl>?5!06i6!0$l7!fDhkreLE+"GM#DGBa%3s*+TO?![G9!FK.3?3O\B
+>[1T?r`]n<>?b97=^,*8>%*)QR[KH?PR3P9P)bQ^NJr[MreLW4Mi.=g"bq),<)lrt;up!"r`&tu
+<W,nm;ZKer<=Do.<E)mq>[1Q??=%%=@JsR<?X@#D?=.(;?3+>=ra5k9?<piAr`ot<>?kH>>?b97
+>?kB:>5_Y*=oMY*=oqo5?27_)>5_V(=p8&4>?P'Wr-n]sq1&*gs*k-$JUr@KJc(-"K*$^YKDpQ&
+L&Zl5LPUeEMM[4JMuJV5MuSb7N<#"<NVnh:O8k@BP5g^IP`q=/PQ@&6rg!MJs-<VM!gf:ArgEbS
+rgWbSqORVWqOde\!2'([rLX.aTqVFZrM'q"V50fLIsZQfF`_SACMfA9raPk:rabn;rFZ%Aq.T\?
+r+c+Es0)L*rl4uYrQ"u\rlY8_!6bAd!mJj3rm(:TqJH(HrbqgUrGhjX!-A-]s)eHfGB\:Wrd&I/
+I!pHnJ:N3&K7nr5LPUeEN/WdXOHG]iQ'Rc(R[]h=T:qsRUo(&hWiN8)Yd(OA[^WfX]=bkm_8=.0
+`lQ9Fbg+M\dF6Uqf@S^0gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6Kk
+rVcBfJcC<$cMrC~>
+JcC<$JcFC&nG`=`rVZQirqcWirV6Ees7ZEa!qc*Urpp*Z!:^!V#O_!Hm-O'(lMg#Tki_*jjlPR`
+j5T%si!&#ph;-l@rn7n9f[na+e^W*tda?HuLPLW^L&Zi+KE$Q$Jc1-!J,XooIK+cpIJnUD<bYiK
+G]R_6@:`t\<IoXLH[9jVEG]K*A7K(VBk_?sBlJ3KR;HnbFFNb.np^RfomZmg!doEEpjDa]rd=Qh
+!.=Ec!d]-;r-/6fGlE!^GlE!gGQ;scFoHI`F'JWKra#P1r_rhpr_Whs;,C+d;Z0Am:espd:BsTj
+:/4S`BQjAt!HW;\E;skVD$"TlD#A)CC]\<V;>Wra8cqa[8kT(Sr_!)]r(?r]r_38hs&/hp!`W)s
+r)*Vo;H$Ng;?Tin;,U<h;?'Po;?'Jj;>jB#:f:.f:f("d;Gp@grD<Pmr_Nnu:f("d:f'qa:&Al0
+EVFGCEVXYSF8p=_G'3b*rH8$]s*"QgGB\<2GQ)jeH2W$hHiA?jHiJKlIJJ?jJ,OosJcC?"KD:,q
+L&$JqLB*/,M>W2)M>rGBM10JaDf'<)BkCpeHq+*EraYq<qdo_<rb)%?r+Z(DqeQ4d!/:?9!1*>F
+s-NkSQC%T<ph]eDqJQ:Ns)@pVs)J*\rcJ0_"Eo!5G^9:7DL6bZIXcluJV&N-KnbA=M2I7NNfT9a
+P*;/sQ^F52S=Z@HTqeE\Vl?\sXfen5Za@0M\[f>b^;%M$`5Ta;aihoRcHstfeCE1&g"P3:h;@/L
+ioB+]k3(smlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`no_sFAJcF$qJ,~>
+JcC<$JcFC&nG`=`rVZQirqcWirV6Ees7ZEa!qc*Urpp*Z!:^!V#O_!Hm-O'(lMg#Tki_*jjlPR`
+j5T%si!&#ph;-l@rn7b5f[na+e^W*tda?JA<W?%p<W5tq<W,ns;ts>l<W,nr<=)VU/gi,/2_m'<
+r\"d@6pa+%4$5P`2`EWN0etE\2@26"5!M_;:f11krDNYor)EJjr)35c!)iVkr)<Ypp/Lofr_ibn
+!)iYlr_`bq;YO#i;H$Ne;?]oq;H$LlqGI2hqGI8j$8F4g0/51:1GM'Wr]C]S4?GYe4Zk_b3&rrY
+3&s&!3WD&=2?#N=3'9Jn5sRa85QX/655dY?48q>I4$5Vg5!1e^r\FU42)Y@k!&sm8r\Xm<2`E]U
+2`L^or\s^6"$Sk14T7GB49@Z.4T%5B4$5Yhq`FsE5<V1.4Sq2J4[2.p5!;"j5<V+krB10C4o@JE
+4[/j.s$-KG$p6a>5X.Iu5X.M"69tEE"Aquj:J^pcp/1idrDEJj!)`5]!DlSi:]jKi:f73gr_`\n
+qc!Mm!)r\mr)<Vnr_inu;cH`q;u]bq;u9Pi;uT_r;uKVk;ZTitrDir#=T)A&=T2D%=T;J$<rZ5$
+=T)A&=Su8"=9h`$:f'n^:JLd\!%InVraYq<qdo_<rb)%?r+Z(DqeQ4/!)WYnr`&kqrD`eq!*&qt
+!`W)tr`/`0qJH(HrbqgUrGhjX!-A-]s)eHfGB\:Wrd&I/I!pHnJ:N3&K7nr5LPUeEN/WdXOHG]i
+Q'Rc(R[]h=T:qsRUo(&hWiN8)Yd(OA[^WfX]=bkm_8=.0`lQ9Fbg+M\dF6Uqf@S^0gYL]Ci8N\U
+jQ5OekiqBum-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$cMrC~>
+JcC<$JcFF'n,E7`rVZNhrqcZjr:p<ds7ZHbs7H?_rpg-\nF6GG!Uf@SliHG;rojIIkPjTRjlGI^
+io/kSi8<DIh;$cag(E#jf@SU(eC;sqdF$=8U7n3OrLO:cS=>t9R@0G1rL!VOqNh)Fqiq)F-u4lp
+Jt\ZuM1^S>LM3fiWi2_aR@'(sLl$h9IuB;IO,gWUNS]&8LPYJbs-*ADrfd>EplYQ=qN:f>plYH:
+q2tH6q2YZ=NK&sYrK$`6rf-r<q2GB5rJL`7M2D4ereCGu$[-c>GC"LYGB[A"?2%Y@>@(W?>[(B9
+>?P'2>$G9:EKlu^R[KH?PQI&3OT(7BNJiXMqhY90pko9*D-L"?r_rnu<rQ)"<)riqqGRAnqGdi$
+>?kE=?!^iE@/aU5?j9tE?!UcD?i+1.?km$S?!LW??!LT=>[:T=>?Y69>?b97r`]A+r`fD+!*fG-
+qHNr&rE0M3=^#$5=BL*'It3(HJ+\?lIfk4PJUmWKr.=s$s+CB)re13'%YfapM2I1IMMd=LMi*CM
+rf$f8!07#;rJpo=#*=t1P*;)orfd2Cs-<SJ"dPC>Q^=*<R/i]TS,&TNSc>;XTCnlTTDtV^UApth
+Uo"'d%\],;H[L'\FDu58D/i0WraYq<qdo_<rb)%?rFu1EphTo6!3Z=@s2Y)ZrQ>/^!6kGe"3es4
+cMMGQD>A)KDuXeTEW:(ZF8g7^Fa!b.D0U>PH@($fI=?ZrJV&N,Knb><M2@.LNK0']P*;,qQC+)0
+S"6.DTq\?ZVl6SpXKA\1ZEpsI\%0)_]t_A"_o0O7aND]McHjnce'ut#f\,!6h;7&IiT&tZk2tjk
+l0@U$m-X91nF?&>o(2MQo`Fj]p\ssfq>^<gqu6NlrUg)?s+13qs*t~>
+JcC<$JcFF'n,E7`rVZNhrqcZjr:p<ds7ZHbs7H?_rpg-\nF6GG!Uf@SliHG;rojIIkPjTRjlGI^
+io/kSi8<DIh;$cag(2lhf@SU(eC;sqdF$<rLPG_\s+LE)s+:3#rIFirs*jin!.OfnrdH7qBjY7m
+Ec5T!AnGUTJU`/qH?F:LD/3cr@pi_[C27U"KnaZLDK0cBl@&PYrI"`rIt.-?qL/-dp3Zacm<ekZ
+!."Ke!I8qgH1lL_H2i*hGPlRpFB`!R>[:T@>?tQ@<)cdo;>jDl;#aDm:]=/j:Amro:/=Y\:L/$c
+GQ)^cF)q8!s)7mRs(qRJ!GlQGC]\0N:&@N^8cq^[8kT(Sr_!)]qb$l]s%N;gs&/bns&')!;Gp@h
+;H$Nh;Z9Pn;Yj5j;Z9Mn;#=,h;?]oq;,L.dr_`\n!)WVk!)iem!)`_l$W0_s:Jae^EH#l:EVj\T
+EW0qKEVXYSF8p@^G5ZO\Fo?L`G6<#4GBj(1s*4QhrH\HjrHeKjs*Xcnq0r9lrIFit!.t-$q1SNs
+q1eNs!/UK.r.t-)rJD)AIrfRID/<p#B4PRc5%=M$rabn;rFZ%Aq.T_@r+c"Bs+UN-r078Jo9TNE
+Q^IYdphfhErbqgUrGhjXs)\0]!HiSbGAVSMH?spcI=6QoJ:W<)K8#&7Ll$tHN/`jYOHPflQ'Rf*
+S"#t?TV8*UV5L8kWiW>+Yd1UC[^WfY]Y2(q_Sa=2a2lEHbg+P^dF6Urf@\d1gtgiEi8N_VjQ>Uf
+l07L!m-O-.n*ol;o()DErq-?dp\4[^s7u]kqtpBjrVcBfJcC<$cMrC~>
+JcC<$JcFF'n,E7`rVZNhrqcZjr:p<ds7ZHbs7H?_rpg-\nF6GG!Uf@SliHG;rojIIkPjTRjlGI^
+io/kSi8<DIh;$cag'lZef@SU(eC;sqdF$>?<<-"p<W5tr<W,nq;u'Am<Vobp<@BCN-n7572)-^:
+0/,:O5sIRr4?5G^2Dm<H0ebLE2E!ES6:b9T;,U6g;Z9Vm<;BJj;YErf;YX2[<;TVn;?9WmqG[;i
+pJCui;cE<d"Ar&q;c<HhrDNMis"XI+s"XO/"u/;)4?Pbir]C3E48h2>3!)*"3;toD3&W]Q3&`oa
+5l<qJ5lX%K4T7MD4SLr:4:=554?Ykk3]AoP1Go(gs#0m9s#0j6s#(!=3&iiUr\j^6r\t!=5!D./
+4T7GB497T-q`4g@4?Yk*497T0r]U6Cq`=jB5!T$1s#g<Fr]L0C!^&V/rBC-Bs$$]O4Ztnk5=#34%
+R<6D5XI_%;,C(d;,9q_r_W8bs%rYkr)*Pm;"%3X:]jKi:f70fs&&eoqc!Jlq,I8jr_ibp!E<"s<
+<#nr;?0Ym<;KPm<<#nq;Yj;l<W,tu<rcA%=TDS'=8uD&=8Z)(='/U/=]nj/rE&o!%9$,#:ejb]9
+h\/N:*jBKA,^$9Ac66?BDH6>C&D`@C]@63;#XDn<;fbo<<#ks<;ol"<)ZarqeZ%Eq/61Ms)@pVs
+)S-\rcA0`G5c]&G^4U]H[L6iIXcm!JqJ]0L5(M@M2R=PNfT9bPE_>uR$jG5SXuLJU84W`W2ZeuX
+fnt7ZaI6N\[oGe^VI_(`5Td<b0/#ScdC.heCN7(g"P6;hV[8Mj5]4_k3)!nlKdg'mI0N5naZ2@o
+CW%T!quB_rqQNhs8)Wirqu`no_sFAJcF$qJ,~>
+JcC<$JcFI(n,E7`r;?HhrqcWirV6Ees7ZEas7?<_rpp*Z!:^!V&FSrQm-O'(lKRQski_*jjlHF$
+"leM!i8<Djh%e`"g=k64f@SU(eC;sqdF$=eU8"<QrLX%Zs-j(YR@3r>s-NVKqN^uCs-5!_Oai%W
+RZiY`L5(P"XfA@uUn*s?NfK$RL4Xo7MiNgE_6B&EI"[-3nWX-@Pa%C0P5^[FP4t+=P5:=@OS=n8
+P5178OSt4?OSt7?NW5%:O8"Y9NK0%oN<"q:MuSY7M>i87H?XUXGBeB3Gm&A9?<pk5?4:1H?<pfC
+>[(H;>?Y81=V+eBBo8IOS=5k5Q'@PuPEM%,NWkE#M2@+HqhY90pko34H>*:Xs&9#!<rQ)#<)lrs
+<;KMn<;feu<`N/u>lS+0?3+D@raGb5"CGJA?!dM;r*BA1ra5n:?!U]??2Rq7?!LT<>$G6:>?Y50
+>Q7n+>Q7n,>QA(+>Q.h)=UA87=^#!3=BJ^VqLA0g!e5`Nq18Hqs+C?)!/(9(r.PH3LPUbCMM[4J
+MuAM5MuJ\4N<5&uNW"n;Ns:].P*2#mPl?mCPlI$JPlI$KQ2m9NR0&bDRf8fPSGSlVT),)OT`1S`
+TE(\]UAq"fV#R8#Tp:1WI!TmWEH#`2EDHLCrabn;rau.Bq.T_@r+bq@s0)U.a2Z-ta8a6[b5]Qa
+b09k0"3es5D"_`@DZ4SRE;aeVErU4[F9-N-rc`7)H$Xd`I!pElIt3'#JqJ`1L51SAMMmFQO,oEd
+PEhE"R$jG6St;UKUSO`aW2co#Y->.9ZaI6O\\#Mg^VI_(`Q$!@b0/&Td*^:keCN7(g=tE=hVd>O
+j5f=akNM0plKmm)mdKW6nac8BoCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcF!pJ,~>
+JcC<$JcFI(n,E7`r;?HhrqcWirV6Ees7ZEas7?<_rpp*Z!:^!V&FSrQm-O'(lKRQski_*jjlHF$
+"leM!i8<Djh%e`"g=k64f@SU(eC;sqdF$=eLPLV=rIt3&!.t-"rdalq!.OlprI4Zms*cA&CL1Fn
+Ec,Q"AS#IUJU`)oH?F:KChm`rARf.aBkhBeNeDUjD/s`Dq0`6jnU:=ar-e0cqL/-dp3ZacqKi3i
+oQpUbH2MpaH1lL_H2i*hGQ)^f?!CQ<>Ph\3?;a^#;Gp@h;Z9N!:f1(d:JXea;#=#s:ek&-H$FOW
+G'.qKErL"XDuOSUDJX*'qJ5_>!b#)$r(6l[!)*;`r^m,^r(HoZs%<>cqG[Dlr)<Vn!)`_n!Dubo
+;u'>k;$Kip;Gg:f;#X;l;Z9Mn;#=,h;ZBSp;GmEis&&eos%r\l!)ibl"&Vlk;>sDl:BO?f:iZ5K
+o5XSHrGr'_G'8$-FSp:ZFp*#4GB\<1GQ2pfH2)^cHiJKlIJJ?jJ,OorJcC?$KD:,pL&$JqL\Zf)
+M"cc(M@GDkEc>r6Ch[QpA7T7:raYq<qdob=rb)%?rFu1Ep1j_`L5#Skrg*2C!g]0hp20SBrbqdT
+rGhjXs)\0]!HiSbGA_YNH?spcI=6QoJ:N3&K7nr5LPUeEMi<XVO-,ThQ'I]'R@B_<StMdPUnsuf
+WiN8)YctF>[C3TU]=bkm^r"".`lQ9EbK\>ZdF-Oof%8R.gYCWAi8EVTjQ5Oekiq?sm-O--n*fc9
+o()DDo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s3:Ro~>
+JcC<$JcFI(n,E7`r;?HhrqcWirV6Ees7ZEas7?<_rpp*Z!:^!V&FSrQm-O'(lKRQski_*jjlHF$
+"leM!i8<Djh%JMtg=k64f@SU(eC;sqdF$=e<W6%r<W5tq<W5tr;u0Jl<W#hr<<jj(.P!S<1bek]
+)`U2N5<h7m3BB,X2)R*D0/b^G2C:RP7nlcV;>F)i;uK\i;u9Je;?'Pi;t*c_;u]_s;,U<h;uKSp
+;c<?es&8Pf"Ar&q;c<HhrDNVl!&+=*s"Om81,1L=1Hdoa4?Yn-497N,r](-A3B&rY3;toE3&`fS
+2`X,h5sYB7"@,1:5<f'0"["q24$,S"48M)>4p=)12Dd3HrAFU5!&sm8r\a^6s#C$;r\j^6s#:-?
+4Zttlr]L0As#^?G4?NL&r]C*BrB(3G5!D+mr]L0As#L6D4?c"/4p*r14[8p.r]U9D!'U9Es#hDe
+4Zttn5<V.l4[21s5<hCt5<qM#5X@\5:eje^:f-d]!)WSjrDEYn;"%3X:]jKi:f70fs&&eoqc!Jl
+q,I8jr_ibpr)E\pr_ibpr)EMkr_rkrr)3Dj!E<(s<WQ9(r`T8'!*B,$!*B)!#?P#1>$>'2=Su7t
+=:A,*:f("`:J4>Q7nk?0A,^$9Ac?<@BDH6>C&D`>C]@68:fL@l<)iiqrD`bp!*&qt"&r2uD"_`@
+DZ4SRE;aeVErU4[F9-N-rc`7)H$Xd`I!pElIt3'#JqJ`1L51SAMMmFQO,oEdPEhE"R$jG6St;UK
+USO`aW2co#Y->.9ZaI6O\\#Mg^VI_(`Q$!@b0/&Td*^:keCN7(g=tE=hVd>Oj5f=akNM0plKmm)
+mdKW6nac8BoCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcF!pJ,~>
+JcC<$JcFL)mf*._rVZNhrqcZjr:p<ds7ZHbs7H?_rpg-\nF6GG!Uf@SliHG;rol3%kN:pgjlGI^
+io/hRhr!;Hh;$c=g=b-1f@JL%eC2jndEp4bU7n6PSt;LDS=?":R@3o=!13SKq3CiA*.F*%JrH1_
+MhQn@M.`oiVl$5[R?`kkMhZt<IuF;d#]-TTR!3q2KTQ.ss-<8A"-o+7P5UUDPQ?u2mZIL1plYH:
+q2tH6q2bN7s,R&=pPo<7NfNmo!0$o8s,%)=LO"/hH$FOXrcn`pGB[D"?!gt<?41+H?=.#D>[CZ?
+>?h)1'3JF@@>:AESXc1<R@';)Q'@JqOoC@GN/NOMM2@+HqhY90pko<7LNHs)<W5qt<rQ)#<)lrs
+<;KPn<;ont<WQN4r`oG.s'G_5s'bk6!+5Y1s'P_2"^PJB?sm@@>le29r*0S7>[(E9>$P<:>$Cl/
+!*T;*s&oJ.>[@,/!*]>($!LJ7>$>'2=BSf)J+A-cJc(-"KDU?"Ka*9eLPUeEM>E)0MuJ\5N<#"<
+NW"n;Ns:].P*2#mPl?mCPlI$IPR3V@QC!u,R@'G3rgW_Rqjm\Wqk*h[!294]rh'4`!291^"/DZe
+V#I2$VP99*I<g-\F`D>:Dffi+rabn;rau+AqIohArG(t?#&LNJY/eQ%r5SfYrlY8_!QrXcc2Z#`
+D>%lGDuXeSEW:(ZF8g9,F`qqPGBeCYH?spcI=6QoJ:W<)K8#&7Ll$tHN/`jYOHPckQ'Rf)R[]k>
+T:r!TUo(&hWiW>*Yd(OA[^WfY]=bkm_8=.0`lQ9Fbg+M\dF6Uqf@S^0gYL]Ci8N\UjQ5OekiqBu
+m-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$c2W:~>
+JcC<$JcFL)mf*._rVZNhrqcZjr:p<ds7ZHbs7H?_rpg-\nF6GG!Uf@SliHG;rokipkN:pgjlGI^
+io/hRhr!;Hh;$c=g=b-1f@JL%eC2jndEp4bLkph@re1?*rdt3&qgn`sqgSTprdF]nqgBDhCgUUd
+F)G]$AS#ISJU`&nH?O@KD/!WoA7K'HC'[glML'&UEccR)IK+crIK"WbIJeQlIIhpaIK"ToHi&3b
+Hi8?YHNAG<rHS0ap3?U_s*+]kF^86V?2e+.?2n45>uFU"rDEnu;G^4g;,U1cr_WSis%`Si!E3\2
+Gl`/6rcSKfF)l8?E,Y_ms(h[NrbD:FoP=SC>uCMkr_!2`s%<5]s%<5_qb$l]qG[Akr)<Vn!)`Vk
+s&8_ks%rts;,U7g:f.-g!)iens%rVjrDE\n;GmEis&&eos%rYkrD3Sn:f($g;#a;n:/=\_q/GqF
+pi?@T"*A^0FoHL\Fo6C`GBWh,s*4Qhr-ATpH@'sbH[L5>IJJ?jJ,OoqJH1<$KD:,pL%pDqLB*/-
+M>W2'M>N/@Mi)t(E,KN/BkV-jA7ebMrabn;rau+AqIohArG(t?")N[GL&I;8QLpO>D>%lGDuXeS
+EW:(ZF8g9,F`qqPGBeCYH?spcI=6QoJ:W<)K8#&7Ll$tHN/`jYOHPckQ'Rf)R[]k>T:r!TUo(&h
+WiW>*Yd(OA[^WfY]=bkm_8=.0`lQ9Fbg+M\dF6Uqf@S^0gYL]Ci8N\UjQ5OekiqBum-O--n*fc9
+o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$c2W:~>
+JcC<$JcFL)mf*._rVZNhrqcZjr:p<ds7ZHbs7H?_rpg-\nF6GG!Uf@SliHG;rok]lkN:pgjlGI^
+io/hRhr!;Hh;$c=g=b-1f@JL%eC2jndEp4br`8nrs&Ahpr`&nrq,I8lqc!eI0.JG02Dd,d0,ul<
+5s@Lq4?5A\2D[-E1+tLC2)ZpH6:jpK;,U?k;Z0Pk<;0>f;YX)h;Ya8b;ufko<;TVn;?B]n;YsDj
+;YO#h;H*3c"]8/r;c6Ni;>sH9;(jRV1,1O>0etI=1G_3Y4?Pek4?GYf4$#A^3&rrZ3;bc?2`Nc]
+77-l;s$6QJ!^8_0r]C3E4T7DB4SV#74T@SL4ZbY^1Ggrf2?,Q72uY`62$>fr3&`ep2Z>Z83;kuJ
+5!1qh4$#Gb4?Yegr&OsC4$5Yhr&asCr]U3Bs#^6A"$8V/5Q3hK4Zkklr]L-B!BWIC56!bG55m_F
+5Q<nH4:=A=5X.Iu5<hD!5sYE8"&;Wg;!q3Y;?0P^:]+#h:\mof;?'Pj;u]bk<;]\o;ZB\n<<#nq
+;?0Yn<;KPm;ufkp;Yj>l<W,r!='5H)s&]8&rE'&$r)Ni"=T2M(=TDS%=8Q,"=Ue2':esq`:.n5P
+8PUaFrabn;rau+AqIohArG(t?#]*@8:fL@l<)iiqrD`bpr_rr!<)i[1p29hIs)@mUs)S-\rcEF.
+G'8(RG^4R\H@($fI=?ZrJV&N,Knb><M2@.LNK0']P*2&pQC+&.S"6.CTq\?YVPgDnXKAY0Z*UgG
+\%0)^]Y;.s_SjF5aN;WLcHaeae'uq"f@em4h;-uHiSrnYjlYail0@U$m-X60n*ol<o(2MGp%A%P
+p\jmeq>^<hqu6NlrUg)?s+13ps*t~>
+JcC<$JcFO*mf*._r;?HhrqcWirV6Ees7ZEas7?<_rpp*Z!:^!V1[aYtm-O'(lKRQskND!ijlGI^
+io/kSi8<DIh;$c=g=b-1f@JL%eC2jndEp4bcHW#ST)G2dS=>t8R$a5-R$[f>qj.#Br0/UYP_+U%
+RZrecItrhnY,S@uV4F$>OGSjNKn"W2NfK*BPfL@]I"[0;qN^T8r0./Fs-!GGmZIO2plYH:q2tH6
+plGH7s,R&=oT&^+!0$l7!IB"iGnkRJGBnIYGBeCW?<piD?=.&G?X@#ErE]G.s'$7B>?G!3As&[V
+SXc4=R@0D-QBd\uP*#['!K;s8MZ8P5MYi22M2I2cMZeuhD-L$>;uftu<<-"t<W,ns;ZKer;u]hr
+<<-)!?N+4/?2n45?XR8MrEoV4r*KD1rE]h:?=.&I?X@#D>[@>6$sQtB>[(E8>$G69>$Cl/!*T;*
+s&oJ.>[@,/!*]>(s&oM->$>).=9Mc/=+>_kJGFcpK)L?#K_pK'L'!-dM>2u.MuJ\6N<#"<NW"n;
+Ns:].P*2#mPl?mBPQ7!IPlI!RQC!u,R@'G3rgWbSqORSVqk*h[!294]s.B=arh9.^rhKLhrh]Xl
+&#,8>I<p3^F`MD:DK8E]AG]s:B)ZH>B`2ZDCA)H?C]UcCrl4lV!6G/^s2b8`rQP>drb_7ErGV[S
+r,MaWs)\0]Dfp5HGB\:VH$Xd`I!pElIt3'#K7ei2L51SAMMmFQO,oEdPEhE"R$jG6SXuLJU84W`
+W2cl!Xfnt7ZaI6O\[oGe^VI_(`Pom=b0/#ScdC1ieCN7(g=k?<hV[8Mj5]4_k3)!nlKdg(mdKW6
+nc&([oCW%T!quB_rqQNhs8)Zjrqu`noDX=@JcF!pJ,~>
+JcC<$JcFO*mf*._r;?HhrqcWirV6Ees7ZEas7?<_rpp*Z!:^!V1@FPsm-O'(lKRQskND!ijlGI^
+io/kSi8<DIh;$c=g=b-1f@JL%eC2jndEp4bcHV-!re:B*s+:<'rdb-$JV!cMqg\TnqgSHk)d[>g
+@T@GcBk(L\AQXP6IX6<_FDl#/B4YU^@f:$I?ZV?gCN"67Hhr3jIK"WbIJeQlIIhpaIK+ZpHi&3b
+Hi8?YHNJM=H2`'bH1lL^Glq>V>[@;5r`oV2?!gq;;[QE";,U7h;,C.g;>a8j:]F2i:B=L8rd"Ng
+$?pW9G'%eGEH,r9rbV[OD#S5LCAVcIChrZZ!bGJ.rCQu\s%E>`r^m,^rCd#[!_ZEhqc!Jlr)<Vn
+!`;iorDNYoq,75i##J/p;Gg7er_WYnr_`\lr)*Dj$W'_u;,C(d;,U:h;#F2f;#aDm:]sQj:/=[b
+;#G;(EVXYSEs6Z.G'.nKqfVg[pila_rd"Hg!.4]krd+WmrI+KjrI=crr.4m"s+C*"q1\Qtp4r[(
+qhb9-oniO&s,.DEIWKIHD/F$%An5Fa4_/+#Ac66?BDQ<?C&Mf?C\qoKL5#Skr0I&Crb_7ErGV[S
+r,MaWs)\0]Dfp5HGB\:VH$Xd`I!pElIt3'#K7ei2L51SAMMmFQO,oEdPEhE"R$jG6SXuLJU84W`
+W2cl!Xfnt7ZaI6O\[oGe^VI_(`Pom=b0/#ScdC1ieCN7(g=k?<hV[8Mj5]4_k3)!nlKdg(mdKW6
+nc&([oCW%T!quB_rqQNhs8)Zjrqu`noDX=@JcF!pJ,~>
+JcC<$JcFO*mf*._r;?HhrqcWirV6Ees7ZEas7?<_rpp*Z!:^!V1%+Grm-O'(lKRQskND!ijlGI^
+io/kSi8<DIh;$c=g=b-1f@JL%eC2jndEp4bcHTDd<<-"s<<?-"<W,ks;u'Di<W#fE-86r#/iPXC
+0.\b02afts5<M%g3&icO1GUU:2)dBN00MTp:/=Ya<;0>h;ufkp;Z0Pi;Z'Dl;?9Wmpf$od!)rbo
+qG[;iqc!DjpJCrh;tNrk;,U:j;c<Hh"]I*./hf!Y1B0'?1,1O?1Hmub4Zkki4Zkhe3rV/>2uu$!
+rAjm;"$&Y87/B1L5lEnI55[MD4ZrX(s#g'<qE,!H4Zthb2)I/g2$#TorAOX4"?&1u3&gdor\jm<
+5!Js/$U-^94$,Ja4$,Sf48_,B4?GYg4o@DE4[)"lrB1*As#U0A!Bi[H4pF/44?ktk4T.DD4$EL*
+!BiXG4o[_H4oRPO5<qIu5<qIu5X7Y$r^$QLmSWm[!)`2\oMGQbr_iVls&&hqqGdAkr_ibprD`bp
+rDNYor)EPls&B"srDNGis&K"u!EWD%=o2>$=8l8#<sMi1>$>'3=BPN'pfIN!rD3hu9hnAU8P)T"
+A7YRKrFZ%AqIohArG)%AqeQI6:fL@l<)iiqrD`bpr)EZ4o5=MFrc%dTs)S-\rcE($G'8(RG^+L[
+H@($fI=?ZrJ:W?*KS>/9Ll%"IN/`mZOckonQ'[l+S"-%@TV8*UV5L8lWiW>+Yd1UC[^`lZ]Y2(q
+_Sa@3a2lEHbg+P^daQ^sf@\g2gtgiEi8N_VjQ>Ufl07L!m-X60n*olHncA@Srq-?dp\4[^s7u]k
+r;6KkrVc?eJcC<$c2W:~>
+JcC<$JcFU,mJd"]rVZNhrqcZjr:p<ds7ZEa!qc*Urpg-\nF6GG!Uf@SliHG;rokipkN:pgjQ,@]
+io/hRhqm2FgtUQ:g"G$0f@JL%eC2jndEp4bc-2fOrga7`S!oe6R$df<s-NeQr0I,Cr0/X[PD"L#
+S<o4eJVT%pY,\@tURdd<OH#'OK7JK1NfK*HRE3<oItWK?QMHg:PQ6pGPl?pKP`kHsrfHo;r0$r>
+!K`H=OSFn:NW5%:O7\J.N>.>0MgBVnH$FUZGBnI[H$X[Y?<pk9?N"71?N".9>[(H<=^+s1DjpZs
+s.'OeR[KP/Q'R]#PEM%,NWG)sqhkE1s,-]0!f;elpPT-4H>$=X<;]_r<;ons<<#ks<;ohr<<#r!
+<aG]2rETA.ra#\6?smFA?iXR3?3"@2?3+><ra,t>?X6rB>[:T>>Q.n->6e>7>?kB:>$Co0!*]A+
+r`];+rEK;*s',M,#[(>6=^"s3>$:i,s&fA)=8[RKJ,+WlJc(,uKDgK#L&Zl2LPUeEMM_4frepf8
+rJ^f;rf-l:s,RJJOcklkPE_8qPPLFCQ2QsIQ2d-QR$jA0RJr]OSGJfTT),)YT`:_ZT`1Y^UApqe
+U&q*cV#I4jVZ3P(UQ^=XH?jXUEc5i3F&-?DAc?<@BDQ<?C&Mf?C\_cIYcduFr5SfZrlY8_!6Y;c
+!6k"OrGVXRr,MaWs)\0]!d/[0rc`I/H$Xd`I!pElIt3'#JqJ`1L5(M@M2R=PNfT9bP*D5tR$a>3
+S=Z@HU8+N]Vl?\sXfen5Za@0L\@K5a^;%M$_o9X:aihlPcHsteeCE.%g"P39h;7)JioB+]k3(sm
+l0I^&mI'H3nF?)?oCMVIp%J+RrV6Egs8)Zjrqu`no_sFAJcEsoJ,~>
+JcC<$JcFU,mJd"]rVZNhrqcZjr:p<ds7ZEa!qc*Urpg-\nF6GG!Uf@SliHG;rol*"kN:pgjQ,@]
+io/hRhqm2FgtUQ:g"G$0f@JL%eC2jndEp4bc-1orKnP,3K7\^SJbaioJ,artIJ\KkI2cL/@UN2X
+E+r`gA7\hoIscQfF`VP?C1_$d?t0(L#\%q>P&"uVFFEq5s*aino6pOcr-e0cqL/Bks*OZkpNugc
+m!AbZH2`'aH1uOaH!^GS"C58;?![A7%8p,';Gp@i;Gg=h;,U<j:]X?hr_EVk;-S5BGli57GQ)dc
+Es-N'EH#jqD#nEgr+l:HqeP_<!F]"+8cME_9DqK^8H;B]9DhB^9E%id;uKVm;uTYr;,U?k;?0Yk
+;ZBSu:f1+g;,L0c;#jGi;>sGq;,U7gr_WVls&'"s;,L.d;>O)o;,C(b:eje^r_NYlE,ber!-%[P
+q/ZIU"a"m1G'%j'Fo6F_G5ug`GQ)jeH2W$hHiA?jHN8HlIJJ?jJ,OoqJcC?%KDC2pL%pE%LB*)+
+L]3,+M>i>'M>N20M[tc'IWTOHD/=!%An>Le5\0b'rau.BqIohArG)%Aq.p(dL&I;7QN!3NQM[$>
+DZ+MPE;X_UErU4[F96T.G5c]-G^4U]H[L6iIXcluJV&N-Knb><M2@.LNK0']P*2&pQC+&.S"-(B
+Tq\<XVPgDnX0&P/Z*UgG[^`l[]Y;.s_Sa@4aN;WKc-F\`daZguf@em4gtgiFi8WeXjlYail07O#
+m-X60n*ol<o(2JFp%A%Pp\jmeq>^<hqu6NlrUg)?s+13os*t~>
+JcC<$JcFU,mJd"]rVZNhrqcZjr:p<ds7ZEa!qc*Urpg-\nF6GG!Uf@SliHG;rokcnkN:pgjQ,@]
+io/hRhqm2FgtUQ:g"G$0f@JL%eC2jndEp4bc-5i\nPoBcr)>'k0InV+2Dm6B/2/_96pX"#4$5M`
+3&NHH0eb:=2Dm?F5!i">:f:1goi(cf!)renrDWPjr)*Aiq,@#es&8hpqG[8hr)<Jjpe_)j;cE6b
+s&/nqqb[JN0J>(5r\FL.r\FL0"?eq24?`[+!^/Y-r](*@3B0&Zq`+[?62j:K5m0G;5<qF0497T-
+r]:!>s#g'<qE4^>"$/=r2#T942E1Olr\Xg;3&ifTr\jd8"#rG-55m\H5!;%-49%AA3s%Q-48h2C
+4$5Se4o@DC4[/j.r]L0A"$/M*4o@JG4Zknlr]L0C!^&V/rBC-Bs$$KHr]CQP5<qIu5<qFu5XIa8
+62s1M62XR[;"dcb;?9Wkmn`jX!)NJgr_`\nqc!Mm!)r_nr)<Sms&8kqr_rbns&8hp!E2nq;uTbr
+;uBPj;u]es<W,r"='/T(=o2>$=8u>#<sMi1>$>'3=BPK&pK.o.:f'n`:JOYY91qiO,\6d`rau.B
+qIohArG)%Aq.p(/;#F;l;uK\p;uK\dDZ+MPE;X_UErU4[F96T.G5c]-G^4U]H[L6iIXcluJV&N-
+Knb><M2@.LNK0']P*2&pQC+&.S"-(BTq\<XVPgDnX0&P/Z*UgG[^`l[]Y;.s_Sa@4aN;WKc-F\`
+daZguf@em4gtgiFi8WeXjlYail07O#m-X60n*ol<o(2JFp%A%Pp\jmeq>^<hqu6NlrUg)?s+13o
+s*t~>
+JcC<$JcFX-mJd"]rVZNhrqcWirV6Ees7ZEas7?<_rpp*Z!:^!V$h!ELm-O''lKRQskPjTMjlGI^
+io/hRhqn@g(>RZug=b-1f@JL%eC2jndEp4bcHOJ'rga4_S!ob4R/WEPQM[$IQM?aCPT>4:KRmd*
+R#crQLkf`HY,A.lSsbt/NJWIFJ:W]>rf.2Q[bQ4\KST8dr072Gqiq,Gr075H!gJn3mudU2plYH:
+r/h&BOcfI$plGH7s,R#<q2PH9rJp]5!K;@(Gm/G=H$OXZrd"Ng#('Z^?!goEra5\3&78aJ?!U]?
+>?kE:=]]pBT:c+S'V1_]R@'>,QBd\tP)t`cNf8pSM2D.freUZ5M>W/2M2I2bMZ\omFCG/Jr)E_r
+rDihr!`N&tr_j)%<E3=1?=$uErETA.s'>e7?smFA?iXR3?N4C3?34D=?N"72?2n.:?!LW=>[1Q>
+>?Y2/>QS,5>5_Y,>$G51>5qh-?2e(->5h_4>$5$3=^"s2>$Co-s&fP.=''p&It.?GqLSQrrIb'%
+qh>')"c%njMMd8eMZ8V7N;\_9NrG%:NrP.@OHKO*s-!GIrfd2C!1!JH"-o1<Qi<?PRJr]OSGSlU
+T),)YT`:_ZT`(S^UAgkdUAptgV#I4jVZ!D%UQ^=XH@'aVEc,`4GC07!rau.BqIohArG)(BqeZ1I
+!O/d+`r3pXao9H_aTBW0c1GoODuFYQEW:(ZF8^1^F`qs-GAh_OH?spcI!pElJ:N3&K7ei3L51VB
+MN!LSO-#KePEhE"R$jG6SXuLJU84W`W2ZeuXfnt7Za@0M\[oGe^VI\&`5Td<aihoRcd:(geCE1'
+g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCW%Ts7QHerV-BgrqcQirqu`no_sFAJcEsoJ,~>
+JcC<$JcFX-mJd"]rVZNhrqcWirV6Ees7ZEas7?<_rpp*Z!:^!V$h!ELm-O''lKRQskPjTMjlGI^
+io/hRhqn@g*8K<&g=b-1f@JL%eC2jndEp4bcHOIcKnP,3JqEuQpON6mpO<'h*.2"-@pi;XE,/ul
+AS"tpK7/)lF`VS@C1h-g@:K1M#AeX:X(uWoF7t(^IJnQbIJeQmIIhpaIK"WoHi/9dHi/9XHNAG<
+rcn6apim-N?!L]@?!UcA?=!P:!FK75;uBPn;?'Po;>X/m:/+MpHMi'gGRAS:G'%eHEcH&;DuOVR
+C]\BeCAhrHCAhr;C]\9T;>j)d9)hQ^9)hH_9)VE\9)VZa;uT\n;uBMn;uKVo;u]_q;uKVo;?'Jm
+;ZBVo;#X;l;Z9Mn;#=,g;Z9Pm;#aDm;Z'>k;>j;n;,C(dr_WPhrD3VlEH,r:pi6(Ls)S?cF`qqN
+FSg4YG5ladG5?F_GlN'fH2r<kHN&6kI/SKgIf=iqJGXm!JqJ^OK_L2rLAcl-LAQc*M#)u.M"?K#
+MZ&J5N"(VmFDu/8ChdTpA7TC[r+5k>rb)(@rFu4FpM9YBr+uIhK`.26QN!6MQN*<DDZ"GOE;X_U
+ErU4ZF96T.G5c](G^4U]H[L3hI=?]sJV&N,KSG5:M2@+KN/is\OckonQ'[l+S"-%@TV8*UV5L8k
+WiW>+Yd1UB[^WfY]Y2(q_8=.0a2lBGbg+P]dF6Uqf@\d1gYL]Ci8N\UjQ5OekiqBum-O--n*fc9
+o()DErq6<b!;HHe!;ZWjr;6KkrVcBfJcC<$bl<1~>
+JcC<$JcFX-mJd"]rVZNhrqcWirV6Ees7ZEas7?<_rpp*Z!:^!V$h!ELm-O''lKRQskPjTMjlGI^
+io/hRhqn@g(>RZug=b-1f@JL%eC2jndEp4bcHOI4pf6i`qGmGm-m^Pt.PNb=1,(7500)?c5!;"j
+3BB,W1GU[>1,h*K2)%9V=%uLf;Gm$arDWbqr)3JlohkcgrDNGip/M&jr)EPlqGR8jqbm/cs&8_k
+!)rbms&/nqrD<_P0eb760`Eg-1&`pP1GgmO5!1qj4Zkeg4?5G_3&rrX3B/uZ3&ru^6UO706U<s7
+5m'>:5=#31!'U<D"$Jb,3W;);3rhD<48M)<4Tdc+2Dk@i!]Dtrr&4R4"?&5!2`L^os#9s@r]^?F
+$pHg:4?GVc3]fDd4?NL&!'C0Bs#pBE!BiRC4oRSC49%>D4$5\kr]^<E!'gHFrB10D4oISE4T[f1
+4oRYE4:+/85X@V!5X.Iur'C?J"[PCN;,C*`;>sJn;#jGk:B45`:]+#h:]!uf;?'Pk;u]_q;u'Dj
+;uTYp;uK\p;uBMn;uK\q;ZK_p;uT_r;u9Ji;ZTitr)Ni"=T)D&=9)G$=:&&0<``@)=BSg2r`K5'
+r)`Pn%9ZM':esna9hS)N9hdD@Ac?<@BDQ<?C&Mf@C\qrGD#mL1qc*SorD`bps&AW.r,;OQr,MaW
+s)\-\!d/[0rc`:*H$Xd`I!g?jIXls"JqJ]/L5(J?M2I7NNfT9aP*;/rQ^F21S=Q7ETq\?ZVl6Sp
+XKA\1ZEppH\%0)_]t_A!_SjF6aN;WLcHjkbe'uq"f\,!5h;-uHiSrnYjlYail0@U$m-X60n*ol<
+o(2MQp&F^cp\jjeq>U6gqu6NlrUg)?s+13os*t~>
+JcC<$JcF[.m/Hq]r;?EgrqcZjr:p<ds7ZEa!qc*Urpg-\nF6GG!Uf@Slo"+ol07EqkN:pgjQ#:[
+iSi_Qhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_bfe2#SXc4>R[KP1rg3VMrKmGJpm(fB*,h*rKP-jE
+NeDq;M.`rlVP^)YR[9+qMMQt<JrTbi#`k4Ta*WAkLmIIoqNLuFr075H!gJn3mZIO2pQ>B:!KiKB
+OTCQ+plP<4rf$o<r/^`8!frA&rJpc7s)@s`!I9"jH2i*fGmAS??=$oC?=*S;s'?1B?<^]@>ZtB;
+>$G*bTV2:V)4mCiR[KS0Q^*l%PEV,jOcGH]N/EIKMMd8hMZ/G5MM_4dregK/s,7)2D-Kt=qc*Vq
+r`/nr!E2ts;Zg!(?![G9!FK13>lS+0?N4C0?iXR3?N4C2?3OV@?=.&Gr`p+@?!LW=>[1Q>>?Y06
+>[1K:>5_Y,=^,,0=oqo5?2\"->5h_1>$5$3=^"u->5hY(=TDS'<rdaIJGOipK)L?#K_pK'LB!&>
+M2I1IMMd=LM2I1KMi<VnN<#"<NVnh:O8k@BP5g^GPl?mGPQ6pHPQ7!IPl?pKQC%T<!1EhUq4.>Q
+rLWkXrh0:bpRqGXr1a.`"/;QcV#@+iVZ!FmW"#McJUMcdG'%Y>DK'iJrFQ"@rFc"@rFu7GpM9YB
+q/$/:YPlK>`rO6\b5]Qab09TtqeuFPqf2XVs)\-\!d/[0rc\BfH2`,%H[L6iIXcluJV/T.KnbA=
+M2I4MNK0']P*2&pQC+&.S"-(BTqS6WVPgAmX0&P/Z*L^D[^`l[]Y2(q_Sa@4aN2NIc-FY_daZdt
+f@\g2gtgiFi8N_VjlY^hl07L!m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$bQ!(~>
+JcC<$JcF[.m/Hq]r;?EgrqcZjr:p<ds7ZEa!qc*Urpg-\nF6GG!Uf@Slndtml07EqkN:pgjQ#:[
+iSi_Qhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_bfe1_KS+o/Jq<TFrdXWjrd?2B=DhVX;g*1r@UEYX
+<e>mNI!BdUEc#Q(ARf.XC27R!DKCGpCN"69npURerI"6cr-nQlo7$Oas*XfmrI"Wl!.+Nhr-[jX
+"+#6;GkcR]GQh,J?!^fCr`oe9>[:ZB?X@);r_rbn!)`_n!`;imqG7;i9l,0'r-8]qGBJ(OFE;MC
+EGoc5rb_[O"`%jeCMR\aC]/#HCB86enSA8;=AAcdr_!2`!(m/^r^m#\s%38gr)*Po<;]\o;Z0Pm
+;ZB\o;ZB\p;?0Yp;ZBVo:^']o;,L.dr_WYnr_`\lr)*Dj!`2clr_WVls&&np;,R0d##S2n;,C+d
+rD3Ag!`)R1pi64P!-A-[s)\3^s)nEcFSg4YG5lagG'A.TrHJ9ds*=Qh!.4]krd4ZmrI+KjrI=fs
+r.4j!!/(*#pP&EtreLN.qM5'+qhY</o83:#rep`6%>fOSE,TT/CM.6jASYWNAcHB@BDZB@C&VlA
+C\qrDD#oBErK[;Hrg3SLpMTkHrG_XRs)S-\rH&*`G'<k/!I/nhH=hMOI=6QoJ:N3'K7nr5LPUeE
+Mi<XUO-#NfPa.Q%R$sM7StD^MUSOcbW2co#Y->1:ZaI6O\\#Mf^VI_(`Q$!?b0/&TcdC1jeCN7(
+g=k?<hVd>Nj5]7`k32'olKdg(mdKW6nc&([oCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcEpnJ,~>
+JcC<$JcF[.m/Hq]r;?EgrqcZjr:p<ds7ZEa!qc*Urpg-\nF6GG!Uf@Sln%Jfl07EqkN:pgjQ#:[
+iSi_Qhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_bfe3+<UWo_<W,lG/hnh*0K1jD0.SY.3(#tp4utee
+3B&iQ1GLX?2`<NN0g.Tj9i4ee;,[-er`&nrr`&nrr)3JlohtE\pJh,jrD`eq!)iboqbm>jr)38d
+!E)kl;?0Ym;ZBYt;Getqr\=F+$o'Ln1,1O>1G^jN5!8g-'KeQA4Zb\c3B0#Y3B/uY3B0#b5stW>
+"@5:<5skQ:#=(R>4Zkeg55[PC3WD,?3W;)<3rhD;48M)<4T[Z'2Z5N52?Gfq2?#N52?,W92uPW9
+4?Yk+55m\J5!1qh48q8H4$5Ve3]]>`3rV8A4oRPE4Zr[+rB1*As#L6D4?c"/55m\F5Q3eD4TRW-
+rBC6E!'^BF!C&dH49e#869d\"5Q3qG5m0G=5X80?;>sJn;#jGk:B45`:]+#k:Jakbr_WSks&/_m
+s&&hqq,I8jr_`_prD`bprDNVnr`&nr!)iepr_rkrqbm;i!E<(s<WQ9(r)j)'=',B'rE&u#qcNo$
+rE&Pl!a/Dsr_WVi"\_Q]8kh&=AcHB@BDZB@C&VlAC\qrDD#mL1qc*SorD`bp!*&]1qeuFPqf2XV
+s)\-\!d/[0rc\BfH2`,%H[L6iIXcluJV/T.KnbA=M2I4MNK0']P*2&pQC+&.S"-(BTqS6WVPgAm
+X0&P/Z*L^D[^`l[]Y2(q_Sa@4aN2NIc-FY_daZdtf@\g2gtgiFi8N_VjlY^hl07L!m-X60n*olH
+ncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$bQ!(~>
+JcC<$JcF^/m/Hn\rVZNhrqcWirV6Ees7ZEas7?<_rpp*Z!:^!V$h!ELm-O''lKRQskPjTnjlGI^
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ARadeihR@'B@QiE?QQ'Ra8Qi!*CQ2d'gD4$32
+B:YKPL4P2;LSq8OVkflNQ]R/_LP181NW+qCR?4\XI"I!*p6GWCq3CiA!1!JHrfmMKP4"J4OS4h8
+P5CC8OSOq>NfB$Yr/^`8!frA&rJpi9$ZL**H?sj_H$OX[H2`+/H$FXA?<poE?=.&G?!^lF?!CT?
+>[1K>>&'J"rh0:`(7q(fR[TY1Q^3r%P`q5kOcYT_Mhm4IreUZ5M>`>0M>N,.MYN,/Mue3:r`&ks
+"]eW&<)lrs;uoosr_io'>[:Y7?N4@4?2e+/?2e11?i4:3?i471?i=:2?2e.G?X@&E?!LZ?>[(E;
+?!LT<=^#'8>?Y5/>6%h*>Q7k.>?kJ4>Q7n+>Q.h+=oVY-=^#!3r`B2(=Su8"JGOipK)L?#K`$Q(
+L'`WkLl%"HM2I1KrJLW5s,?o9!07#;rJpo=s,m>Es-!GIrfd>G!0dDH!1!MIrfmMMQi<?QR@=,E
+qjdMRrLWkXrh0:bpRqJYr1a+_"JVZdUnn!d!2f^m!3#mp&#58=IWp!ZF)c):E-d+IAc?<@BDZB@
+C&MfBC\qrDD>e>PYPlK>`rO6\b5]Q`bPQ2RDu=SOEW1"YF8^1^F`qs-G6)r6rd&R2I!pElIt3'#
+JqJ`1L5(J?M2I7NNfT9aP*;/rQ^F21S=Q7ETq\?ZVl-MoXKA\1Z*UgG\%0)^]Y;.s_SjF5aN;WL
+c-F\`daZguf@em4h;-uHiSrnYjlYail07O#m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?
+s+13ns*t~>
+JcC<$JcF^/m/Hn\rVZNhrqcWirV6Ees7ZEas7?<_rpp*Z!:^!V$h!ELm-O''lKRQskPjTljlGI^
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ARab,1sJb4KlJ+S3iHm`$9B4"S[Ebf2oAS,J%
+Jp_okGB@kBBkCpd@UX"eC27m2KS=5]F*I>,rdXor!.FfnomQaer-e0cqL/BkrHnNkpj;mcm<\q]
+H$FT/H2Vsl<*!%*?!^n;>n::J?XI,H?=-W1;c?Rl;cEQks&&bl"]8/m=E]&jHMr*iG]s(/"a"g,
+EH,srD?F`lCMNf^!buLcrbMFHrbLq<!FSn+8cD?^9E.T`9)_E[9*.^_;>a>l;ZKeq;uT\n;uKVo
+;uKVo;uTYp;uT\p;?'H!;,U:h:f("e;,[Bjs%rSir_`eo;GmEis%rborDE;cs&&em!DcPk:]=/m
+:JOSWqJlIS!-A-[s)\3^"*Jd0FS^.YG5lagG'A.TrHJ9ds*=Qh!.4Zjs*OcnrI+KjrI=fsr.4j!
+s+C-#pkANureLN.qM5'+qhY</o83:#repc7reh;CI<'4DChmd!An5Lg@:a$LB)ZH?B`2ZDCADZB
+D#%rHD?,@gQ2HsIQi<<JDYe;LE;OYSErU4ZF96T.G5c[dG^9:7EI3(]I=?ZrJ:W<)KS>/8LP^kF
+N/WdXOHG]iQ'I]'R@B_;StMdOUnsueWN*&%YHY:<['mHS]">Vh^VRe*`Q$!@bKS5Vd*^:ke^i@*
+g=tH>hr*JQj5f=akNM0plg4!*mdKW6nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#s3(Fm~>
+JcC<$JcF^/m/Hn\rVZNhrqcWirV6Ees7ZEas7?<_rpp*Z!:^!V$h!ELm-O''lKRQskPjThjlGI^
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ARao,6.<;'>l<#[DE/h/S82)?m:0/#"F5s@Io
+4ZYV_2`*?H0erYc#W4D$4%N(C:f%'gpf%)is&8nr!)renrDWAeoMbK`rDW\pqG[5grDWVlpJCrh
+;u';k;u9Jm;uS?J1&im.0JYE^1C#Zk1Gh9Z4Zr^,s#^9Er]:$=%QHI/3'9/^6q0O26ps@,qEb-H
+"[5(34$5\)49.J@3<;0$r]9U3!B`OC4T%>D3]Ano2?#N62?,T62?#T72ZGo>4Tdl25!Js/!BrXF
+48h5>49%>C4$#G%4T@SD497T-rB:*As#^6A"$8V.5Q3kG4Tdo34?WR*!BWIB4omf1r]L9H55dVD
+56sP?5<qIu5X7[762s1P5sRCiqGI5ir_WYlr_EMjoM>B]"&D`i;>sDk;?'Pk;uT\j<;]\o;?0Yo
+<;ohp;Z9Vo<<#ns;?0Yp<<#no;Z'Jn;ufqr<rZ;#=TDS'=8l>#=8c8!=oVV'=7]Pn<rlK&r_Nr!
+:/+DT8ki&8AS(jQrb)+ArFu4Fq.okDq/-(J!)WMk!)rhqr_r]3qJZ:Nqf2UUs)\-\!d/[0rc\Bf
+H2`,0H[L6iIXcluJV&N-Knb>;M2@+KN/is\OckonQ'[l+S"-%@TV8*UV5L5jWiW>+Yd(OA[^WfY
+]=bkm_8=.0`lQ9Fbg"G[dF-Opf%8U/gYL]Ci8N\UjQ5Oekiq?tm-O--n*fc9o()DEo_%nNp@nO\
+s7u]kr;6KkrVcBfJcC<$bQ!(~>
+JcC<$JcFa0m/Hn\rVZKgrqcZjr:p<ds7ZEa!qc*Urpg-\nF6GG!Uf@Sln[nll07EqkN:pgjQ#:[
+iS`YOhVI#CgY1B7f[na+e^W*tda?Ihcd'h\bfe2OaIAWdR/N?OQMm'KQMm0KQM6[EPUC@5N.bl:
+RZE;VL5:UuXJ_kgSsu+1NJWIEJqJr@OH6`.Z)N,&Jqs;irg*GHs-EJGqNLuFr075H!gJn3mZ@L2
+p6#99!KiKCOnOn3O8k1>Nr+n8NWP9%O8P%<E!UH&H?sj_H?jc7H2`*mH$Wb&>l@tC?X@#D?=.#D
+>[:T=>[(NUU8"<RU&LYcSt2AMRf8WQPld,2O8b7@N<5#pM>`>3M#rQkM>iD1M>N)/M>iD.MuJY<
+L3$a%<;ol$<`N.!<E8oq!)rl$s',P0rE]M3?2e+/?2\+0?i4:3?h.M0?X@#D>[1Q>>?h)3s',M+
+s',P.r`T;+rEB5*s&oV2>[:T=>[.22r`fD+r`KA-=^#!3r`K2'rDs##=o*^JK)C9"K`$Q(L'*3e
+M2D.f!/pf5s,6o9rJ^r?NJrjVrJpo=s,m>Es-!GIrfd>G!0d5CrfmJLrg*\RR@=,EqjdPSrLWkX
+rLj1apRqMZqkF"^s.]Og!2TUjs/,go!3#dm#GRB4I<KjWF8g([DL##hrau1CqIokBrG).DqeZ.H
+q/-29rPniW!6G,]s2k:Yq/?1MqJlLTs)\-\s)n?brc\BfH2`,+H[L6iIXcluJV&N,KSG5:Ll%"I
+N/`mZOHPckQ'Rf)R[]h=T:qsRUo(&gWiN8)YHY==[C3TU]"G_k^r""-`Q-'BbKS8XdF$Fme^rI,
+g>(N@hr*JRj5f@bkNV6rlg4!+n*fc9nac8Bo`"Lbp@n=\q#C0iqY^6hr;QZdrdk*#s3(Fm~>
+JcC<$JcFa0m/Hn\rVZKgrqcZjr:p<ds7ZEa!qc*Urpg-\nF6GG!Uf@SlnRhkl07EqkN:pgjQ#:[
+iS`YOhVI#CgY1B7f[na+e^W*tda?Ihcd'h\bfe2OaF]"pnpg^ioR86;Hrt<"@o[\mCh@$bAS"qo
+I<p0_FE)87AnGU`@q]UnCkHb]K5>LJGk?IbJ,XlsIJeKcIJeQmII_jaIK"WnHi8?fHi/9WHNJM<
+Gl;mfHMi$o<`N1#?!^fD?iF=H?X6uE?X@);<)Z^n;Gg@i;,U7g;Gg<i:]aKl?2]-KH3JS=G]e1P
+rcA6_EGodoD?=TiD#.iLC27R!CMWi_rG1k<"DD%;8P/nRs%<Ab8cD?^8H;B^9E.oh;>a;m;cN]o
+rDNSmrDNYorDEVor_ibpr_ibn!)WYms%rkp;,U<i;#jGf;$'Qk;>a8g;>*fh;,C(b;#X8i:]sQh
+:/"=ZEW'nXF8g4[F8p=`F`qs(Fo?L]G5umdGQ2pfH2W$hHi89jHiJKlIJJ?jJ,XurJc:9$KDC2p
+L&6W'L]3&*L]3,#M#`G2M><&.MuSb5M[kMjEc5l6Ch[KoA7]RDAc?<ABDQ<@C&MfBC\qrFD>A&L
+K_q&7QMm0MQN(juDu=SNEW1"YF8^4\FoQXaG6)r6rd&C-I!pElIt3'#JqJ]/L5(J>M2I4MNK9-^
+P*2&pQC+&.S"-(BTqS6WVPgAmX0&P.Yd1UC[^`lZ]Y2(q_Sa=2a2lEHbg+P^dF6Uqf@\d1gtgiE
+i8N_VjQ>Ufl07L!m-O0/n*ol;o()DErq-?dp\4[^s7u]kr;6Hjrr)HfJcC<$bQ!(~>
+JcC<$JcFa0m/Hn\rVZKgrqcZjr:p<ds7ZEa!qc*Urpg-\nF6GG!Uf@Sln7Vhl07EqkN:pgjQ#:[
+iS`YOhVI#CgY1B7f[na+e^W*tda?Ihcd'h\bfe2OaSo3;;ufqp<<#tu<:s8k<#[DD/LrM81bpa9
+0/#"85sIRq4Zk_`2`*BH1,Ahe#;nD&4@i1E;#F5c;uK\p;u]hs;uBPm;tX&\;ZTitpf.5krD`eq
+!)iepq,72jqbm/cpeh)jr)*nR/M&G-0/5+60JYH^1'KHj4[)"kr]LHL4?P\c3]d4!#WFb'4?Q)&
+6::`?pd"sH5=#!+!'C$;"?JP'3]cgn!B`OB4T.DE4#o4s2?#K82)[Al2$5ct3&^[s"?eq34[/j.
+!Br[G48_,I4?GVc3]fAa4$5Vgr]L$?!^&V.r]:0B4$<C(s#pBGr]L0Cs#^9ErBC-B!^Ak4r]CNO
+5X@\#5<qFu5XPE8s$-]Q5X.4fr)*Gks%rbmr_EMjoM>9Z!)`_lr_`\nqc!Jlq,I8jr_`_prD`bp
+rDNVnr_s#!;GpFlr_rkrq,7/i!E<(s<rZ8!=TDS'=8c8$=8c7u=oVV(=7]Pj<sDT#:f'q_:&[cf
+9hZsHrau1CqIokBrG).DqeZ.Hq/-1/qG[GnrD`eqs).XNr,DLPrc8$[rH/'^s*"Bc!I/nhH>IqU
+I=6QoJ:N3&K7ei3L51SAMMmFQO,oBcP*D5tR$a>3S=Z@HTqeE\Vl6VrXfek3ZEpsI\@K2`]t_A"
+_o0O7aND]McHjnce'uq"f\,!6h;7&IiT&tZk2tjkl0@U$m-a?2nF?&>o(2MQo`Fj]p\ssfq>^<h
+qu-HlrU^#>s+13ns*t~>
+JcC<$JcFg2li-e[r;?EgrqcWirV6Ees7ZEas7?<_rUL!ZnG_l8md9E.m-Es%l07Epk2tddjQ#:[
+iS`YOhVI#CgY1B7f[na+eC;sqdF$=ecHa\YbKJ&LaI8NarKmPMrK[DKrg3PKqN_&E$#Z)dKP@'H
+PDFhiM&U-0V5C&\S!T=uMMR%?K8kqQOL:.TUjRfHLQqV#r0@8Iq3CN8!L&]7OoLO:Oo:FEOcY\(
+OnFh4O8k1>Nr+n8NY@J6NfT3\EcH&=EI<(ZH?sj]H$K:5s*>,]?<poE?=.&F?!^lF?2\%.>6.uH
+rhBFc$DF)aSt2FAR[TY2rg!nVP)t`dOH5B[MMh@hregT0s,-`2qhP6/regK/repr/Cg'g;<W?)&
+<E)pt<W#er>lIt,>QA(/?3+D>r`oG.ra,V3rF#Y4r*BA1oj/28>[1Q>>[(H=?!LT;=^539r`T;+
+r`Te7>$G06>?kH>>?kB9=^(f/r`]>)"Bnr3>$:f+!*T8%!``?(rdk!!r.Fs$r.Y0*s+^T2re_)A
+MMd=LMi*CMMi<VlN<5&uNW"n;Ns:].P*2#mPl?mGPQ6pCPl?pJQN!3PR$jEBS,8`QSc,/VTDkM_
+U%b5ZU&(M^U&UkeUB%+hV>mFdV[oJ_J:2ciF*)A=D/XbsAnM$Tqe5tCrG).Dr+u:Jokjc5rPniW
+!6G,]!6P+Vqf)@Nrc8!ZrH/'^!-\<b!I/nhH>S"VI=6QoJ:N3&K7ei2L51SAMMmFQNfT9aP*;/r
+Q^F21S=Q7ETq\?ZVPgDnXKAY0Z*UgG\%&u\]Y;.s_Sa@4aN;TJc-F\`daZdtf@\g3gtgiFi8WeW
+jlY^hl07L"m-X60n*ol<o(2JFrq-?dp\4[^s7u]kr;6KkrVcBfJcC<$b5Zt~>
+JcC<$JcFg2li-e[r;?EgrqcWirV6Ees7ZEas7?<_rUL!ZnG_l7md9E.m-Es%l07Epk2tddjQ#:[
+iS`YOhVI#CgY1B7f[na+eC;sqdF$=ecHa\YbKJ&LaF]!@J,k)nJG"BjI2c7-An"eaEc,JsB4baW
+JUMomGB@kDC1q0i@q5LQ#]568KRdlYEd.,(rdXrss*ainomQaer-e0cqL/BkrHnNks*F`lqg8?j
+!IK4[HNJM<Gl2h/H?jd;<`E+#?X7#F?<piD?<plD?XI2><)cdo;,^CjqbdYp:f1"b;-SGHHO4tD
+H?ja[GBJ(OrcANgEGoc5D/F0+Ch[Y`B`MiFC&D]GC\qlGC[Q!RA6;Pt8P2TJ91hcI8kMZH8kVfU
+;H!HjrDEYp<;]\o;Z0Pm;ZB\o;ZB\q;Z9Vp;ZBT!:f1+g;,L.drDNVl!)WDe!`2`krD3Ml;Z9Ph
+:]jQk:f73grD3Ags%WYi92'@(EWC1ZEWpN+FEMbMq/u[[qf`$brHJ9ds*=Bcs*OcnrI+KjrI=fs
+r.4j!s+C-#pP&L!reLH,qhP-+oSNR)rJC?-regc8pkoZ9HuX(CDJO!"An5Ih6=sj/BDZBAC&MfB
+C]&#HD=qcHK_^o3QN3?KDu4MLEW1"XF8^4\FT?U`G6)r6rd&F.I!pElIt3'#JqJ]/KnbA=M2I4M
+NK0']OckonQ'[l+S"-%@TV8*UV5C/iWiW>*Yd(OA[^WcW]=bkm_8=+/`lQ9EbK\>ZdF-Oof%8R.
+gYCWAi8EVTj5oFckiq?sm-O--n*fc9o()DDo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s2t@l~>
+JcC<$JcFg2li-e[r;?EgrqcWirV6Ees7ZEas7?<_rUL!ZnG_l7md9E.m-Es%l07Epk2tddjQ#:[
+iS`YOhVI#CgY1B7f[na+eC;sqdF$=ecHa\YbKJ&LaAl7><;fho<;okt<;'>k<!b-2/1WD61bpa;
+r\+g>5s@Lp4Zk\a2`3HI1,Aed#WFn085E)[;c3-brD`YmlVd@RpJh)ir`&nrs&/hpqGR8jr)38d
+pJM)l;Go%D/-dm_0J>.71,Jnb!&=I/r]^<E#!P144ZYSar]1!<s#1?G4[_b/6UO706U3t)qa(3G
+s#^$=oJln4niHn85!Ad*rB13C3&^^mr\jd6s#0m7"#`/!4o7>D4[)"mr]L9G4oIJ@3rV5@3XIl/
+3]fGd4ZtniqE=g?r]C-@"$A_25Q3hN4[)%o4Zkk*4TRW-rBC6E!^8b1r]^<D#sCL=69d\"5<qL3
+62s1T5sR[p3B0l5r_ibn!)WYjs%r>`qG7/hrD<Mks&/_mr_iPkr)<Sm!)rhqr_rbnr_req"B/2r
+;cEZp!)r\krDN_r<W#nt=8Z2$=T)>#=9)G#=Sc/$=BG)rpf@u+;G^.a9MJ8T8kVfR-Y?uiBDZBA
+C&MfBC]&#HD=qcH;"[cf;u:M1E;=MQErL.YFT6I`G5ZUcG^9:7D0pYYI=?ZrJ:W<)K7nr5LPUeE
+Mi<XUO-#KePEhE"R$jG6SXuLJU84W_Vl?\tXfen5Za@0M\@K5a^;%M$_o9X:ai_fOcHsteeC<($
+f\5*8h;7)JioB(\k2tmll0@X%mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<hqu6NlrUg)?s+13ms*t~>
+JcC<$JcFg2m/Hn\r;?EgrqcWir:p<ds7ZEa!qc*Urpp*Z!:^!V!Uf@SlnRhkl07EqkN:pgjQ#:[
+iS`YOhVI#CgY1B7f[na+e^W*tda?FfcHa\YbKJ&MaN'^9rKmJKs-<VMrKmPMs-E_Oqj%2G.[+_9
+Mh#Q8R?E>WKo(Y!Xf&(lTpq=2NJ`IHJqArAOH-9$Z_2YsK85_Wq3LoCs-EJGqNLuFqNM#EP4"J4
+OS+b8Oogc-OT(C8OSY"?NfB$Yr/^`8#EOn+E,]f:E;P"]H3SY@H?ja^Hi@=R?X@)Hra#Y3?s`b9
+s'$"OU8+KXTV8$NT:VUDR@9TDQiE?WP`h)gOH>N^MuJV2M>rJ1M>rJ1M>W/0M>iD,MuS_BMg/l6
+<E3("<`T,u!*0"tr`oG,r`fG/ra#V4?N"./?2e10?iFI5?i441?hIb*>n1+F>[1K<?!U]>>$5'7
+>Q.h+>Q7k,=o;G)>[:Y6>6.l1rEK;*s&fA+=oMV'=9)M&<s)Q+=B59Nr.Fp#rIt9+!f)Sgre^u>
+MMd=LMi*CMrf$`6!fW+urJpo=#*=t1P*;)orfd>G!0d5CrfmJLrg*\RR@=)DrLE_TrLWkXrh0:b
+p7VGZq4de\s.TOhV#I4jV?*Tlp88IpO*lA%G]RqFE,KZG<+]cUqe5qBrbD7ErG;@Jo54Q3r5ScW
+!6G/^!m,A!qJc4Lrc8!ZrH/'^s*"Bcs*+Nhrd&F.I!pElIt*!!JqJ]/Knb><M2@+KN/is[Ockom
+Q'Rf*R[]k>T:qsRUo(&gWiN8(YHY==[C3QT]"G_k^qmn+`Q-'AbKS8Xd*^=le^rF+g=tH>hr*JQ
+j5f=akNM0qlg4!*mdKW6nac8Bo`"O`p&Ojcp]1-hqY^6ir;HTdrdk*#s2t@l~>
+JcC<$JcFg2m/Hn\r;?EgrqcWir:p<ds7ZEa!qc*Urpp*Z!:^!V!Uf@SlnRhkl07EqkN:pgjQ#:[
+iS`YOhVI#CgY1B7f[na+e^W*tda?FfcHa\YbKJ&MaN&j_rIFotq1/Kpp4!!h-Wb;#?rqSmD.[0d
+AS"knI=6EdF`;86BOk^b@VTXnC4C8WIr0.FGO^.^J,XlsIJeKcIHl:XIK+]mHiJKnHN8BgHNJSA
+I-Z+[H?f=4%XM2X<`W4+?=%#H?X@&Hra$UP?=7/><)Z^m;,^=h;G^4g;Gg7f;,0tmI=-EhHiA<p
+H[9p]G'<h,$?U<-E,TW2DJX*)rbDCGs(M@FrFu=JqeH+GmVE#A?rT]hr^m2a9)_E^9)hK^;uT\o
+;>jAn;cNZnr_a&$<)Z^n;H$Il;uKVn;u]bq;u]bo;?'Po;?'Gm;>sJm;?'Jf;$'Qk;>j;l;,[?i
+qG78k:f($g;#O2g;#a8n:J=GTErL.ZEWC1[FT6O[FoHR]G5umdGQ2pfH2)^cHiJKlIJJ?jJ,Xur
+Jc:9$KD:,pL&6W(L])u(L]3,*M#`G3M>iD1M>E,/MZAY.M\(ViEH#f3CMIHnAS5pMAnPcRB`2ZE
+CADZDD#8)@D?,@dPlR-LQNEIkDu+GJEW1"XF8^4\FoQXaGQ2mfH2`,,H[L6iIXcitJ:`E+KS>/8
+Ll$tGN/WdXO-,ThPa.Q%R@9V9StD^MUSOcbW2co#Xfnt7ZaI6N\[oGe^VI\&`5Td<aihoRcd:(g
+eCE1&g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCW%Ts7QHerV-BgrqcQirqu`no_sFAJcEmm
+J,~>
+JcC<$JcFg2m/Hn\r;?EgrqcWir:p<ds7ZEa!qc*Urpp*Z!:^!V!Uf@SlnRhkl07EqkN:pgjQ#:[
+iS`YOhVI#CgY1B7f[na+e^W*tda?FfcHa\YbKJ&MaN%:\r`&eqrD`Yos&Strr_t<u0eOq13AiTH
+/h\n52F0Sl4$G_d3Ar`O0ekFA2`<NQ5!DJ4:f:7i;Y!cd<;KP_;X[QY<;]\p<<#ns;Z9Vj;Z9Vm
+;YO&_;@ZVX.kE2$0J>.60/57<1]B-A0f(XB5!D+n4Zttk4?GJ_3][-u#<=b*6psL56iKLP6Mj(K
+579V94$5Yg4?GYf3][1!p,N+6q`=d?q)\X?5!Ad*rB13E3]Hsos#0j6"u\=r2EsDhq`G0J5!;%m
+4Zttm4T7G?3rV2F3]fA`4$5Y)4o[YA4o[VN4Zkef3]]>c5<o-2s#gBH5PdMD4$EO+s#g?Gr]L9H
+55mYL4[25!5<hCtr]pBI$p[*D5X.7g3DraP;,I6fs%r>`qG7/hrD<Mks&/_mr_iPkr)<Sm!)rhq
+r_rbnr_req"&i)q;uKYq;u'>i;ZTitr)Ni"=T)A&=Su8"=9)G$=SZ+j=SPtr=9DGt:f%'brC[8h
+.V<=+qe5qBrbD7ErG;@Jo54P)p/D)lDf>Jkpi6:RrcA$[s)n?brceBe!."QiD0pYYI=?ZqJ:N6(
+K7nr5L5:\CMN!LSO,oEdPE_>uR$jD4SXuIITqeE\Vl6VrXf\e2ZEpsI\%0)_]t_A!_SjF6aN;WL
+cHjkbe'uq"f@em4h;-uHiSrnYjlYail0@U$m-X60n*ol<o(2MQp&F^cp\jjeq>U6gqu6NlrUg)?
+s+13ms*t~>
+JcC<$JcFj3li-e[rVZKgrqcWirV6Bds7ZHbs7H?_rpgcnnF5o8mdBK/m-Es%l07Epk2tddro56_
+iS`YOhVI#CgY1?5f@SU(eC;sqdF$=ecHXSVbK@rJaMu3uQi!*KPlR-GQN3?KPq&#^PAk5oKl!KQ
+P)"UEM2Q#LW2QJbS=,V&MMI"@JrPePOK4SPT6c*AM#EV7QMd$IQMHg;PlHpIP4"G4OS+b7Op$o/
+OHG[uOT(:@OT(:CNfB$YqiCZ8"-7MCErL"cH@(!bH$Xa^G^4R\rd+]o?=*P:#[LbC?XI)E>[@>6%
+<SGBUSFKTTqJ$NSXl8LRf8ZRQ3rh=O-#KcNJi^PMZ/G4M#N55Ll%"HqM>30qhb3+rJLB.req>@F
+'r!J<`N1$<)Zar<)ig$rEK;,!+#S1s'Gb4r`oJ/ra,S2ra>b5r*BA1oj7Z(rETA,&6rLG>?b66>
+[(E9>$G37>$:c,s',P0rEB;*>5_\*>5qb*=oqi1>5hV*='8Z'<rlE'rdt*$r.P$&re:K0Ll)+g#
+`FRuMi*FMMi7Rnqi(Z9NK*mss,RAGOcklkPEc'1rfdDHq3:lD!1*VN".5LFRf8fTSGJfUT)##XT
+`:_ZTE(\\UAU_bU&h$brM9RmVl'*a&"nr1H[9mWEc5u9EdUi!BDZBAC&VlCC]/)ID=VTEDZI!=`
+rF'\aND[%E;+AOErL.XFT6L`G5c^cGQ<$gH>._RI=6QnIt3'#JqJ`1L5(J?M2I4MNK0']P*2&pQ
+C!u-S"-%@TV8*UV5C/iWiW>*Yd(OA[^N]V]=bkm^r"".`lQ6DbK\>YdF-Lnf%8R.g>(N@hr*JRj
+5oFckNV6rlg4$,n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTcrdk*#s2t@l~>
+JcC<$JcFj3li-e[rVZKgrqcWirV6Bds7ZHbs7H?_rpgcnnF5o8mdBK/m-Es%l07Epk2tddro56_
+iS`YOhVI#CgY1?5f@SU(eC;sqdF$=ecHXSVbK@rJaMu3uJGaooJGjumIf=aD=]8sC=F"t)ARK+^
+B2sP3I<p-]F)Yu1AS,F^C2.O#J96HoD/jT@J*_XaIJnQdIHc4WIK+]nHiAEfHiJHoH[PX9!.=Ec
+!.+Qg$s?Y6<`W4+?=$uE?=!M9%:<LM?scl4;c6Lj;c$?h;ZBSn;$Tj'IXZZlH[Pd<s*+Nfrc\9`
+!HW8[E;sbXDJO')C&VlFC&_lFC%c<?C\qoJC\;KGBNn>*r^m;d8kDQFr^m8h;H$Nn;Z9Pl;ZBYq
+<;fbo;@$6#;c6Ll;H$Nm;Z9Vp;ZB\q;Z0Jl;?Kcm:f73ir_`\lr_`\lrD<Vm;,R6f!)ibmpJCle
+s%rVhr_Ntu:/4JV965/pEcZ=$F9-N-q/u[[r-/0crce?ds*=Bcs*OcnrI+KjrI=fsr.4j!s+C*"
+pP&R#rJ1?+qM5'+qMG3/s,$]3qhb0,s,-l7onsB?KmI`XDJX*&B4PReD+/)Mqe5tCrbD7ErG;CK
+no"JG!/136!g]1>qJc1Krc8!Zr,hs]s*"Bcs*+Nhrd&:*I!pElIXcluJV&N-Knb>;M2@+JN/`jY
+OHPckQ'Rc(R[]h<StMdOUnsrdWN*&%Y->1;['mEQ\\#Mg^VI_(`Q$!?b0/&TcdC1ieCN7(g=k?<
+hV[8Mj5]7`k3)!nlKdg(mdKW6nc&([oCW%T!quB_rqQNhs8)Zjrqu`noDX=@JcEmmJ,~>
+JcC<$JcFj3li-e[rVZKgrqcWirV6Bds7ZHbs7H?_rpgcnnF5o8mdBK/m-Es%l07Epk2tddro56_
+iS`YOhVI#CgY1?5f@SU(eC;sqdF$=ecHXSVbK@rJaMu3t<;fhq<;]bq<r,hq<#dM>/h8Y:2)?p=
+0/,+=69mau4Zk_c2`3EI1,1`e2@DN/5"ACG;H$Fi;H!3e!)iPimS`LPpJh)ir`&nrs&/kqq,72j
+rDEYp;YX,a;ZABJ/-[d_0eY481&Ea*1]KWF4?Ykk5!(kf3BI+!#rjq*4@M\.7RKQB7/fLS5sdp:
+5n#tC4Zb_g4Zkhg4$5P"3;,?43rD&>4SUu=4[/^)rB13D3B$dm!&jg6"u\=r4$Gklq`FmB55RJD
+5!8g+q`=a=#!+h,3]fGdr]U9Dq`XsA#sCC54$#Da4[)+056!bI5!M7.4TRZ.rBC6E"[5(45!M70
+4:+5;5sRY"5X.M!r'C?J"[PC<3B0%u;>j8j;"RQ\;#aDl;#X>l;YsDl;Ya;i;uTYp;uK\p;uKVn
+;uT`!;c6Lm<W5tt;u'>j;ZKhq<rZ5$=T)A&=Su7s=SQ%s=9)M!=SZ%q=:\J0:esk^:JFJT9MA/0
+B4q*Trb;@Hq.oqFr,)"Bs).m6pJh!.pMp1QrcA!Zs)n?brceBe!."QiBmY5UI=?WpJ:N3&K7nr5
+L51VBMMmFQNfT9bP*D5tQ^F52S=Q7ETq\?ZVPgDnXKAY0Z*UgG[^`l[]Y;.r_Sa@4aN2NIc-FY_
+daQ^sf@\g2gtgiEi8N_VjlY^gl07L!m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVc?eJcC<$
+b5Zt~>
+JcC<$JcFp5li-bZr;?EgrqcWir:p<ds7ZEa!qc*Urpp*Z!:^!V!Uf@Sln[nll07EpkN:pgjQ#:[
+iS`YOhVI#CgY1B7f[n^)eC;sqdF$=ecHXSVbK@rJaN)9=Qi<9NQ2[*KPmNbCQBml'Q^=#(r08ar
+PELQ6N.Yf;SWSb]M2I+%Y,S:rURRR7OGemLK7T&DOH,9bZ_2VsK8KMkr0@DLQBqE5s-EJGpQYT>
+s,uf4!0Hi8rfR8DrfI/BooT'3"-/A#Nr+n9NrF,!E<:*,HiA9kH?oL9!IK.lHOO4d?=7&G?sd5H
+?XR4>>lS(>>^iTHU8+KVTV8$NTV%eSRK/`SQO9%CP`h)iOcPK\MuJV0M$&QjMMh7e!/gZ1qhY3.
+pP]$0"Fk5k<E9$!"&r2t<;Tr!>Q.k-?iF@4?XE_:s'>V1ra5V3s'P8%s'>Y0&RAXG>?kH=>?b65
+>[1K:>$G51=o__(=p%u6?!RA5#?b56>?b?9>5hY2>$5$4=]ed-=]tZ("'JZ*K)UE#K`-W(L'!-d
+M>iA5Mi.Ik!fDnorf$`6!fW+urJpo=#*=t1P*;)orfd>G!0d5CrfmJLrg*_SR@9TDS,JlSSc,/T
+T)bP_U%Y/SUA^eaU&h$brh]UkoVW4uVjr`oH['aUEc5u9Fa/Q9B`;`ECAM`ED#A/CDYe8OYPcE?
+`rX<)rc%RNrGqmYr,hs]s*"?b!dK!9rd&[5I!pElIXcluJV&N,Knb>;Ll%"IN/`jYOHG]iQ'I]'
+R@9V9StD^MUSOcbW2co#Xfnt7ZaI6N\[oGe^;%M$`5Td<aihoQcHsteeCE.%g"P39h;@/KioB+]
+k3(sml0I^&mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`no_sFAJcEjlJ,~>
+JcC<$JcFp5li-bZr;?EgrqcWir:p<ds7ZEa!qc*Urpp*Z!:^!V!Uf@Sln[nll07EpkN:pgjQ#:[
+iS`YOhVI#CgY1B7f[n^)eC;sqdF$=ecHXSVbK@rJaN)9=JGt#uIf=iqJGXilIf=aE@8plK<HrV%
+B45IdAQFD2I!p9_F)Yu0An>C[CMIX"DKU\`D/sZAIt-d5!.FfnomQ(RqL/Bkr-SHkpNlshH[P.+
+!.+Wi&6`4==&rC&?=$oD?!goF?s`h?s'Pe)"]SDt;H$Nm;?'N';,C+f:1Sj'I=-BhI!P^;s*+Nf
+rcSBdFEDR&E!C5tDJj9,C\qlEC&_lFC%c<?C\qoJC\2EEA6;S*8de9a8OuBD;,L.f;cEZnrDEMk
+!E2tr;uKSo<;ohr;?Kiq;cEWmr_ikr;cEZnr_`Yms%ren;>sJm;?'Jl;?'Jm;$9]m:f($e;#F2g
+:]OAj:]OAl;#O2h:]O;j:B!ogEcZ=$F9-N-q/u[[r-/-bs*+Hes*=Bcs*OcnrI+KjrI=fsr.4j!
+s+C*"pP&R#reLB*qhP3-q2,*.!/^W2qhb0,!fMqnoSX6=Mh?:pE,KN,BkCsgBPVVbB`;`ECAM`E
+D#A/CDYe8OK_gr7QC%Sip2U%OrcA!Zs)n?brHA<fH$TC8FF/C`I=?WpJ:N3&K7el4L51SAMMmFQ
+NfT9aP*;/rQ^F20S"6.CTqS6WVPgAmX0&M-Yd1UC[^WfY]Y2%o_8=.0a2lBGbg"G[dF-Opf%8U/
+gYCWBi8EVTjQ5Oekiq?tm-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$ao?k~>
+JcC<$JcFp5li-bZr;?EgrqcWir:p<ds7ZEa!qc*Urpp*Z!:^!V!Uf@Slndtml07EpkN:pgjQ#:[
+iS`YOhVI#CgY1B7f[n^)eC;sqdF$=ecHXSVbK@rJaN)9=<)`cq!*/nq#$"W%<E3(#qGmMo-RUAp
+.PWqA1,(@70ekRR5s@Iq4#f8[2)I'C0fM!L2E*f`7o)u[;uKPn;Z'Ji;Yj>X;X[QY<;]\p<<#nr
+;ZB\l;Z0Pl;YX,c;?eg./M&D(/H.C(0FTZi0ekF=0etR@5!;+/4o[_G4T@DM3]T/\3&rr^7R]^7
+7fGdT7/K=N5mBS=5<_4m3rV5F4$5Ve3][!qp,N+6r&ap@q)\X@5!Ad*r&k'A3;bW62Z5N43s%Q0
+55IAA55RJD5!Aj+q`=a=#!+h,3]fGdr]L6DqE50J4Zkhg4$#Gc5!T!0"$Jh35PmVD49.PC55dVH
+5!M4pr]L3Fs$?ZL"$f(95l<qJ5R0S?5<h+f3)KTM!)WAb!DZGf;#X>l;#X>l;YsDl;Ya;i;uTYp
+;uK\p;uKVn;uT`!;c6Lm<W5tt;u'>j;ZKhp<WZ?)=T2J'=T2Ct=SQ%t=T;P"=SZ%t=9)M&=:SD5
+;,9t_:/">S8kViT8Gd*"C&MfCC]/)ID=qfCDZEW/<;pk1EW'qWF8U.[FoQX`G63#7H2`,3H[L6i
+IXZcsJ:W<)K8#&7LPUeEMi<XUO-#KePEhE"R$jD4SXuIITqeE\Vl6VrXf\e2ZEpsI\%0)_]tV7t
+_SjF6aN;WLc-F\`daZguf@em4gtglGi8WeXjlYail07O#m-X60n*ol<o(2MGp%A%Pp\jmeq>^<h
+qu6NlrUg)?s+13ls*t~>
+JcC<$JcG!7lMg\Zqu$<frqcWir:p<ds7ZEas7?<_rUL!ZnG_l:md9E.m-Es%l07Epk2tddj5].X
+i8EMLh;-l@g=k64f@SU(eC2jndEp4bcHXPUb/q`Ga2Z*:QBqN8s-<bPPa%I1Q3*D=QMm*KPTH$O
+KPca#K:eWqL4Y5<M/')jWMZG[R$EbmLk^S6NrG(FOdibaH@pp/PkLCAQMd$IQMHg@Pl-aEP4k"<
+OSb.?OSP"=P5UOBOoUXDOT1I9OSb(=NrG%8O8k4sG]e+LEH#l:H[0j^G^+OZH?jd^H[L6J?=7,H
+?XR2H?XI2I>[(H=?APVXV4s`YTV%pMTDkG]RKf.EQ^<u%Pl6aENWtH#MMm=HM"ul1Ll$tGMY)c&
+M#E5)MuS_CMg/l7<E<1&<`<5u>l@n,>R4YC?=$uF?!LY6?2e11?iOL9?XR5Jr*BA1oj/><>[1Q>
+>?b?<?!LT;=^,-8>$>-7r)s2,>$>/0>mOY>>?Y05>?bA3>5q_3>$5$4=]ed-=BYQ'"Bef*<eL='
+rIt6*!f)Sfre^i:MMmCOrJUZ6qi(Z9NK*mss,RAGOcklkPEc'1rfdDHq3:lD!1*VN"dk^HR[]fE
+SGSlUT(nrXT`1YZTE(\\UAgkaU&h$brMBOkoVW;"Vl-D[MLKnsFEMP@EH62HMYq/eC&VlDC]/)J
+D=qfBDuXbVYPcE?`rO6SEW'qWF8L(ZFoQX`GBJ.UH$Xd`H[L6iIXZcsJ:W<)K7nu6LPUeEMi<UT
+O,oEdPE_>uR$a>3S=Z=FTq\?ZVl-MoXKAY0Z*UgF[^`l[]Y2(q_Sa@3a2lEHbg+P^dF6Uqf@\d1
+gYL`Di8N\UjQ>UfkiqBum-O--n*fc9o()DErq-?dp\4[^s7u]kr;6HjrVcBfJcC<$ao?k~>
+JcC<$JcG!7lMg\Zqu$<frqcWir:p<ds7ZEas7?<_rUL!ZnG_l:md9E.m-Es%l07Epk2tddj5].X
+i8EMLh;-l@g=k64f@SU(eC2jndEp4bcHXPUb/q`Ga2Z*:It.HHs*t#upj`0ird>_o<G>fKGB7V4
+@:s4b=+PgLH[0aTEG]H&AR]-JC'eZpGDD2qEcQGSrdX9`s*alooR6"RqL/?jrHnQlpNm$jH[L0f
+m<]=hH!FQW=]SO'='f3=?=!P:r*LCN@8g-(;c-Cj;,L4h;,U:h:f(#(IsufmI!U2<HN/6iGQ2jc
+F9$=[E;j_\D/=$(C27QuC&VlFC&VfEC%lB?C]%uKC\2EECLC-@9)hNd8k;`SrDEPmr_i\lr_`bq
+<;]\o;Z0Po;Z0Pm;YsDj;ZBVo;Z9Mn;#O;l;$'Qk;#X;n:f1*c:]jKi:f@9ir(mSp:f("c:f70f
+s%`VirD<Jgs%EGc9`B/.FoHR^GQ)jeGQ2peH2)^cHiJKlIJJ?jJ,b&rJc:9$KD:,oL&Hc*L\li'
+L]<2,M>)o(M>2u#MuJYFMh6.lDf0B,C1h-kC2A"iB`;`FCAM`ED#J5DDY\5NDut]WPl-dHQM#7r
+ErL.WFT6L`G5ZW-G^4R\H@(!dI=6QnIt3'#JqJ]/L5(J>M2I4MN/is[OckomQ'Rf)R[]h=StMdO
+UnsueWN*&%Y->1;['d?P\\#Mf^VI_(`Pom=b0/#ScdC.heCE1'g"P3:hV[8MioB+^k3(smlKdg'
+mI'H3nF?)?oCW%T!quB_rqQNhs8)ZjrVZWmo_sFAJcEjlJ,~>
+JcC<$JcG!7lMg\Zqu$<frqcWir:p<ds7ZEas7?<_rUL!ZnG_l:md9E.m-Es%l07Epk2tddj5].X
+i8EMLh;-l@g=k64f@SU(eC2jndEp4bcHXPUb/q`Ga2Z*:;cE6dq,RDn-RLAs-n7271GCI80JGFP
+5X%@o4?5A\2Dd0D0fM!L2E!]_:/Fec<;]Vn;ZB\k;ZBSo;Z'Jk;?0Yb;XdWY<;fbq<<#nr;ZB\l
+;Z0Pl;YO&e;ZABN0J*/S!\uJar\=F.,;Cr/0etL?5!D(l5!;(l5!(bc3B9&Z3BBDp77K^86pj:/
+7/B4T5sR\"5<_4lr]C?G4?G\f3qYK,3<2,<48qA@49%DF4$>bjq`Od>!^&M&r&"O62*1[t"$Jk4
+4o7>B4[/d,!Br[F48M#;49%>C4$5Y!4oIMB3s7T,5!M:/4p+#54[/g-!B`OD56!bH5!Aj.r]CKN
+5=%V#5<qFu5l<qJ5RKeB5<h.f3''i3;"m`e:/=[`;#X>l;#aDl;YsDl;Ya;i;uTYp;uK\p;uKVn
+;uT`!;c6Lm<W5qt;ts8j;ZTitqc<\ur`K5'rE&htpK@JtrE9#"q,dPts&o2#%9$)":JOVY9M7uQ
+9M\:YB`;`FCAM`ED#J5DDY\5NDu``1<:t80ErL.WFT6L`G5ZW-G^4R\H@(!dI=6QnIt3'#JqJ]/
+L5(J>M2I4MN/is[OckomQ'Rf)R[]h=StMdOUnsueWN*&%Y->1;['d?P\\#Mf^VI_(`Pom=b0/#S
+cdC.heCE1'g"P3:hV[8MioB+^k3(smlKdg'mI'H3nF?)?oCW%T!quB_rqQNhs8)ZjrVZWmo_sFA
+JcEjlJ,~>
+JcC<$JcG$8lMgYYr;?BfrqcWir:p<ds7ZEa!qc*Urpp*Z!:^!V!Uf@Sln[nll07EpkN:pgjQ#:[
+iS`YOhVI#CgY1?5f@SU(eC;sqdEp4bcHXSVb/q`Ga2Z*:_toYtPl?sFQMm*KPUVfZJq/u5Jt\Zu
+N/!1FLhEfhW2QScR$EelL5:P9Nf]9^VQ,Z]H%^j.rfm,As-EPIs-<_OQBqB4qiq,G!0mAEooT69
+mZII2!0R8B!0Qr9qMt]<NK*gr"*f!1F8g.iE-chUH?jjbH[9p`H@1-fra#e:?!guI?!dM;#[LY=
+>[EDiVl'Hfs.KCcrLX+\Rf8]hQC!r'P`q5lP)t]aN/<FMM2-h@M"ul1Ll$tGMY)c&L]E;2MY;u-
+N!Y2Z@9$?0<aK$8r*0;->[753s',b7?X@&G?=!P8s'>V1ra,e9?XR5JrEfM2oj7Z(&6rLG>[(H=
+?!LT;=^#$6>$Co0s&oD*rE9;->[:Y6>6.l1rEK8)%9Zk;>$>'2=BAR,='&N&<ruB'<W7[ML&Qf.
+LPUfdMZ&G5N;eb6N;\b9NrG%:NrP.EOHG]hPEV71PQ$dHPPLIBQ2d0MQN`bER[T_8rLE_TrLWeV
+s.K@bpn7Y\pnIe^qk==jUnso`V5:'ZVuN\*V433gH?aRRDf0Q8GB/T?B`;`FCAM`ED#J5EDYe;K
+Dum/]rPnlXpi67QrH%jXs)n?brHJ9d!."Qis*J[3I=6QoIt3'#JqJ]/KnbA=M2@.LN/`mZOckll
+Q'Rc(R@B_;StD^NUSOcbW2co#Xfnt7ZaI6N\[oGe^;%M$`5Ta;aihlPcHsteeCE.%f\5*8h;7)J
+ioB(\k2tmll0@X%mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<hqu6NlrUg)?s+13ks*t~>
+JcC<$JcG$8lMgYYr;?BfrqcWir:p<ds7ZEa!qc*Urpp*Z!:^!V!Uf@Slndtml07EpkN:pgjQ#:[
+iS`YOhVI#CgY1?5f@SU(eC;sqdEp4bcHXSVb/q`Ga2Z*:_ghW6!.Xuuq1&0g*IVC'CL1CmF)G]&
+B4b^UJUW#oHZsLNChRBl@q09QCCGN<FHC<ZF*W1_IXck5If+WoIeS9TIenKmI/SEkI/&'dI-l7c
+?!CH6=&r@'ra$+B?!q&H?X7)I?XR5>;cH]p;@HK$;,U7g;Gg7e;/Ca]IfFcpI/\EoH[0j\rc\Tj
+FEDSDE,]apD>nANCBSBdBPD2[CA_cIBPD/XC%lB?C]/&LC\)?SB3S5*8kVfT:esna;,U7h;cEZn
+rDESms&/nsr)<SmrDW_os&0&";c?RlqG[8h!`;inr)*GkrDEPj!Du\m;>O,h:B=9irDEDf"&Vlk
+;>j>k:B4/g:]O;j:'=6`9M'@$FoHR^GQ)jeGQ2peH2W'hHiA?kHiJKlIJJ?jJ,b&rJc:9$KD:,o
+L&Hc*L\li'LB*/,M=ui'M>W52M>iD)MuJ\8N=LhtG&VA:Chm]rAnPjlF8fkPC&VlDC]/)JD>%lD
+Du4JRK`./7Q2#@tErC(VFT6L`G5ZXbGQ<$gHN/>1I!pElIt*!!JV&N,KS>/9Ll$tHN/WaWO-,Tg
+Pa.Q$R$jG6SXuIIU8+N]Vl6VrXf\e2ZEpsI\%0)_]tV7t_SjF5aN;WKc-F\`daZguf@\g3gtgiF
+i8WeWjlY^hl07L"m-X60n*ol<o(2JFrq-?dp\4[^s7u]kr;6KkrVcBfJcC<$aT$b~>
+JcC<$JcG$8lMgYYr;?BfrqcWir:p<ds7ZEa!qc*Urpp*Z!:^!V!Uf@Slndtml07EpkN:pgjQ#:[
+iS`YOhVI#CgY1?5f@SU(eC;sqdEp4bcHXSVb/q`Ga2Z*:_c-&(q,JD6-7:Gr.QTIE1+k460/c-^
+5!M1n3B9#U1bpg@rAFm?5=SCE;,C3f;#jMn;u]bl;?'Pl;uBPn;tEoT;tj8i;uTbr;uTYp;u0Dj
+;u9Jf;?'ND0J>%1/1`;&1,:R;0f(R?1GLX?0etLJ4[(tk5<V1l4ZYSa3B0&Z3^?147K,[S7/B7M
+62s1[5<V+j4?Y\e4Zkhg3]K.m3;5E53r;#=4T%;?4T@VA4T%>K4#o2V2Dm?S4$*=%"$Ab34o7>B
+4[/d,s#pEFrB'm;r]C-@!BWF94T[`/4T%8B5!M:-4omf1q`XmAs#gNL4Zttn55mYL4[25!5X.Lu
+r]pEJs$-iU5X7Ou3&ru[pJ1ic:J^mbr_`\ls&&bnqG[Dlq,I8jr_`_prD`bprDNVnr_s#!;GpIo
+r_rkrpeq,j!E<(r<rQ5#=TDS'=8H%m=oVV%=o;Ct=8l>$=nu/0<`Dmm:JOYZ9hJ&R:/+@[B`;`F
+CAM`ED#J5EDYe;KDuid6qc*?1rGqjXqfMj\s*"?bs*+Nhrd+TkDgZt]IXcitJ:W<)K7nr5LPUeD
+Mi<USO,oEdP*D5tQ^F21S=Q7DTq\<XVPgAmX0&M-Yd1UC[^WfY]Y2%o_8=.0`lQ9FbK\>ZdF-Op
+f%8R.gYCWAi8EVTj5oFckiq?sm-O--n*fc9o()DDo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s2b4j~>
+JcC<$JcG'9lMgYYr;?BfrqcWir:p<ds7ZEas7H?_rpi5BnF5o8mdBK/m-Es%l07Epk2tddj5].X
+i8EMLh;-l@g=k64f@JL%eC2jndEp1ac-4ASb/hZE`l5p7_Y]VrPlI$GQMm*KPUr#]J<PP&BUtHH
+K8,/;BWeJ9VPKfPQ'./_LPCG6O-#Eo[#_J;K8,>JPa%C2PkgUDQN*6GQMHgDPlI!KPl$[EP5^RD
+P5CCAORnS7OSt=@OoUXDOT1I9OT1@AOT(:BNfB%sNs^5ZGB7bBE,]iDHMr+5H@'saI!^3fIpQGh
+?sR,H?sR)G?sm5D>@)cXWhuVeUS4C[TGX;oT:;:<R@0D.QB[VtOcklfNf8mQMMd8fL\Zc.Ll$uf
+MY)c'L]E;2MY2o,N!XuM>ZP0<?X6l?qHWu's',b6?X@&G?=*V9s'>V1ra,Y5r*TG0s'PJ+ra#G,
+$!UY?>[(E8=^,,0>5qh+=o__(=oqr7?2e%0>$5#,>Q.e6=^#!3>$>$1=&rI+r)X#'<E<+"rIt9+
+s+^W2M>iA8Mi<RPN;eb8N;JV7NrG%9NX(W,OcklkPEc'1rfdDHq3:lDs-E\O"dk^GR[]fFSGA`T
+T(noXT`(SZT`:_[U&^naU'IHhV50o`V5Ed\rMU:(RY-!5GBIqDE,frCEfXmIrb;@HqeQ.HrGD:H
+qeu:Ls)A(C`W!mWa89lSErC(VFT6L_G5ZUdG^4T6H?":ZI!pElIt*!!JV&N,KS>/9Ll$tGN/WaV
+O-#NfPEhE"R$jD4S=Z@GTqeE[Vl6SpXKAY0Z*UgF[^`l[]Y2(q_Sa=2a2lEHbg+P]dF6Uqf@S^0
+gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DErq6<b!;HHe!;ZWjr;6KkrVcBfJcC<$aT$b~>
+JcC<$JcG'9lMgYYr;?BfrqcWir:p<ds7ZEas7H?_rpi8CnF5o8mdBK/m-Es%l07Epk2tddj5].X
+i8EMLh;-l@g=k64f@JL%eC2jndEp1ac-4ASb/hZE`l5p7_LMQ6s*k$!pj`$e-[f<;?s-HOE+iZk
+An>"pJ:2cjG'%\@C1Use@UX%gCj1SVO_f#YH2W0UIf+WnIe\?UIenKmI/J?kI/A6lI!^5<I/80i
+I.qt(?<g`;=B8F&=']*<?!UfD?XI,J?sd;MrDW\n!`MrnrDF&$:f:kSIsuinI!U0erd"]oH$FRX
+rc\<`#BFd&Df'?0D>e;NCBA6aB`2ZECAMWEB`)T=CA_lGC]J8AC_1,Z:.eA];G^.b:f:1g;H$Nm
+;Z9Pn;ZB\q<;fbo;Z9Vp;ZB\q<!#ur;Ya8d;Z0Jl;Z0Ji;#aDl:]O;i:]aEh;Z9Pe;#aDl;#a;l
+:/Cjc!)NSh!)<DbqfVj\rHJ3bs*+Kfs*=Ngs*FlpH[:$crd=]nq0r9ls+'utrdt0&pk8?preCE-
+qhFs&qMFm&qhb9/s,$`4oo&d-rJ_AEJou!LD/*fuAS,RkApA!&rb;@HqeQ.HrGD:Hqeu:Ls)A$l
+rKR>Iqf2OSrH%jXs)n<arHA<fH$TC8EI3(\I=6QoIt3'#JqJ]/KnbA=M2@+KN/`jYOHPcjQ'I]'
+R@9V8StD[LUSO`aW2ZeuXfen5Za@-K\@K5a]t_A"_o0O7aND]McHjkbe'uq"f@em4h;-uHiSrnY
+jlYail0@U$m-X60n*ol<o(2MQp&F^cp\jjeq>U6gqu6NlrUg)?s+13ks*t~>
+JcC<$JcG'9lMgYYr;?BfrqcWir:p<ds7ZEas7H?_rpi5BnF5o8mdBK/m-Es%l07Epk2tddj5].X
+i8EMLh;-l@g=k64f@JL%eC2jndEp1ac-4ASb/hZE`l5p7_XCJ"<>ea_0.Jb22Dm0@/h\k96U<n"
+4Zkbc2`<KLr\=C1!]`P9r_WVmq,./ir_ieppeh#gs&8hnr_rGe!)rhqo2GB_r)<Vps&8nps&8em
+r)<Sm!E2nk;$A[.0J4t0r[e"&"u7th1,C[ArA"I=4Zu".4W?RH4?>J`3B0#Z5"8"17R]d76UF..
+6UF.,5skQ:"[YI=4Ztq,4U3u14$,Pd3B6stp,Me,!':!=r]L-@"[+t04[)%+4Sq8D3]K#UrB($?
+r]:3E5!M4-497T/q`OsD4T.A=3rM,A3]fIp4o[YD3s.T.5!Sg+qE=d@s#gNL4Zu"n55mYO4[21t
+5X.M!5<qL362a(K56Nr+2`j(t:]F2i:]4,g;?'Jm;?'Pi;u]_q;u0Jk;uTYp;uK\p;uKVn;uT`!
+;c6Lm<W5qt;tj/k;cHcp<WH5#=T2G'=T2Cu=S5es=Su>#=SPts=T2It=:eP5;G^+a:JFPU8kr,T
+8SDf:C&VlEC]/)JD>.rFDu"APE</m7r)EQ5r,VaWqfMj\rc\6a!dK!9rd&R2I!g?jIXcitJ:W<)
+K7nr5LPUeDMN!LRNfT9bP*;/rQ^F20S"-(BTV8-VV5L8kWiW>*Yd(OA[C3TU]=bhl^r""-`Q-'B
+bKS8Xd*^=le^rF+g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo`"O`p&Ojcp]1-hqY^6ir;HTd
+rdk*#s2b4j~>
+JcC<$JcG*:lMgYYr;?BfrVHQiqtU3cs7ZEa!qc*Urpp*Z!:^!V!Uf@Slp^7*l07EpkN:pgjQ#:[
+iS`YOhVHuAg=k64f@SU(eC2jndEp4bc-4ASb/q`F`l5p8_SVP&Q'@PuPE_;qPa%GuQBd`$qir[r
+PCf'PDe>Q)Ne`1ALhNomW2HD^S!T:sMMQq>Jrl%S['c%'H%Ud/Ocbh+PQ$gBQ1UC=Q2?gGPlR'G
+P5pdEOT:RAOoLO3OoLUDOoLOCOnFh9NrY:@O!KaFNK0'JH[0aTEcH#=H$Xd^H[0j^H@1*eI!pKn
+?XI2I?=71??N4CA?<g`>DQBe:VPBl[T`1YbTE:aYT)P/fR@';,QBd\uPECodO,X$p!/^]2r.k*)
+!/UW2s,-]1!/UN/qhY3.oo&j/!fM;CrEf\6>?b?<r`fJ.>l@n,>QJ,;r*KA-s'>V1ra5\5r*TG0
+!+5D*s'>J+$sd+B>?P*5>?Y37>[783!*T8($sR"C>[1K:=]np4>?q/2s&fY3=^#!2=BAO+=o;>)
+<`N1#<E/sPs+^W2M>iA=Mi<RQN/NXQN/[Xns,R)<rJpo=#*=t1P*;)orfd>G!0d5Crg!MLs-EnV
+R@0M5S,SrQSH>CRT(elUT`Lg[qk3q^n=foXrM9Iis/,=ari#jr&Z(tKI!^-]Ec6#:F*_hlWG-)G
+CAM`FD#J5GDYnAKE;FSS`W*pXa8U)VErC(UFT-F_G5ZXbGlN'gH3&A?rd=frJ,Xt.JV&N,KS>/8
+Ll$tGMi<XUO-#KePE_>uR$a>3S=Z=FTq\?YVPgDnX0&P.Yd1UC[^WfY]Y(tn_8=.0`lQ9EbK\>Y
+dF-Oof%8R.g>(N@hr*JRj5oFckNV6rlg4$,n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#
+s2Y.i~>
+JcC<$JcG*:lMgYYr;?BfrVHQiqtU3cs7ZEa!qc*Urpp*Z!:^!V!Uf@Slndtml07EpkN:pgjQ#:[
+iS`YOhVHuAg=k64f@SU(eC2jndEp4bc-4ASb/q`F`l5p8_SZ8#pODmc-[f?=@9HQPDe`fkAn>"o
+JUVulF`hYABkV'fA797hCkIFcP&,)ZH2E$iIK4f_If+WoIeS9TIf"QmI/SElI/A6rI!^3fI!^6f
+I/A6jI//-h?3XY<>$"a(=T)M5?X6rD?X[AN?XI5Kr)3Vo;u9Jl;#jeuIfOrrHN8HmHN/7!G^"@T
+G'.kJEcH&:DZ+GPC]eEfCMNf]rFu7Gqe6%FqJ#_>qeQ1Is(hFH!,_XM!c).KrDEer:JXea;uTYp
+;uKVn;?'Pn;ZKeq;uKVm;u]bq;u]eu;c6Ni;ts8h;>sJm;>O,h;>sAl:]4)j:Jh!eqbR8ir(mAj
+r_WVj!DZGi:]O;i:'"!]r_*65rHA-`rHJ<drcnHgr-J<g!.+Wk!.=`nq0r9ls+'utrdt0&pk8?p
+!euD`reL?)r.b9.qhas&qhb<0re^T2pP\s.qi)2DJ9,[IDJO!#B4bgnApT)DC&VlDC]8/KD>8#G
+Du+GLEW)+%Q2Ye$ErC(UFT-F_G5ZXbGlN'gH3&A?rd=frJ,Xt.JV&N,KS>/8Ll$tGMi<XUO-#Ke
+PE_>uR$a>3S=Z=FTq\?YVPgDnX0&P.Yd1UC[^WfY]Y(tn_8=.0`lQ9EbK\>YdF-Oof%8R.g>(N@
+hr*JRj5oFckNV6rlg4$,n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s2Y.i~>
+JcC<$JcG*:lMgYYr;?BfrVHQiqtU3cs7ZEa!qc*Urpp*Z!:^!V!Uf@Slndtml07EpkN:pgjQ#:[
+iS`YOhVHuAg=k64f@SU(eC2jndEp4bc-4ASb/q`F`l5p8_SY_?qc+V8-86o+0/kaD0.\b02FBbo
+5!1qg3B&iR1bga?r\b!A5Y"[K:Jb!b;?'Pn;ZK_i;?'Pn;uBPn;tEle;uTbf;ta2h;u]hr;u]bq
+;u0Dj;uTYq;c<Hh$nj=h0.nh-.P*8.0JNJ]!])Sfr\FL0"#<&(4T7JU5!1ti3]]8\3BB8l7R]a8
+77I2Cs$ZlSrBgHKs$6NG#!=t/4Zkegpc8%-p,W"3r]L-@"["q14?bq*4Sq8J4?>Yh4?GVe3]d4$
+r]^0@!^8b0rB10F4oIJ=3rM,C3]fGe4S:l;4T7DE4?Ykmp-/@:rBC0C&3i?B4Zkhi5<hG!5<hCt
+5X>65r]pHI!^8S&r]:$Ss%`SirD<Gi!)WYls&/Yks&&hqqGdAkr_`_prD`bprDNVnr_s#!;H$Op
+r_rkrpJV#i!*/qt!*B,$s&f>(r`Au!mTKNkpK.>rr`Skq##nJs:JX\ZrCdAj92&/rC&VlDC]8/K
+D>8#GDu+GLEW8u:<;pn8ErC(UFT-F_G5ZXbGlN'gH3&A?rd=frJ,Xt.JV&N,KS>/8Ll$tGMi<XU
+O-#KePE_>uR$a>3S=Z=FTq\?YVPgDnX0&P.Yd1UC[^WfY]Y(tn_8=.0`lQ9EbK\>YdF-Oof%8R.
+g>(N@hr*JRj5oFckNV6rlg4$,n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s2Y.i~>
+JcC<$JcG-;lMgYYr;?BfrVHNhr:p<ds7ZEas7?<_rUL!ZnG_l;md9E.m-Es%l07Epk2tddj5].X
+i8EMLh;-l@g=k32f@JL%eC2gmd*L"_bfe2PaiMNB`Pod5_SO%dPlHpIPl6gGPlI$HPl?pfP]h(a
+DeGZ/OGACEMe9,pW2HD_R['+uM26n?LAm5@]s*X+H%Ug1OH>V(OoU^FPkgU:QMHgDPlI$KPl-^F
+P5UOCP5LIAOS"Y8OT(C@Op$o/OHG[uOT1@AOT(=@NWtJkIX?B_FT-7oE-ZeWH?spaH@'paH[:-i
+?sd8K?N+=3?N4@B?sR#A@&p?.WMZGcU7e4ZTG=)lT:D@=R@9J.QBdc$P*:ugNfAsRre^]4reCE.
+rJ13*!/UT1s,-K+r.k?0rJL9+s,7&KP(.9G?Nsb>>[:W?>l%\)>lS10?34D;>lJ%.?N4C4@/OC2
+?N4@4?2%\*?27_0?!LT;=^,,0>5qh1>?Y35=oMS7>[:W?>[(B8=^#$6>Zt>1=oDM-=]ed,=BYN&
+"]eT'<E+_PLB*20M?/ZorJUc8N;\b9NWb?%NfB%rNrP.EOHG]hPEV71PQ$dHPPLIBQ2d0MQN`bE
+R@9V7rg`bS!hPsSpRhDX!MH.`T`1YSUAq"eU]RBiVX^S`W;W\,UR?UZHZaLPE,or@HZbjXC&VlE
+C]/)KD>8#HDu4MIEW=#X`r'lTF8C"XFoQX`GQ2pfH2`-iHN8HmI0"eHrd\m;JqJ]/Knb><M2@+J
+N/`jYOHG]iPa.Q$R$jG5SXuIITqeE[Vl6VqXKA\1Z*UgF[^`l[]Y2(q_Sa=2a2lBGbg+M\dF6Uq
+f@S^0gYCWBi8EVTjQ5Oekiq?tm-O--n*fc9o()DDo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$a8^Y~>
+JcC<$JcG-;lMgYYr;?BfrVHNhr:p<ds7ZEas7?<_rUL!ZnG_l=md9E.m-Es%l07Epk2tddj5].X
+i8EMLh;-l@g=k32f@JL%eC2gmd*L"_bfe2PaiMNB`Pod5_SO$:Ie\EdIfFgC?sQl;<H`@tA70%_
+=+Z!PI!KmWDfKQ*AS#C_CMRaFKQiSqE-6L$II)F\IK"]jIHc4WIK+]nHiAEkHiJKmHi/9gHN8Hj
+HiIIV?<gZ:=8l52?!^lD?=.&G?sd;L?=@2?r)3et;c6Ll;H!Kk!`ac$rdP3&I!^3fH[:!brco6&
+G'8(OF)u>@E,TW3D/F**CMR[#CAMWCC&VlEB`MoEC%uH?C]8/MC\_cHD>\2PGB%1trDNYk"&Mim
+;ts5j;>sJn;ZKeq;uBPm;ZK_p;u]eu;c6Ni;u0Am;c<QkrDNYm!DlYk;#aDl;#a>j;#a;k;#X>h
+:]OAj;#aDl:]aBf:B"&i:]4#l9M.uO96L2VrHJ'^s*=Ngq0N*hrI+KjrI=itqgn`us+C*"p4WR&
+KnfS^qM+p'!/UN/oSWO&s,-`2regK/r/CE1&;YmXDf0B-CM.6kBl.R5K5(="qeQ.Hrb_FJr,;IO
+p2U%qr,V^VqK2^Zs*"?bs*4Qhrd+Tk!.=co!IfOtJ8TpiK7ei2L5(M@M2I4MNK0']OckomQ'Rc(
+R@B\:StD^MUSO`aW2cl!Xfnt6Za@-K\@K5a]t_A"_o0O7aN;WLcHaeae'uq"f@em4gtglGi8WeX
+jlYail07O#m-X60n*ol<o(2JFp%A%Pp\jmeq>^<hqu6NlrUg)?s+13js*t~>
+JcC<$JcG-;lMgYYr;?BfrVHNhr:p<ds7ZEas7?<_rUL!ZnG_l;md9E.m-Es%l07Epk2tddj5].X
+i8EMLh;-l@g=k32f@JL%eC2gmd*L"_bfe2PaiMNB`Pod5_SO%T<;olF<&ZZj1GC^E1G::40fDEd
+5<_1l3]T,W2)I$C1,UsI4?uD6;,:%epJLofr_ieppJLrgs&8hnr_rJf!)repo2GB_rDW\ps&8qq
+s&8blrDW\n!`MuprD<_S0ek@60)dC..ki_50etO>1,Jkas"jX<s#giS4Ztni3]T5\3'')j7RmAG
+!CfNW6iTRP6N9=P6:(T8!'^BF#s::44ZYYd3B9/!3<2,>3VGH+3<2,<48h;@3s@`04?Pbiq`Oa=
+&48`K4Zkef4?>Mb4?GYg5!Aa)s#pEFrB10F4o@D=3rM,D3]fGe4ZrC#!'L3A!'U<GpHJU?s$$HG
+rBC0C!'gHHr]C?J5=%S"5Q*kF62j.J5Q<\F3]T5sr_<GhrD<;es&/Yk!`DrqqGdAkr_`_prD`bp
+rDNVnr_s#!;H$Opr_rkrpJV#i!*&kss&]2%!a/W-r`Au!mTKQlp/h5qr`Shp&6Dk.:esh\:JFJS
+9M\>V;/-#EqeQ.Hrb_FJr,;IOp2U+2s&Ao:r,_^VrcS6arHJ9ds*=Tis*F`nrd=frJ,Xt9JV&N,
+KS>/8Ll$tGMi<XUO-#KePE_>uQ^F21S"6.CTqS6WV5L8lWiW>+Yd(OA[C3TU]=bhl^r""-`Q-'A
+bKS8Wd*^=le^rF+g=tE=hr*GPj5f=akNM0plg4!*mdKW6nac8BoCV_Kp@e7Zq#C0iqY^6ir;HTd
+rdk*#s2Y.i~>
+JcC<$JcG0<lMgYYr;??erqcWir:p<drq??as7H?_rpg-\nF6GG!Uf@Slil_?l07EproPlqjQ#:[
+iS`VMh;-l@g=k64f@JL%eC2jnd*L"_c-4ARaiMQD`Pod5_SO%&PE_=,PPpaFPQ-mIPpUZpD/a3Y
+RZWAYM2>lKXJ_tkT:2+.Nf&XJKnPPJO1M0SPBhe6NrG.=OTCW/r07)DoToKAs-E\Mqih)Grfm>E
+!0[>Drf[5BrK-]7s,d5BrfR8DrfI/BpQ,oJOH5HaO,o<OIXHHeFE;O&E<gc8H[0p`H[5R:s*b3$
+?sd;L?!gt<?41.J?X6o?TW>,mW29Kg$_j>gTV/!OSXZ(9RJrQPQ3NV<P*(ieN;eb8M?o&pLPLV=
+LPUcbLB*/,M>rD2M>iD2M>rD0M>i>1M>`>)MZB1ERKAClAc?$@?!CQ>?!LY4>6S27?!LZBrE]J0
+r`oJ/ra,S2!+>\2s'G_4!+#>*r`oP0?2@e2>?Y04>[(B8r`oG+!*T;)$!^bA>[1K:>$5&->6A&3
+>$:f-#[(83<``F*='5H'#?Ff*<)cePM>`>-N;\b6NrP+:NrP.EOHG]hPEV71PQ$dHPPLIBQ2d0M
+QNrnGR[T_8S=K>E!hPsSpn%PZqk<n[rh8eTs.fRh!i;cknYcAb!35sr&YPJ?H[0^UEH#o=H%((3
+WbQ;FC]8/LD>8#HDu=SHE<:1"`VsoUF89qWFoQX_GQ2pfH2`*kH[L5?I;XL`J:N3%JqJ]/Knb><
+M2@+JN/`jYO-,TgPa.Q$R$jD4SXuIHTq\?ZVPgDnX0&P.Yd1UC[^WfY]Y(tn_8=+/`lQ9EbK\>Y
+dF-Lnf%8R-g>(N@hr*JQj5f@bkNM0qlg4!*mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6hr;HTdrdk*#
+s2Y.i~>
+JcC<$JcG0<lMgYYr;??erqcWir:p<drq??as7H?_rpg-\nF6GG!Uf@Slil_?l07EproPfojQ#:[
+iS`VMh;-l@g=k64f@JL%eC2jnd*L"_c-4ARaiMQD`Pod5_SO%&Ie\EeIf=aB@:!)><HE1sART4`
+<J,jNI<fsWE,KH(ARo=\ChmjDIX-BZE--EtII;R`I04qHIX_$>l@/SXs*X`ks*X`ks*Xinr-\?f
+!.=cm#@V"H?<^W9=T2A$>le8;r*TJ3!+5_5rDWhs;H*Bh!`=8ordPH-I!g9fI!^0cH$OXYGBJ*.
+F:WD3EH#i6DJa9-Chmj&BkmEVrFu:HqIoqEqJ#b?qeQ1Is(hFHs)%dPrc\HfD.6QF;?]lm:f1.i
+peq,hs&/kq!*&kprDNVns&/kqr`&nqqG[2f!)remr_ibn"&Mij;>sDk;>sAl:]4)j:Jh$fqG7An
+:esna;,R<h!_uNdr_WVjrD!Ph9M%iJG'<h.qKW!brHe6c!.=`nq0r9ls+'utrdt0&pk8?p!euD`
+rJ19)r.b9.qhas&qhY<1qhb<0pP]$0qi(T9r/Cr;IWB@EChmebB*N-kCjgtOCAM`FD#S;HDZ"GN
+E:e,OEg2gfEr:"SFT-F_G5QRaGlN'gH3/G@I/\P3IXcluJUrE*K7nr5L5:\CMMmFQNfT6`P*2&p
+QC!u,R[]k>T:hmPUnsrdWN*#$Y-5(8ZaI6N\[oGd^;%M$_o9X:ai_fOcHjnde'ut#f\,!6h;7&I
+iSrnYk2tjjl0@U$m-X60n*ol<o(2MQo`Fj]p\ssfq>^<hqu-HkrUg)?s+13js*t~>
+JcC<$JcG0<lMgYYr;??erqcWir:p<drq??as7H?_rpg-\nF6GG!Uf@Slil_?l07EproPcnjQ#:[
+iS`VMh;-l@g=k64f@JL%eC2jnd*L"_c-4ARaiMQD`Pod5_SO%&lr=!b(cO</1GLgG1G::40fMHc
+5<h4l3]T)V2)P:es"t'?4@)J6;,:(gp/1fer_iepp/(ffr_reorDWAes&8kqo2GB_r)<Vps&8np
+s&8emr)<Sm%oZA';)9p\0/"q0/M&G'0`Eg*1(c;t0etO?1-Rla4Zkhi4?PYcr&G$O7n,p:77B[7
+r^6]R!(6]O'gP&M69me#5!;(m4$>bi4?GSa3BB4q3VGH,3<2,<48_5@3s7Z/4?Pe'4T.GA6O5tB
+4Zb_g4$#J&49@Z04o.8C4[(tjr]L<H4Zr[)q`=U9"$A_04S1f83rhDB5Q*bH4[8m/s#p?F!'U9E
+rB:*Cr]C?I5X@\$5Q!eF62j+W5<qFt4ubSa3BKu3rD<;es&/Yk!`DrqqGdAkr_`_prD`bprDNVn
+r_s#!;H$Opr_rkrpJV#i!*&kss&]2%!EiP'=8Q+f=oVUt=8l>%=nYqt=o;A6=&Vsm:JFMW91hrR
+:J=DYC23T\rbVRNphp"Jr,D:J!ch4<rc7pXq/lUYs*"<as*4Qhrd"WmI!kpADLR(cJ:W9'K7ei2
+L5(M@M2I4MNK0'\OckllQ'Rc(R@9V9StD[LU84W_Vl?\sXfek3ZEpsI\%0)_]Y;.s_Sa@4aN;TJ
+c-FY_daQ^sf@\d1gtgiEi8N\UjQ>UfkiqBum-O--n*fc9o()DErq-?dp\4[^s7u]kr;6HjrVcBf
+JcC<$a8^Y~>
+JcC<$JcG3=lMgYYr;??erqcWiqtU3cs7ZEas7?<_rUL!ZnG_nVmQ9h&m-Es%l07Epk2tddj5].X
+i8EMLh;-l@g=b-1f@JL%e'cXkd*L"^bfe2OaN2EA`Pf[2_SEq$PEbO"-^9m>Ec5i1S=5RpKSbMC
+XKA@uUnF6IOH,6TL5(ACOH6fITpBtWKDpr2OT(@CP*>d-r0?`:rg!AFrg!MJrf[>FrK7,Cr/pr>
+oo]99s,m>E#*G(2OH>TepQ-_aOH5HaO+Mn2I!U$\F)l8=EI<%YG^+R^H$XgbI=HZn?XI2I?"!P:
+(g^HPQE@3gWMZJeUS4EUU7e-PTU_L?R@4&@rg!tXPECuhNf8mRMi3IMrJ1W4L5(J>M#E)/M#)u.
+M#E21MZ&D1M#N81M#N80MYN,.RJrWZR>#Zi?XI.=>Qe>;>?b;/>6A,9?!mP:!+#S/s'>V1ra,Y5
+qHjA3?XI,Fpg3r*q-<o's&oA+s&oJ.>[783!*T;)!aAr:r`fP0>$+r+>6A&3>$:f-#$G&1=&rI+
+r)X8,<E<+";c8L1Mi<YmN!#'"NK*jrs,Hr:s,RAGOcklkPEc'1rfdDHq3:lDs-E\O"IPUGR[a;H
+opu,Sq4@Y[r1WqZs.SnUs.fRhs.o^mnYcDcpo+gsP(7n)FE2G@EccSSGGD3RqeQ1IrGDCKr,;LP
+ol9nM!6+kWq/lRXs*"<as*4Qhrd+Tk!.=cos*e[3J:N3&JqJ]/Knb>;M2@+JN/WdXO-#NfPEhE"
+R$jD4S=Z=FTq\<XVPgAmX/rG,Yd(OA[^N]V]=bhl^r!t,`Q-'AbKS8Wd*^:ke^i@*g=tE=hVd>O
+j5]7`k32'olKdg(mdKW6nc&([oCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcEaiJ,~>
+JcC<$JcG3=lMgYYr;??erqcWiqtU3cs7ZEas7?<_rUL!ZnG_nVmQ'\$m-Es%l07Epk2tddj5].X
+i8EMLh;-l@g=b-1f@JL%e'cXkd*L"^bfe2OaN2EA`Pf[2_SEq$q1&0gr-]u$?<^Q6FE;;1@V04b
+JqAH"H?XIODJNotA7]4dChn`SJ:DEVFEr:_rd=Efmsb1_rdOTil@/SXs*Xcls*X`ks*XinrHnWo
+I/A7&I!]@4?s[,D>Zk-0<E<I4?=!M:#@:eH?t!AL;uT`#;c6Ol;H$Nm;?h5oJ:N-!IK"TpH[Pd<
+s*4Qfs*"B`s)J'X#&\?sCi+$*rb;IJCA)?>C&_rIB`MoIB`MoEC&)N?C]A5NC\V`GGl;jdFpi"j
+;c6Lj:Jakc;cEQk#ZFW!;,U:j<)icorDNVns&&ks;uT_s;c<Hjs&&hor)*Po;Z0Jl;ZBSp:f7*d
+s&&bl!)NPi!DcPj;$'Qi:]=/p;,C%b:f1*h:]aBf:Amuh:]4&g9E.Td8P42Nq0;pbr-J-b!.=`n
+q0r9ls+'utrdt0&pk89ns+^N.qhG$(!/UK.onrBuregH.rf$c7!06u:rf.5=I<':ED/3kbAd)pe
+C4CnOqeQ1IrGDCKr,;LPol9nM!0mD&q/lRXs*"<as*4Qhrd+Tk!.=cos*e[3J:N3&JqJ]/Knb>;
+M2@+JN/WdXO-#NfPEhE"R$jD4S=Z=FTq\<XVPgAmX/rG,Yd(OA[^N]V]=bhl^r!t,`Q-'AbKS8W
+d*^:ke^i@*g=tE=hVd>Oj5]7`k32'olKdg(mdKW6nc&([oCW%T!quB_rqQNhs8)Zjrqu`no_sFA
+JcEaiJ,~>
+JcC<$JcG3=lMgYYr;??erqcWiqtU3cs7ZEas7?<_rUL!ZnG_nVmQ'\$m-Es%l07Epk2tddj5].X
+i8EMLh;-l@g=b-1f@JL%e'cXkd*L"^bfe2OaN2EA`Pf[2_SEq$m8X*c(cO</1GLjG1+t760JZ!]
+5!D+m3]T)V2)P:er\ag>5Y:rP!`Drppegodr_iepqGI8hr_`Skr)<;es&8hpo2GB_rDW_qr_rhp
+s&8emr)<Sm'2qdb2)$a=0.nk/.kE5*0JY@=1&Ng,1]K614qKh>4?Yhi4?>J_3&ird7n,uI7K5jV
+6iTRR6iKFP62j+M5<f'0$TgC54Ztnh3]T5^3W;);3<2,>3Vk]83W;#43<2,<48_5@3s@`04Zkhi
+r&b!C4ShDT69mat4$5Vd4$,Pd4[)(+49I`14ZrX*"["k.4?GY&3r:uA4?Yhi4S:i;4T7DE4[)(p
+rB:3Er'(*Cs#pEGrBC-B!^Ak3r]C?I5X7V#5Q!eF62X"J56sG53'')^3`&ZI;>=&k;H$Nj<;]\o
+;?0Yo<;ohp;Z9Vo<!6,t;cHcr;ufkj;?Bcr<W,tu=8Z2!=8H%e=TDRt=7TGn=nu/2<`2dk:JFPW
+91_fP;+sPYCAVfGD#J5IDZ"GNE:n5KEWB&9F89qVFoQX_GQ2pfH2`-iHN8HmIK+b1It3'#JqAW-
+KS>/8LP^kFMi<UTO,oBcP*;/rQ^F20S"-(ATV8*TUo(&gWiN5'YHY:<['mEQ\\#Mf^VI_'`5Td<
+aihoRcHsteeCE.%g"P39h;7)JioB(\k2tmll0@U$mI'H3nF?MK!V>s_o`Fj]p\ssfq>^<hqu6Nl
+rUg)?s+13is*t~>
+JcC<$JcG6>lMgYYr;??erqcThr:p<ds7ZEas7H?_rpg-\nF6GG!Uf@Slil_?l07EproPfojQ#:[
+i8EMLh;-l@g=k63f@JL%eC2gmd*L"^bfe2PaiMNB`Pf[2_SO"%^?q+2P]h+bD1n^SO,8LFMMl8O
+VP^/]R[B>#MM?n?KohCYU9^,OH%gtMO8k=?OTCW/r07)Dn!=!=qiq&E!0mGG!0[>Drf[5Br/gW7
+s,d5BrfRMKOH>TeOH>V$O;O+AO,oBRI=6KgF`VVDE,^,KH?sd]I!U,<HQ.?]I:6Mj?s[2J?XI,H
+?sd5FQ`R<jWMubjUn[g]#G@]_T:DC=RJrTQQOT4EP*1rfNf8mSN/NRLreLN0#)S.kL51P?rJ(B/
+qMG6.rJCN2re^T0rJCQ1",VnlM>iD/MZK65r0dPQ!g8%Mra5Y0s'>Y/!*]>*"'Sr8>l.k,>lS+/
+?N+:3@/4.4?=.#E?2.b+?2.\)>Q7h5>$G06>?kE;>$>)-=ohl7r`f_5>$4s2>?kB:q-*f#"'8N+
+=o;>$<rH#'<)AL3NJrgUrepr=NfB%qNW>(;NrP1?O9Lc0P*;)orfd>G!0d5Crg!MLs-EqWR@9S6
+S=K5Bs.9(Zs.K:`qOmk^m\9`VrhTRj!2fan!3#Rgs/>[k&?;@dIsQB`EcQ&:Fa&+TU8n*+rbVRN
+qJQ4Lr,D@Lqf;UUq/lRXs*"<as*4QhrHeKj!.=co#(D&OJ:N3&re"g9Knb>;M2@+JN/WaWO-#Nf
+PEhE!R$a>3S=Q7DTqS6WV5L8kWiW>*YctF>[C3QT]"G\i^VRe)`Q$!?b0/&TcdC.heCE1'g"P3:
+h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCW%Ts7QHerV-BgrqcQirqu`no_sFAJcEaiJ,~>
+JcC<$JcG6>lMgYYr;??erqcThr:p<ds7ZEas7H?_rpg-\nF6GG!Uf@Slil_?l07EproPfojQ#:[
+i8EMLh;-l@g=k63f@JL%eC2gmd*L"^bfe2PaiMNB`Pf[2_SO"%^AEETIf"O0@:!,?@X<$0B4>Fb
+B3Be7I!U!XEH#`,rac(>rbMjcKR//cEccVSr-\3dmXG(^s*j]jl@/SXs*X`ks*Xcls*XinrHnWo
+I/A6oHt-Pl?X*M5"BSW)?=!P:s'Ph6ra5n:?sm>?;uTbr;uT\p;[$&t;KRJ@rI=]ls*Ocls*,?(
+G'8"NFE2DAE,TZ4D/='+Chda#C2%>XBEDm]C&VfEC&_rIB`MoIC&_rEC&)N@C]A5NC\hlIGQ2pd
+GQ2gfEFi>Q;ZBMn:f@9kq,.;l;GpHm<;fbo;Z9Vp;ZB\r;uT_s;c<Kks&/korDEYp;Z0Jk;ZBVo
+:]O;i;#aDl:]O;i:]aEh;#X>l:^Tup:f1(d:JXea;>sAn:/=X`:]O;i:'"!]r_!5`r-/?iG^+LZ
+r-J-br-eBirI=itqgn`us+C*"oS*="reLB*r.k<.qhb!'qhY<1qhb<0regc8qhtH4rJgf:rJgc9
+&<2EkEGo`2C2%9lBl%[%H\;32rbVRNqJQ4Lr,D@Lqf;UUq/lRXs*"<as*4QhrHeKj!.=co#(D&O
+J:N3&re"g9Knb>;M2@+JN/WaWO-#NfPEhE!R$a>3S=Q7DTqS6WV5L8kWiW>*YctF>[C3QT]"G\i
+^VRe)`Q$!?b0/&TcdC.heCE1'g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCW%Ts7QHerV-Bg
+rqcQirqu`no_sFAJcEaiJ,~>
+JcC<$JcG6>lMgYYr;??erqcThr:p<ds7ZEas7H?_rpg-\nF6GG!Uf@Slil_?l07EproPfojQ#:[
+i8EMLh;-l@g=k63f@JL%eC2gmd*L"^bfe2PaiMNB`Pf[2_SO"%^@"u#<?X7X1G^OB2DQs=0JG7?
+5sIUt4ZbY`2Dm9G0etXF2`a2mr_W_r;H!3cr)3Mms&/emr)!Djr)3Gkp/1lhqc*/cpJh&hs&B"s
+s&/kqqbm>jr_a##1c$d>0J5"3r[\=/0ekF<1,:O>rA+C/&jANB4?Ybi4?P\d3]T5]6V'a;r^HiV
+!(?fRs$ZlS'gtAT5s[b&5X.Lt4[)%j4$>bj4?G\&3W2#73Vk]83W;#43<2,;48_5@49%J>497f9
+q*PTW5X%7l4ZYVc4?Pbj55@;B5!;%+4Tdf.4$<L("$/M)3r1o=4?`[+p-&F<s#U6D55meG56!eD
+56!eG4odbD55dVG5<_:149[o55X@Y"r':0Gr]pHI#!P"+3]]>apJLT^qGdAkr_`_prD`bprDNVn
+r_s#!;H$Opr_rkrp/1rj<)ris!*B)#r)`btmTBNlp/h5q"'8T+=8H%u=nu/'=]JEu:JUm`#>.Z_
+:/FVJ;#>&-D#S;JDZ"GNE;";KEr:"SFT$@^G5QRaGlN'fHN/<lI/\NuIXcitJ:W=OK4]djL5(J?
+M2I4MN/`mZOHPcjQ'IZ&R$sM7SXuIITqeE[Vl6SpXKAY0Yd1UC[^WfY]Y(tn_8=+/`lQ6DbK\>Y
+dF$Fme^rI,g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo`"O`p&Ojcp]1-hqY^6ir;HTdrdk*#
+s2P(h~>
+JcC<$JcG9?li-bZqu$6drqcThr:p<drq?<`!qc*Urpp*Z!:^!V#4CmGm-O''rol9'kN:pgjQ#:[
+iS`YOhVI#Bg=k64f@SR&eC2jnd*L"_c-+;QaiMNB`Poa3_SO%&^:fbqqi_#Cp6-eGGB%GNAY#$E
+Jqf2>BW\20US+0FP`UfZLP1>AOcbg5P*L<GK_gc0OT(@CP*>d-r0?`:rg!AFrg!MJrf[>FrK7,C
+r/pr>ooT69rfR2C!g/S+rfI5COo(7>OU.&$JU`,rH$49.E>EJ<H@($cI!U3eI!pBmIXY[3?XR2J
+@/O@K?<r;fXfSS'Vkp2bU8"?TTV%mMSt)7;RJrTQQO&k@P*1oeNK&nrM[YK"LPU_ALPUbCLkpf^
+LB*/,M>rD0M>rJ4M>W2.M>rD/MZ&J5RK&ZORJrWbR>Z<&?XI)D>[:Z@>?Y50>6A&6?![>6s',V0
+?![D8s'Pe6pL!r+pg3u+pg!i'"'Si2>Q.h+>Qe87>$5#-=p\G>?!LW=>$>$3rEB;+=o2A+=]ed,
+=BYK%"]\T'<)HKkNW4t;NUr21O8k=@P5g^GPl?mGPQ6pCPlI$JQN*9UR$jD3S"-#@Sc>;XT)bP^
+U%tA]U$\QSU].(hV#[C_VuN^gW=Z)#NI?+uG'%_EE-ZbQGbqG=C]8/KD>J/KDu=SKEVjeSF89qV
+FoHR^GQ2pfH2W$jH[L5?I0"eHrd\X4JqJ]/Knb>;Ll$tGMi<USO,oBbP*;,qQC!u,S"#t?T:hmP
+UnsrdWN*#$Xfnt6Za@0L\@K5a]t_A"_SjF6aN;WLc-F\`daZdtf@\g2gtgiEi8N_VjlY^gl07L!
+m-O0/n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$`W(G~>
+JcC<$JcG9?li-bZqu$6drqcThr:p<drq?<`!qc*Urpp*Z!:^!V#4CmGm-O''rol3%kN:pgjQ#:[
+iS`YOhVI#Bg=k64f@SR&eC2jnd*L"_c-+;QaiMNB`Poa3_SO%&^:jJppO<!fs'R0Y=^b6LDJ<Nj
+B4Y+qI=-<aF`VM=BP(dc@V]drEJ/OaDK9iFH[GX;p3lCYr-eQnpjMCUqgJHkrHnQlrHnNk!.4Tj
+r-KVt@U`\M>Zt94='&C-?=%#J?s[5J@:<PQ?slo4<E)pq;c<Tn%8p&%CP%+gIt3#tI!gAAHiSNm
+H2i*qGBS.PF`_YEEH(nq$>aQqD/=!'C2.Hrrb).B"DMO`BP@<Xs(_OIs(_RJrbD=Eq.feBs(q^N
+rG;CUrcnEds)n]kD.?[G;G^.c;>sMi;?0Sn;?Bcr<;fbn;Z9Sq;H*Kmq,@;ks&&_m!E2np;>jDm
+;?'Gm:]4,i;>sDl:]=2j:B45j;?'Gm:]=2j;$9]j:f1*h:]jKg:J^sd!)NMfs%NGc#Y7R4G^4OY
+H$T=6rHnQlrd4TlpjW0ks+'uts+:6&pk89ns+^N.qhG$(s+pQ/oSWU(s,-]1regH.rf$i9rJpl:
+qMl,GKR%QSDJX'$B4ksqChe?NrG2CKrGDCKrGVUQpMp(Nr,_[UrH8*_r-/0cs*=Qh!df<Brd=fr
+J,Xt2JV&N,KS>/8LPUeDMMmFPNK9-^OckomQ'Rc(R@B\:StD[LU84W_Vl?\sXf\e2Z*UgG[^`l[
+]Y2(q_SX71a2lBGbg"G[dF-Oof%8R.g>(N@hr*JRj5oFckNV6rlg4!+n*fc9rpg*]o`"Lbp@n=\
+q#C0iqY^6ir;HTdrdk*#s2G"g~>
+JcC<$JcG9?li-bZqu$6drqcThr:p<drq?<`!qc*Urpp*Z!:^!V#4CmGm-O''rol3%kN:pgjQ#:[
+iS`YOhVI#Bg=k64f@SR&eC2jnd*L"_c-+;QaiMNB`Poa3_SO%&^:j#8r`(4&2Dd3>0/k^C/h\q5
+2F0Vm4[(qf3B/lQ1GU[C2E3W]7SloZr_iepp/1T_r)*AgqbdAkr)<;e!)rbooMbH_rDW_qs&8qq
+r_r\lr)3o"1c$sC0/>.50)dC(0/51;r\=L11&`s.1B]Hs5!1t,4V9e>4#o;\3C$,+7n,s:77K[5
+r^-ZRrBpTO!C9'N5R]h>4[)"i4?bnk4?>S!3W;)73Vtf93WD)53<2,;48M)>4o@G@6MNnR6:!h!
+4$>Yd48qAB4odbB49Ic14?WO)s#^6Cs#^->q`=pC4Ztnip-&C;s#U3Er]g?F!'U9Er]U9Fs#p<E
+rB1NQ5!D+l4?Ykn5sR[35lF"J5lEnO4ubSa4$,M";>!la<;]\o;?0Yo<;ohp;ZB\o<!6,t;cHcr
+;ufkj;?Bcr<W#kt=8Z1u=8Q+f=oVUt<rcA#=8Q+u=nl)2='8R':ea_[9h\5U9288W7T',"rbVOM
+qJQ7Mr,DCMqf;UUq/lRXrc\3`s*4QhrH\NlI!kpA!IfOtJ7jFbK7ei2L5(J>M2@+JN/WaWO-#Ke
+PE_>uQ^F21S"6.CTV8*UV5C/iWiN8(YHY:<['mEQ\\#Mf^VI_'`5Td<aihoQcHsteeC<($f\5'7
+h;7&IiT&t[k2tjkl0@U$m-a?2nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s+13hs*t~>
+JcC<$JcG?AlMgYYqu$6drVHNhr:p9cs7ZEas7H?_rpg-\nF6GG!Uf@Slo==rl07Epk2tddj5].X
+i8EMLh;-l@g=b-1f@JL%e'cXkd*Bq]bfe/NaN2B?`PfX1_8*h"]tBU,PQ-g?P9u$7P(\I$R?NS`
+Ll$q#Xf8.mUS!m>O,JgOKnPPMOH$#uQ$J"8Nqn_9OSt:BP*>g.qj$W9s-<GFrfmJJrK@5ErfR2C
+rK7&?oo]99s,m8C"Hee-OcfI$s,fR#K7JH$I!TmVEcQ/>H@(!`H$apdH@:6jJ:;rT?X[;J@:*AJ
+?sd8HCTab@XK/@uUnj`ZUS4BST:hjJS=5n7r0RbUP`q;nOH,<[reh8DM2I%CLPU_ALPUbCM2:t_
+!/UH-!/UN/!/g`3$AaInLl$tGM26tEqhbB3r0[PPqO.AP"dta3FCAPT>ln>;>Q.h+>6J,6?<pk7
+?3OV>>?kH>ra,V3s'YY0!FB.4?2e.1?i==1?27b*>6A&3=^1l/r`oG+!*T;)%pWCG>[1K:>$+s3
+>?kB9=o2A.=]ed,<`rL*=T);*<E<+!;Gg9hNW"k;O8FqCO,f6]O-#HdP5^XFPl?mGPQ6pCPlI$J
+QN*9UR$jD3S"-#@SH,8XTDtS^U&(G^U$SKRU].(hV>mFaVuEXdW=YttLOFJoF)u>BFF8:VHr[9I
+C]8/LD>J/KDuFYLEVskTF80kVFoHR]GQ2pfH2W'hHN8HmIK+`rJ,Xt=JV&N,KS>/8LPUeDMMmFP
+NK0']OckomQ'Rc(R@9V8St;UKU84T^Vl6VqXKAY0Z*L^D[^WfY]Y(tn_8=+/`lQ6DbKS8XdF$Fm
+e^rF+g=tH>hr*JQj5f=akNM0plg4!*mdKW6nac8BoCV_Kp@e7Zq#C0iqY^6ir;HTdrdk*#s2G"g~>
+JcC<$JcG?AlMgYYqu$6drVHNhr:p9cs7ZEas7H?_rpg-\nF6GG!Uf@Slo47ql07Epk2tddj5].X
+i8EMLh;-l@g=b-1f@JL%e'cXkd*Bq]bfe/NaN2B?`PfX1_8*h"]tF>opjW'f-Y-M!@UW5UD/!Kl
+B4Y(pIX?BcG&hS=BP(mf@r,ssDL?YWCiXTBHN&9hI.i!VIf+WoIe\?UIenKmI/SEkI/SElI/eQl
+Hk:^RH[B:5@UW\N>Zt93=&rB$?3OVA?XR8KraGh7#[pY3<)lmr;H!Km!`Dj!rdt0#s*k9%I!g?i
+I!^5>H2i-gG5l^bEt<;2E,]]3Ci*s)C27U"C2*Z\rb).BrFl7Frb2FKBkmQ[s(VOJrbD=Eq.feB
+s(q[M!,VUX!-nKercnHes*"Eb");4B;Z9Jm;>sMj;?p,u;,U:j<)icorDNVn!E)ko<<#ks;Z'Jn
+;ZBVl;?0Yn;>sJn;?'Gm:]4,h;>sAl:]4)j:Jh$fs%i\kr_WVl!`2Wgr_`\l"&DZf:B")i:]4#m
+92%rM8P)JOH2W'eHiJKmHi8BfIf4crJGXotK)UDtK_0ruLAco(LAco-M#W;3M#N8'MZ&D3MYi8/
+MYN,/N;\b8NrG%5NY%)%G&_D:CM@HpB5DF"CeKH\C]8/LD>J/KDuFYLEVskTF80kVFoHR]GQ2pf
+H2W'hHN8HmIK+`rJ,Xt=JV&N,KS>/8LPUeDMMmFPNK0']OckomQ'Rc(R@9V8St;UKU84T^Vl6Vq
+XKAY0Z*L^D[^WfY]Y(tn_8=+/`lQ6DbKS8XdF$Fme^rF+g=tH>hr*JQj5f=akNM0plg4!*mdKW6
+nac8BoCV_Kp@e7Zq#C0iqY^6ir;HTdrdk*#s2G"g~>
+JcC<$JcG?AlMgYYqu$6drVHNhr:p9cs7ZEas7H?_rpg-\nF6GG!Uf@Slo47ql07Epk2tddj5].X
+i8EMLh;-l@g=b-1f@JL%e'cXkd*Bq]bfe/NaN2B?`PfX1_8*h"]tF;Cs&Jemr`/tG'JM$f0K(aB
+0/#%72FB_m5!:tf3]R*r$SjFq2E*KY7nc]U<;oho;Ya2c;Z'Dh;#=)i;Z'Je;?0Ym<:a&_<;fbp
+<<#ns;ZB\m;Z0Mu2DR'E0ek?\/cR@*.ki_71GSka$o'Ln1,C[@5<_1l4[/j-!':*>"Zo4F84Q/K
+705qH7/fOR7/]IX5sRb&5X7P"r]UWO4?G\i4?Ybd47tW63r(c:3]['ss#C'=pGi47q`FU9!'U<D
+rB^NP6MNnO6:!k$4?`[*r]L3E!'U0@"$Jh14T%>E4?GVer&ap>q`Fg?!'U<Dp-&C;!BWID5Q*bG
+4o@MD4oRVF4oISC4oRYF4o[VG5!VF05lF"J5RTeA5<_7k3]T2^3B@%8oi(]dr)<Sm!)rhqr_rbn
+s&8kqs&&ns<)ros!)rSh!E2tp<WH5!=Su7t=RK>l=R]Di=Su=s=T);,<)QOf;,'eZ9)_Ne:/!QB
+rbMLLrb_LLrGVXRpMp+Or,_XTrcS3`qfi'bs*=Qhs*F`nrdFfq!.XuuEe/gpK7nr5L51SAM2I4M
+N/`jYOHG]iPa.Q$R$jD4S=Z=FTq\?YVPgAmWiW>*Yd(L?[C3QT]"G\i^VRe)`Q$!?b0/#ScdC.h
+eCE1&g"P3:h;@/LioB+]k3(sml0I^&mI'H3nF?)?oCMVIp%J+RrV6Egs8)Zjrqu`no_sFAJcE^h
+J,~>
+JcC<$JcGBBlMgYYqu$6drVHNhqtU3cs7ZEas7H?_rpp*Z!:^!V#4CmGm-O''rol9'kN:pgjQ#:[
+iS`YOhVHuAg=k64f@JL%eC2gmd*L"^bfe2OaN2EA`Pf[2_8*h#]tD"hr0.)Bq3*.`KU%:GBpt<E
+L44o6B<A23US=?JPE1Z\LP:DDOcYutO-Y'BKT5_e!0I/A!0[5Dr0?c;!1!>DrfmJJrK@5ErK7,C
+r/pu?oo]99rfR2C!g/S+rfI5COo1:MMM6Y3IscThF`VPDDfPc&)L6XUI!U-fIXciq?sm>K?=.)H
+?s[2J?XBS3ri?=)W2?AdU8%X\rh(.#SXc.:R@'D0Q^<r$PEV)gNfB!UMi*CKM>i20L55Y^reUW2
+qM,',q2#*-qhY<1rJ:c8LPL\AM2I2iM>W52R/E?PR/*0LRK]+AIr/P"r`oS3?!I;3s'#V0>?tQ@
+r*BP4>[(H=?2e11?iOO0?iFC3?2\(0?iFC2?27b)>Q7h+>Q.e->?kG4=qb%B=^#$8?<g`>>?Y-3
+>$G69>$:`+#[(83=&rI+='5E&s&T+us%rcUr/Lc<qi:T8s,d8Ds-*GHs-*GH!0d5Cs-<SLs-EqW
+R@9S6S=K5B!1s"Yr1WqZs.SeR!2KLg!i;ckoV_\en>R"sRY-!5F)u;>EHcbUG(*MnC]8/LD>J/K
+DuFYMEVskTF80kVFo?L]GQ2peH2`-iHiJKmI<0jeIt3'#JV&N,KS>/8LPUeDMMmFPNK0']Ockom
+Q'Rc(R@9V8SXuIIU8+N\Vl-MoX0&P.Yd1UB[^WcW]=bhl^r!t,`Q-'AbKS5Vd*^:keCN7(g=k?<
+hV[8Mj5]4_k3)!nlKdg'mI'H4nF?)?oCW%T!quB_rqQNhs8)ZjrVZZno_sFAJcE[gJ,~>
+JcC<$JcGBBlMgYYqu$6drVHNhqtU3cs7ZEas7H?_rpp*Z!:^!V#4CmGm-O''rol<(kN:pgjQ#:[
+iS`YOhVHuAg=k64f@JL%eC2gmd*L"^bfe2OaN2EA`Pf[2_8*h#]tD"hJ,OirIK"]lI3rQ7DId3V
+Ec>`&?Y3kMJUW#mG]e(GCM@Bm@q0=lCNFZBIVa%IH2`-iHi&3aIIDXSIJeQoIIVd_IK+]mHiJHq
+H[L0erd4]mrHo-(Ht[)%@:<JK>[(B5=B8K%?N+:5?sd:>@1$C@;cQaq;c?Ol;uTZ#;14%JJUr?$
+If4]pI/\EoH$FRXrcSfpFE;JCEH#l8Ci+$)ChmhcC&huGB`2TBB_uKHC2%EsCA_fGC&huHCA_fA
+CAVfHD#\8NG5HIbG^"B2GlN!eFp3#.B3\>4r_WSmq,.2kr_`er<)ifpr)*Yr;H$Ikr)E\ps&/eo
+s&/kor)*Po;Z0Jl;ZBVo:]O;h;#aDl:^0]l:Jak`;#O5l:f%'es%rho:/Cjdr_NYk:JUmcs%iSg
+#>[ua8kDTFH2N!dHiJKnHN8HlIJA9iJ,b&rJcC?$KD:,lK`Hl+L\cc(L]<21M#`A2M=c])M>iD/
+M>iD-MuJ\6NW+t<NV/;DMhQ4kDJX*&AnPgoD/4&_K5:I&rb_LLrGVXRpi64Pr,_XTrcS0_r-/0c
+rd"Khs*OcnrdAj:It*!!JUrE*K7nr5L51SAM2I4MN/`jYOHG]iPa.Q$R$jD4S=Q7DTq\<XV5L5j
+WiN8)YHY==['mHR\\#Mf^VI_'`5Td<aihoQcHsteeC<($f\5'7h;7&IiT&tZk2tjkl0@U$m-X60
+nF5u=o(2MQo`Fj]p\ssfq>^<hqu-HlrUg)?s+13gs*t~>
+JcC<$JcGBBlMgYYqu$6drVHNhqtU3cs7ZEas7H?_rpp*Z!:^!V#4CmGm-O''rol?)kN:pgjQ#:[
+iS`YOhVHuAg=k64f@JL%eC2gmd*L"^bfe2OaN2EA`Pf[2_8*h#]tD"h<)iispf.5ms!K$F/1WA4
+2)?m90/,:O5X%=n4#o8[2)R3F1,_'L3B]l-:Jt0i;uKVi;>X8e;>a8f;=RQ`;u9Pc;ts>i;u]hs
+;u]bp;uBPn;Zep81,Stb$8=(b/M/M)0JYC<r\=g:1,C[@1GV-X4?WU+!]rP-r](9G77Tm=7n,s:
+7fGgO6NTS?6N04O5<qF24U=/54ZY\d4#o@o3WD/;3<M<&3]['ss#C'=q)SC7r&ad<"?ek14@B!4
+p-T!M5sRUs4oRPC49@Z055IAD4[)"kr&k-E4$,S&49%A=48V/64oIJF4[)(prBC6ErBC3Ds#pEG
+rBC-B#!Y:74ZkhjpH\[Cr':9H#sLR63]fD`3`/fH;uBVm;uTYp;uK\p;uKVo;uK\q;?Bcr<W5qt
+;ta)i;cNWps&]/$r)`btmTKQln5oQjqcW\rr)XJ4;Gg7d9he;T9h\8U:/!NAC]8/LD>J/KDuFYM
+EVskTF80kVFo?L]GQ2peH2`-iHiJKmI<0jeIt3'#JV&N,KS>/8LPUeDMMmFPNK0']OckomQ'Rc(
+R@9V8SXuIIU8+N\Vl-MoX0&P.Yd1UB[^WcW]=bhl^r!t,`Q-'AbKS5Vd*^:keCN7(g=k?<hV[8M
+j5]4_k3)!nlKdg'mI'H4nF?)?oCW%T!quB_rqQNhs8)ZjrVZZno_sFAJcE[gJ,~>
+JcC<$JcGEClMgYYqu$6drVHNhqtU3crq?<`s7?<_rUL3`nF5o8mdBKAloFCsl07Epk2tddj5].X
+i8EMLh;-l@g=b-1f@JI$e'cXjcd'h[bKJ&MaN)<>`5BI/^q[Xt]Y(kerKI/BqNE7_K:%FKBUkEJ
+KRno8B!&&0V50]OQBI2aLPUSEP*2u5[]k%-K8fMbs,d5B!KrZDPl-gCQMQmHQN*6GPl6jIPl6dG
+P5^UDP5LIAOS"Y8OT(C@Oo^],rfI5COo:@]M1pP2J:2`eFDl2?EI<.\HZsj_H[L6hI=6To@/aL6
+?=<Y;$snprXf\\+Wi)\hUS@a]rh(1'St2@<R@0G1R$X/)PEV,iO,f3WMi3FLM22"_"GV\fLl)(d
+s+p`3qM,',m>:k!#)A"jM2I1Ir/1K@r0[PPq3h5Ns-WtIH=pUa>m"D=>?h)1"^>/6?!^h6?3FM;
+>[:Y7?N4C4@/++/?N4=2?34D=?i==2?2\%.?2e+/>Q7hC>$G06>?kE;>$>'4=^#!6?<g`>>?P*2
+>5h_,>$:`+#[(83=&rI+='5B%$W^8-<)?IgO,f6]O8P%:O8b7@P5gaFPQ6pGPQ6pCPlI$JQN*9U
+R$jD3S"-#@SH,8XT)bP^U&(G]U&LbdU%"cVU]$tiV5C-_Vu<R^W=YnoIX6<^EcGu<G^F^VJ6AuQ
+D#S;KDZ+MPE;=MOEr:"RFT-F]G5QR`GlN'fHN/<lI/SHoIXh?IC4UtgK7ei2L5(J>M2@+JN/WaV
+O-#KePE_>tQ^F//S"-%@T:qsRUnsrdWN*##Xfnt6Za@-K\@K2`]tV7t_Sa@4aN2NIbg+P]dF6Uq
+f@S^0gYCWAi8EVTj5oFckiq?slg4$,n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s2=qf~>
+JcC<$JcGEClMgYYqu$6drVHNhqtU3crq?<`s7?<_rUL3`nF5o8mdBKAloFCsl07Epk2tddj5].X
+i8EMLh;-l@g=b-1f@JI$e'cXjcd'h[bKJ&MaN)<>`5BI/^q[Xt]Y(kerI4`o!.O`l-=pV*ARnb]
+EG8liAS"nnIXHKgF`_V@BkM$j@r-"!K6<!3C3"HBrHeHiqgA*comZ4TqgSQnnUC=_s*Xcls*Ooq
+I!g;?HiSNlHjY:8AR]+W?<g]<=T2AH?X@)G?=7,I?t!DN?t!JB<)cjr;c6Ll;Gp@hDhE[oJUi6"
+rI"s!H[L-bH?sg\rc\`nF`_\FF)c/:D/=(gD#\8TC27NsBPD2ZB`)NBB_uKEC2*Z^qe>nArFu(B
+rbDLMrbDLMrc\0_!-nKes*4Qfrc\<a")h[O;Z9Jm;Z9Vk;?0Yo;Z9Yp;uBMr;c6Ol;YsGn;ZK_n
+;ZK_p;>jAn;c<Tl#uXVu;Gg:f:esmc;#aDl:^9cm:Jak`:f.-gs%i\kr_Ner:esk`;,R<h#>S&i
+:f'qa:]4#h:J:XY!D,c[HMi-iI/eQnI/\QiIf+]qJGXotK)UDtK_0ruLAco(LAco-L]WEhM#N8'
+MZ8P3MY`2/MYN,/N;\b9NrG%0NY%)"Ec5l4C2%?nCMdp$E(Yc^D#S;KDZ+MPE;=MOEr:"RFT-F]
+G5QR`GlN'fHN/<lI/SHoIXh?IC4UtgK7ei2L5(J>M2@+JN/WaVO-#KePE_>tQ^F//S"-%@T:qsR
+UnsrdWN*##Xfnt6Za@-K\@K2`]tV7t_Sa@4aN2NIbg+P]dF6Uqf@S^0gYCWAi8EVTj5oFckiq?s
+lg4$,n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s2=qf~>
+JcC<$JcGEClMgYYqu$6drVHNhqtU3crq?<`s7?<_rUL3`nF5o8mdBKAloOItl07Epk2tddj5].X
+i8EMLh;-l@g=b-1f@JI$e'cXjcd'h[bKJ&MaN)<>`5BI/^q[Xt]Y(ke<;onm<;olE-RLT".krt@
+0eb.30fDHd5<V.l3]K,W2)I'D2E3WX5!i%A;H-Wl;uT\j;>sJf;>*fd;=RQa;u9Pb;ts>j;u]hr
+;ZK_p;uBMr;`-Ee2#]32/h\jV/-msd1,:X@0JbH^1'KHh5<_1lr]LiU4ZbV`3^H8+84Q-=77B[6
+7/0.K652^M5X7Ls4Ztnh5!1tj4?>Pa3]T1k3WD/<3<VB'3]]:u3;5H43r;#<49.PC4T7_F6M<eH
+63BM=4[&d+"?\h15!Jd)!^8b0r&kBL4$,Pd4$5Se3]d+!r&k!B!'L'?rB('CrBL9Fs#pBG!BiXG
+4o[\G4o@MB4U4285!;%k4[8p2!'gBHrBUNN5<qL356a)/3]fDa2Y9rG<;]\p;ZB\o<;ohp;ZB\o
+<<#ht;cHcr<:s,i;cW]q!*B&"rE&kumTKQln5oTkqH<SqqH"51<)HFe:/">S:/"G[9M76<rbVRN
+qel@NrG_RPr,V^VpiQLXrHA*_rcnHgrHeKj!.=`n!IfOtJ80XeJqJ]/Knb>;Ll$tGMi<USNfT9a
+P*;,qQ'[l*R[]h<StD^MUSO``Vl?\sXKA\1Z*UgF[^`lZ]Y2%o_8=+/`lQ6DbKS8Xd*^=le^rF+
+g=tE=hVd>Oj5]7`k32'olKdg(mdKW6nc&([oCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcE[gJ,~>
+JcC<$JcGKElMgYYqu$3crVHNhqtU3crq?<`s7H?_rpp*Z!:^!V!Uf@SliHG;rol<(kN:pgjQ#:[
+iS`YOh;-l@g=k63f@JL%eC)ald*Bq]bfe/NaN)<>`P]R0_8!b!]tCtg\c.fjP5UUEOscHVJSU-r
+BV(TPLOtDALodYVV50]OR$3PfM26hHOHHT,[BY",JrK>_!0I/A!KrZEPQI/9Q1pUAQ2['LQ2-[C
+Q2[$JP5pdEOoLUCOo:C7OT:LAOoCLEOc]R)(Qac@OGf$MJq&5rHZjLOE,flEH@'sbHiAC4I=?To
+I=GX3?sd5J?XR2I?XS&[Y-"h-XK&1oU]-tpTqJ*PTq@mHS!]ZDR1#CKQ^*buOcPTbN/RXl",V_b
+K_pH*L51SArJ:K1s+pZ0",M_fM"lf.Ll%#bM>rD3LB<9gM>`>3Qi3<LR/iWMRJrZTR0/h2FC>#Q
+!F/k.=p%u4>$Ul0"C,/8?![D8!+5_5q-X/.s'>Y2s'5V3rEfM0r*05-r`oJ-"^5&3>?Y5/>Q7n,
+=oMS3>[:W?>[(?6=B\o->Q7k'=pJ24=B8O+='5E&$<C,+<E)gl:l^Ttr/U`:s,d8C#*P16Pa%Gs
+oT]B@s-EYN#+1gIS"#q<oUPuRqO[b\r1Wt[rLs7c!28nV!2KLg!i;ckp8@hemAU_uTTahNH$=CN
+EHHYUH?4[>XDIlQqJQ:NrG_RPr,VaWpiQLXrHA'^s*4QhrHeKjs*Xfos*artrdY$#K)UCAKS>/8
+LPUeDMMmFPNK0']OckllQ'I]'R$sM6SXuIHTq\?YVPgAmWiW>*Yd(L?[C3QT\\#Mg^VI_(`5Td<
+aihoQcHsteeC<($f\5'7h;7&IiSrnYjlYail0@U$m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6Nl
+rUg)?s+13gs*t~>
+JcC<$JcGKElMgYYqu$3crVHNhqtU3crq?<`s7H?_rpp*Z!:^!V!Uf@SliHG;rol<(kN:pgjQ#:[
+iS`YOh;-l@g=k63f@JL%eC)ald*Bq]bfe/NaN)<>`P]R0_8!b!]tCtg\c.'MI2ZHmB4=h_E,/um
+B4tn.J:DolF`VP@CM.9kAH$BMJTQ^/CiOQBqg/6gr-\3d!e,QGpO;IWqgSNmnUC@`s*X`krHnTl
+rd4]mrd5#dBP(^^?sR#@>5hS3<aK*>?=7,J?t!GO?iFI>;cQdr;c?Rm<;oc0?\<u_Jq8H%Isl]m
+I=-EgH[:!`GlDpeFp`A6F)l;?Df0H/DZ4JOCC"WfBP1skBPD2ZB`2TCB_uNACAV`FC'86cCMIV_
+C&D]GC&VlGC]APUG5HI`Gl;gfG^"B2G5cUgCLC%;:f1*h;u0Al;uBPn<;ohm;ZBYr;H*Kms&8qq
+rDW_os&&_m!E2nn;?'Mo;>O,g;>sDl:]4)j:Jh$fs%i\kr_WVl"Ahii;,R<hs%`Si"&Mci:]*rm
+:J+8Q8P)?srHnNks*OcnrI+NkrI=crr.4m"re(!!oS!:"rJ16(reLK/!/^]2re^<*s,$]3qMG60
+pP]!/rf$o<rf-H.&rh]rEGo]2C1h0nD/F*%Db5Y!rb_LLrbqaSq/Q=QrH%aUrcS0_qfi'bs*=Qh
+s*OcnrdFfq!.Xuu!J,k%K5cKtL5(J>M2@+JN/WaVO-#KeP*D5sQ^F//S"#t?T:hmPUnjlcW2cl!
+Xfen5ZEpsI\%0&]]Y;.r_Sa=2a2lBGbg"G[dF-Oof%8R.g>(N@hr*JQj5f=akNM0qlg4!*mdKW6
+nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#s2=qf~>
+JcC<$JcGKElMgYYqu$3crVHNhqtU3crq?<`s7H?_rpp*Z!:^!V!Uf@SliHG;rol<(kN:pgjQ#:[
+iS`YOh;-l@g=k63f@JL%eC)ald*Bq]bfe/NaN)<>`P]R0_8!b!]tCtg\c,V&<$t[F-Rp\s0fV$H
+0.\e30ge5k5<M%h3B/oS1c$mG3&ir^6;CBT<)iWks&/Vhs&/ems%rVjp.t`dnl#Hcr)E5cpf./i
+s&B"s!)iepr_a#!2)R9H2)-d>r[n:(/M&XU1(uGu0f(R?1GU^A1Hmub4?Yhi4[&d)#<bRI84Q0>
+7fGgV7/'%Q5sdn(5X7X74psM73^,\g4$#Da3]c^is#U'<rAjp=q`+U9!]W2$r&Fg>4$*4"rB1!F
+qEjmCs$@,[5X.Co4$5Vg4[)%mqE+jD4Zkk)4o[VD4T7DE4?GSbq`F^<s#pBEs#g?GrB:'@rBL6E
+"?eq44[/j.s$$HGrBC-Bs$$HG#!>%55X@Y"rBU?J"[YL@5<qL556sM<4ukYd4$#:n;u9Pl;Z]iq
+;uBVp;uKVo;uT`!;c6Ll<W,ni;?9]rqc3\uqcNeuqH32hs&eblrE/r"pfRGqrE0(u%o?"s9he;S
+9heAZ:/!K?D#S;JDZ4SQE;=MOErC(SFT-F]G5HL`GlN'fHN/?lI/\QoIK4lsJ,t4Qre#0CKnb>;
+Ll$tGMi<USNfT9aP*2&pQ'[l*R[]e;StD[LU84T^Vl6VqXKAY0Z*L^D[^WfX]=bkm^r""-`Q-'A
+bKS5Vd*^:keCN7(g=k?<hV[8MioB+]k3(smlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`n
+o_sFAJcE[gJ,~>
+JcC<$JcGNFlMgYYqu$Ei!3uJ!rVHNhqtU0bs7ZEas7H?_rpp*Z!:^!Vs6`/>m-O'(lKRQskN:pg
+jQ#:[iS`YOhVI#Cg=k64f@SR&eC2jnd*L"^bfe2OaN2E@`PfX1_8*h"]tCtg\[[ier0%#BrK8IK
+F**+jSXGRnKnsJVKWV,KUn+$BOc53SLP1>COgU=YT6Yp=N:W,1OT(@CP*>d-s-<;Dqj%2Is-<GF
+r0@;Hs-*JGrfR5Dr/pr>nWEg6!g/S+rfI2Brf$l0s*c/?HZsRQE,foFH@'scH$k!fIXZ]oJ:M$7
+?sd8K?=7)H?X`r:s/dNIX/VtlUna]ZTqJ*OTUqaFR[BP2R[KM/QBdYtOcYZbN/NVmMZ/>0K_pH+
+L51P@M>`81M#`A1LB<9eL\ci-M"HN3LkgbAM2@+IR$X2,rL!/Ds-iqT!g/"Mr*BD/>PhS(>kq\-
+>[(G3?2e.4?XR;Mq-X/.ra#P1!F9(2?N+7/>QA(/>lS%-=o_e+>5qe0>[(E8=oMS8>[:W?>[(B7
+=BSg3>[(B7qcX8.=BJU)=BAU,rDs5(<`N*s;,Bp`Nr>%=OT1ICPQ$dHQ2$RDQ2QsIQ2d0LQNihF
+R[]e:SFrHQT),&ZT_tM\T_tJbU7n:NUAq"eU]RBiVYI(dW9U>oWh59"H?XRUF)c>UH$FLf=02C<
+qel@Nrc%[QrGqgWq/lUYrHA'^s*4NgrHeKj!.=`n!e,WKrdY$#K)UC7KS>/8LPUeDMMmFPNK0']
+OckllQ'IZ&R$jG5SXuFGTq\<XV5L8kWiN8)YHY==['mEQ\[oGe^V@V%_o9X:aND]McHjkbe'uq"
+f@em4gtgiFi8WeWjlY^hl07L!m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$_uG5~>
+JcC<$JcGNFlMgYYqu$Ei!0@'TrVHNhqtU0bs7ZEas7H?_rpp*Z!:^!Vs6`/>m-O'(lKRQskN:pg
+jQ#:[iS`YOhVI#Cg=k64f@SR&eC2jnd*L"^bfe2OaN2E@`PfX1_8*h"]tCtg\[[*;oR/#p?t!MS
+F`D5-@V&YBBnC_[H?F:KDJEisA7T1eCkZncIr'(FGkuadHN8BkHiAEbIJ/-WIJ\KlII_jaIK"Wm
+Hi8?lHiAC/HYR8.A7K%U?<pc<=B8O*?=$uG?s[2Ira?=E@:E\E<)Zap;c6Om;,L9kKE$N4JUi6!
+I!gBkH[L-cH$TC6s*"QgF`hg*EWU2uDuOVOC]S<crFl4Ds(MFHr+Q%As(M7CrG)1CqJ-"Dr+c7G
+s(_RLrcSEeG'.tOqfi'brc\EgGBa%0s)eEeF(eeV;>sMj;?0Yn;ZB\t;c6Qj;ZBYr;H*Nnr_reo
+r_rhps&&\l!)rhn"B&)p;Gm6dr)!Jk:]!uf;?'Gm:]=2j;$9]j:Jk!g:^Bil:JO_^:esmc:&n)h
+9E.Qc84@lPrd=`ms*Xcnq0r9lrdaots+:9'pOr3ns+^K-qM,!)reLQ0reUQ1onia+rJLE-!/gK.
+rJ^T4muA!>LO!lXD/<s#B5)@$Che#_LAl&eDZ+MQE;=MPEr:"SFT-F]G5HL`GlE!eHN/<lI/SHp
+IXckHJ,t4Qre"g9Knb>;Ll$tGMi<USNfT9aP*2&pQ'Rf)R@B\:St;UKU8+N\Vl6SpX0&P.Yd1UB
+[^N]V]"G_k^VRe)`Q$!?b0/#Scd:(geCE1&g"P39h;7)JioB(\k2tmll0@U$mI'H3nF?MK!V>s_
+o`Fj]p\ssfq>^<hqu6NlrUg)?s+13fs*t~>
+JcC<$JcGNFlMgYYqu$Ei!*&mnrVHNhqtU0bs7ZEas7H?_rpp*Z!:^!Vs6`/>m-O'(lKRQskN:pg
+jQ#:[iS`YOhVI#Cg=k64f@SR&eC2jnd*L"^bfe2OaN2E@`PfX1_8*h"]tCtg\[YX>oMcbm5!CGH
+3&WNF/MK.D4$c%o4Zkbc2`<NM1GU]a3!;E27o<1U;ZK_k;>sGn;>j>h;>*fd;=RQa;u9Pb;ts>j
+;u]hs;u]bp;ZTcUr\X^31]B'N0.ee-/M&V31G^dA0etO?1GU^A1d*ua4?Yhi4Zk\b3rMPS84Q-=
+77K^67/K=X6:4++6:*n%5X563%Qum95!:ti3]fA_3]]8\mlCD/r&O^:!'0p9pGr"1s#g*Eqa1!D
+rB^NM55dVD4o[\H4ZiO'"$Jh14T%AA3s%N+48qAB3r;#94T@SE497T/r&t!@!'^BHrBC6E!'^<D
+"$\t54oISB4o[_G4o[VI5!VD!5Q*kH5nZLM5sIV"5<qFt5!M(g3]fA_2>L2J<;]Yp;Z9Su<)Zaq
+;cEWms&8nr"B/2r;cWcqohkfi<Voes=8Q+t=8Q+g=oVUn=8l=u=nl,!=8Q,!=TVQ$;#X5i9aFEf
+9hnJW9f5cHD>S5LDuO_OEW'qUF89qWFo?L\GQ2peH2W'hHN8HlI0+kIJ,Xs!JV*lRAqYkmL51SA
+M2I4MN/`jYOHG]hPa.N"R$a;2S"6.BTV8*TUnsufWN*#$Y-5(8Za@0L\@K2`]t_=u_Sa@4aN2NI
+bg+P]dF6Uqf@S^0gYCWAi8EVTj5oFckiq?slg4$,n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTd
+rdk*#s24ke~>
+JcC<$JcGNFli-bZqu$?gs02P#rVHNhqtU0bs7ZB`s7?<_rUL$[nF6GG!Uf@SloXOul07EqkN:pg
+jQ#:[iS`VMh;-l@g=k32f@JL%e'cXkcd'h\bKJ&LaN)<>`5BI.^q[Us]Xtbc\[VR%rf[5DrK7/'
+rGs*"CM[d&DJNs"XehnjU7.I6NJ`RJKS5JMXcTo]H%:L)nW*[3rK.,DPPg[EQ1pUAQ2['LQ26aC
+Q2[$JP5pdEOoLUCOo:C7OT:LBOo:FDOc]R)$B:"$K7\T&H[9pXrbqmdI/\I!I!pEjIXlfnJ:IN*
+s'Gt<?XI,H?_RJ%s/cI+Wi)\hV#I.hTcB_tTq7gER$jD3R@'>,QB[PrOcb]aN/W[QMMd2eL&Zi'
+L&Zl/LP^ldM#N59LkgbALkgbAqhY</rJ:N3q2#*-reC]7Q^F,+R$[];o9oWIrL!qNH=gJj?X@#B
+qcWu(qd'M5?<pc>>[:Y7?3=PB@:8n<s'>q9>[:ZB?!^n;?N+7/>lS+0>lIt-=o_e+>5qe.>[(G2
+=oV\*?2n.1>?_#/"^5,8>?Y2,>5q_0=BAO*=BAW'<sMc*<E)mo;,.%M$]gC1O-#HcP*;)oPl?sD
+PQ7!IPlI$KQN!3TR$jD4S"-#ASc>;XT)bP^U&:SYU%+lWU]$tiV5C-bVu3LXWW/t3W18`oH?aUS
+EcQMYH?OOs>H_m\qelCOrG_UQrGqjXq/lRXrc\0_rcnHgrHeKjs*Xfos*artrdb$"Fb56uKS5&6
+L51SAM2I4MN/`jYOHG]hPEhE!R$a;2S"-(ATV8*TUnsueWN*##Xfnt6Za7'J\%0)^]Y;.r_Sa=2
+a2lBGbg"G[dF-Lnf%8R-g=tH>hr*JQj5f=akNM0plg4!*mdKW6nac8Bo^qhLp@e7Zq#C0iqY^6i
+r;HTdrdk*#s24ke~>
+JcC<$JcGNFli-bZqu$?gs,[3WrVHNhqtU0bs7ZB`s7?<_rUL$[nF6GG!Uf@SloXOul07EqkN:pg
+jQ#:[iS`VMh;-l@g=k32f@JL%e'cXkcd'h\bKJ&LaN)<>`5BI.^q[Us]Xtbc\[VQepO**j@U]7D
+!FB%0>8gXF=+YgIH?jRPDej'"A7T1dCjpD\IV`tDGkHC^HiJKbIJ83XIJSEkIIhpaIK+]nHi/6k
+HiAC7CMIKm@U`_O>[1E5<``X7?XI2J?t!GO@:3JP@8g*(rDNkt;c6OkHi8TsJcC3,IXHQmI=$?g
+H?jf7GlMsnG'%eHEcH#8DZ+DUChmj'BkdEW!,):Es(VFFrFZ1FB5%0VrG)1CrFuCLC23]]rbDFH
+!GZcUFoZ[`Foc`/r-/0cqfi$_s)eHfGAq%nr_W\o;u'>k;uKSt;cH[n;H*Ei!`MuprD`bprDNYo
+s&/koqGR;i"]A2p;Gg<f;#F2i:]O;i;#O8h;#aAq:eje`;>j;m:/=Xa;#a>i:B+)i9)_B_84<H)
+!.4]mrI+KjrI=fsr.4m"s+C'!onEF#rJ16(reLK/!/LQ0re^-%q2#*/p5Am.qMjs(s,RhOKm.KR
+D/<s#BPVR'C28)jKl(](DZ4SQE;FSQErC(TFT$@]G5HL_GlN'fHN/?lI/\QoIK4lsJH(1CJqJ]/
+KS>/8LPUeDMMmFPNK0']OcklkQ'IZ&R$jG5S=Z=FTq\<XV5L5jWiN5'YHY:<ZaI6N\[oDc^;%J#
+_o0O7aN;WLc-F\`daQ^sf@\d1gYL]Ci8N\UjQ5Oekiq?tm-O--n*fc9o()DEo_%nNp@nO\s7u]k
+r;6KkrVcBfJcC<$_uG5~>
+JcC<$JcGNFli-bZqu$?gs&K*rrVHNhqtU0bs7ZB`s7?<_rUL$[nF6GG!Uf@SloXOul07EqkN:pg
+jQ#:[iS`VMh;-l@g=k32f@JL%e'cXkcd'h\bKJ&LaN)<>`5BI.^q[Us]Xtbc\[VQ<p/E8$5!D(l
+4?P\c3]]5[1I42h4?bec3Ar`P1GU[E3&Eca7o<1T;u]bk;>sGn;>j>h;>*fd;=[Wb;u9Pb;ts>j
+;uTbr;ZK_p;]%DM2Dm9I0JG.5/M8S+0JYC>1GLU>1GUcc1(?$'4Zkhi4?bki4#o>ir^R#Z7n<PI
+"%YgI7/91M62j4N5lX%Q4[)%l4$>b+4:+&13]T5^3&rrXr]'s>o/Ze2rAjd:!'0s:rAaj=rAjm=
+qE"[DpI"gEp-\gG"%,@>4oIMC4TR`0qE+jC5!;%+4TIVB48q>C4$*7#rB(0D4?Yk,49.SC4oIJC
+55meF56!bL5!;%m4[&R(rB:-D"$Jb/55IMF5=#-4r]glV5X.Is5<_.h4#o>Zqc!Akpeq>q;cH^p
+;uKVo;uT`!;c6Lm<W,nj;?Bcr<W#nt=8Q+t=8Q+f=TDRn=8uCu=nc"u=8Q+u=VFk9:f'q_:/+DV
+:/"DY9i!fKD/K/frbqaSqJlISrH%dVrH8*_qfi$as*=Qhs*OcnrdFfq!.Xuus+,<EK7ei1Knb>;
+Ll$tGMi<USNfT9aP*2#oQ'Rf)R@B\9St;UKU8+N\Vl-MoX/rG,Yd(O@[C3QT]">Vh^VI_(`5Td<
+aihoQcHstee'ut#f\,!5h;-uHiSrnYjlYail07O#m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6Nl
+rUg)?s+13fs*t~>
+JcC<$JcGQGli-bZqu$9eric=trqZHdrqHHdr:U*^s7?6\s7$*YrpN/@mHs9,lg!d"l0.<mk2k[a
+j5T%Ui8<DIh:pZ;g"=p-e^W*sdF$=dcHXSVb/q`F`l5m6_SX+'^V.:m]",A][f2KjP5UUCOsP0l
+FE;G=Ci+!(Df'3#XJhtiT:M@6NJiRHKnPSLQ&i8BG^tC)muRF/!g/Y0r072GpQkQ=qipuCs-3PI
+s-!ADs-!;BrK.&A!0[/?!0I/ArfSLgOHGK^N/E:?IXQ]iGB7hFEI<+XH[C0hIXQZoI=?Zr@:3L=
+?NYb[YHRr-'!/(1V59u^US+<ST:V[HSXZ"8rL!qXQBm_uP)tferJUf9MM_:drIt9)qh>')",D\h
+M>`81M>rA8LPUeCLPYha!/UT1s,-W/$&=b0QC!u*Q^F-:R/*-MRf&TQRf/WTLNEE$!F8q,=ohi5
+r*KD/"^YG<>[:Y7?3=PB@:8q=ra#h8>[1TA?!Uh:?N+7/>lS+/>lS%.=o_e+>5qe/>[(E9rE0J2
+>[:T>>?Y04=Bb].!ErY'>5q_0=BAO*=BAW'<sr&.<)lmp;GTrHOH9C&"d+t3PE_=2Q2-XEQ2QsI
+Q2d0LQNihFR[]e:SFrHQT),&ZT`(S]T_P5OUAq"dV#I7dVu<RXWVrh0VjrHgH?aUSFE2eYH$+:t
+>H_o@DZ4SRE;FSQErC(TFT-F]G5QR`GlN'eHN/?lI/\QoIK4lsJ9$3mJqJ]/KnY89LPUeDMMmFP
+NK0']OcklkQ'IZ%R$jD4S=Z=ETqS6WV5C/hWiE/&Y->.9Za@0M\@K5a]t_=u_SjF5aN2NIbg+P]
+dF6Uqf%8U/gYCWAi8ESSj5f@bkNV6rlg4!*mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6hr;QZdrdk*#
+s24ke~>
+JcC<$JcGQGli-bZqu$9es,R/?rqcWiqtU0bs7ZB`s7H?_rpp*Z!:^!V614.-m-O''lKRQskN:pg
+jQ#:[iS`YOhVI#Bg=k64f@JL%eC)ald*Bq]bfe/NaN)<>`5BI/^q[Xt]Y(hd\[]*IIe\<rHt$Pn
+?sm5Gr`^=H>$+dUIX??aG&qS<BOt^a@r,q"Eef'YEH6<rHN&9gI.i!_IdVX\If+WcIf"QnI/J?i
+Hn0PkCMRZuA7AtS?X-f<=&rF1?=%#H?smDN@:<PP@:E/7<E)mq;GpFk;eH#]s+:9%s*t&rs*Xus
+H[C/>Gn54GG^"@TF`_\GEcH#8DJ];hrbVULrb):Eqe,tBrb2=Gr+Q"@!,27DrG)1CrG)@Js(_OI
+rb;FIrcA-_q0)d\s*"<a!-nBbrHA3`#^:N/?VsWs;,d6f!)rhos&0#!;c6Qj;?Bcp;Z0Sp;u9Go
+;c6Nm;>X8j;$Bip;,U7gr_NSlr_WMir_WVjrD<Jjs%i\kr_Nbq:esk`;>j;r:/=V]:esn`rD*Ag
+#>.QZ8kDH=HiAEkIJJ?jJ,XurJcC?%KD1&lL&Zo+L\cc)L]<21L]3,/M=HJuM=lf*N;JV&Nr>"O
+MhQ:mDf'<*B4u.#Ch[U0:k`c`DZ4SRE;FSQErC(TFT-F]G5QR`GlN'eHN/?lI/\QoIK4lsJ9$3m
+JqJ]/KnY89LPUeDMMmFPNK0']OcklkQ'IZ%R$jD4S=Z=ETqS6WV5C/hWiE/&Y->.9Za@0M\@K5a
+]t_=u_SjF5aN2NIbg+P]dF6Uqf%8U/gYCWAi8ESSj5f@bkNV6rlg4!*mdKW6nac8Bo`"Lbp@n=\
+q#C0iqY^6hr;QZdrdk*#s24ke~>
+JcC<$JcGQGli-bZqu$9es&8turqcWiqtU0bs7ZB`s7H?_rpp*Z!:^!V614.-m-O''lKRQskN:pg
+jQ#:[iS`YOhVI#Bg=k64f@JL%eC)ald*Bq]bfe/NaN)<>`5BI/^q[Xt]Y(hd\[]*I<W?%u<<6'!
+rDXt)5<_1m4$>Yb3]]8\2*jGj4?Ybd3B/oQ1,CXF2`!W_7o0+]nl#Ndpeh&hs&&_kr)*2b!)`>c
+"&i)r;u9Pc;ts>i;u]hs;[$&t3AiZPr\OR.$nX+a/hJV/1,1R>1,8b`!AcM11CH?04?Pbh4Zkhg
+3C!L5!(d)Zs$crW"%5ID6N'7T6:=1-5skQ9!C&dI4Tdf.4?`[+"?SY(3][."!'1$<s#C'?q`+X9
+q)SI9rAjm="$&D'3W(l83WD/=3<2,=48qMG6MEkD6M<eH63KYD5sIO34T@SE4omc-r&b!C55IDB
+4T%;?4S_);4T@MC4oRSD55dYC49.SD5Q*eG4T[f155m_A4odhG4oRYF4TRZ.rBLKM5X7P!r':EM
+5<qL356*nH49%AA2?$PO<;'8j<<#nq;ZB\p<!6,t;cHcq<;'2k;cHcp<rZ8!=Sl1s=RK;l=Su5#
+=S>er=SQ%h=Sl57>$+g&:esh[9h\8U:/=SW;E@`nqelCOrc%^RrGqjXq/lUYrHA*_rcnHgr-JBi
+s*Xfos*artrd]$?JqAW-KS>,7L51SAM2I4MN/`jYOHG]hPEhE!Q^F20S"-(AT:qsRUnsrdW2cl!
+Xfen4ZEppH\%&u\]Y2(p_8=.0`lQ6DbKS8Xd*^=le^i@*g=tE=hVd>Nj5]4_k3)!nlKdg'mI'H3
+nF?)?oCW%T!quB_rqQNhs8)ZjrVZZnoDX=@JcEXfJ,~>
+JcC<$JcGTHli-bZqu$3c!3cC)rqZHdrqHEcrUp3_s7?6\s7$*YrpTmT!:BdP"mbI<l0.=0jtl,[
+j5].Wi8<DIh;$c=g"=p.f$r3uda?FfcHXSVbK7iH`l5p8_SX.(^V7@n]=GJ^\$l:"!0[>Fr/qn<
+G&qYAE,9B-Ci=0(AZ_l-V4sKHP`L]Xre:`?OdME?S9TO7Mu8V9OS+\4O91Q-PPg[EPlR-KQ2HsB
+Q2?gCQ2d*JP5pdEOoLUCOo:C3OoCLcOcYW`N/*+<It)onGB7kGEI<1[H[:-iI=-EjI=?]traGh6
+ra5h8?sp&7YQ(^1XK&7sV59r]U]-ndTDkDcSXPq7R@4&As-<VK"-Se0Nr=n=Mi*=Fre:B,rIt9)
+qh>')",D\hM>W20M&D,)Ll$qCLl%[iU5kV8SZf*6\WDu#H?ja]rd"Ni%s`JJH#o+/NjlO$X0/"m
+OnP4BRf/WUP_!ZM?NFJ;qH<l(qd'J4?<g]=?![D8"(,GE@/=70?3OV>?!^fBr*KD/s',Y1>[1S6
+>lIt*>5MP&=V+b@?!LW=>$5!1>$>-7>$5#+>5qb*=9)D$<rcA$<t\P5<E3!p;,BoHOH>TeP*;)o
+Pl?sEPlI$IPlI$KQN*<OQj&nHS"#q<opu,SqO[n`TqS3Sqk3_Xo:l8[r1j=hrhfIgrM]Ok!35gn
+!35pqrMomu&Z2%JH?j^WF)cJXI!KgYRourmDZ4SRE;FSQErC(UFT$@]G5HL`GlE!eHN/?lI/SHp
+IXckHJ,t4Qrdt6)L&Qg;LPUeDMMmFPNK0']OcklkQ'IZ%R$jD4S=Q7DTqS3VUo(&gWN*&%Y-5(8
+Za@-K\@K2`]Y;.r_Sa@3a2lBGbg"G[dF-Lnf%8R-g=tH>hr*JQj5f=akNM0plKmm)mdKW6nc&([
+oCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcEUeJ,~>
+JcC<$JcGTHli-bZqu$3c!0@,=rqZHdrqHEcrUp3_s7?6\s7$*YrpTmT!:BdP"mbI<l0.=0jtu2\
+j5].Wi8<DIh;$c=g"=p.f$r3uda?FfcHXSVbK7iH`l5p8_SX.(^V7@n]=GJ^\$gb\IK+[!@:N_R
+?XI(;>7OnA=B0s$I!^*\Ec5c-B)Z?@C^4p$L4!cUEd.G-!.4Kes*F`lrd4Zmp3cpirI+TmmX=n[
+rI+9dqL/BkrHnKj(i=&'BkCpb@:3GJ>Zk32='o?B?s[5L?sin@!b#PJr)EYos&&krJc:<%JdI!Y
+J:DroIXQQird+Ti!IB"iGQ2daEr^4ZD[C;uDJa6+Ci!j$rFl1CpLjP@r+Q"@#&%^bC2%EsrFugV
+G'81PGC+UeJ<,J'DJ/l\")2F]B`;WRAn>grC5.IpJ:MrpFEmS)rHA3`#^1H6BN\2/;,dBj!)`_n
+!)ren!`N&spJM&k;H*Nns&8hn!`Mupr_`Pjqb[Dm;,R0dqbdAis%iSir_`\l!)NSjs%rnq:/Feb
+r_WVis%`_n:Jajb:'j]g91qiJ7mq`PrdFQjrI=fsr.4m"s+C'!onEF#reL?)rJ1E/!/LN/re^3'
+pk]!.oo&d-qi1W9"-&>$NV&8.NtI>(F)Pr5C2%?sEc#]-Bmid2r,2LPrc%^RrGqjXqK2[Yrc\0_
+s*4NgrHeKjs*Xcn!e,WKrdY$#K)UB'KSBD[A;>ttM2I4MN/`jYOHG]hPEhE!Q^F20S"-%@T:qsQ
+UnjlcW2ZeuXfek3ZEppG[^`lZ]Y(tn^r"".`Q-'AbKS5Vd*^:jeCN7(g"P3:h;@/LioB+]k3(sm
+l0@X%mI'H3nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s+13es*t~>
+JcC<$JcGTHli-bZqu$3cr_rktrqZHdrqHEcrUp3_s7?6\s7$*YrpTmT!:BdP"mbI<l0.=0jtl,[
+j5].Wi8<DIh;$c=g"=p.f$r3uda?FfcHXSVbK7iH`l5p8_SX.(^V7@n]=GJ^\$l99!*&qtr)=t+
+5<_4n4?GSa3]]8\2*jJk4Ztke3B/lQ1GU^F2_dH]85E/\;Z'Gn<;'5j;Ya2h;?0Sm:]OA`:]OAa
+;Z9Vl<:Wu_<;fbq<<#kt3BI-t"uJ+l0JG.4r[eC,0etI>0ekI?rA"R51,D'U4?`U)!]iG5rC6lZ
+8,bsX8,bmf6UF1.6pX.,6:*t)5X7Ou55dYE4T@PE4T7AA3W;&@3B0%u3rV,=3WD/<3<2&63WD,S
+3BB/]3]T5^5!M:q5!;%o4[D7e1]BlE7f5dW8,bsW6O,D&0g.]a5X563!(6`PpI"pH"%5I@55m\D
+4Tdl24$3@&s$$9Bq`Fd>q)eO;!]rM-r]C3E5Q*bD49.PC5Q*eG4TI\D4o.>B5PmSZ5!;%k4[;7u
+5X.M!5<qP$5sdk&5<qL557KkA4ut_e4$#AY;cH^rr`&Sis&B"srDNYor_s#!;H$OprD`Jg!`N&u
+r)Wi!r`B2(=Su7s=RK;l=T)>$=S>hj=oVS(=nl)!=oMP$=oDM9=&W!m:/+JX92J>V:/+G[3E,in
+rbqdTqJlISrH%gWrH8*_qfi'brd"Hgs*OcnrI"`rIt.HJ!J,k%K)pXZre=s=Ll$tGMi<USNfT9a
+P*2#oQ'Rc(R@9V8SXuIITq\?YVPgAlWiW>*YHY==['d?P\[oGd^;%J#_o9U8aN;WLc-F\`daQ^s
+f@\d1gYL]Ci8N\UjQ5Oekiq?sm-O--n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s2+ed~>
+JcC<$JcGWIli-bZqu$3cs8)buriH1rqtU3crq?<`s7H?_rUL$[nF6GG#4CmGm-O''rolE+kN:pg
+jQ#:[iS`YOhVHuAg=k64f@JL%e'cXkcd'h\bKJ&LaN)9=`5BI.^q[Us]Xtbc\@8oSq31f@-$=<P
+Ec>r9DJF!)Ch@:\Wi;kiS=,V(N/3:FKohFOT!Fl1It<OUO8b76O8P(@Ockq+PkgUBQM6[APkpXJ
+P`q;oP5ULCP5CCAOT(@BP4Xn:P5gOcNK/aHIsuinH$=@PEc?GTH@:6kI=Q`tIt*$#@U`bS?XN_=
+!J%<OYQ(^.X/`(pV5=0ds.KFcrgs7`S=9DEs-O+ZQB[VtPECufNW+k<MM[,cL&Zo+L&Zi&L&Zl-
+M#N80L_Po>O.3&bPBq_5N14d$BPV<sCM7>VBE)N]BPD0oB4kmiB4bdf@q9(_BP)jLH#mk_\%A@5
+RJrZRR0T1@H=gMk?<mJ5!*T;)!*oD-s'5\2>?h)4ra#\6?t!I>?iF@8?!LW??=!J8r`oY3>?b?<
+r`oD+rEB2)!aJr6rE0\8>?tN>>Zt95=BSg3>[(?6qcX8.=BJU)='&L+r`9P0<)lpt;,C(_7Zijs
+PQ$gGQ26aFQ2QsIPlR-LQNrnGR@9V7S=K8Cs.9(Zr1X"\pn@;Rs.fOgs/#^lpS\"hql0Rpq5OCo
+ql0Oori6[2V3?FWH?XLQEdWpoH$+M)=Kh[@rbqdTqf2RTrc@mWrcS3`qfi$as*=Ngs*OcnrdFfq
+s*t'!s+(0%re#*AKnb>;LPUeDMMmFPNK0']OcklkQ'IZ%R$jD4S=Q7DTV8*UUo(&gWN*#$Xfnt6
+Za7'J\%0&]]Y2(q_8=.0`lQ6DbKS8Xd*^=le^i@)g=tE=hV[8Mj5]4_k3(smlKdg'mI'H3nF?)?
+oCW%Ts7QHerV-BgrqcQirqu`no_sFAJcEUeJ,~>
+JcC<$JcGWIli-bZqu$3cs8)YQ!;ZNes7cNdrUp3_s7?3[!qGdLrpL'ZmHs9,lg"K639]Pfk2k[a
+j5T%Ui8<DIgtUQ:g"=p-e^W'rdF$:ccHXPUb/hZE`Pod5_SO%&^:h1k]",>[[^GmYs*Q,&@:EVP
+?=$l@>$>'1=+PjLI!BaSE,B<$An>LhChS'KIVWkBGPlddHhD^bHiAE_IJeQ_IJJ?iIIhpbIK+]n
+HiAC-D/3m$An5=X?s[,C>$+m.?sm>M?sin@"CknM@q5I:!E2tr;ZTd/rIYQ2JUr?%I=-HlI=$?f
+HN&0mH?aXYG5ZLdF)c)9Df5Mjs(_[PC23`]s(;=Frb(t=!,;=Ds(<-]B4u!uGB8%ZNG`HGEH?P;
+@prbR?smF=@fBdA@UW\S@UW\P@JsRD?X[AMDJa)u@;:OSI!9f5G5l[kG'J7N@ocE';H*Kk"&Vro
+;uBPm;tj/k;c6Qm<<#nm;Z9Pj;Z0Gq;Gg=h;>j;k;>sDi;?'Jm:]4,h;?'Gm:]=2j;$9]j:Jk!g
+:^Bil:JXe_:esmc:B+,i9*n0^84>akI=?WpqgSKnrdaots+:9'pOr3ns+^N.qM+s(s+gZ1rJ:H0
+o8<="s,-N.r/CQ5s,R,=!fi8"oT&d/&rhfuF)Po4CM7BtG&1u0DLYE8rGMUQrc%aSrGqmYq/lUY
+rc\0_rcnHgr-JBis*Xfos*juts+(-#!.t3&DM3^uL51P?M2@+JN/WaVO-#KeP*;/rQC!u,R[]h<
+StD[LU84T^Vl6SpX0&M-Yd(O@[C3QT\\#Mf^VI\&`5Ta;aND]McHjkbe'uq!f@\g3gtgiEi8N_V
+jQ>UfkiqBum-O--n*fc9o()DErq6<b!;HHe!;ZWjr;6KkrVcBfJcC<$_Z,,~>
+JcC<$JcGWIli-bZqu$3cs8)Xm!;ZNes7cNdrUp3_s7?3[!qGdLrpL'ZmHs9,lg"K639]Pfk2k[a
+j5T%Ui8<DIgtUQ:g"=p-e^W'rdF$:ccHXPUb/hZE`Pod5_SO%&^:h1k]",>[[^Gp2r_t.,4[)"l
+4?P\c3]]8[2aK_o5!1nf3&riQ2)I-L2_RE]85E)Yqc!Jnpf%/iq,./is&&/[o2>Te!E<"p<:a&`
+<;]\p<$XF^2E!BJ2)6j>0/"q//LrS21,C[?1c-sE1G^jD5!;"j4Zkn,49@K.7fGn&7Ros;77Ka7
+6UX:/6psC.6UO+)6:!k%5sILq4?Ybh5!;"jr]1<E3]]>^2`E]Vr]1$>r\ss>3]d1!s#Bg7'KeQB
+4[;4e77B[9786KM:/"AU9MPI\r_NPg"\qcc:/=[b:(^;s:J=JV9M82N7n#d21He#fqa:?Ls$QuU
+5Wq4lr]LBJ4ZkefrB1'Cq`OpAr&am?q)eO;s#UQM4Zkhi5<_4n5!Am-!BiXG5Q*eG4TI\D4o.>B
+5PmSi5!;%k4[21t5X.M!5<qP$5sdk'5<qIu5X.Is5!M%i4$#AY0NJ*Op/Cujs&8kos&8nr"B/2s
+<)rlrp/1rj<)riss&],#r)`_smTBNlr`B&#pfIJtoi_)ms&oA(qcWi#"^"f';GU'e9aOKf9M\AU
+9iF)OrGMUQrc%aSrGqmYq/lUYrc\0_rcnHgr-JBis*Xfos*juts+(-#!.t3&DM3^uL51P?M2@+J
+N/WaVO-#KeP*;/rQC!u,R[]h<StD[LU84T^Vl6SpX0&M-Yd(O@[C3QT\\#Mf^VI\&`5Ta;aND]M
+cHjkbe'uq!f@\g3gtgiEi8N_VjQ>UfkiqBum-O--n*fc9o()DErq6<b!;HHe!;ZWjr;6KkrVcBf
+JcC<$_Z,,~>
+JcC<$JcG]Kli-bZqu$3crV?irY-"h-X/i>sq#:$epAO[ao`+O]ncJ@NnG_lEmd9E.m-F!&l07Ep
+k2tddj5].Xi8EMLh;-l@g=b-1f@AC#e'ZRicd'eZbK@rJa2Z*:_ns7*^V7Co]=PP_\$i]OZhfmb
+OsPdKMfE]PChmp+Ch[UcWMl_kSXGh+N/ECFKTVCCT$NpOI=R38qiC`<p5f*4!KiTCPkp[CQM6[A
+PkgUDP5pdDOT:RBOoLOBOT:R8OoL@LMM?_4JUMceGB@kFEdI_3!.Ffp#Ch2RJUh0;@/aL;@:3DL
+@'?a4YQ(^2X/`+qUnj]ZU7qOY*1idmR@9S4R@'A-Q'@MsOcb`aNf8sWM2I%AKnfJY!/CH+s+L6&
+s+VVVOINS>I"[B:DJa-&BP;$kC2.HtC1qF!C2@[%D/F+gCBeTlD/O90DZ"8MD>n;VD/<p$BPM3q
+CAqcLAn?U@DiV;urg==bR[T"Q?XI,E>$>'4=^#!5qd0;."^G89>[:Y7?3=PB@:8q=ra#Y3>[755
+rEfJ/s'5S.s'>Y0qcj)(r`]Y5>?b65=BSg2rEKA->5hY.>$G69>$:`+s&fP.=&rC)='5H'$W^8,
+<E)jn:eO<BPQ$gGQ26aFQ2QsIPm`nER$X2.R[T_8S=K8Cs.9(Zr1X%]pS%5Rs.fOgrh]Ukp8@qh
+s/?!sri,msql0Ooql0Oor2UO3T9=_PG]n1NEe0p1Fa/A*=KcU[rbqdTqJlLTrH%jXrH8*_qfi$a
+s*=Ngs*OcnrdFfq!.Xuus+(0%re"s=Knb>;LkpnEMMmFPNK0']OcklkPa.Q$R$jD4S=Q7DTV8*T
+UnsueWN*##Xfen4ZEppH\%&u[]Y2%o_8=+/`Q-'AbKS5Vd*^:jeCN7(g"P3:h;@/KioB+]k2tml
+l0@U$mI'H3nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s+13ds*t~>
+JcC<$JcG]Kli-bZqu$3crV?NirJgf8s7lTfrq?<`s7H?_rUL$[nF6GG7.0I0m-O'(lKRQskN:pg
+jQ#:[iS`YOhVI#CgY1?5f@SR&eC2gmd*L"^bfe/NaN)<>`5BI.^q[Us]Xtbc\@8oS['TUWrd4iV
+E+WNbr`^@I>$4s0JUW#nH?=4JD/!WpA7KIm@<e/fCN+<;qKi-fp3Q^brd=9br-n*_pjW0io7$Oa
+s*Xfm%X`24CMIKn@:<PN>[(E9r`B5-?XN_=raGh:!+bt+r)3TKrIYB-JUr?%I=-Hjrd4Wj#C1W@
+G^"@SFoHI`EcD"rs(r$XD/F'(D/*g"r+H+DB`2T8BFf''G_BsKD/s`.@pi\Q@:T4E$"IFS@q91^
+AS#NQAcQE@AcZOXrau1@rac+@Ac6-=@K9p;@fKgJ?Z'UeD2*C[F`qtRG\^V^:f73i#>nAs;,U:j
+;uBMn;ta)j;c6Nm<;ohl;Z9Pi;Z9Mn;Z0Jk:]ODm;#=,i:]O;i;#O8h;#aB#:eje`;,C%b:eje^
+r_WVjrD!_r:.e,M8Ou67IXZeEIf+]pJGauuK)^JtK_:'!LAlu)LAco-L]E5/M#N8&MYW,.MY;u+
+N:i2&NqeYLNJDh#Df0B+BkM@9D/3m*J5(`8DZ4SRE;FSRErC(VFT$@]G5HL_GlN'eHN/?lI/\Qo
+IK4lsJH(0#K)UC;KS>/8LPUbCM2I4MN/`jYOHG]hPE_>uQ^F20S"-%@T:hmPUSO`aVl?\sXKAY0
+Yd1UB[^WcW]"G_j^VRe)`Pom=aihoQcHstee'ut#f\,!5h;-uHi8WeXjlY^hl07L!m-X60n*olH
+ncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$_>f#~>
+JcC<$JcG]Kli-bZqu$3crV?Nir_rkrr_idkrqHEcrUp3_s7?3[!qGdLrpN8CmHs9,lg*j#l0.<m
+k2k[aj5T%Ui8<DIh;$c=g"=p.e^W*tdF$=ecHXSVb/q`F`l5m6_SO%&^:h1k]",>[[^EKKqGmMo
+"=GuW4Zr[(s#CrV2a]hp5<V(h3&riR1c$pI2_I?a852rY;Yj>k<;BJm;?Bcp;Ys>j;?0Sc;#4&\
+;?0Yk<:a&_<;fbq3WCuA2)I'E0eY6[/eKTc.l&h71,1O@1,:XA1c$pNr&b-G4?>Sa8c)!^7R]a8
+6ps??6iTOl6:"",5XIe'5<qLu4Zkhi4?bni4?Y_e3]R+"rAY!?3&ioZ3][-u!BE4=3WD)=4W$@I
+1.4Q#7SccP9hnGZ:/4JX:/+GX:/=[\;#aDl;#aAo:espe;?'E*:esnb;GL%b:/F\[:/+5J68Uki
+r^$`T6pj7)r]L3Ds#pKI4$3C'!^/_2q`XsArB's?qE+X<s#^-@"[>164[)%.497T/r]g?Fq*"L:
+r&t'Dr]L6FqEP*H5skN9r]guY5X.Fr5<_+g4#o;Y0iV-G;u]hs;uKVo;uT`!;c6Lm<W,nj;?Bcr
+<W#nt=8Z1u=8H%e=TV],=8Z1r=8uD"=TDS$=o2>"=oVV$=o);9=]\R!:JOSX9h\;Z:JOSV;EIfp
+DZ4SRE;FSRErC(VFT$@]G5HL_GlN'eHN/?lI/\QoIK4lsJH(0#K)UC;KS>/8LPUbCM2I4MN/`jY
+OHG]hPE_>uQ^F20S"-%@T:hmPUSO`aVl?\sXKAY0Yd1UB[^WcW]"G_j^VRe)`Pom=aihoQcHste
+e'ut#f\,!5h;-uHi8WeXjlY^hl07L!m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$
+_>f#~>
+JcC<$JcG]Km/HhZqu$6dr;-Hhs/l=%rN-%nrq?9_s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg$/ki_*j
+jlGI^io/hRhqd,DgY1B7f@SU(eC2jnd*L"_bfe2OaN2B?`P]R0^q[Xt]Y(hd\[T#U['R+8PQ-dk
+Jng:$BqCfTM1LPABWS84VPToTR$*JdLPLSIP&-T2S9TF6MuJb7O8b76O8P(@Ockq+PkgUBQM6[B
+Pk^ODP5pd=OoLO6OVj.@Nf8gMJq&?"H[0dVEcQ8MH[U6hIslbEILUjYIplep?XI2K@9m<+rNH7(%
+BQV0W2?AcU8+HVTV.qVScP=KrgF1^R$X,(Pa%>nO,s:"s,?u7re:?+qh5$)rIt9))MO?;O/g<dJ
+r4MbCMI["BkqKuC2Rg&DJsH4r,Dg]EccI$EW:(VF8g25FE;MFF)c2?F)l8@D/='.Ci4$(BkV9qA
+nGV)G&E2=RZr>>?X@#B>$>'3>$5'8r*KA.s'#M/?2\(3?XR;MqHs5.#@1S>?!U]@?2e10?2n10>
+6.u7r`oA*s'#D+$!^\=>$4s1=^#&/>QJ&4rE9,(!a8`0r*','#$=r-='/O+r`9,$<W5r#;c-Cd9
+E(1TQ2?gFQ2[$JQ2d-MQi<?UR@9V7S=K5Bs.9(Zr1X%]pS%5R!2KIfrh]Ukp8@qh!i`,sri,msr
+2KUoql0Rpr2]gu';qI\J9cB^EcZ8TP^7CrJ<m7>DZ4SRE;OYSErC(VFT$@]G5HL`GlE!eHN/?lI
+/SHpIXckHJ.$p[JqJ]/KS>/8LPYqdCl4.0N/`mZOHG]hPE_>uQ^F20S"#t?T:hmPUSO``Vl6VqX
+KAY0Yd1UB[C3TU]"G\i^VI_'`5Ta;ai_fOcHjkbe'uq!f@\g2gtgiEi8N\UjQ5OekiqBum-O--n
+*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$_>f#~>
+JcC<$JcG]Km/HhZqu$6dr;-Hhs,Ho7s7cNdr:U*^s7?6\s7$*YrpTmT!:BdP!UK%MkrS%kk2tdd
+j5].Xi8EMKh;$c=g=b*0f%&:!da?FfcHaYWbK7iH`l5p7_SX+'^V.:m]",A\[^NQLZhf+MHmE*!
+BOk+cEbo>rB4b7sIslTgF`_V@CM.9jAT)EdGa<_mE,p-tHN&9aHN&9kI.;X_Idhd\If+WdIenKm
+I/\HrDJa0'B4_'N$XI(E=]nj/=^PND?iFI3@K'a;<)rlrs&0"t;fdWjK.2D'Jq/B!I"$KjH[:$c
+H?a^[GB\4QF`_bJEGof7DJa9-D/F')Ch[WuqIob=qe-a\EcZbmDf0T,A7B"V@UWbT@q9.]A7b^O
+$>4$cB52*pBkqO$p1k%MCMIQtC27QuC2%D]BEr-^An>RcA7Y[Ls'cCE@;TUcC4UVNAlql,rDEhs
+;Gg:h;H*Hj!)rVi!`Mupr`&kqq,7/gqbmDj!)ibmrD3Jlr_WJhs%r_krD<JjqbRGn:esh_;>j;r
+:/=Y^:esn`rD*Ag#>Ic]8k;?:J,FcnJ,XusJcC?%KD1&kL&Zo,L\cc)L]3)0L]3,.M=c]#M>iD,
+Mu/J+NV&8)Nt[M/H#[b=C2.EqF*VS9CiFfXKl6m.rc%aSrc7sYqfMdZrc\0_s*4NgrHeKjs*Xcn
+!e,WKrdYB-JqAW-KS5&6L51TaM/8'-N/WaWO-#KeP*;,qQC!u,R[]e;StD[LU8+N\VPgAmWiW>*
+YctF>['d?P\[oGd^;%J#_SjF5aN;TJc-FY^dF6Uqf%8R.g>(N@hr*JQj5f=akNM0qlg4!*mdKW6
+nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#s2"_c~>
+JcC<$JcG]Km/HhZqu$6dr;-Hhs&Akns7cNdr:U*^s7?6\s7$*YrpTmT!:BdP!UK%MkrS%kk2tdd
+j5].Xi8EMKh;$c=g=b*0f%&:!da?FfcHaYWbK7iH`l5p7_SX+'^V.:m]",A\[^NQLZhd]%<$We@
+/hA_:2D['>0JPLS5X%Cq4?GM_2Dd9H1H7?E5Xe4=;GgHi;uTbh;Z]io;Z'Dl;ZBVc;#=,];ZB\k
+<:a&`<;of*3'&rT2Dd3H0eb:7/hd2U%Pogp0ekF>1GUaB1c$pNqE+j@4@Da>8,l-[7fl+K7fGgT
+6iTRS5lX1X5XIb%5<qLu4Zr^,r&js>"#r>&3Vtc@2`NcW3]]8]r\t6F00MH_5;G_u;,@0d#>\#f
+:Jae];#X2t9i+Y]:f0q`:/Y"dr_WVj#>e2k9hnGZ;#F,h:(9on:Jjqa;,U7h:f(%drD=/':JFSZ
+7mo^"5XRk'5!1qj4oRYE48q>B4oRYC4o[YB48qA=48h;A49%DK4$5Vh5<V.n4oIM@5Q*eG4TI\D
+4TR`2r]UBH5!Sp-!'^?ErBLNN5X7P"6N'1Q5X.Lu5lEnP5!:th3]],Sp/:rjr_reos&8kq!`Mup
+r)<Ypp/1rj<)riss&],#r)`_smTBTn=',<%qH*Yur)s&%qcWi!r)s&%r)rbts&TD%:ejbZ9hbO\
+#>\&f9Mn_eDZ4SRE;OYSErC(VFT$@]G5HL`GlE!eHN/?lI/SHpIXckHJ.$p[JqJ]/KS>/8LPYqd
+Cl4.0N/`mZOHG]hPE_>uQ^F20S"#t?T:hmPUSO``Vl6VqXKAY0Yd1UB[C3TU]"G\i^VI_'`5Ta;
+ai_fOcHjkbe'uq!f@\g2gtgiEi8N\UjQ5OekiqBum-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6Kk
+rVcBfJcC<$_>f#~>
+JcC<$JcGcMli-bZqu$3crVHKg"8JsuX8]4!WrVkkp&F[aoD\=\nc/+XmfDkDrp2o9lK[Wuki_*j
+jlGI^io/hRhqm2FgY1B7f[n^)eC;podEp1ac-+;QaN2E@`PfX1_8!b!]Y(ke\[])V[Bm3Fqih&C
+,_p/pJ;0_dOc5$QM2Q&JUo'rZSXY\$MMR(@Kop/^c('$*Jr9Pe!06r;!0Hi6qiCi@PP^U@Q2?mB
+Q2HmAQ2d'LPEPj+!0[8Bs,d5B!0[,>'pO`>Nf8jMKReQ"H['^UEcZYVI!U2=IL:RTJUi<%@:<VP
+?iFF8?ZE<Qri[TMXfSV'Vl$;bU8+HVTqJ'NT:MI>R[]b6R$a2)Q'@GoOH5B]repl8M>;o%KhS#&
+U:-;?NH&iOChd["C2Ig*Df0N5EcQ,?F)lAEGBS1TG^4^cI"-ZtJ:E&tIXccnI=6HjI!L!]GBS.R
+GBe@SFa%tOF`qeIFE2L&DZO`lrbMOK$ta3cIW1:PAmSbI>$Cl-!Ere,?N+71>6.u7r*BJ4?t!I>
+?iF@9?!LW?>[1S5?N4=2>lIt+>l7h+>5DG,=]eg0>$Lu2!F&b+=Tqu5>?Y04r*','#$=r-<``@)
+r`9P0<E)pt<)?If9L>&1Q2?gFQ2[$JQ2d-MQi<?UR@9V7S=K5Bs.9+[!207`r1NeXoV25Yrh]Uk
+p8@heri,msri,aoql0Rpr2]as&u_CZH[0gXEcQD^JU2B^L7,!DrbqdTr,M[Urc@sYrH8*_r-/-b
+s*=Ngs*OcnrI"`rIt.HJ$\<n]K7ei1Knb>;M#N6DMMmFPNK9-^OcklkPa.Q$R$a>3S"6.BTV8'S
+UnsrdW2ZetXfek3Z*UdE[^WfX]=bhl^VRe)`Q#s>b0/#RcHstee'ut#f\,!5h;-rGi8WeWjlY^g
+l07L!m-O0/n*oi:o()DErq-?dp\4[^s7u]kr;6Hjrr)KgJcC<$_#Jo~>
+JcC<$JcGcMli-bZqu$3crVHKg!VhZON;e_8pAFU`o`+O^o)J7[nG_kWmd:#?5jR_#l07Epk2tdd
+j5].Xi8EMLh;-i>g=b-1f%&:"da?IhcHa\XbK@oIa2Q$9_SX.(^V7@n]=GJ^[^NTMZa0CT,\'hg
+?Xn;$CM@<mAnY7rH[:![FE257B4YXaA8G;+Q@*IdEd%2'!.4?ard4WlnpUCan9t(\rI+9dqgJHk
+&8l<$CM@Ho@q&hP?<gZ:=BPQ0!FB.3@1$IR@q&tZ<)lpt<;f_r?%i0/!.t0#!IoLrIK+X)H@'s`
+H$X^ZGBS.PFEM\Frbi3_D/F*+D/=$(Bkh?rph9S<(NX_GKl1gNA7T.X@U`hXA7]=aAS,ReB`;`G
+CAr#VCM[g(D/XB6F)uC"E=?f)E,fi7D/=!(D/3qbCaa%7C2@[$C2.NuC2%BqAnGRbA7K+X@Ua+_
+DM(nc;Gg=i;,U7g;GpHj;?0Yh;?Bcp;uTbq;uBMo;c<Qkqbm;g!E)en;#aDm;#=,i;#a>i;#X>h
+;#aAp:ejharD<Mhs%`_n:Jaja:&n#f8cqXT6ot<rr."]rrIP!#s+C'!oS*="reL?)reLN0s+gT0
+rJC0(pkf!-pl#!-oo8R'ooB`EL3ITSCMIQrC34<0Bkqd=LkYhHrc%dTrGqmYqfMdZrc\3`rcnHg
+r-JBis*Xcn!e,WKrdYB-JqAW-KS5&6L51TaM._^(N/WaWO-#KeP*;,qQC!u+R[]e;St;UKTqeE[
+VPgAlWiN8)YHY:<ZaI6N\[f>b]t_=u_Sa@4a2lEHbg"G[dF-Lnf%8R-g=tH>hVd>Oj5]7`k3)!n
+lKdg'mdKW6nF?)?oCW%T!quB_rqQNhs8)ZjrVZZno_sFAJcEOcJ,~>
+JcC<$JcGcMli-bZqu$3crVHKg!VfUi;ZBYqpAFU`o`+O^o)J7[nG_kWmd:#?5jR_#l07Epk2tdd
+j5].Xi8EMLh;-i>g=b-1f%&:"da?IhcHa\XbK@oIa2Q$9_SX.(^V7@n]=GJ^[^NTMZa0C,(agje
+.4mM;1,:L;1,:aR5!;%k4#o5Y2)P:f#WOJ+77^0N;,[-e!*&Mf!)i_lr_`_no2#Ebqbcr_!)r\m
+o2GB_"Zn\'2DmDl1]oHd0/!2Tr\FL."u7ni1GUdDr\OO:r&b'C4@r*C7fZ*Z7fc%JrC$ZQs$R8^
+5XIh(5sdh%5=%Our]L]Q4Zkhi4$,Ja3B9&[3V>??3BAo[4[1\m85N#T9`@`e:JLg`"\VTc:ejdb
+:]F/u:JOY\:JO\^;,U4f;>sDk;>j>k:DHW%:/+P\:f("d;G^4f:Jjqc:/atdr_j>*;,L.d;,Bt_
+:I[Z,5<V..4o[\I4?GY'4T.JA4TIVB48h;<48h;A3se#24$5\k4ZttmrB('DrBL6Es#g?Gr&ssA
+!^/_3q`XsCr]U9H#=1U>5X7P!6N'1N5X565s$$iU5!;(j4?GSa2(SK$!*&qrr_ibprDWhs;H!El
+!)rSh!`N&ur)Nf!qcNbt!E`M&=RK;m=BGB%q,[Pur)s#$qcWo#qH3f#qcWSq&m&(1:ej_Y91quR
+:/FY[:/Y"hrbqdTr,M[Urc@sYrH8*_r-/-bs*=Ngs*OcnrI"`rIt.HJ$\<n]K7ei1Knb>;M#N6D
+MMmFPNK9-^OcklkPa.Q$R$a>3S"6.BTV8'SUnsrdW2ZetXfek3Z*UdE[^WfX]=bhl^VRe)`Q#s>
+b0/#RcHstee'ut#f\,!5h;-rGi8WeWjlY^gl07L!m-O0/n*oi:o()DErq-?dp\4[^s7u]kr;6Hj
+rr)KgJcC<$_#Jo~>
+JcC<$JcGcMm/Hk[qu$3crVHKgrqHJorN,msrq6<`s7?3[!qGdLrpN>EmHs9,lg*j#l0.<nk2tdd
+j5].Xi8<DIh;$c=g"=p.f$r3uda?FfcHXSVb/q`F`l5m6_SO%&^:h1k]",>[[^EKKZEX7js-!Ct
+,&Dg_TUh:)KSteHAuqr.V4O-COH><VLPCPGPdJc-G^=surJgi;rK$u=o8ig2!g/Y0r07#Br0I)B
+rKR&A!gJn3r/guBqiLl?rfI2Dq2l8RP)bK\Lk^S3J:)`fG'%\FJ,F^-J:2lrItE6%@UWYQ?XI2L
+?X^,8YQ(a)X<+@=V59r]UnaWWTV8!LSsu1<R[TV2Q^<u&P`_&iO8Y%>N/NJjL&d#+LAurLSrA`+
+PD>3=E,99(Bk_I#Ci4*0EH?2DG'8+YJ;&]1rIt9)s+C<&s+(3&Jc(&tIf4cqJ-CFQIt3'#rdY*%
+J9lP?GQi;9GBJ(PrH&TiEH#o;CiF3(CM%m4NOE"orE0/)>l7q->m">9>[@55!aoGEqHs5.!+#S/
+!aT&:rE]S3>[:V6>Q%h(>7Fb?>[(E;>?b64=]np4r`fJ.>5_S,>$G68=o2D&=VY%?<`W:'=BJX+
+<`N+!<)c[j:J=6Cqiq)FrfmGJs-EVNs-itWs.&_P!1s%Z!20:aqk3\WoV25Yrh]Ukp87qiVuEXo
+WW&ptWVNRkWW0!rX88n6X/DA@I!BjYF`Dl&I!Ba[Pan_VDf9T6qf2UUrc@sYrcS3`qfi$as*=Ng
+s*OcnrdFfqs*t#u!J,k%K5uX!Knb>;Ll$tGMi<USNfT6_OcklkPa.Q$R$a>3S"6.BTV8'SUnjlc
+W2ZetXf\e2Z*L^C[^WcW]"G_j^VI_(`5Td<ai_fOcHjkbe'uq!f@\g2gtgiEi8N\UjQ5Oekiq?t
+m-O--n*fc9o()DDo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s1nYb~>
+JcC<$JcGcMm/Hk[qu$3crVHKgrqQALs,6l6rq6<`s7?3[!qGdLrpN>EmHs9,lg*j#l0.<nk2tdd
+j5].Xi8<DIh;$c=g"=p.f$r3uda?FfcHXSVb/q`F`l5m6_SO%&^:h1k]",>[[^EKKZEX1R(h$cZ
+?t"8$D.mBkBPCLuI=$9_F)c&6B4h-S#]+C6R!iagF*7D,!."Nhs*=3^rd4ZmnU:=an9t(\r-e3d
+qL'!(E,KK-C1_$d?sm>J>?Y-1=CM,8$"@:N@U`kXA5uV-<W>u";H/:%rIb-%rdk&s#(CrHI!U-d
+rcnosG'A+PF`_bHEGf]5qec@LrG):FqIh!nDf^AFDfoZ%@:NbV@qB1^AS,RgBPM<uD/=-0G'.qN
+rH8!Z"*J^-F8BqTEW'hVEW'h`EH#l:EGfZ2ChmneD#S5MBbG/pBP;$kAnGR_@q&k]@;LWp;Z0Jm
+;?0Ya;?Bcp;uTbq;u'>j;>jAn;,[?i"&_uo;>j;p;,U4e;,[<h!`2ZgrD<Gis%its:f("d:eska
+rD3Sl:/=[b;#a>i:'aWj9hS&L845Z=J,XusJcC?%KD1&kK`Hl+L\cc)L]<21L]3,.M=c]#M>iD-
+Mu&D)NV&8'Nu*h7Jou!KCi!g!Dh)_CBPi*IKnXG`E,b\orc8!ZqfMg[rc\0_rcnHgr-JBis*Xfo
+s*jutrdY$#K)UCCKS>,7L51SAM2I4MN/`jYO-#KeP*;,qQC!u+R[]e;St;UKTqeEZVPgAlWiN8(
+YHY:;Za@0M\@K2`]tV7s_Sa=2a2lBFbK\>Yd*^=le^i@)g=k?<hV[8MioB+]k3(sml0I^&mI'H3
+nF?)?oCMVRo`Fj]p\ssfq>^<hqu6NlrUg)?s+13cs*t~>
+JcC<$JcGcMm/Hk[qu$3crVHKgrqQ=f"&i)r;uZIio`+O]ncJ@NnG_lGmd9E.m-F!&l07EpkN:pg
+jQ#:[iS`VMh;-l@g=b-1f@JI$e'cXjcd'eZbK@rJa2Z*:_ns7*^V7Co]=PP_\$i]OZa-h3<?Xh"
+6n0]H2DR!=0ekFA5sILo4?>G\2`3HJ1GUpG5t"7?r_`Dgs&/Dds&&hoqGI;jpe^Z]o2>Teq,Hub
+pf%;U3B7!r&N)@#0ek@8/M/M*1,1O>0ekH^1BTKj1Hte$rB(0C4@i'C8,l*_7n,s:7K#US6iKIX
+5sRb'5sdm:564#6rB:*A#<b.13]]8^3;bf53#4>64[(Vj85N)U9MSAY:/"AX;GKt`:&[lp:Jjqd
+;Gg=i;,L0e:'FEi;,L.dr_`\ls%iYk!)`\k!)`Yjs%iYks&&\j*DoX2;,C%d;c-Fk;,U:j9i+V\
+:IRT+5Wq:p4Zbb(49.PD55[PD4Sq5>4Sh/<4T7DK4?GYg5<_4o5!Am-!'U9FrBC6E!'^<Ds#pEI
+rB:3Gq`XsCs#gNL5<qM#5Q*hI6N'1^5X.M!5<qFt5!D1p4?>M`1bef*!*&qrr_ibprDWkt;GpHl
+;ufkj;?9]qqc3\ur)ihtqH3/gq,mGor)ru#qcWr$nlbTg(Kjg<;GU%^:.n5T:esk]:/=hf;f?Sn
+E;OYSErL.WFT-F^G5HL_GlN'eHN/?lI/\QoIfFosJ,t4Qre#6EKnY89LPUeDMMmFPNK0'\OHG]h
+PE_>uQ^F//S"#t?StMdNUSO]_Vl6SpX0&M-Yd(L?['mHR\[oGe^;%J#_o0O7aN;TJc-FY^dF6Uq
+f%8R.g>(N@hr*JQj5f=akNM0plg4!*mdKW6nac8BoCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcEOc
+J,~>
+JcC<$Jc>`Mm/Hk[qu$3crVHKgr:p8mql9^uri6+moCMqOs7$*YrpTmT!:BdP!UK%Mkrn7nk2tdd
+j5].Xi8EMLh;$c=g=b-1f%&:!da?IgcHaYWbK7iH`l5p7_SX+'^V.:l]",>[[^EKKZE^WsrfdAF
+rG2FL*h&@TKo:eFB<A,1Un='BP)bBVLP:GGP.S<$H$Y(!qi(Z;O,s7"nrN^1!KiQBPkp[CQM6[C
+PkUICPQ?u2rK7,Cr/q#@s,m>Er/hJUPE1fcN/3.>IXlckG'*_)#(CuJI=6KkrI5!%J:D!:@K'U:
+?t!B$Z2Cg)XTY]'W2?BhU]7%fTGsMpSsu4>R[TV2Q^3l$PEM#hO,]-ZN/igNLP>SZ+If('[tKd"
+E,BE)Ci"!*Df0N6EHHJRJVf2;LPLV<L5,\]s+UQ0LAll3KS+o/Jq8N)rI=ltrdOirq1/Krs+(*"
+s*t*#qgeZk(3k%HGB@qLFE2MGE--5AFDbi0P]CZPr`K8*>Pqh,>m+D:?!L\5?34JB@/=70?3":.
+>QA(/?3":1>lIt+>l.b*=pnS>>?kB9=]nj0>$Co1!aAi3r`KD.>?kB8=o2D&=VFn<<``C)=BAR)
+<E)st;c-@f91SrFrK[DIs-<VM$(%$IR$jD4S"-#BSHGCQSt>eNr1X%]p7_/R!2KFerh]UkoV_\e
+ri,ms!3,anr2K[qr2]Uo'<7stJUD`dF`V\b\U/REH^gh2YPrM<EW1"XF8L(YFoHR^GQ)jeH2N!g
+HiJKmIK+`rJ,OluJV*lREeK.#L5(J>M2@+JN/WaVO,oBbP*2#nQ'Rc(R$sM6S=Z=ETqS3VUo(&f
+WN*##Xfen4ZEppH[^`lZ]=bkm^qmn+`Q$!?b0/#ScHstee'ut#f\,!5h;-rGi8WeWjlY^gl07L!
+m-O--n*fc9o()DErq6<b!;HHes7u]kr;6KkrVcBfJcC<$_#Jo~>
+JcC<$Jc>`Mm/Hk[qu$3crVHKgr:p2Ks,6o7s,6o7!qc*UrUU!Y!:^!Vs6]mSrp0[OlMg$2ki_*j
+jlGI^io/hRhqm2EgY1B7f[n^)eC2jndEg+`bfe2OaN2B?`P]R0^q[Xt]Xtbc\@8oS['R'CY^H@s
+ra5Y4,'.X:@V9:d<e>aHH?aIMDJWruARf7fCl+%!Ci+38H[C'brd"NirH[s[s*O`mnpUFbn9t%[
+rI+9dr-]#pDes<-C1^sb?t!AI>5_P*@:3GNra5t?@:E\UA7S[;<W>u";Jq2ArIb*$s+(&r!do?B
+rd4Zjs*4Qf!-\<`s)J'V")i'oD#S;OD#J)LBPIHZs(NBbF*W7iDKU/8@prhV@qB7`AnGajCMRd,
+G^012rc\9`!-\<`r,hs]s)\6^r,VgYr,M^Trc.jT&ohr5EcQ5AEcH)<Ec#Z0DJX*)rbMLJ$u'Be
+BkV0j@ps^q@>=_X!E)kb;?Bcp;Z9Yp;u'>j;>jDm;#jMn;#jMm;>j;m;G^3f;$9]m:esmd;#O5k
+;Z'Ak;%QQ":Jjqb:Jak_:JXea:esmc:'aWj9hIuK845]@J,b&tJcC?$KD:,nK`d!^L5,Y^qM,!)
+s+gZ1rJ:H0o8<="regN0q2Fs*oT&R)s,[nSMh,neDJO!$Bm>VSChmp;KS>-ZE;OYSErL.WFT-F^
+G5QR`GlN'eHN/?lI/\QoIK4lrJ,t4Qre#6EKnY89LPUeDMMmFPNK0'\OHG]hPE_>uQ^F//S"#q>
+StD^MU84T^Vl-MoX/rG+YctF>['mEQ\[oDc^;%J"_SjF5aN2NIbg+M\dF-Lnf%8R-g=tH>hVd>O
+j5]7`k3)!nlKdg'mI'H3nF?)?oCW%Ts7QHerV6Egs8)Zjrqu`no_sFAJcEOcJ,~>
+JcC<$Jc>`Mm/Hk[qu$3crVHKgr:p.e!`MuqrDWjjoCMqOs7$*YrpTmT!:BdP!UK%Mkrn7nk2tdd
+j5].Xi8EMLh;$c=g=b-1f%&:!da?IgcHaYWbK7iH`l5p7_SX+'^V.:l]",>[[^EKKZE^W5r)Fn.
+779R67Q3.[0/5.91dXAi4$>Vc3&`]P1G^dH2Ea>q:B",j<;KPl;Xm]\;?0Sh;#*rg;Z9Pb;?0Yk
+<:a&c;uf#Z3=n,-2)R3H0ek=6/1iA(0etN`1&j$51,C^D1Gf"nr]L3D"$&_?8cD3`8Ou?A77I/C
+!CK3Q6ioY>6N'1]5X.J!5<V+k4$5Yf4?Yeg48q8@3;tu<3<(uQ3&<``4[hn9;,'_[9heAW:JFMW
+:&[lf;#4&k;cH]n;?B]l:]*rh:Jk!f:]XEir(m>irD3Jkr_WSi"]/&n:f($d:]sQj:JXgd;%c]'
+:fC:i;GpFj;bp1`:ddZ74oRPA49.PD55dYE4T7DC3]m='q`F^<q`=sD5<_4n55dSD4oIVD55@AA
+4odkF55[SD55m\I5<qJ"r]gQO5=.^862j+N5<qI44pO;83BB2]2)"c(s&/kqr)<bs;GpHm<<#nl
+;?Kco<)riss&],#r)`_sm906eqH!Z!rE9&#qcNo$nQGKfs'#P-=&])o!)*;b#uFJp:.n5Y<Duiq
+E;OYSErL.WFT-F^G5QR`GlN'eHN/?lI/\QoIK4lrJ,t4Qre#6EKnY89LPUeDMMmFPNK0'\OHG]h
+PE_>uQ^F//S"#q>StD^MU84T^Vl-MoX/rG+YctF>['mEQ\[oDc^;%J"_SjF5aN2NIbg+M\dF-Ln
+f%8R-g=tH>hVd>Oj5]7`k3)!nlKdg'mI'H3nF?)?oCW%Ts7QHerV6Egs8)Zjrqu`no_sFAJcEOc
+J,~>
+JcC<$JcG*9qYg<hp\XpcrV??c!V`\mWrT6uX8VVhnGr(Xn,MeUmJcHBlg!d"l0.<mk2k[aj5T%U
+i8<DIh;$c=g"=p.e^W*tdF$=dcHXSVb/q`F`l5m5_SO"%^:_+i\[f2X[^<BHZ*:EpPEV/mrG)FM
+C]8&fLOt>?B<8#,US40FPDtKWLkUPFPG5C`IX-L"q2P62o8ig2!g/Y0r07#Br0I)Brfm,A!gJn3
+r/guBqiLl?rfI2DrK/:jP`LlcN/*+>I=QZiGB@nIFF8LaIXcfpI=?WqJq/A[@Uf=Ds'Pn7ZEaA3
+!3Z='"0&5tVu3=iTbO/lT:MRCS=H%9R$j;,Pa%AoOHGV'NW4q_MMHq?L4t>9U6hF7M3DpuDJO!)
+D/=02E-$2MIu'#@M2I1IM>i;2L]3&,L&Ql-LAlo+KDpK&Jc:3!If=irJH(3#J-(:PJc:2tJbsur
+JcC6>JU;ZeH?j^YF*2MGF`VSDGBe1GDO>K_ZWUL<rEfJ/r`oJ/r*BG3?srh<ra#S1qHX#+!+#S/
+r`f;*r*02)$s["@>[(B7=]eg0>$Lu2!F&b+=oMV+>$:`+s&fP.<`W:(='5H'r`'5';c6Ih9hI=.
+rK[DIs-<VM$(%$IR$jD4S"-#BSHGCQSt>eNr1X%]p7_2Ss.fIe!i;]hrhf=cri#gqoW%hgri5ms
+p8f".TTFbPH$=CPG*.W+G'JM.XK8V/E;X_TErL.WFT-F^G5QR`GlN'fHN/?lI/SKnIK4lsJH(0#
+K)UB'KSBD[BnqM$M2I4MN/`jYO-#KeP*;,qQC!u+R@B\9SXuIHTq\?YV5L5jWiE/&Y-5(7Za7'J
+\%0&]]Y2(p_8=+/`Q-'AbKJ/UcdC.heCE.%f\5'7h;7&IiSrnYjlYail07L"m-X60n*olHncA@S
+rq-?dp\4[^s7u]kr;6KkrVcBfJcC<$^]/f~>
+JcC<$JcG*9qYg<hp\XpcrV??c!;HJOs,6o7s,6f4rUU!Y!:^!Vs6]mSrp32AlK[Wuki_*jjlGI^
+io/hRhqm2FgtUQ9f[na*eC;spdEp1ac-4ARaiMNB`PfX1_8!b!]Y(hd\[T#U['R'CYciG&I=-EK
+ra-mX?X6oBA79(_=+PdGH?aOPDej$!ARf7eD0^hdCi"-8H[C)3H1Q@]HiJK`IJeQaIJ83gIIr!e
+I2$[>Ci+!'An5@Y@:!2D>$"g.?X[@A@K0a7@fBm<<;ont<<#ku;MKo(KDgB&J:@KG!IfFoHiJBk
+GSkXLG'8"MFE)5;E,TW3Ci+$*D/3m%C2.J]BGYi7H#@VJAS#@]A7T7_AnPglCMRj3G^043rcn?b
+!-\0\r,hp\s)e9^rGhp[ErC"WE;aeSE;stXF8^.ZEW:(`EcH)>EGk_ls(q^Nrb;sWB5)'pBOt\'
+A7:-g;,U?[;Z9Yp;u'>i;>sJn;#jMn;#jMm;>j;u;G^1e;,U7g:f1*h:B45h;#jMn:]jKi:f73f
+$;aSr:Jak_:JXear_NJf!`)Qcr^d;b7m\hXJ:RTLs+:6&pk8?p",)A_LAco)LAco-L]E5/M#N8&
+MYN&-MYW2+N:`,/NrP+7Nq&/GOH#*HF)Gl2C1qC/EGfQ,DL[LrKnXLDEW1"XF8L(YFoHR^GQ)je
+H2W'hHiJKlIK+`rJ,XuuJH1<$K)pXZre>-BLl$tGMi<USNfT6_OcklkPa.Q$R$a;2S"-%@T:hmP
+UnjibVl?\rXKAY/Yd(O@[C3QT\\#Mf^V@V%_o9U8aN;WKc-FY_dF6Uqf%8R.g>(N@hr*JQj5f=a
+kNM0plKmm)mdKW6nc&([oCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcELbJ,~>
+JcC<$JcG*9qYg<hp\XpcrV??c!;H@g!)r_nrUU!Y!:^!Vs6]mSrp3#<lK[Wuki_*jjlGI^io/hR
+hqm2FgtUQ9f[na*eC;spdEp1ac-4ARaiMNB`PfX1_8!b!]Y(hd\[T#U['R'CYch%)<<YcZ6psL5
+r^7\Y/2&b95s@Io4ZbYa2`<HK1c%-N3C-84;,L6j<;TVk;Y!c\;?0Sh;#4&h;ZBVc;ZB\k<:j,e
+<#IbX3B/rU2Dm9H0ek=7/M/M*0etL=1,:X@r\FU41,Jnmr]C6F4?<C4r^R&]7n6,L7K,^T6iKLR
+5la7N62a(K5Q<nH4:OG94$,Pe4$,Ga3]T2[r]1BH1d4)Y7S-EO9ht[^#>\/k9i"P[;#XDf;ZBYr
+<)`]m%oH/!:/=V[:Janc:esk`;#=&_;#X8g;>X2h;?'Jm:DZi':esqb;c6Lj:f1%d;c6Rl;,1%X
+69kH2s#^9Er]^9Ds#g9Bs#U-Aq`F^<q`>!E5!M1n5!Am-!'U6ErBC6E!'^<D!BrdJ4p!l25PmSD
+55m\P5!V=u5sIV#5=%X75nQ@H5X.Lu5!M4q4ZYYb3]Jo<r)<Vns&8hp"&i)q;uTbr;ts5m;,^Fo
+r)Wi!r)ikuqH3,frE'&$r`K&!s&f5&r)i5enQHN/=BJHs:/+GX9MJ>Y;,0eZ;Z0MoE;X_TErL.W
+FT-F^G5QR`GlN'fHN/?lI/SKnIK4lsJH(0#K)UB'KSBD[BnqM$M2I4MN/`jYO-#KeP*;,qQC!u+
+R@B\9SXuIHTq\?YV5L5jWiE/&Y-5(7Za7'J\%0&]]Y2(p_8=+/`Q-'AbKJ/UcdC.heCE.%f\5'7
+h;7&IiSrnYjlYail07L"m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$^]/f~>
+JcC<$K)b3:qYg<hp\XpcrV??crqH)ds/c7&s7--YrpNJImHs9,lg*j#l0.?ok2tddj5].Xi8EMK
+h;$c=g=b*0f%&:!da?FfcHXSVb/q`F`l5m6_SO%&^:h1k\[f5Y[^EHJZ*:I8P*>m.rbEZnCMR["
+B4bh6BW\2.US4-EP`CZXLk^VHPDlT/IX$BsN;8J/Nq&20O91Q-PPg[@Q2HsCQ2[$AQ2d'LPEPm,
+s-!;B!0I2Bs,n7^S!T;"O,SsOKnY),I=-6[F`h_QH[C3kI/\WrJ,Op*@:E\R?sd;LEjDqJYPtX8
+XJr1sVPBr^UnaWWTV.pJSc5,ZRf8[+Q^*buP)tcfNf8sWN/WUKLP:JJO.Eb9Q#gt_CM[m*DK'T;
+GC5+%M2@+IMi7Okre^Z2!/LN-s+LK.M#N2.L(AriK7\`-JUr?%IsuirJ:IQKrdk*"rdk*"qgnWp
+rIFs!qgnd!!df0;rc\?brcAQlF)cAGFDblZEGSlcra,P/s'5S0qd'>2@:8q=ra#S1r`fP0>[1S6
+?34D;>l@n*>l@n+>5VV)=peD7=]np4>?kE;>5_S,>$G37=o2D&=TV]+<rQ/#=T2D%<W5r$;c-Ce
+90`E@s-3PKs-<tXR$j>0R[]e:SFiBPT),)WU&:SXU%P/[U\ghgV50seVY$ecW;`dgWr8prWr&jh
+X;%S*Ndl>!G'%bSUj[Q4G_D]lXfnr+EW1"YF8L(YFoHR^GQ2peH2W'hHiJKlIK+`rJ,XuuJH1<$
+K)pXZre>NMLl$tGMi<USNfT6_OcklkPa.Q$R$a;2S"-%@T:hmPUSO``Vl6VqXKAY/Yd(O@[C3QS
+\[oGe^;%J#_SjF5aN2NIbg+M\dF-Oof%8R-g=tH>hVd>Oj5]4_k3(smlKdg'mI'H3nF?)?oCV\J
+p%J+RrV6Egs8)Zjrqu`no_sFAJcELbJ,~>
+JcC<$K)b3:qYg<hp\XpcrV??crqHGOs,6o7s,6i5rJU^Gs7$$V9()*6m-O'(lKRQski_*jjlGI^
+io/hRhqd,DgY1B7f@SU(eC2jnd*L"^bfe/NaN)<>`5BI.^q[Us]Xt_b\@/iRZa6p@Yc`A%rd=]P
+!aoAAr*:.O=+YjHH?aRRDej#uAn>LiD/OiKCMe*7r-J$]nTt4^!.=<br-n3bp3usgo6q7!FDu,6
+Chm]rA7K%U?s[)Ar`K,,!F]C8A,g$<A-$1>r`/tts&/u+L4oMXrdt0$!.Olp!IK7nHiJBkGlN!f
+FpW85F)c,9E,BK1rbVUO%r5oqCMINrDfBuVEI2;.@f0a?B4u!pDfto$rce<cr-&-aq/uXXr,r$]
+!-A*Z!crC&rc.sWr,M[S!HE/YF8KtXF8g1\EH;%u!-8'Y!cDjlrbVRK$u'HkB5)'nAn-:!@8ZGj
+!`Muqr`&kqqGR;ir)*Sn;H!?grD<Mks%j&";Gg:f:f1%b:Jgpcr_O2&:f("c:JXea:esna:/4S\
+;>sAi:B+)q9hn8P8Ou3.JGk'!K)UDtK_0uuLAlu)LAcl/LkgcaM#N8&MYN&-MY`8+N:`)0NrG%5
+Nq&20O;*\0HuNt>C2.I%Jo5F>CN4l\K8#$WEW1"YF8L(YFoHR^GQ2peH2W'hHiJKlIK+`rJ,Xuu
+JH1<$K)pXZre>NMLl$tGMi<USNfT6_OcklkPa.Q$R$a;2S"-%@T:hmPUSO``Vl6VqXKAY/Yd(O@
+[C3QS\[oGe^;%J#_SjF5aN2NIbg+M\dF-Oof%8R-g=tH>hVd>Oj5]4_k3(smlKdg'mI'H3nF?)?
+oCV\Jp%J+RrV6Egs8)Zjrqu`no_sFAJcELbJ,~>
+JcC<$K)b3:qYg<hp\XpcrV??crqH=g!)rborDimfs7$$V8ac!5m-O'(lKRQski_*jjlGI^io/hR
+hqd,DgY1B7f@SU(eC2jnd*L"^bfe/NaN)<>`5BI.^q[Us]Xt_b\@/iRZa6p@Yc^t(<<P`Y6q0WB
+6l@a;5sRXt5!(bb3&NNL1Gh*O2EsZ*:f1%frDWhs<)iiqqbm5g!)i_npJV#gpe^far_`_no25Qe
+q,Hras&9Xo4#f5\2`3KM1Ggj@0eY+1/1iXV0`X!*1BB6er]U3B!BWID8cM<\8H20[7fGjU6i]UR
+6j#bA6:1Z;!C/mK5QsA94Zbbgr]:-C3rM,K3]T2[3]0&a5"A+>:&[id9a49e9MS>[;>X;m;ta)k
+;cH^pqbd_t:esk^:/=\`;#F)h:B"#i:/CX]r_EMjr)*>fr_W_n:J^sdrD*Sn:Jaqf;uTW,;c6Fh
+;,gFi:/XDG4$,Pf4[)(.4o[YD49%>A48qA>48_5?3s[l/4?Ynl4[)(.49.SD5Q*eG4TI\D4U4/8
+5<_7o5!Sp-s$$HG$9g^>5s[_#5X.M#rBUZR5<qFu5<hF34p=#/4#f)Ir_rhps&8hp"&i)q;uTbr
+;tj/k;cHcp<rZ8!=Su7s=RB8i=9)G%=Sl2"=T2J#=R'&Z>5h_/=&r0n:B!rr9MSG\:JOPW;c$=i
+;uCY7ErU4XFT-F^G5QRaGlE!eHN/?lI/SKnIK4lsJH(0#K)UB'KSBD[FGG[/M2I4MN/`jYO-#Ke
+P*;,qQC!u+R@B\9SXuIHTq\<XV5C/hWiE/&Y-5(7Za7'J\%&u[]Y2%o^r!t,`Q$!?b0/#ScHste
+eC<($f\,!5h;-rGi8WeWjQ>UfkiqBum-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$
+^]/f~>
+JcC<$KE(<;qYg<hp\XpcrV??crqHHdrMoq"ql9^uriH7*Yd+2r!q,ICrp0[OlMg$3ki_*jjlGI^
+io/hRhqm2FgtLK8f[n^)eC;podEg+`c-+;QaN2B?`P]R0^q[Us]Xtbc\@8oS['R'BYck2-OoT:s
+D#S2PC1h3nrFQeAVkKWIP`^u`LP:GEP.6d5H?asoN;&>.Npr,/O9(N.r07#Br0I)Brfm,A!gJn3
+rK7,CplP]BS!TS*rf7/>L4b*WI0=k?F*2R'I04kHI=;*E!.b$!!b#PHra5k;@%Xa/rNH4&!3?*u
+!N)XkU]dHcTV8%XT)Y>]SGnp-R$X)&PEM#jO,f3ZN/`dPLPD:`]7c8dEc,].Df0K7Fa8@gM2@+H
+MMd7JMZ/P3MZ8M7Ll$reL]<):LPUbALkg_?LPCM9rIY*$rdY'"IXh6Fq18Qrr.4]pqLJ^"JV!cO
+s+;,@IX-0`G'J7TEcZJHEccGFDfUYOMI'Wf?2n10?2Iq0?XR:@?N=F3?iF@3?2\"6>?kH>?=$oB
+>l@n*>l._<>$G69>?k?8=]eg0>$G39>[(D1=Tho4>?Y2/=pJ88>$5!1='#<%s&f;&s&Bn8<E)po
+;,0ePQ'@Q!QBml(R@0G1S"#q<o:>oQqOd\Zr1NeXoqMJ]q4n"erhf=cri#gqoW%niri5gqrN-%"
+qQ(I7XJq\JH['dUF*<>TH[9gZNgd,MY-._Cs)S*[qfMj\rc\3`rcnHgrHeKjs*Xcns*artrdb$"
+!.t3&!JH1+L2Vj'M2@+JN/WaVO,oBbP*2#nQ'I]'R$jD4S=Q7DTV8*TUnsrdW2ZetXf\e2Z*L^C
+[^N]V]">Vh^VI\&_o9X9aN;WKc-FY_dF6Uqf%8R.g>(N@hr*JQj5f=ak32'olKdg(mdKW6nF?)?
+oCW%Ts7QHerV6Egs8)Zjrqu`no_sFAJcELbJ,~>
+JcC<$KE(<;qYg<hp\XpcrV??crqHHd"cS@tMMmDjMYrA5N/di*!q,ICrp0[OlMg$3ki_*jjlGI^
+io/hRhqm2FgtLK8f[n^)eC;podEg+`c-+;QaN2B?`P]R0^q[Us]Xtbc\@8oS['R'BYck2-I/RIQ
+?N=F2>o6gP>[2Z'G]n.HD/*]pA7KInLNRTOCiOOoHLuLPH3/G@I.D^`Ie%p\If+WeIMm6IEc5f3
+CM@Bk@:<PO?<^Q7=(#EF@:<POr*o\:!Fo+-<<Q6";gO/sK`?](K)^B$IKFqHIK"TsH@'s`H2Vsp
+G'.nLEcH&<Df0IkD?"GPC]A,`BlJ3NDg#f,A7K.]AS,RiCN"6<GlDpbGQW/7GB`t0r-&9eF`heJ
+rcS-\qfMp]F8BqVE<'tTEW'kVErL.REWC1ZEW:(YEW0t\E,BK0rbVRKs(MaOCM@HoAo_<qpeh)h
+peh/l<)ifpq,75ir)3Pls&/ko!)ienrD3_r;G^1e;Gg<i;#a;k;#4&h:]O;i;#X5t;,C%a:esh^
+:Jjsf:]=)u:JOYZ8kMZF6p6-QJqErRq1S?ns+^N.qM,!)s+p]1reUN0o8<="regQ1pl+^%q2Y00
+s,R&=rK%bTMhH=mDJX*%BR#_XDJ<m2IYWN.K`,ojErL.WFT6L_G5QR`GlN'fHN/?lI/SKnIK4ls
+JH(0#K)UB'KSBD[Dhj.*M2I4MN/`jYO-#KeP*;,qQ'[l*R@9V8SXuIHTq\<XV5C/hWN*#$Xfnt6
+ZEppH[^`lZ]=bkm^qmn*`Q#s>aihlPcHjnce'uq!f@\g2gtgiEi8N\UjQ5Odkiq?slg4$,n*fc8
+nac8Bo`"O`p&Ojcq#C0iqY^6ir;HTdrdk*#s1eSa~>
+JcC<$KE(<;qYg<hp\XpcrV??crqHHdr_`_pqGd>l!*9*f!q,ICrp0[OlMg$4ki_*jjlGI^io/hR
+hqm2FgtLK8f[n^)eC;podEg+`c-+;QaN2B?`P]R0^q[Us]Xtbc\@8oS['R'BYck0.r`'.k6psL5
+7Rd/A"@GC:4?NO&%Q-(#1c.3O4$H,0;,L:kpf.5kr)3;g!)ibop/1lfpe^c`mns-aq,Hub'0J?<
+3&irX2Dm<H1,(C:0.e_,0`Eg.0JW>Yr]U3B$9CUI8Ou?A8Ou?Ar'gWR$:@3K6U=%*6U3t)r]gEJ
+s$$HG!^8b/r]L3B(HOW>3B9&R4[;J-:/+GV:/4MX:/4S[;>*rh;tj/i;uTbm;?B]l;#X8j:]XEi
+r(d;fr_EPi:\[cc:]4,j;Yj5h;?'Go:Jamc:]F/i:]=2j;?'N,;c6Ij;,^=i;G^4^7RK!p4Zu",
+4o@AB3]m='r]:0B4$3@&rAt6F4?Ykl4[)(.49.SD5Q*eG4TI\D4o[\M5X%@p5!M7/4o[_G4U"#7
+5=%S"r]gKK6N'1N5X534s$$rV4[2+m4$#AY02kbI;u9Mr;c6Omr_rkrp/1rj<)riss&],#r)Wo$
+=o;Ch=oMP'=8l>!=8uD%=o2=e=nZ&!=oDP&>6S24<)?=cr_*_p:K("a:/4V`:JaqerGhjXrc@sY
+s)n<ar-/-bs*=Qhs*OcnrI+]p!.Xuus+(0%rdt6)L&QgFLPUeDMMmFPNK0'\OHG]hPE_>tQ^F/.
+R[]h<StD[LU8+N\VPgAlWiN8(YHY:;Za@0L\@K2_]Y;.r_8=+/`lH0BbKJ/UcdC.heCE.%f\5'7
+h;7&IiSrnYjlY^hl07L!m-X60n*oi:o()DErq6<b!;HHes7u]kr;6KkrVcBfJcC<$^]/f~>
+JcC<$KE(?<qYg<hq"t!crqZEcrqHEc!;6,f!3H1%!j8`2rilO1md:#?!UK%Mks+Cpk2tddjQ#:[
+i8EMLh;-l@g=b-1f@JI$e'ZRicd'eZbK@rJa2Q$9_SX.(^V.:m]",>[[^EKKZE^X;Xf_Sc$B0RQ
+Chmg$CM7EqrFQdXAnIO!Q'.,`LPLSIPECs9QZmt5MY2u*Npr,0O91Q-PPg[@Q2HsBQ2d*APld26
+P5UOCP5g[EOscBROcc*!Q]I5fNfJjIJU`,rG^"7NFF8OcIXQZpJ:N-$JUr>[@:K1C).?pYZEUO:
+YHP(1XK&;"WMQAbUnaWXTVA(XSd1gXS=,e4Q^7T6!g&P,rf._QNf8dPR[&eNG&hA7E,Tc;G^G.#
+M#E21M?&M2MZ/P6M?8]nMZ&D3M#<&,L]N9ereCo:KS4u2Jq8K'J:E#trI=s#J:RNJs+'utq1/Bo
+qh"d!s+LE)'SM*cH$FOXG]e1OF`VSGFE;>=E/jd$!*oM/qd02-!+,Y3ra#S1rETA,"C,5<?=!P8
+r`f>+qcj)(&R8OE>[(B7=]eg1>$G6:>?Y50=Tho4>?Y2/=oqo3>5hYJ=B/C'=BAU+=&r=#<E2so
+;,0bSQ'IZ$Q^=,.R$jG5S=K;D".l'TT),)VU&:SXU%P/[U\U\cV>d@aVuEXoWV*:jWVrjnX8f:"
+X8T-sXVIn6R"g'7G'.hLO2-*fF*j4B<i`C+rc.sYrcA!ZrcS6ar-/-bs*=Qhs*OcnrI+]p!.Xuu
+s+(0%rdt6)L&QgGLPUeDMMmFPNK0'\OHG]hPE_>tQ^F/.R[]h<StD[LU8+N\VPgAlWiN5'Y->.9
+Za@-K\%0&]]Y2(p_8=+.`Q-'Ab0/#ScHsteeC<($f\,!5gtgiFi8N_VjQ>UfkiqBum-O--n*fc9
+o()DDo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s1\M`~>
+JcC<$KE(?<qYg<hq"t!crqZEcrqHEc"SI\1Mi7Ljr/:T6s,I&=!Uf@SliHG;rolZ2kN:pgjQ,@]
+io&bPhVI#CgY1?5f@SU'eC2gmd*L"^bfe/NaN)9=`59C-^V@Ip]XkY`\$i]OZa-j?YH=r+Hj41k
+?XR5I?N".I>[:W??!CNUEcH#5B4b^bD/O32M108\F*R\1nTjVM!IK4aIJeQcIJ&'fIJ/+>F)c/:
+DJO$&ARf.W?XI)C>?=p7?t*SQ@U`hW@UikX@oQE-<E)ss<)\PKK`?Z(JHgXRIXQZlIK"TmHN&0h
+G7&M9FE;JBDfK]5DZ4MPD#\8`C2S98F_G?!@q9.`AS,XmFE_s,GlN!fGQ;seGl;j`Gl;ghG'.qL
+FT-F]FS^+\FE@G%!crC&pMp.N!HE/YF8'_TF8p7`EH?/?EVjeVEW:%_Df'?-D/9)bs(DUPBPD!g
+@Vkm=s&&Phs&Aqqq,72hrDNYms&/ko!)ienrD3Sn;G^3f;?'Gq;,9ta;#F0-;G^1c:esna:Jaha
+;,9ta:eje^:f1%b:]=)s:JOYY9h@oI6U-0SrIap!p4WU'Knb?\L\cc)L]<21L]3,.M=ZW"M>iD0
+Mt`2"N<,'!qi:H4rJpi;qiDGOMh#qhDej*$CNttYCh[^7J5-#rrc.sYrcA!ZrcS6ar-/-bs*=Qh
+s*OcnrI+]p!.Xuus+(0%rdt6)L&QgGLPUeDMMmFPNK0'\OHG]hPE_>tQ^F/.R[]h<StD[LU8+N\
+VPgAlWiN5'Y->.9Za@-K\%0&]]Y2(p_8=+.`Q-'Ab0/#ScHsteeC<($f\,!5gtgiFi8N_VjQ>Uf
+kiqBum-O--n*fc9o()DDo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s1\M`~>
+JcC<$KE(?<qYg<hq"t!crqZEcrqHEc!qfGhqGd;ks&T/"!Uf@SliHG;rom)>kN:pgjQ,@]io&bP
+hVI#CgY1?5f@SU'eC2gmd*L"^bfe/NaN)9=`59C-^V@Ip]XkY`\$i]OZa-j?YH=p+<)k@q6q0R5
+6psK=6k_[C3B/lR1c$mJ3&*Q`9i"Vc;cEHjr_r\lo2GZer_r_ms&&PfqGH]Z!)r\mohuhm4$#A]
+3&``P1c$m@0J>+3.kED01,:O=1GgpErA4R<4[&d,"Znk.8kDVR7g2IT7n,p9rBpWQr^6uY6:4%*
+5X@[7570Y?5!D(l5!:th4oRMX3]fD`4?bPj:/4MX:/"AW:ej_a;cEHj!)rhq"&i)q;uT\p;u]_t
+;cH^pr_ibpr_`hq:f'se:]OAj:]=)j:JO[[;#X5j;#X>l;Ya,h;>O,g:]=,g;#O/t:esna;,^=g
+:fL=kr_Wko9L:R!5!Jp.r&Y!A4$5Y(3s%H)48_5>3s.N*4?ia-!'^?D!'U9Fr''s?s#pNM5!D./
+55[SD56!bG55meI62j+Q5sI\&5sb?4!'gHH#sUR;3BB,V0N1pI<!-&s;cEZp!)rYjs&/qt<Voes
+=8Q+t=8H%d=oVV'=8l>!=8uD%=o2=e=nl2!=oDP$>8:=C;G^1b9MS>Y:/t%b9heA]3DWONrc.sY
+rcA!ZrcS6ar-/-bs*=Qhs*OcnrI+]p!.Xuus+(0%rdt6)L&QgGLPUeDMMmFPNK0'\OHG]hPE_>t
+Q^F/.R[]h<StD[LU8+N\VPgAlWiN5'Y->.9Za@-K\%0&]]Y2(p_8=+.`Q-'Ab0/#ScHsteeC<($
+f\,!5gtgiFi8N_VjQ>UfkiqBum-O--n*fc9o()DDo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s1\M`~>
+JcC<$K`CH=qYg<hq"t$drV?<brqHEcrq6)f!3H1%!j8`2riuL/s0GYjlg*j#l0.<nk2tddj5].X
+i8EMLh;$c=g=b-1f%&:!da?FfcHXSVb/q`F`l5m6_SO%&^:_+j\[f2X[^<BHZ*:F7XfR\KMh7+L
+CM[a#BP2#WAccXXAc?BSOc>9SL51PIEh9Y-H%(F*nr<O,nW3[2!KiQBPkp[CQM6[EPkC:DP`q8n
+rfR5Ds,m;Ds,dh_QBmSmNK/jPK7SQ&I!Tu8F8gOeIf4a"JUi9&JV!f0#@LtJ@:5&"Z2Us5YHY.2
+XK&;"W;`P#V5'cZTV8$NT:VUFS,Sf]Q^*f!PEM#gO8b.PNM;`QQBH<4E,0E4FE2VPK8GH_M#N52
+MZ/J3MY`81M?o&rM2@%ELPU``L]W?fM#N20L&Zf/K7\]+JGt&tJ,k0!JGaruJGOilJGt,sK)('!
+K`-K8JU2ZfGBS.PFED\JFEMY>FE!9=>l\./?2S%,?iOI4?iF@3?2\%.>6%q,?2e+.>Pqb(>Q7k=
+>[(E;>?Y04=BSd1>?kE;>?_#/"Bo#6>$:i.!*fG+s&gCF<E<1'='/R+<`N+!<E)jn:JFA6QC!r+
+R@'D3S"0/B".l'TT),)WU&1MWU%P/[U\U\cV>d@aVuEXoWV3@jWVrjhX8]3rXV\.=Um6FUGB\%I
+JWtY1GBJ>*U0+P#Y&XG]s)\'Zs)n<ar-/0cs*=Ngs*F`nrI+]p!.Xuus+(0%rdt6)L&QgGLPUeD
+MMmCON/`jYO-,TgPE_>tQC+&-R[]h<St;UKTqeEZVPg>kWiN5'Y-5(7Za7'J\%&u[]Y2%o^r!t,
+`Q#s>b0/#RcHjnce'uq!f@\g2gtgiEi8N\UjQ5Odkiq?slg4!+n*fc8nac8Bo`"O`p&Ojcq#C0i
+qY^6ir;HTdrdk*#s1\M`~>
+JcC<$K`CH=qYg<hq"t$drV?<brqHEcrq->MMi7Ljr/1Q6rf-i9:[IE5lKRQskND!ijlGI^io/hR
+hqm2EgY1B7f[n^)eC2jnd*L"^bfe/NaN)<>`5BI.^q[Ur]Xt_b\$i`PZa-j?YHG"/I!fO6Ch@$\
+?M[t->QJ&4r`]nNCM7?kAS#^cG_g`_E-$:'HLH.LHN/<lI.D^`Ie/!\If+WhIMR'GE,BH-CM.9i
+@:<PN?!CH5='o<C@/XO9A7B$I@fTL-<<cE&;c@UhL&?W(K)^B&It%BF"FPWEH@,X;$[?rAGBe7P
+F`VSCE;jbUDZ+DaChn38MK*lRB4YUaAnG[iD05Vu#^CQ<G^"@VGBa%2rce3`rce?brcJ0_rH.gW
+s)S3]F8g4[E<(%TEW9tZEH?1!F80eUF8g4[F8p4]EcZ=$ErU.UEY35-D/F')Bk_<tBPD0n@qB.e
+qbmGkq,75l"&i)r;u'>j;>jDm;>sGo;,[?irD3hu:f("d;Gg:f;,R<g!)WSj!`DikrD*o":Jah`
+;,9ta:eje^:f70es%Wns:/4MY8P)HD67MndqLnNq",;MaLAco(LAlu.M#W80M#N8&MYN&,MYrD+
+N:)]&Nr"h6NrG+7O:mP0JTGaGCMIU(H>dV9C2JKQ:&]eGEW1"YF8L(ZFoHR^GQ2pfH2N!gHN8Hl
+IK+`rJ,XuuJH1<$K)pXZre>BILl$tGMi3OQNK0'\OcklkPa.N"R$a;1S"-%@StMdNUSO]_Vl-Mo
+X/rG+YHY:<ZaI6N\@K2`]tV7s_SX71`lH0CbKS5VcdC.heCE.%f\5'7h;7&IiSrnYjlY^hl07L!
+m-O0/n*oi:o()DErq6<b!;HHes7u]kr;6KkrVcBfJcC<$^Ai]~>
+JcC<$K`CH=qYg<hq"t$drV?<brqHEcrq-7iqGd;k!EN5"<<#rnm-F!&l07EpkN:pgjQ#:[iS`YO
+hVHuAg=k64f@JL%e'cXjcd'eZbK@rJa2Z*:_ns7*^V7@n]=GJ][^NQLZE^X;Y-"d)<%04M/OW&&
+6io_D7/fRR2@MH"1,CaI4$Go":/Y'i;ts;l;u'>Z;uBMn;><u`;=@B_;u'De;\V>U3]T/Z2E!EL
+1bpa=0/+t./2AsZ1B0012#]931c,+or]C?G4[Mb48H)*k8Ou?@77BU56psC16UO1-6UL]9s$%Pi
+5<h=o4[(tj4$>Ye3]]5a5Vku+:JFSX9MSDZ:K70hqGdJnrDWkt;GpHm;ZBZ!;H$Ln<)`cos&8ko
+!)`Vir(m>fs%`Yj:\[cd:B45i;#sQlnPK3\s%WVk:f.*d(Jmt+;Gp:d:ejea;GU4j;c6Oj9MIo3
+55dVE4T%8I3]oMd3]fDa3]m7%rAt9G4$5Yi4Zttlr]C0Er'1-Ds#g?Gr&k'E5lNqK4[)+-4TI\F
+4WlsS5=%S"5X@V#6:!n&5sRY"5=%Lt5<_=q4ut\a3\qfS<!-&s;cEZp!)rYjs&/qt<W#nt=8Z1u
+=8H%c=oVV'=8l>!=8uD%=o2=e=o)>!=oMV$>Q7k0=BAHt;#X0!:/"MZ:/4MY<E)%U;GqN6ErU4X
+FT6L_G5QRaGlN'eHN/<lI/SKnIK4lsJH(0#K)UB'KSBD[E/07+M2I4LN/WaVO,oEdP*;,qQ'Rf)
+R@9V8SXuFGTqS6WUo(&fWN*##Xfek3Z*UdE[^WcW]"G_j^VI_'`5Ta:aND]Mc-FY_dF6Uqf%8R.
+g>(N@hr*JQj5f=ak32'olKdg'mdKW6nF?)?oCW%Ts7QHerV6Egs8)Zjrqu`no_sFAJcEIaJ,~>
+JcC<$L&^N=qu-Eiq"t$drV?<brqHEcrUp#f!3H.$!j8`2rilI/rj2U2rom,?kN:pgjQ#:[iS`YO
+hVI#CgY1?5f@SR&eC2gmd*Bq]bKJ&LaMu3<_ns:+^V7Co]=PP_[^NTMZa$a=Y-"e+P)Y-_N.dms
+C1q6nrFQjZB4YdkBPD7!Ckm[uO`?c3R<a13MN3_fNVnh+O8b4AP*>g.q3ClDpQY`CoT]KBPEPp-
+rfR8Drf[;Ns-E\I$BC+'KnFr-IsZE`rc80iIXHbHIfY+NrdbK0JRW(s?sm>M@'[)CrilF+s/cL,
+WiN.tUSIga!29Cb-(gj&St;RCR[KS1Q'.ArOcYZcNfKg,XG33fF`)&9FEMhVKntQ`M>`8/M#`G4
+M>iD2MuSb9MuJS8Mi*AiL]W?fM>N,.LBE9bKnTGX"G))RIt.HJ!.k&us+10"qLSWrs*t#urdjot
+qLeg$"G;;XK7a)R'nV!^H[0dWF`qnNFEMbLD09i9?!U_7?2It+?iOI4?iOI4?2e+/>6%q+?2n1.
+>Q%h)>Q7n)>7=\<=]eg0>$G39>?b;0=oMV6>$5$4>?b97=]nj,<rQ2#=;4h;<E3!u<)ZUj9hII6
+R@0G2S"#r@SH>CRT)##VU&:SWU%P,[U\LVbV>d@hVZ<UkVuEXoWVELkWVidgX8]3qXV@qAWh5B(
+H$ORTF,%2QHZsX^T<#'mY5WJAF8U.ZFoQX_GQ2peH2W'hHiJKmIK+`rJ,XuuJH1<$K5lQuKnb>;
+Ll$tGMMmFPNK0'\OHPcjPa.N"Q^F20S"#t?StMdNU84T^Vl-MoWiW>*YHY:<ZaI6M\@K2`]Y;.r
+_8=+/`Q-'AbKJ/Ucd:(feC<($f\,!5gtgiFi8N_VjQ>UfkiqBum-O--n*fc9rpg*]o`"Lbp@n=\
+q#C0iqY^6hr;QZerdk*#s1SG_~>
+JcC<$L&^N=qu-Eiq"t$drV?<brqHEcrUp2Kqhk?1!0$o:qi:Z:rom#<kN:pgjQ#:[iS`YOhVI#C
+gY1?5f@SR&eC2gmd*Bq]bKJ&LaMu3<_ns:+^V7Co]=PP_[^NTMZa$a=Y-"e+HtQl-BOZ./?Me"F
+>[(H:>[(E;>[:TGA7]R_GEmMjE,g,LHgQ+JHN&9kI.VjbIe/!\If4]kIM[*IEH,o8D/*]o@U`bQ
+?X-f<=BJs?@:T:G!+bt:"&r9"<W5r#;MKp[L&H])K)^E%Ig(7LI=6KjrHeHgrceWiFEDSEEH(nq
+'lIl*Ci+<>Jo?$MBOt^bB4u!uF*;a&GQ2pfGPudcG5umeGPHF^GQ2jdFT-F^FSBnXFT-@\ErU+Z
+EqaPREr0qRErL.ZErU1_EcH,@rGhmXr,MdYrc8$Y!-A*V$uB]oBkqEsC2%-g@q#=6s&&Phs&9)!
+;H$Nj;Z9Pk;?0Sn;ZBSo;Z9Pl:]OAl:^U&t;,L.d;,C%a;#4&h;#X8j;#a;u:f1%b:f'n^:Jape
+:]F2h:C'Zi8P2QE68X>kK_:$#L4tB\L\cc(L]</1L]*&.M=ZW"M>`>0MtW+tNVeb5O8=n9O7nYJ
+NJN"%DJX-'Bm#GRDeWs)JVf0]K`6#lF8U.ZFoQX_GQ2peH2W'hHiJKmIK+`rJ,XuuJH1<$K5lQu
+Knb>;Ll$tGMMmFPNK0'\OHPcjPa.N"Q^F20S"#t?StMdNU84T^Vl-MoWiW>*YHY:<ZaI6M\@K2`
+]Y;.r_8=+/`Q-'AbKJ/Ucd:(feC<($f\,!5gtgiFi8N_VjQ>UfkiqBum-O--n*fc9rpg*]o`"Lb
+p@n=\q#C0iqY^6hr;QZerdk*#s1SG_~>
+JcC<$L&^N=qu-Eiq"t$drV?<brqHEcrUotcpf7;ms&K&"rom/@kN:pgjQ#:[iS`YOhVI#CgY1?5
+f@SR&eC2gmd*Bq]bKJ&LaMu3<_ns:+^V7Co]=PP_[^NTMZa$a=Y-"e+<%01N/hK+D6q'L37K,[T
+6iKLR6iTI[6UW[b1H7BX77L)P;ZBYs;H$Nk<;ohl;X[Q\;?0Sh;#4&X;?0Yk<;BJm49dl.3]T/X
+2Z>N<1,1I90.e\*r\=F.s"a[52#K004oRPJ4$>Yt8kDSQ7fu=R7n3GG"%#FF7/TCP62<bc5<qCp
+5!D+k4$5Pc1d4)l8P`&U9heDZ:/Fth;Ya8e<;ohr<;]\o;YsAp<)Z[mr_rbns&&_kr(m;e"&DZe
+:]=/j;>X/j:Jh!e!E)ea:]O;j:B")g:]=5j;ZBZ-;G^7e:f:+f;H6Xl;c-4]6q.)<!'L0@!':*A
+#!4k-4$#Gbr&js?s#L?H4[)"l5!Js.!BiXF5Q*eG4TI\D4U4/85<_7o5!Sp-s$$HG,!S=W5s[_#
+5sIV$5s[b%5X.Lu5sIOu5!M4p4#oA^1F?(#r)<So!)rYjs&/ntqc<_ur)ikuqH3)es&f8%r`K&!
+s&f8'qcNMo!*K#!qc`i!r`]/&rE9>*<DZCcrCmSn<)6=c9hSGb;uT\oErU4YFT-F_G5QRaGlE!e
+HN/?lI/\QoIK4lsJH(0#K)UCBKS>,7L51SAM2I1KN/WaVO,oBcP*;,qQ'Rc(R@9V7SXuFGTqS3V
+Uo(&fWN)u"Xfek3Z*UdE[^N]V]"G\i^VI\&_o9U8aN;WKc-FY^dF-Oof%8R-g=tE=hVd>Nj5]4_
+k3(smlKdg'mI'H3nF?MK!V>s_o`Fj]p\ssfq>^<hqu-HlrUg)?s+13`s*t~>
+JcC<$L&^Q>qu-Eiq"t$drV?<brqHEcr:L'^r2Th!rN6+&!O&a,Z2M$-Zi[S>ZMrucjlGI^io/hR
+hqd,DgY1B7f@SU(eC2jnd*L"^bfe/NaN)<>`59C-^V@Ip]XkY`\$i]OZa-g>Y-"h,Wi:c?Ne_8?
+S!&YBAn>RdC1q0mBkV3qD>nAOCC+m>c^f9*Jr5SKrJ^f9rf-o9r/L]9m>q:/!g/Y0r07&C!LB#M
+QKaY:P`q8nrfR5D-]sRTS"#_0OcYW_M2-_8JU`&mG]\(LI=6TsIt3'$ItE6(JqINA@K'X;@?@e#
+Z2Lm;YH4h+WiN.sUSFZ^US4BUrh'@cSt;MPRMqQ[Q'.>qOcYZcR@pd>Sp#6uE-$&DI"R63M>i>/
+M>i>-M>`;3Mu/G;Mi*CNMi*AgL]E;.M#W51LAll6KS>&0JUi6"J:N4KJ-:FRJUi:IJc1*!J,Xut
+JbaooK*?s^JqAW,rdk!!&VGLYH['dZF`V_IF`hS;F)d6=?2It+?iF@=?X@&E?!LT=>?bA1?2n1.
+>Q%h(>7t+D>[(E;>$5!1=BSg3>?kE;>5_V'>9mBT>$>-7>$>'3=BAO)<``C*=&r=$;cZjs:f:%^
+6(++/S"#rASc,/UTDYD\T_G/QUAq"`U]@7jVYm=lVY[4iW;`dkWr8poWq<@kXSAn5Y-5%2WLAiq
+G]n1LGDNqZH$"=bS[PTuY5`PBF8U.[FoHR_GQ)jeH2W'hHiJKmIK+`rJ,OluJV*lR#)%\aL5(J>
+reYZQMi<USNfT6_OckomQ'IZ%R$jD4S"6.BT:qsQUnjibVl6VqXKAV.Yd(L?['mEQ\[oDc]t_=u
+_Sa=2`lQ6DbKS8Wd*^:jeCE1&f\5'7h;7&IiSrnYjlY^hl07L!m-O--n*fc9o()DEo_%nNp@nO\
+s7u]kr;6KkrVcBfJcC<$^&NT~>
+JcC<$L&^Q>qu-Eiq"t$drV?<brqHEcr:L'^qhk?1s,?r:!KN0=Nr4t<NW>(<k"Fgsj5].Xi8EMK
+h;$c=g=b*0f%&:!da?FfcHXSVb/q`F`l5m5_SO"%]tD"h\[],W[C!9GYct:4XfJJ$@rQ-m<-N@u
+B3ebJ?!I;5"^P>;>[:Y4>RGJ<HYRM?G^Fd`HLQ4IHN/?kI._pcIe/!\If+WlIfFKhEW9nhD/*]p
+@q&hR?X6r?=]f'?@:NaF@h)sX@q9([<)lpt<Duh9LAlo*KEd$ZJ:W6#If4ZpHi89jH2i*pH$=FR
+FE;JBE;jbhDJa62G_0m`BP:sgAnYptF*2\Nrc\*]"*f$5GQ)jcG63#5GPuadH2MpdGQ2geF`dV*
+s)e3^!-\9_s)\KeFE;MDEcH-pE<(%XErpB'F80eUF8g4[F8g1[F8'\[F)l;BF)l8@rcAinDJj9-
+CMIR!C1q?l@qB.d;Gp@hqbd\u;GpIn;c6LlqGR;ir)3Pls&/kos&/korD<Mks%iep;Gg<i;#a;k
+;#4&h;#X8j;#X5s;,C%a:esh^:f70es%`Si#Yn)g9M%fH6TP$sp4`I"rJ16(rJ(H1LPPhare^6(
+q2,$,rJU?-mZ%+(rK$`6rf?c7'TnK:K6hKRChd["G`ZcZC2.a>Mhq@cs)S-\r,hs]rc\6arcnHg
+rHeKjs*Xfos*artrI=p"K)UB,KS>,7L51TaM/nK3N/WaVO,oBbP*;,qQ'Rc(R@9V7SXuFFTqS3V
+UnsueW2cl!Xf\e2Z*L^C[^N]V]">Vg^V@V%_o0O6aN2NIbg+M\dF-Lne^rF*g=k?<hV[8MioB+]
+k2tmll0@U$m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+13`s*t~>
+JcC<$L&^Q>qu-Eiq"t$drV?<brqHEcr:L'^qc*>jrDWet<r,nsk!nInj5].Xi8EMKh;$c=g=b*0
+f%&:!da?FfcHXSVb/q`F`l5m5_SO"%]tD"h\[],W[C!9GYct:4XfJJ$-o3G+0fV$H0`FHD6UX=0
+6q%#A%73EL5X7P"3'9Q!:Jk$h;uT\p;uTbn;uBP[;u9Jl;>sAl;>sDf;=@B_;u9Mp<E/io$p6[7
+3]]8\2E!BK1G\q`"YMAX/M]'[1'06g2#]9=1,CdN4Zkki4$>u(r^m)Z!_GpPrC$iW5t".1rBgTP
+62j+L5Q*hW5<q@o4[)"k4$,8`5"8-C:]F/h:B48j;uT\j;u0Jl;uTbq;uT\m;[63!<)Z[m;cEQk
+"Aqum:f.'cs%`Si"AV`g:f.-gr)!5emna*^:/4U_:]jKi;,R9iqbn,(;,L.e;,U7k<Dujh92%`2
+4[&^)$9C724?GSc4$#Gbr&js?s#L-BrB:0ErB('DrBL6Es#g?Gr&t'D#!b@94[)(or&t$C#!G19
+5=%S"r]h8a6:!n&5sRY"5=%Ou5X%=r5!M+i3AiAc;uT_r;u'>k;ZTitqc<_ur)iku!E`M&=R9/j
+=T)>#=Sl/"=T)D"=S>kt=SGts>528">5MP$=qb%?;c-@d9MJ2S:Jsta:/+A[;cN`os)S-\r,hs]
+rc\6arcnHgrHeKjs*Xfos*artrI=p"K)UB,KS>,7L51TaM/nK3N/WaVO,oBbP*;,qQ'Rc(R@9V7
+SXuFFTqS3VUnsueW2cl!Xf\e2Z*L^C[^N]V]">Vg^V@V%_o0O6aN2NIbg+M\dF-Lne^rF*g=k?<
+hV[8MioB+]k2tmll0@U$m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+13`s*t~>
+JcC<$LB$Z?qu-Eiq"t$drV?<brqHEcr:U*^!;$/ir2p"%"L#&7Z*O>7rj5k8ZEga?Yck4ij5T%U
+i8<DIh:pZ;g"=p-e^W'rdF$:ccHOJTaiMNB`Pf[2_8*h"]Y(hd\[T#T['R'CYck12XK&;!Vi?CE
+U7@I,L5_"$Anl!jBkh<qC2Nrds(_n'NlIf;H\%*8rJgf8s,Hu9q2GB7mZ7C0s,d;Eqipl@rg)f6
+s-!GGrfR/B.@ZioQ&q/hNJW@AIt<&rG^"7PEd`@eJqAQ*Jq8Q,JqJ\b@pi_P@:6G@ZN%-1YHY2/
+X9Yc+Wi)VeUnms_,bUj(T:VXES!f_3QBdYtOcb`gNjsk1GB7kFFEDhZKSbPALl)%crJCQ1r.tH3
+M>`;3MuAV7N<"q:M[,3!Mi*=HM2;.fpkT31Knb;9KnFu.rdX`o!.k*!q18Qr!.Xuurdjls!eZ/Z
+rIY0)KnTGXs+16%r.4s%K`6T8IX?BcG^"4NGB.kMDJaE3?N+7/?3":/?i+10>m=P<>[1K;>l@t.
+>l@n*>l.b*=p/)7>?kD3=UA25>$>-8>[(B8r`T5)#?k86>$G37>5hY?=B/C&=BAU+=&i7"<`N'p
+;GKnSR[]f>Sc,/VT)bP^U&:SXU%P/[U\U_cV>d@jVuNXjVuEXoWVELmWVWXpWrT0oX8]3rXVn:D
+Y-5(8X/;;=I!0^SEIX%1H['XWN17)NriZ6Ar,hs]s*"<as*4QhrHeKjs*Xfos*jutrdYB-JqAW-
+KS>,7L51TaM.hd)N/WaVO,oBbP*2&pQ'Rc(R$sM6S=Z=ETV8*TUnsrdW2ZetXf\b1Yd1UB[C3QT
+\\#Mf^;%J#_SjF5a2lBGbK\>Yd*^:keCN7(g"P39h;7)JiT&tZjlYail07L"m-X60n*olHncA@S
+rq-?dp\4[^s7uZjr;6KkrVcBfJcC<$^&NT~>
+JcC<$LB$Z?qu-Eiq"t$drV?<brqHEcr:U*^!;$/Hr/1Q6rJgc9r/Ui<rJaL0Mi6WUio/hRhqm2F
+gY1B7f[n^)eC2jndEg+`bfe2OaN)<>`5BI.^q[Ur]XkYa\$i]OZa-j?YH=q.WiE"qB4=ncF)G`&
+BkULMr`fG/r`oJ/r*0MDE05Q_Df^,LrHe$[s*+NhmX"hY!.=Eer-n9doR?aerI4cg'6.u/Df'9&
+An#1V?sd/B=]ng7@JaR6AH--IA5lQ/<)cdpL5(D9rIk3'"G))SJ:IQIs*Xfms*F]js*+TjG'3e+
+s)A$XrbqgS'5r_HHtR,(B4bjmE-$2FF`qtPFoHR]GQ2mhGBS30GRAY<GB\:UGBe@XH2;dbG5ug`
+FT?O_FoQX_FoQOeF`_\GEcV+u!-7sV!-8'[rc8$[qJuUWrc8!Zs)J0^FE@;!rc83_F)uABrcA*]
+rc8WjDf'<-Chd^#Bk_<l@q9%Hr_`Vl##S;t;H$Onp/:lerDNYms&/kos&/korD<Mks%rVjs%ihq
+:JXe`qbdAir_NPj%8Ter;,L+b:f'n_:Jame:]=)q:JOYY9hIuJ6p:O&onE@!reL<(rJ(H1LPPkb
+rJC0(q2,$,r/:6,mu@1(s,Zl6rf?f8rfInXO,JX7Df0?*BlSB>DJX!%G^kX*re18lr,hs]s*"<a
+s*4QhrHeKjs*Xfos*jutrdYB-JqAW-KS>,7L51TaM.hd)N/WaVO,oBbP*2&pQ'Rc(R$sM6S=Z=E
+TV8*TUnsrdW2ZetXf\b1Yd1UB[C3QT\\#Mf^;%J#_SjF5a2lBGbK\>Yd*^:keCN7(g"P39h;7)J
+iT&tZjlYail07L"m-X60n*olHncA@Srq-?dp\4[^s7uZjr;6KkrVcBfJcC<$^&NT~>
+JcC<$LB$Z?qu-Eiq"t$drV?<brqHEcr:U*^!;$.grD`hsrDieq!``9%qc<burE'$Z8E/Udi8<DI
+h:pZ;g"=p-e^W'rdF$:ccHOJTaiMNB`Pf[2_8*h"]Y(hd\[T#T['R'CYck12XK&;!V_'DR3AiWJ
+0JYCB6U^o@&k#)S6:4()5X.Lg4[MY7;,C.hqbdDmr`&kqpepHWqbmAi!`2`kr_WGgmns-aqc!Sr
+<;]Z44?Ybe3]T/X2Dm9G1,(@8/M/M)1,:X@1Gf"es"XX11H#.p#Wt114A&4;8P&hNs%!,ZrC%#\
+6:=416UX=/6N'.S5<qIu5X.Fqr]CZR4>&c]7S-BO9hnGZ:Jq!fr)3Djq,I>l"&r9"<;ohq;Z'Gr
+;H$Ll;Z9Vl;Z9Mn;#=&g:'scl:/=Y^;,U:h;>j>i;?'Jm;=IE]:\mof;>jDm;uTYq;cN`p&5l>#
+;,L7j;H-Ol<(]_S6p:H0$9C714?GSb4$#Daq`Oj>!]iD*rB1-ErB('DrBL3DqE=jB"$f%64oRYD
+4TIVD4p=)55sR\$r]gTP5=.Y%r]gTN5X7V#r]UTN5Wq=n3]T#Lr_req!)r\ks&/qt<W#nt=8Q+t
+<rlE+r)i>hs&f8%rE/qu!*K5'qH3Jps&f"us'#,!r`]8)q-"J:>Zt3,:Jae\:/+D[9M\>V:/=bd
+rDNW9r,hs]s*"<as*4QhrHeKjs*Xfos*jutrdYB-JqAW-KS>,7L51TaM.hd)N/WaVO,oBbP*2&p
+Q'Rc(R$sM6S=Z=ETV8*TUnsrdW2ZetXf\b1Yd1UB[C3QT\\#Mf^;%J#_SjF5a2lBGbK\>Yd*^:k
+eCN7(g"P39h;7)JiT&tZjlYail07L"m-X60n*olHncA@Srq-?dp\4[^s7uZjr;6KkrVcBfJcC<$
+^&NT~>
+JcC<$L]?c@qYg?iq"t$drV?<brqHEcr:U']s7?8k!3H+#s/lL.Yd(I=rNlO2>-kN>Z*:L:Y-+n.
+Wi4k5hVI#CgY1?5f@SR&eC2gmd*Bq]bKJ&LaN)9=_ns:+^V7Co]=PP_[^NQLZE^X;Y-"e*Wi;no
+V50fSQ&LHTMMnO9VIsRWBk_=!rbVUM#\nplUj%-9M2qOop5Jj-s,QQ/!0I2B!KrZEPkLCBQKj_;
+P`q8nrfItZ>aq1IP`_)hN/37BJUr5rH$=@RFFF.>!J#e$JIdEcKS*`D@pi_P@>(tnZEaA4!NiI&
+X!t-MVk^#_UnXTWU7\-PT:VXDR[]_3QBIJsOcl*&Q()r>EcH/DH@pp-rJ:N1re^T0r.tE0qMG0.
+!fN"rrJg]5#E+IqM2@%FM>;r/M26rdL'39dK7eaQJ,t4QrdY!"rIF`q!.t)us+16%rdk-&r.=m#
+rdt6*K`$H&Jbt'!K`?](KG&ufH@'m]H$4:SF*)25Df]i&?2\+0>m"G??XNY9!+#P.s'#J.rE]G.
+rEK2)r*02)%:!+A>[(B6=]eg0>$G82>6%k+=UJ>:>?Y06>$>-6>5hY==B/C&=BAU,=&i7"<E3!r
+;G^+[S+`EOT)"uYT`(S]T_G/QUAq"aV#R:jVZ*LmVYd:iW;`dkWrB!lWqWRnX9,N*XST%:Y-5(8
+ZEpU.Q@aC.F`DJZ[=ERHG'TFFX/l6&!-A'[s)n<arHJ9ds*=Qhs*OcnrI"`rIt.HJI=[!%K7ei1
+Knb>;LkpnEMMmFPNK0'\OHG]hPEhE!Q^F/.S"#q=StD[LU8+N\VPgAlWiN5'Y->.8Za7'J\%&u[
+]Y(tn^qmn*`Pom=ai_fNcHaeadaQ^rf@S[/g>(N@hr*JQj5]7`k3)!nlKdg'mI'H3nF?)?oCMVR
+o`Fj]p\ssfq>^<hqu6NlrUg)?s+13_s*t~>
+JcC<$L]?c@qYg?iq"t$drV?<brqHEcr:U']s7?5Ir/:N5"-/A$Nr+n8NW+i.MM[1Gi8<DIh;$c=
+g"=p.e^W*tdF$=dcHXPUb/hZE`Poa3_SEq#]tCtg\[])V['R'CYck43XK&;"Vl-AeGB7Y8@qTFg
+JU`(H>QJ,7ra#J-#[;%oIVN_>GC0:7nTk.Zs*=$YrHeNloR6Xdp3lO]rI+]p,#36%E,]]5ChdTq
+A7AqS?<pc;=BT'B@q&qXA7K+\@q9(Kr`/tt(K5%&L4t>7KS>)3K7\W)J:E&sIXHNiHiA?kH2`'g
+FoHIqEc>r9DfBW?DgQ/2An>OhD/j[sG5cXaG6W55F`qqPG5ZUcG^'.1#^:N;GBS.RG^'.3rd"Bc
+rceBcrcJ3ar,r$_r,r$]!HiM`F8g.\EcH-tE<(%XF8g1[F8g4[F8p:[F8p:ZF8p7\FT$:ZEqOMR
+FT6F^FT6CoEGo`3D/<p#C1h9j@q0%Y;,R9is%req;Z9Vg;ZBVl;ZBVn;?B]n;Z9Pl:]aKj;#F2j
+:^9io:JXea;,I6hs%r_k&5H"t:Jah`;,9ta:eje^:f.*ds%Wns:/4JX8P)HD6%nrcrJ(9+q1em(
+s+p]1reUN0oSWI$rJLN2oo/<um>h1,!g&J(qN1]=rfRqUM1BS`Chmd"FcgZ^C27U6J;ApYKE-)k
+FT6L_G5ZXbGlN'fHN/?lI/SHpIXckHJ:3!#JqJ]/KS>/8LPUbCM2I4MN/`jYO-#KeP*;/rQC!u+
+R@B\9SXuIHTq\<XV5C/hWN*##Xfen4Z*UdE[^WcW]"G\i^VI\&_o9U8aN;TJbg+M\dF-Lne^rF*
+g=k?<hV[8MioB(\k2tjkl0@U$m-X60n*ol<o(2JFrq-?dp\4[^s7u]kr;6KkrVcBfJcC<$]`3K~>
+JcC<$L]?c@qYg?iq"t$drV?<brqHEcr:U']s7?4hrD`hsrDieqs&T"us&T,#r)R%[hqm2FgtUQ9
+f[na*eC;spdEp1ac-+;QaN2E@`P]R0^q[Us]Xtbc\@/iQZa-j?YHG"/WiE%rVkp1L2)@'B1GUdR
+6:!t*6ps@.6UF((5<qIq4\8FH;,C3e;?0Yp<<#nk;XIEZ;Ya2i;#4&X;?0Yn<<#r%<)Z^O4?`[)
+s#L*;$8jXq1+t:7/hJV+rA"@/rA5$?1GUaK5!;%k4$,`#8kDSQ8,c$c7RT^7779L26UguB!(6QI
+s$%,]5!;"j4[(M_1.b89:/+JX:/:dd!E2np;uBPj;uBSq;cN]o!E<(u;ufkq;Z'Jn;?9]or)<Jj
+s&&\i!)WVis%Wep:f1(f;Gg<j;#F2j:]OAk:]aKj;>3od:\mof;>jDm;uKVl;uKVo:CL&u;c-@k
+;Gp+Z8OZ&F3rh>@48_,>48q>D4Zkk+3s%H)4T.DD5!Am-!'^<Fr&t-E55[PK5!M4p4ZttnrB1`T
+4[)%m4[;7s6:!h$5sIY%62j.L56=)762`tQ5s7Fm3]K2W;uT_r;u0Dl;ZTitqc<_ur)ikus&]8(
+r)i>hs&f8%rE/qu!*K5'qH3Mqs&eMgr`T;+oih?!'3J:7:/=SX9MJ8d:/FYZ9MSJe;>sGnF8U.[
+FoHR_GQ2pfH2W'hHiJKlI0+kIJ,XtHJV&K+K7no3L5(J>Ll$tGMi<USNfT6_OcklkQ'IZ%R$a;2
+S"-%@T:hmPUSO``Vl6SpX/rG+YctC=ZaI6N\@K2`]Y;.r_8=+/`Q-'Ab0/#ScHstee'uq"f@\g2
+gtgiEi8N\Uj5oFckNV6rlg4!*mdKW6nac8BoCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcEC_J,~>
+JcC<$M#ZlAqu-Eiq"t$drV?<brqHEcr:U*^rq$0\!3?%"riQ^6Yd(L>Za-pD['[-DZ2V!-Y5bS.
+X/W"nUnjd@gY1B7f@SU(eC2jnd*L"^bfe/NaN)<>`59C-^V@Ip]=PP_\$i]NZa-g>Y-"e+Wi;qp
+VPL#^ToXkaN/Od<W2QPhBkV6uCi+$)CMK'6RWj%-LAm54NV/8,N<#"-O8k=AOoLREPPg[$Q2d$J
+P5^Rm?(7:KQ'%5kN/31AJ:N&qG^+CRIsup#JUi?'JV/T+K7dWC@UNYP@&j44r364&$*1),X/`(m
+USO[`U)or#Tq7jHS!oh6Q]mSrPGaDTNcfPhEcZGQKS>2:M"li+M"HQ%MZ8Y4NVn_9Mi.@fr.kK4
+Ll$tDre:Q2L4k21r.+furdY!"rdaot"G22UJq<lNrIY!#rIP$%re1<(s+CB+qh+ct&VGaiK7ei1
+Knb>9Kmn>pG'S?3FU!#1CMn*1?2\+0>m+M@?=.(:?3":0>lS%.>l@q.>l7h)>l7h+>5VS/>$+p0
+=]nr+>6%k*=oV_(>5qe8=^"s2=B/C&='&L+<rQ))<)lmt;,9nX1&.=<T)"u]TV8'RU&1MWU%P,[
+U\LYbV>d@lVu<LiVuEXpWV3@lWV3@dX8B!pXW+FHZ*L[AZ`^@#P(It&FEMh`V0[H2H$Z'ZX/u<'
+!-A*\s)n<arHJ9ds*=Qhs*OcnrdFfq!.Xuus+(0%rdt6)L&QgILPUeDMMmFPNK0'\OHG]hPE_>u
+Q^F/.R[]h<StD[LTqeEZVPg>kWiN5'Y-5(7ZEppH[^`lZ]=bhl^VRe)`5Ta;aND]Mc-FY_dF6Uq
+f%8R-g=tH>hVd>Nj5]4^k3(sml0@U$mI'H3nF?&>o(2MQp&F^cp\jmeq>^<hqu6NlrUg)?s+13_
+s*t~>
+JcC<$M#ZlAqu-Eiq"t$drV?<brqHEcr:U*^rq$0\!/g]4!0$i8rf6o;!07#;;N-NlMM[1GLPCM:
+K\Y>9g=b*0f%&:!da?FfcHXSVb/q`F`l5m5_SO"%]tCtg\[],W[Bm3FYct:4XK/A#W2HMgUnXPt
+@qTLhJq/8tH[8q$rE]D-#?u4uH"h)8FoHaeHLZ:[GQ<$VHN&9kI._pcIeJ3\If4[&9ltJtEGfZ2
+C1h-hra5k9>[1E6raH%@@UiqZ@Js[EA5lQ.<E)prJVJo5L&HZ3K7\]+J:N,uI=?SBHiJElH2i*n
+GBS+OFE;I$E!:K,MKNTGrau=MDfTt!FoHRaFoQUbGQ)^kG'A.RG'A.TG^'.1"a>38G'8*.Gl2jb
+Gl2dcFo?L^FoQX\FoHF^ErBtXEr9nWErC(XErU4\ErL+]EcZ=$Er0nXFSg+ZEr:"WFT$:\FSg.Y
+FT67gDJa3*C1qBuBk1^b@o<2&s%rhr;H!KmpJV#gqbdDkr_ibn!)ienrD3Jkr_WPjs%ikr:esk`
+;>sDl;?'Jm:Cp8s:f'q`:f1%b:f'n^:Jamd:]F/s:JOYZ:/"5M7mej&L&Hc)L\cc(L]<21L]3,/
+M=ZW$M>W80MtDtsNU2]&O8G%;OoCLYPECl\IW97AC27X.Kl:gCCMeWTLP,SZ!-A*\s)n<arHJ9d
+s*=Qhs*OcnrdFfq!.Xuus+(0%rdt6)L&QgILPUeDMMmFPNK0'\OHG]hPE_>uQ^F/.R[]h<StD[L
+TqeEZVPg>kWiN5'Y-5(7ZEppH[^`lZ]=bhl^VRe)`5Ta;aND]Mc-FY_dF6Uqf%8R-g=tH>hVd>N
+j5]4^k3(sml0@U$mI'H3nF?&>o(2MQp&F^cp\jmeq>^<hqu6NlrUg)?s+13_s*t~>
+JcC<$M#ZlAqu-Eiq"t$drV?<brqHEcr:U*^rq$0\!*&nss&AttrDWet<r5tt<rZ7u<rH#ggtUQ:
+g"4j,e^W'rdEp4bc-4ARaiMNB`PfX1_8!au]Xtbc\@8oSZa6sAYcb+0X/`.tVl$8cU7j@s1,CaQ
+69mat5"%_(r^6WL"#rM8:]=5j;u';k;uT_r;tj2V;u9J];=IH`;uBVp<=)W'1H[f^3]]8\r\b6D
+1,:L80.ne,0etL?1,Jkc%l,jp1H[i`4Zkee7S69E8H)*]8Ou?@rC$uZ6psC16UX=0pHTT\4[)"k
+2EX5q9i4\_:/4bc;Gg:h;H$Ll;Z9Vn;Z9Su;H$Ln<)`cq!E2tr;u]ks;ufkr;Z'Jk;ZBYq<;ohr
+;?Tor;,L0g:]=2i:]F/k:Jape;Ya2h:]OAl;#O8j;#aDk;#=&f;#sKjoMPZfqbmDl%T-"u:f1+h
+;H6Xl8kMZCrAt!?r]C$=s#^3B!BiRE49%AA4T7MD55mYF4[/g/qEFg?rBC6Es$$HG"$A_04T7Mh
+4[21r5s[_#5sIV$5sR\$5X.Lu5sIOu5!V:q5WLha1E]XqqGR>l!E<(r<WH4u=Su7s=R9/j=T)>#
+=Sc)!=T2J#=SQ%u=Qrua>5qb&>5qh,>5qb*<!?#m9MJ2UrD*Vm9h\Ma<)NWm!-A*\s)n<arHJ9d
+s*=Qhs*OcnrdFfq!.Xuus+(0%rdt6)L&QgILPUeDMMmFPNK0'\OHG]hPE_>uQ^F/.R[]h<StD[L
+TqeEZVPg>kWiN5'Y-5(7ZEppH[^`lZ]=bhl^VRe)`5Ta;aND]Mc-FY_dF6Uqf%8R-g=tH>hVd>N
+j5]4^k3(sml0@U$mI'H3nF?&>o(2MQp&F^cp\jmeq>^<hqu6NlrUg)?s+13_s*t~>
+JcC<$M#ZoBqYg?iq"t$drV?<brqHEcr:U*^rq$*ZqlTn$!O&a+ZMq0C['Hs@Z*1@6Xf\\*WMcSg
+Una[`Ti%JTT@VQBeC)alcd'h[bKJ#KaMu3;_ns7*^V7@n]",A\[^EKKZEUR:Xf\Y(WMl_lV50l[
+TqIC(N,#JpV5C#[S!K4RD/=$(C;?O$FErClrJpl:pP]03N/[UmrJpK1s,d5B!KrZEPhhW)PQ-dp
+>]?7%QBmSpNK&dLKS"`(H[:!\Fa\aiJq8E(JqAW-JqSbc@q&hT?XWi=!3uO-%'Qb6XfAG%WMcMd
+Undm_&tbkjSt;IAR[]Y1P*2#pZ\aukrcJ<gI"d:QLB*/(M>rD(M>`;;Mi<USNK0$YNVeY8Mi.Cg
+r.t<.!JcF/L]<&/K7a)R!.b$!!J#b"JGausK)^E%J,k0"K)gN%KDpH&KDgK'K*-d\KS9;VrIY$$
+s+LE)"GDJ_L5,\]re(c4H[Bs^GBJ(PG\h89FDq+a!+#S1s'PY0!+#P.s',J-ra#P/rEK5*qcj)(
+"^G89>Zt;0=92Q.r*'/)rE02+>[./1s',G)!E`G&<Y&86=B8I&<Dupt<DZOg8O!!ArgrnW"JDH^
+U7qLXpS%8Ss.f@b!2]Xk!2oalqksIms/G[k!3,XkpT+1mr2ot$*3ZWQZEpmE[B6?uNdZ+qFE;bc
+UO79-H$uBgX/Q$#rH/'^s*"<as*4QhrH\NlI!kpAs*jutrdY$#K)UB'KSBD["c%njM2I5jN+J!0
+O-#KeP*;,qQ'Rf)R@9V8SXuFGTqS6WUo(&fWN)u"Xf\e2Z*L^C[C3QT\\#Mf^;%J#_SjF5a2lBG
+bK\>Yd*^:jeCE1&g"P08h;7&IiSrnXjlY^gkiqBum-O--n*fc9rpg*]o`"Lbp@n=\q#C0iqYU0h
+r;HTdrdk*#s1JA^~>
+JcC<$M#ZoBqYg?iq"t$drV?<brqHEcr:U*^rq$*Zr/1Q6rJgf:r/Ui<rJ_/CMi3IMM26qAKn]GX
+7Y?;Ef%&:"da?IgcHaYWbK7iH`l5m6_SO%&^:_+i\[f2X[C!9GYct=5XfJJ$W2HMhUnaWWTP8(R
+<e>jMH['^UE,Jrer`f_5P'V+^D/j]Erd4WjpiujcqK`'brH[gW!IK4dIJ\KgII_jeI47lnF`VSD
+D/O0)BP(a_?sm;I>Zb*:@U`hV@Us"X@q9(ZA5uW/<E)prreLN-rIb]5K7ST(It2usI=-BgI!^5>
+H2i*hG5cUjFE2>>DKCMPI;/[o")VpsFT-I^FT?UaFoHR_FT?XbG5c[cGl;gbG62r3GPudbH2Djd
+G6<)6GBNe+!-S6`qK2d[rc8'[rc.sYrGhjXrH%sYp2g1QrH%s[pN-4Rs)\3^qK)XXrc8QiE,KN1
+CM@QuC1CaaARk[:"]82r;H$Nf;ZBVk;ZBVo;ZBSo;Z9Pl;#aDm;#O8i;#a;l:f73gs&&emrD3Gi
+r_Eht:esk`:JO\^;#O2i:'scl:/+GV8kDN>2u87-LAco'LAlu-L]E5/M#N8&MYi8-MZ&J*N:;i$
+NrP+5Nr+n8OSk7?P5^XYOGnm?E,KK+C2\?MDJX$'Dh*Y"rIk,ks)n?br-/0cs*=Qh!df<BrdFfq
+s*t#u!J,k%K)pXZre:T3Ll$tGMuJZHNK9-^OcklkPa.N"R$a;1S"-%@StMdNUSO]_Vl-MoWiW>)
+YHY:;Za@-K\%0&]]Y2%o^r!t,`Q#s>aihlPcHjkbdaQ^rf@S^0g>(N@hr*JQj5]7`k3(smlKdg'
+mI'H3nF?MK!V>s_o`Fj]p\ssfq>^<gqu6NlrUg)?s+13_s*t~>
+JcC<$M#ZoBqYg?iq"t$drV?<brqHEcr:U*^rq$*Zr`/qss&K"s"BAK(='#<%"BJN'=',6!pJk#?
+e^W*sdF$:ccHOJTaiMQC`Pf[2_8*h"]Y(hd\[T#T['R'BYck12X/`.tVl$;dUS4BS1,C^F6U3dt
+4utbc3C?/"5X7Y-5"A7B;,^Bl;u';k;uK\h;XRKZ;Z'Al;YEuV;?0Yo<<#tu2$Q0+4$#A_2uY]G
+2)@!B/hen//28n71GgmFr\P-@0etRJ5!2"l3]fl)8kDSQ7fu=R7n3GG#X_!I6ps@0777&>!($HH%
+6Qd+5!DJ5:ejk^;,U9i;ZBVo;?0Yp;?0Ym;Z9Sp;Z9Ss<)Zaqr)<Vps&K%t!)rkpr)<Vn"]J;t;
+cH`n;Z]io;>a2s:f1"b:ejb]:f1*e;Z'Df;#aAr;Gg7e;,R6fr(d;hrDDoZs&/nqqbRc#<)QRm;
+cZL^8OGj,4$*@&r&Xj>r]CBJ4?P\e3]d7&s#pBGrB('DrBL*ArB:0E'gFlG4[)%m4Zkkj4?btn4
+[24s5s[a75SlXO5sR\$5X.Lu5sILt5!D4q5<:hc1Fr<"s&/nsqc<_uqcNbt!E`M&=RB8k=T)>#=
+Sc)!=T2J#=SZ,!=S,br=SGtr>5VOs>5q_==BA<q:/+MY9i+bb:/+JV<)Z^kr_i]:s)n?br-/0cs
+*=Qh!df<BrdFfqs*t#u!J,k%K)pXZre:T3Ll$tGMuJZHNK9-^OcklkPa.N"R$a;1S"-%@StMdNU
+SO]_Vl-MoWiW>)YHY:;Za@-K\%0&]]Y2%o^r!t,`Q#s>aihlPcHjkbdaQ^rf@S^0g>(N@hr*JQj
+5]7`k3(smlKdg'mI'H3nF?MK!V>s_o`Fj]p\ssfq>^<gqu6NlrUg)?s+13_s*t~>
+JcC<$M>uuBqu-Eiq"t$drqZEcrqHEcr:U*^rq$*Z!:fof!j8`2rNcC.s0;U.s/lU/XK8J&W2?Bi
+UBRBcTqJ$Mrgs.[s-cI)cd'eZbK@oIa2Q$8_SX+'^:h1k\[f5Y[^<BHZ*:F6XfSP&W2HMhUnaZX
+TUqaGBWS51VPB]PQB@5eMMZ+`CmMMmH@U_HNrG%;N;e_8N;eb8N;/D3NqAD3OT1ICOoU^DPhqZV
+P`q;8SXZ"3QB78jNeiFBJ:E#qH$FOVIsus!JV&N*KnY,1KnEiE@UNYPHi:;MYmR_<XK/G'X/`.q
+V#I,/U8+KWTV8$MSt2==R?j/%Vj`mCG]n1MGCY@%M>i;/M"ZZ*M"?K%MZ8V8NW"n:NVn_:Mi*Dj
+M>`80M#rKiM#E)3L4t>6K(jiqJGt*#Jq<oQ!eZ)Vrdb*%K`6W(K`?](K)LB&KDL9$KDpH*K7nl0
+K`6W(L&H`,KnfS\&;GmmH@(!^G]n.NG\_)3F)h1c"^G>>?=.(;?N4=/>lS%->lS+0>l@n*>l.b*
+=pnS>>?kB9=BSa/>$Cl/s'#D)rEBD.>?Y68r)j\8<E<.%=BJU*<E3"!<Du^l:/"%RSc,/TT*1g\
+U7n:YT_G/QUAq"aV#R:jVZ3RlVYd7mW2ZcgWW9$kWqi^kXT#@"XragPZEggD['d<MXJVJEH['[T
+FdK.`I!0^ZLS2/WX8]:$FT6L`G5ZXbGlN'fHN/<lI/SHpIXckHJ.$p[JqJ]/KnY89LPYqdAVuD)
+N/`jYO-#KePE_>tQC!u,R[]e;St;RJTq\?YV5L5iWiE,%Xfen4ZEppG[^WcW]"G\i^VI\&_o9U8
+aN;TJbg"GZdF$Fme^i@)g"P3:h;7)JiT&tZjlYail07L!m-O0>mgJXTo()DEo_%nNp@nO\s7u]k
+r;6KkrVcBfJcC<$]DmB~>
+JcC<$M>uuBqu-Eiq"t$drqZEcrqHEcr:U*^rq$*Z!:g#Grf$i9rJpl<!07#;$B0n$MMd7ILPCP;
+r.G'&qgqOnJ:Q"mcHXSVb/hZE`Poa3_SEq#]tCtf\[])V['R'CYck12XK&;!Vl$;dUS=HTSt;KQ
+JU`&nH$4:LD/<s"AmAPHFbtH]E--AOHN&6kHL?(WGlE!WHN/<lI.Vj`IenK_ILJnnFE2A@D/O3*
+B4bWP?j0kB>?G!9raPk;#%D(Q@q0%ZrDiks!+c(are:B*!J?"'JHULQIsleFHl[Q]H[C'aH?a[X
+F`heIEc?8IEIV\9BP2'uF*)\OrcS<dG5cUaG5cX`G5cUfG'A+QFa!b.rHA3b!d8d3r-8-br-86c
+!I/hbFoZaaG5?@]F9HZ,F)c4!ErL(YErC(XEqaYRErC(WFS^(SFT6C^FSg.WFT-=_FE;O&D[L>t
+CM7Ht@UrqZ@fB7/:f:4i;H*Kk!)`Vks&&\ls&&eos%rbor_`Ykr_`\lr)*Jj!`;`hr)!Ais%r_k
+$r0Vq:Jaha:esk`:eq!c!)WYjs%Wns:/4MX9M%fH6Tk=$rJ(9+qM+s(reLQ0reUN0oSWO&qhk?1
+o8N4!pQ#64q2Y93rfI#>rf[/B'9J*)H#RS8C1r*RF)G`-CN=ubL])o*FT6L`G5ZXbGlN'fHN/<l
+I/SHpIXckHJ.$p[JqJ]/KnY89LPYqdAVuD)N/`jYO-#KePE_>tQC!u,R[]e;St;RJTq\?YV5L5i
+WiE,%Xfen4ZEppG[^WcW]"G\i^VI\&_o9U8aN;TJbg"GZdF$Fme^i@)g"P3:h;7)JiT&tZjlYai
+l07L!m-O0>mgJXTo()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$]DmB~>
+JcC<$M>uuBqu-Eiq"t$drqZEcrqHEcr:U*^rq$*Z!:g%gr_rktr)E\r!`rE'r`B,"r`AttoMtih
+8'oT-c-4ARaN2E@`P]R0^q[Us]Xt_b\@/iQZa-j?YH=q.WiE"qVPU)`U7n6OSt.c+5s@Cn4ZYV`
+2`EQN5X@Y!5u(6T<;oep;u0Dl;[$-!;c6Llpeq&h!*&Pgq,7,fs&/Vhmnss#<)cdq<AQg$4ZYVa
+3B&iS2)I*E0J>-Z/H[^_0f/ec))F-,1,1R@4?Yej4utr"8kMZG84Q0@84H)J7K,[\6UX:/77BR.
+5lO%_5<qIu5<q@h4u5f-9i+V_:f("fqbdMn;GpHm;?0Yn;Z0Po;Z0Po<;]Yr<)lrs;ufkr;Z'Jn
+;?9]or`&hp"]SE!;,L0f:]F8r:Jah_:/=^c;>O/l;,U9f;#X;n;G^3h;?'Jg:]+)V;ZBZ3;Gg7e
+;,C(b:Jt(f;GpLo8kVcL6p!Fkq)SL;r]C6F4?WU)!BN=A4T@PE55dSD55d_F4odhE56!eG4psS=
+5!;(n4Ztnj4Zr^-"[,%85X7[85QjA;6:!p:5S-.F5=%Ls5!D+p5!M+i3]&Mg;Z9Sp<;T_r=8Z1t
+<rlE+r)i>hs&f8%rE/qus&f8'qcN\trE/_qr`Ju!r*&u#oih>t'NeF;:JX\Y9hnSh:JOVY9MJJa
+;c*HkrcJ0_s*"?bs*4QhrHeKj!.=`n!e,WKrdYB-JqAW-KS>,7L51TaM.MR&N/WaVO,oBbP*;,q
+Q'Rc(R@9V7SXuFFTqS3VUnsueW2ckuXf\b1Yd1UB[C3QS\[oGd^;%J"_Sa@3a2lBFbKS5VcdC.h
+eCE.%f\,!5h;-rGi8N_VjQ5Oekiq?slg4!+rpL6anac8Bo^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#
+s1A;]~>
+JcC<$MZ<)Cqu-Hjq"t$drV??crqHEcqt:!]s7?0Zs7$3\Xf\c*XTGZ/Z2Cm<Za-j@Yck75Xf\\*
+Wi2ejrhBXkTqS-PTDkG^SHPFNR[KQAQU-q&Q'B8+_SX.(^V.:l]",>Z[^EHJZ*:F7XfR\KWMcYj
+UnaZXTV%gHS"#kCV4sTPR$<VkN/<@SCQ>crH@LU-qMtQ7rf$]3s,?c5rf6T2s,d5B!g8b2r06f<
+!1*#;%?k+hS=#V.OHPT`M1pZ_J.d0UG^"C^J:W9'It30)KS,#3K`5Ep?t!E<Za6sDYd(L<YH4h*
+XK/A#VZ*CkUB70bU&L_bSd:mVR[KG-R^e7SG7&A6IY3N8M2I.GL\uu*M#`G3M#`A'M>iA;Mi<XU
+NfT3]rJg`6re^c6MM_=gre^Z2!JuX1LBiNdKS+l-JV*iOr.+fur.=s$rdkB+JqSf0KS5'YKE$N'
+KDpQ'KDL8uKDgH*K7nr5r.k3)s+gW/(5IQjH?sj]G]n1GDJX31?<piA?=$uGr*KD/r*98+rEKD0
+>[753r*9/(s&oe8>?b?:>$+p0=]nr+>6%k+=TDY)>6.o3r`]5&"'AQ(<rQ5$=8Z&'<)umm:.UqH
+rLWeV"JDH_TqVCWpS%8S!2K=bs/#^l!2o^kqksInk,S<ZpT+FuXKDE'+L&,VZEppF[C*HOZ`Kmd
+K6h]`FEr\9J:)QdH^(,+WiZ3&s)e9`s*"?bs*4QhrH\NlI!kpAs*artrdb$"!.t3&F+f7%L51P?
+M2@+JN/WaVO,oBbP*2#oQ'Rc(R$sM6S=Q7DTV8*TUnsrdW2ZetXKAY/Yd(O@[C3NR\[oDc]t_=u
+_Sa=2`lH0BbKJ/Ucd:(feC<($f@em4gtgiEi8N\Uj5oFckNM0qlg4!*mdKW6nc&([oCW%T!quB_
+rV6Egs8)Zjrqu`no_sFAJcE@^J,~>
+JcC<$MZ<)Cqu-Hjq"t$drV??crqHEcqt:!]s7?0Zs7$0[Mi7Omrf-o;rK$l9$B0n$MM[1GL5(D9
+rIk3'qgnj"JGt&uJGt&tIQYTf_SX.(^V.:l]",>Z[^EHJZ*:F7XfQkrWMcYjUnaZXTV%gHS"#jp
+H['aVEc,Z-BP1mo?#kaNCiOOqH2i3iHN8B]H2MpdH1#t[H[L56IJJ?hII_h/:Ngi#E,fc5Chm]p
+A78kS?!^`;>%1rN@q9%Y@q&tYrabq,"B9f)LPGe^s+CT/JqAQ)J:RWJs*P`5I!^3dH$Oa]G]n4Q
+FE;JCM/m?FC1h7"F*.D,s*4Nd!I&_`FoHR`FoHRaFT?UaGQ)d`GPl^^H22[bGPlXaGQ)adGBWe)
+"E\^,EcM%us)J$Yr,_mYs)S0\q/cLTrH%mYqfDFPrGr!]Fo?F\F8p@^F8p=^DuOV`Ch[ZuARf4\
+A5Z9%:fI0fs&&\ls&&\ls&&bn!`;inr_`\lr_`\lr)*Jj#uOMp:Janb:f1*h;#a<":/=\^:esna
+:JXe`:B"#h;#O/j:/Cja#Ye&f8Ou?;Kn]J[reL<(rJ1E/!/LN/re^6(r/(9-rJU9+nr<F)r/LT6
+pQ,<8qiUoAplcDQM1BVbChd["G(jpRC2.U3J;],8re1;ns)n?brHJ9ds*=Qh!df<BrdFfq!.Xuu
+s+(0%re#9FKnb>;LPUeDMMmFPNK0'\OHG]hPEhE!Q^F//S"#q=StD[LU8+N\VPgAlWiN5'Y-5(7
+Za7'J[^`lZ]=bhl^VRe)`5Ta:aN;WKc-FY^dF-Oof%8O,g=tE=hV[8MioB(\k2tjjl0@U$m-X60
+n*olHncA@Srq-?dp\4X]s7u]kr;6KkrVcBfJcC<$]DmB~>
+JcC<$MZ<)Cqu-Hjq"t$drV??crqHEcqt:!]s7?0Zs7$-Z<W5tt<W,ns<W6%u<s2Q(<``B"<rZ/"
+<qfVm<!#ut<;oes<)`co.E06B_SO"%]tCtg\[])V[Bm3EYck43XAVrqVl-AeUS=HTT:VUCS!lM>
+4qKe93B/rS2)I?[4[DV6;c?Zo;Z9Vn;YF&b;Z9Vo<:j,`;Z9Pl;?9Wmr)!Jm;t*Zb;uT`%2*O,b
+3]]8^2uY]Y2)@!A/MJe//MT":1GgmE1c7*F1G^mO4?Pej3_)b68P/nP!_5dPrC.2a6pj@26pj@1
+77'1%r]q)[5X7Ou5VbPn:/Oe`:/Xqer_r2^r_reorDN\qr)<Vpr`'&"<E)rs;?0\m;uK\p;u]f(
+;c6Ii:esk`:Japf;#X5j;#X>l;?0Sn;?Kip;Gm9es%rkr;,L0h;#jGf:BOEj;,[BjnPTEe;H!Hl
+!)`\k$VsMn:esna;c?Rn;uTAl8O>L"48Lu<48q>D4Zkk+3rqB(rB(-E5!Am-!'^<Fs$$HIr'(*C
+rBC6Es$$BE!B`OE4paA;5X.S$5<qM!r^$NKs$$QM5=#02#sga>5WUka1f@6N;ZKep<rZ7u=Su7s
+=R92j=T2D$=Sc,!=T2J$=SZ,!=S>nq=Sl7t>5_S)=BY<#s&o>)'NeF;:JX\Z92A;Z:Jab]9hnVd
+<)EQls)e9`s*"?bs*4QhrH\NlI!kpAs*artrdb$"!.t3&F+f7%L51P?M2@+JN/WaVO,oBbP*2#o
+Q'Rc(R$sM6S=Q7DTV8*TUnsrdW2ZetXKAY/Yd(O@[C3NR\[oDc]t_=u_Sa=2`lH0BbKJ/Ucd:(f
+eC<($f@em4gtgiEi8N\Uj5oFckNM0qlg4!*mdKW6nc&([oCW%T!quB_rV6Egs8)Zjrqu`no_sFA
+JcE@^J,~>
+JcC<$MZ<,Dqu-Eiq>:-erV?<brqHHdqt:!]rq$*Zs7--Y!:Tif!j8c4qQ^[;Yct:5Xf\\+Wi;nl
+U8+KXrh0CdT:c+S"J)'PR[O/Bs-NbOq3ClBp65H<,F+.#VPL#^TqJ$LSXc1<R$a53Ssbk+NJ`OK
+PA5,fS:#[8MtrD4NW+k;NK!ams,?c5rf7#>rf6f8rfI,A!KrZEPhqZR?(IORQ^!SoO,]!LK7SW'
+I!U$^FanplJV/Q+KS>&3LP1@i@U`bS@/dJMZEpd?ZEUL5XfAD%Wi;hiUnjc\U8+HVTV2:Us-jFb
+Jt]rEGB\4RI>!E8repf6!/^N-rJCQ3!f;elnqm=&s,7#=O,j4#!07&<r/CW4"Gr"mLku"ds+g]4
+M#E)3L4t;6KDgE#Jc1,uJc13#KE$N0K7\`.KnP,5KnTAVrIk3'qLnd!!/1?*re(9*q1es)r.b?.
+LPPk`'Rb@UH?aXVF`)&4CiWfe>[C`E?XN_;!+#J,!*fA+!F8t.>Q%h)>Q7n)>6\85=]eg0>5VS)
+>5_V'>PhV'=oVS*<E<0"=92K(r`'2&<Dumq:JFFZT(no\TVA0SU&:SXU%Y5\U\LVbV>[7kVu*@h
+VZE`qjf86ZoW/%prN6I1Yd(L>Za@*I[JdNJXf7nTIWp!XFaT%AI<fs]J=W:4X8T1(FEM_LG5ZXb
+GQ<$fHN/<lI/SHpIXckHJ,t4Qrdt6)L&QgKLPUeDMMmFPNK0'\OHG]hPE_>uQ^F/.R[]h<StD[L
+U8+N[VPg>kWiN5'Y-5(7ZEppH[^WfX]=bhk^VI_'`5T^9aN;TJbg+M\dF-Lne^i@)g=k<;h;7)J
+iT&tZjlYail07L!m-O--n*fc9o()DEo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s185\~>
+JcC<$MZ<,Dqu-Eiq>:-erV?<brqHHdqt:!]rq$*Zs7--Y!UksFN;eh:Nr>"=Nr=q;N;e_<MM[.E
+LAlo*KE-Z%JcUFQrI=itrdXfoqgJ<gpj43&AlY_(UnXQUT:VUDS!o_3QZdLmDJj3&AnGpcA8H[0
+E,tl%!.+Wks*F?`s*4Ngr-83ds*FZiq0E$fr-ABjI.Vj`If"QbIM>P#F`MJ@DJa6*BOkU^@:*>I
+>Zk2.@L?XUA7K.[@q'"[Ac5X/<<%^RLAlo+KHu/%JqAN'It)oqI!g?iI!^0bH?ja[GBS.OBR#A\
+C2.EsE--4!H2i-hG5c^_Fo6F_FoHRaFT?UaGQ2jdG5umeGQ)gfH$K12q02m`rHA-`"*Sm4G56:[
+F9$C[ErU.ZErU1dEcZ;BEcZ;BEr'kUErC(WFSg.UFT6LYF9$I^FT6F^F9H`.F*)R(FqAV2DJa3*
+C1q0f@q9+I;,C3d;ZBVl;?0Sk;?0Sn;ZBSo;Z9Pn;#X>k;#O8k:^']m:JXear_WVls%r_k"\qii
+:esmd:^9cm:ejb]:Jh!c$VjJn:/4MX9M%cG6N)Z<L\cc'L]</1L]3,.M=ZW'M><&.Mt2huNVJP2
+NVnh0O8k=>OoLU<P8'+<L44,ZChd^(G(jmPC27a;J;AsYKEQC>F`qs,GQ2mfH2W'hHN8HlI0+kI
+J,Xs!JV*lR!JH1+L3/3,M2@+JN/WaVO,oBbP*2#nQ'Rc(R$jD4S=Q7DTV8*TUnjlcVl?\sXKAY/
+Yd(L?['mEP\[f>b]tV7s_SX71`Q-'Ab0/#ScHstee'uq!f@\g2gYL]Bi8ESSj5f=akNM0plKdg'
+mI'H3nF?)?oCV\So`Fj]p\ssfq>^<hqu6NlrUg)?s+13]s*t~>
+JcC<$MZ<,Dqu-Eiq>:-erV?<brqHHdqt:!]rq$*Zs7--Y!:Tnds&K%ts&K"u#$4i+<E3+%r`0)#
+<`]3"!*8hor`&nrs&AnpoMYN_q,/Cf.4_9kUnXQUT:VUDS!o_3QT[Dk3]K#U1c%3X77KgD;,d?i
+r_iepr)3SppJ^odr_reqpJV,m;cE?e!)`\m!`;inrDE#]s&0>*1d4#a3]T2]2`3KNr\F^3/hen0
+/cIL*1]B622?#E31^-$)4?bhgr_!2^r^d&Z!(d&X,Xk*g6UX7-770L15!VA!5sRY"5;bVh7o)lV
+9iP%i;H$Oo;cE3as&8qqr_reopJV&krDa&$<E3!s;H!<hrD`eqrDWnt;,L.cr_WVls%r\js%r\l
+s&/ko"]A8t;,U9f:]XEkqbdAiq+h2k;,L4h;,R0frDWYms&8qqr)<Sl"&Mcg:]4*#;,:%d;c6Rp
+8kquO6omCiq`=a=r]C3E4T.>A3rD,?55mYF4[/g/s$$EHrBC3Dr&uYp5!D+m4?Yhi5!M4p5=%M"
+5sIV"5=%V%5<hCu5<qFu5<_=r5X%=r3]T5Xr_iesr)Wi!r)ihtqH3)e!*K2$r`K"us&f8'rE/ht
+s&ettqcNc!q-!c$rE'&&qcWu&pKIQ!&QVh-:/+GU9i+ba:/+JV;H$]q;?V)aF`qs,GQ2mfH2W'h
+HN8HlI0+kIJ,Xs!JV*lR!JH1+L3/3,M2@+JN/WaVO,oBbP*2#nQ'Rc(R$jD4S=Q7DTV8*TUnjlc
+Vl?\sXKAY/Yd(L?['mEP\[f>b]tV7s_SX71`Q-'Ab0/#ScHstee'uq!f@\g2gYL]Bi8ESSj5f=a
+kNM0plKdg'mI'H3nF?)?oCV\So`Fj]p\ssfq>^<hqu6NlrUg)?s+13]s*t~>
+JcC<$MuW5EqYg?iq"t'erV?<brqHHdqt:!]rq$*Zs7--YrpTff!j8`3riu^4ZEga>YPt[3XfSV)
+WMcSfU8+L^U&UbaT)YA]S,o(Hrg<\Os-EPIr06o=rK8FrMh..JLngZ;T:VUDS!ob4Q^3o)P`Cf_
+M2@F]F+Tg(H@^s5pl>62!0$c4!0$]4q2Y93rfI/Bs,mAGr060*(L:@<S=,b/Octf`LkCA3JU`,o
+G^+F^JGt*,K7no4Knb;7@UWaF@/tZRZi@<9Yd(I;Y,nb+ri-:'Unj`\USFQZT`1YbSdh6[S$ScU
+TQtj0GCY=(rf$i7s,-i5qM>*,r/(N3MY)c)M?AcqNK3pt!07#;rf$l8rJLK/reUT2rJ1E,s+CB)
+rIY$"r.+fu!J5t'K)^H'K)UB)KS>,5re:<(s+C<(re($"rdt3(qM"a#!/CH-!JlL0L])r>KnOl$
+H?j^TF)>c.DMMM&>[IA9rEfJ/oj%E!rET8)r`TJ1>?b?:=oMM)=^##->6%k*=oV_*=o_e+>5h\)
+=9)G%<rQ21<E<+"<)lms=&;[bSt>_L"JDK`TqVCWpn@ATs.fCcs/#[k!2oalr29Rnjf89[nuMhn
+rN7ELYd(L>Za@*I[^NTO[^W`JVO`ZnG]n4PR%9@fH$=RkTr4unrN?0C!-\<bs*4QhrH\NlI!kpA
+s*artrdb$"GCkI"KS5&6L51S@M2@+JN/WaVO,oBbP*;,qQ'Rc(R@9V7SXuFFTqS3VUnsueW2cku
+Xf\e2Yd1UB[C3QS\[oGd^;%J"_Sa=2`lQ6DbKS5VcdC.geC<($f\,!5gtgiEi8N\Uj5oFckNM0q
+lg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Zjrqu`no_sFAJcE=]J,~>
+JcC<$MuW5EqYg?iq"t'erV?<brqHHdqt:!]rq$*Zs7--YrpTfErf-r<"-8J'Nr+h8MZelmLPCQ_
+L&H]%K)^B%JGt&tJH(,rIf"QhI//+6F(Sft@qDF/Tq@pIS=>t8R$X,(F)Gc0BP1ppE+*R/CN"6:
+r-A<grd4ZkpNca_rd"Bcq0DUYs*F`nomQXbr-e6es%aAQF`VPADf9H,BObO]@:3GI>?P-=@fBj;
+Abos8<<lH6LPLV<KnfS[-%^c$Jq/B$IsufnI!pBiH[9saH$FRXG'8C^Edqk?C2@s4H$Xf6Gm8M;
+GBS1SG5HF[FoZ[aG5cX[G63#5GPudaH2i3iH2DgdGPu^`G5ugbGPQC]F9$C\EWU<&EW0tbF)l;B
+F)l;BF)q/!s)e3[s)e9^s)e'XqK2^ZrcJ-^s)\6`rH/'\s)e9`"*8R,FoHOcF`_g+D[^JuC27?i
+A7T^X:f10e;ZBVo;?0Si;Z9Pn;ZBSo;Z9Pm;#aDl;#F2i;#a>h;#aDm;#O2i:^g,r:Jjqa:Jae]
+:JXgc:Cg2r:JOYZ9h\8Q7m_rbLPP\[r.k0*rJC0(rJC?-rep<*oSrX+qi1Q7oT0!5rK7)BoTKrN
+MM6CqChmd"IXZT\Chmd-J;/gVK`?/pG5ZXbGlN'fH3/G@I/\QoIK4lsJH(1EJqJ]/KS>/8LPUbC
+M2I4MN/`jYO-#KePE_>tQC!u,R[]e;St;RJTq\?YV5L5iWiE,%Xfnt5ZEppG[^WcW]"G\i^VI\&
+_o0O6aN2NIbg"GZdF$CleCN7(g"P39h;7&IiSrnXjlY^gkiqBum-O--n*fc9rpg*]o`"O`p&Ojc
+q#C0iqY^6ir;HTdrdk*#s185\~>
+JcC<$MuW5EqYg?iq"t'erV?<brqHHdqt:!]rq$*Zs7--YrpKhdr`/qss&B)#<W6%u<<6-%rDir!
+<rQ,!<qo\n<<#ks<;KPe;YX,h;?0Sn;BdY@-o*>*US4BRSt2C@R[KP0QBaKk3&``P1HIQ`77U0O
+;u'>g;uTbi;uT\l;uTbf;s[E^;=7?^1^?3,4?GSa3]I$q%5Tgs0J>(3/hJh61Ggre2?,K61Go%m
+#<k158P2TH8cD9[8,Ym]779L26pj<?6lJ?T5sRY#5<hCk4u>l/:/=V_:f:4j;H$Oo;t*]b;ZK_p
+;uT\f;u0Jt<)Z[n<)ico!E<(p<!?2u;Gg:fr)*Jjr_NJis&',":f1(g;Gg=hqbR;j;Yj5j;#=#m
+:esk`;,L6j;>X8h;uT\p;uT\n;[-,s;,C(a:\mlh:Jjse;@$;r8kViI3]];!3r_;@49@Z.4T.A>
+497T/rB('DrBL9Fs$-HGr]U3D!^/_2r]L]Q4Ztnk5<_7q5X.P$5Q*h`6:!k$5sRY"5<qFr5X.Lu
+5!M7l3&=N6r)Nf!qcNbtq,m#es&f8%rE/nt!*K2&r`Jqur`JntqcNf"pK@Q"rE'&&rEB2'pKIQ!
+'3\L>:JX_Z:/+_g:Jak^9M\Vd<;]YoFT?U`GQ2pfH2W$jH[L5?IK+`rJ,XuuJTl]uK7no3L5(J>
+Ll$tGMi<USNfT6_OckomQ'IZ%R$jD4S"6.BT:qsQUnjibVl6VqX0&M-YctF>['d?O\@K2`]Y;.r
+_8=+.`Q$!?b0/#RcHjncdaZdtf@\d1gYCWAhr*JQj5]7`k3(smlKdg'mI'H3nF?MK!V>s_p&F^c
+p\jmeq>^<hqu6NlrUg)?s+13]s*t~>
+JcC<$MuW5Equ-Hjq"t$drqZEcrqHEcr:U*^rq$*Zs7--YrU0aSriH:*Yd(M5Ylh;:Z*4/0s/cI+
+X/`+qU\pkcT`CbaSckUSS=>rFR/N?OQMd$GPkL==OsQ3DR>lljStVgKSt):>R@'>,Q'@JqNJ`UL
+M3Dk&ST]=0M2[FRpl>62!0$f5s,?c5pl>02s,d5B!KrZDPlI$KQKOMW?<j%mR[BD'P)kQYLOt&,
+IscWfG'8IhJUi<'KS+o2KnP-Y@fBd9VuF%&Z3RY?Z*:C4XfMH$+K205U84QYU8+BUTqS*NSsu7[
+MKX8hG^P$tO,f3YNK*pr$&a[uM2@%EM26udM>2u%M>rJ4MZJcrqN(T7rf$i7s,-Z0s+pZ2reLN.
+!JQ4+K*?jZJqAQ)rIFlurdtK.K7ec-K7nr5re:?+r.G-*KS9>WoS!6ure:H-LAH`)L]</1L]3)0
+L])u-Kc#PuI=-?dG]e7MChmp.Dd6UU?sd8I?<pn9?1qP$>Q%h)>Q.e6>[(E;>?Y-3=BSg2rEK;*
+r`KD/>Zt?8>Q.h*=TV].=T2A#=92E'rDiks"'8>q:&1CaTV8*SU&1MXU%P,[U\LYbV>d=lVu*@h
+VZE`qjf89[o;qtorN6C/Yd(L?Za@+;[JmW7[hPs@SV_]=F`r%dTS7c<GC,XOY,eN"XoWZgrHJ9d
+s*=Tis*Ocnrd=isIt.HJ!J,k%K)pXZre>NMLl$tGMi<USNfT6_OcklkQ'IZ%R$a>3S"-(AT:hmP
+USO``Vl6SpX0&M,YctC=ZaI6N\@K2_]Y2(p_8=+.`Q#s>aihlPcHjkbdaQ^rf%8R.g=tH>hVd>N
+j5]4^k3(sml0@U$m-X60n*ol<o(2JFrq-?dp\4[^s7u]kqtpBjrVcBfJcC<$])R9~>
+JcC<$MuW5Equ-Hjq"t$drqZEcrqHEcr:U*^rq$*Zs7--YrU0aSrf$i9rJgl=qi(i>Mi3ILLPCQ^
+L&Qc*KDgE%JH16!J,XutJ,OinIJ8-cHQm36E+`^(G+kS#St):>R@'>,Q'@JqC1h0jAoD*jHYRA:
+Gku^cHN&9kHMVpaGlE!dGkcRVH3&A?q0i9lrdFWlr-e9f(/IYJG&qYCDf0E,BOtX]@:3DJ>?P-?
+r*p7J@q0%ZARneA<E<*uJ;8pZK`[!^K`6TIJV&H'J:E#rI!g?iI!^3dH$OXZGB\+`F)#N*C2S*8
+H?oI8r-89er-/0arH7jXs)e<bqKMd\r-A<grH\9br-&$_!-\<bqK;dZ!-A-[s)\-Zs)S0\rc8Wk
+F)uABF)uGFF)uGEEcQ5BrcAHhFE;JCF*)MFF89qXFo?F\FoQXaFTur/F*)PIFT-F]G5l[sFEM_F
+E,KQ0C2RWoA7K.Z;,d?i"&Vrn;>*oe;?'Po;#jMn;>sDl;>sDi;?'Go;,:!c;#aDm;#X6%:/Fb_
+:f("c:JXe_:/=\^;#X8j:('im:/+GV9h@iFLPP_\qhP**rJC-'rJC?-rep<*oSrX+qi1Q7ooK*6
+r/q#BnWOZLMM-.kChmd%G(k!UC27X4Jr#58rIb2oG5ZXbGlN'gHN/?lI/\NqIXckHJ,t4Qrdt6)
+L&QgKLPUeDMMmFPNK0'\OHG]hPEhE!Q^F//S"#q>StD[LU8+N\VPgAlWiN8(Y->.8Za7'J\%&u[
+]=bhl^VRe)`5Ta:aN;WKc-FY^dF-Lne^i@)g=k<;h;7)JiT&tZjlYail07L!m-O--n*fc9o()DD
+o`"Lbp@n=\q#C0iqYU0hr;HTdrdk*#s185\~>
+JcC<$MuW5Equ-Hjq"t$drqZEcrqHEcr:U*^rq$*Zs7--YrU0aSr`/qsrD`o"<EB*!!*B,"r)N\r
+q,RDn!E2nn;u]hj;Y![,;Ca.O/hK+DTqJ!KS=?"9R$X,(P`q7h2`!6H3^cD-r_NSnpepufr`&\l
+!*&bmqc*2doMY]fqbmDjn59cQ1d4&c4$#A_2`<NO1,Lcc0EWpZ/Md8\"#Mkl2>o?;4?Yej4uu/(
+9)_E]8H)-X7K>mT6j5qE6pj7)r]gu[5X7+i7o*#W:estf<)Z]l;tNrf;>jAo;c6Nm;uT\f;u'Dr
+<)QXo<;fbh<;oet;Gg9g;#jGl:B45i;?'Po:]jQm;c3Nlqb[;jqG@5hrD*bs:Jah`;,L4h;,R0f
+rDW\n!E2to;[$&r;,C(bpJClc!`2`kr_j&&9hJ&M:..,>3r_;A4T@PE4T%;=49.SD49.SD5Q3kH
+5Q3hK5<_4nrB:9G5!Js/"$A_04T%DB5QF.M5Sl^O6:!n%5sRY"5<qFr5!M4q5!M=o3B@"<!*B/%
+!EiP%=8H%c=oVV'=8c7u=8uD$=oVUu=oVUt=o2>"=nl2#=oMP'=oV\'=nc)"=oDG:=]e^":eaVY
+9hnY^:ea_[:/k1k:]4/lFa!_-s*4Qhrd+Tks*Xfo!e,WKrdY$#K)UB'KSBD[FGG[/M2I4MN/`jY
+O-#KeP*;/rQC!u+R[]e:St;RITq\<XV5C/hWN*#$Xfen4Z*UdE[^WcW]">Vg^V@V%_o0O6a2lBG
+bK\>Yd*^:jeCE.%f\5'6h;-rGi8N_VjQ5Oekiq?slg4!*mdKW6nac8BoCW%T!quB_rqQNhs8)Wi
+rqu`no_sFAJcE=]J,~>
+JcC<$MuW8Fqu-Eiq>:-erqZEcrqHEcr:U*^rq$*Zs7--YrU0sYmB*LnY-@i/!j])8riZ:'"g"c)
+W2HHgUApnfTV)1SrgWtWr0[JM!1*PJ!L/lJPl?mHPl$[COs6*DP`LZRTU;%*St2@?R@'A-Q'@Jq
+OcYW\LluV!N-'DuLAm/3NVJP2NVSJ4N;eh:N;eh3NW>.>NrG+=OT(@CP*>g.rg!JKo9K?AqN_(c
+*1`UfQBdPnO,f*OK7JH#I<p-\Fb#$pJV&Q.K7s5X!/1>\s'ZCF['R'EZa-jAZ*:F6XK2?#)5sF-
+U84QYUnOHUTV8!MJWHmuG^F^`JqK']O8b.>NW+n9Mu8G3M#E2*MY;l,MZ/P6Mu\n9Nrb?'rJgf8
+repc5qhb?/s,$c3reCQ0KnT>U!J5n$JGt*"K):0&JqJ`1q1eg#s+UH)re19)qh4s&rIt<-q2#'+
+r.tB0!/UW0q1]W6I<p3bG'.b@Ci=?!?!^oH?X@&E?N"1'>l7h(>l@n+=pnS>>?kB9=BSa/=^(f/
+!a8f3r`KD.>[(E9>Q.h*=TV].=T2A#=:8/2<E<.#<)cps:JCYX"JDH_U7qIWq4[JUs.f@bs/#^l
+!2o^kr20RoWTC/ZX8AsuXnf'uXo5C+YHY:;Za9Y<"1>MD[JmW6[hZ3MSsb1VG]e4fPb`bUH$Fe/
+Tt.5)rN6-DrHJ9ds*=Tis*F`nrI"]qJ,XuuJI-p\K7no3L5(J>reYcTMi<USNfT9aP*2#nQ'I]'
+R$jD4S=Q7DTV8*TUnsrdW2ZetXKAY/Yd(L?['mEQ\[f>b]tV7s_8=+/`Q-'Ab0/#RcHjnce'umu
+f@\d1gYCWAhr*JQj5]7`k3(sml0I^&mI'H3nF5u=o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+13\
+s*t~>
+JcC<$MuW8Fqu-Eiq>:-erqZEcrqHEcr:U*^rq$*Zs7--YrU0jVm>R#%NW"n;N=1])NJrgSMM[.E
+L5,\]re19'rIY$"rdXlss*surrd=cqrI+Zms*ainqg0Q(@VogjAp/-3C7^ucS!fY2QBd\uP*(ie
+An>jdB5qU%EclX&H2i3iHN8BiH2)X`H2Mp^GlW0iH2)[dH[PX;rdOlqqgSHkpO4Vf9m1Z"EH,l5
+D/3ir@preQ?X6l=>%;&Q@qB.\@q9(ZAS"kB<E<'tLkgcaL&Zi*K+*<_JUr?$IXQTlI=-GAH4G1F
+G^3b;JU;*ICMe*5GkuaaH2i-eGQ2jbFng.[FT?U\GPZR_H2`-gH2MmiGBS1RG5-:]G5HF^FT6F^
+ErU4YEWU<&Er0nXErL.YF9?T)Ec_/#"Eeg,Ec^nqs)n9^r,i!_rH8'\rcS3`!-eBbrcS3`s)8<`
+DJa-+@q9+]A5N,#"&Vrn;>*oe;>sGo;,[?is%r_mr_WMis%ikr:esk`;>sAl;>sDl:Cp8s:esna
+;,C%a:esh^:espd:B=3dr_<Vk:/"5N8,@u<L]</1M>i>0M=ZW(M>2u.Msu\uNVAJ1NW+t8NrY:=
+O8b7>OoLU4P7s"4JobjHC28!>KQ1jFCM\NQN/%7`!-\<bs*4Qhrd+Tk!.=`n!IfOtJH(0,JqJ]/
+KS>/8LPYqdFc)*9N/`jYOHG]hPE_>tQ^F/.R[]h<StD[LU8+N\VPgAlWiN5'Y-5(7ZEppH[^`lY
+]=bhk^VI\&_o9U8aN;TJbg"GZdF$FmeCN7(g"P39h;7&IiSrnXjlY^gkiq?tm-O--n*fc8nac8B
+o^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#s1//[~>
+JcC<$MuW8Fqu-Eiq>:-erqZEcrqHEcr:U*^rq$*Zs7--YrU0jVm8[0a<;okt<rH%u=8l7t<W6%o
+<W5qu;c<Kk!E<"p;?0Yo;Z9Pn;YO$5.jm,*/2fFF2)1\nS"#h5R$O#%PEM&iO#&UR5t"4:;,U=k
+pJUler`&eorD`Skqc*2doMYZerDNPjo25]I1d4&br]1QM2`<TP1c-p@1,(=4/i#3]2#fE61cG=i
+#r=\,4?bnh8P)PR8cM?]7fc.NrC-cUr'UTR6:Cf='0e`H5qP2^7nurY:fC4g;H$On;YsDm;?0Yj
+;ZBVn;ZB\q;ZB\p;Y<ug<;ff"<)lpt;uTbp;u]eu;cH]m<<#l!<)Z[mr)!Gjr_NJis&'%u:f("e
+;GmEk!)`\k!Dubj;#jGk:BaQl:esnbp/:fes&&ns<)i]ms&&hoqb[8hqb[;g%8]qu;G^7k92%uM
+9fY633r_;A4T@PE4T%;=497W/r]CKN5<h=q5<_7q5Q3kH5Q3hC55m_F49@Z.4oIPU5<qG"5sR\$
+5XIb&5=%P!5lO"J4pXA:5s@Lu3]T2!<rH,$=]kT'q,lud!*K2$r`K"us&f8'r`Jnts&ettqcNi#
+qcWu(r`]>)r`JqupK@Q"rE'8*=]e^):/Cj`#Z4Ds:es\W9N(jg!)WVl!-\<bs*4Qhrd+Tk!.=`n
+!IfOtJH(0,JqJ]/KS>/8LPYqdFc)*9N/`jYOHG]hPE_>tQ^F/.R[]h<StD[LU8+N\VPgAlWiN5'
+Y-5(7ZEppH[^`lY]=bhk^VI\&_o9U8aN;TJbg"GZdF$FmeCN7(g"P39h;7&IiSrnXjlY^gkiq?t
+m-O--n*fc8nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#s1//[~>
+JcC<$N;r>Fqu-Hjq>:-erqZEcrqHEcr:U*^s7?0Zs7--YrU0sYmHs8BY-7],!O/d,Xp2#0XK&7t
+V>?ngTqJ'NrLO+^S=5lER/N?OQMm'KPl?sHPQI&5Pl$[COsHHTK9V%FTUV:-LQ.:_R[BJ.Q'IPr
+OcYWaNKS7&Kop_3KT(lgNVAJ3NW4t6Mu&D3NVeb9NVeb9O8b7@OoLREPPg[FQ2R$@Q2[*IPr;lO
+St2::P`_)hNJ<7CJqAH"H?jXVK7JN(JqSi1KnbA:Kk"S$?t+AeZEpjCZE^^?Yck11X8]+"W2BNg
+"JVZbU8%X[$(7*oR!F+,H\%%QNr>"CNfT3[NK0"tN!5)qMM[1Gqhb3-!K2j0M>rJ4MZJcrr/^l>
+!0@,=r/:W6rJLK/"c/"mM26udLB<3`K`-Q'JcLB$J-:FTJUrFPKE$W)K*$^\L\cc)L&Zi+K`Zp[
+KDgK%L&H])L&Zo+L\Zc+L\uu-M#rKgL\ZZ9LPUe;I!U*`F`;27CiGD??N+@3?N+42>[@&.qcj#(
+r*02)r*'A/=BSa/=^(f/r`];(!a8f4qc`r$s&f8$r`B;)<`N.#r_ru#=AVckTDtVbU&^naT_Y;S
+UAq"aV#R:iV?!OlVYd7kWT:)YX8T.!Xnf'uXo5C+YHbC=Za9S:!4Dd6rjVp;'s=I*OaVP!G'grn
+OaVP"HAJ8gZDt#)Y5NSEGlN'gHN/<lI/\QoIK4lsJ,t4Qrdt6)L&QgFLPUeDMMmFPNK0'\OHG]i
+Pa.N"Q^F20S"#t?StMdNU84T]Vl-JnWiW>)YHY:;Za@-K\%&u[]Y(tn^qmn*`5Ta;aND]Lc-FY^
+dF-Lne^rF*g=k<;h;7)JiT&tZjlYail07L!m-O--n*fc9rpg*]o`"Lbp@n=[p]1-hqY^6ir;HTd
+rdk*#s1//[~>
+JcC<$N;r>Fqu-Hjq>:-erqZEcrqHEcr:U*^s7?0Zs7--YrU0mWmHs8!r/L]9rf%8DNK&mTMi!7F
+L5,\]re16&rIY'#!.b&urdautrdOiprdOfo!doEEqgA?h,]I@)Ch%%#FDkl(Bkj-+R$a2)Q'7An
+OH5E]DHULfHu!\CG^0"/s*F]ls*FZimWe>KqKi0g!.=WkrI+`pqL8BkpjNWH9m1Z#Ec>o6ChmZp
+raQ.>?<pf=>%IJ>s()+?%TQP0<E!C_L51J:L4t;6rdt6&K)U<;IsufnI=6KjH?sp_H$O@NML0)T
+CN+?:rd"?dqKW'crHJ9br,qm["F#$3Fa!V*qKVp`s*FWhrHJNlG^"=TG'<Y)s*"9^!-J0\!ci@'
+rc8$[s)S'Zs)e3\r,`BhEcQ8DF`__JFE;JDF7s_TFoHL\FT?U[FnU"YFo?L`G6W&+DJj<,C&MQB
+HhgPA;,U7gqGI;jr_ibnr_iVjs%r\lr_WSkr_Nbq:esk`;>O,h:D$>t:f'qa;,C(b:f'n^:JXe`
+r_EPi:]=)m9hnAX84`]6qhP3-!f;_hrJC*&s,$N.s,6B*oSrU*qi1T8rK$r>r/^i=rK7)BrK@5G
+oTT<<'p4H/HuNt>CM]AgH>dV7CN=uXMhQl`K`-,pGlN'gHN/<lI/\QoIK4lsJ,t4Qrdt6)L&QgF
+LPUeDMMmFPNK0'\OHG]iPa.N"Q^F20S"#t?StMdNU84T]Vl-JnWiW>)YHY:;Za@-K\%&u[]Y(tn
+^qmn*`5Ta;aND]Lc-FY^dF-Lne^rF*g=k<;h;7)JiT&tZjlYail07L!m-O--n*fc9rpg*]o`"Lb
+p@n=[p]1-hqY^6ir;HTdrdk*#s1//[~>
+JcC<$N;r>Fqu-Hjq>:-erqZEcrqHEcr:U*^s7?0Zs7--YrU0mWmHs7?r)EMm!EN;$<r5nr<qfVo
+;ufkr;Z0Po<<#nq;Z9Vn;?B]n;YO$9/LW&%.kWkA2)6g?1n0r$R$O#&PEM&iO,f2[/42g":Jane
+;cH[oq,7)g!*&kpqc*Aiqc*2doht`erDNVlo2>TEs#h#X4$#D_2`<TQ1c$m@0eb74/i5?]1_)B"
+1c7*H4$>\h4[)G/9)_E^8-;@Q84WVJ"@Y^I6q%#A&4AfL5sIV"/j;Hh:Jak`;c<Tl"B&/s;H!Bj
+s&/kq"&`&q;uKVn;?'Mo;uT\p;u]bf;u]hr<W?%u<<H3!<)ifpr`&kqqc!_t<)cdo;Z9Pn;?Kcm
+:Jh$fr_`ns:f1+g;>sJm;?'Go;,U<f;?'Jm:]F5n;,C(dp/:fer_`bq<;BGo;Gg<h;#X>h;#X8j
+:^g3!;,U:k;bK_U8PD/B3rV5@49@Z.4T.A>497T/r]C6F5!Ss/r]gBG"$\t44o.AB4o@DE5!M4p
+r]gEKrBLHO5s[a55lNtT5!V:s5!D4q3BC4?=T;M(=Su7s=R92j=T2D#=Sc)!=T)D&=S>kt=S5ho
+=T2J%>5hb*>5qb)=T)D%=9)Lu>5qb*=T2D%<rZ>:=&_si9hnDk<)6:b9h\>^;cH[lrDNT<s*4Qh
+rd+Tk!.=cos*artrdY$#K)UB'KSBD[Dhj.*M2I4MN/`jYO-#KePE_>tQC!u,R[]e;St;UKTq\?Y
+V5L5iWiE/&Xfnt6ZEppG[^WcW]"G\i^VI\&_o0O6aN2NIbK\>Yd*^:jeCE1&f\5'6h;-rGi8N_V
+jQ5Oekiq?slg4!*mdKW6nc&([oCW%T!quB_rV-BgrqcQirqu`no_sFAJcE:\J,~>
+JcC<$N;rAGqu-Hjq"t'erV??crqHEcr:U*^rq$*Zs7--YrU9dS!:BdP!O&a(Ym[e>Y-+n.XK/A"
+V5*p^"JMK]T:c+Ss.'.ZrgEbQrKdMMrg!MJrg!>EqNLrB,b0jIP_b$bS=>XsN/Wb!R@'>+Q'7Ao
+OH5E]N.0I/TR2*>NK!aopQ#64rf$c5pl,33rf6o9r/Uc;s,d5B!KrZDPlI$JQLpIAQN!-u>[(L*
+S=>e0OcYWbLkgV6IsuinGBJ([Jq&B'K7nl2L5(D9@q&qU@[I#!riu^4Yck42X8]+9WMcPdUSFQX
+Tq\6TT;/(#SU#U3ItW`BO8b1:O8Y(DNJrjUMi!=KreUW4rJCE/!K2j0M#`G4MuS_9NVeb;OH0="
+r/CZ6s,-T.",_qkM#E)0L4oMX!ec/WrIG3*K7SW,KS+pVKEHj]L55_^s+^`3KnY25re:B*!/(9(
+re1?,re16(r.k$&!/LQ0r/(E/q1em*'T.g$H['a[HZO(@BlK/>?XR8K?=*V:!aK#:p0@N""'f,:
+>l7h*=p8/8>?kB8r`B2(>5_\*>5_V(>PhV&=oVS+=&r@'r`Bb4<`N1"<)Zat:JROSTq\9TU&1MZ
+U%G)ZU\U_cV>d=lVu*@hVZE`qm&C&dqPsOqriH+$poFItr2p1,Z*L[ArNlX4['fnArO;g:(:h#Z
+UR['dH?OOaNhV/SH?X\"UoCDsr3$$Cs*+NhrH\NlI!kpAIsulsJ:N3%JqJ]/KS>/8LPUeDMMmCO
+NK0'\OHG]hPE_>uQ^F/.S"#q=StD[LU8+N\VPgAlWiN5'Y->.8Za7'J[^`lZ]=bhl^VI_'`5Ta:
+aN;TJbg+M\dF$Fme^i@)g"P39h;7&IiSrnXjlY^gkiq?tm-O--n*fc8nc/.coCV\Jp%J+Rp\ssf
+q>^<hqu-HlrU^#>s+13\s*t~>
+JcC<$N;rAGqu-Hjq"t'erV??crqHEcr:U*^rq$*Zs7--YrU9dS!:BdPr/LZ8$]U+(NJrdRMM[+C
+LAlo*K`6W'K)U<$JGt&uJ,t.MrdXrsrI+ZoqL/3fs*H#4B4>^hA9E!7Ch@BqC4_k@Q^*i"P*1of
+NfB!'WL\HQEHHJNp3?[bHi89jH0okKH22aeH[PX;rdOlqqgSNmq0j5X:/5tSFE);<D/4!%AR]+W
+?XI)C>$GKI@V#CH!+c(?rDa,$Fbb^,KnY88re1<(!J,k%JHp^SIXHQlI!km=$[?f<O*tb[D/j]B
+HMr-dHM_shH?jc5GQ2jbFo-=bGBS+OG56@ZGl)adHMr-fGQE)7nTXkQ!-ImT"`e[+FE;O&F96N*
+F8^4ZEs?`/FEDYJFT-=_FEMa&FT$@\FSp:YG5cXXG5cX`G5c^cGRJS3Df9N0Bk:daA:+/NrDESm
+!)`\ms&&eor_`\nqbd>hs&&blrDEMis%iDdr_EMhr(m_t:esk`:/4S\:f.-e!DZGi:B+#l9MJ)K
+L5,V]s+p]3s+pW1o8<R)pPT!/n;R"!pl>31rf6u=rfI&=rK.#@rf[5D!0m)=r/q_MKm7NPChn*:
+LN.3KCM\9KLPLT]K`62qGQ<$fH3/G@I/\PDIXcitJ:W9'K7ei1Knb>;Ll$tGMi3ORNfT6_Ocklk
+Pa.Q$R$a;2S"-%@T:hmPUSO``Vl6SpX/rG+YctC=ZaI6M\@K2_]Y2(p^r!t,`Q#s>ai_fNcHaea
+dF6Uqf%8R-g=tE=hV[8MioB(\k2tjjl07O#m-X60n*oi:s7-Heo^qhLp@e7TrqQNhs8)ZjrVZZn
+oDX=@JcE:\J,~>
+JcC<$N;rAGqu-Hjq"t'erV??crqHEcr:U*^rq$*Zs7--YrU9dS!:BdPr)EPn!EN;#<r>ts<qfVo
+;ufkr;ZBZ";H$Ln<)Z`o;Z9Vk;YX*7/LW#%/1ik@2`*0C1c%OfR$X)'PEM)jO,f3Y.:5V9:/Y"i
+;uTbr;u0Da;u]eu<E)rm;uBVe;tNue;uKVl;>3ri2)@)g4oRJB3W:rL2)I*D0JP76/M8e71GgmE
+1c>1f#Wk.24Zl)'8P8tRs%!5^84Z8L7fGgj7RTU26ps=,5X@[h4[)D5:f1+h;Z'Dg;Z0Mo;Z9Sp
+;Z0Po;Z0Go;H$Nn;ZB\q;Y<uf<;ons;ufqs<;fbp<;ohj<<#nr;$9fq;G^3g;>sJm;?'Mo;>sJl
+;#jGl;YX,f;#X;l;"RZa;u]_r;cNQks&&hoqb[8hr)!AgrD3r#;G^4h;H-Rf92/#P3W2#;3rqH,
+r]L0Ar&b!C55dSM5!M7q5!;(n5<o-2!C&dI4o7GB4oIJD5!T$1s$-NL$p[*D5X@_&5X.M!5=#34
+!'^BI$9gU;5<1]*=BSa.rE&esn6#`nr`T8'r`B&#qcEf"r`T5&l<3scr`T5(r`f>)s&o>'r`T5&
+s&o)"s&f>(rE'#"s&B_8=B86p9hS,T;,g@e:/+GX<)crr;Z:n?GQ<$fH3/G@I/\PDIXcitJ:W9'
+K7ei1Knb>;Ll$tGMi3ORNfT6_OcklkPa.Q$R$a;2S"-%@T:hmPUSO``Vl6SpX/rG+YctC=ZaI6M
+\@K2_]Y2(p^r!t,`Q#s>ai_fNcHaeadF6Uqf%8R-g=tE=hV[8MioB(\k2tjjl07O#m-X60n*oi:
+s7-Heo^qhLp@e7TrqQNhs8)ZjrVZZnoDX=@JcE:\J,~>
+JcC<$NW8GGr;HQkq"t'erV??crqHEcr:U*^rq$*Zs7--YrU0gUmHso>s6KKcs/u^2Xf\\*Wi2ej
+qkF+a!hc0Xrgs.\!M#YYRK&ZQQN3?MPlR'HQ2HmAP9c<PKp[mWTUqO6Mij![XKAV'QBd\tP*(fd
+NJq5gaI%0tJW,Q`NVJP4NW+n:MtN&/N<"q5NVnh8NrY:@OTCW/r072Grg*5BrK\:c?!LX*T:2(3
+OcYT^LkgY7JU`/qH$4@^rIPK3L4b59KnkFn@UieT[/@9/ZN%*0XfJN%WWK,sV#I.hUAghuU6h4j
+V0RH<Itj&LPECrfNfO!tr/Uc9s,-o8MuAP4M>E,0MZAY4M$/]mM2I2iMZSisNr4q@OH5B[NV\S8
+Mi*DfM>rJ5M$AcjL51P=K_pE%JcgRUJV3rR!/(0%",2JbL])r-L]3&*L&6Q'L&Zo-K`6Z/L51S@
+LPPMXre^T2s+pc4L]3&-LB<<iMYrA@LO=GnG^=1BDej9U?iFI5?N+43>[:Y/>l7h)>l7h*=p8/8
+>?kB9r`B2(>5_\)>5h\)>6.o3rE9D.=BSd/=]kZ(r`B\2=&r@%<)Ze!:esf[U7n:YT`(PaUAgkY
+U&^t`V#R:jV?!OkVYm=lW:?kfX8T'uX88jqX8]4"Xnf'uXo5C,YHY:;Za7%;ZN7G@rjMd7)S!>g
+]"5/IT:1@XG^+LrR%o1ZH?Xe-Ts1W!r3$'Ds*+Nhrd+Tks*Xfo!IfOtJ-LRVJqJ]/L&QgFLPUeD
+MMmFPNK0'\OHG]iPa.N"Q^F20S"-%@StMdNUSO]_Vl-MoWiW>*YHY:;Za@-K\%0&]]Y(tn^qmn*
+`Poj<aND]Mc-FY^dF-Ooe^rF*g=k<;h;7)JiSrnYjlY^hl07L!m-O--n*fc9rpg*]o`"O`p&Ojc
+q#C0iqY^6ir;HTdrdk*#s1&)Z~>
+JcC<$NW8GGr;HQkq"t'erV??crqHEcr:U*^rq$*Zs7--YrU0gUmHso>s6KWCrf-u<r/:f;MM[.D
+LAlo*K`6W'K)C3!J,b&tJ,OirIJeQlIJA18HYHr.C1VU4E,93(CMSKOJ:<fLP`h2lO,o9Z<1B/"
+CN"6<Gk64\HMi'SGkQFYH3&A?q0i6k!.F`nrdFWl),F"&FEV_FEGo]0CM.3g@U`_O?!LT<@q9-L
+@g6LTA7]@cAc5U7;M^*_LP:G:L&HZ)K)C0;IsuipIXZZlH?spaEcdIrC2Rp1FaAC]H@#R9qg/-b
+s*=oqG^"CVGBS0/Fo$:]GQ2j]GPcX_Gm&G=H$FW5GlE!fGkQ=^G^'(.!-IdQo5stQ#BY*2FEDYI
+FT-=_FEMa*F96T,FT$=aFEM_Jr,qdXqKMp^!-eEcqfhs_$[6Q.DJa6*A7]7]I/?h?;?'Mo;>jDl
+;#jMn;?'Po;#jMn;>sDl;>sDj;>j>k:\[cd:B=9er(m_t:esk`:JO\^:Jh!c$;OAl:/+GV9h7cC
+rJ1E/s+p`3rJC*&!/^E,s,6E+o8WO*qMkK7rf@&?rK$o=rK7)BrK@5Go99*8'U+T7JoYaFCM\EL
+KQ1mFCM\ENM2;%^s*+Kf!."Qis*Ocnrd=frJ,Xs&JV&K+K7nsXL2Vj'M2@+JN/WaVO,oBbP*;,q
+Q'Rc(R@9V8SXuFGTqS6WUo(&fWN)u"Xfek3Z*L^C[C3QT\\#Me^;%J"_Sa@3`lQ6DbKS5Vcd:(f
+eC<%#f@\g2gYL]Bi8ESRj5f=ak32'olKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^<hqu6NlrUg)?
+s+13[s*t~>
+JcC<$NW8GGr;HQkq"t'erV??crqHEcr:U*^rq$*Zs7--YrU0gUmHso>s6KV_qc3Ppr)N\rpf7>n
+s&8nps&0"t;cH`p;u]bn;uBPf;$e["1G1:@2`<HHr\PBX69m`#Q'@GpOcPQ_N($<,78QiZ<)`]o
+s&8bloi(iir`&Sir`&MgoMYZerDNPjq,.8O1Go(or]1'?2uY]=1bpg?0JEDXr\F[61GgsIr\Os>
+1HIW[4Zl;.8P8tR"\;-R7S$&K7f>ae7RTU26ps=,5X@(e5=n^K;#O;m;Z'Dg;Z9Vp;Ya8k;Z9Pn
+;ZB\p;Y*ff<)`cqs&K%t"BAE#;cN]or`&hpp/D;q;,L4i;c-@frDEPls&&_m!Dubl;?'Pi;#jMm
+;#jGk;>!ic;u]bq;ZKel;ZTcnr)!;grD<Jhs%rVj!)i_l"]\5h8kMeU3rD)>4oRSC48_2@55dSM
+5!M7q5!;%m5<o-2s$-KGr]UBH5<f'0rB1'C&jJQE5X7V#5sR\$6:!n%5sRY"r]^fT5<qCr4[24m
+3]U;ErE&htlWF3irE&u#qH*]!r`T5&l<3scr`T5(r`f;(!a/W-rE9,%s&o)"s&f>(rDru"r`'_5
+=]nj,9i"JY9i=he:ejY[9MeYe<DiZls*+Kf!."Qis*Ocnrd=frJ,Xs&JV&K+K7nsXL2Vj'M2@+J
+N/WaVO,oBbP*;,qQ'Rc(R@9V8SXuFGTqS6WUo(&fWN)u"Xfek3Z*L^C[C3QT\\#Me^;%J"_Sa@3
+`lQ6DbKS5Vcd:(feC<%#f@\g2gYL]Bi8ESRj5f=ak32'olKdg'mI'H3nF?MK!V>s_p&F^cp\jme
+q>^<hqu6NlrUg)?s+13[s*t~>
+JcC<$NW8JHqu-Hjq>:-erqZHdrqHEcr:U*^rq$*Zs7--YrU9dS!:BaO!UK%MYlM$,YmIV:Xf\\*
+Wi;nlr1a1as.B@arLX%["e1sKR@'B>QN3?NQ2d*GQ2QsBP9Q-KClsTeTph:+KoD"mXKSS#USO*:
+OcPQ`N/V.XS991/M=ur(NrG%*N;8J1Nr>"BOHGZgP*>g.s-<SLop,KAr`gA6Ssbk-OHGN_Lkp_7
+JUi2sG]\+[JV8Z.L4oM[!JQC0@fp(I[']b;s0;g5YHG".Xo>=%W2?BiU]7(fTa?@1RB_'dItNH<
+rfdPKOcYWaq2YW<O,o>#N=(W&MMmCMMi*CKM>N20MZScmM>`>3M#`G4MuS_9Nr+kGOH,9YNJrdS
+N/`dTMuAP-M$8ZhL51P<rIY*'re(0$!/(9&qLnj's+^K-s+UQ.LAHW(K`6Z.L51M;L&Qf,L[U'!
+M>N21M#`A0LB*/0MYi;?N/<"1H?sjPDea',FT,YK?XE_;!aK#:p0@T$!F/k,>l@n+=p8/8>?kB9
+r`K2'"'Sr6>Q.h*=TM]1rE9J0>$4s0=]eg/r`9##%9?P2<E<*u<EPVa9VJ0XT`(PcU7n:QUAq"a
+V#R:cVYm=mW2]?fs/Z.!ri>prri?"!riQ4%!3Q1#s/l7&"0\u7ZMUs0['d=@[f3c8\/Moh]">VZ
+Vk/utH?sda^7gU9H[L$gTVB$!X8K+&GBeCYrd+Tk!.=cos*artrdY$#K)UB+KS>/8LPYqdE/KR4
+N/`mZOHG]hPE_>uQ^F/.S"#q>StD[LU8+N\VPgAlWiN8(Y->.9Za7'J\%&u[]=bhl^VRe)`5Ta:
+aN;WKbg+M\dF-Lne^i@)g"P39h;7&IiSrnXjQ>Ufkiq?slg4$,mdKW6nac8BoCW%T!quB_rqQNh
+s8)Wirqu`no_sFAJcE7[J,~>
+JcC<$NW8JHqu-Hjq>:-erqZHdrqHEcr:U*^rq$*Zs7--YrU9dS!:BaO!UK%LNW5%=NW"h9MZ\fl
+LPGb]re19'r.=p!s*t0#J:RQIrI4cpqgSNmpO"0"AlWVY<-NA#BOkgkJUrE%I!U+&P*(fdNf8p"
+?@6I)EcpYml?N#JqKi0g!.=WkrdOlqqgSQnqgKV^:JQ(UF)c/:D/3p"An,7Y@9m2E>$>EGA7K.^
+A7fBOAcQKC<<?,uM#N20Ka3?dKS+r2JqErPs*kZ1I"$NlI!U-dBQ8*KCi=64FF!h3rd"QiqKi$a
+s*=ZjrHS?ds*"Ebqf_j\s*4Hcqfr!`"F>?<G^974rd"Edq02j`!I&_cFn9\LFT6IaFE78""E\d/
+FERJ&rcS6_qK;g[rcJ3arcRsYm<AGP#^LT4E,TW1BP%0Q!+l(+rDESm!)`YlqbdAk!`MrorDESk
+s&&blrDEJhs%`Yl;>X2h:B=3drD3hu:esh_:JO\^:Jh!c!DZJj:B+#m9R'&sLPUccM#`A1M=ZT)
+M=ui,Msu\sNVJP2NW+t:O8b7@NrtK)OHBC&rK@/Ds-3/>qN;VXP)b9EEG]N.E0u<&E,BE,E.NV#
+LP>YZ"*]!8H2`-iHN8HmIK+`rJ,Xs!JV*lR"b_SaL51TaM/\?1N/WaWO-#KeP*;,qQC!u+R@B\9
+St;RITq\<XV5C/hWN*#$Xfen4ZEpmF[^WcW]">Vg^V@V%_o0O6a2lBGbKS8Wd*^:jeCE.%f\,!5
+gtgiEi8N\Uj5f@bkNM0plKdg(mdBQ4nF?)?oCMVRo`Fj]p\ssfq>^<gqu6NlrUg)?s+13[s*t~>
+JcC<$NW8JHqu-Hjq>:-erqZHdrqHEcr:U*^rq$*Zs7--YrU9dS!:BaO!UK%L<;ol"<`N1%r`8nr
+r`8bns&Atr#?"K!;GpFm<;fbq;YsDl;YO#t.jur&/MK.B1b^R=1dh7-r]^mVP*(fdNf8oe8k;ZR
+;,d9i!)r\krDW_qr)3Spr`/qsp/CrioMbE\r_rbnr)*;g+#Pi15!;"i3]]8[2`<QO1,:O:0J4q/
+1G^mG1c@0J1As$54$5Se4A#NEr^d5`7n-!=r^QfS$q<WP6UX@05sR:j1J.RC!*&qqs&/nqrDE2b
+pf%2js%rborDN\oqc!Mor)<Jls&K"s"BAE";cN]or`&kqoi(uj;,R<k!Du\l;>sJm;>sJh;>sJh
+;?'Pj;=[WU;u]bn;#aAm;Z'Al;#X8i;#=)j;Gd<i##nSr92%rHrAsm=!B`OD4T@M@4:XP<4?Pbj
+5<h:p5!;(n5Q3kH56*nH4o[\I4[2.04oIJG4[)(o55mbJ5sRa85QjD>5sI[75l3bN5!V7q5Y4!q
+r`Antlrj?jr`B&#qH!Z!rE9/&kummcr`T2'r`fD+!aAi2r`K,%r`K2'pK@W$=BPQ(s&T,!'NA"0
+='8X(:JOV[9j^mq:Ja\Y9N;!iqbdN?G^4T6HN/<lI/\QoIK4lsJ,t4QrdtB-Knb>;M#N6MMMmFP
+NK9-^OcklkPa.Q$R$a;2S"-(AT:hmPUSO``Vl6SpX0&M,YctF>ZaI6N\@K2_]Y2(p_8=+.`Q#s>
+aihlOcHaeadaQ^rf%8R-g=tE=hV[8MioB([k2tjjl07L!m-X6/n*fc9o()DDo`"Lbp@n=\q#C0i
+qYU0hr;HTdrdk*#s1&)Z~>
+JcC<$NrSSIqu-Hjq>:-erqZHdrqHEcr:U*^rq$*Zs7--YrU9dS!:BaO#4(R>l*7Isrild6YH=q.
+XK/=uV>R(eU&UecTDb>aSXc.:RJrTRQNEJ>QM$O@PkpRfR#?W]Knl:hRZ3,aNKL<DVl$8aTpq=/
+O,f3Y?=n"qH@UeCNV\\5NU)Q#NVnh8O8k=AOTL]0PPg[FQ2[*CQ2['i?X$d+SXGe/PEM#eLk^S9
+JUi5sG]e1\Jq\i3KnfS\s+UN1raQ+=E4!!Y[/RB:ZEpj?Y-+h,ri-!sVZ!:iUApnnQ].H@H@:9s
+L6MP"s,mDFOSFk>NfT6]NrG%<N;ne=MMm@LM>W53Mi.IkqhkE1#)\=sN/WaVr/^l>!0-r9s,./A
+NJrgSMMd=LpPJp)s+^W0K`6W(K`-N'K)UE&JcLH$K`?c*L]<,-L\li(Ka<?cL4t>:LPCQ^L]<2/
+M>`81L]3,0M#`A2M>E)1M2;(b!/^Z4!/gc6rf$u<L40#H$"n<oCN+?&?sd7>?2n.0?2e(/>P_V(
+>Q7q.>Q%h)>Q7n*>6.u4rE'2*>$P99r`];(!a8f4r`TS1>$>$1=]nj/r`9##!*B,"##nN#=GBXG
+r1O%_s.]OeoV)>\pn[qdrh][nqkj:h!N<!gWWK6$Wr/ppWrB'uXST'sXT,F%Xotr4Z*L\4ZN7G@
+rO2[6*k8bk]">Sf^pgPBSVDT=H[C[<UOdf=G^GFHWNNA(r3$'E!."Qis*F`nrdFfq!.Xuu!J,k%
+K6)^"L5(J>M2@+JN/WaVO,oBbP*2&pQ'Rc(R@9V8SXuFGTqS6WUo(&fWN*##Xfek3Z*L^C[^N]V
+\\#Mf^;%J"_Sa@3a2lBFbKS5Vcd:(feC<%#f@em3gtgfCi8ESRj5f=ak32'olKdg'mI'H3nF?MK
+!V>s_p&F^cp\jmeq>^<hqu-HlrU^#>s+13[s*t~>
+JcC<$NrSSIqu-Hjq>:-erqZHdrqHEcr:U*^rq$*Zs7--YrU9dS!:BaO"7,7;l2H\BNW>(;N;ne=
+MMR%BLAlo+K`-Q&JcgRUJV!`LrdOrtJ+S3iIJ8+5EFiQo@qBe'DeWctC2e`RI=-<cG]dqdO,f3Y
+=C#EMCiFUcGlW*fH0TYKH22afH[L5;IK"]qIJeQoIJeO::JOZ,FE;DAE,KQ/An5F^@UNMK>[(BA
+A7]:_AS,IaAc?<@<<?-(M#N20K`Qp^rIb6'Jq3iOs*kW/I"$KkI!^3YEHRF]Df9`?HMDj_HMVpe
+H2r6iGlN!fFoZ[_Focf1rce9br-/'`qg&3f!."Ecrd"Kf!I8qgG6`A:GBe@VGBWt.!-IgRpiHX]
+FE;JCrcA*]r,r!\#'G$0F`heJrH/*`rcJ3_rcJ3arH8*_r-&-ap3-L]qfhs_rd"Nis*4upE,]`5
+D.R6gARoBN;Z'Ar;Gg=i;,U<h;?'Mp;c<Njs%r\lr_WPjrD<Mi!DlYj;#X5k:/Cgb$;jVq:/Fb^
+:/=Y^rD*Gh;#X2o9hnB!84SL4M<9]qMsu\tNVAJ1NW5%;O8+h7Oo1CBPQ$g?PPC:XPa@PqMhZFo
+Ci+$5JVJ/^D/3s2K85;<KD^E&GQ<$gHN/<lI/\QoIK4lsJ,t4Qre#9FKnb>;Ll$tGMi<USNfT6_
+OckllQ'IZ%R$jD4S=Q7CTV8'SUnjlcVl?\sXKAY/Yd(L?['mEQ\[f>b]tV7s_8=+/`Q-'Ab0/#R
+cHjkbdaZdsf@S^0g>(N?hVd>NioB+]k2tmll0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kr;6Hj
+rr)HfJcC<$\Gq'~>
+JcC<$NrSSIqu-Hjq>:-erqZHdrqHEcr:U*^rq$*Zs7--YrU9dS!:BaO"7,7;l2FZ^<W?)"<W#np
+<W?+n<<-"q;Zouq;H$Qe;u]bi;%P9--nd&%3ArcN0JYFJ69md756!\P3foD_NJpA!92&/[p/M#i
+qbmDlr`&hps&Attr`&Sis&ASgohtcfr_iVjr)*SR1c51p"?SY*3B-mp#rFCk0/,"1/i,<^2?,K5
+1As$54$5Se5"Y`Gr^d2_7n-#J7KGqIr'^TRr^-lZ6:!7f1f+*J!`W&pr_`_pr_i_mo2>B_s&&nq
+;H!Hl!)iepr)ESmqc!PqrD`esq,@8lr_rYm!*0"t##eDs;GpFkqbdAkr)!Glpeh&h!`;cjr)*Ai
+r)*#_nl#Qe;>a8j;$Bip;,C+erD3>gqbdJm:f73i##e8i9MJ/Kr]:!>q`Om?r&k!Bs#^NL5!D1p
+4[)%.4odhH4pO;95!;%m5!Am/s#p9B!BraG4pXG>5s[b$6:!p75l<hP5!V7p5Xman=8H%b=oVV'
+=8l=u=8uD%=oMOf=o2>$=oDP#>6.o1r`K/&rE'&&pfdZ"s&]>(<`],u)H9X6<`N:(<_lIb9hS>_
+<)-+`9h\A`;c?Xlr)3Q>!."Qis*F`nrdFfq!.Xuu!J,k%K6)^"L5(J>M2@+JN/WaVO,oBbP*2&p
+Q'Rc(R@9V8SXuFGTqS6WUo(&fWN*##Xfek3Z*L^C[^N]V\\#Mf^;%J"_Sa@3a2lBFbKS5Vcd:(f
+eC<%#f@em3gtgfCi8ESRj5f=ak32'olKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^<hqu-HlrU^#>
+s+13[s*t~>
+JcC<$NrSSIqu-Kkq"t'erqZEcs7cNdr:U*^rq$*Zs7--YrU9dS!:BaO!pf.:rosHes0;U.#d1;3
+XK/A"VPO0brLj:cT:c%Q!M,_ZRK&ZRQNEJ>QMm'KPkgUCPl$XgSr88fLP;FoQB-cZN/asCWMcPf
+TUM44O,f3Y?=[tpIXm1ANW5%:NTuK"NVeb7NrY:@OTCW/r072Gs-EAD*L:#:?<s1oR[08$OcYT[
+LP1;/J:N#lGBe[jK7o!YL&Zl7LPUdr@q/l.[C!:>Zk0RL['Hp=Y,eV'Wi;qmUSFXaUC3cDTU`E:
+H@^d*P*>d-s-!JGOSOq;OSt4?NrG%<N;SV3M?/Wmregf7Mt`,/MZSlsNr>"AOH5KaNW+n9MuJ\;
+N/NSmMuS\2M$JilL51M;KS02Urdt3(r.Fp#s+UH-s+^E+qM+s&reC9)s+g`5MMh@hs+pZ0reUQ1
+s,-Z2!/gc4reLQ3rJUZ4",i+tNW+kFNIlS*H?jdPEbfQ38Gc!Q9)M?^>Q%e.?!LY4>Q.e5>[(E;
+>?P*2=BSi,>6A&3>$Co.s',G*)-L-F=BSd/=BAO(='&L*<EE4%<)Z^rG>:m3T`1VdU7n:QUAq"`
+U]@7iV?!OlVYm=mW2]?fs/Q."qlBUori?%"qQ9[s!3Q4&"L,/9ZEjA6!OT96[f!TW\@K2^]=Yen
+`5o*^TpUI[G^=b*TWWfmI!0t*U9CVtWr0"#G^9:7s*F`nrdB6EIt*!!JUrE*K7nr4L5(J>M2@+J
+N/WaVO,oEdP*;,qQC!u+R@B\9St;RITq\<XV5C/hWiE,%Xfnt5ZEppG[^WcW]"G\i^V@V%_o0O6
+aN2KHbK\>Xd*^:jeCE.%f\,!5gtgiEi8N\Uj5f@bkNM0plKdg'mI'H3nF?PLs766_rq-?dp\4X]
+!;ZWjr;6KkrVcBfJcC<$\,Us~>
+JcC<$NrSSIqu-Kkq"t'erqZEcs7cNdr:U*^rq$*Zs7--YrU9dS!:BaO!pf.:rosHB!KN0;N!5,s
+M26qBre:?)"+u8ZKDpH*JV&K)Jc(&tIfY"Jr-eWoqgSQnpO"0,AmoUg@sN69CLq0oCP%+eI<^'\
+FE2>:NfAuu>@M5^EHUYos*4Qhk]lfHq0E'gI//3jIfFinIK4fqILo=N:JQ(TFE)>=DJa0&A7T0K
+?iXO4>QSDGAGg$:B)Yd3<,m`nLED8)L4t;6K7ni.J:W9$IsufoIsl`mHsq8BPAG/VFa!_2q0Vm_
+qg&3f!."Qgrce9`!I&_dG62r3GPl^aGPl^bH2i0mH$Xa]qfr'bs*4Ngs*4Qfs*+]kG^+FVG5cUd
+FE;PGqf;g\F*%+urcJ9aEcV/#s)e'Z!d&R,q/l[\rcJ6`Fo?L_Fo?L\GP67]H1uR`H2;gqHZO.E
+DJa9(AS#@^8Gc!Q9)M<b;,U=j;Z0Jl;#aDl;#O8i;#a>i;#a>j;#O2e;#X5u:ejb]:Jak`:JOY\
+r_EJf"&*/p8Ge8+M?&S(N:W&'Nr+e9Nr4t6OSk7=P5gaFPk^I8OrBROR[oV&M1B\dD/F3@Ko0he
+DJF$9K8GA;K)C9&G^9:7s*F`nrdB6EIt*!!JUrE*K7nr4L5(J>M2@+JN/WaVO,oEdP*;,qQC!u+
+R@B\9St;RITq\<XV5C/hWiE,%Xfnt5ZEppG[^WcW]"G\i^V@V%_o0O6aN2KHbK\>Xd*^:jeCE.%
+f\,!5gtgiEi8N\Uj5f@bkNM0plKdg'mI'H3nF?PLs766_rq-?dp\4X]!;ZWjr;6KkrVcBfJcC<$
+\,Us~>
+JcC<$NrSSIqu-Kkq"t'erqZEcs7cNdr:U*^rq$*Zs7--YrU9dS!:BaO!pf.:rosG^s&Jnrm8X-c
+qbmVq;,U=lr)3Snqc!MmpJE(c.O[&'/3,[J2)$dA1dXPp5<_4n3BK2[NfAud84lTQ;>sMh<;]\n
+;YF&h<;oni;uTbg;uBMn;>O2j;uKVk;?'Po2%h]%5!;%j3]]8]2`<QO1bgX90`E^)1]K<32>o?;
+2)I-P4?GYm8cD?]8cM<^7S!GI#=V*N6q0U57K,[^7RA^k1JgqF;H$Hi;?0Yp;?0Sa;Ya8h;YsAo
+;H$Nl<;fbq<!lW)<)lps;cH^r<;KPl<<#np<!-&u<)ros$WBr$;,L4h;,U:h;>sJc;>jAo;,C*e
+;>O2i;=d]V;u]bl;#jMn;?'Mo;>sDi;>X8j;%-?!;,C.g<_l@\8kV_P8bYjT9E.-S4oR\G4TRZ.
+r]UZP5!D1p5!;%m5!Am/s#p9B!BraG4p=5;5X@Y#r^$EHrBL9Hs#gHL76*F+=R92j=T)>#=Sc)!
+=T)D&=Qiob=9)M%>5DG*>$4s0rE9,%s&o2%r)j/)='&F'rDiks)cK^:='8[0=B/'l9MS;\;ccak
+9MJ5W<)cpt:]+)kG^9:7s*F`nrdB6EIt*!!JUrE*K7nr4L5(J>M2@+JN/WaVO,oEdP*;,qQC!u+
+R@B\9St;RITq\<XV5C/hWiE,%Xfnt5ZEppG[^WcW]"G\i^V@V%_o0O6aN2KHbK\>Xd*^:jeCE.%
+f\,!5gtgiEi8N\Uj5f@bkNM0plKdg'mI'H3nF?PLs766_rq-?dp\4X]!;ZWjr;6KkrVcBfJcC<$
+\,Us~>
+JcC<$O8n\Jqu-Hjq>:0frV??cs7cNdr:U*^rq$*Zs7--YrU9dS!:BaO!pf.:rojIIYl:m7Yck12
+XK/A#Vkp0eUAgkdTE(V]ScbLOR@4&As-N_NrK[AHqN^uCr0&:bKp@UNAXo0PMN<aXY,nY$VPTuX
+R?WhnMi(kMBlSKJK]\9[N;JV3Nr4qAOHGZgP*>g.s-<SLpQbbas'@+FSXYq0OHGZdLkp\6J:`5s
+GBJ.]K7nu7Knb87Ll$qE@UinS['d9Irj3*?ZF$pAYHFt-WiE%srM9Ig%AIHs_ROl>Jqf/GOcu"*
+PQR,4Oc]L%rfI)>s,R)<!0$i6r/1H2s,$f7re^]6r/1N4",r5!NrG+<O9(B$rf$l8s,7)?N/`dR
+rJL`7M2;%c#)J%iL4t;5qLep&KS9>Wr.G3-KnbA=rJ(B/reL6&s+LN/LPGb`!JcL1M>`>2M>rD2
+L]<20M>rJ/MuJS9M26tEr/:Q3s,?o9s,ISMOFhk)H?a^LEGKN78P/YKqb-i\qb7&qr*02)$X6k?
+>?kB9=]ea.>5h_.>$5$4r`K8*>Q%b*=oVV(=TV].=T2>3='/O(=B8I&<)Zb1Zqm?grhBFdoqMJ]
+pn[qdrh][nqkj:h!N<!hWq`XkWrB'uXST'tXT,F&Xp)#5Yd(I=qQg=3[C*HOr3ml[\[oAa]>)/"
+aj/A?Vk/rtH[L'kS?@g!H[BpaTVK*"Y,qQ(!."Qis*F`nrdB6EIt*!!JV&K+K7nr5L51S@M2@+J
+N/`jYO-#KeP*;/rQC!u,R[]h<St;UKTqeEZVPgAlWiN5'Y-5(7Za7$I[^`lZ]=bhk^VI_'`5T^9
+aN;TJbg"GZdF$CleCN7'g"P08h;-rGi8N\UjQ5OdkNV6rlg4!*mdKW6naZYM#kR]\p%A%Pp\4[^
+s7u]kqtpBjrVcBfJcC<$\,Us~>
+JcC<$O8n\Jqu-Hjq>:0frV??cs7cNdr:U*^rq$*Zs7--YrU9dS!:BaO!pf.:rojRLNK0!XrJ^c7
+#)\4lLPCM:qh+s%qLS]ur.+crs*artrI4`orI4`opO",u@W,mh;KZtsB52-rK7JH"H?saWEc5i2
+BP:FO@:a7pFR=A5GkQFZHN/<lI/89jIfFioIN<icIS`d8:3L`$EH,l6D/<ir@prhU?s[)A>[q;U
+rFQ4DAS>^gB)Yd5;i$6bL])r3KnP,3KS"jUJJ3Q`IXQZoI!p?>EK,ilDK'cCI!bg>pj;g_qK`*e
+!dT$8rce9`rHJ9bs*+Bcr-/-brH\9dr-80c!d]-:rHSEgGPl^cGQ2jcFTHT*rcA-]rcA6`FEDU!
+FT-F]ErpH)FSKt[G'.p'FoQX`Fo?L_Fo?L\GP67]H1uR`H2i3gHiAC%I;s4EDJa9(A7K+^8P/YK
+qb-i\qb7&fr_WVls%rVjs%ien:esmb:]O;j;#O2e;#X5u:esh^:esn`:JO\]rD!Pk9N[3CM2C>O
+s,6B*o8WO*qi(T9qiCT8qiUf>s-*GHqNLN6)jQbXSYN*HNeMh"Df0E5IuAGfD/<s)JqK#<L\l`)
+H2`-iHN8HmI=?WpIt3'#JqAW-KS>/8LPUbCM2I4MNK0'\OHG]hPEhE!Q^F20S"-%@StMdNUSO]_
+Vl6SpX/rG+YHY:<Za@0L\@K2_]Y2%o^r!t,`Pom=ai_fNc-FY_dF-Oof%8O,g=k?<h;7)JiSrnY
+jlY^gl07L!m-O--n*fc9nc/.coCV\Jp%J+Rp\ssfq>^<gqu6NlrUg)?s+13Zs*t~>
+JcC<$O8n\Jqu-Hjq>:0frV??cs7cNdr:U*^rq$*Zs7--YrU9dS!:BaO!pf.:rojOK<)lro<rQ)!
+<:Nrg<;]Yt;Gg:h;Z'Jm;Z0Pn;YO$(.O[&(/MK+@1GL[A1dXMn5!M1m4$#A"2@2iD8ki#X;,U:j
+pJh/k"&r2t;Y*fh<)lmso2GWfoMbZc!)`Vkr_reoqb[u(2E!?I5!;"i3]]8]3&WZP1,Ah_r\"4,
+&iDI%2)R3I2)I-I4?PYd8P)NHrCR#[)b*=f7Rom:77B[76Ua@1778Xh5YFpM;H$Fj;>!fe;t<i`
+;u0Dj;u]_q;u9Pn;uT`&<E)pt<)Z^p<E8fm!*&kpr`&kq#?4]&<)Z^n;Z'Dk;?9WmnkoBa!)`_l
+r)*;gs&&Acnl,Ncqb[>krD<Sn;>sDi;>*of;[cQ$;,C1g:eOAP9h@qN9)D9Z9`%Nc4Zkk+56!bT
+5!M7q4Zkkk4Zu"n4[&^*r]U<Fr]UWQ5X.P"5X@_&62X"H5Q="K4pF/76r#^D=R'&h=T2D#=Sl2"
+=T2J&=Qruc=9)M$>5DG'>5DD$=T;P&>5MJ%=T;J&<rH#?<)Z^p<EE=/@9Qf7;,C"\:/FYd9i"S\
+:/+\d;cQanr)*N?rd+Tk!.=coIXZcrJ:N3&JqJ]/Knb>;LkpnEMMmFQNfT6_OcklkQ'IZ%R$jD4
+S=Q7CTV8'SUnjlcW2ZetXKAY/Yd(O@['mEQ\[oDc]tV7s_SX71`Q-'Ab0/#RcHjncdaZdtf@S^0
+g>(N?hVd>NioB+]k2tjkl0@U$m-X60n*ol;s7-Heo^qhLp@e7TrqQNhs8)Wirqu`no_sFAJcE4Z
+J,~>
+JcC<$O8n\Jr;HQkq>:-erqZHdrqHHdr:U']s7?3[s7--YrU9dSs6]gP!pf.:rok!XkNB+TYct73
+XK8J&Vl$8brhBCcs.KCar13q[S,SiUR/`NOQMm*IPkp[CPl?jkQA]I<L2*KPR#Zi[NNK@cVl$2_
+SsYh*NfAp]?YOJ)H\.6;r/L`:m>^Fjr/LT6r/^l>s,dAGPEYp/s-<VMqNWCnQ$Z_?>b7LUQ^!Vq
+OH#'QKn=l,I!^']G(YI%L4t>7KSPD?Ll)+?!ai=Br3Q^8ZF$pAYHFu+WWK/uV>R,"Tq&NVH%1F#
+N09?dOckolqiq,E!KiKBO8k:LO-#EaOH5H_NfB$WqhtH2r/:H0$B'e"MMd=MN/WaUrf@#>"HSS'
+NK*pqrf$l:!0$l7"H&%mLktqb",DVbL&6Q'K`Qj\r.G</KS5&6L51Q_L]N9erJ1?+!/LE*reLE-
+s,-i5regZ2!f2VerJ:B/p59$1M2@,gMuJS7Mi@Rn&<;g6OcklYI=$?dF)c/7DftnKqb-i\ohG?Z
+s&on;>?b?:>$4s/=]np5>?h)1r`K8*>Q%b*=oMM*=]eg/r`0/'=BAO*r`02&;cR#-:]@'gU%G)Z
+U\LVbV>[7kVu*@hVZ<^fWq`XkWr9!uXST'sXT,F&XoP[)Z2_-+Zi@B6[C3OA[fO"Lrjj/_^VRn2
+cdUUVY+_D@IX6BmOeSe*I!^'aKqkTOX/l-#rd+Tk!.=co!IfOtJ,t4Qre#9FKnb>;Ll$tGMi<US
+NfT6_P*2#nQ'I]'R$jG5S=Q7DTV8*TUnsrdW2ckuXf\e2Z*L^C[C3QT\[oGd^;%J"_Sa=2`lQ6D
+bKJ/Ucd:(fe'uq!f@\d1gYCWAhr*JQj5]4_k3(sml0@U$m-X60n*olHncA@Srq6<b!;HHes7u]k
+r;6KkrVcBfJcC<$[f:j~>
+JcC<$O8n\Jr;HQkq>:-erqZHdrqHHdr:U']s7?3[s7--YrU9dSs6]gP!pf.:rojRLkN@kbrJ^c7
+#E"@nLPCP;L&6N'KDU6#Jc(&sIfb(KJ,OirIJnWmIK"WoIK"U;DIc^]@odhoE,&irBnCnfIXHEc
+F`MJ<Ch[O#>$kiUDfb8jiHY'AqK`3iI!kd=s*jrqqgK\n:/4N,F`_VBDJa3)B4b[a@UWSL>[(EC
+A7fFbARo=`BDuNB<<Q9WLkgfbL(/iiKS+r0K7ST*J:N)srdG<)HZXsgCN"08G^OmcHi/9eHi86j
+HiA<mH$Xf9H2`-iH2MmcG5QR`G5ldbGl;jcGl;pcHN/?lH2i-eH2i3hGl`/6r-80arH8-^!-A$Z
+!-S!WrcS3^!crI*qK2d]rcJ3aq/uUYs)n<arcS0_rHImYs*4ZjH$T=4s*=WjqKi3irI"p"Ec>r8
+D/<kaAH69;9)D9Z9_D-X:B+/h;?'H!:Jak`:Janb:f%'e!DcPk:]4*$;,9t_:esh^:esn`:JO\]
+;#X2m9h\<?8*,U.Msu\sNVJP2N<#"9O8=t8Oo:IBPPpaEPOXeVPEhK'SYN*cP`^iXG&M;8Dgd=n
+EH#f3DK:AaM21q\rd+Tk!.=co!IfOtJ,t4Qre#9FKnb>;Ll$tGMi<USNfT6_P*2#nQ'I]'R$jG5
+S=Q7DTV8*TUnsrdW2ckuXf\e2Z*L^C[C3QT\[oGd^;%J"_Sa=2`lQ6DbKJ/Ucd:(fe'uq!f@\d1
+gYCWAhr*JQj5]4_k3(sml0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kr;6KkrVcBfJcC<$[f:j~>
+JcC<$O8n\Jr;HQkq>:-erqZHdrqHHdr:U']s7?3[s7--YrU9dSs6]gP!pf.:rojRLkN>iFqH!Sq
+s&APh!*&ho!)ien!)i_nrDNYor)3Mks&/hn+tG&l0.\h=2)?p>1G_<`5s[_!4ukYb2`EWO1J(24
+:f1+hr_`_poMk9Xr`&Jfr`&Mgohtfgs&&kp;Z'B+/Mo:>5!;"i3BB,[2`<QO1,:O:0E*R-1GgsF
+2)Y@i$oKju2*F#^4%W"991o1Ts%",!7n6$=77Ka87RTU36UX@21d=N+;,U@l;Gp@hohkcgrDEVo
+pJUle!E)en;Z'Jn;?0Ym<;ohq<;fhq;u]hr;ZKeq;Z]iq;Z'Gs<)Z[m;cEZpr_rbms&&horDNYm
+"B&)o:f.-g!)WYlr_i_m!`2`lrD<Vo;,R<js&&Acr_rhpo2GN`!)iens&/\joht]d$;aSs;c-If
+91qrGqF^WXr(QcXr(d8Ts$$cQ4Zkkk4Zu"nr]U3B"$Jh34oRVI5<qG!r]gZS5s[b%5X>63s$-cP
+5<V4t9fhTCs&f5$r`K"us&f8's&eMgqcEi$qc`i#!*]2$!*K5'rEB&#r`K2%!*9)!*EH0>;GpIo
+='8g;AQ`2?<)?=`9hnVc;,C+`9MS@^;u'>jHN/<lI/\NpIXh?I!J,k%K6)^"L5(J>M2@+JN/WaV
+O,oBcP*;,qQ'[l*R@B\9SXuIHTq\<XV5C/hWiE,%Xfnt6ZEppG[^WfX]"G\i^VI\&_o0O6aN2NI
+bK\>Yd*^:jeCE.%f\,!5gtgiEi8N\Uj5f@bkNM0plKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^<h
+qu6NlrUg)?s+13Ys*t~>
+JcC<$O8n_Kqu-Hjq>:0frqZHdrqHEcr:U*^s7?3[s7--YrU9dSs6]gPs6B[Mrok!XkND!iYct:4
+XfSS'WMZPgrhB@b"/)9YT)>,]S!ob5rg<_Pr0IAJrKR/Dqiq,E,*e"8Ob/4ZR[9(kMN)8NXf/1o
+U7dm@P)t]^MSj(DFaJ^urf6u;rf6?)m#:h$qi:T8!0I2B!KrZEPl?pJQMHd^HsL#_T:D@;P`q>p
+O,/UGJV&H%H[0gere(?,L5,\]$&==nM.0n%EjW7P[/I94Yck42rMg@*V5'l_Unb<-PBqY/KoQ%o
+s,dAGPEYj-"-\k/OT(:@OSt7?OT1@ENfT3[NVeY5MYrD2M?/WmrJLl;N/NXRNK4"!rK.#=s,@&<
+MuJ\8N<"q9MuSY7M>i>2M#`G4M#`>1L&?T)KnfS\rIk3*!JQ:,L\ci(L]<,.L])r-L\uu-M>E,/
+M>rA3L]*&,MY;u2Mi!:JrJUZ4s,6i8"-/G(Oo:ICP6l\bH?spRF`(u8r(?o\r(QcXqbHr_s'#M-
+=oMM+=^#'7>Q%b*=Tqu5>$>'4r`T8's&oA(r`0,&=BAT&<WuH$<*?P&ntH,Zpn[qdrh][nqkj:h
+!N<!hWqrdkWrB(!XSK!rXT,C(Y-5)/Z2_-+ZNRYC[C3OB[fX(M\c0/_]YD;%b0\\nip*hLTTk(X
+H[L@;X07&#J9ZU-V6-l$X8B("HN/<lI/\NpIXh?II=[!&K7no3L5(J>M2@+JN/WaVO-#KeP*;,q
+QC!u,R[]e;St;UKTqeEZVPg>kWiN5'Y-5(7Za7'J[^`lZ]=bhk^VI_'`5Ta:aN;TJbg+M[dF$Cl
+eCN7'g"P08h;-rGi8N\UjQ5OdkNM0qlg4!*mdKW6nF?)?oCV\So`Fj]p\ssfq>U6gqu6NlrUg)?
+s+13Ys*t~>
+JcC<$O8n_Kqu-Hjq>:0frqZHdrqHEcr:U*^s7?3[s7--YrU9dSs6]gPs6B[MrojRLkND!ir/:f;
+MMd4FL]3&-KEQp\KS+pTK)^E"JGt&uIf=isIf=cpIenHmI/\QoHm*B<?Ya(ZG]I\;AnPj[Jq/;u
+H$FOSEc,`0BP3Q:@qfe$rcnKimWmc9pNcR\!IK4iI/n`qIJeNo?2dV4GB@kFE,T]4CM.3h@q&hR
+?<g_6A-Z[XA7f@`AS;!Sr`')/LkphBrIt<+rIbl:K7ST*J:E&rIXZcoJqeMdDfTuHrI"Wlqg8Ek
+I/\HoI!^5>H3S_BH?jd^HN&3gH3&;9rHJ6ar-/-`!-e<bs*+Edrd"Be!IK.kH2i3jH2W'hH22^`
+G6`;6G'.nJFERM'!-S*ZrH8-`!d/U,q/uRXq/uCSrcS0_rce9bo6L7Y!dT*<qg/KoI=?WnIJnTq
+EH(np"D;=Y@q>L0rCd&^ohG<Yq+q#f$;aMp:esk`;,C(br)!Ag'MqS%:f1%b:/Fb^:/=Y^:JX_]
+:/Lpbr_3EO8Ebs2Msu\sNV\\3NW5%:O8=t8Oo1CAPPpaFPOXh9P9-!UR\$=SYID60Ner7.E,BN7
+KntY,D/O--HA%-2L\c](HN/<lI/\NpIXh?II=[!&K7no3L5(J>M2@+JN/WaVO-#KeP*;,qQC!u,
+R[]e;St;UKTqeEZVPg>kWiN5'Y-5(7Za7'J[^`lZ]=bhk^VI_'`5Ta:aN;TJbg+M[dF$CleCN7'
+g"P08h;-rGi8N\UjQ5OdkNM0qlg4!*mdKW6nF?)?oCV\So`Fj]p\ssfq>U6gqu6NlrUg)?s+13Y
+s*t~>
+JcC<$O8n_Kqu-Hjq>:0frqZHdrqHEcr:U*^s7?3[s7--YrU9dSs6]gPs6B[MrojUMkND!i<Vfbq
+<W5tk<W#hp;ZK_o;$p3"<)Z^n;Gg:h;u0Al;>sJn;'@G<-nZu#3AiTL0etOE6UF%&5!D"g4#T#V
+2)[rr928>]r)3PnoMkih!*&Mf!*&Jes&AVhr)*MlqGI;lrDNSk(+hC#1Hmr`4$#G`3B/oT2)6p@
+0J>%1r\G`U1c.'H1c%!G1c7EX3^62-8kVcJ8OuBB7S$'?7n#j977I2D#t%*K2`jN*:f10h;ZBVo
+;?Kco;GmBjrDW\n!)rViqc!MlrDNPls&&hqqG[Sr<)cdqr`&qtq,@8ls&8qq!E2nm;u]bp;u]hr
+;ZK_p;$'Wm;>sJm;#sQlr_WVls%i\mrDNMi!)iens&/kor_ibno25QerDN8ds&/Vh!)iVioMP]g
+;Z0N#;,C+f;bp(Z8kf.TrCd&^ohG<Yq+h/X4Zknl4oRYF4o@GB4odbE4pF8:5s[b$6N'4M5l<kH
+5R'D;4[)/-3pg&M=T)>"=Sl2"=T)D&=R0,d=T;P%>5;D&>5MG&=Su>$>5MJ$==RBQ<`N.#<`E!q
+;H-Xt>$bZMCi`c`=B/-o92JA];,g:c9hnGZ<Dusu;>X8kHN/<lI/\NpIXh?II=[!&K7no3L5(J>
+M2@+JN/WaVO-#KeP*;,qQC!u,R[]e;St;UKTqeEZVPg>kWiN5'Y-5(7Za7'J[^`lZ]=bhk^VI_'
+`5Ta:aN;TJbg+M[dF$CleCN7'g"P08h;-rGi8N\UjQ5OdkNM0qlg4!*mdKW6nF?)?oCV\So`Fj]
+p\ssfq>U6gqu6NlrUg)?s+13Ys*t~>
+JcC<$OT4eKr;HQkq>:0frV?BdrqHEcr:U*^s7?3[s7--YrU9dSs6]gPs6B[Mrok$YkND!ijlN\J
+XfSS'Wi)bkU]."fU&L\jT:VXFS=H.?Rf8`TR/`NQQ2m9MQ2m3LPkgU@PTucZJsD1KT:;41Ll7:S
+XKAG"Vk]uWQB@8gMMhG/P]V5&Ll_:jm>^Ikqi1H4rK$u?rfI5EPPg[FQ2d0IPph&e?<j(oS=,\,
+PE:l`LkLA3JUW&oH%^d&KnkJ>L5(J>M2@+"@:=igZid_C['T_:"L,)4XK2?#&#Z8!V50r^RuM]@
+Jqf;KPPp[DOTCW/q32)GOH>NaOHBI&rK.#>!fi8"qMYB2!K2p9MuS\1Mu8M:NK9-\O8b4@O8b.>
+NVnb7N<"q8M[PE!LkpnEMMd7HLkkt`r.P!&#_dqbKnkD;LPPhas+gQ/oS<I$r.t?/qMP0,reUT2
+rJCT5pP]*1re^Q2s,-i7!0$l:!frG*rK@2E"-f"6I/\HrG\_;:CioVKr(QiZqbHu`ohbZj!EiV*
+>6A&3>$Co."C#&5=^(f-s&f;(s&]8&r`9#"#ZXr,<`E!s=/YYapS7ecrMBRmqkj:h!3,Riq5a:j
+ri>dqr2^%'Y-+t4riuL/qm6=0s0Vj8r3l^:\c')`]thJ'b0\\pj6Q:3Z)++PJq&/pLml&5IX69b
+I\!7AXK8K"XoiusH[Pg@!IfOtJ-CLUK7ei2re><GLl$tGMi<XUO,oBbP*2&pQ'Rc(R@9V8SXuIH
+Tq\<XV5C/hWN*#$Xfnt5ZEppG[^WfX]"G\i^VI\&_o0O6aN2NIbK\>Yd*^:jeCE.%f\,!5gtgiE
+i8N\Uj5f@bkNM0plKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^<hqu-HkrUg)?s+13Ys*t~>
+JcC<$OT4eKr;HQkq>:0frV?BdrqHEcr:U*^s7?3[s7--YrU9dSs6]gPs6B[MrojXNkND!ijlQK#
+s,-u:M2-lbLAuo,KDpN(KDU6#Jc(&tJ,auqIfb(IIJnWfI3NcH?Z'IdGB@e?AnPgnJq/;uH[9jY
+EGfW/B4oV@GA(i6G5HUSH/NrBH22aeH[P[<s*jrqrdFiQr_F>RGB7eEDf0B-BOt[a@UNPN?!LuO
+AS5ZTAH?CSral.Cr`',:LkphBL]3#.L&HZ*JqO&R&:f7ZI"-ToGBn=GDfKoGI!ts@rd4Qj%=<JL
+H[L3fH[:!bH[:#;H2i3jH2W$iH$K=4"aG67G'A31GQ2jcGPcUbGQ)jdH2DpfHN8BkH2`*iHi/3h
+H2DjbGPu[eF`VVHp2g@YFEIJ(s*"Ebs)\9aG5QIbG'A+Qrc\?cqfVUUrcS0_rHJ0aoQg@Z"*o3=
+Hi&0lI=?YEIK"ZtIsuidrbhsVAnPXaBDkL$9_V9Y:ARcY;#a>i;#a>i;#X5k:f%$d$;XDm:ejb]
+:Jah_r_<\o:/=VZ:/$9(M?&S(N:i/2N/dXnqi1T8rf?i9r/pl>rfd>GrKHc7s-"RjQ^XPBWNitK
+a3Km.LO*rYE,KiKP]^n]D/=-?K8bS@qLersH[C/>I0"eHrdY0'JqJ]/L&QgELPUeDMMmFQNfT6_
+OckllQ'IZ%R$jD4S=Q7DTV8*TUnsrdW2ZetXf\e2Yd1UB[C3QT\[oGd^;%J"_Sa=2`lQ6DbKJ/U
+cd:(fe'uq!f@\d1gYCWAhr*JQj5]4_k3(sml0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kr;6Hj
+rVcBfJcC<$[f:j~>
+JcC<$OT4eKr;HQkq>:0frV?BdrqHEcr:U*^s7?3[s7--YrU9dSs6]gPs6B[Mroj[OkND!ijlKM?
+<rZ1u<;'>i<;fbq;Z9Mo;H*Qo!E2nq;=d[!/Li,'/hK(A2)6j@1c.Ha5X%@pr]:NH3&``RK0Vk#
+:f1+hrDNVnnPfNf<8pgV<:j,^;ZB\q;AE&,;,Jo'1c%<Y4$,Ja3B9&Y2)I'Dr\4@)"uA"k2)I-I
+q_Sa>4Zb\k8P2TJ8kDTF8H)*\84Q2J7K,[[6UWgs7o)rYr_`_prDNVl"B&)o;GmBjrDW_os&8ko
+s&&bnqbmPo;,R9ir)3Vo;tj8k;u]hs<V]Sk<<#hr;uT\k;ZK_p;u]hs;ZK_p;$'Wm;>jDj;>sAm
+;GmEir_iVj!)ibm!`Dlmm8<p_qbm/er_iPh!)iVio2>Tc!)iep$W9o";G^4g:.n2O:&R`_9_V9Y
+:ARcZ:]NWW56!eD4T@SP4[)"m4?u+r5sR^562s1N5=#03r]pKH!C0BJ=oVV&=8l=u=8uD%=oVUh
+=o2>#=oMV!>Q7n#=oMV$=oMP'=8u>$<@:gI<)Z[n<)m"'?=IPaFF/RB>#nHs9M8,W9ik(c:/+GX
+;,gOr<)EHi"+#<@I/\NpIXh?I"bD8XK7nsXL2Md&M2@+JN/`jYO-#KeP*D5sQC!u,R[]h<StD[L
+U8+N\VPgAlWiN8(YHY7:Za@-K\%0&\]Y(tn^qmn*`5Ta;aND]Lc-FY^dF-Lne^i@)g"P39h;7&I
+iSrnXjQ>Ufkiq?slg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)ZjrVZWmo_sFAJcE1YJ,~>
+JcC<$OT4hLqu-HjqYU6frqZHds7cNdr:U*^s7?0Zs7--YrpTmTs6]gPs6B[MrosIH!9a@D$g$HP
+XfSS(Wi;nnU]."fU&L\jT:VXFS=?%=S,SiUR/WHPQN*<NQ3*>9PkgU?PTc0DQ&LQ2SXGXtN/in"
+XK/:rUS43FP`^r_M0P91Ed`Imrf?f6mZ$Rlpl564rK$r>s,dAGPEYp/s-3SMr08[Y?=$j-SXc+7
+OctlhM2?n:Jq8E!H$Y0sKS>,8Lk^V>MM[4J@q&l/rj2d8['[1=Z5'XKYcb(.X/`1tV5'l_WfW*_
+H\$s0rfR8FrK@/B!KrZBPQI#0OT(:@OT(=>O9CW+O,f7uN;e_@MMmCOMi3OOMZ&G8N/NXQrJV2F
+NfT6]O-#HaNfK0[NW"h7NV\P5MZ/J4M?\onLPLV<L&?T(L&6T/KnbA<L5(K]L]W?fM>i>2LB*)$
+L]*&'MYN&-MZ/P-N"_)*M2I4KMMm@LMi3ORNfK0]OHKO*s-*DGs-="IIX?EhF`258Dg2+QpeCZ]
+qbQ`Yr)*Jts'#S/=^##.=Tho4>$5&.=oMM*=]eg/rDrr"#ZXu-<`E$s<LEHRpn[qdrh][nqkj:h
+!N<!hWqrdjWrK+"XS8jpX9>Z.YHY81Z2V',Zi@B6[C3OA[fO"LrOO8f^r"+7dFR.8m.1#Q[B-*l
+KReDtJXELBK7/,mIXn/j\ZN$9r2p-JH[C/>I<U-iJ:N3%JqJ]/Knb>;Ll$tGMi<USNfT6_Ockom
+Q'I]'R$jG5S=Z=ETqS3VUo(&fWN*##Xfek3Z*UdD[^N]V]">Vg^;%J#_SjF5a2lBFbKS8WcdC.h
+eC<($f@em3gtgfCi8ESRj5f=ak3(smlKdg'mI'uB#4V0Ro(2JFrq-?dp\4X]s7u]kr;6KkrVc?e
+JcC<$[f:j~>
+JcC<$OT4hLqu-HjqYU6frqZHds7cNdr:U*^s7?0Zs7--YrpTmTs6]gPs6B[MrosIH!9a@D"6JU&
+N;e_;M26qBre:E,r.G'&qh"j!r.+crs*jlqrdFouIX^p;+_bD(B4XtaE,9-#C2/EPJ:DlkGB@nE
+D/3fs?ZhuSCiORrHiJBnH[:#,H2W!fH/j/HH2;ggH[L5;I/n`pI4]nR:JX`0G&q\EDJs?-BP1gc
+@UNSM>[1iNAS,LbAn>OcB4bdh<E<+?LkphBrItN1KS+r2JqO#Q%"E_RIsu`aF)#Q4FEme4!.Ffn
+rd4Hg"FGNDH[Ga<!IK.kH2i0jH2W'gGn#"DG^+FUGB\:UGBe=Trce-^rd"?ds*O`jrHeKjr-J?f
+"F,3;G^0+0s*"B`!-S$Xs)n<_s)n<arH8-`rH/*`qKMs_rH7dVs)n6_s*+Bcq0;sdr-A3b"*o3=
+Hi/9kIK+cqI/n`oJ,b$'G&VD=D/<nbAH6HB9__?[:A[iW;#F2g;#a>j;#X5k:f%$ds%`nq:esh^
+:esn`r_<GhrD!Dg9R,o]s,6B*o8WU,qMkK7rf?l:r/pi=rf[>Hr0-Z6s-"^mQ'[u4V5gf2_8ssS
+P`UfVFE2><Eds")EGo`0DJt,ZN/*1Br.G/uH[C/>I<U-iJ:N3%JqJ]/Knb>;Ll$tGMi<USNfT6_
+OckomQ'I]'R$jG5S=Z=ETqS3VUo(&fWN*##Xfek3Z*UdD[^N]V]">Vg^;%J#_SjF5a2lBFbKS8W
+cdC.heC<($f@em3gtgfCi8ESRj5f=ak3(smlKdg'mI'uB#4V0Ro(2JFrq-?dp\4X]s7u]kr;6Kk
+rVc?eJcC<$[f:j~>
+JcC<$OT4hLqu-HjqYU6frqZHds7cNdr:U*^s7?0Zs7--YrpTmTs6]gPs6B[MrosIH!9a@D!p/KC
+rDrqu"&r2u<:s8i<;]\o;ZBSo;Z0Pq;c<Kip/3%a-o*D-0K:pG0JbLA6:*q$4Ztng3]K&W2)R$O
+;bg(b;Z9Vp;Z'Jb<<#qu<;ohr<9$pW<;9Db;?0Yp;ZBT8/N,F@5!:th3]]8\3B&fQ1,:O;0.nn6
+1,CdE1c7/g1^Gs%4?>i$8P2YT8HD=Pr^R&]7n6&H71)CM6SU_o:Jjte;uTYp;uKVh;>X5k;uTYp
+;uKVo;>sJi;ZTcnrDNSm!`W)spJh/ks&9#!<;KPk<<#l";H$Ll;Z'Gn<;f_q;Z'Gs;Gg=i;,R9i
+r)*Jj!Dubo;#F/k:Jgmbs&&hojAPnS"]A8u<)QWh;?'Pk;=mcc;#jMn;u]bq;[H5s;GpFk:J+8P
+qb6cZr(d,bnPK-\!^8b1r&k!Cr]L9G4T7PF62j.J62a(I5Q<tO5<_1o9Cc6b=T2D#=Sc)!=T)D&
+=R0,d=T2J&>5)8$>5hY)>5MJ&>528"=T;J&<YJJ6<`N*t;H$Op='Ap>BPqs>Jr0J1%ouP':J=M\
+<`;di9MS8W<;f_q;#F2nH@(!drdB!>It3'#JV&N,KS>/8LPUeDMMmFPNK0'\OHG]iPa.N#R$a;2
+S"-(AT:qsQUnjlcVl?\sXKAY/Yd(O@['mEQ\[oDc]tV7s_SX71`lH0Bb0/#ScHjnce'umuf@S^0
+g>(N?hVd>NioB+]k2tjjl0@U$m-X6?mfr:Oo()DDo`"Lbp@n=[q#C0iqY^6ir;HTcrdk*#s0hrX~>
+JcC<$OT4hLqu-Kkq>:0frqZHdrqHHdr:U*^rq$*Zs7--YrpTmTs6]gPs6B[MrosIH!9a@D$g$I0
+j/oD`Wi;qpV>R%mTqJ'NT:VUDr0m_URJrTQQN3?NQi36MPkp[@PTc6JC6FBdSsl"'KSte%X0/G!
+TqJ$HQ'%&cMgq/2TmV9Br/^]7l](:jpPo*2s,[/@rfI5EPPg[EPlR-LPph&e?<j(nS!f\/PE:la
+LPLG4Jpi#nH\[?0L51YAKnbD@M2R7$@UZ57Zi[YB[/I94Z*:I9ri70AWMcSfUnj0uR!aF>MNF$c
+P*;)mP*(ojOckomP`q>qrKIJJOH>NaOT(=:O9(E%r/CN2rJU`6regf9Mtr;?NK0'[NfT9`O,f6]
+Nr=q9N<5-"N;eb7Mu\e6M?&M3L]<)-K`6]*L]<,/L]<,/LB3-br.tB.s,$c3p4r[(!JcL1LB<<i
+M>2u)M#iKjreg]5p5B'2MMhCkrJCl=N/WaVO,oBbrK@2E!1!PLr0Ib>H[0saCN=?1DG9h"r(d/c
+ohbB[q,.5s=oMV)=T_i3>$Co.r`B;)=]eg/r`9#"#Zb&-<`W4!<J^FE!2K@cs/#[k!2o^kr29Ro
+oW%_fpo=@ps/bprriH.%!j8`2rNZ@-r3HO5[C*HOr3l^:\c0/K]=u(ta3;r_hWF1rqYpL1Z)XL]
+K78;tL8h>GJUDliJ<Qe0YcXu'Y5`hKI/\P@IXcluJUrE*K7nr5L51SAM2I4MN/`jYO-,TgPE_>u
+Q^F20S"#t?StMdNUSO``Vl6SpX/rG+YctF>['d?O\@K2`]Y;.r_8=+.`Q$!?b0.uQcHjkbdaQ^r
+f%8R-g=tE=hV[8LioB([jlYail07L!m-O--n*fc9rpg?do^qhLp@e7TrqQNhs8)Wirqu`no_sFA
+JcE.XJ,~>
+JcC<$OT4hLqu-Kkq>:0frqZHdrqHHdr:U*^rq$*Zs7--YrpTmTs6]gPs6B[MrosIH!9a@D($4N:
+j,AnSMM[.ELPCP;KS4u2KS+pTK)U?!JGt#uIenQoIfFoiI3r`?<,6#EF`MG7@qTIUJUr5sG]n7O
+Df'9(BO?"JJ8K7JI!g9fI/\KmHLH+ZGl2jIGl2j_H3&A?q0`6lrd=cPr_NQ<rc8`lDej-'AS#@[
+@:!8G?=me\AnG]TAIN0`AnPaV<`O^,LkgfbL'33`K7nmVK)U<5IsucoIWL[%CiFH>I!pEjI=;$@
+!.4Tj!df<Ard=`ms*=Zlrd+Tiq0MsarcnHer-80apNZ[_qg/6g!IB%jHMr3fHMi$gGl2dcGR8S;
+F`_bKFEDYJqfMj\r,hs^r,i!_rcJ9cFa!\,s*4Qf!d8^/olg4T!d8d3qfqp^!.+Bbs*FrtI=6Kj
+I=;'Cs*aors*t'!rIG?,F)Z#8DJ!NnAS"R1:&Ica:\@QY;>F)k:esmc;#X8h:^^,r:JO_^:/=\^
+:f%'cs%iYi"&DWbD=<A^MslVuN<+utq2Y?3rf6r<qN1W;qNCT:nrj!9,a=R\S=ud[ZFdrpdFd@9
+P)Y?IFDl)8GD_<-EGfZ.DL-njM21q\s*F`nrdB-BIt3'#JV&N,KS>/8LPUeDMMmFPNK0'\Ocklk
+Pa.Q$R$jD4S"6.BTV8'SUnsrdW2ZetXKAY0Yd1UB[C3QS\[oGd^;%J"_Sa=2`lQ6DbKJ/Ucd:(f
+e'uq!f@\d1gYCWAhr*GPj5]4^k3(sml0@U$m-X60n*olHnd+jZo_%nNp@n=\q#C0iqYU0hr;HTd
+rdk*#s0_lW~>
+JcC<$OT4hLqu-Kkq>:0frqZHdrqHHdr:U*^rq$*Zs7--YrpTmTs6]gPs6B[MrosIH!9a@D"6JV(
+j8N*Z<W?#";cH`i<Vobo;uTYr;,U?k;ufkq;$'Qk;>3s(.k)u%/2B1B1G:C;1H.Wd5Wq4m3]fG&
+2[2,g5=e:?;"R]Y<;onp<9$pV<;KPc;B8\6;Gf#(1bq6Y4$5Pb3B&oV2Dm6G0J>+50JkRArAFU3%
+lH1#2)RNZ3_)b58kV`I8GG^R71D^Q6UO"%;,C(e;H$Oor_rbn!`Mupqbd5g"&i)q;ts8d;ZTcnr
+)3Pns&8tsp/M&jr`&\lr)ESms&/eor`&nrrDNSmr_`_nqbmGk"]A2p:f1*h;#F/j:\R`K;Z9Mn;
+Z0Ms;H$On;YX,h;Yj8_;ZBVo;ZB\q;Z0N%;Gg7f;,^:c9M7uOpeCZ]r(lu^pJL`arB(*D55[PK5
+!M7t5X7P#r^$NKr'13H"?o%45=kELr`K2%rE/nts&f8's&ePhqcNi#rEAo!"Bnr2>$Cf+s'#5$r
+E0)$!EN5"<[h$J;GpFl<**:1@VKb'I"R<;P$(sk<)6=b:/Fke:JXh^:/4Va;cH^nqbmH@!.=coH
+[^HpJ:W9'K7ei2L5(J>M2@+JN/WaVO,oEdP*;,qQC!u,R[]e;St;UKTqeE[VPgAlWiN5'Y->.9Z
+a@-K\%&u[]Y(tn^qmn*`5Ta;aND]Lc-FY^dF-Lne^i@)g"P39h;7&Ii8WeWjQ5Oekiq?slg4!*m
+dKW6nc&(boCV\Jp%J+Rp\ssfq>^<gqu6NlrUg)?s+13Xs*t~>
+JcC<$OoOnLr;HQkqYU6frqZHds7cNdrUp0^s7?3[s7--YrU0gUmHso>s6K^Ms69RI!9a@D!TiDA
+irS/?ri-'uVPL!dU&^ndTECgXSt5eKrgNhRqNq2Ipm(W=+H(o9K8?+hQB-f]MMnX=WhuScT:D42
+OH#-UaN^H(H\D?Yq2Xa"m#:[ur/Lc<rK.#@!KrZEPlI!]QBclH?=$m.T:D@;PEV,lN/*/eK*-[T
+I!bjH!/LQ1!euMere^hf@q&lUqm?=-s03fQYH4e*Wi;nmUSP'0W-WlGMN<p`PEV/nPEM)kP*1rj
+PE_=1PQ$dOOcYZcO-#HaplGQ<NfF$s!f`.trJUZ6r/:?/rf-o;!frG(r/Lf;N;\_;NfB%rN!#&u
+N/R[m!JuX2LC8fhKnP,5KnbA<L5,MZs+gZ3rJ:K1s+pN,!/UW0reUQ/!JlU(MZ8P4M?&M4MZ/P,
+N;\\7MZ/M8N/`hrNrkE*Oo:FDPEl-6rg3\Rrg4%YI<p6dF_Yf4Dg2+Rr(d2dp/(T_pepfas&oS.
+=^#$5>5h\(=9M].=]ef*<rQ/+<``:%<`E!tH2=91V#R:jVZ3RlVYd7kWUm.dX7rXoWrT6oXT5I$
+XTGZ/Yl:p+ZM_$3['d<M[f*ZJ\@K/]]",Ge^qn(9e(ER@mI^;Srtj:kUS!HqJ:E$2U=4mGH[:'h
+Su&ZnX/c'"!IK4nI=$EmJ:N3%JqJ]/Knb>;Ll$tGMi<USNfT9aP*2#oQ'Rc(R@9V8SXuIHTq\<X
+V5C/hWiE/&Xfnt6ZEppH[^`lY]=bhk^VI_'`5Ta:aN;TJbg+M[dF$CleCN7'g"P08h;-rGi8N\U
+jQ5OdkNM0plg4!*mI'H3nF?MK!V>s_p&F^cp\jmeq>^<hqu-HkrUg)?s+13Xs*t~>
+JcC<$OoOnLr;HQkqYU6frqZHds7cNdrUp0^s7?3[s7--YrU0gUmHso>s6K^Ms69RI!9a@D!TiDA
+isOe(MMd7HLPLV=L&?T(KDU9#Jc1*"It7BF!.Ofp!.OTh,&Ln#CLUn!FDbi)C1q:5IsuckG]n7L
+DJa-%BU>-:Bl8!<rd=Tis*EsUj*:HHqKi0g!.=Wk"+GZ(?2dY"GQ2^jEGoc3D/3`pA7GOH#$tSH
+AnGUeral1BB)ZEG<`N1#MZ&A0L'NEcK7no1JqEuQ$\*VRIX[9/CiFH=HMr6nI!pG@HiSNjI/\Kl
+I/eQnHN/?lHN/9cH3eeBH$Xa]G^"B.GlN!cGQ<$gGlE!bHN/?jHMi-cHMi$iG^"B0GQ;pdFoQR_
+FoHI`F*.A'rcA-_rc\<arc\<arc\9b!d8d3rceEemrn_R!-\?cr-8$_r-J9d!.4]m!I]FqIJnWo
+I/n`qJGautJ-paFDJsH2AS,LaC&C^':Amu^;#4&a;YF&f;#X5t:esna;,C%`:f'pd:B=9frD!>g
+r_EJf!+YPVs,6B*o8WU,qMkK7rf?o;r/pf<pQP33s-*JG-^9m_S=uj^Zb+)sdb<X=k,jf*L3R`Y
+E,g;YTlk<mD/F6BKStY@KDU<&H[Pg@H[^HpJ:W9'K7ei2L5(J>M2@+JN/WaVO-#KeP*;/rQC!u,
+R[]h<StD[LU8+N\VPgAmWiW>)YHY:;Za@0L\@K/^]Y2%o^r!t,`Q#s>ai_fNcHab`dF-Oof%8O,
+g=k?<h;7)JiSrnYjlY^gkiq?tm-O-,mdKW6nc&([oCW%Ts7QHerV6Egs8)ZjrVZWmo_sFAJcE.X
+J,~>
+JcC<$OoOnLr;HQkqYU6frqZHds7cNdrUp0^s7?3[s7--YrU0gUmHso>s6K^Ms69RI!9a@D!TiDA
+irS.?r`'&";c?Zh<V]Vn;uKSu;cH^p<)Z`p;>sDl;>F*6/1;r#.P<_=1Ggd@1,D9_5s7@n3]oJ_
+2`<NO91qiP;,gNo;ZK_j;tO&g<W#hU;uTbm;tX$&;c58%2Dd3R5!1ti3]]5[2`<HH2#]3/0E3j0
+1Go(g!Al\51^l6(4Zb_t8P)NI8P)JP7fl.M8H)*d77K^77RBF"5YFrP;Z0So;uKSq;c6Ni;>jDm
+;u]bq;u0Dd;uKSs;,U:j;tO#h;uK\q;u]ho;uTbp;uT\n;uK\q;uT\n;Z]io;>X8j;$9co;,C-h
+;"7E^;?0Sl;?0S_;ZBSo;Z0Po;?Trt;GpBj;Z9Pm;Ys>`;Z9Mp;H$Qj;[69#;G^1f<)!9aqb?u`
+rD3,`qGI#cp/CuRr&k<L4[2.s5sRY$rB^HKr'13H"?o(65=YBMrE0)$r`Jtt!*K2&s&eSiqH3`"
+r`]#"!ErY)>5VP&>5MJ"=9)G"<\%-J;,L4i<**:2@qfn*I>!N?P*9EZ>#e<n9hnJ];-cso:/+DW
+;H-Rp<)EHi!IK4nI=$EmJ:N3%JqJ]/Knb>;Ll$tGMi<USNfT9aP*2#oQ'Rc(R@9V8SXuIHTq\<X
+V5C/hWiE/&Xfnt6ZEppH[^`lY]=bhk^VI_'`5Ta:aN;TJbg+M[dF$CleCN7'g"P08h;-rGi8N\U
+jQ5OdkNM0plg4!*mI'H3nF?MK!V>s_p&F^cp\jmeq>^<hqu-HkrUg)?s+13Xs*t~>
+JcC<$OoOqMqu-Kkq>:0frqZHds7cNdr:U*^s7?3[s7--YrU0gUmHso>s6K^Ms69RI!9a@D%cud4
+j5].XX/`2!VPU)`rhBCb"J;9WSXfYJrgEhTrg<SL!g]+;pQbT>,+aaHP_b$cS<]1lO,T"!Y,\Cq
+UnX<DQ]R2bMW;4RF*`Csrf?l8k`+tgp5T!1rK.#@!g8b2r075H*.EBE?<j(oSsl(3Q'7;gL51G6
+K7\T!I"d6-Ll)+e!Ju^5MuR8h@UQ[Qr3ZF.rim$<XfJM&WMcSgX,i0aIY3N=r0%#Bs-!DErK7;J
+PEM,nrKIPMOH>NaOH>OtO9^i+N/WaUN/[[ms,?l6pl,64rJpo>r/UZ6s,R,=!06r9s,?r8!/g`1
+!euD_re1<*pkS[$qMG*)!/UW0rJ:K/!JlU(MZ/G5MMqFj!fN"roo8p/!K2j7MZ\otNfX.#!0R5D
+"I,1;R$dl@!1NhR%%<$%I!g6^Ec>i79hkR]rD3/ar)*;gl;R^c!aAi4r`KA+='/O+r`K5&rDrr"
+rDj#";cIK0U&^taV#R:iVZ3RlVYm=mW2]BgqQ'@js/Q.$n>ubpYH\#2rj)I.s0Vg6!4Mg7s1&$<%
+(j6h_T:!Ng#2&]p&+^e(U:'8Q\Bs;I=\$%_1[/dGCkpOV73P.Wr&t"I/\PCIXcluJUrE*K7nr5L
+51SAM2I4MN/`mZOHG]hPa.N"R$a;2S"-(AT:qsQUnjlcVl?\sXKAY/Yd(O@[C3QS\[oGd^;%G!_
+Sa=2`lQ6CbKJ/Ucd:(fe'uq!f@\d1gYCWAhr*GPj5]4^k3(sml0@U$m-X60n*oi:o()DPo`"Lbp
+@n=[q#C0iqY^6ir;HTcrdk*#s0_lW~>
+JcC<$OoOqMqu-Kkq>:0frqZHds7cNdr:U*^s7?3[s7--YrU0gUmHso>s6K^Ms69RI!9a@D&*;m5
+j5].XMi*@JLPLV=L&?T(KDU9#JbjooJ,aupIfOrkI3NfH@;]XdG'%V;Anl$nJq8B!H$OUTEH,i2
+BP=`0M.gaHGlE*eHN8BUH/s5HH2DpfHiJKiI0!Y]r_NQ<)0L"@E,fc4CLq'e@:EYP?!V#QAn>Rc
+AnP`TB*DsM<`W4XrJ:B+s+CH+KS05T$\<eVIX?'UC2S$7HN&BjIJ/'fHi8?lHiJElHiA<kH1ZF_
+H22^bH2MpdH2`'gH2;jcHN8BgHiJBlHi&-hGm&G=G^+H1GQ;seFT?O]FTQZ+F8^7[F:*/6GB\1Q
+G'A.QG5ZXbFoQ[aGl;jdG5laeG'Eb*rcJ9cGB`t0!."Eer-S?f!.4]m"+>WHIJA6kJ,XusJH1<"
+JII-SE,T]4C1q3iB2),!:Amu_;#F2e;X.0\;#X5k;,@-e"&DZf;#O/j:f%$b##@ui:/+JcoSW[,
+mu6t"!fW+uqMtH4rJpl<qN1Z<plbB8n<,8bPa.W,U8P-#]>MkAg>:iNkNS4mMgonjE,]rRPEKs'
+E,'<:Jq]/=L4];V!.=coIXZcsJ:W9'K7ei2L5(J>M2@+JN/WaWO-#KeP*D5sQC+&-S"#q>StD^M
+U84T^Vl-MoX/rG+YHY:<ZaI6N\@K2`]Y;.q_8=+.`Q$!?aihlPcHjkbdaQ^rf%8R-g=tE=hV[8L
+ioB([jlYail07L!m-O--n*fc8nac8Bs7H<`!quB_rV6Egs8)Zjrqu`noDX=@JcE.XJ,~>
+JcC<$OoOqMqu-Kkq>:0frqZHds7cNdr:U*^s7?3[s7--YrU0gUmHso>s6K^Ms69RI!9a@D$K^@0
+j5].X<`N.!r_ierp/UrgrDWVl!*&nqrDEMis&&Yk$8*eV0In_82Dm9Er\OR@&j\ZD5<Cqf3&iiT
+2JGTT9MeSar_reopf$ibr`/hpi`#kVq,?ras"5o^1c%<Z4?Ybe3]K)X2)I$D0ek@80JtXB1c7*H
+2)R3J2)dZ]4$-&+8P2WI8P&hNs$cuZr^RDd7R]d86S^eo:Jjtf;YjAm;uKVo;u]bm;%$9#;GpFl
+;GpFl;H*KkpJ_#gr_W\o;u9Mo<W#hr;uTbq;u]ko;ZKep;u]bo;u9Ms;c6Ll;uKSo;>X5k;uTVu
+:f1%c;,C*e;$Bip:f1(fr)*JlrDEPls&&8`r_WYnr_ins;,^Em;Z0Pk;Ys>j;?0Yp;ZB\k;Z9Sp
+<;ohn<!cQ$:f11k;,'_Vr_<>drD3/ar)*;gl;R^Fs#gTN4?btp5sR[462s4J56*nH5lWtI6hsma
+=T;J$=Sc,!=T2J'=R'&d=T)D%>4u1t>5_V&>5VP%=T)>"<\IHP;c6Ii;H$Os>@1lTE-?\aMiNm_
+Pa#BU=]J<q:JFP]=B83n:/+J\<Dumt;c!9h!.=coIXZcsJ:W9'K7ei2L5(J>M2@+JN/WaWO-#Ke
+P*D5sQC+&-S"#q>StD^MU84T^Vl-MoX/rG+YHY:<ZaI6N\@K2`]Y;.q_8=+.`Q$!?aihlPcHjkb
+daQ^rf%8R-g=tE=hV[8LioB([jlYail07L!m-O--n*fc8nac8Bs7H<`!quB_rV6Egs8)Zjrqu`n
+oDX=@JcE.XJ,~>
+JcC<$OoOqMr;HQkqYU6frqZKerqHHdr:U*^s7?3[s7--YrU9dS!:BaO!pf.:rojIIkPjT]jlGL_
+j5T%Vi2WcTVPU)`U8"?STV%jJSXfVIs-`qUrg3bRQBqN:!1*;Cq33%cLR3mPBqC`VLlI:OXf\S"
+Vkg#VR$<_mM2QSAbAr#\L]3A/Np2PjN:r8/NW>.>OSt:BP*>g.+-h2%?=-s/T:MI?P`q>nN/<4@
+K7ni,H?t:"Ko(VBM#E/:MMktS@UQXP['fn?r3H@-&?i4:X/W(rUgB5-Q[XOCNg'@'rfdAFrfR2C
+qih&Es-3VJOn"M7O,f1tNW4t9MZA_5MZeuuNJrkqN;nn9NWG6&r/U]7rJh/CNfK*ZNK&sXrepo9
+M2;.dre:B*"bh\dLPUcaLB<9gM>i>+M#`A0L]<20L]*&/LB*2*MZ&G9MM[1IMuAM7Mi<VeNW+k=
+Mi*CMrepl<OSt:AP5^XPPa.N#R$sJ3R@9TCRJiQ^IXHEfH#I\>E-=uOrD35cr)*>hnPf!Xs&oD,
+r`KM/='/O+=]ej0rDrr"$<C5/<E3!t=JDObqP=.frMKRlrMKIi!3,RiqQ'@js/Z1$nZ;kqYH[u1
+rj)I.s0N]P[^NZS[^W`U\@K,[]">\l`6$<SgYqAap&+Xc(U9s5O+i(4J;USeRY?-8G^l0ZXg>+0
+XS]4#I<p?lJ:N3%JqJ]/Knb>;Ll$tGMi<UTO,oBbP*;,qQ'[l*R@B\9St;UKTqeEZVPgAlWiN8(
+Y->.9Za@-K\%0&]]Y2%o^qmn*`Pom=ai_fNc-FY^dF-Ooe^rF*g=k<;h;7&IiSrnXjlY^gkiq?s
+lg4!*mdKW6nc&([oCW%Ts7ZKerqQNhs8)Wirqu`no_sFAJcE+WJ,~>
+JcC<$OoOqMr;HQkqYU6frqZKerqHHdr:U*^s7?3[s7--YrU9dS!:BaO!pf.:rojIIkPjTPjlGL_
+j5T%Vi/3AJL]3#.L&H])KD^?#Jbss!IsukGJ,OipIfOrjI3EB9E+WQYF`D81BkM15JU`)pH?OFO
+Df'9&BjGkOBPh^3rd=Qhrd*gSjEUNHqg/6g!.=Zl(gL?B:ec.XFEDSCDf9K.BObO]@pr_M?"O"I
+s()4CBDuKMB4t@I<`P!4M26ucLAuo.K7nmVK)^B.Ist%2Oa_1gFaF%8s*jloomHacr-SNlI/SE_
+HMr-fGQ`;:G^4T6GlDshH?oL7s*=HeoQpXcH[G^;"FGH?H@#I5s*"HdqK2paF`_\HrH8*]!HiSb
+GQ2jdGQ)dbG6E)3G'A0/GkQ@]G5ZUgG'.qNGB`q/q0MscrHeKj!.=cos*jrsr-nWps+(-$s+13%
+rIOp!$Zg<,Df0-!AS#RN:Amua;#F2f;Xm]V<!,om;,@-e"&DZe;#X8j;#a>j:&n)g:B+&_MZ8V'
+N:W&*Nr"b7Nr>%9OSt=:P4t1/Ot;f^Q'n5<W3<VA`6?]`h;RGWkj%MtNei(+EH?/HNi%8GDJj61
+ItNK7LP1?XL&QLHIXcluJUrE*K7nr5L51SAM2I4MN/is[OHG]iPa.N#R$a;2S"-(ATV8'SUnjlc
+W2ZetXf\b1Yd1UB[C3QT\\#Mf^;%J"_Sa@3a2lBFbKS5Vcd:(feC<%#f@\g2gYL]Bhr*JQj5]7`
+k3(sml0@U$m-X60n*olHncA@Srq6<bs7cNfs7u]kqtpBjrVcBfJcC<$[/YX~>
+JcC<$OoOqMr;HQkqYU6frqZKerqHHdr:U*^s7?3[s7--YrU9dS!:BaO!pf.:rojIIkPjTRjlGL_
+j5T%Vi)N`U;c?Zh<Vf\n;Zouq;,U<i;ZK_p;>X/i;>X6+.k!2)/20"?1b^aA1dOGo4Zkkg4$!:!
+s"t!65>b0O;,[Blr)3;goi1rkqc)QRr`&_mp/:oC#rXUq5!D%k4$#G%3".Z$1G^d?0J>+;1c%&h
+1]TE31^l9+4Zb_t8P)QJ8P)JP8,l'X7fZ$X70Q.J-9XXkr_`YnqGdJnr_i_o!`Drpr)!Yr;c?Rn
+;cNZnrDN;es&/ems&&hqr)E\r!)rkrs&8nrr_iht<:a#g;Z'Jj<<#hu<)ZXlrD<r#;,U:j;Gg:f
+:f1'b;?'Mr;,C+fr)*GkrDESmr_`Sk!)ren#Z4Jt;c?Rk;,[Bl"&_uo;uKVn;u0Dh;$'Wo;uT\p
+;Z]io;>X5k;uTbr;u9Mo<W5r*;Gg7f;bKkY8ki&UrD35cr)*>hnPf!Xs#gWO4?bto5sRY"rB^HK
+r'(BL5X7Ot4@&gIrE'&$rE/nts&f5&s&eSiqH3`"rEAo!r*'#$r`]5&s&f,!r`9&!,?.T>;,L4h
+<ENI4ASZ:0IYEZ<O-,WjPa,ET=&Vsk9MeSf?N*_,9MS8Z<Dumr;c*?irdB*AIt3'#JV&N,KS>/8
+LPUeDMMmFPNfT6_OckomQ'I]'R$jG5S=Z=FTqS6WUo(&gWN*#$Xfen4ZEppG[^WfX]=bhk^VI\&
+_o9U8aN;TJbg"GZd*^:keCE1&f\5'6h;-rFi8N\Uj5oFckNM0plKdg'mI'H3nF?MK!V>s_p&Fac
+p\ssfq>^<gqu6NlrUg)?s+13Ws*t~>
+JcC<$OoOqMr;HTlq>:0frqZHds7cNdrUp0^s7?3[s7--YrpTmTs6]gP!pf.:rokKfkND!ijlPR`
+j5T(Wi8CW7Vl-DfUnXQUTV%jJSt,YHs-`kR!gf4=rg*VNp6GH<,F=CBOG.>@R?<D\Nf.VSWMlYg
+St)15PE1]\AEqm=H@L^1NrG+6NpD\kN:i2.Nr>(=OoLREPPp_"H[T7/>Fh=TR[TJ)P`LcZL4k/4
+Jq8;qHA701LP^kFMM[1JMdp7+Fge]b[C*BKZi%*BZ*1:1X/W(sUp7Y4H[UX-Ockolqi^uCs-!>C
+s-!8Cs-*VNP`_+,O8t@7O8t@>N<kQ(N/NUQN/NYoMuSb5N<5&uNVne:O8P%8NVAG@O,f6[NJraO
+M2-k@re:B*s+^Q/q2"X!!/UW0oSEC%regc6r/:Q3s,6i5rf$N0repr=Mi3PnN<,'$rK7,C#a:L<
+QBml*R@=,C!LfGTRf8fVS-tO0I=-<[Ec>o::J^d_r)*Aioi(Tan5THlr`KJ-=BAR,=B\i*<rZ5,
+<``:$=&i4"U\pniV50rarhfXlrMKLj!N<!hWqrdjWrK+"XRN=nY-5)/Z2M!+ZNRYC[C3LB[f*]7
+\.-$^^;._1cdge0kj\<Dq#;/DZD=(NJq/<%Tt&.!IX?BkL7kBKY-"c$YQ'"OIXh?IE.NUnK7nr5
+L51SAM2I4MNK0'\OHG]iPa.Q$R$a>3S"6.CTV8*TUnsrdW2cl!Xf\e2Z*L^C[^N]V]">Vg^V@V%
+_SjF5a2lBGbKS8Wd*^7ieCE.%f\,!5gtgfDi8ESSj5f=ak3)!nlKdg'mI'uB#4V0Ro(2JFrq-?d
+p\4X]s7u]kr;6KkrVc?eJcC<$[/YX~>
+JcC<$OoOqMr;HTlq>:0frqZHds7cNdrUp0^s7?3[s7--YrpTmTs6]gP!pf.:rok'ZkND!ijlPR`
+j5T(Wi8BHKLku%b!/:E*s+C<&!J,k#Jc($"IsukGJ,XoqIfOrjI3WZD@VK=PGB.P6@qo[XJpr,p
+G]e+KE,TQ,B2Z::IVj(HH[Ga>qKr3flZqN8qK_sarHeNlrI+]Os%ibkG'3e*%WH?)D/3cq@prkU
+?s[,EralRMAnPdjAnG^i=&r@2re^Z2s+UZ1L5(A8re(3%s+(K+IY!B/CiFNAHi/<lIf4]fI/eQj
+Hi\SAr-S$]r-A<es*4Thrd"KfrcnZnH$OX[H2`*iHiA?[HNSS@I!bj=!."Kerc\?crcJHhF`hkN
+F`_a#FT?UaG5ugcGQ2jdG6E/7F`hp*GlMsfGl2dcGQE#3r-/-`rce9b!."Eer-SEhs*FcoIJeQn
+J,F`sIt3(KJH1<$JH:@Rpjrm&EH#l7BP(jeAku4u;#F2g;Y<u_<:Eoc:]jKg:/Lpcr_NSjr_<Gh
+r_<Mj9hbGA",i%pMslVuN<5&uNV\\4NW"n:O8G%;OnY%5PP^LCPP^LDPEPp-/X)HcR\-@SYd_<b
+bgY8#i8`q^l0IZ$P`1?AF`DDCL6.^FE,KN1Ee8q#M2-c\L&ZQ%IXh?IE.NUnK7nr5L51SAM2I4M
+NK0'\OHG]iPa.Q$R$a>3S"6.CTV8*TUnsrdW2cl!Xf\e2Z*L^C[^N]V]">Vg^V@V%_SjF5a2lBG
+bKS8Wd*^7ieCE.%f\,!5gtgfDi8ESSj5f=ak3)!nlKdg'mI'uB#4V0Ro(2JFrq-?dp\4X]s7u]k
+r;6KkrVc?eJcC<$[/YX~>
+JcC<$OoOqMr;HTlq>:0frqZHds7cNdrUp0^s7?3[s7--YrpTmTs6]gP!pf.:rok*[kND!ijlPR`
+j5T(Wi8@U7;c?Zh<Vf\m;Zfop;,[<j!)ienqbR8iqbeXi.Ocu#0f_*H0J>1;2F0Sm4Zkkf4$,D\
+2`*+':e+D\;c6Nm;uBPg;u0Jn;ts>M;uTbm;ts6(0.o+=1-Ri_4?GSa3&iiT2)I*Er%S.-s"t0@
+2)R3I2)R9U5!(t-8cMH`8cM?]7fZ$X7fl.M7/fU^6T@;':f:4j:fC<f<<#ns;Z'Gn;Z0Gm;Z0Mq
+<)Zcp;ZTlsr_iAes&/kor_`_pr)<l#<)Z^p<)`cqrDN\qm8Nm]r_inu;Gg9f;>sJn;?'J`;?'Mr
+;,C+er_iYks&/hnrDNYos&/kq&5lA';c?Rk;,U=j;c6Ii;cEZnrDWSkqb[Dm;cEZns&/ts;,I-f
+!)rkrr_rbpr`/tts&B5%:f1.h;>s5j92A@Z;#F2g;Y<u_<:Elm4[)%o5sRY!rB^HKr'(HN5X7Ou
+4?ltOr)`r#rE/nts&f8'r`JJhqcNf"r`\u!r*'&%rEB,%s&f/"rDrqu-W<o>:f1+g<`rX7Ao)L4
+IY3K7NKB<dP`q82=^+j&:JOV];cm$p:]=&m:K17n;cHWj;u_7HIXh?IE.NUnK7nr5L51SAM2I4M
+NK0'\OHG]iPa.Q$R$a>3S"6.CTV8*TUnsrdW2cl!Xf\e2Z*L^C[^N]V]">Vg^V@V%_SjF5a2lBG
+bKS8Wd*^7ieCE.%f\,!5gtgfDi8ESSj5f=ak3)!nlKdg'mI'uB#4V0Ro(2JFrq-?dp\4X]s7u]k
+r;6KkrVc?eJcC<$[/YX~>
+JcC<$OoOtNqu-Kkq>:0frqZKerqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6B[MrojLJkNDj,!TiDA
+itUM3i8EMLWMcYkV5'cYTV.pLSt2GKRfJlUQi`V?QN!3NQM-U>PTuc]K9h:HTpq:+KoD"(Y-4e$
+US+3FQB@8eMMf-hSp#I6NfO$uooAF!m#:UsrJgl=rK.&ArfRDJPa$TGr`oZ!SXZ.;rf\OfMMd4E
+KnY/0H[0plL51S@M27"FMMmC%@UkS0['[6K[']h=rj!'>YH=k+WMuhgQ]$-=Ko2#jPP^OCP66u1
+Oc]R)s-!8Cs-3_NP*(ierf@,@q2bcBOH>N`NW+q?O,f3Xr/CT4qi(rCN/`gWNK0!YNK*ptqi1T8
+!0@)=qiCc;s,-u:M26rcL&Qi,L]<21M$&QjLkttc!/gc4s,-f4!/UT/p4ra+MZ&G5MYi>3Mu\e8
+MZ&J5M?AcqNK*ptoo9!1s,I&=!frG)rfIPNPEV8sQBmo*R@=,CrL3bUrga"Z%%NfUIslWgG]%J;
+EL6Q!rDEMkpJ^ofpJpW^s&oA'"^"i/=BSc)<rZ5+<``7#=&i4"rhTLhrMKOkrhfUk!N<!kWWK6$
+WqrdjWrK."XRWFmXoY`1riuI.r3QF1rjD^5r3u^9%D'3d_8a[Fe_T9MnFleRrthrBTp1FbJV/uk
+fqa=LIs?O0VPpf%XfM<%!e#NIrd]<GJqJ]/Knb>;Ll$tGMi<XUO,oBcP*;,qQC!u,R[]h<StD[L
+U8+N\Vl-MoWiW>*YHY:<ZaI6N\@K2`]Y;.r_8=+.`Q$!?b0/#RcHjkbdaQ^rf@S[/g=tE=hV[8M
+ioB([k2tjjl07L!m-O--n*fc9nac8Bo^r.U!quB_rqQNhrqcQirqu`no_sFAJcE(VJ,~>
+JcC<$OoOtNqu-Kkq>:0frqZKerqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6B[MrojLJkNDj,!TiDA
+isXl*i8EMLM26qAL5#SZs+C<&qLSTq!e5ZJrdXorrI=irp3e0-C12$k@sE$1Bk1mk<e>pOI!U$[
+Ec>l3BP;%=Q$m@bF*`32I/83hHL#k:Gl)d`HMi*mI!pEM?N*\5G]n.NEc5o6Ch[TrA7K+X?s[,E
+r+6%DAnP`TB`;$4FT%%$Lk^Y<L4t;7rdtZ3K7\Z+IrfaRC2\-:Hhr0jIf4]eHiSNgI/SEaHM`!e
+GlE!eGlDsgHN&0nG^4R\H@,U:om6[dqKi6jHiA<kH2`'cGPQC_F`dG%s*"Eds*+ZiGB\4Rrc\?e
+rc\0`s*+Bc!dAm6rce?drc\HfGBe?1GQN/:HN&9jHM;afI!pG@IfFoqIKG"LJGt*"K)U>rK)L</
+JoPaLDf'-#AS-Dg;#O8i;YO,d<;0D\<rPqq:B=3erD3Gi!)NGd!`)NbregZ4mu6jtqMtE3rf6r<
+r/gi=pQG97rK@2EqiWh#P*1riP*;,rS"QRWZ+.NfbgY4uhr<_Zkiq<ok*;!cIs>sTEdWtGKQ:sL
+CN"QPKo:bBK_gB(I=?\FJ9lcuK7ei2L5(J>M2@+JN/`jYO-#NfPE_>uQ^F20S"-%@T:hmPUSO`a
+Vl?\rXKAY/Yd(O@[C3QS\[oGd^;%J"_Sa=2`lQ6DbKS5Vcd:(fe'uq"f@\g2gYCWAhr*JQj5]4_
+k3(sml0@U$m-X60n*ol;o()DEo`"Lbp@n=\q#C0hqY^6ir;HTdrdk*#s0M`U~>
+JcC<$OoOtNqu-Kkq>:0frqZKerqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6B[MrojLJkNDj,!TiDA
+isF`(i8EML<)Z^pp/UrgrDNhs;,L4hr)<Slr)!Air)+(X.O[#&/NP^E1GCR?2a]kqr]LBG3]f5Y
+r\b!L7n6?P;c6Nk;uBPg;uK\n;ts>M;uTbm;u0Am/hd2\)a6DH4?GSa2`N`S2)I*E0JG.60JkUD
+2)I0I2#]?82a0Df6iK[W9E.T`8H20[7fGme7Roj777Amo7Sco[<)W]p"&i/u;u9Po;Zfor;cN]o
+r_`bo;Z0Pm<;ohr<<#km;u]bn;u]_u;,C+f;Z0Pr;cH`p;ZTirr_s&!;c6Ol;Y<rg<;TVn<!$'!
+<;fbq;?'Jj;>jDm;#jGg;#jMk;$9co:f($e;Z9Pn;Z0Jk;?0Yp;ZB\q;>sMo;$p3";c6Lj;,^Ck
+;Z'Jn;?0Sl;Z0Jm;ZB\n;?Kcm;,dEks&8qss&0%u;c?Xpr`/ttrDa2(:f1(d;G9bW925:[rDEMk
+pJ^ofpJpW^#!P7;5sRY$r^$QLqEG*J5<q=qpfRAos&f5&s&eSiqH3`"rEB&%!a8f4qc`r$r*'#$
+!*K)!rDj_7<)ZXj:f1(g<a&d<B5M^8IY3B3N/s)"OV!S6NEK@d;Gg4b:f1;(:espe:'OQn;cQgs
+;#4)lI=?\FJ9lcuK7ei2L5(J>M2@+JN/`jYO-#NfPE_>uQ^F20S"-%@T:hmPUSO`aVl?\rXKAY/
+Yd(O@[C3QS\[oGd^;%J"_Sa=2`lQ6DbKS5Vcd:(fe'uq"f@\g2gYCWAhr*JQj5]4_k3(sml0@U$
+m-X60n*ol;o()DEo`"Lbp@n=\q#C0hqY^6ir;HTdrdk*#s0M`U~>
+JcC<$P5k%Nr;HQkqYU9grqZHds7cNdrUp3_s7?3[s7--YrU0gUmHso>s6B[MrosIH!9a@D!TiDA
+it(/.i8EMMhVG*-VPKr[TqMCW!hPsQqjRt^R@'A.QBml(R$X-5Q1pLdLhhs(BUb?NM3!RQX0&:r
+USFNNR$EbmM29KXSTK1/O,j'tq2YK9s,QK+m>U[srJgl=rK%#Arf[;F07A:V?!a.pSXQ%4P*;#f
+M2$\7KS4l'I!UO%LP^kDLl$tHMMkqPA$<>J['d<K[/@6@ZE^U9X/r;#W1_1TI=[37q31]=s-*JF
+s,d8Cs-!8Cs-3_NOcb`drf@,@q2b]@OH>P%NrG(DNfB$WN/`hrMZA_7NW+t<NW5%=N<"q9NW5%=
+N<5&uNW"n;O8k7?O8k=@Nt%,/N/NUOLkg_?L5(J<reCK0qhY</re^T2s,$c5"c8+nM26r\M#W>3
+MYi;3N;eb6N;eb8N;nh8N;eh9Nq856NfT6_OcfX+s-*JJrg!SOR/WQSRJiQSS,/ZdS!oe9OFDV)
+H?*tADK8QMrDEMkpf%)iqGlNUs&TA+='/R-=o;>#<rl?$r`'"u<2BMirMKOkrhfRj!3#Uk!3?+!
+qlBFj!irE(pT4FurN6(%!O&a+Z2V',ZN.B2[JmW3[h$!Z]=kqqa3;r_hrX.op\a^a)#LS7ToFbW
+K7fl'_2F"pH[146V6@J6Y,hE&!IfOtJ89^fK7ei2L5(J>M2@+KN/`jYO-,TgPE_>uQ^F20S"-%@
+T:hmPUnjlcVl?\sXKAY0Yd1UB[C3QT\\#Mf^;%J#_Sa@3a2lBFbKS8WcdC.heC<($f@em3gtgfC
+i8ESRj5f=ak3(sml0A97"mtaHn*olHncA@Srq6<b!;HHes7u]kqtpBjrVcBfJcC<$Zi>O~>
+JcC<$P5k%Nr;HQkqYU9grqZHds7cNdrUp3_s7?3[s7--YrU0gUmHso>s6B[MrosIH!9a@D!TiDA
+isar+i8EMMhVEsBL4t?\K`6W(K)1&sJ-LLPIXcitJ,XoqIfOrjI3NN=<+f`@F)Yu/C2%C5J:2`h
+H$44KDf'9%Ataa$B5M[7Hhr-dHiA?WH/s5IH2DpcHiJKn?3F)":j7*^F:N8.D/F'&ARf.X@UNMJ
+?2A.6B4h-V"BSW)L5Pqd#)7hcL4t;7rdtW2K7\Z+Is@)jDK9lGr-\QorI+]prI+!ZrHn0_qg&0c
+rd"Herd"NirH\?f!."Qiom6[dr-SHkrd+]mH$TC6qKDs`GPlX^FTQ`/FoHR`G6<)6GBj(1s*4Qf
+!Hr\bGlDp_GlN!bGlMsiG^4OYrd"Khrd4WjpNlpgIK"]nJ,ausJ,XruJc:9$JcCB%K)(&uJdZpF
+E,TT,BP(de:f.*frDNDhr)EMmi`6.X:JXa`:]F5k:]!li:JOVZMZ/P&N:i/3N/`hoNr"b6NrG+;
+OSk78P4t1?P5LM,P*;)mP*;)mP*(liPa.W,Tr+ot\\H//db!41iT'%^jlY[biR!dILO45dF*34t
+Oa2"cDJX<DKo(bDLP5MX!IfOtJ89^fK7ei2L5(J>M2@+KN/`jYO-,TgPE_>uQ^F20S"-%@T:hmP
+UnjlcVl?\sXKAY0Yd1UB[C3QT\\#Mf^;%J#_Sa@3a2lBFbKS8WcdC.heC<($f@em3gtgfCi8ESR
+j5f=ak3(sml0A97"mtaHn*olHncA@Srq6<b!;HHes7u]kqtpBjrVcBfJcC<$Zi>O~>
+JcC<$P5k%Nr;HQkqYU9grqZHds7cNdrUp3_s7?3[s7--YrU0gUmHso>s6B[MrosIH!9a@D!TiDA
+isF`(i8EMMhVD+0p/Uofr_iqt;,L4hr)<Pkr_WPjqbe%X-RpZ!0K1gE0JkRA6:*q!4?ia*$og1)
+2)SH#7SZfX;c<HjrDNAgs&Aqq"]A8t<)cfn<8^^T<;BJj;B.;B2)I0S5!1nh3]T,Y3&`ZN0etI;
+0/5+91c72h2#fE92a0Ae8H)3\9)qQ_8H20[7fGmd7Roj777B(":Jt%g;Ya;l;u9Pn;u]hq;uTYq
+;,[Blr)EYos&B"rqG[Dlr)<Vns%ikr;H$Ln<;BGt<)Zaq;c6Ljr_iDf!*&kprDWet<;f_t;Gg7e
+r)*Aipeh&hqb[>krDEGis&&bnrDEPls&8qqs&8qp#?"K!;Gg=j;uBMn;uT\n;u]_q;>a;m;,I6h
+!`Drqr)*Yp:f11krDEVor`&nqs&8nrq,RGo#?=`#;,U@h9`@]b;#O8i;YX2g<;KVS<WbTQ5X535
+s$6HG!'^BIs#p6]qH*]!rE9,%lrj0erE9,'qcj#&!*f>(r`T/&r)s&%q,dPr(0+:2;,C(d;,^P#
+?=[bfFa8FfL5ChJrJhDJN/<77=B\a(:ejb_<)uor:]F,o:/Y"f<E2soqGREDJ,Xt6JV&N,KS>/8
+LPUeDMN!LRNfT6`P*2#nQ'Rc(R@9V8SXuIHTq\?YVPg>kWiN5'Y->.9Za@-K\%0&]]Y2%o^r!t+
+`Pom=ai_fNcHab`dF6Upf%8O,g=k?<h;7)JiSrnYjlY^gkiq?srp0gUmdKW6nc&([oCW%Ts7QHe
+rV6Egs8)Wirqu`no_sFAJcE(VJ,~>
+JcC<$P5k(Oqu-KkqYU6frqZKes7cNdrUp3_rq$-[s7--YrU0gUmHso>s6B[MrosIH!9a@D!TiDA
+irS/urnn%=hVI"cVP^-fT`CbbT)bJ^SGeoXR[O/B#a^jCQ^F/,QBq91qNN1lMLpk@LS(*%O+iOR
+XfSP"UnaTOR$*YlN/;P<`c?KXLQ;.jqMtQ9s,QK+mYpasrf7#>rf@,BrK8+IIU?GfStVaHR[',$
+Oc5*MKS>&2IslcnKntQaM$f/tM2R:L@U`iW\,E`6[/@6BZ*1=2XJr4sUQp1UL5_:ZPEPg,qi^uC
+s,m>Cs,m>Er0.,E#*Y13OH5HarK$i;!g/S+rf7)?O8b4BO,f8"N<"q:MuAY7NrG"<NrG%<N;ee:
+Nr4n7NrG+;O8t@@NWtK%N/NRMM#N/0LAcl/Ll$ufMZ&D/M?\opMM[4IM>i>2M>;r/M2I2dMu&D3
+Mu8P5NVeb4N<#"<NW5"=O8b7@OoLUEP6-u6QN!3OR$mrBrg<kWS"#rDSc>/fS=Q4@IXHNiG\h>9
+E;i`6;Ya8h<;]bd<pWoe<WQ<(r`B2)=8c2"=8u;*<E)st<2HGjVYm@lVYd:kW;!:lX8]-qX7rXo
+X8f9nXo,=&YH\#2rj)I.s0Vd5rO2X5s0rQM]=kqraj&;gi9'Csq#'a`(q$iJR#HcXKT3CVWeQ"L
+H%M!NV6mP1XK;9%s*t'!H%CR"K7nr5L51SAM2R=ONK0'\OcklkQ'IZ&R$jD4S=Z=ETqS6WUo(&g
+WN*#$Xfnt6ZEppH[^`lZ]=bhl^VRe)`5Ta:aN;WKc-FV]dF-Lne^i@)g"P39h;7&Ii8WeWjQ5Oe
+kiq?slg4!*mdKW6nF?)?oCMVRo`Fj]p\jmeq>^<hqu6NlrU^#>s+13Vs*t~>
+JcC<$P5k(Oqu-KkqYU6frqZKes7cNdrUp3_rq$-[s7--YrU0gUmHso>s6B[MrosIH!9a@D!TiDA
+irS/urnn1AhVI"CL5(D9KS>*YK)gN"Jc($&IsuirJ:N.JIfFltIeA+4E+NHl@:aS&DJE]rCP..e
+I!U']FE289CM@EaF.$WVEd%G/qL&3fr-I[Sj`pZJqg/0e!dn<\r_O>QGBJ"KEH#c3CM79h@preQ
+?X@#MB`;TOB4tpiBkV-\=&t9<rJ;8DKnY88K7no1K7\`-JV/2oH#.JCGlE*kI//3jIf4]pHiST^
+HieYBHh;X]H2i-gH2`'eH2W'gH2W'hH2i3`HN8HkHiABoH[:#;H2i-fG5umdGPu[hGBS.PG'A0/
+G5c^cGQ;sbGlN$kG^"@VrceBes*+3^rH\Efs*"HfrH\Bgqg8?hr-JEkrd4Zm!.Fiqr."]p!.Xuu
+s+10$!eGrToRd-qrdtN/E,]`6D.[ElAc>R+;Ya8h<;]bd<pWoe<WZ&l:Amug;#a>j:&n)g:'+.J
+MslVuN<5&uNV\\3NW+t:O8Y1;OnY%+P6@&4PEM+.OYi8dQC=D>W33M=_8jmMf@o*>iT0([j5T"S
+h;+<^N.?1rH#n=pQ%sL$DJX39K7o/?LkLHXL&ZZ&J9c]tK7ei2L5(J>M2@.LN/`jYO-,TgPEhE!
+R$a;1S"-(AT:qsRUnjlcW2ZetXf\e2Z*L^C[^N]V]">Vg^V@V%_o0O6a2lBGbK\>Xd*^:jeCE.%
+f\,!5gtgiEi8EVTj5f=akNM0plKdg'mI'H3nF5u=o(2JFrq-?dp\4X]s7u]kr;6KkrVc?eJcC<$
+Zi>O~>
+JcC<$P5k(Oqu-KkqYU6frqZKes7cNdrUp3_rq$-[s7--YrU0gUmHso>s6B[MrosIH!9a@D!TiDA
+irS/urnmn9hVI#e;uouuqGm>jrDW\m!)i_n!)iVi!E)el;BRM>-nZu%3ArZI0JbOO6:!du4?>J_
+2E*NQ1bCjd92AFY;ZK_b;uT\m;u9PP;u]hn;uKSp/hm8^s#q&Y4?P\c2`NcT1c-sC0eb::0/NSc
+!&X[4%5]q#2Ej;e8kDTH91qkU8H20[7fGmc7Roj775@(u;,U7ir_rkrr)EYoqc*Pn!`W0!rDW_o
+rDWPlrDN\oq,@;krDW\ns%ibo;H*Qoq,7An;cH`q;ZBVo;Y<rg<;fbo<!#ut<;fbq;?'Jj;>a>l
+;#sQlqGR2f!)ienqbmDjs&/emrDE\q;H!Kms&/hps&&eprDNAgs&&hor_a##;G^1e;,U=kr)3Pl
+!`2fprDWYo##eDt;c?Xppf.c&<E<.":Jk"e;GKkX9)_]e;Ya8h<;]bd<pWoe<WYQO5lO(L5l3bL
+5!M=t5!8gHq,[PurE9)$pK7K"pK@>pr`T2'qcibts&o5&r)j#%pfIJr"'&<!;>sDl;))$P>@;#X
+E-?MUJq]#=N/WaTN/EIGK7A>R>?Op':Jjqd='SX!:/+JY:fL@m<DudnqG[EDs+#BGJqJ]/Knb>;
+Ll$tHN/WaVO,oEdP*;/rQC+&-R[]h=StD^MUSO]_Vl6SpX0&M-Yd(L?['mEQ\[oDc]t_=u_Sa=2
+`lH0BbKJ/UcHstee'uq!f@\d1gYCWAhr*GPj5]4^k3(sml0@U$m-X60n*oi:o()DDo`"Lbp@n=[
+q#C0iqY^6ir;HTcrdk*#s0M`U~>
+JcC<$PQ1.Or;HQkqYU9grqZKerqHHdr:U*^s7?3[s7$*YrU9dS!:BaO!pf.:rojIIkPjTJjlGL_
+j5T%si!A5sh;-l@VPU$dT`q*]T:VUErga"X!LfGTR/WHPR/WHFQ2HjiUQ'nlL52CjQB?o^N+T2m
+W2-2]S!]P*NK/m`hq"9EIYIHUqMtQ9s,QQ-m>UXrrJgl=rK%GMP*19C?!^g0TU_O?rfdhRNJWCC
+KnP&0IXHNsreUT2s,6o7!K2j7@KF!JrO)X3!OK04ZOO4EY,n_(WM.@VIY3N?rfd>Eqi_8JPEV/n
+PEM(-O8tFBP5LOCPQm>6OcYWbOT(=;O9^o0OH5HaO,s:%!frA%rf-l8rf-l:s,I&=s,I#:pl5<6
+$]U1,O,oBbOcYZcO8Y+=N<>,tMM_+a!/^Z3reU`7Mi*DkMuJS7Mi.Fg!/^T/re^N1mYq.)s,R&=
+r/Uf:s,R,=!07&>s,d5B"Hnt4Pa;97!goCDr0mVS!1`kUs.'+[&"];\S;_lEHZsLMDf0Sn;Yj>j
+<;]bi<qob_=Sc,!=92T,rDrr"#Zb#,<**(!VPa6g!2fXks/5pspo=@ps/PprpT"7os/bgorN64*
+Yd",3rj)I.s0Vd5rjM^5&@f9^]=l#!b0JPliTKV"q>Kj`'XFa5O+i:BJsrmXOG8.1H%DH_Z+'_5
+qQG*lIt3'#JqJ]/Knb>;Ll$tGN/WaVO-#KeP*;/rQC+&-S"#q>StMdNUSO``Vl6VqXKAY/Yd(O@
+[C3QS\[oGd^;%J"_Sa@3`lQ6DbKS5Vcd:(feC<%#f@\g2gYL]Bhr*JQj5]7`k3(sml0@U$m-X60
+n*olHncJFTo`"Lbp@n=\q#C0hqY^6ir;HTcrdk*#s0M`U~>
+JcC<$PQ1.Or;HQkqYU9grqZKerqHHdr:U*^s7?3[s7$*YrU9dS!:BaO!pf.:rojIIkPjTJjlGL_
+j5T%si!8/rh;-l@L5,Y\",);ZK)1&qJGt&uJGt&rIf"NnIf+U<G\CK'@q9e)DJNctBNB_7IX69_
+F)c2;CM@F$Yb?G\E-6R,Hhr-hHhr'UH/s5IH2DpcHiICj:/=W0G'%hHE,TW2CM@BjA7AtU?X6rL
+BP1rVBE)WMBkV-[=&t9<rJ:]4KnY88KDgK&Jd?pZG`c]XF*E$2I/nZoI/n`fII2C_H[PI3%srVJ
+H$Xa]G^+L[H$FRZH22adH2W'gGlW0bHNSS@H[Pa<rd4]mrd+Qh!-nHd!-nKerHA0arc\9b!d8g4
+r-86ercnEfr-86cq0;marHS3brcnEfrd+TkrI"Wlrd=`ms*Xin!.=cos*jcnrIFlurIP'&K^s`q
+K`6T(Hi@shDJ3ZqA7e_;qG[>lr)NGkpfHfaqc<blrD3Gis%iVh!)NPg!)2m@oo0!2NV\\3NW+t:
+O8Y1:OTL].Oo(=/P5pjHPQ-d^OckomQ'[u5UT1N*]Yhk<e(<=0hVdAOrnn.@hV?oBhNX%WI!>R3%
+tfb$H?F+CCiOoWLlI7GK)11FIXcluJV&N,KS>/8LPUeDMN!LRNfT9aP*2#oQ'Rf)R@B\9St;UKT
+qeE[VPgAmWiW>*YHY:<ZaI6N\@K2`]Y;.r_8=+/`Q$!?b0/#RcHjkbdaZdsf@S[/g=tH>hV[8Mi
+oB(\k2tjjl07L!m-O--n*fc9rpg-^o^r.U!quB_rqQNhrqcQirqu`noDX=@JcE(VJ,~>
+JcC<$PQ1.Or;HQkqYU9grqZKerqHHdr:U*^s7?3[s7$*YrU9dS!:BaO!pf.:rojIIkPjTJjlGL_
+j5T%si!SAuh;-l@<)lpt<;]bk<;oeu;Gg:hr)<VnrDESm"&Vro;uBN<0.JA)/M0"@1c-mA1H%Qb
+5!1qj3]T8\2E*KNAP>Wl:fC=mkYq:Tr_rbphc'MRqG[Dl'J;'s2)@E[4?Pbf4#f5[2Dd6G1,/\^
+""uGg2Z5K52#]?:2Ej;e8kDVR9)qQ^8.\9\7Rp!=7moa62F1,8;GpBk<;ohp<;fbo<;fbq<W#eq
+;Z0Pj<;oer;YX2j;Z9Vo;?p&q:f1(g<)iWks&/kqs&/hn!)iPi#?"K!<)Zaq;uK\p;u]hs;ts5g
+;ZBSq;Gg<j;?0Yp;Z'An;Gg<e;Ys>g;YsDm;Z9Vp;ZB\o;Ya5o<)Z^n;>sJn;u]Yo;>sJn;uBPn
+;#sTprDWYo!`Mupr_ierr`/qsqc+/-<E)ss:Jk%i:J=DS8lAR`;uK\n<VBJg=6s&d<rbJa62s4I
+56a;95sIRq=Sc,!=T2J$=SQ#!>5)1r=T2J%>5MP&=p%o2=]t`-s&o5&r)s&%q,[i(=&r=#;Gg7e
+r_XG2=^5EJD/j`FJ:`K1M2@+IM26tAK7WuM(Kt$F:Jjk`:K17l:/F\\:JFbg;H6[p:\n"6IXclu
+JV&N,KS>/8LPUeDMN!LRNfT9aP*2#oQ'Rf)R@B\9St;UKTqeE[VPgAmWiW>*YHY:<ZaI6N\@K2`
+]Y;.r_8=+/`Q$!?b0/#RcHjkbdaZdsf@S[/g=tH>hV[8MioB(\k2tjjl07L!m-O--n*fc9rpg-^
+o^r.U!quB_rqQNhrqcQirqu`noDX=@JcE(VJ,~>
+JcC<$PQ1.Or;HTlq>:0frqZKes7cNdrUp3_s7?3[s7--YrpTmTs6]gP!pf.:rokNgkND!ijlPR`
+j5T%Vi8EMLh;-l@g=i<rTqS-PT:VYRSHPIPS!ocBR/`KQR/WEPQN!0LPl?pJPl6mFPTY`sOGRS?
+Q]R)`NK1*BVl6AaSsu%0O,o0V[DADWH\@OQO8Ft:O8k70NU2VqNW"k;O8Y._OaVU`?<s1pS=Q.9
+QBdSmM2-h=KS+l*I!g[(L5CkGMuJS7N/R[E!P,`<[0!_AZi7<GZa-g=Xf\Y+Tp0nQLlRacP`q;o
+P5:@DP*;.0P6I,3OcYZer0$r@s-!DE!0@,@s,[#<!g/Y.rf@,@rf@5EOH5G#N<"q8NW+t;NW5%=
+NW4t2N=1c+NK9-^OHP`fOH9="s,@,>Mi*DdM>`>2M><&3MMmCLrJ:H0rJ1Q5Mi*DjMu&D4NV8>1
+NW5%;O8P%;N<bK'NK0$[O-'@'s-!DG!L8uLQN<JAqjRJQs.'.]r1*hXrLOLiS"-">SUPp6H?X=I
+D0#MPr`&hrpK%/mpfQlcpfIQ"=T);#<sD],<)m""<;!0hVuWglWrK.!WqrdjWrK+"XR`LlXoY`1
+riuF-r3HC1rNuX6qR?L7&%T9`]tq\2d+@+6l0n9>r:'^q^WiRANJ<CGMR'dsMM(nT#DAeJ['Qm<
+X89#CIt3'#JqJ]/Knb>;Ll$tGN/WaVO-#KeP*D5sQC+&-S"#t?StMdOUSO``Vl6VqXKAY/Yd(O@
+[C3QS\[oGd^;%J"_Sa@3a2lBFbKS8WcdC.heC<($f@em3gtgfDi8ESRj5f=ak3(smlKdg'mI'E2
+n*olHncA@Srq6<b!;HHes7u]kqtpBjrVcBfJcC<$ZN#F~>
+JcC<$PQ1.Or;HTlq>:0frqZKes7cNdrUp3_s7?3[s7--YrpTmTs6]gP!pf.:rokNgkND!ijlPR`
+j5T%Vi8EMLh;-l@g=h:9KnY25K7\^OJbjosIfP#uJ,OilIK+cpI3<B;<,#oCFDu&0BPVC8J:2fj
+H$4=MDJX*$B8;RrBlA+iHhi'hHhr'aGlW0bH/s5IH2DpdHRW6,:esi1F`_\HEc>u6ChRHl@q&qW
+?s[,NB4baiB4tskBk_6]='(B?rJ:Z3KnY88r.G'&rdk?&H?j=GFaEt6!.=co!.ONfqg8BlnpCFa
+q0E'gHN&6lH?oL9rHSNlH$OX[qK`?kH?jg`H@#R9!.+Nh!.=cms*FZlrHnQlrHnQjs*4Thrc\?e
+r-&-arHA<fGBWq/#'bE<G^4RZrHSBfrd"Eds*+6_rd"Kfs*4TjrH\Ef!."Nhrd4Tkrd4Zmrd+lt
+H[C-fI=6SDJ,aurJ,OotJc(*$K7npVK)gT%KDgK%K*m9aE,ff7Ch@9jB)>O+<;fhk<r5tn=R92d
+=T)%q:]O;e:&muZN:i/3N/`hnNr"b8Nr>%;OSY(>P5^UAP4"P6Pl6gEOqj1FQC+28V5po2^;S4A
+e(<=/gtgiCrn[Y2rnJ(@hVXd$MhHJ#H$+FpN/`%%rbVm\Jq])@Lk^QYKm%rrJ:W<)K7nr5L51SA
+M2I7NNK0']OckllQ'IZ&R$jG5SXuFGTq\<XV5C/hWiE/&Y-5(7Za7'J\%&u[]Y(tn^qmn*`Pom=
+ai_fNcHab`dF6Upf%8O,g=k?<h;@/KiSrnYjlY^gkiqBum-O--mdKW6nc&([oCW%Ts7QHerV6Eg
+s8)Wirqu`no_sFAJcE%UJ,~>
+JcC<$PQ1.Or;HTlq>:0frqZKes7cNdrUp3_s7?3[s7--YrpTmTs6]gP!pf.:rok<akND!ijlPR`
+j5T%Vi8EMLh;-l@g=fP+<;T\o<!#ut<;fbn;YsDm;Z9Pl;Z9Vn;AC`2.kN;+3&EEG1G^jT69dRp
+4ZYYdr\k*?2EsT":Jk"grD`Pj!*&Vip/:oh!*%`Pr`&_m">2>b2)G4p&Ni3;4#f2Y2Dd6G1,1L;
+0ebE_2%;H$2DmBL2E*f`4\JC=r_!5_rC@Dg7Rfm=7n6!:1-S6*:K.-ir_rbprDWVnr_ikt<E/io
+!E<(n<<#ks;Ya8k;Z'Jn;Z0Gp;H$Ooq,@8js&8qqs&&eopJ_)ipf.5kr_rqt;H!?gr)3Pl!)ien
+!E)kq;Z'Dl;ZBVj;Z0Gu;Gg:h;Gg:h;YF&b;ZB\p<;]Yr;Gg<j;?Toq:f1*b;ZBSo;YsDk<<#kp
+;uTbu<)Zcq<W,r.<E)su<`W$o;H6Ld92&"U;uTbp<VKPk=85na=nu2"62s4H56O/85<q=.=8uD$
+=oDIt=TDY!=o)8"=oMV%>Q%_+=^(f-r`T;)qHEf"s&f/"s&f;&"'/E#;Z'?';H?t-A8,q%GC4pm
+KSG8;Lkkta!J>t#IMc=%=]J?q;,C.l<`Vpi:/+GZ<)Zgu<E2ll;g*Y@J:W<)K7nr5L51SAM2I7N
+NK0']OckllQ'IZ&R$jG5SXuFGTq\<XV5C/hWiE/&Y-5(7Za7'J\%&u[]Y(tn^qmn*`Pom=ai_fN
+cHab`dF6Upf%8O,g=k?<h;@/KiSrnYjlY^gkiqBum-O--mdKW6nc&([oCW%Ts7QHerV6Egs8)Wi
+rqu`no_sFAJcE%UJ,~>
+JcC<$PQ1.Or;HTlqYU9grqZHds7cQer:U*^s7?6\s7--YrU0gUmHso>s6B[MrokNgkND!ijlPR`
+j5T(Wi8EMLh;-l@g=k5TTqS-PT:VYQSc>/[R[O#>!LK2QQN3?NQ2QpIQ2[$IQ2[!kQApN[KSQ4h
+Q&^TWO-HcDVPU&]S!T;#N/NS?VOVdUJ<KPcpl>?7!06Q.m#:LprJgl=rfAX\IU-8dTq@mHS!B8'
+OcP?SL4b24Jpr)qLPUhEMM[7JMMd@MN+-8-\@&dE[/dT5Zi@BMZa-g=Y-"auaEN&`MNO3jQ'RYu
+PEM,nPa)*0"I,+6P*5a*r0$r@s,m_OOH5KbOcYZeOH9C&s,m>E!0R5ArfR5B!KW9:NVne:NW+t9
+N<#";N<"q6N<#"<O9C`.OH5J$NrG">N/NVmMZ8P5MuAP5MZ\inMMh@j!0$i6!K)a4M#<)1Ll21i
+s,?r8qi(N6repi:qi(N6s,R,?rf@,@rJpo;rJgl=rK%#Arf[;F!gK";rKmSQqjRJQ".YpRT)>/W
+T)P8YSI1@*I!^'SEG]Yn;uTbp<V]\n=8Q+O=o;>"<s)E%<`]!nrMT^qq5XFps/PprpT"7os/bgo
+rN64*Yd",3rj)I.s0Vd5s0hd5s1&*?%D0?laNW)bhrO(lp%eORrtr#EUQgUkMhRP6[[W)#H?k(&
+VPpl)Y-"i&YQ',tJV&N,KS>/8LPUeDMN!LRNfT9aP*2&pQ'[l*R[]e;St;UKU8+N\Vl-MoX/rG+
+YctF>['d?O\[f>b]tV7s_SX71`lH0BbKJ/UcHstee'uq!f@\d1gYCWAhr*GPj5]4^k3(sml0@U$
+m-X60n*oi:o()DDo`"Lbp@n=[q#C0iqY^6hr;HTdrdk*#s0DZT~>
+JcC<$PQ1.Or;HTlqYU9grqZHds7cQer:U*^s7?6\s7--YrU0gUmHso>s6B[MrokNgkND!ijlPR`
+j5T(Wi8EMLh;-l@g=k57L4t;6K7\^OJbafsIt7NJrI4QjrdOip+`D"&C11XsEGfN&Bkqa?I=-?d
+G&qYAD/*`sTRM3"D/jt!Hi/9hHhr'dH2W'aH/s5HH2N!fHiIIQ:_Z]MGBJ%MEH#i4ChRHn@UinW
+?s[1:B*r<bBPD0oBieAqN;\S9L4t>9L&?T(KDpH+H')fYEd.J1!.Ofns*jWhqgAElrd4]op3cme
+qKi$c"+#<?HMr*hGl;p]H2r<kHN/6jHN&9kH3/G@Hi86kH[Pd=rd=Zkrd"ZlG^+H3GlN!eGQ`58
+GBeB1G5umYH2`$gH2`'fH2DgjH$FUZG^4T5HMr-fH3ASBH[L5?IJeKmHi8<lIJnWpJ,XorJ,Ffs
+Jc(*"KDpQ'KE$W&KCsm)H?!nCCh@?lAQ)P,<;fhm<r?%r=P6jV:]F5k:]!lf:JUP@o8WU,qMkN8
+r/^i=p6#<:mZ[U6rfd;D)3^;LQC=D=Vld;9^W+LEe(34+gY:N=h;$fbg]-%Ih;I;QP`UfQH$"CU
+JshRJF`)#3DgI%jMhm2aL&Z[JJV&N,KS>/8LPUeDMN!LRNfT9aP*2&pQ'[l*R[]e;St;UKU8+N\
+Vl-MoX/rG+YctF>['d?O\[f>b]tV7s_SX71`lH0BbKJ/UcHstee'uq!f@\d1gYCWAhr*GPj5]4^
+k3(sml0@U$m-X60n*oi:o()DDo`"Lbp@n=[q#C0iqY^6hr;HTdrdk*#s0DZT~>
+JcC<$PQ1.Or;HTlqYU9grqZHds7cQer:U*^s7?6\s7--YrU0gUmHso>s6B[Mrok6_kND!ijlPR`
+j5T(Wi8EMLh;-l@g=k6Z<;]bp<;fbk;Ya8j;>jDk;uTZD/1N&$.kWh=1,(C<1d48k5!;%i4$,>\
+2`<Ng5Y4XH:fC:l<)lms;cN3aoMX@@s&Akos">-G2)@E[4Zbeg3]K&W2Dm?H1GCO;0erVbs"t0B
+2)R3K2`Nua9M.nU9)qQ^8/"K_7Rp!>7n#j*5YXsM;cH[p<)ros!`MuqrD`bpr)EYo!E<(r;u]es
+<Vf\p;u]hl;u9Gm;uT\n;$0]p<)iWk!)iepr_`ep;H!Kms&/hprDEVoq,I>lrD`boqbd8h!Dubn
+;>X8j;?'Pn;>X8i;>a>j;$0]p;H!<hpeq)jr)<Pls&&eos&&Yks&8qqs%rboqc!Gm!E2np;[$-#
+<`E!rr`/kss&9M/<`W:&;bp7e;,'_W8lJ[f<;fhm<r?%r=P6jW5la1H56F)75=,9Ms&f5&r)ibt
+s'#/"qH3`"rEB)&s'#;&r`T;)q-*]!!*K/#rE'5)<`N*t;>j<#;,gY$?Y*qiF*N+_JV3rTrIk<*
+JU[NF)h*<g=Bnp*;,0n`;d`R#;,'e[9i"_e<Dugq;>O5kJ9ZWsK7ei2L5(J>M2@+KN/`jYOHG]h
+Pa.N#R$a>3S"6.BTV8*TUnsueWN*##Xfen4ZEppG[^WfX]=bhk^VI_'`5Ta:aN;WKc-FV]dF-Ln
+e^i@)g"P39h;7&Ii8WeWjQ5Oekiq?slg4!*mdKW6nF?)?oCMVRo`Fj]p\jmeq>^<hqu-HkrUg)?
+s+13Us*t~>
+JcC<$PQ1.Or;HTlqYU9grqZKerqHHdrUp3_s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D!TiDA
+it^S4i8EMLhVI#CgY1B7fV,"3T:_^HrLF"[R[O/Bs-N\OrKmJJplkcDrfeS!NeNdULS:0'NJERU
+B<JA8V5'`UR$NhnMMZ/=`H$BWL\$T$NrG(>Npr%qN:Do,NrP.jOFDY,?=8edSt2::P`h2jLl$e<
+L4b#+I!pg,M2I7JMi!=MN/NX(@CitVrjDj8[/RBA[C!9GYck44SYD?pJ;B6aQ3<J=Q'@O4PPg[F
+PQ-jIPQ$aEOnt7<P6$i/rfI/B"H\b.OH9C&s,m>E!0R5ArK7,@"-/A$Nr=t7NWP3#Nr=q=O,f8!
+NW4t8N<G9&OH>V'OSk.:N<+urr/(W8N/NRNp5Ap/rJUW1s,$Z2o8NU,s,6r;qi(N6!07&>s,[GG
+NfK0\NK*ms!0@,@s,m>Erf[DKQC%Q;!1EeSqjRbZSXuFDSGeuYT)G5ZSG\obRXT[4H#[hAD/rVT
+<V]\o=8Z1m=m9,`=TDP%<rQ2#<<6'#qksCks/GjprMopuq5a7is/Q.$nu_nos/uF,rNZ@-r3QF1
+!4Dd6qmZU8s1&ZO]>2A,cILY-k3MR2q>:0ZrtrkeVk&p)MM6hb\Z1^FH[C!jSZ9!-Xf\Z"YB,5F
+JqJ]/Knb>;Ll$tGN/WaVO-#KeP*D5sQ^F//S"#t?T:hmPUSO`aVl?\sXKAY0Yd1UB[C3QT]">Vg
+^V@V%_o0O6aN2NIbK\>Yd*^:jeCE1&f\5'6h;-rFi8N\Uj5oFckNM0plKdg'mI'H3nF?MK!qZ'V
+rq-?dp\4[^s7uZjr;6KkrVc?eJcC<$ZN#F~>
+JcC<$PQ1.Or;HTlqYU9grqZKerqHHdrUp3_s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D!TiDA
+it^S4i8EMLhVI#CgY1B7fS,$4K7ec-rIG!"JbO]nJ,OikI/n`qI3EcI@W#dhG]I_;ASPs\Jq/8r
+G^":NEG]K*B2s/BAo)L1pNujdqg80crd"Bepj)"Hpj)d`)1,[s?;XR:G]n1LF)Z#7CM7?k@q9%W
+?sR+;B+/HcBkM-pBkV3^<fN(:M$&KdKnfP[s+C]2JV/,mG\qGBHi/9nIXQ\DIK"ZrI=D0D!.Ooq
+!e,QGrd4frI!pGBI/SKlI/eQnI/\KiHMMpeHN&3iGlN'`HN/?kHN&0iHN&9kHN&9jHN/<lI/SEl
+I/J?iH2r6dGQ<$_Gk-.YGl;mgH?oC4!I8qfH2N!fH2W$jH[L8@I/eWmI/eQlHiSTnIf=isIfFop
+J,k0!K)^K%K`?])KE6^WrIalurIkT0E,ff6BP;!gAlSb0q,[Gqr)iSol!!d`"A_ij:J^sb!)NSh
+pPe^'q2YB4rf6o;rfHr<!0[>DrfZZ4rfdSMP`q;oP5^[FPS0=PT;/Eh[Ca5qc-Xnhf%8R-g&'M'
+gE,/+i8WeZTp:UlIs60\GDhW>GBIb@CiXuXM2[:HKDC4BJ:W<)K7nr5L51SAM2I7NNK0']Ockll
+Q'I]'R$sM6SXuIHTq\<XV5L5jWiN5'Y->.9Za@-K\%0)^]Y2(p_8=+.`Q$!?b0.uQcHjkbdaQ^r
+f@S[/g=tH>hV[8MioB(\k2tjjl07L!m-O--n*fc9rpg-^o^r.U!quB_rqQNhrqcQirqu`noDX=@
+JcE%UJ,~>
+JcC<$PQ1.Or;HTlqYU9grqZKerqHHdrUp3_s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D!TiDA
+it15/i8EMLhVI#CgY1B7fMkiK<W#hr;ts8c;u]_n;Z'Jn;B[\C.5<G,3]8lQ0JbOE6U<q"4?Y_c
+3B/rU2(Lmc92A>]r_rer"&r9"<;oer<:j,[;VG(L<;f`#/h\k81cdiar]C0ArAOg:1c$rd0aKHk
+1c@6L2)[;j2?,W84p"DM8cD?_8c2-Z7LM^W7n6$(5"AFG;H!Kms&92&<)lmq;H*NnrDWVnpJV&k
+r)N\ps&8qspf%,hs%rns;,L4hrD<Pmp/;#j;cEQkrDW_or_reos&8bnrDNbs;cN]or_`Aes&&eo
+!)rhos&&eo"&Vrn;>X8k;>O2i;#sQnr_iPjq,.2kr`&hprDNMir)*Sp<)iip!Dubl;u]hm;[-3$
+<E)mp<;okt<r>ts<rH),<)-:e;G0\V91i1_<V]\o=8Z1m=m9,`=TC_a56jG;5=%P9=BPQ*r)ibt
+s'#,!qcNf"r`]2'rE95)>5h[u>5VP'=T2D"=T;G*<`N'r;>j<$;H6h(@:j:nFEr:aJ:W=NKE$N+
+J:E#rIK"U6IXm$'?<LK3;G^:g;-$ds9M\DW:J=\f;H6ar;>F.3J:W<)K7nr5L51SAM2I7NNK0']
+OckllQ'I]'R$sM6SXuIHTq\<XV5L5jWiN5'Y->.9Za@-K\%0)^]Y2(p_8=+.`Q$!?b0.uQcHjkb
+daQ^rf@S[/g=tH>hV[8MioB(\k2tjjl07L!m-O--n*fc9rpg-^o^r.U!quB_rqQNhrqcQirqu`n
+oDX=@JcE%UJ,~>
+JcC<$PQ11Pr;HQkqYU9gs7uQes7cQer:U*^s7?6\s7--YrpTmT!:BaO#OC[?l07EqkPjTEjlHF$
+!TN);i"=l'h;-l@g=k64f:ek1T:_^Hrga+\S!j8Crg3SNrg3YNs-<2?+HqOoObIG;R?*2bN/as@
+Vl6AbSsu(2OGo'[g!uX>ItmKSpl><6!06Q.mYp[qrJi+`IslcO??`!3St)45P`q/eMhd"?K7JE"
+I><W5Mi*CJMMmDlN;m>g]"#0I[f<c7ZOXCM['?j=YHFVBGCP7'OoCXHQi36MQ2QsHPl[,5rfdDH
+rf[8CqNC`>"Hnn0OHBI("d4t.O-#J&OoCLFOcY\&OTCQ)r/Uf:p5]04!fi>%rJgf8r/C];qN1`<
+rf6r:s,I/>Mi7Rl!/pi8repW3!fN"sr/:l=M27"FLl%#fMt;o'NVe\6N<5-$O8P+=O8Y+=O8k=A
+OoCOBP6.#8Qi<?PRJWHMS,]#\St2DKSHGCQSXfGF$%dSRG][k@Cii\R<rH+u=SGtp>3B,c>5_V'
+<rH)$<E*'!Vu<RnWV`^nWrT0rX7rXoX8f9mXo5C(YHY81Z2V'+ZN.E2[emQ5\.cEa]"Pu#bL"kr
+iof\!p%S=\rVl6b(pp`KQ&gc^M4(]VUl0\JH[CI@WO9"6YH%E%Ee&^mK7nr5L51SAM2I4MNK0']
+OckllQ'I]'R$sM6SXuIHTq\<XV5L5jWiN5'Y->1:Za@0L\@K2_]Y2(p_8=+.`Q$!?b0/#RcHjnc
+daZdtf@S^0g>(N?hr*GOioB+]k2tjjl0@U$m-X6/n*fc9rpg*]o`"O`p&Ojcq#C0iqYU0hr;HTd
+rdk*#s0;TS~>
+JcC<$PQ11Pr;HQkqYU9gs7uQes7cQer:U*^s7?6\s7--YrpTmT!:BaO#OC[?l07EqkPjTEjlHF$
+!TN);i!eN"h;-l@g=k64f7enWKE$Q&Jb4KjJ,auhI3EH;;effAF)c#/CM@O8J:)`iH$+:MDf'6%
+D5j1XCN4NFp3Zacqg7jZpj)%Ipj)d`ra,V#(LD<-FE;JADf'<*BOt^a@UNSM?Y=%`B`;ZAB`hF;
+NK!gms+UQ.LAZ`5KS+l/HBDo[F*E(^r-eNms*acnrd=cqrd=isI=;*B!e#HErd=Wlrd=]lrd=`m
+qg/'brd+TircnEf!IB+hHN&9kHN&3iH3JYAH$Oa`rH\Hjrd=`ms*X]jrd+TiqKVp`!dK!8qKW'e
+qg&-bs*=TgrH\Eh!."EcrH\9drcnNjHiA<nI!pBir-eEhrd=cqqg\Wps*srs!.k'"s+C9'rdt?,
+K7\`.r.G-*KS9)R$$1')DJEfrAS+s=<rH+u=SGtp>3B,c>5_S*:esmd:&n)h:ATq?NV\\5NW+t9
+O8b7:OT:RDOo:I1PQ$dKPE_8or0':.QC489V5pi/]Y_b5cI(+ieCE.%f\+s1f\,!5gtq#LjQ>[l
+PEUrUI!:!_JrbqHGAh>:D/t5^Mi3@GKDC1@J:W<)KS>/8LPUeDMMmFQNfT9aP*2&pQ'[l*R[]e;
+StD[LU8+N\Vl-MoX/rG+Yd(L?['mEQ\[oDc]t_=u_Sa=2`lQ6DbKS5VcdC.geC<($f@em3gtgfD
+i8ESRj5f=ak3(smlKdg'mI'E2n*olHncA@Srq6<b!;HHes7u]kqtpBjrVcBfJcC<$Z2]=~>
+JcC<$PQ11Pr;HQkqYU9gs7uQes7cQer:U*^s7?6\s7--YrpTmT!:BaO#OC[?l07EqkPjTEjlHF$
+!TN);i!eN"h;-l@g=k64f2P`J<W,ns;ts8c;u0Dj;uTZ*.k)u%/29.B1GL[@1IFJpr]CWN4?GJZ
+2`<L!91VlU<;ohr<<#r%<`N.!<)`cqoMb*SiD]bUr_rhL'/)1!2a9Ge4$5Sa3&`cS1c-sB0`Eg+
+2#oQ32$Z$"2a0E!8kK"Ts%3/[%n9&Z84Q0>3'^88;H$Om;Z9Sp<;ff";c6Ll<;TVl<;9Al<;T\p
+<;ohq<;KPk;ZBSp;GmEkrD<_r;c?Rm<;0>h;?Bfr;uT\p;u]bp;u0Jk;ZKep;ZK_p;>=#h;u9Go
+;,U<k;>sJn;>X8k;>O2h;>jDh;ts5j;uK\o;u0Ae;?Bft;uKVl;uK\k;u]i"<)Z[or)E_rr`/\o
+#uXVs;+sYV91i4\<rH+u=SGtp>3B,c>5_V$5Q<nJ5sP?OrE/hts'#,!qH3`"rEB,'r`]>)!*]A)
+oih8rpK7Gs"'/B#;Z'?$;c[%,@V9LrFa8=^IXckEJH()rHlmcdJ:`H/M-4%b<)QIc;,^Uu;GU"^
+:/+M`;HHjt<)EBhEe&^mK7nr5L51SAM2I4MNK0']OckllQ'I]'R$sM6SXuIHTq\<XV5L5jWiN5'
+Y->1:Za@0L\@K2_]Y2(p_8=+.`Q$!?b0/#RcHjncdaZdtf@S^0g>(N?hr*GOioB+]k2tjjl0@U$
+m-X6/n*fc9rpg*]o`"O`p&Ojcq#C0iqYU0hr;HTdrdk*#s0;TS~>
+JcC<$PQ11Pr;HTlqYU9grqZKerqHHdrUp3_s7?3[s7$*YrU0gUmHso>!pf.:rojIIkPjThjlGL_
+j5T%Vi8EMLh;-l@g=k64f@STHTV%jJSt2FBS!f\3R/E<NR/WHNQLg=aR#HW\L52CiQ]?f[Mf#Po
+Vl$5_S=#V(O,Jmt^70:mK9Pecqi:N6!06Q.mYp[qrf/+NIXbX0ELr_nS=>k2PE:`[LP1;4JUi2t
+LPL_DMMm=JrJLf;@UZmYrO2a6rj*-C['[-CYHN/?Q$\(<O-c44Q2m9LQ3!8:rfmbTQ'R]"Pa7Su
+rK7/CplbT>!0[>D!g&P,rfR;EO8b7?Oo:FCOSk7?O9Uc+NfT3[NVnh:NW"n;N<5-$Nr=t;N;ee:
+NrG+9O8t@?Nr=t;NW>(9MuSb9Mu&A4NW+n9NW4q<Mi.Fh!/g`5o8NI(!0$c6s,I)?r/gc9rK.&A
+rf[5D#*bF?Q^F/.qO7>O#Fq?VSXc4@Sc,)OSc>8fSVqrDH$=1GCN9;Rr`B&#pf[MuqHN)eqHNi#
+s&T)"s&8u"rM][or2TCip8S1pXK;#qrN?1(s02L-rj)I.!OT94[f!W5\.lKb]>);*c-k8#iooe"
+o_/(UqY^<[ru(.0W1oE6MMHk[XK7_BI!^-gOeo7hXKAV*q6+smJqJ]/KnbA=M2@+JN/`jYOHG]h
+Pa.N#R$a>3S"6.CTV8*UUo(&gWN*#$Xfnt6ZEppH[^`lZ]Y(tn^qmn*`Pom=ai_fNcHaeadF6Uq
+f%8R-g=tE=hV[8LioB([jlYail07L!m-O--n*fc8nac8BoCW%Ts7QHerV6Egs8)Wirqu`no_sFA
+JcE"TJ,~>
+JcC<$PQ11Pr;HTlqYU9grqZKerqHHdrUp3_s7?3[s7$*YrU0gUmHso>!pf.:rojIIkPjTZjlGL_
+j5T%Vi8EMLh;-l@g=k64f@SUPKE$Q'Jb4KhJ+J(5E+`Tq@q9e'E,&ouBNTh7I<p-\FE2D=Ch[R7
+NI#;WF*i:^p3Zacqg7p\p3GkHpNcaa+'r;]:Jb5=F`_\HEcGu5C1q3iA7AtT?sdPZAnPajB`;`G
+BE`*O<fN&qreUW1reC<($\X+:G^+(FFF&FdIf+WiIK4lrIKFqHIf=cqIfFfrI/SKmI/SKlI/\Kk
+I/eQlHN&9kI/SElHN&3hGlDsiH@(#8HN/?lHN&3gHN/9gHN/?gI/SBlI/SBjH2;dcH2i3fGlW0i
+H2`-hGm8M;GBe@XH2`$gH2MsgH2DjbH2;ghH$Xgbrd+`pI=6M@I0"_Dr-\Kl!.OfprdFisr."cu
+rIY$$rIk0&"b_M[JqJ^SK`?f!Ka;pCE,]Z,B4PQO<rQ2!=SQ%s>5DIc>l%\%>5qCp:Ap.BNV\\5
+NW+t9O8b76Oo:I1PPgXGPEc!/s-+:cR\$7NXKf7K_T0gCcd:(geC<(#f@U#S,hh#-hVdDSkNV@#
+\Wi)/IsZHaG__-3I!'=FCiF`RL5h"EKnK2SG(G6tK7nr5LPUeDMMmFQNfT9aP*2&pQ'[l*R[]e;
+StD[LU84T^Vl6SpX0&M-Yd(L?['mEQ\[oGd^;%J"_Sa@3a2lBFbKS8Wd*^7ieCE.%f\,!5gtgiE
+i8EVTj5f=akNM0plKdg'mI'H3nF5u=o(2JFrq6<b!;HHes7u]kqtpBjrVcBfJcC<$Z2]=~>
+JcC<$PQ11Pr;HTlqYU9grqZKerqHHdrUp3_s7?3[s7$*YrU0gUmHso>!pf.:rojIIkPjT[jlGL_
+j5T%Vi8EMLh;-l@g=k64f@SSQr`/nrs&8\jpf$udrDW_o&M#=Z0.SY82)@!A1G_!W5X%@03t"#,
+2`3KY6qC*N:f@6js&Atus&JqqoMb*SiD]bU),i.@0JkUE5<V.k4?PV`3&``P1bpj@1,(E]2$,Zn
+2Z,E:2`X&c9M.nU9+jig84c?C7Ros>7n5-q7o)u[;uKVn;ZKeq<<-"t;ZB\q;ZB\l<;BGm<;]bp
+<;ohp<;TVm;Z'Dl;Z0Jj;?9]qrDW_orDWYm%9$5);c6Ll;c6Ll<E)on<;TVn;Z9Vp;>F,h;uKSr
+;c6IiqGR>jr)3MkqbmAirDNJjrDNMkrD`_o"&_un;Z9Ph;?Bft<;KMm;uK\q;ZK_n;[-3$<Dudo
+<W#hr<<-(m<sV`%:fC.`91_bS<rQ2!=SQ%s>5DIc>l%\%>5LMd5!V>8rE/kus'#,!qH3]!r`]2'
+r`]5&oih8roiV5p!``/rrD3o#<**:1A7ob!Fa8:Zrd4cqIXV3E!I]@nHQdfdJV&T3MMu4O>?4U!
+:Janf;,^4b9hnJZ:/k.l;H$Ljq,;HfJqJ]/KnbA=M2@+JN/`jYOHG]hPa.N#R$a>3S"6.CTV8*U
+Uo(&gWN*#$Xfnt6ZEppH[^`lZ]Y(tn^qmn*`Pom=ai_fNcHaeadF6Uqf%8R-g=tE=hV[8LioB([
+jlYail07L!m-O--n*fc8nac8BoCW%Ts7QHerV6Egs8)Wirqu`no_sFAJcE"TJ,~>
+JcC<$PlL7Pr;HTlqYU9grqZKes7cQer:U*^!;$0[s7--YrpTmT!:BdPs6B[MrokEdkND!ijlPR`
+j5T(Wi8EMLh;-l@g=k64f@SU(rh0:_s.'=`S!oe6R/E<NR/NBMQ2m3CPTlicKUIaSURRR1M2[L/
+Y-"\%URn'HQBR;fMSl!NF*iP(ORJ80Nqe\8Npr%sN:;f?NdcJ-?=%6;StDRBQ^!euNJ`OEre(H*
+It!61MY`58N/NU'@Cs&J[f<`9Za0P:$aR"?Yc5B]It`cCQN!3NQN!6JQN!-TQBdc$Pa.Q"POan8
+PQ-aFOT(CBOopi.O-'=&r0%#@"Hnn0OHB@#s,R,?s,R,=pQ#64s,?r:!fi>&q2bT;rf6i7s,?u9
+r/CZ6$&jk&N/`gUNJrhoN<>,tMM_:hrJU<,!KE'8N<>3#NK3mqs,Q]4rfR/BrKI8Grg3VO"IY^I
+S"'DGrL<hWs.01[rgj%Yr13kXr13kZrga@\IXHKeDK0T3<rQ2"=Sc1u>5VUU>l7e->#n]'<s2K&
+<iDtrWVidfX7rXoX8f9mXo>L'YQ(g.Z*:M3ZMh*1['fe>rO;^7'tLog_8XOBe(NU<kj@m1o_8+T
+qY^<Zru&GZV4!L*PDGX-X/:i+H[:*oSZK61XK8J(qQFjhJqJ]/KnbA=M2@+JN/`jYO-,TgPa.N#
+R$a>3S"6.CTV8*UUo(&gWN*#$Xfnt6ZEppH\%&u[]Y(tn^qmn+`Q#s>aihlOcHaeadaQ^rf%8R-
+g=tE=hV[8MioB([k2tjjl07L!m-O--n*fc9rpg-^o^r.U!quB_rV6Egs8)Zjrqu`noDX=@JcE"T
+J,~>
+JcC<$PlL7Pr;HTlqYU9grqZKes7cQer:U*^!;$0[s7--YrpTmT!:BdPs6B[MrokZkkND!ijlPR`
+j5T(Wi8EMLh;-l@g=k64f@SU(K7ei/Jq8LFJGFZpIeA+6GACZ,B4cI3Deis!CKH+<IXQKaG'%_A
+CMIRJH?a.@Fa\UaoR$Oaqg8!^oQf\Gp3@F"?!gr7:K)R^F`_\GDf9K.C1h'f@V#IG"__O\BP2#T
+B`qL;NJrboM#`>1L&d#,Ka<?aH]2ZWEd3'4IfOrpIJeNqI=?\EIKFqHIf=cqIfFfrI/SKnI/A?l
+I/\KhHieY@HN&9jI/J?kHN/9jGlE!gHN&9fHN/<mH?oI8"+,?>H2Dp`I/\HnI!bj=r-A<es*=Wh
+s*=Tir-8?iH$T=6s*4]kGBeB0H2DpfH2W!dH22aeH[>[=s*OKg!IfIqI/\QnIfP#rJ,b)uJ-(:R
+K)C9"K`?])K`?Z(K)gT(L&Zo"L&Zl6J8fIGChRKnAQJe3r`K#"r*'#&em/,W!Er:s:'49eN/[@f
+q2YE5rJpi;rfHo;!0[>DrfZW3qNUoA)O-MSS"?@RXg>OO_oBg@bg"G[daHXqf%/I*rn/LMh;I>T
+kN_F$mdHL/N.ZS*Is?R)Lkg1oDJj<3It`f>Lkb\XE.NUnK7nr5LPUeDMMmFQNfT6`P*2&pQ'[l*
+R[]e;StD[LU84T^Vl6SpX0&M-Yd(L?['mHR\[oGd^;%J"_SjF5a2lBGbKS8Wd*^:jeCE.%f\,!5
+gtgiEi8N\Uj5f@bkNM0plKdg'mI'H3nF?MK!qZ'Vrq-?dp\4X]s7u]kr;6KkrVc?eJcC<$Z2]=~>
+JcC<$PlL7Pr;HTlqYU9grqZKes7cQer:U*^!;$0[s7--YrpTmT!:BdPs6B[MrokEdkND!ijlPR`
+j5T(Wi8EMLh;-l@g=k64f@SU(r`/nrs&8\jp/CfcrDOk;0IeJ+/hT1C2)?pB1cRig5s7=n3]]8\
+2`<Q_5tF^I;#=/m<)lrt<WH.r<:s2`;ZB\j;W1OV<%]dWr\O[@4[&d,!]`5"r\k*>1,CX?0JG@B
+q)/12"Z\b19M.nU9*e-]84cBD84Q/K8-_%<9hnS_;cEWmrDNhu<E3!sr_ibps&/kqqGd8h!*&hq
+s&Atrr)EJj!)i_l!`DrprDEJj!`N&rr_rhpr)<Vn!`N*!r_ihq;uTYr<)llo<;KN!;Gg:h;c?Rl
+;>F,i;uBMp;c-Ef;?0Sj;?0Sj;Ys>k;Yj>l;Yj>j<;]Yj;>jDm;?'Sp<;]\p;Z9Vo;ufkr;Z0Pm
+;ufhq;uK\p<W?,#<q]T$;bp7e;bg"Y9NM-or`K#"r*'#&em/,W!*]:b"?o(8=BPB%r`]"uqH3`"
+rEB,'r`]>)!*]A)oih8rp/q>r"'/B!;>j<#;H6h(?tF%hE-6ALH$]I:s*Xip!IT7mH5CjRI=Hj$
+L5ChINfI=J=&i-o;,L7n<`Aunr_3Vq<E<+";c-Hh;fI;>K7ei2L51SAM2I4MNK0'\OckllQ'I]'
+R$sM6SXuIHTq\?YVPgAlWiN8(YHY:;Za@0M\@K2`]Y;.r_8=.0`lH0BbKJ,TcHstee'uq!f@\d1
+gYCWAhr*JQj5]4_k3(sml0@U$m-X60n*olHncJFTo`"Lbp@n=[q#C0iqY^6ir;HTcrdk*#s0;TS~>
+JcC<$PlL:Qr;HQkqYU9gs7uTfrqHHdrUp3_s7?3[!qGdLrpTmTs6]gP#OC[?l07EqkPjTEjlHF$
+"leM!i8<Djh$r/og=k64f@SR&e=`G*rgj(Z"IkjJR$di=!1<YMs-EYLq33+fPa%JjBoe*`SXPb#
+N/j"%Wi)_jV4X0@QB7)aMP.tOI"7"OORJ51NqJG5Npr%tN:;fJIXQZO?<j+oSXu:;Q'@GlMMQt=
+KS"`(J;K)>Mi3SoMuSb9MZdL2]=>?L[f<c8Zi.6=ZE^TUQEY[dLQRjfrKdSOQ^@Q7s-<MJs-<VM
+!L/f>P5UU@OTUc/OHBI(!K`HCP5UOBP5^RFOHGY(Ns1W+NfT6]rf-]5pl,96rf?o;!0@)=r/C`;
+NVAA5NJrhqN<5-"N;JS8N/RXlrJU9+qMkN8s,I&=s,@#=rf$r=O8=q<Oo:C?OoCOBP6dD<Q'Rc'
+R$a<?RK/iVRf&ZTSH#/USGeuYSGJcVT)P;[S-XUnI!KgQD/47m=Sl8">5_\!>kVIu?M.Ut>lIt,
+=8l5"WVidjWrT0uX7rUqX/rDoXo5F&Y6;)7Yd(J4ZM_$0['fh?rO;a8(q7#d]=l)$b0SVkhrEqf
+n+$#Ap@nC[rVl0`(q$H?P`^l_LSUoISVr#EG^tODXLGI<Y,_<$Dh<UoKS>/8LP^kFMi<XUO,oEd
+P*;/rQ^F//S"-%@T:hmPUnjlcW2ZetXf\e2Z*UdE[^WcW]"G_j^VI_'`5Ta:aN;WKc-FY^dF-Ln
+e^rF*g=k<;h;7)JiSrnYjlY^gkiq?slg4!*mdKW6nc&([oCW%Ts7ZKerqQNhrqcQirqu`noDX=@
+JcE"TJ,~>
+JcC<$PlL:Qr;HQkqYU9gs7uTfrqHHdrUp3_s7?3[!qGdLrpTmTs6]gP#OC[?l07EqkPjTEjlHF$
+"leM!i8<Djh$r/og=k64f@SR&e:`I+rdjors+10"q1&Bmp3e'%AQ*8R;g!+tB4u$rJq&2qH[9jW
+E,f`0BkDXYH>@PEn9b+]qg8'`np0MFp3HXD"&VigGlDjcEsZi(DJX$!A7K+Yra5kBB4bdhrb2CH
+CAqoM=(.)IMZ/G4L]3#0LPCQ_Ka395Fb"7GF*db6!.Ofnr-e]qIXh3CrI+]pqgJKlqgJHks*OZk
+"FYZEH@#R;!.=`l!do?Ard"TjHMr-hHN&9kH2r6hHN&9iHN/?eH2r<gI/eQnHiSNmHMDdcGQ<$g
+HMr-gH2r6fHN/9hGl2j_H2r6iGl;p`HN&9iI//0mIXQZnrI"Tm"+G`LJGaosJ,k0"J,k0!K)L?#
+K`?])KE[![JqJ`0re1?,q1Sg'r.Y*(#]Xg&DJ<]pA7kgCqcWl$rEJu#p0IH"oj.8rr`f@sr_N-F
+q2YK7r/U`:rfHc7rK?Q3qNUoAs-+7aR@KqGWii_=^;@h/aND]McHsteeGduHf%8U.gYUoMjll$s
+mI0Q7gm*nVJp_ojG_q95J9PpLCiFHIL5_"HL%p=>JqJ]/Knb>;M2@+JN/`jYO-,TgPEhE"R$a>3
+S=Q7DTV8*UUo(&gWN*#$Xfnt6Za7'J\%&u[]Y2%o^r!t,`Q#s>aihlPcHjkbdaQ^rf@S[/g=tH>
+hVd>NioB+]k2tjjl07L!m-O--n*fc9rpg*]o`"O`pAamdq#C0hqY^6ir;HTcrdk*#s0;TS~>
+JcC<$PlL:Qr;HQkqYU9gs7uTfrqHHdrUp3_s7?3[!qGdLrpTmTs6]gP#OC[?l07EqkPjTEjlHF$
+"leM!i8<Djh$`#mg=k64f@SR&e5cEGr_rbns&8qqoi(]b!)rkp+=nrl/hJe:2)?pA1G_Ba5s7@q
+3]]>^3&WZG5>FmI:K%'gs&B"us&K,"qc*,bqGR5ipep*M#VI\^2)I'Q4[&d,$p$@,3&WWN1,L^?
+0JWJ_!&jd5s#1*A5!Ve68cD?s8kDQF8OuBB7Rour4ZQ55;c?Xp;uKVl;Zg!!<E/rq!)rho!)r\m
+qGRAnqc3Vps&8eoqGRAlrDESm!E2nq;>O/r;c6Ll;GpFn<;f_t;H$Rpr)<Sms&B"sr)EYnrDNbq
+;,[Bls&&hqqbmDl!E)eo;?Bcp;<UpU;#jMi;u]bo;Z]os;uT_s;c<Tl!)iYjrDNYm"&`&s<;]\o
+;?0Yo;ufkr;Z'Jm;ufkr;Z'Mn<W?+k<s2>s:f:'e9E&&j=oDP&>P;=q?2.b!?1qP&>Q6ni5X.J!
+qH<f$oi_/orE9,'qcj)(qcWPpr)s&%!*T,""]n`);c6Kl:_6N'<`r^:Anc+%FED\MGBeB3HN/<n
+H?jf8GU@]_I=Hj%LPh%MNfTBP=^"p*;GL%c<E)mo:/">U:/=ef=&i6u;#+%.JqJ]/Knb>;M2@+J
+N/`jYO-,TgPEhE"R$a>3S=Q7DTV8*UUo(&gWN*#$Xfnt6Za7'J\%&u[]Y2%o^r!t,`Q#s>aihlP
+cHjkbdaQ^rf@S[/g=tH>hVd>NioB+]k2tjjl07L!m-O--n*fc9rpg*]o`"O`pAamdq#C0hqY^6i
+r;HTcrdk*#s0;TS~>
+JcC<$PlL:Qr;HTlqYU9grqZKes7cQer:U*^!;$0[s7$*YrU0gUmHso>!pf.:rojIIkPjTEjlHF$
++QDA<i8<GKh;-l@g=k64f@SU(eC1(_St2FBS=?":R@*r>s-WYLr0@/Drf\InMh.%FLnC3%N/*FR
+C94G6VP9fVR$3YlM2^'<SpPp?r/g9+rfHu;!06Q.nr3't*e/Wh?sd*1St;RFR?a&#Nf/^IL4b,1
+JV&c:Mi<UPreh&AN/M1TLV((*rjMj7s0M[2%(!4CW1Tc1JW#\VQ'V95qNh/Hq3D)IP`u$.rKI/B
+rfdAFrK.,BOo1=@OTU]-P*5a*rK@2C!g&P,rK-u=!07&<qMk]>NfB$Yqi1W9rf?r<r/U`8s,I)=
+r/CZ8repl;N;eh:NqeS6N;AJ3Mueosrf-i7qi1W9!0@&<s,I&=rf$o=r/gr@s-!>CrK@/DrKR2G
+!LT;RRK/iVRK8nJrgWnWs.0%WoUYrP!1j+Z$(HZuH['UKDJ=.g=oMV'>PVP$?1qUu?h[n(?2%V(
+<rl?%r2TLls/Q$upo=@ps/bgoriZ:)s0)R0Yd+/4rNlO2!4Dd6rO;d9rjN]S]">_pa3;o\g>CuU
+m-a?4o(;YOqY^?Yru&hgVjj$5PDPL#Vl5Z.H[1$pQ):grXfee-q60gNB7ttnL51SAMMmFPNfT6_
+P*2#oQ'Rf)R[]e;StD[LU84T^Vl6SpX0&M-Yd(O@[C3QT\\#Mf^;%J#_SjF5aN2NIbg"GZd*^:k
+eCN7'g"P08h;-uHi8N\UjQ5OdkNM0qlg4!*mf)YUnF?MK!V>s_p&F^cp\jmeq>^<gqu6NlrU^#>
+s+13Ts*t~>
+JcC<$PlL:Qr;HTlqYU9grqZKes7cQer:U*^!;$0[s7$*YrU0gUmHso>!pf.:rojIIkPjTEjlHF$
+)<0W5i8<GKh;-l@g=k64f@SU(eC0)'Jq8LPJGt*(J:W9%It3(GJ,FcjI3<NA?u'4^G&qP8ASZ$]
+JUi2rG]n4MDf'9(C8@VRCN+FaHi8?hHhVjWH0]_LGnjXm?VsTnG]e.PF`_S?DJX$"A7]4Zra?CQ
+B4kmkB4u!mC2%?^=)EqUMZ/G4L]3#.L]3#8KnP,*H[osRGC4r>IfOrpIJ\HpI=?\AIfFilIenKj
+HiSNkI/eTpI/J<kI/J<kI/\KmH38G=H?oI8rd4Zk!."Qi"*o3>Hi89jHhi!eHi&0jHiABmHiA?e
+H2i*hH2W'gH1ZFXH22dbGlE!bHMr3gI/JEmIK4lsIf4]nIf=ioJH(3"J,k0!K)L>tK`?])Jd$d[
+KnY89r.Y*(re:B,qhGH#EH#f3AnYagqcWo%rEK)&qd&o%p0[Q#qd&r$s%`Sioo8a,!0-o:rK$r>
+o9'$8m$%:1r0./F7$j@5U8Fup[CO#f_SjL9b0/&Td*^:jeCE+#f@ep8iT0.cm-X3/nFH2CS<o4h
+JUDokIYW`5G]Rb?D012[LlI7IKnK2Ss+=s;Knb>;Ll%"IN/WdXO-#NfPEhE!R$a>3S"6.CTV8*U
+Uo(&gWN*#$Xfnt6Za7'J\%0&]]Y2%o^r!t,`Q$!?b0/#RcHjkbdaZdtf@S^0g>(N?hr*GOioB+]
+k2tjjl0@U$m-X6?mfDqJrpg*]o`"O`p&Ojcq#C0iqYU0hr;HTcrdk*#s0;TS~>
+JcC<$PlL:Qr;HTlqYU9grqZKes7cQer:U*^!;$0[s7$*YrU0gUmHso>!pf.:rojIIkPjTEjlHF$
+(#n31i8<GKh;-l@g=k64f@SU(eC.Fr<;TSs;H$Ll;Y*i`;ZBT+/1N&$.kNb=1GLU?1c@Zd5!Am-
+$p-C-2DmBj9h8)W;cNTls&AnrrD`Vlr`&_mr)3Aipep0Os"4F.2D[*Qr]U9D!'C0>!B2q91]oEe
+0f&\b!&ja4s#9sA"%,aS8cD?o8kDQF8OuBB7Rp!)4\/@G;uBSp;uT\m;Zg!!<E/rq!)rhos&8Yk
+rDW_qrDieq!)r\mr)3Snr)*Jl!)rhnr_`_nqbdSr;GpIo<Vo\p<;]\n;?0\p;uT_r;uT\m;u]bo
+;ZTcprDNPlr_W_p;cE![r_rhprDESmoMbchs&8qs"B/2q:f70hr_W\m;>jDm;$0]p<)ifpr_`_p
+r)EYnr)<Vp!)rho!)reprDikuo2c2p:f(+f8k_lLqcWo%rEK)&qd&o%p0[Q#qd&r$r]^BHr)s#&
+oND)orE9)&r*0,'r)r\rr)j#%r`T&!)cp'>;c-@f;,L7k='Ap?Anl1&EH?5EF`qtRGl;peGQ2n+
+H$asiK8#,>N/`m\Q'n.I>$G$*:Jt.j<`N)t:C9ik:JXnf<`;ss;#+&iK4fjkL5(J>M2I4MN/is[
+OHPcjQ'IZ&R$sM6SXuIHTq\?YVPgAlWiN8(YHY:<ZaI6N\[f>b]tV7s_SX71`lQ6DbKS5Vcd:(f
+eC<($f@em3gtgfDi8ESRj5f=ak3(smlKdg'mI'uB!V#XYncA@Srq6<b!;HHes7u]kqtpBjrVc?e
+JcC<$Z2]=~>
+JcC<$PlL:Qr;HTlqYU9grqZKes7cQerUp3_s7?3[!qGdLrpTmT!:BdPs6B[MrokrskND!ijlGL_
+j5T%Vi8EMLh;-l@g=k64f@SU(eC;spT:VXFS=?":R@0H7QN3?LQ2QpmPED$&OG0$XKq4^#P)P?^
+B!886V4jTUR?`qtNeuK!STT=5Pl6[COR/&-OSY"<Npr&"N:Do,Ihc?u?D*p^St)15Q'.2cMhQn?
+KS+c(regc9qi(N4"Cdk4\@;IG"1>MBZi%31Ym%b[G_(U0rg!MLqNq)Frg!;F!gT"6rK@)B!KrZG
+P5URIP*(liOnOk;Oco[*qiUuBP5:=@OT1@?N<5-$O8b1>Nrb9#r/Uc9s,R)>r/^o>qi:]9rf-u<
+r/CW7!0$f7!fi8"rf6u;s,R#9s,6l8q2PB4rJ^r?O,o<^pl>B6s,[,?rfI2Dr/puArfd>G!L8uK
+QN<JArgNeTs-s.]S=BJIrgitWopu#P!1j+Zs-jCdP^e++GAV;7E`lQE>5hb%>l@t*?Jf,e?N"1,
+>Q\&.<3#Vl!36!upo=@ps/bgoriZ:)s02I,rj)L/s0Md6rO2[6s1&$:(q@,g]YVS.c-b.ti8j.g
+m-X93oC_nTqu,dZ)7?oLQ^*VpMPdAIToFPJH%:dDYdV'CYcOr%YQ'5oKnb>;Ll%"IN/WaWO-#Nf
+PEhE!R$a>3S"6.CTV8*UUo(&gWN*#$Y-5(7Za7'J\%0&]]Y2%o_8=+.`Q$!?b0/#RcHjnce'umu
+f@\d1gYCWAhr*GPj5]4^k3(sml0@U$m-X60n*oi:o()DDo`"Lbp@n=[q#C0iqYU0hr;HTdrdk*#
+s02NR~>
+JcC<$PlL:Qr;HTlqYU9grqZKes7cQerUp3_s7?3[!qGdLrpTmT!:BdPs6B[MrokcnkND!ijlGL_
+j5T%Vi8EMLh;-l@g=k64f@SU(eC;spK7\]+J:RNJ!.acmqgSBi+a7[1De<O'FDu,2CM[%(IslZg
+GBS%HD/F'&WeYt9DKL<oHi8?hHhVjZH2`*iH0okOH2_.R;,9u5G5cUgF)Pu7Ch[V_A.<$X?=.D[
+B5)$oBk_6prb)F9HB!l@reUc6LPLV>rItQ1Knkb*DfU+!J,auqIK+a!I=?WnIJ83jIJJ?hIJJ6l
+I=-GAI/nZmHN8HlHiJKlHNAG>rHeBgs*FZis*F]j!IB+lHM`'eHN&9hHiSNlI/\HmHMVpdGQ<$e
+H2r6gHN&9jHN/?kH2i3gH22ahG^4OZH22dcHiAEhIK"]qJ,auqIK"]pJ,=cqJcC6#Jc:9!KD^E&
+L&Zi+K)pRVre:?+!/:*#s+gQ/%#9XiEH#i3BP1jf=]t`-r`f2'rE];,hd?7erE];*!_uNdpl5'/
+!0-o:rK$r>o9'!7m$%=2qiaL6Q'n,5USk2u[CX)f_8=.1aN;WMcd:(edaQ^qe_/^6iT0.clg=-/
+nalAFp\L,=MM-J+I<^X,KnFVgD/=07JVK,BLkk_Xs+>9EL5(J>M2I4MN/`mZOHPcjQ'IZ&R$sM6
+SXuIHTq\?YVPgAlWiN8)YHY:<ZaI6N\[f>b]tV7t_Sa=2`lQ6DbKS5VcdC.heC<($f\,!5gtgiE
+i8EVTj5f=akNM0plKdg'mI'H3nF5u=o(2JFrq-?dp\4X]s7u]kqtpBjrVcBfJcC<$YlB4~>
+JcC<$PlL:Qr;HTlqYU9grqZKes7cQerUp3_s7?3[!qGdLrpTmT!:BdPs6B[MrokQhkND!ijlGL_
+j5T%Vi8EMLh;-l@g=k64f@SU(eC;sprD`SkrDN5cr)3Pl,;1Pr0eP%<2E!BH1Gq-Z5sRRq4ukYc
+3&`cR?U@7Y;,U:k<;KPl;ufqs<;9Dk<;KMn;YX2j;ufkn;WUjW/eTfr1GV-X4Zkhg4#f5[2E!?I
+2>o9-2Z,EC2E3ZZ786BG91qlL8OuBDr^d&Z#"UaA:/=\aqGd5g"&r9";u0Dl;tj8j;uTbo<V9>i
+;u]bo;>jDl;>jAp;,U=kr_ibp##\E#<E)mprDN\or)<Sms&/ts;cEZpr_iYms&AnpqbmAk!)ien
+"&`&q;Z9Vo;ZB\p;ZB\n;ZBYq;Z0Mo;Z0Gm;YF&g<;fbq<!-#q;,I3hr_`\l!)`_ns&&eos&Anp
+s&')#<)cdq;c?Tl;uTbr;uT\n;Z]os<;ons<rQ/&<``@'r`B)$$s-P0:f1.f9M7oK=]t`-r`f2'
+rE];,hd?7erE];*s$$QK=]t`-oND&nr`T2'r*0/(qcWSqpfRW"=o2;(=&r=#;Z'B-;c["*?Xm__
+D/aK8EcZ>EF`qtRGB\6.G:IlcI=Qs(Ll..OO-5ftStr>i=]n[$:ejnf<`;mk9M\AX:K(7p<E2sq
+;Ya8kK5cO!L51SAMMmFPNK9-^P*2#oQ'Rf)R[]e;StD[LU84T^Vl6SpX0&P.Yd(O@[C3QT\\#Mf
+^;%M$_o0O6aN2NIbg"GZdF$FmeCN7(g"P39h;7&Ii8WeWjQ5Oekiq?slg4!*mdKW6nF?)?oCMVR
+o`Fj]p\jmeq>^<gqu6NlrUg)?s+13Ss*t~>
+JcC<$PlL:Qr;HTlqYU9gs7uTfrqHHdrUp3_s7?6\s7--YrpKpVmHso>#OC[?l07EqkPjTEjlHF$
++QDA<i8<DIh;$c=g=b-1f@JL%eC2jnd%6f!S=>t9R@*l<rg<YN!1*JHs-+dmP*(llLMMm)BUtQV
+O,]0ZXKA@sV4sZPQ^!\oMJ/U(EdE8!p5]38n;mR1qMtW:n;[(!nr5,MJ:M$7?D4$^T:MF:PELr`
+MMHt?KReZ*N/W[RMMmLSN/`dSN+/*b\[VRH"1>MBZi%08Z=8cPH@h!8rKRAKqNq&ErK[>Is-EkS
+Q'@Msrf[)@!0[8DrfI5EOnOn7OnY"@OckiirfIJJO,f3ZN/`mZrf7#?!KN0:NrG%8O8k:AO8=n:
+NW5"=NV\V0N<#"<NVSV7NW+k:MuJ\7NW5%;NW4t9NW5%;O84h9N<,'$r/pc;rfd8E!g]1>qj7JR
+R[T`FSH#,\St5eLs.0%WoUYuQs.0.ZrgWnW$%I;LF`289Di.`t>Ph\(?2S%$?g_=n?i==0?2e(0
+<`Jgos/Q$uq5XIqs/bjpriZ4'!3lF,rj)L/s0Vg6rjMd7rj_p9)7[8j^;@n3cI:D#iT01elg4'/
+o(;YOqu$HXru':uVk9?=PD>'iVkfE/H[:-rQ_pmoYH=t.q60gNC4q:qLPUeDMi<USO,oBbP*;,q
+QC+&-S"#t?T:hmPUnjlcW2ZetXfek3Z*UdE[^WfX]=bhl^VRe)`5Ta;aND]Mc-FY_dF6Uqf%8R-
+g=tE=hV[8MioB([k2tjjl07L!m-O--n*fc9rpg-^o^r.U!quB_rV6Egs8)Zjrqu`noDX=@JcDtS
+J,~>
+JcC<$PlL:Qr;HTlqYU9gs7uTfrqHHdrUp3_s7?6\s7--YrpKpVmHso>#OC[?l07EqkPjTEjlHF$
+(ujN4i8<DIh;$c=g=b-1f@JL%eC2jnd";%D!.acmq0r3h#]4*NBOt1dEc:ql'5N2MI!g9cG'%bC
+DJX&bH(/D_FR"5PI/83aHM)R_H2r6YGklXb?moAZ:eu@\F`qnLEGo`1BkV'h@q/qT?tj=fBP2$o
+BkV6qBPCOlNJrboM#`A1L])r6KMHK.CiOTEIX_0Ds*joprdFiqrdOlqs*t&ts*sur!.FWkr-eEh
+rd=cord=cor-JEkrd4WlqKi<jH[:);HN8BgH2N!bHiA?gHiJKnHiJKjHhr$fGQ<$^HN&9kHN&9h
+HMi'bHMi'bHMi-iI/JEjIf=inIf=imJGk'!J-(:RK):3!K`6Z.KS+o/KDpSpL&d#,M#W81L^JiU
+E,f`-BOtal>5hb'>l@t+?M%Um@.Rb(?N"1/>QIVqqi10,rK$r>o9'!7m$%:1r0./F':5,WTVSQh
+Z*q3U^VI\&`5]m@bl5pBd*g@keCN=.hr<b\lKdj*nFH2CpA"L_VjNI"JpVujHA%*.H$+"ADKL;\
+LQ%+GL\QQ&K5-'nL51SAM2R=ONK9-^OckomQ'Rf)R@B\:StD[LU84T^Vl6SpX0&P.Yd(O@[C3QT
+\\#Mf^V@V%_o0O6aN2NIbg"GZdF$Fme^i@)g"P39h;7&IiSrnXjQ>Ufkiq?slg4!*mdKW6nc&(\
+oCV\So`Fj]p\jmeq>^<hqu6NlrU^#>s+13Ss*t~>
+JcC<$PlL:Qr;HTlqYU9gs7uTfrqHHdrUp3_s7?6\s7--YrpKpVmHso>#OC[?l07EqkPjTEjlHF$
+(ZOE3i8<DIh;$c=g=b-1f@JL%eC2jnd/6l@;u9Ja;uT\o;'7A<.P<;-3&WQJ1GUaR6:!at5!1ng
+2`N`R.6p[':et$g<;BJi<;KPn;ZB\p<;'8d;ufkn;Wgsa0.nn91c%<Z4oRPP4#])X2`<KK1GLR<
+0`F!02?,QH2)[?P3BT](91hiM8kMZG84ieOs$m5@4@i1C;Z9Vl<;0>j<<#kr;u]bo;tj8k;uK\o
+<VBDi;uBMk;Z'Dl;ZBVo;uT\o;u]bp<<#kp;u]bn;u9Jk;[63!;H$Ll;H*Qor_rYkrDWYl!)rkp
+oMbZcqGRMp;,L4hqGRAnrDW_q!)rkp$r^,(;Gg7g;c?Rl;,R<hqGIDo<)Z]o;ufkr;ZBZ!<)Z^n
+;cENlr)*_t;GpFl<)iiss&K,$qH!Sss&f;&s&]D):fC4fr_*Ad3*Q;cqcs)*r*K#&mU5WnrEfG.
+r`fOi5$D.]=o;D$=oDP%>Q.h'=nGnl=o)5&=&r="r)!f"<**70@:X%dD/]Dm!ci@(rcS-^+a%sO
+GBnRcJqSo9MN!RWPaIr5V5g_,>Zt3.;,^Ci<`N,u:]F/m:JOkg=8l+u;#+&iK5-'nL51SAM2R=O
+NK9-^OckomQ'Rf)R@B\:StD[LU84T^Vl6SpX0&P.Yd(O@[C3QT\\#Mf^V@V%_o0O6aN2NIbg"GZ
+dF$Fme^i@)g"P39h;7&IiSrnXjQ>Ufkiq?slg4!*mdKW6nc&(\oCV\So`Fj]p\jmeq>^<hqu6Nl
+rU^#>s+13Ss*t~>
+JcC<$PlL:Qr;HTlqYU<hrqZKes7cQerUp3_s7?3[!qGdLrpTmT!:BdPs6B[MrojIIkPjTEjlHF$
+)rfi7i8<DJh;-l@g=k64f@SU'eC2jndEnJUSGo#XR/iWPQNEPBRJiHPQM?^jP`h2lR>QWZKSQ1h
+P`LT\NG>PrWMZDaT:;(0OH#%Pe=Lr8L>n9nOSY">NfB(jNV&2$N?<RtIXka2TV.jKS<oS,Q'$r\
+M2$\:J:W6%N/NUQMMq@j"CmJ(\[_XI"1>MBZi%08ZA?3AI>*TBrg!JKrKmPMs-NVKrK[>Is-EqU
+Q'@MsP*5a,!0mDF$^?j=P*1rjP*(ifOnb%;OT^i2PEM.,Op7,5OckliOoCCDNJrgVrf@)>!K`B<
+NrP+=Nr+k;OSY";NW+q<NVJJ0N<5-"NVSV4NW"h8NVeb7N;nk;Nr+n;NW>.;NrP1<OnY%=PQ-mH
+PlR-LQi*3RR@9S6SGo)ZT)YAZSH#/XSG/QUSt2GOT)YA[SH#)YSH#2fSqMN=GAhG9EcV"]ra#J/
+pg<l*lXBWtpL!l*r`oP0<;NZpWr9!oWWK6&XRrXoY5PO(Yl1j,ZMh-/[/[Q5[f3c7\G`lT\@K5a
+^r4::d+$e*ioT@el0Ia*nauPMqu$EUru&;]V4*[3Q&E8QUSNs#I!L:'T<#9/Y-"e-q6+RdKS>/8
+Ll$tGN/WaVO-#KePE_>uQ^F21S"6.CTV8*UUo(&gWN*#$Y-5(7Za7'J\%0&]]Y2(p_8=+.`Q-'A
+b0/#ScHstee'uq!f@\d1gYCWAhr*JQj5]7`k3(sml0@U$m-X60n*olHnd+jZo_%nNp@n=\q#C0h
+qY^6ir;HTcrdk*#s02NR~>
+JcC<$PlL:Qr;HTlqYU<hrqZKes7cQerUp3_s7?3[!qGdLrpTmT!:BdPs6B[MrojIIkPjTEjlHF$
+)<0W5i8<DJh;-l@g=k64f@SU'eC2jndEmL@JH15oJ+nEjI3<K@@;97^F`M>7ASc']JUi8tH$=CQ
+Df0E,A?2APCN4O^HN8HlHiJEkHhVjZH2i3jH1-"SGoL$q?=?Z,G^+@RF)l8=Df'3$B4PL^@:3JO
+BP7<X$Yj?gC2%?q=)j4YMuJP5M#E,-L'WHJMOSO*GCG&@If"WlI0"eFrI4cps*t&ts*sZird=cq
+rd=iqI=;*Bq0i0f#CLlFI!pEjI/A6kI!bj?rd+]mH[>O6rd+BerHe?f"+5HCI/A6jHMMgeG^9"/
+rHnNi!.4]ks*F`lrH\3brH\3brd4TkrI+WnrI=Wls*slq!IoY!JcC6#Jc:9"KD^E&L&HZ-K7no3
+L&6W)L]<)1LPCQ^L]3,0M>i81M#N/8F)c/8B4tmgAbo[2?2\+)?i"0r@JXC+?i==1>le2*rf-K/
+rK$r>nr`p7m$%:1qiaX:Q'e&4U8FrnZa[NY]tV:u_o0U;bK\>Yd*U1fdam.-i8`t`lKms-nalAF
+p\F^bs8S:NMM-S-IsI<8KnXekDJX<<Jqo2DMMLqZCP.:oL5(M@M2I7NNK0']OckomQ'Rc(R@B\:
+StD[LU84T^Vl6SpX0&P.Yd(O@[C3QT\\#Mf^V@V%_o0O7aN;TJbg+M\dF-Lne^i@)g"P39h;7&I
+iSrnXjlY^gkiq?slg4!*mdKW6nc&(boCV\Jp%J+Rp\ssfq>U6gqu6NlrU^#>s+13Ss*t~>
+JcC<$PlL:Qr;HTlqYU<hrqZKes7cQerUp3_s7?3[!qGdLrpTmT!:BdPs6B[MrojIIkPjTEjlHF$
+(ujN4i8<DJh;-l@g=k64f@SU'eC2jndEqbir_r\lnPfEb+]0d?-nm/'3ArZL0f(UD6:!h"4?P\f
+2`WcT03Ch::JXme<;0>i<;KPl;ZB\p<;9Dd;ufkn;X%-Z/f?<!1Hn#d4Zkef3B/uV2Dm<J1,(F:
+0fCpHr&+L5%QHI26qg6G91qlL8OuBDr^d&Z"uSVC:f1.grDWSmq,@5ks&/kqs&/eonPfNh<rQ+u
+<!--"<)rlrr_ieprD<\q;c?Rlr)*Jls&&\ls&9%u;,R<ks&/kq"&_un;Z'Gq;Gg7fr_iSkr_ibp
+!*&nqqGR;k!)ibm!`Dlnp/Cuj!)rhoq,7;l;>sJi;Z]os;uK\p;@6?%;c6Lj;H$Ll;Z9Pn;#aDj
+;ZB\q;?p-"<)Z[m;c<Kkq,@>mqGR;k!*&ns!`iB(qc<\ts&fD)=BPQ*$!:&';G^"]8kVPJ>lJ%-
+?MIn(@-_7t@/"%,?N+42>X.g_rE0#$r`]2's'#8%oigujrE'8*<`N*s;GmEk$<1&.>[ClNBPMC%
+rbhpYEH6,Br,r$]s)fr=H@13oKnkMCNK96gR[p4OXg,:E='\s/;,L:k=B/6t:JFSY:JXqh;ccps
+<)NHiCP.:oL5(M@M2I7NNK0']OckomQ'Rc(R@B\:StD[LU84T^Vl6SpX0&P.Yd(O@[C3QT\\#Mf
+^V@V%_o0O7aN;TJbg+M\dF-Lne^i@)g"P39h;7&IiSrnXjlY^gkiq?slg4!*mdKW6nc&(boCV\J
+p%J+Rp\ssfq>U6gqu6NlrU^#>s+13Ss*t~>
+JcC<$PlL:QrVc]mqYU9grqZKes7cQerUp3_s7?6\s7--YrpKpVmHso>!UK%MkmQ_<kN:pgjlGI^
+io0mp)rKN.h;$c=g=b-1f@JL%eC)ald*L"-S=?":RJrTQQNW\DR@'B@QN3?IQ2d'nPEMN!Js2"H
+Tpq=-MN!R,XKACuUSFBLQBI;hMjq5HFaJe*qiCc=l&Yh*qN(W9o8WF%oSjW8I=QiR>G7[[T:MC:
+PEh8hLPU\<KS08S"cS=rN/NVlN!5,LL:b%,rjDp:['[1;ZjO+7[<R1VNKfZmQ2[*IQi<<NQi*0K
+Q2d0MQN3?NQN3?NPQ?u2r0%5IPE_:1Pl?mEOogc-Oo1=@OoCFDOckn*PQ$^TPEM,mOcbfiOcYWa
+NfB%rNrb9%r/Lf;Nr=q;Nqe\5NrG%<NWb?#N/NVlN;eh8NrG%:NW>.>Nr"_8N;eh9NW>.>NWkE$
+N/`gWrJpr?r/^c9#*4k.P*(lip65K?!1!GJqjIJQ!1a"YrLO(]S=TDErgj(\s./tWs.0+Ys-j+\
+SXuJQTEp="I!K^NCi+=o>lJ%.?MRt+@/FBr@esO2@/41/?N4=0X8T'tX8/dqWrT6nXoGR%Y5kg*
+Z2_-.Zi7?3[K!]6\,<c7[i2fg]YD>&aj/;bg>:iNk3(snmI0T:p%\C]rT=+ujM%XeRZ`nnLnCW;
+R#ZQ@H\\)gYdV$D[&gD*YA/`EL5(J?M2I4MNK0']OckomQ'Rc(R@B\9St;UKU8+N]Vl6SpX0&M-
+Yd(O@[C3QT\\#Mf^V@V%_o9U8aN;TJbg+M\dF-Lne^i@)g=k<;h;7&IiSrnYjlY^gkiq?tm-O-,
+mdKW6nc&([oCW%Ts7QHerV6Egs8)Wirqu`noDX=@JcDtSJ,~>
+JcC<$PlL:QrVc]mqYU9grqZKes7cQerUp3_s7?6\s7--YrpKpVmHso>!UK%MkmQ_<kN:pgjlGI^
+io0mp(#Rm(h;$c=g=b-1f@JL%eC)ald*L#6JcC8oJ+S14FD50"AS$+-D/3a!C/oh8I=6EeF`_S>
+CMRX,ML0&TFQ@fIHN&9cHM)R`HN/9[Gl)dd?N4@I:/-"XF`heIF)Pr5CM.6i@q/tU@:B.Krb;CG
+#\n'eBNK#0N/R[l!/UT/rItN0I"?'PFaF%:rdO`o!.OcmrdOip"+G`LIf=iiIf=cqIfFfrI.Vje
+HNAM@r-\Nmrd=]l"+5HCHiABnI=2!?!.+QgrHeEh!IB+jHMMpeI/A9gH2i-gH1cL_HiA?kHiA?k
+HiJEkH2i0jHi/3hH2;jeHi&3iIJeQdJ,OorJcC5sJH1<!KD^E&L&?W%L&Qi!L]<20M#`A-LBr!B
+EG]K(ARoHQ>lJ%.?MRt+@/FBr@esO2@/41/?N4=%Nr>%<OReP5P3nJ.Pl-aFPV8AkS=cUUX08k=
+\\#Mf^;7\)`lQ<Gbg"GZd*gCog>1`KkNV9umdTf=o_%tTr;Q]q)RGimLkL/*G^5""K7.u^D/OEC
+L5CkJLl$e=pk3@8L5(J?M2I4MNK0']OckomQ'Rc(R@B\9St;UKU8+N]Vl6SpX0&M-Yd(O@[C3QT
+\\#Mf^V@V%_o9U8aN;TJbg+M\dF-Lne^i@)g=k<;h;7&IiSrnYjlY^gkiq?tm-O-,mdKW6nc&([
+oCW%Ts7QHerV6Egs8)Wirqu`noDX=@JcDtSJ,~>
+JcC<$PlL:QrVc]mqYU9grqZKes7cQerUp3_s7?6\s7--YrpKpVmHso>!UK%MkmQ_<kN:pgjlGI^
+io0mp(#Rm(h;$c=g=b-1f@JL%eC)ald*L#9<!6,t;c6Qm;XRI-;D'FI0eFt<2)R0D1c.-Y69m^t
+4ZPSb3&``Q3CHD5;,L6j<:s/i<;9Di;ZB\p<;BJd;ufkn;X79]/dF$`1G_3Z4[&d,%llU.2`*BL
+1c$j?0ebLC2#T<32Z>Z=4@2_79)_Hd8kDTF8cD9\8,kRP:/Ohc;Z'Jj<;BJl;ufkr;ZBYq;Z'J_
+<!cQ(<E)su<`N+!rD`eq!*&qpr_ibpr_i_mr_i_mr_`u"<)cdo;,U?l;ZB\p;?'Pq;H*Qms%r_m
+!)i_n!``2urDEYp<;f_s;Gg<j;Z0Pj;#jMf;u]hs;uT\o;ZKep;uT\n;uK\q;uK\p;Z0Po;Z'Gn
+;Ys>i;Z0Po;Z9Yp;u]bn;uTbq;u]es;u'>k;ZKer<<H3#=',9"s&T>*=]nj/qH3epr_Wel:.e/I
+r`oG.ra,D-r*]D1k[OBsr*]>-ra,V1p0%>rrE9,'qcj)(qH<JpoiV?"=]t`+"'8N';uBN$;cQn&
+?!q,RBPVF#rbVjXEH-#?F*.A%s)]r<H$XpiK8#,=N/j!aR%'_EWNWV9\\2TX>?Op(;,^:i<)ZUh
+9hnDY:/t:q<`W0spetp\Knb>;M2@+JN/`jYOHG]iPa.Q$R$jG5S=Z=FTq\<XVPgAlWiN8(YHY:<
+ZaI6N\[f>b]t_=u_Sa@3a2lBFbKS8Wd*^:jeCE.%f\5'6h;-rFi8N\UjQ5OdkNM0plg4!*mI'H3
+nF?MK!V>s_p&F^cp\jmeq>^<gqu6NlrU^#>s+13Ss*t~>
+JcC<$PlL=Rr;HTlqYU9grqZNfrqHHdrUp3_!;$0[!qGdLrpTmT!:BdPs6B[MrojIIkPjTgjlGI^
+io8qTi8<DIh;$c=g=b-1f@JL%eC2jnd*L"_SXZ+;rgEbQ".,CBRJrTQQN3?JQ2d*JP9?6MBT7g_
+SXPh&NKK7(XJ_niUnO6CQBI8eEKH-#H@hL\O8b4BOcY[jO8b7;O8b12NV8>(N<Xo_It1j4R/WZl
+S",e.P*(c]MMHh:Jq/E&N/NUOMi7Om#)eFMJ%N;&rjMU/#]buhH\70;Pa)04rg*JKrg*SNr0I>I
+s-EMJ!1!PJrfd5Drg!MJs-*GFs-!GGrK7)@s,m;B!0[2B!g8b1rfdAErK7PMO,f6[NfT3\OH#8!
+NrP.?Nr4k:NqeY;OH,?^rf.5CNfK*XN/NVkN;nn7NW>(:NWY?&NfF!tr/Cc=NfO$u!07#;"HJP(
+OH9@%rf@)>rf@)A!0[>D!0[&>rfm>Is-W_Ps-`qWrgitYs.'1^SbnrWSH57OoUZ)USb\fUScGD\
+TF-^/I<]gSDea<Z?2e1,?i=C1@G52g@JsU1?NOQ7X8T'tX8/dqX8f9oXoGR&YQ(j*Z2_-/Zi.92
+[K!]4\,No9[iMui]=l"ua32iYfA#3CjQ5OelL"*2oChqSqu-Nnk5Q=8dA<>#Od;!]WLp&KL4+>r
+NM*G[\Z`*;X8&i.KSG5:Ll%"IN/`jYO-,TgPa.Q$R$jD4S=Z=FTq\<XV5L8kWiN8(YHY:<ZaI6N
+\[f>b]t_=u_Sa@3a2lBFbKS8Wd*^:jeCE1&f\5'6h;-rGi8N\UjQ5OdkNV6rlg4!*mf)YZnF?)?
+oCMVRp&F^cp\jmeq>^<gqu6NlrUg)?s+13Rs*t~>
+JcC<$PlL=Rr;HTlqYU9grqZNfrqHHdrUp3_!;$0[!qGdLrpTmT!:BdPs6B[MrojIIkPjTcjlGI^
+io8qTi8<DIh;$c=g=b-1f@JL%eC2jnd*L"_qLSWrp4)aa+E;!kBOt1cEc,N)ChnZRI=$6bG'%_C
+DJX&iF)ko1FFN=uqg/6gpNlLXs*F]jnTatW.UQRj?VjR@GBS+MF)l28D/3j!ARf1X?t!JWBPD-n
+BkV0oBkV0]BT8"1reUW2rJ1?+#uttiD/sfHJ:N.IIf+ZqIf"QlIf=`qIenQgIf=cqIdqghI!^3f
+HiAEjIK+ZrH[L2<HineEI=2!?r-A6erHnBeq0W$erHeNjrH\Efs*4WkH22ddHN8BkHi86jHiA?k
+Hhr$gHi86mH[9s_r-ABjHN&9hI/\QlIe/'gJGk&uJGaruK)C8tKE-`*K`-W)L&m!_qhP0,rJ1?-
+reUW2pP0*%E,]]0BP1jgG?t2SqHs2/r*e;gr*fP3qHj5/o8`g2rK-W5rK?T4plt]?s-,1&R@9\?
+V5UK"[(*WV]=bno_o0R8aN;TJc-FY_eC`R5ioTChlKms.nalGIq>:-fru%,sN.un1IsJ,OKSFbn
+DJa<8JV]/BMMHt>pOrR$@>BYqMMmFQNfT6`P*2&pQC!u,R[]h=StMdOUSO`aW2ZetXf\e2Z*UdE
+[^WfX]=bhl^VRe)`Pom=ai_fNcHaeadaQ^rf@S[/g=tH>hVd>NioB+]k2tjkl0@U$m-X6?mfr:O
+o()DDo`"O`p&Ojcq#C0iqYU0hr;HTdrdk*#s0)HQ~>
+JcC<$PlL=Rr;HTlqYU9grqZNfrqHHdrUp3_!;$0[!qGdLrpTmT!:BdPs6B[MrojIIkPjTjjlGI^
+io8qTi8<DIh;$c=g=b-1f@JL%eC2jnd*L"_;cH^p;,U<k;u]bn;ZK_f;u]`%/1E&%/h]1A1benb
+&jnuO4Zkkk3BK2Z2`3-L7nc`TrD`#[r)3Pnr`&\lp/D#jqGQ]Z#VRe`0JtUJ5<]!.%m)d13&`]Q
+2D[-E0/5.=2Z,H42uYc<4@)[=9E%Km84c?C7n4mg7o)u[;c6Nj;uBVj;uT_r;uT\k;s[Hc;cHat
+rDiksrDW\m!)i_ns&&nq;GmEks&&_mr_rkrr)*Mnr_ibn!E)km;Z9Mn;Z0Mp<EB)ts&&ns<)ifp
+!)iens&/hp!)i\k!)iMhs&Anp!`W)srD`bpr_i_orD`eq!)i_ns&&ns<)`cor)3Snqbd>jrDNhs
+;c?Xpr_rhpp/Cuj!)rens&/qr;u9Po<W#nr=8uD"=oV\(=UJ&(;,9n]9M/#E?2e1,?i=C1@G52g
+@JsU1?N=F-=o;D$=oDP%>Q.h'=nPtk=UJ>8=]eg/=&r@$;uKTL;cHe">[CiKAnc$qC27X&DfBZ8
+EH6&>EH6)@FEVqVIY!0,M2I:RP*MH*U8P)s[(*aI]bsdV=&i3r<*!^5;,g@g:/+MZ;cQat;c?Ri
+rDWVnA;#\lLPUeEMi<XUO,oEdP*D5tQ^F20S"-(ATV8*TUnsufWN*#$Xfnt6Za7'J\%0&]]Y2(p
+_8=+/`Q-'Ab0/#ScHstee'uq"f@\g2gYL]Bi8ESRj5f=ak3)!nlKdg'mI'uB#4V0Ro(2JFrq6<b
+!;HHes7u]kqtpBjrVcBfJcC<$YQ'+~>
+JcC<$PlL=Rr;HTlqYU9gs7uTfs7cQerUp3_s7?6\s7--YrpKpVmHso>!UK%MkpYcYkN:pgjQ,@]
+io/hRhr!;Hh;$c=g=b-1f@AC#e'cXkd*Bq]baY'uRJN<LQiEBKQ2QpiSVr,aKnu@jP`:K^O/8kW
+Vk]r[SsYb,OH>XZetIA=LAR&2OT(CBOR%u,OSb+<Nq/2(N:r82Ii*]c?sd-2T:_[EQ^3o!NJiRH
+L4b,0JUi^XMuJY@NJrdS@sP\u\c0&4ZjV>Vd!g_,PEV5qQ'M<6r0RAJs-NYL!1!PLqNhAOQ'@Ms
+PPp^NQ'@T#Q^3r&rf[>Frf[JJOcklkqiLo@Oo(=BPl$[EOoUXCOp-u/O,f9^rJpo;r/U]7!07#=
+s,d5@!0I,>r/U`7!/pc6s,Hu;!0-i8!0@,>s,[#:s,R/?qN(Z:"-&>%O8Y1?OT:LAO8Y1;P5CFC
+Pl?mFPQ7$JQi<BMRK&`XS=Q5MT)YG_ScYOUT)>,YT)YAWT)YG^ScbUVS=KSLrgX"[TD>,eP(A%+
+F`287ELL52?i=C3@J=7*A+sO.A+sI2@K'[4?i@#(X88jrX8f9oXoGR&YQ(j+Z2V'.Zi.92[K!]4
+\,Wu8[iN&l]YD>'aN`,^g"bKEj5f@dlKn!0oChqRqY^<kjSp(*[%a(SQB$lqYFV5HJ9uZtS#<O!
+^94Q=po\M<KnbA=M2@.LN/`mZOHPckQ'I]'R@9V8St;UKU8+N\Vl-MoX0&M-Yd(O@[C3QT\\#Mf
+^V@V%_o9U8aN;TJbg+M\dF-Lne^rF*g=k<;h;7)JiSrnYjlY^hl07L!m-O--n*fc8nac8BoCW%T
+!quB_rV6Egs8)ZjrVZWmo_sFAJcDqRJ,~>
+JcC<$PlL=Rr;HTlqYU9gs7uTfs7cQerUp3_s7?6\s7--YrpKpVmHso>!UK%MkpGWWkN:pgjQ,@]
+io/hRhr!;Hh;$c=g=b-1f@AC#e'cXkd*Bq]bkZhiJG=WiIK4fqIN`fF?u9@aF`D83ASl73It2um
+G^"7ME,KN/Coa:ZCiOTDja6iMrd4Edom-O_s*=0[rHT)`?XR5<:el7YG'.kHE,KN.BkCpfr*fV=
+s(VFF!,DLH"BT/oNK!jn"GhhhLPPh_$=S:NDKL)PIt3'!r-nQns*jlo"+GZHIf4ZpIf"WgIK4fq
+IdqgeI!bd=qL/-drd=corHeTlH$T:5rd4KfrHnQls*OTird+Wkr-8EiH$O^_qKi!brd"QkrHeEh
+qg&<jH@#R;qg/3fqL&<kr-nEj!.b&uqLJQrs+('!!.t-$qLej&re16(s+gW/qhP-+reLH.reUW2
+onNm)EH#c1B4tdeH=$JUrF#V5pL<l,pLO#.pL=)0ra>Y2ooB'5rK-W5rK?T4pQYT>s-,.&R[]qE
+VQ$`&[(!QU]">\k_Sa@4a2c<Ebg"J^eCi[7ioTCglg=02o(;VLqY^0h(t=k9MM6V3G^4t"K7J;h
+Df0WFL5CkNM21eXD2!_"Ll$tHN/WaWO-#NfPa.N#R$jD4S=Z=FTq\<XV5L5jWiN8(YHY:<ZaI6N
+\[f>b]t_=u_Sa@3a2lBFbKS8Wd*^:jeCE1&f\5'6h;-rGi8N\UjQ5Odkiq?slg4!*mdKW6nF?)?
+oCMVRo`Fj]p\jmeq>^<hqu-HkrUg)?s+13Rs*t~>
+JcC<$PlL=Rr;HTlqYU9gs7uTfs7cQerUp3_s7?6\s7--YrpKpVmHso>!UK%MkpYcYkN:pgjQ,@]
+io/hRhr!;Hh;$c=g=b-1f@AC#e'cXkd*Bq]bYqI>;?'Ps<)Z^nrDW\nperJ:;c6LG.4?i!/N>XE
+1+tI?5XIb#4Zkni4#]/Y2DS`985<#[;uTb[;uBPn;uTbl;tj8k;u0D\;\gu=0/,:?1-[rd4ZYYd
+3&rrW2Dm<I1&`m,2Z5K52Z,N:4[;\7rCd/]!(m,[#"M394]"pNrDNJjr)EJjr_rkrr_iSkm8X*a
+!*&eps&9/#<)QUk;Yj;n;H$Nn;Z9Pl;?Trt;c6Qh;?9WnqGIZ!;Gg:j<)Z^p<`T)s!)ieqrDN\o
+r_WYnr)<VnrDE5dr)<YpqGdAk!)ieprD`eqs&/bns&/Si!`W)rr_`SkqG[Amnl,Qfr)3Pos&8nr
+!*0"ts&K)"!EE2!=8?#!>5MG0;c-Cg:J+;P90Q\Z?i=C3@J=7*A+sO.A+sI2@K'[4?i!q'=T;P&
+>5MP(>5MJ$>5qh'>4u,!=p%o0=]kZ)"'&;u;Z9T$<)m%(?!h&OB5.?[s(_^RDJsIkE;sqXEYW\?
+H@13oKnbGBNffQmR\$=SYHkUIr4Eqp=^,!-;c6Li<Dudl:ea\Z9i+hi=&r:!;c<Tnqc%EdL51SA
+M2R=ONK9-^P*2&pQ'[l+R[]h=StMdOUSO`aVl?\sXf\e2Z*UdE[^WfX]=bhl^VRe)`Pom=ai_fN
+cHaeadaQ^rf@S[/g=tH>hVd>NioB+]k2tmll0@U$m-X60n*oi:o()DDo`"Lbp@n=[q#C0iqY^6h
+r;HTdrdk*#s0)HQ~>
+JcC<$PlL=Rr;HTlqYU9gs7uTfs7cQerUp3_s7?6\s7$*YrpTmT!:BdP0'hffl07EqkN:pgjlGI^
+io/kSi8<DIh;$c=g=b-1f@JL%e'cXkd*L"^bfcKEqO.8Kqj.;Kr0@5F&?2"NR#d#pS!T:pNK%SP
+XJl,o%@rrRP`_#cOgga$H\@LZO8Y1<OoCFBO8G%1O8b7<O8b11NVJJ,N>d7oJUh-7@@s3aT:M@7
+P`^raM2$b:K7nf,NW+n:NXq,.NJiaS@ro8o\[T#U[C,k<#FN>NIYNiGPQ$gGQ2d0HQiEBMQi<<N
+Q2d0FQiE?OQ2HmGQ2d0MQiEBMPQ7!JP6R26P*;&kOo1@HPEM)mPE_=.PPgUDOo1:>Nr4n9NrG%<
+Nr+n:O91K)OSk1>NX(W*N/WaUN/dgqs,@,@NK&tsNW"k;O8Y(AO,f6]OS"V5NW>.;OT(C?OSt==
+P5CFEP`q=0PQ7!IQi3<NRK&`URg,FTStDXJT`(JaSt2DMSbJ`TTDkDbT:VUDSG\oZStDYNTF.B\
+IslNaDJj92Wr6<(@/aU1@f0a2AFjC.AG]m4@fBg8@/jU6WrK-rWrK."XS&^pY5YX)Yl:p,ZMq3.
+Zi[YD[e7-0\/r2l]Y2,!a3)`Vf%Jj9i8Wh[kj%O'nalGJp\F^aro="rrS=BER?NnqeZY^EOc4[5
+I#O`$ZamEF[B',+DQebKL5:\CMN!LRO,oBcP*;/rQ^F//S"-%@T:qsRUnsueWN*#$Xfnt6Za7'J
+\%0&]]Y2(p_8=+/`Q-'Ab0/#ScHstee'uq"f@\g2gtgfDi8ESSj5f=ak32'olKdg'mI'H3nF5u=
+o(2MGrq-?dp\4X]s7u]kr;6HjrVcBfJcC<$YQ'+~>
+JcC<$PlL=Rr;HTlqYU9gs7uTfs7cQerUp3_s7?6\s7$*YrpTmT!:BdP/F2Tdl07EqkN:pgjlGI^
+io/kSi8<DIh;$c=g=b-1f@JL%e'cXkd*L"^bffd4!.afnqgSHk,&^t1Bk;L1Df'-%C0,t:I=-?d
+FEDJ>Ci!j,LjEfSFF/=[ja6iMrd4Edom-O_s*=3\rcn`S?=7,;:JlB9Fq8\9E,TT/BkLse@:<YS
+@;GjW*bfA'BPV9qBie`&NJraOM26qCLPLV=LPBi0C2\3?rI=it!.XusqLAEks*jinrdO`opO3*j
+rI4<c!IT7nHjG.JI=-EjI!pG;HiSToHj>"GI!^0cH[G[:rd4Qhqg8$arHeKhs*=fnH?spbqg/*c
+rH\Hjrd+Khr-J6er-J9fr-\KlqgS9h!e>cMq1/Krrdb!!!.t0%s+L3%s+CN/L4t>9pkSg(reLE-
+reUW2onNm1KQ1sKCM7?kAqBnfra>_6q-s83pgiu-q.0A4q-s>3ra>b5pl>B8rK-T4rfZ]5pQYT>
+s-,1&R@B_>Uo(2qZ*^pJ\[oGe^VRh+`Q#s>aihrSdad%+hr3\[l0Ia*nalGJq>C6eru:s]WJuXa
+I=QX?N.m"4H#IS<G(GL-N/NLLKSB5TD2!_!Ll$tGN/WaWO-#NfPEhE"R$a>3S=Q7DTqS6WV5L5j
+WiN8(YHY:<ZaI6N\[f>b]t_=u_Sa@3a2lBFbKS8Wd*^:jeCE1&f\5'7h;-uHi8N_VjQ5Odkiq?s
+lg4!*mdKW6nF?)?oCV\So`Fj]p\jmeq>^<hqu-HkrUg)?s+13Rs*t~>
+JcC<$PlL=Rr;HTlqYU9gs7uTfs7cQerUp3_s7?6\s7$*YrpTmT!:BdP/aM]el07EqkN:pgjlGI^
+io/kSi8<DIh;$c=g=b-1f@JL%e'cXkd*L"^bf`r`;#jMi;uKVi;uKT:1Fst1/M0"A2)?pB1H%Qc
+5s7Cq3]fA_2`EWT6UsmK;>sMm<9[?Z;ZB\p<;BJe<<#nn;Xm[(/h\k42`*<S5!;"i4?5A[3&NTN
+1bpg@0ebQb2?Gfq2uP]<5!Vb8rCd/]s%32\#"M3B6;C<Sr_rhp!E2tr;u0Jh;ZTirr_iPjqc!Po
+qGdJprD`eqs&Akqs&9M-<)Z[n;H$Ik;c6Om;H-Wo;?0Sl;ZB\q;ZBYs;H$Nk;ZB\n;Z9Vp;?0Yo
+;uouurDWYor)<Slr)<Vn"B/2r;,[*d!`W0"oi1ifqG[Gnr_i\nr_iPjs&9,";Gp@hr_ibp!*&en
+r)E>f"'&<!;Z0Pg<;]_r<rQ2#=Sl8#>5;;-;c$Ch:/">R8jE8]ra>_6q-s83pgiu-q.0A4q-s>3
+ra>b5rE9&#s&o;(qHNu'r)ru%s',>'p0%E!rE0;+='&F%<;f`%<)m"&>[CfIA7kdS"D_giDJfAj
+rbiZnEH-#AG^=aeJq\u;NK96fR@L"KXK](A]D]AR]=PP&?s-K-;H$P$<`2mn:]=)p:K1=n=B/F%
+;#XDj<,I>DL5:\CMN!LRO,oBcP*;/rQ^F//S"-%@T:qsRUnsueWN*#$Xfnt6Za7'J\%0&]]Y2(p
+_8=+/`Q-'Ab0/#ScHstee'uq"f@\g2gtgfDi8ESSj5f=ak32'olKdg'mI'H3nF5u=o(2MGrq-?d
+p\4X]s7u]kr;6HjrVcBfJcC<$YQ'+~>
+JcC<$PlL=Rr;HTlqYU<hrqZKes7cQerUp3_!;$0[!qGdLrpKpVmHso>!UK%MklL#2roO7CjSn0]
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXjcd'h[bKJ%sqO.;LqNh2JrK[;F+IS1AOb[\DR$E_lO-$KE
+Vl-;bT:M=8PE1]HP)j^2Jt)\!s,[8DOSY+>O9(K*rfR2Ar/Ui>qiC];qiC`:nr<I(pl-2:It)uV
+?='7qSXl:;Q'@JnMi3CFLP1;2JW0Pe!K<*<N!PDQDnEWm\$iaE[K!T6[JmN?VRC`%Lm"!dPE_=0
+Q2d-NQ^7T:s-EVMrg!PLrg*;Fs-EYK"-o+9Q2I!KQMm'MQB[X3P7!J8P*2#lP*;)mP4b%9OoUUB
+O8k7;NVne;O,j'trf@,@rfI)>s,I)?qMkN6qi(T9rf%)ANK&sYO8P">O,f;"ORnP4ORnV7P5LOC
+P5gaAPlI'LQi3<ORK&]ZS!oe9SY#hQs.KCas.BRfSXuCDSY#hQqk!eZs.94^!hGjOrLNt[!2'([
+&>>hmTq6d_H?O=ICiYMe?srtBqI9D5r++_sr+,b9qI9G4s'Pi-qPsOq!3GjqriQC-Y-5(6rNZC.
+rj2O0!k#JFp:("1*kJts^V[t2bg4bhg"kNCiT'%`lL"'2o_%qQq"jpeiVse+\>#L[Q]$ru\"0"O
+M0sc)R\m?t]<AE@WqrmuYQ'>lLPUeEMi<XUO-#KePE_>uR$a>3S=Q7DTqS6WV5C/iWiN5'YHY:;
+ZaI6N\@K5a]t_=u_Sa@3a2lBFbKS8Wd*^:jeCE1&g"P08h;-uHi8N_VjQ5Oekiq?slg4!*mdKW6
+naZ2@oCV\So`Fj]p\sseq>^<hqu6NlrU^#>s+13Rs*t~>
+JcC<$PlL=Rr;HTlqYU<hrqZKes7cQerUp3_!;$0[!qGdLrpKpVmHso>!UK%MklL#2roO7CjSn0\
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXjcd'h[bKJ'(JH15pJ,FcnI3<NB@V]LSF`;23C27U;Isl`j
+H$4=NEGfT.??C7%D/t.)HLlI`I.Vd_HMr3cHM)R_H2r6^GlN%:>$tZE:f1&6G'7qKEcH&:CM@Nq
+AS#@[@UX"cC2.HsCM@NtC2-gWrf$u:M2D4fs+gW/#D\%^Jo#CKI/\U!IXcitJ:IQI!IoRsJ,F`p
+If"QnIeeHoIXh*@!IoRhIJnQlIHc+[H[>[<rHeEh!IB+lHMi-eHiSToHiSNeH2r<hHMMpeH2r<k
+HMW!cHMVsgHMr3gI/SKjIf+]pIfFonJH(*#J:W:NJH(3#K)C6$K_gE&LAur1L4t>9L]3,-L\6H'
+M>`8(L]</>LPBhhDej$!AS,jm?srtBqI9D5r++_sr+,b9qI9G4s'Y\`!0@)?p5o?<rfR2CmZ[C0
+qi`^uQ'[o.St`'[X08h8[C3TV]Y2(q_Sa=2a2lBFbg=kig"bKDjlkspmdTf>pA+Ubq#CBn)u\Z[
+QAUEJJTlKpN.QP*G&D2<I"dH:Nf&[KKD:-"L2)L"M2I4MNK0']OckomQ'Rf)R[]h<StD^MUSO``
+Vl?\sXKA\1Z*L^D[^WcW]=bhl^VRe)`Pom=ai_fNcHaeadaQ^rf@S^0g>(N?hr*GOj5]4^k3(sm
+l0@U$m-X60n*ol;o()DEo`"Lbp@n=\q#:*hqY^6ir;HTcrdk*#s0)HQ~>
+JcC<$PlL=Rr;HTlqYU<hrqZKes7cQerUp3_!;$0[!qGdLrpKpVmHso>!UK%MklL#2roO7CjSn0\
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXjcd'h[bKJ'-;#jMi;uKVi;uBN=/1N&$/MT4C2)-mD1daSp
+5!D+m3]f>\2E!0O7nlfV<)QUm;uK\i;ZK_f;uBPn;uTbl;tj8k;u0D`;[G!-/ho7@1Hmucr]Dbn
+3&iiT2Dm<K1GLU<2E!EN2)dKR3&rrX5!DS591qrO84Z<E84c?B83&Y';Z9Yn;u]hq;ZTirrD`Sk
+!E<"s;YX2i<<#kt;H*Qo"'&<"<W#hr;uTbn<W5qu;c<Tnr)3Pn!E<"h;YsDk;Z0Mr;H$Ikqc!Jn
+!)rkrs&8qss&/nsrDNer;,L6j;uKVo;u]bh;u]hp<W?%u;uK\o;ZTirqG[Gnr_i_or_`er<)ico
+s&AtrrDEVorD`eq!*&qrs&Att!`Muppeq5n<E/lp!*&qtqc*Jn!*9)#s&f2%rEB/&!*K5'!a&N&
+r_Wqs92%rM3Ak2PraGY4rF>b9i+;gsrF>\5raGh7!*T2$!*T8(qHNr&!a/]0rEB2)qHEPp!*]>(
+s&]J,<`W4";cEZp&QW";?!guLA7oOgBPD6tCi+%gDZ=YTE;snoF*;eSI"-a&Ll7:VPa@i2V5gc+
+[^s)_rk'&Y\[],(=Bns0<)Z[k<Dudk:ese[:/=gf<<Z?%;,:+hqGdKLC57V%MMmFQNfT9aP*;,q
+QC+&.S"-%@T:qsRUnsrdWN*##Xfnt6ZEpsI\%&u\]Y2(p_8=+/`Q-'Ab0/#ScHstee'uq"f@em3
+gtgfDi8ESSj5f=akNM0plKdg'mI'H3nF?&>o(2MGrq-?dp\4[^rqZTjr;6KkrVc?eJcC<$YQ'+~>
+JcC<$Q2gCRr;HTlqtpBhrqZNfrqHHdrq6<`s7?6\s7--YrpKmUmJcJPlON4El0.?ok2tdejQ#:[
+iVqaShqm2FgtUQ:g"=p.e^W*tda?IgcHa\YbK@qrqjIALqNq5Jrg!GH+JY-SObnshS!fCpOcQ$5
+WMQGcU7Rg=P`Uifm+e=\Iu=,a"-AY-P5LIBP5^RNP*(ojOcb`fOH5M&O8k=AO8G%9O8b11NV\V0
+N<XTUJUh-5>lL<>T:DF;PEV#eMM[(AKS4o,MMd@RNfK*WN/WaUA95Ap]"#2WrjDd5%(3ILFH2N2
+K85bYQ';33qj%,GrKdMMrKmPMs-<VMp6YfF!0mDH!LB)OR/`KRQC%Q9s-+"WPa%AqP*(ojPEV/n
+P*5d-s-3GF!gJn4r/q)COT(=@NrP(=NrG%:NrP1?OSk1<OT1@IOH5KaOH5E_Nr+h9N;nk;NrG"<
+Nr=q=NfB%pNrG+:OS+\5OSk77P5LODP5gaAPQ@&8rg3VOrg<nXS!oe9rga:cT:hjLT:hkVTDY;[
+TDbAVT)bJ]Sc52\TD>,mTq\9VU8"EVK782lEc>o9F/*1@@f9g8AG0U#B(fg7AH$*8@K9j6Wr9!l
+Xo5F$Y5kg*Z2_-/Zi%03[C3O;\,EfY]">Vh_8OC:c-b"kg>(QBi8`q_lKn!0o_%qPq>1!fhu=P\
+VkKNDQ&`hmU83p4JpVs'Trk]5\#uj7qQBh$AVPtrM2@.LN/is[OckomQ'Rc(R@B\:StD[LU84W_
+Vl6VrXKAY0Z*L^C[^WcW]=bhk^VRe)`5Td<ai_fNcHaeadaQ^rf@S^0g>(N?hr*GPj5]4^k3(sm
+l0@U$m-X60n*olHncJFTo`"Lbp@n=\q#C0hqY^6ir;HTcrdk*#s0)HQ~>
+JcC<$Q2gCRr;HTlqtpBhrqZNfrqHHdrq6<`s7?6\s7--YrpKmUmJcJPlON4El0.?ok2tdejQ#:[
+iVqaRhqm2FgtUQ:g"=p.e^W*tda?IgcHa\YbK@s'Jc:2pJ,FcoI3<cN@r,^hG]Re<Ao)4+J:Dum
+H$=@PE,KK+DRu]pCiFUqHMDjeHiSNmHieYBI/A6jI/\KkHM`'aHM)R_H2r6_GR/Ru?XR2::/6'5
+G5lY,Ec5l4D/!WoA7T.X@;0ChCM@NtBkhBuBie`'NK&jQM>i>2L]<)6LK8D>Cia`JrI5$#It*!!
+It.BFrdOosrI"Zpr-\ZrI=?Y@Ifk.LIXh3Cs*t&t!I]FhIK+]nIJS?kHi8<lIJ&!cHiA?gHi89i
+Hi&0jIK"ToHgc:VHiA?`Hhi!`HiAEiIJSEjJ,autJ,+WpIfP#uJcC9"JH1<"KE$W%L&Zo-K`Hl,
+L&Zr-M#E,-M#W>*M"ZW(M#W81L^J6DDes*#AS,Ls@JaO4A,Ts3Aa<t%Ac60=A,9X7@Jc)`OS4e:
+P5^UBP44\.Pl6gFPV/8hS"-+FVQ$Z#Z*LaE\@K8c^;.S&`5Ta;ai_lTe(31,hr<b]lL"'1oC_kS
+rV-<lrr)d4gpi?!KReT"S<AS[H?jLJDfpYhMiE[PL\?C4L51SAM2R=ONfT6`P*;,qQC!u,S"#t?
+T:hmPUnsrdW2co"Xfen5ZEppH\%&u\]Y2%o_8=+.`Q-'Ab0/#ScHstee'uq"f@em3gtgfDi8EVT
+j5f=akNM0plKdg'mI'H3nF?MK!qZ'Vrq-?dp\4[^s7uZjr;6KkrVc?eJcC<$YQ'+~>
+JcC<$Q2gCRr;HTlqtpBhrqZNfrqHHdrq6<`s7?6\s7--YrpKmUmJcJPlON4El0.?ok2tdejQ#:[
+iVqaUhqm2FgtUQ:g"=p.e^W*tda?IgcHa\YbK@q(;,[0fr_iMirDFal.Od)(/NG[G1b^[@5=.V!
+5!1qh4#o;[2)K8M7nul[rDNYor`&Ykr_iYms&/_mrDNVnr`&\lpJh/kqGQub"tM;Y0f:aDr]M&[
+4Zkec3ArfS2)I*G0etF@2)[BO2E*So3#FY?5>"UB92%uM84cEF8Ou>t4\&4D;,^Hl;uT_t;c6Nl
+;uK\n;uTYp;uT\j;[QK(<)cdp;GpFm<;fhk<;ff!<)lptr)<Jj!`N&trDEVopJM#j<;]\o;Y3od
+<<#ks<;ohr<;oeo;u]_q;>jGm;Y*ie<;okt<;fhs;uTbo;u9Po;u]hq;ZB\p;ZBYq<;TSo<;oho
+;Z'Mo;Zp&u;cH`q<<Z?";H$Llqc!Jnr)<Vpr`&qtr_ierqc*`!='&N$=o;J&=TDS&=oVP3=BABt
+;,0hZ8kMN/@JaO4A,Ts3Aa<t%Ac60=A,9X7@Ja1*>5;A'>$Li,r`f5&oiV8urE9/&s&T;'<E2ur
+<"W,3=^,3>@:Nh[AnPajC27X%rb_[QrbiWmEcZDKH[UEtL5CnOPEqT,UStB%[CEi\rk&TL\[T&V
+[Bt^&=]PH"#$"i/;H-Igr_<er;cQe!<`N's;H*BjAVPtrM2@.LN/is[OckomQ'Rc(R@B\:StD[L
+U84W_Vl6VrXKAY0Z*L^C[^WcW]=bhk^VRe)`5Td<ai_fNcHaeadaQ^rf@S^0g>(N?hr*GPj5]4^
+k3(sml0@U$m-X60n*olHncJFTo`"Lbp@n=\q#C0hqY^6ir;HTcrdk*#s0)HQ~>
+JcC<$Q2gCRr;HTlqtpBhrqZNfs7cQerUp3_s7?6\s7$*YrpTmT!:BdP!UK%MklL#2roO7CjSn0a
+io/hRhqm2FgtUQ:g"=p.f%&:!da?Ihcd'eZbKJ#KS=>t9rgE\Oqj75Hr0/:jMeA*,At><RNfT65
+XfA:tU84BNR$<_oNj-?eFaSo?NrkE*OoCOCOnOt9OoLLFO-#HaplPB6rf6Q/qi(B2)L6g_J:V'6
+Tq@mHSt;73P)t`^M2$_<KS"c5req/CNf8pTN/Wa,HiCVY\@/jF[K!W6[0F!oUX"CCM#EY=Pkp[D
+QMm-MR/NBOQ2m3LQM$ROQBdc$Q'R`&Q^F0;QNEJ>QMd!IPQ$a>PQ$gFPQ$dPPE_8pP*;)lOT(:A
+NfF$u!0-o:s,[2Bs,R/?rf@)@s,[)>rK$u<!0$l9!0$i8rf6u;!fi8"q2YK:!0@&>rf@)@q2bN:
+s,d;ErfI8FPEc!/s-*MIrfdJJP*5g.qNM/KQC!r*R/E?\R[]e8S"6+?SY)OITDkM`TDtSaTDtM^
+TDkGVT)kOSrgs%[qOdh^r1j:f$`0YRIscK[Ec,l=I/[URA,^$7Ac$*'BDZ<:Ac?6=A,Tm9Wr9!m
+Xo,@#YQ(j+Z2_-.Zi.92[/dZ3[fEr;\,EfZ\[oGe^V[t2b0JD`f@es8hr3VXl0@[)o(2PJp\=U_
+rndYn]=t&2R$W\oUqiFdP)Og7JsN7?[Ci]F[B$G-Y5PP7L5:\CMN!LRO,oEdP*D5tQ^F21S"6.C
+TV8*UUo(&gWiE/&Y->.9Za@0M\@K2`]tV7t_Sa=2a2lBFbKS8Wd*^:jeCE1&g"P08h;-uHi8WeW
+jQ5Oekiq?slg4!*mdKW6nc&(boCV\Jp%J+Rp\ssfq>U6gqu6NlrU^#>s+13Rs*t~>
+JcC<$Q2gCRr;HTlqtpBhrqZNfs7cQerUp3_s7?6\s7$*YrpTmT!:BdP!UK%MklL#2roO7CjSn0]
+io/hRhqm2FgtUQ:g"=p.f%&:!da?Ihcd'eZbKJ#KqLSQpqg\Nmr-]Z+B2`JS;fm"rBP_HbJpr,s
+H$OOSEGfW/CP%XoC2S1kHLcF\I/SEkI/\KmHMMp_HM)R_H2r6`GS=7f?smD>:O78/FEM\FE,]Z1
+C1mNV"(G\JCAhiHCAqrIC)1MbAr_n2Mi!:HM26qBL5(IrI$nkoG5HdhIfFotJ,k)sIf=isIfFir
+If4]nIe8-dIf=irIe8'gI/JEiI/\KmI/\NpI!u!ArdF`mr-JEiqg86erd4Qjs*alos*F]lo6U4Z
+rHe-`p3HadHN&9kI/89hIf4crJ-(4LIf=imJ-(4NJGXotK):0#K`$Q'LAuu-L'*-aL55barJ(Q4
+LPL\AM=uc%LB<9eL\uu.M$JopF`MG;BPIHX!+l.=rF>h;q.9G8k\'d)q.9P9rF>e8rf6r=p6#B<
+s,m8Cn<<O0rfd;F09qomS"67KVQ-c%Z*L^D\%95c^;%M$_o0R9aihuVe(34-hr<b]lg=02o_81Z
+rqQKnrr)fqr#+"NRYccOJTcKsP(.q,GAh88I"[H;NJ`OKp4Qt2Ll$tGN/WaWO-,TgPa.Q$R$jG5
+SXuIHTq\?YVPgAmWiW>*YctF>['mHR\[oGe^;%M$_o0O7aN;TJbg+M\dF-Lne^rF+g=k?<h;@/K
+ioB([jlYail07L!m-O--n*fc9rpg?do^qhLp@e7TrqQNhrqcQirqu`noDX=@JcDqRJ,~>
+JcC<$Q2gCRr;HTlqtpBhrqZNfs7cQerUp3_s7?6\s7$*YrpTmT!:BdP!UK%MklL#2roO7CjSn0^
+io/hRhqm2FgtUQ:g"=p.f%&:!da?Ihcd'eZbKJ#K;YF&g;Ya8h;@b<..P<;*3&NNI1Gh'Y5sYE5
+r]:HI2`EWY7n6?P;c3Hjs&/nspf%)gr_rbnrDWYmr)<Soq,@#es&8blpJVPR0.nq41c7H]5!;"j
+3]d7"$TBq#1c$mA0fM!K2uY`82ubi@3Boc$9MGFYs%*5^9)_Bd7k[)';,L9j<;fbp<!#ur;Z0Pl
+<;fbm;YO,i<<6&tr_`er<)iisr)EYorD`br"B8B$<)icorDE_r<)cfq;Z9Sq;H*Hj!)rkrr)3Sn
+pf%2lrDW_qs&8qsr_inu;c6Nj;u]bp;u]bd;u]hq<W5r!<E)oq<;TVl<!-&u<)`cos&8np!)rbo
+qc!Dj!)rSjrDieps&&ns<)rlrs&8qs!)rkrr`'/%;c6Ll;cN]q"'/K)=Sl8">5_S<=BSg2=]ed/
+=^"s*;Gp=b9M.oF4T8ggA,^$7Ac$*'BDZ<:Ac?6=A,Tm9=T)Fu>P_P$>P_Os=oV\)=oVV'=8l4u
+<"i85=B\s9?X[DSAS#IdBPM<uCi'&e,AqF<E,p&CG^FjhKSPDDOcu*#TVnos[(!WY]=beg\[T#T
+[/RB=HWaZW=B&3t:fLHo;#a8u9MJ;]<`E'u<E)dmpf(dYLl$tGN/WaWO-,TgPa.Q$R$jG5SXuIH
+Tq\?YVPgAmWiW>*YctF>['mHR\[oGe^;%M$_o0O7aN;TJbg+M\dF-Lne^rF+g=k?<h;@/KioB([
+jlYail07L!m-O--n*fc9rpg?do^qhLp@e7TrqQNhrqcQirqu`noDX=@JcDqRJ,~>
+JcC<$Q2gCRr;HTlqtpBhs7uTfs7cQerUp3_!;$0[!qGdLrpL*[mHs9,lg*j8kmlq?k2tdejQ#:[
+iS`YOhYu=PgtUQ:f[na+e^W*tda?FfcHaYWbK@oIa./WgR[KT@R/<6LQN*6LPTZT\LQdFJTph7,
+LQ7CuXf/+mUS=9GQ^*SjN0TQmH\7phNrP.AOHG\'OoUX:P5g[EOogc-OoCFBOnb%8O8b11NVnb4
+N?<CpJUi;X?DF0aT:DI=QBIAiN/E@EKS+l,Mi<UTN/mdp!G$l_])oLN[f3]7Zj=(J[%YK`JVT<a
+Q3EP<Pa.N"r0@5Hrg*VPrKmPM!1!PLoTocJQ^*l&Q^@]=pm;#Grfm&=!L/fIPl6gFPQ[27P`h4/
+P6-l.O7nV5O8k:AO8b1:O8P+=Nrb9#rf$`6s,I/?NfO*us,R)<qi1Z;q2kW;rf@,BrfI)>s,d5B
+"-Se0PQ$gHQ2d*JPlm57P`u*0s-*;Ds-3VNQi<BMR0f=OR[]k>SXc:Dr1O%]rh01]rgrtYs.97_
+s.9+[qk3t_!2BIfrM9Cg$&O(XG&hS?EHK>%A,^$8Ac66=BB<h)BDlH=Ac?6>A,g!<WrB%!XSApq
+Y5PR(Yl:p-ZMh--ZiRSCp:("1+h>1r]=u(u`lZHMdF?e$g>1ZEj6,[mmI9]<o_/%SqY^<Iru(g6
+U7@X9N3pa'T9,(dI!^X@X0oRMY-5"/r3$"%A;5kqM2I4MNK0']OckonQ'[l+R[]h=StMdOUSOcb
+W2ZeuXfen4ZEppH[^`lZ]Y2%o^r""-`Q$!@b0/#ScHstee'uq"f@em3gtgfDi8EVTj5f=akNM0p
+lKdg'mI'H3nF?MK!V>s_p&Facp\ssfq>U6gqu6NlrU^#>s+13Rs*t~>
+JcC<$Q2gCRr;HTlqtpBhs7uTfs7cQerUp3_!;$0[!qGdLrpL*[mHs9,lg*j8kmlq?k2tdejQ#:[
+iS`YOhYu=JgtUQ:f[na+e^W*tda?FfcHaYWbK@oIa8U\iJbsupJ,FcpI2@$@@r5^fGB%M7Ao)48
+J:;lkH$FFOE,PYj"a,!>Df^L-HLH4ZI/eQkI.Vd\HM)R_H2r6bGR.JZ?smD=:j[HdFU*#.EGfZ0
+Bk[KV$=[FPC2%BtBkh?rrbDRM=)@kr&;uC%Ll$qCLPCP=G`ZWXFF!b5rI4crs*t*!r-nZqs*jur
+s*joprI4BgqgSKnrdOcn!.OEc"FPWFH[Ga>rd=osI=6KjrdFcn!IK.dHi89hHi/6kIK"TsH[:!b
+Hh;XaHN8BfHN8BaHh;XaHiAEhIJnWnJ,b$!J,XosJ,+WpIfP#sJc13!KE$W)L&6W(L&Zo-L]*&*
+L]</1M=uc%L]<50M#E2/M?S-CDf'3$rac)(raYq<qITV;r+G,)r+Gt?qITY:raYt;!07#>p6#B<
+!0R5Cn<<O0rKI5F09qllR[g"EUo12oYHY==[C<`Z]tV7t_8=.0a2uQMd*pS!gu%)Pkj%R)oChtV
+rqQNnrr)d:r;6?elHG9EL4au$O.:oUH?jRLD01;bMiEXOLPLNWKOfgmLl%"IN/`jYOHG]iQ'I]'
+R@9V8St;UKU8+N]Vl6SpXKAY0Yd1UB[^N]V]"G_j^VI_(`5Ta;ai_fNcHaeadaQ^rf@S^0g>(N?
+hr*GPj5]4^k3(sml0@U$m-X60n*olHncA@Srq6<bs7cNfs7uZjr;6KkrVc?eJcC<$YQ'+~>
+JcC<$Q2gCRr;HTlqtpBhs7uTfs7cQerUp3_!;$0[!qGdLrpL*[mHs9,lg*j8kmlq?k2tdejQ#:[
+iS`YOhYu=JgtUQ:f[na+e^W*tda?FfcHaYWbK@oIa7W@2;YX2h;Bd_C.538(3Ar]L0JkUQ69m[t
+4Ztkf3]ArS0L&'':Jb%g;>sJd;u0Al;u9Jm;uBPj;uTbl;tj8k;u0Df;]I>A0/,(;1d4,e5!1nf
+3]K&X2`3EM1bpjB2`<Sn2ZPc73!D?-5tXgFr_*8_$V3l\84c<15Yk6T;uBVm;ZTirrDNSmrD`_o
+qbm/e"B8B$<)`co!E2ts<W#hq;uBT!<E)mr<E3#o;Zfor<)ifor_ikr;cETl!`N&tr_iepohtrm
+<)QWk;ZKep;uT\f;ZK_e;uTbq<W#hr;uTbr;u]hq;u]hr;Z]os;uKVo;Z]iq;uBVk;uT\p;ta2h
+<W,l#;c6Oo<`T,ur_rhrqc3Yqs&/kq!*&qt"B8B&='5?&!*]5%!E`M(>5_V&>5qJ":^'Tf8kDEO
+raYq<qITV;r+G,)r+Gt?qITY:raYt;!*K2'pKRQ!r*0#$p0%E!rE0,&r`9,$<W,ns<>/D8=^,0<
+?t!MS@q9.`BPM<tCMWocs(rrtDfKf=Fa/7^JV/`8NKKHnSu&HlZaRBT]=Y_f\[T#T['T\9)Nf)D
+<`2gp;c[4&;c$4b:/"D]<)m(&<`N'opf(dYLPUeEMi<XUO-#KePEhE"R$jD4S=Z=FTq\<XVPgAl
+WiW>*YctF>['mEQ\[oGe^;%J#_o0O6aN;TJbg+M\dF-Lne^rF+g=k?<h;@/KioB([jlYail07L!
+m-O--n*fc9rpg*]o`"O`pAamdq#C0hqY^6ir;HTcrdk*#s0)HQ~>
+JcC<$Q2gCRr;HTlqtpBhs7uTfs7cQerUg6aoCMtPs7$*YrpTmT!:BdP#4(R>l07EproPTijQ#:[
+io/hRhqm2FgtUQ:g"=p.f$r3uda?IhcHa\YbK@rJa2X\LS,\oPR/NBNQN!-lPc'e'R#I#tS=5Y$
+OH=.ZX/;_hU7[j>PE1`6q8M38JGtT.O8b7'Oo^],rfR5B!0R/?qiC`:nr<U,r/D/3It<-#?sTM"
+St;LCQN!-ZOH#-PKnY24J:NT=N/iknN<FpI]=YWO[f3W=\$W$;H%Up<qN_,GrfmJLqj%/Hrg3YP
+rKmGJnsBBBrg3SNq3M)IrKRAIp65B<rfd2Cqi_&CO7nV2O8P"<O8=t:Nrb9#r/CW7r/Lo>N/WaV
+rf-i9s,[)>s,R8DO-#J%OTL]-OT(=?O8tFBOp$u5Q'@O1Pl[29rKR8Es-*MIrKIDLQC!s6R/i]T
+Rg#=RSXc7Br1O%]s.K7]s.9(ZrgrqXqOmk^!huHbqkX+c$]]X`G]e"EEd"!PAGTm:B)QB7B_,s1
+B`2TCB)?0=AH--@X/rE!Xo#:"YQ(j*YlM*.Zi%02[C5b;rjX/_]">Sf^V[n/b082[eCWC.h;I8Q
+kNV=#nF?)@p%S7Xr;PLO)Z%._US4-CM3Y$\S!9(oJ9l[+VR3eDY-+t/r3#t$@u#ksMMmFQNfT9a
+P*;,qQC+&.S"-%@T:r!SUnsufWN*#$Y-5(8Za@-K\@K2`]Y;.r_SX71`lQ6DbKS8Wd*^:jeCE1&
+f\5'7h;-uHi8WeWjQ5Oekiq?slg4!*mdKW6nc&([oCW%Ts7ZKerqQNhrqcQirqu`noDX=@JcDqR
+J,~>
+JcC<$Q2gCRr;HTlqtpBhs7uTfs7cQerUg6aoCMtPs7$*YrpTmT!:BdP#4(R>l07EproPQhjQ#:[
+io/hRhqm2FgtUQ:g"=p.f$r3uda?IhcHa\YbK@rJa2\(0s+0urrI=]n+an]SAT29qG]e%EBl%We
+KR\AqH?XOQEG]N-:s#$*CN4RsHN8BYHhVp[Hh_p[H2`*iH22[c>$h29#Z4EFG]n4PFE7A"&oDGu
+ARo:\@U`b[CM@NtBkhF!rb;FLrf-u;r/(H/s+U`5I=c9TFaX%8rI4`qs*t*!rI4]pr-nTmrI4Eh
+qgSEl!.Olps*jop!.OKerI"Bg!.=cos*OlpH@#=4rHeHird=]nrHnWmHN&9aHN/?kHN&6kI.Vdc
+H3/G>HMr3eHN/?jI/A?hIfForJGjutJH(*#J:E(IJGauuKE$Q%KDpN(L&6W(L&Zo-L]*&)L\6K"
+LBNEiM26ubM>N/<GB.\@BkV'iApZmUqITY<rFbb9o4di1rFc+Aqdob;s'u%ipQ><8qNCoDplkW?
+!1!DFrfd>G0U7rkR[]k@USXlgXfen6ZaI9R]=kqn^qmk)`lH6GcHt%lg"bKEjQGjrnb)\RrVlQk
+rVZ]ms8)cm)9nP>M26h9G(#15J:)`gE,KQ<Ko1hLMhm,]KO]dnM2I4MNK0']OckomQ'Rf)R[]h<
+StD^NUSO`aW2ZetXfek3ZEppG[^`lZ]Y(tn^r!t,`Q$!?b0/#ScHstee'uq"f@\g2gtgfDi8EVT
+j5f=akNM0plKdg'mI'H3nF?MK!V>s_p&Facp\ssfq>U6gqu6NlrU^#>s+13Rs*t~>
+JcC<$Q2gCRr;HTlqtpBhs7uTfs7cQerUg6aoCMtPs7$*YrpTmT!:BdP#4(R>l07EproPTijQ#:[
+io/hRhqm2FgtUQ:g"=p.f$r3uda?IhcHa\YbK@rJa2V*O;ZKen;uKT61Fjq2/M9(B2)I$C1GqKa
+5<V.l4$#D\2`<469`@ff;uKPq;Gg=ir_rhp!E2np;s[EZ;uTbl;uK\p;uTbr;u9Jh;[P*/0J>(<
+1d=2g55mVM3]K)Z2Dm<J1Gf"c"ZA:u2E*Pk3!qrE9MJ2R91hcI9)_Be7lWP);H-Rnqc*Mm!E<"q
+;Z9Vm<;fbn;?9]qq,@;ms&B%trDEVprD`hsqc!Gms&K"ss&B%upeq2m;uT\j;uKVl;uT\g;Z]rt
+;Z0Pn<;fbp;Yj;l;X@<p<)lms<E3!s;cH^p<)lpt;c?Zo;u]hr;uTbr;u]bm;u9Pl;[?8u;H-Rn
+<)clp<;KVp<!ZE#;cHdu<E)rs;u]ho<W?#);c6Ll<)cjs<)rp!o3))q!a/]1rE9&%$s?D(;,9t\
+8kMN:,\6a_rau+AoP!i1oP"29rau%=rac%=r`]&#r`]2'r)s,*>4u,!>5_V(=9DW,<`T)ts&BV2
+='/X2?!guJ@UinZAnYjlrbDCI,A_47DfKi?Fa8=_J:r]8Ng#g#U8Y9$[(!TW]=bef\@8iOZMq-.
+Z5g2h=C5-2<E)jm<*)jl;,0h\:/+Yf<E<(!;c6Kf<+C]>M2I4MNK0']OckomQ'Rf)R[]h<StD^N
+USO`aW2ZetXfek3ZEppG[^`lZ]Y(tn^r!t,`Q$!?b0/#ScHstee'uq"f@\g2gtgfDi8EVTj5f=a
+kNM0plKdg'mI'H3nF?MK!V>s_p&Facp\ssfq>U6gqu6NlrU^#>s+13Rs*t~>
+JcC<$Q2gCRr;HWmqYU9gs7uTfs7cQerq6<`s7?6\s7$*YrpTmT!:BdP!UK%MklL#2roPTijQ#:[
+iS`YOhVI#CgY1B7f[na+e^W*tdF$=ecHXSVbK7iH`l5prRfStGpmD)Jrg*JI#b$a+Oc3nFR[3r6
+'9]H"Vl$5aT:M=8P)t^-a-_'uL&@#2OT1I.P5gaFP5:=<OSb+<Nq/2/N;\_:H?oL@!b,D?rh(("
+SsPb.P)kTZLP:G:K7\W5NK0$XNJrnrN<!qs]E,RPrO2^4#.Cn*OFDn=rg!PLrKdDI!1*MIrKdJM
+rL!PMrK[JNR.ZgFQN!6IQjT1IQ^F,+Q'R`$PkUC<PQ[27PE_:0PkpRJP)t`bNfT8!Nr"h:NWP3#
+O8b4@O8b7>Ns:W(N/NUQN;eh:NW>.>NrG";NW>(<NWP9%Nr"k;O8Y1?P5g[EP5gXROH5KcOHGcl
+PE_;sPa)04s-*SMQBhE5r0%/GPPpaGQ2d0NR/36NRfAiWSGeuZStGqRrgs4aTDkGTTDkG[TD+u]
+Tq\?YV>[4dV$s/pO+)M&Ec>l9G+*XRAc?<@BD?0:C%,m6C&)H@BDuN@AcH9@XST'rY5GI-Yd(I=
+Z*L\7Zi%03[C3O;\,Nl^\[oDb]YD;#`Q63GcdL@pg"YBAioT@gm-a?4nalGKq>1$gf`)heURdp>
+MmDE@R#m>[I!UI<WOBCNY-5(1YPt^%Y@<9DM2I7NNK9-_P*2&pQC!u,S"#t?T:qsRUnsueWN*#$
+Xfnt6Za@-K\%0)^]Y;.r_SX71`lQ6DbKS5Vd*^:jeCE.%f\5'7h;-uHi8N_VjQ5Oekiq?slg4!*
+mdKW6nc&([oCW%Ts7ZKerqQNhrqcQirqu`noDX=@JcDqRJ,~>
+JcC<$Q2gCRr;HWmqYU9gs7uTfs7cQerq6<`s7?6\s7$*YrpTmT!:BdP!UK%MklL#2roPTijQ#:[
+iS`YOhVI#CgY1B7f[na+e^W*tdF$=ecHXSVbK7iH`l5pqJcLAsJH(,pINNQC@V]XTGB%P8C27[<
+JUMokH?XINDJa3*Kp@"#DKY#eq0_d\pj2UYrd"Qiqfio^>$t]G;GL#4G^":RF)l5;D/<ltA7T9N
+@K:-ACAqrIC]8&K?iH&eN/EMlM>rA1L'DdED0'lLIf"WlIfFotJGalrJ,b$!J,FcoIJnWhJ,=]o
+J,Om$IsufpI=D*B!.OHd!doEDoR-afHiA?gHN8BjHiJEjHiJKmIJnQkHhMdaHiA?jHNSYBH[PU8
+s*FWj!.=cms*FZk!IB+kI/89gIfForJGam#J:E'!J:IKIrIG!$KDpK&KDpQ&L&?])K`Qp`qhY*(
+on`F!!/UH-pkfE*EH#f1BOtafH<^>Zrau.Bph9M<n7qf6q.T_>rau(>s'u+kpQ>97nWWm8!1!DF
+rfd>G0pS&lR@Bb>TqeK`WiWA-ZF%$L\\#Ph^VI\%`5]m@bg+Vbf@es:ioK:hn+?AMr;HWjrrN,t
+rVZ]m+o;*5r;HWdcAmd;L4=K1Y_IUQH#dh@EI`k)NfApPLP:HWKOT^nM2I7NNK9-_P*2&pQC!u,
+S"#t?T:qsRUnsueWN*#$Xfnt6Za@-K\%0)^]Y;.r_SX71`lQ6DbKS5Vd*^:jeCE.%f\5'7h;-uH
+i8N_VjQ5Oekiq?slg4!*mdKW6nc&([oCW%Ts7ZKerqQNhrqcQirqu`noDX=@JcDqRJ,~>
+JcC<$Q2gCRr;HWmqYU9gs7uTfs7cQerq6<`s7?6\s7$*YrpTmT!:BdP!UK%MklL#2roPTijQ#:[
+iS`YOhVI#CgY1B7f[na+e^W*tdF$=ecHXSVbK7iH`l5pi;u]hp;uBN8/1N)&/hf7C2)6pD1dXMo
+5<_7o4$#D\2`<rm78H]Xq,./i!)rbmrDW&\qc!Jnnl,Nes&8emr)47]/2/_32D[-R4Ztnh4?GP^
+2`3Mm1^c/q1,:dJ2`<NQ3'.$u#rb(A9MJ2R91hhS8I7pO85E)];c6OmrD`VlrDNSms&B"us&Aqq
+rDE\r<E/cm!`W0!r)*MnrDi\mqc!Por_rnu<:s/k;H$Kh;uKVl;u]\p;Z0Mo;Yj>k;ZB\p<;fbo
+;Z9Vo;?Bco;Z9Sp<:s/l<)Z^qqc*SorD`esqG[Sr<)cdprD`eqs&/_mqc*Jl#Z=Ms<)cdq<)rco
+qGmPps&8qs!*/tsr_ierqGe/-;c6Ll;cHas<)cn"='/U.>$CW&s'#A(rEB2's&]7tr_Wkr91_`D
+5:uhFrau.Bph9M<n7qf6q.T_>rau(>s'u+5pKRW#rEB;+>PVIr=TDY(=oVV'<rl?%r`&ks0NV@[
+>?kH??t!MSA7fFdBPD0qBkhEuCM[j*DfKi?G'SF`J:r]8OHc3,Vl[,.[C?+F"h;%L['R(;Z2V$N
+ZaI9PQ#p/0<E)pr>%po2:/=VZ9hnSb<EWC&<DlXlpf(^XM2@+KN/`mZOckllQ'Rc(R@B\:StD^M
+USO`aVl?\sXf\e2Z*UgF[^WfY]=bkm^r!t,`Q$!?b0/#RcHstee'uq!f@\g2gtgfDi8ESSj5f=a
+kNM0plKdg'mI'H3nF?MK!V>s_p&Facp\ssfq>U6gqu6NlrU^#>s+13Rs*t~>
+JcC<$Q2gCRrVc]mqYU<hrqZNfrqHHdrq6<`s7?6\!qGdLrpKmUmJcH2lg!d"l0.<nk2tddj5].Y
+iS`YOhVI#CgY1B7f[n^)eC;sqdEp4bcHXPUb/q`F`l5lcS!oe6q3_/Js-ESJ+JY$OPDb9iS=,Lq
+OcQB@WhlMdTqIj?QB@5hQ^MrAK9uOtrfI)@qi^uC!0[>FrK@2Es-!5Bs-!8ArfHo9rf6Q/s,?o9
+-@()kJ72kkU7\$LSsl%2P)tW[LPUY<KS"f7O,]0ZNf8sVN/ip/rk&9B\,Ec7Zj*sHN1,6MM#EV>
+Q2HsIPlR-IPm*J?QBml(rL!PMrg!VPR$di=!1*8Dop>rMQBml&Pa)*0!0mJHpQYZ@rfm;Drf[;C
+s,R2BO8P%7Ns1Q'NfT9`rf@&?rf75BN/W[RN;eh9NrP.CNfB$WNW+q=O,j1"rfI/@!0I2@rf@5E
+PEM(-P5g[EOT1IGOcu#oq3;)IPEV8tqNUuCqih2JQ^F08R/rbGrgX(]St;SLT`:YaT)YD_T)##W
+T)PAUT`:\eU84UaV>m@fV#[=jUC*'2I<p$UDK'`eM>h,dBDQ<?C&;Z2C\qlFC&2NBBDuNAAc8b,
+Y5PO*Yd(J3ZMh-.[/[N6[e@3/\0AJp]=bkn_SsR<b082[e^rL/hVdDUkN_F$n+#u?pA"I\rR_&e
+_RlS;SX>;"WlUWiP)4a:I#b#/[C`ZGYH@c+qQF=`M2I4MNK0']P*2&pQ'[l+S"#t?T:hmPUnsrd
+W2co"Xfnt6Za7'J\%0)^]Y2(q_8=.0`lH0CbKS5VcdC.heCE.%f\5'6h;-uHi8N_VjQ5Oekiq?s
+lg4!*mdKW6nc&(boCV\Jp%J+Rp\ssfq>U6gqu6NlrU^#>s+13Rs*t~>
+JcC<$Q2gCRrVc]mqYU<hrqZNfrqHHdrq6<`s7?6\!qGdLrpKmUmJcH-lg!d"l0.<nk2tddj5].Y
+iS`YOhVI#CgY1B7f[n^)eC;sqdEp4bcHXPUb/q`F`l5mpJcLAtJGt&pINWlM@Vo^hGB@b=Ao2@5
+JUi/oH$4CSE,KN/Dg$G?DKC6gHiJKnHi/9]Hh_p[H2`*iH2Mn6>$kZG;Gg59G]n7PFE2><DJO!!
+An5F]@:EqdBk_<sBkhBuBkg`KNWP/sMZ/J4L]<)69lYMtF*E(^q1&<k!.Xuu$%IDRIXZcrJ:N.I
+If4]nIfFltIeeKkIf=ipJ,k)tIf+ToIf+ToIf+TsIXQZpIe%pdI/\EmH[Pg>rd+?ds*Xip!do?A
+rd=]l"aYH>H?sr8HN&9iHN&6lI!bj?r-JHjHiA?jHiAEmHiJEjHNSYDI!kj?s*arrqgSBk!.arr
+!e>cMq1/QuKDpK&KDgK&L%pE&L\QZ*L[p8uLB*/.M>rD3M>2u.M[FlPE,KE(AS#J"C&V`DBDQ<?
+C&;Z2C\qlFC&2NBBDuNAAbhJaP4Fh.Pl?mFPVADiR@9\<TVA6ZW2cr%Yd1XE\[f>c]tV:u_SjI7
+b0A5ZeCWC/hW!V\md]uFqYgEhrrN,trVZ]m,5V36r;HWos3I.#M26n;G(#47JU;cgE,BK;Ko1hM
+N/<:Dp4Qk1M2I4MNK0']P*2&pQ'[l+S"#t?T:hmPUnsrdW2co"Xfnt6Za7'J\%0)^]Y2(q_8=.0
+`lH0CbKS5VcdC.heCE.%f\5'6h;-uHi8N_VjQ5Oekiq?slg4!*mdKW6nc&(boCV\Jp%J+Rp\ssf
+q>U6gqu6NlrU^#>s+13Rs*t~>
+JcC<$Q2gCRrVc]mqYU<hrqZNfrqHHdrq6<`s7?6\!qGdLrpKmUmJcH-lg!d"l0.<nk2tddj5].Y
+iS`YOhVI#CgY1B7f[n^)eC;sqdEp4bcHXPUb/q`F`l5mi;u]hp;uBN90.J>(/M9%A2)?m@1I+8l
+5!;%j4?GV`2`<KW85;rX<;9;k;Gm6f!)r/\qc!Jnnl,Nes&8emrDOjj0/#%;1c.E[5!D(k4#o;\
+2E*HM1GggB1,q9R2E!KQ3W:u=2a@77!)*;`r(.&C4@N%C;uKSs;cH[p<;BJl;@-9$;c?Xp<E3!t
+rDWYms&B%ur_iepr)<Vp!)rho!*&qt!*&bm!E<"m;uoosr)3\s;c?Zh;uBPn;Zp&u;Gg<i;uT\k
+;u]bq;u]eu;c6Nm;u]bq;u]`!;,U=j;,[Bls&Aem!E<"r;uouur_ierr_j&$;cHas<)Z`o<<#ns
+<<#nq<;oer;YsDl<;f_q<;ohr;$Kru;c6Ro<W#er<W#hr<Us,a<W,hs<)ros"BJT*=]t],pK@N"
+rE9/(r`T,#rD<bq9M.oG5;iFPrb)(@rFu.DlYHB4rFu+Arb)4BrFPb.s'#A*!Er_'>4u,!=p.u3
+=]ef*<ruE&<W5tt<>/G9=^#'8?!^oI@q0%\AnPdjBkdN\(i*r)DK'T9FEVqVIXm*,N09O!UT(K'
+ZaThBs0i';Za0G4'sb3S\$rec>?t<1<Dudl;cZ[j:JFU`9aF^!;ccpu;c?Qf<+1T>MMmFQNfT9b
+P*D5sQ^F21S"6.CTV8*UV5C/hWiN5'YHY:<ZaI6N\[oDc]t_A!_SjF5a2lEHbg"GZdF$Fme^i@)
+g=k<;h;@/KiT&tZjlYail07L!m-O--n*fc9rpg?do^qhLp@e7TrqQNhrqcQirqu`noDX=@JcDqR
+J,~>
+JcC<$Q2gCRrVc]mqYU<hrqZNfs7cQerUp3_!;$0[#P%<Qn*f]4mJcGQlg"K6!U/_Gjt>cVj5].X
+i8EMLh;-l@g=k64f@SU(eC2jndEp4bc-4ARaiMNB`Pf[2S!oe6RJN<LQi**oYF()[NJD5;Q^!Po
+O_1\qWM?2^SXl+4P)a+CaMiFUO-#HaO8b7<Oo:IBP5pjGPQ-gEP5pjHPQ$gHPQ-gBOoLO<O8b11
+N<"q:N>$MfJUr>X?D4$aTq.[@Q'7AiMM_=c%u#[gNK0!ZNK&sYN/`jWAH'4F\[T#V[^Q1B#.7d+
+]mY]prKdGJrKdGJ!1*MI!1*PLrL!PM!1*VNs-WePrg*8EoU,TC!1!MIs-*JIs-*JI!1!AErfd>G
+rfdAHs-*GF"d+k,OH>P&Nqn_;NK0(uO91K'O8Y.@NfF!rrf-r<rK$r<!0-r;r/^f<s,[&=s,d>F
+Oo:ICOT^c.P*2%*PmNbAQ'@JrPa7T"r072Eqih2JQC+'6R/rbGrgX%]T:bnOs.B7]qOdYVrh&qX
+"JMQaUSIda!2TFe!2TUh%]#q`IslT`Ec,i>RY,Zoqe5qBrG(2)rG):Fqe6"Brau1A!3Q%!riZC-
+Z*F85rNlF/!O]B0\,Ef]\[oDb^;.S'`lZEIc-Okhf@es9iT'%`lg=-/nac>Gq"jmdeGgA_Un+3D
+N3W/XQB@5[I!UC3Wj]OQY-5+2riZ+$@>KbsMi<UTO-#KePEhE!R$jD4S=Z=FTq\?YVPgAmWiW>*
+Yd(L?[C3QT\\#Mf^VI\&_o9X9aN;WLc-FY_dF6Uqf%8R.g=tH>hVd>Nj5]4^k3(sml0@U$m-X60
+n*olHnd+jZo_%nNp@n=\q#C0hqY^6ir;HTcrdk*#s0)HQ~>
+JcC<$Q2gCRrVc]mqYU<hrqZNfs7cQerUp3_!;$0[#P%<Qn*f]4mJcGQlg"K6!U/_GjsfEQj5].X
+i8EMLh;-l@g=k64f@SU(eC2jndEp4bc-4ARaiMNB`Pf[2rdt0$qLJNor-fc?E+Dm\AQ<ejDJF$*
+<IoXLH[0jXFE)28C/T8DSSW:kja6rRs*O]lnU(%Wom-O_!."Qg!*T8.+\ts]G^":QFE)8<D/*`t
+A7K.\@Ua(fC27R"C2@X"BkgcLNWkB!M2I.HreC]49QuJ6FF*q8q1&<k!e5`Nq1&Bo"FklLIt%?E
+rI+`rrdOZmrdOirqg\ZrrdOQhs*jrqrI4cr!.OHd"FPQBH@,X=s*OclqKi9kH[Pd?"+5HAHi8<n
+H[9u:H2r<jHMVsgHMr3hI/J?kHM`'eI/SBoI!^6gqgJ9hr."]p!IoXsIg(@PIt3*$r.=p#s+1?*
+JqJaSL%pB&L\?N(M=l]$L]<2/M>i;2M>)o+M[Y&SE,KE(AS#P$AQiaDB`2ZDC>Nb)CAhlDB`D`E
+B)cH?Onb+2PP::AQ2[$IPPp_#Q'[o-S=Q=HUSOccWN3/*ZF%'M\\#Pg^;.S%`5Tg@c-Fbef@o$;
+io]Rqo_/+Xr;QQm"oeJur;6BjqZ$Epr;HWorVmc(cAd^:LOXW3^5%)_H#dh@EIN_'O-#6UL\?C0
+Ll$tHN/WdXOHG]iQ'IZ&R@9V8St;UKU84T^Vl6VqXKAY0Z*L^D[^WfX]=bhl^qmn*`Q#s>aihoQ
+cHjnce'uq!f@\g2gYL]Bi8ESSj5f=akNM0plKdg'mI'H3nF?MK#kR]\p%A%Pp\4[^s7uZjr;6Kk
+rVc?eJcC<$YQ'+~>
+JcC<$Q2gCRrVc]mqYU<hrqZNfs7cQerUp3_!;$0[#P%<Qn*f]4mJcGQlg"K6!U/_GjsfEQj5].X
+i8EMLh;-l@g=k64f@SU(eC2jndEp4bc-4ARaiMNB`Pf[2pJ_)krDWVl'0%Nm.kWA+3&WTJ1c.-X
+5X7Ls4oRMN3&W]I5>FsL:K(.hp/1-Rr_rYkr_r\nnl,Ne!)r_ls&0:U0/,+71c.?Z5!:t+49%8L
+2E*KM1G^dB1,h0P2`CUo"$&>#5Q"1V8kVeS8HUA)92>:\r_ierqGRMr;c6Llr)EYqs&9%u<)``n
+"B8B#;cEZnq,@;k!E2ts<VBAe<!#ut<;ohn<:s2g;ZBZ&<)ZXk;H-Uo;c6Nh;ZTcprDWkt;Gg?h
+;uTVt;H$Fj;cEWos&/nsr)<Pns&B%urDWYos&8nrr_rhrrDW_q!)rhqpJ_&jrDN\qr_rhp#?+T#
+;H$Oo<W,ks<Vo_q<W,ks<VKJf<<?,u;u9Mr<E<.&r`\tt!*]5%pfRQ!$rTr":JXYV9LV0#2.uf"
+rFu4FhJ<()rFu.Bs(D=Cs(1k-pKI8ns&oP.>$5!1r`9/%<E9#t'ie:9=BSg3>[1TA?t!MSAS#Id
+B4u#WC):Z%Ci432EclPMH[^O!MNF*mTr4urZF'S=#dq%GZE^[=Z*F83!j]2@rjEiTZB90/<`N.!
+;cmp7:Jak_9heG_<E<4$<)lgn;YX1!Ll$tHN/WdXOHG]iQ'IZ&R@9V8St;UKU84T^Vl6VqXKAY0
+Z*L^D[^WfX]=bhl^qmn*`Q#s>aihoQcHjnce'uq!f@\g2gYL]Bi8ESSj5f=akNM0plKdg'mI'H3
+nF?MK#kR]\p%A%Pp\4[^s7uZjr;6KkrVc?eJcC<$YQ'+~>
+JcC<$PlL=RrVc]mqYU<hrqZNfs7cQerUp3_!;$3\s7$*YrpTmT!:BdP!UK%Mklp;6k2tddro5He
+iS`YOhVI#CgY1B7f[n^)eC;sqdEp4bcHOJTb/hZE`Pod4_OI!^RJE6KQiEBNPp)QWKTV%HUR7@/
+P*)!0XJr%lUS4<KQBIAmZ-8Y]I>*fGqiL];rf[8Erfm5BrfdDHqih/GP*5g,rfR>FOHB3ts,QT.
+*-d!bJ:M!4US4?QStDI9P`^ubLkUM:L4k/=O,j'rs,I(irk&EG\@8oU[f3W<[>Cg)Its0aQ33D:
+Pa2-3qiq/Ir0R>KrKdYQQ^=),rKmMLp6YE=$C@'FQBd]"Q^*f!r0.2HpltfBpQYZ@!KrTCO91K'
+Nqn_;NfT8"OT1=@O8b4AO,j4!!0$o:rf6r<pl><6rfI/@qN1]=rfR8FrK7)B!0mAGs-E\Mrfd>I
+rg!GH!0d;E!L8uLR/WKRRf/WTR[a;H!1j(\rLa:eTV.pLrgrqXrgs"Z!hc6\r1O(`"JVZdUnmRX
+s.o[ks/$0gJ:)WbEGTW>U4cPFB`;`FCA2N<D#J5ED"qfECAqrFB`;WEB)/V/YQ(g,Z2M!-Zhq*1
+[C5e<rO=,`]">Sg^qmt/ai_fOcdC4mf@o$;ioK7dm-X60nalGIq>1!eeGgN+\"odiS;NT5`g`$P
+LjjW!MP7>`]<\TCXfJV-q6+1^M2I7NNK9-_P*;,qQC+&.S"-%@T:r!SUnsufWN*&%Y->.9Za@0M
+\@K5a]t_=u_Sa@3a2lBGbK\>YdF$Fme^i@)g"P3:h;7)JiSrnYjlYail07L!m-O--n*fc9rpg?d
+o^qhLp@e7TrqQNhrqcQirqu`noDX=@JcDqRJ,~>
+JcC<$PlL=RrVc]mqYU<hrqZNfs7cQerUp3_!;$3\s7$*YrpTmT!:BdP!UK%Mklp;6k2tddro5Bc
+iS`YOhVI#CgY1B7f[n^)eC;sqdEp4bcHOJTb/hZE`Pod4_LdC<JbsurJ,Fa2EG8ltA7p.+Dej3,
+DM!@eH[9s\F`_U%D$>Z]Hu!YBj*U`Prd4Tkqg8<iqKr$aom-O_!dT#orEob):O@A2rcScmE,]W0
+BkM!eA7]4YCM`ub#A\'iCMIU"=T4<^NJ`VmM>i87L1l%'E--F)IeS?kIKG"LJGOcnJGjs!IXQYC
+IfFosIenQmIf=inJ-(4LIeJ3iIf=a"IXQWnIXckGIK+ckIK+ZqH[>[<rd=`m!.+Nhs*OioI/\Qo
+I/eKmHiAEmHhVjZHiAEjHiJEhHi8<nI=-GAHiJKiIJJ?iJ,OiqJGt&uJ-(:PJGb#uK)gT'K*$XW
+K_pK$LAco*M#)u-M#W>.M#)o+M#E21L]E;,MY`5=IrK@EC1h*iBROM^rFl1ErbD1CpMBeFp2'M>
+rG)=Gr+Q(B!+u4mpQG04o9B6<rKK(&Q^F53SY2[OUo()iWiWA-ZaI6O\\#Mf^;.V'`5]pAc-Ohf
+f@o$;jQQ%&p%\C]rVl`ps8N&ss8;oo!;cZk!rW#rrVmo;rR%$uMhm.AGC>@8J9cNcDf'H9Jr>SJ
+Mhm.CKD1%,Ll%"JN/`mZOckomQ'Rf)R[]h<StD^NUSO`aW2ZeuXfen4ZEppH\%&u\]Y2(p_8=+/
+`Q-'AbKJ/UcdC.heCE.%f\,!5h;-rGi8N\UjQ5Oekiq?slg4!*mdKW6nc&(boCV\Jp%J+Rp\ssf
+q>U6gqu6NlrU^#>s+13Rs*t~>
+JcC<$PlL=RrVc]mqYU<hrqZNfs7cQerUp3_!;$3\s7$*YrpTmT!:BdP!UK%Mklp;6k2tddro5<a
+iS`YOhVI#CgY1B7f[n^)eC;sqdEp4bcHOJTb/hZE`Pod4_XUS&;BIJ?.5*2'3Ar`N1c$sS69m^u
+4Zkef3ArcS6:s^D:fI<jpJL9Tqc!Air_rYmo2GWf!)r_l%P9=f0JPFA5<h:p4?GYdrAY$>1bppE
+1GUle3!VB%3B0&Z3'R=8"&2E]9)M6b8hW>(:f:6b;YsAp<)Z[nr)ESorDWhs;H!Bjr_iSkrDE_r
+<E3#k;u0Gn;uTbo;uK\g;uT\p<!63";GpHm<<#ks;Ya5k;Z0Sp;u]\p;Z0N#<)Z[l;H$Ij;cETn
+!)rkr!`N&sr`&hr!*&qrr)EMkr`&kqs&APfr`&hpr`&kqr`&nqrDWbqr_rktr)E\rr_rktqGd,f
+!*&qrr`&kss&K,%r`\tts'#G*"'A].=o2>!=oVY5;Gg=g:J4>S76iOSrFl1ErbD1CpMBeFp2'M>
+rG)=Gr+Q(B!+u16!*];)pKI8ns&oP.>$5!1r`:(?<E3!u<)lt"=BSg3>[1TA?XR;PA7T7`B4tsm
+r+[!_Ci"!-E-$/FG^FplLQ%FbT;8HhZ*XD:"LPM@Z*F,/'X>!P[^NTNZ`pTP>$P-1=B&0r;-*Wk
+$qsDk9iFtj=B/C$;G[$c@#0YsN/WaWO-,ThPa.Q%R$sM7SXuIIU8+N\Vl6SpXKAY0Yd1UB[^WcW
+]=bhl^VRe)`Pom=aihlPcHjnce'uq!f@\d1gYL]Bi8ESRj5f=akNM0plKdg'mI'H3nF?MK#kR]\
+p%A%Pp\4[^s7uZjr;6KkrVc?eJcC<$YQ'+~>
+JcC<$PlL=RrVc]mqYU<hrqZNfs7cQerUg6aoCMtPs7$*YrpL6_mHs9,lg!d"l0.=0jtGiWj5].X
+i8EMLh;-l@g=k64f@SU(eC2jndEp1ac-4ARaiMNB`Pf[2_4-m^R@3o=rg3VMs-4t+ObfEaLnL<-
+P)PKaBrnG8W2-)YS=,b.Nd6tZFF&S&P*(lgOcY\%OoCOCPPg[FPQ-jIPPgXFQ26^HPEM.,OoUXD
+OSFn:Nq//0HN&I2J7)Z[Tq@mIT:(t0P`Li_LPLP8KS,9`O8k7?N;\_9B)]FH]=>>Y\$l:C#doH.
+SUuQ]Q^@Z:"I549Q'M64qj%&FrL!GJs-WbOrg*8EoU,TD"I>==Q^.H4s-<JG"-o+8PPUODQ2QsI
+P6$i/r/_&BOH5HaqN(Q9!KW9>OT1@ANr4n8Nr+n;NW>.<NrP1=OT1@AOo1=?Oo1CBOT^i0P*2%*
+Pm*J=P`q>rqN^f>s-<YOrg<\Q!1NkSs-itWs-s1_SXuGOT`:\cTDkGUTDtJ_TDP;]UAgefTq\9V
+r1s1cs/,Rfr2'jiJp_ieE,9N=WeFFOC&VlDC]&#ED=qfBD>\5HC]8)KC&DZEBD\k3YQ(g,Z2M!-
+Zhq*1[C5e<rO=2b]">Sg^qmt/ai_fOcdC4lf@es9iT'%`lKms,nF?,Cp\F[`r;P.E)Q9I&Vj!.G
+l`lY9OFhk-K:/aI]"bGOZE(13poe7cMMmFQNfT9bP*;/rQ^F21S"6.CTV8-VV5L5jWiN8(YHY:<
+['d?P\[oGd^;%J#_o0O7aN;TJc-FY^dF-Oof%8R-g=tE=hV[8MioB+]k2tjkl0@U$m-X60n*ol;
+o()DEo`"Lbp@n=\q#C0hqY^6ir;HTcrdk*#s0)HQ~>
+JcC<$PlL=RrVc]mqYU<hrqZNfs7cQerUg6aoCMtPs7$*YrpL6_mHs9,lg!d"l0.=0jsoKRj5].X
+i8EMLh;-l@g=k64f@SU(eC2jndEp1ac-4ARaiMNB`Pf[2_>]&aJc(&uJ,Fa;GA:]/BOuF3EGT<)
+D-):=I=6EcG'%_CDJNU&H>%/:l?iPYqg86grd4Tkqg8<iqKr$aom-R`!I7oJ?m/BDI<g$ZF`qhF
+E,TQ.C1_$e@q&n^Chmj%Chd^#C2%Hbrf-u<reg`4reCi8CQa9gFaegiIX^m<rdaforIFlss*t-!
+IJnWpJ,XonJ,XorJ,"NpIt%0@rdOips*jrqrI+ouIXZcrIf+ToIf=cqI/\KjHj"eDH[C/>HiAEj
+I04kDH@,X=s*ONes*F`lrd+Wmrd+ZlHi8?iHiJEiHi8?lIJeHnI=1p?q0r<mqgJTrJ:RTJ"+YrQ
+Jc(-!K)gT&K*$XXK`$Q%LAQc+M#)u+L]E;.M#E,.M#)u.L]iQlMMmDjMYN);JT5XIC1_$hB7aee
+rb;@HqJ6"Fq/,eBq/-%GqJ6(Fs(VCEs(D(hoons2rfd;F16n2nR[ftATq\?[Vl?YrXfo%;[^N]V
+]=bhl^r""-a2lEJcdC7og>(ZKlL4?<q>1$gr;Zfqs8;oorqcWk"8r,rrr)j>rr)clqVf\YMhd7?
+HB>FkH[C$ZDJaHEM2[IWMM?tAL%g73M2I4MNK0']P*2#oQ'[l+S"#t?T:hmQUnsueWN*#$Xfnt6
+Za@-K\@K2`]Y;.r_Sa=2a2lBFbK\>Yd*^:keCN7(g"P39h;7&IiSrnYjlY^gl07L!m-O--n*fc9
+nac8Bo^r.U!quB_rqQNhrqcQirqu`noDX=@JcDqRJ,~>
+JcC<$PlL=RrVc]mqYU<hrqZNfs7cQerUg6aoCMtPs7$*YrpL6_mHs9,lg!d"l0.=0jsoKRj5].X
+i8EMLh;-l@g=k64f@SU(eC2jndEp1ac-4ARaiMNB`Pf[2_=CP&;BR\D.5NP-3ArfQ0JbOD69me"
+5!;"i4#f/X/jDm%;,:'e;Ya2U;Yj>h;Z9Vk<:j,f;ufkp;CX:P0JP:@1dF;h4Zkeg3]T2[3Ar`N
+1c$pA2)mQU3&`fW3&iiV4\\UD:&[fc8IJ'\8kLs-;,C+f;cE?er)<Vp!E)kn<;fhp<<#kn;uT\k
+;uKSr<)lptoi(Q`qc!Gmr_rhrqGRDm;uT_t;c6Ql<!Q?$;c?Xo;c<Tnr)<_r;GmBks&9A);,L7j
+;,U=k<)cfq;ufqo<;ons<<#nq<;BJm<!?2u;c?Xpo2>WgqG[DnrDW_qs&8kq!)rkr!*/nq!*8em
+r`/qsqGmDk#ZOf(<`W:)>$CT%s'#G*r`K2'r)il"s'#G*$WBo":/=MT9L_9%.fO/]CAM`DD#%r@
+DY\/ID#.rHCB&#GB`D]G>?^r/pKI8nrEB5(!*K5%"'/E%<;ont<Y\\=>$G6:?!^lG@:EbXAS,Rf
+BPD3rrb3<dCM[j)DfB`=G'SIcK8PbVS=uj^YHkOC[C!7<YQ:r3ql_EPZF%'K[C!9EY,eLtJ9"an
+='/F!=CY<+:f0t`:/=Yb<*!%!<DudmpJYX[MMmFQNfT9bP*;/rQ^F21S"6.CTV8-VV5L5jWiN8(
+YHY:<['d?P\[oGd^;%J#_o0O7aN;TJc-FY^dF-Oof%8R-g=tE=hV[8MioB+]k2tjkl0@U$m-X60
+n*ol;o()DEo`"Lbp@n=\q#C0hqY^6ir;HTcrdk*#s0)HQ~>
+JcC<$PlL=RrVc]mqYU<hrqZNfs7cQerUg6aoCMtP!qGdLrpKmUmJcGQlg"K61?do`k2k^cj5].X
+i8EMLh;-l@g=k64f@JL%eC2jnd*L"_bfe2OaN2B?`P]R0^qZA-rgE\OrKmPMrfnRoM//93BUkKV
+OH>WfX0/CuUnXNOR?a)#P3^r#H%M(UP4t+<P5^[APR!J<Pa.JuPa)04qNUuCqiV&DOHGY"O8k74
+N<+EOrdb/[?ui"@TEq*WQ'7DmO,AenL&Zc6NK9*ZOH#3XNfB$YNr?U"\[T#V[^EKL[CXS,K8'5i
+s-E\MrfdDJqNh&E!1*MKrL!MLs-W\M!1*8DoU,TD(7(;RQ'@N!Q'R]$Q'ISuQ'@MuPa%Aqqiq)F
+rfmGH"-Se0Ont18O8Y1?O8G%=Nr=t;NWP9%Nr4t;NW>.=NrP1;OT1IAOT(C>P5g[DOo^c2rK[AJ
+!gT"6pm(T<"-o1=RJrQRRJE<OS,Ji[SXuFFT`1VbT`1PTT)bP`U&UbeTq\:\T`Lm_qkX%as/#gn
+VYm:cV@Ac@I!BjTD/jd'G#_XZqeQ.Hr,(M4r,)FLqJ6+Grb;=EriZ:)s0)L.rNcF/qm6C3[e@3/
+\0nhu]=Ybl_8F:6b0/&UdF6Xtf\50=ioK7dm-O0/nFH2Dp\=U^rVk7F)of@_URn9=Q*A5sNK]3K
+H%1sNXgYmNYHG%/Y5#4#M.;F%N/is\OckomQ'[l+R[]h=StMdOUnsrdW2co"Xfnt6Za7'J\@K2`
+]Y;.r_SX71`lQ9EbKS8Xd*^:keCN7(g"P39h;7&IiSrnYjlY^gl07L!m-O--n*fc9nac8Bo^r.U
+!quB_rqQKgs8)Zjrqu`noDX=@JcDqRJ,~>
+JcC<$PlL=RrVc]mqYU<hrqZNfs7cQerUg6aoCMtP!qGdLrpKmUmJcGQlg"K61?do`k2k^cj5].X
+i8EMLh;-l@g=k64f@JL%eC2jnd*L"_bfe2OaN2B?`P]R0^qYJQqgn`srdXip+*(pmCh?XhEGoW/
+D/=cSI=-?cGB7eCDJa-uWIeo+H0TbUHineEH[GU:rHnNkqg8<iqKr$aom%9u?!1QD?rKm,H$FOU
+F`VP@Df'<)BDuEP@q'1hC2.R#C27X$Bl%RErf.#;MZ/G<Lkgb?Lm;aqFo6^hIf4`rJGXfsJ:IKI
+q1&?n"FkrPIsq9ErI4frqLAKnrdXZms*k#tqL/<ks*aorrI+Kjs*suqrdOip#(1iGH[L3fqgABi
+!IB+lI/eWpHi\S?rd+]oH[GO6rd4Zk!.4Zls*=Zlrd=?brd=Wlrd=QjrI4TmqL8HordOlsrdY'$
+JqO&S!/(0%s+C?)r.Y$&r.jm"re^Q/reLN0qhb?1re^W3s,-o8MuJV0MuJYEJ8fIFCM76jBS0e`
+95=?>rG;CKjDOm4rbVFHs(_OIrFl"ip65'3rfd;F16n2nR[]n@Tq\?[Vl6SqXKSk7['mHR]">Vh
+^VRe)`Q$!Ac-Xkff\>9CkjJ$7q"agbr;H]prVQ`oqYL0fs82orrr)j@rr)clqt^!4R[9"iL5:)'
+MjJs>I!'CGDg?qlNK9$ULk^WXK`?m=MN!LSO-#KePE_?!R$jD4S=Z=FTq\?ZVPgAmX/rG,Yd(O@
+[C3TU]"G\i^VI_'`5Ta;ai_fNcHjkbdaZdtf@\d1gYCWAhr*JQj5f=ak3)!nlKdg'mI'H3nF?&>
+o(2MGrq-?dp\4[^rqZTjr;6KkrVc?eJcC<$YQ'+~>
+JcC<$PlL=RrVc]mqYU<hrqZNfs7cQerUg6aoCMtP!qGdLrpKmUmJcGQlg"K60^.]^k2k^cj5].X
+i8EMLh;-l@g=k64f@JL%eC2jnd*L"_bfe2OaN2B?`P]R0^q]P@qGIhU.4d,(0fM!J1,CaC6:*s9
+4pj>43&ifNDGs,':\doc;<^s[;c6Nm;u0Dk;u0Jc;uKYq;uTZ#/hA\20fCjI5Q3hV3]oJ`3&`fT
+1c$pF1GUid3!_H&3B9&X3B0b49`I`o8kDTF8kMZ:6;UQX;#O>c;YX2f<;fhr;uooqq,78kqG[;i
+!`N)uoMbH_qc!Dlr_rhrq,@5k!`N&uq,I>ls&/hps&B"ss&/bn#ZXf%;GpFk;,dEms&/qt<Vo_r
+<E/osq,I/gr`&kpr_ieprDWYorDN\qoMbchr_iu"<E)mq<;T\q<<#tl<<#tt<;KSp<;]\p<<#r$
+<``F->4u+u>5h\)=T;M)=BYW*qH<f"%TcS+;,0q]9MIr@3[ZRqqeQ.Hr,(M4r,)FLqJ6+Grb;=E
+rEK&#oi_5ss&oA(s&T2$qGmPs$WpS:>[1Q@?XR;OAH$-AAnPfTC&Mc`CMdp+E,p#DH%(="NKfm)
+V5^T#ZF$sDZ2Lj,Ycmr,'sFmJ['d9IZEUL4WMQ;[E*?OL=&r<";%cr,:esh]9MS;\<)d""<E)mn
+;YX2jM.;F%N/is\OckomQ'[l+R[]h=StMdOUnsrdW2co"Xfnt6Za7'J\@K2`]Y;.r_SX71`lQ9E
+bKS8Xd*^:keCN7(g"P39h;7&IiSrnYjlY^gl07L!m-O--n*fc9nac8Bo^r.U!quB_rqQKgs8)Zj
+rqu`noDX=@JcDqRJ,~>
+JcC<$PlL=RrVc]mqYU<hrqZNfs7cQerq6<`s7?6\#P%<Qn*f]4mJcH2lg!a!kih3lk2k[aj5T%U
+i8<DIh;$c=g=b-1f@JL%e'cXkcd'h\bfe/NaN)<>`5BI.^V?8,rg<kUR@'B?Qi<<NPolWZJWknF
+Ssl"-MN<q'XfA4pTV7mFQ^*\ns1=VAI>.Q]!0R8DrfR/Bs-*;Dr078JqN_&E!1!PJrfd5BrfI2B
+q2bN8p5L5DG(G3r@:!37TUqmKS=>b,PE(NXKnY26K7f2ENKB-YN;eh:Nr?U"\[T#V[^ENM[B?`^
+KnfJkrg!PLrfdDJqNh)Fs-ESLq3V/Krg<SL!1*5Cop>cHR/E9TQB[Z$QBmm:Q3!88rKRJLPEM.-
+Pl-dHPl?mFOoUX@O9(E(rK$l<!frG*r/gr>!fi8"rf6i9pl>B8r/gr@!g8Y,qN:c?s,m8CrfdDJ
+r0I>Hrg*AFqNV#F"dYRER$a<;Rf8fUSH#/[T)YJ`T`^s[St>bMqk3q^#G@caU8"?UUALbZV>mFk
+V>-qeV[S];HZsXQD/jctHVRZAC]/)KD>.r8Dte/KD>nAKC]A/KBa/7RY-5(7Z2M!-Zi%31[/dZ/
+\,Efb\[oDb]thJ%`lQ9Fbg4\ceCN:+h;@/NjQGgpmI'K6o(;VLq"agbrm:Z`m]!"RYEY0ScE`On
+NIuV.KUSpL[CWTF[&^A(Y@NKIMi<XVO-#NfPa.Q$R$sM7SXuLJU8+N]Vl6VqXKAY0Z*L^D[^WfX
+]=bhl^qmn+`Q$!?b0/#ScHstee'uq"f@em4gtgiEi8N\Uj5oFckNM0qlg4!*mdKW6nF?)?oCV\S
+o`Fj]p\jmeq>^<hqu-HkrUg)?s+13Rs*t~>
+JcC<$PlL=RrVc]mqYU<hrqZNfs7cQerq6<`s7?6\#P%<Qn*f]4mJcH1lg!a!kih3lk2k[aj5T%U
+i8<DIh;$c=g=b-1f@JL%e'cXkcd'h\bfe/NaN)<>`5BI.^V>BsJcC9!J,Og<F_P3"A7]q*Dej$&
+D1mIiI=$3^FE;D>Ci%FUH#%;?k^*;WrdF]ls*alord4Tkqg8<iqKr$ap3@-T=^YTF;,L,9G]n:R
+FE@G"!c)I`rFGq<#&@sgChmd#rbDROCQ8=R!K;p8M$SomLPCD5D/samJ,OorJ,+WjJ,=`rJ,Fco
+IfOrnJ,aurJ,=crJ,b$"It%6B"FbcJIXV-Cs*a`ms*k#trI+WnrI+Wls*O]lrd4Wj%XWSOI=-Eh
+H[:!bI!g9fq0N$es*FWj"+5HAHi8?bHiAEiIK+]kIJnWjJ+e?jJ,Xs%JqJ]-JqNlPqh=m$s+^T1
+rJ1'%reUZ3M>`81L\lr,M?&M1MZ/P4MYi>/N!t/TE,TH'AS,V+AjT,hC]/)KD>.r8Dte/KD>nAK
+C]A/KB`MiDP4t11Pl?mFPVSMjR$sM9T:r!TV5C2jX/rM/ZF%$J\%'#]]Y;.s_SjF5aNDcRdFHn)
+i9'CqoChtVr;?Nkr;ZWoqY^3mr;HWorVn/BrVQKgq"FCRf"6s#LQR%6Nh)/VH?aFIDfgJcMi3UR
+Ll$e=pOm(6MMmFQO,oBcP*D5tQ^F52S=Q7ETq\<XVPgAmWiW>*Yd(L?[C3QT\\#Mf^VI\&`5Ta;
+aND]McHaeadaQ^rf@S^0gYCWAhr*JQj5]7`k3(smlKdg'mI'H3nF5u=o(2MGrq-?dp\4X]s7u]k
+r;6HjrVcBfJcC<$YQ'+~>
+JcC<$PlL=RrVc]mqYU<hrqZNfs7cQerq6<`s7?6\#P%<Qn*f]4mJcH0lg!a!kih3lk2k[aj5T%U
+i8<DIh;$c=g=b-1f@JL%e'cXkcd'h\bfe/NaN)<>`5BI.^VBJ@qGJ@e.Od&&/NG^G1GCUA6:*q$
+5<V+j4$#;Y217n^:J^[^r_`Pjs&7oTr_rYmoi(cf(/n*`.ki\42`*BW5!;%j4?PV`2`EWPrA=O.
+"u\G#3B/uZr&=[OrCd>e8kDTFr^d;V4\ejP;,[?kohtQ`r)EJl!*&_l!)iVkrDE\q<)iNhoMk`e
+s&9&"<)iiq!*&_ls&95%<)Zdr<)QZl;ufkq;@$3#<)Z^n;H$Qo;[??&<)cdp;Gg?k<!#ur;uT_r
+;uK\m<VTMo;cNZns&9%u;GmBj"&i)q;u9Po;uTbg;u]hs;?Bft<W5tn<<6-#p/M#krD`\p!*&ho
+r_rr"='>N+s&f>*r)rl"!*T8&s&o;&r)j#%r`B,#%9HJ*:esh[8kVT<4!u]\C]/)KD>.r8Dte/K
+D>nAKC]A/KB`_sP>PMD!=TDS$=oMV)=oVV(<rc:t<W?,4=B\p5>[1TB?t!MTAS#IcB5%3WrbDFJ
+'l7`)E,p&EH[g^,P*_`6W2m&(Z*CP)XragPZa@*GZEg[8WMQ>]S=,aeB3A;<>?"L$<`Msm;>j5r
+;H6dt=&r=";,I!cA;Q2%N/`mZOHPckQ'Rc(R[]h<StMdOUSOcbW2cl!Xfen5ZEpsI\%0&]]Y2(q
+_8=.0`lQ6DbKS8Wd*^:jeCE1&g"P39h;7&IiSrnXjlY^gkiqBum-O--n*fc8nac8Bo^r.U!quB_
+rV6Egs8)ZjrVZWmo_sFAJcDqRJ,~>
+JcC<$PlL=Rr;HWmqYU<hrqZNfs7cQerq6<`s7?6\6h0[8n*f]4mHj3*lg!a!ki_-kk2k[aj5T%U
+i8<DIh;$c=g=b-1f%&:"e'cXjcd'eZbKJ#KaMu3<_ns7*^V7CNRf&QRR/WHMQ63)fK9hFQCRgcV
+NKK<7XK8=sU8"<OR$O"uN0r7=H%YdQ!0R/A!0d;ErK[>I!LK,MPlR'JQ2[$IPP^OBOT:L=O8b17
+N?<OmJq/E'?<j;"St_dHS!B8&P)P<TKnP)4JrPhOO,j0u"-/A%\c05P]",8Y[^EQN[@3;-KnbnZ
+qj7>Ks-<VKs-<YOqj%AMQBdc%r0R5H!gf:Am$I=2qj.JPQ'Rc'QMm-MQMm*KPQR,4P*>m0qN_&D
+r/q&BrK%#Ar/gr>r/_#AOHGV'OSt7>NrG(?OH9C&!0?r9s,[#<s,d;CrfI2DrfI8FPEPp-rfRDJ
+Pa%GurK[VPPa%H!QM6[APQI,9R/EBPRf8`TRf8fTS,f,ZScGD^TE1[Vr1EeX!MQ7dT`ChcT`Lm_
+rhKRiV"^_bU]I<hrMB:drhodp%$H*gG]n(DEHeI5:f[L2rb_LLqete>r,;CKrb_[Or+l=Is(MP=
+Z*F;6rNlF/s0Vj8osaq1.Cm%%]=l"r_o9^=bK\>ZdaZk$g>1WDj5fCflg4'/nFH2Cp%S4VqYU9<
+ru9%fVPKf]MNkHaR#@/cIsZd7Up.;?]<8<?Wic$!=c&&qN/is\OckonQ'[l+S"#t?T:qsRUnsue
+WN*#$Y-5(8Za@0M\@K5a]t_=u_Sa@4a2lBGbg"GZdF$Fme^i@)g=k?<h;@/KioB([k2tjjl07L"
+m-X6?mfr:Oo()DDo`"Lbp@n=[q#C0iqY^6hr;HTdrdk*#s0)HQ~>
+JcC<$PlL=Rr;HWmqYU<hrqZNfs7cQerq6<`s7?6\61OI6n*f]4mHj3*lg!a!ki_-kk2k[aj5T%U
+i8<DIh;$c=g=b-1f%&:"e'cXjcd'eZbKJ#KaMu3<_ns7*^V7DXJc:3!J,Xm>Htm).AS+qbE,B?+
+CfQ%;I=-9aGB@kFDJX!/VIaRbI->nWI/SKmI/SKmHiSNjI/A9iI/83cHMDb,?!:WC?sui,I!KjY
+G'.hFE,BH,BkCmd@Urq`C2.P`CB&&OChmgErf.GIMi!=JLkgb?G'IhEFnU=aJ,k0"J-pdVJ:W9%
+JUi<%JGOcmJ,k)uIe/$hIf4cmJGt&uJ,t.Kr-\QordF]ns*sfm!IoRsIJ\KnIJnQlHiJKmHN8Hl
+H3ASCI=-D>H3/J@Hhi!dHiJEhHN8BkHN8HdHi8?lIK+`rIK"WkIJnWjJ+\9hIfb.OK)C9$K`6W(
+K_gB'L55b_s+gW1rJ(E0L\QZ*M=uc'M=lc*MuAP3Mtr>3N=:8SE,KK)AS,V-BLGAiD#S;JDYnA<
+E;XYMDZ4MQD#A)KCB&#IP5(78PQ7!FPlHsGPV\SjR$sM9T:hpSV5C/iX/rM/ZF%!H\%&u[]Y;+p
+_8=.1`lQ?JcdLCuhW3qio(DbRqu$Hl!;ucls8)Wi"8r,rrr)jCrr)cmqY9gYp%7k$R[/qhLPg>)
+NKnm:HZj=FEIW_$NKB3YLkbSU=c&&qN/is\OckonQ'[l+S"#t?T:qsRUnsueWN*#$Y-5(8Za@0M
+\@K5a]t_=u_Sa@4a2lBGbg"GZdF$Fme^i@)g=k?<h;@/KioB([k2tjjl07L"m-X6?mfr:Oo()DD
+o`"Lbp@n=[q#C0iqY^6hr;HTdrdk*#s0)HQ~>
+JcC<$PlL=Rr;HWmqYU<hrqZNfs7cQerq6<`s7?6\61OI6n*f]4mHj3*lg!a!ki_-kk2k[aj5T%U
+i8<DIh;$c=g=b-1f%&:"e'cXjcd'eZbKJ#KaMu3<_ns7*^V7DU;u9H.1Fjn1/hSh;2D['D2)die
+5X.Fs4Zb_(3!Luu=\MXg;>*lf;>X8h;r^dT;u0Jd;uBT<0.nq50ebF?5<h:o3]fGb3B0#Y2Dd3H
+1GU[C2`NfW3'$st!]N)6r(I2b8P)JP8I.IL:/Fhb:f1-h;u9Gm;uKVh;uBVn<<-"t<W?%q;ZK_i
+;uBPc;t*`d;uT`"<E)pr;c<?g!*&nq"&r2t;Z'Jq<E)rq;ZB\r;uTYu;cHXn;cWcq!`MuprDWu!
+;c?Xp;cEZpqc3Ais&K(ts&/hqr_`Pjs&8YkoMbch"&i)r<:s8k<qfPn<W6#!<W5qu<E/osr)<Pn
+"'&E)=o;J'=TMW-q-!u*=BJX+=BYT)r)j&&=8c2"<t/8/:f0t_9h7rG5W^AGrbVRNqJQ1KlYuc?
+q/61Ks(qUKs(_RJq-*Yu!*K,$r`]>)s&]>(=B>8us&Tb6>$G39>[C`E@:EbYAS,Oerb2:FrG)@J
+(2Rc'DJsN;H$k4#O-Z9.VQ6f#YHP+3poOLts/n#YYd1UAZEga=XJr(kT:D=9Q'?5h=]ed+<DcRk
+=&Mdj:JFPZ:K:@p=B/=";,C-a;d"s8N/WdXOHG]iQ'I]'R@B\:StD^MUSO`aVl?\sXfek3ZEppH
+\%&u\]Y2(p_8=+/`lH0BbKS5VcdC.heCE.%f\5'7h;-uHi8WeWjQ>Ufkiq?sm-O--rpL'\nac8B
+oCW%T!quB_rV6Egs8)ZjrVZWmo_sFAJcDqRJ,~>
+JcC<$PlL=Rr;HWmqtpBhrqZNfs7cQerq6<`!;$3\s7$*YrpNAFmHs9,lg!d"l0.<mk2k[bj5].X
+i8EMLh;-i>g=b-1f@JL%e'cXkcd'h\bKJ&MaN)<>`59C-^V@IpS"#k7R[KS2R$X0;Q62TTJrkXu
+TpV++PE:m.XehqjU8"3JQBdPne^0t5JW&rZs-*AFrg!GJrg3VMs-<VMrg!JIrfd2As,d;Cq2bN8
+qMckOH@pa!JR2`[StDXGSX>b/Q'%&_LkUP8KS#8FO,o9[N/imYNK:+=]FDH_[^NZQ[^:UJUORuR
+rg*GJrKdJKs-E\O!LB)JQMm0DQj&nFQ^=),qNh8NQ^IZ:!LT5NQiNQOR/WHNQN!3NR/<6LQ2[$I
+PQ-mHPlR'JQ2d*JPPgUCO9(K,r/gr>qiCi@OT(:@OSb(?NfT8#O91Q+O84h8O8Y.?O8Y1>OoLUD
+OT^i2P*(n*P5gdHQ2?mIQ2d0GQ2d*KQ2QpKQ'Rd7RJrZTR/i]SS,SrXSc55YT)bJ\TDG2\U&1Pb
+US@a]!huHcrM0.ar1s:f!MlRfVZ3RlW"+u<I!0RMDKC$.LLl?FD>S5LDu4M=EVseSDu4GOD?"GM
+C]A/KZMh--[/[N6[e7-/\15&#]=Ybl_8F75aihrSd*gFpg"P6<i8`n]kj%L$n*ol<oCV_Kp\=U^
+rltH]e#B.5XHo$S\?V0YNIcJ*NM!;^Zb3NGY,nf#Y?m'CMi<XVO-,ThPa.Q%R$sM7St;UKU84W_
+Vl?\sXf\e2Z*UgF[^`lZ]Y2%o_8=+/`Q-'AbKJ/UcdC.heCE.%f\5'6h;-uHi8N_VjQ5Oekiq?s
+lg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Wirqu`noDX=@JcDtSJ,~>
+JcC<$PlL=Rr;HWmqtpBhrqZNfs7cQerq6<`!;$3\s7$*YrpMu;mHs9,lg!d"l0.<mk2k[bj5].X
+i8EMLh;-i>g=b-1f@JL%e'cXkcd'h\bKJ&MaN)<>`59C-^V@IpqgnZq!.Xrr+*)%'C1:.dE,TN/
+ChnWQI!p9cGB@nFE,KQiS:56oGisGRI/SHnI/A?dI/A9hI/A9dHMVmo?sI,I@:E#/HZs]5FUW>3
+EH#c1BkLsf@q0!IC&i&KC'AEhD/=$?rf.JJMi!:JLkganEdhnIG(0.7s+(-#s+(-#s+'orqLA?l
+"b1uMIt3(GIft:OJ:E%HIfY(LrIFfqs*t*!q0i*gs*srqrdXrsrdFQjrI"Qjs*Xin$[d;JH?spc
+I=-EgH2`*lH[:!bqK`0hHM2[gH@(!dI/J<kHM`'hI/\QnIKFqFI/A?kIe\EdIf+ZsJ:W=MKDpQ'
+KDgK'L&Qi,LB*).L]<2-L]*#/L[g2uM>)o*MuAP4Mtr>0N=LAUDf'9&AnG_1D,G(CD>S5LDu4M=
+EVseSDu4GOD?"GMC]A/EPP:=AQ2?gGPPp_%Q'Rf+S"61EU8+Q^Vl?\tY->1;['dBQ\@K5a]tV:t
+_SjF6aND`Re(EI8kO%g2pA+R^rqlcnqtg0ds82orrr)j'rr)clqY9dXo^r.S#kZN;Nf&UPIt%BW
+&:AhLEGfc@Jr#DFO,JjLKS0#P?AXPtN/`mZOckomQ'Rf)R[]h=StMdOUnsrdWN*#$Xfnt6Za@-K
+\@K2`]tV7t_Sa@3a2lBGbK\>YdF$Fme^i@)g=k<;h;@/KiT&tZjlYail07L!m-O--n*fc9rpg*]
+o`"O`p&Ojcq#C0iqYU0hr;HTcrdk*#s02NR~>
+JcC<$PlL=Rr;HWmqtpBhrqZNfs7cQerq6<`!;$3\s7$*YrpMu;mHs9,lg!d"l0.<mk2k[bj5].X
+i8EMLh;-i>g=b-1f@JL%e'cXkcd'h\bKJ&MaN)<>`59C-^V@IprDN\qrDWPj*\Alk0.JY92E!<I
+1c%Ea5<h=p4?Pbd2`<Qn9h%oTm8Eg[j&5hSqc*8frDX.X/h\q60JkXP5!1t+3sI])3&``P2#]96
+0fCpL3W:u<3W1oL92/)R92%rM8OuEE/NcO!:f73g!`;inr_r_ms&8hnq,@5krDiksr`/qsrDW\n
+r)3\s;cH]n;?9]op/C<W"BAE#;cEZnoMZ/t;c6On;c?Xp<E)mqr_a/'<)Z^n;,^Fm;GpFnr)E\p
+"B8<!;c<Qns&8nr!*9"tr_rkrqc!`!<)Z^n;Z9Yk;ZB\i<:a#k<)Z[n<;'>k<WZ9#<;T\p<rZ5%
+<`T)trD`hsr_rhrrD`r#='/W(=o__)=Sc5$=oVV(=8Q+t=TMW+rDrr"r`BY,:Jae]91hlH5WpVZ
+2/W5.rGVRPl>c`@rGVRNrb_[Or+l=Ir*&u#s&f5&rEB5(s&]>(=BG?!s&Tb6>$G39>[C`E@:E_X
+AS,Oerb27EqJ$RWCi404GC+jpNKfj'UT(;qriH1%qPsRrs/Z@*Y-5(7rj)R/.BoqRVP9`RR[9;(
+PEM2L<**+%=]A7!;,pIi:ejb[9iG"k<*3+#;,^9b;dP<<Mi<XVO-,ThPa.Q%R$sM7St;UKU84W_
+Vl?\sXf\e2Z*UgF[^`lZ]Y2%o_8=+/`Q-'AbKJ/UcdC.heCE.%f\5'6h;-uHi8N_VjQ5Oekiq?s
+lg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Wirqu`noDX=@JcDtSJ,~>
+JcC<$PlL=Rr;HWmqYU<hrqZNfs7cQerq6<`!;$3\s7$*YrpL'ZmHs9,lg"K61[+#ak2k[aj5T%U
+i8<DIh;$c=g=b-1f%&:"e'cXjcd'eZbKJ#KaMu3;_ns7*^V7CoSGeo]R[KS2R$X0=Q62c[Kp.=K
+T:)+/MN<s8XfJ@qU8+<NR$<hsXK%e5I"UgLrfd>Gr0@;Jr0RGL!13YMrg!JIrfd2As,d;Cq2bN8
+qi)qNG_(Ht?sfe*T:VXHR?s5&OcPHYL4k25K8ttRNK0!XNfB*ZO.ZEa%D'*Y[^W]R[#L'FI><^Y
+QM[!VQ'Rc'QBdc'Q^=#)q3LuGq3V/KrL!VOrg<SLr0[JMs-WhQrL!VQqj7AMrK[YSQC!o'R$dl>
+s-NhQQ2HmHPQ-mHQ2d*JQ2[$JPPp[DOT1IIOH5KcOH9:#s,lr7rfI/Bs,[;CNfX*urK$r>!0@,@
+rfR2Cs,dAGPEYp-s-!GIrg!5Dq3CuE!1!JH!g]1?rL*YR!1EhTrL<hW!1j([p7M;Vs.T@br1a@g
+TqS4[U]7%hUSR^^p7q\bqPO:jqPXjgIX?<]EGfrCX,q@WTDia-DuFYIEVFMGEW0qVDu4GPD>nAN
+CB1[=Zi%31[/dZ2[fEr;\,Nle\[oDb]t_D$`Q-*Dc-F\aeCN=+gYUlKjQ>[jlg4'.nac8Bo^qhM
+q"js5ru:p]Ybn1gUl1JD\<`);Mgp//R]3a(]Y:PP[&iu)?&=JuNK0']P*2&pQC!u,S"-%@T:r!S
+Uo(&gWiE/&Y->1:ZaI6N\[oDc^;%J#_SjF5aN;TJbg+P]dF-Oof%8R-g=tE=hVd>NioB+]k3(sm
+l0@U$m-X60n*olHncA@Srq6<bs7cNfs7uZjr;6KkrVc?eJcC<$YlB4~>
+JcC<$PlL=Rr;HWmqYU<hrqZNfs7cQerq6<`!;$3\s7$*YrpL'ZmHs9,lg"K61?do`k2k[aj5T%U
+i8<DIh;$c=g=b-1f%&:"e'cXjcd'eZbKJ#KaMu3;_ns7*^V7Coqgn]r!.Xrr+*M@,D.R='EcGl-
+Ci*7)J:)ZfH$4:LDJj9AJ9tsJF6@oJI.r'`I/A9hI/A9dHM_sg?!7/8(K""WH?XOTG&hS@DJa3*
+B4GI_@q07iC]8)KC]nNjChnCsNX^u+M2@+HLPKP_J8TFRrdOWlrdb!!!.aco"G2/RIt7NJqLJKn
+s+'urrIFirs+(-!rdarsrdY$!If+TpIXV'ArdXlqs*t#ss*aWj"+>QFI/SBlI/\HmI/\HtH@($f
+I!^-aoQgRcH@#C6!do?Ard"Qlqg8?hrHnKjs*alqqL/<kpODpdqgSZuJqEuS!.t'"rIb6+L5,Y^
+qhY0*s+pZ0nqd1"p5/j/repc5repQ1qMbr5E,]Z0An5OeJob+/HN%g]DuFYIEVFMGEW0qVDu4GP
+D>nANC\j7hPlI$GPlHsHPlI"(QC+)0SY)OJUSOcbWN*&&Yd(OA[C<ZV\[oGd]tV4r_Sa=4aNDfV
+e_8pClgXK;p\F[aqZ-Kkq#L9fqu?QorVZX$rVZTjqYBmZo^r+R*q]-GSW\thLl$J,O-"d8I!9RJ
+Ee&n'NK9-WLPUY<pOlh/Mi<XUO-#NfPa.Q$R$jG6SXuIIU8+N]Vl6VqXKAY0Z*L^D[^WfY]=bkm
+^r!t,`Q$!@b0/#Scd:(feC<($f\,!5gtgiFi8N\UjQ5Oekiq?slg4!*mdKW6nc&([oCW%Ts7ZKe
+rqQNhrqcQirqu`noDX=@JcDtSJ,~>
+JcC<$PlL=Rr;HWmqYU<hrqZNfs7cQerq6<`!;$3\s7$*YrpL'ZmHs9,lg"K61?do`k2k[aj5T%U
+i8<DIh;$c=g=b-1f%&:"e'cXjcd'eZbKJ#KaMu3;_ns7*^V7Cor_reqr_r\l+"o)l0J+k:2)R0D
+2)I3X5X@Os5!:th2`N`Z5t4UG;!h0W;s.$Y;>sJl;u9Pf;uT`%/hA\20K1gR5Q3hG3t4523&rrW
+2Dd0G1bgmHrAag;rAYWc9h\5R9M.oJ8OuE-4@i:G<)HLh:f1+gr_rhps&0,";c?Xo;H!9grD`_q
+"&r2u<W,nq;uT\m;uKYq;uT\e;tX)i;u'Am;uTbr;uKVo;ZKeq;[cQ&;cH[p;c?Xp;GpHm<;of)
+;H$Ln;c6Ii<)can;u0Jl;u]es;uTbr;uT_t<E<)u<W,ns;uKYr<E/rr!E)kp<<#nr;?0Yf<:j)h
+<;ohl<;]br<WlE%<)lrs<r5qu<W,nq<<-"t;ZKeo<rZ8#=oVY*=oMM'=o;J'=oMP'=8Q+u=TDS'
+=8u>#=8Z2";#a8r8kD`F5X-e\7fI<)DuFYIEVFMGEW0qVDu4GPD>nANC]7N7=oMP%=UA87>$5!1
+=BAU*rDaS5<E3+%=BSg3>[1TA?X[AQAS#IdBDuTCC&2QZBkqR'EHQSVKSttZSYE$^X/rG)X/c,s
+s/H$us/Q:(Xfek3rNRrYYH4b$US46JQ^3l"P*D9!CK+G=<``:!:fLLn:/Ob^9i"Pb;cZt$;cQao
+;>4!pM2R=PNfT9bP*D5tQ^F21S=Q7DTq\<XVPgAmWiW>*Yd(L?[C3QT]">Vh^VI_'`5Ta;ai_fN
+cHjkbdaZdtf@\d1gYCWAi8ESRj5f=akNM0plKdg'mI'H3nF?MK!V>s_p&Facp\ssfq>U6gqu6Nl
+rU^#>s+13Ss*t~>
+JcC<$PlL=Rr;HWmqtpBhs7uTfs7cQerq6<`!;$3\s7$*YrpKmUmJcH3lg!a!ki_-kk2k[aj5T%U
+i8<DIh;$c=g"=p.f%&:!da?IgcHa\XbK@oIa2Q$9_SX.(^V.:l])J3'S!oe6R@*r>s-=^ZB9%g\
+S!]G"PE2!3Xf/(kU7RsFQBdPCS'dCEJrfVgs,m,?rf[>HqN^`?s-EYLrfmDGqNCl@!0Hu:s,R&;
+,(4`hJq@B9PG+V>Tq7d@QBRGmMi!:FL4t;6O,f9]NfB'[rf-uFrk&<E\[VRHs0W#;OK3e`N;T">
+QO/tCQ'Rc(Q^=),rg3JIr0R,E!1E_OqNq)H!gf:Arg3>G!13YMrg3YN$(%$HQ^=),Q^3p8PQI&5
+Pl?sJPl-dYPa.GqP*;)mOcY]gOcPQbOcfL%s,m>CplGB8rfR2As,[)<s,R;CO-#HarfI)@s,mPJ
+OH>WhPPpXGP`q=1PQ7!DQMHgEPlI$KPQI,9Qi*6ORf&ZSS,f&XS,f,YT(\fVT`:_`UA^keU]mNf
+TqS3Urh9FgV"pk[V"pkfVu*FlV[\i=HZsUPDK^3$N/2\ErbqdTq/Q7OoQ0kLq/QCQrbq^Ps)%dP
+s(hY@r3ZL3!4Md6!k>_LrjVm:/%N7']=ktq_o9X;b0A5YdaZk#g"YBAioK4bl0I^'n*ol;o(2JF
+p%J1XrlP0Y_l9H&X-SpQYc*_FOFhn2Oe].nZb3]LY-"buY?ZsDN/`mZOckonQ'[l+R[]k>T:hmQ
+UnsueWN*#$Y->.9Za@0M\@K5a]t_A!_SjF5aN2NIbg+M\dF-Lne^rF+g=tE=hV[8MioB+]k2tml
+l0@U$m-X60n*olHnd+jZo_%nNp@n=\q#C0hqY^6ir;HTcrdk*#s02NR~>
+JcC<$PlL=Rr;HWmqtpBhs7uTfs7cQerq6<`!;$3\s7$*YrpKmUmJcH3lg!a!ki_-kk2k[aj5T%U
+i8<DIh;$c=g"=p.f%&:!da?IgcHa\XbK@oIa2Q$9_SX.(^V.:l]).'YJH(,tINNH:;/'W@F)c&3
+DJO0CJ:;olH$4=NEH#enGb07tF*dP,s*F?bqL&$cpO)gard=Tiq0N!b(LL?T@:E)1EHubNF`qkG
+Df9H-C1h0jAc?3;C]A2RD/3s'Fo@=#N;\V5L^$RoJo5[VJ,OimJ,XuhJcC<%Jc1*!J,"NtIt3#u
+J:RKGrIFlss+()us+(&trdb#u!.OlppO<-lr-eWqrI+`prdFisqL/KoI!kp?s*Xins*Xcl#(1iH
+H[9s_om6Xbs*FKf!IT7nH3/G@I/SElHM`'fI/eWpIf"QlIeS?eIf=isJH(*#J:W=NKE$Q$KDgH'
+L&Qi*L]3,0LB*/.LB*/0LB<9gM>N,-M$/WkM2I/^M?o-!N/NUOMMmDdN;JV6N"(5UEG]K)A7fJ*
+E+NI%rbqdTq/Q7OoQ0kLq/QCQrbq^Ps)%dPs(hUtp6>QAr075FrfmGJ)jZkZS"61ETVA6ZVl6Vs
+Y-5+:['d?P\[oAb]`,SV^VI\'`5g!Cd+$_)j65t%oCr7[rqcThs8)Qg!W;onrr;m$qtg*^p@\(M
+rpq<*p%A(ThO'=]LQ6n5NJrX?H$XOLEI3@sOGf0YLkpb;L%g7*MN!LRO,oEdPEhE"R$jD4SXuIH
+TqeE[Vl-MoX0&P/Yd1UB[^WcW]=bhl^qmn+`Q$!?b0/#ScHstee'uq"f@em4gtgiEi8N\UjQ5Od
+kiq?slg4!*mdKW6nc&(boCV\Jp%J+Rp\ssfq>U6gqu6NlrU^#>s+13Ss*t~>
+JcC<$PlL=Rr;HWmqtpBhs7uTfs7cQerq6<`!;$3\s7$*YrpKmUmJcH4lg!a!ki_-kk2k[aj5T%U
+i8<DIh;$c=g"=p.f%&:!da?IgcHa\XbK@oIa2Q$9_SX.(^V.:l\l8N+s&8em&h>C\/M/V82)?pC
+2)IZe5X%@rr]:BH2`<6Q;,9taohtfeq,7&fl;IRXrDNVnqc*;gs&9pi/MJq62DdN[4Ztti4ZYS_
+2`N]P2)@'F0etZd3!_H'3B0#Y3(H^A9G0uj84c?D/3QX';H-Lj;Gg7f;Z9Vn;?p-";c?Xp;c<Ei
+r)EYq!*&qrqG[GnrDNMkrD`eq!)iJgp/D)n;cEZps&8qsr_rhrs&8ko!E2tr;uTYr;cH`q;ZTir
+r_`bq<;TT!<)Z[m;,U@mr_r\nrDEVop/M&l!`W0"rD`eqpf%8m;YsDq;c6LloMkK^s&AqqqGdAm
+r`9%ur`/nts&]2#!*/qrrDihr!*/qtr`9)%r`K8*=oMM'=o;G'=oMP&=8Q+u=TDS'=8u;$=8Q,"
+<t8>/:f0t_91_iH5s?h[7K.6)E;=MMEqFGLEqs_SE;jeRDZ=SRD#\;J=oMP#=U/,5=]ed-='#<#
+s&T/"s&Tb6=^#$6>[C`D@:<YWAS,Rfrb27ErbDCG(MIQ!D/XK?I"I39QCFPDWMunuX/`+rVu3Ln
+W<TB'XKAY.YPtd+Y:coUVPBiVS!]M+PED#nQ^OG?IT0BM<`i9t<E)jn:Jah]9hnYf<`E1%<E)mm
+;YO*pMN!LRO,oEdPEhE"R$jD4SXuIHTqeE[Vl-MoX0&P/Yd1UB[^WcW]=bhl^qmn+`Q$!?b0/#S
+cHstee'uq"f@em4gtgiEi8N\UjQ5Odkiq?slg4!*mdKW6nc&(boCV\Jp%J+Rp\ssfq>U6gqu6Nl
+rU^#>s+13Ss*t~>
+JcC<$PlL=Rr;HWmqtpBhs7uTfs7ZNerUp3_!;$3\!qGdLrpKmUmJcGUlg!a!ki_s-3T]>^j5T%U
+i8<DIgtUQ:g"=p.e^W*tda?FfcHXSVbK7iH`l5m6_SO%&^:h1k\X]4\S=>t9R@'B@QQLd;Di]X.
+T:2"(M3*k%X/DqlU8+BPR[9;#Zc\_]IY[TZrfR#>s-*JIr0@;Jop>]Erg!JIrfd2As,d;CplGH8
+s,@eCH%LX!J6cKTTUqgJSXGb-PE:f^LPPk_%#0k)Nf]9]O,f9\NfX1P!kZ%QrO*!>GF5:TLQ7Xb
+r0I;J$'pj@Q'[l*Q^F0>QiEBOQNEJ>QMd*DR/WNNR/<6LQiNQPR/`NIQj&nFR$X,)rKmPM!13SM
+s-EbPQ2HmHPm!D<Pa%L2Pl[,4rK@>HOckk+OT1I=OT(C@OSb(EOcY]gOckigOSt7=NWP9%NrG+=
+OSt=AOoUXDO8tF@Oopo4PEZ!1q3M&Irg*SLs-*MKrfmDI"-f(:Qi*9ORf/`PSH#/ZT)##WT`:_`
+UAUecV#@"fU]$neV"pk[U]@7gV?!OiW;ib-W25W)G^+=LDK^2uLj2p%E,bYnrGqaUnoXbMrGqaS
+rc%mUr,2OOs(qV?s0hg6rODj9s0s8`]">Se^VRh+`lZBIcHjqge_&U1hV[>Rjlksom-X92naZSK
+"SDE^q#&55*<"WtVkp)`Mj1QMP`LudJUE3BY.(gP]rnTIXKV?#@>g)(NfT9bP*D5tR$a>3S=Z=F
+Tq\?YVPgDnX0&M-Yd(OA[^N]V]"G_j^VRe)`Pom=aihoQcHjnce'uq"f@\g2gtgiEi8N\Uj5oFc
+kNM0qlg4!*mdKW6nF?)?oCV\So`Fj]p\jmeq>^<hqu6NkrUg)?s+13Ss*t~>
+JcC<$PlL=Rr;HWmqtpBhs7uTfs7ZNerUp3_!;$3\!qGdLrpKmUmJcGUlg!a!ki_s-0BM9Tj5T%U
+i8<DIgtUQ:g"=p.e^W*tda?FfcHXSVbK7iH`l5m6_SO%&^:h1k\b^jYJ:E(JINN-6=D;5TG&_D6
+Ao):9IXQ]kG^4FSF)c)7KpR1%E-:i#rd+6aqL&3hs*joppjDpbrd=Tiq0N'd!FB"0@1Qa@:jI;/
+F`qkHE,]]2CM<]Ys'l7DChmg&CMiuc!G[VnNWG)rre^Z2"^#r!DKL4$If"WoJGauuJGt-"Jc^LT
+Jc:6$JbairJHULSJ:W7MJ,b&rJ,XuuJ,OotJ,OotJ,FisIfb(IIJ&$hJ+S3hJ,4WnHj"eDI!^5>
+I/J<pI=-BfH$T=6s*OZis*F`lpNm*lH[C'cI!ba:r-S<grd=cqrI+]pp4**mrdXfos*t#u"+PiP
+K)L?$K)L?#K`?c(L&d#.M#W81L]iKhLPL]aL]<5.M#E20M?&S+M?&S5N;nh/N;8J4N"CnmEGoZ/
+BOtgiIr8O]8T8YFEW'qSF7OGMF8^.UEW0qWDu=MQD?"GGPl6mHPl6gFPT5sSR$jG7StMdOUnsuf
+WiWA,Z*UgF[^WfY]"G]T]bJ2q^qdk,a2uWTf%f3HmI9`?q"X[aq?Hcjq>'m`qu6HjqZ6WnrVliq
+s83-!qYBmZp%7nUoDeG+p%S:ZrPkauNerUKH@Lp3I!L*bEG]cILQ.:TNf8gPL5#>S@>g)(NfT9b
+P*D5tR$a>3S=Z=FTq\?YVPgDnX0&M-Yd(OA[^N]V]"G_j^VRe)`Pom=aihoQcHjnce'uq"f@\g2
+gtgiEi8N\Uj5oFckNM0qlg4!*mdKW6nF?)?oCV\So`Fj]p\jmeq>^<hqu6NkrUg)?s+13Ss*t~>
+JcC<$PlL=Rr;HWmqtpBhs7uTfs7ZNerUp3_!;$3\!qGdLrpKmUmJcGUlg!a!ki_s-0]hBUj5T%U
+i8<DIgtUQ:g"=p.e^W*tda?FfcHXSVbK7iH`l5m6_SO%&^:h1k\PrB)!)ren%l#Lb0.SV62)R-C
+1c.Ka5Q3kG4:+&-2`<on7ScfYohtcdq,75ks&&hqrDNYmr)3PlpJUlcrDNVnqc*;gs"FC+,;Cl/
+1I+,e4?>Pc3BB)Y3&WTN1G^dA2`WiV2E<cW3B&oX:Amio91h`H84b0n8PrAar_`\ns%rbor_rbn
+!`N&ur`&eos&9%u<)`]or`&qtrDW\p!)rkr!`MupqG[>lnl,3\s&8nrs&&kr<;fbq<<#ns;Z'Go
+<)`cos&/nsr)<PlqGRPs;cH^o;uT_r;uBVp;uKSr<)lmtr)EVps&8tuqc!Por)E\r"&r2s;uBSp
+;uTYp;ta2j<W5tn;uTbq;u'Dk<W6##<E)rp<W?,(<`N+!<E/fprD`brs&T,#!*K5'!ErY*=9)M%
+=o__)=T)>#=Sl5$=T2A&<`f*!r`9Y5;,C%`:/"2Q76s'd-SB@WqJlISqK)4LqfD^VqJlLRs)7gQ
+s)%dPr`T8'pK7T#='&H$<<-)!<W?,5=BSg3>?kK@?XR;PAS#IdB4tuVC&VlIC&M]ZC27[+G'eao
+Ng,s'USk&iWiE"rVYd:kW'%&ZX/i>)YHY77Y-+h)VPBiVS=,\-PECukQC+/8VQ4K7=]ng,<`;sr
+<_lOf:JOSZ:fULp=BAL&<)HNd;IPKBNK0']P*2&pQC+&.S"-(ATV8*UUo(&hWiN8(YHY:<['mEQ
+\[oGe^;%M$_o9U8aN;WLc-FY_dF6Uqf@S[/g>(N@hr*JQj5]7`k3(smlKdg'mI'H3nF5u=o(2MG
+rq-?dp\4X]s7u]kr;6Kkr;H9eJcC<$YlB4~>
+JcC<$PlL=Rr;HWmqtpBhs7uTfs7ZNerUg6aoCMtP9C_N@n*f]4mHj3*lg!a!ki_*jjlGI^io/hR
+hqm2FgtUQ:g"4j,e^W'rdF$=dcHXPUb/q`F`l5m5_SO"%]tCtg\[\3$S=H(;RJiKqQ[3UaMhuJC
+R?<AfO_(YrVPU&^T:VF9PE1!RR<<h.OS4k7Ont7>Pl?sHQM[!KR/N?QR$X-<Q2[$HPP^OCOT:L<
+O8k4`JU;otJU_!4V4s]USXl4:P`q5jMM[(AJqSf>OH>N`NK=(!s,[,k!P5c=[Ka-GVk\ToO8b=C
+Q2HsJQiEBNPQ7!HR/WHOQM6aAR/E?QR$mo?".,CAQi<BORIZaFRJrTRQNNVCR$dl>r0[JMs-<nT
+Pa.JtQ'I[7PlR-IQ26[JOckigOHTO(rK-o=rf@8DOH5HarfR,A!KiKANrb9%rf7#>rfI#>!0[;B
+rfR5DrKI5F!1!5Crg!JIs-!GIrK[DK!1<bRs-ihSqjd\W"eM?XT:_eTTDbG_U&:Y^UB76dU]$qa
+U\L\`V#R4gU]@7jVZ!FgVuWaoW"5YcIX$'ZE,U,ISqMAg=BYWCrGqjXj)k6@rc7mUs)A!Vr,)LO
+rj;^6r3uR5s0r!;/%W@)]YD;#`5]m@bKeG^e(*+)gYLcHjQ>[jlKmp,nF?&>o'u8Ap%J.Vrl+mV
+_5X9*b*eI)WLK!-P(S=:P,5Lr[_0,RY-+h-pT@q^N/WdXOHG]iQ'I]'R@B\:StD^NUSOcbW2cl!
+Xfen5Za7'J\%0)^]Y;.r_Sa=2a2lBGbK\>Yd*^=le^i@)g=k<;h;@/KioB([k2tjjl07L!m-O--
+n*fc9o()DDo`"O`p&Ojcq#C0iqYU0hr;HTcrdk*#s0;TS~>
+JcC<$PlL=Rr;HWmqtpBhs7uTfs7ZNerUg6aoCMtP7.Kd9n*f]4mHj3*lg!a!ki_*jjlGI^io/hR
+hqm2FgtUQ:g"4j,e^W'rdF$=dcHXPUb/q`F`l5m5_SO"%]tCtg\[_Nf!.b#t+F[a%;eK]HF)c#.
+Ci37)JUMokH$4=NEGfW#FEqS<F+!\.qg.s_qL&6irdOfopjDpbrd=Tiq0EBV>[UrJ?qsOGH$TC3
+$$1*)Df'9(B4YZR@f^F_rG)URCM[d&CQ8=R!K;p8M$\un8pu5-FaAIaqL8BmrIFfsrIFp!!J5n"
+JcLAuJGXltJGt&tJ-1:OIt.EIs*s`m!.XosrdXor!IoRtIfY"Jn:(=cqgSQnr-SKkr-\Kjrd=`m
+!."Hfrd+Wkp3QderHnNkrHnKhq0W$erd=cqrdFcpnpgOcrdXlss+(0%p4N<ss+UB*s+gc6Lkgcb
+M#W81L]E50L]`KiLl)+e!/^]2reg`6oSNX,mu7(%rJV;IMKs2\DJNlsChS33@7<g_rc.mWrH%"@
+rH%sYqf2XTs)7gQ!,_Lqrg!GHr0./F*0lhWR@Bb=TV8*TV5L8lXKJb3Za@-J\%0)]]=e-V!5AHI
+&Ac9'a32iZg>D#Wn+$&Dp\=a`s7lQgrVHKi!rW#qrr2rrs83,uq=s^Xp%7nTo*+dZpA"L_rr3qm
+R?!5`V1F)ZM19ntHZa:HH\IE@NKB0YLPLTWKOKasN/is\OckonQ'[l+S"#t?T:r!SUo(&gWiE/&
+Y->1;ZaI6N\[oDc^;%J#_o0O7aN;WKc-FY^dF6Uqf%8R.g=tH>hr*GPj5]4_k3(sml0@U$m-X60
+n*ol<o(2JFrq6<b!;HHes7u]kqtpBjrVc?eJcC<$Z2]=~>
+JcC<$PlL=Rr;HWmqtpBhs7uTfs7ZNerUg6aoCMtP7.Kd9n*f]4mHj3*lg!a!ki_*jjlGI^io/hR
+hqm2FgtUQ:g"4j,e^W'rdF$=dcHXPUb/q`F`l5m5_SO"%]tCtg\[_N9!)ren*\f8r/hSk:2D[$D
+1c7Tb5sIOr4$,J`2`E?Q786WVohtZao2>NarDNVlpJUibr_i_oqc*Ai(GIHp0JP7=2*aAh4Zkef
+3]T/[2E*NO1]B-<3&`fV2`NfW3&`fW:]3ue9)_?l8L?Yn;,U=h:f1(f;Gg=irDWYm"B8B$<)i`n
+q,I>n!*&hos&B"sr_s,$;H$On<)Z`m<:j,`<;onr;ufkq;Z'Gn<;oer;Z'Go<)`cos&/nqr)<Mk
+r)<Pn"BAB"<)`cqs&8qs##eDs;GpFmr`&tu<W5tr<<6'!rD`esq,@Ap<;oho<<#kr;t3i`;u]bq
+;ZKer;u'Di<W,ns<W5tt<rl?%rD`Yo!EN5!<<#tu<WcE(<`f9's&oD*r`K)%!*T8&!*B/%pfRT!
+rE&esrDsP4=]/'n:JFJR6Ua7'1ak"6rc.mWrH%"@rH%sYqf2XTs)7gQ")V1C=SQ&!=9_i-<`N.!
+<;ff/='/R->$G39?!^lG@:Nk[AnV*Vr+Z.Fs(MIHraumYC27d1H%(I*P*hc5V5C/hWMl`nVZ3Lm
+VD5!IWMunuXfek2Y-"e*W268^St)48P`q5kPEhN(TVSTk[((<^='/O9<)Har:JXhbrD!]#<*!"#
+<`N*r:f-ma@>^#&NfT9aP*;/rQ^F21S"6.CTq\<XVPgAmWiW>*Yd(O@[C3QT]">Vh^VI_(`5Td<
+aihlPcHjkbe'uq!f@\g2gYL]Ci8EVTj5f@bkNM0plKdg'mI'H3nF?)?oCMVRp&F^cp\jmeq>^<g
+qu6NlrU^#>s+13Ts*t~>
+JcC<$PlL=Rr;HWmqtpBhs7uTfs7ZNerUg6aoCMtP$h<`Un*f]4mHj3*lMg$*ki_*jjlGI^io/hR
+hqm2FgtUQ9f[na+eC;sqdEp4bcHOJTaiMQC`Poa3_8*h"]tCtf\[VR/-_-ZqR[KS2R"'6uOFh5>
+R$<SlP*2uNVPg8eURn$EP`q1!ihUjONV8P2Oo1CBPPp^GQ2?mHQhZpKQ^7W9rKR;F!KrZEOo^],
+pl?bPI<gBpJ7)WXTqS'LSXGk1P`q2fMM[(@KnPPKOH,?\O,f6]O-'=Q!P5i>[KL-AVg='pOo^c3
+rg*ML"dYF<Pa.U7R/NBOQM$UBQj&nFR@0M4rL!\RRJiKQQi<BNRJ3'KQi<BPRJWBORK&WSQi*3O
+R@*u?s-ESJqj.,E!0mDFs,mGGOHBF's-!DEs,[GIP*(ojOcfR'"HSY-P*,^+s-!JHOS4b7OSb.@
+P*,^)rfI2DrK@>JQ'@O*QN*6LPlHpIPl-dIQC.W=!1NnVs-s([r1*bW!M5t`T)bP`TDbG_U&:Y`
+U\pnfU\pkcU]7.eV>I(eU]$tgV>[:iVt[.hW=Z#(Ndc=tFDl2IG+=)-;cm3%ErL.SFR=5GFT-@\
+Er9qWE;skTD?.*A\,3]7\,Wrg]">Vg^V[n,`lQ<GcHjnee_&U1h;@5Qk3)!om-X92naZ2@naZ5B
+o_/+Y`;^hFp8k3fUn!L<WM,N9P`LHGLRtZY[(O)VYHk:4p9%VXN/`jYOHPckQ'Rf)R[]h=T:hmP
+UnsueWN*#$Y-5(8Za@0M\@K5a]t_A!_SjF5aN2NIbg+M\dF-Oof%8R-g=tE=hVd>NioB+]k3(sm
+l0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kqtpBjrVc?eJcC<$Z2]=~>
+JcC<$PlL=Rr;HWmqtpBhs7uTfs7ZNerUg6aoCMtP$h<`Un*f]4mHj3*lMg$*ki_*jjlGI^io/hR
+hqm2FgtUQ9f[na+eC;sqdEp4bcHOJTaiMQC`Poa3_8*h"]tCtf\[VHerdb#u+(JVZBjk%bE,B9(
+D/FoVI!p<eGB@tKE,KF,Y(CG/HM2^]HMDj^I/eWlIf=ciI/SBmI!bj?qg83d'jk9O@:3G>:OIG4
+G'.qKEGoc4D/3kbAcH6AChmkdC]A5NCBA<fNW+q=N/R[ls+gkVIt;K[I=D0Dr-nQnrdalsrIFp!
+!ePuSqh"]qqLSZss*k'"Jc1*!J,XuuJ+\<lJ,FimJ,b$#It3%<If4cnIK4fpHi\YBrd4`pI/\Kl
+I/eQkH3AS@H[L5<HN8HkHiJKlHi8?lHi89dHi&3hIJeQaJ,XoqJ,=`sJV*TJrIk-'re:K0Ll(ta
+s+gN.reUW4r/(H0!Ju^5MtDo,MZJcpnVm=(s,?o9&<)KmEGo]-BOtmkHYHkT925D+rc@gUm</2G
+rcA'Zr,MaUs)7jRr07/FrKR5Drfe@fR$jG7StMdOUSXidWiWA,Z*UgF[C<ZV]">WS]`>eG^Ce8u
+_o9dCe(<I:l0\!2p%J.TrqZQgs7uWis82im!rMonrr)io')VP#p\4CRoCMPDoCMVIpA"L^r;RbG
+_N9b6MLp2.M1pA&H?sXMF+T4-N/s!WM2?t>p4QY.N/`jYOHPckQ'Rf)R[]h=T:hmPUnsueWN*#$
+Y-5(8Za@0M\@K5a]t_A!_SjF5aN2NIbg+M\dF-Oof%8R-g=tE=hVd>NioB+]k3(sml0@U$m-X60
+n*olHncA@Srq6<b!;HHes7u]kqtpBjrVc?eJcC<$Z2]=~>
+JcC<$PlL=Rr;HWmqtpBhs7uTfs7ZNerUg6aoCMtP$h<`Un*f]4mHj3*lMg$*ki_*jjlGI^io/hR
+hqm2FgtUQ9f[na+eC;sqdEp4bcHOJTaiMQC`Poa3_8*h"]tCtf\[VH8r_rhp*\f?"0.Sb:2)I$E
+2)@Td5<h=r4?Ybd2E*@4=@Z1_ohtT_ohtZas&/_kpeprcr_i_oqc*Gks"=U.0JG.<1I+5)4Td`-
+3B@'u$TBq#1GgmC2`E`V2u>Q93_rKL9`I`b8I.jY.R$F%;,gEl;#aDl;YsDm;?]uu<E<+!qc!;i
+r`&qtqbmJorDW\p!)rep!)rbooMYfj<E8lprD`nu<E/ino2>Wgr_i_os&/kqs&&hoqGI;lq,IAm
+!``3!r)3Vn;Z9Vp<;fhs<;KVe;uouurDWVnrDW5cqG[Aks&B"sr)EYo!*&nspJ_8r='&C%r`&hr
+rDrkrs&B&"r`B,#!E`M(=o__)=9)M%>5;:q=TDS%=8H&!=8Z/2=]&!m:.n8S77BI(1F=b7rc8!Z
+pN5eFpiQLVrc7pVs)A!VrGDU;q-!`"**60A<E3!t<E)pt<`iI,>$G39?!^iF@:Nk[AnV*Vr+Z.F
+s(MIHrb)7E%;Kg%GC5%"O-Z3+USOddVZ<UnV>[2FV5C/hW2ZetXfeh/XK/A!UnXNQS!]M,PECri
+Pa@f0UoCQ(\@f[eCg'qB=]80u;H-Bi;#a8u:Jk+l<*31%<Duglp/5+QN/`jYOHPckQ'Rf)R[]h=
+T:hmPUnsueWN*#$Y-5(8Za@0M\@K5a]t_A!_SjF5aN2NIbg+M\dF-Oof%8R-g=tE=hVd>NioB+]
+k3(sml0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kqtpBjrVc?eJcC<$Z2]=~>
+JcC<$PlL=Rr;HWmqtpBhs7uTfs7ZNerUg6aoCMtP$h<`Un*f]3mHj3*lMg$*ki_*jjlGI^io/hR
+hqm2EgY1B7f[n^)eC;spdEp4bc-4ARaiMNB`PfX1_8!au]Xtbc\@2@,-(LHoR[KS'GB8n%KV4g$
+Oc#6aFfM@<V59rZSX>_-OIWqMFaf);P517=P5^[EPQ7!EQ2m9GR/`NOQ2[!MPE_;qqiUuBOSOqP
+IX?TtJR;`ZU7e*MSXl17Q'7;gMMV7d#_eD%OH,B^P)fO&!0I/l%(j*[[^W]RFJkCNKTZ.p"-f(:
+QMm-UQBd]!Q'Rc(R/WERR$X-4QiEHQRK&ZQRK&`SR/r\CqO%;Ns-itUq3_2Ks-WeRqO%;Nqj@AN
+!1<bPs-<YMq3LrDqiq,Es-!DE"-A\/Oo(:GOcklkPEM(-O9:Q*Oc]F&rf[AGOSb+<O8t@@OSY(>
+P5UL@OU.,6PE_>uQBda.QN!0LPl?mGQ2d*KQ2m<OR0/nIS"0GJr1*bWs.KCaqk3q^s.]Lf!2BIf
+rhTOgqkF+c!2TLgqkX+as.o[kr20Fjpo+(h&uq[`I=$'VDf9rGRt5la;l4VWq/lOWm<8DMq/lXX
+rc7pVs)A!Vs).eEqmcX7s0sSi]=bkn_Sa=4aND]NcdC4lf@ep7hr<_YkNV9umI0Q7nac8@nac;D
+p%\F"ru8YNV5(PbQa`iXOc,E[Jq9,]ZFRNX['-[>XKV?#s,:9EO-#KePEhE"R$jG6SXuIIU8+N]
+Vl6VrXKA\1Z*UgF[^`lZ]Y2%o_8=+/`Q-'AbKS5VcdC1ieCE1&g"P39h;7&IiSrnYjlY^gl07L!
+m-O--n*fc9nac8Bo^r.U!quB_rV6Egs8)ZjrVZWmoDX=@JcE%UJ,~>
+JcC<$PlL=Rr;HWmqtpBhs7uTfs7ZNerUg6aoCMtP$h<`Un*f]3mHj3*lMg$*ki_*jjlGI^io/hR
+hqm2EgY1B7f[n^)eC;spdEp4bc-4ARaiMNB`PfX1_8!au]Xtbc\@26brdZ)-?X%>V@s<!3ChIU%
+?%79OH@'p[F`MG>D0Ch_BlA1eHhi!aHhMgeIJSElIJ8*hHiAEmHiAEiHi/0j?X<Y>s%jS\H?aUU
+G'%_BDf'9)BP(geA7TOmChmg'D>n;PCho%0NXh&-M2@+HLg#:XDKL5SIf4ZsIXQZor."]rqLSWr
+r.+j"r.4`qqLSZs"+PiOJbafrJ,XruJbaiqJ,OooJ,=`rJ+A'dJ,FcmI0=qEI!gAAHiSNlI/SEk
+HN&9kI/J?jI/\KlI/A6jI/SEkHMMpcI/JEkIdqpdIf=iqJH(,uJHCFUKDpQ%K)pXZre1<*re:E.
+pk\s*qhY9/s,-c3s+g`5MMhCkpPSg*nr3.!&rqfmDf0B*AnPjmHYQhS7X]?!q/lOWm<8DMq/lXX
+rc7pVs)A!Vs).k$rK[>Gr0./F#*kLAR@Bb>rh0t"V5C2jXKA\2ZF%!H\%&u\]=e-V!5AHI&\u6"
+`5p-Lf%f6IlgF<8p%J.Vq#'sdqZ$Emr;QZor!*&pq"OOUo`"F]oDeFdp%J1Wr;QTn*:runNJraZ
+I=IH9I=$6dGB.YLL5_4UO,]'SLP>DSs,:9EO-#KePEhE"R$jG6SXuIIU8+N]Vl6VrXKA\1Z*UgF
+[^`lZ]Y2%o_8=+/`Q-'AbKS5VcdC1ieCE1&g"P39h;7&IiSrnYjlY^gl07L!m-O--n*fc9nac8B
+o^r.U!quB_rV6Egs8)ZjrVZWmoDX=@JcE%UJ,~>
+JcC<$PlL=Rr;HWmqtpBhs7uTfs7ZNerUg6aoCMtP$h<`Un*f]3mHj3*lMg$*ki_*jjlGI^io/hR
+hqm2EgY1B7f[n^)eC;spdEp4bc-4ARaiMNB`PfX1_8!au]Xtbc\@2<7r)4Xl0J5(3/NP^F1G:O@
+3'ohn5!M1m3]f;[2`X;q9htXb"&i)q;u9Jg;>*oY;>3uc;>sJm;u9Pl;\(N60JP:?1I+2f5!1nh
+4$!:"%6$.%1c.'F3&`iW2`Ebr3!20%:JUm_%80;c84cB'5Yk9S;c-Ej;#aDm;YsDm;?g'!<E<."
+<;]\j<<#qu<:s2h;ufkp;ufkr<!#ut<:s/i<;fho<;TYq<;KMa;uTYp;uKVo;Zouq;,U9h;?0Ym
+;ufqt;ZTltr_ins;c6Kj;ZKef<W5qt<VfYt<E)pr;uBVn;t3i`;uT\l;uK\q;ZKeq<W?%t;uBSq
+<EK0#!``3!rDies!*0"tr`/kt!a&T.r`]>(s&o8'!*T/#pfRT!r)`Jls&fq8;,C(`9M8)K76ipb
+-S.`.F89qUFmXAMFnp.ZF8g4XEW:"XDuX_P=U8,2=&r=$<)cfp<!-0'=BYW-$=$kC?=72OA7]@b
+rb24DrbDII'PM,lAnYjlD/sfHJVT8LR%0kFV5=0g!MuUiUIM&UVP^8iWN*#$XfSS'Wi)YeT:D@;
+Q'IPqOHPioR@^4QY-PRM_8XT^Vd<G,='/F"=&_mj;,U4d9hn\g<``@'<E2sq;>*ofN*_O*OHG]i
+Q'I]'R@B_;StD^NUSOcbW2co"Xfnt6Za@-K\@K2`]tV7t_Sa@3a2lBGbg"GZdF-Lne^rF+g=tE=
+hV[8MioB+]k2tjkl0@U$m-X60n*ol;o()DEo`"Lbp@n=[q#C0iqY^6hr;HTcrdk*#s0DZT~>
+JcC<$PlL=Rr;HWmqtpBhs7uWgs7cQerUg6aoCMtP!V,[YmfDkDrp2`4lKRQskN:pgjlGI^iS`YO
+hVI#CgY1B6f@SU(eC2jnd*L"_bfe2OaN2B?`P]R/^q[Us]Xt_b\$i^CSKs_pS!oamFCpGcCRUZT
+NKK?dXfeV"UnXHOR[',#NKi7@H%_:NP517=OoU^FPl6mEQ4B7KR$jA0R$j>0R@'A.QMZsHPQ6pE
+Oo^],qi;J@H\@!$K3qoZTUqaJTUM13OcPKZM#E&9Ko_7SO,oB`OH5HarOi0B!4`!9#E6<?I"d]G
+P5^UDOp$u5Q'Ra7QN3?MPld8<R/WHKR/*'KR.6U@R/<<IQi`VAR/E?QR$mr@rL*VOr0[hXQ^=)+
+QC+#*r0I8GrfdDJrKI;GrK.>JOcklkPEM+*P7<\;OH5HbP*(okP*2#lrK@5DrfI&=r/gc;!KrTD
+OSt=AOogi4Q1(%=PmrtAPE_>tPa%GuQC+).rgEhVpmh>S!M?%aT)bP_U&Le^UB%+hU\gecT`Chd
+UB%.iU]I<foqVP_qPO7ipo*qd&>=](GBS"GFF/5$J9OslRU?#8rH8$]lZ`8MrcS*[rcA*[rGhjV
+s)7qHqmcU6+Lo"p]YD8!`5]m?bKS5WdF6Xtg"Y??ioK4al0@U%n*p>H!:p-Z"S;9Yq"qi+*VfZ7
+W2-D[PH:FHP)PTeKn"oOYIV$Q]W\QDY,ni$Y#^I>NK0']P*;,qQC+)/S"-(BTV8-VV5L8kWiW>*
+Yd(L?[C3QT]">Vh^VI_(`5Td<ai_fOcHjkbe'uq!f@\g2gYL]Ci8EVTj5f@bkNM0plKmm)mf)YZ
+nF?)?oCMVRp&F^cp\jmeq>^<gqu6NlrU^#>s+13Us*t~>
+JcC<$PlL=Rr;HWmqtpBhs7uWgs7cQerUg6aoCMtP!V,[YmfDkDrp2`4lKRQskN:pgjlGI^iS`YO
+hVI#CgY1B6f@SU(eC2jnd*L"_bfe2OaN2B?`P]R/^q[Us]Xt_b\$i^AJc:0+AR&,F@odYiChWfb
+s+(`2I!L![FE2>=DJ=6nB5D[9o6^:Z!IK.lHhMjdIK+crJ,XorIIhjdHiAEiHiA<m?X.(>@K0.:
+H['^WG]n1KE,BE,BP1meA7]9MC]A5QChmneC]BCnNXh#)M2I.HC5Q_DFF/FbIf4ZqIXV3ErdXot
+pjrHqon!'lpjrBo!.jusrdXru!.jrrrdXir!IoXuIfb.OJc1*!J,4ToJ,FclJ,Fa#I=?WnIXQTk
+rdFfo"+>QFIJeHrH[:$dH[P^;rd=Zkrd=Wjs*Xcls*FKfqgA?jr-n'`s+()u!.b&urdY$#K(ss"
+KS>-ZK`?c*L@C#nM>iD3Mt`,*Mt;nqN=^kfE,BE)AnPgkHtceR7X.i0FT$@[G3aAMG5cX]FT-@]
+ErC"XE;skTQ2QsGPQ-mIPol<ZR[]k@TqS6VV5C2jXKJb3ZF%!H\%&u[]Y(qk^:sT]&\u6"_oL!J
+f%T'DlL"*3o_%tXq#0seq#1$fqZ$Enr;HTl#Q+Anq"OLTo`"F\o*4j[pA"L^rqQL6_>97QMN349
+Mh?S.G^=^XE,pPeNJrs[Mi*=FKSB/R<f;orNfT9bPE_>uR$jD4S=Z@GTqeE[Vl6SpXKAY0Z*L^D
+[^WfY]=bkm^r""-`Q-'Ab0/&Tcd:(geCE.%f\5'6h;-uHi8WeWjQ>Ufkiq?sm-O--rpL'\nac8B
+oCW%Ts7QHerV6Egs8)Wirqu`noDX=@JcE%UJ,~>
+JcC<$PlL=Rr;HWmqtpBhs7uWgs7cQerUg6aoCMtP!V,[YmfDkDrp2`4lKRQskN:pgjlGI^iS`YO
+hVI#CgY1B6f@SU(eC2jnd*L"_bfe2OaN2B?`P]R/^q[Us]Xt_b\$i^C<;]Z-2_HR4/2B+@1GCR@
+1daSp5<_:13t"&-2_R@!92JJ^;H!Km!`W)sqbm5eohtBYpJUlcr_i_oqc*Pn!\Z/[r\5QQ1I42f
+4Zbbg3B9&Z2`<QO1c-sC2E<`V2`NfX3&irp:Amir91h]G8M<A(;,U=k;GpBk;#X>l;Yj;m<)rou
+!EE+s;u'Dm<<-"j;u]hr;uT`$;cH^p;H$Llp/:rjr)Ehu<E)ro<W?"p;ZBYt<)Z^ppeq5l;cEZn
+s&8qqs&8norDE\q<E9#ts&B/#;cQlt;uTYs;c6Onr_iernl>]h!*/kp!*0"ts&8kqr);u^r_reo
+s&8np!)rkrr_rhsr)E\pqc!Ss<W6&!<V]Yr<E/lr!*9)#!*K5'r`]>)qHEo%qH*`$qH3f#rE&Sm
+r)j/';,:"_r_!Mb7mK3d.4dnIrH/!\r-%CMr-&'^qfMgYs)S'Xs)A!VrE0\6='&F&<E)mq<)Zar
+='/U/r`]_7?!^iF@:NhZAnM$Ur+Z.F!bl=]rb)7E7VQ[YFaALjMij<oSt`!UVP^2cUS=KVTq\9V
+UnsrdWMur"XK/A$WMZJbSt)79Q'@GoOHG`lQ^jeJY-POL_8XRCeC\H4rE'k6;--Ul:f1"c9hnJ^
+<E<($<`N-u;bp9b;HA^7NK0']P*;,qQC+)/S"-(BTV8-VV5L8kWiW>*Yd(L?[C3QT]">Vh^VI_(
+`5Td<ai_fOcHjkbe'uq!f@\g2gYL]Ci8EVTj5f@bkNM0plKmm)mf)YZnF?)?oCMVRp&F^cp\jme
+q>^<gqu6NlrU^#>s+13Us*t~>
+JcC<$PQ17Rr;HWmqtpBhs7uTf!r)E^rUg6aoCMtP!V,[YmfDkDrp2`4lKRQskN:pgjQ#:[iS`YO
+hVI#CgY1?5f@SU'eC2jnd*L"^bfe/NaN)<>`5BI.^V@Ip]=PP_[^NR@SKaSnRt,g*E,]ZdR@0.k
+OcccIVl6DcTq7gAQ'IKceY7;?MXZf+Oo:FGPE_;sPl6mGQN!6FRK&ZSQi<<MQ2[$EOo^],rJr(L
+H\6j!JR;c]TqJ$MSXZ(6P`q,dLl-qAKnbYLNf]?brJpu@Oo;on]=@gJ"cC?HI"d^^P5ULIP*;)p
+Q'Ra7QN3?NPlR-JQiEHNRJ`HPQN3EFRK&`URJWBOR08nFR$jB=R/WEPR/*0MR/33NR/<<KR/`NQ
+Q3!8:rfmSOQ'@O4Pl[,7rfdnVP*(ojOHG]iPEM,nPa)02rfRJJOH>WgPEZ!/r0%,DrK-r<rK-f:
+qN1]=!g8b3rg!AHs-3YOQ^@Z:rfmPLPEZ!2!1*VLs-<YQrgNhUrL<nZSGeu[StMbUTDG;^U]7(e
+UB@<eU8.^]rhBFds.]Fd!i2ZgoqMP`V>7"`W:Qu"T7_K9G&_PEG^#a.P#PMP=8m@@G4TqUGk6.Y
+G5cX^FT-@]ErC"XE;[6E[ii2l]=ktr_o9[<bKS8Xd*gCnf@o$9hr3YYkNM3smI0Q@nHJOVp%\C_
+]`/q\Vl$8dNgI#FQ]I5nNeW+KUp7GB]Wn]E[B-S*Y5aG_NfT9aP*;/sQ^F21S=Q7ETq\?YVPgDn
+X0&M-Yd1UB[^WcW]=bhl^qmn+`Q$!?b0/#ScHsteeC<($f\,!5gtgiFi8N\UjQ5Oekiq?slg4!*
+mdKW6nc&([oCW%Ts7QHerV6EgrqcQirqu`noDX=@JcE%UJ,~>
+JcC<$PQ17Rr;HWmqtpBhs7uTf!r)E^rUg6aoCMtP!V,[YmfDkDrp2`4lKRQskN:pgjQ#:[iS`YO
+hVI#CgY1?5f@SU'eC2jnd*L"^bfe/NaN)<>`5BI.^V@Ip]=PP_[^NR@Jc:0AB4P@S>$,uhEGK-'
+D1[=eIX-3_FEMVDDf)JHIqs%Kn9anU"+,ECIJA3hIJnZpIf=cpHiSTiI/\KlI/A78H<sld?smD=
+;13\6G'A(NEc>u5ChmZqAS#@]CMIX&DJa0*rbDONNW+q=NJd[k#&068DKC/Pq0i3jrdXotl[f"b
+nq$XfrI=iuqLJQppj`?ordaots*t*!r-nWprdOir$%@ARJ:E&tIXckHIKY.LIXQV=IK"WoIJ/$d
+I/\KkI/J?kI/J<kHMDjcI/SKkIe\EmIeeKmJH(*!JGt&sJ-:FTK7\^RKDpN(L&Qc*L&Qf,L[g3#
+M>r>2M#N8/M?&S/MYN,&N;S\8N:Dl=K6(sKChREnBkMg+BLPI:9)`u3G4TqUGk6.YG5cX^FT-@]
+ErC"XDuc1%Pl6gGPlI!eQ^O;4StVjQUnsrdW2cr%YHbC?[C*KR\[oHQ^&PhH^]2(__8=+1bg=nn
+hrEqdmd]o@p@n@WqtL-cs7lZkrqQTkqu-F"qtg-`p\4CSoCDJNo*4j[p@nF]rq?@+f)M%pMi*::
+J;f/0H?jm_F)QG[N;enAN/NOLL%U-!N*)+$OHG]iQ'Rc(R@B_;StMdOUnjlcWN*#$Xfnt7Za@0M
+\@K5a]t_A!_SjF5aN2NIbg+M\dF-Oof%8R-g=tE=hVd>NioB+]k3(sml0@U$m-X60n*olHncA@S
+rq6<b!;HHes7uZjr;6KkrVc?eJcC<$ZN#F~>
+JcC<$PQ17Rr;HWmqtpBhs7uTf!r)E^rUg6aoCMtP!V,[YmfDkDrp2`4lKRQskN:pgjQ#:[iS`YO
+hVI#CgY1?5f@SU'eC2jnd*L"^bfe/NaN)<>`5BI.^V@Ip]=PP_[^NR@<;of<2`NZO1,1aG1c$g@
+1daSq5<_7m4?GS_3&ar:7nufVrDEVor`&nrqGR2fq,.2irDN5aqbdDmr_iVjr_i_oqc"_;0J5%6
+0JG@B5X.Cq4?GYc3B/uW2`3KM1GU^D3]T/Y3W:u?3BB5trCm5`#=h?W01&H2;Z0Po;?0Sn;#X>l
+;YsAu<)lt"<E3!s;ta/o<E)pr;cN`p!)i\ms&Aqq!*&qr"B88r;H!3e!*&_n!*&ep!`W)sr)*Mn
+r)EVn!)i\ms&/bn##\Au;,L.dr_a,'<E)mr<)lpt<)lrt;u]bq;u]hq;u0Jo<;]bo<<#tr<<#tu
+<;]Yp<;]\i<<#nn<!?3"<)Z^nr)<Sm!)rkr"&i/u<W#hr;u9Pn<VTVp<W?)$<E<0"<W6#!=T)Cu
+>5qh,>5qb&=9D]0>?^o,!E`Fo=SZ)2<`)Ud9h\2P6q'C'.k*&=2#_XrG4TqUGk6.YG5cX^FT-@]
+ErC"XE$&4b=&r@%<)Z^n;c?Xq='/U/>[1Q??=$uH@:NhZAnM$Ur+Z.F!bl=]rFZmZBl%d3H@CO(
+O->s$TV8-VV50l[TqM@Xs._0AV5C/iWN3,$Wi;qnUS+0JR$Eo"P*(igPEhK)U8P,u\%BGpaj/>d
+g"UG`>lIh0<Dlap;b^'e:^p,o:fLFq='&@$<E)jmpJP3mN/WdXOHG]iQ'Rc(R@B_;StMdOUnjlc
+WN*#$Xfnt7Za@0M\@K5a]t_A!_SjF5aN2NIbg+M\dF-Oof%8R-g=tE=hVd>NioB+]k3(sml0@U$
+m-X60n*olHncA@Srq6<b!;HHes7uZjr;6KkrVc?eJcC<$ZN#F~>
+JcC<$PQ17Rr;HTlqtpEis7uTf!r)E^rUg6aoCMtP!V,[YmfDkDrp2`4lKRQskN:pgjQ#:[iS`YO
+hVHuAg=k64f@JL%eC)ald*Bq]bKJ&LaN)9=_ns:+^V7Co]=GJ][^EL>SKaSnI!0OND.f?+Oc,Bd
+Aur#2UnaZWSsYh.OKGRRG'eq*OmnP4Oo(=APPpaFQ2R$JR/WKRRf&TRRfA`TQi<<MQ2[$EOs,sL
+O,nsCH@ga$@:,h)U7\'KS=,_-PE:]\LPCM;Ko_=Wr/UrAO-#J%]F2?^\$ifTI`?b`KTZ7srK7,C
+s-!MKQ'V<6!1*VLs-E\O!LB)KR0T+IR$j>.R$dQ7rgNhSs-NeTrgEbQrgEbQ!h#FCrg*VPm@"!C
+r0dMN!LK,MQ2d0MPlR'FQ2d'PPEM,nOcfX+s-*JIrKI)@p65N=s,d,=qiL];q2kT<s-!AG!1!JJ
+rfmMMQi*0GPQI/;QN!-MQC.Z?rgWeT!1j(["eVH\T:hnUUAq"gUA^kdU]dEeU7n:[UAghdUAUbl
+Unso`USFW[V#@(eU]@7hVZ3RiW:?i!Wg\E`G]n%FFEih<G_T0sRT]W5q02XZq0Dd\q02g]rcS0]
+s)\3\rGhkIrO;g:+M,5!^r++2aNMiRcd:+heCN7*gtgoIjQ>[ilKdj+nF6>F"nVBZq"k!$ruB[k
+VkpD^Qb/uXP)YciM1UJSYICpP]<JKDY,\VuY$d0HNK0']P*;,qQC+)/S"6.CTqS6WV5L8lWiW>*
+Yd(O@[C3TU]"G\i^VRe)`Pom=aihoQcHjnde'uq"f@em4gtgiEi8N\UjQ5OdkNV6rlg4!*mdKW6
+naZ2@oCV\So`Fj]p\sseq>^<hqu-HkrU^#>s+13Vs*t~>
+JcC<$PQ17Rr;HTlqtpEis7uTf!r)E^rUg6aoCMtP!V,[YmfDkDrp2`4lKRQskN:pgjQ#:[iS`YO
+hVHuAg=k64f@JL%eC)ald*Bq]bKJ&LaN)9=_ns:+^V7Co]=GJ][^EL>JcC6CARSnL=As9]Ch@O%
+<e5dMH[9s]F`MJ?DM*IdBPqp<HLQ:UHN/?cI/\TnJ,XosIK+cqIJA3hHiAEjHQ6O%>[h,N;G_ad
+H?XOTFE2>=DJX*'AS#C^@r#lZD#\;ND#S2MNW+q=NJmdn#`2rPCN"?BI!k^;s*jrsrIF0arda]n
+"G22VJV!fN!eGlPrI=ftrdY'$J:RWKomlpjrI=s!IX_6FrdOlsrdFs!J:W7MIfb.MIf4crIfFir
+IK4fnI/eTtI!^3dHM`'fHiSTjI/\KkI.VdaI/SKkIe\ElIdhjdJ-(:RKD^?$KE$Z(K`-T*L552Q
+!JcL1M>)o-MuAP/MtDu-NW"h*N=h2'Ec>o2B4bglDgc,*77MJprc\*]q0;^\q0;^Zrc\9`rH/'\
+s)S'Xs-3JGs-3PK)jZhYR[g"DU8+Q^W2Q\qXfek4ZEpsI\%'#]]`,S^^;%Fu^qmk(_oL!Je_/g=
+kj%O'o(;VKp\4X[rV-?erV6NkqtpBjs8*&tq"OOUo^_PMncnaZpA"I\rq$./qPfO7MMm%9PCn=3
+G^Oj\EH?\fNJrs[MM[.Eon6_2N/`jYOHPflQ'Rf*R[]k>T:qsRUnsufWiE/&Y->1;ZaI6O\[oGd
+^;%M$_o9U8aN;WLc-FY_daQ^rf@S^0gYCWAhr*JQj5f=ak3)!nlKdg'mI'H3nF?&>o(2MGrq-?d
+p\4[^rqZTjr;6HjrVc?eJcC<$Zi>O~>
+JcC<$PQ17Rr;HTlqtpEis7uTf!r)E^rUg6aoCMtP!V,[YmfDkDrp2`4lKRQskN:pgjQ#:[iS`YO
+hVHuAg=k64f@JL%eC)ald*Bq]bKJ&LaN)9=_ns:+^V7Co]=GJ][^EL><<#l;3&WQK0eYFB1b^aC
+2F9Yn4[)"m4$,D[3Bf`":Jh$frDNPms&8emrDEAgrDEPlo25Har_reoqbd>jr_r_o&25ah0JG4>
+1I+/f5!:tj3'$st#rab!1c%!E2`a"s3!20%3`#]J!D6#a8H^Y49i4mg;uKSo;>sDl;#jMj;uTc#
+<`N*u;cEKk!)reps&0)#;c?Rk;Z'Jm<;BGp;Gg:hp/:rjmoB9a!E)ko<;fbp;ZB\q<<#ks;Ya5k
+;Z9Pm;?g*!;GpFn<W,nm;uKYq;uTbp<W,nr<Vo_r;cNZpr`&eo!E<"s;YX5j;u0Ji;u]es;uTYp
+;u'Ao;cH`q;u]es<W5tr<Vf`"<E)pt<`T-"!*/tu!*K/%!a8f4r`TM1>[1K:>$:`)"'So5>5MIm
+=SGr1>#S6o:/+AQ9LUs,4"Mg37Pt*fq02XZq0Dd\q02g]rcS0]s)\3\rG_sA<`N-ur_i_o&li"9
+>$G6;?!^lG?t!JRA7]@crb24Ds(_RJs(M@D'52)rEHQPTKSYYNQCFJ=Tq\<WU&:QZT:hmPUSOcb
+Vl?YrX/`.tV4sTPR[9;'P*(ieOHPioS"QX[Z*q9[`Q?ERf@ep7hVY/9>$+m-;c$at:Janc:ese\
+;H6at=&r:#;c?LhpekNtMi<XUO-#NgPa.Q%R@9V9StD^MUSO`aW2cl!Xfen5Za7'J\@K2`]Y;.s
+_Sa@3a2lBGbg"GZdF-Lne^rF+g=tE=hV[8MioB+]k2tjkl0@U$m-X60n*ol;o()DEo`"Lbp@n=\
+q#:*hqY^6hr;HTcrdk*#s0M`U~>
+JcC<$PQ14QrVc]mqtpEirqZNfs7ZNerUg6aoCMtP!V,[YmfDkDrp2c5lKRQskN:pgjQ#:[iS`YO
+h;-l@g=k63f@JL%e'cXjcd'h[bKJ#Ka2Z*:_ns7)^V7@n]",>[[^<BHqjegXFa%kECRplVMMdL[
+XfAD!US=?PR@'8&A=M(gH%M.WOmeJ5Ont7@PPp^GQ2R$KQi3<NRf8`RRK]+HR$X/*rg!MJ!0d8B
+,a"1?I!U<sJRVu`US+6OSt218P*(cbMi!1CKnb_PO-#KcO,s7$rO`0C])B)BD6%u2KTVDrP5ULC
+P5^XHPa.O1QN<D;rg!PNrg!PNrL!YQqjIDMpR1rJ#aq-LR@9S4R[O/BrgEeR!1EhRrg*\SR[W`6
+rgEnVR[O)@s-E_Org!JKp6GT@!0dAEs-*JIq31f@oofB<rfI&=r/^o>qiUZ8rK.2FPE_=/QN*6H
+Q2m3IPQI,:Qi30OQ^O;2rL<hW"J)'QSY#eP"JDBZTV21V!i)KarhKFfrhKIdrh9FeUACVcUo"'d
+rMBLgrM0FirhfXlqPa1g!35mps/H^2Q[O1'F`25@H&ShEH<!t3=^:lKrHS0ap3QR\rHS0_s*"Ba
+rH/'\s)S-Zs0r$<+h>1s^;7_+aND`Ocd:(ge^i@*gYCWCioT=dl0@U%n*oiEnHJLTo_&"V\GmQF
+s/r;uV4s'>V4X$6PEUr^J<H_4\@fJZYctL9or_Y[N/`m[OckonQC!u,S"-%@TV8*UV5C/iWiN8)
+YHY==['mHS\\#Mf^VI_'`5Ta;ai_fOcHjkbdaZguf@\d1gYL]Ci8EVTj5f@bkNM0plKdg(mdBQ4
+nF?)?oCMVRp&F^cp\jmeq>^<gqu6NlrU^#>s+13Vs*t~>
+JcC<$PQ14QrVc]mqtpEirqZNfs7ZNerUg6aoCMtP!V,[YmfDkDrp2c5lKRQskN:pgjQ#:[iS`YO
+h;-l@g=k63f@JL%e'cXjcd'h[bKJ#Ka2Z*:_ns7)^V7@n]",>[[^<BHqgff$?t!>C<crCuAnZ%!
+Jq&5sH?jXUEcH&:;0\dHCNBB"msFhUs*ONgs*aiprdXor!.XusrdFTirHnNkrd,Pk?<^iJ@8]sN
+H['aYG'%\DE,B?+BkM!fA7PUTs)%aNs(q^N!0-u<%#p4&Mi!9kJSK+GH[Ga>pjN0ks*srsl[f%c
+pOW9pqLSWr!e5`Nrdb'"rIG'$It3(KJbjonJc:0%JUi6!rdXlqrdOuuIt7NLr.+]pqgSEis*aop
+!df6>qg89hrI+TkrHnKjom?[cr-eHkpj`<mn:1Ces+16'r.5!&KSBAXrIt9+!/L<)s,$Q-rJCE/
+s,$c5!/pc4qhtB2s,6`4s,Ho7q2GB7qMkN8&rhK_E,B?'Anl("K3qnQ7s@[&r-/*aqK_d\qK`$a
+qKMs_rcS0]s)\3\s)J(&rfmGJ)jZk[S=Q=IUnsufWN)u"Xfnt6ZEpsI\%'#]]`,SE^Abk\^qmn)
+`5p0Le_/j?kj.X(nalDGq=ag^!;QNg&,Q2#r;?HhqYBp\p\"1Lo)/"^oCVbOq>:-\ruJrHPDtNY
+LO4Q,JphrjI!BaOI>3]AOH>EYMM["=p4Qe2N/`m[OckonQC!u,S"-%@TV8*UV5C/iWiN8)YHY==
+['mHS\\#Mf^VI_'`5Ta;ai_fOcHjkbdaZguf@\d1gYL]Ci8EVTj5f@bkNM0plKdg(mdBQ4nF?)?
+oCMVRp&F^cp\jmeq>^<gqu6NlrU^#>s+13Vs*t~>
+JcC<$PQ14QrVc]mqtpEirqZNfs7ZNerUg6aoCMtP!V,[YmfDkDrp2c5lKRQskN:pgjQ#:[iS`YO
+h;-l@g=k63f@JL%e'cXjcd'h[bKJ#Ka2Z*:_ns7)^V7@n]",>[[^<BHqc*ST*AoW.0fV$G1,(L@
+6UF(%5!;"i3]T,X/O*6.:ejpf;?'Pn;uK\q;u0Dl;>O2f;#jM`;>sJm;uT\l;>sJm;uTbr0+9Ed
+0ekRC5X7Fp4Zkk+3X[o-2`3NO1GgjG3]['s(-+E9:JFMV9hS,O8P(Hs9i4kg;cH[or)*Mlr_WVl
+qG[;l!*&nqqc!Vq;H*Qor_rhr"&i)p;Z0Pm<;BJl;Z9Vp<;TVo;ufqt<qB<)<)Z^p;c?Xq<)Z^p
+;c?Xp;c6Omr`&SirDNYm##\Au;GpLpr`&kqs&Aqqpf%;p<)rco!*/qr!)rhqs&K"srDN_r;uKSo
+;u'Ap;cHasr)EMkr`&kp!)r\ms&/nsr_rPjr`/nt"'&<"<VKMo=8Z5$>5qh+=p%u6>?_#/r)a#(
+>?gr,nlYTgs&p%<;bp1a9h\5R76*Xo/LN,>1cP>VrHS0ap3QR\rHS0_s*"BarH/'\s)S-Z!E<"r
+;ZBZ1<``F->?kK@?XI2K@Uiq[AS,RgBk[EYs(_RJs(MCEs(E*\D/scEIY<Q=P*VQ,StMdOU7e0O
+rLX%]#GIleUo(&gWW&nbW2HGcT:D@;QBRJnO,oBbPEqZ1VQ6u0]>2D-cI(4qg>1WCi8S@C>$4s0
+;c6Om;GU%`:esk^:fLCo='&@$<E)jlpeq,h?]0l&O-#KePEhH#R$jG6SXuLJU84W_Vl?\sXfek3
+ZEppH\%0&]]Y2(q_SX71`lQ9EbK\>Yd*^:ke^i@)g"P3:h;@/KioB([k2tjjl07L!m-X6/n*fc9
+o()DDo`"O`p&Ojcq#C0iqYU0hr;HTcrdk*#s0M`U~>
+JcC<$PQ14QrVc]mqtpEirqZNfs7ZNerUg6aoCMtP!V,[Ymm6C/m-O'(lKRQskN:pgjQ#:[iS`YN
+h;-l@g=b-1f@JI$e'cXjcd'eZbK@rJa2Z*:_SX+'^:h1k\[f2X[C!9GqjedSG&heDB:P9JLl[U-
+Xf/(lV50cUR[02"Z-Ab^J;X8ek`Yk-s-*MKqj%8LR/WNJRK]+HR$X/*rg!MJ!0d>Ds-"7^J9c`u
+JV7E;V4jTTSt)49Q'7>kNJWGiL&cr,NrtK+OH9C&!0R2l!4i';#%FHRI"RQDr0%#@rfdAH!L8uI
+Qi33MQi33QR$j>0R/36LR/!*ARKAnER/WKSR$[];!gf:BrgEkURe3$GRfAfUQirhER$X3>Q2m3K
+QMm*KQMd$IPl6dEP67&5PEc'1!0mGG!g8e4r0%AMPEM,nOcbb'O8b4DOcYWcP5LIAOT1IAO9^o0
+OckomPa204rg!8Er075Hr0@DOR[X2Es.'+[s.'+\rh'+]!29=b!McCgU\U\eU7n:YUAgniUna]\
+rMBFh!i2TdrM0FirMKRlrM]Cgs/H+!Wr8pqWY;=uIsZB^EcZ_TMo^a&<E5Dg??cBnrH[RPrH\Be
+qfi'`s)n6]-?F3JEO`Qk]YD>%`lQBLcd:+he^i@)g>(NAiSrq\kiqC!mdKZ7r:'s]oCV_Oqm?AB
+af2/6VO<j_U6Uk'QB-rYL7PHU[Cs/VYHb72or_GVNK0']P*2&pQC+)/S"6.CTqS6WVPgAmWiW>+
+Yd(OA[C3TU]"G_j^VRe)`Q#s>b0/#RcHstee'uq"f@em4gtgiEi8N\UjQ5Odkiq?slg4!*mdKW6
+nc&([oCW%Ts7ZKerqQNhrqcQirVZWmoDX=@JcE+WJ,~>
+JcC<$PQ14QrVc]mqtpEirqZNfs7ZNerUg6aoCMtP!V,[Ymm6C/m-O'(lKRQskN:pgjQ#:[iS`YN
+h;-l@g=b-1f@JI$e'cXjcd'eZbK@rJa2Z*:_SX+'^:h1k\[f2X[C!9Gqgff!?s[/?;fcklASc0_
+Jpr)lH?j[VF)c,7K:.+%DKbr(msFeTs*ONg!.FfpqLAKnrdFfo!.FcmrHnKj&pmti@:3JP;,DXb
+G]n7PFE2>=rbMdOA7T7^@r)!Y!,MOL!KN0=NW>%:M$?e+Bl8$>HiAEhI/n`qI0+kIJ,FioJH1;m
+JcC9"Jc:9!Jc:8rJc1,tJHp^VJqAW+JUmZL!J#b"JGOisJGt*"JGjusIfFltJGt#uJGk&uJGaoo
+IK4fnHiSToI/\HiHi8<rI=-EjI=-D?I/eQkI/A6jI/\KkI/A?hIeeKmIdqmfJGk$!K)L?%JcgXY
+Kn]JYre:B,!/LQ0!/^Q.!/^T/qhb3-reUZ5Mu8J1Mu/J5Mu/J4NVe\1NW5">NK3ssrJhPMIrTFD
+CM.<sBPs)M?:7;-9Mfs4Gl;pNHMr-gGl)^bG5l^_F<kpJEcI>.Q'I](S"-(DU84ZcWN*##Xfek3
+ZEppF[^WfY]=biV^Akq^^q[\%_o0X@dFR%0jQPpsmd]l>o_J1[p(d>sq=sd]qYL*er;6Bfq=saZ
+p@RtIr:(!_o_%tSqu,s_*;lOlMi<ICJrtY5H[C0eG&q_UM2dIVO,AdNLP>DS=cA?#O-#NfPa.Q%
+R@9V9StD^MUSOcbW2cl!Xfnt6Za@-K\@K2`]tV7t_Sa@4a2lEHbg"G[dF-Lne^rF+g=tE=hV[8M
+ioB+]k2tmll0@U$m-X60n*olHncA@Srq6<bs7cNfs7uZjr;6HjrVc?eJcC<$[/YX~>
+JcC<$PQ14QrVc]mqtpEirqZNfs7ZNerUg6aoCMtP!V,[Ymm6C/m-O'(lKRQskN:pgjQ#:[iS`YN
+h;-l@g=b-1f@JI$e'cXjcd'eZbK@rJa2Z*:_SX+'^:h1k\[f2X[C!9Gqc"%b2)I*D/iPUC0JbLC
+6U1Q5%6cp:3]K&W5>+I?:/Ojd;>sJn;uK\p;tEoN;>sJm;uT\l;>sJl;\rCd/het61Gq$T5!D(k
+4Zk_c3&rrX2)bFi"Z/5"3&s"u3!;9(3_rNM9`I`j8kDT(5Yb-Sr)E\pr)*\q:f("d;Z'Gn<;onr
+<;ohn<!?2u;H$OorDW_q"&_un;Z9Vo<;9Dl;Z0Mo<;TVn<;]bt<EAcmqGdGm"B8;u<)ifprDWhs
+;H!Hl!)iepr_ibnrDEYq<W5ts;uBSp;tj5l<E&`ns&K"ss&/ntpJh,j"]SDt;GpHg<;'>k<<#ns
+<;ohj<!ZE%<)Z^p<)Z`p<;fbq<;fht<W5ts<Wc?&=',?&r)s&'!*fD*"C#,8>$Cl-rE')'>5;=n
+=Su;'>$5&-=oDM;=Ar*o9he8U7R]=.0eOe,75d/MrcnBekBd)Prcn<as*"Ebr,`m!EcQ.s;GpFm
+<`iL.>[C`D?t!JQ@Uiq[AS,TRB`2ZFCB%uJB`;ZEB`Dc[DK9oHIt`c@PF%c0StDXJTV%gHrL?fW
+StD^MUSOcbWN)ttVl$8aT:MF;Q'.8kO,f9`PEhT/V5gc-]"c5*c-b(og>(QBi8N_ViN?Kg='8R&
+;HQak:f1"b:/=V_<)lq"<`E't;c$<d;Z9NrN/`jYOHPckQ'Rf*R[]k>T:qsRUo(&gWiE/&YHY:<
+['d?P\[oGe^;%M$_o9X9aND]Mc-F\`daQ^rf@S^0gYCWAhr*JQj5f=ak32'olKdg'mI'H3nF?MK
+!V>s_p&Facp\ssfq>U6gqu-HkrU^#>s+13Ws*t~>
+JcC<$PQ14QrVc]mqtpEirqZNfs7ZNerUg6aoCMtP!V,[Ymm6C/m-O''lKRQskN:pgjQ#:[i8EML
+h;-l@g=b-1f@AC#da?IhcHa\XbK@oI`l5p7_SO%&^:_+i\[],W[Bm0Dr1+pSFa8.KC7UiXO,o<b
+XfeV"U8"?PR['2'CQk62I"ROZOm%u)PQ-mIQ2[*LQiEHPR/i]TS,8ZSR0/hCQ^7T8rfd>Es-"UY
+I>!0'K3hi[US=?NTpqI<Pa.>gMi!1DL5(hQOH5KbO8b4AOhL_+!P5f?[g-9CGC+t*P*,X)rfIGK
+PEV5qQ'Ra4Qhm$FQN3ELRK&ZRR/i]RRJWEQRJNBPR/iWRR0&bBQhm*GReiETR$jA2RJ`NNRJrQR
+QhZmHQ2d0JQ2d*JP5pdFP5pjHP6-u4PPpaFP5pjFPQ-jNPEM)mOc]L%#`t11Ocb`eOco[*rK.&A
+qiCrDPEV5rrg*SL!g]+:r0@>Jrg!VNPa)-3rKdJMs-WqWS"'DIrga+\SY#hQqk3k]r1j%_qkF(b
+!2TRipne%fr1s@hrMKOkri#gq!3#^mrMogqrMomu&uL_<G][nHG(+\C_hi5/<L6iqrH\*_om?FZ
+rH\Ber-/0as)n9^s)T6n]thP(a3)ZQd*gFof@S^0gt^cEiT0.akiqC!mdL/Erp^3^o(2MIq>@T!
+*;0?5W26DaQ(ak>Q&q;oMMZqIV6RPC]Wn`G[&ir'?]0l&O,oEdPEhH#R$jG6St;UKU84W_Vl?\s
+Xfen4ZEpsI\%0)^]Y;.r_Sa=2a2lBGbK\>YdF$Fme^i@)g=k?<h;@/LioB(\k2tjjl0@U$m-X60
+n*oi:o()DDo`"Lbp@n=[q#C0iqYU0hr;HTcrdk*#s0VfV~>
+JcC<$PQ14QrVc]mqtpEirqZNfs7ZNerUg6aoCMtP!V,[Ymm6C/m-O''lKRQskN:pgjQ#:[i8EML
+h;-l@g=b-1f@AC#da?IhcHa\XbK@oI`l5p7_SO%&^:_+i\[],W[Bm0Dr.,r$@q8nL=*/J"BkqL%
+Jq8>tG^4OUEc?#:<HW\(DKC1'HL6(RHN/?eI/eWoIK4lsJGXirIKP"GI=;'Aqg8?j*+E5a?t!M?
+:OIG5G'8+PEcH&8Chd]tAS#C^D/K5f!,MOLr/M2EMM[1I9nR(rFF8I_rd=Qj!.Ooq!e,WKqgeWr
+rdk0%K)1#uK)C0"JGt,uK)U?!K(sluJ:W7LJHCFSK)UB&K(sosJGauuJH(0#JGk$*J:E*!Isuls
+J:RWKqLJWsrI=Zms*ain!.Fio!I]@lHiABmIJnNsI=-BgI!kp?r-SKkrHn]oI!^5=I/JElIK4ls
+IK=qKqLANor."Wns*suts+1'!!J?()K*6j]L4t<XL&Zl0LPUbCqhP90MZ/J4M#E2*MZ&D+MuAV4
+Mu/J3NVnb2NW"n9NW+qQNK0$VHZ3n>BkV3rBSVjf<^]H%9i1e6p3QCYpNld`rcn?bs*"EbrH/'\
+*gN%XR@Bb?U84ZbWiN5'Xfek3ZEppG[^W`V]"G\hrkAEI'u7T#_Sa@7cI1>!i8s4imI0W:oCV\Q
+oa19`p%J+Rq"X[\rqcWks8!&tq"XRUo^_SCnc&"^o(2PJq>1$UrsQI+OH#0WKm\T-JURNE%X)u7
+I>*W@OcbQZM26h;p4Qe2N/`mZOckonQC!u,S"-(ATV8*UV5C/iWiN8)YctF>[C3QT]">Vh^VI_(
+`5Td<aihlPcHjnce'uq!f@\g2gtgfDi8N\Uj5oFckNM0qlg4!*mdKW6nF?)?oCMVRo`Fj]p\jme
+q>^<gqu6NlrU^#>s+13Ws*t~>
+JcC<$PQ14QrVc]mqtpEirqZNfs7ZNerUg6aoCMtP!V,[Ymm6C/m-O''lKRQskN:pgjQ#:[i8EML
+h;-l@g=b-1f@AC#da?IhcHa\XbK@oI`l5p7_SO%&^:_+i\[],W[Bm0Dr)E\[*'Z570K1mH1,CaD
+6pX%#5!D+k3]]5Z.6^6s:f.'er)3MmrD`eqo2=dLr_i_or_iYkr)3Pn(,@Kr0JP:>2*aAh5!;%k
+3&ioX3&WWPr\Xg83]]5\rAXp@4$$/5r_*Vk8kMWF-pg[+;>O8l;uBPm;#jMk;ZKer<W#er;u9Mo
+;uKSs;cH^p;uT`";Gg:h;cETnoi(ihr)<Pnq,[5i!EN4u<;ohn<;ohq<!#ut;uT\p;uKSs;c6Lj
+;>jAn;cWfrrDWGis&B/#<E)rs;u9Po<<6'!rDWbspJh/k##nN!;,gImpf.2ls&Stroi1lir_rr!
+<)`cqr_j&$;c6Om<)clr<rQ))<``=%<``@*>5MIt>5qh.>?^o,s&]>*>$Ci,o2tonrEB/&r`U%>
+>$>$+:ej_[92.iD5tWma-7qYF3W46sHM)XZHMr-gGl2dcG5l^`FT6F^;?p0%=B\p7?=3\?s'cXO
+A7fCbAnPdkBkV3oBk_<sBk_8[BE)WRBkhO,GC+jqMia0iRf8oXT/rO5S"#k8S"-%?T:hpQUo(&g
+WMl_kUnXKPR[BD(OH5E]Nf]HiR@^4RYI(mT`5p0Me_&U2hV[8Mir7sUib+3R=BAU':fL=h;,L.e
+:/4MY;cHau<`K&u!E)_h;Z9O#Mi<XVO-,ThQ'Rc(R@B_<StMdOUnsrdWN*#$Y->.9ZaI6N\[oDc
+^;%J#_o0O7aN;WKc-FY_dF6Uqf%8R.g>(N?hr*JQj5]7`k3(smlKdg'mI'H3nF5u=o(2JFrq-?d
+p\4X]s7u]kqtpBjrVc?eJcC<$[/YX~>
+JcC<$PQ14QrVc]mqtpEirqZNfs7ZNerUg6aoCMtP!V,[Ymfi.Hm-O''rolH,kN:pgjQ#7Yi8EML
+h;-i>g=b-1f%&:!da?IgcHaYWbK7iG`l5m6_SO"%]tCtg\[])V['R'BYl:19HZaOWF`;8gPE(K\
+OD(bqV5C&^SXu:9P*">LV0INLP5UO4OoUX?P5:CBPlI$JQN*<OQi`\EReiNQRfAcYR$X/*QN!0K
+PQ-diPCnC5JqJ\_@AT`mT:V[ES!]G%OcGBWLPLS<PECuhOcYY'O8tFB^&P_G]".gL"^\Q\H\7IV
+P5LFKP*;)oQ'IZ$Q^7T:qNguE!1<VN!1<bRrL3bSr0mVQqO7AN!go=@qNq8Nq3q)HrL*eUR[X5D
+!1NnTs-NeQoToNBs-*MKrfm;Dqih)Er0.5GPl6dJP`q>qrfR>HOcfX(s,d)>s-!,=r/_2HPE_8p
+Q'IZ$rfdDJr0@>JrKdJJr0@8Is-EeSR@=,Es.'%Y!h>gQrh'4as.B@crM'4bqkO4grhKRiUAL_c
+V"geeVu<LgV>d@jVuEXoW;rmmWVrjqWVidrWt_S0MgT_jEcZDPGc%3h?W'jl=^\6+HMW!\I/A9d
+HN/9iGl;jcFoZ[`F<,G@`lQBLd*gCnf@S^0gt^`DiT'%^kiqBum-jH5qsj^X"8)<`rNH5@^T"-0
+U7%IMU6Uk*QB$lWN1[2Z[Cs8YYHk:2YPPF#XoF>]NfT9bP*D5tR$jD4SXuIITqeE\Vl6VrXKA\1
+Z*UgG[^`lZ]Y2(p_8=.0`lQ6DbKS8Wd*^:keCN7(g"P39h;7)JiT&tZjlYail07L!m-O--n*fc9
+rpg*]o`"O`pAamdq#C0hqY^6hr;HTcrdk*#s0_lW~>
+JcC<$PQ14QrVc]mqtpEirqZNfs7ZNerUg6aoCMtP!V,[Ymfi.Hm-O''rolH,kN:pgjQ#7Yi8EML
+h;-i>g=b-1f%&:!da?IgcHaYWbK7iG`l5m6_SO"%]tCtg\[])V['R'BYl91RB)Z<\@p`P^D/*^!
+D,u7;H[:!^F`h_EDJZ2GJo#FPHi89VHh_peHh`!gI0+kIJ,4]pJ,auqIK"WkHQ$@$?"%/O;,M^e
+H$=FTFE2>>Ci!m%B4baeAH$HOCi+!)CMdm'r/M,CMi*@K98."rF*me3qgJHms*XlrrdOs!J,Oos
+Jbt&rJcC>uJbt'!Jc(,iJHCFUK)UE&K(=KlJGk$%J:W9%JGjutJGjunJH16!J,as%IsuirIXZ_E
+I/A?lI/J?fHi\YCrd4Wl"+,ECIJeHmHi8<lHi/9jIJnTpJ,OirJ,aurJ,ausJ,+NnJ,FfsJbt$"
+K7s5V"b_SaL4t<YL&Zl.LPYqds+pW1s,-c3re^]4reg`6rJLQ1!/gZ3!K;s8N;AJ3N;JV4N;8J3
+Nr=t5NY@7nEG]N*B5;6rJ:2$'6UuAp;2+mnqKqj^qg8-bs*=TgrHJ6a!-S6^)KV@;T:r!UVlHi#
+Xfek2Yd(OA[C3NQ\[f;`rk/BI^VBc`(W!u,`QHKSf\GHJl0Rg+o()DEp%@tKoDS:_p%J.Yq#C-i
+qYpBlq@i]"q"FCQoCDGAnF,i9oCVbOqu#^Y*;>n^N/i[EJVo,0H[C3dG&qkYM2[FVO,SpOL5#GV
+rIb-/=,r?'P*2&pQC+)/S"6.CTqS6WVPgAmX/rG,Yd(OA[^N]V]"G_k^VRe*`Q$!?b0/#ScHste
+eC<($f\,!5gtgiFi8N_VjQ5Oekiq?slg4!*mdKW6nc&([oCW%Ts7ZKerqQNhrqcQirVZWmoDX=@
+JcE.XJ,~>
+JcC<$PQ14QrVc]mqtpEirqZNfs7ZNerUg6aoCMtP!V,[Ymfi.Hm-O''rolH,kN:pgjQ#7Yi8EML
+h;-i>g=b-1f%&:!da?IgcHaYWbK7iG`l5m6_SO"%]tCtg\[])V['R'BYl7T(5!M1or]:rT1G^^@
+1GqHa5!;%j4$5P_2E+W785)cWr)*;gs&8hps&8hn!)r\kl;@LXr_rbnr_`Pj(GIKp1,(F@1dF8f
+4Zkhg3]T2[3B/oU2?#E@4$#D_3&iiW4$,K!:]=#o91hiJ81-Yu;,I'f!)r_ls%rboqbmPq<E8Zj
+!)rho!)rkr!)rkr!`Mupr_r_ooi(lirDN_p;uTbr<V]\j<W?)"<W,ns;[$-#<)ZaqrDW_q!`Muq
+r)*Po;Z9Mn;u';l<)rosrDWYo!)rhq"]\T(<E3#t;[-3$<)cdq<;fhs<;onn;uooqr_iqt;,^Fn
+rDWSmrD`huq,R,fr)Nbrs&B/#;cH`q;u]et;H*Nn!EE1u<=)]-=&i7%='/X0r`T)$s&fG-=^#&/
+>5VP&=T;S(=n5\l=oDP&=TDY(=oMS<=&Ddi9hn;T77KU00e+J$7Q3>+qg/*coR-O_q0N'drcnBc
+rcS9arH&?e='/X2?!guJ@fBm;A-cdYAnPdjBk_>]C&_rJC&_lGB,5/pBkhR-GC4ssN00?lS"?4D
+T:hdGRf8^4R[KY7S=Z=FTqeE[Vl6MjV50fVSXPn1P)t`bN/`m]PaJ#:W3<P<]u.q8d+$\$gtpuI
+iSsjss5G*Xc`18R='8R$;H6Xl:f1%c:JX_`<E3(%<`N-t;Gd0drD<NQ=,r?'P*2&pQC+)/S"6.C
+TqS6WVPgAmX/rG,Yd(OA[^N]V]"G_k^VRe*`Q$!?b0/#ScHsteeC<($f\,!5gtgiFi8N_VjQ5Oe
+kiq?slg4!*mdKW6nc&([oCW%Ts7ZKerqQNhrqcQirVZWmoDX=@JcE.XJ,~>
+JcC<$PQ14Qr;HWmqtpBhs7uWgs7ZNerUg6aoCMtP!V,[Ymfi.Hm-O''rolH,kN:pfj5].Xi8EML
+h;$c=g=b*0f%&:!da?FfcHXSVb/q`F`Pod4_SEq#]tCtf\[T#TZa6p@YPt*mGT:jLF)Q&;FDd,"
+P,ta`VPBrXSX>\,P)Q''G^P;GP5g[5P5g[CP5g[EP5:@BPl?sHQ3*D?RJrZQRfT%KrL3bS#+1aC
+QBd`"rf[GIKn"LLK*#LhVuED/StDUCR$<_qN/`XLL4t;COH>NbOH5HaOHG\)]aMKb\[],XJ$PDe
+K9>ql!g/S+rfI>HPEV5rr0I>Ks-<YOrg*>G!1<PLqjI\VR[KS4Rf/ZNRf8]VR$X0<R/`QUR$jB<
+ReiHNRf8`TRKAnGRf&QRQh-LDQ'D64s-3JGoT]B>%@!'?P`q>rPEM)mPEM%,O8k=>OTUc/OcoF#
+s,d8C"-\t5PPpdGPQ7!CQ3!88qiq/IrKmPPs-`tXSGo)XT)PA^T`:\dTV;@Z!MQ7eU\U_bV>6nd
+V>7"eVu<LjV>d@kVt[.dWW0!pWW&psX8f18WM,#mF`_SDGC+M*PbD#T<1R/nWd9!iHi&3^IJ\Ej
+Hi&-gH2i-fGQ2jdFoQP(aj&/Ze(*(&g"P39h;@/MjQ>[jlKdg(n*oi:naQPJ"nM<Xp\OlkrrMAb
+rhgR(QD^FDP`qGqN/3:ZVm*\C]X"fHZE18+Y5GD.N/`mZOckonQ'[l+S"-%@TV8*UV5C/iWiN8)
+YctF>[C3QT]">Vh^VI_(`5Td<aihlPcHjnce'uq"f@em3gtgiEi8N\UjQ5OdkNM0qlg4!*mdKW6
+naZ2@oCV\So`Fj]p\jmeq>^<gqu6NlrU^#>s+13Xs*t~>
+JcC<$PQ14Qr;HWmqtpBhs7uWgs7ZNerUg6aoCMtP!V,[Ymfi.Hm-O''rolH,kN:pfj5].Xi8EML
+h;$c=g=b*0f%&:!da?FfcHXSVb/q`F`Pod4_SEq#]tCtf\[T#TZa6p@YPs(oAn>F^@UEMK?X%;]
+Ck7(bI!U*]F`VM?DJOWHCN"=oHiJEVHhVjdHhi$iI=D0Fs+('!!.b#t!.Oiord=Zk!b5SDraH%/
+;13b9H2_ssEcH&8Chd]sAn>L_Ci+%eD#\>QCMj$1$B:"%MMYYmI;X+QqgA6gqgSElrI=m!o7Hdh
+qLSm%Jq8K)K(=KmK):0#K(=KmJGk&uJH(3!J,OosIfP#pJc:0#It%9Es*ausI//0jI/\HoI!^5<
+I/eTrI!^5:HiSTnI/eNpI!^5;I/\QmIK4lqIfForIK4orJ,"KmJ,OltJbt&tKE$T+Knb?]K`Hl,
+L&Zl3LPUeDLl$udMZ&D/MZ/P6M?/QkrJ:N3qht<0qhtH4s,R&;qi(B2s,Qr8pl6)FG&V;7B5)-s
+Bmk/K77Kak9hU4eHMr3fI.Md`I/SEhHN&3iGl;jdG5l^bF;LUEUo(,lXfeh1YHY:;['d?O\@B)\
+]=e-V!5ABG(W"#-`QQTVf\PQMlKms.o()DEp%@tKo_n@_o_%qWpB13dq"aja'D_Fup\"1MoC;>=
+mdBT7oC_nUr9+(eca/^nNf8[CLkC3VI1:IGF``+fNK9-_N/EIJpk8Qt?Asl)O-,ThQ'I]'R@B_;
+StMdOUnsrdWN*#$Y->.9ZaI6N\[oDc^;%J#_o0O7aN;WKc-FY_dF6Uqf@S^0g>(N@hr*JQj5f=a
+k3(smlKdg'mI'H3nF?&>o(2MGrq-?dp\4X]s7u]kqtpBjrVc?eJcC<$[Jta~>
+JcC<$PQ14Qr;HWmqtpBhs7uWgs7ZNerUg6aoCMtP!V,[Ymfi.Hm-O''rolH,kN:pfj5].Xi8EML
+h;$c=g=b*0f%&:!da?FfcHXSVb/q`F`Pod4_SEq#]tCtf\[T#TZa6p@YPqKB5<_4n4$,Jb3]JoP
+1djVn4Zttk4$#>[3&*]g:Jjsa;>X8j;uK\q;uT\o;u0DX;>O2i;uT\p;>a;u0eP(40JYRD5sYE4
+&3;p93]T/[2E*NP1,UmK3BI.""ueP(4$#H!rCm5a#"_?75tt3Qpf%5lq,7#e!`W0"o2Gfj;GpHg
+<!-&s;cN]os&AYis&Aqqs&&ns<)iisq,[>lrDj/&;c?Xp;cH`q;u]hr;u]es;u0Ao;c6IirDWVl
+!`N)uqG[Dn"&i/t;uTbr<W?)#<E/rr!``3!r_ierr`/tt"'&<"<VfYp;u0Al<;BJh;uftp<W,ns
+;u0Jl<<6&tqc*Pn"&r2s;uBVl<W?,/<`N.$=BJ^.=BSg2=oDP%=o2D$=oVV$=o)5#=8Z1s=oV\!
+=oDM>=]eNr:JOPV9h%Q:5W'r</OhZT;gNcgHi&3^IJ\EjHi&-gH2i-fGQ2jdFoQOt>$YKC@:NeX
+@q9.^AnP^gBPD0qCAqrICB%uJB`)KPBkhF&FEi4cLlIR_R%4/Is.9CbS=,fDQqs0?S"6.CTV8*U
+VPg;fUnaWTSXPn2P)kZ`N/N^YPa7l7W33M;^;J%9dF?e$gYUlIiSrnYj5].Xhqm10='A^0=B&-u
+;,0td;G^.a9i:mi!EN2!<<H2t:f.$dr(p^YNK9-_P*;/rQ^F21S=Q7ETq\?ZVPgDnX0&P/Yd1UC
+[^WfY]=bkm^r""-`Q-'AbKJ/UcdC.heCE1&g"P08h;7&IiSrnYjlY^gkiqBum-O--n*fc9nac8B
+o^r.U!quB_rV6Egs8)Wirqu`noDX=@JcE.XJ,~>
+JcC<$P5k.Qr;HWmqtpBhs7uWgs7cQerq-?boCMtP!V,[YmptkRm-O''l07EqkN:mej5].Xi8EML
+h;$c=g=Y$/f$r3uda?FfcHXPUb/hZD`Poa3_8*h"]Y(hd\@/iQZa-g>Y+;,&GBJ"KEc5o9F)Gf,
+Auqo.U8"<OR[BA(N:5,UG_2(DP5UOBP5^UDP5CICPl?sIQ33J@R$moA!1WnV!1WtVs-WkSrg*SL
+!0mJH(4gsfJV&P\@&BZmT:_XCR$X&%Nf/jPre:Q0OcYWbr/gr@r4NHJ\@/kfVk/3dO-04#!g/S+
+rfR5Ds-!JJQ2HpJQi<<NQiEBGQN3EKRJE<NRK&`SRJ`NQR0&bBQi*6MR/r\Cq3q,IrgNkTqO7AN
+!13DFs-NbO"I5:=Q'M?5rKI&As-3YMPEYj-s-!GGrf[MJOH>NbOT(@GP*(liOcfX+rfI2Dq2tT>
+rK[DI!1!JJr0RDKqiq2JQi<BPR0B%KS=H.@rgj+^r1O"^rh9OhU8"EXq5""d!2TRgrM0FiqPF7j
+ri#jps/#gpVZ*FkVZ*LeVu`lror7tkqlB^r(9=O,IscE^F`r.YG+FMZ;,pSb=]\aQr-[^VrI"Qj
+r-JBgs*4Kds*"Eb(j+3Vf@em4gt^`Ci8WhZkNV9tlg=-/nF6DH#Oq9SoC_nUri5u;\YuI/Tp:t?
+TTkV+P`CWUPGP=f[D0G[YHt=2qQBaus,:$>O-#NfPa.Q%R$sM7StD^MUSOcbW2co"Xfnt6Za@0L
+\@K5a]t_=u_SjF5aN2NIbg+P]dF-Oof%8R-g=tH>hVd>Nj5]4^k3(sml0@U$m-X60n*olHncA@S
+rq6<b!;HHes7uZjr;6HjrVc?eJcC<$[f:j~>
+JcC<$P5k.Qr;HWmqtpBhs7uWgs7cQerq-?boCMtP!V,[Ymn3$8m-O''l07EqkN:mej5].Xi8EML
+h;$c=g=Y$/f$r3uda?FfcHXPUb/hZD`Poa3_8*h"]Y(hd\@/iQZa-g>Y(;.6ARf1X@JsLI>?P!,
+JUVulH$+7NEc>o/^7'@`F*ZhnpNlgcq0W3kIf=fsJGk$#Jq8IOJ,=ZnI/\I.?sdAN@Ui52I<g*^
+G'%hGE,TT.Bkh8YAGL$CDJX4gNXC]%M2>8^Ir9=RHi&3iI/n`qIJ\KiJ,OohK)1&mK)U?$K(FNn
+K)(&iJc:3!JcC9"JHLFPJ:[WKs*k$!pOW?p!e5`Nr-n]qpO3!fs*ONg!.4Wk!.F]ks*FfpH[G[<
+rdF`o!.X]k!IoXuJ,=ZpJ,XlsJ,FfsJbt&tK)gVuL&m'cr/(?/!K2j7M>W82MZAY6M>rJ5M>`>2
+Mu&A5NK!dnrepl;Nr=t7Mueoso8WR+s,RnVKlM!HCM@L"C1hs7E^WAeGYUn,Hi/9TIJnQlHi/3i
+H2i-fGQ2jdFW#;!X/rJ-YHY::Za@-L\@B)[]">Sf]tV1orP'2b_8=.1bg=kmhW*eam-aB5o(;SI
+p%7kJr::3dp%J+Rp\=OZrV@6(q"XUWp%7kInaQ#8mdK];p%\C]jo6=us-Se)Ne`%5LkC,&IX??_
+F+&duNK'']N/<CFq1SZus,:$>O-#NfPa.Q%R$sM7StD^MUSOcbW2co"Xfnt6Za@0L\@K5a]t_=u
+_SjF5aN2NIbg+P]dF-Oof%8R-g=tH>hVd>Nj5]4^k3(sml0@U$m-X60n*olHncA@Srq6<b!;HHe
+s7uZjr;6HjrVc?eJcC<$[f:j~>
+JcC<$P5k.Qr;HWmqtpBhs7uWgs7cQerq-?boCMtP!V,[Ymq2"Tm-O''l07EqkN:mej5].Xi8EML
+h;$c=g=Y$/f$r3uda?FfcHXPUb/hZD`Poa3_8*h"]Y(hd\@/iQZa-g>Y#J@i5Wq4k4?>P`3]T,X
+2F0Mg4?Yhi4?5>[05sZ[:/Fhc;>a8j;>O2j;uK\o;Z0Pl;X%'T;Z9Vo;?0Sl;@YH70JP:;2)@K^
+4Ztnj4T7A@3<(oA2Dm<J1H@Mq3<;*"rAt$U:B!om9hS&L-9t't;>=,i;u0Dk;ZKeq;Zp'"<)Z`f
+<!#ur;ts>l;u]f$;c6Ll;cH`i;ZKeq;uTYp;uKYq<V]\p<<-"s<W6&!;u0Jj;uT_u;c6Omr_a##
+<)QRk<)cdprDNYo!*&en!E<(t;u9Pn<<cE&<E)st<;ohp<W?#"<E)rs<W#hl;YX2f;ufqr<rQ+t
+<;ohn<;fhs<;ohm<;oho<;]bp<rZ/"<r6"u=oMV)=oMP&=o;J&=TDS#=oDG&=8>r!=]k,qrEB5(
+"Bn`":/1[\s$[8[4uOf;/Oq`V3d^dPk^EDWrHnHgs*=WhrHJ9bs)eEc?t3^FA-Z[XAnPdiBPIE[
+s(VLJs(MIHrFc.D%Vfg"Fa/@gLlIR_R%9h?rh!bnS!f\3R$X/,R@9Y9StD[LUSXiaUnaZWSXc+6
+Q'.2gN/NRQOd)0%U8Y3#\A#l%bg=klg>(QBiSieVjQ,@]io&_MgY&Re>ZOj*<DcRk;GU+e:Jae]
+:fLCo<EN=&<Duak;#=,f;#cJUNfT9bP*D5tR$a>3S=Z@HTqeE\Vl6VrXKA\1Z*UgG[^`l[]Y2(p
+_8=.0`lQ6DbKS8Xd*^:keCN7(g"P3:h;7)JiT&tZjlYail07L!m-O--n*fc9rpg*]o`"O`p&Ojc
+q#C0hqY^6hr;HTcrdk*#s0hrX~>
+JcC<$P5k+PrVc]mr;6Kis7uWgs7cQerq-?boCMtP!V,[YmpkeQm-O''l07Epk2tddj5].Xi8EMK
+h;$c=g"=p.e^W*sdF$=dcHOJTaiMNB`Pf[2_8!au]Xtbc\$i]OZa$a<Y+;,%Df0`>Df]i=EG]K+
+XK&.mU7e*JQB[Vqd^krmIYmBRrK.)Aq2t]?r0./FrK[DK#FCgFR@0M5S,8]US,SlVR/iWRQ5c*R
+P`pcMH\6s$?s]Y(Tq7mKS"#h0P)tZ^M2)"`s,d8Cr/gr@r4W-@$+I?eS"=qYO-,S&P5gaGOogc-
+OSt=AP5g^HPa235!13\Np6PcFrg*VPqjI8KrgEeTr0dJOrg<hTQ^@Z<rgEeR!1EYOrg<hTR@=,C
+s-itUq3q;N!1<\Nr0IALqj.8IrKR5Dr07)Dq3:iA"d4t/O-#J&OT:RAOo(=>OTUc1P*>^,rfmDI
+rg*JKrg*MJs-<YOr0dSR!h>gPrgs.^r1O%_qP+"brhKOjrM9Fh!2TRgrhTOirMKRlri#Xjrhf[m
+r29Upq5EtcpT+7o's!jSHZjOPH\-O&TnnLu<E>Mi<a0tFIIr!_IK"WnHi/3iH2i-fG85:DFkb[+
+gtgiEiT'%^kiqF"m-X92qsap\o()DFq#(,iruCs;VlHVcRA$4<Q'do"N/3RiW3<\B^9XuHZE:>-
+Y5>>-N/`jYOckonQ'[l+S"-%@TV8*UV5C/iWiN8)YctF>[C3QT]">Vh^VI_(`Pom=aihoQcHjnd
+e'uq"f@em4gtgiEi8N\UjQ5OdkNV6rlg4!*mdKW6naZ2@oCV\So`Fj]p\jmeq>^<gqu6NlrU^#>
+s+13Ys*t~>
+JcC<$P5k+PrVc]mr;6Kis7uWgs7cQerq-?boCMtP!V,[YmpkeQm-O''l07Epk2tddj5].Xi8EMK
+h;$c=g"=p.e^W*sdF$=dcHOJTaiMNB`Pf[2_8!au]Xtbc\$i]OZa$a<Y(;.5?t!SS?=7&G?<LE5
+JU`)nH$=CQE,TZ3U5F;4Dg(2gom6Uaq0WEqIXZcsJ:W:NJcUFQrdXfnrd5Q0@UNGM@UW/3H[C$^
+G'7tKEGoZ/C2.Bmrac"E!c;ajrbVUOr/Uf8s+pn]GC==KHMW$gIK"ZqIJSEhJ,OosJbam!JV&LM
+JbFZsJV&LFJcC>uKE$PrJHC@QJc:3"JcC9#JHp^TIt3*#J:[WK!J,k!JbsutJ,artJ,OinIK"Wo
+I0"_Br-SKkq0W0jqL&3frI"QlrI4crp3m!lr."Tm"+PcKJ,OotJbt'!KDpPsL&m'crJCQ3s,$B*
+!fMqnr/(?/rep`6rJgT2qi1E1oo8m0"HSS'O,s7$'ododDJa*$Ci4!.IVrpe7RhVt9M^'0IIr!_
+IK"WnHi/3iH2i-fG6<#2Fg1kM&[JaM[C3TT\[oAa]=knl^;%D\^D4Q#_o9[@d+-k-jQGjqn+#r>
+o^qhKq""a_p%A%Pp\4I\q>^4%p\+:PoCMMAn*]Z6nac>HqYfFR*5fjZNKB$OJqnr-IXZ]kGBA(]
+LQ.@TPDkEWLkY\Yqh&46NK0'^P*;/rQ^F21S=Q7ETq\?ZVPgDnX0&P/Yd1UC[^WfY]=bkm^r"".
+`Q-'AbKS5VcdC1ieCE1&g"P39h;7&IiSrnYjlY^gl07L!m-O--n*fc9nac8Bo^r.U!quB_rV6Eg
+s8)Wirqu`noDX=@JcE1YJ,~>
+JcC<$P5k+PrVc]mr;6Kis7uWgs7cQerq-?boCMtP!V,[YmmQU2m-O''l07Epk2tddj5].Xi8EMK
+h;$c=g"=p.e^W*sdF$=dcHOJTaiMNB`Pf[2_8!au]Xtbc\$i]OZa$a<Y#JC"7N4KP4?GPa3BK/Y
+5sRRq4?Ybf3B/rW=@>SO:/Ua^s&&Vjs&/nsr_rbnrDWYmkY_4Tr_rYks"=X10JP:?2*aAhr]C0B
+r]0s;s#19C1GgpK3]T/Z2`^gus%iPd#tdc:5"/=I<)clo<;fbm;ZB\p<;oet<)los;tj5n;cH^p
+p/D)l<)``ns&A\js&Anps&/_n!*/krr`&tt<;ff!<`N'sr`&nrr`&hp!*&qt%9-8*;c6Ll<)Z^n
+;cH`q;uTYr;cH`m;u]hq;uBSp;uTc!<)lptr)3Spr`/kqrDieq!)r_lrDN_r<W5qn;ufqr<rQ+t
+<<#no<<#qu<rQ(t;u'Di;uK\p<W6&!<<6-%r)iu%pfRMur`]8's&];)=Su>%=T)=r=S5es>5_Uu
+=p%]":eq!`%7WcI5WgnO-nRnH1HBjVIIr!_IK"WnHi/3iH2i-fG62r1FoGtTAS,RfrFc1Fr+Z4G
+rb<EeBP2!kB4u!oD/scEItWZ=PEqW-StDXJT:MF=rg<\Os-O"ZS"6+BTq_O^-DR</T:MI=QB[Mm
+Nf8mRN0'6hS=uj_Zad`eaNW#\f\5-;hr3STroF+>-K<t@h:pW7eC%iJ>$"g,<)HRl:f("c;,'b]
+;,gOp<E3!u<Dudlqbd5e?Asl(O-,ThQ'I]'R@B_;StMdOUnsrdWN*#$Y->.9ZaI6N\[oDc^;%J#
+_o9U8aN;WLc-FY_daQ^rf@S^0gYCWAhr*JQj5f=ak3)!nlKdg'mI'H3nF?&>o(2MGrq-?dp\4X]
+s7u]kqtpBjrVc?eJcC<$[f:j~>
+JcC<$P5k+PrVc]mr;6Kis7uWgs7cQerq-?boCMtP!V,[Ymmca4m-O''l07Epk2tddj5].Xi8EJJ
+h;$c=g"=p-e^W*sdF$:cc-4ARaiMNB`PfX1^q[Us]Xt_a\$i]NZE^X;XfQJ[DZ4MQE>E\<Ci!`r
+XJ_qkU7e*HR$3YEVUfj8K^4g"OoCI<OoLUAP6-u6Q2[*LQiEHQRK&]US,AfVS,JcVR@!o="I54*
+JU@BK+CSQPVOsTTSXu=<P`h)eMi!7ELP:kPP*(ieOH>NcP*,^V$G*dX[u?WHHA%<?rfR/BrfdAF
+!KiKBOoCODP6$o5rK[MOQBqB6!1*VN!1*SM!1<\PqjIPRRf8`TRf/ZSRKAtIRf8]VR$X0<R/E?P
+R/!-JR0&hFRJE9ORJE<OQNEJ>Qi*0KQi*0LQ2QsFPQ-mIPm3J<QBmf%QN!0JPQ7!IP5pdEOT(@B
+P5CC9P5gaGQ2d*FQ2QsIQ2R$KQi<<NQi36LQN3ENR/reIrgj%[qOmk^qkF%arM9:drhBUlV59ua
+qPF7jr2BXnrMTdqVPa<irM]^pqPa7i"KJH#WiGlqqlKh""/qB2H2_mbILLL^Y_/Q[<E>Kb='i!,
+IJ\KcJ,=]jIK+]oHi89jH2i-fG8,5Vh;7)Kj5oFel0@X%mdBT7nac;NncnXToCV_NrM9H4Z`'h2
+U6V.ES!KA,PECc]T;AZs[_BJ]Z*LL4ql]gu=c85uO-#KePa.Q%R$sM7StD^MUSO`aW2cl!Xfnt6
+Za@0L\@K5a]t_A!_SjF5aN2NIbg+P]dF-Oof%8R-g=tH>hVd>Nj5]4_k3(sml0@U$m-X60n*olH
+ncA@Srq6<b!;HHes7uZjr;6Kkr;H6dJcC<$\,Us~>
+JcC<$P5k+PrVc]mr;6Kis7uWgs7cQerq-?boCMtP!V,[Ymmca4m-O''l07Epk2tddj5].Xi8EJJ
+h;$c=g"=p-e^W*sdF$:cc-4ARaiMNB`PfX1^q[Us]Xt_a\$i]NZE^X;XfQ&A@K'XP?X@)G>$4p,
+JUVumH$=CQEGfVkIACLlEdHbmom6Uaq0W?oIXZcrJGb$!JH(*!If"QnHlZa+?".8Q;,;OeGBnCT
+G&qYAD/=!%B4b[cA8H(!qJ61LDZ,S&N/NOLAp/W?FEr<5HieYBI/\QeIenQlJH(3"JcLB$JcLB$
+K)C2nK)U<$K)L6#K(slsK(suuK(acqJ-(:PJGOg#J:E'"JUm]Mrdb$#q18Hos*surrdOosr-eTm
+!I]FmI/eQiI/eWmI/J?iI/SKmIf4cjIK4lsJH(,pIfFltJGt,pK)UH%L%g?%M#E/1MZ/J2MZ&J3
+M?&S6MZ/J0MZ/P5N;AP1N;AP1N;SY8N;\b6Nr4t9OT(@WMgTM_ChdX$Ch[jBCjJrJ7X'AW:PJaq
+qgS0eqgS?hs*XfmrHeKhs*4Kd!-\@Js0W6C\@K/]]">Sf]t_>Z^_ac$_Sa@6c-b+si8j+emI0T9
+oCV\Jo^r+R!:p-\rq$?dp@n=Vr;$Bf#P[rbo^hYDnG_k\nF?)Ap\OjHru9nrP`:ZdLjjr4JUW)t
+H?sdYJ;9&ANffB]Mi.=`qh&%0N/`m[OckroQC+&.S"-(BTqS6WV5L8lWiW>+Yd(OA[^N]V]=bhl
+^qmn+`Q$!?b0/#Scd:(feC<($f\,!5h;-rGi8N_VjQ>Ufkiq?slg4!*mdKW6nc&([oCW%Ts7QHe
+rV6EgrqcQirqu]moDX=@JcE4ZJ,~>
+JcC<$P5k+PrVc]mr;6Kis7uWgs7cQerq-?boCMtP!V,[YmmQU2m-O''l07Epk2tddj5].Xi8EJJ
+h;$c=g"=p-e^W*sdF$:cc-4ARaiMNB`PfX1^q[Us]Xt_a\$i]NZE^X;XfOti7N+ZV4#f5\2`NZ]
+5!1tl4Zb_d2`E<R=%lCd;YEre;>O/k;c<Tnr_iVlrDMiVqbmDlr)+(\0.nq41H.*V5s7@n4$,Pc
+r](EI2E*QN2)I<S3]T/Y3W(r=:]3ue9+"6F5"JOK<)lmt<Vf\n;uKVo;uBSp;uK\p;u9Mo;uT_r
+;t3fe;uKSp;cN]o!*&ho!*&kp!`W)sqG[Gpqc<_s!`W)sr`&u"<Vobq;uK\p;[-3$<)lpt<;oep
+<<#nr<!?3"<)Z[mr`&\ls&8tsqG[Vs<E<+!<;KPm<W#hr<Vf\p;?Tor;c6Nl;Z]ou<;ohh<;onm
+<;of"<)lt!<)iiqr`&nr!`DrrqG[>l"'&<#<W,qu=8Z2#=TV],=8H%t=oVY*=o)8#=oDJ%=8,hk
+=oDM(=nGl4=Ar$l9h\8U77B:)4$+o?/O`&`3`>p)qgS0eqgS?hs*XfmrHeKhs*4Kd%!H8qAnPdj
+Bk_6pC2<W['5;,nB4kmlC2S*8H@LX+O->luT)P>cTV%aCR@*l<0pnAsS"-(BTqeEYU7n6OS=5e0
+P)t]`Mi*COOHZ!#Tr>*"\A#l%bgFqmg>(QBiSrnsjT"6hio&_MgtLB0da$'mb$%qJ=]SEu;c$:g
+:ejb]:Jt+j<*!+&<`W-r:f.'eqbUFRN/`m[OckroQC+&.S"-(BTqS6WV5L8lWiW>+Yd(OA[^N]V
+]=bhl^qmn+`Q$!?b0/#Scd:(feC<($f\,!5h;-rGi8N_VjQ>Ufkiq?slg4!*mdKW6nc&([oCW%T
+s7QHerV6EgrqcQirqu]moDX=@JcE4ZJ,~>
+JcC<$P5k+PrVc]mqtpEis7uWgs7cQerq-?boCMtP!V,[YmmZ[3m-O''l07Epk2tddj5].Xi8<DI
+h;$`<g"=p-e^W'rdEp4bc-4ARaiMNA`P]R/^q[Ur]XkY`[^NQLZEUR9XfSO?r,!<fF)Yu2Brn83
+Uns`TSXPk.O/p3nH%1d:PO4P4Oo1=9OoLUBPQ-pHQN*9OR/WNPS,AcVS,JcVR@*u>$&*t\JqSc1
+?!jK.T`:SpR[BD*P)bKYLk^V<P*(ogP5^OFO-,TfrOiTO\[f/"Nh^oQNK0,"Oo1@BPPp[BOoLUD
+PQ-jIQ2[*JQNW\DR$X0=Q2m9NQMm-MR/WNNRKT%GR$jBARfAfTRf8fVRfAcWR$X0<R/<<JReiHP
+RK/cPRf8`PRK8hDrg!PNrKdAJrKdJKrKR5DrfmGJrKdJM%[NHIQ'IT!Q'@MsPEM&irK7,CqiUl@
+s-*JGrfdAIrKd;FrfmDIrg*SNrK[GMrg*SNrg<VO"e(sOSXuGPT)bP]U&C_^U]%"bV#[=jV>d=l
+V>[:iVtHtnVPg>jVl-Jlr2KLjql'UrX8T'qX8/h6Xfeh(ML0JhEI!%ZG`0F_G>_C>R&<tkYl0%J
+J+\?gJ,OinIK+]oHi89jGlW*fG7``njQ>XilKmm*mdKZ9o(2JOo)J:`o_/+ZUAl4bX/WM&SXH.C
+QC+/-OH#*_VQ@,5]YChXYHb16r3#mus,:3CO-#NgPa.T&R@B\:StMdOUnsrdWN*#$Y->.9ZaI6N
+\[oDc^;%J#_o9U8aN;WLc-FY_daQ^rf@S^0gYCWAhr*JQj5f=ak3)!nlKdg'mI'H3nF?&>o(2MG
+rq-?dp\4X]s7u]kqtpBjrVc?eJcC<$\,Us~>
+JcC<$P5k+PrVc]mqtpEis7uWgs7cQerq-?boCMtP!V,[YmmZ[3m-O''l07Epk2tddj5].Xi8<DI
+h;$`<g"=p-e^W'rdEp4bc-4ARaiMNA`P]R/^q[Ur]XkY`[^NQLZEUR9XfSO2r*UCL?!UW8=b2$M
+H?s^UF`MJ>Ck%RrCN+NGI,fSHHN/?eHj5"JIXls"Jc:9$JHLFPIt%9C$"IFO@Us"Z:euN=GQN&2
+F8g+`Chmd!An>L`rbV[PD>e;ND#eJONXC]%MI1@QD01&NIK"WnHiJKmIJ&'cJ,OosJH1<$JH1<$
+Jc:9"Jc:6$Jbt&tJHCFSJc10&JV&H)rdk*$pk&Quq1/U!JV!fNs+(0#qLJg#It3*#JGauuJ,t4Q
+r.+j"rdk#us*srqs*k#tqgJKnrI"isI=-EhHhi'hIJeKkHi/9iIK+cpIfb.MJ,4WoJ,b&rJ,Fcq
+J,OroJcLH&K`-W"L&m'crJ:N3re^K/!/pf5s,.#;Mi3ILrJLQ3rJ^Q3s,?Z2q2G?5rJ^`8rf6o;
+qN1]=s,n+TGAqG7BkhL#BlB)B?pR7OG^rObLAcSuJ+\?gJ,OinIK+]oHi89jGlW*fG6>:_\@MUM
+s1JBF!kuFarP8EKs2#Yk`Q?ERfA,?Gl0Ia*nac;Co_%kKoCMPEo)81ZoE4d[p@nFY#P[rbo^q_E
+nG_k\nF?)Ap\OjEru9.^O,fK_Kn>)3IXZcqH?XR^LPh(PO-5K[MMV+^qLeg,>`Ol,P*;,qQ^F21
+S"6.DTq\?ZVPgDnX0&P/Yd1UC[^WfY]=bkm^r"".`Q-'AbKS5VcdC1ieCE1&g"P39h;7&IiSrnY
+jlY^gl07L!m-O--n*fc9nac8Bo^r.U!quB_rV6Egs8)Wirqu`noDX=@JcE4ZJ,~>
+JcC<$P5k+PrVc]mqtpEis7uWgs7cQerq-?boCMtP!V,[YmmQU2m-O''l07Epk2tddj5].Xi8<DI
+h;$`<g"=p-e^W'rdEp4bc-4ARaiMNA`P]R/^q[Ur]XkY`[^NQLZEUR9XfSQ$7L_aS76!:e3&X&f
+5<V.lr]:?E2E*`h7ncbY;>*ic;>F)i;uBPk;u9JW;>X8j;uT\p0b,fi0etLA1I+2h4Zkki3rM&B
+2E*NP1c51mr\sm<r&YBa9h\5T92%o/4@i=I<)ifrqc*GkrDNYp!*/ens&0&#<`N*ur_ierr_rVl
+!`N&srDWbqr_ibp!`W)srDWhs<)`cqr)<>hs&K&!rDikr"]SN'<E<,t<;oho<<#nq<!H?%<)QUm
+<W5qt;u0Jn;uTbm;uK\q<<lK'<)cdp<`]3!qbmJor`/PhrDW_o"&i/t;uTbq;ts>l;u]_q;uTbq
+;uBVp;u]hs<rQ(t;u]f";c6Ll<;KPl<!--"<)ris!*B)#s&fA)=8c8#=oDG(=^"u)=T;P'=T;Ip
+=Sc1p=o__(>5VP'=qt.9:/4JV:JF8G3^l(c+t5'46o-i"rI4WnomlmgrI4Wls*XfmrHeKh!-nHd
+!,27D!GZEGC(k;pBkV0oBkqX.G'edpMNF'hS"BSN#G.HSR@'>-QN!3UR$jA2S"6.Drh:a5TV%dE
+R$X&"OH#3VMM[:QPEq`4W3*D:^;S.;dFHn'gtpuJioC%!s5P$WiSWMIg=Oj&cHF8Ga(o6g<a/[*
+;H-Li:Jq*e!DZPl<!$*#<rQ,!;?0Sl;#3ufN*MC(OHPflQ'[l+S"#t?TV8*UV5C/iWiN8)YctF>
+[C3QT]">Vh^VI_(`Pom=aihoQcHjnde'uq"f@em4gtgiEi8N\UjQ5OdkNV6rlg4!*mdKW6naZ2@
+oCV\So`Fj]p\jmeq>^<gqu6NlrU^#>s+13Zs*t~>
+JcC<$P5k+PrVc]mqtpEis7uWgs7cQerq6<`!;$3\!V,[Ymmca4m-O''l07Epk2tddj5].Xi8<DI
+h;$`<g"=p-e^W'rdEp4bc-+;QaN2B?`5BI.^V@Ip]=PP^[^EKKZ*:F6XfJJ$VuCN6Chs#ds(W.F
+V5Br\T:MI<P`fsHQZRV/P5UU6P5^U>OSP%=P5^[FPlI$IQN*9SR$jA2Rf8fSS,f&VRK](FQ@jX4
+rdk_h?)=9fT:hgIS"#Y+OGo'RM>i80Op-o/OcYZcrf[2ms1/0<#FV32KT2"PO8b:8P5UOCP5gaF
+Pl6pIQiEHQR/r\Arg!PNrg*ML!goCDqO.DPrg3\RrgNkTrgNeT#b%0KQ^=),R@*o?pmM8OQ^Ic?
+p6u#LqjI_WR$a5+Q^@];s-N_Ps-N_Ns-<SJ!L8oKPQ$gGQ2[*GQNNP=QBhH6!gAe1rK7)BqiM5K
+Pa%AqP`q>rQ'M*0qN_)HrKmML!13\N!LK2LR08tJS=Q8NTDtS^U&:YaU]%"gV>m@jV>mCsVl$;e
+VP^9jVYR._W;idmW;NXkW;NXpWrK+"Wq`XkXT,F$XqdU[I!9^SI=HTeXjDrL;Me>=E`ZSHrdX-^
+rI=fqqgJKls*O]js*=Wh%!Ujtl0@U%mdBQ5nac\N!;-9^"n_K\p\Ol_ruUe/YGSA/U6V=HR?jA1
+Ock`gV5g`/[_TP^ZEgX6YPkX"X]UOAO,oEdPEhH#R$sM7StD[LUSO`aW2cl!Xfnt6Za@0L\@K5a
+]t_A!_SjF5aN2NIbg+P]dF-Oof%8R-g=tH>hVd>Nj5]4_k3(sml0@U$m-X60n*olHncA@Srq6<b
+!;HHes7uZjr;6HjrVc?eJcC<$\Gq'~>
+JcC<$P5k+PrVc]mqtpEis7uWgs7cQerq6<`!;$3\!V,[Ymmca4m-O''l07Epk2tddj5].Xi8<DI
+h;$`<g"=p-e^W'rdEp4bc-+;QaN2B?`5BI.^V@Ip]=PP^[^EKKZ*:F6XfJJ$Vu:$&?P?RE=FY^G
+G^+@RF)l2;>'"t&DKPf(l$NGXrHn9b!.4Ee#(:rMIt3*$rdt0$$\3_VIXZ]nIXPX3>Q/(L;,DXc
+H$=CSF`VVCD/<s$B4badA8Q1"D/K8g#]=KtNfK0\Nf3mo"Eo00FF!b2rHnQls*aQhq0rHrIt7EI
+!.b'""+YrSK)U?"JcLB!K)U?$K)^DtK)U<'JqJ]/qh"s'K7`uO!.t3$s+('!s+(#us+(-#!.alr
+s+:3#rIY'#r.+WmqL/9jr-e'^rd4Tks*alo"FY`KIX_$@s*jut"+G`KIf4crIKY.LIt*"JJbalt
+KDpQ&L%g?%M#<,0MZ8V4MZ/P5MZ&J5MY`8/N;eh9N;nn;N;nn;Nr"b-N;eh:Nr4t6O8tF>Oqido
+Df'6(D/F$%KW8cl6"rf4>u"1LrdX-^rI=fqqgJKls*O]js*=Wh"a@Pi]=bfU]`Z!`^qfrcrke]Q
+)T9V7b0SPhgu@G[lgF94o(2JGo^qbGoCDMDrU^$\!;6?b!;HKf'`%P!p\+:Po^_P@n*]W4nac;F
+q>B"I*594OOH5Z^It`Z.It<)sH?aagLQ.CUOcYN[MM:q\q1De.NK9-_P*;/sQ^F52S=Z@GTqeE[
+Vl6VqXKA\1Z*UgG[^`l[]Y2(q_8=.0`lQ6DbKS8Xd*^:keCN7(g"P3:h;7)JiT&tZk2tjjl07L!
+m-O--n*fc9rpg*]o`"O`p&Ojcq#C0hqY^6hr;HTcrdk*#s1&)Z~>
+JcC<$P5k+PrVc]mqtpEis7uWgs7cQerq6<`!;$3\!V,[Ymmlg5m-O''l07Epk2tddj5].Xi8<DI
+h;$`<g"=p-e^W'rdEp4bc-+;QaN2B?`5BI.^V@Ip]=PP^[^EKKZ*:F6XfJJ$VagYRr^.>X3Aj)c
+4Zkkh3]fA]2DIB`9i+[a;>F&f;=IK_;u0D_;>sJj;>O2i;]nsl/hJe41,UpS5Wq7o4?PVc3B0&Y
+2E*KL1c.6S3B0"t3s7Z-4&A]O9F"9c8kD3=;,dEmr`/eor_ihs;uTYs;cHasp/D/p<`W4"q,@,h
+r_r_os&0)!;cH^p;ts>i;ta2i<W?)"<W5tt;Zp*$<`N/s<<#np<;fbq<<#tu<<#nq<<6'!oi1cd
+r`&_os&B"u!*&bmrDi\n!EE+u;Z]os;Z9Vp;Yj>p;cHasqGRDo;uTYp<;]\m<;oeu<)lptr`/kq
+s&/kq!*&hor`&kss&AnsrE0#$s&f,#rE',(>$CT$!*B)#!*T/#qH<VtrE9,'qcWl$'ie.-:/+GV
+9gqK:=>D?L3\3]\1HAA4J*;F]J,XooIK+]pHi89jH2i*hGPl4TC\_`FBc^r%C27U(FE`+aLPq:Z
+Q^aS=T:hgIS!o_3Q^=#(Qi<BPROt#!SXuLJTq@sKS=,_0PECocMi*@JMiNsdS"cg^Zad`eaNW#]
+f@es9i8N\UroF+>-fX+BhV?i:eBuO``PT@#[q08W=^"s/;H$Ij;Gp=f:/=bc<)m"#=8l5&<)QOi
+rD<;c=H&6#O-,ThQ'Rc(R[]h=T:hmQUnsufWiE/&YHY:<['mEQ\\#Mf^VI\&`5Ta;aND]McHjkb
+daZdtf@\d1gYL]Bi8ESSj5f@bkNM0plKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>U6gqu-HkrU^#>
+s+13[s*t~>
+JcC<$OoP%Pr;HWmqtpEirqZNf!r)E^rq6<`!;$3\!V,[YmpYYOm-O''l07Epk2tddj5].Xi8<DI
+h:pZ;g"4j,e^W'rdEp1ac-+;PaN)<>`59C,^V7Co]=GJ][^EHIZ*:F6XK/A"Vl"<ICMRa%Chp,K
+Vkg,^T9u"4P`X5@Vg3fQqigT6rK6l:q2t]?rKI8G!1!MKs-EkUR@0M4rgWhUs-rtU+..\3H\6s)
+?<j>%TqS-NT:245PELraM2I%CKoqIYOo:@COckn*^&PYK\$iZ%H\.6<rf.&AOcfR)s-*DErfR2C
+rf[JLQ'IZ$rg3YPrL!_RQBqN:!1*SM!goCDq3h;Org3\RrgEhTrgNeTs-a+ZR$X/,R/36MRK/iU
+RK/cTR/WNHRK/cRRfAfUR/E9PQC!s8R/`NPQ3!88rKRMMQ'ISur0I8I!1<_Os-E\Ms-3MHrfR>F
+P*5g,#a1=5Q'IStPa)-3p6PT@s-EMJs-EYL!1<SM"IbgLSXobPs.KCcqP*tar1s@hs.fXkrhf^n
+rMK4bm&9i]rM]XnrMfn!WqWRkXT#@$Y5b[AWh+`fGBJ"dLO+0;^P@5cLf9XC>$e56pON$ip43*k
+s*jlos*XinrHeKh$[?m]m-a?2naZ2Ao`"Lgo^h_Jp@e:ZSGsVBWiF(5R$aY=Q^j_7Q&^p!VQRA8
+]th"ZYd(@6Xo>L!XoF>bNfT9bP*D5tR$jG5SXuIIU84T^Vl?\sXfen4ZEpsI\%0)^]Y;.r_Sa@3
+a2lBGbg"GZdF-Lne^rF+g=tE=hV[8MioB+]k2tjkl0@U$m-X60n*ol;o()DEo`"Lbp@n=[q#C0i
+qYU0hr;HTbrdk*#s1//[~>
+JcC<$OoP%Pr;HWmqtpEirqZNf!r)E^rq6<`!;$3\!V,[Ymmlg5m-O''l07Epk2tddj5].Xi8<DI
+h:pZ;g"4j,e^W'rdEp1ac-+;PaN)<>`59C,^V7Co]=GJ][^EHIZ*:F6XK/A"Vl'H$s'Pe4&mp3;
+I!U'\F`MJ@Detu<Jo#FQqg@^VrI"QjpNljdpj<BrIXZcrJ:N3&K)U?$J008iIXQZT?sR5NA5Q-L
+H[0m\G'A"KE,TQ.BkV-kARtdW!H)cRC_CT&DiTj=O,f-VMMd42D0'uLHi/9iHN8HlIJ/-aIfP#u
+Jc(#uJc:2tJc10#Jc:9#KE$N'Jb=WpJcC?%KE$W&KE$T*K7a#Ps+:9%s+('!rdaot!e>iPrdk$"
+!.k*#s+13%!J,k#Jc1,pIfFioIf=irIf"NoI!t^9s*FfpI=2!As*OrtIXZcqp4)merI=itrdXot
+!.jrts+:<)r.Y*(qM,',qhb<1qhkE3re^c8N/[Oir/CW7r/CQ5!06i6p5K!1rf6u=plGK<qiVk]
+P*1l]Ec5c/Bln</BRZ+X?sdY;G>:k.LPPVSpjr-hrI=irr-eTms*O]js*5&uGJ(W&^:q@t^qmk(
+_Z%Fg`5T^8aNW&]g"k]Nl0Rj.nac;Dp%7nUoD\=\o*P'\oCV\Jp%J+RrqI3'q"XUWp%@qHnF,i6
+mdK]:o_/+Yf`)uhR?*B%M1L54J:E0'IXcZgJqo8DNKKB`MMd4DK)LAuKE$m8NfT9bP*D5tR$jG5
+SXuIIU84T^Vl?\sXfen4ZEpsI\%0)^]Y;.r_Sa@3a2lBGbg"GZdF-Lne^rF+g=tE=hV[8MioB+]
+k2tjkl0@U$m-X60n*ol;o()DEo`"Lbp@n=[q#C0iqYU0hr;HTbrdk*#s1//[~>
+JcC<$OoP%Pr;HWmqtpEirqZNf!r)E^rq6<`!;$3\!V,[Ymmlg5m-O''l07Epk2tddj5].Xi8<DI
+h:pZ;g"4j,e^W'rdEp1ac-+;PaN)<>`59C,^V7Co]=GJ][^EHIZ*:F6XK/A"Vl'G]#=1^E6ps=)
+4T7JF4?>P&2[)lJ7nlfYqbd5er_`)]!)rYjo25Haqbd2fs&0jk/hSk61,UgR5Wq4m4?Pbg3BB/\
+2`EWO2)IAm3<;3&r]:0D:f%'as%Nbk8OGsE;H$Onr`&ntr)E\r#uji%<)cdo;H$Qo<V]Vn<W6#!
+<;9Di<;fbk;ufko<<#np<;]\h<;KVo<<#ku<)lrn;ufko<;f_q<;ont<;9Jl;ufkq<;]\m<:s5k
+<;]Z!<Dugq<)lrq<<#qu<;fbq;Z'Ji<!-&u<E/oqrDEbs;GpFlr_ibprD`bp!E<(m<;ohr<;TVo
+<;ont;ufqt<rZ8#=9;W/>4u+t=T;Ot=9)G"=T;P&=SQ#">$:c,s&oA(!*T8(r)rr$"'JZ$:]='"
+:I[cA5YEja1HR*V2`*No;YP_:JbFWmJ,auqIK+]pHi89jGlr;8C23``rb<`pC27R!Bk_<sCMRd,
+G'JIfLlIR_R%0b>T:hgIR[KP0QC!o'Qi<?TR@9V8Sc,2\Sg9krR$X)$OcGBXMMR+JNffTqTr+rt
+\%]c$bgG"og>(QCiSrnsjT"6iio/eNgtC6,d*9_Q_7d@dYcPF8>?P$:=&Dgp;Gp=h:f0q_;H$Rq
+=&i<#<<H,t:J^sdq+q$L>`Ol,P*2&pQC+)0S"6.CTq\?YVPgDnX0&P/Yd1UC[^WfY]=bkm^r"".
+`Q-'AbKS5VcdC1ieCE1&g"P39h;7&IiSrnYjlY^gl07L!m-O--n*fc9nac8Bo^r.U!quB_rV6Eg
+s8)Wirqu`no)=4?JcE:\J,~>
+JcC<$OoP"OrVc`nqtpBhs7uWgs7ZNerq6<`!;$3\>Oh4Pn*f]3m-O''l07Epk2tddj5].Xi8<DI
+h:pZ;g"4j,eC;spdEp1abfe/NaN)<>`59C,^V7@n]",>Z[^<BHYct:4XK&7uVkp2aCM[d&Chd^#
+V50fWSc4oZO+!^kG'o)?PP(+;OnFh4OoCOCPQ-mIQ2[*KQN3HQRf8fTSGo#WRNdK<IY*-(L0^UO
+TVA$NT:MC;Q'@8eN/<=EL6@X\OHGZeOSt@@]aDB^\[K#VG_:s:O8b.AO-#Hcr0%)Drf[8Cs-!>E
+"I,1:QBqN:s-WbQ"IPOAQ^Ic="dkXCR$jB?RKo=NS!ob4R$mrB!1EhTr0meWR?s9=R/EBNRfAlU
+Rf/TRRJWESS!oi@RfAcUR/!$HR/`TSQi`V?QM?aFQN*<OR/E<LR/N?SQC!l$Pl6dIP*(q+OTL]0
+Pl?pMPa.Q#rg!5Dr0@8Ir0RGN!1*SK!LK2MR0B%KS"-%@rh'4`s.T@bs.fIerMBOis/,4^po"1l
+q5=@oW2]crri#mrql0Cks/Q."q5aIqriQ.%s0)I,(TEXLH['RZQ@X:BTpMNkL5Jls=^#.4Z2T:L
+Jbt&pJbaiqJ,auqIK+]pHiA?kH2m@5nH/:Qo`"Lhp@\+Pp@n@ZrgWp.jn#OQX/hnZTq@^>U77C2
+O-ciIZa@6X]X+oKYH%Q(poRYWNK0'^P*;/rQ^F52S=Z=FTqeE[Vl6VqXKA\1Z*UgF[^`l[]Y2(p
+_8=.0`lQ6DbKS8Xd*^:keCN7(g"P3:h;7)JiT&tZk2tjjl07L!m-O--n*fc9rpg*]o`"O`pAamd
+q#C0hqY^6hr;HTcrdk*#s1//[~>
+JcC<$OoP"OrVc`nqtpBhs7uWgs7ZNerq6<`!;$3\Ab#9Zn*f]3m-O''l07Epk2tddj5].Xi8<DI
+h:pZ;g"4j,eC;spdEp1abfe/NaN)<>`59C,^V7@n]",>Z[^<BHYct:4XK&7uVkp2a?XI,G?X@&E
+H[0gYF`DD?Ch%j>Bl8+hI-u@XI/SEeHN/?eI/eU!IXcitJ:W=NJcC6@IsuiV@:!ANA7SM`I!9j[
+G]n4MEH,l3C2%<mAn:jWs)&$XCi+*/DN=^W$&je"MMI()Ed<'3Hi/9jHiJKlIJ\HpI=?YBIfP#s
+Ifb.OJbsrtJc1-!Jc:6(K7\]-K)C9#Jc^RVKD:$!JV*iQ!/1<'re(?*JqEuQrIXotrdY$#K(sog
+K)'s!J:W7HIKP(KIt.EGs*srqs*aors*aZi"FYZEI!kj?s*OuuIXZcqIeS<nIXQYBIf=isJGt*#
+J:IQK!.jrts+:<)r.Y*(r.k<.qhY<1rep`4qMYB4pl#-1r/LW5pl595rf-Z2rf-l:s,[,?!0R8B
+rfR&?rKA%VJ8oICBPi'5Ble`IG?8<j7<_L$:ksi*JGFcnK)'unJGt&uIf+WoI/eQmHN/6s^;%Fu
+^qmk(_o)Jls2G#Y)9^@SfA#3DkN_F%nFH/Ao_%kKoCMPEo(2GNoDeI_p&F^cp\agdpCR&ko^hVB
+n*f]4nF?)@pA+X;ruA2TOcYZcKn+u3J:E9(I=$3fL5LtNO-5T`Mhm2eK_U1%N/`jYOckonQ'[l,
+S"-(ATV8-VV5L8lWiW>+Yd(OA[C3TU]=bhl^VRe*`Q$!?b0/#Scd:(feC<($f\,!5h;-rGi8N_V
+jQ>Ufkiq?slg4!*mdKW6nc&([oCW%Ts7ZKerqQNhrqcQirVZWmoDX=@JcE:\J,~>
+JcC<$OoP"OrVc`nqtpBhs7uWgs7ZNerq6<`!;$3\Ab#9Zn*f]3m-O''l07Epk2tddj5].Xi8<DI
+h:pZ;g"4j,eC;spdEp1abfe/NaN)<>`59C,^V7@n]",>Z[^<BHYct:4XK&7uVkp2a6:4.06:4./
+4Ztti4$#>[3&Eli9i4a^;>j>k;<1XE;>sJi;>X6%0eb150ekF@69mb!4Zkkjr](KK3ArfS2Dd6O
+3B9&Z4$#G$3ri(U9F4Ec91_63:Jt(ir_rSkr`/nrs&0,";cHas<)``p!``3!rDiku!EE+t;ZKeq
+;uK\p;Z]ou<;ol(<*!%!<)lmt<)iiqrD`_op/Lohpf%5lr_rktpJh#g!*&Pis&B"srD`ep!`N)u
+r`&qtrDihrqc3Vor_rktrDW_q!)r\mrDW_o!)rhqr)El!;c?[qr)<Plr_r_mrDW\p"&i0!<W5tt
+;uBVm;ts>k<W?%u<rQ/#=T2J'>4u+k=9DW,=BGE&rE0,&o3))s$X$Y:=]ed/=^#!5>5MJ&>5_Y-
+=Ahmir_3r!77K=(5Vt&K3\*WY1HAE2rdafqqh"Wpq1/Hos*jlos*Xinrd+TirG)CJr+l:HrbE![
+E-$5MJ;&l@P*VN+St>qR#+V-MR$X/*rKf7+R@9S6SXlCGT:VUFSXPq3P`_&eMi*@HLl7:UPaS2@
+XKf7J_T0mIe_&R1hVdAPj8S->j"03Khqd)?e^Mjga2Ga)\$E3<W2-+jBN\G?=]J<u;H$Ik:f'q_
+;H$Oq<`N6#<rZ.s;#!ggN/`jYOckonQ'[l,S"-(ATV8-VV5L8lWiW>+Yd(OA[C3TU]=bhl^VRe*
+`Q$!?b0/#Scd:(feC<($f\,!5h;-rGi8N_VjQ>Ufkiq?slg4!*mdKW6nc&([oCW%Ts7ZKerqQNh
+rqcQirVZWmoDX=@JcE:\J,~>
+JcC<$OoP"OrVc]mr;6Kis7uWgs7ZNerUg3`oD\;YnaQ&:n*]T0m-Es$l0.<mk2k[aj5T%Uhqm2F
+gY1B6f@SU'eC)alcd'h[bK@rJa2Q$8_SO%&^:_(h\[])U['R'BYHG".Wi;nnV50iZTPSHDC(G*!
+EhSqiQB[YRSBZ)!Js#ekp6,E;o8rj3rK@,C!gJt8rg*SN"IPUGR@=)Drg`tW".G'tI/\a=LL";c
+U7e-PSXl4<Q'%/gN/37DKohF[P*(ohOd#d-rOilW]",5'[!I@_OH>NaNfK0]OH>V&P5gaGP5^UD
+P5LLHPa.Q#Qi<BNRK&ZRQNNVCR$mr@s-`kTs-j"WrL3eUrgEeTs-WkUq3qGSR$[f>qj@GQrgO(]
+S"#k8RJrQTR@9WDRf&ZMRfAc\R$X/*Q^F/,rg3bTR$di?".5FAQMm'OQBd`$QN!6NRK&ZRQi!0M
+QiEE_QBd`"PEV/lP*;#jP*;./Q2d-QQ'R`$Q1pUBQ2[*KQNW\BR$a6>Q2d-MR/NHPRfAi]S=Q4B
+T:_eTU&:YaU]%"aV#[CeVZ<[oVu!@kVuEUpWV`XlWVidoWUd%iX/c0"rN,muriZ:)rid6EVi,tK
+G'&>*I!C[VMigq;O]\#R<aMo2rIO?frIOfqs*t#srI+]ns*O`k#C5n4o_%qPp\sjhp\=R]rKdI'
+];hmNTpD1GS!]qGR?ikpUoLW-\%f_cYd(I8YPt^"X^6pENK90`P*D5tR$jD4SXuIIU8+N]Vl?\s
+Xfek3ZEpsI\%0)^]Y;.r_Sa=2a2lBGbg"GZdF-Lne^rF+g=tE=hV[8MioB+]k2tjkl0@U$m-X60
+n*ol;o()DEo`"Lbp@n=[q#C0iqYU0hr;?Nbrdk*#s185\~>
+JcC<$OoP"OrVc]mr;6Kis7uWgs7ZNerUg3`oD\;YnaQ&:n*]T0m-Es$l0.<mk2k[aj5T%Uhqm2F
+gY1B6f@SU'eC)alcd'h[bK@rJa2Q$8_SO%&^:_(h\[])U['R'BYHG".Wi;nnV50iZTO2()?N4@@
+G&q_DDf8g(R:^;VHhVpWHhr-eHhVjdHhi'hIK+`tIt3(HJcC60IqE(p@U`k[;,MdfG^'.0s)TE)
+Ci!m%B4badD/O91D/O6.D/X?1NfK0]Nf8jQCPQ_FG^Oo;Hi/6kHiAElIJSEmIK+coJ,b&tJ,+Wo
+JcC9"JcC?$K)gN!KE$Q%K)gN&KE$N'KDpJtK*[-aKnG#0Jq8OQJcC<&JV*iOs*t0%JqEfLs+16'
+r.=s$!eQ&Von!-ms*jlqnp^Rf"b(lJI!pGAHi\YErd4ouIXQWlI!u!C!e5ZJpOE3ls*Xlrr-ncu
+JUm`Nrdb!!rIXp!!/1<)r.b-)reUH.re^]6regQ1rJ^Z4rJ^T4rJ^N2rf6u;q2G93rJpl<rfHu=
+r0$l>(mL#*E,KH)EI_k=E.r:N77:ucGYLn/LkbkZm=P:fqLJTqrdOfos*Xinrd#T1_84"*_o0L4
+`Q#s=ai_oVe_8j=k3;7"n+#u?oD\@`oCDMPncSLSoCMtRs7HHep\4R[s7[)up%7hEn*f]3mI0Q7
+oCi"Xec-`is7)P>O.qD[Jr,#.L4t2/H?k1#N/s!^P)YBWLkUK\K_U1+Mi<XVOHG]jQ'Rf*R[]k>
+T:r!SUo(&hWiN8)YHY==[C3QT]">Vh^VI_(`5Td<aihoQcHjnde'uq"f@em4gtgiEi8N\UjQ5Od
+kNV6rlg4!*mdKW6naZ2@oCV\So`Fj]p\jmeq>^<gqu6NkrU^#>s+13]s*t~>
+JcC<$OoP"OrVc]mr;6Kis7uWgs7ZNerUg3`oD\;lnaQ&:n*]T0m-Es$l0.<mk2k[aj5T%Uhqm2F
+gY1B6f@SU'eC)alcd'h[bK@rJa2Q$8_SO%&^:_(h\[])U['R'BYHG".Wi;nnV50iZTLD176ps@.
+6TdCk3AriR5>=gH:K.!bs%r\ljAPGDr_iSis&(=D;DBmZ0JG4;2)RW`4Zkhg4ZPSa3''&Y2`3EK
+3]]8\3BK;`4$5Ve:JUm_s%<Sh2*ju9;,gNn;u'Dk<W,l&;H$Ln<)lmr;uTbn<W?,"<W,kq<;ohq
+<;f_s<)lor<W?,$<E/osrDWYorDWMkq,IZ!;c?Xq<)lor;u]hs<VTMp;c6Nm;Zp*$<`N2n<W,ns
+;u]_q<;KVj<;ont;ufkr<<#tt;uT_r;ts>i;uK\l<W?"u<W,l";c6Om;Z9Vo;Yj>k<;fhs<<#no
+<;fbj<;TYr<`f9&r`T2'rE9/(!*Stsr)`btkue-m=]eg1rEK;*rE9,'s'$FG>?b?7;,9q]9MA/M
+6odRt2(Bt701IoX3E8uUJaJ'fJbjosJ,XoqIK+]pHiA<kH2VLYD#S2_C27U$Ci499H%(@$N0'9j
+R[p&LT*([SR[F)@s-EYNs-O%ZS"#q>StM_TSkbfDQ^3htNf8jQLkgeENf]KnTV\`p\@oc"bg=nm
+g"bHBiSrnZjQ,@]io&\Kg=Oj%cHF5E^:CYVXf81lTUhOgSR,H%?rg0(;cHXl;Z9H$:/Y%k<EE7&
+<E<*t;,@0fpeP4SN/`m[OckroQC+)/S"6.CTq\<XVPgDnX0&P.Yd1UC[^WfY]=bkm^r""-`Q-'A
+bKS5VcdC1ieCE1&g"P39h;7&IiSrnYjlY^gl07L!m-O--n*fc9nac8Bo^r.U!quB_rV6Egs8)Wi
+rqu]moDX=@JcE=]J,~>
+JcC<$OT4qOrVc]mr;6Kis7uWgs7ZNerUg3`oD\;YnaQ&:n*]T0m-Es$l0.<mk2k[aj5T"Thqm2E
+gY1B6f@SR&eC)akcd'eZbK@oI`l5m6_SO"%]tCtf\[T#TZa6p@YH=n,Wi2hmUnaZXT:VVQCCY9&
+EcQ&dQBm\]ZCuPmMY*,-P5g[8OSk7<P5UUEPQI,9QN!3SR$jD2R[X5Frg`tW(P7-aJqSe_?)FEj
+Tq@sKR[KD)OcGE[M#N)8PE:ojOcY]hPEM+-]a29_]!eZcH$kGHOT1@BNfX.#!0R5Crfd>DrK@/D
+s-3PK!LB)NR/WNQQi`VAR/NHQR/`TRRe`EWR[KS4R[KWCRfJuVRfJlTR/WNPRfAieSXc4>S!ob4
+R$jD3S"#lAS,A]]S!ob5Q^=#'QC%Q;pmM/L!LB#JQN*9RR$X/,rgEeRs-`kR"dt^DR$a6>Q4T=G
+PEM)mP*(omPa.Q#Q'I[4Q1pUEQ2R$JQi*3NQi<<NQN<JAqjRPS!1a%Zs.B7_!29@crhKCeqP=1h
+oV_J_rMK[pVt[.hWV`[qX6lneX8K(!XoGO(Xo,@"YT'mSZ_<2'H#n%iQ[X1_dtWcV<0ULQ=]\s3
+Y-7hVmXtIirIOlsrdXrsrI+]n!.4]k!ql<^rqHZkq"X[]rKR=)q!>)__k`onURdgGVkB?>P+8PT
+['[Q`\[&NGYH4q1Y4o'uN)kt"OHPflQ'[l+S"-%@TV8*UV5L5jWiW>*Yd(O@[C3TU]"G_k^VRe)
+`Q$!?b0/#ScHsteeC<($f\,!5h;-rGi8N_VjQ5Oekiq?slg4!*mdKW6nc&(\oCV\So`Fj]p\jme
+q>^<gqu6NlrUTr=s+13^s*t~>
+JcC<$OT4qOrVc]mr;6Kis7uWgs7ZNerUg3`oD\;]naQ&:n*]T0m-Es$l0.<mk2k[aj5T"Thqm2E
+gY1B6f@SR&eC)akcd'eZbK@oI`l5m6_SO"%]tCtf\[T#TZa6p@YH=n,Wi2hmUnaZXT:VTZ?!^k:
+?OC+ZDf9K)Kmd`TGP$:RHhr-cHN8BkHi/3iHh_snI=?WpIt3*#rIP!!,%4kb@:WkD:ORP7G^"=R
+F)l2<Chmg#B4POaDf0H2D/F0-rbqgss,RGGMi*CAR;-bdrI"Qjq0`0i!e,QGrI4`ordP!"It.HJ
+rdX`orIG$#JV!fPm=PClrdt0&s+:-#rIbl=KS4u1JqAQ)J:N3&JV&K)JqAQ)r.=itrdk-&qh"g"
+s+9rqrdP'"IsulspO<-lrdOls!e>cLr-eQl%"3SQI!g?jIXQWlI!tm@pO<0lrdF]o!.b$!s+(*"
+rdt$""GDD[KS9>Yr.b-)reUB,!/gK.!0$`3rf$]5!K<$:Mu\k9N;&>/N;\b8Nr"e:OSk7=P4t1>
+Po,@&E,KE(GCF=AL8f',6:>cbGYLn09ne<#K'n9iK)L8uJGt&uIf4]pHiSNmH32"&`VmgVa;)h>
+cI(+mgu7AZlg=02o(2JFp%@tKqss[V!qc0Zrq?Hgq>L*gpCR&ko^_M@n*]T1n*ol=pA+X<s8W'D
+qtBRM^:TPjSr/8RLOt).LOt#(H%Up2NfK9bNJrdOLkCD7K_L-!N)kt"OHPflQ'[l+S"-%@TV8*U
+V5L5jWiW>*Yd(O@[C3TU]"G_k^VRe)`Q$!?b0/#ScHsteeC<($f\,!5h;-rGi8N_VjQ5Oekiq?s
+lg4!*mdKW6nc&(\oCV\So`Fj]p\jmeq>^<gqu6NlrUTr=s+13^s*t~>
+JcC<$OT4qOrVc]mr;6Kis7uWgs7ZNerUg3`oD\;YnaQ&:n*]T0m-Es$l0.<mk2k[aj5T"Thqm2E
+gY1B6f@SR&eC)akcd'eZbK@oI`l5m6_SO"%]tCtf\[T#TZa6p@YH=n,Wi2hmUnaZXT:VVQ6k)LO
+6UF+%3&`fY5t4XFmSW@L!)r\kn59-^qb\,,;,K##/hf%92DdZb4Zkhg4?P\c3]d7!)`BQ12*3fY
+3]fDa3]fGd;,0eY92&#O3(6V@;>jJm;u9Pk<W5r$;c6Om<)iiqr`&bps&T/"!*&qrrD`eqr`&kq
+"B8B$<)iiss&T"s!*&qrrD`bppf.&h##nN"<)lmtqc!Gnq,@An;Z0Mp<)rispJq2lr)3Ys<)ros
+s&K%sr)EVp!`W)tr`'#!;cEZps&8_mqc!JnpJq,js&/eos&/_ms&8tsr`&hrs&Akos&AqqpJ_,m
+rDrr"!*K/%!*];'rE92(oiV,nr)ii!!*\_lr*';/>?b96qc`r&r`g:A;,9t]9MJ8O77'j52(9k4
+0LdrX3B0i4rdsQjrIY!!r.+crs*jops*Ofnrd+Q['l@c&CM[g(DK0fDH\$p0OHc'!S=Z>OT*1[R
+R[BH>QN!9OR0/nJSY#hQrgk@(R?s2%OcGBXM2-h@MN*^]R\-CVZ+%EaaNW#]f\,':i8N\ojT"6o
+io&\Kg=Fa!c,di<]XP5NX/D_dSsu+2Nf@^g>$#'4<)HRl<)?Ih;,L%b;H6^u<W6#'=&i3r;,C*`
+:]HASNfT9bPE_?!R$jG6SXuLJU84W`Vl?\tXfen5Za7'J\@K2`]t_=u_Sa@4aN2NIbg+M\dF-Oo
+f%8R-g=tH>hVd>Nj5]4^k3(sml0@U$m-X60n*olHncJFTo`"Lbp@n=[q#C0iqYU0hr;HTbrdk*#
+s1A;]~>
+JcC<$OT4qOrVc]mqtpEis7uWgs7cQerq0RhoCMPDnaZ,;n*]T0m-Es$l0.<mk2k[aj5T"Thqm2E
+gY1B6f@SR&eC)akcd'eZbK@oI`l5m6_SO"$]tCtf\@8oSZa-j?Y-"e*Wi2hlUnaWWT:VRBRVm+c
+ErBk\D/>NeF*iP&nrrj3s,lo7rfQu=rfdAHs-<VMs-E_QrgEeTrgWnW'Usl/ItWN1?s]_-T:hmO
+Ssu49Q]h?."c8"gL67SqOoCOEP5W'#]XtbaB=`56Ll_Iqrf?u=!0R8Drf[DHOcfU*s-*GHs-3VN
+Qi3<NRJWBLR08nFR@9T=RfStGrL3bU".G^LSGo#XRf8]PRJiQ\S=Q4@S=?":R@4#BopbrL#+M'M
+R@'A.rg*SNs-WJI!1<\N!1<bP!1EhQ!1<PL&t##QR$j;-QBmf$P`h5oP*D2rqNh&ErK[GMp6P]E
+r0[JMs-NkSR$mi?!LoVYSc>;[T`:_aUAgqdV"geYVZNfrWV`UpVl'EjqksLori#jrrMogso;_hi
+rMfjurN-%$qQBh$s0*TMZEpmE[&fpPH?aU]Y`*sRUW@M_AlVi4R9E^"=KeplKDgE$Jc(&uJ,aur
+IK+ZrH[:#9q#^EirK$spZ`L1.TpDFGR\$IUSsb_)VQI,2\AGqcrilR.YHG&%X](1<O,oEdPEhH#
+R$sM7StD^MUSOcbW2co#Xfnt7Za@0M\[f>b^;%J#_o0O7aN;WKc-FY_dF6Uqf%8R.g>(N@hr*JQ
+j5]7`k3(smlKdg'mI'uB#4V0Ro(2JFrq6<b!;HHes7uZjr;6HjrVc?eJcC<$]DmB~>
+JcC<$OT4qOrVc]mqtpEis7uWgs7cQerq0LfoCMPDnaZ,;n*]T0m-Es$l0.<mk2k[aj5T"Thqm2E
+gY1B6f@SR&eC)akcd'eZbK@oI`l5m6_SO"$]tCtf\@8oSZa-j?Y-"e*Wi2hlUnaWWT:VRBRUBP$
+?iOF9>BQWNDK>8poR$I_o6^F^rd4Ef"FY`JIt.HJrIGr!@:*MTA5Q0NI<Tp\GBJ"KE,f`1CM@Hm
+A7]XrrG;OPrGV^rs,RJHN/NQkMJ7$RHi/9jHhr-gI/n`qIK+cqI/n`qJ,4ZtIt3'#qgeNos+9ip
+!.t-$s+CK,JqJ^TK)1,rK`?Z1Jq8H&JV&K)Jc(*"Jbt&uJH^XVJqAW-qh"j#!.slps+(-!rI+`p
+pjW*i!e>cMrdOips*b3$IXZ]nI!pJCIJJ?bJ,aosIf4coJc:3!JcC?!KDgH(KnfS\r.b0*s+pH,
+s,-9'rf$f8!K<$;Mueosr/L]7s,@#=qMkN6qMkK7s,[2?rJpr?rK7#@plk`BrKS7]LimWPCMeuP
+CM86h@?jYY7n\)%9MnQ>L$40fK)U?!JH(-!If4]pHlm]]HH4(IaiV]Kc-Xqjg>:oRlg=-1o(2JF
+o_%kJo(2eMrUU9dp%A%Qp\=R^p_*>pp@\(KnF5o6m-O0/nFH;Jqq(irrVQE_nET/qqs0H.O,o!G
+Lk^M4M2$V4I!^R(NK9-`Oc53ULkUJ6K_C$sN/`mZOckonQC!u-S"-(BTqS6WVPgAmX0&M-Yd1UB
+[^WfX]=bkm^r""-`Q-'AbKJ/UcdC.heCE.%f\5'7h;7&IiSrnXjlY^gkiqBum-O--rpL'\nac8B
+oCW%Ts7QHerV6EgrqcQirVZWmoDX=@JcE@^J,~>
+JcC<$OT4qOrVc]mqtpEis7uWgs7cQerq0IeoCMPDnaZ,;n*]T0m-Es$l0.<mk2k[aj5T"Thqm2E
+gY1B6f@SR&eC)akcd'eZbK@oI`l5m6_SO"$]tCtf\@8oSZa-j?Y-"e*Wi2hlUnaWWT:VRBRRI-B
+$UI-I6pWaq<_Z@d;!h-L;Z9Vj;XdQ^;Ys<5;DBgX0ekFB1daMm4Zkef4ZYSa3&roV2Dm<J3]]8]
+qE#-_:J=GT9h\206:t*S;uBVo;u9Pk<W5r";c6Llr`&nrs&Ahps&T/"!*&qrr)<\q<;]Yu<)lmr
+<)icq!*&ns!`W)srD`bpp/Llg#ZO`%<E3!s;H!Hl"B8B#<)`]o!`N&tr)<Spr`8hpqc*So"]\K"
+<)cls;u]hq;ZKen<W5tr<V]So<Vobn;u0Ji<W,no;uT\m;uTbr;?0Yo<<#r"<)Z`p;ZB_p;uBVl
+<W,tt=8H%u<rcA#=o__!=T)>!=Su>$>4Yns=T)A&>5_\)>QA"&>5qh*>lRt,:DHPq9i=DL76sd3
+9I_GC0Le#Z3B0i4k_&hcrdjuts*t&trI+]n"abQADJa4hD%1B&FE`%[KSkeRQC+27rh'CdSt)7:
+rg*YOQ2[*VR$jA2S"#t?T:c(R,FY!dP`h)eMi*@GKnbGCO-5p&UoLZ-]Yhe5cd^S#gYLcFiVVXa
+iSWJGf[\BpbK%H4\@&QBWMH5[S=5_*MhZe2Uki/T=B8F#<`E's;,R<h!_lTmr`'8+=B/C%;Gg:f
+;"d[`N/`mZOckonQC!u-S"-(BTqS6WVPgAmX0&M-Yd1UB[^WfX]=bkm^r""-`Q-'AbKJ/UcdC.h
+eCE.%f\5'7h;7&IiSrnXjlY^gkiqBum-O--rpL'\nac8BoCW%Ts7QHerV6EgrqcQirVZWmoDX=@
+JcE@^J,~>
+JcC<$OT4qOr;HWmqtpEirqZQgs7cQerq-ZkoCMPDnaZ,;n*]TBlqZm3l07Eok2k[aj5T%Uhqm2E
+gY1B6f@SR&e'cXjcd'eYbK@oI`l5m5_SEq#]tCqe\@/iQZa-g>Y-"b)WMcYjUnXQUSt;IAR@'=]
+E;aYYD1oa(H%1bOPk1+6P5^U8OS4k9P6I29Q'R`&rKo1)R[T_7S"-"+KS+o.L50*-VP0]VT:haD
+R$EhrO,f$RL5(kRPED&lOd)&nP5W'"]XtbcI("-EL&R/2O8t@=OT1ICP5gaFOoUXBOoUaEQ2d-M
+Qi<BNRJiNJRK&`PS,\rWS,JfTS,\o]S",t:R@9QCR/EBORK/iUSc>5[S,SiXS!of<S,A`TRK&WQ
+QN*<OR.QdIR$mc;rg3VOrg<bTrg=+[R$a;0R$X,)Q'M<3!gJt8r0@DNQBqH6rg*PMpm1lFqj@DM
+s-WeR#b%6OR[]e8S"9PMrLj1arhBCer1s+a!2fFes/5psri#gos/,[kri#jrri#jrri5ptoW%ni
+ri6"!rN-%$ql]n$ricF.ZMq61[2Gp1I<p'ZP.--kOeJ2"EHkG^=IWGs?WaP:rIa]ppOiHsrdk#u
+s*t&trI+]n!.4_Bs82lrNW1'=X/jU?R@U@KU8k8iR[')/X08q>_8*C_Z*LR7Ycd]%=Gr,tO-#Ke
+Pa.Q%R@9V9StD^NUnsrdWN*&%Y->1:ZaI6O\[oGe^;%M$_o9X9aND]McHaeadaZdtf@\d1gYCWA
+i8ESSj5f=akNM0plKdg'mI'H3nF?MK!qZ'Vrq-?dp\4X]s7u]kqtpBjrVc<dJcC<$]`3K~>
+JcC<$OT4qOr;HWmqtpEirqZQgs7cQerq-ZkoCMPDnaZ,;n*]TBlqHa1l07Eok2k[aj5T%Uhqm2E
+gY1B6f@SR&e'cXjcd'eYbK@oI`l5m5_SEq#]tCqe\@/iQZa-g>Y-"b)WMcYjUnXQUSt;IAR@'?>
+?iF@8C6+!_E-M;.o6g.VrI"0_s*FQhq0`3j,(>#kJ:E*#JS&D$@q9+];0[M6H?XOUF`VSADJX*(
+B4kacrbh[OrGV^rs,RPJNJi[!L1kLIH?sr9HiSNhI/\NoIf=a(I!pHmI=6TqJ:E'!JbjosJc1,q
+Jc:8uK)gT%KDpK$K*?p\K7\`.rdt!!q1Sd#s+1<'JqEuQoRd!l"G28XJV!cO!/(9&qLSTs!J,e#
+J,XluI=?YDJ,auoIfb.MJ+nEkIK"]qIK"ZqJ,FchJ,XoqIfk4PJ:RWMs+(-#rdkE.KS+o1KS+r3
+qhG-+reCE-reUN0!/g`3rJLN2s,@#;qhtE3s,Hf4r/L]7s,I&=p5Ss0!0@)=rf@)@r/pr@plk`B
+qir%ZJT#ICC3tqZC3"fKC0Xq37S7o#9MnQ>LAcbrK_L,uK)U?"JH(-!If4]pHl7:SbKS5UdF-V!
+h;[S^mI0T9oCMVHp%J%LqXXXWs7H?a"SVTaq"aj_'DM4op%.bDn*]T0m-a?3o(MkUrnIJQrr;mF
+qY0RJl/U^Wf]0oAOH?>qJV/i3L5:S<J:2`rLl77RP*1f_MM[+@L4o8Q=Gr,tO-#KePa.Q%R@9V9
+StD^NUnsrdWN*&%Y->1:ZaI6O\[oGe^;%M$_o9X9aND]McHaeadaZdtf@\d1gYCWAi8ESSj5f=a
+kNM0plKdg'mI'H3nF?MK!qZ'Vrq-?dp\4X]s7u]kqtpBjrVc<dJcC<$]`3K~>
+JcC<$OT4qOr;HWmqtpEirqZQgs7cQerq-ZkoCMPDnaZ,;n*]TBlriZ>l07Eok2k[aj5T%Uhqm2E
+gY1B6f@SR&e'cXjcd'eYbK@oI`l5m5_SEq#]tCqe\@/iQZa-g>Y-"b)WMcYjUnXQUSt;IAR@'=.
+6:4+.6U<e'8PDrXr_W#[n5B-^r)2u\r_iYk)DO!$0JP:;2*jJm4?P\h4ZPP`3'&uW2Dm<Jr]1$>
+qE+^Q$;F2e9hS,.5Yb0Ur_r_o!)rboqc3Vps&8np!)rkrs&/nsq,RGqs&B"sq,IAm!)ieps&B"s
+s&Attr`&hr"&r2u<;]Yq<)`Zn!E2tm<<-"t<W?"t;Z'Gr<)Z^n;uTbr;uT`#;c6Ll<)lrs<r,hq
+;ufqs<!$&u;uTbq;ZKep;u]ks<;onr<!$'!<Us,e;u0Jn<W?%s<W5to;u]bn;[??&;c6Om;H$Qo
+<W?#$;c6Ll<;fbn<<#qu<r>ts<rQ1u=T);%=BYT+!*T2$r`T5&s&],#r)s#&oND,pr`T5(rEK;,
+!*f2$s',J-r`^7C;GL"]:/FhX763b$1,:C00/,jS1HINn;>l.=K_L,uK)U?"JH(-!If4]pHiSNm
+D@LN'FE`"XJr#AKQC+/5r1F1aS!o_2r0@_WR$a;1R[]h<StDYSSg9kqR$Nu!O,]$RLk^V<M2[LY
+R@^4RYdV-Z`QHNVf@o!8hr*Jji[NgAh:gK1ccjGJ^UgkYY,\@mT:DC<P`L]TIscK`IqN+k>%(H1
+<)lmrr_a>);+seb<E3($=&i7$<Dual;"d[eMi<XVOHG]jQ'Rf*R[]k>T:r!TV5C/iWiW>*Yd(L?
+[C3TU]"G_j^VRe)`Q#s>b0/#ScHsteeC<($f\,!5gtgiFi8N_VjQ5Oekiq?slg4!*mdKW6nc&(\
+oCV\So`Fj]p\jmeq>^<gqu6NlrUTr=s+13_s*t~>
+JcC<$OT4nNrVc]mr;6Kis7uWg!r)E^rq6<`!;$3\@I`jUn*]W2m-O''l07Epk2k[aj5T%Uhqm2E
+gY1B6f@SR&e'cXjcd'eYbK7iG`l5m5_SEq#]Y(hd\@/fPZa$a<Xf\Y(WMcVhUnXQUSt2@?R@';*
+P\t>UD/OZbG'nr?Pk(%5P5g[;OT1I:P5UUEPQ[8;QC!s;R/`TRRfAikKn4]+Kn`o?V50`VT:MUD
+R?s,$O8b(FLPCSHOckomOcu%/PPr2p]EYp(Q@!n0OSt76OT(CBP5gaAOoU^DQ2R!KR/<9QR$j?<
+RJ`NNRfSqGrgWnUs-s"V#b.?RR@'D1R$dc=s-`tXSG\rXSGeoWSFW-MR[a;F!h#FCrg*SNs-WhS
+!1NeQ&=T)WR[KV6S!oe6R@9P2R$[c=rgEeT!1EhRrL!kVQBmf$P`u'2pm1oErKdGM!13GGs-NYN
+!1EhRs-`kTr1!_Ts.01]!hZ-Yrh9=crhKFfq5+(frhfappo""f!2ognr29Omri#mrrMfaqri>[k
+s/H!ts/Z.#s/l(!s/ua5Z*LX?Za@*I[JdNPWfMRRG'K[gJ9d6YNM;>-JlGjC=^#-7Xg##,K_L2s
+K_g?#K)^E#JH(-!If4ZrI!bgLruUmmXg>:.StDmNTVo#mU7@L7WNNS7]Y_7dZEga;YOnssN)kt"
+OHPflQ'[l+S"-(ATV8-VV5L8lWiW>+Yd(OA[^N]V]=bhl^r!t,`Q$!@b0/&TcdC.heCE.%f\5'7
+h;-uHi8WeWjQ>Ufkiq?sm-O--mdKW6nc&([oCW%Ts7ZKerqQNhrqcQirVZWmoDX=@JcEC_J,~>
+JcC<$OT4nNrVc]mr;6Kis7uWg!r)E^rq6<`!;$3\@e&sVn*]W2m-O''l07Epk2k[aj5T%Uhqm2E
+gY1B6f@SR&e'cXjcd'eYbK7iG`l5m5_SEq#]Y(hd\@/fPZa$a<Xf\Y(WMcVhUnXQUSt2@?R@';*
+P[@a'?!q>jBPqm=rHn*_oR$Oal?i>Ss*aorrdXru)Im2^A7]=K:jdS6G^":RFE)8<D/F$&Bk1dd
+rbVpYDf'E3Df9TTrf7;EN/D7kCM\(jH2r<kI/eQjHi\YCrdFfqs*aop$[mJPIXZftIsup!Jc:2s
+JHC@QJGOisK)UE&K`?])K`$K%K(sutK)(&sK`?])K`-Q&JcLAnJcUFSrdk'#s+(<)JUrE*rdt#u
+qLSp&J:N)tIt%BHrdarss+'urn9tLgIXZcrrdOfqrdacns*jut"bD2SJUrFPJcC?$KD^E&KE$Z&
+L&d#-L&d#-M#N81MZ/J2MZ/P5MunutN;SV5N;eh2N;\_9N;\b9Nqn\1NrP1<NrP.?OSt==P5:CB
+PkUF]N.#Y]C2/9WDJF3FEd).]B15F<9h\DZL4t?ZK_L2sK_g?#K)^E#JH(-!If4[-I!a/cdad"*
+i8s4jn*oo>o^qhUp&t'\oCDGNo)A7\oDnR`p&Oj`q#C*gp(6lfnaGo6mHj3-n+$#Cq"t'Fs"46J
+qt^$ZnE]8thV6W0cHF#+P*M2fLP(J8Jqo8=Kn4Z$LPq+POckcaMMm:Eo7R(%<fW6&P*;,qQ^F21
+S=Z=FTqeE[Vl6VqXKA\1Z*UgG[^`l[]Y2(q_SX71`lQ9EbK\>YdF$Fme^i@)g=k?<h;@/KioB([
+k2tjjl07L"m-X6/n*fc9rpg*]o`"O`pAamdq#C0hqY^6hr;HTcrdk*#s1JA^~>
+JcC<$OT4nNrVc]mr;6Kis7uWg!r)E^rq6<`!;$3\@I`jUn*]W2m-O''l07Epk2k[aj5T%Uhqm2E
+gY1B6f@SR&e'cXjcd'eYbK7iG`l5m5_SEq#]Y(hd\@/fPZa$a<Xf\Y(WMcVhUnXQUSt2@?R@';*
+PX@f+5sRe,:/Fgb;".?N;ZB\q<<#no;XdQ_;Z0H41+t461,CdE5X.Cq4$#Pe4#o;_2`<QQ2)I-N
+48h5?3t4;64&8UF9MJ/Q0g83+qc!/eqc3Yq!)rho!)rkr!`Murr`';)<E3!t<E<+!<)`Tl!)rkp
+qGRAnr`/qs%olS.<E3!u<)Z[n;cH^p;uK\q;ZKeo<W?+u<<Q?%;c6Nh;[$#r;c?Xor`&nrs&'5'
+<)cju<E<.#<E)rs<W5qt<W5r"<E)mqrDWbqr_rkrr`&ntr_rhr"'&8u<;ohq<;fhl<;ohp<;ont
+<<#tu<;oo"<E)rn;ZK_p;uT_s<E/rrs&/krr`&tu;uTYp<;ohn<<#qu<r5ns<rQ1t=T);$=Su>'
+=]kN'q,mJrs'#"sr)iu%"Bo#5>$Lr1!*f8&oihK#;,@0c'MqRq76<k$2D-.7/20IM1HINn:f7.D
+pP&HsqLed!s+1-!s*t&trI#6)HZ4%LG^P'rMia3kS"?:Hrh9RiSt)7:Qi33MQi<@+R[]e:SXlCF
+StDUGS!fV.PE:f`M26q@KnbGCO-5p&V5gc-]>;J0cdUIugYL`DiV_[kiSWJGg"+Qrai2'-\$N9<
+Vk]oUS!TA%N/*%7H?XIMDJNus=BSg0<)Z[l;c6Ro;Gp:br)Eu'<`W4";Gg<`:]HASNfT9bPE_?!
+R$jG6St;UKUSO`aW2cl!Xfnt6Za@0L\@K5a]t_A"_SjF5aN;TJc-FY_dF6Uqf%8R.g>(N?hr*GP
+j5]4_k3(sml0@X%mI'E2n*olHncA@Srq6<bs7cNfs7uZjr;6HjrVc?eJcC<$]`3K~>
+JcC<$O8nhNrVc]mr;6Kis7uWgs7ZNerq6<`!;$3\!V,[Ymp,;Jm-O''l07Epk2k[aj5T%Uhqm2E
+gY1B6f@JL%e'cXjcd'eYbK7iG`l5j4_8*h!]Xtbc\$i]NZa$a<XfSS'W2HMgUS4BRSt):=R$X,(
+PEM&GCiYH<H%1qRPjjn3P5g[;O8tF9P5^[FPlI!KQN!3NR/WL"R[KV#JU`9(L1">bUS+<SSt2FA
+R$<eqNK8mOL5(hSOcblkPEc'1rOiNM]t(V5Tm_QRNr4t4OSt:AP5^XFOo(=APl6mHQ3!8:qj@GQ
+r0[YUR@9QBRerQUR[KWCRfJoRRfo7NR@'EAR/EBORK/iUSH,8\SHk[SS",t<S"0/@r0mYR!gf4=
+rg+@eR@0M4R@0P5R@0P7S"#k9S",t:RJiTRRK&ZRRJrZSR/iWRR0o=JQ^3r&Pa%K!Q2[*LQi!'K
+Q2R!OQ^F/,Qi!'MQ^3s:Qi<BKRJiTQS,\o]S=Q7DT:hkUU&UkeU]%"gV>d@lV>I.iVuN^kVZE`o
+rM]aos/,amrhomtW2TWnr2T^rrMfjuor8"mriH.%poaV"!O/j.ZN.B3[K!]7[iDo[UkX2?Fb.;f
+IX.!cM32@sLfL.@=^#-7Xg,(sL&H]$KE$Q'Jc1-!J,ausIK+\NruJPLX0SIeUS+-QZDXUnQ^=DI
+Z*_!Y^U1;N[BH^:or_VZN/`mZOckonQC+&.S"6.CTq\<XVPgDnX0&P/Yd1UC[^WfY]Y(tn_8=+/
+`Q-'AbKS5Vd*^:jeCE1&g"P39h;7&IiSrnYjlY^hl07L!m-O--n*fc9nac8BoCW%T!quB_rV6Eg
+s8)Wirqu]moDX=@JcEF`J,~>
+JcC<$O8nhNrVc]mr;6Kis7uWgs7ZNerq6<`!;$3\!V,[Ymp,;Jm-O''l07Epk2k[aj5T%Uhqm2E
+gY1B6f@JL%e'cXjcd'eYbK7iG`l5j4_8*h!]Xtbc\$i]NZa$a<XfSS'W2HMgUS4BRSt):=R$X,(
+PEM&7?"7l/CiF_!Hgc@SHi8?XHh_tII=?WpIXbp;?X[JU:f)OdH$FRVFEMYEDf'?,CM.9kASl=%
+D/O3/E,TZ6NfK0]Nf8jQEIVkJrHe9dr-\EjrdOfnrd>-&It)oqIXm!#J:R<D!J5n$K)L<%K`6W(
+K`$H&K(aisK)1-!KE?j\K`6T(K`$JjK)U?$K)U<(Jq8K*KDpK"Jbjs"JUi:JIft:QJ:N4KJGjs$
+J:E&tIt.BF!.XrrrdXrsrI4frrI=fss*t#srI=irs*k-$JUi=JK)L?#K`?Z,KS>/9pkAd(rJ:K1
+r/(K2qhkE3s,6r9rf$f6rf$c7pl#96N/[[orf6l8rJgl=rf6r<r/Lf=OT(CBOoU^COo^c2rKI2F
+!1*SKrK\@`Mfs#TBl]>[CMIjHE,ST]C.EVr:/"M[L55,LrIk$"s+:9%rIFots*jrqs*P7,gYUuS
+m-jK8oCV_Kr:^0_s7?9]s7?9_#kR]]p%J.Sq"aj_$2=/ep%.bDn*]TBlj)tInalJMqu5CN1B.4J
+q=s[Smcifkgt:0(c-")Fs43HuOHPEPLk^J8NeW:AI=?j+MiNj^Oc>6UM2$\<on6Y0N/`mZOckon
+QC+&.S"6.CTq\<XVPgDnX0&P/Yd1UC[^WfY]Y(tn_8=+/`Q-'AbKS5Vd*^:jeCE1&g"P39h;7&I
+iSrnYjlY^hl07L!m-O--n*fc9nac8BoCW%T!quB_rV6Egs8)Wirqu]moDX=@JcEF`J,~>
+JcC<$O8nhNrVc]mr;6Kis7uWgs7ZNerq6<`!;$3\!V,[Ymp,;Jm-O''l07Epk2k[aj5T%Uhqm2E
+gY1B6f@JL%e'cXjcd'eYbK7iG`l5j4_8*h!]Xtbc\$i]NZa$a<XfSS'W2HMgUS4BRSt):=R$X,(
+PEM%p5sdq19M\O^;"7EV;?0Sj;?0Yo;ufko;XdQ_;ZBTI0eb771,1^D6U*at4?G\h3]]8]3&`cS
+2Dm<P3]T2^3]fDa4?H>69MA)Q9h[Z?rDNJjs&8tsqGd>lr_reo$r^,);c?Rm<)lpt<)rWk"]\N%
+<)cfq;Ya5k<;ol$<)lpt;cN`r#uji$;c?Xo;GpHl<!6-!<)los<<-)!<W?)%<E)mrq,7>m;,[?k
+"&r9#<;oeq;Zg!"<E/rt"B8<!<)rlr"BAB!<)rWk!*/qrr_reqs&8qs!)rhq!``3"qG[GmrDWYo
+r`/ttr_j##<E<+"<)iiqrD`\nrDWbsr_rhp##eK$<`N*urDNbs;cEWoqc3Yqr`/qus&]5&r`9)%
+r`9/'=]tW*rE9&#!*T8&q-!`$qcNo&qH<_u#$G,6>?Y37r*05+qHEYur`gFK>?=Wr9h\;\77K[*
+76WU[1-7'W7Q<1b3E&dPm=kLlqLeg"s+1-!s*t&trdFfo(41O`M2mgeS"?:HU8"EWTq7dDR@'>,
+rg*nXR@0M4S=H.Arh'4^DOd/`QB[PnNJiXLL4t>:M2[O\R\-FVYdV0[`lcZXf@ep7hr!ANiSrhT
+i838Cf[S6i`koI"['6U0UnO?KQ^!\oMM?\1H$44HChdWqZ#X#N=]\X'<Dl^l<`)go:eaed<E<+$
+<`W4$<Dualoh\tQN/`mZOckonQC+&.S"6.CTq\<XVPgDnX0&P/Yd1UC[^WfY]Y(tn_8=+/`Q-'A
+bKS5Vd*^:jeCE1&g"P39h;7&IiSrnYjlY^hl07L!m-O--n*fc9nac8BoCW%T!quB_rV6Egs8)Wi
+rqu]moDX=@JcEF`J,~>
+JcC<$O8nhNrVc]mqtpEis7uWgs7ZNerq6<`!;$3\!V,[Ymp#5Im-O''l07Epk2tabj5T%Uhqm2E
+gY1B6f@JL%e'cXjcd'eYbK7iG`Poa3_8*h!]Xt_b\$i]NZE^X:XfSP%W2HJfUS4?QSt):=R$X)'
+PEM#gFFTg)I>7Q^nWWa2!0Qo8s,m#<rK@AKQ'IZ$rg*VPrg=gcK7ST+Knip%VP9`WTV.gER?s+u
+OH#0VLPCqTP*5^+!0mGqrk&BD^n#q+rJpf:q2kK9rfd2A!L&cIQ2[*KPlR3MRJiTRRJWHQRfJuX
+RfJuRRfo7NS",uIS,o+Jrg<bRrgEeT"IYaLS"0GJs.07^T(nfWS"-#FS,8ZSRJ`EOR/`TQRKK%L
+S!s8F".PgNS,8WTS!s2ArgN\Os-O"WQBd`$Q'M?7rg3DGs-NbQrg3PK!13\Ns-E_QrL!YSrL*VQ
+qO7VYSt;RIr1X.brhKIgs/#[ks.o^mqPO=lrhfgrVl0Nk!2odos/5jns/5^ls/Gdnri?(!ri?(!
+rN#ptri?(#riQ4'!3c@(r3$7-ZEppFrjDd7s0r$<!4i*?)lfB[HZjOkc&-gkXODQh:ksj)StfFl
+?<O83YO@5DL&H]&KE$Q&Jc:3"J,ausI>RtGo[U"HbG1W#Wh$2pWi)P]R[C+Y['[Tb\$NBGYcb13
+or_DTN/is\P*2&pQ^F21S"6.DTq\?ZVl6SpXKAY0Z*UgF[^`l[]Y2(q_8=.0`lQ6DbKS8Xd*^:k
+e^i@)g"P3:h;@/KioB([k2tjjl07L!m-O--n*fc9rpg*]o`"O`pAamdq#:*hqYU0hr;HTcrdk*#
+s1SG_~>
+JcC<$O8nhNrVc]mqtpEis7uWgs7ZNerq6<`!;$3\!V,[Ymp#5Im-O''l07Epk2tabj5T%Uhqm2E
+gY1B6f@JL%e'cXjcd'eYbK7iG`Poa3_8*h!]Xt_b\$i]NZE^X:XfSP%W2HJfUS4?QSt):=R$X)'
+PEM#g@;1%$DKbu*m<nPQrI!mWq0`3js*c,(@:3MSA7\S[I<g*^G^":OEc>o5D/3j"ARoXqD/O3.
+DuFYTNrP.FNfAsSPC%.fr-J9fs*F]lrd=TkrdFiqrd=Zm"b(rMI=?\DJG+QlK(josK_g<$K`$K&
+KE?dXK):0#K`$N(K_pE%KEHjYK7iNB#D%JYJV&K+KDpK&Jbjs"K7\^SJH16!IfP#qJbjm$JUi9#
+J:N.KIK4lrIf4`rIeeKlJGt&uIf4cqIfFm$J:W9'JqO#RrIas"",2JaL\Z](LB*/0M>W82M>`>1
+MZA_8MZA_6MZA_5NV/54NJrjVr/U]7s,R)>s,R,?s,d/>s,[5Crf[5Drf[;Fs-*MIrfmGJrg*SL
+r0I>K)ifSlDJO$6So\X\KWAd06Y:(%H$`7[;,2k%L$scoL&H]&KE$Q&Jc:3"J,ausI1,&tlgF95
+oC_eMp\4X[!ql3Xqt'gZ"SMK^p\4R[rq?Wjo^hS@n*^2A#jq'Lo(;\Pqu5CN2>m=Gp\".HlfR6a
+gXaj!bfRoC^q[t&WKEC>MM$P?Jr#>?L4k),JV]5EO-,QaN/NOLKnG$NKNO.kNfT9bP*D5uR$jG5
+SXuLJU84W`W2ZeuXfen5Za@-K\@K5a]t_A!_SjF5aN2NIbg+P]dF-Opf%8R-g=tH>hr*GPj5]4_
+k3(sml0@U$m-X60n*olHncA@Srq6<bs7cNfrqZTjqtpBjrVc?eJcC<$^&NT~>
+JcC<$O8nhNrVc]mqtpEis7uWgs7ZNerq6<`!;$3\!V,[Ymof)Gm-O''l07Epk2tabj5T%Uhqm2E
+gY1B6f@JL%e'cXjcd'eYbK7iG`Poa3_8*h!]Xt_b\$i]NZE^X:XfSP%W2HJfUS4?QSt):=R$X)'
+PEM#g6:"(8ohb6WpJUufqbmGmrD`eqr)2u\*)]Wg0eb::0JbRN5X.@m4$5Ve3]]5]2`EWR2)Y=n
+!BW@@3t4;J:JFMU9MJ2S8Pi8`r_iDfr)ESo!*&nq!E)kq<!#ur;tEri;cH`q<<-"t;ZK_j;u]hq
+<<-"t;Zg!!<E/rrs&9%u;H!3fqc3Ys!*/tsqG[Dlr_rhr"BAK'<E/oq!EE2!<!$&u;u'Am;tO&g
+<W,ns;uTbr;t*`d;uBMo;cN]qr`&nrs&9#"<W,ns;ZTitr`&hprDWet<;]Ys<)lq!qGdDl!*&bo
+s&9#!<rQ2#<WQ9(r`9)%r`B,%!*T2&rE0,&r`95)=]nj/qH<c#rE9,'s&o;(qcO/->?kB9>$G50
+>QS,5>Q.h$>Q7t-?2n4N?!1-':J=P\=@P_I6<H?0-o!e67R]9m3]U)8;=B8;L&H]&KE$Q&Jc:3"
+J,ausI0PIdP*VQ-U&C_mUnaWUSXZ(9R$[`<#+:pLS=Q4Brh'4^ELWD`Q'7;iMi!7FKnY8:MN*^^
+R\6OYYdM*Y`llc[f@o$:hr!ANio8qUi8*2Bf@/$d_nWdjZ)t"%U7Id@P`h)cLP(&%G]e"DCM@Hn
+@q0._Am&5G=&W!r;H-Um<)?Ii:0(@r<E3+$<``:!;,L-^:frX7NfT9bP*D5uR$jG5SXuLJU84W`
+W2ZeuXfen5Za@-K\@K5a]t_A!_SjF5aN2NIbg+P]dF-Opf%8R-g=tH>hr*GPj5]4_k3(sml0@U$
+m-X60n*olHncA@Srq6<bs7cNfrqZTjqtpBjrVc?eJcC<$^&NT~>
+JcC<$O8nhNr;HWmqtpEis7uWgs7cQerq-<aoD\:]naQPH?1.+Hm-Es$l0.<mk2bR_io/hQhVHuA
+g=k32f%&:!da?FecHOJSaiMNA`P]R/^V@Ip]=GG\[^<BHYct:4XK&7tVkp2`TqJ!JS=>q6QBd\t
+OcYW5C34cQOd24.Pjjn5P5g[DO8t@:OT1I9P5^[FPQ7!IQ78/fR>Q`PItNE.?<sD(TVA-NT:;78
+Q][DiNf&^LP*2#lPEV8rPEV5urk8<D$+QD6H%M$9NK&tqO8=t8OTCW/r/q)EP5^XHPa.O3Q3!8;
+rg<bTrL<YP!h5XJrgWtXrgWtXrg`tWq4%GSr0mYRs-itW".GaNSGf#XScYOTSbnoXSXfGDs-ihQ
+rKmPOs-`hSrL<kWrga"Zs-s1^S"#lGRg,CPS=5k7Rf8`TRf]%JRf/WYS!fY2QBmg6QMd*KQN*9P
+R$R];rKmSOrg*MLs-WeRrL3\QrgNhU"e;'OSXlAOTDYD_UAgqfV#I4gVZ!FmW;`^pW;idqVuWap
+VZ3RmVu`fnrhoOi!3,ans/Z.!q5XLsrN#q!s/l:'riZ=)r3-.)"0o/=[/IE3\,X#=\feVr]">SS
+Q[X:&Gam?:HBP"qNd>M?NEDUC>$5-6X0/YlLAlo+K`$K%K)^E$JH(-!IfFhTruq@=s6HkoYGIka
+YFqquXJMbfS"$4VZa70[]X+lKZ`^C6or_VYN/WdXOckonQ'[l,S"-(BTV8-VVPgAmX0&M-Yd1UB
+[^WfX]=bkm^r""-`Q-'AbKJ/UcdC1ieCE1&g"P39h;7&IiSrnYjlY^gkiqBum-O--n*fc8nac8B
+oCW%Ts7QHerV6EgrqcQirVZWmoDX=@JcEIaJ,~>
+JcC<$O8nhNr;HWmqtpEis7uWgs7cQerq-<aoD\:]naQPH?gd=Jm-Es$l0.<mk2bR_io/hQhVHuA
+g=k32f%&:!da?FecHOJSaiMNA`P]R/^V@Ip]=GG\[^<BHYct:4XK&7tVkp2`TqJ!JS=>q6QBd\t
+OcYW,?ta@sH@1*eHg?(OHi8?XHhi'hI3<06@p`_V@o-!LH[0m\F`qhGE,f`3CMRTrASl:%Df'Fj
+E!p]HO,o<]Mi)V7CiTE!!.+Qird+Qjs*X]ls*jurrd=Wls*b*!IXZcrrdaruon)pj!ec8]qh+m$
+rIb-'"G;;XK7s2Uqh5$'r.Fs$s+Bop!/(0#rdk!!rdt9(JV!]Mre(0$#(_AWJ:W6&pjiU!JUi9%
+Jc(&uIfOrgIfk4NJ:RQI!.afns+(-#!eQ&WrIY$$rIb3(K`6]"LAlu,M#E2+MZ/P6N;nh9N;\\7
+N;S\,N;nn8NrP+:Nr+n5O8tF@P5^[HPEPm.!gJt7rg!5Ds-NYN(lj/eD/3s;Ui1!hIsc'@;abCo
+H$`7[:eq"Dl\>Cmre13%rdt0$rdb#us*jur"n;*Tp%J+Vp]'pep&=RboCV_To`+Uap&Oj`q#:!l
+p%7hEn*]TBlj3%JnalGKq>:0Is#BrQq"OIPna,N%i8!#9da-+X`l#X-]t:lJ\rr;?N.lkBKntVC
+KnY/0It``=NKB<bN/NRML4k<SKO0OpN/is]P*;/rQ^F52S=Z@GTqeE\Vl6VrXf\e2ZEppH\%0&]
+]Y;.r_Sa=2a2lBGbK\>YdF-Lne^rF+g=tE=hV[8MioB+]k2tjjl0@U$m-X60n*oi:o()DDo`"O`
+p&Ojcq#C0hqY^6hr;HTcrdk*#s1\M`~>
+JcC<$O8nhNr;HWmqtpEis7uWgs7cQerq-<aoD\:]naQPH>41eEm-Es$l0.<mk2bR_io/hQhVHuA
+g=k32f%&:!da?FecHOJSaiMNA`P]R/^V@Ip]=GG\[^<BHYct:4XK&7tVkp2`TqJ!JS=>q6QBd\t
+OcYVp92//YoMG3XpepudqbmGmr`&nrqblo\"#DYc0)dU82D[Wa4[(ti4Zb\c3BR4!s#'j7rAsp>
+s#^fR4?QD79M8#P9/o77;H$Nn;Y3oc<!63#<E)rs;Zfut<)iiq!`Drqr)<Ypr`&nt"&r2t<;fes
+<;'8g<;ont<<#nq<<H3!;cN]op/LujrDrnss&J\is&9;)<`W1!;c?Xr<V08j<W?"u;uTbp<<?-"
+<;onq<<#ns<;ohn<<#nm;uouurDNYoq,RAm!*/tsr_r_orDW\ps&K(us&8qsrDi\nr_rhrq,RAo
+s&]5$#$4o/='&L+r`B,%!*T5'r)j5+='&L+=]kQ(r*',)r`T&#!*fD*s&fJ.>[1K:rEK8+r`f>)
+qcj)*ra#P1+CAG\>[1E1:ea_[;-ZRY4$c%e2(L%90LnPj1H@Hm:JpG4re:?)r.G!#s+10"s*t&t
+s*Y!;SY;eUU^<fjT:VRBR[KP1rL*\S".PjPT)PA^SgKtrR?j)#O,]'SLk^Y<LP^qLP*_`5VQ6u1
+]YMP1dF?e$gYUfEi;V^8i'H5Ug=Y!'bJq?0\$E09VP9]PR$EkrNJW@?I<g!WE,BB)B4YU`@U``1
+B3JDA=&`1";cHXn<)HOj:/Y(m<`N4&r`0,";Gg<a:gT$<N/is]P*;/rQ^F52S=Z@GTqeE\Vl6Vr
+Xf\e2ZEppH\%0&]]Y;.r_Sa=2a2lBGbK\>YdF-Lne^rF+g=tE=hV[8MioB+]k2tjjl0@U$m-X60
+n*oi:o()DDo`"O`p&Ojcq#C0hqY^6hr;HTcrdk*#s1\M`~>
+JcC<$O8neMrVc`nqtpEirqZQgs7cQerq1!toCMPDnaQ&:n*]T0m-Es$l0.<mk2kX`io/hQhVI#B
+g=k32f%&:!da?FecHOJSaiMNA`P]R/^V@Ip]=GG\[^<BHYck43X/`.sVPL#^Tq@pIS!ob4QBd\t
+OcNm^E-QeeQ^3r&Q26a7PPp[DOoLOBO8"b9OnOt;PQ-mIQ2['oQ^EV_JV/T1LKp^PU7n<PSXGq5
+QBRDiNf&XJL6@[]P`q;qrf[>KrOr6D#J#0,G(5C0NrG%7O8=t8Oo1C=P67&7QBqK9!1<bR!1NhT
+!1N_QqO@PVr1!q[S=Q4@SGo)ZSH##XS,A]TS,SrSSc>8^T:Z%QrL<nZSG&EPRerNQQirbCR$jB@
+RK/iRSGJcVSGo#WS,f,YSH#&fR[]e:S!oe6R@9V5R@*i:q3M2NQ^=*;Qi39QQ^3s8QN<JAo:#]K
+"ItsNS=]\O!207`!2BFe!2TUjr2'Ilql'Omri#:`ri#gori#Rks/Z.!rN#[oriQ1&r3-.)#-Y88
+Z*CXBrNuX6rjO;d]">Ve]Xthh]tU\INdH%oMmUQRHBG(jLj)]sP?=<N=]es3WiiP/reC3'p4iR#
+re16&s+:9%rIFot!IfHWs!.O@qtpEn\u`-EU7@gLVlm2"Vl#uTS?&j#[)0\gZa.$EXfqB"?Ajc%
+O,oEdPEhH$R$sM8StD^NUnjlcWN*#$Y->1:ZaI6O\[oGe^;%M$_o9X9aND]McHaeadaZdtf@\d1
+gYCWAi8ESRj5f=akNM0plKdg'mI'H3nF?&>o(2MGrq-?dp\4X]s7u]kqtpBjr;H6dJcC<$^]/f~>
+JcC<$O8neMrVc`nqtpEirqZQgs7cQerq0gooCMPDnaQ&:n*]T0m-Es$l0.<mk2kX`io/hQhVI#B
+g=k32f%&:!da?FecHOJSaiMNA`P]R/^V@Ip]=GG\[^<BHYck43X/`.sVPL#^Tq@pIS!ob4QBd\t
+OcNRLA86%-jF$WIrI!pXq0X63An#+WA7fCLI!^0bG]e.MF)c2:Chmg#B4YXkD/T>k"`SC!E,gp;
+NsC](MdVuhEd%G-s*FTird+Qjrd=ZmrdFiqrd=TkrdOlq"FbiMJ:RTLp4E$ks+LE+!/1?(qh5!%
+re(E,JqAZ/rIY*'r.Y0(rIb-'"GMM^K7icIre(3%rdk$"rIY0'JV!`NrIY*%re(0$!.k$!!J,jt
+Jc:0&JUi6"JG+KmJH(,uJ,k)uIfFotJH(,uJGjs"J:W<(pOiL!rdt3(r.Y!%rJ19+s,$T0repc7
+rJTlu!0-Z3rK$f:rK7)BrfdAHr0%,Frg!;F.[QHfQ^F2.R@0M3R[TFtHZ*b9H&S/-Bl\cKBO!en
+Db>>&:/+P[L5(D9reC3'p4iR#re16&s+:9%rIFot!e,Rjrq?fqq=saZp\+=Rp%7nRp&4Rap\Xab
+pBL?aoC;>=mf)PZmI'K6o_/(Vr;PRQ4T50Pp[n%HmcrrohV6Z3d*9_S`PTF)]Xt_a\_b`$P*;,d
+Jq\u9Mi*7DKn"W(M2[FSPELrbMi!7DK7iiM?Ajc%O,oEdPEhH$R$sM8StD^NUnjlcWN*#$Y->1:
+ZaI6O\[oGe^;%M$_o9X9aND]McHaeadaZdtf@\d1gYCWAi8ESRj5f=akNM0plKdg'mI'H3nF?&>
+o(2MGrq-?dp\4X]s7u]kqtpBjr;H6dJcC<$^]/f~>
+JcC<$O8neMrVc`nqtpEirqZQgs7cQerq0gooCMPDnaQ&:n*]T0m-Es$l0.<mk2kX`io/hQhVI#B
+g=k32f%&:!da?FecHOJSaiMNA`P]R/^V@Ip]=GG\[^<BHYck43X/`.sVPL#^Tq@pIS!ob4QBd\t
+OcN"&8PW#Ynkf*Yr_ibprDNGgqbmGmrD`eqr)3&^%ko^j0JP=;2+0Yo4Zb_f4T.;F2E*TR2Dm>i
+3r_8A4T.>D:JOSWr_!GJ7SQc\<)iipo2GQd!`N&tr_r_oqG[>ls&8qss&B%ur_ir!<E3!tpJ^of
+s&K"s!*9%ur`&kqr`&nrq,IAor)NetrD`Ggr`&kts&B/#;cQlj<!ZK'<Dudo;cH`j<V]Vm;u9Po
+;u0Jn<<cE$;c6Ll<;BMq<)Z`n<;oet<)lrm<!$'!<;oer<;T\k;uoosrD`hur`&r!qcEeupfIGs
+pK7W$='&L+qH<i%r`KD.>?b96=oDP%>Q7n,>6J,4>$G80>6A&5>[753r`]8)s'5S0s'@$Z?sd;K
+?<piC>$"Nq:/"DZ>=M"B5sR1T+t5T-84GHm3B0o5;,R=IpkSQtre:?)rIb-%s+1-!s*kT/IA3U9
+V5C,dUS4<OSXZ(9r0mVS/tAK(T:hgKSt2@>R$EktNf8jOLPCM:Ll.1QPa\2=W3!84]YVY4dact'
+gtprHrSde6-JmM1f@8-f_nN[gYcF[sTU_C7PE1]\L4au&GBIqEChdWqA7K+Yra?pYHZ<7m>Zk*,
+<)Z^p;c6Rl;,9nf<EE1$=&r=%<DudkoMAkPN/`mZOckonQC+&.S"6.CTq\?YVPgDnX0&P/Z*L^D
+[^`lZ]Y2%o_8=+/`lH0CbKS8Wd*^:keCN7(g"P39h;7)JiSrnYjlYail07L!m-O--n*fc9nac8B
+o^r.U!quB_rV6Egs8)Wirqu]moDX=@JcELbJ,~>
+JcC<$NrS_MrVc]mr;6Kis7uWg!r)E^rq6<`B_1fcnaZ,;n*]T0m-Es$l0.<mk2k[aio/hQhVI#B
+g=k32f%&:!da?FecHOJSaiMNA`5BI.^V7Co]",>Z[^<BGYck12X/`+rVPKu]Tq@pHS!o_2QBdYs
+OC2O4Fa8\+R$X/*QBh91nWWm6s,d;Cr/^]9rK6f:rK@;IQ'M?7)NBH$I=m90?XBP*Tq@sKSXGq5
+QBI>gMM[%Brf[;F"dP=9Pa%L4^&P_M]l^])I#!cDrJ^f;qN(K7qiUi?qND/KQ'R`&Q^F0>R/i]S
+Rf]+LSGo#WS,o+Lq4.SYSY#hO!1`tX"J20SSXf\K!1NkUrg`hUr1<bUoU>iLrL*SNs-`eRrLEnW
+!1`qWs.97]rg`nWs.'+[rgX=bS=>t9R@9S4R$dl>rg*PMrg*PMrL!PM!LT;SQiWP@rg3YPs-`_Q
+qO7GRrL<kYrLj(^!2BCdrhK^oVP^8gVY[4fW;WXnW;*:hW;`^oW:m4kX8T$uX8B!tXoGO*Xfei'
+YQ(j)Z2_*4Za@-J[f3`=\@K5a]_oGe^;%J!_5j2\GBS+bXGhLOY.]jZKlM?:=dl9m=^>11Xfnqt
+L\Z](L&Zi)KE$Q'Jc1*#Isuj/rrE#pq]GjYXhq?<TV&HbZEL7*VOjHPV67/3]#;1eZ*Ua=XK_B#
+=c&&qNK90aP*D5uR$jG6SXuLJUSO`aW2cl!Xfnt6Za@0L\@K5a]t_A"_SjF5aN;TJc-FY_dF6Uq
+f%8R.g>(N?hr*GPj5]4_k3(sml0@U$m-X60n*olHncA@Srq6<bs7cKes7u]kqtpBjrVc<dJcC<$
+_#Jo~>
+JcC<$NrS_MrVc]mr;6Kis7uWg!r)E^rq6<`A+T9^naZ,;n*]T0m-Es$l0.<mk2k[aio/hQhVI#B
+g=k32f%&:!da?FecHOJSaiMNA`5BI.^V7Co]",>Z[^<BGYck12X/`+rVPKu]Tq@pHS!o_2QBdYs
+OB#CjBP_d=IH5eJHi8?YHhr+0B4G:T@q9.J:jdS8GBS+OEcZ2=D/<s$B4YXlDZ4SSE#!;2E,gnu
+O,o<]N)kaKDg$GQH$O^^r-SHirHnNkrdFcps*aloqgJHmrd=isJ:RTLpO`<q!JH+&K`6])KE-Z$
+KE-Z(K`6T(K`-Q&K`-W(K`?](K`?c+K`?\tK)L?%K)L9"K)L<'Jq8LNK):0#K`-PuK)^H'K)U?"
+K)^B&J:[ZL!.k#s!.Oosrdauts*t*!rdFs!J:N.HJGk$!K(afsK`-N'K`$Q%LAQc+M#W80L]E;-
+MZ8V5N;nh8N;nn/Mu\k7N;nn6NW>.=NW>.=OT(@FOHGZgOoCOBPQ-mIPPg[FQ2HsIQi<BPRK&`T
+S,]#YRi\)\LimTOCj1\YCMAN_F)k_n@Rj%8In`[7:54LWL%'lnLAlo,K`-Q'K)^E#J-(4LIfB0C
+q#:$fpAadep@\+UpAam`q#:"#p%7hEn*]T0m-X60nacAIq>:-Is$-JZq"OIPnF#W*jPS_Ee^Dde
+aMu08^qRIm\@B)\]=H.XOe._nL4bG?N/ECGKn+`*Ko1kMOctibMi3CGKSK/Q=c&&qNK90aP*D5u
+R$jG6SXuLJUSO`aW2cl!Xfnt6Za@0L\@K5a]t_A"_SjF5aN;TJc-FY_dF6Uqf%8R.g>(N?hr*GP
+j5]4_k3(sml0@U$m-X60n*olHncA@Srq6<bs7cKes7u]kqtpBjrVc<dJcC<$_#Jo~>
+JcC<$NrS_MrVc]mr;6Kis7uWg!r)E^rq6<`A+T9^naZ,;n*]T0m-Es$l0.<mk2k[aio/hQhVI#B
+g=k32f%&:!da?FecHOJSaiMNA`5BI.^V7Co]",>Z[^<BGYck12X/`+rVPKu]Tq@pHS!o_2QBdYs
+O@;]49hnJ\;=[QX;#jMn;uBPh;>X5k;uK\q;u9Jb;?&?`0.en51,UjQ5Wq7m4$5Ma3]K2!2ZGW4
+3r_8W4?GYe4&8UH9M8#Q-:1I(;H-Uo;c6Na;uKYr;c<QmrD`Pjs&9/#;GpFn<W5qt;uTbr<W?%n
+;u9Pn<W5r"<E<+!r`/ttr_reqs&8\l!*/qts&K(upJV;r<E)st<E</u<<6-#pf.8l#ZOf';c?Rl
+;cEWpr`9%urD`hsrDWYo!)rGfrDibos&Akq!E;tp;u]f!;cHasp/Lujs&/nsrDihts&Anrr)<f!
+<`W4#pf@2lrE0&%qcNl$!*B/%oN;6!>?_#/!*]8(s',V0>[.22!*oM-rEB2)s'5S.r`]>+s'5S0
+$=7(H?smDN?sd5IrE]V1<)$+^r_F7u6q'F25;k&I3\E*U6o?e]3)WXO;=KA:LAlo,K`-Q'K)^E#
+J.-pVI]'*@VPBiWT:VSPS,\rWS,]#YSH,8[TDtK0SXPt5P`h,fMi!7FL4tA=MiNseS=laYY-YXN
+_T:!Ne^rL/h;7&gi?mL?hqd&>f$_d^^q-tZXf8+iSXPk.OGo$NK7A8mG&qY@C2%?nAH$*<@O#Dp
+ARoga=C>96<Dldp<)ZXl:f:+c;cHe!='/L(<E)jo:f6m^=c&&qNK90aP*D5uR$jG6SXuLJUSO`a
+W2cl!Xfnt6Za@0L\@K5a]t_A"_SjF5aN;TJc-FY_dF6Uqf%8R.g>(N?hr*GPj5]4_k3(sml0@U$
+m-X60n*olHncA@Srq6<bs7cKes7u]kqtpBjrVc<dJcC<$_#Jo~>
+JcC<$NrS_Mr;HWmqtpEis7uWgs7ZNerq6<`!;$3\"nD*Nn*]TBls8rBl0.<mk2k[aio/hRhVI#B
+g=k32f@AC"da?FecHOJSaiMK@`5BI-^V7Co]",>Z[C!9FYck11X/`+rV50l[TV%gGS!fY1Q'@Jq
+OC)U=GC>@:R@'A.Q^3r&qNUK5rK@2C!0I,>q2kQ;p6,E=s-+OhQAgQLJ:iW2@:5q.T:hgKSXZ(4
+PECreN/<@HPl?jJP*D10PQ@&8rk8?E"hf>HTR2:iNrY4>N<#"7O8=t9OoCO>P6[>;QBml(R$dl@
+!1NkUrgWtZrgX"[SGJfQScPCRrLNnYrgj(Zr1!\Uq47ARrLNtY"IkpOS"0DGs-s4]R[TY4rg<YP
+s-ikT!h>aLrg`qXr1<qYrga%\rLF1bSXc4>S",uGRfAfUR/**KQN!6NQiibFR$[f>s-`nS!LK2Q
+R0K%HR[T_8SGf#VSGo#XS-GOSSXlCGT`(SaUACYbV#I4hVZ*LnVZ3RmW:?e_W;`[qW2]Kjs/Z.!
+s/Z(!s/l4&"L,/9Ycn&1s0;U0&[AXJZa@-J[^NZT\[oDc]tM/Z^]2+L_'6b7a2uN+RsoX)H*4'#
+H^(8HKoAr`M,RNFVcm8/=KAR-YOdSIL\li*L&Zi)KE$Q'Jc:3"J!9m4rVZO:r;HTos0Sr4VP9Wb
+TsV#(Vl-5^TVSWl['[`e['R'HYHG/&Y?m*FN/is\P*;/rQ^F52S=Z@GTqeE\Vl6VrXfek3ZEpsI
+\%0)^]Y;.r_Sa@3a2lBGbg"G[dF-Lne^rF+g=tE=hV[8MioB+]k2tjkl0@U$m-X60n*oi:o()DD
+o`"O`p&Ojcq#C0hqY^6hr;HTcrdk*#s1nYb~>
+JcC<$NrS_Mr;HWmqtpEis7uWgs7ZNerq6<`!;$3\"nD*Nn*]TBlrEB:l0.<mk2k[aio/hRhVI#B
+g=k32f@AC"da?FecHOJSaiMK@`5BI-^V7Co]",>Z[C!9FYck11X/`+rV50l[TV%gGS!fY1Q'@Jq
+OB5^uC2eBFiI(<FrI"!Zqg9;qARSqUARnY9I!g0`GBS(MF)Pr5Chmg"B4h-^s)&EfDfBZ8EH7)#
+O,f6Z?#tI3Fo?UeH$]12rI"TmrdOip!.=WkrdOfo"b2&RJV&IIJcgXYK7j#Rqh5'(L&$B%L&HZ+
+K7npVKDgK&L&-K$L&Zi+KDgB%KDU9!KE$Q&Jc13#KE$T)KDgE%K`6W(KE?dZK_pE$Jd[-]JqJ`/
+JqAQ*JqNuQrdb'$rdk'!r."]rrI=fsrdXru!IoY!JHLFRJqEcMre19'!/1?(!/1?*r.b!%!/UW0
+!f2\iqMP60s,?u9mYq1*rf$c7qMtT:!07&>rfI&?!0[>Frf[5DrKIAKPa)-3rg*SNrg<_Rs-itW
+!1a%Zrgk:*TVA9DKQ1jED2a0gC34uoDf%sRCIUp@In`U49nn@VL%C,tL\li*L&Zi)KE$Q'Jc:3"
+IfT<Dq#:$bpAajepAXg^p_NW!p\+:OnaQ#8mHs9.mdTc=p@nF]rnm`CrqlNdp%%V?lf[Bgh:^E/
+ccsVR`P]O,]tCqd\@K2_]Y(rIbES0QNJW=JL6%:NKnb52J;/o>O,oNfNf/gQL4k;6on?_0N/WdX
+OHPfmQ'[l,S"-(BTV8-VVPgAmX0&P.Yd1UC[^WfY]=bkm^r"".`Q-'AbKS5Vd*^:jeCE1&g"P39
+h;7&IiSrnYjlY^gl07L!m-O--n*fc8nac8BoCW%Ts7QHerV6EgrqcQirVZWmoDX=@JcEOcJ,~>
+JcC<$NrS_Mr;HWmqtpEis7uWgs7ZNerq6<`!;$3\"nD*Nn*]TBlr<<9l0.<mk2k[aio/hRhVI#B
+g=k32f@AC"da?FecHOJSaiMK@`5BI-^V7Co]",>Z[C!9FYck11X/`+rV50l[TV%gGS!fY1Q'@Jq
+O@D`3:/4^c;=[QZ;#jMl;uKVi;>X8k;uK\q;uBPf;&`Ch0JG+61,:dF69dXs4$5Yg4#o>_2`ETP
+2)Y:mrAtHN4$6;69M8#P/3ZEu;>jGp;c<*`s&9/#;GpFm;u9Ph;ZTirr_`br<V]Vo<W?%p;u0Jn
+<W5tt<<H9%<)iiss&8tsr`&nrp/D#lrDinurD`_o!*&qrs&Aqsr`9"ur`9"ts&K"ss&8nrr_iep
+r_rbqs&K2$<)`cq!EE+t;s[K`<<-"q;u]hp<<5urr_s,$<)lpt<)lrt<<#np<W5qt<W5th<Vo_s
+<E<,t<rZ1u<r,nr=92K*qH!]"=oDIp=TVc2>5h\)>5VV&>l.b(>5qh*>lS"8>$G39>[:ZB?XR:?
+@/s^7@3f5f?XR;O@Tlc.9MJ8c:IR]55taF$.5Et:0L\Gg2*!Wo;Gg<_M#2u)LAlo,K`-Q'K)^E$
+JH(*(VPU&^TV%gHqj^o^S=Q4BT:hjLT:VUDR[BA(OcPHYM2-k?KntSEO-H'(USk2t[(3rhb0JJd
+f@o$9hr*JPi8<DJgXt--ccO)<\?iB=VP9]PQ^!SkMM?e7I<g!XEGoZ.BP1mer*q*`A7]@dBPEHG
+>$5!/<E3!r<`E!r;Gp@f:fg\!<`W:&<E<'r;Gg9`;-o-=N/is\P*;/rQ^F52S=Z@GTqeE\Vl6Vr
+Xfek3ZEpsI\%0)^]Y;.r_Sa@3a2lBGbg"G[dF-Lne^rF+g=tE=hV[8MioB+]k2tjkl0@U$m-X60
+n*oi:o()DDo`"O`p&Ojcq#C0hqY^6hr;HTcrdk*#s1nYb~>
+JcC<$NW8VLrVc`nqtpEis7uWgs7cQerq-<aoD\:]naQPH>OLnFm-Es$l0%3kjlGI]iS`YNh;-i>
+g=Y$/e^W'rdEp1abfe/NaMu3;_ns4(^:_+i\[])UZa6p@Y-"e*WMl_kUnaWVSt2C@R@';*P`h/:
+@qp+3KpS6rRJrTRQNEJ<Q2Hm9PP^LEOcY\&O84n:OnOt:P73\@M1U51L4tIiV59sdTFd]cS=5e/
+P)kQZMMR%OPa%I2PQ@&8rk8<D"M:+sItR`]rf7#<!fi>'qN(N8rK7,Cp6,uNQ'R`&R$a;0R[]e:
+S=TYLs.01[qjmbY!hZ'Vr13n\rgj=bSt;RGT:Z%Qs.'%W!1`bRqORbZSt5kN!1j(YrgWkVs-j"W
+rg<hTR@4&CqjRYWS"'DIs.0%Yrgj%[!1itX#+_9SSXQ%;qjRPQs-WhQs-WePrKm\TR[KQ@RJiNN
+Rf/]USc,/WSc,&\StDXHrh04`rhB:bs.oXjrMKRlrh]apW2T3`qPaFl!iW)tpT"4nri6"!qlBe"
+ric@+!3uO/!42X/!4)U1s0Vg6s0abn\@K2_]Y2%n^VI\%_Sa:0`Q60FcdUFNVic@OG+,5'J9d<S
+RuX.A;iXm\TNbQ,>Z[u/ric'QqM>**r.b3)s+L?'s+16%rI=ltQi@*cr;QQor;HWos8=&>oY%H6
+ZD!k]WNrh1W2HVfU8"]k[C*Ta]!ScLZ*(8%Y?A#cN/`mZOckonQC+&.S"6.CTq\?ZVPgDnXKAY0
+Z*UdE[^`lZ]Y2(p_8=.0`lQ6DbKS8Xd*^:keCN7(g"P3:h;7)JiT&tZjlYail07L!m-O--n*fc9
+rpg-^o^r.U!quB_rV6Egs8)Wirqu]moDX=@JcERdJ,~>
+JcC<$NW8VLrVc`nqtpEis7uWgs7cQerq-<aoD\:]naQPH=mk\Dm-Es$l0%3kjlGI]iS`YNh;-i>
+g=Y$/e^W'rdEp1abfe/NaMu3;_ns4(^:_+i\[])UZa6p@Y-"e*WMl_kUnaWVSt2C@R@';*P`h/.
+=CGiYFF8MqI.M^`I.)FZHl?R)?=RPWAl*l&H?j[XG'.nIEGfW/C1q9nBDHNHE=6fIO,o<]NJr(2
+DKP]#pNume!I]@bIK"]qI0>"KJ:W:EJcgXYK7j/V!/:E*qh5*+Kn]AV",2D^L&Qc(KDpQ(K)gT(
+L&?W#L&HZ(K)^K%K):3"Jd$^WJqJ`/r.P'%"GDJ^K7j)Trdt3(rIb-$s+:3&!eZ)Vre'or!e>iP
+rdXirrdOourIOlsr.=j!rIk3'rIk3'qh4s&rJ(*&s+pZ2rJLT4regK/n;R1&q2Y?5rfI&?!0[>F
+!gJn4rfdDJr07,Es-EYNrKmhXR[T_8S=Q8NT-Br%U8+Q^WN;>BI;Wk:JVT"uBl\cODL+`>CI_!B
+:/+\a:&]nIL%gH#M#E,,LAlo,K`-Q'JcLB#J,t/prq?Ngp\4C[pAt'`rqQKgr:p<d'(tnfnaGo5
+mHj6.n+#uApA"O`hu=l!r;-3^oC2,4kN1[Zg=Oj$cH=5J`59:&]t:hb\[oDc^&>YeaLR_%PEUiU
+KSb\JM2$b=JqJf7MiEd[Q&gl]Mi!1AoS$G$MN!OUO-,ThQ'Rf)R[]k>T:r!TV5C/iWiW>*Yd(O@
+[C3TU]"G_k^VRe*`Q$!?b0/#Scd:(feC<($f\,!5h;-rGi8N_VjQ5Oekiq?slg4!*mdKW6nc&(\
+oCV\So`Fj]p\jmeq>^<gqu6NkrU^#>s+13ds*t~>
+JcC<$NW8VLrVc`nqtpEis7uWgs7cQerq-<aoD\:]naQPH=75JBm-Es$l0%3kjlGI]iS`YNh;-i>
+g=Y$/e^W'rdEp1abfe/NaMu3;_ns4(^:_+i\[])UZa6p@Y-"e*WMl_kUnaWVSt2C@R@';*P`h.t
+7nQKO:\mrZ;#4&h;Z9Vl;Ya2e;ZB\p;ufkn;YX*"0J>%51,C[C69mat3]fGdr]19E3&W]Q2`3Jl
+3WV<)r]:9G4$6;69`7Tl4\8LK;c?Xp;c?Rlp/:rjr)3_t;c6Llpf-uds&/kqpJh/m!*&qr"&r2u
+;u9Pn<W?%r<W?##<E<+"r)E\pq,@Gp<)clr<WH.s<<#ns<<#ks<;T\o<WH/!<WQ3"r)Nbrs&8nr
+qG[>l#$"W%;c?Xpr`/tts&8Ac!*0"t!EE+s;u]hp<=)W'<)cjt<)cjtqc*So$WL,,<`N*t;cQju
+<;ons<;0Am<rH%s<rZ5$<rQ+u<WH/!<rH,!=SPqu=BYT)oND/sr`T8)qcj#(qcj&'r`f>+r`]V4
+?!UcC?XI4=@K0g:A,g!_@:E_VA7fLY=Ahph93"bc7RfL,5rCbP-orq56oR"c3]L&9r_`EHqM>**
+r.b3)s+L?'s+16%rI>0'U7e0OSXl@Drgj%[=eD@[TqS-NSt2@=QB[PoNJiXLLPCJ:M2R@UQCFPC
+Wii\;]YVV2dF?b"gYL`Di8NYQhqm2Cf[\En`P8sjYcF[sTU_C6Oc>3PJq&/nG&qYAD/*ctAn>NN
+@fp7QAnV'V#\n'\>Zk92=&o6!$!'u(<)HLh:f^Qo<sDc-<E)mp;"RUf:l:3kO,oEdPEhH$R$sM8
+StD^NUnsrdWN*&%Y->1;ZaI6O\[oGe^V@V%`5Ta;aND]McHjkbdaZdtf@\d1gYL]Bi8ESSj5f=a
+kNM0plKdg'mI'H3nF?MK!qZ'Vrq-?dp\4X]s7u]kqtpBjr;H6dJcC<$_>f#~>
+JcC<$NW8VLrVc]mr;6NjrqZQgs7cQerq-<aoD\:]naQPH?1.+Hm-Es$l0.9ljlGI^iS`YOh;-l?
+g=Y$/e^W'rdEp1abfe/NaMu3;_SX+'^:_+i\[T#TZa6p@Y-"e*WMcYjUnXQUSt2@>R@';*P`h/9
+B5i'EMOU*(R[KTCR/`KSQBda5Pk1+7P5gXEOSk18OT1I9P5URdN.lk4KnY:g?_sQjTV%gIR[]Y.
+P*(``Mhd.QPEM/qr0.2JrOr3C"MoqBJroqlrJgl=rfHu;r/_)EP*(liP4k(>Pl@!KQiEEVR@9V7
+S=KMJrL<nZT)P;\T)G;\T)>5\T)>2_SXuCCrL="]S=Q4BpmqDUrgj(\!1j+Z!1j(YrgWnWrL3eU
+rg<bUrgN\Qr1*bWqO[_Xoq)2S%%NfVSXc1<S",t:R@3o="dtgJR@'B7RJrZTRfJuXSc,/YTDtJ]
+S-,=RT:c+U!29=brM04brh]Oir29RnrMKXop8@\arMfOkri?!ts/Z.#s/l=(s/uL.Z*F)1rj;[4
+4LV`/\[oDc]Y;+p^qmq,`Poj;aNDcRe(34.hVkZ3N-KPlNh_eeHEb/ELj!lAP#n?K=B]':=KAU/
+YHRPSr.t?-r.b3)s+L?'!ePuSrd^F:!WDrqqu?Wmrr)j=eulKeV4aQoY.:^8Vl?8`Tr5#s['die
+['R-JYcY12p9.Z&M2R=PO-#NfPa.T&R@B_;StMdPUnsufWiE/&YHY:<['mHR\\#Mg^VI_'`5Td<
+aihlPcHjnce'uq!f@\g2gtgiEi8N\Uj5oFckNM0plg4!*mdBQ4nF?MK!V>s_p&Facp\sseq>^<g
+qu6NlrUTr=s+13es*t~>
+JcC<$NW8VLrVc]mr;6NjrqZQgs7cQerq-<aoD\:]naQPH=RPSCm-Es$l0.9ljlGI^iS`YOh;-l?
+g=Y$/e^W'rdEp1abfe/NaMu3;_SX+'^:_+i\[T#TZa6p@Y-"e*WMcYjUnXQUSt2@>R@';*P`h/1
+?=[eiG^fX?jF$fN!.+HfrI"*]r-TPuA7/_SA7\S6I!U$^GBS+MFDu/8D/3m#B4l1&DK#Mnrc&?f
+NfK0]NfK'\E,0NAq0Md^rd4cqI!kC2s*b0#IXZftJV!NHre(0&s+UK+qh>')!/:3$re:?)"+u8Z
+K`-Q'K`Zp]L&H]%K`Hf%KDpK%KD0rtKD:*$KnP0VK`-N'K`-N*JqJZ-qh5!%&qkmjK7ec.JqJZ,
+K7\]+It*!!rdb9(It*!!JV*]Krdt-%qLng$pk8[$!JZC.LAZi'M#N80MXl\qN;JV/Nr"h:OSk7@
+P5g^IP`q=+Pld8:Q2R!KQi3<OR4k"uS"-"?T:hmOU8+N\VlHi%Z*Ld#Lj3lUCjLk^Ch\W`F(o#b
+7rCtIGtq(2:egqDs+U'$r.t?-r.b3)s+L?'!ePuSrdY.Hp\4IWqY9s`r:gKjp@\%InF-AD$LI3L
+naZ5Ep\Ogei;Xu"r;-3^oC;87kiLaYg"4^"cHF>L`59=(^:_%f\@K2_]`,YF^E^P1_:toPQ]d8^
+LQdXYMi!1BJV/T0MMmOVQ'%&aMMd1BLP5AT>(h`jN/`m[P*2&pQ^F21S=Q7ETqeE[Vl6VqXKA\1
+Z*UgG\%&u\]Y;.r_SX71a2lBGbK\>YdF$Fme^i@)g=k?<hV[8MioB(\k2tjjl07O#m-X6/n*fc9
+rpg*]o`"O`pAamdq#:*hqYU0hr;HTbrdk*#s2+ed~>
+JcC<$NW8VLrVc]mr;6NjrqZQgs7cQerq-<aoD\:]naQPH=75JBm-Es$l0.9ljlGI^iS`YOh;-l?
+g=Y$/e^W'rdEp1abfe/NaMu3;_SX+'^:_+i\[T#TZa6p@Y-"e*WMcYjUnXQUSt2@>R@';*P`h.u
+7nHHO;YX,\;#4&_;Ya2e;ZB\q<;fbn;Yj5m1GUX:r\5'D1-n,e4Zkeh4?GSa3]AuT2`3Jl3WM8@
+4:XG83]p26:/">S9L;0F;Z0Ms<)Z^n;YF&h<;f_t<)Z[nr)<Yrr)EGis&/kqp/M&l!`W)spJh)k
+!*&eps&T(uoi1oh!E<(s<WH.t;ufkr<!#ut<;ons<;T_j<W#hr<VTJm<;fbq<;fes;u9Mp<`T)t
+!*/kps&K(us&B%ur)3Spqc3Sos&B2#<)lmsrDWYos&KM-<)Z^p<`W4#<``<#<;]bn<rH%s<WH5#
+<rQ)"<)rour)Wr%=]kK$r`B2(=S#\p>5_V(>5DJ'>QA"*>5_\'>R=V>>[:ZB?XI2Kr*fV8s(!Nh
+A7K.]AnPdkCi+#n<_cCa:/Y"\7R]U44u+oE.6B4S7Q*+b3]L&9r_`9Dr.t?-r.b3)s+L?'!ePuS
+rdY$CTDkG\T3It\TV/!QU7n6OSt)7:Q'7>kN/EFHLP:D;MN!U\R@U(MX0B"B^Ve.;e(*(&g>(N@
+i8EMMhVR#>e^Daa_7R+[XJhqfS=,Y*Nf/XEIscKaF)c,8C2%<nAS(aK"(Z"VC&VlIC]A2oD0TPo
+>Zt60;cQb";c?Xn;G^.h<`W:%<`iC&<`Dso:f$d^>#:'6N/`m[P*2&pQ^F21S=Q7ETqeE[Vl6Vq
+XKA\1Z*UgG\%&u\]Y;.r_SX71a2lBGbK\>YdF$Fme^i@)g=k?<hV[8MioB(\k2tjjl07O#m-X6/
+n*fc9rpg*]o`"O`pAamdq#:*hqYU0hr;HTbrdk*#s2+ed~>
+JcC<$NW8SKrVc`nqtpEis7uWgs7ZNerq6<`AFoB_naZ,;n*]T0m-Es$l0.<mjlGI^io&bPh;-l?
+g=b*0e^W'rdEp1abfe/NaMu3;_SX+'^:_(h\[T#TZa-j?Y-"b)WMcViUnXQTSt2@>R$X,(PEK<a
+CNY#ZR[]h:S!s>Erg3hTQBmf$r06i;plY]@OHBC$qN(]>o9'QHMM?h:L51Ok?DXHmUAghbRKo.C
+PE(W^M22(o#aC[?Pa.MuQ^@]bs1A]P_ROf>NKB6_OHBC$rK-r<qiCuDP*(liP4k(>Q2R!RQ^F2/
+R[]h;qjm_Vs.01]%%Wu]T:_dKT:hgJTV27U!1s1^!MH(aT)Y>]SG\rWT)Y>]SGSiWT)G5[T)Y>_
+S=Q5LSH#)WSH#)YS,f&XRKB"KReiNPSH#/SScG>\T)5/ZScG>\S-b[TSXl7>S=H(<r0[VRR@4#B
+s-`nUs-`bQs-WnVS,Ji[StDXJTDkDaT:hgKrgs(\rh'7br1a1cqkX7es.oOg#,\;rW2HSmr29Rn
+q5="dr2KLlorA(oriQ1&#-Y88Z*L[ArNuU27C9J0[C3NQ\@K2^]Y(ql^;.P$_o0R7a2lHJcI17r
+gYUoMkNV96Sq;95MOpZ%HBtAYM4Ti-<g?gZT35?'>Hb*0Yck8"M>`80L\uo,L&Zi*KE$Q'JcC7k
+rrN,trql]nr;QQm*jr)OVk]odVmW_/Wi2YhU8G)u['mZd\[8ZKZ*(:5p94M!?AaZ"NfT9bPE_?!
+R$sM7StD^MUSOcbW2co#Y-5(8ZaI6N\[oGd^;%M$_o9X9aND]Mc-F\`daQ^rf@S^0gYCWAhr*JQ
+j5f=ak32'olKdg'mI'H3nF5u=o(2JFrq6<b!;HHes7uZjr;6HjrVc?eJcC<$_Z,,~>
+JcC<$NW8SKrVc`nqtpEis7uWgs7ZNerq6<`?h<jZnaZ,;n*]T0m-Es$l0.<mjlGI^io&bPh;-l?
+g=b*0e^W'rdEp1abfe/NaMu3;_SX+'^:_(h\[T#TZa-j?Y-"b)WMcViUnXQTSt2@>R$X,(PEJmI
+@;'M#IK"]qIH>kRHi89dHi8?_Hi8=MAn5F[A7]@L:jdV9H?aXXFE)>AE,KH+C1h-tE,TZ8E,]i;
+EH?2]O,o<]N0T98E-ckXH@'u6HN8BjHhi'^I/n`pIJnTqIt7NL!.t3&qh"j#!JH+)K`?c)KEm3c
+KnY89Kn]>Ur.Y$$s+C3%s+UK+qM"s&qLed!re(6&s+C?'"+u2XKDC3"L%p?#K*$^YKDL6$L%U*!
+KDgK%K)pORpjiKuJV!]Ms+(B+K7nr3K7s5XrIjs"re(B-L51T`L\Q]*LB<9gM>W8*MZA_7Mu&D4
+NV\V3NVeb2O8P+<OoCLDPPg[AQ2?mHQiEHQRJrZTS1^A(T:qsQUSO`aWN<;.ZaI9R]=X/YEG]H7
+K8=VbG(?i9G%s?6DbGD&:/4Y^M>i80L%'rtM#N2-LAuu-K`6W(K)^E%J-#H@rqHNiq#:'hqY^.*
+q"a^Zp\"1LnaGo6mHj6.nF?)ApA"O`hu=htqYBjWo'Yl.jl,(Nf@/-nbK7cB_nj+%]t:kc\@K5a
+rk8HK^qfrcs2#nug6Ie_N/E@LMN<^RLk^P8K8,;DNK93eO,]$SLk^P8p4`O"?AaZ"NfT9bPE_?!
+R$sM7StD^MUSOcbW2co#Y-5(8ZaI6N\[oGd^;%M$_o9X9aND]Mc-F\`daQ^rf@S^0gYCWAhr*JQ
+j5f=ak32'olKdg'mI'H3nF5u=o(2JFrq6<b!;HHes7uZjr;6HjrVc?eJcC<$_Z,,~>
+JcC<$NW8SKrVc`nqtpEis7uWgs7ZNerq6<`?M!aYnaZ,;n*]T0m-Es$l0.<mjlGI^io&bPh;-l?
+g=b*0e^W'rdEp1abfe/NaMu3;_SX+'^:_(h\[T#TZa-j?Y-"b)WMcViUnXQTSt2@>R$X,(PEJ='
+9288ZpJLNYpeg`_q,.#e##eDu;cH[or)3Gi&2Q!p/hf%:2`!cb5X%7l4?NO'+?MPB2`<NN3]]>a
+4?GYe4?>Pd:JOSV92&/K9i+_e<)``poi(fgs&8nrs&8kqr`/kqpeq2k;ta2h<<,to<!$'!<:j/l
+<`N,t<Vf\p;u]hr;ZKho<WQ0"r_s)";cH^p;cN`rs&92&=&r@'<`\rpr)<_u<E/Zj!E)kq<<#qu
+<;fbq<!$'#<W,ns<W#hm<<,ts<<#no<W5ts<<?,u<;ons;ZB\p<<$"t<;]bt='#<#pf7Mt<)cjt
+r)Nf!r`0#!rDWhu<`]*!s&f(ur`K)$!*]>(s&]8(oih2r!F/k+>5VV%>lS+/?Mn42@09tK@q>RM
+#\7LYB4u$qCi92i**H?>:/4Yb<C]J>6<ZW5/gDf-0h4Yk1c[Qq;c<Tln;7+"reLE+s+UK+re(6&
+s+13#qk3t_!2BIfs.W;^T:ML?Q^*_qNf/aMLPCJ:M2R@UQC=JBWNEJ7]>;M1d+$Xug"bE>hV[5I
+hV?l<f$i!g`4iaeY,\@nSXGb+O,JdHJ:2`fF)Z&7CM@G\AcQB=@fp:TBPRH\s(q[O%:aWc>?Y'.
+<Dumu<Durt;?9Tor`9G,='&L)<E)jo:f-j_s%m$ZMi<[WOHPflQ'[l,S"-(BTqS6WVPgAmX0&P.
+Yd1UC[^WfY]Y(tn_8=+/`lH0CbKS5Vd*^:jeCE1&g"P39h;7&IiSrnYjlY^hl07L!m-O--n*fc8
+nac8BoCW%Ts7QHerV6EgrqcQirVZWmoDX=@JcEUeJ,~>
+JcC<$N;rMKrVc`nqtpEis7uWgs7ZNerq6<`!;$3\?1IFQn*]T0m-Es$l0.<mk2bR_io&bPhVHu@
+g=b*0e^W'rdEp1abfe/NaMu3;_SX+'^:_(h\[T#TZa-g>Y-"b)WMcVhUS=HSSt):=R$X)'PEK9c
+F*W7mS=Q5MS,o+JrgEbQ"IGF?Q'M<4o98s4!KiKAO8G%=OoLUEOnY"XMM-S9KnbCiV59r\TUq^H
+S=5e.PECreMMQtNrK[DIs-E\OrOiEJ^14ftI>IZ[s,[)>rK$i;rfR/Bq31iC!1!MK"dbUER@9WE
+SGf#VSH#/YSdD$^TV%jLTV%mMq4I\[!2'1\$_<l]T:VXHSt2CBT)G5[T)P;ZT)P;ZSH#)PS-5:M
+S!ofBS,SrXScG>XScGD\T)PA]T`1PcSt2FBr13eVs-j(YR@=,CrL3bU#b%9RS"#h7R[a5D!LoVY
+Sc,/\T`(MWT`1Y^UAgqbV#I+iUo"$c"/VllVu<RbVuN^pVu3LlWVWXgX8f:"XoGO,YHY::ZMq3-
+[/RK5[f<i;])K>A]f<a@^VRe*`5]j=b0/&Ve(34.hrEk_l0Ia*Z_s.<G^>IFQ%F=GUn;h#=F?00
+=IZ*i>$Y@9XKA`+YOIDIM#N2.LAuu-K`-N*Jq8K'T`5&lrVlZqr;HTlrqHF7_6C5IU7e9a]!AN>
+Vl-DgVQI&.[C=)h['R-JYcP(2pTOV"=c&#pNK0'^P*;/sR$a>3SXuIIU84W_Vl?\tXfen5Za7'J
+\@K2`]t_=u_SjF5aN2NIbg+P]dF-Oof%8R-g=tH>hVd>Nj5]4^k3(sml0@U$m-X60n*olHncJFT
+o`"Lbp@n=[q#C0iqYU0hr;?Nbrdk*#s24ke~>
+JcC<$N;rMKrVc`nqtpEis7uWgs7ZNerq6<`!;$3\>4M+Nn*]T0m-Es$l0.<mk2bR_io&bPhVHu@
+g=b*0e^W'rdEp1abfe/NaMu3;_SX+'^:_(h\[T#TZa-g>Y-"b)WMcVhUS=HSSt):=R$X)'PEK$S
+ASZ70rdXors*a*YqKr*cqKr0go6^F`11k$(A7T:b;1*b;H?OISG&q_FDf9K.CM7?mEH,r:EH,r;
+EH6,\O,o<]NDGLJE-H_Xr-SHkr-SHird4Wl!.FcmpO3'jrI+Wn!IoY!JH1<$KDU9"KDgK'L&HZ.
+Knb>9L5,\]rIb6+KS9;Xre1<*s+LE)qLem'K_gE$K`$K%JcULUon3'ns+U?'re:B*!/:?(q1\d#
+s+C<(r.Y-'%>0=cJUrE)J:N3&JqJ^TK(sruK_^<%K`$Q#LAll,L]*&/L\Q])LB*2+MZA_5MZA_6
+Mtr>2Mtr;3NVeb3O8Y1;OoLUEPQ$gBQ2?mHQi<BPR1l$YS"-"@T:hmOUSOcdX08b5[C?.Hs198`
+P`($1Ci+KPHZ3_AJUV$L8mlI*8pPeY9i=cDreCE+n;7+"reLH,s+UK+rIY3(JUr@Mq#U?fr;-Bf
+s7d<&p@S"JnF,f5m-O-.nac;Ep\F^ci;Y,&r;-0[oC2,2k2Y@Sf[\BqbfRoD_ns1&]Xtbb\[f>b
+]tV4r_#;+I_BHq`S<B(sMM6hDOH#-RL4t>6L5CnLOH5ZgNf/dPLP1D7pP&X#=c&#pNK0'^P*;/s
+R$a>3SXuIIU84W_Vl?\tXfen5Za7'J\@K2`]t_=u_SjF5aN2NIbg+P]dF-Oof%8R-g=tH>hVd>N
+j5]4^k3(sml0@U$m-X60n*olHncJFTo`"Lbp@n=[q#C0iqYU0hr;?Nbrdk*#s24ke~>
+JcC<$N;rMKrVc`nqtpEis7uWgs7ZNerq6<`!;$3\>4M+Nn*]T0m-Es$l0.<mk2bR_io&bPhVHu@
+g=b*0e^W'rdEp1abfe/NaMu3;_SX+'^:_(h\[T#TZa-g>Y-"b)WMcVhUS=HSSt):=R$X)'PEJC*
+9M\G^pegWZohkE\qGI&ds&8qs!)rbmr_`\M!&"4*)DslI5Wq4k4$G\c3]T5Z2`<QN1cmf]4?P\d
+r]:3E:JOU_9*?\3:/Opa<;'8]<;fhs;ufqt<;]Yp<;ohr;ufkl<<#tn<<#r$<)lpt<;fes<;]br
+<;T\o<<#l#<)lpt;cNTor`/tt!`Mupr)3Spr)El$<E<1%r)E_rrDi_o!*/tss&/nsr)<Vnqc*Jl
+s&AttpJguhs&Aqs!E<(u<;ont<;BMp;c<Nls&B"us&8tuq,[Mqpf7Js;c?]n<rH)"<rGtt<W6%j
+=8Z2!=oV\)=oVS(=nc+s>PhS(=oDP$>Q%h,>l\41?iOO3@K0g=A7]?OAd2m]C2.O$DuO_UD]We#
+=B&*k9hn\Y77B7'5s%(U1-7*B7n5Nq3&sr:;Z0J^M>`80L])u-L&Zi)K*6dWJUjHlU0+1dV50l\
+TV%dER$Nu!NfApQLkg\;LPh%OPF.o8VQ6o-\A#i$c-t4pf\5-:hVR/Hh;$c<f$i$ka2,?oYH+Rr
+Ssu%0O,SmKJUVrjFE)58CMIKoAS#EMA,g'@AnYrWD#%ocDMVS"=B/F&;cH^s;cHao;GgCq='&L(
+<`o?$"B88r:f$g_s%ljTMN!OTO-,ThQ'Rf)R[]k>T:r!TV5C/iWiW>*Yd(O@[C3TU]"G_k^VRe*
+`Q$!?b0/#Scd:(feC<($f\,!5h;-rGi8N_VjQ5Oekiq?slg4!*mdKW6nc&(\oCV\So`Fj]p\jme
+q>^<gqu6NkrU^#>s+13fs*t~>
+JcC<$N;rMKrVc]mr;6NjrqZQgs7cQerq-<aoD\;knaQ#9md9B-lg!a!ki_*jjl>C\iS`VMh;$c=
+g"4j,eC;pod*Bq\bK@rJ`l5m5_SEq#]Xt_b\$iZMZEUO8XfJJ#Vl$8bTqS*MS=>q6Q^*eu@:O%o
+I>48^SXc4@S=H(<Rf8`TR/`NQQ2m3JPk1+7P5gXEOSk1:O9(K,rfR#>*/fT(Iu&r;>AC(5TVA*O
+Ssu4:QB@;kN/NRLPa)*2!1*VNqn3,aTlYX9qN(]>pQ5E9qiLi?qNC]=!L/lJQ3!>>rg<eUS,JlV
+SbnoWSc55\TD>/UTDbDhT:VXHTV%jLTUu.T"J20TSt>qP!1s1\r1<kXs.'(X!M#_XSH#&YSGeoS
+RfT%KrgWtZrgj+\qk!eZ!1s.]r1F%^rLX%[s.91[!1`tVqjIMTrgWkV".PaKS,JcVS"0GJ!hQ$V
+pRqP[rLa.brh94`s.fCc"/DZgV>d4kUnspeVuEXeVu<RnVu<RoWVELfX8T."Xo>I(YHe&3s0MX1
+!4Dg77(9\:]">Se]Y2%o^qdh)`Q#s?b08/Ye(37/i8`q_l0I^'md]tSTS7];KUej$IsR6cOG\B`
+LPf&6S"s4l?!FJ6Xg%f.pPSa&reUQ/rJ(?+s+LB(s+16%U]1AorVl]oqucoss8W)tqZ$Nn+TLK-
+XK\OqUq=(BYH+Y%V59uiY-bRF^V[LfZEpg=YHIW'riT4WMi<XVOHG]jQ'Rf*S"-%@TV8-VV5L8l
+WiW>+Yd(OA[^WcW]=bkm^r""-`Q-'AbKJ/UcdC.heCE1&g"P08h;7&IiSrnXjlY^gkiqBum-O--
+rpL'\nac8BoCW%Ts7ZKerqQNhrqcQirVZWmoDX=@JcEXfJ,~>
+JcC<$N;rMKrVc]mr;6NjrqZQgs7cQerq-<aoD\;cnaQ#9md9B-lg!a!ki_*jjl>C\iS`VMh;$c=
+g"4j,eC;pod*Bq\bK@rJ`l5m5_SEq#]Xt_b\$iZMZEUO8XfJJ#Vl$8bTqS*MS=>q6Q^*eu<EWdE
+DK^M[JGt&uIf=c[I/J?eHMMpdI._jcHlZg0?smS[B22KUH[0j\G'7nHEH#c4ChdZsB5qm0qf*$b
+F,l9ANfK*,HtRA@rd=fpHi&3iHiJEjHiABmIJnQmI/n`mIK"]oIK+`sIt7KK!.t3&r.=m"re1<*
+rIb0)r.b3)re0irq1Ja#re1-%qLej$rdk-&rIXfsqh,!(K`6]'K_U6$K_U9!KE-Z(K_L0#K`-N&
+JcC<&K7s/T!/1?(s+LB*!/19(!euD_reCH,s+^Q/qM#!*reUQ/pP8j*M#N;4MY`52N;\\6Mu\e0
+N;eb3N;nn8Nr"h8OSt:BOHKO*!0d>FqN^rDs-NYN'UbDZS"-%@T:hpRUo(,lY->4?\%)FK,J1P!
+^;,qfGA_5=K8=bgBl]#OC19SBCIUsBHVI44:Pjj\LAlo$MYN&-M#N2.LAuu-K`6W(Jc^N"q>U3j
+qu6Hkq>^4(p\+:PoC;;<md9B.mdTf=p%J4XrSRW%r;-3]oC2/4k2kRYg=Od"c-")F_ns4']Xtbc
+\@B,^]tV7s^qmk]_A'iNZBLH6Mi!7SOc53ULkUP9Ko1ffNsUu6OH,6ULk^P8pP&U"</HNlNK90`
+P*D5tR$jG6SXuLJUSO`aW2cl!Xfnt6Za@0M\@K5a^;%J#_o0O7aN;WKc-FY_dF6Uqf@S^0g>(N@
+hr*JQj5]7`k3(smlKdg'mI'uB#4V0Ro(2JFrq6<bs7cNfs7uZjr;6HjrVc?eJcC<$_uG5~>
+JcC<$N;rMKrVc]mr;6NjrqZQgs7cQerq-<aoD\;`naQ#9md9B-lg!a!ki_*jjl>C\iS`VMh;$c=
+g"4j,eC;pod*Bq\bK@rJ`l5m5_SEq#]Xt_b\$iZMZEUO8XfJJ#Vl$8bTqS*MS=>q6Q^*eu77U!F
+:Jga^oMG-VpJUfaqGI;lr`&nrr)+8,1bgX90etLA1I45h5!1qh4?>J`3rV)<2?Ylu3]fD%4:XD7
+4$6;6:.n;S/jN-.;ts>l;u]hn;t<o]<<?,u<;ons;ZKer;ts;l<V]Vl<W#hr<W?%r<<-"q<W#er
+;uK\s<)rcqs&B/#;cH]n;ZB\j<<H<&<E/rt!E2ts<Vo_q;ts;l;uT_r;uBVl;ZKeo<Vobj<<6&t
+qc*So!E<(s;uftt<<H9$;cN]os&B"us&9&"<`f0!r`/_o!`W)tr`0#!rDj#%<`W6"<!$'#<q9>l
+=Sl8#>5h\(=9)M">5DIs>5VV&>QJ,:rEfP4qdBtD@q9+]AS,RgBkhF"D/T>ks(rlpDK/i\:JOY\
+;cQ@X6om\#1GgI84"N'U7Q!"^3E&jSrDE<Hpkf!+reLH,s+UK+re(6&=Fm6BUnjiaV50l[TUq[A
+Q^*_qNJiXMLPCJ:M2RCWQ^aYDWNEJ8]YVS1d+$Y!g"bE>hV[2Hh:pZ8eBuO__nEOaXJhndS<oJ$
+N/31>J:)TbEc5f1C1mNW!+c";s'u@HB5)-uD/=%^D'<_H@9Qi;=B/=%<EE1";c6Lj;,pXu=&rC'
+=&r@$;Gp:gpJLod</HNlNK90`P*D5tR$jG6SXuLJUSO`aW2cl!Xfnt6Za@0M\@K5a^;%J#_o0O7
+aN;WKc-FY_dF6Uqf@S^0g>(N@hr*JQj5]7`k3(smlKdg'mI'uB#4V0Ro(2JFrq6<bs7cNfs7uZj
+r;6HjrVc?eJcC<$_uG5~>
+JcC<$N;rMKr;HWmr;6Kis7uWg!r)E^rq-KfoCMPDnaQPH=mk\Dm-Es$ki_*jjlGI]iS`VMh;$c=
+g"=p-eC;pod*L"]bK@rJ`l5m5_SEq#]Xt_b\$iZMZEUO7XfJJ#Vl$8bTqJ!KS=>q6QBd\t?YFM*
+J;]tiSXlAOSc>5[RfJoVRK&ZSQNEJ<Q2Hm>PP:4@Oc]L%qiCi@OSt=>OrTI>KS,/:LgOMeVP9cZ
+St;ICS<T2!OH>H[M3X;&PlR-LQi"H!]UGFBL$as%O8G%<Oo(==P6-u6Q2R!KQi<BPRK&cUSGf#V
+S,f,ZScGDXT_k>cTV%mMTqJ(XTDtPbT:l%QrLX%[s.04]qk!_Vr1*eXr1*eU!1WtVqj[MRrLX%[
+r1<bWqk3n[rLX"Zs.04\q4%DQ".YpOS,/ZTS,\rWS,]#XSH>CTTD>/ZU&UkdT`_$aU7qR\#,@oe
+USFQXr1j4d#G\#gUSO`_VZ!FhW;ELjW;idmVuWglWqWRnXT#@%Xotr4Z*L\5Zi.6;[C3NQ\[f;_
+]=e-V4he_J_Sa@5aN;WMcdC4mg"kQEj6#RilK[^&nFQCmWLeQ`H*X0@ML0WKer>rTH;oo'R@gB[
+>?b:6Y-"r-YPX7SMY`2/M#W8.LAur-K`-N(Jq9g!#lXYtq>1!drVlKiqu6Wq+1\SYWMZDkYILd?
+X/MnmV5g]*[CNof^9k2Q[BQa:Y5#4"Y$[$CMi<[WOHPflQ'[l,S"-(BTqS6WVPgAmX0&P/Yd1UC
+[^WfY]Y(tn_8=+/`lH0CbKS8Wd*^:keCN7(g"P39h;7&IiSrnYjlY^hl07L!m-O--n*fc8nac8B
+oCW%Ts7QHerV6EgrqcQirVZWmoDX=@JcE[gJ,~>
+JcC<$N;rMKr;HWmr;6Kis7uWg!r)E^rq-KfoCMPDnaQPH<poAAm-Es$ki_*jjlGI]iS`VMh;$c=
+g"=p-eC;pod*L"]bK@rJ`l5m5_SEq#]Xt_b\$iZMZEUO7XfJJ#Vl$8bTqJ!KS=>q6QBd\t=']BQ
+Dg6hardautrdOlql$WJWpNlX^rd=Eds*Po&B4>:^AS+b9I=6?dH$4:PF*)A=D/=$'BP;C(E,fjr
+EW:%eF,l9AO,f3YG("7Lr-eEhrd4Zkrd4Tk!.Ffn"FY`KIX_0Bs*jin!IfOtJH(3#JcLH$K)L?#
+K`?c)KE['aKnY89rIt9)q1Sg'r.Y*&re1K.K7ei1r.P3*Kn]MZrIt0%rdt$"!JH+$K`-W$K^XWo
+KE-`)K_C*$KS+pUJcLGqK`6]*K`-W%LAuu,LA-K&M#W81M#<&.M#N8/MY`53N/R[orf-W1s,6Z2
+!0-l9r/^c;s,m;B!0R8DrKR2Epm1rHr0S4eR[]e:SY)RLUSXidWiWD/ZaI9P\G`l]\@fVoR?!#A
+D/G;eLNI?IK<0*6BNml@7X06/9heM\M2$_=re:6-qMP-+reUT0r.b6*!/1<'!J5n%qu-@-q=saZ
+p@\(LnaQ#8md9E0nF?,BpA"L^hu>)'r;$'Yna>`,jl,(Nf[S<obK.Z?_8*dt]=PP`\@K2`]tV:u
+_8=(f_u%=M_'.1QQB@;jMMR4OO,T!QL4k>:Ll7:SO-,]hNf/dOLP1D8pkA^#?\sYuN/is\P*;,q
+Q^F52S=Z@HTqeE\Vl6VrXfen4ZEpsI\%0)_]Y;.s_Sa@4a2lEHbg+M\dF-Oof%8R-g=tE=hV[8M
+ioB+]k2tmll0@U$m-X60n*oi:o()DDo`"O`p&Ojcq#C0hqY^6hr;HTcrdk*#s2=qf~>
+JcC<$N;rMKr;HWmr;6Kis7uWg!r)E^rq-KfoCMPDnaQPH=mk\Dm-Es$ki_*jjlGI]iS`VMh;$c=
+g"=p-eC;pod*L"]bK@rJ`l5m5_SEq#]Xt_b\$iZMZEUO7XfJJ#Vl$8bTqJ!KS=>q6QBd\t7S-3G
+:/Xqe;,L6e;>3od;?'Pf;#sQlpeprcqGI;lrDWbqrDF@d1,1C:0f(^E6:!k"4$5Sd3]]8_3;tl:
+2&&,44$5Se4$#Gb4AJ[I9MA)Q5=eTD<;ohr<;TVg;ufqs<;9Gr<`N.!<;okt<;TV_<;]bn<!63#
+<)lum<W?%r<W?,"<Vfbr<W#eq;?Kco;cNQms&T/"!)rkrs&/qt<W5qt<W5r";cHasnPoEbs&Akq
+!E<"r<;KSr<)Zco;u]hs;u9Mp<`f9#r`9%us&&hqr`&eqr`0#!rD`eqs&T%ts&8tur)E\rrDir#
+<rQ+u<qKJm=SQ%u>5MIu>5DIr>5_\)>lS+0?N4C3@/FC4@PhS*AS#IdBk_<sCi+',Chma!BPVL)
+=Beg%9hAPh<(BAF5u^',/h/51/Or5u2)[HS<)cco;>Z:JMY`2/M#W8.LAur-K`-O,Jq9esVkp2a
+U7\!FQ^3htO,]$RLk^V<M2R@TQ'n5=Vl[,1\\?#(cI:=qg"Y<<h;7&Gh;$`:e^Dde`k]0lY,\=l
+SXGb*NJWCBJ:)WcF)c&5C1q3jA7T3L@fBj?AS5^lD#J5KDYn;MC^>!%>?P'/=&i6!<W?#+;c-Fj
+<EN=)<``=&r`')";G^4epeh#e?\sYuN/is\P*;,qQ^F52S=Z@HTqeE\Vl6VrXfen4ZEpsI\%0)_
+]Y;.s_Sa@4a2lEHbg+M\dF-Oof%8R-g=tE=hV[8MioB+]k2tmll0@U$m-X60n*oi:o()DDo`"O`
+p&Ojcq#C0hqY^6hr;HTcrdk*#s2=qf~>
+JcC<$MuWDJrVc`nqtpEis7uWgs7ZNerq0XjoCMPDnaQ&:n*]T0m-Es$l0%3kjlGI]iS`VMh;$c=
+g"=p-eC;pod*L"^bK@rJ`l5m5_SEq#]Xt_b\$iZMZEUO7XfJJ#Vkp2aTqJ!JS=>q6QBd\C@qp+6
+LRk"5T)YA]SH#)YRf8`TR/`KSQBda6PkUC7P5gXGOH5IsOSt=?OrKC8Jqo)8LL-jSU7n3PSXuFA
+Q^3hsOH5<XM3Rq'"dYLBQ^>Ga]`j^WH@h6>qiLi?r/go?p5o<:s,mGIP*5[*!L/lJQN!6MQiWYF
+rLEnY!1a"Y#+V6TSt;RHq4RVWrLj+_s.KCc"/)?\T_b;TScYOUT),#WSGo)XS-#1KRe`ESS=?#I
+S,f,ZT)YAXT)>5UT`(M_T)P8aT:VRCS"'DIrL3q\S=?%=rgj"XrgWnWrga%\rh'(\!29CdrhKFd
+!29@c!2KOf!i)KaqkO1es.]XiUSRmc!2f^mq5F4hri#gqqPXIpWi>lqpT+:priQ4'riZI/Z*L^B
+r3ZI2#I_+N\@K2_]DfK/^;.V'_o9X:aihoSdaZk$gtpuKjQ5Lck3)!pmd]uHs0/8ZIXQa<VNlXW
+Q_Cj9Qt1#6PZXQKGZn6U>-4s1Yl1d#Mu8J0M>i>2L])u-L&Zi*K)gM'rsA]'qtp3bqYU3ho`+ad
+s8NMVZ*(+'U8>06ZEL=-rhg:+Xg>IG\AQ.l['@$EXg"u'YPkV,M2I7NNfT<cPEhH#R$sM8StD^N
+UnsrdWN*&%Y->1;['d?P\[oGe^VI\&`5Ta;ai_fNcHjkbdaZguf@\d1gYL]Bi8ESSj5f=akNM0p
+lKdg'mI'H3nF?MK!qZ'Vrq-?dp\4X]s7u]kqtpBjr;H6dJcC<$`W(G~>
+JcC<$MuWDJrVc`nqtpEis7uWgs7ZNerq0RhoCMPDnaQ&:n*]T0m-Es$l0%3kjlGI]iS`VMh;$c=
+g"=p-eC;pod*L"^bK@rJ`l5m5_SEq#]Xt_b\$iZMZEUO7XfJJ#Vkp2aTqJ!JS=>q6QBd\7>%2/`
+Fo6giJGjutIfFi\I._g]Hi8?eHiJI9B4PC[AS,OOI!g6dG'A+PFE2D@DJX-)BkV1!E,fi:EW0tf
+F)m;%O,f6[F)Yo7I=1s@s*OlrI!k^9rd=]ns*Xip$\!STIXZcqIXQWnIf+ToIf=irJH(6$KDgB%
+KDU?$L&HZ+Knb?WK`[!_LAlo,L&cr,L'*-aKn]JYre:<(rIt6(s+UH*s+LW0K7\c/KDpK$KDpQ(
+L&?T,KnP,5L&-JdK`Hf#L&Zl-K_pE%KE-c+L&-K"L%pE#L\uu+L]</1M>`8.LB<9gM>E,+Mu8P6
+NW4t;Mu/J4NV\V3NW"n8O8P+<OoLLCOoCLDPQ$gHQ26dHQ2HpJQi!-MRJrZdSY)RLUSOcbWN32+
+ZEpsHrNmr[[^Wi^_T:#eML08[EJ93rDeaEFNG*B0=%@1$H?ipn9i4ZAL4tB\L%pT(MYi80M#W8/
+LAuu-K`6T)K)>QDs7mH*p\4@Ro^_M?n*]T1n*ff;o_/%Tqu5OR-iX#=p@RnCm-*Tli7uu9da-.[
+`l,d1^:h+h\[f5[\\#Ph^qde&_Yh=O_?.Wl_Yq=N_@siVVj!:*Mhm4OQAg`XLPCV>Ll;4ms-*bL
+Nf8gOKnY3TL&H[-M2I7NNfT<cPEhH#R$sM8StD^NUnsrdWN*&%Y->1;['d?P\[oGe^VI\&`5Ta;
+ai_fNcHjkbdaZguf@\d1gYL]Bi8ESSj5f=akNM0plKdg'mI'H3nF?MK!qZ'Vrq-?dp\4X]s7u]k
+qtpBjr;H6dJcC<$`W(G~>
+JcC<$MuWDJrVc`nqtpEis7uWgs7ZNerq0XjoCMPDnaQ&:n*]T0m-Es$l0%3kjlGI]iS`VMh;$c=
+g"=p-eC;pod*L"^bK@rJ`l5m5_SEq#]Xt_b\$iZMZEUO7XfJJ#Vkp2aTqJ!JS=>q6QBd\(7S?HO
+:f1*e;Ya2g:]OAl;#X>k;YO&g;#aDg;Z'De;?0Yo<<#ns;AV,D0/>7:1,VB_5Wq1j4?Yed3BB/Z
+3&ggo#<Fk-3]oJd48qAB:'jTe92%95:f:7kq,I8jr`&hppJh/ms&Abns&T/"!*9"ts&8qss&8nr
+rDiSkr)NVnr)N_ss&K)"!EE2!<<-"r<V9Am<;]Ys;Gg=jr`&_or`0"ur_rhrs&8bns&0&#<`W4#
+nl5Qd!*&hq"B8;u<)i]os&Ahnr`&kqr`&ntqGm`!<)Z[or`/ksr)Nbq"B8;u<EAuss&B"urDWbs
+rDj&&<`W4#rDrhtq,dW#pK@K!r`T)$r`T8)qcil"q-3f&!F9%1?iOO2@K0dG@q&tZAS5[iBkhF"
+BkRBU,\C_)D/sl)>#S6k9iY.`7R]F*8N\s_0IT":845Qs2EEis<)WWkpl#'-qhb<.s+gQ-s+UK+
+re"7'Vkp2aTq7dBQ^*\pNJiXMLPCP?MiEd^R@U(KX0/e>]Y_\5dF?b"gYCW@hV[5IgtUQ6e'Q=[
+_Rm4[XJ_hbR['%rMMHh7IX66\Ec,].BP(jfA7PUJraQ(AAnYmorGDFLs(qgTD/K/d+`E?L=BJU)
+<Dut"<`E'u;H$Oq='&L)=&r@'<`W0u;,L6d;>j<oM2I7NNfT<cPEhH#R$sM8StD^NUnsrdWN*&%
+Y->1;['d?P\[oGe^VI\&`5Ta;ai_fNcHjkbdaZguf@\d1gYL]Bi8ESSj5f=akNM0plKdg'mI'H3
+nF?MK!qZ'Vrq-?dp\4X]s7u]kqtpBjr;H6dJcC<$`W(G~>
+JcC<$MuWDJrVc]mr;6NjrqZQgs7ZNerq6<`!;$3\=7PeKn*]T0m-Es$l0.<mjlGI^iS`YNh;-i>
+g"=p-e^W'qd*L"^bK@rJa2Q!6_SEq#]Xt_b\$iZMZEUO7XK/A"Vkp2aTqJ!JS!ob4QBdY@Ap&?L
+N;0"DSc>2[S,SlVRJrQVQ^3r&Q2QsCPOjq;On4\5OWosJMM-S;L59/DVP^&[U7RpHS=>h.P)kW\
+M2.@^QBd`$Q2R$M]tXKZ"MS6fG(BOPr/go?r/go?pQ5E;s-!DG!0[;ErKI;IrKdJMrKm\TS"-#I
+Sc>5WSc>8]TDkJfT:hjNU7n7XT)t[ZT_Y;]TF.BcTV%jLT:_dKTD>)YTDbAZSH,2WSc5/ZRerTR
+SGerWSH#2\T)bJ^Sbo#XTD"rVTDkG^TDtJ^SGo)WS,f,ZSGf#YT)Y>\SH>=PSberXTELs]TV8+W
+U\CJbUS=KXrhBFfr1s:dr1sIlVl9TmqPaCkrM]aqq5F.hqPsIos/c1$s/lL.YctC<rNlL1rj;a7
+rjNlW]"5Md^:q@u_o0L4`lQ9Fc-Ohfe^rO2hVdAPro=%?"m>1<nb)bXru\D:KmnH6X/D#,G`fA&
+N.au[N)NiJUKCZ$>?\/4Xg%c-rf$Z2rJLK/s+pZ0rItB-KS9>W!.qBR$NC#$qt^$^qYU6jp&G'k
+!<;oprr4)9[&pL.VPq,F[]m!9W2Q_nXg,=B\A6%q[^*<KYcP)(YPkV(Ll%"JNK9-_P*D5tR$jG5
+SXuLJU84W`W2cl!Xfnt6Za@0M\@K5a^;%J#_o0O7aN;WKc-FY_dF6Uqf@S^0g>(N@hr*JQj5]7`
+k3(sml0I^&mI'uB!V#XYncA@Srq6<bs7cNfrqZTjr;6HjrVc?eJcC<$`W(G~>
+JcC<$MuWDJrVc]mr;6NjrqZQgs7ZNerq6<`!;$3\=n2"Mn*]T0m-Es$l0.<mjlGI^iS`YNh;-i>
+g"=p-e^W'qd*L"^bK@rJa2Q!6_SEq#]Xt_b\$iZMZEUO7XK/A"Vkp2aTqJ!JS!ob4QBdY8?"Rkk
+H@gbHJc(&uIfOrsIHu7\Hh;X[HiAEgHQ.?HAmo(YAnOq;I=-9aH$4=PF)u>?DJX*&B4q*]rc/Eg
+EfQ0@NfK)nQYCGcrd=Nird=Zk!do?Ard=Zm!doEEr-nZqrI4Tks*sut!J,k%KDpK&K)pXXrIk3)
+r.G')q1\g&!JcF/L&?]*K`[!_L&?W'L&Qc(L&Qc*L&HZ.KnP)2KnTGX!/1<'!/1-$rIb0)r.G*)
+K].UdL4t?\L&m!]rIY9,KnbA;L&?W%L%U0#L\QZ+LPGb_s+gZ3reUK-qhY<1pko03MuJ\6NW+k5
+N;nn5N;AP5NrG+;OSk7@OT1FFP*;)or0@;Jr0@5Hs-N\Os-Z0BS=H.BTq\<XVPgDnX0&S0Yd(I;
+YHY:;[(!T[_T:$RgQIA8E,U2_Lj!TKEeesWBL63E84n/S:/"AY9o4UYLAci*N;8D1MYi81M#N2.
+L'!'^K`6TAK)5<<p\4CSo^hVBnF,c3mdTc;o_/(UqYf=O)#X7)o^_J<l0%*bh:gK0d*9bT`P]O,
+]t=9Ss0r?F]"G_k^qmn)qniHO_u@OP_>D(lh8PVAOH#-UPa7AiMhd"ALkpqKO-#HeQ&q&bMM[+A
+LA6K$KN3hbMN!OUO-,TiQ'Rf*S"#t?TV8*UV5L8lWiW>+Yd(OA[^WcW]=bkm^r""-`Q-'AbKJ/U
+cdC.heCE1&g"P08h;7&IiSrnXjlY^gkiq?tm-O--rpKmWnc&([oCW%Ts7ZKerqQKgs8)ZjrVZWm
+oDX=@JcE^hJ,~>
+JcC<$MuWDJrVc]mr;6NjrqZQgs7ZNerq6<`!;$3\<q5\Jn*]T0m-Es$l0.<mjlGI^iS`YNh;-i>
+g"=p-e^W'qd*L"^bK@rJa2Q!6_SEq#]Xt_b\$iZMZEUO7XK/A"Vkp2aTqJ!JS!ob4QBdY&7nQKO
+oMYQ`s%rMgrDNSk!)WYlr_WSkq,75ip/:ohrDX2(1bpd<1,:XD1-n/hr]C3C4oRJB48q2=2?G`t
+48q>Q4$#Gb4?QD7:.n;S-q6s0rDWMkr)<Sos&8Sis&B%upf7>ps&K&!r`&tu;u'Dk<VTPj<W5ts
+<<cK(<E<.#<W6&!<W?+q<V0>l<W,kr;Z9Vp<;T\o<r>qq;u9Po<W#nt<Vobp;uK\p;u]es<r>tr
+<;KVo<<#ns<;ohn<<#tn<WlE%<)Zcl<r>r%<)Z^p;cHfq<<-(q<W?,!<<H9'='#6!rDru$rE9&#
+n6,Wl"Bei0=^(],!ErY&>5DJ&>QS2;?N+=2@/"+0@fL!=AhRe/An>L_@UikWAS5^oEd)n^>ZOQp
+:/b(k7Rfd,6UEUe-8@S80LnMh1c@BT<)`Zkrf$Z2rJLK/s+pZ0rItB-KS9>W<.^j:SXPn2PECla
+MM[.DLP^qLOHZ*'U8=ilZF@H^`QQWXe^rO1h;-rFhqm2Dg=Xs'cH=)>\?`36URmp>PE1WWKRnT!
+G]n+HD/<s#An5F^@Uf7F#%_F]CM[j)q/-4MDZ4MOC^k5tChmd1CKakC<`N+#r`'V2;c-Ln;H?q$
+=B8L)<``:$;cHTf;>j<kLl%"JNK9-_P*D5tR$jG5SXuLJU84W`W2cl!Xfnt6Za@0M\@K5a^;%J#
+_o0O7aN;WKc-FY_dF6Uqf@S^0g>(N@hr*JQj5]7`k3(sml0I^&mI'uB!V#XYncA@Srq6<bs7cNf
+rqZTjr;6HjrVc?eJcC<$`W(G~>
+JcC<$MZ<>Jr;HWmr;6Kis7uWg!r)E^rq-<aoD\;]naQ#9md9B-lg!a!ki_*jjQ#:[i8EMKh:pZ;
+f[n^)eC2gmcd'eYbK7iG`Pf[2^q[Ur]=GJ][^<BHYck11X/`+rV50iZTUq^DR[BJ.Q!n3=G(#2@
+T)P;\SGo#WRfAfTQii\@QBhB4r0-Z6rfQl8rK/ajK7Sl7Ll#N;Vk]u\TUqdIS!TA(OckfaMi*gd
+Q'IZ#QC+&+R_HML]=ii`F*rf@O8b7?Oo(7?Oo1:@OoCIBOoCOBPQ-dGPPpaGQ2R$KQiEEXR@9V8
+S=Q7BrLEhWs.94^!20=`"e_Q`TqJ(WT)t[ZT_Y;]TECm\T:c"Rs.B.Zs.B4\s.01]q4.PVS,SlU
+S,AfVSc5,ZSc#)YSc#)YTD"rUTDkG\T)bJ[SH,8[SH,2ZSc>;]T)bJYSc,,]T:hnWUACYZUA(G\
+U]@1hV#@+nVPgAkVl0Bis/5jps/Gmop8S(l!3?$tri?(#r2ot%s0)O/ZMq31[/@?3[OJ\q\[oDb
+]Y2%p_Sa@3`lQ9Fc-Oece^`=+gYL`Ci8NYTjQ>[lmd^&LrVn"JVO)j`KVGlALjYPeduU>OF&\&t
+=IQ$g>@1W<X08Y0rNH'Vr/:N2qhb?/s+gQ-s+LH+re%HT$3'l"qtg-aqu-Nas82flruSkXYcF_"
+X1?'MYcaq%WMuu)[C!HZ_nELbZ*pp>Z1tO#Y$[!AMi<XVOHPckQ'[l+S"-(BTV8-VVPgAmX0&P.
+Yd1UC[^WfY]Y(tn_8=+/`lH0CbKS8Wd*^:jeCN7(g"P39h;7&IiSrnYjlY^hl07L!m-O--n*fc8
+nac8BoCW%Ts7QHerV6EgrqcQirVZWmoDX=@JcEaiJ,~>
+JcC<$MZ<>Jr;HWmr;6Kis7uWg!r)E^rq-<aoD\;]naQ#9md9B-lg!a!ki_*jjQ#:[i8EMKh:pZ;
+f[n^)eC2gmcd'eYbK7iG`Pf[2^q[Ur]=GJ][^<BHYck11X/`+rV50iZTUq^DR[BJ.Pu_*uBlA.m
+K):,sJGt#sII;L]HhD^\Hi8?hHPLp@@UNeZAnFngI<p3aG'.tMEcQ):rbMXMBP@Bb")r7#ErC%c
+NfT6\NF@$DE-M2,qgJEjrd4Zm!.4]mqL/9j!e5ZIrI4Wl#C_/PJ:N3%K(joqK`?c*K_gE"L'*3c
+Kn]DYs+LK.L&6Q%K`Hf)L&H])L&$B(KnP)2re1<(re19)reCH,pk8X#!/BZjs+LE+q1em%s+UH,
+!f)Mbre1?,r.Y*(reLN.rJ1-'re:E.reUT2q2"p)pl#*0rJgi9repf8rf-f6pPo04rf?r<qN:c?
+s-!GIr0@;Js-<VKs-<SL!13VN&"8uWSXl@GUSFW]Vl6SoX8K'uXY$]ZZ*_!O^;S4Bf\PPPNe)4g
+EeKI%EGK]LSTK0a=%-mp96tqZ:/k%bMM?h>rIt*,r/:N2qhb?/s+gQ-s+LH+rdtOPp\+:PoCDG@
+n,D_\n+#u@p@nF\rnm_nr;-0[o'bu2kN(UYgXt$(cHF>L`59:']Xn$O#J.O\^VRb'_Y(eI_SQ&b
+,/`'gR?<YmMMdCWP`(KWL5(VBM2RIVOHPlkNfAsRLkUS:q1\a"?\jPsN/`m[P*2&pQ^F21S=Z@G
+TqeE\Vl6VrXfek3ZEpsI\%0)_]Y;.s_Sa@4a2lEHbg+M\dF-Lnf%8R-g=tE=hV[8MioB+]k2tml
+l0@U$m-X60n*oi:o()DDo`"O`p&Ojcq#C0hqY^6hr;HTcrdk*#s2P(h~>
+JcC<$MZ<>Jr;HWmr;6Kis7uWg!r)E^rq-<aoD\;]naQ#9md9B-lg!a!ki_*jjQ#:[i8EMKh:pZ;
+f[n^)eC2gmcd'eYbK7iG`Pf[2^q[Ur]=GJ][^<BHYck11X/`+rV50iZTUq^DR[BJ.Pt"599M\LU
+;Y!]a;Z9Pf;#aDY;?0Yo<"Li?/i#1<1,VEb5<_+j4?Yh+3Xn)/3&`cR2**c\4$#A`rB(H`:/"AT
+/j2p+;H-Wo;u9Pk;uT_r;uT_r<V]Vm<W?%l<W?,!<W#er<W#hp<VTPg<<?-"<rQ)#<`N0!<rZ2!
+<r,hg<rZ1o;Z]ou<r>tr<rZ2!<<#ks<;ohq;up$"q,RJqrD`bpr)E\ps&B"us&ASinl5Ner)Wbr
+pJqJu<`N.#;cEZp"'&B&=8>nq<<-)!<<-)!<rc;"<<-(u=8l>%=oDIo=nc,!=92Q.r*0/(!*fA)
+rEK;*s',J-!+#P0!FK74@/sd8@/s^7@K0g=@UipI@K'Xa@:Nk\Bl8!;I=[,V>?+Hn:JY(a7n#L*
+90Y?c.jmD10M"Ym2EEfX<)ZWk;>Q7LMuAP1M>rD3L])u-K`Hf*K-d%UQ^!VoNJi[NLPL_FNfTBk
+S>)jZY-PLJ^Vn7?e(!"&gYL]Brnf*ZgtLH4e'H7X_7R(XWMQ8WQBRAgLP:>0I!KmVEGfT-BP(je
+A7K*JA,g'BAS,UjD"MWED>nAOD%CGuCMIX#GC3Us>#n['='#<#s&0"s;cQis<rl?'rDj)%<)QRk
+;Ya2f:g]$8Mi<XVOHPckQ'[l+S"-(BTV8-VVPgAmX0&P.Yd1UC[^WfY]Y(tn_8=+/`lH0CbKS8W
+d*^:jeCN7(g"P39h;7&IiSrnYjlY^hl07L!m-O--n*fc8nac8BoCW%Ts7QHerV6EgrqcQirVZWm
+oDX=@JcEaiJ,~>
+JcC<$MZ<;IrVc`nqtpEis7uWg!r)E^rq-KfoCMPDnaQPH;=<i<m-Ep#ki_*jjl>C\i8EMKh;$`<
+f[n^)eC2gmcd'eYbK7iG`Pf[2^q[Ur]=GJ][^<BHYck11WiE"qV50iZT:VUCR[BG,Q!e3JG_(kI
+T)>,URfAfTQii\@QBhB4rKH`6s,lr8)j-/:Jq/W2L0g^RUnFBST:VUBR[')!OcG<WMuK(BQ3<SC
+R$a?A^';9_]pYFAL&R24O8k=?Ont.>Oo:CAOoCIBOoCOBPQ-dGPPpaGQ2HsJQO&tHR[]h<St;MO
+SGf#YT)5,[T`1\aT`:VaT`(SaU'.0aUS=L\U&CYaT`CbbTDY;\TDG,aSXuFDSt2IDrgj4_S!ofE
+S,AfUT)YAVSck[WSXuGPT)t[XTDYA]U&LYaT`1P^TDkJdT:VXFSc55XSb\lSSc52^T:qtWUACY^
+U&gs^oV;;Zqka=j!N;plW;`^pVuWgmW;!:kWrK.!WrB'uXSo:$YPk[-Z*L^Bqm?C2s0a>b\[oAa
+]Y2%p_SjC4a2uHHc-F\ae(*(%f\,$7h;7&Jj6#OimIKuJqYq\ETT+MPMm'USIsI9Td>3g0;HAu]
+=du<n=^GB9X0/S/rNGsSrJUZ4r/(E/s+gT.s+UK+s+@]Y!<2uq"oA&jqu$H`s82firu^%%Y,S7p
+VmORMYHt:-WN<,(['mNZ_7mCeZF%!BXK_N(r2s4YM2I4MNfT9bPEhE"R$sM7StD^NUnjlcWN*&%
+Y->1;ZaI6O\[oGe^VI\&`5Ta;ai_fOcHjkbdaZguf@\g2gYL]Ci8EVTj5f=akNM0plKdg'mI'H3
+nF?MK!V>s_p&Facp\jmeq>^<gqu6NlrU^#>s+13is*t~>
+JcC<$MZ<;IrVc`nqtpEis7uWg!r)E^rq-KfoCMPDnaQPH;=<i<m-Ep#ki_*jjl>C\i8EMKh;$`<
+f[n^)eC2gmcd'eYbK7iG`Pf[2^q[Ur]=GJ][^<BHYck11WiE"qV50iZT:VUCR[BG,Pu_1(CN4[t
+K):,uJH(,rIIDR]HhD^\HiAEjHNRtn@:0"F(f,R.H['aZG'.nIF)Z#6Chd^!BlS-5EH1u!s)JHf
+NfT6]NK/11DKYr,r-\Ejr-SKkqgA6gqL/KoI!tsBrI+Zos*k0%JUrE)pk/Hss+UH*r.Y0*!/LQ.
+s+gN,s+^W0L\ul,L&Qc!L&Zi*L&?W&L&Qc)L&H]'K`Hl,L%p?"L&Qi(K`d'`KS98Wre:H-LAlo+
+K`$N(LAcf,KSB>Y!/L?(s+UE+pP8O""c%ecL5(K^M>2o)M#`G/MuSb5N<"q9MuS_9NVSP/NW+t;
+O8+h8OT:RBP5pjDQ2QsIQ2d0MQiEHQR0]7NS=H1CTVA7]V#dKmri,ms1o[LUX0&P/ZF%0V`6-EW
+h;[V_m$*EQE,U#\OaCqZFb-N1DdPh$DF[BEISEL7:ece#L5,Y\pPf'/regW1reUT0reCH,s+LE)
+&bYeenaZ)9mdKW6o(2SLq>C3KruD%8q"=7ImHWlriSWGDe^Ddfb/hT?_8![q\[f<N\Hfa[^;.S%
+_o)Air589G%`?6(`l[bNP`q/dMMdI_reqMIL5C_DN0'-`P*D,jNf8jPLP1EXL&?U-LP^nHN/is\
+P*;/rQ^F52S=Z@HU84T^Vl?\tXfen5Za7'J\@K2`]t_A!_SjF5aN;TJc-FY^dF-Opf%8R.g=tH>
+hr*GPj5]4^k3(sml0@U$m-X60n*olHncA@Srq6<bs7cKes7u]kqtpBjrVc?eJcC<$`rCP~>
+JcC<$MZ<;IrVc`nqtpEis7uWg!r)E^rq-KfoCMPDnaQPH;=<i<m-Ep#ki_*jjl>C\i8EMKh;$`<
+f[n^)eC2gmcd'eYbK7iG`Pf[2^q[Ur]=GJ][^<BHYck11WiE"qV50iZT:VUCR[BG,Pt";;9hnRT
+;Y!Zb;Z9Pd;#aDZ;ZBZ)<&?<`/i#4<2*jMm5!Aj,!]`;'r]1!:s"ss?3^#Pc3rM/@48qtZ92&#B
+7o<4a<;]\m<;KPk<<#to<;feu<)Zci<W?,!<W5ts<W#hp<VfYr<E<0!<<Q?&<E)rs<W?)"<Vf_t
+='/N$<W,r!<)r`p!EE+t;ZKeq;[69%<EE4#<E8uu!*/hor_i_ps&B,$=',<#s&B%urDN\qr_ikt
+<E&corDiku!``3!qc3So!`MuqqGdGor`&ntr`8ttoi;&mqc!\u<`W=)rDro!r)Wbrr`9)#p/h)m
+oi^rk#?b/2>$>-7>lIt!>5h_+>l@t.?3=PB@:B(CrF#S4!+>e511"6l?=.,NA7oXpF*E"`LPh(P
+>?Oct9Mn\h7n#g-5[$<00I&&0/MBO^2)I?S3)idPr)*3IrJUZ4r/(E/s+gT.s+UK+s+;JXOcGBY
+M26qEMiNm_R%0kHWir_:]=u2(cI::og"Y?=hYuCYhV?l>f@80kaMY^"Z)aaqSX>V&N/<7?IscQd
+FE2;:CM@EoARt^KraZ4FBPM@#DJo8grbhaQrbVUOs(qRJ"`/7<@9Qe4<>\Y9=&i:&<Dc^r;cQn"
+<`i@(<``=#;cHTg;>a6oLP^nHN/is\P*;/rQ^F52S=Z@HU84T^Vl?\tXfen5Za7'J\@K2`]t_A!
+_SjF5aN;TJc-FY^dF-Opf%8R.g=tH>hr*GPj5]4^k3(sml0@U$m-X60n*olHncA@Srq6<bs7cKe
+s7u]kqtpBjrVc?eJcC<$`rCP~>
+JcC<$MZ<;IrVc]mr;6Njs7uWgs7ZNerq6<`=S)+SnaZ,;n*]T0m-Es$l0%3kjlGI]iS`VMh;$c=
+g"4j+eC2jncd'eZbK7iG`Pf[2^q[Ur]=GJ][^<BHYck11Wi;qpV50iZT:VUCR[BG,@:X.sI>[Zg
+s.0.Zs-rqTrgEeRs-NbO!1!JHrKHo;!0dAEs,m#:s,6o0#D\%h@:#h.U]-teT*_'WR?N_qO,]$T
+r0IVRQ'n#-R_A^7#eRd:LjFZ7O-':#s,d5Bo8j-<OH>TdOoCLGPE_;qrfR8FrKR/E#a^pGR@9Y9
+St>qPs.'(Zs.91]$)!ubTqeBWTV/"WT`(S_UAq%hU&^ndU'%*^TqMCY!MH(^T)PAZT)YAZScG>\
+ScPCPr1!VS"eD6WSt;MMT)G;]Sc>;]T)bP`T*(a[TV2:Xrh':aT_kA]T`CbaT*CmZT:VXFSc,,\
+T:Z"Rrgs+[#bIZ\TV8*RU8%IYqkF+a!2B.]qkX+c!iDlnpo"=pW2HSnpo*teri6"!s/Q(!riH.%
+s/u@)#-bA;ZEggCq6^10.(?^t]">Vf]tV;!`lH3CbKJ,Td*gCmf%8R-g=tB;hVmMWkNhR,p\Xac
++n;V)KmnKIZ+5jBGcniNP,M?2I[+$/T;Yss>[1F4Y-"r+YP4"SMuJV3M>rD3L]3&.L&Zf+K=Cjf
+rquZkqtg0dr;HW`s8W)hruS\PXJ`,*\'2:`Z*C7,XK&J1[^N]a_mm1^[(!<BZ2(U#Y#U:7MN!OT
+O-,ThQ'Rf*R[]k>TV8*UV5L8kWiW>+Yd(OA[^WcW]=bkm^r""-`Q-'AbKJ/UcdC.heCE1&g"P08
+h;7&IiSrnXjlY^gkiqBum-O--rpL'\nac8BoCW%Ts7ZKerqQNhrqcQirVZWmoDX=@JcEdjJ,~>
+JcC<$MZ<;IrVc]mr;6Njs7uWgs7ZNerq6<`=S)+SnaZ,;n*]T0m-Es$l0%3kjlGI]iS`VMh;$c=
+g"4j+eC2jncd'eZbK7iG`Pf[2^q[Ur]=GJ][^<BHYck11Wi;qpV50iZT:VUCR[BG,='K*IDg(o-
+qgn`rs*jopm<nkZoQp@\rI"Wls(D@@(1h)h;,;ReH?sg[G'.nIEc5f2CMINsrG`KkF)l>BF*!D&
+O,o9[FE));I!gA=I/\QdI/89fIKP"GI!tsBrdF`o#(M/RJUrE)pk/Hs!/:E*r.P3,LPPk`reCK.
+q1es)reCT1KnY3QK`Hf)L&Qc)K`Qp^re19)rIk!#s+CB+qh4s&r.Y3,re1B-L&Q`-Knb;8rIt?.
+LAci*K_^<&KSB>Ys+gW/",DVdL\Z](L]3,-L\QZ.L4t>9LA-N(LB*/.M>`>1MuJ\4NW+n:MZJcr
+pl,'/rf6u=p5o<:rf[;Frfm5DrKIAKQC%Q;s-X7aS=Z@GTqeEZVP^9iVuilqWW&hNWN3/)YdM'W
+`6$E[iTBFmmdTeeO,%gtEJ]^:F_kcGNI,Sn7:BbH8pkr8:/+S^9o8k(r.Xm(rJUZ4r/(H0s+gT.
+s+UK+%tjEBnF,f6nF?&?pA"L^rnm_prqlK`oC225kN1[[gtC6,ccjPQ`l#X-^:_%frON6G]Y;.s
+_8=+_`;daN_C3=@`Q#s?b0AS*P*1f_NffcjMN!FJM2I.JOH>NbQ'@>jN/W[MKnk?XL&6O'Ll%"J
+NK0'^P*;/sR$jD4SXuLJU84W`W2ZeuXfnt6Za@0M\@K5a^;%J#_o0O7aN;WKc-FY_dF6Uqf@S^0
+g>(N@hr*JQj5]7`k3(smlKdg'mI'uB#4V0Ro(2JFrq6<bs7cNfs7uZjr;6HjrVc?eJcC<$a8^Y~>
+JcC<$MZ<;IrVc]mr;6Njs7uWgs7ZNerq6<`=S)+SnaZ,;n*]T0m-Es$l0%3kjlGI]iS`VMh;$c=
+g"4j+eC2jncd'eZbK7iG`Pf[2^q[Ur]=GJ][^<BHYck11Wi;qpV50iZT:VUCR[BG,7Rg$E:JpLW
+nPSmSs&&)[$o0Un0/>=>2Dd`d5X#$-$p$I23&icS2`3WW4?WU)rB(B]:JOSX9/o@:;#F;j;uTbk
+;uBSp<VTPm<<H3!;cNHjs&T(us&T(urD`_qqc!Vs=',B$s&T/"!E2ts<VTVp<rlE(rDihts&K(u
+s&Jnrr)<Vpr_j&$<E<1%<)lrs<r5ht<E)rs;uKYq<r?&!<rZ/"<;fbq<;oer<V]T!<E)pt<`N*u
+qGmPps&K(ss&Abns&B"ur`9"u!*B/#r)N_s!*/hor`9&#r`8qur)Weus&f/"rE0&#qH3DnrEB2'
+rEB5(s'#G,s'5S.!*oM-oih?!!*oM/s'>_5@/OL6@JaFn?X@&E?!LW??=.,NAnc(#FF&ImMiX!a
+Q'ci#<`)[g;H-Ud7RKL35rCbS1-7TP84>m(2**`X<)ZTi;>6%JMuJV3M>rD3L]3&.L&ZfJK8keH
+M27"IO-#QmS=ug[YHkUK^;S(:daZk#g>1TArnf'Zh:pZ8eBuO_`4`XcXJ_eaR$<\kLkUD0I!TsX
+Ec5f1BkV-kA7YUJ#\7LXB5)-uDJo/drbhXN!,VFG'l@i*F]hmL<)lt#=&r@$<Dujq<)lus<ruE)
+<rQ(u;Ya2e:fW=.MN!OTO-,ThQ'Rf*R[]k>TV8*UV5L8kWiW>+Yd(OA[^WcW]=bkm^r""-`Q-'A
+bKJ/UcdC.heCE1&g"P08h;7&IiSrnXjlY^gkiqBum-O--rpL'\nac8BoCW%Ts7ZKerqQNhrqcQi
+rVZWmoDX=@JcEdjJ,~>
+JcC<$M?!5Ir;HWmr;6Kis7uZhs7cQerq-<aoD\;[naQ#9md9B-lg!a!kiV$hjQ#7Yi8<DIgtUQ9
+f@SR&e'cXjcHXSVaiMNA`P]R.^V7@m]",;Y['R'BYH=n+WMl_kUnXQTSt2@>R$X(GBQn`RNqK"C
+Sc##XS,A`SRJiKSQ^3p8Pl-a>P5gaEP5g[COT1C?O;j48K8>5:MdE9XUnXQUT:_XBR$EntPE(T\
+MO4=.#+(UBR@0M4r4W;Dc#nQ%qN(T:rfR5Brf?]5$^$U9P*;,pPEM)mPPp^GQ2?jNQ^F/.S"',B
+s.91]"/)?^UAgnhU7n:ZTE:g]U&C\eUSO^^UApneUA^bhTV%gJT:Z"Rqk!eXqk!h[!hPsRrgWeT
+s.97_q4@SX!hPsSrh'1_"J;?\TV24V#,7fbTV.pLrh07a!20=`rLj%Zr1="_U&(A\T)bP^UA:S^
+UApneU@tA]U]I<hrM9LkrMBLkq5=@oW2KBgp8J%lri6%!ri?"!s/l=(s/uO/Z*L\7Zi7<3Zi%0Z
+[C3QT]">Vf]tM1r_oKj?bKS8Wd*^=le^i@)g"P39h;I;Tkj7g1q>U'e+g\#)JUrZead@j1Q__ug
+Lj3f:N)`uPTNbW&>[+D4YHG,-YP*qRMuS\4M>rD3L])r0KnP,3])Md/rqucm!rW#rg]&A9Yck+/
+Z*q]gYckF7Vm!5*[(!HS_8O$pZa-sDYH4u)YPYJ1L5:\EN/`m[OckroQC+)0S=Q7ETqeE[Vl6Vr
+Xf\e2ZEpsI\%0)_]Y;.s_Sa@3a2lEHbg+M\dF-Lnf%8R-g=tE=hV[8MioB+]k2tmll0@U$m-X60
+n*oi:o()DDo`"O`p&Ojcq#C0iqYU0hr;?Nbrdk*#s2b4j~>
+JcC<$M?!5Ir;HWmr;6Kis7uZhs7cQerq-<aoD\;[naQ#9md9B-lg!a!kiV$hjQ#7Yi8<DIgtUQ9
+f@SR&e'cXjcHXSVaiMNA`P]R.^V7@m]",;Y['R'BYH=n+WMl_kUnXQTSt2@>R$X(=?>++pHhN'i
+JcC9"Ifb(IIHl4YHhD^\HiAC(HY?u"An,Fd;13k>H$FLVG5cLpEGfQ.C2%ErEH#o;EcH)?F*)L%
+Ns1M>QYCGgp3cjfs*XfmqgA6gqL8Hm!doEEp3m!krdb$"s+:#uq1S["s+UN/rItE0LkgfaL]<2-
+L]3&)L&Zo'K`Hl)L&Qc'L&Zf.K7nr5qh5*)Kn]JYrIt'%#_e"eKnP/7Kn]GZ"G__dKnfPZq1\a$
+!/LQ.qhP$&reLH.r.k*("c%hdL5(KYM#W51M#<,.MZ&J4N;AP6N;nh1N;AP4NrP15OT1IBP5^[B
+PlR'JQ2d*KQ2d-OQ^F0>R0f=OSY)RKU8+N\rMMlYVl$>hVl6PnX/iJ2\@fYtcIUk6lg=-1oC_kQ
+plg\aF)lPgS:5HnFb-6-C11(0Ce%*DHVR=1;,<"(KnY9ZL%^K(MuS\4M>rD3L])r;KnP,3n*fc9
+o(2SMqY^?Lrtt\0p@IeAlK@6ehV?i9e'Q=]aMu07^q[SZ]*H!^^VI\&_o)Dj!6+lSp;?pL.)s<K
+b0/&UiQn3\OcGE^OdM;gN/iaMMi*CNP)tfiQ'%&cMi*=FKSK>Wqh/@3Ll%%KNK90`P*D5tR$jG6
+SXuLJUSO`aW2co#Xfnt7ZaI6N\[oGd^;%M$_o9U8aND]McHaeadaQ^sf@\d1gYCWAhr*JQj5f=a
+k32'olKdg'mI'H3nF5u=o(2JFrq6<b!;HHes7u]kqtpBjr;H6dJcC<$aT$b~>
+JcC<$M?!5Ir;HWmr;6Kis7uZhs7cQerq-<aoD\;[naQ#9md9B-lg!a!kiV$hjQ#7Yi8<DIgtUQ9
+f@SR&e'cXjcHXSVaiMNA`P]R.^V7@m]",;Y['R'BYH=n+WMl_kUnXQTSt2@>R$X(-84uWO;=.9O
+;=RK_;=d]c;>jB.1GLO<0f(UC5sRXu4?GYg4#o;^3B&nr2?u*#4$5Sd3]m:&s%`Sg#>?R:9MeVc
+;uTbn;uTbr;uT\n;u0Gp;cH]o<<#r$<)Z^p<;'>l<rZ1u<r>tr<;fhq<";o/=&r@%<E<+"<)Zar
+<W,tu<W,tu<rlE)r`0#!r`9&!s&Attr)Netr`&bn%9->-<``:#<E3(#=&r?#<!--"<E8lp"'/K)
+=Su8#<WQ3"r_rhr"&i/u<VfYp<W,ns<W?%s<W?%s<<?,u;u'Gn<WZ9#<;ont<rZ/&<``=&<W,l!
+<E<.#r`&bps&T/$!*9&"!a/]0q,mZ"pK7DrrE0&%s&ett!ErY*=9)M"=p8,6>?kB:r`oA)!*T2&
+rEB8,rE]G0!FT@6@f'O7?<pk9>W5qp?XI5RBkqU-H%1R-Ocu&tS"61EU0Cf!;,0qj?:dRS4@2V)
+1G^O14>&<X7Q34_3B0r:;c*?gp5Js.s,-`2s+p]1rIuAIKS4u6MN!RWP*_]4VQ-f)\%BDnaN`/_
+f%A^3gtr%f-JmS5g=Xs'c-"#>\?i<9US!s>Oc>3OJUVumGB@kDD/3iuB4YUar*p"CAS,RhC2@d*
+q/6=RDf>Vms)%aQ!,_^OqeQ4J)/X80IrJh"=B8I%=&r:#<EN3t<*!%!=]\Z'<s;Q'<`Dsrpegob
+@"sJoMi<XVOHG]jQ'Rf*S"-%@TV8-VV5L8lX0&M-Yd1UC[^WfY]Y(tn_8=+/`Q-'BbKS8Wd*^:j
+eCN7(g"P39h;7&IiSrnYjlY^hl07L!m-O--n*fc8nac8BoCW%Ts7QHerV6Egs8)Wirqu]moDX=@
+JcEgkJ,~>
+JcC<$M?!2HrVc`nqtpEis7uWg!r)E^rq0CcoCMPDnaQ#9md9B-lg!a!ki_*ijQ#:Zi8EJJgtUQ9
+f[n^(eC)akcHaYWb/hWB`P]R.^V7@m]",;Y['R'BYH=n+WMcYjUnXQTSt):<R$V5oCit/ao:GrP
+rg`nUs-a"YR[X/B"IPOBQBhE5rKI#>rKI2Cs,m;Bs,[2A08tdCJr#/>?XTb/TqJ-NT:VRBR?`u"
+OH#0UR$X,,Q^3u+R[KVX]Y;%mK:/'QL\[#/OT(@BOSt77OT1@DOckolrfmAFr0.2HrKdPNQi39Q
+R[]iGSc,,]SXuGMT+%BeU8+HXUS=KVTV8(XU'7<dUSO`^pS%\`UAgkdT_b;XT)G5YT)G8aSt2C@
+S,AcYSY)OIqOR_[T)PA]T)YG_TE:g[TDbG]U&:YbU&L_bT`Lm\rgsLiTqS-PT:_dKT)P>bTV%pO
+T_k>bTV%mMU8%U]rhB7arhBCerhBCerM9Fhs/,dls/,gms/,^lqPXCnpSdeb!35psriH%"s/uC*
+s0DX1rNuU2!4;a5s0a5`\[oDc]Y2%o^r+15aihoRcdC1ieCE+$g"P39h;RGXlL+39r:0e1Z([&+
+K;u?3P^dtB\"JA:Lf.<8<*>]e>?k99>Hb-4Y-@i-oo/m.regZ2reLQ0rJ(?+!//&c!WN&pquQcq
+f`*&N[BHU0YH5I^YHYI=WN32(Z*_!M]YqOo[^*<LYcb;.YPPD*LP^kGN/`m[P*;,qQ^F52S=Z@H
+U8+N]Vl?\sXfen5ZEpsI\@K2`]t_=u_SjF5aN2NIbg+P]dF-Oof%8R-g=tH>hVd>Nj5]4^k3(sm
+l0@U$m-X60n*olHncJFTo`"Lbp@n=[q#C0iqYU0hr;?Nbrdk*#s2k:k~>
+JcC<$M?!2HrVc`nqtpEis7uWg!r)E^rq0CcoCMPDnaQ#9md9B-lg!a!ki_*ijQ#:Zi8EJJgtUQ9
+f[n^(eC)akcHaYWb/hWB`P]R.^V7@m]",;Y['R'BYH=n+WMcYjUnXQTSt):<R$UiX@VB\&o7Hpl
+s+(-!!IfIlI/eWeI/J?aHMr1$I!^3fHtd2'@:a"a;,MahrcnrpG'.nIEc>r5ChdZtF8g1ZEXm)1
+FE;M`NfT3\@X*9<GPZ[eHi/9jI/nZnHi/9fI0"eHr-nTmqgSKn!.Olrs+(-#s+:*"s+LE)r.P$&
+qhG-+r.t?-rJ:<*!euJcrIt0(qh>$(pP&X%",2D\K_L0&KS>)4re:'#q1Sp*KnY9ZLB*)+K`Hl+
+K`Hl,LB3-brJ(6*!f2ScqhP**!/^<'reLK/reLK/!/^]2",VnlM>`>1Mu/J2NUr,+NVne>O-#Hc
+Oo1:@Oo:CAOT^i0P*;+,Q2d'TQ'R`$Q'R`&R$dl@$C[HSSXuLJU8+N\rhodns/#am(T441XKJh9
+]"c5/e(`pHm-aE8p%S7XqYp@8P_jX)F,Z-TI;N\?M19;\AjJt(7n\,T:/+G[:Pjg[KnfMZoo/m.
+regZ2reLQ0rJ(?+#DDX<o_8.Wr8%Ajr;$*ZnaGf-jl,+Og""Qubf\#H`59=)^:a?T#J@dc^qmn)
+_u.FQ`Vd[S_uI[O__/mH`l?'@bKS5WdFHY5XHes1NK9!^Ru3/bMhm:KMN![ZOckumO,f0VMhd"@
+K_pK"KNa.fM2R=PO-#NgPa.T&R[]h=T:r!SUo(&hWiN8)Yd(L?[C3TU]"G_k^VRe*`Q$!?b0/#S
+cd:(feC<($f\,!5h;-rGi8N_VjQ5Oekiq?slg4!*mdKW6nc&(\oCV\So`Fj]p\jmeq>^<gqu6Nk
+rU^#>s+13ls*t~>
+JcC<$M?!2HrVc`nqtpEis7uWg!r)E^rq0CcoCMPDnaQ#9md9B-lg!a!ki_*ijQ#:Zi8EJJgtUQ9
+f[n^(eC)akcHaYWb/hWB`P]R.^V7@m]",;Y['R'BYH=n+WMcYjUnXQTSt):<R$U948kVrWlr*=M
+n50-^oMY]ds&'dl0et@91G^sH5sR[u4?GVf4?>M`3]K#V2`3\q4T@MC497N+r_<Yl:+e_):f@-g
+!)i_nr_rkrrDNYoqGdDlr`&ksrD`YorDj)%<`W4"<W,tq<W?%u<W?%u<W5r!<EE9$<WuK&<E3!t
+rDihts&Jttr)`brr`&ntr)NetrD`Ym!*&qt"BJN%<E8osr)F,(;c?Xp<E<+#='8]&<s)K'<)rlr
+s&JtrrDihrs&K"ss&K%tr`&qtr_reqr)Nbts&B2&<E3!tqc3Mmr`9"ur`9"ur`9&#r)iu&qH3]!
+!*Jtsr`K)$s&f/$rE',(>$:f+rE92*qHEl&!F/k,>5q_*>5;A&>lJ%-?N4@5?t&t@!af8?r*1"C
+?=75RB52:)G^b=(Od)6%SY)XPVPsKn+'M]B:JXtf>t@FQ3^c:s2_H7(4"W-V7Q31^3]L)<;Yj8`
+N;eb7MZ&D2L]E5/LAurnKTD7ZR%0nJX08n?]YMJ,c-k+mf\5-:h;7&HhVHu@g""Nrb/M-+['$C(
+T:2(.Nf&RCIscQdFE2;:CM7BoAn:dK$"RUZB5)*sDJjFiDZFbUDuFSRDZXfnD>e;KCDq#+DJjE5
+FEWIG>$+g*;cHh$<)m%#<)lmr<rH)*<`iC(<`N*s;Ya2d:g/X2M2R=PO-#NgPa.T&R[]h=T:r!S
+Uo(&hWiN8)Yd(L?[C3TU]"G_k^VRe*`Q$!?b0/#Scd:(feC<($f\,!5h;-rGi8N_VjQ5Oekiq?s
+lg4!*mdKW6nc&(\oCV\So`Fj]p\jmeq>^<gqu6NkrU^#>s+13ls*t~>
+JcC<$M?!2HrVc]mr;6Njs7uWgs7ZNerq6<`<qGnQnaQ&:n*]T0m-Ep#ki_*jjQ#:[i8EMKh:pZ:
+f[n^(eC)akcHaYWb/hWC`P]R/^V7@m]",;Y['R'BYH=n+WMcViUnXQTSt):<R$V5pGBne%n=KZN
+rgX"YSGSfURf&QTR$X*8Pl6g@P5UUDP5g[EOT(:DNJiLBL&QoI@&0TpTq\-MT:hXAQ'IPpNfAs_
+R$O&)QC"$=RfL/#^';9=S:-*ROSOt7OT1FCOT(=<O8t@@OT1@AOT(IBPl?mEPQ7$GQiEHQR0&hH
+SGo&`StM^KT:_eRT*:m]U7n9TrM0Cdr1a4d!2TUjs.oXhr1a4d!2BFc#,%T\TV.pLqO[_Xs.0Oh
+St;RHTV%jJSc5,[SXf\M%A'2bT:_^GSY)OGSXuGNTDkJbTq@tVT_tM[U'%*^TqVI[rh0=dqk=%_
+rh'1`rh':aT`(M]TE(_aU]7(\U]$neU]$thV5F6g!2f^k!2fal!N)dnVY[7jWVWReWW0!rX8f9u
+Xo,='Z*Ue6[/[H4[/RHZ[^WcW]">Vg]t_=u_o9X9aihrScd:+heCN:+gt^fHjll%#p&"1W+h"21
+K8#5hcC0`?H)fJZN3-<6H'MO&S"s4l?X6p>XKJ`&YPsOVN;eb8MYr>2M#W80LAur-KYdZgrr2lp
+quQcqeGgW(Z*((1bdPd&Y-bL8Wj&V/[C<WV`l,?qZa@3IYH4o(YPPD&L51VCMi<[WOHPfmQC!u-
+S"6.CTq\?ZVl-MoXKA\1Z*UgG\%&u\]Y2(q_SX71a2lBGbK\>YdF$Fme^rF*g=k?<hV[8MioB(\
+k2tjjl0@U$m-X6?mfr:Oo()DDo`"O`p&Ojcq#C0hqY^6hr;HTcrdk*#s2k:k~>
+JcC<$M?!2HrVc]mr;6Njs7uWgs7ZNerq6<`<qGnQnaQ&:n*]T0m-Ep#ki_*jjQ#:[i8EMKh:pZ:
+f[n^(eC)akcHaYWb/hWC`P]R/^V7@m]",;Y['R'BYH=n+WMcViUnXQTSt):<R$Ul\B5;O7n:LXj
+s*t3$IXQYAI/JEbI/SEbHMVskBP1gaAH$3Z:jdV:G^4FTGBIqHE,KK-CM@L'EcH)?EH;#!!KW9?
+Ns(GdI;O-'I/\KiI/eTpI/SEjHie_DI/\QoIfFoqIf=cmIeeKmJH(3"K)C9#K`?]'K`-W&LAlu(
+L]E50M"cZ,Lkg_=r.b6,!/CK,r.b0($&4.fL4tA:KnY3XL&Zo*K`Hl+L%U3!K`Qp^reCH,"bqee
+L51Q[LAlo,L&d#.LB!&/LAlu.L^8clLPLV>L51Q^M#E/2MM^n[rJ(H1M2D4f",VnmM>`>0Mu/J2
+NW4t:NV\V1NW"n;O8+h:OoLO@OTL]0Pl$aGPQ7!FQ4K=LR$jA2S"-">SXuIHTq_I\rhUI/VlHo)
+[(!`fbL5)$jQZ($oC_hPqYL-frr!r:Q]6H9FF&q=J9G^AKV<O)LJ)&cE(bG#Hqd@8;,3#JK`Hl)
+L&R),N;eb8MYr>2M#W80LAur0K_bNDh>\AkqY0XPmd'-!io&VFf$hshaiMN@_SEq#]`#JB]El3b
+^VI\&_o0Lk`<+&u`W!dU_u7OP_uI[T`@f0NaND`Ocd:.mg>1]8g6n(dO,flqRZ35cN/3=MMMdFW
+OHGioNfT-XMi!1AK_pK"KN<h_M2I4MNfT9bPEhH#R$sM8StD^NUnsueWN*&%YHY:<['mHR\\#Mf
+^VI_'`5Td<aihlPcHjnce'uq"f@\g2gtgiEi8N\Uj5oFckNM0qlg4!*mf)YZnF?)?oCMVRp&F^c
+p\jmeq>U6gqu-HkrU^#>s+13ls*t~>
+JcC<$M?!2HrVc]mr;6Njs7uWgs7ZNerq6<`<V,ePnaQ&:n*]T0m-Ep#ki_*jjQ#:[i8EMKh:pZ:
+f[n^(eC)akcHaYWb/hWC`P]R/^V7@m]",;Y['R'BYH=n+WMcViUnXQTSt):<R$U9592&+I;XREN
+;#aDd;Z9N>1c$m?0f(XB2*jMm5!:ti5!1ke3BK5Y2`<NT4?PYc4$5Vd4?WU<#Ye&e5"ACG<)ico
+r_iVls&8tsrDEVorD`eq#?4W#;GpFm<;fhr<;T\m<Wc?#;cWcsqGd\u<E3!s<;fet<`f9$"]\N$
+<E)rq<W6#!<Voho=8Z+s<W?,"<<6-#r)EVn!`W)trDikss&T/"r`8qsr_rhrs&T>'<``C*rE'#"
+s&T;'<)loq<W#er<rQ+u<;fes<;ons<;onp;uBT#<E<(!<E<."<;ont;uouuqc3GmrD`hurE&o!
+"Bei.<`f6%r`K5'pfIGsnlbcj!`rK,r`]>+s&oD,rE9;->[1M2>5q_*>5hb)>5qe,>lJ%-?3":/
+?3":.>lS(G?=.,NB5)7)G^b:$O->s#StVsYWN*&%rN7;K>#S0l;,gjp77BR1:-UR%.Pj.I0LeK#
+3&WiY3E/pS:\mrfNVJJ3MuS\4M>rD3L]3&.Kg16]U8P&s[(3ic`Q6?Qe^rI.h;-rEhr!;HgtUN5
+da$%U^q-qWWhlAXQ][;bLP()(H?XIODf0?(BP1pgA7PRK#\@U\BPD3tD/]2g!c`0urGMRPs).dP
+rG;LN*,]\6E-$2JI"6-\?!160<FSs0<E<(!;cHdt<EB$!#ZXu,<)cjr:f$scqG:4ILP^nHN/is\
+P*;/sQ^F52SXuIIU84W`Vl?\tXfnt6Za@0M\@K5a]t_A"_SjF6aN;WKc-FY_dF6Uqf@S[/g>(N@
+hr*JQj5]7`k3(smlKdg'mI'uB#4V0Ro(2JFrq6<b!;HHes7uZjr;6HjrVc?eJcC<$ao?k~>
+JcC<$M#[)GrVc`nr;6Kis7uZhs7cQerq-<aoD\;XnaQ#9md9B-lg!a!kN:pgjQ#7Yi8<DIgtLK7
+f@JL%e'ZOgcHOJSaN2B?_ns7)^:_+i\[T#SZa-g=XfSP%Vl$;dU7n3NS=>q6@V9P#I>mQb!1j+Z
+".bsOSGerVRf/WVR$X,(r075F!gJn4q3(]?rK@2Crf7tVM1^;7M25Q8VP^&]U7e'LS!oY-PE_8i
+Mi7S##FCgER@9V7SGp8&]EXIRH%D*>OS=h6OT1ICO8t@=O9(E(r/Ui?rfd5D"I5:;Pa2'2s-WhS
+#+D$OS=Q7Drh'=eTqVIY".u6YT_tJeU84Q[US7[]rhBIhrhT[nV5=0e!2KOfrM'RjU8"?ST:c+U
+r1<qZrLO"]rgjFgTV/!OT:VXFT)>,ZT)G;\SHkaWSXc7ASt>qRrLj+]rh0:bs.TLgr1a1a!McCf
+U]7(fT`ChXT`UmZTDbD`Tq_L\rhB(\rM'4c!2]=brhoam!2oanqPjCk!i`3"ql0OorMoq"rN-(&
+riQ4(s/lF.Za9J7s0_m8$+IFT\\#Me]tV8\_&'u,`5]m@bK\A[e(*+)gu%)Pkj.a1qYog\+gn))
+KS?PCjdCmOQ_rPrQ@MnhNE'2TTVu'u?<p^:XfSf(YPjIVN;eb7MZ&D3M#W80LAutFs8W)qr;ciE
+rufCgYcPOZ[a;Rf['d!5Xfee3\@9)e`4WOcZa7$CXKer+YPG>/L5:\DN/`jYOckroQC+)0S"6.D
+TqeE[Vl6VrXf\e2ZEppH\%0)^]Y;.s_Sa@3a2lEHbg"G[dF-Lne^rF+g=tE=hV[8MioB+]k2tml
+l0@U$m-X60n*oi:o()DDo`"O`p&Ojcq#C0iqYU0hr;?Nbrdk*#s2t@l~>
+JcC<$M#[)GrVc`nr;6Kis7uZhs7cQerq-<aoD\;XnaQ#9md9B-lg!a!kN:pgjQ#7Yi8<DIgtLK7
+f@JL%e'ZOgcHOJSaN2B?_ns7)^:_+i\[T#SZa-g=XfSP%Vl$;dU7n3NS=>q6='K-IDftH!s+10"
+"+PcJIJnQiIIqpcHhD^_HQ[!5@p`h\Al*l'H['g]GBJ(MEc>u8D/<s%BlS-5EcZ:#ErgB(rf75C
+NGriPF8:4]Hi/9kI/nZoHiAEmIK"WoIK+`rJ+J-aJ,XuuJcC?"K)gT(KarcgKS5&4Knb;8LPCP=
+LAlu-M#N8-M"ui*M"uf*L]3#-LAuu-LAur/L4t?YLAHW(LAZc)L&cr#LAHT(LAll-L55\]!f)Mb
+reCK.rIt0(rJ10("G__dLPPe`rJCQ3!/^<'rJ(B/r/(9-qht<0rf-N."HAG%NK*mss,Zl8!0R8B
+s-!DE!g8e4q3CiCrg3YP!h#LHqjd\W9:hcLU8+N[V5:)iXg#.A]u8%?f\YZPmI9]>pA"L\r;HWp
+rr2loqtu\9H?F=jPH94RCNY6?EcYYXASak1H?jp5:/at`M2-e?LAQ]'NVSP4MuJV4M>rD3L]3&.
+L#)bHrVH<^o'br0k2YCTg=Oj$c-")H`507(^:aHWs1JBF#JRsg_8=+.`;R[T`qRIN_u@S0`Q#s=
+aihrSd*gIsgu%)RlfcZgP*1lmRus2$MN*XRLl@7LN099bPF%DlNJr^NL4tBZL&$C0L5:\DN/`jY
+OckroQC+)0S"6.DTqeE[Vl6VrXf\e2ZEppH\%0)^]Y;.s_Sa@3a2lEHbg"G[dF-Lne^rF+g=tE=
+hV[8MioB+]k2tmll0@U$m-X60n*oi:o()DDo`"O`p&Ojcq#C0iqYU0hr;?Nbrdk*#s2t@l~>
+JcC<$M#[)GrVc`nr;6Kis7uZhs7cQerq-<aoD\;XnaQ#9md9B-lg!a!kN:pgjQ#7Yi8<DIgtLK7
+f@JL%e'ZOgcHOJSaN2B?_ns7)^:_+i\[T#SZa-g=XfSP%Vl$;dU7n3NS=>q67Rp-D:JpIVmnrIK
+s&&Mgr_X%Z1,(@:1c%$U5sR^74V'V;4$,J`3B&iR2`<c\4$*@'"$/M)4T/"X9fGO=:]=>k;uBPk
+;u]hs;u]_q;uK\n;uTYp<:j2f<WuK&;c?Xqr`8kqr`0)";cN`rqc<_s"&r9"<;]_r<;ons<WZ?'
+<r?%q<r>qu<`T&ss&8qss&/nsr_ierr`'&"<E</q<=2](;cHas<`N.#<r?#-<`N.$=&r@$<)lms
+<Vobp<W5tt<<-"p<W5qu<`T)ts&8hps&K(t"&r<$<;fhq;ufqk<rH"u<r?%t=T2D%<rZ8$=T)A&
+=SZ%t=SQ&!>5_V'=Sc)!=oDM(>Q.h+>Q7k0>?kE;>PhV&>Q.h+>Q7q.?2\+/>QA"*>5qeo>[:WA
+?X[GUBl.m7I"R99PaS)8USk)mY-5+9['R-GZEgf>=Ar!l='9!*77B=*Da664-o*n<0LnQ$2E!TV
+3)ijPq,.*Mq2G<2regZ2s+p]1reCH,3NTKn]"Z&$b0JJdf@em6hVR/Ji8<DIgY16-ccaAF]=+rD
+VP0KGP)kKUK7JAsG]e%GDJNouAnGWRAGp'FB4u!oCM[j*Du+GQEW0qUDuO_RDYn;NDA@)/E,p)F
+H[^O$N.Z.X=]nd/>?=p,r`05&;-$[s<*0'"$<L>0<`N$r<)HIgr)*8d@"sJoMN!OTO-,TiQ'Rf*
+S"#t?TV8-VV5L8lX0&M-Yd1UB[^WfY]=bkm_8=+/`Q-'BbKS5Vd*^:jeCE1&g"P39h;7&IiSrnY
+jlY^hl07L!m-O--n*fc8nac8BoCW%Ts7QHerV6Egs8)Wirqu]moDX=@JcEmmJ,~>
+JcC<$M#[)GrVc`nqtpEis7uWg!r)E^rq-<aoD\;XnaQ#9md9B-lg!a!ki_*ijQ#7Yi8<DIgtLK8
+f@JL%e'ZRhcHXPTaN2B?`59@*^:h1j\[T#SZa-g=XfSP%Vl$8cU7n3NS=>q6?tX_0KTb_os.'.[
+r13kXrL<eTs-`kR!gf4<qNUuCq3(]?rK8CfOGf!PK8GDA?sok-T:qpNStDRDR[08%OcGEZQ^=)+
+R$a?@Rgd!E]Y;+/`cZcuOcY[uO8P+>OnXt8NrbB+rfd8E"I>C?Q'V95s-WbQs-j@cSXuLITqS3T
+TqVFX!MQ1bT`Lm_rM0LiU8%X^s.o[krhfUis.]RgrM0@d#,.]^TV/!Nr13nZr1<hYs.BRiU7e0O
+St>kN!1s1^!1s(Y#+V6TSt;RHqk3t]rh07as.]Lf!MZ@fU&^teU]mNfTqS3SrLs:eq4dh]rLa4d
+US@.Nrh9Cfr1j=hqkj@jrMKIirM]XnrMoao!35srrMogsriH+$s/lU/Y-+t3Yd(P4[/IE4[f3`B
+\@K/^]Y2%n^VKfa'>h],aNMiTdF6_%h;I>Vl0e0<rTO8*^T3WTM2\^bb`dU%Pe*K3S<-TKO&fDT
+TVu's?<gX8Y,\f(YPaCUN;nh8MZ&D3M#W80L&cqIs7lT=ru^X=YH,@OZH'hb[CNQAXg"t5\$ro[
+`5&mkZF%'HY-Il-q6'aP=bqomN/`m[OckroQ^F21S=Z@GTqeE\Vl6VrXfen4ZEpsI\@K2`]t_=u
+_SjF5aN2NIbg+P]dF-Oof%8R-g=tH>hVd>Nj5]4^k3(sml0@U$m-X60n*olHnd+jZo_%nNp@n=[
+q#C0iqYU0hr;HTcrdk*#s2t@l~>
+JcC<$M#[)GrVc`nqtpEis7uWg!r)E^rq-<aoD\;XnaQ#9md9B-lg!a!ki_*ijQ#7Yi8<DIgtLK8
+f@JL%e'ZRhcHXPTaN2B?`59@*^:h1j\[T#SZa-g=XfSP%Vl$8cU7n3NS=>q6=^G`VFF3D,rIOru
+"b1uLI=-G;IIqpcHhVjbHO=CtARf=bB2MHQHiA6uFa&%MF)l8=Ci!j$C&N&QF)q8%s)SL,O,f9]
+>a/uCJ,+KhHi/9kIK"TmI/eWoHiSToIf=imIKP(KIt%3Cr.+curIb-'rIk6)re:B,!f)MbpkJj*
+rJCK/!/^T/",D\fL]3,-L]<,.LBN?cKnb?ZL&?])L]3&"L&H`/LPCP=L\c`0Knb;8L4t?\L&d#,
+LAQ`+LAci(LAco&M#E,-M#<,.MY`,/L\lo+LB*/.M>N1rMu8P3N<,'!rJpi;rK%#Ar/gr@#EY(1
+P*2#nPk^OCQMd($R$jA2R[]h:R[KP1R@9Y;Tq\<XV5L;oYd:gO_o^6Vh;d\cnFQ>Iq"ad`r;HBi
+,+=OBGBeFmSX4Y?C35>]A9D`T7;YOfH?t'99i4Y\M2-h@qM"j,q2G?3regZ2s+p]1re:E,i;Y5)
+qtTjTn*K?%j5JhKf$r*lbK%W@_8*du]Y(kg]Y(qk^;%M$_Sa:0rPecUpVm0Nqo(A2a2lEIcHjnf
+f@o*>jQZ(&pYP_XQ]dDsR#[MtMN3aWLlRIQNKK?bOd2&iNf8jRLkUW]L&$E%L09=hMi<XVOHG]j
+Q'[l+S"-(BTV8-VVPgAmX0&P/Yd1UC[^`lZ]Y2(p_8=.0`lQ6DbKS8Xd*^:keCN7(g"P3:h;7)J
+iT&tZjlYail07L!m-O--n*fc9rpg?do^qhLp@e7TrV6Egs8)Wirqu`noDX=@JcEmmJ,~>
+JcC<$M#[)GrVc`nqtpEis7uWg!r)E^rq-<aoD\;XnaQ#9md9B-lg!a!ki_*ijQ#7Yi8<DIgtLK8
+f@JL%e'ZRhcHXPTaN2B?`59@*^:h1j\[T#SZa-g=XfSP%Vl$8cU7n3NS=>q67n?9H:f$IVmSW:H
+s&&Sis&&eP'J_<s1c%'J5s[[u4?Pbj4$,Ja4#m3t"#N,'48q8E4?>Pc4AYoN""?`6;#F;k;u9Jj
+;u]hs;Z]iq;uTbo;u]_r;cNNl"'/E&<Voes<W5o!<)lq!q,RDp!EE+u<Vfbk<W,l"<E)t!<rQ2#
+<WZ?)=8>no<W?#(<E)pr;cH^p;uBVn<W?,!<W?%q<<6&tqGdMrrDs)%<E3*!<s;T'<E)ptp/D,o
+<)lrm<;ons<<#ns<<#r&<)lpt;cH`p<<6-#r`&ntoN(oj!*9#!rE0)#qH*VtqH*VtpK7Q$=]t`+
+!a/W-r)`o#!*T;)s',M,r`f;*!aAi3q-3l&r`]D.?2\(2?!CG0=%l_!>$>-7>[CcG@qB=hE-6MZ
+Ll[diT;/9_X0/\4Za@0N\%&oV\@K5c?<U<+:Jt+s<(KJH4$u=r3&;a,4"W-V6q0'l3]T3";bg9f
+;>cFLN;nh8MZ&D3M#W80L,Xh!^Ve.9cd^Oug"Y?>hr!ANi8<AGgXjs%bfIZ6\$2p1U7@U7OGepJ
+J:2chG&qV@ChRHnAnCsPracCJB4u!pCi+'.E;X_UE;jkOE;XVSDZ+GPDZ=\UE?K@HH@:<sM3!pj
+H^SJM=B8U/<EE4$=&r@"<E<+"=&rH&<sVi.<E3!s;Gg9g;>F&gL09=hMi<XVOHG]jQ'[l+S"-(B
+TV8-VVPgAmX0&P/Yd1UC[^`lZ]Y2(p_8=.0`lQ6DbKS8Xd*^:keCN7(g"P3:h;7)JiT&tZjlYai
+l07L!m-O--n*fc9rpg?do^qhLp@e7TrV6Egs8)Wirqu`noDX=@JcEmmJ,~>
+JcC<$M#[)GrVc]mr;6Njs7uWgs7ZNerq-KfoCMPDnaQPH:%%E8lg!a!ki_*ijQ#:Zi8<DIgtUQ9
+f@SR&e'ZRhcHXPTaiMK@`59@*^:h1j\[T#TZa-g=XfSP%Vl$8cU7n3NS=>pUA8?@9NLcX.T(efU
+SGo#VRf/TTQ^3p4PQ6pBP5UUCOrBI@LP1J>M2>Q8V5BrZT:haGR[KM.PEM)gMuB"BQiNTRRfL/"
+^''OhI#*p`OSk.>OSt7;OSk4BOHG\(OSt4?OSk=@PQR5<Q^7H6s-WeRs-a+\S=Z=ET`1YaUAghd
+T_kD_UAgqgV>d:hUB76gV>[7kVuERmV>d4tUna`\US=HUTV8'OrLX"Zrgs(\rLa:eU8"?Srgj4^
+SY)MPTDtM]SHbUTSXuFFTDG5\T)kX[rLj4cqP4(brhKIgrhKLfoqVDYrh'7bn=ouZrhKFds.fRh
+s/#Rhs/5jns/5dns/?!sql0=iql0Uqr2Th!qlTn$ric:)!4)R1rjDd7rO2d:rj`*B]Y46Ws1]2_
+`5]m@bg4_gg"bKEkN_I)o_deM,.=;.Lkhk<d@,l>R]"f$LjrES=-?RLS"s1j=C,37Y-4q3q60^U
+qMbE3s,-c3s+p]1re:E,`rGu9b5WTuZ`gLG_7[msZb!KCXg,(4[CEi\`P]3n['d<HYH>%2rNH"!
+<ecBdM2R=QO-#NgPa.T&R[]h=T:r!TUo(&hWiW>*Yd(OA[C3TU]=bhl^r!t,`Q$!@bKJ/UcdC.h
+eCE.%f\5'7h;7&IiSrnXjlY^gkiqBum-O--rpL'\nac8BoCW%Ts7QHerV6EgrqcQirqu]moDX=@
+JcEpnJ,~>
+JcC<$M#[)GrVc]mr;6Njs7uWgs7ZNerq-KfoCMPDnaQPH:%%E8lg!a!ki_*ijQ#:Zi8<DIgtUQ9
+f@SR&e'ZRhcHXPTaiMK@`59@*^:h1j\[T#TZa-g=XfSP%Vl$8cU7n3NS=>pI>%),`Fb,,3K):,u
+J,t.KomQL\r-S3brHeWZA7K3MB,FHnI!^-`GB\1OF)c/<DJX-)C3+E9F*)I#Er_7"Ns1Q'EdhqN
+p3cgcpj<-iI!kd=rI4`qqgS0erI=s#JqEoQs+L9'rJ(-'"GhhgLku"d!/g`3rJ1H1qhPK6Ll$qD
+LPL]aL]2u.L5#V[!/:?*q1f',KnP-QL&-N(L\QW(K`Qp`pkJ[$!/CE*rJ(9+pk\m(r.t9-regW1
+reUQ/s+pW/s+p]3reg]5s,-Z2!0$K,r/:W8rJgl;r/Uc;rK.#@rK.&Arf[5D!0mGI!1*VLrg*PM
+"dYLAR$a<@RO4GiQBml*S"61EUSOcdX0&V4\@fYtcdpq4lL"*4pA"I[qYU3hrq-47QAg67G_qHN
+J95UOJuEg-Ak$3"DFenrHqm@0;,0iCL4k?XL&?r,N;eb8MZ&D3M#W80L&cqgrttb4q=aFLmHWlq
+iSE8?e^;^da2Z'6^qRMZ]EZ'`^VI\&_u@UQ`W!mT`V[[S`W*q9`Q#s>aND]Ncd:.lg"bKEkNhU/
+q>L?ffA`<`P*))qQ'dPkO,f'UNJi^TP*(onQ&go`NJiVkLAci$KN<h_M2@.LNfT9bPE_?!R$sM7
+StD^NUnjlcWN*&%Y->1;['d?P\\#Mf^VI_'`5Ta;aihlPcHjnce'uq!f@\g2gtgiEi8N\Uj5oFc
+kNM0qlg4!*mf)YZnF?)?oCMVRp&F^cp\jmeq>U6gqu6NkrU^#>s+13ns*t~>
+JcC<$M#[)GrVc]mr;6Njs7uWgs7ZNerq-KfoCMPDnaQPH9()*5lg!a!ki_*ijQ#:Zi8<DIgtUQ9
+f@SR&e'ZRhcHXPTaiMK@`59@*^:h1j\[T#TZa-g=XfSP%Vl$8cU7n3NS=>p884uWPr_`)]ohk`e
+r))`Us&&Si"App00JWP_&iDs@5<h:n4Zbbg4$#D^2`ETNr]:?G4$,Pc4?P\&:'40R8Po:`qc!Gk
+qc!Jnr_r_orDN_p;tsAe<WH.t<:s8k<r>tq<r>r$<`N1$<E9#t#?=`&<E3($=8l5(='/O)<`f0!
+#ZXi'<E3!u<`K#rqc*JnrDj&$<)Z[oqc*Vqqc3YsrE&u!rDs)%<E3)m;ufqj<;ono<<#to<;oku
+<`f3!rE&u!s&]2#rDi\pr)`o!nQ5WjqcWl$r`T/$r)Wl#r`T5(r*0#&qHNu)!*fG+s',M.s'8`5
+?!LT9<``@*=^#!5>[:ZC?t3e^C2S'=Jr,VUS=l^XXfo"8ZaR?S]=bei]t_=u_Sa=3aBD\D:/Ftl
+>"V:R4[Mt11,^U<.QT+L7n5Hp2**`Y<DlXlq,.'LqMbE3s,-c3s+p]1re:f7bg=nkf\5-;hV[8j
+iABHKh;$Z5d*9\N]st>KVkT`MP`^o]Kn4]"H$47KDes-#B4YXbA7]=aAnPdjC27['DJsLlEW:"U
+EW'kTEW0nYDfBXmDZ=VmE,fo?GBnObJqf5HQ^jeJR;ddb=]\^1=BGH%$rp5,<`<%!=BAO*=',B%
+r`&np!)WVkpeY"GLP^kGN/is\P*;,qQ^F52S=Z@HU84T^Vl?\tXfen5Za@-K\@K5a]t_A"_SjF5
+aN;WKc-FY_dF6Uqf%8R.g>(N@hr*JQj5]7`k3(smlKdg'mI'uB#4V0Ro(2JFrq6<b!;HHes7uZj
+r;6Kkr;H6dJcC<$bQ!(~>
+JcC<$L]?uFrVc`nqtpEis7uZhs7cQes7QEa!;$3\:\!rCn*]T0m-Es$ki_*jjQ#:[i8EJJh:pZ:
+f[n^(e'cXicHXPUaiMNA`59@+^V.:k\[T#TZa-g=XfSP%Vl$;dU7n3NS=>pRAp&<LOo:j?T(SWS
+SGo#XRf8`TR/`NQQ2m3IPlHsAP5^[EOt_iOKnG8?N*qF<V5'cZTUhXDS!fS-OckfaMjTp"R$jA3
+SXc1@^:q7o^T*?AKoqMpOT1C@OT1C;OSb1=O8tFAO91Q-P5UUDPQ@&8pm;#JrL*\Ss-j+\StD\T
+T`ChdUB70`U&LbgTq\9VrhTRj#,J)kUna`^rMKIi"/_unV>R+kV5'f[rLs7as.9@aSXobOrLa%]
+!29@c"JDBYSXoPJs.91[rgj+^pn.V\rhBCc!2B.]rhTLfrhTRhrhTRh!2TCbrhBCes.]4^!2TRg
+s.]Ie!2TRirhfXls/>morM]aqs/Q!rq5OLqWiGrqs/Q(!!3H1%!3Z='riZ:)r3-7-ZaBV;!4Mm9
+#e7FU]">Vf]tOEZ'>MB#`5]sEdF6_$gu7DZm-sT?r8IZ#ag%4jO,:oh]p+>!RAm-@Q&g!BP%%Rg
+TVu%!?X6m>XK\e2q60[Tqi(N4s,-c3s+p]1re?=1+O%3sY1<!OcaU*d[]QX:YHY@C\%KMo^:1MX
+Za-g;ZEF/0po\%ZL51VCMi<[WOckonQC+&.S"6.DTq\?ZVl6VqXKA\1ZEppH\%0&]]Y;.r_Sa@3
+a2lBGbg"G[dF-Lne^rF+g=tE=hV[8MioB+]k2tjkl0@U$m-X60n*oi:o()DDo`"O`p&Ojcq#C0i
+qYU0hr;?Nbrdk*#s31Ln~>
+JcC<$L]?uFrVc`nqtpEis7uZhs7cQes7QEa!;$3\:\!rCn*]T0m-Es$ki_*jjQ#:[i8EJJh:pZ:
+f[n^(e'cXicHXPUaiMNA`59@+^V.:k\[T#TZa-g=XfSP%Vl$;dU7n3NS=>pL?>"%nH2W<`K):,s
+J-(4LIeJ3bI//-cHN&7&BOt[_B4kpUBmk>SH$OOTFT-:]EGkbls(VOTrcJ-\%!6Q4F,l<AO,ea4
+Cj#Z'rdF]ls*OBcq0i0is*srqoRHgi!eGrTre(3's+UK-re:<*s+^T1r.k<.%#9XpM2@+HMMd7J
+M2D4frJ:N1qhb?/!f)SfreLH,s+LN-Kn]J[r.bN5LPUb@KnP-RL&Qi+L\-?$L\QW$LB33dq1ej'
+!f2\ireLW4Lku"b",MeiM"$9#L]3,0L]*#/MZ&J5N;SV2N;\\7N;nh8MZ8V3Muo!!NVSV5NrY:>
+OoCIAOoLUBPQ-jKQ'Ra8Q2d0LQi<<NQN<JArgP4&R$a;1S=Q:HUo12mXg,:E]=u/'ce%(:lgF?:
+q"X[]qu$Elrpg"5TojtQIsIZKOF)"`Fb>6`F)+liDc'/SH%&F^;c->ILkg\>q1\^*qi(N4s,-c3
+s+p]1reBS8)>s=(oC2/5kiC^Zgt:0*ccjJN`59@*]tD&X]El3b^V@S#_Sa=i`VdaS`VIOP`tZP6
+aN2KHc-Oecf%A^5iT07ko(W%Zs!$jqUR%()WOS(ZO,K'[Mi*LRMN<m]P*2/oNfB!SLk^S<K`-W"
+KOKRhLP^nHN/is]P*;/sR$a>3SXuLJU84W`W2cl!Xfnt7Za@0M\[f>b^;%J#_o9U8aN;WLc-F\`
+daQ^rf@S^0gYCWAhr*JQj5f=ak3)!nlKdg'mI'H3nF5u=o(2JFrq6<b!;HHes7u]kqtpBjr;H6d
+JcC<$bl<1~>
+JcC<$L]?uFrVc`nqtpEis7uZhs7cQes7QEa!;$3\:\!rCn*]T0m-Es$ki_*jjQ#:[i8EJJh:pZ:
+f[n^(e'cXicHXPUaiMNA`59@+^V.:k\[T#TZa-g=XfSP%Vl$;dU7n3NS=>p88PDiT:]4/[;Y<oc
+;ZBVY;#O8g;A(f@0ebC?1cIN_5=%Fp4?GYe48q;?2Ztrp4$>Y(48qAB48hnW9g2'C;>F2h;u]bq
+;Z]os<;ohq<;oho<;]\p<;KVh<rQ&!<E/Tjr`9"ur)W\prDinurDWr#<)cju<rQ2#<rZ;"=8Z+u
+<;ont<WH+u;u9Pl<W#l"<E)mqpf7>ps&B&"q,[Psqc<f!<VBAl<Vobq<W,no<<H3!;cN`rr)E\r
+!*&ns!`i<#r`&r!qH!]"=8l8#<VTVp=8c1n=8c5$=8c7t=T_i1>$Co.rE0&#"^"o1>$>/0>5VV"
+>QA"->5qe->[./1s',M.s'5Y1>Q.h+=WpsQ>[CcF@:Eb[BPM@%FF8b#PF8#<WNEA0['dBR]=bhl
+rkU5(_o0O6aND`OcHfj&<DcLg@9$;u7RTC+5X%(Y/297@0M"]'3&WiZ3E/pV;,d9fqi1K3repf6
+rJCQ1s+gT.1Y:=6gtprGi8N\Si8<DIg"+TtbJh6,ZE:(#Sskn+N/<7?IscNcFE)58BkV-jARo=_
+Ac?9HBPD3tD/O92n8\AHr,D^Ur,4N5EH6,AG'J=]J;&i@PF8#<Wj&nEL6,hH='9'J='&C&<``7"
+<`E1$<`N4&<``:%<Dl^o;,C*f;><srKnbA>MMmFRO-,ThQ'Rf)R[]k>TV8*UV5L8lWiW>+Yd1UB
+[^WfX]=bkm^r"".`Q-'AbKS5Vd*^:jeCE1&g"P39h;7&IiSrnYjlY^gl07L!m-O--n*fc8nac8B
+oCW%Ts7QHerV6Egs8)Wirqu]moDX=@JcEsoJ,~>
+JcC<$L]?uFrVc]mr;6Njs7uWg!r)E^rq-<aoD\;VnaQ#9md9B-lg!a!kiV$hjQ#7Yi8<AHgtLK7
+f@JI$da?Fec-4AQaN)9<_SX+']tCqe\@/fOZEUO7XK&7tVkp2`Tq@pHRp]cBFaT.<qjm5Jp722R
+rL<hUrgEeRs-EbPQ26aFPOt"QNJraGM2@-t@&KcsU7e6PSXl:?R$IZ5%#p45R?s8.R@Bb<S"9Ml
+#/=EjGCcBJrfR,?!0@)?!0@,@!0R/?rfR/@qiUl@r0%,FrfmJLq3V,KrL!nZS"#q=St;VST`Chc
+U]7(fU]."fV#$nhVPL'eVZ3RoW;`drW!]H"VPU,bVP^2cU]-qjU7n9RTV).RrLa+_!hl9\rh9If
+TV)4TpR_GWrgj(\s.B%Y"/2H`U]-t_U]7.iU]%"fU\pqdV#[=jV>d7iV"g_bU@Y/[V#-qcV>[:g
+VuEXiWV<FlWVNRmWrT7#XoGR&Xo>L'YPtd+Yl_8=[/IB8[^WcW\c0/D]=bei]tXK\&Ac<)b0JDb
+f\>BIl0e*7qYo:M,IXM6Mi+=2]q(.3HEG#POgn[q=,g6`SY)i`>$kQ=YH4q1YkbI&Nr4n6N;eb8
+MZ&D3M#W80L5Q!R]s4ZUmCCNVZF79JX0]%7ZaI?V]#M[u\$i]PZECI8Y5YX!Y$6U7Ll%"JNK0'^
+P*D5tR$jG6SXuLJUSOcbW2co#Y-5(8ZaI6N\[oGe^;%M$_o9X:aND]McHaeadaZdtf@\d1gYL]B
+i8ESSj5f=akNM0plKdg'mI'H3nF?MK!V>s_p&Facp\jmeq>^<hqu-HkrU^#>s+13os*t~>
+JcC<$L]?uFrVc]mr;6Njs7uWg!r)E^rq-<aoD\;VnaQ#9md9B-lg!a!kiV$hjQ#7Yi8<AHgtLK7
+f@JI$da?Fec-4AQaN)9<_SX+']tCqe\@/fOZEUO7XK&7tVkp2`Tq@pHRoER"Bl8'Dqgn6gqgnZq
+s*k#tp3l^`q0W$cs*G`!B4kUaB4t+<I<p6cG^"=SFEDSCE,BE-CMS!5rH%mYrJq/C8t9X:KR<WE
+rdF]l!.4]m!.FWipjN*irdXoro7-^hrdt0&rIb0)re:K0L55_^qhP$(s,$f7pPK!0MYr;2MYr>2
+L^T&qLkgb?LPLV=Kn]GZrJ1?-"G__dKnT5Tre:N1L5(K^L&d#)LB!&)LAZi,M#2u,LAZi*M#`A2
+M#iEfrJ1K2M#E21MY;l,M#N/0M"uo*MuSb7MuJ\2NW4t;MuSY7Mti52NW"n5O8k=?Oo:@COckn*
+PQ$gHQ2d0MPlR-JQiE?UQ^F//S"-#JRi\,nU84]eXfo(@]"c/'bg=npiofXso_81Yr;?Nlrp0S.
+Q&U??H&7?AJTu'HL5pUuQ:sY9D+REIH%/O`;Gg2HLkpi]K`I/2NVe\6MuS\5M>rD3L]3%nrtbS0
+p[n"DlfdHihqZl8e'Q@\a2Ps4^](qG]El3b^VI\&_o'Fj`VdaT`V@IPa8O'lai_fNcHt"hf\50>
+jQGn!o_JI^s!.16e<uM]R^nTNP`(T`N/N^TMiNm^OcbuqO,f3WM26k@KS9>YpOlb)L5:\DN/`jY
+OckroQC+)0S=Q7ETqeE\Vl6VrXfek3ZEpsI\%0)_]tV7t_Sa@4aN2NIbg+M\dF-Oof%8R-g=tH>
+hVd>Nj5]4^k3(sml0@U$m-X60n*olHncA@Srq6<bs7cKes7u]kr;6HjrVc?eJcC<$bl<1~>
+JcC<$L]?uFrVc]mr;6Njs7uWg!r)E^rq-<aoD\;VnaQ#9md9B-lg!a!kiV$hjQ#7Yi8<AHgtLK7
+f@JI$da?Fec-4AQaN)9<_SX+']tCqe\@/fOZEUO7XK&7tVkp2`Tq@pHRmoqB9M\J]qbci\p/1`c
+s&&)Yqbd>j)Dj3*0/>=>2`3rg5<q=o4Zkki4$,G_2E!ELrAjp?rB1*A#u=8j:/<619i4ja<;]Z!
+;H$Oo<E)rr;u]hr;uBSr;cH]p<;T\q<rZ1s<WH/!<:a,i<rZ8#<W,tr<W,r'<E<+"<)cjtr_ru"
+<`W<$<WZ?)=T2D#<WlK(<)clq<Wc?$<)`Znr)N\rr`/ttq,IJs=',B%r)Wl#qcEYq!*/horD`hs
+r)E_rq,IDor_ir!<E<+!r`&qtq,RGor`/nus&B5'='&F&<r5tr<rQ2"<r5tj=SGtu>5)2">5_\'
+>5qh)>lS+.>QA"-=ohi2r`fD+!*fG-s'>Y0=Bes5>[CcG@q0(`BkqR*FEr:dLldplTr+rs['mKU
+]">Yj^r""-`l?'?aN;WMcHab`daHUn>?Fd!;,gFs91D9:6:O:"8h)&84"W0W6q0'm3]]9"<)E<d
+!06u:qi(N4s,-c3s+p]1reCI1!T;r9i[*R@hqd#<e'Q=Y^q-nUWMH/UQ'.,aKn=f%H?XIOE,99&
+B4YXbral(@#\RjeCi400E,b>e"EJR)EcV/!s)S-Zr,=]:EcQ5DG^=dfK85DJQ(+JFXL#FM_T.\5
+H!OQS>@pr<<``:$<`E+#=B8F(<`W:)='/I&<)Z^l:Jh$fpJ>(JL5:\DN/`jYOckroQC+)0S=Q7E
+TqeE\Vl6VrXfek3ZEpsI\%0)_]tV7t_Sa@4aN2NIbg+M\dF-Oof%8R-g=tH>hVd>Nj5]4^k3(sm
+l0@U$m-X60n*olHncA@Srq6<bs7cKes7u]kr;6HjrVc?eJcC<$bl<1~>
+JcC<$LB$lErVc`nr;6Kis7uZhs7ZNerq6<`"S;3TnaQPH8ac!4lg!a!ki_*ijQ#7Yi8<DIgtLK7
+f@JL%da?FecHOJSaN)9<_ns4(]tCtf\@/fOZEUO7XK&7uVkp2`Tq@pHRq-,RGCl"PSai<GSH,2X
+S,\rWR0K%FQ^3r&Q2?gGPP((]N/E=@Ll%!rUnjo^U7\$KTq%U@Q^*_rOGo*aR@'A0S,SodS\;_N
+^:f,[PC/=NOSt=6OT(C?O8tF@OSk7>P5LLDPl6jOQ^F,,R$X0=R/WNRRfAi[S=Q7DT`1VbUACYa
+U]R<eV#."fV?*TlrhfmrVl6PnrMoms"K85rVPa?j"fA,jTq\:\U&UbcTDY8\TDbG]U&LbdU&L\a
+T)5/ZTE(S_SH,8\TDG5[U&UkeU]-tgUSRmar1j=fr1s@fs.oIerMKOhrhKLhrM0Ces.]RiqkF.e
+rM0@fr1X7gV5=*eqPX@lq5O:lr2K^rs/Gjp!3?("riQ+$s/l:'s0)F+"0o2>[/@<5\%'!I])TGB
+]b.un^qmq-aNW#^gYh/UmIU,PfDd)T\=/VHLo[\eR#-3YVq7'.GufNEP#Y_UUfgl(?X$^:XKSc#
+Y5jU]NVe\6MuS\5M>rD3L]<*druf%^Ye&K"_Srmi\?r<AYd(I>\@]Do`4NLc[^NHEXg"r,YP52$
+KSG5;M2R=PO-#NfPa.T&R@B_<T:r!SUo(&hWiN8)Yd(OA[C3TU]=bhl^qmn+`Q$!@b0/&TcdC.h
+eCE.%f\5'7h;-uHi8WeWjlY^gkiq?tm-O--rpL'\nac8BoCW%Ts7QHerV6EgrqcQirVZWmoDX=@
+JcF!pJ,~>
+JcC<$LB$lErVc`nr;6Kis7uZhs7ZNerq6<`"S;3TnaQPH8ac!4lg!a!ki_*ijQ#7Yi8<DIgtLK7
+f@JL%da?FecHOJSaN)9<_ns4(]tCtf\@/fOZEUO7XK&7uVkp2`Tq@pHRois.CN4UnJan?hJc(&u
+J,XolIJJ9dHi89jHNRqn@UT1J%T.V#I!L$^F`qtOF)l5<rbVUL!-8'\&T`&8FE;PbNfT6]@WQm8
+G^Ff6I/eWjI/\QkI/JBmI/JElIf4crIf4crJGaltJ:INJ!eGrTre(6(re:B,r.k<,qhP')s+p`5
+r/:N2rJLZ5rJCN2!Ju^5M>`8-LB*)-K`Hl)L\ur3LPCP;KS92UrJ(?+rJ(?-r.Y6-LAlu-L'!-b
+LAco*M#2u-LB!&+M#W>1MZ8P4L]N?grJCQ3oniX'q2#*/rJU]7rep]5s,Ho9rf$f6qMbH6rf6o;
+qiCf?qN(`?P5CIBPl?sJQ3*>;QMm-qQC+&-R@9V8SXl@FU84`iYdM!R_8a^If%]-Bjlu.%p%\F^
+roF))Z]p2lJ9d'1OFD7eGClf:HsoKRA8Oh1H[SX`9i=b_M2-h?L%p<$Nr=t7N;eb8MZ&D3M#W81
+L@,!YrVH9\na>`,jl51Rf[eKtbfRoE_nj+$^:jNY#edse^qmn)_o2Mmqo8WSqSrQUrlFuY&^/GF
+d*gIsg"bKEk3DC*pA4d_s!$@bS<K/&Vim@4NfT9^MN3XTNK93aP*VJsO,]*ULk^Y>LAlo#K`?d+
+Ll%%KNK90aP*D5uR$jG6StD^NUSOcbWN*#$Y->1;['d?P\\#Mf^VI\&`5Ta;ai_fOcHjnce'uq!
+f@\g2gtgfDi8EVTj5oFckNM0plg4!*mf)YZnF?)?oCMVRp&F^cp\jmeq>U6gqu-HkrU^#>s+13p
+s*t~>
+JcC<$LB$lErVc`nr;6Kis7uZhs7ZNerq6<`"S;3TnaQPH8ac!4lg!a!ki_*ijQ#7Yi8<DIgtLK7
+f@JL%da?FecHOJSaN)9<_ns4(]tCtf\@/fOZEUO7XK&7uVkp2`Tq@pHRn#qA:/=[[;=RQX;>a>l
+;=.3V;?'Mr1,1L;r\F[75sR_#r]L`R5!1ng3]T,W2`3HR4?EC%!B`IB:'XKH5#+pR;cEHjqc!Mo
+r`&qtpf$odqc3Yss&B)#=8c2"<W5ti<W?)&=&r@%<W6%s<W,tr<<H9%<`T,us&B)#=8l8#<rc;"
+=8Z,!;ufqq<WH/!<<#ks<;T\n<WuK&<E3!tqGdMrr`B)"s&T8(='5H&r`B)"!*/tus&8turD`Ag
+r`9"us&8qss&T%trDrkss&Att!*9)#!EN5!<rZ/"<r5tr<rZ8"<WH8$=7TJa=TMW-qcWu(r`]>)
+s'#D+r*05-rETA,s&oJ.>$Co0!*];*s'>Y0s'6jU?t3b\Bl%^-Fa8FgLQ%:YR@^4RY-GCF]=u"o
+^qmq,`Q#staYM#^bg"DXcHjkbdaQ^reRr)c;c-Fm<E;[\6Tm_25WCSJ1HRZM0LnVm2)[HS3E&jS
+;"mfeNr=t7N;eb8MZ&D3M#W81L&g33iZmF?hqd#<e'Q=Z_7R(WWhc;WQBI5bL4Xo'H?XIOE,99&
+B4h'QralCJBkhI%Df9UbE<(%WF8p:[F8g4[E;so7EcZ;DFa/4[It<?3O->s%U8b?(]>)8)c-W5/
+Lg4+b>$t<1<``@'<`<%!=BAL'=B8L*=T2A#;Z]in;#X>d:fi=)L5:\EN/`m[P*2&pQ^F21S=Z@H
+U8+N]Vl?\sXfen5Za@-K\@K5a]t_A!_SjF5aN;TJc-FY_dF6Uqf%8R.g>(N?hr*GPj5]7`k3(sm
+l0I^&mI'uB#4V0Ro(2JFrq6<b!;HHes7uZjr;6HjrVc?eJcC<$c2W:~>
+JcC<$LB$lErVc`nqtpEis7uWg!r)E^rq-<aoD\;TnaQ#9md9B-lg!`ukN:pfj5]+Vi83;FgY1?4
+f@AC"dEp4bbfe/Ma2Z*9_SEq#]Xt_a[^EHIYck11X/`+rV50iZT:VQ\@;9q4MOa@1nXfTJrLEeT
+s-`tVR/WHPQ2m3HPlHsBOs#dALkCM>MI0ehVP9iZTUqgIS"#k3OcYWaN0fp"R@9WCS-ZjB^:qA*
+R<sVdOSk77OSt:AOT(==OSb1;P5^[FPl6jMQ^F/.RJ`ESR@9P4rgO%]St;RIr1O+br1j.brM9Ol
+V>d@gVuN^sX/u9##-+Z$Vl6MkrhostV5'cZr1O=fT:V[HT:c+Ur1OCjTqS-PT:_^Hqk*k\s.B=_
+s.B:`qP!q`rhKIes.oXhq5!tc"/M]fV#I1jVu!7jV>I(gU]7.hUB@<eUSRj`r1s=es.fXirLsFi
+V5:&erMKLjrM]Rlr2TXnpSn4oriH+$rN?1(qlTq&ricL0ZF%";[Kj:O\@K/]]"@sTs1SuY_Sa@5
+bKn\li8j4mpAEA=,dsV9Nf'^5XIkZ,HEOoVKoph3<K's^Un+;b>Zk?:=g"s3Y-@])!06u:r/CW5
+s,-c3s+g`3L5(Tc+O%@'Z-V+:b.+[c[]Zj>Z`pdG\\5bt_76q_['m9CZEF21p9%hWL51SAMi<[W
+OHPfmQ'[l,S"6.CTq\?ZVl-MoXKA\1Z*UgG\%&u\]Y;.r_Sa=2a2lBGbg"GZdF-Lne^rF+g=tE=
+hV[8MioB+]k2tmll0@U$m-X60n*ol;o()DEo`"Lbp@n=[q#C0iqYU0hr;HTcrdk*#s3:Ro~>
+JcC<$LB$lErVc`nqtpEis7uWg!r)E^rq-<aoD\;TnaQ#9md9B-lg!`ukN:pfj5]+Vi83;FgY1?4
+f@AC"dEp4bbfe/Ma2Z*9_SEq#]Xt_a[^EHIYck11X/`+rV50iZT:VQR=^Yo\Fb9:;nUgXhr.+fs
+rdOWj!.=corI"Efs*>K.Bk:jbAnP^P:jm\9H$FITGB7kIEH#gpC]nNpF*2X(F:3/4FcVQDO,f]U
+D0>i)qgA?jqgA<ir-\HkrI"QlrdOirs*jrsrIFirrI=p"JGt0#KDpQ(L&Qi(LB*)+L]3,/M>iD0
+MZAY2MZAY6M$&WnMMhCk"H&%mLku"b!f2Vere:B,qhP**re:E,re13'r.b6*rJ(<,!/CB+",M_e
+LAH]&L]WEhL]3)3LPCS>qhP6/r/16*re^`7MYi81M?/Wmq2,-/!Ju^3MZA_8MuSb5NVnh5NW"h9
+NVeb7O8=t9O8k:COckn(PQ-mIQ2?mGQQhfbR[T_8S=Z@GTqeNdYdV-Y`QQZ\hW!\^lgF<8pA"O`
+ro!f$QAgHDG`.E7JpM?LKoCS"E+3'@Ce.3HH$i@]9MnS]Lkpe>pOiO,r/LW5repf6rJCQ1!f)Mb
+nGaC)qtKdRmH`utinrMCf$_phb/_H<_8!^u^&GYM]tV7s_8=(,`;R[M`r=$Y`rF*ZaSX*Yaq;kC
+cd:+if@es:ioTCknauVTo`#Epq4X(;PGFt=R#m>iO,X'ts,ISOP*2#pOcYT_Mi!4CLP5Y\on6_-
+LPUeFN/is\P*;/rQ^F52SXuIIU84W`Vl?\tXfnt6Za@0M\@K5a^;%J#_o0O7aN;WLc-FY_daQ^r
+f@S^0gYCWAhr*JQj5f=ak32'olKdg'mI'H3nF?&>o(2MGrq-?dp\4X]s7u]kqtpBjrVc?eJcC<$
+c2W:~>
+JcC<$LB$lErVc`nqtpEis7uWg!r)E^rq-<aoD\;SnaQ#9md9B-lg!`ukN:pfj5]+Vi83;FgY1?4
+f@AC"dEp4bbfe/Ma2Z*9_SEq#]Xt_a[^EHIYck11X/`+rV50iZT:VQC7nZQP;"RWT;YEuc;ZBV^
+;#4#k1bpd=r\G6H2*jJl5<_1n5!(ng4#o;Z2E*KSr&ag=#Z"/i:/+>M:f73jpJh&h!*&kr!*&en
+oi1ih$!(&*<)lq!='&H%<W?%i<<-(u<<H9'<`],urDrhrr`8nrrDrr"r`08*=BAR)=&rB$<Vohs
+<W?#";cH`n<W#ns;ufqt<;KVm<X_u0=BAR)<`N1%=&rAs<W5tf<W?,!<=2]*<E)t!<`N.#<rH,"
+=9)D$<<-"t<W6#!=8l5'=&r=$<r5tt<r#hs=9)Fr=92Q,nQGim!EiV)=TDS%=oV\&>Q7t->Q7t*
+>6%k)>Pq_+?2e.T?X[DSB5DI)FaAUnN/j*fR@g7PX08k=\\5bn_Sa:0`Q#s?rlP5arlk>cs3:_m
+d*^8>dKS$&=]/'pr`'q17mf[16UEpo/h8>4/hfgc7Q<4^3]T3"<)QOhpe_$Or/LW5repf6rJCQ1
+.#3P3io/kSh:gK0dEKVH]<n`@V4a<DP)bBRJq&/oGB@kEChm]sAnLsPs(2LKBkhI$Df9UcEW:(Q
+F8p7\EW1"XF"qcZGC"XcJVAo>P*VQ0VQ@)4]YMM/cI17qgQ\@9>$>'8=B8I&<`W:%<E<4'<E*""
+r`9A+=&r=!;c-@fr_`Ac@>'AjLl%%KNfT9bPEhE"R$sM8StD^NUnsueWN*&%YHY:<['mHR\\#Mg
+^VI_(`5Td<aihoQcHjnde'uq"f@em4gtgiEi8N\UjQ5Odkiq?slg4!*mdKW6naZ2@oCV\So`Fj]
+p\jmeq>^<gqu6NlrU^#>s+13ps*t~>
+JcC<$L&^cDrVc`nr;6Njs7uWgs7ZNerq0.\oCMPDnaQ#9md9B-lg!a!kN:pgj5].Wi83;GgY1?5
+f@AC"dF$:cc-+8NaMu3:_SEq#]Xt_a[^EHIYct:4X/`+rV50iZT:VQ`AT;pGOoCsFSai<KSc##V
+S,\o^R@'A.Q^3r&q3:oCqN;t[MhZkAM2P`9V5L&\TqIsKSXZ(6PEM)jMjTp#R$jG5rL=2-^:h4o
+D:3WZQ2QgBOTgi/OcYZerK.#@!0I)=rfI#>!KrZFP5gaEPl?pNQC!u,RJ`EPRJiTSRg#=RStD[L
+rh9FeUA^kaV#."gVY[4jVu`ltri?F.XK/A%WMlbnVu3IqVPKu^rhBCcs.KCarLj1arM':b"JDBZ
+St>hO"JMK^TqMCWrh0%[!MZ@gV#R4iV#@%gV#I.gV#@.iV#@+iVZ!FlVZ3IsUnso`Una^`V#R:k
+V#7%hVZ!=iV>d@iU][HjVPjBir29Ros/>goqPsImpo=@ps/c4%s/u@)s02=&s0)[3Za@-J[f3`A
+\@K/]]=bhj^AbkU_SjI9c-b+siTKY&rQkKioYmJhQ&2H>Vj`TnR&AT%NfR=a=--EbSY;ud>%(`A
+XKJb/Xg%T(s,R&;r/CW5s,-c3s+g`3L5(Tc,/:Le`8nVS]X#&WZECO>Z*h*O]YMS+\[JlQ[Bd!?
+Y-"n2p9%YQKnbA>MMmFRO-,ThQ'Rf*R[]k>TV8-VV5L8lX0&M-Yd1UC[^WfY]Y(tn_8=+/`lH0C
+bKS8Wd*^:keCN7(g"P3:h;7)JiT&tZjlYail07L!m-O--n*fc9rpg*]o`"O`pAamdq#C0hqY^6h
+r;HTcrdk*#s3CXp~>
+JcC<$L&^cDrVc`nr;6Njs7uWgs7ZNerq0.\oCMPDnaQ#9md9B-lg!a!kN:pgj5].Wi83;GgY1?5
+f@AC"dF$:cc-+8NaMu3:_SEq#]Xt_a[^EHIYct:4X/`+rV50iZT:VQU?"RhkHiAWiJan?hJc(&u
+J,auhIJnQgHS/uDART4`BMa&'I!Ks]G'/"OF)l2:DJa3(F*)MHF*)PHFEM_eO,f9]<h3uGI/\Ki
+I/A?jI/A?kI/JEkI/A<lIf=irIfFoqJH(,tJGt-"K)UE&K`6]*L@g9"M#W>3MY`52N;SV6Munop
+M>iA8Mi*CMN;eb7M>E#.L]3#/LPGb_qhP?0L5(E]K`-W(LB!&,LAll-L55b_nV@.#s+^W2M>W20
+LB*/0L]</3LPUfbMYN&.MZ/P2M?AcoMi7Rls,6i5s,-r9Mi@Um$B0n$N/WaUNfK*YoT&j/r/U`:
+qiCi@OSt7?O8tFBP5CIBPQ7!JQ2m9MQN*9oR$jD4S=?"=T:r$WWNED5]u/%Bg#(iRm-sW>p%S:Z
+rS7E!_jlO6J9d!/LOaSaGCul=DJi$M88^pkH[:0::/XqbM2@"BKSK8Ts,R&;r/CW5s,-c3s+g`3
+L5,@#(&e%(p%%P:kiLd\gY(0+d*0VP`5BFj^&YkG]El3b^VI\%_Sa=k`V7CMa8X0[ao'<\b7VtD
+d*^=mf@o$:iT04gn+6;NnGacujI;BsR];U@Oc>KaN/WdVNK90`PEV<!OH,9YMMR"AKS5&5p4Q\'
+KnbA>MMmFRO-,ThQ'Rf*R[]k>TV8-VV5L8lX0&M-Yd1UC[^WfY]Y(tn_8=+/`lH0CbKS8Wd*^:k
+eCN7(g"P3:h;7)JiT&tZjlYail07L!m-O--n*fc9rpg*]o`"O`pAamdq#C0hqY^6hr;HTcrdk*#
+s3CXp~>
+JcC<$L&^cDrVc`nr;6Njs7uWgs7ZNerq0.\oCMPDnaQ#9md9B-lg!a!kN:pgj5].Wi83;GgY1?5
+f@AC"dF$:cc-+8NaMu3:_SEq#]Xt_a[^EHIYct:4X/`+rV50iZT:VQC7S6BN;#XAc;=RQX;>jDl
+;=79Y;#iEO0`Ej32*jPn5X,01"["k/4$#A#2ZPc849mr/4?GYe4?WU<s%NYH928;^;Z9Vg<<#ns
+<;ol(<)lpt<)Z^p;cENl!*/tsqGmPpr`/u"r`'/%;c?Xq<E/iqrDWer<;okt<rQ2!<W,r#<E)su
+r)Nesqc3GmqcEeur`/_o!``3!qc3Mo"'&<"<W5tq<<6-#r)O#%<``=%<EB*!s&K/#<;BPm<:s8h
+<rQ+q<rZ/&<``@'=8l>%<ruE&<W#nt=8l5#=8l8#=8l7m=8uD&=o2=k=o2>$=8l>$=oVV'=oV\*
+>Q.n-=ohi4r`fD-pKRT$.:$1`?!^oH@Uit^CN+EBJVT5IQC4><Uo:>sZa[KW^;.V(`Q#p<aN;R'
+b5TTabl>iib0.uPc-?75!71Vj,\g[f<)Z[r<`)FZ6p3k45rCPM1+G@;0LeK"2`<ZW3E9'W;,I!a
+s,R&;r/CW5s,-c3s+hhRL5+R>f[S?o`k]0mY,\=lS<oG"MM?_4I!KpXEc5c0B`;WAAcH?IB5)*s
+D/X?3qf2XVqJlLTs)\-\"*8R*F8^.XF!YpNG'J@]IXm',Mia3kSti9f[(3oga3;r[e_/a7iM_Zh
+?<UH8r`:%<<E<+#<)lt$<E3+&='/R+<`N1!<Duaj:Jk!_:gAX,L51VCMi<[WOckonQC+)/S"6.D
+TqeE[Vl6VrXf\e2ZEpsI\%0)_]Y;.s_Sa@4a2lEHbg+M\dF-Oof%8R-g=tH>hVd>Nj5]4^k3(sm
+l0@U$m-X60n*olHncA@Srq6<bs7cNfs7uZjr;6HjrVc?eJcC<$cMrC~>
+JcC<$L&^cDrVc`nqtpEis7uZhs7ZNerq6<`:\4/JnaQ#9md9B-lg!a!kiV$hjQ#7Yi8<AHgY1?5
+f@JI#da?Cdc-+8OaMu3:_SO"$]Xt_a[^EKKZ*:C5X/`+rV50iZT:VQ\C3OuZS,JrSSc>5ZSarBK
+Sc"udS",t;R[TY3R$X,)Q2-[DP9c<TP*1f`LP1J@N*g(jVkTl\U7e0NS!o\/P)tcbN0p$$R[flG
+S-kk$^:h71Q?I\;Oo1=7OoLOAOT:L>NrY:?OoCOCPQ-gGPPpaEQ2d3NQiNQPR/`TQRLYgWSXuFF
+Tq\<WU8+KZU\^eaV>d@lVuN^qVuN[rWi>ruriQ4$s/H1"Vl6QnWW/muVkp3gUB@6aU7qIW!29=b
+r1WnX!20:aqk3t_!2B@as.TXkUnjc\r1s4br1s7ep8.keV#I1jVYm4iV>@(gV#[ClV#dHirh]^o
+VZ*FlVZ*FhVZ3RoW;*@fWr&dpWrB'tXT#@$XoP[)YQM)5YHRl.s02j8ZaI6M\%&uZrjifU]Y2%o
+^qde'`Q--Idam12k3r'Dbl8ouW1&m.^T"3)QABjn]r$dnJmaCoQ;q.ZToN>]?<g^<XK\f"YQ'X]
+NVnb7MuS\5M>rA4LPC]d,/1Lk_Y_Kp`4!1e[BR!CZF.0P]YDJ)^ppe]\$<-<Ycb15or_AKKnbD?
+MN!OUO-,TiQ'Rf*S"-(ATV8-VVPgDnX0&P/Z*L^D[^`lZ]Y2(q_8=.0`lQ9EbK\>Yd*^=le^i@)
+g=k?<h;@/KioB(\k2tjjl07O#m-X6?mfr:Oo()DDo`"O`p&Ojcq#C0iqYU0hr;?Ncrdk*#s3CXp~>
+JcC<$L&^cDrVc`nqtpEis7uZhs7ZNerq6<`:\4/JnaQ#9md9B-lg!a!kiV$hjQ#7Yi8<AHgY1?5
+f@JI#da?Cdc-+8OaMu3:_SO"$]Xt_a[^EKKZ*:C5X/`+rV50iZT:VQT?taG"JGk)qJcC9"Jae9h
+Jc(&uJ,auiIJnQlHR!obHYI)&@V9=e:f)LdH$F^]G'A(LF)Z&8Ci!j$F`_bIFEIJ(!HaA$NsK$7
+BQ&-DI!^5<I/SHpIXQYCI//0jI/\NsIXQWlI/86mIXckHIfFooJ,k)tJH(2uK)UH'L&Qi*LB*/+
+L]*#/M>iD4MuSb9MuJY;Mi<UQreq;EMMd=NMi*CMN/`dSMuJS6M>W/5LPCV?L5,V]reL]6Lkgb?
+q1\j'reLK-"c%hdKnbB^LA?W)LAHZ.LkgbAM>2o,LBWKjLkgeCpko$,s,-Z2reg3're^]6rJ^`8
+oSrp2rJpo;rJp`8r/go?!0@,@s,m;Dqih#Dr0IAL!1<bP+IJUeS=Q4@SY)UNVQ-c'[_'H#eD&sF
+lgOE:pA"L]qu5:K-'jRFI!M'8MM$7rC5Iq%EdqOmASlEW9R;#':/4Y`:Pjm`KnkEXK`@)2NVnb7
+MuS\5M>rA4LPGR')?0O.p@@\=kiLd\gXt$(ccaGM`5BF+^:q;[]F;Kf^VI\%_o'F2`Q#po`;mpU
+a8a6\ao9E`bKBe,'?n_Hd*^=lf@o'<ioTCin+-2JrU0\/j6W5!PFBI]QBmVoOcGB\NK0']P*2&r
+R$!JiN/WOIKSKJ[on6D!KnbD?MN!OUO-,TiQ'Rf*S"-(ATV8-VVPgDnX0&P/Z*L^D[^`lZ]Y2(q
+_8=.0`lQ9EbK\>Yd*^=le^i@)g=k?<h;@/KioB(\k2tjjl07O#m-X6?mfr:Oo()DDo`"O`p&Ojc
+q#C0iqYU0hr;?Ncrdk*#s3CXp~>
+JcC<$L&^cDrVc`nqtpEis7uZhs7ZNerq6<`:\4/JnaQ#9md9B-lg!a!kiV$hjQ#7Yi8<AHgY1?5
+f@JI#da?Cdc-+8OaMu3:_SO"$]Xt_a[^EKKZ*:C5X/`+rV50iZT:VQC8PMrU;>jDg;?'Jl;=IKY
+;>a>l;=79[;%#390JG:=1c@6W5=#33'0SN@4?>M`2`EWR2Ea2c4$5Se48q>J:/+JY.mHg*;uBPm
+;uBSp<W5r!;cH`q<W?%t<W?"o;uouur`/tts&B&"rDihrrD`hur`&qtr_rbp"'&B&<W#hr;ZTit
+qc<\rr`0&"<;ont<rZ7q<Vohq=8uA(=&i8s<WH/!<r,hl<q]Pm<Wc?&<E9$!"'8K&<rQ+u<X)Q'
+<)lpt<;T\q<;0D^<rQ/#<rH,"=Sl2!<r?%t<WH5"<rZ8"<r?&!=RTAm>5VP%=Sl2!=Sl8$>5qh+
+>lS"2>$G6:>Q.n(>Q.n,?2n4V?!LZB@:NhZBPVO.H@^m4Q'e)7USb&nYHkXJ]YD;#_o9X9aSj3^
+b/qd)apcD5a2l<AaN2KGb0A00c2Z'8cd5p";G^=p<E;db7RTU36U3X`-o*nG/MT[^5rLV]3]^5=
+;G[!`s,R&;r/CW5s,-c3s+h\NL=O_s`k]0mY,eFnS<oG$Mhcq8I!U!XEc,].B`;WBAc?9HB5)*s
+D/X?3r,M^Vqf2RT!crI*rcS3^rcA*[rcA*]s)g>HH@:6nKSYSIPF%c4VQ@&3]>2D.cdUFrg>1ZE
+i8M1nN*BLf>\R8A<`W:%<`W4#=B8C'=]ea,=T2>+<)Q[m;,C+eoh\_BKnbD?MN!OUO-,TiQ'Rf*
+S"-(ATV8-VVPgDnX0&P/Z*L^D[^`lZ]Y2(q_8=.0`lQ9EbK\>Yd*^=le^i@)g=k?<h;@/KioB(\
+k2tjjl07O#m-X6?mfr:Oo()DDo`"O`p&Ojcq#C0iqYU0hr;?Ncrdk*#s3CXp~>
+JcC<$K`C]DrVc]mr;6Njs7uWg!r)E^rq-<aoD\;SnaQ#9md9B-lfmZtkN:mej5T%Uhqm2Eg=k32
+f$r3tdEp1`bfe,L`l5m5_8!^s]=PP^[^<BGYcb+/Wi2hlUnXQTSn;SQFb#RESc55VSc,)WSb8TN
+SbnodS"-"<S!oe6R$a5+QBhH6!1!MI,*S7TPELi]K8>DCNF8QZVkToZTV%dER[TJ)P)tfcQ^F//
+qO@i)^:h1md[kc=rfR2AoT9-8r/h&BO,s:%!frG*rK?r>s-*PLPl-dMQC+&-R@*r@rL3bU"e;-S
+StD_SU\pqfV>m@hV>d@kVZ<[pVuN^sWiPos)m$*?WMleqWiE"sW2QPhUnjc]U8"<RTqS-QU&:Y_
+U&L_`T)bP`U&UheU&L_bT`Um\U&LbdU&:VfUnsl_U\pqcU\pqfU]%%hVuNUkV?!OmV?*NjqkX:i
+rho=as/5jns/,pqV5='ds/,mrVu<RmWV<FjWW&ptX8T.!XoGR'YQ(j,YPYR'Ym7VB['d?O\@MOK
+'>2#m^qmn)_o9^@d*pY%hra:trlP0cbb:DiLT7>PT9=YlVq@<!TV>:aN)s5]SYTIo>$bK<Y,ne.
+YkG7#Nr=t8N;nh8MZ/J4M#W51L5Z'Ud(6]sho`gU\[T,YYd:X@[(*ZX_8OC2\@8oS[BQg=Y-5&%
+Y%!$:L5(M@Mi<XVOHPckQ'[l,S"-(BTq\?YVPgDnXKAY0Z*UgG[^`l[]Y2(q_Sa=2a2lBGbK\>Y
+dF-Lne^rF+g=tE=hV[8MioB+]k2tjkl0@U$m-X60n*ol;o()DEo`"Lbp@n=[q#C0iqYU0hr;HTc
+rdk*#s3L^q~>
+JcC<$K`C]DrVc]mr;6Njs7uWg!r)E^rq-<aoD\;SnaQ#9md9B-lfmZtkN:mej5T%Uhqm2Eg=k32
+f$r3tdEp1`bfe,L`l5m5_8!^s]=PP^[^<BGYcb+/Wi2hlUnXQTSlf90C2eKMJc:8sJc1,tJan?i
+JHLFRJ:RWKs*jTgrHnTlrd4uuBP(^cB4u!Vrd5B)H?aUWF`VSEE,TW1D/+*3F*)O$FoII%N<Z,+
+Cit,RIJS?jIJnWmI.i!gIfFfrI//0jIf=fuIXckDJ,t4Or.4ct#(qS^KnY89rJ1?-"G_ehLPPha
+!/^]4regc8rep`6s,Hr8"H/4sN/[ao$B:(*Mi<RQMi*@JreUT0!f2VdqhP**s+gT.rIk?.LPCQ_
+L]3#0LPCQ]LB*)+LBE?fLPGb_!JlO&M#N/6Ll%"HM2I2hMuJV5M#`G1MZA_2MuS\3MZA_6MZAY6
+MuJ\8NV/>1NVnh8O8b7<O8P(>Oo:@BOcoU*rKR>IrK[GMrKnapR$jG7StDUGT:r'ZXKJh9]"uP<
+gYq>]mdp,Gq>1!drR_&Qoq%"lJU.6O*J&TUG_2i=E-R(&7;YUjI<g389MA;[:5Oa]L51KWKE.&2
+NVnb8MuJV5M>rD3LB*)+ru(h6q"F=JmHNcmi8!#9da-.Z`l5j2^V7Fqrk&QN^;%J"_8F40`W!mS
+`W*sVa8a3bai_cLbKS30bQ#fdbn8:KdF6Xtg>1ZGjlu+!o(MnWlMi+)U6h10WgK-AOcPWcN/s!Z
+OHG]gPEqT#O,o9ZM2-h@KS>-QKOTReL5(M@Mi<XVOHPckQ'[l,S"-(BTq\?YVPgDnXKAY0Z*UgG
+[^`l[]Y2(q_Sa=2a2lBGbK\>YdF-Lne^rF+g=tE=hV[8MioB+]k2tjkl0@U$m-X60n*ol;o()DE
+o`"Lbp@n=[q#C0iqYU0hr;HTcrdk*#s3L^q~>
+JcC<$K`C]DrVc]mr;6Njs7uWg!r)E^rq-<aoD\;PnaQ#9md9B-lfmZtkN:mej5T%Uhqm2Eg=k32
+f$r3tdEp1`bfe,L`l5m5_8!^s]=PP^[^<BGYcb+/Wi2hlUnXQTSjl4D9Mk^cr_iPhrD<GinP]-Z
+r)3PlnPK0]!\uJ`r\OR3#=1[@5X%=o55dPN3B/rU2`Ei^4?GYerB(*B:Amlh=@Z+`q,75krD`br
+r)<YrrDWbsqc*Pp!*&_nr`9&!r)E\rs&T/"!`W)srDWl!<`W5u<;f_q<W#nt<<6'!r`8ttr`0)%
+<`JiorDresr`B5'<`f3"rD`huqGm>ls&K&!rDa&&=&r@%<EB*!q,Ri&<`W4"<)lt!<E/]ms&Anr
+qc<_sr)WYqs&T)"s&eqqr)WVpr`8qus&]8(r`K)$r`K&#s'#G*rE/qus&K,$qcEu(>$>-7r*95*
+r*05*qcj&)"'o5??i=:W?t*YXAnYmrEd<1jNKTWtTVJB`X0/_8\@TAh_Sa=2`lH3CaN4>#"NJF!
+`5DPjs2+rXa2lC%b5]Wbbl5j5Tj(Vu;GpLp;bBSK5!`"22E=#H-Ts+;8Ol912)@6R3E/sT;H!3c
+!07#;r/CZ6reg]3s+p]1(l#i;['$I-Tq.R8OGemHJ:)ZdFE)58C1mNXrFPt?#A7acCi+*/E;X_T
+Er0kTErU1\FSg4XF8g:\FW5ONI"-^"LPq1UQC=GBWN`b@^Vn4=daZn%gu&+hs5F";,d3kC>[1E?
+:fgb!<``=&<E3.&<E3.'<`iF(=&r@$;H$@f;,R!_@Y9>gL5:\EN/`m[P*2&pQ^F52S=Z@HU84T^
+Vl?\tXfen5Za@0L\@K5a]t_A"_o0O7aN;WKc-FY_daQ^rf@S^0gYCWAhr*JQj5f=ak3)!nlKdg'
+mI'H3nF?&>o(2MGrq-?dp\4X]s7u]kqtpBjrVc?eJcC<$ci8L~>
+JcC<$K`CZCrVc`nr;6Kis7uZhs7ZNerq0+[oCMPDnaQ#9md9B-lg!`ukN:pfj5]+Vi83;FgY1?4
+f%&9udEp1abfe,La2Q!6_8!au]XkY_[^<BGYcb+/Wi2hlUnXQTSmc>YH\RlWrga%\pmqARs./bQ
+qjmGNs-s%Wrg3hTQBmf#rg!JI,F+LXOH56OMi3I"USXl`TqS*OTUqXBQ^!YqO,f3eR@B\7S,Jia
+]tV4n]UH]_Js2AsOoLO:OTUc/P*5a*$]pL5OHGWeP*2#lP5LLHP`q;qPl6jIPl?pMQC!u+rL!_U
+R@=)Ds.'+[".u6[UA^kcV#R7mVPU*dV>d@kVu<RnW;s%!XTP`.Y-%]+#Hb).WiE%uX8]++W2HMi
+V5C,dUS+:YU&:Y`T`ChdU&L\gT:hmOU8%X^!huB]rLs%]s.]RirMBFfrM0:ds.]RirMBOk!2]Uj
+s/5Ugs/,jqor%her29OmrhfgpV5='d!N2mqVu<OoWVrjsX8K!tWW0!rX8f7'XfSY,riZ:)rNQ=*
+!3l=)+L8A][C3QS]">Pb]=Y_h^;%M%`5Ta<c-Xqkg>:oUoD?T.-+U%IP`)QHWM5f?I[RjJNi@S,
+ITVb5>+M@d>$GHB>?\23YHG,'Y5jU^NVe\7MuS\5M>rD3LPl*T`ji@ujN#?U[CNoUZa$mG\@B,c
+`Q5s0\[JuWZEC@7XfqE#?%R]^L51SAMi<[WOHPfmQC!u-S"6.DTq\?ZVl6VqXKA\1ZEppH\%0)^
+]Y;.s_Sa@4a2lEHbg+M\dF-Oof%8R-g=tH>hVd>Nj5]4^k3(sml0@U$m-X60n*olHncA@Srq6<b
+s7cNfs7uZjr;6HjrVc?eJcC<$d/SU~>
+JcC<$K`CZCrVc`nr;6Kis7uZhs7ZNerq0(ZoCMPDnaQ#9md9B-lg!`ukN:pfj5]+Vi83;FgY1?4
+f%&9udEp1abfe,La2Q!6_8!au]XkY_[^<BGYcb+/Wi2hlUnXQTSloH7D0(4*JH1;sJc1-!JaS-d
+JcC9"J,auiIJ\BsC1q3hBP2!Trd5E+G^4IVGB@kHEH#f4Ci!j.FEVeKr,r""#E=aaODAobI/\Qo
+I/JEjIfFioI/&*lIXQZoqL&KqI=6Qnr."Qnqgn`u#(qM[KS5&5reCH.qhP?2Ll$udL]E;2MZ/P3
+N;ne:N/ddp"-&7uNVeY9NK0%uNW+k;MM_:fqhP3-s+^Z3LPPkbreLK-!elA`qhP0*r.k<.r.k-)
+!f)SereUT2reUQ1qhY6,!/^W2rJUK/s,-r;Mi7=g",_qmMu/J3MZScoMuAV7NVnh:O8P%:NVeb9
+OSk7?OSb(>OHKL'!g/Y0q31lEr0I5I,+4mhS=Z@GTqS3WW2m&)[(3rlce%(8lL"*4p%S:XqY^<k
+f)I%\O+r+.MN!CFIs5[PNIl1uB1??$Db*QJH@AUa;c-@cM26qALA$9#NrG%8N;nh9MZ&D3M#W8/
+s!7O;p[dqBlK7*agtC9,ccjJM`59:(^:h4m]Y2%n^VRb'`5KXn`r*gU`r*mWaT'?_b00\+s3:Sh
+&^ShOe'ut&h;@5Sl0Rm0pA+XLruThbTU1n5Xd5B<OHP`bNfB$YOHG]kR$a5%O,]*WL])r-L%U+)
+JqJ`2LPUeFN/is\P*;/sQ^F52SXuLJU84W`W2cl!Xfnt7Za@0M\[oDc^;%M$_o9X9aND]McHaea
+daZdtf@\d1gYL]Bi8ESSj5f=akNM0plKdg'mI'H3nF?MK!V>s_p&Facp\ssfq>U6gqu-HkrU^#>
+s+13ss*t~>
+JcC<$K`CZCrVc`nr;6Kis7uZhs7ZNerq0(ZoCMPDnaQ#9md9B-lg!`ukN:pfj5]+Vi83;FgY1?4
+f%&9udEp1abfe,La2Q!6_8!au]XkY_[^<BGYcb+/Wi2hlUnXQTSju@G9i"Ua;#jMh;>j>k;=7?W
+;>a>l;=dW`;$/X20erY`"ZAV25sIU54qKh<4$#A^2`<TT2a0Ad4?>S'49.JA:'aQN7o3#\;c6Nm
+;uKSq;cH`q<VBDl<W#es<EArr!`i<$r)Netqc*Sqs&K8&<)cdqrDihtr)E_rr_inu<E3*!<W5tq
+<<6'!r`0&$<rQ,!<;fhs<WZ?'<r5ts=T;J&<WuQ*<`N*uq,R>ns&K"us&]2##ZXo+='&F&<EK0"
+r)Wi!rDrntr)W;er`0"ur`/ksqc<c"r)`l"r)Wr#<E9!!s&T/$r`K&!rDrht!E`M(=Su>%=SZ)(
+>$5!1='/T%<ruE(=8Q)$=^##.>Q.n*>Q.k/>?Y50>Q7t.>Q7q0?!h"=?QiifAS,RfBl%d5I>!H;
+PF.l5USXohXg#+=]"Gbl^qmq-rl4uW(W=5-^q[Us^:h4m]Y2%p_SjI7aiMTGb5KF0aMq7a<)Q[p
+;H6C^7mfC,69mCd.l/Y:/MT^a7lN=d4#o<"<)QRkp/(gMrf-f6s,6o7rJCQ1s+_DoX/DY^R?Wek
+LP15,HZsRPDf'6%B4bcSAc?9HB5)*sDJsH4rGhdVr,MXTs)\3^s)eBdF`mV(rcS6_s)f9(H$k'l
+K85AFP*MK-Uo:H%\@oc#c-k+mg"YB_i;V^6iZuTfQXEs!;d*4)<EE7&<`N+#=&r:%=]\^,=&rC'
+<E)jo:f($^:gJ[*KSG8<M2R=QO-#NgQ'Rc(R[]k>TV8*UV5L8lWiW>+Yd1UB[^WfY]=bkm_8=+/
+`lH0CbKS8Wd*^:keCN7(g"P3:h;7)JiT&tZjlYail07L!m-O--n*fc9rpg*]o`"O`pAamdq#C0h
+qY^6hr;HTcrdk*#s3Udr~>
+JcC<$K`CZCrVc`nqtpEis7uZhs7cQes7QEa"S;3TnaQPH7.'@-lg!a!kiV$hjQ#7Xi8<AHgY1?4
+f@AC"dEp4bbfe/Ma2Q!6_SEq"]XkY_[^<BGYcb+/Wi2hlUnXQTAn5e&J<Bf#!hGjOpRM;SrgiSN
+rLNSNs-s%Vs-WhQ!1*DF+H2;:KT(hHNa\c]V4sZWSY)ODS=5b.OckcbR[KY9S=BJI%@t2H]t]*-
+FafI:PEM+*OTU]-OHBI(q3(]=!0[>Ds-!DG!0[5C"-f"6Pl6mIPl6jNQ^O8/R@4#BrgNnXrga@f
+Tq\9VUSO]^VZ*FkVYm:iVYm@lW;W[tX/rG*r3$('"g4u0XK/AuWr]6!rhodn"/VcdU%tG_U&Ukc
+U&CVaU&C_`UB%%eTa7BfU8"EXU8+L^V#R:iV#@(gV#R4fV#I4jVZ3LlV?!OkVYm@eW;NRkW;WXj
+W;iauVPg>hVYd:jW;ijeWrB*tXo5F&YPGF"Ym@YB['mHQ\@K3M]+hok]tV7s_SsL6air/_f\50@
+kj\Dds!@E5R?s&GWhZ5RLRtKtR?a>&D2=:>>+;(VW**A5?!FM9Z*1=7p94FSqi(Q5s,-c3s+gZ1
+MZ4j9]=6;]d)3l6\@];TZEq'N\\,_saMbm)[^``QZ*(C8YOnu"JqJc3LP^nHN/is]P*;/sR$jG5
+SXuLJUSO`aW2co#Y-5(8ZaI6O\[oGe^V@V%`5Ta;aND]NcHjkbe'uq!f@\g2gtgfDi8EVTj5oFc
+kNM0plg4!*mf)YZnF?)?oCMVRp&F^cp\jmeq>^<gqu6NlrU^#>s+13ss*t~>
+JcC<$K`CZCrVc`nqtpEis7uZhs7cQes7QEa"S;3TnaQPH7.'@-lg!a!kiV$hjQ#7Xi8<AHgY1?4
+f@AC"dEp4bbfe/Ma2Q!6_SEq"]XkY_[^<BGYcb+/Wi2hlUnXQT=Bf<NDgLo(!.b'"m"5(bs+()u
+s*jQfs*Pl$BkCjhBP(sUI=$<dH$=@SGB7kIEH,i5Che*7Fa!\*s*"C&#**)IB5i0Ep3d!kI=;*D
+!.FfnpO*0nI=6QnqL&HpI=?YDIfY"Jr.+Wprdt-%s+LE+reCH.s+pB*!JlU3MYrD4N!#&uMi7Om
+rf-r:s,Hu9s,Ho9$B:"'MM[+DLkgb?reLK/"c%nhLPUcbL\uo#L]</1L]3,.L]</1M>N,/M>rD0
+M>rD2M$&QhLku%c!JlU3MYi>/MZ8Y8MZJcpr/:W8mu7:)"cSG#N/`hpNrG+;Nr4k:NrG(AOHGZe
+rfI2DrfR5Br/^c<s,mAGqNLuFrg*PMr0[MP,+G*mSY2[MUSXrlXfeq;]YhtEgYh2Ym-jK9p%S7W
+qu$Hmf)HuX_MNtuI?TG@JphZbK;!X2GA1#gDK/?rI!U<;:/OkbMM[/gLA$<!NVe\7MuS\5M>rAK
+L]@>Lp[n"ClK@3cgtC9-ccjMO`PTI*^APYM^;%J"_Sa=1`W!mT`W!mVa8a6[ao9H\bl>rfcMu3%
+dF-Opf@o'=ioTCjmdg)Ir8dl&mdup6Q);-cQC!_qOcPH\NK93aP*;6"QB@8hNJ`XLKnk>8oRp=u
+K8#&8M2I4MNfT<cPEhH$R@B\:StMdPUnsufWiN8)YHY==[C3TU]"G_k^VRe*`Q$!?b0/&Tcd:(g
+eCE.%f\5'7h;-uHi8WeWjlY^gkiq?tm-O--rpL'\nac8BoCW%Ts7QHerV6Egs8)Wirqu`noDX=@
+JcF*sJ,~>
+JcC<$K`CZCrVc`nqtpEis7uZhs7cQes7QEa"S;3TnaQPH6ga7,lg!a!kiV$hjQ#7Xi8<AHgY1?4
+f@AC"dEp4bbfe/Ma2Q!6_SEq"]XkY_[^<BGYcb+/Wi2hlUnXQT7S$0G:@D$[;#X>Z;YO&d;YErb
+;&;)F0ebC?1Gq$U5X.Lt4Zttk4?>Pa3B$jq'0\QA4Ztkg4?P\f:/"AV/ON6/;>aAm;ufkq;ZBZ!
+<)lpt;cEZps&K%ts&Jtr!``9%rD`hsr)NYqqc!Yt<`W5t<;onr<WlE'<`N/u<;KVm<<#r!<)rlt
+rDiksrDihus&Sqsr`K)"!*0"tpf78ns&K&!r`B)"s&K&"s&B)#=8l2%<``@'r`B)"r`/hrnl5rr
+<E<.#<)cjtr`8kspK7Drs&T/""]e]+<`W<!=T2D$=T2D%=T;J"=Sl5$=SZ,!=o__'<rcA$=8c5$
+=oMM'=nQ#!>l@k.>$G50>Qe89?!Ue8?n#MpAnG[hC2S'=K8#/BOd;K,TVJ?]WN<;0[CEcZ]Y2%o
+^r!t(]tCqerjMs=\$u@H3Ou`6^VRh,`l?'>`l?!8_83n#OE+N(;c-Xp;G9\O5!hk-2E<E@0g%QP
+7Roj72)[HU3`]6\;bp<b;>lLON;nh9MZ&D3L_Y]=SXPh+N/3.<I=$0\Ec5f0BP1sirFHCLB4kmm
+CM[m,E,]f:qf;XTrGqpZqfMg[rH.jX)g6IQIXm'*MN3gaR\$:QXg5CJ_8jdIeCW@-h>Z@4iW%p;
+j8S$aiR3XT=^>0<>ut'/=&i:$<E*"%=&`=*=BJX+<`W1";c6Ok:Jpa\=Fu0ZL51VCMi<[WOckon
+QC+)0S"6.DTqeE[Vl6VrXfek3ZEpsI\@K2`]t_=u_SjF5aN2NIc-FY^dF6Uqf%8R.g>(N?hr*GP
+j5]7`k3(sml0I^&mI'uB#4V0Ro(2JFrq6<b!;HHes7u]kqtpBjrVc?eJcC<$d/SU~>
+JcC<$KE(TCrVc]mr;6Njs7uWg!r)E^rq-<aoD\;OnaQ#9md9B-lKRQskN:mej5T%Uhqd,Cg=b-1
+f$r0sdEg+_bK@oH`l5j4^q[Rq]",;Y['R$AY-"b)W2HJfU7n2eBR5#\QM6pBSc,/[Sc#&ZSc#)Z
+Sb&?XS!oe6R@'A.Q^7K5%#p.!K8b_J?`0g!TqVIY%%a#ZR[KG)Ock`lR%"#Ds-s[jS=R@-^:h5+
+SpQ0TPE_8pP5CC?OT(C?Oopo2P*>[(s-!MKQ'D62r075HrKR;H!LB)OR/`TRRf8c^S=Q4BT:hpR
+U].%iV5F6g"K&)oVl'HirhfUks/>mq!36%#s/lF*Y-.`,s/lL,XK/G)riH.##cXc#Vl$>eUndm_
+rhBLiU]."dU&L_bU&Le`U]-teU&^tfUAUecV#R:kU]@7iU]I6drhK=c!2][l"f8)mV5L6iVYd:j
+W:m4jWqiUkWVrarVl9Nkql'OooW%nkriH+$s/u4%qlp"'s0;g7[C*HO\Ga&>]`5YX^;%J$`Q$!@
+bg=kmgtgoMm.:.ms!>@XStCq>_l9AtPCK%.gQA@b>?+de<EYiaUfgl)?X-d<YHb74orn=Rr/CW5
+s,-f4s+p]1MuOXe^V@_NlbUWW\\#S[ZaI9P\\#Ypa2c'-rO2p9YHG+2oWD\TK7el4Ll%"JNK9-_
+P*D5uR$jG6StD^MUSOcbWN*&%Y->1;['d?P\\#Mf^VI_'`5Td<aihlPcHjnde'uq"f@em4gtgiE
+i8N\UjQ5Odkiq?slg4!*mdKW6naZ2@oCV\So`Fj]p\jmeq>^<hqu-HkrU^#>s+13ts*t~>
+JcC<$KE(TCrVc]mr;6Njs7uWg!r)E^rq-<aoD\;OnaQ#9md9B-lKRQskN:mej5T%Uhqd,Cg=b-1
+f$r0sdEg+_bK@oH`l5j4^q[Rq]",;Y['R$AY-"b)W2HJfU7n2]?Y=4tII)O_K)^DlK)1&uJH(*!
+Ie8'fHjj_"A7B7cC/BA-I!L#:GQ2gbErU%]DJa32F*.;%s*"C&#EFe:Hu=%RI/JEmI//3iIK4fq
+I-Z4YIfForIK4lsJGOisK)UE%K`?c+LB!&.M#N82MZ/J4MZ&D3MYrD4N;nn7N;nn:N;8G9NfT6]
+O8b1>Mu\_6LB*/.LBWKjM26tCreUN.r.b3+rJ:B,qM>0,s+pN.!/gZ1reUQ1s+gZ1r.kH3MM[2d
+Mu8G6Mi<VoMuSb6NVAD3NW+k:NVn_9NK!gq!07&<!KN6<NW>(;Nr>%?Oco[*r0$u?rf[2Cr072G
+rg*SNs-`nSs-`nU-(CEqStD^MU84`gY->.:\%T`*f%T!?jQGdon*oo?pA+R_rVc`Hrud\hLk^25
+PDOsBH#%V\\93.2912?g85+AVHqmC0;G^-fM#rEbL%^2uNVnb7MuS\6M>rD3LD0=MmH`rri8*);
+e'H7[aMl$4^V9Z[s1S`Q^qmq+`5T^p`r3mT`r=$YaSs<]arJUKbg"AUc-FV\cd:(geCN4(gu.2R
+kj7d/pA+XEruU[JS=#bQ[$I,FOcYZ`Nf9$]OckrpR@'5$O,]*VM#N,/L%L%.JV/T/L5:\DN/`mZ
+OckroQ^F21S=Z@HTqeE\Vl?\tXfen5Za@-K\@K5a]t_A"_SjF6aN;WKc-FY_daQ^rf@S^0gYCWA
+hr*JQj5f=ak32'olKdg'mI'H3nF?&>o(2MGrq-?dp\4X]s7u]kr;6HjrVc?eJcC<$dJn^~>
+JcC<$KE(TCrVc]mr;6Njs7uWg!r)E^rq-<aoD\;OnaQ#9md9B-lKRQskN:mej5T%Uhqd,Cg=b-1
+f$r0sdEg+_bK@oH`l5j4^q[Rq]",;Y['R$AY-"b)W2HJfU7n2L8PMuX:[:mV;ZBVl;?0Sk;Y3id
+;Z9Pg;#F0.1bpd?1c$sH5X@\"5!;(n4?>M`3]]5Y2`U^trB($A#Yn)h:/+b[;,I-grDWbqrDEVo
+r`&hps&9&"<)iisqc!Pqr`9&!r`&eqs&T/"r)EVpqc*Ppq,[Mqs&AbnrDWbsr`&nt!*9"ts&B"u
+"'8N)=8c1m<ruK*<rH"q<W5r#<E<.%=8Z)(=&r@%<`W4#qH!Sqs&K;)<`W:'<rQ)"<)riss&B,$
+<EAios&T,!!*9)!!`i<$qH*;kr)Wi!s&T/$qcNi!r`K/$!a&N*oiV)os&f;(!a8`/r)`eur)s#&
+s'#J.pKRZ&pfm`&s'5\4?XNe?!FfX>B,YGtDf^8VKnkMDOHYuuSY)UOVlHl&Z*L^B[JmZ8[K!TH
+ZE^X;YHb@<ZEpmE[^Wi]^r+(h`$iO>^qRIm\[SoNYut73;cH^p<D6"X6TmeJ5<(PN,Utl-0LnT$
+3&NMk3X&J_;c6Fip/1dJr/CW5s,-f4s+p]1&<Vp-KRnPuGBIqED/*cuB4h-S$ta-bBPD3sD/O<3
+EH1tu!-A-[s)IpVs)\*[rcS-\qfVp^+a&$UI=Qp'M2dU\R%C(OXKf4G_8a[GeCN=-h;I5MiSrko
+iu@"<io/k?P]9u7>@(oB=B8O(<`N.#='&F(>$:i+r`9"t"&_un:\7InJV/T/L5:\DN/`mZOckro
+Q^F21S=Z@HTqeE\Vl?\tXfen5Za@-K\@K5a]t_A"_SjF6aN;WKc-FY_daQ^rf@S^0gYCWAhr*JQ
+j5f=ak32'olKdg'mI'H3nF?&>o(2MGrq-?dp\4X]s7u]kr;6HjrVc?eJcC<$dJn^~>
+JcC<$KE(QBrVc`nr;6Kis7uZhs7ZNerq0"XoCMPDnaQ#9md9B-lg!`ukN:pfj5]+Vhqm2Eg=k32
+f$r3tdEp1`bK@rJ`l5j4^q[Ur]=GG[[Bm0CYH=n+WMcSgU7l11Cik2hSb8NFSH,8[Sc>;[Sc#)Z
+Sb&?XS!oe6R@'A.QBqK7s,I/:KoH"h#%4=*USFQWrgsLgS=5b0Ocb`cRJiTVSXc2KS-cmC]tRt+
+G_M?FrKI;GqiUi=s,m5Bqigo?rK@AKQ'ISurfd;Frg!JIrg!MLrg*kWR@0M4S"#rISHPOVTVA4[
+V#@.iVZ3OtW2HMiVl'<g!3#gp!NN4"Xo5C(YHY80Y8sjMYHP(1Y-"e+Wi;qpVPU/dUS=NZUna]\
+V5'cZrh0=drh0LiUSOZ[UAgqfUApqeUAgqfUA^keU]I<fqP=7hUSRj`s.f[lVZ*FkVZ3IpVPU/f
+r2'[rW2QVlWMofq!NN-tWrK$uWrB%$Wi;ttnu;YfrMfdpri,Rjri?(#qlT[tricC-rNcI.s0<fS
+['d?O\%'#]]=bhj^:q@u_o9[=bKeJag"bKCj6?%+rPJR]qYd.YQ^H^BUn=!5H`Y>gJWlX:K7/tb
+>FqLd>$G-9>Zn54Z*(8&YPsOYN;nh9MZ&D3L]E3fru]Lu]C#.1b/1^!^::PU\@B,^^VIn1`P&di
+\%/iMYHm`%?%IW]L5(M@Mi<XVOHPckQ'[l,S"-(BTq\?ZVl-MoXKA\1Z*UgG\%0&]]Y;.r_Sa@3
+a2lEHbg+M\dF-Oof%8R-g=tH>hVd>Nj5]4^k3(sml0@U$m-X60n*olHncA@Srq6<b!;HHes7uZj
+r;6Kkr;H6dJcC<$df4g~>
+JcC<$KE(QBrVc`nr;6Kis7uZhs7ZNerq/tWoCMPDnaQ#9md9B-lg!`ukN:pfj5]+Vhqm2Eg=k32
+f$r3tdEp1`bK@rJ`l5j4^q[Ur]=GG[[Bm0CYH=n+WMcSgU7k[n@VBY*qgea!o7?djrIOKjqLSZs
+s*k#tp3lsg)eits@q]LfBMa,(H[:!]GBS1QF)u8>D/=$(FT$=kGBJ%OGBT%.Nf?c*CNKK&rI+Wl
+pjN0kkC*;XrdXors*k$!qLSWtrdt<+K7ejVLB!&/M#E/1MZ&D2MZ/G4MYi;3N;eh7N;SY8N;ek:
+N<,'$qiCc;"-&7tM>`80L]<21M#`A2LB*/.L]<,+L]3)6M2-k@L51QZM#W;4MM_1ere^T0s+pi8
+M26udM$/WkMM[5eMuS_=Mi*FNN;e_8N;AP6N;\_9Nr4n:N;\b9N;AM;NfB$YNfWsq!0@,@"Hek1
+OcfO(rKI2Crf[>Hpm(iEs-NYOs-bI-S=Q7DTV8-VV5C8qYd(I>\A#r,dFHh$gu%)PkiqF%nauPL
+q"ad_qtp<frVl]srVZWnkPtS(-&[J.J#\TbJphfWL6@7+EcFrdAT(+5H?t$89h\D[9o=a`KnkBU
+K`6u.N;nh9MZ&D3L_5F-k2YCUg"+TtbfRoE_SO"$rOiTQ^VI\&_o0L4`Q#pr`VdaUa8X0[aoBN`
+bQ#fcbneUNcd:%ddaQatf@o'=io]Lln+$)Hr8%AZd-[TrQ+=GmS!O&9'TS67NffNfPa7](QBI>h
+NJr^LKSK&N?%IW]L5(M@Mi<XVOHPckQ'[l,S"-(BTq\?ZVl-MoXKA\1Z*UgG\%0&]]Y;.r_Sa@3
+a2lEHbg+M\dF-Oof%8R-g=tH>hVd>Nj5]4^k3(sml0@U$m-X60n*olHncA@Srq6<b!;HHes7uZj
+r;6Kkr;H6dJcC<$df4g~>
+JcC<$KE(QBrVc`nr;6Kis7uZhs7ZNerq/tWoCMPDnaQ#9md9B-lg!`ukN:pfj5]+Vhqm2Eg=k32
+f$r3tdEp1`bK@rJ`l5j4^q[Ur]=GG[[Bm0CYH=n+WMcSgU7k%J8kVrVp/1idoMGTdrDESmrDEJj
+mSWgWrD<_S1,:O?1]B365sRV!5Q3hM4$5Mc3]R's!B`IC49@Z.48q>I:/"AV.Sil9q,@5k!)ren
+!E2nk;ZTitr_rkrrD`ess&T%srDihtrDiksr`/eor`/_o!``3!q,RAms&Jqqr)Nbrs&K#!rDrVn
+r`B2&<W5tq<W?"u<W,tt=8c1u<<6-#rDinur`8ttqc<_sr`&nu"'8N)=8Z+o<W6&!<W6&!<<?3$
+<r,nl=9DW,=',B%s&TG+<E3(%=BAT'=T;G%=8uD#=7o\m=oDJ&=TDS'=8Q+t=oMV(>Q.n'>6%k(
+>PqY4>?kH@?smDP@:E_YrFZgYDfg8PIt*!$LPq1TPa@c-T;&-Yrhodps/?!uri,pr*2fa7WiE,$
+Y-5+:[CEc\^r!t(^q[Uq\[SrNYH@f*-*)!.>#eKu@96?#91D<87R]Bt0Iee=4=r9X77K6n1HINV
+<)llr;"dccNVe\7MuS\5M>rABLP15-HZsUQE,B?(BP1pgrau1C#\[sgD/O92EH1hqs)IpVrcA$[
+rH8'\qK;d\+F&6]J:`K2N0'6iS=laZYdV0[`lui[f%Jg6i8ESRioBstro=%<s5>6]iS841?sZuH
+?WUB4=&r@%<`N1%=]ej1='/O(<`W4#;c6Olnk`VCK7nu6Ll%%KNK90aP*D5uR$sM7StD^NUnsue
+WN*&%YHY:<['mHS\\#Mg^VI_(`Pom=b0/#ScHsteeC<($f\,!5h;-rGi8N_VjQ5Oekiq?slg4!*
+mdKW6nc&([oCW%Ts7QHerV6EgrqcQirqu]moDX=@JcF0uJ,~>
+JcC<$K)bKBrVc`nqtpEis7uZhs7cQes7QEa9(VWEnaQ#9md9B-lg!a!kN:pgj5].Wi83;FgY1?4
+f%&9udEp1`bfe,L`l5j4_8!^s]=GG[[Bm0CYH=n+WMcVhU7l%0G^>+/nXTNJ#+V6TS=Q4@r1*hX
+r13bWs./bO#Fh0NR@0G0Qi33mN/NIDMi*R%VPU,_US4?PT:DIAR?s,%O,og#S"-">Sc,&e]tV1n
+^6"S-O->clPQ$dIPEPj+rfI/Brf[#>s-!DG!L/fIPl6jKP`q@(Q2[*LQOfIOR@9S6S"-%?StDXJ
+USIgar2'Fj!2ogprhfapqPX=kri$%#X/rG+ric=*s0;F)s/uU1YHG%1X8]'uVuERmV>d7kVPX9e
+r1XFkU8+KZUS=L^U]7(gU&Uk^U]7.hV#[CjV>R+kUSO`_r2'Ijqkj:hs/,an!NE*sWW&ptX8B!t
+X8T$uWW&pnX8f4"X8T'uWV!1nX0&M*XT#@$Y5GI'Yl:g-Yd(J1ZN%69['d<M\%&rZrk&6Erk9&\
+_SjO<c-XngfA,6?ioB:ko_A@#s!POZTVILJcE*b.Q%kj/h33eU>uapd<Eu;iV5RU&?X?p=Y-"k/
+Z*3i)s,Hr8repf6rJ:Q2LPl*TgV^f"s3Sd*^q@=nZa7-O\[oPkaN)63\@/oT[^*'@YH@H"@t9/`
+KSG8<M2R=QO-#NgQ'Rc(R[]k>TV8*UV5L8lX0&M-Yd1UC[^WfY]Y2%o_8=+/`lQ6DbKS8Xd*^=l
+e^i@)g=k?<h;@/KioB(\k2tjjl0@U$m-X60n*oi:o()DDo`"Lbp@n=[q#C0iqYU0hr;HTcrdk*#
+s3gpt~>
+JcC<$K)bKBrVc`nqtpEis7uZhs7cQes7QEa9_7iGnaQ#9md9B-lg!a!kN:pgj5].Wi83;FgY1?4
+f%&9udEp1`bfe,L`l5j4_8!^s]=GG[[Bm0CYH=n+WMcVhU7k[qBP_d=J:RWMrIXZmr.=crnq-[g
+"+YlNIeS7/Ht[,&@q]Lj:jm\<H$X^YF`heJEcQ/<Df':fFoHRaG6iAROH5B\Ed_s+I/SKjI//3i
+Icc%YIenQoJGOisK)UE$KER!`L51Q`M#N82MZ/J1M?&M3MZ&J3Mu\e7N;eh:NrG(?NfX.!rfI,?
+"HJP'NK*ppqM>--!/UE*!f2VfrJ1E/s+pu:L4tA;Ll$ubM#W>2M?&S4MZ/J3L]WEjMYr;4Ll$ue
+MZ/P6N;nh8N;\\5N;\b2NW>.>Nr4n5NW>.=Nqnb6NrG+=O9C]/P*(n(P5CIBOogi3Pl6mDQ3EVB
+R$jD3r0nk"StD^MUSXlfWiWD.Z*CUD]Y__3c-F\be_/g;ioTCimf)eWo)nXXp@eIZ$2F>lqYU0d
+qu$HTs!O4qM26M:S;N#MHZ+1_[<?A(9LM?f85+DXI=G!e;Gg8IM2-k?LPGJTs,Hr8repf6rJ;)A
+LYpn>e^Ddeb/_K=^q[Utrk/ZQ^VI\&_o0L4`Q%nrqo8WUs2b5^!6Y;arlkAe!71Yk'%,.VeCN7(
+gYUoLjll(#o(MkVgA`Ams/hfZ_Tea?R$NntOcGH_OHPfkQ'do)OcYZaMi*=FLP>>Q@t9/`KSG8<
+M2R=QO-#NgQ'Rc(R[]k>TV8*UV5L8lX0&M-Yd1UC[^WfY]Y2%o_8=+/`lQ6DbKS8Xd*^=le^i@)
+g=k?<h;@/KioB(\k2tjjl0@U$m-X60n*oi:o()DDo`"Lbp@n=[q#C0iqYU0hr;HTcrdk*#s3gpt~>
+JcC<$K)bKBrVc`nqtpEis7uZhs7cQes7QEa9(VWEnaQ#9md9B-lg!a!kN:pgj5].Wi83;FgY1?4
+f%&9udEp1`bfe,L`l5j4_8!^s]=GG[[Bm0CYH=n+WMcVhU7k+K92AG\pJLfal;@IWmSWmYrD=.`
+1,1I=1c73X5X7Lr5!;%j48h2?3;ti=4Zkhir]C0Br]C0UrCmAW:/Y!a;uT_r;u0De;ZKeo;u]hs
+<W?)"<W5tq<Vf_s<E/osrD`_qq,RPs<`\rprDWl!<`N/u<;onr;ufqt<WcE*='"rprE'/&<E<)r
+<<?-"<W6%u=8Z,!<Vohs<W6%s<W6%t<W?#"<E<0!=8Z+p<V0>l=8u>#=8,hp=8Z,!<<Q?)=]\](
+=9M]+<``B%=9Vc,='&O.rE02*=]kQ(qcNi#!a&N*qcNc!s'#D+r*98+qcX#)>5hb'=pA29?!^oI
+A,TpVAnPafAS>jtEccMLG^=dhKntVGOHPotR[]iHS,]#YSc5,jStDXKU8+TaWiW>,ZaRBT]`,SO
+]Xt\_['?g:X/`/sV^JEH=]\U&<)ujj91qZ:6<ZZ42_-.%4>8HY7Rop*2*!]X=&`-s:fI!`s,Hr8
+repf6rJ:r=LO+2eEc5c/BkV-jr+64IBPM="DK'T8q/QITqJuRVs)e-\rcJ!Zs*"Ed+F/?`J:iQ3
+N/s0fR\6IUYI1sW`lui[f@ep8hr*JQj5]sr''&!1iS`\Qi8<Cd[:iiKC26pRr`9)#r`'D.=BJU,
+=]ea,<``:#<;oet;,C'\:h,$-K7nu7Ll%%KNfT9bPEhH#R$sM8StMdOUnsufWiN8(YHY==[C3QT
+]"G_j^VRe)`Q$!?b0/#Scd:(geCE.%f\5'7h;-uHi8WeWjlY^gkiqBum-O--n*fc8nac8BoCW%T
+!quB_rV6Egs8)Wirqu`noDX=@JcF0uJ,~>
+JcC<$K)bHArVc`nr;6Njs7uWgs7ZNerq-<aoD\;MnaQ#9md9B-lfmZtkN:mej5T%Uhqd,Cg=b*0
+e^W'qd*L"]bK7iG`PfX0^V7@m\[])UZa-g=XfSP%Vl$8bARoV"Iu^)jSGSlPSH#/WSGo)WT)YAT
+S-5CQS"#lGRK&ZSQQM0GMhR+JN*ftjVkg)]T:V^IS=?"7PED#hN1-9*S=KSLs.',&#/7dbX-S$b
+rf[>HrfdAH!L&]EOT:LBOoLUDPQ-mHPQ$dIPEPg-r07MQPa%H!QBd^1Q2d-MQi<BPRK&]bS"-">
+SXuIHTVA3VUnmscs/,gopo++gri#gqs/H:)Xfek4Z*=54rj)O.pojt)Wi<"tW2KWlrhT^oVl-?h
+UB%%eUB%%fU]."eU]7(eU]7.iUBIBfUSO^bV>[:kV>@"eV>[:kV>I.iVu<OoVu<RjWW0!uXSAps
+X9G`-X/i>)r2g%'XK;?%qlBOms/Z1$r2on""g>/7YHY8/Z2([*[/RN6\,Wr@]"G_k^\tt]`5]sF
+dF6\!gYUoKjQ5Ulnb2bWqZ-W6s!R?oV4Ns>lGKNlQ]HNt_5iEYITM/(OB,MRTVPdp=^PE;Z*:L:
+Y-%?#!0-l7s,6o7rJCQ1!/HI3+P+R(s4G'+_7R=o\$NKP\%02fa2u?8\@/lU\?`?BYcmZ$?%@NZ
+KnbA>MN!LSO-,TiQ'Rf*S"-(ATV8-VVPgDnX0&P/Z*UdE[^`l[]Y2(q_SX71a2lBGbK\>YdF$Fm
+e^rF+g=tE=hV[8MioB+]k2tmll0@U$m-X60n*olHncJFTo`"Lbp@n=[q#C0iqY^6hr;HTcrdk*#
+s3q!u~>
+JcC<$K)bHArVc`nr;6Njs7uWgs7ZNerq-<aoD\;LnaQ#9md9B-lfmZtkN:mej5T%Uhqd,Cg=b*0
+e^W'qd*L"]bK7iG`PfX0^V7@m\[])UZa-g=XfSP%Vl$8b='K-IDL),0r.=Nkrdsornq-gk!.t3$
+"+YlMIeeC(BP1sgBkM-V:k!e<H?j[VGBWt,#'"QuD/<s1rH/-aFoHOiOH5K`NIQ1hFoHdcIJ\Eh
+IK"]]I/n`nI/n`nJ,Om"JUi<&rdt-%s+LE+s+^K-!/UW2rJLW3p58j-rf$i7s,?r:!07&>s,d5@
+"H\\*OH9C&r/Ur?N/NSmM>rD.M>N),M#E,.M#W;7Lkg_?L]3)7M26tELkpnEregZ4s,-i5"H&%l
+Ll)+grJCQ1s,$]3s,6i7!/pi8rep`6r/L`:rK$r<!frG(rf7#>!K`B@NrG+-OSt=9P5CI@Pl6mF
+QN*<NR/`TSRf]+NSc,/[Ta.?hW2Zi"YH\#3.C6Fl^;7e/aN;WNdFHn(hr<_ZlKmm)mdBT7o(2MH
+p@e7Tq"aa^qu$ERs!PO`Mhch4Ya:,tI<TI^NeVLp@7Xm"DFmQLH@/I^9i=e`MM[.EL5,>R!0-l7
+s,6o7rJCQ1$]!-TbK@lD_SO"$^AbbO^;%J"_Sa=2`Q%nrqSrNT!Q`C^b5TTabQ,oec5+aQd*^:j
+eCE1'g"bHCj6#UnnFH8Jr7:lhlHcE"^WiO<R@'2#P)kZ`P*;#lQ'n#*P)kW_N/WSlL&cr!KO'+[
+K8#&8M2I7NNfT<cPa.Q%R@B_<StMdPUo(&hWiN8)Yd(O@[C3TU]=bhl^r!t,`Q-'AbKJ/UcdC.h
+eCE1&g"P39h;7&IiSrnYjlY^hl07L!m-O--n*fc9rpg-^o^r.U!quB_rV6Egs8)ZjrVZWmoDX=@
+JcF4!J,~>
+JcC<$K)bHArVc`nr;6Njs7uWgs7ZNerq-<aoD\;LnaQ#9md9B-lfmZtkN:mej5T%Uhqd,Cg=b*0
+e^W'qd*L"]bK7iG`PfX0^V7@m\[])UZa-g=XfSP%Vl$8b77KpC:Jq*hq,-ral;@IWmns$[r_XRj
+1,CU@1G^sH6:!h$5!D+n4$,Gb4#T#W2`CXt!'U3As%Wbm:JEr@:f6marDWbqrDNVnr)38fs&9#!
+<rH#&<)lq!<`N/s<WZ9#<;fhq<;KVn<r#bq<rQ+t<<#tu<WH/!<<#tt<!--"<E9$!r`JhprE0&#
+!*9)!s&T%tr`9&#!EN4r<WH/!<rQ+t<rQ,!<rH#$<`N.#<r,nt<r#be<WH5#<WZ?)=8>r!='5E&
+q,[Dq!a8`/rDj;-=BAR)<``C+>$5#->5DD#=Su>#=9Vi0=BAU,rE9/(rEK5*s',M,s&o5&s&o>)
+$!UY??!^lHA7]?MB)Q9TBPVI'EH,r<G'SIaJ:iT4MN*[WO8Y.aOcu#oQC!r+S"?7HUSXokYHkOD
+[^WcV\$i]OZ*:@2WMl`oV'i.:VP^8jCLgRK<)R(%;b]nT770I45;t,A1+G=;1.ao&2`3EQ3BI.>
+!)iAb!0-l7s,6o7rJCQ1$&<G7CMINpAn>QQAdE$_C2@a*E,]geErU4\FS^.[FSg4\G5lddGT_<[
+IXm')Ll7:UQ'n8?WNNS<^Vn=CeCWF0hVmGQioB(pj9"B$ir.g:i8=Ol(?F54F_"`kDHKtB='&F'
+<E<+#=&iC+r`BJ-<E3+$<E)mp;=[OhJ:`E-L51VCN/WdXOckroQC+)0S=Z=FTqeE\Vl?\sXfen5
+Za7'J\@K5a]t_A"_SjF6aN;WKc-FY_dF6Uqf@S^0gYCWAhr*JQj5f=ak32'olKdg'mI'H3nF?MK
+!qZ'Vrq-?dp\4X]s7u]kr;6HjrVc?eJcC<$e,Op~>
+JcC<$JcGBArVc`nqtpEis7uZhs7ZNerq/tWoCMPDnaQ#9md9B-lg!`ukN:mej5T%Uhqm2Eg=b-1
+f$r0rdEg+^bK@oH`PfX0^V7@m\[])UZa-g=XfSP%Vl$8b@V0e/KTr$uo:5`Lm@=0Hr1<qZpmh>S
+s.'+Ys-aLeR$`qkKnPGCNF8W\V5'cYrgjRkS!]Y/PEM#fR[]h9SGo)ZS-bb"^:_4+aEE/uq31fB
+"I#"2Oco[*s-!AF#F(L<P`q>sQ2[$JQ2[$GQ2d-PQ'R`$rfm8Es-<YOrg4:cR[T_8S=H.AStD[L
+U8+KZV#@.iV?!OfW;WXoW;W^qWX#W-YHY::ZEaD7s0Ma2s0;F)#-Y23X/W(srho^lrhodm"/M]e
+UA^keUAq"gUA^kdUAq"_V#R:kVZ!CnVPX3d"/VlkV>[:kV#[ClVZ<UmVtm:jWW&psX8]3tXoGR'
+XTGZ-XSf4$Xo>L#XoGL#X8f3sWs#N+Xfei+YQ(d)Y5kj+Zi765Za@'EZi.90[K!c:\K\Vs]=bno
+_84%-`Q--Gd*gIrgYUlKjQ5Ofm-jQ>q"ad`rkna_`MfQ1Nj$^4U7.C%SZ:D4OMPd4<fiYM>b.Re
+>?b3:?!4A6Z)t2#YksCYMuS\5M#iEfMZ4g\eC+BZ]ue7-]YD%dZadNV]YD;)`kf0o\%&uVZECI9
+o<)SRJV&N.L5:\DN/`mZOckroQ^F21S=Z@HU8+N]Vl?\tXfen5Za@0M\@K5a^;%J#_o9U8aN;WL
+c-F\`daZdtf@\d1gYL]Bi8ESSj5f=akNM0plKdg'mI'H3nF?)?oCMVRp&F^cp\jmeq>^<gqu6Nl
+rU^#>s+14!s*t~>
+JcC<$JcGBArVc`nqtpEis7uZhs7ZNerq/nUoCMPDnaQ#9md9B-lg!`ukN:mej5T%Uhqm2Eg=b-1
+f$r0rdEg+^bK@oH`PfX0^V7@m\[])UZa-g=XfSP%Vl$8b>$YcWF+!k8s+10$jaluSs+10$s+13#
+s*t&tr-]JtAn,=bB51=mI!g6dG]e1QF`VPCDf0H/CNfVu%!Hi<GB]+0NfI>0Bla0"q0i0gr-eTo
+p3d$lI=?YAIK+cnIK+coJ,FirJc:9#K)gT(L&Zo+LB*/0M><#/M>E)5M2I4LN/[^ns,?u;s,R)>
+q2kW;%ZZU3OH5KaNfK*XMM[1Ipkep(!JlU3M#W8/M#E2.LB33freUK/s,-]3rJLT2",_qlM#E21
+L]NBkregT2oo/j/r/U`:!g&P,rf@#>!KW?ANrb?'plGK<rK-l<plbZ@rKR>IrKR8Grg*SNrg*SO
+s-`nUs-s%Zs.97`/to&8V5C2lXfnt7ZEpmE[(!WZ^r""-`Q69LdF?e%gu%/Rk3(snmI'H3nalGI
+rV-QlqYU3hrpKgdrqQL@RZE8^I#FJPKn+MgHA&;FDk^5u7;m3;9RD,9:/=P\:ece&M2$_=oS!+#
+repf6rJ;AILWRQS_SO"$]tD"k]t_A!_Sa=2`Q#p:q8WHT!m&L*rlY5`*6c[PcHab^d*^:jeCE.%
+f\,';ioTChmd]rCq>A_A,0fM`VPMY?PaRr(P*1rgO-#KfP*;3"R?N_nNK&jRLk^\=o7UV(JV&N.
+L5:\DN/`mZOckroQ^F21S=Z@HU8+N]Vl?\tXfen5Za@0M\@K5a^;%J#_o9U8aN;WLc-F\`daZdt
+f@\d1gYL]Bi8ESSj5f=akNM0plKdg'mI'H3nF?)?oCMVRp&F^cp\jmeq>^<gqu6NlrU^#>s+14!
+s*t~>
+JcC<$JcGBArVc`nqtpEis7uZhs7ZNerq/tWoCMPDnaQ#9md9B-lg!`ukN:mej5T%Uhqm2Eg=b-1
+f$r0rdEg+^bK@oH`PfX0^V7@m\[])UZa-g=XfSP%Vl$8b7S$-I:f((hr_iVjp/('Pr)3)_r_iYk
+!&OU/&2Q.#2F0Vo5<V1m4Zb_d3B@'us#9j<%Qup:4$5Z$9MJ518PDoXoi(cf!)rkps&8qqrD<Sn
+;uKVl;ZKem<W?+u<W,qu<W5tq<W5tp<W,tt<W?%s<W#kt<W,ks<W6&!<<#tr<<#ts<rZ;$<rcA#
+<rcA$=8c5%='#6!!*8qrr`B%us&K,$r`9&!s&T,!r`8hpq,[>ns&T"spf@>p"]e]+<`W;r=9DW*
+<`f9$s&Jtt!*B/%"BS`0=]bT'!EWD#<rlH-r`T8)qcNo&r`T5&pf[Vu!E`M(=ohi2r`f8)s',M,
+s&o>)s&g(=='/U/>?bB>?X[APA7]@cAnPdiBDuI[AnYmoCi+!)Df^#CG^4XaJ:iN/L5(M@MMmIS
+OHPlqR$sP;U84]fYHbC>Za@*FZEUR9XK/A"VPL#aV50o`Vl6SpX08d5=]ea(;-$Ie9hIc:6;^!+
+@4WTM4?G,L7n#g)1c.6S3E/sV;,:-_;>Z=OMuS\5M$/WiBkV,WAc?9HBkhI$DfB]9noFbOs)ddR
+s*"Eds*,`6I=Hg$L5ChLOd2<*USk6!\A#o(dF?e%gu%)Mj5]4]jlQL&#3Fq,j5].Zro!k8qr.S5
+']NhhD.$Re>#n^-=&r=%=&r@'='>K("]eW(<E)ut;t3[oJ:W<)KnbD?MN!OUO-,TiQ'[l+S"-(B
+Tq\<XVPgDnXKAY0Z*UgG\%&u\]Y;.r_Sa@3a2lBGbg"G[dF-Oof%8R-g=tH>hVd>Nj5]4^k3(sm
+l0@U$m-X60n*ol<o(2JFrq6<b!;HHes7u]kqtpBjrVc?eJcC<$e,Op~>
+JcC<$JcG?@rVc`nr;6Njs7uWg!r)E^rq/hSoCDJBnaQ#9md0<+lKRQsk2tdcj5T"ThVHuAg=Y$.
+eC;pocd'eYb/hWB`P]R.^V.:k\[T#SZa$a;XK&7tVPIX3CNP)er13GLrgi>Es.0(Zs.0"Vr13kX
+s-s%W+HDG>L5CkJ@&'QqVkTlWSt;LES=5_,OHP`cS",t=St>qP$(S]C]tM(ISU67nP5pjEPQ$dH
+PPgRKOckokPEV5qrfmJJrKRAIrKRAIr0@/F!1!PJr084eQ'Rc'R$a;0R[T_9S=Q4BT:_dMU8"EX
+UnjjdVZ3RmVuWgpW;WXnW;W[uWiN8(YPtd,ZMLp-Z2h0*YR%D6XK/A$W2HQmVZ!CuVPU,dUna]\
+V#I+bU]."fU]7.hV>R.hV>d@jVZ<UkV>mFmV>R4bVZ<^nW;`arWrB(!X8oC%X9>Z.Y-"i*Y5YX$
+Yk>1"Y5YQuXT,C-Y-5(6Z*:I;riud9[C*HO[C*C?[JdQ5\,Wr=\[qdQ!58BG*PfS2`lQ?Kd*gCm
+f\>9Ajlbjkl0Ia*o(;YNqu$H1s![*\V4X'CcGZfUR#mrD_6&chKi`b+P#beaSYKCn>$kT@>-G*5
+Y-"l"YQ1m(N;nh9MZ&D3L]E50s8N"[ruot?df93fbK.N6^qR:a\[]2]^q\"5`4WUh\@/lQYHY75
+oWD_SJ:W?+KnbD?Mi<XVOHPflQ'[l,S"6.CTq\?ZVl6VqXKA\1ZEppH\%0)_]Y;.s_Sa@4aN2NI
+bg+P]dF-Opf%8R.g>(N?hr*GPj5]7`k3(smlKdg'mI'H3nF5u=o(2MGrq-?dp\4X]s7u]kr;6Hj
+rVc?eJcC<$eGk%~>
+JcC<$JcG?@rVc`nr;6Njs7uWg!r)E^rq/hSoCDJBnaQ#9md0<+lKRQsk2tdcj5T"ThVHuAg=Y$.
+eC;pocd'eYb/hWB`P]R.^V.:k\[T#SZa$a;XK&7tVPI6t?taJ&pjiBq!.b$!rdacprdsipm=P@h
+s+(-!s*jur&SYljA7oOg:jdY;I<p0`G'.s,F8p.\Ci+!'rcS0_$[6c;OH>N_N-B\eGl<$hIK+cp
+IJeKkIK+ciIJeNqI=?YEIK+cnIK+coIfP&tJH(3"K)^K'K`?c*L'39dL51Q_M>E,/M>`;6M2I1K
+rf$f6!0$o:!07&>rfI,ArK%,BNfT8#OT1@KNfAsSMMmCMM2@,fM#rKgL]3,/M>rA0M#E20M#N/1
+Ll)%cs,$c5qMY6.re^Z2rJCN2!/pi6qMY91!0-o8!0-i8rf@&?rfR&?!0R/?rfI2BrK.2FOcY\%
+Oo:ICP5pjFP5pjHPlm>=QBqH6q3V,Ks-WkUr0mk\T:hmQV#I7rW2Zl$Yd1Y8[K!ZZ\%'&`^VRh,
+a2lEIdF?b"g>:cIjlbmomI0T9o_%tRqYL*fquH`cs8;ljs!G"ON/)q8S=,4dIWg*nNJ2CtAOg3#
+DFdKMH@&C^9i=kc:5Xj`L%9ooN;nh9MZ&D3L]`FJ^qTf\$GF0g^qmn*`5Ta9rl=oUs2P,\rlP/^
+s3(Gd!6tMgs3L_m'@YI\e^rI,g>1]Ik3;4"nauSPrQtQVr9UAZU=R&JR[TM+Q'7;iOHTU,%[EEM
+Q'%,eNJrdPL5(J<oRpb)J:W?+KnbD?Mi<XVOHPflQ'[l,S"6.CTq\?ZVl6VqXKA\1ZEppH\%0)_
+]Y;.s_Sa@4aN2NIbg+P]dF-Opf%8R.g>(N?hr*GPj5]7`k3(smlKdg'mI'H3nF5u=o(2MGrq-?d
+p\4X]s7u]kr;6HjrVc?eJcC<$eGk%~>
+JcC<$JcG?@rVc`nr;6Njs7uWg!r)E^rq/hSoCDJBnaQ#9md0<+lKRQsk2tdcj5T"ThVHuAg=Y$.
+eC;pocd'eYb/hWB`P]R.^V.:k\[T#SZa$a;XK&7tVPHXN85)iWr)<Plr_`;alV[RXo25Has%s(Z
+1,CU>1c.*U62j.L4q'S:4$5Pc3]8rW2`<et4o[_E4TA1U9`mRJ:f6j`r)<o$<)Zap;c6Nj;#jMn
+;?'Pn;u]hn<W?+u<W,tu<W#hq<W?%p<W?)%<E)ptr`&ntqH!Ppr`0&"<rH%s<<#tu<WuQ,=]ea,
+r`BD,=BAR+=BAT%=T;Iu<W6#"<EB*#$<C/,<``='<`W4#r)WJjr`9&!r`9&#"]\T(='&H"<VTVh
+=8#bq<WZ?'<rQ+s<rQ5$=8uG'=T);)=BAR+=',?&!*T;)r`T5(r`T2%s&oA*!*fG+!a/W-rEB2)
+qHX#(rE95)>5hY)=T2Ao=^,-:?t!PUA7]=aAnPaiBk_6mAS#IcBPD3sC2@a(Df^)HH$OaaJ:`H.
+L5:_GNf]EhR%'\@UnsufX08e6Yct:4X/`2!W2?EjV#R2?UnsreWN*&'ZF7<V^KkGQ<`E(%<`)Oa
+83T@.6U3U`-o3>7/hfab7Q31]rAssX!`Molo25CDs,6o7rJCQ1!/LMa$"dg`C2@d+E,]goEWC1W
+ErU4\FRaMQFs2'SG^4XaItE?/MN!UZQ'e,;Vl[/5]u8(?e(34-hr<YUroF%>s5s@CrT!q;p>HqL
+iSU]%@p`D\Ali,<='&L*<`N.#=B8R-=BYW(#Zju*<)Z^m;GZp]A:K,\K7nr5Ll%%KNK90aPE_?!
+R$sM8StD^NUnsufWiE/&YHY==['mHS]"G\i^VRe)`Q$!?b0/#Scd:(feCE.%f\5'7h;-uHi8WeW
+jlY^gkiqBum-O--n*fc8nac8Bo^r.U!quB_rV6Egs8)ZjrVZWmoDX=@JcF7"J,~>
+JcC<$JcG?@rVc`nr;6Kis7uZhs7ZNerq-<aoD\;JnaQ#9md9B-lKRQskN:mej5T"ThVHuAg=b*/
+e^W$pd*BnZb/q`E`P]R.^V.:k\[T#SZa$a;XfJJ"VPIa8Fa/Y(q47/J!1j+Zs-rDGs.0(Zrgj"X
+qORYVs-k-kMhm=ON/V,@W262]U7\$MSXu:=Pa.DnOIMc0S=Q7Crga=d^:q:paNJg^oTT9=r0%;I
+PE_8qPjOb6Q2m3JPl6mHQN*<OR/`Q]R[]e:S=Q7CT:_hVU&^tfV#@.jVuEXpW<'#ur2BUms/>ss
+$`^2+WiN8(YHb@<ZM:a?ZEUU=YctC:Yck43XK8G$WMcSiVZ!FkVZ!:lV5'gaUAL\dU8.^`qkX=h
+V>$nfW:m+cVu<IoVl?]oW;`arWrB'uXT,C'XKDE's0)C*qm$('!3c7'!jAc0riQ1&s/l=(s0)I,
+!3uO/s0Da6[f3f:\bio8\,Wu<])TGA]cXu(_8=+/aNDfTdF-Org"Y??ioTFjlg4$,n+-,FqYe,-
+-crB\ZBM]8]q_'`Kq5:!SsHLMI8uMu=Bh>iW*3G0?X6j?Yd1F6YP#."YPa@ZMuJV5M>rA5L]7:4
+rtsVMiW&f+a3)B8^V@Ch[(3c[^VJ"7`k8h\[KO+GZ*1J(Y$QU.JqJ`2LP^kGN/is\P*;/sR$jD4
+SXuLJUSO`aW2co#Y->1:ZaI6O\[oGe^VI\&`5Ta;aihlPcHjnce'uq"f@em4gtgiEi8N\UjQ5Od
+kiq?slg4!*mdKW6nc&([oCW%Ts7ZKerqQNhrqcQirqu]moDX=@JcF:#J,~>
+JcC<$JcG?@rVc`nr;6Kis7uZhs7ZNerq-<aoD\;JnaQ#9md9B-lKRQskN:mej5T"ThVHuAg=b*/
+e^W$pd*BnZb/q`E`P]R.^V.:k\[T#SZa$a;XfJJ"VPI:"B5;O5npg^kr.+Wpr.=`qmXbRmJqAQ)
+rdb#us*bMnAS#RgBPC=lI!g3bH?OISrc89aDf9K0CioVu%<cr>G'8(kOH,<iQtpjCI/SKmIf+Wo
+I.2RYIK4fpIf4]nIfFotJH(2uJ-(:RK)UB&K`6]*LB!&/L'!-dM#N8-MZ&D0MZ8V5Mu\k8Mueou
+rf@)@rK7#>!07&>s,d5@!KN-:MuSY5MZ/J3L]3/0MYr;,M>W20M>`54M2I4Kq2>91!K2j1M$Aiq
+Mi<RPMY`8.N;nk;N;\b4NWbE)OHG\(P5CFDP*,[(q2kZ?r/pi=s-!MKQ'M93s-3SMr0RAJr0RGN
+rgEbS'q:_aSXuLKV5C/iWiN5&Xfnt6ZaR@A\0AJq]t_D%`lH0EcdC7me^rO1i8Wh\l0Rj,o(;YN
+q>1!dr;HQorqQNfrq$.6rg8b&Oa`@ZP_F[;E-d5>HuXU^>t&^P8PFJXInia3;G^0gM>r81LPGGS
+r/CZ6reg]3s+h,>]Y(ql^;.P#_Sa=2`r*mU`rF*ZaSs<]b5TR)bg"DXcHjkbdaHXpe^rF+g"YBB
+jQGdon+65IqYeY<&H&c:ZJNKlR$sA+Q'7AmO-9L+%@*?MQ][AiNJrgPLP1EQKO0.YJqJ`2LP^kG
+N/is\P*;/sR$jD4SXuLJUSO`aW2co#Y->1:ZaI6O\[oGe^VI\&`5Ta;aihlPcHjnce'uq"f@em4
+gtgiEi8N\UjQ5Odkiq?slg4!*mdKW6nc&([oCW%Ts7ZKerqQNhrqcQirqu]moDX=@JcF:#J,~>
+JcC<$JcG?@rVc`nr;6Kis7uZhs7ZNerq-<aoD\;JnaQ#9md9B-lKRQskN:mej5T"ThVHuAg=b*/
+e^W$pd*BnZb/q`E`P]R.^V.:k\[T#SZa$a;XfJJ"VPHXN9MA8Xq,@8jrDE5alV[RXo25Ha!])Pd
+r\GHL2*aGm5<_7n4Zb_d4$#>\3ArfY4Zkkk5<]!.!Bj3W9`n6e:K%!es&Atrr)EYqs&Aqq!)iMf
+!)ibo!*&krr`8qsr`0)"<E8oq!EE+u<W?%s<=)]+<)cjt<)cjtmT'Bh<)iiss&T/$#$G&1='/U-
+qc<i$=',<%s&T2$r)NVprE'#""'&E'<rQ1t<rH%u<WH/!<WZ9%=8l8#<<-)!<ruE&<W#qu<rZ1u
+<rZ8"<qf\j=9Mc/=BAT&<WH.u<rZ8$=T;Ii=9)M%>5_\*=oVV(=oV\(>Q7t*>5qh+>l7k->l%Y)
+>5hY;=BSd1>[CfI@q0(]AnGUdAnPfVCB%s&B4tsmCMds-D/F33FEMbMGBeI_IY!0,M2R=RP*ME(
+T:r$UVPgAmX/rJ+XK/>!Vl$<gU]7&IUSXieWiWD1[^j&d_oBgCW)?_u=]8:#;b]qX6p3n75rLed
+.k!PC/hfgc7lN=`3]T6&<)ljnnko=Ds,6l6re^Z2$AW2(B5)*sDJjE5qf;^Xqf;^XrcI^RrcTQ2
+G^4R\H[^KtKntYIO-5csSti3bZ+%EbajAPhg"bKEioB+\rT4%@s5j4?s5Wn5qVheAf<8Ul@sV]f
+r`K/#'NJ+3<`iI,=BSa.<*!%"<`N*t;H!'^?@RKWK7nu7M2@.LNfT9bPEhH$R@9V9StMdPUnsuf
+WiN8)Yd(L?[C3TU]"G_k^qmn+`Q$!@bKJ/UcdC.heCE1&g"P39h;7&IiSrnYjlY^hl07L!m-O--
+n*fc9rpg*]o`"O`pAamdq#C0hqY^6ir;?Nbrdk*#s4.."~>
+JcC<$Jc>`Mo`"gfrVZTjs8)ckrqQNfs7ZKcs7AePo()>?n*f]3m-O''l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfcHOJRaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hk@qg.9N1BX5p72/P!1`qUm[X<Jr14%^
+St2CApmj%-O,\sLNK&s,UnsrbUS4<NStM[FR[98$P`VH,S=Z=CSt;LDT"VkM^P04?Js,_hrfdMK
+Pa%C.Pk((>Pl?pPQBdc%Q^*j7PlI!XPa.N"QC!r*R@0M4S"0JKs.0=bTV8+YU]7+mV5C,fVuEUp
+WW&mtWW&jpVuN^qWW&ptWtDJ:YctC<Za7$FZa@*G['R'CrNQ=,%^<.>Y-"e+Wi;qoVPgAkrMKt!
+Vkp2cVPU)aU\pkbU]7+lV50rarMBUlVZ*InW;NRnV?3`qVu3CoVl$AjqPX=is/5^ls/H$urN,mu
+!3Z7's021$pTOY$riZ:)!3Z:(!O/j.Z3%A>[/RH9\%&rY])K;E]Xteg]`,Ml]">Sf]t_A!_SX4/
+`lQ<Gc-F\aeCE4+gtpuKjll!rmdBQ5o(;YOr;O;-.(Q4MPbbq2Z^mJDT<6)8Of<q4KNXC<>G7U]
+W*3A5?<^U<YHY45Ycmf*ric9Zrepf6rJCQ1MZ4jps8V99^s0s8_8!Xk[(3cY]tqP-aM,9q\[T/V
+Z*(C9XRrZ!IXls#K8#&8M2I4MNfT<cPa.Q%R@B_<T:hmQUo(&hWiW>*Yd(OA[^N]V]=bkm^r""-
+`Q-'AbKS5Vd*^:keCN7(g"P3:h;7)JiT&tZk2tjjl07L"m-X6?mfr:Oo()DDo`"Lbp@n=[q#C0i
+qYU0hr;HTcrdk*#s4.."~>
+JcC<$Jc>`Mo`"gfrVZTjs8)ckrqQNfs7ZKcs7AbOo()>?n*f]3m-O''l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfcHOJRaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hk>@2#[GNjYSJbt&sJa%ddJc:01Iq`P+
+@VKLi;1*b;I!U'_rcS3]"E89rD/B,n%Wur=G'8(kOGo3/LhLaSrI"TmqgSKl!.=Tjs*XZkq0i<l
+rI+`prdFiqr-nWpqLAQsrIP0)KS5&5reC<*s+pZ2qhk9-",_qmMZ/P6Mu\k8Mu\n;O8k=?OoCFI
+OcYZcNfT9`rK$u<!0$o8qMGE4LkgbAreUZ5MuJP5M"QW)M#3#1MMmDlMZ&J4MZ/M6MZ/G4MZ&A4
+MMqFlq2>-/r/LZ8"cn\(O-#J&OoLUBPPgUDOo(78OoLUEPQ$aDP5pjFPm3J<QBml(R/WNPR/EBP
+S,]!=StDUHTV8*TUnsufWiN5'Y-5(7ZEpsI\[oDc]Y2%p_o9X9aihuWe(*%#f@ep8ioTCimI0W=
+p\Faas8;oqs8MlprVlcos8MHd--_g9MLUGGR#Q`IG'o%,L37oX7V#)-8POSZH@Sac;Gp=eMM[,e
+L@g/tN;eb8MZ&D3L^1Z/^VRe)`5VPms2P)Zs2b2]rlY5`rltGg(=:IWe'uq!f@\g3gu%/Sl0Id-
+o_84[aSuguc,A#`X/(uJR$Eu&P*(igrf[kWQ^F/'OH5E\N/<@ELkUTUKN`hTJ:`E-L51VCMi<[W
+OckroQC+)0S=Z@GTqeE\Vl?\tXfen5Za@0L\@K5a^;%J#_o0O7aN;WLc-F\`daZdtf@\d1gYL]B
+i8ESSj5f@bkNM0plKmm)mf)YZnF?)?oCMVRo`Fj]p\jmeq>^<gqu6NlrU^#>s+14#s*t~>
+JcC<$Jc>`Mo`"gfrVZTjs8)ckrqQNfs7ZKcs7AePo()>?n*f]3m-O''l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfcHOJRaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hk8OuQO:f-mb!)i_lo2+dNqGQu`/Q+D\
+1GCUA1c@Tb5sIRt5Wq4k4$#Ga2`NfU4?Yei5!D1o4?Pc%:/+G96VL8S;Z'Jl<<#np<;ont<;ohq
+;Ya2i;#aGn;[63!<)cjs<E9$!rDiku!*/kp!)rhq!*0"tr`/u!r)N_qs&Jhpr`/u!#$4i+='&C$
+r`/u!s&T2'r`K/&r)X#'='/O*rE0)$"'/E&<rQ+q<WlK)<`N0!<WQ9(r`Att!*0#!r`B,#s&]2#
+!EE2!=8u8)<``@'<``B"<rZ;%=8u=q=85ns=oVV%<rQ)!<r?#!<r5qu=T2D$=T2D"=T2J&>5qh,
+>5h\'=p8,6>$G39r`]A+r`fA,!+#M/$!ge@?!LW??!LY5>mXhE?t!MSAS#IcrFZ:IBkhF"C]8&n
+CM[j+EH-#=EcZDJGBe@XH@:9pKSYPGOd)3"S"61FU84Zari#jr"feQ"Vl$<iU]7(gTfo0IVPgDp
+YHkUI]YMJ+b0JD`e_&Vp>?Fs*=Ai7$9M%f@6:F=.3&`3A.QfC?7Rfg72DdHU3B:&=<)QRko25IF
+repf6rJCQ1#&.gfD/XB5rGqmYr,VdXrcIsY!-\6^rcTN1G^+LZH[UBpK8,5@Nf]HjS"HISXKo@N
+`QQZZf@o'=j5]4ujo+??jo=EAirS0"ro3q9q;VD6$f^#ZDfp>L=BSa/=T2D%<Xr22=BJ^/>?G!-
+<``:%<W5ns;=[OeIXls#K8#&8M2I4MNfT<cPa.Q%R@B_<T:hmQUo(&hWiW>*Yd(OA[^N]V]=bkm
+^r""-`Q-'AbKS5Vd*^:keCN7(g"P3:h;7)JiT&tZk2tjjl07L"m-X6?mfr:Oo()DDo`"Lbp@n=[
+q#C0iqYU0hr;HTcrdk*#s4.."~>
+JcC<$Jc>`MoD\^erqu]ks8)ckrV-Hgp@eLY7eH<Co'u5=n*f]2m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI#dF$:cbfe,La2Q!6_8!^s]=GG[[Bm-BY-"b)W2F9?Dfpetqjd_WrLNYPqj[VSrgW>Gs.0(Z
+s.'.[pRMPIN/<IPNK.EGVZ3A6TqJ$NTUhL>Q^*btOIi#6T:_^GSt2Id^:_.nf:I;FP*5C"!gJn4
+rKI;Gqiq)Fs-<YMrKdGJ"-f(9QN!-MQBhB4s-<VKs-<SL#a^pHR@9V7S=TYNs.9=cUAUbpUnsob
+VPg>jW2ZbrX8T$uW;`^nVu`ltrMp.(Y-5(7ZEsJ9s0Vp8Za0P6s0;R-s/uX0XK/A$WMoTi!2fal
+"fA,nUna^^UAgniV50raqkj+c!N)gpW<0#rW;`[rVPpKkVuNUqVl$BgW;`asWiQ*"r2g"&YPYR$
+Z2V'/Z2_*1Z*=54nur5$ZEpn:[/[N<[^WcV\[oEP]`5YF^APbG^`C;0`5Ta:aN;QHbK\>ZdaZk#
+g=tHAioK:em-jH8rq$<eq>:0"s![E;TWFBi^;H_:Q\V-<h49muM0+T6Pu_.[U8;!s>%(]@=g>-7
+Y-"o%Yl1d)N;eb8MZ&D3L]E3gruoY_s6&IVcHF&>^:h"`\[f;a_8".8`4NRi\%8rPYHb=8o<)VQ
+J:W?*KnbD?MN!OUOHG]jQ'[l,S"-(BTq\?ZVl6SpXKA\1ZEppH\%0)_]Y;.s_Sa@4aN2NIbg+P]
+dF-Opf%8R.g>(N?hr*JQj5]7`k3(smlKdg'mI'H3nF?&>o(2MGrq-?dp\4X]s7u]kr;6HjrVc?e
+JcC<$f)L7~>
+JcC<$Jc>`MoD\^erqu]ks8)ckrV-Hgp@eLY7eH<Co'u5=n*f]2m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI#dF$:cbfe,La2Q!6_8!^s]=GG[[Bm-BY-"b)W2Ea'Anl@4k(!MaJ:RWMqh"fukCW_bs*u\6
+An>[iBkgLnH[L-cG]n7SF`VSEEGo`3Cj'rEGBS.RGBS1lOH,?\VL<<)Hi8?kIJnWpIfOrjIJnQm
+IJnWoJ,XosIK+cqIJSEkJ,=cqJcC<'K7npWL&Zo'L]*)-MZ8M5MZ/G4MZ/G4MZ&J4N;nn;N!YN*
+OH5KbOcbfir/_DLNfK0^O,f6]O,f3ZN/[^ns,-f4s+g`3M2D4h!fMqnq2#*-rJCQ1rJ:Z7M2I4L
+regW3reg`6reg`4!/g`3",`"qN;e_:N/NVgN;\b7NrG+>OT1IAP5UUBP5g[COp$o/OHG\)P5LFB
+P5CIAPl$aGQ3*D?R/WKRRf/]USGo)ZT)YHFTq\9VUnji`VPgDnX0&P.Yd1XE\%'#^]t_=t^r"".
+ai_iPcdC4kf%8R-g=tHAj6#Unn+-,Ep\FX]rVQWns8E#sp\t-is8M?a.JL?4M2m(MPaI/UIWBak
+Y^CP7BN\taE(N`LH[SXa9MnV_9o=a`L4k?RK`6r0MuS\5M>rA7LVh!K`qd[Ta8j9ZaT'B]b5]Wd
+bg"E3cPOsUdaHUoe^iC+g=tKCjQGgpmd]rDqYeD5,OPE&a4dGhPF@r,Q'ISqOHPcjP*D2uR['"q
+NfB$ULkUV=L%Bt.IXm!%K8#&9M2I7OO-#KePa.T&R[]h=T:r!TV5L8kWiW>+Yd1UB[^WfY]Y(tn
+_8=+/`lQ6DbKS8Xd*^:ke^i@)g=k?<h;@/LioB(\k2tjjl0@U$m-X60n*ol;o()DEo`"Lbp@n=[
+q#C0iqY^6hr;HTcrdk*#s474#~>
+JcC<$Jc>`MoD\^erqu]ks8)ckrV-Hgp@eLY7eH<Co'u5=n*f]2m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI#dF$:cbfe,La2Q!6_8!^s]=GG[[Bm-BY-"b)W2E*T7nuoYqbmJmrDW_or_`/]lr![YoMGoN
+1,:XB1Gq'U62j(W5!;%k4?>Pb3B0#Z2?#`E5!M7p4Zki%:B!rk>=VLd;,R<jr_rSkr)Nbrr_rbn
+r_`\ns&&em!)`Ylr_rhrqGmPr!*/hos&8qsnl>Zgs&JttrDiksr`0#$r`9/%<)iisr`0##rE',(
+>$1](#$=r.<`W:(r)`errDir#<rH"u<rH%u<rcA%=8Gqt<W6#!=8l8#=8c1s<rc;#=8u>#=8c/$
+='/Ss=85nt=8l;%=8Z+u<W,u"<`T#ts&]5$r`9/'=',?&rE9,'r`f;(rEK8)s',M,r`]V4>?kE=
+?!^k:?i=@8@:3MP@/XI4?j'nI@q90MB.dk4C2%BtCi+'.DJX3/EH6)AF`hkNGB\:WH@($fIY!3/
+MiNpbQ^F52S=ZCIU&LefUo"$e9;SGZUS=NWTq\<XVPgDoY-GFG]YDA(b0SJaf%A^4hr*I\Ali#7
+;HHh$9MJ&I5"&:72`NHA1HRZN0M4l*3&WTS3BK6#<)ZXj;tElcN;eb8MZ&D3L]`ENE,kktrcA!X
+r,_m[qfVp^qK2d]rceBes*5`6IXm$'LP^tNP*;6&TVSQhZamijbgP(pg>1]Ij5f=`rT=+BqrRk=
+rT!n:ro<q9q;W^ZPHS;1HrO6L=^"m-<``=&<E<4'=]ed/=B8L(<E2pq;c6K`:h5$*JV/T/L5:\D
+N/`m[OckroQ^F52S=Z@HU84W`W2ZeuXfnt7Za@0M\[oGd^;%M$_o9X:aND]McHjkbdaZguf@\g2
+gtgfDi8N\Uj5oFckNM0qlg4!*mdKW6naZ2@oCV\So`Fj]p\jmeq>^<hqu-HkrU^#>s+14$s*t~>
+JcC<$JcGcMo`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nj2g8n*f]3m-Es$l0.9ljl>C\i8EJJgtLK7
+f@JI#da?Cdbfe/Ma2Q!6_8!^s]=GG[[Bm0CY-"b)W2F0>FaSt2rg`tYrL<kYp72#LrL3\Sn!sBJ
+rLWbS#E=b$LlRFR@/d&'UCs;oT:hjKR@9G-PEV'"SXl@FT)P8eStNg2]Y@t6GD#mXs-!GIm?@O6
+!L&cHQ26gGPlR'EQ2HmHPlR'JQ2['\Q^F20R[]h<StDUITqJ*SU\pqfV#mNlVuEUrWN)utX8f4!
+VuWanVuWgqWt;A8YHbC>Za@-J['[6KZa6t9Yl1g,Yl:g2Y-"e+Wi;trrMT[o"/i#nVuERnV#[=j
+U]$qeUB%+hV>R4gVuNXmVuNUsVl6PnWW&jqVZNfpVYd7lW2KWn$)a`#Vl6PnWN*#uX8oC%XT#@&
+YPPL$Z2_-.Zi@?1YlM*-Z2Lp+Ym@Y?Z*L^B['d=@[Ka4N\@K2^]DfMD^AbnI_'Hn8`5Td<aN;QI
+c-=P\dF6Xtf\50=iT'(blL"*3o_/%TqYU2qs!Y"HViJ0j]!n9"O.`SrZB;MN>ub$g<a22eTrD7#
+=^PH=YctF;XfS`$Yl(^)N;eb8MZ&D3L]E3gruo;Os6o:%c-=5C^V%(b[CWr^^;7q7_n<Ri\@8oQ
+Z*1I:o<)GKIt3*&KS>/:M2R=PO-#NgQ'I]'R[]k>TV8*UV5L8lX0&P.Yd1UC[^`lZ]Y2(q_8=.0
+`lQ9FbK\>YdF-Lne^rF+g=tE=hV[8MioB+]k3(sml0@U$m-X60n*olHncA@Srq6<b!;HHes7u]k
+qtpBjrVc?eJcC<$f)L7~>
+JcC<$JcGcMo`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nj2g8n*f]3m-Es$l0.9ljl>C\i8EJJgtLK7
+f@JI#da?Cdbfe/Ma2Q!6_8!^s]=GG[[Bm0CY-"b)W2Ea*B5D^=i.1fXr.4p"jamhjBP:pfBk_<Z
+IXM*?%=!)>F`_YFEH,l5CNajsG5lamOH5B]:o\;PH[Ga>rdF`orI=irpO3$grI+WnrdXorr-\Qm
+rdF]nrI=it!J,e"JI7!]JqJ`1L4tA;LAlu-L]rQiM2@%Fr/1N2regZ2s,-`4rf$i9!KN6?OT1IB
+P5C@@NrP1?NrG+>N<,'!r/:Z7MYi81M?/Worepf6rJ:W6M26udM>rD2M>rJ3MuS\4MuJV4MuS\7
+M#`G3M#`J5N;nh4Mu\e6N;\b8Nr>%<O8tF>OoU^EP5UUCP5^UDP5g^GP5^UDP5LO=PlI!MQC"!<
+RJrZSRkUD)StD[LTq\9VUSO``VPg>jWiE/'Yd1XE\%0)_]t_A"_o0O6a32`RdF-Rrf\5-Zh@JQ)
+jQPptnF?)Ap%J.Sq"apcs8;oqr;?Nl"98B#roF).g6%ASH]F,LObA70I"mf@FFn@'6qVAi9m_55
+ISNU0;Gg8JM2@"AKSB#Ns,?r8s,-c3s+g`3`l@qspW3?V"j>-6c-FW6ci;B-daQ^qf%8R-g>(TF
+jll$tn+-/Hr;OP4,5IbEf<;<HS"#b0Q'@DmOHGckPa%T)Q][DkNJrdPL4tA9o7UJ!It3*&KS>/:
+M2R=PO-#NgQ'I]'R[]k>TV8*UV5L8lX0&P.Yd1UC[^`lZ]Y2(q_8=.0`lQ9FbK\>YdF-Lne^rF+
+g=tE=hV[8MioB+]k3(sml0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kqtpBjrVc?eJcC<$f)L7~>
+JcC<$JcGcMo`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nj)a7n*f]3m-Es$l0.9ljl>C\i8EJJgtLK7
+f@JI#da?Cdbfe/Ma2Q!6_8!^s]=GG[[Bm0CY-"b)W2E0X92/4\;Z9Vn;?Kiq;GlgXl;@LXpJEIt
+1,CX@1Gh$U5s[\!5<_1l4$5Pc3]K&W2Ea2c4[2.p4[)"l:/4MX.TfD@r_NSlr_`_pp/Lohs&8qq
+!`;inr_`Yms%rbmr)*Dj!)rkrr)Nbt!*0"t!*0"ts&/tu<E/rt!*9%u!`W0!r`8ts!*/nsqc3Vr
+rDs&#<)iisr)Wi"s&fD,=]kZ)"^"i.=&rB!<ruE&<W6#!=8l5$='#9"r)W\rs&T/$"'AT(<W6#!
+=8Gtk=8u>!=8l8"=8u=r=8Z2#=8l>%=8c52=&r@'=&r@%<``@'<`N/n<rQ1u=T)D%>5_\)>5qh+
+>l7h+>5qe/>[(H<r*9P6?XR;O@UimH@K0a8?iOLB@:E\UAS5[jBkhF!D#S>PD[:?%E,frAG'J<3
+H2r?jI2m`gKSYMEO-#TmR$jD3S"-%@StMaMU8"EXU8"F^U)g#'UnjlcW2cr&ZF.3R^;@k1bg4_f
+g"YB?i8N\Uro>;L=BSa*;c?au9hS&B6:F@.3]AQ7.Qf@>7Rom;3&NNR3]U4><!#il;Y*ccN;eb8
+MZ&D3L]N9Or,_jXq/cFUrc\3^s*"?b,^=T[H@13nK8#)<NKB<fR%9qJX0/kB_8spPf@ep8i8`kY
+jlQL(rTF(?qrIe:n`0T/'&qEC>%r.[>?Fp.='&F(<`<(#rE0)&$Wg;/=B&=#;cHRk;=dUkI=Hcu
+K7nr5Ll%%KNK90aPEhE"R$sM8StMdOUnsufWiN8)YHY==[C3TU]"G_k^qmn+`Q$!@bKJ/UcdC1i
+eCE1&g"P39h;7&IiSrnYjlYail07L!m-O--n*fc9rpg*]o`"O`p&Ojcq#C0iqYU0hr;HTcrdk*#
+s474#~>
+JcC<$JcGcMoD\^erqu]ks8)ckrV0"Zp@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bK@oH`PfX0^V7@m\[])UZa-g=XfSP$A7TP"J<B/fqj[DMrgWkV!1WVNrgj"Zq4/C^
+M2%%LMi;#?V5Bu^U7\'OSXl19QBm\rO8b^PT:VVQSdV4(^:_1oP&l&3P*5g.s-3/>rK@2Es-3MH
+!gJt8q3M#F"I,1:QBqN8r07)Ds-=:aQC!u,R[]h;SY)OITV8'RUSId`rhTjsVl-JlWN)urX8f3u
+W!')uW2ZcpWs>`.YHY=<[']h?rjE!;Za-j@YkkU*Ycn&/"K\W&WMo`m!2fXks/#joUnmsas.TRi
+Unn!dr2'OnVPj9fq5=4jrMKXmrMTFhs/5mq"KAE$X/l-!!j8`1rNH:,rilC,rj)C-pTjb&!4)R0
+!4;a5!k,VKrjN3D\[f;`]Y(qk^AbkO^qmk(`5]msar/CHc-OedeCN:+h;I>Ul0I^)nFH5Ep\Ogd
+XoBisW2,oNVldD)SX>5(]&'!DVjgkCJWs5@SY2dW>[1]D>?S89Z*(45YPGF"Y5jO\MuS\4M#iEf
+MuP!Hs8W)ffuMC\^qRLn\[K&[]"GnsbK.K3\[f2Y['HpAYH@E!A:8rXJqJ`2LP^kGN/is]P*;/s
+R$jG6SXuLJUSOcbWN*#$Y->1;['mEQ\\#Mg^VI_(`Pom=aihoRcHsteeC<($f\,!5h;-uHi8WeW
+jQ>UfkiqBum-O--n*fc8nac8Bo^r.U!quB_rV6Egs8)ZjrVZWmoDX=@JcF@%J,~>
+JcC<$JcGcMoD\^erqu]ks8)ckrV0"Zp@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bK@oH`PfX0^V7@m\[])UZa-g=XfSP$='K0JE-pAjs+1-#!.j6`&nb`cC1h3p:jmY;
+H?sgZG'A"Krc&'ZD/F'2rcS<dG5ZUiO-#B^NH8`Nrd4WlrI+ZoqgSTpq0`?oI=-GAIJeQnJ,Xoq
+IJnNoI=D'C!e>iPqLJj&K7ei1L5,P[rJ:K1reUT2rJCT5rJLW3s,%8DN/W[QN/W[QNK&sZO8b7@
+OoCLDOo:C?O8Y+<O8k7>NW4t:MuJS9M2I1Kr/CZ6!/gc4s,%)=LkpnFM2I.Hr/1K3s,-B*r/(T5
+MMmDeN;ne9N;\_>NfB'ZNK*purfI/Bq2t`ArK@/Dr0%)Bs-!AFrK.)CrK@5Gqj%/F"I5:=Q^I]>
+rgO+^SXuIHTV;@[s.hHIVPgAkWN*&%Yd1[G\[oGe^:qG#`5fs@bKS5Ye(*.*gtglIj5f=akj%U)
+nF?)?oCV_SpAajip@n@Wq>C-gquH]Ps!m6*Nf&F>LQ.@LK77ieNOF7UHuM\fBQ$F9H@1*j:/+V`
+:elq*LkUP<L@^&uN;eb8MYr;3LkkuMpW*EXb0'_-s31Phrm1Vl("1R[eCE.%g"P3;i8`tam-jN;
+pA4a$s!-3jd+H1>TpV@<Q'ISsOcbfjPEM,rR@'2#O,]*WLkg\?Knf2PA:8rXJqJ`2LP^kGN/is]
+P*;/sR$jG6SXuLJUSOcbWN*#$Y->1;['mEQ\\#Mg^VI_(`Pom=aihoRcHsteeC<($f\,!5h;-uH
+i8WeWjQ>UfkiqBum-O--n*fc8nac8Bo^r.U!quB_rV6Egs8)ZjrVZWmoDX=@JcF@%J,~>
+JcC<$JcGcMoD\^erqu]ks8)ckrV0"Zp@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bK@oH`PfX0^V7@m\[])UZa-g=XfSP$77KgB:/U^_rDE;cs%rho;,R9gpe_#fnPT6_
+q,%GS0ekLA1,LmS5lEqI4V'Y:3]fA^3B9&X4[)"l5!T!/s%`Pf"$T=Q;uKPm;?'Mo;tX,h<W?%u
+;uTVq;Gg<g;Ya2h;@$3!;c?Xp<E<0"<<-"t<W?%u;ZKeq<W6&!<<lK%;cHas<`T,u!EN;#<r5np
+<rZ5$<rH#!<`T*!s&]5&s&o>'s&T8(=',B%q,dPrs&]2#!E`G&<WZ9%<r,ns<rH)$<`N0!<rZ7u
+<p<Zc<qobo=9M]+<``B"=Su5#=Su8"<WH4p<rQ2!=Su;%>5hY)>5_\*>lS%->l7h+=o_e)>l@t.
+?3=PB@:K4Gs'l":$=@1K@:E_WAnYpprG;IM/8fBGEcZ>EFa&+WI=?ZrJ:`E,KnbA>NK90aPEV5t
+R@9P2R@B\7S=Q4BT:l(T*hoI,Vl6SpXg#1?\%0/d_o9aAcdC7pg>1ZEiSieVroF+@.cc4_=]eR"
+;c?dm:.[l<792c63\Mj94?G/L84Z3<2DdHT3]U8@<)ZUknkfCGrepf6r.tT5LN@NWEqj_UFT-F]
+G5ZR`G5QRaGlN%3H[UErKnbGBNffQkR\-@QXK]1I_o^6Tf\5-;iT&tZjo4E?kPsZEkPjWAjT+B8
+j8@s<j8%aAj4nf[Fa@J&=8l;&='#<%%TZS1='/R/=]ed-<`N+!r_iepnPEbEIt3-'KSG8=M2R=Q
+O-,ThQ'Rf*S"-%@TV8-VVPgDnX0&P/Z*UgG[^`l[]Y;.r_Sa@3a2lBGbg+M\dF-Oof%8R-g=tH>
+hr*GPj5]4_k3(smlKdg'mI'H3nF5u=o(2MGrq-?dp\4X]s7u]kr;6HjrVc?eJcC<$fDg@~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrV-Hgp@eLY7eH<Co'u5<n*]T0m-Es$ki_*jjQ#7Yi8<AHgY1?4
+f@AC!dEp1`bK@rJ`l5j4^q[Rq]",8WZa-g=XfSP%AS?13KpJ3tm%!sBpmV2Os.'(XoUPrPr1<hW
+s,S"RLlRLT@Afs#V4sZWT:hjKR@9M.P*1s!rh'4^"J)-UTqMCu$,;^eHA.QHP*;+-PkL=?P5:@B
+Pl-gBQMm*IQN*6JPRj%DQ'IZ$Q^=),R@0M5S"9PNrLj4cqkX4f$Ds`!W2Q\qX/i>&ri?.$WrAsq
+W;rstWtMM9Xfnt7ZF%!H\$rlW[^EHJZM:[2Yck:7YHFt,WN#ios/#gpVYm=lVZ*ClV#7"fU]RBi
+V>d@lV#[FmVZ3LiV?3ZoW;`^mW;`[pVYm@lW;ijqW;iatW2ZbrrN#mu!j/W/rNQ1(!4)U1!4;X2
+"15D@ZMV!+ZMh-0[/RH5[f3c9\Gj)>]*#^Z^:sQ\#/J'k`5Td<rlGu!bg+P`eCN:,hr<_[lgOB8
+oCV_Mq>C5ks!b"H`fmm1W55*pO.r`!\<*87?;sseQX!adTr)!t>$tZ@>-Y<:Y-"n2qQTh"repf6
+r/(H0!/HL4+Q!.prS,*4c,.60]XkVa]=P_l^rjd:]XkY^]<ecIZ`s#(?[[BRJ:`E-L51VCN/`jY
+OckroQ^F21S=Z@HU84T^Vl?\tXfnt7Za@0M\[oGd^;%M$_o9X:aND]McHjkbe'uq!f@\g2gtgiE
+i8N\UjQ5Odkiq?slg4!*mdKW6nc&([oCW%Ts7ZKerqQNhrqcQirqu`noDX=@JcF@%J,~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrV-Hgp@eLY7.g*Ao'u5<n*]T0m-Es$ki_*jjQ#7Yi8<AHgY1?4
+f@AC!dEp1`bK@rJ`l5j4^q[Rq]",8WZa-g=XfSP%=^PcWF*lVks+13%rdj9b*,B8!ASGpp;La(@
+H[9s^GBS.NEcQ/=DJa35G'Nt/$[6c=GE7fENc0)XFo-RcIJnWkJ,auqIK"]lIK+cnJ,ausIJnNo
+I=D$Brdb'$r.,'(K7ei1L5,S\r.tB0reLQ2r/1N4q2531rJV#?N/`jXO,oBarfR,As,m;B!0@)=
+rK$o;rf-r9rf$l8",`"qMu/J4M?JcnMM[2gM?\urMMm@KM>`>4MYW21Mu\e7N;\Y:N/NOMrJU]7
+rJgi9!fN"spPo67rK.&Arf[8Es-!#<rK@/Dr0$uA!0m8D"I>C@R@4&Cs-s"X#+_?WTV8'RrhD-B
+V5L8kWiN8*Z*_!M]=l"r_8=(-`Q60EcHt%jf\,$8hr*MTk32-tmdK]:o_%qVp%nC^oa(9dq"aa^
+qu$HGs!mr-N1bW`MMRdUJTuTtPDs[.Bh^o`DfJNGH[:'7:/"S`:eln)LkUP;L%BusMuS\4M>rA3
+L\]!pai_cLbfp(2s3;J-d*U4ie'uq!f@\d2h;I>Tkj%R)oC_qW\c360d]V36aJ>&iR[05&PEM&l
+rfdnVPaRu)OcPN^NJ`OHLkbJS?[[BRJ:`E-L51VCN/`jYOckroQ^F21S=Z@HU84T^Vl?\tXfnt7
+Za@0M\[oGd^;%M$_o9X:aND]McHjkbe'uq!f@\g2gtgiEi8N\UjQ5Odkiq?slg4!*mdKW6nc&([
+oCW%Ts7ZKerqQNhrqcQirqu`noDX=@JcF@%J,~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrV-Hgp@eLY7.g*Ao'u5<n*]T0m-Es$ki_*jjQ#7Yi8<AHgY1?4
+f@AC!dEp1`bK@rJ`l5j4^q[Rq]",8WZa-g=XfSP%84Q<H:Jga_r_`Acr_WYnr_`\lpeh#enko<_
+r)"%_1G^aA1c.-V5s[_"5!M1m4T7AG4#f2[2a0G)4UaP=5<M+m:/4MX2b$UB;>sDk;?'Mo;tX,h
+<W5r";c-FjrDEAgrDEGir_ir!<E<+!r`'/'<E3!s;cWft!*0#!s&B,";cENl!``9&rDrqu!*&qt
+r`9&!r`9"ur`0#!r`0##r`B/'r`K2%!E`G$<r#hr<r5tu<W#ku='#6#"]e]+=BAT&<WZ?'<rH)$
+<`N/u=8u=t=8uCj=8c5*='/O)<``B#=T);"=Su8#<WcE*<`]3$r`0)#<`]0#s&f5&qc`r&r`oG,
+!*oM-!*]A+qcrr&5$q`-@UW\S@UWYQ@:EbYB5)-tD/XB3Df0H2E,p#BG'A1VI"$QpJ:W?,L5:_G
+Nf]EfQ'Rf(Q^F/.R@'A1rgP4&S"6+AT:qsRV5L8lX0/\5[CEf]^r"%/aNMiSdad")gtgiFiVqm9
+j=fQQio/hO[9-O?;--[o=A;I\5=.k25WC\Q+t#K80eu6f75m1`4$#A^<)lmp;,Zs^repf6r/(H0
+!/L>j"*A[.GPu^`FoQX_GQ2pfGp7Q^It<6,Ll.1QP*MB(TqnZiZamiibgP(qgYUlJj5f:_k54?A
+joFTDk549>j8nB'qr@S7s5j.=r8e.@Q#gJ]?Y]RB$WgA0='/L*<`W=(=oMP'<XDi.<`N's<)QRi
+o2/kCIXls#K8#&8M2I7ONfT<cPa.T&R@B_<T:r!TUo(&hWiW>+Yd1UB[^WfY]Y(tn_8=+/`lQ6D
+bKS8Xd*^=le^i@)g=k?<hV[8MioB+]k2tmll0@U$m-X60n*olHncA@Srq6<bs7cNfs7uZjr;6Kk
+rVc?eJcC<$fDg@~>
+JcC<$JcG`LoD\^erqu]ks8)ckrqQNf!;?Eb6hL!Ao()>?n*f]3m-Es$l0.9ljl>C[i8<DIgtLH6
+f@AC"dEp1abfe,L`l5j4^q[Rq]",;Y['Hp>XfSO1@r$4:N;T1AS,f&NSGnuXSGo#QRe`HGSGo)X
+Sd(aWNfK'SNrG"P?_sWrU7e6QT:hdGR@'8)P*D'"T`1MkSXuFGTt\7R^O`q<JbtZ.PkL=@P5LLF
+P`q@/Q2?mGQ2?mHQ2HmHQ2d0MQi<BPRKf7OSY2XLU&LbdU\gkcV$<fpVl?\rX8]4"XTPZ*WiGur
+!36%!riH^7Yd(L?['mKU\[f2Y[C!74Z2_$3YHFt,WMofo!N)doVZ!FmV?3ZlV>[1gV#."hV>[:k
+V>6tjVl6Mkql':f!3#mrqksLori5ptriH:*Xf\f*Yl1g,ZM_'*[03kCZa@+3ZOsRP[^ENO[^WcV
+\[oAa]=bhjqn<6L_84"+`r=!paND]Mc-b%lg"bNHkN_F'o(;VLq"ajeW;e=A^8\!!T;JN]V4F$2
+T"X!MQEGpRJm"4;?(RX`W*<M2?X6j?Z*LU:Xnf3sYQ'O\MYr>2L]E3gruf5Zli6"^d*9PG^:h.f
+]"GVe^;S"6`P/so\@JuPZ*LV)Y@W*0IXm!%K8#&9M2I7OO-#NfPa.T&R[]k>T:r!TV5L8lX0&P.
+Yd1UC[^`lZ]Y2(q_8=.0`lQ9FbK\>YdF-Lne^rF+g=tE=hVd>Nj5]4^k3(sml0@U$m-X60n*ol<
+o(2JFrq-?dp\4X]s7u]kqtpBjrVc?eJcC<$f`-I~>
+JcC<$JcG`LoD\^erqu]ks8)ckrqQNf!;?Eb6hL!Ao()>?n*f]3m-Es$l0.9ljl>C[i8<DIgtLH6
+f@AC"dEp1abfe,L`l5j4^q[Rq]",;Y['Hp>XfSO'>%22aGMn#LJ,FinJa@suC1q6kBkV6r:jdV:
+H?a`7Fp`>4EH5u9DJj65H2VpcG6rMUOH#9/LhLgUqgA?js*j]lqgJKnqgJHmr."Wns*aop!e#NH
+qg\Wrs+10$s+(K.K7ei1KnbA<M#N20M#W>3L]E;1M#W>2MY`80MZ8V4N;nn;NrP1?OT1IBP5^[F
+Oopi.OH9@#qN(W9q2>?4N;eb5N;nh8MZ8M8MMm@Lr/:Q3repf6pl"j)!fMqnrJLZ7rJ^f;rf$l:
+q2YH8s,d5Br0$i=rf[;F"I,+6P*5C"rK[8Gs-EhTR@0N@RfK#XScGD^TJ<.8UnsrfWiWA-[(!TX
+]thJ%`5T^9ai_lRdad"(gtprIjQ>XilKdj+o(;VLq"a^[rqHHfqtL-c"S_]eqYeqD,JT\-Mh6V;
+M2$b;IWKdp[sW4GAl)u/DFmQLH[L?=9h\G^:]?4RLP:D9nq@%$s,-`2s+gc4a2l@$aTTc0bKS30
+c2Q!)d*^7heC<%#f\,$7hr<b[l0Rm0p%S=][JqB4S(4RZVNm^CQBd]!P*(rmPE_;tR%'J*OH5B[
+MM[%BnV(P%I=?]tK7el4Ll%"JNK90aP*D5uR$sM8StD^NUnsufWiN8)YHY==[C3TU]"G_k^qmn+
+`Q$!@bKJ/UcdC1ieCE1&g"P39h;7)JiT&tZjlYail07L!m-O--n*fc9o()DDo`"Lbp@n=[q#C0i
+qYU0hr;HTcrdk*#s4I@%~>
+JcC<$JcG`LoD\^erqu]ks8)ckrqQNf!;?Eb6hL!Ao()>?n*f]3m-Es$l0.9ljl>C[i8<DIgtLH6
+f@AC"dEp1abfe,L`l5j4^q[Rq]",;Y['Hp>XfSNl84ZEL:\@Wc;>*ib;>jDd;>X2\;>jDm;%,<<
+0etO@1c70W5sIU556!_I4$#Jar\t-C3'BJi5!M:24UF;I:/+G66VL9RpJCui;cEHj$WC#(<E3!t
+;c?Rm;Z0Ji;Ys>j;?B]n;Z0Pm<<#tt<WlE$<*!*!<WcE(<`T,tqG[Vu<`W4#<rQ,!;ufqt<rQ)%
+<``=%<W,qu<W,tq=9Mc/='/Q&<Wc?&='"rp#?Fi(<EE7&=8l8!=8u>"=8l5%=&rB"=8l8"<rc;#
+<<-(s<s)Q+='5#pr`K2%s&f8%qcEi"r`0##r`K,#"BJT*=BPQ(rDir!<rQ/%=BAW$=TDY'>6J,4
+>$P>3>Q7t,=o_e&>l%_-?=.+>?OL7M@:3MQ@Us+dCi0/h*H,h6DJsK6F*)PLH@('hIt3-'KS>5>
+N/s'`Q'[p;Rff+KS"0JK.A!3+TV8'OT;&-ZWiWA-ZaI?U^;@e,`lZEKcdC1kf@o!8hV[5KiSrns
+jT"6rio/hQh;$`:enJJo=&i:"<)cRd8OYg3=$\c,0.Jb-3\E-W84>p*2E!TX3E9'Y<)?CinkoFF
+s,-`2s+gZ1r,_m\s*"Edrc\<ar-&$_s*,c6H@(*kJq\u:MiX!bQC=D?VlR#0]>DY7eCWC/hr*PT
+jQ>V!kPjWDjT+HBjT=N)jo4??j87p9jo+9;jo4BfkMa=9??0"Y>ZY*2='/L)<`iC(=BAU->$>!-
+=&r:$;c?Xn;"@IpI!pHoJV/T/L5:\DN/`m[P*2&pQ^F52SXuIIU84W`W2co#Y-5(8ZaI6O\[oGe
+^VI\&`5Ta;aihlPcHjnde'uq"f@em4gtgiFi8N_VjQ5Oekiq?slg4!*mdKW6nac8BoCW%T!quB_
+rV6Egs8)Wirqu`noDX=@JcFC&J,~>
+JcC<$JcG]Ko`"gfrqu]ks8)ckrV/qXp@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;Fg=k32
+f$r0rdEg+^bK7iF`P]R.^V.:k\[T#SZa$a:XK#lEEHd/&q4%>QrL<\S!1WbRrgW\Oq4%&Irgj"Z%
+ZZU-KoM(Q@&9ZtV4jTUrLXFdR@'5&PE;<*StH"R".c*YU&D\-d%,K@r0-r@plk]?r0./Fpm(cCs
+-<DGrg!GHrg!ML&XSlOQ^O;3S=H4DU8+N[USOabV#I4jU^<lpVl6VrX/rD)r2p7+XK8J&X/c0"'
+<J@>YHY79ZF%$L]">Sc\[],VZi76/YkbR(YQV/2WN)oqVuERjVuNUsV50l]V#I4`V?!IhVZ3RiW
+;*7kW2]Tks/?!ur2Th"rN64(Y-7f.!4)U/!4)R0!4;U1rj2^6[.L^)[K*`7[f<fA\@K2_]=beiq
+S"&d^qmn)`5Td<aN;TKc-Ohgf\>9Ajlu.#o(;VLq"t#cs!aqEURA!WUTpJ]P,#/&^lG"=>?4ddQ
+rmO`TVPaq>[h#D>-P6:YcY.4qlok!!/pi6rJCQ1!/HL4,/O<NqWHAOccEo9^:^qe]t:nj_SOI;_
+Rm=f\$iWJYd(@4o<2qWI=HcuK7nu6Ll%%KNfT9bPEhH$R@9V9StMdPUo(&gWiN8)Yd(OA[C3TU]
+=bkm^r"".`Q-'BbKS8Wd*^:keCN7(g"P3:h;@/KioB(\k2tjjl0@U$m-X60n*ol;o()DEo_%nNp
+@n=\q#C0hqY^6ir;?Ncrdk*#s4I@%~>
+JcC<$JcG]Ko`"gfrqu]ks8)ckrV/qXp@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;Fg=k32
+f$r0rdEg+^bK7iF`P]R.^V.:k\[T#SZa$a:XK#H0B5;L5k^`V]qgeWpq1/BomXcHnC1^shC26[p
+H[L0cH$=FSG'%eHEGo`4CNO`DGl;dmGBe@oOH,<nHu=0+I/86kIe\EmIf"NnIf"QlIf+]nIf4]p
+If"WoJH(2tJdd9bKS>,9M2I.FLl$rcM$&QhLPYncs,-f7!/pf7rep`6rf-o;!frG)rfR5D!0dDH
+#Et=6OcYWaNqSP6NW>(7N;eb5N;nh8MZ8M5MYi;3MYN,0N;AJ3N!#&uNK*mqs,6o9s,-l9qi1T6
+rf-i9rK$r>s,m2Aq31c?!0dDHs,uo9!0mJJrKdJM!goCDqO.JTS=TSL4.r:@U8+N]Vl?_uYHkRG
+]"Pkp_SjF5ai_lSdad"*i8N\UjQGaklg4$-nauPLq>1!bqYBs`qYU0fqtp9lrVk1D"Q>B!Lk>V]
++cV/+G^Y@2P')%`91;9fE_&lNH@/I_9i=hb:5XmaLPCQRKE-r0MZ&D3L]E50aTK]/bfp"0(s^IT
+dF-Lne^i@*gYCZEjQ>^mmd]uDq>@Mt$.#%$Zb<B2R@KZDPnfLEPa%ArPE_<%R?NboNf8pRL4k;7
+nqCk,I=HcuK7nu6Ll%%KNfT9bPEhH$R@9V9StMdPUo(&gWiN8)Yd(OA[C3TU]=bkm^r"".`Q-'B
+bKS8Wd*^:keCN7(g"P3:h;@/KioB(\k2tjjl0@U$m-X60n*ol;o()DEo_%nNp@n=\q#C0hqY^6i
+r;?Ncrdk*#s4I@%~>
+JcC<$JcG]Ko`"gfrqu]ks8)ckrV/qXp@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;Fg=k32
+f$r0rdEg+^bK7iF`P]R.^V.:k\[T#SZa$a:XK"`[92&/ZqGI;jrDEVmp/(]bqGR)cq,$WZrDF"[
+1GgdB1Gq*V5X@X54p=&14$5VerAaa=s$$oU4?Ykl:/4MX;b'S\r)!GlqbdAk!)r_nrDWYor)<Vn
+rDEJjpJLrgr_rhr!`N&tr`'M1<E)t!<`N.#<``@)<`E$uqGdGo"B8B$<)ros!*0#!r`'/'='/O)
+=',9"s&]/$r`KM/='/O)<`N+!rDrVn#?Ff'<E<.%=8l7u=8u>$=8c1s<rc:t=8c,!<r5ts=T;Fp
+=8c8$=8l;'=]\]&=T;J&<rZ;%=oDG#=9;W-=8Q%t=8l=t=TDY(>Q.e*>l@k/>[(B8r*08.>l%b'
+?N4C5?iFI5@0U1NA7fOkD#.upDK'W<F`r%VI=HcuJqJc4LPh%NOHPlqR[ftBTqS3UU8"H\Vl9Tp
+,-.`DWN3/+[C<c]_8F74b08/YdaQ^sf\5-9h;7&Jio/nVrT!q;s5>KcgtUN6e^Ddda6%kS=B89u
+;cHIe91_B87S>p)2_-4'4Zb8N8Ol912)RJp3<`D^;cQXlnPK:EregZ2s+gi6FEM_LG5ZUcG'3V(
+s*+Kfs*>i9I=Hj%L5ChKOHYrtS=ugZY-PUQ`QQ]\f\>6?ioK1^k4\!8k549>jT"9;jS\-=jSIs<
+k54<fj3_dKJm;_h='/U,='8X,=BAR+=BAU,>?G!.=&r@$;cHUk:JgX[COCP[J:W?+L5(M@Mi<[W
+OHPfmQC+)/S"6.DTqeE\Vl6VrXfen5Za@-K\@K5a^;%J#_o9U8aND]McHaeadaZdtf@\d1gYL]C
+i8EVTj5oFckNM0qlg4!*mdKW6naZ2@oCV\Jp%J+Rp\ssfq>U6gqu6NkrUg)?s+14&s*t~>
+JcC<$JcG]Ko`"gfrquZjs8)ckrqQNf!;?Eb6M0m?o'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f$r3tdEg+^bK@oH`PfX0^V7@m\[T#SZa$a;Xf>iEFF8q2qjRSSopbrNrgW\QrL<\QpRCoIr1+k"
+NfT*SNK0!Y@&9g!U7n<SStVgJR@0D+PEV0#TDY8fTV8'l^:h:0eTc]FPlHsAPk^FBP5CICPkUI@
+Q2m3GQ3!88q3CuGrKdkZS"#q=SY;gTVl'EhrhTOirhLC-W2Q_rX/rG,Y-5%5Yd(F9XfSY+XKAS,
+riZp<Z*L[A[CEl_]tCtf\@8iMZ2Lp$Ym%>5WiE%srMT[mrhg.&Vl$>fV50o^USXgbVZ*FaVZ*Lk
+W;ijnVuN[qWV`XmWW0!tX8f:"Xobf2YPk^(YlM*.ZN7GAr3cL1s0hs7rj2X1qm6=0&@JsT\%&rY
+\[oDb]Y(ql^;'W\+2>V._Sa=1`lH3Cb0/&Td*pS"h;I>Ul0@^,oChtUrhKKCYGeC^_5*otW1900
+TtTBVQFi/lK3FI@?)+$eWEWY4?X?p?ZE^[;Y->,-YkP@$MYr>2M#W6hs!$Y+qu6$;`m;lF^:q7l
+]=khh^VIb0b/:s*]!o>ZZ*CU=XRiW'H[U<lJ:`E,L51VCMi<[WOckroQC+)0S=Z@HTqeE\Vl?\t
+Xfnt6Za@0M\[oDc^;%M$_o9X:aND]McHjkbe'uq!f@\g2gtgiEi8N\UjQ5Odkiq?slg4!*mdKW6
+nc&([oCW%Ts7QHerV6Egs8)Wirqu`noDX=@JcFF'J,~>
+JcC<$JcG]Ko`"gfrquZjs8)ckrqQNf!;?Eb6M0m?o'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f$r3tdEg+^bK@oH`PfX0^V7@m\[T#SZa$a;Xf>Q3B5Vg?mskCfqgeNmqg\ZrpON0mnUgdU$tX$a
+BPM9ZI!p?fH$T@3)09h>E,TZ3D0:)HGBS.RGBe@nOH#9*Tk\WIIK+]kIK+cjIfOriIJeQlJ,=Zp
+IJnWjJH(2uK)^K'KE['bM2I4Lpk]*/LPL]`M#iKlreq&@NfK*ZNfF$srJ^f;rJpr?rfR5D$C-pC
+Q'IStP*(fco8a!6NJrkoN;ne;MMmDlMu\e7MZ8P5MZ&J3MXl]*N;JS7N;eh7N:`,/NWG3$rf@&?
+!0R/AnWNs;rK@5Gq3(fCrKI8G!1!MKs-N\O!1E\P!M#_[TDtK:T:hpQUSO``W2cr%Yd1[I]=bkm
+_8OC9bg4_ff@es:i8N_Wkj%L$mdK];p%S:YqYg?lrPAL`P`:ZNR"^9HL4XkqH]P[bEf+[4@nCW2
+9mh86ISN[4;Gp8IMMI%CLPCQSK`?r-M>rD3LB5TBrQYAf(sgRVdaHXqf%8U/gt^iJk3;4!nFZGM
+qu3bu,13jG]tCMAR%9_5Pa.GqPE_8qPE_B%R[&tqNfB-WLk^_?nqCIuI=6TqJqJ`2LP^nHN/is]
+P*D5tR$jG6StD^MUSOcbWN*&%YHY:<['mHS]">Vh^VRe)`Q$!?b0/#Scd:(geCE.%f\5'7h;7&I
+iSrnYjlY^hl07L!m-O--n*fc9rpg*]o`"O`p&Ojcq#C0iqYU0hr;HTcrdk*#s4RF&~>
+JcC<$JcG]Ko`"gfrquZjs8)ckrqQNf!;?Eb6M0m?o'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f$r3tdEg+^bK@oH`PfX0^V7@m\[T#SZa$a;Xf=oa928;\qbm8fohbWbpJUfaq,$WZ(K*+I1,1R@
+1c73X5sIRt5!;"k4$#G`3W1r;4o[_E4o[\N9hnDW.T/u;r_i_mr_i_mrDNYoqc*Mms&Aem!)ibm
+r)3;e#Z+Ar;c?Rl;cEZprDa2*='&F&<E<1'=]kW&pJ_,mr)<Yrr)No"<``B%=T;G'<`f6#s&]5&
+s&TD->$G04=BGK%s&8tur`8hrrDrks"'8N(=8Z)#=&r?!<rZ2"<rH+u<rH,"<rZ1r=8l;)=&r@(
+=SPtm=9D].=',B'$!CA3<`N4'>$4u,=8c8#=oDG%<rZ8"=T)A&>5_V%>5qb*>5_\(=p8,8?!LZ@
+pg3r,s'>\4rF#Y6"_(tPAS,TSC&_p<CM[g)DfKlAG'J:ZI=HctJqJf6M2R@SP*D<%SY)UOVl?_u
+Xfo"9Za@-K[^W`S['mNW^V[t3bK\A\e'ut#f\5-:h;@/Kro3k9!94":3oAfLgY(3.d*9YN_S3Xl
+[]*J6<`*1#;Gg1]84Gg4=@5#10e4t.4>/EY84?!-2DmNW3*'$X;Gp@inPT=Dr/(H0s+gPspNHR\
+-?sf^H@('iJV/]5MiNj]Pa@l3Uo:B"[_9T#cdgY#gtq#MjQ5LcpZM84s5j7@!9<t;qrRk=q;qM:
+s5k!YkMk?<BQINh>ut-2=BAO*='/K%=9Vc0>$+p/r`08'<`;pr;Gg0[;.+a!I=Hd!K7nu7M2I4M
+NfT<cPa.Q%R@B_<T:qsRUo(&hWiW>+Yd(OA[^WfY]=bkm_8=+/`lQ6DbKS8Xd*^=le^i@)g=k?<
+hV[8MioB+]k2tmll0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kqtpBjrVc?eJcC<$g&HR~>
+JcC<$JcGZJo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_niZI3n*f]3m-Es$l0%3kjQ#7Yi8<AHgY1?4
+f@AC!dEp1`bK@oH`PfX0^V7@m\[])TZa$a;X^u*_G(Z"TS,JcUS,SlQRfJuUS,8`QS,JfJS,/ZP
+SK3`OMMR4MO'\Z\VPTuZTUqdKSXZ19QB[SpT:V^JrgjLjTqS-n]Y;(JT6uXsPQ6pGPQ7!IPk:1=
+PQ?u4rg!MLr0?i=!gJn5r0@8Is-N_P$CR?PS"-(DUo12irhfOgs.g@*VPgAlX/rD*YHP4:ZEppE
+Za$a=ric@)riZp<Z*L^C[^j&b^VIUs]"#,RZ2Cj$Ym%A8XK/D%ri#jp#c=Q!Vl6MjVPX6erMBLj
+rh]Oi!2o[j"/i#oVu3InWW&jmVu*FjW;rstX8f7$Xo5F"YlD!,ZMh*6[C3KN[^EOA[/[Q6[/[K3
+ZMh-/Zj!kG[^W`Urj`$?rk&6EqS"&e_84"+_o9X8aNDZKbg+S`e_&X5hr3VXl0Ig0pA4`]rt290
+T:2OOTWk,[O/&l"]9/h<r`05`QrdL]TqhTl$Y!IK>HtH?YHP+3YPk^!Y5jIXM>rD3LPu0Td.75)
+gqqC__S<gt]">Yg]=u(u_op'7]XbP_['HsCYjno.I!pHoJ:`E-L51VCN/`m[OckroQ^F52SXuII
+U84W`W2co#Xfnt7ZaI6O\[oGe^VI\&`5Td<aihlPcHjnde'ut#f\,!5h;-rGi8N_VjQ>Ufkiq?t
+m-O--n*fc8nac8Bo^r.U!quB_rV6Egs8)ZjrVZWmoDX=@JcFI(J,~>
+JcC<$JcGZJo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_niZI3n*f]3m-Es$l0%3kjQ#7Yi8<AHgY1?4
+f@AC!dEp1`bK@oH`PfX0^V7@m\[])TZa$a;X]Sh=BlJIhJGaoqJG=W`JGXoiK)]R*An>UhC/B>+
+H?sj]GBJ(PF)uGBDf9N/G'A4VGQ)dbGR'=jNf812DL280!.=Wks*jZkpO2meqLA6g!.Xiq!eGrS
+qh"j#"bh_hMi<VoMZ8M5MZ&A5LkgfaM#iKlreq5FO,f6]OHGTaNfB%tNr>"LOHGWeP*;/tR$a5*
+Q'@GorK$u=plGH8rJg`6re^]6rJU`7re^]4rJLW5r/1*(s,?r:!07&<rJgl;rJ^E/rJgu@NfT8#
+OT1IBP5gaFPkL=@OoUaFPQ-mHPQ-mGQ2QsFPld8<Qi39ORJN?RS=Z>LT/!%7USO]_Vl?`!YHb@>
+[C3TV^;7b/bg+Sbf%Jg6hVdDSjll(!n+$#Ap@nCZqu$Ek^Af,Hd#O-@JV8`1N.c_*I>=#GFa@^l
+77M398PT22##@uh;c?Ohre^i6L4k;8nq7"#r/(H0s+^U!rm(Pi(=:IWe'ut#f\,$8hr3\\lg=35
+pA+UaWW*IYUpRk=Um@RAR$Eo"P*>m0%[30CR%0P,OH,<ZMM[%Bn:bG$I=?]sJqJc3LP^nINK90`
+P*D5uR$sM8StD^NUnsufWiN8(YHY==[C3TU]"G_k^qmn+`Q-'AbKJ/UcdC1ieCN7(g"P3:h;7)J
+iT&tZk2tjjl07O#m-X60n*oi:o()DEo`"Lbp@n=[q#C0iqY^6hr;HTcrdk*#s4[L'~>
+JcC<$JcGZJo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_niZI3n*f]3m-Es$l0%3kjQ#7Yi8<AHgY1?4
+f@AC!dEp1`bK@oH`PfX0^V7@m\[])TZa$a;X[P`M9i"X_;Yj8`;#X>b;Z0Jm;ZBVh;"RTm2)@$C
+1c%!I5X@Y"r]UcS4?P\f4ZYS`3&j&a55m\G5!Am/!)EMf"$T4N;#O;k;>sJn;>X8k;uBVm;ZKem
+;u]_q;>O2d;?'Gm;>a>i;u]es<W6%u<<ZH+>$>$/r)NPl!*/qr!EN;!<WQ9)qcEi"rDrr"!*K5%
+$s6\<>?b95=&i3u;cWcsqH*\t#Zk,/<E<.%<E8os!*B(us&K,"rDrr"q,[Gq"'/K)<r?&!=T;D&
+='5B%s&T/$pfRMu!*K,$r`9A.>$>'3=BAU,pf[St!a&T.r)a#'>$Ci,r`];(s'#D+s&oA*"^>5;
+>[:Y7?N+42>[I;7"(#>A@/aRj@UiqZAnG^iB4bahBPVF&E-$,DG^4X`I=?WqJq\u;NKB?hR%0bA
+Uo:AuZ*^pJ\\#PhrkB;a^VRb%^qmq.aj/8]e(!"&g=tE<h;7)Kro3q;!T`;?i>UY2gtUQ9f@80k
+aMl!.]!o&OYHP+(IT]cP;uT\p:)-Dl5XIt15WC\N,UYc;/i$!g6oR"^r]:?F=&i4!;G^9];#lLO
+M>rD3LB2RBq0"32G^4R\H@('iJV/Z4MiEg\Pa7f1USk/r[Ca5pbgY1rgYLfIjQ,Fbk54<AkksTF
+ki_.+k5XQ=jSIs<jS7j6joaf/kNDg+%-QTYG$J$V=B\g0=BPN''NS@==&rL,>$=s-<EE.#;c?Xn
+:JgUZAUJoTJ:N6(KnbA>MN!OUOHG]jQ'[l,S"6.CTq\?ZVl6VrXf\e2ZEpsI\@K2`]t_A!_SjF6
+aN;WKc-FY_daQ^sf@\d1gYL]Bi8ESSj5f@bkNM0plg4!*mdKW6nF?)?oCV\So`Fj]p\jmeq>^<h
+qu-HkrU^#>s+14(s*t~>
+JcC<$JcGZJo`"gfrqu]ks8)ckrV/kVp@e1Po^qbGo'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Eg=b-1
+e^W'qd*BnZb/hZD`P]O,^:_(g\@/fOZ*:C5AnZ45L6qb+p6tTBs.&hQ!1NPLqOIJS-'"+HLQ.@T
+O'ec]V5'cZTV/!OSsYq3QBIGoStVaIT:VXJTV&mr^&r&lHA)$Ws-<VKo993=rfmMMQ2R!NQ'R`$
+q3D,LQC!s;Q3rn@PE_;sQ'R`&QN!3[R$jD3S"#q>Tr"`fWi>uq!2fRgrhgF/X/rG+YHbIB[^W`V
+\@&]N[C*=>YQ(g>Z*UaC[C3ZZ^VRe'_8!Rk[Bd(7YkkU,Yck11ri6("WW&e"W2HSmVl-EkV#[=j
+V?!IlVZ!=kVZ*IpW2HQmV?3ZmVZ*LgW;<FfW;`drWrK+$XKAW'Xokf/YHe)2!3uL.rNcR4[^H+A
+!4Dd4!O]B4[/[K2ZiIN4[K<qK\bir=]Y43V+MY_._SX4/`Q#s>air#TcdUItg>(TEioK:fmIBiC
+qu3;h.'9JGQ)LLRZ)!tUM4_ZAVjG)[G_]Ic=BqbrTrD0u>@1cB>-G-8YHIc,orn:Ms+p]1N;k.%
+ao)28j2T<f`P0+#]=Ybi]=u)!`66<@]=GJ\\@&TGZ*1>*Yl(\4H@1-iJ:W?*KnbD?Mi<XVOHPfm
+QC!u-S"6.DTqeE\Vl6VrXfen5Za@-K\@K5a^;%J#_o9U8aND]McHaeadaZdtf@\g2gtgfDi8N\U
+jQ5OdkNV6rlg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Wirqu`noDX=@JcFI(J,~>
+JcC<$JcGZJo`"gfrqu]ks8)ckrV/kVp@e1Po^qbGo'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Eg=b-1
+e^W'qd*BnZb/hZD`P]O,^:_(g\@/fOZ*:C5>@1uYF+*P.m!nMTr.4To%VfckAS>gmC/B;)H@'sa
+rHA<bEH1tr'5hW0GBS1TG'A1UGE7iFNDl-ZFS:.\Ie\BmIf4ZtIXQWnIJ\HoIt%6DrdOlsqgSQp
+s+('!!J5n!Jd6p^LP^tLNK!alre^W1r.tE2req/CO,oBaOd)&mOoCFDO,f8"Nt[V;OcYZePEhK%
+R@0G/QB[PoO-':"r/^c9!0-u<!0-u:s,-l7r/CZ6s,-f6!/gc6r/1K3rf$i7s,?u9s,?r:!07#;
+rJgl;rf$K/r/Uc;s,[5Cr/q&Drfm2A#F(F8P*;,oPP^RIQ'R]#QM?^HQC!s8QiNQQRfAiYS=Q8K
+T.ck3USXfaVPpPsY->1;Za@0N]YD>&air)YeCN7)gtpuKj6#XonFH5Fq"agbrVjA-.[#gMJ;T&6
+NJ3"4EdNqUK6)ue>%L9D8POY\H[edd9i=nd:l1$bL51M;nV$gss+p]1s3CYk'[b@Xe^i@*g=tKC
+jQGdpn+-,Gqu*Ak$,N7M^UpD3S",iEPl[&3rfn([Q'R`*RZrqoNf/jQLkUV<K_'n*H@1-iJ:W?*
+KnbD?Mi<XVOHPfmQC!u-S"6.DTqeE\Vl6VrXfen5Za@-K\@K5a^;%J#_o9U8aND]McHaeadaZdt
+f@\g2gtgfDi8N\UjQ5OdkNV6rlg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Wirqu`noDX=@JcFI(
+J,~>
+JcC<$JcGZJo`"gfrqu]ks8)ckrV/kVp@e1Po^qbGo'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Eg=b-1
+e^W'qd*BnZb/hZD`P]O,^:_(g\@/fOZ*:C584Z?I:f7'eqGHr_r_`2`!)`\mr_`JfpJD&M1G^^@
+r\O^85s[^6592jM4Zb\d3&ioX2`Nr`5!;%m4[)%m9hnDW.n`W7r)3Pl!`2`kp/1lhr`&bns&Aqq
+!)iep!E)ek;Z9Pn;Z0Jm;#aDj;Z0Mo<;oo*<E)pt='/[2>$4o(<VfYp<W,ku<E<2u<X2`0=]eg1
+>$1]'r`K/$$s6\;>?kE;=BAO&<)rfrr)`o!!`rK*r`0&$<rQ)&<``='='#<#r`0##r`9#"qc3bu
+<`]-"s&T)"s&]D*<`W=)r)`o!s&]"us&fD*=]t],r)j5->?Y35=BP)r!a&T.r`B/'qca#&"Bnr1
+=BbZ-r`]>+r*05-ra#_5>[1Q@r*KS5?XI2LrF.NmAS,OeBP;!hAnPjpD/XH9FEVnSG^=^aIXm'+
+MN=!gS"?:KW2m),[CEf\^VI\&_o2Pn(<4G:a2Z0AbKeJ`e^rL.gt^`Ahr!ANro3t<8`J^fi8<AF
+g=Y$-da67]a2,I"[Bd!<Wi;qqVl$<8>ZY$+<)QUi9hS&H5=SUB2a/rI1+G@>0h+Z#7lN=`3]oD_
+<)cdq;,U?_;>c:NM#W8.G5c^cGlE"7I=Hg#KnkPEO-5]mR\$7NX0/h?^r=OFf%Jd4hr3YWjlPXf
+kPaWEklU)3kPj]EkPsZKkN:pgjlGP$jS.d9k5FE:k5OQCk5OQDjp^@h?sI,M?X$T9=BAT'=:/,4
+=BS^/=^#!2=8l5*<Dugq;,U4eo2/nAI!pHoJV/T/L5:\EN/`m[P*;/sQ^F52SXuLJUSOcbW2co#
+Y->1;['d?P\\#Mg^VI_(`Pom=b0/#ScHsteeC<($f\5'7h;-uHiSrnYjlY^gl07L!m-O--n*fc9
+rpg*]o`"O`p&Ojcq#C0iqYU0hr;HTcrdk*#s4[L'~>
+JcC<$JcGZJo`"gfrquZjs8)ckrqQNf!;?Eb5P4R<o'u5<n*]T0m-Es$ki_*ijQ#7Xi83;Fg=k32
+f$r0rd*Bq\bK7iF`P]R.^V.7i\@/fOZEUK?A8HC<Nqo19Rd$:ARe<0ISGSipN/iaMOH5B/VPgAi
+U8"<QT:qmJS!fY.P`l$<#+hHYStVjPrk8QL^6*MeP5(:@Q2d*@PQ-mIQ0jn9Qi33MQ2[$JQ2d0M
+QiE?PQ^Rf@s-sUkTqnWeXK/A#W2?GgVP^3hVZ*J;WN3,&YHY@A\@T;a]tCtg\@K,XZ`gU;Z*CXA
+['dBQ]YMGa`!+#n]=>5Rqlg++Yl1j,YQM)2XK;E%!NN*tVu<OpVl'Ehqkj=g!N2geVu<RoWW&gt
+WMlcoVt[.fW=Q#0Xf\\,Xfnn/Y->18Yd+,3qm-:0rj;a7rO)U4pp:%/rO2a8!4hs;!kZ.ZrP&<H
+!l2XhrkfVm`lH0Ab08/Xe(31*h;@/MjQ>[ln+65Iqk=$@n%u!1Tq7sRS?noYNMEQ'\s&b;=&rC`
+QWIF_U84_m>@V#H>HkB=Z)t.4Y5YZtYPj=XM#W51L5c-Vec5RFkg[Z!aMGU(]tD(m]"Ytu`66?B
+^:_%e\[A]GZ`pP+Yl(\:H@($fIt3*&KSG8<M2R=QO-,ThQ'Rf*S"-(BTV8-VVPgDnXKA\1Z*UgG
+\%0)_]Y;.s_Sa@4aN2NIc-FY_dF6Uqf@S^0gYCWAhr*JQj5f=akNM0plKdg'mI'H3nF?)?oCMVR
+o`Fj]p\jmeq>^<hqu-HkrU^#>s+14)s*t~>
+JcC<$JcGZJo`"gfrquZjs8)ckrqQNf!;?Eb5P4R<o'u5<n*]T0m-Es$ki_*ijQ#7Xi83;Fg=k32
+f$r0rd*Bq\bK7iF`P]R.^V.7i\@/fOZEUK4>[hDdGk$=JJ+8'dJbam<BPD$gC27K[IXHNiH?sdY
+Fa%qJEH6&;Df']CG]s(1rce^2OH5?[F(fK=p3lmgom[$lI=:j=p4**ks*slos*t#u&qPXcJV&K+
+JUrE*K8#&9MiEdWq253/s+pW1s,%)@NK'![OcbfjrfdDHrfR;EO8b.@O-#M'O:ID9PaIl-R[]b5
+Q^!YpO8P"=O,j4#r/Lc:rf7#<rf$l8r/CZ6s,-c5!K)g6M?/Wmr/:N4!0-o8rf$o<rf-f8s,I&=
+r/L]9rf-f8s,[/@r/q&DrKQr<!gJn4qih)GrKd;Frg!PNqO%;NrL*hXS=Q8KT.HY0UnjiaVl6Vs
+Y-5(8Za@-M\\5er`Q69MdF?^tg"bKDj5oRoo(D_PqY^?$rrfa$Nff+rKd2/.KR\/mKpdpDH"]`;
+7rN?<9mV26J58p>;Gp>KMM[1DL5,2NrJCQ1s+_;CdF6Uqf@\d2hVmMWl0Rm/o_84\U&Q=`W6W&h
+Wh5ZKR[05'Q'@Q!Pa%H!QCF>.OcYT_NJWFFLkbJSApSfOI=HcuK7nu7Ll%%KNfT<cPEhH$R@B_<
+T:hmQUo(&hWiW>+Yd(OA[^WfY]Y(tn_8=+/`lQ6DbK\>YdF$Fme^rF+g=tE=hV[8MioB+]k3(sm
+l0@U$m-X60n*ol<o(2JFrq-?dp\4X]s7u]kr;6HjrVc?eJcC<$g])d~>
+JcC<$JcGZJo`"gfrquZjs8)ckrqQNf!;?Eb5P4R<o'u5<n*]T0m-Es$ki_*ijQ#7Xi83;Fg=k32
+f$r0rd*Bq\bK7iF`P]R.^V.7i\@/fOZEUK"7n66J:AIfb;>!cb;=IH`;>X8k;>F&a;$/U01GJeb
+"#`D15lO"J56!bF3tXS93B9&X4Zttl5<V.n5<hh:r_3DV:&@ig;>j>k;>=#h;uBVi;uTYp;ta,h
+;?'Pn;?'Pm;?'Po;#jMn;Zg!!<`T,u#?Fo-=^,'4<r,es<)r`n"'&B'=8Z)"=^(f-$X-b<=&r=%
+<``C)<rQ/.=^,-:?!LQ8=BAO'qc3f#<``B%<WZB)=8l8#<ruE&<Vfes<X;c-<``:$<`W;u<rH%u
+<WcH*<`]3%!`rK+r`B,%r`T2$rE'&&rE0&%s&T5'=oMV(=TVc0=oMV)=U&&6>$5!3>Q.h*=oDP(
+=TMW-qHE\t"Bo#6>[753r*98-s'>h6?=$oDq-O/1@JsX;@q91arb)^QAnG^jCMdp+E-$2Hrcf6*
+H[^O!LlIR`S=l[UX08h9\%95c^VRhe`WO9&aiaV+$d-Q4bKeMaf%A^3h>Z:2huDX6iW%j9halSY
+g=b*-da-.[ai2*0]!\iGX/MnlUS4BSSt)@@?sH`9<Dl^n;,C"[7R0:17mK$m-mU3(4"`6Z845p*
+2EX#^3EK3[;Gg9Z;>l@OM#W51LAlDsGlN%8H@:9oK8#)<N/s*cQC4>=VQ-f*\A,u)d+6k'gtq#M
+jQ5LckNDj.ros@E%I**?kND!jkN:pgk2k_(jS.d4k5XWAk5FKBk5FH^k2kaejPng2@;B@\?<C?5
+='&O+=BAR+='&O-r`T\1=&i:#<E)jp;Gg0[;.b-$I!pKpJV/W1LPUeFN/is]P*;/sR$jG6StD[L
+USOcbWN*&%YHY:<['mHS]"G\i^VRe)`Q$!?b0/&TcdC.heCE1&g"P39h;7&IiSrnYjlYail07L!
+m-O--n*fc9o()DDo`"Lbp@n=[q#C0iqY^6hr;HTcrdk*#s4dR(~>
+JcC<$JcGWIo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_niZI3n*f]2m-Es$ki_*ijQ#7Yi8<AGgY1<3
+f$r0sdEg+^bK7iF`P]R.^V.:k\[JoPZEUNGAo`0OQ("0>S*ug?S,SlQS,JfMS,8`RSI^gCMhmFT
+OC2InV5U/^TqVIX)P3FeR@08%SXuFGTUqdKTV8'o]tV7FOF)\HpltcC!0m)=s-3PKrg*PKoToND
+!go=@r0@JNPa%Gurg":cQC!u,S"#k8S"6.DV5L;nXK8J%Vtm2DVl6PnXKAV.Z*h-T]t_A!_8*du
+^V.4fZ`p[=ZEggD[CEcZ^V[t0a2c*4]=5/RZMh!-Z2Us1Z*LU<Y5YR&X9>Q&W2HQlVu`fnrMB=e
+"/VlnW;WXmW!0)tVl6SnpSmkbpo+=pXKDK'!3Q7'"L,/9Yd+)2rj2X1!OK30[f3`;[^EO?Zi[YD
+[f*Z8\GEcc]=bhk^;%Cs^VRe)`5KX7a2l?EbKS8Ydam(*hVdAPj6#Rkmd]rCq>Hud./0jEUmn?Z
+T=^njOeo>#jKb/\PBVb4P?2(eT:r2e>$GBA>[">8[]o_6s02*ure^Z2s+^T/N;j4Xs8DudfuhO]
+_Z%7a]Y2"j^;7e,b07l@^UUec[Bd'DYcdc*qlag^H[U?mJ:`E,L51VCN/WdXOckroQ^F21S=Z@H
+U84W`W2co"Xfnt7ZaI6O\[oGe^VI\&`5Td<aihoQcHstee'ut#f\,!5h;-rGi8WeWjQ>UfkiqBu
+m-O--n*fc9nac8Bo^qhLp@e7TrqQNhrqcQirqu`noDX=@JcFL)J,~>
+JcC<$JcGWIo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_niH=1n*f]2m-Es$ki_*ijQ#7Yi8<AGgY1<3
+f$r0sdEg+^bK7iF`P]R.^V.:k\[JoPZEUN;?"RnoH1HLWJ,XumJ+A-cJc(*1CM@BlBk_<[:jmY<
+H?a^[rcScnF)l>BDf'ZAG'J:VG^'.4#`t+,Nc'#WFaX(7!IfInIe8*jIXh*@npgLbs*sutqh"j!
+s+:9(#).kiMiNgUrJLW5s,-c3rJLW5.?0@LP*2#nQ'Rc&QBd`"PECodNfT9`OcYZfPE_E%S"-%@
+S!]M,PECt*NW>.>NrP19Nr=t5N;AJ3MZ8S:MMmFPrJUT4rJ^f9rf-`6r/^i;s,I&="-8J%NV\\6
+Nrb?)rK7/ErKR5Ds-!5BqNUrDrg*SLqj.8Kqj@ANrL3bU!h>gQrh'4`s.Lm:UnsueW2cr%YHbF@
+['dBS]Y;2!`lZKPdaZk$g>:lPkj@s5q"jperkAF4rr;pQr;6<`oC2e%OcYBPMM6\HL4ac$M35K1
+FG"F6AS?!R9mqA7Ini^4;Gp@fMM[7IL4tA9nV$mus+p]1&;Jcfg"Y?@j5oLkn+-,FqYZoa$MV9b
+^qR%IR@Ke7rg!AFs-E\S$CR*?NfB'WM2$h@nV(e*H[U?mJ:`E,L51VCN/WdXOckroQ^F21S=Z@H
+U84W`W2co"Xfnt7ZaI6O\[oGe^VI\&`5Td<aihoQcHstee'ut#f\,!5h;-rGi8WeWjQ>UfkiqBu
+m-O--n*fc9nac8Bo^qhLp@e7TrqQNhrqcQirqu`noDX=@JcFL)J,~>
+JcC<$JcGWIo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_niZI3n*f]2m-Es$ki_*ijQ#7Yi8<AGgY1<3
+f$r0sdEg+^bK7iF`P]R.^V.:k\[JoPZEUN%7S?HP:f1*f;YEuc;#aAm;#X>^;Z0Ji;Z9Pi;#F0)
+2)@$C1c$sH2*jJl5<_7o5!:tg4T7AV3B'&`4[)%m5!;(o4\eaH9f5@6;,R9ir_`Vjs&&Phqc*Pn
+ku.OY!)iep#uXVt;Gp@h;H$Nl<!uW(<E3($='/U.='#)rq,IAps&]5&%Tcb8>$>'3>?b95<`E%!
+r`B,#s&T8(>$V#4#$Y85='&L*rDj/)<`W4$<``E"=8l7s=8u;$=8l8#<W6&!=8c1u<W?))='/O*
+=BSd/rE9/%rE'&&rE'#$s&o;&r`KG-='&L,>$Ci,!E`M(=p%o2>?_#/!*]A+#$P,3>$G06rE9/(
+r*/u"s'#;(r*98-!+,Y3ra#b9?XR8K?i=@5@:K1F6Y'b?BPD3qB4kmlCM[g(DK0cAG'J:ZI=R$.
+NKfg$Tr+ilZ*^sL]=ktq_o0R8aN;TJbfn8Sc-4ARc-Xtkf\>3;h>H+1hqn@g:Ya[Vf[eU#c-+2J
+`5''s[^30<WMZGaT:VUCR[KM-PE:f^aa@;q=&N!r;Gg4_83oU3?V34=0J"t@3\N3X7n,s-2)REV
+3]U/=;c?Oj;t*Z`M>rD3LFS%'G^4U_IY!-*LP^tNOd)0"SYDs\Y-PUP`6-HXf\50<i8`n[jlYah
+kks]Dkl0iHkl']Ejoa`-jlQL&pZ;;7qWIn@r9"(Bqre"As5j:As5O@HhOS;$@:<I@=TDP$=9)D$
+<tAG9>$5$2=B8F%=&`*t;,?^ZCjLGVIXcm"K7nu7M2I7NNfT<cPa.T&R@B_<T:r!TV5L8lX/rG,
+Yd1UC[^`lZ]Y2(q_8=.0a2lBGbg"G[dF-Lnf%8R-g=tH>hVd>Oj5]4_k3(smlKdg'mI'H3nF?&>
+o(2MGp%A%Pp\4[^s7uZjr;6KkrVc?eJcC<$g])d~>
+JcC<$JcGWIo`"gfrqu]ks8)ckrV/bSp@e1Po^qbGo'u5<n*]T0lg!a!kN:pfj5T%Uhqd,Cg=b*/
+eC;pocd'bXaiMK@_ns4(]tCqe\$iWKYchPPEd`oDRfAlIRK/cTReiNNRf&ZPRe`HKSGo'1OH5<S
+OGo</VPg8dUS+6PStMaJR[KM-P*)E/StM[JTV8*S^;%@qJ[]cOPl?pUPa.MuPa.JuQ'R]"oooB>
+rKRAKrK[&As-NbQrg3VM!L8oKQ2d0KQP5aSR[KV5S"-(BU84`fXfee+W2T]nrMC%%W2Q\sXfek6
+[^j,f_u@UU`5;Mi"i.d\['Ht9ZP^'W[^j&b_SsU=b/qW<]=52TZa$a>Z*:J3Yl_/5Y5GF$Wr]6"
+rMTapVYm7kVPX9hs/5mos/5mqrhodp!NE$iW<0-"WV<@hW=>l,WN*#"Xf\\+Xfek2qm$()rNlO0
+"1,AA[J[H5\,E]8[^H(@!k#JFrjMm<rOW$@rON*C]tV8[^^%]m_SjC3a3">'(!OqLdaQe"g>:cI
+jQ>Xim.'`Ap\Oi[ruJMIXI,`VURAE\R>dlAh:7a^Ki_;VOI0-UStMpYr`]e<?<^U<ZE^U9Z*:F9
+nui%MreUT0!/?F3$/tpao\.C1beq3p]bS2p]>),!`6$6C_7dIj\%/oNZEg^;q69b"@<m0HI=?]t
+JqJc3Ll%"JNK90aPE_?!R$sM8StMdPUnsufWiN8)Yd(OA[C3TU]=bkm^r"".`Q-'BbKS8Wd*^:k
+e^i@)g=k?<hV[8MioB+]k2tmll0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kr;6HjrVc?eJcC<$
+h#Dm~>
+JcC<$JcGWIo`"gfrqu]ks8)ckrV/eTp@e1Po^qbGo'u5<n*]T0lg!a!kN:pfj5T%Uhqd,Cg=b*/
+eC;pocd'bXaiMK@_ns4(]tCqe\$iWKYch2<Ao)[@o76F^qgeKlnppOer.6J7BkCjiBkpRpI!U*c
+G]n=SG'7tJF)Z&8D0U5JH$FRZG^4RrOH,<-LhC^Urd4]oq0iBpIX^j;!J#[tIK4lsIdhjbIf=is
+JH(2tJdm9_JqJ`1L5:bINfB!Tr/:Q3!/^]4reh2DNfT<cPa7Z(R$a;/rg+^mP`_&gO-,QdO,oBd
+Q'Ri.StD[JS!]M,P`q5jNfT8!NW>.:NrP(?NfB%rN;SV6N;nh9MYi>3N;e_>N/NXRNJrhoNW+t;
+NrY48O8k4?NVnk9Nr>"GOH5HaOcklkP*2%-Pl-aFP5:C=Pl$aCQN!6NR/`TQR/`TRRf8c\S=Q4C
+T:hkVU*l_3V5L5iWN3/)Z*UgG\%0,a^VRh-aNMoWeC`O6jlu1%oC_nUrVaY65Q:WZr;6BfqYBmY
+o'br1kiLmc_Np4DJV]#5J<#83GC5.HWHNQ%8OZ-fE_/uPH[UE>:/+Va;,3"*LPCS>L@BirM>i>2
+LCApoi8`talgF<8pA+WRrsHuS`P&XSR[]h8Q2QpIPQ$jIQ49:QR?NboNf8sSLk^_?nqCLtH@1-i
+J:W<)KnbD?MN!OUOHPflQ'[l,S"6.DTqeE[Vl6VrXfen5Za@-K\@K5a^;%J#_o9U8aND]McHaea
+daZguf@\g2gtgiEi8N\UjQ5Odkiq?slg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)ZjrVZWmoDX=@
+JcFO*J,~>
+JcC<$JcGWIo`"gfrqu]ks8)ckrV/bSp@e1Po^qbGo'u5<n*]T0lg!a!kN:pfj5T%Uhqd,Cg=b*/
+eC;pocd'bXaiMK@_ns4(]tCqe\$iWKYcgSi928=\;?'Pd;>sDi;=IK[;>a>k;>O,g;$f*91GCXA
+2)[]crBL<G$p?^84$5Pa3B/r[5!Ag-s$$lb:/+G76V^BQ:f1*h;Z9Pm;#O8f;ZBYr<)``pmns-_
+pJUuh!E)em;Z9Sq<)`cos&02&<E<+#='/R*pf7,h#$"]*=BSd/r`T5(r`]S0<`E$u=',B%s&]5&
+#?kA=?XR5I>Q.b+=BGB#s&B&"rDs)'=]ef)=8u>"=8u>$=8c.u<rQ1u<rQ,!<rZ:r=oMM$=T2Cr
+=T;M.=BAU,=^##,=TDS'>5qh,>5;>$=9Mc1=]nr-=TM]1o2u&sqca)+?2\"2?!^lG@/aL7?sd:>
+@/XO6@K9p:A--=TC&VoJC+!e5D/O60E-$2HH@:?uM3*shS=l^XXKSt=\@T>d^VRk.aN2NIbg$.5
+rm(Me#LClMf\5-:hYu@2gfW=bg=Y!,eBuO`aMl$2]t1\\ZEC4,V4sTPR[BJ/QB[SqO,SpNKRnZ'
+IqDqe=A`!p;c-:a8jkj0:K9Y>3%-%#4ZY2N84H':2`3KS4$#?$<Dldn;H$K`;#lIPM#W5VL4"H#
+Jq\u:N/j$bQC4;<V5g](\A#o'd+-e&h;7)MjQ5LckNDa,s60CFs60CDrT<b6qr[_;!9X1A!9X:D
+qrT!^jQ5I_j5T(YjQ!jh?t3VO=]ej0=]\[,=]SU+='8]*>5q_)=8u;(<)Zap;XmUmH$XjdIXm!$
+K8#&9M2I7OO-#NgPa.T&R[]k>TV8-VV5L8lX0&P/Z*UgF[^`l[]Y;.r_Sa@3a2lEHbg+M\dF-Op
+f%8R.g>(N@hr*JQj5f=ak32'olKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^<hqu-HkrU^#>s+14*
+s*t~>
+JcC<$JcGWIoD\afrVZTjs8)ckrqQNf!;?Eb4nS@:o'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg=b*0
+e^W$pd*BnZb/hWB`59@*^:_%f\$iZMY\.NcGD)4IReiHORf/`NRfAlSRe`HIS.;*NNJW^UO^XTS
+VPg,\U&L\oT:;78R$X#"T:_dLStH"U$_jE0^;.M6RsKpWQM-UDQ2m3KPlHpPP`q;qQ'@Puop,<<
+s-NYNs-NbOs-3MJrK[GMrg<_RrgF=dSXuONVlQu'XfSP%W2TZm%]6/%W2m&&Y-5.?]"c/&rlG#X
++i_C5]!o,W[^NTP[^Wi]_8XL>c-=AK^V%+c[C!6EZ*:J2YlM!)XTY`+X/`/uVuN[rVl'?fs/,[k
+!iW#prM]aq"0/?#X8&XrWiN/"r2KXn"0&<"WVib!X/rD)Xo>I)YHY8-Z2M!(ZN.B1[K3kGrjDd8
+s0hs8rjMj9s0r'>qmud=s1BYl^V@S#_8F40`Q-'Ab0%oNbg+Vbe^rI-hVmMWkj%O'p%\I`rga!?
+nZ'F"R\6=F_PE`cUoqbVQ^=h1G_Um7=^J#!TVYgr>@:fC=L#3AZ*(45YH[Q#s+pZ0!/?F3,2rS$
+q;TN<bf@N5]tD"k]t_>"`5p-B`4iss\@T,SYd:R;o<;kPH?sseIt3*&KS>/:M2R=QO-#NgQ'Rf*
+S"-(ATV8-VVPgDnXKA\1Z*UgG\%0)_]Y;.s_SjF5aN;TJc-FY_dF6Uqf@S^0gYCWAi8ESSj5f@b
+kNM0plg4!*mdKW6nF?)?oCV\So`Fj]p\ssfq>U6gqu6NlrU^#>s+14*s*t~>
+JcC<$JcGWIoD\afrVZTjs8)ckrqQNf!;?Eb4nS@:o'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg=b*0
+e^W$pd*BnZb/hWB`59@*^:_%f\$iZMYZP4DC3"^oJFA!dJG=WcJGFcoJdQ7+ASGjo;fdA6IJnC$
+GBS.NEH#r;Df']BH$OXYrHSBhrf72BUjR!(r-\?imsk=erdP'"It3#to7-ais*t#srI=its+1'!%
+>07bK7no4LP^tLNJrhlMuAP5N!tW'NK93cQC+,1S!ocDRL#=KQ'7>nPEM(-O;!b@QC487TV8'OS
+!fV/P`h/jO,s7"!frG(rf.5ENfK*YNfB"sMuSb8MuS_:NK!XjqMbH4r/CW7r/Uc;rK%&@OSt7?O
+T1CAOSOt9O91Q-P5CICPk1+9PkpXFQMHjIR/!*KRK/iVSH#-2StD^MU8"EYV5:)gWN*#$Yd1XE\
+@K5c_SjL9b08,XeC`R8k3VU/pA+R_rPed=rr)`ir:_f9o^VA9l0.6ginrPHgY2\AOI_2[KnFr@L
+Osl%LQe$MF+7h,ASH'T9mqA7IJutL;c6IhMM[7JKnb>9n:^gtreCc6l0Ig.o_/+YPlD3BZ-p=sV
+ja$CR[02'Q2[$IPm3SCS!oS*OT(:?M$&HfL5#5RB6\`KI!pKpJV/W0L5:\EN/is\P*;/sR$jG6S
+t;UKUSOcbWN*&%YHY:<['mHS]"G\i^VRe*`Q$!@b0/&TcdC.heCE1&g"P39h;7)JiT&tZk2tjjl
+07O#m-X60n*oi:o()DEo`"Lbp@n=\q#C0hqY^6ir;HTcrdk*#s4mX)~>
+JcC<$JcGWIoD\afrVZTjs8)ckrqQNf!;?Eb4S879o'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg=b*0
+e^W$pd*BnZb/hWB`59@*^:_%f\$iZMYXV&P:/C1Qr_WMin5B$Yr)3MkqG7Z!1G^aA1,LmQ5s[_!
+4[/j.)E^)C3]T5]2a';f5<_7q4[2.p:/+JX=[l.arD3Pm;H!3cqGR8js&B"ss&&qt;GpHf;?]oo
+;,L4hr_r_mr_rSis&&_ms&Att"'/K*<r#_r<`T)t!EE+u<<6-&r`]>)!E`M'>7t1F=B8C&=BJX+
+<`W4%=Bf$:@/aR<?!:B6=BGE$r`&r!rE'#%s&f8%r)Wi!qc<_s"'/K(<r5tr<WQ9(pK7Jur`AVl
+s&o8%"'Jf2=oMP'=oMS+>?Y5%=o;G*>?Y-2p0%E!rEK;,r*B>/!+5S1!FK76@JaL7@q>OM0PG6<
+DJj6*CiFE9FE;PHH$k*pLlR^gSt`*]XKSt<\@T>e^VRh,aN;TJc-FY^dF/$A#ggoEdF6Xtg"ZM]
+;VTpYg"=m*da-(V_S<^m[C!9EY,eM!UnOBMR$EhsOH>N_Mi*7CJUi6!I!^-`GBh5E=^Y</;c?Rf
+:J48E6Uj[62`iZD1-@QM1.Xo*7Q<:ar]1<F<E<'r;,C+fn594AreDYOKnkPEO-,ZnR\$7NWii\=
+^;S.?e_&U2hr*PUjlP[gkkjTEkkjWEkQ'fEkl0`Fk5FE>k5FE=k5XWEkl'ZEkkjNCkl0cEjoOZ-
+rT4(?s5O.>j8S'<i>:Y'EFs,s?<^H6=]\[-='8O)=BAU->$Cl,$!1/.<E)mq;GU-\;.k-"H@1-j
+J:W?+KnbD?Mi<[WOHPfmQC+)0S=Z=FTqeE\Vl?\tXfnt6Za@0M\[oGd^;%M$`5Ta;ai_fOcHjnc
+e'uq"f@em4gtgiFi8N_VjQ>Ufkiq?tm-O--n*fc8nac8Bo^r.U!quB_rqQNhrqcQirqu`noDX=@
+JcFO*J,~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrqQNf!;?Eb4nS@:o'u5=n*]T0m-Es$ki_*ijQ#7Xi83;Fg=b-1
+e^W'qd*BnZb/hWB`59@*^:_(g\$iZMZ".KgH\[mTRe<*IRK/iURfAfKReiNJS1KY\M274SOC+f]
+VPKlZT:_dMSt2@>R?j,%TV%mMT:r!SU8#B8^:mk#G_2=^Qi33OQ'Ra8Q2R$KPmNbAQ'R]"Pa.Q#
+o9K<@rg3YNs-NVMrg*VNrK[>I!13\Ps-`nU-C^NsT:hpUWN<8*XfSP%W2HSlW2HPlWN<5)Y->4>
+]"c/'b08/UrQH>+b/V<4]Y(ke\%&lV]"Pr!aihrRai;34]t1Y\['TV6!3Z4$s/c7$!ii2srhogp
+rhf[ks/,dnrhp+#W2HPlW2ZbrrN#sus/H!t!3,mrrM]dsri$F.X/i8#X/i8#X/rG)Xf\c)YQ(p)
+Z2V'*Zi@B4[JmW7\,No:[fEr;[fEr;[fEr5\H'5?]`5YK^;.S$_SlGms2Pkqai_fNcHt%if%8U/
+hW!Y[lgF?<r0I@6XfS@dWLf`O\=f1KU;Z!HOIh/2<`bBM=B_5jUo7L'>[LiC=g5-=Ycb45YOJat
+LkgcbL5c-WnGiLbkKq;mahb^+]Y2%m_8*t-a3;TB^V@@i]XY>QZa$a<o<;YJH@('gIt3-'KSG8=
+MMmFRO-,TiQ'[l+S"-(BTq\?ZVl6VqXKA\1ZEpsI\@K2`]t_A"_SjF6aN;WLc-F\`daZdtf@\d1
+gYL]Ci8EVTj5oFckNV6rlg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Wirqu`noDX=@JcFR+J,~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrqQNf!;?Eb4nS@:o'u5=n*]T0m-Es$ki_*ijQ#7Xi83;Fg=b-1
+e^W'qd*BnZb/hWB`59@*^:_(g\$iZMZ!(LIDKL@#JEq[bJG=WcJG4WpJeDd4ARoOkC/KA+H?sg]
+GB\4SFoHFgEc5i5G^+LZG^014#EY",ND#mZErLLeI/\QjId_dcJH(,tJGaorJGXipJGt#uIf=iq
+J-LRVJqJ]-K)L?$KE?pcMuJ_9N:r2/N!bQ)O-#QkR%'Y<T)5&iS=5h2Q'RYtOcb`gPEhN)T)PAj
+T:MC<Q^3huP*(fdrf7#?!0@#;rJ^l;Mi7Rns,6l8s,@/?Mi<XTrepi8r/:]:N/RUmrf-i9rf?f8
+s,m)<s,[/@rfR2Cm?@L5qj%,Grg*VPrKmPOpR),PS"-#ISLU5'TV8*SUSO`aW2Q_rX0/\5[C<`[
+^r=F?cd0tce(31,iTBLsp%\C\rQ"pVrqlQep@\%JnaZ,:mH`uujPf"PgY1B6f@JINdfncrO,JUJ
+rdklIKmn5oP-VcCG\To@7rNH?9m_86If<+B;?]omM2@.Hre:E,n:Uk!LPPk`!r2WiOT,XT^<s[-
+Wh,WJS,ATMPn9:LS=5\*OcPK^N/<=GL5(ERL1,=QH[U<lJ:`E,L51VCMi<[WOckroQ^F21S=Z@H
+U84W`W2cl!Xfnt7ZaI6O\[oGe^VI_'`5Td<aihoQcHsteeC<($f\,!5h;-uHi8WeWjlY^gl07L!
+m-O--n*fc9rpg*]o`"O`p&Ojcq#C0iqYU0hr;HTcrdk*#s5!^*~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrqQNf!;?Eb4nS@:o'u5=n*]T0m-Es$ki_*ijQ#7Xi83;Fg=b-1
+e^W'qd*BnZb/hWB`59@*^:_(g\$iZMYsq;V:/=^T;>F&f;=IKV;>a>l;>a8j1^u5q1c%!I5X@V!
+5X%@pr]C6D4?EI%"#iA,5Q3kF56aeV9hd-9:An&i;"7B_;Z0Gm;Z0Mo<;0>i;?Tot;c?Qm:]XEk
+rDWSkr_rhps&&bns&&bn!)rep#?=f+=&i7"<;fet<`T)tr)El$=B\p5r`]5(s'6IH>$+m1>$+j-
+<E3(%>$PB@@:3GJ>?b65r`B,#"'8N(<W,u"=BYW*qc<f!=8,bq=8u>$<rlE)r`K,#!*Jhqr`K/$
+nlQ&u=BJa1=oDIu>5MJ&>5MJ$>5h_+>5h[u=o_e+>l@q3?=7,I?=3\>raGh7s'be6!b5bPralON
+C2@a*E,fo?GC"W8H6@Q_JVAuDQ^skKX0/\4[^j#a^VI_)`Q$$Cc-F\_dF$D?dlGq,e(*%%g"G*5
+f\"g+eC)Xb`kT0r[Bd!;WMZMfU7e*IR$EktNJiXKL4t;5JUW&qH[0j[G'8"Mr,XEE=^+s*<Dlan
+:/";M5Xn[m5WC\P,q(o</i#pd77K3o2EEo\3EB*Y;c-Fkn509aLkgcbL)Z;@Q^aVBVlR#.\\Q2-
+d+6k'gu%)NjlPXfkNMg-!:'IG!U/eGkQg;7kND!ijlQF&roO%>rTF+B!pSq4roa=FrT==GkND!i
+roO1@r8[h:s5F"9&`;I*gl#i`@:3AB='8U+=BJ`)=:&&4>$4s0>$+g+r`&tt<:<[mG^=^bI=Hd!
+K7nu7M2I4MNfT<cPa.T&R@B_<T:r!TV5L8lWiW>+Yd1UC[^`lZ]Y2(q_SX71a2lBGbg"G[dF-Oo
+f%8R-g=tH>hr*GPj5]7`k3)!nlKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^<gqu6NlrU^#>s+14+
+s*t~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrV/\Qp@e1Po^h\Fo'u5<n*]T0lg!`ukN:mej5T%UhVHu@g=Y$.
+eC2glcHXPTaN)9<_SO"$]Xt_a[^<ANAo2X>Omeb/RK&`URK&`URJ!$FS+iHQN@B^ENffH2Vl-Je
+U8"9QT:ML@S!fV.PG"SCT:V^MUS=KX^V7Ltp7HkqrgEbQm?[d;rg*5Bs-*SMQBqE7qO%5JqNh/J
+s-O4_R[T_8S=Z@FU8=firiQ@*XK/>uW">r,X0&M,YHbF@\%BJrbg4Z6d0S1JcH4&B^V7G\]Fqon
+_8F:5aiVTB_SEn"\[SuRZM^s.Ycmr+ri?1%WN#ip"K/,oV5=0grhfapri,am!3,dpri5suql0h!
+WiE%uWr&jqXT,C(Y-5&-YQ1s-ZM^s-ZMh--[/RK4[f<i:\,a);\G`u;\,j.Oq7-O<^&G_f^VI\&
+_SjF4`l?'@aihrTd*^=mf%AX0hVmS\m.0lJPlE&EY.(!uTV%b8V43^FXOb7SPf&i)LkLsp?DX<g
+Uo7O&?XI&@Z2V$3YHG.7YOJdrL]3$cruqCAmFKG&bJh61]tD(m^qmq+`QcKC^;%:i\%&iMZEg^9
+o<;kOH$XgcIXls#K8#&8M2I7OO-#NfPa.T&R[]k>TV8-VV5L8lX0&P/Z*UgG[^`l[]Y;.r_Sa@4
+a2lEHbg+P]dF6Uqf%8R.gYCWAhr*JQj5f=akNM0plKdg'mdBQ4nF?)?oCMVRo`Fj]p\jmeq>^<h
+qu-HkrUg)?s+14+s*t~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrV/\Qp@e1Po^h\Fo'u5<n*]T0lg!`ukN:mej5T%UhVHu@g=Y$.
+eC2glcHXPTaN)9<_SO"$]Xt_a[^<AC?"7PeHM)gHJ,b&uJ+eEeJHKV"ASM-Z(JfI+I<g-aG'A+P
+FE2JEE,KQ<H$FOXGl;mqHB=2KNPg0_H$t-jqL/6ipjW9oq1&Bo!.Xosr-n]sqg\KnrI=Zos+:'!
+s+CN/LPUhHrf-W0!0$l9rf72EPF%c1rLa+_s.K^mTUVC:QBmf"rfdbTQ^F53S=Q7BS!j8C$C$a;
+P*(fcNfT9_rf.&@NfO$ss,6r9repi8rJ^c9rf$]5!K;s9Mu\e6N;eh9N;ek;O84n0Oo1=?OoLU;
+PPgXIPEM,nrKR5Frg*JKs-WeP!1<VNrL*eWS=KPK".l-XU&Lc1USXicW2ZetXKJh7[C<c^`6$<Q
+eCE1'gYUiIk3V[4qY^?:s8Musr;ZU.p[n(Hn*TH+lKRKojPf%Qg=b*/e^XQHrR<LKfpn7kK8G87
+K=$GdH[^^<P'M&ADH(4^E(WlRH[C-j:JOkf:f*(-M26nALPCNPK`?i,L5l3Br6Ea)^TaE#R[fb1
+Q'_K8':+oLQ^F>4P`h/iNf8pSLkgb?L%C%3GBnL]I=?]sJqJc3LP^nINK90aP*D5uR$sM8StMdP
+UnsufWiN8)Yd(OA[^N]V]=bkm^r"".`lH0CbKS8Xd*^=le^i@)g=tE=hV[8MioB+]k3(sml0@U$
+m-a<1n*ol<o(2JFrq-?dp\4X]s7u]kr;6HjrVcBfJcC<$h>`!~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrV/\Qp@e1Po^h\Fo'u5<n*]T0lg!`ukN:mej5T%UhVHu@g=Y$.
+eC2glcHXPTaN)9<_SO"$]Xt_a[^<A084cNM:]42_;><ue;=IKT;>a>l;>sAp1GLXA1]B9362s.P
+5X%:n4T7DH4?5D]2a'>&55d\R5#+gI9lrj%;Gg=iku%IYo2>ll;,L:l<Dufo;#aGl;uBMr;cH^p
+;Z9Pk;?Bcp;uT`#<E)pt<``?"<;fhr<;T\q<X2`1>[:W?>[.24$!gnF>[(B8>?b80<t/87>?b?:
+>[:W>>$>'3r)`hts&T;)='8]*=T)>$=T;J%<W?,"<Vf`"='/U-=',<%q-!]!s&f>*r`K,#r)`r%
+qcEu&=BJ^.r`K8(=8l;(=^#!3r`]2%qca#&r`]8)s',P.r`T;+q-*f&s'5J-!+,Y3ra>S2r*fY9
+rac"?$Y<scCMe!1F*2bVJGt*DJq\u:Nfoj'V5^W([C<][^VIb+`lH0Bb08,Vd*^7hdaQ\EeGdu!
+f%9oRs48[MeBuXfbK%K4[]us6Vkg)\SXc.9QB[PnN/E@CJq/?"I=$9cG^+FTrc8<bEH#o;EcZ@%
+FY88Q='8I&<)Ze):J48E6:a^62,uC_1H[`P1.Xo)77K3o3]]8]<`W-s;c-Fk;t<fc;#c=ML)6MY
+WN<>4]>;M1dFQt(h;@2PjlY^gkNMm/rp'7Br941Ds5j=Eqr[q?qr[h>rTO7Fqrmn>s5s:A!9F(<
+ro3t:!T;l7hAtG-khiCYEElmW=]ej1=&rF+='&L+='8^/>Zk-1r`0#!r_ins;,L-\;.k)uH@('h
+J:N6(KnbA>MN!OUOHPckQ'[l,S"6.DTqeE[Vl6VrXfen5Za@0L\@K5a^;%J#_o9X9aND]McHjkb
+e'uq!f@\g3gtgiEi8N\UjQ5Oekiq?slg4!+mdKW6nac8BoCW%T!quB_rV6Egs8)ZjrVZWmo_sFA
+JcFR+J,~>
+JcC<$JcGQGo`"jgrVZTjs8)ckrqJeRp@e1Po^qbGo'u5<n*]T0lg!a!kN:pfj5T%Uhqd)Bg=Y$.
+eC2glcd'bXaiMK@_ns1&]Xt_a[^EGQB6&BSQ1(1*RJ**ES,/WqNK/jQO,f9/V5^;fTV%pNTqJ!J
+R[]\2Q]du8T:Z%VrhBJ+rkAVagN\C?RJrW\S!ob3QC!r(Qg9t6Plm87PEl*4rg3SN!13\PrKmJK
+!LK2QQi<?cR@9V8S=Q7DU8=cgXfnq2Y-"_&r2C1,XKAY.Yd(L?[(3lgb0U(9$e3_Ve^i=!bJqH:
+_#;"O^qmn*_o2Pn$H0cq^:_"d[^<BHr36=-XfVK's/c7$!36$t!3#mp"K&#lVPa?js/5stWrAst
+Wr8msWr9!sXSo4"XT,:#X8K!mX8f:#XoGR(Y5kg+Z2Cp*YlM*/Zi.63[C#q@s0`0A\@B)Z\$rmH
+\H'5>\c',;\c95d]=bhk^VRb'_o'F3`l?'?ai_fOcdC4keCN=+gYUoNlL+6;rKI75l)hUlT:_^G
+l,03_OJ9\P_P*o`=BAOcR93X^Uo((o>$G?@>["D:[^!!<Z*3Z$!/LN-MuP!nqu60@b/hfI_8![r
+^;7V$_SjI;b/V33]XkVa[^*-CYcdQ$@<d'DI!pHoJV/T/L5:\EN/`m[P*;/sR$jG5SXuLJUSOcb
+WN*&%YHY==['mHS]"G_j^VRe*`Q$!@bKJ/UcdC1ieCE1'g"P3:h;7)JioB([k2tjjl0@U$m-X60
+n*olHncA@Srq6<b!;HHes7u]kqtpBjrVc?eJcC<$hZ&*~>
+JcC<$JcGQGo`"jgrVZTjs8)ckrqJeRp@e1Po^qbGo'u5<n*]T0lg!a!kN:pfj5T%Uhqd)Bg=Y$.
+eC2glcd'bXaiMK@_ns1&]Xt_a[^EGF?=n"qI.r0CJ+eEhJcBEjAS,[kC/TJ.H@#R8s*+Kd%!6K2
+EGoc4GBnCVH$K:5$BL:0Na/GrFFJ[grdO`mrI4Kjs+'lorIFKh!J#b!JGaooJ,t4Qq1J^#$\a@l
+MMmITNfB!UN;JP5N;ee:Nr>"AOd)6)U&LedU&UkeV$E]aR@'A.QC%T:".5LFRf/]VR[O/A$C$a<
+P*(ieNf]?`rf.#?Nr+e?N/NUQN/NVlN;SY:N/iqtN<P9!Mi<UQrJ^Q3!07&>qiLQ7!0[2@!0I2B
+!0[>F!0mDFs-3PIr0.;IP*;+/Pl$^GQMHmFR/WNRR/`TRRP1/#S=Q7CSXuIGTV8*SUSO`aW2Zbr
+XK8P.ZF.0R^W"@BeCWC/hr<b]l0e-9qYe\=s8=#9qY9jZo^hYBmd9?*kN1dcj5JnNg=b-0f$i'q
+e'n9Fr7*FZ\!!/7KSG/3^7'b*H@:sfQ?[mk8Oc0gF%T/RI!gB=:JF_b;,3"*N/<=DLP>5N!/LN-
+N;j==]YhFhV43jAR[05)rfn(]Pa7T&S!oY,OcYT`NJWLGM"$.-G^4U_I=?]tK7el4Ll%%KNK90a
+PEhH$R@B\:StMdPUo(&hWiW>+Yd1UB[^WfY]Y2%o_8=.0`lQ9FbK\>YdF-Lne^rI,g=tH>hVd>O
+j5]4_k3(smlKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^<gqu6NlrU^#>s+14,s*t~>
+JcC<$JcGQGo`"jgrVZTjs8)ckrqJeRp@e1Po^qbGo'u5<n*]T0lg!a!kN:pfj5T%Uhqd)Bg=Y$.
+eC2glcd'bXaiMK@_ns1&]Xt_a[^EG184lWP;Z9Vp;Y3i];#X>];XmW^;ZBT&2)@!A1G^mH5XI_"
+5lNtI4;g4C4?GM_3B')b4[2+p4[2.p9MS;V.ToJCr)*Sp;GugX!)i_n!)i\m#uXVt;H$Oo;c6Kl
+;#aAm;Z9Vl;?0Yp;Z9Mo;GmEkr_rYm"BAK'<E8cmpf/#0>@(ZD?!LT<>[:`F?X-c;>$G37r`KY5
+>?Y37>?Y67>$4s0r`B,%#Zk&-='&L+<`f6%r`B,%s&T8&<EK0#s&Jnrs&]D,='&L+r`9)%rE9,'
+r)j,*=]ef)=8Z/#=oDJ&=TMT+qcNo$r`B&#rE9#"pf[W#qcj)(rEK5(rEK8+r*B>/!+5_5"CYbK
+@:9(Cr*fY9r+.EkAS#OiCi+-5G'e^iK8#,<NKBBjSY;p\YI1jM]=u%r`5]m?ai_cMc-FV\rm1bp
+daQ\De1B/$f@SU)e^W!mbfI`;]="i@V4jQQS=5e1P*(c_M2$\9Jq/;sH$FRXGBS-.ErpB%DuO_U
+E<L<'FEVp.GqOMU=^4s+=&Mt8<_Q1V5X\jQ2EWT?,UYc:/i#md77B-n2EEo\3`f<\;c6Cg;Y!]b
+:]Q:LL).)(]u%k8e(<=.h;I;RjlY^gkNM-ol2BoFklC#Il29cFk5sf/kPOBAjnn3:kPscCl29cA
+k6C)1k2k^cjS\';iWeB"i8<GKh>Z1XgY1TF^3+$s?X?l;>$4m-='/O*=]\^-=^#$4='/O*<``7"
+;c?Rj;"@IlG^4U_I=?]tK7el4Ll%%KNK90aPEhH$R@B\:StMdPUo(&hWiW>+Yd1UB[^WfY]Y2%o
+_8=.0`lQ9FbK\>YdF-Lne^rI,g=tH>hVd>Oj5]4_k3(smlKdg'mI'H3nF?MK!V>s_p&F^cp\jme
+q>^<gqu6NlrU^#>s+14,s*t~>
+JcC<$JcGQGo`"gfrqu]ks8)ckrqQNf!;?Eb3qW%7o'u5<n*]T0m-Ep#kiV$hj5]+Vhqd,Cg=b*/
+eC;pocd'bXaiMK@_ns4(]t:hb[^BOSCib&`m[E@-opYWEr1"jhN/EXTOcWqIW2-8aUS=HSSt;@=
+R?s5&Tqe?TTq\:[UBeQJ^qTi@IujSus-iqV"e(jHR$j??QiE?RQ^3u)rKdJKr0@AMQMQmHPl-jH
+Qi<BIQi33MQhm(,R@B\9S=Z@FTVJB`Xfo"6YHFq+WMuntX/rG*YHY::ZF%!I]"lA4eCN4$f[na.
+g"+Hi`P_\l"2Vdh_Z%IP`!jQ#^q[Rp]"#5V['R(;YlV)4rN-1'XfSQ$Wrf<#W;`^pVYm@lW;ijr
+WW9$tWWB0#r2][q"08N(X8]1%X/rDtX8f:#XoGR(Y6(r5Z2V$/Zhgs0Za@*GrNuC0s0r3B\@B#W
+q76O:s1A6?!P5oB]HY&'^VI\'_ns:.`Q$!?aihlPd*^:ke^iC+gYUlKkNqa4qiUn1YcX^jWh5oR
+n"ZG>Up&S4Q(O.YI#)!i=^IqtTVYn!>[UrF>-YB<Z`^F7Y-7?!r.^11%J0W"p"dm6b/qT;^V.D\
+_%FZ,b0.f@^V%.g]XG/NZa$a;o<;kOG^=^aI=HcuK7nu7M2@.LNfT<cPa.Q%R@B_<T:r!TV5L8l
+X0&M-Yd1UC[^`l[]Y2(q_Sa=2a2lEHbg+M\dF-Opf%8R.g>(N@hr*JQj5f=akNM0plKdg'mI'H3
+nF?)?oCMVRo`Fj]p\jmeq>^<hqu-HkrUg)?s+14,s*t~>
+JcC<$JcGQGo`"gfrqu]ks8)ckrqQNf!;?Eb3qW%7o'u5<n*]T0m-Ep#kiV$hj5]+Vhqd,Cg=b*/
+eC;pocd'bXaiMK@_ns4(]t:hb[^B1?@;'M$pOL_BpON0m+DPP$C2.O":ORY;I!L$_G^"=SEcZ;@
+Df'`EG^+FXH$]I8#`t+.NRE5mH[bsDr-nTmrdOQj!.afns+']j"+YrRJG=WlJ,t4Qre(6(rIYK2
+KnY8;M2R@SOH,>!N;\\6N;nq9NtRP<QCFMBV50i\U8+Q^URmsDRJrQVR?s8-RJ`NRR15OMQ^3o#
+PEM)kOH5KarJpo=!07&<!fi8"r/:H2s,I&=!K<$:NW>(<MZJcpr/CW7qMkQ:rK-H0!0[>Ds-!AF
+qNLuFqipoAs-<YOrK[/Es-WYNr0mYT".YsSSc53-T:r!RUSO``Vl-MoWiN5&YHbC@\\>r&c-b+q
+hW*ken+#uBq"t$;ru_7=r;?Eeq"OIQoCDG@n*K?&k2kX_i838Cg"+a)e^XTI!n>cOqU[IPe'l4"
+P)P$OK7nljKnFf&LS__0H#["mAP6r6:47J9I8<U5<)ZXiMi3CJL4t>9L%'cnL5l3AhS7^W[AB@\
+S!fV/Qi36MPm<YCR@BP,P*#['#)\7lLk^Y<o7gn%G^=^aI=HcuK7nu7M2@.LNfT<cPa.Q%R@B_<
+T:r!TV5L8lX0&M-Yd1UC[^`l[]Y2(q_Sa=2a2lEHbg+M\dF-Opf%8R.g>(N@hr*JQj5f=akNM0p
+lKdg'mI'H3nF?)?oCMVRo`Fj]p\jmeq>^<hqu-HkrUg)?s+14,s*t~>
+JcC<$JcGQGo`"gfrqu]ks8)ckrqQNf!;?Eb3qW%7o'u5<n*]T0m-Ep#kiV$hj5]+Vhqd,Cg=b*/
+eC;pocd'bXaiMK@_ns4(]t:hb[^ARq8PDiUrDW_ooMPB[s&&Yks&&GenPT3^&2Z*s1G^mH2F'Pl
+5X%Cs5!8g+!'L6@'/r$;5!;(o5!M7q4\e^H9nGf1;>a>j;Zouq;,U<`;?'Gq;,U:j;uKVl;ts8j
+;#O8\;Z9Mn;Z9Vo<;ohr<<$#!<VBDf<<cK,>@1cF>lIq;>[LlG>?G!3>?Y68>$>/->5h\)=T2A*
+=BSd/='#6#!*9)#"^"i,='&N'<ruE(=8Z,!<W6#!=8c5%='5B%!*K5'r`];'"Beo3=]kW(qcEo&
+=BP?$pfRPtoN;#or`];*s'#G*r*0/(r`f;*!+#M/!+5_5s'l":s'Ph8r*f\:AH$-?AH$-`AnPdk
+C2Ip4G^Y'nKo1qVR[p(FV5^Q#Za[KX]t_D$`Q.r!s2k_nbK\;WcHjkbd*^8?dK%bodO3Geai(p'
+['-L+Tq.X>QB[PoO,JmPLPCJ7JU`)qH[0j[G'.nJEcV+u#BFg)F*2YNH2`.FH?jaYC0=eD<Dudp
+<Fnlt8j5U8F[7uG/1`S-4"i?[7n#m+2E!WY3]U8B<)Z[j;,Zs^r_WNI%+!JVgYCZDj5oCbk3)a-
+s69LIrosFIrTX@G!pSq4r9*b8q<%bAq<8"Fl0.@-k6U55k2k^cjQ#>#ire<$io0mp!T2c5h#Z<c
+rn8aQf[o91H=_2,?WgH7=]\X*=BS^.=BAR->Zk63=BJX*<E2ss;Gg9\;.k)tH@($fIt3*&KSG8=
+M2R=QO-,TiQ'Rf*S"-(BTq\?ZVl6VrXf\e2ZEpsI\@K5a]t_A"_o0O7aND]McHaeadaZguf@\g2
+gtgiEi8N\UjQ5Oekiq?slg4!*mdKW6nac8BoCW%T!quB_rV6Egs8)ZjrVZWmo_sFAJcFU,J,~>
+JcC<$JcGQGo`"gfrqu]ks8)ckrqQNf!;?Eb3qW%7o'u5<n*]T0m-Ep#ki_*ij5]+Vhqm2Dg=b*/
+e^W$pcd'bXaiMK@_ns4(]tCnc[^B[ZE-Hu"oU>B>rL!DK!1<VNp6t]E+.SCPMM[FUO^Fl[VPg,^
+T:_jQT:DC=R@'>)US=HTUAgnoUnbZ;^qY6^H%u9fr0mq]S"#k8R@'B9QN3?LQ2[*LQiEBOQ1gLD
+Qi3<MQN3EKQhd!^R[]h;SXuIHTq\<\Y->7>ZEUL5rN#t")m-9JZEggD[C*HS^W"FEf%8L)f@\g1
+f$;FX`;RRR_>_:O_u@US_[OAs^:_+j\[f,TZa-n9Ym@S;Y-"h-X/`3!X8f1"WVNIjW;ijqWrK'u
+Wr8t"XK/E!XSo3tXT,F%XT,=&XK/E$X8oC%Y5YX)Z2V'*Zi@E/[/dZ5\,Ei/\H'5?]*5dV\[oDc
+rk8?G,/:q0_Sa7-`5KX8aN;WLcHsteeCE.&gYCWBiT'+fnb2kZP5d/Q]!\34Tq7kQ[@NbNUW)&\
+R^A#XMHl40=BhAmVQ!d(>[UoD=g>6@ZEC@9YcmQ#re:E,M>n^piQT?bb/V95]YD4t_SX42a3;Q@
+^V.1f]XbARZa-g=o<<+UGBnL]I=?ZrJqJc3LP^nINK90`P*D5uR$sM8StMdPUo(&gWiN8)Yd(OA
+[^WcW]=bkm_8=+/`lQ6DbK\>YdF$Fme^rF+g=tE=hVd>Nj5]4_k3(sml0I^&mI'H3nF?&>o(2MG
+p%A%Pp\4[^s7u]kqtpBjrVc?eJcC<$huA3~>
+JcC<$JcGQGo`"gfrqu]ks8)ckrqQNf!;?Eb3qW%7o'u5<n*]T0m-Ep#ki_*ij5]+Vhqm2Dg=b*/
+e^W$pcd'bXaiMK@_ns4(]tCnc[^B:EAnl@7q1-e@p4*F"C2.?lCMR``rHnQi"a5*7G]n3.EX6Z'
+DL$JNGBnH3GmBFlO,dGQCj#`,!.b&us*b'"IXZ_DIdDR`JGjutJGFZsJ:W9%rdOour."To!.t0%
+!/1?(s+LB*(5I^'O-,TgOH,<[N/W[QNJrgUO-#HcrK%5IQC4><Unn!a#,A#kU7IdBr0dMN!1EhT
+rg=%ZQ^3o%P`q8nrfR2Aqi:f=NK*pt!0$o8repi:rf$l:!07&<rJh#?N/`dUrepl;N;eh7NWG3$
+rK$u?rfR5Ds,d;EplPT?PQ$aCPQ$gHQ2[$DQ2-a;QN3EPRJE<NS,\u\SXuCDrgsLiU8"EYVP^8h
+W;`gsX;J(CYd(RF^;J%9cdLG"i8s4jo(;YNqYU6Bs8W(,rVZNeq"a^[p\+=Ro^hS>m-*Tnj5JqQ
+gtC?3f[n^)e^rI+g=tE<gY1?6f@AC"daA)eR?WGaL4b*+Ob/(1I?M!cFb4C%AkR)`8ksb]I=G!e
+9i=kd:Pt$fLk^\?L5#,Mre:E,NW0@YcI0D;Vjs-DR[O,?'pY)OQ'[i)S=#M(OcPK_N/<@GLPCNS
+L2M0YH$XgcIXcm"K8#&8M2I7OO-#KePa.T&R[]k>TV8-VVPgAmX0&P/Z*UgG\%&u\]Y;.s_Sa@4
+aN2NIc-FY_dF6Uqf@S^0gYCWAi8ESSj5f@bkNM0plg4!*mdKW6naZ2@oCV\Jp%J+Rp\ssfq>^<g
+qu6NlrU^#>s+14-s*t~>
+JcC<$JcGQGo`"gfrqu]ks8)ckrqQNf!;?Eb4nS@:o'u5<n*]T0m-Ep#ki_*ij5]+Vhqm2Dg=b*/
+e^W$pcd'bXaiMK@_ns4(]tCnc[^AOm8khuV;H$Nn;ZBVo;#!o`;#4&h;Z0Jb;XmU1;Dp<d0JkXF
+2F'Po5<qCr4Zkkg4$5Sa3B9#]5!D+o5<_:r5"trN""IhW;#X>n;c<Hjr)35cr(mJm;H$Km;$0]p
+;c<TnqGI>k;#O8k;?0Ye;Z9Mn;Z9Vo;ufkr;?^'$=BAO'pf.8n!*&qt"]e]*='Al.?PHgN>$>-9
+?<gW7='/U/>?Y05>$5#->5q_,>$4u+<ruK,=oMOt=8u>$=8u>$<<cK*=BAR)<r>tt=8uA&<rQ/-
+=BAU+=BSg1=]ei*=9Mc1>$4u,=8Q+t=TDY%=oDG,=^"s1=BAT$=T2J&=T;P&>4Yts=o_e(>QA(.
+?N+=3?ia\FrF,Y6raQ"?AS(jO!+l+@s(<KhD/aT@H@13qLlIRaS=lRNVlHl'[C<]Y]tV7s_8=+.
+`;RXZa2lEHbfn?1c2l28rltGd,KI[6[]ca/US"$BP`UreNfK*YMi*=FKS+l,IXQQhH$FOUFoHIg
+F*)MHF`r"THiACOH@'s`GBS.PVdNh6<E2pq;g_G89LqB;=?nf-0Ieq15!(AP7n,p92`3KS4$#E(
+<`Dso;,U:joMPQ`re:c6hV[;QjlPXfkihp.!p]%7r9F.Cs60CDrT=.Cr9!e;p?DS?s5sCGr9++B
+!9O1?r8Re:ro!n9hu;I5h;&"a0&#"2g"=p-e`>>MDK'#k>?>!2=]ea-=BSa/='&O/=]nj/='/L(
+<E2sr;Gg:fo20CKGBnL]I=?ZrJqJc3LP^nINK90`P*D5uR$sM8StMdPUo(&gWiN8)Yd(OA[^WcW
+]=bkm_8=+/`lQ6DbK\>YdF$Fme^rF+g=tE=hVd>Nj5]4_k3(sml0I^&mI'H3nF?&>o(2MGp%A%P
+p\4[^s7u]kqtpBjrVc?eJcC<$huA3~>
+JcC<$JcGNFo`"jgrVZWkrqZWjrV/VOp@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mej5T"ThVHu@g"=p,
+eC)ajcHXPTaN)9;_SEq"]XkY^[:O&nH\n']Re)sIQjT1IQ^=),R@0G1RJiKSR@'B@RJ!$DRi[ZL
+M33m\O^G#bVPU#\TV8*RSt)7<Q^<o1UnXQWU]$u!UV4CV^7(dEPF\87SXc4>r1*eVrgEqWR$a6=
+R/WHPQN!0JQN!6IQN*<NQN*<LQiNQPR/`KQR/WHLR/`QrR[]e:SXuIHTq\<YWj&k<[^*->XfSS(
+XKJb3ZEpmErjE0D]"Z)(cI11jeCFQL#1Ll?`l5j5r5/KOrko>b_SO%&]tD"h\@/fPZa-n8Ym%;4
+XfJJ%rN#ptrM]Xls/>sspo4=pqlBt'Y,n_*XSo1%Xfee-riPpr!3Q7's/uL.YHe)4s0Ma4rj)X5
+[e[E4\Gir9\,a):])B/C]",A_]=[sQrk8?Gs1\WN_8?/g*5ok;aN;TJcHt"geC<($g"Y<=hr*MU
+l0\$6q#$?U0)_rXUS4?ST=rLCS=$+Ui8'QkL0mr=N0@CNV4jTZ>[:TB?s[$BZ*CaAY-5+5n$)hH
+!/6:0+T(<GaiV`G_S<k"^V[b%_oKdAa2Gg-]"5Pa['?mAYcdQ$s*&%"H@1-iJ:W<)KnbD?Mi<XV
+OHPfmQC+)0S=Q7ETqeE\Vl?\tXfnt7Za@0M\[oGe^V@V%`5Td<aihoQcHsteeC<($f\,!5h;-uH
+iSrnYjlY^hl07L!m-O--n*fc9o()DDo`"Lbp@n=[q#C0iqY^6ir;HTcrdk*#s53j,~>
+JcC<$JcGNFo`"jgrVZWkrqZWjrV/VOp@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mej5T"ThVHu@g"=p,
+eC)ajcHXPTaN)9;_SEq"]XkY^[9?pMDKL='JBNH;J.?C-ASc0tCJTD-H[C'aG5c_+G'%eGE,TT<
+H$FOYH$aj_H?kR4NfA72DL?tbJ,XuqJ,FcjJ,auqIfP#tJ,b&rJ,XurIfP#sJc(&uJ,4ZqK)C9$
+Jc^RXK`-T:Ll%(PPEV/kNfB$WMi3RSNfX1$!0R8D$Bp^?R@^%ETV/!Prh9IeS=BACs-WhSrgNhS
+s-NqUQ'IStrf[;Dr/go=!fi8"rJh)AN/NUQN/ddp!0-W2q2GB7rf$r=NVeb:OSk7=P5::@P5(7=
+PkUI=QN*<OR/3-PR$X/,R/WNPRfAlVRfAlWS,f,XT)YDhTq\9VV5C,gWN#lss/R3CYHG(6[^s2i
+`lQBNe_&[9jQZ%#o(DeSr;6Ejrr1gTrr*i7r;6?eqtp6dq>'dXoC;;:lfmQmj5JkOgtVb\s4[V1
+h;8.g45SfKg=b*.e'c[ldD<nfP)"^GKnGDXKRnQ#LT\74HYQ>EBPqc]:47M:I8<X6<DudkMi*=J
+Lk^S<L$s]pL&cpersShRd_WPqSXGq9R[=#>s-41_QC!u+SXPh-OcGH`N/<=FM"$0!G@c&GI!pHo
+JV&N.L5:\EN/`m[P*;/sR$jG6SXuLJUSOcbWN*&%YHY==['mHS]"G_k^VRe*`Q-'AbKS5Vd*^:k
+eCN7(g"P3:h;@/LioB+]k2tmll0@U$m-X60n*ol<o(2JFrq-?dp\4X]s7u]kr;6KkrVc?eJcC<$
+huA3~>
+JcC<$JcGNFo`"jgrVZWkrqZWjrV/SNp@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mej5T"ThVHu@g"=p,
+eC)ajcHXPTaN)9;_SEq"]XkY^[7*Y[:/1[bs%rhq;,R3erDE8bo250Ynkg)X0JYIA2)[?X5sIV!
+5!D1m4?>Pdr](*?4Zu"nrBCWQ5<_h::/*l@:Jq*hpf%#er_`Ymr_`Sipegufr_rbnr)!Jm<;]\p
+;?0Yi;?0Sn;Z9Vp;ufkr;?g'"=BJX)<;ohq<;ol$<)lmt<`]3$!Ere.?O0n>>$>'3>?Y/.=8uD!
+=oV\)=Tho2=]ec'=92Q,pK.Aqr`9>)<)lt#=BAT'<rH"u<rQ2&=&rAu=T;M6>$4s1=BAR+=B\m2
+=]ec&=9)M#>5_S+>$4s0r`K5)q,mMsr`K)%r`f>+q-3l&s',J-rE]>-s'Pe6!b#PIqdBJ6rF6"A
+@q0%\B)Q9kAn5F`Bl%[-FEVt[Jqf,AO-Gs!St`*^Xf\b1ZEggD[^WfY]=ktq_o0L6rl>nubK@rI
+a2Z->aN)9:]="fAV4sQNR$O!9OV*\9O,f0VM2-e;Jq/;uI!^3drcnBcs*4]mH[L5?IK+[FH[9s]
+G'8"OG%Ybr=]\O$;c?+c9MA)D6;V>]3B&K61-@ZP1.Xr*7Q37ar]:EG<E3!s;c6@f;Y3ia;#c7Q
+L$%O\kk=9=lMp)KlM]uGkl0cFk5FKBk4e$=kkXHElKRR4kR$G9ki_-mki_*jroO.?"ln\(j5T(t
+i==f'hqm2EgtUT;g"P-3f`'JNf%&75hQLj9@UEDC>$>'1=BAU-='/O*=^,$6=]ea-<EE4$<)QXm
+;"7E_G@c&GI!pHoJV&N.L5:\EN/`m[P*;/sR$jG6SXuLJUSOcbWN*&%YHY==['mHS]"G_k^VRe*
+`Q-'AbKS5Vd*^:keCN7(g"P3:h;@/LioB+]k2tmll0@U$m-X60n*ol<o(2JFrq-?dp\4X]s7u]k
+r;6KkrVc?eJcC<$huA3~>
+JcC<$JcGNFo`"gfrqu]ks8)ckrqJ\Op@e1Po^qbGo'u5<n*]T0lg!`ukN:mej5T"ThVHu@g=Y$-
+eC2glcHXPTaN)9<_SO"#]XkY_@V0FuIZODpqjRDM!LT;SR/WKUR$j>/qNq/J!1EeQs-N_PrgEJK
+qjS+WNJraXOcWtHV5L/aT;%qVTFIH]R[TS/PbOtKU84QZrhKh6]t_<doQQ(_r13nZrga"Zrg`tW
+#+CsJR$a;0rg<\O!LB#LQ3*>;QN!6LQMm0MQN!6LR/`TPR/`QXR$X2.R$dl@rgFLiS=Q4BT:r!R
+USOiiZF76KZ*:A0X9>Z/Yd1V7[2HE^\@K8d_oKpEcd:(fdF-IhcH=5K`59C/rk]Mi_Sa=0_nj1)
+^V@Lr]",;W['R*EZa$d>riQ7'r2]dr!3,mprhfgsW2]Zo!3?+!ri?.&XSf1$XK29#s/l=&rN5ms%
+]uq<YctC;ZEppE['[9Lr3cU7q7-F5s0`$=\@B*A])TD?]`,VD^AbnI_#M7O_u@Rq`Q$!@aihrTd
+F-Lof%/L-g=tH?hr*PVkj@j1q"t#Ss8TDVVOt,eV5W[TT:;pda4QfI_O,=s>EYCX>FqXgWENJ0?
+sd,@Z*CdDYcY.4YOA^qKo,gQrp%hQaNMWA^VRV!_SX.*`lQ<D`P]F$]">J[ZEgjBYcdT%DKU/JH
+?sseIt3*&KSG8<M2R=QO-,TiQ'Rf*S"-(BTq\?ZVl6VrXfen4ZEpsI\@K5a^;%J#_o9U8aND]Mc
+Hjkbe'uq!f@em4gtgiEi8N\UjQ5Oekiq?sm-O--n*fc8nac8Bo^qhLp@e7TrqQNhrqcQirqu`no
+DX=@JcF[.J,~>
+JcC<$JcGNFo`"gfrqu]ks8)ckrqJ\Op@e1Po^qbGo'u5<n*]T0lg!`ukN:mej5T"ThVHu@g=Y$-
+eC2glcHXPTaN)9<_SO"#]XkY_=']<ME-_>2a+*u:#A\$eA8Q*s;>tqQH[9m]G'J1SFE;MDEGo^k
+GlW0iGmTRnNfHZHCNb;]r.+iuqL8KoqLANos*surrdXot!.Xuuqg\Qpr-n]sr.4Wns+13#!.t-$
+!J5t'K`-T;L5:\FOd),oO,f3XMMmISO-#J&OU@88Pa%H"R[fq?T)P>bSt2ICS,SlUR/i]SR08nF
+R[KTCQj&hBQBd]!rf[;DrK-r<r/Uc9",r4uN;ee:N:r;2O8Y%ANfB'YNfO*u"-/A%OSt4?OSt=A
+O9(K,qN:f@s-!VNQ'IStPQ$gFQ2d0LQ1^ICQiEETQ^3r(qj@>MrgNhU!1`tVs-s+\T)PA^SdD$_
+U8"EYV5C/hri%3DX/i>(Y-"h1ZF%-R^;@k1bKeMbg"tcOlg=34naZ2Ap%S:[ro=%Ur>#8-qYC!`
+q=sXSnF#W-l0%0hio&_NrS@M1s53k7%cQF,iSi_Ph:pW7f%&:!rmDq:`g)gJL5^hAM7JCoItEN@
+WI&]UE*$UCE-"WGI!pHnr_<l#;Gg8JM2R1EL4k;8mtC^pN;j:GhUB';T:;4<R[BE?QN3<MQ3N_E
+R[]S,P5^LIN/3=FM2$b=o7h.*GBeF[I!pKpJV/W1LPUeFN/is]P*D5tR$jG6StD^NUnsufWiN8)
+YctF>[C3TU]=bkm^r"".`Q-'BbKS8Xd*^=le^i@*g=tE=hV[8MioB+]k3(sml0@X%mI'H3nF5u=
+o(2MGp%A%Pp\4[^s7uZjr;6KkrVc?eJcC<$i;\<~>
+JcC<$JcGNFo`"gfrqu]ks8)ckrqJ\Op@e1Po^qbGo'u5<n*]T0lg!`ukN:mej5T"ThVHu@g=Y$-
+eC2glcHXPTaN)9<_SO"#]XkY_77]sB:/L^_peUrfohb0UohtK\#;n:m0/POD2uZ,C57p%B4Zkhf
+4?GVb3B/r\5<_:rr&t*Sr_<PCDbX+,;YO,d;?B]n;Ys>k;#!oc;Z0Pn;Z0Gp;H$Ooq,7Jq;c?Rl
+;cETlrDN_r;uBN";c["&<`E!r;H!Kns&B_3<E)su='&L+>@(ZC>Zt95>$+l*=T;J$=Su;%=Su;'
+>$5#+=T;G&=T2A%=Su8#=92K(r`98(<E<.%=8c2!<<?9(=8Z/%='8](=T)D$=9DW,='>6!!*T/%
+s&o8'"C#,7=]kT)!E`M(>5DD#>5hb)>Qn>8>$G6:rEK5*s'5V0ra#G.!FK76?NjhH@UWYPraGh9
+raYt=ral"<s'mHfAS5^nDK9lEH@1-jJqf5FPaIr2SXc4>St`'[XK]%>\\,Yl_8F40r5A`U_SZ8f
+&AZ#k['$@(TUhR?Q^3l!OH9C&&!)[,LP:A3JU`,tI=-EgHi87%H[L3hI=?ZpIt)orI!^-aGl;h@
+G'A.G>?b61<)QXn@80Ef5XIk:5W2(e.l8b>3\E0X7Rfg*2E!TX3]g>A<)QUj;,Hm^qb[<HqWS"F
+r9=7H!pT"8rTORNl07EqkND")kPs]>kPj];l2BfGkPj]Fk60r/k2k_'jSn0Jio/nUiS`VNhVHuB
+g]#n,g&BY(f.>M'e^W'rd,s;sJ9Gd:?!(03=]eg.=]ed/=]\^/>?P-2=BAO)<`N's<)HH];/UN#
+G^=[`I=HcuK7nu7Ll%%KNfT<cPa.Q%R@B_<T:r!TV5L8lX0&P/Yd1UC[^`l[]Y;.r_Sa@3a2lEH
+bg+P]dF6Uqf%8U/gYCWAhr*JQj5f=akNM0plKmm)mdKW6nF?)?oCV\Jp%J+Rp\ssfq>U6gqu6Nl
+rU^#>s+14.s*t~>
+JcC<$JcGNFo`"gfrqu]ks8)ckrqQNf!;?Eb3:uh5o'u5<n*]T0m-<j"kN:pfj5T%Uhqd)Bg=Y$-
+eC2glcHXPTaN)9<_SO"#]XkY_AnQ+-KTl;$rL3VOrg<_Pq3^lB"IPOBR$di=rL!SPp6tuM)Np,;
+OcYZf?_sWtVkKl\TqS3QT:DC=QBn;@rM'=erhKe6]t_:OH@M7[TDtM_T)bJ[Sc5/YRfJoQRJiKN
+QN*3MQMm0LQMHmER/WNRQirhGR[BK@R/rbGrgFgrS=H.AStD^NUSFW_Wii\9[Bd'>X/i>)Yd1XD
+rjDg:rj`9G]tq\/air$/ci),kbf[uFrl"iRs24lRs24lR$GjNn^V7Cn]"#2UrNlO/#I(D8Y-+n.
+XT#7*Wi<"tWMleqrM]^prMfq"WiQ-!!irE(rN6+$r2ojtr2omus/c:)rNHI1ZEpsG[/RK8\@K0K
+\Gs,:\,a#:[KF"K\@MOKqRc^=r4W-EqnN0Hs2"fS`;[^g`lH0Bb082ZdaQ^sf%A[0gYCWah@&9$
+jlu4(o_/(Vr;N&_*lP=dUTUJnXjjhRS!g+ihqF6^N*9:aQ'PNYVP0`\r`oJ2$XR">ZEq$EYH>(6
+YOA[rKnP?`+oUo]aiMWE_nj.'^;7\'_oBd=b/V?5]Xk\b\$<3EZ*:G'Y[_cuGBeF\I=6TqJqJ`2
+LP^nINK9-_P*D5uR$sM8StMdPUo(&gWiN8)Yd(OA[^WfY]=bkm_8=.0`lQ9EbK\>YdF-Lne^rI,
+g=tH>hVd>Oj5]7`k3(smlKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^<hqu-HkrUg)?s+14.s*t~>
+JcC<$JcGNFo`"gfrqu]ks8)ckrqQNf!;?Eb3:uh5o'u5<n*]T0m-<j"kN:pfj5T%Uhqd)Bg=Y$-
+eC2glcHXPTaN)9<_SO"#]XkY_>@(rYEdIY6_ghZ9*GoJ$Ci!m':jm\<I!L'aG^"FUFE;JCDf9rJ
+H$OZ5H2i0qOH,?\G\M&Ere(0$!eGlPqgSTrr."EhrdXlsqLABms*t#u!eGlPrdk'!s+(0#r.+j"
+qLed#rIkl;KnkSHOd))mNf8jPMiEg[OcfX+!0dAG"dPFDS!olHSH,2WS,\oYR@9TCRK&ZRRJrQT
+Q^3p9Pl?gGOo1=@NrkE(O8Ft;N<#"9NVAG:O,f9^NfEamrK$l<r/q#@plPT?PQ$gGQ2d'KQ0Xb3
+Qi*6KRJiTSS,&QSSbnubT:hmPUSO``VPsKns/Q+#s/l=&*ilBFZ*_!O]Y;1u`Q69Me_8m=ioK4`
+lL"*2oC_qXjo5D]qtpBh'`%Oup\+=Ro^_M>lKIBljQ#7ZiSa[ks5<n8s5O";$0'q&hqd&?f\"dR
+eM>V%dc$g_O,&^NM2RsgKRnQ#P-)-7GA9`>7r`N?:47M;I83R5<Dugl:5XpeLPU\?L@0]qKnPHc
+$1m93]Wn6$R@KZCQi<9aQ^3u)R@KV.P)bT`NJWFGL51P<o7gasG'A1WH[U<lJ:`E,L51VCN/`mZ
+OckroQ^F52SXuLJUSOcbW2co#Y->1;['mHS]">Vh^VRe*`Q$!@b0/&TcdC1ieCE1'g"P3:h;7)J
+ioB(\k2tjjl0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kr;6HjrVcBfJcC<$i;\<~>
+JcC<$JcGNFo`"gfrqu]ks8)ckrqQNf!;?Eb3:uh5o'u5<n*]T0m-<j"kN:pfj5T%Uhqd)Bg=Y$-
+eC2glcHXPTaN)9<_SO"#]XkY_77KpE9MkL]lVR%IohtQ^$oTgq1c7-K2F'Pm5X><5"["q/4?Ye*
+3<DE.4oRYG4oIPK:/+JX5>G#O;Y<u`;XmTb;H*Qmqc!Mm"]J;r;H$Nn<;ohr<<#ks<;ohr<;f_m
+;uT_r;uT\p;[cZ-<`E!p:/4Yb<)lut<<-(u<sVr5?<gZ:=^"u,=8uD%=oVS.>$5!1=]ef*=oV\*
+=TDS"=8l>"=8uD&<rH,"<rQ1t<WH4t=9D].=]tZ)r`K>*<`W<#=Sc+t=T;Ot>5h_/>[(B7=oMV(
+=oMV#=o2Cu>Q.k.>?_#1q-<i'#@:eG?XI2K@JsU4@K0j9AH$0>A4L3A@q/tWA7fOlDfB]:F*)VP
+IY*<1MMd@PO-5cpR@^.PY-PIF]"G_k^qmn(_8*h"]tCtg\[f5YZE1""T:D:8Q'7>kNfO's"cJ4m
+K7SROIK4fpI/eQnHi\YErdXls#_.ASI=6HgH$T@5!."Qg,(*g'=&r6u<)ZCf9MJ)B7o<PW3A2g-
+-p0UF1.Xu,7Q*1`r]:HI4B>H];c?Lj;,[*bqG73HK`:96l2KuJl2TuHl2TuIk5a`9kPXQAl2U&H
+l2U&Kl29cFk6U55kN:pgjlGM%ire<$io9sr"lS:phVHudg],t+fGrMof%&:!da?Ihcd(/%]9Inh
+?X-]8>$4p/=BSf*=;"\=>?P04=B8L(<E)mq;Gp=h;"IOoFEVkQH@('gIt3-'KSG8=MN!OUO-,Ti
+Q'[l,S"6.DTqeE\Vl6VrXfen5Za@0M\[oDc^;%M$`5Ta;ai_fOcHjnde'uq"f\,!5h;-rGi8WeW
+jlY^gkiqBum-O--n*fc9rpg*]o`"O`p&Ojcq#C0iqY^6hr;HTdrdk*#s5<p-~>
+JcC<$JcGKEo`"jgrqu]ks8)ckrV-EfpAX_Do^hYEnaQ#9md9B-lfmZtk2tdcj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2Q!6_8!^s]",:[C3"]YqO.>OqO.>Mr0RALl'MC:rgEJK"-JV'M#NML@&Bg!Vkg&_
+TqS-NSXc.:R?a*9UBIBfUnsmc^BJ,oH&82eqOdeZs.01]rgj%YrgWnU$CdQTR[BG/Q^3r(rg*/B
+q3_)J!1NhRs-ihSrga"[!hc9^rhBt"W2m,,ZEga;X/iD.['fnB!kGnSrk&TL]Y;5#a3)WNcd2U9
+#g^f>aMu3<`5MYm!lDjmrkeZM#f"*d]"5G[['Tb='XP*NZ*:I9YHFt.X/i5!WiE%tWiGrqr2Tdt
+ri5pts/c7'rN-.(Xf_K%s/l=(riHX2Xf\e1Yd(I=Za@*I[f3`=\@K/]]D9#<\c'#B\$icT\@B*K
+])TD<]`#P?^)t,*^V@S"_84%,`Q#s<a2c<EbKS5WdF6Urf%8R.g=uS^%,Tq&kN_L(nF6&DqYc`[
+s0=2QUo^](`5SIAR]3I9^mg[cK6i>XPF,]]Su&?a>?Y3=?X-a=ZF.$CY->.5n$)hFM>n^kg<@X[
+a25[.^VI\%^VRh.`luNB_7dFi]XY>S['R!>nuuGCG'A4XH[U?nJV&N.L5:\EN/`m[P*;/sR$jG6
+StD^MUSOcbWN*&%YHY==[C3TU]"G_k^r!t,`Q-'AbKS8Wd*^:ke^i@)g=k?<hV[8MioB+]k3(sm
+l0@U$mI'uB#4V0Ro(2MGrq-?dp\4[^s7uZjr;6KkrVc?eJcC<$iW"E~>
+JcC<$JcGKEo`"jgrqu]ks8)ckrV-EfpAX_Eo^hYEnaQ#9md9B-lfmZtk2tdcj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2Q!6_8!^s]",:R@:sJ#If+`4Ih$:0BOu!rCJoS/H[L3eHiA6uF`_\GEcH#9H?jg^
+GlDspH[:d7NfHo)Cj,].rdt0$rI=ltrI=ltrdY-$IXZcrrI4ZordaormstCg!.auurdt0&s+L<&
+s+L?)&qksnMMmITOcYT\M2@1POckomrf[hXQ^*euPEhK%R$sP9SXfYJ!M#YURfAcUR/NEVR$X2,
+QBhH6rf[;DpQ5B8!07&<s,R,=oT&X+s,d2?q2kT<s-!8A#*=t/OHG]irfm>Grg*DIoTfQFR$dl>
+q3h/Lqj[JQs.0%Ys.BanU8"H[V5C/hW2ZfrX8f7EXfSS)Xfo%<\$rlW]"Ghsa2uNKbg+Vdg>M)W
+m-aH;q>KOW(]O@/q=s[Vo^_M?mdBK1lg!ctj5JnQiVqd8huDO7hr*JmirA'=irA$Eio&\Lh:pW8
+fDX;#ec4)BdEfnePEUo\NJrj^R>-9DIts;OHuj[H>\6WJE_oMYI=?\F:(1'!:f3..MM[.EKnb<K
+KT6!>p?'o=[A'.YS!o_2rK[MMQ^7W<%@iiNPE:faNf/aMLPU`UL0f"GGBnL]I=?]tJqJc3Ll%%K
+NK90aPEhH$R@B_<T:qsRUo(&hWiW>+Yd1UC[^`lZ]Y2(q_SX71a2lBGbg+M\dF-Opf%8R.g>(N@
+hr*JQj5f=akNM0plKdg(mf)YZnF?)?oCV\So`Fj]p\ssfq>U6gqu6NlrU^#>s+14/s*t~>
+JcC<$JcGKEo`"jgrqu]ks8)ckrV-EfpAX_Do^hYEnaQ#9md9B-lfmZtk2tdcj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2Q!6_8!^s]",:=84cNOpeg?RlV[=Qr)"(b1G^^B2E!K[5X@V"5<_7n4?<C&s#C0@
+3Bo\+5Q3hJ5<V^>:'E.A:/OqgrDNSmr`&eos&&hqqGIAn;H!3c!)iAd!)i_ns&B"s!*&qrr)EVn
+!)iep"]SE"<E3#r;u]hs;\r;*92&/\<**.%<E<.&=]nd*<`iO.>$:i.#$G&0='8[0rE0/)=oDJ$
+=Tho2>$4u,<ruK*<rQ2"=SZ%u=9)G%<rZ5'<`N1%r`8hss&o>'#?b/1='/R-=T)>$=T);(=B8L*
+=Sl8$=oqo3>Q%b&>Q7n+>6%k+=oMV$=oV\*>Q7n">Q7n,>PDA)?!LZAqd95.s'bq:$"ILVAS#C`
+ARo?NAcH6h@Uiq\BPM9tCMds-EH?5EF`_\JH%(F'NffNmS><-dYd1XE\[oAa]=S!O*k/PaZEUO9
+Y-+e$Tq.X>Q'78fMMR%BL4tA9KS+i(rd4Tk!.Fios*XuuJ:N4JJ-UXTIXQWlH@#I6.!g/`GBS(S
+=B\g)<`E!h;,'\U5=.n15rCbZ/Mek=4#&K\7n,p,2E(Lq"]\T&;H$Km;"dc_;#c4Jl2U&Fl2KlH
+kPj]9kPFEAl2BoGl2KuJl2TrKl0.@/kPs]Bjo+6?j8Is;iVqa9hqe:es4SOIf\+p/f%/C#daHOi
+cd'h\bfe/jbaF0'@:*2?>$:i+&Qi1==BSd.=^,$5=]SU+<`W6";Z]io;XmUjF`qtSH@('hJ:W<)
+KnbD?Mi<XVOHPfmQC+)0S=Z@HTqeE\Vl?\tXfnt7ZaI6O\[oGe^VI_'`5Td<aihoRcHsteeCE.%
+f\5'7h;7&IiSrnYjlYail07L!m-X6?mfr:Oo()DEo`"Lbp@n=\q#C0hqY^6ir;HTcrdk*#s5F!.~>
+JcC<$JcGKEo`"jgrVZWks8)ckrV-Tkp@e1Po^i(Q1@al&md9B-lfmZtk2tdcj5JqRh;-i>g"4g)
+e'ZOgcHOJRaMl*7_8!^s]=DKbDKUGmrgNeRs-ibOs-VT.rg<\Qq3i@fNf/^TPEB1HVPg>dTq\6T
+Tq7jGR[TS-USFQZU8.[_#c#/L^qQLjJ"$>/qOdVUrga4_SXc1>S,JiZS!f\3op>]Gqj7;L#+:pJ
+R$jD3rgEbSrg<bTrgWeT".c$UU&LedUEHA0W2m)*Z*170XKf1B\[oAa]Y;2!_S<ds^;.Y,b0801
+d/M>rc-+5Ma2l<?rl"iSrk\ZOrkJ`Q^:_(h\[VRFrj;j8Za6t:Ym.G8Xf\\*X8T'sX8K!tWW0!t
+WrT0uX8]4#YPkU)YHIi+s/c4&!3cC)s0)@)#-tSB['mKRrO;p>]"@jPrO`!=rOMp=rOW'BpV$U@
+s1eQIs1eTLs2"]O"2i'sa8O*Zas"sPbg+S`eCE.%f\,!4gtgfChr3VYlg=-/nac;Fp\XshR/\hK
+ZDF;&Za[EZVP0NcYf5S_OI_20ITMYu=^7\oU824'>@1cE>$A8<\?W6>ZE:>!YQ0?6ruD%5gWRXX
+`l,[-^;%J"_ns=3aNV]D_nNam]XbHLZi@60YPka#Y[_ctGBeCZI!pKpJV/W1LPUeFN/is]P*D5u
+R$jG6StD^NUnsufWiN8)Yd(OA[C3TU]=bkm_8=+/`lQ6DbK\>YdF$Fme^rF+g=tE=hVd>Nj5]4_
+k3(smlKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^<hqu-HkrUg)?s+14/s*t~>
+JcC<$JcGKEo`"jgrVZWks8)ckrV-Tkp@e1Po^i(Q1@al&md9B-lfmZtk2tdcj5JqRh;-i>g"4g)
+e'ZOgcHOJRaMl*7_8!^s]=D'MA8-%1r.+Bgs*i=E.rB!5ASZ-u;1!Y;I!U*aG^4OUG'%bGE,KrH
+H?sg^H$O^^H'")JNI#>YJ,+`rK)L8mJGt&uIe8-bJH(3#J,k0"JGk$&J:W9'Jq<oQs+C<(re(0&
+re1o<KnkJ@MN!RUN/37GNKB<frfn.]Q^O>2QB[StQ^=).S=Z@ESt);LSGerWRfAihR[BJ1R$a5,
+R$X,(Q'@MsP*5a*rfI,As,d2?!0-f7r/Uu@NK&sYrJpr?rf@&?s,m8A!KiKBOT:LAOoU^CP5UIH
+OckomQ'IU2QM?gGQM6aCR/`TLRerTOSH#/ZT)>2\T`1YkUSO``Vl6SoWr8tDXKAS*Xfnt7['mHQ
+\@K5a^;7b,`Q60DcI(4ti8s7loCr+[rpp*hrr;p1rr<#tqt^!YoC;86kiUsdiSi_Prnmn9h;-rd
+hu2C6hr*MSro3t:s53k4s4[\0f[n^)rR;#"eC2jmd/M?2o9YZ"Lld[XOcbHQJ:rcC]>o#<B1QH$
+DfSHFIK"U*;GU%f;c?IfN/ERMLk^Y<L$jVRs!@O0e%E)aS!fe7Q^<u&QC!o(QC!u,R[KG(OcPK`
+N/<@GLkg_=o7pgtFa&(UH@1-jJ:W?+L51SAMi<[WOckroQ^F21S=Z@HU84W`W2co#Y->1;['d?P
+\\#Mg^VRe)`Q$!?b0/&TcdC.heCE1&g"P39h;7)JiT&tZk2tjjl0@U$m-X60n*olHncA@Srq6<b
+!;HHes7u]kr;6HjrVcBfJcC<$iW"E~>
+JcC<$JcGKEo`"jgrVZWks8)ckrV-Tkp@e1Po^i(Q1%Fc%md9B-lfmZtk2tdcj5JqRh;-i>g"4g)
+e'ZOgcHOJRaMl*7_8!^s]=C@$8PMqY;#4&T;!:dM;Z9N42DHsB2)[?O5X@V"5X.Lt4Ztee4ZbVa
+3'KPjr]gEHr]U6U"AM-V:Jh!gs&/eorD`_os&/eo"&`&r<;oet;Gg?f;#jMe;u]hs;ZKer;u]f!
+;c6Onr)<So!)rkrr_j&$<E3!u<E)rq;[HE%;c$+Z928GerE'D.=B\p4=&i7$=BYW,$!UY>>?P'2
+=]ef*=TM`1oiV8sr`B)"!`rE'r)iess&]M-<E3+$<E3*!<rcA%=U\D6='/R-=]\[,=BAT'=T;P(
+=Su7t=T;M(>5_V(=o_e*>5hb+>l%\)>QA",>5DD%>5MP(>QA"->5;D&>lS"2>[:T=>Pq_-?!^k8
+?i+43@:K1Fs()IHAS#C`AS,Larac+BB`;cHD#S8PDK,Pos)K0'GC+gmMN=$lT;/9^WiW>,ZEppD
+Yck10X/W"oUS@a_)5<^lR$<bpN/*%:J:2flH[9s`I!g6cH$ar:I04kFIt7NLs+(-!s*jurs*P#t
+H?jaZGBj(3s*+QgG5cV.O'>di<E<+!=%>tY90bj6?&([)0.8\+5!(DQ7n?-=3&W\o3sdr2<`W0u
+;c$@gp/1W^!/114s6'UKki_-mqr[tCqrde=s69IHros@Gs60RJl2KoCk6'l0k2u[)s5X1?rSdh9
+rnmh7hYu=2h#?"dg"=p-f%&:!daHOhcd'eZbKJ&MaiNMmRuM>n?X$T8=]ed,='&O,=]\[->$G-4
+=&i=&<E<'trDN/_@ruj;G^4U_I=HcuK7nu7Ll%%KNfT<cPa.T&R@B_<T:r!TV5L8lX0&P/Z*UgF
+[^`l[]Y;.s_Sa@4aN2NIc-FY_dF6Uqf@S^0gYCWAi8ESSj5f@bkNM0qlg4!*mdKW6nc&([oCW%T
+s7QHerV6Egs8)ZjrVZWmo_sFAJcF^/J,~>
+JcC<$JcGKEo`"gfrqu]ks8)ckrqJVMp@e1Po^h\Fo'u5<n*TK.lg!`ukN:mdj5JqRhVHr?g"4g)
+eC)ajcHOJRaMu3:_8!^s]=DQeF*WM*rgNeR!1NVL!1;K,s-WeRr0eRbO,]'ZOHO%LVPg8fUS=BS
+TV.pIS"#h4Q_UAUU].(hV$F]K^qam<HA_Qls.9:arLa+]!2'4]s.'.]rgj(Z$D!]XS=>t9R@0G0
+r0IGOQi39SQ^F,+R/NHPRK/cSRf8`QRfAlWS-PUTSXl:AStQ%V-)793V5L8mXfnn/X0B"B]Y2(p
+^r"%/a2l9=^qdk-b0&&Xe'ukGd/q\>aSj3ea2l<@`59@,_SQ5e$bsEh]Y(kc[C!<I[/RK4Zi@?2
+Ym7M:Y-"e,X/l0#!N`@$WrK%$WiN5%X8T+%X/rD*qQBn%riH:*Xf\c*Y7%M;ZE^[?[C*BK[C6"C
+rOMs?!PH,F]E,^[q7HL7!5&6C"MMOa^:jN[s1SHHqS3'Grk\WOrkecVa8X3\b5]Wlbg"GZdF6Uq
+f@S^TgCrAuhV[>SkNV@#mdKZ9o^qnRqu)o^0?pZ$Up7PE\b*V1SsuXui9$JoX`f8SNK[FN>+VRg
+W*3D.@:!2AZEgjFYHP4:Y3rNOs!%I>i5s'Z`PfU.^;%M$_ns=2ai_]B_nWps^:CYWZEpd>Xo5Nu
+Y\8-%GBeF\I=6TqJqJ`2LP^nINK90`P*D5uR$sM8StMdPUo(&hWiW>+Yd(OA[^WfY]Y2(p_8=.0
+`lQ9Fbg"G[dF-Oof%8R.g>(N?hr*JQj5f=ak32'olKdg'mI'H3nF?)?oCMVRo`Fj]p\sseq>^<h
+qu6NlrU^#>s+140s*t~>
+JcC<$JcGKEo`"gfrqu]ks8)ckrqJVMp@e1Po^h\Fo'u5<n*TK.lg!`ukN:mdj5JqRhVHr?g"4g)
+eC)ajcHOJRaMu3:_8!^s]=D-PB5;R:rIFHgr-m.F'5D;rB5MF#;LNt?H[L0cG^4OXFoHI]E;k1`
+H2`-iHi9!-=.a>PrIY*'r.Fs"rdjorr.+p"It7-?pON*k!.b$!s*t*#r.=p#!JH1+KE-Z'K`6Z;
+L51P?Ll%%KN/EFHMN<sdQC%T<+ISajSXPq3Q^=,0S=ZCJU7n3NSt2C=R[]h:S"6+>R@3r>$^[0F
+Q^*i#P*(lgOSt:AOSt:AOSt7:Nr"e<NfB%tNrP1=O91K)OSP"=OT(CAP5UUEP5LOBOoU^EPlm>=
+Q^7T:!1<JHs-EJIs-NeSrg3_SRf&ZTRKK%JR[a,C!1j([!2'4_s.K^mTqeE[VP^;kri,t!riH.%
+s/n_mZ*UgG\%&rY]"G\i^qmq-ai_lSdF-Y&jQl=.p\=U^r;?Nmrr<#trVZNfq"OOVo_%qQqt]sY
+o'br0jl,"Kf@S[Sg&K\2g"P6;hr!ALh;/%d&`;O)hqm2DgY1?5f$r3uda?J@dKJ%Ida?JAcQgfb
+e&nMOO,B'`P**YMKn4`%Pci#QEeI_*BPqc^:JH4bIX_8k$rg,$;2gEkM2-k>L5#&KNW14!o@(C`
+VOEm?R[9A+QC+&*Q^=)+R[KV2Q'.5hO,]$QLPYqanqUn#G'A1WH[U<lJ:`E,L51VCN/`m[Ockro
+Q^F52SXuLJUSOcbWN*&%YHY:<['mHS]"G_k^VRe*`Q$!@bKS5Vd*^:keCN7(g=k?<h;@/LioB+]
+k2tmll0@U$m-X60n*ol<o(2JFrq-?dp\4[^rqZTjr;6KkrVc?eJcC<$ir=N~>
+JcC<$JcGKEo`"gfrqu]ks8)ckrqJVMp@e1Po^h\Fo'u5<n*TK.lg!`ukN:mdj5JqRhVHr?g"4g)
+eC)ajcHOJRaMu3:_8!^s]=C=$92&&Xqb[8hlVQ\?pJMP[1c$jD2)[BZ5X@V"5<_4mrAt3E3B9,\
+5<es/s#pEVr_<PG:ess`;ZTirr`&hprDNVns&9/#<)cdq;u9Jl;#jMd;u9Pn;[$-!;Gg:hrDW_q
+s&/qt<W5r!;cH`q<W5qu<E/oq(fXF091hiQ<ENC.>$5!3>[:T<=&r@(>$V&4s'H%;>[(E9=B/F)
+r`]>+"^5&1='/Z)=oMP&=8l5%<E<3#=T;G&=T)>$=;Ft=<``:$<``@'='/O+=]ea,=BSd/=8c5$
+=8c8$=T_c-='5E&!a/W.rE92(r*')(!Er_,>lS%(>QJ,7rEB&#!*]>*!*oM-!*oJ+r`]D,>Q%h+
+>6.u7r`fA,s'>V1s'5V3qdBG4!+Pn:!+c"=rFZ%?"(l7^C]&#KD?"JiDfB]:F*2\OH$F^gM34'l
+S=Q7DTV8-Wrhg!tUS4<NR[BE?Poc6XR?s/#Nf8aHJ9lB\EcQ5CFEM_LGBeF]I=?WnI/\QoIM%'[
+J:E#rI!g9eG^+CTF`qnMrcSHhG^+FVG5HCaD.6aPr`/tt)f\nO9M.K=:P_:p6SBuH4?P8N1.au*
+7Q<:`4oRML<E<'t;H$@g;,I$bpe^tS!U/eIkkjQBkksW<kkaQEl20cGklU/7l2KlJkNM.,kPs]E
+jTt#1jQ,@]io8qrhuV`lrn[V0s4\1?g"4j,e^W'sda?FgcHXSWbKBh+!6G/['&hT=R;ZD<>?G$3
+=BJU*='8a1r`K2)%pE+;=BAU+<`N's<)QRj;"@IsFEVkQH@('gIt3-'KSG8=MN!OUOHG]jQ'[l,
+S"6.DTqeE\Vl?\tXfnt6Za@0M\[oGe^V@V%`5Ta;aihoQcHsteeC<($f\5'7h;-uHiSrnYjlY^h
+l07L!m-O--n*fc9o()DDo`"Lbp@n=\q#:*hqY^6ir;HTcrdk*#s5O'/~>
+JcC<$JcGKEo`"gfrqu]ks8)ckrqJVMp@e1Po^qbGo'u5<n*]T0lg!`ukN:mej5T"ShVHr?g"4g*
+eC)ajcHOJRaMu3:_S<gt]=DEfFFK(9r0dYSRe<*HR,"&-R/WNRRLtU>M2@CYP[:5dVP^)]US4EU
+rga.ZS!]Q@U].%sV50r`]tV7sP^IqJoq;/RqO[MRs-s@aR[TY3R@'A.rKmVRR/*0GRf/ZPRKAtK
+SGSiYStD\TUApu>UnsocW2Zl$Xf\e4\@o\o_o0L5ai_oUccjJNai_oUe'ut#f@JL&e'Q@^b5TQf
+bfe/L`5DSk&Ac/u_8!^u]tCk_['[0G['fh=!42[1#-kD9Xf\\+r2g:,X/`2#X/`5%Xo>I-Xfee.
+Y-5&,YlCp+Y5PU(Y6V;:ZEppG[^Q+Crj_s<rON!@pUpF;r4N'A!5/<E"2DXe^\YYJ^VIV!^qfrc
+rPAcV`5Ta:aiXM(--ONWcHjkbdaQatf@S^0g=tE>hr3VWkNV=!mI'K6o(2MJq>:/Ys"C^_WN!\M
+^[JV,St)pde\duTXdi[M>a(OX>FhI^USqF%?sm8E>-bECZ*:C9YHRAuMZ3qYkKM&f`Po^n^]2.X
+`PTL2a2cBE`PT=f\d#[NZF$m@Y5PX!Y[_ctG'A4XH[U?nJ:`E-L5:\DN/`m[P*;/sR$jG6StD^N
+UnsrdWN*&%YHY==[C3TU]=bhl^r"".`Q-'BbKS8Xd*^=le^i@*g=tE=hV[8Mj5]4^k3(sml0I^&
+mI'H3nF?MK!V>s_p&F^cp\jmeq>^<gqu6NlrU^#>s+141s*t~>
+JcC<$JcGKEo`"gfrqu]ks8)ckrqJVMp@e1Po^qbGo'u5<n*]T0lg!`ukN:mej5T"ShVHr?g"4g*
+eC)ajcHOJRaMu3:_S<gt]=D*SBl8-Gr.+BgpjUkF%;TWgASl7$;13k>H[:#;GmAS9FEMVEE,bf&
+#^L`BH$Xd`HB8&c"*A6rJG"QlJcLB"JGt-"K)U?$JGt&tJGXiqJ,t4OnU^[irdb9*JV&N,KS9>Y
+re1<(s+C`5L5(J>Ll%"HN/R[l%Z?F5Q^O81R[]e;TV8'NrgOOjStMgPUSO]\U8"<PS=5t>SXobO
+!h5UGr0Rk[R$X2+Q'IMpOcY\(OT:L@OT:LAO8k4?O8P%:O84h9O8G%=Oo:IAOo1C:P5pjFP6@,8
+QBmm7QMHmIR/WHOQMHmIQj/tGR$jA2Rf8cVRf8fVRfAlZSXc5LSc55\T)kUZr1X.b#,@ujVPg>j
+ri6"!s/c7&#-P/5Yd1XErjP8)\[oDb]t_A!`5g!DcHjheh;mhgn+$#Ap%J+Rq"XUXp@RtHn*]Q-
+lg*s-o()8:lfmKggtC9/eC;stf%8R-g=tK`hZ_lohVR)ErnRP.$JO.`f$r-qcd'h^r6>Djd*^8?
+coKM%daQ^sf\=U)PECc\Q'IQHNeW4<K8?"[I!L9`9P$n:F%K,SI!^9k:/4ef;G^,HMi<LJLP:J:
+mY$T"'("Pn\Z2-fR$sA.QC!u*QC!u*rg41bR?NksNfT-VLkghALP55R@ruj:GBnL]I=?]sJqJc3
+Ll%"JNK90aPEhH$R@B_<T:r!TV5C/iWiW>+Yd1UC[^`l[]Y2(q_Sa@3a2lEHbg+P]dF6Uqf%8U/
+gYCWAhr*JRj5f=akNM0plg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Wirqu`noDX=@JcFd1J,~>
+JcC<$JcGKEo`"gfrqu]ks8)ckrqJPKp@e1Po^qbGo'u5<n*]T0lg!`ukN:mej5T"ShVHr?g"4g*
+eC)ajcHOJRaMu3:_S<gt]=C@%9MP=ZrDEGgr_`>bj&,VM#rOIo0fCsK2aKb/5lX%T5!;%h4$>S`
+4$!+$!^/_3r_<Sj5#+jMq,@#e!)rens&8kqs&K(ur)<Mkr)3\s;cH`q;uBVn;u]bo;$'Wo;uBVn
+<W5tr<W5tt<<-"r;]/D*92&2_=BSj4>$G6:?=$oA=&rI.?!^lFra6=F?!U]==&rF+>$>-7>Zt94
+=SZ,"=9)G"<<6-&rE'#$q,[St<W6#&<E<1&=]t]*s&oA*!*T2$!*B)#s&fD*=',?&"^,#3>$>/0
+>5VV'>QA"&>l%Y&=oV\'>Pq\)>Q.k/>$G51>l7h(>lS+.?N4:2?Me.1@/sd7A,^$<AH6?AAcH?E
+B4u$qrG;IM!,hdSs)8$[F*.D(5'D=*M2m[\PE_>uQC"#.R@0G-PELudMi*@IM2[LWOH#*PK7A5m
+FE2A?EH6)@F`r"UH[U?mIXQZnI=-EjrdG-$I!U$]G'.kIrGi-aEccDGF`qs'FY\2eG'I.l=Ar7"
+<+em!91hH:84Ps)4"r-A.m5sG1.Oo+6q0*n4$,Jb4'#B];H$Fh;"mi];#fbWkPXQDkP"*>l20cG
+lhfrKlg!d7l20]AkPsZnjlY^ejQ#=]io8qUi8EMLhVI#CgtUQ:g"=s/f%/C#da?Fgcd'eZbKBh+
+!6G/[%*$9*`7j%SM0rc>>Zq&0#$=o-=BSj2r`BJ1>?Y66<`W:&<rQ&$;c6Fi;"@InFEMbNH$Xgc
+IXls#K8#&9M2I7OO-#NgQ'Rf*S"-(BTq\?ZVPgDnXKA\1ZEpsI\@K5a]t_A"_o9U8aND]McHjkb
+e'uq!f@em4gtgiEi8N_VjQ5Oekiq?tm-O--n*fc9rpg*]o`"O`p&Ojcq#C0iqYU0hr;HTcrdk*#
+s5X-0~>
+JcC<$JcGHDp&=pgrqu]ks8)ckrqQNf!;?Eb2>$M2o'u5<n*]T0lg!`ukN:mej5T"ThVHu@g"4j+
+eC)ajcHOJRaMu3:_SEmu]4>JjFb>kTS,\rHRK&Z;QN3?EQi<BPR2_0FLlmmb?DaWtUo'i\Tq\6S
+T:D@<R$X/8Uo"'drM9b4^VIU.gj=tMTE(V_T`:Y`ScGD^T)Y>`St2IErLF(]S!ob6nsTEEs-rtU
+s-X([S!oe8S=KPKrLP1)TqS3TUSO]^VP^;lX0&P-YdM'X`5g!CbfnA\f@eg+dJhGsdaZk$gYCT=
+rn7P,da?Cfd/D5mbfIiD`;[U]_8=(*^q[Om\$i]QrjDa4rj;a5rj)X1YktU%XTGT(X8]4#XoGR'
+Y6V;8YHG(4Yd",3!jJr6qQU71Z*UgE[C,tBs0r9D]"5Mb]".dN!5&$=!58?F!l)I`rk8<Ds1JNK
+^VI\_^Au"I^])"K_>_=M_Zn&u`Q-'Aao':.bg+M[d*U1heCE.%f\"m2gYLcFioT=bl0I[%mI'H5
+o_%tSqu$G]s"M$hVQ7,Fa1CQ9U7Sm"`ocEIV3>OnMjBZ2?)jQlVl*^'=^bWA=g><>[]cm=Z*1A"
+Y_rG_r9r"OrknfSrkK;c_o9I0`5p$Eai2-2]=GSb['R*EYcdr0p987PFEMePH$XjdIXm!%KSG8<
+M2R=QO-,TiQ'[l,S"-(BTq\?ZVl6VrXfen5Za@0M\[f>b^;%M$`5Ta;ai_fOcHjnde'ut#f\,!5
+h;-uHiSrnYjlY^hl07L!m-O--n*fc9o()DDo`"Lbp@n=\q#:*hqY^6ir;HTcrdk*#s5X-0~>
+JcC<$JcGHDp&=pgrqu]ks8)ckrqQNf!;?Eb2>$M2o'u5<n*]T0lg!`ukN:mej5T"ThVHu@g"4j+
+eC)ajcHOJRaMu3:_SEmu]3/EMBlSOuJc(&mJ+\9XIfOreIi)p6ASl:#:jmb=H@:'bH$OXZF`_YE
+EH#mpH3&;;rd4X*"HH``D0>E%!.t3&!ePuSrdb$"r.=p!!.auus+()urdaQjs+:3#$@m\YJqAQ)
+JqJ`0rIt9)rdtK0KnbA<LkpnFrepc5%ZQU9R@9V8SXl@HVPpDgrLa4cU8@je#cOYuVPU#[T:Z%S
+"JDH]T:GnL!goCErgEeR#*tO<P*(lirfI2BrK.DLOcb`eO,f6]O7\J4N<,'#qN1`>rf[8Cr0%#B
+#*b=8Pa%GsrKIDLPa7X6QNWV>Pa.R4Qi3<IQhZsGRJ<6MRfJuUSH,8\T)bP\Ti.V[UnjiaVPgAl
+Wi<#!X/rG*Y-5(7Z*UdE[^NZS\@T;c^;%G!_oBd>bK\DbgY_#PkNV9umdKW4md9?*lKRNrk2k[c
+jQ5OdkNCpbhqZl8e,@]"e(*%#f@ep7rSA1Cg=k64f@\^*eC;pnd*Bq]cHZ=3s3:Shs3EsWdF$Ck
+eCE1(gu%/Sl0S24PDtTaR$j,LM1pS:M3PftGC=F.7;-[[8PXb_I"$K>:JOhe:f!%/Mi*=FL51J8
+mt?]#%HQ0c]!%ZmR%'G0Q^=*;QOT=MR@K\1PEM#eOGesOreCK,nqUq#FEMePH$XjdIXm!%KSG8<
+M2R=QO-,TiQ'[l,S"-(BTq\?ZVl6VrXfen5Za@0M\[f>b^;%M$`5Ta;ai_fOcHjnde'ut#f\,!5
+h;-uHiSrnYjlY^hl07L!m-O--n*fc9o()DDo`"Lbp@n=\q#:*hqY^6ir;HTcrdk*#s5X-0~>
+JcC<$JcGHDp&=pgrqu]ks8)ckrqQNf!;?Eb2"^D1o'u5<n*]T0lg!`ukN:mej5T"ThVHu@g"4j+
+eC)ajcHOJRaMu3:_SEmu]0o(]:/:U]q,./gqGI&bqbdAkohb]cohkWb"#D\c2?#K@5sR_$5X%@s
+5!1t,3t=513]TDi5X.Is5<_4o9`@ch/5f5>pf$lcs&8kos&8nrs&Jkos&8np!)r_n!E2nq;uTbp
+;uKVo;$'Wo;uBVl<<-"s<W?%u<W?%s;]A\6:JO\a<**7->[1K<?=RMS?<UK8>?kKA?t'"A"^bS>
+=]ef*=p/&8?!LS1=U&&4=BSd/=8c,'=&rC)<`N3"=SZ#%<`N1$<E9$"!*K)#"'So3=oDD%=T2D#
+=T;P$=T;P.=^#$6>[%)1!aJr7rE]2'!*f/#qciu%"^>5;?<gb6>Q%b)>6%q+>ln>>?iF@3?i4=3
+@K'a7A,g'>Ac60<AHld\BkhEuCAhrKD>eA_DJsH4EH6,BFE`+_KSG?_MZ8Y7N<tQ%MM[(AKnG&2
+re))AL51P<Jpr&jFE2>>EH6,CF`qqQH@1/?IfFirHN8BiGlr;7G'*Y&s)IsWs)\3^qK4<4H$asi
+Jqf/H>Zt--=&rC&CeRJp5XIqLMEs6[.jHf54"`9[84H';3&WYn3sn#L<`E's;GU.d;#*u_;#f_V
+kQ'f?kl'cElMg,IlMp2LlMp)Mkiq@1kQL)4l0.@1kPs]Djo=BEj5T+YiVqa:hqm2gg_ef"g=b03
+f@JO'eC2mpdEg+`c-4DTaiVX'a8a-\`Pf[n_C*Ud[!6V)?sQo;>?P'/='8X/>$+j.=^#$5>$"^)
+=B/F%;c6Li;GZj\BleB=GBeCZI!pHoJV/W1LPUeFN/is]P*D5uR$sM7StD^NUnsufWiN8)Yd(OA
+[^WfX]=bkm_8=.0`lQ9EbK\>YdF-Lnf%8R-g=tH>hr*JQj5f=ak32'olKdg'mI'H3nF?)?oCMVR
+o`Fj]p\sseq>^<hqu6NlrU^#>s+141s*t~>
+JcC<$JcGHDo`"jgrqu]ks8)ckrqQNf!;?Eb2>$M2o'u5<n*]T0lg!a!kN:mej5T"ThVHu@g"=p,
+eC)ajcHOJRaMu3:_SEq!]4YetH]"3gS,\rFR/iWJQN3EFQi36DQiEElP`L][OHGc5VPU/fV4j]W
+U7e0OS=Q+;QC"DDrhTLh!2fb1"MUOWJ=>htrgs7`T:bkL"eD6VSXc2KRf&QRRf&QSR[O)B"IkjK
+R@4&Cs-s%W#+M-RSt2IDrglfUTV8'RUSFZ_V5C2jX/rG+YHkUM_oKpFdF6UrgYh)Nh:^B/e'ut$
+h;RDSiSrePh:gN4eC;ppdF-@cbK.`D`5BI/_ns7*^:_"dr3c^8['mFA[1BXNZa-j?YHP16Y-"k/
+XK2<$"Kei0YHRl.s02d4Z*CU>Z*OA8!jo;?rj)R1"LPSF\$u@H!4i*?!5&3Bs18<C]DK8@^&PbF
+^&PhF^]2%G^&PhH^Au(H^Au"I^B)-dr5/HOrl#&\a2lBEb5KL4bg"GZcd:(fe'ut#f%8R,g=tH?
+hr3SUkNM0rlg4$,n*oo@p\=R]r;N2c0\<M1Wk?Kt`:gO4TUi+%i9-St`en#S?'C[Z>G%XaVl3j)
+?sd2C>-bE@Z*:F:YcdH!MZ4mrnC57l_o'@*^qde(`50@0a2uNI_o'=*]"Yb`['[0DYH\#2orr+N
+FEVkQH@($fIt3-'KSG8=MN!OUOHPckQ'[l,S"6.DTqeE\Vl?\tXfnt7ZaI6N\[oGe^VI_'`5Td<
+aihoRcHsteeCE.%f\5'7h;7&IiSrnYjlYail07O#m-X60n*ol;o()DErq6<b!;HHes7u]kqtpBj
+rVc?eJcC<$jSs`~>
+JcC<$JcGHDo`"jgrqu]ks8)ckrqQNf!;?Eb2>$M2o'u5<n*]T0lg!a!kN:mej5T"ThVHu@g"=p,
+eC)ajcHOJRaMu3:_SEq!]3JZSD0:7(JbXcmJ+e?XJ,OigIhHU4B4YmpD,>Y-H[L3dHZs[YG5cU`
+EWg<"H?sl8HN&6rOH5E]H"q>LmXtOkqgnWrrdb0'JV&LQJcC6#J,XuuJH1;pJHURUJUi:LJH1<$
+JH:@Tre(9*re16&!ec8]reCQ2M2M:js,%DIO-5ftSY2[NU84]gYH=e$V#I%uUSb#lXf\\*Wi2ej
+UnaZYrLj=dT:VSLRfo1IQ^3p5P5LFDP*(n*OSt4GNfT6]O,f9]O8b1>N<#";O8b7?OoCOCOoLRF
+PEPp/rKR>G!0mDHrg*GJ".#4;QMR!KQi*0JQi3<LR/i]SRJE9QS"-#FSHtj\T:_dMTqJ.YU].(h
+V#[ClVZ`rtWN*#uX95T-YHe)4;7!X;\%&rY\[oDb^;.S&`5]m?b0JJdf\,!7hVdDRjPo.VhVI#E
+hr*GMhqm/CgYCT=g=Oj&cd'eZc-ObceCN7)g=tE<gY:H6e^W'qdEp5=cMc#dbl#^KcHjkce'lgt
+f\,$8iT04hnFQALr6DF/O,T<lR[2-WKnP#/Pcr2VF/!DCAk[/b8kj\[H[^H?:/t1i;,7+K"c8"h
+KSG3LKT6!Cn^PXhZD!YQR?j2,Q^F/,R/WE[R%'J3Q]mVpNf]9YreUT/nV:e!FEVkQH@($fIt3-'
+KSG8=MN!OUOHPckQ'[l,S"6.DTqeE\Vl?\tXfnt7ZaI6N\[oGe^VI_'`5Td<aihoRcHsteeCE.%
+f\5'7h;7&IiSrnYjlYail07O#m-X60n*ol;o()DErq6<b!;HHes7u]kqtpBjrVc?eJcC<$jSs`~>
+JcC<$JcGHDo`"jgrqu]ks8)ckrqQNf!;?Eb2>$M2o'u5<n*]T0lg!a!kN:mej5T"ThVHu@g"=p,
+eC)ajcHOJRaMu3:_SEq!]1,@b:/4[_;!h-Y;#4&f;YO&e;"dcd;@#0:1,:^G2E!l#5S$.E5<V1n
+3]fJc3''&\5X>94rBC3U"AM*U:Jppdqc!Poqc*Pnr_ibp!*&qtpJh/ks&/kqs&9&"<)`cor_rhr
+r_rhps&&bns&8qq!`N&tnPoQgrDW_q&lVY);H-Xt>$P?>?!h)SB4bLVrE9V6?=78SAR](U?<g]=
+rEB,(!*fG+r`T2%s&fe4<E<.%='/R*<E3($=8l>%=8uA&=8c/!<WH8$=8l>$=o;Ct<s2W,=BJ`)
+=T)A*>$5$4>PhY*?2e(0?!dD6!a]/<r`oJ,"'J`.=oMV(>6%q->6%q,>Q7q.?2e+,>Q7k,>Ph\*
+>manG?s[/H?XR5K@/aU6@f0a5AH-6>AcZOXrb;CJ")MgkDZ+DhDfBW5E,fl<Ecu_SH[U?lJ:W?*
+Jq8H%If4ZpJ,XsGIsufoIXQTiGB@hCDf0H2EccMLH$XgbI!pBhH[9s]G'8"MFE;JBrc7sWqf;[W
+r,b&DGBeC[IY!3/NK96gRW2qC=&i:%=B0379hS2F85G(.2bbtS1b1^N/i#se77Ka*2ENr\4$$DC
+<)Z^mr_WDfpJ:nSl1jK>l2U&Hli-2Ili65Ql0@Qul29cEl2BiGk6:#0k2k^cro4%=iVqa9hqn@g
+!SlH/g)AYsf@JL%e'lamd*L%`c-=JUb/qfJaN)<?`W!df_ns7*^q[V?`JA>A?!UZ:=]t`+(g0sF
+>$+j.=^,$2>$+j.=B/F%;c6Ol;,Hd[BQJ9=GBeF\I!pKpJqJ`2LP^nINK90aP*D5uR$sM8StMdP
+Uo(&hWiW>+Yd1UC[^WfY]Y2(q_SX71a2lBGbg+M\dF-Opf%8R.g>(N@hr*JQj5f=akNM0plg4!*
+mdKW6naZ2@oCW%Ts7QHerV6Egs8)Wirqu`noDX=@JcFg2J,~>
+JcC<$JcGHDo`"gfrqu`lrqZWjrV-EfpAX_Ao^hYEnaQ#9md9B-lKRQrk2tabio/hPh;$`<f[n['
+da?Fec-+8N`l5j4^q[QkASlO>NrGRKS,JfFRJrT<Qi!*BQiE*`MNX3e?_sWuUo'i\Tq\3RSt2C@
+R@0D:V#@.iVZ3Ro]`u6c>5rl)TB`*HTCe]USXf\K!LfGSRf8`SRL>URR[]e8R[KS4S!s;F!h>gP
+qO[_[.A<K2Unji`VP^;lX/rG+Z*_$U`6-HWf\G<>jlkpkj5A_Gf\"m4hrEo!l3cY5j5JqPgXk!+
+eGdo"d*0YR`r<mp_o0F.^q[Ro\[],Y\@8rW\$`WP\$`WNZa-k8YlCs1Yck75qlTn$#d:J:Z*CO;
+Z*F85"gPGA[C3OB[/dT4[L]dS\%&rY]"G\h]tV>"_8#u`!5/<C!PH,F^AbhG^AbkL^q[Y"r4_m>
+#/J'j^qmq,rke`Srl+lV"in^*ai_d)b5ffdcQ:H\daHUoeCE.$f@S^0gtglHioB1al0@U%mI0Q8
+o_nLeq"agbrLEmAZE:F7cHj`7aeb`'\?F34U8G&N>ZXsmQ<7FfT;&0]>$G-<?X-d?ZF%'EYH>+6
+YOJcRs!%C5f"f8A_8<t%^qmq-_SX:1aiqoI`PT=#]t1_ZZa6m?YPtg"Y\A-"F`qtSH@('hJ:W<)
+KnbD?Mi<XVOHPfmQC+)0S=Z@HU84W`W2co#Y->1:ZaI6O\\#Mg^VI_(`Q$!?b0/&TcdC.heCE1'
+g"P3:h;7)JioB(\k2tjkl0@U$m-X60n*ol<o(2JFrq-?dp\4X]s7u]kr;6KkrVc?eJcC<$jSs`~>
+JcC<$JcGHDo`"gfrqu`lrqZWjrV-EfpAX_Ao^hYEnaQ#9md9B-lKRQrk2tabio/hPh;$`<f[n['
+da?Fec-+8N`l5j4^q[Qa>@M8bH2N6fJGXiiIdDR]IeJ71CMIKuD/<'sI=-?hH$ag^G^+=QFEDPC
+Dg?YSrd"Qkrd5!4NfK)idqj2Znq-pqre(0$rIOlurIOfss+(0#r.4j!pjrHss+13#"G)/UJV*lP
+!J5t%K`$K&KE-`*L'*3eM2M7i.#a.HPF%f4Uo1/jWir\4YcOk&US4EXW2m&*Za?s=X/`1uVl$;b
+TqVI[!hc-UrL=4cS=H"7Q^<u%PEYd)s,m>C!0R5Ap5f66$]U1-O,f6]O-#HcOo:FCOoCOBPQ$gH
+PmrtAPE_>uQ'Rc(R$jA2rgNqVR/<6LR/WHMQN*9TR$X/,R$mQ7$(76NS"-">SY)PRScbUXT:c(T
+!29Cds.oRhrh]drWMuorWue@EY-5(8Za7'I[^WcW\[oDc^;%J"_Sa@5a2lBFbl5iqcd:1le^W'r
+d*U1geGdu*eC2jnd*L(abfn6.aUu\=bg4_de^rF*f\+m-e^DgirQY;bs31PhrltDe'[P.RdaQ^s
+f@em4h;@2Ql0Rs5qY^9k+jJf,OH>EjS=Au:LkUG7Lm>&kH@]d(6q;9;8PXYZI!gJD:B+5n:f%(L
+!K)^4L&ls]qh4ZsNW0R[c+U`rU6V+6Q^F,+R$a5-rg+"[R[fk7Pa%;kOH#4uL]W<dL%:"5EccGI
+GBnL]I=?]tJqJc3Ll%%KNK90aPEhH$R@B_<T:r!TV5L8lX0&P/Z*L^D[^`l[]Y;.r_Sa@4aN2NI
+c-FY_dF6Uqf@\d1gYL]Bi8EVTj5oFckNV6rlg4!*mdKW6nac8BoCW%T!quB_rV6Egs8)Zjrqu`n
+oDX=@JcFg2J,~>
+JcC<$JcGHDo`"gfrqu`lrqZWjrV-EfpAX_Ao^hYEnaQ#9md9B-lKRQrk2tabio/hPh;$`<f[n['
+da?Fec-+8N`l5j4^q[QN7n?9J;>F&g;>jDh;?'J^;>X8f;>X2`;(FIY1,UsJ2*aGn5=%Is5X%=n
+4$,Sc3''&a5X.Lu5!D+m5>4gI9dbNe;,[6hqc*Mmqc!f!;Gp@h;H$Nc<;fbq<<#qu<;oek;u]bq
+;$g-!;H$Ll;H$OopJq2nr`')#;c?Xqr`&nr&Q2V1=^,3>?t!MWBP:sc?X$_5=Vk@O@qKCeA7/bN
+?!U]>>$5!4>$G9;>?_#/!E`M(=T2J&=8l>"=8l5#=8l>%<rc;"<<6-%r`B/%r)`r%rE/bpqH3]!
+r)s))rEK>.rEKD2?sin=!+,V/s'5t9>$>$1=]np2>$Co0s',P0oir>>>[1Q=>?kE=>[1Q??=.&I
+?XI2K?XI2KrF#\8raYq<!+l(=!+l(?s(;OLBk_@!D/K8i$#OQuE,]`5DJsLnEW:%kF*)JEEclVO
+GBe:QFE;MFG'Eq1+Er!OFEDSFE,TZ3CM[j*E,fuCGBnL\H[9s_GBS(KE,bbqqJuLT!-7sX7<EZr
+G^4X`IY!30NKBBlS=l^WXE/_m<``:%='<.39hS,F6:Y!A2``WA,:G`;/i-'j7n#m,2)[NX3BC2A
+<)lgn:/Oj`;>3ockkXK>li68Ilhp&Il2TuFl2BiGkPaQCjo+6[j5JtTi8<DJh;-l@gY1B7f@SU(
+eC2mpdF$=ecMl&lbfe2Pb/jS&"NJF"`5DSk*PoP*^:h4mi6d*e>@(Z@=BSd/=]\a/>$>$0=BSl,
+=p8#/<`N.#rDN_o;Z0Jc:harlF`qtSH@('hJ:W<)KnbD?Mi<XVOHPfmQC+)0S=Z@HU84W`W2co#
+Y->1:ZaI6O\\#Mg^VI_(`Q$!?b0/&TcdC.heCE1'g"P3:h;7)JioB(\k2tjkl0@U$m-X60n*ol<
+o(2JFrq-?dp\4X]s7u]kr;6KkrVc?eJcC<$jSs`~>
+JcC<$JcGHDo`"gfrqu]ks8)ckrqH]lp@e1Po^i(Q0CeQ#md9B-lfmZtk2tabio/hQh;$c=f[n['
+e'ZOfc-+8Na2Ps5^q[QpBQ/3LPQ%*MS,\rIRJrT<QhZmCQPkmGMi3[[P[UGfVPg5_U7n<UT:VRA
+R@0G0r1sOnVl-AhrOrB'Q[b:eTE(\bT_b8\T)>5\SctaXStDXGrgWtXqjISSR[X5Fs-inU!h,OG
+rgWnW&"]DcSt;RHStD^LU7n?XV#I2YVPpJpXK8P-ZF7?[a3E,ei8j%alKdd#k2bLWgtUZBio]On
+n*o`0kN:pfiS<,<f%&=%eBlF]aN)<>`l5j5_SEq"]DfD@\H0:OrO3'@[C3EIZ*CO;r36:,YPbR&
+YQM/9Z*OA6!4)U/"L>AA[C5q@s0hs:s1&'=#.qO^^VI\(rl+oU$,aNk]=GJc^qmne^Au"E^])%J
+^@f5@_#D.O_SjFm_u7OS`r=!\aN;QHrQ>>fcHjkbrmLhq'%GI^f%8O+g"G-9hr3VWkNM-prp0^S
+n+$DJ%e9/_o_/"Qq"jmaq>1$gV#N-`ZE`!)dEfMaYbRn_WlElVPba^hHA>dmR:'6kVkp@q>[(WD
+>Zt=;ZaI'BY-G:8n$%]L#5?od_o'@.rkK>e_8X=0`l-!Dc,dlA^:V"i\[AcMZEUM2Z1Y>8EH?5E
+GBeCZI!pHoJV/W1LPUeFN/is]P*D5uR$sM8StMdPUo(&hWiN8)Yd(OA[^WfY]Y2(p_8=.0a2lBG
+bg"G[dF-Oof%8R.g>(N@hr*JQj5f=akNM0plKmm)mdKW6naZ2@oCW%Ts7QHerV6Egs8)ZjrVZWm
+o_sFAJcFg2J,~>
+JcC<$JcGHDo`"gfrqu]ks8)ckrqH]lp@e1Po^i(Q0CeQ#md9B-lfmZtk2tabio/hQh;$c=f[n['
+e'ZOfc-+8Na2Ps5^q[Qd?=[hmHMi?dJGt&lIdDRZIenO(ChmWqCi!ueI=6HiH[0o9GR8P8F)uAB
+EH$8MrHeKk$%%&\NfB$BHZ4E'KDpQ'KDpH&Jb+HuK7\]-K7\Z+rIOp!q18Kr"G))SJq<oQs+(0%
+qLf'*KS4u3L5#V]",D_iMZ/MBN/`jZPF8#;W3*8-Z2V$NYH=k)UnaZ]W2m),[C3NMYcb+1XJr(l
+TqS3TUS=EQqjd_WrgEeQ!1*VKqNLf=rK.&?!0I)=!06l9!g&J)rfR)@"-\n2PPg[DPld28Q2['d
+Q^F20R[]k>SXl:@S!o\0Q'I`)R@9M0Qi36KQN3EPRJ!!RS!f\6S"-%?r1<n[r1O(`s.]Og!2TRi
+!2f^m"/r3!Wr8t7XKAY.Z*L^C['d<N\@B,^]Y2%o^V7M!rP8KLrk\WM%Dg!%`Pf^4`5KX7aN;R&
+aSs6[`=Kl'_Sa=3aND]McHjnde'n<E#11]Cd*Bn[rlYGgc-FY^rm;P1e'caqe'ut$g"Y?>i8N_Y
+kj.X*p%eU]s"Wo1P`MZ1SXbhINJ<+:J<[+QG^O^?>\6ZME_oGWIX?Q>:JXqf;,C&HMMm=ILP1D9
+qh4WrNrK=[c,IE)UmCqG'pk;SR$a5,R@'J7S=,Y,OcYT`Mi!;iLB*"uLM:aLFEMePH$XjdIXm!%
+KSG8<M2R=QO-,TiQ'[l,S"6.DTqeE\Vl?\sXfen5Za@0M\[oGe^V@V%`5Td<aihoQcHsteeC<($
+f\5'7h;7&IiSrnYjlYail07L"m-X60n*ol;o()DErq6<b!;HHes7u]kr;6HjrVcBfJcC<$jSs`~>
+JcC<$JcGHDo`"gfrqu]ks8)ckrqH]lp@e1Po^i(Q0(JH"md9B-lfmZtk2tabio/hQh;$c=f[n['
+e'ZOfc-+8Na2Ps5^q[QO7S-BMpe^ufr)3DhqbZf[qbmAipe^fa"#Vnj1B'0E2aBVo5X7Lt5!D+j
+4?GS`3BK;#5lX%O4[2+p:&[li5#"gKq,@/iqc!Dls&/hn!`Drqqc!Por`&nts&9)#<)Z`p<<#ks
+;Ya8j;ZBSo;Z'Go;H*Qopf7>q!*9%upf&)1<`iO2?t3bZAnPag@piVJ=]ed/?!h#OrauIH@:*>I
+?!LP3=T;P(>Q@t,=TDS&=oVV'=UJ84=]nj/='/U-=T2>(='/R+<rH%u<rH+s=9)M'=92Q+r`K"u
+!a&N*r`K/&!a8`0rE92*rETA.s',t=?sm;H?=$l>=BAR.r`fG,rE0&#!a&W0oiq?!s',M.#?tG<
+?!LW??2e11?iOI3?iOO=@UW\S@q9-LAHHITB)Q9@BDZ9CBPD3srbVRNrbhaSs).aO$uTlsChmd"
+BkhL&DJ]5d%;]p"E,TW4DJj<-ChmeaBb"loDJsK7F*2VKG'.qKFT-=lEcH&;EH-#>F*)PJF`qqN
+rcJ-\*d)XNH$XgbIXm$(LPq4XR\$7OX08h;\\,A1?WgE=r`:RK?;F3f90Pd?ImH+Y/M/h14ZkJS
+7n?'<3&``W3B9/^<``7!;c-@g:f.$dp/(_Ps6B1@r9F%@rTO:E%d)s:k2k^cjlGL_io/kSrnde6
+h;&"a'AD-lf[n^)eC;sqda?FfcHa\Zbl5ckb/qcHa2Z*;`;[XT_SQ5e&\brl]=Y_ff%H*p@:3DG
+=BJ`*=9D`/>$:i,%U*(?>?P*2<`W:%<Dujqr_`_mr_`>bBlS39Fa&(UH@1-iJ:W?+L51SAMi<[W
+OckroQ^F52SXuLJUSOcbWN*#$Y->1;['mHS]"G_k^VRe*`Q-'AbKS5Vd*^:keCN7(g=k?<hV[8M
+ioB+]k3(sml0@X%mI'H3nF?&>o(2MQp&F^cp\jmeq>^<hqu-HkrUg)?s+142s*t~>
+JcC<$JcGECp&=pgrqu]ks8)ckrqJPKp@e1Po^h\Fo'u5<md9B-lfmZtk2tabio/hQh;$c=f[n['
+e'ZOfc-+8Na2Q!6^q[QqBQ8HWR[sDIr1!_To9oTFka2"/rKdVINf&qtP6ISUW2Z\grh9[kU7e*I
+S!]V3qkX[uV5C0)^;.O4l?S0aTC8HOU&(D`T:hkMT*:gWSXc1=pmMAUR[T_7ReiNRS-#:TTDkJ`
+U&L_bT`_$aUSRmc0rCkIWiN5&Xg#.@]>2J5eD'$Jn+#l4lg!ctj5AeNi8Wh\lL"*4o'u/9lg!Zo
+i8*/efaHE[ccs\VaN)BB`lA"r!Q)YO^B)']rjr6C\[_XJ"1GSBZMh$.ZMh',YQD#4Z21a2Z*LX=
+Yd(L@rj;a8rj`!;*OrSg\%&rY]"5Me^;@b)`5]pAbKJ,QaMbp1^V[nf_umoo_86,d!5\ZMrP/BJ
+!5\WLs2"fP^])"O_Sa=1`W!dm`Q#m:`lQ6Aa2lBEb0.uPc-FY]d*U1fdf.`.e^i='f[nd.g>1WD
+iT'%]k32g/"mYF>lK[^7lkJmVnF?&>naQ&:o(;VJp@e7Uq"jmer;lotrr0>*1"NV4`k9^F`UgO7
+U7Sg!hqsro`fXM`=Ho+S>bIabUT%I%=^bZA>-tTD[BHg;Z`^M$Y_rH(pYs$,_na.*^qdh(`PfX6
+`6$9Kb/V?8^:M%h[C!<HYd",3orr1NEcZ>GGBeF\I=6TqJqJc3LP^nINK90aPEhH$R@B\:StMdP
+Uo(&hWiW>+Yd1UC[^`l[]Y2(q_Sa@4a2lEHbg+P^dF6Uqf@S^0gYCWAi8EVTj5oFckNV6rlg4!*
+mdKW6nac8BoCW%T!quB_rV6Egs8)Zjrqu`noDX=@JcFj3J,~>
+JcC<$JcGECp&=pgrqu]ks8)ckrqJMJp@e1Po^h\Fo'u5<md9B-lfmZtk2tabio/hQh;$c=f[n['
+e'ZOfc-+8Na2Q!6^q[Qd?Y=4tJ,FliJGt&lIeeKnIe/'aIf4a$CMIHsD/F*6rd>r;H$ag^G^+@S
+F)uABE-chWH@(!dH@1+%O,o<+[VL#;K(4KnK`$K&K)($!K(airK)^DuK):,pJcLB$K)UE$K`6]*
+K`6](LB!#1Ll%#gM`?]VO-,ZpStr?gZa[HQZE^X:X/MnkUo()jXg#.?\$rfRZE^[=XJr%lU8"HY
+TV%jJStDUGSXc2KRLGUOQC!r(Q'@Q!P`q:/Onk+;O8k4BO-#HcqiClAP*,^+#*Y45PEM)mr07)D
+(7(;RR$jA2S"-(BTqS3UUS=EPR[KP2rL3hUR/N?RQC!u+qjI8Kr0m\Vrga%\rga%\rLa+`s.B@c
+rhBFf!2TRis/,dn!3#gp&ZVn3X/rG+YHb@=[C*KP\%&sG])K8=])T;E\@8rU[C?.Grjr*@!58<E
+s1eNJ%`-$#`l?*Bbfn>VcHab_r6Y\pcd:"acMl,qd*gFpf\5*8h#?%>gtglFiSrt^l0@X(nauSO
+r:Bq.hQ)j&SX#_8QG\i@Kn>#7VR:hoU2EV:7r`N@:]>_BI=V;ls&0;%:Q:<lMMHt@L4k9YK_:%Z
+rs/P`_SNXVQ^@]=".,CBQN!6bQ^F/1SXc.8PEM#gOH#-RLkg_>nqUt"EcZ>GGBeF\I=6TqJqJc3
+LP^nINK90aPEhH$R@B\:StMdPUo(&hWiW>+Yd1UC[^`l[]Y2(q_Sa@4a2lEHbg+P^dF6Uqf@S^0
+gYCWAi8EVTj5oFckNV6rlg4!*mdKW6nac8BoCW%T!quB_rV6Egs8)Zjrqu`noDX=@JcFj3J,~>
+JcC<$JcGECp&=pgrqu]ks8)ckrqJMJp@e1Po^h\Fo'u5<md9B-lfmZtk2tabio/hQh;$c=f[n['
+e'ZOfc-+8Na2Q!6^q[QO84cNO;>F&e;>sJj;><uX;>O2i;><ud;&D/G1,UsK2*aGn5<qIt5X%=n
+3]oMb3''/#5Rp(E5!;"m5>4gI9e'gL;>sJk;u9Pj;uK\p;uT\p;uT_r<W5tt;ZKen<W#hm;uTYp
+;uBPi;uK\k<W?)#='#9"qc"b>=&r@'=^59AAS5[kB4G@X?X?r>=BJ^2?!q)OAS,La@U]7C!F/h-
+=9_o4>?P'2>5hY8>$+j.=B\p5=]np2=BAX.r`B2&<rQ1p<rZ5*=BAR+=BSf*=9DW,=]kH#s&f,#
+rEB5*rET>-$!ptH?sd8K?s[(:=9_r5>?k?7=8l5"<WH5#=TDS&=oDP(>Q7t/>l@n,>lS%,>l7n-
+?iOF@?XR;N@UW_T@q0%[Ac?6:AI2s[AS,LcB4tsnrbMOMrbMOM")DXcCA_cSBP1pf@q&nXAnGUc
+B)?6@BF/BdBPD3rBP;-rrbMaTDK'Q7Er9tZFERG%%WZW4F`hkOH$Xg`H?j^ZrcoZ5H[U<lJV/W1
+Ll.4TPaS,<WN<A4\@]Jk`Q--GG%Ol\>lIeS<bP<'9M7W<94'tD9f"4T-p9XF1.Xr+77B-n2EEoZ
+3`]9[;c-Fh;GU3f;>*fdlMBfHm/$#QlKdd$lKRU!qWSRVl0.?oki_-kk2kaejlGL_ro+1Ai8<GK
+h;-lcgF:k0g"=p-f%&:!daHOid*L"_c-=JVbKJ&NaiMNC`Pod5_ns:,_8*k$rkAEFrOWE[gREFp
+?sd&=='GT*s&o8%s&ok:>$+s2=&i=%<`;pp;u9Gb:hjujF*)SLG^=^bI=Hd!K8#&8M2I7OO-#Ng
+Q'Rf*S"#t?TV8-VVPgDnXKA\1ZEpsI\@K5a]t_A"_o9X9aND]McHjnce'uq"f@em4gtgiFi8WeW
+jlY^gl07L!m-O--n*fc9o()DDo`"Lbp@n=[q#C0iqY^6ir;HTcrdk*#s5j92~>
+JcC<$JcGECp&=pgrqu]ks8)ckrqJSLp@e1Po^h\Fo'u5<n*TK.lfmZtk2tdcj5JqRh;$c=f[n^(
+e'ZOfc-+8Na2Q!6^qXDlDKLGlT:VYRSc"uVRe3$HR-0h/Q55XENJj!`P$k,aVl$8bU7n?VT:MOB
+S,ScXV5L2eVYm>#]Y;.pn"G5qT:_^ITD5&]Tq\6Srh'@eU7n=ZU&:S`U&L_[T*1aVSXc2GRfAlR
+Rf8cYS=Q1@rh01_18:J:US=NZUnsobW2Q\rXfeh1ZF%*P^r=OHgZ.VioCMJ>m-X'!j5K"Wj6,Rh
+m-sW=rq@r9oC;;7kMkCVhV-T2da67^b08)Pai_`Ha2Z*9_ns4(]tD"k]=PP_\$ra@Z2h0/ZN%3/
+ZN%64['R+<ZMUm0ZaI0I[f*`9\,<c8\ehun^VRh*`Q69KdFHk$f[S<pbfe/NaN4A$#faj&`5KR1
+_8-&bs1nZNrkJiV_SO((_84%-`VmgU`W*sU`sBc.ai_fMbg"H4cN)>kd/h\Frmgtu%+j.ag>(QC
+iSrnWj5^+!,NIeBj5f:_k32'qm-X3,m-X6/n*ol=o_%kKp%J1Wqu$Bkrj2VZ[B@K[dEfl5b,(i+
+]<TKC_lBo"?!</MQ'kr^TVSNc>?b6=?X-f=Za7'FYcb:9Xfq9!MZ4dhket?U^V[h'^r+%-`5B[8
+aj/,Q`P]R,]=tkd['[1=YlD!#Y]"N%FEMbNH$XgcIXm!%K8#&9M2R=QO-,ThQ'Rf*S"-(BTq\?Z
+Vl6VrXfen5Za@0M\[oGd^;%M$`5Ta;aihlPcHsteeC<($f\5'7h;7&IiSrnYjlYail07L!m-X60
+n*oi:o()DEo_%nNp@nO\s7u]kqtpBjrVcBfJcC<$jo9i~>
+JcC<$JcGECp&=pgrqu]ks8)ckrqJJIp@e1Po^h\Fo'u5<n*TK.lfmZtk2tdcj5JqRh;$c=f[n^(
+e'ZOfc-+8Na2Q!6^qWuW@qfq.qgnBiqLA9hqg\Nmq1&BordX]l$>jQmB5MF#;L<k?rd4Zk#'kH;
+FEM\Hrc&$dI=$>?HieYBI/]-/NOaIVHiATtK7a)T!.s]mrIk*$s+CH+KS9,Qr.4p$qh"`spO`Et
+re1<*qh+s'qhG-,)Ms?0Mi<USO-#KfQ^a\HY-kgP]!o#NYH4_$rh]q!X/rJ.[(!RC]*,[RZEC8-
+VZN]jUAghcT)bJ^TDkDmSXZ%8R[KM.QBdc$Pa%AprfR2A!0R,>s,[2ArfI5EOo:ICOoCOCPQ-gB
+PlI$KQMd*LR2MKaSXuOLUSb&mXfSP$VPBlZTUq^FS=H(<rL3bSs-NbOrKdSQR@4&CrL4%^SY)OG
+St2GNTDtS`T*V*`Tq\<WUnjjdV?!OnV?*Tnri#mtri,pt$`gA2YHbF?['[6K[/RK5[/[H8['R-I
+[f3]7[/I<6['d<M[f3`K[^W`V]=Y_h^:q@t_o0U;c-Of:dK%\od/MDoe'uqFef<;og=tHAioB._
+kNM0pkih9qlKmp,nFH5Fq"t$Xrupe%Q&qN!SXc)5SVVrPLPh>6Q@+:"9h8r:EH=oLI!pKor_<r&
+;c-@eMi!@LLPCM;KnK>WonAD*"mXISZE'AlQNWV@R$a6>QkYmSR%0_;R[98'OcPWaMi!:HL51NS
+LMq0QFEMbNH$XgcIXm!%K8#&9M2R=QO-,ThQ'Rf*S"-(BTq\?ZVl6VrXfen5Za@0M\[oGd^;%M$
+`5Ta;aihlPcHsteeC<($f\5'7h;7&IiSrnYjlYail07L!m-X60n*oi:o()DEo_%nNp@nO\s7u]k
+qtpBjrVcBfJcC<$jo9i~>
+JcC<$JcGECp&=pgrqu]ks8)ckrqJGHp@e1Po^h\Fo'u5<n*TK.lfmZtk2tdcj5JqRh;$c=f[n^(
+e'ZOfc-+8Na2Q!6^qW9.8P;kS;#X;l;#O5k;#O8a;".?Y;Z9Pg:_>QA1,1XE2`Euf5sRY!5X%@p
+r]C-@%6-C15X7V#5<h7o5<hmA:'bW):JXkd;,U<j;uBVk;uT_t<E)rs;Z]iq;u0Jn;ZKel<W5to
+;ts8i;ZTirrD`Mk#?Fo-<E)pt<W5tt<?bCB=&r@'>$G<@A7oXlBkCa[?<p`;=]eg2?!UcE@:EbY
+B)Z?I@q&kR>?P-6>Q.e*>5q_1>$4s0>$G6:rEBD-=BSa.r`T>*=T);%<`f,u&Q`(9='/R-=]ej1
+=BAU-='&N$<rc@t=oMS,>?Y68r`oG.%:<LN@Us(`B4PFY?<gb6>7"J9=BAR,=BSa-qc3r'=BSd1
+>[:V6>Q.n%?2S"2?XR8MrF-(CA7K.\@q&nWAH$0=A,p6@A-6CTB5%6Xqe-"BAc?3?Ac63EB4b^c
+AS(gN$>!g^B4b^cA7]Cerb;@H$Z'ZuEccGJGBS(NFT-=aFEMePGl2grG^4U]I!pKpJ:`H-K7j/V
+-%^c%KnbD>MN*^]QC=D<V5^Z*\\5es`Q#s>air)Ye:j8m='Sf*<roX+r_+.p6Ubi`2`r`B,r7\H
+3AN?]7R]d(3&E]Xr]C-\s&9/";,C+c;#F2a:]ThZm/H>Nm/H>KlMToGlMp)Okiq<okPaQCjVm4A
+jQ#:[iS`YOhVR)Egt^Z<g"G$0f@JL%e,IbtdEp7drQbGfrlbDdao9?c`l5m8`5BLl_?dun^q[Xu
+^:_/V]ElL*WISen='Ac)=:JD:=BJ^.=B\m5>?G'3r`0;)<`E!s;c?Okr_`;aDfKf>F`qtSH@('h
+J:W?*KnbD?Mi<[WOckonQC+)0S=Z@HU84W`W2co#Y->1;['mHS]"G\i^VRe*`Q$!@bKJ/Ud*^:k
+eCN7(g=k?<hV[8MioB+]k3(sml0@U$mI'H3nF5u=o(2MGp%A%Pp\jmeq>^<gqu6NlrUg)?s+143
+s*t~>
+JcC<$JcGECp&=pgrqu]ks8)ckrqQNf3VN.=o^qbGo'u5<n*TK.lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2Q!6^qXSsEd38&TqJ%WScG>\S,f&VRe3$GR,4/;OcPEXPEV5:V5C/grhBFd#GRi_
+SXc+:R/Wr_Vu<J!Vl%2C^:fE_G)-'hrgj+^qOmk^rhB@brLs@eU8%@Ts.KCa!204]s.07]S,JcV
+S!s>GqjRMRrga%\qP!k^!2KOhs.p^4Vl6YtXfnt5Z*UgG]"Z&&ce%(<n+-)Ao'l&4roX7B)s?JM
+lKdj-p%\I`rVlclp@7J4jl>@Xgt:-)d/;3+d*L%_bfn8QaMu0:_ns1&]Xtbc\@8iOrNZR4ZEpmE
+r3Q=.s0D[0riua5ZF%$H[C?.F!kGhNrOMp=(VIJu_SX4/a32i[g>CoNjQ#4TgXjs%chu#tbfe2P
+aiMK?_SEt'_8=(g_uIUQ_#qQl`Q%nts2k5[!6G/[rlG,^"j>-7cHjl8dJqW+e'ujreC2pse^rF*
+f\>3<hYZ4-h?i-!j5oCckiqBurp1-^mdBT7oCV_Lp@n=XrViu"0tt!6^X1<J\EBuhTq8[5i9$T,
+[<d1T?'C^[?([jcUo7F#>%(cC>-tWE[BQj<Z`^J$Y_rH+rp7S:_S<t(_8*q+`5BO7a3)]ObJqN<
+^:V.l\@&]MZ*:C:ZLkD5E,fr@Fa&(UH@1-jJ:W?+L51VCMi<[WOckroQ^F52SXuLJUSOcbWN*&%
+YHY==[C3QT]"G_k^r""-`Q-'BbKS8Xd*^=le^rF+g=tE=hVd>Nj5]4_k3(smlKdg'mI'H3nF?MK
+!V>s_o`Fj]p\jmeq>^<hqu6NlrU^#>s+144s*t~>
+JcC<$JcGECp&=pgrqu]ks8)ckrqQNf2YQh:o^qbGo'u5<n*TK.lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2Q!6^qX,\B5DX:pOW-jpj_scs*sfmrI=`qpO<ZhC1h-qD/N-rH[L6fH?oL7$?^H3
+FE)A@I!^6hrd5'!I!h'<Nf7VYC3B3$oRd:"K7nr4oS!*oqh"g"s+1N/JqJ]-JUrE*qL\a"r.G'(
+qh5!'#)7nfL51SBrepf81Q@ETO-#KfQ^jeMZ+%9T\[SoMXfAA"W2Q_tXf\b1[CNue_o0R6_S3Oe
+YH=n+W2?A`T`1PlTV8'PTV8'PSt2FAS,Jc\Q^3o%PEV/mrfI#>rK@2C!KrZGOp$u3P*(n*P5^XG
+P*>j/r0@;Jrg+OjR@0P6S=ZCKV5g]([C<ZS['Hm9WMQAaTq_O[rh'FeSt)47Pl?pMQC!u,rL3_T
+".YpRTDb>^T:l1Urgj4aTV/"XU]7+kV5C*fVZ3J)VPpGmW2HMjVl6PnWN32*Yd"&1s0)O-Y5YU9
+Yd(L=ZEpmCZa7$FZa@*I[f!Z8\duHf^VI\%_o9[=bg4_ee^scPrmqD-g>(N?hr3Voj9t)4kNV="
+n+#u?o^r+T#PRoeq>0scrTF2/r0rqAQ(4>3OKsh#KS"oDXiu3ANF6%(9Q>,G:4.J:I=P*h9iFte
+:]?:QMuJG3LP>YZonAD*$09OT_QK;lQ^F*<QPu6ZR$X2.R@Bb;S!]M*OcYZcMi*@HLPCJ<M"HI6
+E,fr@Fa&(UH@1-jJ:W?+L51VCMi<[WOckroQ^F52SXuLJUSOcbWN*&%YHY==[C3QT]"G_k^r""-
+`Q-'BbKS8Xd*^=le^rF+g=tE=hVd>Nj5]4_k3(smlKdg'mI'H3nF?MK!V>s_o`Fj]p\jmeq>^<h
+qu6NlrU^#>s+144s*t~>
+JcC<$JcGECp&=pgrqu]ks8)ckrqQNf2YQh:o^qbGo'u5<n*TK.lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2Q!6^qW</9M\AYq,%&fqG@/gohb$Qqbm/c))X0*0fM$K2aKYo5sIOu5!;"g4$5M`
+4$#\,5lX%V4Zkqm9MS>W11*[Nr_i_mqGRAnpf%2l!*/tsr_rSkr`&r!q,RGorDNhu;cH^pr_`_p
+r_ibprD`Jjr)Netr`&_o$<1#*<*!('>@(`LrauRL@UEGH=^#$5=^1l1&7&UM@:a.fC2Ig&BOkOX
+>[784!*]>(r`]>+!*oM0$!ge?>$>'5>[1M4>5_P'=8Gtt=8c8$=TV].=o2>$=TDS&=8uD$=TDY'
+=oDP'>Q7q??!^iF@Us+cCM[m)C2%9i?sW\8s',D+&mA@;;c6Ij<``C,>[(E9=]np5r`on:?!^iC
+?!^fB>[:Y7?34MC@K'^;@q9-L@K9j9@fBm9@fBg8@fU*;B)cHAAGp$<AH-3@B)?6@BEVs[BP;,Y
+CB%rWBkqO%DJjB3E-$/FG^4W7Hi/-oH@10kIt<6+reCB*"bqegMMmGhNrP1TP*D6!R[g"GWN<A5
+]"c2'a2uKIbl5m6cdC7nf\3*s?!(B4='/O(=\VUa9Ku$BNBoQm0.f"24Zb;P84ieM&2uL*3]]8^
+=&i4!;,U4g:f.'ep.tqZlg3s'm/H>KlMg#NlKRQulM]uIkQ'fEk5FEAj9FZ(iS`YOhu;IFh;$f?
+gtUQ8f@SU(eC;sqda6A>ci;;hbmVb=b/qcHa2c3=`Phbn"iA*l^qmkc^](qG]`#MK][FE9BjtOW
+r`B/'r`K2()-C$C=B\p4>?G'4='&F(<`N't;c6Lj:f1*c;#F+#E,fr@Fa&(UH@1-jJ:W?+L51VC
+Mi<[WOckroQ^F52SXuLJUSOcbWN*&%YHY==[C3QT]"G_k^r""-`Q-'BbKS8Xd*^=le^rF+g=tE=
+hVd>Nj5]4_k3(smlKdg'mI'H3nF?MK!V>s_o`Fj]p\jmeq>^<hqu6NlrU^#>s+144s*t~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqQNf!;?Eb4nS@:o'u5<n*]Q/lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2Q!6^qXJtF+&q?U7n9RT:_^HSXc5KS,A]TRJiTSRJ*$-QNE8-MZ/hN?_jQtVl-;c
+US=KUT:VRBrgEe`&#Z8#VPg>jVS9gZ^#,B/PQ%3SScGDYTE(\_U&^n^UApqeUA:M]TE1aZr1=%^
+SXfPGs-s=`R[T_7S"#rHScPIVr1X.bs.fOg/Z,GDWN3)$Y->1:ZEpsJ\\#VobL>5,lL496naZ#5
+l/q0kk32*rlg4$.oD&=^rt"ttn*KE,kMtFPf%/C#eC4EH"4biKe,I`,cHOGP`l,^.]tCtf\$`QK
+ZEjD7rj2^6[/RH9['R*G[/.-.[0X4M\@B)[\@B*K])TDj]=ktq_Sa=2aN`/dhrEncmdKW6lK-sZ
+f[\I#e^i:#e^MsncHF;Lrl+rYr5]#]`5KX7rlG8`aiV^)bQ#]`b5TT`bQ5u6rm(\odaQ\Ee-=IS
+e^N!sec+/"f)aOXr7hA.h;/(crS8:IiSrnYjlY^hl0I^'mdTc<o_/%Tqu-Mns"_g*\a[\caM$?7
+V4sTmYgCmnWPk'2Lffk/=^YC+U8Onn>ZkKB>[(F=Z*gmBY-P=9YOSiSs!.$[]Y_J#^qd\#`5KR3
+a2lEKbfn,H_na%"]t(PX[^**@ZEj,-@;g.+F*)SLG^=^bI=Hd!K8#&8M2I7OO-#NgQ'Rf*S"-(B
+Tq\?ZVl6VrXfen5ZEpsI\@K5a^;%M$_o9X:ai_fOcHjnde'ut#f\,!5h;-uHiSrnYjlYail07L!
+m-X6?mgS^Uo()DEo_%nNp@n=\q#C0iqYU0hr;HTdrdk*#s5s?3~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqQNf!;?Eb1\C;0o'u5<n*]Q/lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2Q!6^qX)_B5_sEK(FQmJG=WWIf=ioJGOa"ChREuD/N5LHiSToHiJ?oG]n4OFT-:`
+I!U0eHi/6rOH5B[Z$^G9o7H[gs+L?)s+LE+s+LB*r.P$$qh"No!eQ&Wr.=m"pk/g)KS5&6LAlr1
+Ll.(Jrf$l:23*`YOHG]iQ^jkPZF79Q[^E?BX/W(sWN3/'Y-5%8\%KW!b0A2TaMY^#['[0CX/Dbe
+TqJ%VU'7<fUS=KVrh0:_$_<fWR?s2(P`q8mOSb1>P5UUDPl?jGPQ$a?PQ-mFPlR-LQQ;H[R@0M5
+S"-+EUSb)s[CNoa^q[Xr[^*$7W2?JjrMU(#V5']TS=#V.Q^[Z=rgsCdSXlCGTqVCV"JDH^U8.^`
+s.]UjV>d@lVZEZmrM]Xls/5stWrB'uXT#@!X>[2`YHY79Z*:L=Za@*I\%'#\]=Y_g]tV;!`5Ta:
+a2lEIcdC7of\>3;hV[8LioK7clL"'1oDS:`oCV_LrqHKhrqZ]nr;PIN1?tX"QaE0LR?F;)LP1;8
+M3jrdH^&JEB1R#`8l&-.I=HZ?:JOkg:f'rHM2I.FKnY;8rIsluNrKFSf?).AT9Yb1QN!9OR2D<X
+R$jD5SXl7;Q'7AmNf]6XM2@%BL5:ZXLLG+@EcZ>GGBeF\I=6TqJqJc3LP^nINK90aPEhH$R@B_<
+T:r!TV5L8lX0&P/Z*L^D[^`l[]Y;.s_Sa@4aN;TJc-FY_daQ^sf@\d1gYL]Ci8N\UjQ5Oekiq?s
+lg4$,rpL9bnac8Bo^qhLp@e7TrqQNhs8)Wirqu`no_sFAJcFm4J,~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqQNf!;?Eb1\C;0o'u5<n*]Q/lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2Q!6^qW9/9hnJ\;>O,g;>O,c;>F&R;>X8f;$&R/1&a'22uZ)Q5X@V!5X%=n4$>Ye
+3BK>%5lX%I4UF>99hnDWAjoHlr_ibn!)iYl!)iSjs&8tur)E\ppf.8nrDrhrrD`bprD`eq!`Drq
+rDE\q<E8us!``9%rD`o"<EB*!!`i<$rD`br!E<(s<#/J7=^#*=A7f@]?XI)D>?P-4=^,*8>lJ"B
+@:X(fCi=<4D/3]k?t*SP>?Y04rEB5*!F/t1@/jR5?2e+/>l\./>6S25=BAO'qc<_ur`K2'"^"o0
+=BAT%=9)M&=9)G#=Sl8"=q=h@>?b?<?=$uH@qKCiD/T;l(i<u!@pi\O?t!MR@:<ML?!LN6;c$:i
+=^1i0#$Y55>$G9<rEK>.ra,P/rE]J2qHs>4@fBg9@KKtI@esO5@f9dCA7K.[@q&qX@Uf:Gs'u.A
+B)H9UBkhEuCMRa'DJjB1Df9T7EcZ;BErL+tFa&(VH[U?kIXciuJqSo9N/j$aPa.JuP`u*0s-!JH
+PQ$_MPE_>uR@Bb>Tq\<ZWNNP8]"Z#!`lQ<HcHjncdaHOke'ut$g>(QCiIYB>>@(H6<`Mjg:.n8F
+6:ag:3'f5K1akLK0f(OT7n6!,2`3ZY3]fE(<Dugn:f:.e;XmWalMg,GlMTlclKRQski_0mkN:pg
+k2k^cj5T%Vi8EMMhVR)ErnJ%=g=b02f%/C$e'landF$>?cQg`[cHXVXbKA#NaiMQD`l?!9`5BI/
+_8=%)^qd_#^V@Lr]tX?Vrk'T/b("5=AR8SC=B\g/='8a0=]\^/>Zt?6>$=s.<*3.$;c?Rn;Gd?i
+q,$ub@;g.+F*)SLG^=^bI=Hd!K8#&8M2I7OO-#NgQ'Rf*S"-(BTq\?ZVl6VrXfen5ZEpsI\@K5a
+^;%M$_o9X:ai_fOcHjnde'ut#f\,!5h;-uHiSrnYjlYail07L!m-X6?mgS^Uo()DEo_%nNp@n=\
+q#C0iqYU0hr;HTdrdk*#s5s?3~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqQNf!;?Eb2tZ_4o'u5<n*]T0lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2Q!6_.@4sFb5gPUS=KVU&L\aSc,)VS,&KQRIlm/QO]+>NJNa]Q=6\iVPg5aV#I+g
+T,+#fSXZ"FVPg;fW2?GiVnKjZ^4a7FL&.DCTV8(VTE(\VUAq"fUAq"oUS=HUU7n6Qrh9=arLX+^
+Sc5,ZSc"u^S"-"<S=?&HScGD^U&LecUE-/,V5C,fW2co"Xfen6ZEppH\%0)`^rOdQi9'=krpTmT
+#Oh'Ek2balm/HGUnalPSqYq*)q"FFSnE]5qhqd#=f[naSf`0S&edp<^e^;[ca2Pp2^V.:k\?u+=
+s0VX1qm?@1s0Dj8[C*KQqRQU:._E@+]tM7u_o0L5b0JJhgu7AYlL"'0na#E!hqHc<gtgfDiS`YO
+h:pW6qpYeudaHLfcMl,ncHOGRbKTq0!m]-=rm1Sjrm;/&eCE1(g=tH=gY:H8rn%5(qqM/,rnRM/
+s4mY1#2\7qiSieVrT"CKkj%O%md]oBp\F^bV#N0ZYl)>]b/!GbV4sZpYJoA\Pb!Y?<fNB0R9<gg
+US=Zb>?PEC?<g^@ZaR9HYHP=:XmrWQrsJVU]YVD"_8*e%`;[Xda2lBIc-45I`594"^:C_\['Tb9
+!4)4$AT2X0FEMbNH$XgcIXm!%K8#&9M2R=QO-,TiQ'[l,S"6.DTqeE\Vl?\sXfen5Za@0M\[oGe
+^VI\&`5Td<aihoRcHstfeCE.%g"P39h;7)JiT&tZk2tjjl0@U$m-X60n*olHncA@Srq-?dp\4X]
+s7u]kr;6KkrVc?eJcC<$kPp&~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqQNf!;?Eb1A(2/o'u5<n*]T0lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2Q!6_-1,TBl\TQnU^[ipj_CSrdXfqrdP;lCM@?sD/N7"IX?MBHiJ@/G]n4PFEDPB
+I=-HiH@:-eI!h$;Nf@J/Bls?+!/(*!rdk*$p4N$l!/CH*r.Fp!re(-%q1JWtre(3's+LQ.KnP-Y
+K`Qp^re:W4Ll%"IMi@Xps,R,?!0I2B*L*"cVQ@#.Za@'EZ*LR6Vl-PsY-5(7['mT`a3;g-c5"RC
+^qRRt\$E0:W2?>bUna]\Unsl_rhKIg"eqZ]SXPrEQ3<J:Ocbh*OoLUDPPg[EP5pd?P6@,6Pa.R6
+Q2[*LQiEHQRK&`URhMBdTqeKbYHbLE\\,Vi^Upt]Y,qW&!NW@$XpD,0WMZJcU8+L_V#R7kV#@(g
+U'76_StD[Lrh9CfrhK[lUnji`rh^""W2Q\qX/rJ*XT#:#WW9$pWX,Z*WN*##XK/B!WrT:#Y5ka(
+Y:Hi_Za@-M\\,Sh^VIY$_SjF6aiV]Lc-F_ce_&U0h;@5QkNhR+pA"I\rVa_81AI3!`g3$]Q,9#I
+KnP56PH;lMH#6AHBQ.s38kj\]H[^K@:K17i:f*.1N/NIGL5:S;re:!!NrKIYgs*aMUQq15Q^.Q;
+!1EhQ%@ETRS=Q.9Q'@JoO-#>"M?&J3L&d&$LLkFEEccGIGBnL]I=?]tK7el4Ll%%KNfT<cPa.T&
+R[]k>TV8-VVPgDnX0&P/Z*UgG\%0)_]t_A!_SjF6aN;WLcHaeae'uq!f@em4gtgiFi8N_VjQ>Uf
+kiqBum-O--n*fc9rpg*]o`"Lbp@n=[q#C0iqY^6ir;HTcrdk*#s6'E4~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqQNf!;?Eb1A(2/o'u5<n*]T0lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2Q!6_*pmf9h\>[q,%)gq,$f_r(uQRqbmDj"#Vkj1&X!S69db%5<_:q5!:tg4ZPSa
+3^H"r5<V1n4[2/)9hnD884ubT;YsDk;YF&h<!#ut;uKYq;uK\n<W6%t<VKJm;u]bp;uKSo;uK\q
+<W6&!<W,tu<W?%s<W5qt<W#ho<<cK,>[CcG@K'U=>[CcE>Zk-3r`oJ/&mepSB527#DfBZ5CLq'j
+BOkOXr`fD+r`]D.?2e4>?X@&G?=.#F?!U]?rEBS2=&`1#=&r@'=8c8$=oDG(='/Pq=T;P(>5h\(
+=p%u4>$Lu2)-pQU?t!SYB4tsnCM[j*C2%6h@UW_UAS#KQB*2XP?sWb8"'f/>?iFI6@/XC7?!LT;
+>5h_2>[:WA?XI2JqHsP:@U`hXAS,QRAH69=@ejO3@K^+I?t!ODA,g'>Ac?<?B)lZFC'\TkDJsH4
+EH6*uF8p@\FVK"CH$XgbIXZg!KSYSJPa7`,SXuMRTd$5(T:VUCS!o_4R[Tb;T:r!TW3!2.[CEla
+_o9[;bK\A[df._qe,\)!eHa[Xg>(QBiSsjs.^#=H=_q,@<`Nm8:/+DJ5=JG(69-tS,VqYJ4"`3X
+7n,p:2)RHV3]fE)r`&nq"Ahun:JgUZs6KXKrojFJros@Es6'FE&a/<=jlPRaj5T%Ui8<GKhVI#e
+h#H+@g=b-0f%&:"e'ujpda?Cfcd2U9s3:Sf#Kt93aN;ND`r<pW`;RRX_SO%'_8*k`^]2%G^&GYE
+^&GYZbftf\BOkUV=]S^.='8^0=B\d.=^:o/#?b,/<``:%;uT`!;c-@g;>F&c:M"KbEccGIGBnL]
+I=?]tK7el4Ll%%KNfT<cPa.T&R[]k>TV8-VVPgDnX0&P/Z*UgG\%0)_]t_A!_SjF6aN;WLcHaea
+e'uq!f@em4gtgiFi8N_VjQ>UfkiqBum-O--n*fc9rpg*]o`"Lbp@n=[q#C0iqY^6ir;HTcrdk*#
+s6'E4~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb1\C;0o'u5<n*]T0lg!`ukN:mej5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Q!6_.m\)HA7i`U]$qeT`UmZTDkD]SGAZQRerNMR/`QSR-0eQOH#-^Od'4LUo1,h
+US=QYTVA'KS=Q.:Qi<iaV5C/frhg"7^V7COR=:=pTDbJ]T`:_]U&^tfU&^tfV#R1mUnso`U]-tg
+TqM=Wqk*t^T)>/VSGo)ZT)YG_Sck[ZTq\:\U]7,@V5L5gVl?YrXKA\1Z*UaC[C<ZW]"GhsbL>2'
+jQPstn*oo?oC2)-k3D@(o)A7^pA4I^&Gu+glfdHhhqm/DgY1E9g=cGW&_GU`cHF;K_na%$]t1__
+[C!:;[.q'/[/IB;[^EQR\@9#[rOMm<s1:S0^;%J"_SjC3a32]Re(<@2iT'+cm-O$%k2P:ThVmPY
+lgF92mdBK.lKIBmjlGL_io/kRhqd,CgY(62f@JO)f`'J(f%&=MedpEdg=tH?i8WhZk2tdcjPp0t
+r8Rb8!9!e6s5O(:!o`/"roF.@roFXPkNM-plg4'.o(DbQr;NGj1<$cJc-"/G\_4*\TV&[6iQn'd
+Y-Dr'?'C^\?)40gV5d^'>%(cD?!F\B[^**?ZEg[:o!!uN,2KlI^V.J!^;@k*`5BU:b08,RaMl*6
+^:h:k\@&`OZ*:C:o<E(LE,fr@Fa&(UH@1-jJ:W?+L51VCN/`m[OckroQ^F52SXuLJUSOcbWN*&%
+YHY==[C3TU]=bkm^r"".`lQ6DbK\>YdF-Lne^rI,g=tH>hr*JQj5f=ak32'olKdg'mI'H3nF?)?
+oCV\So`Fj]p\ssfq>^<gqu6NlrU^#>s+146s*t~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb1\C;0o'u5<n*]T0lg!`ukN:mej5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Q!6_-:;[Cit5[K(FQhJGF]VIf=ioJ/W3;B5VO&;1*_<I!p?fH?ja[G'%eIEH6&H
+I/\HnI!bj?#EOt+NH]\dI/\]tKDL2sJcC>tKDpPrL&Q`+K7s2Urdt-%qLnZsrdt-%s+L6&reCH.
+s+Ul9Ll.+LN/`gWNK4"!rfISOPa\/<VlHl&Z*L_8ZmW2^Vl6]"Z*LaE[^j/kb0A5Xd*BhUb0%fD
+]stGRXfA=tVP^2dVPa<frM9[nSt;LBRJiHUQB[VsOcfU*s-*8C#*Y45PEV5pqNV#F1R=;kQC!o'
+Q^=),R@9S6S"-+DTq\<ZW2m&'Z*_!O]"#5WYcb(/Y-G=B\\#Jb]",A][f*Q2Z3mqCZ*1@5XfJD!
+WW&ptWt;;1WMlbpWN)u!XKA\1ZEpt<[KO"DZa$b6YQ(g<Z*:F7Y-"e-Y-5%3Xfeh1Yl(a.Yck:8
+rim`T['d?P]"G_l_SX4/`5]j=b0/&Td*gFpf\>3<i8Wqcmdp2M^Ag(iT9c"<S"#_+WJlRbK8#Sn
+RsfL6OB?-iEH=cKIXQQjInia5<)QUj:Q:6hLkg\<LkLG8L%L+[s!R['d_jM/Pa7Z%Q'do*R@'>-
+R$sM6SXYt2P`q5iP)bKYM26tBKS]5TCN"03F*)PKG^4U_I=HcuK7nu7M2I7OO-#KePa.T&R[]k>
+TV8-VVPgDnXKA\1ZEpsI\@K5a^;%J#_o9X:aND]NcHjnde'uq"f\,!5h;-uHiSrnYjlY^hl07L!
+m-O--n*fc9o()DEo`"Lbp@n=\q#C0iqYU0hr;HTcrdk*#s60K5~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb1A(2/o'u5<n*]T0lg!`ukN:mej5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Q!6_*gjf:JFV^pJCidr)!Ais&.QJqbe.d1G^pG2E!ie5X.Lu5X7Lr4?5Jb3W;)A
+5X@[74odbF5Q+:X4%<$B;Yj;l;Z9Pn;Ya8j<;BJk<;KVo<rZ2!;ufqp;ufhq;#jMn;Z]iq;uK\p
+<W,tu<W,tu<;]_r<rQ)&<)lms<E/rt"BSc3?!dD8s'[Eg@pW5=>$PB@?sd;L@qTRoD/X<.CMI['
+DJNio@UNMG>$G39?!^iE?s[.<?5-aQ?<g`@?!LT;>?Y*/=&rC&<``E&=85nt=8H&!=TDS%=nc,"
+>Q.k.?!dM;!aoGHraH+DB52-oB4bZQ@L-LVBl7m/DJO"dB`_pYB)ZHCB`DcNB4b^dA7K'F@/j[8
+?ij\A?i4=:@Us%^B5),[CBJ9aBP79T&nYcgB4YUaAn>L_A7T1Z@:Nk\rau4CrFc(Bs(;UNBkqO&
+DfB]9rGiouF)uGFF`qtRH$amcI=?ZuLPq7ZR\$4JVl-JmWrAstW;`[pVZ!@kVA-&5Z*_$P]tqV*
+aND]NcdC1je^i@JfJM44g=tE?i8WeXk2tdejK5=e=]\X+=B/@&:JFMT5t=[?5W:kr/2Sk@4"i<Z
+8Oc-<3Arep3r_8J=&`*r:f1+f:f?j]r9F=H!pJn5roaUMki_-kk2k_(j;$_7iSi_Qhqm5GhVHuB
+gY:H8f\"d*rR:hrrR)&#d*U+cccs_Ybfg".!m/O(rl4uW!6"lSrke]Os1nZL!5STKs1S]P^:q:o
+]Y+6WrO``S]"6&/MKEQ@EEH:D=BJX,=T2J'=;=nB>?Y67=]\X(='&F%;cH[o;Gg7fq,$raCN"03
+F*)PKG^4U_I=HcuK7nu7M2I7OO-#KePa.T&R[]k>TV8-VVPgDnXKA\1ZEpsI\@K5a^;%J#_o9X:
+aND]NcHjnde'uq"f\,!5h;-uHiSrnYjlY^hl07L!m-O--n*fc9o()DEo`"Lbp@n=\q#C0iqYU0h
+r;HTcrdk*#s60K5~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb2"^D1o'u5<n*]T0lg!`ukN:mej5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Q!6?ta@uIuL5#Unn!brh9[lTV%jJSt2CApRCrGrg<YP!1<&<%$6U3N0BNn@&9g!
+WMf]h&tttkS=Q1>RAZs[V5C2hVl6N+rk8MnYBG\mq4I\[rLj7bU&L_bU&:Y_UB%+hV>m@hV$*Th
+US=L[U&L\bU&L\kT:VUESt2CBS=TVMs.B=as.9IfTqS3UU]$u>V5C/gW2co!Xfen6ZEppG[^`lZ
+]=l"taNi5dh;[P\mI0Z>p\""=jlc""oD\@`pA"R_rrN)trVmB+q=O4ElKI?hio/eNgtVh^rn7>(%
+F`YIb/V?8_8!^s]=GBL[JmQ3[JdQ6[fa(J[^Q.DrODm=r42j=!5&6C(r*l'_Sa:1`Q--Ec-Ohee
+CWI3i8`t`l0&',*p2\Qo(MqYrVZTiq"F@No'l,9md9B+l07EqjlPRaro4.BjlY[brS]lsiSrnYj
+lYajlg=01naZ)9n*TK.mHj6,lg*j$lg4$)lKda"l0@R"l0.?okiqBumI'H4nF?,Cp\OgdTDp^r]
+$SpJaiD*JZDF7e\?jrT`36>$>$4slR9*^!TVS?]>[1KA?s[,CZa@3KYct:;YcY,#Y_iA_iP*"@_
+#D.f_SsI4_oTsAbKe>Q`PfU,]Y_:k[^ETMYH[T&Ao;O,EcZ>GGBeF\I=?ZrJqJc3Ll%"JNK90aP
+EhH$R@B_<T:r!TV5L8lX0&P/Z*UgG\%0)_]tV7t_SjF6aN;WLcHaeadaZguf@\g3gtgiEi8N_Vj
+Q>UfkiqBum-O--n*fc9rpg*]o`"O`p&Ojcq#C0iqY^6ir;?Ncrdk*#s60K5~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb1A(2/o'u5<n*]T0lg!`ukN:mej5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Q!6<a9*JDg-hdqh"NmpON9ni-tZTs+(,c$>=$gDJrF#I=-KkrHeKg$$UK5EcZ5J
+I=$;>HNJSCI/]01NFmlZEe3q9q18Qtqh+g"q1\j're1H-KnY3XK)gN%KDU>tKDpK&KDpQ(L%U0-
+Ll%"IN/WaUNfT8#OT1FZP*;,tS"?@OW2d#*ZF%$K[BHU.WNED2rj3cV]>2D/c-FVXa2c?JccX;F
+^UghXYcXt+W2QVjUSFXaV>d=qUS4<PS=9AC#*tL;P`q;orfd,A"-\t5PQ$jFPl6mNQ'R`&QN!3p
+R$jD4S"-"?T:_dMTq\<XV5L>pYHkOC[C!6DZ*CXE]YDDaa8a4$`P]O,^:h4m]Xk\a[^NTP['R'D
+Za7$I[^W]OZ*=52$F-nC['[9O]"5PgrkAcQ]=YYb\[]2\])B,S[^WcU[^ENMZa@*I[Bm3FZa-pE
+[C3OC\0/Ap]t_D#_o0O6`lH3Cb08/Wd*pOsg>1]Ijlbsto(Msms#&Z1Q_L(?R[K>:Ne`:>L5MYB
+Q[XO#8k2BlF%T5%I=6Hl:JX_b;c-@fNJrgSLkg\?L4k56oS/A*$09[Wgnp@%R$a06R/`WeSXZ"4
+Q'7AmP`:Z[M2I(BL@U+3DJsN8F*)SLG^=^bIXcm"K8#&9M2I7OO-#NgQ'Rf*S"-(BTq\?ZVl6Vr
+Xfen5Za@0M\[oGe^;%M$`5Td<aihoRcHsteeCE.%f\5*8h;7&IiT&tZk2tjjl0@U$m-X60n*olH
+ncA@Srq6<b!;HHes7u]kr;6Kkr;H9eJcC<$kl6/~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb1A(2/o'u5<n*]T0lg!`ukN:mej5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Q!66q9d@:/=_apJC]`!)WYlqbl0Gs&(=)1GU^C2`<Q[5XRh&5<_7q4Zbbf4Zkee
+5sR\"5<qCt5X.q9:/*K39i(Xaq,78kr)*Jlqc!Mop/Cujpf7>p!*0"tr`/kq!)rko!`DusrDW\p
+r)N_sqc3Yqs&T,!!EN;!<rZ/S<`N7)>$G9<>[1Q@?XI5NAn>@R='/^7?t!DL?t!SZCMdm'BP(pn
+DK'K0BkLsc?XE_;ra#S1r`fA,ra,V0!a]/<r`]>)r`K2%r`K2%rE'&&qcEi$r)il"!F&b,=nl2"
+>Q.n-?2e.:?!^iC?!^lH@V#IL$Y3aXAS#RnEccDDErL%hDJa3)BP;*oC2.EoAn>Rcqd]qCAnP^c
+@:EaGAH-3VAnPdkCi"!-DfBZ5Ci*s&C27U$Chd_`B`Vs_rb)4B!G?-GBE)ZEC&_p?CMIQuCMRd)
+Df9T7EcH&<E,]f:EccGIGBeF]IY!-*M2dU^R\-@PWN<5)YHP18Z*L^AZa7'I\%95e_T'^?bKS5V
+dF6Uqf%8RRg&Ke,h#?.0g]6+.g'6?ghVdAQjSn6CjQ5I`ro4--?s?o8r`:XM;c$4_90bj9G"FYT
+0.8+p5!1JR1.Xl'6oR%_4$,Ja4',B]<)HRj;Gg4do25PQrojUMl0.?okPjWCjT4H&ro*t;i;MOE
+hVI#Ch;$c=g"=p-e^W.!eGdqsdK%\ncjJ+EcHXVXbfe/NaSs6[`WX9!_o0Ik_>qFK^]V?c^VBc^
+rOr*@rOXVl\[f5eaHh!c@<YmW='8X.=BSd1>?Y*1>[(?8=BS^,<EE1$<`E$s;c6Ffpe^i`Ao;O,
+EcZ>GGBeF\I=?ZrJqJc3Ll%"JNK90aPEhH$R@B_<T:r!TV5L8lX0&P/Z*UgG\%0)_]tV7t_SjF6
+aN;WLcHaeadaZguf@\g3gtgiEi8N_VjQ>UfkiqBum-O--n*fc9rpg*]o`"O`p&Ojcq#C0iqY^6i
+r;?Ncrdk*#s60K5~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb1A(2/o'u5<n*]T0lg!`ukN:mej5T"ShVHr?g"4g)
+e'ZOfc-+8Na2Q!6B4Z%+K9E.0rh]Xjs.fRf"JMK]T:Z%Qrg`kTrL3DIrKuu=s,mhMP*MA@V5C,f
+V50l^UAgi&T:DC@SscLSVP^8iW2HPj^;%Cqs-.trpn%PZr1X.bqP!n_s.fUi!McI`V>d4nU7n9T
+U7qRZ!29=`s.9XkT:VXHT:VXHTV)1Urh9@ds._NKV50rbVPgAlX0&M-Z*CXB['d?O\@T8a^;.Y*
+aNMlWf\PQMm-jN>p[[Y5kNhU-oCDJDpA+Xcrri>tpA"R`rs\l%p[n"DlfmQnjPSelgCr;qg=b*,
+dE]kS`l,a1_7mUp\[VOG"1P_H[f*]6\Gs,9\,s4P])B2>])TDB]aMQi_8=(,`5Ta<b00b-&^JhT
+f%Aa9jQ>XhlKdj,o_JF\rs8W%qtTs\p@IhQn.>$SmHs?1nF5u=o^VG>n*]ZCnGM_ZnFH8Hq"adc
+q>L*fpB(-`p\ssfp&XgVrq$0\rp]sX#kIT[p@nCZr;N)`1;^iu_p$6<q89&&Tt%APl/eY;a)llh
+?C%$_?([jcVQ*g(>%(cE>d^rH['Hp>ZEg^<o!"#O+6'rH^qde&^r"(0`5BX;bKA)RaMl'6^:hCq
+\[JoSZi73"Z#OZ#EH6/DG'A4XI!pHoJV/W1L5:\EN/is]P*D5uR$sM8StMdPUo(&hWiW>+Yd1UC
+[^`l[]Y2(q_Sa@4a2lEHc-FY_dF6Uqf@\d1gYL]Ci8N\UjQ5Odkiq?slg4!*mdKW6nac8Bo^qhL
+p@e7TrqQNhs8)Wirqu`no_sFAJcFs6J,~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb1A(2/o'u5<n*]T0lg!`ukN:mej5T"ShVHr?g"4g)
+e'ZOfc-+8Na2Q!6>$Y]SF*rXnpO`*iqgeWpqgSNok^NP]$>aKkD/X;iH[L3hrHf'$H$FRWF)uAD
+Ed`@`I!^8?I0b4^OH,=YG&;X!K)'usK)UE"K_gE#LAci(KF*9aKS+r1KS4u2p4E?sre(6(re:<*
+!/LH+$AXFpMi3ORNfK0]rfI/B.$BdXQ'Rc*S=cLOWN32,[(!KLXf88"YHbF>ZEq$P_8XL:`PB4'
+`6&#'&'W/7_7[:cZEUF2X/MkiV#I4hV?WikTq@mGS,SiZR@';*Q2[!CPlI$KPQ@&8qNV)IQ2R!M
+Q'Ra7QiEHQRfAi\S=Q7DT:l1W%%s;gVPgAlXK\t8ZaKe@'Y;#ra32cSdF-IjccsVRa2c0:_8#r^
+$bO!^]=bhk^;%J$^](nL]=bei^&>YN]tV1o^qmn+`r<pf`5BI1`5BI0_SO+*_SEn!rOW'@rj`WN
+\[oAa]Y(qm_8F41a2c9Bao0B^bRr+GdF?e$gtq#Lk3;:&oCi%[\,S;[S!^gSS=>\`R>?QML5D22
+_g['6>@;);EH=cII!pBjJ58p7<)QRiN/WXOLkpb=LkLJ9o7i;*"Q\4UeYW51!13\Ps-XRgR@0G3
+S=Z4<Q^*euOHYZ`Mhm:HreC!!EGf`8EccGIGBnL^I=?]tK7nu6Ll%%KNfT<cPa.T&R[]k>TV8-V
+VPgDnXKA\1ZEpsI\@K5a]t_A"_o9X9aND]NcHjnce'uq"f\,!5h;-uHiSrnYjlY^hl07L!m-O--
+n*fc9o()DEo_%nNp@n=\q#C0iqYU0hr;HTdrdk*#s60K5~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb1A(2/o'u5<n*]T0lg!`ukN:mej5T"ShVHr?g"4g)
+e'ZOfc-+8Na2Q!66q9jE9i+\ap/(T_peodB$8s[r2)[BO6:*t&rBLfU4Zb_d4?5Mc4$l1s5Q*kI
+4pOeU9MLX<:/V!hr_iSkrDNYmr)3MmrD`Jh"&r9#<;BPk<;ol'<)lmr;Gg:i;uT_r;uK\m<W6%s
+<<uQ(<`W4#<``E"=8u;%='5<%s&q*^?=.,OARJ_D='Ap;?X@#E?t!PWBkLm^?!q/VD/O<4D/3cp
+@q&hQ?=.)F>?Y37r`oG.ra#V2>lIt-=q4\==BJX,=]eg1=]ed/=oMM&=T;P&=T2J*>?Y81=nl2!
+>Q7t.>mObD?=$oA>$G;2?7TJpA7]@cB4u!rE-$2HG'A.RF`hbFDf0K2CMINpAnPagAS,UiC27U$
+D/K8d#&7jdC2.O"qeQ:MDZ4SXF)l8?E;jbUE;a\]DJsE1D/=$(CM`ucrbDFKrGDRN"`8-qEH6*u
+ED(7jE,T]8F*;bRI"$TsKSPGFOd2B,U8P&oYd1UD\%&uZ]">\m_SsR;bK\>Yd*gFnf%8O+g"P39
+h;7#GhVR/Ii8ESRio/hRhr+Ils5O(=s5X1?r8R_9$IkSQ>$k?6=B'!8r_+Y(6q1[46TJs7/2Je>
+3\<$U8OZ*:3&WZU3]fE)=&r6t;,L4g:fHp^"6o%5kPaNCjo4?@ir\6!iVqaIhqm5GhVHuAg=b03
+f@JO'e^XQH!n,KErQuA,cd:"`bfn8Rb/qcHaN)<?`Pod5_u@OO_>1nH^](tI^&5MF]=bbfrjr*>
+!4`$;$+\'DGAUc.>?Fu(=:eY?=]\a2>ZtB9=]\X+=&i?$<!?0!;c-@gq,$o`EGf`8EccGIGBnL^
+I=?]tK7nu6Ll%%KNfT<cPa.T&R[]k>TV8-VVPgDnXKA\1ZEpsI\@K5a]t_A"_o9X9aND]NcHjnc
+e'uq"f\,!5h;-uHiSrnYjlY^hl07L!m-O--n*fc9o()DEo_%nNp@n=\q#C0iqYU0hr;HTdrdk*#
+s60K5~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb1A(2/o'u5<n*]T0lg!`ukN:mej5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Q!6C2%^7Lmt<?rMBgrUna]ZU7n:[T`1P_Sc"uXS+rHJRJN<?QO].:MNa9k?_s^!
+W2H;`UAgo)TpqRBSXQFQVlH\pWMl_m]Y;.r^Q<VpS+rWUT`:__UAU_aUAq"fV"CM`V#R1mU7n<U
+U&L_bU%k;\TDYAZU&C\eUSO^bV*1]RVl6VsXfo"8Za7$H[C3QT]=Y_h^V[n-`l?-Gdb*C9kj7j2
+o'GZ-mI'H5n*]Z6o_A@as8Mc^n+?JUqu7i;qY0[Qmd00!inrVLh;-rEh:gN4dEThUa2Q$9_SEq!
+\G`o:\Gir=\@9!I\c98?\H'/<\c')>\c02?]*#a\^VKic"iJ9t`lH7"bS&4JdaQaugu.2QkN_O*
+o(DeVrq$.&r;6?eqt^!XnaZ5Cp%J1Wr;Zcmrri>uqY0^_o)n[[qYfj^%K?>*rqu]kqYL-frVc_W
+s"i9ApWq(*a7[raUnG</`SojNW5Xp*KjKt2=^IkrUSk(o>ZtTD?!U[B[^`]KYcb@;XKV6#MZ4m^
+]Y21s^;7\&`P]X3`Q?9FccsSM`501$_S*LhZaR3FYcmW&Ao;O,EH?5EGBeF[I!pKpJqJ`2LP^nI
+NK90aPEhH$R@B_<T:r!TV5L8lX0&P/Z*UgG\%0)^]Y;.s_SjF5aN;WLc-F\`daZguf@\g2gtgiE
+i8N_VjQ>UfkiqBum-O--n*fc9rpg*]o`"Lbp@n=[q#C0iqY^6ir;HTcrdk*#s69Q6~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb1A(2/o'u5<n*]T0lg!`ukN:mej5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Q!6>@;)[Fb#-urIb!!nppdkpj`<mqg[jZ#]+0cD/F2gI")'B!I9%jGl`/2rcA-\
+rd+]pI!bg>#`at-NfJ3qF+Eh5qgn`ure(6(!eZ/Zq1\a$rIsoto7Qpns+UH,!JcF/LB*).LBWKk
+MN!OSrJpl=s,m;Ds-3JI,FFslTqnWfY-PIBY-"e-Y-5+7Y->1=]YVS,_nEIc]#)J0c2Q$"bK%Q:
+]XbGUYH=k)W2HMjri#jp%&KbnTUq^ES=>t9R?m`7!1!MIr0@;Jrg!,A"dbOAR$jEBRg#=QStD[K
+rhBFd!McOkVbX1kXfnt8[^s)`^r+7;dF6_%g=k64f@SL"dE]tZaiVWE`501%_84"+`Q--GbK\>W
+c-FSXb0%fE_na%%^r"(3b08,Tbg"DVc-4DVc2Pp,bK7fD_o0L2`5BI._SX4.`5Ta:aNDcSdaZjt
+e,Ic-eCE.&gYC]GjQGgpn+-,FqYmc".'&cTSXc1;]VLI?KnkDIY/Pj9Qu5T09lY5I:Ode@It19i
+:/t4i:f..M#E+CnKntM<K_'tZrs.iEb1<PXQ'VE9s-WkSrg=LgR@9V;SXGh0PECrjNfAsQMhd(B
+L%:"2DJsN7F*)PKG^=[`I=Hd!K7nu7M2I7OO-#NgQ'Rf*S"-(BTq\?ZVl6VrXfen5Za@0M\[oDc
+^;%M$`5Ta;aihoQcHsteeCE.%f\5'7h;7&IiT&tZk2tjjl0@U$m-X60n*olHncA@Srq-?dp\4X]
+s7u]kr;6KkrVc?eJcC<$l2Q8~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0D+l,o'u5<n*]T0lg!`ukN:mej5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Q!66qL!H:ARi];#X>f;V4hK1c$jDr\amE6:!k%rBC6D$T^@33]fDh69me%62j+U
+5"nXF9hmlG:K$a^peq)ir)<_t<)i]m!E<(t<;]br;ufko<;ol!<)Z`p;Z9Sq<)ross&K)"r)N_s
+r`&qtrDrr"rE0&#s&f8%!*K5'!`rE&r`1UR>$YHB@UWPF=Bf':?<gT9>$YNGAS#=U<E312Anu=)
+EH5r4BkLsc@:3GK?2e(.>QA(.?3=P@?!RA5%:!+@=]nj-='/U/>?b;1=o;D%=oMM'=nu:r>5qe9
+>$G6:?!^iE?X@#C>[@;7!+Gk:(hI>oC2.O%EHHDMH[U<hH?jg_GB@qJEcD"p->[F0AnPglC27['
+E,or=FEM_LG'.qKEGo]1CMIX%DfB`=F`heJrcA*]r,_mXrbhXQrGVRP$#ad&FEMeQG'.s,F=VKX
+G^=adJ:`K1MN*^]QC=D>VQ-f)\%0,b^;%M%`Q-*Cc-Obbe(*%%g"ZG[#Mn7ohV[5KiVha9iVhd7
+j8\*Aj5T(WiV_^6iW%j9i;qrsro,fqZXm6R=]nj/?<9lq9L1s6;1(Vf689oG/3Z0K0hFr+7n#Br
+2ENu]4$-MD<E)go:f:.e:\.H`k5XQBj9+H%io0mprnmb4s5!_1#M[tcf\"g,ec""se,@_odJqPo
+cd)O7"3es2b5THba2l<@`Vm^T_Yq=M^];4L_#M.O^q[Xurk86Bs1A<B$+mdZ\[]/Y\$iaD[3rVW
+H?!J;>$+j/='&L,>$G-4=BSg3>$P97=]ea,<E<+!<)Q[n;Gm3cqG1^@DfKc<FEMePH?sseIt3-'
+KSG8=MN!OUOHPfmQC+)0S=Z@HU84W`W2co#Y->1;['mHS]">Vh^VRe*`Q$!@bKS5Vd*^:ke^i@)
+g=k?<hV[8Mj5]4_k3(smlKdg'mI'H3nF?MK!V>s_o`Fj]p\jmeq>^<hqu6NlrU^#>s+147s*t~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0D+l,o'u5<n*]T0lg!`ukN:mej5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Pu)C27pANrGsSV?<ZjUndp`s.KFcrh'4^qjdVSpmV#Hrg<5B)N^2APa%GuVP^>k
+VPU)aU8"EWT:MOCSXQFTrhp7*W2QVl]tV+o>i^3lp7DDZTqV4T"JMQaUSIgapSIhc!2][j"/DTb
+U&L__U&UeaU&UbjT:hjNTq\9Trh9CdrhBFfrhTOi(oF72X0&P/ZEggD['d?O\@K2_]Y2(s_ScAi
+$cU64eCrg@l0e*1n,)SXmcj!)oD8Id#5[iWn+6ARq>Vf@qY'LKmHWotjQ#7YiS`PGf[S?qc-4AR
+aMu3:^qRLo\[]/[\[qdN!kPqQrOW$@!P5o@\cKFSrOi0D,JLq._8=+.`5Ta:aihoQcHjnde'lju
+f\GBDjQGn!oCVbOqpbWLrVZQirVhBJmJf!'e,S(Eb/qQZ[\]^m\AI4K_6C)!@TSMVQ!.KuTV\EY
+WENM0@:*;E[C3WQZE^U=Za$_*Z&8PbkeFdI^qTfa)90Y4`Pfm@bK\;S`l5d0]u%Fm\$WWOZ*1A%
+Z!qQfE,fo?FEVkRH@('hJ:W<)KnbD?Mi<[WOckroQ^F52SXuLJUSOcbWN*&%YHY==[C3TU]"G_k
+^r"".`Q-'BbKS8XdF$Fme^rI,g=tH>hr*GPj5f=ak32'olKdg'mf)Y_nF?)?oCV\Jp%J+RrV6Eg
+s8)ZjrVZWmo_sFAJcG!7J,~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0D+l,o'u5<n*]T0lg!`ukN:mej5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Ptt>[hDcH2`KpKD^>kJc1,gJ*qarChm[#DJa9=I"$NkI!^3drco?)FEDPEEdN1^
+I=$?iI!pC'O,]/mW,-a1rIP$%r.=p#rIY!!rIY$$",);ZK_^?#L&d#.L&m'apOiU%KS9#Ns+LB*
+"b_S`L5(K_LAco-L]rZoMi<XTrJpl=rK0U5PE_;sQ'@MuQ^XSAV5^Q#Za$d=Yd(I;Ycb"-Z*q?a
+`l5["Za@3T_oU$Id*Kt]b/_E6]!o)QYcb(.X/`5#WMl\jV5'a`TELjWS=5lFQN*3KPlR-LPld8:
+Q2[*KPl[2;r0@AMQMd'`QC+).R[]h<SXuIHTqS3VUSO`bWW&h4WN<8+Yd:gN]YD;%aN`2ehW!ST
+iSi_OrS.>,&_l$keC)^icd'k`daZn%gYL`ch>c4Df[\Bqbf[uIaihoRcdC4jeC2mreG[o&eCE's
+dEp4crm(Pi+jeWbdaQ[ne'ljuf\5*8gtgiDhr*JRjQ>^nn+65Hq>:,lrrgo]UY2FARk0o.P)+jH
+Kp8O$Q@=C$;+52?E(`u#IXZZmJ58s8;c6FgNJrgRLkpe>LkUQSLQ;B>mbZ1<X-]*;rKmPO!1EhR
+'UkM\SXl49QBIDlP)YHZM2R1FKnf/R@Vp"%EH6/CG'A4XH[U?nJV&N.L5:\EN/is]P*D5uR$sM8
+StMdPUo(&hWiW>+Yd1UC[^`lZ]Y2(q_Sa@3a2lEHbg+P^dF6Uqf@\d1gYL]Ci8EVTjQ5Odkiq?s
+lg4!+rpL6anac8Bo^qhLp@e7Zq#C0iqY^6hr;HTdrdk*#s69Q6~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0(ec+o'u5<n*]T0lg!`ukN:mej5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Ptb77^'Hpegc^pJCogfhhr21G^mG2E(P$s$6QJs$$HF"Znh04$#J%5Rg"G5X7Os
+9h\2S.8il;mo0'\rDWYos&B%uqG[5i!*0"t!)rkp!)r_nr_rbns&/qt<W5tl<W6&!<<6-%r`0)%
+=BYN'r)Wl#r`K8'<W5o#<**1*>@%28ra%$\?!LK2<ENO9AnYa_<Duk"?Y!keE,oo8DJa-$A7AtU
+?sm;H>[CcF@/XC4?!RA5r`f\4>$4p/=^##->Q%b*=Sl5%>?q#/!F/k)>5qh+>QA(/?Me(0@/XI3
+@i/`fB5)*qCM[p1GC4mkJqAQ*Jq/5sIt<1MJ.@$TH$=CRFE2DCFEMhTIK"a2JV&K)J:)ZfF`VPB
+EcQ5CFEMeNGQ)daGQ)dbF96N*FSp7]G5c^pGBS.PF`qtRH$Xd`HiACAI=?ZsKSG>BO-,ZmR\$4L
+WNEG4\%BAj`Q60Ec-F\`daQatf\,$7hVS4grS[V4s5O(=rSmk9!oi8"rS[n;iSi_RrS[\4rS[\6
+qr0!`mW!&OG$.mK=BAX%9h\5F78$3F3'0)L,;MDD0/>:R7n#j92`<Sn3X\#N<E<$r;Gg=h;,d'`
+#NXq)j5T%Vi;VU6hYl7DgtUQ9f\"g,e^i:#e^W*teC2mprR(Yl!RK'jblQ&3rlY8_rl>;a`l5s:
+`Ph_l"2Vjj_>1nH^](tG^&GYT]">Sc]",A]\[],X[^NTOrNm3D]sW6.ASt^T=BSd/=]eg1>?Ll-
+s'$";>?Y02<``@)<E)pr<)Z]h;#3ssD/O<4EccDHGBnL]I=?]tJqJc3Ll%%KNfT<cPa.T&R[]k>
+TV8-VVPgDnXKA\1ZEpsI\@K2`]t_A"_o9U8aND]McHjnce'uq"f\,!5h;-uHi8WeXjlY^hl07L!
+m-O0>mgJXTo()DEo_%nNp@nO\s7u]kr;6HjrVcBfJcC<$l2Q8~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0D+l,o'u5<n*]T0lg!`ukN:mej5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Pu/AT;jFPkq9VV>m@iUApqeT`:VaT)G5[SGAZMRe`BAQRe/XM3F3j@&9`uW2-2`
+U8"?VU7@dFS=5nGWi2kqWi2koVn]sY^Ak9dQCdiCs.B@cqP*tarhB@d!2TOh"K&#lVPa?jrhf^l
+"/M]dU&L_WU&UecU&:YaUB%%eU]7.fV$EouXKA\2ZF'V=s0a5`\[oAa]Y;1t^qmn'^VIY(bL+ko
+hra1knFH/>nF?&;md09/q#:9urV#jTqt^$`q#;--q"FCNn*K?(kNCmbhqQi7daHOkdEqm<#0b3/
+`5'.$rk&<G]=[pNs18KJ]=Ybh]=\'Trk0Ym^VIY$_SX4/`Q#p<aihrSd*gFoe^i@(g"bHBjQ>aq
+nauSNqYl'G\c4J7s5hGJb/X%nWMH<!ZHqjdQ_20LF,=7hRp0-jU8+Ta=^,$;?XI)C\$``RZ*:F>
+Z)k/$Z&8Pfm`2uV^V7M"_8cJm'uS)7air&Sa2Gm1^;@Rp\$`WPZEUS'Z2\]PE,fo?Fa&%TH@1-i
+J:W?+L51VCN/`jYOckroQ^F52SXuLJUSOcbWiN8)YHY==[C3TU]=bkm_8=.0`lQ9FbK\>ZdF-Oo
+f%8R.g>(N@hr*JQj5f=akNM0qlg4!*mdKW6nc&([oCW%T!quB_rV6Egs8)Zjrqu`noDX=@JcG$8
+J,~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0D+l,o'u5<n*]T0lg!`ukN:mej5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Pu#>\%PiIJSTkK(OWiJFS-ZIL9k)Ao2F';1*e>IK"R%H?ja[H#n(LF)c5JIJnQl
+I0bpqN/d"WEIEE:K)L?%K):2oJd-jZJqJ]/K_pK'LAZf0L51P=L&$E$K`Hf&K)gT(K*I!_Knb>9
+L&Qi,LB*),LCK&sMi<USNK0$[NfT9`r/prA5a7OuP*(roR@TtFV5UK"ZEgjEZEggBZ*1=:]Z%t4
+_nEUk]t:kj`QHELcHjh`bf7N8^:^q^ZELI7XfSP$Vl'Egs.]joUS=HSS=H%8qNh/HpQckeQC!o(
+R$X2,Q^F/.R@9V7S=Q7DT:hmOU84W^VlBWp-*+,MYHY=@\\,_q`Q6<Qgu7G\lK[Wtk2bUdkiqBu
+lfdKmj5JqphuDX;ioB1brojjTkNM*iio&\Lg=Y*1rmh/&f\68X$JaImh;$c>g=b06rnIt;gtpuJ
+ioB%YjQ,FbkPjZSkNM0qlg=01nalGKqYd5i"5^!+WrAJ'R_5/ILPCP@Qc?+QH_G(TB2!;d929s8
+I1q'):JOkf;G^/JMi<RMLPCY@L5#8TNrK^Yhp00DQ^*l'Q^3u*R@'A0R/WNcS=Z7;QB[MnPE:c^
+MMd7FL%'ltDId^+EccGJGBnL^I=?]tK7nu7M2I7ONfT<cPa.T&R[]k>TV8-VVPgGpXfek3ZEpsI
+\@K5a^;%M$`5Ta;aihlPcHsteeC<($f\5'7h;7&IiSrnYjlYail0@U$m-X60n*olHncA@Srq-?d
+p\4X]s7u]kr;6KkrVc?eJcC<$lMlA~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0D+l,o'u5<n*]T0lg!`ukN:mej5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Ptc7nQKM;#4&_;"dcc;"@K`;!h*t1bpjE2`<Q\5smq'5<qCq4?G\e4?GVc3^Na1
+s$?ZMs$$EV"AY1S:Jg%Lr)ESmpf%>q<)cfn;?0Yn<;fbq;Z0Pn<:s5k<rQ+s<rcA%=oDJ%=8c8#
+=UeJ6;c6Ij<*!(&=^,0>raPn9-"((c>$+j/?tO.e@pE/>?<pfEAo)@%D/XB4ChRBlAn5C\@:*C@
+@K0[7?N"1/?4^CL?sd5G>?Y37>?Y6:>?Y5+=Tqu5>$G39r`]S3?!CK:>?q,2r`oJ/ra,S2s'Ph9
+raGh7/n&4!A7T7aBkqR'DfU,RKo(_JNK&mTM2@4QOHGZgOH#-RL4b)0JUrH)JV&]8regc8rf%AG
+M26n>Jq/;uH[9s^H2N$hHN/?lH3SY>GBS4VH2`-mI=?]trIXp!rIY'%.#!G5MiEg^Q'e&5U8=ll
+Z*_$R^Ve%3b0/)WdaZk#g"P38h;-rFhr+Cks5<n8"5r(pi;VX6h?)Tmhtl40htl10h>Q13hr*Gj
+iW%p9j8\0bjjSWcE)g"A=BSp19MJ/G6Uu<$6TJ1&/MeqA4>/E[8Oc-;r\j^:$T_9e<Dudn;,^=g
+;"RWbiW%gHhqm5Gh;$f?gY1?5f@SU)r71hss3hA(e'c[ld*U+acd'f7bQ>u1b5TN_aT'<[`rF$X
+`;daS_Z%CH_#D(N^:h7or4N$@rjr-?$FmRT\$i]Q[C!9Hrium9^:J]5Am\_D=Bb],**?9G=^"s0
+=Bo'5>[(<3=B8O+<E)pq;c6Lj:Jpsbq+q$.A8lO/FEMeOH$XjdIXm!%KSG8=MN!OTO-,TiQ'[l,
+S"6.DTqeE\VlHf"Y-5(8ZaI6O\\#Mg^VRe*`Q$!@bKJ/Ud*^:keCN7(g=k?<hV[8MioB+]k3(sm
+lKdg'mI'H3nF?MK!V>s_o`Fj]p\jmeq>^<hqu6NlrU^#>s+148s*t~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0D+l,o'u5<n*]T0lg!`ukN:mdj5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Pu4C3+`YT(o2^V$*ThUS=L^T`UmZTDkG]Sc>5SS,8ZNRJrTIQNND7N/[b$!emJJ
+rhgd2V59r]Tq@jFSXl4JWi2nrWiE"qVS'XU]o(fnMZ04BT)t[ZU&(M]UB%%eU]7.gV>@(hVuNXo
+V>m=lU7qRZs.KLgTq_4R!2BIf!2BCdrhTFf(oF73XKJh6ZaI6O\@8rX]"5Md]Y;1t^:sT](r!Yt
+_o^0Ne_8m?lL+33nF?&<naZ,>p\t-k#Q+H!rquZjrV6C&rquTbna>`.kMtRXgY19WeGmu,eCE+!
+dETeQ_SX.)^V0QXs18?D]=e-V"MVR_]Y+6W-GI70^qmk(_Sa=4a2uHGbg4\beCE1(g=tE>hr<\X
+kj%O(o_A@`JcE4Z1\(58^s1'Eji=O"V7O4WiomnK]prJ^=H]%T?DO<lVl?V">$>?A?!F_F\[8ZI
+YHkL<YOo)WrugdT]tM1r_84".a2>m6aND]KccjGJ_n`t&^:Le]\%&dDYk#&=D/O93EH?5FGBeF\
+I=6TqJqJc3Ll%"JNK90aPEhH$R@B_<T:r!TV5L8lX0&P/Z*UgG\%0)_]t_A"_o0O7aND]McHjkb
+e'uq"f@em4h;-uHi8WeWjlY^hl07L!m-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6HjrVcBfJcC<$
+lMlA~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0D+l,o'u5<n*]T0lg!`ukN:mdj5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Pu$?tX=uJG=cmK(X]fJFS-_IO]5OBP)*uDJ4EEIXHNgI!U*aGBS(NF*2MNI!^6h
+I=-BhI#a8ING,S4G5d'jJcLH&K)(&kK)UE&K`6])LA6Q(LAlo+K`$N(K_pE%K`6](LAur-LAZi,
+M#W81M$/]oN/WbqNrG+>OT1IAP5UUEPRit@Ocu*!R[ftBUSb,tZa9V;6aa8,[CjH!b0%cC_o0C*
+]tVA(bK\;Yd*L%^b0%`=]!o#MY-"b'W2HJgVPg>hV5:&eWMcSfTUq[CR[KP/QBd`$Qi<<MQiEBN
+QiEERR@*u?!h#LGrgNtZStH"T4JALEV5C/gWN3)$XKAY/Yd1[G\[oPpaj&8chW=(lo()>?mHj3/
+nac;Do^h\DnaZ)7m-X92nF,`3naZVLrUCEfn*]W2lg!]qj5JtTi8N\nj8\*_iS`SLh;7#Ij6#Og
+lKmp+n*ol<o_%tRq"FFSo_%tSqu-Mbru_$Kah="1S!pIKN/3=FL6\shN.$e/:1Qn9E_B2WI=D0F
+s%a/";c?OhNf8pSLkpe>LkUQTLQ;BWpuKf>YFCiDQ^F,,R$jD2R[BP4S"$">Q^3l!OHYccMuJS8
+LP:KQLN.0KDfKc<FEVkQH@('gIt3-'KnbD?MN!OUOHPfmQC+)0S=Z@HU84W`W2co#Y->1;['mHS
+]"G_k^r""-`Q-'BbKS8Xd*^=le^rF+g=tH>hr*GPj5]7`k32'olKdg'mI'H3nF?)?oCV\Jp%J+R
+rV6Egs8)ZjrVZWmo_sFAJcG$8J,~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0D+l,o'u5<n*]T0lg!`ukN:mdj5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Ptc8P;iR;#!o`;"[]];"mia;"@Hh2Dd3F2)[BT6N'.j5!M4p4?P\f4?GVc5X7P!
+5sR\$5Wh_692.-J:/OpI;ZKeo;tj8k<W?"t;?0Sm;ZB\p<;'8j<!6-!<E)rk<W,u!=Su>#=9;Q+
+=oMM'=oDG+<Dudo<EB'"!a&T4rF5e8(gpZT>?bKHC27Qp@UWbT?XI8RBkqO%Df>Pj$>X9b@:3JM
+?sd5Hr`oM1rEg(C@Us(^@pWJI>[(E;?!CM/=oVY,>?Y2/>6J28>[:V4>6S89>?kE=r*BP6?smDO
+@fBd=@UW_TAH$0?AdrKmEHHDPK8PbSQ^4#)rfn@gS"6+ASXc4=R$X,%OckolP)t]dQ'I]'R/NHQ
+R/`H_Q'.5gLkLD2J:E*#It3#urdFosI!Ya:&q#.ZJqSl7M2R=PN/`jYOcbfhrfAFhPEqW+SY)XR
+WNED1[CElb_oBgAc-OeceCE1'g=tE=hVR/JiVqj6is"H$hqd)Crn@V3gY:H9g&0S(g]#q+g]?6d
+rnRS2rn[V2"Q/.qiSj[n390)\jlYahkiSm\EFDsO='/F!9he;H5t4e=6odRi.PrP:4>/K]8Ol9=
+7Q<7_4$,Pd=&i7!;H!Kk!Dl_e;%;F>h;-lAgY1?5f[n^*rRLqtr6t\ormCbm#LC]?c-4DTbPoZa
+aoBE`a2l="`rF$X`!F9!_ns7+^qde\_#M.M^:jKXrk&3A!5&6As1/0>!4Vs9"LYVC[']h<s02p7
+]W-d0B4+nG=Bb],(0FX@>?Y-4>$P<9>[(B7<``='<Dugor_ikq:f@-dq+l!IDJsN7F*)SLG^=^b
+I=Hd!K8#&9M2I7OO-#NgQ'Rf*S"-(BTq\?ZVl6VrXfen5Za@0M\[oGe^VI_(`5Td<b0/#Scd:(g
+eCE1&g"P3:h;@/KioB(\k2tmll0@U$m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu-HkrUg)?s+148
+s*t~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0D+l,o'u5<n*]T0lg!`ukN:mdj5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Pu4Cib&cV=g_cV>m:jUAgkcT`:VaT)>/WSGAZRRe<'KR/*(#OHPWiQC)'VVPpDk
+Una`^U84KUSt)@AR]<BeW2Q_pW2HQ.^:_1]S:?iqSY#VKs.K4_q4mtc!2KIfoqq\a!McCfU&Uke
+UB%%fU&LbdU]-tpUS=NYUnsl^UnjdbU`-),V5:&cVl?`!YHbC>[C<ZU\[]5`]=Y_h^&5SF^V9]\
+'u.W)aNDfWg#(lSm-a<1nF?,Ao_AC[rrW2uqt9t4r:TRIm-3Tih:pW6eC2mrdaHUqf@em2f$i!i
+aiDB=_7oo^rOr9Fq7[$G^;%Ct_>_=O_]?_:aihoRc-FV_e(*(&g=tNCiSrq\kj.U%mIBrJJcE.X
+1sc3fcHje\ak!hrUnkKBj2n4%_M_`&NF%m=@9]D$USXqn>ZtQD?X0tI\%&fLYckI>XfqB%MuO:X
+cFpp,^qmn)aN29:`6&#%s3;.s`l,^/_S3Uj[^WcPZ*:G&Z=dujDK'T9FED\MH$XgcIXm!%KS>/:
+M2R=QO-,TiQ'[l,S"6.DTqeE\Vl?\tXfnt7ZaI6O\\#Mg^VRe)`Q$!@bKJ/Ud*^:keCN7(g=k?<
+hV[8MioB+]k3(sml0I^&mI'H3nF?MK!V>s_o`Fj]p\jmeq>^<hqu6NlrU^#>s+149s*t~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0(ec+o'u5<n*]T0lg!`ukN:mdj5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Pu&@:sJ%oRm'no7?OanUL@`.Vrj7Df'DjI!g?iIX?BfH?jd[G'.nKEcQPUI!pEj
+I=6KkOH5B]J9u3_rdjcpqL\j&K7iuOrIY*'rIt9+q1o!+s+gW/!/:E*r.Y*&"bhV_Knb<\L&m'a
+re1u>LPU_@LkpnELl$tHN/WaUNfO+"s,[5Cqi^oArKK@,Pa%H!Q^3u-Sti6cYd(L@['dBO\%T]$
+cHjk^bK@rG_7mV"`5]pBbg"GYd*^1\^q-t\YcXq(VksBg(T""+V5:&fWiW8$W2?>`T:VR@Q^3r(
+R.cmHR/`QUR$jE?S0X\uTq\<VUSFZ_W2Q\qX/rM-YHbF@[^`fV]u.q<e_K0Jmd]oJp&F[aoD\Fd
+p\+@TpAXdsp@\(Np\F[]p\F[]q=sa\rVHQi#l+/fp%%YAn*^2B#OCU<ki_0mkPXENkj%R(nalGH
+p\4IYqtuHR"6uW:Yl:.3S!p.7M26n?RB;^&IZA,:7VPS;F&5PYIXHNnr_F&(;c6GON/NUOLkg_A
+LPCNTLQDH_r8lAFZ(72HR$X/,R$sJ3R$X50S"#q=R?s5'P*1reMi*CMLPCP;nq^ppD/O<4EccDH
+GBnL]I=?]tK7nr5Ll%%KNfT<cPa.T&R[]k>TV8-VVPgDnXKA\1ZEpsI\@K5a^;%M$_o9X:aihlP
+cHsteeC<($f\5'7h;7&IiSrnYjlYail07O#m-X60n*olHncA@Srq-?dp\4X]s7u]kr;6KkrVc?e
+JcC<$li2J~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0(ec+o'u5<n*]T0lg!`ukN:mdj5JqRhVHr?g"4g)
+e'ZOfc-+8Na2Ptd85)`SnkoB_o259ZqGI#aohc,T1Gq$K2E*rg69me"r]pKG#!G%14Zb\cr':9K
+$:$g>:/">U5"8=Foi(lgqGRAnoMbcfrDNeu<`N/r<!--";c<Tls&/eorDWhs<)i`ns&Atrr)EYq
+s&Aqs%oub5=BSg1=BSd/=]nj.=nu2"<[^sI<E<.#;H-[u>$YKD@U`bR?t!GM@V':jChmd"B4bX_
+@:3VXBPMA_D$b*!F)l/1@q&kRra,M.!FB15?O1(MAnP[b@UNRA?3=J;>$Co."C#&4=^(f-!Er_,
+>lS(0>l7n->Qe>=?XI4??N4C;@:NeV@:NjI@io8pB4YR_B5DR2H[pj2P*h`0T:_gNTV83ZVPg;f
+Undp`%ABGeTV/$SUS4HXU8"I_V>d>.UnXNRS!oV)O,T!SM2@"@K7ec,JUi6"rdH_UKSYMENK0'_
+Pa7]*S"-+EU8"EYV5C2kXg#+<[^`r^^V[n,`lZHMdF6Xsf%Ja1gYCWBhu;R6iVqj9j8S$BiS`SJ
+g"4dQe-=COeCE+#ec+&'e^i='f\+s4rS@M1rSRY5!9*h7s5X.?rT4(Bs6'[Ol\Jkq>Zq&.*a2K;
+9MA)F85;K72a/oD,;Ui54>S]`84H$;3ArfWr]:6`<E)prr_`er;,Hj]s4RV/f[n^*rRLqtrmUho
+rQtkscd'k^c-4E2bQ#]faiMTFaSj0Z`W=&srl"rW_o)Gis2"`Nr5&EK!l)I`rk/<EqRca<1V(*-
+\[]2Z\$i`Q[C!<IZEpjBZ*CO:YI^iqG%kAg=BSa-=]ed-=^,'5='8^2>$G36=oDD.<Dugo<)Z[m
+;,HgZB5DF&E,fo?FEVkRH@('hJ:W?+KnbD?Mi<[WOckroQ^F52SXuLJUSOcbWN*&%YHY==[C3TU
+]=bkm_8=+/`lQ9FbK\>ZdF-Oof%8R.g>(N@hr*JQj5f=akNM0plg4!*mdKW6nc&([oCW%T!quB_
+rV6Egs8)Zjrqu`noDX=@JcG'9J,~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0D+l,o'u5<n*]T0lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2M_'DfpZ!V=g_cV>m=mUS=L]U&UbcTDbAZSc##RS,/NQReiHMQj]"9N0]cp@ATp"
+V5F6e%AKVpTUqaFSsl[YWiN)tWrK"&]tD(m]r6.0rgj(\pR_M[TqVFZr1a=fUSIX\s/#Ierh]Xj
+"/DTbU&Le]UB%+gU].(hV>@&(Vl6PlVP^8iWiWA,Z*L^D\%&rY]"@pR!589D!PcAI]bJ2r_8F75
+cI:J&i8`talgOH;p\Om`rrrAur;HTnrr)lrrVn)@q"*t?k2Y=Pf@A<qc-=PZcd:.mgYL`Bgt:'#
+bK7`A_8-&brP&9G!5AEHrkKeq_o9X8aN;WMcHab_d*^:kf@\d2hVdARjlPammI'?,mIU/PJcE.X
+29>ghgsFEobk&?EVQ.24cg0#cW/bPBLgZI9>$[eqUSk(p>[(ZG?X6mD[^icNZ*1I>Yck;(ZA\_m
+q:3*k^V@S%`5p$>`5Tjsb7W"Aa2Pp2_8*[l\%&rSZ*1=8o<NFQCi401EH?5EGBeCZI!pKpJqJ`2
+LP^nINK90aPEhH$R@B_<T:r!TV5L8lX0&P/Z*UgG\%0)_]t_A"_SjF6aND]McHjkbe'uq"f@em4
+h;-rGi8WeWjlY^hl07L!m-O--n*fc9o()DEo_%nNp@n=\q#C0iqY^6hr;HTdrdk*#s6K]8~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0(ec+o'u5<n*]T0lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2M4eA86.5oRm!lnU^=_npgRd$>XBiDJj;iI!p?hrHnNh#C(E9FE;JNI/\QnI/eU"
+O,f9\NIYbbr.4ToqLed#s+C3#re(3're:B,pkSj)s+gW/",2D^L&Qi+K`Qp`rJ(9+"c.qhL5(K]
+M#E21M?\utN/`gWNrG+>O8tFAP5:CBPl-_4P`q8nPF%f5Uo1/mYHY=A\@TGnaNr8^e'H:bbK.Q7
+^;%J"_8F73air/[ccX,;\?rKAWhuVfTqS*PU8+HXUo1;tricU.Vkp)ZSX]SFpQtlHs-X1^S"#t?
+SXuIHU&LhqUSO``Vl?\rX/rJ.rim-C[C3QP[(!cfaN`/ch;RP_nauMRp'LKhq=saYp\+=TrqHKf
+rqQ9a!W)]jr;QR#qYBs]p\+7OnaPrFm/QDOm/QGYmdK`>p\F^arVlePs!%H8hmB/KSXZ+cP)>$Q
+L5M;;U4@c5;da33EH=fLI=6KlJGr=R<)Z[l:l^KoMMR(CKo#_^on\\/#kR-,`3u>)Q'_H:s-a(Y
+R$jA3rL=.^Q^3l"O-5K^repf3!elAao8%I'Ci401EH?5EGBeCZI!pKpJqJ`2LP^nINK90aPEhH$
+R@B_<T:r!TV5L8lX0&P/Z*UgG\%0)_]t_A"_SjF6aND]McHjkbe'uq"f@em4h;-rGi8WeWjlY^h
+l07L!m-O--n*fc9o()DEo_%nNp@n=\q#C0iqY^6hr;HTdrdk*#s6K]8~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0(ec+o'u5<n*]T0lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2LM;8PDlTku%IWpJL]^rDE8bpe_ha1,CgH3&O#h5sR\"5<_:q4?GYh4$,M$5Rg"G
+5X7M-9h\8U6VU?Soi(cdrDW\pqc!Mos&8hns&/nsr`9&!qG[Sr;Gp@hr_i_opf%Ap;GpFlr_rqt
+<)icq"&r2u<;ol"<``@)r`T8'rE02(=',3"!`rE'rD`hsr_a&%='8a2?!guG@/aU:@qTQUDAmA.
+CMINp@UNSPA7T7`B4u$sEccA@C1Uj^?N+47>?kB:=^,22?34JCBDlKEA7>IE"(#5:>Q.e+>P_J&
+>5hb(?2n72?2n4>?XR8K?sd8K@:E\UA,BdaAnPaf@UNVWCN"9=I=d66P*_`4USXldWN3)"W2HMg
+USFW\USFW\rM0@drhKLh8>`5ZUS4?PSXc.9Q'7DoO,SsNKnP,3KS+r3L5:bJPEhN(S=Q7EU8=fg
+XKJe5['mHS]">Vh^VI_(`Q-'Bbg"GZdF-Oqf\6>Zrn[V2!9!b5!T;r6i!\N%hqm)>e^Ddhc-614
+rm(hsd*U1fe'utJfEKs_gtgiDrnd_6qVqG5s5a4ArT=.Ds61orm%mp<>?Fp.=^#B59MA2I6UuN"
+3'9/O/2Sk@4>/E[8Ol6=2`<Vo3rqH*r`&qsr_`hp;,U<a;%)",e^`0ueC2jpdaJ*A#LLlGd*L%`
+c2PrebPfQbaiMR%a8X*V`Vd[S_uIRR_u%:P_8*kc^]2"M]t:nhrO`*@#eR[Z\[o>^\@DLHrNu^6
+Za9Y:riuL-/$H+][t&R9?X?o>='/X.=]\a1>?Y-4=Bo'5>$>'1<`iC&<E)mr;c6Li;"@D'CM[m,
+E,fr@Fa&(UH@1-jJ:`E,L51VCN/`m[P*;/sR$jG6StD^NUnsufWiN8)Yd(OA[^WfY]Y2(q_SX71
+a2lEHbg+P]dF6Uqf@S^0gYL]Bi8EVTj5oFckiq?slg4!*mdKW6nac8Bo^qhLp@e7TrqQNhs8)Zj
+rVZWmo_sFAJcG'9J,~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0D+l,o'u5<n*]T0lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2Me/EdEM4V=g_aV$!NgUS@^\s.K@`qk!VRr1!YRrgE_RqO%h\P`UrlS!B;8Uo:8j
+VPF-b#Ge)dSt)=ASGoMuWMlepWMuc/^:h42P(&SlSc>;VT)kUYrhB:b!2BIfqP=.foqq_bs.f[j
+UAL_bU]@1dV#R:nVl6NmVu`fpr2CF2WMunsX0&P/Z*L^C[C<]W]">Sf^&#JC^Au"F]bA,p^r477
+cdL:ogYUoOlL4?=qYp6h$iU#"qY'RRoCM\Pr;HXDrV?*QkMk7JeBlF^ai_fOc-Y"qiT0+_j4r55
+c-+2J`5BI.^q[Y"_#D+H^^\,s_o0X;air#Td*U1grmV\7g"Y<=hr*SWkNM3slg3s'm-jWDrIP!V
+s#']Rq;fcHdEhI#XJ_tk\AmLkd&P9gEJI\\Q<IX"U8=]dW*EM0@:3DF[(!QSZa-g=['6[9os0MU%
+f4nl]YM:u_o0X;`Poj;rQ>btbK.W?^qIUu\[JuV['?g=nZleCD/O93EcZ>GGBeF\I=?]sJqJc3L
+l%%KNfT<cPa.T&R[]k>TV8-VVPgDnXKA\1ZEpsI\@K5a^;%J#_o9X:ai_fOcHjnde'ut#f\5'7h
+;7&IiSrnYjlYail07O#m-X60n*olHncA@Srq6<b!;HHes7u]kr;6KkrVc?eJcC<$m/MS~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0(ec+o'u5<n*]T0lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2M7jB5DaAoRljhomuacmsbjsDea$)E,BK?H[U?jI<p5=GoM!PG'%hIFFAReI=6Kk
+I=?R)O,f3.F_uJVJqErPpk&Erqh4iurIb-'s+UH,pkSg(!/LN-s+UK-s+gW/qhG3.L\ll2LPUeD
+Lku%ere^c8N/[aq!07&>s,[5CrK@2E!0mAE!0mAErf[;F*1!%bStD^RW2m,.\\,YoaNVuUc-Ohb
+c,df;]Y"-O/@iL5aN`,YbK7];\?W08V4sWRS=Q:FU7n<XX0At>[^33<W2-,YS=5n7R[O,@s-<YO
+rg<_R".G^KSGo)kTV8*TUnslaVPgAlWiN5'YPtd,ZMq31Zl$-V\%]`!aii#[g#(lUmI0W=p\F^_
+q=aRYp&F^cp&=[_p]L?hqu$Hj%fH5$qYU0dq"a[Xo^_M?rp:!XmdK];p@nF^JcG]K29XabVjj6I
+S%k8IM2I(CPcrE.J$"H,B1R&_92A60IXQ]r:f'kb;c->MN/NUNM2-hALPCNULl_QAr8uYN\>#:S
+QN!6QQ^O<@RJrZ_S=Q.9QB[PoP`Cb&MZeijKnbBRLhCL?DJsN8F*)SLG^=^bIXls#K8#&9M2R=Q
+O-,TiQ'[l,S"6.DTqeE\Vl?\tXfnt7ZaI6O\\#Mg^VI_(`Q$!@b0/&TcdC1ieCN7(g=k?<hV[8M
+ioB+]k3(sml0I^&mI'H3nF?MK!V>s_p&F^cp\jmeq>^<hqu6NlrU^#>s+14:s*t~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb0(ec+o'u5<n*]T0lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2LJ;92//Xku%=SqbcHOrD<bW1G^pJ2E(P$#=1U?5<h=o4oRPM5!(ed5X7V#5XGB7
+#sV-X92.'.9i+a[;uKVn;u9Pm;[??&<)Z[l;,U<k;ZTitrDrepr_rYkpf.8lr_iVm"'&B&<W5tt
+;ZKer<<-)!=8c7u=oMLu=T);#<<-"s;Zg!#=BGH'-X0qe@Uiq\BkqO#C2@a'ChI6c?XI)F?!UcF
+B5;F+Ec>o3B4PCU>Q.h*=9i&8?!UcFAnh6[!bc.Rra,\4?2Rn,=oDJ&=oMV)>Q%k-?N4=2?N"47
+?sd8L@q5IJ"D)+SAS1pP,[k%e@:s:iDK0cCIY*E;P*_`5Uo()iWMZJbTV%dES"-">S=9AFrL*\S
+rL<eTrg=(ZP`q8kNf/[IL&Q]QL51VEOHZ'(U8P#nYHkOC[C3TV]=bhk^V[n,`lH0BaihoPc-F_c
+eGe#(f@\d0g=tE=qVM2.s54+<hqm2FhVJ1f%c#gkeBlL``lH-Ab0%rPrm)&#dF$Cle^rL.gYCW@
+hYuC5i8O[p"QSS(j5^'us5a7Droa@Hrp'LK/+),/GZn9Q=BSd8:eaYW:-h?JP>O>Z4tJN=5!1GQ
+1.Xo)77K0o2EEo^3rW+b<)Z^n;,U4e;Y<lfeC4BE!R]?od0e7HcHje]c-=JUbPfQbaiMU'aT'<\
+`WF3#`r*gU`;[[R_uR^S_Z.LT_SO(f^];+I^&GYH]=PVdr43*C\@B#X\$u=Es0W!:Za-pDrj)R/
+rilF+s/mQLY_mXA?sQr>=BJa/=]\a1>$G*5=^,-8>?Y03='&F(=&f,s"&Vll;=[LqCMds-EH6,B
+G'A1WH[U?nJ:`E-L5:\EN/is]P*D5uR$sM8StMdPUo(&hWiW>+Yd1UC[^`l[]Y;.r_Sa@4aN;TJ
+c-FY_daQ^sf@\g2gtgiEi8N\UjQ5Oekiq?tm-O--n*fc9rpg*]o`"O`p&Ojcq#C0iqY^6ir;HTc
+rdk*#s6Tc9~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb1A(2/o'u5<n*]T0lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2Mk4FFB.FV5C,fo;;P`s.fUgrh9@bqk*n[rgikT!1WPJrL"LcOc,ZqQ!pPdVP^8e
+V50lXV4XBMS"H4Nri6+!WN#lq!5/<G"MUOQK9lD*rLWnYs.K=brM0Cer1j.b!2]@cr2'@fs.]Uj
+U\^biV50rbVPj?k!NN-uWu7q<WiE,"X/iA)YHY:;Za@-K\%0)]]=beiqn<-H^:jN[r4No\^qdk.
+ai_fOdFHn+jQc1'p%eUes82cmrs\l'p[mn?kih9tnFleYruM(5oBP;fe'6"U`Pom=bKeShh;d\`
+l/ggUe^;^drl58``5BI/_8!b_^am7<_o9[=bKS5XdF6RoeCE1'g>(NAiT'"[k32-rkiV$jkj.^.
+o_/(Vr;M9I\,S;XlG_,ud.>GaVl$K(_W01XY/ZZ2>Dno9Rp'*kUSOce>?b9>?sd2D\$iiS['?g?
+Z`pX;p9KVV*;ng0]"c%s_SjO:`Pfd9bKJ&OcHXJO`504+]t43Q"15>;Yjo#>CM[m+E,fo?Fa&%T
+H@1-iJ:W?+L51VCN/`m[P*;/sR$jG6StD^NUnsufWiN8)Yd(OA[^WfY]Y2(p_8=.0a2lBGbg+P]
+dF6Uqf@S^0gYCWAi8EVTj5oFckiq?slg4!*mdKW6nac8Bo^qhLp@e7Zq#C0iqY^6hr;HTdrdk*#
+s6Tc9~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb/bJZ*o'u5<n*]T0lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2M:mBPr"kK_'inK(4EeJF7n'D/!U%Df/L%I!^3fI!^3cG'J1RFE;PErI+Zmrd>-6
+OH>K_H"h8JJV*]Kq1AQtrIk0&rIY!#s+LE+reC0&reUN.r.b*(%u?!sM27"GMM[1GM2@+IMuJS6
+M>iD4MZA_8NW5%=O8b7@OoLUEPQ-jIQ2[$IP5pjDP66u3PEc'4/shrqStMmZY-G@C^;J"2`5g'K
+d`okM]t(PUY,eY,ZFI`mbg+PZai(m$YGS"arL+=hStD^PW3*>5\[f,PXJhqhT`1GbS!oe6R$R`:
+s-EbRRJrZWS=Q;OU&UnfV>mDGVl6PnX/rG+Yd(I=Z*Ua?Y-"h/ZF.3S^;%P'a3E&bgu%5[nalJM
+q"OOVp%@tJrpg$ZrpU$[o_%nVncn^YpA"FYqYg:)q=jRQnaGr7mI'H2md9H4p%\F`JcGTH*S];S
+XI,QMS]%(YLkpqCPcCC8I[P.K8SE0cF%]4+I0"eIr_<o%;c6IhNf8sTLkph@M#N,%Ll_QGmd/]L
+];CmZQC+#,R$sKBR1YmWS"6+?R$a,$OctfcN/NUMre:E.nq_=%Ci4-0EH6/DGB\=YI!pHoJV/W1
+LP^nINK90aPEhH$R@B_<T:r!TV5L8lX0&P/Z*UgG\%0)_]t_=u_SjF6aN;WLcHjkbe'uq"f@em4
+gtgiFi8WeWjlY^hl07L!m-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6HjrVcBfJcC<$m/MS~>
+JcC<$JcGECo`"gfrqu`ls8)ckrqQNf!;?Eb/bJZ*o'u5<n*]T0lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na2LM<9MSFJ;><ua;<C[X;)C'c3;ti>6:!q'5lNtT5!1qh4?Yei3C#h-62a%T9hnAV
+9gD?H;,Zs`s&/eorD`_o"B8B$<)``m!)ibo"B8B%<`Srp"&i/t;uKVo;u]es;uBSs;c6Llr)<l#
+<`W4#<)iiq!*&qtqH!]"=oMP'=oVS&=9)M&=T);(<``=&<W6#%<E<+!<;ofY<*3C2?=.)LAS5Ub
+ASH"$D.mEe?!CH4;c?\"?Y4.oEcZ8>D/!Ne>#nX&<E3.)>$G9>@V0:hChm]q@fBa8?N+48>[(B8
+=]e^*r`T8)!*oJ.s'GY0$"%"F?XR8M@Us$JAL1kuA7f=Y?!LT<?=75QAS5^lCi=EBItNT?R%'_C
+UnaTSSXZ%5rK@YQOcPK^OckfcN/WaWrfK($Q'IZ#Q'@DkN/<=EKnP)2JqJ]/M2mdeS=uj^Y-PCA
+\@T>e^VI\&_o0L4aN;QHbK\>Yci)5meCE1Mf_sM&g&g'chYl7.gB-0bh"f\3gtg`<f[S9mb/hU%
+a:HG:bg+S_daQ^re^i@+gYMkcs53k7"QAA"j5^+"s5a.?"6Se2lMBiFllbM;HWXQU=^"p?;bg"\
+:-h?C9ggs.0e"G(5!;"]0hFt97fPFJ2?#ZF4?HJA<Dugo;c-CioMPV8s3M%td*L%`cHXSVrlkAb
+s2tA`rl>,\aSs6[`r*dU`;R[S`;d^T`;[[S_Yq=N_#;"I]`bs[]XtfR])9,=\GWf7[K!W5ZN@G;
+Z2Lp)Y5ka)XVS-kHZ3J$=^"p0>$+m.>?b98=Bep3>Q.e0=^"j-='#<###nN";,L.enkX:ACi4-0
+EH6/DGB\=YI!pHoJV/W1LP^nINK90aPEhH$R@B_<T:r!TV5L8lX0&P/Z*UgG\%0)_]t_=u_SjF6
+aN;WLcHjkbe'uq"f@em4gtgiFi8WeWjlY^hl07L!m-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6Hj
+rVcBfJcC<$m/MS~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqQNf!;?Eb1%b).o'u5<n*]Q/lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na(8k#G(Z-XV5C-dVtm4iV>m=lUS@[[r1O"\rgs+[qjd\UnsUD`OcPHhR$M-UW2HMh
+Tq\?VU8FWVS=Z:BrMopsri,pr#JIja]Rg*-Mu0(AT)5/[U&C_ZU]%"bV>@(dV>-hhV50rbV>[7n
+W2Zi!rN#t"!3>sts/cg7YHb@<Za@-K\%'#\]=bfU]`Gj\rP&-A)SEbs^;%Fu^qmn*`lcQSf\PQK
+lL+<<p\+@Xr;R6)qXs=Bk2P7TiT9Fur;HXfqt075f$;@V`Pod9air,[f%]3Hkiq9hgt:-'c-4>P
+aN)?@_nj.)_8*n'_Sa@6b0/&Td*^:keCE+$g"P6;hr3VWkj.X(md09=l2^2Mm0W4Mo(2GDo_84\
+JcEC_29>Rab0AA^pu8Z[V7*q@cg9&eW/G5=MdMa>>$dqtUSt.s?!:ZF?s[*G\%/rRZE^R>YcY,&
+ZASYlkJ+XD^qmq,a2l9<`Q-."bRi%Aa2>d0`kB!n\%8uPYctJ)Z=mugD/O93EH?5EGBeF\I=6Tq
+JqJc3Ll%%KNfT9bPEhH$R[]k>TV8-VVPgDnXKA\1ZEpsI\@K5a]t_A"_o9X:aND]NcHjnde'ut#
+f\5'7h;7&IiSrnYjlYail07O#m-X60n*olHncA@Srq-?dp\4X]s7u]kr;6KkrVc?eJcC<$mJh\~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqQNf!;?Eb/bJZ*o'u5<n*]Q/lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na&uYWCN4dtK_L,rK'e-bJGaorJGF]pCD(<"E,JO!I=-BgH$Xg_G^+LXFoHI[I11LO
+IXQX)O,f0+c>.UtJbF]oKDgJuKE$W'L&Qi&L\uu,L]<,.LBNEgLl$rdM>rJ5Mu/D2MuJV5MuS_;
+NK0%tO8b7@OoLUEPQ-jKQ'@O2PPp[@PQ-gGOUIA<Q^OA9USb#mZFKnG+2>\7c-OYU_nERdXJr%k
+Uo:E(^ramJcHXGG\uqm$Rf8]jR[g"DU8=`eYdCmK['6X2V4sZUSXc5LRfJiTPmNbDR@0P8SXuII
+rM'n!V5C/gW2Q\qX/rJ.ZF..?[fNkArim3E['[6L\%&uZ]"Geoa3<)kl0Ig/o`"S;p@\%InF?&;
+mHX!&mI0H.l07O$nFH8HqY^<jr:opRlg!a"m-X<4naQ&:o_\T<s7cOOe=F1WR@Bh?bH[.dLm!LM
+QcGhOJ8S:oBMEMg92C"cI"$Q@:JFee;c-ANN/`aPLkg_@L5(EULlVKCn_D:#Wg8m9R$X5/rgNkT
+!LfGUS.M0[R$a,&P*M,hMMmFMKnb?PLhLO=D/O93EH?5EGBeF\I=6TqJqJc3Ll%%KNfT9bPEhH$
+R[]k>TV8-VVPgDnXKA\1ZEpsI\@K5a]t_A"_o9X:aND]NcHjnde'ut#f\5'7h;7&IiSrnYjlYai
+l07O#m-X60n*olHncA@Srq-?dp\4X]s7u]kr;6KkrVc?eJcC<$mJh\~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqQNf!;?Eb/bJZ*o'u5<n*]Q/lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+8Na$`Bg9284F;><u];<^pW1BoTn2`NW\62j+P5!M4o4oIJX4Zb\i5XIb%5sR\$6;:0J
+9e(Kb;,[!as&AemrD`eq!*&qt!E;tr;>jAr;cHat<`Srp"]\T'<)Z`o;Z0Pm<;f_r<)rosqc3Pn
+!*0#!r`B)"!E`M%=9)G$=Sc)!<rH))<``@'<`N*trD>p\<)m%'=^,-<?sd/G@VBUsD/!Qi?!:6+
+:.e5Y<aKBUEcZ;BDeirj=B&3u<E<.%>$P???XdV\Bk_6l@q&hQ?=.":>QJ&2r`95)=^#!5ra#M1
+!a]/<rEfM2s'Pn:@q5LK#A7abB4YLZ?iFC2?WpiG@U`\O?t!SZDK^ShN00BmS!fY2Q]mPmNK&mR
+K7\`/L4k)*I=?a$Ll.1QP*;,nO,JdGJ:E*$K7ei2Knb>AQ'n5<V5^T$ZaI6P]=bko_Sa:1`l?'@
+b5TTcc-Q:7#1CuMe^`7%rmqA,g">!2g=c>T!SQ-)g&Ke+g&B_)gC`/leBlLbbK@uNbg+P]daZgu
+rRW"BgtgiDi8NYSioB([jQ5Lck2kdgk3(pll0@U3mJQ>MlR)">>%(`>=BesF=\hde;aEc@HqlX^
+3%HO8/3c3K1.b&,7mo9p2?#ZH4?HPB<E)mq;Gg:f:f@!a#LC]@c-=PYbl,]eb0.rMrQ5&[s2Y/Z
+!6=uVrP\iV`PqhprkelU_o'@.rkSTMqnN0Erk/9Cr4;m<$b3[U\$rfT\$i]P[/RB3ZMh'-YlCp+
+Y5>@$XpVM(JT51,>$+p0>5hY'>8UUI>Zk99>?P-4>#eU)=&`-t;H-Ok;,:*\:M=KYD/O93EH?5E
+GBeF\I=6TqJqJc3Ll%%KNfT9bPEhH$R[]k>TV8-VVPgDnXKA\1ZEpsI\@K5a]t_A"_o9X:aND]N
+cHjnde'ut#f\5'7h;7&IiSrnYjlYail07O#m-X60n*olHncA@Srq-?dp\4X]s7u]kr;6KkrVc?e
+JcC<$mJh\~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqQNf!;?Eb/bJZ*o'u5<n*]Q/lg!`ukN:mdj5JqRh;$c=f[n^(
+e'ZOfc-+8Na(f=-HAJ0kVY$edVZ*CnUna^aUAgk]T`1S_T)P;\SGSfQRK/iURKnt=NL?&u@]'.'
+#cFPrU8"<WUn@UWs/c7$!ii6!rMU%:^V@G]Tn&DuSG\rRT)G8^TV;7Wp7hV`pSIhcpSInc!i;]g
+rMBLjs/,stWN*#rXT#@%XT,F&Y5bU:YHY::ZEggE[^N`X]">Ve]tM)X^&GbG^&G_G^&GY^]tD%l
+]">Vg^V[q2bKePfg>:lRmHs?2oD8@a%K#kglK$dSg"PBJoDAOds!@R8lep@>bfIfB`Q60EcHt(q
+hrNt`j5JhIe^Djjbfn8SbfRlDr58oZ`5g$DbK\D]e,Ii9e^rF-gt^cDj6#UonFQAIo^_VFp%@tK
+o(2PKrqHQhq>5aC]Dje:qu#3jdF$>4]rS'5\?j68k.[t@Y'5\0PaGT\>G8!kV5[X&>%(fG>?eVH
+\[AfLYI(U>YH[c,MZ4ma^q@P"^V\"1aN29<a32]ObK\>Va2Q!3`5'$r\@K)SYd!](s0H`]Ci+'/
+EH6/CG'A4XH[U?nJV/W1LPUeFN/is]P*D5uR$sM8StVmSV5L8lX0&P/Z*UgG\%0)_]Y;.s_SjF6
+aN;WLcHaeae'uq"f@em4gtgiFi8WeWjlY^hl07L!m-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6Hj
+rVcBfJcC<$mJh\~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqQNf!;?Eb0(ec+o'u5<n*]Q/lg!`ukN:mdj5JqRh;$c=f[n^(
+e'ZOfc-+8Na'2n_Cit8^q1S?lqh"3dq1&HpqgeWp#&S-iE,KPmqgAm#H?ja]H$=CRFE;kZqL/Bm
+#EOt,N;\3EHhW*bK):3#K_U0"K_gE%LAQc%M#<&,M#N82M?/WmqMYB2!K2p9MZJ]nrf$l:s,R&=
+s,d8Cs-!AF#aCO;P`q>rPEYj+rK@5ErfA1aPE_?!R$sS<TqeNeYd(LB]"uJ3cHXPQ_7R(VVkO*^
+,c7cW_oU'HbJqB.Y,7k_S!ob7S=Z=FU8=lnZEpmBYH4b$U7hLV"Iu$RS=0AD".>UHSGo&]T:r$U
+rh]Xl!iMuqri$I/XKJh9\@T>d]tCti]tV4orjtG.]tM.o^VI_,bg=qph;RJ`o_A4Tp%.bEnF,i4
+lK[a'mdBQ5nalDHp\F^arr)fjo^;)1kj.X+oC_hMoCMYPJcGBB2Q"."U7.XET#$\LM2R+FQ*7r_
+J[12<BMEMg92J<1IscZp:JOV`;c6FgN/`dSLkphBLk^V;pP=k0#PHut^T3]dQi<BPR0]7NR@0M4
+S=?#IS-kUKP`q>pNf8mSM>i8!LiR9ID/O<4EccDHGBnL]I=?]tK7nu7Ll%%KNfT<cPa.T&R[]k>
+Tq\?ZVl6VrXfen5Za@0M\[oGd^;%M$`5Td<aihoRcHstfeCE1&g"P39h;7)JioB(\k2tmll0@U$
+m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu-HkrUg)?s+14;s*t~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]Q/lg!`ukN:mdj5JqRh;$c=f[n^(
+e'ZOfc-+8Na$rQk9MPL_o2,KcohkW`r_`YmpegHU"#Vnl2uY]]6UF+*5sRY#5!;"k4?Pbg3^>qr
+6:!n&5XIh)9h\8UWCK`\;H!-cs&B"s!)iYls&B"sr`'#!;cEKi!)reqq,IAp!EE+u;u]bo;uBVp
+;u]hk<W5tr<W?,!=8u8$<`f3$!*T;'!`rK+o2buo='#<""'&<!;Z9Vq<W6#*='8d4>$>3ABl*cc
+(MRDe>?+Kl8kVlW>\7hkEH6&;Bk(IP=8Z)!=T2J<>@(`JAnPafARo4W?<pc=>$PB?>l@h(>5qe.
+>[:Y7?3FVA?!^k9?iOL@@:E_XBPD0qC1h/XB-Ckt@q0%\B4b[a@Uit_Ci4<;H@LU,P*VAtPE1``
+Mi!7CrIGi<J:W<)KnkPDNK99fPEV&bKReN#J:iT4M>iAGMiO-pTqnQbXKSn8Za@0O]Y;5!rkf2a
+`lQ3AaND`Obg"GZci28qdF-Ope^W1Kf)s[Wf@^&Rs4.;(f[ndSgAfh8f\+s3gYCQ;g"4a$d*DX:
+s3M>)eCN7)g"P38h;7&Hi8WbVro=7Ek2tmkl1XBBli-5Plg3s:l2TuHkooE+@U*8C=^,$2@8KZk
+:I.?<:hi<XF\45C.m?'L1GVNmr^HrJ2)bCp#X)0e<E)mp;H*0aqof#^qoSfX!lr=$qSrEOrP\WO
+rk\fS_SX.*rkSKI"hq[a]tM)V]DoDD\@K,ZrO;g8!4Dg5rj2X1!3uO-s/uF*r2ot"!3Q."$a-h8
+KlU^1>?=s3>5hY(>Q7q8=Bes5>?Y67>?P,.<s_i+<)Q^o;Gg4fnP=1@Ci+'/EH6/CG'A4XH[U?n
+JV/W1LPUeFN/is]P*D5uR$sM8StVmSV5L8lX0&P/Z*UgG\%0)_]Y;.s_SjF6aN;WLcHaeae'uq"
+f@em4gtgiFi8WeWjlY^hl07L!m-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6HjrVcBfJcC<$mJh\~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqQNf0_Y24o^qbGo'u5<n*TK.lfmZtk2tdcj5JqRh;$c=f[n['
+e'ZOfc-+8Na)#R7H]7`sp8@nerhTOgqk<bWrh'1]!hGjOqO@JQr0o-tOH,ZqQXZegVPU2dU84QY
+UnXKPT:MOSX/i>%X/`.uVnTp[]oKUGM#3_@Sb\lWT)t[ZU&1SZU]7.`V>[:kV>m@kV#[CeV>[:k
+VZNfrWr/ssXoGO(Xo>L&Y5kg+Z2_*7Za@-K\%0)]rk&3CpUpR@rOi0Bs1/uV\@K5c_Sa=3a3)`U
+e(<C6j6#Roo_SFa2#Hn0iniD@f\GHLnFl\Sr;-*Sk2+_:bfRoHaN)BDcICM&hr<\Ui835Af$_pl
+daZgrd*DX8+NqpLai_fLaihuVdF-Inf@\g1f\50?k3DC+pA"RbrVcZns82oprIP!Rs"iNSc-ar,
+b-7kCY.;L2io@8`P@02LR?j:N?)"-jVl3a(>@LuI>[+\H\[AfMYcb@;XfqH(MuP$d`jrk"^V[t0
+aN2<<a32]Nb0%rRaMu68^Vdaq\%0#SZ*:J(ZN%7EC27X'DK'T:FEMePH$XjdIt3-'KSG8=MN!OU
+OHPfmQC+)0S=Z@HU84W`WN*&%YHY==[C3TU]=bhl^r"".`lQ6DbK\>YdF-Lnf%8R.g>(N@hr*JQ
+j5f=akNM0qlg4!*mdKW6nc&([oCW%T!quB_rqQNhrqcQirqu`no_sFAJcG-;J,~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqQNf1A:D6o^qbGo'u5<n*TK.lfmZtk2tdcj5JqRh;$c=f[n['
+e'ZOfc-+8Na'<%bD0:Pdq1SKpre10$rdsNgn:1^YC2.[,DH$O^&USqQH$X^\GBnCSG&hYPIXQ\C
+I0b4]OH5B8MeR>.Jb4QcKDpQ!L&Qi*LBWKhLPUbCrJ:H.reUN0s,-]3rJ^c7qhtT9N/d^ps,[2A
+s,m;D!L&cBPPgUBP5pdFOAV.(Q'[i'QC+,0S"#tBV5^MtZb!uobg+MXb/_B0Z)FIjSXuUSYdhEb
+`5]d2]!JH6Tq.[BS=H(=SY2gXWi`J.Y-"b(VPBcTStMgQU7\$Krgs1^r1*nZSY?"W)Ps@1WMcSi
+W3!2/\%KMn_o9X9aN2KEaN)?@rl>_pc-FY^dF6Rpf\50Am.9rDoCDnMrpTjQ)=Ht_oChtTq>1!c
+r;?Nlr;$'VmHj60o_/(Yq>^3iqgne=ruK/&^nmKiSY!<^NJNFCL6A^I]762e:1m+>EcY&Nrd>N1
+Inid7<Dl^l:l^KoMi*=GL5:S=L%^=`rsAJ]bJ1-HQBmr*rgEeUs-`nU%@`lWS"-"8QBm\qPE(Y%
+MZ\`gL5,5SBPM=!DJjE5F*)PKG^4U_I=Hd!K7nu7M2I7OO-#NgQ'Rf*S"-(BTq\?ZVl?\tXfnt7
+ZaI6O\\#Mf^VI_(`Q$!?b0/&TcdC1ieCN7(g=k?<hV[8MioB+]k3(smlKdg'mI'H3nF?MK!V>s_
+o`Fj]p\ssfq>U6gqu6NlrUg)?s+14;s*t~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqQNf0D>)3o^qbGo'u5<n*TK.lfmZtk2tdcj5JqRh;$c=f[n['
+e'ZOfc-+8Na%&Zn9_VBY;>a>^;>X8f;=IBm1c$pG2`EW]5X@Y$5<_:qr]CQM4Ztkf5X@\'6:!m9
+63g4[9M@3492PL`pJ_)ks&8nppJ_&jrDWPj!E2tq<W5tt;Zg!!<`T,uqc!Akr_rSl"B8B#<)ros
+!*/qts&B)#=8Q+i<rc;#=8l8"<<cK*=BJU(<;ooe<)Ze!>$+m2?tF+jE,TT0C1U[Q;,9n\:/Y+u
+@qTOmDJa0%A7&PE=BAR,=]e^*=^>BB@Us(^A7K"S?!:?4?"%2N?sin>!F8t/>6A#0<a#B*$sd1H
+?X6lA?!q,OAnh6]!cW'rrb_^PrbDLMrbhaS+)l.:E,ff8EH?>PL6%I[OH,9YMM[1FK7\]/L5(J@
+NW,"=O?SeiPEV,iMhZk7JqSr:N/WaVOHPfpSY2^QVl?`"Yd(L?['mKU]Y2(q^qmq+`5]j=aND]L
+c-FV\cdC.ge,Ihte^j`Orn%8)f_jA$f`0Y&gAT\1g=tB9g=b*0ec!r(eCE+%g"Y9:h;7&gi!JB&
+jQ5Oekih9rqWn(Es69FE#3Y.2jlPRaroF@HmG2Yp@p8h6,$e2D8kqW:7Sd<(3'o>L1FbRN4#8W`
+84Z3<2E*NV4Zb\dr`'#!;cEZms%rAc$d-T4aiMTFaN)BBa83dY`Q#m9`r<sV`;daT`;daQ_Z%CO
+^]M?f_#1tI^AkkR]=bbf]">Pb\[f6L\,Wl=[C3KMrj)X2Z2Lm-YHIi+rN-"!s/I'<WiE,#XK8P+
+Y-=COFCefb>$4p/='&O.>?kB7qcXP6>?P*1=&i:%<)Zap;Gp@hnP<h5CM[m+E,fr@Fa&(UH@1-j
+J:`E,L51VCN/`m[P*;/sR$jG6StD^NUnsugWiW>+Yd1UC[^`l[]Y2(q_Sa@4aN2NIc-FY_daQ^s
+f@\g2gtgiEi8N\UjQ5OekiqBum-O--n*fc9rpg*]o`"Lbp@n=\q#C0hqY^6ir;HTdrdk*#s6]i:~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqJ8Cp@e1Po^h\Fo'u5<md9B-lfmZtk2tabio/hQh;$`<f[n['
+da?Fec-+5MA86"+JscJ5s/#Ogr29Okrh]Xj!2KOfrh8qVrgs=bSXl:@op[.fOIDN&QDLCUWMZSh
+VPL&`V4aBMS"Q@SXK/D%Wi;trWP8AH"94[8PkgjISc,/YTDtV_U@t>^V"UY_V?!IkV#R=jV#[Ck
+V>[7oVl6SpX8K(!XU;57Y-5%5Yck77Yl:m:ZEppF[C*KQ\@K/]]=\'T"22@[^&#D@]DoGB\G`lN
+]">Yi^VI_*aNMiRd*pS"hrX7tr;-F>rV5jFiS<);f@o0Dl0e6@qtfpMiS2r2d*KnWa2Z9Hdam++
+hr4On.,Wk8g"bKBhV6`9g"=p,e'c[kccjYYcdC1kf\5$3f@\g6j65k"p\]UBU]2J#bf\5Yp>N<W
+UoLuLi9SUUXH-tDNF&!B>$n#!V5L>mr`]qB?sR$I\%9,WZE^U?ZEUO;pTf_W#OKRE^VR\&`r='Z
+`;msXbS&+Cc-=AM`l#R2^:Lhb\[/QEYk,1#ZZBhrCMds-EH6,BG'A1WH[U?nJV&N.L5:\EN/is]
+P*D5uR$sM8StMdPUo(&iX0&P/Z*UgG\%0&]]Y;.s_SjF6aN;WLcHaeae'uq"f@em4gtgiFi8WeW
+jlY^hl07L!m-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVc?eJcC<$mf.e~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqJ8Cp@e1Po^h\Fo'u5<md9B-lfmZtk2tabio/hQh;$`<f[n['
+da?Fec-+5M=^>NPE.7_=pOrHsq1S^!s+9ZinUUXT%<69(Dgd"]IXQZmI<p8>GSYCDFEVbTIXQWo
+IXZcqIuf\ONo>5$I/&9aK(O]pK_U8tLAQc+M>W/0L]3,.M#`G0Mu8M:NJrjVN;\b5NrP1?OT(C@
+P5LODOoU^?P5^UDOT1FDP*Gm0!LB)OQjT7OSti0_ZF[rpbl5m9cca>D\$)['St2FGVl[/3]u.b)
+^:15BUS+6NSXZ(:S=cOOVl?\tXo>I.XJhtkW2m##rMT[m+Jbd-U7n6NSXuLJU84ZbW2?AdVQ$]&
+[^s5ka3DrXdaJ$?'[Y7Ve_/^5hqm5GgtU]Biof_"o'u_KqX4XXnauSPqtp<h%/]u"q=s[UnaZ2C
+q"k!f!;l`n!<.QLoDej>*5APDR[ftfYE"KrM2%IpbF3g2E)U+X9QG5J:4<+js*t#C&6)S*:QCBn
+Mi*=HLPgnBKnf>XO8f^`im#<BS!KA.R$jA2R[a;Es-rqV%[iZLP`_2lNJiaSLk^V<nVD7#CMRd)
+DfKf=FEVkQH@('hJ:W<)KnbD?Mi<[WOckroQ^F52SXuLJUSOcbWiN8)Yd(OA[^WfX]=bkm_8=.0
+a2lBGbg+M\dF6Uqf@S^0gYCWAi8EVTj5oFckiq?slg4!*mdKW6nac8Bo^qhLp@e7Zq#C0iqY^6i
+r;HTcrdk*#s6fo;~>
+JcC<$JcGECo`"jgrqu]ks8)ckrqJ8Cp@e1Po^h\Fo'u5<md9B-lfmZtk2tabio/hQh;$`<f[n['
+da?Fec-+5M6q'[@:/(4Tr_`Dfp/1Q^rDE)]s"c#^2`<W_5X@\$5sIV!4Ztnh4?P\e3^>tt5sdk'
+6pa479h\9E786VS;?9]or)<Vps&8komo0'\"&i/u<W#hp;u]kq<;fbn<;fbp<;fho;ufqt;Zg!"
+<`T-""'&B&=Su8#<rH,"<WH5"<rQ2"<WH4u<WH5#=T;G`<E<4'<)Z^p<)lt%?=R\dDJj<.DJNio
+>Zap&:JO\`<`r^:Anu=&Ch@*^>?P-6=]\X(<`rX4?XR@BA,g!E@:*;F@:a"\@q>RK!FfF8>Sp[I
+<)lq!=BSj5?!LT8='8d:@Uj%eDK'[rFouf+EcM%us)]l:H$XdaH?jaYFa&%UJ;0#AMi<ROLkph@
+KnP,6Ll77ROckokOcbfhOH5H\MMM1b15LjKO,oBcPF%Z)S=lRNUo()iX0&P.Z*L[B[^`lZ]Y;.s
+_8F1/`lQ9EbKS8Yd*^7hrmUqurmq&#qUti$$ea1cg">!3g=b36g&0P4g"=s/f%8O+g"P9=hu;R6
+iWeH(jQ>Ufkl0fHlMg#Rkiq<okN:pgjo4??irJ*<iVqa8iVhXehVHuBl#CcP?<LB5=_Cr69MJ5H
+8kFe/5s.+W.l/_=4"i?\8Ol9>7Q34`4$5Ver`',#<)cdo;tElaa8EsV`;mpW`W*mV`<*us`W!gT
+_Z@Wlrk\`Q_SZ5er4r9G!ku=[rk&3As1/-=rO2g9[JmN7Za-k8YQ:r1riQ1$!3?'urMfaori,pu
+s/c7&s/l[/XbM"1?X6f;<rH/#>8^[M>$5$3>$G37>$5!0=&i7$<)cap;Gp=gnP=4?CMRd)DfKf=
+FEVkQH@('hJ:W<)KnbD?Mi<[WOckroQ^F52SXuLJUSOcbWiN8)Yd(OA[^WfX]=bkm_8=.0a2lBG
+bg+M\dF6Uqf@S^0gYCWAi8EVTj5oFckiq?slg4!*mdKW6nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTc
+rdk*#s6fo;~>
+JcC<$JcGECp&=pgrqu]ks8)ckrqH]lp@e1Po^i(Q..Qcpmd9B-lKRQsk2tabio/hPh;$`;f[n['
+da?Cdbfe,LC2%[8L7eC@q5*h_rh]UirhBIfqk<VSrgs.\rg`hS%$6X4R@9CKUo1/jVPO3f#G@lf
+TV%dHT)5SfW=,Z;^V7ItPB2GFS=BAFqjmYVs.9=bU&C_ZU]7.gV$3`mV5C,drhf[m!2][jr2'1c
+"fJ;uWN*#tXT,F&Xokl3YH\#3%C*.BZ*L[A['[6K[^WaF\.6!Y]",Da]Xtbe]=PVd]`#JB\f82i
+\$rfT\@K2_]Y2%p_oBa<`Q69Nf&#QWp&+Xc;#9kSl/C=FeCE4-iof_$q>9mTl/LORg""Qtbfe5U
+e(!")hr3Y]mI'B-l0.BslKRTtk2bR`inrVKgXt*/f@es7h;$c<gYLcIkN_L,q#,dDV>hb6s7"7T
+bKp4_^9"31\[g2UkbkDuRs'TpQ'b]\>G8!kVQ0W"&7T$R>[+_I\[AiNYd1X>Xg%Q*MuO7Xbe:g.
+^r+46aN)9>aSj<ibKS5Ra2Gj1aM>If\HK=GYctJ+ZN%7KBPM=!DJjE5EccGJGBnL^I=HcuK7nu7
+M2I7OO-#NgQ'Rf*S"-(BTq\?ZVl6VrXfnt7ZaI6O\[oGe^VI_(`Q$!?b0/&TcdC1ieCN7(g=k?<
+hV[8MioB+]k3(smlKdg'mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<gqu6NlrUg)?s+14<s*t~>
+JcC<$JcGECp&=pgrqu]ks8)ckrqH]lp@e1Po^i(Q..Qcpmd9B-lKRQsk2tabio/hPh;$`;f[n['
+da?Cdbfe,L>@1uZFFj@E!/:#t!/:-"!/(0#o7?I_s(_pUEH>tpH[U9jIK"U#H['g[G^":PFFO.9%
+XrhUIZBMNNfJ3nF+8akqLSTss+C6$rdb'$on36sqh5*+Kn]DYs+^T1rJ10(r/(H2s,-l7rJUT4q
+MkK7s,[/>s,[2As,m;D#Eb14OckolP5UOBOoUXCP5^RDOSt:AP5^YJP`q;qQC!o%QC=D=VQ@2;_
+T'[>c-O_\b/D!&Yc"+^S"61HWNNS=^VdgsZ`^=+V5'`USXZ.ATq\E`Wi`M5\%&oU['[6L[^EQNZ
+EUO9Y-"e+WMZJeVPjEn%]QD)Vl?`!Z*_$Q^r4C@r6ZJ3e'uq!f@ep8iT0.ak2tjiki_-mlKdj*m
+dKWDmf2bUnGi"np%eL^qYL*dqYL*cq=s[Up%7nLp\Omes8;rsJcG0<,P8jeYFM&NS`.STMhm4EN
+gRf2J:O,2>A$]OF%];&I=HWnJGr:T<Dl[k:l^KnMM[.DLPUY=L%gCars/Macbm&[QBqK;"e1pKR
+@0NBSH#&eSXPn/P`h>oNJiaRMZ/>1L[p7=BPM=!DJjE5EccGJGBnL^I=HcuK7nu7M2I7OO-#NgQ
+'Rf*S"-(BTq\?ZVl6VrXfnt7ZaI6O\[oGe^VI_(`Q$!?b0/&TcdC1ieCN7(g=k?<hV[8MioB+]k
+3(smlKdg'mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<gqu6NlrUg)?s+14<s*t~>
+JcC<$JcGECp&=pgrqu]ks8)ckrqH]lp@e1Po^i(Q..Qcpmd9B-lKRQsk2tabio/hPh;$`;f[n['
+da?Cdbfe,L77U$F:/U[\!)NPir_`;cqGHl_nk]ZM2)I9O2`<ug5XGB7#!kI:4?Ybhr]C-F!($TN%
+REEK6;:3K927WA:Jk%hpeh2k;GpHk<;oen;uT\p;u]_q;uTYp;uBMp;c6Nm;ZTirr_rnu<;ohp<
+<#ks<;BGm<;fbp<<#tp<<#r.<)Z^p<E3!u<E<+"<``?$=8l8#<VTSr=&rB!<s)K)=BGK(s&]5$%
+Tcb7<`Dsp<)m"'?=IM]rbVUO(N+&'ARf(O<`)Rc:Jb"k>$bcTD/3co@/aJ!?!LN5<E<7,>[LlI@
+U`n_C1q3jB5)-sD/F*'B4b[`@:<MJ=]SU+>?tQA>Zt96>$YKD@Us(bD/XK;F)c/=E,fptF9Ql5H
+@:6mrdt0$$\Eq[JV&Q0LPL\@L\lc-L5:eLrfR5B!0@)=!f`+orJ!.aM2[IUOHPfmR%'V:T:_gOU
+nsreW2cl"Y->.8ZF%'M\[oGf^qmn*`5g!Cbg+P]dF-IlrR:hurn%/%rRq/'r7Lu$rRqM0f\,!5g
+YCQ_gAfn2gtgfChr"Fl"6/A%jSn9?jpgG7k2k^cj5T%Uhr!;Iqq_;-rn@>(rn.,"+7GA+?scu;=
+]pc"<)67_5Xn:eP!1m"1bCR84Zb;P1B'fY7R]9p2`s5b4$?VC<`Dsr;,U7f;"d`k`Q#p:`Pfa7r
+l"`R!Q;tS_u[cor58NN"Mqsl_86,drkJKIs1JKH]tF?V!P5i?\Gs#O[^EKLZa-mAZE^X;YHG%1X
+fSS'r2K^ps/,jqrho^nri6"!&?N":Y-5%5W322*Bjk7K>$(]*!*B)&'O"XD>$G05=B\j-<`N-u<
+)caq;H!KknkX.:C27X'DK'T9FEMeOH$XjdIt3*&KSG8=MN!OUOHPfmQC+)0S=Z@HU84W`W2co#Y
+HY==[C3TU]"G_k^r"".`lQ6DbK\>YdF-Lnf%8R.g>(N@hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo
+CW%T!quB_rqQNhs8)Wirqu`no_sFAJcG0<J,~>
+JcC<$JcGECp&=pgrqu]ks8)ckrqJ8Cp@e1Po^hYEnaQ#9md9B-lKRQrk2tabio&bOh;$`;f@SR&
+da?Cdbfe,LCi"3@N2?HLpSI\_rh]Lf!i)Kaq4[MTrh'4^rgj%YrgO1WOc,TpR:)qlrhp4"Una`]
+VPBfUSsu>MX8f4"WW/ps^AkqOJH'hPS"0JIr1*VSrLX"\!hc6\rM'"\rMB7cs/5mor2'@hqkjIl
+W;WarWsc#2Xfeh1YHbC<Z*OA8#-tSBZa7$Gr3ZO5qR6L9]D/r@]=PVc\@DLH%(*FM[^WcV]=bhl
+_8?2f$c^<6f%oHSoDALarql^ArV#X=gt1--f@es<kj@s5p@RtDlfR3`gXjs'dF6Uqf\PNLme6YU
+&bbkgo_/%PoC;>>o(2DAnF#ZBl4E:Jl0%0fjQ>XhlKms.o(;a/s/#`Rnc/@1b0%rRlI3#;VRNnW
+i8rRnaIQdE=dPGC?XBJ)Uo11s>ZtWF?X6mG[^`fRZE^X@ZELJ+ZA\`.pXHmk^r"%0aN;NB`QHEL
+bg">Tc-",H`kf[2]XbVb\?`?CZi%-)Zi7=QBkhF#DJsN7F*)SLG^=^bI=Hd!K8#&9M2R=QO-,Ti
+Q'[l,S"6.DTqeE\Vl?\tXfnt7ZaI6O\\#Mg^VRe*`Q-'AbKS8Wd*^=le^i@*g=tE=hVd>Oj5]7`
+k32'olKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`noDX=@JcG3=J,~>
+JcC<$JcGECp&=pgrqu]ks8)ckrqJ8Cp@e1Po^hYEnaQ#9md9B-lKRQrk2tabio&bOh;$`;f@SR&
+da?Cdbfe,L?"%>_G(ojKqM"p%q1\Tsqh+fuo7?Ucs(i-XE,fkpI!pElI!^0bHiA9pGBS.OFFJZ:
+IK4fqIfGK/NWib7C3P5[rdaotrdt*$rIY!!s+:9's+:-#r.P$&pP&d*LkpocM#W;3M"ul/MMmDk
+M?8]pN;JV4NX1]+O-#E`OH5J%OT1ICP5C@CPEM+-OT:RCOoCO>OoLOBOoLS=PEhK"PE_E%S=ug\
+ZFR`e`5]pDdF$:_a1o$_U7RjDSY)XSXgGXO]tV1i['6a7Vkp&YT:hjOV5^T&\\H&$`5'+$^VIY"
+^:Utg]Y=BY(;.5g\%&uZ\$`NGZ*UgE[C3TU]=u2)rQZ5*dF-Org"YBBj5f=akNM3tmHs6(l0@O3
+kQC)7lg4W<s6g3^o(;VIp@n@]q>Bslp%J(Np%J7ZrqlcqJcG'9*PTP%T:;:?S[>,OM2@"GQ`[d"
+I@#%O8k=&DF&5U1I279^:JX\a;c?RjNf8sUMM[+EM26n?L\Q[ds!QRed`&YhQBdl*R@9V6S!fY4
+S=Q1@S"#q:R$O)%QBI5dMi*FIKnf2TreY]1C27[(DfKc<FEVkQH@('gIt3-'KnbD?Mi<[WOckro
+Q^F52SXuLJUSOcbWN*&%YHY==[C3TU]=bkm_8=.0a2lBGbg+M\dF6Uqf%8U/gYCWAi8EVTj5oFc
+kiq?slg4!*mdKW6nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTcrdk*#s6ou<~>
+JcC<$JcGECp&=pgrqu]ks8)ckrqJ8Cp@e1Po^hYEnaQ#9md9B-lKRQrk2tabio&bOh;$`;f@SR&
+da?Cdbfe,L77g-I:f$a\r_NPjr_`,^s&&Acr_`Ac%l?'t2`N`P69mk'5sR\"55m\a4$>_h4$Z%s
+5sdn(6:4+7:/">4HqdL:;c?RkrDEYn;Z'Ap;H$Ln<;BGm;Z9Pn;Z'Dh;YO)i<;ont;ufkr<<#ks
+<:a#g<;ons<<#ns<<#tu<!6-!<E)ro<<6-%rDrntp/_)mr`9&#r)ir"%oub6=]JC!<`W=+?!q/R
+C&Vd,C2Ij+D/3lt?W^3&:JOVZ;,g_*@V'1dBkM'h@pr_N>?Y04=BSj6?=7D^E,TZ3CMRd*EH,l4
+CMIV`CHH9EB4YRaAnPX`?X@&H@:<VS@qB4`C2\*2Des9/DfKlAGBnRaIXZcsK8,/;LP1;4Jq/?#
+J:E*#JqO&Ure1]7M2I1KN/`dRMM_=i!/^]1s+Uu=MN!UXOcu&sR@9Y:T)PB'Tq\<XVPpJpXfek2
+Z*UjI\@K/^]thP(`Q--Ec-QC:"4GZIeG[qtf)OA$fE9gZg"GoJ!nl5[rn@M0gY;__s4m\3rS[V4
+ro3q;$f^4*i8EJIgtUQ9f`'J&f)*u!eC)bCdf7_ndeqQOn%raI?<:33>$+p.:J=JL6UjmY?8t5(
+.4$H-4?5/Q84c<?75m+^4?Ybe4'#?]<)Zap;H!Kk!)iSh!6+cPr5JZRpV[!IrkS]P_8*kb^B2-_
+^&G\E])oRS\c0,=[fj.I[C!:>Z3.A9Ycn&/s/cC)X/`3!WW/n!Vl6MkrMBUnW;`dpWWT<'XKDK)
+!3lI-)R?QJF*h\2>Zk64=BSa->?b?:>?Y06>$P66r`]8%#ut#*;H-Rm;,C0_:]=13BkhF#DJsN7
+F*)SLG^=^bI=Hd!K8#&9M2R=QO-,TiQ'[l,S"6.DTqeE\Vl?\tXfnt7ZaI6O\\#Mg^VRe*`Q-'A
+bKS8Wd*^=le^i@*g=tE=hVd>Oj5]7`k32'olKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`n
+oDX=@JcG3=J,~>
+JcC<$JcGECp&=pgrqu]ks7u`krV-EfpAX_9o^hYEnaQ#9md9B,lKRQrk2k[aio&bOh;$`;f@SR&
+da?Cdbfe+=CMe9IR/<cQV>mFcV>d7hUA1GST`1S_Sh$@qP`V6!Q"$SeWMubmUnso_V5L#[St)@R
+XfAJ&WiN/!WP#sZ^V%d_J<^&%rL<_Tr13eXrLX(_rh9:bpS._arMB=e!2odms/5dlrMKdsWMuhq
+rMg.(XK8P+YHP18rj)R/!j]/=qR$:1s0Vd5rjMd7!P#]=\cB;?\cfRT\[f6L[gfdR['[0G['dBQ
+]"5MgrkJu[_o9^Bdb3O?mdg#Cq"k"9q=3_1hqZo:f%T$Akj7j4p@\+No'bl,iSN>Bf\"p6i8s=s
+qYpKrr;-<ir;ZQnqYg6i!<2ur"8_fdo_e=[oE+XXqLS[As#'`+bKA#Ps7E[uVQIDJj3d"nZ]]!S
+MdDa?=^IhuVPpPp>$P9=@9m0M\@T5X[Bd$CZ`gI7pp5nY,l?E3]thS*`Q-*A`l?3HcHOSWbg">Q
+`lZ*9`4`am]"#)OYH[r1q6U(-DJ3a"Ci+'/EH6/CG'A4XI!pHoJV/W1LP^nINK90aPEhH$R@B_<
+T:r!TV5L8lX0&P/Z*UgG\%0)_]t_A"_o9X9aND]NcHjnde'ut#f\5'7h;7&IiSrnYjlYail0@U$
+m-X60n*ol<o(2JFrq-?dp\4[^s7u]kqtpBjrVcBfJcC<$n,In~>
+JcC<$JcGECp&=pgrqu]ks7u`krV-EfpAX_9o^hYEnaQ#9md9B,lKRQrk2k[aio&bOh;$`;f@SR&
+da?Cdbfe+2?=R_hIf"lgL%p>qKD^>gJIHF4CN"01<.'(AIXQYDHlI?WH?j[WF`W%^I=H]qJ:;rs
+NfT6]N1><7H\)'Er.+j"rIb'#rIOcrre($"rIt'%s+^T1re^Z2rJ:N3rJCK1s,6l6repc7s,I&=
+s,R/?rf@&?s,[&=rfI2Dq2tZ>!KiK?OT:RCOTpo0OcYZcOSt:UP*D<!QC!r*R@TtFW3*D8]"Geu
+d/MKFdEKM=Yc=LlSt)@FV5g](\%TPj]tD"g[BZm7WMZGbVPpPu[CjH"bK.Z?_u%@XaNMfPcdC.d
+ci200bf[uF_nj.)^q[Ut^V7M%aj&,XdF-Lnf%Ss<ioU1%ro=1CjQ5M%jqZt:io/nWjlbmnlg4$,
+mdKZ6nalGIqXsj]s7HTiq"agbrVhBJlMiBlft=,NR[]i'acMC:JqfJnR`g/6E`HO]9lb>L9mqJ>
+It)uE:JOkg;,E;PN<kDuLk^_BKnb<VM3%ZEiUPR>\>5FVR@9P5rgFFeR$sP:S=Q.=S=5k4Q^!\t
+NrFt?Mhd"?L@g<$M/I!@CM[j*E,fo?FEVkRH@1-iJ:W?+L51VCN/`m[P*;/sR$jG6StD^NUnsuf
+WiN8)Yd(OA[^WfY]Y2(q_Sa@4a2lEHc-FY_daQ^sf@\g2gtgiEi8N\UjQ5OekiqBum-O--n*fc9
+o()DDo`"Lbp@n=\q#C0iqYU0hr;HTdrdk*#s6ou<~>
+JcC<$JcGECp&=pgrqu]ks7u`krV-EfpAX_9o^hYEnaQ#9md9B,lKRQrk2k[aio&bOh;$`;f@SR&
+da?Cdbfe*r7S-<L:A%H\:BF?i;;"kD;&_AL1H%0N2F9_r5sR_#5X.Cq4Zkeh4?>bn5sbH9s$I&d
+:/";T:In2Vr_i\ls&/ko!)WSj"&`&r<;KMn;Z0Jm;Z'Df;YO)s<)lpt;c?Xp;c?Zd;ZTitrD`eq
+r`&nt!*&_ns&Att!`i<$oN(ijr)Nf!qcNl"s&T,$r`;cq=^#$5>[LrL@q&t^DK'T8E,KB#>Zk'*
+:J=GX;c[%+@V9CiChmd"BP(^\?!:<2=BSg4@:s@pEc5c0Ci40/Ci!s,EH6/FGBe=UrcA?cEGfT,
+BP@BZ#A7X]A7]FjDuO\cEH6,CGBnRdJUr?%I=?YCJ,XltH[5U:'RY=YJUr?%JUi9%Jq8Q.LPU\=
+L55\`'8hX$Ll.+NOH>WiQ'[o.SXuIGT`(T'Uo(#eW2Zi"Xfnt6[C<]X]=l%u`Q-*Dc-Oc8d/qbF
+e,Ihsec+/!f)s[Wf%9iNs478$rmh)"rmh/&f\$,U!8IM.rnS">hr*DLi8<GMhr!AMrSJ(?gY(0.
+e'c[ldEg+_c2Prec2>iechu)fcTon)d*L%bcgfY5FC/0Q>$G-eE)05&5X7b77>Nob3%HO9/3H!I
+1.b#,7n#m+2E!Z\4?QYF<Dujp<)QRj:f($a;Z=W3`W*jY_o0I2rkncQ"i8'm_8=(g_>_7M^]2%J
+^&GYE]DfDA\c0)?\$i^DZiRM=rila5YHP+3XfSS'r2KXn!2oalri#gqri5pu"0J`/YPtd*YlM-/
+ZjEs[IVrS$>$>$2r`BP3>?tH;>$5$5>Zt;/=o_V&<sVf*<)Z^n;G^6_:]=1.BPD6uD/O<4EccDH
+GBnL^I=?]tK7nu7M2I7OO-#NgQ'Rf*S"-(BTq\?ZVl6VrXfen5Za@0M\[oGe^VI_(`Q#s>b0/&T
+cdC1ieCN7(g=k?<hV[8MioB+]k3(smlKdg'mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<gqu6NlrUg)?
+s+14=s*t~>
+JcC<$JcGHDo`"jgrVZWks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0lg!`ukN:mej5T"ShVHr?g"4g)
+eC)ajcHOJRC2.d8L8+F>lD=KUs.fOer1O+br1WeVrgsUaP)YlsQX6PeVl?YmrM'e!US+0LSXup_
+X/i8$ri-7']tV7r]U!YnrgNeTpmh>Ss.9.\rh'7brM'4bs.]Fds.o[koqh_erM][mri#dp$EC/-
+XK/G(Xfen4rNcF-!42[3#ICeDZa@*I[J[E1[J[H9\%&rY\c'&:[fNqHrj;a5r3I3H\$rlX]=kto
+^r"%/aNMoYg>V2[n+?MRs!7L8o^M50iSE>Hhr*PZmdg#Dp\4IXp\"(BkN(X^j5fIjnFun\s8;cp
+rTO7arr)`ir.4mCruM'qbKA#Nr9hh5Vl7/Mj6Y7%XIt5jM-lR9>$dqtrhU@0>?kE@?s[)B\[f5W
+['I!A[BZp=ZM:bbrs/D[^q@J%`5_et)TB_>c-FPZbg"DTai)]H_T'F)]",DZZ*:I=rNc7*rj;]=
+Chda%DJjE5F*)PKG^=[`I=Hd!K8#&9M2R=PO-,TiQ'[l,S"6.DTqeE\Vl?\tXfnt7ZaI6O\\#Mg
+^VRe*`Q$!@bKS8Wd*^:ke^i@*g=tE=hVd>Oj5]7`k32'olKdg'mdKW6nF?)?oCW%Ts7QHerV6Eg
+s8)Zjrqu`noDX=@JcG6>J,~>
+JcC<$JcGHDo`"jgrVZWks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0lg!`ukN:mej5T"ShVHr?g"4g)
+eC)ajcHOJR>@;&ZFFs7Ao7cdhpOiBqnpqZsChRg-E):t2I"-WoH@(!bH?XRUG'.nUJ,Xm,J:E#s
+J<#\NNfA6tF+Jo?JGXosK)L?#K)^DtK)UDrK`?c%L'!-dM#3&,MZ8P3MZ&G5MZ/P5N;nk;Nr>%;
+O9L],O,f9^qN1T:rfI,ArfHo;rJpr?rJpr?rfIAIPE_B!Qi<BPR3S2nU8P)t[(*llcI1:pe'?%P
+]stAKVPBo^V5L>t[^j#_^;0`a'#;2jZELC4XKJe4\%fo'aiDB>rkp&$b0JDbf@ep7hqm8Ji83>G
+gY(62f$r*ocHOGO`lH?Oe_&UTgCW/siSrq[jlGCXgtLH5f@o'[i;_[6h%/E%j6#LflKdg'mI'B/
+nacSK!VH'_p'(-_p\FacJcFs6*TkqbVOX*DS&`7:O,8^KR&SB(J:i/[>A-cQF%]=.IM[B\J5/m9
+<Dl^l:6(?mM2I+ELl$nAKnoJ\!/Q^9'_U5#\#>XXR$sJ6S!oe5R@9Y;S=TYLs-aC`TTbP)P)bHY
+N/<:DL\-E%M>q7*C27X'DK'T:FEMePH?sseIt3-'KnbD?Mi<XVOckroQ^F52SXuLJUSOcbWN*&%
+YHY==[C3TU]=bkm_8=.0`lQ9Fbg+M\dF-Opf%8U/gYCWAi8EVTj5oFckiq?slg4!+n*fc8nac8B
+o`"O`p&Ojcq#C0iqY^6ir;HTcrdk*#s7$&=~>
+JcC<$JcGHDo`"jgrVZWks8)ckrqQNf!;?Eb0(ec+o'u5<n*]T0lg!`ukN:mej5T"ShVHr?g"4g)
+eC)ajcHOJR6qC!G9MeS`pe^f_r_WPjfi%fH#W=Io2`E]Q69tN9s$6TJ"$Jh248q>E4$Z+urB^iY
+6:=OC9M8,G9MPI`r_`\ns&&\js%rhq;cEZps&8qss&/nqrDEMks%rhq;cEQkqG[Akr)<So!)rkr
+s&/nqrDW\ps&8qqs&8qss&8kqrD`u"<E3(#r`/qsq,R2j!*B"t!*B,"q,mSs!a/W-r`M`p=BAU-
+>?kH@?t="jEcZ>DDes*!AmnkB;Gg=i<)m.1A7oUkCM[j*DJNln?<pf?>?tK@A8,jqC2%BqBPD3u
+EH?;JH@:;BJcC<9JU`,rH[C'aG]n1LE,BB)C2\0:Gl2k7I!pKqJ:DuoGBJ"KEH6,DG^+FTFE;SI
+GBeI]I!pHnIXQZnI=["KK)p[]reM)AMMd7JMi3RVOd))rQC=BDT)kUYrM':ds.o[l&ZD_2Y->4=
+[^j&c_SjI6aNDa)c2l8<rmCbo#gq,Me^iC)f%0iM!7Unr!7h"srm_,%f@\aTf`Ts_gtVh`s5!S/
+rS@M/$esCgg"4d&ccjMO`r=!Y`r=!_aN)BCb0/$.c2Z)eci;Alci23?c-+u*K5b."='Ag1BjXt<
+9hdlD8rH>&4?G5K2(UpQ0/?'i7n,p82E*NUrB(Hg<E2sr;H-Rl:f1*a;Z4Q5_uIRR_>M1J_%FK!
+^qd_"^;%Cr]tD%k]Xtbdrj`EH\$rfR[C!9GZ*CP4YQ(d*XTPZ*X/c/urM]aos/,dnri#gq!NN4"
+XT,F%Y5b^*YQD)8ZMq30[/RK5[MQ-;J8o%*>$4s1=]ed1>?tE9=^"s5>[./1%9Zt<=&rC&;c-Ij
+;Gg?a:]=2jBP_F!Ci4-0EH?5EGBeF[I!pKpJqJc3Ll%%KNK93bPa.T&R[]k>TV8-VVPgDnXKA\1
+ZEpsI\@K5a^;%M$`5Ta;aihoRcHsteeCE.%g"P39h;7)JioB(\k2tmll0@U$m-a?2nF5u=o(2MQ
+p&F^cp\jmeq>^<hqu6NlrU^#>s+14>s*t~>
+JcC<$JcGHDo`"jgrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0lg!`ukN:mdj5JqRhVHr?g"4g)
+e'ZOfc-+8ND/FECMl$-El_XQUr1a7drLs.`r1WhW)3L#MQ^M6XW2ZerVk^)_USal^U7J!KSZJgi
+WWB0#ri,q3"i%cYi-C:XRfT%MqOIPUs.9+[s.KCcrM'7c$DO5gU8+HWUSFW\q54+gs/>mq!N;pq
+W;W^qWrK.!XT,C(YHbA3ZMq02ZEsP;rNcR4[C,n=$F@+I['[6K[^NZSrj`!;#I_+M[^W`S[f3Z8
+Za0P9(pp]Z\$rlY]t_=t_8F:6b0A8_guRbipA4Ra#6+Jmo'Yc(ro#!Zk3D@'o_81Zs8W)qq"=7K
+md9E0nb;q\s8MuprVZWnJcCE'.,rLob00V\n$T0n\@U/Ul(Y)uY[NGpR$X7M>bS*lVl<j)>[h)K
+?!RB>$+RCLZ*1O@YH4u'Z]+nhqrPZ-_SsO7rl?"taihrTc-FPXc-"/Ie\f5E_Rm@h]!o#MYdFA7
+q6U(-DeE`tCMRd)DfKf=FEVkRH@('hJ:W?+L51VCMi<[WP*;/sR$jG6StD^NUnsufWiN8)Yd(OA
+[^WfY]Y2(q_Sa@4a2lEHc-FY_daQ^sf@\g2gtgiEi8N\UjQ5OekiqBum-O--n*fc9o()DDo`"Lb
+p@n=\q#C0iqYU0hr;HTdrdk*#s7$&=~>
+JcC<$JcGHDo`"jgrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0lg!`ukN:mdj5JqRhVHr?g"4g)
+e'ZOfc-+8N?=@G`G(oXEoS)aepOiBqp43KcC3"64;gWq@rdFusI!U*arcf0#G]\%VIsulsJ:Dus
+IufYNND6?fG5QpkJ,t4QrdjotrIairrIafss+UK-s+UH,!/LQ0re^E-!/^]4pl#-1!f`5#rf?u=
+s,[/>!0?o:$'C=2OcYWcOHG\)OSY(?OHK=!rK%>JP*;/sQBdc%R/WK]S"?FTXg>OP`Qci[rmW1?
+c,mo=]!\fFWi)erY-G@C]"PquaNDWF`504%\[JoR\%TWW`VdY7a3;o[f\GECioK4al0%3lki_*i
+k2kX^i8<AFf@JU,g>1WDiSi_RiSrnXio/eLf[S?pc-Fhhf@^)S#he"kioK4`kN`'5!q,OHrUKpZ
+s7-0^rUgEhp%A%Qq"t&As6'DAqUE3VS=5k8^tQ\gMM[(KRE!6tI]S9"Bh<GfFAYe]Islcr:/F_c
+<)QRhNf8pTMM[.DM2?q@L&$Q*Ll_QKpts*%WL0!>R@9Y8R[TY5S"-)JS.D'VQ_BY,QBI5dMi3IJ
+L5,>VreYQ+BPD6tD/O93EcZ>GGBnL]I=?]tK7nu7M2I4MNfT?eQ'Rf*S"-(BTq\?ZVl6VrXfen5
+Za@0M\[oGe^VI_(`Q#s>b0/&TcdC1ieCN7(g=k?<hV[8MioB+]k3(smlKdg'mI'H3nF?)?oCMVR
+o`Fj]p\ssfq>^<gqu6NlrUg)?s+14>s*t~>
+JcC<$JcGHDo`"jgrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0lg!`ukN:mdj5JqRhVHr?g"4g)
+e'ZOfc-+8N6qL$H:\R`d;#3ue;"miB;@PH=3&W]R6UF%)5s[\"r]U0A#!4k26:!q(rB^cW9hn>V
+.9'&<r)3Mk!E)el;#X;l;u'Am;uKVo;#jMn;u]bo;uBPn;u]bq;uBPm;uK\p;ZTirrDNYorD`_n
+r)<Sor)N_qs&T/"rD`Smn5fQjs&T/$rE'8,=BJX*=',?&s&oA*1KRRV<`iR3?X[M\DfKf>FE;G?
+Des&r@9m&<<E3+(?=78UBPD=&EH,o4BkV'e?sR#C@Jsg<AJ/TcA7o^tEcu\RI"-^$L51M;L&H])
+L&Zc-JU`)prHJBiI=D0G&q>F]IsuinH['[QDJNltBP_R*rbi<bE,p&CG'A1XI=H`qIXcnIJH1<$
+K,fQ!LPU_BMMd=NN/`p_Pa.T&R[p(FU7n<TTq\:ZU&Ui*USXlgX0/_6[CNud_8F42a2uKJbKA#O
+bg"E2c3_hDd*^=je'cXkr6YDirmCkte^aZM!S?!'g&9\*g]?6fr8/(Bh;-i>g=Y$.eC2glbfe)K
+rQ"iU#04g+b0%rQrltMiqp6h=d*L(bccs_Yc-5LGE*ljP>$>'8KPF=X9L)'<H%eXIAiV:u.R$!V
+1c#&$#"D$@2`<`]r]:-]<W#f";,C+c:f7!cs2+TJ"Mhji^qoubs1\QJrOr6D!5&6As1/-='=YEX
+['R*EZ*CO;YHG"0XK8J&Wqr^pW!9/uW2HPlW;`arWrB(!X8oC%Y5b^*YlD!.ZMq31[/[Q6[K*`5
+\,NlGZDiV#@:*8A=B\m2=T)G+>$5$3r`^"=>?P-3?<:0.<E)pp<Dugn:Jpd\r_RNGBPD6tD/O93
+EcZ>GGBnL]I=?]tK7nu7M2I4MNfT?eQ'Rf*S"-(BTq\?ZVl6VrXfen5Za@0M\[oGe^VI_(`Q#s>
+b0/&TcdC1ieCN7(g=k?<hV[8MioB+]k3(smlKdg'mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<gqu6Nl
+rUg)?s+14>s*t~>
+JcC<$JcGHDp&=pgrqu]ks8)ckrqJ8Cp@e1Po^qbGo'u5<n*TK.lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+7>Ci4BHR&9_VrhehSr1j=fo:l2Wqk,L)P)l*#QscehWMubnVPBoaVPKu[SXuITX/i8#
+X/i8"WP6-]^:aE>JX2jtqjdVUrLEkXs.9(Z!MH.bU'76bU8+HWrLjFiTq\<XV5=$cs/5^lri,pr
+r2K[qrN$+'Y->20ZMq3/[/@61[/RK2[/R?4Za@+=[JmW7\,Ni9[0!eE[f3]7[/R?2Zi.6J[^ENO
+\[f;a]tV;!`Q--Fd+@4<lL+6=rV-='rVH3XmcruqiT01gn+68KrVQU&rquQcp\=Uas8W&qrV_<I
+KDtu9cMks@c27OSZ)On5c/I0bWlpiE?&i9\S6B3nV5C2lWENP1?=@,E>I_;U[^<?FZ*^a;YHmu1
+N;j(\k/P*N`W!pua2l<Ebg"JXc-4GVaiVTO_nsR7]t:ke\?`BCZ2M!(Zi.92BP_F!Ci4-0EH6/D
+GBeCZI!pKpJqJc3LP^nINK90aPEhK%R[]k>TV8-VVPgDnXKA\1ZEpsI\@K5a^;%M$`5Td<aihoR
+cHstfeCE1&g"P39h;7)JioB(\k2tmll0@U$mI'H3nF?&>o(2MQp&F^cp\jmeq>^<hqu6NlrUg)?
+s+14>s*t~>
+JcC<$JcGHDp&=pgrqu]ks8)ckrqJ8Cp@e1Po^qbGo'u5<n*TK.lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+73?=R\hI>7TPreC#umY(1arIXot#&e9lEcH(srd>K0I=?QjH[L-bG]n4QFaegjIt*!!
+rdOj-#EFecIrTjeJc:6&JV&IFK)L>tK)L?!K`?c)K_gB)L51S@qMFs(!fMqnr/1W8NK!dqs,[/@
+rJpr=rf@#>!0@,@q2bB6rK7,Arf@#<s,Zu;!g8b2rKU!AR$jA3S"QUWY-GFI^rFRDe(3.&f$hpe
+`PB0rZEC:-X08h;]"Pu#air&Vd*KtZ`PK=(_SjF4`59F0`5KX:c-b+thV[;PjlZR*"6o+8lMg*0
+lKRNrkN1a_i83>KioK1^jQ,@\i8EMMh:gN4eC)gpeCE+#f@\j5hV[;PjQ5RglKdd&mI0N5naZVL
+!;$3^s7Q`ko_%nNq"t!gJcFp539S#VS=5k7S^H2XNJW7FQ`cm@I%k[\9571CFA#AXIXQZpJ5/m8
+<)c^k:5t9nM2@%CM2?tAKnoM]!/Q^9$iJu(\uM3bR@9S7S,JcmS"-(?S"-"<R@0D6Q'%AqO,]*W
+Mhd"?L\6K%M>q7*C27X'DK'T9FEMePH$XjdIt3-'KnbA>MN!OUOHPfmQ^F52SXuLJUSOcbWN*&%
+YHY==[C3TU]=bkm_8=.0a2lBGbg+M\dF6Uqf@S^0gYCWAi8EVTj5oFckiq?slg4$,n*fc9nac8B
+o`"O`p&Ojcq#C0iqY^6ir;HTdrdk*#s7$&=~>
+JcC<$JcGHDp&=pgrqu]ks8)ckrqJ8Cp@e1Po^qbGo'u5<n*TK.lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+6t7S-<M;,[$`r_WVjr_W8bpJUrem8=9K1G_!L3&X,i5XGB7r]^ZO5!1ng4?Geor^%&[
+6UF(*:/4MU:3B*&;>jDg;>j>j;#sQnqG[GnqGR)er_`_np/:if!)iVkrDNVns&8tsr)3Jlr`&hr
+rD`\ps&AeooiD)mr)Wi!!*9&"r)inus&BG-='&L,>$+j+<*!9'>qfYtBPM@&F*2VKF`VJ<BkCpc
+?<gW6=^5<B@q94eD/XE7F)l27B4PI\A7]=_@q&sIA.rNgCMe'7GB\@^JV&N+K7ei1Kn]J\)MWs!
+K7\W&I=6QoJUrE)J:;onH?jaXFE)5:rbE<dD/F0/E,]f<FEM_LG^4XaIXHQlIt*%JJc^RXLAlr.
+M>W8FNffKhQC"#/St;ULU7n6QT:VUFr1+CkTqeK`WiWD1[_'5e^;%M$rP\`R$cU'(aN;QHbKS/S
+c2Grfc2GlbcMu5ldFA0H#hRYZf@em4gthtdrSR\7rnn7Cgt^Z<f[eU&da6=bbl,ZnbK@uNb/qcJ
+b0.uPc-?76rm:YlrQkPjqp,5c%*S+<JRD\b=^"s4G(]ci(-b5X;FNu39/.nC1Ft^O/i$$h7Rfg9
+r\aa<rB(Kg<`N*s;H$Ik:f("dq,.4.r5&EKrkJEG!PQ5H^&P_F]D];@\c0)A\$i]OZi763Z*:G2
+Xp;)1X/i8"W2TWn!35jos/Z1$"08N)Xo>I)YHY81Z3@SAZa7$Gr3ZU7\$u%?&@]0TVMoY,?X-`:
+=BJ^.=^:r1%9cn;>$>-6>$5$2>?=l(<<c<#;c6Li;Y<ia;#b3FC27X'DK'T9FEMePH$XjdIt3-'
+KnbA>MN!OUOHPfmQ^F52SXuLJUSOcbWN*&%YHY==[C3TU]=bkm_8=.0a2lBGbg+M\dF6Uqf@S^0
+gYCWAi8EVTj5oFckiq?slg4$,n*fc9nac8Bo`"O`p&Ojcq#C0iqY^6ir;HTdrdk*#s7$&=~>
+JcC<$JcGHDp&=pgrqu]ks8)ckrqJ8Cp@e1Po^h\Fo'u5<md9B-lfmZtk2tdcj5JqRh;$c=f[n^(
+e'ZOfc-+7CBQ8<QUo)e@rhTOgoV28Ws.C<oPDbisR#n5DW2HPiTVSE\UnaZVTq7jWWiN0!Wsbr,
+WP6-]^Q5jJLn=O8s.&eRs.9%Ys.KCcs.].Z"/;QeV>[:hVtd4hWVWXpWs,T,Xfo"7rj)O0qQp7/
+rj;R1#dgqDZE^[?ZaBM8rj;X3r3ZI0qQq'H[^WcV\\,Ym_SsR;c-tD'j6,duo_JI[rt,2,q"4(C
+lf[Eom-aE:q>:0[rrE%Ls+:7On'(dR(sDUOaL/(H\\dC`kHMX_A:okKQC1obUS@ac'rkJC>@1cF
+>[+bO]!\rOZ*C[AYH4u(Z]+o)rTMA;^r=F<aiDNCbKJ/Vc-FMWbfRrJcGRNA`PDJb"h:nDYd(S/
+Zi.7LB4u!oCMds-EH-&AG'A1WH[U?nJV/T/L5:\EN/is]P*D5uR@B_<T:r!TV5L8lX0&P/Z*UgG
+\%0)_]t_A"_o9X9aND]NcHjnde'ut#f\5'7h;7&IiSrnYjlYail0@U$m-X60n*ol<o(2JFrq-?d
+p\4[^s7u]kqtpBjrVcBfJcC<$nc++~>
+JcC<$JcGHDp&=pgrqu]ks8)ckrqJ8Cp@e1Po^h\Fo'u5<md9B-lfmZtk2tdcj5JqRh;$c=f[n^(
+e'ZOfc-+76?=mtoK8/NBn:^=ar.=s"s(h[Krc&ZkI!g?kI!g3eH[9s^G^"@TFFJ[hJ,Xs,Isuj,
+O,f66MJ76cJbt&uK)gN%KDL3"KDC,uKD^E$L&6Q$K`Qp`reU?+qhkB2rJLT4!fW+uqi1`=OHBC$
+qiD)GOH5HaOH5E^q2bQ;rf7&@r/^`8s,[2A!0R/?rfSpuPa.T%R$jD4T;/6]X0/_:]YVV2d+-h*
+gY(*'c,di<\[JiJY->:@\\,bsaNi<7fI#;&eBuUgcHXSVaMu6<`Q$$Dd*pY$gtprGi8EVVkNM*k
+kNM-mkPaTSkN1a^hr*MTk2k^bio&_mh?)Keg&'>-f\,!5gtgfDi8Werj9k&5l0@X'n*fc8nbr%Y
+o_\:bp\F[`rVhBJkl3X5^Ta8tR@9YZf:%bWLkh(rZ-RoUDGahV9lkAJ:O[b@IXZcA:JOng;c$5L
+NK&gPM26tELkUP;qM>3.NrKaPb.F[DQC+,0S=>t:R[]e:T:PtO&t>;WQ^a8&QBI>hNJi^OL5(J?
+p5&[(DeE`tC27[(DfKc<FEVkQH@('hJ:W?*KnbD?Mi<[WOckroQ^O>5StD^NUnsufWiN8)Yd(OA
+[^WfY]Y2(q_Sa@4a2lEHc-FY_daQ^sf@\g2gtgiEi8N\UjQ5OekiqBum-O--n*fc9o()DDo`"Lb
+p@n=\q#C0iqYU0hr;HTdrdk*#s7-,>~>
+JcC<$JcGHDp&=pgrqu]ks8)ckrqJ8Cp@e1Po^h\Fo'u5<md9B-lfmZtk2tdcj5JqRh;$c=f[n^(
+e'ZOfc-+6u84u]O;,Zp]r)!&`p/:]`nkpA`1GUmK3'KYo5s[b$5!M1n4?bnk4?P\l6:(N9s$I#c
+:/";97nZYV;X[H`;H*Nnr_rhpoi(ifr_`Dfr_rbnnl,E`r_reqr`&qtr`&qtqGdMpq,R5k!*B/#
+s&JttqH*Vt!*B,"rD`l!=8l>W=&i7&>?b?;?!h#MAnc$uEHZSOGB7_@C1q3h@:!/B>[:ZC@:Nk^
+D/scBG'%eHE,>Mh&8GihAS,LcB5)'rDfg,EGBj+5!.=cq#(V8TJ:W6%rdt0&!J5e"HjbCRJUi9"
+I!^3bG^'.1!d&I&rGM^VErL.YF:<>:GBeF\H[:'fIXcnIJcC<;KS>/9M2I1KMi<XUOHG`kQ^=,0
+S"-#JRfSqDrKdGL,FP!jStMgSVl?c%['d?O]">Vf]tD%m]tV7t_Sa=2`Q#s>ao9EhbK@rKb0.uP
+c-QC:$IdPWg"G*6gYCWAro!e7s5FOIi8EMMhVI#Bg"=m+e'e6Bq9K5ic-FSZcMl2idJ_Jpe'c\C
+dJqSlci;8ibQ#^5mC\Hd>Zk35>$5*W9hnDW5XnOMQT%&].P*D+5<LVV7nH9B7RfBr2Z5]H4B,?[
+<E)mr;c$=e:Jgjb"Mhdf^VB`]s1SHFrjs,\]=PP`\@B#V[^EKKZa-j@Yck75Y-"e+XK/B#WV3=l
+X8T."XU;55Y-+t3Yd(L>Zi7?/[K!]8\,!Q3\H0:Pq7$a<X,hI8?X6f<<rH/*>?k?9>?P,.>Q7n,
+=oVS5=&r@$=&`-t;c6Lj;Gd'_rD7EFBPD3sD/O93EH?5FGBeF\I=?]tK7el4Ll%%KNfT<cPa.T'
+S"-(BTq\?ZVl6VrXfen5Za@0M\[oGe^VI_(`Q#s>b0/&TcdC1ieCN7(g=k?<hV[8MioB+]k3(sm
+lKdg'mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<gqu6NlrUg)?s+14?s*t~>
+JcC<$JcGHDp&=pgrqu]ks8)ckrqH]lp@e1Po^i(Q..Qcpmd9B-lfmZtk2tabio/hQh;$`<f[n['
+e'ZOfc-+7GCNFf[Uo)\=s.oRfo:l8Ys,e1gR@7Z`VPpJlVPC)bVP^,aTqJ$MSZJlmWrB(!WW0[3
+^BD3MPC/PjT(\]WSt2IEpRhJYq4[h]r1O1dUSRjb!2f^mrMT^qrM]Xnql9[sri?4)Yd(J4Z2h61
+[/[K3ZiIH3[/792[/RB0Z2V$3['R-I[ILX'Zi7<4[^H+Cs0i`R]"Phn_SaC9cI:G$hr<e`n+6;O
+rqHF%rV,sRm-*Qnl0e*8p\TOAJcG3=2YG;:aihj&s6d:uWOBUum(]a'P'VV:@$[4L@9fP*Uo1.p
+>[1]F?s[*L\@]8[[Bd*FZ`pO8q6Q"Z-0rgg_8XO>b/_TCbfe8YcHaYWb0%fIbeq?C`PB*t]"58T
+Z*:V/Zi.7GAnPdlCM[j*E,fo?Fa&%TH@1-jJ:`E,L51VCN/`m[P*;/sR$sM8StMdPUo(&hWiW>+
+Yd1UC[^`l[]Y;.s_SjF6aN;WLcHaeae'uq"f@em4gtgiFi8WeXjlY^hl07L!m-X60n*olHncA@S
+rq6<b!;HHes7u]kr;6KkrVcBfJcC<$nc++~>
+JcC<$JcGHDp&=pgrqu]ks8)ckrqH]lp@e1Po^i(Q..Qcpmd9B-lfmZtk2tabio/hQh;$`<f[n['
+e'ZOfc-+77@:sG"K8/NBmY("\s+:8d$Zg9.<IB1BIXZZkIf=[!G^4OVGBJ"Wqg]$&I?'AMNfA[8
+D0l)2on33pr.G$$s+13%s+C-#rIt6(qh5-,LPUc]M>E,/MuJV5MuSb9NVeb7O8b.@O-#G$O9Lc.
+O,oB`r/Li>NfO+"!0I/?p5]-5rf@,BqiLi@5Eq@rQC!u,R[]h=TqnK]WNEG5]"l;.db*=1gtC9-
+d)a,>\[8TDXg#4D]Y25(dF[+.i8W\Ph:pW8f@ABud/M<(cd:(hfA#*9h;7#HiSrnXjlP[hqWAUT
+jQ#7YiS`\SiS`VNhVI&Egt^Z=f`'M&fDsV(g(`;sgtgiEi8N\UjlY^hl07O#mI'HBnGi%\oC_eT
+pAXgfq>1*frVZ]ls7lZhrq6Hhqtp?irdk+Krr_]9[@@/a17Z2;`/ot8L6A1PO+)Y!?sm\EF)lA"
+9mqJ<IXb*g:/k1j;,E:3Nf8jPLk^bBL4tA<qhY</O8g@$jNP?=T9Ye5R[fn:S!oe9St;LDS=H(;
+R@'D-OdD5mrJU`5reL0&rJ>9$B4u$qCi+'/EH6/DGB\=YI!pKpJqJ`2LP^nINK90aPEhH$R[]k>
+TV8-VVPgDnXKA\1ZEpsI\@K5a^;%M$`5Td<aihoRcHstfeCE1&g"P39h;7)JioB+]k2tmll0@U$
+mI'H3nF?MK!V>s_p&F^cp\jmeq>^<hqu6NlrUg)?s+14?s*t~>
+JcC<$JcGHDp&=pgrqu]ks8)ckrqH]lp@e1Po^i(Q..Qcpmd9B-lfmZtk2tabio/hQh;$`<f[n['
+e'ZOfc-+6u84lQN:f73giDKAJohkE\$8aP!2`N`_69mh&r]gNK5X,00s#^6C!($TN%7*<H5sn@@
+:.n;F78HbY;X[Hc;H$Ln<:a&g;Z9Vo;?0Sg;Z'Jl;Y*ia;Z9Vo;ufqq<:<i`<WH5#<r,er<qo_s
+=BGH%r`/u!5Z_&j=BAO)=B\m4>[(H<?=72QAnl7*GBe@TF)Z)9BP(^\>ZXs.>[CcE@qT\#G'J@]
+I!U!YF)l5;DJa3*CM`ue"E8C'Fa*h0s*FZkrdFcprdP?*It)opH[:$cI=-?ercnfpGBJ(PF`_YE
+EW0nXEHD)#!HWA]FVf4FGBnI[H[C-gIXcm!JV&Q/KnbD?M2V=ls,R2BOoCODPQ-^DN\?BNMi*IR
+O,oBbP*2#oQ^XG9TVSKbXKJb2ZEggE\%&uZ]">Sg^V@S#_Sa=2`lJ)"s2b\lbK\AZdF6Xtg"P39
+rn[S1rneCJio8qThqm2FgtUT;f[n^)eC2nGdf.]&eC2prdaHOjdaQ\EeGRkseGdo(daQUkd*L%`
+c-4E2ap6&0aQUU%C1$sC(gC0ON,;<a9gD-<Kg@^[2(pR=.m?*Y1c#&$(.L\O2DmW]4$5Z,<E<'u
+;H-Un;G^.dq,77,"MMO_]Y+3Ts1/`O\@B#W[^EKLZa-j@Yct>1Xob`,X7`LjX8]4"Xo>L'Y6(u7
+ZMq31ZiIN2[K3nIq7-F7!P#]=])0#<\GWo:\d#U;N-Ai@?2dq1>$5!1>$G//>6%h*>6%k+=V"V9
+=&r@$<`E$q<)HRl:f-j]rD76@B4u$qCi+'/EH6/DGB\=YI!pKpJqJ`2LP^nINK90aPEhH$R[]k>
+TV8-VVPgDnXKA\1ZEpsI\@K5a^;%M$`5Td<aihoRcHstfeCE1&g"P39h;7)JioB+]k2tmll0@U$
+mI'H3nF?MK!V>s_p&F^cp\jmeq>^<hqu6NlrUg)?s+14?s*t~>
+JcC<$JcGKEo`"gfrqu`ls8)ckrV-EfpAX_:o^hYEnaQ#9md9B-lKRQrk2tabio&bOh;$`;f[n['
+da?Cdbfe+GE-Hl!VP_k>qkO4eo:c\[OH>s#QslhjX/W%pV#I4jU^<fgTq@s[XK8J(r2]k3$,=3f
+Rrj:NT:__QTDtJ`SY#bMs.8nU!20.]rh07as.BCdUAgtgV>mFlVu<RoWVi^oWV`^pX8f7&Y->/0
+Z2_-0ZN.B3Zi@E3ZN.B3[K!W6[0<nBZEpmCriuI,s02R0r3HC1rj)X4Zhq-/ZNIVB['fk@s0icR
+\[oDe^VRh-air2_f%Jg6iof[up%nF_%K?1so^D/4lg4$.o(W$4s+14>s#9f$b/hZEs8Vr)Z`:.8
+dGWNNWQ2G]M-6.2Rp03pV5C2lWEWV2?sm;G>.M5S['[*CZF.!AXKhW.MuOd^cb@68aO&/OaiMcO
+c-ah^bK\5RaNDZC_p$*<rjr?E\$E6B[.^j)ZuoqlBPD3sCi401EH?5FGBeF\I=?ZrJqJc3Ll%%K
+NfT<cPa.T&R[]n@Tq\?ZVl6VrXfen5Za@0M\[oGe^VI_(`Q#s>b0/&TcdC1ieCN7(g=k?<hV[8M
+j5]4_k3(smlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`noDX=@JcG<@J,~>
+JcC<$JcGKEo`"gfrqu`ls8)ckrV-EfpAX_:o^hYEnaQ#9md9B-lKRQrk2tabio&bOh;$`;f[n['
+da?Cdbfe+8@VB_-L5+iEl%JV[$ufusEcH+uI"-WpIXV3C#CC]@H$4CUFnpRfJ,YN/NWXN>Eddh:
+pk&Qur.>!$r.>!$rdb'$re(!!r.PB/KnP,5Knb?]LBE?hM2;"br/1N4rJCT5rf$c7rJpl<rJpi;
+rf@,@r/_#ANfB%qNWY?(O,s7"!0-f7rf7&@rf?r<s,dMLP*;,rQ^Ic?*1EFiT:hpRVQ$`*]"lD4
+eCWL1gY1?0bf7K4\?u7@(pgW[]Y__7dFdC:j5f:\iS`VMhVHr=f%'cN(YIHrgtgiEio8nSiT'%^
+kiq?qki_0mk5OEFj5T%Ui8=Oi%Gopth:pZ9f[eX(f%8RQgATe+g^i6!ioB([jlPXfkih9rlg4W=
+!q5XMrq$3`rUpruo^q\Cmd9?+l0.<nk2tdim-sT;rUg-]"8;Kaq>U9lreCFXh93:"S!oe9rn&NZ
+O,AOIRB<*5J#&<-Bh3;cF%];YIXQZpInrj7<)QRj:6(?nMZ&>6M26k>L\lo.Ll_QEm-2j2X.P]G
+S!ot>Rf8cZS=Q7CSc5,jS!]V3Q'.JtOc><[N/<:CL@pB$M03BABPD3sCi401EH?5FGBeF\I=?Zr
+JqJc3Ll%%KNfT<cPa.T&R[]n@Tq\?ZVl6VrXfen5Za@0M\[oGe^VI_(`Q#s>b0/&TcdC1ieCN7(
+g=k?<hV[8Mj5]4_k3(smlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`noDX=@JcG<@J,~>
+JcC<$JcGKEo`"gfrqu`ls8)ckrV-EfpAX_7o^hYEnaQ#9md9B-lKRQrk2tabio&bOh;$`;f[n['
+da?Cdbfe*t92&+X:u"qG;Y!]^;B.SN1H7<Q2FBbt5s[b$5<_7o4Zkki4?Gks6:+!963g:]9hJ/E
+8l#@_r)32bs&&nq;H*QorDW\pqc!Gks&8\jrDN\or_ihq;u9Jd;ts8j;ta2h<W?%s<W?+s<W#nt
+<rc;#<<Z?#;H$OqpK.8nr`/u!s&];)=T);@=BSd1=]ea-=^,0=A7o^tFEi"RH$OONC1h'b>lIq,
+=U82:?tO.kF*`65I0b1FG^"=TF`hg)EWgB'FEMd+GlN'pH$FU]I=6QorI=ltrI4cns*=Zjqfi?i
+G'8"LEcH$sD@CH&EclMJG'.kJF`hm,FTHZ0rcfK0H?spcI=?ZrJ:W9'KnbA=M2I7NMi3FIKnP&0
+JUdZH#((`FI=R!*reEFgLPL\DNK0*aPa7]+T:r!SUo()iXfo"8[(!TV]"5Pf^;.S&`5]j=ai_iP
+c-ObadaQatf@\dUg&Tn,g'$*_g=b3Zg&K\'f)F5"eGn&!e,Ikseb[i&e^i:$f@SU)fDO2%e^W't
+rmNdRdEp1`bfn5OaN2E@`l,gGgN7%6=BSa/>CV3R:/F\N6UspA5s&";.Q&Y=4?G2P8k;E@77R87
+&Ni-;4Zl\D<)ljr<)QUk:espa;Z=<.])T>@\Gs&<[f<]BZa-j@Yck75XfSS(qPs:js/Z4&qlTq&
+ricC-rj)R1s0_j7rjVd7!P,`6\c0)?\[oBN\bE]8]*>gIK6q<@?N+(3>$5*7>$>21>817F>?kB9
+=]eg-='&F%<`E!p<Dl`o;>*fa:j$>]BPD3sCi401EH?5FGBeF\I=?ZrJqJc3Ll%%KNfT<cPa.T&
+R[]n@Tq\?ZVl6VrXfen5Za@0M\[oGe^VI_(`Q#s>b0/&TcdC1ieCN7(g=k?<hV[8Mj5]4_k3(sm
+lKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`noDX=@JcG<@J,~>
+JcC<$JcGKEo`"jgrqu]ks8)ckrqQNf!;?Eb/bJZ*o'u5<n*]T0lg!`ukN:mej5T"ThVHu@g"4g*
+eC)ajcHOICDK'iSTr+^UV#[CUV>$e\U]7&+P`h/rR$XMFW2Z_mUnafcW2HGeTV%gIX/u/u!NNg3
+^'0M[GDi)crLj.`!20:_!hPsRrgrhUs.K1]s.K=a!hc6]rhKIg"/VlmVu*FmWW&jqWVidoWs>`.
+Y-+t3Yd+25r3HC1rj2X3!k#DCrNlg9Z*L^BZE^\3YQ1s-Z4+"DZ*CUAZE^^AZa@+<ZN.E3ZiRSC
+rO3WP\%0/b^VRe+aNVrWdaZh"g>:oUnFcSSp\t[#q=jUQn*TZ:pA"L_JcC<$o)CZHeB#\N`rGZ*
+bdadW]#<XXe?6f]KjKb0R%%;e>c"6pVlEs+>@:iG?!FkQ]!f#RZ*LdCYcY/+Z]"i0ldNYca2uZQ
+aN;TJcHOY\cHXVXb/qfK_o'a=`4W^n\[\rLYd*o.r3U3NB4u!pCMds.EH6/DG'A4XI!pHoJV/W1
+LP^nINK90aPEhH$R@Bb=TV8-VVPgDnXKA\1ZEpsI\@K5a^;%M$`5Td<aihoRcHstfeCE1&g"P3:
+h;@/LioB+]k3(sml0@X%mI'H3nF?MK!V>s_o`Fj]p\ssfq>U6gqu6NlrUg)?s+14@s*t~>
+JcC<$JcGKEo`"jgrqu]ks8)ckrqQNf!;?Eb/bJZ*o'u5<n*]T0lg!`ukN:mej5T"ThVHu@g"4g*
+eC)ajcHOI7?Y!qnJqf$KK`Hl!L$OEcK,8E@CN+<6H[UBmIXHNiI=6KiH$ORWG'<h7!.Xuu$%ID`
+O,f67[q^*_K)(&sK)1-"K)^E%K)L?$KE-`)K`?c+K`6](KEm3cLPL\AM2D4frJCB.s,6l6!/pf7
+rJgc9s,[)<!KW9?O8k=@NrY:@Ns(K&NK0"qNX1]+NfB'YN/`nqNrG(>OT(:@Oo:C>OTgo3Q'Ri+
+rg<_Ts.'+[-D$m*W33P@_T'dFe(34*f@ABtb/V<5]!erQ\@]Gg_T1!Rgu%)OroFCFio/ePgtLK]
+g]-(/h$W#sioB(YioT=ckl'cGkR6Y=k2k[bj5]+Vhqn:es4[k5f[n[)eC<(%g&B_)g]#t6h;7)K
+ioB([jo4BNkNM0qlKdg&m-X60nG_nVmf2VXkiLg]h;$cag'66ag"Y?@j8S0UkN:skl0@U$mI'K4
+nF,uEq>1!cr;M`V,kJpaU77U?RH_B2SW\k^LQes3U4&GO@S:EYF*1/P9n.P>IXh>l%T?>);,<44
+NJi^OLPLbCreC<,!/Q^9.HBaB^oX5sR[fk=SXQ%<S=?(ASt2@@S=>q6R?Wo%P`^ubNJrdNKSG9U
+M#<*EAnPdkCMRd)E,fo?F`qtSH@1-iJ:W?+L51VCN/`m[P*;/sR$jG7StMdPUo(&hWiW>+Yd1UC
+[^`l[]Y;.s_SjF6aN;WLcHaeae'uq"f@em4h;-uHiSrnYjlYail07L"m-X60n*olHncA@Srq-?d
+p\4[^s7uZjr;6KkrVcBfJcC<$o)F4~>
+JcC<$JcGKEo`"jgrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0lg!`ukN:mej5T"ThVHu@g"4g*
+eC)ajcHOI"7S-9J;>a8];#jMD;?'N$2)I*J3&j8l5X@^85lX%W5!1tk4?GYf5sdh&62j1W6paUD
+9M@3M9MYO`r)35cr)3Jms&8kqqc!Gk!)rkprDW\ns&8nrr_rYkp/C]`r_rGg#$"W%<`W4"q,R>n
+r`9/%<E/rrs&&nu<`]#ts&K8%<E<1&r`0/'=BSd/r`9)#r`B,#-WF#C<**:1@:X"eDfKiCH$FOW
+Ec,W)A7&SD=^,0<?=7;ZEd)bRHiABqH[9s]G5cX`FpiM;G'A1VH@(!bH@5^@s*t#u!J,b"ILCRO
+H[C'aH$FU[G^'.1$Zg?.DJj</DfB];FT-F_FT-F[G5ldcH2i1:H[L3hI=?WpIt3*%K7no3KS+f'
+H?OCPF)uABEH6)AFa&.ZI=2$B#C_/RJqSi3L]3#[Mij0cPa.T'SY;jWWi`J/Za7'K\[oDc]t_A!
+_o0L5`lH0CbKJ,Rc-FY^dF/$A!7:_krQYPjbfe5Trlteqd*U4he'uptrm_M0e^i=%f%8O)f@SU(
+f%0cL'\(U]e'c[kcHXSWbKJ#KaMu3;_o)Gi"m1VI@9d"8=W*u=F]2.55X@n885M661+jn04Ztn\
+1,;Bjr^HrL2E(Os#sCCM<`N*t;H-Qn;#sHiqGI='rjN!<[C*C@ZN7>8riZI-Xf\\+orJ%mriQ1&
+ric1's0M^3qmQF4r42g<qmla:r42O4q7HX;$+mNhHYQtp=^"u)=p\G<>$>-6>[(B8r`K2%#Zar+
+<)c^p;c<Tlp.tT_C1_*lBkqL$DK'T9FEMbNH$XjdIXm!%KSG8=MN!OUOHPfmQC+)0SXuLJUSOcb
+WN*&%YHY==[C3TU]=bkm_8=.0a2lBGbg+M\dF6Uqf@S^0gYL]Ci8N\UjQ5Oekiq?sm-O--n*fc9
+rpg*]o`"Lbp@n=\q#C0hqY^6ir;HTdrdk*#s762?~>
+JcC<$JcGKEp&=pgrqu]ks8)ckrqQNf0D>)3o^qbGo'u5<n*]Q/lg!`ukN:mdj5JqRhVHr?g"4g)
+e'cXicHOIHBleQXV>@(=V>$ebUF`49UQgq1S![Z\Vl-PlW2$/cV59u`TqS$LXK8P*X/rA&WN!SF
+^V7C>RX^RuU&LedU&CVaTDbA\T)kUWrh'=bTV2+Srh0:bs.]Ld!2BIf!2TUj!N)dlW;W[qW;`dp
+Wr/ptXT,F&Xokl3Yd+/4!42[3rj2C,rNZI1ZM:[(Y5tl2rilF.!3lI-s0D[2rj)O0,dana[C3NQ
+\$`]T]"Gem^qmq0bg+P\d*^=ngYUrOkj@s7qYg0g$2O8cp\Xg^q"ao?s+14As#9W+`Pom;`q05u
+^TXfM_r0k%['ZT?K8a0*RTa-)USjrdWEWV4@:<MJ>IqDX[^ENKZF%!CYHI]-N;k6he\K#Ab0\JX
+aN;TMcI(%cccs_Wb/hfE`QcE@]Y(hf\$E9CZ*sD5r3UTXAnYjmCM[m,E,fr@Fa&(VH[U<lJ:`E-
+L5:\EN/is]P*D5uR$sM9T:r!TV5L8lX0&P/Z*UgG\%0)_]t_A"_o9X:aND]NcHjndeC<($f\5'7
+h;7&IiT&tZk2tjjl0@U$m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+14@s*t~>
+JcC<$JcGKEp&=pgrqu]ks8)ckrqQNf0D>)3o^qbGo'u5<n*]Q/lg!`ukN:mdj5JqRhVHr?g"4g)
+e'cXicHOI9?Y=1tK_gGbL$"'cK.1YREH6)!H[L9kI=6EgI=$9cG^"@TFb#!nJ:E'!J:E$.Nf]9\
+DL?>LqL\^!!/1<'qL\Wtr.=j!qLnj%re19)s+LB*"GV\fLl)%c!Ju^5M>rJ5M>N2-N;nn7NrP1>
+NrP.?NrG+>OT1CAOSt4ANfB%pNr+h9N;nn;Nr+n;NrP.?OT(CAOT(@EP*;,qr0RSTS=H/KS3EL:
+UoCE"[CX)ia3;lWeCN4#e'Z@V^V%:q_8*e#_o^9RfA,?Gk2k[`iSWSMh;7#Gi8EMLhVd>Oj5oFd
+l29iEkl^/4k2cO%%H?@(hqm5GhV?l>f\"gSec=>$f`9b'h#?.0hZ;]qro=%>!TrSEkks]Fl4!"B
+kN:mdio/eMg=OpTe/$TaeCE.%f@\g3gtgcAhr<\Wk2k^cjSn-Gj6#Rkm-X<4p%eNIs#TehYbRVT
+R@0PUi5(b=K8,M_c'O!8FAlU^9lb;J:ecCgI=?Z@:JXqh;c$;NNK/sTMMHqCLk^Y;L]!#/LlhW[
+oBb&EWhYrLS=?1BSXZ+=S=Q:ESXl7?S!]V3Pa%N!P)fO$!K)[3LA$H$M03BABP;-rCi401EH?5E
+GBeF\I=6TqJqJc3Ll%%KNfT<cPa.T&R[]n@Tq\?ZVl6VrXfen5Za@0M\[oGe^VI_(`Q$!?b0/&T
+cdC1jeCN7(g=k?<hV[8Mj5]4_k3(smlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`no_sFA
+JcG<@J,~>
+JcC<$JcGKEp&=pgrqu]ks8)ckrqQNf0D>)3o^qbGo'u5<n*]Q/lg!`ukN:mdj5JqRhVHr?g"4g)
+e'cXicHOI#85)`Q;Z'A[;>j>X;>jD_;%kcB3B&oV6:*q'5X@Y#5<h:p4?NO)rB^KLr]plX5u(-L
+92.B8:/Caar_iAcs&/hpr)EYq!*&nqrDNVnr_iMis&B"sqbdGn;Z9Vo;Z'Jg;YsDb<!--$<`T,u
+s&K(u!*/nsrD`hsrDW_o!`N&tqc<\t6rd2c<E<.%=&i7$='/U-='&F'=BAO'<)Z^p<EE7&='K!@
+Anc.%F*2\NG'%eCBOY=V@q&hP?X[S^Ci=B=H@(!bH$T@3s*#K.H$FOWG^4R\H[L6kJV&H'J:E'!
+J:W9%IsuclHiA=$H$Xd^GB\4RF`MMBDf9UoEW:%ZF8^4YFoHOhGBS1SG^+L[rHnHir-\iuH[:!^
+F`VM@rb_jUDJjB3rc.mY+a&!SH[U?lIslcoH['g^IY!*(KnbGCO->p!SY;jWX0/Z*YlD!.Zi@BC
+[C<ZW]Y;1r^;%Fu_Sa@5rlGDc`l,d3^q[Y`]ahck_8=.2aND`Pcd:%ddJD8ke+qMle,Ic/dEp4d
+ccs\VaiMQD`l5p8_o'=,r4k&%ie1W<>$4s1=^,'tC/n"p5X\.t83/je.P*D,5!:SU1.ar+7RT3o
+2EX)`4$6SG<rGqu<)Z]o;#*uhZi768Z*:I9Y-"h-qlBImriH7)YHRr0r3?4+rNlO2!O]B7\,Ef:
+\bEZ9\[q^LpU^(1!4qp:%&er/Cg^LN>$+p2>$:Z*(0OmH>$>$1=]SU)<E<'u;-$Rl;c-FhpJ:]`
+F_,/uBPM=!DJsK6F*)PKG^=^bI=Hd!K8#&9M2R=QO-,TiQ'[l,S"?7GU84W`W2co#Y->1;['mHS
+]"G_k^r"".`lQ6DbK\>YdF-Oof%8R.g>(N@hr*JRj5f@bkNM0qlg4!*mdKW6nac8Bo^qhLp@e7Z
+q#C0iqY^6ir;HTdrdk*#s762?~>
+JcC<$JcGKEp&=pgrqu]ks8)ckrqJ2Ap@e1Po^h\Fo'u5<n*TK.lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+7ID0:8fq52K7p7rLfOdh`,@ATiuX/2_iVPL&cVPKrZSt3"^X:_S9X/i87]YD1sOE?/J
+Una`\r1a4dr1XChTV.pKT:c+UrLs1_q4Rn`Tq\:\U&UkdUBIBhV5C0dW;<LmWr&h&XKAV-Y-5%5
+Yl(g,ZN.B2Zi%30[0!\?ZMq04ZEUR:r36(%!O/d*YQ1s,ZMh'.Z37M>ZEpt<[NMue\@B)^]tV>"
+`QHBJc-O__d*pLqfA#0>j6?"'pA4d]rrW2urdk*#s761Lro:c3`l>sss7O78XgZO.man,*]7YQl
+@$[6b@U,\*V5UGo>?b9=?sR#@\\5M]['[*E['Hp<Z21ecs!?p`_SXC:d*^(Xb/qrQdF$4_cHXPT
+aNVTAc,dl;]XtebZE^X<n[/=-BkM*nCMRd)DfKf>FEVkRH@('hJ:W?+L51VCN/`m[P*;/sR$jG6
+StMdPUo(&hWiW>+Yd1UC[^`l[]Y;.s_SjF6aN;WLcHjkbe'uq"f@em4h;-uHiSrnYjlYail07O#
+m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6HjrVcBfJcC<$oDa=~>
+JcC<$JcGKEp&=pgrqu]ks8)ckrqJ2Ap@e1Po^h\Fo'u5<n*TK.lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+79@V0P'q1e!bie7>a"`.spEH>+YHj"qHIXHSCHNe_?G]n7QrI>E.J:E*!Iu]MLNfS9r
+F+T&BK)L<%K`$K#K(susK)UE%K`?c+K`?c*K`?c+L'NEcKnY8:Lku"dreLT3MZ/J4MZ8P1M?/Zq
+repi:q2YK9!K`?<O8"_;O,].sNqeV6N;nk;Nr+n;NrG+=Oo:@BOco^-!L/oKQi`_HSGo)ZS/\#j
+StD^OV5:2r[CX/maj&5^eC;soc-=JUai=>!&'2o>db*@4ioB+[io/hPhYuIBi8NVPiSieVjQGak
+lMg,Mli-/clg!d"kN([_ioB(YiSi\Nhqm,Ag=b-2rRq5)!SQ3)gAp%-h#lNkiSsjs!9O4B''JKB
+kND'lk3(mhjQ#7YiSWMIqUu)*f\"g.qq2,+gYLiKroO1@''%s/i8WbVjQ>Xilg4*1o_/+XP5bX7
+]r7:sR2;@Ai6dpQMhRUja.Rp0OChm7:NLSN:ept<(4Uj0:JOng;,C&KO,]$SLkghDLk^Y>r/(H0
+O8gWtfYX\cR@0S7TV%dDS=?(>T:VUES=H(:R$j8)Q^*_pNK0!ULk^Y>nVI3VBkM*nCMRd)DfKf>
+FEVkRH@('hJ:W?+L51VCN/`m[P*;/sR$jG6StMdPUo(&hWiW>+Yd1UC[^`l[]Y;.s_SjF6aN;WL
+cHjkbe'uq"f@em4h;-uHiSrnYjlYail07O#m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6HjrVcBf
+JcC<$oDa=~>
+JcC<$JcGKEp&=pgrqu]ks8)ckrqJ5Bp@e1Po^h\Fo'u5<n*TK.lg!`ukN:mdj5JqRh;-i>f[n^(
+e'ZOfc-+6t8P;fS;>a8Z;>*iX;>=&_;#rO0r\tZO6:!n&5X@Y"4[)"m4?Ybg4@2A#6:(T;!CK3Q
+:'O?d5"eUJ;Z'Dj;YEue;Z9Vi<;TVo;ZB\p;ZB\p<;fbq<;]\n;Z'Jm;Z0Pn;ZB\p;Ya8k;ufqs
+;up!"r_rr!<`f,tr`&hsqc3YqrDW\n!`N&ur`0##r`0##r`/nt!*/tu#$4o/<``C+rE')$<W5qu
+;c3Nj'3&(=?Y*ndDfKi@GBRtEDJa3(B)Z9GAS>goDfg2KH2`*mH$FOWGlE!gGlDspH@('kJV&Q0
+L5#VZ$%[\[K7SK!H?jf8H3nkCH$FRXG'7tKrc/$\FSp4YFSp:\G5QRaGQE)9qg/<jrd4Zms*Flp
+H$FRXrcS3`"Eed,EcV,"rGi?jH$k'jJ:N)uI!U'`HN&<lI1C^WK8,2?NKB<hR@B_<TDkMkU8+N]
+VPpJpXfo#-Z37PC\\,WT^_FJn\@&`N['R-I[C<]Y^;7\)a2lF$b5oi4rltJe!6tMg!mf0:rluA,
+cHOMUb/q`Ga2Z*;`5BO2_SX.*^q[\"qnE*D46)E>>Zt<6=BepUQ$-2):-_EBEC`DW681#L/3Z-L
+1G_To7n#j92`<NT4Zkkg<`W4!;cH^p;,U7f;>O/jYPt^'Xn]!sXo>L&YPtd+Z21d)[/RK3[f3`;
+\@K0F])B5@])92:](Wc9]_K,:]E#SC]F(R/J8Se#>?P'2>5h_+>5_\*=Tho2>?kA2=:J;4<`N1#
+<)H[o;,U7gnPK6sBkM*nCMRd)DfKf>FEVkRH@('hJ:W?+L51VCN/`m[P*;/sR$jG6StMdPUo(&h
+WiW>+Yd1UC[^`l[]Y;.s_SjF6aN;WLcHjkbe'uq"f@em4h;-uHiSrnYjlYail07O#m-X60n*olH
+ncA@Srq-?dp\4[^s7u]kr;6HjrVcBfJcC<$oDa=~>
+JcC<$JcGNFo`"gfrqu`lrqZWjrV-EfpAX_8o^hYEnaQ#9md9B-lfmZtk2tabio/hQh;$c=f[n['
+e'ZOfc-'U7Ed!&'q53k^qP<APrhT=cqkP[*P)u0%R&$XWX/MnmUo()eUS=KVStN3fY-"h,XK&>$
+^:q:p^P2]5Mu9FOV#$hdV#6teTa@BaTV/!PU7n<Tqk3eZpnIe`"f.ulVPg?gW;W^oWr&jsXT,C&
+Y5YX)Ykt^,ZaB\:!42O/riuO1riua5Ycb.4Yd!o+qlg++ZMq*4Yck77Z*F;6!k#JFrj<oX\%0,_
+^;%M%`Q--Fc-FY^cd:"ce(3.)gu%)PlL4EArdk*#s5j8?lFt0T`5DWQq:E<_YIrBHbeC1)TOX'e
+QC"%D@&0ZsW2HY">[(WE?X6mH^Upq^['I!FZ`pU9[/71gs!@!c_nsO=dF6=[b0/)UcdC(`bfn8P
+aihZBc,mu=]=PV`['HsAn[*IMAS,UhC27X'DK'T:FEMePH?sseIt3-'KnbD?Mi<[WOckroQ^F52
+SXuOLUnsufWiN8)Yd(OA[^WfY]Y2(q_Sa@4aN2NIc-FY_daZdtf@\g2gtgiEi8N_VjQ>Ufl07L!
+m-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$oDa=~>
+JcC<$JcGNFo`"gfrqu`lrqZWjrV-EfpAX_8o^hYEnaQ#9md9B-lfmZtk2tabio/hQh;$c=f[n['
+e'ZOfc-'9uA86(6q1eTsqLnTso7[*qnq7'^CMWoi'mtFWIslcnI!pHjH?a^[G'8CeJq8LPIfb.M
+O8Y(@@dn2Wr.G$$rIb'%r.>!$p4N?rre(0&pkA^%rIt9+!JcL-M>rJ4M>rG5M>N21MuJ\8NVJM7
+O-'@%!07&>plPK9rJpH.rf6l:rf7#>!K`HBO8tFBOpmP=QBmo*R@0P6S=Q8NSc5-+SXuIFTVA3Y
+Xg>OO`QQTWe^`7%e^MsoccaGOb082[eCNF3i8`hpi<%rphu;O6ir.p;jqd.Elg4$*m-X60n*]Q,
+jlGF\j5T(Wi;VU9h:pZ;p"9l0g"Y9:gtgcAhV[8MioB,!jT+H;jT+B@ireB&io9gn&`DR(i8ESQ
+j5]+Wi8N\UjlY_)kPs]EkPscFk7$VAmHsB3o(2PKq>:/Us#JiOXHo6BR$m3^fVb$nJrcA1Q]cp'
+G>N'HFE2Is:OdhAIsuoC:JOkg;G^/LOc>9WM26qELk^V;qM:44+S=='XehGSSXc@FS=5t;SXlFF
+St2CAS!o_5QB[`$PE5^&"H&%kLPG>TG%>/rBP;-rCi4-0EH?5EGBeF[I!pKpJqJc3Ll%%KNfT<c
+Pa.T&R[]k>Tq\?ZVl6VrXfen5Za@0M\[oGe^VI_(`Q$!?b0/&TcdC1jeCN7(g=k?<hV[8Mj5]4_
+k3)!nlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`no_sFAJcG?AJ,~>
+JcC<$JcGNFo`"gfrqu`lrqZWjrV-EfpAX_8o^hYEnaQ#9md9B-lfmZtk2tabio/hQh;$c=f[n['
+e'ZOfc-&OH8P2`Tr(uu^r)!DhpJC?Vpepud!];_hr\ssH69tN9s$6TK#!P144?GYer'LEL$U@$F
+:JOYZ:+_l0:]+,g;#jMd;#jMk;ZTirqGd/erD`,^!)i_nr_i\n!)iSj!E<(s;up$"r_rnu<rH%u
+<<#r#<)Z^ppf.;nr)<Vm!`N&ur`0)#<)rous&K&!qc3Ytr)ah>>$G04=BAO';c-Cg:/4S^;cd10
+@q][uFT-FsF`VSADes0#AnYmmCi=?:GBeI]rHSHhGBa"1!.+Wk#CM#OJV&W3M#N,8KnkJ=KReJs
+H$T@7!."Qgs)n]kFEDSEEcZ>EF8^1]F`dV+s)n?bs*+Her-8?iH[Ga<rd4Hg!.4]ms*Y3$IXQTk
+H[9saHiAEmHOkLPIXm!#JqJZ+J:N3&Jq<oO)2!WsL51VBMi<XVOcbfjQBml*S=Q:GTq\=]V>d8!
+V5UK"Za[KW]XkY`[f*T5[19XS\%0)`^VRh+`5]d8`r<pX`lJ%tqoA`V#K=^%_o'@._>_1L^AGVD
+^AknH]_oJC^'hTe]tD#3Vf6'L>$(]*0r&Z9>>n9^6V(<M765<B.Q/_>4Zb;Q8kDNB7R]9p2EX)b
+4?QVE<`E$r<Dc[m:essd;ZBVmXoGL#Xo>I'YPtd*Z2M!+ZN.B0[/dZ7\,No:\biu3]DfJB]DfJC
+]DoJ?]C<K5^%]/T]r%`\DI6XP='8^0>[1K:>?Y69=]nr->6\52=B8I(=8l2)<)H[o:fC7inPFC>
+AS,UhC27X'DK'T:FEMePH?sseIt3-'KnbD?Mi<[WOckroQ^F52SXuOLUnsufWiN8)Yd(OA[^WfY
+]Y2(q_Sa@4aN2NIc-FY_daZdtf@\g2gtgiEi8N_VjQ>Ufl07L!m-O--n*fc9o()DEo_%nNp@nO\
+s7u]kr;6KkrVcBfJcC<$oDa=~>
+JcC<$JcGNFo`"jgrqu]ks8)ckrqQNf!;?Eb.eN?'o'u5<n*]T0m-<j"kN:pfj5T%UhVHu@g=Y$-
+eC)akcHXOFCiFWTo;;D]p8%)PqP<k^)5NLYSXQ$WU8FojVl?PiV5L2eVkB]STWP?qXT,C(X/`6!
+^)"JOT7E-'Vl6MjVPU,bUna]\USO]\U\pkcTa%6bU8"EXU&:S[U%b8bUSXibVl0?hri,jrql9h#
+Xf\c(YPtd+Z1bL'Zi.62Zhgs1Ycb15Yk>3tYl:mLYck75Y-5(7ZEggD[C!?M[^WfX]=Yel_8F73
+aihoQrQYu#d*gFof%8R-gYV#Wnb;q[JcC<$kl3X3]u7k,_Z09-lcuo?^<u&hfWi2[@pY7)R%.Ag
+Uo'udVlO!*>[_&K?!FhO\[JoQ['R0IZELC8qm27]*UMS#_T0mKe'6"XbKS>Zda-4`cHOMRb/;0C
+aN)$o]*,UMZEUS&[/X]TB4u!oCMds-EH6,BG'A4XH[U?nJV/W1LP^nINK90aPEhH$R@B_<TV8-V
+VPgDnXKA\1ZEpsI\@K5a^;%M$`5Td<aihoRcd:(geCE1&g"P3:h;@/LioB+]k3(sml0I^&mI'H3
+nF?)?oCMVRo`Fj]p\ssfq>^<hqu-HlrU^#>s+14Bs*t~>
+JcC<$JcGNFo`"jgrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0m-<j"kN:pfj5T%UhVHu@g=Y$-
+eC)akcHXO9?Y4(qK_1#rL%^2rL%L&pKD's+D/434F&RC4It)orrd4isH[:$_rcS<mJc(&uIgLXd
+NfT3\FaS+Tre1-#rIjWlrdt!!re1-%rItH/L5(J>qhYE2M2I2iM>2u.MZA_6NVAJ/O8=t8NrY45
+N<#";NW"n8O8k7>O8k=DOHG\'P5gajQ'Rc(R$sM6S=H.?SXc4>S=Q4BSt2FEU84ZdZb+)obKnT7
+dKS%Fd*9eYrlGVmcICM%hr*JPio8hMg\fh:h;7&Hi8WeWk32'plg4$<mKW(EkN1dbir.mAjPo+S
+gY1?[f_sG#f`0Y(g()lnh;6uDhVdAPioB([j7_L3j8S-=jT+HBjU:/2jlYagjlY^gkN;d*!9X:D
+rosIJ"75FCn,;Y[nFQ;Fp\=R]rK.%?hoN-iR$j>1nA!YgToXegR'W0VIu82B95.+AF\GS[Isl`o
+Inid8<E)mo:lLBnN/ELJLPgnDL4tE[Ll_QapY!KgVOEsDSY2[HSXl7@StDXHSXc7@S!f\2Q'mo$
+OH,9ZMM[+DL@C$!ASu-oBkhF#DJsN8F*)SLH$XgcIXm!%KSG8=MN!OUOHPfmQC+)0S=ZCIUSOcb
+WN*&%YHY==[C3TU]=bkm_8=.0a2lBGbg+P]dF6Uqf@S^0gYL]Ci8N\UjQ5Oekiq?tm-O--n*fc9
+o()DDo`"Lbp@n=\q#C0iqY^6hr;QZdrdk*#s7H>A~>
+JcC<$JcGNFo`"jgrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0m-<j"kN:pfj5T%UhVHu@g=Y$-
+eC)akcHXO#7nZQO:Adr[;>X2c:]4,W;>3ri;)L0/3!;0+6:!m962s1L4p=)34ZtkgrBgNMrB^cc
+:/4GW4%;q?rDMuZs&/VjrD`bps&/_mrD_rYrDEet<)cdo;YF&b<;T\q<!--$<`T&rqGmGl##\;q
+;H$Oor`/tt!*0#!s&K)"r)E_tr`B&#&6W1@>$4s0='&F&<E)mp:f.-h%oZM6@:s=mE,fo<Df9N2
+D>n8kB4Y[gCN+B=H$Xd]H$OUVFE;JDFEVkPG^+L\I!pSEL&Zf1L51M:JUMnDH4,(II=?TkG]n4N
+FE@D$r,_m[rcS6ar-/0ds*"]nH?sj_H?jf8HN&6lI=D*B!.Oot$%[VWJUrE)JUr@MK)L9"K)UEY
+Knb>;Ll%"GLPL\BMMmFRO-#KePE_>uQBd`%R$sS=U8+Q^W2Q\qX/rJ-YHtUE\%'!J]DoJ@\c98?
+]DoMP]tV7s_83q'^q[Xu^&GbF]aqim^q[\#_8*h#^:V"f\[_XJ!4Mm:rOMm<"M;7X]=dpN"Ot)*
+@U&h61g+"_?Ai;r;*[WA;F=2>4YJ<51FtXN0/H0k7S$!;3&WZV4?GYf<**(!<Dujr;c6Ii:f.*g
+s&&fus/uC*rilC,s0D[2r3ZC0rjMg8rODm<!4qg7qRl^=rk/9C!4r$=!5/9Brk8<DrOr6D!58<C
+qn;pA%^Mg_E*usT<`iL.>[1H9r`^7G=^#$5>?k?6=BAR+=&`1"<)H[o:K(.g;=RK_ASu-oBkhF#
+DJsN8F*)SLH$XgcIXm!%KSG8=MN!OUOHPfmQC+)0S=ZCIUSOcbWN*&%YHY==[C3TU]=bkm_8=.0
+a2lBGbg+P]dF6Uqf@S^0gYL]Ci8N\UjQ5Oekiq?tm-O--n*fc9o()DDo`"Lbp@n=\q#C0iqY^6h
+r;QZdrdk*#s7H>A~>
+JcC<$JcGNFp&=pgrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0lg!`ukN:mej5T"ThVHu@g"4j+
+eC)ajcHOIIC34f]VPj'`r2'(^mA9NPqkY'lOIDQ(@&Kp"Wi)biUSaoeU8aiZTV)4c&$)e6XK8J&
+]=l"o^liemV>R7mVl'EhrhTRj$)FDnUSOZ[U8"@\UAq"gU&^ncTELs_U7n7ZU&C\cU]-tlUSO``
+VPg?gW;`auWiN2#rN#t"!3?+#!NiO&YQ(g/YHY79pp0h(rj;[2rj)R.s/uF,qQBn%rNH"#s0!cP
+YHP17Z*L^B['d<M[^WcW]">Vg^VI_(a2lBEb0/#RcHjhadaA'B$e3e^h;IAXmdp5Ordk*#s6K[f
+^Vdq+_Z'Qgl,gcD[`mguaK;M_H@h&_R$q2d>c4KsVlQe#>ZtTG?!CIE]=58V['R-IZ`gI7qm27]%
+IDij_oL!KeBQ.YbKS?4dJqN*cHXSUbK%TIaiM60]">GYZEUS&ZuBPeAnPdlCM[m+E,fo?Fa&(UH
+@1-jJ:`E-L5:\EN/is]P*D5uR$sM8StVmSV5L8lX0&P/Z*UgG\%0)_]t_A"_o9X:ai_fOcHstee
+C<($f\5*8h;7)JiT&t[k2tjkl0@U$m-a?2nF5u=o(2MQp&F^cp\jmeq>^<hqu6NlrUg)?s+14Bs
+*t~>
+JcC<$JcGNFp&=pgrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0lg!`ukN:mej5T"ThVHu@g"4j+
+eC)ajcHOI8?taD$K89)Rr.Xfsqh=Wpp4N6q&oDE(E,nm*I=-NnIX?EiI!g3drc\HeJ:W:KJ-g^a
+NfT3]F(fZJr.P!#qh4p#!/0Wis+L0$rIt?.M#<,0M#W>(MZ/M6N;S\5NWP3#Nr+k;OSk1:OT(=?
+NqeS6N;JV4NWG3&rf7&>rf@#>qi^rB#*bC=R$jA2rgX"YSGo&aS=Q4BSt2CArgb4*Uo18u\%T]!
+aiV]KbKeGZcH=2H`5g*Ke_/d:hr*AGg&BSCe^W$qe'lgsf@eg2gtprIioB+]kNCpcj5f=ak5FBG
+j5JhKf@S[Sf)XD#fDjJ'g&0P(h#6%7hr3SRiSrnWir7j;iS`\oi;V^8irS6&roX7Ds6'IGroj@H
+s60RJkPXQDl2KuJlN?MAnF?MM"nhT`q"t#Is#TAda-W-]R%!X(hRf8EJrH)$`g(t'Tj_AC9lkAK
+:elLhI"$Qq:Jaed;c-=eNfK'VM26tCMMQt?LAQdfrtG=c_lfi+S"-%CTq7jHS"6.CT:Z%Qs-sUe
+R[9;,Q'IMnN/`^OLPLWRLi?m9AnPdlCM[m+E,fo?Fa&(UH@1-jJ:`E-L5:\EN/is]P*D5uR$sM8
+StVmSV5L8lX0&P/Z*UgG\%0)_]t_A"_o9X:ai_fOcHsteeC<($f\5*8h;7)JiT&t[k2tjkl0@U$
+m-a?2nF5u=o(2MQp&F^cp\jmeq>^<hqu6NlrUg)?s+14Bs*t~>
+JcC<$JcGNFp&=pgrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0lg!`ukN:mej5T"ThVHu@g"4j+
+eC)ajcHOI#8P2ZN;,R9go25B]ohYQ`lV[OW.5Wh>3&``_5s[b%5sRUu5!D+l4Zbbf6:!q'5XIb'
+6:"@@:/"GH92/:];X@9Z;YX2j;ufkq;Z0Po<!$'!<:Eid<;KPk;?Tot;c?Te;uKYu;c6On<;KVp
+<rQ(u;ZKeo<W5tq;Zous;H$Nm<<-"t<<-(s<<H9%<EB$!#$G,5=^,'4r)`r#r`B5&<E9#ss&(+A
+<`iX7@qTIhBPD3sD/O3,Bk:gbA8,n$Fa&(SG^":NDf9T6qedNpE,p#DH$Xd^H?sseI=-?cH$asg
+IXQWpJ:;iiG&hYFq/ZLV!-J-]!-eEe$$UW?H$=LYH?sr;Gli;;HN&6mI!pGAIKP(MJV!`Ns+:H-
+KnP,3rdt'#re(N1L51S@MMmDlN;nnBOHPflQ^F6@Ri7ffSXuFGUSXicWN<5)YHP18Z*UgG[^`iX
+])B5E]">Pc]=S!R!5/3@!5/<C'"YWb\@B#U[^NTQ[^WcW]"G\hrO`6D\@8pG[K!T6[JmT7\,!N:
+\[]/[])K8<\gtD2c$Eo6=BJ^/>-<aD?r^/k6q0sr6TR;/0.f%44ZkDS1It#,7R]d+2E(Iq$s-A,
+<Dujr;,^=f9i:jes&&d$rj2U2rO)F0s1&'=rjqp;q7QC6s1A?FrOi$>s18*>r4E$Cqn2g>otLF?%
+(;pfEFE0X='8X/>?q/2s',M.(KssG>$P67=BAU+<`N+!<Dljq:K(.g;=RJ%A7]@cBPM=!DJjE5E
+ccGJG^4U_I=Hd!K8#&9M2R=QO-,TiQ'[l,S"6.EU84W`W2co#Y->1;['mHS]"G_k^r"".`lQ9Eb
+K\>ZdF-Oof%8R.gYCWAi8ESSj5oFckNV6rlg4!+n*fc8nac8Bo`"O`p&Ojcq#C0iqY^6ir;HTdr
+dk*#s7H>A~>
+JcC<$JcGQGo`"gfrqu]ks8)ckrqJ2Ap@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mdj5JqRhVHr?g"4g)
+eC)ajcHOILDg-_tor%edq5*k^m%s9Ks-4@]S"#qBVPpMoVQ-JiVl6MjUS4?SYH@f*'s=[?X/iqJ
+]tV:Aqfe!tW2ZbpW2HNeV>mFmV>d7nUSOZ[UA^kaU&UhhTqJ*Qr1a+a!i;ckrMTOks/?!uq5aCo
+s/l("$F$e@ZEpjAZ*UdBrNlI0s0Ma4!jf2;rNQ7(!NrX*Y5YWtYQ1m+YTC'TZEppF[C3NQ\@K/^
+]=ktp_84(/`Q#s>b0/#RcMl-&cHjhadF6Upe^rR6jQc1(p%S95s+14=s#@^-_Sj=ks763-c`FLm
+jQkBnZd#n#MHcC8RUTKtW26JoW`r_4@UNPK=M)8V\@&]MZaI0FYH>)-Z]+o1le9Fua3;r\cH=;Q
+cI(+id*^.ac-4>Qai)EHahbX%]",2RYd!W(EFWNjAnYmnCMds-EH-&AG'A1WH[U?nJV/W1LP^nI
+NK90aPEhH$R@B_<TV8-VVPgDnXKA\1ZEpsI\@K5a^;%M$`5Td<aihoRcd:(geCE1'g"P3:h;@/L
+ioB+]k3(smlKdg'mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<hqu-HlrU^#>s+14Cs*t~>
+JcC<$JcGQGo`"gfrqu]ks8)ckrqJ2Ap@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mdj5JqRhVHr?g"4g)
+eC)ajcHOI=@qfk/onWO$q1\TsqM"Nonq.3dD/=96FF/FcrI+`ordFfn%=*2CGCb<qJ:W9%It3(J
+NWbDWc"_J$L&Qc(KD:*"KDgH'KDpPpKE$VuL&Qf.LPUcbM>i>2M>)l/Mi<VoMu&G5Nr=qBNfT6]
+O,oBarf@#>qiC`:qi(`;NK&mUrJgi;qiC`<rJq)CO,oBbrK@,Cs-*\PQC+&+RJiQTS"0GJs.07]
+S,Sp,R[]k=S=cRTXKf1C]Y;5%aN;QHaMl'9`lcQSf\,$5g=Xs)e'udibf]q,+NV[Hb0/#RcHt%h
+eCE(!f%A[2hVdDPi8ESPh:pW6f@TiLs4@;(rn7A,rnI\5hr3SSiVha=i8<JMhu;R4i<A6$j5oFc
+roX@Hl0/-2!p]%8qrn+GrosFI%dWKKmI'K7o_%qPq"ajeM#TR&ccMK?R@'E9j1O'6Sq;W[Ximbl
+L9ZkEBh<AfFAYe^IsulsJ5/m8<E)mn:QCNrMi3IKL5LhCL4tE\LlVK_hScXoS=?%>TqS'LSXZ1B
+T:hdJSXc4>R[TV1R?j,$O,f0WM2-k@n;)'oA7]@dBkhF#DJsN7F*)SLG^=^bIXm!%KSG8=MN!OU
+OHPfmQC+)0S=ZCIUSOcbWN*&%YHY==[C3TU]=bkm_8=.0a2lBGbg+P]dF6Uqf@\d1gYL]Ci8N\U
+jQ5OekiqBum-O--n*fc9o()DDo`"Lbp@n=\q#C0iqY^6hr;QZdrdk*#s7QDB~>
+JcC<$JcGQGo`"gfrqu]ks8)ckrqJ2Ap@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mdj5JqRhVHr?g"4g)
+eC)ajcHOI%84u`Tl;@OWo2#6[lVS!H1G^sL3'oqt6:(T9"$\t655m\Y4$5hr5XIb%6:!q):JOYZ
+:Gd5hqGQ]Xr_ibnr_iMir_iYm"&r9$<rQ%u;uKVh;uK\m;uKVo;uK\m;ZKer;uT\p<<#ku;H$Qn
+<W5tr<W?%t;uTc%<)lpt<)lptr)3\q;,^Hn<rH%r<X)Q)=&r@%<W6#&='/X/=^(f-s&]8(rE'/)
+>$4r*<ZtF@;Gp@i<**4,?!q,QC2.O"C1q0h@q9:iDKBuFFEDPBrbicnBkV*kAn>L`AS,UjC27X&
+D/O6.D/O<4Fa/4Zrd"cqH?aUTEcD"tqf;^Xs)e6_!-\?c"*f*:HN&-kH$Xg`rHSBhrd=ZmrdOis
+s+16%rdk-&r.G0)KS+sWK*$XWKDpN*L51TaM@kf,NK9-^P*;/uR@9V8SXuIHrhBFf(8[t/X/rJ.
+Z*L[AZa@0N\[f;^\[]2[qRHX<\c02?\Gs#>\@/mG[f3ZQ['R*EZEpmE[^NZS\[oAa]=bbd\@B#W
+[^EOB[f<i2\Gj&<\GEcu]=?.6BP1IN=Beq7RpCeG=$],B9n6)$4``n@2(:aQ4#8Wa84Q0=7Q<=b
+4?Pbh4',E^<)cdr;,^@ir_WSls%rd)rO;d9"1bqO\biu:])]MA])]M>^%f>@^](qI^&>V?]DfAG
+]=PVd]"5NJ]`5\B^AP\E^AG\A^`U+fN,iE6>ZY$1=^,-7=^#$6>[(B7>Zk98>$4p.<EB&u#?+W$
+:K(.g;=RJ&@q9._BPD3sD/O93EH?5FGBeF\I=?]tK7nu7M2I7OO-#NgQ'Rf*S"-(CTqeE\Vl?\t
+Xfnt7ZaI6O\\#Mg^VRe*`Q-'AbKS8Xd*^=le^rI,g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8B
+oCW%T!quB_rqQNhs8)ZjrVZZnoDX=@JcGECJ,~>
+JcC<$JcGQGo`"gfrqu`ls8)ckrV-EfpAX_:o^hYEnaQ#9md9B-lfmZtk2tdcj5JqRh;-i>f[n^(
+e'ZOfc-'X6EHm22W2T?dqkj+a!2T1^r20@fpS8UjOI;W,@\]p#WMZVlUo1,fUoC#]StW=dX8oF&
+XUM;2]tD(o^5JD.QDgb]WW/prVY[.dVZ3IoUnsmaUB%%fT`Us`U\phcU&h$`r1a:gV>[:kVu*Fl
+W;rssX7r^qXoGR$Y5tl4rNcU2ZEpn:Z2q>=rNld8['[6JZa0P6!3uO,qlTq&o<A.ts0D[2)mm#\
+\%&uZ]">Vh^VIY%_Sa=2`Q$!@ai_fNbPo`dcMl0&cHOPYd*pY)j6#Umn+6;MrVZZl!W;o^rrE&t
+rVukJs-E[E`PB@/_SZ?GrPZptZ,,Acd\*DOU1[hmR[BUL?DOKqWMlh#>[1`H?X6mI]XkS[['[0I
+['Hs=Yl(hdrrMK@rl?5,cd^7_bKSA^e'udjbg+GVb0.uIaj%rG]Xk\bZa6m?p9a_)EFNHiAnPdk
+CM[j*E,fo?Fa&%TH@1-jJ:`E-L5:\EN/is]P*D5uR$sM8StMgRV5L8lX0&P/Z*UgG\%0)_]t_A"
+_o9X:ai_fOcHsteeCE.%f\5*8h;7)JioB(\k2tmll0@U$mI'H3nF?&>o(2MQo`Fj]p\jjeq>U6g
+qu6NlrUg)?s+14Cs*t~>
+JcC<$JcGQGo`"gfrqu`ls8)ckrV-EfpAX_:o^hYEnaQ#9md9B-lfmZtk2tdcj5JqRh;-i>f[n^(
+e'ZOfc-'6rA864;Lkt\YqhFj!!/10%oRudf#&\0rF)k3*rdOlq$\!GOI=$9fGBn@UJbss,IXlp.
+NK9*ZD0p5NKS98Wre(9(qh+s'pOr9nre(N/KS5&4KnY9WL&Qf.LPUccM>N)/M><&+MZA_3N<#"<
+NW5"AO,f6]O8Y.?O8Y1>NrkE(O8b1>N<#"<NW4t6NW"n8O8k=;NrbB)rfR&@#*kL@QC!u,rgEhV
+rL=(_S=H.@S=TYL&Y#2UR@B_>V5^Q!Z*_$R^r4+h^]hQla32fUrmUnq+OSQ^cHXPS`l?!8_83q%
+^qde(`5T^6_oKj@bK\A[daS3F!7UqspsfJtf@S[Sf`9e*g^W)rhVdAOio/kUi8EMLrSRV4s5=:D
+j5f=`k2tjjkl0fIlKS94!9sCGrp0UNrp:'\n*oo?pA"IZqu)<M!qOdVrKoF0Rd%f?R%Bb!OJBsj
+It!N);bLhIF*(&NIslcqIt19i:KCFn:f*15NJi^PLPUeDLkg_?r.pC5$K/n-Un+!FT:hmMrgj(]
+"/)?[T)P8iS=5n5QC+#(PE1``Mhq@fn;)'nA7]@cBPD6uD/O<4EccGJGBnL^I=Hd!K8#&9M2R=Q
+O-,TiQ'[l,S"6.DU84W`W2co#Y->1;['mHS]"G_k^r"".`lQ9EbK\>ZdF-Opf%8R.gYCWAi8EVT
+j5oFckiq?slg4$,n*fc9nac8Bo`"Lbp@n=[p]1-hqY^6ir;HTdrdk*#s7QDB~>
+JcC<$JcGQGo`"gfrqu`ls8)ckrV-EfpAX_:o^hYEnaQ#9md9B-lfmZtk2tdcj5JqRh;-i>f[n^(
+e'ZOfc-&RF852iV;Gus\!)iYjqbZr]qbZf[(,[p,3&ii`5sdh%5sde$5<h:n4ZtkhrB^]S6:*t)
+5u7JS"AUpG:f.!ds%rboqG@5jq,./iqbd>jqG[Dls&0)#;cH^r<rQ)"<)``npJV&kq,@8j!)r\m
+rDW_qs&8qq!)r_nrDihr#usr(;c?Xo;cH]n<<#ns;ufqr;ZT`nr_rhsr`0#!r`9"urDiu"<)iit
+!EWD$=TVc0=Su;)>$G-5>5hY==BAO&;,9q^:fUS!=^,3@A7fOgAH$$f@qKImE,ff7E,TW3D/F$%
+B4b^b@:3JM?=%#J@:EYQ@:3PUB4u!oCi+(hDuXeVDZXlrE;OVTErL.ZF9$L_GQ2mkGBeCZH?oF7
+s*4Qh!.+Tj"+5HDJ,XutJH16"Jc:95KnP,3K7nl1K7ei1KnY8:L]3/1MB@b8NfT6_Ocu&rQ^F20
+S"H@HU7n<UUSarfWN*##Y-.c-"0o/<[/RB4['Tb=!4DO-rj2X3!4Dg5rO)O0s0hp9s0r'>rji-@
+])B,?\%&pH\GWo;])T;@\GNi8])K;H]Xteg`IV`2r`LXR=]hA3Hqm[@5XS(m8O>F'1Fjh.5<V(]
+1J12.7n,m)3&Wi[4?G],r`'5';cH^p;c-CfrDNYm!5&3@r4E!Ao=b.;otUO@rk/BG]tOEXq7H[<
+rk&*>r4DU7qnE'Es1nZLqnW3Is2#S\R?;T#?<gQ7=BSj5>?P-6>[(?8>$G,.>5q_-=&rF&r`/qr
+"Ai#p;,Qj[EFNHiAnPdkCM[j*E,fo?Fa&%TH@1-jJ:`E-L5:\EN/is]P*D5uR$sM8StMgRV5L8l
+X0&P/Z*UgG\%0)_]t_A"_o9X:ai_fOcHsteeCE.%f\5*8h;7)JioB(\k2tmll0@U$mI'H3nF?&>
+o(2MQo`Fj]p\jjeq>U6gqu6NlrUg)?s+14Cs*t~>
+JcC<$JcGQGo`"jgrqu]ks8)ckrqQNf!;?Eb.eN?'o'u5<n*]T0m-<j"kN:pfj5T%Uhqd)Bg=Y$-
+eC2glcHXOHBm"`[q5F+enttoQpSRY\.@#p`R[@H\W2?SoVl-DhW2QMiTUqaIYHG"0Y-"h/XhDB\
+^;%IVG(c[gW;WXnVZ*FjV?!OlVZ3LmV#7"dUAptgUAgkdUAUecU]@7iVZ3RiVuWgqWrK-rXT,@#
+X8oC%Y5PO*Z*L\4ZN.B3Zi.92[K!W5[K!Q<Z*:I;Z*:F8r3$%&ricC-ricC-qlp+*r3@9J['d<M
+\%&uZ]=bkl^V@V$_Sa:0`Q#p<a2lC$b5]X)bg"ATbfIoLcICP%gtq#OlL"!,n*oo?p%J1Wr:0gd
+rW)opr;Z]rr;M9IS,YLo^VRk+_Z0Z'f='85`RjA-WjC*?J6S%@S"3bkUo(&gVlO'->?YEC?!CIG
+]=>>VZa-sGZE^U:ZMh+grt4VPai_]LcdU4`bg"Yee^W$orm(Pe&';u4`m2`H]t:qf[Bm*AZhLj'
+[<?%jAS,UhC27X'DfKc<FEVkQH@('hJ:W?+L51VCN/`m[P*;/sR$jG6StD^OUo(&hWiW>+Yd1UC
+[^`l[]Y;.s_SjF6aND]McHjnce'uq"f\,!6h;7&IiSrnYjlYail0@U$m-X60n*ol<o(2MGp%A%P
+p\jmeq>^<hqu6NlrUg)?s+14Cs*t~>
+JcC<$JcGQGo`"jgrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0m-<j"kN:pfj5T%Uhqd)Bg=Y$-
+eC2glcHXO9?Y=1tL&-W$L[p2nL$"$rDea?5E`7C8I"-Wprd=ltI!L)<Fp)r=Jq8LNJ-_0pO,f6]
+H"_6rK_pK#K`$Q!K_g>uK`$Q(L&m!]rIt6*!f)Sfqhb<.s,$`4repf6qMPB5NW+n5N<#":O84n;
+OT^c,OH>OtNrP%<NW+t<NVnh8O8b7:O8b7@OoCOCPQ-mHQ2d-QQ^F//S,/WUS"0GJ!h>aJrKnRm
+StMgQUo(/pZ*CXD\@T;b^:qD"`lQ<FbK@uNrlPJfaN)<<_8!b`^AkkL]Xteh^])"[_8=+/a2lBE
+b0A8ZdF-LneG[ntf)=26f\5'6gYCWAhV[8Mi8ESQi8EMLrnm_5ro*k9#3=n.k3(pkrosCHs6BjT
+lg*p'm/H8Qlg4$,mJcM[nF?,Dp\=U^r;MKO48%+>S!KD.R[Wg,[&8n]JsMnAVM0`-F(.XS:3:SN
+:k*tCI=?ZA:Jaec;c-@eO,o6XM27"FMMHt@L&?agrtXeui5MjqSXZ1BTV8!KSt2OITq\3Orgj(Y
+&"8lPQC*r$OH#6YM2-h?L[^+C@q9._BP;-rCi402EH?5FGBeF\I=?]tK7nu7M2I7OO-#NgQ'Rf*
+S"-(BTqeE\Vl?\tXfnt7ZaI6O\\#Mg^VRe*`Q-'BbKS8XdF$Fme^rI,g>(N@hr*JQj5f=akNM0q
+lg4!*mdKW6nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#s7QDB~>
+JcC<$JcGQGo`"jgrqu]ks8)ckrqQNf!;?Eb.eN?'o'u5<n*]T0m-<j"kN:pfj5T%Uhqd)Bg=Y$-
+eC2glcHXO#7nQNMr_i2^pJUlcr)!8dpJCQ\$oKh"3&if`5s[b%5XGB6)*U2H4?P\f6:!n&6:*t(
+6;L?N:/4SM8kr7U;Z9Pk;XmWa;ZB\q;ZBT&;H$Ln<)Z^p<)lpt;uKVe;uT\n;u]hs;u]hd;u9Pj
+<<-"t<W?"t;ZBYq<;oer;Y<rj;H$Onr_rr!<`T*!s&B"ur`0)#<)rou!*B,%!E`M(=o_e)>5qh,
+=r:IK>?Y34<`W-s;,U@o=&r@(>$k`H?t!LB@ME?aAnYppCM[d$Chma!C27Nq@UW^E@N&`b?XR2F
+>?kKC@:3MP@Us(_B4kmmCi+'.E;a_TE!pZ,EcH,@F`heJG'<k/!-nKgs*4Ng"*f*8GQ)jdH2i3j
+Hj"nJIt3(JJc(/uK`-NUKS>,8LPUeCM27"GN/`jYOH>TePEhE!Q^=24St;RITqS3TUSO]\USXic
+WMuosWs5Q'WMur"Y5PO5Y-5"3YHY77YHY47Yd+/5qm?@1)n*/^[^W]R\%&rY]",A_]",>]\@B#W
+\@B)[])K>>\biu<]E#YA]HG=LCL1+E=]nj/YEW*d9j'_P8RkRb3c-Z,,W%):4"rGh8HVIP6oY*'
+"Znh.4?Q^E<"Do,;c6Oi;,C+e;Gp@h]Y+*Sp:g=:rkSNJs1SQJ^:sT[rk&6CrOi'?qRZR9!5.s;
+s1\-?rP/ELqSN9M#dSrDF^eW]=BPQ,&6rFB>?b?:>?kB:>ZtB7='>N($<C/-<`E$s;,^@imne1;
+A7]@dBPM=!DJsN7F*)SLG^=^bIXm!%KSG8=MN!OUOHPfmQC+)0S=Z@HUSOcbWN*&%YHY==[C3TU
+]=bkm_8=.0a2lEHbg+P^dF6Uqf@\d1gtgiEi8N\UjQ5OekiqBum-O--n*fc9o()DEo_%nNp@nO\
+s7u]kr;6KkrVcBfJcC<$p&BO~>
+JcC<$JcGQGp&=pgrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0lg!`ukN:mej5T"ThVHu@g"=p,
+eC)ajcHXOLCj(5fVt-ecVsUAUV=US^V$NBPS"#pWVQ$KmW!fN#Vkp;hV5C#\T<J0os/l=&#edsb
+^qYrjGDlHu"/r2tW;3@hVZ*LjVZ*FjV#6tfUA^bcUAUblUnsobV5C,fVZ*LnW;ijrVuWgqWrK-s
+XSo1"XT#@%Y5YU*Yd+25s0MF+rj;p:[C!?KZi%*.YPt^)XT5O'YPYR%Z2UsEZ*L[?Z*L[A['[6K
+\%&rY]">Vg^;%Fu_>_:V_o0L4`l?'>r5el\s2kqpa2cBKd*gCnf\GBAhVR2MjSe9TlKn!0o_8.T
+q"X[]r;?Qos8Dlnr;c`oqZ$EnrVhBJSGtUs]thM%_uKc+oXF(d_:.T#]rfDIBSDCQQ^V,f?)OTt
+VQ6\">[(ZG?X6gL]=GGZ['R-JZa$[8ZM_%grsS8Kc-FDUd*^1acHuR@(t@!\dEg+_bfe2L`mMrM
+^Uh+h[Bd'AZF0J7qR(-K@qB7bBPD6uD/O<4EccGJGBnL^I=Hd!K8#&9M2R=QO-,TiQ'[l,S"6.E
+U84W`W2co#Y->1;['mHS]"G_k^r"".`lQ9FbK\>ZdF-Opf%8U/gYCWAi8EVTj5oFckiq?slg4$,
+n*fc9rpg*]o`"Lbp@n=\q#C0hqY^6ir;HTdrdk*#s7ZJC~>
+JcC<$JcGQGp&=pgrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0lg!`ukN:mej5T"ThVHu@g"=p,
+eC)ajcHXO<?tXA'L@pB"L[BiqL$+*iDf,Jp$<)A&IXHQmI!gBjrd+osH$FL`J:N3%rdb#urf./C
+Nbbn8G5[*^L%^2uKDU>uL&Zi+Ka!3bL5(J=reUE-"GhnkMMh(b!fW+urf$i9r/U]9q2kT<s,d8A
+s,R)>rJpf8pl><6r/go=s,R#=rfR5Drfd>G!1!PLs-EbSRf8fRSGeu[S=?#IRLY^RS=H.AStMmV
+VPg>kXo5F-Y-5.>\@]KS^^7ck_8F1/`5BF+rP&<F!5&3@s1JrW^V@S$_o9X9aN;WMcd:);dKA"L
+f%0iPs4@>)rn@k;hVR/JiSi_RiS`\QrSRS4s5F=Eio9"ZjQ>UfrosIJs6K[L!pf4?rp0XPrp'UO
+mJZG[n*oo>p%J1VqY^>Hs#SlMT9be0R@3a/]>fr@K9Ve7U6'elE`6F]:NUYO;,;[kI"$Qq:f'nf
+<)QOhOH5BZMi*:GMMR%DL&6[ersIc*YGIe]StMdLTDkG]T`Us]T`1JoS=>q8R$F/,P`Ul`N/NIG
+LPPATCgpmcAnPdkCM[j*E,fo?Fa&%TH@1-jJ:`E-L5:\EN/is]P*D5uR$sM8StVmSV5L8lX0&P/
+Z*UgG\%0)_]t_A"_o9X:aihlPcHsteeCE.%g"P39h;7)JioB(\k2tmll0@U$mI'H3nF?MK!V>s_
+o`Fj]p\ssfq>U6gqu6NlrUg)?s+14Ds*t~>
+JcC<$JcGQGp&=pgrqu]ks8)ckrqQNf!;?Eb.eN?'o'u5<n*]T0lg!`ukN:mej5T"ThVHu@g"=p,
+eC)ajcHXO#8P)ZQoMPK`s&&5_rDEJh!)N2_r)!eZ1cIBR2a]r!5sbK8!'gEG#!G.54$c.tr]prZ
+5XIe5:/+JY1L<aNrDEVomo&@H!)ibor_ru"<)cfp;ZB\q<;TVm;?Tot<)Z`n<:Nod<<#ns<:s5k
+<;ohr;ZB\n;YO)i<;ff$<)lt!<)lrt<;ol'<`N+!<E<+"<rQ5#=8uD'>5_\*>5qh,=TM`3r`]V2
+=]ea+<)lut=;4nC?!UW;>?tQB?!LT=>[C`GA7fHQAKtf"Bkh?pARo:^AS,Oa@:3MO?t*ST@UW\U
+AS,OcAnYmoCi0/hs(r'[Df9T6EH-#>F8g7^Fa!b.rd"Kf!I&edGPuahGBe@YHN&6nI=Hcurdt$"
+rIk*$&;5akL51P?LPL\AM2I7ONfX1&$^6g?QBmo*R[]e;Sc52eT:V[ITqS3VV54*fs.fgnUnjib
+W;WarWs>`,X/rD)XKDK)"g>28Z*LY6ZMh*0[/RE2[/[Q6[f<i:\,a);\Gs&;\Gs,9])]GA]DfDA
+]DoPC]`>eG]IU\1O`4]1=BS^->-aT(Bh`/)7n?WP6odUg.kEP05<LST2+L2.77B[+2E(Iq#usr)
+<)cdq;H$Ej;?'Pn;>\*#^])%J^\bbE^%o>=])]G;]CW]3^AYhF^AYhH^A#GA_>M.X_nMk1G@Xr_
+=]Sa3r`^7C>?Y98>?kB:>ZtB9=]e^,=BAL%<E)gp;uTYp;=ICu@Uit]B4u!pCi+'/EH6/DGB\=Y
+I!pKpJqJc3Ll%%KNfT<cPa.T&R[]k>Tq\?ZVl6VrXfen5Za@0M\[oGe^VI_(`Q$!@bKJ/Ud*^:k
+e^i@*g=tE=hVd>Oj5]7`k32'olKdg(mdKW6nc&([oCW%T!quB_rqQNhrqcQirqu`no_sFAJcGHD
+J,~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrqJ2Ap@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mej5T"ShVHr?g"4g*
+eC)ajcHKa9Ed3/,nYl,Yn>?,[n"pqfOd_l0@\os#XJ_qoVP^8iVlQPdTV/EhrN-"$$*:nS^;.D]
+R=(G$VuN^gVuNXoVZNfpVu!:hV#[=hU]7%iTq\:[U]R<eV#@1eVZ<[oW<&rsri5suqQ0[s!3H1%
+s/u@)!3lF-s0MO.s0Ma4"1>MC[JdK4Zi@91Yl:j+Xob`.Y5YX(YQ1m+Yl(a-Yd(J4Z3%;:Zi7?2
+[K!ZA\%9/_]Y2%o^qfob!Q)bR`;ddW`lJ&!s2k;^rl5>db08)Sd*^=mec+#9eCE1'g"P3:hr<_Y
+kN;!nmI0Q7oC_hNp\=R`q>g<ip&Ojbp]:6iJcDDC,M9`G_SO(gs82)t^TFidjm:Tu]V]UuNa\<C
+Rq,g%WhcVpWr?39@UWVL=hVJ[\$`QM[C3HJZ)t7;rNhL`"n:0ieB6)9clUN[dFQjueBu^kcHjbZ
+bKS&Gd*9YJ]Y(haZa$a@[eR6+[<H(iA7]@dBPM=!DJsK6F*)SLG^=^bIXm!%KSG8=MN!OUOHPfm
+QC+)0S=ZCIUSOcbWN*&%YHY==[C3TU]=bkm_8=.0a2lEHbg+P^dF6Urf@\d1gtgiEi8N\UjQ>Uf
+kiqBum-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$pA]X~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrqJ2Ap@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mej5T"ShVHr?g"4g*
+eC)ajcHKC!@qfq4re^9'onW*ms+T`k%<-*(F`LE.I"$TpI"$JAI0G(EH$FO`rdbQ0It3*$IufPM
+O,WORDLVS=!/1<)rJ(-%r.Y3*p4NEuqh4]trIt<-qhY$(!/g`5!fW%qrepi8repi:rJ^`8r/UT6
+qiCf?rf@2BNfO(!r/U`8qi:];!06r;"H\\*OHBI&r/go?s-!AFrKR>Jrg3YPs-`kTs-j"Yrga+^
+SXfYJ!1`qU$CmZYT:qjKTq\6SrLsdtVl?`"YHP4:['mHR\[qaO!5/<C"M2+P\@DOKs0iBG]>;G)
+a2lEJcHjl8dJVDne(+BJ!87A,!SuZ3i;_a:i8OUlro*k9$KL.+j5f=`k3(pkrosCHrp0UO!q,ID
+rpBXOs6g9ao(2PIp\F[`rIk24hSZ+SQC+&-p#aZ,Q^*/UR'=r:H\clK?trJ[EcY/TIt2utIt19i
+:/t7k;,<:7Nf&aPLkpqFLkg\=r.pF6%HPO6V4OHRT:qmMStDYST`Us]T`1M^S.D'XR?j;-Q'.2f
+N/NOILPPATG@G&mAS,UhC27X'DfB];FEVkQH@('hJ:W?+L51VCN/`m[P*;/sR$jG6StMdPUo(&h
+WiW>+Yd1UC[^`l[]Y;.s_SjF6aND]McHjnce'ut#f\,!6h;7&IiSrnYk2tjjl0@U$m-X60n*ol<
+o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+14Ds*t~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrqJ/@p@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mej5T"ShVHr?g"4g*
+eC)ajcHJ^H8P;bK;;kFO;$'Qk;=RHe2Dd?P2`F)%5lj5:r]^]S5<V.n4Zbtr6iK@[6:!t*:JFPY
+:SL9S:$PX@;>sJm;u]hp;uBMn;uK\p;uBPn<;fbp<;KPn<;BJl<<#ns<;9Gt<*!%"<)cfq;ZB\o
+;YO)i<;T]!<E)pt<r5ks<r>tt;up!"r)`f!!*]A)"'\r3>5he*>6S25=BAR+rE9,'!*fD('3A:;
+=&i7%='/U/>[(K??smDRAH$'TA7]=aB4bX^@:EYR?sm>J?X[JXBPD0rrb_dSDJoGjs).jRrbhaS
+s)A$ZrGqs\rc\<c#Bk65G'.tNFoHR`GQ2moH$XgaI!g?kIXh?Irdb'"rdk*%!/:E*!eZ/Zre1E.
+LPGe`s+qnWNK0*^OckomPa.Q$R$a;1R[]e:S",t<S=Q7CTV8*TU]$qeU&UhoUo(&fW2HPlW2clr
+WrT7!XoGR'Y6(r3YPtg*ZMq01[/RK4[edK5\,a)<\cBA?]E#YE]`,PB]_]>A^';9gQucS:=oMMH
+>-ac@=&Dd[5Y"S+<&m,s/M/h35<_.d1It&.7n#m-3&^[s%ouY1<E)ms<)Z[k;,0td;Z9Pl^\YbE
+^Au"H^](tH^&PbD^&5MC]C*?.^&#J>^Au(G^]2+J^\bhH_>V4P_ns:h_[=2cR<E(I>?G'6>lIqJ
+>$G3:>$G69>[(?9>$>$0=]\[*<E<*u<E)gm;H!!\G@G&mAS,UhC27X'DfB];FEVkQH@('hJ:W?+
+L51VCN/`m[P*;/sR$jG6StMdPUo(&hWiW>+Yd1UC[^`l[]Y;.s_SjF6aND]McHjnce'ut#f\,!6
+h;7&IiSrnYk2tjjl0@U$m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+14Ds*t~>
+JcC<$JcGTHo`"jgrqu]ks8)ckrV-EfpAX_8o^hYEnaQ#9md9B-lfmZtk2tdcj5JqRh;-i>g"4g)
+e'ZOgcHKs>Ed<P?nYkfPihdW\Od_f.U8OreWi2hmVl-AgUT1#\T:i<hXfhZ)s/l[C]Y)"p^7KM#
+U].1kW;!1iW;ELkW;NRlVZ*FlV#7"fV#R:gV#R7kVY[4jWW/psWVrjsX8f:$XTGT+Xo>F#Xo5C(
+YHY;1ZN%9-ZiIH3Z3RbE[C!?K['fk>!j])8rNH7(s0)@)riZ=+qQ]t(!jf8@qm?R8\%0&\rjr6E
+^;'W^rkeTN"3&:#a8X0X`rX9'rlR">b0/&UcHOMWbg+P\dF6Uqe^i:%f%Jg6i8`q_lKdj,nFH8G
+p%%VBnaQ)>o(;SIq##^CU&P;V]>2>$_Z'Qimb>8@Z+f;diM<a'M1gdkR$jIL?_jQqWMlh">[(ZG
+?<pdI]t:h`['I'H['Hs?YHn,5NW1Bsf[AEqd*L(ccdC:oe^W*rc-Xe_c-4ATai)HKai(j(\[SrO
+Yd(Y3[/[Q3[W5ec@qB4aBPD6tD/O<4EccGIGBnL^I=Hd!K8#&9M2R=QO-,TiQ'[l,S"6.EU84W`
+W2co#Y->1;['mKT]=bkm^r"".`lQ9Fbg"G[dF-Opf%8U/gYL]Ci8EVTjQ5Oekiq?tm-O--n*fc9
+o()DDo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s7ZJC~>
+JcC<$JcGTHo`"jgrqu]ks8)ckrV-EfpAX_8o^hYEnaQ#9md9B-lfmZtk2tdcj5JqRh;-i>g"4g)
+e'ZOgcHKHuAnlIBnqd@&m"bFlqM"El&o_W,F)lVTI=-NnI=6QmH[L*crHA?pK7\aRJ-h9rNK9-[
+H"h;Pre:E.p4`R&qhG')s+^N,oS!3trJ(?-r.Y3,qhP60q2#*/rep`6s,Hu9rJgf8!0-i8qN(N8
+s,m>Cs,R)>s,co6!frA%n;d[5OcY\'OoLUEPPgXHQ'Ra7Qi<BNRK8nJrgj%Ys-s"Xr0n:gR[Te=
+SXc4@S"-%>SXl@FTDbDiTqeKaX/rG,Z*^t;[fEl9Zi[S@[JmN<[CEi`_8=47rlkGgrm1Jg!7Lhp
+#h7DVf\,$6h;8.hro!n;iVh^6iW%p;irJ*<irnK+k3(q,kl9lKlKdd8mJZJPn,D_Un*^2Es7$?c
+o_/%SqYU2Cs"36MVj<[9R%!a5gpO/E`e9DNbIMtSX(c$X8Tf)s92L+fIXcfs:/=Vb<)QRirf@);
+reUf:M2-k?L&?afrtOS:Z)+(hStMaKTUqdLU7n9TTUVPPSIq?[R[KG0Q^!YoNf8mQLPCS>nVD3o
+@Uit\B4u!pCMds.EH6/DG'A4XI!pKpJqJc3Ll%%KNfT<cPa.T&R[]k>Tq\?ZVl6VrXfen5Za@0N
+\\#Mg^VI_(`Q$!@bKS5Vd*^:ke^i@*g=tH>hr*GPj5f=akNM0plg4!*mdKW6nac8BoCW%T!quB_
+rqQNhs8)Zjrqu`no_sFAJcGHDJ,~>
+JcC<$JcGTHo`"jgrqu]ks8)ckrV-EfpAX_8o^hYEnaQ#9md9B-lfmZtk2tdcj5JqRh;-i>g"4g)
+e'ZOgcHJaJ8PMoWoMPE^qbcTUqbd&`#<"Cu3&a/j5lO%c5X@Y"4[2(l4Ztkg5s[h(5XIb&6;L?N
+r_<P\8kr7_;?0Yh;?0Yl;Z0Jl;XdQ`;ZB\o;uooqr_r_mr`&eorDNVn!)i_n!*&bms&Akor`&kq
+!*&\ms&8turDWbpp/:rjqbmJpqH!Vrr`0)%=BGE$"B8B$<)ifrr`8u"rE9&%qcj#&"'J`/>5h\)
+=:&,7=]ng-<E<1&rDrks-WF,J=B\s8?=.)K@q0%]An>CY@:<ML?XR2H?X[JWBP;0uDJa3,D>n>P
+D/T>i$ZBp"D/O92EH,r;F8g7]Fo6CbF`qnMrc\<crce]oH@(!dI=6QnrdP<+It3*#JUrE)K7npW
+K`Hf(L&Zo-L]<21M@#6$Nf]BdP*;,qrg3YQrL3_T".G^LSc,,gT:hpQTq\9VUnjiaVu<RnWW&pt
+WrfB'X8K(!XU))3Xfek2Yd(J4ZN%62[/.3-[Ks@P\@K2_]=PWQ]`5YG]Y43Tq7ZgBs1]elOEG#9
+=BSg0=gOoT=^+X:5Y"J"?9(5_0eYC65!;"_1J17<7i4ZS3&Wl\3]fH(<E<+!;cH[o;G^4e;,C0i
+;#nH3_"kbD^@o86]_9&;^A#>@^AG\@_"b\C_#D.O_SO(d_YV.X`5T!GG@Xu`=BSm6r`^CH>?bE;
+>?k?6>?Y69>#n[*<`W4"=&i0u;Gg=h;XdM'@:E_XAS5[jCMRd)E,fo?F`qtSH@1-jJ:`E-L5:\E
+N/is]P*D5uR$sM8StVmSV5L8lX0&P/Z*UgG\@K5a^;%J#_o9X:aihoQcHsteeCE.%g"P3:h;@/K
+ioB+]k3(sml0I^&mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<hqu6NlrUg)?s+14Ds*t~>
+JcC<$JcGTHp&=pgrqu]ks8)ckrqQNf!;?Eb.eN?'o'u5<n*]T0m-<j"kN:pfj5T%Uhqd)Bg=Y$.
+eC2glcHXOHCNt2al_s*HqPO.fpSRtV&Xo8XA#?3&WiE"rWMQSnV5U<kT`M?ur2p"%%'74V]>24@
+fQW1NW2KQlrMTXn!2odos/5[ks/5^jrh]Uir2'4b!Mu[kVu3IoWN,lsriH.%!3Z4$riZ:)s/lF,
+Z*XD7!42R0!42X0!OK0-[/dQ4Z3%;8Yl1d&YlCm0Yd(I=Zhq$3Za-pE['oh="Lu"Q]"IsQ#/%[b
+^qde&rke]O#fFU"`lH0Aa2e/"rlG>dbKS/RbPoZaaXYHVbKS5UcHXSVc-Ob_d+$_%gtq#MjlYjo
+m-X-(l0.C!mdTc;o_/+Yrdk*ErrVH"_>_=Ns"a0(^$;`@g?mUhUqF3OOcGitSQfN-VPgAjWa&b4
+@pr_N>ZnhR\[JoPZF73JZ*(47Zi7=ks![?he_&*md*^4ddam%$e^W!ldEg+`bfn>S`lcTL`P&mq
+\[8ZIZ*^n6[JI=P@:E_WAS,UhC27X'DfB];FEVkQH@('hJ:W?+L51VCN/`m[P*;/sR$jG6StMdP
+Uo(&hWiW>+Yd1UD\%0)_]t_=u_SjF6aND]McHjnde'ut#f\5'7h;7&IiT&tZk2tjkl0@U$m-X60
+n*ol<o(2MQp&F^cp\jjeq>U6gqu6NlrUg)?s+14Es*t~>
+JcC<$JcGTHp&=pgrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0m-<j"kN:pfj5T%Uhqd)Bg=Y$.
+eC2glcHXO:?YF;"L@L-"M!0WdL%g6;Df'Q;EDq:7IXclsIsl]nIX?NjGBnIcJc13#JIR-ZO,]0\
+O(Y>*GDCs.r.k6*reCK.rJ1E-s+^T1r.b9,rIt-%rIt9+!/LN-r.bB/LPL`bM#)u-MZ8V5N;AM6
+N;S\8Muo!!O8Y+;O7nY=O-#E_NfX1$qN(K5pl>H;O8b4CO-#HarfR5BrK7,Crf[GKQ'@O3PlR-L
+QiEHOR0&hHS,AfVS,AfUS,SrXSc>2_S!oe8S,JiWSc,'*S!oe9TV8-VVPpMsY->19ZEUL7Xfen5
+ZEppF[^j#`^;.Y*a2lF%bQ#cdcMc&ud*^7he'ut$g"Y<<hVeCls5Nq7ro3k9!p&J)roa:Es60gT
+m-O-+mHsB2rUBjUrp]sXs763]$2!obq"agarVleNrr_rX`iK**249p-mbtj\Pe)I5T#IXXIYs@h
+Che*6FA,S-Isl`oJ58p8<E)pq:f!15N/W[PLl.(GLPU]_Ll_QbjNFg)TV\9RTqA!MT;&-UTq\3L
+T:MRFS"#k6Q^=)*P)bQ^Mhm+CL5GGVEa`EeA7]@dBPM=!DJsK6F*)SLG^=^bIXm!%KSG8=MN!OU
+OHPfmQC+)0S=ZCIUSOcbWN*&%YHY==[^WfY]Y2(p_8=.0a2lEHbg+P^daQ^sf@\g2gtgiEi8N_V
+jQ>Ufl07L!m-O--n*fc9o()DErq6<b!;HHe!;ZWjr;6KkrVcBfJcC<$p]#a~>
+JcC<$JcGTHp&=pgrqu]ks8)ckrqQNf!;?Eb.eN?'o'u5<n*]T0m-<j"kN:pfj5T%Uhqd)Bg=Y$.
+eC2glcHXO$7ncTNo25<]nko6]!)rMfqbd;g%lQ4&3&`c`6:*t(5X7Ou5lO"I4Tml55sds<646(G
+6;L?N:/<TF92>F`rDWYmr_ieprDW_o!E2nq;>jDb;?'Pm;?'Po;u9Gm;uKVn;ZK_p;ZTirr_i\n
+r_iVlrD`eqr`&hprD`bp"B8B$<`],ur`&hrr)<Vpr)<SorDN\qr`0&$<rQ/,<``@'<``@)=B>E$
+s&92&<)cju<E8uurE0)&r`]>)s'#G*"Bo#6>$Cf-s&f>*rEK;*!*K2$!*K5%!*9"t*)op==BJ^/
+>?kE>?X[AP@UNMI>?tTD@:3JO@q>RM!G6'EBE2cGCB&&QCi+'-D/K8is)/0^EH-#?FEDYJrcS?c
+G'3e-rce?drd"Khrd=`os*jut!.auu!.t3&s+CB+re;eSL5(J=LkpnEMi<UTNfT9aPE_>tQ^=,.
+R$jA2R[]e:S"-%@StDVRT`:bdU^<lpVl-JlWMunsri6"!!ii<%riH.#s/c4&$*UM7YHG(5Yd(J3
+Z2q>=rj;^5s0hm8!4Mm9#.V4T]=Y_iqRlsC]tO9T!58?Fs1SHF/[U@Y@9Zo;=]nk6W/t@f:LQLZ
+8T[]o4$#k]2DRK[4"rEG7nH6@6oR%_4?GY(498G\r`&nr!E)kq;#sKkrDEI,r4`-C!5A->o"Ob0
+rkA<Fp;$UBrkSBHoYL[I_Sc;i$H907G[t)a='Js8qcaqE>?b?9='Jj5?!:<1='/O)<`N1"<)ZUk
+;X[G&@:E_WAS,UhC27X'DfB];FEVkQH@('hJ:W?+L51VCN/`m[P*;/sR$jG6StMdPUo(&hWiW>+
+Yd1UD\%0)_]t_=u_SjF6aND]McHjnde'ut#f\5'7h;7&IiT&tZk2tjkl0@U$m-X60n*ol<o(2MQ
+p&F^cp\jjeq>U6gqu6NlrUg)?s+14Es*t~>
+JcC<$JcGWIo`"gfrqu]ks8)ckrqJ2Ap@e1Po^qbGo'u5<n*]T0lg!`ukN:mej5T"ThVHu@g"=p,
+eC)akcHXOMDKp\tlDWgBs/,Ogr2'piP+7u1@\fp#WMlbqW;`^pW!'#mT;&IbX:)/3Y.VH\]taT6
+I@0H$rhodp!3,mp!2odmrho^lrh]Xlrh]Fds/#amr29Om!NE*sX8f:$Xo5F%XoGO/YHG(3Y-5+9
+rNcO1Zhq*6Za-sFZa@+9[JdH4Zi%-.Z2Us-Z2Lp+Z2_-)Zi@E0[JmW6\HBFT]Y"-R&%oTi]t_@u
+_84")_o'F3a8*gTao0E[aoBKhbKS2TbK@uNbl,^)c-Xnge^iC,h;7&JioB%YjlbppmdK]:p%J1W
+r.4mDs"`lQ_8O4._Z0Z+kfMtf`RO)4]<fqWFC:5<S=Een?)FQsW2ln$>[(ZG?!LOI]Xt\\[/RH:
+['Hs>Yd=>9NW1BqgXk*%d*g:fdFHk$f%&9tcdC(ac-=P\bJqQKb/h<.]t(MUZ*C\2[J@7U@:E_X
+AS5[jCMRd)DfKf>F`qtSH@1-jJ:`E-L5:\EN/is]P*D5uR$sM8T:r!TV5L8lX0&P/Z*UjH\@K5a
+^;%M$_o9X:aihoRcHstfeCE1&g"P3:h;@/LioB+]k3(sml0I^&mI'H3nF?)?oCMVIp%J+Rp\ssf
+q>^<hqu6NlrUg)?s+14Es*t~>
+JcC<$JcGWIo`"gfrqu]ks8)ckrqJ2Ap@e1Po^qbGo'u5<n*]T0lg!`ukN:mej5T"ThVHu@g"=p,
+eC)akcHXO=@;9b/n;7.#kD/tionE<s(N=/3Ecb6,I=6QnI"-ToI=6KjH?aXZK)L60J:W6#J;oPL
+NK3"DDLV#/s+^N.rJ:K/!/C-"s+^N.s+pN,s+pW1reUK/regZ4s,?W1s,6r;rK$r<qiCN6rf@)>
+rf@)@q2YZ?O,o<]rf@&?!0@)?s,d>FOoCIAOoLOBOoLUBP5pjDPlm>=QC%Q;"dtaHR[]f8SGo)W
+SG\rWS0XSmR@9V8StD[LU8=cdWN*#"Wi<#"YHY:;Za@*J\%&u[]t_G`_["0$aND`MbKTt2%+!;J
+e'ut#f\5-:hr+Fk"QSM$iSjdqs5X+>roF@Iki_0nl0834s6TdQrpKgTqsaXUs763]s7?Qhp\=U]
+qu$GGrrqZ/XI#<ArgGY4jhnHq[=ad6\\!lTYBF&BCJK"o9N"W7IslcqJ5B';<Dudl:m-m"Mi*CJ
+Ll.%GLP1E\Ll_QMjNOj)U84HUU7\*NTqeKZTq\3NTDkD]RgtsVQ^*u*P`^rbN/<:EL[U%D@:E_X
+AS5[jCMRd)DfKf>F`qtSH@1-jJ:`E-L5:\EN/is]P*D5uR$sM8T:r!TV5L8lX0&P/Z*UjH\@K5a
+^;%M$_o9X:aihoRcHstfeCE1&g"P3:h;@/LioB+]k3(sml0I^&mI'H3nF?)?oCMVIp%J+Rp\ssf
+q>^<hqu6NlrUg)?s+14Es*t~>
+JcC<$JcGWIo`"gfrqu]ks8)ckrqJ2Ap@e1Po^qbGo'u5<n*]T0lg!`ukN:mej5T"ThVHu@g"=p,
+eC)akcHXO%8PDlUo259\lr!d\r)*,br)!bY1cI?R2aTeq5lO(J56=#255m\D5mKbD6:!n(6;IMS
+##:XV:/"M^rDN8dq,.;n;GpBj;#aAm;Ys>j;ZBVf;Z0Pj;?Bcr;uT\o;u]_s;,U<k;uBVp;Z]ou
+<W,ks;uTbq;u]hl<<H3!;cWcqr_ir!<E2srr`&nt$WL&'<)cju=&rC(=Su8#<W#nt<;ont<rZ,"
+<EB#t"B\f0=BPK(!*K/&r*';,>$>-6qcNo&r`f;(s'#Y1=]ed/=oDD%=T)D&>5qe->[@>8"^G58
+?=74?@K9s;A,^$=AcH9CAS,RhrG)FMD>e>PDuO\VEH;&#!d/[0rcJEgGBS.RG^'.3rd"Ni!df<B
+rd>3(I=?WpJ:N3%JqAW-re1<*reD8DLPL\@LkpqGN/`gWNfT9aOcu#oQC%Q9$^[6KR@9S6S"-%@
+T)P>dTV8*TUSXgbVuN\1WMlbqX/r>#WiE,"WiN2%Xf\e1Yd")0!3lI-rj2U2!4Dd6"h1qL\%&pG
+\,a);]DoMD]DfJC]`GdZqn2sBrk/9CrjjVdY'OS`>$,!3>$@ts@p;r=5tOUJ?U["i1Fab..m?'K
+1GVKl7Rfg93Arho4:YCk<`W0u<Dugn:f1%d;#X>i^[&W3^\tnF^%K,7^\P_1_YM+I`;@L\\"7kW
+?<^Q;>[:V4>7Y%E>?k?6>?Y9:=]ea,=]kW&s&9,$:f:1gmne7;@Uit\B4u!pCMds-EH6/DG'A4X
+I!pKpJqJc3Ll%%KNfT<cPa.T&R[]k?Tq\?ZVl6VrXfen5ZaI6O\\#Mg^VRe)`Q$!@bKS8Wd*^=l
+e^rF+g=tH>hr*JQj5f=akNM0plg4!*mdKW6nac8BoCV_Kp@e7TrqQNhs8)Zjrqu`no_sFAJcGKE
+J,~>
+JcC<$JcGWIo`"gfrqu`lrqZWjrV-Tkp@e1Po^i(Q-LpTon*TK.lg!`ukN:mdj5JqRhVHr?g"4g*
+eC)ajcHKg<F*NA3lDWL9q5+1UOoCjTUo(,iX/MuqV?a)tWM6/\TW\6q%BQ_8XM;H]^;%FPFFp@[
+VuWgqW;idjW;WUjVtm1jVl'Ehs/,dls/,^lrhp($WiE,$X/rE%XT5O&YPkX%Y5tl4qQg1/rO)R1
+qmHF3!k#DBrO)[4$+$qCZa6sCZ*L\6Zi@?2ZN@PAZi7<3[JmQ3[/m_GrO;g;rjr-As1/KJ]">Se
+]tM.qrkSiT_8=(-`Q#sraSs<]aofi0bKB_(s2tAbs31Gb!6kDb*R)dRd*U1ge'uq!f\,$:i8a"c
+lg=-/nac>Hq>1#?s/#`Wn\;u[_Sa7js7l$/k,l2>k3UHlae3C#NaJ6D=CYX6WMQPnW`r_3@q&_L
+>/7ha\@8iO[C3KLZ*1@:rj7[b%.`0)g!%jld*L+if@g/R(t-dYd*Bn\dF-4X`mMrM^Uq.i[^<?E
+['oe<q6k<O@U`kZAnYjmCM[m,E,fr@Fa&(VH[U?nJV/W1LP^nINK90aPEhH$R@B_<TV8-VVPgDn
+XKA\2Za@0M\[oGe^VI_(`5Td<b0/&TcdC1ieCN7(g=k?<hV[8Mj5]7`k3)!nlKdg'mdKW6naZ2@
+oCW%T!quB_rqQNhrqcQirqu`no_sFAJcGNFJ,~>
+JcC<$JcGWIo`"gfrqu`lrqZWjrV-Tkp@e1Po^i(Q-LpTon*TK.lg!`ukN:mdj5JqRhVHr?g"4g*
+eC)ajcHKF"A8?4;n;7$ul%f+io7[utCijcAI!^<kIsulqI=-HlI!g-`G^"f>K)U</J:EW?N/s!Y
+GA2&LnqR4$rJ(B-reLB,!/LQ.!JQ:,K`m-aKnb?]L\ll-L\uu-M>`8-M#`G2MuSb7NW"n7N<#"<
+O8P%<NrY:>O8k=@Onk(<OT(CAOT1C>OT1C?O9Ui/OckliOo:FIOcY]eOHG\'P5CFCPl?pQQBd`"
+Q'R`&rKmVPR/WKTR[]fCS,f&USGA`NT)Y>ZS,]#YSIM3bU8"EYV5L8jX0&P.rilR3['dCB\-fgZ
+]=bei^r476ao9EobKS5Wd*^:je(*+)gtpoGi;V[>io/nUiSrkrj8S*EjlY^gkih9qrTaCJ#OLjH
+n*of8nG_qjnF?&>o(2JFp%A(Rq>'pbrVc_Jrrqo7YEtWCrgGY4jO:c8[=aL-Xj*JaQ#p&7Bhibl
+92\Q8J:2osJ58s9<E)jn:m-m"MN!FKM2R4HLP:H\Ll_QNl-6N2V5']VU7e0OU8+TZTq\3OT:Z%P
+&"];ZQ^=/,Q'%)cN/NOIL[U%>?t*SUAS,UhC27X'DfB];FEMePH@('hJ:W?+L51VCN/`m[P*;/s
+R$jG6StMdPUo(&hWiW>+Z*UgG\%0)_]t_A"_o0O7aND]NcHjnde'ut#f\5'7h;7&IiT&t[k2tjk
+l0@U$m-a?2nF?&>o(2MQo`Fj]p\ssfq>U6gqu6NlrUg)?s+14Fs*t~>
+JcC<$JcGWIo`"gfrqu`lrqZWjrV-Tkp@e1Po^i(Q-h6]pn*TK.lg!`ukN:mdj5JqRhVHr?g"4g*
+eC)ajcHJ^I8PW#X;uBP=;>*lr2)I9P3C?,!5sdk&5lEnT5!;"l4$,bp6UO1+r^-W\##.ie:-M?H
+qGI2hpf%)gqbmJmr_W\m;>a>j;=[Wa;u]_q;>a>j;ZK_n;Zfop;,[Blr)EYos&K(us&Jtrs&/tu
+<E/lrr`&bnrDiks!``2urD`\pr_rr!<`]&u!`i<$r)W_qs&T,!s&T/"s&K/%<r,o!=]kZ+"'So5
+>5hb+=TM]1qH<]"r*98+!*oM/s&fA(=Sl5&>$+o*=V=qD>?tTE@q/tW@q0%\ARo:]A,]p?@q91b
+C&McHC]8/XDJsK4DfB]:F)uI&FoHRaG62r3GQ)jdGli;=IK"WoIJnWpIfP#uJH1<$KE$W)L&Zo*
+LD#E"Ll%"IN/WaUNfK0^OcbilQ2[$JPl[2;rg3bTR[X5F%\0)]T:_dMU8+N[V50rbrM:+'Vl$Dk
+WiE%tW2ZbpWiE,$XSf:%Yl:p,Z2h61[/[Q4[f!W6\H'/=])K>A]`5\F]`5VB]`#GE]",A_rj`!>
+/\A[2[";gp=]ed/=B_hqF'hpS5t"7=M+]in0InY1/3Q*L1GVNn7Rom92`N_n4T8@b<)ljp<)W]m
+!`2`ir_`=&q7usDrk8BIlb<D6!5SQLrPJ6Fr5/6Hn\k7B+L[bgB4"kI?!CT>>$G07>@(K;>Zt97
+>$G36=BAU+=B>E$#?4W%;Gg=i;=ID&?t*SUAS,UhC27X'DfB];FEMePH@('hJ:W?+L51VCN/`m[
+P*;/sR$jG6StMdPUo(&hWiW>+Z*UgG\%0)_]t_A"_o0O7aND]NcHjnde'ut#f\5'7h;7&IiT&t[
+k2tjkl0@U$m-a?2nF?&>o(2MQo`Fj]p\ssfq>U6gqu6NlrUg)?s+14Fs*t~>
+JcC<$JcGWIo`"jgrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0m-Ep#kiV$gj5]+Vhqd,Cg=Y$.
+eC2glcd'aJD0:/_WN"gSjJVpQ'q(PaR:W4nW2H\qW2cenW2QVlUnXO\XU_M8XKJ_,^V%1k^m3,d
+M=RVBWV`XgVuEV#Vl6MkVPg>jW;NOsVPg>jVPX9hqkjInWW&prXT#=(Y-5%5q6'q*YHY7:rj;[2
+s0Md6rO)d8[']b=!OfE5[f!N>['d9JZa7'H[C,t?"LYVC[']S8rO)^8rODs=\c028]DoMF]tV;[
+_>h@U_o0O5a2e2#s2k8_!6b2[s2kGcb0%s-c2Pp(c-4DVbg"GYd*^7fd*^7kg"bKDjQ5Xlm/HD[
+nFH2Dp\=R\qu$ACs/Q)'p;4Ya_o'@js"sB(k,l)9jmV0'['Ft/NFA6ERq,j&Whu_mW`iY2@q&bM
+>$8VQ]!f#S['mEMZEUI:Za@*!s![Hof%\Nsda6@ge_&U,e^`*qdEg+adFcmkaMlNKaMYX%]!o#O
+Yd:e6[J@7U?t!MSAS#LfBkqL$DJsN8FEMbNH$XjdIt3-'KnbD?Mi<[WOckroQ^F52StD^NUnsuf
+WiN8)Yd1UC[^`l[]Y;.s_SjF5aN;WLcHaeae'uq"f@em4h;-uHiSrnYjlYail0@U$m-X60n*ol<
+o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+14Fs*t~>
+JcC<$JcGWIo`"jgrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0m-Ep#kiV$gj5]+Vhqd,Cg=Y$.
+eC2glcd'a;?ta;!Ko5DWqhXHknqR'r$?1'0E`IO;I=6ZrrdG*"I=6HhH?XT3K)L9#J-_3qNfB*:
+Rqd-;L\lo+L]<2(L\Z](L]<20M>rD3M>rD1M>W2-M#rQmMu8P6N<,'!rf7#>rf.2BNfK0^OH9@#
+plGH:!0R8BqiC`<rfQo9!g/S+rfR&?s,dAGOcfX)!KiQBP6[>9PE_;tQBhH8rfmPNQ^@Q9s-WkU
+rgWqXqj[STrgWnWs.'.[rgj"Zs.9RgSXuCBS=Q7Crh07_18:VCW2co#Y-5(6Z*CU@['d9J[^WcW
+\\#Vn`5fp>aNDZLbg"GZd*gFof%Jd3h;7&Iqr.M6!9F.@s5s=Ds6'RLlK[^7m/QJPmf)\Tn.bE^
+naZ2@oCMVHp%A(Sq>0scrVc_Is!%?`Z^I2JS!of9jP7_V[=X@*WQ_huLP0&DC/8toFAbqbJ,Xm)
+J5/p8<E2po:f*76reh#=Ll%"FLkg``Ll_QGmE`)9UnaTUU7e0OU84[cU'%'\T:PtO%A98\R?sA.
+Q'%)fN/NMjL[g1F?t!MSAS#LfBkqL$DJsN8FEMbNH$XjdIt3-'KnbD?Mi<[WOckroQ^F52StD^N
+UnsufWiN8)Yd1UC[^`l[]Y;.s_SjF5aN;WLcHaeae'uq"f@em4h;-uHiSrnYjlYail0@U$m-X60
+n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+14Fs*t~>
+JcC<$JcGWIo`"jgrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0m-Ep#kiV$gj5]+Vhqd,Cg=Y$.
+eC2glcd'a&84uZP;,mNns&-p8r)*_V3&iiV6UUc;"@#.95=#01'0JTK5sn"+5smt):JOVY:,G[<
+:\IZa;Z9Sr<)Z`n;?0Yi;Z9Vn;?Tip;H$Nj;ZB\o;ZB\q;Z9Pn;Yj;m;H*Qms%rborDWYor_ier
+r`/u!!*/kp"'&8u<;ons<;TSs<E)pt<V]Vn<<-(t;up!"r)Wkuqc3\uqc3l#<``=&=8Gr"='/O*
+r`Jnt#?kA9=]np2=T2G*>$G-4r`]>+"C,/9>[.24s'>Y/#$G&1=]np4r`fq9=BAR,>?kKB?XR>P
+@:B.Es'lUN@q/tV@:E\UAS5XhBPD3srG2RRDf0IlDuXeZEcZ;DrcS3ar-83es*FcpIf4]pIfFm!
+J:W:NJc^LTK)LB&K`[!aM#N20M#W;<Mi<USNK0$[O-'@'s,mSMP`q>rQBqK:rg<hVS"'DI#b@QZ
+T:qsQUSI[]s.ogpV5C-eVuEV!WN*##XfSW'XTku5Z*L^B[/IB4[f3c7\-BLT]=PSa\c')>]DfJ?
+])]GA]DoPD]D]AB^&,N!]n^6,=BA^1=BM\mKP"Co6UOC:KNgH$1bUI=/Nu<[2)@fr7n6$:3&WZW
+4?GYf4&o;[<<#l';H$Fj;,C+d;,R#%!5\WLrkJ6Bp:pUBpVHdEqnr3I!6+KHpr3$JrPoJ]Sq(N\
+>ZtB8>[(B:>?Y6;r`oD*s'#\2=]ed-=B>E$"B8B$;c*Hkn5+@;@:E_XAS5[jCMRd)DfKf>F`qtS
+H@1-jJ:`E-L5:\EN/is]P*D5uR$sM9T:r!TV5L8lX0&P/ZEpsI\@K5a^;%M$`5Ta;aihoRcHstf
+eCE1&g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`no_sFAJcGNF
+J,~>
+JcC<$JcGZJo`"gfrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0lg!a!kN:mej5T%UhVHu@g=Y$-
+eC2glcHXOIDKpSjWi=XLkbeHGR/WU$A>?*'XJr2"Vl6YpWMcVgUnOuoXfnn0Y-5"1]tCtm^Lcqa
+QL:^LWW&jnVZE`oqPXCnq5=OtW2Z_nW2QWnV?!OmW;ib$W2ZesX0&M,Xo5F&Y5kg+YPt^)YPta,
+Z*XG:s0Ma4#.:nK[^WcUqmHI4!4Vs;!4Vs9qm?F4rjDI.rj<$?[C*KQ[^NTOrjN*A\[f;_]=S!R
+s1J3?"h_O]]t_A]_>V7M_Z[s!a2l@$aT]i1bK@rKprWufbg+MYbfe5Tbg"E3c4\INe'ujqeCN:,
+hr3VWkN_C"mJcM\n+#u?p%J.Tq>:,As/Z/(qT-Rm_Sa:jrtY7phQ4*)j6u96VSBQkMd)U<S6K<r
+rhg^6Wi90+>@LuG>ZnhT]=55W[C3KMZa$[;ZF$uus![Hre_AKte'HCgf%Aa.e^`-rdEg+ae(W3n
+aMlNJahtd(]=>2QZ*C\3[J@7K?XR>PA7]@dBPM=!DJsK6F*)PKG^=^bIXm!%KSG8=MN!OUOHPfm
+QC+)0SXuLJUSOcbWN*&&Yd(OA[^WfY]Y2(q_Sa@4a2lEHc-FY_daZdtf@\g3gtgiFi8WeWjlY^h
+l07L!m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6Hjrr)HfJcC<$q>Ys~>
+JcC<$JcGZJo`"gfrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0lg!a!kN:mej5T%UhVHu@g=Y$-
+eC2glcHXO:@;'J%Ll1_ZqhXHkmY:a[-ZsNR<-s(CJ:;orIXZfqIX?BeH$=jkJq8H'J:W6%NfB$Z
+N`*H*I-udcM#2r.Lkktcre:H/M#<&-M"-?%M#<,0Mu8P6NW5%=N<#":O8b1>O8b7@O8k77O8+h:
+O7A>/Ont4BOckk+Oopi.OcfO)pltcCs-<YMrKd;IrgEeTr0m\VrgNnXpm_5PrLO"]rgj+^r13t_
+TqMCY#,7ojW2co"ric@+rNZC.rj*oX[C3TW]t_A#_o9[;ai_fNc-FY]d*gIrf\5*8hV[5KiS`\S
+ir8$<jo=KCkPj]Fl2U#Qlg3s(m-X3>mf)\RnGi(ZoDeI_p&Fajq"ad_r;HVGrriAJ[[`Z_RPgT*
+jPA(pXFc+jVT[&7Iu]t+C.WPhFA,M\IslcqJ:C?i:/t7k:f*=:Nf8gPLl%"GM2-b=reQX8.Ibci
+Vk^&[TV8$PT;/3[Tq\9TT:_[DS=Q@DR[BG1QBdSlO,]'QL51QRLi-R-@U`kZAnYjmCM[m,E,fr@
+Fa&(VH[U?nJV/W1LP^nINK90aPEhH$R@Bb=TV8-VVPgDnXKJe4Za@0M\[oGe^VI_(`Q#s>b0/&T
+cdC1jeCN7(g=tE=hVd>Oj5]7`k32'olKdg(mdKW6nc&([oCW%T!quB_rqQNhs8)ZjrVZZnoDX=@
+JcGQGJ,~>
+JcC<$JcGZJo`"gfrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0lg!a!kN:mej5T%UhVHu@g=Y$-
+eC2glcHXO$84lTO;,mHlr_gd6!Au_43"ePD5sdh%5sIS!5<h:n4Ztnp6N'7\6:4(,:/4JX:+KUF
+:f?m^s&/hpoMP]g;Ya5k;Ya5m;H$Km;ts8j;#jMj;uBPn;>jDj;Zp&u;cH`n<<lK'<)lms<E9#s
+q,I,fs&8tuqc*Moqc*Sqr`0,$<)lrt<rQ/#<rQ/#<r?#!<rQ+u<WcE*<`f3$q,mf'>?Y2/=T;M/
+>$5'5=]np3qca)+>Q%h+>6%k(>7"P??!LT;>?tQBra>Y4r*o\9raPk:s'u=FAnPaiC2<fbqec@N
+rbr9cEcZ>FFa&(UGBeCYrd+Tk!doHGrdFfqs*t'!rIOs"!/(9('SD'mKnb>;LPUbCM2R:NNK0!Y
+O,s:&rf[;Fs-3PKs-E\O"dk^GR$jB@S,]#YSc>>^TEh0bUSFW\V5=*c!Mu[kVuEXpWW/suX8]1)
+Xfeh1YHY;2ZN%94[C6(Dqmc[:r4;m>s1JBFq7QU<!5ABGr4iHGO_A*(r`LOL=g"*HD.Ha75Y4V"
+HUBkZ>V7l`5<_.^1.k,084Q*<3&`cY48q>C=&o6!!)ieps&'%u:Jjnb;8Ve<pV?@9rkeEIs2=fR
+p;HaFpr<*LrQ+rX"j"EMK5+]k>6nA:>?Y99>[(P6>QA"->5qe2=B\d.<`iE"<<H/q;Gus[DI6d\
+@Us%^BP;-rCi401EH?5EGBeF\I=?]tK7nu7M2I7OO-#NgQ'Rf*S"6.DTqeE\Vl?\tY->1;['mHS
+]"G_k^r"".`lH0CbK\>YdF-Oof%8R.gYCWAi8EVTj5oFckiq?slg4$,n*fc9rpg*]o`"Lbp@n=\
+q#C0iqY^6hr;QZdrdk*#s7u\F~>
+JcC<$JcGZJo`"gfrqu]ks7u`krV//Bp@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mej5T"ThVHu@g"=p,
+eC)ajcHXOMDg6f&WN#3^q5Nh]n#%(hOe%u3MPd>KWiN+uVl?VjUoC;cTs(W#YHRr.$a$SF^V%=q
+^]1!WV"gkgWVNLhWW/pnVtm:bWW0!rW;`^pW;`drWrB%#XKAW&Y55@$Y5b[-Yd(I=qQpI7[^WcU
+\%)FHqmQL6rOE$>[^EOA[f<f:[f3`;\[]0H[fEl9\,Nl>\$`WPrjN!>\[oBL]DfMH]tCthrk&NM
+^;%J"^qde&rke]Q!Pu_R`W*p]a2lBFbKK\'r6$2+c-=JUc-=JWcHjh`daQasf%/L-gYLfIj6#Ri
+lL"!<mL/LQnac;Dp%A%Sr;D3HXT&M%beh<9`5_fV2#-S!X0T@pl0?[(d[4]TNgQ6*>[^m8W2HSp
+Wa&e4@UWMH>/7e`\@8lR\$i`OZELI;['Yhm.J;`Pg=4Hud*L.jg"Y-/e^Djnd*Bthg<e$``Qu]K
+`4`gq\$WHFZa@1;[J@7P?XR;O@qB4aBPD6tD/O93EccGIGBnL^I=Hd!K8#&9M2R=QO-,TiQ'[l,
+S=Z@HU84W`W2cr$YHY==[C3TU]=bkm_8=.0a2lBGbg+P^dF6Uqf@\d1gtgiEi8N\UjQ>UfkiqBu
+m-O--n*fc9o()DErq6<b!;HHes7u]kr;6KkrVcBfJcC<$q>Ys~>
+JcC<$JcGZJo`"gfrqu]ks7u`krV//Bp@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mej5T"ThVHu@g"=p,
+eC)ajcHXO=@VTk3MMgq\o8)jjmtM3gCNOW>CjUVYIXuqHIKk4IH@1*bGQ*-nKDg?/J:W`ANKB-Z
+ep_UlpkJj*q1na$qM5'+r.k''s,$c5on`a-M2D1gs,6f6s,@#=rf$o<plGH:!KW?>NrY:?O7n\7
+On+V1OoLREPQ$^IPEM)kqNC`>pQYZB!LB#LQN*<MR/36LS,]#MS,\uYSberUTDtSaTaRTiUnsre
+WN*#$Y-7i/rNZ@-.'p:g[C3TV]Y2(q_8O:3a2uKHbK\;Wcd1"ee_&R.g>1WChr*JPj5^."roO1B
+s6'FGrokZmlg3s(m-X3.mI'E2n*oi:nac;Do_%nNp@n@Xq>1!crVleIru0CsSXGt:R[`j/i7,NC
+K7f2X_T\p4Y]E`:CAr;i9MnQ7IsulsJ5/m8<Dudl;3Hs"N/R[m"cJ4oLk^W_Ll_QAo$jtFUSXZV
+U&L]+U8=c^Tq\3PTUq[DT:qaCR$X8.Q'.2fNJiXKL5:]VLiZp2@:E_XAS5[jCMRd)DfKf>F`qtS
+H@1-jJ:`E-L5:\EN/is]P*D5uR$sP:T:r!TV5L8lXKA\1ZEpsI\@K5a^;%M$`5Td<aihoRcdC.h
+eCE1'g"P6;hV[8MioB+^k3(smlKdg'mI'H3nF?)?oCW%Ts7QHerV6Egs8)Zjrqu`no_sFAJcGQG
+J,~>
+JcC<$JcGZJo`"gfrqu]ks7u`krV//Bp@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mej5T"ThVHu@g"=p,
+eC)ajcHXO%8PDlU<)i`ns&-m7%lH1'3&s/h5sRb%5X@V"5Q3hK4ZkkorBgcT6UO1-:J^sa##'hC
+:/FhdqG@5jq,-rc!)rkps&&eomSj-bs&8_kr)<Vqr)<Mks&&_mr)<Pnq,RDpr`/MgqGRAnr`',$
+;c?Xp<V]Vn<<?3&=8Z(s<r?##<``B%=9DW*<E9$!#?Or-=BJX+=Sc2#>5qb(=9D]0>?gu.q-3i'
+r*0#&$=-tD?!^lG?XI2KrF#_9@JjU6A,TpAARo=_AnV*V!buLerG;XSD/F1iDuXbbEH6,BF`r"R
+GBe@XH2`*oH[L6iI!pG@J,b&tJcC?%K*$^YK`6])LB!&/L_Yf(Mi3OQNfT9aOcu#nPa%GtQ'I]'
+rg*kWQ^F,,R$jB@RK/iUSHPOVTVA1ZUB%+gUB@?iVl0Ejs/H!ts/Q7'Xf\c*YQ(g.ZEpn:[/[Q5
+[K*f8\,a,=]DoPC^&G_G^\keG^&>\E^\GVD_?7T>Cgm<G,Zn2PXdFlf@95`Z6V2!J<BFqN.OQu8
+4Zb>S1J(,.7n#m-3&gdu"Zodb<)Zcp;[6/t;Gg:f;,Qi"!5nHGpquO<pVlpIo>gdMp<!9S$c/Kh
+CgC4K=^#$7>5h_G>[CZ>>Zt<8>?kB7='/R*=B8I&<`W1";c$@h;XdM(?XR;O@qB4aBPD6tD/O93
+EccGIGBnL^I=Hd!K8#&9M2R=QO-,TiQ'[l,S=Z@HU84W`W2cr$YHY==[C3TU]=bkm_8=.0a2lBG
+bg+P^dF6Uqf@\d1gtgiEi8N\UjQ>UfkiqBum-O--n*fc9o()DErq6<b!;HHes7u]kr;6KkrVcBf
+JcC<$q>Ys~>
+JcC<$JcGZJp&=pgrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg=b*/
+eC;pocd'aFE,p2VU[tJ`W:-_PW:m,;QCXP7AYZ3'W2lqsVP^;kW2ZbnU8+oqY-+t2Z*(:5^V.:q
+^:o\QM"dkFWW/poW<&rsr2BRlq5F1i!36$ts/Psq%B-8+WN)u!WiN2%X/rH&Y5b^*Y5>F%Y5b^*
+YlCs0ZEpn:[/RK4[K*f9\Gs,>\Gs#@[^WfX\Gj#A]",>[\,E`C\%&rW\@K2]\@8rWrjVd7"1bnL
+[f3`>\@K/]]"@mQ!586Cs1JNK^VI\b_#M7M_Z%F[`5T[6`lH-@aN)@#aoBN`aoBN`ao'=)bg"AU
+c-4GWcd0tde'uq!f@\g4hVdDRjQ5UilKdg)mf)\So)J:ap%J4YrIP!Mrs&>I_8F41aSu2frTrXI
+Ye8`Vm,=b_TP[np?_!Wj@9oe1W2Q_s=^5-?@U<>E_7dIl\,Nc@\$iZLYcb:<[#P(rpZ0r^f[/-o
+d*gM!gXt',rmDS/cI(>!cH4,GccXAK]tCtf[C!6E['oh=ppP6N?t*SUAS,UhC27X'DfB];FEMeP
+H@('hJ:W?+L51VCN/`m[P*;/sR$sM8StMdPUo(&iX0&P/Z*UgG\%0)_]t_A"_o9X:aihlPcHste
+eCE.%g"P39h;@/KioB+]k3(sml0I^&mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<hqu6NlrUg)?s+14G
+s*t~>
+JcC<$JcGZJp&=pgrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg=b*/
+eC;pocd'a;@:O(nKDpc!M=68lLB*/-L\?H3DKU&B<IB7DIt3&tI!u!Cs*OlpG^91;%"j._JWGhO
+O,]-AB6Es(qhY9-oS<U)Lkgc`M#W8,L]N?greUW4oniX)",i%pMuJ\8NW4t;N<#"<NUMr)OT1FG
+OHGWeOT(@DOHGY(OnOn3OoLUBPQ-gDOT:R@PPp^GPPg[DQ2HsJQNrhCQ^F/.R@=,C!1NnVs.'+Y
+!1a"Ws-itW!1a%XrgX7bSt2FDSXl@Drh'4`%ABMkUnsugWiE,$Xfel,Yl1j+Z4jRO['d?N\@K8c
+^;.S%`5Ta:aNFM*(X1.Ld*^=mf%A^2gtgiFiSieUj5f:_jo4BEkN:skrosIK!:9[Os6^`mmdKW6
+nac8Bo_%nNp%J(Pp\=R\qY^<kJc@n5g:*`CR[]e:o&noa]sEBEO.XA<^3Z#c=@d4&F`gAU:4IeC
+IXclD:ejth;c-DTOH,<YMi*CMMMR(DK`6dhrt>8%e[2BQV50cXTV%pPV5C#^UAgf"St)=FTphC:
+Q^X8+P)t]`N/NOIL[U%??XR>PA7]@dBPM=!DJsK6F*)PKG^=^bIXm!%KSG8=MN!OUOHPfmQC+,1
+SXuLJUSOcbWiN8)Yd(OA[^WfY]Y2(q_Sa@4aN;WKc-F\`daZguf@em4gtglGi8WeXjlYail07O#
+m-X60n*ol<o(2JFrq-?dp\4[^s7u]kr;6KkrVcBfJcC<$q>Ys~>
+JcC<$JcGZJp&=pgrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg=b*/
+eC;pocd'a&77^-L;Ya8g;X73X;"mia;YErt2)mQU3($"u5X7V$5X.O55Q*bC6NBIO6O6F_9MA/S
+5"eZL;Ys>g;ZBVh;ZB\q;Z0Gm;YsDl;Z0Mo<;f_q<;fbp;ZBYu;H$Ln;uT_t<E)rq;u]bq;uKVl
+;u0Jj<W?)#<E/lr"B8B#<E/rt"]SE!<)cfq;Z9Vo<V'2h<<lQ+=BAO(<E9#ts&K"u"'8T+=8c5$
+=8c2"=8l>$=8uD&=oVY*=oDP&=T2J">4u2#=p%u4>$Lo0r*9>1@/aU6?iXX2@KL%MAH$'>A7baN
+!+l.Bs(DCHrG)OQDJX-+rbhaS$#jm)EcZ;EG'A00GlDshH@,X=.Xc\mIt2utIt3'#JV&H)JqJZ-
+K7nr5KnbA<LkphBM2@+JNK&s[OckolrKR;HpQl,PR@0M4S"#rISc>8_T:hkVU&C_aUC3oqVPgAk
+WMuntWN,rus/Z7'Y5PO,Yd(O@[/RHB['R*G['dBQ\@K2_]Y+6WrP&?HrP/3E!l;[fpqd!Irkg7u
+S8_k==]ed/=g+6II:-2D5t":XNGLU>0J"J*/3Z0M1GVNn7Rfg73&`hp4:kRo;cH^p;cH[o:f:.e
+;,C-g`;@OM`:Ch7`;[aO`pCbAaS*aPb5TKgb/K[%D-pLP>5hb6>$G07>[CW=>Zt>1>7t+A=]\[,
+=B8I&<`N*t<)QRl;=@>&?XR>PA7]@dBPM=!DJsK6F*)PKG^=^bIXm!%KSG8=MN!OUOHPfmQC+,1
+SXuLJUSOcbWiN8)Yd(OA[^WfY]Y2(q_Sa@4aN;WKc-F\`daZguf@em4gtglGi8WeXjlYail07O#
+m-X60n*ol<o(2JFrq-?dp\4[^s7u]kr;6KkrVcBfJcC<$q>Ys~>
+JcC<$JcG]Ko`"gfrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0m-<j"kN:pfj5T%Uhqd)Bg=Y$.
+eC2glcd'aIDg6VeX8]-iWV`^fWTU5XVZrNXSsj,bW;NV7W2Z_qW2lqqTqANmYHY46Y-5"C]tD"k
+^l7i0Nq]LOWW&ptWW0!nWV!.fWV*:kWVWXpWs5Z-XKAV.Y5,7$YkYC0Yd(I=Za@*I[^NZSrjMg9
+!kGnRr4)g;qmla<s1/0>rjN3D\[f5[\[o>]\G`o:\Gj#@\@K/[r3m*E\[oAa]=bhj]Y(qlrkJEG
+s1\WN^VKfa#/\3o`5KR2rPSlY`lH->`r='ZaoBE_aiaV)r6#Gkc-4DVbg"G\da\9H&_>Rdg"Y??
+i8N_Wk3;-qlKdm;mfDqJrpg9cp%S:Yr;M9IXoAV&e\]>Ga2n8[2>d4;mB"L^kNpfq_k_[6NFJ?G
+Rq#d%W2HVoX'Jq4@pr_M>ZneS]=>>Z[C3NOZE^U;ZF%!!s![a+f&#*-eBuXkfA#'4f%&7!da6=j
+gXscla2QEIai(p+]XkPYZE^e4[J71O?XR;O@qB4aBPD6tD/O93EccGIGBnL^I=Hd!K8#&9M2R=Q
+O-,TiQ'[o.S=Z@HU84W`WN*&%YHY==[C3TU]=bkm_8=.0a2lEHbg+P^dF6Urf@\g2gtgiEi8N_V
+jQ>Ufl07L!m-O0/n*ol;o()DErq-?dp\4[^s7uZjr;6KkrVcBfJcC<$qYu'~>
+JcC<$JcG]Ko`"gfrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0m-<j"kN:pfj5T%Uhqd)Bg=Y$.
+eC2glcd'a;?tjA!L&QtrM=cVrL]<2(L\ulTDf^#@;ga%BIsufpIXcfrI=6KhGB\UhJqJZ+JV&H6
+NfB'YO(lXNGP?m]L]E;2M#W>)M"uo+MZ/G4MYr>1MZ/M8N/`elN<#"<N<#";O8k7>O8k7<O8Y1>
+OoCO<OoCIAOnk+6OoCLDPQ$gFP5^UBP5^[CPlHpLPa.N"rK[DK!13\Ns-EkSQ^=),rgEeR!1EhT
+s-s%Ws.&nS!h>aLrL=4cSt2IFSt;RIT:l1W%AKVmV5C2kWiN2&Y-5&.Yl:mkZE^[?ZEpsH[^W`V
+]"Gbl^qmq,`Q$!@b0%oNbg"GZd*gIqf@\g3gYLfGiSrkWjQ,Fak2tjjkiq?slKmm7m1/ROmdKW7
+o(2GDoCV\Jp&=Rgp%J.Tq>:'err)lrL&V82\>#AiRk1*"l/L:B_7tSiS%I+OH&[#V@qne^F*(>V
+It)osIt1<i:K:@m;Gg8POH,;!M?\opM26q@LAm!krt>8)e@2HQVkg&\TqA$RV59u^U]-r$St2IJ
+TUM:9Q^X8,P*(c`NJ`RJL[U%??XR;O@qB4aBPD6tD/O93EccGIGBnL^I=Hd!K8#&9M2R=QO-,Ti
+Q'[o.S=Z@HU84W`WN*&%YHY==[C3TU]=bkm_8=.0a2lEHbg+P^dF6Urf@\g2gtgiEi8N_VjQ>Uf
+l07L!m-O0/n*ol;o()DErq-?dp\4[^s7uZjr;6KkrVcBfJcC<$qYu'~>
+JcC<$JcG]Ko`"gfrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0m-<j"kN:pfj5T%Uhqd)Bg=Y$.
+eC2glcd'a'7nQKM;>sM\;Y3iZ;#X>c;Z'Aq1H.9Q2a[L0s$-cS5X@Y#5<o*0q*PKU:JFSX9MRB_
+9MbUbqbd/es&8bls&/nqqbd>j!)rkpr_`\or)EJj!*&nq"B&2u;cEWopJ_&hs&/nqrDWVns&B>*
+<E<.#<`N*up/V,l"]J;u<)QWl;Zg!!<`Srp!*/tsr`/u!rDs,&<)Zaqr`/qurE&r"rDrr"$WpJ4
+=BSa-=BJ^0>5_V(=ohi1r`B/'qHE]!"'Si2>PqY->?kH=>l7k0?=7/LrEoV6q-s;4s'kn:s(21A
+!G?-FC'&0eC]8,MD>nDSDfB[pE<UE+F`qtQrcnHg"FGNDI=;*DrI=itrdb*%Jc:6*K7no3L51N]
+LC8opMMd=NNK'!\OcfX+s-*GHs-<VM!LK,NQi<?YR@9V7S=H.@St5kPs.B=as.KIfU].(gV#[Cl
+VuEUqWN,s!riQ1'#-bA;Za@-JqmHX:\@B)\rk&-B!5AHIqnW3Iqn`?LrPJNNr5ATR/\[Wo?WgN6
+=^"q.SqqH5@phPp86:mR3Bf2O/N#+E4ZbGU8Ol9A7n#?r3'9;%497NDr_rr!;H3Wos%rnq;,:%d
+q8WHRpr;pEn](1@m)]+Hr6"cWrQP8a&BL&nD.-^R>$PB=>$G07>[@>6s'#J+r`Tn9=]ng.=BAO'
+<`W1!<Duam;X[G'?XR;O@qB4aBPD6tD/O93EccGIGBnL^I=Hd!K8#&9M2R=QO-,TiQ'[o.S=Z@H
+U84W`WN*&%YHY==[C3TU]=bkm_8=.0a2lEHbg+P^dF6Urf@\g2gtgiEi8N_VjQ>Ufl07L!m-O0/
+n*ol;o()DErq-?dp\4[^s7uZjr;6KkrVcBfJcC<$qYu'~>
+JcC<$JcG]Ko`"gfrqu]ks8)ckrqJ5Bp@e1Po^h\Fo'u5<n*]T0lg!`ukN:mej5T"ThVHu@g=Y$-
+eC2glcHXOHCjLPjXo>C$WqNF`WqiXTW%"+"SXZ-eV5gMpVl?VnVlQboWiDngYd1L:YHY47Y-5LQ
+]Y(tmm[8KrpSe(j!ii<%ql9Rn!ii6!or.kh!NN3tWWK6&XT#:"WrB%!WrB%%XKAV-Y5#4"YQ1m)
+YlCm,Z2V*0[/RN6\,a)=\G`u<])K5A]",BM\c]LS]"@pPs1/0>s1/0>rjr-?!P#W<\G<]8\-0:N
+\@K3M])fRXr4`0F!5SNI"2M[d_#D1M_?@]m`5BLj_u[isr5\iYs2P;aai_cJao'?]bl>rec3)D?
+eCFNK$J3q`gYCZDioB+_rok$[lg4!*mdBQ5o(;SIp@nC[rdk*Os$-G9_oKm@b0'baqu-0VXME?K
+m,FeRYaL*&>+(nOAR;:8Vl6MnWENM1@UNGH=hhV^\@B#W[^NQKZEUR<['Ykn.K&>\hq?E,daHOo
+g>(H6f@86sdEpV&fZ_FWa3VlK_nNap\[SlMZ*Lh7[J731?[#me@Us%^B4u$qCi401EH?5FGBeF\
+I=?]tK7nu7M2I7OO-#NgQ'Rf+S"6.DTqeE\W2co#Y->1;['mHS]"G_k^r"".`lQ9Fbg"G[dF-Op
+f@S^0gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$qYu'~>
+JcC<$JcG]Ko`"gfrqu]ks8)ckrqJ5Bp@e1Po^h\Fo'u5<n*]T0lg!`ukN:mej5T"ThVHu@g=Y$-
+eC2glcHXO:?tjM&M#N:uM=ZPrL]<2$LBqm<FE;M-H[pVFIKY(KI=?YEI2.*RKS4r0K7nl/JUrc@
+NK0$X^j9pNonW@!s,$Z0qM>90LPPhapk]'0M2Cn_!/^Z3s,6o9pl5<6!KW6>NrP1>NrP1>Nr4t;
+OT(C@P5^RFP*(n*P5gX>Oo:C:Oo:ICP5pjGP5g[COoU^DPl$aGQ3*D=QN!-QQ^3r(Q^7Q9rg3\S
+rgEeTqj[MRrL<\Ss.01]!2'.]!MQ7dU]7+pVPpJoX/i>)r3$+)r36:.Zi7<C[C3NR]=bhk^VI_(
+`Q#s?ao9F-c-FY]dF6Roe^rF+g>(N@hVmJRj5]4]jlYaikiq?slg4!*rp0^Rm-Xf?#4M'Nnac8B
+rpgotnac;Cp%A(Rq>'maqYU0fr;HWos8W)trr%rY5iB/LR@Tn=S"8g&e^i'aJs2Y2dCaa]LN?m>
+8Tf,s;bqmnI=?ZrIo&p9<)cdn:m-m!N/ELNM2I.GLk^\?Lkq/m#l2u[WhcShTq_O[*MTC,Una]Y
+TV.pJU84HMR@';/QBdVqNK&mTM2$fSM#Uh+?t*SUAS,RgC27X'DfB];FEVkQH@('hJ:W?+L51VC
+N/`m[P*;/sR$sM8StMdPUo()jX0&P/Z*UgG\%0)_]t_A"_o9X:aihoQcHsteeCE1&g"P3:h;@/L
+ioB+]k3(smlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`no_sFAJcGTHJ,~>
+JcC<$JcG]Ko`"gfrqu]ks8)ckrqJ5Bp@e1Po^h\Fo'u5<n*]T0lg!`ukN:mej5T"ThVHu@g=Y$-
+eC2glcHXO"84uZQ;#XD[;Y*cW;#F2b;B[qU3&ru[6:*t'5=%S"5X@Ot5Wq7m6psC/6UO1-6:+FC
+rCd<778HbY;Ys>e;Z0Pi;Z0Jl;#!oe;?Bcr<;9Dk<!#ur;Z'Jm<;BGr;H$Ll;cETl!)rbo!*0#!
+nPoQir`/nr!)rkrrDWJjs&K"srDi\ps&8tur)W_sr`K&!"B\`,=BYQ("Beo2=^(f-r`]5&r*'#&
+!*oM-s&oe5>$>'4>$5$5>?kG1>l\41?OC1J?t!MS@U`bT@esU7A,p3?AH-3FAnPaiBkhD[CB/2M
+DZ4SRE;sqYF8g:]FqJqCG^4U^I=-HkIXZcrJ:E*"rdb0%JUrFPK,'&nKnbA=LPL\AM2@+IMi<XT
+Nf]?brf@GKP*2#nPa.N"Q2['LQi<?PRJrZTRgtsZSt;RIT:hjNTq\9VU].(hV>mImW;ijrWWoQ,
+Xfek2Yl:p-Z37MA[C3RC\Gs,=\co^Y]tM.orkJBHr4rKP_o'@i_th7K`W*sWa"tVrF^J?T=]np3
+=e(.]H?*L]77^@;C,e@?0eP@55<_1c1J(,-7n,p;3&iiY4$5Yf<`T,u$WC#';c-Ci:f1%c;=DQo
+`W4'HaSj6YaS*aLb4a'Yc25^%bKS2RUl02#?!CH:?!CK8>$P<<?!LW=>5_Y;=BSa-=B8L(<E3("
+<)lmo;Gus[s'KtX@U`kZAnPdlCM[m,E,fr@G'A1WH[U?nJV/W1LP^nINK90aPEhH$R[]k>TV8-V
+VPpMqXfen5Za@0M\[oGe^VI_(`Q$!@bKS5Vd*^:ke^rF+g=tH>hr*JQj5f=akNM0qlg4!*mdKW6
+nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#s8)bG~>
+JcC<$JcG]Ko`"jgrqu]ks8)ckrV-EfpAX^co^i(Q-LpTomd9B-lg!`ukN:mdj5JqRhVHr?g"4j+
+eC)ajcHOIKEHm&%poF+gr2][oqPaIpri,+[$($jHS"6CSWi)fpW>qe7W2?MmWMH;m['6a<Z*1=6
+Ye@fc^;.IsFG$IbW;ijsWr9!pWW9$sWrB!mW;iguWiN2uWrK-tXS8arXKDH(!3cC,"gG26Yd(M5
+Z2V!,YlM*.ZidbG\@D:Dqmlg=\GNl8]D];@\c',=]*,^W]=GHN\H'5>\c98=\c98@])oXZ^APbB
+^];4K^]VHi_SZ;iqS`BP!64uX!6G/[!6G/]s2t8_rlkDes3:bodaHUormq)#s4I_5hVdAQjQ>[j
+lM^&KlicbFnac8MoE4g^qYYpEXoAJ"h8B66!R/^cs"s9AnZ0UYkO.'!]<eqqOH5ftSQoO#X/N(s
+Wi90,>@CoG?!>"U]=PJ\[^`cQZa-g<Z*Uftrs&A^gYgc5ec+#?f%f*:f@\U%e'cV"h:Tola2lQI
+aMGU&]"5>VZEU[B[emK-[VoJZ?t!MSAS#LfBkqL$DJsN8FEMbNH$XjdIt3-'KnbD?Mi<[WOckro
+R$jG6StD^NUo(&hWiW>+Yd1UC[^`l[]Y;.s_SjF6aND]NcHjnde'ut#f\5'7h;7)JiT&t[k2tml
+l0@U$mI'H3nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s+14Hs*t~>
+JcC<$JcG]Ko`"jgrqu]ks8)ckrV-EfpAX^co^i(Q-LpTomd9B-lg!`ukN:mdj5JqRhVHr?g"4j+
+eC)ajcHOI=@VTk2rJKoto8**qreUT0onWfkD00i@I=;*D"FkiKI=D-C(4LRUKS>#1KS+i-JV&oC
+O,f9\NG*?cnV@+"re^Q/qhb?/rJ1E/pkem*repW1r/:N4q2P62!0@)?s,[/>!0@&>rK6u?rfR5B
+rK?u=rfR8DqN;>NP*1rjP*;&mP`q8nPEYp-s-*JIrg!JK!gT(;r0RDKr0IhXQ^=),Q^=),R@9P3
+rgNbSrgX._S=?"<SbnrWSH>CTTDYA^Tb!ooUna`\V5C/gWN)u!XKDH(!3cC+s0;R/s0F>b[^NZT
+]=bhk^VRe)`Q$!@ai_iPcHab`daQ[qf%8R-g=k?<hVd>Nio9"YjQ?I)s60LIr9F=Js6KpVmdBQ3
+n,;bRnc/.\o_&4Ws7cNfs7lutqtp<hrVlcorf@'^j0tqTT)P98SF5Ii`72k\QCG/+V0e)RP$i*A
+F`_b#;1O7JJ:<'!:/=Yb<)QRjP)kT]Mi*FNM2D4f",)GcLlhWBqU;sSW2HGcU]-r/U8=cbUnj]W
+TqIpPV4a9FR$O2+QBIAiNf8mQL5(M@nVD*i?XR;O@qB4aBPD6tD/O93EccGIGBnL^I=Hd!K8#&9
+M2R=QO-,TiQ'du/S=Z@HU84ZaWN*&%YHY==[C3TU]=bkm_8=.0a2lEHc-FY_daQ^sf@\g2gtgiF
+i8N_VjlY^hl07L!m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$qYu'~>
+JcC<$JcG]Ko`"jgrqu]ks8)ckrV-EfpAX^co^i(Q-LpTomd9B-lg!`ukN:mdj5JqRhVHr?g"4j+
+eC)ajcHOI#8PDlUrDWGgp/(ffo24aKrD<t]1cRKU6UF()5X@Y$r]giT5<_7o4@DV*6:4->64-(S
+:JFMY9MS8V;>jDi;>F,d;uKVn;>F#k;,C(d;>X8b;u]es;uT\o;ZKer;u]_q;uTYp;ta,h;uTbq
+;u]he<W?%o<VBDj<<-"q<<-"r<Vfbr<W?,!=8l>%=8l;%=8H&!<rcD&=T2G'>5hY->$5!3>5MJ$
+>5_\)>lIt->5q_'=oMV)>Q%k->lJ%/?NshD?smGR@fBg6@f'[8AH$-FAnP^gBPM<urG)@J(2[r-
+Df0K3E,fo=F)uGFF`qqPGBeCZrd+WmrdFfqs*t'!s+(K,JUrE)K7el3LAcl9Ll$qEM2I1KN/is[
+OT(:IOHGZgPEV5qQ'D95!LB)MRK&]lS"-%?St;RHTV8'RU8+KZUnsl_V5:)gri,pts/Q:(Xfeh1
+riuI.!jf8ArjDm;\[h[Mrjr6E^:sN\r5&BLrknTN!6+rU!l`1!qoA]Ws2k;`-H;Hs?s?`:=BSg1
+U4d>hG%O$28Pk@>3BfGs/iGLL4Zb>Q8kDQEr^HuM3&j#!4:+)M<)Zaq;c6Rnr_i_l"&De9akOo8
+an*[RbPB<XbP'0Xc1'$XbmCA.DIHjW=^539r`Tk;>[C]@?!CK;>ZP$/=BJX,r`0A-<E<+!<E)dm
+;,QgZDdHdY@:E_XAS5[jCMRd)DfKf>F`qtSH@1-jJ:`E-L5:\EN/is]P*D6!R@B_<T:r!TVPgDn
+XKA\1ZEpsI\@K5a^;%M$`5Td<b0/&TcdC1ieCN7(g=k?<hVd>Nj5]7`k32'olKdg(mdKW6nc&([
+oCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcGTHJ,~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0m-<j"kiV$gj5T%Uhqd,Cg=b*/
+eC2jncd'aDE,g,TV"1SaWqEFbWqr^bW"tbkSt9MiW2ckuWi;trWMlepX/MegZ2Lp*Ym%kV]Xtnn
+rP&!(s/H$urN#gq!3>pqri,jp"KA?!WN,ruri6"!poFItr2]n#qlTt(Z2V'.Z2Cm-Zi%*1['d@A
+\,Wu4\bs#C]=PM_]"5HO])TDA]_T/7]DoJA]*#XV]"@dL"1u7]^AYhJ_8#raq8!*I_>D+O`5T^o
+`;R[T`W4'Y`rF*ZaSs<]b5]T^b5]Wmbg"GYcdL:le^`7%rn%2'$/4.kiSrnZkih:1l4<4ImHs?2
+nac8Bo_%tSqu)*GY5\b)gr7CWb0J92ru:k,oW5XPkjR`3WOo?L@$+fdS6KE,Vl?YnX/c/'$"@:K
+?!G+W]Xt]Q\,Wl@[B[!>Yd1Wrs!n!/h;[/;e^W*tf%f-?f[\O%e'Z\'hq6/pa2uWGa2#F$]"5>V
+Z*:RA[emK-[WGe]?XR>PA7]@cBPM=!DJsK6F*)SLG^=^bIXm!%KSG8=MN!OUOHPfmQ^F52SXuLJ
+USXleWiN8)Yd(OA[^`l[]Y;.s_Sa@4aN;WLcHaeae'uq"f\,!5h;7&IiSrnYk2tjjl0@U$m-X60
+n*ol<o(2MQp&F^cp\ssfq>U6gqu6NlrUg)?s+14Is*t~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0m-<j"kiV$gj5T%Uhqd,Cg=b*/
+eC2jncd'a9@Uj.oK)LSgM>2o$L[^*,Df^#B<IB7EIt*"GIfFfuI!Bpgqh+p#s,[2>"ceY'NK0%e
+LB<9gM>W2+M>i>2L]<2*M>N2,MZSiqMtr;6NJrjVrf6u;s,Qu;rK7,Arf@)@q2tT<rfR5B"-Jb0
+Onk.?Onk.?PP^OAPQ$dIPEbm,!gJt9r0IDNrg*SNrg<\Os-WhQr0[JMrg<_RrL*_VrgWeT#+M-Q
+SXl:@r13kZ!2'4_"/2HaU\pqeV$NrrW2ZbrX/iB%Y5YU*Yd+25!42[3)7?o_\\,Yj^V@V&`Pom>
+b0/&ScHae`daQ_Fee$Hcg"P08h;-rFi8ESQj5f;"jo=HCkPaTLl0@R"lg4$+rU'^TnGMebo(2MH
+p%J+Rq"X[\qYg9or;HTnrf-q*kIIIZSt;LET'bUmd`9RaO.35s`I!,nLfR2b:3C\Q;GDXiJ:;uu
+r_F8/<)QRjP)t]_Mi<UQM2@%DLP:J=LlhWeqU)mRVl?JeUS4?STr+`cV4s]XTqJ!UVP0HHR$X8,
+Q'.8hNf8mQL5(M@nVD9m?=.)L@Us%^B4u$qCi401EH?5FGBeF\I=?]tK7nu7M2I7OO-#NgQ'[l,
+S"6.DTqeH^W2co#Y->1;['mKT]=bkm_8=+/`lQ9Fbg+M\dF6Uqf@\d1gYL`Di8N\UjQ>UfkiqBu
+m-O--n*fc9o()DErq6<b!;HKfs7uZjr;6KkrVcBfJcC<$qu;0~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0m-<j"kiV$gj5T%Uhqd,Cg=b*/
+eC2jncd'a%7n?BM;#O>e;Z9Pk;#O8g;YX,O:^/a:3]]5f6i'(S5<qCs4?bqk7/TFP646.V9hnAU
+9heAW9i:jeqbd/epeq/jr_`Vj!)`Yjs%`Yl;>X8b;ZKer;[H?#;cH[p;c6Ljnl#EbrDWhs<)i?e
+!*&krr`9&!pJ_/n<qfVn<WQ3$r`/eqs&f8'!E`M&=T2G(=BYW*!EN;!=oMV)=o;J$=o)>%>Q7q.
+>Q%_7=]ed/>$5!3>$G39>[@>5rEKS5?XI,G?X[C=@fKpAA7B"XA7Y[N!+u1Bs(M@F&8GurCi!s+
+DJsH4EH6,@Ec_5%#'G*4GB\:Vrco`7H[L3hI=?TnIt)osJ:W<(K7ei2Knb>;LPUbCMM[4KNK0(s
+O:ID9PEV5pPa.N"QC!u+RJiTRRh;3_StDXJTV8*SUSFW\V5:&drhodpri,t!riH.%s/uO/Z*L\7
+ZO!qG[C<WT\[f?O]E>m]^:sT]rPAKMrknZPs2G#Vq8NBRs2Y)Z!6P&Z0#au=@9Qc:=]np4Sqq<$
+ASaY#854qf3B9,`.jm/)5!(GS1.au,7R]d,3&j#^r]C6_<)`cq$<'o&;c6Fh:f1"co?$LEo?6XI
+s3(/\!6t5_p<N`cr6P;drm)Y2XGh%+?!LQ<>[(E9>?b?=?<pc?>?kB6>ZY!0=',B%$<L5.<E)st
+:f:+fn5+44?=.)L@Us%^B4u$qCi401EH?5FGBeF\I=?]tK7nu7M2I7OO-#NgQ'[l,S"6.DTqeH^
+W2co#Y->1;['mKT]=bkm_8=+/`lQ9Fbg+M\dF6Uqf@\d1gYL`Di8N\UjQ>UfkiqBum-O--n*fc9
+o()DErq6<b!;HKfs7uZjr;6KkrVcBfJcC<$qu;0~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrqJ5Bp@e1Po^qbGo'u5<n*]T0lg!`ukN:mej5T%UhVHu@g=Y$.
+eC2glcHXOGEd)edWUR"hWrT0mX6Ze`WVNJ$QBe/8SR\LqX/i7uW;W^qW"H,+UU%/.ZELR=YckCJ
+^V%7nqn<'Bpo+4ls/Q$urMfq"XK;?#ql9Uos/H."WiGlqs/Z^4Y-+n/XKAV+Xf\\,Y-7f,!O&d+
+ZMh*0[/RE3Zj!kE['d?Orj`$=p::(3"1bqP])K8?\d5p\]Y1tj]=YZR])fLTrOi0Eqn2p?!PH&B
+\coa[]tV7sr5&EKs1n]NpVHmHrkncSpVm0P!6>)Ys2P/]ao'<\ao0@*bK\>Xcd:%ee'uq!f@S[-
+g"G*5h;7)Kj5oIekiqBum-O`=$1IEUoCV_Lq"jo>s/uA,rnPH7ai_oTrr4ABnF<Z_d,jc^WNa+E
+C1*-2S=3Pi?Djg%W2lq%>[(ZF?X@#@]tCuV\-]UQ[^<?FYHY:=NrLU-jkSnNeCE(!e(*:3hqHZ4
+eC;ptj58S8aiMQK`5]R+]Xtb_['?mB['ok>pU50M?XR;O@qB4aBPD6tD/O93EccGIGBnL^I=Hd!
+K8#&9M2R=QO-,TiQC+)0S=Z@HU84ZaWN*&%YHY=>[^WfY]Y2(q_Sa@3a2lEHc-FY_daZdtf@\g3
+gtgiFi8WeXjlYail07L"m-X60n*ol<o(2JFrq-?dp\4[^s7u]kr;6KkrVcBfJcC<$qu;0~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrqJ5Bp@e1Po^qbGo'u5<n*]T0lg!`ukN:mej5T%UhVHu@g=Y$.
+eC2glcHXO9@:j=uL@U3$MXlVoM#N2"LaR+YGB@q*I"-ZtJ:2fpIXQZnI"$?dKS"f0K8"u2JV/uD
+NfB$YNK*pt!0-N(s+p]3r.t*(rJ:<,s,-f6regT2rJUc:N;S\7NW>(6NrP1<O8tFAOT(@BOSFt8
+P5LFBP5LI<P5pdFP5pdAPQ-jIPQ$gGPlR'IP6-u6Q2['LQi*6KQg^=>RJrWUS"0JIs.'+Y!1`tV
+s.'+[qk!h[rh0:b!MZ@gV#R:kV#R7tVPg>jWN*&$Xf_T*#-Y88Z*CU@rNmfX\@T>c^;%J"_SjF6
+aNDZKc-FV]dF$Fne^i@(f\"m2gYL]bhuDX7iW%m;j87p;jo=HPkNM0qlKdg'mHs?1n*p>Hs7-Ed
+o^qkNp\=O_q$6fnqtp<irVh]S+m?S8R\$.CStGB1g<I.AKRoYma3f<hN/(D,Cef+o92\RbIiEid
+J5/p:<E2pp;,E=7Nf8jRMi*@KLPLV>LP_,m$2Mu\WhuelU8+I^T`_0jW29Kfs.L4$WhuJZR@'>/
+Pa%>mNfB!TMM?kAM21VWFC&<^@:E_XAS5[jCMRd)DfKf>F`qtSH@1-jJ:`E-L5:\EN/is]P*D9"
+R@B_<T:r!TVPgDnXKA\1ZF%'L\[oGe^VI_(`Pom=b0/&TcdC1jeCN7(g=tE=hVd>Oj5f=akNM0p
+lKmm)mdKW6nac8BoCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcGWIJ,~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrqJ5Bp@e1Po^qbGo'u5<n*]T0lg!`ukN:mej5T%UhVHu@g=Y$.
+eC2glcHXO%7nQNN;>=&d;>F&f;>X8];=79\1C#m"3B'8j6:(Q8'1"lI5<q@p4@2G%6pj@05sdq7
+:]3re:Amlg9N"db;>O2c;u]bl;#jMn;>sAm:Jq$fqc!MorDW\ps&8qqrDN\or_`Sks&8qqqbmMp
+;uK\p<<-"o<<-"l<<-(s<<-(t;uouur`'#!<E8Wk!EW>#<W?)&=&rC(=Su=t=9)M&=9M]-=]nr,
+=nl1t=oV\)=TVf2=oMV)=oDP'>PhS*>?kG1>Q7t3?<plD?iFI5@/sg7@KU+L@UoCJs(24DrFZ+D
+r+Z1G!c2^jrb_dUE,kkts)\-\s)n<as*+Kf!I9"iHPV!UI!pHmIt3'#JV/T.KS>/8LPUbDMZ/P6
+N!PE'O,oBaOckk+P7!P>Q'R`&R$jA2Rf8fUSH#,jStMaMTq\9VUnji`VP^8hri#jr!36%!s/c7&
+s/uC,"1#8>[/RK5[L0LS]">Se]t_=t_#;+L_Z%IN`;[aM`W4*Za8X0XaoBNYb9Y0-I:?G]=]np3
+>FL=cB2i)#5>=ajO?#Ee3%H=4/O)?O1GVQ$7g;CM2`NcZ48q>C4')>[$WU,(<)Z^m;,C.d;";`b
+bkB<]cLfHZd/;5hd.tugcHlC7rm(_NN,W64r*'b<>$>'6>[CW=>[(B:>?Y*1=oDD(<``:%r`&tt
+;>sJ^:ip#N?t!MSAS#LfBkqL$DJsN8FEMbNH$XjdIt3-'KnbD?Mi<[WOckrpR$jG6StD^NUo(&h
+WiW>+Yd1XE\%0)_]t_A"_o9U8aND]NcHjndeC<($f\5*8h;7)JioB+]k3(sml0@X%mI'H3nF?)?
+oCMVRo`Fj]p\ssfq>^<hqu6NlrUg)?s+14Is*t~>
+JcC<$JcG`Lo`"jgrqu]ks8)ckrV-EfpAX^co^i(Q-h6]pmd9B-lg!`ukN:mej5T"ShVHu@g"=p,
+eC)akcHXOGCjUYjXmiF_X6ckcX8K!qW=c(tQ(O_?V5C5iW2cksVQ-_sri-'sUp73'YlD!0ZaB_H%
+)'Bg^:h7p]=b\aWN#ips/H$urMp+%X/`2#X8K%#X/rE%X8K!rX8f3sWrfB)Xo>L&YPkU(Xo>L%Y
+Pta0Z*L^AZa9Y<rjD^3s0Vs;\%&sC\H'/;\c')>\c'&:\c95@]DfJA^&,GA]`5YF^AYbF]`5\D]
+`5VC]E#\F^]2+F_#V@H_>hCL_u7LW`Pf^6`Q%ks!6G/[s2b8`rlY;arQ5&]$d6f?cHjkbdaQ^rf
+)=23f\+s3gYLcEi8WeYkNV9tli-5YmI'K5oCV_Lp\=U_JcDnQ#2IGFbKS8Xrr<#n1@X\4^"_o?g
+o&PeG@6M?S"#p[?`0s'W2cq(>[(ZG?X@#B^:_(g\@8rX[C*?GYctC=NrLU.jkStQe^r@&eC`[:i
+SE,;f$i*uk2G%=aN2KK_o9C)]Xt__['?pC['ok>pU50L?=.)L@Us%^B4u$qCi401EH?5FGBeF\I
+=?]tK7nu7M2I7OO-#NhQ'[l,S"6.DU84W`W2co#Y->4<[C3TU]=bkm_8=.0a2lBGbg+P]dF6Uqf
+@\d1gtgiEi8N_VjQ>Ufl07L!m-O-.n*ol;o()DErq-?dp\4[^s7u]kr;6Hjrr)HfJcC<$r;V9~>
+JcC<$JcG`Lo`"jgrqu]ks8)ckrV-EfpAX^co^i(Q-h6]pmd9B-lg!`ukN:mej5T"ShVHu@g"=p,
+eC)akcHXO9?tsS&L]*&&M>rJ(M;F%(F)Q2EFaSRbI=?ZpIXQ]rIXZ]nH[CGDK)gT(K*73qOH,A#
+NW5"BN/ijTLkt_Zpk\9n!/g]4s,-]3s,?`4r/Lf=NrG+>NrP18OS4e:OT(C>P5UOBP5^RDP5LLH
+P`q;oP5UUDPl?mGPR!D:Pa.N"QC%T9q3D#Io9fND!LT;SR/`TOR/WNRRK]1NS=?"<rgNnXr1!_V
+!1itXs.B7_s.KOhUSOacV#@+iVZ*LqWN*#uXT5O'Y5kg*YpZlb['d<M\%0,a^;%M#`5Td;aNMcN
+c-FY^daQ^tf@JR*f\,!4gYDea.c0(@i8NYSioB%Yj5f=`k2tjjkiq?slKdg'mdBT6nac8BoCV_K
+p\4IXrqQirqtp<hrVc`pMZ4[_]r%?lT:MUHm,?U>agAI,OIsM@\UUi)>u#01rcABD:OdnEIXltJ
+:C:*$;Gp@gO,o<\N;e_9M2M:f!euJdOT-j,dCcNWX/)McU7n<UW2Q\nUnjcZTV/BaTpqF:Q^X,%
+P)t]aN/<FIL5:]ULicp/?XR>PA7]@cBPM=!DJsK6F*)SLG^=^bIXm!%KSG8=MN!OUOHPinQ^F52
+SXuLKUnsufWiN8)Yd1UC[^`l[]Y;.s_SjF6aN;WLcHjkbe'uq"f\,!6h;7&IiT&tZk2tjkl0@U$
+m-X91nF?&>o(2MQo`Fj]p\ssfq>^<hqu-HlrU^#>s+14Js*t~>
+JcC<$JcG`Lo`"jgrqu]ks8)ckrV-EfpAX^co^i(Q-LpTomd9B-lg!`ukN:mej5T"ShVHu@g"=p,
+eC)akcHXO$7SHNNrD<Ago2,3Zr(ufYp.u/W1H7BT6UF()5X@Y$r]gNL5X><3!(?`Ps$H`Q##.lf
+9MJ2Ur_3Pi9h\5Y;Z0Jg;YF&g;Z9Vm;?9]or_`Vlr_rhps&8kqqc!Jlr)3_r;,L4ir_iJhrD`Jj
+!*&Sjr`8qsqc*Sqs&Attpf@Dps&]5$s&](u!*B/#!EWCu=nl+t=TVc/=Su;,>$5!3=]np3rE0,(
+r`K5)qcO&*=BJ^0r`f5&!aAo8r*98-ra#t>?sm>L@:E\U@UWaF@g6CPA7]=_Ac?<?BE)]GCB%uM
+C2@^'rbhaS!H<&XEs?Z+F*)JFFT$@^G5lddGlN'hH6%?[I=6QnIt*!"JV&N,KS5&6LP^kFMMmCO
+N/`jYrfI,As-"[lQ'@Q!QC!u+R@0M4S"#q<SXuFFTV8*SUSFW\V5:&eVl6QnW;rsrX8oC%Y5b[<
+Z*L^C['d?N\$rlX\[oGe^:qA]_>hFL`;dgS`r=$Xans6\anX$XbQ#fac2Z'Ubb9Mo?!(63>$5's
+Hu<G*;cc7R8S!un3bpK&-T!A=4ZbGU8OuBB77K3r3'98`4?P]+<)cjt;c?[p;c6Ig;,C'fbj*I5
+cMGl`d/VMjd.P]bcLoN]d/D9"ZB&s5?<LK9>$P<:>$:i0!F8t/>7=\>=BAU*<``C'<`N3"<<6#q
+r_i2]FBr3[?t*SUAS,RgC27X'DfB];FEVkQH@('hJ:W?+L51VCN/`m[P*D5uR$sM8StMgRV5L8l
+X0&P/ZEpsI\@K5a^;%M$`5Td<aihoRcd:(geCE1'g"P6;hV[8Mj5]4_k3)!nlKdg'mI0N5naZ2@
+oCW%T!quB_rqQNhs8)ZjrVZZnoDX=@JcGZJJ,~>
+JcC<$JcGcMo`"gfrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0m-<j"kiV$hj5]+Vhqd,Cg=b*/
+eC;pocd'bXCN+NKQ*("drN5:bs/YXhorJ(ls-a1\?Y3rOWiE&tWY_P2X/`+uWMH8nZEg^?ZEppD
+^;%@m^qK]\!PQ)C])]D=WW0!sWrT7#X7WLkX8f:$Xnf'uXT5O"Y6;)5YHG&,YQ(j,Z2Cs.[.q'/
+[KF%K\@DCGrjW'>\@B*I\cK@OrO3*C\[oAa]=bei^&GbF^&PhF]`>eE^B;3`^:jBUs1JQL^V@S"
+pqZsIr5&6HqnrBN!6+rU!6+oW!6G/["3AU,b5KKbb/qd)apcJ;cHXY[d*^:ieCE+Kf)F;Cg"P39
+h;@,KioK7ckiqBulg4!*mdT`9oC_kRqYU5Bs0)G,g=+6gc-Oc9s8VpBo^&Ztea)Vb[`tD#K9'E0
+S=NhjW2unsW2ch#>ZtTD?<pdL]t:iS\-TXR[C!3CYHkHos!n$/hWE_If@JO'gZ%2Ni7Q]6eC2q1
+j4ql$aN2WD`4s!t]=GAWZ*LaD[emK,[X)1b?XR;O@qB4aBPD6tD/O93EccGJGBnL^I=Hd!K8#&9
+M2R=QO-,WkQC+)0S=Z@HUSOcbWN*&%Yd(OA[^WfY]Y2(q_Sa@4aN;TJc-F\`daZguf@em4h;-uH
+iSrnYjlYail07O#m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+14Js*t~>
+JcC<$JcGcMo`"gfrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0m-<j"kiV$hj5]+Vhqd,Cg=b*/
+eC;pocd'bX?!qDdI#@lYp5/d+nqlIare^W1#'4g*:K:GGr-o-(I=6WqI=6KiH%^j)rdt]8K7f5G
+Nf9$ZNfB$YNJmap!/g]1qhOs&m>:h"r/:T4r/:T6pl564r/Ui>rK$r>s,m5@plYK9s,m5BqN:`>
+r0.,E$Bp^=Q'IT!Pa%Arr07>JQ'M?7!13\N!13YM".,=>QhZsJQi<BNQi<?QR@<l<s-a([S=H(=
+rL3eWrL<eV!1iqWrgs1`rh0@eU\^bdV>d@lV[06#WiN8(Y-+u-Yl:mLZEpsH[^NZU\\#Je^VRh+
+`Q$!AbKS5UcHjkbdaQasrmh,&g&'J.gYCW@hVR2LrSf6cjQ#=^jlY^gkNV9tm-O0.n*oi;oCV_K
+p@\.Rp\=R\qYU0frVc`pM#T0t^87QrT:VaLm+U.;d(?K5Q(,J8_hY(3BjkaPF`he":k4.HJ:N3#
+:/=Va;c6Ihrf@)<$B'k&M2@%ELP:M>OT-j.dCcNWXJVegUS=KZW2Q\qUnsfZTV/HdURIU<Q^O&$
+P*(cbN/<FILPUfVLjE<4?XR;O@qB4aBPD6tD/O93EccGJGBnL^I=Hd!K8#&9M2R=QO-,WkQC+)0
+S=Z@HUSOcbWN*&%Yd(OA[^WfY]Y2(q_Sa@4aN;TJc-F\`daZguf@em4h;-uHiSrnYjlYail07O#
+m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+14Js*t~>
+JcC<$JcGcMo`"gfrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0m-<j"kiV$hj5]+Vhqd,Cg=b*/
+eC;pocd'bX7S$-F:]+&g;$'Qk;=dWZ;=m]R;>sAr2`NcM1GqMq5m]eB5!M4o5!;8"rBg`S6UOXD
+:]=#f:B!ua9_MBN;u]bo;u]_s;c6Nm;uT\m;uT\i;[$-!;GpFlr_iYm"B&/r;H*Kmpf75ko2Y`i
+s&9;*=&r@%=&r=#<Vof$=&r@'=BAQ%=8Z+t=8l5#=SQ%n=9)M%=T)D&=Sl5$>5_V'=o_e'=U826
+=BJ^0>?b80=o_e+=o_e*>lJ"3?=-uD?N+=2@/aU:@:EaG@fKp<AH$0>AdrBdB4kmkC2.O!C2@a'
+rbVgVDf9T6EVsh[EH6)@F8L(kG'A.TH?spbI=?WpIt3'#K)U<EJqSf2L5(J=Ll%%KN/`gWO,oBb
+OcklkPa%GuQC!u+R@4&C#+M-RSXuIGrh9@ds.fUis/#an$)ji&WiE,#Xf\c*YPbX)Z37PB\$rmH
+\HTRV]Y(qmrkJQN_Z%LR`W*sUa8a6[ans6WbPfZac2Z#cc2>lbcSi:`@U*&>>$G-8PAY8LC0==u
+7S6dEI61(X0Io"45!D(^1J(2/84Q-=3&ii[3]oMd<E)pt<;]Z";Gg4d:f#B^jj3&8s3LGdr6GAi
+qp5,arltGf!6tMg!R8phci)5hcQffXEFW6X>?Y38?!CH9>?Y9;>[:T==^#$3='/O)=&r=%<EB*!
+!E2kp;X[G.>[CcF@:E_XAS5[jCMRd)DfKf>Fa&%TH@1-jJ:`E-L5:\EN/is]PEhH$R@B_<T:r$U
+VPgDnXKA_3Za@0M\[oGe^VI_(`Q$!@b0/&Td*^:ke^i@*g=tH>hr*JQj5f=akNM0plg4!*mdKW6
+nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#s8;nI~>
+JcC<$JcGcMo`"gfrqu]ks8)ckrqJ5Bp@e1Po^qbGo'u5<n*]T0lg!a!kN:pfj5T%Uhqd)Bg=Y$.
+eC2glcHXR@E,p2TU]%:SXn8[kWq*4jYqMN4QX$8gXf8;"X/;hpVl?hrU9Lu/Z*L^@Za@*S^V.7p
+^q[Us]Y;%j]=5>^[^Q.6"KJN(X/kinr2ot"qQ0b#rN-(&ric@+!jSu6ric=*!3uL,riuL/r3QF1
+qm?L6[C6"Cq76L7"1PeN\c',=\c92>[g]dW\[oDc]Y2"m^VIY`^Au(K^Au"I^])"R^V7Fq]Y2"m
+r4W*Es1nWMrkSNLrPJTPs2"fS_Y_7K`;RXZ`5Td<aN)?ua8j?]aoT]0qoT8jcHXY[cd:(fda\9H
+s4.h7f\"m1g=tH?hr*JSjlYdjl0J<7%.<WTnalDHp\F[^r;M9IZ2ajW!R/jgd/O&%r:TaPXiArU
+mbFPZVL+&WA"0']>[Uj<WN<&!W`r\2@UEGH>JIka]",8Z]!o,TZ*CF9Z&Sc4jl#Fef@SU)e_fBF
+io&MAf@JC#jl>1Bb/hZK`5BF)]Xt__['HsE['ok>pU5$G?!^lG@U`kZAnPdlCM[m,E,fr@G'A1W
+H[U?nJV/W1LP^nINK93bPa.T&R[]k?Tq\?ZVl6VrXfnt7ZaI6O\\#Mg^VRe*`Q-'BbKS8XdF-Ln
+f%8R.g>(N@hr*JRj5oFckiq?slg4$,n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s8;nI~>
+JcC<$JcGcMo`"gfrqu]ks8)ckrqJ5Bp@e1Po^qbGo'u5<n*]T0lg!a!kN:pfj5T%Uhqd)Bg=Y$.
+eC2glcHXR6@:O%lJc(>tM>2u'M<0QjM>r5.EtWIeG_(BpIsuosI=?TnIX??nLAll+K*d6bKoV4T
+N/s$[qMbT8MMmAfM#W8*M!^'!MY)i,N;AP2Nr4t6OSk7=OSb1:O8tFBP4t(=P5CFCPl6mDQ2m3L
+QMd$JQMQsHQMm-MR/WHMR/`NOR/`NPR/`QSRf&TPRK]+JS"-">rL<nXSG\lVS,f,TT)P>aTV8'R
+rhK@ds/#^l"fJ;tWN3-"Xobf2Yl:m.ZEsP;!k#MIrj`rY]=ktq_SjI7ai_cLbg"GZd*^7hda?Ll
+eC=KJs4.;(f\"pWgE,/+hV[8MiSrkWjQ,FbkND*qlg=*-n*ff9nac8Cp&=Xlp\=OZqYL*erVleN
+s"NuXVPBcVTVA+Ge_8?k_6no^S$(/@H'EJ[A84n_G'-MV:4[kFIt)uE:JOng;c-BjNsq#,MMmLP
+M2@"CL51PGs"")s^8n-5WhcD`U8"TcWN3(rUnaZWTW>#eR[KP0R?NkuOcGH\M2I%CM2C_XE*Q[T
+?XR>PA7]@cBPM=!DJsK6F*)SLG^=^bIXm!%KSG8=MN!OUOckroQ^F52SY)UMUnsufWiN8*Yd1UC
+[^`l[]Y;.s_SjF6aND]McHjnde'ut#f\5'7h;7&IiT&t[k2tmll0@U$mI'H3nF?MK!V>s_o`Fj]
+p\ssfq>^<hqu6NlrUg)?s+14Js*t~>
+JcC<$JcGcMo`"gfrqu]ks8)ckrqJ5Bp@e1Po^qbGo'u5<n*]T0lg!a!kN:pfj5T%Uhqd)Bg=Y$.
+eC2glcHXR#7nHBK;>a8i;=.3W;<h!O;$K9O3&W]H4T.PP5X@\#5<_:r5!Ag2#=LpG6:4OE:&[fi
+:/+GV9hkR[!_Z3ZqbdJo;H!<hrDNVnrD`eq!)`_nr)<Dhr)<Smr_req!)rhqrDW\nr)<Pl!)r\m
+qc3PnnPoZl<E3)s=8Gts<sMi/<``C)<`]3$s&T/$s&T&!s&f;(r`K)$s&]M/=BAR+=BSf+=8uA&
+>5h\%=9)M"=oqo3>5_V%=ohc.r`T5(r*0/*r*B>/s'>S0ra,Y5raGh:&n5?\A7]@bAS,OeB4tsk
+BPD3rrbMLLrG;OPrbqgUs)IpT"*/I)FT$@^G5lddH2i6kI/eZtJ:W:MK)^H3KS>/9LPUeDMMd=M
+NW+qKO-#KePEV5rQ'R`&Q^F20rgWqX)kERmT:hmOU7n<VUSXfaVPgAlWN*#"XK8P-YPtd*YmReC
+['d?N\@K2_]DfJC^'VQi^r!t+_o0O6rl5)]aiaS+!R&^`bPfZablQ,7qTf#br6Y;f!h+aMr*([V
+>)[*4AmnqF5tFOBNE/#&0eP"6/O)B]0JbLU84Q0=7QEFf4ZYYe4&o5Y<W>u'<E)pr;,L.e:>+"o
+dIbf^ci;;hchu)Rc2GrecN)8hci)2n[ZYZA?2e(A>$YB;=^>69>[:Q>>[(?7>?P#)=8u;%<EB*!
+!)rhomndt.?!^lG@U`kZAnPdlCM[m,E,fr@G'A1WH[U?nJV/W1LP^nINK93bPa.T&R[]k?Tq\?Z
+Vl6VrXfnt7ZaI6O\\#Mg^VRe*`Q-'BbKS8XdF-Lnf%8R.g>(N@hr*JRj5oFckiq?slg4$,n*fc9
+rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s8;nI~>
+JcC<$JcGcMo`"jgrqu]ks8)ckrV-EfpAX^co^i(Q-h6]pn*TK.lg!`ukN:mej5T"ThVHu@g"=p,
+eC)akcHXODEd)hbWW&t!Xno3kXnf-uXnf'aWt2/0Y-5*sP_>I$W2?MnXK)9!s.ok)Z*:I;rj2X4
+rk/<HrOriY]tCtf\[]8]\[JrPWN)u!nZ;AbpoaY#rilC,!OB!/Ykt^)ZN%91Z2q;=qmHI4s0qp9
+qmlR5rOMs>qRI!D\[oAa]Y2%n^V@S`_#V@N_>h=N^]2+L_#V:M^\khF]`>hE_#M7M_#M7M_Z.OR
+_u[corl+oUs24iS#K=^%`l5p:`r=![aN)?ta9'K+b59?_b00e/#L:ZBd*^:jeGRiBf%8R-g"Y9;
+hV[5Kio9%]kj%I!m-O--n*ol<o_%tRq"adardk*Ts8UaTbg=bbdf08'rV?0XXiK#UnEHd`VLaGa
+>FV.Q>[Uj:WN)ntWa&b3@UEJI>ZneS]"5A]]",5UZE^X<ZAnkojPoIlg"4j,f&G]Jio/_mf,)le
+j5]"DbK7fL`507']=YV^['HsE['ok>pU:*,F'`3]@:E_XAS5[jCMRd)E,fo?Fa&(UH@1-jJ:`E-
+L5:\EN/s'`PEhH$R@B_<TV8-VVPgDoXfen5Za@0M\[oGe^VI_(`Q$!@bKS5Vd*^=le^rF+g=tH>
+hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo`"O`p&Ojdq#C0hqY^6ir;HTdrdk*#s8DtJ~>
+JcC<$JcGcMo`"jgrqu]ks8)ckrV-EfpAX^co^i(Q-h6]pn*TK.lg!`ukN:mej5T"ThVHu@g"=p,
+eC)akcHXO7@V0CuLAQf$M>2u'M<0QjM&(SkJqSesE+3p9IXQ]pJ:E#rI=$<qL&HZ(K`m'`NK0)!
+NWkE&O,]*Xreq#=MMd4HL\Z`+M>N,,M>iD3M>`>2M>E,.MZAY6MuAV1NVnh:O8b1<O8G%;OT:LB
+O8b7@Oo1:@Oo:@COckn%OoCOCP5pjHQ2d-SQ^3r(R$X0=Q2m9IQN*9OR.lsIR/WHKR/33NR/WKW
+R[KS4S!j2CrgW_Rs-j"Yr1*k[TDP5YT*(a[Tq_I["JVZdV5=-f$E'i$WiE,$Y-+t4rNQC/Zi7<6
+[C3QRrjW9F]=kqn_SjF5aSj3eb0.uQbg"GYcd2U;!7Ceo1"4Y&f%/I*g"Y<<h;7&Ii8WeWjQ,Id
+kNM3tmI'K5nac8BoC_eMp@n@Xq>1!cr;Q\Ks$6+hVPKiXTq\:IgtU2u`4LYeSZU)ZI#<Dc@r=n]
+FEL;T:4ReDIXclD:JOnh<)HIfO-#?]Mi3URM2@"CL51SGs!lL3Wi3&(V5'`YUT1;oXK/:qUSFES
+WMubbS!fV1PEV,kNK/sTMMHtDM=??$>]X4Y?t!MSAS#LfBkqL$DK'T9FEMePH$XjdIt3-'KnbD?
+Mi<^YP*;/sR$jG6StMdPUo(&hX0&P/Z*UgG\%0)_]t_A"_o9X:aihoQcHstfeCE1&g"P3:h;@/L
+ioB+]k3(smlKdg'mI'H3nF?)?oCW%Ts7QHerqQNhrqcQirqu`no_sFAJcG]KJ,~>
+JcC<$JcGcMo`"jgrqu]ks8)ckrV-EfpAX^co^i(Q-h6]pn*TK.lg!`ukN:mej5T"ThVHu@g"=p,
+eC)akcHXO$7S6BL;>X2i;=.3W;<(LO;&MS^5XIaq3%m?W5=%S#5X.Iu4[)"s6pj:/r^.#Z6VgKP
+9h\5U9hkR[#>Iib91qlN9Dqce;ZKep;u]bo;>sMn<!-&s;,I6hr_r\lo2GNcr)<PlrDWYm!)r\m
+r)NSmmT'0d#?Y&/<`W:'=T2D$<rZ5%=BG?""B\`*<EK'"s&o>'qcO&(=]ea,qcEr%=BSi,=o2>$
+=o2D&>6.o3rEB,'s&f8'!*]5'qcs/,s'>\4qd'J7?XR8M@q>RKs()+?s(2FIBPD0oB`;]ICMIV`
+CH63JDJj</DJsH2Df9T6EH-#=EcH,?FED\KGBS1SG^=[_H[L9mJ:W9'K7\`/K7el4LPUbCMMd=M
+req2DNfK3`P*;,qQ'VE9s-O7`R[]h<SXuIGTV/!QUA^i$UnsrdW2Q\qX/`5%XKAV.Yd(I=Zi7<B
+[C3NR\[oAb]tM.p^VIY$rPSZRs2G#Y$-C?5bg+P]cd'i8c2Z#eblZ28c2,]gcd:%bchu/]d5SFd
+@9Zr>>?kB:L2CpC@UE;)8P2^+ME3p`0J5:55<V(]1G_Ql84Q*<2`Nf[3]fJd4&f3Y<`Juqs%rko
+;GYd+de_Afd/))bc2c,ecLT6QbkoWbcMl&hcHZ@6rm1Sjrm1Vk,J'.]A6`AD?!:N=>?Y<9>[(K=
+?!:E3=BSd.=]SU)=B8I&<rQ)%;c6Lj;X[H^>]X4Y?t!MSAS#LfBkqL$DK'T9FEMePH$XjdIt3-'
+KnbD?Mi<^YP*;/sR$jG6StMdPUo(&hX0&P/Z*UgG\%0)_]t_A"_o9X:aihoQcHstfeCE1&g"P3:
+h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCW%Ts7QHerqQNhrqcQirqu`no_sFAJcG]KJ,~>
+JcC<$JcGcMp&=pgrqu]ks8)ckrqQNf!;?Eb0D+l,o'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg=b*/
+e^W$pcd'bXB5r9IN2s%]Xo>L$YPt^!XoGR"YPYL#XnJjpX8T.!X8f+*WMcbtYHjL\PFncPW<TE$
+Wi`.pZi737ZaI0K\%KJjrOiu\^V.@o]=PVb\[])V['R0JX/i>'X/u6"qlKaus/u7$ql]k#rNH:,
+r3?=-rilC,!j])9rj)R1rj)R1!4;^4!k,SIr4)a:s186@q7-./!4`$="M24W]YFH]s2"NJs2"]M
+s1n]PrkSBF"MVRb^qp#crk\TLs2"`Ps24lT"NA=!a2[nns2P&Yp;d<WaN4A&s2t>aqp#/ds3Chp
+dF$FmrRLr!s48LJg"P39hVR/JioK1^kNV6rlg4$,n*ol<o_%nNp\=U^r;HVGs0Vh+f`BIFrmLfG
+&H;M!nZKaZjmqc:WPtNbNa)LQ**ZfWWN)nqWiK?/>@CoH>[:OJ]t1ba\[oA\['Tb9!4.[bs5YQo
+nCuUIf@]3Gio8qSf[nj)g#V8QdEBVOc,7B5^:_(h[^<?G[^<L?[J.+V>?kH@?XR>PA7]@dBPM=!
+DJsN7F*)SLH$XgcIXm!%KSG8=MN!RVOckroQ^F53StD^NUnsugWiW>+Yd1UC[^`l[]Y;.s_SjF6
+aND]NcHjndeC<($f\5*8h;7)JioB+]k3(sml0@X%mI'H3nF?)?oCMVIp%J+RrV6Egs8)Zjrqu`n
+o_sFAJcG]KJ,~>
+JcC<$JcGcMp&=pgrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg=b*/
+e^W$pcd'bX>%25`G)+S(reLQ2oSEF%++A]gIXcp#K5kpMG("jhIXlfpIsZNsKS+o1L4tA:NrG+:
+NX1])NK&sWMMd8hL]E5.M#W>/M#N7tMYrA4MZ&G7MMmDlN;\b7NWY?&O,s0urf@#>rfR/@!0@,@
+!0R2@!0R2@q2kZ=rK.2FOckt.Q2d-OQ^3s:QN`bER$a5,qj%5Krg*AH#+1aCQC!r*rg3MLnsKNI
+S,&KQS,8]USc##XSc>8]TDP5YTDtPaU&:W*Tq\9VUSO`_VP^8hW2ZetX/rG+YHY:9Yd(L?[']e>
+rjVp;$+[[[]Y2(r_o0Om`rF(BaN;QIbg"AVc-FV\d*U1fe'ljtf%/O.gYCZBi8ESRioB([k3)!o
+lg=-0nF?)?oCMVIp@n@XqYU0frV_?J"nod1US4C\U,VDmgsO?c]nDQ>W63S<J=UmpCJ&blF\GY.
+IXuutJ:LEl:/k1k;Gg8POH,<ZMiE[PLkgbAKnk`h&CeFpW33D%U8"EYXfAG'X/c/p(7h2#X/;GW
+R$a>+P*1rfO,]$RLkpnEn;)Eq>[:]D?t*SUAS,UhC27X'DfKc<FEVkRH@('hJ:W?+L51VCN/is]
+P*D5uR$sP:T:r!TV5L;mXKA\1ZEpsI\@K5a^;%M$`5Td<b0/&TcdC1jeCN7(g=tE=hVd>Oj5f=a
+kNM0plKmm)mdKW6nac8BoCV_Kp@e7Zq#C0iqY^6ir;HTdrdk*#s8DtJ~>
+JcC<$JcGcMp&=pgrqu]ks8)ckrqQNf!;?Eb/+iH(o'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg=b*/
+e^W$pcd'bX77^-I:ZP@L;;b7N55dYE56O822E*\r5Q<tU5<qFr4[_Y(6UX?A6N^+Z:JLg^!DZAf
+9`Iic9E.Te91hcR;Z9Sp<;TSo;Z0Jj;@$3!;Gg7d:f($a;Yj;l;YsAm<;0>j;YO,f<<#qu<;fhn
+<:s5k<;TYr<`f0#r`9&#!*9)#!*9)!s&]5$!*B,"#?P#/<E3.'=oMP&=oMP%=o)5*=]ea->$4s0
+pf[W!!*T2&r*'8,=^##)>Q.e+>Q.n,>6A,9>[./3!+#G-"^bYF?X[FB@fU'<AH?CUrb2=Grb):G
+rbD@Hs(h[Prb_^QrbhaTs)J*\rc/![rcJ0_)0^=NH$FRZH?sseIXcitJ:W?*KS>)5LPL]bM>rG5
+MuJ\8NW5&+OckllPa.Q%R$j>0R[]h<SXuIGTV8'RU8+N[V5:&dW2Q\pWiE,$XKAV-YHY79ZF%!I
+\$rlX\[oGd]tV7r^qmkd_Z7XS`W*pYa2n,!qT/][!6kGf!mf0;r6PDgr6P,brR1_nrR*=<N+?*p
+>[(K<>_@!9BOkLS5Y+O?EfrCD8MMhU.R$$Y0JbLV7n-!;75m1c4?NO)"?TXa;cW`os&&qq:Japb
+eG@Yjde_Afd.u#acMGfcbjWgHcM#T_d/D?:^R'"Q>[1K=>[:W>>[:N<>?tQ@>?b'/>$>!/=B8I*
+<E3(#r`')";H$Ijmne@8>[:]D?t*SUAS,UhC27X'DfKc<FEVkRH@('hJ:W?+L51VCN/is]P*D5u
+R$sP:T:r!TV5L;mXKA\1ZEpsI\@K5a^;%M$`5Td<b0/&TcdC1jeCN7(g=tE=hVd>Oj5f=akNM0p
+lKmm)mdKW6nac8BoCV_Kp@e7Zq#C0iqY^6ir;HTdrdk*#s8DtJ~>
+JcC<$Jc>`Mo`"gfrqu]ks8)ckrqJAFp@e1Po^qbGo'u5<n*]T0lg!a!kN:pfj5T%Uhqd)Bg=Y$.
+eC2glcd'bXBPr0IPHM!gXo>L$YO\jeYPt]uXnAb,V5L2gVPpMqXg#$mOdW2LWrB%!V>de+Yd:aE
+[C3QYrkJKF"1l1]^&GVS]",A_[^<KMZaR9JZE(%+qQ'Xt!j/Q*riQ(#riH1'qQKe#!3uC+s02O.
+!OB!/ZMCj,[/RK5[K*f7\G`r<])K8:\G<]8\Gs,>\Gs)C]">Sf^;0`a!Q)bO`;RRL_>h:O^VKi`
+#Je0k^qmh$_"b_G_Z%IQ`W*pXa8X0[`r<sW`r=$Ya90K(aiXM&s2P,\qT/`[rlYAecHcF6#0tQ@
+bg"J\rm:_qrmh&"-eI#'g"G*6h;7)Kj5f@ck2tmmlKdj*mdKZ8o(;VJp@n@XqY^9irdk*Xrs%<5
+dF-IleGfJ)rqc?ZY.rNImdAo0dC*hQOIMc1>@Cj:WMc\pWi90,@:EVL?!>"V]=PM`]=YP[['?m>
+ZAnl5jQPt$hq?W5gumhZio/bHfA,!2j5o:JbfRrK`PTF*]tCqb[Bd*H['ok>p9t!+DI-[X@:E_X
+AS5[jCMRd)E,fo?Fa&(VH[L6kJ:`E-L5:_GNK90aPEhH$R@Bb=TV8-VVl6VrXfen5Za@0N\\#Mg
+^VRe*`Q$!@bKS8Xd*^=le^rI,g>(N@hr*JRj5f@bkNV6rlg4!+n*fc9rpg*]o`"Lbp@n=\q#C0i
+qY^6ir;HTdrdk*#s8DtJ~>
+JcC<$Jc>`Mo`"gfrqu]ks8)ckrqJ5Bp@e1Po^qbGo'u5<n*]T0lg!a!kN:pfj5T%Uhqd)Bg=Y$.
+eC2glcd'bX>[hDbI,0YSMYr>1MYi80M#3#HI!pEjI=H]qJ:`DmD0(,QIXccpH\R6/K7s5Y!JQ:,
+O8Y(<NsU`'NK&mSMi!7IreLQ0r.tB1rJ:Z5M2@+Hm#(_!!/g`5re^`7N;S\6Nr"h9NrG+;OT1I=
+O8tF;OSk7@OT1ICOT(CBOogi3Q2[*LQiEBOQiEERR@*r>rg*ML!1*PL"IPOBR$[f<!13PLopPiI
+rgEeTr1!YR#aq-OS=?"<SXo\K!1j+\rh'.\"J;?ZT:l.VqkF(crhT[nVl9Tps/Z.#!3Z=)!O8s0
+ZN.B3[K!Z<\%&uY])9/D^;%M$_o)Jl5/kO_aN;TJbKS5UcHjh`d*g@keC<%$f\,!5gt^`Chr*JQ
+jQ,Fbkih9qm-X61o(2JGp%J1Uq>1!drVZWnK)YrO_Pa70U&Ul-ld+A7bf@GNOe&Dge[0k9McFV/
+G'.q%;GM^kIf=j6Inid=<Dugn:lpa!Nf8sXNJ`OKLPLV>O8g]]]r\<<ZDXFlU8G,qX/rA$Unji]
+UT1>lSXPt6R$<esOcYT^MMd4GM2C\Ws'0GJ?XR;O@qB4aBPD6tD/O<4EccGJG^=^aI=Hd!K8#&9
+MN!OUOHPfmQC+)0SXuLJUSOfdWiN8)Yd(OA[^`l[]Y;.s_SjF5aN;WLcHjkbe'uq"f\,!6h;7&I
+iT&tZk2tjkl0@U$m-a?2nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s+14Ks*t~>
+JcC<$Jc>`Mo`"gfrqu]ks8)ckrqJ5Bp@e1Po^qbGo'u5<n*]T0lg!a!kN:pfj5T%Uhqd)Bg=Y$.
+eC2glcd'bX7S$-F:YekB;<gsX4oIPO4?l"o5s[Cf4$Gk-5Q<nY6pj=.6psC06:+ID9he;T:&[fm
+92&#R9MA)P8kf4V!_GpSr_rhrrDWYms&&Si"Aquk:Jpsd!)rkpqc!GkrDN\onl,Ne!*/tsp/V&j
+!``3!q,RGos&K(urDikur`B&#rE&kss&K&!rE'#!#$+f-='&F'r`B,%rE9,%!EiV*=9_r2=]eg0
+=8Q,"=o;J#=o;J'>6S27>?Y05rEK;,rEBP2>?b?;>?kE;qcs,+s'>k7?=-uF?i+72@L-ISAS#C`
+AS,TQBEDg[C&2TECB/2LD>nDVE,T`9EcV/#2KX(aG'A.TG^4R\H[L3fI!g?kIt3*%K7nl1Knb;9
+L51SAMi3OQNK&sZOH>TgPE_>tQC+&.rgWqX0:nf/TV8'RUSFW]V5C,fW2Q\qWiN5&Xf\b0YctF>
+['[6L\$roY]">Sf]t_=t_#D.N_ScAkrl,eqaN2KFb/hWA_ns1&^VRe+`lQ?IcI(%crQtPkr6YJk
+rmL_np!c@JO(;Hu?!LZ??%?R-BObIT5Y"I?@$4t\G<%031Hmr`0JkOU7n6$=77K6r4?Pbh4?HSD
+<)upr<)Zap;c-Cg;:O+le+qGgdJ;/ccf`UAcg]<[d/_Vmd1OgDR<<%G?!:N=?!UW>?!CN<r`oq9
+=]nj0>$"^,<`W:'rDrqu"B8;u;GljYs'0GJ?XR;O@qB4aBPD6tD/O<4EccGJG^=^aI=Hd!K8#&9
+MN!OUOHPfmQC+)0SXuLJUSOfdWiN8)Yd(OA[^`l[]Y;.s_SjF5aN;WLcHjkbe'uq"f\,!6h;7&I
+iT&tZk2tjkl0@U$m-a?2nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s+14Ks*t~>
+JcC<$Jc>`Mo`"jgrqu]ks8)ckrV-Tkp@e1Po^i(Q-h6]pn*]Q/lg!`ukN:mej5T"ThVHu@g=Y$-
+eC2glcHXPTDK'iOSc,\iY4SpnY4AdgY5#.!X;.k5V5:)eVl6MlXK8J-Q^*r6W2ZYlr3H[9[C3QR
+]tD%nrk0#\^qICn\\#A_\%&rV[(!NNZa@$FqPsb#Xfeh/riQ=+Y-.]+riZ:)!3lF*!3l@*qm-4+
+s02O/rj)U1rj)X4Zi%30[/dZ3\G`u<])B2:\GEc9\Gs,>\-KRU]">Vg^;0`a!lDjnr5AcV_o'@j
+_>_=N_#V:M_>h:U_8*k&^q[Y"qSE3K&AuH)`Q#s=aN2KEaiDE@a2\(urlG,[s2G)[aSs6[a90Q,
+aiaM(!mT$9rQYAfs31hpcd:(ddaQ^rrmhM0f\"m2gtglHioB+]roX7D'^4lLmI'H3nac;Dp%J.T
+q>0scrVhBJ[f6Qgh9sa#e("?r1]-q;Xfg46mdAZ4d%G\oO^O`N=^td:WMlepX/T</>%:rH?!P.Y
+]Xt_d]Xt\^['Hs@ZAnl5k3MF+inE#;h<F+^iSiVFg>LZ@io]:Mc-",Ka25[.^:_"c['I$H['ok>
+p9o<P>[:]D?t*SUAS,UhC27X'DfKc<FEVkRH@1-jJ:W?,L5:\EN/is]P*D5uR@B_<T:r!TVPgDn
+XKA\1ZF%'L\[oGe^VI_(`Q$!?b0/&Td*^:ke^i@*g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8B
+o^qhLp@e7Zp]1-hqY^6ir;HTdrdk*#s8N%K~>
+JcC<$Jc>`Mo`"jgrqu]ks8)ckrV-Tkp@e1Po^i(Q.Ilorn*]Q/lg!`ukN:mej5T"ThVHu@g=Y$-
+eC2glcHXPT?t*kjIYs$?M=QQ%Mu/D/M$&*PI!tpAs+(Z1KQ1pNH?sscI"m<.KS98Xs,Ho9s,RbN
+Nf8sUMi!@MM27%GLPUbAM#)u2M2I4Lreg`6onia-r/1H2!/g`5s,-i7rJ^c9qMtT:!K`BANrG+=
+OSk17O8tF=OSk7@OT1ICOT(@BP5^XFQ2[*KQO&tFR$a>1R$a6>Q3EV@Q^=#(rg3SNs-EbRQi<<N
+Qi*6MR/i]RRJrWYR@9M2R[a;FqO@MQ!h5^MrgWqX!hGjPr1<kZs.97]rgs.^s.BLgTV/!Qr1j:f
+s/#an!3,mr!3?(""0Si3Z2V$1['d=@[K*f8\I6$^]=Y_g]tV7t_SZ;j(WFD7a2lBFbK\;Xcd:%d
+daHUneC<%#fDaJ'g)o))hV[5Lio9(]kNM0qm-X92o(;VKp\=R\qu$Bjrr.KK5l\m'VP0`YUSI.o
+gsaNg^4V$.VSpu]L9,T*:2E[KF\G\/J:N-"It)uE:ek"i;Gg;QO,o<\NfK*XM26tCL5:oj-J6&6
+Xfo(1USFW`YH=k,X/MkjVPBueX/MSXR@'>,PEV/kNK&gRreLQ2mtc<p>[:]D?t*SUAS,UhC27X'
+DfKc<FEVkRH@1-jJ:W?,L5:\EN/is]P*D5uR@B_<T:r!TVPgDnXKA\1ZF%'L\[oGe^VI_(`Q$!?
+b0/&Td*^:ke^i@*g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo^qhLp@e7Zp]1-hqY^6ir;HTd
+rdk*#s8N%K~>
+JcC<$Jc>`Mo`"jgrqu]ks8)ckrV-Tkp@e1Po^i(Q-h6]pn*]Q/lg!`ukN:mej5T"ThVHu@g=Y$-
+eC2glcHXPT7S$3K;;G(9;>!`s4?Yej5!;%k5X.M"6T?ta4T.DT6pa:/6UX:/6:4OD9he;T:/:d^
+!_l?^r_!5`rCd#ZqGdDl!)iboqGR;is&&hqr)3MkrDNYor_ibnrDNAg!*&nq!*&krr)EJlr_ru"
+<`N,p<W?%u<W?%s<<-(s=8c5+=&r@'<`W:&r`&r!r)`nu)HKp@=BAO(=&r=%=BSa/=]ea,=BJ^/
+>$G-4r)a,+=BSd1=o)>"=nl1s>Q.n->Q7n+>7"P=>?kE;>$>-8qd'5.#@CeD?XR8K?iFI4@K0j<
+A,^!CAnP^gB4trWBFeflC27R!CM[j)DJsE1Df>Sn#B=d*F*)MIG5c^cGlN'hHN&7ZI!pElIt*!!
+JV&N,KS>)5L51SAM2I1LNK0$[OHG]hPEhE!R$a;1S"#q<SXuIHTq\9VUnji`VPgAkWMuntX/rG*
+Y5YU:Yd(L?['d?O\@B)\]=bhk^VKibs2"cRrl"iU"NJL&aN=G(s2tno`l,^.]t;"o_SsU>c-QC:
+rm:VkrR1\os4$tsqUYMn4irt$>ZtB;>?kH`?ZKgj@9l,`91iNR:ch`7/138*5!:SV1It#*7Rom:
+3B9#^4$5Ve<`N+";cQgr<)ccp;#jMme,%Mgd/_Pcce6\5dI5N`dj2l%F_4rd>$YB=?!:N>>[(H=
+>[CQ:=B\j3=]S^+='&L)<EE6#<;oer;=78->?kH@?XR>PA7]@dBPM=!DJsN7F*)SLH$XjdIt3*&
+KnbD?Mi<[WOckroQ^O>5StD^NUo(&hWiW>+Yd1XE\%0)_]t_A"_o9X:aND]NcHsteeCE.%g"P3:
+h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCV\Jp%J+RrV-BgrqcQirqu`no_sFAJcG`LJ,~>
+JcC<$Jc>`Mp&=pgrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg=b*0
+e^W$pcd'bXA8l[;LTCBUriY:bqlTq&m&p>i!3#mo5,>$MUo1)iWN<5,Y*PQQVPUQ'['R3L[C<WQ
+]t_=r^:V(n^:q7l]=>A^\$`ZT[^ifPZF%$F['d$<XKAV-rN?7)YPtd*Y5kg*YPbX(YQ(m-ZMq30
+ZN%62ZMq-/YQ;#7qm6.+rj;m;\%&rWrODg:rjr*>r4)F1s0rEH]"5Md]tM4s_86,g"N8="`Pqhp
+!5ncPrke`Qr5&EKs1n`O^])%E_%4E#`5K[7`lH0AaiVWFa2\,!%EQZ3a2l<AaN)<?a2Z*t`X9c-
+ai_cLbK@uNbl5odc2GrfcRR;hd*^:ieCE.$f@\a0gt^fFiT&tZjlY^gkNM0qm-O--n*ol<oC_eM
+p\t!gqZ?]prdk*Zs8V$\f$r1!ec#M%r:fc`XjuG!mb=JZV/h<P@\90\AR;C9W2uu!Wa&b3@UNMJ
+>JRtc]">Pc]=G>VZi71gs!['umdoGmf\>?Lki1R[gtCTGgZ%5TimuAtaiMT@_8*^q]!o&QZa[:0
+[WYk[>[CcF@:E_XAS5[jCM[j*E,fo?Fa&(VH[U?nJV/W1LP^nINK90aPEhK%R[]k>TV80XVl6Vr
+Xfen6ZaI6O\\#Mg^VRe*`Q-'BbKS8XdF-Lnf%8R.g>(N@i8EVTj5oFckiq?sm-O--n*fc9o()DD
+o`"Lap@nO\s7u]kr;6KkrVcBfJcC<$rr7K~>
+JcC<$Jc>`Mp&=pgrqu]ks8)ckrqQNf!;?Eb0(ec+o'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg=b*0
+e^W$pcd'bX=^YfUFG5U0fSTB\oS`^+!.Xuq"+,EBI/\R(It3'%JT,^WI!^O"KnTAY%>Bh'OH5H^
+NfK0]N/`ksMZScmM>iD3LBiWlLPL\EN/ROkpl#*.r/:Q3rJUZ6!K2p7MuJY8NV8A4O8b1=O8Y1<
+O8+e:Oo:C2OoLUDPQ-pLQ^7W<pR1oFrg*SNr0RJNrg<_Ps-E\Org<_RrL3bSrL3_R!1NnVrgNkV
+!1NnVs-itWrL3bU#Fq?USt;LDT)G;]T)YA\ScGD^TFmljTV8'SUSOZ[UnjlcVl6Sori,t!rN$X6
+Y-,"5Z*LX?['d?N\%&rY\[_XM&%fEb]=bkl^qmk)`5Ta:aSs<]b7MnCcdC.gdaQ[peCE.$f@egU
+fcJl%gtprHiSrnYjlbmnm-a<2nalGIpA"I[qu$Elrdk+Ls!>adW2$,^US@+mh:0]i^4_*/Ur(Te
+H'WVY@r"h`FELMXJ:E'"rdXoC'3/"0;,NF9Nf8sXN/igQLkpe@L6)?UgV0bnYd:@*V5C8sY,n_*
+W2?PoUo:8nVk9HIR?j-;OpI//Nf&^NLkpoVLj!!->[CcF@:E_XAS5[jCM[j*E,fo?Fa&(VH[U?n
+JV/W1LP^nINK90aPEhK%R[]k>TV80XVl6VrXfen6ZaI6O\\#Mg^VRe*`Q-'BbKS8XdF-Lnf%8R.
+g>(N@i8EVTj5oFckiq?sm-O--n*fc9o()DDo`"Lap@nO\s7u]kr;6KkrVcBfJcC<$rr7K~>
+JcC<$Jc>`Mp&=pgrqu]ks8)ckrqQNf!;?Eb/G/Q)o'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg=b*0
+e^W$pcd'bX6q'^B:Jo\>lV[XX!^/S,r]U9D!BiRE5Q="V5;kSc5!D>$6pjBA6Nf\A:JX^a9`Ild
+9F4Ee8kVfL91qrOrCHu]r^m&ds&8kqqG[8hr)<Plr_`GgrD<Pmnl,Ne!*9)!!)rhq!*/tss&K%t
+rD`hsmo9?gqcE_ur)`l"!*B/#"'8T,=8c2"=8l>&=T2D#=T;M1=BAR+=BSd1>$:i,!EiV)=nu8$
+=n5_r>Q.k->Q%h,>Q7k,>Q.n-?2n10>Q7t)?2n44?sd7<?iFF5@K'^@@q&qYA7fCar+H"B!blCa
+rbMOM!,_^Q!H2rUEW:(ZF8p=gF`qqPGBeCYH@#R;s*Xfps*k6'JUrH,K7s5X-&.22M2I1KN/WaW
+O-#KdPE_;sQ^F52S=Q1?SXuIGTV8*SUnjjdVZ3P#W2ckuXK8P+Y-7i/s03*@['d?O\@B,]]Y(tn
+^qdec_?Iiq`5T[6rPniX!QiL_bRht?aN)<>`Q--Gcd:%ddaHPBdeVAjeGIenf)""ufJCg>Bj=hH
+>[(K>K3iS4@prS,5YOdSO^0q11G149/O)B\1c%]o7Ros;7Q3:e4?GVe4BMG[#ZXf$;c?Rj:Jpf5
+dF%7-jO4LVT6FjP?<^]??!UY5>o[*T?!L`>>?>'5>?P!.=B8O*<`N1#<)lmr;H$H\:j-&J>[CcF
+@:E_XAS5[jCM[j*E,fo?Fa&(VH[U?nJV/W1LP^nINK90aPEhK%R[]k>TV80XVl6VrXfen6ZaI6O
+\\#Mg^VRe*`Q-'BbKS8XdF-Lnf%8R.g>(N@i8EVTj5oFckiq?sm-O--n*fc9o()DDo`"Lap@nO\
+s7u]kr;6KkrVcBfJcC<$rr7K~>
+JcC<$JcGBArVc`nr;6Njs7uZh1ACM9p%@tLoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLgtUQ8f@JI#
+dF$:cbfaU=H@CgPrN6(%iihFGs,@&@VuEPBV5C#aV5^JpXKJY/Z_=5#Z*LdG\$rlV^;%:m^:h1l
+^:q@q]Xthi\[_XJs0W0A['d0E['d9I[/R3.Yl:j*Yl1g-Ycmo-rNZC,!3u4'!4)U/!jJr7r3Q.)
+s0_d6s1&$<rOVs<rODO2rjW9G]=Y_h^;%J!_Z%FQ`V[[T`<jK#_SX.*_Sa7-rkSTMrkS]P^:qAY
+_>h@R_o0On`r4!Wana!WaSj-Z`r!aT`r='fb0.rMbKJ,ScHa\Zrm(Pg!7(Si!7:_m!RfKsedC$]
+g"P6=i8EVTjSn<AkPs`Ml0I[&mI'KCnHJLUo_%qPrqQNi!rMopJcE:\#N=areC<(#eGfIlr:ffb
+XN]Pgn)U4[_L[E&A=T0\>[OP3WN<)"WENP1@UNRB>6D[R]=\'T#._1LZa$a=NW1EjnaH)-gY1EB
+lfmKhi7uuJkhP4Yk2Y(=bK@lH_SX+%]=PJ[Za7'Gn$[CC>[1QA?X[DRA7]@dBPM="DJsN8F*)SL
+H$XjdIt3-'KnbD?Mi<[WOckuqR$jG6StD^OUo(&hWiW>,Z*UgG\%0)_]t_A"_o9X:aihlPcHstf
+eCE1&g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCW%T!quB_rqQNhs8)ZjrVZZno_sFAJcG`L
+J,~>
+JcC<$JcGBArVc`nr;6Njs7uZh2#$_;p%@tLoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLgtUQ8f@JI#
+dF$:cbfa1!Bl/'KMMfuAq24s*r/)G1Ci=cNI!g9hH[L3hIXlp!JV/StHA$m(L5(K_LB!;RN/`mY
+NfB$ZO,]0ZNfT'UMMd7ILPUbCL51S@reCK4rf-f6oS`[,!K2j5MtN&/NUi,0O8Y1=O8+h9OTLW,
+OSY+=OSb.?P5UREQ2['LQi<BLRJiQSR/<6MQN*9OR/WHNQi`VAQi<<NQiEHNRJ30KS,\rVRfJoV
+S,SlVRJiTOS,o1Pr1EhW!2'4_rLj4crhTOis/#dpri,pt!3?("!3Q7'"g>2:Z*CY7[/RN;\[]/[
+\c02?],J>q^;%J"_SX4/`Pom<aN;WKbg"J[dF$CleGe"uf)O>&f\-8Xs4\FHh;-rGiSrt^kiqF#
+mdTc;o_/%Sq>:-irdk+Jrr^?BWhfWh/u#,_g"4Kh^4_**U;53mH&\>+@r"naF`gDTJ:N-#It)uE
+:et(j<)QRhO,f3Zrf.2@MMHtCLPCli-JZA<ZEgg9V5C,kZ*1:2X/MhuXeVkpX/M\]S!o_1PEV/l
+NK&jRrJC!!G$8-U?!grI@Uiq[AnYjmCMds-EH6,BG'A4XI!pKpJqJc3Ll%%KNfT<cQ'Rf*S"-(B
+TqeE\Vl?\tXg#(:['mHS]"G_k^r"".`lQ9FbK\>ZdF6Uqf@S^0gYL]Ci8N\UjQ5OekiqBum-O--
+n*fc9o()DErq-?dp\4[^s7u]kr;6Hjrr)KgJcC<$rr7K~>
+JcC<$JcGBArVc`nr;6Njs7uZh1ACM9p%@tLoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLgtUQ8f@JI#
+dF$:cbf`FE8ki&VbY[n.#ran,5!;"l4?Yk,55mbN5X@V$4?Pq+6P)R[:JOVX9MJ2T9MA/T9MJ7Y
+9*7dX8P8nP!D5r^;Z9Vl;ufkp;Z0Pm<;ohh;Z9Mp;H$Qb;u]f&<E)pr;cH^r<V08c<<-(r<W6%t
+<rc:q=8c5*=&r@%<``E$<rlE+r`K2$!EWG&=T2J'=92K*r`T2%!*T;)!*T)#r`T)$s'#J,r*02+
+!+#M-r*'8.?!L\4>l.h+?N4C3?N4C2@/aU6@fKp=AS1mP!G?$BB*W*aBkhBuCi')gs)7pW"`eU'
+F*)O'FoQXbG7AeBH$Xd`I!g?iI=?Zrrdk*$"+u8[L&Qi,L]<3&MN!LRNK0']OckolQ'R`&R[Tb;
+S=Q4BT:hmPU8+N[V5C/gW2Q\qX/rG*Y-5(6Z*L[A['[6M\%&uZ]=bhk^V@S"_8=(,`5MPmrPoMk
+ai_cLbKS2Tc-FSXcHaeadehMmeGdtuf(mhrf)=4tf_X;"g'#lpBj4d?>TI$S>[_Mc@prS.5Y=XO
+O)?p@:bXLZ/jDH\0/H6mr^Reo6oI"a4?GVf4?HMA;cH[q<)Q[n;Gg7fV:4h]/'"?.Am\eI?<^]?
+>$YH@?!LZ??!UZ7>?Y34=&r@(=B8L(<`E's<)ZXm;=78(>$P<<?XI5N@q9._BP;-rD/O93EcZ>G
+GBnL^I=Hd!K8#&9M2R=QO-,TjQC+)0S=Z@HUSOcbWN*&%Yd(OA[^WfY]Y2(q_Sa@4aN;WKc-F\`
+e'uq"f@em4h;-uHiSrnYjlYail0@U$m-X60n*ol<o(2MQo`Fj]p\ssfq>^<hqu-HlrUg)?s+14L
+s*t~>
+JcC<$JcGBArVc`nr;6Nj!;ZTg1ACM9p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK=L8I=IH`r2p"%qlfLlpoie^*fuDBNK97$Unsr`USareW2m&$YcY+6Yd(L?\%&rWrk8?G%
+D0?f^V7Fo]=GJ^\[K$I[LKXN['[9LZaI0KZ*Ug@ricC+ril@+r3-7-ZEj;2s0D=(s0D[0!4)U1r
+NuU2qQp:2[f*]5\,a)=])0&;\FmE4\-0@R]=bfU^';?g_8=+.`VdaU`rj?"`5DSkrPSKJ"2M[c^
+\ttI_$@lr`5T^9aN+8#rQ5#Y!64iT"3/9t`Vm^S_uRjWa8j?]b5TQabl5mHc-4ATbfe8Vcd:%dd
+F-Oqf@S[-g>1ZEiSrnXjlY^gkNM-olKdd'mI0Q6naZ2Bp@\+Qq"X[\rqc]oJcE:\#NOt#e^rC'e
+c,RmqtTcbXMEZYn*$Oaad7mH>b%FX>[XS5WN<(uX'8h6@:<RC>7J?\]Xthi]XkPZ['HsANW1Hlo
+C);1h:pcLmciimi7uuQkiV!fjl=q=bfe)K`5'.&]Y(e_['R-I[ICVP>$G6;?=.)K@Uit\B4u!pC
+i4-0EH?5EGBeF\I=?]tK7nu7M2I7OO-#NhQ'[l,S"6.EU84W`W2cr$YHY==[C3TU]=bkm_8=.0a
+2lEHc-FY_daZdtf@\g3gtgiFi8WeXjlYail07O#m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6Nlr
+Ug)?s+14Ms*t~>
+JcC<$JcGBArVc`nr;6Nj!;ZTg1&(D8p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK='uC2SFIM<p*(DJa6,E,^=)HP1^TI=?WpJV&H'K7no1KSP;<L]3;UNK9'ZN/isYN/`dT
+MMd7JM27%ELPUbCM2$e@M1p_>rJgc7qhkH5q2>93s,6l6r/:T6!0-r9rJgZ6rf-i9rf?u=!0R#;
+oTB*6rK7#@s-*MKrg!POq3h5Ns-`nSop>]GrKdbTQ'IZ$Q^F0<RJ30LRf]%JS,SlUS,\rSRJrWT
+S,SrXSH,8\T*:m[T:VXFrLOCiT:_dLTqS3UUSO^bV$!TmWN6#u!3?("!3Q4&!3lI.s0Ma4!k#JG
+rj_s<s186Brk/9F!PcGL_>hFQ`=Ku/aN;TJbK\;Yd*^:jeCFNK+P59!g"P07gYCZBhr*JQjQ>Xi
+lg4'.nac>Gp\F^`rVhBJr;SXpXK/4mUSOZZj5&D5a1d7[P+fG7_g7<>FCo>]G'8"&;1X=LJU`0"
+:/=Yb<)Z[l:QUWtNW+q=NJd^ks+c[8.c.tDZEgg;V5L8sZEL@3X/Mc%XfJM%X/M\_S!o_2P*;#j
+NfK'TMMR(Gmtc?p>?kH??XR;O@qB4aBPD6uDJjE5F*)PKG^=^bIXm!%KSG8=MN!OUOHPinQ^F52
+SXuOLUnsufWiW>+Yd1UC[^`l[]Y;.s_SjF6aND]NcHjndeC<($f\5*8h;7)JioB+]k3(sml0I^&
+mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`no_sFAJcGcMJ,~>
+JcC<$JcGBArVc`nr;6Nj!;ZTg1ACM9p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK<:E9h\>[_,1,."unV&3B92cr]C0Br]U9Fr]gEL%R<<I6UX=06UF.9:JOVZr_3Acqb.5f
+9hS/Q8k_kV8cME^8H;B^8c;Qd;uKYq;uBMn;u0Jh;uBPl;$'Wo<;BJl;Ya8j<<#ns;ufql<!$'!
+<;BPn<rZ/%<`N1#r`0,&<`W<#<r,l$=BAO(=',B%rE0&#s&o>&s&K,$qcEi$r`K/$qcNYt!a/]1
+rE8esr*02+s'>P-r`]A-ra#M.!+#S/q-=53?sm>J?=.(=@/=:5@UisJAc?9BB4h-Urb2=HrbDRO
+D/T;j!H<&WEXd,5G'A+PGBeCYH?ssdr-\TpJ,Xs&JV&K+KnY9\LIR)VMMd=NNK0$[OHPcjPa%H!
+Q^=,/S"-">StD[LTq\<WUo()hWMunuXK8P+Y-5%5ZEggD['d?O\@K/]]Y(qk^;%M#_Z%FQ`;[aT
+`s'Q)aN2KFrlY8as3(_mcHab^d*U2>e,Ro"e'upurRV##s4I5#s4I;'qqCo$r7isVS7u54?!CQ;
+>[2VqCL^dW6:"+6<fVJd5$0Zq2C^pT4"iB]84c<A779$o3'9;%497NDr_rqt<E/oqs%rboYgi!h
+psotuUNpHY>[(N??<g]??X@%;>SU@L>?Y35>$4p/=]SX*=&r=%<Dujqr_`_lmneC8>?kH??XR;O
+@qB4aBPD6uDJjE5F*)PKG^=^bIXm!%KSG8=MN!OUOHPinQ^F52SXuOLUnsufWiW>+Yd1UC[^`l[
+]Y;.s_SjF6aND]NcHjndeC<($f\5*8h;7)JioB+]k3(sml0I^&mI'H3nF?)?oCV\Jp%J+RrV6Eg
+s8)Zjrqu`no_sFAJcGcMJ,~>
+JcC<$JcGBArr)ior;6Njs7uZhs7ZNerq.i7oCDJBnF,i6mHj3*lKRNqk2kX`iS`VMh;$`;f@SR&
+da?Cdc-+7GEI!2)q6'Uus/u!rriZ(#jfUM1P`Li`N/s.#USXi_Vl-JhW2chtXfSh4Z*LXB[^Nl_
+]Y2"m]tM1o]Xthg\[f2X[^<NO[Bfe=$*q%JZaI6J['d7;Yl1j+YlD!*ZMCd)ZM_'/Z2q;;riuI.
+"1,DC[/RE1ZiIN5[/RH6[^Z4Fs1/0@qRQU8q76O8&\5E]\[f;`]Y(ql^;%M#_Sa=j`W4'Ya9BW(
+`Pf^4rl"fR!lDagrP8QN^VB`_s1nlV`5K[9a83mVaT0E\a8a0Ya8X'Y`;[X__SO((^VIY$`5]g;
+a8X1,b0.uPc-+5Mai_cLbKS5UcdC1heCE1'g"P39hr*MSjQG[fkNDj.rosOMm/HGdnF?&>p%@tM
+p\=R[qYU0fr;Q\Hs1A:9j65LSf[n^*rr3u9qX^hj^=qlAlD22/R"CE]SXc6U?sTn5Xf8;$r`g+?
+@UNGF>en%b]Y(qk]=52TZa$`os!d7*n+,Jnh;.VgkiLg^guItilfR9himuK%bK.cD_83q#]=G>V
+ZF%*Jn@!@?>$P<<?XI5N@q9._BPD3sD/O93EccGIGBnL^I=Hd!K8#&9M2R=QOHPfmQC+)0SXuLJ
+USOcbWiN8)Yd(OA[^WfZ]Y;.s_SjF5aN;WLcHjkbe'uq"f\,!6h;7&IiT&tZk2tjkl0@U$mI'H3
+nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s+14Ms*t~>
+JcC<$JcGBArr)ior;6Njs7uZhs7ZNerq.i7oCDJBnF,i6mHj3*lKRNqk2kX`iS`VMh;$`;f@SR&
+da?Cdc-+79A86.5b),bJ(34D4D/=',E.3+[H[:'eI=-HlI=Hftr.>')L5,Vd$BL1*O,f0XNfB!T
+re^Z2!f;\freLl8LkgeAM2$eAL]3;4N;e_;N/NUQpP]'/re^Z4rep`6s,6l8r/L]9rJgc9rJq)C
+O,oBarfR,?s,R/AoTB*6rK7#@#*Y=;QC!r*q3h5NrL!YQq3V,Irg3\Pr0@MOQC!u,R/NHIRf/`Q
+RK/iURK/cTQj/nER$jD3S,SoYSY#_N!1s+Zs.97_s.KCcs.]Og#,J)mVl-Jnri>su!3Q4&!O/j.
+Z2q;=rj;a7rjVm;s1/6D]DfJC]`Pp__>_;2_o0L4`l?*@aiMTIbg+M[d*^=lf%&@&f@\d0g=k<:
+h;7#HiSihXk3)!pmI0N6oC_hPq>:*grdk+Is#S3%XfA.lV5'dPe_AEl^4h-$T<lk_H]+22@r6"*
+F`pGV:4n%IIt3&F:Jaed;c?OiOcPN_NK0$YMuJM5LPCli/)\4HZa-p;VPgB'Z*(11X/N,4Y-4n*
+Wi2V_S!o_2Pa%>oOH#6XM26tEM=?=A=^#'8?!grI@Uiq[AnYmnCMds-EH6/DG'A4XI!pKpJqJc3
+Ll%%KNf]EfQ'Rf*S"6.DTqeE\VlHf"Y->1;['mHS]=bkm_8=.0`lQ9Fbg+P]dF6Uqf@\d1gtgiE
+i8N_VjQ>Ufl07L!m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$s8RT~>
+JcC<$JcGBArr)ior;6Njs7uZhs7ZNerq.f6oCDJBnF,i6mHj3*lKRNqk2kX`iS`VMh;$`;f@SR&
+da?Cdc-+6u8PDml;#`T^3]T,[3]fJdr]L0Cr]^EI5lO(\6UF+,6:""8:JFMX:/+JVr_*\o9MA)Q
+92%rN8kDSQ8I7p[8P2TH8P2QGr_i\ns&8tsrDEVoq,IAmrDNMk#Z=Mr:f1+h<)`cor_rbnrDN\q
+r_ierrDN\qrDi_orDiksq,RGqr`&u"=8>ns=8c1t<rc;#<s)K)='#<%rE0)$s&f8%s&K,$pfIQ"
+=8,ho>5DD%>5;;&=BSf+=o_e'>QS,7>5h_+?2\%.?2n.0?2e+-?2n72?Na\B?sm@@@/jR<?t!GO
+@:EaGAc?9ABDuKCBDuQFBkmW_s(hmVDJsK5EH(ks!d&R.rc\?crceZnH@($eI=?VDIL:RTJUrE)
+K7nr4L]3,0M%#<$N/`jXOH>TgPa%I4Q7SAiR[T_9SXlCGTV8-UV5:&dW2ZetXKJ_0YHY79ZEggD
+['dBP\@B)]]=krX^Au(K_Z.RR`<O?&`l?*@ao0B^b6#o4c2>leci2;ndaQ\Ee,e+Nrmq8)g"G*X
+g\ok(g\]e&h>5t2et$S^>Q.nJ>?k?fCi<lo>!bPG8lCOr3Bfne0/bXO4ZkDS2#^#I7n#oH2uko9
+4:=5O<)cjq<)ljp;cEZmjOW2<jjrhN(<r_(B4"nI?<gc@>%1fD?!LT=>\%&ErE9;)=BJW'<shu-
+=&r7!;c?Rl;=@>%=^#'8?!grI@Uiq[AnYmnCMds-EH6/DG'A4XI!pKpJqJc3Ll%%KNf]EfQ'Rf*
+S"6.DTqeE\VlHf"Y->1;['mHS]=bkm_8=.0`lQ9Fbg+P]dF6Uqf@\d1gtgiEi8N_VjQ>Ufl07L!
+m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$s8RT~>
+JcC<$K)bKBrVc`nr;6Njs7uZhs7ZNerq.i7oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLh:pZ:f@JI#
+da?CdbfaI6F*WP<o<8.ror\4rpoih_s.1:$Q&pudNK96fV5'fZUSk#gW2Zi#Y-5"4Yd1I@^VBc]
++ht_)^qRLm]=>J`\%9#V\$`]SZa6sD['m<M[^NQLZ*Uh9Ykt[.Yd(I=ZMq31ZMUm-Yd+/4!OK03
+ZMq-.ZN%9#Zj=(J[^WcV\[]0;\I5pV\%&rZ]"G\h]tXK\s1niT_o9X8rl5#[rlGVj`l?!;`Pod5
+_ns:+_#;(X^q[Y"^r!t+_o0L4a8*gVaoBE_a2[tr#faj&`5BF,^qTc\"hqae^r""g_uRgV`ra?&
+a8O$W`tZY=bKS;[dF-Rrf\,!4gYC]FioB,!k5OTEl2U#clg4$,n*fc9nauJHp%J.Uq"X^_r;?Nm
+rdk*]rs.WNk1SG?f@Kp#1]$e8XM3<NnEQg``h\3JP%'uS>[h$BWN<)!XJoB.>%1iE>[5.[^:h1o
+]Xt\]['R$AY`A`4lh'Z9j5&PKp$Lu(j5AVVn*0-!j5\tGd*BhVaMu*5^q74i\$E<H\$YY5G?J*R
+>[:ZC?t!MSAS,RgBkqO&DK'T:FEVkQH@('hJ:W?+L51VCN/is]P*D5uR$sP:T:r!TV5L;mXKA\1
+ZEq!K\[oGe^VI_(`Q$!?b0/&Td*^:ke^i@*g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo`"Lb
+p@n=\q#C0iqY^6hr;QZerdk*#s8W+L~>
+JcC<$K)bKBrVc`nr;6Njs7uZhs7ZNerq.i7oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLh:pZ:f@JI#
+da?Cdbfa'rASQ:=mYUdtg55fds)n]kEGo]2Ci435Hi89jI1CaSIt*$#Jq8Q+KRni=O8b.POH5E_
+O,]*XMiEUNMi!7GM2@,fLC/loLkgeBL4tD;NW"h9MuAV0MuJV6M>iD2MuS_9Mu/J4NW"k;O8=n4
+O8P(CO,f6]O-'4#!0[8Br/gl>!0[>F#Ek=:QBml(R/NHQRfAfURKf7MR[]b5R/30LQN!6QQ^3s9
+QN<MAqO.2Krg<bTr1!\S%%E]RR@'>-Q'R`&Q^I`>"e(pLR[foHSc5/ZS,\uYSc52dT:hmPU8+N[
+V>[:mWN,ru!3H+#rNH7+s0DX2!4Dg7s0r!<s1/3BrOi0Ds1SfT_84"*_o0L4`r=$Ya=bTWb08/W
+cd:+ie^W.#f@\d0g=tE<h;@,JioB+]k32'qm-X<4oC_hPqYU3hrdk+Is"qiuY,e@pV50jSe(iBn
+]t&`WSZp;XI#FSA@r6$XG'6SX:P=7LIt3'!:/Obd<)ZXkOcYY%N<5#pM#N/0L62Ecj2%q+ZEgL-
+Vl@>6Y,nb+UU7J4Y,eS%V4aELR[BG,PEV/jNfK!SLkpnEn;)9k>$G6;?=.)K@Uit]B4u!pCi4-0
+EH?5FGBeF\I=?]tK7nu7M2I7PO-,TiQ'[l,S=Z@HU84W`WN*&%YHY==[^WfY]Y2(q_Sa@4aN2NI
+c-F\`daZguf@em4h;-uHiSrnYjlYail0@U$m-X60n*ol<o(2MQo`Fj]p\ssfq>^<hqu-HlrUg)?
+s+14Ms*t~>
+JcC<$K)bKBrVc`nr;6Njs7uZhs7ZNerq.i7oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLh:pZ:f@JI#
+da?Cdbf`=B8k`#Xq,$rcb>A1#&3Dp53&io[4$5Se4Zknn5!]*3r^$QO"@>IC9ht[^"\qcd9MA1Z
+9En-`92%rN9);-W8d.jY7nH9Mpf%2j!)r_nr_r_mrDW_q!)rhor_rhprDN\qpeq/jr)<Sos&B,"
+;cEZps&K(up/Uuj!EW>$=8l5/=&rC'<E<+"<``@'<q9<"<``C+=BAO(='/R-mo]Qlr*&r"s&f8%
+r)ir$s'#G*r*02)s&fA)>5hb)>R+P>?!LW??=3\<!*oM0!+5\4ra5\5s'bq:s'u.AAH$0?BE)QD
+BDuTEC&VoJD#\>TDJsK6EW'n]F*2VKG'En0!."Qi!IK4lILC[WJqAW.K7ei3L55_a!/g`7s,K%"
+P*;,qQBml(R$a;2S=Q4BT:hmPUSXfaVl-JnX/i>(Y-5(7ZEggD['d?N\%&u[]=Ybj^V@S`_$%Wm
+`5K[pa90Q*aiXP)"O#$5c-?75rm1Vks3^horm^tus4.2%rRh,'q:l83gt^Z=gt^`Aptki(6J.rJ
+?X6uD>[(K=Nb`ZL@p2o"6V:.)K/l+j1+tL@/Nl3M1Gh]o8Ou9=7Q<@d4Zbbh4BGK^<Dldr;c6Om
+;,L+dn(>V2kLfXa)U540BO>(L?<gc@>%:lE>[1K7?=-l@=^#!3r`9S1='&L)<**$u;cH[n;,QdY
+G?J*R>[:ZC?t!MSAS,RgBkqO&DK'T:FEVkQH@('hJ:W?+L51VCN/is]P*D5uR$sP:T:r!TV5L;m
+XKA\1ZEq!K\[oGe^VI_(`Q$!?b0/&Td*^:ke^i@*g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8B
+o`"Lbp@n=\q#C0iqY^6hr;QZerdk*#s8W+L~>
+JcC<$K)bKBrVc`nr;6Nj!;ZTg1ACM9p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK=F=G^PCMo<8.ror\4rlEBl`s.0.\31H4rN/imWOHcQ:US=W`V5C2kWN<8)Yck15^V7@p
+]tD"k]tV.l]=YS`\[o;Z\$`WNZa@!F[C6(B$+I7I['d6GZEUS/Z2_-,Zi@?0YlM$-YlM*/Zh:U(
+Zh(R'[K!Z8\,<c/\c98=\c9,B\@K5`]tOEZ!PcGL_>h@P`;[aXa2l@#aT0K_aT9K'rl,&Z_ns:h
+_$@cl^qmk(_o)Dk!6=oVs2k;^s2OrV&B;]-`59=)^:h4m]Xtbe]=n3XrP&?Kr5'Dh_SX4/`5Td<
+b082YdF-Orf\,!5gtglIj5]5!jo=HEkiqC3lPJpTmdKZ7oCV\Jp@e=Xq"agbr;HWnrr.KK]`/5r
+mH3*Ug"G!Us"jNEnu]g]lLO8;_o]$1P*04ES=F+sYH"b(X/`.&?!:]E?!LXP^V7Ir]Y(kf[C!9F
+Ycs/f.IHcpm,[$[iUuU'jQ#.So'GW*jQ#4PeBuRcb/_N=_8*ar]"#,R[(!F2[X;4]>[1QA?X[DR
+A7]@dBkhF#DJsN8FEMeOH$XjdIt3-'KnbD?N/`m[P*;/sR$sM8StMdPV5L8lX0&P/ZEpsI\@K5a
+^;%M$`5Td<b0/#ScdC1ieCN7(g=k?<hVd>Oj5]7`k32'olKmm)mdKW6nac8BoCV_Kp@e7Zq#C0i
+qY^6ir;HTdrdk*#rrE(L~>
+JcC<$K)bKBrVc`nr;6Nj!;ZTg1ACM9p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK<stBP_jIm>:^tfSTWNrcS?bEH(no$Z9m(H?spcIXQTmIK"^'JU`<'JV&uENfT5!N?=4?
+NfB$VMMd=LLkpnCLkge@LkpnDL51S?L51V?L5#G^!f`.tqMYB2re^Z4rJUW5s,@/?Mi3OQrJgi;
+rK$o;r/^l>$]gC1O-#HaO,f9^OSb1<P5g[CO9C]/P*;+,PQ7!JQN*9OR/WNORfAlUS,o(Hrg3\P
+qO%;Ls-<_QR$dW9qO7DO!1NhTr0dq[R$O&'QBmf$QN!6NQiNKPQiWVDr0[SSS,SlVRh_HaSY)RK
+Tq\<YV5C/hVl6VrXK/D(rN?+&"0f&9ZMq04['d?Orj`!=rjr'@$ba3d]tV7t_8=+.`;[b4`Q$!?
+ai_cLbg"GZdF-Lne'ut#f\5'6gt^`Bi8ESSjQ,IdkiqF"mdTf>p%S7WqYU6jJcGZJ4NOP+XJD\h
+UndD/hUTca[tBp:YKG(:O.V#4DJW*mFELMYKReT&J:W2G:ek"i;c-DTOH5E^NJrjUM2;.d!/?U8
+/*4^T['-^7Vl6Z0Z*172X/E_;Y-"_(Vk]oUS=5h3Q'.>oOH,9XM2@%FM=67J=^#'8?!grI@Uiq[
+AnYmnCMds-EH6/DGB\=YI!pKpJqJc3Ll%(MO-#NgQ'Rf+S"6.DTqeH^W2co#Y->4<[C3TU]=bkm
+_8=.0a2lEHbg+P^daQ^sf@\g2gtgiFi8WeWjlY^hl07L"m-X60n*ol<o(2JFp%A%Pp\jmeq>^<h
+qu6NlrUg)?s+11Ms*t~>
+JcC<$K)bKBrVc`nr;6Nj!;ZTg1&(D8p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK<:E8l&1U;#F27;#<?b3]T,Z2`a#^4[(tk5!D7157KkD5sdq*5u(*I:/4MYq+Luc9hS/P
+92#4T%SKDc8kM`J8kMTE84c<ApJ^les&8hnrDWSmr_r\ls&8nrqc!Gk$<'o&<)Z^p<E)mqr_rkt
+r)EJlqH!Ams&T/"!*9)!!*8kr!*K"trE0)#rE&u#"'J`-=8H#">$:i,r`T/&r`T8)s&o8$rE0&#
+!*T5%!ErY&=T;M<>$G37>$G6;?!LW??=$oE?!UcC?i4=3@0L+K@UinWqIBS<rFc+Cs(MXOCMRa'
+DZ4J\DfKc<F*)JFF`hkNrceBe!."Qi!IK4mIfFm/JV&K+KS4u2KnkG>MMd=NNW"kAO-#KfQ'I[7
+QRJ5iS"-">StMaMU8+Q]VPg>kWN)u!XKAY/YHb@<Za@-K\%&rY]"5QR]`Gj_rkSlW_o0L5`lH0B
+rlY8as3(JfrQbGhs3UqsdF-JBe,Ro!e^i@Of`0Y'gAfn-h"fe)h>lC/htl:+iAB5_D-pOR?!LW@
+?&NQ@BOY7K6:OUEFbr+C:cC!b1b:jT4#Jie7n6$;77K9s2a0;c4ZldE<W>r#<)Zap;c<TldFn?J
+b1S>kWIS\j?<^`@?<gZD?=$lA>?GE@>$>-6>?P$.=&i=(=B8C&<E2pr;c6LjmSJ:6>$P<<?XI5N
+@q9._BPD3sD/O93EccGJGBnL^I=Hd!K8#&9M2[FTOHPfmQC+,1SXuLJUSXleWiN8)Yd1UC[^`l[
+]Y;.s_SjF6aND]McHjnde'ut#f\5'7h;7)JioB(\k2tmll0@X%mI'H3nF?)?oCMVIp%J+RrV6Eg
+s8)Zjrqu`no_sFAJc>`MJ,~>
+JcC<$K)bNCrVc`nr;6Njs7uZhs7ZNerq.l8oCDJBnF,i6mHj3*lKRNqk2kX`iS`VMh;$`;f@SR&
+da?Fec-+7AF*`@sWUm=mY4\prY2HM`Y5OpjSjT$8PE1``N00=$V5'l`Vl6SmWiW>)Y-!o%^;%@q
+]tD(p^qICk\@9&Y\[K&Y[C*BK[^<EO[C<TQZaR-HZa6sF['f_7r3H@/r3?C/Yd",3qQg.-qm-7.
+s0Vd3q6^+.rjDg9rO;j<rODj;s1%j7s0i-A]Y(qlrkAHKrP8cV_o0O5`l?*@rQ5)^s3(Das2Y>_
+a2Q!8rk\ZQrPAfW_SjF4`l?'na9'K)a8X0W`sTi)_ns:)]t:qh]Df>@])9/?]`#MK^V7Fs^:q@s
+rkT>d`5]mAbg4Yae(3.(gYCWBi8WeXjSe0Bk3(pkr9Fp]mdBT7nalGIpA"IZqYL-frr)lrJcE@^
+"Q]"6g"QGYrVn5Bp@><(g?S:rVQeI[H!ukDSt)?_@'6Q3WN<,">?k?@?X?uA>JL0Os1JZM\[JrR
+Z`p]ps!dF.lKREeiT'LrlfI3ck4e0+kiC[Zf[S?pc-")H_SO($]t:e^['dBNn$[7>>$G6;?=.)L
+@Us%^B4u$qCi401EH?5FGBnL]I=?]tK7nu7M2R=QO-,TiQ'du/S=Z@HU84ZaWN*&%Yd(OA[^WfY
+]Y2(q_Sa@4aN;WLc-F\`e'uq"f\,!5h;7&IiT&tZk2tjkl0@U$m-a?2nF?MK!V>s_o`Fj]p\ssf
+q>^<hqu6NlrUg)?s+11Ms*t~>
+JcC<$K)bNCrVc`nr;6Njs7uZhs7ZNerq.l8oCDJBnF,i6mHj3*lKRNqk2kX`iS`VMh;$`;f@SR&
+da?Fec-+75@VK_*L[BrqMV*daFoQV*F`_VBDJa6,DfC,OH[L3jI=HWpIt3*$J9-d4NfO't'p+K9
+Nf8mRMi!=IMM[+DLkpnDLP^cbL^AfmKntM>L51M<qhtN7rf$c5qMP60rJ^c9s,?u9!0$l9rf7#>
+!KN0<NrG+:OT(=9OS=kAOH5HaOHG_)PlI!LPa235rg3YPrgEbS!h5^LrLEnVs-`hQ!1EhR!1EeQ
+!L]>SRK&`RRJN?QR@*uA!1NkU!1NkS!go:>qNV&Hrg3YNs-N_P!1EVL(R^_^SXuIHTV8*TV5:)g
+W2ZesX/rG)Xo>I'YPk[,Z*L\6Zi7?;\@K2_]"5McrOi0D5JFhF^;.S%_o0L4`lH'<a2c9Cai_fM
+c-FV]dF-Lme^i='g"G-9h;7&Ii8N_Wk2tjjlKdg)nac>Fp\F^`rIP"Fs$4Z,YcX^tV50mRf\Y0%
+_75,_Ts)VbI>#)#?;563G'.n+:kF4JIt3$!:JX_c;c?Rk:Q^a!O,o<]N/NOJM2$bHs!HpJZa6j<
+Wi)ku\$<-<XfAPCYHP(/Vl$2]Ssu19Q^*_tP)kZ`MuJS7M2LbXE`lRM>[:ZC?t*SUAS,RgC27X'
+DfB];FEVkRH@('hJ:W?+L51VDN/is]P*D6!R@B_<T:r!TVPgDnXKA_3Za@0M\[oGe^VI_(`Q$!@
+bKS5Vd*^=le^rI,g=tH?hr*JRj5f@bkNV6rlg4!+n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTd
+rdk*#rrE(L~>
+JcC<$K)bNCrVc`nr;6Njs7uZhs7ZNerq.l8oCDJBnF,i6mHj3*lKRNqk2kX`iS`VMh;$`;f@SR&
+da?Fec-+6u7S$3I:\[ca;9Vi:4o.;@3X7W)2`No]4Zr[+!C/mJ5RotD5X\:>9hnAV:/">U:&[id
+9,^Js92&#P8P)NH91hfL8kVfL8Oc9A8P)HE8bl<b<;ohr<;TSu<)lpt;cH`q;uT_r;u9Jj;u]bn
+;uT\p;uTbq;tEub<W#ns<rcA!=8u>$<<-)!<<-(s<s)Q+='5H'r)Wi!s&]8&rDrr""B\f/=BY5t
+r`T8'!EiV&=TDS$<ruK)=8l>%=8uD%<sMi/='/R+='5E(s&oJ.>[7,2!+,Y3s'GV2s'bn9"(PkP
+A,^$=AHQISAS;!Us(VIIs(hXNs(qsXD/O93Ec_5%s)n?b$[6i>GBe@XH@($fIK"ZtIt3'#rdkT4
+KnbA=LPL\CMi<XUO8Y.tPE_;tQC"#.R[]e;StD^MUSFW]VPgDmWi<"uXK8P+Y-5(7ZEggD[C3QR
+\@T8`]Y(qm^qfrd!Q2kT`rF*[ao9H_b6#o4c2>lecNV_Ee'lgrr71i!!8.;)qqM,*rSI>,ro!P0
+qVqP8#NXO9D.$US?2\(ZKl2!HA6i8'7nZZpNB07K>q@B[/3Z0X2)@fo7Rfm:7QEFe5!(ki4?HRB
+<!cE%;GpFm;Gp=hqV1/df%K$9s4\sLXFb4r?<^]??<pc@?=$lA>$P`G>$>-5>$+g,<`N4'=BAL'
+<E2prr_ieomSIq,>$G6;?=.)L@Us%^B4u$qCi401EH?5FGBnL]I=?]tK7nu7M2R=QO-,TiQ'du/
+S=Z@HU84ZaWN*&%Yd(OA[^WfY]Y2(q_Sa@4aN;WLc-F\`e'uq"f\,!5h;7&IiT&tZk2tjkl0@U$
+m-a?2nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s+11Ms*t~>
+JcC<$KE(TCrVc`nr;6Njs7uZhs7ZNerq.l8oCDJBnF,i6mHj3)l07Eok2bR_iS`VLh:pZ:f@JI$
+da?Cdbfe+AE.3>'X8B'mXnAdjXn/^eYPasiShuq*P)kW`NK96fUSXlcW2ZYnW3!,(B=YXd^V.@s
+^;.Iq\[f5[]",A[\@ArT['[6J['dCB[Ka.GZa-gBZi7<4[^H";p9F\'rilC,r3?F0ZEpn7ZM_$1
+ZEpn:[/%-/[K*f5\Giu9\G!HB]=kqm^V@V#_8=(,_o2Pn"ieU(aN;X(aoKW_bR)G6aN)BBaMu3<
+r5AWSrl4uZ!6P2\rl>&[s2b;_a8X0Za8X'c`P]O-^:h.j]",BM\,j.Or4Dm>*4rnt]Y(ql^V7Ft
+_SsU>c-Xngf@\d2h;@,Lj5g."!9X:D)X-GNlKdg(mI'H3nFQ;Fp@n@YqYU3grVc`pJcE=]#NY@<
+g"Y68g&:q,r;#uecee!Vm\R)7[rl/BA"T9^?"'e7XK/>$W`iY2@UNMI>?eqX^:h7o]t:_\['[*C
+NrLTto'#2shr3Ycm-<`oi9g4&lK@0_h:L0,cd'\S`P]L,^:_%f\$WNM[^>P4s&jJJ>[1TB?X[DR
+A7]CeBkqL$DK'T9FEMePH@('gIt3-(L51VCN/`m[P*;/tR$sM8StMgRV5L8lX0&S0ZEpsI\@K5a
+^;%M$`5Td<b0/&TcdC1jeCN7)g=tE=hVd>Oj5f=akNM0qlg4!*mdKW6nac8Bo`"O`p&Ojdq#C0i
+qYU0hr;QZerdk*#rrE(L~>
+JcC<$KE(TCrVc`nr;6Njs7uZhs7ZNerq.l8oCDJBnF,i6mHj3)l07Eok2bR_iS`VLh:pZ:f@JI$
+da?Cdbfe+5@VTk1L[p8oM=68dM>VMqG5l\/Ec>o5D/=-0FF&=_I"-WoIXQ`tJQRhhNK/sXO,f9]
+Nf8qrMuSYBLl$tDM27"FLk^\@reCZ6LPCP:M>i52Knb?\N;nn9N;\\4MZ&J5N;\b7Mueiqrf-o;
+rf7,@NK*pts,Zu;rK$l<s,[2Aq2klCO,oBcP*Gm0".#4<Qi<9NQi3<NRK&]XS"-"<rg`qV#F_'K
+R$jA0R/WNQQiNQNRf/ZNRLkmSR@0M4S"#k8S!ob4Q^3p8PlI!LQBh93!LT5NR/N?ORJrWeS"6.C
+TV8*TV5C/hWMunuXKDE'!3c@*rj)R1s0D[2"15JF\Gj)>]DoPD^&Pf3^V7It^qdh(_o'F2`l5s;
+a2c<Db0.rNbg"J]dF-Lne^i@)g"P6<hVd>NiT'"\kND'nlg4$-o(;VKq"jpdrdk+Grr^EGYcdr#
+*i%uShUBWb\V-HKYJnk:KXctG9l*ULF`^>TJq/E'rdP5L:JOng;Gp@gPQ$ULOH,?\MMR(FLPLuk
+.I"gXZ`gL2VlHl+Yck43WOKdKYcXn$UnXNTS=5h4P`q8mOcPN]Mi*DkM=??$=`mnQ>[CcE@:E_W
+AS5[jCMRd)E,fo?Fa&(VH[U<lJ:`H/LP^nINK90aPEhK%R[]k>TVA6YVl6VrXfnt7ZaI6O\\#Mg
+^VRe*`Q-'BbK\>YdF-Oof%8U/gYCWAi8EVTjQ5OekiqBum-O--n*fc9o()DErq6<b!;HKfs7u]k
+qtpBjrr)KgJcC<$!<7Q~>
+JcC<$KE(TCrVc`nr;6Njs7uZhs7ZNerq.l8oCDJBnF,i6mHj3)l07Eok2bR_iS`VLh:pZ:f@JI$
+da?Cdbfe*s84uZP;SH!,4o7>J4$#D^3B0#Z4$<L*(I()J5!_G"5<q>'9M8&Q:/4MW9he8R9`@Zc
+9M>@Ys%32_qFUi]7n6&H8HDFSmo'9e<E8us!)rhor_r\lr)<Smr_ierrDWVn!`N&uo2PQdrDiu$
+=BP?"q,[Ao!*K,"s&KA+<`W=(=BJZ&<WH8$=TV].=nl)$=^"p/r)io#"'A].=T2D!=9)G%=Su7u
+=9DW*=',B's&fP.=^#$7?!R;5!a]5ArEoP4!aoGFraPn;raZ.CA7]=_ral+B!bc:^rbDIKs(q^P
+s).jT%rlZ3FE;MFFEM_LG^"CWH2`*lH[U<krdXru#D%JXJqAZ1LAcopM2R=PNfT9aP*2#nQ'Rc)
+R[T_9SXuIGTV8*UV5C/hW2ZesX/rD)Y-+t4Yd(L?['d?O\@K2_]Y(ql^V@S"_8=+h`<jT+aN;QH
+bKS2Trm(Pis3Uen!n,QIrRLnus47>)g"Q>Xs4dV1qVM&+!9*n9s5Wt:!9O(<$K^F4frK%">[1T?
+ra%U5DfTQ%?W]Wg9M]#U3]qXJ/1<>+5<M"]1J(208Ol3=2E3Z[4?Pbh4&f3Z<)Q^q;c$Ck;Gg<I
+h<j"Gg[s;"g\KV,gYCW@o\9l(YCp_$?X$c@?<pf?r`pLK=^YiH>$>-4>$+g,<``@)<`i@$<`Dsr
+<)Z[lmSNpdF]r$T?=.&J@Uiq[B4u!pCMds.EH6/DGBeF\I=6TqJqSl6M2I7OO-#NgQ'[l,S"6.D
+U84W`W2co#YHY==[C3TU]=bkm_8=.0a2lEHc-FY_daZdtf@em4gtgiFi8WeXjlYail0@U$m-X60
+n*ol<o(2MQp&F^cp\ssfq>^<gqu6NmrUg)?s+11Ms*t~>
+JcC<$KE(TCrVc`nr;6Njs7uZh1ACM9p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]iS`SKgtUQ8f@JI#
+dEp1`bfe+CEINM,e#`DJoWJ4tqORSV)4d4]O,f3YNfo^'V5C/gW2Q\rBP"Za\@B0L^&YkF]+)<^
+]"#5W\@/`NZF.'IrjE?J\@AlP['d*F['[0I[C<RBZ2V'-Z2V'+Z21d*Z21d(Zi791ZN.B/[0j@M
+[^N]U\$`WP[f*Z:\@K-D\IH-^]=ktp^qmn(_Sa7/rl"lWrlG,]$-UQ:c-=JVc-=K3blc25bKBh+
+rl>)[r5JcXaSO!baN)<@aN2KFaN4>%!6G/Z#K=X!_7mOm])K5E\@8rW\@K3I]DoMD]D9)Q]tV7t
+_SsX?cI(.mf\>3<i8N_WroO+@roX:FrojIKli$2^n+#r=o_%qQq"jjarVc`ordk*\rs.WRleUCO
+gY)Q*,5h3,XK1%<nF*'Ve?"%,P@L8VSR#Z1XfSV'WN03->[h,Kr`]iL^:q:p]tM%d[C!6EZB"r7
+naG]&kMY@]nEfE$jQ#k%lK[QkgtUH4e^DacaMl'4^qRFm\[JlS[C<O4[WknW>$G6;?=.)L@Us%^
+BP;-rCi402EH?5FGBnL^I=Hd!K8#&9M2R=QO-,TjQC+)0S=ZCIUSOcbWN3/(Yd(OA[^WfY]Y;.s
+_SjF5aN;WLcHjnce'ut#f\5'7h;7&IiT&t[k2tmll0@U$mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<h
+qu6NlrUg)?s+13#~>
+JcC<$KE(TCrVc`nr;6Njs7uZh1ACM9p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]iS`SKgtUQ8f@JI#
+dEp1`bfe+8A8H:8dYR7HqK;d\s)eTfE,KN/Ci435rHnTnrdG-&=]gN<MMmCRrf.#=NrG"UMMmCL
+M2-qDLPU_BLkpnCLPgqHLPL\AKnoS\",DViN;S\0Mu/J3NVnb7N<#"9Nrk?$NW+t<O8G">O-''r
+s,co9"-Sn5Q2[*LQiE?TQ^3r(Q^I`>rgNhUpm_DTR[a;F!h#LFrL3\Sq3h;OqO7GPqO7GPs-`tT
+QMd!HQ2d0MQ2HpQQ^F,,R$X/,rKmMN'UbDZS"61ETVA6ZVPpJoWiW;(Y-.`,rNQ=,s0D[2rj#>+
+['d?O\@K2^]=bhj^:q@r^V@V#_8=+-`5KX6`lH*>aN;TJbKS5UcHjkbdaQ[pf%8R-g>(QBhr3ST
+jQ5Ofl0@U$mI0Q8o_/+Xr;HVGs7u[[c)n4RVP^/bV<-Ukd`TD9KRobs_U*[b[!c:VD,>J"F\P_.
+JUi<$It19j:K:@l;c-ATOH>KaNfK*VM26tCL62Eam)HH;Y,eS$Wii\4Ycb+.^UgVQXJhtjUS4?N
+R[KS.PEM&jO,]*VM2_Fjn;)<k=^#$7?!^lG@U`kZAnYjmCM[m,EH-&AG'A4XI!pKpJqJc3Ll%%K
+NfT<cQ'Rf*S"-(CTqeE\Vl?`!Y->1;['mHS]"Gbl_8=.0`lQ9Fbg+P^dF6Urf@\g2gtgiEi8N_V
+jlY^hl07L!m-X60n*ol<o(2JFrq-?dp\4[^s7u]kr;6KkrVcBfJcC<$J,~>
+JcC<$KE(TCrVc`nr;6Njs7uZh1&(D8p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]iS`SKgtUQ8f@JI#
+dEp1`bfe*s7ncUh:]NWW4o%2A3]fA$3#an@4$>bl5!;%m5<q=m84lKG9M7uO9he8S92,=X##%Z_
+9M.lJr_*8`s%32^!(ZuYr^d5`8kDNAqG[>j!)reps&K"s!)rhor_r_mqc!Jlr_rbp!)rkr"]JB"
+<`W6";ts>l<<-"r<W,r!='5?$!*9)#s&K2&=BPN'q,mMq!*K5%rE0)$#?Fi)='&L*=8Z4u=9D]0
+=',<%s&o8%"'8N(=8l>%=8Z2!<sVi.='/R+=&rAt=T;P)>Q.q,?3"@3@/jR6@/XO4@f9g8AHZUV
+A7T9NB)ZKDC&_uJD#S8UDJsH5EH6+!F8p>EF`qqPG^+L[H@('gIXcitJV&K+K7\`.KnbA=M2I.J
+N/`jZOckomQ'IZ%Q^F52S=Q7CT:qsQUSOcbVuEV`WN*#"XKAV-Yd(L>Za@*I[^WfY]">Vg^;%Fu
+_84",`Poj;aN2KFbKJ,Sc-FV\d*U1he'umte^i='f@\a/g"P-4g=lP]!o;YeqqVA3i8ESmiW/$;
+iWA3$j8S*>jnn3=kP=6DgobX)>[7873F-!:FE2&)?<9EY9MJiP4$7L?/LWG,5<Ct]1G_Qm7n?':
+2E3Z[4Zkki4&o6[<)Q[q;c$Ck;,U6[hWN_ih"':qhXTJ'i;MR3hY>nTf!1!I@:!,B>[LcB>@(ZA
+>ZkTG>?Y37>$+m.='/O*=B8O(<E<*u<;ohr;=@>+=BSg3>[:ZC?t*SUAS,UhC27X'DfKc<FEVkR
+H@1-jJ:`E-L5:\EN/is]P*M?#R@B_<TV8-VVPgDoXfen5Za@0M\[oGf^VRe*`Q$!@bKS8XdF$Fm
+f%8R.g>(N@hr*JRj5oFckiq?slg4$,n*fc9o()DDo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s*t~>
+JcC<$KE(TCrr)ior;6Njs7uWg!Vc<eo`=^VrphK-nF,f4m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK=74FF&_7r2eJMrN,Ums/u-fs.1='St2@9OcGH\NffX'VP^;kVe9XV[C<WQ[^`lW]=trW
+\Kner[^ilW\%&fN['d3K\@T5Z[^ilR[Bm?LZa6pD[C3QPZE^\6ZLkF!ZMh')ZN%64['R+<Z2h6/
+[/IB4[f3ZD[^W]Q[C!<K[C3NQ\[_LHrjiEJ]Y2%o^qmk(_tq=S`lQ9Fr65/brm(Pgrm(PgrQP;b
+!6Y;_s2Y5]aS<mW`WF3%aSEpba2Z0>`PfX/]t1iT\c9,=[f*ZD\@K2_]=bbf]">Se]`,PB]`,ST
+^V[q/air,\e_/[4hr3SUroF7EjlPY'kPjZ[l0@R"m-X61nF?&>o_/"Rq>1!drVhBJ\Glfsn*]&h
+h:pZ^s"jWJo;\k0ipH3pW7@em>`iNjSXj%q?*:60W2cq(>?kWG?<g]=`P9.#]tD"i\$`WLZ*B>h
+(%^_SjQGI\jm_[%jPoCrm-<lui7m#cf+QWXaiMH<_8*dt]=GDX[^ETO[f*W,[WknW=^,-9?=.&J
+@Uit\B4u!pCMds.EH6/DGBeF\I=?]tK7nu7M2I7OO-#NhQ'[l,S"?7GU84W`WN*&%YHY==[^WfY
+]Y2(q_Sa@4aN;TJc-F\`daZh!f@em4h;-uHiSrnYk2tjjl0@U$m-X91nF?&>o(2MQo`Fj]p\ssf
+q>^<hqu6NlrUg)?s+13#~>
+JcC<$KE(TCrr)ior;6Njs7uWg!Vc<eo`=^VrphK-nF,f4m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK<mpAScF<oSD@ZrJ:!#!-\0\s*"Ba(3FM6Des6-E-$ARI=?Tm=]eg]M26qDre^c8NfO's
+(l='+M2@%FLk^_BLP^kFM26tHM2$hAMMD+a"bq_cL4k6XNW"h6Mu/J3NW"h5NW+t;O8Ft:O8P+4
+O8k=9OoCLGPE_>uqNh2Lrg3VO!h#LGqO@2Ks-rtUqO@JQ!1E/Arg<nUQBd]!pltlEQ2R$KQNNVA
+R$df<qj7n^S"6+BTq\?ZVl-PpX0&N'Xokl1Y-7f.rim<GZa7$GZa@*I[^WcV\[oDb]Y2%n^V@S#
+rPCM2`5KX6`lH-@aiV]Kbg"GZd*U1fdaQ[pf%/L,g=tE=hr!DPjQ5Oel0I^'mdKZ8oC_kRqu-MF
+s7lTtcE4CYVPjEj+Q288dEBD9Jq0,^]$%g=Y'aVKCJ];"FA5Y/K7JN%J:RVp&6;b/;c-AUOcb]c
+NfK*VM2D4eOT-cua1&7SWiW2#Xg>::XfJV@ZELL4Vkp2aTqS*IR[KD'P*(lfNJrdQMuJP5M#E,%
+Lj3$)=^,-9?=.&J@Uit\B4u!pCMds.EH6/DGBeF\I=?]tK7nu7M2I7OO-#NhQ'[l,S"?7GU84W`
+WN*&%YHY==[^WfY]Y2(q_Sa@4aN;TJc-F\`daZh!f@em4h;-uHiSrnYk2tjjl0@U$m-X91nF?&>
+o(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?s+13#~>
+JcC<$KE(TCrr)ior;6Njs7uWg!Vc<eo`=^VrphH,nF,f4m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK<.@8khqP;#O2H;#O8];#WTV4nq,?4$!:"!]iD)r]UNN5!D(k5"PWD"\MEZ92&(Z9FOQf
+8k_lO92%oJ9M8%U8d%dW84Z8M8cM?]8H;9[7K??b;uT\p;tj5k;uBPm;uKVm;Z]os;uT\l;uBVo
+;Zp'"<)Z`k<;ons<<#ts<rZ5$=Sl2"<WuQ,=&r@'q,d]"=BPQ(r)`u$=SPts<<-)!<rc:u=Thi.
+='/T'>5hY)=T2G1=BAU,=&r@'='/T%<rc:u=8u;&<E<0"=8Q,"=Tqu5>[1Q?rEfM2s'Yk6ra>k9
+@:B.EraYq<!+l.As(;IGAnG[grb)mXC27U$D/F0.E,]f:EcQ5CF8^1lF`qtQG^=[_I!gBmIt3*&
+KDgK'Kd;D.Ll%%KMiEaXOHG]iPa.Q#Q^F20S=H.ATV8'RUSFZ^VPgBlWW0"@XKAV-YHY=<Za@*J
+[^WcW]">Se^;%J"_8=+.`Q#s>rlG8bbKJ-/c2Z&ld*^:jeGe"uf)OD&g&Ke+g\fh,h>H(-h>c@3
+hu;R;j5f:_jo+9;jo=K@k5a`AkPaTKhm%30>[:V6>p`m!G]@A,?<9EY8kiH;@QIUK/L<8+5<M%]
+1c%Zn8Ol3<3&rr^4oRPD48i1Z;?p3#;GpIl;,R#Fr8@,&mb[KkoAK<#pu),0rST*WZ\iX/?<^Z?
+?<pi@?=-rA>@^uC>$>-6=]ea,=BAU,='&C&<`N$sr_ins;,C*f:\@P/=BSd2>[1TB?X[DRAS#Lf
+BkqL$DK'T9FEMePH@('hJ:W?+L51VCN/`m[P*D5uR$sM9T:r!TV5L;mXKA\1ZEq!K\[oGe^VI_(
+`Q$!@b0/&Td*^:ke^rF+g=tH>hr*JQj5f@bkNM0qlg4!*n*fc9nac8Bo`"Lbp@n=\q#C0iqY^6i
+r;HTdrdk*#s*t~>
+JcC<$KE(WDrVc`nr;6Njs7uZhs7ZNerq.i7oCDJBnF,i6mHj3*l07Eok2kX`iS`VLh:pZ:f@JL%
+da?Cdbfe+=F*N(nqQ/5JnZ2bnSG/TRT)Y>aSsu%/NrG"nOHj<gB5)$nXK/S3[C<NO\[])[]XkVa
+\@T5[\[f5YZa6sE\$icU\@&`OZaI6N['m@@[K!Z=[Bd$AZEj,-nZr/#s0V[0s0Mj6[']e>!4Ma3
+rNlR4rjDm;\@DLJrjiQL\@K5a^;%J!_SX4/`;[aT`W=3)rQP5bqTf,es3CYh!RAshbQlD:bKJ&M
+b0'S&!6G/Z!QW:UaU6).`5BF*]Xtec\,Ni7\,Wu<\c95A]Y"0Ss189Drk&*@s1JoX_o0X=cI17q
+gY^oIj5g4$"6S_,k54?AkS*4Hlg4$+mdKW7o()GGp%S7Xqu)*G\,QNnn*^24s4mSQ1]@(>W2dVg
+mIBDHc(B9:P@L5VT3Pl3Y,eY'X/`.&?!CcF?!LUS^q[Us]tCte[C*?HZ&\i1p$(`%jl#.[na5T'
+j6ZL'lKRBegY:B7g"4Ega2Ps3^qRIm\[VRG"1PYG[f3]-[XM:[=^#$7?!^lG@U`kZAnYjmCM[m,
+EH6,BG'A4XI!pKpJqJc3Ll%%KNf]EfQ'Rf*S"6.DTqeE]W2co#Y->1;[C3TU]=bkm_8=.0a2lEH
+bg+P^daQ^sf@\g3gtgiFi8WeXjlYail07O#m-X60n*ol<o(2MGp%A%Pp\jjeq>U6gqu6NmrUg)?
+s+13#~>
+JcC<$KE(WDrVc`nr;6Njs7uZhs7ZNerq.l8oCDJBnF,i6mHj3*l07Eok2kX`iS`VLh:pZ:f@JL%
+da?Cdbfe+3A7fV$L@g;XL\6K#M>qboFoHR`FUE52E,TQ/DJsSs=oMM+=+c*ZLAlr>Ll7.INJrjT
+Mi*FMLl.(HM>`2IM2-nBM27"DL5:YBL5:S>LP:J:KS4r1NK*IeoSrj1qiC`:"-8J'O8b4AO-'-t
+"H\\*OHB:#qiUuDPl@!JQiEHOQi<?QR@=&C!h,UJopl&Os-ikT!1a"W!h,OFm$dsB"dkU@Q'@O,
+Q2d-MQ2?mGQNNVAR$dl>s-O@dS=Q:FU8+Q^W2co"Xf\b/riZ@*YPYR'Z5'^Q['d?M[^NZT\@K/]
+]=bhj^V@S"rPCM2`5KX6`lH-@aiV`Lbg"GYcd:%ddF-Lne^rF*g>(K>hVd>OjQ5Odkj.U'n*fc9
+oCVbPqu$DDs7cNqd&s[\rML^8gZ.,:b/:]>JWle9b//q%G@+is:j7)+9i=c>J:[ZL'i%S#<Dugo
+:mI3+O,f<_NJraOLPU_Is!@0U\?<!8XK&;'['?g;XKfUDYHY"'V50i[Tq@a?R$EhtOcbZ`regr;
+Ll$tEM#N2&LjiE-=^#$7?!^lG@U`kZAnYjmCM[m,EH6,BG'A4XI!pKpJqJc3Ll%%KNf]EfQ'Rf*
+S"6.DTqeE]W2co#Y->1;[C3TU]=bkm_8=.0a2lEHbg+P^daQ^sf@\g3gtgiFi8WeXjlYail07O#
+m-X60n*ol<o(2MGp%A%Pp\jjeq>U6gqu6NmrUg)?s+13#~>
+JcC<$KE(WDrVc`nr;6Njs7uZhs7ZNerq.l8oCDJBnF,i6mHj3*l07Eok2kX`iS`VLh:pZ:f@JL%
+da?Cdbfe*s84cKN;><uc:Yek;;#jGi4T7M=497N)r\t3E4?GPa2`NiZ7K,gW8H)0]9M>@YrC[/b
+9E%Wb8dS0a91hfJ8kM`Kr^d#[$qa)_8kDNB77K^9;cEWm!)rVk!)renrDW\n!`N*!r`&\l!`Drq
+r)EJjq,I;ms&B"ur)Ni"=Sl2"<WQ9(rE&ht"]n])=BAPt=Sl/"<rQ)*<`iI*<`W:'=BPN'!E`M!
+=o__)=SGl(=BAR)<``C*=&rE#<WH5#=9hu4=]ed/>$Lu2s'>Y2qHj82@K'XA?XR;O@q/tX@q9-L
+AcZOXrFc.B!G?*EBa\]mD/O60DfB]:Ec_2$rH0c;G^4U]H[L3hIXcitJV&N-KS>/8LPL_DMi<XT
+Nf]BdPE_;sQC!u+R@9V9StMeVU+)k5V5C/gW2ZbsX/rJ,YHP18Z*UdE[^NZT\@K5`]Y2%n^VI\&
+`5K[9rl>2abKS30bn87Icd:(fe'umuf%8O+f\,!4r7q5+"Q%tjhVS7h!9!k8!oi8#ro=(@r9!n>
+!9j=E!:'@DrTZ`/[<,e]?!UcB>[;>pEFr]e=$],C9iZ:M4@1eT/N#.F4ZtGT1It#-7R]a83&ii[
+4?Yhh<E<+";c6Uo<)Q[n;Gm;Npu;,.l/;6lq;Ci&r8[)%"kpABDIZuO>QA+0>S(1I?!CQD=^,*6
+>?P-3='/T&<rc5!<WH%s;Z]io;>sDk:\@P5='/U/>?kH??XR>PA7]@dBPM=!DJsN8F*)SLH$Xjd
+It3-'KnbD?Mi<[XP*;/sR$jG7StMdPUo1/kX0&P/Z*UjH\@K5a^;%M$`5Td<b0/#ScdC1ieCN7(
+g=tE=hVd>Oj5f=akNM0plg4!*mdKW6nac8Bo^qhLp@e7Zp]1-hqY^6ir;QZerdk*#s*t~>
+JcC<$K`C]DrVc`nr;6Njs7uZh1\^V:p%@tLoCDJBnF,i6mHj0(l07BnjlGI]iS`VLgtUQ8f@JI#
+dEp1abfe+?G'\Y!Wr&mrX4jTRX7E=nXdkpSSc>;\SHG@IPE,X%+d&!sAYuB*WiW;)YHk^IZaI<N
+\[T&Y]=GPa\$WNM['R.=[g'FR\[JlQ[f3Z;[^<KN[/IH;['-^<ZEj2/q6C",rj(su!4;^4s0hg4
+rNuR3rjMd7s1&*>s0r9D]"G_j^VKfb!5n`R!QW@^bQ#fcc2Z)fci;8kcd;X:s3:YibkfQebfe2P
+bPfQ`ao06[aS<jpaN)?>_n`st]"#5X[C*BK[^NZT\$rlW\[hXLr4Dp?rk/lW_8F76c-XtmgYLfH
+j5f=`rT4LNk2tjhk3(mhl0@R5m/HDPnGi"`oC_eNq>:*hJcE7[#O1UCi8EMMh>R@0r:ff]WPI<V
+oB`9tR=L'TAY,Na>[q'CX/r;&WiB9/>%1iF>[5=c^V7Cq]tCnb[^<BGNrL[)lfdEji8`nfn*0&s
+mIfZ+l/^dWgtCN<fZVCW`59:)^:_%f\$WTQ[^ENOrjDF-ITKWS=^,-9?=.)K@Uit\B4u!pCi4-0
+EH?5FGBeF\I=?]tK7nu7M2R=QO-,TiQ'[o.S=Z@HUSOcbWN*&%Yd(OA[^WfY]Y2(q_Sa@4aN;WL
+cHjkbe'uq"f\,!6h;7&IiT&t[k2tmll0@U$mI'H3nF?)?oCMVIp%J+RrV6Egs8)Zjrqu`no_sFA
+K)^?~>
+JcC<$K`C]DrVc`nr;6Njs7uZh1\^V:p%@tLoCDJBnF,i6mHj0(l07BnjlGI]iS`VLgtUQ8f@JI#
+dEp1abfe+3A8#h*LA$GXL\6K#M$%mDFa!M%s*"Ba)KTn<Df'?/DfScVIt3-&K7\Z,KnkD;Ll@.K
+re_&@MMm@JLPUeCLkktc#)S4pM2-nDreCf9L5:V=LP:M<L&Q`)NV&2,N<#"<NV\\4O8Fq;O8b4@
+O8b1:O8k=AO8k=9OoCODP6$o5rg*ML!1*SMs-WhS!LfGTRf8fQS,f,YSGAZRSG\lRRf8fKRKJtF
+QBh<2!1!MIs-<VK!1!JJ!13\N!13YOs-N_P$^mKSSY2^OV5L8lXT#@%Y5GO(Y?%m2YHb@<ZEpmE
+[C3QS\%&rY\@B,^]=bkl^VI\&_o'F3`Q#m:a2c9Cai_fNc-FV\d*U1fdaQ[pf%8R-g>(N@hr3SS
+jQ5RglKmp,nF?&?p%S7XrIP"As#/</Yd::,Vl?]SjP8)'_7+uHPbGG+`I!qlARfORG'8"&;GVpr
+JU`6#J5/p9<Dujp;3[6+NrG+>N<G/rLl$nKru^dQ\?N-:XK&;&Za-d;XL,aBY-4h'VPKu`U7dpB
+Q^.Q5$]pC.Mi3INMhm7HM#N2&LjiE-=]ns6>[CcF@:E_XAS5[jCM[m+E,fr@G'A1WH[U?nJV/W1
+LP^qJNfT<cPa.T'S"-(BTqeE\Vl?\tXg#(:['mHS]"G_k^r"".`lQ9Fbg+P]dF6Uqf@\d1gtgiE
+i8N_VjlY^hl07L!m-X60n*ol<o(2JFp%A%Pp\jmeq>^<hqu6NlrUg)?s+:9$~>
+JcC<$K`C]DrVc`nr;6Njs7uZh1\^V:p%@tLoCDJBnF,i6mHj0(l07BnjlGI]iS`VLgtUQ8f@JI#
+dEp1abfe*s7S6BL:\[ca:]=2L;?'J_;>E?R4nq/>3u0e92E<l]1c[rl6UjL67Rp!A7n6*A8c;9^
+:&[g(91_`K9M8#N8kDWJ8kDQF84Z<D8kDWJ8P&hN#=_3S85iGb;YO,d;Ya5n<)lmsq,@8j!)rbo
+qG[2hq,R>n!`rK+q,dSur`9)%r`B,%r)`bt!*B)#qcE\rr`B&!s&]2#s&]8(pKIQ!!a&N*rE0&#
+#Zt//<`N1%=BYW)!*K,"qH3`#rET;-s'Yh5ra5_5r*TM5rF5e:!+c(@r+?%DBDuQSBkh?sCM[j)
+Df9T7EcQ7"FT6JQG'A1UH$Xd`I!g?kIt3'#JqAZ0KnkD<Ll$tHMi<XUNfT<dPa.Q$Q^F20S"-%@
+TV8*TUo(#fWMunsWN*##Y-+t4Yd(M5ZOsRP[^WcW]=Ybj^;%G!_SjF7rlG>bai_fNbPoa"cd:%d
+daHUoe^i='f\,!4gY:N=rS@J0s53h6ro3q;roF%>rT=(Bqs"(ErTjILp?MtG\9D@e?!^k:>q'uD
+EG&]c=$],D9N,eF4$PGR/iG=G5!1JT1e:,+77K^83B/r\4[)"kr`';);c?[p<)6Il;GmGT!9Eb3
+m,I?iqVp)d%,A=MDId'Z?!L]A>[.25"^>;A=Bf#.=o_\'<sVo0=&r:#<E<#s;[$&r:esnar_N2`
+ITKWS=^,-9?=.)K@Uit\B4u!pCi4-0EH?5FGBeF\I=?]tK7nu7M2R=QO-,TiQ'[o.S=Z@HUSOcb
+WN*&%Yd(OA[^WfY]Y2(q_Sa@4aN;WLcHjkbe'uq"f\,!6h;7&IiT&t[k2tmll0@U$mI'H3nF?)?
+oCMVIp%J+RrV6Egs8)Zjrqu`no_sFAK)^?~>
+JcC<$K`C]Drr)ior;6Njs7uWg!Vc<eo`=^VrphN.nF,i5m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@n=FFA_-V>%%TWrK'hWq*1jXSn[]SH,8\SHG@LPE,X%s,f=,USaogVl?`"YdCdH['m<M
+[CEc[\[]/[[^`]M\@/iT[^ioU\$`TM[C*HL['I*I[(!HOZF$g<YkPEuZKear[/IE3[K<hD[J7*3
+[C3KN[eR<>\@T>d]t_A!_8=%*rPScVa3">'!6kAcrQYDirm(eqcd'h^cd)O7qp,5d#L:T=bfn>V
+bPoZWaV`(<_nj+"]"#2W[C*HO['[9N\$icT\@8sH\bs&<]DK8M^;@e,a32fWfA#0@j8S0=k5XTH
+k3(mgroP!Zkj%I!lg3s(mdBT7o()GGp\F[_rVhBJ\c2`rkjJE-!9*nV1]7"<Vl@MgmdohB^n-7:
+P?aZNSQfW2Z)at*XK/@)>[(ZE?!LZ=_nWn!^V.:k\$`TLZ&\i8p[75*jPf1]m-s9'k4/**kNV!a
+gt^W@gt9ck`l,a1^qICm\[SrS\$WQM[f3],[WkkV=^#$7?!grI@Uiq[AnYmnCMds-EH6/DGBeCZ
+I!pKpJqJc3M2I7OO-#NgQ'[l,S"6.DU84W`W2cr$YHY==[C3TU]=ktp_Sa@3a2lEHc-F\`daZgu
+f@em4h;-uHiSrnYjlYail0@U$m-X60nF?&>o(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?s+:9$~>
+JcC<$K`C]Drr)ior;6Njs7uWg!Vc<eo`=^VrphN.nF,i5m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@n1@qon0K_C6"L\cbdL\ci'LB*/"FT?U`FTHK$rbXc6DfBfHIt*$!J:WB,KnP;<LkgkE
+N/EROMM[:KMhm.FLPL\AMM[.GLkpe@LPUY=KnkA7Lk^_>L4b)1oSi^-p5\d+rfI/@rf6l:rf@,@
+r/gZ8s,mAHrK[DK!13SK!13\PrgEeTrgWkVrgj(\r1*_T"e;'PS=Q5KSH#)YSGnu[S=>t:p6l/Q
+Q^*buPl?m@Pl6mHQ3<P?QC!s5Qj]@PS=ZCIUSOfeWiZ0%!3cC+s02g4Yct=9Z*L\7Zi@E9[^W`U
+\G`rY]">Sf]tV7t_8=+.`5Ta9a2l<BaiV]Kbg"GYcd;[=+O\`geCE1'g"P39h;@/Mj5f:`kj%L$
+mdTc:oC_kRqtu$Fo`%2*YHG42W2Q_sjQ5+@aM>37JX)t<b/f!iF_PE)8p>H$9i=f?J:W3$It(6i
+:/t4k;Gg8SOcPTbNfB'WLkpnCOT-s(ageUYX/rA%Y-PF>YH>7GWiWA%Vkp5cVPBiQR?s2&PEM#g
+NJi^PMi3CJM2;.doS@`n=]np4>[:]D@:E_WAS,UiC27[(DfKf>Fa&(UH@1-jJ:`E-L5CeHNK90a
+PEhK%R[]k>TVA6YVl6VsXfnt7ZaI6O\\#Pi^r"".`Q-'BbK\>ZdF-Opf%8U/gYL]Ci8N\UjQ5Oe
+kiqBum-O--n*ol;o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcC?%J,~>
+JcC<$K`C]Drr)ior;6Njs7uWg!Vc<eo`=^VrphN.nF,i5m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@mp8P;`O;>X2c:]=2I;>O2e;#sKTpcSR>pcKKW3]]5\2`a&_4@;M(6q'L47Ros>84H*B
+8kMbU9F=Ed8kViN92%rL8c;9]8IS-[8P2TH8kDWG84Q2L8H20[8FKIC;u]_q;uK\q<<-"p;uTbr
+;uBVk<W,tt<rc@u=8uD&<rcA$=8l;'=&rB$=92Q,r`B)"r)Wl!r`/qur`B&!r`BA+=B\j2>?^u.
+rE92(r`K)"r)`r#r`0>,=BSd/='&L+=oDG&=8c8"=TD\)>l@q.?i=C4@K0^5@/j[6@K^1OAS#KQ
+B)u[YrFl+Cs(_RMs).jTs)A$[rcA0`G5cXaFqAnEH$O^_I"$QqJ:W<(K8#'YLB<9gMZ/PQNK90`
+P*D5tQC+)/R[]h<T:hmPUSFZ`W2ZfqX8f7AXfnt6ZEggC['d9K[^NZU]">Vg^;%J"_Sa=4aiXP)
+s3(Ac"jbQCdaQ\Ee-FOUf@\a0g=uV^"Pqqkhr"Fkro*n:ro=%>!9O1Aroa=Fs60OKros:ErTjIL
+qsFCL!:0RL0Bp,p?sHuC>[:WBH$XFB@9lo"6:spOApHI&1GUUA.m?*Y0f:dX7n,p:77K3q3;u)M
+4Zk`)<E)pt<Dumn;uT\ok4[p,jQtq$iqh^"jR2+Vh7/A]A6rPI>[C]@>@(TA>[_#B>$G-4>$>$/
+='/L*<``=$<`N/u;[$&r:esnar_N/_GZS$N>$G6;?XI5N@q9._BPD3sD/O93EccGJG^4U_I=Hd!
+K8#&:MN!OUOHPfmQ^F52SXuLKUnsufWiW>+Yd1UC[^`l[]t_A"_o9U8aND]NcHsteeCE.%g"P3:
+h;@/LioB+]k3(smlKdg'mI'H4naZ2@oCW%T!quB_rqQNhs8)Zjrqu`no_sFAK)^?~>
+JcC<$K`C`ErVc`nr;6Njs7uZhs7ZNerq.r:oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@JL%
+da?Cdbfe,LC3+oWS#NI^Wo0lDWrK-sSF<!VR[&toNJrp\Q(t+OrhpU4Xg5=?[C!<L[C3BN[^iiS
+[Bd6K\$u=G(:CWZ[Bm9K[^EHM[CNcR[Bm0DYd(C7r3?:+s0;U0s0;@)n?`,$rO)[6!OT9+[/[Q6
+\,Wl:\,Nf;\%0-M]`>hH_%"2r_8=+.`Q$!@ai_cMrQY8crm(bpcd'h^ci),icd)L8s3CVirQbGh
+s3:_kbKJ'(aTol*_S<dq\[MIEs0hs7#IV"J[C3NQ\,Ei:\bs#=]DfGU]tD"l_Sa=2aj8GfgY^uM
+jlGP&k5=BBk5OKBjq[.Gl07L!lg4$-n+#u>o_/(UqYgBlJcE:\!po(:ro!n=ir/m5r:f`ZWPdW\
+oB`<ddC>*sOJ&5:>\.6HX0&>%WiK<.>@LuH>[:ON^V.@r]tCna[C*?HNrL[)o&f#oiofOknE]?$
+mI]N%ki1LTgYC`CfuqLW`PTL,]tM%g\$`ZR[(!ENrjDC,ITKWS>$G6;?=.)K@Uit]B4u$qCi401
+EH?5FGBnL^I=?]tK8#&9M2R=QO-,TjQC+)0S=ZCIUSOcbWN3/(Yd(OA[^WfZ]Y;.s_SjF6aN;WL
+cHjnce'ut#f\5'7h;7)JioB(\k3(sml0I^&mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`np&9OB
+K)^?~>
+JcC<$K`C`ErVc`nr;6Njs7uZhs7ZNerq.o9oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@JL%
+da?Cdbfe,L?=mtnIY[TPs+fTgl\F_I*HH+;Des6-DfU8TIXciuJV8`2LPCS>M2R7HMi!>jM$Jfn
+LP^hDMMhCi!f2VcrJ(l:Lkg_>LPLV<KS+r0JqX)]rJUW5qMk?3nrNg4s,[/>rf@)@"-8P)O8Y.@
+O-'4#rK%&BPPpdGQ2m3JQN*<NR/`TSRf8fSS,f,ZSdM$YS=Q4@S=?"<SG\rPS->CPS=Q4?pR25Q
+QBdYtrfR8FqNV#D"I,1:Pa)-3!1*SMs-`bO&"9#ZStD[MV5U>mXfeh/Y5PU)Z2Lm.Z*:M4Z3%A?
+[JmZ8\Gs,>])TAN^:h:r^qdh(`5KX7a8X.4aiMWJbKS5VcHjkbdF-Lnf%/I*g"P08h;-uHiSrqZ
+jlkspmI'H5o(2PKq>:,As7?7?eZl6]X/`2%X5rBpcc3`,JUs)]\B2^<Mn#*eD/4B>G"kn2KRn]'
+JUi7L:D-Z,<)ZXiPECogO,f6[MM[1FLlhWdo#\GMXfJP*Xfo%;Ycb.7\uW!:WMcViV5L,_R@0D,
+Pa%;lOH#0VMMmDlM#`A2L\-CO='/U/>?kH??XR;O@qB7bBPM=!DJsK6F*)SLH$XjdIXm!%KnbD?
+Mi<[WOckuqR$jG6StMdPUo(&hX0&P/Z*UgG\%0,`^;%M$`5Td<aihoRcdC.heCN7(g=k?<hVd>O
+j5]7`kNM0plg4!*mdKW6nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTerdk*$s*t~>
+JcC<$K`C`ErVc`nr;6Njs7uZhs7ZNerq.r:oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@JL%
+da?Cdbfe,L7S-6H:esp[:]=2f;<q-G;>iTQ4T7M<4;'\:3B/rW3]fDj6UX@36q'L88,bs\8P2TK
+9)_Km92%uO9M%iJ8kVfL9)_Bq7nH9E8kDWI84c?C7n?-?84Q0@rDNSks&/kopepKXqc*Pn!E<(s
+<;TVo<;T\q<rZ/%<``@)pK%>srE'#"r`B5'<`f6%rDs&$<E8rtpJq2n!*B,$rE95+>5hV(=o;J'
+=9M]+=&rB$=8l>$<rQ2"=9)G%=T)A1=BAR+=BSd1>$5!4r`oJ-"'o5??iFF7@:3I@@/aR7@f9g:
+A,p3?AcQK@B`2]GC_(B!DJjB2E,fr?FEMbNG'Eq/!-eBfs*HGKIt3'#K7no3L51P?Ll%"IMi<XS
+NKB9cPa%H"Q^F21SXuFFTV/$SUnsrdWN*#"ri?F.Y-5+9ZF$sG[J[HP\%&u\]=kto_8=+.`Q-'B
+b0.uPc-=PZcd:(frmUns"kD2Tf\"mVg'ZTih;7#Ghr*JQir8!<j8e6>jT"<Ak5OTCl2U&KlN$;N
+lhg&ImJZJQn,;\SmJcJNmK`'mHXU,a?=!P:2g]gfAmnnD6:+:<=(Q205'U![2)IQ\4>A]M7n6*<
+7R]a(3&j)d5!;"h<E3!t;H6Xp:fC:j;Y]JJk3_9ujSIuhjr3-fMf306?!^cC?!UZ??!^c@@9?`<
+=]np3=T);,=B8L(<`E(!;Z9Sq;GmBhr_N/_ITKWS>$G6;?=.)K@Uit]B4u$qCi401EH?5FGBnL^
+I=?]tK8#&9M2R=QO-,TjQC+)0S=ZCIUSOcbWN3/(Yd(OA[^WfZ]Y;.s_SjF6aN;WLcHjnce'ut#
+f\5'7h;7)JioB(\k3(sml0I^&mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`np&9OBK)^?~>
+JcC<$L&^fErVc`nr;6Njs7uZh2>?h<p%@tLoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLgtUQ8f@JI#
+dF$:cbfe,LDK^A_SZ8^aWVrdOVtm:gWW0!oSF<"%R[&qnNf8sYPbFkKV5L2kXK\t8[Bm*E[C*9J
+[^<HN[^EQR[^WcV['[6KZa@-KrNuU4%C3IP[^NKHZELI6Y-G82YQD)8ZMq-$ZM1^%[/IB4[/IB6
+['R+9[/[K4[/dZ5[JmT@\@T;b]Y2(p^q]la&]2H(`Q-'@aihoQbfn>Uc-FW5cN)>kci;Alci2;k
+chl)hdJhMmci28pccs\Wb0'V'#0=`u]t1b_r3c:-s0r!;rj`-B\[f<M]DoPY]Y2(r_oBd@cd^S%
+i8WhZjQ5Lck5FHEk2k\'irJ3?k7["Dm-X3/n*oo=oCM\Oq>:*hrdk*[rs.oQlf-sajQ-:>)Z06u
+Vl7MkmdfV=WmeV5P`]@GT3>i5ZE11,ri6c<>[1`H?<gc?_nWq!_7dIk[^<HLZ&\i8q"*V.jQ#Lh
+mI9H+k3DNujQGR^h:pcEhV-2o`l5g3^:h1j]!f#U\$WWN[f3],[WGPO=]np5>[:]D@:E_WAS5[j
+CMRd)E,fo?Fa&(VH[U?nJV/W1LP^nINK90aPa.T&R[]n@Tq\?ZVl?\tXfnt7['mHS]"G_k^r"".
+`lQ9Fbg"G[dF6Uqf@\d1gtgiEi8N_VjQ>Ufl07L!m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6Kk
+rVcBfJcCB&J,~>
+JcC<$L&^fErVc`nr;6Njs7uZh2>?h<p%@tLoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLgtUQ8f@JI#
+dF$:cbfe,L?Y4+qIY`gRLWkMQLZ`ddF)Z#7Ci!s,EI7\5s*k$#rdu2ELkLG:Ll$nCM27"GMMR(F
+LP^nFLPL\@KnbA=re:u<KS>/:Lkge?KS>#0JV&i>rJUT4r/LN4lAtn*rK$o=s,[&>qiCiAPPpaG
+PlR'IQ2d0MQiEEQRJ`NRS,SrXSc55XSc##XSH5=Qrga"Zpm_JXS=H(<qO.STQB[VtPQ$a>Pl?sH
+PlI'LPm!D>R$jB?Qkc$XS"6.BTVA6ZWN3/(Y-"k1YctC:rN?C/YHG%3ZMq30[f<g)\@K2^]=Ybj
+^V@S"_8=+.`Pop@bKS/RbKJ,Rc-FV\d*^:jeCE.#f%8R-g=tE=hr*JQj5f@dlg*s+md]l>oChtU
+rIP">rr^iWXfq`*s/l=^+4nfW]X36@Q)(t4^jUgDRq$>O:3LeT;br'uJUW0#JGr=W<`E$s;,EI<
+Ocb]bNK&gQM26qKs"<la]!e`AXKA\1Z*^a?Y-PO;Xf\S#VPU)eV4j?FQ^*buOcYZ`N/NROMi!:H
+M#N2%Lic[!=]np5>[:]D@:E_WAS5[jCMRd)E,fo?Fa&(VH[U?nJV/W1LP^nINK90aPa.T&R[]n@
+Tq\?ZVl?\tXfnt7['mHS]"G_k^r"".`lQ9Fbg"G[dF6Uqf@\d1gtgiEi8N_VjQ>Ufl07L!m-X60
+n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcCB&J,~>
+JcC<$L&^fErVc`nr;6Njs7uZh1ACM9p%@tLoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLgtUQ8f@JI#
+dF$:cbfe,L6q^3Ir_W;ar)!5ef2;TGqE+R:rB9p<s#U<A3&iqt3W_Z76iKIX77Tg97S$&K8I.p]
+8P)WL9MA%W8d%^Y8kDSO8H;B]8cM<]8,Z!Y7fZ*Y8,lKc;?'Pn;>*o\;u]hj;Z]p!<r5kq;u]bo
+<;fhr<WZ9%<r5qu<rQ2#<r?#$<``@)r)`l"rE&u!s&\qqr`&r!r`92(='&N$>5h\%=pS53<E3("
+<E<2f=T;J%=:&,6>?b34=^#$6r`fP2?XI4?@0'bCrF#Y6r*o\9!+c(?#\Ia`Bk_6oBkmW_s)%aQ
+s)7pWs)\3^!-\?cs*+Nhrd$hVI!g?kJ:N3&K7no3KnbA<LkpqHMiE^VNfT<cPa%H!Q^F21S=Z@G
+TV8*UV5C/gWN*##Xf\b/YctF=['[6LrjMs=]"7jN%_B?f^qmn*`Q#s>ai_fNrlkntcd:%ddaHUo
+eCE.%f_sM'g'HHhh;@/Mj5f;#jo=KCkPaNLkN:skl07L!lg4W<!:KdR!:]pTq="OWnF5o8qsOLR
+s7$6Z_0f]sra%0`?<qo'De3<Z<C0#E9ikn73]qR\0/bU<4ZkGV1e:/,6q'R52`Wi]5<_4m48r4d
+<`E's<)HOm;GmGYs68S-n)jH-qW?MprT4RI\VkB;?sR)D?X6rB>lJ"N>[LQ9>?P04>$4s/<``C(
+=B8I$<E2pr;c-Fi:f'qar_N/_FB2IG=^#'8?!grI@Uiq[B4u!pCMds.EH6/DGBeF\I=?]tK7nu7
+M2I7OO-#NhQ'[l,S"?7GU84W`WN*&%YHY=>[^WfY]Y2(q_Sa@4aN;WLc-F\`e'uq"f\,!6h;7&I
+iT&tZk2tjkl0@U$mI'H3nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s+C?%~>
+JcC<$L&^fErVc`nrVQTj!;ZTg2>?h<p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@n9EI3%pW2ZcnW;NRdVYI"cV!t5WVZ!FeSF2p[S!B+sN/N[TPG4kMV5U>nXg7l0&@8gO
+['mBL[^ilY[^ru[[^5q?s0`3?[C*HP\@8oTrjDd5!42[/!N`I'YlCs0ZE^\3ZN%3,ZMq30ZM_'.
+ZiIH+[/I<7['R*GZa9M8rNum=\@B,]]=bfT^&PkI^^%cr`Q#s@bKKh-s31Phrm18as3C\lqpGDi
+!n#??rm:\k&'iDBb0%iJaN2E@_7dCh[f!Q,[f3c9\Gs,>])T;@])9/M]Y2"o_SjI9bKn_lhW*\r
+jT=W-k5FKCjT+??irA$PjQ5Oel0@[(n*ff;oCMVJq>:'fJcE4Z#OLU:j5f7]jo,38rV,fZVo%B\
+o&ljRe?+1/P$suSS7Z-8Xfn_*X/fK/>[q2J>[1LQ^V7Ft]Y(ea[^EKKNrL[)o]>2qj6>gpnEfE&
+kjRWpj5f+Th;$uGgX!s\`koU,^:_%f[^N]T[(!BMrjDC,Gue!K=^#$7?!^lG@U`kZAnYjmCM[m,
+EH6,BG'A4XI!pKpJqJc3Ll%%KO-#NgQ'Rf*S"6.DTqeH^W2co#Y->4<[C3TU]=bkm_8=.0a2lEH
+c-FY_daZguf@em4gtglGiSrnYjlYail0@U$m-X60n*ol<o(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?
+s+C?%~>
+JcC<$L&^fErVc`nrVQTj!;ZTg2>?h<p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@n.@VBP%L5:Z_LZaEiL#n$hFQIZFF!bjEChmm)EIE4_IY!!#K7nl2K7ei3MMR(GM2@+I
+M2I(HMMm:GM#E)0Lkbna!euJdrJ1E-!JcF/K)pLSrJUW5qi1E3p5]98O,s7"rf@&?qN(Z<!0Ql7
+rfI2DqNCoDrfmYQQ^=),RJ`KRS,AfUSc55[SH57Orga"Zs.97_s.04]rgWtZqj[_YS=KSJr0d_U
+Q^*g4PP:=APl[29rfdDKrfmMMQhm*LR1#IRSXuIHU8=cfXKDE'!3c@*rN?.%ri\u"ZaI3M\%&rY
+]">Se]t_@u_8=(,`5Ta;b0A8Zcd'e[cHjh`cd:(ee'umte^i=(g"P39h;7&JioB+^kNV9tmI'K6
+oCMVKq>C5Cs761Qf!DN^XfSV+XlSHlbf79$Jq0)]]?.[5KsuM>:2NdMGB?e\L4b&-JUr>I:et+k
+;c6IhPE:lgO,f6[Mi7RkOT-s(agnm_X/rG,Yd(R?Z)t7<XfSV(W2?AcVl$2XR$O#$PECrfN/W[P
+N/NLKLku%coS@cn='/U/>?kH??XR>PA7]@dBPM=!DJsN8F*)SLH$XjdIt3-'KnbD?Mi<^YP*;/s
+R$jG7StMdPV5L8lX0&P/ZEpsI\@K5a^;%M$`5Td<b0/&TcdC1je^i@*g=tE=hr*JQj5f=akNM0q
+lg4!*mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*%s*t~>
+JcC<$L&^fErVc`nrVQTj!;ZTg2>?h<p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@mn7S6?K:Jam]:]!uc;>=&e;<:^M48V/<4nq/>3t+,/3&s&]6U4(.77B]F7gqjX84cEG
+91_`L92&"W9)hNa9)D0^8kDTHr^d,]8,Gg\7n-!>7n<MTs&/kop/:K\!`Drqr_iYm"B8B%<`S`j
+r)Ebu<W6%r=8u;*=&r=$<``B#<r5ts=Sl/#=BYW(!*B/#rE&u!r`9)%r`B)$"Beo3=]tZ+"C#&3
+<`],u!*8eqs&f>(r`Au!rE9,'r`KM2>[:WA?!^lGqdK5.raQ4EAS#IcB4u!nrG)@J!GlWPDB<_8
+EH-&@FEVkQH[C$_H$OaaI!pElIt3'#JV&N-K`6`+LE_P2Mi<XTNfB'[OHPinQC!u-S"6.CTV/$S
+UnsrdW2ZeuXT#@4YHY:;Za@-K\%&rZ]=Y`T]e[76]t_D#_o9X9aN;TJbg"DXcd:%ddaQ^qf%&=%
+f%A[/g=k<:gtgfChr3SUjlY^gkPjZQl0.?ql0.Bqkj%I!rp9^RrU9dUs7--[r:0UR!qZ!Rq!n@T
+-1J`u@9m2H?X@#EH?O.:@9HSs6:ssTAQ_,ZFuCs$1bCmR4>eqo8.\6\7RK-q3'KPj4Zkf,<E*#t
+<!6#p<)QWclN$5Cl.G4Rl2BfUiOXteA7/YK>[LcB>[1V6>m=D8>?Y05>5hV7='/R+=B8I$<`Dsr
+;c-Fhr_EMjr_N/_Gue!K=^#$7?!^lG@U`kZAnYjmCM[m,EH6,BG'A4XI!pKpJqJc3Ll%%KO-#Ng
+Q'Rf*S"6.DTqeH^W2co#Y->4<[C3TU]=bkm_8=.0a2lEHc-FY_daZguf@em4gtglGiSrnYjlYai
+l0@U$m-X60n*ol<o(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?s+C?%~>
+JcC<$L&^iFrVc`nr;6Njs7uZhs7ZNerq.o9oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@SR&
+da?Cdc-+8NAU&WQQ`9eYn>6)ZqkNkZoV;8Y!2]L]rgNnXm[XcUQBI5bMi*UZUo:/fri$[8Yd1U;
+YctF>[(!KN\@B,\]!o2Z[^Z7Ds0Vg6#I_%M\$rcQ])K)CZa@'DYHP+1XSB(#ZMUp,ZN%92ZMh',
+ZN%<3ZN7G=os4Y'r3H@0!j]/<r3HX8[C!?M\$rmH\cBA@]F2Ee^r"%/`Q60DbKKh-"3o-;chPle
+ci)5fd/_VodJqPkck+OKbK@uLaiMNA`50.!\@&aD[/RH>[^W]R[C!9I[C6(DrODg;qR[0K^;%M%
+`lZHPf\YWKroFOMkN:pikN:pgjPo.ti"P)/j5f=bl0Ia)nF6#@pA"L]rV_<I[f6Tuk2tadjQ>V'
+ru1n3m\Zkshsg3tUp\^\JmFRLTU_Na?ad2@WrB%1>ZtB:@U<>F>fFLl^V7Cp])K,=[Btto-hm5o
+jlGIdl0Ia'lK@<rkMtU`iSWMHi8<;9aMu08_8![r]",8X\c/u;['otAoX=d#I99WT>$P<=?XI5N
+@qB4aBPD6uD/O<4F*)PKG^=^bIXm!%KSG8=MN!RVOckroR$jG6StD^OUo(&hWi`G.Z*UgG\%0)_
+^;%M$`5Ta;aihoRcdC.heCN7(g=k?<hVd>Oj5]7`kNM0plg4!*mdKW6nac8Bo^qhLp@e7Zp]1-h
+qYg<ir;QZerdk*%s*t~>
+JcC<$L&^iFrVc`nr;6Njs7uZhs7ZNerq.o9oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@SR&
+da?Cdc-+8N>%D>bH\V?Op4h"L!/CGok&guPEc>l2Ci"$/IK"]qJ2Mn0K7nu1K7nu8M2I1GM2@+I
+Mi!:JM26nALk^Y>LPUY>L5:S<M2$e@Knb>8K7\]*J;fGFqi(Q7q2YK9rf6u=pQ#-3rJgu@NfT7n
+OSk1>OT1ICP5CFFPa.N"rg3YQs-iqVr1*bWrgs(Z!hPpPrgj"Zs.B=_rgiqVs.0.YrL3bS!gf1;
+r0.,C#*Y::Pa%AqrKR,C!1*SMqj@DO$CdQVT:r*ZWiW>)r2q*EYct=7Y-"h-X/i>(Y->.8['mEP
+\%&u[]Y2%n^qp#e$,a^#`Q-*EcdC29d3[5gdaQ^re^rI+g=tB<hV[8Mj5]7bl0@R"m-aB5o(;YM
+qY^9jJcG<@2qG:;Y-"h-XKL^Ae]PkBY^q=gUqFgYI##4b@nLT7GBJ%,:ks[SJUi<%:Jah_<Dugn
+:m7$'OoCCFNJ`UMLl%5n&G+&T[]QU3Xg#%7['?m=YHe).)QTd7V51&fU7@U:P`q;nOH5?ZMMd@M
+LP^kDreL-%s&OPM=]np5>[CcE@:E_XAS5[jCM[j*E,fr@Fa&(VH[U?nJV/W1LP^nINfT<cPa.W(
+S"-(BTqeE\Vl?\uY->1;['mHS]"Gbl_8=.0`lQ9Fbg+P^dF6Urf@\g2gtgiFi8WeWjlYail07O#
+m-X60n*ol<o(2MGp%A%Pp\jjeq>U6hqu-HlrUg)?s+C?%~>
+JcC<$L&^iFrVc`nr;6Njs7uZhs7ZNerq.l8oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@SR&
+da?Cdc-+8N77TmD:&[ud:]F8j:]=2i;>X8D;#jMe48M);4o.;@3ts_83AriY3^H&#6UaC47Rp!>
+7n?/L8chRV9D_<^8P8qQs%<;_s%<5]s%!,]r^cuX!(QoWs&/hno2>Ter_i_opeq#g"B8B$<`T)t
+rD`hspf7>nqc<Vrs&T(uqc3bu<`]0#rE')'=Su5$=]kZ)"B\f0=BPH%!*T;'r`B)$qcWr&#?tA7
+=BAR)<r>r$<``C+=BP2ss&f;(s&oD*r`TM/=BSd2>[787!+5S2rF,b:r*oY8s'uRMAnPaiBk_<s
+CMRa&DZ4SSE;jh\F)l>DG'O"5"+#6<HM`(%IXcfrJ:`H-KnbD=M2@+JN/dgss,Ta5Ocu&sR$jG7
+StD[KTqeBYV5L5jWi<&"XKJb2Z*L^C[C3NR\%0)]]Y;+p^qmn*_o0O6a2c9Cb08,TcHab_daQ^r
+f%8R+f`'S(gAfqCh;7#Ghr*JQioB+]k3(pkkiqBtlg"K8!:9^N!po=ArU0XQrUB[Rq=F=Ps7?9_
+"7j9U@/aFY?<pfBHuX"7?s$Dq6:jmS@oGHPG;_*$2(UsT4#A]`84Q0>7RT992ul/A4UjJQ<E*!u
+<E<!n:K14iq!RhApZq_Cn*A6`rTP3[]8^]=?X-lA?sR&C>?kK?>[1H:>Zt?8>5hV3<``C'<``=#
+<Dudpr_`kq:JO__r_N/_s&OPM=]np5>[CcE@:E_XAS5[jCM[j*E,fr@Fa&(VH[U?nJV/W1LP^nI
+NfT<cPa.W(S"-(BTqeE\Vl?\uY->1;['mHS]"Gbl_8=.0`lQ9Fbg+P^dF6Urf@\g2gtgiFi8WeW
+jlYail07O#m-X60n*ol<o(2MGp%A%Pp\jjeq>U6hqu-HlrUg)?s+C?%~>
+JcC<$L&^iFrVc`nr;6Njs7uZhs7ZNerq.o9oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLh:pZ9f@JI#
+da?Cdbfe,LApA]TRA0MSp8.V]rhKIel_4-Kr1j(XrL<hWn!sTNR[K:sre_&BO-?B:W2Zf!Y-%],
+/@2Xi[(*TT\[o;`]"5>[\@&`N[(!HN['mKS[^WcT[C3KP\$WNJZa$d;Y.aD2qm-+(rj)O0r3H:-
+"0o/;Zhq$,Z3.A;ZEsM8!3uO/"1,DD[f*ZG\@K/]]">Yj_8F42a2lBErlPDfbg"GYchGfcci;Ae
+d/hV?qp5hubf\&LaMu6;^qI:g[^H+As0_d5s0_m5!joADrjVm:s1/-?qR\Jq^;%P'a3)]WgYh,R
+k2k^fki_0nkNM$hj5AhPhVR/Hi8WbXk3;0unF?)Aq"sserdk*Wrs.rRkNM0rlKA-G)?0BuVkq,a
+nFGb;[a_j>?BSinS=Nnm\$<"5WYV\8>$P9@?X@#C`5'(#^V7Co\@8oS[#Y/;p@IA,jQ,Ielg=$(
+kNM3mjl5:Yi8<>JhqZZ%a2Pp2^q@=k\[JrW[C3KM[f3],[f9BQ='/U/>?kH??XR>PA7]@dBPM="
+DJsN8FEMeOH$XjdIt3-'KnkMBN/`m[P*;/tR$sM8StVmSV5L8lXKA\1ZEpsJ\[oGe^VI_(`Q$!@
+bKJ/Ud*^=le^rI,g=tH?hr*JRj5f@bkNV6rlg4$,n*fc9o()DDo`"Lap@nO\s7u]kr;6KkrVcBf
+JcCE'J,~>
+JcC<$L&^iFrVc`nr;6Njs7uZhs7ZNerq.o9oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLh:pZ9f@JI#
+da?Cdbfe,L>@q\iI=h9Mp4gtKq/kkDs)]<&Des3(Ci+*1I=?ZqJ:N6'K7\c2KntPCM2@+IM2hLl
++,bu1LP:J=LPCP=Lkgb?LPCM;L5:Y?L4tA8KRn`7Mu&D3NUi,*NW"n;O8k4CN/`gWNr4t;OT(:@
+OSt7?NrG(@OHG\#Oogi3Q2['WQ^F20R[]b7S"#t=rga%\qORYVrgieTqjd\W!M#YWRKT%GQ^3m6
+PP^LDPEc'1rKR,C"I>C?QC%Q;!1EhTs-ta6TVA9^X/rG*Y-5%5YHY77YHG%0X/i8#WN3)$Y-,"7
+[C*KS]"G_k^qde'_Sa=k`AGTTb0JD`eC2ptf%&@&e^N!se^`7&f\,!5gt^`Bhr*JQj5oIglKdj*
+n+#u@p@nC[r;?MEs7-+:e[)E^YHb=8YNFTiai1fpJq&oX]Z7^5Lpr1M8o7FNG'$GULP181rIFlC
+#ZXf&;,EI>O-'@%!f`.sreZa:%J.cQ[B6O3Xfnn4['?n8Y8s[FXK/;!V5'rdURdg=Q'.;mO,o6Y
+MMd@MLl.%FreL-%s&OAG=BSg3>[:ZC?t*SUAS,UhC27[(DfKf>Fa&%TH@1-jJ:`E-LP^nINK90a
+PEhK%R[]k>Tq\?ZVl6VsXfnt7ZaI9Q]"G_k^r"".`lQ9FbK\>ZdF6Uqf@\d1gYL`Di8N_VjQ>Uf
+l07L!m-X60n*ol<o(2JFrq-<cp\jmeq>^<hqu6NlrUg)?s+LE&~>
+JcC<$L&^iFrVc`nr;6Njs7uZhs7ZNerq.o9oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLh:pZ9f@JI#
+da?Cdbfe,L77^!E9i:LYr)*;gfMVZ2ofMt3r&ss?$9L:13]K)W3BK8ar^7Pi7n-!=77Tj=84cEG
+8P2WJ8k_iM91hhU8HVRV92#7V!(d&[r(-`U#=q?T9i4bc;s[B^;>X8g;uT_r<W#hj<<-"s<W?%k
+<rQ)!<;ons<rZ2!<WlK)<``B#=T2A'=BSf*=Sc2"=T2J%=8l;1=^"s1=^#!5>$+j,<W6&!<<lT+
+<E3($=BP2s!*K2&s&oD*r`];("'Sr7?2e.5?t!GO@fBd9A,]p;A,KdN@q9(ZA7]@cB4tsnC27X&
+D/O91E,berr,W!`G'\L^rd"`pI!g?kIf=a$IXm$&KS>,7L]3/1M?AcqNK4"!8!0"!Q'[l+S"-(C
+TqS3UV50rbW2co!XK8P*YHY=<['[9M\@8uZ]">Yi^VI\&_o'F3`lH-@ai_fNc-FY^dF-Lne^iC*
+g&B_*gD\l'h;7&Hi8ESQioK1^jlY^gkNM0plK[^$m/HDOmeuVRnGi%YnG_tXnc8:Yo)81Yo^_Z,
+oY>f^?!^lE?!UcaEc,Jt=B.^T7o!2s=$&Qh2_QL7/j;B[0Jc3i8Ou??7n3J;s#glV4Zc\E<)lmt
+<`;jm<)Z]mnb)DDn+,l%m-!^5l6t`+NG`64>?tKA>[:T=?!^fA>[(H;>?P05>$4s.<EW@&=&i0u
+;c6Qn;?Tin:Jame:\7K`<d7\J=^#$7?!^lG@U`kZAnYjmCMds-EH6/DGB\=YI!pKpJqJc4M2I7O
+O-#NgQ'[l,S"6.EU84W`W2cr$YHY==[C<]X]Y2(q_Sa@4aN;WKc-F\`e'uq"f\,!5h;7&IiT&tZ
+k2tjkl0@U$mI'H3nF?)?oCMVRo`=d\rV6Egs8)Zjrqu`no_sFAK`?Q~>
+JcC<$LB$oFrVc`nr;6Nj!;ZTg2#$_;p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oHBQf#]Stc%XqPF+cqkO.brLr,Aq4.;Nn"'HI$^d*:Mi*=NNf^*8VZ*P)Ycb::ZEgjE
+[CEcV\@B0M\0&/c[C*BL[C!?M[CE]T[C*KMZE^gHZaI$CZ*2*]^VBEGrNc@+!3lF,s0;X0rNcI.
+!4)U1s0;U.!3u@(!3uO,s02L-s02L-'XG'P[C*HO\$rlW\\#Mf^V@Y'`Pqeq#04g-b08/WpsB#d
+s3LeodeV;fcjn@FbK7iH`l,^-]=>>X[JmN3ZiRSCrO)U1s0Md6rjVp;rji'?s1/-?s18ZO]t_G&
+a3)`Zh;[MpjrrpOkiV'kk2tdbi8<DJh;$f?gYL]Dj6,[onFZAHq>:-iJcE+W#Opm<l0Ra%m/?r/
+rqPp@V7k^ToBE!Se@C0:O^t;[T3Pg8Z`L.+WiW1'?!CcEr`oV/_S3ea^'2-Y[^ENLNrL[(o&Jim
+jlYdmmHa'#kih-hiS`_RhV6rFh:'Hc`PfR.]tCtf[^WcS[^EKNrjDC,H<"!I=BSd2>[1TB?t!MS
+AS#LfBkqO&DK'T:FEVkRH@('hJ:`E-L5:\EN/is]PEhH$R@B_<TV8-VVPpMqXfen5ZaI6O\\#Mg
+^VRe*`Q-'BbK\>YdF-Oof%8U/gYCWBi8N\UjQ5OekiqBum-O--n*fc9o()DErq-?dp\4[^s7u]k
+r;6KkrVcBfJcCE'J,~>
+JcC<$LB$oFrVc`nr;6Nj!;ZTg2#$_;p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH?"RnlIt[WQqM+p%dY.@:l?,I9F`_YACi!j#D/X?@I=?]sI=m-*KS>/:L5:_FLl%"H
+Ll%%GKnkG<LPU\>LPCV?L4t>9KS+l2LkUV:KnP)AO,f7qN;JV7Nr+e:NfF!rqi(i@O,o<]N/`hh
+NrP+:NrP.BOH5KbrfIAIOcbfiOoCRDPlI'PR$X/-rg3\RrgWqXp72>XSXuFFqO[_XrL=ChS=H(;
+R@0G0QBdYuP*2%(P5LOBPl6mIQ4&tDQC!o&Q'R`&R$dl@s-j4`T:r-_Y-.c-qlg=/Y-+k,X/W,t
+WW/thX0&V2[CEf\]tV:t_8=+.`5]d9aN;WNcdL=of@S[-g"P05f@SU*f\"m2gYCT?h;7)Lj5]7`
+kiqC!mdBQ6oCV_Mq"jperdk+=s!H@+Y-,"8ZE^^ugXXB`]<J/_OeTJ-\pT7@Lgitn;1!M09iHk$
+K)C-5:/=Yc;c?Oj:m@$%OH5H^N/EIKLlhWho?=bQY,eY+YHG1<Z*CI8Y,n\+X/W(qV5L2dSsbq2
+PEM&iO,]*UMi<OMMMR)fL\-CK<E<1'=]ns6>[CcF@:E_XAS5[jCM[m+E,fr@G'A4XH[U?nJqJc3
+Ll%%KNfT<dQ'Rf*S"-(CTqeE\W2co#Y->1;[C3TU]=bkm_8=.0a2lEHc-FY_daZdtf@em4gtglG
+iSrnYjlYail0@U$m-X60n*ol<o(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?s+LE&~>
+JcC<$LB$oFrVc`nr;6Nj!;ZTg1\^V:p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH7S-9I:\moT;=79H;>iWN481l94oIJK4$5Vd3]T/Y3W;&M6pX.-6q'U87S-0B8P)HE
+rC[&^!_Q$Ur^m2_9)_H`8H)3\8.\?`84Q3A7n?*>7n-9M:/4^d;t3cb;>O2i;Z]os;uT_r<r,eq
+<W?%t<W5r!<E<0"<W?+r<<-)!<W5ts<W?,!=8l8#<<cK*=BAR+=S#\q>5DCu=:JD:=]ed/>$4p.
+<`W4#rDiu$<`\lps&f;&s&]A+>$+o*=oVY5>?Y04>$G6:?!UcFqI0M9@Uf=H!+bt:$tNp]AS,Rf
+BkhF#DK#Gl(34D8F)uGEFEM_NH@($cH[L9jIXZfsrdG-&J:`H.KnbA=reV8FMi<USO,oBbPE_?!
+R$jD4S=]_Q$)+)iVl-MoWiW?%Y!oP!ZEpsI\$rlX\[oDc]t_A!_Sa:0`Q#s>ai_fNbg"GZd*^:j
+eCN7'f\,!4gYCT?hVR/Ji8NYSioB+\k2tjikih<srTaRNlg*p:mJcSSnGhqWnGDbTo)J=Xo_\=\
+pAF[Zp,9^6@pN>G?<pfBI<'4;?s-K,5t=XO@TbfWFZ;$"1bM!V4YJW`7nH3A77Tg-3&j&`5!;"i
+=8c,(<`;jl;H$Hap@@qIo'l2<bjGAq$K\s^DId'X?!L`Ara#P/$XHtB>[(E9>$G*4=oMJ-=]eX)
+<E)ssrDNVlr_WSioMBj6<``C+=^,-9?=.)K@Uit\B4u!pCi4-0EH?5FGBnL]I=?]uK8#&9M2R=Q
+O-,WkQC+)0S=ZCIUSOccWiN8)Yd(OB[^`l[]Y;.s_SjF6aND]NcHjndeC<($g"P39h;@/LioB+]
+k3(smlKdg'mI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrqu`no_sFAK`?Q~>
+JcC<$LB$oFrr)ior;6Njs7uZhs7ZNerq.o9oCDJBnaGr7mHj3*lKRNqk2kX`iS`VMh;$`;f@SR&
+da?Cdc-+8Na)-$KLn".8rhTFdq4dh]rh//@qOI;LnspMbSXZ+;SX,FuMhm4JN0'j6VPpMrX8]=@
+['I$F\@AuY\@8iP\$NKO['R'FZFRHN\@;IF&@f-SZEpmF['d3D_o':*^:j9Gs0DL+rNQ(%s02L-
+!jJr7rNQ:)"0Si2Y5GI)Y-5&,YQ;#7rNcR5[^H+C"M)+T]=e-W'u.Q#_8=(,`5]j=b0/&Ucd'h^
+cd:&<cN)>kdJqYldJqSncPb$QbK@rJa2Gm2^:Lh_[C!9HZEpmCZ*UjFq6L(.rj;a7rjVp;s186@
+rjr-A$bX0f_8OC:d+@.6jo4E=k8<=@iSNGIh;$c<f[nd.g>M&Vmdp2Iq>:)@s0DY0nE8rum-Es'
+rVn\Pp@$t:^u"SPih<F&\UnCTA>Pri>@LpGX/`,!XJoE0>@LoF?!UUL^;%Cr]t1b_[C!9#s"*p8
+jQ5IbkNM6ulfmWujlGL_i8NYOgtprFe]GkO`50:(]=PP]\%/oT[C3OC[IgnW<E<.%=]np4>[:]D
+@:E_WAS,UiC27[(E,fo?Fa&(VH[U?nJV/W1LP^nINK93bPa.T&R[ftATq\?[Vl?\tXg#(:['mHS
+]"G_k^r"".`lQ9Fbg+P^dF6Urf@\g2gtgiFi8WeWjlYail07O#m-X60n*ol<o(2MGp%A%P!;HKf
+s7u]kr;6Hjrr)KgJcCE'J,~>
+JcC<$LB$oFrr)ior;6Njs7uZhs7ZNerq.o9oCDJBnaGr7mHj3*lKRNqk2kX`iS`VMh;$`;f@SR&
+da?Cdc-+8Na'WFoFaa4DqhFm"nq>nQp2oYD!H`J`F=hWRDes6(Chmj)H@:3jIt3'&K7nu6LPCYC
+Ll7+GL5(P?Lkpe?Knb;<LP1M=re1o=KnP)3KnkD<L4thSO,o9[oo/p1rJ^`8rJUf9N/dao#E=e*
+NfB!WNV/>1N<>3%NfO$uqiLc=!0[>FrfdPNQBdc%rfmbTR$a>2S"-(@qj[_YSt5hOs.B1[!1j"W
+$CdKPR$X/*Pa%Aoq3(c?rf[;Fr07,EqNh/Hs-E\OrL*\S%%No_Vl[)+Yck77Ycn#0$*UJ3Wi;tt
+WMuiqVZs*"Y-PIG^&Gbh^qmn*_o9X8a2c?Id*gCmf%AX/gY:N?hr!;Gg=b37g]$"GhV[8Nj5f=b
+kiqF"mI'K6o(2MHpA"L^rIP":s$58GYHG.:Z*CUtgXO<[\$)WXPG5S+XF#Q,Lgs4t;1!M19i=fA
+JUr?&J:C<i:/t7m;,L/RO-#KbNfK*VMMR(Mrtb1M]!SW@XKAY/ZEpjBY-4q-X/rA$WW&b&VkfrQ
+QBm_tOcYW`regr=MM[4HM#N2%LjrE*<``F,>$G6;?XI5N@q9._BPD3sD/O<4EccGJG^=^bIXm!%
+KSG8=MN!OUOckroQ^F53StD^NUo(&hWiW>,Z*UgG\%0)_]t_A"_o9X:aihoRcdC.heCN7(g=k?<
+hVd>Oj5]7`kNM0plg4!*mdKW6nac8Bo^qhLp@\L\rqQNhs8)ZjrVZZno_sFAK`?Q~>
+JcC<$LB$oFrr)ior;6Njs7uZhs7ZNerq.l8oCDJBnaGr7mHj3*lKRNqk2kX`iS`VMh;$`;f@SR&
+da?Cdc-+8Na$iTn:&.Zc;YX,N;!_'V4SCl14T7JL4?GYe4$5Sc3W:uc3B0&\6:+%/6UF:77n?'>
+8P)NH8P;ZK8kVcK8P2TH8P2QJ8OuHFr^[#\r^d&Z$:mZX7n-6K:JX_[qc!>hs%rbor_ieopeh)j
+rD`_qqGdJpqGdJps&Snps&Anrr_ru"<)clp<rc;#<<cK*=&rC(=T2J*=]ef)=oDM*=^##)=o2D$
+=oVV(=8uA'<`Srrp/h8rr`T8)qcNu(>?h)1s',M.r`oY8@q9+[raGk;raPn;raPk:rac%?raZFK
+B52:&EcQ,=E,fo=rcA*]%Wur<G^+L[H@($fIXcitrdt-":P"+LK7nu7Ll$tHMi<XUO-#KePE_?!
+R$jD4S=Q:FTqS3VVPgDnX0&P-YHY:;Za@0L\@K,\]=bhj^V@V%_o'I5`lH-@b0/#Qc-F\`df.],
+eCE.$f\+s3gY:N?hV[5Kir7mHioB+]k32$nl0@R"lg4!;mJcPRmf;kTnc/+Xnc&(ZoDJ7Wp%S4Q
+q*OhkHt-Jg?=$oB?@?p4AR/D;;F*fJ='n]b4E<D7-oEVA5<LVV1e1&,7n#j93B/r]4?bnk4'#?[
+<`W4!;G^7i;YftYoCVVFn`TDun,;Y\kIm!rA6rJH>[RJ9r`g4E>?kH=?!:E9=^,$1='/O+<**+"
+<E/rq!Du\m;?'Jl:\7J5<E<.%=]np4>[:]D@:E_WAS,UiC27[(E,fo?Fa&(VH[U?nJV/W1LP^nI
+NK93bPa.T&R[ftATq\?[Vl?\tXg#(:['mHS]"G_k^r"".`lQ9Fbg+P^dF6Urf@\g2gtgiFi8WeW
+jlYail07O#m-X60n*ol<o(2MGp%A%P!;HKfs7u]kr;6Hjrr)KgJcCE'J,~>
+JcC<$LB$rGrVc`nr;6Njs7uZhs7ZNerq.o9oCDJBnF,i6mHj3)l07Eok2bR_iS`VLh:pZ:f@JI$
+da?Cdbfe,L@W?^@OeMcNqkO4er1`hWqk2i=s-rqVopYrOrLNt[qjm\T/=N&sS!fCuMi!.EM2eI1
+Vl?f%Y->+7ZEgjG\$`cT[C<KM['R6J['@$G\$l7Erj<'B[C*?IZF%$I`;[XV_8*h"q6Bt*qQ^"'
+s0;L+qlfq%s/l@*pTFIs(pC*GYHY::Yd(L>Za@'G['d?N\%&uZ]"7mQrk&fU^:q@u_oBa<b0.rN
+bKS5Urlt_od*L%bdaJ*As3Uel%F*,>b/qZA`5'+!]"#3JZiRM<rNZF.qQfq'#dh"I\$rlY]=\$Q
+s18]P^;.S'a32f]gu7DZr9"(DroY*YiSNDHgtUQ9f[eR%f%JsBl0e3<q#(&@s0;S/n)riulKd^$
+rVnAGo^(D1`Sg:XiLm7%Z\DeKA#5cg>\%3KWiN)"WiB6,>@LoF?!UXM^V0W\"hD.O[^<B$rri&c
+k2k\'k9TB[lfmTrjQ#=]iSrhQh;$oDe]Z"Q`50:(]=PP_\@T)T[C3OC[I^hQ<E<1'=^#$7?!^lG
+@:EbYAnPdlCM[m,EH-&AG'A4XI!pKpJqJc3Ll%%LO-#NgQ'Rf+S"6.DU84W`W2co#YHY==[C3TU
+]Y2(q_Sa@4aN2NIc-F\`daZh!f@em4h;-uHiT&tZk2tjkl0@U$mI'H3nF?)?oCMVRo`=d\rV6Eg
+s8)Zjrqu`no_sFAL&ZZ~>
+JcC<$LB$rGrVc`nr;6Njs7uZhs7ZNerq.o9oCDJBnF,i6mHj3)l07Eok2bR_iS`VLh:pZ:f@JI$
+da?Cdbfe,L=(>l[G_5mLqhG$&mY'JM!H`DVFRF;MF>.cXFEMVBD/<p!BkqU8H[gNrJq8T,KS>/9
+Ll$tGM27%EM2-hALPCJ;KntJ>Lkg`aKa<HfKnP/5L51Q`P6@&1O,f4iMu\k8N;/;5N/`gWp5T$2
+qi(W;Nr4q=NfX!trfI8FPEPm.r/qGPPE_>uQ^F21S!ofERfJuXSc>8`SXuIGrLX%[r1".aR[KM.
+Q'@MsPED"+P5^[FOoUXBOogi3Q2R!PQ'@MuQC%E5rg*VPrg=%\S=ZIRX0/\3r3-1+ricI,XJu/s
+9<"kgVPg;hW3*>4\\5bm_84"*_o9U7a2uNMdF6Rpf\"p4gYCZCi8WeVi8*2CgtgiFi8N\Uk2tjk
+lKmp+n*ol<oCVeOq"jmcrIP"9s$5;GYHG.9Z*:Lsgsa9W[B?6RQDD"/Z$V).Jn7Pk:j[A/9N+`?
+JUr?&J:LEk:/t7m;,L/ROH5NbNfB!TMhm1Nrt"\H]!SW@XK8S/ZEpjAXfhZ)s/cj4WMcViVkp#R
+Q^3l!P)t`arJLf9Ll."EreL*$H<"!I=BSg3>[:ZC?t!MTAS,RgC27X'DfKc<FEVkRH@1-jJ:`E-
+L5:\ENK90aPEhH$R[]k>TVA6YVl6VrXfnt7ZaI6O\\,Vj^r"".`lQ6DbK\>ZdF-Opf@S^0gYL]C
+i8N_VjQ>Ufl07L!m-X60n*ol<o(2JFrq-<cp\jmeq>^<hqu6NlrUg)?s+UK'~>
+JcC<$LB$rGrVc`nr;6Njs7uZhs7ZNerq.o9oCDJBnF,i6mHj3)l07Eok2bR_iS`VLh:pZ:f@JI$
+da?Cdbfe,L6UaR>9i1[`r_iYkhb``<pcS73pH8I=s#g6As#g9As#9m:'gk;T6pjF77mfd:84Z?E
+8P;WH8kMbU8H_XW84lGM8cD6^8OuDN8,l-Y:B+,i:AIif;?9Wmr)<Vn!)`Vkr)<Vp!*/hos&Jqq
+r)Ef!<E8uus&K(u!*0#!s&B)!<W,l2<E<+"<)cjs<)lpt<E<1'=B\p4=oMM1=^#!3>?b64=^##*
+=oMS+>?Y5/=T2D%=9DW,=',6!pK.>rr`T8)s&o;(r`fD+r`fD-$=-tH@q9+]A7K+YqI9M7ra?7G
+A7T7_A7T.YA7fRnE;jnWE<(%XF'!I+F`qtRH$Xa^H[L6jIsup"K7nl/JUrE*KSG5:M2@.KN/is]
+P*2#mQ'IZ&S"-">StD[LUSXibW2ZeuXf\b0Yd(I>ZaR?R]"5Md^:q@t_8F1/`Q%nt%EQZ7bg"GZ
+d*g@keCE+Ked^6`g=tB;hVR/Jhr*JPro=%>!TiJBl2U&Kli6APmf)\SnG_tWo)A4\o)A7Yo`+Ua
+pA+I^q>0s\qa1.pHXU5d?XI,E?@I$6@pN28;*mcH<aSZb4DHf.,rI;>4ZkDT1Ijr+7n#j93B/r]
+4?bnk4'#B^<`E't;bp7h;Z6=`p%J%LoCVV*nGr(On,;YWl+W9uA,]a7>[ID8s'5S0#?tG<?!U]>
+>5hY3='/O+<`E.$<E2us;Z0Dn;,C*g:\.D/<E<1'=^#$7?!^lG@:EbYAnPdlCM[m,EH-&AG'A4X
+I!pKpJqJc3Ll%%LO-#NgQ'Rf+S"6.DU84W`W2co#YHY==[C3TU]Y2(q_Sa@4aN2NIc-F\`daZh!
+f@em4h;-uHiT&tZk2tjkl0@U$mI'H3nF?)?oCMVRo`=d\rV6Egs8)Zjrqu`no_sFAL&ZZ~>
+JcC<$L]@#GrVc`nr;6Njs7uZh2#$_;p%@tLoCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtUQ8f@JI#
+dEp1`bKJ#KA9NKQTV_U_rhKCco:brPiLg(<rg`PKs.'(Zs.91[s-j"ZrgWqVs-OFcPDtERKntSE
+VPU5iWj&Y0ZEaD7"15PH\Gio9[NW&e\$NQO[^NZS[C*NP\$NQM[Bm0FZc1#*`Q#g4_7m[trilF-
+s0DL+q60k&q6'UurN6.&q6'[us/u@)!3uO-s0;L-"0o2?[JmW4\,WrG\[oAa]Y2%q_o9X9rPeoZ
+aN4;$*m2[NdaQ^pdEp1abfRrH`l5g1^:^tb[^NQLZa$g@p9F_*[/%$5['d?O\@T8`rjr*@%(s9f
+^r"(4cICM'j6$@)!9a@F$0gX7iSNADg=Y'Wf*p-Xe_&[9jm)@-q"t#@s0;S/o'#9%kj.L!rVn\N
+oBb;2a6<'an"?o:Y_-8EA>Plh>\.9LXK8D%WMs*+>%1fE?!UXM^V7Fq^:Lk`\$`W(rri&ck2bY'
+kPjcjki_*hj5f7Zj5]%RgYLW7bK.`B_SNq!]=GG]]!\oQ[C6(Bo<rsF<`W:)=^#'8?!grI@Uit\
+B4u!pCi+'/EH?5EGBeF\I=?]tK7nu7M2R=QO-,TiQC+)0S=ZCIUSOcbWiN8)Yd(OB[^`l[]Y;.s
+_SjF6aND]NcHjndeC<($g"P39h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCW%T!quB_rqQNhs8)Zj
+rqu`no_sFAL&ZZ~>
+JcC<$L]@#GrVc`nr;6Njs7uZh2#$_;p%@tLoCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtUQ8f@JI#
+dEp1`bKJ#K=_2>dJV3oVreCE+k_.oInT=8Cs)\6`rcJ*[#]aj"C1q6pC2<fs(k-scJqSi3L5(D;
+M2I1HLPUeDLPUeBLkbna(l3s&LkUS9L4k86K8##BQ'7DsPECrdNf<pppl#34qi(H2",r.rN;SY8
+N;/D0Nr=t;Nr>%<NWG6&rfI#<rfR&?s,m8C"dG:<Q^F0;R0f@QS!oh9R[]k?rh0:_r1!q[R[KJ,
+Pl?jJP*(n+P5^XHP*;+,P5gaFPlI$JPlHpIPl-gKQ^3s9QiEEQRJrW]SY;jWXKSn8ZEjD5#dCM6
+Wi2knW2KWn,GqB:W3!51\%0/c^qmn+`5Ta:aihuVe'uq"f\5*8h;7&Jj8S-^jQ#4VhV[8Nj5f=a
+kNV="mdT`:o(2MIp\=R\qu$ElJcG*:"5C8gYPtdJYHm?HdD`c*XeLB4Y-l*aH\SeUA4g]9H?XO+
+;Gi/IJ.7'ZInrj7<E)pp;,EI<rf@)>"H84rLkq/m-M#Nq['$I3Xfen5Za-g;Y-"b*XfSS'W26>g
+Un4!AQ]mYsOcYQ]rego:LPgnDreL*$H<"!H='8[0>[1QA?X[DRAS#LfBkqO%DK'T:FEMePH@('h
+J:W?+L51VDN/is]P*D9"R@B_<TV8-VVPgGpXfen5ZaI6O\\#Mg^VRe*`Q-'BbK\>YdF-Oof%8U/
+gYCWBi8N\UjQ5OekiqBum-O--n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCH(J,~>
+JcC<$L]@#GrVc`nr;6Njs7uZh2#$_;p%@tLoCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtUQ8f@JI#
+dEp1`bKJ#K6q9mD:Jgpc!)ienr_WSkpe^]^nkegQoK;h/q)nX>!'L0@s#^iR4#o5Z2`EcX6:+%.
+6UjR8rC7&]84cED8P/nR"A)3X8P8eM"\;3U8Ol>M8,c<_:'49e:JLgdrDW\nqG[;ir)3Snr_rbp
+s&8qsrD`kt<W,np<V9Dm=8u>$<W#hr<rZ2"<<#r*<)lpt<E<1'=BSi'=UeJ7=&r@'=B\p6>[(?6
+r*','!`rE'rDru$r)X&&=&rC'<q]Vp=T;P'=T2J'=oqo2=oMV)>6%k*>R=\D@:<YVAS#C_raQCJ
+@q0%Y@:3MP@Us%^Ac?-KA7fOkDJsK7F*)MEF*)O&G5lddGlW0iHY7_SIXciuK7ei1JqAQ*K7nu8
+M2I4MN/j!^PE_>tQC"#-R[fq?T:hmPUnsreWN*#$Y-5(6Z*L^B['dBQ]">Vg]tV7s_Sa@4`lH-@
+ai_fNbg"GZd*gFnf%&@&f@\a/g=tE=hVe@k#ian)jQ5LdkNMp0s6KXNs6fpU!q>aMrpp'[qXjd[
+$24,fq"X[\q"OR\q>^<kqtU*`rWE)6HXcnZ/mVe5F_kPn=B&0b85N;k@luk^2(p:5/Nu?[0JkUW
+84c9?77B*o2a0>f5!:u.r)Eo";bp7h;tp%\p@\+No^)2=o(V\So)%tOn.Fs#P&Ol9?!LZA?!LZ?
+>[:W>r*0J2=^"p1=BAQ&=8l5.;cH[l;,L.e;,:"br_N,^H<"!H='8[0>[1QA?X[DRAS#LfBkqO%
+DK'T:FEMePH@('hJ:W?+L51VDN/is]P*D9"R@B_<TV8-VVPgGpXfen5ZaI6O\\#Mg^VRe*`Q-'B
+bK\>YdF-Oof%8U/gYCWBi8N\UjQ5OekiqBum-O--n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcBf
+JcCH(J,~>
+JcC<$L]@#Grr)fnrVQWks7uWg!Vc<eo`=^VrphW1nF,i5m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oHAU&cXT:hsSqP*k\oUu&QnXfKIqk!\S!1`MI!1`kUs-a.]R[T_7R$[f>/!>mKLkUV>
+NKC'=XKSh3Z`gX<['[9LZaI6L[Bm6MZF.6N\@&cR\$WWS[/IBF[^*6Y`Q#p<_ns:,^qdh%YctD2
+ZMq-+Yl:j)Xob`,Xo>L'YPPF%Xno4#XT5I#XoGO0YHG(4Yd(F:Z2Us/Z*L_7[/[Q6[f3c8\Gs)E
+]tV7s_84"*rPKbr`Pf^4_o0R;cHt"fd*BhWa2Gj2_8!Xp]!o)S['R*Eriu4'qQp.-$a[4J[^NZT
+\[oDb])B5N]Y;+p_SsU@db3I9k32+0l2U#ckiLg]gXt-.e^i:&f%&='gYUuRm.'fFrIP!Rrs/,Z
+kNV3rl0A6I.J`MtgS`6ZnFZ:F[ah"1KoooBSt94u?am,<WN3&">?k???X@#D>/A#R^';9^\[T#T
+[#Y.ep[S7Es5j=ErotZjkN:jdjl>@_j58_Kg=t*"a2Z*8_8!^r]",>^\$WQL[f3]+[XV7W<``C+
+>$G6;?=.)L@Us%^BP;-rD/O93EccGJGBnL^I=Hd!K8,/<MN!OUOHPinQ^F52StD^NUnsugWiW>+
+Yd:^F\%0)_]t_A"_o9X:aihoRcd:(geCE1'g=k?<hVd>Oj5]7`k32'olg4!*mdKW6nac8Bo^qhL
+p@\L\rqQNhs8)Zjrqu`no_sFAL&ZZ~>
+JcC<$L]@#Grr)fnrVQWks7uWg!Vc<eo`=^VrphQ/nF,i5m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH>%VYjI=_<NrIsEfiIh,PnoXDEs)T*#F)uGEEcQ5BEc,]-C1_0oD/XlQJ:`<)KS08X
+"bqegL5:ZbLCJurL51V@LkUS<Lk^_Ar.PB1K7oDNPEV71Op7#/O-#B[Mu/J5NV\V2Mu/J5NW4q;
+NW+t;NV\\5N<,'!rf-u>rJgu@NfK2"NrP1<OSt=@P5^UCOp.&6Pa.N"rg3nVR$jD2R$mr@&"B/_
+TV%gGS"#k8R@';*Q2QjHOc]O(s,mAHrfR8Fqi^i?qiq)Fqj%5Lr0IDOrgF(]SY2aUX0/c-[/[H3
+ZV[p2XfA@tVl$>hW2chqVl?`!YdCmL]Y;1t_o'I6bK\A[e'ut"f\5-:hr!AOj5f@cl07Bmj5T+[
+jlbmnlg4$,n*oo>oCVbNp\F[_r;HVGs6BUdgU=>irin,[ZKL#g_7?nPU4J`8[)'n3Lobi9@Vntg
+GBQ\Y:kjOPJ:W6#:JX\b<)ZXk:m7(@Ns1N%N/NLJOT,d]d(H`fXKAY.Z*CX?Yl:d)WuJ1BYH"Ot
+V50oYR[BG+PEV/kNf8mTMi<ILLku%co8%lq<`W:(=^#$7?!^lG@U`kZAnYjmCMds-EH6/DGB\=Y
+I!pKpJqJf5M2I7OO-#NhQ'[l,S"?7GU84W`WN*&%YHY@?[^WfY]Y2(q_Sa@4aN;WLcHjkbe'uq"
+f\5'7h;7)JioB(\k2tmll0I^&mI'H3nF?)?oCV\Jp%J(Zp\ssfq>^<hqu6NlrUg)?s+UK'~>
+JcC<$L]@#Grr)fnrVQWks7uWg!Vc<eo`=^VrphQ/nF,i5m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH77TsD9MkL]rD:[7niZV-q)nX>!'L0@s#_/[3B9#W2E<cY4%)J*6q0U87Rop;7nH9A
+8H)0^8kDYR8cM?Y8c)'Y8,Q0]:B"#j:/Y!c;u]bq;u9Jk;u]bp;u0Gn<q',g<WH4t<WH5#<rH%o
+;ufqs<rZ2"<rlE)q-!`"s&Th6<E3(#=^#*;?!:B7=]ed,='#<#r`9&#!*K)!r`8bps&f;(qH3Ss
+"'So3>5he,>6S8;?=./OrF@0`A7fIdARf1X?smDPAS#Ia@q0%]Bl%X(DfKi@G'.nLGBnL\rcnZn
+H[C-fIK"[fIt3*%KSG89K7ST*KnkMCN/ipZOHPflQ'R`'R@9V8SXuIHTq\<YVPpJoXKA\1Z*CU@
+['d?N\@B,^]Y2"n^r""-`lQ6Cb0/$-bm)J>d*^:je,@c)e^iC+g"Y<<hr*MSir8!<jULA8kNM-o
+lKdg'mHs?/rpTmVrpp'[rq$9bp@eL[!;?Bcs7u]k!;l`kr;6Nls8;rsqZ$KmqYp]t_0]Wsra%Wm
+?!`#'Bk(@L<)Z+S:K1Y:4?ZP!0.Sk35!D%^1c.cp8Ol3<7Q3:c4Zttm4Zc\F<E3("<)c^l;cESi
+p\FRXo_.tNk4JTCqss(C&F7,pEai<Z?!UcB>[1K;?=!P8**lfR?!1?5=]ea*<`iF'='&@%;c-Fi
+;Gg7d:Jh$do2'p9<`W:(=^#$7?!^lG@U`kZAnYjmCMds-EH6/DGB\=YI!pKpJqJf5M2I7OO-#Nh
+Q'[l,S"?7GU84W`WN*&%YHY@?[^WfY]Y2(q_Sa@4aN;WLcHjkbe'uq"f\5'7h;7)JioB(\k2tml
+l0I^&mI'H3nF?)?oCV\Jp%J(Zp\ssfq>^<hqu6NlrUg)?s+UK'~>
+JcC<$L]@&HrVc`nr;6Njs7uZhs7ZNerq.r:oCDJBnF,i6mHj3*l07Eok2kX`iS`VLh:pZ:f@JI$
+da?Cdbfe,L`b'IKK:e_5U&^nVT_Y5FT)YGUT(AEOSG&HPSGo&gS=Q.=SXZ(:R$sD2Q^Ic=$BgC(
+L4b,6MN+X8ri@*DZa@!G[C<HP[^ETQ[^WWO[^riQ[^ifR\$`]Sr3ZO5rl,>_`P]X3`4s(&^qRM]
+Z2_-/Z2_$1YHY46qQ0b!qlT^triH4(Xo>L&XTbf,XK8P+ri?(#"0J`/YPtd+YQ(g,Z2M!-Zi@E1
+[JmT9\[oEP]`c*c_83qa_%si&_8F:7b0%iG`59=)]Xt_c\[JoQ[/701ZEa>5s0V^0pp1=7[C3KN
+[^WcW]"7gOs1JoV^VI\'a32f[g>CuSlKeH9)X6DGi8*,?eC2msf%8I'f\>9Ajlu1%p%\C_JcE(V
+!VGaXklU/:lM^`=p[I:tVk`;Ao^_"Cd\MbVP%:G]Sm5f5[]QX0XK/C*>?YKC?<pf?_8*e"^:q4h
+\$`TMNrK@Zo&Srpk32%.l2p24k5OE\j5T:]hr!2@g!S$ba2Pp3_7mOn\@B,[[C*?LrjD@+HW4!G
+<`iL->?kE>?XR;O@qB4aBPD6uDJsK6F*)SLH$XjdIt3-'KnbD?Mi<[WP*;/sR$jG7StMdPV5L8l
+X0&S0ZEpsI\@K5a^;.V'`Pom=b0/&Td*^:ke^rF+g=tH>hr*JQj5f@bkNV6rlg4$,n*fc9o()DD
+o`"Lap@nO\s7u]kr;6KkrVcBfJcCK)J,~>
+JcC<$L]@&HrVc`nr;6Njs7uZhs7ZNerq.r:oCDJBnF,i6mHj3*l07Eok2kX`iS`VLh:pZ:f@JI$
+da?Cdbfe,L``ctlE.ET=L#RdFK)g#mFn0YIFW5FFFEDYIF)uACEcZ5AEcQ/;CM7EoAnc'uIt.HJ
+*J/s"K8,/:L5UnDLkpnFLk^_CL5(J?L5(M>LkpfaKaNQtP*:ujOckllOT(:@NVSM5NW+n:MZA_7
+MtN&/NV\Y8NW+t6NW4q;NW+k:NVeb9NW+t:O8P(AOckihrK.#Arf[>IrKmJMs-WtUQC"$<RK]1K
+R$O&'rKI>HP5^REO-'@'r0%)BqNCW;r0.2HrKdJM!1<_O!1<YP':bYfVQ-i*[C*BL['[0EYH4e(
+WrAkLW2ZbpWMur$Yd:aH]"Gbl^r+.5bg+S_dacq#g"YB?i8WeXkND'olKdg$kN:sllMg/MmLSgW
+oCMVHp@e7VqYU3hrVhBJl2Lh<\?l.=s0<j3gs!OBZ)=:HJ#]onb.*)"H>$i,;1!J09N+cBK7SQ)
+JUm_p&QMe/;,C)QP)k]dNfB!VMi!7Os"!]f]="]AXfeh3Z*U^>XfSY*X/rD+WMcSgU8+9KR?s5'
+PEM#fNJWRPN/@OireL*$HW4!G<`iL->?kE>?XR;O@qB4aBPD6uDJsK6F*)SLH$XjdIt3-'KnbD?
+Mi<[WP*;/sR$jG7StMdPV5L8lX0&S0ZEpsI\@K5a^;.V'`Pom=b0/&Td*^:ke^rF+g=tH>hr*JQ
+j5f@bkNV6rlg4$,n*fc9o()DDo`"Lap@nO\s7u]kr;6KkrVcBfJcCK)J,~>
+JcC<$L]@&HrVc`nr;6Njs7uZhs7ZNerq.r:oCDJBnF,i6mHj3*l07Eok2kX`iS`VLh:pZ:f@JI$
+da?Cdbfe,L`^EBk9i"XY;#X>h;UeS54SCl949R`.4$5Y)4TIVD4!$FF4$,Pb3B&oV3BB2_6q'I5
+6q'U:7nH0@8P2NE8cD<a8OuEEr^[)^84`\Nqag]^$VjJm:JOYZ9i"P[:&.`f;ZB\p;?0Sj;Z0Po
+<<#ts<WH.u<:Nua<rZ/&<`N.#<W#hr;Z]ou<W#ns<s)K)=BYW*s&o8%rD`u%=^#$5rE&eprDiu$
+=BPN'!*9)!s&Snro2tlm!*]A+s'#G*$<gS9?!h#NAS5UfrFc4DAH$'?@:EaGAJerhB4l!qCi402
+EcZ>DFEVkSI!g6dH[L8>IK=qKrdk0'L&Qj$KnFu1LP^nHNK90`OckomQ'Rc(R@9S6SXlCGTqeE\
+W2Zi!Xfeh3Za7'I\$rlX]">Vg^;%M$_Sa@3a2lBGbfn>VcHjkbdaQ^rf)F5"ecsaYg=tE<hYuI4
+itCJ9jlY^gkih9qlKdg(mI'E2n,DnXoD\C]p&=Xdp\=O_q#L3gqYg9kr;?NlrojA5_L#]s?X@&G
+?<r&(Bjt:K<)Z.N:/kS9<BNl00J#(64[(q]1c.`p8Ol6>7/f.F4o[\V4?HSE<E<.#<)Z[l;cEVl
+q"sg^pA+CUnFl2@qt0mZmd^VL_3/hJ?<^b7>m">9>@%55"C#,9>@%52s&]q9<``@)<``:$<`Dso
+;Gg@i:/=^c:\.D0<)lt"=BSd2>[1TB?t!MSAS#LfBkqO&DfB];FEVkRH@1-jJ:`E-L5:\EN/is^
+PEhH$R@Bb=TV8-WVl6VrXfnt7ZaI6O\\#Mg^r"".`Q-'BbK\>ZdF-Opf@S^0gYL]Ci8N\UjQ>Uf
+l07L!m-X60n*ol<o(2JFrq-<cp\jmeq>^<hqu6NlrUg)?s+^Q(~>
+JcC<$M#[,HrVc`nr;6Njs7uZhs7\;Bp%@tLoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1abfe,L`bBdRL7J7;rh8eRrh%i7nsfWKpR;/Qrgb7'SXl7=R[BP5R$X2,R[BG-Q][>aKnP,8
+LQ874WiN;-Z*OA;#.:tJ['d9OrNuj:Za[EO[C?.C$FmRSZ*_Tl_o9X6rPf)Z^qmn(^q@DZYlM$-
+YQ(d)X8oBsXSf1&Y-"e,rN5suri?($!3H+!"0AW-Y5PR(Yl:m.Yd+,3&[SjMZEpjCZa@-K\%&rZ
+]Y2&T^Ce/l]Y2(q_8*h!]t:hb\$rfRr3HI0ZEjJ9!j]):rNlI0os=S's0Vs<\@K3L]DfMD^])%`
+`Q?ERf%]0Hlg=*+m-<ftjl>:Rf)F,0f%AU+f\,';j6#UmnFZJOrIP!Urs/5dl0@NulKeEK1\L1o
+eu-aPm.Tf-XO<u/MNh\NSt91t?aQr:WN<,$>Zt?A?sd2E>J\+i^V7Cn\@AuT[#Y/0q=<P-jlYgk
+lKda!kN1acjQ#:_iSWJFf%89naiDB<^r$)`#.h@V\[AlPrO)7*HW*pF<``C+>$G6;?XI5N@q9._
+BPD6tD/O<4EccGJG^=^bIXm!%KSG8=MN!RVOckroQ^O>5StD^OUo(&hWi`G.Z*UgG\@K5a^;%M$
+`5Td<b0/#ScdC1jeCN7(g=tE=hVd>Oj5f=akNM0qlg4!*mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6i
+r;HTdrdk*(s*t~>
+JcC<$M#[,HrVc`nr;6Njs7uZhs7\;Bp%@tLoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1abfe,L`a*:rF+4"?k(MTD!-R[Np2qU%F`heIF)l>DEcH,>F)uAAEboT+BP1pkBl/6JIt*!$
+KnY9\LE;>/L5:SBLk^_@L5(P@L5(M=L51VALOt2CP)tijOo:IKOcY]fOH5?[qMb6.oSig0s,Qr8
+s,Qo7s,7,@N/W[SNW+t:NVeb6NrY:?Oo:C?OTUc1Pa267qj@DLs-3YPQBqK7!gJn4r0%#@!0Hl9
+qi^];rKI;IrKdJMs-WhQs-NeSr0dk[StW!ZXKJo/[f*Q>ZE^[<Xf/+oW2ffs*iuNJZEpsL]"Pek
+_8XL=c-XkeeCN:*gtprJjQ5RgrosaSmHs9+l0Ia9mLSdUnac;Ep@n:Tq"ajdrVhBJk5R?m\$N<D
+Z*LX@kM47q[]u[%JXWUD_n!I5UO-fhDGkk*G"bh2L4b).Jq/AI:/4ef;c6IhPEPp,s,@/?NJraN
+OT,g`d(?]aY-"n2Z*C[@Yc[i)s/cj2Vl$5^UR[gAQ^3esP)t]aregl;M2@&eL\$=K;cQk!='/U/
+>?kH@?X[DRA7]@dBkqL$DK'T9FEMePH@('hJ:W?+L51VCN/is]P*D5uR@B_<T:r$UVPgDnXfen5
+Za@0N\\#Mg^VRe*`Q-'BbKS8XdF-Oof%8R.gYCWAi8EVTjQ5OekiqBum-O--n*fc9o()DErq-?d
+p\4[^s7u]kr;6KkrVcBfJcCK)J,~>
+JcC<$M#[,HrVc`nr;6Njs7uZhs7\;Bp%@tLoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1abfe,L`^WQn92>%Ss&&VjePY]rpcJI;"$8V-48q>I4Zkhf4$#Gcr]C-?!B<":3#Xe<6UO=4
+77Tg:7n6*B8k;NF8kMZG8kDQE8cD6e8OuBD8kDTF85T(Ws%WJf!`)Qdqc!Mm!)rho!)`Vkr)<Vp
+r`'/'<E)mq<)iQkqH!Vrs&K,$qc<VprD`\p!EN;#<rQ+t<rcA#=oVV(<W?##<E<1%r`/tts&/tu
+<E8rt!``9%r`B,#r)Nbtq,d>nr`B,%qH<i&r*','#$P8<?t!PWrFl+C+_k\'@q&tZAS5XhBPD0r
+D/F0/E,fi:EccJMH[C'bH[C2?IMdQbJV&N-Knb>;LPU_?KntVEMiEaYOcu(0QRA)cR$jD4S"6.C
+TV8-VVPgDnXKAY/Yd1UC\%&rY\\#Mg^VIY&`Q%ks$cpK6bg"DXcd:(feG[tufDaDFg"Y<;h;7#H
+ioB([jlYaikNM0plK[^$m-O0/n+#u?oD\C^p&=[ap\ssdqYpBjr;?Nlro="\_0TKpra%Wm?!`&)
+Bjt=L<)GtR:K1\'=Zf84/hJt75!D(_1c.`p8Ol6=7QEFf4[)%m4?QYF<E<.#<)Zan;cEPkq>10i
+p\XX[pA+%Kp%J:UnFZYM$LbioEai?U?X-lBr`fM/>[784s',h6>$"j0=BAU*r`B,#r`'2&;c6Oj
+;c-<f:\.D0;cQk!='/U/>?kH@?X[DRA7]@dBkqL$DK'T9FEMePH@('hJ:W?+L51VCN/is]P*D5u
+R@B_<T:r$UVPgDnXfen5Za@0N\\#Mg^VRe*`Q-'BbKS8XdF-Oof%8R.gYCWAi8EVTjQ5OekiqBu
+m-O--n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCK)J,~>
+JcC<$M#[,HrVc`nr;6Nj!;ZTg2#$_;p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`G^*SMk0g@rh9%YpRg-1n=0EIpR;/QrLF1_S=5q:R$sB?QnstnQBRQ!NerFAL4b;?
+WN)u$Yd(LA[^W`V[C<ZR['d<M[^EEL[C!?L\$rcPZa@*\a2e1u!6"lU$H'm$_8*h%_7[IdricO.
+YHG"0rN-%"qQ0^ts/c1$s/Z='XKAW"X8f:%XST!tX9u)4Y-5(6Z*CO:YPtd*YlM*/Z2_-.ZO4(J
+\%0)^]Y2"n^\tkO]t:hb\[],Xr3cU5rNcL0qQ]q'rNlI0!4Dg5s0W!:Za@-Jqm?C2#I_.Q]">Se
+]`,VG^qp#e.E'<Od+-k,jQGdnm-Es$l0%3ggssm%e(*"#f%A[1h;I;Skj7a-pA4`=s0_k-p[J+G
+!:9^b2#d+6h:AIDl1"B9kd/[*P_t]2W1]\dA72dHXJr>%XJo?,@pr_M?!P7^^V7Fp]=GG\[C)%p
+/,Abtk2tjil0@QukiV!fjlPO_jP\qOf[eU!c,n#G`50:(]Y(ke]"#2WZi.<'[X1qP<E<1'=^#$7
+?!^lG@:EbYAnPdlCM[m,EH6,BG'A4XI!pKpJqJc3Ll..NO-#NgQ'[l,S"61FU84W`WN*&%YHY=>
+[^WfY]Y2(q_Sa@4aN;WLcHjkbe'uq"f\5'7h;7)JioB(\k3(sml0I^&mI'H3nF?)?oCW%T!quB_
+rqQNhs8)Zjrqu`no_sFALAuc~>
+JcC<$M#[,HrVc`nr;6Nj!;ZTg2#$_;p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`F*CtG('4@p4UbEs)m[MolUL\FE;PGEcZ7!EWU3#EW0o"ChdTpBP)$rIsuirK7nr5
+LPUbEM26tCLP^eBLkg\?L]3&.M#W29Knb;FP*1rjP*,a,"Hen2OcfX)r/:Z7N;AJ4Mu\e4Munor
+N;JV6N;ee:Nqn\7N;AM6NqJD2NrG(>OoCIBO8G"@P*;)org*JKs-<hQP*;)lOT(CAOopo1OcoU(
+!0I#=!0[>DrK?u?rfdDHrKI;IrK[JNR/N?SR$jA2RJrWaS=cLNVlQr(ZF.'I[']e>!j\u.rhfar
+ri7-BY-5+8ZF%*N\\#Pj_oKpDcI(+kf@o'<iSrt^kiqF3m/QJgn*]T2n*]Z5nF?)@p%J+Rq"ada
+rVhBJjSo>9\[8X?Z6?R<gW[F?YbdtCQ`da6_S:ktF)P]/971r,9N"]AK7\W+rdb#D$s$>,;c-AT
+PE:ieNK*pr!K2errt4qN]X=fCY-5%6Z*U[=XK8P+ri?a5WMcSfTV7mFR?s5'Ocb]cNfF!q!JuX2
+L\$=K;cHat='/U/>?kH??XR;OA7]@cBPM=!DJsN8F*)SLH$XjdIt3-'KnbD@N/`m[P*;/tR$sM8
+T:r!TV5L;mXKA\1ZF%'L\[oGe^VI_(`Q$!@bKS8Xd*^=le^rI-g>(N@i8EVTj5oFdkiq?tm-O--
+n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCK)J,~>
+JcC<$M#[,HrVc`nr;6Nj!;ZTg1\^V:p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`CENm9^ts';=$F>48h;@3s@`04?Ybgq)]9O3B8uV3]K,\6UXF67R]a87n6-DrCI/b
+8P)NG8c)'Y8H;<\8H;<\;#3rg:/Cg`s%`nq9iFqg;c6Llr_`_nqGR2hs&Aqs"B8;u<)iNjrDj,(
+<`N.#=',9"s&K(u!*/tss&K%t!*/qt!``3"r`0)%=BPQ*s&];'<rGu*;c6Ij;H$Oo;c?Xqr`0)#
+<*&uurDrqu!*B/"r`8kss&f8'rE0)$s&f,#!Er_+>5qeD=^#$7?=75QAS,RgBP2$oCi+'*B4>:X
+A,U$`BPM=!Ci4*-Df0K4EH6/FG^+LZH@($gIt3*%K7nr4L55_`re^Z57?!4dO-,ThQC!r*R$jA2
+S=Q7DTqeBYVPgDnXKAV-YctF=['mHS]"5Md]tV:u_oBg@b/qcJb08,UcHjkbdaQ[qf%AXSfcAf$
+gtgfChr*JQioK4_k3(pkl07L!lg4!*mI0N7rUg-`r:g3crqcZl"T85sr;?NlrVkRO6,IqW?!^lF
+?<pfeF_P;g=Ar*a85WDp@U;2d1G:@=.R$'Y0f1^X8P)EA77Tg,3'KPj4Zto.<`N.#<E)pq;H$Qo
+rVl]prVZZorVQTfr:^$^qYp<eq"ja[pu1oVnA:?/@U<)B?!^fA>[(G1>SC=H>$>$1=]nj.<``@'
+<``=$<E/rr"&_uo;>a5]:jZ,?<E<1'=^#$7?!^lG@:EbYAnPdlCM[m,EH6,BG'A4XI!pKpJqJc3
+Ll..NO-#NgQ'[l,S"61FU84W`WN*&%YHY=>[^WfY]Y2(q_Sa@4aN;WLcHjkbe'uq"f\5'7h;7)J
+ioB(\k3(sml0I^&mI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrqu`no_sFALAuc~>
+JcC<$M#[,Hrr)ior;6Njs7uWg!Vc<eoe5t/o()>?n*f]3m-O'&l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF@rZpHQ(IrKs.T+YpRg-1!1NAGrg`bQs.'(X!M,bZRN%`bQ^X;.QBmc%PEhDrMMHn>
+K7o5bY->+7Z*OA;&\#*R[^W`R['d<I[C*?I[^NUC[KO"FaN2O'`rF!i_o0O4`l#[0_SEn!^:UVR
+Y-.Z'p8e(l$*1/.X/rG)X/`2uWrT7"XT5I$X8T."XTGZ/YPk^*YQ(j+Z2V!+Z2Cm2ZaI<R]"@sS
+rk/NK]"#8X[']h=s0Vg4s0;[3YkkX(YQ1s+Z2h92Zh_!.[K!Q7['mC=Zob\(\%0,_]Y2%o^qde&
+_Sa=2a3)ZTfA#6DjlY[ejlPO_iS<)8da?LleCE.&g"P6;i8`q^lL"-7q>GmE[f6U(o'>T-lKmj9
+ruh:3leU*ga6N6hn*6RnS!](t>cF?e>\.<LXfSJ'WiW3!>7b7N?!U[O^V@Ls]Xt_`[^EN'rrW&d
+mJZ5JlMp)LkiVj**ou>@iSWAAf$VaeaiDE=_SNt!]Xt_b]!f#S[^NTOo<s*H<)lt"='8[0>[1QA
+?X[DRAS#LfBkqO%DK'T:FEVkQH@('hJ:W?,L5:\EN/is]PEhH$R@Bb=TV8-WVl6VrXfen6ZaI6O
+\\#Mg^V[n-`Q-'BbK\>ZdF-Opf@S^0gYL`Di8N_VjQ>Ufl07L!m-X60n*ol<o(2JFp%A@Y!;HHe
+s7u]kr;6Kkrr)KgJcCK)J,~>
+JcC<$M#[,Hrr)ior;6Njs7uWg!Vc<eoe5t/o()>?n*f]3m-O'&l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF=CPo\H%>dGon;^bj+7>SF`m=urcA!ZpiQ^]F)uJGrGr-aF)c8AEW0n\Ec5r;D/0&_
+'4tlnIt<0&KS>#2LPUbAL5(M?M>i88KnkG<L51P=rJ(Q2Q'@MqOoCLHOHG]hPQ$[MP)t]`NJrdR
+N;JP4N;8D2Mu\k:N;nk;N;\b9Nq&,/NqJD3Nr>%;OSOqCOHPimQ'R]#QMm*KP5paDOSFqBP*(ig
+Ockn,OT:RDOT:L@Oo1C<P6-u4PPULEQ'VB88!oX1R@9S4R@B_<StD^QW2d#)Yd(F:Z*:O=ZEL@/
+Vl-JmWN3)%Xfen5Z*^sK\[oGg_SsX?d*pRug>(TDj5oIfl0Ia(m/HAPmeuSbmdKZ8o(2MHp@n=V
+q>:*hJcFa05hiZTZEU[AZEi]IbJ1HgV4W@,Z+%Zd_0VSnF(T;_I!9d/;G`+#Jq&B&J:C<i:K:=k
+;,EI>OH5KaNf8pTMi!Pq-2,^![(!6BYctC;Z`pX7Xf\b.XK/D$VPBo[T:DC=Q^3l"PE1e(N<kE"
+Mi*CJLkgcWLji9%<E<.%=]np5>[:]D@:E_XAS5[jCM[j*E,fr@G'A1WH[U?nJV/Z2Ll%%KNfT<d
+Q'Rf*S"6.DTqeH^W2co#Y->4<[C3TU]=bkm_Sa@3a2lEHc-F\`daZh!f@em4h;7&IiT&tZk2tjk
+l0@U$mI'H3nF?)?oCMVIp&F^cp\jmeq>^<hqu6NmrUg)?s+^Q(~>
+JcC<$M#[,Hrr)ior;6Njs7uWg!Vc<eoe,n.o()>?n*f]3m-O'&l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF6psR::ARce;>F&R;>!cV;>sDj49.J34SLo;3r:u=4T7JH4$5Vd3rD)>3YXP43&ifV
+3CQA+7RKX67Rp$A84cGQ8cD<_84i\Lr(-lcrD<;cr_<GhrD!Gh;H$Ng;?0Yo;Z9Vo;ufkn<;9Jn
+<r>r#<``=%<rQ2#=92K(rDikss&K&!r_rr!<)ris!*&qts&K8(=BAR+r`B,#!*/kp##eK$<`N1#
+r)WhsqGd`!<``@&<EK0#q,[T!=nu2!=TDY)=TDY)>Q.h*>6%k+>6\A@@Us%^B)Z?FAnYmnAn:mL
+#@h=VB4u$pC]8/ZDJa90DfB]:FEMbOH2`.^I=H`tK7no3L51SAM26tEMMmCONK0']OckomQC!u,
+R[]h;StD[LUSO``Vl6SqXKAY0Z*L^C[C3QS]=Ybj^V@S$_oKmAbKTq01saOrdaQ[peCE+#f@em4
+gt^`BhVd>Oj5f=`k3(pkl0.BslKdg(n*ff9nac>Ep%J.Sq"ambrqcirrVc`pcMn*cH<ac]?!dM9
+/:hqX@Tur6;F3oO<a]6@3^Y\[/i>.C5<LSU1e:2.7n,p97QECe5<_7o4BDA[s&B"r!E2tnrqcTn
+rr2lnrq?<bqtp6fq>L'hq=sCPr:oRO%e7H#Eai<Z?<plC?!LT<r`fG/r`fG-r`T8'$s-G/='&F'
+=&rC%<E&in##\;q:f'q`o2'm7<)lt"='8[0>[1QA?X[DRAS#LfBkqO%DK'T:FEVkQH@('hJ:W?,
+L5:\EN/is]PEhH$R@Bb=TV8-WVl6VrXfen6ZaI6O\\#Mg^V[n-`Q-'BbK\>ZdF-Opf@S^0gYL`D
+i8N_VjQ>Ufl07L!m-X60n*ol<o(2JFp%A@Y!;HHes7u]kr;6Kkrr)KgJcCK)J,~>
+JcC<$M#[/IrVc`nr;6Njs7uZhs7ZNerq/)>oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLh:pZ9f@JI#
+dF$:cbfe,L`aa.EJtej2U7n:OT_kA5T)G,IS,SrQRkgA"S"6(?S",q7R[9D.Q^F))Q'IPtQ'7Ao
+N/!%@KnbDAY->17['d9IZa[?O[C3KN\,Nc=ZaI-FZF'V>s2PtraN)<?a2Q!8_ns@4`l#^1`PB4&
+]XtALriH.#!NN3qWrK+"WqrdqX8o=#WWB0#ri?%"s/cC)X/i?"XoGO(YP,4#YPYR%Ym%G>[C*NT
+rjriV]=PP_[^NQLZEga@Za6p@Z*1A1YR[qDYd(I=ZE^[?ZE^^AZi761Zhh'-[JmN4[/RE3ZimeF
+\@T<O]edF=^qmn*`5Ta:b0%rSdad%,hr3PPhVHr@g=Fa$dF-Fke'uq!f%Jd3h;@2Qkj.[,p%s=?
+[f6U+p$1o1lg*j8s"sZElJ9sfa6`Bkh<1BNR#m2mOJ\\B>@h3JXfJG'WiW4(>?YHB?!UXN^q[Ut
+]t:ha[^EN's"F6<p?1W$kNV9ski_-kjlPXcio8kOg""Tuc-=AN`l#[0^V%4j]=>AZ['d<M[C,V7
+s&45C<`W:(=^#$7?!^lG@U`kZAnYjmCMds-EH6/DGBeF\I=?]tK7nu7M2I7OO-,TiQ'[l-S=Z@H
+U84ZaWN*&&Yd(OA[^WfZ]Y;.s_SjF6aND]McHjndeC<($f\5*8h;7)JioB+]k3(smlKdg'mI'H3
+nF?)?oCW%T!quB_rqQNhs8)Zjrqu`no_sFAL];l~>
+JcC<$M#[/IrVc`nr;6Njs7uZhs7ZNerq/#<oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLh:pZ9f@JI#
+dF$:cbfe,L``ckfDM!CmL%'cmK@b_NF9$CXFT$:XFSg1^F*)O'FU<,2F)l>AEcH)>rGWZmE,ff5
+DJEftBP(smCk%"hJqeo1KnbJ?Lkktc!/^]1!euJbre:?,s-*\NQ'7>mP5^UDO9q)7PED#jPE:fb
+rJ^9)s,?u;s,-l9p5T'1p5T'3qi1E3rf@)@plGH:s,d>FPQ$jGPRE\<P)t`cOH>TeP*,^)!g8\.
+rf@,CrK.5GOcb`erfI8FOcfU*p6,K@rfdAH!L8uMQi3<ORK&`bR[]k>TV.pNU8=fgXT#@-XfSS)
+X/i4urhodps/H%!*NZEHYd(L@[^WfZ]tqV-bg=kkg>:cGioT@el0@X6mJlVSn,D_cn*ol<oCV_L
+p\=OZqu$ElJcFa0.GMDDZ*UdD['SuMbJ(?eUn<7*Z+%ZK]m>l`D.[a&H['a/;c&4$JUi@OJH&CN
+:/k.i;,EI?OoCFGNf8pTMM[Gp./2-&[)T;QYd(F;ZEUO7XfS_/XK/D$VPKrZSXc1;Q^3o#OcYW`
+NK!jp"c/%lLkgcWM#UD"<*!%$=BSg3>[:ZC?t*SUAS,UhC27[(DfKf>Fa&(VH[U?nJV/W1LP^nI
+NK93bPa.T&S"-(BTq\?[Vl?\tY->1;['mHS]=bkm_8=.0a2lEHbg+P^daZdtf@\g3gtgiFi8WeX
+jlYail0@U$m-X60n*ol<o(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?s+gW)~>
+JcC<$M#[/IrVc`nr;6Njs7uZhs7ZNerq.o9oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLh:pZ9f@JI#
+dF$:cbfe,L`^E9f9htL]s%r5_k"tqPpe^uPr&k!@n3$P/r]9m;q`Om?!':$>r](iS2`WiY3'9Vu
+6UXC47n?0C8P2TH8P2QH9)_E\8H)3\;#aDk:]O;i:B"#k:/=V\rD!>erDWVls&8kor_rMin5]Ki
+s&K&!r`B,#p/V,lr)Nbt!EE+r<<-(u=9Vc,<`N.#rD`Vn!`i<%r`')%<E3!ur`9&!!`W0#r`B"u
+pfIDrr`B,%!a/]1r`fD+r`]G-=^(]-"^>5;?t*XFA.`<\@:E_U@:*GO@q9+^B4u!nrbM^SDJsE2
+rbrNkF*)VNH[L9mJ:E*$K7nr5L51T`M?&S6N'`MaO-#KePE_>uQ^O;3S=Q7DTV8-VV5C/hWN3,&
+Y-5(8['[9N\[oAb]Y2(q^r!t+a2lEHbg"GZd*gCmeCE+#fDaD+g"Y?>h;8.h,3%YDjlYahkiq?s
+lg*p)mI0N6o()DDp%A%Pp\4IXqYL-frr)iqb5XW@H!Xob?<plD?%I-4@9Zf4;+!lO=("O&4$YVW
+0/bRN5<LSU1e:2.7n,p97QECd5<V1n4'#?]<`E'u<;fbgs8N#ps7cNerV$0WqW@SFpBU6,PB12=
+BO:XCr*0Y9>[(H<>$>$2=]ea+rDsS5=&r@$<Dual:f:.f:Jak`:\.E_;gMDD<``C+>$G6;?=.)L
+@Us%^BP;-rD/O93EccGJG^=^bIXm!%KSG8=MN!OUOckroQ^F84StD^NUo(&hWiWA-Z*UgG\%0,`
+^;%M$`5Td<b0/#ScdC1jeCN7(g=tE=hVd>Oj5f=akNM0qlg4!*mdKW6nac8Bo`"Lbp@n=\q#C0i
+qY^6ir;HTdrdk*)s*t~>
+JcC<$M?!5IrVc`nr;6Njs7uZh2u!%>p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`FO7KKrpo>U%k;OT@fb5ReN<ORf8cXS=?#ISGSd/R%'P5S=?":S"#q:R$X,+Q^=#)
+Q^*o&Q'@JtO,SjIJqSl6N3BCeYICpI['I'GrjDd5(U^`YZa$jB[^*0C`lc9Ba2Z->`Pod6`W!aT
+`;[XS`W!^Y_8!U`XK/?"WqiXkWqrdoWWB0#r2U((Xfee,X/rH#Y55='Yck8/Xobf2Yl:j)Yl:m?
+Za@-L\[oAa]"#2V['R'CZ*:J+YPk[,Z*L\7ZNme@ZEpmCZEsD7rNu^6Za9Y<s0Ma4-+::m\@T>c
+]tM1r^qmn,`Q60CbKS5VcI(.lf\>39g"4a'e'ZVCdJqN*dF-Oof%/O.gtprJjlu.$o(N$5s0hq3
+p$2#6m-Es9s"sWEl.sjea6N6ip#_mhcFf+(Oe\S@S7Z06XK8D'WiW1'>ZtQD?<p`9^VIRu]t:hb
+\$i])rsS\hs6/\/kiqBuki_s-+R%tKio8hLf@86pbf\&J`l#X/^V.7k]XYJ[[C*?L[C,V7s&45C
+<E<.&=]ns6>[CcF@:E_XAnPdlCM[m,E,fr@G'A4XI!pKpJqJc3Ll%%LO-#NgQ'[l,S"6.EU84W`
+W2cr$YHY==[^WfY]Y2(q_Sa@4aN;WLcHjkbe'uq"f\5'7h;7)JioB(\k3(sml0I^&mI'H3nF?)?
+oCW%T!quB_rqQNhs8)Zjrqu`no_sFAL];l~>
+JcC<$M?!5IrVc`nr;6Njs7uZh2u!%>p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`E?klEJB!tL%p>lK@keMFT6F[FT-=_FE;O#FT-CeF*2PFF`_a)F$4VdEcH&=EH,r;
+EH#o:EH#i8ChdWrAS,UiCk71hKS>)8L4tA:LPUbALPUeAL4k;8LkUJ6PEqAsP`q5mrK.YSOHGZg
+OcbfjOcb`dNf8mSrJLK1rf$f8rJUc:NrG%<N;\b8N;SY8Nr4n7Nr=t4NrP1?OSFn:OT1ICP5UUK
+PEM)kOHBI&s,d8Cq2bT;r/gr@r0$r>rK@#@rfRDJPa%AqrfdMMQC!s9QjT7MS"#q<T:r!SUAgo"
+V5L8lXK8J%WMZPhVP^8gVl0Nm-`O,HXKAY0Z*UjH\\#Si^r4IDe(EF2iT&t\kj%I!m-O-.mdBQ3
+mf)YbnF?)@oCV_Lp\F[_r;HVGs5Eu:g#ofM[C!?L[-HDi]sY&?T7WE8[`$%pH'>+oBQ7j7GBS(,
+;2'XRJ:iB&Inrj8<)Z[l;,<@<rf@;DN/W[QM3.`hpX6aXfWVK_ZEUU>Yck.1Xfnn/WiDtmUS4<N
+S!f\2QBdYsOH5B\Mi<ROM2M7fo83KGH;mmF<`iL->?kE>?XR;O@qB7bBPM=!DJsK6F*)SLH$Xjd
+It3-'KnbD?MiEdZP*;/tR$sM8StVmSV5L8lXKA\1ZEq!K\[oGe^VI_(`Q$!@bKS8Xd*^=le^rI-
+g>(N@i8EVTj5oFdkiq?tm-O--n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCN*J,~>
+JcC<$M?!5IrVc`nr;6Njs7uZh2>?h<p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`C*6h92A:F;:n_D48h;?47YN33s7T+3]]A$3rD);4SV#<3?0t92`NiY4@M\*77Kd<
+84Q6C91_]I84cEF8OuGP8-_XU:f1%c;,R9gs%iYi#>\)j:/4S\:Amri9iP'i;ZB\q;Z'Jd<:Nug
+<rQ+s<WZ9%<rQ,!<;ont<;0Dl<;oqu<W,u$=BAL%r`/ttpf7;os&B&"r`'#!<E8uu"'&B%<W6%l
+=8Z2#=8uA&=o)>%>6nD8=^#'8?=.(=?4'qD?=.&J@q/tV?iF=C?=.&J@q9._AnYjmC2@^(DK#Jm
+&TMc/F*N"XI"$X!Jq8N,L51Q`M#N8MMi*FPNK0']OcklkPa.Q%R[]h<StD[MUSXjeV^&1@X0&P.
+Z*LaE[^`lZ]=bkk^V@V%_o0U9aihrRcd:(geCFNK&_G[ggY:N>hV[8LioB([jlYb*kSrdOlKdg'
+n*ol<o(2MGp%A(Rq"X^^qtp<irr0k9/\cOc?!^lE?XI,lG%tGi=B&-a85WDq@p(iZ93Nu,1d=/d
+4Z5,f8Ol9?77B]F3<),G5!:ti<E<-!<;]\Os7cNgrVQN\qrR\Pp]g<.PB(,7G5PYG>RFbA>[:Q<
+>[(E8=T)D&<XVo/=BJX*<)cjs;,dEjs%iVjo25NdH;mmF<`iL->?kE>?XR;O@qB7bBPM=!DJsK6
+F*)SLH$XjdIt3-'KnbD?MiEdZP*;/tR$sM8StVmSV5L8lXKA\1ZEq!K\[oGe^VI_(`Q$!@bKS8X
+d*^=le^rI-g>(N@i8EVTj5oFdkiq?tm-O--n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCN*
+J,~>
+JcC<$M?!5IrVc`nrVQTj!;ZTg#5@ibp%@tKrphZ2nF,f4m-O''l0.<mjl>C\i8<DIgtLH5f@AC!
+dEg+_bK@oH`FjIQKrgi=U&1MOT@fb3Re`HORf8fVS,f&XSG\lSRM;0YS"#_3R$sD/QC!r'Q^*o%
+Q'IR4PS91=KnG#0KnYJfY-51>Za7*M\$u@D&$rXL[Bm3FZa-jB`Q-!;a8O!caMl-:`50C0`l#^4
+rkelT_S3aqrMoXlr2Tdtr2Katri5jr!3H1#!NiO(XT5I#Xo#:"Y6(l/Xo5F&Y6;#1Y->/0Y6D/8
+ZEppGrjETP[C3HKZE^X=YHP+3Xfee.Y-5%3YHRo/riZC.ZEjJ7qQp+,rjDa4rj;a8rO*!@\@B)\
+]=bhkrkT>e`5]j?bg"GZcd'h_d*gFqf\"d(e,.N-d*L(cdaQ[qf%8U0gtq#NkNhU+o(mq;[f6R+
+lgO<0lg"KL.K&f&hUSUFlLXc?jIjrH]o88@@@s-]ARM^CXK&D&XJoB.>@CoG?!:A0^B_Hb]XkY^
+[^D.q/GnW1l07Bqkj%KtkN;$olK.'ciSE2;e'QFabK.]C_ns7)]t:tk\@K,W[C#q@o<s-H;c?[s
+<``C+>$G6;?XI5N@q9.`BPD6tD/O<4EccGJG^=^bIXm!%KSG8=Mi<[WOckuqR$jG6StMdPUo()j
+X0&P/ZEpsI\@K5a^;%M$`5Td<b0/&Td*^:ke^rF+g=tH>hr*JQj5f@bkNV6rlg4$,n*fc9o()DD
+o_%nWp&Ojcq#C0iqY^6ir;QZerdk*)s*t~>
+JcC<$M?!5IrVc`nrVQTj!;ZTg#5@ibp%@tKrphZ2nF,f4m-O''l0.<mjl>C\i8<DIgtLH5f@AC!
+dEg+_bK@oH`E[+rEJ8stL&6PlK@kbUEqXVSEr^=ZF8p=^F8U.ZFoHL]F8p=nE,ou?EcH&<EH#o:
+EGof8DuO\eChmZqB4PXgCk@1hKS>/8L]3,HLk^_@LPCS=L4tA9KSGYSPEM/oP*1rkrK.8EOcbii
+OoCLIOcYZaNJmdns,6]3rf-i7s,I&;!0-c4r/C]:o8Wd1s,[2?"-8J&O8P+9O8b4BOckn+P66u1
+Oc]L%mu[R3s-!)<s-!8CrK75GPa202"-o1<Qi3<ORK/iVSHGIVUSRmcs.][lV5L9kWX#N$Vkg/d
+VPjEjs/5mq+fVKBXK8V0Za7'J\\#Mf_TC*Pf@o'=iT'"^kj%L#mI'HBn.G*Un*]Z7nac8Bo_/%S
+qYU3hJcFX-2:_<3['d<M[']/Rc+^ThVOiC*Yd_Qe[X+FAU1eL^:Npu)<)J:#JUrH(J:C?j:/t7k
+;,C*gOog`+O8b(=Mi*Vr"S^?YWnmZY.C6:aZEUO6Y->+4XK&7sUS=HRSXPt6QBmc!P)t`bNJrdR
+MM[4ILPUcXM18E%;cQk!='/U/>?kH@?X[DRA7]CeBkqL$DK'T9FEMePH@('hJ:W?+L51VDN/is]
+P*M?#R@B_<TV8-VVPpMqXfen6ZaI6O\\#Mg^VRe*`Q-'BbK\>ZdF-Opf@S^0gYL]Ci8N\UjQ>Uf
+l07L!m-X60n*ol<o(2JFp%A@Y!;HHes7u]kr;6Kkrr)KgJcCN*J,~>
+JcC<$M?!5IrVc`nrVQTj!;ZTg#5@ibp%@tKrphT0nF,f4m-O''l0.<mjl>C\i8<DIgtLH5f@AC!
+dEg+_bK@oH`C39g9MSLK;:n\F3r;#<4T%;44T.A:3WM2;48_5:49%;`2`<WU3&s#h6psL87n?3D
+8kV`H8k;KE8kDTF8Ou?B:\IWb:BaHf:JX_\r_NPh##@uh9iFqfpJ^`apf7>pmoB?ds&/qt<W5ts
+<W?,!<Vof*<E<+#='&F&=&r=#<:<ic<WuK&<)lt"pJq/mr`95)='&O.qH3]!"'A]0>5h_0>$G6;
+?=3Y>!+5\1$t*LQ@q&hP?!CQ@?t0+Gs(24C'kh;rC27X&DJjB3EH,r9EHc\SH[UJEJd@!_L51P?
+M2I5jN;neLN/`jZOHG]jQ'R`&R@B_;T:r$Vr21d<WN*##YHP4:['d?O\\#Je^;.M!_8=+0a2lBG
+c-FY_daQ_Ff)F85f\,$7h;-rGi8WeXjlPXfkir*3)!gPTmdKW7o(2MGp%A%Qp\Oa`qu$BjrVjY5
+"MJr=?!dM;-!ji1GALbo=&`'a85E;r?rf<W:1Q(<1bCmS4>o#e8Ol9?77B]F2ul)?4U=,3<E<.!
+<)lor;pbRCrq66Xr9!k^o#6f6@oIVX?N+71>lS(8>[:W?>?Y35=oMP'<rZ;%<s_o/<`E!t<)HUm
+r_Wen:esnao21!8;c?[s<``C+>$G6;?XI5N@q9.`BPD6tD/O<4EccGJG^=^bIXm!%KSG8=Mi<[W
+OckuqR$jG6StMdPUo()jX0&P/ZEpsI\@K5a^;%M$`5Td<b0/&Td*^:ke^rF+g=tH>hr*JQj5f@b
+kNV6rlg4$,n*fc9o()DDo_%nWp&Ojcq#C0iqY^6ir;QZerdk*)s*t~>
+JcC<$M?!5Irr)ior;6Njs7uZhs7ZNerq.u;oCDJBnF,i6mHj3*l07Eok2kX`iS`VLh:pZ:f@JI$
+da?Cdbfe,L`l2V?N.dgorh97_m[r1(pmV,MqO7GRqj^9JR[]e8R[BP4R$a;1R[K\5R$X2+Q'[`#
+Q'@PuPE_;qP*:ucLOt)/KSGDfYHbC=Z*h'I[C3HL[C!3GZaI3I[C!rl`5Td:a2\,!!6"lU"iS6n
+_SaCl_Zduq^q[OrrMoRjri,stq5OLsXK;9!riZ(!poaY!!3H.$ri?R2XKJb0Xf\b/YHY::Zhq-0
+ZMq'/YHI`(qQ9k'Z2Cj(ZM(U)[/.31[f<fP\@8rW\@K2_]=bhl_84",`lQ<HcHt#:d3I)he^rC'
+eC;srda?Ihd*L(cdF-Ile^i=(g"kNDjQGjrnb@\8[JpEtnF,c2lMgf?rU]=3f;cjTp%\%;Yg\rE
+NFS2]TV.fd@'?]6Wi`>'WEWV4@:*>H>?SbV^V7Co]"#/V[>t8?qs".Fl0%?qlKdZsk3_R%jl>=Z
+gtC6+d*KqYaN)9:_SO%$]=kke\[]&T['mBMo!\QsF];@A='/U.>?kH??XR>PA7]@dBPM=!DJsN8
+FEMbNH$XjdIt3-'L51VCN/`m[P*D5uR$sP:T:r!TVPgDnXKJe4Za@0M\[oGf^VRe*`Q-'BbKS8X
+dF-Oof%8R.gYCWBi8N\UjQ5OekiqBum-O-.n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcCQ+
+J,~>
+JcC<$M?!5Irr)ior;6Njs7uZhs7ZNerq.u;oCDJBnF,i6mHj3*l07Eok2kX`iS`VLh:pZ:f@JI$
+da?Cdbfe,L`l21rEH-M\re:9'mXs2Erc/![piQ7OqK*$bFEM\IF*)MEErL,AEcc;AEH6#;EGof8
+DfBW4DfBW5E,B?(AS#CaBPW-MK7el3L5:P>Lk^_BLkUV=LPLV>LQn!cP*D/prf[AGOSt=ANrkE*
+PPpUNP*(fcN/`dTNK&nqMu/J3Mtr>2MuJ\6NW+t1NW"n7O8k=@Nrb9#rf6o;s,d;Erfd>EqiC<0
+s,m>CnWEd5qNCoDrfn:cQ'@MuQC!o'Q^F20S"#t?T:hpRV5C-fV#mQnW;`drVurrrVl0Nks/5mq
+s/H$u*ilBDYHbF@[^`o[]Yhn;db!4.hVdGTjlbmpmI'K5rpg$W%drfSnF?)@o_%tRq>:*hJcFU,
+/CX"/['mBN[C#AXcbHokW1\d/Ydq`i[=t/mOD.L-:O%,+<DeC$JUiB(J:RVp&62\.;,C)QP*(id
+O,T!VMi*Vr0)<u1XOj_]YHtO>Za$^9ZEg^;X/`+qUnOHQSXPt6Q^*buP)t`bN/NUNM2I1IreU-%
+s&4&><E<1'=]ns6?!^lG@U`kZAnYjmCM[m,EH6/DG'A4XI!pKpJqJf5M2I7OO-#NhQ'[l,S=Z@H
+U84ZaWN*&&Yd(OA[^WfY]Y;.s_SjF6aND]McHjndeC<($f\5*8h;@/LioB+]k3(smlKdg'mI0N5
+nc&([oCW%T!quB_rqQNhs8)Zjrqu`no_sFAM#Vu~>
+JcC<$M?!5Irr)ior;6Njs7uZhs7ZNerq.u;oCDJBnF,i6mHj3*l07Eok2kX`iS`VLh:pZ:f@JI$
+da?Cdbfe,L`l1A<8PDiTk#'f.rAsj<r]L'>ofW48oK!"73rM/<4Sh,S3]T/X3&rrY3CH5)84Q-?
+8P)NG84rkPs%35_r^lf[!)NSj!)NSg!DZGh:B+,h:&n#e<;BJc<;fhr<WZ9%<q',g<;oku<)riq
+oMl&o<E<1%<rH#!<)rlrnl>Whr`/u!q,RDns&K)"s&]2%rE9/&"'J`.=o;A&=^(`-"'o5?@JsX8
+@/XCI?t!JQ@UWVN?t!MS@q9+]AnPaiBPD2[C'AEjDf9T7rbrKlGC"R^IXcp#K7no4LkpnFN/[aq
+req&@Nf]?cPa;<8%%*KQSY2^RW2co!WN,rs,-%`IYd1UB[^N]V]=bhk^VI\&_SjI7aND]NcHjnd
+e'ut#rR`XRg=tH>hVd>Oj5f=ak3(sll0@U#m-a?2nF?&?oCV_Lp\4LZqYU3hrVlf1s"1[#J8&@s
+?X@&DLO!cI?<C0)6V($V@pi;"6o77c-o<M>4ZbPZ8P)EA7n,p:r\t<K5!;%j4B>K_<)ZdrrDU<-
+pAXjcmJIjn`fkIR;fZ/K?!^`?>[:ZA>[:W>>$5$3=nu/,<E<."<)lmp;c?Tn;#jDk;"@K`;fu&>
+<``C+=^,-:?=.)L@Us%^BP;-rCi402EccGIGBnL^I=Hd!K8,/<MN!OUOHPinQ^F53StD^NUo(&h
+WiWA-Z*UgG\%0)_^;%M$`5Td<b0/#ScdC1jeCN7(g=tE=hr*JQj5f=akNM0qlg4!*n*fc9rpg*]
+o`"Lbp@n=\q#C0iqY^6ir;HTdrdk**s*t~>
+JcC<$M?!8JrVc`nr;6Njs7uZhs7ZNerq.r:oCDJBnF,i6mHj0(l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bKJ#K`PcM@Mi!r%U&L_VT)bP]T@oh1Rf/`ORf8fRS,f&XRL,IPR?s;-Q'du,rL!bTQ^!j9
+Q2d$fQ'7GtQ'7JrOc>3OJ:iK+Mls=k['[6J\@&]LZMh*0[JmK5_o_hr"i\O%`Q6."`WX2u_o'@i
+_uIaU_Zdll^V6_Jl_sudX/rE!WrfE+Y5,3rXob`.X8]4!X8]4#XTP`.XfVK'#Hk;8Z*L^AZMq-/
+YQ(d&Xo>EuY5,:.Z*L^BZEggCZEjJ9s0Va4r3lO4s0s>b]">Vf]t_D"`5]pCcdC1ie^W+!eC<%!
+f%AX,f@JL'eC;mnrQtMj&(8tYf@\g3hVdARjll.+rdk*YrrM`ZrpKmTli$i=o]tMgXN0W!p[I4G
+e=!%jQBYjPTq5LsY-"b)Y,eS&>?tKC?X6rA=i%ng^V.:l\[Ju,s"F9?s6Ak5kih9skih3umH`lo
+iS`GCeC)^gbfRrG`5BF,^V.7m]XbS_['d9L[^G\7s&45C<E<.%=]np5>[CcE@:E_XAS5[jCM[m+
+E,fr@G'A4XI!pKpJqJc3Ll%%KO-#NgQ'Rf+S"6.EU84W`W2cr$YHY==[^WfY]Y2(q_Sa@4aN;WL
+cHjkbe'ut#f\5'7h;7)JioB(\k3(sml0I^&mI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrqu`no_sFA
+M#Vu~>
+JcC<$M?!8JrVc`nr;6Njs7uZhs7ZNerq.r:oCDJBnF,i6mHj0(l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bKJ#K`Pc,!F*3!2L&QbsK)gT%K@tkSErU4VFSBkQFT6CfFEM\IEcQ/=EVsh[F)l8=EW0qW
+D@1?#DfBZ6E,TW/C&MTGAo!!OK`6]0Ko(V@KSKJ]!JZF0L&mI'rKI\RP*D/nPa%;nP)th*OSt=A
+PQ$[GO,f8"N<"q9Mu/J'MuSb6NW5%;NW+n6NW+t9O8k7=Nrk?$NW+t9NrY:>P5gXHOH5H_rf?T2
+!g/S+plYT<s,d>DOnb(>PQ$gEQ2d'`Q'[f&Q^=)-R[]e;T:r'XV5L8kW2KQls/H!rs/H!qrh_$?
+W2Q\pWiE,#XKA\2ZF%$I[^Wibaj/;af\>9AjQ5Ofl0Ia)nF?MK&Fo5WmdK]:o(;SIp@nC\rVhBJ
+hZ#.Tm('O4[C*HMn))O1[]l^'KU9!U_SNU3T65KpE,JKtGB?PVK7e`*Jq8H&r_Er&<)QRi;3R0*
+OcGK^reup<1&9;4\'21_Z*UaAZa$a;[Bd$=X/W"nUn=<OS=5k5Q^!_tOcYW`N/NUNMM[4ILl$rY
+M>pM#<)lt"='8[0>[1TB?X[DRAS#LfBkqO&DK'T:FEVkRH@1-jJ:`E-L5:\EN/s'`PEhH$R[]k>
+Tq\?ZVl6VsXfnt7ZaR?R]"G_k^r"".`lQ9Fbg+P]dF6Urf@\g2gtgiFi8WeWjlYail07O#m-X60
+n*ol<o(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?s+p]*~>
+JcC<$M?!8JrVc`nr;6Njs7uZhs7ZNerq.r:oCDJBnF,i6mHj0(l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bKJ#K`Pb2;8PDnU;>sDc;#jMk;;"eB3rV5?4Sh/44T7AA481f93s.T,3]d7%"$AY,4T.>G
+3]oJa3B/tr3!)*/7fGp`7nH<F8OuEEr^cuZ!DlYb:]aEh:]!oe:]=,f:&e2m;ZKep;ta2g<Voh_
+<Vobq;ZKeq<<6-%qc3Yqr`9&!!*&nsrD`Pl!*9"t!E<(t<WQ3$r)Nbrs&K%t!*0#!!*B,$!*T/#
+s&o8%&6W1@>?Y38?!^oI@U`bS?srtB"(G\JA,B^8A,Ts<AcHECBE2cGC'ABiDJsK5rbiQkFa8=]
+I=Hg"K7nu7LkgeDMi<XVNfX-uBTA7?Pa.Q#Q^=).S"61GV5^MsXK/D%WMur#YHbIC\%&rY]">Yh
+^V@V$_o0R8aihrQbg+P^e'uq"g"G*6gt^`AhVd>Oj5f:_k2tjjl0@U$m-X61nFH2Bo_%nOp@n@W
+q>'pbrVaA."LE-">[RD82Mc^!AR8M>;F<uP>%(f=4@V+b0fLm@5<V+`2+L5.7n?';7Q3:d4?bnk
+4$6PE<)caq<DugqTE"N^$M;B&F(8Ee?!CW@r`oJ0"^GA>>[(G2=o;>1<EN:%=&i4!<E)go;c<Tl
+s%i_n;"@K`;gMDC<`W:)=^#'8?=.&J@Uit\B4u!pCi4-0EH?5FGBnL^I=Hd!K8#&9M2R=ROHPfm
+QC+,1SXuOLUnsufWiW>+Yd1UD\%0)_]t_A"_o9X:aihoRcd:(geCN7(g=k?<hVd>Oj5]7`kNM0p
+lg4!*mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk**s*t~>
+JcC<$MZ<>JrVc`nr;6Njs7uZh2>?h<p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`F3\5KTM`&T^eZ%T(SQPS+iBNS,AcZR[]\6Rf/ZRQkPmVR$O,-QBmc"Q^*i&Q'ISt
+Pa232%$cg0KReT(L5;t=ZaB_>'t:TW[C!<I['?sF`P]^8_oK^;`l?'u`YHG3a2Ps8_SjC1_o0R4
+`l,a4^qd[rlDXibX/l/us/Z1%!3Z."riZ4%ri?(#"08H%X8T+"Xo>C'XfSW'X8]4*Y-5(7Z*:G2
+Y5>@$X9,N*Xo#:$YPPL'Ylh;<Za0S:!4)U1!OT96[f<c6[f*]6\IH-^]Y2%o^r"(4bg=kjr7V&#
+qUc#'e^W'sdaA'@'@G7UdaQ^sf@ej3gtpuIio]S!qLS[UrrV`ZnG_kVm/?r>p$:YkXiTl&p@71F
+e=*LtR$;'RTUoFtYHFt,XfJM&>?kB@?X-lA>/A"g^:h1k]!o/.rrr<"qX*P3robTml0.F%m-<]l
+iS</>e^2ahbfRoF`59=+^:h.l]XbS_['d:?[IUbU;H$Ln<`W:(=^#$7?!^lG@Uiq[AnYmnCMds.
+EH6/DGBeF\I=?]tK7nu7M2R=QO-,TjQC+)0S=ZCIUSOfdWiN8)Yd1UC[^`l[]Y;.s_SjF6aND]N
+cHsteeCE1&g"P3:hV[8Mj5]4_k32'olKdg(mdKW6nac8Bo^qhLs7QHerV-BgrqcTjrVZZno_sFA
+M#Vu~>
+JcC<$MZ<>JrVc`nr;6Njs7uZh2>?h<p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`E-G_Ed*!2K^j]BK)'EeF8L(PF8U+^F*)GFr,hjW&TMc0EcH);DfK`8EH#l8DJsLl
+D_>d=AS#C_BkW*QKSG58LP^h@M26tCLkUS=PEM/pP*M5sPEV5oP*(ihPECrhOSt:LP*;#lP)tie
+NfB!VrJUT4oo&j-rep`6rJ^f;rJgf8s,@)=NK*pt!KE-=NrY4<NVeb5O8b7>OoCI?O8P+=OnOn2
+OT:LAOoLUEPPgRDPP^UCPn01IQBml)R@0M5S=cILVlBZqs/ZI*W2Q\pW2HQkWB[;ZVl-DiVl6Pn
+WN)u!XK8S.Yd1RAZa@-N^r=LBdad(-iSrq[kNM3tnF?/Ep@\%HmdBQ6o(2JFp@nCZrVhBJh>[N%
+df-`S[3P(re&Ai%WM5*6Zb+#h["G&oL1bIC:jI8-:/QXsJq/H(It7Mos&BM,;,C,RP*(idNfB$W
+N0!uhqU<1%]sP#KZa-mCZ*:I@ZELC1WMQGeT:haER@'>-Q'7AnOH5B[Mi3FLre^W1nqhio;c?Xr
+<``C+>$G6;?=.)L@q9._BPD3sD/O<4EccGJG^=^bIXm!%KSG8=Mi<[WOckuqR$jG6StMdPUo1/k
+X0&P/ZEpsI\@K5a^;%M$`5Td<b0/&Td*^:ke^rF+g=tH?hr*JRj5f@bkiq?slg4$,n*fc9o()DE
+o_%nWp&Ojcp]1-hqYg<ir;QZerdk**s*t~>
+JcC<$MZ<>JrVc`nr;6Njs7uZh2#$_;p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`C!*e8PJhSpJK=7pcAC9r]L!<p,i@:48(]93BI.$r]:$?s#g6As#U-@'KA*22`N`W
+3(-5-84Q6C8kMWF8P/nP"%c*^;>a5j;>X/i:]=/l:Jajc:B+)m:/=Y\:]4#a;u'Dl<<-"n<W?+t
+<<-(u<W?+o<W#hq;u]hr<W?,!<<H9%<)ifrs&Ahps&Aeor`8kqpf@Dp#?4](<E)su<rQ1n=92Q.
+rE0)&rE9G1?!UfG@U`dF@fBd;@UimH@K0d;@q,FIs().@s(;:Es(VLJ!c)Ugrb`itDJa91Fa&1[
+I=Qp%Knb>;LPUbCN/`p^P*(idN/is^rfdhWQ^F/.S"-%@TqeNcri?+#ri&PkY->7>[^WcW]">Vh
+^VI\&_Sa=3aNMcNc-FY]dF6Xrf@em3gYL]Bi8EVTjQ,FbkND'nlKdg)n*ol<oCMVIp%S4Uq=sd]
+qu-Klrk&16Y&@u[?X<Y;2d_>fEFrT]<E)@W;d*O9<'3]-4>8]N/j;B[0f;Np8Ol6=77K3q3'BJh
+4Zbc,<`N'r<E3!t;j%(cp;iJ=A8GOX>lJ%/>QeD?>[:V6>8^RG=]nj.<`iI)=&r:$;cHas<)HRm
+;,L.frD<&^Io93D<*!%$=BSg3>[:ZC?t*VVAS,UiC27[(E,fo?Fa&(VH[U?nJV/W1LP^qJNfT<c
+Q'Rf*S"-(CTqeE]W2co#Y->4<[C3TU]=bkm_8=.0a2lEHc-F\`daZh!f@em4h;7&IiT&tZk2tml
+l0@U$mI'H3nF?)?oCV\Jp&F^cp\jjeq>U6hqu-HlrUg)?s+p]*~>
+JcC<$MZ<>Jrr)ior;6Njs7uWg!Vc<eoe?%0o()>?n*f]3m-O'&l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`F<n?K:/;.T_>#&ScG2CRf8fTS-5:NS!oiGR0o:JR?a/,Q'dr-QN!6VQ'@W#Pa%N"
+rKI8Grf\1[MM6\5K7er<ZEq'M[^<EM[C*?G['R-Yrl4uW'Zn>6`Pfd9`Q#j:`l>s7_Ss@._nuDk
+#K+Kt_Sj5U62mhOWW0$sWr9!qXSo7&Y-"i#X8f1%X/rG*r2^+'XK8J&WiQ-#rN6.&riZ.#riH+$
+!j8Z.ric%"!O8s/Zi.92ZN.E4[f<c7[K*f9\Gj&=\dc9a]Y;+q^r"+6cd^S%rn[e6gtC<2rn./%
+$J<t\e'laoda?LkrmUnss4@;($JXCoiSrkXl1"HFJcE:\#P[ZTnaQ#9mf!/-p[7+qYK?/*p[R:F
+eXEV$S<IEUTV#IuYcb(.Y,eS%r`ftB?X6uC>/A"h^:h1k\[Ju,s"F9Lna>Z-lKRNul0.O(mcrlm
+i8!&=e^2^gbK.`C`507*^:_+l]XbS_[C*BK[^>V5GZ%I=<)lt"=BSd2>[1TB?t!MSAS,RgC27X'
+DfKf>FEVkRH@1-jJ:`E.LP^nINK90aPa.T&R[ftATq\?[Vl?\tY->1;['mHS]=bkm_8=.0a2lEH
+bg+P^daZdtf@em4gtglGiSrnYjlYail0@U$m-a?2nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUp/@
+s+p]*~>
+JcC<$MZ<>Jrr)ior;6Njs7uWg!Vc<eoe?%0o()>?n*f]3m-O'&l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`E6VcEI<?8K_C&CK(a6^FS9eSF9?T+FE@D&$?C30E,ou;EH-&=rc/6_DfK`7DfKaq
+DZ"E$DJX$"ARoCbBkrBVLk^_?LPL_CLPCV?LQn'gP`q;sPE_8oPEV,lOT(CJOcYWeO-#KcrfRMK
+P*(igN^5u,N:i,/MZ/P5N;/D2Mu\k9N;\_:NfX1"rJgi;!f`5#ooK*6!frG)rK$o=!0R8D"-J\,
+O84n0OoCOCP5pdDPQ-jIQ2[$HPlR-KQP,[RR[T_:T;&-\X0&S.Xf\V%W;NXoWrK%!Vl9Nk32igU
+WiE,#XKAY/Z*LaDZa@-N^;J"7cd^V&hr*JQj6#UnnauPMq"OIOmdBQ5o(2MHpA"I[rVhBJh>[Z(
+\$i]R[f3Z`mblR6\[/<1Kpf<[_8!=/UND6)EbnQtGBQ\YK7ni,Jq8H%:Jahe<E&lo"Hnt2OH0="
+!K2nts!d]j^>uN*Z*LaBZEpg?Z*q!CXfA=sV50cWSXZ%7Q^3o#P*1ofNK&jSreg]3s+p6&GZ%I=
+<)lt"=BSd2>[1TB?t!MSAS,RgC27X'DfKf>FEVkRH@1-jJ:`E.LP^nINK90aPa.T&R[ftATq\?[
+Vl?\tY->1;['mHS]=bkm_8=.0a2lEHbg+P^daZdtf@em4gtglGiSrnYjlYail0@U$m-a?2nF?MK
+!V>s_o`Fj]p\ssfq>^<hqu6NlrUp/@s+p]*~>
+JcC<$MZ<>Jrr)ior;6Njs7uWg!Vc<eoe?%0o()>?n*f]3m-O'&l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`C*-e7nutV;#=,7;"csL48qA<481l;48:i:3W2#<48h2?48qA@3rD)>3<hE"2`WlW
+4oRqV8P2QH8P)NGrC?obr_`\l!)`Pg!)NSjrD*Dfr_EGg!DZGi:'+-U62X[W<:j/k<`Susr`/u"
+r`/qus&T8&<E8uss&8qss&K(urDiku!*/bmrDihrq,RGq"]SK&<`N/n<rZ1s<r?%n=T;P(=p8&2
+='&L,rE9G2?!guKAS,NQ@fg+J@/aU8A,Tm8@j,AmA7T7`AnPdjBk_?uCi+'-E,]]4DfKlCH$b!j
+K8##4re1N2Ll.1RP5^\XP)t]aOH>ZiQBml*R[]k>T:hsTVQ$VtYHG"/WiWD0['d?O\[oAb]Y;.s
+_8F42`Q63Fbg+P]dF$CleCE.&g=tE>hr*MSjQ5OdkNM-olKdg)n*oi;oCV\Jp\4IYq"agarVc`'
+rs#QB>[C`B?iF@fLjX5V@9Zc26qL<^?sQ\n8M`C\2)HpM4?P>T8P2QE7Rfg82`Nc[5<V.k4B,?]
+;c6Ror_nsZ#kl9$EFXT#?=!M9*aE#W>[:W>>$G-3=]nj.<`iI*<`N(!<)lpt<)HRmr_W\p:]=2]
+;0Yu;;cHat<`iL->?kE>?XR;O@qB7bBPM=!DJsN8FED\MH$XjdIt3-'L51VCN/`m[P*D5uR$sP:
+T:r!TVPgDnXKJe4Za@0M\\#Mg^VRe*`Q-'BbKS8XdF-Oof%8U/gYCWBi8N\UjQ5OekiqBum-O0/
+n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcEgJcCQ+J,~>
+JcC<$MZ<>Jrr)ior;6Njs7uZhs7ZNerq/&=oCDJBnF,i6mHj3)l07Eok2bR^iS`VLh:pZ9f@JI#
+dF$:cbfe,L`l2G4LPD^pTV1nKcCP$(qjIMQm@+$Dr1!bUrg<hTR@4&@s-O(YQC*u+QC*r)rfn@c
+Q'7DrPa.GtP*M;rOcG?RK7JW.K8HqC\Gio9ZQZfb['Rck`Pf^6_o'L6`Pf[4`l5s;a2Z->`l#d5
+_Sa71r5/QP_u2k&VPpHaW<0*#X88grX8K!sX8T."X8]+"X/brq!3H.""0AN%WrB(!WWfH)XKAV+
+q5jb#X/i?#XTu&4Xfek2Yd"&/rNQ=,"1#;?Zi%31Z37MA['[7>[K*f8\,j1QrO`fW^VIY$_T'dH
+e_B$Bj5T"Rg=Y$Vf`'P.f\+p/e^`1Kdh^B\e'upte^`=*g"Y<=i8WhZkN_I,qgndXrs/;co(2A>
+n*^/S1AC;#fs&Tdp\==>Xk&uBNgl2@TV.l\@pQ7=XKJV(X'/b5@UEDI>["tZ^V@Lp]XbM\NW1@%
+s7>XBmHWs$lg!a'naGf(iS`JEg!e?qc-",J`P]R.^qICo]tF?S"gk\F['m@4[=(nM;cHat<``F,
+>$P<<?XI5N@qB4aBPD6uD/O<4F*)SLH$XjdIt3-'KnbD?Mi<^YP*;/sR$sM8StMgRV5L8lXKA\1
+ZEq!K\[oGe^VI_(`Q$!@bKS8Xd*^=lf%8R.g>(N@i8EVTjQ5OekiqBum-O--n*fc9o()DErq-?d
+p\4[^s7u]kr;6KkrVcBfJcCT,J,~>
+JcC<$MZ<>Jrr)ior;6Njs7uZhs7ZNerq/&=oCDJBnF,i6mHj3)l07Eok2bR^iS`VLh:pZ9f@JI#
+dF$:cbfe,L`l2(kDK(5XKS8rLc@Y\/"`nd,F*)NsF8U.XF8p@[EX6Z(EH#r;Ec?'uE#<M4DJjB2
+E,KT3E,]`4D/!WoAS,RdC5%EALC&cjLPgnDLR+3irfdAF#*Y:8P*(okrK7MMP*;&kP*(igOH]U)
+!K`HB62lfBN:i,/MZ/P2Mu\k1N;nh8N;eh3NrG">NfT8!NrP(@NfT6_plGB8rfISOOcb`dOH5Ha
+Ocbb&OoLUEOTL].OSt=DPEM+.PPgXOQ'@MuPa%H!Q^Ic='UY;WS"#q?U8=llYd(F8XK/>!WN#ir
+"f\N$WMlfnW;ihRWiN5'Xfek3ZEgmH[^WfZ]u%e2c-k.qgtgiEiT04jo(MnUq"F=KmHj6/nalGJ
+p\=R\rIP"(rrpWY[C<WRrj=3Ci6oWUZ`KmTRC0]E^p8WhFFn1GCeo>$F\Pb0JqAN)JU`/F:et(k
+;uTYoP5gUIO,T*YN/Wht1%s,2m^9C,Za@!DZEgaA\[/N@WMl\jUnFBOS!fY1Q'ISsOcYWaNJi^P
+MM[1IM26uYM1&6!;cHat<``F,>$P<<?XI5N@qB4aBPD6uD/O<4F*)SLH$XjdIt3-'KnbD?Mi<^Y
+P*;/sR$sM8StMgRV5L8lXKA\1ZEq!K\[oGe^VI_(`Q$!@bKS8Xd*^=lf%8R.g>(N@i8EVTjQ5Oe
+kiqBum-O--n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCT,J,~>
+JcC<$MZ<>Jrr)ior;6Njs7uZhs7ZNerq.u;oCDJBnF,i6mHj3)l07Eok2bR^iS`VLh:pZ9f@JI#
+dF$:cbfe,L`l1>98k`#Yp/(Zac;=-orB($ApcJ75!'Bg6!]`;&r]C'>r]:iW4$,Jb3]oMd4$#A\
+2E!QT3BK]#8H)6]8cME_8c2Eb;>a5j:\RZi:Jah]:/+O\:AmH^;H$Ln<)`Znoi:fgs&]5$$s-J/
+<)lq!<``C(<E8io!*0"tpJq/ks&8bn!*8qrs&K/#<;T\q<rZ1r<rQ2!<WuQ*<``C*r`T/$!a/W.
+rE9;)=BJ`)=q+\A?t!PWBP1pe@UW\QraGb7r+#b;s(24Bs(D@F+),J*Ci"!.DfKf;EcZ;EGC"Ua
+J:`H.KnP)3L51\IPQ$hZPE:f`MiEd[PEqT'R[]h=T:r$VVPpJoXfnt5Z*:I;Za@0L\@T;b]Y2(q
+_8=.0`lQ<Gc-F\`daQ[pe^i@)g"P08h;7&KjQ5OekNM0qlg4'.nF?&>oCVeOq"aa^qYU3grVlf'
+rs#E=ARAeP?iF@iLja>X@9cl46qL?_@9unq8i&F[2Dd!M4ZkGV1Ijr)7n-!<2`NcZ5<V.k4B,<\
+<)Z^p;c?SVruC[LP&Xog>$bKA?<poC?=$lD?!LN9=]eg0=BAQ&<tA>3<)ust<Dugn;c?Oj:fI<h
+nPO[3;cHat<``F,>$P<<?XI5N@qB4aBPD6uD/O<4F*)SLH$XjdIt3-'KnbD?Mi<^YP*;/sR$sM8
+StMgRV5L8lXKA\1ZEq!K\[oGe^VI_(`Q$!@bKS8Xd*^=lf%8R.g>(N@i8EVTjQ5OekiqBum-O--
+n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCT,J,~>
+JcC<$MZ<AKrVc`nr;6Njs7uZhs7\ADp%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`Pc>8OG:'/n=S$us-`_Ps-`;DrgO%\R[K\7r0dSPrg!JL#*tOAQ'I`$rfmkTPa.Jt
+PE_8rPE1n+P8fR>K7\W*JqJog[Bm9G[C<KKZ,OZ#`59I2_o)Jn&&cB*`5]d:`Pfd:`l>p8_Z%IP
+`;daO62mhTW<'$"r2Tdrs/Q'tri-.&WiN/"WW&jrWVWUrWN)usWroB&X/u9#r2KatriGmss/QC,
+Y-"h/YHP,.YQ(j)YQ(j+Z2V$/Zi%03Za-n8ZN.B2[N)ce\[]2]]=bei]tV4r^qmn-b0\\miT91]
+i8*,cf_sM&fE^$Ze^W.!e^XTKs4.e6f\,!4gtglHjQ5Ohm-jN?qgndYrs/;doCDJBnF$8T*;8ma
+g9\ujq"jUBY1B)GNgl2?TV7r_@pZ:<XKMQ'$!CM<@UEDI>["uC^BM?a]XbM\NW1@%s823ImHa$%
+lg*g'oC2&+io&YHf[J9qc-",J`P]O-^:h4p]t=9R"gk\E['m@4[=1tN;c?Xq<``C+>$G6;?=.)L
+@Us%^BPD3sD/O93EccGJG^=^bIXm!%KSG8=MN!RVOckrpR$jG6StMdPUo()jX0&P/ZEpsI\@K5a
+^;%M$`5Td<b0/&Td*^=le^rI,g=tH?hr*JRj5oFckiq?sm-O--n*fc9o()DEo`+Uap&Ojdq#C0i
+qY^6ir;HTdrdk*+s*t~>
+JcC<$MZ<AKrVc`nr;6Njs7uZhs7\ADp%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`PbtoF)d"cn:T&=noF\Ms)e*Ys)S*[%Wlc4FE;JDF*)MFF)c2=rc&-]DfK]6Ec:qr
+4`51WDf9N3DJsE/DJsH4ChREkARo@aC5.FsLP:M@L51MKPa.JrPEV/mP`q>pOd)#mP*;#iOctrk
+Ockh*OoCODOnq?FMi<VfMuS\6MuJ\8Mti55Mi<RQrJUZ6pl564!0-u<!0@,>r/C]:pQ,?9r/guB
+rfR5Bs,[/@s,m>Er/puAs,m/@rfd8ErK[DI!L8uLR/WK`R[]e;T:r'\Y->17XfAB"Vus$!WiQ)u
+s/?!sri,prs/H$us/RoVY-5(7ZEpsJ\@K2`^VIe-b0JGdg"Y?@io]Opo_A7Wp%7bAm-F$+o(;\O
+q>1!crVhBJh>]7P]X>5X[^EQOmbcI2\?i<4L7,H_`5/X1UNDB,EbnNsGBHVY:P47LJq8K&:/F_d
+<Drfn!0[>D!0@,=!K;qts!RKg^$3A?Za7$DZa-m@[(E]LXfA@uV5'`WSt)49Q^*f!P*(ifNfF$r
+!/g`3s+p6&ISj!A;cHat='/U/>?kH??XR>PA7]@dBkhF#DJsN8FEMePH@('hJ:W?+L51VCN/is]
+P*D9"R@B_<TV8-VVPpMqXfen6ZaI6O\\#Mg^VRe*`Q-'BbK\>ZdF6Uqf@\d1gYL`Di8N_VjlY^h
+l07L"m-X60n*ol<o(2MGs7QEc!;HKfs7u]kr;6KkrVcBfJcCT,J,~>
+JcC<$MZ<AKrVc`nr;6Njs7uZhs7\ADp%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`Pb298k`#Vp/(`cr_WJfePPftrB($ApcJF:"Ze_,4?P^u3WM2>3r_;?3r_;A4T@JF
+3]fA`r]:KM3B/rU3&iiV3CcU<8H;B^8cDQc:BF?i;>j;k:]!rh:Jh$f!DcPj:B"&h:AR9T;uBVf
+<W?,"<W,tr=8u;#<!ZK)<`iI*<`W5n<;onu<W6&!<W?+n<!$'#<r5nr<Y&22<E3("<E<.#<E<.%
+='#0!#Zb#-<``@)=',9$s&fA)=nPr,>@(]H@qKCeART"T@/aU5@KKtI@f9h/AS,OeB4u!nC2.O"
+D/O92EcQ8DF`__JGBnL]IXm')L5(D;Ll7=WQBmbuOcGBYMMmIVPaIl-S=Q4BT:hpSVPgAmXKf+=
+[C-"@+1AYg]">Vg^:qD!_Sa@3a2uNKcHjkce'umtf%A[1h#?+>hV[8OjlYail0@R#mI'HBnI"jZ
+p%S7WqYL-grVlf%s"")ECh$j\@UNPM?&3oMBOG%H;aj8X>[q,>4\7Io0/k^>5<V.a2)Ilq7n3JH
+$oU.+4?ktl4$6JA<E/oq!E)dWrtG%AO`=l^?sd5I?!UfC>[:WE>[@>5r`K;)='5H's&KV/<`N't
+<E)dl;c6Ih;c!BhnPOd6;c?Xq<``C+>$G6;?=.)L@Us%^BPD3sD/O93EccGJG^=^bIXm!%KSG8=
+MN!RVOckrpR$jG6StMdPUo()jX0&P/ZEpsI\@K5a^;%M$`5Td<b0/&Td*^=le^rI,g=tH?hr*JR
+j5oFckiq?sm-O--n*fc9o()DEo_%nWp&Ojdq#C0iqY^6ir;HTdrdk*+s*t~>
+JcC<$MuWGKrVc`nr;6Nj!;ZTg#5@ibp%@tKrphW1nF,i5m-O''l0.<mjlGI]i8<DIgtLH5f@AC!
+dEg+_bK@oH`PcD=Q\M]5n=S$ur0dJOrL*/DrgNnXr0d\TR$mr@s-F:^Q^<o$Q'Rf)QBmf$Pa.Js
+rKI>FPl6dTP*)#hM26_4JUrH1\@)=C'",'P`5T[6`l,a5`5T^5`l,p;rkoAe`l5s<`l,g7_SsC0
+_8O70pd"nYoVqehrM]gtWW&jpW;rssW<9)sVl9Tm$)ji&Wi;qpVl6ToW!03%X/rA'r2Tgtri?(#
+q5jb%Xf\c*Xo,@!Yl:j*Yl(a,ZEsM:s0D^4rj2X4s0hs:"h;+S]=PWR]`5Yc]Y2(q_8=.4cI:J(
+j5]+ThV?f<g">!2g=b-0f%9cLr7;S7g=k<:h;7)LjlbjnmI0T<q>>gD]Di-3nal>BnaQ&HruCe$
+k1d8DlhCAMj0@1&Y)\s6@A'<c?".*BXK/N'WtJT?>[h&G?<g[N^V7Is]tCnc\;gM;qZ$T_lL!s%
+lKdd#mdT]0jl57Tg"=g&d*9_Sa2Ps4^qRLr^V%1g\%2IE!OfB+[<YVI;c?Xq<`W=*=^,-9?=.)K
+@Uit]B4u$qCi402EcZ>GGBnL^I=Hd!K8#);MN!OUOHPinQ^F53StD^NUo(&hWiWA-Z*UgG\%0,`
+^;%M$`5Td<b0/&TcdC1jeCN7)g=tH>hr*JQj5f=akNM0qlg4!+n*fc9rpg*]o`"Lap@nO\s7u]k
+r;6KkrVcEgJcCT,J,~>
+JcC<$MuWGKrVc`nr;6Nj!;ZTg#5@ibp%@tKrphW1nF,i5m-O''l0.<mjlGI]i8<DIgtLH5f@AC!
+dEg+_bK@oH`PbtrF)ctdn:T&=rGhmXoQ'nO!-J-[rc8!Z!-J*Z!-8$Zs)J<`EcGu9DfGYps)8'Y
+E,TXmDZO]nrb_pYDJjH1BP@BU&nPZgLkg_?L5CY>Pa.JuQB[Strf[JJPEM/orfR5Ds,d;ErfIJL
+OHP]fO-5Wgpd"n=p5As.regc8rJL`9Mi7RnqMY?3s,6l6",i+sNW+k:NW+n8NW+q<O8P"ANK0$Y
+NK3jrrfI&?pQ,H=P*5O$rfRJLP*2#mP*>j/r07AMQ'Rd7Qs5uIR[]e;T:r'[Xfeh/X/i4uWMler
+WiN/"WN)qsW2ZbsWiN2#X/`5&Xfek4ZEpmG\%0,`]tV7u`5]pDdb!:2io]Lmo(MhQp\+7LnF,f6
+nalJLq>1!drVhBJh#B.N]XG;Y[^`cTmbZ@0\[/B4Lk;tHahY'6TlZ$'EGSEqGBHYY:P44KJUi9#
+:JO\c<)`cn!0dDE!K`?@N<"lts!I<b^$!MEZEpmCZa-pB[^EKHY,\J!V5'`WSt)4:Q^*f!P*(ie
+Nr=n;MMV7gs+p6&Gu7I<;cHat<`iL->?kE>?XR;O@qB7bBPM=!DJsN8F*)SLH$XjdIt3-'KnkMB
+N/`m[P*D5uR$sP:T:r!TVPgDnXKJe4Za@0M\\#Mg^VRe*`Q-'BbK\>YdF-Oof%8U/gYL]Ci8N\U
+jQ5OekiqBum-O0/n*olHncA@Srq-<cp\jmeq>^<hqu6NlrUp/@s,$c+~>
+JcC<$MuWGKrVc`nr;6Nj!;ZTg#5@ibp%@tKrphW1nF,i5m-O''l0.<mjlGI]i8<DIgtLH5f@AC!
+dEg+_bK@oH`Pb/68k_uTnPK$Wekl?-niH_2!'L'=rB(-C3]d4$pc8I:3][1#r]C$=!'C0Bs#^3@
+!'C0Bs#:$>2Z>Z83=/5K8P2QH8P)cVr_WVjs%r_mr)!>fq,%)e"\h`d:JO^\62sm]<:X#k<`N1$
+r)Wl!r`&r!r`9)%rDru"r`/bnr)W\r!EN4p;up!"pf.Ar<E8uus&B,$<E8corE'#"r)`l"r)s&'
+s',J+!*T2&"C#2>?Xj"G!+Z":!+>e7s'bt<rF5_9s(2mVBPD-oBkqL#D/O92EH6/CF`mY+EHc\R
+H[UBrL51SBNK93dQ'IPqOH,<ZN/is^Q'n)1SXuIGTV8*TUnt&lY-G=@\@K/[\$rlY]=bhk^VI\&
+`5Ta:aihoQcHstfeC<%"f@em5h;7&Hi8N\VjlbjllKmp+n*ol<oCV_Lp\=R^r;HVsrri1lCLLTL
+?m]2e?AO#MB44tG<(0,Q>\7AA4\7Il0/bX=5!;"_2)7`o7n-!;7/f.V4?ktl4$6MB<E)pr<)ZXk
+OoGaZ^lNGDI:HVi?N+4:>?kE>?!LZ@>?h)0r`Bb6<EN@)<*!!u<)lmp;H-Lk;Z'A];0Yu;;cHat
+<`iL->?kE>?XR;O@qB7bBPM=!DJsN8F*)SLH$XjdIt3-'KnkMBN/`m[P*D5uR$sP:T:r!TVPgDn
+XKJe4Za@0M\\#Mg^VRe*`Q-'BbK\>YdF-Oof%8U/gYL]Ci8N\UjQ5OekiqBum-O0/n*olHncA@S
+rq-<cp\jmeq>^<hqu6NlrUp/@s,$c+~>
+JcC<$MuWGKrr)ior;6Njs7uWg!Vc<eoeH+1o()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1?4f$r3t
+dEg+^bK7iF`PZDER#.K-rLa+_!hZ-Yq4H!)s-`nSrL*VQrL*POs-`SL%\&oWR[Tb8R$a;.R$a5,
+rfmPLQ'VE7s-<kUQ'7JsOd#d/s-5U-PEV,hP*(ldLOao-K7\ic[C3HL[D^)(`l5p:_Sj@1`l#g5
+a2Z-<`Q#m7`Q-!:`l#[1`Poa6_Y-7qW:d+iWqr[qW2KQlri$%!Vl-DhrMTUk!N2gnVu<OoWr/n)
+Wi<"uX/`2#X/rDuXT5O$Xo,=%YPYR(YQ(g-YH[o/s0M[2"LYVE[C6%C!k>ePrO`*B(VRPr]=bhk
+^VIe.bKn_mhr*GMh:p]<gA]b2g=Y$.f%8L)fDX>=f@\a/g=k<:gtpuIj5oFflg=02oChtUrIP!]
+rrDloo)nRTnF6DV*;Jp^g9n'Dq#C!ISCNq.O.)5>TV.l^@U6.<X0)B%%pE1B@UEGJ?!>([^;%@p
+]`,I$s"F3Js6T+>m-<m%m-O30mcrlniSE5?f$_pjb/q]C_nj.&]th@p]=>;Z['d9K[C#M4IS`m>
+;c?[s<``C+>$G6;?XI5N@q9.`BPD6uD/O<4F*)SLG^=^bIXm$&KnbD?Mi<[XP*;/sR$sM8StMgR
+V5L8lXKA\1ZF%'L\[oGe^VI_(`Q$!@bKS8XdF$Fmf%8R.g>(N@i8EVTjQ5OekiqBum-O--n*fc9
+o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCW-J,~>
+JcC<$MuWGKrr)ior;6Njs7uWg!Vc<eoeH+1o()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1?4f$r3t
+dEg+^bK7iF`PYttG'&7dn:T&=s)S-Zs)S-ZolBnMq/ZLV%!6Q3FE;JCF)l>CEcV/!!,qgT$#ag&
+EH#f7DJa:hDuX\aDf'9.DJa-#@q0+]AnV*u*eoH+PEhE!Q'IZ!P`q;qP*D&mPEV/mPEM#iP*(ih
+rfI/C!g/Y-p-A\9q2>60oo&d+"H/4tMi7FjrJL]8Mu&D3NW"n:NW5%<N<5&uNr"h/O8t@>O8tF@
+P5:=?P5UREP5UREPl6mHQ3W\@Q^F/.R@*uAs-a=dStVpVWN*&$X/i2sW<]H(WiE%tWi>ut"KSW+
+XK;E's/n#YYd:^D[CEcZ]Y(to^r"%/`lQHSgYh/Xmd]rCp\=OXp@\+No^h_JpA"L]r;HVGs4dPT
+aLnt\\,WrZ\*r/#`4E7SUkjW(^<+0mH(T,4Bl\#cG]n4);GVrEJc:0':JO\c<)W]m$'UO7OcYT`
+NJrgWrrhl@^$Ef=ZRE2eZa@'H['[$>X/`.qUnaTSS=,e3QB[SrOcYW`N/NROM27%GM26uYM1/8u
+;H$Lo<`W:(=^#$7?!grI@Uiq[B4u!pCi+'/EH?5FGBeF\I=?]uK8#&9M2R=QOHPfmQC+,1SXuLK
+UnsufWiW>+Yd1XE\%0)_]t_A"_o9X:aihoRcdC.heCN7(g=k?<hVd>Oj5f=akNM0qlg4!*mdKW6
+nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*,s*t~>
+JcC<$MuWGKrr)ior;6Njs7uWg!Vc<eoeH+1o()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1?4f$r3t
+dEg+^bK7iF`PY,98kr,WnPK$Wekc?-r&aI1n2pY2s#]p8!'0s<r]C$=!'C*@s#U-@'KnQ?3&rlU
+3B&rX8kDZI8P2iX;,[Bir_EYn;,L.cr_WMgr_NYl;,I6fr_<Gfp-A[Wr`&_os&Snps&SttrDrhu
+#Zk&,<E<+#<E8rr!*9)#!EN;$<rZ8$<WuK&<E3(#rDikupf7;o!*/nss&B&"r`/hrpK.;qs&T2&
+r`K8*>Q.e+>Q.h+=oV\*>ROhB?!q,O@preR@:B+D+Cehh@UinYAS#IcB4kmlBkhC"D/O61EH6,A
+FEDYKGBj+4CNk&LH[ga+N/s'`PE_>tP`_&jP*(liPE_E&S"-(BT:r!SUo(&hWiWA,Z*LaG\@B)\
+]"G_i^;.S&`5]g<aihoQcHjkce'uq!f%A[0gtprHiSieVjlYajlKmp+n*ol;o(;YMq"X[^r;HSr
+rrr1gC0t=Ura5\32Mlj&BOFtD;aj#M?"dSC3^ttg/iGO<5!;%`2)7`o7n-!;7Q3:d4[2(m4$6MC
+<)cdo<)ZXkOoGXV^l<;BJRnad$sd1F>?tH>?!CQ>>?h&/#Zt/0<EN=(<*&uu$rg/';c?Oj;Gg7f
+:f-^[IS`m>;c?[s<``C+>$G6;?XI5N@q9.`BPD6uD/O<4F*)SLG^=^bIXm$&KnbD?Mi<[XP*;/s
+R$sM8StMgRV5L8lXKA\1ZF%'L\[oGe^VI_(`Q$!@bKS8XdF$Fmf%8R.g>(N@i8EVTjQ5OekiqBu
+m-O--n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCW-J,~>
+JcC<$MuWGKrr)ior;6Njs7uZhs7ZNerq/,?oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1abfe,L`l,`3Kq"'jTV8$Orh9:`s.@H*rg3\Rrg<YPrgNbQrgNeRp6kuLrgF.]Q^X2+Q'[i&
+Pl?q/QB[PuQ^*c"QB[SuPa.JtPEV/nQ'IJpOcbfiNfAgJIXd!"Ko!+Bai;B@`Q#j7_Sj7-_ns=1
+_o0Up`W!dX`l#g9rl"iU!lMjkoKiMUq5F@oqPjIlpo":mVPg<hVuEOnVu3ClVuEUpWrB(!WX>`(
+WN3)"WiN2%XRiRlXoP[$YQ1m*Yl(d+Z3IYB[C3KO[f*]7\-0@R]=bfU]bS8p^:h1l^:q@u`5]pD
+d*pV#gYCQ=rS.A+s4RG)$eO%_f\5'4g=k<9gATb<gtpuKjQ>[jm-a?4oC_kSqu)*G]`/62oCVYH
+oC;DMs"a?:jP.)bmJ6eVk+1(jY`P<:@%X*_>[jq?X/iA'XK8@)>[h&H?<paM^q[Xt^:_%f\W-VA
+q>^K\m-a9+m-F$+nF5l2jQ#4TgXk',d*KkWa2Ps4_7mUu^:_(f[^NTO['d=3[!khK;H$Ln<E<1'
+=^#$7?!^lG@U`kZAnYjmCMds-EH6/DGBeF\I=?]tK7nu7M2I7PO-,TiQC+)0S=ZCIUSOccWiN8)
+Yd1UC[^`l[]Y;.t_o9X:aND]NcHstfeCE1'g"P6;hV[8Mj5]7`k32'olKmm)mdKW6nac8Bo`"Lb
+p@n=\q#C0iqY^6ir;HTdrdk*,s*t~>
+JcC<$MuWGKrr)ior;6Njs7uZhs7ZNerq/&=oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1abfe,L`l,`%Cj:)NKS9&Ob(9V5rc7jTpN$.Pp2^.R$$($,E,fi;EcH'tE=[)/DK'T7DK'Q5
+DK'N5Df>Sls)00"DJa6/Dej*!B4>@]@qKD/KpIsgQ'@T!P`q>oPEV/mPEM)nrf[8C$^-U6OcY]f
+P*1rgORtj=MY2l-MZ/P6MZ8V2MZ8V5N;ne9N;\Y7N;JP4N;nn;Nr=t:Nr4n8NrG+<OT(=5OS+b7
+P5CFUP`q;qPa.Q#Q^=#'QBmo*R@'B@R0oCPSXlCIUo(#iX8]*uWX5`+WN)u!Wi;ttri?(#s/lI-
+Y-5).Y7.\B[C3TT]"G_j^VRed`<sW*bL>5)kjJ!5p&=^cq#:'rq"OLUp\=R]r;HVGs4dQ0qo?=X
+\[]2[\$th_d`&i)WhbH=ZbOZ#Xa-R]KkYRC:O%)+9i?XrJq/E&JUi8G:K:=lr_WucP*(lfOH,<Z
+N0!unn'Sf8aKi1ZZa@'F['d?LZ`gL3Wi)_iU7n0LR[KP/P`q;nOH5BZMMmCLLl.%FM2Ce\IS`m>
+;c?Xq<``C+>$G6;?=.)L@Us%^BP;-rD/O93EccGJG^=^bIXm!%KSG8=MN!RVOckrpR$jG6StMdP
+Uo()jX0&P/ZEpsI\@K5a^;%P&`Q$!?b0/&Td*^=le^rI,g>(N@hr*JRj5oFckiq?sm-O--n*fc9
+o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCW-J,~>
+JcC<$MuWGKrr)ior;6Njs7uZhs7ZNerq.u;oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1abfe,L`l,_a8P2ZOn5/mUf22H-rB'O1nN6G*!'1!=s#L$=s#^->!BWFB49%Dd3]fGd4Ztke
+3&`]R3&iiZ8kDlV;,U7h;,C%a:/4S];,R6frD*Pm:Jak`rD3Pk9hk7G!E2tp<W?.p<W#nq<rc;"
+=8u;%='#<#!*8kprE&qur`B)"r)NVpqGmPr!*/ns!*B/#!EE2"<W#nr=8l;%=8c5%='5H'!*K,$
+s&oD,qcX5/>[:W??!Uh:@fKm:@fKs8@fKs<AH-6@BE)ZFC'\TiC2@^(E,]jrEt<D:GBeF\H[9s^
+H$t@'Nfj=)s-3JG>*P;;Pa.Q%R@B_;StD^NUSOccWN*##Xfeh1Z*^pI\%95c^;%M#_o9X9aND]M
+c-Obbe'lgsf@\d3h;7&IiT'"[jlP[hlKmp+n*oi:o(;YMq"adarVc`pWrFO>Qtg#:?XI2I>[<27
+EG/]^<`2=W<F'<J;*%3*2_[-G/Nu<[0K)No8,bsl77Tg,3'BGg5!(l+<Dujq;H-Rl;3Ck_n\'m"
+@Y/1j?N4:V>[(K>?<pc=>[1K9=]ea.<`i@(<``7$<`E'u;c-Il;,C1g:B")\;1;>=;H$Ln<E<1'
+=^#$7?!^lG@U`kZAnYjmCMds-EH6/DGBeF\I=?]tK7nu7M2I7PO-,TiQC+)0S=ZCIUSOccWiN8)
+Yd1UC[^`l[]Y;.t_o9X:aND]NcHstfeCE1'g"P6;hV[8Mj5]7`k32'olKmm)mdKW6nac8Bo`"Lb
+p@n=\q#C0iqY^6ir;HTdrdk*,s*t~>
+JcC<$MuWJLrVc`nr;6Njs7uZh2YZq=p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`Pc8*K9DIhrh97as.KLeT:a8t"dbUCQ^F3>R/NEQRe<*IRfAcXR[KV5rgEbS"IGOD
+Q^@]:#FC[?Q'.DsPl6jJPEl*2s-"dlP*D2pQ'7>nOcklfP)>'EJpr9'KS[^i`l?'<`l?*:_Sj=0
+_o2Pl&B)W/`l,a4_8=+/`5K^7_Sbn0!3#Xkri6!srhoLhs/?'uVl0Nmrh][nrMKUms/6%!WiE-!
+WrAssWr8suXS/drY5bU(Y5YO(Y-7c-s0)I-!3lI-#I(J<ZEggC[J[K5\,Ef?\[oAa]Y+-T"2;I]
+^&G_V^r+.4b0JDaf@ej3gtgfCrnSmUgY1?6g=Y*5gtUZAhr*AKhqm2HiT'(`l0I^'nFQ8Ep\Odb
+rIP!]rs/8ip@e.Mo()bZ*;8d[gU5,lqZ$BST%0:;NLH#=TV7o]@^*#9XKDK'&uf&>@piVL?!4tY
+^V7@p]=PP`NW1-rs8VBMmHs9,lg=-0n*TE$j5SqMf@JL#ccjPQ`PfU.rkAcR]XkV][C!?L[d^[(
+:k)>?;cHat<``F,>$P<=?XI5N@qB4aBPM=!DJsN7F*)SLH$XjdIt3-'KnkMBN/`m[P*D5uR$sP:
+T:r!TVPgDnXfen5Za@0N\\#Mg^VRe*`Q-'BbK\>YdF-Opf%8U/gYL]Ci8N\UjQ>Ufl07L!m-X60
+n*ol<o(2MGp%A@Y!;HHe!r;]hr;6KkrVcBfJcCW-J,~>
+JcC<$MuWJLrVc`nr;6Njs7uZh3VW7@p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`PbkeCj(&QKS5!UK`$JFK)TchEqs_MErC%fFE;JCEH-#=EcQ/>ErL+]EH6*tE<pT(
+EH,o:E,]apE;OSRDAI),Df9N3DJa9.DJs?0C1h!d@q91aC&O8(Q'@Q"Q]mVtP*D/orK7\UPEV,j
+OcPQbOcYZgOcY^q5lcf?MZAY6Mu&>/Mu8J4MuJ\5MZ\ipMi@Okrf$l:!06l7rJpf8!fi>&rfHi7
+qiLZ:!0I/ArK@&As-3JI!1*VN!LB#MQ3!A@rg<\Q#b%6RStDaPV5X?lrMp%#X/i?$WrK."XT,C<
+YHY::Yd(I;YHY=>[^`o[]=ktp_8=.h`XKr2dbEgHnFZGJp\=O_q#U9brq-Khp\=R^rVhBJgA_3J
+a8WV2\@K,Y\*r2%`O`@SUkkGJ^WOHrH_5GDBl\#cG^":);M0RQJ:N3%J:LBk<`;po;,EF=OcYWc
+NK&mUO8gs&cb8;XZ*UgD['R-H[C3KLY-+k+Vl$8aTV%dER@';*PEV/kO,]'TMi3IJMMd4IM=QQ(
+:k)>?;cHat<``F,>$P<=?XI5N@qB4aBPM=!DJsN7F*)SLH$XjdIt3-'KnkMBN/`m[P*D5uR$sP:
+T:r!TVPgDnXfen5Za@0N\\#Mg^VRe*`Q-'BbK\>YdF-Opf%8U/gYL]Ci8N\UjQ>Ufl07L!m-X60
+n*ol<o(2MGp%A@Y!;HHe!r;]hr;6KkrVcBfJcCW-J,~>
+JcC<$MuWJLrVc`nr;6Njs7uZh2>?h<p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`Pb/584H;A;#O2<;#EBP47bN43rhDB49%>D4$#Gbr]1$@rAss?r&Os@3]]8^r]1!>
+"$8P*48_/>49%DD4$<L(s#^EI4?Y\cr\aj=3&s,";#aDl;@$)p:JO\]:f1*f;#X5s:/=Y^:JXha
+:J^LH!*&nss&Str!EN4r<rH)%<``@'r)Ehu<E3)s<<ZE'<``='q,[Ms!*8tsrDr_o"BJN%<)r`p
+!*/tu!*/ns!*B/%s&]5&!EiP(=8c5$=o;A&=^1l/r`f;*s'5Y3@/XO6@fKp?@UikWraH+BA7T7_
+B4krXCAquPC27[(EH;&"s)\`oGBeF\H?j^YG^Y7%Ng'I,?B^V;P*2#lP*(olQC"#.S=Z@HU8+N]
+Vl6SqXKAY/Y-5(8['dEU]tV7t_8F73a2lEHbg+P]daQ^qf%8R.gYLcEi8WeXjlY^gl0@X&mdKZ8
+o(;VKp\=O[rVulrW;esMP\FK4?=.&G?!W;8E+`N]<`;CX=(#`P;*7?,5qk2Q/O)B\0K)Km7n,s<
+77Tg,3'KMh5!(i*<Duiq;?Bco;3Ckdn%"?o@s2Nk?=$oDr`gFL?!U]<>[(E9=]ea.='/L*<E3(#
+<E)st;c-Ilr_`\k!`2`jnkoE`Io0*B<)lt"='8[0>[1TB?X[DRAS#LfC27X'DfKc<FEVkRH@1-j
+J:`E-LP^nINK90aPa.T&R[ftATq\?[Vl?\uY->1;['mKT]=bkm_8=.0a2lEHc-FY_daZguf@em4
+h;-uHiSrnYk2tjkl0@U$mI'H3nF?)?oCV\Jp&F^cp\jjgq>0scqu6NlrUg)?s,-i,~>
+JcC<$N;rPLrVc`nr;6Nj!;ZTg#5@ibp%@tKrph]3nF,f4m-O''l0.<mjl>C[i8<DIgY1?4f@AC!
+dEg+^bK7iF`PZ/,KT)@hTqV@Xs.TIcs.AePrh&5BrLa+Ur0R>KrL!YSopPiKs-WnTRJrWaR@9P3
+R[TS0R@'>+Q^@Z:&<W6BP*M8rQ'[f#Q'7GrP`l$.rf[;D$BL@2OckigMLpD.rlYYk`lQ3?`l5s;
+_T)Sls2=oRs2,;_`l>m7`5T^4_o'L4`:$"kW;rmqW<B6%Wi;rqVt?nfVuEUtVPU,eVu<ImVuEUq
+WiQ,t!NN-tW;iguWiN3!XSAprY5YR$YQ(j,YPtd+Z2_$0Z*L_8[/[Q5[Kj:O\@K/]\\%jRs1SBF
+rk8?E!58BG-,@F<aNMoXeCN7)gYCWBio/nShVI#Bg"P39gu%#JioK1^k2tk+kRQkClg=01nFH5E
+p\F^brdk*]rs/;kp@n=SoCMq\*;8aXgU+rgqu?HRT[;,pNLl>BTV7r_@^*#:XKDK'&uf&>@piVM
+?!5%Z^qRIp]XtbdNW0+Ts8VB`mJlMgmI0K3mcj#ujPo(Of[eU#d*'SR`P]Rl^]2"Q]Xt\^[C!?L
+n$N*kGYq@;;cHdu='/U/>?kH@?X[DRA7]CeBkqO%DK'T:FEVkQH@('hJ:`E-L5:\EN/s'`PEhH$
+R[]k>Tq\?ZVl6VsXfnt7['mHS]"G_k^r"".`lQ9Fbg+P^daQ^sf@\g3gtgiFi8WeXjlYail0@U$
+m-X91nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUp/@s,-i,~>
+JcC<$N;rPLrVc`nr;6Nj!;ZTg#5@ibp%@tKrph]3nF,f4m-O''l0.<mjl>C[i8<DIgY1?4f@AC!
+dEg+^bK7iF`PYegDKL5SK7j&Sqh+Bire'6_rIaue!-7jSrGhmZrGqdV"*&@$EW0tdEH6&>F)u>@
+EcQ/=qf36cEH#i9E,T]8E,T]5Df0K2rbVXQrb_[O&8l?&Df0E+ARo;:QC!o$Q'M?5(mUDNQBRMq
+Pa%>nOckigPEV)kOckifOH9C'mm6r2!/gc6p58j-reg]5rf$f6reg`7r/:Q5oo8p1rJ^f;rf@&?
+o8ip5s,m>ErfR5B!0R,@rKI8Gs-<SLs-NbQrKmGL!L]>SR1bsYSXuLKUSXicW2ZetXKJb0Xo>C$
+WXZ#1Xf\e2ZE^aC['d<MrjN9F]">Vg^V@S#_SjFm`tHJ8c.(P/lga]Dp\4IYqYU3fq#9pco`Osa
+qu20Hg&D0Fa18e\\Mgt,[dN#"`O`=SV2(DE_9'TsH^^sqBle,eG^":);M9XRJ:N3%J:LBj<`E$q
+;,EI>P*(fdNrG$!rsJ,<]u\7![C!9IZMq3U[^39BXfJJ$VPKoYT:VL>Q^3o#P*1rgNJraQMi*=J
+MMR.Hnr!HDGYq@;;cHdu='/U/>?kH@?X[DRA7]CeBkqO%DK'T:FEVkQH@('hJ:`E-L5:\EN/s'`
+PEhH$R[]k>Tq\?ZVl6VsXfnt7['mHS]"G_k^r"".`lQ9Fbg+P^daQ^sf@\g3gtgiFi8WeXjlYai
+l0@U$m-X91nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUp/@s,-i,~>
+JcC<$N;rPLrVc`nr;6Nj!;ZTg#5@ibp%@tKrphW1nF,f4m-O''l0.<mjl>C[i8<DIgY1?4f@AC!
+dEg+^bK7iF`PY/77n?BNn50*[p/(`cj&#\OqE"O9o/ce2"$/M)3rV2D3]fA`48h5?48Lu?3BB/\
+rAk$B4?GY(3qbZ74<ZjM3]K&V2c<ON;,C+e:f("e;Gg:e:JO\]:f1(d:esnarD*Dir_NMimm6VH
+"]SK%<)clr<rZ5$<rH"u<rH%t<<$"s<W?)$<E<2r<WlE%='&H$<VKPl<<-"r<W?,"<<uW*<E<.#
+<E<3"<rZ5&=BAT&=9)Lr=T;P.>?Y37>$Lr1#@1YB?XI2L@K'^<@q9+[ra?RO@:E\WAS,UiC27U$
+Ci+'.DfBZ8F*%>&'QnVDG^4U]H$FRZIt`fAPEhGuPEc'1rfg?DP*2&pQ^XJ;TV8-VV5L8kWiN8)
+YctC<Za@-L\\,Yk_8=+/`lH3DbKS5Vd*^@mf%/I+g=tH@i8N\UjQ>Xhl0@X'n*ol;o(;VKp\4IZ
+qu$Gis"Wi#B4#%Q?XI,G?&<uLB3nbA<('>Z@VB7K4[i100fCg>5!;%_2+^;.7Rp!<7n,HsrBC6C
+$!(&+;c6Ll;c6GSrs\>(M/6X0B3nqO?!^b6>mXb>=^508>$4s/r`Bn8=B8I&<`N*t<Duan;c-Cg
+:f1%d;"@K`:j>i8;c?Xr<``C+>$G6;?XI5N@q9.`BPD6uD/O<4F*)SLG^=^bIXm$&KnbD?Mi<^Y
+P*;/sR$sM8StVmSV5L8lXKA\1ZF%'L\[oGe^VI_(`Q$!@bKS8XdF-Lnf%8R.gYCWAi8EVTjQ5Oe
+kiqBum-O-.n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcEgJcCW-J,~>
+JcC<$N;rPLrr)ior;6Njs7uZhs7ZNerq/)>oCDJBnF,i6mHj3*l07Eok2kX`iS`VLh:pZ:f@JI#
+da?Cdbfe,L`l5i*HAdQVRA$>QUApqcT`:YZT(\fMT),)WT(\fTQN!3PQC!s9R.6RHR[KV3rg<bT
+rg<kTR$X6=QPZ$TQ'@N!Q'@MrP`h8tPa7SuOd(ukP*,a,%$?d;O-,QbOH5QeNm@XJ,Kn0NaiVWD
+`lH*<`Pfa6_83q)_SsF0_o9X8`Pf^3_o'@0_X0ViWMo`onYcGcrhogprhomrV5='ds/5jp#-+Z$
+W2ZerrM]^p!ii<%r2]n#rN-"#riZ4'!jSu6r3-('riuL0rj;^5s0_s;\G`r>]">TP]`,VE^AY_a
+]Y2%n^V[q0b085]e^iC+gtglHjlY^ejPo.VrnSONioK7al0@R"lg4'.naZ,<n*oo>oCV_Mq>:,A
+s1/.7p%J+Rp@\+NrVnYGlJ]4Z_t!^*p#2Ojd^G7,P[^;ZSm>g1Y,ne.WiW;$>?kB??=-uAZG=5h
+^:h1k]=O"%.eiQ7lg=--m-O00md9B)kiCdahqZl9eBuUeb/hT@_SEt%^:q7m\$i]OrjD7&s%n,@
+;H$Ln<E<1'=]ns6?!^lG@U`kZAnYjmCMds-EH6/DGBeF\I=?]tK7nu7M2I7PO-,TiQC+)0S=ZCI
+USOfdWiN8)Yd1UC[^`l[]t_A"_o9X:aihoQcHstfeCE1'g=k?<hVd>Oj5]7`kNM0plg4!*mdKW6
+nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*-s*t~>
+JcC<$N;rPLrr)ior;6Njs7uZhs7ZNerq/)>oCDJBnF,i6mHj3*l07Eok2kX`iS`VLh:pZ:f@JI#
+da?Cdbfe,L`l5huAoMaAItNCNK_pDsK(aijK)1,tK(aicEW'nXF8U(XEsHf-F)c5?EH;%u")r7!
+Er9qWErU+mE,or;E,T]6E,ff8Df0E1D/O6.rb_dSDf,Ji#&A*nDf0?Yrg*\PPa;<6s-3PK'9ncH
+Q'@GpOctrlP*(liPEV/lOoCFDO-#Fi5m3+'MMmDeMYN,/N;\\6MYW20N:i/5NfB!WNVnh,O8b4E
+OcY]gP*>a)!0[>Ds,mGIPa)-3rg*PMr0RMOR/NBMR7E^8SXuIIUSOcbW2Q\rXKJb4Za$a<Xf\Y)
+XKJe6Za@-L\%&rY]=bkm^:q:o^;%J#_o'I6aNDZKc-b/!jQc4,p@n@Xqu-Kn#lOMmp\+=Vqu20H
+g&D*Aa8EJ+\@8s8hU06PZ)NV9QF4TN_5DXLWf:e7D,>J$F\PbfJqAQ)It<-#:/=Yb<)QRiLQ[d^
+O,f8"NK=)elHR#L`NlqZ['d3H['mBJZ)t..Wi;kjTqS*LS!fV/QBRJpOcYQ]regu<M2I1HM2Ce\
+s%n,@;H$Ln<E<1'=]ns6?!^lG@U`kZAnYjmCMds-EH6/DGBeF\I=?]tK7nu7M2I7PO-,TiQC+)0
+S=ZCIUSOfdWiN8)Yd1UC[^`l[]t_A"_o9X:aihoQcHstfeCE1'g=k?<hVd>Oj5]7`kNM0plg4!*
+mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*-s*t~>
+JcC<$N;rPLrr)ior;6Njs7uZhs7ZNerq.u;oCDJBnF,i6mHj3*l07Eok2kX`iS`VLh:pZ:f@JI#
+da?Cdbfe,L`l5h`84cNNktq(Np/(T_r)!)ar&Xj>s#U$=oK)t5#<Y%/3]fA`481f848q8B3BB5!
+3W;&B4$5Sc48q;=3rhDA3tjY;4?Yee<)Zap;Gg:f;,L.d;,[Bjs%i\kr_<Mk;,R6fpeU9Cq,RGo
+s&8qs!``9%rDiks"B/9!<E/rtr`&\no2biiq,IZ#<E3!t<E3)q<W#nq<W,qu<W6##<E<0!=8c8$
+=o2>#=oMP'>5_Y+>$Lu2!F9%1?iOL>@:E\UAS,OcA,TjI@:Eb[BkhBuCi+'-DfKi?rGqs\rcJ<e
+G^4W6HO+qFI=d34OHYn+PUr,fR@BY3Q'@T#R$sS<Tq\?ZVPgDnX/rJ-Z*LaD[^WfY]=u%r_Sa@4
+a2uL'bU1T\d*pLqf@\d1gtgiFiT'%]kNM0qm-a?3nac;Dp%J+Rq>:*grM0AtjG[bZ?X@)Hra$S$
+HuWb)=B%^V8loP;@8K'T;*?Wm1bLsT4>8WbrC7&]77Tg,2`Ue#s#U<T<E3#r;ZKXVrse>&LMUF$
+AR8_M?<pcAra#P.*EZNK>?Y03='/O*<`iF)<`N.!;cQan<)ZXk:f1*h;"@K`:jl2=;c?Xq<``C+
+=^,-:?=.)L@Us%^BP;-rD/O93EccGJG^=^bIXm!%KSG8=MN!RVOckrpR$jG6StMdPUo1/kX0&P/
+ZEpsI\@K5b^VI_(`Q$!@bKS5Vd*^=le^rI-g>(N@i8EVTj5oFdkiq?tm-O--n*fc9o()DErq-?d
+p\4[^s7u]kr;6KkrVcBfJcCZ.J,~>
+JcC<$N;rPLrr)ior;6Njs7uZhs7ZNerq/#<oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bK@oH`PfW)I?fVnRf8uXU&:S`T)bJ-TD"QNQi*6ARJrZSR/<<OQm.laQ^=,+P*D8tPa%Gt
+Pa.JuPa%AqQ'IMuPa%>qP`_&iP5^X^OcYZcONu+qcHOJTbfn5OaiDE@`Poj9`W!de_8*t,`ko^5
+`Poa5_SjC0_WjGcWVrdnVu!@lVuN[uVl6PlVuEOiVZ!CnW2]`o!3,srrMfdr!i`6$q5jUu#Hk22
+Y-5%5YPtd'YPtd+YmdqEZaI0I[^W`U\[oHQ]`Gj\qn*!D]Y4<Ys1\TK^&G_f^V[q/air,[eCN:*
+h;I;Qk3D3pk2k[bj5T(YkNV:!rpC'\nFH5Fp\=ITrq$Efp\4IZr;M9I\Glg*o_/%Rp%@tUs"*m1
+ijH/1o`+s`hON3H^Q+YF@\B?b?"1(AXKJY)X/i4'>[(TB?X6j@^q[V_]`PjY]8cgoo_/+Hn*g8C
++n+phmHWp!j5].UgtLE1dEg%[aMu08^qmh$^:V"d[^ELA[ICPP:Jakb;H$Op<`W:)=^#'8?!grI
+@Uit\B4u$qCi402EH?5FGBnL^I=Hd!K8#);MN!OUOHPinQ^F84StD^OUo(&hWi`G.Z*UgG\@K5a
+^;%M$`5Td<b0/&Td*^:ke^rF+g=tH>hr*JRj5f@bkNV6rlg4$,n*fc9o()DPo`+Uap&Ojdq#C0i
+qY^6ir;HTdrdk*-s*t~>
+JcC<$N;rPLrr)ior;6Njs7uZhs7ZNerq/#<oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bK@oH`PfVtBlnEPIf=usK_pB%K$ArJEpn#IErU4ZErL.ZFT-7[Er'b]E,or<EcGu9ErC"X
+E"[/0EH#l8DJsH2E,TZ4Df9K/D>eANC]SFArg3qWQBml(QBda7PQ?u4rg!JI#*P+4PE_2nrf[;D
+"H\b.O,rQl!/gc6pknj)s,?o7rJLB.s,?T0s,?o9rf6u=r/gi;q2kT=!L&]COU.&2OckomQ'R^7
+QN3EOQi<BPQi<BNQN3EPR7<X7S=Q:GUSFZ`W2Zf!Y-5+:['Hp?Y-5%3YHY@A[^WcW\[oDd^r"%-
+_ns1'^qde'`5Ta;bK\>Ydam11j6,e!o_81YrV?Hsqtg'`qu20Hg&D*;`r<OK\hLY'\*r5&`OiCS
+Lkh;)`6#fkH(q@-C3"2gG^+@+;M9XRJ:`9%J:LBj:K1:k;,E&IOoCC@N<#!"s!R$S]XGM[[C*BL
+ZaI0JZa-g;XfJM$VPBo\T:MF<R$O#$P*;#iNK*pq#)\7pMMR+Gnqqll:f("e;cHat<``F,>$P<<
+?XI5N@qB4aBPM=!DJsN7F*)SLH$XjdIt3-'KnkMBN/`m[P*D5uR%'V;T:r$UVPgDnXfen5Za@0N
+\\#Mg^VRe*`Q-'BbK\>ZdF-Opf@S^0gYL]Ci8N_VjQ>Ufl07L!m-X60n*ol<o(2nRs7QEc!;HKf
+s7u]kr;6KkrVcBfJcCZ.J,~>
+JcC<$N;rPLrr)ior;6Njs7uZhs7ZNerq/#<oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bK@oH`PfV^7nHBL:ARfe;#jGj;#jG;;?&`U3qbZ/3r;#<3WM8>3r_;?3r_;A3WM8?3r_2B
+3]T5]r]1<H4?GYe4$#GcrB($Ar&Xm@rDWbqrDEVmqbRJo;Gg:f:f%'c!`2`krD<>dl9YAKs&9%u
+;GmEl!E<(r<<#nq<<#ts<;T\d<WH.t<<#l!<)lmsqc3Ysr)NSoqc3Sqs&B&"r`&r!rE&r"s&fe5
+<`W=)=]ed/=]ed0>5MP&>l@tF?XR8M@q9(\B4b^b@UW\S@:E_YC2.R$rb`BfE-$/GGBS+NFEVkQ
+H$O^`I=?YEIpmq`MN!OUP*;,qQ'Rc*StVmPT:;:;R@9Y<U8+N\VPpJpXKJb2ZEppH\@K5a^:qG#
+_o9X9ai_iPc-FY_e'uq"g"P6;hVd>Nj5oIglKdd&mI'H4nac>FpA"I\r;HQkUAlUrKk4Ut?=.)H
+?!`J<EG&T[<(02J>%_SY:HD$D6npVV/j;E]0f;Q%8,l$d77Ka+2`Nra5!(hur`&qrrDN\nOoH*\
+["`@'?X@&G?X@#C?<piA>?kA2>8^UH>$"j/<E3+&=&i4"<Dumr;,^@i;,C+er_W/_ISWd:;,U=l
+<E<.%=]np5>[:]D@:E_XAS5[kCM[m,EH-&AG'A4XI!pKpJqJc4M2I7OO-#NhQ'[l-S=Z@HUSOcb
+WN*)'Yd(OA[^`l[]Y;.s_SjF6aND]NcHsteeCE1&g"P3:h;@/Lj5]4_k3)!nlKdg(mdKW6nac8B
+s7H?as7QHerqQNhs8)Zjrqu`no_sFAMuS;~>
+JcC<$N;rSMrVc`nr;6Njs7uZh2u!%>p%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfW+Kp[_$SarGuTDt2KQ2m9NR.csJR/WKRRf8]\QC4,-R?j5,R/WEYPa@`&Pa7W&
+P*>m0"I54:PEc$0!KrTDP5garOHPWdOHPdNccjSWbg"AWbfn8Qb/qcH`Q-!;`5KO2`5TR1`59F1
+_8F4j`<*oq`99JhW2Z\mrMKUmqPaFls/>jn!iDfjqPO4hpo"1lr2Kq$WMur"XSo1!WrT7!XT5O%
+YPtd(YPtd+YmdtG['d<N\@T;a]Y(rU^APYD^AkkD^&G_Z]tV7u`5g!CcdU@nf@o$<jQ5RjrTsOK
+''niKmI0Q8o(2JFo_%tSqYL$`rV-NkqYU3iJcE4Zs7ZHd!qu<ZrVnYIm,PI[`:a01o@gA"S$nAf
+P[gAZSm>g0YH4n.WiN2!>$P9>?=-uAXhhcd^V7Cp]Xs1'#kmr]m-aB1mI'uC(%(8Kk2YI[hV?c9
+eC)^fbK.]B_SO%e^]1qG[fNnDrjD7&HV[I7;,U=k<)lt#=BSg3>[:ZC?t*VVAS5[jCMRd)E,fr@
+Fa&(VH[U?nJqJc3Ll%%KO-#NgQ'Rf+S"6.EU84W`WN*&%YHY@?[^WfY]Y2(q_SjF6aN;WLcHjnd
+e'ut#f\5*8h;@/LioB+]k3(smlKdg'mdKW6nc&([oCW%T!VZ9dq#C0iqY^6ir;HTerdk*-s*t~>
+JcC<$N;rSMrVc`nr;6Njs7uZh2u!%>p%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfVtD09rUJc:;pK[#/KEW1"JEVOSREr^=]Erg6#rc&0]EH#o:E,fgqE<L6#EcZ0t
+E!:6#EGof7rGDUPrGMXR'PqZ&Ci!s*Q^O2+R$X2,R$X/*Q'VE7&!N9CP`q>qPa%GrPE_5nPQ$^D
+Oog`.Om#(3Mi@Ihpl#02r/:Q3pP]'1mu@=,rf?o;s,[2ArfR,?s,d;EqiLlArfI2Drf[DJQ'V33
+rg<\O!LT;SQi39`R@9Y9SY)RLUnsreWN*)(Yd+27s0_j4/[Vjk[^`o[]=bei]tV>"`5KR2_84"*
+_o'F4aNDcRdF6Xuh;I;Sl0\$6p\Oj`rr`5sqtu$Ff`++p`4<Ij]=YY`\+8M,`O`CTLkh>.a2u&h
+KqigKCJSkFG^+@+;M0UQJ:`9&J:LBj:K17j;,Mt.OckfdNrG$!rs@i4]t1VY['d9Krj3QNZEg^:
+XK/A"VPBr\T:VO>R$O#$P*1ogNr=k?MMR.ILl$uZML/,q:f1+h;cHat='/U/>?kH??XR>QA7]Ce
+BkqL$DK'T:FEMePH@('hJ:`E-L5:\EN/s'`PEhH$R[]k>Tq\?ZVl?\tXfnt8['mHS]"G_k^r"%/
+a2lBGbg+P^daQ^sf@\g3gtglGiSrnYjlYail0@U$m-a?2nF?MK!V>s_o`=d\rV6Egs8)Zjrqu`n
+p&9OBMuS;~>
+JcC<$N;rSMrVc`nr;6Njs7uZh2YZq=p%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfV]7nQKNrD<AgqbmGkr)2$Ar]:$?rAsU5pH&.4!BN=>3rV2E3]T5_4$*@&r&Fd=
+3Vtl948q;@4T7GA49.JB<!lQ';cH[p<)QUk;>sAn:Jamc;?'Jm:B+,h;>j>i:Zt+E<<#kq;$'Wo
+;u0Jn;u]f";cH^r<W5tp<<-(q=8Gqt<W,ns;Z]ou<W#hq<W6#!<VTVp<<-(u<W,ts<=)W)<``C)
+='/R-r`K2$"'8T,=oMP'=TV].=oDP(>Q.n-?2e10?NjhIA7K._rFQ(AAGp+hBPVC"Ci4-/DfBc?
+G'A+PFEMbOG^4R\I"$QqJUrH,Ll%"JNf]EgQC!u-SY2dTV5']SR[T_:TVJ<[VPpJoXKA\1ZEppH
+\%0)_]tV>"_o9X9ai_iPcHstfeCE+$g"bE?i8N\VjQ>^mmI'K6o(2MGp%J.UqYL-grr)fqrhBEG
+eU_:=?X@)I?X7!!Ir]4/>#e!Z9O):I?VNXU2`WT@1bLsR4>A`c84Q0>7R]d9r\tBN5!D%j8QAbk
+<)Q[o;c/\W$g=pNCgLXU?<poE>l@t.>RXnC>?P06=BSd/=B8K$<t/,/<)QXo:fC4g:Jjqcr_W/_
+HV[I7;,U=k<)lt#=BSg3>[:ZC?t*VVAS5[jCMRd)E,fr@Fa&(VH[U?nJqJc3Ll%%KO-#NgQ'Rf+
+S"6.EU84W`WN*&%YHY@?[^WfY]Y2(q_SjF6aN;WLcHjnde'ut#f\5*8h;@/LioB+]k3(smlKdg'
+mdKW6nc&([oCW%T!VZ9dq#C0iqY^6ir;HTerdk*-s*t~>
+JcC<$NW8YMrVc`nr;6Nj!;ZTg#5@ibp%@tKrphZ2nF,i5m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]Q,MOKI'T(/K!TDXuJQN*<NR/!*IQj/tGR[KS2RJiKQQN!3OPaMH9!LK)MPS0:G
+PEM/nP`h2oPE_;tOcbfhPl?aMP)tgOd*0\Yci22oaj&&RbKS0/ao]]*_u@[U_@XN"`kfR/^qdh(
+_8O:2`PfXU5lmm\rh]Xl!2odo$`Br$Vl6PlVl$>hVZ*FgVZ*LfW;ERrX/`6"X8o=#WrB%!XSf1#
+Y4\suYl1g,[/RH<[^WcY]Y(qkr4W0Er4Md;(V[Z"_84%/aN;ZPdF?^tf\>9@jQGgqn,DnXnI"jY
+oC_eNp\=LVp\sseq?Zolq"ad`qu$GEs0hq-rVlKipB(-`p&4n?q!@(JZc2Y<s7*:qgm5=.@[(Ds
+T:]Cu?EUB4XK/D%W*3G1?s[2G>FrY/^]2"K]Xs.&.eW?#n*o`4mdT`7lK@<jj5](Sgt:<0da67^
+ai;<:_8*k#]t:nc\$`TNm^.F=:f("e;c?Xq<`W=*=^,-:?=.)L@Us%^BP;-rD/O93EccGJG^=^b
+IXm!%KSG8=Mi<[WOckuqR$jG6StMdPUo1/kX0&S0ZEpsI\@T>d^VI_(`Q$!@bKS8Wd*^=lf%8R.
+g>(N@i8EVTjQ5OekiqBum-O--n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*.s*t~>
+JcC<$NW8YMrVc`nr;6Nj!;ZTg#5@ibp%@tKrphW1nF,i5m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]PuDK^2Vre'fqc@Z+;rGhgWrc&$\EH-$oEV=DWF)lADF)l="E<'qVDuaeREW'h`
+EH6#;DfBW6Df0OnDZt)sD/O3/rbMjXCi,T.Q^4#,rg4mpR$X/*Q^3o&QBd\tPa%GrPED&pP*;&k
+OckliP*(ojOc\]k!K2j7M>iD2MZAY6MuSb6MuAP-MZA_3NW"h6NVeb9O8=t<O8"b9OT:RBOo(:J
+PE_;sQ'Rc'QBqH8qj@DOrg3\Rrg<_S&tPVcT:r$UV5C,gW2m#'ZEpsJrj`WN\%0,^]=bkl^V@Lt
+^q[_&_Yq:h_Sa=1`Q$!Ac-Xqif\,!6hr3Y[m-jN=p\XparrE%Ls473/h86e8]">Ve\@;+keAf,,
+WeZ@s]?/4.KS?@GN+u.+:j@5.:/Xl>Jq/H'Jq/AH:JXqf;Gg;;rfR2@s,@#=O8fCGbK7?([/IE3
+Zl-3UZELC2XK&4rUnaWUSt)49Q^*euOcb`crJLl:Ll.%FM2Ce\ISWd:;,U=k<)lt"=BSd2>[:ZC
+?t*SUAS,UhC27[(DfKf>Fa&(VH[U?nJV/W1LP^qJNfT<cQ'Rf*S"-(CTqeE]W2co#YHY==[C3TV
+]Y2(q_Sa@4aN;WLcHaeae'ut#f\5'7h;7)JioB+]k3(smlKdg'mI'H3nF?)?!V>s_o`Fj]p\ssf
+q>^<hqu6NlrUg)?s,?u.~>
+JcC<$NW8YMrVc`nr;6Nj!;ZTg#5@ibp%@tKrphW1nF,i5m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]P\84cNNr_`&\ekuHD"?\b-3]d7%r]9[5p,W493rV2A3]m1!#!4k-4$#Daq`=R6
+rAjs@4SCi=<)lmrr)<\q<;ohr;Z9Pn:^Koo:f:.f:f1(cr_<Ghr_`Vjs%hcC!E)eo:]aKm;uKZ&
+;cH[o<)cdp<)lrs<;TYq<rQ2!=Su5!<rl?%r_s)#<)lt#<`T,ur`/\nr)NMm!*B(urE'#$!EiP(
+=8uA(='/T%=TDS&=TDY)>6%q->le8>qd9A3%qB-]B4tsmB4bahBk_<uD>nGPDuXeWF8U,kF`qtQ
+G^4XaIt<3)Knb><M2I4OOHPioQ^O>6U8=feVPBcUSXl@HUnsufWN*&%Y->1;['mEQ\\,\m_Sa:1
+`lH3Ebg"G[dF6Uqf%8R/h;@/KioK7dlg=02o(;SJq"jjar;N)`0?SWO?!glE?XR2HO+MFd?<U>t
+6VUj%CgB:i:c1?i-o<P>4ZkJX1e:/-7Rom:7fGCH4p!f.7fHEc;ZK[WruL:-KPG42?=%#H?!UcA
+?!U]@>Zk68>?Y04>$+j,rE'#"$WU/*;H-Ll;,C%d:]4,\;1;;;:f1+h;cHat<`iL->?kH??XR>P
+A7]@dBPM="DJsN8FEMePH@('hJ:W?+L51VDN/is]P*M?#R@B_<TV8-VVl6VrXfnt7ZaI6O]"G_k
+^r"".`lQ9Fbg+M\dF6Urf@\g2gtgiFi8WeXjlYail0@U$m-X60n*ol<ncA@Srq-?dp\4[^s7u]k
+r;6KkrVcBfJcC]/J,~>
+JcC<$NW8YMrr)ior;6Njs7uZhs7ZNerq/#<oCDJBnF,i6mHj3)l07Eok2bR^iS`VLh:pZ9f@JI#
+dF$:cbfe,L`l5j3D2b-HU%"`,TD5)VQ1UC@R/<<OQiNKPR/`QSR/WK]R$O,*R$O&'QC!o&rK[PN
+Pa7O4PV85`OckumP`h8pP*1rlP*D,mOckjOc-F\[cHOMXbKS/Rb08&Pb/qfJaMu3:`Pqhp%`QB&
+`507*^r!q(_Sa71j?WsHV5:&dVuEXnVuN^pVu<LmV>-qfVZ`rtWN)usVuWgnWrB'uXT#4%X/`2#
+r2ft%rNH7(ric:)s0;U1$+.+K[^WfY]=biV^AkkK^;%CrrOi$@!5AHG-GI:3_SjF7bKJ/VdaHXq
+f%Jj9j6#OimIU#Eq"OU[qYU3fqYU0drqc`lqYg3nqYU0frV_<I[Jp=*q=jm^!r2N_rVml4mGtOY
+a7fQ5nZK@VQ`lU@Q"6V]T3Yo4Y,nh.ri6F*>?kWF?=-uBQb^E9^B;3b]Xs.&.eW?#nF5l7nF5o7
+l0%3ijPetOgY1<0da67]aiDB<_8*q%^Uq+e[^`]Pm^.F<:Jakb;H$Lo<`W:)=^#'8?!grI@Uit\
+B4u!pCi402EH?5FGBnL^I=Hd!K8#);MN!OUOHPinQ^F84StD^OUo(&hX0&P/Z*UjH\@K5a^;%M$
+`5Td<b0/&Td*^:ke^rF+g=tH?hr*JRj5oFckiq?sm-O--n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6i
+r;HTdrdk*.s*t~>
+JcC<$NW8YMrr)ior;6Njs7uZhs7ZNerq/#<oCDJBnF,i6mHj3)l07Eok2bR^iS`VLh:pZ9f@JI#
+dF$:cbfe,L`l5j3?Z1:5JFJ6;KDfijEVskWEW:%[EH:hor,MdWrc8$[!-8'[#]ap*E,fi9Df>Vo
+rGhjV!c`-trc&TjDf9W6E,T]6DJj<0DJsE1D/O4iR2)0XR$X/,QC!o(Q'[f'QBml'Q'@JqrK@PP
+Q'@GrP*(oiP5LFBPiP+3MM[2hMZ/P6MZ8V7N;SV4MYi>3MZ8V7N;8J4N;nn9N;SY:NfT8#O8t@@
+OSY%9OSb.CP*(oiP5^XOPa.Q$QBml(QBqH8qj@ANs-WbQ#b.?TT:qsQUS[ses/,ptXKVW/#dq4T
+]Y1tk^:sQ]s2"ZLs1\TM_>_:i_o0O5`lH3EcI(.mg"Y?>i8Wh\lgF<9pA+Z<s31KFg:k21rk(8'
+\[_Cqf#YV4WeZ=s]?/4+KSljOJST7C:jI8.9iFi>Jq8N(Jq/AH:KCFm;Gg;8P*(ogNfT3[NfX2f
+jibTR[^<KN[^EKL[Bd*CY-"b*W2HMgUS4<OS=,b3QB[SrP)t]_regu<Ll.%FM2Ce\ISN[8:f1+h
+;cQk!='8[0>[1QA?X[DRAS#LfBkqO&DfKc<FEVkRH@1-jJ:`E-LP^nINK90aPa.T&S"-(BTqeE\
+Vl?`!Y->1;[C3TU]=bkm_8=.0a2lEHc-F\`daZh!f@em4h;7&IiT&t[k2tmll0@X%mI'H3nF?)?
+!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s,?u.~>
+JcC<$NW8YMrr)ior;6Njs7uZhs7ZNerq/#<oCDJBnF,i6mHj3)l07Eok2bR^iS`VLh:pZ9f@JI#
+dF$:cbfe,L`l5j37S66F:?b[?;=79Z497N)r&ap>o/lb/s#U3Ar]Bm9s#UHH4$,Jb3]]A#3WhB%
+3BI."rAk$B4?G\'48r.X;uKZ);cH[p;cH[n:f("c:f%'c!`)Whr_W\m:]=)h:]=5k:]X?gj?`]A
+!)rkrrDW_qr_ihs<W,nn<Vfbr<W6##='/Q'<WZ6!;uT`"<``=%<)ifrr)Wht!`iB'r)N_ss&B)#
+=8l8"<W6#'=&rC)=B8K%=8Z1q=oV\'>QnD>?=.)Ir*BJ4@:<[FAH?IYr+Z7KD>S5NDuXbYEH6,B
+rcMXmGBeC[I!pKqJqSi5LPUhGN/`m]Pa@c*S"?=LW2ZYjUS4<QTqeH]Vl?\sXKJe4ZF%$J\%0,b
+^r!t,`lH-Ab08,Ud*^=le^iC+gYC]EiT'"^l0Rm0o_/%Sq>1!erg!Kc^j'<prEoS4*FFt^G%k;e
+<CK8M?#4:]5X&(&2(pjE/j;E\0fCie8H2-^77Ka+3W2,L4$5r3<E<$s;,gFjOoGdNYCpY#@U<AJ
+?X<Y9+C/5W?!LT<>Zt94>?P'1<``@)='&F&<)ZUm;,U:g;H!Ehnkjj2:Jakb;H$Lo<`W:)=^#'8
+?!grI@Uit\B4u!pCi402EH?5FGBnL^I=Hd!K8#);MN!OUOHPinQ^F84StD^OUo(&hX0&P/Z*UjH
+\@K5a^;%M$`5Td<b0/&Td*^:ke^rF+g=tH?hr*JRj5oFckiq?sm-O--n*fc9o'uhQo`"Lbp@n=\
+q#C0iqY^6ir;HTdrdk*.s*t~>
+JcC<$NW8\NrVc`nr;6Njs7uZhs7ZNerq/#<oCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX0D2P6QRdZpJTDtSUTDP;]TD>/QU&Uk_Q1U@DQ^F0;RJiL(Q^F,-R@'>-R[0>,
+R$Nu%QBRW"Q'R]#Pa@VuQ'7DoPED&mP`h5oP*)#lPPpXWbg+GWc-+>XcHOMWc-+;Tb0/$.b6#f+
+b5TK^a8a*[`50Ck_Z.FU^r*t(_8>.srMKUns/5mo"K/2sVl0*_#cFW"WiE%tW2TZor2Tas!N`@$
+XS]"!X/rE$Xo#7'YHY::rid3DZEppF[C3QS]=bei]tV7r^:q@s^;%D]]_fDB^AkkS^;7\)`Q63G
+bg"M_rm`">f\50=jQ>^onb)\Rr;HWnrVQKgqYU0fr;6?frqZTj!rMooJcE(V!r;Wdrq?Hgp\b%A
+qX3LNZH2e?s7!/'gSUs/Q]kmPTV,P"?EUB4X/i>&W*3G8?sd8H>F`LErkAQL^V.7=s"46DnaZ,=
+mdKZ7md03$k2bU]h:p]:f@86rc-+5L`PfX0_nWpu]"#5Y['d9Ln$IO>:f("e;c?Xq<``C+>$G6;
+?=.)L@q9.`BPD6tD/O<4F*)SLG^=^bIt3-'KnbD?MiEdZP*;/tR$sM8T:r!TV5L;mXKA_3Za@0M
+\[oGf^VRe*`Q-'BbK\>YdF-Opf%8U/gYL]Ci8N\UjQ>Ufl07L!m-X60n*ol<o(2nRs7QEc!;HHe
+!r;]hr;6KkrVcBfJcC]/J,~>
+JcC<$NW8\NrVc`nr;6Njs7uZhs7ZNerq/#<oCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX0?u::7IIDjfKE$VrKDU>fKE$T+E,fmsErU.PErC"XEWC+UEWgB&EH?4#EZ&t=
+EcH,=DJsK2E,T]9E,]`9E,T`7E,T`7rbr-]E,]`4Df'B/rbhb)rgEeR&Xo,SQ^F/+QC*r'Q^3u)
+QBdg7Pm!;8PED+/PQ-dHOd#a+iBdF"s,6i5!fN"rnr*O*!/pi8qMkK5s,Hr8r/Cl?O,oB`OS=h6
+OSk7>P5gXHP*;)org!MLrg*VPrg*YQQhm*JR/iWRR08tJS=ZDQU(X5tVP^8hW2Zi!Yd(L@\%BAh
+^\ttK^])%K_>_4n^VR_%_Sa:0`Poj;a3)TOdad"'g>(TDioK:fmIBiBq"oXBbl9cT]tCth]">Sc
+s7GF*ahY<dLPD81bK@>INMq8PBQ.caH$=I+;br$tJUr?'J:LBj<`Dsp;,MV%Ocke'NfX2HjiP3I
+[^EQP[C6(As0<iQY,n\'Vl$>eU7n3OS=,e3QB[VsPEClaNJiaQLl$tEMM^k\ISWd:;,U=k<)lt#
+=BSg3>[:ZC?t*VVAS5[jCMRd)E,fr@G'A1WH[UBoJqJc3Ll%%LO-#NgQ'[l,S"61FU84W`WN*&%
+Yd(OA[^WfY]Y;.s_SjF6aND]NcHjndeCE.%g"P3:h;@/LioB+^k3)!nlKdg(mdKW6nac8Bs7H?a
+s7QHerV-HiqYL-erqu`no_sFAN;nD~>
+JcC<$NW8\NrVc`nr;6Njs7uZhs7ZNerq/#<oCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX077^!D:$GRC;<^pV48qA249%GA48M#<3rh>@48Co?3BK8_48q8H4$#Da3]]8^
+3;GT73rD)>;uBPn;uK\q;[ZQ';cH[n;G^1e:f.*dr_WVl!)WVis%r_m!)VW?rDW_qs&8qq"]JB"
+;c?Zi<<6-%qH!Vq!*/qtq,@T!<*!(#<E)rp<W6&!<<6-%r`/eq#ZXo,=&r@'='#9$"'/K*=Su5#
+=oMP!=oV\*>Q7t->l\4.?NXVA?=*V=#\%:SAS,UkCi'&frG;LNCMn'0E,ou?FEM_LGB\:XH[C-i
+JqJc3LPL\BMMmFSP*D9"R@Bb>USXldVP^2bU8"H\Vl?\sXKJb2ZF%$J\@K5a^;.S'`lH3EbKS8X
+dF-Opf%/L,gYCZDioB.al0Ig.o(;YMq"t$grfmFB\8bqb?=.#G?sfRjK6V*=>?+*Z:0qdR><kDK
+2)HsF1G1jS4>A`M84c<@7n#m:3''8f5<_.k7fHBk<)ZRl;GiSV*9=2RBO5.S?XI,E?!LZ@>?kH=
+>[(E8=]ed,=BPQ('3J::=&i7";cHXl;c-Fj;,C(d;"7D3:Jakb;H$Ln<E<1'=^#$7?!^lG@Uiq[
+B4u!pCMds.EH?5FGBeF\I=Hd!K8#&9M2R@SOHPfmQ^F52SY)UMUnsugWiW>,Z*UgG\%0)_^;%M$
+`5Td<b0/&TcdC1je^i@*g=tH>hr*JQj5f@bkNV6rlg4$,n*fc9o()DPo`+Uap&Ojcp]C9fqY^6i
+r;HTdrdk*.s*t~>
+JcC<$NW8\NrVc`nr;6Njs7uZh2u!%>p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfW&E/19QRHU=@TDYAYU&LeaU%4rXU\L,OQN*6JQN*<OR/`QSR/NHPQiWVArg3eU
+QC"!;QN*3VQBdZ"QBd]"Q';02s-!PMOcYe+OT:IAPQ-dIPEO5ibl>rfbSeRJc-OYYbg";Sbfe/O
+bK7oLaiMTC_oK[6rko)Z`59=-_nj.,ha.:>rhoamr29.`s/,psWN,rrs/H("q5XFp"K\Z*XK2<"
+s/Z.#riQ.%s/l=(!3c@*!j]/=rj2g9\%'#]rk/<GqS**G^V0WZr4W*DrkB_p_oBa>bKS5Vd*pOs
+f@\a0h;I;QkN_L,pA+Xbr;?Hfq>:$crqlipqYU9gs8)lqrVhBJZi:.&q=aU^p\b%Gr9rdOZH2h@
+s6m%tgSU9qQBG[LT:fG!?EUB4X/i>&W*<M9?sd8H>-brZ^V@S!^V5X+./39%o();=nF,f3l0%0g
+j5AbHgY(-,da67_aiDB>_8=.+^:q.g[^bY1!)NSjG>_@<<)lt"=BSd2>[1TB?t!MTAS,UhC27[(
+DfKf>Fa&(VH[U?nJV/W1LP^qJNfT<dQ'Rf*S"6.DTqnN_W2co#YHY==[C<]X]Y2(q_Sa@4aN;WL
+cHjnce'ut#f\5*8h;7)JioB+]k3(smlKdg'mI0N5nc&([oCW%T!VZ9dq#C0iqY^6ir;QZerdk*.
+s*t~>
+JcC<$NW8\NrVc`nr;6Njs7uZh2u!%>p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfVq?u17:If"ccK_pDmK`$JlK`5rjEURrIEVjbVF8g1\F)h2""*8I&F8^(dE,T]6
+DK'T7E,fi8qeud[E,T]6Df0FkDuOVUD46piR3e2eR$j>.Q^F&)Q^3o%Q^3u)QBdc"P*M2pPEV5p
+P`q5nPEM&lha.'qm#1n&qi(T9pl5<6rJgi;p5f*4!g/S+r/pl>%$Qp?Q'R]#QC!r*R@4#@!13PL
+r0dPQ#b7HWT:r!SUSRmds/-7'WN3/'YHbFB\\,ZU_#D(L^;'T]s1]bn_84"+_o0O6a2lBHd*gFo
+f\,$8hVdDTkN_F'nalGKqYc!FcMp,X]=bbf]">Pbs7GF)b/1ThL5283bf[DIM5Yi@B5hZ_G^+F,
+;br$tJUr?'It19i<`Dsp;,E%2P*(fdNfB'ZrrqH'_n*:crO+#ZZa@'EYHFt-WMcShUnXQUSt)4:
+Q^3i!P*;#hNK&jSMMR(FM=6<%:]=17;H$Ln<E<.&=]ns6>[CcF@:EbYAnYjmCMds-EH6/DGBeF\
+I=?]tK7nu7M2R=QO-,WkQC+)0SXuLJUnsufWiN8*Yd1UC\%0)_]t_A"_o9X:aihoRcdC.heCN7(
+g=tE=hVd>Oj5f=akNM0qlg4!*n*fc9rpg*]o`"Lap@nO\s7u]kr;6Kkrr)KgJcC]/J,~>
+JcC<$NW8\NrVc`nr;6Njs7uZh2u!%>p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfV\7n?3F9^#C@;=%*Z;>`NS4RbH34T.A@3WM8?3rD)83r_8C3]fFu3WqH&3B0"s
+3W;)>48r1Z;u0Al;uBSs;cH^pr_`eo;,R<hs%`Sir_WVls%r\js%i\mha.0=r_iYm!*&\mr)Nf!
+qGmVu<W#hr<<-"t<<?-#<qfVl<WcE(<E/rtr)Wbts&K,$r`9#"!*K5'r`B,%s&]5&qH<`"#?tG=
+?=.#E?Mn10@/aU7@M30]A7fLiCi+$*Chmd%Ci+'-DuO`hF*)MHF`qtRH$XgcItE<+KnbA=M2I4M
+N/j!`Pa.T%R%'_DVl6SnW2?DgVPgAlX/rG+Yd1UB[^WfZ]Y;1t_o9[<bKS5Wd*gCnf%/I*g"Y<=
+hr<_[l0@^*nalDGp@nCZqu$HmQ2_&jE+!'[?X<Y<2P-(aGA:Sm<^];N?Z0db5X&"&0ePCA/Nu<[
+0fCgY84H'=77B[*3^5em5!(l!<E2st<)HUmOT,^KWIS\n?s[5K?<ge8>RatD?!LT=>?G!1=B8U-
+rDs>,='/F%<Dujr;,dHkr_W&\!)NSjG>_@<<)lt"=BSd2>[1TB?t!MTAS,UhC27[(DfKf>Fa&(V
+H[U?nJV/W1LP^qJNfT<dQ'Rf*S"6.DTqnN_W2co#YHY==[C<]X]Y2(q_Sa@4aN;WLcHjnce'ut#
+f\5*8h;7)JioB+]k3(smlKdg'mI0N5nc&([oCW%T!VZ9dq#C0iqY^6ir;QZerdk*.s*t~>
+JcC<$NrSbNrVc`nr;6Nj!;ZTg#5@ibp%@tKrphZ2nF,f4m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]Q&EegHURH1%8U%>#NU]7+iPkUIAQMd$HQN*9PR$mo?rL"msR$a;/R@'D/Q^F,*
+QBd]#Q'IZ%Q'@Q"Q'IStPE_;nP)te(OTpl0OckmSbl5lrc-+>Rb07uPbKA)Pc2PodbQH&4aij\*
+&]Vr4`Q#m7`Pfa7_SX.,_8!eA62me]VYm@gV?!IkVZ*LnW;ih%W2ZbsWi2kqql9Xrs/Z:(XK2?#
+"08N)Xo5@#XT5O&XT5O'YQ(j,ZN.B3[0O1O]=bhj^:s?Vs1\KGs1JBFrP&<I*5]Y6aNMfPc-Xkg
+f%8R-gYCWCioB1clgF<:q>(!c!r;]irVZZls7uorr;HQlrdk*Us8Viqp\=O_p\b%2rUB!RZH2kA
+s7!+ugol]qQ'%i7TV#J!?a$Q6X8]1,WEWV:?s[2G>-e.Cs1ncP^V5X+/bei,nal;>nF,i3kiUsc
+io&YHf\"d(dEp+^aiDB=_SO4-]tV%h[^WZP['d=2[!kbG:f("e;c?[s<``F,>$P<<?XI5N@qB4a
+BPM=!DJsN7F*)SLH$XjdIt3-(L51VCN/`m\P*D5uR@B_<T:r$UVPgGpXfen5ZaI6O\\#Mg^V[n-
+`lQ9EbK\>ZdF6Uqf@\d1gtgiEi8N_VjlYail07O#m-X60n*ol<ncA@Srq-?dp\4[^s7u]kr;6Kk
+rVcBfJcC`0J,~>
+JcC<$NrSbNrVc`nr;6Nj!;ZTg#5@ibp%@tKrphZ2nF,f4m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]Pp@r?^?Ien]8K_o]gEW'n\F)l;BF80eUEVa_UF!PaGEcZ8BEcZ8AF)l8?E,T`7
+DfB]8E,fo<EH#i7E,fc7Df9UoDZO]nrb__*r0mYRrg3nVR@'>.QC.Z;s-EhRQ^*p:Q4]CJQ'@Pt
+P*D/pQ'7DpPEM#ih*Lpqonrg-rJUQ3rJ^f;pPo35!KE-=NW5%:NrY:?O8P(BP*(lgOSt=>Oopo4
+PEc!2rg3SNs-WnTQi3<OQN3ENRK&]aS"61ETq\<WV5:)eVZ*MWWiN5'Y-5.<[(*`]^:h7o^;%Fu
+_8*k&_8*n(_Sa:0`5Ta9a2lKNeCN7)g=kE@hr3VXkj.X(nF?,Cq>PsFci4*n]Y(iT]DoGas7G@%
+bJLZiL5284cHN_KMQ;;DB5_X6G^+C+;c&*urdb`7J:LBj<`Dpo;,E%2OckffO,]0[s"NHR_n3Cf
+[^NTO['R-FZ*1:2Wi;nnUnaWVTUqX?R?s2&PEM/mO,]*UMi3FLM2I/ZMLJ;r:f("e;c?[s<``F,
+>$P<<?XI5N@qB4aBPM=!DJsN7F*)SLH$XjdIt3-(L51VCN/`m\P*D5uR@B_<T:r$UVPgGpXfen5
+ZaI6O\\#Mg^V[n-`lQ9EbK\>ZdF6Uqf@\d1gtgiEi8N_VjlYail07O#m-X60n*ol<ncA@Srq-?d
+p\4[^s7u]kr;6KkrVcBfJcC`0J,~>
+JcC<$NrSbNrVc`nr;6Nj!;ZTg#5@ibp%@tKrphZ2nF,f4m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]P[77U!E:?b[?;=dW^;#iZS48_5348qA>48q8C4$#Gar&aa9s#U3Ar&ad:"$&>#
+3W;#;3WD,?<W#er;u';m;c6To;u]hs;u]bp:^^&q:JO\\:/F__;,R9g!DcPJ62jg^;Z'Gn<;TYq
+<;fhs<WZ?)=8c2"<W?,"<Vohp<<60%qGdSt<E8osqc3SqrE&u!r`B&#rE9&#s&]5&s&oA(s&f>(
+rE0S5>?kK@?XI,G?XI2J?iFI4@K0dD@q9+[ASGppCM[bbC]85ODZt-$EcZ>FrcTB-G^4U]I"$^%
+Knb>;M2@+IMiEaXOcbilPa7`.U8FmgWA:EMW2Z_qX/i>)Yd(L@[^WfY]Y2%q_o9[<b08,Ud*g@k
+eCE.&g"bE@i8Wh]l0Rm/oD\Ccp@n@Yqu6SZrs#<:?t!AK?2e1ZSrnSHCL^UM6pjdYE,JiE5Z9Qq
+/iGLM5!;"_2)Iip7Rfm:7RfC!5Q3kH3s\JZ<E)su;H-PUrs@Y_IqN7u?=.)GrETA."^>59>$G2/
+=T_],=]kZ)$<C50<)lps<)ZUlrD<Vm;,HaZISN[8:f1+h;cQk!='8[0>[1QA?X[DRAS#LfC27X'
+DfKc<FEVkRH@1-jJ:`H/LP^nINK93bPa.T'S"-(BTqeE\VlHf"Y->1;[C3TU]=bkm_Sa@4aN;TJ
+c-F\`e'uq"f\,!6h;7&IiT&t[k3(sml0I^&mI'H3nF?)?!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?
+s,I&/~>
+JcC<$NrSbNrVc`nrVQWks7uZhs7ZNerq/2AoCDJBnF,i6mHj3*l07Eok2bR_iS`VLh:pZ9f@JI#
+dF$:cbfe,L`l5j3ATs$'R@'\@TV:eHr1X.bs.ShSq4mh_s/#^Zpm(lFq3CoE!13SM)OHhZR$j>0
+R@';+R$O,,Q^3u(QBRZ!Q'RYurfn@ePa%AsPED#lOcY`eOHPdVd*^(^bg+DUbP]QacMl&fb8&:G
+bKS,Qbfe,MbfRuHaiMQB_oBU4rPAWP_nk(n!2odms/>pprMKUks/#gnVYm=rWN)u!X/`3!W;`dp
+WrK.!X9,N*XSo1$XKAW(XT,=&XKAZ(XoGO,YHY::Zi7?9[^`o\]Y=9Xr4r<Hs1\KGrk&6ErOsSn
+_Sa@5air#Td*gCnf@\d2gYL`EioB4dlg=67p\=OZq>0sbrVl^%rVZQiqYU0frVc_Hs0DY*r;$<d
+!Vc<cruCq(kcV53q#CB`XL-c\Mi3j,US+9O?".-CXKJW'X:_F8>[h)I?X6j@_8*k'_8*h"MuPC&
+nac5Ao'c,<mHNfrjQ,:Vh;$]9f$r*nbfe,J`PfX0`PT@&]=YP][C*BL[ICPQ:/=\_;,U=k<)lt#
+=BSg3>[:ZC?t*VVAS5[jCM[j*E,fr@G'A4XI!pKpJqJc3Ll%%LO-#NgQ'[l,S"?7GU84ZaWN*&%
+Yd(OA[^WfZ]Y;.s_SjF6aND]NcHjndeCE.%g"P3:h;@/Lj5]4_k32'olKmm)mdKW6nac8Bs7H?a
+s7QHerqQNhs8)Zjrqu`no_sFANW4M~>
+JcC<$NrSbNrVc`nrVQWks7uZhs7ZNerq/&=oCDJBnF,i6mHj3*l07Eok2bR_iS`VLh:pZ9f@JI#
+dF$:cbfe,L`l5j3=Cc>rH[bgDk_/tiiIq5bqJcISrc8!Z!ci@'pMp7RrGqpX(is_=EcZ;BEH-#=
+EcZ8@EcH);Ec5l8Df5Po&oqr1DfK]6E,]`6E,KQ3Dk*8drg<bTr0dPO!1NnSs-F1^Q^3u'Q^=#'
+QC!o'Q2['QP`h8oPEPp/!g8b1gHkaps,?f4s,-c5s,?r8s,?u;!07#;rJ^]7rJpl:s,R&=qN(]>
+rfI/CrK6r>!0dDH!gT(;qj75J"IYXDR$di=!goCDrgF4aS=Q7ETV8-UUnspeVuEV1WiN5'Y->4<
+[C<]Y]Y(ql^;.Lu^qmhb_$7co_o0O5`r=!qaNMlVe(3.)gtprHio9%\k3)!pmI0W>qLS[mrrUEW
+^&>Q&]".k3j42;g[BG@AR_@%l[tBO=I;3G79RD#/F\Pe1K7\Z*JqAN':/=ni;,U7fLQdj`OH>N_
+NfO,EiPr^G[^`cSrjDd5s0*BEXK8G"VPg2`TV7sKS!]V0Q'7ApP`_#dNW+k9M?8WlM"$:O:/=\_
+;,U=k<)lt#=BSg3>[:ZC?t*VVAS5[jCM[j*E,fr@G'A4XI!pKpJqJc3Ll%%LO-#NgQ'[l,S"?7G
+U84ZaWN*&%Yd(OA[^WfZ]Y;.s_SjF6aND]NcHjndeCE.%g"P3:h;@/Lj5]4_k32'olKmm)mdKW6
+nac8Bs7H?as7QHerqQNhs8)Zjrqu`no_sFANW4M~>
+JcC<$NrSbNrVc`nrVQWks7uZhs7ZNerq/&=oCDJBnF,i6mHj3*l07Eok2bR_iS`VLh:pZ9f@JI#
+dF$:cbfe,L`l5j377TjA:/C:UiDBSOnPT9Hq`F^<mQ:G0"Znb,3]fG#3rM/;3W_B(3rM/>3Xn/3
+3]T5\3&rrX3B:&;q,@>mrDEVor_ibps&92$<)Zaq;GmBh$VsSq:JOY\:/=\`;>j>G5laj^;ZB_q
+;ZKer<W?%s<W#qt<WcE(<E9$!s&B/#<E</u<<?3&<r5nr<WZ?'<r>to<r?%t<rZ8"=Sl8"=T;G'
+=BYQ(!*T5%"'So6?Mn.F?sd>M?t!GN@:<VS@q9+]AS5[jC23``s(q[P$u^*)EcZ;EF`qtQG^9:7%
+"*MTJq\o6Ll%"IN/dgqs,@>GOcu#rS"ZXTVuEV9WMlhsX/rD*YHY=>[^WfX]Y(qn_SsO7aihlPc
+dC5@e.:*]f\>6?i8`q_lL"-5p@nR]s7u]k!rW#rPQ(`SC0k<I?RoMk?D*C2F_YAh=%,MQ?u^-h5
+<i(*0eP=54[)"k0f:dZ7n,s<77Ka,3C!L,!]rM;r)Eer<)ShX&`0C6B45(P?!prC>[:T??!CV6>
+6n>6>$>'2=]ei+<tSG6<`E(!;cH[m;c-Cg;,C+dn54[1:Jakb;H$Ln<E<1'=^#$7?!^lG@Uiq[B
+4u!pCi+'/EH?5FGBnL^I=Hd!K8#&9M2R@SOHPfmQ^F52StD^NUo(&hWiW>,Z*UgG\%0,`^;%M$`
+5Td<b0/&TcdC1je^i@*g=tH>hr*JRj5f@bkiq?sm-O--n*fc9o()DPo`+Uap&Ojdq#C0iqY^6ir
+;HTdrdk*/s*t~>
+JcC<$NrSbNrr)ior;6Njs7uZhs7ZNerq/&=oCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX0@sa5rS!a/JoUu/VoqDG]q4d_\qP<k^s/,g]rKQc9s-EYNq3VJVR$j>/R@'8*
+R/<0`Q]mVuQ'7MuPE_;sQ'@MqPE_8lOoCFOO4DY)dEp7cc-+>Ubfg"0!6tMe!Qr[dbQ#d%c,n/R
+bKS)OaiVWD`lH!8`5BI._Sj:C5mjKeVl6PlVl$AjVYm:hVZ3P"W2ZesX/`2!Wr8pqWrB'mX8oC%
+XT,@$X9#H+r2gO5YHY@?[C*HP]Y(qk^VRe(rk\WMs1eTLrP/BH#/.ab]tD%mrkBku_o0R9b0A2V
+d*gIqf\+s4gtgoJj5fCflg=67pA"FYq>1!cr;HQkq>16krVhBJZMt1-q"XUYq"OL[ruCk&kcV22
+q#CB`X0^W^N/O!-U7e0N?"%'BXKAQ&X:_F8>ZtNA?X6mA_8*n(_8*h"MuPC&nac8Bo'l2=mHNfr
+k2bOYgtUN5e^DjjbK@oF`PfX1`PT@%]XkV^[^<EL[ICPP:/=Y^:f1.i<)lt"=BSd2>[1TB?t!MT
+AS,UhC27[(DfKf>Fa&(VH[U?nJV/W1Ll%%KNfT?eQ'Rf*S"6.DU84W`W2cr$YHY=>[^WfY]Y2(q
+_Sa@4aN;WLcHjnde'ut#f\5*8h;@/LioB+]k3(smlKdg(mdKW6nac8No*+dZp%J+RrV6Egs8)Zj
+rqucoo_sFANW4M~>
+JcC<$NrSbNrr)ior;6Njs7uZhs7ZNerq/)>oCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX0=_D_qIXZnGKD^E%KD'uoL$s]dL&Zo,E;jeTDuanVEr'kJEXHf-EcZ8AF)l5>
+Er0hiEc5l8E,KW5DK'Q7EH#l7DfBZ5rGMaTSt#_J!LoPWR0K+JR$jA0RJiKTR?s8+rg*bQQC!o(
+r0I>IrfdAF"-Je3P1W&'MMmCON;JP5MYN,0N;nk;Nr=t9N;\b6NrG%<Nr>%5O9Ui1Ocb`fOo1CB
+P5ppJPl[2;rg3_SR/NBMQiNKPR/NBNQr9?@R[]e:StD[LU8+N\VPg>jWMlerX0&P.Yd1UD[^`r^
+]tM.o^VIV"_83n%^qmn*_o0O5`lH0Bb08/Ye(*+)gtprHio9"ZjlYajlg=68q18Rms"F5j]tM%h
+]=YV`s754#aM50eLPM>4d*K4SM5u,@B5UCgGBe7);GVpsJUrE)J:IPo%9-2&;,E%3OckffO,]-Z
+s!ZgF_Rd1b\$i]O[C!9EYcb+/Wi2bkUS=HTSt2=<R$O#$P*;,mNfK+uMZeonM2I,YMLJ;r:Jakb
+;c?Xq<`W=*=^,-9?=.)K@Us%^BP;-rD/O93EccGJG^=^bIXm!%KSG;>Mi<[WP*;/sR$jG7StMgR
+V5L8lXKA\1ZF%'L\[oGe^VI_(`Q$!@bKS8XdF-Lnf%8R.gYCWBi8N\UjQ5OekiqBum-X60n*ol<
+o)J:bo_%nNp@nO\s7u]kr;6Kkrr)KgJcC`0J,~>
+JcC<$NrSbNrr)ior;6Njs7uZhs7ZNerq/)>oCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX077g'C:/OmV;UJ>B4?NL&rB'm=p,i::q`Fg="Znb,3]]A!3rM/<3WM8@3rM/<
+3r_5=3!!#Yr_rVl!)r\kr_reqs&/tu;H!Ehr_NJf"A_ik;,Gn2#?"K!<)cdp<;ont<;onr=8Q#&
+=&i7$<`N0!;up!"qGmPrqc3Ys!EE1s<<-(u<=;i/='/O*<`W:&=',<%!*T;'!*B,$s&]5&!*T/#
+s&fJ,>$>-9rE]J2ra6CJ?smDN@:<VT@UiqZAnYjlBkhD^C]A3%DJsE2E,fl<FEM_LGBS1UH@($f
+IXcp#KS>/9M2I7ONf8pVNK90aPa@o7V>R:lWW/tVXKAV-Yd1UB[^`l[]Y2%q`5]g<b0/#ScdC1j
+e^`:(g>(QCj5fFgm-jN<p\=R[qYL*dr;HVYs#Tt?Bjb:T>[LlG?Cm71F_P8e=%5SR@<6En5<i%)
+0J5455!;%k0f1^X84?!;77Tg-3&s/c5!(l"<;feu;H$JTrtO:dI:Zen?=$uE>[1Q>?!UZ?>[(J2
+=Vt4B='&C'<E3(#<)lps<)QRk;,C(e:/OjW;1;89:Jakb;c?Xq<`W=*=^,-9?=.)K@Us%^BP;-r
+D/O93EccGJG^=^bIXm!%KSG;>Mi<[WP*;/sR$jG7StMgRV5L8lXKA\1ZF%'L\[oGe^VI_(`Q$!@
+bKS8XdF-Lnf%8R.gYCWBi8N\UjQ5OekiqBum-X60n*ol<o)J:bo_%nNp@nO\s7u]kr;6Kkrr)Kg
+JcC`0J,~>
+JcC<$NrSeOrVc`nr;6Njs7uZh3;<.?p%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+_bK@oH`P]R.Apff#U7;(Sq4R\[pS.MZ!2TOfqkX(br20Cir2BU[r06Z8!g]1>qj7AMrKo=-
+R$O,*R$F&)QC+#*QBmc$Q'IZ#Q^!\tPa.MsQ'7;kPE:lhe'ZUmda?Fgc-FVXbPfWfbKA)Sbl5`j
+bK7lLair#OaSs9jaN)?B`l5m:`5BI._SP_-nj<%9r20RoWW&dnV>d@kVuNaoWrK'pWr9!oXT,@$
+XSo:"Y5PL%Xqe1GZaI6M\@TAf^VI\&_Sa:0_o'@.qnW6Hs1\BF/&9!;_o0L6aihrRcHt%jf@\d1
+gtprIjQ>[jl0Id-o_/%Sq>0sbqu$Ekr;?HkquH\Hs02M.r:p![p\+=Rr;Rc3mcU^Wao28>nuK1S
+[uH<3?)+-eS7Q05Y-"e+ri?I+>$P6=?=-uBZGQUWs1eZM^5W(Drq>mQo(2GCnaGr3k2tdciSNAE
+f@SO"d*0_UaMu6<_Sa@0^:_.i\$rfP['T5.In`[6:f("e;c?[s<``F,>$P<<?XI5N@qB4aBPM=!
+DJsN8F*)SLH$XjdIt<6*L51VCN/is]P*D6!R@B_<TV8-VVl6VrXfen6ZaI6O\\,Vj^r"".`lQ9F
+bg+M\dF6Urf@\g2gtgiFi8WeXjlYail0@U$m-X60nF?&>ncA@Srq-?dp\4[^s7u]kr;6KkrVcEg
+JcC`0J,~>
+JcC<$NrSeOrVc`nr;6Njs7uZh3qr@Ap%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+_bK@oH`P]R.>%i&$Jpr<'o7R!pnqHmmpP&6os+gVnqeuLRs)J!Xr,_IMrG`0bF)l8@EH6#=
+EH1tus)A-[EH#mrEW0k^E,fl9E,TT2E;jb_SXZ.?S=>t9R@9TDRK&]ZR@'A0R@*r>s-4@cQ'[i&
+Pa.N"Q'@Q"QBd]#P`q5lP*5<#nj<%9r/:T6rJLZ7r/1]:Mi3OQo8WX-rf%8FO,o<]O,oBaO,s4#
+s,m;Bs,m>Erf[>Hrg!kUQC!u,R$a>1RJN<KQN<D=rL!VQ$_!QTS=Q:FTq\<XV>dA.W2ZbrX0&P.
+Z*L[B[C3ZZ]Y2"m^V@S__'d%7^qmq,`5T^8a2uKIcdC4mf\,!5h;7&JioB+]k3(smlKn!2q#5jE
+dJlK'`P&pr]">P`\,Z$ZeB#A2YD.h&_U6cAK8HUaC1_BXH$FRU<DnL&Jq8K)Jq/>G:JXqe;Gg8F
+P*(ohO,f3ZNrK:>`kf6o\,E`^[C!9EYcb(-X/MnmUnOKSSsu4;R$O#%P*D2nO,f3YMi3IJM26uW
+MLS>q:Jakb;H$Lo<`W:)=^#'8?!grI@Uit\B4u$qCi402EcZ>GGBnL^I=Hg#KSG8=MN!RVOckro
+R$jG6StMdPUo1/kX0&P/ZEpsI\@K8c^VI_(`Q$!@bKS8Wd*^=lf%8R.g>(N@i8EVTjQ5OekiqBu
+m-O--n*ol;o'uhQo`"Lbp@n=\q#C0iqY^6ir;HTerdk*/s*t~>
+JcC<$NrSeOrVc`nr;6Njs7uZh3qr@Ap%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+_bK@oH`P]R.77TpB:/=_amo%P1r]C0BrAsm=r&jF0!BN=A3WM893rM,@3]m=%s#^0?rB's=
+r](*]<)cjsrDWPl!)r\k!E2nq;u]hs;Zfop:f.'c!DZGi:'+3f;=HmB6M<_D;Z]p!<r5ns<rQ2"
+<VTVp<<H3#<`\oo!EN1t<W?%l<W6)"=T;D(=&rC(r`BJ0=BAU+=BJ^.=oMS-=]ed/=o;D#=T_i3
+>@%26ra5P1s'Yq;A,KjFAnPdlC27U$Ci+'-rbi![EH6)AFa!_-*dN'ZIt3-'KnY89Ll%"JNK0']
+OH5HaOHG`nS=l^Vri,prs/H%!1T[a`Z*LaF\%0)^]Y;5!`Q#s?bKS5WdF-Oof%8R.gYLcIjlkpm
+mdTi@p\=OZqYU3hrfR3^mYtiX?T;:r?=.$/O+MLf?s-Q"6r7E9EF(jp;EHQa1b(^R4ZkV[8Ou??
+77K^97Q3:e5!;(l4A8[P<E)rs;NUnagS9..@:3AJ?N".U>@(T?>?tE;>$5!1=]ed-<`W:&=&i7"
+<)ljr;Gg:f;,U7f:JgOXIn`[6:f("e;c?[s<``F,>$P<<?XI5N@qB4aBPM=!DJsN8F*)SLH$Xjd
+It<6*L51VCN/is]P*D6!R@B_<TV8-VVl6VrXfen6ZaI6O\\,Vj^r"".`lQ9Fbg+M\dF6Urf@\g2
+gtgiFi8WeXjlYail0@U$m-X60nF?&>ncA@Srq-?dp\4[^s7u]kr;6KkrVcEgJcC`0J,~>
+JcC<$O8nkOrVc`nr;6Nj!;ZTg#5@ibp%@tKrph`4nF,f4m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.B7ZD-X.H$aTE:g[T_bAYUACY`V#@+iV#$qeVZ!FkW;NXlWrK-tQ2Hm9Pl[2;
+rKmSNq3VbZR$j>-QC*u%Q^*o'Q^=#%Qi<6TQB[PsPEM,pr0.02!n,WJrmLho%F3;Ed*9hYbK\5R
+c-"3.aoBTbb6#o2bl5ZnbK7iJaMl0<`lH$:a2Ggn6.SC&Vu<IoV5C-eVuN[qWVWRhWr9!rXT#7$
+WiQ-#!j/Q+rN?1&rN6^9Z*UgH\[oDc]tV>"_8F40rP\oX_o'@.rkS]R_8!b^^_al+`5T^9aN;WM
+cHjqgf%Aa4gtq#Mjll^0%dNELo(;YMq"ad_qu$?hrr)lps8)orrVc_Hs02M.rV?0]p\"7Qr;R]0
+mH1OVdJj1Go;oIY\W2Q5?D=0eSRl65XfhT'&ZJu>>$tZD?!FVO_SO((^V@LAs"=9Co()GEo();=
+m-3]qjlGCVgtLB4da?Fcb/q]E`59C/`PT@%]t(V\\$WQL[d^YR9hnJ\:f1+h;cHat='/U/>?kH?
+?XR>QA7]CeBkqO%DK'T:FEVkRH@1-jJ:`E-L5:\FNK90aPa.T&R[ftATq\?[Vl?\uY->1;['mKT
+]=bkm_8=.0a2lEHc-F\`daZh!f\,!6h;7&IiT&t[k2tmll0I^&mI'H3nF?)?!V>s_o`Fj]p\ssf
+q>^<hqu6NlrUg)?s,R,0~>
+JcC<$O8nkOrVc`nr;6Nj!;ZTg#5@ibp%@tKrphc5nF,f4m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.>\nP*LOk&/o7Qsoo7[1!q1\TuoS<I&rG_XPs)7sXqf2[XpMpCVEcQ/?r,MaW
+)K9_<EcH)>EGol:EcH,?EGol:E,fo:DfBW5rG_aSs.0:^St5kNs-jFbR[KY5R[BM4R$a;/rKd_U
+Q^=#)QC%T8"dYF<QBd[4Pm!>:Q'7@06.SBuMu&D4MuSb-NV&8/Nrb9%qN)GQOH>TeP*2#nQ'IZ$
+Q^F2.R@9P4RerNPR/30JR/`QiR[fq>StD[LUSFW^Vl6SoWiN2'Yd(M5ZOF4K\@T>c]tV4q^VIY`
+_'[%8_Sa=2`lH0Bb08/ZeCW@+g=tE=hVmJSjQ>Xilg!g&mI9cDrdk*ss!m?P^q@:j]=GG\s7#$t
+aM,'bKnlA>daPd\MlV\MAT(7fGBe:2;1sRRJc:9$J.PIO:K11h;,E"1PEM#gNfK*Zrrq/s^pph^
+rjETO['R*EYHFt-Wi)_iUnXKRSXZ%8Q^@W6"-JY)NW"b;Ll$tEn;;]i:/=\_;,U=k<)lt#=BSg3
+>[:ZC?t*VVAS5[jCM[j*E,fr@G'A4XI!pKpJqJc3Ll%(MO-#NhQ'[l,S=Z@HU84ZaWN*)'Yd(OA
+[^`l[]Y;.s_SjF6aND]NcHsteeCE1'g"P6;hV[8Mj5]7`k32'olg4!*mdKW6nac5OoCW%T!quB_
+rqQNhs8)Zjrqu`no_sFANrOV~>
+JcC<$O8nkOrVc`nr;6Nj!;ZTg#5@ibp%@tKrphc5nF,f4m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.6q9d@:/=_`rDEAgb>J:$!^&P+r&Xg=q`O7-r]1*@3]m-ur&Y'C4$#Da48h5<
+49%>F3E9'Y<E9#trDN_r<W#er;ts8j;Z]os<;of#;Gg:f:JO[a:]F/k:JO^b6.S@&;u'Gm<WuT,
+<`N.#rE&ks"'&<$<qfSp<*&iq!E2tq<W5tt<<-)!=8uD&=8u;$=8Q,!<ruK,>5VP&=T)A1=BAU,
+=]ed/>$G6;ra5\2"(,GD?iFFN@UinYAS#@^A7]CdBkhF!Ci+$,D/O<4EH;&")K^.IG^4R\H[UBq
+K7nu6LPUeEMi<XVOHGZirK@JNR%0kGVl?ZoW&(HSXKJb2ZF%$J\@K8b]tM4t_o0U<bg+S_daZds
+f%A^2h;I>TkNM0smdTf=p@nCZr;M`V6/mT0?s[2F?!L]BRu`,ABO=nC77:$bF`UqU5Z9d"/MnqA
+5!1qc2+^>077Ka87Rf9q3BfSi4?Q;:;cQgs;GpGTrs78NH=gVo?=.(=>mXb??!LW<>[(H:r`K>,
+=]ef(<Y/20<Dumr<)QRj:f1+g;,C*Y;1D;8:Jakb;H$Ln<E<1'=^#$7?!^lG@Uiq[B4u!pCi+'/
+EH?5FGBnL^I=Hd!K8#&9M2[FTOHPinQ^F53StD^NUo(&hWi`G.Z*UgG\@K5a^;%M$`5Td<b0/&T
+d*^:ke^rI,g>(N@hr*JRj5oFckiq?tm-O--n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*0
+s*t~>
+JcC<$O8nkOrVc`nrVQWks7uWg!Vc<eofVm<o()>?n*f]3m-O'&l0.9ljQ#:Zi8<AHgY1<3f$r0r
+dEg+^bK7iF`PTI+B82k4X.u>\T:hjNTV8(OUAC\cV>[:jVZ<UnVu<RmWW&piWrfAdPl$aEPjak>
+QC!u)qj@DM/=;]hQ'Rf*Q'RW"Q^*l'QC!r&Pa.Q"Q'7DpP*D/oP*;*Ye^N'tdFH[mdaJ-B%+!5D
+c-4;RbKJ,PaiaV,!m/U-rlYAeaij\*s2t\fai;?A`5TU3d6[r4Vl$?eVZ<^lW;ijmWr8t)XK/A%
+X/rD'WiH'"s/l4%s/c=)YPta;ZaI6O]">Vg^;.V&_o0L4`W!jX`Ph\ls2+fR!lDdirkeZQ!65#Y
+*m)RKc-F\cf%A[2hVmJTkN_F%n*]Z4nauMKp\FX]rqcfqqu$Bir;chJs/uA-rr)Zfp\4CSo_e^m
+p?^qDZL%Sj'D8N=hlMirQ<p;ZT:KP%Y-"k.Xo>C0WEWV2@:!8G>I)/`rk\TJN;kR0p%%\Go^_SB
+n*K9$k2kX]h;$`:f@&'nbf\&I`PfX2_o9I+]Y(eb[C<NNZa@.1[!teF:JXe`;,^Cm<E<.&=]ns6
+?!^lG@U`kZAnYmnCMds.EH6/DGBeF\I=?]tK8#&9M2R=QOHPfmQC+,1SXuOLUnsugWiW>+Z*UgG
+\%0)_^;%M$`5Td<b0/&TcdC1je^i@*g=tH>hr*JRj5f@bkNV6rlg4$,n*fc9o(!%Wo^qhLp@e7[
+q#C0iqY^6ir;HTdrdk*0s*t~>
+JcC<$O8nkOrVc`nrVQWks7uWg!Vc<eoeZ73o()>?n*f]3m-O'&l0.9ljQ#:Zi8<AHgY1<3f$r0r
+dEg+^bK7iF`PTI+?#=b-KnKAVo7QsoqM"g$reLB*pkSHsq/H:NrbqjWrc/![oPstOEr9qWE#We9
+EH#o<F)Z,;EH6#<EcH,?E,]f:E,fi9Df>Vorbi.8T:MRES"?.>S=KSJs-iqT"IPXGR$mr?rg<_P
+rK[MOQ'VE7s-<qSQBd`$Pa.Drd6deioSiC$q2PT;NfT6_r/^W7#EOt.OckomPl?sJQ33J@R@=,C
+rgO"YR@0NBRK&ZSR/iWQRJiQSSGo&lStD[MUSO``W2ZesXKA\1ZEpt<Zo5>$\\#Mf]tV4q^q[\#
+_8*n'_Sa:0`Q$!Bbg"DZeCN7(g"bE>hV[;OjQ>Xilg4$,n+-/IrIP!qrrhK$_7dJ[])T5ts7#!r
+a1\g_KnctTf$h9cN3%PGAoC@gGBe70;1sRRJV/Q+J:LBj:K11h;,E"2PEM#gNK0!Ys"2sD^pge]
+\$rfT['R*EYcb(,WMcVhUS4<OSsu.8Q^3huP*D/lOH#6YMi*FKre^-%In`[6:Jakb;c?Xq<`W=*
+=^,-:?=.)L@Us%^BPD3sD/O<4EccGJG^=^bIXm!%KnbD?Mi<[XP*;/sR$sM8StVmSV5L;mXKA\2
+Za@0M\[oGf^VRe*`Q-'BbK\>YdF-Opf%8U/gYL]Ci8N_VjQ>Ufl07L!m-X60n*ol<nd"dYo_%nN
+p@nR]s7u]kr;6KkrVcBfJcCc1J,~>
+JcC<$O8nkOrVc`nrVQWks7uWg!Vc<eoeQ12o()>?n*f]3m-O'&l0.9ljQ#:Zi8<AHgY1<3f$r0r
+dEg+^bK7iF`PTI+77TpD9`%Zd;?'Pd;>O,R;>X8e;#iZR48_/=48_563rh>=48q8E3BB/]3]m4"
+r&ap>"$8P)48V);49&@\<<6'!rD`eq!E<"o;ufkk;Z9Sp<;of%;Gg=g:/=V\:]4&96N'p`<rZ1t
+<WH5"=Sl,%<E)t!<r5l$<)lpt<EE5o<W>tu<)rour`9)%r)`l"rE&r"!a/]1rE9/&r`T8)!EiP(
+=oMP'=qb+F?!UcB?!guH?XR8M@Us%^AS(jO#A.U^BkhF"D#S;ODBNk:EH6,BF`qqPG^4X`I"$Qq
+JV&Q/KnkMBMi<XUO-,V)PSoaPR%'_DV5UAoWN)qsWiN5'Yd1UB[^WfZrk'Mi^VI_)`lQ<HcdC1j
+eCN:*gYLfJjll!pmHsE4nalDGp\OdbNrK:9J7Dql?N+71?8e=6J9#=1=]IjX>A8>(@R37Y3&*!A
+.R-*Z4>euf7n?'=7n#m:2E3]]4[(tj9N>"k<E)jo;iq"ef:dG#@U<AJ?=$oCrEL4E=^,'6>$4s2
+=]nj/<`N.$<E)pt<)cdr;Z0Jl;ZBS_;1D;8:JXe`;,^Cm<E<.&=]ns6?!^lG@U`kZAnYmnCMds.
+EH6/DGBeF\I=?]tK8#&9M2R=QOHPfmQC+,1SXuOLUnsugWiW>+Z*UgG\%0)_^;%M$`5Td<b0/&T
+cdC1je^i@*g=tH>hr*JRj5f@bkNV6rlg4$,n*fc9o(!%Wo^qhLp@e7[q#C0iqY^6ir;HTdrdk*0
+s*t~>
+JcC<$O8nkOrr)ior;6Njs7uZhs7ZNerq/)>oCDJBnF,i6mHj0(l07Bnk2bR^iS`SKgtUQ8f@AC"
+dEp1`bK@oH`PfX0^M/UqOK52VTDtSaU%kA[U]7.eV#[ClVuEXmWVrjlX7`OoXo=O[Q2[$;Q2d-j
+R$O,+Q^F,,Q^<u(Q^*i%QBdf%Q'[f%Q^3o$Q]qE5!0dDF$'CC8Oj__/da?PCdK7tIe,Ic+d*^1c
+cHOPWc-+>QbKS8SrlGJhai_ZIbfe2NbPoQba2l9?rl*/Lq54CnVl6PnWUd(fX8]-uWroH'WiQ-#
+!3Q("'<eXFZ*UjH\@K5a]tM4t_Sa=1`W!jga2l?B`Pf^4_Sa:0`5BI/_u@XT`tcV8aN;WKbg4\d
+e^rL/hVmJVkj.[+r:($_p%J1Uq>'mdqu6Krqu$Ekrdk*Nrs8W$q"XUWp%@qSrrr&]lE/5-rr424
+Y.<PlNJj'7U7e-KARVaDY,n_,Y,nU,>?YHB?<pd@`PVVjs1JEHN;kR0p@@eHoCDJAn*B3#k2kX\
+hV?c9f@/-nbfRrG`l,d3`P]O*]t:hb[C<NNZaI42[/WjM:/=\_;,U=k<E<.%=]np5>[CcF@:E_X
+AnPdlCM[m,EH6/DGBeF\I=?]tK7nu7M2I7PO-,TjQC+)0SXuLJUSXleWiN8*Yd1UC\%0)_]t_A"
+_o9X:aihoRcdC1ieCN7(g=tE=hr*JQj5f=akNM0qlg4$,n*fc9o()DD"n_K\p@e7Zp]1-hqYg<j
+r;HTdrdk*0s*t~>
+JcC<$O8nkOrr)ior;6Njs7uZhs7ZNerq/)>oCDJBnF,i6mHj0(l07Bnk2bR^iS`SKgtUQ8f@AC"
+dEp1`bK@oH`PfX0^Kti(G(kYLK):5tKDU>uK`Hl)L]*&,L[9fsM=tofDuFYFEr9nnE,fi9DfKc9
+E,fl:Ec>u<EH#r<EH#r:rG_dT$?0p%EGqA=T:MLDrgX%]S=TYL%[rlTR[TV3R@9P4Q^F20r0RGL
+!0mGJ!L/oKPQ@&6rKYYprJU`9rf$f6s,?N.s,R)<s,[/>s,R/ArK$c9!g/S+rfI2DrfmDI$C7$F
+R$jD2R@9V8rgWqV!L]DTRJNBPS,SrnStDXJTV8-VV5C/iX/rG+Yd(LA[C6(B"1G\L]`,SE^AP_o
+^qmh&_8=+.`Q#s?bKeJ]dacq$g"P6;hV[8NjlYdklg=00nauSOrIP!ps$5GV^V.7j]",;Zs7"so
+a1J[`Kq#s'gX3NaMlqSGAoCXpG^":0;1sRRJV/N*J:LBj:K14i;,E"2PECrfNfK*Zrug+:^pge]
+\$i`S['R'CXf\\(WMl\iU7n6OS=5k4QBd^6P7<\:NfB$WMi*FKM27%GnV[?@Inid9:f1+h;cQk!
+='8[0>[1TB?t!MSAS,RgC27X'DfKf>Fa&(VH[U?nJV/W1LP^nINfT<cQ'Rf*S"6.DTqeH^W2co#
+YHY==[C<]X]Y2(q_Sa@4aN;WLcHjnde'ut#f\5*8h;@/LioB+]k3(smlKdg(mdKW6nac8Bo*+dZ
+p%J+RrV-BgrqcTjrqu`no_sFANrOV~>
+JcC<$O8nkOrr)ior;6Njs7uZhs7ZNerq/&=oCDJBnF,i6mHj0(l07Bnk2bR^iS`SKgtUQ8f@AC"
+dEp1`bK@oH`PfX0^I:^e9MYC[pegWZlV[UYp/1fMq)eL8s#^-@p,`78q`Fg="?AM(3B?jqr]:-A
+481c:4$*:>!*9(u!``3"r`&hpqG[Pq;GpHh;?9]qrDW_o#>n8m:/4S\:<l3+<rH"t<rH#"<``Au
+<rZ2!<WuK(<E3!tr`'#!<EA`ls&9,$<``=%r`9)%r)`l""BSW)='5E(s'#8%rEB2'#[1G9=BSg3
+>[786s'G_4#$tYE?t*VVrFH=HARo@bBk_<tCi')frGO3+EcZ>FG'A.UH@($gIt<3'K7nr5LPUeF
+N/ipZOHPinQC"#0St`'YVlHfsXo>F%XTu&7ZEpsK\\%jRs1TDe_SjL;bg4Y`daHXrg"bHBj6,[n
+mI'H3nac\O"nq]cq>:/PrrpSl@:!8IrE^=HSW8/=B3eY?78.0.H?3CY5$']t/Mo+Fr]L3<)+d=h
+77B^87n,Es3^5bk4?Q><;cHat;,U>Srs7)EH"LGl?=.%<>m">;>[.22"C#&5=]kZ+!E`G&<=)]+
+<`N*t;GpImrDEPl!`)ZinPT<\Inid9:f1+h;cQk!='8[0>[1TB?t!MSAS,RgC27X'DfKf>Fa&(V
+H[U?nJV/W1LP^nINfT<cQ'Rf*S"6.DTqeH^W2co#YHY==[C<]X]Y2(q_Sa@4aN;WLcHjnde'ut#
+f\5*8h;@/LioB+]k3(smlKdg(mdKW6nac8Bo*+dZp%J+RrV-BgrqcTjrqu`no_sFANrOV~>
+JcC<$O8nnPrVc`nr;6Njs7uZh3;<.?p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX/^MSt'OfA8N!20=bqP!tbrhTIgs/,dn!3#mrrMoOkpoO@priZ6`s-!GIqN_)F
+qNV&FpQbcEr0RGN!L9&OQOB1GQBdc%Q^<u$QBqH6rKIJLP*1rjeGdo"daZjsdJ_PndKn1Hd*^1d
+bg"E3b8SLHbK7lMaiV]IaiMTGbK7rNaiqfIa2c<Aa36jOW2HQmV$NrrW2Q\pWiE&kWr9!uWrK+&
+WiW8$WrB+"XoGO(YPbX)Z2V*0[KX1P]Y(qnrk\`S`5MYps2Y,["ieO#`5BLj`;[Xl`5Td;aN;QH
+bKS8Ye(3.)gtpuLkNVF)o(2hPs7HNgq"a^\rqcZls8Drp!<.QLWrE>'qt^$]p@\+Urrr&]Y-#h?
+rr4/.WOLllNf'09U7n3LARM^EYH+_*Y,eO+>?YHB?!U[?`r<gW_7mUsN;kO+o^q_Io^_SBmd'*"
+k2kX\hV?i<f$_pibK.cD`5KX4`P]I(]Xk\a[C<NMZaK;0s%Rr;:Jakb;H$Ln<E<1'=^#$7?!grI
+@Uiq[B4u!pCi4-0EH?5FGBnL^I=Hd!K8#);MN!OUOHPinQ^F84StD^OUo(&iX0&P/Z*UjH\@K5a
+^;.V'`Q$!@bKJ/Ud*^=le^rI-g>(N@i8EVTjQ5OekiqBum-O--n*fc9o'uhQo`"Lbp@n=\q#C0i
+qY^6ir;HTerdk*0s*t~>
+JcC<$O8nnPrVc`nr;6Njs7uZh3;<.?p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX/^L(o,G(TXEqh+s%qh4g"rJ(?-l%o"h!/gDfs)7jTs)I[Oq/Hm_EH#l:Ec?#;
+EH-#>E,YSmqJZOTE1EEsS-,=RS=KPKrgXRhS!oh7S!]V3R$a;/R@'>-R/WHPQN!-XQBdc%Q'RW!
+Pa%GuQHV\qMu\e8MZ&J5N;nk;N:i/1NrG%<NrG%7O84n;OoCODOV*eAPa.JuQ'Rc(R@0M4S"#q<
+r0m_US+iBNS,]#[StH"T%ABMlV5L8jWiW>+Yd1Y8[f<fB[^W`U\\,Sg^&>\F^])%K_'6b7`Q-'B
+bg"M^e'lk!g"Y9;i8WhYkNM0rm-X<5o_&%Wrdk*ps$58P^:_(h]",<Ms7,$o`4E:1Kq#^$gsNK[
+Mm%bLAo:RnGB\1/;1sRRJV&K)It(3h:K::j;,E"3P)tccNfT0[s"W3G^UUhb\@8oT['I!BXf\\)
+WMl\iUS4<OS!o_1Q'7GsPE_5kNf8sVMi*FKM27%FnV[?@ISN[8:f1+h;cHat='/U/>?kH@?X[DR
+A7]CeBkqO&DK'T:FEVkRH@1-jJ:`E-LP^nINK90aPa.T&S"-(BTqeE\VlHf"Y->1;[C3TU]=bkn
+_Sa@4aN;WKc-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg'mI'H3nF?)?!V>s_o`Fj]p\ssfq>^<h
+qu6NlrUp/@s,R,0~>
+JcC<$O8nnPrVc`nr;6Njs7uZh3;<.?p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX/^I:ae9MP4W!)`/\gemr0qE+^<!'C0@s#^3Bm5t8-!'0d7r&a[7s&T(u!*8ts
+r)EYo!E<"p;ufkl;?9WmqGRSr;,C"`:/B)#!*/qrrDies!*/qt!``3"r`0)#<`Suqpf75mr`/u!
+#$4i*<``@)rE'#$s&]2#!*B)$q-*c#s'#G*s'#G,s&fJ.>?b?<rEfM2"^YPE@U`mHAOC'@AnG[g
+Bk_<sCM[g(DK'Q5DfKl@F*)PJGBnL]I!pKpJV&N-L51SAM2[FSNK93cPa@c*S"?7IV5C/iX0&S0
+Ycdu-0<_Uc[C3WW]"G\i^VIe.bK\>[e'upuf%8U0hVdGUkj%R'nF?)@o_%qPq>1!drf7"&]lmdj
+?!U]A?<sY(NIPnZ?!0Wb:L8'iEEb[p=?&#e2(q2n4T@8V8Ol<?77Ka87Q3:f5<V1m4AAdR<)lpq
+;H&\W&($_fARf%R?=-uD>[1K=>lIt,=rgaJ>$4s0=&i:%<)Zar<)Zao<)ZXl;,L4h:esqbnPT<\
+ISN[8:f1+h;cHat='/U/>?kH@?X[DRA7]CeBkqO&DK'T:FEVkRH@1-jJ:`E-LP^nINK90aPa.T&
+S"-(BTqeE\VlHf"Y->1;[C3TU]=bkn_Sa@4aN;WKc-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg'
+mI'H3nF?)?!V>s_o`Fj]p\ssfq>^<hqu6NlrUp/@s,R,0~>
+JcC<$O8nnPrVc`nr;6Njs7uZh3;<.?p%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^Mf(.P+_fHs.KCcqkF+cs.o[krhf[ms/>ssri5OiqlKXrriZ4'!3lBas-*JI
+qNV&FrK[AHpQb`Ds-EkSQ'[i)rg*eRQ^<u'Q2R!kQ^3r&Q'@MuQ'@MuPEM0^f%&=#d*gFnf%/@!
+e^;gne,Ibpcj%hAb08#Pao9I!bfe5Sb0%iKaiMWKbKJ#NbK%fI`lH-B63*q^V?WrsWMuntWUm.i
+X8f4"X8f3uXT,F&Y5PO(Yl:p+ZOaFN\%&u\]Y2(r_Sa:0`5V_q!6>&Z!6>)Y!6+iRrkg#"`lH0A
+b0.uQcdC4kf@o';iSrt_lgOE9o_%qPp@n:Uq"ad_rVHfsqu$BjrVhBJWW)tqrq?KfoC`"\"n_/`
+Y0$S?rtjgqf&!NiMj@YCTq@ic@'?c9XfSV+Wi5o#$t3LK>[+MQ_ns7,^V#L)0)>,2o_.tLoC;57
+ki_*ij5AeLg=b'*d*BhVaMu6=`P][4^V.:k\[T#T['d6Jn?i3iISN[7:f(%g;cHat<`iL->?kH?
+?XR>PA7]@dBkhF#DK'T9FEMePH@('hJ:`E-L5:\EN/s'`PEhK%R[]k?Tq\?[Vl?\tY->1;['mHS
+]=bkm_8=.0a2lEHc-F\`daZh!f@em4h;7&IiT&t[k2tmll0@X%mI'H3nF?)?!V>s_o`Fj]p\ssf
+q>^<hqu6NlrUg)?s,[21~>
+JcC<$O8nnPrVc`nr;6Njs7uZh3;<.?p%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^L2#-G^oXDon<@!qhG**l%o%ir/1#`!,qgTs)IaQr,DaVDuObTE;snZE,fjq
+E<(%XEW:"XEW9tmEH#i9T:VUES=5q=SXuFDS=Z4?S=TYKs-itUs-O"WR?s>0R$mr@s-EhRQ^3p8
+Q3`bAQBRW!PE_?T6Mu`GN/NUQN/`e^NW5%<O8b4@Oo:CAOnt4MPE_>tPa.Q$Q^F2/R[a;HqjRbZ
+S"#k7RJWEkS"-">St;RITV8*TUo(&gWN*&&Yd1UD\%&pG\Gs)C]"G_i^:jN[!5JNKs1okq_o0R9
+b08,Vd*^=nf@\g4hVdGTk32*smI0N7p%S:ZrIP!mrr^Zd]tF?U34ZR!s75-q`OiI2L7?!-gs*$P
+TrW`]B5UCgGB\1/;1sRRJ:`B(It19i:K14i;,E"3P*(ieNfT5#1B#hD]skP_]"#2W[Bm3EY-"b*
+Wi)_iUS+6NS=5h2QBRPrP`q8kO,K!VMi3IKM2@+HnV[?@ISN[7:f(%g;cHat<`iL->?kH??XR>P
+A7]@dBkhF#DK'T9FEMePH@('hJ:`E-L5:\EN/s'`PEhK%R[]k?Tq\?[Vl?\tY->1;['mHS]=bkm
+_8=.0a2lEHc-F\`daZh!f@em4h;7&IiT&t[k2tmll0@X%mI'H3nF?)?!V>s_o`Fj]p\ssfq>^<h
+qu6NlrUg)?s,[21~>
+JcC<$O8nnPrVc`nr;6Njs7uZh3;<.?p%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^ILjd924AAhGF8NpcA75q`4^=r]Kg7s#U-@r]1-A3]]:r3r_;A3r_;A3X%T+
+3]g>Ar`0"urD`r#<E)ut;ufqt<;]\l<<#nm;?B]n<;TSs;Gg7c:Wc!/<E<.#<E<.%r`0#!qc3bu
+<)rispJh#is&T,!r`0##r`9&!!*B/%!EE1u=8u8(<``@*=^(f-"C#&4>$Ci,!*]A)!*]2&s'>V1
+rEf_9@:<YWAc?<?BE)ZFC&_p_CM[g(Df9T6EH6,BFEM_LG^4U^I!pKpJqAW/LP^nGMi<XUO,oEf
+R$jD4SY)UNV5C2jX0&S0YHP+2Y->1;[^`l[]Xtkl_8OI>d*pOsf\,!3gY1K?iT0.clL"'1nalAE
+p%J1Wqu$DOs!t?l@U<AJ>[C`BY+L]&E+WBY7RU'_GC=F45"JU40eP=65<V+k2)Rrq7n3JH$:I?D
+3''8e5!(l$r_inu<DcYTrs?i5F(\rh?<gfCr`oP/?2e%4>[(B8=]el,=;P%=<`W4"<`2mq;H6Xn
+;,L+d;,C+d;,Hd[s%Rr;:JXe`;H$Ln<E<.&=]ns6?!^lG@U`kZAnYmnCMds.EH6/DGBeF\I=?]u
+K8#&9M2R=ROHPfmQ^F52SY)UMUo(&hWiWA-Z*UgG\%0,`^;%M$`5Td<b0/&Td*^:ke^rF+g=tH?
+hr*JRj5oFckiq?sm-O--n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*1s*t~>
+JcC<$OT4tPrVc`nrVQWks7uWg!Vc<eofMg;o()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1?4f$r0r
+dEg+^bK7iF`P]O,A8mF(PFJ2:TV/!PU8%X^#bn)hUnsobVl0Nms/?!uoW.qlr2odtric.%!jRuR
+r0%&C!0m8Dqipi?rg*SNs-<eSQ'[c&rfmYRQ'[c%QN!-SPEhE"Q'@W"rfmYLeC2t!ec*u(e'cap
+f$r0se'ZSBdK%\ocjJ+Ac-",NaiquNbPfQiaN;NFbK7rNbfft,!64FnnjD\/"K/,pVl9Qno;_\g
+#HFi+XfSV+Y5YU)Yl1g>ZE^^A['[6L\%&u[]Y(qm_84%g_uRdU`W4'WaToo-a2Z*:`Phbp(rXD5
+a2lBFbK\A[dFHh#g>(QDjQ>[ln+$DL#57feq"aa^rV6Kjqu$?mrVhBJVuHu!q"OOVo^r%\"SD&^
+Xip\C-fh5]f#Eu5QX->ZTU]P#YHb13XfSY)W*<G0@:*;F>I)5c_SEq$]SleBp[RnIp@e+Lna>c-
+kN:mciSNADg"+U!cH=5L`lH*<_o0C*]Y(eb\[SuR['R./[JimL:/=\_;,U=l<E<.%=]np5>[CcF
+@:E_XAnPdlCM[m,EH6/DGBeF\I=?]tK7nu7M2R=QO-,WkQC+)0SXuLKUnsufWiW>+Yd1XE\%0)_
+]t_A"`5Td<b0/#ScdC1jeCN7)g=tH>hr*JQj5f@bkNV6rlg4$,n*fc9o()DPo`+Uap&Ojdq#C0i
+qY^6ir;HTdrdk*1s*t~>
+JcC<$OT4tPrVc`nrVQWks7uWg!Vc<eoeZ73o()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1?4f$r0r
+dEg+^bK7iF`P]O,=^l8sG^fOBq1S^#s+^H,lA5Is!/UH-pkf&klu;oCrc/!Yrc7gSs)8EeDfBW6
+DfBZ8E,oo;EW0n^DfB]:EGol:rc&*ZS=?(@Sc5,YS/RrgSt2FBSXZ+=S=>t8R@9S2R?s8-Q^XA0
+R/NBLQ2m3KQMm'KPO:d.6g@#:Mu\e7N:`)0N;8J2NW>.8O8tF@P5gaGPlI!RPa.Q$Q^F2/rgNhU
+q4%SVR@9V6r0mbXSY#hQ!29Ces.r)[W2ZbsY->1;[C3QS\@K/]\[oAa]Y2"m]tV7r^qde&_Sa=3
+`lQ<GcHsqcdaZk#g"bKCj5oIglg4'/nalJLqY^>Ds3(EEbJCs*rji'<s8OqHim>]XZ\F4+`n9+i
+Xa[+BQ#C;R9R1i+F];4kK7ST+JqAN':/=Yb;H$FhL6e!cOcPN_NrL3re]#84\[]2\\$i]NZa$[8
+XK/D"VPU&]T:VUBQ^3s:P7!P<OH>N_NJrjTMZ&D$MZ->!:/=\_;,U=l<E<.%=]np5>[CcF@:E_X
+AnPdlCM[m,EH6/DGBeF\I=?]tK7nu7M2R=QO-,WkQC+)0SXuLKUnsufWiW>+Yd1XE\%0)_]t_A"
+`5Td<b0/#ScdC1jeCN7)g=tH>hr*JQj5f@bkNV6rlg4$,n*fc9o()DPo`+Uap&Ojdq#C0iqY^6i
+r;HTdrdk*1s*t~>
+JcC<$OT4tPrVc`nrVQWks7uWg!Vc<eoeZ73o()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1?4f$r0r
+dEg+^bK7iF`P]O,6UjU<9MFVGi)08I!'Bp9qE+R8r&Xm>p,i:8"?SY+3]d7#!BN793rV2B3]fD%
+3s%HC<W#nq<<Q?&<E)uq<;]\p;ufkq;ufkp;?Kco;,[?k!*&qr!`DllmR$J3l9bDL"'AW)<Vf_t
+<E)ur<rH"t;uK\m<W?,!<W?,!<W?,"<W,r#<E<1&r`9&!s&K5'=BSi,=U858=^#!3=BSf(>5qk,
+>Q7t.>6J8>?=.(=@/aU7A-6CTAS1pSr+KhZCMRa&D/X?3EH6)@FEMePGBnL]I!g?lJV&Q/L5:\C
+MMmITOHG]jQ^O;3SY)RKUnsreWN3/)YHY:8Yd(I>[C<`\^:h4o^Ve%6d*pS"gtpoFi8WbXkNM3s
+mI'K4nac;Dp@n@Yr;DNQ"J9F:?XNe=10n.iToXbDB3n\/6rI]EIV`"H:JF54/i>.C4Ztnb2+U2,
+7n,p97Rf?s3^5bk4$65:r_ikt;GiMT&B0fRA7JtS?!^lE?<pfA>$Lr1'3\O@=]\a-=&i7$<E3'u
+<)HLl;Z9Mn;Z9Pm;".?]9n#i5:f("e;cHat<``F,>$P<=?XR;O@qB7bBPM=!DJsN8FEMePH@('h
+J:W?+L51VDN/is]PEhH$R@Bb=TVA6YVl6VsXfnt7['mHS]"G_k^r"%/a2lEHbg+P^daZdtf@em4
+h;-uHiSrnYk2tjkl0@U$mI'H3nF?)?oDeI_p&F^cp\ssfq>^<hqu6NlrUg)?s,[21~>
+JcC<$OT4tPrr)ior;6Njs7uZhs7ZNerq/;DoCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bK@oH`PfX0^LMADW0<U@TV/!QUAL\hUnsobVl0Nnri5msqQ0XtrN?+&r361(!3l4&!4)Qf
+"I#"2P*5g.s-3DGrKIAKPa(p-#*tL<QBml&rKdMKrKdtYPa.T$Q^*i"PEh>sPl?q'PLJ(4eC;ps
+e^i4"eC;moeC;pte'cXlda?IhdEp1`c-4DTbKS)Obf\&Mbg";OaiM[)aTK`.aN+-DfgGF!s/>pr
+!NN-kWrB'uXT,=$XSo7%Y-@o1!4)U1"1#8>[/RHI[^WcW]">Vg^qdh)_o9U7`Q-$?b5TWab6Z22
+a2Z*<`l5pq`[JmKb0/&UdF-Rtg"Y??iT'%_lL"'1o_/%Rq"OOXq"ad^q>0sbr;6Ekr;chJs/5l$
+rV-$Yp%%bPrrhu]Xfg"Ls![m*Yi3dCQ!]e^U7n9NARM^GXK8P*Y,eL*>@M#J?!U[?`PfX/^V7@=
+s"=':o^h_JoCMJ?m-<fsjlG:TgtLH5e'cRcaN2BBa2Ps6^qICm]"5AZ[C*BJ[d^\R9MJ5V:Jakb
+;H$Ln<E<1'=^#$7?!grI@Uit\B4u!pCi401EH?5FGBnL^I=Hd!KSG8=MN!OUOckroR$jG6StMdP
+Uo1/kX0&S0ZEpsI\@T>d^VI_(`Q$!@bKS8XdF$Fmf%8R.gYCWAi8EVTjQ5OekiqBum-O0/n*olH
+ncn^Xp%A%Pp\jmeq>^<hqu6NmrUg)?s,[21~>
+JcC<$OT4tPrr)ior;6Njs7uZhs7ZNerq/)>oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bK@oH`PfX0^KG#bI<g8<KDU?$L&Qi+L[KuoM>W81M=lc)EU@`EEW'qSEW:"WE<'tWE<1#r
+rbr<dE,T]9EH6#;Df9T5EW0ntEGqA<SXc4>SXl@BSt2FAS"6+?T:MLAS=H%:R@=)B&X\uRR$j;.
+R?s5*R$a2)QBdd6Q2d*F6J4a!6N;rHN/NXSN:r81N;AP3NrG+9OT1IAP5^[DPQ7!IQNrnHR@9S6
+S"0GJrga"Zs-j"WrL<bU#G%HYTV/'UV#I2,Vl6SpXfen6ZaI6N\@B)[]"5Mb]Y(qkrkBhp^VI\%
+_SX4/`lH3EcHjkbdaZgug"Y?@ioTCflg=-/nalJLqu-MFs3(F-qSpCe]"#5Z\@;M<o]+B>]<[0F
+TuPmDa/OiqR$MYaDbPG$GBHk^KS+i,K7\]*J5/m@<)QXl:kk7!PECodO,j5Bp!Ujlrj`!=*OiJa
+Za6m>XfSS(W26>dTq@pIR[BD,P`q;qPE:k)N<bB#Mi*@JLktPXIS<I1:/=\_;,U=k<)lt#=BSg3
+>[:]D@:E_XAS5[jCM[m,E,fr@G'A4XI!pKpJqSl6M2I7OO-,TiQ'du/S=ZCIUSOfdWiN8*Yd1UC
+[^`o]]t_A"_o9X:aihoRcdC.heCN7(g=tE=hVd>Oj5f=akNM0qlg4!+n*fc9rpg9bo_%nNp@nO\
+s7u]kr;6Kkrr)KgJcCf2J,~>
+JcC<$OT4tPrr)ior;6Njs7uZhs7ZNerq/)>oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bK@oH`PfX0^I1L^92&(C;!V!V;Z9Pe;?0Sm48:l548M#:49%A>49%A@3rh>?48_/=3VYW9
+4$*@&!':!Ws&K,$rDrks!`W0"qc*JlqG[GnrDEet;Gp@i;Z0Pn;?0Sj6J4a!6N:'c<WZ9%<Vf_t
+<E)ut<rZ2"<;fbo<;T\q<rZ2!<r,hr<<#r&<`iF)<`W<$<rZ5%=BYE&s&f>(r`T2'rEBS5?!U]?
+?!^iE?iFI4@SpWGAS,OeB4tpkBPD-oBkqL#D/F0/DfKf=F*)PKH$XgaI!pElIt3*'KnkJ@M2R@R
+OHG]jQ'e#0S"6.EU84Z`W2ZeuY-5+9ZF%!I\@T;dr4jGk`5g'Ke(<=/hV[;OjQ>Xilg4$,n*ol;
+o(;SKq"jpfM>oi+An#+R?<plC?*g;fJT>C/=@GVXBRYDF;a+2N6o$)G.m?'Y4>eud7Rop;77B[8
+3&j/f4[(qi9iP%i;H-OlOT,Uc`/nqL@:3JKrEfJ.!F8t0?2n+A=]ed/=]\[)<E<+"<`E!o:Jt*i
+;#jGl;$'Qi;".>29MJ5V:Jakb;H$Ln<E<1'=^#$7?!grI@Uit\B4u!pCi401EH?5FGBnL^I=Hd!
+KSG8=MN!OUOckroR$jG6StMdPUo1/kX0&S0ZEpsI\@T>d^VI_(`Q$!@bKS8XdF$Fmf%8R.gYCWA
+i8EVTjQ5OekiqBum-O0/n*olHncn^Xp%A%Pp\jmeq>^<hqu6NmrUg)?s,[21~>
+JcC<$OT5"QrVc`nr;6Njs7uZhs7ZNerq/)>oCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX/^LVYLTp(rET`ChcU]$tmV5C,fW2ZcnX8]4"Xo#:"YPGEuZ1kO(Zi60fPlHsI
+P5UUDPlI$GPl?pJPkUFOQB[]!Pa7Q"QBdf&Qi<6eQ^!i%Q^<o&Q'R\uQ'7H_e(*!uf$`*ue,@f%
+dF-Ome'ujqrR(esda?JAcMl'#bfRoKbK7iKb08#LaiMTHbKKn,rBeq"p-S_WoW%kj!N`F&X9Pf0
+Xf\e3ZMh*1['Tb=!k#PKrjVs=rjiiV]YD;#_o0O6a2lBEb0%oPc-4DVbPoTaa2\,!!65#Y(s'hA
+bg+S`e(*%&gtgoIj5oIflgF63o(E"Us7['!q>1!aq>0sbr;6Ejrr)hIs/5l$qtKgWp%.bOrrhu^
+XKC"Os![cGZ0%mlRV%grU7n9OARM^GXfSY+XfJC)>[h,K?<pd@`l,a0^V7@=s!d[7oC_bLoCDG=
+m-*Wojl>:UgtLH4daQOdaiMKCa2Z$7^qICm\[])Wrj;d6ZgbAP9MJ5V:Jakb;H$Ln<E<1'=^#$7
+?!^lG@U`kZAnYmoCMds.EH?5FGBnL^I=Hd!K8#&9M2[FTOHPinQ^F53StD^OUo(&hX0&P/Z*UjH
+\@K5a^;%M$`Q$!?b0/&Td*^=le^rI-g>(N@i8EVTjQ5OekiqBum-O--n*fc9s7-3^o`"Lbp@n=\
+q#C0iqY^6ir;HTerdk*1s*t~>
+JcC<$OT5"QrVc`nr;6Njs7uZhs7ZNerq/)>oCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX/^KG)dH$Xr<KDU?$L&Qi+L\Q\tM<9]mEUIfEEW1"SE=6`*DfB]7E,]`7DfG\o
+(iaJ6E,ou;Ec?#;DK0Q4St)@BS=Z4@S=KSL#+h<SSXZ.?qj[h\S!oe5R/E?\Q^4#+Q^4#*R$O#'
+Q2[*JQ2O%t6hWkHMuSb/NW4t5NW"n:O84n;Oo1@BPPgXGQ'VE:!1EhT!h5^Nrgj1`St>kN"e;'P
+SXc5KSK+5nTV8-UV5L2fVl6SoX0&V1Z*LaE[^`iX\[oEN]E#YD^*^V1^qmn*_o9[;b0/)Vd*gCm
+f%8U1hr3VXkj%L#mdTi?pA+Uardk*mrrqo1^q@7grO;h,0_XSVa1Sd6KquiJh8=u&Z$V7G:N06X
+GBe70;1sURJqJZ,It19i<`E!q;,E"3PEPp,!03*>+Rmar]",>\]"5AY[C!9EZ)t+.X/MnkUnF?O
+S=5k3Q'M?5%?lp8N/imVMi3FLMM[/YMLS;o9hnJ\:f1+h;cHat='/U/>?kH??XR>PA7]@dBkqL$
+DK'T:FEVkRH@1-jJ:`E-L5:\FNK90aPa.T&R[ftATqeE\Vl?`!Y->1;[C3TU]=bkm_8=12aN2NI
+c-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg'mI'H3nF?PL!V>s_o`Fj]p\ssfq>^<hqu6NlrUp/@
+s,[21~>
+JcC<$OT5"QrVc`nr;6Njs7uZhs7ZNerq/)>oCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX/^I:Xc92&.D;"IQS;YEub48Cr548M#;48q;=3sdr03]]>`4$#Dar]:'>"$/G'
+3Vkc=3BK8_r)Wbrs&T/$"'/E%<rQ+r<!$'!<;]\n<!-&u<)`co##eDs;Gg=ir)<P\dR3^p!*9)!
+qGmYt<)rou!EE+s;u9Pl<W?+s<<6-%r)Wbr"'/K*=Sl/"=T2G+>$5!3>Q%b(=T;P(=pA,5>$G39
+>l@t,?5R$W?t!JQ@UinZAnG[gBP;*oC2%EtCM[hdD%:H%E,p#BF`qtSH[C-fIK"^mJ:`H/LP^nH
+N/Wg[P*D5uR@9V8SY)UNV5C,gWN32*Yd1UC[^Wi\]tV;!`5BL0`5Tg@d*gIsg>(NAiT'(_kNM-p
+lKmp+n+-,Eq"ajdreg^Xn;:gcra,S0,@@dQOb.Xe?!0Wb<GR/8B15$g3B8fC1bV'W5!1_\84Q0>
+7fGg_7Q<@m5<_1k4AGcQs&&hoOT-!g^5[#A?sm>J?=.#E?!^`=>?kG4=o__)=:A>6=BAL'<E3("
+;c$9h;@$)s:f:4h;,C'X;1D869hnJ\:f1+h;cHat='/U/>?kH??XR>PA7]@dBkqL$DK'T:FEVkR
+H@1-jJ:`E-L5:\FNK90aPa.T&R[ftATqeE\Vl?`!Y->1;[C3TU]=bkm_8=12aN2NIc-F\`e'uq"
+f\5'7h;7)JioB+]k3(smlKdg'mI'H3nF?PL!V>s_o`Fj]p\ssfq>^<hqu6NlrUp/@s,[21~>
+JcC<$OT5"QrVc`nr;6Njs7uZh3VW7@p%@tKoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^LhhQQ'S*BUA^kcV>mCpVl6Sori?%"rN6+&s0)F+!3uC)qQ]k%pTk:8PEV/m
+PEV5qPEV/mrKHr>rfmJLrKRAIr08ChQB[]$Pa%GuQBRW!Q^<u%QBdc$Q]m]#Q'.B]daH[qrmh%u
+"kD,Re^DqEdf7f"dF6Rldf.Pqda6CgcMYodb7;V8aNDWJb/h]HaN2KHaiQpG6N=%XWrB'uX95T+
+Xf_T+!O8s0ZN[_D[C!?OrODp>rj`$?rjrWQ^VRe*`Poj<b0.uPbl,fdbQuJ;b0%oKaN;X'aoBO(
+bg4\cf%A^3h;@,Lj5f@clL"$.nac>Gp@n=Vq#'sfq??corVZWnJcDVI#QFVpp%@tKo)&Fip$o)b
+fDbduq5_9qSu%O:Q=Q\`Tq,b&YHY12XfSY*LKe"n@:*AH>I)8f_SEq#]SleBp@\"Lo_.nHnEoQ*
+kN:meiSWJFf[\EtccjMPa2uEB_o0=']=PP_\@&`O['d70[/`o"9n,o6:f("e;cHat<`iL->?kE>
+?XR;OA7]@dBPM="DJsN8FEMePH@('hJ:W?+L5:\EN/j!_PEhH$R[]k>Tq\?ZVl?\tXg#(:['mHS
+]=bkm_8=.0a2lEHc-F\`daZh!f@em4h;7&IiT&t[k2tmll0I^&mI'H3nF?)?oCW%T!quB_rqQNh
+s8)Zjrqu`np&9OBO8j_~>
+JcC<$OT5"QrVc`nr;6Njs7uZh3VW7@p%@tKoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^KP;kGC+r<K`-W)LAco)M#3&,M?&RnM?&S1EUIfFE<(%XE<'tUE?B.>E,fl:
+DfBW5DJsE3E,TZ7E,fi;DfB]8DK)2;S=]\Ms-s4_S=Z:@r1":eSXl7?SXZ.<R[KY5R[KTCR/`TS
+Qj&eBQC!o(rKdAHa[>kj!K2p1NW"h4NW+t8OT1FDOHKI(!0dDF#a:L:PE_>uQC.Z>!1WtXs.'.]
+rh'+["eVBWSXc;NSc53#T:hmQUnjibW2HSnWN*#$YHP4;['dBQ\[oAa]DB/g]tV4q^qmk(_o0O7
+aihrScd:+he_&R0hVdDSk32*rmI'K8o_81YrIP!krrhH$^V.5X[lCn,s8VfSeAo81L4lDGin_G)
+O1'7WCN=>kH$FRV<)J=%JqAW,JU_E1:KCCm;Gg;GP`q5kOcPN_rr_Z8_n,fW*kJef['R'CYcY%.
+Wi)bjUnFBQS=,b2Q'RYuPa%;krf-r:!/gc4!K)^&M?$?L9n,o6:f("e;cHat<`iL->?kE>?XR;O
+A7]@dBPM="DJsN8FEMePH@('hJ:W?+L5:\EN/j!_PEhH$R[]k>Tq\?ZVl?\tXg#(:['mHS]=bkm
+_8=.0a2lEHc-F\`daZh!f@em4h;7&IiT&t[k2tmll0I^&mI'H3nF?)?oCW%T!quB_rqQNhs8)Zj
+rqu`np&9OBO8j_~>
+JcC<$OT5"QrVc`nr;6Njs7uZh3VW7@p%@tKoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^I:Xb8kr.[:[V'Q;=[WQ;>E<L3qtf73rM,B3]T5^r]:6D4$#GbpH&=7"$/G'
+3W(o@3BC2@<VTVp=8u=t<W?"u<U`uf;uTYp;uKSp;,[Bla[>kj!E<(r<rZ2!<WH.q;uBVl<W?,"
+<W?+p=8u;$<W6%n<rcA#=oV\*=oDG'>$:i.#?b56>?kE=?2@n-?NX\E@:K4G;.X?OB4kmkBk_<r
+C2.O$DJa9.D/O93EccJKG^4U^H[L9lJ:W<*KnkJAN/`dTO-,WjQC+)/S=Z@GU8+Q_W2ZetYHY7:
+['mHR]"G_l_8F7k`ui=Aai_lTe(3.'g>(NAiSrnYj5f=bkj.X,o_81XrVhZR/_bhd?X@&G?!UcD
+[%`\8F_G)c771*mKRRN#6=)T-0K(dA5!1tj2Dn&r7n,uI71_XC3']\l4$,Q!;H$Oo;GpARrtk::
+LMgU0?=7,H?X@#C>?tE:>?kB:>$:i,(g0pC=&`4"<E3!s:f(%e;Gp@g;,U4e;,?[Y!)3AdInid9
+:f1+h<)lt"=BSd2>[1TB?t!MTAS,UhC27[(DfKf>Fa&(VH[U?nJV/W1Ll%%KNf]EfQ'Rf+S"6.E
+U84W`WN*&%Yd(OA[^WfZ]Y;.s_SjF6aND]NcHsteeCE1&g"P3:hV[8Mj5]7`k32'olg4!*mdKW6
+nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTerdk*1s*t~>
+JcC<$OT5"QrVc`nr;6Nj!;ZTg#5@ibp%@tKrphc5nF,f4m-O'&l0.<mjl>C[i8<AHgY1?4f$r0s
+dEg+^bK7iF`P]O,^1MbWPb4nKrM'IjV5C-hVuN[tWN*#"ri?+%rN?1(!3l@*!4)L,q6Kh&r3ZF1
+!4MiirfR>HPa)$.pltZ@!1*SKs-3MJ%$ZsAPa7W"Pa.MuQ^%H6!0mDH'pFoKe'c^od*gClf$r:#
+e^W*sdaceFe,Ri&eBuaoeC)dld*M[;$-^Z:b07uNaiha(aTou/b0.lHa2l1dr'LF`!3,anri?%"
+riH:+YctD3Zi@E4[K3kIrjhp;!P?#D]a_cn_SjF5aN2KGbKS5Urm(Mfs3:VhrQGGicHaYXc2Pun
+cdC4kf@o$;ro,![k32$nlg=-0o()DFp%J+Sq"aa\q>'mar;?NkrVhBJVZ-o#q"FCRo^VJKrri)d
+WiXtSs![ZB]]l>_NgGu?US4?NARMaIXfee-XfHMG>@V)K?X$a?`l,a0^V@F>s8VdDoChkMoC259
+lKIEojlGCXh;$Z6da?@aaN2KFaMu*8^V.7k\[],V['d6J[.(L'9`Ih9:/=\_;,U=k<*!%$=BSg3
+>[:]D@:E_XAS5[kCM[m,EH6/CG'A4XI"$TsK7nu7M2I7PO-,TjQC+)0SXuLJUnsufWiW>+Yd1XE
+\%0)_]t_A"`5Td<b0/#ScdC1jeCN7)g=tH>hr*JQj5f@bkNV6rlg4$,n*fc9o()DPo`+Uap&Ojd
+q#C0iqY^6ir;HTdrdk*2s*t~>
+JcC<$OT5"QrVc`nr;6Nj!;ZTg#5@ibp%@tKrph`4nF,f4m-O'&l0.<mjl>C[i8<AHgY1?4f$r0s
+dEg+^bK7iF`P]O,^0>8nGCG8CKE-`(LB!&*M#)r.MY`7sMYE&/E;=M@E;FSSE;jhcE,T`8EH,r9
+E,TW5DZ"GNE#!;1ELiVjSXZ.?S=Z7BS=Q1?S"#t<rga"X$D!ZVS=Q1?S"#h7rg=+[R?s8.Q^F,,
+QC%T:"-o1<Q2[#d6i9:ENW"h5NW5%=O8Y1=OTCW0rfd>Gs-*JG#EtC:QBml)RJrWWS"-%?rgrqX
+!20=`!1s1^!1s1^*2'""USO`aW2ZerWiE/&Y-5(7Za@0M\@K2]]"@pR/%`I-]t_:r^qmk(`Poj<
+b08/XdF6Rpf@em5hr*MUk32*rmI0Q9p%S=[rIP!krrh,q^q7/U[ii-Zs7PF&aM,-<KW*,UhS=f(
+[=312E,JKtG^+@1;1sT"Je<K<:JY"i;Gp@hL6Rj`OHGN_NrLiucb[0'\@T5][^<EIYd(F8XfJJ#
+Vkg,^TUq[AR$a2)Q'7DrOcPN^NJrdQM2I.IM"$<%9`Ih9:/=\_;,U=k<*!%$=BSg3>[:]D@:E_X
+AS5[kCM[m,EH6/CG'A4XI"$TsK7nu7M2I7PO-,TjQC+)0SXuLJUnsufWiW>+Yd1XE\%0)_]t_A"
+`5Td<b0/#ScdC1jeCN7)g=tH>hr*JQj5f@bkNV6rlg4$,n*fc9o()DPo`+Uap&Ojdq#C0iqY^6i
+r;HTdrdk*2s*t~>
+JcC<$OT5"QrVc`nr;6Nj!;ZTg#5@ibp%@tKrph`4nF,f4m-O'&l0.<mjl>C[i8<AHgY1?4f$r0s
+dEg+^bK7iF`P]O,^-kI_92AC_:\.EV;=mcL;?&]Q48M#348h5>49%AA3WD,E4$#Da3]fG$3WqN*
+4$#G!3W;):<VBGn=8Z+u<W?"u<UWo`;?0Yp;?0Y66i9:H<WZ9#<;9Dj<!$'#<rH%p<rQ/%<``E%
+<rZ8"<rZ8$<rH,"=T)D&=o__(=T2J#=p%u6?![G9s'H4C?XI2L?t!MR@q0%\Ac?9BB5%3W7VZ^T
+D/F0.D/O94EccJLH$O^_I!pHoJV&N-KnbGAN/ipZOHPckQC422S=ZCJTqeE\W2cr%Yd(I>['mKU
+]=bkn_8OC9qoTc"cHt%jf@ep7hV[8Mio9"YjQ5Xmo(DhULAr^GG[b#d?<piC?XC%3O+DFe?Wold
+=)`kBAOAah2D[!E1bV$U4$5DY8Gu$W71_I=3']\k3]fK!;GpFl;H$GSrs%u"Kl(=-?i44X>[(B;
+>?b?:>$5$4=BJ^/=&rC$=&`1"<)QOh;Gg=i:f1(d;,C+cn593Zs%Rr;:Jakb;H$Ln<`W:(=^#$7
+?!grI@Uit\B4u$qCi402EccDHGBnL^IXm!%KSG8=MN!RVOckuqR$jG7StMdQV5L8lXKA\1ZF%'L
+\[oGe^VI_)`Q-'BbKS8XdF-Oof%8U/gYL]Ci8N\UjQ>Ufl07L!m-X60n*ol<o(2nRs7QEc!;HKf
+s7u]kr;6KkrVcBfJcCi3J,~>
+JcC<$OoP(QrVc`nrVQWks7uWg!Vc<eofi$>o()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^1`.cRAm3\U8+KZV5C/hW;`arWr8t"XKAW(YPbU)Z2:j+Zi.3+Zi.90[J[K2
+\,;HgP5(79PQd><Q'R]#rg*SLrfe%ZP*M8tPE_;tPa%JsQ'RZ!Q'VE6"-o+9PlB,Bd*gClda6Oo
+e^`0teCDssrR2G0e'c^peCE'se'QIid*L%_dETi5bQ#WcbK.fIrlY8^!mA[+njDP-lU1V;!3,an
+s/Z+"$a$S8YHY:;Za@0M\G`r<](ru<]a2?e_8=+.`Q$!tao]f3cMl/fc3VbCcd0n_cd:&<cN)>k
+d2UTcf@es8i8`q^k3)!olg4$,nF?&>oCV_Kp@nR]s7u]ls82rsrr.KKV#LYnp%@qInaZMV"ShPf
+X53dT./'[SkcUD6Q]kmSTV,S%@'Qu=Y-"e-X)2!C@q&eO>?eDQ_nj.'^V5[,0)kS?o_.tNoC229
+lKRKnjQ#1UgYCH6e^;^daiMWHaMu*7^V.7k\[f2W['R-Hn$RX<9MJ5V:Jakb;H$Ln<E<1'=^#$7
+?!^lH@Uiq[B4u!pCi4-0EH?5FGBnL^I=Hd!K8#);MN!OUOckroQ^O>5StMdPUo()jX0&P/ZEpsI
+\@K8c^VI_(`Q$!@bKS8Xd*^=lf%8R.gYCWAi8EVTjQ5OekiqBum-O0/n*olIo)J:bo_%nNp@nO\
+s7u]krVQQkrr)KgJcCi3J,~>
+JcC<$OoP(QrVc`nrVQWks7uWg!Vc<eoeuI6o()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^0GJtHA76/K_pK&LB!&)M#E2/MYE&&MXZN(N;delEVaVSEV+5IEW0qWD\-o-
+EGof8EH#i9DJsH2DJsLnDZarsE,Y`Hs.'+[!h>aOrga4_S"-%<Sc,&\SXc1>rgaIfS",t;S=5k6
+Q^X;.rg<_O!LT2OQN`\?Q'R]#njDP-lU1V;q2P?3qi1T8!0@,@)3U2HP*;)oPa.N"Q'IStP*2#n
+Q'Rf)R@9WCS-5CST:VYNTDbG]TDtSaT,=5pTqeEZVPpGnX/i>'Xf\e2Z*CXB[C3RB\M(P+]">Vf
+]tM.p^VI\'`5]j=air#VdaQ^rf%A[0gtpuKjlYajlKms.oCVhSqu)*Gb5X<J`50!o\%&oU[K$9t
+imYu`\V5[8cKF'!K9*BjEbKH/:jRA19iOuCKS"f,JqAJU:JY"ir_`hqL6Rl#OTCH'NrLHgc,%!&
+\%0&\[^<EIYd1L8XfJG#Vl$8aTUq^CR[BD+Q'.;oOcTI#"cJ7qLl.&XMLS8m9heAY:f("e;c?Xq
+<``C+>$G6;?=.,M@q9.`BPD6uDJjE5F*)SLH$XjdIt3-'KnkMBN/`m\P*D5uR@B_<TV8-VVPpMq
+Xfen6ZaI6O\\,Vj^r"".`lQ9Fbg+P]dF6Urf@\g3gtgiFi8WeXjlYail0@U$m-a?2nF?PLs76Ed
+p%A%Pp\jmeq>^<iqu-HlrUg)?s,d82~>
+JcC<$OoP(QrVc`nrVQWks7uWg!Vc<eoec=4o()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^-kF]9MJ@]:\7K[;=d]H;>rWP48M#149%A?3rh>>3WD,?48q8C4$#DarAss?
+s#U$;pf75m"BAK'<EK-"!*B,"rDiGgs&/tu;cEQk!`MupnjDP-lU1V;r`0#!rD`PjrD`es"]eW'
+<`W<#<WH4u<rZ8#<r?&!<rQ2#<rQ2#=SZ)#=BYW*rE0,(r`]G/?![G9s'Pb5!b#JEraGn<@fBp<
+AcH?BBDcI5C27X&D/O91E,fr@Fa&(UH[C-fI=?]tJqAW/L5CbENK'!]P*;,sR@9V9StVmSUnt#h
+X/rM/Z*LaE\%'#_^;.S%`5]pubSnXGb0/&UdF6\!gYUiHj5f@ckiqF#mdKfCrIt7S]5h=g?N+4S
+?=.!CSrS;@BOG%56s"DaIq1o7>rOPl2DQpK4?P>V2+U187fGgf3B/u`5!:qg4\\gP;,U:j;iq"_
+lE5_SA7,:A"CGG>>[.24'O+aE=^#!3=B\m0=&r7"<)lpt;Gd?is&/em!`)WhmnnR-9MJ5V:Jakb
+;H$Ln<E<1'=^#$7?!^lH@Uiq[B4u!pCi4-0EH?5FGBnL^I=Hd!K8#);MN!OUOckroQ^O>5StMdP
+Uo()jX0&P/ZEpsI\@K8c^VI_(`Q$!@bKS8Xd*^=lf%8R.gYCWAi8EVTjQ5OekiqBum-O0/n*olI
+o)J:bo_%nNp@nO\s7u]krVQQkrr)KgJcCi3J,~>
+JcC<$OoP(Qrr)ior;6Njs7uZhs7ZNerq/GHoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`PfX/^V+?8Q^b"VUSFW\V5C/hWVidqWs#N+Xfnr,Yl1g,ZM(X&[/.3/[eI9.PP^O<
+PPLFCQ2[*LQ2[*LQ2QsIPP^RHPE_;srKIAKQB_B4s3V&"da?LldaJ-A(Xgj`e^`1"eC)pse'ugp
+eC)doeC)jpdJ_GlcP"IJc-=GSaih`Hb/q]HaiV]Kb4\3X7.*GA6Md_^X8f74X/rG*YHP17ZEppG
+\%0)^]D9)S]tD"l^qde'`5K[9ai_fNbg"G[dF%j<rm:ntdEp4ddJ_E3dF6Uqe^rL/h;RASk3(sl
+lKdg(n*fc8nac;Dp&4Rip\=R\qYU3grdk*DrrVreoD\=Wrri&cWN+kTrtG+*^uhhdNL,f9US4;b
+@pcLGXfhZ*&Z]hQ>%;#K?<^X>`koO,^V7F@s"=<Dq"47Po^hS?mHNlujlGI\h;$f<g!nHrc-"2P
+aiMN@_nWpu]=GG\[C!<K[-tC'92,=ZInid9:f1+h<)lt"=BSd2>[:ZC?t*SUAS,UiC27[(E,fo?
+Fa&(VH[U?nJqJc3Ll%%LO-#NgQ'[l,S"?7GU84ZaWN*)'Yd(OA[^`l[]Y;.s_SjF6aND]NcHstf
+eCE1'g"P6;hVd>Oj5f=akNM0qlg4!*mdKZ8nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*2s*t~>
+JcC<$OoP(Qrr)ior;6Njs7uZhs7ZNerq/2AoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`PfX/^V*ojG'f"$KS95V!/CK.q2"p)rJK]ppPf&iq/P\=r,MCK")i-sE;aYaDfBW5
+DJu&8St2CASXc5LRh_KcS=Q4@SXc1@S=H.>S=Q.=S=Q.>r0n7dR@0A/R$j>.Q^F)*R$X))rK[GK
+p-[V'mR-t?rf-o9"cJ=uNK&nrNW"k?O-#KdP5UUEPlI$IQ2m3LPlI$MQ^RiArgWtZrgs(\!1s%Z
+oq;>Ys.]jqVPgAmX/i>'riQU4Z*L^C['d?N\@DOK0=\R(]"G\h]t_=t^r"%/a2uKHbg"M_eCE+#
+f\,!6h;@2Pk3)!pmI'K7p%S=\rdk*lrrgQa^q$uS[fEl9ruLUddDil0KS-;Nl/9:-OgB[ZBQ.f`
+H$FL,;c&.#r.5*%>#.pp;uTZ#;21@"P*(idOH0>pilf0M]",>]\[JlOZE^^<XfSV(W2HMgUS4<M
+R[TV1QBd\tP*(ibNK&mTMMd7JM=6<&92,=ZInid9:f1+h<)lt"=BSd2>[:ZC?t*SUAS,UiC27[(
+E,fo?Fa&(VH[U?nJqJc3Ll%%LO-#NgQ'[l,S"?7GU84ZaWN*)'Yd(OA[^`l[]Y;.s_SjF6aND]N
+cHstfeCE1'g"P6;hVd>Oj5f=akNM0qlg4!*mdKZ8nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*2
+s*t~>
+JcC<$OoP(Qrr)ior;6Njs7uZhs7ZNerq/,?oCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`PfX/^V*',852fUr_NGg!)`Mfq,-WZkY_:>q)e@4ofN17r]C-@rAjF0r]C-@s#L*Z
+!*8kpq,R`#=&r@'<`W<$<rH%r<<#r!<)rfp"B/9!;c3Kk!E2ni6ek)t6iKCP<W#hk;u]hn<<H9'
+='#<%!E`G%<q]Vp<rZ8#<rQ2#=Sl5)>$4s0='5B'!*]>*s'>V1!+5\4-=L:i@U`hX@UiqZAS#Ic
+B4kmkBkhF"CM[j*DfKc;F*2YMG^4X`rd?VQJ:W<)K8,/;M2I4NO-,ThQ'Rf+S=Q:GUnjlcW2Zl$
+Y->1;['mHS]"Gbl_Sa=4aihoPrlQ##cHstgf@f!<ioTCgm-aE8p%J.Rqu)3J.]dGq?sR&E?!^jR
+Y+:N"DeEB[7RU=#M1K/'79_f/0/YO<4Zke\2DmrmrC6fUs#:?G5X%=l4$657;GmEk!)o!Z#3De6
+B45.Qr*KD.s',J-"^5,7=^"u-=T2A&;c`is!E)bn;?'Mo;#X>k;"%6^92,=ZInid9:f1+h<)lt"
+=BSd2>[:ZC?t*SUAS,UiC27[(E,fo?Fa&(VH[U?nJqJc3Ll%%LO-#NgQ'[l,S"?7GU84ZaWN*)'
+Yd(OA[^`l[]Y;.s_SjF6aND]NcHstfeCE1'g"P6;hVd>Oj5f=akNM0qlg4!*mdKZ8nac8Bo`"Lb
+p@n=\q#C0iqY^6ir;QZerdk*2s*t~>
+JcC<$OoP+RrVc`nr;6Njs7uZh3qr@Ap%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V+B:R%(.[rhKapVPgAkWN,lss/c7&s/uC*ricC-rNc=,qm?=0rO27*!k=DV
+qigl>q31W=s-<YOqj.8IrfdSMOd2,rQN!0LPQ$dOPF%Q!Pa9hIrmC_ns3hG(e'ZOjdaQare^;gp
+df%W;dF6LldaQ^peC;snd*L"ccdC"]bf\,Ob/qoOai_`Ia8A<O7.<SD634*eri-X4XK8J(XKAY/
+Yd1RA[C3TU]=bfU]`>_C^&G_U^VI_(`5]j=b0%rQcHai6dK%bodK7nGd/;;kckY!XeCE+$g>(TE
+j5fCekiqC!mI'K4rp^0_oC_bKp&=Xhp\=U]qu$DDs.]Mpr:fg^nc81VrrrDqn>E5Crr4A=W5[l8
+QA_&6US4BR>@V$FYcY(0Y-"aD=^#9D?X6l@ZGsbs^q[UAs"=3Bp\"7RoCDA;lfdTrjl>CZh;-l=
+g!nHsc-"5Qb/_TA`5'+"]=PM][C!<K[-tDO92&#R9hnJ\:f1+h;cQk!='8[0>[1TB?t!MSAS,Rg
+C27X'DfKf>Fa&(VH[U?nJV/W1Ll%%KNfT?eQ'Rf+S"6.EU84W`WN*&%YHbF@[^WfY]Y;.s_SjF6
+aND]NcHsteeCE1&g"P3:hV[8Mj5]7`k32'olg4!*mdKTJnF?)?oCW%T!quB_rqQNhs8)Zjrqu`n
+p&9OBOT0h~>
+JcC<$OoP+RrVc`nr;6Njs7uZh3qr@Ap%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V*rkG'o(%re(9*r.b3+qM=s(rJLK1pl,-/nVdR0E,]grE;=M>E;OYSE!(#r
+E,YYos)7pV#]FU#Df0K4St5kNr1+:dSXc1?SXc7@SXQ%<S,Ji]R[fh:S"-&JS/%K^R[BS4R[9A.
+Q^F,+QC4,+Q^3r&r'Sh!n3d4Bs,?r8"cSG$N/`hrNrG(BOHG]iPQ$gEQ2d-MQi<<MQiEHTR[]fG
+S,f,ZScYOWT_G&ZTV;:V!MQ7cU&UkkUo(&hWiQ-$#d1D8Yd1RA['fnA!4Vm9/\/I(]Y(ql^;.S#
+_8O@6ai_iQcd:+ie^rI,g=tB;hVdDUkiqF#n+$#Bq"jr?s2k9Db/1m'\G`o9ruLO`cc*T,K7^,N
+lJfO0PI-EjB5^IiH$FL,;c&+"r.5*%>>J'r;uTZ";21@"P*(ifNW0(=bJ3td.(H[lZa-g>Xfeb,
+WMlbmUnaTTS"#k6R$X,)PEV/kNK0!WMi*CKMM^eZIS3@.9heAY:f("e;c?[s<``F,>$P<=?XR;O
+@qB7bBPM=!DJsN8FEMePH@('hJ:W?+L5:\EN/is^PEhH$R[]k>Tq\?ZVl?\tXfo"9['mHS]"Gbl
+_8=.0a2lEHc-F\`daZh!f@em4h;7&IiT&t[k2tmll0I^&mI'H3"n;'Qo(2MQo`Fj]p\ssfq>^<h
+qu6NlrUp/@s,d82~>
+JcC<$OoP+RrVc`nr;6Njs7uZh3qr@Ap%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V*!*85)`Tqb[8hpJCN[qblENs#L-Ar]9j:pc@n+s#U*=!]W5%r&ad:r&XmZ
+pf78lqc<_s!EN4p<rH%q<<#tp<!Q?$<)QXm;Gm?Zcp[@js$H`b!`Mupqc!Jns&B%uqc3Gm!*B)!
+q,dPr"'8N'<rH,"=SZ)$=BAW%=oMV(>81@M?=$uH@:3GK?=72NA7T1\@q0'KARoCcBP;*pCM[d&
+DJjB3EH-#@G'8+VH[L6jIt3*%K7ei2L51YDN/`j[PEhK%R@9Y;T;&-XVPgDnXKA\1ZEgmH\@T;c
+^VI_)`lQ<Hc-=JWcd:+if@ep7iT04gnF?,Cq>:/Bs8W*aRqQ5;?<gcA?=(CLRYcB/AmJP.6s+Yl
+Jn%,8><jqr2(LmT4ZkGW2Fp8+77B^876*=f5<V.k4$657;Gg=j;NLi"hkPO4@UEGJ?XI)E>[(H;
+>[1K:>?Y05=]eg/=&rF%rD`l!;Z9Pm;?0Pm;$'Qk;"%8192&#R9hnJ\:f1+h;cQk!='8[0>[1TB
+?t!MSAS,RgC27X'DfKf>Fa&(VH[U?nJV/W1Ll%%KNfT?eQ'Rf+S"6.EU84W`WN*&%YHbF@[^WfY
+]Y;.s_SjF6aND]NcHsteeCE1&g"P3:hV[8Mj5]7`k32'olg4!*mdKTJnF?)?oCW%T!quB_rqQNh
+s8)Zjrqu`np&9OBOT0h~>
+JcC<$OoP+RrVc`nr;6Njs7uZh621*Hp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]R.^:\<=S<g7\V5:&dVl6QnWW9*tXT,I&YPtd*Z2Cp'[/@?1[eI9,\-0@*Ocbh+
+PQ-mIPP^O=P6$o3r0.5IQN!6MQ3<G;Q'7I3P67)6PEPg-s-!PHQ'@R5dg+COdaHUmcdM^<$I[DQ
+f%&6te^DmqrmLhq*R`HcdF?Xmda?Cfcd0tddE^"\b0.uMb/h`Kai?cg7.N\GWiQ-#rN.KNYd(L?
+ZaI9Q]=bei^:h1l^:q@s^qdh'_8=+/`lH0Bb08,Td*L(fqpbSn!RfBndK%\nd/VMndh:0\f@f!<
+ioK4akiqBumI'H5nbr%Xo*k9ap%J+Rp\F[_r;HVGs.fSur:]aQo'u5HrrrAon"nG-rr4A>W8-LR
+QA_&8US4BQ?=I9HYHG%0Y-"a>=^#9D?=$i@ZGsbt^q[UAs"=0Cp\"7RoCD;9lfmWrjl>=XhVR&?
+f@JBtcH=ATbK.fF`PB4%]=PM^[^<BK[-tF&97BQ/9hnJ\:f1+h;cHat='/U/>?kH@?X[DRAS#Lf
+BkqO&DfB];FEVkRH@1-jJ:iN0LP^nINfT<cPa7])S"6.DTqeH^W2co#YHY==[^WfY]Y2(q_Sa@4
+aN;WLcHjndeC<($g"P3:h;@/LioB+^k3)!nlKdg(mdKW6nc/.boCV\Jp%J+RrqQNhs8)Zjrqu`n
+o_sFAOoKq~>
+JcC<$OoP+RrVc`nr;6Njs7uZh3qr@Ap%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]R.^:[fkH$P1&rIt-'!/L?*r/(E1rJTfspl58lrc%pWrG_gVrGh.Bs)A0\EH,r:
+rbhmXDf9OjE;shYD/aE3rgj(\s.'7`SXZ2IS-kgYSXuCBS"6%<Sc5,YS.D*[S"#t=R[]e8S!ob6
+S!s>D$C@-IQC!l'R$O")`^KAb!K2s5NWkK*O-#KdrKR,C!LB)MQiibFS"'AHs.':aT:V[Jq4Re]
+rL`qZ%&'DiTV/!QUSF]bWN6!"!3cC,s0Dm:[^NZS[f!Z8\Hf^X]=bej^;0`a+iMC@aN;TKcd:(g
+e^rL,g=t?7g"bKEjm)4#n+$#Bq>1&@s2t?Fp;k.a\[_XJ2n&bdrTi4__n<F1T"rhAikL&BZ]oB?
+DG5>$G]cbZ:kXLQJq8N*IooKC<`;mo;,N(4PEV,jOH'8Bgr[:BrOO,\[Bm0EZ*1:3XK/>"W2?Ab
+TV%aER[KP1QBmc!OcYQ^repu<MM[4Imu%-<IS<I1:/=\_;,U=k<)lt#=BSg3>[:]D@:E_XAS5[j
+CM[m,E,fr@G'A4XI!pKpK7nu7M2I7PO-,TiQC+)0SXuLJUSXleWiN8*Yd1UD\%0)_]t_A"_o9X:
+aihoRcdC1jeCN7)g=tH>hr*JQj5f@bkNV6rlg4$,n*fc9s7-Edo^qhLp@e7[q#C0iqY^6ir;HTd
+rdk*3s*t~>
+JcC<$OoP+RrVc`nr;6Njs7uZh3qr@Ap%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]R.^:Zj)8kVoWqG@/gpJB77r]:$?!':'?!':'?pH%n-rAsm;r]1$>p,W18r`/u!
+s&B&"r)N\p$<:,-='&F&<`N.$qc3c"<`]0!qc*Ppr)<o"<)Zap;Gfg$7.N_F;Z9Vp<;T\o<;';l
+<rQ2#<WZ9%=8l=u=8u;%='5H's&f2%rE/br"'So5?2\./@/jR<?t!MUAn5KPAH-6@AdE$_Bk_<s
+CM[keDcLarEcQ8EFa&+WI!pHnJ:N6(Jq8K)KSPGDNK96dQ'Rc)S"61FU8=`bWN*&$Y-5(8ZaI6O
+]"Pkn^r""0aNMiRcd1"fe^rI/hVdGWlg=66pA+UbJcG]K5`fSe?=$lA?<pjNWgSZgD.HpS78@H>
+Ne:n0;-QFC/N#%B4?P\\2)Iil7n#j;77B-p3^5ek4$,Q!;,U=j<)SeW"PTGlB4LpIs'Pb2!*fG-
+"'\r3>Q.e+=oDJ&<rc1u<X_r.<)ZRi;c6Ii:f:0i;"%9]97BQ/9hnJ\:f1+h;cHat='/U/>?kH@
+?X[DRAS#LfBkqO&DfB];FEVkRH@1-jJ:iN0LP^nINfT<cPa7])S"6.DTqeH^W2co#YHY==[^WfY
+]Y2(q_Sa@4aN;WLcHjndeC<($g"P3:h;@/LioB+^k3)!nlKdg(mdKW6nc/.boCV\Jp%J+RrqQNh
+s8)Zjrqu`no_sFAOoKq~>
+JcC<$OoP+RrVc`nr;6Nj!;ZTg!Vc<eoeuI6o()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*Bq\bK7fD`59@*^:\<?SWp:WVZ*LnW;rssX8]1%Xfei)Yl:p-ZM_'+[/.6-\,Wr<\c'&6\H'5>
+OoLUDPQ$dHPPUI<PP^RFQ'VE9rKdGH#*kF:PEh>srKIVNPa%ArPL\.2ec+#1da?Ljda?LldF$:h
+dF-Lme^i=NdNR#fdF?UkdaHUmdEp:idaQRicdL.ccHXYXbK7rMbK.iL_aO)`!^`uir2h$DZ*L^C
+[^`o\]Y2%n^V7Fs^qmk(_o'F1_o0R8aN=G*s31\ndF-LnqUPVq!n5TFrR1_nrQtMj(=Udbf\GEE
+jQ5UilKmp+mdK]9o'u;BrpgNio_%qOp\4L[qYU3irdk*FrrMrhrpg*Znb`=hqt$h`ci*k[p8?g.
+b+=KWBVM2nSnDJ;YHP(3Xf\\*r`T_=@U<AF>dDAe_8!e"MuPF*q"ORWp%%_Bmcis!k2t^_hVI&C
+f[n[%dE]t\c-+2M`l5d.]t:ne\@&]O[C#D1IS*7,9heAX:Jakc;c?Xq<``C+=^,-:?=.)L@Us%^
+BPD6tD/O<4F*)SLH$XjdIt3-'KnbGAN/`m[P*D5uR%'V;T:r$UVPgGpXfen6ZaI6O\\#Pi^r"".
+`lQ9Fbg+P]dF6Urf@\g3gtgiFiSrnYjlYail0@U$m-a?2$h3]Wo(2JFp%A%Pp\jjeq>U6hqu6Nl
+rUg)?s,m>3~>
+JcC<$OoP+RrVc`nr;6Nj!;ZTg!Vc<eoelC5o()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*Bq\bK7fD`59@*^:[ckH?k:$rIt9+r.k0*r/(E1s,6*"s,@#=oo/s3rG_^T!-%mVs)@sWlYulD
+rbr'[E,]`6E,YYn#&\C!DfBWdqOJ4gSXc7@SXl:@R[ot>St2FDT)P3&R[on<S!oh9S=?":S",t<
+S"#k:R@0G/R?s;,R$X2*Q^GZYo0WLEqMkoDOHGWeP*D5sQBqH6!1*VN!1<\Ps-itWs.'.[rgj%\
+!20=bs.]Fb!20=`r1G(&TV8*STV/!QU8+Q`WiN8(Y-+t5ZEggD[C3NQ\,Ei:\c02?]DoPD^*US2
+_SX:3aN2KGbKeJ^e'ut#f@\d/f@8C)hW3nemdTf>pA+UbJcEmm"R=%E]"%aKs0ht-2#6@gbegrF
+JY0s:lf>j4Wj8"6AoCXoG^+@3;GVt!JV&K)Jq$Kk:f^Lm;Gg;GQ'@JpOH>J%/)&(X]Xk_d\[T#R
+ZEga=XKAS(W2HSjUnXNSS=H%:R$X,*Pa%8lNfB!WN;\V8M2I/[MLJ/j9MJ5V:/=\_;H$Ln<E<1'
+=]ns6?!^lG@U`kZAnYmoCMds.EH?5FGBnL^I=Hd!K8#&:MN!OUOHPinQ^F84StD^OUo(&iX0&P/
+ZEpsI\@K5b^VI_(`Q$!@bKS8Xd*^=lf%8R.gYCWAi8N\UjQ5OekiqBum-O0/mgJXTo()DDo_%nN
+p@nO\!;ZWjrVQTlrVcBfJcCl4J,~>
+JcC<$OoP+RrVc`nr;6Nj!;ZTg!Vc<eoec=4o()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*Bq\bK7fD`59@*^:Zm+8kMkT:]OAe;"mib;!UsY;Y3ib3rM,?3rM/?3rV583q>B23rV/33q65K
+<!$'#<rQ2"<<H3$<`f)tr`/hps&K"s!)rkr!`N&s_aO)`"%#pb<;oqt<<-"t<W?%r<W?+t<<lQ+
+=&r=$<`f9&!EiOt=8c5$=o;Cp=Tho4>[:\8?i=C2@0'hIra]YOARo@`AnG^iBk_<sCMdp,E,]f;
+F*)PIG'A4YI!pElIXcm!J:DrqJVAr>O-,ThPa%N&S"64GUSXidWMuo!Xg#(:ZaI9O]"Geo_8=.2
+aNMiRd*^=mf%]$=j5fCgmIBiBqY^>Ds8Ds`l@ibU?<piC?<gdLWg8B`CgpX>78RTGNJ1t2:g-CF
+/N#1G4Ztnc2)I`l7Rfm;77K'm3^,_j4$,Q!;,^Ck<DnnX%+LhmB4>7T?X@&E?<mJ6#@(G:=^+s1
+>5_S'<tAD2<E<.!<E)mn;,gCh;,I6hm8/7(92&&S:/4S]:f:4j<)lt#=BSd2>[:ZC?t*SUAS,Ui
+CMRd)E,fr@G'A4XI!pKpJqJc3M2I7OO-#NhQ'[l-S=Z@HUSOcbWiN8)Yd1UC[^`l[]t_A"_o9X:
+aihoRcd:(geCN7(g=tE=hVdAPj5f=akNM0qlg4!+n*^YRnac8BoCV_Kp@e7Zp]1-hqYg<jr;HTd
+rdk*3s*t~>
+JcC<$P5k1RrVc`nrVQWks7uZhs7ZNerq/,?oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bK@oH`PfX0^V.9uMOp'8ri#gq!ii<%r2^%'Y-+t3r3?:-rj2O0rO)U4r3uR5qRQC4qiUoA
+s-*DGqiUuDP51=<Pk^OQQ'7JuPEh>sQ'@PuPl?jKPgIq.rmM8'e'laodF-Lle'ZPAd/qeDeGdoA
+eBu^me'c[odaQXmd*pIjd*g@kd*L%dd*Kt]bg+>Qai_cL^I7]]riQ4($F-nC[CNiZ]=kqnrkKGe
+^qmn)_o0L4`lH-@ai_cLbg"GYcdC1he("<G"P2,ReC4<C!7C\jrQuD0f%Aa7ioK4blKdg)mdKW7
+nac5@o(2kO#5%T^p@n@XrqZ]orVhBJV#LJkp&=O^nGE4gq=1DZci*kkpSQg.c(&1.B;;/nS7c9;
+Z*(44Y-"h,=^#$<?s[/D>dDAf_8!e"MuPC(qtKmZp%%YAmcs$!jlGF\hVI#Bg=Oj&da$.ac-4;O
+a2Pp1]t:qf\@/fQ[dLO)8kVkW9mTQ1:f("e;cHat<``F,>$P<=?XR;OA7]@dBPM="DK'T9FEMeP
+H@('hJ:`E-L5:\ENK90aPEhK%R[]n@Tq\?[Vl?\uY->1;[C3TU]=bkm_8=12aN;TJc-F\`e'uq"
+f\5'7h;7)JioB+]k3(smlKdg'mI0N5nc&([oCW%T!VZ9dq#C0iqY^6ir;QZerdk*3s*t~>
+JcC<$P5k1RrVc`nrVQWks7uZhs7ZNerq/,?oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bK@oH`PfX0^V.9fDgQbbre:?+s+gK-q2,-/s,66&oSrX+s)7jTq/Q@Prc.4Bs)A6^DfBZ6
+E,Y_p!c`0urbhjWR\'JK!1a%Z#G.HVSt2ICS,Sp"SXZ7BS=H.=S"#q;S"6%=S"#k:S=5n9S",t:
+R[fh7rg*hWQC!o(Q^GNUoL&V<s,R/ArfIDKPa.N"Q^@W9!1<YO!LfMWS,o+LrLNt[s.9:arLj4c
+qk<hY!hZ-Zr1O(`'V_@uVl6YuY-+t5Z*L[B['d?N\$u=Gs1/0@rk&3C'>D5r^qmt.`lQ9Eb0/#T
+dF-LneGe#1f@AC%g"kZNlg=04o_&"Vrdk*lrr_,t_Rf]T34?6ps7ka-ahYH?JY:-Gmbu!5Wj/%8
+95d^RG^+@2;MKjWK7\]-JU^Bj;-$Un;Gg;GP`q;nO-#A$/D%qT]Xk_c\@8iOZEg[:XK8J'W2HMh
+US4BRS=H(;R$X,)Q'@DoO,f0YN/R[m!f;eknVRB?92,=ZH;774:f1+h<)lt"='8[0>[1TB?t!MT
+AS,UhC27[(E,fo?Fa&(VH[U?nJqJc3Ll%%LO-#NgQ'[l,S"?7GU84ZaWN*)'Yd(OB[^`l[]Y;.s
+_SsO9ai_fOcHstfeCE1'g=k?<hVd>Oj5f=akNM0qlg4!*n*fc9rpg*]o`"Lap@nO\s7u]kr;6Kk
+rr)KgJcCl4J,~>
+JcC<$P5k1RrVc`nrVQWks7uZhs7ZNerq/,?oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bK@oH`PfX0^V.9K8P2TNr_WJhqb[&bpJB^Ds#L$=q)eO9r]Bm9nN6\1!'0s<!'C'=!`W0!
+r`&qtr`'2(<E3("<`N/u;ufqs<WH4u<<-(u<W,tt<Vo_q<W,ku;cH]p<51in6i0m`<;fhs<rH%u
+<r>to<WH5#=T;P&=T;G&=Su8#=Su8#=TDS"=o;G)>?kJ5?34JA@/XO5@K9s;A,g*>AcHBABE`*b
+C27[(rbhmYEcZ@%FTcl4H@(&=I/ncrJ-g[QIt<<1N/s*arfdt\R@Be@U8+Q^W2ckuXKJb3rj2X3
+*k8eo^r++1aN2KHc-Xqhf%Aa6ioK7dm-jQ?q"t!gJcG]K,M.<R?s[)E>[1Q?]Vq*JFD5&c7RU0k
+LQ@(#5u1]W1F=q355mY_2Ddup77Tg;7R]d&3''5e4Zkeg9i4hd;H-PTrsd>AF_+ug?=.#F>[:Q<
+r`oJ,"C#,6>?Uo,s&Tk9;H6au;cH^p;,U=i:f1%e;Gg6X:]a6^9`@b4:/=\_;,U=l<E<.%=]np5
+>[CcF@:EbYAnYjmCMds.EH6/DGBeF\I=?]uK8#&9M2R@SOHPfmQ^F52StD^NUo(&hWi`G.Z*UjH
+\@K5a^;%M$`Q$!@b0/&Td*^=le^rI-g>(N@i8EVTjQ5OekiqBum-O-.n*olHncA@Srq-<cp\jme
+q>^<hqu6NmrUg)?s,m>3~>
+JcC<$P5k1Rrr)ior;6Njs7uZhs7ZNerq/2AoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`P]R.^V.:"N1uT>WN#irqlBn%Y-5&.YQ1s+ZN%9/[/RK5[f*]4\GNi-\cBA=OoCLD
+PPpaGPPp[=PPUODQ2['NPa7X7PS97GQ'7DsP*D5rPE_<]daHXndF8*C"4PcJe,@],e'QIhdEg1f
+d+$RoeCE$re'n6C!mf<ArmUnp%ar_Md*L%`c-4GWbK7oL]0u?[%Bm%BZaR?Q]"G\i^qmkd_Z.CU
+_Sa:0`Q$!uaT]i1bg"J[rm1hrdaHUneGIeqeGdkte'cVAd/q\?chu0;e(*+)hVmPXl0@X&mdKW6
+nac;BoCMVFoCV_Kp@e7Uq>1!cr;HVGs.oZ!p[n%IoC28Hrri)bV5)fDs!R<3h;lnP@$bK%TqIrg
+@C<DDXfnk.XfGT/>@CoG?<h*J`l5d/^qPa,/GT&8p\"1LnaGi/l0%0gio/bMgt:60eC2jlcd9t]
+b0%iF_n`ps]XbM\[^PS2InE@,9MJ5V:Jakb;H$Ln<`W:(=^#$7?!grI@Uit]B4u$qCi402EccGJ
+G^=^bIXm!%KSG8=Mi<[WP*;/sR$sM8StVmSV5L;mXKA\2Za@0M\[oGf^VRe*`Q-'BbK\>ZdF-Op
+f@S^0gYL`Di8N_VjlY^hl07O#m-X60mfi4No()DErq-?dp\4[^s7u]kr;6KkrVcEgJcCl4J,~>
+JcC<$P5k1Rrr)ior;6Njs7uZhs7ZNerq/,?oCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`P]R.^V.9gDgQecrJ(?-reU9)regZ4o8N@%nW*TerG_RPr,DXTm;N&Dr,<<fE,]`6
+E,KW7E,T]7SXc4@SXc8MS-,=RSY#eN&Y>J]S=H%;SXc:BS=Q4@S"-#HRf]"IRf8iWRgtsXR[]b6
+R$X,+R@';,Qb,ZZ6iN,HOoCLFPEhI4Qi<BPQNNVCR@=&CrLEeV!1s+\qOmh]p7VGXrh0:b'V_@u
+V5UDqY-+t5ZEggD[C*HO\@DLJs18-@s1JcR^VIY$_o9X9aNFM*!mT$9rm2>+dacq#f\53@k3MC%
+nFQ>Iq>C2Bs2t?Df>YP8rjVp9,IRROp#FTD^:8iHWQso%g:Dg6ZCZ/3E)V(.G]m(bLP:A3K)U<4
+Inig;<`;pp;-&F9PEV,iOH0>oqUNTu]=YYb\$iZNZE^U9Y,n\'W2HMgU7n9RS=H(<R?s8+Q'@Gp
+O,f3YMi3INre^]4nVVfg91qrQ9hnJ\:f1+h;cHdu='/U/>?kH@?X[DRAS,RgC27X'DfKf>Fa&(V
+H[U?nJV/W1LP^qJNfT?eQ'Rf+S"6.EU84W`WN*&%YHbF@[^WfY]Y;.s_SjF6aND]NcHsteeCE1&
+g"P3:hV[8Mj5]7`k32'olg4!*mdKTJnF?)?oCW%T!quB_rqQNhs8)Zjrqu`np&9OBOoKq~>
+JcC<$P5k1Rrr)ior;6Njs7uZhs7ZNerq/,?oCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`P]R.^V.9L8P2ZOpJLlcqbco\i)'JPr]0p<q)eL8r]Bp:nN6P-!]`;'rAk-_<`W4#
+<)ros#ZXo*<`N+!<EB*!r`&nt"BJT)='"fjoi(uk<)gItp-\^Wqc<_sr`02&<)lt!<W6#'=&r@'
+='/T(=oVUo<s)Q-=]kZ+s&o_3=BJa2>?Y37>lJ(0?iOL9@:E\SraPk:s()(>s(D:D>\RtiD/O60
+E,fl<FEMbLG'A4XH$O^^H[L<nJ:W?-M2dUZOckrnQC+/3SY2[PV5:,iX/iA*Y-5+9Z*UaD\\,\q
+`5BR4`lQ?Le(!%(gu%,PkNV=#nacAJqYc!FrVn^kF(/N_?!^c@>@"h;OaqIb?<K`d=`TOeI:5B9
+>"pb!1bV$U4ZkV[8Ol3;7R]a87Q*4er]^<D##/#p;,U@kO8fm;Q#gJD?=.#E?<gc?>[(H;>$>/0
+=oqi/=8l;.='/C$<`W0u<E&lp"&Vrm;#X>o:/=aV:k))192&&S:/=\_;,U=k<*!%$=BSg3>[:]D
+@:E_XAnPdlCM[m,EH6/DGBeF\I=?]tK7nu7M2R=QO-5]lQC+,1SXuOLUnsugWiW>+Z*UgG\%0)_
+^;%M$`5Td<b0/&Td*^:ke^rF+g=tH?hr*JRj5oFckiq?tm-O--n*^GLnac8Bo`"Lbp@n=\q#C0i
+qY^6ir;HTerdk*3s*t~>
+JcC<$P5k4SrVc`nr;6Njs7uZh4SSRCp%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8<DIgtLH5f@AC!
+dEg+^bK7iF`P]R.^V")sM5QZ?WN,ruriH.%riZ:*r3?4+!42[3s0_j7s0qm8qml=0qRZd@OSFt;
+P5UXEPQ$a?PPLICQ2HsHPld/7Q2Zs`P*D/oe'cardF-Fjf$`$rdF?[ndF-Llps9;pdF?are'cUl
+rmLhq%arhTda6CicdC(cd*L"_rm(YjbK9->ksaZ$p-T1p[^`o\]Y;4u_o)Dj!5nfS$-($-bfe/P
+c-O`8d/MGmdf.\qeG[nteGdqodf7\od07nBcHX\^rm;>,e^rL1i8j%blKmp+n*ff;oD\C]p&F^d
+p\+U\#5J#jqu$ElJcDPG#6+;do'u8>qu6j!p?n]Mo_ne&l(d=ud@=j8AYu2oS7Z3;Ycb/.XV%Y8
+=^,*<?s[/EHEtQ0_8*h"MuP@&q=jXVp$hG:lfmZsjQ#1VhV?l=f@JBudF$IlcHOGRai205]t:qf
+[^W`QmBusdInNI09hnJ\:f1+h;cHat='/U/>?kH??X[DRA7]CeBkqO&DK'T:FEVkRH@1-jJ:`H/
+LP^nINfT<cPa7])S"-(CTqeH^W2co#YHY==[^WfY]Y2(q_Sa@5aND]McHjndeCE.%g"P3:h;@/L
+j5]4_k32'olKmm)mdKW6nc/.\oCW%T!quB_rqQNhs8)Zjrqu`np&9OBOoKq~>
+JcC<$P5k4SrVc`nr;6Njs7uZh488IBp%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8<DIgtLH5f@AC!
+dEg+^bK7iF`P]R.^V!]XDgm"eLAco-M"uo*MYrD,N:i1rNr<nnE;FSOE;sqDE;abXDfB[pD\m;1
+Df;2;St;FAS"61ASXl7ASt)=ASt5YG#b@KVSt)=?R@O8Gs-sRgS=H(;S",n9R[]e8R@*uA!go=?
+m6p2-j@&]/"d+t2PE_C4Qi<BPR0&hFR/WQRRff1MS"0JK!hPsRrgs"Znt5uVrh'7`r1O%_';D7u
+W2Zi"YHP4:Za7$H[C<WT\G`u<]D]Al]tV7q^VIY%`5]g;aND]Mbg"DXc-FY^dF-Osgu%,Ql0Rg+
+nalJKq>C5Cs2t?Id_il0\%&lS[f6:`oAS0<]siTC][ulVe$OP+YFor7Dc1n+G]d"`L4b,1Jq8N(
+Inrm;<`;mo;.G?GPEV/jOH0>Bp!q%[]G.oc[^<BHZ*1=2XK&7tVPU)_TqItUS.M-VQ^<u&P`h/i
+NfB$VMi*AjM?&M'MZ6:u92&&S:/=\_;,U=k<)lt#=BSg3>[:ZC@:E_WAS5[jCM[m+E,fr@G'A4X
+I!pKpJqSl6M2I7PO-,TiQC+)0S=ZCIUSXleWiN8*Yd1UD\%0)_]t_A"_o9[;b0/#ScdC1je^i@*
+g=tH>hr*JRj5f@bkiq?sm-O--n*fc9s7-3^o`"Lbp@n=\q#C0iqY^6ir;HTerdk*3s*t~>
+JcC<$P5k4SrVc`nr;6Njs7uZh3qr@Ap%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8<DIgtLH5f@AC!
+dEg+^bK7iF`P]R.^Uum$84lQNm8<USi_fML!''s<rAs^8q`=a=qE"1/!'L6Bq`4^;r]9sW$!(#*
+<E)su<*!&u<W,ns<W5r)<E<+#=&r@$;cH`i<<?-"<;fbq<<#tu;ufka7-R/$7.rtJ=8Q%u=8l5'
+=&r@%<W,ts=8u;&='/T'=Thi.=&i9"<rcA%<rcA#<s)Q-=BPQ*!ErY*<ruN/>lIn5>[:WA?XR;M
+?t'"Cs'l.A@q9-KB)cNCB`DcSCM[j*DJsK6EcQ8ErcTK0G^4RZH$OaaIt3*)Ll.1ROcklkPa.Q%
+S"-(BTqeH]VlBWq"0AW.Yl:p1[(*`^rk]Mj`Q$!Bc-b(ogY^uMjlYdklgF64p%S@^JcG`L6*G-5
+?sHrB>?kIX\YY@9Eb/NZ7RU^4QC`;)5$;#a0e,"54Zb_f2Dn&p6q'R76q'R'3''2d4Zkhl9iP%g
+;cHYUrr^6%E+JoS$=-tC>ZtB:?!LN;r`TS1=BAO*=]ea-rDaD.;cQ^o;,U7h:este:esnbn50-W
+InNI09hnJ\:f1+h;cHat='/U/>?kH??X[DRA7]CeBkqO&DK'T:FEVkRH@1-jJ:`H/LP^nINfT<c
+Pa7])S"-(CTqeH^W2co#YHY==[^WfY]Y2(q_Sa@5aND]McHjndeCE.%g"P3:h;@/Lj5]4_k32'o
+lKmm)mdKW6nc/.\oCW%T!quB_rqQNhs8)Zjrqu`np&9OBOoKq~>
+JcC<$P5k4SrVc`nr;6Njs7uZh488IBp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iF`P]O,^:\#sMPurCWr/suXTGZ/YPtd&Z2V*/Zid_E\$u4DrOMU4qRcU:!POWpOSP%=
+P5gaGPl6gEP51=>PQ6pHPlHsGPol6UPa.JuP*;&mPge15e'caoeBu[ne'c^ndaQ[kdaS3B&^ShP
+cdC+ddF-Ole'l^me'ZYDdM(!Ue'c[jdF$Chda$1cdEg%\cHl/OfL>'npHo7u]Y;1t_o9U7`qdXW
+b0/&TrQbJjr6bGjs3q"trR:\ms3^hm*RE*YcHXSVbKeG\dF6Urf\GEGkNV=!mI'K5nalDNp&F^n
+p\=OZq"ad_qu$ElJcDMF#5n5go'u;@qu6fup$SO#r;RS4Zh)MdUM#m(V4sTPARMpNY->%1Y,nW%
+>7=qJ?=$p&a2Q$7^q[XBs"F0Dp@e1Nn*fZ0kih0iio&bNh:pT5e^DmneCE!lbf\/O`P]L*]=kbc
+\$i]N[^>P3s%3;b9`@b9:/=\_;,U=l<E<.&=]ns6?!^lG@U`kZAnYmnCMds.EH?5FGBnL^I=Hd!
+K8#&9MN!OUOHPinQ^F84StD^OUo(&iX0&P/ZEpsI\@K8c^VI_(`Q$!@bKS8XdF$Fmf%8R.gYCWB
+i8N\UjQ5Oel07L!m-X60n*ol<o(2MGs7QEc!;HKfs7u]kr;6KkrVcBfJcCo5J,~>
+JcC<$P5k4SrVc`nr;6Njs7uZh488IBp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iF`P]O,^:[TXDLQqdLAZl*M>)o%N:r7nNr*blE;OYADuahUE;skSE&2KQEH#l7Df0K4
+SXuFDS=Q1@S"#t>S=Q1?SXl7@St)=?R[]h9S=?"<SXu=@S=5q;R[jAH':PD\S"#h8S",q;R@9V8
+R?s8-Re9)$7I!;86PP`KQ'[l*R@0M4S!oh9R[T_9SXc5LSHtaVSXuFDSXuGHTDYA]TCnlTTb*up
+Vl?_uY-G:<Za@-K[^`jG\c98@]DoSD^AbkT^r!t+`Q#p<aND]MrlkGgrm)5(dF$Clf\GEEk3;:&
+nauPNqu)*Gao;Xk_nERh\$`WQrr4hGiR5`Y[=Osni;`2iL5N^:SpO@S;L3S4F]D:nKS"f.JqAN'
+:/Fbf;c6LjF-W&TPELuhNrKmce&/i5]=b\_[C*?HYHP(/X/`+qVPX9d&YGVaSXl4:Q^<u&P`h2k
+NfK+uMuSY9M27#YMZ69L92,=ZInid9:f1+h<)lt"=BSd2>[:ZC?t*SUAS,UiC27[(E,fr@G'A4X
+I!pKpJqJc3Ll..NO-#NhQ'[l-S=Z@HUSOcbWiN8)Yd1UC[^`l\]t_A"_o9X:aihoRcdC.heCN7(
+g=tE=hr*JQj5f=akNV6rlg4$,n*fc9o()DEo`+Uap&Ojdq#C0iqY^6ir;HTdrdk*4s*t~>
+JcC<$P5k4SrVc`nr;6Njs7uZh3qr@Ap%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iF`P]O,^:Zd#84lQOnPSpTqGI8hnPSpV!`;iUr]'p<rAsa9nN-S0!'9m:s#g<Cs#L9C
+3]T5^qGdf%<E)su<)lmsrD`hupJ_H!<`W4$<`N*u;u9Pi<<-"s;Zp&u<)clj7+arn7/'(H<WH5"
+<WQ9%r`8ksr`K2's'#D)#$=r.<`W:'qcEi$q,dVur`K)"s&o>)$X6kA?=.)K?smDP@fBm:A-caW
+AnGUcB4u#YCB&&ZCi+'.DJsK7F*)PKG^+N5H67K[I!^9kIt<</M2[LWP*D9!R$sM7StMjTVPgAl
+WiH'"s/dWOYdLsN]=kqo_SjI7bfn>WcdL=pg>1`Jk3(snlg=03o_84[rr%EJ"TP-/?s`h;3a,`m
+c+0U1IrJt)=@H&#K:e3F7mLWX9/J(S/j;BZ4Z5/g7R]d977B[83'0/b5!1qj7oWGd;H$OnO8fI"
+N,E-3?s[4>>n:.F>Zt?9=^,'6>$4s.=]kZ)s&T/"&QDb0<Dujo;c-Ii:f:1g:/FaU;#a,g92,=Z
+Inid9:f1+h<)lt"=BSd2>[:ZC?t*SUAS,UiC27[(E,fr@G'A4XI!pKpJqJc3Ll..NO-#NhQ'[l-
+S=Z@HUSOcbWiN8)Yd1UC[^`l\]t_A"_o9X:aihoRcdC.heCN7(g=tE=hr*JQj5f=akNV6rlg4$,
+n*fc9o()DEo`+Uap&Ojdq#C0iqY^6ir;HTdrdk*4s*t~>
+JcC<$PQ1:SrVc`nrVQWks7uWg!Vc<eof)O7o()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:[osM5cuBXK;E's/l@*rNQ4)rj)R1s0Vd5!k,SIqmcO6qmu[:qRlX;s,m2?
+qN:f@!L&cFPQ-gDP6-o2PP179PnK=FP`h9^e^`7"e^DmneC;mme,IepdfRnEci)2jci297cdC.e
+eBuXldF6OldF6Fie'laocd:(ddEp1ccd'k_bg-#Pcpd7gpd52#_SjF6rlP/^%EZc8bKJ,ScHjh`
+d*^89dK@nFda@p<s3^kn+j\HZcd0n]bfn8Qb08/Vd*^=lfA#3Bjll!qmI'K5nauJQp&FacpBp]k
+q>0sbr;HTnrdk*Drs&>op@@hGo)&Fir:KEMdf'1nr2@U1T<=GkQ"?hgT:BD![^!!?Xfeh-WENM0
+?sm;I?*hSj`PTF+MZ<_Q/beu2oC),6lKRKojl,.Th:gQ7f@86se(*!rcHXPWai2-4^:V(j\@8oS
+[C3I3[JrjK92&#R9hnJ\:f1+h;cQk!='8[0>[1TB?t!MTAS,UhC27[(DfKf>Fa&(VH[U?nJV/Z2
+Ll%%KO-#NgQ'[l,S"?7GU84ZaWN*)'Yd(OB[^`l[]Y;.s_SsO9ai_fOcHstfeCE1'g=k?<hVd>O
+j5f=akNM0qlg4!*n*fc9rpg*]o`"Lap@nO\s7u]krVQQkrr)KgJcCo5J,~>
+JcC<$PQ1:SrVc`nrVQWks7uWg!Vc<eof)O7o()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:[QXDgm"dLPPb`pko!-q2G!+k)TFZrGDURqJcCQs)7sVpi$4Omr82E"E89u
+DK,TH$D3l[S=H(>SXZ(=rg`tY#Fq?SS",t;Rf8cVRf8ftSsu.<R[fk:R[fe8S=H(=R@9V6S!ob7
+R[KV4Q^IS:cpd7gpd51NR$j>0rgNeT!1`nV!1s.[qk!eZs.97]".YpRT)>5\T)5,\TV).Tr1Oat
+Uo(,lXKJb2Z*LaE[^WcV\[h^N0>"m0]tV7r^qmh&_Sa:0`Q#s=ai_fNc-FV\d*U1gda?LkeCN:+
+h;RGXm-s]Drdk*krsAPF`P&gk\@&`Orr4eFiR5]W["+jikPshgK9X<!J8J/%;L3V5F];4nKRn`-
+JqAN':/Fbe;c6LjL6\'gPECocs"Nif_S*[p]XYDXZa-m@Y,n_)WMcYjUS=KVT:DIDSXGn5Q^<r$
+PEM#eNf8mTMi*GlM=HK'8q0K-9MJ5V:Jakb;H$Lo<`W:)=^#'8?=.)K@Us%^BP;-rD/O93EccGJ
+G^=^bIXm!%KnbD?Mi<^YP*;/tR$sM9T:r!TVPgDnXfen5ZaI6O\\#Mg^VRe+`lQ9EbK\>ZdF6Uq
+f@\g2gtgiFi8WeXjlYail0@U$m-X91nF?MK!V>s_o`=d\rV6Egs8)]krVZZno_sFAP5g%~>
+JcC<$PQ1:SrVc`nrVQWks7uWg!Vc<eoelC5o()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:Zg%7nQKOohk0Ss&&Meqbc]Xs#L!:!'1$>q)e+-niQh5s#^3@!BE4><rH#%
+<*!%!<)rosqc3Ais&BY3<E3("<E)pr<E)pt<E)st<;fhs<;oet<)Zcl7*nBg7/0.J<rH%r<WZ?'
+<rQ2"=9)M$=ohc.pK%>srE05)=&rB#=8u>!<rcA%=oMV,>[Ce:@0U+J@q0%ZA,^'>AnbmiB4bdi
+Bk_?uCi4*-DJsE1DfKf>G'A1UH$Xd`I=-HmJ:N-!JV8`4M2R=SPa@i0T;/9\Vl?_uXf\b/Xfek4
+ZF%$M]YD>%`Pop@bg"M_e'lgtf\5*:iT'%_l0I[&n*ouDq"jsgJc@;$P\=H/>[1K;>$B1]UQ0_@
+A6i;+;J1ijMeb^LD)aI..PrbA4Zkkb2+U5+qaLiN3BBAg4$5W"r`&nq!*,*[&c9.sCh-p[?=7)F
+?<^Z=>[1J3>Q7n,=T;G&=T2A:<E<.#<)cmt;c?Ok;,U4e;Gp=f:JgOVs%7c69MA/T:/=\_;,U=k
+<E<.%=]np5>[CcF@:EbYAnYjmCMds-EH6/DGBeF\I=?]tK8#&9M2R=ROHPfmQ^F52StD^NUo(&h
+Wi`G.Z*UjH\@K5a^;%M$`Q$!@b0/&Td*^=le^rI-g>(N@i8EVTjQ5OekiqBum-O-.n*olHncA@S
+rq-<cp\jmeq>^<iqu-HlrUg)?s-!D4~>
+JcC<$PQ1:SrVc`nrVQWks7uZhs7ZNerq/8CoCDJBnF,i6mHj3)l07Bnk2bR^iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX0^V.9kG)3)eVld)(r3$+)rNZ@-rj2R1rj;a7rO2d:p::47rO`!?o"G!as,d8A
+rfHu=!0[,@!g8b2rK@2ErfdDJqNUuE&<iBDQ'@JtQ.=C6e^N(#eCFNG+jnffeC)dkd*^=kdaHLh
+daHLhda6=ddEg:jdaHUjda?MAciVYBd/M>odEg1dci)5g7.Wk/7e9(87/91O`Q$!uaq)\>bKJ,S
+bg"DYd*L%bdF%sArmCborm:hpcd'c3c2Puhc-6.2s2u8%bK@uLbK\>XdF-Ilf\PQKkj%L$n*oi;
+rUUBhpA"IZqYC!bqu)*GSc8ojq"OIPoC;_X"TJ%jT@Ei>-ha@_oW4aHR$D6ZUn=&b@(3AEZ)k+1
+Wi0-+>$t`E?<skX`Poa1_2J=DrqZHbp%7kCmd03$kiLpci8<DGf[nX%daH^se'H:_bKS&I_SEmu
+]t:b^rNuX4n?r9gs%@f79heAY:f("e;c?Xq<``C+>$G6;?XI5N@qB4aBPM=!DJsN8FEMePH@('h
+J:W?+L51VDN/is^PEhH$R[]k>Tq\?ZVl?\tXfo"9['mHS]=bkm_8=.0a2lEHc-F\`daZh!f\,!6
+h;7&IioB(\k3(smlKdg'mI'H3nF?PL!V>s_o`Fj]p\ssfq>^<hqu6NmrUg)?s-!D4~>
+JcC<$PQ1:SrVc`nrVQWks7uZhs7ZNerq/5BoCDJBnF,i6mHj3)l07Bnk2bR^iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX0^V.9_ASupCKntQ]M>N2+Mtr>)NTZ?#Du=MQDu+GPEW9tXDtn;ODt.cODfK`9
+E,T`9rLO._StDRErL<kWrga"X!h,UKrLNtXs.'+Y%\0#WR[fk<SXZ+=R@Kb9rL*eWR[X5D"IkgJ
+S!s>G!1NgRo0qb1o0r"6q*Y1MrL3bUs.'+[s.07^T)P8^St2GOT)YA]ScPITrga1^S"-">r1<nY
+q4@SX!hQ'ZrLjt#USXoiXfek3ZEppG[C<ZU\[f;a]`,VE^)"K!_8=%*_o0L4`Q#s=ai_fNc-FY]
+d/DDld1"CMe(*((gu.8Xn+HL-s2k9IlcR/X]"#5Y[^?&6*V/.8`OgeRUs89+kJMe?_1?fFEGna$
+H$F@/:ks`'K+`ceJ:LBk:fUFl;Gi16QBRJmO,a/]lHd8Z^:Utd[^<BHZEUO6XK/=uVPKu\TV7pH
+T:MC<rg47`Pa.JrO,T'WMi3IMMi*@JnV[?=s%@f79heAY:f("e;c?Xq<``C+>$G6;?XI5N@qB4a
+BPM=!DJsN8FEMePH@('hJ:W?+L51VDN/is^PEhH$R[]k>Tq\?ZVl?\tXfo"9['mHS]=bkm_8=.0
+a2lEHc-F\`daZh!f\,!6h;7&IioB(\k3(smlKdg'mI'H3nF?PL!V>s_o`Fj]p\ssfq>^<hqu6Nm
+rUg)?s-!D4~>
+JcC<$PQ1:SrVc`nrVQWks7uZhs7ZNerq//@oCDJBnF,i6mHj3)l07Bnk2bR^iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX0^V.9K7RfsE:\@TE;#aDW;Z/WU3<(o>3&ru[pcJ",niQe4r]C$Y#?Or,<E)su
+<rH%s<;]bj<<#tu<rQ)#;cH]h<!ZK'<E)mp;H$Qm7.Wk/7e9(87/94M<rH%o<WlK+='/T&=TDY)
+=Tqo/='/R+rDio"r`K2'!*K5$s&]/"r`B&#s&f>*r`]G1?X`nCrac%=raZFKA7fIfBPD-oBkhF"
+rGMXR=)MqrF)uMKG^4U^I!^9iIXcp"J:E-%K8,/<N/j$bR@BhDVPpMrY->1:Za6pC[C<`[^:h>"
+`lH0Aai_iQcdC4lf@\g3h;@2Njlbmnm-aB6p%J1Wr.4kRs6YVR?s[,D>lInJd(6$5I;`\&7mp?r
+NhM8A6;(uO1GC[C/j;E\4>f"q7heK`7R]d93]T5c5!(kh9iY.l;GgGTrrhr"Kkb)r?N+71>6J28
+>?kA2>Q7k==B8O*=B8O*<E3(";c?[q;cEZms%i\kr)!Gjn5''Vs%@f79heAY:f("e;c?Xq<``C+
+>$G6;?XI5N@qB4aBPM=!DJsN8FEMePH@('hJ:W?+L51VDN/is^PEhH$R[]k>Tq\?ZVl?\tXfo"9
+['mHS]=bkm_8=.0a2lEHc-F\`daZh!f\,!6h;7&IioB(\k3(smlKdg'mI'H3nF?PL!V>s_o`Fj]
+p\ssfq>^<hqu6NmrUg)?s-!D4~>
+JcC<$PQ1:Srr)ior;6Njs7uZhs7ZNerq/;DoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+_bK@oG`P]R.^V.9iGDW8eVld,)YPbX&ZN%91[/IE4[f3c8\GEc7])K>?]^<B4OSt=AOT(=>
+OSb16PP^LCPPLFEPE_7-PmEV>Ph"@8e^N+KdfS(Lec*ttdF/$ArmM%ueC2mpdf%K9da-4ccd:"c
+dF6RmdF-FidaQXkd*gCkcdC+cd*L+dcHeoO7G10(7IES=6P%8[b0.uPbg"GZcHaeadEqg=s3gkn
+s3Uel#gLT:aiMTGaN=A&s2tMgbK@s*b5]R,b0/&ScdC1if%]0EkNM3tmdKZ8o()DDp%A(Sq>0sb
+rVhBJSGrfiq"OIQo()\X"T@thT@a&A-h="ml,T?SR?V0WUn:t'?am;EZ)k+1X/K9.>$t`E?!O\W
+`l5p5_MeFEr;6?ap@RtDmd'-#kN1a_i838Cg"4a%daQdtdE]t[bKS#H_SEn!]t:e_rj;d8[.(L&
+8q0K-9heAX:Jakc;c?Xq<``C+>$G6;?=.)L@q9.`BPD6uDJjE5F*)SLH$XjdIt3-(L51VCN/is]
+P*D9"R@B_<TV8-WVl6VsXfnt7ZaR?R]"G_k^r"%/a2lEHbg+P^daZguf@em4h;-uHiT&t[k2tml
+l0@X%mI'H3nF?PL!V>s_o`Fj]p\ssfq>^<hqu6NlrUp/@s-!D4~>
+JcC<$PQ1:Srr)ior;6Njs7uZhs7ZNerq//@oCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+_bK@oG`P]R.^V.9^AoN6IL%pN&MYrD-N;&=kNr3hlDZ=YPE;sqXE;jePE;jeNDusrsDuO\U
+DuO\VEH(lJ!M,h]SHkaVSXZ.>S"0JIrgX%ZSXf\MrL+@hR[KY6S"#q<SXc1<S!oh:SXf\K%%NfT
+S!ob6R@B\6RRHg;fgb[(mR6h;rgNkVrg`qXrgj1^St>qPs.97]rgj+\rg`qVrgX.]S=H(=SG\rX
+T)P>aStDXJrh9@d0;G>@X0&M-Yd(L@[C*HP\@K,[]=bej^;%G!_8=(*_Sa=1`Q#s>aiV]Kc-FY]
+d/DAldf7])d*^:ke^rI/hr<hdoD&98s3(EKj2SpH]"#5Z[C6)71\9PO`4LYPVUGMEj1]uE[[)#L
+Ec"X"H$;t]:kjXVK7ec,J:LEl:K:=k;Gi16Q'7DnOcBAlk01TQ]t:nd[^<BHZELF4X/i1sV5'fZ
+Tq@mGSt2=<Q^3u(Pa.JqNJrmVN;e\9Mi*A\MZ-4t92&&S:/4S]:f:4j<)lt#=BSg3>[:ZC?t*VV
+AS5[jCM[m+E,fr@G'A4XI!pKpJqSl6M2I7PO-,TiQC+)0S=ZCIUSXleWiW>+Yd1UD\%0)_]t_A"
+`5Td<b0/#ScdC1je^i@*g=tH>hr*JRj5oFckiq?sm-O--n*fc9s7-3^o`"Lbp@n=\q#C0iqY^6i
+r;HTerdk*4s*t~>
+JcC<$PQ1:Srr)ior;6Njs7uZhs7ZNerq/,?oCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+_bK@oG`P]R.^V.9I77p0HrD<AgjA>PIm8EjBs#C!:s#C$=q)e+-q)\X=4$*7#r]L-\!EN;$
+<WcE(<E/rt!*9(urD`hurDiSkr`/u!#$"W%;c?XqrDWbsr_s/'<)lmt;c6L]ogRP'p-nC;pd=sZ
+qH!Mr!EiP(=TDY)=oMP'=8u;-<E<1&=BJX,=BGK&s&]5$!*K2$rE0)&s&oP0>[:]FraPh9s'c"=
+AGp(PAnPajBkhBuD/O6.D/O91E,fo>FEDYMH@(!dI!pElIt3*%JUrE+LPUkINf]BgQ^aYCVQ$Z"
+Yd1UB[C<]X]t_J(a2c9BaiMTHbKS5WdF-Inf@o!8hV[;Qk3)$sn+$&Dp\F[aJc>iPg4!Z5?N47`
+>?Y4`]qga<E+N9E6s"N,TS6oA<a\?P/iGL=4[(t^2Dmup84Q-=77Ka.3B9;fr]CBZ<E)pr;H8eX%
+IUHOBjtFT?X@#D>[(J4>74V;>?Y66=]\[,=',B%"B8B#;cEZp!E2ho;>sAl;>j>\:]<t992&&S:
+/4S]:f:4j<)lt#=BSg3>[:ZC?t*VVAS5[jCM[m+E,fr@G'A4XI!pKpJqSl6M2I7PO-,TiQC+)0S
+=ZCIUSXleWiW>+Yd1UD\%0)_]t_A"`5Td<b0/#ScdC1je^i@*g=tH>hr*JRj5oFckiq?sm-O--n
+*fc9s7-3^o`"Lbp@n=\q#C0iqY^6ir;HTerdk*4s*t~>
+JcC<$PQ1=TrVc`nr;6Njs7uZh5kk!Gp%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^:_'hH\nVjWNND-Yd"&1rj)R1s0Va4rjMa7rOMp=rO`$@ke6eRr/^i=qiLlA
+qNLZ:p66#OPEh>qPge+2e^`7%e,7bqe-OLPdaZ[mdF-JAdh^?[dEp4dcd0tbcdC+dcd:+gdFH[m
+dJhPud*g@hd*^;>d/_Jf7Is"78+T4E7INY?6O_/\bKJ,Tcd0n^d*^8?df.YodLFUNcd0n]bfe/N
+aN)9>rl"lWrPnu]b0'_*rlY5^rlYkscd:+hf%Ad:j5oFelKdm+rpU!ZoCMqR"8M]hrVlfsrdk*B
+rs&;oq"FCOo)&FirUZhVh#76dm\B.(f:RtfP%(2[T3Yr4\?`?DriHa4W*ES9?X@&D?*_Sm`Q#g5
+MuP+"qtg-]o^_G<lfmTqk2YFYhV?i<f@86tf%/<rc-4ASc,dl@_>_+P]=GDY[^N[6[Jic!92,=Z
+ISN[8:f1+h<)lt"=BSd2>[1TB?t*SUAS,UiC27[(E,fr@G'A4XI!pKpJqJc3M2I7OO-#NhQ'[o.
+S=Z@HUSOccWiN8)Yd1UC[^`o]]t_A"_o9X:aihoRcdC1ieCN7)g=tH>hr*JQj5f@bkNV6rlg4$,
+n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcEgJcCo5J,~>
+JcC<$PQ1=TrVc`nr;6Njs7uZh488IBp%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^:_']B5rBJK_L?$Mti8+NSTWnDZ=YMD?+VLE;a_PE;a_JE!1)uDf9UkT)>,Z
+T)>)ZS"0DGrL=7bS=>t9S!oe8S!olGRg,CPR[oq:S,SoZS",uIRf8cYS=?"9q*jmElUUP9pI4O=
+q*P=TS=Q4@SGf#XT)P>dSt2FDSt2GNS,f&XRf8c\S=?":R[]fESGf#VT)PD_TbX;sUnjldWiW>)
+Y-5+9Za@*I[C<WTrj`iW]tV;!_o'@._o0O5`lH0Bb0%oOcHjl9dJqW-e'ujre^W1%f@\j7hrEka
+nFZO-s31KLg;Uk=\[o8Z[^H,71\BVP`4CPMX4I=Ni44<FWhsrOE,ABsH$<"^:kjXUK7SW*It1<k
+=&`*r;Gi17P`qAqOcBApjNG9O]Y(hc[^<EHZELF5WiN(qV4s]XTq@gGSXPt7R$a/(P`q;mNJrmV
+NJ`UOMscK%8c_RYr_7i::Jakb;H$Op<`W=*=^,-9?=.)L@Us%^BPD3sD/O<4F*)SLH$XjdIt3-'
+KnbGAN/`m[P*D5uR@B_<T:r$UVPpMqXfen6ZaI6O]"G_k^r"".`lQ9Fbg+P^daQ^sf@em4h;-uH
+iSrnYk2tjkl0@U$mI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrqu`np&9OBP5g%~>
+JcC<$PQ1=TrVc`nr;6Njs7uZh3qr@Ap%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^:_'H77^'GrD<Mkj\YYJkYh:<s#Bp8s#:!>qE+1-n2pJJ!*9#!s&T,!s&K/#
+<rQ(p<VBDh<<?,u;tj8h<<,tn7Is"78+T4E7INY?6iC$b<rZ8$<rQ4t=oVY*=oMM#<X;]+='&L+
+='&N'<WH5"=9Vi/=BAU,r)s&'#$Y><?XR8KqdBG4"CbkNA7baP(M.5mC27['DJa6.DfB]9EcZ>F
+Fa&+XI/SKnIOfo!JqA]2LP^qKNfT<cPa@c,T:r*[WiiS2ZF.-M\\#Sl`5fsAaiV]JbK^%3(XURY
+eCN7(g>1WDioB.`lg=66p%S:[rdk)!s29%j?=$uE>[1K9j2e3^HuES#7RUI+V5AlQ5@IPl1Ft@=
+00ME[0K(cd7h\<\77B[,3Bo\k4?GZ"<)cdp<)eqY'BuNHBOP7R?X@#D>?tN<>[(E8>Q.e7=]\^-
+='&L(<*!!t;uTbr;u]\u;Gg7f:Jq'en5'$U!D?,c9n#i5:f("e;cHat<`iL->?kE>?XR>PA7]@d
+BkhF#DK'T:FEVkRH@1-jJ:`E-L5CeHNK90aPa.T'S"-(BTqeE\W2co#Y->4<[C3TV]Y2(q_Sa@4
+aN;WLcHjnde'ut#g"P3:h;@/LioB+^k3)!nlKdg(mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTe
+rdk*4s*t~>
+JcC<$PQ1=TrVc`nr;6Njs7uZh5POmFp%@tKoCDJBnF,f4m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+dEg+^bK7iF`PTI+^:_'jH]"YiX0/Y1YkkX(Zi7B3[f!W5\c02>]D]D&^%RQeNrb?'rfI#>!0[>F
+oof?=pll;PQ'7Grda?Lldacmsf%/CNdj3Jme^DssdF6LkdEp=gdF6RldEp=fd*U(acd:(acI("e
+e^;hDd0J.Kd*^7fd*hp@!71O2p.!n/og\aGn3m(>s2tAb#0b?:cHstermLkqrQu,%cHXSUaiVWE
+`l5m8`5DSms2>)[a2l@$a8=!Ya9p)5bg"J]e'ut%h>Z=?ioK7clKmp,nF,o<rq$?dpA"O_rr.KK
+U&P,lrqQZjoCDMMrri8kUn?TDrtF_(pX7-PBUN/'V4aDc@pQUNYd+20&?;[6>[^uG?!CU?b/hTB
+`5IT6/GoA@p\+.Hmd9?)kND!fi8EGGg"=j(daZjudE]tYbK\8P`PKC*]tV.h[^H+Cn$RU98kM`L
+9MJ5V:Jakb;H$Ln<`W:(=^#'8?=.)K@Uit]B4u$qD/O93EccGJG^=^bIXm!%KnbD?Mi<^YP*;/t
+R$sM9T:r!TVPgDnXfen5ZaI6O\\#Mg^V[n-`lQ9Fbg"G[dF6Urf@\g2gtgiFi8WeXjlYail0@U$
+m-aoB$h3]Wo(2JFp%A%Pp\jjgq>0scqu6NlrUg)?s-*J5~>
+JcC<$PQ1=TrVc`nr;6Njs7uZh4SSRCp%@tKoCDJBnF,f4m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+dEg+^bK7iF`PTI+^:_']BQ/BIKo#Y`r/19.pl3seqecCPphp(Lq/H7Mr,DOOq/H@P%WH?*Dk3Dh
+St)CCSXuFDrgY%#S",t<S=?%<S!oe8R[]h;S"#k9R@9S3R[T_9R@=,F&tPJ\R[T_8SXc1>S=5n9
+R[]e8qaL3JhFI6.q*jd@q*Y1PrLNt[s.B7_!M>t^SH>=NS,SlVR/i]SS,A`SS,\uYS,JiWSc52h
+SXuIHTqS3UUnjibW;`e$X/rG,YHY>2[/[Q>\%'&^]tV:urk]2``5T^8a2lBFb0/#RcHjl9dK.hH
+rm_S3f[nd-f\,$9i8Wk^m-jTCJcF$q$.d,3]XbSa\@8pGs"jT6dDWVJI]_?(s4t,@_P*?<;K,<V
+H['^.;c&4&KS+i.Jq&;H:fgUq;Gg;GQ^!c#PECk)*ob;U^:h.i\$iZNZ*:F6XfAD"VPU&]TqIsI
+St279rKdtYP`q8mOGo3ZN/ELNMscIO8P2TJ92&&S:/=\_;,U=k<*!%$=BSg4>[CcF@:E_XAnPdl
+CMds-EH6/DGBeF\I=?]tK8#&9M2R=ROHPfmQ^F52StD^NUo(&hWi`G.Z*UjH\@K5a^;%P&`Q$!@
+bKS5Vd*^=lf%8R.g>(N@i8EVTjQ5OekiqBum-O0?mgJXTo()DDo_%nNp@nO\!r;]hr;6KkrVcBf
+JcCr6J,~>
+JcC<$PQ1=TrVc`nr;6Njs7uZh488IBp%@tKoCDJBnF,f4m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+dEg+^bK7iF`PTI+^:_'G77g*G:ZP@H;<(RN3W1r:2ubi=3BB4u47>6*3rh>?48i4_<``@'r`B)"
+"'8K'<;ol!<`N2p<VTMo;cN`r"'/E%<;oer<V]Vo<<-"q7J94-8+f@I7IW_@6iL*c<rQ/$=BYT+
+rE9/(!*Jtrs&],#rE&o!!*B,$#[(84=BSg2>?q,4%:<FI?=.#G?=.,N@q9-KB)cKGBPD6urGDdW
+E,fl<F8g=cGBeF\I/JF1It<3*L5:\DN/WaWOHYrqQ^F53StMp[XSo:NYHY@A\@fYsaNDZKbg+P^
+dEp=jeCE.%g"Y?>hVdDSk3;7%o(MkSr;D3H"TPoM@UK+@,@+MX>3s\FR=K3e>=M"cI]T>q>sN1"
+82;YP.m6$X4"rQL8H)*`77K^77QNU04p*o.4AGfS!`N)tO8fpUV0lrb?XI,H?!LT>?<LN;>$G07
+r`KY1=B8I(=&r@%<)QXqrDX&#<)HRk:f("cr_EMknP=U*8kM`L9MJ5V:Jakb;H$Ln<`W:(=^#'8
+?=.)K@Uit]B4u$qD/O93EccGJG^=^bIXm!%KnbD?Mi<^YP*;/tR$sM9T:r!TVPgDnXfen5ZaI6O
+\\#Mg^V[n-`lQ9Fbg"G[dF6Urf@\g2gtgiFi8WeXjlYail0@U$m-aoB$h3]Wo(2JFp%A%Pp\jjg
+q>0scqu6NlrUg)?s-*J5~>
+JcC<$PQ1=TrVc`nr;6Nj!;ZTg!Vc<eof2U8o()>?n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:_$kI#4_mY-5&.YlD!-Z3%A>[/RK5[f3c7\,s4P])K>@]\^?nOT(==OSk73
+P5^[=PS_fse'c^oda?Rpe^N(!eC;ste^W-ue'S*B$.%&KeBuaoda?JAcPP!Ud*L"acHab_daHOk
+da?Ifcd:(ddEqm?!7:^6pdWb'pdY$InO31?!QiL`bQ#cec-QC9s3V2#cd0k[bK@uKa2\+ts24rU
+_Yq@X`5T^8`l5p;a8F!f`l6$AbfnA[daQ^rg"ZM^(#Im/jlYdklL+*/nF?,Bp%J.Vr;HVGs.TGt
+rqcKdq"F=Nqu6ftntVi;rVn7F\,N,.P%BnjWMH2Y?".-M['?m;Xf\V%>?kTD?X-f@ZHC;0`l,fR
+s"!sDq=sXQnF#Z/l0.<lio&bMg=b-.dF?^teBZ:_bf\5PaMbp4_7dRq\@;FFn$N-er^qW49MJ5V
+:Jakb;H$Ln<E<1'=^#$7?!grI@Uit\B4u$qCi402EccGJG^=^bIXm!%KSG8=Mi<[WP*;/sR$sM8
+StVmSV5L;mXKA_3Za@0M\\#Mg^VRe*`Q-'BbK\>ZdF6Uqf@\d1gtgiFi8WeXjlYail0@U$m-X91
+nF?MK!V>s_o`=d\rV6Egs8)]krVZZno_sFAPQ-.~>
+JcC<$PQ1=TrVc`nr;6Nj!;ZTg!Vc<eoeuI6o()>?n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:_$]C2eWNM#<,0MZ&J2N;&=_NppraDu4MNDuFYTDuX_SDu=SOD[2l)St2IE
+SXf\M!1a"Y#Fq?US",t<Rf8cZR[]h<S,SrXS,SfmS!oe6R@BY6S"-"<R[]e8S!f_7S=?%;S,SlU
+7JK@%8,,RK7I`eA6NWaISG\rWTDtJ_Sc5/WS,\rWR08tJS!ofER/i]QS,AfSSID-`TqS3UUSO``
+VPgBlWW0"5XKAY1Za@'G[C3TU]">Vi^qdh(_u@US`<sW+aN;TJbKS8XdJ_K/e'umuf@\d0g=k<;
+hV[;PjlYgonFld2s3UcPe&B,8]XYP_\$l881@*K.\Uo76hZ*W1LQ'H)Kl'Y);g`n9F\Yk2Lk^S8
+JV&H&J5/pA;cHXl:kk=%QB[PpNW0%:ao9!f]=GDZ['R!AY-"h*WMcVhUnOKSrgj+[rg==aQ'R]$
+PED#hNfK*XMi*FNmYV!9r^qW49MJ5V:Jakb;H$Ln<E<1'=^#$7?!grI@Uit\B4u$qCi402EccGJ
+G^=^bIXm!%KSG8=Mi<[WP*;/sR$sM8StVmSV5L;mXKA_3Za@0M\\#Mg^VRe*`Q-'BbK\>ZdF6Uq
+f@\d1gtgiFi8WeXjlYail0@U$m-X91nF?MK!V>s_o`=d\rV6Egs8)]krVZZno_sFAPQ-.~>
+JcC<$PQ1=TrVc`nr;6Nj!;ZTg!Vc<eoelC5o()>?n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:_$G7S$-Gk"tkNhGX,/r&=a:3&pmts#U*?mQ1&'qH!Ytr`9)#rDs&$=',?$
+!*0#!s&K)"qc3Jlr`&qtqGmMnpf%5nr^HTOe49:'pdO^@q*P-^r)Wi!r`T8'!*T;'!EiP&=8Z,!
+<rcA$=8uD&<ruK*=8Q)$=]ef*=UA;9>?kH>>[1Q@rE]G0s'Gk;@q9-IAcua\CM[keDZ=V`E,fo?
+F`hkNGB\:YIK"^dIXcp$KnkJ?M2R=PO-#NgQ'R`$QC"&2U8=fcVPU)bW2m&)[_0Grair#Vd*^@n
+f%Jd3gt^`Bhr*GPjQ,LhmI0Z@q"t!gJc@8#VJfmM?!^lD>[1J'gVBM;F(JQF6skSOUOGj&F?MW<
+.PreB5!1n^1c7i'7g;=M77B[+3W;2G4$#Gt<)ifpO8griSpG$X?!goC?!LT;>Zt?9=^#!5=]ng.
+=B8L*=&r=#<)Zar<)Z^p<)ZXl;,C+f;#X5j;=RE^8cD>292&&S:/=\_;,U=k<)lt#=BSg3>[:]D
+@:E_XAS5[kCM[m,EH6/DGBeF\I=?]tK7nu7M2R=QO-5]lQC+,1SXuOLUnsugWiW>,Z*UgG\%0,`
+^;%M$`5Td<b0/&Td*^=le^rI,g>(N@i8EVTjQ5OekiqBum-O-.n*olHncA@Srq-<cp\jmeq>^<i
+qu-HlrUg)?s-*J5~>
+JcC<$PlLCTrr)ior;6Njs7uZhs7ZNerq/AFoCDJBnF,i6mHj0(l07Bnk2bR^iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX/^V.:kBmYc8Up@2-Yd(J4Z2h61[/RK4\,No:\c95@]DfJ%^&>VC]DmrcOSb+;
+OSb11P5^[FPQ6mFPQoUbe'cXmdf.]6dF?^sf$r0ue'lgre^`-sdF$CicdL:idF-GAdfRnDd/D;j
+ckF^Pcd:+ddF$CjdEg4fd*^4ecI)GWb")7sqF0pBqEk;)ao'9`bKS2RrlkDc$d-T5aN)<>`Pf[4
+_u.@Q_o0Lm_u@RT`Q%nt%`ZH+`lQ?Hc-Fbde(!"&rS&(Bh;I;Pj6,[lm-X93oC_hNq"jpfrdk*D
+rs8T"qYBp\oCDMMrr_qhTBZ=S';rkMSuId>Q"?kiTUfb)?+.,FYl:a8Wi0*+@:*AH>\14bb/_N>
+MZ51'rVH<^o'c#5lfmZrk2P=VgtLH6e'lmte^Dagbfe2Sb/_H;^qdXs]=@dIn$N-er^m2a9`@b8
+:/=\_;,^Cm<E<1'=^#$7?!^lG@Uiq[B4u!pCi4-0EH?5FGBnL^I=Hd!KSG8=MN!RVOckrpR$jG7
+StMdPV5L8lXKA\1ZF%'L\[oGe^VRe*`Q-'BbK\>YdF-Opf@S^0gYL`Di8N_VjlY^hl07O#m-X60
+n*ol<o(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s-*J5~>
+JcC<$PlLCTrr)ior;6Njs7uZhs7ZNerq/2AoCDJBnF,i6mHj0(l07Bnk2bR^iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX/^V.:k>A8),Iu=5^s,-Z2nr;@`rf-Gc!c;gmrGVLNr,;OQ"E/0pDJoGl!-%gR
+$D!]XSXc:BSt2FBrga._SXc8JSH#)YRL#COR@B_9S",rHS-#+JRf/W\R[]b9S"-":R[X5F#b%9R
+S",t:R%!h?b")7sqF0pBqEt:PrLEnW!h,OGrgWhSs-rnS!1EeQ!1E\Ps.'+Ys.'(Zs-t=+TV/$R
+USO``Vl-JlVl6SoX/rD)Yd(O@['dBR]"5Me^VI_c_tq;!`lH-@b0%oOcd:%ddaQ^rf%A[0gYL`C
+hr3SUjlP[im-sW@qu$BjJcF:#$IHf,]Y(hd\@K&Urr4_Egr[0\IC.u5s4N-lgN\*\Ec4j&H?aO3
+;GW(&KS+l-JU`2F:f^Ln;GgGKQ^=#'P)TDWg;Ue@]t:h`[C!9FYck11WMuemUnjZXrgspsR[KS2
+Q^*i&QBRJnO,]-XMi*CMMscH&8cD<_92,=ZISN[8:f1.i<)lt#=BSg3>[:ZC?t*VVAS5[jCM[m+
+E,fr@G'A4XI!pKpJqSl6M2I7PO-,TiQC+)0SXuLJUSXleWiW>+Yd1XE\%0)_]t_D#`5Td<b0/&T
+cdC1je^rF+g=tH?hr*JRj5oFckiq?tm-O--n*fc9o()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcCr6
+J,~>
+JcC<$PlLCTrr)ior;6Njs7uZhs7ZNerq/2AoCDJBnF,i6mHj0(l07Bnk2bR^iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX/^V.:k6q9d@9MsqKr__KLr_`\Tq)S=3!]N(urAaj=rB'C-s#U3ArB'sZ!*9#!
+!*9#!!EN:t<rZ/"<rQ)!<r,hm<;';n<)Z`k<;B#+8,5XN7I`eB6iC'a<rcA%=8u=t=9qu/<`N1$
+='&N'<WQ<*r`B)$s&f>(r`T8'r`T8)s',J.s',S1?N"10?N+;G@Us%^AS,RhBP2$oD/F31DJjB3
+EH#o=FEDYJG'8+UH@1*hJ:W<*L51VCMiEdZOckonQ^3o%QC"#/StVjPU8+N]Vl-MqZ+.Qea32`S
+dad"*hVR5NioK7akND!kkj.U(nalJMqYYpEs8O=4CLUUU?!^fB>?b:mb,UMKBjF4t@>;+_H:^PV
+3AiKK1bV&l49@Du2>p#U6UaI57QEIm5!:tg4AAgTr_njW%FpniARJqQ?X6rA>?Y;2>6%h*>5q_0
+='/R+=&rE%<W?"r<";i);c6Fh;,C+f;GU+d;=RE^8cD<_92,=ZISN[8:f1.i<)lt#=BSg3>[:ZC
+?t*VVAS5[jCM[m+E,fr@G'A4XI!pKpJqSl6M2I7PO-,TiQC+)0SXuLJUSXleWiW>+Yd1XE\%0)_
+]t_D#`5Td<b0/&TcdC1je^rF+g=tH?hr*JRj5oFckiq?tm-O--n*fc9o()DErq-?dp\4[^s7u]k
+r;6Kkrr)KgJcCr6J,~>
+JcC<$PlLCTrr)ior;6Njs7uZhs7ZNerq/DGoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+_bK7iF`P]R.^V.7iC4(u<WOB%8Z*CU?rj2U3!k,SIrj`!=s186Bs1I@)qn2g<s,R)>qN1N6
+rK-i;nrj$:!L/cHPQ6mGdl>b(daQUle'lame^Dsse'c^pe(3$ue'lane'ZLhda6Chda?LkdE^%b
+c-Xb^cHae_cd:(gda?D>d0.hBd*U2<7d!;:8E`S>7f#RD7/B7UaN;NDa2l?BrlG,]#ft-0aN)?@
+`Ph_ms2"`N28[8J_8*k&_8=+.`5T[5`Pf^6a2uNLcHt"feCN4'g"G-7gtpuJj5f@dlKdg)n+$#A
+p%eF_quH]prr2lrrdk*Nrs8Q"qYBp]p%.ePrr`%lT'lRW-DelbW1f<BP[^SdT:BM%\@8fLYcY"/
+X*7cR@:3GI?&c/6b/_N>MZ54)rqlK`o'c#5lK[TqkMkFWgtLK7e(!!ue'ZIcbfe5Tai;38_8!at
+]=59K[K3eCn?i6fr^qZ59MA/T:/=\_;,U=l<E<.%=]ns6>[CcF@U`kZAnYmnCMds.EH?5FGBnL^
+I=Hd!K8#&:MN!OUOckroQ^O>5StMdPUo()jX0&S0ZEpsI\[oGe^VI_(`Q$!@bKS8XdF-Oof%8U/
+gYL]Ci8N_VjQ>Ugl07L"m-X60n*olIncA@Srq-?dp\4[^s7u]kr;6KkrVcEgJcCr6J,~>
+JcC<$PlLCTrr)ior;6Njs7uZhs7ZNerq/2AoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+_bK7iF`P]R.^V.7i>AA5/K8]\bs,-f6rf$H.erKcImr&)BpMg+MrG_dT")_smDYe8ODZ610
+S"6+ASGeufS=Z4@SXc1>SXc:AS!s>G&tGDYR[]b8S",q:S!o_3R[9G0rgEbTrgX7`R[KY8S",t:
+rgWgTk=>;<kXYG<qF0pBqEt1M".GXFR/WNORK/iURf/ZSQi`VAR/<9ORf/`TS-tmXS"#t@TVA0U
+USRmdrhoap(94F;Y->1;Za@*J[^`iY]=u%r_ns:.r5'l"`5KX7aN;QHc-ObadaHXrf%AX.gYLcF
+iSrq\k3(snm-aB6p%S=]JcF=$$hDQ]^:_+j\[f2Y[Jp1\qr5l8KRLDms8U`)QdC5+C3"2gI!KsZ
+<)SL,KnG#0JUr;X:f(1k;c6J1L6n6mQBI7-*Vn=)^V7Cm\@&`O['?m>Y,nV%VP^/cTqS*NSt;AK
+R/`H_Q^!YrOH5E]N/NRNMi3ILn;73;r^qZ59MA/T:/=\_;,U=l<E<.%=]ns6>[CcF@U`kZAnYmn
+CMds.EH?5FGBnL^I=Hd!K8#&:MN!OUOckroQ^O>5StMdPUo()jX0&S0ZEpsI\[oGe^VI_(`Q$!@
+bKS8XdF-Oof%8U/gYL]Ci8N_VjQ>Ugl07L"m-X60n*olIncA@Srq-?dp\4[^s7u]kr;6KkrVcEg
+JcCr6J,~>
+JcC<$PlLCTrr)ior;6Njs7uZhs7ZNerq//@oCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+_bK7iF`P]R.^V.7i6qBjB:%qK`;=dWa;;P4J;?&TS3;Y`23;kl:3rV5/3WV<'r]:6D=BJX*
+r`9)#rDs,&=&rC(r`02(<``=&<W,tt<W?+r<W5qt;uTbm<<?3$<W5qt;u9Pl7d!;:8E`S>7f#RD
+7/B:N<rZ8!<WZ?'<r?&%=]ea+r`&r!r`9;)<E<4'<`]3$"B\i1=BYW*#?b/2=^#!5>Q%h*?2n4@
+?!^lF?t!MTAS,OeB4trWBEi6gDJsE1DuFVpEHH>GG'A+SH$XjeIt3-'KSG;?MMmITOHG]kQ2[*o
+QC!r+R[]k=T;&-ZWN3&"Xg,7D^;J%8c-Onngu%,Qk32+/ljN7MmdK]:oC_kRqu)*G5QC24Bjk7P
+?!LZ?>?b7ue$YQmCg]e%@u@LbGt:JM3&*$D1bV!T4?YS]7n?-?7R]a87QNRj5!D+k4%2kC<;ogV
+rt*G<EarKa?<plC>[(H;>?Y81>5hY/=BSa-=&i<#<W>u,<)lmr<)Z^m;Gg:f;,[?hn4s$Ur^qZ5
+9MA/T:/=\_;,U=l<E<.%=]ns6>[CcF@U`kZAnYmnCMds.EH?5FGBnL^I=Hd!K8#&:MN!OUOckro
+Q^O>5StMdPUo()jX0&S0ZEpsI\[oGe^VI_(`Q$!@bKS8XdF-Oof%8U/gYL]Ci8N_VjQ>Ugl07L"
+m-X60n*olIncA@Srq-?dp\4[^s7u]kr;6KkrVcEgJcCr6J,~>
+JcC<$PlLFUrVc`nr;6Njs7uZh6hg<Jp%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^:_(gC4M;AYIUmBZ*L[A[/RK5[K3kIrOMs>!kZ+Xn%Jb6q7Z[<ot10_rf@#>
+pQ,66plY02$'UU<P*FABdaQYCe,7W5d*pLoe(3$se'ujqeCDspda?CedF-Iid*^:krmD;'dF$7e
+cHah`cd:"bdF8'A#LLlGd*L$-7dik,8FK(F7f#RE7/B:Mao09ba2Z->`l?!s`rF!X`;[XS_Y:eM
+^qmk(_Sj@0rPT#]a2lHJc-F_bec+,;f\5-9hV[8MjQ>UfkiqBum-X93o(;YMq>'pa"T8/orVhBJ
+Y5eP!#5\/kp\4:Oqu6cqn"8V<s!FSds0&,WRZh0XTq>V$@(<\OZ)t11XfGT/?"%,I?!OV>bfRoF
+`/=RKrVlZfp$hG<m-Es"kih*dhqZu>f@/:&e'cXhcHOGTc,mrA_nj%$]XbM[\$`ZQ[.(L'8cME_
+97KW09hnJ\:f1+h;cHdu='/U/>[1TB?t!MSAS,RgC27[(DfKf>Fa&(VH[U?nJV/Z2Ll%%LO-#Ng
+Q'[l,S=Z@HUSOcbWN3/(Yd(OB[^`l[]t_A"_o9X:aihoRcdC.heCN7(g=tE=hr*JQj5f@bkNV6r
+lg4$,n*fc9o(!%Wo^qhLp@n=\q#C0iqY^6ir;HTerdk*5s*t~>
+JcC<$PlLFUrVc`nr;6Njs7uZh554dEp%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^:_(g>\nJ2LQ..IregW3!0$o:rf6l8muIF-m>h()rGD%Ar,;=Ks)7gS!H2lT
+D?"MRDZXfpSGo&ZSGA`USGo&_S=Z:@S=TVKs-a=bR[KS4S"#k8S"#rIRgYXQR[BP2R$sG3S=BMJ
+rgNkVs-s4]R[Q]8mmlA.mmm4DqF0sCqEk@RS"#lGR0K+JR@BY6RJWHOR08nDQ^F0<RJrZTS,Jib
+SXc1=S=ZCIU8+KZrhf^n!i`3"ri6^6YHb@=Za@*I[^WcW]">Yi^VI\a^ad1;_o0O5`lH0Cb0A8Z
+dF-Ope^iC*g=tH@iSrnZkND*pm-O33oC_nUrdk+#rs.o7`4`jr]=S!O!4Mk+-0`mr[=GIDs8UW%
+S(rX?Bl\&eI!Kp2<)JC*KnG#0Jq8DG:f(3l;[60RL6n6lP`q+,+nF+!_SEjs\$i]O['R$@YH4_&
+Vl$8bTqS-OSXl19R@'<>QOf=COcPK^NK&jRMMmCMM2Cb[s%35_s%@i89heAY:f("e;c?Xr<``C+
+>$P<=?XR;O@qB7bBPM="DJsN8FEMePH@('hJ:W?,L5:\ENK90aPEhK%R[ftATqeE\Vl?`!Y->1;
+[C3TU]=ktp_Sa@4aN;WLcHjnce'ut#f\5*8h;@/LioB+^k3)!nlKdg(mdKW6nac5UoCV\Jp%J.S
+rqQNhs8)Zjrqu`np&9OBPQ-.~>
+JcC<$PlLFUrVc`nr;6Njs7uZh4SSRCp%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^:_(g6qBmB:/UmbqGHo^rDE5cs&&8`r_`PjrAX^8qDnC3r&O^:r]BU1s#UEG
+4'#Eb=]tN$!*9)#"]e]+<`W<#<rZ/"<rH%r<r>to<;KSr<`N/q<<#GV8)d).8,>^O7IikC6iU3q
+<`N1%=B8L)=BAR)r`AttrE'#"r)`l"s&fA+=oMM.=]eg0>?Y37r`oD-!+,Y4'4G9V@:<YVAS5Uf
+B4tpjBP;-rD#S9DDJsH4EH62FGBeCYH@($eIt3*%K7nr7MMd@PNf]BePa.T&R$jD3S=Z=ETqeH_
+WiWD,YctF?\@fYub0A8\e(<=1iT04gmdTcGo)A4bo_/%RqYU5BrsA_^L1k"#?!LW@r`h<bpYEWX
+LN-g,6sbhZUNoC(JiPY@2)6dI4?P;T2b-D/7n,s:7Rf0p3BfVi4?H82<)Z^p<0$t^`/S_G@:9(@
+$=-n@>[1K:>?b97r`KA*=BAU+rD`u";c?Xpr_j5);Gg=h;,:"c;G^.cn5''Us%<;aInWR2:/=\_
+;,U=k<*!%$=BSg4>[CcF@:E_XAnPdlCMds-EH6/DGBeF\I=?]tK8#&9M2R@SOHPfmQ^F53StD^O
+Uo(&hX0&P/Z*UjH\@K5b^VI_(`Q$!@bKS8XdF$Fmf%8R.gYCWBi8N\UjQ>Ufl07L!m-X60n*ol<
+nd"dYo_%nNp\4[^s7u]kr;6KkrVcEgJcCr6J,~>
+JcC<$PlLFUrVc`nr;6Njs7uZh6hg<Jp%@tKoCDJBnF,f4m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+dEg+^bK7iF`59@*^:_(gCOqVGZFmHIZEggD[JmW5\Gs,=])TG6^%T)=]D]D3])[oiNrG(>OS"V4
+OS+b0P5g^QPg@_'dF$Cke'c\@dfRtHec+&$f$r-seG[hrd/MGmdKRtGd*L+frR1blrQtSi#LC]A
+cd:"bdf%PqcdU7fnji:Bo1AOEnjiOGqF1!DqEt;(s2PDd`l5p;`l?!:rPeuY_ns7*pqHjD^])"M
+_Sj@i`;de"aN;ZNcHt"heCE.&g=tE?i8EVVk2tjjkiqBulg4'.nac\Os7HKfp\4I^q#^EirIP!P
+rs8W#qtg-`p\"1TrrVb`h#76cUs/kJTT,A&@Affk?"@<P[^*.:X:VM6=^53??s[,DZa.cra2c)U
+s"+0JrVH6[nF#`2lg!]tkMkIXh:pW7eCN=&dEp1abKJ,SaMu-7_8!as\@AsG[K3eCn?r9fr^qW4
+9MJ5V:Jakb;H$Ln<E<1'=^#$7?!grI@Uit\B4u$qCi402EccGJG^=^bIXm!%KSG;>Mi<[XP*;/s
+R$sM8T:r!TVPgDnXKJe4Za@0N\\#Mg^VRe*`Q-'BbK\>ZdF6Uqf@\g2gtgiFi8WeXjlYail0@U$
+m-a?2nF?PLs76Edp%A%Pp\jjgq>0scqu6NlrUg)?s-3P6~>
+JcC<$PlLFUrVc`nr;6Njs7uZh554dEp%@tKoCDJBnF,f4m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+dEg+^bK7iF`59@*^:_(g>\nP4M2dCMqMP?4rJgf:s,HN.oo8a,ooB)jr,(q@rGV@J!,qgTs).mT
+rb_[Q!,qh+rLNtYqOI\XSY#hO$(d]WS=Q1>R[TZDRfAiZR@K_6qjRSPrL*\Q"IYXGS"0JIrgEtZ
+R[oq;nji:Bo1AOEnjiOGqF1!DqEk:ORf8`SRK8nHrL!hXS"#k8R/E<JRJ`KRS,SrXSJ.N_S=Q7E
+Tq\9VUnsobVl6SpWiQ-#%^*">Z*LaD[^NZS\@K/^r4W*E.DWd:_o9X9aN;TJc-O_`daQ^rf%8U/
+gtglHioK7bkj%L#mI9`@p\Oi>s4.,WjiYKU]tM(i\[f2YrVnSAfZ(FQWo!dUdt4(9M0N]RD,5P)
+G"kn3LPCP8K7\]+Inig:<`;mp;20glQBd\tNW0:Od(mE2]t:b]rj3lUYck71Wi;nnUnaTWTV%dH
+R@'D/Q^3u'PEV,iO,f3YMi.Ll!fDejnV[?<r^qW49MJ5V:Jakb;H$Ln<E<1'=^#$7?!grI@Uit\
+B4u$qCi402EccGJG^=^bIXm!%KSG;>Mi<[XP*;/sR$sM8T:r!TVPgDnXKJe4Za@0N\\#Mg^VRe*
+`Q-'BbK\>ZdF6Uqf@\g2gtgiFi8WeXjlYail0@U$m-a?2nF?PLs76Edp%A%Pp\jjgq>0scqu6Nl
+rUg)?s-3P6~>
+JcC<$PlLFUrVc`nr;6Njs7uZh4SSRCp%@tKoCDJBnF,f4m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+dEg+^bK7iF`59@*^:_(g77^!C:/^pbqGI#ar)*8fohk'R!''m8r]'a7qDeF6r&Xd<nN$\4=8c/"
+=T2G'=RoPn<WZ?'<qo\n<r>qt;u9Mu<E)st<)Zcq<Vobd8+T:C8b5LD8,>^O7IrqD6iC'i=B/@%
+=BGH%r)`o!r`9)#qH*Vt"'Jf1=T2G)=B\o->Q7q4?!LZ@?=%"<@/OI5@fp7RAnV*V"D;C^Bl!]a
+s(sQ0DfB];FEMePH$OabI=HcuJqAW.L51VDN/ip[Ocu#qQ^F20S"#t@U8+T`WN*#%Z*^n;[NE#l
+_8XR@c-FV^eCN=.i8s.fmdTi@o_%nNp@nCZqu20H"olhtARJdB>p3N[>Zk80k/jT]G%OrI=b3rT
+G=G;M5;OlL1bLpR4"rQMr^RYj7R]a875d1e5!D+l4&&CJ;c?[pO8fUe]7k-2?=7/H?<g_6>Q\88
+>?h)1s&fh5=BAX,<E3!u<)Q^q<)W]p##\;s;Gg=hr_NVm;".9\8cD>292&&S:/=\_;,U=k<)lt#
+=BSg3>[:]D@:E_XAS5[kCM[m,EH6/DGBeF\I=?]tK7nu8M2R=QOHPfmQC+,1SY)UMUo(&hWiWA-
+Z*UgG\@K5a^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8EVTjQ5OekiqBum-O0/n*olIo)J:bo_%nN
+p@nO\!r;]hr;6KkrVcBfJcCu7J,~>
+JcC<$PlLFUrVc`nr;6Nj!;ZTg621*Hp%@tKo()>@n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%fCkS%P[_/oPZa@.>[f3c7\,j.Ork&3Cp:^76k.CVRrJp?-rfH`6plbZ@
+#0tQ@cHsqarmLhq!RfHodKJ%Ie'cbEdgOUQeC2jpdE^1fcd2R:s3gqrs3VM.cd1"`cHX\]cHsna
+daHOicd:&48,#R68bbjJ8,GdP7IrqD6NP6Ir5AZSrP\fU_u@OQ_$%Qf^V@S^^]2%I^]D<ir5ATR
+)T^%Dbg"M^e'uq"f\,$7hV[>PjQ>Xgkih9qrp(!ZmI'H4naZ2?nac;Erq6Hhq>:,As02M/rquZj
+qYBmYoD8IgoqL%9rtD0]rQCjmRZaVHTq>V"?F[DJYc[o+&$&l<>[_#H?!O_AbfIiE_MeFIrVlZj
+p@IeBmd09)kih0hiS`PGgXt',g""KrcHaVVc-=>L`59@*^:Le`\@/lTm^3'd8cD<_92,=ZGtq.3
+:f1.i<)lt#=BSg3>[:ZC?t*VVAS5[jCM[m+E,fr@G'A4XI!pKqK7nu7M2I7PO-,TjQC+)0SXuLK
+UnsufWiW>+Z*UgG\%0)_^;%M$`5Td<b0/&Td*^:ke^rI,g>(N@hr*MSj5oFdkiqBum-O--n*olH
+ncA@Srq-<cp\jmeq>^<hqu6NmrUg)?s-3P6~>
+JcC<$PlLFUrVc`nr;6Nj!;ZTg4SSRCp%@tKo()>@n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f?>Oe9MN7Okrf$c7muI"!r/U9-rbh[Omr&,Cmr/;GDZ4MQDZ6.+S,So^
+SXc4@SXc8JS-5CQS=?)JS-tgVS=5n9R[KY6R@4#B".PaKS,SlVQj]=KR$X50R[fk:S=BMHs-r^P
+pIO:8pdk!HqaUENo0iFBqO%JRR@0M4r0dGKqj@JRRJrZTRhqTcSXc1=SXl@ETq\9VUSO`aW2Q\q
+X/l6%#d1A8Yd(RB[C6(Ds1&?F]=bbg]Y4<Y.)3U8`5Ta:ai_fNcd:(fe(*"#f\,$7hVdAQjQ>Xi
+lg4*/nFQALr;M9Iec,p5b/1p-]tM%grj_q,0`'YL]Rlp/s8UZ$VTYEPBQ@p9HZsX-;br1'KnG#0
+Jq/>G:Jb(j;H$GILR4<lP`^t*2!E3"^qROo[^NTMZa$a<YH+\&Vl$8dTV8$NSt2::R$X,)Q^*f"
+OcPQ`N/NRNMi<ROMM^k\!D#f]8c_RYr_7Z5:Jakb;c?Xq<``C+>$G6;?=.)L@q9.`BPD6uDJjE5
+F*)SLH$XjdIt<6*L51VCN/is]P*M?#R@Bb=TVA6YVl6VsXfo"9['mHS]"Gbl_8=.0a2lEHc-F\`
+daZh!f\,!6h;7&IioB(\k3(smlKdg'mI'H4nc&([oCW%T!VZ9dq#C0iqY^6ir;QZerdk*6s*t~>
+JcC<$PlLFUrVc`nr;6Nj!;ZTg4SSRCp%@tKo()>@n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f6qBpD:/^pbq,.&drDE>fmSWIO!]`5"rAX^8pc873rAj^8s#]g5!BW@A
+=8c/"=T2G'=SPts<WH4t<rZ/"<r5nq<r5nq<!ZE%;cH^p<)Zcq<W,nj8,#R68bbjJ8,GdP7IrqD
+6iU3n<`N.#=&r@'=T2D"<WH5#<r,nr=T;M1>$5$3=]em3>?q&2!+,Y3r*]M4s'u(>$"dg`C2%?q
+BkhG_D#\?IDJsK6EccGIGBnI\I=6TrJqJ`1L5(J?Mi<XUOHG`kQC+&-S"-%@TVJ?^WN3)$YHkRF
+\@T>e^VRn1bKS2QbK\A]e_/d:j6,[onFQ>Pp&t0dqYgDErs/S:HY-Vi?!dM9r`^-;nC=k0H>6_U
+;0T7GH:CkT82DhT2#]WA3\`NM7n<PJr^@>e2E3]\5!;"i9h\Mb;cHYUrt"e.Jnnk'?=.&F?<^]?
+>?q/3s&ok7=BSa.<`iF(<`E'u;Z9W+;cH[o;Gg=h:f:1f:Jakbn4s'U8cD<_92,=ZGtq.3:f1.i
+<)lt#=BSg3>[:ZC?t*VVAS5[jCM[m+E,fr@G'A4XI!pKqK7nu7M2I7PO-,TjQC+)0SXuLKUnsuf
+WiW>+Z*UgG\%0)_^;%M$`5Td<b0/&Td*^:ke^rI,g>(N@hr*MSj5oFdkiqBum-O--n*olHncA@S
+rq-<cp\jmeq>^<hqu6NmrUg)?s-3P6~>
+JcC<$Q2gLUrVc`nrVQWks7uWg!Vc<eof)O7o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB`59=)]tCqeDhaRV[_2UH!4Dd6!4Vs;rji$?rk/'?pq5Y!!KW??O8k7-O8b75Onk1?
+ci),lcd'h_dJ_MqdaQ\EdL+IOe'c^oeC2mre,@\reC)hEd/hS=rm:bpdJhT#d*^1bd*L(ad/D8n
+d*C"bchU*,8G5XA9(kjQ8G#FL7f,XH7/94M`!O?"`5BL2`5BI/rkSfS_8*e"^VKf_rkABI!lDjm
+rP\]S(WXY?bg"J^e'uq"f\,!5hVdAQjQ5Rfkl0iHl2^/Llic_DmHsBAmKr@Oo(2MIp\=U`JcE"T
+s8E6!qtp6ap@\:^!r8[brVmM-iq_)sN1""MV4aDb@9g@LZEX;.&#i];>[_#I?!O_^bfIlF_i+OK
+rVu`ip%%V?md06(ki_*hiSiVIg=Fj)g==QrcHaVVc-=AO`59@+]t(V\\@&cR[-tC'84ieQInNI/
+9heAY:f("e;cHat<``F,>?kE>?XR>PA7]@dBkqL$DK'T:FEVkRH@1-jJ:`E-LP^nINK93bPa.W(
+S"-(CTqeE]W2co#YHY==[^WfY]Y2(q_SjF6aND]NcHjndeCE.%g"P3:hV[8Mj5]7`k32'olg4!*
+mdKW6nc/.\oCW%T!quB_rqQNhs8)Zjrqucoo_sFAPlH7~>
+JcC<$Q2gLUrVc`nrVQWks7uWg!Vc<eof)O7o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB`59=)]tCqe?Yst:MN7[oq2G93o8`I&r/U-)qJQ=M!cDjln8A5Dno4PG$>s^OSXc4>
+S",t;qjdeYSXobM$D!]XS=Q1@S=H.?rgO"YS!oiFRK8hDrL3eUrgWqU#FLjGR$j;0Rf/]XR@9S4
+q+(6Op.=UCp.>*OoLJdJqaL-Fq*Y1Mrg<_Pq3_)H!1<YO!LfGURfAiaS=Q4@S"-%?StD\SUB76f
+W;`drWrT7#Y5b^1Z*:O?Za@.>[KO(L\@K0K])TAj]Y2%p_Sa=3aihoPcd:+he(*%$f\5-:hVdDR
+jQ>[jm-X92o(;\QrIP!ursRT&_8!b!]tCqd\[VM:,j*FeKRVDMs5\m9aJ3umED1b-GBHYZ:PXXV
+K7SW*J:LBj:f[Kn#>p5BQ^3o%P)]J`il]$O^:Un_[^EKKYct:5X/i8!V50o]TV/!MS!o_3rKdkV
+PE_5lO,f0VMi.Ll!f;eknVR?<8cD>392&#R9hnJ\:f1+h<)lt"='8[1>[1TB?t*SUAS,UiCMRd)
+E,fr@G'A4XI!pKpJqJc4M2I7OO-,TiQ'du/S=ZCIUSOfdWiN8*Yd1UD\%0)_]t_A"`5Td<b0/&T
+cdC1je^i@*g=tH?hr*JRj5oFckiq?tm-O--n*fc9s7-3^o`"Lbp@n=\q#C0iqY^6ir;QZerdk*6
+s*t~>
+JcC<$Q2gLUrVc`nrVQWks7uWg!Vc<eofDa:o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB`59=)]tCqe77^$D:/Xqd;"[Zc;#F2d;X[KL;Z/WT3<(r93;GT43;bf&3rN.[<WH5#
+<WH5#=TDS$<s_u1=&rC'=&r@'rDrYmr`8nrs&8tsr_rns<W5qu;cN`r!*&baq+13Nlq6tCqFL6K
+qaUHOoL/LBr`8u!s&f\2='&F&<E<1&<`]#trE0)&s&oY3>$5!4>$G80>le2:ra-@I?XI2K@:<VT
+@q9._B4tsmBPD3rrG,JND/F0/E,fr@G'.tQH[U?mJ:W<)KSG5:Ll74OO-,WiPa7])R@B\:T:hsU
+VlHf!Y->7?\%'#^^;.V(a2lBGbfe5TcHjngg"bKFkNhR+o_.tOq"al>s8W*JY'+;^>[1T@?!^c@
+=o\9R^7Kmo?V!P)TsKMF=)h+p/i>+A4Zb_[2DkA%%n&iT7Rf?s3BfYk4?H89<;oer;31_\l_o5D
+@Uf=D$!gkA?!LQ=>[(G3=q"J9=BJX+=BJU)<E)lq<;TT#;Gg4d;Gg7e;GcjY!D#f]8q0K-9MJ5V
+:Jakb;H$Op<`W:)=^,-9?=.)L@Us%^BPD6tD/O<4F*)SLH$XjdIt3-'KnkMBN/`m\P*D6!R@B_<
+TV8-VVl6VrXfnt7ZaR?R]"G_k^r"%/a2lEHc-FY_daZguf@em4h;7&IiT&t[k2tmll0I^&mI'H3
+nF?PL!V>s_o`Fj]p\ssfq>^<hqu6NmrUg)?s-3P6~>
+JcC<$Q2gLUrr)ior;6Njs7uZhs7ZNerq/5BoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEg+_bK@oG`P]R.^V.:j\8R(gVmsD=[JmW6\,Ei>]">Seq7ZR9hn/lK!0H<'rfHc7rfR>FP0X'Q
+!RAshc4eONcdC4ie'c^odaQXme'Z[qda\9F-IgJle'caqdF6Lkcd0tbdF$=ie'QUld*L%ecHae_
+d*L%`d*U(br($TSpdsC9pdt?RogemKqaL*EqEt;!s2"uV_SO+*_8,o^!5SEFrkJTO_o)Gkrl#eq
+a2uNKcd:+he^rF*g"bKBi8WeXkNM0qlKS<5!:0XLrp('\lg4!*mI0N5o(DbQqu)*GYl=_$rqccn
+p\"C_"9%_]l2L]/ma(ppU5G@EWMQ;[BOP2VZ`pX7XKAM$>?tHA@:*8FZHpb9a2X#:0`D%Iq==+E
+md9B+l0.<njPf(RgtLB2e(`L#cd'h[bg"DTai)'3^qI:g\@8lS[C#D1IRm%%8kM`L9MJ5V:Jakb
+;H$Ln<`W:(=^#'8?=.)K@Uit]BP;-rD/O93EccGJG^=^bIXm$&KnbD?N/`m[P*D5uR%'V;T:r$U
+VPgGpXfen6ZaI6O]"G_k^r"".`lQ9Fbg+P^daZdtf@em4h;-uHiSrnYk2tmll0@X%$170Ln*ol<
+o(2MQo`Fj]p\ssfq>^<hqu6NlrUp/@s-3P6~>
+JcC<$Q2gLUrr)ior;6Njs7uZhs7ZNerq/5BoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEg+_bK@oG`P]R.^V.:j\6j)rIuB?^N;AP/NqA>/NpVo*NqdMjD=2<@Dt\/JDZXfpSGo&ZSGeo[
+S=Q1@Sc,&cSXc7@S=Q1ASt)AMSH#&YSGo!"R[]b8R@0M4S"#k:S!fe8R@'A2Q^=,-R[T_7S=>q8
+r($TSpdsC9pdt?RogemKqaL*EqEk7LrK[PPQC!s8QiNKPR/*0KRM_NaSXc4>S=Q4BStDaPUSO]^
+W2Q\pWiN9$Xq%Y>Z*CU@Za@-IZa@*I[f3`f\[]/[]">Vg^;.V'`5g$Dbg4YaeCE+#f@\j5h;7,M
+jlYdllg=-/nFQ;Gq##^CeGfp+`pr3,^:h1k]"#9Js"!Qi`4(9)qu?5uSC"ooAoULlH?aR4;GN"$
+JqJW+JU`2E:et(j;c6JIR$[f;N;kWjaM>U)]X>/S['R*DYcb.0X/`+pUSOWWTV7sHR[KS2R$X/)
+Pa%;kO,f3XMMd=MMZ/J&MLJ)f8P2TJ92&&S:/=\_;,U=k<*!%$=BSg4>[CcF@:E_XAnYjmCMds-
+EH6/DGBeF\I=?]uK8#&9M2[FTOHPinQ^F84StD^OUo(&iX0&P/ZEpsI\@T>d^VI_(`Q$!@bKS8X
+dF-Oof%8U/gYL]Ci8N\UjQ>Ugl07L"lj<(In*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcEgJcCu7
+J,~>
+JcC<$Q2gLUrr)ior;6Njs7uZhs7ZNerq/2AoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEg+_bK@oG`P]R.^V.:j\4&q[9MY%RohtBYkYh@>of2e.r&FX8mQ(A/3rN1\=8Q"u=8l>&=Sl/"
+=T2A&<`f)tqGdPs<W,tq<W5tt;u]f%<E)pr<)Zdsr($TSpdsC9pdt?RogemKqaL*EqEt9`q,dMq
+"'8K&<r#hp=9_o3>?Y03>5_\*>Qe>=?<gh8?NFJ?r*fV8"Cu(UB4q3W!,;FI>AItgCM[j*E,fl<
+F*)PJG^=acIXm!$K8##6LkptJNK0-bQ'IZ&R@9V7SXl@GUo(,lXfo"9[^WfY]Y;1t`5Ta<b0%oO
+c-FY_e(*.+hVmS\md]oApA"L^rdk(prL@e9LjiW7?!UcC>$M%,l,fl]FCeWEA=L,n?:oHT1G1L7
+4oRPZ2`3H_7n,s977B[83B/u^5<_.k9iY0l;i^l7iM(X1@:EPM?<pfB>[1K:>[(H9>$G'2=BJX+
+=BJU(<E)mr<Dugq;c?Rm;Gg7g;,C%a;"%2/84cBF8kVfN9heAY:f("e;c?Xr<``C+>$P<=?XR;O
+@qB7cBPM="DJsN8FEMePH@('hJ:`E-L5:\FNK90aPa.T&S"-(BTqeE\VlHf"Y->4<[C3TV]Y2(q
+_Sa@4aN;WLcHjndeC<($g"P3:h;@/LioB+^k32'olKmjDmI'H3nF?)?oCW%T!quB_rqQNhs8)Zj
+rqu`np&9OBPlH7~>
+JcC<$Q2gLUrr)ior;6Njs7uZhs7\YLp%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^:_(g\8R+hVRX:HrO2a8rj`!=s1/9D]Y+0Uq7Ph$s1J?Crk/6Bs,QB*rfI)>
+rK-i;rK%/EP*4,9r6Gu#bg+MXc-FY_e'c[nd*gCkd/DAqdF6Rme,@]#eC)jrda?Ijci29"c-aqb
+eC2dle'cRjchbohcd>6QqagQTe4TR/qagENqaUKPo0iFB#f"*g^qde&^qf`[rkJQL_#D+K^]M?h
+_YqFN`>6M8bK\A[dFHk#g"P6=hr*JPj5oFekl0fMlKRTul0/$/s6:!XmI'H6oCVbPqu$GEs0;V(
+qZH]ip\+F_!q`2Err4;=[K!k5@$kW,VP'Mm@C`qSZEC=2XfA=)?=I;M?<gdAcHOAM`esfrrr;d3
+oCDA<mHa*&kih3jiSiYJg=Y!*f@J6ncHZ=3%a2u4_83q"\[],W[C3HLn$N3f8P/nRIS3@/9hnJ\
+:f1+h;cHat='/U/>?kH@?X[DRAS#LfC27X'DfKf>Fa&(VH[U?nJV/W1Ll%%KNf]EfQ'[l,S"?7G
+U84ZaWN*)'Yd(OB[^`l[]Y;1u_o9X:aihoRcd:(geCN7(g=tE=hr*JQj5f@bkNV6rlg4$,n*fc9
+s7-Edo^qhLp@n=\q#C0iqY^6ir;HTerdk*6s*t~>
+JcC<$Q2gLUrr)ior;6Njs7uZhs7\VKp%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^:_(g\6s2tIuB?]N;\b3NqJD0Np_u%Nr!YjD=2<?Du"AMDZarsS=KMJ!1a%X
+!LfMSS->CPSXc1>rga1^SXc1>rL3eWrgWnU!LoMVRLGRQS!fe9R@9V6R$sEAQNrnGR[T_97n<GI
+qFT1/qFUQTp.,!Lr'g3FqEt7Is-ESLqO%/J!goCDrL*bVSGo#WSc>8iT:hpRUSO`bW2ZesX8]7$
+Xp2)7Z*LX?ZMq31[/[Nf[^ENO[^WcV\\#Mg^VRe)`Q-'Abg+VbeCE.%f\>3<hrEh]l0Rg*n+$#A
+pA"I[rIP"!rs\GEi;``T_S*Xq\[]0Is"!p#aLd&+jT#4tMrTeA9Q3sYH$=C2;Mp9aK7ST*JU`2H
+;,pUq;GpAHR$R`:N;k`h`P9.%]XG5UZa-m@YHG".X/`+qUSOWWTV%gGS!f_5R$X/)P`q5kO,f3X
+M2R7LM27"FnVRB=8P/nRIS3@/9hnJ\:f1+h;cHat='/U/>?kH@?X[DRAS#LfC27X'DfKf>Fa&(V
+H[U?nJV/W1Ll%%KNf]EfQ'[l,S"?7GU84ZaWN*)'Yd(OB[^`l[]Y;1u_o9X:aihoRcd:(geCN7(
+g=tE=hr*JQj5f@bkNV6rlg4$,n*fc9s7-Edo^qhLp@n=\q#C0iqY^6ir;HTerdk*6s*t~>
+JcC<$Q2gLUrr)ior;6Njs7uZhs7\_Np%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^:_(g\4&nY9MSG^:f-a\oMYH]k#21Us#:!=o/QV-qDeL8n2^S33r2tY=8Q#!
+='>N)!*9)##$+f-=BAO)pf@5kr`0)#<`])trD`bps&Atr!`VZ[qagQTe4TR/qagENqaUKPo0iFB
+#$+`(<``C)r)No$<E3)o=8c5%=^(f-rEK5*"'o5<?N+=3?3"@3@0BtH@UisJAHZXZBkV5[C0PIg
+C27X&DK'W:F)uGGF`r%VH[L9mJqJc2L5:\DMiE^YPEhH$R@B\;T:_gOU8+TbX0&S2['dBR]=bkm
+_8F42aN;TJc-FY]d*gFqgY^uOkNhU-o_/(Vqu20H$K-hVH'sqa@9m/Gr`oL'*VJ*mPBpqK7U(b\
+T4gTI68KrG0KhQ\4>o&e84H,K71D^T7QELm5<h:m4AJmUr_njW*SHm'AR]"Q?<plC?!LT;>?kB;
+=^#$1='/R+=&rH&<<cE$<)cao<;oes<)W]m"Ahli:f-UV!_>mSr^qW49MJ5V:Jakb;H$Ln<E<1'
+=^#$7?!grI@Uit\B4u$qCi402EccGJG^=^bIXm!%KSG;>Mi<[XP*;/tR$sM9T:r!TVPgDnXfen5
+ZaI6O\\#Mg^r"".`lQ9Fbg+P]dF6Urf@\g3gtglGiSrnYk2tjkl0@U$mI'H3nF?PL#P7T[p%A%Q
+p\ssfq>^<hqu6NlrUp/@s-3P6~>
+JcC<$Q2gOVrVc`nr;6Njs7uZh6hg<Jp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iF`PTI+^:_(g[r7"hVRX:H[C3NQ\,Ef<\[oBO]DoMD^%o>(]D]AB]DT>=]D[cUO8b4C
+OcYWbr/gi=qN1X#r6P;drm1Pj*n&E`d*U4fdaZXkdaQape'ugqeBu[leBuXjd*L(brm1YnrmUnp
+!mf0=rm(_ocd'k_qagTUm7R%Em7R7IqagHOqaUKPo0iFB"MDF^^;'Z_rkAHKrP/BJs1\QLrP/BJ
+!PuYO`;IRa`lQ?IcHsthf%8U/h;@,hi<SE(jQ>Xhki_j,roOdTk3(sll0@X&md]o@p\=U_JcDqR
+"8hohp\FgjpSHL?rt1h%R\G_-B;q`#S7Q-?\?`BCri?X2Tj1o5?XR2E?*_bua2Z,Us"=<Ip[dkC
+md0?+kih9oj5JtRgtLB2daZdmcd'e[bg"AUai)'4^q@1f[^NZS[-k@%8,u6\8c_RYr_7i::Jakb
+;c?Xq<``C+>$G6;?=.,M@q9.`BPD6uDJsN7F*)SLH$XjeJ:W?+L51VDN/is]PEhH$R[]k>Tq\?Z
+Vl?\tXg#(:['mKT]=bkm_8=.0a2lEHc-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg'mdKW6nac8B
+oCW(Us7QHerV-HiqYL-erqu`no_sFAQ2c@~>
+JcC<$Q2gOVrVc`nr;6Njs7uZh4nn[Dp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iF`PTI+^:_(g[pa/uJ;]H^Mu\k5NqJD1Npi&!NqmSiD=2<>Du=SNDu?.'Sc>5YS,JlU
+Rg5IQS",t=St#_L&Y>G\S=?%=R[KV6R[KV4R@9QCRf/`URKAkCRJrTQRK&cR8Gc!G9(bjE9)D3W
+8G>XO7f5^H7/B:NQ2[*JQiEEQRJrTNR/iWPR/i]SS,8`eT:hjNUSFZ`W2ZesXK8P+riZ4(s0;R/
+rj2X3rj=5a\%&oW\\#Ph^VI\'`Q$!Bbg4\ceCN7*gYC]GjQGjrn*ol<o_81Yr;M9Ie,KI1cMIPC
+]XbP^qu8,-cb>(.g].<#I,oKsAoL[sH$=@1;Mp6aKS"c,JU`#B:fUFn;Gg;GR/WBOQ&YeuqU`U$
+^V7=g[C!<HZ*1@5XfJJ%W2?AcU7e-MSXc1;R$jA/Q^3l"OcYWaNJiXON/R([s%!,]r^m2a9`@b8
+:/=\_;,^Cm<E<1'=^#$7?!^lH@Uiq[B4u!pCi402EH?5FGBnL^IXm!%KSG8=Mi<[WOcu&rR$sM8
+StVmSV5L;mXKA_3Za@0N\\#Mg^VRe*`Q-'BbK\>ZdF6Uqf@\g2gtgiFi8WeXjlYail0@U$m-a?2
+nF?)?oCMVSp&F^cp\jjgq>0scqu6NlrUg)?s-<V7~>
+JcC<$Q2gOVrVc`nr;6Njs7uZh4nn[Dp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iF`PTI+^:_(g[mikY9MJC_;"IQV;Z0JS;?0Sl;!g7@3VYT'3rE+Z=oVV(=8Q%u=8l;,
+<``=&=&rF*rDiu$<E8rtqGmDnqc*Yr;ts>h8Gc!G9(bjE9)D3W8G>XO7f5^H7/B:F<rZ8$<qKGr
+=BSg1=o;M&>ROhD?!^iE?X@&H@:B(Cs'u(?s(D@Grb;ILD#S5MD$=frEH6,BrcLnXG^4U^I=?a!
+KnbA=M2@+LNffNkQC+)0S=Z@IUSO`aW2ZhuXKJk8[^j#`^;%M%`Q$!@b0/)Vcd:%eeCWF2i8j%c
+md]rBp\XjeJc?1sJ7c*fV4aQc\mJ`J>lOaDik_7=DI?"5I(-1u5__6S/N#4G5!(kc2F^5-7RmAG%
+n8rI3^#\l4ZY]"<E)jp;i^kgcBN?Y@:3GL?!UZ?>?b99r`fD+&mJC<=BAR(<EE."<Dugq<)Q[pr
+DNu";,U7f;,:"bmn`sS!(m/^!D?,c9n#i5:f("f;cHat='/U/>?kH??X[DRA7]CeBkqO&DfKc<F
+EVkRH@10lJV/W1LP^qJNfT<dQ'Rf+S"6.EU84W`WN*&%Yd(OA[^`l[]Y;.s_SjF6aND]NcHstfe
+CE1'g=k?<hVd>Oj5f=akNM0qlg4!+n*fc9o()DDo`+Uap&Ojcp]C9fqY^6ir;HTdrdk*7s*t~>
+JcC<$Q2gOVrVc`nr;6Njs7uZh#5@ibp%@tKrphl8nF,f4m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f[r7"kV7F/9[f<i:\GWo;\cBA<]]6X"]_T2;Np2T+OHG\%OT(C<OS[9%
+cN2;:rlu8&cHX\]dEg4ddaHLke'cUkdF-CheGdo*dF-Ild*gFldF-@fdJM9"e'QLhd*L(ad*Bq_
+cd)M\qapBOj%Ju9qap]VpIG*Mr'g6Gq*Y+orP&6FqnW-Es1eZO_YqCc`Pfa9a2Z3Dbg"J]e^iC+
+gYLcchu_ltjSn6BkN1k*jo=HWjQ5LcjlYail07O$mdK]:p%S7YrIP!OrrMohq>UNpVk3ke,bat.
+XH/f_Whl>YARE!WZ*CI6XK8F(>[:fI?X6lCZHgV4`Q!c7(&n('naGr6m-O!"kNLsbiSNDGg"4gS
+e.p?TcHXVWc-4DR`PTI,]t(\^[^W`Qn$N6f84Z>O8q'E,9MJ5V:Jakb;H$Op<`W=*=^,-:?=.)L
+@Us%^BPD6tD/O<4F*)SLH$XjdIt3-'L51VCN/is]P*D9"R@Bb=TV80XVl6VsXfnt8['mHS]"Gbl
+_8=.0a2lEHc-F\`daZh!f\,!6h;7&IioB(\k3(smlKdg'mI'H4nc&([oCW%T!VZ9dq#C0iqYg<j
+r;HTdrdk*7s*t~>
+JcC<$Q2gOVrVc`nr;6Njs7uZh#5@ibp%@tKrphl8nF,f4m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f[pa3"J;]E`N;S\3Nqn\5Npi%rNq[GhD=2<>DuO_ODu-"'SHk[US=H(;
+S!s>H!h,UIrgWqY$CmTVS=Q.=SXc1=rgF._R@9V6R@9M2S,8W`S!f_5R@'D/R?s8-R@4%FqapBO
+j%Ju9qap]VpIG*Mr'g6Gq*Y"Es-N\Or0dSPr0[eYS"#q<SXl;MSJe#lTV8*TV5C2jWiN5'XfSY,
+Y-5%5YHY::rNcI0rj;^6-b$Uq\[f>c^;%J"_o0O7aihuVdF6Xtg>1]Jk3)$sn+6/Ep\F[_rdk*s
+rrCjKrrK[?qu88;f"m&ieGoR,K"utgBlR+$H?aU5;N$<aKS"c,J::6h:KCFn;,U>IR$X,)P`>\e
+o[:Un^:h+d[C!9FZ*1=3XK&8!VP^/aU7e-MSXl4;R$j?@QOK.DP)t`bNJiXON/NM\M$$7=84ieQ
+IS3@.9heAY:f("e;cHat<`iL->?kH??XR>PA7]@dBkqL$DK'T:FEVkRH@1-jJ:`E.LP^nINfT<c
+Pa7])S"6.DTqnN_W2cr$YHY@?[^WfY]Y;.s_SjF6aND]NcHsteeCE1'g"P6;hV[8Nj5]7`kNM0q
+lg4!*mdKZ8rpg*]o`"Lap@nO\s7u]krVQTlrVcBfJcD#8J,~>
+JcC<$Q2gOVrVc`nr;6Njs7uZh#5@ibp%@tKrphl8nF,f4m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f[mikZ9MJC`;"7E9;ZBVi;!L%?3VYQ63V#6-=Su>%=8Z,!<s;W,='/O)
+r`9>*=BAR)<``?"<W?+r<Vohs<<6'!rDWkt<)Z`p<;oGc8b5R79CkdQ8c2-R8,GdR7J'"D6hsdS
+=8u;.='/U.>$>-7>$>/0>RFbC?<plD?XI,H@/OFA?t!MSAS#LfBkV0oCAr!NCi+'-DfB]:F*2YL
+GBeCYH@('hJV&N.LPUhFN/s'_Pa%K$R@Bb>Tq\?ZW2co!XK8S-Yd:dK]=bhm_8O=5aND`Ocd0tc
+e'ln"g>1ZGjQGjto(DbSrIOtYs0$Oj`PB*mY-G^^fN_\\rtFkHWf(q-8O[a$[=^na6o$DQ00T:s
+"#`)/8,c!V71M1:3^5hm4?Yf$<E)jp;i^l)`/JYF?XI,G?!UZ>>?b?:>$G-5>$+g,=&rC'<``7"
+<E2sr<)Q]o;u]bp;#sKjr_W)["%PmQ8cD>292&#R9hnJ\:f1+h<)lt"=BSd2>[:ZC?t*SUAS,Ui
+CMRd)E,fr@G'A4XI!pKpJqJf5M2I7PO-,TiQC+)0SXuLJUnsufWiW>+Yd:^F\%0)_^;%M$`5Td<
+b0/&Td*^:ke^rI,g>(N@hr*MSj5oFdkiqBum-O--n*olHncA@Srq-<cp\jmeq>^<iqu6NlrUg)?
+s-<V7~>
+JcC<$Q2gOVrVc`nr;6Nj!;ZTg!Vc<eof;[9o()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[VpnkV7O1FrjMm;qRQR:rOhs<!4qR0pq6=4qMsg$!0I2Br/gr@qN1Hs
+r6P8cs3D)"dEg7ie'c^odEp;>dLO[SdF6LmdaQXnda?Ijdf.T*ccskbd*p=cd*L+dcd:"`c:Ik)
+oh+sOlV.(Hoh,-Rr(-QPr'pQPogJUCr4W-ErkJ<F!5JNIs1eZO_Z%LP`=g86a2lEIc-Oeff@\d3
+hV[5Ki;V^8irJ3?j9=T'jQ,@]roF+@&*E'<kih<umI'K6oChtUrIP!DrrVqel2L\pVr6s]P+@c7
+V4X8g@(WnQZ*+)-%'*N:?".5L?!FV?c-$%*M>mn\qtBOKmd9B+l2KlVj5StRhV?f9f$r3tdEKo6
+bQuD6`PTI,]stWP[fX(H[d^\R7n?0B8P2TJ92&&S:/=\_;,U=k<E<.%=]np5>[CcF@:EbYAnYmn
+CMds.EH?5FGBnL^I=Hd!K8#&:MN!OUOckroQ^O>5StMdPUo1/kX0&S0ZEpsJ\[oGe^VI_)`Q-'B
+bKS8XdF-Opf%8U/gYL`Di8N_VjlY^hl07O6lj<(In*fc9o()DErq-?dp\4[^s7u]kr;6Kkrr)Kg
+JcD#8J,~>
+JcC<$Q2gOVrVc`nr;6Nj!;ZTg!Vc<eof)O7o()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[UF*#JW'Gbq2GB8qMtN6r/U<.l&PXY!,_UN!,_%>rGM[Tq/?"tr13hW
+rgNnXrgNqWS,SrXSH>=NSGo')S=?(<S!oh8S!oh8R@0M4R$sJ3R%'S6S!]P1R$sG1R@'>-8Gl'P
+9(u!E9__9R9)M9Y8G>XP7f,XI7/94MQNWV>Q'Ra8Qi3<ORJiNPR0/nIS"0DI'qV%hTV/!QUSOcc
+WN*#"XfSV+Xfei+Y;EJgZ*LX?ZEpjC['[6K\%&rY\\#Ph^VRe)`Q#p>bKS8YdaZn&hrEqdlg=-0
+oC_hQqu-MFs1SF]q;''&K!kXYn;43ZQtpbZI<p-\<)JR/KnFu.Jq/>G:JXti;c?SLL6qn*!0iKC
+1@EN)_S<gq[^ENLZ*1@6Xf\V%Vkp8dUS=ERSt2F@R[BG/QC!o&P`h,iNfAsRMi<RMmtlK`84Z<D
+8kM`L9MJ5V:Jakb;H$Lo<`W:)=^#'8?=.)K@Us%^BPD3sD/O<4F*)SLH$XjdIt3-'KnbGAN/`m\
+P*D5uR@B_<TV8-VVl6VrXfnt7ZaI9Q]"G_k^r"%/a2lEHbg+P^daZguf@em4h;7&IiT&t[k2tml
+l0JB9$170Ln*ol<o(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s-<V7~>
+JcC<$Q2gOVrVc`nr;6Nj!;ZTg!Vc<eof)O7o()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[R<VY9MXqOq,.2iqGR)cpeq)gohaj3!'0d5s#Kd6r`B/%qcNc!s&]8&
+r`8qus&f2##?Fo.=BAO(=8Z(s<r>ts<WlE'<`N/u;ufqs<<#ks8Gl'P9(u!E9__9R9)M9Y8G>XP
+7f,XI7/94L<rZ2"<rc@s=8u>$<<QB*=BSi+>67u5?2e+.>l\40?N=L2@16OP@:EeZAnPdjBkhD^
+CB/5NDB!M5EH?5EG'A1VH$XgbI=?a!K8#&9MN*^\PEc'3%[NHMSY2XMU84ZdXg,1:rj*iW\%0/b
+^;.V)`Q--Ec-OecdF-Opf%Jd3h;7,Nkj.a1q>:,Arsnsro]b>edE'2<^WkNurr2p<qV/EBH=pMR
+A=pPt9ikpt0/b[N4?G\a2b->,7n3JH%n8H:3C#em4?ZD4<)Z[n;i^kn]7t-1?XR5I?!UZ>>?Y38
+>?b66=BJW'<sr/4=&r:"=&r:!;cNZn"&Vrn;#O5k;"%2/7n?0B8P2TJ92&&S:/=\_;,U=k<E<.%
+=]np5>[CcF@:EbYAnYmnCMds.EH?5FGBnL^I=Hd!K8#&:MN!OUOckroQ^O>5StMdPUo1/kX0&S0
+ZEpsJ\[oGe^VI_)`Q-'BbKS8XdF-Opf%8U/gYL`Di8N_VjlY^hl07O6lj<(In*fc9o()DErq-?d
+p\4[^s7u]kr;6Kkrr)KgJcD#8J,~>
+JcC<$QN-UVrVc`nrVQWks7uZhs7ZNerq/;DoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLK7f@AC!
+dEp1`bK@oH`P]R.^V.:j\@-@0T;B00\,Ei8\c',5]DK2*]DfJ7]D%?NNrY:@OnFh/cMZ#fc2c)f
+cMu8jd1XpVdF6Ijd*^:hdF6RodF$=geG[i*daQ[ndF-Fhc-Oe`daS3Cs3Lhmd*2G[p.G0Soh>*S
+oh>3Tp.G6SrCHZQr'pTQoL/LBr4W-E!5JKJs1\cR^V7Fs^qp#e"iJ<u`5T^paU6,3bg"J^e_&R0
+h>Z=3i;DR5iW\B%iSrnWrSnOOjlYahkiqC!mI'K6oC_kRqu20HV#LMkUuMCR,P97\l^+0,W2?5X
+@plpXZE^O5X/i7'?!UlI?X-gAZH^M3`JOUJrquWcnF,c3lg*fukN:dbi83;Eg"4g(eC)[ecHOMU
+bKS/P`PfU.^::__\@/oSrjMC*s$m,]8P/nRIS3@/9hnJ\:f1+h;cHat='/U/>?kH@?X[DRAS,Rg
+C27[(DfKf>Fa&(VH[U?nJV/Z2Ll%%LO-#NgQ'[l,S=Z@HUSOcbWiN8)Yd1UC[^`o]]t_A"_o9X:
+aihoRcdC1jeCN7)g=tH>hr*JRj5f@bkiq?sm-O--n*fc9s7-3^o`"Lbp@n=\q#C0iqY^6ir;HTe
+rdk*7s*t~>
+JcC<$QN-UVrVc`nrVQWks7uZhs7ZNerq/;DoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLK7f@AC!
+dEp1`bK@oH`P]R.^V.:j\@,jaH\%*7N;8J"NqSP!Nr4t7DZ4M8DY7r@SH#/WS,f#WS,]#YRhD0[
+S"#t<SXZ.?S=H.?SXQ"8RJ`N`R[]e8R@9V6R$jG3S"'DGs-WqTR?meCp.G0Soh>*Soh>3Tp.G6S
+rCHZQr'pTQoL/LB!13SK!13YOs-`hQrL3bU#Fq?US=Q4CTDkJiTq\<XVPpJoX/l6$rN6+&s0)I,
+s0;O./$lUh['d?O\@K2_]tV7t_Sa@4a2lEHc-Oedf%T$@kj7a,naZ5DpA"I\rIP!]s"!3T]n<KO
+s8Tp(fYh]LD1$\SF];4rL4t53JV&E%:/=\d<)Z[mL5)%\QBdF/([9/[^V.:i[^EKKZ*1C7Y,eP#
+VPg8eUAgf!St2FAR[BG0QC!o'P`h/jO,]'Sregc4mtq'7!_>mSr^qW49MJ5V:Jakb;H$Ln<E<1'
+=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=^bIXm!%KnbD?MiEdZP*;/tR$sP:T:r$UVPgGpXfen6
+ZaI6O]"G_k^r"".`lQ9Fbg+P^daZdtf@em4h;-uHiT&tZk2tmll0@X%mI'H3nF?PL!V>s_o`Fj]
+p\ssfq>^<hqu6NlrUp/@s-<V7~>
+JcC<$QN-UVrVc`nrVQWks7uZhs7ZNerq/5BoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLK7f@AC!
+dEp1`bK@oH`P]R.^V.:j\@+dq92/7W;>F&e;>sJj;?'P_;?'Gm;=[N`;;=/03Vb`8=92K*r`B&#
+r)s#$"'8N(=8Q,!<s_o0='&L*<``='r)NSor`/u!"'&B&<;]br<!#ut;uK;]9);3R9_V9S9_qEU
+9)M9Z8G>XP7f5^I7/91N<`T-"s&T2'r`K)"!*9)!&m&1:='Ag4>$G09?!^c@?!LZAra5V3s'bh5
+AR].ZAnG^iBkhBuChmj(Df9T7EcZ>FF`qtRH$amcI=?]uK7nr6M2dU]Q^=),QC+&.S=Q1AT:r$V
+X0B"@\@AuV\@K8d^VRh,`Q66Hbg4Y`daQ^rf@em4h;7)Lk3D@)p\Xr@rrCsTrs8AejP88.dGOHk
+s"<KOTRq#e7pM(fU1HoGD_X.+4Ztki2E+,q7n,s9779R(3B9>h5!(o%9N>"i;NCc3q6GWf@:*AJ
+?!LZ>>[(B9>Zt<6>$+m-=BJX-='&F$<)ust;c?Xo<)Q[o;,^=g;,[Bimn`sR!_>mSr^qW49MJ5V
+:Jakb;H$Ln<E<1'=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=^bIXm!%KnbD?MiEdZP*;/tR$sP:
+T:r$UVPgGpXfen6ZaI6O]"G_k^r"".`lQ9Fbg+P^daZdtf@em4h;-uHiT&tZk2tmll0@X%mI'H3
+nF?PL!V>s_o`Fj]p\ssfq>^<hqu6NlrUp/@s-<V7~>
+JcC<$QN-UVrr)ior;6Njs7uZhs7ZNerq/;DoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@-@0Tr#E3\G`u6](ru4]&gR(]`,P@]`3ulO8+b#O8k:AOnXt:ch5T^
+chl!%c-Oe`d*L.edF$Fjda6Fjd*^=kdJhSrdaZeGdhL3Xd*gCkd*L+ccdU7gdaHIgcUg_&9)D9X
+9]JkC9`.QX9)V?Z8GG^Q7f5^J7/0.K^&PeL^VIV"_#;%J^'DEg_SX.*_o;Vn%`ZW4b0%oPc-Xqi
+g"bE?rndb7iVhd8i;hg8iV_[Lj5T+[k3(pkl0@U$mdK];p%J4Zrdk*FrrW+qgAV$q[K!k4AX-`%
+Tq#Y$]!nuLXfSS(WEEM3@:<MJ?*^c\aN)8Us"=9Fo'l)7m-O$$kiUscio/bLg"=p-e'uglbg+GV
+b0%rPb/V?8^V74f\%/oW[/RN)[Jrbs8,u6\8c_RYr_7f9:Jakc;c?Xq<``C+>$G6;?XI5N@qB4a
+BPM=!DJsN8FEMePH@('hJ:W?+L5:\EN/j!_PEhK%R[]k?Tq\?[Vl?\uY->1;[C3TU]=bkn_Sa@4
+aN;WLcHjkbe'ut#f\5*8h;@/LioB+^k3)!nlKdg(mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTe
+rdk*7s*t~>
+JcC<$QN-UVrr)ior;6Njs7uZhs7ZNerq/5BoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@,g`H[q(PNVSS7O782,O6_i(O8P+>D?+VRDZ"A5DY\2PS=Q5=SGnuk
+R[]h:R[T_7S"#t=SXZ1@S"-%>rL3kWS"0JI'UbDXR[]b6R@BV5S=5n9S!]V28P/YKqb-cZj%]>C
+r(HcVrCQoXpdb6Or'g9Hpd>(Jrg!PNrL!VQrKmSQr0dYVSc5,\SY)PRT`:_hUSOccWW&suXT#@$
+XoPU&Xtd/dZ*CU?Za@'G[C3QS\[oDc]t_A!_SjI8ai_fOcdC4lfA#0Cl0\$3o^qkNq"ajdJcEC_
+/+1j$Kr<i.s3?ScNH\6<;1*S1<)JO-L4b)/Jq/AH:et(j;c6JIL6n0kQ&P_tilT$O^Upq^[C!6F
+YHP+2WiDtoW26>cTqJ$MSXl7=R$X2+Q^<u%PE:icNf/aPMN$t[s%!)[!(m/^!D?,c9moc4:f(%g
+;cHat='/U/>?kH@?X[DRAS#LfC27X'DfKf>Fa&(VH[U?nJV/W1Ll%%KNf]EfQ'[l,S"61FU84Za
+WN*)'Yd(OB[^`l[]Y;1u_o9X:aihoRcd:(geCN7(g=tE=hr*JQj5f@bkNV6rlg4$,n*fc9o()DE
+rq-?dp\4[^s7u]kr;6KkrVcEgJcD#8J,~>
+JcC<$QN-UVrr)ior;6Njs7uZhs7ZNerq/5BoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@+dq92/7[;=m]Y;?'Jm;?'Jd;<q$\;)gNqgc59nr&Om]=]t`+qH*]!
+r)s#$"'8N(=8l;&='5B%#Zt/1=BAO)<`],unlGZgr`&nhpIb<UqFopDq+U]ZpIbBUr(-TQr'pTQ
+ogJRBr`9&#rE/u!$!(&+<`iI)<a&`+>5__4>[:T>?=.&J@K'XE@:3MO?t!JQ@Uiq[AnYoXCB&&R
+Ci+*0EH6.!F;oCIG^4XaI=?ZsJqJ`0KnbDBOd2<&R[KS4S=TYN$(mlbUo12pZF.1@\08Dq^;%M&
+`lQ9FbKS5Wd*L+he^rL.gtglHio]Ooo(MqZJc>_gqYp`qn`J]go_e_/n]n+jEa_L<J%W%,6]OJh
+.Prb@4$5G[7Ros<7fGgd7Q<Cf5X.Fo4\naN;c?SSrt+XtI:lts?sd2F>[1K:>?kG4=qFh==&rF)
+<``=(<`;st<)cco;[ZK%;G^:h:f((d:JgLUs%!)[!(m/^!D?,c9moc4:f(%g;cHat='/U/>?kH@
+?X[DRAS#LfC27X'DfKf>Fa&(VH[U?nJV/W1Ll%%KNf]EfQ'[l,S"61FU84ZaWN*)'Yd(OB[^`l[
+]Y;1u_o9X:aihoRcd:(geCN7(g=tE=hr*JQj5f@bkNV6rlg4$,n*fc9o()DErq-?dp\4[^s7u]k
+r;6KkrVcEgJcD#8J,~>
+JcC<$QN-UVrr)ior;6Njs7uZhs7\VKp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]O,^:_(g\$g:1Unta'\bWi3]C`]"]DfGC]DT>@^&PbENrG+7Np;]#O9!Z*ch,K_
+ci),sbg+JXcHjhadEg4hrm;&!dF?UmdF-IleGdi"daQ[ne'c_EdL=LNdE^.ccd'k`d*^;:9)M?Z
+9\E/;9`.QX9)V?[8GG^Q7f5^J7/0.K^A,JC^Al"J_#_EjrPT2dai_fMbg"G\eCWF1hV\=jro*k7
+ro""<iS`YQrSmh:&`i*;kNM0qlg4$-o(2PJq"t&As.fSpW1a+h,+nn)VMgdPWM5tq?b3YNYcb(.
+Wi90->[UrH>[4S[c,[iCM#Sk$p@.S?mHj3(ki_-hio8kPg=Y*0f[SBtc-4JWbf\,Qc-42F^qd\`
+\-0@M\?rX4[f8kt8,u6\8c_RYr_7i::Jakb;H$Op<`W=*=^,-:?=.)L@q9.`BPD6uDJjE5F*)SL
+H$XjdIt<6*L51VDN/is]PEhH$R@Bb=TVA6YVl?\tXg#(:['mHS]=bkm_8=.0a2lEHc-F\`e'uq"
+f\5'7h;7)JioB+]k3(smlKdg'mdKW6nac8BoCW(Us7QHerqQNhs8)Zjrqu`np&9OBQ2c@~>
+JcC<$QN-UVrr)ior;6Njs7uZhs7\VKp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]O,^:_(g\$f^_I=[@VNVSV4O8b.>O7\G4O6_i)O8"b8DZ4SSDYe53DZ+MPSH#/L
+SGAWeS=>t9S=?"<S"-(@SXc7@S=Q/KRfAiZR[]b8rgF%ZR[TV5R[X2C!LfMQ9)M?Z9\E/;9`.QX
+9)V?[8GG^Q7f5^J7/0.KQ3!>>rL*SN!1EeSs-rtW%%X#_TV8*SUSFW_W2]css/c1$!j&N+rN6.(
+riuL//$lUi[C3QR\@K2_]Y2%p_8=.1a2lEHbg+Ydf%8U0i8a"fnb)VNp\=R]r.4m\s"!it_hN`n
+s8Ur+gNS!WE)M(.F]D=sL4t52JUr?%:/F_d<)Z[lL6n6lQ'@7-+l:5V_8!Oh[C*?HZ*:C6XK&4s
+VP^,_US+9PSt)=>R[KNAQjf=HPa%8jNfK!SMi*J]M>p*G8,u6\8c_RYr_7i::Jakb;H$Op<`W=*
+=^,-:?=.)L@q9.`BPD6uDJjE5F*)SLH$XjdIt<6*L51VDN/is]PEhH$R@Bb=TVA6YVl?\tXg#(:
+['mHS]=bkm_8=.0a2lEHc-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg'mdKW6nac8BoCW(Us7QHe
+rqQNhs8)Zjrqu`np&9OBQ2c@~>
+JcC<$QN-UVrr)ior;6Njs7uZhs7\SJp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]O,^:_(g\$e[q92,:]n5/sYoMGNakYV:Vr]'m;gc59n!':*\!a&T.r`K2%!*9&"
+r`K,%r`B8(<`W<$=9;Q+=T2A&<`f9&s&]5$!EW>#<VBGr<EE7&<W5tt<VT2a9D_E9:&@W^9D;'W
+8c;3T8,PjS7J0(D6iC*b=T)>$<X)W+='&F(=oDM3>?tK=?!LW=>@(ZDrF#h:@:3JMra>b8&S#?_
+AS5[jC2.O"Ci401EH6.!F;o@HH$XjdIXZcsJV&T0L51SAN0'9jR@9V8SXobP(8.@sVPpJpXg#1A
+\\#Ph^VRe*a2uNKrll/&cd1"ge^rL.gYLcGjlYdnnFQDPJcGHD!r_cfqYr+RP':D.7sMAPJ4+oK
+1bCR<4Zkhb2b$;.7Rfg87n,Hu3']\l4$?A=<)Z[mNrKgUU3U?Z@:3AI?!LT<>$>07>$5!1rDrr"
+$!:81<`;st;cHZn;[?9";G^7g:f(*W:]Erb8,u6\8c_RYr_7i::Jakb;H$Op<`W=*=^,-:?=.)L
+@q9.`BPD6uDJjE5F*)SLH$XjdIt<6*L51VDN/is]PEhH$R@Bb=TVA6YVl?\tXg#(:['mHS]=bkm
+_8=.0a2lEHc-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg'mdKW6nac8BoCW(Us7QHerqQNhs8)Zj
+rqu`np&9OBQ2c@~>
+JcC<$QN-UVrr)ior;6Njs7uZh4nn[Dp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iF`59@*^:_%f\$g70VPUs$](EW/]'[--]E#YD]_K2>Nr+n5Np2W%O9!W+d/D;]c2l28
+rlkAds3CeodF-GAck+UNda6Fjd*g:ie'ZRhdF-MCdLOaQdaHLhdEg4bcdC(cdecZ79DhKR:%(jJ
+:&I]_9DM3Y8c2-T8,PjS7J0(E6NKNfqS*$GrkJKKrkTPj_o9R4`Q-*CcHOPYd*pOugYUiFi8NYS
+i8EMlh>lI3i;qlqro+[QjQ#7[jQ>Xhl0@U$mI0T9o_/(Vrdk*ErrT0no)AY5VY&ZHNgXR]US(k"
+]=+uKY-"e*W*EV5?sm;G?*_`!a2c/TruD%4nF,f3lg*fukN1dbi838DgY(<5e^MpjcHXT4b6Q89
+bf7Q9^qK`W"Lb_I[^>P4s%!)[!(m/^IS3@.9heAY:f("e;c?[s<``F,>?kE>?XR>PA7]@dBkqL$
+DK'T:FEVkRH@1-jJ:`E.LP^nINK93bPa7])S"6.DTqnN_W2cr$YHY@?[^WfY]Y;.s_SjF6aND]N
+cHsteeCE1'g"P6;hVd>Oj5f=akNM0qlg4!*n*fc9rpg9bo_%nNp@nO\!;ZWjrVQTlrVcBfJcD&9
+J,~>
+JcC<$QN-UVrr)ior;6Njs7uZh4nn[Dp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iF`59@*^:_%f\$f^^IY!LSNqAD0NrG(>NrG+/Nr4t0OT'.pDu"83DZ=YPSH#/NS,o+L
+r0m\Tr1!YR&=f2[S"6+>SXZ.>S"#e5R[a;F%\&lTR[KS4R@BS4S!f\6qb$cZr(QWTmnWFJr(R#]
+q+CTWr(-WRr'pTQogJUC"[\QBR$jB@R/NEiR[]e8S"-%>S=Q4CT:hjNU8+N[W2Zi!X8]10Y,nb,
+WiE/&Xfek2Yd+25/$lXj[C3QR\@K2_]Y2%p_8=.0`lH6Fbg+Ycf%A[1h;@8UlgF?:p@n@Zr.4m[
+s!m!LLk<>?s7(iYXb(8+<.9+9:K!()KS4r.JU`2F:et%i;GpAHR$O#'P`5VRg;_(I^::VY['I!@
+YcY+0X8]"<V5'cYTqJ$LS=>t8R?s;.R?s2'P`UrdNJiXOMN!G]M>p*G8,u6\8q'E,9MJ5V:Jakb
+;H$Lo<`W:)=^,-9?=.)L@Us%^BPD6tD/O<4F*)SLH$XjdIt3-'L51VCN/`m\P*D9"R@Bb=TV80X
+Vl6VsXfnt8['mHS]"Gbl_8=.0a2lEHc-F\`daZh!f\,!6h;7)JioB+]k3(smlKdg'mI0N5nc&(`
+oCV_Kp@e7Zp]1-hqYg<jr;HTdrdk*8s*t~>
+JcC<$QN-UVrr)ior;6Njs7uZh4nn[Dp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iF`59@*^:_%f\$e[q9MA=M;#O8E;#F2i3;Y_l3<)#:<ruK,=oMM'=8Z,!=8uD&=TMW-
+r`B8(<`W<"=T;G.<``=(='/R+=8c1u<V9Am=8l8#;ufqq9)M?[9^tjG:@_-W9`.QZ9)V?Z8GPdR
+7f5^J7/91M6N1'b=SPr"=BA[1r`T;+r`f\4>[:Q=?=.(<@K'[6?PQjQ?smJTAS#IdBPD3sCM[j+
+E,fo>rH(eWGBnL]I!pHnJ:W<*KnkG>M2I7PP*D9"R[fn>T:hmPUo1/jX0&S2[^s,b^;.V(`Q--F
+bg+P]d*^7heCN:+gY:QAiT97em-sZ@qYc!Fli.ZIC.q-3Vo4]hB37&E2)%3W4>Jc`r^RSj77B[8
+3B9&`5<V+l9iY.j;cA_V,M\Z.A7AtT?<gc?>$G06>?Y35=]ed+='&L+<`iF';cH^p<;fbq;@?E$
+:f:.e;,C%a:f-XWs%!)[!(m/^IS3@.9heAY:f("e;c?[s<``F,>?kE>?XR>PA7]@dBkqL$DK'T:
+FEVkRH@1-jJ:`E.LP^nINK93bPa7])S"6.DTqnN_W2cr$YHY@?[^WfY]Y;.s_SjF6aND]NcHste
+eCE1'g"P6;hVd>Oj5f=akNM0qlg4!*n*fc9rpg9bo_%nNp@nO\!;ZWjrVQTlrVcBfJcD&9J,~>
+JcC<$QN-XWrVc`nr;6Njs7uZh#5@ibp%@tKrphl8nF,f4m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[q0N4VPUs'](!?/]'6j*]_oJC^AbhE^AO#iO7nV*NrY:<O8Y1=ci2;i
+ch#H^blQ&6rltJe#gUfDcHsqce'S*ArmD_1dF-LjdF6RldaQ[nda6Fhe'lakdEg+acHuM^rCd&^
+ohG-TpJ:KXohGBYr(HiXrCQrYq+(?Pr'g9Hq*Y0KrkAWP^VIV!_#;+L_@si*`Poj<aii)Yd*L+i
+f%Ss:i8FRmrnn">io&\Ni8FUn(ujT8j5f7]jlPXfkiqBum-X93o(2PLqYc!FU]1DlU[8![+g08f
+bEAH'X.u:n@D'(TYcb(/X/K6.@pr_N>\LFfbf@_Ys"XHFnF#]1lg3p"kiLjbi8*/@gtLN8eC)ah
+cHOPVbfn>Vbf7Q9^qI:f\[])W\$icTo!\Nf!_>mSr^qW49MJ5V:Jakb;H$Ln<`W:(=^#'8?=.)K
+@Uit]BP;-rD/O<4EccGJG^=^bIt3-'KnbD@N/`m[P*D5uR@B_<TV8-VVl6VrXfnt7ZaR?R]"G_k
+^r"%/a2lEHc-FY_daZh!f@em4h;7&IiT&t[k3(sml0I^&mI'H3nF?PL!V>s_o`=d\rV6Egs8)Zj
+rqucoo_sFAQN)I~>
+JcC<$QN-XWrVc`nr;6Njs7uZh#5@ibp%@tKrphl8nF,f4m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[om0WIY*RWNpr,0Nr>%<OSt74Nr>%-OSj"oDZF\MD=_WFDt\)KSbelV
+SbATRS,SogS",t;R[TY5S=>q8R[]h9rg`tY!1NnW(7L__S!f_7S!oe6R[KY7R[KV5R@9P4rC[#]
+r(QcXp.k?Xp.k9TrCm,^q+CTWrCH`Sr'pTQogJUCs$HaRrL!SPrgNhUrga"Z!hQ$Vrh0UlUSXid
+WiN5%ri?1'XK;B$2QEj]Y-5(6Z*UdD[C!?M\$rlX]">Vg^;.V%_o9X9ai_iRdaQe"g>(N?hr<e_
+m-jN:pA"L^JcE=],enu@p&G&PTZNgAF%h(/G>;(oLP:D5J:`9$:Jb(k;c6LrL7%t+N;ka1f#>MC
+^UU_ZZa-m?YH=q-Wi)bkV5'fZTqJ!KS=>t7R@'A0R[9;(PE:icNJiXOMN!FKn;7-7!_>mSr^qW4
+9MJ5V:Jakb;H$Ln<`W:(=^#'8?=.)K@Uit]BP;-rD/O<4EccGJG^=^bIt3-'KnbD@N/`m[P*D5u
+R@B_<TV8-VVl6VrXfnt7ZaR?R]"G_k^r"%/a2lEHc-FY_daZh!f@em4h;7&IiT&t[k3(sml0I^&
+mI'H3nF?PL!V>s_o`=d\rV6Egs8)Zjrqucoo_sFAQN)I~>
+JcC<$QN-XWrVc`nr;6Njs7uZh#5@ibp%@tKrphl8nF,f4m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[mEJQ92&4M;#=,F;#4&e3;Y`$2uku43;HVZ=BSd/=BG?""BS]-=]tZ)
+#$4i+='/R+rE'&#r`9)%r`B,#s&B&"rDiMk"BSW)<E8uirCd&^ohG-TpJ:KXohGBYr(HiXrCQrY
+q+(?Pr'g9Hq*Y0K!a&N*r`K/$!*K5%s&o;(!*fD,r`]D.?2e.5?t!JN@/aLM?<piC?!guJ@q0(^
+B520sCM[j*DJsK6F8g8WFa&+VH?spdIt3*%KS>2;Ll.(JNK93cPa7Z(R[ftCU84ZbWN3/)ZF%-S
+^;%M%`5fs@bKS8YdaZdtf@\g3gu$uGi8Ne^mHsE8pA"RbJcG$8-XTDTR)kt!;0#Db2CgsR4>Jfc
+7n?->77Kd:3B98f5<V.o9iY.k;iUeZe!"f^ra6.@?!LT;>?b98>?Y04q,[]$<`N'trDW_q%T?8'
+;c-Fj;,C.f;,:"bn5'$R!_>mSr^qW49MJ5V:Jakb;H$Ln<`W:(=^#'8?=.)K@Uit]BP;-rD/O<4
+EccGJG^=^bIt3-'KnbD@N/`m[P*D5uR@B_<TV8-VVl6VrXfnt7ZaR?R]"G_k^r"%/a2lEHc-FY_
+daZh!f@em4h;7&IiT&t[k3(sml0I^&mI'H3nF?PL!V>s_o`=d\rV6Egs8)Zjrqucoo_sFAQN)I~>
+JcC<$QN-XWrVc`nr;6Nj!;ZTg!Vc<eofDa:o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB`59=)]tCqd[UjE3VP_#;](rr<]_f;@]_oDA]'?p+]`#PB^&YkE^AYh4NrG(>OSFn7
+OT(=?OSR3&d/;5ec2c)fcMu,mbg"AUc-613+O&-WdF$=ed*U1ed*g@kdEp4ge'ZRkd*g@ie'lgn
+eC+?CrQbPm8kT%TrClr[qG--JqG-cZrCm/_q+CTWrCH`Sr'pTQogJUCs$Hb$"Mqmh^VKfas2#Ac
+`5Td<aN;ZTe^N!sf@\m7htuC4i!86&lKmZmi8FUn!oi8#roF+@s5jgSkiqBum-X92o(2PLqYc!F
+U&P,Orr4/<`rGRoS<L"MT3Pl4[^*0@X/i8!>?t`I?X6s/ZHLJ4`eaX7rqc<Wmd9H/m-*WpjlGFZ
+h:p]@h:pQ1dE^"^c2Podc3_b>`l#U.]t(V^rjN!?[C<X9[f/bu84cDP8q'E,9heAY:f("e;c?Xq
+<``C+>$G6;?XI5N@qB7bBPM=!DJsN8FEMePH@('hJ:W?,L5:\ENK90aPEhK%R[ftATqeE\VlHf"
+Y->4<[C3TU]Y2(q_Sa@4aN;WLcHjndeC<($g"P3:h;@/Lj5]4_k32'olKmm)mdKW6nc/.\oCW%T
+!quB_rqQNhs8)Zjrqucoo_sFAQN)I~>
+JcC<$QN-XWrVc`nr;6Nj!;ZTg!Vc<eofDa:o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB`59=)]tCqd[TR'XIY3W?Nqn_9OSb(=OSY%7OSk19Nr>%-OSt=;DZ4SRDY\/ADZ"GP
+D?=`oDZ-.&SH#/VSGJ]dS=?"<R[]b7R@9V8S!ob6Rf8fVSJ%NaS"#t=S"#q9R[TY6S",n:Rf&TR
+RKAsN9)VE]9_V9X:?>:J:A7K]9`7W[9)V?[8GPdR7f5^J7/94M63*GQR/WNQRf8fVSH#/[SdV0`
+USOWYUSargWiQ'!5-:ofX0&\4Y,nb-YHY46Z*L^D['d?O\%&u[]=bhk^qmk(`5Td=b082\e^iC,
+gYL]BiT'%`lL"-5p%eL`JcE:\-*HP5s2UGa`G]g6IX666;br4'K7\W)It1?l<E)mp;L4(aQBmep
+rtP+R`59=&\@/cNZE^U:Y-"_&Vl-BjU]7%fTDtDsS!ob4R@'D1Q^*f!OH5E]Mi!@KN/NM]M>g!H
+84cDP8q'E,9heAY:f("e;c?Xq<``C+>$G6;?XI5N@qB7bBPM=!DJsN8FEMePH@('hJ:W?,L5:\E
+NK90aPEhK%R[ftATqeE\VlHf"Y->4<[C3TU]Y2(q_Sa@4aN;WLcHjndeC<($g"P3:h;@/Lj5]4_
+k32'olKmm)mdKW6nc/.\oCW%T!quB_rqQNhs8)Zjrqucoo_sFAQN)I~>
+JcC<$QN-XWrVc`nr;6Nj!;ZTg!Vc<eof2U8o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB`59=)]tCqd[R*AP8ki1W:]OAi;"miF;"mi_3;Y`&3;bf93!;6$3*9;Y<rcA%=TMW+
+q,RT!=BJ`(=9DW*<EK-$$s-P4=&r@'='/O*<`f)ss&K,$pJq>s8kT%TrClr[qG--JqG-cZrCm/_
+q+CTWrCH`Sr'pTQogJUCs$?cg=BPN'!*K5%s&o>)!*fD,s'>Y/!*oJ/#%(bG?X@&Gra#h:@U`bR
+@:E^FA.*$`BkqL#D/O92EHD,$:N^l+H$Xd`I=HcuJq\r7Ll%"IN/is]OckroR@9V:TV80YW2Zi"
+YHbIC\\>kq_SsO9aihlOcdL=nf@o$9hVdAPiSrq[lL"-4p%J1WrIP"4rtJXr`ia)IM/b4,1Hdi^
+0fCmZ7n#oH705q<3W;5J4?Z50<)cdpNW0I.NG`65?X@&E>[(B9>P_M&<rZ;%<sMc+<`E!t;cN`p
+s&9G+;H$Fk;Gg7e;,L.e;".9[7fl4Q8cD>292&&S:/=\_;,U=k<)lt#=BSg3>[:]D@:E_XAnPdl
+CM[m,EH6/DGBeF\I=?]tK8#&9M2R@SOHPfmQ^F53StD^OUo(&iX0&P/ZEpsI\@K8c^VI_(`Q$!@
+bKS8XdF-Oof%8U/gYL]Ci8N_VjQ>Ugl07L"m-X60n*olIncA@Srq-?dp\4[^s7u]kr;6Kkrr)Kg
+JcD&9J,~>
+JcC<$QN-XWrVc`nrVQWks7uZhs7ZNerq/8CoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oG`P]R.^V.7i\@,sgKr1c\qRc[<s1A3Ake$f+rOr!?pqQigm#M(+s,[8BOSY%9OT1@C
+ONu/Bci),jbg+N.bm;P<c-4DXbg=`9cPk3Xda6Cgda?Ijd*g@id*U4ie'capd*g@fd/M>kcM^E7
+9_hE[:ARcM;#3uc:A@Q^9`7W\9)V?[8GPdR7f5^J7/94M63+n"_>_=O_[j]+aN;QHc.1P%f\"p5
+hVnIp&*)[0io/nYlgXT9lK@6fj8S$<j8S*PjlY^gkj%I!m-X60nalDHq"t#@s.'*3[f=UCAX-`%
+Tq,\"[^*0AXfJM$>@(fJ?X-jAZHCA2`eaWtrqZ9Vmf)Sum-*WpjlG@Vh:pfCh:gN1dETt]c-4AU
+cd'hZ`l,[/]t(V^rjN!>[C<X9[f/es8,u6\8c_RYr_7f9:Jakb;c?Xq<``C+>$G6;?=.,M@q9.`
+BPD6uDJsN8FEMePH@('hJ:W?+L5:\EN/j!_PEhK%R[]n@Tq\?[Vl?\uY->1;[C3TU]=bno_Sa@4
+aN;WLcHjnde'ut#f\5*9h;@/LioB+^k3)!nlKmm)mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZe
+rdk*8s*t~>
+JcC<$QN-XWrVc`nrVQWks7uZhs7ZNerq/8CoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oG`P]R.^V.7i\@,OLDgm=uqN(Q9s,[)>rf?f8ooJU(plY8f!,qgRqJGhAr,;UQ!cOU!
+r13GLq4%;P#b%6OR@0P4S!s>E&"B#YS",t=S=H.>S=H(;RJiQZS=>q8R[9G0rgE^XrCm#]qbHu`
+kYV+Or(d#]rCm/_qF^]XrCH`Sr'pTQogJUCs$HaQ!h#LFrgNkVrgX[nSt;RHTVJB]Unt#hWi`G,
+XfSY,riA2`Z*h-LYck45Ycb16ZEppF[C3QR\@T;a]Y2%o^qmq,`Q-*Cbg4_ff%A^2hV[8NjQ>[k
+m-sW>q"jr?s0_kMdZ*R_F\lsPHZsX4:PXXVK7ST'Inrm@<)ZXlLPD.]QBdF/1[iQ,^qdUl[C!6F
+Yct=5XJr.sVPU&`U7n9QSt2@>R@9M1Q^X>0QBRMnO,f3XMMm=MMXQE$8,l*[8cD<_92,=ZI83R7
+:f1.i<)lt#=BSg3>[:ZC@:E_WAS5[jCM[m,EH6/DGBeF\I=?]tK7nu8M2R=QOHPfmQ^F52StD^N
+Uo(&hWi`G.Z*UjH\@K5a^VI_(`Q$!@bKS8XdF-Lnf%8R.gYL]Ci8N\UjQ>Ufl07L"m-X60n*ol<
+o(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s-E\8~>
+JcC<$QN-XWrVc`nrVQWks7uZhs7ZNerq/8CoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oG`P]R.^V.7i\@+^l7nQKQqG@)es%r;anPB3_oMG3Xp,E(53;tr)3<)#=3WhB%3'$h;
+qc<c"r`K8(=8>l!='/U.r)a/)<`N4&=BPQ("'AT*<r5qu<r#bq<WH5#<WZ9%<W6%t9DqQ[:&@]^
+:ZtXO:]*u_:&Rca9DV9Z8c;3U8,PjS7J0(E6iTLQ=T2D$=T;P'=oqo5?2e(/?2e.1?2e.4?X[AN
+ra#h:?=%#J@qK6M@f9dDA7]@eC27X'DfBarFT6IaGBj+48:,c6J:W<*KnbG@MN!OTOHG`jQBmr/
+S=ZFJUo12lXKJe4['mKV]tV>#`Q-*DbfnA\eCE4*gtglGiSrnYk32*tnalGKqu)*Gjo6FA]6-K,
+9JS(S0KqQ\2Dmup77K^77RfC!5X.Ip4\STL;ZKgWrs-2jBk(OV>[IA5"'So6=oMS.='/L(=BYW)
+!*0"ts&/nsr_j)%<E)mq;H$Ijr_N\o:JamW:]<la8,u6\8c_RYr_7f9:Jakb;c?Xq<``C+>$G6;
+?=.,M@q9.`BPD6uDJsN8FEMePH@('hJ:W?+L5:\EN/j!_PEhK%R[]n@Tq\?[Vl?\uY->1;[C3TU
+]=bno_Sa@4aN;WLcHjnde'ut#f\5*9h;@/LioB+^k3)!nlKmm)mdKW6nac8Bo`"Lbp@n=\q#C0i
+qY^6ir;QZerdk*8s*t~>
+JcC<$QiH^WrVc`nrVQWks7uZhs7ZNerq/8CoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@-!hLSgu^qn)I4qn)g>pUg45rOr0DoY:?am>h4-rK%)COHBI&plPI"
+o[!E[!6k2^qTK2id*C%ccd1#<ciDMmd0\+Ed*g@hd*^:jrmD&!daQRjd*>;_9_hE\:A[iC;#=&e
+:AIW_9`@]]9)V?[8GPdS7f5^J7/94L6N4k%_$.`n_o0O6rQ,Plce%+4hqm2IioK7dl0&'-$KU=6
+mdp/Gna5W)rT+"?roX7D&*W9Clg4!*mdTc<p%J4Zrdk*>rudp5Vl+6pA#Q,nA7)jQZ*170X/K9/
+@pr_L>dCZWb/_MXs"aTKo^M;:m-O'$kN(achqZuChqm2Ce^DdhcHXSXbg4P[bf[oB_8*ap\@B#X
+[^``S\FR-.8,l*[8cD>292&#R9hnJ\:f1+h<)lt"=BSd2>[:ZC?t*SUAS,UiCM[j*E,fr@G'A4X
+I!pKpK7nu7M2I7PO-,TjQC+)0SXuLKUnsugWiW>,Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=lf%8R.
+g>(N@i8N\UjQ5OekiqBum-X60n*olInd"dYo_%nNp@nR]s7u]kr;6KkrVcEgJcD&9J,~>
+JcC<$QiH^WrVc`nrVQWks7uZhs7ZNerq/8CoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@,OLDL[7tqiC!'pQ+g*oTAQZqebtCqJZ>&r13MNpRD/Ps-s%Wrg=._
+S=5q9R@0P5S"#uIS->=LS"-";rgEbS#b.9OS!f_5QqRBOq+^c^qbQ$EqbR/cq+^f]r_*)[rCQrY
+q+(BQr'g9Hq*Y-Js-a(YR$jD4rgX%\St>qR:8+JaX/`+sX/iA+Yd(@7Y-+n/YdCpO]XP8RZ*:F9
+Z*CXB[C3QR\@K2_]=bhk^VI\'`5]m@bK\A]e^rI-gtglGioK:fm-aE8p%S=\JcE.X+l%P7JUCC7
+;1!P1<)JI+KS+i,It(6j<E)jn;MU!nQ'R\ortah@_nj't[^EKJZEUO8XK&7uVkp/aU]-r,T:DI@
+R[KV4R$jD1QBm_uO,o<\N/EONMi*=IMXlW'8,l*[8cD>292&#R9hnJ\:f1+h<)lt"=BSd2>[:ZC
+?t*SUAS,UiCM[j*E,fr@G'A4XI!pKpK7nu7M2I7PO-,TjQC+)0SXuLKUnsugWiW>,Z*UgG\%0,`
+^;%M$`5Td<b0/&Td*^=lf%8R.g>(N@i8N\UjQ5OekiqBum-X60n*olInd"dYo_%nNp@nR]s7u]k
+r;6KkrVcEgJcD&9J,~>
+JcC<$QiH^WrVc`nrVQWks7uZhs7ZNerq/8CoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@+am7ncWSqb[2fs%r2^pJBmInMpM.r&=[:oJlk2r]:'>rE0)&r`K&!
+!*K5'!E`G!<WuQ,=]nj/r`B)""BS],=BPQ(r`8qu#?Fi*<E3!t<W,tu=8Z)"<D39aq+^c^qbQ$E
+qbR/cq+^f]r_*)[rCQrYq+(BQr'g9Hq*Y-J!*K2$!E`M(=oqo6?2\"/?!mG7!aoGFrEfn<?X[DT
+An>I_ARtdM?"@MYB523uD/XE6EcZ>FG'8(SH$OacIXm!$KS5)9MMmFQNf]BfQ'[o-S=Q:GUSXle
+WiWA-Z*^sK]"Gbm_8O@8bKS8XdaZguf\50=iSrnYk3)!pmIBiAq>:)@s5X,"ImK;[1b(=84Zkhb
+2+L,)7R]a97Q<Fo5<_.k9hkUc!*#!Y$2q/]BjkFW>[:V6>67u4>Q.h+=9;N'=T);)<E)pr<Drfp
+!*0"t%oQ>);Gg=h:f("d:/Fe`;"@E]8,l*[8cD>292&#R9hnJ\:f1+h<)lt"=BSd2>[:ZC?t*SU
+AS,UiCM[j*E,fr@G'A4XI!pKpK7nu7M2I7PO-,TjQC+)0SXuLKUnsugWiW>,Z*UgG\%0,`^;%M$
+`5Td<b0/&Td*^=lf%8R.g>(N@i8N\UjQ5OekiqBum-X60n*olInd"dYo_%nNp@nR]s7u]kr;6Kk
+rVcEgJcD&9J,~>
+JcC<$QiH^Wrr)ior;6Njs7uZhs7\VKp%@tLoCDJBnF,i6m-O''l0.<mjlGI\i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]O,^:_(g\$fmgLSgsF]CNW7]D9,:]D9,<^&>\7^\Wr_NrG+=NrG(>OSt=AOT1C<
+OT3Z-ci)/_chl#UblGuecN_bEd*L(ddeqDsdEg7gd*^4ddJVDqcd:(ed/H`8:&Icb:\.EO;=dW_
+:]4&a:&[ib9DV9[8c;3U8,YpT7J0(D6iTIY`5BI0`5BO5a8X1)b0/2bioT=ajQ5Rhlg4$*l0.Bs
+lg408p\O^XnF#T+l0.@1l2U#Kl2KrUlg=-/n*oo?pA"OaJcD/<*h0'dQt<4kSn;B>ZEg[9XK&4'
+?".5K?!O\@aN;KBM#RYWp[I_@mf)M^l0.3hj58\KhW!DHg""LKc5+[KcHje]bf@Z=^q[Om\%&oX
+[^`cT\FR--7t4'$8P2TJ92&&S:/=\_;,U=k<E<.%=]np5>[CcF@U`kZAnYmnCMds.EH?5FGBnL^
+I=Hd!K8,/<MN!OUOckrpR$jG7StMdQV5L8lXKA\1Za@0M\[oGf^VRe*`Q-'BbK\>ZdF6Uqf@\d1
+gtgiFi8WeXjlYail0@U$m-aoB$h3]Wo(2JFp%A%Pp\jjgq>0scqu6NlrUg)?s-Nb9~>
+JcC<$QiH^Wrr)ior;6Njs7uZhs7\YLp%@tLoCDJBnF,i6m-O''l0.<mjlGI\i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]O,^:_(g\$fFLDL[4rqiBs&qiC9/n<*?\rbq[Oqec%Er,;G%r13SPopblLs-s%W
+!1EeT#+V-MR[]k:rL4%^R[fk9S=5iERK&]ZS!]V4R[O.KqG$l_rD3#]mnr[QrD3Aeq+^i^rCcuZ
+r^m&Zq+(BQr'g9Hpd>'J"IbaGR@F2G!M,h\T*(gaXKVW*"0Si3Z2V'0YPta5Z*LjN]=u"k\$`O@
+ZN[bF\$rlXrODm=,J1V&^;.V'`Q63Ebg+Vbe^rI-gtglGioK7em-aB6o_/.Yrdk*Uru662AoLXq
+H$*.dM2$_9JV&E&:JXti;,U;HL6qn)N;jmXai)$1\[JoPZEUR:Xf\S&Vl$>eUSOWWTU_OArgF@c
+R$a;2R$Nu#PE(]`NJi\nMZ\imM2Lk\rC;?.8P)NH91qrQ9hnJ\:f1+h;cQk!='8[0>[1TB?t*SU
+AS,UiC27[(E,fr@G'A4XI!pKpJqJf5M2I7OO-,TiQC+)0SXuLJUnsufWiW>+Yd:^F\%0)_^;%M$
+`5Td<b0/&Td*^=le^rI,g>(N@i8EVTjQ5OekiqBum-O0?mgJXTo()DDo_%nNp@nO\!r;]hr;6Kk
+rVcBfJcD):J,~>
+JcC<$QiH^Wrr)ior;6Njs7uZhs7\VKp%@tLoCDJBnF,i6m-O''l0.<mjlGI\i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]O,^:_(g\$e[m84u_S;#aDj;"%9Y:uG4=3;tr;3;tr33<)#<3r`@\=T)A&=Sl/"
+=T2G(=BG<!#Zk,2=]ed-<`f9$"BS],='5B%!*9#!s&KA)<)lms<E3*!=8Z+u9_qK]:Amu[;"%9Q
+;#O2g:AIW`9`7W\9)_E\8GPdS7f5^J7/0.L6N:*l<``F->$G6;r*08/?iFF8@:3JMrF#V3#@LtL
+A7fFbB)?0=Am8n^CM[j)DJsK7F*)PJGBeCZH[^EoJV/Z0L5:YCMi<[XP*D9"R@9Y:T:r!TVPgGq
+Y->1<[C<ZV]Y;2!a2uNKcHt%ie^i@)gYCZDioK:dlKms0o_&"VrVhBJiVsfZ1bCR<4Zkea2b$8,
+7Rfg:7QELp5<V+k9hkRbNrK:QX+"_i@/aL4>S(+B=^506>$+p0=B8O*=B8K%<<#ns;ufkp<"Do*
+;Gg7f;,C(d;,0qc:JgUXrC;?.8P)NH91qrQ9hnJ\:f1+h;cQk!='8[0>[1TB?t*SUAS,UiC27[(
+E,fr@G'A4XI!pKpJqJf5M2I7OO-,TiQC+)0SXuLJUnsufWiW>+Yd:^F\%0)_^;%M$`5Td<b0/&T
+d*^=le^rI,g>(N@i8EVTjQ5OekiqBum-O0?mgJXTo()DDo_%nNp@nO\!r;]hr;6KkrVcBfJcD):
+J,~>
+JcC<$QiHaXrVc`nr;6Njs7uZh4nn[Dp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*L"]bK7fD`59@*^:_%f\$fjfKVkXB]C`c8]D0&=]DB2=^&>\3^\Nl]NrG+>NrG(@OHG\&O91K)
+OT(C@ciDDjcM>f]cMu,ubg"DVc-=JWc-4GVbg$(0s3:Jg!71Ykrm;>'dEg+ccd:+ge'ugodF$Cg
+9_qK^:Amu_;#!oY;Ya2`;#O2h:AR]`9`@]]9)_E\8GYjS7f5^K7/94K6N>"(`XBc*a2uHGbKJAg
+j6HU/"mkXEn*fcEn,Mk`o_8+Ws8;]co'ZMG'CbJYmHs9+lg4!*n*ol<o_81YrIP!7ru6rcB;qVt
+B48<UZE^R7XJoE0@UWSJ>dCZUaN')91B$t;n*]T0lg*fujl57VhV[2LhV-W2dEp1ac-FV\cHjbZ
+`l#^1^V..d\@8uV\@/lVo!eQf!_>mSr^qT39MJ5V:Jakb;H$Ln<`W:(=^#'8?=.)K@Uit]BP;-r
+D/O<4EccGJG^=^bIt3-'KnbD@N/`m[P*D5uR@B_<TV8-VVl6VrXfnt7ZaR?R]"G_k_8=.0a2lEH
+c-F\`daZh!f@em5h;7&IioB(\k3(smlKdg'mI'H4nc&(`oCV_Kp@e7Zp]1-hqYg<jr;HTdrdk*9
+s*t~>
+JcC<$QiHaXrVc`nr;6Njs7uZh554dEp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*L"]bK7fD`59@*^:_%f\$fFMDL[4qqN(91rf?i9s,Z`4m#gjVrbq[Oqec(FrGVJ$s./qT!1WnV
+s-j:_S"#k9S!oh:r0m\TrL!_UR@F/D!1EhUrgX4^S!ob7R[T`BRKAtG9_qK^:Amu_;#!oY;Ya2`
+;#O2h:AR]`9`@]]9)_E\8GYjS7f5^K7/94K6N<JSS,SoYSY#hQ"JDKeY-@o1s0D[2"LPSF[C-"@
+4LM`4]YD>!^V%.d\@K2^]=YYc\@8uY\[oDc^:qD"`Q$$BbKeJ_e(*%%g=tH?iSrt^l0Rj-o(;YO
+qYc!FZ2YbVEDq:1G#hLtL4t52K7JJJ:fUIl;Gi1'QBmeort+&._o'7"\$WHHYck73XJr2uVBVk3
+US=ERSXl7=R[]_4R@BY4QB[VsOH5E]Mi!CMMi*=IMXlW&7fl4Q8cD>192&&S:/=\_;,U=k<*!%$
+=BSg4>[CcF@:E_XAnYjmCMds.EH6/DGBeF\I=Hd!K8#&9MN!OUOHPinQ^O>5StMdPUo1/kX0&S0
+ZEq!K\[oGe^VRe*`Q-'BbK\>ZdF-Opf@S^0gtgiEi8WeWjlYail0@U$m-X60nF?MK#4qK[p%J+R
+rV-BgrqcTjrqu`no_sFAQiDR~>
+JcC<$QiHaXrVc`nr;6Njs7uZh554dEp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*L"]bK7fD`59@*^:_%f\$e[n84lTPo2,<]r_WAes%qNKlo=u)s#Bs;s#:!=qDeL8s#U*]r)il"
+!*K/#!*K5'!E`G!<WZ?)=oMM'=8Q%q=8Z+t=8u>$<W?#*<E<+#='&F'=&hrj:&Ric:\R]\;=[W\
+;>*ib:]=,c:&Rcb9DV9[8c;3V8,PjS7J9.F6iB=T='/U/>$Ll/%p`LK?t*VU@UWYP?XR8N@K'^=
+A7fFbAc-0AAn_0X>A@tiCMdm)DJsN8FEDYLG^+L\I=?a!K7no3LPL_DN/j!`Q'Rc)R[fq@Tq\?[
+Vl?c$Z*LaE[^W`V]>2;(b08)Td*gFof%8R.gtpuKjQGdmm-aE8p%\C^rdk+,ru3RI0KqT\2`=,p
+7n?*=6q00t5X.Cn4AALJ;c8VT&a,p7An#1V?X@#B>$+s5>$G2/=9Vc.='/L(r`&nrrDWl!<)Zcp
+;[ZE";,C(d;,0qc:JgUXrC6o[8P/nRI7m7.9hnJ\:f1+h;cHdu='/U/>[1TB?t!MSAS,UhC27[(
+E,fo?Fa&(VH[UBoJqJc3Ll..NO-#NhQ'[o.S=ZCIUSOfdWiN8*Yd1UD\%0)_]t_D#`5Td<b0/&T
+d*^:ke^rF+g>(N@hr*MSj5oFdkiqBum-O--n*olHncn^Xp%A%Pp\jjeq>U6hqu6NlrUg)?s-Nb9~>
+JcC<$QiHaXrVc`nr;6Njs7uZh#5@ibp%@tKrpho9nF,f4m-O'&l0.9ljQ#:Zi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$]^dKVkTWq7HF7qRc@3rOr0Dl+d%RqMtQ7qi:Q7pQ,H;OHKCds3L\i
+r6P&]p<<T]rQY;b"O56<d*M^=#11Z@d*g7fr6GMmdF-FkrR(\mqb@&brD32bqbd)cpJ^far)*5c
+rD3DfqG$r_r_*)[r^m&ZqFCHQrC-BIq*Y*I!QE+YaT'?gbKS8^gu[nin*g8Gs7-Edo^qbGo^qhU
+p]16krr`/op%/1U&bbnio'c#6mI'H5oC_eNq>:/Bs-*I#BW7c!>[b+JZEUL5XJoB.@pr\K>dDJm
+a2`u8)#a0tn*fW0lfmZsjQ#7Vh;R>Ph:gK0d*M[;(!k7QcHODK_Sa4)]stP]\[T&X[^Wd;\,Ahs
+8,u6\8q'E,9heAX:Jand;c?Xq<``C+>$G6;?XI5N@qB4aBPM=!DJsN8FEMePH@('hJ:W?,L5:\E
+NK90aPa.T&R[ftATqeE\VlHf"Y->4<[C3WW]Y2(q_Sa@4aN;WLcHjndeCE.%g"P3:hV[8Mj5]7`
+k32'olg4!*mdKW6nc/.\oCW%T!VZ9dq#C0iqYg<jr;HTdrdk*9s*t~>
+JcC<$QiHaXrVc`nr;6Njs7uZh#5@ibp%@tKrpho9nF,f4m-O'&l0.9ljQ#:Zi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$]=KDLd:qqiCH4qN's(l&kFPrbq[OqJH%G!,q7prL<_TpR;5SS"0JI
+!1NkSrgNnVrgO.]R@9V9S",uIRK/cTRg,=NR[]b8RJT_X:Amu`;#=,a;YO,a;Z'De;#O2h:AR]a
+9`@]]9)_E\8GYjS7f>dK7/94K633RHrLX%]-_R0.W33D3ZEppG['mEQ\@T2Z\@K/^]Y2+u_SEt%
+^:_+m^VIUs]Df>g]">Se]t_A!_o0U;bKS8ZdaZh!g"P39hVmJTk3;4"nFH5Fq"ajdJcDtS&QF1(
+G"kkkLP:A3Jq/>H:KCKp;$;W@Q^3qqruTk8_o'3u[^<?FYck43X/MtpVkp2aU7n3NSXl:?Rf8]h
+R[]\1Pa%AoO,f3ZN/<INN/EFJMXlW&8,l*[8cD>292&&S:/4S];,U=k<)lt#=BSg3>[:]D@:E_X
+AS5[kCM[m,EH6/DGBeF\I=?]tK8#&9M2R@SOHPinQ^F53StD^OUo(&iX0&P/ZEpsI\[oGe^VI_(
+`Q$!@bKS8XdF-Opf%8U/gYL`Di8N_VjlY^hl07O#m-X60n*olIncA@Srq-<cp\jmeq>^<iqu6Nl
+rUg)?s-Nb9~>
+JcC<$QiHaXrVc`nr;6Njs7uZh#5@ibp%@tKrpho9nF,f4m-O'&l0.9ljQ#:Zi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$\Rl84lQNnkf?`qG>X<krA>rq`"R9pf[Sur)j#%r)Wl#r`K8(=8>l$
+='/U-=]ec&<r,nr<rH,"<WH/!<<#tu<rQ/#<r5Vj:Amu`;#=,a;YO,a;Z'De;#O2h:AR]a9`@]]
+9)_E\8GYjS7f>dK7/94K63^Rr>$G6:?2e(3?!^iE@fBjM@UNPM?smGQ@q0(]B4b^dB4kiUBO>Ih
+Ci!s*Chmj'CMds-EH?5EGBe@XH[L9nJqJ`1L51S@MN!RWOcu)tR@B_;T:r!TV5L;oY->1;[C<WT
+]">\l`5^!EcHt"hf%8O,gYCZEj5oIhlKms/oChqSqu)*Gh>[X44Ztk^2?$)T7R]^676*=k5<V(k
+9iV*jNW0RCR<<(M@:*>G>[(B6=^,'6r`KS1<``@)=&r=#<)`cq##eN$;c?XorDF#";,L.d;,L+b
+;,:$Z:]3f`8,u6\8q'E,9heAX:Jand;c?Xq<``C+>$G6;?XI5N@qB4aBPM=!DJsN8FEMePH@('h
+J:W?,L5:\ENK90aPa.T&R[ftATqeE\VlHf"Y->4<[C3WW]Y2(q_Sa@4aN;WLcHjndeCE.%g"P3:
+hV[8Mj5]7`k32'olg4!*mdKW6nc/.\oCW%T!VZ9dq#C0iqYg<jr;HTdrdk*9s*t~>
+JcC<$QiHaXrVc`nr;6Nj!;ZTg554dEp%@tKo()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCqd[^BUeKr1]WqRcU:p:L(3rk89EkeI/3!58/erJp]5qi:T8pQ,B9psAuc
+!m]-<qp,5dqTf#`$-^Z=bg"AVc-4H2bQuJ=cI'tadEp2;ciMP?rm;(uc-Xhcda-CjdFA.irD*>f
+q,$udr)2QRr)3GiqG@,dr_E>br_3;aqF^`YrCH`SrC6]RogJUCr^%CAai_`Kbg4_ghWO=roCV\J
+p\+@Tp\=a^!;QQh!W)fprr`5sq=ssb&Gl4sp%7kIo()DEp%\@Zr;M9IOT-,lTNu$:Za-g<XK8I+
+?"@AM>]d9ma2Z/Ts"aKFn*of5m-Ns"jlGL]h;@5OiS</=daHLgd*U+cd*L"]a2Gp5^V.4g\%&uW
+\@K&X\FR*/7fGpX8,u6\8c_RYr_7f9:Jakb;H$Op<``C+>$G6;?=.,M@q9.`BPD6uDJsN8FEMeP
+H@('hJ:W?+L5:\EN/j!_PEhK%R[]n@Tq\?[Vl?\uY->1;[C3TU]=ktp_Sa@4aN;WLcHjnde'ut#
+g"P3:h;@/Lj5]4_k32'olKmm)mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*9s*t~>
+JcC<$QiHaXrVc`nr;6Nj!;ZTg554dEp%@tKo()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCqd[^B1ID1@(nrf@#>s,m5@p5e^)k`Pk+lu)f@r,2=Iqek_ir1!YTr0nIj
+S"#k9S"-";S!oe6R@9S6S=5n9R[O,Cs-s%Y$_*QOR[]h:R@BY6SGl7]:B"&b;#F2g;WC^R;Z'Dg
+;#O2h:A[cb9`@]]9)_E\8GPdS7f5^J7/94L65Q5cTUqgLTq\?^YHkOC[^WcU\@K/]]=\!R&\Yrq
+_nj.)_8!_!^qmq*^qRM[]Hk2)^qmn+`lZBIcHjnee^i@*gYCWAiSrt^lKms-o(;VLq>:)@s/uA<
+H$;t]M2-h<JUr?$:Jb(k;,UeVQ^3l$N;jOcd`0/@]t(PWZE^[;Y,n\'W2KWk"JhfcTUu.Qs-jRf
+R[T_7R$O#%P)t`bNK/pSrJL`6MMgt]!(QrXs%!,]r^m2a9`@b7:/=\_;,U=l<E<1'=^#$7?!^lH
+@Uiq[B4u!pCi402EccGJG^=^bIXm!%KSG;>Mi<[XP*;/tR$sM9T:r!TVPgDnXfen5ZaI6O\\#Pi
+^r"".`lQ9Fbg+P^daQ^sf@em4h;-uHiT&tZk2tmll0@X%mI'H3nF?)?oCW%T!quB_rqQNhs8)Zj
+rqucoo_sFAQiDR~>
+JcC<$QiHaXrVc`nr;6Nj!;ZTg554dEp%@tKo()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCqd[^ACj84lQNkYTc+juE&pr&F=O!*K/%$WpJ3<`W:(=BSd/=8>l$='/R-
+=]ec&<WuQ,<`W:'r)Wbts&K,"r`&ntr`0##r_<>dr_N>dr)*Aij&>kRr)*;erD3Dfqb@&`r_*)[
+r^m&Zq+(BQr'g9Hq*Y-J!EiY)>lS(@?=.)LA7T7^@piYO?t!PUAH$3@AS,OeB4bagB5)*rCi+!)
+CM[g&Ci+*0EccJKG^4U^I"$TsJqJ`1LkpnFN/`m]Pa7])R[ftBTq\<YVl6YuYHbFA\$ro[]Y;2!
+`Q?<Hc-Ohff%A[1h;@2OjlbppmI0W<p\=R\rIP"'s8P1a1,_Wm7f>aa7QEIn5!D%o9iFtg;iUe^
+c&ZgS@:!5Gr`]M.=B\p3r`T;'rDjA/<E<*u<)cdq;cQdr<Vo]#:f:.f:Janb:An#[:B3l`8,l*[
+8cD<_92,=ZI83R7:f1+h<)lt#=BSg3>[:ZC@:E_WAS5[jCM[m,EH6/DGBeF\I=?]tK7nu8M2R=Q
+OHPfmQ^F52StD^NUo(&hWi`G.Z*UjH\@K5b^VI_(`Q$!@bKS8XdF-Lnf%8U/gYL]Ci8N_VjQ>Ug
+l07L"m-X60n*ol<o(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s-Nb9~>
+JcC<$QiHaXrVc`nr;-Qlq>(!a!Vc<eof;[9o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]tCnc[^BUeL8UlXrO_j;ot1(5r4W-El+d84rk8?ErJp<*qi:Q7qiCf=r6YJi
+s3UVgps/i_r6G;ds31Gd#L(H9c-=JVc2PoebPoceci25iciVM>dJhGtd*C"ad*:"ed/Hc=:B"&c
+;#O8h;X[Q`<:<ca;Z0Jh;#X8i:A[ca9`@]^9)_E\8GYjS7f>dK7/94K6N51AcI(1piT]h'p%\C\
+qtg0dqtg3hqYp?lr;HX)rr)cmqYU3fqu$BhqYL3es8)co!<.QLN;jVuA%8nNYck10W`iY<@:*8E
+ZH1)*`eXRLp\"(Gn*]T0kiq9ljPo%Sio8nPg=Xj'dEp:gcd:(bbf[oA_SO%$\@B#W\[K&Y[^`j<
+[fAns8,l*[8cD>292&#R9hnJ\:f1+h<)lt"=BSd2>[:ZC?t*VVAS5[jCM[m+E,fr@G'A4XI!pNr
+K7nu7M2R=QO-,WkQC+,1SXuOLUnsugWiWA-Z*UgG\@K5a^;%P&`Q$!@bKS8Xd*^=lf%8R.gYCWB
+i8N\UjQ>Ufl07L!m-X60n*olIncA@Srq-?dp\4[^s7u]kr;6KkrVcEgJcD):J,~>
+JcC<$QiHaXrVc`nr;-Qlq>(!a!Vc<eof;[9o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]tCnc[^B4JD1@(nrK-o=r/gZ6qN1W;s,cK-qN1Ghs)%IIrbq[Oq/-.Lr1*eV
+n!s<FrLEkVs-inU&"9#WS=>t9S!ob5R%'P4Rf8`TRLYaSS!oh9S=,k7S!]\7RJoq[:B"&c;#O8h
+;X[Q`<:<ca;Z0Jh;#X8i:A[ca9`@]^9)_E\8GYjS7f>dK7/94K64KT[TV8*TV6$o-[C3WWrk&0B
+!5&3C$,4*d^r+(+^qdeb^bEUB_Sa:._83q&_8=(,_o0R8aihrTd*gCof%8R-gtprJj5oLim-a?4
+o(D_OqYU8Cs/l;99iHn(L4k21It(6i=&`'p;21F'Pa.4-)Xu"i_8*Xk['R'DZ*1:3X/W%qVPU/c
+US+9OrgWtXrL+FjR[BA)PECoeNfB!TMMm@MMM[4Jnqd?9r^ZuZ!(m/^IS3@.9heAY:f("e;cHat
+<`iL->?kH??XR>QA7]CeBkqO&DK'T:FEVkRH@1-kJV/W1LP^qJNfT<dQ'Rf+S"6.EU84W`WN*&&
+Yd(OA[^`l[]Y;.t_o9X:aihoRcd:(geCN7(g=tE=hr*JQj5f@bkNV6rlg4$,n*fc9s7-3^o`"Lb
+p@n=\q#C0iqY^6ir;HTerdk*9s*t~>
+JcC<$QiHaXrVc`nr;-Qlq>(!a!Vc<eof;[9o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]tCnc[^ACj7nZQPkYV+Qr)2HMpGi13n2U)$!''mZs&ehps&]8&r`02(=BSd/
+=8>l$='/U-=]ec'<WZ9&=85ho<rl?%r`&nt!*9(nr_EGgqG@,fr)2u^r`&>brDNSkqG@/er_E>b
+rCm2`qb$iZrCHcTr'pWRogJUCrB^Ng>Q.k7?!^lF?t*YWAn>NN@00qMAGp'>B)ZEIAnP^fBPD5\
+C]/)LD,bIoEcQ8EG'J7XH[L9mJV&N-KnkJ@MN!OUP*D9!R$sP9StMgQV5L8mXfnt8['mHS]"Gbm
+`5Ta<b08/Ye(*(&g"YECioK:flg=03o_8.VqY^>Ds4[J\1,_Wm7RT^76q'*qr]^HG4AGcQNW07!
+LhgC*?sI":>5hV6>$5'5>$4m+=&rC&<`N)s<"2c+<`W0u<)Z[m;,L4gr_Ner:f1%d:f-^Y!(QrX
+s%!,]r^qW49MA/T:/=\_;,U=l<E<.&=]ns6?!^lG@Uiq[B4u!pCi4-0EH?5FGBnL^I=Qm$KSG8=
+Mi<[WOcu&rR$sM8StVmSV5L;mXKJe4Za@0N\\#Mg^V[n-`lQ9Fbg+P]dF6Urf@\g3gtglGiSrnY
+k2tjkl0@U$mI'H3nF?PL!V>s_o`Fj]p\ssfq>^<hqu6NlrUp/@s-Nb9~>
+JcC<$QiHaXrVc`nrVQWks7uZhs7ZNerq/>EoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@/bSG(lci\@_CGq7HL9qRua>n\>+<rk8<Ds189Brf-i9mu@4)rK$l<
+!0@!'q9S`Zqp#)brQPJhc-=JWrlbDfb5TThc,n/Qcd:#9d/VB!cd:%ad*Kt`c-Xj4r_EGgqb[5g
+rDNAgoi1lip/LcbrDNVlqG@/er_E>br_3>bqF^`Yr^ciTrC6]Rp-e^Dr'Cb:dF?e&ip6+-q"ssg
+$3'u(rVZQjrVZZnrrrE%rr2inrr)lrJcC<$s8N_A['?j>XfJL*?=dSQ?<a_VaM`l6.K0&4naGr9
+mHj0&k2k[_hr3VTi8*,>f$i're'ZRid*BhV`59F-]t:fQ[fs4N\$ifVo!\TgrC;?.8P)NH91qrQ
+9hnJ\:f1+h;cHdu='8[0>[1TB?t!MTAS,UiCMRd)E,fr@G'A4XI!pKpJqSl6M2I7PO-,TjQC+)0
+SXuLKUnsugWiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8EVTjQ5OekiqBum-X6@
+mgJXTo()DEo_%nNp@nR]s7u]kr;6KkrVcEgJcD):J,~>
+JcC<$QiHaXrVc`nrVQWks7uZhs7ZNerq/>EoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@/bHA8ZmIMid[qr/gf:qN0a"q2kT:pMTqHoksbIqel7IqOIMRnXTKG
+rLEhU".G^KRf&WTRJiQWQ^F22SGScTR1#IQS=5t:R$sG3Rn`lWr_NDfrDEMkpJ^`arDiPjpJ_#g
+r_`Mgr_NMgqb@&`s%E2\r^m)[q+(BQr'g<Iq*Y'Hs.M$=V5LH#ZaRBT]t_@t^VIRt^V7Is^V7Ft
+_o'=*^VI\&_84"*_o'F3`Pf^6`W!k$`Q#s>aihrSd*gCnf@S[.gu%)MjQ>Xjm-a?4o(;VMqYU8C
+s/Z/4M2$b<KRn`):Jb(l;c-GIQ^<tqrs.`2`59:#[C-">s0*QHXK&8!Vl-AgUnaWVT:MLCS=>t:
+R[fh4Pa%>mOH'6u!/gc6"H&%mMMgt]!(QoWIn3.&8kM`L9MJ5V:Jakb;H$Ln<`W:)=^#'8?=.)K
+@Us%^BPD6tD/O<4F*)SLH$XjdIt3-(L51VCN/is]P*M?#R@Bb=TVA6YVl?\tXfo"9['mHS]=bkm
+_8=.0a2lEHc-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg(mf2_`nF?)?oCV\Jp%J+RrqQNhs8)Zj
+rqu`np&9OBQiDR~>
+JcC<$QiHaXrVc`nrVQWks7uZhs7ZNerq/;DoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@/b07Rg!E:[:jR;>O2J;>3'K2t&a#3<31Y=oDIp=oVS(=8l8#<s2W.
+=BAT$<rZ8!=Su5"<<?3&=SZ"q<rl?%rDWbkr_EGgqb[5grDNAgoi1lip/LcbrDNVlqG@/er_E>b
+r_3>bqF^`Yr^ciTrC6]Rp-e^Dr'LEg$XI(F?XI2M@q0(^B)Z<I@prkX@q0%\AS1pS!G6!BB`;`G
+CfkOlDJsK6EcZ>EFa&(UH@10jJV&N.KnkJAMi<[WP*;/sQ^XG8StD^OV5UAnXKSk6ZF%'M]"Gbm
+_o0O7b08/Ye'lgug"YBBioK:dlgF64o_8.VqY^>Ds4I>X7n,s977K^82`^k%"[+qA;c?YSrsc;b
+Bjk@U?<^T:=^"p1r)sb9<`N:'=&i:%<Dums<Dupu<)cco;[lT%:f1"b;,L(c:esnankT6TrC;?.
+8P)NH91qrQ9hnJ\:f1+h;cHdu='8[0>[1TB?t!MTAS,UiCMRd)E,fr@G'A4XI!pKpJqSl6M2I7P
+O-,TjQC+)0SXuLKUnsugWiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8EVTjQ5Oe
+kiqBum-X6@mgJXTo()DEo_%nNp@nR]s7u]kr;6KkrVcEgJcD):J,~>
+JcC<$R/cgXrr)ior;6Njs7uZhs7ZNerq/JIoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iYRFbZik\\,Sg]tF?XqRld=qRlX;qnDX9s1\KGrk/9Crji-@\G_Ea
+Nphu*Nr"e:OSmH,cd:&8cN;D<chbrec2Q#dbm2J;c-FVYc-613!mAg1rlkAd$d-]9bfe2UcHsq`
+d/D8icj7qDc-Oe`cq[@8:]!uf;>jDg;u9Pf<W,tl<Vobk;uT\n;>X2h:]F2e:&[ic9D_?\8cD9V
+8,YpT7J9.F6i97Vf@o*Bm.'lJrV-<mrVZZop](9mJcC<$q>V#2Yct72X'&b7@UNJGZH1)*L]91.
+p@%M>mdBK/lfmWpjPo+Wj5]+Sg=Y$+daZandEp7cbK.W>^qdXo\@K,Y\$iiV\%&s>\,Sqr7fl4Q
+8cD>392&&S:/=\_;,U=k<*!%$=BSg4>[CcF@:EbYAnYjmCMds.EH?5EGBnL^I=Hd!K8#);MN!OU
+OckroR$jG6StMdPV5L8lXKA\1ZF%'L\[oGf^VRe*`Q-'BbK\>ZdF6Uqf@\d1gtgiFi8WeXjlYai
+l0@U$m-a?2nF?)?s76Edp%A%Pp\ssfq>^<hqu6NlrUp/@s-Nb9~>
+JcC<$R/cgXrr)ior;6Njs7uZhs7ZNerq/;DoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iYHA8QmJMu8_:P5CC7OQ;Q"OT(=@NrP+3DZ">QDJa7dDZ4SODZ+GM
+S,f&WSGSfUSH#)VSH#)XSG\i]R[]e:S=5q9rgO%YR[KV5rL41_R[BM1R%0Y9S!f`DRK&`^R[fe7
+S!fa@:B"&d;#X>j;Ya8g<;'>j<q]Pj<;BJl;Z0Ji;#X8j:A[cb9`@]^9)_E]8GPdS7f5^K7/94J
+67AY,WNNM4\@T;c^VRb'_SEq$^;%Cs^qde(_SO"%^qmn)_8=(,`5KXo`WXB'aN2O'aWJ^Mbg"G\
+e(*('g"Y9:hr3VWk3)!qmdK]:o_%tSqu20HWW*NaKS4o.Inig:<E)gnL6n3kMuOFJb/D33\[AfL
+ZE^[=Y-"h+W2KWl"f.oeTV%hTSJ[ibS!oh8Q'@MrO-#B\N/ELNN/NUMM2I2^M>p'D7fl4Q8cD>3
+92&&S:/=\_;,U=k<*!%$=BSg4>[CcF@:EbYAnYjmCMds.EH?5EGBnL^I=Hd!K8#);MN!OUOckro
+R$jG6StMdPV5L8lXKA\1ZF%'L\[oGf^VRe*`Q-'BbK\>ZdF6Uqf@\d1gtgiFi8WeXjlYail0@U$
+m-a?2nF?)?s76Edp%A%Pp\ssfq>^<hqu6NlrUp/@s-Nb9~>
+JcC<$R/cgXrr)ior;6Njs7uZhs7ZNerq/;DoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iY17Rp'E:]+&g;>*i_;>O2J;>sDb3;b]:3&`eg3;GT3=T)D"=SQ%t
+=9)G$<WZ?)=T2D#<WlK)<``B$=9ho.<E<+#<EB*#qH!Prs&K8&<)cUfr_NDfr_`Vlq,@/ip/V&l
+p/Uuhq,@8jrDEGgr_NPhqb@&`r_*,\r^m)[q+(BQr'g<Iq*Y'H!+#S1!FK76@K9s<B+&9_A7B"X
+@Uiq[AS1pS&8#QgBk_<qBk_=!D/O92E,tr!:NU`&GBnI[I!pKqJqJc3LP^nHN/is^PE_B"R[fq?
+TVA3XW2ZeuYHY:;[(!QV]YD8!`5Td>c-Oede(*('gtq#MjQ5Ukmd]oAp%S:Yr.4murt%Xf77K^7
+2E<c]5<V)&;c?\Us!R?7HY-\n?X?o==^"s1=]ns3>$4s-<`rI)<E<.#<)lmt;cQdr;c<Tns%rep
+;>sDl;$B]j:esnao2#BUrC6o[8P/nRInNI09hnJ\:f1+h;cHdu='/U/>[1TB?t!MTAS,UhC27[(
+E,fr@Fa&+WI!pKpJqJc4M2I7OO-,TiQ'du/S=ZCIUSXleWiW>+Yd1XE\%0)_^;%M$`5Td<b0/&T
+d*^=le^rI,g>(N@i8EVTjQ5OekiqBum-O0/n*ol<o)J:bo_%nNp@nR]s7u]kr;6KkrVcEgJcD):
+J,~>
+JcC<$R/cgXrr)ior;6Njs7uZhs7\\Mp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iF`59@*^:_%f\$iYRFG?ck\bNl7]E#S@]_B,<^@T,=^AknG]`5SD])B/>\Giu7NW5%<
+NW+t7N<"q4NW+t7O8@6"ch,N]blH&[blZ,6bl,cibg"AUb0Bn/s3L_l!R]9mc3;P>cd9q_r_NDf
+r_`YmqG[;kr)Ml[r)N\pqG[Akr_`Phr_NPhqb@&`s%E5]rCQuZqFCHQrC-BIq*Y'H#3"_2oDSXe
+q>UQrs8W%Ks+146rsl97XK,N2?"./H>I2Dk`eXQtqY'IKnF$;B-0j^Wk2bO\jQ#:Zh:pW7daHXo
+dF$=fcHF5G_na(#\@/lT\@9$H\F[307f>jW8,u6\8ps?+9heAX:Jand;c?Xq<``C+>$G6;?XI5N
+@qB7bBPM="DJsN8FEMePH@('hJ:`E-L5:\FNK90aPa.T&S"-(BTqeE\W2co#YHY==[C<]X]Y2(q
+_SjF6aND]NcHjndeCE1&g"P6;hV[8Nj5]7`kNM0qlg4!*n*fc9rpg9bo_%nNp@nO\!r;]hr;6Kk
+rVcEgJcD):J,~>
+JcC<$R/cgXrr)ior;6Njs7uZhs7\\Mp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iF`59@*^:_%f\$iYGA8QmJMu8_9P5CCAOSt=AOQDW#OT(=@Nr+h9D>8#JDZF\OD>8#J
+Du4DPD>Ke%S,]#QS,AfTRfJuLRf]%JRf/]ZR[]b7R@=)B!1a"W!1NkSs-a%ZS=,iF:]!uf;>sJi
+;uBVm<T[?[<W,nn;uT\o;>X2h:]F2e:&[id9D_?[8cD9W8,PjT7J0(E6i97[XKJh8]=bei^VI\&
+_8#u`!l)IbrkSlX_83n$^qmn)r51,)`Q#s>ai_fLbKJ,RcHjkadF6Rpf@em4h;7)Lj5f@dl0Ia)
+n+$&Cp\F[ardk*Jrsj^5JU^Ek:fUIm;21F'Q&GY]f>tkH]=>8UZ*LX<Ycb+0X/MqnVl$8bTqJ'M
+rga%YrgF@eR?`u"P)kZ`NJ`UOMi*GjMXu])7f>jW8,u6\8ps?+9heAX:Jand;c?Xq<``C+>$G6;
+?XI5N@qB7bBPM="DJsN8FEMePH@('hJ:`E-L5:\FNK90aPa.T&S"-(BTqeE\W2co#YHY==[C<]X
+]Y2(q_SjF6aND]NcHjndeCE1&g"P6;hV[8Nj5]7`kNM0qlg4!*n*fc9rpg9bo_%nNp@nO\!r;]h
+r;6KkrVcEgJcD):J,~>
+JcC<$R/cgXrr)ior;6Njs7uZhs7\YLp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iF`59@*^:_%f\$iY/7Rp*FrD<Agq,$rcqGQBOp.t`LpGi.4!''g6of2e.pK7Guq,mJr
+rE'&$rDiu$=BPQ(r)Weu!*K5'"B\`+<`T*!s&]2#!*B,"r)Wo"<W5ek;#X>k;Yj>i<;]bY<r>tr
+<;KPm;Z9Pj;#X8j:A[cb9`Ic_9)V?\8GYjS7f>dK7/94J64I:.?X[DP@UinYA7]=_rF5e;!G,mA
+B*i0_BPM9tChda%rbhaT<,lr"FED\MG^4X`I=6QpJV&N.L5:YCMi<[WOHYopQ^F53SY)UMV5C2k
+XKSk5Za@6Q]"G_k_SjI7aii#Xe'lk!g"Y?@ioK7dm-aB7p%A+TqYYpEe,TA8$8sq*5!M1l9iFtk
+NW07ARrr4M?sR+;>5q\&=V+b==B/F*<`W4#=&r:#<)cfq<!?2u;,^@hr_Wnr:f("c:ejpf;"IK_
+7f>jW8,u6\8ps?+9heAX:Jand;c?Xq<``C+>$G6;?XI5N@qB7bBPM="DJsN8FEMePH@('hJ:`E-
+L5:\FNK90aPa.T&S"-(BTqeE\W2co#YHY==[C<]X]Y2(q_SjF6aND]NcHjndeCE1&g"P6;hV[8N
+j5]7`kNM0qlg4!*n*fc9rpg9bo_%nNp@nO\!r;]hr;6KkrVcEgJcD):J,~>
+JcC<$R/cgXrr)ior;6Njs7uZh621*Hp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$`PQF+pNg\\>fR^%K&6^&>\:^](tI^&PbF])]G@\H'/<\,Ni/NW"n9
+NVnb1N<#":O8@6"cgf<LblGudblQ&5rlbVhbK7oObfe91cNMP?c-Xc8cN)8icN$c<;#X>k;YsDk
+<;fhe<r?%h<rH%s<;TVn;Z9Pk;#X8i:Adic9`@]_9)V?\8GYjT7f5^J7/94J63HuWqYg3hs8Mfn
+!<.QLJcG0<s/QK0?<q#I?!FVVa2Ni6*;K3snF5o6mHNs#kN:jcioT1YhqQr>f@/0te'e6B&C/M?
+_o'7(]=>8W[C<WU\@:t;!_#RJr^ZuZ!(m/^!D?,c9moc4:f("f;cHat='/U/>?kH@?X[DRAS#Lf
+C27X'DfKf>Fa&(VH[U?nJV/Z2Ll%%KO-#NgQ'[l,S=Z@HUSOcbWiN8)Yd1UC[^`o]]t_A"_o9X:
+aihoRcdC1je^i@*g=tH?hr*JRj5oFckiq?tm-O--n*fc9o()DErq-<cp\jmeq>^<iqu6NlrUg)?
+s-Wh:~>
+JcC<$R/cgXrr)ior;6Njs7uZh5POmFp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$`PE@r6dJMu/V:P5^UBOPc2sOT(=?NqeV5D#\AKDZ+MRDYe5FDZ4SR
+DYK[lS,AfFRfJoURfStIrgFLfR@'D2R@'G5S=>t:R$sG2R[TZDRfH7];#X>k;YsDk<;fhe<r?%h
+<rH%s<;TVn;Z9Pk;#X8i:Adic9`@]_9)V?\8GYjT7f5^J7/94J64gQ5\@]De^:_1p^V7@o]t_>]
+_>h@W_8*h#^qde'rPSrY`5Ta;aiVa)botBYd*^:ie'uq!f\"p5h;@/Lj5oIfl0Ia)n+$#Bp\=U`
+JcDSHs*tGO:f(.l;Gi18QB[@.)#;Y#_ns$p['R'DYd1F8XfSS%Vl$AgUS@a\(nR:hS=?":R[]_2
+PEV/kNJrgRMi*IOMMgkZ!_#RJr^ZuZ!(m/^!D?,c9moc4:f("f;cHat='/U/>?kH@?X[DRAS#Lf
+C27X'DfKf>Fa&(VH[U?nJV/Z2Ll%%KO-#NgQ'[l,S=Z@HUSOcbWiN8)Yd1UC[^`o]]t_A"_o9X:
+aihoRcdC1je^i@*g=tH?hr*JRj5oFckiq?tm-O--n*fc9o()DErq-<cp\jmeq>^<iqu6NlrUg)?
+s-Wh:~>
+JcC<$R/cgXrr)ior;6Njs7uZh5POmFp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$`P.7Rp'D;#4&`;#F2g;WUdK;#X>k3VYT43WD)82to<03W<1I=Su>"
+=9)G%<WZ?)=T2D"<rZ5%=BGH's&T/"s&K5%='/Q"<r?#!:]!uf;>sJj;uK\o<Uj,f=7K>i<W,no
+;uT\o;>a8i:]=,e:&[ic9DhE\8cD9W8,YpT7J0(E6i97Z>?kH??XR8K?t*VU@K'^>A7]@bB4q3U
+#A7^aBkqO%D>e?QDfB]:FED\MH$O^`I=?WpJ:`E+KnbD>M2R=PO-#NgQ'dr-S"6.CTqnQbX0&P.
+Z*LaG\[oGf^r"%/a2uKKdaQ^rf@ep7i8Wh\lL"$/oCVbPqYU2As3^iT6q0*q3BfYj4%rUP;iUe^
+d?/BY?sm/Cr`U+@=BJX-=BJa0=]\[,<`W1"=&r7"<)Z`p<!?3";c?Rjr_Wnr:esn_;,C-Z:BEsS
+7fGpX8,u6\8c_RYr_7f9:Jakb;c?Xq<``C+>$G6;?XI5N@qB4aBPM=!DJsN8FEMePH@('hJ:W?,
+L5:\EN/s'`PEhK%R[ftATqeE\VlHf"Y->4<[C3TV]Y2(q_Sa@4aN;WLcHjndeCE.%g"P3:hV[8M
+j5]7`k32'olg4!*mdKW6nac8Bo`"Lap@nO\s7u]krVQTlrVcBfJcD,;J,~>
+JcC<$R/cjYrVc`nr;6Njs7uZh5POmFp%@tKo()>?n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqe[^EGPEe^Ki\Gj5<^%K&9^&Gb;^]2%I^&PbF])fLRrODg8qR6'Vqi1Z9
+qMb3/rJps)r6PMkd*Va;m`t=H!mJp6rlbDfb5TW_b7Db=c-=JYd*U(acd:"acHc>as&&bnqc!Gm
+r`/\npK.5opK.)ir`/qsqc!Jlr_`Sis%iVhr([/ar_*/]rCQuZqFCKRr'g9Hq*Y'H#4hBYpA4[b
+rVuosq#:?nJcC<$m/IAp?=dSQ?!FVWaG9csrqQ$_n/(N[mHa'#kN:jcioK(UhV$];f@&*reC+?C
+&C/M>_nj+%]"#5X\$rlX\$tk:!_#RJr^ZuZ!(m/^IS3@.9heAY:f("e;cHat<`iL->?kH??XR>Q
+A7]CeBkqO&DfKc<FEVkRH@:6mJV/W1Ll%%KNf]EfQ'Rf+S"61FU84ZaWN*)'Yd(OB[^`l[]t_A"
+_o9X:aihoRcdC1ieCN7)g=tH>hr*JQj5f@bkiq?sm-O--n*fc9s7-3^o`"Lbp@n=\q#C0iqY^6i
+r;QZerdk*:s*t~>
+JcC<$R/cjYrVc`nr;6Njs7uZh5POmFp%@tKo()>?n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqe[^EGD@W-gKMZ&\:O8tF>OQ2K"OT1C@Nq\P5N;nn9D#\ALDYn>PDYe5F
+DZ4PSDY9OlRfStIr1*8G!h,UJrgEkWRJrZRR0&hER/WQRRfJlURf/ZP;#aDl;YsDk<;onl<qf\m
+=SGnk<rQ+u<;TVn;Z9Pk;#a>j:Adic9`@]_9)V?\8GYjT7f5^J7/94J65?c2ZaI?T]=ktn]tM(l
+^;7Y$_83q&rP&EL_8?,g#0"U'b0/&Trm(bpdF$CjeGe#:f@em5h;7)Kj5oFdl0@U%n*oo>p%S7Y
+rVhBJV#L`r:fgXr;Gi18QAbc!n]f(k^Ugk[Za$d=Z*1@3XK/:tVPg5bURn-OSt)@AS=>t9S!fS+
+P`UrbMiEUON/W[QmYM!67RmAIs%!,]r^qW49MA/T:/=\_;,U=l<E<.&=]ns6?!^lG@Uiq[B4u!p
+Ci402EH?5FGBnL_IXm!%KSG;>Mi<[XP*;/sR$sM8T:r!TVPgDnXfen5ZaI6O\\#Pi^r"".`lQ9F
+bg+P^daQ^sf@em4h;-uHiSrnYk2tmll0@X%mI'H3nF?PL!V>s_o`Fj]p\ssfq>^<hqu6NmrUg)?
+s-Wh:~>
+JcC<$R/cjYrVc`nr;6Njs7uZh5POmFp%@tKo()>?n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqe[^EG.7Rp'E:]4/^;#F2j;W^jM;#*uf3VYT23<2&82u#B23WE:^=mK2f
+=o;A%=8l5%='/T(=8l7u<rlE)r`B/%rDrqur`Ahp!*B(ps&&bnqc!Gmr`/\npK.5opK.)ir`/qs
+qc!Jlr_`Sis%iVhr([/ar_*/]rCQuZqFCKRr'g9Hq*Y'H$!CA5>$P<=?t3^F@K^1PAS,TRAcQKC
+B`;`HD#J3PDJsN8FED\MG^4U_I=6QpJ:W<)KS>2<MMd@QO-#NgPa7])S"6.CTqnN`WiN5)Z*UjI
+]"5Si^r"%0a3)TMd*pOqf@es:ioB.`lL"$/oCV_Mq>:*hJcF*s#rak/5!M1l9N4uMrsHZ#CLU[X
+>[1H9>Q.bQ=B\^->$4s/='/L(;H6du;cQaq;H$Rp;cH[o;GU.d;,C(d:esk`mnX!R7RmAIs%!,]
+r^qW49MA/T:/=\_;,U=l<E<.&=]ns6?!^lG@Uiq[B4u!pCi402EH?5FGBnL_IXm!%KSG;>Mi<[X
+P*;/sR$sM8T:r!TVPgDnXfen5ZaI6O\\#Pi^r"".`lQ9Fbg+P^daQ^sf@em4h;-uHiSrnYk2tml
+l0@X%mI'H3nF?PL!V>s_o`Fj]p\ssfq>^<hqu6NmrUg)?s-Wh:~>
+JcC<$R/cjYrVc`nr;6Nj!;ZTg!Vc<eofDa:o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EGPEJUNj\,F&:^&#AC]tD#W^&Gb;^]2%J^&GYH]=PSarj_p9rO)^6
+rjMg6nr<R-s,Hl6qMkN8rQkMjrQkJis3L)Xm`cEhc-=DTc-4DTaiVcMbKS5Tc-X`7cNMYAcHji9
+;#aDl;YsDl<;onn<r?%o=SQ%o=Su7s<rQ+u<;TVo;Z9Pk;#a>j:Adic9`Ic_9)_E]8GPdS7f5^K
+7/94I63ZiGnb2kYrr<#t!WW/qrrE%Ls+147rruq?>["JVabTlsr:p9\!UoFTlm1iZkiUsdio8qR
+gtUT9f@&-seC)^kd*BhT_nj.%]=>AZ\$rp8\,o)g7f>i,84cBF8kVfN9heAY:f("e;c?[s<``F,
+>$P<=?XR>PA7]@dBkqL$DK'T:FEVkRH@1-jJ:iN0LP^nINfT<dQ'Rf+S"6.EU84W`WN*&%Yd(OA
+[^`l[]Y;.s_o9X:aihoRcd:(geCN7(g=tE=hr*JQj5f@bkNV6rlg4$,s6g-\nac8Bo`"Lbp@n=\
+q#C0iqY^6ir;QZerdk*:s*t~>
+JcC<$R/cjYrVc`nr;6Nj!;ZTg!Vc<eofVm<o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EGD@W-gKMNO%nOQM]%OT1C@Nq\P2N;nn7D#S;KDZ"GQDYe5LDZ4MP
+DXs=lS,JcUS,AfERgbaTS!f_7R[TY3R$sHBRKJtHSXTMH".GUFRJp%_;>sJj;uTbq<V]\n=85nm
+=nl+s=8Gts<W5tp;u]bp;>a8j:]=,e:&[id9D_?\8cD9V8,YpT7J9.F6i01TYck:<\\#Pgrk/9E
+s1eTLs1\TM^AP_H^qp#e/]>WLaihrTd*L(ddF-Lne(*(%f\+s4gtpuKioB1al0@X$mI'K7o_/%S
+qu-MFs.TGs<E)jnL6n3ars7i5`5KC#[Bm4=YlCm0Y,n\(WW&e&UnXTVTV%gHSXc5KRg#4GPE_,h
+rf$l7s,?u9!/g6%!_#RJrC;?.8P)NH91qrQ9hnJ\:f1+h;cQk!='8[0>[1TB?t*SUAS,UiCMRd)
+E,fr@G'A4XI!pKpK7nu7M2I7PO-,WkQC+,1SXuOLUnsugWiW>,Z*UgG\@K5a^;%M%`Q$!@bKS8X
+d*^=lf%8R.gYCWBi8N\UjQ>Ufl07L!m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD,;
+J,~>
+JcC<$R/cjYrVc`nr;6Nj!;ZTg!Vc<eofVm<o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EG/77^'F:Jk!X:ukLH;"mid3V>B03WD)82u#B1>5_Uj=Su>"=9)G%
+<WZ?)=T2D#<WlK+=BAT'=9)G"<WcE(='5E%!*B,"r_WVlr_iVlr`&ksq,[DppfR;opfRGqqH!Sq
+r`&bns&/hnr)!Dhr_EAcr_3>bqb$iZr^ciTrC6]Rp-e^Dqa)$"<EE@0?t!MR@q&qXA7]@bAS#Ib
+BDuTDBj>ChCM[j+EH?2CFEVkQG^4U^I"$QqJV&N-KnkMBMi<[XP*;,pQC"#/SXuIIUnsufWiWD.
+ZaI9P]=bhm_8O@6aihrUe'uq"g"bKEjQ>[jm-X92oC_hPqu$GEs3:TD56O,19iP)Nrs#o_Bk(OX
+?N++O>?G$0=BAO*>$+j-<`iC'<)lt"<)ljr;H$Rp;cHXn;Gd?is%ihq:f'nbmnX!R7Rm>HIn3.&
+8kM`L9MJ5V:Jakb;H$Lo<`W:)=^#'8?=.)L@Us%^BPD6tD/O<4F*)SLH$XjdIt30)L51VCN/is]
+PEhH$R[]k>Tq\?ZVl?\tXg#(:['mKT]=bkm_8F73aN;WLcHjkbe'ut#f\5*8h;@/LioB+^k3)!n
+lKdg(mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAR/_[~>
+JcC<$R/cjYrVc`nrVQWks7uWg!Vc<eofMg;o()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<APEJUKh[D2[S!58BGr4N*CrOr6F!58?FotUL?s1SEE"1u.T\c0,<
+\,Ec7[/dZ6[JmQ4NW+n3N<+utqi1Z9q2G31p!<Was3LGb!6t;aoZ[B[rlkPhc-4E2bn\IIbfe,O
+aihlMcHFGVcd0n_cHjd4r_`\nr)<Sor`/eqrE&o!k#qUarE&ksr`/qsr)<Sms&&\jr_NPhr([/a
+s%E5]r^m)[q+(BQrC-BIq*Y$G"RkmRq>L3iqYpQpJcC<$kPkZi>-lAnL]7JRp@.SNmK;hAm-4N4
++Q_\DiS`SJh:pQ4daQUmda6Fgc-+2G_SEjs\@ArU\@M":!_#RJrC6o[8P/nRInNI09hnJ\:f1+h
+;cHdu='8[0>[1TB?t!MTAS,UiC27[(E,fr@G'A4XI!pKpJqJf5M2I7PO-,TjQC+)0SXuLKUnsuf
+WiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8N\UjQ5Oel07L!m-X60n*ol<nd"dY
+o_%nNp\4[^s7u]kr;6KkrVcEgJcD,;J,~>
+JcC<$R/cjYrVc`nrVQWks7uWg!Vc<eofMg;o()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<AC@W-dJMNRRnk`P\&s,[2?pPo!-rf-bjrGDFLqelIPq/$+Lr,);#
+!1WhTpm_,K!1WnVoU>iLrgO"YS!ofFRh_B]R[KP2R$jD1S!]V4S"#k9R@9L>r_`\nr)<Sor`/eq
+rE&o!k#qUarE&ksr`/qsr)<Sms&&\jr_NPhr([/as%E5]r^m)[q+(BQrC-BIq*Y$G"L#,=\@VRM
+!PQ;J^]2+L^(e>t^V@S#_8=(-`lQ<IcHjkbdF-MCe/d)jf@S^0g=tH@iSrnYk3)!olg4'.nac>G
+q"agcJcD>As%riPQ^*L/#iEhD`4`[dZa'M6s/u^1XK/;!W2?Gfrh9RhSt;LDSG\i[R?j&#OH0=!
+s,-f6s,-9%!_#RJrC6o[8P/nRInNI09hnJ\:f1+h;cHdu='8[0>[1TB?t!MTAS,UiC27[(E,fr@
+G'A4XI!pKpJqJf5M2I7PO-,TjQC+)0SXuLKUnsufWiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=l
+e^rI-g>(N@i8N\UjQ5Oel07L!m-X60n*ol<nd"dYo_%nNp\4[^s7u]kr;6KkrVcEgJcD,;J,~>
+JcC<$R/cjYrVc`nrVQWks7uWg!Vc<eofMg;o()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<A-6q9mD:JpRWk#(_Hq,.,hr]0R0q`+X9q)A11qHEc!mTBBir)iu#
+s&K,$r`K2%rDrr"r`B>*=]ea+=8l5$<EJoq!)WYls&/bnr`&ksqH!Prr)i)ar)io!qc<\rr`&eo
+r_ibnr)!Ags%`Jdr_3>bqb$iZr^ciTrC6`SogJUCqa1<b$<phE@U`hV@Uin[ral+AA7]@dBkV3p
+BPD3rCi+*1EcZ>FF`qtRG^4X`I=?]sJV/Z1Ll%"IN/j!_PEV5sR$jG6StD[NV5L8lXKJh7[C<ZW
+]Y2(s_oBd@bKeJ`eCE.&gYLiKjlbmnlg4*1o(DeQqYPjDbPq].3_`RQNW0phWI8Gh?X@)B>$>'3
+=BAU+<`iL,=&i7&='#<#(fjU9<E)jp<Dugq;H$Ii;,L.d:Jjqc:/^OV!_#RJrC6o[8P/nRInNI0
+9hnJ\:f1+h;cHdu='8[0>[1TB?t!MTAS,UiC27[(E,fr@G'A4XI!pKpJqJf5M2I7PO-,TjQC+)0
+SXuLKUnsufWiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8N\UjQ5Oel07L!m-X60
+n*ol<nd"dYo_%nNp\4[^s7u]kr;6KkrVcEgJcD,;J,~>
+JcC<$R/cjYrVc`nrVQWks7uZhs7ZNerq/DGoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^:_(g\@/cNAoW[(VR+%PpV$X@rOr9Hr4_j=rkAEGs1JBD"M2.S\@DLHrO2R1
+qm6@2rf-f6rf-f6s,Hr:rf-f6rJgg%p<W`bs3LGbrlt;bn]`-!b08,Sb0A2ScHOJUai_iNb08,S
+b0A8YcHf?b;H!Ekr`&ksqc<\trE/brnQPWhrE0&#qc<_sr`&eos&/kor)!Ags%`Jdr_3>bqb$iZ
+r^clUr'pWRogJUCqa(DWq"jpfrW<&trdk*#s5*bWZHLCGs"=-AnF,f5mHa-(lKIEnjlGF[hqd)B
+gXk!+e'ZUldEp4`bK.T<_7mOk\@/lV\a?m,7K,dU8,l*[8cD>392&&S:/4S];,U=k<)lt#=BSg3
+>[:]D@:E_XAnPdlCMds-EH6/DGBeF\I=Hd!K8#&:MN!OUOckroR$jG6StMdPV5L8lXKA\1Za@0M
+\[oGf^VRe*`Q-'BbK\>ZdF6Uqf@\g2gtgiFi8WeXjlYail0@U$mI'H3nF?)?#P7T[p%A%Pp\ssf
+q>^<hqu6NlrUp/@s-Wh:~>
+JcC<$R/cjYrVc`nrVQWks7uZhs7ZNerq/DGoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^:_(g\@/cN=^l;tJVfMOq2jg&qN1];s,Qi5p5K!1ph]kFqel=MrbhIIrgWeT
+rgNqYS,SrTRf]%JS,/QRS,AfHRhhH\R[]b6S"#k9R[KV3R@9S3R@9P2RJiTS;?'Pl;uTbq<Vohr
+=8c7p=n,\h=oDJ%=8Q%u<W5tq;u]bq;>a8i:]F2f:&[id9D_?\8cD9W8,PjT7J0(E6i01P[C3TW
+qn)pCr4i9G28?rA^qde'_o'F4aihoRcd:(edaQ^qe^i@)g"G*6gtpuKjQ,IdkiqF!mI'K6oCVbO
+q>:,As.')jL7"6as";sG`5B6tZEga>YHP+3XfSP%W2HMiUnaZXTq7jHSt):=S=?"8QBRMpOH#3X
+MZ/P5MXQB%7K,dU8,l*[8cD>392&&S:/4S];,U=k<)lt#=BSg3>[:]D@:E_XAnPdlCMds-EH6/D
+GBeF\I=Hd!K8#&:MN!OUOckroR$jG6StMdPV5L8lXKA\1Za@0M\[oGf^VRe*`Q-'BbK\>ZdF6Uq
+f@\g2gtgiFi8WeXjlYail0@U$mI'H3nF?)?#P7T[p%A%Pp\ssfq>^<hqu6NlrUp/@s-Wh:~>
+JcC<$R/cjYrVc`nrVQWks7uZhs7ZNerq/DGoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^:_(g\@/cN6:==99MeS`nkeOInkf0[qbdDkr]0m9!&sm:s#9g7r&Oa9q`"I5
+r`T,%q-!2hr)rr"r)`l"s&]5$!EE2"=8uA+='8X,='#<%s&K,$qH!Vns&/bnr`&ksqc<\trE/br
+nQPWhrE0&#qc<_sr`&eos&/kor)!Ags%`Jdr_3>bqb$iZr^clUr'pWRogJUCqa(Wo>[LoK@q&nW
+@q>IJ!+u1C?>4.hCMI['E,fo>FEMbMGBe@XH@($gIt3*%KS>2<MMmITOHG`jPa.W(S"#tATqeH^
+WN*&&Yd:aH\@T;c^VRk.aihrTd*pLqf@\g4hr<_YkNV@#n*oo@p\F^aJcEjl!_lWnNW0pXSonUQ
+?X-l>=^,'4=B\d-<`iL,=B/@'='#<#"]eT&<)liq<!Q?$;H$Ij;GmEi"Aquk:f-UV!(HlVr^ZuZ
+!(m/^InNI09hnGZ:f1+h;cHat='/U/>?kH@?X[DRAS,RgC27[(DfKf>Fa&(VH[UBoJqJc3M2I7O
+O-,TiQ'du/S=ZCIUSXleWiW>+Yd:^F\%0)_^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8EVTjQ5Oe
+kiqBum-X60n*ol<nd"dYo_%nNp@nR]s7u]kr;6KkrVcEgJcD,;J,~>
+JcC<$R/cjYrVccor;6Njs7uZhs7ZNerq/GHoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_(g\$iZLAoWa&VQdeL^\tnF^](tF^Au"E^]2%H^]2%J^&PbF]*#XT\@DIG
+rjMX1pU'pZq2><5pl#34qi:Z8rf$i9s3LSfs3L_jr6PAhs3LMd!R8pfc2>l_blc27c-6+1s31Gd
+rlY;crQ5,arlPDhbfe5Vc2LW>;uTbr<Vohr=8l=t=o)=k>PhV"=oMP&=8Z+u<W?%r;u]bp;>j>j
+:]F2f:&dod9DhE]8c;3V8,YpT7J9.E6i01Wq>C6jrr)fps8W(Ls+13$s5a1bq=X7Fn*]T0rp(*Y
+kN:jciSNGGgY1E7e^`+IdJqQ)ccXAN`59@)]=>AZ\%&uY\*pj,7K5jV8,l*[8cD<_92,=ZInid9
+:f1.i<)lt#=BSg3>[:]D@:E_XAS5[kCM[m,EH6/DGBeF\I=?]uK8#&9M2[FTOHPinQ^F84StD^O
+Uo()jX0&S0ZEpsJ\[oGe^VI_)`Q-'BbK\>ZdF-Opf@S^0gtgiEi8WeXjlYail0@U$m-X91nF?)?
+oCMVIp&F^cp\ssfq>^<hqu6NlrUp/@s-Wh:~>
+JcC<$R/cjYrVccor;6Njs7uZhs7ZNerq/>EoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_(g\$iZL=^lAuJVWr\l]M(+rf@)>pl4m(rJgMeqec7KqeuIOqecA'qj[VU
+qO@JSs-rqTrgWeR!1WnVq3qJTS"#lES,\rUS,\oaR@9M1R@0M3R$a?AR/rbDr_i\nr`&ntqc<\t
+r`Ju!qHEAmqc`eur`K/$r)Wess&Anps&/hnrD<Jhs%`Jds%NDbr(?r[rCHcTrC6]Rp-e[Cqa(=m
+]DK5C]t_:rrP&9G%)B`s_o0O7aNMfPcHlL;,1=ukeCE+$f\,$6hVdAQjlYail0I[%m-X92o(;YM
+q>:-iJcC<$V#MS6eB#PC]=5)OYd(C8Y-4t/X/`+sVPL#_U8"?RSt2FBrgNkV"dkU>P*(k*Mu\b7
+MuSY7M=69#7K5jV8,l*[8cD<_92,=ZInid9:f1.i<)lt#=BSg3>[:]D@:E_XAS5[kCM[m,EH6/D
+GBeF\I=?]uK8#&9M2[FTOHPinQ^F84StD^OUo()jX0&S0ZEpsJ\[oGe^VI_)`Q-'BbK\>ZdF-Op
+f@S^0gtgiEi8WeXjlYail0@U$m-X91nF?)?oCMVIp&F^cp\ssfq>^<hqu6NlrUp/@s-Wh:~>
+JcC<$R/cjYrVccor;6Njs7uZhs7ZNerq/GHoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_(g\$iZL6:=C:9M\J^;>j>i;>sDU;=dW[;>O2i;>rTR3;ti:3;b`53;Y`8
+3;tl93<*1Z=oDOu=n5\m=o;D"<s2W,=BAT&<WH5#=T;J&=Su7q<rQ"q;uTbr<Vohr=8l=t=o)=k
+>PhV"=oMP&=8Z+u<W?%r;u]bp;>j>j:]F2f:&dod9DhE]8c;3V8,YpT7J9.E6i01O?=..?@fKp>
+A7]<NAH?=Rr+KANCMRa(DJsK6F*)PJG'A1UH$XgbI=?`uK8#);M2[CRO-#KePE_?!R@B\:T:r$U
+Vl6VsY->1<[^ir\]YD;#`Q--FcI(+jf@em5h;@5Qjlbjmm-X<5o_84[rdk*#s3go_e<b&`?s[,D
+=]ns3=BJX,=BA[/=BJT&<s2Q(<E<0!<!?2u<)ljrr_i\ls%iep:JXgT:]El`7fGpX8,u6\8c_RY
+r_7l;:Jakb;c?Xq<``C+>$G6;?XI5N@qB4aBPM=!DJsN8FEMePH@('hJ:`E-L5:\FNK90aPa.T&
+S"-(BTqeE\W2co#YHY==[C<]X]Y2(q_SjF6aND]NcHsteeCE1&g"P6;hV[8Nj5f=akNM0qlg4!*
+n*fc9o()DDo_%nWp&Ojdq#C0iqY^6ir;HTerdk*:s*t~>
+JcC<$RK)pYrr)ior;6Njs7uZhs7\bOp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$iWKY]5SmVQ@H0^Au"F^Au(B^\PVD^&PbF]*#XT\@D@DrO2^5o<eFT
+mYh.*qi:Z8!fW+urQk5`r6PAhrm1Gdq9Ai_p!"E!c-=JVc-"5Sc-"2Qbg";Pai_fMbfe8VbYn@;
+s&B"ur)Weur`K#"rEB)&mTfWnrEB&#s&f8%r)Whtr`&hps&/hnrD<Mir_EAcs%NDbr(?r[rCHcT
+rC6`SogJUCqEk5\!<2urs8ITLJcC<$jSoJ^q!mkBn*]TAli6,Ojl>@Yhqe:d)VWipe'cUjdEg1d
+bK%`C_SNst\[])V\@K,Yn$rBds$luXs%!,]r^qT39MA/T:/=\_;,U=l<E<.&=^#$7?!^lH@Uiq[
+B4u!pCi402EccGJG^=^bIXm!%KnbD?Mi<^YP*;/tR$sP:T:r$UVPgGpXfen6ZaI6P]"G_k^r"".
+`lQ<Gbg+P^daZh!f@em4h;7&IiT&t[k3(smlKdg'mI'H4nc&(`oCV_Kp@e7Zp]C9fqY^6ir;HTe
+rdk*:s*t~>
+JcC<$RK)pYrr)ior;6Njs7uZhs7\bOp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$iWKY[MNtJ;99]ORA8.OT(=@NqeV'N;\b/D#.uMDJa7iDYnAODZ4MP
+RfJuTRfJuTS,SrWS,SiYS",t;qjRPSr1*GL$_!QSR[T_6R[]e7RJrZSQjB+KR@9M3S!d1P;u]hs
+<W#ns=8l=u=oDP$>OGbn>Q%b%=oVV'=8Z,!<W5tr;u]bp;>j>k:]=,e:&dod9DhE]8c;3V8,YpU
+7J0(E6i'+L]DfJC]*H!^^:q:o^:sT]0u1WD`Poj;ai_iOcHjnddaQ^re^i='f\5*8hW!VYkj.R"
+lg4$+mdTc;o^qkOqYU8Cs+13Fs"Eoi`l,U'\$NBEZ*1@5Y-"_(WMl_lUnaWWUS+6NSXl7=S!fb8
+R$Eo!P)tZ]NJ[Xm!fDnmmth!4s$luXs%!,]r^qT39MA/T:/=\_;,U=l<E<.&=^#$7?!^lH@Uiq[
+B4u!pCi402EccGJG^=^bIXm!%KnbD?Mi<^YP*;/tR$sP:T:r$UVPgGpXfen6ZaI6P]"G_k^r"".
+`lQ<Gbg+P^daZh!f@em4h;7&IiT&t[k3(smlKdg'mI'H4nc&(`oCV_Kp@e7Zp]C9fqY^6ir;HTe
+rdk*:s*t~>
+JcC<$RK)pYrr)ior;6Njs7uZhs7\bOp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$iWKYXCuR9MSF`;#jGi;#jMY;=dW\;>F,e;>`HR3;,943&`eq3;Y`8
+3!M<$3*BBf>5DD$>5VP'>5_V&=9)Lu=Su>!=T2D$=T;J#<WlK+=BAT'=9)Fu<rZ5$;Z'Jn<<#tr
+<rQ2"=Sc2!>5MOl>l.b(>5DD%=T2D"<rZ2!<;fbq;Z9Pl;#a>j:Adid9`@]_9)_E\8GYjT7f>dK
+7/94H63(Ek@L$CRAS#C_AS1jR?#".jCi4-/DfB`=F`qqPG^+L[H[L6jJ:W?.M2R=QO,oBbP*(ok
+Q'[o.S"-%AU84]cWiWA,Z*^pK\[oGf^r"".a2uQNdF6\!gYCZDioK4akj%L$nacAIq"t&As+13u
+rsm&-DId-]>[(H9>?P'0=oDG%=<L[G=BAO(<E*%#<)cdq;c6Rp<)Z^n<)HLh;,:"b:JXgT:]El`
+7fGpX8,u6\8ps?+9MJ5V:Jakb;H$Op<`W=*>$G6;?=.,M@q9.`BPD6uDJsN8FEMePH@('hJ:W?,
+L5:\EN/s'`PEhK%R[ftATqeE\VlHf"Y->4<[C3WW]Y2(q_Sa@4aND]McHjndeCE1&g"P3:hV[8M
+j5]7`kNM0qlg4!*mdKZ8rpg9bo_%nNp@nO\!r;]hr;6KkrVcEgJcD,;J,~>
+JcC<$RK)pYrr)ior;6Njs7uZh6ML3Ip%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJY]5SjV5_/CrkSKIrP83Crk8HI^:sT[rk&BG]",>\q7$@3rO)L/
+s0MX1rj2Warf$i9mu7:+r/Uc9s3CPgq9B#ccMPrfd/;5fcM>`_cM#Kabg"B2bPf]cb6Q26bfe/O
+aiXP)s31F?s&B"ur)Weus&f/$rEB/(iEZ=cr`]2%r`K2%r)Whts&Aqqr_ibnrD<Mir_EDdr_3;a
+r(?r[r^clUr'pWRogJUCqEbAbrVcWlrdk*#s+142rtG>)nF,f4n*K?*mH`rtjl,1UhVA+b);3Wn
+daHLicd0tabK.cC_SNsu\[T#U\@K0<\Go"t7f>i,84cBF8kVfN9heAY:f("e;cHat<`iL->?kH?
+?XR>QA7]CeBkqO&DfB];FEVkRH@:6mJV/W1Ll%%KNf]EfQ'[l,S"?7GU84ZaWN3/(Yd(OB[^`l\
+]t_A"_o9X:aihoRcdC1jeCN7)g=tH>hr*JRj5oFckiq?tm-O--s6g-\nac8Bo`"Lap@nO\s7u]k
+rVQTlrVcBfJcD/<J,~>
+JcC<$RK)pYrr)ior;6Njs7uZh621*Hp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJY[MNsJVB6^ORA8.OT1CANqeV%N;S\.D"MTDDZ4SPDZ6*lS,]#V
+Rfo1LS"-#GRfAlTSG&EQR[a8ErL<hU"dtgJR@'E?R/`TQ;u]hs<W#ns=8uD"=oDP&>N&ic>Q.h'
+=oMP'=8Z,!<W?%s;uT\p;>j>k:]=,f:&[ic9DhE]8cD9W8,PjT7J0(E6i'.K]EPp[]Y;(mrkABH
+s2"`S/B5`Oai_iOcHjkcdaQ^rf%/I*f\,$7hVmS[l0@X$m-a<1nFH5Dp@n@YrVhBJJcDJE0^$a#
+_nN^gZE^U;YHG"1XfJJ#W2HJeUS4BUT:VXFSXZ(;R[]b4QBRMqOH,9ZM2M7i!/g6$s$crWrC;?.
+8P)NH91qrQ9hnJ\:f1+h<)lt"=BSd2>[:ZC?t*VVAS5[jCM[m,E,fr@G'A4XI=?]tK7nu8M2R=Q
+OHPfmQ^F52StD^NUo(&hX0&P/Z*UjH\@K8c^VI_(`Q$!@bKS8XdF-Oof%8U/gYL]Ci8N_VjlY^h
+l07O#m-X6@mfi4No()DErq-<cp\jmeq>^<iqu6NlrUg)?s-`n;~>
+JcC<$RK)pYrr)ior;6Njs7uZh5kk!Gp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYXCuR9MP:ZrDMuZoMGB]qGR&bs#L'<r]'s<nMgG,r&Oa9s&f8'
+s'#2#!*]8&s'#>'r`K2'q,mPtp/q;qrDiu$=BPQ(s&f;&q,[Gms&B"ur)Weus&f/$rEB/(iEZ=c
+r`]2%r`K2%r)Whts&Aqqr_ibnrD<Mir_EDdr_3;ar(?r[r^clUr'pWRogJUCqEk*h#%M4TA7]@b
+r+Q+G$#FHrD/O61EcZ@%G#!:-H$XgbI=6QpJV8i;N/WdVO-#KcP*;/sR$sP8SY2^QVPpMrXfo"9
+[C3WW]Y;1u_o'L8b088^e^rO1hVdARjlbjmm-aB6p@nC[rIP!"s3go\\UeI)?sd/A>?P-3<``@)
+=B8O+r)`o!s&K)"s&9_3<)Z[o<)Z^n;cHUl;,L(a:esn`;"%3[7K5jU7t4'$8P2TJ92&&S:/=\_
+;,U=l<E<.&=]ns6?!^lG@Uiq[B4u!pCi401EH?5FGBnL_IXm!%KSG;>Mi<[XP*;/tR$sM9T:r!T
+VPgDoXfen5ZaI6O\\,Vj^r"".`lQ9Fbg+P^daZdtf@em4h;-uHiT&t[k2tmll0I^&mI(#C"n;'Q
+o(2MQo`=d\rV6Egs8)]krqu`no_sFARK%d~>
+JcC<$RK)sZrVc`nr;6Njs7uZh#5@ibp%@tKrpi#<nF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqe[^EHIY]5SfUo;!"_#(nG^AbhC]`5SF]",?H\,Ni7[JI90Zi.9.Zi?$Q
+N;eb5Mu\k7Nr@9&chbrcc2Z)eci;Aichu)ac2>lWbnnRJbK\5TbKA)Rc,n)KaN;TI;c?Xp<E8rt
+s&]2%r)s#&r`f/&q-Ef&q-Ec#r`fA*r)s&%r`B&!s&K(ur)<Vns&&_ks%iVhrD!8bs%E5]r^m)[
+qFCKRr'g9Hq*Y!F"9&,prIP!"s+142rrN#jrp]sU..-?fmHWlrjPo+SgYCQ<g=b$,dF-Cicd:"`
+b/_Q@_SNsu\@AuV\%1n9s$crWrC6o[8P/nRInNI09hnJ\:f1+h;cHdu='8[0>[1TB?t*SUAS,Ui
+CMRd)E,fr@G'A4XI!pKqK7nu7M2R=QO-,WkQC+,1SXuOLUnsugWiWA-Z*UgG\@K5a^;.V'`Q$!@
+bKS8XdF$Fmf%8R.gYL]Ci8N\UjQ>Ugl07L"m-X60n*ol<ncA@Srq-?dp\4[^s7u]kr;6Kkrr)Kg
+JcD/<J,~>
+JcC<$RK)sZrVc`nr;6Njs7uZh#5@ibp%@tKrphu;nF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqe[^EHIY[MKqJ;3r_mZIC.s,[2?pl4Tur/L>bo548?!M#YWRe3*KRfAlW
+SGAZSS,f&VRfAlTSFN'WR[]b8R[]b6S!oh5R/WHPR/^+b<<#tr<rZ8#=Su>$>5hb$>kq\$?MRn%
+>lIt,>5VP'=T2D#<rZ2"<;]\p;ZBVm;#a>j:Amod9`Ic_9)_E]8GYjT7f5^J7/94H63+Xs]`5\D
+^Akr$^;7\*`lH0Ab0/&Tcd:(fe'lgsf%/I*f\,!4gu%/SkiqBum-a?2o(2SKq"adbJcC<$T`5GY
+bf7N5\?W<EZ*:F7riH:(WMl`oV#I(lTqJ$KSXfYJ$C[BLQBRMqOH,<Zre^f:Mi3J]M#TpD7f>gY
+84cDP8q0K-9heAY:f("e;c?Xr<``F,>$P<=?XR>PA7]@dBkqL$DK'T:FEVkRH@1-jJV/W1LP^qJ
+NfT<dQ'Rf+S"6.EU84W`WN*&&Yd(OA[^`l[]Y;1u_o9X:aihoRcdC.heCN7(g=tH>hr*JQj5f@b
+kiq?sm-O--n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;QZerdk*;s*t~>
+JcC<$RK)sZrVc`nr;6Njs7uZh#5@ibp%@tKrphu;nF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqe[^EHIYXCuR9MbO_qGQcZoMGB]qGQr_s#Ks9s#L*=ni-P-q`4UWr`T8)
+nQGfor)j#%rE9#"r)r\prE'#"$!151=BAR,=BS`'<X)Q&;cH^r<W#nt=8l>"=oMV(>PMJ!?27h&
+?2.\(>Q.h(=oVV'=8c2"<W?%r;u]bq;>j>k:]=,f:&[id9D_?\8cD9W8,YpT7J0(E6i'.J@fKs@
+AS,RfrFc:ICMRbcD-(UnE,p#AF`hkOG^+L[I!g?kI=Hg$LPh"KNK'![OHPfmQC+,1S=ZCKUo()i
+X0&P/ZaI6N\\#Pj_SaC7ai_iRdF?e%gtpuKjQ,FdlKms.oC_kSr;M9IJcF4!%JZuOB4,+R>Zt96
+=]\W&<t/87='/O(=&i=&=&i:$r_rns<W,i!<)Z[n<;fYu:JFY];,1!W:]El`7f>gY84cDP8q0K-
+9heAY:f("e;c?Xr<``F,>$P<=?XR>PA7]@dBkqL$DK'T:FEVkRH@1-jJV/W1LP^qJNfT<dQ'Rf+
+S"6.EU84W`WN*&&Yd(OA[^`l[]Y;1u_o9X:aihoRcdC.heCN7(g=tH>hr*JQj5f@bkiq?sm-O--
+n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;QZerdk*;s*t~>
+JcC<$RK)sZrVc`nr;6Njs7uZh621*Hp%@tKo()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHY],JaU8Yg$_#(nF^AbhC]EPpY]",>\q7$@3s0_a2r3QF1q6U+,
+!K<$9N;nh0N;AJ3N;eh:NW@DtcMGfccMZ#gd/;5fcM>`_cMu-,bg"DVc-=GVbKJ/Rc-+ASb/qiL
+b0.uPbKKn,!6Y:?s&K"us&]5&r)s#&r`f5(r*B/*p0[Z&r*B2)r`fA*r)s&%s&]/"s&K(ur)<Vn
+s&&_ks%iYir([/as%E5]r^m)[qFCKRr'g<Iq*XsE!W;nIs+13$s5a26q=O.FnF#c4mI9Q-k2tU\
+i8<8EgtUK5f$i'qd*g7dcHaPP`l5g2^:_"e[^W`V\aR$26q'O67f>gY84cDP8q0K-9heAY:f("e
+;c?Xr<``C+>$P<=?XR;OA7]@dBkhF#DK'T:FEVkRH@1-jJ:`H/LP^nINfT<cQ'Rf*S"6.DU84W`
+WN*&%Yd(OA[^`l[]Y;.s_SsO9aihoRcHstfeCN7(g=tE=hr*JQj5f@bkNV6rlg4$,n*fc9o'uhQ
+o`"Lbp@n=\q#C0iqY^6ir;QZerdk*;s*t~>
+JcC<$RK)sZrVc`nr;6Njs7uZh5kk!Gp%@tKo()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHY[MKpIu!uamZIC.rf@&=qi0j!rJgi9nSIf6r,2J's-rtUpRD&K
+s-s%Yq4%DS!1WnTs-rqVs-j^kS"#k9S!oh8R[]b8R[]_5R$sG2rgNkTrL!R`s&K"us&]5&r)s#&
+r`f5(r*B/*p0[Z&r*B2)r`fA*r)s&%s&]/"s&K(ur)<Vns&&_ks%iYir([/as%E5]r^m)[qFCKR
+r'g<Iq*XsEs1A?FrOrlY^;%Cu_SsO8aN;WLc-Obadf.]8eCE+$f@\d0g=k<:hr<b^lKdg)nF6#@
+p@nCZr.4m!s.B<KfuV.I]XG)NZE^[<Y-+n.Wi2koV50l]U8"<PT:ML@S"#k8R@0A,PEV/kNfB!U
+MMd@NN/I+\"@P[I7Rm>H!_>mSr^qZ59MJ5V:Jakb;H$Ln<`W:(=^#'8?=.)K@Us%^BPD3sD/O<4
+F*)SLH$XjdIt3-(L51VCN/is]P*M?#R@Bb=TVA6YVl?\tXg#(:['mKT]=bkm_8=12aN;WLcHaea
+e'ut#f\5*8h;@/LioB+^k3)!nlKdg(mdKW6nac5OoCW%T!quB_rqQNhs8)Zjrqucoo_sFARK%d~>
+JcC<$RK)sZrVc`nr;6Njs7uZh5kk!Gp%@tKo()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYXCuQ9htXaqbliZohbK^qblo\!''p;r&F[9!''L-r]'p<qH3`"
+s'#G*s&f,#s'#D)qc`_srE/u#s&]V0=BJX,=BAU+='5E&s&T"us&]8&rDrnss&K"us&]5&r)s#&
+r`f5(r*B/*p0[Z&r*B2)r`fA*r)s&%s&]/"s&K(ur)<Vns&&_ks%iYir([/as%E5]r^m)[qFCKR
+r'g<Iq*XsEs'c1CAS,RfBP7<X!blCbrbMdUDJsN8F*.A'9m1`*H@($eI=-HlJ:`K4N/`gWO-#Ng
+Pa7])S"61FUSOcbWN*&'Yd:^F\@K2a^r+15bK\;WcdC1kfA#0?ioK4_kiqF$nFQ>Iq>C5Cs+14!
+rsS"`F_"rg?!CH8>$:`('3/.9=&rF(=&r="<E<'u;cH^p;Z0N';H$Ol:f1(d:Jaha:K$[X"@P[I
+7Rm>H!_>mSr^qZ59MJ5V:Jakb;H$Ln<`W:(=^#'8?=.)K@Us%^BPD3sD/O<4F*)SLH$XjdIt3-(
+L51VCN/is]P*M?#R@Bb=TVA6YVl?\tXg#(:['mKT]=bkm_8=12aN;WLcHaeae'ut#f\5*8h;@/L
+ioB+^k3)!nlKdg(mdKW6nac5OoCW%T!quB_rqQNhs8)Zjrqucoo_sFARK%d~>
+JcC<$RK)sZrVc`nr;6Nj!;ZTg!Vc<eof_s=o()>?n*f]3m-O$%l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGY]#D^TVoN?qnW*DrkABFqn2s@!kPqQqmcX7rjMj7qm?7,!4;U/
+qm$3\rf-o9rJUN2repc7"H/4tMi7Rnrf-p'p<NHXs3CPgs3U\ir6G,_r6FrZq9&l_bKJ-/b65r0
+<)lrs<rZ8$=Su>$>5qh(>l@t,?KGPm?N+7->lIt->5_V(=T2D#<rZ2"<;fbq;ZBVm;#a>k:Adid
+9`@]_9)_E]8GPdS7f>dK7/94G6@o/fs+143s"+0FoC22;nFQ2>n*B3"jl57Vh;$f?g=Xs,da?Fi
+dE^(^bfRlE`59=)]XkZQ[f<o,\,\qr7K5jV8,l*[8cD>392&&S:/4S];,U=k<)lt#=BSg3>[:]E
+@:E_XAnYjmCMds.EH6/DGBeF]I=Hd!K8#);MN!OUOckroR$jG6StMdQV5L8lXKA\1Za@0M\\#Mg
+^VRe*`Q-'BbK\>ZdF6Uqf@\g2gtgiFiSrnYjlYajl0@U$mI'H3nF?)?!V>s_o`Fj]p\ssfq>^<h
+qu6NmrUg)?s-`n;~>
+JcC<$RK)sZrVc`nr;6Nj!;ZTg!Vc<eofVm<o()>?n*f]3m-O$%l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGY[DEnJ;00ROo(7>O8b1:NT,ltMi@.ArGDOOq/-+KqO@PTrL3SP
+pmV5Ps.&nSs.'+Yr0dVTr1*DKq3h\ZR[T_7R[KP2<)lrs<rZ8$=Su>$>5qh(>l@t,?KGPm?N+7-
+>lIt->5_V(=T2D#<rZ2"<;fbq;ZBVm;#a>k:Adid9`@]_9)_E]8GPdS7f>dK7/94G65I8K^V@Ls
+^V@Lu_SsR9aND]Nc-FY_df.]8eCE+$f\,!4gY1B:hVmPXl0@X'nF?,Cp@nC[rIP!"s.KAsr7&d*
+^:Uk[rim3DYct:4X/`(rV59u^US=KTT:MOCS,SlVR0f7HQBRMqOH,<[r/1T7M=?<$7/fXT7fGpX
+8,u6\8q0K-9heAX:Jand;c?Xq<``C+>$G6;?XR;O@qB7cBPM="DK'T9FEMePH@1-jJ:`E-LP^nI
+NK93bPa.W(S"-(CTqnN_W2cr$YHY@?[^WfZ]Y;.s_SjF6aND]NcHstfeCE1'g=k?<hVdAPj5f=a
+kNV6rlg4$,n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;QZerdk*;s*t~>
+JcC<$RK)sZrVc`nr;6Nj!;ZTg!Vc<eofVm<o()>?n*f]3m-O$%l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYX:oP9MSI];X[KX;#aAm;#4&d;XI?]3;bf63;tr<3;tl93;GN4
+3!!,aqH3`"s'#G*rE/u#rE92(qHESqs&f2%oN:Zcs&K2#<E8uus&]5&r)s#&s',A*rE]A.j^7sm
+ra#D+r`fD+rE9/&r`B&!s&K(urDW_os&&_ks%iYir([2br_*/]r^m)[q+(BQrC-BIq*XsE"(Z"W
+B`;ZDBLQWMC27U$D/O93EH?5EF`__JG'A1WI!g?iI"$TtKntYGNK0$\P*;/sR$jG7T:qsSVl6Sq
+XKSk6['dER]"Gepa3)WPrmCbo'\(^egYUlKjQ5Rhlg4*3p%J4Yr;M9IJcF7"'\J^i@preO>$5!3
+=]\^-='&F&=BGK&#?Or*<E3("<;TSo<;of#;H$Ok:f1*h:]jHi:K$[X!(?fTs$luXs%!,]r^qZ5
+9MJ5V:/=\`;H$Ln<E<1'=^#$7?!guJ@Uit]BP;-rD/O<4EccGJG^=acIt3-'KnkMBN/`m\P*D6!
+R@B_<TV80XVl6VsXfnt8['mHS]=bkm_8=.0a2lEHc-F\`e'uq"f\5'7h;7)KioB+]k3)!nlKdg(
+mdKW6nac5OoCW%T!quB_rqQNhs8)Zjrqucoo_sFARK%d~>
+JcC<$RK)sZrVc`nrVQWks7uZhs7ZNerq/DGoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^:_(g\@/cNZ*/&&P+\_drP89ErkABFqn*$C]"5HJ\G`o:[edE/[/.-(ZMoj[
+N;\\%N;V#pcM5ZacMZ#gd/VDncHji7cM>`_cMYombK\5Tc-+ATbPfZnbKS,Obf\)Obfa!drDrr"
+s&f5&s'#D+r*95,ra,>+mU5fsra,S0r*98+r`]8's&f;&rDrqus&Aqqs&/korD<Mis%`Jds%NDb
+r(?r[r^ciTrC6`SogJRBqEfc5JcC<$kPlM"q==%DnFcDCnaGc+jl>@YhqQuBgY160e'cYBck4OH
+bK.]C`59=)]XkY^[C3TUn$i?cr^HiVr^ZuZ!(m/^!D?,c9n,o6:f("f;cHat='/U/>?kH@?X[DR
+AS#LfC27X'DfKf>Fa&(VH[U?nJqJc3Ll..NO-#NhQ'[o.S=ZCIUSOfdWiN8*Yd1XE\%0)_]t_D#
+`5Td<b0/&Td*^:ke^rI,g>(N@i8EVTjQ5OekiqBum-O0/n*ol<o(2MGp%A@Y!;HKfs7u]kr;6Kk
+rVcEgJcD/<J,~>
+JcC<$RK)sZrVc`nrVQWks7uZhs7ZNerq/DGoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^:_(g\@/cNZ*.MRG(#+,n<*U0rf@&=oo83ps,6l8!,VXMnSA2Bqel7IpmhAR
+rL3\SopYoMs.&nSs.'+Yr0dVTr1*\S#b%6OS"#k9R[X2E$_!QQR@BV4R[]aG<W,tu=8uD$=oV\)
+>Pqb*?2e1)?g_=s?iFC2?2Rt->Q.h)=oVV(=8c2"<W?%s;u]bq;>j>k:]F2f:&dod9DhE]8cD9V
+8,YpU7J0(D6i'+O^V7Fsrk8iW_SsO8aihlOc-Ob`dJhT!eCE.&f\,$Yg_8Q%i8`q]kj%L%nFH2C
+p@n@ZrVhBJJcDGD(\6"p_nWdiZEgaAZa-d;XK/=uVkp5cU]."fScbORS"'DG&t#)SQ^3l"P)kW_
+NJi[OMi3ONn;%'4r^HiVr^ZuZ!(m/^!D?,c9n,o6:f("f;cHat='/U/>?kH@?X[DRAS#LfC27X'
+DfKf>Fa&(VH[U?nJqJc3Ll..NO-#NhQ'[o.S=ZCIUSOfdWiN8*Yd1XE\%0)_]t_D#`5Td<b0/&T
+d*^:ke^rI,g>(N@i8EVTjQ5OekiqBum-O0/n*ol<o(2MGp%A@Y!;HKfs7u]kr;6KkrVcEgJcD/<
+J,~>
+JcC<$RK)sZrVc`nrVQWks7uZhs7ZNerq/DGoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^:_(g\@/cNZ*-M`8kVrWrDN&\pe^reqblKPrAa[7r&F[9pc/+/r`9)%r`T/$
+rE02*=]t]*r)r\rmofQj#Zk,0=BJX,=',B'"]n`,='&N&<ruE&<W,tu=8uD$=oV\)>Pqb*?2e1)
+?g_=s?iFC2?2Rt->Q.h)=oVV(=8c2"<W?%s;u]bq;>j>k:]F2f:&dod9DhE]8cD9V8,YpU7J0(D
+6i'+LB`2TCBFJTiC27U%D/O92EH6.!F9Qf1GBeF]rdI=eJV&T2Ll..NNfT9aPEhH#R@B_<TqS3V
+VPpMrYHY@?[^`iX]Y;5$aNMiSdF$Cke(31*h;I;Qjlbjmm-jQ<pA+R^rr.KKJcF:#%*=BD@piYK
+>$5!3>$1`)#?Fo,<E<.#<rQ)"<`T)s"B&2t<)ico$WKr!;,L.d:JO_^;XdH^7/fXT7fGpX8,u6\
+8c_RYr_7l;:Jakb;c?Xq<``C+>$G6;?XI5N@qB4aBPM=!DJsN8FEMePH@('hJ:`E-L5:_GNK90a
+Pa.T'S"-(CTqeE]W2co#YHY=>[^WfY]Y2(r_SjF6aND]NcHsteeCE1'g"P6;hVd>Oj5f=akNM0q
+lg4!+n*fc9o()DEo_%nWp&Ojdq#C0iqY^6ir;HTerdk*;s*t~>
+JcC<$RK)sZrVc`nrVQWks7uZhs7ZNerq/JIoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iZMYchr%OJ/Sa^qff]rP&6Drk/9Cs1/3@qRHL5s0hd3qm?4+os+S(
+p5Jm,oo/p1s,7$-dEqm=r6G;dr6G)^s3CDcq9J`Zrm(>a"j>08bKJ00b6Z86b0.uMb0/$-<rZ8$
+=T)D&>5qh)>lJ%.?Me+-@/+1.@eaC1@/=70?N4=/>lS%.>5_V(=T;J$<rZ2"<;fbq;ZBVm;#a>k
+:Adid9`Ic_9)_E]8GYjT7f5^J7/94G6@o/fs+147s"O?EnaQ#;p%7hFmHNfqio8nPgt^`?f[\R$
+dEp=hdEp.]aiDB>`59:']Xt__[C3O3\Gnts7K5jV8,l-[8cMD492&#R9hnJ\:f1+h<)lt"=BSg3
+>[:ZC@:E_WAS5[jCM[m,EH6/DGBeF\I=?]tK8#&9M2R@SOHPinQ^F84StD^OUo()jX0&S0ZEpsJ
+\[oGe^VI_)`Q-'BbK\>ZdF-Opf@\d1gtgiFi8WeXjlYail0@U$m-a?2nF?)?s76Edp%A%Pp\ssf
+q>^<hqu6NlrUp/@s-`n;~>
+JcC<$RK)sZrVc`nrVQWks7uZhs7ZNerq/DGoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iZMYchDQG(,()n<*^3rf@&=oo86qrJUQ3qePe>!,_RM#An?rD/Go:
+Sc"u\S"-"<S,A`SS+N0?S,A`SS,SrRRg#7MS!oe8rgF+\R[KV5R$jD4rDrr"s&f5&s'#G,r*95,
+ra,J/r*];.r*oG0rF#J/ra,V1r*98+s'#A(s&f;&rDrqus&Aqqs&/korD<Mis%`Jds%NGcqb$iZ
+r^clUrC6]RogJUCq*G(rrOso"_SsO8bKJ,RcHjkadF-Lme^iC,g=tE>hr!AMj5f=bl07R%n+-)B
+p@n@Zr;M9IJcDGD2X&H*_nERdZE^^AZa-g;XK/>!VP^2bUS4BRT:MOCS!oh8R@0G/Q^*f!P)bQ^
+N/NRNMi*INn;.*4s$crWr^ZuZs%35_InNI/9heAY:f("e;cHat<`iL.>?kH??X[DRA7]CeBkqO&
+DfKf>Fa&(VH[U?nJV/Z2Ll%%LO-#NhQ'[l-S=Z@HUSOccWiN8*Yd1UC\%0)_]t_A"`5Td<b0/&T
+d*^:ke^rI,g>(N@i8EVTjQ5OekiqBum-O0/n*ol<o)J:bo_%nNp@nR]s7u]kr;6KkrVcEgJcD/<
+J,~>
+JcC<$RK)sZrVc`nrVQWks7uZhs7ZNerq/JIoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iZMYcgG`8P;fW;H!0br_iYkqG@)erDMQNq`+L6rAaU5r&FU5!*K2$
+!*K/%r`K#"rE/u#r*','r*&_qs&f8'q,df%=BJX+=S5bo<rZ8$=T)D&>5qh)>lJ%.?Me+-@/+1.
+@eaC1@/=70?N4=/>lS%.>5_V(=T;J$<rZ2"<;fbq;ZBVm;#a>k:Adid9`Ic_9)_E]8GYjT7f5^J
+7/94G63(ZtBF\ZgBkhBuCi+'-DfBZ8ErL,VFEMeQH@($gIt*!#K8,/<M2I7PO-,ThQ'Rc)S"-%B
+Tq\?ZW2co$Z*LaE\@B,_^;%P'`lcNNcdC1if%A^4hr3SUk32*smd]rCp\Odcrdk*#s4.,^\qOm-
+?s?l==^#$4=BAU*=&rE$<r,f6<)QUn;cHXo<)Z^n;H$Lj:f1(d:esh_:JgOVs$ZlUs$luXs%*/]
+s%7c69MA/T:/=\_;,U=l<E<.&=^#$7?!^lH@Uiq[B4u!pCi402EccGJG^=^bIXm!%KnbD?MiEdZ
+P*D5uR%'V;T:r$UVPpMqXfnt7ZaI9Q]"G_k^r"%/a2lEHc-F\`daZh!f\,!6h;7)JioB+]k3(sm
+lKdg'mdKW6nac8No*+dZp%J+RrqQNhs8)Zjrqu`np&9OBRK%d~>
+JcC<$RfE$Zrr)ior;6Njs7uZhs7ZNerq/DGoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYchr%OJ/V_pV6[@rOr3B!kPqQqmcU6s0hg4qm?4+qm-7,qm-7.
+oSi[*rf-]3s,@02e'cXjrm1Jes3:GdprrfaqTni[pWW]`r658cc2PocbmDS;bf\,ObKS/Pr`9&#
+s&f5&s'#G,r*98-s'GS0rF#S4k@4Bura>V1s'G_2r*98+s'#D)s&f;&rDrqus&Aqq!`DlmrD<Jh
+s%`Mer_3>bqb$iZr^clUrC6]RogJUCq*KZ4JcC<$li.Onp@.V@o_%kIn*TB&jQ#7WrnSRLg=Os+
+da6FhdEp4_bK7fD_o'@+^:_(g\$`ZQm^W9bs$crWrC;9,8P)NH91qrQ9hnJ\:f1+h<)lt"=BSd2
+>[:ZC?t*VVAS5[jCM[m,EH6,BG'A7ZI=?]tK7nu8M2R=QOHPfmQ^F52StD^NUo(&hX0&P/ZEpsI
+\@T>d^VI_(`Q$!@bKS8XdF-Opf%8U/gYL`Di8N_VjlYail0@U$lic_Dn*olHncn^Xp%A%Pp\jjg
+q>0scqu6NlrUp/@s-`n;~>
+JcC<$RfE$Zrr)ior;6Njs7uZhs7ZNerq/DGoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYchDQG(,%%mudU1rf6Z2l\tb"r/CW5q.okDrb_[Or,)4Hs.BId
+St2DLS,SoXS,A]VS",u?Rf8fVReN<LRf&WTSG\iWR[a;FrgO4_S"#h7R@9V6RJp7e=8uD$=oV\*
+>Pqb+?2n7.?i=C2@HV+u@K'[3?iOI4?2Rt->Q7n+=oVV(=8c2"<W?%s;Z]io;>j>j:]F2g:&[id
+9D_?\8cD9W8,YpT7J0(E6hs%f^;%Fu_SsO8bKJ,ScHjkbdF-Lof%Jg5gtglGro"LLj5f@cl0I^'
+md]l>p%J1Xr;D3HJcDGD#iX"G^qI4_ZEaD8.^?.YX/`(rVP^2bU8"<PT:VRBS!fb5R@0G.QBdYu
+P)bQ^N/NRNMi3OOn;.*4s$crWrC;9,8P)NH91qrQ9hnJ\:f1+h<)lt"=BSd2>[:ZC?t*VVAS5[j
+CM[m,EH6,BG'A7ZI=?]tK7nu8M2R=QOHPfmQ^F52StD^NUo(&hX0&P/ZEpsI\@T>d^VI_(`Q$!@
+bKS8XdF-Opf%8U/gYL`Di8N_VjlYail0@U$lic_Dn*olHncn^Xp%A%Pp\jjgq>0scqu6NlrUp/@
+s-`n;~>
+JcC<$RfE$Zrr)ior;6Njs7uZhs7ZNerq/DGoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYcgG`8P;fVohkTaqbd5efMVH(p,W+5r]0j8s#9pZrDru$qcWr$
+qcWi!r)rr$rE9,'oND,p!*T5%!EWD&=8l;'='/T'<ruK*=8l8#=8uD$=oV\*>Pqb+?2n7.?i=C2
+@HV+u@K'[3?iOI4?2Rt->Q7n+=oVV(=8c2"<W?%s;Z]io;>j>j:]F2g:&[id9D_?\8cD9W8,YpT
+7J0(E6hs%TBP1skBkhBuCi0/h")i-uEW1#UFa&+XI!gBmJ:N3%Jq]#:M2I7POHG]iQ'I](R[ftA
+TqeE[Vl?`!YHkLB\%'#^]t_A!_oBd?c-Xkde^rL0hVdDSk3)!pmd]o@p\=U_rIP!"s472Ur2k?Z
+@:!8E=oMS*=]kW("'/K(<W,tu<<#r&<)Z[o;c?Tn<<#l,;,U=k:Jk"e:f'q_:espW:]Ei_7K5jU
+7t!p"8P2TJ92&&S:/=\_;,U=l<E<.&=]ns6?!^lG@Uiq[B4u!pCi402EcZ>GGC"UaIXm!%KSG;>
+Mi<[XP*;/tR$sM9T:r!TVPgDoXfen6ZaI6O]"G_k^r"".`lQ9Fbg+P^daZguf@em4h;7&IiT&t[
+k3(smlKdg'"RYXGnF?MK#4qK[p%J+RrV-HiqYL-erqu`np&9OBRK%d~>
+JcC<$RfE$Zrr)ior;6Njs7uZhs7\ePp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*^:_%f\$`QJYc_o%OJ&M[p:pR?!58BE!P>rB\c0,;\,Wo6[JR?-Zhq'-Z2(^*
+Zh'.RMuJ\7NV\S=f%&:"e'cXjrQkDes3:Gd!mSs5qoo,dqTo2es3:>apWW]]rlt>`rlbenbKA#O
+aiqn.<``@)rE9/(s',G,s'>V1r*TG2raGS2mpl-%raGe6r*TJ1s'>S.s',M,rE02(=',?$s&K(u
+r_rhps&&_ks%iVhrD!;cr_*/]r^m)[q+(BQrC-BIq*XpDJcC<$JcG0<1B.+AnaQ)Ap%7b@mHNfq
+j5f.UhV[/Cf@SHud*g@hccsYTa2Z'6_ns4']Xt_`[C3NQn$rBcs$crWrC6o[8P/nRInNI09hnJ\
+:f1+h;cHdu='8[0>[1TB?t*SUAS,UiCM[j*E,fr@G'A4XI!pNrK7nu7M2R=QO-5]lQC+,1SY)UM
+Uo(&hWi`G.Z*UjH\@K5b^VI_(`Q$!@bKS8XdF-Oof%8U/gYL]Ci8N_VjlY^hl07O#m-X60n*ol<
+ncA@Srq-<cp\jjeq>U6hqu6NlrUp/@s-`n;~>
+JcC<$RfE$Zrr)ior;6Njs7uZhs7\ePp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*^:_%f\$`QJYc_AQFaeq#nWEg4!KW96NUD`,Mi<VlMuAV3MuIPjC\_fBD#nNk
+qel>)!hZ'Tqj[ST!1WnTrgWPKrgWkTpm_5NqjRSSrgWeRrgO=aR[KV5R%'LE<``@)rE9/(s',G,
+s'>V1r*TG2raGS2mpl-%raGe6r*TJ1s'>S.s',M,rE02(=',?$s&K(ur_rhps&&_ks%iVhrD!;c
+r_*/]r^m)[q+(BQrC-BIq*XpD"2DXg`W"'\bR;\@d*^7heCN7(gthtfs5Eq9&`i'9kiqF"mI'K6
+oC_hOq"t#@s+13DruTq:`4imnZE^^@['R!=Y,eS$Vl-AfUSFQWT:_[ES,SlVR1#CKQBmbuPEM#f
+NK!jos,-o:MXZH%7/o^U7f>gY84cDP8q0K-9heAY:f("e;c?Xr<``F,>$P<=?XR>PA7]@dBkqO%
+DK'T:FEVkRH@1-kJV/W1LP^qJNfT?eQ'Rf+S"61FU84ZaWN*)'Yd(OB[^`l[]t_A"_o9X:aihoR
+cdC1jeCN7)g=tH>hr*JRj5oFckiq?tm-O--n*fc9o'uhQo`"Lap@nO\!;ZWjrVQTlrVcEgJcD/<
+J,~>
+JcC<$RfE$Zrr)ior;6Njs7uZhs7\ePp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*^:_%f\$`QJYc^D`8kVoUpJLZ_!)`Viohk9Vn590Fr&FC1q`=^:rAa[VrE'#$
+r)s&%qcO&(='&L+qH<f$qcNo&oND)o!*B/%qcEc!qc<u(=&r@'='5E(s'#G,rETA.ra,M0ra>_6
+pgW]%pgX52ra>Y2s'G_2rETA,s'#A(!a&N*rDrqus&Atrs&/korD<Mir_EDds%NDbr(?r[r^ciT
+rC6`SogJUCpd,3uAnc!qCi!tfD?+YTE<pT+FEMeSI=?\FJOb<EK7nr6Ll.(KNK93bPEhE!R$sP:
+T:r$WW2cl!Y-5+:[C<ZW]=kqn_Sa@5air,[daZh!g>(QCj5oIglg=35p%A(TqYc!FJcF=$($qW8
+ARSqO>?Y05>$4p.<EN=(<`N<%<WZ9%<W5qu;GmElr`&kq%T6/&;Gg@j;,C(b:/F__n5''Ps$crW
+rC6o[8P/nRInNI09hnJ\:f1+h;cHdu='8[0>[1TB?t*SUAS,UiCM[j*E,fr@G'A4XI!pNrK7nu7
+M2R=QO-5]lQC+,1SY)UMUo(&hWi`G.Z*UjH\@K5b^VI_(`Q$!@bKS8XdF-Oof%8U/gYL]Ci8N_V
+jlY^hl07O#m-X60n*ol<ncA@Srq-<cp\jjeq>U6hqu6NlrUp/@s-`n;~>
+JcC<$RfE$Zrr)ior;6Njs7uZh6ML3Ip%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYc_i!OJ/SZotLUC]tM)X]DoGB\bru;\,Ec7[JI9-Zhq',Z1tU+
+Za-n,N;eb4N;nn8N!\.gf%&:"e'cXjrQkDerQY;d!6tMer655eq9K&drQY2an'1gT$HgT8bfe2P
+='&L+rE02*>?h&2s'>Y2r*TG2s'bb5r+#)(r+#V5raGh7r*TJ1s'>S.!aAi3rE9/&!*B,"s&K(u
+r_rhps&&_ks%iYir([2br_*/]r^m)[qFCKRr'g9Hq*XpDJcC<$JcG6>0`Ln>o'l2Co^hV?lg*ft
+io8nRhVR#@f[SBuda?IgccjSSa2Z$8_S<k"]XkS][^PS5s$ZiTs$luXs%!,]r^qZ59MJ5V:Jakb
+;H$Ln<`W:(=^#'8?=.)K@Us%^BPD3sD/O<4F*)SLH$XjdIt30)L51VCN/is]PEhH$R[]k>Tq\?Z
+Vl?\tY->1;['mKT]=bkn_Sa@4aN;WLcHjnde'ut#g"P3:h;@/LioB+^k32'olKmm)mdKW6nac5O
+oCW%T!quB_rqQNhs8)]krqu`no_sFARf@m~>
+JcC<$RfE$Zrr)ior;6Njs7uZh6ML3Ip%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYc_>PFao%$oTB-7rf@&=p5SU$pP]$0qMYB2r+uCKokaVFrb_[Q
+s)%aQs.T@`!hZ'Tqj[ST!1WnTrgWPKrL<_RqO@GPoU>iNrL4._S!fb7R[I5Y=BPN)!a8f4rETA.
+s'GV1ra>b7qI9A4lt$$(qdTP5s'Yb3s'G_2rEKD.>$Cl-s&]8&rDrqus&Atrs&/korD<Mis%`Jd
+s%NDbr(?r[r^clUrC6]RogJUCpd,#(bP]QrcHjnddaQaug"YBAioB([jQ$7!''/0:kiqBum-a?4
+oCVbNq"t$hJcC<$U]2Y;f#YeD]<nlKZF%!EYH=t0WMubmVPBr^TqJ$LSXc1<S!]V3R/WB]P`q8l
+O,f3XM2@+JMN!G^M#TmB7K5jV8,l*[8cD>392&&S:/=\_;,U=k<*!%$=BSg4>[CcF@:EbYAnYmn
+CMds.EH?5FGBnL^I=Hd"KSG8=MN!RVOcu&rR$sM8StVmSV5L;mXKJe4Za@0N\\#Mg^r"".`lQ9F
+bg+P^daQ^sf@em4h;-uHiSrnYk2tmll0@X%mI'H3nF?)?!V>s_o`Fj]p\ssfq>^<iqu6NlrUg)?
+s-it<~>
+JcC<$RfE$Zrr)ior;6Njs7uZh6ML3Ip%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYc^D`92&)VqGHo`r_`SipegNWmns!Cs#B[3q)\O9!]i>%q,mSs
+s&f2%rE0#$!*K5%!*K&"s'"emoiM2srE'/'=BAW&=8uD$=TVc2>Q%h,?2n7/?iFI5@JXI2A*db(
+A,Ba7@K0a5?iOI4?2\"0>?Y5/=oVS(=8c2"<W?%t;u]bq;>j>k:]F2f:&dod9DhE]8cD9W8,YpT
+7J0(E6hit`C27X%D/F0/DfB]9EcZ;EG'\RdJV&RQK11HIL5:\DMi<[WOcu#qQC+,2SY2[PV5UDp
+XKJe4Za@0N]">Vh^r"%0a2uQOdF-Opf@ep8i8`q\kj%O'nauPLqYU3iJcC<$fDcN>P]C;C?X6i=
+=^,$2='8U,=B8K%=8u80<)lms<Dudp<)HRn;cN`p%T65):f(%f:esh_:JaharD<,^s$ZiTs$luX
+s%!,]r^qZ59MJ5V:Jakb;H$Ln<`W:(=^#'8?=.)K@Us%^BPD3sD/O<4F*)SLH$XjdIt30)L51VC
+N/is]PEhH$R[]k>Tq\?ZVl?\tY->1;['mKT]=bkn_Sa@4aN;WLcHjnde'ut#g"P3:h;@/LioB+^
+k32'olKmm)mdKW6nac5OoCW%T!quB_rqQNhs8)]krqu`no_sFARf@m~>
+JcC<$RfE$Zrr)ior;6Njs7uZh6ML3Ip%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqd[^EHHYc_etOJ8VYp:pXAs1JBDs186@rj`!;q6g:2r3Z@-qm-.)os4V(
+k)9;"req9>g"=p.f%&:"e'l^krQkDer6>5d!6tGcrlkGgq9K&drQY2ao?I-U#g:B5aiqq0=BPQ*
+s'#G,r`oJ/s'GV1s'Yk8qdTP7rFG,'rFGn;qdTS6s'Ye4s'G_2rETA,!*]>(s&]8&rDrqu!*&nq
+s&/korD<Mis%`Mer_3>bqb$iZr^clUrC6]Rp-e^DpHjH2JcC<$o)CKDq"""Fo_.qInEfK-ki_'d
+hr!AMgY(3/eC2modEg%[b/_K?^r""*^V.7i\$`ZQ\@M(<s$ZiTs$luXs%!,]r^qZ59MJ5V:/=\`
+;H$Ln<E<1'=^#'8?!guJ@Uit]BP;-rD/O<4F*)SLH$XjdIt3-'L51VCN/is]P*M?#R@Bb=TVA6Y
+Vl?\tXg#(:['mKT]=bkm_8=12aN;WLcHaeae'ut#f\5*8h;@/LioB+^k3)!nlKmm)mdKW6nac5O
+oCW%T!quB_rqQNhs8)Zjrqucoo_sFARf@m~>
+JcC<$RfE$Zrr)ior;6Njs7uZh6ML3Ip%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqd[^EHHYc_;NFao"$p6#?9rf?r:oo8[(p5As0qhtE1s,6;]rb_[Qrb_UO
+rh0@cU&:PbT:VVNS,SoYS!s>E!1NnVo:#ZJr0mJOrL32Es-a+ZS!mD\=T2J'>5qh+>lS+0?Mn11
+@/j[4@fBm9AE[V'AH$*9@fKm:@/XI4?N4=0>lS".>5_V(=9)G$<rZ/"<;fbq;ZBVm;#a>k:Amod
+9`Ic_9)_E]8GYjT7f5^K7/94E6N54/bmhtFdaZdsf@ep8iSrnZroP!XjPo1[jQ>Xil0I^(md]o@
+p@nCZrVhBJJcDMF2t5;;_S3ReZE^aCZa$^8Xf\V'W2?DeUnXQST:MOCR[]e7R@'>-Q'@GqP)kZ`
+NJiXMMi3INMXZH%7/fXT7fGpX8,u6\8q0K-9heAX:Jand;c?Xq<``C+>$P<<?XR;O@qB7cBPM="
+DK'T:FEVkRH@1-jJ:`E.LP^nINfT<cQ'Rf*S"6.DU84W`WN*&%Yd(OA[^`l[]Y;.s_SsO9aihoR
+cHstfeCN7(g=tE=hr*JQj5f@bkNV6rm-O--n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;QZerdk*<
+s*t~>
+JcC<$RfE$Zrr)ior;6Njs7uZh621*Hp%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqd[^EHHYc^A_92/.X;>!id;>F&c;=79L;=6I;3qc\S=8uD#=o;D$=TDS&
+<rc@b=TMW-n6#Zk"B\`,=BPQ*s'#G,r`oJ/s'GV1s'Yk8qdTP7rFG,'rFGn;qdTS6s'Ye4s'G_2
+rETA,!*]>(s&]8&rDrqu!*&nqs&/korD<Mis%`Mer_3>bqb$iZr^clUrC6]Rp-e^DpHnmrs(r9b
+E,]f<F)l>DGBnRaItE=PK`6TmKS>/9M2@.LNK0-bPa7Z'R@Kh?TqeH^WiW>+Yd1UC[^iu]]t_A"
+_o9^>bKeM`e(*('gYLcGj5oLhlg=02oCr+YrVhBJJcF@%#KMa?@UEJI=oMS2=]ea-<`iC(<`f9#
++BDHA<*!!t;H-Om<)Q[p;c6Ok;Gp@h;Gg7d:Jah`:K%-foM>KTr^HiVr^ZuZ!(m/^InNI09hnGZ
+:f1+h;cHat='/U/>[1QA?t!MSAS,UhC27[(E,fr@G'A4XI!pKpJqJf5M2I7PO-,TjQC+)0SXuLK
+UnsugWiW>,Z*UgG\@K5a^;%M$`Q$!@bKS8Wd*^=lf%8R.gYCWBi8N\UjQ>Ufl07L"m-X60n*ol<
+ncA@Srq-?dp\4[^s7u]kr;6Kkrr)KgJcD2=J,~>
+JcC<$RfE'[rVc`nr;6Nj!;ZTg!Vc<eof_s=o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYc_euOJ8PZq7lsDs1SHF"1u.T\bru;\,*Q5[JmQ1Zg"doZf6rC
+gAfe3f@JO'eC;srdaA$>r6G5brltMgqTJubcMZ#gc2l8:rQYAf!71VhpWW]]rlbSibg">TbKKk,
+!*K2&!a8f4rEKD0?=*S;s'Yh7r*o\9rabe8mq2B,rac"<r*o\7s'Ye4s'>\2rETA,!*]>(s&]8&
+rDrqu!*&nqs&/korD<Mis%`Mer_3>bqb$l[rCHcTrC6]Rp-e^DpHjH2JcC<$o`$WDp@IkFp%J"H
+mHj-(kN:mbi83DJg"=p-daQXld*KqXaiD?;_SO"%^:V"f\@&cRm^W3`s$crWr^ZuZ!(m/^!D?,c
+9mf]3:f(%g;cHat='/U/>?kH@?X[DRAS,RgC27[(E,fo?Fa&(VI!pKpJqJc4M2I7OO-,TiQC+)0
+SXuLJUnsufWiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=lf%8R.gYCWAi8N\UjQ>Ufl07L!m-X60
+n*ol<o(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s-it<~>
+JcC<$RfE'[rVc`nr;6Nj!;ZTg!Vc<eof_s=o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYc_;OFFJk#q2tQ9!0?l7oo8j-qMY60qhtB0rJU#Yrb_XP!,_^Q
+rh9+[!hZ'Tqj[ST"e1sLR@0NCS+E*JS,A`NS,JfRRfJoVRg,=NS=5q9S,JcU=T)A(>$G50>QS2;
+?N"72@/aU4@fKs;AGBa)B)-$;AH$*:@fKm:@/XI4?3":0>lS".>5_V(=9)G$<rZ/"<;fbq;ZBVm
+;#a>k:Amod9`Ic_9)hK]8GYjT7f5^K7/94E64_AdcHabbe^rL.gYUlJj5p7%(?OW:ioK1^kNM3s
+mHsB4oCVbOqYU9kJcC<$U]1eac,IK4\$NBF['d3DXo>C7Wi;qnV5'i[Tq@sJSXc.<R[KTCQ4&q@
+PECrfNJrgRMM_=js,-?&rC$ZSs$luXs%!,]r^m2a9`@b6:/=\_;H$Ln<E<1'=^#$7?!grI@Uit]
+B4u$qD/O<4EccGJG^=acIt3-'KnkMBN/`m\P*D9"R@Bb=TV80XVl6VsXfo"9['mHS]=bkm_8=.0
+a2lEHc-F\`e'ut#f\5*8h;7)KioB+^k3)!nlKdg(mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZe
+rdk*<s*t~>
+JcC<$RfE'[rVc`nr;6Nj!;ZTg!Vc<eofVm<o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYc^D`92&(Z;=mcd;>X2i;#jGi;=.3J;?&WD3VPT0=9;W-=oMP'
+=8uD#=o;D$=TDS&=8l=c=o)5#=8l;+='/U,=BAW'<rcA$=TVc2>Q%e.?!^k9?iOO5@JjU7A,^$6
+Aaa7,Ac?6>A,Kg9@K0a6?iOF4?2\%.>6%k*=oVS(=8c2"<<-"s;u]bq;>j>k:]F2g:&[id9D_?]
+8c;3V8,YpT7J9.F6h`nZD/O60E--5GG'.qPH[U?nJqO&U8:uMHKS>,8Ll.+LN/s*bPa7])R[p"A
+TqeH^WN3/)Yd1XD[^`o\]t_A"_o9[<bKeJ_e(*('gYLcEiT'%`lKdj)nF?2HqYc!FJcF@%%CUh%
+@U*,A>$>'4=]ef&=8u8B<)lpt<`E'r;c?Ol<)QUm;c-Ll;c$7f;,L.d:Jah_qbZr]rC$ZSs$luX
+s%!,]r^m2a9`@b6:/=\_;H$Ln<E<1'=^#$7?!grI@Uit]B4u$qD/O<4EccGJG^=acIt3-'KnkMB
+N/`m\P*D9"R@Bb=TV80XVl6VsXfo"9['mHS]=bkm_8=.0a2lEHc-F\`e'ut#f\5*8h;7)KioB+^
+k3)!nlKdg(mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*<s*t~>
+JcC<$RfE'[rVc`nr;6Nj!;ZTg!Vc<eof_s=o()>?n*f]3m-O$%l0%3kjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYcV_mO.rGYqnN0Fs1SHFs1A<Br4)X5s0hm6s0V[0n$;tuqm-1,
+j,Euk%b]Rig"4j,f%&=#e'lamrQkDer6>5d!6t>`!6tGfrm(GdqTeo]q98l`s2tJdaiaTcs&oD,
+rETA.!+,V2s'Yk8r*o\9rabn;rFYk<qIo_<rFYn;s().>r*o\7s'Yh5s'G_2r`oJ-s'#D)s&]8&
+rDiu"<)ifps&&horD<Mir_EDds%NDbr(?r[r^ciTrC6`SogJUCpHjH2JcC<$pAZlDp$qVDp%RtE
+lKIO"kN:mbhqm;Hg"=m,eC2gmd*9eVaMl-7_SO(']t:ha\$i`S\*pj*7/o^U7f>i+84cBF8kViO
+9heAY:f("e;cHat='/U/>?kH@?X[DRAS#LfC27X'DfKf>Fa&(VH[U?nJqJc3Ll..NO-#NhQ'[o.
+S=ZCIUSXleWiW>+Yd1XE\%0)_^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8EVTjQ5OekiqBum-X6@
+mgJXTo()DEo_%nNp\4[^s7u]kr;6KkrVcEgJcD2=J,~>
+JcC<$RfE'[rVc`nr;6Nj!;ZTg!Vc<eof_s=o()>?n*f]3m-O$%l0%3kjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYcV5KFFJh"qN:];rK$Z4q2P91pl#-1qht?/r/1Q6lYQK9rbh_/
+!hc6\pn.\\St5bJrgWtXr0mVSo:#ZJr0mALs-iYNs-s4]R[TY5r`T8)!*fD,s'5V2rEoS4s'bh7
+s'u%=qdo_<q.KP;qIfb=qIT\;s'tt9s'bq8ra5\3s'>V/s',M,r`T8'!*B,"!``3!rDW_o!)`\k
+s%iVhrD!;cr_*/]r^m)[q+(BQrC-BIq*XmC-dL&ae(<:.gu%#KjQ,Fbk2k^cj5K"XjQ5Ofl0I^(
+n+$#Ap%J4XrIP!"s.]N%hoisQ]XP/OZ*^pCY5YL0Xf8:uV50l^TqJ%WSJ[lcS!f\3QBmf$PEV/j
+O,]-WM2@.KMMmA]M#BaA7K5jU7t+!#8P2TJ9MA/T:/=\_;,U=l<E<1'=^#$7?!grI@Uit\B4u$q
+Ci402EccGJG^=^bIXm$&KnbD@N/`m[P*D5uR@B_<TV8-WVl6VsXfnt7['mHS]"Gbl_8=.0a2lEH
+c-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg(mf2_`nF?)?oCV\Jp%J.SrqQNhs8)Zjrqu`np&9OB
+Rf@m~>
+JcC<$RfE'[rVc`nr;6Nj!;ZTg!Vc<eof_s=o()>?n*f]3m-O$%l0%3kjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYcUAb8PDiTnkoHbr)!Air_ibnlVQtGs#BF,pcACV!*AturE9/&
+s&]5&r)rr"r`K5'rE&o!l<3XZrE&u$s&oD,rETA.!+,V2s'Yk8r*o\9rabn;rFYk<qIo_<rFYn;
+s().>r*o\7s'Yh5s'G_2r`oJ-s'#D)s&]8&rDiu"<)ifps&&horD<Mir_EDds%NDbr(?r[r^ciT
+rC6`SogJUCpHfC.DfBcAGBe=UH$b!hJ:`FQKLpfIJqJ`1LPUhGN/is]PE_>uR@9Y;T:r$VVPpMq
+Xg#(:[C3QS]=kqo_SsO8b0%uUdaQaug"Y<>i8N_Wk32*tmI'N9p%S=^JcC<$g&F)*W-W)b?<pc<
+>$4s1=BAO(='/O)=&i4!<`N*u<E)ms<)Z[n<)QXm;c?Rk;,C.g:esk`:Jah`:]4,_:]3]]7K5jU
+7t+!#8P2TJ9MA/T:/=\_;,U=l<E<1'=^#$7?!grI@Uit\B4u$qCi402EccGJG^=^bIXm$&KnbD@
+N/`m[P*D5uR@B_<TV8-WVl6VsXfnt7['mHS]"Gbl_8=.0a2lEHc-F\`e'uq"f\5'7h;7)JioB+]
+k3(smlKdg(mf2_`nF?)?oCV\Jp%J.SrqQNhs8)Zjrqu`np&9OBRf@m~>
+JcC<$RfE'[rVc`nr;6Nj!;ZTg!Vc<eof_s=o()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_a[^<BGYH;MgNhE5SrP/?G!kl7Zrjr6C\[h^Lq7$C4rjDa4rj2(!r3?1*
+r3PFB!SZ<-gAT\*f@KoN!7_"s!7Cbkr6G5brltMgq9/lacMc)gcMYracMPl_bl>iobg"DVbfe.3
+=^#$6r`oJ/s'G\3s'Yk8rF5e:rabq<rau+Ak\0p-rau(>s()+=raPn9s'Ye4!a]/<r`oJ-s'#D)
+!a&N*rDiu"<)ifp!`DlmrD<Mis%`Jds%NGcqb$iZr^clUrC6]RogJUCp-O?1JcC<$qYr>Mq=F1K
+p%J+KlfdQslfdKliSWMKgXk*/f$r0rdEp.]aiMH>_83n$]t:ne\@&cR\@M(<rC$ZSs$lrWIRm%%
+8kM`L9MJ5V:Jakb;H$Op<`W=*=^,-:?=.)L@q9.`BPD6uDJsN8FEMePH@('hJ:W?,L5:\ENK90a
+Pa.T&S"-(BTqeE\W2co#YHY==[^WfY]Y2(r_SjF6aND]NcHsteeCE1'g"P6;hVd>Oj5f=akNM0q
+lg4!+s6g?bnac8Bo^qhLp@e7[q#C0iqY^6ir;HTerdk*<s*t~>
+JcC<$RfE'[rVc`nr;6Nj!;ZTg!Vc<eof_s=o()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_a[^<BGYH;)GF+&Xtq2t]=qN(B2r/LT4p58p0qht<.r/:Q5s(h"<r,)FN
+!MQ7eU&CVaTDG5\T)bGZS,SrXS,SlTS+<$JS,A`CS,\oYS"-#JRg#6`=^#$6r`oJ/s'G\3s'Yk8
+rF5e:rabq<rau+Ak\0p-rau(>s()+=raPn9s'Ye4!a]/<r`oJ-s'#D)!a&N*rDiu"<)ifp!`Dlm
+rD<Mis%`Jds%NGcqb$iZr^clUrC6]RogJUCp-K8:eC`R5hr3VUjQ5Ocj5^*t''&'7k32'qm-X93
+nauMJp\OjfJcC<$U]27cb/M*,[Bd'E[C!0?X/`8&WMuelUnaZXT:l1S&=f2YS!]S/QBdYtOH>N_
+N/[ans,-r9Mi$qZrC$ZSs$lrWIRm%%8kM`L9MJ5V:Jakb;H$Op<`W=*=^,-:?=.)L@q9.`BPD6u
+DJsN8FEMePH@('hJ:W?,L5:\ENK90aPa.T&S"-(BTqeE\W2co#YHY==[^WfY]Y2(r_SjF6aND]N
+cHsteeCE1'g"P6;hVd>Oj5f=akNM0qlg4!+s6g?bnac8Bo^qhLp@e7[q#C0iqY^6ir;HTerdk*<
+s*t~>
+JcC<$RfE'[rVc`nr;6Nj!;ZTg!Vc<eof_s=o()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_a[^<BGYH:5`84uWQoMYWbs%r_mqbmGklqm%Gs#BC+q)\FUr`Aqu!*T;)
+!*K5%!*K/%r)ir$!*K,"rE/AgpfRPtqcF#'=]np4>Q.n-?2n71?iOO6@Js[8A,^$:Ac?<?BBX%-
+BDuN@AcH<?A,]s;@K0a6?NOP>?2e+/>Q7n+=TV],=8c/$<E)rr;Z]io;>j>k:]F2f:&doe9D_?\
+8cD9W8,YpT7J0(E6hWhSEclVQH@(!dI=?]tqL\a#1kg[?M2R=PO-,TiQ'Rc)S=H1DU84ZbWiE,%
+YHkOB[^`r^^;.V(`Q63FcHjneeCN:+gthtf%H6@0l0@[*nFQ>Hq>C5Cs+14(rs%GLFCS`b?2e"0
+>?P*2r`::E=BAO(<E)t!<E)pt<Dugq;c?Xn;c?Rm;Gp=e;Gg:f:f%'e!DcYl;>F&e:]3]]7K5jU
+7t+!#8P2TJ92&&S:/=\_;,U=l<E<.&=]ns6?!^lG@Uiq[B4u!pCi402EccGJG^=^bIXm!%KnbD?
+MiEdZP*D5uR%'V;T:r$UVPpMqXfnt7ZaR?R]"G_k_8=.0a2lEHc-F\`daZh!f\,!6h;7)JioB+]
+k3(smlKdg'mf2_`nF?)?oCV\Jp%J+RrqQNhs8)Zjrqu`np&9OBRf@m~>
+JcC<$RfE'[rVc`nrVQWks7uZhs7ZNerq/MJoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iZMYck0CI#FYpXM;OL^AbhG]E>dW]".dLqR?C2qm6@0n?Vqrqm-+*
+repN0rJU?-s4dJ*rn.A*f@KoNs4%(t!R]9nchu)dc2Pugc2#Q`c2Q#gci25fc2>lcc2,ZabPo]k
+bK\;UbZS+R>Q.k/?!^k:?iOO6@Js[8A,g*;AcHBABDH6.C&2NBBDuNAAcH<@A,Tm:@/s^6?NOP>
+?2e+/>6%k*=TV],=8l8#<W?%t;u]bq;>j>k:]F2g:&[id9D_?\8cD9W8,YpT7J0(E6hWits+13$
+s8;mKrV,mUp%J.RnET6"kNV0kio/eOh:pQ6e^`0uda?Cdb/q`D_ns4(^:h.g\@;IG!4hO-rC$ZS
+s$lrWIRm%%8kM`L9MJ5V:Jakb;H$Lo<`W=*=^,-:?=.)L@q9.`BPD6uDJsN8FEMePH@('hJ:W?+
+L5:\EN/s'`PEhK%R[ftATqeE\VlHf"Y->4<[C3WW]Y2(q_SjF6aND]NcHjndeCE1&g"P6;hV[8N
+j5f=akNM0qlg4!*s6g?bnac8BoCV_Kp@e7[q#C0iqY^6ir;HTerdk*<s*t~>
+JcC<$RfE'[rVc`nrVQWks7uZhs7ZNerq/GHoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iZMYck07BQANPL\[)4OSOt6Nr4n6N:2]$MYrD0N;dV^D#8)KDZ?I/
+U&L_`TDYA^T)kLQr1!\UrL3eUrL<,AqO@MTqO@MRrgNnVrL3ml>$G51>QS2;?N+=3@/j[6@fKs<
+AGg$=B)ZH=B^KO1B`;ZDB)Q<@AH-0<@fKj:@/XF6?<pk9>lS".>5_S*=BAT'<rZ2"<;ohr;ZBVm
+;#a>k:Amod9`Ic_9)_E]8GYjT7f5^J7/94D64)/ngYUlKj5f:]ro+[OioB([jQ5Oel0@U%n*ol<
+o_%tRrIP!"s.fSto$b^t^UX9Lrj42ZXK/A%X/W%pV50l\U7S!JSXc4>R[TY2QBd_uPE:icNK&gQ
+M2I4LN/EM^M#BaA7K5jU7t+!#8P2TJ92&&S:/=\_;,U=k<E<.&=]ns6?!^lG@Uiq[B4u!pCi402
+EccGJG^=^bIXm!%KSG;>Mi<^YP*;/tR$sP:T:r$UVPgGpXfen6ZaI6P]"G_k^r"%/a2lEHc-FY_
+daZh!f@em5h;7&IioB+]k3(smlKdg'mJlV_nF?)?oCMVIp%J+RrqQNhs8)Zjrqu`np&9OBRf@m~>
+JcC<$RfE'[rVc`nrVQWks7uZhs7ZNerq/JIoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iZMYck/u7n--F:Jpjaq,.#er))lYl;@O?loG),s#U9C=]tZ)rE&ku
+!*T;)!*K2$!*K2&r)ir$!*K%urE/GiqcNl"r`B/%rE'/)>$G51>QS2;?N+=3@/j[6@fKs<AGg$=
+B)ZH=B^KO1B`;ZDB)Q<@AH-0<@fKj:@/XF6?<pk9>lS".>5_S*=BAT'<rZ2"<;ohr;ZBVm;#a>k
+:Amod9`Ic_9)_E]8GYjT7f5^J7/94D63q^XH$amcI=?\FJ38C5JV/T.KS>/9M2I4NO-#NgQ'Rc(
+S"-%BU84ZbWiE,#Y-G:>[CEc[]thJ%`Q-*Dc-Ohee^iC,gt^`bh@/?%k3DC*o_%qOq>1)As+14(
+rtN_;CL^[V>Zk36>$>$1='/O(='&E$<rQ+u<"i81;cQao<)QXn;H-Ol:f(%f;,I6f!`2Zhqbd/c
+rD3A[s$crWrC;<-8P)NH91qrQ9hnJ\:f1+h;cQk!=BSd2>[:ZC?t*VVAS5[jCM[m,EH6/DGBeF\
+I=?]tK7nu8M2R=ROHPfmQ^F53StD^OUo(&iX0&P/ZEpsI\[oGe^VI_)`Q-'BbK\>YdF-Opf@S^0
+gtgiEi8WeXjlYail0@U$m-XiA$h3]Wo(2JFp%A%Pp\ssfq>^<hqu6NlrUp/@s-it<~>
+JcC<$RfE'[rVc`nrVQWks7uZhs7ZNerq/MJoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_(g\$iZLYck0DHA\DnVn^"G^&l!\]`,PB\c0,:\,*Q4[/dT2Zh:X"Z2:j)
+Zi@E0Mtr>/Mtr;3gATe*g&]m\rn.G,f@JL&rRCkr!R]9nchu)cc2Z&hc2#Q`c2#Z]c2Q#fblc27
+bffq.s3(Dcs31RJ>Q.n-?2n71?NOVD@Js[8A,g*<AcHBABDZBAC&;Z;C]%rGC&;TDBE)TBAcH<@
+A,Tj<@:3LB?iOF4?2e+/>Q7n+=TV],=8l8#<W?%t;u]bq;>j>k:]F2g:&[id9DhE]8cD9V8,YpU
+7J0(E6hNcss+13$s8N$QrV-'Zp\=LTn*0#sjltmfiS`SLgtLB2e()ssda?CdbK7fD_SO"%]t1hd
+\@&cR\$te8rC$ZSs$lrW!_>mSr^qQ29MJ5V:Jakb;H$Lo<`W:)=^#'8?=.)L@Us%^BPD6uDJjE5
+F*)SLH$XmfJ:W?+L5:\EN/j!_PEhK%R[]n@Tq\?[Vl?`!Y->4<[C3TV]Y2(q_Sa@4aN;WLcHjnd
+eCE.%g"P3:hV[8Mj5]7`kNM0qlg4!*mdKZ8rpg9bo_%nNp@nO\!r;]hr;6KkrVcEgJcD2=J,~>
+JcC<$RfE'[rVc`nrVQWks7uZhs7ZNerq/GHoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_(g\$iZLYck07B5r?MK`$u3OSFn7Nr+h6N:2]#MZ&J.N;IDgD#S;KD#A/M
+D?4UJrM':b!MH.cT_kA\T`:VbSXfVIrg`nU!1a%Xn='BHrgN\Q"ItsOS!s8Es-ikT!Er_,>lS+0
+?N+:5?t!LB@fKs<AGp*>B)ZH?B`;`CC@l<>CAhlDB`D`FB)Q<@AH-0<@KKtG@/aO5?3":1>lS%.
+>5hY+=BAT'<rZ2"<;ohr;ZBVm;#a>k:Amod9`Ic`9)_E]8GPdS7f>dK7/94C63Gcjgu&+jr8ACM
+j5]4]jlY^gl0I^(nF?)@p%J1Wrdk*#s.oZ"kg.8a^::SXrj=8_XfJM&WiN+tV5C)aTqS*NSXc4@
+S!oe5R$Nu$PELufNf/jSMMd=MMMmA\M#BaA7K5jU7fl4Q8cD>092&&S:/=\_;,U=k<E<.%=]np5
+>[CcF@U`kZAnYmoCi4-0EH?5FGBnL_IXm!%KSG;>Mi<[XP*;/tR$sM9T:r!TVPgDoXfen6ZaI6O
+]"G_k^r"".`lQ9Fbg+P^daZguf@em4h;7&IiT&t[k3(smlKdg'mI'H4nc&(`oCV_Kp@e7Zp]C9f
+qY^6ir;HTerdk*<s*t~>
+JcC<$RfE'[rVc`nrVQWks7uZhs7ZNerq/MJoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_(g\$iZLYck/u7n?6F:Jk!a;Ys>h;Ys>Y;!CjS3;bf93qbT53WN:\=oMM(
+='5?$rE'&&r`T;(rE'#$r`T/$r`K5'pfIGsmo]`p=]ec'=T;J#=92T0r`oJ/s'G\3!aoGFrF5e:
+s()(>s(;7Cqe5tCqeGb=r+c1Eqe6"Bs(;4@s().>rF,h:?srt@s'>\2r`oJ-s'#D)!a&N*r`9&!
+s&Atrs&/korD<Mis%`Mer_3>br(?r[r^ciTrC6`SogJUCog8\%:jIA7I=?WpIt3'#K7ei1Knb>;
+M2R=QOHG`kQC!u-S=Q=IUSargWiE/&Yd(OB[^`r^^VIb+`lZEJcdL=ne^rL/gtUW@hV[8Ql0n9=
+qYU9g!W;qJs+14)rtN%sCLURT>?P-7>?Y*1='/L'='&E#<XMi-<E3!t;H$Ro;Z9Yq;@-<";,C+d
+;,C.dr_NVk;#=,c;#O2g7/o^U7f>gY84cDP8pj9*9heAY:f("e;c?[s<``F,>$P<=?XR>PA7]@d
+BkqO&DK'T:FEVkRH@:6mJV/W1Ll%%KNf]EfQ'[l,S"?7GU84ZaWN3/(Yd1UC[^`o]]t_A"_o9X:
+aihoRcdC1je^i@*g=tH?hr*JRj5oFdkiqBum-O--n*olHncn^Xp%A%Pp\jjgq>0scqu6NlrUp/@
+s-it<~>
+JcC<$S,`-[rr)ior;6Njs7uZhs7\hQp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$iWKYcb*DH\n\uVuFI1^&P_F]DfD=\G`o3[f3Z5ZhC^#Z21d(Zi.9,
+Mti8/Mu/G;g=b05g=tB]gAKV,f[n^)ec+(tdfIkCrm1Vis31PhqTT&dc2#Q`c2#Z\c2Z)ec2Pon
+bKS2RbKS/QbZk'Os'5V2ra5\5!+Gh8s'l%>rFQ"@rb).Bs(VFHk%jp1s(VCEs(D@DrFQ">!+Yt:
+!b#JEra5\3!+#S/s'#J,r`T8's&]2#s&B%urDW_o!)`\ks%iYir([2br_*/]r^m)[qFCKRr'g9H
+q*XgAJcC<$Jc@P)qXsXYp\4CPm-*Qmj5o@^i8<>Gg=Y!+dFHaqdaHIeb/hZB_83n#]tCte\$rfA
+\@K*;\G\hq7K,dU8,l*[8cD>392&&S:/=\_;,U=k<*!%$=]np5>[CcF@:EbYAnYmoCMds.EH?5F
+GBnL^I=Hg#KSG8=Mi<[WP*;/sR$sM8T:r!TVPgDnXfen5ZaI6O\\#Pi^r"".`lQ9Fbg+P^daZdt
+f@em4h;-uHiT&t[k2tmll0I^&mI'H3nF?)?!V>s_o`=d\rV-HiqYL-erqu`np&9OBRf@m~>
+JcC<$S,`-[rr)ior;6Njs7uZhs7\hQp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$iWKYcb*6BQ8QRK`7,3OSY%9Nr+h6N:;c$MZ&J+N;75hD#%rGD#\>P
+DZ4MNU&UkdU&:S[T)bP`T)kLQqO7JTr1!_Vs-rMHrgWqVqO@JSrgO4_S"#k8S!oe8>Q.n->l\41
+?iOL6@Js[8@fU'<AcHBABDcHCC&Mf/C]/#JC&DZEBE)TBAcH9@A,Tj<@:3LB?iOF4?2e+/>6%k+
+=oVV(=8l8#<<-"s;u]_q;>j>k:]F2f:&dod9DhE]8cD9W8,YpT7J0(E6hNbMf@o*>i8<Gki"k>4
+j5f:_k2tjjlg4'.naZ5CpA"L^rdk*#s/#`"hos'R]!o0J[4J\iXfJG$Wi;trV5C&_U7e-MS=H.?
+R[]b5Q^*i#PECofNfB!TM2@.=MMm>[M#BaA7K,dU8,l*[8cD>392&&S:/=\_;,U=k<*!%$=]np5
+>[CcF@:EbYAnYmoCMds.EH?5FGBnL^I=Hg#KSG8=Mi<[WP*;/sR$sM8T:r!TVPgDnXfen5ZaI6O
+\\#Pi^r"".`lQ9Fbg+P^daZdtf@em4h;-uHiT&t[k2tmll0I^&mI'H3nF?)?!V>s_o`=d\rV-Hi
+qYL-erqu`np&9OBRf@m~>
+JcC<$S,`-[rr)ior;6Njs7uZhs7\hQp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$iWKYcb)u8Ol?H:]=5g;Ya2f;Ys>\;!(XN2uku73r1l83rE+[=oMP!
+=8Z2"=o__(=8c5$=o;D$=TDS!=8l=p=TDS#=oMM0='/R+='/O*=Bkc0s'5V2ra5\5!+Gh8s'l%>
+rFQ"@rb).Bs(VFHk%jp1s(VCEs(D@DrFQ">!+Yt:!b#JEra5\3!+#S/s'#J,r`T8's&]2#s&B%u
+rDW_o!)`\ks%iYir([2br_*/]r^m)[qFCKRr'g9Hq*XgA"*Sm7I/\OhIXciuJqJ`0Knb>;Ll74P
+O-,TiQ'Rf+S=Z@HU8=`cWN3,'YHbC?[CEf\^;.S&`Q63GcdC1je_&R0h:p]?hr<b^m.'iIr;QZm
+qu$ACs+14*rt5(*H>$bl?<^T:>?Y03=&r@%r`0#!rDrks(fOC4;cH^o<)QXn;H$Fh:f:.e:esk`
+85K%Yq,%#crC$ZSr^QlWs%!,]r^qZ59MJ5V:Jakb;H$Ln<`W:)=^#'8?=.)K@Us%^BPD6tD/O<4
+F*)SLH$XjdIt<6*L51VDN/is^PEhH$R[]k?Tq\?[Vl?\uY->1;[C3TU]=ktp_Sa@4aN;WLcHjnd
+eC<($g"P3:h;@/Lj5]7`k32'olg4!*mdKW6nac5OoCW%T!VZ9dp]C9fqY^6ir;HTerdk*<s*t~>
+JcC<$S,`-[rr)ior;6Njs7uZhs7\kRp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb*@HAAMrVSE,Erk/9C!4r0?r4)X5s0_p:rjMj7s0Vg4kd(,m
+qm??]r/:9-qhtK5rS%8(s4RJ-rn@D*s4@M.f[n^)ec+(tdfInDrm1Shs31PfqT\cYqp+]Us3(Vh
+bfn8Rrlk@H!aT,=ra,_7@:B.Es'l%>rFQ"@s(D:Drb;CIqJ5tEokjSBqeQ1Gs(VFFs(D@DrFH%@
+@q5LIs'Yn8ra5\3!+#S/s'#J,r`T8'!*B,"!``3!rDNbq;,R9gs%iYir([2bs%E5]r^m)[qFCKR
+r'g9Hq*XjB!'u29JcC?%/GSi3q=jXUnEK0!k2YI\iSWMIgt:3.e'Z^qe'c[kcH=5K`PKC*]tM%g
+\$u@Fm(!!^r^HiVr^ZuZ!(m/^InNI09hnJ\:f1+h;cHat='/U/>[1TB?t!MTAS,UiC27[(E,fr@
+G'A4XI!pKpK7nu7M2I7PO-,WkQC+,1SXuOLUnsugWiWA-Z*UgG\@K5a^;.V'`Q$!@bKS8XdF-Ln
+f%8U/gYL]Ci8N_VjQ>Ugl07O#m-X60n*ol<ncA@Srq-<cp\jmeq>^<iqu6NlrUg)?s-s%=~>
+JcC<$S,`-[rr)ior;6Njs7uZhs7\hQp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb*4B5iBOKDgr3OSk1:Nr4k:Nr4jsMt;o'C]8/GD>nALD>9e)
+UAgkdT`:VaT_=uYSt,VG!1NkUrgWtXn='$>rga"X"IbgLR[X5Fr`fM1?=*V<!aoGFraPn;!+c%>
+s(;:DrFl1Es(_CGqeYqBqeZ.FrbDIIrFl4Ds(;4@!b>eNraPn9!+>e5s'>\2r`oJ-!*]A)s&]8&
+rDiu"<)ifp!`DlmrD<Mis%`Jds%NGcqb$iZr^clUrC6]RogJUCp-JgHf\HD]!T;u9it:A7k3(sm
+m-X92nac>Gp\FadJcC<$V>gbQbJM$+[C?.C"gbD5Wi<#tW?\=;V50iZT:_^FS=Q4=S=5h3Q'ISt
+OcYWaNJiXMMMm@MMM^eXrC$WRs$luXs%!,]r^qZ59MJ5V:Jakb;H$Ln<E<1'=^#'8?=.)K@Us%^
+BPD3sD/O<4F*)SLH$XjdIt30)L51VCN/is]PEhH$R[]k>Tq\?ZVl?\tY->1;['mKT]=bkn_Sa@4
+aN;WLcHjnde'ut#g"P3:h;@/Lj5]4_k32'olg4!*mdKW6nac5OoCW%T!VZ9dq#C0iqYg<jr;HTd
+rdk*=s*t~>
+JcC<$S,`-[rr)ior;6Njs7uZhs7\kRp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb)s84H0E:Jq!er_`Ykr)*>hqbcu^jAG_4r]0d8q`4[;s'#8$
+!*T;'s&]5$rE&o!!*T;)!*K/#r`B/%rE0&%!*K"tr`Jeqs&f8'rE'2(=BJX+r`K/)!aT,=ra,_7
+@:B.Es'l%>rFQ"@s(D:Drb;CIqJ5tEokjSBqeQ1Gs(VFFs(D@DrFH%@@q5LIs'Yn8ra5\3!+#S/
+s'#J,r`T8'!*B,"!``3!rDNbq;,R9gs%iYir([2bs%E5]r^m)[qFCKRr'g9Hq*XjB9gNrJH[C-f
+I=Hg"K7no3L5(J>M2[FTOHG`lQC"#/SY)RKUSauhX/rG,Z*UgG\@T>d^qdk+`lcKLcdC1if\>3:
+gY(B=iofXto_SRcs8W#srdk*#s5!\^jI(!u?sm8C=^521=9DW-='5E%"BSW*=&o6!#ZF]$;cH^p
+<)NWns&',!:/Xqd:JXe_r_WGgohbTTr^HiVr^ZuZ!(m/^InNI09hnJ\:f1+h;cHat='/U/>[1TB
+?t!MTAS,UiC27[(E,fr@G'A4XI!pKpK7nu7M2I7PO-,WkQC+,1SXuOLUnsugWiWA-Z*UgG\@K5a
+^;.V'`Q$!@bKS8XdF-Lnf%8U/gYL]Ci8N_VjQ>Ugl07O#m-X60n*ol<ncA@Srq-<cp\jmeq>^<i
+qu6NlrUg)?s-s%=~>
+JcC<$S,`-[rr)ior;6Njs7uZh7JHNLp%@tKoCDJBnF,i5m-O''l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb*@HAJSsV7s\C]`GdXrjr$<rODd7!4`$;s0hs8s0Md4l*C2m
+qR#sSp5Jp-rS%,$"kqY`g=b0XfE9aVe^aZK!7Uqq!7:_krm(Pgs31AbpWN]`cHc:2rlk,]q98kD
+!F9%2?iOL6@K'a9A,g*=AcHBBBDlNDC&_rFC]8/JD=DHAD>e;KC]A/LC&M`FBE)TCAcH9@A,]s;
+@/s^7?iOF4?2e+/>6%k+=oVS(=8c/$<E)rs;u]bq;>j>k:]F2g:&[id9D_?]8c;3V8,YpT7J9.E
+6hWhH6%T&es+UJ(rV66aq"OIPlfdKmjl>C[hqd,CgXk$+e'care'c[jcHF>M`PKC*]tCte\Gio;
+\@M%;qaCHQs$luXs%!,]r^m2a9`@b6:/=\_;H$Ln<E<1'=^#$7?!grI@Uit]BP;-rD/O<4F*)SL
+H$XjdIt3-'L51VCN/is]P*M?#R@Bb=TVA6YVl?\tXg#(:['mKT]=bkm_8F73aN;WLcHjkbe'ut#
+f\5*8h;@/LioB+^k32'olKmm)mdKW6nac8Bo`"Lbp@n=\q#C0iqYg<jr;HTdrdk*=s*t~>
+JcC<$S,`-[rr)ior;6Njs7uZh6hg<Jp%@tKoCDJBnF,i5m-O''l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb*5AT30MK)C`2OSt7;NqeV6N9,ueN;mYnCADZED#.uKDZ">O
+T_>&^TV8'PT_"cVSt,VGs-iqVrg`tWns]3?s.&nSs',S1?N+=3?iXX7@fKs<AH$0?B)cNBB`DfH
+CAVfGD#A/>DZ+GND#A)KCB&#HB`D`FB)ZBAA,p-=@fKj:@/aO5?3":1>lS".>5h\)=9)G$<WZ9#
+<;ohr;ZBVm;#a>k:Amod9`Ic_9)hK]8GYjT7f5^K7/0.C63'=Mg]QBiiSsjs&`i'9kNV9tmI'K6
+o(;YMq>1&@s+13Irt+bLahtm']!o)T['?^5WiE#sW>_Y1V50fXT:_^GS=Q4=S=,b3QBd\uOcYW`
+NW+h8MZScoM>E&%M>K^@7K5jV8,l*[8cD<_92,=ZHqmI6:f:4j<)lt#=BSg3>[:]D@:E_XAnYjm
+CMds.EH?5FGBnL^I=Hd!K8,/<MN!RVOckuqR$jG7StMgRV5L;mXKA_3Za@0N\\#Mg^VRh,`lQ9F
+bg+P]dF6Urf@\g3gtglGiSrnYk2tmll0@X%mI'H3nF?)?oCW%T!quB_rqQNhs8)]krqu`no_sFA
+S,\!~>
+JcC<$S,`-[rr)ior;6Njs7uZh6hg<Jp%@tKoCDJBnF,i5m-O''l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb)t84Q6F:Ae#i;>X2h;>=&d;>!cH;?&TM3;tr63rD#:=o__%
+=9M]-=BAT'<rQ1u=9)M'=o_\!=8l>$=oMP"=8l=o=n5\p>QJ,:ra5\5!+Gk9s'u(>ral+As(D:D
+s(VLJqeQ1Ir,(q@rGDLLr+l=Is(VFFs(D@Dral+?!+Z";s'Yn8ra5\3!+#S/s'#J,r`T8'!*B,"
+!``3!r_rhps&&_ks%iYirD!8bs%E5]s%3/[qFCKRr'g<Ipd=aA90miKH@($gJV&K+KS>,7LP^nH
+NK0*_P*M?"R@9Y;TV8*VW2co"Y->4<['dES]=ktp_o0R:bKS8YdaQe#gtplAgtglLlL4B?rqufq
+rdk*#s5!\id>`'S?X6l?>$>-5=&rF(='/L*<`]3$!*/nq##\B!<)Q[nr_j)#;c$4c;,C(brD3Jl
+nkoB_qaCHQs$luXs%!,]r^m2a9`@b6:/=\_;H$Ln<E<1'=^#$7?!grI@Uit]BP;-rD/O<4F*)SL
+H$XjdIt3-'L51VCN/is]P*M?#R@Bb=TVA6YVl?\tXg#(:['mKT]=bkm_8F73aN;WLcHjkbe'ut#
+f\5*8h;@/LioB+^k32'olKmm)mdKW6nac8Bo`"Lbp@n=\q#C0iqYg<jr;HTdrdk*=s*t~>
+JcC<$S,`-[rr)ior;6Njs7uZh9DA/Rp%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCqd[^EHHYcb'>GDE,jVnTmY]Y(kg])0&7\,a#9\Gio>[C!<IZgG'oZhUp"
+MtW,/MuME/gAfh.f\+p0rRh8+g"HAW"P;5Ue^aZK"OkfIdEqj<s3CYhrQP5bpWW<T!6kGe"3f$7
+bl5lebQ,icbl:rK?N+:5?t!LC@KL%MAH$0?B)cNCB`DfHCA_lHD#S;HDY7rCDZ4MQD#A)KC&huH
+B`D]FB)ZBAA,p-=@fKj:@/aO5?3":1>lS".>5h\)=9)G%<rZ2"<;ohr;ZBVm;#a>k:Amoe9`@]_
+9)_E]8GPdS7f>dK7/94C63'<&s+13*s"+'@qY9gYoC(r+k2YL]io&_LgtUK5e^W'rdFH[ndEp4_
+aiMH;_8!Xq]=>BM[K<tL\*pj(7/o^U7fGpX8,u6\8q0K-9MJ5V:Jakb;c?Xq<``C+>$G6;?XI5N
+@qB7bBPM="DJsN8FEMePH@('iJ:`E-L5CeHNK93bPa.W(S"6.DTqnN_W2cr$YHbF@[^WfZ]Y;.s
+_SjF6aND]NcHstfeCN7(g=tE=hVdAPj5f@bkNV6rlg4$,n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6i
+r;QZerdk*=s*t~>
+JcC<$S,`-[rr)ior;6Njs7uZh6hg<Jp%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCqd[^EHHYcb'2AT**KK`7,6OSb+<NqSJ4N9H2eN;RGdC]8/LD#eJMD>p4%
+U&UbeTqJ(MT)kORq4%>O!1WtXrL<DIrgNnXqO7JRr0m\TrgWpn!+,Y3!aoGFraGq=A7Y[Ns(;:D
+rb2=Gs(_IIrbVRNphobCphp(Js(qUKs(VOJrFl4D!+u4As'u+>raPn9!+>e5s'>\2r`oJ-!*]A)
+s&]8&r`9&!s&Atrs&/korD<Mis%`Mes%NDbr(?r[r^ciTrC6`SogJUCog/jKg=b9=i8O[p''&*9
+kNV9tm-X92nalJJq"ajeJcC<$VuI7jcc*]4\%/rT['Hm:WiH#s)lKR0VPTu[StDUFS=Z7>S!ob4
+QBd\uOcYW_NW+h8MZScoM>E&%M>K^@7K5jV8,l*[8cD>392&#R9hnJ\:f1.i<)lt#=BSg3>[:]D
+@:E_XAnPdlCMds-EH6/DGBeF\I=Hd!K8#&:MN!OUOckroR$jG7StMdQV5L8lXKA\2Za@0M\\#Mg
+^VRe*`Q-'BbK\>ZdF6Urf@\g3gtgiFiSrnYk2tjkl0@U$mI'H3nF?)?!V>s_o`Fj]p\ssfq>^<h
+qu6NmrUg)?s-s%=~>
+JcC<$S,`-[rr)ior;6Njs7uZh6hg<Jp%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCqd[^EHHYcb&r7nH?I:B"/k;>X2f;>*oa;>O,K;$&X72to<23Vb`83Vut[
+=o)8#<ruK*=8c2"=8Z/#=oMS)=Sl/"<r?#!=T2J&=Sc+u=S>nq=9)G#=9)G%=T;Y,?N+:5?t!LC
+@KL%MAH$0?B)cNCB`DfHCA_lHD#S;HDY7rCDZ4MQD#A)KC&huHB`D]FB)ZBAA,p-=@fKj:@/aO5
+?3":1>lS".>5h\)=9)G%<rZ2"<;ohr;ZBVm;#a>k:Amoe9`@]_9)_E]8GPdS7f>dK7/94C63]`$
+H$b!kJc:6dK8#&9M2I4MNfT9bPEqN%R@Bb>Tq\?ZVlHf#Yd1XD\%&r[]tV;!`Q$!AbKeJ_e(*+)
+gtpi@h;@2RlgslJrr2p#rqu`mrIP!"s5*c2]Rjp.?<gZ:>$>$3=B/C'=]\X+=&r@'=&`-t<)Zaq
+;c-Il;H$Im;c?Rm:ejh`:Jajd;".?];#<Z\7K5jV8,l*[8cD>392&#R9hnJ\:f1.i<)lt#=BSg3
+>[:]D@:E_XAnPdlCMds-EH6/DGBeF\I=Hd!K8#&:MN!OUOckroR$jG7StMdQV5L8lXKA\2Za@0M
+\\#Mg^VRe*`Q-'BbK\>ZdF6Urf@\g3gtgiFiSrnYk2tjkl0@U$mI'H3nF?)?!V>s_o`Fj]p\ssf
+q>^<hqu6NmrUg)?s-s%=~>
+JcC<$S,`0\rVc`nr;6Njs7uZh#5@ibp%@tKrpi,?n*f]3m-O'&l0.9ljQ#7Yi8<AGg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcb'=FGQ]`Wk&,Bs1JBCqRQ@1rjMp:[JmN5Zgk?pZhCd*Mu8J.
+Mt`21ecFCTrn7>*s4RA'qUtl#"P;5Ue^aZK"OkfIdF%j;s3:JcrltAb!6tJdn]h'Ws3:Gb!F9%2
+?NFPCraPn;!+c(?s(;:Drb2=Gs(_LJs(q[Oqel@Nmr85DqelFNs(qXLs(_RJrb2=E!+u4As'u+>
+raPn9!+>e5!a]/<r`fM/>$Co.!a&N*r`9&!!*&nq!`DlmrD<Mis%`Jds%NDbr(?r[r^clUrC6]R
+ogJUCog/XEJcC<$M>o@,p\=IUp$_81k2k[aio/eNgtUQ8f@A@!da6Ikda?@dbK@oG_83mu]Xt\`
+\$i`T\[V%;qaCHQs$lrWIRm%%8kM`L9MJ5V:Jakb;H$Op<`W=*>$G6;?=.,M@qB4aBPM=!DJsN8
+FEMePH@('hJ:`E-L5:_GNK90aPa.T'S"-(CTqeH^W2cr$YHY@?[^WfY]Y;.s_SjF6aND]NcHstf
+eCE1'g=k?<hVdAPj5f=akNV6rlg4$,s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*=s*t~>
+JcC<$S,`0\rVc`nr;6Njs7uZh#5@ibp%@tKrpi,?n*f]3m-O'&l0.9ljQ#7Yi8<AGg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcb'2@rHdEKoc4pq2YN9pPo33m#1%cs(hLHq.ftHphg#&rLinY
+r1NYR!M5kXS,A]VS"-#GS,/TRS,SlUS,SrNRf]$a?N+:4?t'%Ds'l%>ral+As(D=Es(VLJrG2FL
+rb_OMrGV.DrGVRNs)%dPrG2FJs(VIGs(;=Dral+?!+Z";s'Yn8ra,_5?![G7!aAi3r`K;)=',B%
+s&B%urDNbq;,R9gs%iYir([2br_*/]r^m)[qFCKRr'g9Hq*XgA!^YMsrSS@Jj5oFdkiqC!mI0Q7
+oCVbNq>:,As+13JrtFA9`PT6s\$`WNYcXt+WMlepWM]Zk(Sm^tSXuFDS=H(;S!ob4Q^*buOcYW`
+NrFq9MZScoM>E&%M>K^@7K5jU7t+!#8P2TJ92&&S:/=\_;,U=l<E<.&=^#$7?!^lH@Uit\B4u$q
+Ci402EccGJG^=^bIXm$&KnbD@N/`m[P*D5uR@B_<TV8-WVl6VsXfnt8['mHS]"Gbl_8=.0a2lEH
+c-F\`e'uq"f\5'7h;7)KioB+]k3)!nlKdg(mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFA
+S,\!~>
+JcC<$S,`0\rVc`nr;6Njs7uZh#5@ibp%@tKrpi,?n*f]3m-O'&l0.9ljQ#7Yi8<AGg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcb&r7Rp'D:f.-gr)!2dohtW`s%qTMrAO[7s#C$=q`+R8qE"LW
+"'Jf2=o)7u=8c2"=8Z2"=TM]/qcEeur)Wr%=]t`+qH*Yuq-!5i!F9%2?NFPCraPn;!+c(?s(;:D
+rb2=Gs(_LJs(q[Oqel@Nmr85DqelFNs(qXLs(_RJrb2=E!+u4As'u+>raPn9!+>e5!a]/<r`fM/
+>$Co.!a&N*r`9&!!*&nq!`DlmrD<Mis%`Jds%NDbr(?r[r^clUrC6]RogJUCog1f-H@CEqJ:W9(
+KnbA=MMmFQO-#KfPa7Z(R[ftATq\?[VlHi$Yd1XF\@K5a]Y;.t`5]mAc-OeceCWC.h#?%>gu%)P
+lLXiMs8W)sqYL*erdk*#s5<nrqPSUN@:!2B>$5!3=BAO(='/O*<E<."<`N.!r_rhr&5l>&;c-Ik
+<)Z^n;c$4c:f%!cm8<aKs$crWrC;<-8P)NH91qrQ9hnJ\:f1+h<)lt"=BSg3>[:ZC@:E_XAS5[k
+CM[m,EH6/DGBeF\I=?]uK8#&9MN!OUOHPinQ^O>5StMdPV5L8lXKA\1Za@0M\[oGf^VRe*`Q-'B
+bK\>ZdF6Uqf@\g2gtgiFiSrnYjlYajl0@U$mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?
+s-s%=~>
+JcC<$S,`0\rVc`nr;6Nj!;ZTg!Vc<eogeZGo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZaiMK@_ns4(]Xt_a[^<BGYcY!;EJU3XWjKLS]tCth]"7^JqRHR7s0hp7rj27&os=A!"1>MC
+N;eb5MYi>+N;qH.ecOIUf_jG"f_aA$fE9aVf%'`K"OkfIdEqd:!RAsfbl5lbbl5lbbk00ZbQ>u4
+bPo]h?=.&I?t'%D!b5bOrac.CB4q3Ws(MIJrG2FLs)%[OrbqaSl>cfBrbq^Ps)%dPrbMOKs(VIG
+!bZ+Wrac=F@q/tW@:<RC?NOP>?2e(1>?Y50=TV],=8l5%<E)rr;Z]io;>j>k:]F2g:&[id9D_?\
+8cD9W8,YpT7J0(E6hNbG6%T&es,?t5rV66_p@RnBki_'hj5K"ThV6f=g"4g,e'l^jdF-LkcHj\V
+aN237^:V%i\@B#V[^`m9\GJ\o7K5jU7t+!#8P2TJ92&&S:/=\_;,U=l<E<.&=]ns6?!^lH@Uiq[
+B4u$qCi402EccGJG^=^bIXm$&KnbD?N/`m[P*D5uR@B_<TV8-VVl6VrXfnt7['mHS]"Gbl_8=.0
+a2lEHc-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg(mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrquco
+o_sFAS,\!~>
+JcC<$S,`0\rVc`nr;6Nj!;ZTg!Vc<eofr*?o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZaiMK@_ns4(]Xt_a[^<BGYcY!0@W-UCKoQ%mrK$l:qi1Q5mu-:d"-&7uD#S5JCAVfFD#8)I
+TDP;WU&:STT)kOSq4%;Ns-j"Yq4%;NrL3eUrgWnWr0n(_S!oh8RU0?.?smFB@KL%MAH$-AAnPcU
+B`DcHCAhrJD#\AMDZ4SQE9_HBE;jeRDZ=SRD#S5MCB&#IBEDgYB)Z?HA7K+Y@UW\Qra,_5?![G7
+!aAi3r`K;)=',B%!``3!rDNbq;,R9gs%iYirD!8bs%E5]r^m)[qFCKRr'g9Hq*XgA)*ua(gtpuK
+jQ5Ofl0@U$mdK]:o_/%SqY^;Cs+13Krt=#-_S3Rm[C!9FY,nY&WMleoVZ*CrUnaTUSXuDNSH#&d
+R[KP0Q'7DpNfT3\reg`6!fDnnqM=j%qaCHQs$lrWIRm%%8kM`L9MJ5V:Jakb;H$Op<`W=*=^,-:
+?=.,M@q9.`BPM=!DJsN8FEMePH@('hJ:`E-L5:\FNK90aPa.T'S"-(CTqeE]W2co#YHY=>[^WfY
+]Y;.s_SjF6aND]NcHstfeCE1'g=k?<hVd>Oj5f=akNM0qlg4$,s6g-\nac8Bo`"Lbp@n=\q#C0i
+qY^6ir;QZerdk*=s*t~>
+JcC<$S,`0\rVc`nr;6Nj!;ZTg!Vc<eofr*?o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZaiMK@_ns4(]Xt_a[^<BGYcXup7Rp*E:Jh!erD<8doMYB[!)V]QrAOj;2`E]Up,W%3!*K5'
+rEB/&qH3YsrDrkur`K)$qcE_sr`B,%!*T;'qH*Yur)r_q!`rK*r`B>1?XI2K@K'^;@q9-LAHHIV
+BDuTEB`MoHC]A5ND>\;NDuFY?EW0qVDu=MQD?"GOC]A/LC&VcIB4bcTAHuaU@q&nU@:9(A!a]/<
+r`fM/>$Co.!a&N*r`0)#<)ifp!`DlmrD<Mis%`Mer_3>bqb$iZr^clUrC6]RogJUCog1`+H$b!i
+JV/Z2LPUhFMi<[WOckrpQ^F52S=cLLUSXleX/rM/ZaRBS]"G_j^VRh+aNMfQd*^:kf@\gVgCW)o
+hW*hfpA=mirquTcq"jl=s+14.rtOO^EarH]>Zt95>$+j-<`N:'<*!#t<Z"h9<)Z^p;c6Ii;c?Ij
+;H-On;H$Cf:Jajb:]XEkmnrsMs$crWrC;<-8P)NH91qrQ9hnJ\:f1+h<)lt"=BSd2>[:ZC@:E_W
+AS5[kCM[m,EH6/DGBeF\I=?]uK8#&9M2[FTOHPinQ^O>5StMdPUo1/kX0&S0ZF%'L\[oGf^VRe*
+`Q-'BbK\>ZdF6Uqf@\g2gtgiFi8WeXjlYail0@U$mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6Nm
+rUg)?s-s%=~>
+JcC<$S,`0\rVc`nr;6Nj!;ZTg!Vc<eog\TFo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYH=n+E/:$UW3O+N]tCtg](NW4\-BFN[^ENM[/RE*ZM1]oZiH$`
+N;nh5MYrD.N;qE-ec+/"f_sM"f_aA$fE9aVf%'`Ks3h(udEp8<cN2>9qoo&arQP;dqon]WqTStH
+s'Ph8raGn<AH$0?AcQKCB`DcHCAhrJC]J>MDZ=YSE;FSLEWC1UEr'eTE;skTDZ=SRD#S5MC&huI
+B`D]FB)Z?HA7K+Y@UW\Qra,_5?![G7!F&b,=oVS(=8c/$<E)rs;u]bq;>j>k:]F2g:&[id9D_?\
+8cD9W8,YpT7J0(E6hNbG6%T&es,R+7r:g*]o^M;5kN:mdiSi_OgtUT;f[eX(daHLgd*^=icHaVU
+aN)38^V.:l\[],W\%'!:\,\no7/o^U7f>i+84cBF8kVfN9heAY:f("e;c?[s<`iL->?kH??XR>Q
+A7]CeBkqO&DfKf>Fa&(VH[U?nJV/W1Ll%%KO-#NgQ'[l,S=Z@HUSOccWiN8*Yd1UC\%0)_]t_A"
+`5Td<b0/&Td*^:ke^rI,g>(N@i8EVTjQ5OekiqBum-O0?mgJXTo()DEo_%nNp@nR]s7u]kr;6Kk
+rVcEgJcD5>J,~>
+JcC<$S,`0\rVc`nr;6Nj!;ZTg!Vc<eofr*?o()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYH=n+@W?^CKo>kjr/^f:r/LQ3s,6f6qMX<k!,MRMs(hLHr+l7I
+rGDS+r1EhYqP!h[o:H)USXfPGqjRPS!1`kSrL35FrgNjos'Ph8raGn<AH$0?AcQKCB`DcHCAhrJ
+C]J>MDZ=YSE;FSLEWC1UEr'eTE;skTDZ=SRD#S5MC&huIB`D]FB)Z?HA7K+Y@UW\Qra,_5?![G7
+!F&b,=oVS(=8c/$<E)rs;u]bq;>j>k:]F2g:&[id9D_?\8cD9W8,YpT7J0(E6hNb^6/12OiT0+_
+kNV9tm-X61o(2PJq"agbJcC<$WW+"1eB#J?\@T&QYck.0Wi;trW2HJfUnsl^Tq@mHS,JlVS,\ie
+Q^*buP)kZaNJi[OMi<OOMY`/&M#]p@7/o^U7f>i+84cBF8kVfN9heAY:f("e;c?[s<`iL->?kH?
+?XR>QA7]CeBkqO&DfKf>Fa&(VH[U?nJV/W1Ll%%KO-#NgQ'[l,S=Z@HUSOccWiN8*Yd1UC\%0)_
+]t_A"`5Td<b0/&Td*^:ke^rI,g>(N@i8EVTjQ5OekiqBum-O0?mgJXTo()DEo_%nNp@nR]s7u]k
+r;6KkrVcEgJcD5>J,~>
+JcC<$S,`0\rVc`nr;6Nj!;ZTg!Vc<eog&0@o()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYH=n+77KmA:Jasf;#jGg;>sJn;ts8b;>sDO;#iQS3<(o;2Z>W;
+3&s#\pc8@8s&oA(r`T5(r`T&!r)`htr)`o#r)j#%r)`esr`B,%"Bei/='#3"s&f;(mo]Tss'Ph8
+raGn<AH$0?AcQKCB`DcHCAhrJC]J>MDZ=YSE;FSLEWC1UEr'eTE;skTDZ=SRD#S5MC&huIB`D]F
+B)Z?HA7K+Y@UW\Qra,_5?![G7!F&b,=oVS(=8c/$<E)rs;u]bq;>j>k:]F2g:&[id9D_?\8cD9W
+8,YpT7J0(E6hNbG62lE<K8,,9L]3/tMi<[XP*;/sR$jG5StD^OUnsugXKJe5[^WcX]=kqo_8F43
+b0/&Ud*gCof\5*8gYCWBj65t*r;Q`qr;$*\q"jr?s+14/rrpf1De!*Yr`TD,=BJZ(<<-,"<WZ?'
+<W6&!<#&>0;c6Oj;,^@g;GpIl;c6Lj:JXe_r_N\o:f1-Z;#iu]7/o^U7f>i+84cBF8kVfN9heAY
+:f("e;c?[s<`iL->?kH??XR>QA7]CeBkqO&DfKf>Fa&(VH[U?nJV/W1Ll%%KO-#NgQ'[l,S=Z@H
+USOccWiN8*Yd1UC\%0)_]t_A"`5Td<b0/&Td*^:ke^rI,g>(N@i8EVTjQ5OekiqBum-O0?mgJXT
+o()DEo_%nNp@nR]s7u]kr;6KkrVcEgJcD5>J,~>
+JcC<$S,`0\rVc`nr;-Qlq>(!a!Vc<eog/6Ao()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=n+Dhs^NWNNtKrk&0@pUU=6s0r$:s0_d3rNlC,r3PRns,-l9
+rf$u<Mi7LjqhtE3!R]BqeGn(uf)OA#g%s@ug&BV+f@JO'rRChq!n,HBr6GDhc25`_c1fHSc2Poo
+bKO=$@:<VS@q0'KAHug[B4tsmBkmT^!c2^jrGMXRs)@jTrc7pXoQ:"PrGqgUs)A!VrGMXP!,VXM
+s(VOJrb2=E!+u4A#@q=S@U`bS@/aL<?<piA>[(E9r`T8'!*B/#s&K(ur_rhps&&_ks%iYirD!8b
+s%E8^r^m&ZqFCKRr'g<Ipd=aAs$;59JcCi3(Adq'naPu6kiCjcio/nRgtUT;g"4g*rmDY1cd:(g
+d*BnZb/hWA_S<dr]=PM][^WcWm^N6ar'^QRs$lrW!_>mSr^qW49MJ5V:Jakb;H$Lo<`W:)=^,-:
+?=.)L@Us%_BPD6uDJsK6F*)SLH$asgJ:W?+L5:\EN/s'`PEhK%R[ftATqeE\VlHf"Y->4<[C3WW
+]Y2(q_Sa@5aND]NcHjndeCE1&g"P6;hV[8Nj5f=akNM0qlg4!*n*fc9o()hP"n_K\p@e7[q#C0i
+qY^6ir;HTerdk*=s*t~>
+JcC<$S,`0\rVc`nr;-Qlq>(!a!Vc<eofr*?o()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=n+@;pI>Ko,biqiCZ8qi13+rJTZos,6klrbVRLr+c+ErG;M(
+!hGpSr1EeXqk<q\o:H,VSXl;JS,8ZSS,SrRS,\rKS,Jc]?XR;N@U`hWAH$-FAnPaiBPD0qrG)IN
+D/K5hs)7pVqf2UUr,_LPr,_gWr,MaUs)7jRs(qaPrbMOK!,;FGs(;=Drac=F@q/tW@:<RC?O'nC
+?!LW=>?_#/s&]8&r`9&!s&Atrs&/korD<Mis%`Mer_3>br(?r[rCHcTrC6]Rp-e[Cp-SdF(#e36
+jlYailKdd'mdTc<p%J1Uqtp;Bs+13Mru((I`kf6u[B[!?Y,eV'WMlbnV50raUSFNVrgs.[(nI.d
+S=5q7R$X)&P`h)gNf8pSM2R=MMi.@fp5/i;r'^QRs$lrW!_>mSr^qW49MJ5V:Jakb;H$Lo<`W:)
+=^,-:?=.)L@Us%_BPD6uDJsK6F*)SLH$asgJ:W?+L5:\EN/s'`PEhK%R[ftATqeE\VlHf"Y->4<
+[C3WW]Y2(q_Sa@5aND]NcHjndeCE1&g"P6;hV[8Nj5f=akNM0qlg4!*n*fc9o()hP"n_K\p@e7[
+q#C0iqY^6ir;HTerdk*=s*t~>
+JcC<$S,`0\rVc`nr;-Qlq>(!a!Vc<eofr*?o()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=n+7RfpA:/CO[r_iYmq,7#crD;HMr]'m;r]'p:!]W2#r]9m9
+r)s#$rE0,(r`K8(=8Q+t=8c1t<rcA!=TDS&=8Z+u=8uD%=TDP&<rH+g=:/,3?XR;N@U`hWAH$-F
+AnPaiBPD0qrG)IND/K5hs)7pVqf2UUr,_LPr,_gWr,MaUs)7jRs(qaPrbMOK!,;FGs(;=Drac=F
+@q/tW@:<RC?O'nC?!LW=>?_#/s&]8&r`9&!s&Atrs&/korD<Mis%`Mer_3>br(?r[rCHcTrC6]R
+p-e[Cp-SdF97qqPL5(J?MMd=NNKB9dQ'Rf)R[]e;TV8-WVl6YuYHbIC\@K5b]t_D$`5]m@bKeMa
+eCE1(g=tH?i8Ne^n+ZbZs8W&oq"FFWr.4m!s5Eth\qFa,>[1K9>$4s1<`E("<;oo=<E<1%<`E$s
+;H$Ll;c6Ll:f("e<)QUm;Gg4c:f%'e!`;ckmSX$Pr'^QRs$lrW!_>mSr^qW49MJ5V:Jakb;H$Lo
+<`W:)=^,-:?=.)L@Us%_BPD6uDJsK6F*)SLH$asgJ:W?+L5:\EN/s'`PEhK%R[ftATqeE\VlHf"
+Y->4<[C3WW]Y2(q_Sa@5aND]NcHjndeCE1&g"P6;hV[8Nj5f=akNM0qlg4!*n*fc9o()hP"n_K\
+p@e7[q#C0iqY^6ir;HTerdk*=s*t~>
+JcC<$S,`0\rVc`nrVQWks7uZhs7ZNerq/VMoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wc*]XT;f$-]Y+6Us18$:s1&';s0hj5!4;L,ijA`nr/1Q6
+rf-r:oSWgrcI(,>e,\%uf)O>%f`'S#f_aA$f`0P(f%'ZI"OkfHd*MU7m*,+Hs3(qqb[Fph@UiqZ
+AS#IcBDuQGBkhD^CBA<hD>nGQDuXeSEW:(YF7s_PFn^"WF8p:YE<:)tDuFPTD/=%fCBnTgBkV0m
+B4h-S#@q=S@U`bS@/aL6?=!P8s'#J,r`K;)=',B%s&B%urDW_o!)`\ks%iYir([2br_*/]r^m)[
+qFCKRr'g9Hq*XgAs$;59JcCo51\pt<n*fZ,kN1a_inrYLgY1?6f@JO&e'c[kc-XhdccsbYaiVTA
+_8![p]=PM][^N]V\*pg,6i9@O7K5jV8,l*[8cD>092&&S:/=\_;,U=k<*!%$=]np5>[CcF@U`kZ
+AnYmoCi+'/EH?5FGBnL^IXm!%KSG8=Mi<[XP*;/tR$sM9T:r!TVPgDoXfen6ZaI6O]"G_k^r"".
+`lQ9Fbg+P^daZguf@em4h;7&IiT&t[k3(smlKdg'mI'H4nc&(`oCV_Kp@e7Zp]C9fqY^6ir;HTe
+rdk*=s*t~>
+JcC<$S,`0\rVc`nrVQWks7uZhs7ZNerq/MJoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10WaKdhIY<RWOSk17Nr+h0N;\[qN;SV2C]&#BC]A2TR[]h;
+SXuGNTD5)WU&:STT*([USXfSHqjRPSrg`8CrL3aps'c4CA7T7_AnG]TBEDm_CAquMCi+%gDZ=YT
+E;X_UErL.RFS^.SFT-@]Er9nYE,T[nD?=ZkD#S2TC2%BqBP1sirac=F@q/tW@:<RC?NFJ=r`oJ-
+!*]A)!a&N*r`9&!!*&nqs&&horD<Mis%`Jds%NDbr(?r[r^clUrC6]RogJUCog8[Es5amVkiqBu
+m-X60nac>GpA"I[r;D3HJcDeN'B7<V^q%+_YHY11X/`.tWMl\kV#I.hTcKbsSt2C@S=?"<R[KP1
+QBm`!P)kZaN/`^OMi3INq2+g&!(6ZPr^HiVr^ZuZ!(m/^HqR.-9hnJ\:f1+h;cHdu='8[0>[1TB
+?t*SUAS,UiCM[j*E,fr@G'A4XI"$TsK7nu7M2R=QOHPfmQ^F52StD^NUo(&hX0&P/ZEpsI\@T>d
+^VI_(`Q$!@bKS8XdF-Opf%8U/gYL`Di8N_VjlYail0@U$m-X60nF?MK#4qK[p%J+RrV-HiqYL-e
+rqu`np&9OBS,\!~>
+JcC<$S,`0\rVc`nrVQWks7uZhs7ZNerq/MJoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10W^TBJ9287T;#jMl;ta,?;>W?N3W:u<3W(r:3<31Y=o;D!
+=TDS'=8c8!=8c1t<rcA!=TDS&=8Z+u=8uD%=TDS%<rZ7j=:J>6@:<VS@q9+]AS,Oerb)@IC23``
+!c2^jrbhaSs)@mUs)S*[p2p.RpN6CUs)S$W!cW'rrGD[RCi')d#ARseBP;$kB)Z?HA7K+Y@UW\Q
+ra,\4?2e+/>6%k+=TV],=8l8#<<-"s;u]_q;>j>k:]F2f:&dod9DhE]8cD9W8,YpT7J0(E6hNeG
+5tZicLPUeEMMmFQNffKhQC!u+R@B_=Tq\?[VlHl&ZF%'K\@T;d^VRe*`Q-*Dc-Oece^i@*gu%)N
+jlc""pA=des8Mrmq"X^_rdk*#s5O%cWHr2a?<pc<=BJ`*<=i22<)lt"<E3"!<E)pr;H$Nn;@u`(
+:f(%f;c?Rm;,L+b;,C(br_WVlmns-Qr'^NQs$luXs%!,]r^qQ29MJ5V:Jakb;H$Ln<`W:)=^#'8
+?=.)L@Us%^BPD6uD/O<4F*)SLH$XjeJ:W?+L51VDN/j!_PEhK%R[]n@Tq\?[Vl?`!Y->4<[C3TV
+]Y2(q_Sa@4aN;WLcHjndeCE.%g"P3:hV[8Mj5]7`kNM0qlg4!*mdKZ8rpg9bo_%nNp@nO\!r;]h
+r;6KkrVcEgJcD5>J,~>
+JcC<$S,`0\rVc`nrVQWks7uZhs7ZNerq/MJoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`59@*^:_%f\$iZLYck10Wc*ZTTW#-o]`5SD])&u;\Giu6[K<kD[/%&f[/IE4N;SS6
+N;eh9N;\\4N;h$'c-F\arR:htrmq,$!8.;(qUk\urn.8&!S5fte-".Hd*M[9rQXcSoZdE[%q/pV
+@q9+]AS,RfBP;*oCAquMCi+%gDZ=YTE;aeVErU4XFSp:PG5QL\FT-@]ErBtZE,T[oDZ=PRD#S2T
+C2%BqBP1sirac+@A,]pB@:3JM?X@&Er`fM/>$Co.!a&N*r`0)#<)iiqs&/korD<Mis%`Mer_3>b
+qb$iZr^clUrC6]RogJRBp-SdFJcC<$Q2`*-qYKXImHj#sjPo+UiSN>Cg"G$0f%&6tdEp+_d*g=e
+bKS-.a:6)(^V.7k]"#5X[^`lWn@8KcqaCHQs$luXs%!,]r^qQ29MJ5V:/=\`;H$Ln<E<1'=^#'8
+?=.)K@Us%^BPD3sD/O<4F*)SLH$XjdIt<6*L51VDN/is^PEhH$R[]k?Tq\?[Vl?\uY->1;[C3TU
+]Y2(q_Sa@4aN;WLcHjndeCE.%g"P3:hV[8Mj5]7`kNM0plg4!*mdKZ8rpg9bo_%nNp@nO\!r;]h
+r;6KkrVcEgJcD5>J,~>
+JcC<$S,`0\rVc`nrVQWks7uZhs7ZNerq/MJoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`59@*^:_%f\$iZLYck10WaKagIY<RVOT1C9Nq\P1N;\[qN;SV6MZ7MiC\qrHC]&#I
+RK]1NS=Q7Cr1EbWrh91]o:H,VSXl;HS,JfUS,SrCS,\of@:E\UA7T7_AnPaiBPD0qrbDROD/K8i
+s)7pVrGhjXs)\'Zr,qRRr,qpZrcA*[rG_mXDf>Vms(qaPrbDaRBk_6oB4kiUAH?=OraH+@?sm>K
+?=$q:>QS,5>5hY+=BAT'<WZ9#<;ohr;ZBVm;#a>k:Amod9`Ic_9)_E]8GYjT7f5^J7/0.C6N9=b
+kiqBtlg4$,n*oo>p%J.TqYU3iJcC<$XT&mcb/1m(\?E'=XfSS(WMlbnV>d7jUAgkdT)Y>]SG\ii
+R[BJ/Q'RVtP)kZaN/`^OMMm@Mq2+j's$QZOs$crWr^ZuZ!(m/^HqR.-9hnGZ:f1+h;cHat='/U/
+>[1TB?t!MTAS,UiC27[(E,fr@G'A4XI!pKqK7nu7M2R=QO-5]lQC+,1SY)UMUo(&hWi`G.Z*UjH
+\@K8c^VI_(`Q$!@bKS8XdF-Opf%8U/gYL`Di8N_VjlYail07O#m-X60nF?MK#4qK[p%J+RrV-Hi
+qYL-erqu`np&9OBS,\!~>
+JcC<$S,`0\rVc`nrVQWks7uZhs7ZNerq/MJoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`59@*^:_%f\$iZLYck10W^T?I8kr.T;?'Pn;ta,=;?&]S3;>N23rN1X=o;D!=TDS&
+=8l>"=8Z+t<rcA!=TDS&=8Z+u=8uD%=TMW+rDrr"n5p30@U`hXA7]=aB4kmkBk_>]CBA<hD>nGQ
+DuXeTEW:(ZF8L(WFn0_RFo6@\F8p:ZE<:)tDuOYSD#eDOCBnTgBkV0mB4h-S!G#^>@L$=L?sd8I
+?=!P8!aAi3r`K;)=',B%!``3!r_rhps&&_ks%iYirD!8bs%E5]r^m)[qFCKRr'g9Hpd=aAs$8l)
+M2I1KN/`gXOHPfmQC!u,R[ftBU84ZaWN<8-ZF.-N\\#Ph^r"%/a2uNKcHt"ge^iC,h;@5SlKn!2
+q"t!grWW5rqY9scJcC<$j8U(_RWN(G>[1H8=BSd-<E3(";cd""<E<+#<E)rs;\`2,;Gg=j;,L.f
+;H$Il;,L+b;,C(br_WVln5B9RqaCHQs$luXs%!,]r^qQ29MJ5V:/=\`;H$Ln<E<1'=^#'8?=.)K
+@Us%^BPD3sD/O<4F*)SLH$XjdIt<6*L51VDN/is^PEhH$R[]k?Tq\?[Vl?\uY->1;[C3TU]Y2(q
+_Sa@4aN;WLcHjndeCE.%g"P3:hV[8Mj5]7`kNM0plg4!*mdKZ8rpg9bo_%nNp@nO\!r;]hr;6Kk
+rVcEgJcD5>J,~>
+JcC<$SH&6\rr)ior;6Njs7uZhs7ZNerq/MJoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$iWKYcb+/WbmHPU8Y9o]E,XUqmla:rjV^3s0Vj6qQo4hqR-9\qhkH5
+r/LQ3s31Md"O,-9d*hpB#Lq;Sf%/I)f`'S#f_X;$f`0P(f%'WH"4PZEchu)fc0igJc2V5R@q>RM
+!G6!DBE;g^rbMOM!,_^Qs).mVrGhjXs)\*[rcS3`m!&DOrcS0]s)\3\rc.sWs)7mS!GuZPC]A,L
+C&VcHB4h-S!G#^>@L$=L?sd8I?=!P8!F&b,=oVS(=8c/$<E)rs;u]bq;>j>k:]F2g:&[id9D_?\
+8cD9W8,YpT7J0(E6hNeG6%T&es-NaBqt]jNmHj&ujQ#7Yhqm2EgY(62f%/@"da?Ccc-Xhbbfe5Q
+aN)?>_8![q]=PM]\$icV\+$p-6i0:O7K5jV8,l*[8cD<_92,=ZHqmI6:f:4j<)lt#=BSg3>[:]E
+@:E_XAnYjmCMds.EH?5FGBnL^I=Hd!KSG8=MN!RVOckuqR$sM8StVmSV5L;mXKJe4ZaI6O\\#Mh
+^r"".`lQ9Fbg+P^daQ^sf@em4h;-uHiT&t[k2tmll0I^&mI'H3nF?)?oCW%T!VZ9dp]C9fqY^6i
+r;HTerdk*=s*t~>
+JcC<$SH&6\rr)ior;6Njs7uZhs7ZNerq/MJoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$iWKYcb+/WaB[fIY<OUO8t@9NqA=gN;JP4M?&M3D#.rHD#\AKD#]t'
+R0K+LS=H.AT)>5KT_G)VT)Y>]SG8TQRfAlVSF`6KRf&ZT@KBtLrac+BBDuQFBkmW_s(h[PrbhaS
+!-%mVs)S-\r,hp\rc[XPrHA0_rH/'\s)S*Ys)A!Vrb_aRD#S5MC&huIBE;aXrac+@A,]pB@:3JM
+?X@&Er`fJ.>5h\)=9)G$<WZ9#<;ohr;ZBVm;#a>k:Amod9`Ic_9)_E]8GYjT7f5^J7/94C6N9=`
+l0I[%mI'H4nalGIp\=U^r;D3HJcDkP+SF7*^q7.aY-"h,XK&;!Vl$;dV50l\U7e-NSt)@@S=9GH
+rg==aQBdYtOcPQ`N/`^OM2R7Lq2+j's$QZOs$crWr^ZuZ!(m/^!D?,c9mf]3:f(%g;cHat='/U/
+>?kH@?t!MSAS,UhC27[(E,fr@G'A4XI!pKpJqSl6M2I7PO-,TjQC+,1SXuOLUnsugWiWA-Z*UjH
+\@K5a^VI_(`Q$!@bKS8XdF-Lnf%8U/gYL]Ci8N_VjlY^hl07O#m-X60n*ol<o(2MQo`=d\rV-Hi
+qYL-erqu`np&9OBS,\!~>
+JcC<$SH&6\rr)ior;6Njs7uZhs7ZNerq/MJoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$iWKYcb+/W^]KL8kr+T;=[W6;#jGk3WM2;3;tr53X&Yg='&L+qcWi!
+qcNo$qc<c"qcE_srDru$qH3f#r)`kurE'#$s&oA(!*B,"s&\bns'c"=AH$-@AnV*V!GQ<JC]A2N
+D>nGQDZFbTEW:(ZF8U.ZFoHRNGPu^aFo?F^F8p:[EW:"XDuOVTD/B2es(VOJrb)=FB)Z?BA7PUJ
+#@V"J?XI,G?2e(0>?_#/s&]8&rDiu"<)iiqs&/korD<Mis%`Mer_3>bqb$iZr^clUrC6]RogJUC
+og8[E7u<._N/`jYOHPfmQ'Rf*R[fq?TqeH^W2cu'Z*UjI\\#Mf^r"(0`lQ<Gc-OeceCN:*gYLfJ
+k3;4#oCr+ZrVlfpqtg0drIP!"s5a1ldZA?U?!CK7=BSa.;cct!;cN]rs&B&"rDN_p;u9Jm;#jGl
+;[u](;,C%a;,C(b:Jakb;=IK`6i0:O7K5jV8,l*[8cD<_92,=ZHqmI6:f:4j<)lt#=BSg3>[:]E
+@:E_XAnYjmCMds.EH?5FGBnL^I=Hd!KSG8=MN!RVOckuqR$sM8StVmSV5L;mXKJe4ZaI6O\\#Mh
+^r"".`lQ9Fbg+P^daQ^sf@em4h;-uHiT&t[k2tmll0I^&mI'H3nF?)?oCW%T!VZ9dp]C9fqY^6i
+r;HTerdk*=s*t~>
+JcC<$SH&6\rr)ior;6Njs7uZhs7](Xp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WGI3HV5LB,]XteeqRQO5qmQO4r3ZI0jL"fls0Vd5s,6T0
+r/LZ6qo],dc-F\armM,%e^`7%f@S[Qg&'G"g&BY(f)aIQqU>VrdEp59cMbudbOj$PblV?aAH$-@
+AnV*V!GQ<JCB86grbhaS!-%mV!ci@'rH/$]s*"6_ms+\Qs*"BarcJ0]s)S*Ys)7sVrb_sXCi!m&
+C2.J^BE;aXrac+@A,]p<@:9(A#@:\A>[1K;>5h\)=9)G%<rZ2"<;ohr;ZBVn;#a>j:Amoe9`@]_
+9)_E]8GPdS7f>dK7/0.B6N9?&s+13<rtYA/md9B+l/^pbiS`PLgtUT;f[n^)rmDM,c-FY^cHaVU
+bfRrH`P]O,^:ChcrjMs;\%1t;s$QZOs$crWr^ZuZ!(m/^InNI/9heAY:f("f;cHat='/U/>?kH@
+?X[DRAS,UhC27[(E,fr@G'A4XI!pKpJqJf5M2I7PO-,TjQC+)0SXuLKUnsugWiWA-Z*UgG\@K5a
+^;%P&`Q$!@bKS8XdF-Lnf%8U/gYL]Ci8N_VjQ>Ugl07O#m-X60n*ol<ncA@Srq-<cp\jmeq>^<i
+qu6NlrUp/@s-s%=~>
+JcC<$SH&6\rr)ior;6Njs7uZhs7\tUp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WEsC^J:`Q<OSk16NqSIlN;JP4MYr>-C\_fGD>e;NRf&QX
+R[]h;SXuGNTCJTKTD>)YSH,2RRfJoVS,]#LS,SlURf[&/AH$-@AnV*V!GQ<JCB86grbhaS!-%mV
+!ci@'rH/$]s*"6_ms+\Qs*"BarcJ0]s)S*Ys)7sVrb_sXCi!m&C2.J^BE;aXrac+@A,]p<@:9(A
+#@:\A>[1K;>5h\)=9)G%<rZ2"<;ohr;ZBVn;#a>j:Amoe9`@]_9)_E]8GPdS7f>dK7/0.B6N9=^
+lg4$,n*ol<o_%tRqYU0fJcC<$XoBC+cc3i5]rnK?XK/D%WMcYkUSXc^U8"?RSt2FBrgOLgS!oe6
+R$X,*Q'7AmO-#?[N;eY9Mi*FMqMFs(s$QZOs$crWr^ZuZ!(m/^InNI/9heAY:f("f;cHat='/U/
+>?kH@?X[DRAS,UhC27[(E,fr@G'A4XI!pKpJqJf5M2I7PO-,TjQC+)0SXuLKUnsugWiWA-Z*UgG
+\@K5a^;%P&`Q$!@bKS8XdF-Lnf%8U/gYL]Ci8N_VjQ>Ugl07O#m-X60n*ol<ncA@Srq-<cp\jme
+q>^<iqu6NlrUp/@s-s%=~>
+JcC<$SH&6\rr)ior;6Njs7uZhs7\nSp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WC9<I9MJ:V;=mc9;>sDl:]!3J3Vkc==^"s1r`9)%qcWi!
+qcO&(='&F'pK.>pr)`_t!*K)!"BJT+=BGB%!*B,"s&\hp!b,YMrac+BBDuQFBkmW_!GlWPDZ=VT
+E;abXEcZ=#FT-F_G5?FOGkuXaG5cX`FT6F^ErL(YDuahUD?k#pChmg$C2*Z\!G?$DAH?=OraGn:
+@/aL<?<piA>[(E9r`T8'!*B/#s&K(ur_rhps&&bls%iVhrD!;cr_*/]r^m)[q+(BQrC-BIpd=^@
+s$?[D5`LebOHG]jQBml+S"#q>TVJ<[W2co%Z*UjI\@T;c^V[q.`Q-*Dbg+S`e(3.(gYC]GjQGdn
+mdg)Jqu-Nnr;?Qk!<.QLJcFj3+2!8@@U32B='8[-=B/C&<)cds<`N1"<E2ss;H$Il;>sGt;c6Cg
+:Jt-j;?]oo:esqbr_NPj!)`2_s$QZOs$crWr^ZuZ!(m/^InNI/9heAY:f("f;cHat='/U/>?kH@
+?X[DRAS,UhC27[(E,fr@G'A4XI!pKpJqJf5M2I7PO-,TjQC+)0SXuLKUnsugWiWA-Z*UgG\@K5a
+^;%P&`Q$!@bKS8XdF-Lnf%8U/gYL]Ci8N_VjQ>Ugl07O#m-X60n*ol<ncA@Srq-<cp\jmeq>^<i
+qu6NlrUp/@s-s%=~>
+JcC<$SH&6\rr)ior;6Njs7uZh8,)`Np%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb+.WG@'DVPgB)]DfD>\c0,:\,Ni7[JR?2[H=jo[JdK2[Jc$Z
+N;8G5N;1R,bg"G[dF-LmeCE+#f%8O+qq:o"s4R8$"4u,Sebdhue'ZOgqTf,cr6+`Vprs@[A7]=a
+AnPdjBkhBuCM[g(rb_aTE;jkWErU4[FT6L_G5QR`Gl;pZHMi'fGl2dcG5l^aFT6F^ErL%ZE,Y_n
+s(qpUCMR["C&VcHB4h-S!G#^>@KBnFra,n:?!U]?>?b;1=TV],=8l8#<<-"s;u]_q;>j>k:]F2f
+:&dod9DhE]8cD9W8,YpT7J0(E6hNeF6%T&es-s$+qY9LFlfmTnj5T"Thqm,Ag"G$0f$i'rd*M^:
+&C8YGbK@rJa2l6;_8!^q]".gLs0_p<n$rBbqaCHQs$lrWIRm%%8kM`M9MJ5V:Jakb;H$Op<``C+
+>$G6;?XI5N@qB7bBPM="DJsN8FEMePH@1-jJ:`E-LP^nINK93bPa7])S"6.DTqnN_WN*&%Yd(OA
+[^`l[]Y;.s_SsO9aihoRcHstfeCN7(g=tE=hr*JQj5f@bkNV6rm-O--s6g-\nac8Bo`"Lbp@n=\
+q#C0iqY^6ir;QZerdk*>s*t~>
+JcC<$SH&6\rr)ior;6Njs7uZh7JHNLp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb+.WEsC]ItECPO7\J.NT,ooMuS\3M>rJ-C\_fHD#nIApmM/O
+s-s.]St>kPoq;&Op7D8S!1`8Bs-ieR&t5;"A7]=aAnPdjBkhBuCM[g(rb_aTE;jkWErU4[FT6L_
+G5QR`Gl;pZHMi'fGl2dcG5l^aFT6F^ErL%ZE,Y_ns(qpUCMR["C&VcHB4h-S!G#^>@KBnFra,n:
+?!U]?>?b;1=TV],=8l8#<<-"s;u]_q;>j>k:]F2f:&dod9DhE]8cD9W8,YpT7J0(E6hNeF5n<;M
+n*ol<oC_hPq>1!drdk*#s/uAViQfBV]",#HYH+e*WMlenVPU)aUS4EST:VUDS=?":S!f_5R?s5)
+QBm_tOH5H_N/[am",i%pMY`2(MZ6'@7/o^U7f>i+84cBF8kViO9heAY:f("e;cHat='/U/>?kH@
+?X[DRAS,RgC27[(DfKf>Fa&(VI!pKpJqJc4M2I7OO-,TiQC+)0SXuLJUnsugWiW>,Z*UgG\@K5a
+^;%M$`Q$!@bKS8Wd*^=lf%8R.gYCWBi8N\UjQ>Ufl07L"m-X6@mfi4No()DErq-?dp\4[^s7u]k
+r;6Kkrr)KgJcD8?J,~>
+JcC<$SH&6\rr)ior;6Njs7uZh7JHNLp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb+.WC9<I92/1\;Z'Da;UnYD;#F,b3qkZ63r<%[=T2A%=Sl8!
+=Sl5&=BAT'<q]Sp<r?%q=TDS"=8,hr=8u;$=7oZ,@q9.^AnG[hBPD3rCMRa&D>nDRDfG\qs)S-\
+rcJ0_rc\3`rcnBeo6U=[rcn?bs*"EbrcJ0]s)S*Y!H;uVDZ=PWChmg$C2*Z\!G?$DAH?=OraGn:
+@/aL<?<piA>[(E9r`K;)=',B%s&B%urDW_o!)`\ks%iYir([2br_*/]r^m)[qFCKRr'g9Hq*XgA
+r]ru4NfT9aP*;/tR$jD4S=ZCIUSXidWiWD/ZaI<R]=kqo_SjF6aihlQd*gCof\5-:hVdGUkNVC&
+o(MnTrVulsrVQHirdk*#s5s=gWHi,a>?k?6=]ef)<XMi+<``:%<)lpt<;ohq;@uc(;c6Ih:f1+h
+<)QUk:f'qbrD3Gi!)`2_s$QZOs$crWrC;<-8P)NH92&#R9hnJ\:f1+h<)lt#=BSg3>[:]D@:E_X
+AnPdlCMds-EH6/DGBeF]I=Hd!K8#);MN!OUOckrpR$jG7StMdQV5L;mXKA_3Za@0N\\#Mg^VRe+
+`lQ9Fbg+M\dF6Urf@\g3gtglGiSrnYk2tjkl0@X%mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6Nm
+rUg)?s.'+>~>
+JcC<$SH&6\rr)ior;6Njs7uZh7JHNLp%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WG@$DW2?Kl]DB&<\G<T6[e[<2[/@?'ZiIN0[/79.[/IE/
+Mtr>3NW"h9b5TT`b5TQpbg"G[dF-IleCE+#f@\^-q:YJos478%rmgqr"4PZEchbreblGudbP'0T
+bm@olAS,RfBP;*prbDOND>nDSDfB[pE<:0%F8g:]FoQX`GQ2peH2)^\Hh_pdH2i-fGQ2jdFoHL_
+Er^7[E>rk8Df0H0D/=!'C2.HrBP1siAS#C_@q&nU@:9(A!FB(2>QS,5>5hY+=BAT'<WZ9#<;ohr
+;ZBVm;#a>k:Amod9`Ic_9)_E]8GYjT7f5^J7/94C6N09%s+13As"=3HoBkr1jlGL_iS`SLgtUT;
+f[na+daHOgccs\[cHXMSbK.`D`Pf^2^:h+f\c0)<[K*l,\Gnqn7/o^U7f>i+84cBF8kViO9heAY
+:f("e;cHat='/U/>?kH@?X[DRAS#LfC27[(DfKf>Fa&(VH[UBoJqJc3M2I7OO-,TiQ'du/SXuLJ
+UnsufWiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=lf%8R.gYCWBi8N\UjQ>Ufl07L!m-X6@mfi4N
+o()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD8?J,~>
+JcC<$SH&6\rr)ior;6Njs7uZh7JHNLp%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WEj:]J:N=NO7SD0NTlB%NVe\4MuJV1M>iD*C\V`?R0]1J
+S"-%>SXuGNTD>/OTD"lUSH,2GS,SlORgEV:AS,RfBP;*prbDOND>nDSDfB[pE<:0%F8g:]FoQX`
+GQ2peH2)^\Hh_pdH2i-fGQ2jdFoHL_Er^7[E>rk8Df0H0D/=!'C2.HrBP1siAS#C_@q&nU@:9(A
+!FB(2>QS,5>5hY+=BAT'<WZ9#<;ohr;ZBVm;#a>k:Amod9`Ic_9)_E]8GYjT7f5^J7/94C6N07Z
+n*ol<oC_hOq"jmcrdk*#s/uA*fuqCJ\[2:<"feZ(WMcZnV>m=tUS=HRT:VUDR[j>F&"/fPQ^=#'
+PEV,jNfK*XMuJP8Mi*FMqMFs(s$QZOs$crWrC;<-8P)NH92&#R9hnJ\:f1+h<)lt#=BSg3>[:]D
+@:E_XAS5[kCMds-EH6/DGBeF\I=Hd!K8#&:MN!OUOckroR$jG7StMdQV5L8lXKA\2Za@0M\\#Mg
+^VRe*`Q-'BbK\>ZdF6Urf@\g3gtglGiSrnYk2tjkl0@U$mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<h
+qu6NmrUg)?s.'+>~>
+JcC<$SH&6\rr)ior;6Njs7uZh7JHNLp%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WC09J9MA1Y;Z9Pe;UnYD;#3ud48M#53<D6D=Su>%=T2A%
+=Sl8!=Sl5&=BAT%<q9>g=TDS"=8,ho=8,f'A7]=aB4kmkBkmW_!GlWPD?=`qE;jhYEcZ=$FT6L`
+G5ZXbGlE!`HMDj^HN&3iGl;jdG5l^aFT6C^ErL%tE,TZ4DJa6,CMR["BkV0mB4b^dA7T1Z@UW\Q
+ra,\4?2e(1>?Y50=TV],=8l5%<E)rs;u]bq;>j>k:]F2g:&[id9D_?\8cD9W8,YpT7J0(E6hNeF
+5sp]pOckonQC+)/S"-%BTq\?ZVlHi#YHkOE\\#Je^qmq-`lQ?IcHt"fe^rL/h;@/MjQ>[lmdK`?
+q>:-hrr2loqu20HJcFp5#3hV"A7/SEr`T8&*`c?C<E)mt<`N1!<EE.!;GpFm;Gg:h;c6Fi;,^Ck
+rDESks&&_js%i\mmo'0QqaCHQs$lrWIRm%%8kM`M9MJ5V:Jakb;H$Op<``C+>$G6;?XI5N@qB4a
+BPM="DJsN8FEMePH@('iJ:`E-L5CeHNK93bPa.W(S"6.DTqnN_W2cr$YHbF@[^WfZ]Y;.s_SjF6
+aND]NcHstfeCN7(g=tE=hr*JQj5f@bkNV6rlg4$,s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZe
+rdk*>s*t~>
+JcC<$SH&6\rr)ior;6Njs7uZh7ecWMp%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCnc[^EHHYcb(-WG6m@WMZW,rOVs<s1%s8qmQ:-pU'k+q6^(-q6^(-!0$`3
+!0$i8s,?r:!6b&X%Elu?cHstedaQ^re^rFPf_jFofDsP&f)=.ue-"1Id*MR6s3:Pes3(,[qT]%O
+#%hL\BP;*prbD^SD/O60DfG\q!ci@'rcA3aG'<h.s*4Qhqg/3fnU1:^qg/9fs*4Nes*"EbrcBH-
+EcQ/>E,]`5DJa6,CMR["BkV0mB4b^dA7K+Y@UW\Q?XI,G?2e(6>?Y35=]ed-rDiu"<)iiqs&/ko
+rD<Mis%`Mes%NDbr(?r[rCHcTrC6]RogJUCog8XDJcC<$T`6P<rUB1@l/q'eio/eNh:p]<g=Y$-
+daHUkccsb\ccs\VaiMNBa2Q$7^qI>Y\c9,A[^W`V\+$p-6i0:O7K5jU7t+!#8P2TJ92&&S:/=\_
+;,U=l<E<.&=]ns6?!^lH@Uit\B4u$qCi402EccGJG^=^bIXm$&KnbD@N/`m[P*D5uR@B_<TV8-W
+Vl6VsXfnt8['mHS]"Gbl_8=.0a2lEHc-F\`e'uq"f\5'7h;7)KioB+]k3)!nlKdg(mf2_ZnF?)?
+oCW%T!quB_rqQNhs8)Zjrqucoo_sFASH"*~>
+JcC<$SH&6\rr)ior;6Njs7uZh7ecWMp%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCnc[^EHHYcb(-WEa4ZJUrK9r/^Q3qi0ZqqhtK3q2,$,!,V7Bs(haRCi&j6
+rKmYSS"0JKs.9.\rLiVOp7D8S!1`MIqO78Ms()CHB4kmkBkmW_#&J-oDJsH4rc&![F*%>&!d/[0
+rHJ9ds*=KfrHn'^rHnEfs*=WhrceBcs)n<_-$+*IEH,r:Df0H0D/=!'C2.HrBP1siAS#C^@q&nU
+@:3GL?=$q:>R+J:>$5!1=BGH%!``3!r_rhps&&_ks%iYirD!;cr_*/]r^m&ZqFCKRr'g9Hq*XgA
+r]pn]o(2MHp\=U^r;M9IJcDqR&,+Mn_n!@`Y-+n-X/W(rVZ!;9US=HTT:MLCS=5k7S"#k8R$X/*
+Q'IPrOcYT`NJi[OM2R=MMtr5(MZ6'@7/o^U7f>i+84cBF8kVfN9heAY:f("e;cHat<`iL->?kH?
+?X[DRAS#LfC27X'DfKf>Fa&(VH[U?nJqJc3Ll..NO-#NhQ'[o.S=ZCIUSXleWiW>+Yd:^F\%0)_
+^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8N\UjQ5Oel07L!m-X6@mfi4No()DErq-?dp\4[^s7u]k
+r;6Kkrr)KgJcD8?J,~>
+JcC<$SH&6\rr)ior;6Njs7uZh7JHNLp%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCnc[^EHHYcb(-WC06H92/.M;V"_E;"mc^48V);3W;)=>5DD%=T2A%=Sl8!
+=Sl5&=BAT%<q]Sp=T2Cu=TDS"=7o\q<rlE)q,mZ.#%hL\BP;*prbD^SD/O60DfG\q!ci@'rcA3a
+G'<h.s*4Qhqg/3fnU1:^qg/9fs*4Nes*"EbrcBH-EcQ/>E,]`5DJa6,CMR["BkV0mB4b^dA7K+Y
+@UW\Q?XI,G?2e(6>?Y35=]ed-rDiu"<)iiqs&/korD<Mis%`Mes%NDbr(?r[rCHcTrC6]RogJUC
+og8XD6BRFpPa7Z(R[]h<T:hpRV5L8kX0/_6\%0)^]tM4t_o9^>bK\A\e'ut$g>(QCiT'%_l0I^)
+nb2bTqu6WorVZWmJcC<$kl2@GNc&?5>$G*3=BAR(<`N*s;H?gurDX5);GpFk;G^4g<)c[j;>sGu
+;c-Fj:Jancr_Nbq:f1%d;=IK`6i0:O7K5jU7t+!#8P2TJ92&&S:/=\_;,U=l<E<.&=]ns6?!^lH
+@Uit\B4u$qCi402EccGJG^=^bIXm$&KnbD@N/`m[P*D5uR@B_<TV8-WVl6VsXfnt8['mHS]"Gbl
+_8=.0a2lEHc-F\`e'uq"f\5'7h;7)KioB+]k3)!nlKdg(mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zj
+rqucoo_sFASH"*~>
+JcC<$SH&6\rr)ior;6Njs7uZh#5@ibp%@tKrpi;DnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB_ns4(]t:hb[^EHHYcY",W+pX7WM-E*]=PTP\bru;\+d?/[J7-+[J@3-[J@3,[/mXm
+p5B!2qMbHtoZ@Tcbg"G[dF$FleCE+$rRh/'q:G]!q:G]!rRUturmV&!da6>=cMu2lcHXW5bl5f[
+bl#^$AS,RfBP;*pCMRa'D/O60E,]f:EcZ=$F96T.G5c^cGlN'fHN&9jI-Z4ZI/eQlHN/9jGlDpe
+FoZ[aFT6D!EcH)<E,TW3D/F*)CMITuBP;$jAn>OaA,]p<@:9(A#@:\A>[1K;>5h\)=9)G%<rZ/"
+<;fbq;?0Sm;#a>k:Adid9`@]_9)_E]8GPdS7f5^J7/94C6N09%s+13Es8VpNmd0<&jl>F]iSWPI
+gY1?6f@\X&daHLgc-+DXc-+8Oa2Z*;`5TR-]t1_a\@B#V[^is<\G\em7/o^U7f>i+84cBF8kVfN
+9heAY:f("e;c?[s<`iL->?kH??XR>QA7]CeBkqO&DfKf>Fa&(VH[U?nJV/Z2Ll%(MO-#NhQ'[l-
+S=ZCIUSOfdWiN8*Yd1XE\%0)_^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8EVTjQ5OekiqBum-X6@
+mgJXTo()DEo_%nNp\4[^s7u]kr;6KkrVcEgJcD8?J,~>
+JcC<$SH&6\rr)ior;6Njs7uZh#5@ibp%@tKrpi/@nF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB_ns4(]t:hb[^EHHYcY",W*F%UIXm1KO8k7>O8k77NTc?!MuJV0M>E,)D#%lGD#0P"
+R/NHOQj9%KS=Q4BT:YtQ!2/\Np7D;Ts.'%W!1`eQpR;#L(1h)jB4tsmC27U$D/F0.DfBZ8EH6,A
+rcA3aG'<k/s*4QhrHeHird=$[rI"WlrHeKhs*4Nes)nBbrcJ0](ijV9E,]`5DJa6,CMR["BkV0m
+AnGUcA7PUJ!F]C8?O'nC?!LW=>?_#/s&]8&r`9&!!*&nqs&&horD<Mis%`Jds%NDbr(?r[r^ciT
+rC6]RogJUCog8XD#kR]]p\=R]qu)*GJcDqR)=>hj^q7(ZXfe_*Wi)eoV5C&`UnaWVSt;MOS-GIO
+R@0M3R/WB[Q'7AoOH5H_N/NRNM>`A.M>2u,6i9@P7K5jU7t+!#8P2TJ92&&S:/=\_;,U=k<E<.&
+=]ns6?!^lG@Uiq[B4u!pCi402EccGJG^=^bIXm!%KnbD?N/`m[P*D5uR%'V;TV8-VVl6VrXfnt7
+['mHS]"Gbl_8=.0a2lEHc-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg(mf2_`nF?)?oCV\Jp%J.S
+rqQNhs8)Zjrqu`np&9OBSH"*~>
+JcC<$SH&6\rr)ior;6Njs7uZh#5@ibp%@tKrpi/@nF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB_ns4(]t:hb[^EHHYcY",W'j*E8kW"Z;Z0Jh;V"_E;"m`e:f0=P4T7G=3rM)8>5VP'
+=T2A%=T2J'=o__'=Sl5&=BAT%<q]Vo=92K*qcNo$rE'#$s&\Mg(1h)jB4tsmC27U$D/F0.DfBZ8
+EH6,ArcA3aG'<k/s*4QhrHeHird=$[rI"WlrHeKhs*4Nes)nBbrcJ0](ijV9E,]`5DJa6,CMR["
+BkV0mAnGUcA7PUJ!F]C8?O'nC?!LW=>?_#/s&]8&r`9&!!*&nqs&&horD<Mis%`Jds%NDbr(?r[
+r^ciTrC6]RogJUCog8XD6'IOuQ^F21S"-(CTq\?ZVl?`!Yd1[H\\#Gb]t_D%a2uNKcHt"ge^rL/
+h;@2OjQ>[lm-X95p%S=]rr<#trr)hIs+147s!GL8Bjk@Q>$+j.='&F(<E2ss<E3!u<)Zap;c6Ol
+;c6Ii;c?Ok;>sGp;,U<k:]OAk:]sWk:f1*Z;Z/u\7/o^U7f>i+84cBF8kVfN9heAY:f("e;c?[s
+<`iL->?kH??XR>QA7]CeBkqO&DfKf>Fa&(VH[U?nJV/Z2Ll%(MO-#NhQ'[l-S=ZCIUSOfdWiN8*
+Yd1XE\%0)_^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8EVTjQ5OekiqBum-X6@mgJXTo()DEo_%nN
+p\4[^s7u]kr;6KkrVcEgJcD8?J,~>
+JcC<$SH&9]rVc`nr;6Njs7uZh7JHNLp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]t:hb[^<BGYcY",W+gI5WM$?k])0&;\Gs&2[K*`1[/@?-[/79,[/@?1[/Q!Q
+N:=t"bKS5Vd*^7ieC<%!f@\dCfE'UTqpk\q"4P]Gd/D8hci;8hbl5f^bQ?&5bl5ifAnV*V"_h^e
+CM[keD?4Zprc%sZF8g7_F`qs-G63#7H2W'hHiJKiIJeQhJ,=]lIK+]pHi86lH$FT5G6`;6F`__H
+F)q8"%rcH)DJa6,CMR[!BkV0mB)Z?BA7PUJ!F]C8?NFJ=r`oJ-!*]A)!a&N*r`9&!!*&nq!`Dlm
+rD<Mis%`Jds%NDbr(?r[r^clUr'pWRogJRBp-S^DJcC<$V>iFNqt0:BlK.*fio/kQhV?l>g"P'.
+eC)gmd*L"^cHXPTaiMNB`l,j8^V.4h\@K,W\$rfU\F@!+6i9@P7K5jU8,l*[8cD>392&&S:/=\_
+;,U=k<E<.%=]ns6?!^lG@U`kZB4u!pCi402EccGJG^=^bIXm!%KnbD?MiEdZP*;/tR%'V;T:r$U
+VPpMqXfnt7ZaR?R]"G_k_8=.0a2lEHc-F\`daZh!f\,!6h;7)JioB+]k3(smlKdg(mdKW6nac8B
+s7H?as7QHerqQNhs8)Zjrqu`np&9OBSH"*~>
+JcC<$SH&9]rVc`nr;6Njs7uZh7JHNLp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]t:hb[^<BGYcY",W*<kPIX[%DO8k75NU2W%MuJV0M>2r.C\DTBC]8/JRJ`HN
+RJiKVR@B_;SY"o7p7D8S!1`_OpR2/QR[X5F!G6!DBE`*bCMRa'rb_aTE;jhXEc_5%!d/[0rc\Eg
+H$T@7s*OcnqL/9jpj`0iqgJKls*O]j!dT$8rc\TjF`heJF)uC$E=[#,DJj<.Chmg$Bk_6oB4h-S
+!G#^>@KBnFra,\4?2e+/>6%k+=TV],=8l8#<<-"s;Z]io;>j>k:]F2f:&dod9DhE]8cD9W8,PjT
+7J0(D6hWkF5mI#Up\F[_r.4m!s0)G4hos$O]!JQBXK&A%W2HNlV$s/pTq\3QT:MOBR[]fGRMM<Y
+R$X,(P`q8mOH,?\N/NRMM2[@MMXZK$6i9@P7K5jU8,l*[8cD>392&&S:/=\_;,U=k<E<.%=]ns6
+?!^lG@U`kZB4u!pCi402EccGJG^=^bIXm!%KnbD?MiEdZP*;/tR%'V;T:r$UVPpMqXfnt7ZaR?R
+]"G_k_8=.0a2lEHc-F\`daZh!f\,!6h;7)JioB+]k3(smlKdg(mdKW6nac8Bs7H?as7QHerqQNh
+s8)Zjrqu`np&9OBSH"*~>
+JcC<$SH&9]rVc`nr;6Njs7uZh7JHNLp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]t:hb[^<BGYcY",W('9I8P;nZ;Ys>g;V4kH;"d]`;?&ZW48V,?48Cr;3VQ_U
+=oVV'<rcA"=o;D!=TV],=8Z+m=8Z2#=o;D#=8l;%=7')jAnV*V"_h^eCM[keD?4Zprc%sZF8g7_
+F`qs-G63#7H2W'hHiJKiIJeQhJ,=]lIK+]pHi86lH$FT5G6`;6F`__HF)q8"%rcH)DJa6,CMR[!
+BkV0mB)Z?BA7PUJ!F]C8?NFJ=r`oJ-!*]A)!a&N*r`9&!!*&nq!`DlmrD<Mis%`Jds%NDbr(?r[
+r^clUr'pWRogJRBp-S^D3gH"uR@9V8StMdOUnsufWiWD/[(!QV]">Vh^r+15b0/&UdF6Urf\5-;
+i8WhZkNV=!mI9]>q"jsfJcC<$jo5S]V0?Q]>?kA2=9MZ+<`W6";Zp-$<E*#t<;oc";c6Ik<)HKf
+;@-,q;,L+c:eskar_W5arDNS]r'^QRs$lrWs%!,]r^qZ59MJ5V:Jakb;H$Lo<`W:)=^,-:?=.)L
+@Us%_BPD6uDJsN8FEMePH@('hJ:W?,L5:\ENK90aPEhK%S"-(BTqeE\W2co#YHY==[^WfY]Y2(r
+_SjF6aND]NcHsteeCE1'g"P6;hVd>Oj5f=akNM0qlg4$,n*fc9o()DPo`+Uap&Ojdq#C0iqY^6i
+r;HTerdk*>s*t~>
+JcC<$SH&9]rVc`nr;6Nj!;ZTg!Vc<eog/6Ao()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYH=n+W+L.1Unarqr4;g:s1&';pU:%.r3ZC0q6^(-q6^"+rNuU2
+r/:3+mE,^Xbg"G[d*^=lrm_##lIZ-hf)=.seGmu!da6>>cMl,jcHZ@4r6,#^rQP=Trb*![C27U$
+D/O60E,]f:EcZ;DFEMbMrc\EgH$TC8s*Ocnr-eTorI=9drdXorr-\WoH[G^;#C1Q=GB\4RFoHI`
+F)q8"$?0p$DJa6,CMR[!rb)=FB)Z?GA7K(X@:<RC?NFJ=r`fM/>$Co.!E`G%<WZ9#<;ohr;ZBVm
+;#a>k:Amod9`Ic_9)_E]8GYjT7f5^J7/94C6N'3$s+13JrtPA0nEoQ+k2bU_iSWMJgtUN9f[n[Q
+dhC-UcHOSZc-+8Na2Z*;`5KL-]Xn*P!4Vp8!4hR-rBpKNr^HiVr^ZuZ!(m/^InNI09hnJ\:f1+h
+;cHdu='8[0>[1TB?t*SUAS,UiCM[m,E,fr@G'A7ZI=?]tK7nu8M2R=ROHPfmQ^F53StD^OUo()j
+X0&S0ZEpsJ\[oGe^VI_)`Q-'BbK\>ZdF-Opf@\d1gtgiFi8WeXjlYail0@U$m-a?2nF?)?oDeI_
+p&F^cp\ssfq>^<hqu6NlrUp/@s.'+>~>
+JcC<$SH&9]rVc`nr;6Nj!;ZTg!Vc<eog/6Ao()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYH=n+W*3_MIXd$/pQ,64pPnU"qhtK3q2+a$s(h=Er+l8!pmCuI
+rg3kWS"-%?T&cO>ScYOUT)P8\SGAZGRf/]UBDuQYBkhF!Ci+'-DfBZ8EH6,AFEDYKG5c[eG^4T6
+HN/?lI/JEmIf4cbJGt&tIf+TqI!^5=H3\_?G^"@TG'3e+!HW;\E=-Z'DJj<.Chmg$C&VcHB4h-S
+#%V4Q@UW\Qra,\4?2e(1>?Y50=TMW+rDiu"<)iiqs&/korD<Mis%`Mer_3>bqb$iZr^clUrC6]R
+ogJUCog8UC"S_]fqu)*GJcDqR0A4If]XtJPY,n\*WMl_lV50r`U7n6PSt2FBS=?":R[KV4R$Eu'
+P`q;oOH5E]N;e\;M2R:LMslN$6i9@O7K5jV8,l*[8cD>392&&S:/=\_;,U=k<*!%$=]np5>[CcF
+@U`kZAnYmoCi401EH?5FGC"UaIXm!%KSG;>Mi<^YP*;/tR$sP:T:r$UVPpMqXfnt7ZaI9Q]"G_k
+^r"%/a2lEHc-F\`daZh!f\,!6h;7)JioB+]k3(smlKdg'mdKW6nac8Bs7H?as7QHerqQNhs8)Zj
+rqu`np&9OBSH"*~>
+JcC<$SH&9]rVc`nr;6Nj!;ZTg!Vc<eog&0@o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYH=n+W's0F8k`%V;>F,F;>sDc:B45g;>iNU48_5@48V)1>5h\)
+=T2A%=Sc2!=Sl5&=BAT%<q]Vm=9)M#=T2Cf=9*"5BG>/qCMRa'DJjB3E,fl<F)uGFF`qs-G63#7
+H2`-iHiJKkIK+cpJ+%peJ,XopI0+eCHi86qH$FRXGBS.PrcA0^ErL%cE,TW3D/F*)CMIS_BE;aX
+rac:E@q&nU@:9(A!FB(2>QS,5>5hY*=BGH%!``3!r_rhps&&_ks%iYirD!8bs%E5]r^m)[qFCKR
+r'g9Hq*XgArBWH2R@9V9StMdOUSXidWN3/*ZF.0N\[oDd^VRk/ai_fOcdC4lf@\g4hr3VWk32*r
+lg4-2p%SC^rdk*#s5s=ui0J@o@Tlu<=BAU+=&i7$;c?Xr<Dums<;fbn;ZBZ);,C+g;Gp@j:esna
+;,7'd!_uQgnko?`rBpKNr^HiVr^ZuZ!(m/^InNI09hnJ\:f1+h;cHdu='8[0>[1TB?t*SUAS,Ui
+CM[m,E,fr@G'A7ZI=?]tK7nu8M2R=ROHPfmQ^F53StD^OUo()jX0&S0ZEpsJ\[oGe^VI_)`Q-'B
+bK\>ZdF-Opf@\d1gtgiFi8WeXjlYail0@U$m-a?2nF?)?oDeI_p&F^cp\ssfq>^<hqu6NlrUp/@
+s.'+>~>
+JcC<$SH&9]rVc`nr;6Nj!;ZTg!Vc<eog/6Ao()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns4']Xt_`[^<BFYH=n+W2F`pTVAEiqRZ[:rj_p9qmQ=.!4;[3q6^(-q6^(-qm?C0
+s0DN[oo/4Z#g:H:cHsqce("BI!8$Mg!S>p$ec""sdfn1Id*L%`rm(Vjc2PrabPfZbbm\5uBPD3s
+CM[j*DJsLnE<^H)FEDYJG5c[eG^4T6H3/G@I/SKnIf=inJFe?gJGt&uIf4ZrI!^5>HN/6jGlDmf
+G'3e+!HW;\E=-Z'DJj<-Chmg$C&VcWB4b^dA7T1Z@UW\Q?XI,G?2e(0>?_#/s&]8&r`9&!s&Atr
+s&/korD<Mis%`Mer_3>br(?r[rCHcTrC6]RogJRBp-S^DJcC<$WW+.=q![S7l/q'hj5JnQh:gW8
+g"4j+e'lalccs\ZcHOGQaSs0g`Pf[/^:Cea\[]&V[^Q1Fn@/?`r'^NQs$luXs%!,]r^qW49MJ5V
+:Jakb;H$Ln<`W:)=^#'8?=.)L@Us%^BPD6uDJjE5F*)SLH$XmfJ:W?+L5:\EN/s'`PEhK%R[ftA
+TqeE\VlHf"Y->4<[C3WW]Y2(q_SjF6aND]NcHjndeCE1&g"P6;hV[8Nj5f=akNM0qlg4!*n*fc9
+o()hP"n_K\p@e7[q#C0iqY^6ir;HTerdk*>s*t~>
+JcC<$SH&9]rVc`nr;6Nj!;ZTg!Vc<eog/6Ao()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns4']Xt_`[^<BFYH=n+W2F-EI=Hp+q2b<2qi1$&r/:Q3q2+["!GQ<AC]A5NC]Bgp
+R/<<OQj&qJS=Q4BjIc7>s.9:_rga%ZqO@&Es-jF0BP;*pCMRa'DJjB3rc&-_F*)MHFa!b.!dK!9
+rd"WmI!km@s*jrsqLJ0gqLJQps*jop!do?Ard+Ti!-nKe!HrVbF9-H'rc&9aDf0H0Ci!m&C2*Z\
+&8,TdARo=]@U`bS?sd8I?=!P8!F&b,=oVS(=8l8#<W?%t;u]bq;>j>k:]F2g:&[id9DhE]8c;3V
+8,YpT7J0(D6hWkF5lpo_JcC<$YQ#F/e&K/7\$<*<XK/G%WMcViUnsl]TV.qVT)Y8^S=5k5rg="Y
+Q^*i#P`q7/Ns1N$Mi*CKregc6mtq!1r'^NQs$luXs%!,]r^qW49MJ5V:Jakb;H$Ln<`W:)=^#'8
+?=.)L@Us%^BPD6uDJjE5F*)SLH$XmfJ:W?+L5:\EN/s'`PEhK%R[ftATqeE\VlHf"Y->4<[C3WW
+]Y2(q_SjF6aND]NcHjndeCE1&g"P6;hV[8Nj5f=akNM0qlg4!*n*fc9o()hP"n_K\p@e7[q#C0i
+qY^6ir;HTerdk*>s*t~>
+JcC<$SH&9]rVc`nr;6Nj!;ZTg!Vc<eog/6Ao()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns4']Xt_`[^<BFYH=n+W2E*R8P;fSr)!Jm;tj2J;>sDd:]F8e;?&ZS3r;#:3q6DQ
+=oVV(=8uD!=oDJ"=TV],=8Z+r<rcA$=8Z2#=nu/"=7')uB4tsmC27U$D/O60E;jh]EcZ>EF`hm,
+G63#7H2`*kH[L5>IK+cqJ,4]eJbjorJ,aurI0+eCHiA?kGlW*gG6)l0rcA0^ErL%cE,TW3D/=$(
+CMIS_BFnfgAS#C_@q&nU@:3GL?=$q:>QJ&4r`T8'!*B/#s&K(ur_rhps&&_ks%iYirD!8bs%E8^
+r^m&ZqFCKRr'g9Hpd=aArBW!(S=Z@HTq\?ZVPgDnXKJe7[C3WV]=bkn`5Td<b08/XdaQatf\5-;
+iT'(`roj^TmdBT8p%eI_JcC<$kPkn0Melj.>?b31=BPQ(s&T.u##nT&;cQdrr_rbn'i@k-;c-Fi
+;,U=k;,C(b;,L+c:esmc:]ODc;>jDk6i9@O7K5jV8,l*[8cD>292&&S:/=\_;,U=k<*!%$=]np5
+>[CcF@U`kZAnYmoCi4-0EH?5FGBnL_IXm!%KSG;>Mi<^YP*;/tR$sP:T:r$UVPgGpXfen6ZaI6P
+]"G_k^r"%/a2lEHc-FY_daZh!f@em5h;7&IioB+]k3(smlKdg'mI0N5nac8No*+dZp%J+RrqQNh
+s8)Zjrqu`np&9OBSH"*~>
+JcC<$SH&9]rVc`nr;-Qlq>(!a!Vc<eog/6Ao()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=k*W2FWkRAd'hq7?O8rj_p9s0h[0rj2[5q6^(-q6^(-r3ZI0
+rNcH^qMY--lH0FVbfn>Wcd:(geGdu!f%96?!S>p$ebmqsdf\%GdEqg;!RAshbk]H^bl;>hBkhF!
+Ci+'-DfB]9EcZ;DFEMd+G63#7H2`*kH[L5?IK+crJ,FirJc(,nKD^?#Jc(&uIfOrrI0+eCHiA<l
+H$K=4!HrVbF9-H'rc'0%Df0H0Ci!m&C2%?pB4kgfARo:\@U`bR?sd8I?!U]?>?b;1=oVS(=8l8#
+<<-"s;u]_q;>j>k:]F2f:&dod9DhE]8c;3V8,YpT7J0(E6hNeE6%T&es/c5Nr;H3Slg!`sj5o=\
+hqm2EgXk*0f@A?uda?Cbbg"GWbK7iF`5BO3_S<aorjW!;[JmW7\F6p*6i9@O7K5jV8,l*[8cD>2
+92&&S:/=\_;,U=k<*!%$=BSg4>[CcF@:EbYAnYmoCMds.EH?5FGBnL^I=Qm$KSG8=Mi<[XP*;/t
+R$sM9T:r!TVPgDoXfen6ZaI6O]"G_k^r"".`lQ9Fbg+P^daZh!f@em4h;7&IiT&t[k3(smlKdg'
+mI0N5nac8No*+dZp%J+RrqQNhs8)Zjrqu`np&9OBSH"*~>
+JcC<$SH&9]rVc`nr;-Qlq>(!a!Vc<eog/6Ao()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=k*W2F'CH%:R*qiCK3s,@)?NK*@br/:Q3q2+TurG(t?!,V+k
+qO%MUS"-%?T)PA\T(\fVT(elQT)YDcSt2FBSGSfHRf@%6BkhF!Ci+'-DfB]9EcZ;DFEMd+G63#7
+H2`*kH[L5?IK+crJ,FirJc(,nKD^?#Jc(&uIfOrrI0+eCHiA<lH$K=4!HrVbF9-H'rc'0%Df0H0
+Ci!m&C2%?pB4kgfARo:\@U`bR?sd8I?!U]?>?b;1=oVS(=8l8#<<-"s;u]_q;>j>k:]F2f:&dod
+9DhE]8c;3V8,YpT7J0(E6hNeE6%T&es0)GEjNb]V]X+fEXfSS'W2Z_mV50r`U7e3PT:VUCS!oe6
+rg<\O$'ga=P*1rgNJrhqM?&M4MuS\'M>]g>7/fXT7fGpX8,u6\8q'E,9heAY:f("e;c?Xr<``C+
+>$P<=?XR;OA7]@dBkqL$DK'T:FEVkRH@1-kJV/W1LP^qJNf]EfQ'[l,S"?7GU84ZaWN3/(Yd1UC
+[^`o]]t_A"_o9X:aihoRcdC1je^rF+g=tH?hr*JRj5oFdkiqBum-O-.n*ol<o)J:bo_%nNp@nR]
+s7u]kr;6KkrVcEgJcD8?J,~>
+JcC<$SH&9]rVc`nr;-Qlq>(!a!Vc<eog/6Ao()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=k*W2E'R8kMiRr_WYnrDWDfohk]bo25Nap.t]bq,./gpH&46
+r]9OPrE9#"qH<c!qcNu&=',<#rDs)'='/T'=8Z2#=m&oeBG,#oCMRa'DJjB3EH-#?F*)MHG5c[e
+G^4T6H3/G@I/\QoIfFoqJGt,tK(aipK)U?!JH(*!If4ZrI!^5>H3&;9rc\BdFoHI`F)q8",B.R=
+DJa3+CMR[!BP;$kAn>Oa@q/tW@:3JM?X@#D>[1K;>5h\)=9)G%<rZ/"<;fbq;?0Sm;#a>k:Adid
+9`@]_9)_E\8GYjT7f5^J7/94C6N'20T:hjNUSOcbVl?\sXg#+=[^WcX]=bno_o9X:aihuVdaZh!
+g"Y??ioT=cl0.F!mI0T9o_%tTrdk*#s69OoY^C.o>?b64='&L*<``='r_rhs"B8E$<)`]mrD<Sn
+;#XAm;$Bip;,C+erD<MirD<)_rDNS]r'^NQs$luXs%!,]r^qW49MJ5V:Jakb;H$Ln<`W:(=^#'8
+?=.)K@Us%^BPD6tD/O<4F*)SLH$XjdJ:W?+L51VDN/j!_PEhK%R[]n@Tq\?[Vl?`!Y->4<[C3TV
+]Y2(q_Sa@4aN;WLcHjndeCE1&g"P3:hV[8Mj5]7`kNM0qlg4!*n*fc9o()hP"n_K\p@e7[q#C0i
+qY^6ir;HTerdk*>s*t~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq/SLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iZLYck10Wi2e6LQJI5YP5X-\c92<\,Wo4[J%!)[JI9.[JR?1Zi.30
+Z2KXXMu/IrapH88c-=P[d*^=lrm_)$f@TBA!S>p$ebmqse,RkrdJqPmc2u>;c2Pr_b783"C27U$
+D/O60E,fl<F8g7cF`qtQG^+N5H3/G@I/\NqIXckGJH(3"K(jopK_U3!K)^E#JH(*!If4ZqI!bj=
+$[HuAGB\4QF`__HErL%^E,TW3D/B2e$>O9gBP1phAS#C^raGn:@/aL6?=!P8s'#J,r`K;)=',B%
+s&B%urDNbq;,R9gs%iYir([2br_*/]r^m)[q+(BQr'g9Hq*XgArBZ#7JcDnQ2#I:AmHa'#k2bX`
+io/bNgtUH5f@JL$daHOhbKS2Tc-+5M`l,j7_na$t\[]/Y[C<TQ\[_+;!(-WOqaCHQs$luXs%!,]
+r^m2a9`@b1:/=\`;H$Ln<E<1'=^#'8?=.)K@Us%^BPD3sD/O<4F*)SLH$XjdIt30)L51VDN/is^
+PEhH$R[]k?Tq\?[Vl?\uY->1;[C3TU]=ktp_Sa@4aN;WLcHjndeC<($g"P3:hV[8Mj5]7`k32'o
+lg4!*mdKZ8rpg*]o`"Lap@nO\!r;]hr;6KkrVcEgJcD8?J,~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq/SLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iZLYck10Wi2e'Dg$Y`M>`M0Nr"b)N;ne;N/NVnMY`1sMY_)^C[@Gb
+RK&`XS=Q5HT(\fUT(elRT)YG_ScG>\SH#)YRK/iLRLX"FC27U$D/O60E,fl<F8g7cF`qtQG^+N5
+H3/G@I/\NqIXckGJH(3"K(jopK_U3!K)^E#JH(*!If4ZqI!bj=$[HuAGB\4QF`__HErL%^E,TW3
+D/B2e$>O9gBP1phAS#C^raGn:@/aL6?=!P8s'#J,r`K;)=',B%s&B%urDNbq;,R9gs%iYir([2b
+r_*/]r^m)[q+(BQr'g9Hq*XgArBZ#7JcE"T1Yg*m]XtJQXKAS)Wi2koVPU)bUnXQVStM[GS=>t9
+R?s>/Q^3u'P`q8nOH5E]Mi*@KM>iD5MXQB%6N':K7/o^U7fGpX8,u6\8c_RYr_7T3:Jand;c?Xq
+<``C+>$P<=?XR;OA7]@dBkhF#DK'T:FEVkRH@1-jJ:iN0LP^qJNfT?eQ'Rf+S"61FU84ZaWN*)'
+Yd(OB[^`l[]t_A"_o9X:aihoRcdC1jeCN7)g=tH?hr*JRj5oFckiq?tm-O--n*olHncA@Srq-<c
+p\jjgq>0scqu6NlrUp/@s.'+>~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq/\OoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iZLYck10Wi2da84lKJ9i4edqG[/epJL`_peh&fpJ:`aqGI2fn2g#A
+qcWl"!EiP$=oDJ"=TV],=8Z+t=8c7u=8l>%=nu2"=7]N(BPD3sCM[j*DJsK6EH6."F9Zl2GB\:V
+H2`*kH[L5?I0+kIJ,OotJc:8qKDU>sKDpK&Jc1-!IfOrrI0"_Brd"rtG^+FVG'.qLFE;L%E<U<"
+DJj<-rbDjUBkV0mAnGUcA7PUJ!F]C8?NFJ=r`oJ-!*]A)!a&N*r`9&!!*&nq!`DlmrD<Mis%`Jd
+s%NDbr(?r[r^ciTrC6]RogJUCog8UC2kZk=Uo(&fW2ZeuY->:A[^`l[]=ktr_o9[<b0A8\e'ut%
+g>(TEjQ>Ugl07O#mdT`9oCVeRrIP!"s6K\'m@JE2@9Qo<=B/C&=&r@$=&i0t<E3"!<)Z`n;ZBT(
+:f1(d;,U:h;H$Fh:f1*f:]F5l;,Hg\r_`__rBpHMs$crWr^ZuZ!(m/^!D?,c9m9?.:f1+h;cHat
+='/U/>[1TB?t!MTAS,UiC27[(E,fr@G'A4XI!pKpK7nu7M2R=QO-5]lQC+,1SY)UMUo(&hWi`G.
+Z*UjH\@K5b^VI_(`Q$!@bKS8XdF-Oof%8U/gYL`Di8N_VjlY^hl07O#m-X60nF?MK!V>s_o`=d\
+rV-HiqYL-erqu`np&9OBSH"*~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq/SLoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`59@*^:_%f\$iZLYck10Wi)_1KT<"0WqO"(\bru8[f!Q.[/%--[/.3.[/I?0ZMh''
+N;SV5N9/1ibKS5VcHjkce'upurmq,$mFVHkf)=.seGdo"da?Ihci),hc2Prab8+f,CMRa'DJjB3
+EH-#?FEDYKG'A.TH2`*jH[Pg@s*artrIFp!s+:0$rIj]prIk*$s+:9%rdb#u!.Ooqs*Pr9H?sj^
+G^"@TF`heJF)l8?E,]`5DJa3*CMITuBP;$jrac+@A,]p<@:9(A!FB(2>QS,5>5hY+=BAT'<WZ9#
+<;ohr;ZBVm;#a>k:Amod9`Ic_9)_E]8GYjT7f5^J7/0.C6Ms-#s+13TrsJc'p@%A6l0.9jj8S'<
+hBgt2f\"g-eC;ppd*Bn[bg"GVaiDE>`Poa1]t1_a\@&`Q[^WcVpU9n,s$H]PqaCHQs$luXs%!,]
+r^m2a9`@b6:/=\_;H$Ln<E<1'=^#$7?!guJ@Us%^BPD3sD/O<4F*)SLH$XjdIt3-(L51VCN/is]
+PEhH$R[]k>Tq\?ZVl?\uY->1;[C3TU]=bno_Sa@4aN;WLcHjndeC<($g"P3:h;@/Lj5]7`k32'o
+lg4!*mdKW6nac8Bo`"Lap@nO\s7u]krVQTlrVcEgJcD8?J,~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq/YNoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`59@*^:_%f\$iZLYck10Wi)_#D01>]Ll[VkNq\P&N;nh8MYr=qMZ.G`C[.;`R09"L
+S=Q5HT(\fTT(elST)YG^SckUSS=?#>RMKUPCMRa'DJjB3EH-#?FEDYKG'A.TH2`*jH[Pg@s*art
+rIFp!s+:0$rIj]prIk*$s+:9%rdb#u!.Ooqs*Pr9H?sj^G^"@TF`heJF)l8?E,]`5DJa3*CMITu
+BP;$jrac+@A,]p<@:9(A!FB(2>QS,5>5hY+=BAT'<WZ9#<;ohr;ZBVm;#a>k:Amod9`Ic_9)_E]
+8GYjT7f5^J7/0.C6Ms-#s+13WrtkCZa1o6oYcb(0X/i8!W2HMhV50i[TqVIX'qLkaR[fe4R@'>,
+QBd\uP*1ldNf8nqMZ/P6MYDr&M>opA6i0:O7K5jV8,l*[8cD<_92,=ZHqmI6:f:4j<)lt#=BSg3
+>[:]E@:EbYAnYmnCMds.EH?5FGBnL^I=Hd!KSG8=MN!RVOcu&rR$sM8StVmSV5L;mXfen5ZaI6O
+\\#Mh^r"".`lQ9Fbg+P^daZdtf@em4h;-uHiT&t[k2tmll0I^&mI'H3nF?)?oCW%T!VZ9dq#C0i
+qYg<jr;HTerdk*>s*t~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq/VMoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`59@*^:_%f\$iZLYck10Wi)^`84ZBK9iC^aqbm/cpe^c`s%rGcrD<>fr_WSi!'B^3
+m99BirE/htrE/r"!a&N*r)WbtrE/qur`K2'q,mVtpK/55BkhF!Ci+'-DfB]9EcZ>EF`qqPGBeE4
+H3&A?rdFfq!.Xrts+13%r.Fs$nV-ppr.G$$s+10"s*k#trdFfo+FAE\H$OXYGBS+OFEDSEEH,r:
+Df0H0Chmg$C2%?pB4h-S!G#^>@KBnFra,\4?2e(1>?Y50=TV],=8l5%<E)rs;u]bq;>j>k:]F2g
+:&[id9D_?\8cD9W8,YpT7J0(D6hWkE5rPF3V5C/hWN*&%Yd1XE\$roZ]Y;.u`5]m?bKeM`eCN:,
+h;7)MjlP[ilKmm*n*oi:o^qqTrdk*#s6Tand?&6V>Zt<5<`E+$r`0/#=&r7!r`')%<Dudor)3Jj%
+8]o";Gg=i:eska:/Fdd:\.E\;>sJn6N0@L7/o^U7fGpX8,u6\8c_RYr_7c8:Jakc;c?Xq<``C+>
+$G6;?XR;OA7]@dBkhF#DK'T:FEVkRH@1-jJ:`H/LP^nINfT<dQ'Rf+S"6.EU84W`WN*)'Yd(OB[
+^`l[]YD8!_o9X:aihoRcdC1jeCN7)g=tH>hr*JRj5oFckiq?tm-O--n*fc9o()DErq-<cp\jmeq
+>^<iqu6NlrUp/@s.'+>~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq/SLoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYck10Wi)_/J;pP,W;!n&\c92=\,Wo7[J7-)[K!W.[JmQ1Zi%-+
+Z1a.TMuUocb5]T]b5]Wlbg"GYd*U4ieCE+Kf)=4hf`0S%ebmqre,RhtdEp5=c2c,fbl,^,C27U$
+D/O60E,fl<F*)MHG'A.TG^4U]H[L3hI=?Wprdb$"s+:3%re19)m"YLns+L?'s+:9%rdb#u!.Ooq
+!IT7nH7O8cGB\4RF`__HEcH)<Df9N2D/=!'C2%BqBP1pgARo=]@U`bR?sd8I?=!P8!F&b,=oVS(
+=8l8#<W?%t;u]bq;>sDk:]F2g:&[id9D_?\8cD9W8,YpT7J0(D6hWkE6%T&es0M__rr)ETlg*cs
+jlYR_j5SqPgtLH6f[nX%daHLfc-4GWccaGN`l,d5_n`ss\%&oU\$`ZS\@;4@q7$Ajr^6QNs$crW
+r^ZuZ!(m/^InNI/9heAY:f("f;cHat='/U/>?kH@?X[DRAS,UhC27[(E,fr@G'A4XI!pKpJqSl6
+M2I7PO-,TjQC+,1SXuOLUnsugWiWA-Z*UjH\@K5a^VI_(`Q$!@bKS8XdF-Lnf%8U/gYL]Ci8N_V
+jlY^hl07O#m-X60n*ol<ncA@Srq-<cp\jmeq>^<iqu6NlrUp/@s.'+>~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq/YNoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYck10Wi)_#C3"iVKo_;jNq\P&N;nh8MZ8OnMZ%AbCZh)]R09"L
+SXuDJT)P>^T),)VT)##UT)YG^T)Y>_S=?#@RNH9[CM[j*DJsK6EH6,BFEMbNGBe@XH?spcI!pEl
+IXh?Is+13%rIb*&re9]nre:B*rIb-%s+10"s*k#trd=fpHiA=AH$FOWG'8"MFE;JBEH#i7DJj<-
+CMR[!BkV0mAn>OaA7K(X@:3JM?X@&Er`fJ.>5h\)=9)G%<rZ2"<;ohr;ZBVn;#X8j:Amod9`Ic_
+9)_E]8GYjT7f5^J7/0.C6Ms-#s+13Ys![-X`4`gjY-"e,X/i4uWMcViUnsf[TqS*NSt2C@S!ob4
+R@'>+Q'@O4OpmD2NJrdPMM[7LMMd8bM"uo-6N0@L7/o^U7fGpX8,u6\8q0K-9MJ5V:Jakb;c?Xq
+<``C+>$G6;?XI5N@qB7cBPM="DK'T:FEVkRH@1-jJ:`H/LP^nINfT<cQ'Rf+S"6.EU84W`WN*&&
+Yd(OB[^`l[]YD8!_o9X:aihoRcdC1ieCN7)g=tH>hr*JRj5oFckiq?tm-O--n*fc9o'uhQo`"La
+p@nO\s7u]krVQTlrVcEgJcD8?J,~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq/VMoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYck10Wi)^_7n66J:/^jcr)38dpe^c`r)!5cr)!;grD<Aer]Bd6
+l<=!ds&f&!rE0&%"'A]/=T2D#<rH+s=T)>#=T;P"=Su7u=T;GEC27U$D/O60E,fl<F*)MHG'A.T
+G^4U]H[L3hI=?Wprdb$"s+:3%re19)m"YLns+L?'s+:9%rdb#u!.Ooq!IT7nH7O8cGB\4RF`__H
+EcH)<Df9N2D/=!'C2%BqBP1pgARo=]@U`bR?sd8I?=!P8!F&b,=oVS(=8l8#<W?%t;u]bq;>sDk
+:]F2g:&[id9D_?\8cD9W8,YpT7J0(D6hWkE5r>C6Vl6SpX0&S1ZaI6N\[oDe^VRh,a2uKKd*gCn
+f@o$:i8WhZk32'qmI'N8oCDPGp\Oc<s+14:rs?2dBOG(L=BJU)r`9S1<E<1$;cHas<)lps;H*Nl
+'MhS(;,U4f;Gp@g;,C%b;GL%a:f%$d!)`Jer)*Gks$H]PqaCHQs$luXs%!,]r^qZ59MA/T:/=\_
+;,^Cm<E<1'=^#$7?!grI@Uit]BP;-rD/O<4F*)SLH$XjdIt3-(L51VCN/is]P*M?#R[]k>Tq\?Z
+Vl?\tY->1;[C3TU]=bno_Sa@4aN;WLcHjnde'ut#g"P3:h;@/Lj5]7`k32'olg4!*mdKW6nac5O
+oCW%T!VZ9dq#C0iqYg<jr;HTerdk*>s*t~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq/SLoCDJBnF,i6mHj0(l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$`QJYcb+/WMcV,IZ:,!X8':(\HB@N[^Q(@q6^"+!4;F,s0VU.rNc=*
+s0D?WrJLZsrQ4HLrlP,]$HpZ;c-FV]dF-Lnr71hurn$Yls478%rmgqrrmUkp!RT0lc2c,fbl>ld
+CCtB"DJjB3EH-#?FEDYKGB\:Wrd"TlI/\NpIXh?Is+(0%rIb-'s+U?)rJ1*&rJ19)s+UK+rIY0'
+JV!fN!IoRtI0"_Brd#'"G^"@TF`heJF)l8?E,Y_n"`8'kCMIS_BF8BaAS#C^@q&nU@/aL<?<piA
+>[(E9r`K;)=',B%s&B%urDW_o!)`\ks%iYir([2br_*/]r^m&ZqFCKRr'g9Hpd=aAr'>o6JcE.X
+/,fD9mHj*"jlPR_j5T"Rh;-f<f\"g+e'c^lccs\Xc-OST`l>s7`5BC'\c0&B[CEZR\%&pA[e[E4
+6N0@L7/o^U7f>i+84cBF8kViO9heAY:f("e;cHat='/U/>?kH@?X[DRAS,RgC27[(E,fo?Fa&+W
+I!pKpJqJf5M2I7PO-,TjQC+)0SXuLKUnsugWiWA-Z*UgG\@K5a^;.V'`Q$!@bKS8XdF-Lnf%8U/
+gYL]Ci8N_VjQ>Ugl07O#m-X6@mfi4No()DErq-?dp\4[^s7u]krVQTlrVcBfJcD;@J,~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq/SLoCDJBnF,i6mHj0(l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$`QJYcb+/WMcV!CN=oULAd22NqeV'N;nh9M?&LlMZ8V2D#8#JCuq&\
+R0B(MSXuFDqO[\Ys.9(Zqk!YVqk!h[rgs+[!M#YRRf@.8Ci+'-DfB]9EcZ>EF`qtQG^9:7!IK4n
+I0"eHrdb$"!.t0%s+LE+qhG')p5&[&qhG-)s+L?'!ePuSrdY$!If=`rI!bj=%XE;CGBS+OFEDSE
+EH,r9rb_mVChmg$C&VcQB4b^dA7K+Y@UW[D?O'nC?!LW=>?_#/!a&N*r`9&!!*&nqs&&horD<Mi
+s%`Jds%NDbr(?r[rCHcTrC6]RogJRBp-S[CJcC<$\Glfkb/_6,ZELD/XT,4KVl$>fUo'l\TqS*O
+SXl:?S=5h4R@'>+Q'@JrOckcbNJi^OM2I4KM2I/aM"uo-6N0@L7/o^U7f>i+84cBF8kViO9heAY
+:f("e;cHat='/U/>?kH@?X[DRAS,RgC27[(E,fo?Fa&+WI!pKpJqJf5M2I7PO-,TjQC+)0SXuLK
+UnsugWiWA-Z*UgG\@K5a^;.V'`Q$!@bKS8XdF-Lnf%8U/gYL]Ci8N_VjQ>Ugl07O#m-X6@mfi4N
+o()DErq-?dp\4[^s7u]krVQTlrVcBfJcD;@J,~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq/SLoCDJBnF,i6mHj0(l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$`QJYcb+/WMcU^7n63H:\[lc;Ya2b;#4#l:f1(d;#*oe;#*ue;#=&g
+;#WNU481f">5q_*=Sl5$=SQ%t=T2J'=92Q,r)`o!rE&kurE&Vnqc<c"r`B,8&Su<%DJsK6EH6,B
+FEMbNGBeE4H3&A?rd=frJ,XuuJH1<#KE$W)L&6W'L\?Q&L\li+L&Zi)K*$XUJc:0#It%BF!IT7n
+H4G4FGB\4QF`__HEcH)<DuOVXD/=!'C2*Z\$>3s^ARo:\@U`bRra,n:?!U]?>?b;1=TV],=8l8#
+<<-"s;u]_q;>j>k:]F2f:&dod9DhE]8c;3V8,YpT7J0(D6hWkE5r5I=WN*&$Y->4>[^WcX]"Gem
+_8F75air&WdaQaug"YBAioK4akj%O%n+-,Ep\FX]r;M9IJcG0<%/?WCA78YF=BJR)<`f9#s&KA(
+;c?^s<)uut;uTZ$;bp7g;,U4f;,[Bi#>n8m;GL"`:B"&k:Jap_;#F2i;ZB)_6i0:O7K5jU7t+!#
+8P2TJ9MA/T:/=\_;,U=l<E<1'=^#$7?!grI@Uit]B4u$qD/O<4EccGJH$XjdIt3-'L51VCN/is]
+P*M?#R@Bb=TVA6YVl?\tY->1;['mKT]=bkn_Sa@4aN;WLcHjnde'ut#g"P3:h;@/Lj5]4_k32'o
+lg4!*mf2_ZnF?)?oCW%T!quB_rqQNhs8)]krqu`no_sFASc=3~>
+JcC<$SH&9]rr)ior;6Njs7uZhs7ZNerq/SLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+d*BnZb/hWB`59@*^:_%f\$`QJYcb+/WMcV-I#OqrXSTO+\c92>[fEl2[JdK$[/dT.Zi.3,Z2V$/
+Z2BRVNW4t:a8O'ZammORaT0K^ao9E`bKTt1"jYKBdaQ_Dec"(ufCISof)XD$ebmqre,Ibrd*M^:
+!6tJd(2I`'DJjB3EH-#?FEDYKGB\:WH?spcrd=frJ,Xs"JV&LQKE$W)L&Hc*L]3+uM>i>1L])u-
+K`Hf)K)pRTrdZJJIXZ]nI!^3dH?jaZGBS+OFEDSEEH,r9DJj<.Chmg$BkV0mAnGUcA7PUJ!F]C8
+?NFJ=r`fM/>$Co.!a&N*r`0)#<)ifp!`DlmrD<Mis%`Jds%NDbr(?r[r^ciTrC6]RogJUCog8OA
+JcC<$\,QU(n*K<'roG?`j5JnQhV?o?g=Y'/e^MsqdE^%]bK\DXbJqQ?_Sj@,]=IpM"gteI\%&p@
+[e[E46N0@L7/o^U7f>i+84cBF8kVfN9heAY:f("e;cHat='/U/>?kH@?X[DRAS,RgC27[(DfKf>
+Fa&(VI!pKpJqJc4M2I7OO-,TiQC+)0SXuLKUnsugWiW>,Z*UgG\@K5a^;%M%`Q$!@bKS8Xd*^=l
+f%8R.gYL]Ci8N\UjQ>Ugl07L"m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD;@J,~>
+JcC<$SH&9]rr)ior;6Njs7uZhs7ZNerq/YNoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+d*BnZb/hWB`59@*^:_%f\$`QJYcb+/WMcUuBQ8KPLQ@MoNq\P)N!"usMi6GLregc6r+u@LqJ?2!
+!13&>s-NYNr0[VTS"0JKq4@SXrLWqZq4@GTrLX%]rgs+[!M#YTRMK[TD/O60E,fl<F*)MHG'A.T
+H$Xd`I/\NpIXh?I!eGrTre(6(s+UE+reLK/mtq%"reLH,s+LH+rIY-&Jc:0LIsuipI=-BgH?sj]
+GB\4QF`__HEcH)<Df0H0D/=!'C2%?pB4baeARo<M@KBnFra,\4?2e(1>?Y50=TV],=8l5%<E)rr
+;Z]io;>j>k:]F2f:&dod9DhE]8cD9V8,YpT7J0(E6hNeC6%T&es1J@Cqq9!'^pC8KXK8J(Wi2hn
+VZ*D;VP9fYTV%mKSXc4>S!]S2R$X,(P`q;nP)kT^Mi3FKMMmFNM=uc$M>opA6i0:O7K5jU7t+!#
+8P2TJ92&&S:/=\_;,U=l<E<1'=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=acIt3-'KnkMBN/`m\
+P*D9"R@Bb=TVA6YVl?\tXg#(:['mKT]=bkm_8F73aN;WLcHjkbe'ut#f\5*9h;@/LioB+^k32'o
+lKmm)mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFASc=3~>
+JcC<$SH&9]rr)ior;6Njs7uZhs7ZNerq/SLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+d*BnZb/hWB`59@*^:_%f\$`QJYcb+/WMcU]84H6F:ARoa;Yj8d;#!of;#3rf;"mic;#=&e;#`QT
+3rV5;3rW:K>5q_.>$5!1=RoVn=T2J&=Sc)!<rH+s=T)=n=SZ#6CM[j*DJsK6EH6,BFEMbNGBeCZ
+H@(&=I0"eHrdY'$JqEuSs+LE+rJ(<,reU$"reUQ/rJ(?+!/1<'!J5n%J1?%tIXQWlH[C'bH$FOW
+G'.qLFE;JBEH#i6DJa6,CMR[!BP;$jAn>OaA,]p<@:9(A!FB(2>QS,5>5hY+=BAT'<WZ9#<;f_s
+;Gg<i;#a>k:Adid9`@]_9)_E]8GPdS7f5^J7/94C6Mj&%WiW>*Yd:^F\$roZ]=ktq_SjI9b08/X
+dF6Xtg>(QBioB1alKmm+nFQ>Iqu$HmJcC<$mJdRKQ#L;>>?P'.<**-"<<?3&<;oer<rQ+t;Zous
+;c6Hk;%uo);,L4f:f1(c;,U.a:JXe`;,C-`;#F2i;ZB)_6i0:O7K5jU7t+!#8P2TJ92&&S:/=\_
+;,U=l<E<1'=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=acIt3-'KnkMBN/`m\P*D9"R@Bb=TVA6Y
+Vl?\tXg#(:['mKT]=bkm_8F73aN;WLcHjkbe'ut#f\5*9h;@/LioB+^k32'olKmm)mf2_ZnF?)?
+oCW%T!quB_rqQNhs8)Zjrqucoo_sFASc=3~>
+JcC<$ScA?]rr)ior;6Njs7uZhs7]"Vp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcV,G`AVrX1.u;rji'=rjVm8qmHI4n$W,$pTse'r3?4+
+s0;Q^s,6l8qi1Tprl=rXs2jlTprNodbKS5UcHaeadaQ_Cec42'e^i='fCRYpf)XD$ebmqre,Ibr
+d*M^:,0e?UCi+'-DfB]9EcZ>EF`qtQG^4U]H[L6iIXcitJ:W<(rdt9*Kn]M\reLN0qhaj#qhb<.
+s+gT.s+LH+re(6&!.k-"%Y&qUI=-BgH?sj]GB\4QrcAHfEcH)<Df0H0D#S2RC2%?pB4h-S$Y3aV
+@UW\Q?XI,G?2e(0>?_#/s&]8&r`9&!s&Atrs&/korD<Mis%`Mer_3>bqb$iZr^clUr'pWRogJRB
+p-SUAJcC<$])OVboBtr/kiLmdioB"ThVHuAgY1?5f%&9uda?@bbfe8Wc-+,H`PTR2^V%(c\$i]Q
+[^WcUp9se+s$HZOr'^QRs$lrWIRm%%8kM`L9MJ5V:Jakb;H$Op<`W=*>$G6;?=.,M@qB4aBPM=!
+DJsN8FEMePH@('iJ:`E-L5CeHNK93bPa7])S"6.DTqnN_W2cr$YHbF@[^WfZ]Y;.s_SsO9aihoR
+cHstfeCN7(g=tE=hr*JQj5f@bkNV6rm-O--s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*?
+s*t~>
+JcC<$ScA?]rr)ior;6Njs7uZhs7]"Vp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcUtB5i?ML5l(jp5Sd)qMX<irJL]6Mtq2hD>n>OC\sIb
+R/WHLR/WKTR[]iHSbSfVTDY;ZTD5#TTDbA]TDkG]SH57MqjJUCD/O60E,fl<F*)MHG'A.TH$Xd`
+I!pElIt*!!JV&LQK*$^[L&Qi+L]<2-M=HK#M>i>2L]3&.K`Hf*KE$N'Jc:00IsufoI!^3dH?jaZ
+GBS-.F:!#/EH,r9DJj<-rbD[PBkV0mB)Z?LA7K(X@:<PN?X@&Er`fJ.>5h\)=9)G%<rZ2"<;ohr
+;ZBVm;#a>k:Amod9`Ic_9)_E]8GYjS7f>dK7/0.C6Ma!!s+13art+YH`4imkY-"e,WiW1uVkp9i
+V$!NfUS@a\!M>q^RhM6XR$j>.Q^*f!PEM)iNJrdRMMhCk!K)a-M"uo-6N':L7/o^U7f>i+84cBF
+8kVfN9heAY:f("e;cHat<`iL.>?kH??X[DRAS#LfC27X'DfKf>Fa&(VH[UBoJqJc3M2I7OO-,Ti
+QC+)0SXuLJUnsufWiW>+Z*UgG\%0,`^;%M$`Q$!@bKS8Wd*^=lf%8R.gYCWBi8N\UjQ>Ufl07L"
+m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD;@J,~>
+JcC<$ScA?]rr)ior;6Njs7uZhs7]"Vp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcU]84?3E:/^sfq,6o`r_WAes%rVhr_W>dr)!;eqb[2N
+pcAFWr)rr$!*Snsr)ru#oNCojp/h)mrE&Vnqc=kUD/O60E,fl<F*)MHG'A.TH$Xd`I!pElIt*!!
+JV&LQK*$^[L&Qi+L]<2-M=HK#M>i>2L]3&.K`Hf*KE$N'Jc:00IsufoI!^3dH?jaZGBS-.F:!#/
+EH,r9DJj<-rbD[PBkV0mB)Z?LA7K(X@:<PN?X@&Er`fJ.>5h\)=9)G%<rZ2"<;ohr;ZBVm;#a>k
+:Amod9`Ic_9)_E]8GYjS7f>dK7/0.C6M`u"Xfen6ZaI6N\@T;c^VI_(`Q-*Dc-OeceCN=.h;7)L
+jQ5Xllg=-1o_/+Xr;M9IJcG-;'#KB<@9m)>=&r=&=B/C%<`E!rqc3SnrDEVkr_WYnr_X&$:f("d
+:Jjq`:/=[a:]OAd;#F2i;ZB)^6i9@P7K5jU7t+!#8P2TJ92&&S:/=\_;,U=l<E<.&=^#$7?!^lH
+@Uit\B4u$qCi402EccGJG^=^bIt3-'KnbGAN/`m\P*D9"R@Bb=TV80XVl6VsXfo"9['mHS]=bkm
+_8=12aN;WLcHaeae'ut#f\5*8h;@/LioB+^k3)!nlKmm)mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zj
+rqucoo_sFASc=3~>
+JcC<$ScA?]rr)ior;6Njs7uZhs7]"Vp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb+.WMcS(FcN>tWj;K4"M)%P\$tt;s0_g4rjDa4!4D^2q6Tq'
+rNZ:+r3?$UrJgitrl4lV"j"a*aN;Quao]]-b4s'cb0/#Qc-FY^dF-MCeG7Ypf)OA$fDsOuf`0P'
+f)F2#eC4BGs3ptq!R]9nc5t6SDJjB3EH-#?FEDYLGBeCZH@(!dI=6QoJ:N3%K)UB'KSBAZ!f)Sf
+r/(H2rJU9+rJUZ4rJCQ1s+gT.s+LH+rdt6'Jc:0UIsufoI!g9eH?jaZGBS+NFE;JCEH,r9DJj<-
+CMR[!BkV0mAn>OaA7K(X@:3JM?X@&Er`fJ.>5h\)=9)G%<rZ2"<;ohr;ZBVm;#a>k:Amod9`Ic_
+9)_E]8GYjT7f5^J7/0.B6Mj'"s+13`s!Ia=na5W*k2k^aj5JnPh;$iAg">!1f@AC!da?@bbg"DY
+cHF8J`W!a\^V%(c\$i]P[f3f1[edK46N':L7/o^U7f>i+84cBF8kVfN9heAY:f("e;cHat<`iL-
+>?kH??X[DRAS#LfC27X'DfKf>Fa&(VH[U?nJqJc3Ll..NO-,TiQ'du/S=ZCIUnsufWiW>+Z*UgG
+\%0,`^;%M$`5Td<b0/&Td*^=lf%8R.gYCWBi8N\UjQ>Ufl07L!m-X6@mfi4No()DErq-?dp\4[^
+s7u]kr;6Kkrr)KgJcD;@J,~>
+JcC<$ScA?]rr)ior;6Njs7uZhs7]"Vp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb+.WMcRqATE6LKo>bepl5'-pl"Bo!/pf5pP\f_rbV^QR$dc;
+m$Ra<r0[JO!h,UKrgiPMrh&qVr1EqZs.B:^rgj(Zr0mY')K0S7EH6,BFEMeOG^4U]H[C-gI=?Zr
+J:W9'rdt6)L&H`-LPUcaM>rJ3Mt;o+MuJV4M>rD3L]3&.K`Hf*K)pRTrdZeSIXQWlI!^0cH$FOW
+G'.nKF)l;@EH#i6DJa3*CMIQtBP;$jAS#C_@q&nU?sm>K?=$q:>QJ&4r`T8'!*B/#s&K(ur_rhp
+s&&_ks%iYirD!8bs%E5]r^m)[qFCKRr'g9Hpd=^@qa#f5JcEOc#3*hH]=5,Lri?4%X/W#qV?*Nj
+rhC(!TV7sLSXZ(;R[BJ1R?s8*Pl?jLP)kT]MuJV6MuSY7M=uc%M>fj?6i9@P7K5jU7t+!#8P2TJ
+92&&S:/=\_;,U=l<E<.&=]ns6?!^lH@Uit\B4u$qCi402EccGJG^=^bIXm$&KnbD@N/`m\P*D6!
+R@B_<TV80XVl6VsXfo"9['mHS]=bkm_8=.0a2lEHc-F\`e'ut#f\5*8h;@/LioB+^k3)!nlKdg(
+mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFASc=3~>
+JcC<$ScA?]rr)ior;6Njs7uZhs7]"Vp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb+.WMcR]7Rg!D:Jgmdr)2`U!)WVir_W>dr)!>fpJCKCs&o>'
+r)ru%s&o)"!a/]1r)ru#qcNo&r)r_qp/h)mqcEVrpfIK5)K0S7EH6,BFEMeOG^4U]H[C-gI=?Zr
+J:W9'rdt6)L&H`-LPUcaM>rJ3Mt;o+MuJV4M>rD3L]3&.K`Hf*K)pRTrdZeSIXQWlI!^0cH$FOW
+G'.nKF)l;@EH#i6DJa3*CMIQtBP;$jAS#C_@q&nU?sm>K?=$q:>QJ&4r`T8'!*B/#s&K(ur_rhp
+s&&_ks%iYirD!8bs%E5]r^m)[qFCKRr'g9Hpd=^@q`ug<Z*UjH\%'#\]YD4t_o'L8b08/XdF6\!
+g>(QBiT'"^l0I^'n+-)Dq>:*hrdk*#s6osuXF"Md>$+m.<`W:&<EE4%r_jt?<)lmt<)Zap;c6Ij
+;GU.f;,U7g;Gg7e;,L+d:JOY\:]4)i;YErb;?'Pn6N':L7/o^U7f>i+84cBF8kVfN9heAY:f("e
+;cHat<`iL->?kH??X[DRAS#LfC27X'DfKf>Fa&(VH[U?nJqJc3Ll..NO-,TiQ'du/S=ZCIUnsuf
+WiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=lf%8R.gYCWBi8N\UjQ>Ufl07L!m-X6@mfi4No()DE
+rq-?dp\4[^s7u]kr;6Kkrr)KgJcD;@J,~>
+JcC<$ScA?]rr)ior;6Njs7uZh8GDiOp%@tKoCDJBnF,i5m-O'&l0.9ljl>C[i8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqd[^EHHYcb(-WMcSgFH*)sW3Q93s1/0>!4Vg5r3u^7s0Vp8Za981qQot&
+riuC,qQ]^P!0-rtrPnZRs2Y2^pr`9O$HgQ9bg"GZd*^:jrm^\ms475%!nc,Vrn%5(rRh/%!7q/"
+!n>]JrR:hrrmChpd/M</DJsK6EH6,BFEMeOG^4U]H[L6iIXZcsJ:W=OK)pXZreCH.!/UT1s,-f6
+qMb--q2G?3s,-c3!f2Vere;kUKS4u1Jq8K'J:E#rI=-BgH?sj]GB\4QFEDSEEH,r9Df0H0Chmg$
+C&VcQB4b^dA7K+Y@UW[D?O'nC?!LW=>?_#/!a&N*r`9&!!*&nqs&/kor_WVjr_EDds%NDbqb$iZ
+r^clUrC6]RoL/LBog8OAJcC<$^Afq[n*K?(jlGL^j5AkPgt^Z<g"G!/f$r0sdEp1`bg"DYcHF;K
+`P]R0^V%(c\$i]P[f3f1[edK46N':L7/o^U7f>i+84cBF8kVfN9heAY:f("e;cHat<`iL->?kH?
+?X[DRAS#LfC27X'DfKf>Fa&(VH[U?nJqJc3Ll..NO-,TiQ'du/S=ZCIUSXleWiW>+Yd:^F\%0,`
+^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8N\UjQ5Oel07L!m-X6@mfi4No()DErq-?dp\4[^s7u]k
+r;6Kkrr)KgJcD;@J,~>
+JcC<$ScA?]rr)ior;6Njs7uZh8GDiOp%@tKoCDJBnF,i5m-O'&l0.9ljl>C[i8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqd[^EHHYcb(-WMcSg@rd!MKST>_p5T$0pl"Bos,6l6onrfep1s_Grg*VP
+qj6Z:qj7;Lrg<eUS,JlHT)PAVT)5/ZT)YG^T)P;\SH#&tRVm%_EH-#?FEDYLGBeCZH@($fI=?Wp
+J:N3&rdt6)L&Qi,LB*//M>rJ4Mu&D+NVSP5MuS\5M#rKgL]3#WKnP,3K7\Z*J:N,uI=6KiH[:!`
+G^"@TF`__HEcH)<Df9N2D/=!'C2*Z\$>3s^ARo:\@U`bRra,n:?!U]?>?b;1=TV],=8l8#<<-"s
+;u]bq;>sDl:]=,f:&dod9D_?\8cD9W8,YpT7J'"D6hNeC6%T&es2+dAfuLhCZ`gR7Xo>=GW2HMj
+Vl$;dU7n9QTV7pJSsu1<R[BJ1R@'A,P`q8oOcPK\MuJV6MuSY7M=uc%M>fj?6i9@P7K5jU7t+!#
+8P2TJ92&&S:/=\_;,U=l<E<.&=]ns6?!^lH@Uit\B4u$qCi402EccGJG^=^bIXm$&KnbD@N/`m\
+P*D6!R@B_<TV8-WVl6VsXfnt8['mHS]=bkm_8=.0a2lEHc-F\`e'uq"f\5'7h;7)KioB+]k3)!n
+lKdg(mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFASc=3~>
+JcC<$ScA?]rr)ior;6Njs7uZh8GDiOp%@tKoCDJBnF,i5m-O'&l0.9ljl>C[i8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqd[^EHHYcb(-WMcSg6q0aA:/1Xbr)2`U!)WVir_W>dqb[8fohb9ArE9)$
+rE05+>?Y50=nl1r=oDJ"=oMV(=nYtl=8>tp=8l;&='59")K'J4EH-#?FEDYLGBeCZH@($fI=?Wp
+J:N3&rdt6)L&Qi,LB*//M>rJ4Mu&D+NVSP5MuS\5M#rKgL]3#WKnP,3K7\Z*J:N,uI=6KiH[:!`
+G^"@TF`__HEcH)<Df9N2D/=!'C2*Z\$>3s^ARo:\@U`bRra,n:?!U]?>?b;1=TV],=8l8#<<-"s
+;u]bq;>sDl:]=,f:&dod9D_?\8cD9W8,YpT7J'"D6hNeC5qB7I[C*HQ]">\k^r""-a2uNLcdC1k
+f@ep7hVdAQjlYgnm-aE7p%J4Xr;D3HJcG6>%Hj4$@p3/?=B/C'=B8K%<W5tt<W5r&;H$On;H$Ik
+r_X8*;,U7h;c-@f;,L+c:JOY\:]4)i;ta&c;?'Pn6N':L7/o^U7f>i+84cBF8kVfN9heAY:f("e
+;cHat<`iL->?kH??X[DRAS#LfC27X'DfKf>Fa&(VH[U?nJqJc3Ll..NO-,TiQ'du/S=ZCIUSXle
+WiW>+Yd:^F\%0,`^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8N\UjQ5Oel07L!m-X6@mfi4No()DE
+rq-?dp\4[^s7u]kr;6Kkrr)KgJcD;@J,~>
+JcC<$ScA?]rr)ior;6Njs7uZh8GDiOp%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqd[^EHHYcb(-WMcSgEJU3cW3ZB5"M)%P\$u4BqR6O7[C#_8qm?4+qQg%(
+qm-+(s0D<VqT&KQqT&WWs2k,[ouRZcbKS2TcHjkbdaQ[peFqDmf)!u"f\+sVfE'UTrm_"urR:bq
+,Lb)hdEp0VE,fl<F*)MHGB\:WH?spcI=6QoJ:N3&JqJ]/L&Qf.LPUccM>rJ5Mu8P5NW"n3O8Y+<
+NVnb8MuS\6M)'mBLPCP;KnP)2JqAQ(J:E#rI=-BgH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$BkV0m
+B)Z?BA7PUJ!F]C8?NFJ=r`fM/>$Co.!a&N*r`0)#<)ifp!`DlmrD<Mis%`Jds%NDbr(?r[rCHcT
+rC6]RogJRBog8OAJcC<$_>c.coC)#0kiLmdj5](Sh;$i@g"G$0f[\F!dEp4bc-4DVcd'bU`l5j3
+_S<an\$u=E!k5\Kp9sh,r^-QNr'^QRs$lrW!_>mSr^qW49MJ5V:Jakb;H$Lo<`W=*=^,-:?=.)L
+@q9.`BPD6uDJsN8FEMePH@('hJ:`E-L5:\FNK90aPa.T'S"-(CTqeE]W2cr$YHY=>[^WfY]Y;.s
+_SjF6aND]NcHstfeCE1'g=k?<hVd>Oj5f=akNV6rlg4$,n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6i
+r;QZerdk*?s*t~>
+JcC<$ScA?]rr)ior;6Njs7uZh8GDiOp%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqd[^EHHYcb(-WMcSg@W-XFK8KA`pl531pl"6ko8EWb!,_LIpm:uG!13&>
+qj7;Lrg<eUS,JiWSai<NTD"lSTD>)WSKFAkDK'T8EcZ>EFa&%SH$Xd`I!pElIt3'#JqAW-KSBD[
+!f)Sfre^Z4s,6f6rf-l:pQ,95rf-i7s,6o7reWCdLPLV=KnY24K7\]+J:N,uI=6KiH[:!`G^"@T
+F`__HEcH)<Df0H0Ci!m&C2%?pB4h-S!G#^>@KBnFra,\4?2e(1>?Y50=TV],=8l5%<E)rr;Z]io
+;>j>k:]F2f:&dod9DhE]8c;3V8,YpT7J0(D6hNeC6%T&es2G!Zo?kLr]X4oGXK/A$WMcVjV5C)d
+U8+HVTqA!KSt2DNRK8hDrg=CcQ'@JrP*(fcN/NOMMi*FMMM_%_qMG2<rBpKNs$crWrC6o[8P/nR
+IS3@/9hnJ\:f1+h;cQk!=BSd2>[:ZC?t*VVAS5[jCM[m,EH6/DGBeF\I=?]uK8#&9M2[FTOHPin
+Q^O>5StMdPUo1/kXKA\1ZF%'L\[oGf^VRe*`Q-'BbK\>ZdF6Uqf@\g2gtgiFi8WeXjlYajl0@U$
+mI'H3nF?)?!V>s_o`Fj]p\ssfq>^<hqu6NmrUg)?s.01?~>
+JcC<$ScA?]rr)ior;6Njs7uZh8GDiOp%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqd[^EHHYcb(-WMcSg6q0g@:/:^crDMiV!)WYjr_W>drD<Dfo2,*@qH<_u
+r`K>,>?b;/=o)=t=oDJ"=oMV(=nYtl=8>te<ul0tEH-#?FEDYLGBeCZH@($fI=?ZrJ:W<(K7ei2
+re:K0Lku%es,-i7r/CW7rJpW5rJpl:r/CZ6s,-f415L^@L5(D9KS+o/Jq8H&IsufoI!^3dH?jaZ
+GBS+NFE;JBEH#i6DJa3+CMR[!BP;$jrac+@A,]p<@:9(A!FB(2>QS,5>5hY+=BAT'<WZ9#<;f_s
+;Gg<i;#a>k:Adid9`@]_9)_E\8GYjT7f5^J7/0.B6Mj%uZa@0M]">Yj^qmq,`Q--Fc-Obdf%A^2
+h;7)Kj5oLilg=02o_&"Tqu$GEs+14?rs[)/D.$dT=BJX+=B8H$<WH+u;Zg!!<)ifprDEu":f1(f
+;,C.f;c3Nj!)`_ks%`Gf!)rSfr)*Jlr^-QNr'^QRs$lrW!_>mSr^qW49MJ5V:Jakb;H$Lo<`W=*
+=^,-:?=.)L@q9.`BPD6uDJsN8FEMePH@('hJ:`E-L5:\FNK90aPa.T'S"-(CTqeE]W2cr$YHY=>
+[^WfY]Y;.s_SjF6aND]NcHstfeCE1'g=k?<hVd>Oj5f=akNV6rlg4$,n*fc9o'uhQo`"Lbp@n=\
+q#C0iqY^6ir;QZerdk*?s*t~>
+JcC<$ScA?]rr)ior;6Njs7uZh8GDiOp%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcb(-WMcSgE/'^XX0;K4!k>_KqR670!k,MDla-Joqm$%(qm$+*
+s,6o9s,Ho7prE9Oq8`NVs2k/\ouRZcbKJ,TcHjncdaQ[peGdtueG7W"f%8O)f%8O+rn7;'!S>p%
+eH"+te,IiCe'c[lDfB]:F*)MHG'A1VH?spcI=6QoJ:N3&K7ei1Knb>;LPYqd!fDnorJ^c9rf6c7
+r/g]7rf7#<rf$l8s,-f4!JlO1L&m!]rdtN/JUi9#IXQWlHiA='H$FOWG'.nKF)l8?E,TW3D/B2e
+"_qabBP1rVAIE$Y@U`bS?sd8I?=!P8#?tA8=]nj/=8c/$<E)rs;u]bq;>j>k:]F2f:&dod9DhE]
+8cD9V8,YpT7J0(E6hNeB6%T&es2=p@rq5dJlK\B1/`YpNi83;FgY1B7f\+g*da?Ijcd0k[bg"GY
+bfIfC_na.(]stP\[^NZR\%&p@[edK46N':L7/fXT7fGpX8,u6\8q'E,9heAY:f("e;c?[s<``F,
+>?kH??XR>QA7]CeBkqO&DfKf>Fa&(VH[U?nJV/Z2Ll%%LO-#NhQ'[l-S=ZCIUSOfdWiN8*Yd1XE
+\%0)_^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8EVTjQ5OekiqBum-X60n*ol<ncA@Srq-?dp\4[^
+s7u]kr;6Kkrr)KgJcD;@J,~>
+JcC<$ScA?]rr)ior;6Njs7uZh9)&&Qp%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcb(-WMcSg@;U4=KSb\Jr/UQ3r/CE/jbiSdokaDir0@>Lm$R[:
+rg<\Q!LfMVS,f,MT)PAUT)>5VT)G3'DfB]:F*)MHG'A1VH?spcI=6QoJ:N3&K7ei1Knb>;LPYqd
+!fDnorJ^c9rf6c7r/g]7rf7#<rf$l8s,-f4!JlO1L&m!]rdtN/JUi9#IXQWlHiA='H$FOWG'.nK
+F)l8?E,TW3D/B2e"_qabBP1rVAIE$Y@U`bS?sd8I?=!P8#?tA8=]nj/=8c/$<E)rs;u]bq;>j>k
+:]F2f:&dod9DhE]8cD9V8,YpT7J0(E6hNeB6%T&es2Y."jNY]V\?`<?XfAD%WMl_mVPU,bU7n9R
+T:VXFS=Q1>S!ob4R@0G/Q'@JrOcb]bN/NOMMi*FMMM_%_qMG2<rBpKNr^HiVr^ZuZ!(m/^IS3@/
+9hnJ\:f1+h;cQk!='8[1>[:ZC?t*VVAS5[jCM[m,EH6/DGBeF\I=?]tK8#&9M2R@SOHPinQ^F84
+StMdPUo1/kX0&S0ZF%'L\[oGf^VRe*`Q-'BbK\>ZdF6Uqf@\g2gtgiFi8WeXjlYail0@U$mI'H3
+nF?)?!V>s_o`Fj]p\ssfq>^<hqu6NmrUg)?s.01?~>
+JcC<$ScA?]rr)ior;6Njs7uZh8GDiOp%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcb(-WMcSg77KjA:/:adr_hrWqG?rarD<AepJ:icrD3Jiq`=[9
+s#TpXr)ir$!*]A+qcWf"q-!Mqs&o>)r`SqspK./mnQ-lPE,fo>FEDYKGBeCZH@($fI=?ZrJ:W<)
+K7no3L5(J=M#N54MMmDkN;nn:Nqe\5OSFn9NrP+<N;nh9MZ/G5Lkkta!JQ4+K*d-\J:N,uI=6Ki
+rd#0%G^"@TF`__HEcH)<Df0H0D#S2RC2%?pB4h-S$Y3aV@UW\Q?XI,G?2e(6>?Y35=]ed-rDiu"
+<)iiqs&/korD<Mis%`Jds%NDbr(?r[r^ciTrC6]RogJUCog8L@.CZgt]"Phm_8=+/`lZEJcHt"i
+f@ep6hV[8NioTCgm-a?5oChtUqu-MFs+14@rti"hB4+kE='&L+<`W4$<`E$s<E3!u;cN`ps&'%u
+;H$@f;,R<js%rqu;,C%a;>s>l:/Ca`!)iMer)*Jlr^-QNr'^NQs$luXs%!,]r^qW49MJ5V:Jakb
+;H$Lo<`W:)=^,-:?=.)L@q9.`BPD6uDJsN8FEMePH@('hJ:W?,L5:\ENK90aPa.T&S"-(CTqeE]
+W2co#YHY=>[^WfY]Y;.s_SjF6aND]NcHstfeCE1'g=k?<hVd>Oj5f=akNM0qlg4$,n*fc9o'uhQ
+o`"Lbp@n=\q#C0iqY^6ir;QZerdk*?s*t~>
+JcC<$ScA?]rr)ior;6Njs7uZh#5@ibp%@tKrpiGHnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcY",WMcSgDh=.LXf8kA\@8sA[f*Z:[^EL0ZN7A<rNc7(qQg%(
+s0;X2rj)K\rf$l:repisr5\NNpW*<T!6P/]p;m<WrlYJhcHjncdf._qeGe"ueG@_mecOIUg&0J'
+f@KrO!7^trrm^ts)K9\9F*)MHG'A1VH?spcI=6QoJ:N3&K7ei2re:H/M#N54MMmDlN;nn;Nr4t;
+OReP4OSt7?NrP+;MueioreWmrLPLV=KnP,3K7\Z)J:E#rI=-BfH?ja[GB\4QFEDSEEH,r9DJj<-
+CMR[!BkV0mAn>OaA7K(X@:3JM?X@#Dr`fJ.>5h\)=9)G%<rZ2"<;ohr;ZBVm;#a>k:Amod9`Ic_
+9)_E]8GYjS7f>dJ7/94C6Ma!!s+13hru^q&m-<isjQ5F\iSWJHgtUQ8g"4g*e'cXkd*Kt\bKKn1
+'$\M<`P]L.^V.1e\$i`S[^N]Tp9sh,r^-QNr'^NQs$luXs%!,]r^qZ59MJ5V:Jakb;H$Lo<`W:)
+=^,-:?=.)L@Us%_BPD6uDJsN8FEMePH@('hJ:W?,L5:\ENK90aPa.T&S"-(BTqeE]W2co#YHY==
+[^WfY]Y2(r_SjF6aND]NcHstfeCE1'g=k?<hVd>Oj5f=akNM0qlg4$,n*fc9o()DPo`+Rcp@n=\
+q#C0iqY^6ir;QZerdk*?s*t~>
+JcC<$ScA?]rr)ior;6Njs7uZh#5@ibp%@tKrpi8CnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcY",WMcSg?u0q7KSKDbpl531oS_skmu-jTp6Y`Ds-N)>qj7;L
+rg<hVS"'DI!1iYOrh&nUr1EeVs.('IEH-&AFEMbNG^4U]H[L6iIXcluJV&N,KSBD[!JcL1M#rQm
+MuJ\8NW5%:O8b73Oo:C?O8k7?NW"e:Mi.Lj5_t2NL5(D8KS+o/JUi9#IXQWlH[:!`G^+FVG'.nK
+F)l8?E,TW3D/=!'C2%BqBP1pgARo=]@U`bR?sd8I?![G7!F&b,=oVS(=8l8#<W?%t;u]bq;>j>k
+:]F2g:&[id9D_?\8cD9W8,PjT7J'"D6hNeB6%T&es2k9Yh9*UP['6[7XK&>#Vl6MjVPU)_U7e3Q
+SY,nP'qCb_R[KP2R[BG.Q'@JsOcb]bNJiYmM?AcoMM_%_qMG2<rBpKNr^HiVr^ZuZ!(m/^InNI0
+9hnJ\:f1+h;cQk!='8[1>[:ZC?t*SUAS5[jCM[m,EH6/DGBeF\I=?]tK8#&9M2R@SOHPinQ^F84
+StD^OUo1/kX0&S0ZEq!K\[oGe^VRe*`Q-'BbK\>ZdF6Uqf@\g2gtgiFi8WeXjlYail0@U$mI'H3
+nF?)?oDeI_o`Fj]p\ssfq>^<hqu6NmrUg)?s.01?~>
+JcC<$ScA?]rr)ior;6Njs7uZh#5@ibp%@tKrpi8CnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcY",WMcSg7R]j@9MPLbs&/Vh!)W/^r)!/crD<AepJ:icr_WPh
+"?8D%3]d*tp0%>rrE0,(r`fD+r)rr$s&oA(rE9)$!*T;'r`T8)r`Sqs!`rE'r)Wo$=8H%l<ukCE
+=)`/!F*)MHG'A1VH?spcI=6QoJ:N3&K7ei2re:H/M#N54MMmDlN;nn;Nr4t;OReP4OSt7?NrP+;
+MueioreWmrLPLV=KnP,3K7\Z)J:E#rI=-BfH?ja[GB\4QFEDSEEH,r9DJj<-CMR[!BkV0mAn>Oa
+A7K(X@:3JM?X@#Dr`fJ.>5h\)=9)G%<rZ2"<;ohr;ZBVm;#a>k:Amod9`Ic_9)_E]8GYjS7f>dJ
+7/94C6M`tq]">Vh^;.V'`5]m@bK\A\eCN:+gYL`EiSik[kN_F%nac>Gq>1$fJcC<$oD]6iTQOgO
+?!(-.=BJO%r`'#!;cEWo$WC#%;H-Oj;Gp@f:]=5k;?p&s;c-@f:Jq*e"&;Wg:]4)i;YErb;?'Pn
+6N':L7/fXT7fGpX8,u6\8q0K-9heAY:f("e;c?[s<``F,>?kH??XR>PA7]CeBkqO&DfKf>Fa&(V
+H[U?nJV/Z2Ll%%LO-#NhQ'[l-S=Z@HUSOfdWiN8*Yd1UD\%0)_]t_D#`5Td<b0/&Td*^=le^rI-
+g>(N@i8EVTjQ5OekiqBum-X60n*ol<o(2nRs7HHep\4[^s7u]kr;6Kkrr)KgJcD;@J,~>
+JcC<$ScA?]rr)ior;6Njs7uZh#5@ibp%@tKrpiAFn*f]3m-O'&l0.9ljQ#7Yi8<AGg=k32e^W'q
+d*BnZb/hWB_ns4(]t:hb[^<BGYcY",W2HJeD17M>Wi3G;\,<Z7[J.*1[C#\7r3H:-rNc1&qQg%(
+s0D[2rj)R1q2G?5!li:$p;['Ms2OcQs2b5^rlXrVs2tAb"3f':dJhPoe,Ikrec""pec42#ec+,"
+fDO;$f)XD$eH"+te,IksE>!;6FEMbNGBnL\H[L6iIXcluK)UB+KS>/8LPYqd!K)g7N;nn;NrG+=
+OT1I0P5^UDOSt7?NW>(<N;ne9MZ/GhLkg_>KnP,3K7\Z)J:E#rI=-BfH?jaZGBS+NFE;JBEH#i7
+DJj<-CMR[!BP;$kAn>OaA,]p<@:9(A#@:\A>[1K;>5hY+=BAT'<rZ/"<;fbq;ZBVn;#a>j:Amod
+9`Ic_9)_E]8GYjS7f>dJ7/94C6Ma!!s+13ks#']EnEK6$jlYU`iSWMJgtUQ9g"4g+e^MsodEg+_
+bfe2RcHa\Ta2Gj1_S<ao\$rcR\@/iUosXb,rBgHMqaCHQs$luXs%!,]r^qZ59MJ5V:Jakb;H$Ln
+<`W:)=^#'8?=.)L@Us%_BPD6uDJsN7F*)SMH@('hJ:W?+L5:\ENK90aPEhK%S"-(BTqeE\W2co#
+YHY==[^WfY]Y2(r_SjF6aND]NcHsteeCE1'g"P6;hVd>Oj5f=akNM0qlg4$,n*fc9o()DPo`+Ua
+p&Ojdq#C0iqY^6ir;HTerdk*?s*t~>
+JcC<$ScA?]rr)ior;6Njs7uZh#5@ibp%@tKrpi8Cn*f]3m-O'&l0.9ljQ#7Yi8<AGg=k32e^W'q
+d*BnZb/hWB_ns4(]t:hb[^<BGYcY",W2HJe?#+J/K8';bpPo33m>LCimYh+(!,_LIo9]EAs-N)>
+qj7;L"dtgIR[]fGS,f,MT)PAUT)YG_ScGDYT)WdCEccDGG'A.UH?spcI=6QoJ:N7NK*?p^L5(J>
+reUZ5MuJ\8NW5%<O8b7@OmJ81OoLOAO8k4?NW+n:MZAY6M):$DL5(D8KS+o/JUi9#IXQWlH[:!`
+G^"@TF`__HEcH)<Df9N2D/=!'C2%?pB4kgfARo<M@KBnFra,n:?!U]?>?b;1=TV],=8l8#<<-"s
+;u]bq;>sDl:]=,f:&[id9D_?\8cD9W8,PjT7J'"D6hNeB6%T&es31KYpsd:!\?iHCXK8G%W2QVk
+VPU,aU7n:[TDtJ_Sc5,YRK/cRQj]4EP`q;nOcPN^Mi%Fjs,-o8M=uc&M>]d>6i0:O7K5jV8,l*[
+8cD>392&&S:/=\_;,U=k<*!%$=]np5>[CcF@U`kZB4u!pCi402EH?5FG^=^bIXm!%KSG;>MiEdZ
+P*;/tR%'V;T:r$UVPpMqXfnt7ZaR?R]"G_k_8=.0a2lEHc-F\`daZh!f\,!6h;7)JioB+]k3(sm
+lKdg(mdKW6nac8Bs7H?as7QHerqQNhs8)Zjrqu`np&9OBSc=3~>
+JcC<$ScA?]rr)ior;6Njs7uZh#5@ibp%@tKrpiAFn*f]3m-O'&l0.9ljQ#7Yi8<AGg=k32e^W'q
+d*BnZb/hWB_ns4(]t:hb[^<BGYcY",W2HJe779[?9hePa;YO&e;"IQ^;"mie;#=&`;#X8j;#=#g
+;#WES3W;)=3V-DP=Su;)>$G37>5DD$>5qb"=T;P(=T)A(>$5#$=9)G%<rH+p=S5`1=E/>$FEDYK
+GB\=YH@($fI=?ZrJ:dcQ"b_SaL51TaM#iKlrf$l:s,R)>rfI/Bm#q@1s,d2?s,I)=rf$l8!/gc4
+1l-pAL4t;6K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9Df0H0Chmg$BkV0mB4b^dA7PUJ!F]C8
+?O'nC?!LW=>?_#/!a&N*r`9&!!*&nqs&/kor_WVjr_EDdr_3>bqb$iZr^clUr'pWRoL/LBog8L@
+-G7%+^qmq+`Q60Dbg4Ybe^rL/gtglGiSrt^l0Ia*nalDJq>:*hJcC<$o`#-FODnZ8=]bT)(KXO7
+<E)ss;H$Uq<)Zao:fL@k;Gg=g;#X;o:f1(fr_Wbo:/4[c:]F2i:]4)i;>*ia;#jMm6N':K7/o^U
+7fGpX8,u6\8q0K-9heAY:f("e;c?Xr<``F,>$P<=?XR>PA7]CeBkqO&DfKc<FEVnTH[U?nJV/W1
+Ll%%LO-#NgQ'[l-S=Z@HUSOccWiN8*Yd1UD\%0)_]t_D#`5Td<b0/&Td*^:ke^rI,g>(N@i8EVT
+jQ5OekiqBum-X60n*ol<o(2nRs7QEc!;HKfs7u]kr;6KkrVcEgJcD;@J,~>
+JcC<$ScA?]rr)ior;6Njs7uZh#5@ibp%@tKrpiMJn*f]3m-O$%l0.9ljQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]t:hb[^<BGYcY",W2HJeC4(u6V5h#6[^NTO[.^m-[.gp!ZM1X"ZMh'.ZN%91
+ZN%92[.fOL`r!aJa8a6\aoBNYaU-,3b0%oObg+P^rmCeqrm^qtr7(Vo!7q/"!S5m%f_sD%f)F2"
+eG[i>e8]MMFEMbNGBeF[H[L6iIXcm!JqJ]/Knb>;LPUeDMMqIms,@#=rf@)@s,m5Br0-l>r0.&A
+s,m>Crf@)>!0-u:!K2j7M):$DL5(D9KS+o/JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0D/=!'
+C2%?pB4baeARo<M@KBnFra,\4?2e(1>?Y50=TV],=8l8#<<-"s;u]_q;>j>k:]F2f:&dod9DhE]
+8c;3V8,YpT7J0(D6hNeB6%T&es2t@"p@@S7lKI?kio/kRhV?l>g=P!/f%&6td*U(ac-4DTbKeDX
+b/_N?_SF"&]XbM\[C3TR[^Wa>[emQ36N0@L7/o^U7fGpX8,u6\8q'E,9heAY:f("e;c?Xr<``F,
+>$P<=?XR>PA7]@dBkqO&DK'T:FEVkRH[U?nJV/W1Ll%%KO-#NgQ'[l,S=Z@HUSOccWiN8*Yd1UC
+\%0)_]t_A"`5Td<b0/&Td*^:ke^rI,g>(N@i8EVTjQ5OekiqBum-O0/n*ol<o)J:bo_%nNp@nR]
+s7u]kr;6KkrVcEgJcD;@J,~>
+JcC<$ScA?]rr)ior;6Njs7uZh#5@ibp%@tKrpi>En*f]3m-O$%l0.9ljQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]t:hb[^<BGYcY",W2HJe?"e8-JVB,ErJ^f9rJgi9m>LCimYh+(s,HtoqeZ7t
+oU#H@l^7U:rg3\RrgNkVrgWtZnXfcQ!20%Ws.B(X+E;FCFEMbNGBeF[H[L6iIXcm!JqJ]/Knb>;
+LPUeDMMqIms,@#=rf@)@s,m5Br0-l>r0.&As,m>Crf@)>!0-u:!K2j7M):$DL5(D9KS+o/JUi9#
+IXQWlH[:!`G^"@TF`__HEcH)<Df0H0D/=!'C2%?pB4baeARo<M@KBnFra,\4?2e(1>?Y50=TV],
+=8l8#<<-"s;u]_q;>j>k:]F2f:&dod9DhE]8c;3V8,YpT7J0(D6hNeB6%T&es3CWelHR>`[Bm'=
+XfSS&W2HPjVPKu^U7\-OT:VXFS=5t;Rf8`TR/`KcQ'@JqP*(lfNfAsRMM[4KMi!;aM#3&,6N0@L
+7/o^U7fGpX8,u6\8q'E,9heAY:f("e;c?Xr<``F,>$P<=?XR>PA7]@dBkqO&DK'T:FEVkRH[U?n
+JV/W1Ll%%KO-#NgQ'[l,S=Z@HUSOccWiN8*Yd1UC\%0)_]t_A"`5Td<b0/&Td*^:ke^rI,g>(N@
+i8EVTjQ5OekiqBum-O0/n*ol<o)J:bo_%nNp@nR]s7u]kr;6KkrVcEgJcD;@J,~>
+JcC<$ScA?]rr)ior;6Njs7uZh#5@ibp%@tKrpi>En*f]3m-O$%l0.9ljQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]t:hb[^<BGYcY",W2HJe779X<8kr8^rD<PkrDEDfp/1Z_q,./gqbQu`r_NPj
+qG7,fr&F^:s#L-?nQG`kr`T8)!aAi3qH<f$!*T"tr`K5'qH<Jn!*B,"r`9)%r`AqupfASXEcZ>F
+G'A.TH?spcI=6QoJ:W<)K7nr5L51P?M2@+Jrf$l:!07&>s,d8Cr0$uApQYT>r0%)Bs,d5@s,I)=
+repl9MZ/GhLkg_>KnY24K7\Z)J:E#rI=-BfH?jaZGBS+NFE;JBEH#i6DJa6,CMR[!BP;$jAn>Oa
+A,]p<@:9(A!FB(2>QS,5>5hY+=BAT'<rZ/"<;fbq;?0Sm;#a>k:Adid9`@]_9)_E\8GYjT7f5^J
+7/0.B6M`to^VI_(`5]j>b082YdaZk$g=tH?i8N\Wk32'rmdK`<p@nF\rVhBJJcGEC(V>93?sHi:
+=&rF'<)lpt<Dugo<)cdo;uBN$;,C+f;,C.g:f1(fr_X#!:/+S^:JX_\:J^sd!DcSd;#F/j;Z&l\
+6i0:O7K5jV8,l*[8cD>292&&S:/=\_;,U=k<*!%$=]np5>[CcF@U`kZAnYmoCi4-0EH?5FGBnO`
+IXm!%KSG;>Mi<^YP*;/tR$sP:T:r$UVPpMqXfnt7ZaI9Q]"G_k^r"%/a2lEHc-F\`daZh!f\,!6
+h;7)JioB+]k3(smlKdg'mdKW6nac8No*+dZp%J+RrqQNhs8)Zjrqu`np&9OBSc=3~>
+JcC<$ScAB^rVc`nr;6Njs7uZh9)&&Qp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+cd'eYaiMK@_ns4(]Xt_a[^<BGYH=n+W2HJeBR5`7VQ.)5rjD@)q6T_!pTaV$qm$1,rj2X1s0M^3
+!4DT\rl+EIqo&QToZ%'TaiV^#aoBKkai_fNc-FY_dF-Lmrm^qtqpbAjqUbburRLqt-.?mUFEDYL
+GBeCZH[L6iIXcm!JqJ]/Knb>;Ll$tGMMmFPNK0%uNrkE*Oo:ICPQ$g8Q2[$IPPpXGOcY\(O"cTR
+NJrgSMi*@JLkg_>KnY24K7\Z)J:E#rI=-BfH?jaZGBS+NFE;JBEH#i6DJa4hCB\HeBP;$jracIJ
+@q&nU@:3GL?=$q:>QS,5>5hY+=BAT'<WZ9#<;ohr;ZBVm;#a>k:Adid9`@]_9)_E\8GYjT7f5^J
+7/0.C6MWous+13orsn_klg!`ujlGCYi83;Fg]#n+efrSmda?Ihcd'eYbK@uPbg"5J`PfU/^qRIm
+\$rcR\@/iT\+[9-\,8Sl6i0:O7K5jV8,l*[8cD>292&&S:/=\_;,U=k<*!%$=BSg4>[CcF@U`kZ
+AnYmoCi+'/EH?5FGBnL^IXm!%KSG;>Mi<[XP*;/tR$sP:T:r$UVPgGpXfen6ZaI6P]"G_k^r"%/
+a2lEHc-F\`daZh!f\,!6h;7)JioB+]k3(smlKdg'mdKW6nac8No*+dZp%J+RrqQNhs8)Zjrqu`n
+p&9OBSc=3~>
+JcC<$ScAB^rVc`nr;6Njs7uZh8GDiOp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+cd'eYaiMK@_ns4(]Xt_a[^<BGYH=n+W2HJe?"e8,J;*o\qMag"mu$Oks,?r:!07%prb_XNqj-l@
+qj%5Kl^7X;rg3\RrgNkVrga"Znt,iQp7D;VqOSsQF*)MHGB\:WH@($fI=?ZrJV&N,KS>/8LPUeD
+MMd=NN/`jXrf7,BOcfU*s-*GHn!3m:rfd;D!g/S+rf8anNK&mUMi3ILM26qAL4t>7K7ec,J:N,u
+I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-rbD[PBkV0mB)Z?LA7K(X@:<PN?X@&Er`fM/>$Co.!a&N*
+r`0)#<)iiqs&/korD<Mis%`Jds%NDbr(?r[rCHcTrC6]RogJRBp-SR@JcC<$d/Po[ai;B.Z*(10
+X/W(rVl$;fV5'cYTq@sKSXuCAS=5n7R$a5-Q^=#'PEV5nP)t`aNJiYmMZ8V7M=uc&M>T^>6i0:O
+7K5jV8,l*[8cD>292&&S:/=\_;,U=k<*!%$=BSg4>[CcF@U`kZAnYmoCi+'/EH?5FGBnL^IXm!%
+KSG;>Mi<[XP*;/tR$sP:T:r$UVPgGpXfen6ZaI6P]"G_k^r"%/a2lEHc-F\`daZh!f\,!6h;7)J
+ioB+]k3(smlKdg'mdKW6nac8No*+dZp%J+RrqQNhs8)Zjrqu`np&9OBSc=3~>
+JcC<$ScAB^rVc`nr;6Njs7uZh8GDiOp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+cd'eYaiMK@_ns4(]Xt_a[^<BGYH=n+W2HJe6psO<8ko4\qG@/e!)WAdqG?ubs%rSgpe^ob!)WMf
+r_N\m3]];!2uku,=o2>#=oDP"=oMS)=nYto=TMW-o2kuor)WVpr)ies,][sJFEMeOG^4U^I!pEl
+It3*%K7ei2L5(J>M2@+IMi<USNfO+"!g&P,rK@2Erfll:rfmDGrK75EOHBI&0TM-PN/W[QMM[1G
+LPCP;KnP)2Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,TW3D/B2e"_qabBP1rVAIE$Y@U`bS?sd8I
+?=!P8!aAi3r`K;)=',B%!``3!r_rhps&&_ks%iYir([2br_*/]r^m&ZqFCKRr'g9Hpd=aAq*?7A
+_o'L8aihlQd*^=mf\,$7h;@/Mj5oIflKdm.o(;YNqY^;Cs+14Drs/J"G\(8i=BGK&!``3"rD`eq
+!*&qrqbe;/;GU.e:f1"a;GU.f;,C%a;,C(b:JOY\:]=/k:Jpg^r)!Glr'LBMqaCHQs$luXs%!,]
+r^qW49MJ5V:Jakb;H$Ln<`W:(=^#'8?=.)L@Us%^BPD6uD/O<4F*)SLH$XjeJ:W?+L5:\EN/j!_
+PEhK%R[ftATqeE\VlHf"Y->4<[C3WW]Y2(q_SjF6aND]NcHsteeCE1'g"P6;hVd>Oj5f=akNM0q
+lg4!+n*fc9o()hP"n_K\p@e7[q#C0iqY^6ir;HTerdk*?s*t~>
+JcC<$ScAB^rVc`nr;6Njs7uZh9DA/Rp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_a[^<BGYH=n+W2HGdBR,W9YG\b8[J[E/Zi7?1ZgY3pZ2Cp(Z2_-/Zi@?2
+Zi7?2[J5[\`;[aU`rF$M`r!aT`q7:OaS![Sap6,6c-FY_dF/$Cs4%%uq:,>m"4YlOf)+)!f)4&G
+F*)MHGB\:WH@($fI=?]sJV&N,KS>/8LPUeDMMmFPNK&sZO-#HcrK@2Es-3GHqj./Hqj.,Es-3PI
+rfR>FOHBI&!KN0=N%U$GM2@%DL5(D9KS+o/JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0Chmg$
+C&VcWB4b^dA7K+Y@UWYP?XI,G?2e(0>?_#/s&]8&r`9&!s&Atrs&/korD<Mis%`Jds%NDbr(?r[
+r^ciTrC6]RogJRBp-SR@JcC<$ci4OPo'ku1kiV!ei8NVNh;$``fHf)!e^Msnd*L"^bfn5Qc-FSW
+a2Z'7^qde#]=GAY[C3TR[^Wa>[emQ36N0@L7/o^U7fGpX8,u6\8c_RYr_7i::Jand;c?Xq<``C+
+>$P<=?XR;OA7]@dBkqO%DK'T:FEVkRH@10lJV/W1Ll%%KNf]EfQ'[l,S"?7GUSOcbWiN8)Yd1UC
+[^iu^]t_A"_o9[;b0/&TcdC1je^rF+g>(N@hr*MSjQ5OekiqBum-O-.n*ol<o(2JFp%A@Y!;HKf
+s7u]kr;6KkrVcEgJcD;@J,~>
+JcC<$ScAB^rVc`nr;6Njs7uZh9DA/Rp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_a[^<BGYH=n+W2HGd>@qo*JqAl>NVnb-Mu8J2MslPkMuSb8NW5"=NVdPk
+D>BLiQi!*KQg0t<Qi<?PRJrZTS,SrXSarBOT)kOSpn%MXr159WFEDYLGBeCZH[L6iIXls"JqJ]/
+Knb>;Ll$tGMi<USNK0'\OH>V'P5gaGPl-gDQMd*HQMZsIPlHsHOogc-OT(:ANfF$s/rPUDM26qA
+L4t>7K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9DJj<-CMR[!rb)jUAn>Oa@q/tW@:3JM?X@&E
+r`fJ.>5h\)=9)G%<rZ2"<;ohr;ZBVm;#a>k:Adid9`@]_9)_E]8GPdS7f5^J7/0.C6MWous+14!
+s!dot`P&aeZEC=2XJr1tVl-AfUSFNUTq@sKSt2C@S!oe5R@'D.Q^F&&rf[hSP)t]`NJ`RMMi*FN
+M2Cq^qhb5;r^6QNs$crWr^ZuZ!(m/^!D?,c9n#i5:f1+h;cHat='/U/>[1TB?t!MTAS,UiCM[j*
+E,fr@G'A4XI"$TsK7nu8M2R=QOHPfmQ^F52StD^OUo(&iX0&P/ZEpsI\[oGe^VI_(`Q-'BbK\>Y
+dF-Opf@S^0gtgiEi8WeXjlYail0@U$m-X91nF?)?oCMVIp&F^cp\ssfq>^<hqu6NlrUp/@s.01?~>
+JcC<$ScAB^rVc`nr;6Njs7uZh8GDiOp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_a[^<BGYH=n+W2HGd77Td=925C_r)!8d!)WAdqb[)cs%rSgpe^ob!)WJe
+s%r\jr&Xj<s#B@JqcNc!!*]/#r`T;)p/q/onQ5cmr)WVpr)iku-ZaBOFa&%SH$XgbI=6QpJ:W<)
+K7nr5L51SAM2I4MN/`gWO,oBaOo:ICPQ-mFQ2?mFQi!*GQ2d*KPQ$^HOcY\(Nrb9#rerIfMM[1G
+LPCP;KnP)2Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\&8,TdARo:\@U`bR?sd8I
+?=!P8!F&b,=oVS(=8l8#<W?%t;u]bq;>j>k:]F2f:&dod9DhE]8cD9V8,YpT7J0(D6hWkB5pF4d
+ai_fNcHjndeCWC-gYL`DioB+^kNV9un*oo?p\=U^rdk*#s7cO"gluhg>$>$1<`o?$#?Ff'<`E!s
+<;of$;Gg@j;Gg:er_X>,:Jt%e:f("d:eje`;,C%a9i"Xb:]X?hp/(Za!)i_]r^6QNs$crWr^ZuZ
+!(m/^!D?,c9n#i5:f1+h;cHat='/U/>[1TB?t!MTAS,UiCM[j*E,fr@G'A4XI"$TsK7nu8M2R=Q
+OHPfmQ^F52StD^OUo(&iX0&P/ZEpsI\[oGe^VI_(`Q-'BbK\>YdF-Opf@S^0gtgiEi8WeXjlYai
+l0@U$m-X91nF?)?oCMVIp&F^cp\ssfq>^<hqu6NlrUp/@s.01?~>
+JcC<$ScAB^rVc`nr;6Njs7uZh8b_rPp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_a[^<BFYH=n+W2HGdATWm/YGni)[.L^%ZMq-)ZM:^(ZM:^)ZMh*4ZEpmE
+[/@?3[f;?aN;pcq`;7IG`qm[R`q@CPaS*aUap?27bg"GZdF$D?e,InmeG[qseGe%tf)XD#eJiRO
+F`qtRH$XdaI=6QoJ:W<)K7nr5LPUeDMMqIm#*"Y(O-#Hcrf[;F!0mGIrg*PMnsKBBs-EVKs-3PI
+rfTR0OH>NaNfB$WN/NRMM26qAL4t;6K7ec,J:N)sI=-BfH?jaZGBS+NFE;JBEH#i7DJj<-CMR[!
+BP;$kAn>OaA,]p<@:9(A!FB(2>lS".>5hY+=BAT'<rZ/"<;fbq;ZBVm;#a>k:Amod9`Ic_9)_E]
+8GPdS7f5^J7/0.B6Ma!!s+13truh(,mcs'#jlPL\i83;FgtCE7f@SO%daHLgcHXSVb/qg*bnJ1<
+`l,^/^qRLm\@AoS[^`cR\@):DosXoer'LBMqaCHQs$luXs%!,]r^m2a9`@b1:/=\`;H$Ln<E<1'
+=^#'8?=.)K@Us%^BPD6tD/O<4F*)SLH$XjdJ:W?+L51VDN/j!_PEhK%R[]n@Tq\?[Vl?`!Y->4<
+[C3TV]Y2(q_Sa@4aND]McHjndeCE1&g"P3:hV[8Mj5]7`kNM0qlg4!*n*fc9rpg9bo_%nNp@nR]
+s7u]kr;6KkrVcEgJcD;@J,~>
+JcC<$ScAB^rVc`nr;6Njs7uZh8b_rPp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_a[^<BFYH=n+W2HGd=_2T$K7f'YN:`%kMZ/P6MXuc+N;nn:Nr=t;D>\2M
+D>0@eQi36LQg0q<Qi<BPRK&`URfo7PS=Q5AT)P>^T)P;WT)YG^Sf;`mF`qtRH$XdaI=6QoJ:W<)
+K7nr5LPUeDMMqIm#*"Y(O-#Hcrf[;F!0mGIrg*PMnsKBBs-EVKs-3PIrfTR0OH>NaNfB$WN/NRM
+M26qAL4t;6K7ec,J:N)sI=-BfH?jaZGBS+NFE;JBEH#i7DJj<-CMR[!BP;$kAn>OaA,]p<@:9(A
+!FB(2>lS".>5hY+=BAT'<rZ/"<;fbq;ZBVm;#a>k:Amod9`Ic_9)_E]8GPdS7f5^J7/0.B6Ma!!
+s+14#rseDA`Po6kYcY".WMuhorh^$uUS=EST:hgISY#hM$(@9LR$X,*R$Es9PR`k<OH5E]N/NOL
+MMd=JMXZH&62X(K6i0:O7K5jV8,l*[8cD<_92,=ZG>:q1;,U=k<)lt#=BSg4>[CcF@:EbYAnYmo
+CMds.EH?5FGBnL^I=Qm$KSG8=Mi<[XP*;/tR$sM9T:r!TVPgDoXfen6ZaI6O]"G_k^r"".`lQ<G
+bg+P^daZh!f@em4h;7&IiT&t[k3(smlKdg'mI0N5nc&(`oCV_Kp@e7[q#C0iqY^6ir;HTerdk*?
+s*t~>
+JcC<$ScAB^rVc`nr;6Njs7uZh8b_rPp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_a[^<BFYH=n+W2HGd6q0X<9hnIY;#X5j;"mi`;#4&h;#=&`;#O/i;#*le
+;#=#g;#<9S3BHJ/qH3;kr`T;)oN;#oo2tunr)WVpr)ir")fp+DG'A1VH?sseI=?ZrJV&N,KS>/9
+Ll$tGMuJY>NK0'\OH>V(P5g^GPl6mHQN!6AR/NBOQMm*KPlHsHP!P4lOH5H_NK&mUMi*@JLkg_>
+KnP,3K7\Z)J:;opI!^0cH$FOWG'.nKF)l8?E,TZ4DJa3*CMIQsBP1siAS#C^raGn:@/aL6?=!P8
+s'#J,r`K;)=',B%s&B%urDW_os&&_ks%iYirD!8bs%E5]r^m)[q+(BQr'g9Hpd=^@qEZ:FbKS5U
+cdC1jf%A[1gtglHioK4`kiqF"n+#uApA+R_rdk*#s7lU2_M;i6?WgK5<``:#<E3!u;c?Rn;c?Rl
+;uTZ!;c-=e;,C-g:^Klo;Gg:e:JOb`r_ESj:f73g!DZJ\;#io[6N0@L7/o^U7fGpX8,u6\8c_RY
+r_7T3:Jand;c?Xq<``C+>$P<=?XR;OA7]@dBkqL$DK'T:FEVkRH@1-kJV/W1LP^qJNf]EfQ'[l,
+S"?7GU84ZaWN3/(Yd1UC[^`o]]t_A"_o9X:b0/#ScdC1je^rF+g=tH?hr*JRj5oFdkiqBum-O-.
+n*olHncn^Xp%A%Pp\ssfq>^<hqu6NlrUp/@s.01?~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eog\TFo()>?n*f]3m-O$%l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_`[^<BFYH=n+W2HGdTlGp\Xfo.=Zhq-.Zi@?1Zhh!'Z2_-)YlM*'Z2_-.
+ZNRS?Za@+;[K!Z=\%%BUNK*pr!5eZOqSi-IqSiHRoZ-sPprWQY#g:H9c-FY^dF.sA!n>cNrmUqs
+r7(\qrmUqurmq)#+kG2oe9#kXGBnL\H[U<kIt3*%K7ei2L51SAM2I4MN/`ksNrb?)rfR>HPa)04
+s-E\OqO$oCqj@DMs-EVK6'RRsP*1riOH5H_NfB!VMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FOW
+G'.nKF)l8?E,TW3D/=$(CMIQsBP1rVAH?=OraGn:@/aL6?=!P8!aAi3r`K;)=',B%s&B%urDW_o
+!)`\ks%iVhrD!8bs%E5]r^m)[qFCHQrC-?Hq*XgAq*BT3JcF4!2>6P*l0.<lj5JqShqQr?g"=s/
+f$r0sd*L%`c-+;QbKS8VaiDB=_SEq%]Y(ea\$WTR[^N[6[K&Vk6N0@L7/o^U7fGpX8,u6\8c_RY
+r_7T3:Jakc;c?Xq<``C+>$P<=?XR;OA7]@dBkhF#DK'T:FEVkRH@1-jJV/W1LP^qJNfT?eQ'Rf+
+S"?7GU84ZaWN3/(Yd1UC[^`o]]t_A"_o9X:aihoRcdC1je^i@*g=tH?hr*JRj5oFdkiqBum-O--
+n*olHncn^Xp%A%Pp\jjgq>0scqu6NlrUp/@s.01?~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eogJHDo()>?n*f]3m-O$%l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_`[^<BFYH=n+W2HGdTjhqcJV8mUN;\\7MZ/OsM?&S5MXuc+N;nn9Nr4n:
+D#\AOC]]ohQhQg9Qi<<MQfa\7R0/nIS"0GJnt,iQ!1s.[qk!h[s.16QG'A.UH?spdI=?ZrJV&N,
+KS>/9Ll$tGMi<USNrG(?OHKO*!gAk5rg!MLs-NSLoU5TDs-NbOrKT[5PEV/mOcb`dO,f6[N/W[P
+M2@%DL5(D8K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$BkV0mB)Z?BA7PUJ!F]C8
+?NFJ=r`fM/>$Co.!a&N*r`9&!!*&nqs&&horD<Mir_EDdr_3>bqb$iZr^clUr'pWRoL/LBog8I?
+JcC<$fDdnkaiD<,Z*(1/Wi<"rVl$;fUnj`XTV%gJSt)@?S!oe5R$X2+R@'8)PEM)kOcYT`NJi[N
+M2I1KM2LeZ!($NLr^6QNs$crWr^ZuZ!(m/^!D?,c9m9?.:f(%g;cHat='/U/>[1TB?t!MTAS,Ui
+C27[(E,fr@G'A4XI!pKqK7nu7M2R=QO-5]lQC+,1StD^NUo(&hX0&P/ZEpsI\@T>d^VI_(`Q$!@
+bKS8XdF-Opf%8U/gYL`Di8N_VjlYail0@U$m-X60nF?MK#4qK[p%J+RrV-HiqYL-erqu`np&9OB
+Sc=3~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eogJHDo()>?n*f]3m-O$%l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_`[^<BFYH=n+W2HGdTgV@A9MSCV;#!o_;#=)i;#=&`;#a>j;"@E];#369
+=nl+k=oVY*=n>bo=oMM'=8Q,"=8uD%=8Z+p=8l;F='/O*FEVkPH$Xd`I=6QoJ:W<)K7nr5LPUeD
+MMmFPNK4"!!K`HCOogi3Pl?sJQN*<JR.QgDR/`NQQMm(7P`q;oP*(lgO,o<]NJrgSMM[1GLPCP;
+KS+o/JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0Ci!m&C2%?pB4h-S!G#^>@KBnFra,\4?2e(1
+>?Y50=TV],=8l8#<<-"s;u]_q;>j>k:]=,f:&[id9D_?\8cD9W8,PjT7J'"D6hNeA5p4=pcHsqd
+e(*('g=tH@i8`nZk32'plg=33o_&"Tqu$GEs+14GrsPuVA78_G=&r=&<E9#t"]\K"<E3#s;?Kip
+;,[?is%j,!;Gg7e;,U4e:/=_ar_NPhs%iVj!DcP];#io[6N0@L7/o^U7fGpX8,u6\8c_RYr_7T3
+:Jakc;c?Xq<``C+>$P<=?XR;OA7]@dBkhF#DK'T:FEVkRH@1-jJV/W1LP^qJNfT?eQ'Rf+S"?7G
+U84ZaWN3/(Yd1UC[^`o]]t_A"_o9X:aihoRcdC1je^i@*g=tH?hr*JRj5oFdkiqBum-O--n*olH
+ncn^Xp%A%Pp\jjgq>0scqu6NlrUp/@s.01?~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eogJHDo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=k*W2HGdTl>[NVm3?%Zi@E1ZhUj+Z2V!%Z2_&uZ2_-+Zi@E1
+[K!Z8\,No:N<"q:NW-fm_u%CE`qdUR`q.7Ma8j?\aT'B]ap?27bg"GZd*^;>e,Rntec+(te,Ikq
+ec+(teH"2"f-8erFa&%SH?spcI=?ZrJV&N,KSG5:Ll$tGMi<USNfT6_OoCLEPEc'3s-E\OrL!SP
+rgNMLrL3_RrL!VOs-EYL!L/fIOo^],rf9L.NJrgSMM[1GLPCP;KS+o/JUi9#IXQWlH[:!`G^"@T
+F`__HEcH)<Df0H0Chmg$Bk_6oB4b^dA7T1Z@UW\Q?XI,G?2e(7>?Y35=]ed-=8l5%<E)rs;u]bq
+;>j>k:]F2f:&dod9DhE\8cD9W8,YpT7J0(D6hNeA6%T&es472Wqt9FDlK@<lj5T"rh>l@1g&KYK
+eC2jod*L"^bfe/Nb08)Qa2Q!5_8*h"]t(Y_[(!KQ[^NZSn?r<_r'LBMqaCHQs$luXs%!,]r^m2a
+9`@b1:/=\_;H$Ln<E<1'=^#'8?=.)K@Us%^BPD3sD/O<4F*)SLH$XjdIt<6*L51VDN/is^PEhH$
+R[]k?Tq\?[Vl?`!Y->4<[C3TU]Y2(q_Sa@4aN;WLcHjndeCE.%g"P3:hV[8Mj5]7`kNM0qlg4!*
+mdKZ8rpg9bo_%nNp@nO\!r;]hr;6KkrVcEgJcD;@J,~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eogJHDo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=k*W2HGdTj_e]It`XSN;SV"MZ&D,MXuc+N;nn9Nr"b7D#eDO
+D>ok"Qhm$:QiEBNQfa\6RK&`ZS=Q4BSarBOT)bJ]Sbo#YT-/9#GBeF[H[L6jIt3*%K7ei3L51SA
+M2I4MN/`jYO-#M'Oo^c2rg!MLs-N\OrgEbSopboKrgE_Ps-NbOrfmMKPQ$^GOc]R'7?3@dN/NRM
+M26qAL4t;5K7\Z)J:E#rI=-BfH?jaZGBS+NFE;JBEH#i6DJa3*CMIQtBP;$jAS#C_@q&nU@:3GL
+?=$q:>R4P;>$5!1=BAT'<WZ9#<;ohr;ZBVm;#a>k:Adid9`@]_9)V?\8GYjT7f5^J7/0.B6MWou
+s+14'rsd]']XY>RY-"_'Wi)blrhUC*TqS*OTV%gIS=5n9R[KP1QBml)Pa263s,m>C$'("(Mi!:K
+MMmA[M#]j>6N0@L7/o^U7fGpX8,u6\8c_RYr_7T3:Jakc;c?Xq<``C+>$P<=?XR;OA7]@dBkhF#
+DK'T:FEVkRH@1-jJV/W1LP^qJNfT?eQ'Rf+S"61FU84ZaWN3/(Yd1UC[^`l\]t_A"_o9X:aihoR
+cdC1je^i@*g=tH?hr*JRj5oFdkiqBum-O--n*olHncn^Xp%A%Pp\jjgq>0scqu6NlrUp/@s.01?~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eogJHDo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=k*W2HGdTgV@@9287\;#=)i;#!o`;#=,i;#F,a:]O;i;"7?]
+;#aDh3ojH>=S#Yr>$:Dur`T5&s&T2&qcEf"r`B"uq,dPts&U=cGB\:XH@($fIXcm!JqJ]/L5(J>
+M2@+JN/WaVO,oBbrfR;GPl?sJQN*<MR/WNQRe<0KRf8`RR/`NQQN!-MP`u*0!KiKCO%#(gN/W[P
+M2@%DL5(D8K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9DJj<-CMR[!BkV0mAn>OaA7K(X@:<PN
+?X@&Er`f_5>$>'3=BJX+r`0)#<)iiqs&/korD<Mis%`Jds%NDbr(?oZr^clUrC6]RogJRBog8I?
++3`$WdaHXrf\,$7hVdAQjQ5OglKdj)nFH5Fq"agbrdk*#s82g5jI::%=BSd.<``@&<`2mr<Dugq
+;c?Rl<;oeq;$Tln;,C+d:f73g!)rkn!)NSjr_ESj:f73gs%i)\!($NLr^6QNs$crWr^ZuZ!(m/^
+!D?,c9m9?.:f(%g;cHat='/U/>[1TB?t!MTAS,UiC27[(E,fr@G'A4XI!pKqK7nu7M2R=QO-5]l
+QC+,1SY)UMUo(&hX0&P/ZEpsI\@K8c^VI_(`Q$!@bKS8XdF-Opf%8U/gYL`Di8N_VjlYail0@U$
+m-X60nF?MK#4qK[p%J+RrV-HiqYL-erqu`np&9OBSc=3~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eogJHDo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=k*W2?AcTl#7BTrb3dZN7A<rj)R/!O/j)Yl:m.Yd+&/p9FY'
+rNcX4Za7$Gr3ZU7\$u=G!4i&gs,Hom"N/0r_o)Ai!6+WNpr*6Qqo8]Vq8`?Qs2k8_#g:H9c-FY^
+dF.sArmV"ueC=HGs4%%ur7(bs!7q/$)Kp=LH$XgbI=?ZrJ:`E+KS>/9Ll$tGMi<UTrf75EOcklk
+Pl?sJQ2m9MR/`TSReiNKSGAZSRfAfSQp@"(QBd`"P`q8nOcb`dO,f3YN/NRMM26qAL4t;5K7\Z)
+J:E#rI=-BfH?jaZGBS+NFE;JBEH#i6DJa3*CMIS_BFnfgAS#C_@q&nU?sm>K?=$q:>QJ&4r`T8'
+!*B/#s&K(ur_rhps&&_ks%iYir([2br_*/]r^m)[q+(BQr'g9Hq*XgApd'K2JcFC&"S_HSlKJ60
+($"<3hqd)Cg"P'/e^N!qd*Bt`c-4B1aVN1Hb/_K=^qde$]Y(e`[^3BN\@/lU[ICU)62X(K6i0:O
+7K5jV8,l*[8cD<_92,=ZG>:q1:f:4j<)lt#=BSg3>[:]E@:EbYAnYmnCMds.EH?5FGBnL^I=Hd"
+KSG8=Mi<[WOcu&rR$sM8T:r!TVPgDnXfen5ZaI6O\\#Pi^r"".`lQ9Fbg+P^daZguf@em4h;7&I
+iT&t[k2tmll0I^&mI'H4nc&([oCW%T!VZ9dp]C9fqY^6ir;HTerdk*?s*t~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eogJHDo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=k*W2?AcTjDJUI=m7ON;\\#MYN&,MXuc+N;nn8Nr"_8Nr*\j
+Q3<PAR$X0:QLU:AR/<6IQiNK?R/NEUR[]h<Sa`6MT)bJ]SbnusG'A1VH@($fIXcluJqJ]/KnbA=
+M2@+JN/WerNs1W-P*2#nrg!ML!13YOs-`nUqO@8Mq4%DQs-`hQ5aRe&Q'ISuPEM)kOcYWbNfB!V
+Mi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\&8,TdARo=]@U`bR
+?sd8I?=!P8!F&b,=oVS(=8l8#<W?%t;u]bq;>j>k:]F2f:&dod9DhE]8cD9V8,YpT7J0(E6hNe@
+6%T&es4mVtm`rnp[^<6?X/`/!Vl-DhV50lZTqJ'NSt;IBR[]_6R@*u>".>I>Pl?jJOcYY'N<>&p
+Ll)+gm>1g/r'LBMqaCHQs$luXs%!,]r^m2a9`@b1:/=\_;H$Ln<E<1'=^#$7?!guJ@Us%^BPD3s
+D/O<4F*)SLH$XjdIt30)L51VDN/is]PEhH$R[]k?Tq\?[Vl?\uY->1;[C3TU]=ktp_Sa@4aN;WL
+cHjndeCE.%g"P3:hV[8Mj5]7`k32'olg4!*mdKZ8rpg*]o`"Lap@nO\!r;]hr;6KkrVcEgJcD;@
+J,~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eog\TFo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=k*W2?AcTgV:>8kVlT;".?X;#=)i;#=&\;"7?\;#aAm;YrNO
+=oV[o=nGhn=T_c/=]kQ(nlYlos&f2#!*K2$s&f8%qH!Jpr`C(^GBeCZH[L6jIt3'$K7ei2L51SA
+M2I4MN/mmu"d"k0P*;.0Q2d-MQi3<ORK&`PS+rNLS,\rWRJiL<Q^3r&Q'@MsP*1riOH5H_NJrgS
+MM[1GLPCP;KS+o/JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0Chmg$C&VcWB4b^dA7T1Z@UWYP
+?XI,G?2e(0>?_#/s&]8&r`9&!s&Atrs&/korD<Mis%`Jds%NDbr(?r[r^ciTrC6]RogJUCog8F>
+*RE-]e(*(&gYCZCi8WeXk32'pm-X93oCVeQqu$ACs+14IrsQYtBOY:M='&F'<E9#t"BJK#<)iip
+##eDs;Gp@gr_`\l!)NSj%8Thu:f'n^:esh^:JO[a:]F8k:[_-\62X(K6i0:O7K5jV8,l*[8cD<_
+92,=ZG>:q1:f:4j<)lt#=BSg3>[:]E@:EbYAnYmnCMds.EH?5FGBnL^I=Hd"KSG8=Mi<[WOcu&r
+R$sM8T:r!TVPgDnXfen5ZaI6O\\#Pi^r"".`lQ9Fbg+P^daZguf@em4h;7&IiT&t[k2tmll0I^&
+mI'H4nc&([oCW%T!VZ9dp]C9fqY^6ir;HTerdk*?s*t~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eogJHDo()>?n*f]3m-Es$ki_*ijQ#7Xi83;Fg=b*/e^W$p
+cd'bXaiMK@_nj+%]Xt_`[^<?EYH=k*W2?AcTkf(;UTC9cZi@?0Z1P7&Z*:I9r361*!3l=)s0D[2
+rj)R1s0V^3!4Mm9rjW'@]">WSNrP+7_>qLQ`;RUQ`;[aM`q[LQ`r!gV`qd[PaT'B\b5]Zhc-FY^
+dF.sArm^ens4%%uqp[+Gf%5+iH$XdaI=6TqJ:W?*KS>/9Ll$tGN/WaVO,oBbP*2#nPa.N"Q^@]=
+!h#LGr1!\UrLNbUrLNqXr1!_T!1EeQ!LK,OPl[,5rfTI-OH5H_NJrgSMM[1GLPCP;KS+o/JUi9#
+IXQWlH[9s^GB\4QFEDSEEH,r:Df0H0Chmg$BkV0mB4b^dA7PUJ!F]C8?O'nC?!LW=>?_#/s&]8&
+r`9&!s&Atrs&/korD<Mis%`Mer_3>bqb$iZr^ciTrC6]RogJRBog8I?JcC<$gA_WUna#H'k2k[_
+i8EMKh#>t7f@JI#e'cOecd'bXrl>\pc-48I`507*^V7@k[^NNN[JmW7\*pa*62X(K6i0:O7K5jU
+7t+!#8P2TJ9MA/T:/=\_;,^Cm<E<1'=^#$7?!grI@Uit]BP;-rD/O<4F*)SLH$XjdIt3-(L51VC
+N/is]PEhH$R[]k>Tq\?[Vl?\uY->1;[C3TU]=ktp_Sa@4aN;WLcHjndeC<($g"P3:h;@/Lj5]7`
+k32'olg4!*mf2_ZnF?)?oCW%T!VZ9dp]1-hqYg<jr;HTerdk*?s*t~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eogeZGo()>?n*f]3m-Es$ki_*ijQ#7Xi83;Fg=b*/e^W$p
+cd'bXaiMK@_nj+%]Xt_`[^<?EYH=k*W2?AcTjDDQI=d'/N/[[ml\bLprJL3)s,?u;r/UT4!fi>&
+rbhaQq3D#Irg<_Pr0Hl>s-W_Nqj@DMl^.jDR[]h<SbJ]USbo#XT)bJ]Sc,/[G9qN\H@1-hIt3'#
+K7ei2L51SAM2I7NNK0'\OHG]hPE_;sQ'Rc'rg3bTR[X/Drg`qXq4@PUrg`nUs-`qUrKmVPQN!-M
+P`u*05*:qfO,f3YN/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH$FOWG'.nKF)l8?E,]`5DJa3*CMIQs
+BP1siAS#C^raGn:@/aL<?<piA>[(E9r`T8'!*B/#s&K(ur_rhps&&_ks%iYirD!8bs%E5]r^m)[
+q+(BQr'g9Hpd=^@q*BT3JcFU,-fiIe^9t8LXK&;"WMcYkV50l]TqS-PSXuFBS!fb8R@'>,QC!u)
+Pl?gTOckfeNfAsSLl%"HMi6tZ!($NLr^6QNs$crWrC;<-8P)NH92&#R9hnJ\:f1.i<)lt#=BSg3
+>[:]D@:E_XAnYjmCMds.EH?5FGBnL^I=Hd!KSG8=MN!RVOcu&rR$sM8StVmSVPgDnXfen5ZaI6O
+\\#Pi^r"".`lQ9Fbg+P^daZdtf@em4h;-uHiT&t[k2tmll0I^&mI(#C"n;'Qo(2MQo`=d\rV-Bg
+rqcTjrqu`np&9OBSc=3~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eogeZGo()>?n*f]3m-Es$ki_*ijQ#7Xi83;Fg=b*/e^W$p
+cd'bXaiMK@_nj+%]Xt_`[^<?EYH=k*W2?AcTgV=<91quV:f-UXrD<Dhs%rSgoMG$Qs%r\l!`Dlm
+r]:-A3VZbV>4bte=Sl8$=9;W-=T)Cm=T2J'=Su8#=T2D%=T2Cu<r5rH=Eet7H?sseI=HctJV/T.
+KnbA=M2@+KN/`jYO-#KeP*;,pQ'IZ%Qi<?RR@9TBS,SrVSb\lUSc5/WS,\oWRJiKRQ^7W9!L/fI
+P!5"iO,o<\N/W[PM2@%DL5(D8K7ec,J:N,uI=6KiH?jaZGBS+NFE;JBEH#l8DJj<-CMR[!BP;$k
+An>OaA,]p<@:9(A#@:\A>[1K;>5h\)=9)G%<rZ2"<;ohr;ZBVm;#a>k:Amod9`Ic_9)_E]8GPdS
+7f5^J7/0.B6MWqIdMgWdf\,$8hV[;Oj5oFelKdg)n+-)Dp\F^`rdk*#s8;m)Y'aec>?P$.<``:"
+r_s/';c?Xo;c6Ikr_ibn&l;J':f'q`:esna;G^1b9i4\_r_EVk:Jjpe:]O;Z;#io[6N0@L7/o^U
+7f>i+84cBF8kViO9heAY:f("f;cHat='/U/>?kH@?X[DRAS,UhC27[(E,fr@G'A4XI!pKpJqSl6
+M2I7PO-,WkQC+,1SXuOLUo(&hWi`G.Z*UjH\@K5b^VI_(`Q$!@bKS8XdF-Oof%8U/gYL]Ci8N_V
+jlY^hl07O#m-X6@mfi4No()DErq-<cp\jjeq>U6hqu6NlrUp/@s.01?~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/_PoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f%&9u
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wi2ejUS2CGN2NnV[/@91ZM^uuYkbL$YkkX)Z2h60ZN%92
+[/@<3[f3c8\-9FS]=bhkr/UQhpr!*Lrl+WOpr36PrQ"lVqT&HRrQ5>fbg"GYd*_a>rm^ens4%)!
+qU@%GGBeF[H[U<kJ:N3&K7nr5LPUeDMi<USNfT6_OcklkPa.N"Q^=),R@0NBS,]#YSbJ`TTD5#W
+Sc>5ZS,\oWRJrTRQU-q&Q'@JrP*1rhO,o<\N/W[PM2@%DL5(D8K7ec,J:N)sI=-BfH?jaZGBS+N
+FE;JBEH#i6DJa3+CMR[!BP;$jrac+@A,]p<@:9(A!FB(2>lS".>5hY+=BAT'<rZ/"<;fbq;ZBVm
+;#a>k:Amod9`Ic_9)_E]8GPdS7f5^J7/0.B6MWous+14+rsnhrn*B6%kN1dai8EMKh#>tQf@AC"
+daHCcc-=JTb/q`KbKIrF_ns4(^:_"d[C!<K\%&lT\$c.BosOfcr'L?Lr'^QRs$lrWIRm%%8kM`M
+9MJ5V:Jakb;c?Xq<``C+>$G6;?XI5N@qB7cBPM="DK'T:FEVkRH@1-jJ:`H/LP^nINfT<dQ'Rf+
+S"6.EU84W`WN*&&Yd(OB[^`l[]YD8!_o9X:aihoRcdC1jeCN7)g=tH>hr*JRj5oFckiq?tm-O--
+s6g-\nac8Bo`"Lap@nO\s7u]krVQTlrVcEgJcD;@J,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/_PoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f%&9u
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wi2ejUS1n'EdraoM>W;3MZ8P%MYDu-MXuc+N;nn7Nr"_8
+Nr>%:DYTOtQi3<OQiE?PQ^70.rg<SLrL!PMm?e$ER[]h<m[jHN!1s.[s.1]aG^=[_I=6QpJ:W<)
+KS>/9Ll$tHN/WaVO,oBbP*2#nQ'IZ%Q^F/.R@=)Ds.'+[pR_AVpn%JUs.'(Xs-`qUrg<_P6'de$
+P`q;oP*(ieO,f3YN/NRMM26qAL4t;5K7\Z)J:;opI!^0cH$FOWG'.nKF)l8?E,TW3D/=$(CMIQs
+BP1rVAH?=OraGn:@/aL6?=!P8s'#J,r`K;)=',B%s&B%urDW_os&&_ks%iYirD!8bs%E5]r^m)[
+q+(BQr'g9Hpd=^@q*BT3JcF[.)V<$L\$N<@X/i8"Wi)blV50l]TqS*MSXuCArL+"ZQ^F,)Q^!c"
+rf[VMOH>K^N/EIKrJCW3MXQE%62X(J6i9@P7K5jU7t+!#8P2TJ9MA/T:/=\_;,^Cm<E<1'=^#$7
+?!grI@Uit]BP;-rD/O<4F*)SLH$XjdIt3-(L51VCN/is]PEhH$R[]k>Tq\?ZVl?\tY->1;[C3TU
+]=bno_Sa@4aN;WLcHjndeC<($g"P3:h;@/Lj5]7`k32'olg4!*mf2_ZnF?)?oCW%T!VZ9dq#C0i
+qYg<jr;HTerdk*?s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/_PoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f%&9u
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wi2ejUS1.H77g-G:ZbOS;#=&\;".9[;#aAm;Z0Gn3BI.$
+p0%Auq,urarE9#"r`SbnrE0,&r)`l"r`9)%r`Aqsr)Y@lG^=[_I=6QpJ:W<)KS>/9Ll$tHN/WaV
+O,oBbP*2#nQ'IZ%Q^F/.R@=)Ds.'+[pR_AVpn%JUs.'(Xs-`qUrg<_P6'de$P`q;oP*(ieO,f3Y
+N/NRMM26qAL4t;5K7\Z)J:;opI!^0cH$FOWG'.nKF)l8?E,TW3D/=$(CMIQsBP1rVAH?=OraGn:
+@/aL6?=!P8s'#J,r`K;)=',B%s&B%urDW_os&&_ks%iYirD!8bs%E5]r^m)[q+(BQr'g9Hpd=^@
+q*>tKe^rI.gtglGiT'"\kiqBumI'N8o_/%TqYU8Cs+14Lrs[kREa`?Z=BAO'<`W/u<!cQ';GpIm
+;c-Cir_`Ph#u4;n:JFV^:ejgc;#O2i:]O;j;#a;Z;?&r[6N':L7/o^U7f>i+84cBF8kViO9heAY
+:f("f;cHat='/U/>?kH@?X[DRAS,UhC27[(E,fr@G'A4XI!pKpJqSl6M2I7PO-,WkQC+,1SXuOL
+UnsugWiWA-Z*UjH\@K5a^VI_(`Q$!@bKS8XdF-Oof%8U/gYL]Ci8N_VjlY^hl07O#m-X6@mfi4N
+o()DErq-<cp\jmeq>^<iqu6NlrUp/@s.01?~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/hSoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_%f\$iZLYck10Wi)_iU7l7BMQ!bY['I$Erj)R/oW\:trN?"#s02C*s0;X0
+rNcI0rj;X3rjDg9rj`!="hVF\^;%J^NqL9a_u@UR`V7CI`VmgVa8<mRa83jWao9EebKS5VcHsu7
+df@noe+qMndiNaZH@($fIXcm!JqJ`1L51SAM2R=ONK0'\OHPcjPl?pPQC!u+R@0NCS,]#YSc,/Y
+TC\`TTDY;\SH,2ZS,\oWRJrQSQ^7W94d;.nP*(ieO,f3YN/NRMM26qAL4t;5K7SQ'IsufoI!^0c
+H$FOWG'.nKF)l8?E,TW3D/=!'C2.HrBP1rVAIE$Y@U`bS?sd8I?=!P8!aAi3r`K;)=',B%!``3!
+rDNbq;,R9gs%iYir([2br_*/]rCQuZqFCKRr'g9Hpd=^@pd'K2JcFX-2"pP.lKIHojlGI[i8<AG
+g=b02e^W'rd`p(^c-4;OaN)KIaiD?;^qdXs]XbM[ZEpsI[^Gq>osOfcr'L?Lr'^QRs$lrWIRm%%
+8kM`M9MJ5V:Jakb;H$Op<``C+>$G6;?XI5N@qB7cBPM="DK'T:FEVkRH@1-jJ:`E.LP^nINfT<c
+Q'Rf+S"6.EU84W`WN*&&Yd(OB[^`l[]YD8!_o9X:aihoRcdC1ieCN7)g=tH>hr*JRj5oFckiq?t
+m-O--s6g-\nac8Bo`"Lap@nO\s7u]krVQTlrVcEgJcD;@J,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/\OoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_%f\$iZLYck10Wi)_iU7kb#Dgd7jrJUZ4r/(0*nqmC(oS`a.rf-i9q2P<5
+!0I.sop5WEr0Zi;rg<PKs-W\Mm[+-FR[]h<l^n'G*dDsVH[L6jIt3*%K7nr5LPUeDMi<USNfT6_
+P*2#nrfm\RQ^F/.R@=,Es.'+[rLWt[o:Z)Tr1<qZ!1a%Xs-`qUrg3_QQN!.4P`q8nOcYWbNfB!V
+Mi*@JLkg_>KnP)2JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0Chmg$C2%?pB4h-S$Y3aV@UW\Q
+?XI,G?2e(1>?Y50=TV],=8l5%<E)rr;Z]io;>j>k:]F2f:&dod9DhE\8cD9W8,YpT7J0(D6hNe@
+6%T&es5X,=m`rnn[Bm'<WiN/!Wi)blV50i\TqJ$LSXuCAR[TY4R$X,)Pa@Z#PEM)kOcPN_NJi[M
+M2I4LMX?9#62X(J6i9@P7K5jU7t+!#8P2TJ9MA/T:/=\_;,U=l<E<1'=^#$7?!grI@Uit]BP;-r
+D/O<4F*)SLH$XjdIt3-'L51VCN/is]P*M?#R[]k>Tq\?ZVl?\tY->1;[C3TU]=bno_Sa@4aN;WL
+cHjnde'ut#g"P3:h;@/Lj5]7`k32'olg4!*mf2_ZnF?)?oCW%T!VZ9dq#C0iqYg<jr;HTerdk*?
+s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_%f\$iZLYck10Wi)_iU7jtE7S6<J:JgFUrD<8bohbEZ!)WJes%rMg!)WVS
+o3)&rr`S8`s&o,!!*T,"!*B#!rE0,&r)`eu!`rK+r`Attr`:.cH$XgbI=?ZrJV&N-KnbA=M2@.L
+N/`jYO-#NfPEc'3#*tUCR$jA2rgWqXs.0+[rL`\Srh'+[s.'.[rgWqV!1EhR!LK,OPs(@qP*1rh
+O,o<\N/W[PM2@%DL5(D8K7e`*J:E#rI=-BfH?jaZGBS+NFE;JBEH#i6DJa3*CMITuBP;$jracIJ
+@q&nU@:3GL?=$q:>QS,5>5hY+=BAT'<WZ9#<;f_s;Gg<i;#a>k:Adid9`@]_9)V?\8GYjT7f5^J
+7/0.B6MNhbf%A^2h;7&JioB._kiqF"mI0T9o_/%TqY^>Ds+14Mrrp>rB4>1Mr`B,#%96>+<)lps
+;c6Rn;c-Ek;@uc&:esqb:ejh_:/4S^:f'qaqG.;l:Jak`:JgLWs$?QLrBpKNs$crWrC;<-8P)NH
+92&#R9hnJ\:f1+h<)lt#=BSg3>[:]D@:E_XAnYjmCMds.EH?5FGBnL^I=Hd!K8,/<MN!RVOckuq
+R$sM8StVmSV5L;mXKJe4ZaI6O\\#Mh^r"".`lQ9Fbg+P^daQ^sf@em4h;-uHiT&t[k2tmll0I^&
+mI(#C"n;'Qo(2MQo`=d\rV6Egs8)]krqu`np&9OBSc=3~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/_PoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`59@*^:_%f\$iWKYck10Wi)_iU7n3#M4LfR\,EW4Z2Cj+YPYR%YP51#YH[o/!jJr7
+rNcF/s0Va4rjMj9s1&*>#eRa_^;%J!_86,2o>1OG_Yh=L`;[aM`q[ON`W4'U`W4'Y`W4'UaT'B^
+ap-&5c-=P\dIG]`eGdo?G^=[`I=6TqJ:`E,Knb><M2@+KN/`jYOHG]hPE_>tQC%T<!L]DURf]+N
+Sc55[TDtSPU&L_bTDbA]SH,2ZRg,=LR@'A.QN!./P`q8nOcYWbNfB!VMi*@JLkg_=KS+o/JUi9#
+IXQWlH[:!`G^"@TF`__HEcH)<Df0H0Chmg$C&VcWB4b^dA7T1Z@UWYP?XI,G?2e(0>?_#/s&]8&
+rDiu"<)iiqs&/korD<Mis%`Jds%NDbqb$iZr^clUr'pTQogJUCog8F>JcC<$ir:%qq!m\6l/q$f
+j5T%Thqd,Cg"=p-e'cXkc-FSXbl5Zu`lcKHa2Gm3^qRIm\@&ZL[C3TR\$u4BosOfcr'L?Lr'^QR
+s$lrWIRm%%8kM`M9MJ5V:Jakb;H$Op<``C+>$G6;?XI5N@qB7bBPM="DK'T:FEVkRH@1-jJ:`E.
+LP^nINfT<cQ'Rf*S"6.EU84W`WN*&&Yd(OA[^`l[]Y;1u_o9X:aihoRcdC1ieCN7)g=tH>hr*JR
+j5oFckiq?tm-O--s6g-\nac8Bo`"Lap@nO\s7u]krVQTlrVcBfJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/\OoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`59@*^:_%f\$iWKYck10Wi)_iU7n2hDg?qfrepf6qMG$*nqmC(oS`^-s,Ho9qMkE6
+rf@,Brbh=ns-NVMm$Ia>q3M)KqNp`>s-EkVR[]h;m%43I+aA<ZI!pEmJ:N6(KS>/8Ll$tGN/WaV
+O-#KeP*;,qQ'Rd9QiWVDrgNtZSXobOrh'4`m\0WQs.B7]s.'.[rgO+\R@0G0Q^7W930]ViP*(ie
+O,f3YN/NRMM26qAKnP)2Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\&8,TdARo=]
+@U`bR?sd8I?=!P8!F&b,=oVS(=8c/$<E)rs;u]bq;>j>k:]F2f:&dod9D_?\8cD9W8,PjS7J0(E
+6hNe@6%T&es5j7biQAsJ[]ut6WrAt;VPg8eUS=NVTV%gHSXc1<R[KM1Q^=#&QBd_uP5^RJO,f3Y
+MM[/fM?/QkmYUs0r'L?Lr'^QRs$lrWIRm%%8kM`M9MJ5V:Jakb;H$Op<``C+>$G6;?XI5N@qB7b
+BPM="DK'T:FEVkRH@1-jJ:`E.LP^nINfT<cQ'Rf*S"6.EU84W`WN*&&Yd(OA[^`l[]Y;1u_o9X:
+aihoRcdC1ieCN7)g=tH>hr*JRj5oFckiq?tm-O--s6g-\nac8Bo`"Lap@nO\s7u]krVQTlrVcBf
+JcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/_PoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`59@*^:_%f\$iWKYck10Wi)_iU7n2J77g3K:$tmV;#*o];"mcc;#*od;#4&g:]O;j
+3Up8O>5qaa=9)Lq=Su7s=T)A&=Su7q=T)>"<[(UiH?sseI=HctJqJ`1L5(M@M2I7NNK0']Ocklk
+Pa.N"Qi<?QR@=,E!h>gPrgs+]s.JeRrh0:`rLX%[!1a%X#+CsJR$a5+rfoI-PEM)kOH5H_NJrgS
+MM[1GLPCM9K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9DJj<-CMR[!rb)jUAn>OaA7K(X@:3JM
+?X@&Er`fJ.>5h\)=9)G$<WZ9#<;ohr;ZBVm;#a>k:Adid9`@]^9)_E]8GYjS7f5^J7/94C6MNha
+g"Y<<hr!AOj5oIflKdj*n+$#ApA"I[r;M9IJc?/XWd85[=]ng,<E)srr_iu#<)Zap<;oeq;%QW&
+;,C(b:f1"`:esh]:Jagc;#F)j:esmd:]X?emSX!Mr'L?Lr'^QRs$lrWIRm%%8kM`M9MJ5V:Jakb
+;H$Op<``C+>$G6;?XI5N@qB7bBPM="DK'T:FEVkRH@1-jJ:`E.LP^nINfT<cQ'Rf*S"6.EU84W`
+WN*&&Yd(OA[^`l[]Y;1u_o9X:aihoRcdC1ieCN7)g=tH>hr*JRj5oFckiq?tm-O--s6g-\nac8B
+o`"Lap@nO\s7u]krVQTlrVcBfJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/nUoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYck10Wi)_iU7n2uJs`LBYHb@<Z*F83qlg"'s0)I*q5s\"ric4'
+s0;L-s0Ma4rO)X5s0r$<s1&ZO]Y2%o^qde&_SV=n_SX4\_Yh:S`5T^6`;[aM`q[OB`W4'UaSs9d
+b0/#Rc-F\`rmUnqo[Efh-.@-cH[L6jJ:N3'K7nu6LP^kFN/WaVO-#KeP*;,qQ'Rc(R$jEBRfT%M
+rgs.^s.K:`rM'%]rM'4`s.KCargs.\!1a%X31?8&R$X/*Q'IStP*1rhO,o<\N/W[PM26qAL4t;5
+K7\Z)J:E#rI=-?eH$FOWG'.nKF)l8?E,Y_n%W-#tCMIQsBP1siAS#C^raGn:@/aL<?<piA>[(E9
+r`T8'!*B/#s&K(ur_rhps&&_ks%iYir([2br_*/]r^m&ZqFCKRr'g6Gq*XgApd'K2JcFg2*Vf6o
+lKRNnjQ5I]inrYLhV?f;f@JEtdEp.`cHON3`tcS8bK7cA_nj+%]"#5WZEpsI[^W]SqR6()s$?QL
+rBpKNs$crWrC;<-8P)NH92&#R9hnJ\:f1+h<)lt#=BSg3>[:]D@:E_XAnPdlCMds.EH6/DGBnL^
+I=Hd!K8,/<MN!RVOckuqR$jG7StMgRV5L;mXKJe4Za@0N\\#Mg^r"".`lQ9Fbg+P^daQ^sf@em4
+h;-uHiT&tZk2tmll0I^&mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<iqu6NlrUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/\OoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYck10Wi)_iU7n2fC3Y8_reUW4qhb9/s,$`4s,$Z0qMG3/oS`a.
+s,Hr:q2GB7rK$o=s,m>!s-<YOop5QCqj?]9!1<>DoU,NB#+:pLS=H.@m[b_qH$XgbI=?]sJV/T.
+L5(J?M2I7NNK0']OcklkPa.N"Q^F/.Rf8cWS=TYNs.B=ar1X(`pS7\]r1X.`s.B:^s.'.[rgPm9
+R@'A.Q^3o%P`q8nOcYWbNfB!VMi*@ILPCP;KS+o/JUi9#IXQWlH?sj]GB\4QFEDSEEH,r9rb`3_
+Chmg$BkV0mB4b^dA7PUJ!F]C8?O'nC?!LW=>?_#/s&]8&r`9&!s&Atrs&/korD<Mis%`Jds%NDb
+r(?r[rCHcTrC6]RoL/LBog8F>JcC<$kl1qfe]GnAZEL=0ri.KJW2?JhV50i[TV%jJS=Q1>R[TY2
+R@';+Pa7T"P*1riO-#B\Mi!7HMMmAXM>om>6N':L7/o^U7f>i+84cBF8kViO9heAY:f("e;cHat
+='/U/>?kH@?X[DRAS,RgC27[(E,fo?Fa&+WI!pKpJqJf5M2I7PO-,TjQC+)0SXuLKUnsugWiWA-
+Z*UgG\@K5a^;.V'`Q$!@bKS8XdF-Lnf%8U/gYL]Ci8N_VjQ>Ugl07O#m-X6@mfi4No()DErq-?d
+p\4[^s7u]krVQTlrVcBfJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/_PoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYck10Wi)_iU7n2K7S-9J:[_0\;"mc`;"IK^;#!ic:]XEirDEMi
+s%WSU3V-AR=T)D%>5qa[=9)G!=Sl1r=T;M+>$4s0rE&brr)`o!,^F]_I!pHoJ:W?*KSG5:M2@+K
+N/`jYOHG]hPE_>tQC!u+R@=,E!M#_[T)YG_T_tM^UA(G]UAU_bT`:Y`T)Y>]SGo!;R[KP1Q^=#'
+Q'@JqP*(ieO,f3YN/NRMLkg_>KnP)2Jq8H&IsufoI!U*aG^"@TF`__HEcH)<DuOVaD/=!'C2%?p
+B4kgfARo<M@KBnFra,n:?!U]?>?b;1=oVS(=8l8#<W?%t;u]bq;>j>k:]F2f:&dod9DhE]8c;3V
+8,YpT7J'"D6hNe@5oAD5hV[8Mj5oFdl0I^'mdK`<o_8.Vqu$GEs+:7lgm)ee@Tcc7<`N*s;,^Im
+<E)mq<)cao;Gg7h;,L-g:`*&*:Jah_:/Fb_;,C(b:JOY\:Jah`:esmS;?&r[6N':L7/o^U7f>i+
+84cBF8kViO9heAY:f("e;cHat='/U/>?kH@?X[DRAS,RgC27[(E,fo?Fa&+WI!pKpJqJf5M2I7P
+O-,TjQC+)0SXuLKUnsugWiWA-Z*UgG\@K5a^;.V'`Q$!@bKS8XdF-Lnf%8U/gYL]Ci8N_VjQ>Ug
+l07O#m-X6@mfi4No()DErq-?dp\4[^s7u]krVQTlrVcBfJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/kToCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYcb+/Wi)_iU7n2rJ<lq8Vm3J1YPk^*Y5ka'YPbR'Xo>F"XoGR'
+YPtd+Z2Cp-Zi@E1[K!]8\,Wu<\HodY]tV7s^qmkc_Z,Yq_Z%ID_Yh:O`;[^U`;[aL`qdUC`W4'U
+aSs9db0/#Rc-ObarmUkpp!`oi-@1&fIXcm!JqJ`1L51SAMMmFQNfT9aP*2#nQ'Rc(R$jD3S"#q=
+rgj1`TV27Ws.]Lfn>-&Ys.]Ics.B@argj=bS=H(<R[O/B5aRe%Q'@JqP*(ieO,f3YN/EIKLkg_>
+KnP)2Jq8H&IXQWlH[:!`G^"@TF`__HEcH)<Df0H0Ci!m&C2%?pB4h-S!G#^>@KBnFra,\4?2e+/
+>6%k+=TV],=8l8#<W?%t;u]bq;>j>k:]F2g:&[id9D_?\8cD9V8,YpT7J0(D6hNe@6%T&es5s>:
+p\*t=l0%6ljl,7Xhqm2GgtCB3f$i!nd*Bn\bfe&H`l6'Cai207^q[Rq\@8iO['mLD[fEi4[e@-.
+62X(J6i9@P7K5jU7t+!#8P2TJ92&&S:/=\_;,U=l<E<1'=^#$7?!grI@Uit]B4u$qD/O<4EccGJ
+H$XjdIt3-'L51VCN/is]P*M?#R@Bb=TVA6YVl?\tXg#(:['mKT]=bkn_Sa@4aN;WLcHjnde'ut#
+g"P3:h;@/Lj5]4_k32'olKmm)mf2_ZnF?)?oCW%T!quB_rqQNhs8)]krqu`no_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/_PoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYcb+/Wi)_iU7n2dCNY)[L&$T(MZ&D,M#3&/MY)i,N;nn9NqeV6
+NrG+<OSt=ADZ5t$Qi33MQi!*IQi!0/QiEHNQhm*CQN<MCrg`tYn=D"uH@1-iIt3*%K7nr5LPUeE
+Mi<XUO-#KeP*;,qQC!u+R@9S6S"-&KScYOWT`(SaUAgqWV#I.hUA^ecTE(V`Sd(aUS=?":RJrR=
+Q^3o%P`q8nOcYWbNfB!VMM[1GLPCP;KS+o/JUi9"I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$
+BkV0mB)Z?BA7PUJ!F]C8?NFJ=r`oJ-!*]A)!a&N*r`9&!s&Atrs&/korD<Mis%`Mer_3>bqb$iZ
+r^ciTrC6]RogJRBog8F>JcC<$lMh+Tbeq-&['$J.W[4XBVl$;dUnXQTT:VXDS=H(;R@'>.R$O#$
+QBd\uPECuhNfK'VreUf:M2I.HMXQE$62X(J6i9@P7K5jU7t+!#8P2TJ92&&S:/=\_;,U=l<E<1'
+=^#$7?!grI@Uit]B4u$qD/O<4EccGJH$XjdIt3-'L51VCN/is]P*M?#R@Bb=TVA6YVl?\tXg#(:
+['mKT]=bkn_Sa@4aN;WLcHjnde'ut#g"P3:h;@/Lj5]4_k32'olKmm)mf2_ZnF?)?oCW%T!quB_
+rqQNhs8)]krqu`no_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/_PoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYcb+/Wi)_iU7n2J7S-3F:@V3];"d]`;"[W^;#!ic:]aKj;#X>j
+;#O/h48)hS=T)D%>5qa[=Su8"=Sl1r=9)M'>5q_'=85np=!i6@I=?ZrJV&N-KnbA=M2I4MNK0']
+OcklkPa.Q$R$a;1R[]e:Sc52^T:hkUU&UkdU[Y)YU]7(eU&UbcTDkDdSXc4>S!ocEQp@"(Q'ISt
+P*1rhO,o<\N/WXNM26qAL4t;5K7\Z)J:;opI!^0cH$FOWG'.nKF)l8?E,TW3D/=$(CMIQsBP1rV
+AH?=OraGn:@/aL6?=!P8s'#J,r`K;)=',B%s&K(ur_rhps&&_ks%iYirD!8bs%E5]r^m)[q+(BQ
+r'g9Hpd=^@pd#_PhVmJSjQ>[jlKdg(md]l>p@n@Yqu$GEs+C=n^P$9->$+m.<`E$r;H$Oq<E)jo
+<)Z[n;,L.f;,L+br_NVk:B"#u:/=\_;,C%`:JOY];G[9g!DcJY;>rlZ6N':L7/o^U7f>i+84cBF
+8kVfN9heAY:f("e;cHat='/U/>?kH@?X[DRAS,RgC27[(E,fo?Fa&+WI!pKpJqJf5M2I7PO-,Tj
+QC+)0SXuLKUnsugWiW>,Z*UgG\@K5a^;.V'`Q$!@bKS8XdF-Lnf%8U/gYL]Ci8N_VjQ>Ugl07L"
+m-X6@mfi4No()DErq-?dp\4[^s7u]krVQTlrVcBfJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6mHj0(l0.<mjlGI\i8<DIgY1?4f$r0s
+dEg+^bK7fD`59@*^:_%f\$iWKYcb+/Wi)_iU7n2oH]k2/V6I3$YPbR'YPkX(Xo#3uXT5O%Y6(r5
+Z2M!.Zi@E1[JmTB\%&rY\[oDd^;%J!rk\NLs,HQcrk\TNr58QQqSi-IqSi3KrPefV"38L)ao'6Z
+aTou3bKS8Xd*_jArR1Gh-IU@iI=6TqJ:`E,KnbA=M2I4MNK0']OcklkQ'IZ%R$a;1S"#q=rgj1`
+TV2:X!huHbqkX.dqkj:fr1s@fs.]Lds.B@argl]PS=?":R@0G0Q^3o%P`q8nOcYWbNf8pTMM[1G
+LPCP;KS+l-J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9DJj<-CMR[!BkV0mB)Z?LA7K(X@:<PN?X@&E
+r`fM/>$Co.!a&N*r`9&!!*&nqs&&horD<Jhs%`Mer_3>bqb$iZr^ciTrC6]RogJRBog8F>JcC<$
+l2UeZ"7YU?l2KfsjPf%ThVR)Fg=b01e^`'pd*Kq\b0.lG`l-!Bai)*5^qRLp\@/`M[C3NO[^Z(@
+p9jlcr'L?Lr'^QRs$lrWIRm%%8kM`L9MJ5V:Jakb;H$Op<``C+>$G6;?XI5N@qB7bBPM="DJsN8
+FEMePH@1-jJ:`E-LP^nINfT<cPa7])S"6.DU84W`WN*&%Yd(OA[^`l[]Y;.t_o9X:aihoRcdC.h
+eCN7)g=tH>hr*JQj5f@bkiq?sm-O--s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/_PoCDJBnF,i6mHj0(l0.<mjlGI\i8<DIgY1?4f$r0s
+dEg+^bK7fD`59@*^:_%f\$iWKYcb+/Wi)_iU7n2cBQJTTK):E'MYr>,M#3&/MY)i,N;nn:Nq\P5
+NrG+<OSb1?DZ#guQiEBOQi*0KQhm*.Qi<BMQiEHDQN<MCrg`tYoUc&Q,^XrfIt3'$K7nr5LPUeE
+Mi<XUO-#KeP*;/rQC!u+R@9V7S=TYN!hZ-Yrh0CfUSI^^r2':fr2'=es.fUgrh9@b!2'7^8Y)B@
+S!ob5R$a5+Q'IStP*1rhO,o<[N/NRMM26qAL4t;5Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,TW3
+D/=!'C2%BqBP1rVAIE$Y@U`bS?sd8I?=!P8!aAi3r`K;)=',B%s&B%urDW_o!)`\kr_NPhrD!8b
+s%E5]r^m)[q+(BQr'g9Hpd=^@pd'K2JcG*:38Ma)\$rTBXK&;"Wi2hnV59u_U7n3OSXl7>S=>t7
+R$X2+Q'IQ!Q'7ApP*(fcNJrdPLl.+JM2LeZreg\@r'L?Lr'^QRs$lrWIRm%%8kM`L9MJ5V:Jakb
+;H$Op<``C+>$G6;?XI5N@qB7bBPM="DJsN8FEMePH@1-jJ:`E-LP^nINfT<cPa7])S"6.DU84W`
+WN*&%Yd(OA[^`l[]Y;.t_o9X:aihoRcdC.heCN7)g=tH>hr*JQj5f@bkiq?sm-O--s6g-\nac8B
+o`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/_PoCDJBnF,i6mHj0(l0.<mjlGI\i8<DIgY1?4f$r0s
+dEg+^bK7fD`59@*^:_%f\$iWKYcb+/Wi)_iU7n2H6Uj[?:@_9^;"mca;"d]^;#*o`;#X>j:]O;h
+:B*EM=oVV(=o;D$=oDM(=km-T=8l>"=8H#!=oMS*=]kW(pK7Dr,^XrfIt3'$K7nr5LPUeEMi<XU
+O-#KeP*;/rQC!u+R@9V7S=TYN!hZ-Yrh0CfUSI^^r2':fr2'=es.fUgrh9@b!2'7^8Y)B@S!ob5
+R$a5+Q'IStP*1rhO,o<[N/NRMM26qAL4t;5Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,TW3D/=!'
+C2%BqBP1rVAIE$Y@U`bS?sd8I?=!P8!aAi3r`K;)=',B%s&B%urDW_o!)`\kr_NPhrD!8bs%E5]
+r^m)[q+(BQr'g9Hpd=^@pd#YQioK7bkih@!m-X60nac>Gp\F[_r.4m$s#TqRG@P2f=BSX&<)QRm
+<)Zaq;c6Lm;c6Ok;,C.f;,C"`:Jah^:JO_]:JXea:ejb]:/4V^:Jak`:[M$Y62X(J6i9@P7K5jU
+7t+!#8P2TJ92&&S:/=\_;,U=l<E<1'=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=acIt3-'KnkMB
+N/is]P*D9"R@Bb=TVA6YVl?\tXg#(:['mKT]=bkm_Sa@4aN;WLcHjnce'ut#g"P3:h;@/LioB+^
+k32'olKmm)mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6mHj0(l0.<mjlGI\i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$`QJYcb+/WMcVhU7n/nGE&K(UpBs&s/l@(poaUuqQ0[ur3$('#-bA;
+ZEggCrj2^6[/RK5[K<qJ\Gj#B]=bkm^qfobqSN6Lp;-gGrPJQMrkeTNs2=cQo>^^Ipr<3M!li:%
+rlP/\rlP2_#0Y67c-ObarmUnq!7CeorR:_n/UVtqIt3*&K7nu6Ll$tHN/`jYO-,TgPEhE!Q^F/.
+R[]e:SXuFFTV/!PU8"F]V#I4iVXp_bVZ*FjU]R<cUAghjTV%jJSt2DNRm3@0R$a5+Q'IStP*1rh
+O,f3YN/NRMM26qAL4k23Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\&8,TdARo=]
+@U`bR?sd8I?=!P8!aAi3r`K;)=',B%!``3!rDNbq;,R9gs%iVhrD!8bs%E5]r^m)[q+(BQr'g9H
+pd=^@pd'K2JcG'91&(M2lfmWrk2tX_hr!;Ih:pW8f@SL#dEp7cbg";QaMu6<aNM]D_nj.%]t:b]
+ZEgn;[K3kFq6p")r^$HKrBpKNs$crWrC;<-8P)NH91qrQ9hnJ\:f1+h<)lt#=BSg3>[:]D@:E_X
+AnPdlCMds-EH6/DGBeF]I=Hd!K8#);MN!OUOckrpR$jG7StMgRV5L;mXKA_3Za@0N\\#Mg^V[n-
+`lQ9Fbg+P^dF6Urf@\g3h;-uHiSrnYk2tmll0@X%mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6Nm
+rUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6mHj0(l0.<mjlGI\i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$`QJYcb+/WMcVhU7n/`Ao`<RJVsG`!/gc4!/g`3oSEO(s,-K-s,?r:
+!06`3s,R,?rK-f:r0RDKqj.;KrKmMLrg3JKiKsP2ns9?Dr0IJPR@=,FrgihUr1,EeI=?ZrJV/T.
+L5(M@M2R=PNfT6`P*2#oQ'Rc(R$jD4S"-%@StD[KTqS3TU]%"fV>d@`VuERmV>[1kUS=L^Ta%0^
+T:VXFSGo!BR[KP1Q^3o%P`q8nOcYWaNJrgSMM[1GLPCP:K7ec,J:N,uI=6KiH?sj]GB\4QFEDSE
+EH,r9DJj<-CMR[!rb)jUAn>OaA7K(X@:3JM?X@&Er`fM/>$Co.!a&N*r`0)#<)ifp!`DlmrD<Mi
+r_EDdr_3>bqb$iZr^ciTrC6]RogJRBog8F>JcC<$n,EXge&fV<[]Z_0WrK!qV$s,nTqJ!JS=?"<
+S!fZCQiE?NP7WtDPEM,lOcPN^N/EFIMMmA[M>iD362X(J6i9@P7K5jU7t+!#8P2TJ92&&S:/=\_
+;,U=l<E<1'=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=acIt3-'KnkMBN/`m\P*D9"R@Bb=TVA6Y
+Vl?\tXg#(:['mKT]=bkm_Sa@4aN;WLcHjnce'ut#f\5*9h;@/LioB+^k32'olKmm)mf2_ZnF?)?
+oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6mHj0(l0.<mjlGI\i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$`QJYcb+/WMcVhU7n/F77KmB9i1L[s%rDbrD<;cpeUue;#O2f;#aDm
+;#aDk:]O;e:&nJr=oMP#=TDS&=oMP&=oDM(=lNQ]<rc@u<s)Q-=BPQ(q,dW"r`]>)!*K5%p/ino
+I=?ZrJV/T.L5(M@M2R=PNfT6`P*2#oQ'Rc(R$jD4S"-%@StD[KTqS3TU]%"fV>d@`VuERmV>[1k
+US=L^Ta%0^T:VXFSGo!BR[KP1Q^3o%P`q8nOcYWaNJrgSMM[1GLPCP:K7ec,J:N,uI=6KiH?sj]
+GB\4QFEDSEEH,r9DJj<-CMR[!rb)jUAn>OaA7K(X@:3JM?X@&Er`fM/>$Co.!a&N*r`0)#<)ifp
+!`DlmrD<Mir_EDdr_3>bqb$iZr^ciTrC6]RogJRBog8F>($"B<kiqC!m-X3.n+$#ApA"I[qu6SG
+s+^Omf90uY?s-Q4<E)mp;H6Xq<Dudo;Gg=i;c-=er_X)":/=Y^:/4S[:JO\\r_WVi!`)Qdr_NPj
+s%`VmmSWsLr'L?Lr'^QRs$lrWIRm%%8kM`L9MJ5V:Jakb;H$Op<``C+>$G6;?XI5N@qB7bBPM="
+DJsN8FEMePH@1-jJ:`E-LP^nINK93bPa7])S"6.DU84W`WN*&%Yd(OA[^`l[]Y;.t_o9X:aihoR
+cdC.heCN7(g=tH>hr*JQj5f@bkiq?sm-O--s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*@
+s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/nUoCDJBnF,i6mHj0(l0.<mjl>C[i8<DIgY1?4f$r0r
+d*L"]bK.`C`59@*^:_%f\$`QJYcb+/WMcVhU7n/lG)DrmX0o+5XfhT(ql]t$pT4=qs/lO/Yd(I=
+ZMq3/[/IB5[^Z7Gs1&6C]Y;/[_#2%2_Yq=M_Yh=O`;@OD`r3jV`r*gT`r!aT`W4*XaT0E]aoBN`
+b66&6cd:)=e,RkrdJ;5jI49YrJV&N-KnbA>M2R=ONfT6`P*2#oQ'Rc(R$sM6S=Q7CT:_dMTq\9V
+rhTRjs/,[kor._bs/,gmrhO"uU8"?TTV.pKSt2CAS"#k7R$a5+Q'IStP*1ofO,f3YN/NRMM26qA
+KnP)2Jq8H&IsufoI!^0bG^"@TF`__HEcH)<Df9N2D/=!'C2%?pB4kgfARo:\@U`bR?sd8I?![G7
+!F&b,=oVS(=8c/$<E)rs;u]bq;>j>k:]F2f:&dod9D_?\8cD9V8,YpT7J0(D6hNe@6%T&es6fpe
+r%Rg1l0@EnjQ5I]hr3GIg=k67f@A@!d*L%`bg";Qa2Z-;a32TC_SO%%]t1\\ZEgn;[K3kFq6p")
+r^$HKrBpKNs$crWrC;<-8P)NH91qrQ9hnJ\:f1+h<)lt"=BSg3>[:]D@:E_XAnPdlCMds-EH6/D
+GBeF]I=Hd!K8#);MN!OUOckrpR$jG7StMgRV5L;mXKA_3Za@0N\\#Mg^VRh,`lQ9Fbg+P^dF6Ur
+f@\g3h;-uHiSrnYk2tmll0@X%mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6mHj0(l0.<mjl>C[i8<DIgY1?4f$r0r
+d*L"]bK.`C`59@*^:_%f\$`QJYcb+/WMcVhU7n/^AT<*JKT#P\on`R'r/1?/rf$E-s,R,?r/gZ8
+q3V,IpQtiErg3JKiKjP3lB_R>R@=,FrgitYqORY7.=Zl!JqJ`1L51VBMi<UTO,oEdP*;/rQC!u+
+R[]e:SXuFFT:hmOU8"F^V#R:kVYd:aW;<FlVZ3LlUgg*nU7n9RTV%gISXc4>S!ob4R$X,(Q'@Jq
+P)t`cNfB!VMi*@JLkg_=KS+o/JUi9#IXQWlH[9s^GB\4QFEDSEEH,r9Df0H0Chmg$BkV0mB4b^d
+A7K+Y@UWYP?XI,F?2e(0>?_#/s&]8&rDiu"<)iiqs&/korD<Mis%`Jds%NDbqb$iZr^ciTrC6]R
+ogJRBog8F>JcC<$nc&gWbKRQ,[''D.s/H!r&>c8"US=HTTUq^ES"#q8R@*u>(6k)IPEV8qP*1ri
+O,f3XMMR(GMMm@Ln;7.%r^$HKrBpKNs$crWrC;<-8P)NH91qrQ9hnJ\:f1+h<)lt"=BSg3>[:]D
+@:E_XAnPdlCMds-EH6/DGBeF]I=Hd!K8#);MN!OUOckrpR$jG7StMgRV5L;mXKA_3Za@0N\\#Mg
+^VRh,`lQ9Fbg+P^dF6Urf@\g3h;-uHiSrnYk2tmll0@X%mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<h
+qu6NmrUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6mHj0(l0.<mjl>C[i8<DIgY1?4f$r0r
+d*L"]bK.`C`59@*^:_%f\$`QJYcb+/WMcVhU7n/I7R]sB:/LX]s%rGcrD<;cp/(`ar_NVm;#X>l
+;#aDj:]O;d:AJ&m=SGts=T2J%=o_^b=S#Sq=BSf+=9)Fu=9)M'>5qb*=T;It=T<duIt3*%K7nr5
+LP^kGN/WdXO-,TgPEhE!Q^F//S"#q=St;RHTV8'RU8.^`s/#amqks+cqPX@js/#^j@\]ZlTqS-P
+T:VXFS=H(<R[KP1Q^3o%P`q8nOH5H_NJrgSMM[1GLPCM9K7ec,J:N,uI=6KiH?jaZGBS+NFE;JB
+EH#i7DJj<-CMR[!BP;$kAn>Oa@q/tW@:3JM?X@#Dr`fJ.>5h\)=9)G$<WZ9#<;ohr;ZBVm;#a>k
+:Adid9`@]^9)_E]8GPdS7f5^J7/0.B6MNh[jQ>XilKmp*mdK]:oCVePq>1$gJcCK)%(q4+AQi8=
+=B&6t;,dHos&1=D;c6Ij;c6Ff:esqa:JOY\;,0k_:/=V\:/=\_:/4S[:JX_]:f'q^m8<jKr'L?L
+r'^QRs$lrWIRm%%8kM`L9MJ5V:Jakb;H$Op<`W=*>$G6;?XI5N@qB7bBPM="DJsN8FEMePH@1-j
+J:`E-LP^nINK93bPa7])S"6.DU84W`WN*&%Yd(OA[^`l[]Y;.s_o9X:aihoRcdC.heCN7(g=tH>
+hr*JQj5f@bkiq?sm-O--s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LF,-3a[(61<s/c(!!3Z='pT4=qs/uC*s02O.
+s0Dg7Za@+<[0j@O\%&rY\[oGe^\ttG_;iE2_>_=L_uI[P`UUt@`;mpT`W*pXa8!dVb5]Wfbg"J\
+dJhVpdf.YldOBTnIt3*&K8#&8Ll%"IN/`mZOHPcjQ'IZ%R$jD4S"-%@StD[LTq\9VrhKUlVPa<i
+s/>mqp8\(js/>mos/,gmrhKRiUAgi`TV%gISXl:?S!ob4R$X,(Q'@GpOcYWbNfB!VMi*@ILPCP;
+KS+o/JUi9"I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$BkV0mAnGUcA7PUJ!F]C8?O'nC?!LW=
+>?_#/s&]8&r`9&!s&Atrs&/korD<Mis%`Jds%NDbqb$iZr^clUr'pTQogJRBog8F>JcC<$nGb9>
+qsNb6l/q-iio/hShV?o@f[ng-eC)dmcd0n\bfS#J`l?!<aiVK;_SEn!]!o)QZF0\?!OoK4[eI3.
+62X(J6i9@P7K5jU7t+!#8P2TJ92&&S:/=\_;,U=l<E<.&=^#$7?!grI@Uit]B4u$qD/O93EccGJ
+G^=acIt3-'KnkMBN/`m\P*D9"R@Bb=TVA6YVl?\tXg#(:['mKT]=bkm_8F73aN;WLcHjkbe'ut#
+f\5*8h;@/LioB+^k3)!nlKmm)mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0L@r6ICL5Ptes+pW1oSEI&pPT!/s,6u<N:`)0
+NrG+;OS+b%Qi36KQi!0&Qi<<EQiEERR@=,Frga%\pmij^IXcm!K7el4LPUeEMi<XVO-#NfPEhE!
+Q^F20S"#q=St;RITqS3TU].%jV5C-gVuN^oWV3@jWW/pqVuNXoV>d7kUS@a];4sPQSt2FBS"#k7
+R$a5+Q'ISsP*(ieO,f3YN/NRMLkg_>KnP)2Jq8H&IXQWlH[:!`G^"@TF`__HEcH)<Df0H0Ci!m&
+C2%?pB4baeARo<M@KBnFra,n:?!U]?>?b;1=oVS(=8l8#<W?%t;u]bq;>j>k:]F2f:&dod9D_?\
+8cD9W8,PjS7J0(D6hNe@6%T&es7?71gs!sN\$)p7X/`.uVl-DgUna]ZTV.pKSXl7>SGnrVQNNM;
+Q'2*1!0[>D$'1++Mi*=HMMd>[M>rJ362X(J6i9@P7K5jU7t+!#8P2TJ92&&S:/=\_;,U=l<E<.&
+=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=acIt3-'KnkMBN/`m\P*D9"R@Bb=TVA6YVl?\tXg#(:
+['mKT]=bkm_8F73aN;WLcHjkbe'ut#f\5*8h;@/LioB+^k3)!nlKmm)mf2_ZnF?)?oCW%T!quB_
+rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0L77KjA:/Cjds%rYkr_W>brD<;cqG7;l:f'q`
+r)!>h!)WYlr)!DhpJ1$WrE0&%r`]>)i`PeR!*K5'p/h;tr`]>)r`B/%qH,1pIXcm!K7el4LPUeE
+Mi<XVO-#NfPEhE!Q^F20S"#q=St;RITqS3TU].%jV5C-gVuN^oWV3@jWW/pqVuNXoV>d7kUS@a]
+;4sPQSt2FBS"#k7R$a5+Q'ISsP*(ieO,f3YN/NRMLkg_>KnP)2Jq8H&IXQWlH[:!`G^"@TF`__H
+EcH)<Df0H0Ci!m&C2%?pB4baeARo<M@KBnFra,n:?!U]?>?b;1=oVS(=8l8#<W?%t;u]bq;>j>k
+:]F2f:&dod9D_?\8cD9W8,PjS7J0(D6hNe@5n`;Akj%L$mI'H5o(2SLq"agbrdk**ru(I)F_"o`
+=BAL%;c6Ik<)Q^p;H$Lk;,U:hrD3Pm:JUmb(Jmk%:esk^:ejb^:ejb]:/=VZ:Jak`:$tmW62X(J
+6i9@P7K5jU7t+!#8P2TJ92&&S:/=\_;,U=l<E<.&=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=ac
+It3-'KnkMBN/`m\P*D9"R@Bb=TVA6YVl?\tXg#(:['mKT]=bkm_8F73aN;WLcHjkbe'ut#f\5*8
+h;@/LioB+^k3)!nlKmm)mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LE.aOUZa?k3XSf3nXSo:$Y5b^*YlD!.ZN%91
+[/RK5[Ks@P\@K/^]Y2&W_#(t,_Yq=M_Yh=O`;[^W`l5pj`p(JB`WF3%aSO!baNDZKbg"J\dF8'B
+qp?d>It3*%K7nu6Ll%"IN/`jYOHG]iPa.Q$R$jD4S"-%@StD[LTq\=]U]I<hrMT[os/GjpqQ'Fl
+s/H$srML%#V59u`USFQWTqJ%WSk#?AS"#k7R$a5+Q'@JqP*(ieO,f3YN/EIKLkg_>KnP)2Jq/B$
+IXQWlH[:!`G^"@TF`__HEcH)<Df0H0Chmg$C2%?pB4h-S!G#^>@KBnFra,\4?2e(1>?Y50=TV],
+=8l8#<<-"s;u]bq;>j>k:]F2f:&dod9DhE]8c;3V8,YpT7J'"D6hNe?6%T&es761Jp\F7CmHE`p
+jl>:ViSN>Dg=b35e^;gmd*Bq]bfn2OaMl0<`lH3>_8=%&]t1\\ZEgmH[^Wa@[eI3.62X(J6i9@P
+7K5jU7t+!#8P2TJ92&&S:/=\_;,U=l<E<.&=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=acIt3-'
+KnkMBN/`m\P*D9"R@Bb=TV80XVl?\tXg#(:['mKT]=bkm_8=12aN;WLcHaeae'ut#f\5*8h;@/L
+ioB+^k3)!nlKmm)mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0L@V^1;L5LibL]E;'M#W>+MZ8V5N:`,.O8P+1
+Om8;3QMd*IR,"&'QMQpOQC!u,R@=,Fqjd_YrLG<aIt3*%K7nu6Ll%"IN/`jYOHG]iPa.Q$R$jD4
+S"-%@StD[LTq\=]U]I<hrMT[os/GjpqQ'Fls/H$srML%#V59u`USFQWTqJ%WSk#?AS"#k7R$a5+
+Q'@JqP*(ieO,f3YN/EIKLkg_>KnP)2Jq/B$IXQWlH[:!`G^"@TF`__HEcH)<Df0H0Chmg$C2%?p
+B4h-S!G#^>@KBnFra,\4?2e(1>?Y50=TV],=8l8#<<-"s;u]bq;>j>k:]F2f:&dod9DhE]8c;3V
+8,YpT7J'"D6hNe?6%T&es7ZI!ps@*u[^N??X/l6!s/-1"VPBr]U7e-MSc5,`R[]b6R$X0=PSKCH
+PEV5oOcbfeNfAsSLkpqHMM[1GnVR:'rB^?JrBpKNs$crWrC;<-8P)NH91qrQ9hnJ\:f1+h<)lt"
+=BSg3>[:]D@:E_XAnPdlCMds-EH6/DGBeF]I=Hd!K8#);MN!OUOckrpR$jG7StMdQV5L;mXKA_3
+Za@0N\\#Mg^VRe+`lQ9Fbg+M\dF6Urf@\g3gtglGiSrnYk2tjkl0@X%mI(#C"n;'Qo(2MQo`Fj]
+p\ssfq>^<hqu6NmrUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0L77Ba@9M\O_:]OAh;#F,c;#F,f;#O8j:]O;i
+;"mic;#a>`:?l!\=T2J&>5qab=S#So=T2Is=9)M'>5qb#==8NHJ:W<)KSG5;M2I4MNK0']Ockom
+Q'Rc(R@9V7S=Q7CT:hmOU8.^`!Mu[lVuN^qWVWXkX8/dqWW/pqV[KAuV50o^US=HUTV)4T8"H0>
+S!ob4R$X,(P`q8nOcYWbNfB!VMM[1GLPCP;KS+o/J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9DJj<-
+CMR["BkV0mB)Z?BA7PUJ!F]C8?NFJ=r`fM/>$Co.!a&N*r`9&!!*&nqs&/korD<Mis%`Jds%NDb
+r(?r[rCHcTrC6]RoL/LBog8C=&a&<AlKmp*n*ol>p@n@Yqu$GEs,$ade<"NT?!130<E)jn;cQds
+rDW_nr_`bn:]4,f:]F6,:Jjn_9i+S[:f0t`:JO\\9i"S^:JOaT;>ifY6N':L7/o^U7f>i+84cBF
+8kVfN9heAY:f("e;cHat<`iL.>?kH@?X[DRAS,RgC27[(DfKf>Fa&(VI!pKpJqJc4M2I7OO-,Ti
+QC+)0SXuLJUnsugWiW>,Z*UgG\@K5a^;%M$`Q$!@bKS8Wd*^=lf%8R.gYCWBi8N\UjQ>Ufl07L"
+m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LD1IqJZD[T$rN5^nrN6+&s0)I,s0;U0s0Ma4
+rjDd7$+IFS\[oDc]tV8[_"tn7_Z.IE_Yh7M_Yh:O`;R[M`p1MC`r*gU`W4'YaSa0Yaooo3c-Oc6
+deqK<It3*&K8#&8M2@+KN/is\OckomQ'Rc(R@9V7S=Z=ETV8'RU].%iV5F6is/5psrMojtqlKau
+qlKdtrMomss/>pp!N)^mUemh\TqS-OT:VXFS=?":R@'A-Q'IStP*1rhO,o<[N/NRMM26qAL4t84
+Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,TW3D/=!'C2%BqBP1rVAHl[T@U`bS@/aL6?=!P8!aAi3
+r`K;)=',B%s&B%urDW_os&&_ks%iYirD!8br_*/]r^m)[q+(BQr'g9Hpd=^@p-F90JcGHD(&Iju
+lg=-*kN1aaiS`SMgtLE6g"=gRdKn4GccjVXb0%d(`W*siai2*5_7mUo\$iTJ[C3NQ\+mE+[J`Dh
+6N':L7/o^U7f>i+84cBF8kVfN9heAY:f("e;cHat<`iL.>?kH@?X[DRAS#LfC27[(DfKf>Fa&(V
+H[UBoJqJc3M2I7OO-,TiQC+)0SXuLJUnsufWiW>+Z*UgG\%0,`^;%M$`Q$!@bKS8Wd*^=lf%8R.
+gYCWBi8N\UjQ>Ufl07L"m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0L?Yae6KS8]Js,$K-s,6i7p5K'4r/^f<n<*I3
+s-E;Dr0I8Irg;W1rg!PNp6PN@".5LFRf8iSSc>;]SKr]8JV/T/L51VBMN!LSO-#KePE_>uQ^F20
+S"#q>StD[LTq\=]U]I<hrhodp!3,psri>ptrN5suri?!ts/H$srhfdoV>d8eUS=HUTV%jJSt2C@
+S!ob4R$O#&P`q8nOcYWbNf8pTMM[1GLPCP;K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9DJj<-
+CMR[!BkV0mB)Z?GA7K(X@:<RC?NFJ=r`fM/>$Co.!a&N*r`9&!!*&nqs&/korD<Mis%`Mer_3;a
+r(?r[r^ciTrC6]RogJRBog8@<JcC<$q>VQ!cHj&1Z)t.2X/`+rW26;cUSFNUT:VUDSXZ+=R[KQB
+Qi<3NPE_=2PQ-aSP)bQ^Mi3CIMMm@KM2:\Ys,-b@r'L?Lr'^QRs$lrWIRm%%8kM`L9MJ5V:Jakb
+;H$Op<`W=*>$G6;?XI5N@qB4aBPM="DJsN8FEMePH@('iJ:`E-L5CeHNK93bPa7])S"6.DTqnN_
+W2cr$YHbF@[^WfZ]Y;.s_SsO9aihoRcHstfeCN7(g=tE=hr*JQj5f@bkNV6rm-O--s6g-\nac8B
+o`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0L6q'[A8l+nP!)N2_!Du\l;>X2f;#jMl;>j>k
+:\%9T=oVUr=o;D%=oMV)=lNQT<rcA%=nYqt=oMV)=nu/FIt3*&K8#&8M2@+KN/is\OckomQ'Rc(
+R@9V7S=Z=ETV8'RU].%iV5F6is/5psrMojtqlKauqlKdtrMomss/>pp!N)^mUemh\TqS-OT:VXF
+S=?":R@'A-Q'IStP*1rhO,o<[N/NRMM26qAL4t84Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,TW3
+D/=!'C2%BqBP1rVAHl[T@U`bS@/aL6?=!P8!aAi3r`K;)=',B%s&B%urDW_os&&_ks%iYirD!8b
+r_*/]r^m)[q+(BQr'g9Hpd=^@p-B5RlKmp*n+#u@p@nCZqu$GEs,-gb\US@*>?Fp*<E)jo;uTc"
+;c6Ol:]4/g;#a<29hnJ\:eje_:JOV[:JO_`:/=Y\:JOV[:f'q_;"%9[62X(J6i9@P7K5jU7t+!#
+8P2TJ92&&S:/=\_;,U=l<E<.&=^#$7?!grI@Uit\B4u$qD/O93EccGJG^=^bIt3-'KnbGAN/`m\
+P*D9"R@Bb=TV80XVl6VsXfo"9['mHS]=bkm_8=12aN;WLcHaeae'ut#f\5*8h;@/LioB+^k3)!n
+lKmm)mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LC4)2@Ybh9!rN5^nriQ4's0)I,s0;U0s0M^3
+rj<-B\$rlW\[oDd^;%G^_"bb3_Z%CM_>qFK_Yh7M_Yh:O`;R[Q`ob8>`r<sW`W4'YaSa0[ap,u1
+bKS8Xd/DDjd3jHqJqJ`2L5:\DMi<XVO-,ThPa.Q$R$jD4S"-(AT:hmOU8+N[V5F6i!iW)tri6"!
+s/bUiriH.#ri6!t!3#mp#,\5nUnjc[rh2fST:VXFS=?":R@'>,Q'IStP*1rhO,f3YN/NRMM26qA
+KnP)2Jq8H&IsufoI!U*aG^"@TF`__HEcH)<Df9N2D/=!'C2*Z\&8,TdARo:\@U`bR?sd8I?=!P8
+#[:J9=]nj/=',B%!``3!rDW_o!)`\ks%iVhrD!8bs%E5]r^m)[q+(BQr'g9Hpd=^@p-F90JcGNF
+1\gk8lgaH.k2kU\hr*>HgXt03g""Ktda6=ccHXSVb/hT@`Pfd:aMu$4_8![p\$rZK[JmT7\+mE+
+[J`Dh6N':L7/o^U7f>i+84cBF8kVfN9heAY:f("e;cHat<`iL.>?kH@?X[DRAS#LfC27[(DfKf>
+Fa&(VH[UBoJqJc3M2I7OO-,TiQC+)0SXuLJUnsufWiW>+Z*UgG\%0,`^;%M$`5]m?bKS8Wd*^=l
+f%8R.gYCWBi8N\UjQ>Ufl07L"m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0L?"e8-KnAZI!/^K.s,6i7p5T*4rK$o=mZI1/
+rg*ML!1*JJqNh)Hs-Vo7q3M#Hpm1`B".5LFS,SrTSc>9/J:W<)KSG5;M2I4MNK9-_P*;,qQC!u,
+R[]e:St;RITqS3UUnjiarhfgrWN#lss/Z1$mB-Ahs/Z.!s/?!srhfstV59u`US@a]7\HBFSt2C@
+S!ob4Q^3o%P`q8nOcYWaNJrgSMM[1GLPCM9K7ec,J:N,uI=6KhH?jaZGBS+NFE;JBEH#i7DJj<-
+CMR[!rb)jUAn>Oa@q/tW@:3JM?X@&Er`f_5>$>'3=BJX+r`0)#<)ifps&&horD<Mir_EDdr_3>b
+qb$iZr^ciTrC6]RogJRBog8@<JcC<$qu7PebJq!"Y,ne/WiE"qVPL#^US=ERT:VRDSGo!!R@'D/
+Q^3o#PEM,nP*;)kOcbW`NJi^OLl.+KMM[/ZM>rJ362X(J6i9@P7K5jU7t+!#8P2TJ92&&S:/=\_
+;,U=l<E<.&=^#$7?!grI@Uit\B4u$qD/O93EccGJG^=^bIt3-'KnbGAN/`m\P*D9"R@Bb=TV80X
+Vl6VsXfo"9['mHS]=bkm_8=.1aN;WLcHaeae'ut#f\5*8h;@/LioB+^k3)!nlKmm)mf2_ZnF?)?
+oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0L6pjF98l+GCqbd5er)*JlrDEMis%i,Zoi_8r
+rE0,&qH<Ysr`]>)i`PeR!*K2&pK.Dur`]>)qcG4rJV&N-L5(M@MMmFQO,oEdPE_>uQ^F20S"#q>
+StD[LTq\<XUnssfVZNfrWW&ptX8f9gXo>F%X8].!W;rmrVZs#pV50o^UAgiUTV%gISXc1=R[KP0
+QBd`"PEM)kOH5E]N/W[PM2@%DL4t;5K7\Z)J:E#rI=-?eH$FOWG'.nKF)l8?E,TZ4DJa3*CMIS_
+BFnfgAS#C^@q&nU?sm>K?=$q:>R4P;>$5!1=BAT'<WZ9#<;fbq;?0Sm;#a>j:Amod9`Ic_9)_E]
+8GPdS7f5^J7/0.B6M<\SlKmp+n+$#ApA"I[qu20HMuO%NTlOXN=]ec)<=Dc);cH[n<)HUl:f1*e
+;#a>i:)$N":JXe_9heDZ9i+Y^:/=V[9hnL`:]X<fmns$Lr'L?Lr'^QRs$lrWIRm%%8kM`L9MJ5V
+:Jakb;H$Op<`W=*>$G6;?XI5N@qB4aBPM="DJsN8FEMePH@('iJ:`E-L5CeHNK93bPa7])S"6.D
+TqnN_W2cr$YHbF@[^WfZ]Y;.s_SjI8aihoRcHstfeCN7(g=tE=hr*JQj5f@bkNV6rm-O--s6g-\
+nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LCO(o:X/3#dXT,F&Y5b^*YlD!.ZN%92[/RK5
+[Kj:O\@K2_]Y4<Zs1n?El,*D8rke]Or5/?I!5eZOs2=3A!6"QLrPnlVrl,#[aN48#rlPDfbg+P]
+dJhSod5'(!JV/T/L51VBMi<XUO-#NfPa.N#R$a>3S"-(AT:hmOU8+N[V5C/gW2ZbrWiN2%XSo:"
+Y4f'tY5GF%X8o=#WrK$uW;`[uVPU)aUS@a]:S=>OSt2C@R[KP1Q^3o%P`q8nOH5H_NJrgSMM[.E
+L5(D8K7ec,J:N)sI=-BfH?jaZGBS+NFE;JBEH#i6DJa6,CMR[!BP;$kAn>OaA,]p<@:9(A!a]/<
+r`fJ.>5h\)=9)G$<WZ9#<;f_s;Gg<i;#a>k:Adic9`Ic_9)_E]8GPdS7f5^J7/0.B6M<]rs+14I
+s!%F9q<d\An*&ooiSrePhV6c:g=t9.d*^4dcd'bYb/qcHa8NsfaN)98_83n"\[]/SZF.-Kp9sb(
+r'C6IrBpKNs$crWrC;<-8P)NH91qrQ9hnJ\:f1+h<)lt"=BSg3>[:]D@:E_XAS5[kCM[m,EH6/D
+GBeF\I=Hd!K8#&:MN!OUOckroR$jG7StMdQV5L8lXKA\2Za@0M\\#Mg^VRe*`Q60EbK\>ZdF6Ur
+f@\g3gtglGiSrnYk2tjkl0@U$mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0L?"e8-JUr[GM#E2-MZ8V5N;&>3Nr>%:OR/,%
+Qi36LQiEBLQhm$-Qh?[CQi*-NQ'Ra3QNNVCR[a2ErgbcoJV/T/L51VBMi<XUO-#NfPa.N#R$a>3
+S"-(AT:hmOU8+N[V5C/gW2ZbrWiN2%XSo:"Y4f'tY5GF%X8o=#WrK$uW;`[uVPU)aUS@a]:S=>O
+St2C@R[KP1Q^3o%P`q8nOH5H_NJrgSMM[.EL5(D8K7ec,J:N)sI=-BfH?jaZGBS+NFE;JBEH#i6
+DJa6,CMR[!BP;$kAn>OaA,]p<@:9(A!a]/<r`fJ.>5h\)=9)G$<WZ9#<;f_s;Gg<i;#a>k:Adic
+9`Ic_9)_E]8GPdS7f5^J7/0.B6M<]rs+14LruCXWd(?`oY-"k/WiDtpVPBo\U7n6PT:MLCS!ofE
+Ql26VPa.JrP*;&mP*:rgOcGH]N/EFIMMm@Lmth%%r'C6IrBpKNs$crWrC;<-8P)NH91qrQ9hnJ\
+:f1+h<)lt"=BSg3>[:]D@:E_XAS5[kCM[m,EH6/DGBeF\I=Hd!K8#&:MN!OUOckroR$jG7StMdQ
+V5L8lXKA\2Za@0M\\#Mg^VRe*`Q60EbK\>ZdF6Urf@\g3gtglGiSrnYk2tjkl0@U$mI(#C"n;'Q
+o(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0L6UO@88kVtF;#O8k;".<^;Z0Jj;#a>Z:@q]f
+=T2J'=Su=u=T;P(>5qaa=S#Vl=nl)!=oMV)=oDGWJ:W?*KnbA>M2R=PNfT9bP*D5sQ^F//S"#q>
+StD[LTq\<XUnsrdVl6SoWiE,#XK;B&rN>jtrN?(#s/Z4$ri6!t!3#mp"fA,lUna[`Thh>RSt;LC
+S!ob4R$X,(Q'@JqP)t`cNfB!VMi*@ILPCP;KS+o/JUi9"I=6KiH?sj]GB\4QFEDSEEH,r9DJj<.
+Chmg$BkV0mB4b^dA7PUJ!F]C8?NOP>?2e(0>?_#/s&]8&rDiu"<)ifp!`DlmrD<Mis%`Jdr_3>b
+qb$iZr^ciTrC6]RogJRBog8@<%.!<Kn+-)Bp\=R\r;M9IN;k$IN,3$.=]\X)<)cdq;,^In;c-Cg
+;Gp@g:Jakb:JOYZr_<Yo:/Fea:/1^`%Sfer:JO\]:/+GY:esn^mns!Kr'L?Lr'^QRs$lrWIRm%%
+8kM`L9MJ5V:Jakb;H$Op<`W=*>$G6;?XI5N@qB4aBPM=!DJsN8FEMePH@('iJ:`E-L5CeHNK93b
+Pa.W(S"6.DTqnN_W2cr$YHbF@[^WfZ]Y;.s_SjF7aihlPcHstfeCN7(g=tE=hr*JQj5f@bkNV6r
+lg4$,s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LB6K-#UT_2pXT,F&Y5b^(YQV5:ZF%";[0a:N
+\%&u[]=bhkrkJKKp;-I>!5nfPotpUB!5e`Or5/EKs2+fR!Q;nT`9P>A`;IRS`;IUP`W4!W`rF'Z
+aSX*Zap-&5bg+P]dJhQId=?h$KSG5;M2I7NNfT9aP*;/rQC+&-S"#q>StD[LU8+N[V5C/gW2Zbr
+WiN2%rN6+&ribjrric@)rN6+$!3?+!:T::kVl-DgUnjc\U7n9RT:VXES"#k7R$a5+Q'IStP*(ie
+O,f3YN/EIKLkg_>KnP)2JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0D#S2RC2%?pB4h-S!G#^>
+@KBnFra,n:?!U]?>?b;1=oVS(=8l8#<W?%t;u]bq;>j>k:]F2f:&dod9D_?\8cD9V8,YpT7J0(D
+6hNe>6%T&es8Ds/q>0RGo'l,2jl57Xhqd)Bg&B\2e^Dmnd*U%]bPoU$aN)<>_o9R6a2>X-_7mRm
+\@AfL[C3KN[^Gq>ppKubrBgHMr'^QRs$lrWIRm%%8kM`L9MJ5V:Jakb;H$Op<`W=*>$G6;?=.,M
+@qB4aBPM=!DJsN8FEMePH@('iJ:`E-L5CeHNK93bPa.W(S"6.DTqnN_W2cr$YHbF@[^WfZ]Y;.s
+_SjF7aihoQcHstfeCN7(g=tE=hr*JQj5f@bkNV6rm-O--s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6i
+r;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0L>%M\uIYNgMM#E2+MZ/P.NW5%:O8G%*OoC[>
+Qi!'KQi<<KQhm$FQN3EAQgg==Qi*-MQ'VE9!1*SM".5LFS,8^/SUc<EKSG5;M2I7NNfT9aP*;/r
+QC+&-S"#q>StD[LU8+N[V5C/gW2ZbrWiN2%rN6+&ribjrric@)rN6+$!3?+!:T::kVl-DgUnjc\
+U7n9RT:VXES"#k7R$a5+Q'IStP*(ieO,f3YN/EIKLkg_>KnP)2JUi9#IXQWlH[:!`G^"@TF`__H
+EcH)<Df0H0D#S2RC2%?pB4h-S!G#^>@KBnFra,n:?!U]?>?b;1=oVS(=8l8#<W?%t;u]bq;>j>k
+:]F2f:&dod9D_?\8cD9V8,YpT7J0(D6hNe>6%T&ert#.kcHWi-YcP%2Xf8:tVksBf.\`W/TUq[E
+S=?"8Q^F,+QBd\uP*2#mOckliNf]?_NfB!TLPUhGMMd7HnVI7'qa(0IrBpKNs$crWrC;<-8P)NH
+91qrQ9hnJ\:f1+h<)lt"=BSg3>[:ZC@:E_XAS5[kCM[m,EH6/DGBeF\I=Hd!K8#&:MN!OUOckro
+R$jG7StMdQV5L8lXKA\2Za@0M\\#Mg^VRe*`Q60Ebg"G[dF6Urf@\g3gtglGiSrnYk2tjkl0@X%
+mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0L6UjL9928:K:utRQ;#a>X:@_Qb=9)M'=Su>!
+=T2G(>$9`boN)#prE8nt!*T;)s&oA(/qAP+KSG5;M2I7NNfT9aP*;/rQC+&-S"#q>StD[LU8+N[
+V5C/gW2ZbrWiN2%rN6+&ribjrric@)rN6+$!3?+!:T::kVl-DgUnjc\U7n9RT:VXES"#k7R$a5+
+Q'IStP*(ieO,f3YN/EIKLkg_>KnP)2JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0D#S2RC2%?p
+B4h-S!G#^>@KBnFra,n:?!U]?>?b;1=oVS(=8l8#<W?%t;u]bq;>j>k:]F2f:&dod9D_?\8cD9V
+8,YpT7J0(D6hNe>5n!&In+6/Ep\=R]r;M9INW0?nIqN:q=&i:$<)rlq#ZO`#;,L4h;,R6f!_uHa
+r_<r!:/4S]:/=SZ9hnGZ:eq!c#>Ruf:Jah_:%(sV62a.K6i9@P7K5jU7t+!#8P2TJ92&&S:/=\_
+;,U=l<E<.&=^#$7?!^lH@Uit\B4u$qCi402EccGJG^=^bIt3-'KnbGAN/`m\P*D6!R@Bb=TV80X
+Vl6VsXfo"9['mHS]=bkm_8=.0aN;WLc-F\`e'ut#f\5*8h;@/LioB+^k3)!nlKmm)mf2_ZnF?)?
+oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LRra@NTs_E!XT,F&Y5b^(YlD!.Z3%A>[/RK5
+[Ka4N\[oDc^AbnI_">J<_Z%IM_=kb>_>M1L_#V@O_Z@]prl"fTrP\6FrP\KMpr3BUaN48#s2m4B
+bg"GZcd:(eJV/T/L51VBMi<XVO-,ThPa.Q$R$jG5S=Q7DTV8*TUnjiaVl-JmWiE,#XT#@%XoP[&
+Yl(d(ZM_!*YlCp,Y5YR'X8o=#WWfB#Vl-DgrhN;aU7n9RT:VUDS"#k7R$a5+Q'IPrP*(ieO,f3Y
+Mi*@JLkg_>KnG#0JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0Chmg$Bk_6oB4h-S#%V4Q@UW\Q
+ra,\4?2e(1>?Y50=TV],=8l8#<W?%t;u]bq;>j>k:]F2f:&dod9DhE\8cD9W8,PjS7J0(E6hNe=
+6%T&es8W*Zq>BaQoC;/0jPo+VgtUZ>g=k?8e'cXjcHXVXaiMWFaN)9<_o0L6a2,O,^V%4i\$iQI
+[C3KN[^Gq>ppL#cr'L?Lr'^QRs$lrWIRm%%8kM`L9MJ5V:Jakb;H$Op<`W=*>$G6;?XI5N@qB4a
+BPM=!DJsN8FEMePH@('iJ:`E-L5CeHNK93bPa.W(S"6.DTqnN_W2cr$YHbF@[^WfZ]Y;.s_SjF7
+aihoQcHstfeCN7(g=tE=hr*JQj5f@bkNV6rm-O--s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZe
+rdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LRq-D[I><dMM#W>-MZ&J5N;8J5Nr>%8OR&&+
+QM-[=QMd*GQL:+*QM[$GQN!6NQN!3QR$jD4r1#<hK7el4LP^kGN/`mZOckomQ'Rc(R@B\9SXuIH
+Tq\<XUnsrdVl6SpWiN2%riQ4'!3c:(r3?1*r3?1(s0)I*riQ4%!3?+!"f\GuVl$<iUe[\ZTqS-O
+St2C@S!ob4R$X,(Q'7AoOcYWbNfB!UMM[1GLPCP;K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9
+DJj<-CMR[!BkV0mB)Z?GA7K(X@:<RC?NFJ=r`fM/>$Co.!a&N*r`9&!s&Atrs&/korD<Mis%`Jd
+s%NDbr(?oZr^clUr'pTQogJUCog8=;JcC?%&(]"@[^`NEY-+k+W2QViU]."fT`:SuSXc4>R@0D/
+Q^*o%Q'@GoPEM)mP*,a)%$$=,Mi*:GMMm@LM2:\Y!/g\?r'L?Lr'^QRs$lrWIRm%%8kM`L9MJ5V
+:Jakb;H$Op<`W=*>$G6;?XI5N@qB4aBPM=!DJsN8FEMePH@('iJ:`E-L5CeHNK93bPa.W(S"6.D
+TqnN_W2cr$YHbF@[^WfZ]Y;.s_SjF7aihoQcHstfeCN7(g=tE=hr*JQj5f@bkNV6rm-O--s6g-\
+nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/bQoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LRmfe<924bLj\btQ!)MiSn6,Her)rr"r)qiX
+p/h5qs&o,!!*T;)s&gn(K7el4LP^kGN/`mZOckomQ'Rc(R@B\9SXuIHTq\<XUnsrdVl6SpWiN2%
+riQ4'!3c:(r3?1*r3?1(s0)I*riQ4%!3?+!"f\GuVl$<iUe[\ZTqS-OSt2C@S!ob4R$X,(Q'7Ao
+OcYWbNfB!UMM[1GLPCP;K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9DJj<-CMR[!BkV0mB)Z?G
+A7K(X@:<RC?NFJ=r`fM/>$Co.!a&N*r`9&!s&Atrs&/korD<Mis%`Jds%NDbr(?oZr^clUr'pTQ
+ogJUCog8=;$L[BSo_/%SqYU3iJcCf2#jS%&@pE/<=B>E##uXVt<)can;,C0i;#jDk;#X2n9hnGZ
+:/:dar_=&$9MS>Y:ejb]:/4MX:Jah_:%(sW62X(J6i9@P7K5jU7t+!#8P2TJ92&&S:/=\_;,U=l
+<E<.&=^#$7?!grI@Uit\B4u$qCi402EccGJG^=^bIt3-'KnbGAN/`m\P*D6!R@Bb=TV80XVl6Vs
+Xfo"9['mHS]=bkm_8=.0aN;WLc-F\`e'ut#f\5*8h;@/LioB+^k3)!nlKmm)mf2_ZnF?)?oCW%T
+!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LRrF%GU9pifXT,F&Y5b^(YlD!.Z2q;=rjDd7
+$+IFT]">Vg^;%G^_">J<_Yh=H_>1t>_>V7N_$7co`5BO4`VIIA`W!dV_o2Mm!65#WpW!-PrlP2_
+1!@ebcHjh`JqJ`2L5:\DN/WdXOHPckQ'I]'R@9V8SXuIHTq\<XUnsrdVl6SpWiN6#XTGZ/YPtd*
+Z2V'$Zi790Z2Lm.YHG&-XT>N(ri/DdW2HPjV59u`US=HUT:VXFS=?":R@'A.QBd\uP*1rhO,o9Z
+N/NRMM26qAKnP)2Jq8H&IsufoI!^0bG^"@TF`__HErL%bE,TW3D/=!'C2*Z\&8,TdARo=]@U`bS
+?sd8I?=!P8!aAi3r`K;)=',B%s&B%urDW_os&&_ks%iYir([2br_*/]r^m&ZqFCKRr'g6Gq*XgA
+og+0/K)[_(qY'=Io^D&+jPf%Sgt^`AgY:H4dEg1dccs\VaMl6A`l5j6`59O6`4s(&^V.:i[C3?G
+[.Lg%[JW>g6N':L7/o^U7f>i+84cBF8kVfN9heAY:f("e;cHat<`iL.>?kH@?X[DRAS#LfC27X'
+DfKf>Fa&(VH[UBoJqJc3M2I7OO-,TiQ'du/SXuLJUnsufWiW>+Z*UgG\%0,`^;%M$`5Tg>bKS5V
+d*^=lf%8R.gYCWBi8N\UjQ>Ufl07L"m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD>A
+J,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LRq$;YI>!:CM#W>-MZ&J5N;AP6Nr>%7OQho&
+QMHm=QMm0HQLpO/Q2m9NQMHmGQN!6LQN*:*R$jG6S"#"^KSG5;M2I7NNfT9bP*D5sQ^F20S"-%@
+T:hmPUSO]^VPg>jWN)u!XT#='Y-5&.Yl:p,ZLkL&ZMq--YQD#2Y5YO(XK2?#7B*5`Vl$;eUnjc[
+TqS*MSt2C@S!ob4R$X,(P`q8nOcYWbNJrgSMM[1GLPCM9K7ec,J:N,uI=6KiH?jaZGBS+NFE;L%
+E=$T&DJj<-CMR[!rb)jUAn>OaA7K(X@:<PN?X@&Er`fM/>$Co.!a&N*r`9&!!*&nqs&/korD<Mi
+s%`Jds%NDbr(?r[rCHcTrC6]RoL/LBog8=;JcCH($LuKh\[JiIYHP%-rhomoUS@a_#GIf^SXl7>
+RJrQ[Q^3l$Q'7DoP*5g,"-S_,O8b.BN/ELJM#E22M=?<$M>T[;6N':L7/o^U7f>i+84cBF8kVfN
+9heAY:f("e;cHat<`iL.>?kH@?X[DRAS#LfC27X'DfKf>Fa&(VH[UBoJqJc3M2I7OO-,TiQ'du/
+SXuLJUnsufWiW>+Z*UgG\%0,`^;%M$`5Tg>bKS5Vd*^=lf%8R.gYCWBi8N\UjQ>Ufl07L"m-X6@
+mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LRmfe<9MA1K;!(XR:]O;R:@MEX=T)D$=Su=Z
+=9;W-=S>hg=9)M'=t5,VKSG5;M2I7NNfT9bP*D5sQ^F20S"-%@T:hmPUSO]^VPg>jWN)u!XT#='
+Y-5&.Yl:p,ZLkL&ZMq--YQD#2Y5YO(XK2?#7B*5`Vl$;eUnjc[TqS*MSt2C@S!ob4R$X,(P`q8n
+OcYWbNJrgSMM[1GLPCM9K7ec,J:N,uI=6KiH?jaZGBS+NFE;L%E=$T&DJj<-CMR[!rb)jUAn>Oa
+A7K(X@:<PN?X@&Er`fM/>$Co.!a&N*r`9&!!*&nqs&/korD<Mis%`Jds%NDbr(?r[rCHcTrC6]R
+oL/LBog8=;$1IEVp@nCZqu$GEs,d6ebDU.G>?P$/<E9#ss&'#";c6Li;Z9N%:esk`:JX\[:/=V\
+:&Icl9i"DW:/=V\r_<Pi:JOX`:B=9dmns!Kr'L?Lr'^QRs$lrWIRm%%8kM`L9MJ5V:Jakb;H$Op
+<`W=*>$G6;?XI5N@qB4aBPM=!DJsN8FEMePH@('iJ:`E-L5CeHNK93bPa.W(S"6.DTqnN_W2cr$
+YHbF@[^WfZ]Y;.s_SjF7aihoQcHstfeCN7(g=tE=hr*JQj5f@bkNV6rm-O--s6g-\nac8Bo`"Lb
+p@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/kToCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LRr!S;V66\rX7E@lXoGU'YlD!.ZN%92[/IB:
+[^`lZ]=krX^]2+?_>1tJ_ZRcn_SZ;fpqcgDo"k4?!5nHIpVd-Nqo/HNrl+oWs2F`P"NSU(aN4A&
+0?VJ]bg"GZc\$q+LP^kGN/`mZOckomQ'Rf)R[]h<StD[LU8+N[V5L5iWN)u!XT#=&Y-7i/s0;U0
+qm5t&qm6=.s0;R-$a6_9Xf\\+X/`2!W;`\_VPU)aUS=HTT:VXFS=?":R@'A-Q'IStP*1rgO,f3Y
+N/NRMLkg_>KnP)2Jq8H&Isl`mH[:!`G^"@TF`__HEcH)<DuOVlD/=!'C2%?pB4kgfARo:\@U`bR
+?sd8I?=!P8!aAi3r`K;)=',B%s&B%urDW_os&&_ks%iYirD!8bs%E5]r^m&ZqFCKRr'g6Gq*XgA
+og+0/K`<e&qsO"Fna5N#jPf%PgYCW@gY:H3dF$:ebfn8PaN)BA`5KR1_8F=5_S3k$]tCqd[f3T:
+[CE]U\$u1Aq6g)cr'L?Lr'^QRs$lrWIRm%%8kM`L9MJ5V:Jakb;H$Op<`W=*>$G6;?XI5N@qB4a
+BPM=!DJsN8FEMePH@('iJ:`E-L5CeHNK93bPa.W(S"6.DTqnN_W2cr$YHbF@[^WfZ]Y;.s_SjF7
+aihlPcHstfeCN7(g=tE=hr*JQj5f@bkNV6rlg4$,s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZe
+rdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LRpKfMI>*=CM#W>/MZ&J5N;8J5Nr>%7OQ_i"
+QMQs=QN!6IQMHm/QN*<OQM?gFQN*<MQN*9PR$mrC-\I,-LP^kGN/`mZOckomQ'Rf)R[]h<StD[L
+U8+N[V5L5iWN)u!XT#=&Y-7i/s0;U0qm5t&qm6=.s0;R-$a6_9Xf\\+X/`2!W;`\_VPU)aUS=HT
+T:VXFS=?":R@'A-Q'IStP*1rgO,f3YN/NRMLkg_>KnP)2Jq8H&Isl`mH[:!`G^"@TF`__HEcH)<
+DuOVlD/=!'C2%?pB4kgfARo:\@U`bR?sd8I?=!P8!aAi3r`K;)=',B%s&B%urDW_os&&_ks%iYi
+rD!8bs%E5]r^m&ZqFCKRr'g6Gq*XgAog+0/L]7M:c,d?%riZg7XK&7uVPBo\USFNUT:Z%Ps-`nS
+s-F1\Q'ISsP*(ohOctrjNrG(CNJrgSLku%f!f;ekn;-s-r'L?Lr'^QRs$lrWIRm%%8kM`L9MJ5V
+:Jakb;H$Op<`W=*>$G6;?XI5N@qB4aBPM=!DJsN8FEMePH@('iJ:`E-L5CeHNK93bPa.W(S"6.D
+TqnN_W2cr$YHbF@[^WfZ]Y;.s_SjF7aihlPcHstfeCN7(g=tE=hr*JQj5f@bkNV6rlg4$,s6g-\
+nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LRm]\98kVqK:utRR:]O;R:B+,h=RfPb=T2J%
+=Su=Z=T;P'=S>hi==RHW>(_N`LP^kGN/`mZOckomQ'Rf)R[]h<StD[LU8+N[V5L5iWN)u!XT#=&
+Y-7i/s0;U0qm5t&qm6=.s0;R-$a6_9Xf\\+X/`2!W;`\_VPU)aUS=HTT:VXFS=?":R@'A-Q'ISt
+P*1rgO,f3YN/NRMLkg_>KnP)2Jq8H&Isl`mH[:!`G^"@TF`__HEcH)<DuOVlD/=!'C2%?pB4kgf
+ARo:\@U`bR?sd8I?=!P8!aAi3r`K;)=',B%s&B%urDW_os&&_ks%iYirD!8bs%E5]r^m&ZqFCKR
+r'g6Gq*XgAog&iQoChtTqYU2As,d6nY^C%i>?=m,<)cdq;c-Ck;Gp?j;?B]l:]=/u:JFS[:Jae]
+9heDZrD!Sk:/+JZ:/=X`:BXEg:espV;>WZW6N':L7/o^U7f>i+84cBF8kVfN9heAY:f("e;cHat
+<`iL.>?kH@?X[DRAS#LfC27X'DfKf>Fa&(VH[UBoJqJc3M2I7OO-,TiQ'du/SXuLJUnsufWiW>+
+Z*UgG\%0,`^;%M$`5Tg>bKJ/Ud*^=lf%8R.gYCWBi8N\UjQ>Ufl07L!m-X6@mfi4No()DErq-?d
+p\4[^s7u]kr;6Kkrr)KgJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/nUoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LRq[,,U7\HjX/klo"0J`0YPk^*Z2_-0Zi@E3
+[0F(K\@T;b^&GeH_"#8;_Z.ON_Y_.F_>1t>_>;"K_t:n:`VIFP`Uh+La8O*ZaYq;bbKS5VKS>/:
+M2I7NNfT9bP*D5tQ^F21S"6.BTV8'SUnjibVl6SpWiN5'Xfek2YctC;ZMh-/[/IE.[f*W5[/I?2
+ZN%3/YQ:r1riH@*X/`2!W;`\qVPU)aU7n9RT:VXFS=?":R@'>,Q'IStP*(ieO,f3YN/NOLLkg_>
+KnP)2Jq/B$IXQWlH[:!`G^"@TF`__HEcH)<Df0H0Ci!m&C2%?pB4baeARo<M@KBnFra,_5?![G7
+!F&b,=oVV(=8l5%<E)rr;u]_q;>j>j:]F2g:&[id9D_?\8c;3V8,YpT7J'"D6hNe=6%T&kruq@9
+r9a+HnEK,sjPf"OgYUcAgY16+d*U+ac-"/K`lH*<rPKAe`5fd1^q[Us]XYAXZEgjF[C<WQ\,!K.
+[JN8f6N':L7/o^U7f>i+84cBF8kVfN9heAY:f("e;cHat<`iL.>?kH@?X[DRAS#LfC27X'DfKf>
+Fa&(VH[UBoJqJc3M2I7OO-,TiQ'du/SXuLJUnsufWiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=l
+f%8R.gYCWBi8N\UjQ>Ufl07L!m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/hSoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LRpKcKI"$a+nqd7$rJLQ3s,?f6s,R&=pQ4U$
+s-<;Dq3U]=rKmPM!1!MKs-N_Ns-Mf4o9]KCrg3SLs-GO/R[\taL5:\DN/WdXOHPckQ'Rc(R@B\:
+St;UKTqeEZV5L5iWN)u!XKAV-YHP17Z*CV5Zi7?1[J@90[JmQ3Zi@?2Z2Us.YHIl,"g"c)Wi;rr
+VcK[kUnj`YTqJ$LSt2C@S!ob4Q^3o%P`q8mOH5H_NJrgSM2@%DL5(D8K7ec+J:E#rI=-BfH?jaZ
+GBS+NFE;JBEH#i6DJa3+CMR[!BP;$jAn>OaA,]p<@:9(A!a]/<r`fJ.>5h\)=T;J%<WZ9#<;fbq
+;?0Sm;#X8j:Amod9`Ic_9)_E\8GYjT7f5^I7/94C6M3Wqs,$b!e^D+;[B6X9Y,\M#W26;bU8+KX
+TV%dFS!ob5R$a5*Pa232#EY(0P*1rgOSt1EN/ELJLl%"Hre^-#qa(-HrBpKNs$crWrC;<-8P)NH
+91qrQ9hnJ\:f1+h<)lt"=BSg3>[:]D@:E_XAS5[kCM[m,EH6/DGBeF\I=Hd!K8#&:MN!OUOckro
+R$jG7StMdQV5L8lXKA\2Za@0M\\#Mg^VRe*`Q-'BbK\>ZdF6Urf@\g3gtglGiSrnYk2tjkl0@U$
+mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LRm]S58OuVH;!(XT;#a>R:B+,i;#=Ac=n>bo
+=oDJ#=l3?[=oVUu=8,hs=YPM_L5:\DN/WdXOHPckQ'Rc(R@B\:St;UKTqeEZV5L5iWN)u!XKAV-
+YHP17Z*CV5Zi7?1[J@90[JmQ3Zi@?2Z2Us.YHIl,"g"c)Wi;rrVcK[kUnj`YTqJ$LSt2C@S!ob4
+Q^3o%P`q8mOH5H_NJrgSM2@%DL5(D8K7ec+J:E#rI=-BfH?jaZGBS+NFE;JBEH#i6DJa3+CMR[!
+BP;$jAn>OaA,]p<@:9(A!a]/<r`fJ.>5h\)=T;J%<WZ9#<;fbq;?0Sm;#X8j:Amod9`Ic_9)_E\
+8GYjT7f5^I7/94C6M3VLo(;_QqYU9kJcCr6$KR[rAQr;=<`N.!r_a)#;c6Om;,U:h;,I3erD"2*
+:/4JX:Jae^9i"JY:/=V\:JOYZ:JO\\r_EPh;XdQ\62X(J6i9@P7K5jU7t+!#8P2TJ92&&S:/=\_
+;,U=l<E<.&=^#$7?!grI@Uit\B4u$qCi402EccGJG^=^bIt3-'KnbGAN/`m\P*D6!R@Bb=TV80X
+Vl6VsXfo"9['mHS]=bkm_8=.0a2lEHc-F\`e'ut#f\5*8h;@/LioB+^k3)!nlKdg(mf2_ZnF?)?
+oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/hSoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LRqHr$R%COnoW8(p!NrX'YlD!.ZN%62[/RH=
+[^`lZ]=kqm^])%<_>D(L_t_+D_#2%E_XkV?_Yh=H`:1bA_uRdJ`rF*Wa>:r\bKJ+_L51SAMi<XV
+O-,ThQ'I]'R@9V8St;RJTqeEZV5L5iWN)u!XKAV-YHY79Z*OA8s0Vg6ppU12ppU41s0Va2A?rJF
+Yct=7Y-"h-X/`2!WMl_mVPU)`U7n9RT:VXFS=?"9R$a5+Q'ISsP*(ieO,f3YMi*@JLkg_>KnP)1
+JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0Chmg$C2%?pB4h-S!G#^>@KBnFra,\4?2e+/>6%k+
+=oVS(=8l8#<W?%t;u]bq;>j>k:]F2f:&dod9D_?\8cD9V8,YpT7J0(D6hNe=6%T&mrsef#p@.YC
+m-!Nmj5A_JrnSsWgY(*'d*L"]bfRrG`Q6':_Sa:-_oBX1^VIUt]XbP\['R*H\@9!I\,!K.[JN8f
+6N':L7/o^U7f>i+84cBF8kVfN9heAY:f("e;cHat<`iL.>?kH@?X[DRAS#LfC27X'DfKf>Fa&(V
+H[UBoJqJc3M2I7OO-,TiQ'du/SXuLJUnsufWiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=lf%8R.
+gYCWBi8N\UjQ>Ufl07L!m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/hSoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LRp0EBG^P7*r.tB.qhY3-q2531s,?i7s,R&=
+pQ4O"rK[,Cq3U]=rKmPMs-<AF!12u:!13VLm[*m<s-GC+KSG8<M2R=PO,oEdPEhE"R$jD4S=Z=E
+TqS6WUnsueW2ZesX/rG*Y-5(6Z*CV6Zi@E4[J730\+mE3[K!W4ZXgAHZ*:I9YHG"0XK/A$WMuho
+Vl$;dUS=HUTV%gISXc1=R@'A.QBd`"P*1rhO,o<\N/NRMM26qAL4t;5Jq8H&IsufoI!^0cH$FOW
+G'.nKF)l8?E,TW3D/=!'C2.HrBP1rVAH?=OraGn:@/aL6?=!P8s'#J,r`T8'!*B/#s&K(ur_rhp
+s&&_ks%iYir([2br_*,\r^m)[q+(BQr'g9Hpd=^@og+0/N;j7Rd*B,0['-[9XJu2ts._!:US=KU
+T:VUDR[KS2R$X/)Pa.JsP*(lfOckffNfT3]NJrgSM27%HrJC!!qa(-HrBpKNs$crWrC;<-8P)NH
+91qrQ9hnJ\:f1+h<)lt"=BSg3>[:]D@:E_XAS5[kCM[m,EH6/DGBeF\I=Hd!K8#&:MN!OUOckro
+R$jG7StMdQV5L8lXKA\2Za@0M\\#Mg^VRe*`Q-'BbK\>ZdF6Urf@\g3gtglGiSrnYk2tjkl0@U$
+mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/eRoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LRmTV48kD_J;#*uc;"IQa;#a>S:B+,f;#"/b
+=n>bo=oDJ%=TMW-hcTeZr`JttpK0&$L51SAMi<XVO-,ThQ'I]'R@9V8St;RJTqeEZV5L5iWN)u!
+XKAV-YHY79Z*OA8s0Vg6ppU12ppU41s0Va2A?rJFYct=7Y-"h-X/`2!WMl_mVPU)`U7n9RT:VXF
+S=?"9R$a5+Q'ISsP*(ieO,f3YMi*@JLkg_>KnP)1JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0
+Chmg$C2%?pB4h-S!G#^>@KBnFra,\4?2e+/>6%k+=oVS(=8l8#<W?%t;u]bq;>j>k:]F2f:&dod
+9D_?\8cD9V8,YpT7J0(D6hNe=5m6fRq>:)@s-!BbaGObD>5hS-<E)jo;c-Ek;ZK_p;'\t6:f'qa
+:/+JY:ese\9heAY:JOYZ9MSAY:JO\[:ejh_:/=^c:[_0X62X(J6i9@P7K5jU7t+!#8P2TJ92&&S
+:/=\_;,U=l<E<.&=^#$7?!grI@Uit\B4u$qCi402EccGJG^=^bIt3-'KnbGAN/`m\P*D6!R@Bb=
+TV80XVl6VsXfo"9['mHS]=bkm_8=.0a2lEHc-F\`e'ut#f\5*8h;@/LioB+^k3)!nlKdg(mf2_Z
+nF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/hSoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!e>QOeB(jorJ7tY-+u*YlD!.ZN%62[/RH;
+\%&u\]Y;,Y_!f,:_>qLJ_Y(_C_>;%>_>;%H_t_1?`V@@O`Uh(Na2Z0ta=bWYKnbA>MMmFRO-#Nf
+Pa.Q%R$sM7SXuIITq\?YV5L5iWN*##Xf\b0YctC;ZMq03['d=?[f3c.\Giu8[f<`8[/RE3Z2h0/
+Y[4N9Xf\\*WiE%tW2HMhUnjc[TqS-OSt;LBS!ob4R$X,(P`q8nOcYWbNJrgSMM[1GLPCM9K7ec,
+J:N,uI=6KiH?sg[GBS+NFE;MDEH,r9DJj<-CMR[!BkV0mB)Z?GA7K(X@:<RC?NFJ=r`fM/>$Co.
+!a&N*r`9&!s&Atrs&/korD<Mis%`Jds%NDbqb$iZr^ciTrC6]RogJRBog8=;JcCZ.,5;!&o();5
+k2taai8!)Bh;$c<f[8*nc-=JUaiMNB`l,d3rk\WQ'>_E!^:h.h\@/cMZEpsI\$rcS\+7!(62X(J
+6i9@P7K5jU7t+!#8P2TJ92&&S:/=\_;,U=l<E<.&=^#$7?!grI@Uit\B4u$qD/O93EccGJG^=^b
+It3-'KnbGAN/`m\P*D6!R@Bb=TV80XVl6VsXfo"9['mHS]=bkm_8=.0a2lEHc-F\`e'ut#f\5*8
+h;@/LioB+^k3)!nlKdg(mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/hSoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!df)G'o%'rJ:?+s+pW1q2531s,?o9rf6r<
+p5nBuqj$oAqNpc=s-N_NrKZ?-s-N\MnWs<EQ^@Z:/XM0GLP^nHN/is\P*2&pQC+&.S"-%@T:qsQ
+UnjibVl6SpX/rG*Y-5(6Z*CV6ZN@MA[JdQ5\+I30\,<]7[/dT5Zi@<2Z2Ut6YHG"0XK/A$WMuho
+VPU)aUS=HUTV%gISXZ+;R@'A.QBd\uP*1rhO,o9ZN/NRMM26qAKnP)2Jq8H&IsufoI!^0cG^"@T
+F`__HF)l8?E,TW3D/=!'C2%BqBP1rVAHl[T@U`bS@/aL6?=!P8!aAi3r`K;)=',B%s&K(ur_rhp
+s&&_ks%iYir([2br_*,\r^m)[q+(BQr'g9Hpd=^@og+0/NrKC>e@r?#YHY45ri,pqs.fUg*MK4#
+SXl:?R[TV1R$X,&Pa%ApOcb`dOcb`cOH,A#N!>2sLPUeEMZ/J%M#'F86N':L7/o^U7f>i+84cBF
+8kVfN9heAY:f("e;cHat<`iL.>?kH@?X[DRAS#LfC27[(DfKf>Fa&(VH[UBoJqJc3M2I7OO-,Ti
+Q'du/SXuLJUnsufWiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=lf%8R.gYCWBi8N\UjQ>Ufl07L!
+m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/hSoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!c]78kMiRohbH]qbZo^s%r_kk"bqPqbZrf
+p0$rgrE9&#s&n/[qcWo#qH*Jp/;8h6M2I4MNfT9bP*D5tR$a>3S=Q7DTqS3VUnsueW2ZetXKAV-
+YHY79Z*OA8!joACrO2^7oXOn0r3lX5!4;a3s0;X0rif_4Y-"h-X/`2!WMl_lV50o^U7n9RT:VXF
+S"#k7R$a5+Q'@JqP*(ieO,]*WMi*@JLkg_=KS+o/JUi9#IXQWlH[:!_GB\4QFEDSFEcH)<Df0H0
+Chmg$Bk_6oB4h-S#%V4Q@UW\Qra,\4?2e(1>?Y50=TV],=8l8#<W?%t;u]bq;>j>k:]F2f:&dod
+9D_?\8cD9V8,YpT7J0(D6hNe=5m$cVqgnd2rtt@(G@t,_=BAO'<)QUn:f11i;Gg:h:f1*g:]F,o
+:/Fb^:/"AVr_EYl9h\;Vr_<hs:/4S[:JX_]:esmd;Y!]]62X(J6i9@P7K5jU7t+!#8P2TJ92&&S
+:/=\_;,U=l<E<.&=^#$7?!grI@Uit\B4u$qD/O93EccGJG^=^bIt3-'KnbGAN/`m\P*D6!R@Bb=
+TV80XVl6VsXfo"9['mHS]=bkm_8=.0a2lEHc-F\`e'ut#f\5*8h;@/LioB+^k3)!nlKdg(mf2_Z
+nF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/hSoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!e/EP+f7[pT4Cs!NrX%YlCs;ZEppF[C*HP
+\[oDd^VB`_m_SD0o"b7@qSMd=pqm'Ks24oVqo&$Dq8E<Pn](ULrQ,"n.#<_;N/`mZOckonQ'[l+
+S"#t?T:hmPUSO``Vl6SpX/rG*Y-5(6Z*OA8!joACrjMj9rj_I.s1&*<rO2a6!4;a3<O/m7Yct=6
+Xf\\*WiE%sVl-DgUnjc[TqS-OSt2C@S!ob4R$O#&P`q8nOcPQ`NJrgSMM[.EL5(D8K7ec,J:N)s
+I=-BfH?jaZGBS+NFE;JBEH#jqD?XlnCMR[!rb)jUAn>Oa@q/tW@:3JM?X@&Er`fM/>$Co.!a&N*
+r`9&!!*&nqs&/korD<Mis%`Jds%NDbqb$iZr^ciTrC6]RogJRBog8=;JcCc1rq\YDoC;,/k2bU^
+hV6iAh:pW7e'ZOgc-4ASaMu3<`5BI._SF(/^qIOt^:_(g\$`QKZF.0N\@/iT\+7!(62X(J6i9@P
+7K5jU7t+!#8P2TJ92&&S:/=\_;,U=l<E<1'=^#$7?!grI@Uit\B4u$qD/O93EccGJG^=^bIt3-'
+KnbGAN/`m\P*D9"R@Bb=TV80XVl6VsXfo"9['mHS]=bkm_8=.0a2lEHc-F\`e'ut#f\5*8h;@/L
+ioB+^k3)!nlKdg(mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/nUoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!dZ"FF/apLktq`s+pW1q2531s,?o9rJpo=
+o8r'rs-3DGs-<YOqNguEm?[[8s-E\Mk*H"5rg*)@s-NeQrg*S=.#<_;N/`mZOckonQ'[l+S"#t?
+T:hmPUSO``Vl6SpX/rG*Y-5(6Z*OA8!joACrjMj9rj_I.s1&*<rO2a6!4;a3<O/m7Yct=6Xf\\*
+WiE%sVl-DgUnjc[TqS-OSt2C@S!ob4R$O#&P`q8nOcPQ`NJrgSMM[.EL5(D8K7ec,J:N)sI=-Bf
+H?jaZGBS+NFE;JBEH#jqD?XlnCMR[!rb)jUAn>Oa@q/tW@:3JM?X@&Er`fM/>$Co.!a&N*r`9&!
+!*&nqs&/korD<Mis%`Jds%NDbqb$iZr^ciTrC6]RogJRBog8=;JcCl4+SO1+\@8oMYHFq)WMlbl
+UnXWYU7\$JSXc1<R@'A.Q^.Q7&<i9=OH5NeOH5K_NJrgUMi%Fh",_qlMXH;s62X(J6i9@P7K5jU
+7t+!#8P2TJ92&&S:/=\_;,U=l<E<1'=^#$7?!grI@Uit\B4u$qD/O93EccGJG^=^bIt3-'KnbGA
+N/`m\P*D9"R@Bb=TV80XVl6VsXfo"9['mHS]=bkm_8=.0a2lEHc-F\`e'ut#f\5*8h;@/LioB+^
+k3)!nlKdg(mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/hSoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!cZ48P;`NpJCZ_q,$`]s%r_kk>)%Qq,$Wa
+pK@#gs&mlSq,m]"qH*Prs+VqXM2I7OO,oEdPEhE"R$jG5SXuIHTq\<XV5C/hWN*##Xf\b0YctC<
+rj)[5[C-"Bs0r!;n@AS/s0qs8s0Vj6rj,V1Z*CO;YHG"0XK/A$WMl_mVPU)aUS=HUTV%gHS=?":
+R@'A-Q'IStP*1rgO,f3YN/NRMLkg_>KnP)2Jq8H&IXQWlH[:!`G^"@TF`__HEcH)<DuOVXD/=!'
+C2*Z\&8,TdARo:\@U`bR?sd8I?=!P8!aAi3r`K;)=',B%s&B%urDW_os&&_ks%iYir([2br_*,\
+r^m)[q+(BQr'g9Hpd=^@og&TUJcCr6#gn]M@p<&:<`T,t$W0f";c?Rm:f:+f;>j;j:&dug:B4)f
+9asln9hnGW9heAW:/F\]r_<Ji:B"#l:ejkc;Y!]]62X(J6i9@P7K5jU7t+!#8P2TJ92&&S:/=\_
+;,U=l<E<1'=^#$7?!grI@Uit\B4u$qD/O93EccGJG^=^bIt3-'KnbGAN/`m\P*D9"R@Bb=TV80X
+Vl6VsXfo"9['mHS]=bkm_8=.0a2lEHc-F\`e'ut#f\5*8h;@/LioB+^k3)!nlKdg(mf2_ZnF?)?
+oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/kToCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!e)ANhN2GX8/jsXoGR'YPbU-Z*L[A[/RH;
+\%&u\]Y;/Z_!Su+_XP>@_>1tA_>hCN_>(kM_o0L4`Vd[E`VIIP`U_#/`Q#s=aN0-nM2R=PO-#Nf
+Pa.Q%R$sM7St;UKU8+N\VPgAlWiN5'Xfek3Yd(L?Za@-J[^NZS\@DIIr4;j=qmu^9s1&*<rjI$Y
+['[0GZEga>Yck43XfSS'Wi;qpVl$;dUnaZXTqJ!KSXc1=R[KP0QBd`"PEM&iO,o<\N/W[OM26qA
+L4t;5K7\W(IsufoI!^0cH$FOWG'.nKF)l8?E,TW3D/F*)CMIQsBP1siAS#C^@q&nU?sm>K?=$q:
+>QS,5>5hY+=BAT'<rZ/"<;fbq;ZBVm;#a>k:Amod9`@]_9)_E\8GYjS7f>dJ7/0.B6M3Wqs,d7@
+pA=COo'ko,k2kU\gt^Z>gtLE4da?Ffc-=AOa2Z*<`59@+_84(-^V%=r]Xt\^[C!9FZaI6N\$l:F
+o!\B\r'L?Lr'^QRs$lrWIRm%%8kM`L9MJ5V:Jakb;H$Op<``C+>$G6;?XI5N@qB7bBPM="DJsN8
+FEMePH@('iJ:`E-L5CeHNK93bPa7])S"6.DTqnN_W2cr$YHbF@[^WfZ]Y;.s_SjF7aihlPcHstf
+eCN7(g=tE=hr*JQj5f@bkNV6rlg4$,s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/hSoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!dPrF*i@hqM5*,qMG--s,6o9rJgf:s,Z`4
+j,sA+qNV&Hrg3PKq3UK7pm($.r0RGLrg*VNop>ZFs->HrM2@.LNK90aP*D5tR$a>3S=Z=FTq\<X
+V5C/hWN*##Xf\b0YctC<Za7$H[C3NQ\%&sG\bs&;]DK2;\c92>\,Ng[[C!<IZa-mAYct=6Xf\\*
+WiE%sVl-DgUnjc[TqS-NSt2C@S!ob4Q^3o%P`q8mOH5H_NJrgSM2@%DL5(D8K7ec+J:E#rI=-Bf
+H?jaZGBS+NFE;JBEH#i6DJa6,CMR[!BP;$kAn>Oa@q/tW@:3JM?X@&Er`fM/>$Co.!a&N*r`9&!
+!*&nqs&/korD<Mis%`Mer_3;ar(?r[rCHcTr'pWRoL/IAog8=;JcCr6%cu*S[^NBDYHFn(WMl\i
+rhBFd-(ga!S=?"9R$j;-Q'ISuPEM)kO,oBaO,o<]NJrdQMM[.FMM[8jM=68s62X(J6i9@P7K5jU
+7t+!#8P2TJ92&&S:/=\_;,U=l<E<1'=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=^bIt3-'KnbGA
+N/`m\P*D9"R@Bb=TV80XVl6VsXfo"9['mHS]=bkm_8=.0aN;WKc-F\`e'ut#f\5*8h;@/LioB+^
+k3)!nlKdg(mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/hSoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!c]784Z?Ipe^c`pJCfcr)!Dhj\GhOp/(6\
+pf[;ms&o;&!*T/#!*@uYpf[Gpr)bb1M2@.LNK90aP*D5tR$a>3S=Z=FTq\<XV5C/hWN*##Xf\b0
+YctC<Za7$H[C3NQ\%&sG\bs&;]DK2;\c92>\,Ng[[C!<IZa-mAYct=6Xf\\*WiE%sVl-DgUnjc[
+TqS-NSt2C@S!ob4Q^3o%P`q8mOH5H_NJrgSM2@%DL5(D8K7ec+J:E#rI=-BfH?jaZGBS+NFE;JB
+EH#i6DJa6,CMR[!BP;$kAn>Oa@q/tW@:3JM?X@&Er`fM/>$Co.!a&N*r`9&!!*&nqs&/korD<Mi
+s%`Mer_3;ar(?r[rCHcTr'pWRoL/IAog8=;JcCu7(Unj,?!1<2=&i3u;c-Ci;H$Ik:f1%d;>s>q
+:ea\[:ea^`9b:)p:/4JV:/=S[:/FY[:/Fac:'4<g:Jq*hnko6Lr'L?Lr'^QRs$lrWIRm%%8kM`L
+9MJ5V:Jakb;H$Op<``C+>$G6;?XI5N@qB7bBPM="DJsN8FEMePH@('iJ:`E-L5CeHNK93bPa7])
+S"6.DTqnN_W2cr$YHbF@[^WfZ]Y;.s_SjF7aihlPcHstfeCN7(g=tE=hr*JQj5f@bkNV6rlg4$,
+s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/kToCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!du7MO^9>[JI!)XoGR&YPk[8Z*L^B['d<M
+\%'#]]tV8[_!Su*_Yq7>_"kk@_>_=M_>(kJ_o2Pnrl"QMs2=iSq8E<Pp;['Ms2P)Z0SbLBN/WdX
+OHPfmQ'[l+S"#t?T:qsQUnjlcW2ZesXKAV-YHY:;Za7$G[C3NQ\%)CIs183AoXt18rjr'=!k>_K
+rjDj8[/RC6ZE^X<YHG"0XK/A$WMl_mVPU)aUS=HTT:VXFS=?"9R$a5+Q'ISsP*(ieO,f3YMi*@J
+Lkg_>KnP)1JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0D#S2WC2%?pB4baeARo<M@KBnFra,_5
+?![G7!F&b,=oVV(=8l5%<E)rr;u]_q;>a8j:]F2g:&[ic9DhE]8c;3V8,PjT7J'"C6hNe=6%T'"
+s#0cMqXF+FlfdKojl,.RgtLQ=g""^%dEp1abK7iI`Pfd8_SO%(^r=+%^qRLo\@/iQZa-mE\GE]+
+[eW5e6N':L7/o^U7f>i+84cBF8kVfN9heAY:f("e;cHat='/U/>?kH@?X[DRAS,RgC27[(DfKf>
+Fa&(VI!pKpJqJc4M2I7OO-,TiQC+)0SXuLJUnsufWiW>+Z*UgG\%0,`^;%M$`5Tg>bKS5Vd*^=l
+f%8R.gYCWBi8N\UjQ>Ufl07L!m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/kToCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!dPoEdE.fN;SJ2M"uo+MZ8V7N;eh8NrP12
+OQ)E$PkgUCQi36HQgg=5Q0">-QiEBGQi3:*LP^nIN/is\P*;/rQ^F21S"6.CTqS3VUo(&gWN)u"
+Xf\b0Yd(L?Za@*I[^NZS\G`u<])K>6]`,PB])B/@\@8sH[K3eCrj,_4Z*:I9Y-"h-X/`2!W2HPj
+V50o^U7n6PSt;LCS"#h5R$X,(Q'@GpOcYWbNfB!UMM[1GLPCP;KS+l-J:N,uI=6KiH?sj]GB\4Q
+FEDSEEH,r9DJj<-rbDjUBkV0mAnGUcA7PUJ!F]C8?NOP>?2e(0>?_#/s&f;&r`0)#<)ifps&&ho
+r)!Dhs%`Mer_3;ar(?r[rCHcTr'pWRoL/IAog8=;JcD#80@nR^[C*3AY,eS$WMlYhU8"?STq@mH
+S=?"8R@'>,Q'@JsPEM&jO-#KbNfK*ZN;e_@M2-nDMMd7HM=68r62X(J6i9@P7K5jU7t+!#8P2TJ
+92&&S:/=\_;,U=l<E<1'=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=acIt3-'KnkMBN/`m\P*D9"
+R@Bb=TV80XVl6VsXfo"9['mHS]=bkm_8=.0aN;WLc-F\`e'ut#f\5*8h;@/LioB+^k3)!nlKdg(
+mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/kToCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!cZ47S-0H:\mo`;><ud;>X2i:ZY@O:\@QO
+=SZ+n=T2Is=T2CZ=SQ#!=Su8!=>5MeMN!LSO-#NgQ'I]'R@B\:StD^MU84T^Vl6SpWiW>)Y-5(7
+ZEpmE['d?N\$rmG\c98?]C`c8]DfD?\H9:M\,Nf:[C#q>=L,39Yck43XfSS'Wi;qpVl$;dUnaZX
+TV%gISXc1=R@'A.QBd`"P*1rhO,o<\N/NRMM26qAL4t;5Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?
+E,TW3D/B2e$>O9gBP1phAS#C^raGn:@/aL7?<pk9>QJ&4r`T8's&]2#!``3!rDW_o!)`Yjs%iYi
+rD!8br_*/]r^m&ZqFCHQrC-?Hpd=^@og+0/Qi@obS8r4G=]nj-<)Zan;Gg=i;c6Ih;G^4fr_Eu"
+:/4S\9h\;V9hnGW:Amlq9MJ8Y9hnJZ:JFS[;#X8h;Y*c]62X(J6i9@P7K5jU7t+!#8P2TJ92&&S
+:/=\_;,U=l<E<1'=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=acIt3-'KnkMBN/`m\P*D9"R@Bb=
+TV80XVl6VsXfo"9['mHS]=bkm_8=.0aN;WLc-F\`e'ut#f\5*8h;@/LioB+^k3)!nlKdg(mf2_Z
+nF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/kToCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!dl4Lm4O:]_nl2XoGR&YPk^*Z2_*;Za@*I
+[C<ZW]=ktorkRm:m)&Y7n\G1@r5/0DrPJEIqn`BO`;IRS`:q7M`;R[N`;dgR`qRG%`e]J/N/`mZ
+OckroQC+&.S"-(ATV8*TUnsueWN)u"Xf\b0Yd(L?Za@.>[K3kIrji'?s1A0@pV$I:s1A<BrOH^R
+\$rfS[C!<IZa-j?Yck43XfSS'Wi;qpVl$;dUnaWWTV%gISXc1<R@'A.QBd\uP*1rhO,o9ZN/NRM
+M26qAKnP)2Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,TW3D/=!'C2%BqBP1rVAH?=OraGn:@/aL6
+?=!P8s'#J,r`T8'!*B,"!``3!r_rhps&&_ks%iVhrD!8bs%E5]r^m)[q+(BQr'g9Hpd=^@oKe'.
+Q2gm\2tch3m-*QnkiC^\h;$`>gXk!,d*^1bc-"/Lai;<=`59=+^VIe']t_7n]=GAYZa6pD\%&rW
+[f*],[eW5e6N':L7/o^U7f>i+84cBF8kVfN9heAY:f("e;cHat='/U/>?kH@?X[DRAS,RgC27[(
+DfKf>Fa&(VI!pKpJqJc4M2I7OO-,TiQC+)0SXuLJUnsufWiW>+Z*UgG\%0,`^;%M$`5Tg>bKS5V
+d*^=lf%8R.gYCWBi8N\UjQ>Ufl07L!m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD>A
+J,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/kToCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!dMmDg$J_NrFh6M"uo+MZ&J3N;nn;NrP11
+OQ)E%Q2[$DPlR-KQfsb/Q2d'KQ0FS7Q2HsEQi<<EQRR`IMN!OUO-,TiQ'Rf)R[]h=StMdOUSO`a
+Vl?\rXKAV-YHY:;Za7$HrjDj:\Gj&=])TD>]_B,:]`5VD])B0T\@8rU[^EKLZa6sBYct=6Xf\\*
+WiE%sVl-DgUnjcZTqJ$LSt2C@R[KP1Q^3o$PEM)kOH5H^N/W[PM2@%DL4t;5K7\Z)J:E#rI=-Bf
+H?jaZGBS+NFE;JBEH#i6DJa3*CMIQtBP;$jrac+@A,]p<@:9(A!FB(2>lS".>5h\)=9)G$<WZ9#
+<;ohr;ZBVm;#a>j:Amod9`Ic_9)_E]8GPdS7f5^J7/0.B6M*Qps-Wfun']+`[BQm;X/`2!WMcSg
+US@a\"eV?WS!ocEQl;<WQ'@JsOckffO-#KaNK/sWN/NRNLkphCM>iA4M=68r62X(J6i9@P7K5jU
+7t+!#8P2TJ92&&S:/=\_;,U=l<E<1'=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=acIt3-'KnkMB
+N/`m\P*D9"R@Bb=TV80XVl6VsXfo"9['mHS]=bkm_8=.0aN;WLc-F\`e'ut#f\5*8h;@/LioB+^
+k3)!nlKdg(mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/kToCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!cW67S6<J:]+&b;>j>g:]!ug:]F5k:ZY@O
+:\@Nb:Jg:Xr)r_qrE8hrrE%oZpf[W!qc>5&M2I7OO,oEdPa.Q%R$sM7St;UKU8+N\Vl-MoWiW>)
+Y-5(7ZEpmE[JmT8\%)FJs186Bqn2[:qn2s@s180>CUgj_[^NTN['R*EZ*:I9Y-"h-X/`2!W2HPj
+V50o^TqS-OSt;LCS!ob4R$X,(P`q8nOcYWbNJrgSMM[1GLPCM9K7ec,J:N,uI=6KiH?sj]GB\4Q
+FEDSEEH,r9DJj<-CMR[!BkV0mB)Z?BA7PUJ!F]C8?NFJ=r`oJ-!*]A)s&]8&rDiu"<)iiqs&/ko
+rD<Mir_EDdr_3>bqb$iZr^ciTrC6]RogJRBog8::JcD/<%)n$<?<^N2=B&3s<)NWms&0D*;,U:f
+:f1"c:Jae]:J^p`"&;Qb9`@`u:/"AV:/FYZ:JO\[:/=\_9i:jeo25<Lr'L?Lr'^QRs$lrWIRm%%
+8kM`L9MJ5V:Jakb;H$Op<``C+>$G6;?XI5N@qB7bBPM="DJsN8FEMePH@1-jJ:`E-LP^nINK93b
+Pa7])S"6.DTqnN_W2cr$YHbF@[^WfZ]Y;.s_SjF7aihoQcHstfeCN7(g=tE=hr*JQj5f@bkNV6r
+lg4$,s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/kToCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!fXbLQJ4;Zi$m+Xfei*YPk^*Z2_*9Za@-J
+[^WfZ]Y4<Zs1ms:lb`P6n%et>rPIm:qSN9No#:RGr5JQOs2=uXo>N8:M2R=QO-#NgPa.T&R@B\:
+StD^MUSO``Vl6VqX0&M,YHY:;Za7$H[^NZTrji'?!5&3Brk86DrP/6Drk89Cs189Brji'=!4Vs9
+;mj!=Za-j?Yck43XfSS'Wi;qpVl$;dUS=HUTV%gIS=?":R@'A.Q'IStP*1rgO,f3YN/NRMM2-h?
+KnP)2Jq8H&IsufnH[:!`G^"@TF`__HErL%bE,TW3D/=!'C2*Z\!G?$DAHl[T@U`bS@/aL6?=!P8
+s'#J,r`T8'!*B/#s&K(ur_rhps&&_ks%iYir([/as%E5]r^m)[q+(BQr'g9Hpd=^@oKe'.R/[Ei
+pA+@KlK[L1joXQ$i;VLSgXt*+e'ZOgc-4>PaN;H@`5KO._7me)^V%:o]=GAY[/R?4[C3O1\+r>f
+6N':L7/o^U7f>i+84cBF8kViO9heAY:f("e;cHat='/U/>?kH@?X[DRAS,RgC27[(DfKf>Fa&(V
+I!pKpJqJc4M2I7OO-,TiQC+)0SXuLJUnsugWiW>+Z*UgG\@K5a^;%M$`5]m?bKS8Wd*^=lf%8R.
+gYCWBi8N\UjQ>Ufl07L"m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/kToCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!fXRDKL;^MZ&>1M#3&-MZ&J3N;nk=NfT7j
+OPl9!PlR'EQ0jn6Q2R$GQ2?gGQ/\,,Qi36GQRmrLMi<[WOHPflQ'[l+S"#t?T:qsRUnsrdW2cku
+Xf\b0Yd(L?Za@-K[^WdG\c95@]D]DA^&5VC^\bbE^&>VD])]GA\c9/>\,Ng7[C!9HZE^X<YHG"0
+XK/A$WMl_mVPU)`U7n9RT:VXES"#k7R$a5*Q'@JqP*(fdNfB!VMi*@JLPCP;KS+o/JUi9#IXQTj
+H?sj]GB\4QFEDSErc&6`Df0H0Chmg$C&VcHB4h-S#%V4Q@UW\Qra,\4?2e+/>6%k+=oVS(=8l8#
+<W?%t;u]bq;>j>k:]F2f:&[id9D_?\8cD9V8,YpT7J0(D6hNe<6%T')rs7E.]=#&OXfJK#WW/e:
+UnaZWT:hgISXPt7Q^F/,QBd\uP`_,jOH5KbNfB$Wrepf5#D\+lM2I1HM=-2q62X(J6i9@P7K5jU
+7t+!#8P2TJ9MA/T:/=\_;,U=l<E<1'=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=acIt3-'KnkMB
+N/`m\P*D9"R@Bb=TV80XVl?\tXfo"9['mKT]=bkm_8=.1aN;WLcHaeae'ut#f\5*8h;@/LioB+^
+k3)!nlKmm)mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/hSoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!fX46qC!FqG@&drD<Aer)!>fjA,_NoM>N`
+r_Vc[rE8hrrE8hrr)_iZpf[W!rDtP+M2R=QO-#NgPa.T&R@B\:StD^MUSO``Vl6VqX0&M,YHY:;
+Za7$H[^NZTrji'?!5&3Brk86DrP/6Drk89Cs189Brji'=!4Vs9;mj!=Za-j?Yck43XfSS'Wi;qp
+Vl$;dUS=HUTV%gIS=?":R@'A.Q'IStP*1rgO,f3YN/NRMM2-h?KnP)2Jq8H&IsufnH[:!`G^"@T
+F`__HErL%bE,TW3D/=!'C2*Z\!G?$DAHl[T@U`bS@/aL6?=!P8s'#J,r`T8'!*B/#s&K(ur_rhp
+s&&_ks%iYir([/as%E5]r^m)[q+(BQr'g9Hpd=^@oKe'.SGs8sVg)fY=BJX(;c?Xo;,^:h;H$Km
+;$p&o:esna:JOY\:Amm':/+DV9MJ5W9MJ5W9i"P[9hnDX:eskar)<Dhqbd/Tr'L?Lr'^QRs$lrW
+IRm%%8kM`M9MJ5V:Jakb;H$Op<``C+>$G6;?XI5N@qB7bBPM="DJsN8FEMePH@1-jJ:`E-LP^nI
+NK93bPa7])S"6.DTqnN_WN*&%YHbF@[^`l[]Y;.s_SjI8aihoRcHstfeCN7(g=tE=hr*JQj5f@b
+kNV6rm-O--s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/kToCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!fX^J<$>+VZ!RtXfei*YPk^*Z2_*9Za@-K
+[^`o\]Y=B[s1ms:lGEA3m_Jk=rke0@rkSQMqSE<O`5MSm!6"]Pr5ANPr5AEM!6"cR0St[GN/is]
+P*;/sQ^F52S=Z=FTq\?YVPgAlWiN5'Y-5(7ZEpmE[C3NQ\@K/]]"@sSs1SHHm_Ab8s1SEEs189B
+rj`'>\,Ng;[C!9HZE^X<YHG"0XK/A$WMl_mVPL#_U7n9RT:VUDS"#k7R$X,(Q'@JqOcYWbNfB!V
+Mi!:HLPCP;KS+o/JUi6!I=6KiH?sj]GB\4QFEDSEEH,r9rb_mVChmg$C&VcWB4b^dA7K+Y@UWYP
+?XI,G?2e(1>?Y50=TV],=8l8#<W?%t;u]bq;>j>k:]F2f:&dod9D_?\8cD9V8,YpT7J'"D6hE_<
+6%T')s"sTIqXs.;ki:gdj5JqSgtUT:f[\Buda?@bbf\&KaMu6<`59=+^V[n']Y;(k\@/fPZa$k$
+\+r>f6N':L7/o^U7f>i+84cBF8kViO9heAY:f("e;cHat='/U/>?kH@?X[DRAS,RgC27[(E,fo?
+Fa&(VI!pKpJqJc4M2I7OO-,TiQC+)0SXuLKUnsugWiW>,Z*UgG\@K5a^;%M$`Q$!@bKS8Wd*^=l
+f%8R.gYCWBi8N\UjQ>Ufl07L"m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/tWoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!fXOCNFlWK8>;<rJ:E/rJLQ3rf$l:s,R,?
+n;uOinWiX1p6GTBrg!8Cs-<DG!0ui8r0RDK!gT(;rKf3pMN!LSO-,ThQ'Rc(R[]h=StMdOUnjlc
+W2ZetXKAY/Yd(L?Za@-K[^WcW\[oAark/9Es1[p9rkAEGrk/9C!4r0?!P#W<[TBlDZa6sBYct=6
+Xf\\*WiE%sVl-DfUnaZXTqJ$LSXc1=R[KP0QBd`"PEM&iO,o<\N/W[OM26qAL4t;5K7\Z)Isufo
+I!^0cH$FOWG'.nKF)l8?E,Y_n"`8'kCMIS_BFnfgAS#C^@q&nU?sm>K?=$q:>QS,5>5hY+=BAT'
+<rZ2"<;ohr;ZBVm;#a>k:Adid9`@]^9)_E]8GPdS7f5^I7/94B6M3Wqs.00=q9m-i[Bm-<Wi<"t
+Vkp5cUS=HTT:hdHS!ob4Q^=)+QBd`"P`_,jOH0=$rf%/AMMd7ILkgfaM=-2q62X(J6i9@P7K5jU
+7t+!#8P2TJ9MA/T:/=\_;,U=l<E<1'=^#$7?!grI@Uit]B4u$qD/O<4EccGJG^=acIt3-'KnkMB
+N/`m\P*D9"R@Bb=TVA6YVl?\tXg#(:['mKT]=bkm_8=12aN;WLcHaeae'ut#f\5*8h;@/LioB+^
+k3)!nlKmm)mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/kToCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n0LS!fX27Rp*F:&7]b;>j>g:]+&f:ZP:N:\@Qa
+:]4,N=T2Is=T)Cr=Sl1Z=SQ&!=T;GVM2I7NNfT<cPEhH#R$sM7St;UKU84T^Vl6SpX/rG+YHY:;
+Za7$H[^NZT\[f;_]DfJC^&Ph7^](tI^&G\E])]GA\H04LrjGn9['R*EZ*:I9Y-"h-X/`2!W2HPj
+Unjc[TqS-OSt2C@S!ob4Q^3o%P`q8mOH5H_NJrgSM2@%DL5(D8K7ec,J:E#rI=-BfH?jaZGBS+N
+FE;JBEH#jqD?XlnCMR[!rb)jUAn>Oa@q/tW@:3JM?X@&Er`fM/>$Co.!a&N*r`9&!s&Atrs&/ko
+rD<Mis%`Jds%NDbqb$iZr^ciTrC6]RoL/LBoKr4:JcD>A(Y"Ub?s6Z4<`2go;H$Fh:f1.i;,C+c
+:&[rg:`)u':/=SY:/+GX9h\5T9hnGW9hnMZ:JO[a:&Rif;>aAg;Ys>e62X(J6i9@P7K5jU7t+!#
+8P2TJ9MA/T:/=\_;,U=l<E<1'=^#$7?!grI@Uit]B4u$qD/O<4EccGJG^=acIt3-'KnkMBN/`m\
+P*D9"R@Bb=TVA6YVl?\tXg#(:['mKT]=bkm_8=12aN;WLcHaeae'ut#f\5*8h;@/LioB+^k3)!n
+lKmm)mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq0%YoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+d*Bq\b/hWB`59@*^:_%f\$`QJYcb+/WMcVhU7n3MS!o^]I#OYgX0A\,XfhW+rNQ=,s0D[2%(*FN
+\%'#]]tV7r^qf<QkJHr-qS3*IrkSQKqnVX9r4r?KqSN9Mrl"KKqS`<Nrl"]Q!li4!r5C(AN/`mZ
+OckroQC+)/S"6.CTqS6WV5L5jWiN5'Y-5(7ZEpmE[C3QSrj`'@]DfGE]tV5Y^\ttD_>V1I^]2%J
+^&GZn]=PSa\[],X[^NTNZa6sBYct=6Xf\\*WiE%sVl$;dUnaZXTq@pJSXc1=R@'A.QBd`"P*1rh
+O,o<\N/NRMM26qAL4t;5Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,TW3D/=$(CMIQsBP1siAS#C^
+@q&nU?sm>K?=$q:>QS,5>5hY+=BAT'<rZ/"<;fbq;ZBVm;#a>k:Adid9`@]^9)_E]8GPdS7f5^J
+7/0.B6M*Qps.0/prq?0]mHE]nro=%;(Z4''g=t60eBu[ldETq[b/q`F`l5m6_>_4\_Sa.&]tM"e
+[^EHKZF.0Lm'laUr'L?Lr'^QRs$lrWIRm%%8kM`M9MJ5V:Jakb;H$Op<``C+>$G6;?XI5N@qB7b
+BPM="DK'T9FEMePH@1-jJ:`E-LP^nINK93bPa7])S"6.DU84W`WN*&%Yd(OA[^`l[]Y;.s_SsO9
+aihoRcHstfeCN7(g=tE=hr*JQj5f@bkNV6rm-O--s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZe
+rdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/nUoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+d*Bq\b/hWB`59@*^:_%f\$`QJYcb+/WMcVhU7n3MS!o^MBQAEHKSo_arJCK1rJUW5s,I&=s,ZZ2
+hN@8lnWrm6rKdGJpltfDi0O>.qNh/J.#NtCO,oEdPa.Q%R@9V9StD^MUSO`aVl?\sXKAY/Yd(L?
+Za@-K\%)FJ!P5oB]E5d\^APbE_"khF_#1tI^AknG]RIK(]",A]\$rfS[C!9HZE^X<YHG"0XK/A$
+WMl_lV50o^U7n9QSt;LCS"#h5R$X,(Q'@GpOcYWbNfB!UMM[1GLPCP;KS+l-J:N,uI=6KiH?sj]
+GB\4QFEDSEEH,r9DJj<-Chmg$BkV0mB4b^dA7K+Y@UWYP?XI,G?2e(1>?Y50=TV],=8l8#<<-"s
+;u]bq;>j>k:]F2f:&dod9D_?\8cD9V8,YpT7J0(D6hNe<6%T'.rsRl:]sb;PXf88!WM]Zk"/M]d
+T`1PrSXc.;R@'>,Q^=#'Q'7DoOcPS%NrG%<MZeooLl$ufMZ8P$M"j:66N':L7/o^U7f>i+84cBF
+8kViO9heAY:f("e;cHat='/U/>?kH@?X[DRAS,RgC27[(E,fo?Fa&(VI!pKpJqJc4M2I7OO-,Ti
+QC+)0SXuLKUnsugWiW>,Z*UgG\@K5a^;%M$`Q$!@bKS8Wd*^=lf%8R.gYCWBi8N\UjQ>Ufl07L"
+m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/nUoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+d*Bq\b/hWB`59@*^:_%f\$`QJYcb+/WMcVhU7n3MS!o^577^!A:/UsdrDEMiqbR)crD2NMs%i;a
+r_NGgmoTQmoN;,rp/q8rpK78nj&l%Ys&^^OMN!OUO-,TiQ'Rf*R[]k>T:qsRUnsueWN*##Xfek3
+Z*L^B['d?O\Gj#>]"@sS!kl=^r4i3Gq8*$Fr4i9Gs1SEEI_32&\[f5Z\$i`Q['R*EZ*:I9Y-"h-
+X/`2!W2HMhUnjc[TqS*MSt2C@S!fY2Q^3o%P`h2lOH5H_NJrdQM2@%DL5(D8K7\Z)J:E#rI=-Bf
+H?jaZGBS+NFE;JBEH#i6DJa3+CMR[!BP;$kAn>Oa@q/tW@:3JM?X@&Er`fM/>$Co.!a&N*r`9&!
+!*&nqs&/korD<Mis%`Jds%NDbqb$iZr^ciTrC6]RogJRBog8::JcDDC#do+q?!162;cEZn$W0eu
+;Gg@j;,:%`9`@if:_Zc&:/=SY:/+GX9h\2T9hnDV9hnL`:'XKg:/=\^:Jq!fq,7,fpd+gErBpKN
+s$crWrC;<-8P)NH92&#R9hnJ\:f1+h<)lt#=BSg3>[:]D@:E_XAnPdlCMds.EH6/DGBeF]I=Hd!
+K8#);MN!OUOckrpR$jG7StMgRV5L;mXKA_3Za@0N\\#Mg^VRe+`lQ9Fbg+M\dF6Urf@\g3gtglG
+iSrnYk2tjkl0@X%mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq0"XoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+d*L"]bK.`C`59@*^:_%f\$`QJYcb+/WMcVhU7n3MS!o^YH&7oZXLPC7Y5PR$YlCs7ZEpsH[^WfY
+]Y4<Zs1n$<jh_):^:s?VqnW0HrP/6Fq8)pCrPAHJ!5\WN!5nfQrkn`Rp;QjGr5JZRr5JTR1<#01
+NK90aPE_?!R$jG6St;UKU84T^Vl6VqX0&M-YctF>Za@-K\%&uZ]">Se]Y2%nrkJHJrk\6Drk\TL
+rkJKIs1SHFs1;dP\[f5[\$i`Q['R*EZ*:I9Y-"h-X/`1uVl-DgUnjc[TqJ$LSt2C@R[KP1Q^3o$
+PEM)kOH5H^N/W[PM2@%DL4t;5K7\Z)J:E#rI=-BfH?jaZGBS+NFE;JBEH#i6DJa4hCB\HeBP;$j
+rac+@A,]p<@:9(A!a]/<r`fJ.>5h\)=T;J%<rZ/"<;fbq;ZBVm;#a>k:Adid9`@]_9)V?\8GYjS
+7f5^J7/0.B6M*Qps.B<9qY0jYkN:jciSrkShV?o@f[na)e'cUjcd'bYbK7lH`l5p6rkT)[_8<t%
+]Y(hc\$`TLZF/u,pd+gEr^6QNs$crWrC;<-8P)NH92&#R9hnJ\:f1.i<)lt#=BSg3>[:]D@:E_X
+AnPdlCMds.EH6/DGBnL^I=Hd!K8,/<MN!RVOckrpR$jG7StMgRV5L;mXKA_3Za@0N\\#Mg^VRe+
+`lQ9Fbg+M\dF6Urf@\g3gtglGiSrnYk2tjkl0@X%mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6Nm
+rUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/nUoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+d*L"]bK.`C`59@*^:_%f\$`QJYcb+/WMcVhU7n3MS!o^LB5r0CK8okdrJC?-s,6o9s,I&=!0?Q0
+h3%/ks-EPIq3LZ<rKdJKqNM)IPa.NlQMm0HQ8+;VNK90aPE_?!R$jG6St;UKU84T^Vl6VqX0&M-
+YctF>Za@-K\%&uZ]">Se]Y2%nrkJHJrk\6Drk\TLrkJKIs1SHFs1;dP\[f5[\$i`Q['R*EZ*:I9
+Y-"h-X/`1uVl-DgUnjc[TqJ$LSt2C@R[KP1Q^3o$PEM)kOH5H^N/W[PM2@%DL4t;5K7\Z)J:E#r
+I=-BfH?jaZGBS+NFE;JBEH#i6DJa4hCB\HeBP;$jrac+@A,]p<@:9(A!a]/<r`fJ.>5h\)=T;J%
+<rZ/"<;fbq;ZBVm;#a>k:Adid9`@]_9)V?\8GYjS7f5^J7/0.B6M*Qps.THOf#bG/['6I-W2QSh
+V5'f[U7n3NSt2CAR@0G1QBml(Q'ISsP*(lfOH,B^NfB!VMi3FLM27"Ere^]4mYLX(r'LBMqaCHQ
+s$lrWIRm%%8kM`M9MJ5V:Jakb;c?Xq<``C+>$G6;?XI5N@qB7bBPM="DK'T9FEMeQH@1-jJ:`E.
+LP^nINfT<cPa7])S"6.DU84W`WN*&%Yd(OA[^`l[]Y;.s_SsO9aihoRcHstfeCN7(g=tE=hr*JQ
+j5f@bkNV6rm-O--s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/nUoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+d*L"]bK.`C`59@*^:_%f\$`QJYcb+/WMcVhU7n3MS!o^36q0[<9MbXarDEMiqbR)cr_MTMs%i;a
+s%iMgs&&5erE8>drE8ksqcDf[pK97RMi<XVOHPflQ'[l+S"-(ATV8*UUo(&gWiE,%Xfnt5ZEpmE
+[C3QS\[f;`]=bei^:sT]rkSNLoYUUDrkSNJs1\NHs1JBDA%K4]\@B#V[^EKKZa-j?Yck43XfSS'
+Wi2hnVPU)aUS=HTT:VXFS=>t8R$a5+Q'@JqP*(ieO,]*WMi*@JLkg_=KS+o/JUi9#IXQWlH[:!`
+G^"@TF`__HEcH)<Df0H0D#S2RC2%?pB4h-S!G#^>@KBnFra,_5?![G7!F&b,=oVV(=8l8#<<-"s
+;u]bq;>j>k:]F2f:&dod9DhE\8cD9W8,PjS7J0(D6hNe<6%T'2rs7_VEb&<U<`E&t;Z9Pn:_Zf+
+:f'qa:/+M[:/=\_:JFVY9hnF^:'+-`:Amle9`@`m:/Ob\9hnM]9i:ddq,7,fpd+gEr^6QNs$crW
+rC;<-8P)NH92&#R9hnJ\:f1.i<)lt#=BSg3>[:]D@:E_XAnPdlCMds.EH6/DGBnL^I=Hd!K8,/<
+MN!RVOckrpR$jG7StMgRV5L;mXKA_3Za@0N\\#Mg^VRe+`lQ9Fbg+M\dF6Urf@\g3gtglGiSrnY
+k2tjkl0@X%mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/tWoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$iWKYcb+/Wi)_iU7n3MS!o^VFbu<Q[(WWFrNH+&&@&OHZa@-K\%'#]
+]tV7r^qfBSrke]Olb`Y=!6"lNr4`6Gr4i9I!5\ZMrP8KLrP.^7r4rHM_86)es24lRrkn]Qq8EBP
+`Uh"K_SlAks2He6`f#e9O-,ThQ'Rf)R[]k>T:qsRUnsueWN*##Xfen4Z*UdD[C3QS\[f;`]Y(qk
+^AbnI_#M7K_Y1nE_Z.IP_#D+K^&YkG]E,XUrjc^P\$i`Q['R*EZ*:I9Y-"h-X/`.tVl-DgUnj`Y
+TqJ$LSt):>R[KP1Q^*i#PEM)kOH5E]N/W[PM2@"BL4t;5K7\Z)J:E#rI=-BfH?aXXG'.qLFE;JB
+EH#i6DJa3*CMITuBP;$jrac+@A,]p<@:9(A#@:\A>[1K;>5h\)=9)G$<WZ9#<;fbq;?0Sm;#X8j
+:Amod9`@]_9)_E\8GYjS7f5^J7/0.B6M*Qps.TH1pA4OPjlPL\iT&nQgtg`<f@AI%da?Cfcd)O5
+s2k;]s2=uTrkT/]_83n$]Y(b`[^EKJZF@<Qm'laUr'LBMqaCHQs$luXs%!,]r^qZ59MA/T:/=\_
+;,^Cm<E<1'=^#$7?!grI@Uit]BP;-rD/O<4F*)SLH$XjdIt3-'L51VCN/is]P*M?#R@Bb=TVA6Y
+Vl?\tXg#(:['mKT]=bkm_8F73aN;WLcHjkbe'ut#f\5*8h;@/LioB+^k3)!nlKmm)mdKW6nac5O
+oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/tWoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$iWKYcb+/Wi)_iU7n3MS!o^KAT)[<L5q(GrJCB.rJU]7s,I&=s,ZZ2
+i/n#&rfQ9,qNg`<r0I2DrKZr>!1!MK!13GG!L8uMQi!(%Mi<[WOckonQC+&.S"6.CTqS6WV5L5j
+WiN5'Y->.8Za7$H[^WcW\[oDc]Y2"mrkJKKs2"WMp;?dEs2"`NrkJKI!58BE!P>rB\S/L^[^NTN
+Za6sBYct=6Xf\\*Wi;qpVl$;dUnXQVTV%gIS=?":R@'A.Q'IStP*1rhO,f3YN/NRMM2-h?KnP)2
+Jq8H&IsufoI!^0cG^"@TF`heJF)l8?E,TW3D/=!'C2.HrBP1rVAH?=OraGn:@/aL<?<piA>[(E9
+r`T8'!*B,"!``3!rDW_o!)`\kr_NPhrD!8br_*/]r^m&ZqFCHQr'g9Hpd=^@oKe'.V#N@=f=nZ#
+Z)sq&W2HMhV5'cXU7e*LSXc4>R@0G0Q'R`&Pa.GqP*(lfOH,B^NK&mUMMm=KM2;.f!K)a$M"j:6
+6N0@L7/o^U7fGpX8,u6\8q0K-9MJ5V:Jakb;c?Xq<``C+>$G6;?XI5N@qB7cBPM="DK'T:FEVkR
+H@1-jJ:`E.LP^nINfT<cQ'Rf*S"6.DU84W`WN*&%Yd(OA[^`l[]Y;.s_o9X:aihoRcd:(geCN7(
+g=tE=hr*JQj5f@bkNV6rm-O--n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/tWoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7fD`59@*^:_%f\$iWKYcb+/Wi)_iU7n3MS!o^37R]j>9i"S^rDEMiqG7&drD2NMs%i;a
+r_NGgrDDo`r`Snr!*Aepr)resr)_o\pfT8.N/is]P*;/sR$a>3SXuIITqeE[Vl-MoX/rG+YctC=
+Za@-K\%&uZ]">Vf]tM/Z^]2+L_>M1D_u%=N_>h=M^]2"J^&GYF]=S!PBXkO[[^EKKZa-j?Yck43
+XfSS'WMl_mVPU)aU7n9RT:VXES"#k7R$a5*Q'@JqP*(ieNfB!VMi*@JLPCP;KS+o/JUi9#IXQWl
+H[:!_GB\4QF`__HEcH)<Df0H0Chmg$C2%?pB4h-S!G#^>@KBnFra,n:?!U]?>?b;1=oVS(=8c/$
+<E)rr;u]_q;>j>j:]F2g:&[ic9DhE]8c;3V8,PjS7J0(D6hNe<6%T'4rsQ_tCKt%E<Dldp;,dHl
+#Z+Aq;Gg4c:/1^_!)<Ggs%NVl9MJ;Wr_<Mh9MYO\$qsAh9hnP\9heDZ:f$pdq,7,fpd+gEr^6QN
+s$crWr^ZuZ!(m/^InNI/9heAY:f("f;cHat='/U/>?kH@?X[DRAS,UhC27[(E,fr@G'A4XI!pKp
+JqJf5M2I7PO-,TjQC+)0SXuLKUnsugWiW>,Z*UgG\@K5a^;%M%`Q$!@bKS8Xd*^=lf%8R.gYCWB
+i8N\UjQ>Ufl07L"m-X60n*ol<ncA@Srq-?dp\4[^s7u]kr;6Kkrr)KgJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/nUoCDJBnF,i6mHj0(l0.<mjlGI\i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYck10Wi)_iU7n3MS!o_1Ee]UJ[&a//qlp+*$aR+F['d?O\[oGe
+^AbnG_",>?_>qF<_Z%FQ`;[aS^AYhG^AYhH_#M7N_#;+L_#;%F^];.@_"tnG_Yq@R_Sa:h`;%=B
+_uR^Q`W*q0N/`jYOckroQC+)0S"6.DTq\?YVPgAmWiW>*YHY:;Za@-K\%&uZ]">Vf]tXK\!l2Xg
+rPJQOr5AQQr5ATPr5&NO^qfra#/7da]Y(kfrjcOK\$i`Q['R*EZ*:I9Y-"e+WiE%sVl-DfUnaZX
+TqJ$LSXc1=R[KP0QBd`"PEM&iO,o<\N/W[PM26qAL4t;5K7\Z)J:;opI!^0cH$FOWG'.nKF)l8?
+E,]`5DJa3*CMIS_BE;aXrac+@A,]p<@:9(A!FB(2>lS".>5h\)=9)G$<WZ9#<;f_s;Gg<i;#a>j
+:Amod9`Ic_9)_E\8GYjS7f5^J7/0.B6M*Qps.oZ?r:]sXkN(X]hr<VNh:gT9f@AF$e'cRecHOPW
+bf\&K`lH':_Z%@\^qmh$^:_+g\$rcPZEsP>!4_I+pHe^Dr^6QNs$crWr^ZuZ!(m/^!D?,c9mf]3
+:f(%g;cHat='/U/>?kH@?t!MSAS,UhC27[(E,fr@G'A4XI!pKpJqSl6M2I7PO-,TjQC+)0SXuLK
+UnsugWiWA-Z*UgG\@K5a^;%P&`Q$!@bKS8XdF$Fmf%8R.gYL]Ci8N\UjQ>Ugl07L"m-X60n*ol<
+o(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/nUoCDJBnF,i6mHj0(l0.<mjlGI\i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYck10Wi)_iU7n3MS!o_1@Vg+6LPGbaq25-/s,?u;s,R,?n;uUk
+s-!;Bk*>t2s-<JIns03?s-<JGrfmVPQ'R`&nWs3ApQbfErg3SL/W>[LO-,TiQ'Rf*S"#t?TV8*U
+Uo(&gWiE/&Y-5(7ZEppG[^WcW\[oDc]Y2&Y^B23e_>V7M_u.IO`Vd[R_u.@Q_8*kc^BVEc]tD"i
+])K6M\@8oT[C!9HZE^X<YHG"/X/`2!W2HPjUnjc[TqS-OSt2C@S!ob4Q^3o%P`q8mOH5H_NJrgS
+MM[.EL5(D8K7ec,J:N)sI=-BfH?jaZGBS+NFE;JBEH#l8DJj<-CMR[!rb)=FB)Z?BA7PUJ!F]C8
+?NFJ=r`oJ-!*]A)s&]8&rDiu"<)ifp!`DlmrD<Mir_EDdr_3>bqb$iZrCHcTr'pTQogJRBog8::
+JcDVI$/Eh;[C!0;Vl-EkV>m=jU&UblSt)=?S!]S0Q^7W9".,7;PQ$^VOcPTaO,]-XN/NONM2I.G
+MZ/G4MXH;p62X(K6i0:O7K5jV8,l*[8cD<_92,=ZHqmI6:f:4j<)lt#=BSg3>[:]E@:E_XAnYjm
+CMds.EH?5FGBnL^I=Hd!KSG8=MN!RVOckuqR$jG7StMgRV5L;mXKJe4Za@0N\\#Mg^V[n-`lQ9F
+bg+P^dF6Urf@\g3h;-uHiSrnYk2tmll0@X%mI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFA
+T)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/nUoCDJBnF,i6mHj0(l0.<mjlGI\i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYck10Wi)_iU7n3MS!o_16q'[=9hkR`rD<;crD<Ggj\GhOp/(]`
+rD<Gir_Vl^s&o"sr`Abpr)rkuqcDf[qH5D/NK0'^P*D5tR$jG5SXuLJU84T^Vl6VqXKAY/Yd(L?
+['d?O\@K/]]=bei^AbkK^qmkc_Z%IN`;R[Q`;[[P_?.Qh_#D(Q^:h4m]XtcS\RW.Y[^NTNZa6sB
+Yct=6XfSS'Wi;qpVl$8cUS=HUTV%gHS=?":R@'>,Q'IStP*(ieO,f3YN/NRMLkg_>KnP)2Jq8H&
+IXQWlH[:!`G^"@TF`__HEcH)<E,TW3D/=!'C2*Z\!G?$DAH?=OraGn:@/aL6?=!P8s'#J,r`T8'
+!*B,"!``3!rDNbq;,R9gs%iVhrD!8bs%E5]r^m&ZqFCHQr'g9Hpd=^@oKe'.W;e4;VKHKU=B8I$
+;c-Fi;c6Fi;,L.d:/+JX:ej_[:Jak]:/=PZ:JLg`$r'Dj9heAW9MJ2T:Jq*dr_EMjqG[2frDE;T
+r'LBMqaCHQs$luXs%!,]r^m2a9`@b6:/=\_;H$Ln<E<1'=^#$7?!guJ@Uit]BP;-rD/O<4F*)SL
+H$XjdIt3-(L51VCN/is]P*M?#R@Bb=TVA6YVl?\tY->1;['mKT]=bkm_Sa@4aN;WLcHjnce'ut#
+f\5*9h;@/LioB+^k32'olKmm)mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/nUoCDJBnF,i6mHj0(l0.<mjlGI\i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYck10Wi)_iU7n3MS!o_1E.O"AV5sHrs02O.$F7"F['mEQ\\#Mf
+rP/<Ho>1CB!l;aim)&e?s2=lTr4`*DrP&6FqSE0HqnN*Fr4hs@r4rEN_>_=I_u%CL`UCbB`A!:4
+OHPckQ'[l,S"-(BTV8-VV5L5jWiN8(YHY:;Za@-K[^`lY]">Vf]tV7r^qdec_Z.OR`:(\E`;daR
+_J-j%^q[Xu^:h1l]=PSa\[],W[^EKKZa-j?Ycb+1XK/A$WMl_lV50o^U7n9QSt;LCS"#h5R$X,(
+Q'@GpOcYWbNfB!UMM[1GLPCP;KS+o.J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9rb_mVChmg$C&VcR
+B4b^dA7T1Z@UW\Qra,\4?2e+/>6%k+=oVS(=8l8#<W?%t;u]bq;>j>k:]F2f:&[id9D_?\8cD9V
+8,YpT7J'"C6hNe<6%T'5s!7C8q=E\.iS`YRhqd&@f[eR$eC;pnccs_XbKS/OaN2BA`l#[m_%"2r
+^qRRs]XYG[[C!3FlF6LRr'LBMqaCHQs$luXs%!,]r^m2a9`@b6:/=\_;H$Ln<E<1'=^#$7?!guJ
+@Uit]BP;-rD/O<4F*)SLH$XjdIt3-(L51VCN/is]P*M?#R@Bb=Tq\?ZVl?\tY->1;['mKT]=bkn
+_Sa@4aN;WLcHjnce'ut#f\5*9h;@/LioB+^k32'olKmm)mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6i
+r;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/nUoCDJBnF,i6mHj0(l0.<mjlGI\i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYck10Wi)_iU7n3MS!o_1?u0n3J;!cUrJLQ3s,?u;s,I)?n;uRj
+s-!8A!1)i6qiq,GrKcu=rg*PKrKR5Frg*SNns99ApQkfFrg#6tO-#NfPa.T&R[]h=T:hmQUnsue
+WN*#$Xfnt6ZEppG[^N]V\[oDc]Y2%o^VIY$rke]Qs2=BFrl"iSrPE9b^qd_"^:q:n]Xtbd\[f5Z
+[^NTNZa6sBYct:4XfSS'Wi;qpVPU)aUS=HUT:VXFS=?"9R$a5+Q'ISsP*(ieO,f3YMi*@JLkg_>
+KnP)2JUi9#IXQWlH[:!`G^"@TF`__HEcH)<DuOVXD/=!'C2*Z\$YO'_ARo=]@U`bS@/aL6?=!P8
+s'#J,r`T8'!*B/#s&K(ur_rhps&&_ks%iYir([/as%E5]r^m)[q+(BQr'g6Gpd=^@oKe'.WW*Y)
+ftb,)ZEL1(VPU)bUnaZWTq7hRS.(gQQ^*o'Q'[i'Pa.I3Oq<b:O,f9]NJrjUM2R4JM2-ueM=-2o
+62X(K6i0:O7K5jV8,l*[8cD<_92,=ZHqmI6:f:4j<)lt#=BSg3>[:]E@:E_XAnYjmCMds.EH?5F
+GBnL^I=Hd!KSG8=MN!RVOckuqR$jG7StVmSV5L;mXKJe4Za@0N\\#Mg^r"".`lQ9Fbg+P^dF6Ur
+f@\g3h;-uHiSrnYk2tmll0@X%mI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/nUoCDJBnF,i6mHj0(l0.<mjlGI\i8<DIgY1?4f$r0s
+dEg+^bK7iE`59@*^:_%f\$iWKYck10Wi)_iU7n3MS!o_16UaL<925C_rD<;crD<Jhj\GhOohbT_
+rD<GirD;6Nr)`SoqcWl"!a/W-r)_o\qcPV4O-#NfPa.T&R[]h=T:hmQUnsueWN*#$Xfnt6ZEppG
+[^N]V\[oDc]Y2%o^VIY$rke]Qs2=BFrl"iSrPE9b^qd_"^:q:n]Xtbd\[f5Z[^NTNZa6sBYct:4
+XfSS'Wi;qpVPU)aUS=HUT:VXFS=?"9R$a5+Q'ISsP*(ieO,f3YMi*@JLkg_>KnP)2JUi9#IXQWl
+H[:!`G^"@TF`__HEcH)<DuOVXD/=!'C2*Z\$YO'_ARo=]@U`bS@/aL6?=!P8s'#J,r`T8'!*B/#
+s&K(ur_rhps&&_ks%iYir([/as%E5]r^m)[q+(BQr'g6Gpd=^@oKe'.WrE@QO)J<,=B&:"r_`hq
+<)HQm;#sHerD!Pm:/"DY;,7*b!_uQfrD!Af9`@`k:/"AV9MJ;[r_EDfqG[2frDE;Tr'LBMqaCHQ
+s$luXs%!,]r^m2a9`@b6:/=\_;H$Ln<E<1'=^#$7?!guJ@Uit]BP;-rD/O<4F*)SLH$XjdIt3-(
+L51VCN/is]P*M?#R@Bb=Tq\?ZVl?\tY->1;['mKT]=bkn_Sa@4aN;WLcHjnce'ut#f\5*9h;@/L
+ioB+^k32'olKmm)mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/qVoCDJBnF,i6mHj0(l0.<mjlGI\i8<DIgY1?4f$r0s
+dEg+^bK7iF`59@*^:_%f\$iWKYck10Wi)_iU7n3NS!o_1Cj_23SZ]HuY7@eAZ*UgF[^WcX]=bhk
+^AYhH_"5D>_Z.I?_Z.OR`;@OM^AYhD^AbnA_"#27_#(tG_?%Qkr589I!5nZOqnrHP!5nfS!5ncS
+/rbpRP*;/sR$a>3SXuIIU84T^Vl6VqXKAY0Yd(O@[C3NR\[f;`]Y(ql^V@S#rke]Q!6"fSr5SWS
+rPncSs2=rTrke]O!5STKJ%iV/]Xtee\[f5Z[^NTNZa6sAYck43XfSS'Wi;noVPU)aUS=HTT:VXF
+S=>t8R$a5+Q'@JqP*(ieO,]*WMi*@JLkg_>KS+o/JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0
+Ci!m&C2%?pB4kgfARo:\@U`bR?sd8I?3":1>QS,5>5hY+=BAT'<rZ2"<;ohr;ZBVm;#a>k:Adic
+9`Ic_9)_E]8GPdS7f5^J7/0.B6M!Kos/H#$rV-6^kPjH>h@A>pf[n[(eCE$qdEg+^bPo]nbK7oJ
+`Q#p:_SF"(rkJlT^V.:i\@8lPZ*W`)pHe^Dr^6QNs$crWr^ZuZ!(m/^!D?,c9mf]3:f1+h;cHat
+='/U/>[1TB?t!MTAS,UiC27[(E,fr@G'A4XI!pKpJqSl6M2I7PO-,WkQC+,1SXuOLUnsugWiWA-
+Z*UgG\@K5a^;.V'`Q$!@bKS8XdF-Lnf%8U/gYL]Ci8N\UjQ>Ugl07L"m-X60n*ol<o(2MQo`Fj]
+p\ssfq>^<hqu6NmrUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/qVoCDJBnF,i6mHj0(l0.<mjlGI\i8<DIgY1?4f$r0s
+dEg+^bK7iF`59@*^:_%f\$iWKYck10Wi)_iU7n3NS!o_1?>4D*I"[ISM>rJ5MuSb9NW5%=O7A=i
+OoCO?OmnY7Pkp[APl?sJQL^=>QMm*JPQ@&6rKRAKrKmDI!1!DHrg3PK!1!PL!1!PM0:%TYOHPfm
+QC+&.S"6.CTq\?YVPgAmWiW>*YctC=ZaI6M\@K/]]=bei^;%Fu_>_=O_Z7XQ`VdaQa8O$U`W*mV
+_u@OQ_#V:M^ONu2]Y(kg]",A]\$i`Q['R*EYct=6Xf\\*WiE%rVl$;dUnaZXTV%gISXc1<R@'A.
+QBd\uP*1rhO,o9ZN/NRMM26qAL4k23Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,TW3D/=$(CMIQs
+BP1siAS#C^@q&nU?sm>K?=!V;r`fM/>$Co.!a&N*r`9&!s&Atrs&/korD<Mis%`Jdr_3>bqb$iZ
+r^ciTrC6]RogJRBog879JcDeN.c]!i[C*<?V5C,dUSOWXTq7jHSXc4=R[BM/Q^3r&Q^=#&PEM&j
+P*(fdrf7#;#`Xe"MM[4HLPl%emYLU'r'LBMqaCHQs$luXs%!,]r^m2a9`@b6:/=\`;H$Ln<E<1'
+=^#'8?=.)K@Us%^BPD3sD/O<4F*)SLH$XjdIt3-(L51VCN/is]PEhH$R[]k>Tq\?ZVl?\tY->1;
+['mKT]=bkn_Sa@4aN;WLcHjnde'ut#g"P3:h;@/LioB+^k32'olKmm)mdKW6nac8Bo`"Lbp@n=\
+q#C0iqY^6ir;QZerdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/tWoCDJBnF,i6mHj0(l0.<mjlGI\i8<DIgY1?4f$r0s
+dEg+^bK7iF`59@*^:_%f\$iWKYck10Wi)_iU7n3NS!o_16UXI88PDrXrD<Df!DlSj;#O2O:B+,`
+;#F,f;#X>j:]X?gj]DLap/q2npfR>pr`K2's&f8%i`Q.^/rbpRP*;/sR$a>3SXuIIU84T^Vl6Vq
+XKAY0Yd(O@[C3NR\[f;`]Y(ql^V@S#rke]Q!6"fSr5SWSrPncSs2=rTrke]O!5STKJ%iV/]Xtee
+\[f5Z[^NTNZa6sAYck43XfSS'Wi;noVPU)aUS=HTT:VXFS=>t8R$a5+Q'@JqP*(ieO,]*WMi*@J
+Lkg_>KS+o/JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0Ci!m&C2%?pB4kgfARo:\@U`bR?sd8I
+?3":1>QS,5>5hY+=BAT'<rZ2"<;ohr;ZBVm;#a>k:Adic9`Ic_9)_E]8GPdS7f5^J7/0.B6M!Ko
+s/c5-Z@$=k=]ea';c6Qn;ZBVo;#a>k:(U2r:Jah^:Jjq^9i"JY:ej^`:B+#k9MJ5W9`7Zg:Jjh]
+:Amub;u'>i;>3BS6N0@L7/o^U7fGpX8,u6\8c_RYr_7c8:Jand;c?Xq<``C+>$P<=?XR;OA7]@d
+BkhF#DK'T:FEVkRH@1-jJ:`H/LP^nINfT<dQ'Rf+S"6.EU84W`WN*&&Yd(OA[^`l[]Y;1u_o9X:
+aihoRcdC1ieCN7)g=tH>hr*JQj5f@bkiq?sm-O--n*fc9o()DErq-?dp\4[^s7u]kr;6Kkrr)Kg
+JcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/qVoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`59@*^:_%f\$iZLYck10Wi)_iUS4<OS!o_1BmGQ"S#sC%YQ(g9Z*L[A['mEQ]">Vg
+^:sT]s1n3Ark\]R_Z%C?_Z.LR`:q7I^APbB^AktD_"GJ?^AktC_#2"O_Sa:._YV.M_Xk_@_u@US
+`W*k5`PddtOckonQC+)0S"6.DTq\?ZVl-MoX0&M-Yd(L?['mEP\[f;`]Y(tn^VIY$_SX4.`;R[T
+`r=$OaSs6Z`r3jX`5BLl_?%KgrkE*[]tD"i]=PP`\@8oT[C!9GZ*:I9Y-"h-X/`.tVl-DgUnj`Y
+TqJ$LSt):>R[KP1Q^*i#PEM)kOH5E]N/W[PM2@%CL4t;5K7\Z)J:E#rI=-BfH?jaZGBS+NFE;JB
+EH#i6DJa4hCC4fjBP;$jAn>OaA,]pB@:3JM?X@&Er`fM/>$Co.!a&N*r`9&!!*&nqs&/korD<Mi
+s%`Jds%NDbqb$iZr^ciTrC6]RogJRBog879JcDeN+Ska,n`/Tei83;GgY191e^W*se'ZIbc-4>R
+bfe,MaN+;!'#MK"_8!b$^qRRr]=5;Y[C!6GlF6LRr'LBMqaCHQs$luXs%!,]r^m2a9`@b6:/=\`
+;H$Ln<E<1'=^#'8?=.)K@Us%^BPD3sD/O<4F*)SLH$XjdIt30)L51VDN/is]PEhH$R[]k>Tq\?Z
+Vl?\tY->1;[C3TU]=bno_Sa@4aN;WLcHjnde'ut#g"P3:h;@/Lj5]4_k32'olg4!*mdKW6nac8B
+o`"Lbp@n=\q#C0iqYg<jr;HTdrdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/qVoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`59@*^:_%f\$iZLYck10Wi)_iUS4<OS!o_1>A%ntH@q7SM>`>3MuSb9NrP13OPc3!
+P514?P4t76Pl$a@PlI!KQLU7>QMd$JPkgUCQh-OCQi!*KQiE@.Q^3YmOckonQC+)0S"6.DTq\?Z
+Vl-MoX0&M-Yd(L?['mEP\[f;`]Y(tn^VIY$_SX4.`;R[T`r=$OaSs6Z`r3jX`5BLl_?%KgrkE*[
+]tD"i]=PP`\@8oT[C!9GZ*:I9Y-"h-X/`.tVl-DgUnj`YTqJ$LSt):>R[KP1Q^*i#PEM)kOH5E]
+N/W[PM2@%CL4t;5K7\Z)J:E#rI=-BfH?jaZGBS+NFE;JBEH#i6DJa4hCC4fjBP;$jAn>OaA,]pB
+@:3JM?X@&Er`fM/>$Co.!a&N*r`9&!!*&nqs&/korD<Mis%`Jds%NDbqb$iZr^ciTrC6]RogJRB
+og879JcDkP#2$l'['['7rMBOh"ehQ[St2GORgkgRR?j/*Q'I]$QB[VtrfR;EOSt4?NrFtBMi!=J
+MM[.HrJBrupHe^Dr^6QNs$crWr^ZuZ!(m/^!D?,c9mf]3:f1+h;cHat='/U/>[1TB?t!MTAS,Ui
+C27[(E,fr@G'A4XI!pKpK7nu7M2R=QO-,WkQC+,1SXuOLUnsugWiWA-Z*UjH\@K5a^VI_(`Q$!@
+bKS8XdF-Lnf%8U/gYL]Ci8N_VjQ>Ugl07O#m-X60n*ol<o(2MQo`Fj]p\ssfq>^<iqu6NlrUg)?
+s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/qVoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`59@*^:_%f\$iZLYck10Wi)_iUS4<OS!o_16Ua@48P;hX;"7?D:B+,_;#O2g;#X>j
+;#F,M=T;Is=Sc+o=SZ,"=T2J'=T;Ib=T;P(=T;MZNfT<cPEhH$R@B\:StMdOUnsueWN*#$Xfnt6
+ZEppH[^WfX]">Vf^;%Fu^qmn)_o'Fk`W*sWa7[OQa8X*W`<*uq_u@LR_8-&bB>2'l]Xtee\[f5Z
+[^NTNZa-j?Yck43XfSS'WMl_mVPU)aU7n9RT:VXES"#k7R$a5*Q'@JqP*(ieNfB!VMi*@JLk^Y<
+KS+o/JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0D#S2WC2%?pB4baeARo<M@L$=L?sd8I?=!P8
+!aAi3r`K;)=',B%s&B%urDW_os&&_ks%iYir([2br_*,\r^m)[q+(BQr'g9Hpd=^@o0Is-YQ#s.
+R;uY<=B&=";c6Ij;,:%e;,L.b9i"M[:/FY[:JX_[:/=V\:JLg`s%Nkr9MS;X9MA/S9hnOa:Amub
+;u'>i;>3BS6N0@L7/o^U7fGpX8,u6\8c_RYr_7c8:Jand;c?Xq<``C+>$P<=?XR;OA7]@dBkhF#
+DK'T:FEVkRH@1-jJ:iN0LP^qJNfT<dQ'Rf+S"6.EU84W`WN*&&Yd(OB[^`l[]YD8!_o9X:aihoR
+cdC1ieCN7)g=tH>hr*JRj5f@bkiq?tm-O--n*fc9o()DErq-?dp\4[^s7u]krVQTlrVcBfJcD>A
+J,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/qVoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wi2ejUS4<OS!o_1Q$%kBTX:s%YQ(g9Z*L^B[C3QS\[oDd
+]tXK\s1n6Brk\`S_SZ;gn&#+Bs2=ZNs1A?FqnDsBqS)pCrP8<FrP&9Gr4`3GpV?dEs2+EGqo&KO
+r5AEKrl"fT/B!R0OckroQ^F21S=Z@GTqeE\Vl6VqXKAY0Yd1UB[C3QS\[oDc]Y2(p^qp#e!Q2kT
+`W*sXa83mRanj*Ya8a0X`FQp)_ns:,_8*h#^:h1l]=YYb\[],W[C!9HZE^X<YHG"0XK&;"W2HPj
+V50l\TqS-OSt2C@S!ob4Q^3o%P`q8nOH5H_NJrgSMM[.EL5(D8K7ec,J:N,uI=6HgH?jaZGBS-.
+F:rY8EH,r9DJj<-CMR["BkV0mB)Z?BA7PUJ!F]C8?NOP>?2e(1>?Y50=TV],=8l8#<<-"s;u]bq
+;>j>k:]F2f:&dod9D_?\8cD9V8,YpT7J'"D6hE_;6%T'<rs/;ro]P,ii84Ih%GB@be^W'tdF-Cd
+c-4?/b8JCDaMu9=`PTI+^qRV"^V7Iq\[T&V[C!6FlaQRRr'LBMqaCHQs$luXs%!,]r^qZ59MJ5V
+:/=\`;H$Ln<E<1'=^#'8?=.)K@Us%^BPD3sD/O<4F*)SLH$XjdIt30)L51VDN/is]PEhH$R[]k?
+Tq\?[Vl?\uY->1;[C3TU]=bno_Sa@4aN;WLcHjndeC<($g"P3:h;@/Lj5]7`k32'olg4!*mdKW6
+nac5OoCW%T!VZ9dq#C0iqYg<jr;HTdrdk*@s*t~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/qVoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wi2ejUS4<OS!o_1Q"=iSH\R@RM>`>3MuSb9N<#"<O7n[l
+OoCO=OoLUCQ0X\5Q1gI1Q2d0AQ2d0KQgC%;QRnG_O-,TiQ'[l+S"-(BTV8-VVPgAmWiW>*YctF>
+['d?O\@K2_]Y(qm^VI\b_?%Qmrl+oWs2XuWqT8TTs2Y/ZrP`<c_o'@._83q%^V7Co]Xtee\[f5Z
+[^EKKZa-j?Yck43XfSP&WMl_mVPU)`U7n9RT:VUDS"#k7R$X,(Q'@JqP)t`cNfB!VMi*@ILPCP;
+KS+o/JUi9#IXQWkH?sj]GB\4QrcAcoEcH)<Df0H0Chmg$C2%?pB4h-S!G#^>@KBnFra,_5?![G7
+!aAi3r`K;)=',B%s&B%urDW_os&&_ks%iYir([2br_*,\r^m)[q+(BQr'g6Gq*Xd@oKe'.Yl?-9
+f=SGuZ)OUsV50l]U7e-MSt2@>S"#h6Q^3u(QB[Z#Q'@PtOckihrK$u=s,?u9"cA.nMM[/eM=68o
+62X(K6i0:O7K5jV8,l*[8cD>392&&S:/4S];,U=k<)lt#=BSg4>[CcF@:EbYAnYmnCMds.EH?5F
+GBnL^I=Hd"KSG8=Mi<[WOcu&rR$sM8T:r!TVPgDnXfen5ZaI6O\\#Mh^r"".`lQ9Fbg+P^daZdt
+f@em4h;-uHiT&t[k2tmll0I^&mI'H3nF?)?!V>s_o`=d\rV6Egs8)]krqu`no_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq0"XoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wi2ejUS4<OS!o_1Psn/68ki&W;"%3D:B+,`;#F,f;#X>j
+:]X?grD3Dok#hR`pfRAopK7&jj&l:`/6IpnOckroQ^F21S=Z@GTqeE\Vl6VqXKAY0Yd1UB[C3QS
+\[oDc]Y2(p^qp#e!Q2kT`W*sXa83mRanj*Ya8a0X`FQp)_ns:,_8*h#^:h1l]=YYb\[],W[C!9H
+ZE^X<YHG"0XK&;"W2HPjV50l\TqS-OSt2C@S!ob4Q^3o%P`q8nOH5H_NJrgSMM[.EL5(D8K7ec,
+J:N,uI=6HgH?jaZGBS-.F:rY8EH,r9DJj<-CMR["BkV0mB)Z?BA7PUJ!F]C8?NOP>?2e(1>?Y50
+=TV],=8l8#<<-"s;u]bq;>j>k:]F2f:&dod9D_?\8cD9V8,YpT7J'"D6hE_;6%T'@rs->lC0XnD
+<)``n##S8q:f(%er_EJi##A&j:JX_]r([;i:/1^_%8BMk9MJ2V9h\8T:/4[c:Amub;u'>j;>*<R
+6N0@L7/o^U7fGpX8,u6\8q0K-9heAX:Jand;c?Xq<``C+>$P<=?XR;OA7]@dBkhF#DK'T:FEVkR
+H@1-jJ:iN0LP^qJNfT<dQ'Rf+S"61FU84ZaWN*)'Yd(OB[^`l[]YD8!_o9X:aihoRcdC1jeCN7)
+g=tH>hr*JRj5oFckiq?tm-O--n*fc9o'uhQo`"Lap@nO\s7u]krVQTlrVcBfJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/qVoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wi2ejUS4<OS!o_1Q#MA8StiCdYQ(g;Z*L^B[C3NS]">Vg
+^:q@srkS3Cs2+`Ps2+`Nn\Y=Ds2=TLrjr6E]tOBYq7lg@rP/<Hs1eBDrP/<Fs1e9Cs2"`Pm)/\<
+qSW<Ns2G#!1QdibQ'[l,S"-(BTq\?YVPgDnX0&M-Yd(L?['mEQ\[f>b]Y2%o^qmn)_o'F3`Q#p<
+a8O*Yan<gUao'6[`rO-Y`W*jV_u@M^_8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHG"/X/`2!W2HPi
+Unjc[TqS-NSt2C@S!o_3Q^3o%P`q8mOH5H_NJrgRM2@%DL5(D8K7ec,J:E#rI=-BfH?jaZGBS+N
+FE;L%E=Qr+DJj<-CMR[!BkV0mB)Z?BA7PUJ!F]C8?O'nC?!LW=>?_#/s&f;&r`9&!!*&nqs&/ko
+rD<Mis%`Jds%NDbr(?oZr^ciTrC6]RoL/LBoKr19JcDtS3;`IHnDW9^hVI#BgY(3.eC2pqdEp.]
+bfe2RbKJ&NaMu0:`PTI,^q[Ru^V7Ft]=GD[[^EKJZF9,/p-JXDrBpKNr^HiVr^ZuZ!(m/^InNI0
+9hnJ\:f1+h;cHdu='/U/>[1TB?t!MTAS,UiCMRd)E,fr@G'A4XI!pKqK7nu7M2R=QO-5]lQC+,1
+SY)UMUo(&hWi`G.Z*UjH\@K5b^VI_(`Q$!@bKS8XdF-Oof%8U/gYL]Ci8N_VjlY^hl07O#m-X60
+n*ol<ncA@Srq-<cp\jmeq>^<iqu6NlrUg)?s.97@~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/qVoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wi2ejUS4<OS!o_1Q!nKLH@U\HM>`>2MuSe:Nr>%6OPZ,u
+P517=P5gdFQ0X\5Q1^BuQ2d0KQgL+=QiE+&OckroQ^F52S=Z@HU84T^Vl?\sXf\e2Z*L^C[^N]V
+\\#Me]tV7s_8=(,_o0O5`l?'>rQ+u[oud9Ur5eoY!65#Ws24oTrk`-\^q[Xu]tD"i]",A]\$i`Q
+['R*EZ*:I9Y-"e+WiE%sVl-AeUnaZXTqJ!KSXc1=R[BJ/QBd`"PEM&iO,o<\N/WXNM26qAL4t;5
+K7\Z)IsufoI!^0cH$FOWG'.nKF)q8"%WH?(DJa3*CMIQtBP;$jrac+@A,]p<@:9(A#@:\A>[1K;
+>5h\)=T;J%<rZ/"<;fbq;ZBVm;#a>k:Adid9`@]_9)V?\8GPdS7f5^I7/94B6M*Qps0DYYg<7(8
+[]cU)V5'i\U7e0NT:DC>S!ob4R$O#&QB[`$Q'@JrP`q8mOcGE]O,o<[N;e_7M#rQkM#<+uM"X.5
+6N':L7/fXT7fGpX8,u6\8q0K-9heAY:f("e;c?Xr<``C+>$P<=?XR;OA7]@dBkqL$DK'T:FEVkR
+H@1-jJV/W1LP^qJNfT?eQ'Rf+S"61FU84ZaWN*)'Yd(OB[^`l[]t_A"_o9X:aihoRcdC1jeCN7)
+g=tH>hr*JRj5oFckiq?tm-O--n*fc9o'uhQo`"Lap@nO\s7u]krVQTlrVcBfJcD>AJ,~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/tWoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wi2ejUS4<OS!o_1Pse#28P;`RmSE(Bs%i>br(m8fs&&em
+!DcPf:]"5V=Sl1q=Sl1n=S,bk=9)Fj=T;P(O#)o]Pa.T&R[]h=T:r!TUo(&hWiN8(YHY:;Za@0L
+\@K/^]Y(ql^VI\&_Sa:0`Poj:a2e/"rlOiUrlP)Zs2P,Zrl+oU!5nfQ@_ojp^V7Co]Xtbc\[],W
+[^EKKZa-j?Yck43XK/A$WMl_mV50o^U7n9RSt;LCS"#k6R$X,(Q'@JqOcYWbNfB!VMM[1GLPCP;
+KS+o/JUi6!I=6KiH?sj]GB\4QFEDSErc&EeDf0H0Chmg$Bk_6oB4h-S!G#^>@KBnFra,n:?!U]?
+>?b;1=oVV(=8l8#<<-"s;u]bq;>j>k:]F2f:&dod9DhE\8cD9V8,YpT7J'"D6hE_;6%T'Cs!RB6
+G%+WX<E2sp;Gg=g:f1+f;,9q_;,9q^9hnGW:/+GX:/+M[:/(X^!DQ>g9aFEg9hS/R:/4[b:B"&c
+;YEu]62a.K6i9@O7K5jV8,l*[8cD>392&&S:/=\_;,U=k<*!%$=BSg4>[CcF@:EbYAnYmoCMds.
+EH?5FGBnL^I=Hg#KSG8=Mi<[WP*;/sR$sM8T:r!TVPgDnXfen5ZaI6O\\#Pi^r"".`lQ9Fbg+P^
+daZdtf@em4h;-uHiT&t[k2tmll0I^&mI'H3nF?)?!V>s_o`=d\rV6Egs8)]krqu`no_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq0UioCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iZLYck10Wi2ejUS4<OS!o_1Q#1u.R[gRoYHY::ZEppG[^WcW]">Vg
+^VBc`oYLRErkncQr5%p?s24lTp;I*Q`Pqef!PH,D^A,J?^AktG_#D+F^APbF^AktA_#M7N_X,29
+`;@IO`%AriP*;/sQ^F52SXuLJU84W`W2ZeuXfen4ZEppG[^WfX]"G\h^;%J"_SX4/rl"oXa8O*Z
+ao9HRbPoZaao09^a2Z-u`<!oprk`9`^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I8Xf\\*WiE%sVl$;d
+UnaZXTV%gISXc1<R@'A.QBd`!P*1rhO,o<\N/NRMM26qAL4t;5Jq8H&IsufoI!^0cH$FOWG'.nK
+F)l8?E,Y_n"`8'kCMIS_BFAHbAS#C_@q&nU@:9(A!FB(2>lS".>5h\)=9)G$<WZ9#<;fbq;?0Sl
+;#a>k:Adid9`@]_9)_E\8GYjS7f5^J7/0.A6M*Qps0DYap\aRFi8<GJhV-]:f[eR&e'l^kccaPW
+bKJ,Qb/q`F`Pfa6_8*n&]Y2(o^VIRq\[],W['R$C[d:Ks62a.K6i9@O7K5jV8,l*[8cD>392&&S
+:/=\_;,U=k<*!%$=]np5>[CcF@U`kZAnYmoCMds.EH?5FGBnL^I=Qm$KSG8=Mi<[WP*;/sR$sM8
+T:r!TVPgDnXfen5ZaI6O\\#Pi^r"".`lQ9Fbg+P^daZdtf@em4h;-uHiT&t[k2tmll0I^&mI'H3
+nF?)?!V>s_o`=d\rV6Egs8)]krqu`no_sFAT)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq0%YoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iZLYck10Wi2ejUS4<OS!o_1Q!S6HH[CI+M2D1grJU]7s,I&=s,Zu;
+h3%Z!q2tZ>!gAe1rKR>Il]h=4op"9ts-EYN!LB#>Q7\GbP*;/sQ^F52SXuLJU84W`W2ZeuXfen4
+ZEppG[^WfX]"G\h^;%J"_SX4/rl"oXa8O*Zao9HRbPoZaao09^a2Z-u`<!oprk`9`^q[Xu]tD"i
+]",A]\$i`Q['R*EZ*:I8Xf\\*WiE%sVl$;dUnaZXTV%gISXc1<R@'A.QBd`!P*1rhO,o<\N/NRM
+M26qAL4t;5Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,Y_n"`8'kCMIS_BFAHbAS#C_@q&nU@:9(A
+!FB(2>lS".>5h\)=9)G$<WZ9#<;fbq;?0Sl;#a>k:Adid9`@]_9)_E\8GYjS7f5^J7/0.A6M*Qp
+s0_kPo@Ugc[]ld.UnaZZU7e-MSXl7>R@9P2R?X#'Q'IZ#Pa.GrP5^RIOH,?\NfX1!$&je!MM[4I
+LkgfbM=68o62a.K6i9@O7K5jV8,l*[8cD>392&&S:/=\_;,U=k<*!%$=]np5>[CcF@U`kZAnYmo
+CMds.EH?5FGBnL^I=Qm$KSG8=Mi<[WP*;/sR$sM8T:r!TVPgDnXfen5ZaI6O\\#Pi^r"".`lQ9F
+bg+P^daZdtf@em4h;-uHiT&t[k2tmll0I^&mI'H3nF?)?!V>s_o`=d\rV6Egs8)]krqu`no_sFA
+T)X<~>
+JcC<$ScAB^rVc`nrVQWks7uZhs7ZNerq/qVoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iZLYck10Wi2ejUS4<OS!o_1PsRl.7nHJD:[1^T:\@Q_:]+&h;?'Gn
+:Jgj_s%`AkkZI[_q,mPrp/plgqH3c!moV/EOHPfmQC!u-S"6.DTq\?ZVl6SpXKAY0Yd1UB[C3QT
+\[oGd]tV7s_8=(,`;[^V`lJ&!s2k8_o#q$Ts2k5\!lr=#rl"oV_u@Mb_8*h#^:h1l]=PP`\@8oT
+[C!9HZE^X<Y-"h-X/`2!W2HMhUnjc[TqJ$LSt2C@R[KP1Q^3o%PEM)kOH5H_NJrdQM2@%DL5(D8
+K7\Z)J:E#rI=-BfH?jaZGBS+NFE;JBEH#jqD?XlnCMR[!rb)[PAn>OaA7K(X@:<RC?NFJ=r`oJ-
+!*]A)s&]8&rDiu"<)ifps&&hor)!Dhs%`Jds%NDbr(?r[rCHcTr'pTQogJRBoKr19JcE1Y*m]a]
+?!(0-<)ZXl;,L.c:Jk"d:JO\^:/4MZ:eOJUr_<Pi:/=Xa9`Rld9`Ric9`Rrf9`[p^qbI,dqGR#a
+p-JXDrBpKNr^HiVr^ZuZ!(m/^InNI09hnJ\:f1+h;cHdu='8[0>[1TB?t*SUAS,UiCMRd)E,fr@
+G'A4XI!pNrK7nu7M2R=QO-5]lQC+,1SY)UMUo(&hWi`G.Z*UjH\@K5b^VI_(`Q$!@bKS8XdF-Oo
+f%8U/gYL]Ci8N_VjlY^hl07O#m-X60n*ol<ncA@Srq-<cp\jmeq>^<iqu6NlrUg)?s.97@~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eoj%.\o()>?n*f]3m-Es$ki_*ijQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=k*W2?AcTq@pHR[BG,CO(c!R]X<.Z*CU@['d?O\@K2_]Y;/Z
+_">JC_Z%IQ_Yh7?_?.Wn`:_(L`r<sW]`,PB]E#YE^APb>^AktG_#;%I^')3b^V@S_^B2-a^\,DB
+_#V@D_Z7RM_u@US_u.IO_uIY/OHPfmQC+)0S=Q7ETqeE\Vl6VrXKA\1Z*L^D[^WcW]">Vg^;%G!
+_SX4/`Poj:a8X-]ai_d'bP'0WbQ#`bao9B]`rO-Y`<!oprka-#^q[Xu]tD"i]",A]\$i`Q['R*E
+Yct=6Xf\\*Wi;qpVl$;dUnXQVTV%gISXZ+;R@'A.QBd\uP*1rhO,f3YN/NRMM26qAKnP)2Jq8H&
+IsufoI!^0cH$FOWG'.nKF)l8?E,TW3D/F*)CMIQsBP1siAS#C^@q&nU@:9+Bs'>\2r`oJ-!*]A)
+s&]8&r`9&!s&Atrs&/korD<Mir_EDdr_3>bqb$iZrCHcTr'pTQogJRBog848JcE1Yrqlfair7dF
+gtgZ;g"4d)e'l^kccsVVrlYhob/hZE`Q#j5_SO"%]tM2[^(.oj]!]&V[(!BHZF73N[d^d!62a.K
+6i9@O7K5jV8,l*[8cD>392&&S:/=\_;,U=k<*!%$=]np5>[CcF@U`kZAnYmoCi+'/EH?5FGBnL^
+IXm!%KSG8=Mi<[XP*;/sR$sM9T:r!TVPgDoXfen5ZaI6O\\,Vj^r"".`lQ9Fbg+P^daZdtf@em4
+h;-uHiT&t[k2tmll0I^&mI'H3nF?)?!V>s_o`=d\rV6Egs8)]krqu`no_sFAT)X<~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eohG)Mo()>?n*f]3m-Es$ki_*ijQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=k*W2?AcTq@pHR[BG,?"S)!H%M*6rJLQ3s,?u;!fi>&q2jBo
+rK@#>rK7/ErfZ<+r0?u?gQhf)s-EeQQ'Lm*0T_H]Q'Rf*S"-%@TV8-VVPgAmX/rG,Yd(L?[C3QS
+\[oDc]tV7r_8=(,`5T^8`lJ)"!m/U-qoe]Wqof#^s2k8]s2P,Zrl"oV_u@N%_8*h#^:h1l]=PP`
+\@8oT[C!9HZEUR:Y-"h-X/`.tVl-DgUnj`YTqJ$LSt2@?R[KP1Q^3o$PEM)kOH5E]N/W[PM2@%D
+L4t;5K7\Z)J:E#rI=-BfH?jaZGBS+NFE;JBEH#i6DJa6,CMR[!BP;$kAn>Oa@q/tW@:<RD?iOF4
+?2e+/>6%k+=oVS(=8l8#<W?%t;u]bq;>j>k:]=,f:&[id9D_?\8c;3V8,PjS7J0(D6hNe:6%T'G
+s!ZaM]"#/KVPBr^U8"?RSt;LCS!f_5R$j8+Q'Rc$Q'@MsP*1ofOHGV$NWkB"Mi*@IreU]4LPPkc
+mtgX&rBgHMr'^NQs$luXs%!,]r^qZ59MJ5V:Jakb;H$Ln<`W:)=^#'8?=.)L@Us%^BPD6uD/O<4
+F*)SLH$XjeJ:W?+L51VDN/j!_PEhH$R[]n@Tq\?[Vl?`!Y->1;[C3TU]Y2(q_Sa@4aN;WLcHjnd
+eC<($g"P3:h;@/Lj5]7`k32'olg4!*mdKW6nac5OoCW%T!VZ9dq#C0iqYg<jr;HTdrdk*@s*t~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eoh>#Lo()>?n*f]3m-Es$ki_*ijQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=k*W2?AcTq@pHR[BG,6UXC78PMtX:]=,^:[LpW:\IW`:]!ri
+;,C*_:]=,g<rc:t=70/j=oDJ!=85ns=8c8$=8Q+k=nu2!=7KBHOHPfmQC+)0S=Q7ETqeE\Vl6Vr
+XKA\1Z*L^D[^WcW]">Vg^;%G!_SX4/`Poj:a8X-]ai_d'bP'0WbQ#`bao9B]`rO-Y`<!oprka-#
+^q[Xu]tD"i]",A]\$i`Q['R*EYct=6Xf\\*Wi;qpVl$;dUnXQVTV%gISXZ+;R@'A.QBd\uP*1rh
+O,f3YN/NRMM26qAKnP)2Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,TW3D/F*)CMIQsBP1siAS#C^
+@q&nU@:9+Bs'>\2r`oJ-!*]A)s&]8&r`9&!s&Atrs&/korD<Mir_EDdr_3>bqb$iZrCHcTr'pTQ
+ogJRBog848JcE:\&$U:j>Zk*-;c$:f:f'qa;>sB$:/=\_9hnDX9M8&R:/1[^s%ESj:/">V:&[fd
+:]3rk9hnGZ:JO[a:B45f;YO&]62a.K6i9@O7K5jV8,l*[8cD>392&&S:/=\_;,U=k<*!%$=]np5
+>[CcF@U`kZAnYmoCi+'/EH?5FGBnL^IXm!%KSG8=Mi<[XP*;/sR$sM9T:r!TVPgDoXfen5ZaI6O
+\\,Vj^r"".`lQ9Fbg+P^daZdtf@em4h;-uHiT&t[k2tmll0I^&mI'H3nF?)?!V>s_o`=d\rV6Eg
+s8)]krqu`no_sFAT)X<~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eoiq([o()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=k*W2HGdTq@pHR[BG,PB;S=S[5T+ZEggD[C3QR\[oDd^;'W^
+otg[FrPSZPqn_m@s24iSpVm0Pr5J]Ls1JBDs1J<DoY(C?^:sT]qnW0Fs1\HHs1nNHotUXF_SZ,d
+r5&KP_YM+L`;[[Q`;RS+OHPfmQC+)0S=Z@HTqeE\Vl?\sXfek3Z*UgF[^WfX]=bej^V@S$_Sa=2
+`Q#staT'?^b5KN_bl#`acMYrdbl,`bb5]T_aF;1L`l5p8_o'@._8*h#^:h1l]=PP`\@8oT[C!9G
+Z*:I9Y-"h-WiE%sVl-DgUnaZXTqJ$LSXc1=R[KP1QBd`"PEM)kO,o<\N/W[PM2@"BL4t;5K7\Z)
+J:E#rI=-BfH?jaZGBS+NFE;JBEH#i6DJa3+CMR[!BP;$kB)cENA7K+Y@UW\Q?XI,G?2e(1>?Y50
+=oVS(=8l8#<W?%t;u]bq;>j>k:]=,f:&[id9D_?\8cD9V8,YpT7J'"C6hNe:6%T'Gruh+5n`/Qc
+hVR&Ag"=p,e^MpodEg+]bfn8Sb/qcGa2Z-u_\^/(^V.=q^:V.p^:Un`\$iZNZa$pJ\$b\6og/OC
+rBpKNr^HiVr^ZuZ!(m/^InNI09hnJ\:f1+h;cHdu='8[0>[1TB?t*SUAS,UiCM[m+E,fr@G'A4X
+I=?]tK7nu8M2R=QOHPfmQ^F52StD^NUo(&hX0&P/ZEpsI\@K8c^VI_(`Q$!@bKS8XdF-Opf%8U/
+gYL`Di8N_VjlYail07O#m-X60n+#r=ncA@Srq-<cp\jjgq>0scqu6NlrUp/@s.01?~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eoh>#Lo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=k*W2HGdTq@pHR[BG,P@SWRH%h"OMYrD4N!#'"O,s.!gl_Mt
+qiUi?s-*ADrfmDGk`kt0pQXEtrg!SMQN!0AQ7e8^PEhH$R@B_<T:qsRUo(&hWiN8)YHY:<['d?O
+\[f>b]Y;.q^r!t+`5T^8a8X0[aT0K^bPo``c2Grcc2PrcbQ#`bao9A1a2Z-<`Pf[3_SX.)^V@Lr
+]Y(kf\[f5Z[^NTNZa-j?Yck43XfSP&WMl_mVPU)`U7n9RT:VUDS"#k7R$a2)Q'@JqP*(fdNfB!V
+Mi*@JLPCP;KS+o/JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0Ci!m&C2%?pB4kiVAIN*Z@q&nU
+@:3GL?=$q:>QS,5>5h\)=9)G%<rZ2"<;ohr;ZBVm;#a>j:Amod9`Ic_9)_E]8GPdS7f5^I7/0.B
+6LmEns1A::r8#2t[BZX,U]-u7TV%gJS=H(;R@0G/Q^*i&QBRPtPEV/lOcYZeOH>K_O,f3ZN/WYn
+M$SuqM26qEMM[,WM"O(46N':L7/fXT7fGpX8,u6\8q0K-9heAY:f("e;c?Xr<``F,>$P<=?XR>P
+A7]@dBkqO&DK'T:FEVkRH@:6mJV/W1Ll%%KNf]EfQ'[l,S"?7GU84ZaWN3/(Yd1UC[^`l\]t_A"
+_o9X:aihoRcdC1je^i@*g=tH?hr*JRj5oFdkiq?tm-O--n*ff:o'uhQo`"Lap@nO\!r;]hr;6Kk
+rVcEgJcD;@J,~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eoh>#Lo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=k*W2HGdTq@pHR[BG,P=.l28PDnX:\dc^:[LmW:\@Q`:]!ug
+;?'Jd:]*rh=BAT'<r#hd=T;P&=Sl1n=9)G$=T2D"=S#\l=Su7m=>#\uPEhH$R@B_<T:qsRUo(&h
+WiN8)YHY:<['d?O\[f>b]Y;.q^r!t+`5T^8a8X0[aT0K^bPo``c2Grcc2PrcbQ#`bao9A1a2Z-<
+`Pf[3_SX.)^V@Lr]Y(kf\[f5Z[^NTNZa-j?Yck43XfSP&WMl_mVPU)`U7n9RT:VUDS"#k7R$a2)
+Q'@JqP*(fdNfB!VMi*@JLPCP;KS+o/JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0Ci!m&C2%?p
+B4kiVAIN*Z@q&nU@:3GL?=$q:>QS,5>5h\)=9)G%<rZ2"<;ohr;ZBVm;#a>j:Amod9`Ic_9)_E]
+8GPdS7f5^I7/0.B6LmEns1J@Khj/=j=]\R$;c$:f:f1%d;,C(b:/Fb_:&[lh92&%X9aOTj9MA5W
+92//Vr_*ku9MJ8V9MS>Z:/+JZ:ese_qGR&bog/OCrBpKNr^HiVr^ZuZ!(m/^InNI09hnJ\:f1+h
+;cHdu='8[0>[1TB?t*SUAS,UiCM[m+E,fr@G'A4XI=?]tK7nu8M2R=QOHPfmQ^F52StD^NUo(&h
+X0&P/ZEpsI\@K8c^VI_(`Q$!@bKS8XdF-Opf%8U/gYL`Di8N_VjlYail07O#m-X60n+#r=ncA@S
+rq-<cp\jjgq>0scqu6NlrUp/@s.01?~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eoj7:^o()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=n+W2HGdTq@pHR[BG,PAc/5SY<6mZa7$I\$rlX]">Vg^;%Fu
+_"GPD_Yq@P_YV+?_Z.OQ`:q7N`r!aT]`,VE]`5V@^&>\F^%f>A^\P\D^Au"H^\ttH^\5JC_>hCP
+_tLt;_u@UR_^pt8Q'[l,S"-(BTq\?ZVl-MoXKAY0Z*L^C[^WcW]">Vg^V@S#_Sa=2`Q#sta8sE*
+rlb>crlsrXrltJerlb>a!6P5]s2S]j`Pod5_ns:,^q[Xu]tD"i]",A]\$i`PZa6sBYct=6XfSS'
+Wi;qpVkp2bUS=HUTUqaGS=?":R$a5+Q'IStP*(ieO,f3YN/NOLLkg_>KnP)2Jq8H&Isl`mH[:!`
+G^"@TFoHIhF)l8?E,TW3D/B2e$>O9gBP1phAS#C^raH+@?sm>K?=$q:>QS,5>5hY+=BAT'<rZ2"
+<;ohr;ZBVm;#a>k:Adic9`Ic_9)_E]8GPdS7f5^I7/0.B6LmEns1A:;r;Z`^iSWPKgt_n^0@nY'
+d*^7eccaJSaihfKaiMQC`l,d3^qRRs]Y(tj^;.Lr\[8lTZaR3FZ*q-N[dU^!62X(J6i9@O7K5jV
+8,l*[8cD>092&&S:/=\_;,U=k<E<.%=]ns6>[CcF@U`kZB4u!pCi401EH?5FGBnO`IXm!%KSG;>
+Mi<[XP*;/tR$sM9T:r!TVPgDoXfen6ZaI6O]"G_k^r"".`lQ9Fbg+P^daZguf@em4h;7&IiT&t[
+k3(sml0I^&mI'H4nc&([oCW%T!VZ9dp]C9fqY^6ir;HTerdk*?s*t~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eoh>#Lo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=n+W2HGdTq@pHR[BG,P@/6IH@CSHMZ&J5N;nn;NrG(>OP,cp
+P5:=>P5gaCP5LRCPP:=APP17:Q26^GQ'C$grg*DGpQd@nPa.T&R[]h=T:r!TV5L5jWiW>*Yd(L?
+['mHR\[oDc]t_=t_8=+.`Poj;rl>,^b5TTabl5lVcMl)gbl5fcaoKQ_aT':l`l5p8_o'@._8*h#
+^:h1l]=PP`\@8oT['R*EZ*:I9Y-"e+WiE%sVl-AeUnaZXTqJ!KSXc1=R[BJ/QBd`"PEM&iO,o<\
+N/W[OM26qAL4t;5K7\Z)J:DuqI!^0cH$FOWG'3e+$$1-,EH#i6DJa4hCC4fjBP;$jAn>OaA,]pB
+@:3JM?X@&Er`fM/>$Co.!a&N*r`9&!s&Atrs&/korD<Mis%`Jdr_3>bqb$iZr^ciTrC6]RoL/IA
+og848JcEF`([0>[]X4`;US4EVTqJ$LSt)=?R[KM0Qi<9mQ'@JqPE_5lOcYWcOH5E]NK0!YN/NUO
+Ll$qEM26qBre^'!p-JUCrBpKNr^HiVr^ZuZ!(m/^HqR.-9hnJ\:f1+h;cQk!='8[1>[1TB?t*SU
+AS5[jCM[m,E,fr@G'A4YI=?]tK7nu8M2R=QOHPfmQ^F52StD^NUo(&hX0&P/ZEpsI\@T>d^VI_(
+`Q$!@bKS8XdF-Opf%8U/gYL`Di8N_VjlYail07O#m-X60nF?MK!V>s_o`=d\rV-HiqYL-erqu`n
+p&9OBSc=3~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eoh>#Lo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b*0e^W$p
+cd'bXaiMK@_ns1&]Xt_`[^<BFYH=n+W2HGdTq@pHR[BG,P=%f084u\V:\[]b:]=/j:[V!X:\IWa
+:]!ug;?'Jc:]*rf:]+;m<r#hs=T;Ir=T)D$=Sl1j=T)>!=S,bm=Sc+n==fW"Q'[l,S"-(BTq\?Z
+Vl-MoXKAY0Z*L^C[^WcW]">Vg^V@S#_Sa=2`Q#sta8sE*rlb>crlsrXrltJerlb>a!6P5]s2S]j
+`Pod5_ns:,^q[Xu]tD"i]",A]\$i`PZa6sBYct=6XfSS'Wi;qpVkp2bUS=HUTUqaGS=?":R$a5+
+Q'IStP*(ieO,f3YN/NOLLkg_>KnP)2Jq8H&Isl`mH[:!`G^"@TFoHIhF)l8?E,TW3D/B2e$>O9g
+BP1phAS#C^raH+@?sm>K?=$q:>QS,5>5hY+=BAT'<rZ2"<;ohr;ZBVm;#a>k:Adic9`Ic_9)_E]
+8GPdS7f5^I7/0.B6LmEns1\LA^4L-*=]eX%;,:%c;#O5o:esh_;#F&m92%uR9i"O`9`e!_:Amod
+9`Iid9F"3c:/=V\:/:a`mnrdEr'L?Lr'^NQs$luXs%!,]r^qQ29MJ5V:Jakb;H$Lo<`W:)=^,-9
+?=.)L@Us%_BPD6uDJsK6F*)SLH$asgJ:W?+L5:\EN/j!_PEhK%R[]n@Tq\?[Vl?`!Y->4<[C3TV
+]Y2(q_Sa@4aN;WLcHjndeCE.%g"P3:hV[8Mj5]7`kNM0plg4!*mdKZ8rpg*]o`"Lap@nO\!r;]h
+r;6KkrVcEgJcD;@J,~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eoiq([o()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_a[^<BGYH=n+W2HGdTq@pHR[BG,PAPf*Q^b1m['[6L\$roZ]=bhk^VBQZ
+qSE0JpqcU>s24cQq8N?Qq8NBGs1A?FrO`0C]_/u6^AktH^];.K_"b\B_#M1B_#D1A_?.Wn`:LnH
+`%f/mPa.T&R[]k>TV8*UV5L8lWiW>+Yd(O@[C3QT\\#Mf^;%J"_SX71`Q#s>aN;TIrlYAec-?13
+o?[?[s3:Sfrlb>a!6P5]C<+?5`Pf^4_SX.)^V@Lr]Y(kf\[f5Z[^EKKZa-j?Yck12XK/A$WMl_l
+V50o^U7n6PSt;LCS!ob4R$X,(Q'7AoOcYWbNfB!UMM[1GLPCP;KS+o/J:N,uI=6KiH?sj]GB\4Q
+FEDSErc&EeDf0H0Chmg$Bk_6oB4h-S!G#^>@KBnFra,_5?![G7!aAi3r`K;)=',B%s&B%urDW_o
+s&&_ks%iYir([2br_*,\r^m)[q+(BQr'g6Gpd=^@nj.j,^&JfAs7YI0h;6uBg=Os-e^N!nda6=a
+rlb>as2cA(a2c3<_ns4)^V7@n^:V%m^V%1e\$i]O['R$E\@8m7\+N&b6N':L7/o^U7f>gY84cDP
+8pj9*9heAY:f("e;c?[s<``F,>?kH??XR>PA7]CeBkqO&DfKc<FEVkSH[U?nJV/W1Ll%%KO-#Ng
+Q'[l,S"?7GUSOcbWiN8)Yd1UC[^`o]]t_A"_o9X:aihoRcdC1je^i@*g=tH?hr*JRj5oFdkiq?t
+m-O--n*olHncA@Srq-<cp\jjgq>0scqu6NlrUp/@s.01?~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eohG)Mo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_a[^<BGYH=n+W2HGdTq@pHR[BG,P?r!CG^>%(r/1N4"H8>"NfO+"q2jQt
+rK?u=rf[8Eq3(Z?qigi?rKHu?rKRAIrg!AFl'275ns00>qN^lB0TqZcQ^F52SXuLJU84W`W2cl!
+Xfnt6Za7'J\%0&]]Y2%o^qmn)`5T^8a2l?Db0'_,!mJp6r6Fo[r6G>es31Jcs2k>`rlAip`l5p8
+`5BI/_8*h#^:h1l]=PP`\@8oS['R*EZ*:I9Xf\\*WiE%sVl$;dUnaZXTV%gISXc1<R@'A.QBd`!
+P*1rhO,o<\N/NRMM26qAL4t;5K7\W(IsufoI!^0cH$FOWG'.nKF)q8"%WH?(DJa3*CMIQtBP;$j
+rac+@A,]p<@:9(A!a]/<r`fM/>$Co.!a&N*r`9&!!*&nqs&/korD<Mis%`Jds%NDbqb$iZr^ciT
+rC6]RoL/IAog848JcELb&EV$D\[&-0U8+HVT:VXES=BMH$CR6HQ^*l&Q'7Gqrf[AFOSt4KNfB$Y
+NK&mTMMm@KM#N58LkghEM2-rWM"O(36N':L7/o^U7f>gY84cDP8pj9*9heAY:f("e;c?[s<``F,
+>?kH??XR>PA7]CeBkqO&DfKc<FEVkSH[U?nJV/W1Ll%%KO-#NgQ'[l,S"?7GUSOcbWiN8)Yd1UC
+[^`o]]t_A"_o9X:aihoRcdC1je^i@*g=tH?hr*JRj5oFdkiq?tm-O--n*olHncA@Srq-<cp\jjg
+q>0scqu6NlrUp/@s.01?~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eoh4rKo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_a[^<BGYH=n+W2HGdTq@pHR[BG,P<qW,7S<VSqb@)cs%iVjs%i)Ys%i>b
+s%iMgr_`\lp.tQ\r_NGnqc<Akr)ir"r`K/&rE/nt!E`Fs=T;J&<rZ8!=S5hn=Sc+p=>5o&Q'[l,
+S"6.DTq\?ZVl6VqXKA\1Z*UdE[^WfX]=bhk^VI\&_SjF4`lH0Aai_d*b6#o4c2>lYchu)gc2Z#e
+bQ#]bao9@ra2Z*;`5KR1_SO%&^V7Co]Xtbc\[],W[C!9HZE^X<YH=q.X/`2!W2HMhUnjc[TqJ$L
+St2C@R[KP1Q^3o%PEM)kOH5H_NJrdQM2@%DL5(D8K7ec+J:E#rI=-BfH?jaZGBS+NFE;L%E=Qr+
+DJj<-CMR[!BkV0mB)Z?BA7PUJ!F]C8?NOP>?2e(1>?Y50=TV],=8l8#<<-"s;u]bq;>j>k:]F2f
+:&dod9D_?\8cD9V8,YpT7J'"C6hNe:6%T'Ps"!B/H=L,\<Dudk:f1%b:f("d:/=V]:JX\[9hS)O
+9MSAZ:/=SX9M\GY9MPL[&5,_k9MJ8V:JFY\9hnJ\:JL:Tog/LBrBpKNs$crWrC6o[8P/nRHqR.-
+9hnJ\:f1+h;cQk!='8[1>[:ZC?t*SUAS5[jCM[m,EH-&AG'A7ZI=?]tK7nu8M2R=ROHPfmQ^F52
+StD^OUo(&iX0&P/ZEpsI\@T>d^VI_(`Q$!@bKS8XdF-Opf%8U/gYL`Di8N_VjlYail07O#m-X60
+nF?MK!V>s_o`=d\rV-HiqYL-erqu`np&9OBSc=3~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eoi^qYo()>?n*f]3m-O$%l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_a[^<BGYH=n+W2HJeTqJ!IS!]P-PA>H"MjUT[['d?O\@K2_]Y2%npV?XA
+rkeHHoYUXGr5AEMrl4cQ!Q;SJ]D0&3^%oD?_#D(K_"k_H^;%G]^];.B_#;+B_Z.OP`:Ur"P*D5u
+R$sM8StMdPUo(&gWiN8)YHY==['mEQ\[oGd]t_=u_SX4/`Q#s>aN;U(b6#o4c2Grfci)5ddJ_Gk
+ci)/hblGuebQ#]bao9A*a2Z*;`5BL0_SO%&^V7Co]Xtbc\@8oT[C!9HZE^X;Y-"h-X/`1uVl-Dg
+UnjcZTqJ$LSt2@?R[KP1Q^3o$PEM)kOH5H^N/W[PM2@%DL5(D7K7\Z)J:E#rI=-BfH?jaZGBS+N
+FE;JBEH#i7DJj<-CMR[!rb)=FB)Z?BA7PUJ!F]C8?O'nC?!LW=>?_#/s&f;&r`9&!!*&nqs&/ko
+rD<Mis%`Jds%NDbqb$iZr^ciTrC6]RoL/LBoKr+7JcEIa)?&mZhq[&CgXt-/eCE'pcd:"_bf\)O
+aiDI$a;r:>`5BI,^V7Cn]tD"l^V7=f[C<QM['R$B[C<WRn$hsUr'L?Lr'^QRs$lrW!_>mSr^qQ2
+9MJ5V:Jakb;H$Lo<`W=*=^,-:?=.)L@q9.`BPD6uDJsN8FEMePH@('hJ:W?+L5:\EN/s'`PEhK%
+R[ftATqeE\VlHf"Y->4<[C3WW]Y2(q_Sa@4aN;WLcHjndeCE.%g"P3:hV[8Mj5]7`kNM0qlg4!*
+mdKZ8rpg9bo_%nNp@nO\!r;]hr;6KkrVcEgJcD;@J,~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eohG)Mo()>?n*f]3m-O$%l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_a[^<BGYH=n+W2HJeTqJ!IS!]P-P?_^=F*`J"rJCZ7N/[aqs,R,?q2jQt
+rf[&=rf[8Eq2tiBPa.O4PkpU?Pl-a@Pl-gGPQ7!GPj+J5Pk11=QMQmDQ7e>bQ'[l,S"6.DTqeE\
+Vl6VrXfek3ZEppH[^`lZ]Y(qm^VRe(_o0O6a2l?Db5TQcbg"E2cMu5hd.u)fd/MAicMu,hbl5fc
+aoKQ_aEP\E`Pod5_ns:,^q[Xu]tD"i]",>[[^NTNZa6sBYck43XfSS'Wi2hnVPU)aUS4BST:VXF
+S"#k7R$a5+Q'@JqP*(ieO,]*WMi*@JLkg_>KnG#0JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df9N2
+D/=!'C2*Z\!G?$DAH?=OraGn:@/aL<?<piA>[(E9r`T8's&]2#s&B%urDW_os&&_ks%iYir([2b
+r_*,\r^m)[q+(BQr'g6Gq*Xd@nj.j,_Z'o'f"AT&X/Megrh0@`T)P5fS!oe6Q^=#(Q'RVtrK@2C
+s,d2?!f`/!rf%#;Mi*>iM$/WkLkgcbM=-2m62X(J6i9@P7K5jU7fl4Q8cD>092&&S:/=\_;,U=k
+<E<.&=]ns6?!^lG@Uiq[B4u!pCi402EccGJG^=^bIXm!%KSG;>Mi<^YP*;/tR$sP:T:r$UVPgGp
+Xfen6ZaI6P]"G_k^r"".`lQ9Fbg+P^daZguf@em4h;7&IiT&t[k3(smlKdg'mI'H4nc&(`oCV_K
+p@e7Zp]C9fqY^6ir;HTerdk*?s*t~>
+JcC<$ScAB^rVc`nr;6Nj!;ZTg!Vc<eohP/No()>?n*f]3m-O$%l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4']Xt_a[^<BGYH=n+W2HJeTqJ!IS!]P-P=%c-7nQEL:A[cb:B+,i;#a>[:B+,`
+:]O;g;#O5k;"[W]:B"#i:0.6nqH!8jrE0#"rE'2*=BJX,p/h#ks&]2#r`B&#pK@;oqH!]"=oDGT
+P*D5uR$sM8StMdPUo(&gWiN8)YHY==['mEQ\[oGd]t_=u_SX4/`Q#s>aN;U(b6#o4c2Grfci)5d
+dJ_Gkci)/hblGuebQ#]bao9A*a2Z*;`5BL0_SO%&^V7Co]Xtbc\@8oT[C!9HZE^X;Y-"h-X/`1u
+Vl-DgUnjcZTqJ$LSt2@?R[KP1Q^3o$PEM)kOH5H^N/W[PM2@%DL5(D7K7\Z)J:E#rI=-BfH?jaZ
+GBS+NFE;JBEH#i7DJj<-CMR[!rb)=FB)Z?BA7PUJ!F]C8?O'nC?!LW=>?_#/s&f;&r`9&!!*&nq
+s&/korD<Mis%`Jds%NDbqb$iZr^ciTrC6]RoL/LBoKr+7JcEXf(;PK;?<^H/;c-=f;,:%d:esq`
+9hnGZr_<bo8kViP9hnDX:B!p$:/+GZ9he;S:.n8T92/2W9hnJZ:AmuW;>!6Q6N':L7/o^U7f>gY
+84cDP8pj9*9heAY:f("e;c?[s<`iL->?kH??XR>QA7]CeBkqO&DfKf>Fa&(VH[U?nJV/W1Ll%%K
+O-#NgQ'[l,S=Z@HUSOcbWiN8)Yd1UC[^iu^]t_A"_o9X:aihoRcdC1je^i@*g=tH?hr*JRj5oFd
+kiqBum-O--n*olHncn^Xp%A%Pp\jjgq>0scqu6NlrUp/@s.01?~>
+JcC<$ScAB^rVc`nr;6Njs7uZh;>9eXp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYH=n+W2HJeTqJ!IS!]P-PEL'EMk-sK[0j@O\[oDc]tV4q^\Yb6
+_=YVE_u%CK`W!mP`<*us]_]82]_fD=^&YqI_">DA^Akt;_#;+C_Z.OP`:h)#PEhH$R@B_<StMdP
+Uo(&hWiN8)Yd(L?[C3QT\\#Mf^;%J"_Sa=2`lH0AaiaV+!R/gfcMu5id-oB^d/VGjcMu,hbl5cd
+b/sY("inX%`Pf[n_I^R!^V@Lr]Xtbc\[],W[^EKKZa$a=YHG"0XK/A#W2HPjV50l\TqS-OSt2C@
+S!ob4R$O#&P`q8nOcPQ`NJrgSMM[1GLPCM9K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9rb_mV
+Chmg$C&VcHB4h-S!G#^>@KBnFra,n:?!U]?>?b;1=oVV(=8l8#<<-"s;u]bq;>j>k:]F2f:&dod
+9D_?\8cD9V8,YpT7J'"C6hNe:6%T'QrsAK#p#P)egYCQ;rmrdQeC2aid*U%[aihfI`lQ3?`Pod5
+_8!^u]t1nk]=kto]=#&U[C!<IZ*C[F\$bY5og/LBrBpKNs$crWrC;9,8P)NH91qrQ9hnJ\:f1+h
+<)lt"=BSd2>[:ZC?t*VVAS5[jCM[m,EH6/DGBeF\I=?]tK8#&9M2R@SOHPfmQ^F53StD^OUo(&i
+X0&P/ZEpsI\[oGe^VI_(`Q-'BbK\>YdF-Opf@S^0gYL`Di8N_VjlYail0@U$lic_Dn*olHncn^X
+p%A%Pp\jjgq>0scqu6NlrUp/@s.01?~>
+JcC<$ScAB^rVc`nr;6Njs7uZh;YTnYp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYH=n+W2HJeTqJ!IS!]P-PEKKqEI!1nrJLW6rf-l:rK$r>iK=,&
+pQ>K=rfd,?!KiQEPl?sHPkpUAPkpU>Pl?sAPj=V4Pk:7>QMQmFQ7\;cQC+)0S=Z=FTqeE\Vl?\s
+Xfen5ZEpsI\%0&]]Y2%o^qmn*`5Ta:aN2KGrlY>dc2Q#gci2;[dJqSnci)/hblGueb5oc-rl>8`
+`l5p8_u@Ma_8*h#^:h1k]",A]\$i`Q['R*DYct=6Xf\\*Wi;qpVl$;dUS=HUTV%gHS=?":R@'A-
+Q'IStP*1rgO,f3YN/NRMM26qAKnP)2Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,Y_n"`8'kCMIS_
+BE;aXrac+@A,]p<@:9(A#@:\A>[1K;>5h\)=T;J%<rZ/"<;fbq;ZBVm;#a>k:Adid9`@]^9)_E]
+8GPdS7f5^I7/0.B6LmEns2=pLk/FjBZDj[oU7n6PSt;IAR[X5D$($sEQ'@PuP*;(.OTLW-NrG(G
+Nf/jUNJraRMMV7g"GhnjL55bb!JcO#M"O(36N':L7/o^U7f>i*84cBF8kVfN9heAY:f("e;cHat
+<`iL->?kH??XR>QA7]CeBkqO&DfKf>Fa&(VH[U?nJV/Z2Ll%%LO-#NgQ'[l,S=Z@HUSOcbWiN8)
+Yd1UC[^iu^]t_A"_o9[;b0/&TcdC1je^rF+g=tH?hr*JRj5oFdkiqBum-FlBmdKZ8rpg9bo_%nN
+p@nO\!r;]hr;6KkrVcEgJcD;@J,~>
+JcC<$ScAB^rVc`nr;6Njs7uZh;>9eXp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYH=n+W2HJeTqJ!IS!]P-PEJ:'8OlJN:&[ob:[_$Y:\ITb:]!ue
+;?'Jd:\mic:B=3dpK.2loiM/qqcEc!!EWCo=8>tu=8Z+r=SQ%o=Sl/S=BSd/PEhH$R@B_<StMdP
+Uo(&hWiN8)Yd(L?[C3QT\\#Mf^;%J"_Sa=2`lH0AaiaV+!R/gfcMu5id-oB^d/VGjcMu,hbl5cd
+b/sY("inX%`Pf[n_I^R!^V@Lr]Xtbc\[],W[^EKKZa$a=YHG"0XK/A#W2HPjV50l\TqS-OSt2C@
+S!ob4R$O#&P`q8nOcPQ`NJrgSMM[1GLPCM9K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9rb_mV
+Chmg$C&VcHB4h-S!G#^>@KBnFra,n:?!U]?>?b;1=oVV(=8l8#<<-"s;u]bq;>j>k:]F2f:&dod
+9D_?\8cD9V8,YpT7J'"C6hNe:6%T'UrseCjHX^2]<E)jn:Jah`rDEPhs%O#":ej_X8k_rS9hnGZ
+9h\4X:'aNg9MA)R9h\7Z:B+&g:B+)i:$tmO62X(J6i9@P7K5jU7t!p"8P2TJ92&&S:/=\_;,U=l
+<E<.&=]ns6?!^lG@Uiq[B4u!pCi402EccGJG^=^bIXm!%KnbD?MiEdZP*;/tR$sP:T:r$UVPgGp
+Xfen6ZaI6P]"G_k^r"".a2lEHc-FY_daZh!f@em4h;7&IiT&t[k3(smlKdg'"RYXGnF?MK#4qK[
+p%J+RrV-HiqYL-erqu`np&9OBSc=3~>
+JcC<$ScAB^rVc`nr;6Njs7uZh?MF0ep%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]t:hb[^<BGYcY",W2HJeTqJ!IS!fV.P`fs>MOC-B[^W`U]"5Md]tV7rqS;R9
+o>:LEqo&BNrl4`P#/nL!`P&psqRc=2qn;pArkJKKotUI>s1e'=rPA6Fs24`Pq84nOQC+)0S=Z@H
+U84W_Vl?\tXfnt6Za@-K\@K2_]Y2(p_8=(-`Poj<aN;TJbKS2TrltSkd*V^<o@!Qas3Uelrm(Pg
+!6kGc!QrO`aF;1L`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^NTMZa-j?Yck43XK/A$WMl_mV50o^U7n9R
+St;LCS"#k7R$X,(Q'@JqOcYWbNfB!VMi*@ILPCP;KS+o/JUi9#IXQWlH[:!`G^"@TF`__HEcH)<
+Df0H0Ci!m&C2%?pB4kgfAcH9E@q&nU@:9(A!FB(2>lS".>5h\)=9)G$<WZ9#<;f_s;Gg<i;#X8j
+:Amod9`@]_9)_E\8GPdS7f5^I7/94B6LmEns24j=qs34rrnB6_f[n^*e^Vsld*L"]b/hcJ`l?*=
+a2Q!8_na%%]tD%j]"5Sh]=>5W[^EKKZa$dC[C3O4\+Dua6N':L7/o^U7f>i+84cBF8kVfN9heAY
+:f("e;cHat<`iL->?kH??X[DRA7]CeC27X'DfKf>Fa&(VH[U?nJV/Z2Ll%%LO-#NhQ'[l-S=Z@H
+USOccWiN8*Yd1UC\%0)_]t_A"`5Td<b0/&TcdC1je^rF+g>(N@hr*MSjQ5OekiqBum-O->mfDqJ
+rpg9bo_%nNp@nO\!r;]hr;6KkrVcEgJcD;@J,~>
+JcC<$ScAB^rVc`nr;6Njs7uZh>5.aap%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]t:hb[^<BGYcY",W2HJeTqJ!IS!fV.P`fEkEHuteMMd=MN/WaUrJpi;rfH*$
+s-!,=rf[8EplY`AP*(q*Pl?sHPl$[BPkgO=PlI$CPj=V2PkC==QMm'KQMm(%QC+)0S=Z@HU84W_
+Vl?\tXfnt6Za@-K\@K2_]Y2(p_8=(-`Poj<aN;TJbKS2TrltSkd*V^<o@!Qas3Uelrm(Pg!6kGc
+!QrO`aF;1L`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^NTMZa-j?Yck43XK/A$WMl_mV50o^U7n9RSt;LC
+S"#k7R$X,(Q'@JqOcYWbNfB!VMi*@ILPCP;KS+o/JUi9#IXQWlH[:!`G^"@TF`__HEcH)<Df0H0
+Ci!m&C2%?pB4kgfAcH9E@q&nU@:9(A!FB(2>lS".>5h\)=9)G$<WZ9#<;f_s;Gg<i;#X8j:Amod
+9`@]_9)_E\8GPdS7f5^I7/94B6LmEns2Y-^o@gmi[]H@#Tq\3NSt2FAS!oe6R$a5*QBdc"P`h5m
+Oo:@IO,f9\NJrjUN;e_CM27%FLP^hCLPLbEm>1C#r'L?Lr'^QRs$lrWIRm%%8kM`L9MJ5V:Jakb
+;H$Op<`W=*=^,-:?=.,M@q9.`BPM=!DJsN8FEMePH@('hJ:W?,L5:\ENK90aPa.T&S"-(BTqeE\
+W2co#YHY==[C<]X]Y2(q_SjF6aND]NcHjndeCE1&g"P6;hV[8Nj5f=akNM0qlg4!*s6g!Xnc&(`
+oCV_Kp@e7Zp]C9fqY^6ir;HTerdk*?s*t~>
+JcC<$ScAB^rVc`nr;6Njs7uZh;>9eXp%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]t:hb[^<BGYcY",W2HJeTqJ!IS!fV.P`e@&7n65M:&Ria:[h-Z:[_-Y;?'Jd
+:\mic:BO?f:/COaq,[2j!*K)!s&e_kqcNl"qc<_ur)io#!*K5'pK7Aqs&f;(0U7rkR@B_<T:r!T
+V5C/iWiW>+Yd(OA[C3TU]">Vg^V@V%_SjF4`lQ6Cb0.uPbg$.4!mf6?r6b,ar6bPks3L\is31Pf
+rlY>bao9A1a2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[Bm3FZ*:I9Y-"e+WiE%sVl-AeUnaZXTqJ!K
+SXc1=R[KP0QBd`"PEM&iO,o<\N/W[PM26qAL4t;5K7\Z)J:E#rI=-BfH?jaZGBS+NFE;JBEH#i6
+DJa3+CMR[!BP;$kAn>QRA-HIP@UW\Qra,\4?2e+/>6%k+=oVS(=8c/$<E)rr;Z]io;>j>j:]F2g
+:&[ic9DhE]8c;3U8,YpT7J'"D6hE_96%T'Wrs?i-E*c^L;c6IhrD3Gjs%j%t9i"JY9MJ8U92#7Z
+!)3Ae!DQ8e9`e!a:B!oc9F4Ed:JX\[9hnDXr_EMjmnr^Cr'L?Lr'^QRs$lrWIRm%%8kM`L9MJ5V
+:Jakb;H$Op<`W=*=^,-:?=.,M@q9.`BPM=!DJsN8FEMePH@('hJ:W?,L5:\ENK90aPa.T&S"-(B
+TqeE\W2co#YHY==[C<]X]Y2(q_SjF6aND]NcHjndeCE1&g"P6;hV[8Nj5f=akNM0qlg4!*s6g!X
+nc&(`oCV_Kp@e7Zp]C9fqY^6ir;HTerdk*?s*t~>
+JcC<$ScAB^rVc`nr;6Njs7uZh?2+'dp%@tKo()>?n*f]3m-O$%l0.9ljQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hWB_ns4(]t:hb[^EHHYcY",WMcSgTqJ!IS!fV.P`fj4L6.n,]skM^]">Vg]tV5[^]2+;
+_#V@O_=kbG_tq=K`W!mQ`;mjT`;mjT]_T2<]E#S;]_fD@^@8o8^Akt;_#;+E_>qLL`;IM0Q'Rf*
+S"-(BTq\?ZVl6VqXKA\1ZEppH[^`lZ]Y2%o^qmn*`5Ta:aN;TJbKS5UcHab_d/DAldf%YieG[kr
+deqJod*L&;c>UtObfe2PaiVWFa2Z*;`5BI/_8*h#^:h1l]=PP`\@8oS['R*EZ*:I9Xf\\*WiE%s
+Vl$;dUnaZXTV%gISXc1=R@'A.QBd`"P*1rhO,o<\N/WXNM26qAL4t;5K7\Z)J:DuqI!^0cH$FOW
+G'3e+$$1-,EH#i6DJa4hCDCSuBP;$jAn>Oa@q/tW@:3JM?X@&Er`fM/>$Co.!a&N*r`9&!s&Atr
+s&/korD<Mir_EDdr_3>bqb$iZrCHcTr'pTQogJRBoKr+7JcEdj*Vf[.j5A_Ig=b03f@AF$e'QCc
+cd'bWaN2E@`Q,pr`=]r'^qRRr]=Y_f]YD.j[C3QPrj2X0"1>VJ[dLWs62X(K6i0:O7K5jU7t+!#
+8P2TJ9MA/T:/=\_;,U=l<E<1'=^#$7?!grI@Uit\B4u$qCi402EccGJG^=^bIXm$&KnbD@N/`m[
+P*D5uR@B_<TV8-VVl6VrXfnt7ZaR?R]"G_k_8=.0a2lEHc-F\`daZh!f\,!6h;7)JioB+]k3(sm
+lKdg'mJlV_nF?)?oCMVIp%J+RrqQNhs8)Zjrqu`np&9OBSc=3~>
+JcC<$ScAB^rVc`nr;6Njs7uZh=nhX`p%@tKo()>?n*f]3m-O$%l0.9ljQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hWB_ns4(]t:hb[^EHHYcY",WMcSgTqJ!IS!fV.P`f<dDKU8XNJi^RN/`hnNr>(.OoCI9
+OT:R=OoCOBPPL@AOo1C<PlI$HPl6gDPkUC/PjF\2PkUI?QMHe%QC+)0S=Z@HU84W`W2cl!Xfnt7
+Za@0L\@K2`]tV7s_8=+.`Q#s>ai_fMbg"DXcHjkarR(YnrR:PkrR:epr6YSmcd2U9Dp?MMbKJ&M
+aiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i]OZa6sBYct=5XfSS'Wi;qpVPU)aUS=HTT:VXFS=?"9
+R$a5+Q'ISsP*(ieO,f3YN/EIKLkg_>KnP)2Jq8H&Isl`mH[:!`G^"@TFoHIhF)l8?E,TW3D/B2e
+'l%GrBP1phAS#C^@q&nU?sm>K?=$q:>QS,5>5hY+=BAT'<rZ2"<;ohr;ZBVm;#a>j:Amod9`Ic_
+9)_E\8GYjS7f5^J7/0.A6LmEns2k9[l,pKHZ`0dqTqS*LSt2FAS!oe6R$a5*QBd`!rf[;D&Wi-:
+O,f9_NJrdTNJrdPMi!>hM#W81M#iKimYUR%r'LBMqaCHQs$lrWIRm%%8kM`M9MJ5V:Jakb;H$Op
+<``C+>$G6;?XI5N@qB4aBPM=!DJsN8FEMePH@('hJ:`E-L5:_GNK90aPa.T'S"-(CTqeE]W2co#
+YHY==[^WfY]Y2(r_SjF6aND]NcHsteeCE1'g"P6;hVd>Oj5f=akNM0qlg4!*s6g?bnac8BoCV_K
+p@e7[q#C0iqY^6ir;HTerdk*?s*t~>
+JcC<$ScAB^rVc`nr;6Njs7uZh<VQ4\p%@tKo()>?n*f]3m-O$%l0.9ljQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hWB_ns4(]t:hb[^EHHYcY",WMcSgTqJ!IS!fV.P`e@$7Rg!E:/+I]:ARcV:B+,g;#X8a
+;#X>l:]X?gpeU]\s%`Vir(llbq,Z3Nr)io!r)Wi!r)ir$s&f;(p/q;qs&_+CQC+)0S=Z@HU84W`
+W2cl!Xfnt7Za@0L\@K2`]tV7s_8=+.`Q#s>ai_fMbg"DXcHjkarR(YnrR:PkrR:epr6YSmcd2U9
+Dp?MMbKJ&MaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i]OZa6sBYct=5XfSS'Wi;qpVPU)aUS=HT
+T:VXFS=?"9R$a5+Q'ISsP*(ieO,f3YN/EIKLkg_>KnP)2Jq8H&Isl`mH[:!`G^"@TFoHIhF)l8?
+E,TW3D/B2e'l%GrBP1phAS#C^@q&nU?sm>K?=$q:>QS,5>5hY+=BAT'<rZ2"<;ohr;ZBVm;#a>j
+:Amod9`Ic_9)_E\8GYjS7f5^J7/0.A6LmEns3(EVql>9Z>Zk*+;Gg1a:eska:esn_:&[m(9MJ8U
+91r#T9h\5U9hS/S:/=S\9MA)PrCdSo:ea_[:JFS[:JagS;=m0P6N0@L7/o^U7f>i+84cBF8kViO
+9heAY:f("e;cHat='/U/>?kH@?X[DRAS#LfC27X'DfKf>Fa&(VH[U?nJqJc3Ll..NO-#NhQ'[o.
+S=ZCIUSOfdWiN8*Yd1UD\%0)_]t_D#`5Td<b0/&Td*^:ke^rI,g>(N@i8EVTjQ5OekiqBum-O->
+mgJXTo()DDo_%nNp@nR]s7u]kr;6KkrVcEgJcD;@J,~>
+JcC<$ScAB^rVc`nr;6Njs7uZh=SMO_p%@tKo()>?n*f]3m-O$%l0.9ljQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcb(-WMcSgTqJ!IS!fV.P`fg+LPhM&^::_b]=e-VrP/<Hm(rG5
+rPSNNqSiKSq8E?PrPefT!Q2PI]_K,:]E#Y@]_]>?^@Au8^AktB^];+G_#2%I_?7Wk_o)5e1W,KD
+R$jG6StD^NUnsufWiN8)YctF>[C3QT\\#Mf^V@V%_o0O6a2l?Db0/#Rc-FV\d/DAldf7ebeGn"s
+df.YociDDkc3DP;bfe2Pao9A%a2Z*;`5BI/_8*h#^:h1l]=PP`\$i`Q['R*EZ*:F7Xf\\*WiE"q
+Vl$;dUnaWWTV%gISXc1<R@'A.QBd\uP*1rhO,o<\N/NRMM26qAL4t;5K7SQ'IsufoI!^0cH$FOW
+G'.nKF)l;@EH#i6DJa4hCC4fjBP;$jAn>OaA,]pB@:3JM?X@&Er`fM/>$Co.!a&N*r`9&!s&Atr
+s&/korD<Mir_EDdr_3>bqb$iZrCHcTr'pTQogJRBog817JcEgk0`:4pgt^`>f\"d,e^W'pd*Bq_
+bKA#La2Z*;`l#a5`PTL,^:q7l]=PPd^:Uk]\$Z.@s02^6\$rcRn$hmSr'LBMqaCHQs$luXs%!,]
+r^qZ59MA/T:/=\_;,^Cm<E<1'=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=^bIXm$&KnbD@N/`m[
+P*D5uR@B_<TV8-VVl6VrXfnt7['mHS]"G_k_8=.0a2lEHc-F\`daZh!f\,!6h;7)JioB+]k3(sm
+lKdg'mdKW6nac8No*+dZp%J+RrqQNhs8)Zjrqu`np&9OBSc=3~>
+JcC<$ScAB^rVc`nr;6Njs7uZh=SMO_p%@tKo()>?n*f]3m-O$%l0.9ljQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcb(-WMcSgTqJ!IS!fV.P`f9aDfU,WO,JsUNK*dprK$<,pQ>K=
+plYN<rKI&?!0R,@ns''9r06o=m?I()!gJt8q3:fB!0mJJ!1*>D0p\2pS"-(BTq\?ZVl6VrXfen4
+ZEpsI\%0&]]Y2(p_8=+.`Q#s>aN;TJbg"DXcHjl9dJqYpe*kfde,IepdJqPnci22oc-4DTbK@s+
+aE#>@`Pod5_SX.)^V@Lr]Y(kf\[f2X[^EKKZa-j?YHG"0XK/A$W2HPjV50o^TqS-OSt;LCS!ob4
+R$X,(P`q8nOcYWbNfB!UMM[1GLPCP;KS+o.J:N,uI=6KiH?sj]GB\4QFEDSEEcH)<Df0H0D#S2W
+C2%?pB4baeARo<M@L$=L?sd8I?=!P8!aAi3r`K;)=',B%s&K(ur_rhps&&_ks%iVhrD!8bs%E5]
+r^m&ZqFCHQr'g9Hpd=^@nNha+bl8(Bg:t8.X/D\cTq@qTSc>2YRfA`gQ^*l$P`q8nOcY]eP)t`a
+NfT0XrJ^c7!f;_ir.kN3M2I.FM!p2l62X(K6i0:O7K5jV8,l*[8cD>392&#R9hnJ\:f1.i<)lt#
+=BSg3>[:]D@:E_XAnPdlCMds-EH6/DGBeF\I=?]uK8#&9MN!OUOHPinQ^O>5StMdPUo1/kX0&S0
+ZF%'L\[oGe^VRe*`Q-'BbK\>ZdF-Opf@\d1gtgiFi8WeXjlYail0@U$m-a?2nF?)?s76Edp%A%P
+p\ssfq>^<hqu6NlrUp/@s.01?~>
+JcC<$ScAB^rVc`nr;6Njs7uZh;YTnYp%@tKo()>?n*f]3m-O$%l0.9ljQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcb(-WMcSgTqJ!IS!fV.P`eI'77^$FqbHu`mnW^TpJCfcrD<8b
+q+grc!)EAdnlPQdg/n2Sr`Att!*B#!!*T;'!*T/#!*B)#1KTj-R$jG6StD^NUnsufWiN8)YctF>
+[C3QT\\#Mf^V@V%_o0O6a2l?Db0/#Rc-FV\d/DAldf7ebeGn"sdf.YociDDkc3DP;bfe2Pao9A%
+a2Z*;`5BI/_8*h#^:h1l]=PP`\$i`Q['R*EZ*:F7Xf\\*WiE"qVl$;dUnaWWTV%gISXc1<R@'A.
+QBd\uP*1rhO,o<\N/NRMM26qAL4t;5K7SQ'IsufoI!^0cH$FOWG'.nKF)l;@EH#i6DJa4hCC4fj
+BP;$jAn>OaA,]pB@:3JM?X@&Er`fM/>$Co.!a&N*r`9&!s&Atrs&/korD<Mir_EDdr_3>bqb$iZ
+rCHcTr'pTQogJRBog817JcF!p+OQ0g?WpQ1;GU+a:/=Y\:f'q`:/+JY9MA/U9M8&S:/(U\%SKJi
+:/4MZ9MJ/R9MJ/Qr_EGes%WYm:JFUQ;=d*O6N0@L7/o^U7fGpX8,u6\8q0K-9MJ5V:Jakb;c?Xq
+<``C+>$G6;?XI5N@qB7bBPM="DJsN8FEMePH@('hJ:`E-L5:_GNK90aPa.T'S"-(CTqeE]W2co#
+YHY=>[^WfY]Y2(r_SjF6aND]NcHsteeCE1'g"P6;hVd>Oj5f=akNM0qlg4!+n*fc9o()hP"n_K\
+p@e7[q#C0iqY^6ir;HTerdk*?s*t~>
+JcC<$ScA?]rr)ior;6Njs7uZh#5@ibp%@tKrpj%Yn*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcb(-WMcSgTqJ!JS!fY/P`h,MLkqUu\@B)\]=bhj^:q@srP7d9
+pVQmHqS`9Ms2OlR"N8:!`Pqhp!5n?=r4N$Bs1JBFrk/$>rP%p=q7cjCpqQmDrP/?IrPAEKs24TL
+0UA)pS"6.DTqeE\Vl6VrXfen5Za7'J\@K2`]Y;.r_8=+/`Q$!?ai_fMbg"GYcd;[=s3^nrqpb8g
+r7(_p!7Lhn$dd5GcHa\Zbfe2Pao9@qa2Z*;`5BI/_8*h#^:h1l]",A]\$i`Q['R*EYct=6Xf\\*
+Wi;qpVl$;dUS=HUTV%gIS=?":R@'A.Q'IStP*1rhO,o9ZN/NRMM26qAL4t84Jq8H&IsufoI!^0c
+H$FOWG'.nKF)q8"%WH?(DJa3*CMIQtBP;$jrac+@A,]p<@:9(A!a]/<r`fM/>$Co.!a&N*r`9&!
+s&Atrs&/korD<Mis%`Jdr_3>bqb$iZr^ciTr'pTQogJRBoKr+7JcEso"8MojjSms;g=b*0rm_D+
+d*U+acd'\UbK7g'`W*db_o0F/^qRLo]=PPa]Y1lS[0<qDZE^[BrjM7(o0N:@r^6QNs$crWr^ZuZ
+!(m/^InNI/9heAY:f("f;cHat='/U/>?kH@?X[DRAS,RgC27[(DfKf>Fa&(VH[UBoJqJc3Ll..N
+O-,TiQ'du/S=ZCIUSXleWiW>+Yd1XE\%0)_^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8EVTjQ5Oe
+kiqBum-O0/n*ol<nd"dYo_%nNp@nR]s7u]kr;6KkrVcEgJcD;@J,~>
+JcC<$ScA?]rr)ior;6Njs7uZh#5@ibp%@tKrpi_Pn*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcb(-WMcSgTqJ!JS!fY/P`h,=DfL)SMN!MjNW5%;O6hu&OT:R=
+Oo:IAPPL@COckq+Oo^]/ns''9qNUZ:mZd1*!gJt8qNUE50UA)pS"6.DTqeE\Vl6VrXfen5Za7'J
+\@K2`]Y;.r_8=+/`Q$!?ai_fMbg"GYcd;[=s3^nrqpb8gr7(_p!7Lhn$dd5GcHa\Zbfe2Pao9@q
+a2Z*;`5BI/_8*h#^:h1l]",A]\$i`Q['R*EYct=6Xf\\*Wi;qpVl$;dUS=HUTV%gIS=?":R@'A.
+Q'IStP*1rhO,o9ZN/NRMM26qAL4t84Jq8H&IsufoI!^0cH$FOWG'.nKF)q8"%WH?(DJa3*CMIQt
+BP;$jrac+@A,]p<@:9(A!a]/<r`fM/>$Co.!a&N*r`9&!s&Atrs&/korD<Mis%`Jdr_3>bqb$iZ
+r^ciTr'pTQogJRBoKr+7JcF$q%.)-F]!SE2U7n3NSY#hN%\&oVR@9J/QBmf#P`q8nrf@5COcPS%
+N>%5/Mi3INMM[1GM2@%ELPLbELktJUo0N:@r^6QNs$crWr^ZuZ!(m/^InNI/9heAY:f("f;cHat
+='/U/>?kH@?X[DRAS,RgC27[(DfKf>Fa&(VH[UBoJqJc3Ll..NO-,TiQ'du/S=ZCIUSXleWiW>+
+Yd1XE\%0)_^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8EVTjQ5OekiqBum-O0/n*ol<nd"dYo_%nN
+p@nR]s7u]kr;6KkrVcEgJcD;@J,~>
+JcC<$ScA?]rr)ior;6Njs7uZh#5@ibp%@tKrpiYNn*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcb(-WMcSgTqJ!JS!fY/P`h+p7n?0E:&Ri`:[_'T:\R]a;>sDe
+:\dcb:BF9e;#F)j:0(Ed=85hM=8H&!=8Z,!=8c5$=7]Po=8c5TQC+,1SXuLJUSOcbW2co#Y->1;
+ZaI6O\[oGd^;%J"_Sa@3`lQ6Cb0.uPc-FV\d/MGmdK%bneF_;heGdnsdf%Q$d*L%`cHXVXbKJ&M
+rlAfo`l5p8_ns:,^q[Xu]tD"h\[f5Z[^NTNZa6sAYck43XfSS'WMl_mVPU)`U7n9RT:VXES"#k7
+R$a5*Q'@JqP*(ieO,]*WMi*@JLkg_>KnG#0JUi9#IXQWlH[:!`G^"@TF`__HErL%gE,TW3D/=!'
+C2%BqBP1rVAH?=OraGn:@/aL7?<pk9>QS,5>5hY+=BAT'<rZ2"<;ohr;ZBVm;#a>k:Adic9`Ic_
+9)_E]8GPdR7f5^J7/0.A6LmEns3L]VYCU:i=]SHu:JOSZ:/=SY;#X6)9hnJW9MJ5T92&,V9MJ2S
+9h\5T:B!uf9`I`m9MJ/S:/+MX:JFU`:B45Z;=d*O6N0@L7/o^U7fGpX8,u6\8q0K-9MJ5V:Jakb
+;c?Xq<``C+>$G6;?XI5N@qB7bBPM="DJsN8FEMePH@('iJ:`E-L5:_GNK93bPa.W(S"-(CTqeH^
+W2cr$YHY=>[^WfY]Y;.s_SjF6aND]NcHstfeCE1'g=k?<hVd>Oj5f=akNM0qlg4!+n*fc9o(!%W
+o^qhLp@e7[q#C0iqY^6ir;HTerdk*?s*t~>
+JcC<$ScA?]rr)ior;6Njs7uZh#5@ibp%@tKrpi_PnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCqd[^EHHYcb(-WMcSgU7e*KS!fY/P`h,HKnktfY.hOH]`5\F^AbnE_!]&7
+_Z%IL`;@OR`qRFR`l5pq_u[iqpq-I8rk&*@q7Qd@pq?R=otU=:rP/BJoY:FAs2"TLs24ZN1maSu
+S"6.DTqeE\Vl?\tXfen5Za@0L\@K2`]tV7s_SX71`lH0Bb0.uPc-FV\d*^7hdaS0Ermgtuq:GSr
+rmgtss3gtrrmCbm!71Yi"jP97bK@s+aEttI`Pod5_SX.)^V@Lr]Xtbc\[],W[^EKKZE^X<YHG"0
+X/`2!W2HPjUnjc[TqS-OSt2C@S!ob4Q^3o%P`q8nOcPQ`NJrgSMM[1GLPCM9K7ec,J:N,uI=6Ki
+H?sj]GB\4QFEDSEEH,r9Df0H0Chmg$Bk_6oB4h-S!G#^>@KBnFra,_5?![G7!aAi3r`K;)=',B%
+s&B%urDW_os&&_ks%iYir([2br_*,\r^m)[q+(?Pr'g9Hpd=[?nj.j,cMnUWqWd%pgYCK6f@JI%
+eC2djcHje\rlPDd`l5p8`W!^Y_nj1)^:h/W\co^Y\$`WNrj2X0"1>YK[dCQq62X(K6i0:O7K5jV
+8,l*[8cD<_92,=ZInid9:f1.i<)lt#=BSg3>[:]D@:E_XAnPdlCMds-EH6/DGBeF\I=Hd!K8#&:
+MN!OUOckroR$jG6StMdPV5L8lXKA\1Za@0M\[oGf^VRe*`Q-'BbK\>ZdF6Uqf@\g2gtgiFi8WeX
+jlYail0@U$m-a?2nF?)?oCV\Jp&F^cp\ssfq>^<hqu6NlrUp/@s.01?~>
+JcC<$ScA?]rr)ior;6Njs7uZh#5@ibp%@tKrpi\OnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCqd[^EHHYcb(-WMcSgU7e*KS!fY/P`h,9CiFTIL5u%grf6l:mZ?n"rf[2C
+pQ>N?r/q,DP*5g.o9B-9qNU`<m$-k%qipT81maSuS"6.DTqeE\Vl?\tXfen5Za@0L\@K2`]tV7s
+_SX71`lH0Bb0.uPc-FV\d*^7hdaS0Ermgtuq:GSrrmgtss3gtrrmCbm!71Yi"jP97bK@s+aEttI
+`Pod5_SX.)^V@Lr]Xtbc\[],W[^EKKZE^X<YHG"0X/`2!W2HPjUnjc[TqS-OSt2C@S!ob4Q^3o%
+P`q8nOcPQ`NJrgSMM[1GLPCM9K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9Df0H0Chmg$Bk_6o
+B4h-S!G#^>@KBnFra,_5?![G7!aAi3r`K;)=',B%s&B%urDW_os&&_ks%iYir([2br_*,\r^m)[
+q+(?Pr'g9Hpd=[?nj.j,dJjRHh8-V0X/DbdT:Z%Qs-s+ZRf8]WR[BG.rfmAE"d"e,O-#D"NW"e?
+MMm@KMM[,fL]E50M?&J"M=X%26N0@L7/o^U7fGpX8,u6\8c_RYr_7l;:Jakb;c?Xq<``C+>$G6;
+?XI5N@qB7bBPM="DJsN8FEMePH@('iJ:`E-L5CeHNK93bPa.W(S"-(CTqeH^W2cr$YHY@?[^WfY
+]Y;.s_SjF6aND]NcHstfeCE1'g=k?<hVd>Oj5f=akNM0qlg4!+n*fc9o()DEo_%nWp&Ojdq#C0i
+qY^6ir;HTerdk*?s*t~>
+JcC<$ScA?]rr)ior;6Njs7uZh#5@ibp%@tKrpi_PnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCqd[^EHHYcb(-WMcSgU7e*KS!fY/P`h+p6UsU=:/=X\:[_'Q:\mod;>sDe
+:\dc`:B45h:BF9e:]+8b=8Gth=8uD!<rc@m=8>tu=8c2"=8c8$<s2W,=BAT#=T);Y=I5DDS"6.D
+TqeE\Vl?\tXfen5Za@0L\@K2`]tV7s_SX71`lH0Bb0.uPc-FV\d*^7hdaS0Ermgtuq:GSrrmgts
+s3gtrrmCbm!71Yi"jP97bK@s+aEttI`Pod5_SX.)^V@Lr]Xtbc\[],W[^EKKZE^X<YHG"0X/`2!
+W2HPjUnjc[TqS-OSt2C@S!ob4Q^3o%P`q8nOcPQ`NJrgSMM[1GLPCM9K7ec,J:N,uI=6KiH?sj]
+GB\4QFEDSEEH,r9Df0H0Chmg$Bk_6oB4h-S!G#^>@KBnFra,_5?![G7!aAi3r`K;)=',B%s&B%u
+rDW_os&&_ks%iYir([2br_*,\r^m)[q+(?Pr'g9Hpd=[?nj.j,df0^+NcJN2=B&-o:/4Ua:'F?f
+:Jak`r_<tt9hnGW9MJ8U9MJ5T9h\4Z:B+&g9`Icc9E7]a:B!rj:/=\_:@1pM62X(K6i0:O7K5jV
+8,l*[8cD<_92,=ZInid9:f1.i<)lt#=BSg3>[:]D@:E_XAnPdlCMds-EH6/DGBeF\I=Hd!K8#&:
+MN!OUOckroR$jG6StMdPV5L8lXKA\1Za@0M\[oGf^VRe*`Q-'BbK\>ZdF6Uqf@\g2gtgiFi8WeX
+jlYail0@U$m-a?2nF?)?oCV\Jp&F^cp\ssfq>^<hqu6NlrUp/@s.01?~>
+JcC<$ScA?]rr)ior;6Njs7uZh<;6+[p%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WMcSgU7e*KS!fY/P`h/EIY<]NXM+SEs1SHHrkJ0Bo>1=@
+"2Vjl_th7>`<+&u`Vm^V`Pf^n]Cri8]DT>0^&#J9^](qI^&>YG^V0Q[!5AHI!5A<E"Mhji_SQ2f
+s24iS2T!DNQ^F52SXuLJUSOcbWN*&%YHY:<['mHR\\#Mf^V@V%_o0O6aN2KGbKS5VcHjkbdF-Il
+rm^turmpSjs472"rm^tss3gqps3Lblrm$#<bfe2PaiMQD`l?!:`5BI/^q[Xu]tD"i]",A]\$i`P
+Za6sBYct=6XfSS'Wi;qpVPU)aUS=HUT:VXFS=?":R$a5+Q'IStP*(ieO,f3YN/NRMLkg_>KnP)2
+Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,TW3D/F*)CMIS_BEi*]AS#C_A,]p<@:9(A#@:\A>[1K;
+>5h\)=T;J%<rZ/"<;fbq;ZBVm;#a>k:Adid9`@]^9)_E]8GPdR7f5^J7/0.A6LmEns3^ibq>^3M
+h:pc=f@\['daZ^md*L%`c-=GSbK.^&`#Zb3_8F1,_8*dt]=PPa]"P_c[C3HK['R$B[C<TQm^MaQ
+rBgHMqaCHQs$luXs%!,]r^m2a9`@b9:/=\`;H$Ln<E<1'=^#$7?!guJ@Uit]BP;-rD/O<4F*)SL
+H$XjdIt3-'KnkMBN/`m\P*D9"R@Bb=TV80XVl6VsXfnt8['mHS]=bkm_8=.0a2lEHc-F\`e'uq"
+f\5'7h;7)JioB+]k3(smlKdg(mdKW6nac8Bo^qhLs7QHerqQNhs8)Zjrqu`np&9OBSc=3~>
+JcC<$ScA?]rr)ior;6Njs7uZh;tp"Zp%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WMcSgU7e*KS!fY/P`h/7Bl%p>L%pZ,NqSP*OSb.?OS=n9
+P5UU<OoU^DOopi0P*,X*!L/fBPkgOCPlI$JPk^I.PQ6pFPlR'HPlR'JPlR'HQ2[$CPlR'JPr=kl
+Q'[l,S"6.DTqeE\Vl?\tXfnt6Za@0M\@K5a]t_=u_Sa=2`lQ6Cb0/#RcHab_dF$Cje,Iksec+.h
+fDjG$ec+(ue,RkrdJqPnci24>c-4ASb/q`Ga2Z-<`Pf[2_SEq$^:h1l]=PP`\@8oT['R*EZ*:I9
+Y-"e+WiE%sVl$;dUnaZXTq@pJSXc1=R[BJ/QBd`"PEM&iO,o<\N/W[PM26qAL4t;5K7\Z)J:E#r
+I=-BfH?jaZGBS+NFE;JBEH#i6DJa6,CMR[!rb)LKAn>OaA7PUJ!F]C8?O'nC?!LW=>?_#/s&f;&
+r`9&!!*&nqs&/korD<Mis%`Jds%NDbqb$iZr^ciTr'pTQogJRBoKr+7JcF4!&+7TL]!SE1Tq@pI
+S=Q1>SGej)R[KP0Q^*f"P*1rjOH5KaOH,<[Nf8sVMi<UQMMm:HM27"ELPLbELktJUnj34@rBpHM
+s$crWr^ZuZ!(m/^!D?,c9n,o6:f1+h;cHat='/U/>?kH@?t!MSAS,UhC27[(E,fr@G'A4XI!pKp
+JqJc4M2I7OO-,TiQC+)0SXuLJUnsufWiW>+Yd:^F\%0,`^;%M$`5Td<b0/&Td*^=le^rI-g>(N@
+i8EVTjQ5OekiqBum-X60n*ol<o(2MGp%A@Y!;HKfs7u]kr;6KkrVcEgJcD;@J,~>
+JcC<$ScA?]rr)ior;6Njs7uZh;tp"Zp%@tKoCDJBnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WMcSgU7e*KS!fY/P`h.r6q9^;:A@WS:A.K[;#X>j;#!i^
+:Adlf;#F)k:/=Y\q,[)gqc<;ir`K&!s&eemq,mYur`9&#r`JqsqcNl"1ffs1R[]k>TV8-VVPgDn
+XKA\1Z*UgG\%&u\]Y2(p_8=+.`Q$!?ai_fNc-FV\d*^7hdaS3Fs4.,"nCR]krmh"ts3q"rs3^kn
+!71YiJ'H3\bK@rJaN)<?`Pod5_SX+'^V7Co]Xtbc\[],W[^<BIZE^X<YHG"/X/`2!W2HMhUnjc[
+TqS*MSt2C@S!o_3Q^3o%P`q8mOH5H_NJrgSMM[.EL5(D8K7ec,J:N,uI=6KiH?sj]GB\4QFEDSE
+EH,r9DJj<.Chmg$C&VcMB4b^dA7T3L@KBnFra,n:?!U]?>?b;1=oVV(=8l8#<<-"s;u]bq;>j>k
+:]F2f:&dod9D_?\8cD9V8,PjS7J0(D6hE_96%T'crsH&`BO"\@;Gp=c:&[of9a+<e:f'q_rCn#&
+:/">U9h\5T:/"AU9282V:/+DU9DqNa:&[ll:JFS[:JO[Q;=[$O6N':K7/o^U7fGpX8,u6\8c_RY
+r_7l;:Jand;c?Xq<``C+>$G6;?XR;O@qB7cBPM="DK'T:FEVkRH@1-jJ:`E-LP^nINK93bPa7])
+S"6.DTqnN_W2cr$YHY@?[^WfZ]Y;.s_SjF6aND]NcHstfeCE1'g=k?<hVd>Oj5f=akNM0qlg4$,
+n*fc9o()DEo_%nWp&Ojdq#C0iqY^6ir;HTerdk*?s*t~>
+JcC<$ScA?]rr)ior;6Njs7uZh<;6+[p%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb+.WMcVhU7n0LS!fY0P`h/CH%_$CY.ahHs1A?FrP&9Gq7uC6
+s2+fRpr)^As2P)Xs2=oUs2=rVqmum?]D9&<]DT>0^%f>7^\PV:^Au"G^B23e_>M1M_u7M0_j?aZ
+S"6.DTqeE\Vl?\tXfnt7ZaI6N\[oDc^;%J#_SjF4a2lBFbKJ/UcHjkbdF-IlrmV#"f%0`Mp=T8o
+rmq,"rmV"udaJ-B!RT0lc@=*_bKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f5Y[^EKKZa-j?Ycb+1
+XK/A$WMcYkV50o^U7n6PSt;LCS!ob4R$X,(Q'@GpOcYWbNfB!VMi!:HLPCP;KS+o/JUi9#IXQWl
+H[:!`G^"@TF`__HEcH)<Df0H0D/=!'C2*Z\$YO'_ARo=]@U`bS@/aL<?<piA>[(E9r`T8'!*B,"
+!``3!rDW_os&&_ks%iYir([2br_*,\r^m)[q+(BQqaL0Gpd=^@nNha+e,LKep?LSig=t92e^N!s
+eC)aicd'bZbfn5Oa2Ps7`5DPi(Vml&^:_%g\[o>b]=5/T['R*EZ*UjJ[dCQp62a.K6i9@O7K5jV
+8,l*[8cD>392&&S:/=\_;,U=k<)lt#=BSg4>[CcF@:EbYAnYmnCMds.EH?5FGBnL^I=Hd!KSG8=
+MN!RVOckuqR$jG7StMgRV5L;mXKA\2Za@0M\\#Mg^VRe*`Q-'BbK\>ZdF6Uqf@\g2gtgiFi8WeX
+jlYail0@U$mI'H3nF?)?#P7T[p%A%Qp\ssfq>^<hqu6NlrUp/@s.01?~>
+JcC<$ScA?]rr)ior;6Njs7uZh<;6+[p%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb+.WMcVhU7n0LS!fY0P`h/5AoDd;KoYnerf6f8m?%%(rK@/D
+p6,H>q2tfAP*5R'q3:W;rK[AHqNL--nWa*=rK[DIqj%/FrKT1'Q^F52SXuLJUSOcbWN*&%YHY==
+[C3QT]">Vh^VI_'`5T^9aN;TJbK\>Xcd:(edaHVDe,n1Of)+(mf_a;"f)O;"e,n+Idf.Vpd*M^:
+J'H3\bK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[])V[C!9HZE^X<Y-"h-X/`2!Vl-DgUnjc[TqJ$L
+St2C@R[KP1Q^3o%P`h2lOH5H_NJrgSM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9
+DJj<.Chmg$C&VcRB4b^dA7T1Z@UW\Qra,n:?!U]?>?b;1=oVS(=8c/$<E)rr;u]bq;>j>k:]F2f
+:&dod9D_?\8cD9V8,YpS7J0(D6hNe96%T'ert#"a^pp_PVP9`TSt2@AS=BMG$(@9NQ^=#'P`q@2
+OUdP:O-#E_N/`dVN/`dSN;\Y8Lkkqb"G_ejMMUYVnj34@rBpKNr^HiVr^ZuZ!(m/^InNI09hnJ\
+:f1+h;cHat='/U/>[1TB?t!MTAS,UiC27[(E,fr@G'A4XI!pKpJqSl6M2I7PO-,TjQC+)0SXuLK
+UnsugWiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8EVTjQ5OekiqBum-X60n*ol<
+nd"dYo_%nNp\4[^s7u]kr;6KkrVcEgJcD;@J,~>
+JcC<$ScA?]rr)ior;6Njs7uZh:&"ATp%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb+.WMcVhU7n0LS!fY0P`h1.7K5p[9htR]mnWRPqb[5grD<8b
+q+glas%rMe!_uNepK$lerDrhts&f,!r)io!rE/Skq,mYu!`iB(rE/bprE(jWQ^F52SXuLJUSOcb
+WN*&%YHY==[C3QT]">Vh^VI_'`5T^9aN;TJbK\>Xcd:(edaHVDe,n1Of)+(mf_a;"f)O;"e,n+I
+df.Vpd*M^:J'H3\bK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[])V[C!9HZE^X<Y-"h-X/`2!Vl-Dg
+Unjc[TqJ$LSt2C@R[KP1Q^3o%P`h2lOH5H_NJrgSM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]GB\4Q
+FEDSEEH,r9DJj<.Chmg$C&VcRB4b^dA7T1Z@UW\Qra,n:?!U]?>?b;1=oVS(=8c/$<E)rr;u]bq
+;>j>k:]F2f:&dod9D_?\8cD9V8,YpS7J0(D6hNe96%T'frs[_KFC/0O<)?@c9i+Xb:&ds09i+Y]
+:/"AV:/4MW9MJ5T9MS>U9M8#S9hnJY9h\4Z9F=Kf:/=S[:/F__:@1pL62a.K6i9@O7K5jV8,l*[
+8cD>392&&S:/=\_;,U=k<)lt#=BSg4>[CcF@:EbYAnYmnCMds.EH?5FGBnL^I=Hd!KSG8=MN!RV
+OckuqR$jG7StMgRV5L;mXKA\2Za@0M\\#Mg^VRe*`Q-'BbK\>ZdF6Uqf@\g2gtgiFi8WeXjlYai
+l0@U$mI'H3nF?)?#P7T[p%A%Qp\ssfq>^<hqu6NlrUp/@s.01?~>
+JcC<$ScA?]rr)ior;6Njs7uZh=nhX`p%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb+/WMcVhU7n0LS!fY0P`h/iEefF?Uq++L]Y2#W^@o>5_#(qJ
+_Z%IJ`::hH`rF$X`;[aU`;ddV`;[@K]_]8>\cfXV]">TO]_&l;^AP\>^@]25^@]/A^qmkb_Z.OP
+`&3pNS"6.DTqnN_W2co"Xfnt7ZaI6O\[oGd^;%J#_o0O6a2lBGbKS5Vcd:(edaQ[peCE+#rR_&$
+o@a,qrR_)#s4.+us3gtrrm>c5cd'h\c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP_\$i`Q['R*E
+Yct=6Xf\\*Wi;qpVl$;dUnXQVTV%gISXZ+;R@'A.QBd\uP*1rhO,o<\N/NRMM26qAL4t;5K7\Z)
+IsufoI!^0cH$FOWG'3e+$$1-,EH#i6DJa4hCDCSuBP;$jAn>Oa@q/tW@:3JM?X@&Er`oJ-!*]A)
+s&]8&rDiu"<)ifp!`DlmrD<Jhs%`Jds%NDbr(?oZr^ciTrC6]RogJRBog8.6JcF=$#5S;lj4rAB
+rm`aPda?Rnd*L"_bg+GTbK7lG`l#^4_SO%&_8*n&^:_%g\@T5`]=,)S['[-EZ*_$M[dCQp62a.K
+6i9@O7K5jV8,l*[8cD>392&&S:/=\_;,U=k<*!%$=BSg4>[CcF@:EbYAnYmnCMds.EH?5FGBnL^
+I=Hd!KSG8=MN!RVOckuqR$jG7StMgRV5L;mXKA_3Za@0N\\#Mg^VRe*`Q-'BbK\>ZdF6Urf@\g3
+gtgiFiSrnYjlYajl0@U$mI'H3nF?)?!V>s_o`Fj]p\ssfq>^<hqu6NlrUp/@s.01?~>
+JcC<$ScA?]rr)ior;6Njs7uZh;tp"Zp%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb+/WMcVhU7n0LS!fY0P`h/i@W-:4JGtN(NW+t(O8G%4Oo:IB
+PP11>PPL@DOcklioTK9>rfd>GpQGTArK[>Gr0-<.mZm^7qiq/GrKT7-R[]k>TV80XVl6VrXKA\1
+ZEpsI\@K2`]Y;.r_Sa=2`lH0BbKJ,ScHjkbdF-LmeC<%!f)=5"f^meqf_sG%f)O;"eGmttdf.X7
+d*L"_c-=JUbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\@8oT[C!9HZEUR:Y-"h-X/`.tVl-DgUnj`Y
+TqJ$LSt2@?R[KP1Q^3o$PEM)kOH5H_NJrdQM2@%DL5(D8K7ec,J:E#rI=-BfH?jaZGBS-.F:!#/
+EH,r9DJj<-rbE6`BkV0mAnGUcA7K+Y@UWYP?XI,G?2e+/>6%k+=oVS(=8c/$<E)rr;Z]io;>j>j
+:]F2f:&dod9DhE\8cD9V8,YpT7J0(D6hNe86%T'grtFnF\@],HTV.mKSt)=?R[]b7R$mo?!LB#M
+PlHmGP5gU^O,f6ZNf8sVNJraRN/NUOLkgeBLPU_BMM[/VM=Nt26N':L7/fXT7fGpX8,u6\8q0K-
+9heAY:f("e;c?Xr<``C+>$P<=?XR;OA7]@dBkhF#DK'T:FEVkRH@1-jJ:`H/LP^nINfT<cQ'Rf*
+S"6.DU84W`WN*&%Yd(OA[^`l[]Y;.s_SjF6aND]NcHstfeCN7(g=tE=hVdAPj5f=akNV6rlg4$,
+n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;HTerdk*?s*t~>
+JcC<$ScA?]rr)ior;6Njs7uZh<;6+[p%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb+/WMcVhU7n0LS!fY0P`h/i5t":78l#:[nkSdPqb[5gr_NVk
+;#3u_:Amug;#*le:B"&]<WH5#<q]Vp<rH+t=Su7u=Su8"=R]Df=T)>"=S>hp=>cJ7S"6.DTqnN_
+W2co"Xfnt7ZaI6O\[oGd^;%J#_o0O6a2lBGbKS5Vcd:(edaQ[peCE+#rR_&$o@a,qrR_)#s4.+u
+s3gtrrm>c5cd'h\c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP_\$i`Q['R*EYct=6Xf\\*Wi;qp
+Vl$;dUnXQVTV%gISXZ+;R@'A.QBd\uP*1rhO,o<\N/NRMM26qAL4t;5K7\Z)IsufoI!^0cH$FOW
+G'3e+$$1-,EH#i6DJa4hCDCSuBP;$jAn>Oa@q/tW@:3JM?X@&Er`oJ-!*]A)s&]8&rDiu"<)ifp
+!`DlmrD<Jhs%`Jds%NDbr(?oZr^ciTrC6]RogJRBog8.6JcFF'$ate'>Zb'*;bp.`:]=)n9i"M\
+:JFX`9dEM0:/+DW:J=DW9hJ&P9M\AW:JFMU92&#P:/"DY9heAY:esjR;=[$O6N':L7/fXT7fGpX
+8,u6\8q0K-9heAY:f("e;c?Xr<``C+>$P<=?XR;OA7]@dBkhF#DK'T:FEVkRH@1-jJ:`H/LP^nI
+NfT<cQ'Rf*S"6.DU84W`WN*&%Yd(OA[^`l[]Y;.s_SjF6aND]NcHstfeCN7(g=tE=hVdAPj5f=a
+kNV6rlg4$,n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;HTerdk*?s*t~>
+JcC<$ScA?]rr)ior;6Njs7uZhs7]Icp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n3MS!o_1Q'.8jDh`k,V6.T5]`#MD^A,J7_"tkK
+_Sa:c`:CnH`rF$X`;[^U`;[aU_uR^S]DfJ>])]GA]DoGB]DT>4]`>_D^%f>:^[]&1^B)-dqniBN
+s26a]R[]k?Tq\?ZVl6VrXfen5ZEpsI\@K2`]t_=u_Sa@3a2lBFbKS5VcHjkbdF-LneCE.$rn%2&
+rn6krrn7;'rn%2$s4.+u!RoKrd=9NhcHa\Zbfe2PaiMQD`l5p8_ns:,^q[Xu]tCtg\[f5Z[^NTN
+Za-j?Yck43XfSP&WMl_mVPU)`U7n9RT:VUDS"#k7R$a5*Q'@JqP*(ieO,]*WMi*@JLkg_>KnP)1
+JUi9#IXQWlH[:!`G^"@TF`__HEcQ/>E,TW3D/B2e$>O9gBP1phAS#C^raH+@?sm>K?=$q:>QS,5
+>5h\)=9)G%<rZ2"<;ohr;ZBVm;#a>j:Amod9`@]_9)V?\8GPdS7f5^I7/0.B6Ld?ms4I>Xr:T@6
+f\"d(da\9E(=U[XcHaYWbfn>UaN)<>_SX.*^q[Y#rkK5^]Xk\a\[f>a[^<KM['HsA[CEZRm^MaQ
+r'L?Lr'^NQs$luXs%!,]r^qZ59MJ5V:Jakb;H$Ln<`W:)=^#'8?=.)K@Us%^BPD6tD/O<4F*)SL
+H$XjdIt30)L51VCN/is]PEhH$R[]k>Tq\?ZVl?\tY->1;['mKT]=bkm_8F73aN;WLcHaeae'ut#
+f\5*8h;@/LioB+^k3)!nlKdg(mdKW6nac5OoCW%T!quB_rqQNhs8)Zjrqucoo_sFASc=3~>
+JcC<$ScA?]rr)ior;6Njs7uZhs7]Icp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n3MS!o_1Q'.8j?uBn,Ita!\NW+t)O8=t3OoCOC
+PP11=PP1.@OckjpP5pjAPQ$gFQ2[$GPNJ,'Q1gI:Pr+ksS"61FU84W`W2co#Y->1:ZaI6O\[oGe
+^V@V%_o9U8aN;TJbg"GYcd:(edaQ^qe^i=NfDjM&g%*krg&BY'fDjG%ec+&!e'e6CJ'cNecHXVX
+bKJ&MaN2EA`Pod5_SX.)^V@Lr]Xtbc\[],W[^EKKZE^X<YHG"0XK&;"W2HPjV50l\TqS-OSt2C@
+S!ob4R$X)'P`q8nOcYWbNJrgSMM[1GLPCP;KS+l-J:N,uI=6KiH?sj]GB\4QFEDSEEcH)<Df0H0
+D#S2WC2%?pB4baeARo<M@L$=L?sd8I?=!P8!aAi3r`T8'!*B/#s&K(ur_rhps&&_ks%iVhrD!8b
+r_*/]rCQuZq+(BQr'g6Gpd=^@nNha+gA_H:_RQqRVP'NPrgagpS!oe5R@'D/Q^F)(Pa.JrOcb`e
+O,s:#!K<$:N"Lu*N/W[QMMR%DLkgeAMMd4GmYUL#r'L?Lr'^NQs$luXs%!,]r^qZ59MJ5V:Jakb
+;H$Ln<`W:)=^#'8?=.)K@Us%^BPD6tD/O<4F*)SLH$XjdIt30)L51VCN/is]PEhH$R[]k>Tq\?Z
+Vl?\tY->1;['mKT]=bkm_8F73aN;WLcHaeae'ut#f\5*8h;@/LioB+^k3)!nlKdg(mdKW6nac5O
+oCW%T!quB_rqQNhs8)Zjrqucoo_sFASc=3~>
+JcC<$ScA?]rr)ior;6Njs7uZhs7]Icp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n3MS!o_1Q'.8j6UXI892/1\:\.?Q:\mod;>a8e
+:\[]a:]=2_:B4/X<q08h=Su8!=Sc,!=R]Dd=T;J$=S>hr=>ZD6S"61FU84W`W2co#Y->1:ZaI6O
+\[oGe^V@V%_o9U8aN;TJbg"GYcd:(edaQ^qe^i=NfDjM&g%*krg&BY'fDjG%ec+&!e'e6CJ'cNe
+cHXVXbKJ&MaN2EA`Pod5_SX.)^V@Lr]Xtbc\[],W[^EKKZE^X<YHG"0XK&;"W2HPjV50l\TqS-O
+St2C@S!ob4R$X)'P`q8nOcYWbNJrgSMM[1GLPCP;KS+l-J:N,uI=6KiH?sj]GB\4QFEDSEEcH)<
+Df0H0D#S2WC2%?pB4baeARo<M@L$=L?sd8I?=!P8!aAi3r`T8'!*B/#s&K(ur_rhps&&_ks%iVh
+rD!8br_*/]rCQuZq+(BQr'g6Gpd=^@nNha+h#@`BRWW%A<`Dpk9hbL\s%WMg!`2Zfr_<Af!)EMe
+s%WVf9MGFX#Yduf9hnJY9M>@Y$VO5h9i"JX:/F\\:[V*N62X(J6i9@O7K5jV8,l*[8cD>392&&S
+:/=\_;,U=k<*!%$=]np5>[CcF@:EbYAnYmoCMds.EH?5FGBnL^I=Hd"KSG8=MN!RVOcu&rR$sM8
+StVmSV5L;mXKJe4Za@0N\\#Mg^VRh,`lQ9Fbg+M\dF6Urf@\g3gtglGiSrnYk2tjkl0@U$mI'H3
+nF?)?!V>s_o`Fj]p\ssfq>^<hqu6NmrUg)?s.01?~>
+JcC<$ScA?]rr)ior;6Njs7uZhs7]Oep%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*^:_%f\$iWKYcb+/Wi)_iU7n3MS!o_1Q'.8jCjq"nS?0K<]`#PC^@T,9_"tkK
+_Sa:b`:LtI`rF!]`5Ta8`Phbps24rU_Y^tE]_8r<]"@pRr4W-Cq7Zd?rOr'As1e*<rk89EotLUC
+^VI\__Z.M6R$sM9T:r!TV5L8lX0&P/Z*UgG[^`l[]Y2(q_8=.0`lH0Bb0/#RcHjkbdF-LneCE.$
+f@S[-g"H5Uq:kc"s4RG)rRV,%e^aZK!RoKrd07nCcHa\Yrl]0$aiMQD`l5p8_ns:,^q[Us]Y(kf
+\[f5Z[^NQLZa-j?Yck43XK/A$WMl_mV50o^U7n9RSt;LCS"#k7R$X,(Q'@JqP*(fdNfB!VMi*@J
+Lkg_=KS+o/JUi9#IXQWlH[:!`G^"@TF`__HErL%gE,TW3D/=!'C2.HrBP1rVAH?=OraH+@?sm>K
+?=$q:>QS,5>5hY+=BAT'<rZ2"<;ohr;ZBVm;#a>j:Amod9`@]_9)V?\8GPdS7f5^I7/0.A6LmEn
+s4dPZqu?3IgtC?0e,IcLdF6LicHaYWc-4DSaiDB>`50@-^qd_!^qRV!]t:ke\@K,\]!euR['[-D
+Z*h*M[dLWq62X(J6i9@P7K5jU8,l*[8cD>392&&S:/=\_;,U=k<*!%$=]np5>[CcF@U`kZAnYmo
+Ci+'/EH?5FGBnL^I=Hg#KSG8=Mi<[WOcu&rR$sM8StVmSV5L;mXKJe4Za@0N\\#Mg^V[n-`lQ9F
+bg+P]dF6Urf@\g3gtglGiSrnYk2tjkl0@X%mI'H3nF?)?!V>s_o`Fj]p\ssfq>^<hqu6NmrUg)?
+s.01?~>
+JcC<$ScA?]rr)ior;6Njs7uZhs7]Icp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*^:_%f\$iWKYcb+/Wi)_iU7n3MS!o_1Q'.8j?"n.qH\.=UNW+t:O8Y+2O8=t4
+Oo:ICPP(+<PPpXEPP^LFOckihi04/)rKRAIqNL'+rfur:q3<t-R[]n@Tq\?ZVl6VrXfen5Za@0L
+\@K5a]t_A!_SjF5a2lBFbKS5Vcd:(edaQ^qe^i='f@\a/g%sFug\TY(g&K_'f)jORec+&!e'e6C
+"jkT@cHXT4bAGDDaN2EA`Pod5_SX.)^V7Co]Xtbc\[],W[^<BIZE^X<YHG"/X/`2!W2HPiUnjc[
+TqS-NSt2C@S!ob4Q^3o%P`q8nOcPQ`NJrgSMM[1GLPCM9K7ec,J:N,uI=6KiH?sj]GB\4QFEDSE
+rc&EeDf0H0Chmg$C2%?pB4h-S!G#^>@L$=L?sd8I?=!P8!aAi3r`K;)=',B%s&K(ur_rhps&&_k
+s%iVhrD!8br_*/]rCQuZq+(BQr'g6Gpd=[?nj.j,h>\)Yc+(<iW1fiSSt2@AS"#k8RJrQZQ^F)(
+Pa%>pP5^UCNrk?$NrG%<MuS_:M2_Fl",_niM>`23MMm:HmYUL#r'L?Lr'^QRs$lrWs%!,]r^qZ5
+9MJ5V:Jakb;H$Ln<`W:)=^#'8?=.)L@Us%^BPD6uD/O<4F*)SLH$XjdIt<6*L51VDN/is]PEhH$
+R[]k>Tq\?ZVl?\tY->1;['mKT]=bkm_Sa@4aN;WLcHjkbe'ut#f\5*8h;@/LioB+^k3)!nlKmm)
+mdKW6nac5OoCW%T!quB_rqQNhs8)Zjrqucoo_sFASc=3~>
+JcC<$ScA?]rr)ior;6Njs7uZhs7]Oep%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*BnZb/hWB`59@*^:_%f\$iWKYcb+/Wi)_iU7n3MS!o_1Q'.8j6UaL785)]Q:\miQ:\moe;>sAn
+;,C*c:\dca:]=2h:B45e:]F2U<qBDj=Sc+u=SZ"u=RfJ_=S5`UR$sM9T:r!TV5L8lX0&P/Z*UgG
+[^`l[]Y2(q_8=.0`lH0Bb0/#RcHjkbdF-LneCE.$f@S[-g"H5Uq:kc"s4RG)rRV,%e^aZK!RoKr
+d07nCcHa\Yrl]0$aiMQD`l5p8_ns:,^q[Us]Y(kf\[f5Z[^NQLZa-j?Yck43XK/A$WMl_mV50o^
+U7n9RSt;LCS"#k7R$X,(Q'@JqP*(fdNfB!VMi*@JLkg_=KS+o/JUi9#IXQWlH[:!`G^"@TF`__H
+ErL%gE,TW3D/=!'C2.HrBP1rVAH?=OraH+@?sm>K?=$q:>QS,5>5hY+=BAT'<rZ2"<;ohr;ZBVm
+;#a>j:Amod9`@]_9)V?\8GPdS7f5^I7/0.A6LmEns5*br\qt'*=&r6s:JO\]:/4MX:/+P\9hnGX
+:JFV[9ht[])bipt:.e,P9hJ,S:/4MX92%uP92/,U:JFPY;#X5X;=[$N6N':L7/o^U7f>jW8,u6\
+8q0K-9heAY:f("e;c?Xr<``F,>$P<=?XR>PA7]@dBkqO%DK'T:FEVkRH@1-jJV/W1LP^qJNfT<d
+Q'Rf+S"6.EU84W`WN*&&Yd(OA[^`l[]Y;.t_o9X:aihoRcd:(geCN7(g=tE=hr*JQj5f@bkNV6r
+m-O--n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;QZerdk*?s*t~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq04^oCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7iE`59@*^:_%f\$iWKYck10Wi)_iU7n3MS!o_1Q'7>kC3G8bR\dR,]Y2#W^AYhC^A>VD
+_"tkI_Y_7I`:LtI`r3jY`l5p8rP\lW_ns:c]DoP;])oRU]D]D@^&G\@^&>VB^$<?1^&5VD^Au"D
+^]2(L_>D)._j[*eT:r!TV5L8lX0&P/Z*UgG\%&u\]Y;.r_SX71`lQ6DbKJ/UcHjncdaQ^qe^i='
+f@\a/r7_/)pY>`%r7_2(s4I>&s4.2#rmUttdf.XDd*L"_c-4ASb/qcHaN)<>`PfX1_8*h#^:h1l
+]=PP`\@8oS['R*EZ*:I8Xf\\*WiE%sVl$;dUnaZXTV%gISXc1=R[BJ/QBd`"PEM&iO,o<\N/W[P
+M2@"BL4t;5K7\Z)J:E#rI=-BfH?jaZGBS+NFE;JBEH#i7DJj<-s(_gRBk_6oB4h-S!G#^>@KBnF
+ra,_5?![G7!aAi3r`K;)=',B%s&B%urDW_os&&_ks%iYir([/as%E5]r^m&ZqFCHQr'g6Gpd=^@
+nNha+h>[`WoB>/cf$r1JdP9.tdF$:cc-+;Ub0%fG`Pod4_SO('^V7Fs^;%Cp]"5M`\[]5^[^<HK
+['HsA[CEZRm^MaQr'L?Lr'^QRs$lrWIn3.&8kM`L9MJ5V:Jakb;H$Lo<`W:)=^,-:?=.)L@Us%_
+BPD6uDJsK6F*)SLH$XjeJ:W?+L51VDN/is^PEhH$R[]k?Tq\?[Vl?\uY->1;[C3TU]=bno_Sa@4
+aN;WLcHjnce'ut#f\5*9h;@/LioB+^k32'olKmm)mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrquco
+o_sFASc=3~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq0%YoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7iE`59@*^:_%f\$iWKYck10Wi)_iU7n3MS!o_1Q'7>k>\.blH@c'Ss,Hu;rK$]5qN(K7
+s,m5@rfR/B!0d&<rfd;D!0d5ArfQN1!0Zu<s-3GHq306kqNWt-S=Z@HU84W`W2co#Y->1;['mHR
+\\#Mg^VI_'`5Ta;aND]Lc-FV\dF$CkeC<%"f%8O+f\-2VrnI2&rS.8(s4RG)rn%2$!7h(u!RoKr
+d=9NhcHa\YbKJ&MaiMQD`l5p8_SX.)^V@Lr]Y(kf\[f5Z[^EKKZa-j?Ycb+1XK/A$WMl_lV50o^
+U7n6PSt;LCS"#k6R$X,(Q'@JqOcYWbNfB!VMi*@JLPCP;KS+o/JUi9#IXQWlH[:!`G^"@TF`__H
+EcH)<Df9N2D/B5f#&7jdBP;$jrac+@A,]p<@:9(A!a]/<r`fM/>$Co.!a&N*r`9&!!*&nqs&/ko
+rD<Mis%`Jdr_3>bqb$iZrCHcTr'pTQoL/IAog817JcFX-#i`\1ZE'mrT:PqNrgO+\R$a;/Q^7W9
+s-*JGs,dYLNfT6]NfB'YN/R[o#`4LtMi3FJLPYqb"GVelLktJUnj31?rBpKNs$crWrC;?.8P)NH
+91qrQ9hnJ\:f1+h;cQk!='8[1>[:ZC?t*SUAS5[jCM[m,E,fr@G'A4XI"$TsK7nu7M2R=QO-5]l
+QC+,1SY)UMUo(&hWi`G.Z*UjH\@K5a^VI_(`Q$!@bKS8XdF$Fmf%8R.gYL]Ci8N\UjQ>Ugl07L"
+m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD;@J,~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq0%YoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7iE`59@*^:_%f\$iWKYck10Wi)_iU7n3MS!o_1Q'7>k6q0U97nNJNlqdISs&&YiqG6o^
+r(m;grD*Diq+publW+'e<`\ior)ibr!*JDcrE'&$p/q#i2O^/-T:r!TV5L8lX0&P/Z*UgG\%&u\
+]Y;.r_SX71`lQ6DbKJ/UcHjncdaQ^qe^i='f@\a/r7_/)pY>`%r7_2(s4I>&s4.2#rmUttdf.XD
+d*L"_c-4ASb/qcHaN)<>`PfX1_8*h#^:h1l]=PP`\@8oS['R*EZ*:I8Xf\\*WiE%sVl$;dUnaZX
+TV%gISXc1=R[BJ/QBd`"PEM&iO,o<\N/W[PM2@"BL4t;5K7\Z)J:E#rI=-BfH?jaZGBS+NFE;JB
+EH#i7DJj<-s(_gRBk_6oB4h-S!G#^>@KBnFra,_5?![G7!aAi3r`K;)=',B%s&B%urDW_os&&_k
+s%iYir([/as%E5]r^m&ZqFCHQr'g6Gpd=^@nNha+iVsPSSp+RF<E)gk:JOY]:JOVZ9ht[`s%WVk
+:/1[^$;=2j9M8)S8k_lNr_*Di:/4O_9*%^Zr_3Mk9heAZr_DlYnj31?rBpKNs$crWrC;?.8P)NH
+91qrQ9hnJ\:f1+h;cQk!='8[1>[:ZC?t*SUAS5[jCM[m,E,fr@G'A4XI"$TsK7nu7M2R=QO-5]l
+QC+,1SY)UMUo(&hWi`G.Z*UjH\@K5a^VI_(`Q$!@bKS8XdF$Fmf%8R.gYL]Ci8N\UjQ>Ugl07L"
+m-X6@mfi4No()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD;@J,~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq01]oCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wi2ejUS4<OS!o_1Q'7AlNc^&/P,>Ct]Y+3VrkAEGpqH^A
+rkSQMr4i?L_YqCK_u[iqoYpgLrP\cVqS`WV_ns=0`Tt/8])TD@]`5\C]_oJ?]`#P.^AknD^AktJ
+^A5PD_>M/-R[ftATq\?ZVl6VrXfen5Za@0M\[oDc^;%J#_o0O7aN;TJbg"GZd*^7heC<%"f%8O+
+g"HAYrnIG-p"fW&rnID*s4ID)rn%2$!7h(u!RoKrd<a0ccHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr
+]Y(kf\[],W[^EKKZa-j?YHG"0XK/A$W2HPjV50o^TqS-OSt;LCS!ob4R$X,(Q'@GpOcYWbNfB!V
+Mi!:HLPCP;KS+o/JUi9#IXQWlH[:!`G^"@TF`__HEcH)<DuOVXD/=!'C2*Z\!G?$DAH?=OraGn:
+@/aL7?<pk9>QS,5>5hY+=BAT'<rZ2"<;ohr;ZBVm;#a>k:Adic9`Ic_9)_E\8GPdS7f5^I7/0.B
+6Ld?ms5<n_r;Z3GgXam'e,@Z)cd:"_c-4AUb/q`E`Poa3rk\WM!5JNIs1];]]t:kd\@K/]\[SrQ
+Za@$CZ*h*M[dU]q62X(K6i0:O7K5jU7t4'$8P2TJ92&&S:/=\_;,U=l<E<.&=]ns6?!^lG@Uiq[
+B4u!pCi402EccGJG^=^bIXm!%KSG;>Mi<[XP*;/tR$sM9T:r!TVPgDoXfen5ZaI6O\\#Pi^r"".
+`lQ9Fbg+P^daQ^sf@em4h;-uHiSrnYk2tmll0@X%mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6Nm
+rUg)?s.01?~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq01]oCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wi2ejUS4<OS!o_1Q'7AlNaZgEGCbO2N/[^po8`[.s,d/>
+qiLc=rfR8Fo90*:rK7/Eq3(`>s,u]3rfZo;r0@;Hq309lr09..S=Z@HU84W`W2co#Y->1;['mHS
+]">Vh^VI_(`5Td<ai_fNc-FY^dF$CleCE.$f@S[.g&B_)g]$"$h>Z4/g\ok+f`9\(fDjD%ec+&!
+e'e6CHI1!`cHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\@8oT[C!9HZE^X;Y-"h-X/`1uVl-Dg
+UnjcZTqJ$LSt2C@R[KP1Q^3o%P`h2lOH5H_NJrgSM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]GB\4Q
+FEDSEEH,r9rb_mVChmg$C&VcHB4h-S!G#^>@KBnFra,_5?![G7!aAi3r`K;)=',B%s&K(ur_rhp
+s&&_ks%iYir([/as%E5]r^m&Zq+(BQr'g6Gpd=^@nNha+ir9S`d(6fmWM,rUS=Q.>S"#h7rKmbT
+R$Er$Pl?gIOckh*O8b.ANJrjUrehAFMMm@NMM[+DLk^_@L5LnFM!p2j62X(K6i0:O7K5jU7t4'$
+8P2TJ92&&S:/=\_;,U=l<E<.&=]ns6?!^lG@Uiq[B4u!pCi402EccGJG^=^bIXm!%KSG;>Mi<[X
+P*;/tR$sM9T:r!TVPgDoXfen5ZaI6O\\#Pi^r"".`lQ9Fbg+P^daQ^sf@em4h;-uHiSrnYk2tml
+l0@X%mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s.01?~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq0(ZoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wi2ejUS4<OS!o_1Q'7AlN^H</7ncYR:@(dI;#=&`:Adoe
+;#O/i;#*ob:A.`g<s2Q*=&rE$<rQ,!<q]Vm=PHpW=T;Is=Sc,!<]->9StD^NUnsufWiN8)Yd(OA
+[^WfY]=bkm^r""-`Q-'Ab0/#RcHjkbdF-Ooe^i='f@\d0rn@A+rnR2&rnRM-rS%;)!8.;&s4.2#
+rmUttdf.X?d*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP_\$i`Q['R*EZ*:F7Xf\\*WiE"q
+Vl$;dUnaWWTV%gISXc1<R@'A.QBd`"P*1rhO,o<\N/W[OM26qAL4t;5K7\Z)J:E#rI=-BfH?jaZ
+GBS+NFE;JBEH#jqD?XlnCMR[!rb)=FB)Z?BA7PUJ!F]C8?NOP>?2e(1>?Y50=TV],=8l8#<W?%t
+;u]bq;>j>k:]F2f:&[id9D_?\8c;3U8,YpT7J'"C6hNe96%T'rrt3)+C0jtA;c$1`:/FY[9he;U
+rD"_9:/4JX:/+GV:/4JV9hnAT92%uP:/"DY9h\/P9M8)R9heGY9hnOa:@h?];"6jL6N0@L7/o^U
+7f>i,84cBF8kVfN9heAY:f("e;cHat<`iL->?kH??XR>QA7]CeBkqO&DfKf>Fa&(VH[U?nJV/W1
+Ll%%KNf]EfQ'[l,S"?7GU84ZaWN3/(Yd(OB[^`l[]t_A"_o9X:aihoRcdC1ieCN7)g=tH>hr*JQ
+j5f@bkiq?sm-O--s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*?s*t~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq0:`oCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wi2ejUS4<OS=5h3Q'7AlNbsB"N1d5d]=bei^&Gb>^&PhE
+^\Y_H_8?/gqSWER`:_+K`r3mV`r*d_`5T[4_Sa=2`k&bU]DoP<]D]>@]Cro:^&GYE]D]D=^&>YF
+^#d!*^]2(L_>_;.R[ftATq\?ZVl6VrXfen5Za@0M\[oGe^;%M$_o9U8aN;WKbg+M[dF$CkeC<%"
+f@S[.g&B_*g]-'sh>Z40g]#q,g&K_(f)aIQrmYi7da?Ihd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#
+^:h1l]",A]\$i`Q['R*DYct=6Xf\\*Wi;qpVl$;dUS=HUTV%gISXZ+;R@'A.QBd\uP*1rhO,o<\
+N/NRMM26qAL4t;5K7\Z)J:E#rI=(s>(3t.KGBS+NFE;JBEH#i6DJa3+CMR[!rb)[PAn>OaA7K(X
+@:<RC?O'nC?!LW=>?_#/s&f;&r`9&!!*&nqs&/korD<Mis%`Jds%NDbqb$iZr^ciTr'pTQogJRB
+oKr(6JcFa0+oLopi7HK-eC)dmd*^4eccs\Wbf\&KaMu3;_SF%)^qRV_]beDt]t:ke\$roY\@AuT
+['R-GZ*C^H[^PY6nNm(>r^6QNs$crWrC;?.8P)NH92&#R9hnJ\:f1+h<)lt"=BSg3>[:ZC@:E_W
+AS5[jCM[m,EH6/DGBeF\I=?]tK8#&9M2R=ROHPfmQ^F53StD^OUo(&iX0&P/ZEpsI\@T>d^VI_(
+`Q$!@bKS8XdF-Oof%8U/gYL]Ci8N_VjlY^hl07O#m-X6@mfi4No()DErq-?dp\4[^s7u]krVQTl
+rVcBfJcD;@J,~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq0.\oCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wi2ejUS4<OS=5h3Q'7AlNaHR<EIEM$N;\b+NW>.=Nr"h6
+OSt=@OoU^<P5^[DP5gaDOogc/P5^UDP3A,.P4k+>Pl?sIPk^I=PQ6p:PQI&5Pl6gAPlHsHPl?q)
+R[ftATq\?ZVl6VrXfen5Za@0M\[oGe^;%M$_o9U8aN;WKbg+M[dF$CkeC<%"f@S[.g&B_*g]-'s
+h>Z40g]#q,g&K_(f)aIQrmYi7da?Ihd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]",A]\$i`Q
+['R*DYct=6Xf\\*Wi;qpVl$;dUS=HUTV%gISXZ+;R@'A.QBd\uP*1rhO,o<\N/NRMM26qAL4t;5
+K7\Z)J:E#rI=(s>(3t.KGBS+NFE;JBEH#i6DJa3+CMR[!rb)[PAn>OaA7K(X@:<RC?O'nC?!LW=
+>?_#/s&f;&r`9&!!*&nqs&/korD<Mis%`Jds%NDbqb$iZr^ciTr'pTQogJRBoKr(6JcFg2#NN\2
+ZE0mqT)>)oR[]_6R@'A.Q^*l$P`q;oOckffNfK2!N<kH$Mi<RQLl%&hM?&M4L^/ZkLPC\ELktMV
+nNm(>r^6QNs$crWrC;?.8P)NH92&#R9hnJ\:f1+h<)lt"=BSg3>[:ZC@:E_WAS5[jCM[m,EH6/D
+GBeF\I=?]tK8#&9M2R=ROHPfmQ^F53StD^OUo(&iX0&P/ZEpsI\@T>d^VI_(`Q$!@bKS8XdF-Oo
+f%8U/gYL]Ci8N_VjlY^hl07O#m-X6@mfi4No()DErq-?dp\4[^s7u]krVQTlrVcBfJcD;@J,~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq0+[oCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`PTI+^:_(g\$iZLYck10Wi2ejUS4<OS=5h3Q'7AlN^?-'7S6EMr(cTSnkf3Zq+gi`
+r_WPhs%rMeqbHfbqc<i$=',B%rDikup/h5qr`9)#nlGflku[[_q,]DAS=Z@HU84W`W2co#Y->1;
+['mHS]"G_j^VRe)`Pom=aihlOcHab`dF-LneCE.%f@\d0rn@D,s4m%urnRP.rn@D*s4I>&!S5g#
+e8Ea`dF$=fcd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"h\[f5Z[^NTNZa6p@Yck43XfSS'WMl_m
+VPU)`U7n9RT:VXFS"#k7R$a5+Q'@JqP*(ieO,f3YMi*@JLkg_>KnP)2Jq8H&IsufoHiA=,H$FOW
+G'.nKF)l8?E,TW3D/=$(CMIS_BFAHbAS#C_@q&nU@:9(A#@:\A>[1K;>5h\)=T;J%<rZ/"<;fbq
+;ZBVm;#a>k:Adid9`@]^9)_E]8GPdR7f5^J7/0.A6Ld?ms5s=in"Y2:>#nX#9hnG[;#X8j9a+9d
+9hnDYr_=\69MS8U:/">S9he8S8k_iN9hS5U9h\/N91qrP9heGY9hnOa:@h?];"6jL6N0@L7/o^U
+7f>i,84cBF8kViO9heAY:f("e;cHat<`iL.>?kH??X[DRA7]CeBkqO&DfKf>Fa&(VH[U?nJV/Z2
+Ll%%KO-#NgQ'[l,S=Z@HUSOcbWiN8)Yd1UC[^`o]]t_A"_o9X:aihoRcdC1jeCN7)g=tH>hr*JR
+j5oFckiq?tm-O--s6g-\nac8Bo`"Lbp@n=\q#C0iqYg<jr;HTdrdk*?s*t~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq0+[oCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iZMYck10Wi2hkUS4<OS=5h3Q'7AmNb`ljLRP0PrOha8rkA?G!l2Rc
+rkSQM!5e]Ppr)jEs2OuUs2OoS"iS<q_o9Xp`rN[L](`i:]_K,:])TDA]E#YA]`5\F]`#JA]_oJ@
+^AknH^&Yk1^AP`)^q[_%_OR3iTq\?ZVl6VrXfen5Za@0M\[oGe^;%M$_o9X9aN;WKc-FV]dF$Cl
+eCE.%f@\a/rn7G.gt_h`o\TK$s4mY/rRq>+f\$2T!S5g#e99<hdF$=ecd'h\bfe2PaiMQD`l5p8
+_ns:,^q[Xt]Y(kf\[f5Z[^NTMZa-j?Yck43XfJJ%WMl_mVPL#_U7n9RT:VUDS"#k7R$a5*Q'@Jq
+P*(ieO,]*WMi*@JLkg_>KnP)2JUi9#IXQWlH[:!`G^"@TFoHIhF)l8?E,TW3D/B2e&8GomBP1si
+AS#C_@q&nU@:9(A!FB(2>lS".>5h\)=9)G$<WZ9#<;fbq;ZBVm;#a>k:Adid9`@]^9)_E\8GYjS
+7f5^I7/0.B6Ld?ms5j7drVu3Egssp'df%SncnE_jbfn8RaiMQC`59C,_SEn"^V7Co]tM.m]XkYa
+\%9)\\%&iQZa-sEYd(UF[^PY6nNm(>r^6QNs$crWrC;?.8P)NH92&#R9hnJ\:f1+h<)lt#=BSg3
+>[:ZC@:E_XAS5[kCM[m,EH6/DGBeF\I=?]tK8#&9M2R@SOHPfmQ^F53StD^OUo(&iX0&P/ZEpsI
+\@T>d^VI_(`Q$!@bKS8XdF-Opf%8U/gYL]Ci8N_VjlY^hl07O#m-X6@mfi4No()DErq-<cp\jme
+q>^<iqu6NlrUg)?s.01?~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq0+[oCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iZMYck10Wi2hkUS4<OS=5h3Q'7AmNa?:5EI*4prJg0(qiCT8rfQZ4
+s-*ADs-*8ArfI2DrfdAFl')%.pQPT@s-<VKp65B<s-*JI!0d>FpQGTAr0-uArKI8G1R4K%T:r!T
+V5L8lX0&P/Z*UgG\%0)_]tV7t_Sa@4a2lBGbK\>Xd*^7heC<%"f@S[-g&B\,gYCT^h=TS$h>c:1
+g\oh-g"=sVf)aIQrmZ,?da?Ihcd0n^c-4ASb/q`Ga2Z*;`5BI/_8*h#]tD"i]",A]\$i`QZa6sB
+Yct=6Xf\Y(Wi;qpVl$8cUS=HUTV%gHS=?":R@'A.Q'IStP*1rhO,o9ZN/NRMM26qAL4t;5K7SQ'
+IsufoI!^0cH$FOWG'3e+$$1-,EH#i6DJa4hCCk5pBP;$kAn>OaA7K(X@:<RC?NFJ=r`oJ-!*]A)
+s&]8&rDiu"<)ifps&/korD<Mis%`Jds%NDbqb$iZrCHcTr'pTQoL/IAog817JcFp5$Mr,\]W\<.
+St):?rgWnUs-`nSrg*SK%?cp<OcYWbNK0*\NK0%uMu\b7MuSV8MMmAkM>rA:LP^b?MMd4GmtpR#
+r'LBMqaCHQs$lrWIn3.&8kM`M9MJ5V:Jakb;H$Op<``C+>$G6;?=.,M@qB4aBPM=!DJsN8FEMeP
+H@('hJ:W?,L5:\ENK90aPEhK%R[ftATqeE\VlHf"Y->4<[C3TV]Y2(q_Sa@4aN;WLcHjndeCE.%
+g"P3:h;@/Lj5]7`k32'olg4!*mf2_ZnF?)?oCW%T!VZ9dq#C0iqYg<jr;HTdrdk*?s*t~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq0+[oCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]O,^:_(g\$iZMYck10Wi2hkUS4<OS=5h3Q'7AmN^Q9(84H9IrD)]Tnkf6[q+gf_
+s%rVhs%rMeqb@2g:0$perE&u#s&]5$r)Nbtp/h8rs&]/"oN2&nku[X^r)YYDStD^NUnsufWiN8)
+Yd(OA[^WfY]Y2%o_8=+/`lH0BbKJ/UcHstddaZdsf%8O+f\-8X!o)Mcr8%#%qq_;-s4dM+!nl5Y
+rmq2%ec+'Ae'cXkd*L%`cHXSVbK@rJaN)<>`Pf[2_SO%&^V.:m]=PP`\@8oT[Bm3FZ*:I9Y-"h,
+WiE%sVl-DfUnaZXTqJ$LSXc1=R[KP1Q^*i#PEM)kOH5H^N/W[PM2@%DL5(D8K7e`*J:E#rI=-Bf
+H?jaZGBS-.F:!#/EH,r9DJj<-rbE'[BkV0mB4b^dA7T1Z@UW\Qra,\4?2e+/>6%k+=oVS(=8c/$
+<E)rr;u]bq;>j>k:]F2f:&dod9D_?\8c;3V8,PjS7J'"C6hNe96%T("s"MEQCgC.B;c$:d:/FY[
+:JOVY9MJ;W:/4S[:/+JW9he;S8ki#R9M/#P92&#O:/"C[9)qZb9a"9e9i"Ub:@h?];"6jL6N0@L
+7/o^U7f>i,84cBF8kViO9heAY:f("e;cHat='/U/>?kH??X[DRAS#LfC27X'DfKf>Fa&(VH[U?n
+JV/Z2Ll%%LO-#NgQ'[l,S=Z@HUSOcbWiN8)Yd1UC[^`o]]t_A"_o9X:aihoRcdC1je^i@*g=tH>
+hr*JRj5oFckiq?tm-O--s6g-\nac8Bo`"Lap@nO\s7u]krVQTlrVcBfJcD;@J,~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq0+[oCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^:_(g\@/cNZ*1:2Wi2hkUS4?PS=>n4Q'7AmNf8(8K9N4:rk%m:rk80BrkJHJ
+!l;ajrknHJp;R'Os2>,Z`Poj:qS`ZW_o'F3`lJ)"qmc^<pq-O<pq-I8s189Drk8'=rO_p=!58?F
+rOq=,rP/BJ/]!sKT:r!TV5L8lXKA\1ZEpsI\%0)_]t_A!_SjF5aN2NIbg"GZd*^:jeC<%Jf*9m\
+g=k<9h#6(.hXfY'hYl:1h#H..g&fs[f`'J'f%'cLJ()indEp4bcHXVXbKJ&MaN2EA`Pod5_SX+'
+^V7Co]Xtbc\[],W[C!9HZE^X<YHG"/X/`2!W2HMhUnjc[TqS-NSt2C@S!ob4Q^3o%P`q8nOcYWa
+NJrgSMM[1GLPCP:K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEcH)<DuX\UD/B2e&8GomBP1phAS#C^
+@q&nU@:9(A!FB(2>lS".>5h\)=9)G$<WZ9#<;fbq;ZBVm;#a>k:Adid9`@]^9)_E]8GPdR7f5^J
+7/0.A6Ld?ms6'D*r:9(0f$i-sda?FgdEg.ac-4ASb/hTC`Pf[0_83n#]tXHY(r!Yr]=PP^\%&oX
+\@8iQZa-pCYd(UF\$ke8n3R">rBpHMs$crWr^ZuZ!(m/^!D?,c9mBE/:f("f;cHat='/U/>?kH@
+?X[DRAS#LfC27X'DfKf>Fa&(VH[U?nJqJc3Ll%(MO-#NhQ'[l-S=Z@HUSOccWiN8*Yd1UC\%0)_
+]t_A"_o9[;b0/#ScdC1je^rF+g=tH?hr*JRj5oFdkiqBum-O--n*olHncn^Xp%A%Pp\jjgq>0sc
+qu6NlrUp/@s.'+>~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq0+[oCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^:_(g\@/cNZ*1:2Wi2hkUS4?PS=>n4Q'7AmNf7LbDg6njrf-9)!frA%rf?o;
+rfQZ4s-*ADs-*8As,m>Er0.)Bl')"-plkT>rK@5GqigrBjcfS+r0&\%StD^NUnsufWiW>+Yd1UC
+[^WfY]Y2(q_8=.0`lQ6DbKS5Vcd:(fe'umtrmqA,g"P07gYDb`rnd8(rSIM/s4mY/rn7G,f\$2T
+!S5g#e:5rqdF$=ecHa\Zbfe2PaiMQD`l5p8_ns:+^V@Lr]Y(kf\[f5Z[^EKKZa-j?Yck43XK/A$
+WMl_lV50o^U7n9RSt;LCS"#k7R$X,(Q'@JqP*(ieNfB!VMi*@JLkg_>KS+o/JUi9#IXQWlH[:!`
+G^"@TF`__HEcQ/>E,Ybo!GuZPCCk5pBP;$jAn>Oa@q/tW@:<RC?NFJ=r`oJ-!*]A)s&]8&rDiu"
+<)ifps&/korD<Mis%`Jds%NDbqb$iZr^ciTr'pTQogJRBoKr(6JcG!7#3E_3ZE'gorLEkVs-itU%
+@EKKQBd`"PEV/lO-#J&Nr=qGMi<UPMi*@IM2I1KMZ&>:LPUeAL5LhEM"$8j62a.K6i0:O7K5jV8
+,l*[8cD<_92,=ZGYV%2:f1.i<)lt#=BSg3>[:]D@:E_XAS5[kCM[m,EH6/DGBeF\I=?]uK8#&9M
+2[FTOHPinQ^F84StD^OUo()jX0&S0ZEpsJ\[oGe^VI_(`Q-'BbKS8XdF-Opf@S^0gYL`Di8N_Vj
+lYail0@U$m-X60nF?MK#4qK[p%J+RrV-HiqYL-erqu`np&9OBSH"*~>
+JcC<$SH&9]rVc`nrVQWks7uZhs7ZNerq0+[oCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^:_(g\@/cNZ*1:2Wi2hkUS4?PS=>n4Q'7AmNf6=p8k2QLr_DfU!`2ZgohbQ^
+q+gf_s%rVhs%rMeqbI,drDiGir`B&#r`8qss&S_mrDrSmrDr/apfRPt/=`<(Tq\?ZVl6VsXfnt7
+ZaI6N\[oGe^VI\&`5Ta;aND]Mc-FY^dF-LneCFQM#2%V_g=tB;rS@J0oABN'rS@M/s4dP,!nl5Y
+rmq2%ec+'Je'cXkd*L"_c-=JUbK@rJaN)<>`Pf[2_SEq$^:h1l]=PP`\@8oS['R*EZ*:I9Y-"e+
+WiE%sVl$;dUnaZXTqJ!KSXc1=R[KP0QBd`"PEM)kOH5E]N/W[PM2@%DL5(A6K7\Z)J:E#rI=-Bf
+H?jaZGBS+NFE;JCEH,r9s)%jSD#S2]C2%?pB4baeARo:\@U`bS@/aL6?=!P8s'#J,r`T8'!*B,"
+!``3!rDW_os&&_ks%iYir([2br_*,\r^m)[q+(?Pr'g9Hpd=[?nNha+li.LgWI/,X<E2mk:/=Y[
+:JO[a9a+3b9h\;Xr_4/%:/+GV9M8)S9MA)O91qrQ92&&S9M5:Ws%NGf#Ye)h9i+V]:/CIYr_W)M
+rBgHMqaCHQs$luXs%!,]r^m2a9`@b2:/=\_;,^Cm<E<1'=^#$7?!grI@Uit\B4u$qCi402EccGJ
+G^=^bIXm$&KnbD?N/`m[P*D5uR%'V;T:r$UVPpMqXfnt7ZaI9Q]"G_k^r"".a2lEHbg+P^daZh!
+f@em4h;7&IiT&t[k3(smlKdg'mI'H4nc&(`oCV_Kp@e7Zp]C9fqY^6ir;HTerdk*>s*t~>
+JcC<$SH&9]rVc`nr;6Nj!;ZTg!Vc<eohtGRo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYcY",W2HJeTqJ!IS!fV.P`h,hN,O;uNM<Jg]CW]7^&>\E^])"L
+_8?,fpVcmH"2r0u`r<pX`5V_qrP])_`Pod5_o0O6a8X-\aiOFks1&*>!4r$=rk&9F]_K,<])K>A
+]`,V?]_oD<]`,VE^AGV7^&Yk?^Abl*^mq!gTq\?ZVl?\tXfnt7ZaI6O\[oGe^VI_'`5Ta;ai_fN
+cHab`dF-Ooe^i@(f\,!4gY:N^h>c@2ht,e*hu;L2h#cBdg]#q,f`9\(f72B%eC;srda?Ihcd'h\
+bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",A\[^NTNZa6sBYck43XfSS'Wi;noVPU)aUS=HTT:VXF
+S=?"9R$a5+Q'IStP*(ieO,f3YN/NRMM26n@KnP)2Jq8H&IsufoI!^0cH$FOWG'.nKF)q8"'6%l-
+DJa3*CMITuBP;$jAn>OaA,]pB@:3JM?X@&Er`fM/>$Co.s&]8&r`9&!s&Aqq!`DlmrD<Jhs%`Jd
+s%NDbqb$iZr^ciTrC6]RoL/IAog8.6JcG$8"TJGej5'[_%+*DLd*U+bcHOJTb/jS%"iS9o_8*ha
+^Abe_^:h4m]"5D\\[T,X\@&`OZF$pAYd1[G[dU]p62a.K6i0:O7K5jV8,l*[8cD<_92,=ZGYV%2
+:f:4j<)lt#=BSg3>[:]D@:E_XAnPdlCMds-EH6/DGBeF\I=Hd!K8#&9MN!OUOHPinQ^O>5StMdP
+Uo1/kX0&S0ZEpsJ\[oGe^VI_)`Q-'BbK\>YdF-Opf@S^0gtgiEi8N_VjlYail0@U$m-X91nF?MK
+#4qK[p%J+RrV-HiqYL-erqu`np&9OBSH"*~>
+JcC<$SH&9]rVc`nr;6Nj!;ZTg!Vc<eohtGRo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYcY",W2HJeTqJ!IS!fV.P`h,hN*p@:Edre(NU`&,NW+t;O8=t;
+On+Y;Ockolr0%&Cq3(c?s-!>Erfm;Cl')+0!gAe1plkZ@r0.)D!L&c+PP^UCP;Sl%T:r!TV5L;m
+XKA\1ZEpsI\@K2`]t_A"_SjF5aN;TJbg+M[dF$CleCE.%f@\d1g=tB;rS@M1rnm>*rnm_3rS7P1
+gY;_]s4ID)rmuYNe^W*te'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\$i`Q['R*E
+Z*:F7Xf\\*WiE%rVl$;dUnaZXTV%gISXc1=R@'A.QBd`"PEM&iO,o<\N/W[PM2@%CL4t;5K7\Z)
+J:E#rI=-BfH?jaZGBS+NFE;L%E>*;0DJj<-CMR["BkV0mAnGUcA7PUJ#@V"J?XI,G?2e(1>?Y50
+=oVS(=8l8#<W?%s;Z]io;>j>j:]F2f:&dod9D_?\8cD9V8,YpT7J'"C6hNe86%T(&rs8SO]=Y8G
+U7@bORgGOOR[KS2Q^*l$rfdAEs,[>DNfT5!N<Y<"Mi*CMMZ/J4MYr;:LPCV@L51YBM!p2i62a.K
+6i0:O7K5jV8,l*[8cD<_92,=ZGYV%2:f:4j<)lt#=BSg3>[:]D@:E_XAnPdlCMds-EH6/DGBeF\
+I=Hd!K8#&9MN!OUOHPinQ^O>5StMdPUo1/kX0&S0ZEpsJ\[oGe^VI_)`Q-'BbK\>YdF-Opf@S^0
+gtgiEi8N_VjlYail0@U$m-X91nF?MK#4qK[p%J+RrV-HiqYL-erqu`np&9OBSH"*~>
+JcC<$SH&9]rVc`nr;6Nj!;ZTg!Vc<eohtGRo()>?n*f]3m-Es$l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'bXaiMK@_ns4(]Xt_a[^<BGYcY",W2HJeTqJ!IS!fV.P`h,hN'g!&84uZO:@V-X:B"&`;#3ua
+:Amrj:/=\_r(m;grD*Dir_NGeqbR)hoN(ols&f;&r`9"ur`8bp!a&N*r)WJlr)W&`rE'&$r`D%J
+StD^NUnsugWiW>+Yd1UC[^`lZ]Y2(q_SX71`lQ9EbKS8WcdC.geC<%"f@S[.g=k<9h#6(/hYuF(
+i;VX5hYl73gtUT_gAfh+f`'KPf%&:"e'lamdEp4bcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc
+\[T#U[C!9HZE^X;Y-"h-X/`2!Vl-DgUnjc[TqJ$LSt2C@S!fY2Q^3o%P`q8mOH5H_NJrgSMM[1G
+L5(D8K7ec,J:N,uI=6KiH?sj]GB\4QFEDSErc&TjDf0H0Chmg$C2%?pB4baeARo<M@L$=L?sd8I
+?=!P8!aAi3r`T8'!*B/#s&K(urDNbq;,R9gr_NPhr([2br_*,\r^m)[q+(BQr'g6Gpd=^@n3MX*
+mJe-LP&+E)<)ZUh:JO\X:/=PY9h\;W9MJ8V9MJ1Y9`n'^9hkU\$qa2d92%uN:/4JT91o1W$;F8i
+:JOVY:esk]nkoB_n3R">rBpHMs$crWr^ZuZ!(m/^!D?,c9mBE/:f(%g;cHat='/U/>?kH@?X[DR
+AS,RgC27[(DfKf>Fa&(VH[UBoJqJc3Ll..NO-#NhQ'[o.S=ZCIUSOfdWiN8*Yd1UC\%0)_]t_A"
+`5Td<b0/&TcdC1je^rF+g>(N@hr*JRj5oFdkiqBum-O-.n*olHncn^Xp%A%Pp\jjgq>0scqu6Nl
+rUp/@s.'+>~>
+JcC<$SH&9]rVc`nr;6Nj!;ZTg!Vc<eohkAQo()>?n*f]3m-O$%l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'eYaiMK@_ns4(]t:hb[^<BGYcY",W2HJfTqJ!IS!fV.P`h,hNGNrjKUJgMqRcU:qRlsE^VBc`
+s2"`PrknKKqS`QT`Pojr`<=,u`Q#pq`<jQ'`Pf[4`Q#s=rlG,]"Nn<e\[hXJs1/0@qmuj@rk8?E
+q7H[<s1@p9r4E!A!5&0AotBP&s1^5&StD^NUnsugWiW>+Yd1UC[^`l[]Y2(q_Sa=2a2lBGbK\>X
+d*^:jeC<%#f@\dUg&]s`rn[V2s53Y1rSdP0s53h4rn[V0!8IM,s4ID)rmuYNe^W*tdaHOjd*L"_
+c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=GJ^\$i`Q['R*EYct=6Xf\\*Wi;qpVl$;dUnaWWTV%gI
+SXc1<R@'A.QBd`"P*1rhO,o<\N/W[PM26qAL4t;5K7\Z)J:E#rI=-BfH?jaZGBS+NFE;L&E=[#,
+Df0H0Chmg$Bk_6oB4h-S!G#^>@KBnFra5\3!+#S/!aAi3r`K;)=',B%s&K(ur_rhps&&_kr_NPh
+r([2br_*,\r^m)[q+(?Pr'g9Hpd=[?nNha+m/I=go&el]e'lbEd/hS@rlteobfe/MaN)<=rk\WM
+!5JNI'>2#k^:h4m]=GD[\[],X\@/cNZi766Yd(UF[^P\7n3Qt=rBpKNr^HiVr^ZuZ!(m/^InNI0
+9hnJ\:f1+h;cHat='/U/>[1QA?t!MSAS,UhC27[(E,fo?Fa&(VI!pKpJqJc3M2I7OO-,TiQ'du/
+S=ZCIUSOfdWiN8*Yd1UD\%0)_]t_D#`5Td<b0/&Td*^:ke^rI,g>(N@i8EVTjQ5OekiqBum-O-.
+n*ol<o)J:bo_%nNp@nR]s7u]kr;6KkrVcEgJcD8?J,~>
+JcC<$SH&9]rVc`nr;6Nj!;ZTg!Vc<eohkAQo()>?n*f]3m-O$%l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'eYaiMK@_ns4(]t:hb[^<BGYcY",W2HJfTqJ!IS!fV.P`h,hNF$45E-[%mqMk<2qi1T8rf?o;
+rfR)@!0R,@"-Jb0PP^OCPPC:BOckn*PQ-jJQ'D*-k`c%0oTT<>q3(fCh37`#rf\t+T:r!TV5L;m
+XKA\1ZEpsI\@K5a]t_A"_o0O7aN;WKc-FV]dF-LneCE1&f\-8X!ScE/h>c@3htc4/iV;@2hu;L3
+h>c71g]#q,f`9\(f72B%eC;sqda?Ihcd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i\[f5Z[^NTN
+Za6sAYck43XfSS'WMl_mVPU)aUS4BST:VXFS=>t8R$a5+Q'ISsP*(ieO,f3YN/NRMLkg_>KnP)2
+Jq8H&IsufoI!^0cH$FOWG'.nKF)q;#%rcH*DJj<-CMR[!BkV0mB)Z?BA7PUJ!F]C8?iOF4?2e(1
+>?Y50=TV],=8l8#<W?%t;u]bq;>j>j:]F2f:&dod9D_?\8cD9V8,PjS7J0(D6hE_86%T((rs%]*
+\$E'2T)P8[S,SlVQi`\BQN!0LPQ?u1rK.#=&r_g0Mi<UQMi*IMLl$tGLl.(Hr.bK5L5(SBLktPW
+n3Qt=rBpKNr^HiVr^ZuZ!(m/^InNI09hnJ\:f1+h;cHat='/U/>[1QA?t!MSAS,UhC27[(E,fo?
+Fa&(VI!pKpJqJc3M2I7OO-,TiQ'du/S=ZCIUSOfdWiN8*Yd1UD\%0)_]t_D#`5Td<b0/&Td*^:k
+e^rI,g>(N@i8EVTjQ5OekiqBum-O-.n*ol<o)J:bo_%nNp@nR]s7u]kr;6KkrVcEgJcD8?J,~>
+JcC<$SH&9]rVc`nr;6Nj!;ZTg!Vc<eoh>#Lo()>?n*f]3m-O$%l0%3jjQ#7Xi83;Fg=b-1e^W$p
+cd'eYaiMK@_ns4(]t:hb[^<BGYcY",W2HJfTqJ!IS!fV.P`h,hNC$,68,l<[:AI]_:B"&`;#=&b
+:Amrj:/=Y^qbR5gr(d;hr_NGer(m>hpf7#gpfIDps&K)"oN1rkr`9)%q,dAmlW=$es&UjUStD^N
+UnsugWiW>+Yd1UC[^`l[]Y2(q_Sa=2a2lBGbK\>Xd*^:jeC<%#f@\dUg&]s`rn[V2s53Y1rSdP0
+s53h4rn[V0!8IM,s4ID)rmuYNe^W*tdaHOjd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=GJ^
+\$i`Q['R*EYct=6Xf\\*Wi;qpVl$;dUnaWWTV%gISXc1<R@'A.QBd`"P*1rhO,o<\N/W[PM26qA
+L4t;5K7\Z)J:E#rI=-BfH?jaZGBS+NFE;L&E=[#,Df0H0Chmg$Bk_6oB4h-S!G#^>@KBnFra5\3
+!+#S/!aAi3r`K;)=',B%s&K(ur_rhps&&_kr_NPhr([2br_*,\r^m)[q+(?Pr'g9Hpd=[?nNha+
+nGa1!Xajkb<)lgm:JO\]:/4JW9MA+W9bpAr9M8&P9h\5Q:/+DU92/)Q9MA&Q9`@Zd84uVT9Ee0e
+:/+GZr_EMhnkoE`n3Qt=rBpKNr^HiVr^ZuZ!(m/^InNI09hnJ\:f1+h;cHat='/U/>[1QA?t!MS
+AS,UhC27[(E,fo?Fa&(VI!pKpJqJc3M2I7OO-,TiQ'du/S=ZCIUSOfdWiN8*Yd1UD\%0)_]t_D#
+`5Td<b0/&Td*^:ke^rI,g>(N@i8EVTjQ5OekiqBum-O-.n*ol<o)J:bo_%nNp@nR]s7u]kr;6Kk
+rVcEgJcD8?J,~>
+JcC<$SH&9]rVc`nr;6Nj!;ZTg!Vc<eohkAQo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]t:hb[^EHHYcY",WMcSgTqJ!IS!fV.P`h,hNJhn4K9`@?oXjt4$,+'e^V@S#
+_8=(f_tV+H`='W'`Q#m9`5KX6`l@qq$c^0)`5BO4`lH0BaSs<]aoT\rrjr-?r4)d;s18-?s1J?E
+!5/!:ot:+4qRlL7q7cmB!kuFaotE5sStD^NUnsugWiW>+Yd1UC[^`l[]Y;.r_Sa@3a2lBGbK\>Y
+d*^:jeCE.%f@\d1g=tE^h#cHjhu)F1iV_^4iV_X6huDR4h>c:1g]-"-fa6<_f@JO'eC;sqrm?&=
+cd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tCtg\[f5Z[^NTNZa-j?Yck43XfSP&WMl_mVPU)`U7n9R
+T:VXFS"#k7R$a5+Q'@JqP*(ieO,f3YMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?
+E,Y_n"`8'kCMIS_BE;aXrac+@A,]p<@:9(A!a]/<r`fM/>$Co.!a&N*r`9&!s&Atrs&/korD<Jh
+s%`Jds%NDbqb$iZr^ciTr'pTQogJRBoKr(6JcG-;!pnt&rR1_ns3M2#cHa\Xbf\)La2Q$7rkT&Z
+^V7Cq]Y1ti]tM%h\Giu;\GirF['m<GZEg^=Z*_$Ln$hdPr'L?Lr'^QRs$lrWs%!,]r^qZ59MJ5V
+:Jakb;H$Ln<`W:(=^#'8?=.)K@Us%^BPD3sD/O<4F*)SLH$XjdIt3-'KnkMBN/`m\P*D6!R@B_<
+TV8-WVl6VsXfnt7['mHS]"Gbl_8=.0a2lEHc-F\`daZh!f\,!6h;7)JioB+]k3(smlKdg'mdKW6
+nac8No*+dZp%J+RrqQNhs8)Zjrqu`np&9OBSH"*~>
+JcC<$SH&9]rVc`nr;6Nj!;ZTg!Vc<eohkAQo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]t:hb[^EHHYcY",WMcSgTqJ!IS!fV.P`h,hNJh7]Dg6kjlAbh(!0?u<rfI2D
+qiU`<"-Jb0PP^OCPPC:BOckn,P6dD:Pa%GtPa.C-P2h`+PjXb7PkgO=P4k+>Pl$[APV\MpT:r!T
+V5L;mXKA\1ZEpsI\@K5a^;%J#_o9U8aN;WKc-FY^dF-Lne^i@(f\,!4gYDea!oDhlr8@M3r8RV4
+r8@V4s5*b2s4mY/s4[M+$/!k]f%/C$eC2kFd<a0ccHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Xtbc
+\[],W[^EKKZE^X<YHG"0XK&;"W2HPjV50l\TqS-OSt;LBS!ob4R$X,(P`q8nOcYWbNfB!UMM[1G
+LPCP;KS+o/JUi9#IXQWlH[:!`G^"@TF`__HEcH)<DuOVXD/=!'C2*Z\!G?$DAH?=OraGn:@/aL7
+?<pk9>QS,5>5hY+=BAT'<rZ2"<;ohr;ZBVm;#X8j:Adid9`@]^9)_E]8GPdR7f5^J7/0.A6Ld?m
+s7$$nf"J_uWM5oOrL3hVS,ScWR?s5)rfmGH&s8?=O,o<]NK&mTN/NUOMMm=IreU]4MM_7e#DS(k
+L51YBM!p2i62X(J6i9@P7K5jU8,l*[8cD>392&&S:/=\_;,U=k<*!%$=BSg4>[CcF@:EbYAnYmn
+CMds.EH?5FGBnL^I=Hd!K8#);MN!OUOckroR$jG6StMdPV5L8lXKA\1ZF%'L\[oGf^VRe*`Q-'B
+bK\>ZdF-Opf@\d1gtgiFi8WeXjlYail0@U$m-a?2nF?)?s76Edp%A%Pp\ssfq>^<hqu6NlrUp/@
+s.'+>~>
+JcC<$SH&9]rVc`nr;6Nj!;ZTg!Vc<eohkAQo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]t:hb[^EHHYcY",WMcSgTqJ!IS!fV.P`h,hNJg+l8Ol?Gl;%@Tqb[/cpeLc`
+"&;Wf;#=&g;#F)h;#X8g:'"-er_NPjs%`VopJpofrDs&$=',/to2klks&]2%q,dAmp/h8rq,dMs
+1KU0?Tq\?ZVl?\tXfnt7ZaI6O\\#Mg^VI_(`Pom=aihlPcHjkbdaQ^rf%8O+g"P07h#?+2hV[5g
+i;DR3iqq^4i;_^7hYu@2h#H./gAfh4f[na+f%&:"e'e6CHI1!`cHXSVbK@rJaN)<>`Pf[2_SO%&
+^V7Co]=PP`\@8oT[C!9GZ*:I9Y-"h-WiE%sVl-DgUnaZXTqJ$LSt2@?R[KP1Q^3o$PEM)kOH5H_
+NJrdQM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r9rb_mVChmg$C&VcHB4h-S!G#^>
+@KBnFra,_5?![G7!aAi3r`K;)=',B%s&K(ur_rhps&&_kr_NPhr([2br_*,\r^m)[q+(?Pr'g9H
+pd=[?nNha+o)B*GQuHD8<E)di9hnO`9`n-a925C\r_<Dd&5#Si92%uR9h\2Q9MA)Q9hG=X$;3u_
+8kMcN9hnDZr_<Af!DQD];?'J^62X(J6i9@P7K5jU8,l*[8cD>392&&S:/=\_;,U=k<*!%$=BSg4
+>[CcF@:EbYAnYmnCMds.EH?5FGBnL^I=Hd!K8#);MN!OUOckroR$jG6StMdPV5L8lXKA\1ZF%'L
+\[oGf^VRe*`Q-'BbK\>ZdF-Opf@\d1gtgiFi8WeXjlYail0@U$m-a?2nF?)?s76Edp%A%Pp\ssf
+q>^<hqu6NlrUp/@s.'+>~>
+JcC<$SH&9]rVc`nr;6Njs7uZh=82F^p%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcb(-WMcSgU7e*KS!fY/P`h,hNJqh/J;g;'_>:b@]DT>A^&PhH
+^BhWk_8=+-_SX4c`;@OR`;IUR_u[isqo/TT!6+rU"i\L%aN;O&aoBKabKBdorON!>r4)d;s18-?
+r4MR3pq6L9q7H^>otC@=!5/<Frk/?H^&G_G^&G_G]`,W"StD^NUnsugWiW>+Yd1UC[^`l[]Y;.r
+_Sa@4a2lEHbg"GZdF$CleCE.%f\,!4gYDea!oDhlrS[\6r8R\8qr7V6r8@V4!8d\1Ib`]4g=k65
+f[na+f%&:"e'cXkd*U+acHXSVbK@rJaN)<>`Pf[2_SO%&^:h1l]=PP`\@8oT['R*EZ*:I9Y-"e+
+WiE%sVl-DfUnaZXTqJ$LSXc1=R[KP1Q^*i#PEM)kOH5H_N/W[PM2@%DL5(D8K7ec,J:N,uI=6Ki
+s*>H+G^"@TF`__HEcH)<Df0H0D/=!'C2*Z\!G?$DAH?=OraGn:@/aL7?<pk9>QS,5>5hY+=BAT'
+<rZ2"<;ohr;ZBVm;#a>j:Amod9`@]_9)V?\8GPdS7f5^I7/0.B6LR3ks761-rq,C5f$i$oda?Ff
+d*Bn]bfe2PaN)<=_8#ubs1\NHrk&BG^:h.hrjWTM\@8uW\$`TLZEggAYd(UF\$kb7n3Qt=rBpKN
+s$crWrC6o[8P/nRInNI09hnJ\:f1+h;cHdu='8[0>[1TB?t*SUAS,UiCMRd)E,fr@G'A4XI!pKp
+JqSl6M2I7PO-,TjQC+)0SXuLJUnsufWiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=le^rI-g>(N@
+i8EVTjQ5OekiqBum-O0/n*ol<o)J:bo_%nNp@nR]s7u]kr;6KkrVcEgJcD8?J,~>
+JcC<$SH&9]rVc`nr;6Njs7uZh=82F^p%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcb(-WMcSgU7e*KS!fY/P`h,hNJq7[D/t)YOR.u,NW>.:OS=n7
+P5g[>OoU^?Oogc/P5^[FPQmD;Q'@MuQ2QjAP0]?kPl-a?P3\>2PVJc%Tq\?ZVl?\tXfnt7ZaI6O
+\\#Mg^VI_(`Q#s>b0/#RcHjncdaZdsf%8R-g=k<:rnRY4hr"Cjro*e7rT!e7ro*e5s5*h5rS;qX
+gY:H9g"G$0f@JO'eC;sqdF$=fcd'h\bfe2PaiMQD`l5p8_ns:,^q[Us]Y(kf\[f5Z[^NQLZa-j?
+Yck43XK/A$WMl_mVPL#_U7n9RT:VUDS"#k7R$a5*Q'@JqP*(ieO,f0XMi*@JLkg_>KnP)2Jq8H&
+IsufoI!bm>(3t.KGBS+NFE;JBEH#i6DJa6,CMR[!rb)=FB)Z?BA7PUJ!F]C8?NOP>?2e(1>?Y50
+=TV],=8l8#<W?%t;u]bq;>j>k:]=,f:&[ic9DhE\8cD9V8,YpT7J'"C6hNe76%T(.rs%`-\[/B7
+T)G,dR[]_6Q^F2,Q^*i#rf\OfOcYWaNK0$YN/W[RMi*FNM27"FLkpnELl$nCLPCVAL55bb!/U*#
+n3Qt=rBpKNs$crWrC6o[8P/nRInNI09hnJ\:f1+h;cHdu='8[0>[1TB?t*SUAS,UiCMRd)E,fr@
+G'A4XI!pKpJqSl6M2I7PO-,TjQC+)0SXuLJUnsufWiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=l
+e^rI-g>(N@i8EVTjQ5OekiqBum-O0/n*ol<o)J:bo_%nNp@nR]s7u]kr;6KkrVcEgJcD8?J,~>
+JcC<$SH&9]rVc`nr;6Njs7uZh=82F^p%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB_ns4(]tCnc[^EHHYcb(-WMcSgU7e*KS!fY/P`h,hNJp1m7S$-H:[CjV:]+&d:\[]`
+:]F2b:B45g:]F8k:]4&g:B45j:]F8j:]48e<VBJm=8#\p=8l=q=8u>$=8Z1r=8Q%b=8c5UStD^N
+UnsugWiW>+Yd1UC[^`l[]Y;.r_Sa@4a2lEHbg"GZdF$CleCE.%f\,!4gYDea!oDhlrS[\6r8R\8
+qr7V6r8@V4!8d\1Ib`]4g=k65f[na+f%&:"e'cXkd*U+acHXSVbK@rJaN)<>`Pf[2_SO%&^:h1l
+]=PP`\@8oT['R*EZ*:I9Y-"e+WiE%sVl-DfUnaZXTqJ$LSXc1=R[KP1Q^*i#PEM)kOH5H_N/W[P
+M2@%DL5(D8K7ec,J:N,uI=6Kis*>H+G^"@TF`__HEcH)<Df0H0D/=!'C2*Z\!G?$DAH?=OraGn:
+@/aL7?<pk9>QS,5>5hY+=BAT'<rZ2"<;ohr;ZBVm;#a>j:Amod9`@]_9)V?\8GPdS7f5^I7/0.B
+6LR3ks7ZI-os0*Y>#n[%:/FY\:esh\9hS/S:/:d_s%EDcrCR/`92/.Z9*e6c9hS&M9he:Z8e+Nh
+9MJ8X:JFP[:JOY\;"@K`;"-dK6N':L7/o^U7f>gY84cDP8q0K-9heAY:f("e;c?Xr<``F,>$P<=
+?XR>PA7]@dBkqL$DK'T:FEVkRH@1-jJ:`H/LP^nINfT<cQ'Rf*S"6.DTqnN_W2cr$YHbF@[^WfZ
+]Y;.s_SjF6aND]NcHstfeCE1'g=k?<hVd>Oj5f=akNM0qlg4!+n*fc9o()hP"n_K\p@e7[q#C0i
+qY^6ir;HTerdk*>s*t~>
+JcC<$SH&9]rVc`nr;6Njs7uZh#5@ibp%@tKrpieRnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WMcSgU7n0LS!fY0P`h/iNJq\$Itj;h]D/u9]DT>A]`Pp_
+_#D1J_>qLL`;@OR`;R[S`;ddV`r*gU`rF$X`"0i,`lH0BaN;THb0%oMbKTjorON!>r4)d;s18-?
+!5.d4p:U@8!5&!<ot:LB]tM(mqRupCs1SHH35)u=T:r!TV5L;mXKA\1ZEpsI\@K5a^;%M$_o9X9
+aND]McHaeadF6Upf%8O+g"P07gtgfChV\=jro*n:o&K].s5Eq7s53k5rnW(ZgY:H9g"G$0f@JL&
+eC;sqdF$=ecHa\Zbfe2PaiMQD`l5p7_SX.)^V@Lr]Y(kf\[f5Y[^EKKZa-j?Yck12XK/A$WMl_l
+V50o^U7n9RSt;LCS"#k7R$X,(Q'@JqP*(ieNfB!VMi*@JLkg_>KnP)2JUi9#IXQWlH[9uSH$FOW
+G'8"MFE;JBEH#i6DJa3+CMR[!rb)[PAn>OaA7K(X@:<RC?O'nC?!LW=>?_#/s&f;&r`9&!!*&nq
+s&/korD<Mis%`Jdr_3>bqb$iZrCH`SrC6]RoL/IAog8+5JcG?A$L6[*e'cXldF$=erlu)"b0.uM
+aMu3:_8*k&^V7Cqrk'/]]">Vd\%&rW\[T)X\$`QLZa$gAYd(LA[^PY6mm6k<rBpKNs$crWrC;?.
+8P)NH91qrQ9hnJ\:f1+h;cQk!='8[1>[1TB?t*SUAS,UiCM[j*E,fr@G'A4XI!pKpK7nu7M2I7P
+O-,TjQC+)0SXuLKUnsugWiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8EVTjQ5Oe
+kiqBum-X6@mgJXTo()DEo_%nNp@nR]s7u]kr;6KkrVcEgJcD8?J,~>
+JcC<$SH&9]rVc`nr;6Njs7uZh#5@ibp%@tKrpibQnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WMcSgU7n0LS!fY0P`h/iNJq1VCiOcRm#D%*!0?u<pQ>?9
+s,m)>!0d/?!KiQDPQ-mHQ2d*JPlR'GOnt6mPPp[CPQ-mFPPC=<P5pd;P;nejPb4YDUnsugWiW>+
+Yd1UC[^`l[]Y;.s_Sa@4a2lEHbg+M\dF$FmeCN7'f\,!4gYCW@hVR/hi;V^8ipu..irA!9i;_^7
+hYu>\gtUT;g=b03f@SU(e^W*tda?Ihcd'h\c-4ASb/q`Ga2Z*;_ns:,^q[Xu]tD"i]",A][^NTN
+Za6sBYct=5XfSS'Wi;qpVPU)aUS=HUTUqaGS=?":R@'>,Q'IStP*1rhO,f3YN/NRMM26qAL4t;5
+K7SQ'IsufoI!^0c(O:7LGBS.PFEDSEEH,r9DJj<-Chmg$C&VcRB4b^dA7T1Z@UW\Qra,n:?!U]?
+>?b;1=oVV(=8l8#<<-"s;u]bq;>j>k:]F2f:&[id9D_?\8c;3U8,YpT7J'"C6hNe76%T(1rs8GJ
+]t(5AU7IhQRLtsTR$X2-Q^3o$Q'.;mOH>Narf.8DN/`aSMi*FNre^T0"H&"lLPYqb#)J"gLl."E
+mtpL!r'L?Lr'^QRs$lrWIn3.&8kM`L9MJ5V:Jakb;H$Lo<`W:)=^,-9?=.)L@Us%^BPD6uD/O<4
+F*)SLH$XjdIt30)L51VCN/is]P*M?#R@Bb=TVA6YVl?\tXfo"9['mHS]=bkm_8=.0a2lEHc-F\`
+e'uq"f\5'7h;7)JioB+]k3(smlKdg(mf2_`nF?)?oCV\Jp%J+RrqQNhs8)Zjrqu`np&9OBSH"*~>
+JcC<$SH&9]rVc`nr;6Njs7uZh#5@ibp%@tKrpiVMnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WMcSgU7n0LS!fY0P`h/iNJp7pr^Z9Ls%iSis%i;_qbR5e
+peLldr(m>hr_NJfs%`\m:J^sdrD*Diqc*;ip/_/opf@AqrE/hrrDio"qcNYqs&T/$!*8Gfr`D%M
+Tq\?ZVl?\tXfnt7ZaI6O\\#Mg^VRe)`Q#s>b0/#ScHstde'umuf@S[.g=k<:h;-rEhu;R5iW%p.
+j8J!;iVh^7huDR4h1+57gY1B7g"=p.f%&=#eC2jndEp4bcHXVXbKJ&MaN2EA`Poa3_SO%&^V7Co
+]Xtbc\[])V[C!9HZE^X<YH=q.X/`2!W2HMhUnjc[TqS-NSt2C@S!ob4Q^3o%P`q8nOcYWaNJrgS
+MM[1GLPCP;KS+o.J:N,uI=6KiH?pBQG^"@TG'.nKF)l8?E,TW3D/=$(CMIS_BFAHbAS#C_@q&nU
+@:9(A#@:\A>[1K;>5h\)=T;J%<rZ/"<;fbq;ZBVm;#a>k:Adic9`Ic_9)_E\8GPdS7f5^I7/0.B
+6LR3ks7lTuaH(.C=B/?":^Tup:/"AW92/)S:Amm&9MJ2Q8PDcL92/)P9M8)P9h\2O9he=\8cVN`
+9`Ifj:JOVY:J^sbs%r8`!)W,Mr'L?Lr'^QRs$lrWIn3.&8kM`L9MJ5V:Jakb;H$Lo<`W:)=^,-9
+?=.)L@Us%^BPD6uD/O<4F*)SLH$XjdIt30)L51VCN/is]P*M?#R@Bb=TVA6YVl?\tXfo"9['mHS
+]=bkm_8=.0a2lEHc-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg(mf2_`nF?)?oCV\Jp%J+RrqQNh
+s8)Zjrqu`np&9OBSH"*~>
+JcC<$SH&6\rr)ior;6Njs7uZh=SMO_p%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb+/WMcVhU7n0LS!fY0Q'.8jNJqUrItX)a[CQ"Br4E!A!kl@a
+rk\NL!5nWNr5JZR"3&3t`W!dY`Q#m9`;[aU`W4!W`!"'!a2l@$aoBN]bPo`^\bs#=\c'&<\c98(
+]D9,=]DoGB]D0&%]`>eG]eR77T:r!TV5L8lXKA\1ZEpsI\@K5a^;%M$_o9X:aND]McHaeadaQ^r
+f%8O,g=k<:rnRV3hu;R6iW%p3irJ07j8S'<iVqd8huDR4h#Z<crn7S0f\"g-f%'cLJ()indEp4b
+cHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\@8oT[C!9HZE^X;Y-"h-X/`2!Vl-DgUnjc[TqJ$L
+St2C@S!o_3Q^3o%P`q8nOH5H_NJrgSMM[1GLPCP:K7ec,J:N,uI=6KiH?sj]GB\4QFEDSFEcH)<
+DuX\UD/B2e&8GomBP1siAS#C^@q&nU@:9(A!FB(2>lS".>5h\)=T;J%<rZ/"<;fbq;ZBVm;#a>k
+:Adic9`Ic_9)_E\8GPdS7f5^I7/0.A6L[9ls7cO!rUAq-f?r!mdJ_B"cHOSWaNDZGa2Gm3_#D(Z
+^:M"i\\>Ye]">M^\%/uXrO30B['[0EZa-g?Z*Uq,[dQN[6N0@L7/o^U7f>i,84cBF8kVfN9heAY
+:f("e;c?[s<`iL->?kH??XR>PA7]CeBkqO&DK'T:FEVkRH@1-kJV/W1LP^qJNfT<dQ'Rf+S"6.E
+U84W`WN*&%Yd(OA[^`l[]Y;.s_SjI8aihlPcHstfeCN7(g=tE=hVdAPj5f=akNV6rlg4$,s6g?b
+nac8Bo^qhLp@n=\q#C0iqY^6ir;HTerdk*>s*t~>
+JcC<$SH&6\rr)ior;6Njs7uZh=82F^p%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb+/WMcVhU7n0LS!fY0Q'.8jNJq+QC2\BKMX?B(NfX$upQ>B:
+rfI5EOo(:APOt%:P5pjGQ2d*JQ2[$EOnk0uPPgUAPQ$a=PPUI-P:rQ%U84W`W2cr$YHY==[C3TU
+]=bkm_8=+/`lQ6DbKS8Wd*^:jeCE.%f@em3gYDea!T)`5i;_d9iqMI5jS.^6irA!:i;_^7hYu=3
+gtVh^#2.Y]f@SU(rmZGHda?Ihcd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",>[[^NTNZa6sB
+Yck43XfSS'Wi;noVPU)aUS=HTT:VXFS=?":R$a5+Q'IStP*1ofO,f3YN/NRMM26qAL4k23Jq8H&
+IsufoI!^0cH$FOWG'.nKF)uAAEH#jrD?4TjrbE'[BkV0mB4b^dA7K+Y@UW\Qra,\4?2e+/>6%k+
+=oVV(=8l8#<<-"s;u]bq;>j>k:]F2f:&[id9D_?\8c;3U8,YpT7J'"C6hE_76%T(3rse&/\Zr-1
+T:;==R@'D1rKmSNrfmVNPEM&irf@)>rJgi8(lXB0MMm=HLkpqDMMR+FLkgb?LPU_@M2CVUmm6k<
+r^6QNs$crWrC;?.8P)NH91qrQ9hnJ\:f1+h;cQk!=BSd2>[:ZC?t*SUAS5[jCM[m+E,fr@G'A4X
+I!pNrK7nu7M2R=QO-,WkQC+,1SXuOLUnsugWiW>,Z*UgG\@K5a^;%M$`5]m?bKJ/Ud*^=lf%8R.
+gYCWAi8N\UjQ5Oel07L!m-X6@mgJXTo()DEo_%nNp\4[^s7u]kr;6KkrVcEgJcD8?J,~>
+JcC<$SH&6\rr)ior;6Njs7uZh=82F^p%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe[^EHIYcb+/WMcVhU7n0LS!fY0Q'.8jNJp7m77Ka;9^PRT:]4,i:\@K\
+:]=)i:JUd_!)WPgs%r\jrD*Ags%i\krD<Jhr_WDip/Uohr)`_qrE&r"p/h8p!*AtuqH!c"='&Mj
+="maKTq\?ZVl6VsXfnt7ZaI6O\\#Mg^VRe)`Q$!?b0/#ScHstee'uq!f@S^0g=tE^h#ZBiro!h8
+s5Ne5!9En7ro3t:ro!h6s5*b2!SlH/g'66_f[na+ec+'Je'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/
+_8*h#^:h1l]=PP_\$i`Q['R*EZ*:F7Xf\\*WiE%rVl$;dUnaZXTV%gISXc1=R[BJ/QBd`"PEM)j
+O,o<\N/W[PM2@%DL5(A6K7\Z)J:E#rI=-BfH?jaZGBS+NFE;MDEH,r9s)%jSD#S2]C2%?pB4kgf
+ARo:\@U`bS@/aL6?=!P8s'#J,r`T8's&]2#s&B%urDW_os&&_ks%iYir([/as%E5]r^m&Zq+(BQ
+r'g6Gpd=[?n3MX*qu6onY'XV\<)lor:B=3br_EJd!DQ>g:&dm+9h\/P8PD`L9MJ,P9MJ8T91h`J
+9he8R8P;`Nr_<Df##.if:JX_\mna![mm6k<r^6QNs$crWrC;?.8P)NH91qrQ9hnJ\:f1+h;cQk!
+=BSd2>[:ZC?t*SUAS5[jCM[m+E,fr@G'A4XI!pNrK7nu7M2R=QO-,WkQC+,1SXuOLUnsugWiW>,
+Z*UgG\@K5a^;%M$`5]m?bKJ/Ud*^=lf%8R.gYCWAi8N\UjQ5Oel07L!m-X6@mgJXTo()DEo_%nN
+p\4[^s7u]kr;6KkrVcEgJcD8?J,~>
+JcC<$SH&6\rr)ior;6Njs7uZh=SMO_p%@tKoCDJBnF,i5m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n3MS!o_1Q'.8jNf8j8Jq&`UW585>r4E!A!kl@a
+rk\WOs1ncR_o)>hrl+fRrl+iS"NAC"`Phbp!li3urknoX`lH1!aoBKabKTt/rQP)JqRZ^;"Lu"Q
+]"7gOs18-?q7?C6qRlj?rjr-ArO`-Br4E0G^:h4mr4N*Crk/BG]tF-R28$VoTq\?ZVl6VsXfnt7
+ZaI6O\\#Mg^VRe)`Q$!?b0/#Scd:(fe'uq!f@\d1g=tE=h;7&gi;_d9ir%j6jT"?=jSS!;irA!9
+hu_fmhYu=3gtVh^IbEB+f@SU(eC;srda?Ihcd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tCtg\[f5Z
+[^NTNZa6p@Yck43XfSS'WMl_mVPU)aUS4BST:VXFS=>t8R$a5+Q'IStP*(ieO,f3YN/NRMM2-h?
+KnP)2Jq8H&IsufoI!^0cH$FOW"a5$1FE;L%E<U<"DJj<-rbE'[BkV0mAnGUcA7K+Y@UW\Qra,\4
+?2e+/>6%k+=oVS(=8c2"<<-"s;u]bq;>j>k:]F2f:&[id9D_?\8c;3U8,YpT7J'"C6hE_76%T(2
+rrhQEgX+=Hd/_PlcMu)gb5TL,`lGs6_8*k$^:h+k\\#Md]"P_b\@B#W\@8rW[C!?JYd1S6YQ2'0
+\*pcn62X(K6i0:O7K5jU7t4'$8P2TJ9MA/T:/=\_;,U=l<E<.&=]ns6?!^lG@Uiq[B4u!pCi402
+EH?5FGBnL_IXm!%KSG8=Mi<[WP*;/sR$sM8T:r!TVPgDnXKJe4Za@0N\\#Mg^V[n-`lQ9Fbg+M\
+dF6Urf@\g3gtglGiSrnYk2tjkl0@U$mI(#C"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6NlrUp/@s.'+>~>
+JcC<$SH&6\rr)ior;6Njs7uZh=SMO_p%@tKoCDJBnF,i5m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n3MS!o_1Q'.8jNf8j(C2@s@KTPY^!KN6=OS+b8
+P5LI<OoU^<P5^[FPl6jIPl6mGPkgI9P4On3P4t1?P5LOAP5UREP5^[FP5gaDP5^XFP5^XFP5LLD
+Pl-_&P*;K2U84W`W2cr$YHY==[C3TU]=bkm_8=+/`lQ6DbKS8Xd*^:jeCE.%f\,!4gYCW@hV\=j
+s5F";r8[\8s5j.=qr@_9s5Eq7!oMkkrnRV1g]#oUg"=s/f@JL%eC2mpdF$=ecHa\YbKJ&MaN2EA
+`Pod5_SX.)^V@Lr]Xtbc\[],W[^EKKZa$a=YHG"0XK/A#W2HPjV50o^TqS-OSt;LCS!ob4R$X,(
+Q'@JqOcYWbNfB!VMi*@JLPCP;KS+o/JUi9#IXQWlH[:!`G^"?8G'.nKF)q8""`SBtDJa4hCCk5p
+BP;$jAn>Oa@q/tW@:<RC?NFJ=r`oJ-!*]A)s&]8&rDrqu!*&nqs&/korD<Mis%`Jdr_3>bqb$iZ
+rCH`SrC6]RoL/IAoKr%5JcGZJ&c:(k\?)U$S=5q9R[BM1R$X0=Q3EP<PEV,krf@)>s,A%XMi<RQ
+M2I4KM27"EM2-tFM26tCL5(M>L5(SBM=-2f62X(K6i0:O7K5jU7t4'$8P2TJ9MA/T:/=\_;,U=l
+<E<.&=]ns6?!^lG@Uiq[B4u!pCi402EH?5FGBnL_IXm!%KSG8=Mi<[WP*;/sR$sM8T:r!TVPgDn
+XKJe4Za@0N\\#Mg^V[n-`lQ9Fbg+M\dF6Urf@\g3gtglGiSrnYk2tjkl0@U$mI(#C"n;'Qo(2MQ
+o`Fj]p\ssfq>^<hqu6NlrUp/@s.'+>~>
+JcC<$SH&6\rr)ior;6Njs7uZh=SMO_p%@tKoCDJBnF,i5m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n3MS!o_1Q'.8jNf8i_7n,s@9i1:R!)NPis%i;_
+r_NGeq+gueqbI2grD3Ae!)NSj!)NSjrD3Ags&Jhnp/Urir)`\prE&r"pfIGqs&]"upfIJts&]5&
+r`9)#p/a&ATq\?ZVl6VsXfnt7ZaI6O\\#Mg^VRe)`Q$!?b0/#Scd:(fe'uq!f@\d1g=tE=h;7&g
+i;_d9ir%j6jT"?=jSS!;irA!9hu_fmhYu=3gtVh^IbEB+f@SU(eC;srda?Ihcd'h\bfe2PaiMQD
+`l5p8_ns:,^q[Xu]tCtg\[f5Z[^NTNZa6p@Yck43XfSS'WMl_mVPU)aUS4BST:VXFS=>t8R$a5+
+Q'IStP*(ieO,f3YN/NRMM2-h?KnP)2Jq8H&IsufoI!^0cH$FOW"a5$1FE;L%E<U<"DJj<-rbE'[
+BkV0mAnGUcA7K+Y@UW\Qra,\4?2e+/>6%k+=oVS(=8c2"<<-"s;u]bq;>j>k:]F2f:&[id9D_?\
+8c;3U8,YpT7J'"C6hE_76%T(7s#%o[DI$@F<)?@c:JO_\:/+DU9i"M[9MA)R9M7uL9MA&O9MA&O
+9MA)R91VZL9M8&N91qrPr_3Afr_<Dgs%NJgmniF<r'LBMqaCHQs$lrWIn3.&8kM`M9MJ5V:Jakb
+;H$Op<`W=*=^,-:?=.)L@q9.`BPD6uDJsN7F*)SLH$XmfJ:W?+L51VDN/is^PEhH$R[]k?Tq\?[
+Vl?\tY->1;['mKT]=bkm_Sa@4aN;WLcHaeae'ut#f\5*8h;@/LioB+^k3)!nlKdg(mf2_ZnF?)?
+oCW%T!quB_rqQNhs8)Zjrqu`np&9OBSH"*~>
+JcC<$SH&6\rr)ior;6Njs7uZh=SMO_p%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$iWKYck10Wi)_iU7n3MS!o_1Q'7>kNf8j4IX[*@VS)N3s18?G^;'Z_
+rP8ZS_o'F1_u7OQ`V[UR`W*jW_o2Pns2=oU!QN+W_umuua2n5$s2kAcbl5f_bkJ[E\cTFR\b<W6
+]D&o5]DK8@]DT8?]D9)?]tEsM!kc.Xpq8V[U84W`W2cr$YHY==[C3TU]=bkm_8=.0`lQ9EbK\>Y
+d*^:keCE1&f\,!5gtgfChr!AMiSiepj8S-1jo4?=j8\-=iVqa:hqm5hh#Z<crn7D+f`'J+f%&:"
+e'e6CJ'cNecHXSVbK@rJaN)<>`Pf[2_SO%&^:h1l]=PP`\@8oT[Bm3FZ*:I9Y-"h,WiE%sVl-Dg
+UnaZXTqJ$LSt2@?R[KP1Q^3o%PEM)kOH5H_NJrgSMM[.EL5(D8K7ec,J:N,uI=6KiH?sj]GB\4Q
+FEDSEEH,r:Df0H0D#\8TC2%BqBP1rVAH?=OraH+@?sm>K?=$q:>QS,5>5h\)=9)G$<WZ9#<;fbq
+;ZBVm;#a>k:Adic9`Ic_9)_E\8GPdS7f5^I7/0.B6LR3ks8;mRrU8h*e^2[jdEp1`bfn>UbK@rL
+a2Z*9_SX+'^:q7k]stYc]=GM`\@/oW\$rfS\$WKJYl:s.YQM2?[^Y\5mm6k<rBpHMs$crWr^ZuZ
+!(m/^!D?,c9moc4:f("f;cHat='/U/>?kH@?X[DRAS#LfC27X'DfKf>Fa&(VH[U?nJV/W1Ll%%K
+O-#NgQ'[l,S"?7GU84ZaWN3/(Yd(OB[^`l[]YD8!_o9X:aihoRcdC.heCN7(g=tE=hr*JQj5f@b
+kNV6rm-O--n*fc9o()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD8?J,~>
+JcC<$SH&6\rr)ior;6Njs7uZh=SMO_p%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$iWKYck10Wi)_iU7n3MS!o_1Q'7>kNf8j&Bkqa9Jrf\dq2>H9NfT6_
+o9'$8qiU?1!g/Y/rfdAHrKRAIrK[8EpQ=?rqNCoDqNLc=plbcBPEZ!/pQGZAPEZ!1r0'(5U84W`
+W2cr$YHY==[C3TU]=bkm_8=.0`lQ9EbK\>Yd*^:keCE1&f\,!5gtgfChr!AMiSiepj8S-1jo4?=
+j8\-=iVqa:hqm5hh#Z<crn7D+f`'J+f%&:"e'e6CJ'cNecHXSVbK@rJaN)<>`Pf[2_SO%&^:h1l
+]=PP`\@8oT[Bm3FZ*:I9Y-"h,WiE%sVl-DgUnaZXTqJ$LSt2@?R[KP1Q^3o%PEM)kOH5H_NJrgS
+MM[.EL5(D8K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r:Df0H0D#\8TC2%BqBP1rVAH?=OraH+@
+?sm>K?=$q:>QS,5>5h\)=9)G$<WZ9#<;fbq;ZBVm;#a>k:Adic9`Ic_9)_E\8GPdS7f5^I7/0.B
+6LR3ks8N$&jMn[5WMH*aRN.fbR$jA0R$X/*Q'ISuPECrfO,f3[N/`gTN/NYnM?8WjM>i;@MMR(D
+Lk^\?M2$b@M27#VM!mY-6N':K7/o^U7fGpX8,u6\8c_RYr_7f9:Jakb;c?Xq<``C+>$G6;?XI5N
+@qB4aBPM=!DJsN8FEMePH@('hJ:W?+L5:\EN/s'`PEhK%R[]n@Tq\?[Vl?`!Y->1;[C3TU]=bno
+_Sa@4aN;WLcHjnce'ut#f\5*8h;@/LioB+^k3)!nlKmm)mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6i
+r;QZerdk*>s*t~>
+JcC<$SH&6\rr)ior;6Njs7uZh<ql=]p%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$iWKYck10Wi)_iU7n3MS!o_1Q'7>kNf8i_77Tm>p.kEX!)EJgo1o9\
+qbH`Y!)WYjrD*Agr_NSjr_WPhqb[5kpJgrgpf@AqpK%5orE/ntqc3\uq,mYus&f8%rE'&$r`B/%
+r`8eq2kctAV5L8lXKA\1ZEpsI\@K5a^;%M$`5Ta;ai_fOcHjkbdaZdsf@S[.g=tE=h;7&Hi8ESQ
+ir.p:jRVF3jS\'<irA!:hu_fmhYu=3gtVh^!SQ-)f*0aUeC;sqrm?5Bcd'h\bfe2PaiMQD`l5p8
+_ns:,^q[Us]Y(kf\[f5Z[^NTMZa-j?Yck43XfJJ%WMl_mVPU)`U7n9RT:VXFS"#k7R$a5+Q'IPr
+P*(ieO,f3YN/NRMLkg_>KnP)2Jq8H&IsufoI!^0cH$FOWG'.nKF)l8?E,]`5DJa4iCBeNfBkV0m
+B)Z?BA7PUJ#@V"J?XI,G?2e(1>?Y50=oVS(=8c/$<E)rr;u]bq;>j>k:]F2f:&[id9D_?\8c;3U
+8,YpT7J'"C6hNe76%T%Cs7<F@@Tl`2;,:!d:+f799MA)R:JOVY9M8)R9M.oM8P2WK9hS,Q9M%iK
+84lTO91h`J9MJ2U9hnGX:&[rg:@:sI62X(J6i0:O7K5jV8,l*[8cD<_92,=ZI83R7:f1.i<)lt#
+=BSg3>[:]D@:E_XAS5[kCM[m,EH6/DGBeF\I=?]tK7nu8M2R=ROHPfmQ^F52StD^NUo(&hX0&P/
+Z*UjH\@K5a^VI_(`Q$!@bKS8XdF$Fmf%8R.gYCWBi8N\UjQ>Ufl07L"m-X60n*ol<o(2MQo`Fj]
+p\ssfq>^<hqu6NmrUg)?s.'+>~>
+JcC<$SH&6\rr)ior;6Njs7uZhs7]Rfp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7iE`59@*^:_%f\$iZLYck10Wi2ejUS4<OS!o_2Q'7AlNf8m3G^b@3VRH-.s18?G^;'Z_
+rPAKMrkn]Qrl+cQ!6+rU!Q2kT`;mjR`Vm^W`Q#s>rlP/^"3\p3bPBB^\G!K"\cBA7])92;]`,PA
+])TD;]^ic7]_fB#TVA6YVl6VsXfnt7ZaI6O\\#Mg^VRe*`Q$!@b0/&TcdC.heC<($f@em3gYCW@
+hV[8LiSiepj8\3>jn%X6jo4?>j8\-=iVqd8hZ2O4h#Z<crn7D+f`'KPf%&:"e'cXkd*L%`cHXSV
+bK@rJaN)<>`Pf[2_8*h#^:h1l]=PP`\@8oS['R*EZ*:I9Y-"e+WiE%sVl-DfUnaZXTqJ$LSXc1=
+R[KP1Q^3o$PEM)kOH5H_NJrdQM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEs)A'YDuOV]
+D/=!'C2%BqBP1rVAH?=OraH+@?sm>K?=$q:>QS,5>5h\)=9)G%<rZ2"<;fbq;ZBVm;#a>k:Adid
+9`@]^9)_E\8GYjS7f5^I7/0.B6LR3ks8N$%pZLMgdF%s?(sgLOb0A,Qb0%iJa2Z'8_83q%^:q4j
+]=IpQs1&iT\@8uV\@/iT[C!9EYd1R=Yd1XFm'c@Kr'L?Lr'^NQs$luXs%!,]r^m2a9`@b7:/=\_
+;H$Ln<E<1'=^#$7?!grI@Uit\B4u$qCi402EccGJG^=^bIXm!%KnbD?MiEdZP*;/tR$sP:T:r$U
+VPgDoXfen6ZaI6O\\,Vj^r"".`lQ9Fbg+P^daQ^sf@em4h;-uHiSrnYk2tmll0@X%mI'H3nF?)?
+oCW%T!quB_rqQNhs8)Zjrqucoo_sFASH"*~>
+JcC<$SH&6\rr)ior;6Njs7uZhs7]Rfp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7iE`59@*^:_%f\$iZLYck10Wi2ejUS4<OS!o_2Q'7AlNf8m%ASH%.JVs8_q2>H9NfT6_
+o9'$8qiU?1!g/Y/rfdAHrKRAIrg!>E!1!2=hNIf#s-3MH!0mJHq3(H8s-!#<rKR>G2P?e?V5L8l
+XKA\1ZEpsI\@K5a^;%M$`5Ta;ai_fOcHjnce'umuf@S^0g=tE=h;7&Ii8NYSrT!q=roNb6roO.?
+rT!q;s5Et8s5*h5rnRV1g]#n-g"?;UJ(E0"eC2jndEp4ccHa\YbKJ&MaN2EA`Pod5_SO%&^V7Co
+]Xtbc\[],W[C!9HZE^X<YHG"/X/`2!W2HPjUnjc[TqS-OSt2C@S!ob4R$X,(P`q8nOcYWbNfB!U
+MM[1GLPCP;KS+o/JUi9#IXQWlH[:!`G^"@TF`__HErU+[E,Y_n$>jTpCMIQtBP;$jrac+@A,]pB
+@:3JM?X@&Er`fM/>$Co.s&]8&r`9&!s&Aqqs&/korD<Mis%`Jds%NDbqb$iZrCHcTr'pTQoL/IA
+og8+5Jc>uIe@`/iV4X7URf8`SR/`KZQBd`"P`h/jNfX1""cSG"N/NVnM?&S5M%5>rLl$qCLkUS=
+LPCP>MX-)e62X(J6i9@O7K5jV8,l*[8cD<_92,=ZI83R7:f:4j<)lt#=BSg3>[:]D@:E_XAS5[k
+CM[m,EH6/DGBeF\I=?]tK8#&9M2R@SOHPfmQ^F53StD^OUo(&hX0&P/ZEpsI\@K8c^VI_(`Q$!@
+bKS8XdF-Lnf%8U/gYL]Ci8N\UjQ>Ugl07L"m-X60n*ol<o(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?
+s.'+>~>
+JcC<$SH&6\rr)ior;6Njs7uZhs7]Rfp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0r
+dEg+^bK7iE`59@*^:_%f\$iZLYck10Wi2ejUS4<OS!o_2Q'7AlNf8l`77Ka:9254Wq+UiarD3#[
+r_NDdmn`mWs%iJfr_NAe!`)itr)NJjqc3>j!*Aenr`B&#qH*Pps&]&!!*B/%s&\tt!*B/#qc>\K
+U84W`W2cr$YHY==[C3TU]=bkm_8=.0`lQ9EbK\>YdF$FmeCN7'g"P07gtgfChr*GOiSsgrs5a1@
+oB-&6roF%<s5O(;ro!h6!8d_2!SlH/g&]mZrmuYNe^W*tda?Ihcd0n^c-4ASb/q`Ga2Z*;`5BI.
+^q[Xu]tD"i]",A]\$i]OZa6sBYct=6XfSS'Wi;qpVl$8cUS=HUTV%gHS=?":R@'A.QBd\uP*1rh
+O,o<\N/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH?jaZGBS+NFE;L&E<1#srb`'[Chmg$Bk_6oB4h-S
+!G#^>@L$=L?sd8I?=!P8!aAi3r`T8'!*B/#s&K(urDW_os&&_ks%iYir([2br_*,\r^m&ZqFCHQ
+r'g6Gpd=^@mm2R*#KVj@>uam&;>s>j:]F0E9h\5R9M\DW9MJ8V9MA#N91_`J92&#P9hS&M91hiO
+92%oK92&)V9i"MY9hnJ[:/1+Pmm6k<rBpKNr^HiVr^ZuZ!(m/^!D?,c9moc4:f(%g;cHat='/U/
+>?kH@?X[DRAS#LfC27X'DfKf>Fa&(VH[U?nJV/Z2Ll%%LO-#NgQ'[l,S=Z@HUSOcbWN3/(Yd1UC
+[^`l\]t_A"_o9X:aihoRcdC1ieCN7)g=tH>hr*JQj5f@bkiq?sm-O--n*fc9o()DErq-?dp\4[^
+s7u]kr;6Kkrr)KgJcD8?J,~>
+JcC<$SH&6\rr)ior;6Njs7uZhs7ZNerq04^oCDJBnF,i6m-O''l0.<mjlGI\i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_(g\$iZMYck10Wi2hkUS4<OS=5h3Q'7AmNf8mQF+Ah%VQ%?'\c]RW]tXK\
+s1nZNrk\`S_ScAkrl+WMs24lT!l`*rqo&fY_o0L5a2c:#aoBN]bP06\\c92.\b*H8\[oA_p:C78
+q7Q^=s183Apq643!PH&B]`,StTqnN_W2co#YHY==[C3TU]=bkm_8=.0`lQ9FbK\>YdF$Fme^i@)
+g"P07h;-rFrnmh9ir.m;jSn9.k5XQBjSe*?io/kqi;_[7hYu=3gtVh^IbEB*f@JO'eC;sqdF$=e
+cHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f2X[^EKKZa-j?Ycb+1XK/A$WMl_lV50o^U7n9R
+St;LCS"#k7R$a2)Q'@JqP*(ieO,]*WMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FOW$$LH5FE;JB
+EH#jqD?XlnCMR[!rb)=FB)Z?BA7PUJ!F]C8?NOP>?2e(1>?Y50=TV],=8l8#<W?%t;u]bq;>j>j
+:]F2f:&dod9D_?\8cD9V8,PjS7J0(D6hE_66%T%=rpAb(eGdepci25iaq2e>bK7oJaMu09_ns7*
+^V.>[\cB8>]DoAC\[T)WrjVp9"gkVBYd(M5YQ;)>m'c=Jr'L?Lr'^NQs$luXs%!,]r^qW49MJ5V
+:/=\`;H$Ln<E<1'=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=^bIXm$&KnbD?N/`m[P*D5uR%'V;
+T:r$UVPpMqXfen6ZaI6O]"G_k^r"".`lQ9Fbg+P^daZdtf@em4h;-uHiT&t[k2tmll0I^&mI'H3
+nF?PL!V>s_o`Fj]p\ssfq>^<hqu6NmrUg)?s.'+>~>
+JcC<$SH&6\rr)ior;6Njs7uZhs7ZNerq04^oCDJBnF,i6m-O''l0.<mjlGI\i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_(g\$iZMYck10Wi2hkUS4<OS=5h3Q'7AmNf8mQ@VK_%JV0$\NVSP5N<5-$
+OS"\7P5:=<OoUX=P5gXEP5UREPl-dHPl?sEPlI!MP`h4-OT:R@OmS;6Ocklip6,E=rKI;GrfmDG
+q3(*.!0[8Ds-,4$TqnN_W2co#YHY==[C3TU]=bkm_8=.0`lQ9FbK\>YdF$Fme^i@)g"P07h;-rF
+rnmh9ir.m;jSn9.k5XQBjSe*?io/kqi;_[7hYu=3gtVh^IbEB*f@JO'eC;sqdF$=ecHa\YbKJ&M
+aN2EA`Pod5_SX.)^V@Lr]Y(kf\[f2X[^EKKZa-j?Ycb+1XK/A$WMl_lV50o^U7n9RSt;LCS"#k7
+R$a2)Q'@JqP*(ieO,]*WMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FOW$$LH5FE;JBEH#jqD?Xln
+CMR[!rb)=FB)Z?BA7PUJ!F]C8?NOP>?2e(1>?Y50=TV],=8l8#<W?%t;u]bq;>j>j:]F2f:&dod
+9D_?\8cD9V8,PjS7J0(D6hE_66%f1Ki5E1/VkT`NR[KS2R$j>/Qi33ZQ'@MsOcb`dO,f3YN/ddo
+s,%JHMi!7GM26qEMMR"BL4tD<L5(QNM!dS,6N':L7/fXT7fGpX8,u6\8q'E,9heAX:Jand;c?Xq
+<``C+>$G6;?XI5N@qB7bBPM="DJsN8FEMePH@('hJ:`E-L5:\FNK90aPa.T&S"-(BTqeE\W2co#
+Y->4<[C3TV]Y2(q_Sa@4aN;WLcHjndeC<($g"P3:h;@/Lj5]7`k32'olg4!*mdKW6nc/.\oCW%T
+!quB_rqQNhs8)Zjrqucoo_sFASH"*~>
+JcC<$SH&6\rr)ior;6Njs7uZhs7ZNerq04^oCDJBnF,i6m-O''l0.<mjlGI\i8<DIgY1?4f$r3t
+dEg+^bK7iF`PTI+^:_(g\$iZMYck10Wi2hkUS4<OS=5h3Q'7AmNf8mQ6q0^:92/4Z:AIWa:B"&]
+:B"&c:A[fe:A7Q^:B+,d;#X8e;#a;o9ikCs<rH%l<;oni<Wc?&<`Sior`B&#qH*Sqr`AJhs&],!
+r`:bHUnsufWiN8*Yd1UC[^`l[]Y;.s_SjF5aN;WKc-FY_dF6Uqf%8R-g=k<;h;7&ghuVfrrSmn=
+roNP0s5j7@rSmt=iSjdos5*h5rnRV1g]#oUg"=p.f%/C$eC2jndEp4bcHXSVbK@rJaN)<>`Pf[2
+_SO%&^V7Co]Xtbc\[T#U[C!9HZE^X<Y-"h-X/`2!W2HMhUnjc[TqS-NSt2C@S!ob4R$O#&P`q8n
+OcYWbNJrgSMM[1GLPCP;KS+o/JUi9#IXQWlH[:!`G^"?<G'.nKF)l8?E,Y_n"`8'kCMIS_BE;aX
+rac+@A,]p<@:9(A!a]/<r`fM/>$Co.!a&N*r`9&!s&Atrs&/korD<Jhs%`Jds%NDbqb$iZr^ciT
+r'pTQogJRBoKr"4L&VGHWHViU<E2mlr_=8'9hnGX9h\5T:/4JV9he;T91hiM84lMQ9*S*`8Ol?E
+:&[fs8kViO92/,U9hnJ[:ej_\mSN=;r'L?Lr'^NQs$luXs%!,]r^qW49MJ5V:/=\`;H$Ln<E<1'
+=^#$7?!grI@Uit]B4u$qD/O93EccGJG^=^bIXm$&KnbD?N/`m[P*D5uR%'V;T:r$UVPpMqXfen6
+ZaI6O]"G_k^r"".`lQ9Fbg+P^daZdtf@em4h;-uHiT&t[k2tmll0I^&mI'H3nF?PL!V>s_o`Fj]
+p\ssfq>^<hqu6NmrUg)?s.'+>~>
+JcC<$S,`0\rVc`nrVQWks7uZhs7ZNerq04^oCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R-^:_(g\$iZMYck11Wi2hkUS4<OS=>n4Q'7AmNf8mQDgm7oRA%=l])9)H]">Se
+]tV4q^qde&r5&HOo#1RG!Q;nS`;[^_`5T[5_o0O6a2l@$aoBN]bP'0Y\c0,/\b*K1\b<W5]DB2;
+]D&u:]`>_?^%o;tTqeH^W2co#YHY==[C3TU]=bkm_8=.0`lQ9FbK\>YdF$Fme^i@)g"P39h;-rF
+i8ESRir7s>jQ5M#k4Rp6k5XQCjSe*?io/kqi"4f&hVI#CgtUQ:g"G$0f@JLOe8j$ddF$=ecHa\Y
+bKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(ke\[],W[^EKKZa-j?YHG"0XK/A$WMcYkV50o^U7n6PSt;LC
+S"#k7R$X,(Q'@JqP*(ieNfB!VMi*@JLkg_>KnP)2Jq8H%IXQWlH[:!`GlDn"G'.nKF)l8?E,TW3
+D/F*)CMIS_BE;aXrac+@A,]p<@:9(A!a]/<r`fM/>$Co.!a&N*r`9&!s&Aqq!`Dlmr)!Dhs%`Jd
+s%NDbqb$iZrCH`SrC6]RoL/IAoKr%5K`;2Qo]4u^rm:\ks3:Yhao0B]a9Tc)_o'@._8-&`*P/em
+\%92_\@B)Y[^<KN[C3KM['Hp@ZEUR<[^Wd6[dHHZ6N':L7/o^U7f>jW8,u6\8q'E,9heAY:f("e
+;c?Xr<``C+>$P<=?XR;O@qB7cBPM="DK'T9FEMePH@('iJ:`E-L5:_GNK90aPa.T'S"-(CTqeE\
+W2co#YHY==[C<]X]Y2(q_Sa@4aN;WLcHjndeCE.%g"P3:hV[8Mj5]7`k32'olg4!*mdKW6nc/.\
+oCW%T!quB_rqQNhs8)]krqu`no_sFASH"*~>
+JcC<$S,`0\rVc`nrVQWks7uZhs7ZNerq04^oCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R-^:_(g\$iZMYck11Wi2hkUS4<OS=>n4Q'7AmNf8mQ?YO=rH[q1TNVSP5N<5-$
+OQqu+P5g[EOoUXDOoUXDP5gXEP5UREPk^O?PlI$KPlHmEP5gXEP4Oh.P5CC8P5UU@PQ6pAP5(4@
+P44YlTqeH^W2co#YHY==[C3TU]=bkm_8=.0`lQ9FbK\>YdF$Fme^i@)g"P39h;-rFi8ESRir7s>
+jQ5M#k4Rp6k5XQCjSe*?io/kqi"4f&hVI#CgtUQ:g"G$0f@JLOe8j$ddF$=ecHa\YbKJ&MaN2EA
+`Pod5_SX.)^V@Lr]Y(ke\[],W[^EKKZa-j?YHG"0XK/A$WMcYkV50o^U7n6PSt;LCS"#k7R$X,(
+Q'@JqP*(ieNfB!VMi*@JLkg_>KnP)2Jq8H%IXQWlH[:!`GlDn"G'.nKF)l8?E,TW3D/F*)CMIS_
+BE;aXrac+@A,]p<@:9(A!a]/<r`fM/>$Co.!a&N*r`9&!s&Aqq!`Dlmr)!Dhs%`Jds%NDbqb$iZ
+rCH`SrC6]RoL/IAoKr%5LAqVQd^l`bV4O0ER[X5Ds-NkUQ^7W9#*tL;P`_)irf8+[N/`dSMi*CM
+MM[7IM2-nCLPgnDL5(D;LP:J<Ll(JSmQpb;rBpKNs$crWrC?lY!(m/^IS3@/9hnJ\:f1+h;cHdu
+='/U/>[1TB?t!MSAS,UhC27[(E,fo?Fa&(VH[UBoJqJc3Ll..NO-#NhQ'[o.S=ZCIUSOccWiN8*
+Yd1UC\%0)_]t_A"_o9X:aihoRcdC1je^i@*g=tH?hr*JRj5oFckiq?tm-O--n*fc9s7-3^o`"Lb
+p@n=\q#C0iqYg<jr;HTdrdk*>s*t~>
+JcC<$S,`0\rVc`nrVQWks7uZhs7ZNerq01]oCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R-^:_(g\$iZMYck11Wi2hkUS4<OS=>n4Q'7AmNf8mQ6UjU<8ko1Xq+^lar_MfS
+r(m>fs%`ViqG7#as%iMgrD38d"&DZd:&@un<`N/l;ufqj<r5nj<rH,!=Sc+u<r?%e=T;J"<]$MF
+V5L8lX0&S0ZEpsI\@K5a^;%M$`5Ta;aihlPcHjnce'uq!f@\d1gYCW@hV[8LiSrkrir\<'jnn35
+kPF?@jo=E?ir\6!iVqaHhqm5Gh;$f?g=k65f[na+ec+'=e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/
+_8*h#^:h1l]=GJ^\$i`Q['R*EZ*:F7Xf\\*WiE%rVl$;dUnaZXTV%gISXc1=R[KP0QBd`"PEM)k
+OH5E]N/W[PM2@%DL5(D8K7ec,J:E#rI=-BfH?jc7G7o(AFEDSEEH,r9DJj<.Chmg$C&VcHB4h-S
+!G#^>@KBnFra,_5?![G7!aAi3r`K;)=',B%s&K(urDNbq;,R6fs%iYir([2br_*,\r^m&Zq+(BQ
+r'g6Gpd=[?n3Mj0+j#^[>ZFa":eje]:JO\\9heAV9heAW9MA/T9MA)P8PD\Q9,U>r8kDNF8PMlO
+8OlEH9MA/U:/+GY:/4MZm834:r'L?Lr'^QRs$lrWs%!,]r^qW49MJ5V:Jakb;H$Ln<`W:(=^#'8
+?=.)K@Uit]BP;-rD/O<4EccGJG^=^bIt3-'KnbD@N/`m[P*D5uR@B_<TV8-VVPpMqXfnt7ZaI9Q
+]"G_k^r"".`lQ9Fbg+P^daZguf@em4h;7&IiT&t[k2tmll0I^&mI'H3nF?PL!V>s_o`Fj]p\ssf
+q>^<iqu6NlrUg)?s.'+>~>
+JcC<$S,`0\rVc`nrVQWks7uZhs7ZNerq04^oCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^:_(g\@/cNZ*1:2Wi2hlUS4?PS=>n4Q'@GnO,T!RCO:J`PbY\c])9)H]">Se
+]tV7r^qde&r5&HOr5AWQ!lW!or5AWQqo&EO#K4Nt`5Ta:aSj6\b5BHTbl>6E\GEc-])&u4])9/A
+]XtfS]`#J:]^`]5]JH7VUo1/kX0&P/ZEpsI\@K5a^;%M$`5Ta;aihlPcHjnde'uq!f@\d1gYCW@
+hV[8LiSsjs!p&J)r9""Ap?;J<r9"%@s5a.=s5F%;rnr7_hVR)Egt^Z<g=b03f@SU(eC;srda?Ih
+cd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tCtg\[f5Z[^NTNZa6p@Yck43XfSS'WMl_mVPU)aUS4BS
+T:VXFS=?"9R$a5+Q'IStP*1ofO,f3YN/NRMM26qAL4t84Jq8H&It%EG$%.)GH?jaZGBS-.F:!#/
+EH,r9DJj<-rbE'[BkV0mB4b^dA7T1Z@UW\Qra,n:?!U]?>?b;0=TV],=8l8#<W?%t;u]bq;>j>j
+:]F2f:&dod9D_?\8cD9V8,PjS7J'"D6hE_66&,CBr9`J!eGdbuc-FVYaiVa*ap#o-a2Z$7rkS`Q
+^V.:mrji0?\[qaM"1P_G\,NfB[C!6DYd1O<Yd<Z(m6UY:rBpKNs$crWrC6o[8P/nRI7m7.9hnJ\
+:f1+h;cHdu='8[0>[1TB?t!MTAS,UiC27[(E,fr@G'A4XI!pKpJqJc3M2I7OO-,TiQ'du/S=ZCI
+USOfdWiN8*Yd1UD\%0)_]t_A"`5Td<b0/&TcdC1je^rF+g=tH?hr*JRj5oFdkiqBum-O--n*olH
+ncA@Srq-<cp\jjgq>0scqu6NlrUg)?s.'+>~>
+JcC<$S,`0\rVc`nrVQWks7uZhs7ZNerq04^oCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^:_(g\@/cNZ*1:2Wi2hlUS4?PS=>n4Q'@GnO,T!R?"RbgGCPPLNVSP5N<5-$
+OQqu+P5g[EOoUXAP5g[EP5^[FPk^O?Pl?sJPQ6p3On4b4Onb+;P6-u4PQ$dHPP11(P;Ao-Uo1/k
+X0&P/ZEpsI\@K5a^;%M$`5Ta;aihlPcHjnde'uq!f@\d1gYCW@hV[8LiSsjs!p&J)r9""Ap?;J<
+r9"%@s5a.=s5F%;rnr7_hVR)Egt^Z<g=b03f@SU(eC;srda?Ihcd'h\bfe2PaiMQD`l5p8_ns:,
+^q[Xu]tCtg\[f5Z[^NTNZa6p@Yck43XfSS'WMl_mVPU)aUS4BST:VXFS=?"9R$a5+Q'IStP*1of
+O,f3YN/NRMM26qAL4t84Jq8H&It%EG$%.)GH?jaZGBS-.F:!#/EH,r9DJj<-rbE'[BkV0mB4b^d
+A7T1Z@UW\Qra,n:?!U]?>?b;0=TV],=8l8#<W?%t;u]bq;>j>j:]F2f:&dod9D_?\8cD9V8,PjS
+7J'"D6hE_66&>OHhS?Y'W1fcMRf8`TQiNKNQ4K=HP`q8nOcb`cNfT-XNK!jp#E"FtMMd4HLAlu.
+M$SomKnY;;L5(QNM![M+6N':L7/o^U7f>gY84cDP8ps?+9heAY:f("e;c?Xr<``F,>$P<=?XR;O
+A7]@dBkhF#DK'T:FEVkRH@1-jJ:`E-L5CeHNK93bPa.W(S"-(CTqeE]W2co#YHY==[^WfY]Y2(q
+_SjF6aND]NcHjndeCE1&g"P3:hV[8Mj5]7`kNM0qlg4!*mdKZ8rpg*]o`"Lap@nO\!r;]hr;6Kk
+rVcBfJcD8?J,~>
+JcC<$S,`0\rVc`nrVQWks7uZhs7ZNerq04^oCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^:_(g\@/cNZ*1:2Wi2hlUS4?PS=>n4Q'@GnO,T!R6:OI98P;eV:AIWa:B"&X
+:B+&f:Adof:B+)i:A[ia:&n)d;#O2d:]aEf:B!rf=Sc)#<`N/m;ufqi<r,hk<r?#!=R]D]=T;J#
+<\pGEUo1/kX0&P/ZEpsI\@K5a^;%M$`5Ta;aihlPcHjnde'uq!f@\d1gYCW@hV[8LiSsjs!p&J)
+r9""Ap?;J<r9"%@s5a.=s5F%;rnr7_hVR)Egt^Z<g=b03f@SU(eC;srda?Ihcd'h\bfe2PaiMQD
+`l5p8_ns:,^q[Xu]tCtg\[f5Z[^NTNZa6p@Yck43XfSS'WMl_mVPU)aUS4BST:VXFS=?"9R$a5+
+Q'IStP*1ofO,f3YN/NRMM26qAL4t84Jq8H&It%EG$%.)GH?jaZGBS-.F:!#/EH,r9DJj<-rbE'[
+BkV0mB4b^dA7T1Z@UW\Qra,n:?!U]?>?b;0=TV],=8l8#<W?%t;u]bq;>j>j:]F2f:&dod9D_?\
+8cD9V8,PjS7J'"D6hE_66&P[SlD8Z4>#nX#:ea\\:/=VZ9hbO\%8T_n9MA/S9MJ/Q8kV_S9+FNd
+8k_lM84lHK9M.oJ9E%Tb:&[lj9i"S\:$kdE62X(J6i9@P7K5jU7fl4Q8cD>192&&S:/=\_;,U=k
+<*!%$=]np5>[CcF@:EbYAnYmnCMds.EH?5FGBnL^I=Hd!K8#&:MN!OUOckroR$jG6StMdPUo1/k
+X0&S0ZEq!K\[oGe^VI_)`Q-'BbK\>YdF-Opf@S^0gYL`Di8N_VjlYail0@U$m-X60nF?MK!V>s_
+o`=d\rV-HiqYL-erqu`no_sFASH"*~>
+JcC<$S,`0\rVc`nrVQWks7uZhs7ZNerq07_oCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEg+^bK7iF`P]R.^V%1h\@/cNZ*:@3Wi2hlUnOHQS=>q5Q'@GnO,]'SLj"3!NME;cq7-jD]=Y_h
+^:q@s^qfob!5eHIr5AWP!5n`Qs2>>``Pf^4_o0O6a2n5$rlY2_qof&bqof)c\Gj&/\GEc-])&u6
+](`i8]`,P;]^WW6]J61WVPpMqXfen6ZaI6O\\#Mg^VRe*`Q$!@bKJ/Ud*^:jeCE1&f\5'6gtgiE
+i8ESRro4(@jlQI'roa7Dq!%b@roa4As5j:Aro4(>iSjdo$fBgth;-l@gY1B7f`'KOf%&:"e'cXk
+d*U+acHXSVbK@rJaN)<>`Pf[2_SEq$^:h1l]=PP`\@8oT[Bm3FZ*:I9Y-"h,WiE%sVl-DgUnaZX
+TqJ$LSt2C@R[KP1Q^3o%P`q8mOH5H_NJrgSMM[1GL5(D8K7ec,J:N,uI=6KiH?sj]GB\4QFEDU(
+ErU+_E,TW3D/B2e&8GomBP1siAS#C_@q&nU@:9(A#@:\A>[1K;>5_S*=BAT'<rZ2"<;ohr;ZBVm
+;#X8j:Adid9`@]^9)_E]8GPdR7f5^I7/0.B6LR3ss!@I1jP\V8cd'bYc-FMSb/_ZH`lQ3?`P]O-
+^q[\!]t1he]=PJ_rOEBI\$`TP[^NZPZEg^=ZMq'0[C3R3[d?BY6N0@L7/o^U7f>i+84cBF8kVfN
+9heAY:f("e;c?[s<``F,>?kE>?XR>PA7]@dBkqL$DK'T:FEVkRH@1-jJ:`E.LP^nINfT<cPa7])
+S"6.DTqnN_W2cr$YHY@?[^WfY]Y;.s_SjF6aND]NcHsteeCE1'g"P6;hV[8Nj5f=akNM0qlg3s@
+mI'H4nc&(`oCV_Kp@e7Zp]C9fqY^6ir;HTerdk*=s*t~>
+JcC<$S,`0\rVc`nrVQWks7uZhs7ZNerq0=aoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEg+^bK7iF`P]R.^V%1h\@/cNZ*:@3Wi2hlUnOHQS=>q5Q'@GnO,]'SLgk"7FFSn(NK*ams,@)?
+O,s7$mZIO4rK7,Cs,m>E!0R8Ds,m>ErfdAHq3Cf@rK[DI!L&c1On4b4Ont78P5pjHPP11*P;/i.
+VPpMqXfen6ZaI6O\\#Mg^VRe*`Q$!@bKJ/Ud*^:jeCE1&f\5'6gtgiEi8ESRro4(@jlQI'roa7D
+q!%b@roa4As5j:Aro4(>iSjdo$fBgth;-l@gY1B7f`'KOf%&:"e'cXkd*U+acHXSVbK@rJaN)<>
+`Pf[2_SEq$^:h1l]=PP`\@8oT[Bm3FZ*:I9Y-"h,WiE%sVl-DgUnaZXTqJ$LSt2C@R[KP1Q^3o%
+P`q8mOH5H_NJrgSMM[1GL5(D8K7ec,J:N,uI=6KiH?sj]GB\4QFEDU(ErU+_E,TW3D/B2e&8Gom
+BP1siAS#C_@q&nU@:9(A#@:\A>[1K;>5_S*=BAT'<rZ2"<;ohr;ZBVm;#X8j:Adid9`@]^9)_E]
+8GPdR7f5^I7/0.B6LR3urs/)@[]la.T:5bIs-NeSrg+4^QB[Z!P`q5nP)t`bO,]-WMuJ\8MuSYL
+Mi*@ILkg_>LP^hBLP:D:LP:J?Ll(MTm6UY:r^6QNs$crWrC;<-8P)NH91qrQ9hnJ\:f1+h;cQk!
+='8[1>[1TB?t*SUAS,UiCMRd)E,fr@G'A4XI!pKpJqJf5M2I7PO-,TiQC+)0SXuLJUnsufWiW>+
+Yd:^F\%0)_^;%M$`5Td<b0/&Td*^:ke^rI,g>(N@hr*MSjQ5OekiqBum-FlBmdKZ8rpg9bo_%nN
+p@nO\!r;]hr;6KkrVcEgJcD5>J,~>
+JcC<$S,`0\rVc`nrVQWks7uZhs7ZNerq0=aoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEg+^bK7iF`P]R.^V%1h\@/cNZ*:@3Wi2hlUnOHQS=>q5Q'@GnO,]'SLdOR"7nZQQ:/:UZs%`Ph
+nkT*Wr_EJhrD*Ags%`Geqb@,er_NSjr_WSiq+q,g:/:d_!)EMqq,[Vu<E8fnrDiGiqGmAmpf@Gr
+nlP?`r`B)"0r(PAW2co#Y->4<[C3TU]=bkm_8=.0`lQ9FbK\>ZdF-Lne^rF*g=k<:h;7&Ii8N\p
+ir\<'jo+?@kPaW>l2BiFkPXKBjo=E@ir\6!iVqaChqm5Gh;$c>g=k64rmuVMe^W*tda?Ihd*L"_
+c-4ASb/q`Ga2Z*;`5BI/^q[Xu]tD"i]",A]\$i`QZa6sBYct=6Xf\Y(Wi;qpVl$;dUS=HUTV%gI
+SXc1<R@'A.QBd`"PEM&iO,o<\N/W[PM2@%CL4t;5K7\Z)J:E#rI=-BfH?jaZGBS+NFE@J&s)A3]
+Df0H0D#S2]C2%?pB4kgfARo=]@U`bS@/aL<?<piA>[(E9rE02(=',B%s&K(ur_rhps&&_kr_NPh
+r([2br_*,\r^m)[q+(?Pr'g6Gpd=^@mm2p4#K;R9>#\Ht;>s>j:&drm9h\8T9hnF\9`@["8kVfL
+84lNJ8P2TK91h`H8PVuP91]%Ts%NJgr_<Dg!DZAV;!gRH6N0@L7/o^U7f>i+84cBF8kVfN9heAY
+:f("e;c?[s<``F,>?kE>?XR>PA7]@dBkqL$DK'T:FEVkRH@1-jJ:`E.LP^nINfT<cPa7])S"6.D
+TqnN_W2cr$YHY@?[^WfY]Y;.s_SjF6aND]NcHsteeCE1'g"P6;hV[8Nj5f=akNM0qlg3s@mI'H4
+nc&(`oCV_Kp@e7Zp]C9fqY^6ir;HTerdk*=s*t~>
+JcC<$S,`0\rVc`nr;6Nj!;ZTg!Vc<eoi1STo()>?n*f]3m-O$%l0%3kjQ#7Xi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]tCnc[^EHHYcb(-WMcSgU7e*KS!fY/P`h,hNJr^MDgd+lR%V.h\I,p[]=bhk
+^;%Fu_#2"R_Sa:._o'@.rkn`Rs24iQ!5ncRs2>&X`Phbn"N8:!a2n8%rQ>&]r6,8fbfn?2bl5ld
+\Gj&=\GNc2\GEc-])&u8](EW6]E#S<]^EHkUSOcbWiN8)Yd(OB[^`l[]Y;.s_SjF5aN;WLc-F\`
+daQ^rf@S^0g=tH>hV[8LiSrnXjQ,G$k5XWEkj[j9kl0cDk5XQCjSn3>iW.s:huV`lrnRe6gY:H9
+g"?;UJ(E0"eC2jndEp4bcHXVXbKJ&MaN2EA`Pf[2_SO%&^V7Co]Xtbc\[],W[C!9HZE^X<YHG"/
+X/`2!W2HPjUnjc[TqS-OSt;IAS!ob4R$X,(P`q8nOcYWbNfB!VMi*@ILPCP;KS+o/JUi9#IXQWl
+H[:!`G^"@TF`__HErL%^E,TW3D/B2e&8GomBP1phAS#C^@q&nU@:9(A!FB(2>lS".>5h\)=T;J%
+<rZ2"<;ohr;ZBVm;#a>j:Adid9`@]^9)_E]8GPdR7f5^I7/94B6LR4!s#C#Rkht4Fc-FPVbg+GS
+bK.iIa2c0=`l#[1_7mXu]tM(k\\#G^\[]2\]"#2VZaI6L[^<?GYctG4YQD8B\*^Wk62a.K6i0:O
+7K5jV8,l-[8cMD392&#R9hnJ\:f1+h<)lt"=BSd2>[:ZC?t*SUAS5[jCM[m+E,fr@G'A4XI!pKq
+K7nu7M2I7PO-,TjQC+)0SXuLKUnsufWiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^=le^rI,g>(N@
+i8EVTjQ5OekiqBum-O-.n*olIo)J:bo_%nNp@nO\!r;]hr;6KkrVcEgJcD5>J,~>
+JcC<$S,`0\rVc`nr;6Nj!;ZTg!Vc<eoi:YUo()>?n*f]3m-O$%l0%3kjQ#7Xi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]tCnc[^EHHYcb(-WMcSgU7e*KS!fY/P`h,hNJr^M?>+.oH@M!8q2G?5rf7#>
+s,d&=!0H`5s-!DEs,mGGP*5g,s-!AFs-3>EqNUrDs-*MIrfm;ApQ>?7qN:B4qN:]=o98g0mZTQ(
+Uo(&iX0&P/Z*UjH\@K5a^;%M$`5Ta;aihoQcHstee'uq"f@em3gYL]Bhr*GOioB([jQ6@&s6'FG
+nEKr9roa7Bs5j:Aro=%<!9*q8!T2c5h$2ZhgY1B7f`'KPf%&:"e'cXkd*L"_c-=JUbK@rJaN)<>
+`5BI/_8*h#^:h1l]=PP`\@8oS['R*EZ*:I9Y-"e+WiE%sVl-DfUnaZXTqJ$LSt):>R[KP1Q^3o$
+PEM)kOH5H_NJrgSMM[.EL5(D8K7ec,J:N,uI=6KiH?sj]GB\4QFEDSErc&*\Df0H0D#S2]C2%?p
+B4baeARo:\@U`bS@/aL6?=!P8s'#J,r`T8's&]2#s&K(ur_rhps&&_ks%iVhr([2br_*,\r^m)[
+q+(?Pr'g6Gq*Xd@mm2s5#i*,%XJV\^R@=,C%[NKJQ^3r%QB[VtPEM)krf7VNNK&mUMi<UPMM[1I
+Mi!7FrIt</reC`4KSP>:L5:]QM![M,6N':K7/o^U7fGpX8H29]8q'E,9MJ5V:Jakb;H$Op<`W=*
+=^,-:?=.)L@Us%_BPD6uDJjE5F*)SLH$XjdIt<6*L51VCN/is]P*M?#R@Bb=TVA6YVl6VsXfo"9
+['mHS]=bkm_8=.0a2lEHc-F\`e'uq"f\,!6h;7)JioB+]k3(smlKdg'mI0N5nc/1[o*+dZp%J+R
+rV-HiqYL-erqu`np&9OBS,\!~>
+JcC<$S,`0\rVc`nr;6Nj!;ZTg!Vc<eoi:YUo()>?n*f]3m-O$%l0%3kjQ#7Xi83;Fg=k32e^W$p
+d*BnZb/hTA_ns4(]tCnc[^EHHYcb(-WMcSgU7e*KS!fY/P`h,hNJr^M6:4758PW&Vq+^lar_N2^
+q+^WZs%iYir(m2bs%iJfr_N>d!`)Qdr_3Gh:J^Ua!`i<$qGd>lo2b]fr)WSorDrMko2tol2P[(F
+VlHf"Y->1;[C3TU]=bkm_8=.0`lQ9Fbg"G[dF-Lne^rF+g=k<;h;7&Ii8N\Uj5f:_rT=.Cs6/t:
+roj@ErT=.As5a1>s5F%;rnmh7hYu=8gtUT;g=b-Xf72B%eC;sqdF$=ecHa\Zbfe2PaiMQD`l5m6
+_SX.)^V@Lr]Y(kf\[f5Z[^EKKZa-j?Yck43XK/A$WMl_mVPL#_U7n9RT:VXES"#k7R$a5+Q'@Jq
+P*(ieO,f3YN/NRMLkg_>KnP)2Jq8H&IsufoI!^0cH$FOWG'.nKF)q8""`SBtDJa4hCCk5pBP;$j
+An>Oa@q/tW@:<RC?NFJ=r`oJ-!*]A)s&f;&r`9&!s&Atrs&/korD<Mir_EAcs%NDbqb$iZr^ciT
+r'pTQoL/LBoKr"4O8fUKU39pI<Dl^k9i"O`9`n-b9hbO\#"hQ_9h\,PpIYT\8kVfN9`@Tq9h\/O
+7nZHI9heAW:/+JY9ht(Pm6U\;rBpHMs$crWr^ZuZs%35_IS3@.9heAY:f("e;cHat<`iL->?kH?
+?XR>PA7]CeBkqO&DK'T:FEVkRH@1-jJV/W1LP^nINfT<cQ'Rf*S"6.DU84W`W2cr$YHbF@[^WfZ
+]Y;.s_SjF6aND]NcHstfeCE1'g"P6;hVd>Oj5f=akNM0qlg4!*n*fc9s763]"n_K\p@e7Zp]C9f
+qY^6ir;HTerdk*=s*t~>
+JcC<$S,`0\rVc`nr;6Nj!;ZTg=nhX`p%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WMcSgU7e*KS!fY0P`h/iNJraND1$bcPGP\d\G`rD]">Se
+]tM.o^\beH_>;%J_u@US_u7IP_uIXT`VmaS_Z[os`lH1"ao0B[bP]TablQ&5rlkAd!RAsf\Gj&=
+\GE]4\G<]+\cfRT]",BK])9/?]_T2;]E#S@]_K/?]DfMA]JcO\VPgDoXfen5Za@0N\\#Mg^VRe*
+`Q$!@bKJ/Ud*^:jeCE1&g"P08h;-rFi8ESRj5]4^jo4EBkPsc@l2KuCl2KoHkPaQCjo=E@ir\6!
+iVqa9hqn@g!SlH/g4%`-f@SU(e^W*tda?Ihcd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",>[
+[^NTNZa6sBYct:4XfSS'Wi;qpVPU)aUS=HUTV%gHS=?":R@'A.Q'IStP*1rhO,o<\N/NRMM26qA
+L4t;5K7\Z)J:E#rI=-BfH?jaZG9V3QFEDSEEH,r:Df0H0Chmg$C2%?pB4baeARo:\@U`bR@/aL6
+?=!P8s'#J,r`T8's&]2#s&B%urDW_os&&_ks%iVhrD!8br_*/]rCQuZq+(BQr'g6Gpd=[?mm3!6
+#57NHi76,trlcP1bfRuJaiDE?`lH$8_SO((^V7Ip]Xthf\[o;\\%&rZ\,E]?[^EQMZa-g>ZMq'/
+[C>P3m6UY:rBpHMs$crWr^ZuZ!(m/^IS3@.9heAY:f("e;cHat<`iL->?kH??XR>QA7]CeBkqO&
+DfKc<FEVkRH@10lJV/W1LP^qJNfT<dQ'Rf+S"6.EU84W`WN*&%Yd(OA[^WfZ]Y;.s_SjF6aND]N
+cHstfeCE1'g=k?<hVd>Oj5f=akNM0qlg4!+n*fc9s763]"n_K\p@e7[q#C0iqY^6ir;HTerdk*=
+s*t~>
+JcC<$S,`0\rVc`nr;6Nj!;ZTg=nhX`p%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WMcSgU7e*KS!fY0P`h/iNJraN?"IYeG(GSIN;nn:NrP.?
+OSt==OR8/5P*(liP5^UDP5^[FPkgU@PQmD=Q'ISuPQ$dIQ'D3.oTB*6q2t<4plYN<r0%,FplkZ>
+!0R/Aplb]@q3*_3Uo(&hX0&P/Z*UgG\@K5a^;%M$`5Ta;aihlPcHstee'uq"f@em3gtgfChr*GO
+ioB([jlQL(s6'FGq!%eCq!%eAs6'@Cs5j:Aro4(>iSjdo!T2c5h#Z<crn;hSf[na+e^`1!e'cXk
+d*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP_\$i`Q['R*EZ*:I8Xf\\*WiE%sVl$;dUnaZX
+TqJ$LSXc1=R[KP1Q^*i#PEM)kOH5H_NJrdQM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]GBY6SF`__H
+EcH)<E,TW3D/=!'C2.HrBP1phAS#C^@q&nU?srt@!FB(2>lS".>5h\)=T;J%<rZ/"<;fbq;ZBVm
+;#a>j:Amod9`@]_9)V?\8GPdS7f5^I7/0.A6LR4%rsJ;@[BHR*T:;7;RJrQZQC!o&Pa.MuPl6dF
+NrY4>NW4nAN/NUQMM[1Gre^Z1rIt</reC`4KSP;9KnkQQM![M+6N':K7/o^U7fGpX8,u6\8q'E,
+9MJ5V:Jakb;H$Op<`W=*=^,-:?=.)L@q9.`BPD6uDJsN7F*)SLH$XjeJ:W?+L51VDN/is]PEhH$
+R[]k>Tq\?ZVl?\tXg#(:['mHS]=bkm_8=.0a2lEHc-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg'
+mdKW6nc/1[o*+dZp%J+RrqQNhs8)Zjrqu`np&9OBS,\!~>
+JcC<$S,`0\rVc`nr;6Nj!;ZTg=nhX`p%@tKo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WMcSgU7e*KS!fY0P`h/iNJraN6q'R885)bP:B"&c:@q9Q
+:Adob:B+,i:]O;i;#X8d:]aEf:B!rl:/=Y^:fg`t<qo_r<rQ+t<;BPb<r>tp<r?##=BAT$<qTPl
+=9)Ft=T2A[USOcbWN3/(Yd(OA[^`l[]Y;.s_SjF5aN;WKc-F\`daQ^rf@S^0g>(N?hV[8LiSrnX
+jQ5M&k5XWEkkOEAlM0WCkl9iEk5XQCjSn0@io/kqhuV`lrnRV1g]#oUg"=p.f%&=#eC2jndEp4b
+cHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\@8oT[C!9HZE^X<Y-"h-X/`2!W2HMhUnjc[TqS-O
+St2C@S!ob4R$X)'P`q8nOcYWbNfB!UMM[1GLPCP;KS+o/JUi9#IXQWlH[:!`G^"?UG'.nKF)l8?
+E,]`5DJa3*CMITuBP;$jAn>Oa@q/tW@:3LB?NFJ=r`oJ-!*]A)s&f;&r`9&!!*&nqs&/korD<Mi
+r_EDdr_3;ar(?oZr^ciTrC6]RoL/IAoKr"4OoGd+MJ6<r<DZOe9MYL[rCd;f8ki"Y9E.Wa9E%Q`
+8cMBt84cEG92%rJ84lTN8kDNG8kViP:/:^]!)DrYm6UY:rBpHMs$crWr^ZuZ!(m/^IS3@.9heAY
+:f("e;cHat<`iL->?kH??XR>QA7]CeBkqO&DfKc<FEVkRH@10lJV/W1LP^qJNfT<dQ'Rf+S"6.E
+U84W`WN*&%Yd(OA[^WfZ]Y;.s_SjF6aND]NcHstfeCE1'g=k?<hVd>Oj5f=akNM0qlg4!+n*fc9
+s763]"n_K\p@e7[q#C0iqY^6ir;HTerdk*=s*t~>
+JcC<$S,`0\rVc`nr;6Njs7uZh>PIjbp%@tKo()>?n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCqe[^EHIYcb+/WMcVhU7n0LS!fY0Q'.8jNJraOL3@rpNM3#`\G`rD]">Se
+]tM.o^\bhF_>hCP_#V@M_u%=N_ZIcq`W!gU_Zmuq`5]g;aSs<\b50<[bl>oibg"AUrQPJjc-<f0
+qmcU8!4_m7rj_g8m(*2/r4;g<rk/'=p:U@;oXm#VVPgDnXfen5Za@0M\\#Mg^VRe)`Q$!@bKS5V
+d*^:keCN7(g"P39h;-uHi8N\Uj5f:_roO:Fkihp.oBQ5;rojCFrT41CjQ-=#!oi1trnmh7hYu=3
+gtVh^"khP[f@JLOe:5rqdF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(hd\[],W[^EKKZa-j?
+YHG"0XK/A$WMcYkV50o^U7n9QSt;LCS"#k7R$a2)Q'@JqP*(ieO,f0XMi*@JLkg_>KnP)2Jq8H&
+IsufoI!^0cH$FOWG'.nKF)l8?E,Y_n$>jTpCMIQtBP;$jrac+@A,]pB@:3JM?X@&Er`oJ-!*]A)
+s&]8&rDiu"<)ifps&/korD<Mir_EDdr_3;aqb$iZr^ciTr'pTQoL/IAoKr%5OoIH=pZLJhd`ft[
+bKJ/RaiDHC`l,j7_SjC0_8*au^:h.k]=PSa\[T&X\[]/X[^EQO[^ENM['Hm>ZMq'/[^YY4m6UY:
+rBpKNr^HiVr^ZuZ!(m/^!D?,c9n#i5:f("f;cHat='/U/>?kH@?X[DRAS#LfC27X'DfKf>Fa&(V
+H[U?nJV/W1Ll%%KNfT?eQ'Rf+S"61FU84ZaWN*&&Yd(OA[^`l[]Y;.s_SsO9aihlPcHstfeCN7(
+g=k?<hVd>Oj5f=akNM0qlg4$,n*fc9o()DEo`+Uap&Ojdq#C0iqY^6ir;HTerdk*=s*t~>
+JcC<$S,`0\rVc`nr;6Njs7uZh>5.aap%@tKo()>?n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCqe[^EHIYcb+/WMcVhU7n0LS!fY0Q'.8jNJraOL1=k5F+/\%qi(Q7rJgo>
+OSt==ORA82P5gXEP5ULCP5UREPk^O?Pl6mEPQI,7PkgF5OoLO>On+\0OoLUBPQ$g@PPC=1P;K)4
+Vl?\uY->1;['mHS]=bkm_8=+/`lQ9Fbg"G[dF-Oof%8R-g=tE=h;@/KiSrnXjQ,G%joX`0kkjW9
+lMKiFkl9iEjoXZ*jSn0@io/kqhuV`lrnRV1g]#n1g"=p.f%'cLJ()indEp4bcHXSVbK@rJaN)<>
+`Pf[2_SO%&^V7Co]XkYa\@8oT[C!9HZE^X;Y-"h-X/`2!Vl-DgUnjc[TqS*MSt2C@S!ob4R$O#&
+P`q8nOcYWbNf8pTMM[1GLPCP;KS+o/JUi9#IXQWlH[:!`G^"@TF`__HEcH)<DuOV]D/=!'C2%Bq
+BP1rVAH?=OraH+@?sm>K?=$q:>lS".>5h\)=9)G$<WZ9#<;fbq;ZBVm;#a>j:Amod9`@]^9)_E]
+8GPdR7f5^I7/0.A6L[:(rs[Ym[B-6uS=5q8R@'B@QNEG:Q2[$JOo^].rJh2DNfAsSMi*CMMZ/G6
+Ll$ueL]<):M26nAKS5,8KnbD@m>1-qr'L?Lr'^NQs$luXs%!,]r^m2a9`@b8:/=\_;,^Cm<E<1'
+=^#$7?!grI@Uit\B4u$qCi402EccGJG^=^bIXm!%KSG;>Mi<[WP*;/sR$sM8T:r!TVPgDnXKJe4
+Za@0N\\#Mg^VRe+`lQ9FbK\>ZdF6Urf@\g2gtgiFi8WeXjlYail0@U$mI'H3nF?)?oCV\Tp&F^c
+p\ssfq>^<hqu6NlrUp/@s-s%=~>
+JcC<$S,`0\rVc`nr;6Njs7uZh>5.aap%@tKo()>?n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59=)]tCqe[^EHIYcb+/WMcVhU7n0LS!fY0Q'.8jNJraOL-n@!7S6BNq+gobqG-ZW
+ohPE\qG.&ds%i\kr_WPhq+q>m:/4MX:/4S\r_WVt!E`G%<r5ts<rQ,!<;KV`<rQ+r<r?%u=T;J$
+<qKJk=T;J!=T2AYUo(&hWi`G.Z*UgG\%0,`^;%M$_o9X:aihoQcHsteeC<($f\,!5gtgfDi8ESR
+j5]4]jo4BDkNM.,l1=3;l2KoHkPaNEjlGM%ir\6!iVqa9hqn@g!SlH/g'-0^f@SU(rmZGHda?Ih
+cd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"h\[f5Z[^NTNZa6sBYck43XfSS'Wi;noVPU)aUS=HU
+T:VXFS=?":R@'A-Q'IStP*1rhO,o<[N/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH?jaZGBS+NFE;JB
+EH#jqD@15sCMR[!BkV0mB)Z?BA7PUJ#@V"J?XI,G?2e+/>6%k+=oVS(=8c/$<E)rr;u]bq;>j>k
+:]=,f:&[ic9D_?\8cD9V8,PjS7J'"C6hE_76'VB[i15!s=Ar*o9heAW9h\8UrCd;f8PDhW9E.T]
+9)hK_8esuh8P2TJ9M%cG8ki&Q8OlEG92/)T:AdiR:[LIG6N':L7/fXT7fGpX8,u6\8c_RYr_7i:
+:Jakb;c?Xq<``C+>$G6;?XI5N@qB4aBPM=!DJsN8FEMePH@('hJ:W?+L5:\EN/is^PEhH$R[]k?
+Tq\?[Vl?\tY->1;['mKT]=bkm_8=12aN;WKc-F\`e'ut#f\5'7h;7)JioB+]k3(smlKdg(mdKW6
+nac8Bo^r1Vs7QHerqQNhs8)Zjrqu`np&9OBS,\!~>
+JcC<$S,`0\rVc`nr;6Njs7uZh#5@ibp%@tKrpinUnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n3MS!o_1Q'7>kNf8jPLN%WkLmF[ErOE6G]=Y_g
+]tV4q^\bhH_#V:L_>_:O_t_+K_u@R]_o0I1_Sa=3a2c:#ao9HZbPfZbblc27bfp%1!7(PfrOMg8
+rODp<qR6I7qRQ")rO`'?qRc^=qn)m@!kZ+Wo"4t7r4Fh]VPgDnXKA_3Za@0M\[oGe^VI_(`Q$!@
+bKJ/Ud*^:keCN7(g"P39h;7&Ii8N\Uj5f>$k5XWEkl'cElLsQBlMKiGkl9iFk5XQCjSn0Wio/kS
+i8<GKh;-lAgY1B7f\"g-f%&:"e'e6CHdL*acHXSVbK@rJaN)<>`Pf[2_SO%&^V.:m]=PP`\@8oT
+[C!9HZ*:I9Y-"h-X/`1uVl-DgUnjc[TqJ$LSt2C@S!ob4Q^3o%P`q8nOcYWaNJrgSMM[1GLPCP;
+KS+o/JUi6!I=6KiH?sj]G^"@TF`__HEcH)<DuOVXD/=!'C2*Z\!G?$DAH?=OraH+@?sm>K?=$q:
+>QS,5>5h\)=9)G$<WZ9#<;fbq;ZBVm;#a>k:Adic9`@]_9)V?\8GPdS7f5^I7/0.A6LR4(s!RF+
+j5/>2bfn8Sbfe,KaiDE@`5KO2`59@,]t_7o\[oDb\%&rY\@;IIs0qp6#I_%I['Hm>ZMq'/[^Y\5
+lp:P9rBpKNs$crWrC?lY!(m/^IS3@/9hnJ[:f1+h;cHat='/U/>?kH@?X[DRAS,RgC27X'DfKf>
+Fa&(VH[U?nJV/Z2Ll%%KO-#NgQ'[l,S"?7GU84ZaWN*)'Yd(OB[^`l[]Y;1u_o9X:aihoRcd:(g
+eCN7(g=tE=hr*JQj5f@bkNV6rlg4$,n*fc9s7-Edo^qhLp@n=\q#C0iqY^6ir;HTerdk*=s*t~>
+JcC<$S,`0\rVc`nr;6Njs7uZh#5@ibp%@tKrpinUnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n3MS!o_1Q'7>kNf8jPLL4\1E-Zqmr/CZ8rJgr?
+OHBI(qiLW9s,d&=!0I/A!0[;C!0[;Es-3>Eqiq#Dqih)GrKR&<m?-n$pQ><9rKR2C"I,+5P*,[*
+pQGT?r0&q4VPgDnXKA_3Za@0M\[oGe^VI_(`Q$!@bKJ/Ud*^:keCN7(g"P39h;7&Ii8N\Uj5f>$
+k5XWEkl'cElLsQBlMKiGkl9iFk5XQCjSn0Wio/kSi8<GKh;-lAgY1B7f\"g-f%&:"e'e6CHdL*a
+cHXSVbK@rJaN)<>`Pf[2_SO%&^V.:m]=PP`\@8oT[C!9HZ*:I9Y-"h-X/`1uVl-DgUnjc[TqJ$L
+St2C@S!ob4Q^3o%P`q8nOcYWaNJrgSMM[1GLPCP;KS+o/JUi6!I=6KiH?sj]G^"@TF`__HEcH)<
+DuOVXD/=!'C2*Z\!G?$DAH?=OraH+@?sm>K?=$q:>QS,5>5h\)=9)G$<WZ9#<;fbq;ZBVm;#a>k
+:Adic9`@]_9)V?\8GPdS7f5^I7/0.A6LR4*rupgO[B?F&Ssl(8R$X/,Q^<u%PEh>rOcbfgNfT3\
+NK&mUregi8M2M:hs+h>FLkgb?KnbA>Lk^Y;K8528L5:`TM!RG*6N':L7/o^U7f>jW8,u6\8q'E,
+9heAY:Jand;c?Xq<``C+>$G6;?XI5N@qB7bBPM=!DJsN8FEMePH@('hJ:W?,L5:\EN/s'`PEhK%
+R[]n@Tq\?[Vl?\uY->1;[C3TU]=bkn_Sa@4aN;WLcHjkbe'ut#f\5*8h;@/LioB+^k3)!nlKdg(
+mdKW6nc/.boCV\Jp%J.SrqQNhs8)Zjrqu`np&9OBS,\!~>
+JcC<$S,`0\rVc`nr;6Njs7uZh#5@ibp%@tKrpinUnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/WMcVhU7n3MS!o_1Q'7>kNf8jPLI4L!7nQQQqG.#cqG-ZW
+!_uHapeL`_qG.&d!`2Zgr_WPhq+q>m:/4MX:/4S\r)!>ps&]/"rE&qurD`hsqGlZYqH*Vt!`rE'
+r`9)%pfIAqrE&ku1fpKMVl?\tXg#(:['mHS]"G_k^r"".`lQ9FbK\>ZdF-Oof%8R-g=tE=hV[8L
+iSrnXjQ6C's6'FGrTX:Gp?V\Bqs".Es6'CDs5j:Aro4mUiSi_Qhr!;Hh;$f?g=k64f[na+e^W*t
+df.X@d*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#]tD"i]",A]\$i`Q['R*DYct=6Xf\\*WiE"qVl$;d
+UnaZXTV%gISXc1=R[KP0QBd`"PEM)kOH5E]N/W[PM2@%DL5(D8K7ec,J:E#rI=-BfH?ja[GB\4Q
+FEDSEEH,r9rb_mVChmg$C&VcHB4h-S!G#^>@L$=L?sd8I?=!P8!aAi3r`T8'!*B,"!``3!rDW_o
+s&&_ks%iYir([/ar_*/]rCQuZq+(BQr'g6Gpd=[?mm39>$GV@/>#nX#:eXPXr(RAh9hS2S92,=X
+!_H!Wr_!,\s%<;]'M1nh91qlL8P;`M8kDQH8kMfO9htU\mSE18r'L?Lr'^QRs$lrWs%!,]r^qW4
+9MJ5V:JXea;H$Ln<E<1'=^#$7?!grI@Uit]B4u$qCi402EccGJG^=^bIXm!%KnbD?Mi<^YP*;/t
+R$sM9T:r!TVPgDnXfen5ZaI6O\\#Mg^r"".`lQ9Fbg+P]dF6Urf@\g3gtglGiSrnYk2tjkl0@U$
+mI'H3nF?PL#P7T[p%A%Qp\ssfq>^<hqu6NlrUp/@s-s%=~>
+JcC<$S,`-[rr)ior;6Njs7uZh>5.aap%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$iWKYck10Wi)_iU7n3NS!o_1Q'7>kNf8jPLMM0]Jruk8rODp>rjr<G
+]tM.oqnN*Frk\<Fs1n]Pr5/iZ_ns:.`Q#s=aSs<\b5]Wbb5KN]bQQ27c-4E2c2Z)eblG9N\bio8
+\H'/<\,Wl;\%):FmCN8.!4qs;rOi*@kI`RHVl?\tXfnt8['mHS]"G_k^r"".`lQ9FbK\>ZdF-Oo
+f%8R-g=tE=hV[8LiSrnXjQ6C'!pAe2rTX@IrTj4ErTjFIrTX@Gs6'@C!p/M(ro4RLiSi_Qhr!;H
+h;$f?g=k64rmuVMe^W*tda?Ihd*L"_c-4ASb/q`Ga2Z*;`5BI/_8!b!]tD"i]",A]\$i`Q['R'C
+Yct=6Xf\\*Wi;qpVl$;dUnaWWTV%gISXc1=R@'A.QBd`"PEM)jO,o<\N/W[PM2@%DL5(D7K7\Z)
+J:E#rI=-BfH?jaZGBS+OFEA"6EcH)<Df0H0D/=!'C2*Z\!G?$DAH?=OraGn:@/aO5?3":1>QS,5
+>5h\)=9)G$<WZ9#<;fbq;ZBVm;#a>k:Adic9`Ic_9)_E\8GPdS7f5^I7/0.A6LR4+rrr8ikhk(A
+rlbYjbfn2MaN)??rkncQ,Jh12^:h1m\[f;_\@K,[[^W`S\@K)X['[0J[^ENM['Hm>ZMq'/[^Y\5
+lp:P9rBpKNs$crWrC6o[8P/nRIS3@/9hnJ\:f1+h;cHat='/U/>[1QA?t!MSAS,RgC27[(DfKf>
+Fa&(VH[U?nJqJc3Ll%%LO-#NgQ'[l,S=Z@HUSOcbWN3/(Yd1UC[^`l[]t_A"_o9X:aihoRcdC.h
+eCN7(g=tE=hr*JQj5f@bkNV6rlg4$,n*fc9s7-3^o`"Lbp@n=\q#C0iqY^6ir;QZerdk*=s*t~>
+JcC<$S,`-[rr)ior;6Njs7uZh>5.aap%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$iWKYck10Wi)_iU7n3NS!o_1Q'7>kNf8jPLL"J)D0CGdqi(N6s,R,?
+pQ5<8rK-r>r/go?!0[;C!0[;Es-3>Eqiq#Dr075Hr06i8m?-n$q2t]?qNLlBrKI5Fs-*ADnWP`)
+Vl?\tXfnt8['mHS]"G_k^r"".`lQ9FbK\>ZdF-Oof%8R-g=tE=hV[8LiSrnXjQ6C'!pAe2rTX@I
+rTj4ErTjFIrTX@Gs6'@C!p/M(ro4RLiSi_Qhr!;Hh;$f?g=k64rmuVMe^W*tda?Ihd*L"_c-4AS
+b/q`Ga2Z*;`5BI/_8!b!]tD"i]",A]\$i`Q['R'CYct=6Xf\\*Wi;qpVl$;dUnaWWTV%gISXc1=
+R@'A.QBd`"PEM)jO,o<\N/W[PM2@%DL5(D7K7\Z)J:E#rI=-BfH?jaZGBS+OFEA"6EcH)<Df0H0
+D/=!'C2*Z\!G?$DAH?=OraGn:@/aO5?3":1>QS,5>5h\)=9)G$<WZ9#<;fbq;ZBVm;#a>k:Adic
+9`Ic_9)_E\8GPdS7f5^I7/0.A6LR4,rs@DhZ`BpqS=,h5r0IDLrKIGKP*1rhrf7bRNJrgSMi*FM
+M2@+HM26tFM2-h@re:i:M2-h>KS,&7KnbD@mYL3qr'L?Lr'^QRs$lrW!_>mSr^qW49MJ5V:Jakb
+;H$Ln<E<1'=^#'8?!guJ@Uit]B4u$qD/O93EccGJG^=^bIXm$&KnbD?MiEdZP*;/tR$sP:T:r$U
+VPgDoXfen6ZaI6O\\#Pi^r"".`lQ9Fbg+P^dF6Urf@\g3gtglGiSrnYk2tjkl0@U$mI'H3nF?PL
+!V>s_o`Fj]p\ssfq>^<hqu6NmrUg)?s-s%=~>
+JcC<$S,`-[rr)ior;6Njs7uZh>5.aap%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$iWKYck10Wi)_iU7n3NS!o_1Q'7>kNf8jPLI4L"7n63HnPB0[o1esS
+rD38bs%`\m:J^sdrD35c"A_cf9hkU^qG72s>5_S*=BAT&<rH)"<rH%s<;KVW<r,nr=T)>#=Sc+s
+=Sl1u=>O$TVl?\tXfnt8['mHS]"G_k^r"".`lQ9FbK\>ZdF-Oof%8R-g=tE=hV[8LiSrnXjQ6C'
+!pAe2rTX@IrTj4ErTjFIrTX@Gs6'@C!p/M(ro4RLiSi_Qhr!;Hh;$f?g=k64rmuVMe^W*tda?Ih
+d*L"_c-4ASb/q`Ga2Z*;`5BI/_8!b!]tD"i]",A]\$i`Q['R'CYct=6Xf\\*Wi;qpVl$;dUnaWW
+TV%gISXc1=R@'A.QBd`"PEM)jO,o<\N/W[PM2@%DL5(D7K7\Z)J:E#rI=-BfH?jaZGBS+OFEA"6
+EcH)<Df0H0D/=!'C2*Z\!G?$DAH?=OraGn:@/aO5?3":1>QS,5>5h\)=9)G$<WZ9#<;fbq;ZBVm
+;#a>k:Adic9`Ic_9)_E\8GPdS7f5^I7/0.A6LR4.rs@SOFBqsI;,C%^r_3bo:/+GV9MJ2R92/(Y
+9)hQa8e"?_7nH<F8P)HD8kVfLr^dMj9hS,N85)ZK9h\8Vr(ZTTlp:P9rBpKNs$crWrC6o[8P/nR
+IS3@/9hnJ\:f1+h;cHat='/U/>[1QA?t!MSAS,RgC27[(DfKf>Fa&(VH[U?nJqJc3Ll%%LO-#Ng
+Q'[l,S=Z@HUSOcbWN3/(Yd1UC[^`l[]t_A"_o9X:aihoRcdC.heCN7(g=tE=hr*JQj5f@bkNV6r
+lg4$,n*fc9s7-3^o`"Lbp@n=\q#C0iqY^6ir;QZerdk*=s*t~>
+JcC<$S,`-[rr)ior;6Njs7uZh?MF0ep%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+dEg+^bK7iE`59@*^:_%f\$iZLYck10Wi2ejUS4<OS=5h3Q'7AmNf8mQLPBu"J;Tef_n!=hrjr<G
+]tM.oqnN*Frk\TNrk\WOqn`<Ls2,2\_o'@._o9X9aN4>%s2tAb!6Y8`qoo)bs31Jes3CJc!k5\L
+qml^9qRHX:\,<Z9\%&sF\a@!"]D]DB]DT>=]CWZoV5L8lXKA\1ZF%'L\[oGe^VI_(`Q$!@b0/&T
+d*^:keCN7(g"P39h;7&Ii8N_VjQ,Fbk3(slrTX@Irp0+@rp0RKrTX@Gs6'@C!p/M(ro4%=iVqa>
+hqm5Gh;$cag(N)kf@SU)e^W*tda?Ihcd'h\bl5e5b/q`Ga2Z*:_ns:,^q[Xu]tD"i]",A]\$i]O
+Za6sBYct=6Xf\Y(Wi;qpVl$;dUS=HUTV%gISXc1<R@'A.QBd`"PEM&iO,o<\N/W[PM2@%CL4t;5
+K7\Z)J:E#rI=-BfH?jaZGBS+NFE;MDEH,r9DJj<-Chmg$C&VcMB4b^dA7T3L@KBnFra,_5?![G7
+!aAi3r`K;)=',B%s&K(urDW_os&&_ks%iYir([/as%E5]r^m&Zq+(BQqaL0Gpd=[?mm3?@$hEZD
+h:'WmbKA&Rao9<a`lH$9`PVVi%_o`j^:q.e\[f5[\[]/WrO3<I\$i`P['mBO[Bm6FYHY>3YQ;/@
+m^DIJr'LBMqaCHQs$lrW!_>mSr^qW49MJ5V:Jakb;H$Ln<`W:(=^#'8?=.)K@Us%^BP;-rD/O<4
+EccGJG^=^bIt3-'KnbD@N/`m[P*D5uR%'V;T:r$UVPpMqXfen6ZaI6O]"G_k^r"".`lQ9Fbg+P^
+daZdtf@em4h;-uHiT&tZk2tmll0@X%mI'H3nF?PL!V>s_o`Fj]p\ssfq>^<hqu6NmrUg)?s-s%=~>
+JcC<$S,`-[rr)ior;6Njs7uZh>PIjbp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+dEg+^bK7iE`59@*^:_%f\$iZLYck10Wi2ejUS4<OS=5h3Q'7AmNf8mQLPB;PCiXoTOo:7<NW5%=
+O8"b8Oo(7>Ont1>OT:L@OT:RCPQ-mHPlR'IQ2?gDQ2d'OQ'@MuQ26aAOT1IBOQqttP5(.>P5:C@
+PlHsFPlHsGP4OkrV5L8lXKA\1ZF%'L\[oGe^VI_(`Q$!@b0/&Td*^:keCN7(g"P39h;7&Ii8N_V
+jQ,Fbk3(slrTX@Irp0+@rp0RKrTX@Gs6'@C!p/M(ro4%=iVqa>hqm5Gh;$cag(N)kf@SU)e^W*t
+da?Ihcd'h\bl5e5b/q`Ga2Z*:_ns:,^q[Xu]tD"i]",A]\$i]OZa6sBYct=6Xf\Y(Wi;qpVl$;d
+US=HUTV%gISXc1<R@'A.QBd`"PEM&iO,o<\N/W[PM2@%CL4t;5K7\Z)J:E#rI=-BfH?jaZGBS+N
+FE;MDEH,r9DJj<-Chmg$C&VcMB4b^dA7T3L@KBnFra,_5?![G7!aAi3r`K;)=',B%s&K(urDW_o
+s&&_ks%iYir([/as%E5]r^m&Zq+(BQqaL0Gpd=[?mm3EB'^<KAXeqe_R[BM1Q^F/+QBd\uQ'D92
+rf@;ENfB$VMuAM>Mi!=JLl$qCM2D4ere:i<LPLS:K7er6KnbD@mYL3qr'LBMqaCHQs$lrW!_>mS
+r^qW49MJ5V:Jakb;H$Ln<`W:(=^#'8?=.)K@Us%^BP;-rD/O<4EccGJG^=^bIt3-'KnbD@N/`m[
+P*D5uR%'V;T:r$UVPpMqXfen6ZaI6O]"G_k^r"".`lQ9Fbg+P^daZdtf@em4h;-uHiT&tZk2tml
+l0@X%mI'H3nF?PL!V>s_o`Fj]p\ssfq>^<hqu6NmrUg)?s-s%=~>
+JcC<$S,`-[rr)ior;6Njs7uZh>5.aap%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+dEg+^bK7iE`59@*^:_%f\$iZLYck10Wi2ejUS4<OS=5h3Q'7AmNf8mQLPA5a7n$$Enk]9\o1esS
+s%iDbs%`\m:J^sdrD35c"A_cf9hkU^peUrpr`]8'"'AW+<r,ku<`Srpqc2cZqH*Vts&],#qcE\t
+q,]OXV5L8lXKA\1ZF%'L\[oGe^VI_(`Q$!@b0/&Td*^:keCN7(g"P39h;7&Ii8N_VjQ,Fbk3(sl
+rTX@Irp0+@rp0RKrTX@Gs6'@C!p/M(ro4%=iVqa>hqm5Gh;$cag(N)kf@SU)e^W*tda?Ihcd'h\
+bl5e5b/q`Ga2Z*:_ns:,^q[Xu]tD"i]",A]\$i]OZa6sBYct=6Xf\Y(Wi;qpVl$;dUS=HUTV%gI
+SXc1<R@'A.QBd`"PEM&iO,o<\N/W[PM2@%CL4t;5K7\Z)J:E#rI=-BfH?jaZGBS+NFE;MDEH,r9
+DJj<-Chmg$C&VcMB4b^dA7T3L@KBnFra,_5?![G7!aAi3r`K;)=',B%s&K(urDW_os&&_ks%iYi
+r([/as%E5]r^m&Zq+(BQqaL0Gpd=[?mm3HC#eY\"=BAHu:J:X\$r0Mj92&&T9MA)Q91o1V#YI`^
+84?'A8P/nPs%<;as%3Mf92/,R8kDYS9*7p`:/:^]mSE18r'LBMqaCHQs$lrW!_>mSr^qW49MJ5V
+:Jakb;H$Ln<`W:(=^#'8?=.)K@Us%^BP;-rD/O<4EccGJG^=^bIt3-'KnbD@N/`m[P*D5uR%'V;
+T:r$UVPpMqXfen6ZaI6O]"G_k^r"".`lQ9Fbg+P^daZdtf@em4h;-uHiT&tZk2tmll0@X%mI'H3
+nF?PL!V>s_o`Fj]p\ssfq>^<hqu6NmrUg)?s-s%=~>
+JcC<$S,`-[rr)ior;6Njs7uZhs7]jnp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]O,^:_(g\$iZMYck11Wi2hkUS4<OS=>n4Q'7AmO,T!RLk]kqIYO,Z[^iu\]=\'T
+!PQ5E^\knI_#V@N_#V:H_#_EhqSE?P`Q#staSs<]ao]c/b5KKabfft/s3:SfrltJgps&iI!k5\L
+r4)g=pUL=7\,<]7[fEr8\a6ou])]G8]DfGC]D&rlVl6VsXfnt7ZaI9Q]"G_k^r"".`lQ9EbK\>Y
+dF-Oof%8R-g=tE=hV[8MioB([jo4BCkNMm/s6BXMm-O`;rp'IHs6'IGrT4@HjQ,@]io8qrhuV`l
+rnRV1g]#n1g"=p.f%'cLIac`mdEp4bcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[T#U[C!9H
+ZE^X<YH=q.X/`2!W2HPjUnjc[TqS-OSt;IAS!ob4R$X,(P`q8nOcYWbNfB!VMi*@ILPCP;KS+o/
+JUi9#IXQWlH[:!`G^"@TF`__HEcQ/>"`SBtDJa4hCB80arb)LKAn>OaA7PUJ!F]C8?NOP>?2e(1
+>?Y50=TV],=8l8#<W?%s;u]bq;>j>k:]F2f:&[id9D_?\8c;3U8,YpT7J'"C6hE_66(@m&q!mP(
+f@%mdbK@rNaN)??`l5m6_SO"$^:h4o]t(Ya\@B#Y\@/cQ[f!W7[0a4L['mEM['6d<rNH@.[C>V5
+lTtG8r^6QNs$crWrC;<-8P)NH91qrQ9hnJ\:f1+h;cQk!='8[1>[1TB?t*SUAS,UiCMRd)E,fr@
+G'A4XI!pKpJqJc4M2I7OO-,TiQ'du/S=ZCIUSOfdWiN8*Yd1UC\%0)_]t_A"_o9X:aihoRcdC1j
+e^i@*g=tH>hr*JRj5oFckiq?tm-G&GmdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*=s*t~>
+JcC<$S,`-[rr)ior;6Njs7uZhs7][ip%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]O,^:_(g\$iZMYck11Wi2hkUS4<OS=>n4Q'7AmO,T!RLk]8JC2nNKMuJ\7NW"n7
+O8Y1>Oo(7>OnXt8OT:RBP5pjHPlR'IQ2?gDQ2d'OQ'@MuQ2$U>OT1FCP37tsP5:=?P5:CBPQ6pC
+PlHsIP5^XFP5CFCPl?k#Vl6VsXfnt7ZaI9Q]"G_k^r"".`lQ9EbK\>YdF-Oof%8R-g=tE=hV[8M
+ioB([jo4BCkNMm/s6BXMm-O`;rp'IHs6'IGrT4@HjQ,@]io8qrhuV`lrnRV1g]#n1g"=p.f%'cL
+Iac`mdEp4bcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[T#U[C!9HZE^X<YH=q.X/`2!W2HPj
+Unjc[TqS-OSt;IAS!ob4R$X,(P`q8nOcYWbNfB!VMi*@ILPCP;KS+o/JUi9#IXQWlH[:!`G^"@T
+F`__HEcQ/>"`SBtDJa4hCB80arb)LKAn>OaA7PUJ!F]C8?NOP>?2e(1>?Y50=TV],=8l8#<W?%s
+;u]bq;>j>k:]F2f:&[id9D_?\8c;3U8,YpT7J'"C6hE_66(Ir[e[VocV4X9Grg4(ZQ^=#&PEV5p
+PEM(-OT1@@N;nh6M?&M2L]W?gM>i8AL51M=MMHq@KnP,6KnbA<MXQAe62X(K6i0:O7K5jU7t+!#
+8P2TJ92&&S:/=\_;,U=k<E<.%=]ns6>[CcF@U`kZAnYmoCMds.EH?5FGBnL^I=Hd!K8#);MN!OU
+OckroR$jG6StMdPUo1/kX0&S0ZEpsJ\[oGe^VI_(`Q$!@bKS8XdF-Opf%8U/gYL]Ci8N_VjlY^h
+l07O#lj<(In*fc9o()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD5>J,~>
+JcC<$S,`-[rr)ior;6Njs7uZhs7][ip%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]O,^:_(g\$iZMYck11Wi2hkUS4<OS=>n4Q'7AmO,T!RLk\8c6V'gC:@q?]:@q9I
+:Adoe;#X8c:]sQh:/+I^:A.N]>5_S(=SGkt<`Srpqc2cZqH*Dnr)`eupfB/IW2cr$YHY==[C<]X
+]Y2(q_Sa@4aN;TJc-FY_daZdtf@\d1gYCWAhr*JQj5]4^roO7Ekl'cGlMp2:m/H>MlM]uIkQ'fE
+jp1#/jQ#:[io0mp!T2c5h#Z<crn7P/f[na+ec+'Ie'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#
+^:h1l]=PP`\$i`Q['R*EZ*:I9Xf\\*WiE%sVl-DfUnaZXTqJ$LSt):>R[KP1Q^3o$PEM)kOH5H_
+NJrgSMM[.EL5(D8K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEcH(&E,TW3D/B2e!GZ?JBEi*]AS#C_
+A,]p<@:9(A!a]/<r`fM/>$Co.!a&N*r`9&!s&Aqqs&/korD<Mis%`Jdr_3>bqb$iZrCH`SrC6]R
+oL/IAoKr"4T)T)MQuH>4<_uXirCm>e9hkU\"\hZ`9M8(V8cq^W7nEVN#"M6S7nH9Fr^m,_&PYnk
+8OlEH8kVlP:/+GY:/+IO:?t4D6N0@L7/o^U7f>i+84cBF8kVfN9heAY:f("e;c?[s<``F,>?kE>
+?XR>PA7]@dBkqL$DK'T:FEVkRH@1-jJ:`E-LP^nINK93bPa.W(S"-(CTqeE]W2co#YHY==[C<]X
+]Y2(q_Sa@4aN;WLcHjndeCE.%g"P3:h;@/Lj5]7`k32'olg3sEmI'H3nF?)?oCW%T!quB_rqQNh
+s8)Zjrqucoo_sFAS,\!~>
+JcC<$S,`-[rr)ior;6Njs7uZhs7ZNerq0FdoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R-^:_(g\@/cNZ*1:2Wi2hlUS4?PS=>n4Q'@GnO,T!RLk]YfH%D!LWkQ$T]DfGD
+]tXBYr4r9IrP8<H!5STM!lDdirPAcW`Q#s>aiOJ's2kDdb0'\+!R/abbl>ofbl5lecM5WacMY*P
+\%&sI\c027\H04Lr3cX8\G`u&](3H5](`i7]E#S?]JZUcWiN8*Yd1UC[^`l\]t_A"_o9X9aND]N
+cHjnde'ut#f\,!5gtgiEi8N\Uj5f=ak3(pkrosIJs6KRKp$MVBs6K[LrTOCIkNDj,s5a7Aro=%<
+!9*q8!T2c5h1+57g=k65f[na+e^W*te'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]",A]
+\$i`Q['R*EZ*:F7Xf\\*WiE%sVl$;dUnaZXTqJ$LSXc1=R[KP1Q^*i#PEM)kOH5H_NJrdQM2@%D
+L5(D8K7ec,J:N,uI=6KiH?omCG^"@TF`__HErL%^E,TW3D/B2e&8GomBP1siAS#C^@q&nU@:9(A
+!a]/<r`fM/>$Co.!a&N*r`9&!s&Atrs&/kor)!Dhs%`Jds%NDbqb$iZrCHcTr'pTQoL/IAog8(4
+Sc:bAl/:@FbKS/Pb0.oIa2Q$8_Sa:-^V7Fs]Y;%g\[f5\\%/uV[(!KP\$rlV[C3HN[C*KPZEpg>
+Yd484!4D4&lp:P9rBpHMs$crWr^ZuZ!(m/^InNI/9heAY:f("e;cHat<`iL->?kH??XR>PA7]Ce
+BkqO%DK'T:FEVkRH@1-jJ:`H/LP^nINfT<cPa7])S"6.DTqeH^W2cr$YHY=>[^WfY]Y2(r_SjF6
+aND]NcHjndeCE1&g"P3:hV[8Mj5]7`k32'olg4!*mdKW6nc/.\oCW%T!quB_rqQNhs8)]krVZZn
+o_sFAS,\!~>
+JcC<$S,`-[rr)ior;6Njs7uZhs7ZNerq0@boCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R-^:_(g\@/cNZ*1:2Wi2hlUS4?PS=>n4Q'@GnO,T!RLk]2FB5Mg?K9(ujNW"n7
+O8Y1>Oo(7>OnXt9OoLUDP6R88Pa%GuPl?sEPl$^LPa.JtQ'M-/!1!8>kE5.pr/puAqih&C"I#(7
+P*>a,qNCoBrKI5F25dCQX0&S0ZEpsI\@K8c^VI_(`Q#s>b0/&TcdC1ieCN7(g"P39h;7&IiSrnX
+jQ5OdkND(.l2U&Klhg&AmJ?2Lli-2JklU)3kPjWDjT+B@j8\*=iVqa9hqn@gJ)&f4g=b03f@SU(
+eC;srda?Ihcd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"h\[f5Z[^NTNZa6sBYck43XfSS'Wi;qp
+VPU)aUS=HUTV%gHS=?":R@'A.Q'IStP*1rhO,o<\N/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH3nkA
+GB\4QFEDSErc&*\Df0H0D#S2]C2%?pB4kgfARo:\@U`bS@/aL7?<pk9>QS,5>5hY+=BAT'<rZ2"
+<;ohr;ZBVl;#a>k:Adid9`@]^9)_E\8GYjS7f5^I7/0.B6LI.3rsIo'ZE:!sSsYq5R/WHPQMcpH
+P5UIIO,]*WMN!FLreg]2"c8%jLkpoeL]<).L'rfmL5(A6K8528Kno&Olp:P9rBpHMs$crWr^ZuZ
+!(m/^InNI/9heAY:f("e;cHat<`iL->?kH??XR>PA7]CeBkqO%DK'T:FEVkRH@1-jJ:`H/LP^nI
+NfT<cPa7])S"6.DTqeH^W2cr$YHY=>[^WfY]Y2(r_SjF6aND]NcHjndeCE1&g"P3:hV[8Mj5]7`
+k32'olg4!*mdKW6nc/.\oCW%T!quB_rqQNhs8)]krVZZno_sFAS,\!~>
+JcC<$S,`-[rr)ior;6Njs7uZhs7ZNerq0:`oCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R-^:_(g\@/cNZ*1:2Wi2hlUS4?PS=>n4Q'@GnO,T!RLk\5`7S$'C:%_<]:@q9I
+:'"-er_NMir_N;c!)NSh!)<Gfp.t`dpKIQ!!*Jts!EN4s<;fhj<rZ7l<qobr=T;J$=Sc+u=SZ#U
+Vl6VrXfnt7ZaI6O\\,Vj^r"".`lH0CbK\>YdF-Lnf%8R-g=tE=hV[8MioB([jlY^gkNMp0s6BXM
+qs="CqX"7Jrp'IH!pJh1roX7B!9F.>s5F%;rnmh7hYu>\gtUQ:g"G$0f@JL%eC2mpdF$=ecHa\Y
+bKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(hd\[],W[^EKKZa-j?YHG"0XK/A$WMl_lV50o^U7n9RT:VUD
+S"#k7R$a5*Q'@JqP*(ieO,f3YMi*@JLkg_>KnP)2Jq8H&IsufoI!^0c$$gc>GBS+NFE;L%E<U<"
+DJj<-rbE'[BkV0mB4b^dA7K+Y@UW\Qra,_5?![G7!aAi3r`K;)=',B%s&K(ur_rhps&&\js%iYi
+r([2br_*,\r^m&ZqFCHQr'g6Gpd=^@mQmQH$2h;`@THN0;,Bs`:&[fi9hS)P92,=W"%u3Y9DqC&
+8k;NF7Rp'A8kMZH91quO9M7uM91hiP9MJ8V9hnFM:@(:E6N':K7/o^U7fGpX8,u6\8q0K-9MJ5V
+:Jakb;H$Op<`W=*=^,-:?=.)L@Us%_BPD6uD/O<4F*)SLH$XjdIt3-(L51VCN/is]P*D9"R@Bb=
+TV8-WVl6VsXfnt7['mHS]"G_k_8=.0a2lEHc-FY_daZh!f@em4h;7&IiT&t[k2tmll0I^&mI'H3
+nF?PL!V>s_o`Fj]p\ssfq>^<iqu-HlrUg)?s-s%=~>
+JcC<$RfE'[rVc`nrVQWks7uZhs7ZNerq0CcoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@/cNZ*:@3Wi2hlUnOHQS=>q5Q'@GnO,]*TLk^V)H[gm<T>.tLrk&9F
+^AG\E_#M1F_#D1K_#(tH_?Ros`lH0BaSj3_b0.rMqTJf\r6>5dq9Aoa!4Vj6s0i!<rji$>rj`$?
+qmca;\,Ni9[fEr;\`^R#]DK24]CrloVPpMqXfen6ZaI6O\\#Mg^r""-`Q-'BbK\>YdF-Lnf%8R-
+g=tE=hV[8MioB([jlY^gkl0iHlMp2Jm/?>HmelJLm/QDOlM]uIkQ'fFk5XNCjSn0Wio/kSi8<GK
+h;-lAgY1B7f\"g-f%&:"e'e6CIaHEdcHXSVbK@rJaN)<>`Pf[2_SO%&^V.:m]=PP`\@8oT[C!9H
+Z*:I9Y-"h-X/`1uVl-DgUnjc[TqS*MSt2C@S!ob4Q^3o%P`q8nOcYWbNf8pTMM[1GLPCP;KS+o/
+JUi9#IXQWlH[:!`G^"@TF`__HEcH)<E,TW3!GuZPCCk5pBP;$kAn>Oa@q/tW@:<RC?NOP>?2e(1
+>?Y50=TV],=8l8#<W?%t;u]bq;>a8j:]F2f:&dod9D_?\8c;3U8,YpT7J'"C6hE_66(n6)p?Uht
+f[.gaai_]Ia2c0;_ns=1_8*h#^:_(k\[T)[\$iiU\$WXC[KX1K[C3HMrj2j:['[*AYPk[,Z*h(0
+[d-6W6N':L7/fXT7fGpX8,u6\8c_RYr_7Z5:Jakb;H$Op<``C+>$G6;?=.)L@q9.`BPD6uDJsK6
+F*)SLH$XjdJ:W?+L51VCN/is]P*M?#R@Bb=TVA6YVl6VsXfnt8['mHS]"Gbl_8=.0a2lEHc-F\`
+daZh!f\,!6h;7&IioB(\k3(smlKdg'mI'H4nc&([oCW%T!VZ9dq#C0iqYg<jr;HTdrdk*=s*t~>
+JcC<$RfE'[rVc`nrVQWks7uZhs7ZNerq0=aoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@/cNZ*:@3Wi2hlUnOHQS=>q5Q'@GnO,]*TLk^UnB5)F6J<BhjrJpc9
+oT9$6plPE9!0[>F#*b=9Pa.Jtrg!>Eq3CuErg!;DrfmJGooT'5!0Zi6l]V70rf[/BrK72FP5^[@
+PkUA!PbtCZX0&P/ZEpsI\@K5a^;.V'`5Td<b0/&TcdC1ieCN7(g"P39h;7&IiSrnXjQ5OdkNMp0
+s6BXMr9XCLq!S(Iqs=@Ks6BRIs6'IGroX7B!9F.>)<0W6i8EMMhVI#CgtUQ:g"=s/f@JL%eC2kF
+d=0HgcHa\YbKJ&MaN2EA`Pod5_SX.)^V@Ip]Xtbc\[],W[^EKKZa$a=YHG"0XK/A$W2HPjV50o^
+U7n9QSt;LCS"#k7R$X,(Q'@JqP*(ieO,f0XMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FOWG'.nK
+F)l8?E,]`5D?4TjrbE'[BkV0mB4b^dA7K+Y@UW\Qra,_5?![G7!aAi3r`K;)=',B%s&K(ur_rhp
+s&&\js%iYir([2br_*,\r^m&Zq+(BQr'g6Gpd=[?mm3ZI&_4=mWMH,TR$a5-Q^F))P`q=1Op[;5
+OH5K_N/WXOMuAJ?LP^hDM2$hBM2-nBreCH.#)J"fL4b,3reCH.!/g6$lTtG8rBpKNr^HiVr^ZuZ
+!(m/^!D?,c9mKK0:f("e;cHat='/U/>?kH??XR>QA7]CeBkqO&DfB];FEVkRH@1-kJV/W1LP^nI
+NfT<cQ'Rf*S"6.DU84W`W2cr$YHY@?[^WfY]Y;.s_SjF6aND]NcHsteeCE1'g"P6;hV[8Nj5]7`
+kNM0qlg4!*mdKZ8rpg*]o`"Lap@nO\s7u]krVQTlrVcBfJcD5>J,~>
+JcC<$RfE'[rVc`nrVQWks7uZhs7ZNerq0=aoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@/cNZ*:@3Wi2hlUnOHQS=>q5Q'@GnO,]*TLk^UO6:4479MkIZr_E)[
+lqRRW;#X8i;#X8c:]O;f:A.N`;#jhs>5DA%=T2A%=Sl/#<`T&srDiMkr)`SmnlPinpfIJtqc>VO
+W2co#Y->4<[C3TU]=bkn_Sa=2a2lEHc-FY_daQ^sf@\d1gYCWAhr*JQj5]4^k2tjjrosIJs6KUL
+rU'CJr9aCJs6K^MrTX@G!9a@Ds5a7Aro4mUiSi_Qhr!;Hh;$f?g=k64f[na+e^W*tdf.XCd*L"_
+c-4ASb/q`Ga2Z*;`5BI/_8*h#]tD"i]",A]\$i`Q['R*DYct=6Xf\\*WiE"qVl$;dUnaZXTq@pJ
+SXc1=R[KP0QBd`"PEM)kOH5H_N/W[PM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r:
+Df0FnD/B2e&8GomBP1siAS#C^@q&nU@:9(A!a]/<r`fM/>$Co.!a&N*r`9&!s&Atrs&/kor)!Dh
+s%`Jds%NDbqb$iZrCH`SrC6]RoL/IAoKr"4U]1YPQZ$)-<)?Ce:&Ra*9hnAV9hS/Q92%uM8k_iL
+91h]E84c?D7n?3C8H)6]8I%m_9M.rM850"U!)3>c"A_ce9i(7RlTtG8rBpKNr^HiVr^ZuZ!(m/^
+!D?,c9mKK0:f("e;cHat='/U/>?kH??XR>QA7]CeBkqO&DfB];FEVkRH@1-kJV/W1LP^nINfT<c
+Q'Rf*S"6.DU84W`W2cr$YHY@?[^WfY]Y;.s_SjF6aND]NcHsteeCE1'g"P6;hV[8Nj5]7`kNM0q
+lg4!*mdKZ8rpg*]o`"Lap@nO\s7u]krVQTlrVcBfJcD5>J,~>
+JcC<$RfE'[rVc`nrVQWks7uZhs7ZNerq0OgoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oG`P]R.^V.:j\@/fOZ*:C4Wi;nmUnXNRSXZ%7Q'@GoO,]*ULk^V#H@L^5T!c/A]=bei
+qS)pCo"b7@s1eWNrPAZS`Q#staSj6Zb50<Zbl#`bcM>``cMb6L[f<f:\Gj&8])0#<\G`o:\,a)&
+\cB55\coXU]">Maq7H[>!5&6C!5&3B1T.4QXfen5ZaI6O\\#Mg^VRe*`Q-'BbK\>YdF-Lnf%8R-
+g=tH>hVd>NioB([jlY^gkl0fJlKdd7m/HDBmeuPNm/QDOlM]rKki_..k5XNCjSn0Nio/kSi8<GK
+h;-l@gY1B7f`'KOf%&:"e'cXkd*L"_c-=JUbK@rJaN)<>`Pf[2_8*h#^:h1l]=PP`\@8oT[Bm3F
+Z*:I9Y-"h-X/`.tVl-DgUnjcZTqJ$LSt2C@S!o_3Q^3o%P`q8nOcYWaNJrgSMM[1GLPCP;KS+o/
+JUi9#IXQWlH[:!`G^"@TF`_^HF)l8?E,TZ4DJa3*CMITuBP;$jAn>Oa@q/tW@:<RC?NFJ=r`oJ-
+!*]>(!a&N*r`9&!s&Atrs&/kor)!Dhs%`Jds%NDbqb$iZrCH`SrC6]Ro0i@@og8+5U]3FToBG2d
+ccXAOb0%iHaMl*9_SX4,^qd^u]t:kd\$rlV[^`cS[(!KP\$icR[C!<K['[0K['[*AY-5/1YQ;,?
+m^DFIr'L?Lr'^NQs$luXs%!,]r^m2a9`@b8:/=\_;H$Ln<E<1'=^#$7?!grI@Uit\B4u$qCi402
+EccGJG^=^bIXm!%KSG8=Mi<[WP*;/sR$sM8StVmSV5L;mXKA_3Za@0M\\#Mg^VRe*`Q-'BbK\>Z
+dF6Uqf@\d1gtgiFi8WeXjlYail0@U$m-X91nF?)?oCMVSp&F^cp\jjgq>0scqu6NlrUp/@s-it<~>
+JcC<$RfE'[rVc`nrVQWks7uZhs7ZNerq0=aoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oG`P]R.^V.:j\@/fOZ*:C4Wi;nmUnXNRSXZ%7Q'@GoO,]*ULk^UjA86(-IuF;crf6i9
+ooT-7plPE9!0[8Ds-*SMPa)04qNUf@s-3MJq3:iCrK6c7rK7)Bo9&4!!g&S.qih#B!0R8D"-AY/
+PPLFCP5^XFP5^Y%Pc(L]Xfen5ZaI6O\\#Mg^VRe*`Q-'BbK\>YdF-Lnf%8R-g=tH>hVd>NioB([
+jlY^gkl0fJlKdd7m/HDBmeuPNm/QDOlM]rKki_..k5XNCjSn0Nio/kSi8<GKh;-l@gY1B7f`'KO
+f%&:"e'cXkd*L"_c-=JUbK@rJaN)<>`Pf[2_8*h#^:h1l]=PP`\@8oT[Bm3FZ*:I9Y-"h-X/`.t
+Vl-DgUnjcZTqJ$LSt2C@S!o_3Q^3o%P`q8nOcYWaNJrgSMM[1GLPCP;KS+o/JUi9#IXQWlH[:!`
+G^"@TF`_^HF)l8?E,TZ4DJa3*CMITuBP;$jAn>Oa@q/tW@:<RC?NFJ=r`oJ-!*]>(!a&N*r`9&!
+s&Atrs&/kor)!Dhs%`Jds%NDbqb$iZrCH`SrC6]Ro0i@@og8+5V#M.k^Tsr=T:M@9R$a5,QBd`!
+P`_,mrfI/@"-/A!MuAM<M26qBLl$qBreUQ/"bh\cLPL]bLAlf*L]2u.Ll(PUlTtG8rBpKNr^HiV
+r^ZuZ!(m/^!D?,c9n#i5:f(%g;cHat='/U/>?kH@?X[DRAS#LfC27X'DfKf>Fa&(VH[U?nJV/W1
+LP^qJNfT?eQ'Rf+S"6.EU84W`WN*&%Yd(OA[^WfZ]Y;.s_SjF6aND]NcHstfeCE1'g"P6;hVd>O
+j5f=akNM0qlg4!*n*fc9o()DDo`+Uap&Ojcp]C9fqY^6ir;HTerdk*<s*t~>
+JcC<$RfE'[rVc`nrVQWks7uZhs7ZNerq0=aoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oG`P]R.^V.:j\@/fOZ*:C4Wi;nmUnXNRSXZ%7Q'@GoO,]*ULk^UM6psO992>@[r_WPh
+!)E5^lq[ISr_WSiq,%)eqG-`\rD<Pur`fA*p0%;qqc<f!<W#er<Us2h=9)Ft<o6t7Vl?`!Y->1;
+[C3TU]=bkm_8=.0a2lEHc-FY_daQ^sf@\d1gYL]Bi8ESRj5]4^k2tjjrojLLlg+N9rpB7DrU'OL
+s6K^MrTOCIkNDj,s5a7Aro4RLiSi_Qhr!;Hh;$c>g=k64rmuVMe^W*tda?Ihcd'h\c-4ASb/q`G
+a2Z*;`5BI.^q[Xu]tD"i]",A]\$i`QZa6sBYct=6Xf\\*Wi;qpVl$;dUnaWWTV%gISXc1=R[BJ/
+QBd`"PEM)kOH5E]N/W[PM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]GB\4QFEARFEcH)<Df9N2D/=!'
+C2.HrBP1phAS#C^@q&nU@:9(A!FB(2>lS".>5_S*=BAT'<rZ2"<;ohr;ZBVl;#a>k:Adid9`@]^
+9)_E\8GPdS7f5^H7/0.B6LR4;rsJM/J7D\^<)?@`9DhHe9hS2T:.tR[r^m/ar_!2\#Y7NX84Q3B
+84ieQs%*Gg9M7uO8P)VT8cqa[9htU\!DZG[:?t4D6N':L7/fXT7fGpX8,u6\8c_RYr_7i::Jakc
+;c?Xq<``C+>$G6;?XI5N@qB4aBPM=!DJsN8FEMePH@('hJ:W?+L51VDN/is^PEhH$R[]k>Tq\?Z
+Vl?\tXg#(:['mHS]=bkm_8=.0a2lEHc-F\`e'uq"f\,!6h;7)JioB+]k3(smlKdg'mI0N5nac8B
+oCW(Us7QHerV-HiqYL-erqu`np&9OBRf@m~>
+JcC<$RfE'[rVc`nr;6Nj!;ZTg!Vc<eoiq([o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WMcVhU7n0LS!fY0Q'.8jNJraOL4t8'H%:pFV8U!Y]Y40U
+rP.a8!5\WN"2i*ta8X-^aiMTGrQ=u[qoo#`rm(>ar6>;eqmZI2s0i!<rjhm:qmlX7s1.7&!4hg7
+rOW'@qn)X93P22gWi`G.Z*UgG\@K5a^;%M$`5Td<b0/#ScdC1ieCN7(g"P3:h;7)JiSrnYjlY^g
+kNM0plK[^6m/HDOme#uHmf)VOm/QDOlM]rKki_..k5XNCjSn0?io0mp#2e:oh;-l@rn;VMf[na+
+e^`1!e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oS['R*EZ*:I9Y-"h,WiE%s
+Vl-DgUnj`YTqJ$LSt2C@R[KP1Q^3o%P`q8nOH5H_NJrgSMM[1GLPCP;KS+o/J:N,uI=6Kird#$!
+G^"@TF`__HEcH)<DuOV]D/=!'C2%BqBP1rVAHuaU@q&nU?srt@!FB(2>lS".>5h\)=T;J%<rZ2"
+<;ohr;ZBVm;#X8j:Adid9`@]^9)_E\8GPdS7f5^I7/0.A6LR4:rt+hfjkn\8bK7iIaN;HB`Pf[n
+_Z.@^^:h7l]=GG\[^WZP\$i]P\,3T5ZiIN5[/[N7['K\8!3uO-!joDFn$_LIr'L?Lr'^QRs$lrW
+s%!,]r^qW49MJ5V:Jakb;H$Ln<E<1'=^#$7?!grI@Uit]B4u$qCi402EccGJG^=^bIXm!%KSG;>
+Mi<[XP*;/sR$sM8T:r!TVPgDnXKJe4Za@0N\\#Mg^VRe*`Q-'BbK\>ZdF6Uqf@\g2gtgiFi8WeX
+jlYail0@U$m-a?2nF?PLs76Edp%A%Pp\jjgq>0scqu6NlrUp/@s-it<~>
+JcC<$RfE'[rVc`nr;6Nj!;ZTg!Vc<eoiUkXo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WMcVhU7n0LS!fY0Q'.8jNJraOL4t7iAo2^?Jru&lNr"h/
+OT(C;OSk4@P5UUDPQI,7Pl?sEPkgUEPl?sDPl$aCOnFh7OoCO9OlV]'PP:4AOckq(Pl-_*P,G:Z
+Xfen5Za@0N\\#Mg^VRe*`Q-'BbKS8XdF-Lnf%8R-g=tH>hVd>NioB+]k2tjikiq?slKeE8rpB^Q
+o^DbHrpBXMs6K^MrTOCIkNDj,s5a7Aro4%=iVqa>hqm5Gh;$cag3D<'f@SU(e^W*tda?Ihcd'h\
+bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i]OZa6sBYct=6Xf\Y(Wi;qpVl$;dUnXQVTV%gI
+SXc1<R@'A.QBd`"PEM)jO,o<\N/W[PM2@%DL5(D8K7ec+J:E#rI=-D@H4>.EGB\4QFEDSEEH,r9
+rb`'[Chmg$Bk_6oB4h-S#@q=S@U`bR@/aL6?=!P8s'#J,r`T8's&]2#s&K(ur_rhps&&_kr_NPh
+r([2br_*,\r^m&Zq+(BQr'g6Gpd=[?mm3lO$2`/ZXfA1gS!fZBQiE<PP`q7/P5gXCNt%&+N/EON
+Mhm4ELPL\AqhGK4Knb>;LPU\?LAlf0L4t>9M27&XM!@;(6N':L7/o^U7f>jW8,u6\8q'E,9heAY
+:f("e;c?Xq<``C+>$G6;?XI5N@qB7bBPM=!DJsN8FEMePH@('hJ:W?+L5:\EN/j!_PEhH$R[]k?
+Tq\?[Vl?\tY->1;['mKT]=bkm_8=.0a2lEHc-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg'mdKW6
+nc/1[o*+dZp%J+RrV-HiqYL-erqu`np&9OBRf@m~>
+JcC<$RfE'[rVc`nr;6Nj!;ZTg!Vc<eoiC_Vo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WMcVhU7n0LS!fY0Q'.8jNJraOL4t7J7S$'D:&Ifd;#O/i
+:A[cK:Adoe;#X8d;#a>f:&n)a;#=,i=T_i3>$CN#r)iht!EN5"<<#th<WH5"=9)G!<o@%=Vl?\u
+Y->1;['mKT]=bkm_8=.0a2lEHbg+P^daQ^sf@\d1gYL]Bi8ESRj5f=ak3(pkl07Kuli$2LmJcPG
+n,;\RmJQ>Nli68KklU)3kPjWDjT+B@irS/urnn"<hVR)EgtVh^GhLa$f@JL&eC;sqdF$=ecHa\Y
+bKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^EKKZa-j?Yck43XfJJ%WMl_mVPU)aU7n9RT:VXF
+S=>t8R$a5+Q'IStP*1ofO,f3YN/NRMM26qAL4t;5K7\W(IsufoI!bj=%=*2BGBS+NFE;JBEH#jq
+D@15sCMR[!BkV0mB)Z?HA7K+Y@UWYPra,\4?2e+/>6%k+=oVV(=8l8#<W?%t;u]bq;>j>j:]F2f
+:&dod9D_?\8c;3U8,YpT7J'"C6hE_66)aenc'*$K;c6Fg:JFMT92&%Y9a+3b9M8)Sr(72c84lBC
+8OuAM8H2<^8IS-^92%uN9M%cJ91__Q9a4?g:/4MZ:[q3F62X(J6i9@P7K5jU8,l*[8cD>292&&S
+:/=\_;,U=k<)lt#=BSg3>[:]D@:E_XAnPdlCM[m,EH6/DGBeF\I=?]tK7nu8M2R=QOHPfmQC+,1
+SY)UMUo(&hWiWA-Z*UgG\@K5a^;%M$`5Td<b0/&Td*^=le^rI-g>(N@i8EVTjQ5OekiqBum-O0/
+n*olIo)J:bo_%nNp@nO\!r;]hr;6KkrVcEgJcD2=J,~>
+JcC<$RfE'[rVc`nr;6Nj!;ZTg!Vc<eoiC_Vo()>?n*f]3m-O$%l0%3kjQ#7Yi8<AGg=k32e^W'q
+d*BnZb/hWB`59=)]tCqe[^EHIYcb+/WMcVhU7n3MS!o_1Q'.8jNf8jPLP:A$H@C^6TDlJ'^%K)>
+^\>PC^\kkI_>V4X_o0R7a2l?DaN;R&b50<Ybl#`ccM5Z_cMl)a\,3W6[fEr;\biu7\c92;\am?,
+\H9:O\b<W.]D&rsWN*&%Yd(OA[^WfZ]Y;.s_SjF6aND]McHjnce'uq"f\,!5gtgiFi8N\UjQ5Od
+kNM-ol0@U#rp9XOrpK7DrpKdQrTsRMs6BRI!pJh1roO:DjQ-=#!TN);huV`lrnRV1g]#n1g"=p.
+f%'cLIac`mdEp4bcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[T#U[C!9HZE^X<YHG"/X/`2!
+W2HPjV50l\TqS-OSt;LBS!ob4R$X,(Q'@JqOcYWbNfB!VMi*@JLkg_=KS+o/JUi9#IXQWlH[:!`
+G^"@TG'.nKF)l8?$?0p$DJa6,CMR[!rb)=FB)Z?BA7PUJ#@V"J?XI,G?2e+/>6%k+=oVV(=8l8#
+<<-"s;u]bq;>j>k:]=,e:&dod9D_?\8cD9V8,PjS7J'"C6hNe66)af1qsN\*f[%^_aiMWH`lH':
+`50=,^VIY!^:Ute\@B#W[C*HO[Bm@@[/mYBrNlg9['[6IZEUP1YQD):\*g]i62X(K6i0:O7K5jU
+7fl4Q8cD>292&&S:/=\_;,U=k<*!%$=BSg4>[CcF@:E_XAnPdlCMds-EH6/DGBeF\I=?]tK8#&9
+M2R@SOHPfmQ^F52StD^NUo(&hWi`G.Z*UjH\@K5a^;%P&`Q$!@bKS5Vd*^=lf%8R.g>(N@i8EVT
+jQ5OekiqBum-X60n*olInd"dYo_%nNp@nR]s7u]kr;6KkrVcEgJcD2=J,~>
+JcC<$RfE'[rVc`nr;6Nj!;ZTg!Vc<eoiLeWo()>?n*f]3m-O$%l0%3kjQ#7Yi8<AGg=k32e^W'q
+d*BnZb/hWB`59=)]tCqe[^EHIYcb+/WMcVhU7n3MS!o_1Q'.8jNf8jPLP:@hB52I4J<0\iqN(91
+rfQu;r/h,FPEM)mqiq)FqNUoC"-f(9Pl6mBPkp[@OnFh7OoLU9Om/#1Ockn*PQ$aFOnb+>P67&5
+PEbp-2lWgYXg#(:['mHS]=bkm_8=.0a2lEHbg+P^dF6Uqf@\d1gYCWAi8ESRj5f=ak3(sll07L!
+li-8MmJcPBn,DbSmJZDOli68KklU)3kPjTFjlGM%irS/urnmh7hYu=3gtVh^"khP[f@JLOe:,lp
+dF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f2X[^EKKZa-j?Yck43XK/A$WMl_mVPU)`
+U7n9RT:VXFS"#k7R$a5+Q'IStP*(ieO,f3YN/NRMM26qAKnP)2Jq8H&IsufoI!^0cH$FOWG'8"M
+FE;JBE=-Z'DJj<.Chmg$C&VcHB4h-S!G#^>@L$=L?sd8I?=!P8s'#J,r`T8's&]2#s&B%urDW_o
+s&&_ks%iVhr([2br_*,\r^m)[q+(?Pr'g6Gpd=^@mQmiP#i3(qXJDMZR$di="-o+9Pl6aSOHGQ`
+OH#6YMi*CKLku"b!f2VfrJ(]6KnY8:LPU\@LAlf0KS>,7LPUiUM!@;(6N0@L7/o^U7f>gY84cDP
+8q'E,9heAY:f("e;c?Xr<``C+>$P<=?XR;O@qB7bBPM="DJsN8FEMePH@('hJ:W?,L5:\ENK90a
+PEhK%R[]n@Tq\?[Vl?\uY->1;[C3TU]=bkm_Sa@4aN;WLc-F\`e'ut#f\5'7h;7)JioB+]k3(sm
+lKdg(mdKW6nc/.boCV\Jp%J+RrqQNhs8)Zjrqu`np&9OBRf@m~>
+JcC<$RfE'[rVc`nr;6Nj!;ZTg!Vc<eoi:YUo()>?n*f]3m-O$%l0%3kjQ#7Yi8<AGg=k32e^W'q
+d*BnZb/hWB`59=)]tCqe[^EHIYcb+/WMcVhU7n3MS!o_1Q'.8jNf8jPLP:@J5X\+6r(m;grD*Dg
+r(Z9JrD3Dhr_N>d!)NSh!)<Gfs%i>bqGI/nr`\nrrE/nts&T%tnl>`lrE0)$r)VcX2lWgYXg#(:
+['mHS]=bkm_8=.0a2lEHbg+P^dF6Uqf@\d1gYCWAi8ESRj5f=ak3(sll07L!li-8MmJcPBn,DbS
+mJZDOli68KklU)3kPjTFjlGM%irS/urnmh7hYu=3gtVh^"khP[f@JLOe:,lpdF$=ecHa\YbKJ&M
+aN2EA`Pod5_SX.)^V@Lr]Y(kf\[f2X[^EKKZa-j?Yck43XK/A$WMl_mVPU)`U7n9RT:VXFS"#k7
+R$a5+Q'IStP*(ieO,f3YN/NRMM26qAKnP)2Jq8H&IsufoI!^0cH$FOWG'8"MFE;JBE=-Z'DJj<.
+Chmg$C&VcHB4h-S!G#^>@L$=L?sd8I?=!P8s'#J,r`T8's&]2#s&B%urDW_os&&_ks%iVhr([2b
+r_*,\r^m)[q+(?Pr'g6Gpd=^@mQmoR$g=@0@96H*;GTqZ9DqO19hS2S:/";T9M8#Q91hcH7n?3A
+84Z<C84lKG8OuHH9M.oN8kK"T!)!,_"&DZe:&[rY:?k.C6N0@L7/o^U7f>gY84cDP8q'E,9heAY
+:f("e;c?Xr<``C+>$P<=?XR;O@qB7bBPM="DJsN8FEMePH@('hJ:W?,L5:\ENK90aPEhK%R[]n@
+Tq\?[Vl?\uY->1;[C3TU]=bkm_Sa@4aN;WLc-F\`e'ut#f\5'7h;7)JioB+]k3(smlKdg(mdKW6
+nc/.boCV\Jp%J+RrqQNhs8)Zjrqu`np&9OBRf@m~>
+JcC<$RfE'[rVc`nr;6Njs7uZh#5@ibp%@tKrpj%YnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/Wi)_iU7n3MS!o_1Q'7>kNf8jPLPCIuG^G((TXMMGrk8*@
+!5JEHqS2sD!5\WNs2+oW`lJ&!rlP/^qTJc[r6>8eps&c_rQP>PpUC.1r3l[9dCB:f\bE]0]D0#n
+W2cr$YHY@?[^WfY]Y2(q_Sa@4aN;WLcHjkbe'uq"f@em4gtgiFi8N\UjQ5OdkNMp0!p]+;rp9[P
+s6f1@rpKgRrTsRMs6BRI!pJh1roOIIjQ,@]io8qrhuV`lrnW(ZgY1B7g"=p.f%&:"e'c[ldEp4b
+cHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xt_b\@8oT[C!9HZE^X<Y-"h-X/`2!W2HPiUnjc[TqS-O
+St2C@S!ob4R$X,(Q'7AoOcYWbNfB!VMi*@JLPCP;KS+o/JUi9#IXQWlH[9uSH$FOWG'.qLFE;JB
+EH#i6DJa6,CMR[!rb)=FB)Z?BA7PUJ#@V"J?XI,G?2e+/>6%k+=oVV(=8l8#<<-"s;u]bq;>j>k
+:]=,e:&dod9D_?\8cD9V8,PjS7J0(D6hE_56)sqinEJueeBZ7ZrlG,[(rXD1_SO(']t_Cr]Xt_`
+[^W]P[C*HOZaTk?&@T!S['[-GZEpmEZa-g=Ycn#0!OT?([cp*V6N':K7/o^U7f>i(84cBF8kVfN
+9heAY:f("e;c?[s<``F,>$P<=?XR;OA7]@dBkhF#DK'T:FEMePH@1-jJ:`E-L5:_GNK90aPa.T&
+S"-(BTqeE\VlHf"Y->4<[C3TU]Y2(q_Sa@4aN;WLcHjnce'ut#f\5*8h;@/LioB+^k3)!n''efL
+mI'H3nF?)?oCV\Jp%J.SrqQNhs8)Zjrqu`np&9OBRf@m~>
+JcC<$RfE'[rVc`nr;6Njs7uZh#5@ibp%@tKrpj%YnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/Wi)_iU7n3MS!o_1Q'7>kNf8jPLPCIf@qT_(IYs/GqN'j%
+qiUl@s-*AFrg!>Er07AKQ'IU4Q2$U?PlR-DOoCIAOnt1>OT:L5Om%r/Oco^-rf[5Bq3(H80rV+R
+Xfnt8['mHS]"G_k^r"".`lQ9Fbg+P]dF6Uqf@S^0gYCWAi8ESRj5f=ak3(t-klU/9li-8NmJlV>
+n,DbTmJZDOli68KklU)3kPjTKjlGL_j5T(Wrnmh7hYu>\gtUQ:g"G$0f@JL%eC2jodF$=ecHa\Y
+bKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(ke\[],W[^EKKZa-j?Ycb+1XK/A$WMl_mV50o^U7n9RT:VUD
+S"#k7R$a5+Q'IPrP*(ieO,f3YN/NRMM2-h?KnP)2Jq8H&IsufoI!^0c(O:7LGBS+OFEDSEEH,r9
+DJj<.Chmg$C&VcHB4h-S!G#^>@L$=L?sd8I?=!P8s'#J,r`T8's&]2#s&B%urDW_os&&_ks%iVh
+r([2br_*,\r^m)[q+(?Pr'g9Hpd=[?mQmrS%I:s<Xf%k`S!TM0Q^3p9PQ6mFOW9ICO,T'XMi*@K
+M2@"DLPCS>L5(J>Lkgb>Knb?]LB<9cK`6T-L4t>9M2CYVks>87rBpHMs$crWrC;3*8P)NH91qrQ
+9hnJ\:f1+h;cQk!='8[0>[1TB?t!MTAS,UiC27[(E,fr@Fa&(VI!pKpJqJc3Ll..NO-#NhQ'[l-
+S=Z@HUSOcbWiN8)Yd1UC[^`l\]t_A"_o9X:aihoRcdC.heCN7(g=tE=hr*JQj5f@bkNV4DlKdg(
+mdKW6nac8Bo^qhLp@n=\q#C0iqY^6ir;HTerdk*<s*t~>
+JcC<$RfE'[rVc`nr;6Njs7uZh#5@ibp%@tKrpj%YnF,f4m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/Wi)_iU7n3MS!o_1Q'7>kNf8jPLPCIL6UaI79288Yr_WPh
+!)EGdn4s!ZpeLc`s%rYiq+q&er_<Gfr_EJhp/(Q^!EWCg=TDRt<rc;!<W#kt=85er=8l;%=8GtY
+=#$YRXKA\1Za@0M\[oGe^VI_(`Q$!@bKS8Xd*^=le^rF+g=tE=hVd>NioB+]k2tjjrojLLlg+Q:
+s6]jSlL4`?s6]dOs6K^MrTOCIkNDj,#Nb%-j5].YiVqa9hqn@gJ)&f4g=b03f@SU(eC;sqda?Ih
+cd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i\[f5Z[^NTNZa6sBYct:4XfSS'Wi;qpVkp2bUS=HU
+TV%gHS=?":R@'A.QBd`!P*1rhO,o<\N/W[PM2@"BL4t;5K7\Z)J:E#rI=-BfH5CjOGB\4QF`__H
+EcH)<Df0H0D/=!'C2*Z\!G?$DAH?=OraH+@?sm>K?=$q:>lS".>5h\)=T;J%<rZ/"<;fbq;ZBVm
+;#a>j:Adid9`@]^9)_E]8GPdR7f5^J7/0.A6LI.Aru]%2Alr#2;G^(^91qrP92/)S9hnAT9MJ,Q
+8kVcJ7n3JK!(m,[s%*bo8P2NH9MA&Q8kM`L9M/&Rr_3Pi9hnGX:B"&[:?b(C6N':K7/o^U7f>i(
+84cBF8kVfN9heAY:f("e;c?[s<``F,>$P<=?XR;OA7]@dBkhF#DK'T:FEMePH@1-jJ:`E-L5:_G
+NK90aPa.T&S"-(BTqeE\VlHf"Y->4<[C3TU]Y2(q_Sa@4aN;WLcHjnce'ut#f\5*8h;@/LioB+^
+k3)!n''efLmI'H3nF?)?oCV\Jp%J.SrqQNhs8)Zjrqu`np&9OBRf@m~>
+JcC<$RfE'[rVc`nr;6Njs7uZh?2+'dp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*L"]bK7fD`59@*^:_%f\$iZLYck10Wi2ejUS4<OS=5h3Q'7AmNf8mQLPCJ7G'e_!Q_VP!^%]85
+^BMEf^VIY$rk\lU_Sa@3`lJ)"rlP/^qTJ`Zr655eps&c_qoo2Q\@D":s1$Fds1/3@rON'@]"7[K
+q7JSbX0&S0ZEq!K\[oGe^VI_(`Q$!@bKS8Wd*^=le^rF+g=tE=hVd>NioB+]k2tjjl07Kuli-8N
+mJlVNn+H2Hn,DbTmJZDOli68Ll2TuIkPjTEjlHF$s5FOIi8EMMhVI#CgtUQ:g"?;UIb*'!eC2jn
+dEp7dcHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lq]Xtbc\[],W[^EKKZa-g>YHG"0XK/A$WMl_lV50o^
+U7n9RT:VUDS"#k7R$a5+Q'@JqP*(ieO,f3YN/NOLLkg_>KnP)2Jq8H&IsufoI!^0cH$FOWG'.nK
+s)SWiEH,r9DJj<-Chmg$C&VcHB4h-S!G#^>@KBnFra5\3!+#S/!aAi3r`T8'!*B,"!``3!rDW_o
+s&&_ks%iVhrD!8br_*,\r^m)[q+(?Pr'g6Gpd=^@mQmuT&bt_UiRZ>ub/hWE`Q#m8_o'=h^C@oj
+]t1b_\$icR['R3Lrj2[5rNm'?Za-sDZa7$FZ*1@8YHe)2!jf>Em^DCHr'L?LqaCHQs$luXs%!,]
+r^qZ59MA/T:/=\_;,U=l<E<.&=]ns6?!^lG@U`kZAnYmoCMds.EH?5FGBnL^I=Hd!K8#);MN!OU
+OckroQ^O>5StMdPUo()jX0&S0ZEpsI\[oGe^VI_(`Q$!@bKS8XdF-Oof%8U/gYL]Ci8N\UjQ>Uf
+l07L"m-X60n*olIncA@Srq-?dp\4[^s7u]kr;6KkrVcEgJcD2=J,~>
+JcC<$RfE'[rVc`nr;6Njs7uZh?2+'dp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*L"]bK7fD`59@*^:_%f\$iZLYck10Wi2ejUS4<OS=5h3Q'7AmNf8mQLPCJ7@V9J!H\.FWO6D])
+OoLLCOo:IBPQ$gGQ26aCPlm89Q'D64pltW?rg)r6plP*0jHBP,!KiQEOTLW,Ont4APEPa*26*^Z
+YHY==[^WfY]Y2(q_Sa@4aN;WLcHaeae'uq"f@em4gtgiFi8N\UjQ5OdkNM0plK[^7m/QJQmeZDF
+nG;VQmf2\Qm/QDOlMg&Jkl9iFjoOT)ro=%<%cQ@(hr!;Hh;$f?g=k64rmuVMe^W*tda?Ihd*L"_
+c-4ASb/q`Ga2Z*;`5BI/_8*h#^:_+j]",A]\$i`Q['R*EYct=6Xf\\*WiE%sVl$;dUnaZXTqJ$L
+SXc1=R[KP1Q^3o$PEM)kOH5H_NJrgSM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]GB\4QFEIP(%<?H.
+E,TW3D/=$(CMIS_BE;aXrac+@A,]p<@:9(As'>\2r`fM/>$Co.s&]8&rDiu"<)ifps&/korD<Mi
+r_EDdr_3;aqb$iZr^ciTr'pTQoL/IAog8(4Y5]'d\#ua)Ssu+7Q^F,*Q'@MsrfR_PNf]6ZNf8pT
+M2I1IM#N/AL51M=Lk^\?L4t>9L51M=LkP_Z!/CK,!f;_jmYL-or'L?LqaCHQs$luXs%!,]r^qZ5
+9MA/T:/=\_;,U=l<E<.&=]ns6?!^lG@U`kZAnYmoCMds.EH?5FGBnL^I=Hd!K8#);MN!OUOckro
+Q^O>5StMdPUo()jX0&S0ZEpsI\[oGe^VI_(`Q$!@bKS8XdF-Oof%8U/gYL]Ci8N\UjQ>Ufl07L"
+m-X60n*olIncA@Srq-?dp\4[^s7u]kr;6KkrVcEgJcD2=J,~>
+JcC<$RfE'[rVc`nr;6Njs7uZh?2+'dp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<AHgY1?4f$r0r
+d*L"]bK7fD`59@*^:_%f\$iZLYck10Wi2ejUS4<OS=5h3Q'7AmNf8mQLPCJ76UXF891r"Y;#O/k
+:/+I^:Amu]:B"&`:B"&h;#O2c:]O;j:&n#f:B+,`;"mid<rc@g=TDRs<rc;#<W,ts<rlE)qc<Vr
+q,ZWZ26*^ZYHY==[^WfY]Y2(q_Sa@4aN;WLcHaeae'uq"f@em4gtgiFi8N\UjQ5OdkNM0plK[^7
+m/QJQmeZDFnG;VQmf2\Qm/QDOlMg&Jkl9iFjoOT)ro=%<%cQ@(hr!;Hh;$f?g=k64rmuVMe^W*t
+da?Ihd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:_+j]",A]\$i`Q['R*EYct=6Xf\\*WiE%sVl$;d
+UnaZXTqJ$LSXc1=R[KP1Q^3o$PEM)kOH5H_NJrgSM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]GB\4Q
+FEIP(%<?H.E,TW3D/=$(CMIS_BE;aXrac+@A,]p<@:9(As'>\2r`fM/>$Co.s&]8&rDiu"<)ifp
+s&/korD<Mir_EDdr_3;aqb$iZr^ciTr'pTQoL/IAog8(4Yl=mcT6+F?<;o]C9MS2R9M8)R92&)S
+8k_uS8kMcL7n6*?84Q3@84c?C8P2QG7nQHK8kf4V%80Ae9h\5T9h\8V9hnF]:\%9G62X(J6i0:O
+7K5jV8,l*[8cD>392&#R9hnJ\:f1+h<)lt"=BSd2>[:ZC?t*SUAS,UiCMRd)E,fr@G'A4XI!pKp
+JqJc4M2I7OO-,TiQ'[o.S=ZCIUSOccWiN8*Yd1UC[^iu^]t_A"_o9X:aihoRcdC1jeCN7)g=tH>
+hr*JQj5f@bkNV6rm-O--n*fc9s7-3^o`"Lbp@n=\q#C0iqY^6ir;HTerdk*<s*t~>
+JcC<$RfE$Zrr)ior;6Njs7uZh?ha9fp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iF`PTI+^:_(g\$iZMYck11Wi2hkUS4<OS=>n4Q'7AmO,T!RLk^S8E-ZheNM!_n]_]>@
+^AbnD^AG\F_#2"P_Sa=2`lJ)"rlP/^qTAo`bP]T^c2Z)bc2GrablH&e\F6op\Dt-r])B/>])'&8
+]JZ^iXfen6ZaI6O]"G_k^r"".`lQ9Fbg"G[dF6Uqf@S^0gYCWAhr*JQj5f=ak3(sml0@U#rp0^R
+mdBu@r:'RQr:'ROs6fpSrTsRMs6BUJs6'IGroX7B!9F.>IcB>Fi8EMLhVI#CgY:H9g"=p.f%/C$
+eC2jndEp4bcHXSWbKJ&MaN2EA`Pod5_SO%&^V7Co]Xtbc\[],W[^EKKZE^X<YHG"0XK/A$W2HPj
+V50o^U7n9QSt;LCS"#k7R$a2)Q'@JqP*(ieO,f3YMi*@JLkg_>KnP)2*eJrnJ:E#rI=-BfH?jaZ
+GBS+NFE;JCEH,r9DJj<-rbDOLC&VcHB4h-S!G#^>@KBnFra5\3!+#S/!aAi3r`T8'!*B,"!``3!
+rDW_os&&_ks%iVhrD!8br_*,\r^m)[q+(?Pr'g6Gpd=[?mm4/W)Y!"Lf[7mbb/jV_`Q#g6_ns:*
+^V7Is^:_"erjMj7#.1_F[^3?GrjDd5!4)U1$+.%HZa-g=Yck>2YQ;&=m'c1Fr'L?Lr'^NQs$luX
+s%!,]r^m2a9`@b8:/=\_;,U=l<E<.&=]ns6?!^lG@Uiq[B4u!pCi4-0EH?5FGBnL^I=Hd!KSG8=
+MN!RVOckrpR$jG6StMdPV5L8lX0&S0ZEq!K\[oGe^VI_(`Q-'AbKS8XdF-Opf%8U/gYL]Ci8N_V
+jQ>Ugl07L"m-X60n*ol<o(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?s-it<~>
+JcC<$RfE$Zrr)ior;6Njs7uZh?2+'dp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iF`PTI+^:_(g\$iZMYck11Wi2hkUS4<OS=>n4Q'7AmO,T!RLk^S8?Y*qlG^tbJO62Q(
+OoCOCPQ$gGQ26aDQ2d'MQ'@O2Q2-[@Q2['MQ'U`uplP33j-'A)!g8\.rK%#AqN:iBqiWh:X0&P/
+ZEpsI\@T>d^VI_(`Q$!@bKS5Vd*^=le^rF+g=tE=hV[8MioB+]k2tjjl07L!li-5PmI'E>n,2\O
+nbhnQn,MhUmJZDOli68Ll2TrIkPjWDjT+B@j*p"HiS`YOhVR)EgtUT;g=b-1f@JO'eC;sqdF$=e
+cHa\Ybfe2PaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTNZa-j?Yck43XfSS'Wi2hnVPU)aUS=HU
+T:VXFS=?":R@'A-Q'IStP*1rhO,o<\N/NRMM26qAL4t;5K-#VqJ:N,uI=6KiH?sj]GB\4QFEDSE
+EcH)<Df0H0D#S2NC2*Z\!G?$DAH?=OraGn:@/aO5?3":1>QS,5>5h\)=9)G$<WZ9#<;fbq;ZBVm
+;#a>j:Amod9`@]^9)_E]8GPdR7f5^I7/0.A6LR4FruL==ZE0prSX>_1QiI)NQB[VrP*1rhO,o9\
+Nf8pTrJCQ1"G_\dL5,\_'o7TuKnb88L51M:K7nl0L4t>9Ll%#VM!@;(6N':L7/fXT7fGpX8,u6\
+8c_RYr_7i::Jakb;H$Op<`W=*=^,-:?=.)L@q9.`BPD6uDJjE5F*)SLH$XjdIt3-(L51VCN/is]
+P*D9"R@B_<TV8-WVl6VrXfnt7ZaR?R]"G_k^r"".a2lBGbg+P^daZguf@em4h;-uHiT&tZk2tml
+l0@X%mI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFARf@m~>
+JcC<$RfE$Zrr)ior;6Njs7uZh?2+'dp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f$r0s
+dEg+^bK7iF`PTI+^:_(g\$iZMYck11Wi2hkUS4<OS=>n4Q'7AmO,T!RLk^S86UO118PMtW:]O;h
+:Amu]:B"&`:B"#h;#F,b;#X5i:&[lf:]=/j;>F&_;?'Jj<rc@g=TDRs=8Q%s=8l;%=8Q"u=8,bo
+<rc@h=#I"YXfen6ZaI6O]"G_k^r"".`lQ9Fbg"G[dF6Uqf@S^0gYCWAhr*JQj5f=ak3(sml0@U#
+rp0^RmdBu@r:'RQr:'ROs6fpSrTsRMs6BUJs6'IGroX7B!9F.>IcB>Fi8EMLhVI#CgY:H9g"=p.
+f%/C$eC2jndEp4bcHXSWbKJ&MaN2EA`Pod5_SO%&^V7Co]Xtbc\[],W[^EKKZE^X<YHG"0XK/A$
+W2HPjV50o^U7n9QSt;LCS"#k7R$a2)Q'@JqP*(ieO,f3YMi*@JLkg_>KnP)2*eJrnJ:E#rI=-Bf
+H?jaZGBS+NFE;JCEH,r9DJj<-rbDOLC&VcHB4h-S!G#^>@KBnFra5\3!+#S/!aAi3r`T8'!*B,"
+!``3!rDW_os&&_ks%iVhrD!8br_*,\r^m)[q+(?Pr'g6Gpd=[?mm4;[-2bB,Alr#1;G^%^9M=fh
+92/,S9MJ2P9MJ5R91qlI7n?0@8P)GM8-MUW84cEIr_*8`%80Ae9h\5T9h\8W:/=U^:\%9G62X(J
+6i9@O7K5jV8,l*[8cD<_92,=ZISN[8:f1+h<)lt"=BSd2>[:ZC?t*VVAS5[jCM[m+E,fr@G'A4X
+I!pKpJqSl6M2I7PO-,TiQC+)0S=ZCIUSXleWiN8*Yd1UD\%0)_]t_A"_o9[;aihoRcdC1je^i@*
+g=tH>hr*JRj5f@bkiq?sm-O--n*fc9o()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD2=J,~>
+JcC<$RfE$Zrr)ior;6Njs7uZhs7]akp%@tLoCDJBnF,i6m-O''l0.<mjlGI\i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]R-^:_(g\@/cNZ*1:2Wi2hlUS4?PS=>q5Q'@GnO,]'SLk^S8Cj:8YN1[KQ^%B&9
+^C\2q^qde&^r""-`Q#s>aN)C$aoBN[b5oi1qonZVrQb8as3CGMoXFe-!4VL.ijnlrr4)g=qRca>
+4MAD.Xfen5ZaI6O\\#Mh^r"".`lQ6DbK\>ZdF-Opf%8U/gYCWAhr*JQj5f=ak3(sml0@U#m-O-,
+mdC&BrUBFKrUB^Qs6fpSrTsRMs6BUJs6'IGroX7B!9F.>!TN);i!/)qhVI#Cg]#oVg"=p.f%&=#
+eC2jndEp4bcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EHJZE^X<YHG"0XK/A#W2HPj
+V50o^U7n6PSt;LCS"#k7R$X,(Q'@JqP*(ieO,]*WMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FOW
+"a5$1FE;L%E<U<"DJj<-rbDOLC&VcMB4b^dA7T3L@KBnFra5\3!+#S/!aAi3r`T8'!*B,"!``3!
+rDW_os&&_ks%iVhrD!8br_*,\r^m)[q+(?Pr'g6Gq*Xd@m6S)Y$1mBAhpfuqaiDF"s!GS#_ns7*
+^V.Cr^:Ukb[^ENM[C!<L[^3?G[C*BJZEgaBZEppFZMgs,Z2Us/ZaR@1[cp*U6N':L7/o^T7fGpX
+8,u6\8c_RYr_7i::Jakc;c?Xq<``C+>$G6;?XI5N@qB4aBPD6uDJsN8F*)SLH$XjeJ:W?+L51VD
+N/is]P*M?#R@Bb=TV80XVl6VsXfnt8['mHS]"G_k_8=.0a2lEHc-FY_daZh!f@em4h;7&IiT&t[
+k2tmll0I^&mI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFARf@m~>
+JcC<$RfE$Zrr)ior;6Njs7uZhs7]akp%@tLoCDJBnF,i6m-O''l0.<mjlGI\i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]R-^:_(g\@/cNZ*1:2Wi2hlUS4?PS=>q5Q'@GnO,]'SLk^S8?"7MaFFT/CO8P+8
+O7SJ5OoCODP66u3Pa)04qNUrDs-*SMPa)-3pltW?rg!VNQBqN3l]Lt(q2s["r0./D!0R2@!0Qr;
+3ifBcYd(OB[^`l[]YD8!_o9X:aND]NcHsteeCE.%g"P39h;7&IiSrnYjlY^gkiq?slg*p(mHs?0
+rU9^SoC;eKqsXRQs6]dOs6K^MrosIH!9a@Ds5a7Aro4%=iVqa>hqm5Gh;$cag4.f.f@SU(e^W*t
+da?Ihcd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`QZa6sBYct=6Xf\\*Wi;qpVl$;d
+UnaZXTV%gISXc1=R[KP0QBd`"PEM)kOH5H^N/W[PM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]GBX46
+F`__HErL%^E,TW3D/B2e!GZ?JBEi*]AS#C_A,]p<@:9(As'>\2r`fM/>$Co.s&]8&rDiu"<)ifp
+s&/korD<Mir_EDdr_3;aqb$iZr^ciTr'pTQoL/LBoKqq2[/U?[[B6@#SsoVEs8NQ#eWc;\P*(if
+O,f6[NW+h[Ll$qELkgb?LPLS<LPL\?KS>/8LP:J;KnG&3L4t>9LkprUM!75'6N':L7/o^T7fGpX
+8,u6\8c_RYr_7i::Jakc;c?Xq<``C+>$G6;?XI5N@qB4aBPD6uDJsN8F*)SLH$XjeJ:W?+L51VD
+N/is]P*M?#R@Bb=TV80XVl6VsXfnt8['mHS]"G_k_8=.0a2lEHc-FY_daZh!f@em4h;7&IiT&t[
+k2tmll0I^&mI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFARf@m~>
+JcC<$RfE$Zrr)ior;6Njs7uZhs7]akp%@tLoCDJBnF,i6m-O''l0.<mjlGI\i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]R-^:_(g\@/cNZ*1:2Wi2hlUS4?PS=>q5Q'@GnO,]'SLk^S86UO:27S?JR;"m`c
+:Adi`:Amu`:A@W\;#X5i:&[lf:\@QY;?'Gm:]=Dm<rc@g=TDRu=8uA(=&rB#=8Q)"=8Q"u=8>nq
+=8c7i=$!CaY->1;[C3TU]=bno_Sa@4aN2NIc-F\`daZguf@em4gtgiEi8N\UjQ5OdkNM0plKdd&
+m-X3.meuVQnFQ2KnGD\Smf2\Qm/QDOlMg&JkQ'fFk5XNCjSn0?io0mp#2e:oh;-l@rn;kTf[na+
+e^`1!e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[Bm3FZ*:I9Y-"h-X/`.t
+Vl-DgUnjc[TqJ$LSt2C@S!ob4Q^3o%P`q8nOcYWbNJrgSMM[1GLPCP;KS+o/JUi9#IXQWlH[:!`
+G^"?8G'.nKF)q8""`SBtDJa4hCB80arb)LKAn>OaA7PUJ!F]C8?iOF4?2e(1>?Y50=oVS(=8c/$
+<E)rr;u]bq;>j>k:]=,f:&[ic9D_?\8cD9V8,PjS7J'"D6hE_46+6e"eX(5Y<)lal9ht[\$.uMH
+F%o>&:.\%V9`7W`8,l-[8c;0l8P2TH8P2TK92%rM91quN9hbL["&DZe:&@`X:?b(B6N':L7/o^T
+7fGpX8,u6\8c_RYr_7i::Jakc;c?Xq<``C+>$G6;?XI5N@qB4aBPD6uDJsN8F*)SLH$XjeJ:W?+
+L51VDN/is]P*M?#R@Bb=TV80XVl6VsXfnt8['mHS]"G_k_8=.0a2lEHc-FY_daZh!f@em4h;7&I
+iT&t[k2tmll0I^&mI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrqucoo_sFARf@m~>
+JcC<$RfE$Zrr)ior;6Njs7uZhs7ZNerq0CcoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@/cNZ*:@3Wi;nmUnOHQS=>q6Q'@GnO,]*TLk^V9JTZ9gNKp3Rqn;sB
+rOr-Cr4i9G!5JHI"N&'p`Q%ks!6G/]s2t2]!mJj2r64cWrm(>as3CYjr3u[8pUBq+rjMs=\$u1C
+jgbB$rjhd7r42j=qR\SsWi`G.Z*UgG\@K5a^;%M$`5Td<b0/&Td*^:ke^i@)g=tE=hV[8MioB+]
+k2tjjl07L!rp9[P!:KgSrp]jUq""@QrUBaRs6fpSrTsRMs6BUJs6'IGroO:DjQ-=#!TN);huV`l
+rnRV1g]#n1g"=p.f%'cLI+-NkdEp4bcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[C!9H
+ZE^X<YHG"0X/`2!W2HPjV50o]TqS-OSt;LCS"#h5R$X,(Q'@JqP*(ieNfB!VMi*@JLkg_>KnP)2
+Jq8H&IsufoI!^0cH$FOWG'.nKF)q8""`SBtDJa4hCC=lkBP;$kAn>OaA7PUJ!F]C8?NOP>?2e(1
+>?Y50=oVS(=8c/$<E)rr;u]bq;>j>k:]=,f:&[ic9D_?\8cD9V8,PjS7J'"C6hNe56+6e"q<d;$
+f?_X_aN"/X!VkjW_?[fi^:h7o]=7dJ(U^TW['R3JZEpdB['R*EZE^gDZaI-DYPk[.YHY:>\*UQf
+62X(K6i0:O7K5jU7fl4Q8cD>392&&S:/=\_;,U=k<)lt#=BSg3>[:]D@:E_XAS5[kCM[m,EH6/D
+GBeF\I=?]tK7nu8M2R=QO-5]lQC+,1SXuOLUnsugWiW>+Z*UgG\%0,`^;%M$`5Td<b0/&Td*^:k
+e^rF+g>(N@hr*JRj5oFdkiq?tm-O--n*fc9s7-3^o`"Lbp@n=\q#C0iqY^6ir;QZerdk*<s*t~>
+JcC<$RfE$Zrr)ior;6Njs7uZhs7ZNerq0CcoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@/cNZ*:@3Wi;nmUnOHQS=>q6Q'@GnO,]*TLk^V9JRW2*FF&J"qiC`<
+pQ,66s,[#<s,m2A!gAk5rg!>ErK[DI!gT"7rK[/BqN_&G!1!MKs,[/@oT9-8q2tH6qN9s(!0Qu<
+s,m5@s,m,?1TIR[Yd(OA[^`l[]Y;.s_SjF6aND]NcHsteeCE.%f\5*8h;7&IiSrnYjlY^gkiq?s
+li-8Nm/ZSQn,DhSnbD\QnbqtTn,MhUmJZDOli68Ll2TrIkPjTFjlGM%irS/urnmh7hYu=3gtVh^
+"khP[f@JLOe9o`ndF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^EKKZa-j?Yck43
+XfJJ%WMl_mVPU)aU7n9RT:VXFS=?"9R$a5+Q'IStP*1rhO,f3YN/NRMM26qAL4t;5K7\Z)J:E#r
+I=-BfH?jaZGBS+NFE;L%E<U<"DJj<-rbDmVBkV0mB4b^dA7T3L@KBnFra,_5?![G7!aAi3r`T8'
+!*B,"!``3!rDW_os&&_ks%iVhrD!8br_*,\r^m)[q+(?Pr'g6Gpd=^@m6S5]0&jOIWM6&UR@'>,
+s8VuXbdsd:P*(ieO,f6[NJ`XOM26tELkgb?LPLV>L51S=re(c8L51J9KS+o1L4k;9Ll(JSks>56
+r^6QNs$crWrC6o[8P/nRInNI09hnJ\:f1+h;cHat='/U/>?kH@?X[DRAS#LfC27X'DfKf>Fa&(V
+H[U?nJV/W1Ll%%KNfT?eQ'Rf+S"6.EU84W`WN*&%YHbF@[^WfZ]Y;.s_SjF6aND]NcHsteeCE1&
+g"P6;hV[8Mj5]7`kNM0plg4!*mdKW6nc/.\oCW%T!quB_rqQNhs8)Zjrqucoo_sFARf@m~>
+JcC<$RfE$Zrr)ior;6Njs7uZhs7ZNerq0CcoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@/cNZ*:@3Wi;nmUnOHQS=>q6Q'@GnO,]*TLk^V9JO2^o7nQBLr_W>b
+!)EGdqG.#cpeLT[q,%&cs%WJf!)N8apJLre"A_ij<E9$!r)`\sr`Jhrs&f/"r)io!pfIPu<rH)#
+<`f0!r`AqunlIWIXfen5Za@0N\\#Mg^VRe*`Q-'BbK\>ZdF-Opf%8R.gYCWAhr*JQj5f=ak3(sm
+l0@U6m/QGQmeuVRnGMhOo)/%VnGMbTmf2\Qm/QDOlMg&JkQ'fFjoXZ*jSn0?io0mp!T2c5h#Z<c
+rn7P/f[na+ec+'Ge'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oS['R*EZ*:I9
+Y-"h,WiE%sVl-DgUnj`YTqJ$LSt2C@S!fY2Q^3o%P`q8nOcYWaNJrgSMM[1GLPCP;KS+o/JUi9#
+IXQWlH[:!`G^"@TF`__HErL%^E,TW3D/B2e$YjBhBP1siAS#C_A,]p<@:9(A!a]/<r`fM/>$Co.
+s&]8&rDiu"<)ifps&/korD<Mir_EDdr_3;aqb$iZr^ciTr'pTQoL/IAog8%3\c3cBXaXb]<)?Ih
+9MS5RjLq"7D-Kk39M%fL9M7uN9M%bQ8,u6\8-2:P9)_Bh84lKI92%rM92%tU9a+3d9hnDXqbQfY
+ks>56r^6QNs$crWrC6o[8P/nRInNI09hnJ\:f1+h;cHat='/U/>?kH@?X[DRAS#LfC27X'DfKf>
+Fa&(VH[U?nJV/W1Ll%%KNfT?eQ'Rf+S"6.EU84W`WN*&%YHbF@[^WfZ]Y;.s_SjF6aND]NcHste
+eCE1&g"P6;hV[8Mj5]7`kNM0plg4!*mdKW6nc/.\oCW%T!quB_rqQNhs8)Zjrqucoo_sFARf@m~>
+JcC<$RK)sZrVc`nrVQWks7uZhs7ZNerq0RhoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEg+_bK7iF`P]R.^V.:j\@/fOZ*:C4Wi;nmUnXNRSXZ%7QB[PpO,]*ULk^V9JoGp\LQ.q9]tD"k
+^&>\F^&5SE^%oDA^])"P_8F41`Q%nt!6G,\!6Y2^s31Mdr64cWrm(>as3CShrO2^7rj_^3ppU(/
+qRGh$!4_m9q76R:rjr'=rjr$>1TIOYYd(OA[^WfZ]Y;.s_SjF6aND]NcHjndeC<($f\5'7h;7&I
+iSrnYjlY^gkiq?sli-5PmI'E@n,MnUnac8Lnc&%Un,MhUmJZDOli68LklU)3kPjTKjlGL_j5T(W
+rnmh7hYu>[gtUQ:g"=s/f@JL%eC2jodF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[],W
+[^EKKZa-j?Yck43XK/A$WMl_mVPU)`U7n9RT:VXFS=>t8R$a5+Q'IStP*1ofO,f3YN/NRMM26qA
+L4t;5K7\Z)J:E#rI=-DAH4kLJGB\4QFEDSEEH,r:Df0H0D#S2]C2%?pB4kgfARo=]@U`bS@/aL7
+?<pk9>QS,5>5hY+=BAT&<WZ9#<;fbq;ZBVm;#a>k:Adic9`@]_9)V?\8GPdS7f5^I7/0.A6L@(K
+rsA5Xi7cZ*b/q`ErVmr;n_rQY_7m_!]Y1th\@&fR[Bd3IZaI*DZEU^CZa9Y:"LGJ@Za0S7!3c@*
+!OT?&[cp*U6N':K7/o^U7f>i,84cBF8kVfN9heAY:f("e;c?Xr<``F,>$P<=?XR;O@qB7cBPM="
+DJsN8FEMePH@('hJ:W?,L5:\EN/s'`PEhK%R[]k?Tq\?[Vl?\tY->1;['mKT]=bkm_8=.0a2lEH
+c-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg'"RY[HnF?MK#4qK[p%J+RrV-HiqYL-erqu`no_sFA
+Rf@m~>
+JcC<$RK)sZrVc`nrVQWks7uZhs7ZNerq0CcoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEg+_bK7iF`P]R.^V.:j\@/fOZ*:C4Wi;nmUnXNRSXZ%7QB[PpO,]*ULk^V9JmW&&EHZhhr/^f<
+qN(Z:qN(K7s,dAGOcfX+!gAk5rg!AFr0@;H!gT"7rK[/BqN_&G!1!GIrK$r>oT9-8q2tH6s,m>C
+rfQT2!0Qi8"-Jb/Oo:C;OYa#=Xg#(:['mHS]=bkm_8=.0a2lEHc-FY_daZdtf@\g2gtgiEi8N\U
+jQ5OdkNM0plKeH9!q#FDrU9dUrUKILrUKmVr9s[Rs6]dOs6K^MrojLJkNDj,#Nb%-j5].YiVqa9
+hqn@gIb`]3g=b-2f@SU(eC;sqda?Ihcd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",>[[^NTN
+Za6sBYct=6XfSS'Wi;qpVl$;dUS=HUTV%gISXc1<R@'A.QBd`"PEM)jO,o<\N/W[PM2@%DL5(D8
+K7ec,J:N,uI=6Kis*><'G^"@TF`__HEcH)<E,TW3D/B2e&8GomBP1siAS#C_@q&nU@:9(A!a]/<
+r`fM/>$Co.!a&N*rDiu"<)ifps&/korD<Mis%`Jdr_3;ar(?oZr^ciTrC6]RoL/IAoKqq2])N$,
+b-e=KTUhSNQiI'tmEr_TVPK]DOHGTaNJrgRMi.IhreCo:KnkD<L51P<KSG/6re:`5K7no4KnY8<
+MX6/`62X(J6i0:O7K5jU7t4'$8P2TJ92&&S:/=\_;,U=k<*!%$=]np5>[CcF@:E_XAnYjmCMds-
+EH6/DGBeF\I=?]tK8#&9M2R=ROHPfmQ^F52SY)UMUo(&hWiWA-Z*UgG\@K5a^;%M$`5Td<b0/&T
+d*^=le^rI-g>(N@i8EVTjQ5OekiqBum-FlBn*fc9rpg9bo_%nNp@nO\!r;]hr;6KkrVcBfJcD2=
+J,~>
+JcC<$RK)sZrVc`nrVQWks7uZhs7ZNerq0CcoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEg+_bK7iF`P]R.^V.:j\@/fOZ*:C4Wi;nmUnXNRSXZ%7QB[PpO,]*ULk^V9JjVjl7Rp*Ir)!5c
+!)EGdqG.#cqG-`[qbR;j;#X5i:&[lf:\@QY;?'Gm:]4,g<W6%t=8uD!=oMOr=oVV%=8Q)"=7oZ#
+='/R+='/R+rDro!rE'&&rE/_o1TIOYYd(OA[^WfZ]Y;.s_SjF6aND]NcHjndeC<($f\5'7h;7&I
+iSrnYjlY^gkiq?sli-5PmI'E@n,MnUnac8Lnc&%Un,MhUmJZDOli68LklU)3kPjTKjlGL_j5T(W
+rnmh7hYu>[gtUQ:g"=s/f@JL%eC2jodF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[],W
+[^EKKZa-j?Yck43XK/A$WMl_mVPU)`U7n9RT:VXFS=>t8R$a5+Q'IStP*1ofO,f3YN/NRMM26qA
+L4t;5K7\Z)J:E#rI=-DAH4kLJGB\4QFEDSEEH,r:Df0H0D#S2]C2%?pB4kgfARo=]@U`bS@/aL7
+?<pk9>QS,5>5hY+=BAT&<WZ9#<;fbq;ZBVm;#a>k:Adic9`@]_9)V?\8GPdS7f5^I7/0.A6L@(N
+s"qfVCKjb::f0q^9hS1&V2B;%<DQ:[84cNL91hiM8k2EB84c?B7n?-?8P)HE7nQBH91hhU9+"9c
+9MJ5S9hnGX:ARcY:?b(B6N':K7/o^U7f>i,84cBF8kVfN9heAY:f("e;c?Xr<``F,>$P<=?XR;O
+@qB7cBPM="DJsN8FEMePH@('hJ:W?,L5:\EN/s'`PEhK%R[]k?Tq\?[Vl?\tY->1;['mKT]=bkm
+_8=.0a2lEHc-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg'"RY[HnF?MK#4qK[p%J+RrV-HiqYL-e
+rqu`no_sFARf@m~>
+JcC<$RK)sZrVc`nrVQWks7uWg!Vc<eoj%.\o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WMcVhU7n0LS!fY0Q'.8jNf8jPLP:A4CNarRN0pBZ]Y2#X
+^A,D;^AYhH^^.co_o0O6`lH.!aT'?^b59?^bl,`_bk00ZcM>`acMl,id/(3M\,*T7\+7!*\,Wr<
+\,Ei'\H'5<\am<3\c',;]/$IiYHY@?[^WfY]Y2(r_SjF6aND]McHjnde'ut#f\5'7h;7&IiSrnY
+jlY^gkiq?sli-5PmI'EAn,MnVna5oGnc/+Vn,MhUmJZDOlN$5KklU)3kPjTEjlHF$&E;[-i8EMM
+hVI#CgtUQ:g"?;UJ(E0"eC2jndEp4ccHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Xtbc\[],W[^EKK
+Za-j?Ycb+1XK/A$WMl_mV50o^U7n9RT:VXES"#k7R$a5+Q'ISsP*(ieO,f3YN/NRMM26qAKnP)2
+Jq8H&IsufoI!^0cH$FRXGBS+NF9Q`+EH,r9rb`HfChmg$C2%?pB4baeARo:\@U`bS@/aL7?<pk9
+>QS,5>5hY+=BAT'<rZ2"<;fbq;ZBVm;#a>k:Adic9`@]^9)_E]8GPdR7f5^I7/0.B6L@(NrsAGa
+jk\M4bK@oJr;S,9iSE,2aN)'0]Y;"f\@/cQ['I-IZaI*CZE^aCZa6sBZ*UgEZa'M6!3cC+!3tgt
+ks>56rBpHMs$crWr^ZuZs%35_s%@i89heAY:f("e;c?[s<``F,>$P<=?XR;OA7]@dBkhF#DK'T9
+FEMePH@('iJ:`E-L5:\FNK90aPa.T&R[ftATq\?[Vl?`!Y->1;[C3TU]=bkn_Sa@4aN;WLc-F\`
+e'ut#f\5'7h;7)JioB+]k3(smlKdg'mdKW6nac8No*+dZp%J+RrV-HiqYL-erqu`no_sFARf@m~>
+JcC<$RK)sZrVc`nrVQWks7uWg!Vc<eoi^qYo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WMcVhU7n0LS!fY0Q'.8jNf8jPLP:A4?"7M`G'eh(rf@&?
+!0?o8qN(K7!KiKCOoCODP5pjHQ2?gEQ2?gEQ2$U?Q2['LQ26gCO8b78Oo:C;OoLLCOnXt:Ol2E!
+OoLO=OYX#?YHY@?[^WfY]Y2(r_SjF6aND]McHjnde'ut#f\5'7h;7&IiSrnYjlY^gkiq?sli-5P
+mI'EAn,MnVna5oGnc/+Vn,MhUmJZDOlN$5KklU)3kPjTEjlHF$&E;[-i8EMMhVI#CgtUQ:g"?;U
+J(E0"eC2jndEp4ccHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Xtbc\[],W[^EKKZa-j?Ycb+1XK/A$
+WMl_mV50o^U7n9RT:VXES"#k7R$a5+Q'ISsP*(ieO,f3YN/NRMM26qAKnP)2Jq8H&IsufoI!^0c
+H$FRXGBS+NF9Q`+EH,r9rb`HfChmg$C2%?pB4baeARo:\@U`bS@/aL7?<pk9>QS,5>5hY+=BAT'
+<rZ2"<;fbq;ZBVm;#a>k:Adic9`@]^9)_E]8GPdR7f5^I7/0.B6L@(Os"`<=XJhh`S!]S0QiI*[
+fYk4pTq.O8OcPQ`NJrgRMM[1FLkphAL5(D;L51M=LP:D8LAci+K`?Z.L4tA:Ll1PTks>56rBpHM
+s$crWr^ZuZs%35_s%@i89heAY:f("e;c?[s<``F,>$P<=?XR;OA7]@dBkhF#DK'T9FEMePH@('i
+J:`E-L5:\FNK90aPa.T&R[ftATq\?[Vl?`!Y->1;[C3TU]=bkn_Sa@4aN;WLc-F\`e'ut#f\5'7
+h;7)JioB+]k3(smlKdg'mdKW6nac8No*+dZp%J+RrV-HiqYL-erqu`no_sFARf@m~>
+JcC<$RK)sZrVc`nrVQWks7uWg!Vc<eoi^qYo()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W$p
+d*BnZb/hWB`59=)]tCqd[^EHHYcb+.WMcVhU7n0LS!fY0Q'.8jNf8jPLP:A46U=.47nZHMr_WVj
+s%ibm:/:[\qG%#dqG-ZYqG75h:/:d_r_E)^pJLres%iSiqGmMqr)Wr%=]tQ&oi_;sr)`5e!*T8&
+!EW>#=8l>#=oMOs=#-kZYHY@?[^WfY]Y2(r_SjF6aND]McHjnde'ut#f\5'7h;7&IiSrnYjlY^g
+kiq?sli-5PmI'EAn,MnVna5oGnc/+Vn,MhUmJZDOlN$5KklU)3kPjTEjlHF$&E;[-i8EMMhVI#C
+gtUQ:g"?;UJ(E0"eC2jndEp4ccHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Xtbc\[],W[^EKKZa-j?
+Ycb+1XK/A$WMl_mV50o^U7n9RT:VXES"#k7R$a5+Q'ISsP*(ieO,f3YN/NRMM26qAKnP)2Jq8H&
+IsufoI!^0cH$FRXGBS+NF9Q`+EH,r9rb`HfChmg$C2%?pB4baeARo:\@U`bS@/aL7?<pk9>QS,5
+>5hY+=BAT'<rZ2"<;fbq;ZBVm;#a>k:Adic9`@]^9)_E]8GPdR7f5^I7/0.B6L@(QrtORjF^S9M
+:f'n\9hS.1YEjEC=A_ck80^Pt8kDWJ91VQE84Q9C84Q3A7nH9C8k2KH9M.iK91hlO9hbO\"AVZd
+9i1[^oM4X:r'L?LqaCHQs$luXs%*/]s%<;aInWR2:/=\_;,U=k<E<.%=]np5>[CcF@:EbYAnYmn
+CMds.EH6/DGBeF\I=Hd!K8#&9M2[FTOHPinQ^F53StD^NUo(&hX0&P/Z*UjH\@K5a^;.V'`Q$!@
+bKS5Vd*^=lf%8R.g>(N@i8EVTjQ5OekiqBum-O0/n*ol<o)J:bo_%nNp@nO\!r;]hr;6KkrVcBf
+JcD2=J,~>
+JcC<$RK)sZrVc`nr;6Nj!;ZTg!Vc<eoiq([o()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/Wi)_iU7n3MS!o_1Q'7>kNf8jPLPCJ6J9?$`M2e.;]=dgM
+pqH^As1elU_o'F3`l?'uaT'?^b4a$Vbk00ZcM5ZacMc)hciCQP[emQ2\,s.J[e7'.[f<i:[f3c7
+\F-p-])9,4\cB;<])0)uX0&S0ZEpsJ\[oGe^VI_(`Q$!@bKS8XdF$Fme^rI,g>(N@hr*JQj5f=a
+k3(sml0@U$m-X3.rU9dUs7,gR!;#mSrpg!WrU9dSs6]dOs6B[MrosIH!9a@Ds5a7Aro4CGiSi_Q
+hqm5Gh;$cag4.f.f@SU)e^W*tda?Ihcd'h\bfn8Rb/q`Ga2Z*;`5BI/_8*h"]tD"i]",A]\$i`Q
+['R*EYct=6Xf\\*WiE%sVl$;dUnaZXTqJ$LSXc1=R[KP1Q^3o$PEM)kOH5H_NJrgSMM[.EL5(D8
+K7ec,J:N,uI=6KiH?sj]GBa(1#^(62F)l8?E,Y_n'l@c&CMIQtBP;$jAn>Oa@q/tW@:<RC?O'nC
+?!LW=>?^u.!a&N*r`9&!s&Aqq!`Dlmr)!Dhs%`Jdr_3>bqb$iZrCH`SrC6]RoL/IAoKqq2^&JB+
+j5J\<bfRuJr;RH*ii8.@bK%H3[(Eu]\@8oS['[.;ZjX4EZEU^BZa-mAZ*XG:!3uC)!4(q!kX#,5
+rBpKNr^HiVr^ZuZ!(m/^InNI/9heAY:f("e;cHat<`iL->?kH??XR>PA7]@dBkqL$DK'T:FEVkR
+H@1-jJ:`E-L5CeHNK90aPa.T&S"-(BTqeE\VlHf"Y->4<[C3TU]=ktp_Sa@4aN;WLcHjkbe'ut#
+f\5*8h;7)KioB+]k3(smlKdg(mdKW6nc/.boCV\Jp%J+RrqQNhs8)Zjrqu`np&9OBRK%d~>
+JcC<$RK)sZrVc`nr;6Nj!;ZTg!Vc<eoi^qYo()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/Wi)_iU7n3MS!o_1Q'7>kNf8jPLPCJ6J7<))F*N4orf6u=
+pl>33qiLi=!0I2Brf[;F!0mJJqNUuEqiq)FpQYN>rg*SLq3D#BqiCW9plYN:p5oB;Onk+,OoCO?
+Ont74OZ0>CYHY==[C<]X]Y2(q_Sa@4aN;WLcHjnce'uq"f\,!6h;7&IiSrnYjlY^gkiq?slg4!*
+mI'rAs7$'Yp@84Tp%&+Prp]mTs6fpSrTsRM!:'RJs6'IGroX7B!9F.>$f^.(i8EMLhVI#Cg]#oV
+g"=p.f%/C$eC2jndEp4bcHXSWbKJ&MaN2EA`Pod5_SX.)^V7Co]Xtbc\[],W[^EKKZa-g>YHG"0
+XK/A$WMl_lV50o^U7n9RT:VUDS"#k7R$a5+Q'@JqP*(ieO,f3YN/NRMLkg_>KnP)2Jq8H&Isufo
+I!^0cH$FOWs)nZjFEDSEEH,r9rb`HfChmg$Bk_6oB4baeARo:\@U`bS@/aL<?<piA>[(E9rE02(
+=',B%s&K(urDNbq;,R6fs%iYir([/as%E5]r^m&Zq+(BQr'g6Gpd=[?m6SMe$L>L2WMH5YR[BJ.
+rr3\iah+I%FT7YjNf/[ON/EONM2I+FreD)AKnb;:L51J;L4t;7Knb;9K`6T,KS>,7M<fu]62X(J
+6i9@O7K5jV8,l*[8cD>392&#R9hnJ\:f1+h<)lt"=BSd2>[:ZC?t*SUAS,UiCMRd)E,fr@G'A4X
+I!pKpJqJc3M2I7OO-#NhQ'[l-S=Z@HUSOcbWiN8)Yd1UC[^`l[]t_A"_o9X:aihoRcd:(geCN7(
+g=tE=hVdAPj5f=akNM0qlg4$,n*fc9s7-Edo^qhLp@e7[q#C0iqY^6ir;HTerdk*;s*t~>
+JcC<$RK)sZrVc`nr;6Nj!;ZTg!Vc<eoi^qYo()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3e^W'q
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/Wi)_iU7n3MS!o_1Q'7>kNf8jPLPCJ6J3uXk7n??KqbR>i
+:/:[\oM4sQqG75h:/:d_r_E)^pJCoer_NDf!*8tsqc<Vrs&f2#r`Jhrs&]8&l<+'hqcNi!r`K,%
+!a&T.pK';SXfnt7ZaI9Q]"G_k^r"".`lQ9Fbg+P^dF6Uqf@\d1gtgiEi8N\UjQ5OdkNM0plKdg'
+mHs??n,MnWnb2MRoC_\Rnc&%Vn,MhUmJZDOlN$5Ll2TrIkPjWDjT+B@isXl*iS`YOhVR)EgtVh^
+J(`K+f@JO'eC;sqdF$=ecHa\Ybfe2PaiMQD`l5p8_ns:,^q[Us]Y(kf\[f5Z[^NTNZa6sAYck43
+XfSS'Wi;qpVPU)aUS=HUTV%gHS=?":R@'A.QBd\uP*1rhO,o<\N/W[PM26qAL4t;5K7\Z)J:E#r
+I=-BfH?jaZGQ2glF`__HEcH)<DuOVhD/=!'C2%BqBP1phAS#C^@q&nU@:9(A#@:\A>[1K;>5_S*
+=BAT'<rZ2"<;f_s;Gg<h;#a>k:Adic9`Ic_9)_E\8GPdS7f5^I7/0.A6L@(Srt`8%B38&2;,9n[
+92"6VSpkEZ;+O*a8cD*`5tFR=8k)?D7fGp]8Ol9B8,Z!c7nH?I8kMcM91o1Xs%W_l:JFSZ;#3u\
+:?Y"A6N':L7/fXT7fGpX8,u6\8q0K-9MJ5V:Jakb;H$Op<`W=*=^,-:?=.)L@Us%^BPD6tD/O<4
+F*)SLH$XjdIt3-'KnbGAN/`m[P*D5uR%'V;T:r$UVPgGpXfen6ZaI6O\\#Pi^r"".`lQ9Fbg+P]
+dF6Urf@\g3gtgiFiSrnYjlYail0@U$mI'H3nF?PL#P7T[p%A%Pp\ssfq>^<hqu6NlrUp/@s-`n;~>
+JcC<$RK)sZrVc`nr;6Njs7uZh#5@ibp%@tKrpj(Zn*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$iWKYck10Wi2ejUS4<OS!o_2Q'7AlNf8mQLPCJ7J8TOUK8lP/^](nH
+^A#><^AGYN^qmn*`5K[8a8X0[aT0KVbPfZWc2Q#`c2Z)fci;AldJgWP[emQ2\,s.J[e7'([f<i9
+\GEc8\G3W6])T>/\cBAA]JmI)Y->4<[C3TU]Y2(q_Sa@4aN;WLcHaeae'uq"f\,!5h;-uHiSrnX
+jlY^gkiq?slg4!*mI'uBs7$$XqXX@Oq==OTrp]mTs6fpSrTjUOlK\B5s6'IGroX7B!9F.>!TN);
+huV`lrnRV1g]#oVg"=p.f%&=#eC2jndEp4bcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W
+[^EKKZE^X<YHG"0XK/A$W2HPjV50o^U7n9QSt;LCS"#k7R$a5*Q'@JqP*(ieO,f3YN/NOLLkg_>
+KnP)2Jq8H&IsufoI!^0cH$FOWs)nZjFEDSEEH,r9rb`HfChmg$Bk_6oB4baeARo:\@U`bS@/aL=
+?<piA>[(E9>5hY+=BAT'<rZ2"<;fbq;ZBVm;#a>k:Adic9`Ic_9)_E\8GPdS7f5^I7/0.A6L@(S
+rsA8Zj4i#,aiVQArVlutkGadGrtrDW['?jG\$rZNZEpgCZa-pEZ*CO?ZEpk9Ym%G@['R$@qlg(-
+laH"Cr'LBMqaCHQs$lrWs%!,]r^qZ59MJ5V:/=\_;H$Ln<E<1'=^#$7?!^lH@Uiq[B4u!pCi4-0
+EH?5FGBnL^I=Hd!KSG8=MN!OUOckroR$jG6StMdPUo1/kX0&S0ZEpsI\[oGe^VI_(`Q$!@bKS8X
+dF-Lnf%8R.gYCWBi8N\UjQ>Ufl07L!m-X60n*olInd"dYo_%nNp@nR]s7u]kr;6KkrVcEgJcD/<
+J,~>
+JcC<$RK)sZrVc`nr;6Njs7uZh#5@ibp%@tKrpj+[n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$iWKYck10Wi2ejUS4<OS!o_2Q'7AlNf8mQLPCJ7J6l\uD01;_OH0=$
+pQ#-3rK-u=!0I2Brf[;F!0mJJqNUuEqiq)FpQYN>rg*SLq3M&IrfI#<qiLT8rK-Z6q2k$,rf[,?
+qNCf>rK-u?2Qa-dZEpsI\@K8c^VI_(`Q$!@bKS8Wd*^=le^rI,g=tH>hr*JQj5]7`k3(sml0@U$
+m-X3.rpTmVrpfjUp@J+Nrpg!WrU9dSs6]dO!pf.:rosIH!9a@Ds5a7Aro4%=iVqa9hqn@g!SlH/
+g4.f.f@SU(e^W*tda?Ihcd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R'CYct=6
+Xf\\*WiE"qVl$;dUnaZXTq@pJSXc1=R[KP1Q^*i#PEM)kOH5H_NJrgSM2@%DL5(D8K7ec,J:N,u
+I=6KiH?sj]GBa(1#^(62F)l8?E,Y_n'l@c&CMIQtBP;$jAn>Oa@q/tW@:<RC?O0tD?!LW=>?Y50
+=TV],=8l8#<W?%s;u]bq;>j>k:]F2f:&[id9D_?\8c;3U8,YpT7J'"C6hE_46,ER*e?uBTTq.\P
+QQDFls6%eDWe,H\s8W(WLkg\9MMm@JM26tBLPU_>L&Qf3LP:J;KnP/4re:<'#)%\aL5CbBm>0sl
+r'LBMqaCHQs$lrWs%!,]r^qZ59MJ5V:/=\_;H$Ln<E<1'=^#$7?!^lH@Uiq[B4u!pCi4-0EH?5F
+GBnL^I=Hd!KSG8=MN!OUOckroR$jG6StMdPUo1/kX0&S0ZEpsI\[oGe^VI_(`Q$!@bKS8XdF-Ln
+f%8R.gYCWBi8N\UjQ>Ufl07L!m-X60n*olInd"dYo_%nNp@nR]s7u]kr;6KkrVcEgJcD/<J,~>
+JcC<$RK)sZrVc`nr;6Njs7uZh#5@ibp%@tKrpj(Zn*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$iWKYck10Wi2ejUS4<OS!o_2Q'7AlNf8mQLPCJ7J3lUm77U$G:&Rog
+:B4/d:%_9P:\mlh:JO[a:&[o[;"mfe;#X8f;#aDl<r5no<qTPn=S5hp=T2Il=T2J#=9;Q+=Sc2#
+=SZ#VXfen6ZaI6O\\,Vj^r"".`lQ9Fbg+M\dF6Uqf@\d1gYL]Ci8N\Uj5oFckNM0plKdg'mHs?@
+n,MnVnbVhMoD.tVnc&%Vn,MhUmJZAQlg!d7l2TrIkPjWDjT+B@irS/urnmh7hYu=3gtVh^J(`K+
+f@JL&eC;sqdF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^NTNZa-j?Yck43XfSS'
+Wi2hnVPU)aUS=HUT:VXFS=?":R@'A.Q'IStP*1rhO,o<\N/W[OM26qAL4t;5K7\Z)J:E#rI=-Bf
+H?jaZGQ2glF`__HEcH)<DuOVhD/=!'C2%BqBP1phAS#C^@q&nU@:9(A#[UeB>[1K;>$Co.!a&N*
+r`9&!s&Aqqs&/korD<Mis%`Jdr_3>bqb$iZrCH`SrC6]RoL/IAoKqq2_uCV.RrM_5;c$7a91qlL
+aeji4?W'E_RIK^A6iK@m5Y=R:84c6?7S$*@7nH3A8P)HD8P2WJ85)ZM92/+Y9a"6e9i"U^:\@KH
+62X(K6i0:O7K5jU8,l*[8cD>392&&S:/4S]:f:4j<)lt#=BSg3>[:ZC@:E_WAS5[jCM[m+E,fr@
+G'A4XI!pKpJqSl6M2I7OO-,TiQ'du/S=ZCIUSOfdWiN8*Yd1UC[^iu^]t_A"_o9X:aihoRcdC1i
+eCN7(g=tE=hr*JQj5f@bkNV6rlg4$,n*fc9s7-Edo^qhLp@e7[q#C0iqY^6ir;HTerdk*;s*t~>
+JcC<$RK)sZrVc`nr;6Njs7uZh@e]Tip%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AHgY1?4f$r0r
+d*L"]bK7iE`59@*^:_(g\$iZLYck10Wi2hkUS4<OS=>n4Q'7AmO,T!RLk^S8JUhofIu9Da_nEdu
+pV$I<!l)I`rkAuZ_8=(,`5KX7a2c9Bai_d"bPfZWc2Q#`c2Z)fci;AkdJLEM[emQ2\,a#:[f!Q*
+[f<i9\G`u8\G3W"\iIC8]WJ?@Z*UjH\@K5a^;%P&`Q$!@b0/&Td*^=le^rF+g=tH>hr*GPj5]7`
+k3(sml0@U$m-X6/rpTmVs7-$XqXa[XqXaRSs7-*XrU9dSs6]dO!pf.:rosIH!9a@D!p/M(ro4%=
+iVqa9hqn@g$JaCig=b03f@SU(rmZ2Ada?Ihcd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]
+\$i`QZa6sBYct=6Xf\\*Wi;qpVl$;dUnaZXTV%gISXc1=R[KP0QBd`"PEM)kOH5H_NJrdQM2@%D
+L5(D8K7ec,J:N,uI=6KiH?sj]GB\4QrcAWkEcH)<Df0H0D/=!'C2*Z\!G?$DAH?=OraGq;?srt@
+!FB(2>lS".>5_S*=BAT'<rZ2"<;ohr;ZBVl;#a>k:Adic9`Ic_9)_E\8GPdS7f5^I7/0.A6L@(V
+rsAPfjP\S6c-")Hr;QlegnFTDrt=kD\[/H?Wi!/0Za@$C['R'EZi730Zi76:Yd(I=['[0EYHRr0
+"0o);\*^We62X(K6i0:O7K5jU7fl4Q8cD>392&&S:/=\_;,U=k<)lt#=BSg3>[:]D@:E_XAS5[k
+CM[m,EH6/CG'A4XI"$TsK7nu7M2I7PO-,TjQC+)0SXuLJUnsufWiW>+Yd1XE\%0)_]t_A"`5Td<
+b0/#ScdC1je^i@*g=tH>hr*JRj5f@bkiq?sm-O--n*fc9s7-3^o`"Lbp@n=\q#C0iqY^6ir;HTe
+rdk*;s*t~>
+JcC<$RK)sZrVc`nr;6Njs7uZh?ha9fp%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AHgY1?4f$r0r
+d*L"]bK7iE`59@*^:_(g\$iZLYck10Wi2hkUS4<OS=>n4Q'7AmO,T!RLk^S8JUh9BCNFfPOn=\2
+NrY:<O8b7@OoCLFPE_=2Q2?gFQ2?gFQ1pO?Q2R$KQ2-aFQhumAO8G%6Oo1=?Oo:C>Onk+,OoLUC
+OoCFBOo(=>OoLOBOZ'>EYd(OB[^`l[]Y;.t_o9X:ai_fOcHstfeCE1&g"P3:h;@/KioB(\k2tjj
+l07L!m-O--mf)\TnGi%Vo(qtVo_S1Uo)J7ZnGVhUmf2\QliQM<lMg&JkQ'fFjoXZ*jSn0?io0mp
+!T2c5h$Vrlg=k65f[na+ec+'Ce'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT
+[Bm3FZ*:I9Y-"h-X/`.tVl-DgUnjc[TqJ$LSt2C@S!ob4Q^3o%P`q8nOcYWbNfB!UMM[1GLPCP;
+KS+o/JUi9#IXQWlH[:!`G^"@TFoHImF)l8?E,TW3D/F*)CMIS_BE;aXrac+@A,]p=@:3LB?NFJ=
+r`oJ-!*]>(!a&N*r`9&!s&Atrs&/kor)!Dhs%`Jdr_3>bqb$iZrCH`SrC6]RoL/IAoKqq2`;^M0
+]WS-,Ssu18R$I^Op=I0aU4(/_rs-?'M1pS6Isq<Q$]'RmL51P<KS>/7L])r,KE-Z(K`H`(KE$Z*
+L&m*en;%"!k<]#4r^6QNs$crWrC6o[8P/nRInNI09hnJ\:f1+h;cHat='/U/>?kH@?X[DRAS#Lf
+C27X'DfKf>FEVkRH@10lJV/W1LP^nINfT<cQ'Rf*S"6.DTqnN_W2cr$YHY=>[^WfY]Y2(q_SjF6
+aND]McHjndeCE.%g"P3:h;@/Lj5]4_k32'olKmm)mdKW6nc/.\oCW%T!quB_rqQNhs8)Zjrqu`n
+p&9OBRK%d~>
+JcC<$RK)sZrVc`nr;6Njs7uZh?ha9fp%@tKoCDJBnF,f4m-O'&l0.9ljl>C[i8<AHgY1?4f$r0r
+d*L"]bK7iE`59@*^:_(g\$iZLYck10Wi2hkUS4<OS=>n4Q'7AmO,T!RLk^S8JUg'S7n60G:]=2j
+:B4/d:%_9O:]!ri:JO[a:&[o[;"mfe;#X8f;#X>h<r5no<qTPn=S5es=SZ+h=T;P"=Sl8"=Sl/X
+Xfen5ZaI6O\\#Mg^V[n-`lQ9EbK\>ZdF6Uqf@S^0gYL]Ci8EVTj5oFckNM0plKdg'mI'EAn,MnW
+nbhtSoDS=XoD8%Xnc&%Vn,MhUmJZAQlg!d7l2TrIkPjTFjlGM%irS/urnmh7hYu=<gtUQ:g"G$0
+f@JLOe9KHjdF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^NTMZa-j?Yck43XfSS'
+WMl_mVPU)aUS=HTT:VXFS=?":R@'>,Q'IStP*1rhO,o<\N/NRMM26qAL4t;5K7\Z)J:E#rI=-Bf
+H?jaZGBS-.F:NA4EH,r9DJj<.Chmg$C&VcHB4h-S!G#^>@KKtG@/aL6?=!P8s'#J,rE02(=',B%
+s&K(ur_rhps&&\js%iYir([/as%E5]r^m&Zq+(BQr'g6Gpd=[?m6Sbl,keNn@ou]/:eseY91m^=
+PBUP<:IfiiotP0.4[D=u5s@e07Rd;H"A)*R8OrbOs%!Vk8kVcI91qrO9hS2T9MPL]s%rPfp.jd:
+r'LBMqaCHQs$lrW!_>mSr^qZ59MJ5V:Jakb;H$Ln<E<1'=^#$7?!grI@Uit\B4u$qCi402EccDH
+GBnL^IXm!%KSG8=MN!RVOckuqR$jG7StMdQV5L8lXKA\1ZF%'L\[oGe^VI_)`Q-'BbKS8XdF-Op
+f%8U/gYL]Ci8N_VjQ>Ugl07L"m-X60n*olIncA@Srq-?dp\4[^s7u]kr;6KkrVcEgJcD/<J,~>
+JcC<$RK)pYrr)ior;6Njs7uZh@JBKhp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]O,^:_(g\$iZMZ*1:2Wi2hlUS4?PS=>q5Q'@GnO,]'SLk^V9JUh]aHA@HQ]"YoQ
+^%f>>^C@up_Sa=2`Q#s>aN;TIoum?YoZdB\ps&iarQkMjr6bPSqmZO4q7$72rjVp9!4D=)s0r!;
+!4i$;s0r$<ppp:5!4h^434lc6Xg#(:['mHS]=bkm_8=.0a2lEHc-FY_daZguf@em4gtgiFi8WeW
+jQ>Ufkiq?slg4!*mdC)C!q>aMqss^Wp%84SqXX[Vrp]mTs6fpSrp9[Ns6BUJ!pJh1roS[kjQ,@]
+io8qTi8<GKh;-lAgY1B7f\"g-f%&:"e'c[ldEp4bcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc
+\[],W[C!9HZE^X<YHG"0X/`2!W2HPjV50o^TqS-OSt;LCS"#k6R$X,(Q'@JqP*(ieNfB!VMi*@J
+Lkl"b'nq<nK7\Z)J:E#rI=-BfH?jaZGBS-.F:NA4EH,r9DJj<.Chmg$C&VcHB4h-S!G#^>@KKtG
+@/aL6?=!P8s'#J,rE02(=',B%s&K(ur_rhps&&\js%iYir([/as%E5]rCQuZq+(?Pr'g6Gpd=[?
+mQnhl$1[-8g!S'ea2Q*trr`#QW8%=O)Z@spY,%VRVk]oWZa@!D[Bd*EZ*CO;ZEpjBrilR2Za@(<
+YPta,Z*<Q&k<]&5rBpHMs$crWrC;?.8P)NH91qrQ9hnJ\:f1+h;cHdu='/U/>[1QA?X[DRAS,Rg
+C27X'DfKf>Fa&(VH[U?nJV/W1Ll%%KNfT?eQ'Rf+S"6.DU84W`WN*&%YHbF@[^WfY]Y;.s_SjF6
+aND]NcHjndeCE1&g"P3:hV[8Mj5]7`k32'olg3sEmI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrquco
+o_sFARK%d~>
+JcC<$RK)pYrr)ior;6Njs7uZh?ha9fp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]O,^:_(g\$iZMZ*1:2Wi2hlUS4?PS=>q5Q'@GnO,]'SLk^V9JUh-=BQ80EN:i5+
+NrY:=NrkE*OoCLFPE_=2Q2QsFQ2?gFQ1pO?Q2R$KQ2-aFQN<D=q2kQ9e<'*\qiLi?rf[#<26F*f
+Za@0M\\#Mg^VRe*`Q-'BbK\>YdF-Opf%8U/gYCWAi8EVTj5f@bkNM0plKdg'mI'EAmfN"Knb_nU
+oC_bSoD8%Xnc&%Vn,MhUmJcJPli68LklU)3kPjUmjlGL_j5T(Wi8EMMhVI#CgtUQ:g"=s/f@JL%
+eC2jodF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^EKKZa-j?Yck43XfJJ%WMl_m
+VPU)aUS4BST:VXFS=?":R$a5+Q'IStP*1rhO,f3YN/NRMM26reL)#DqK7ec,J:N,uI=6KiH?sj]
+GB\4QrcAWkEcH)<Df0H0D/=!'C2*Z\!G?$DAH?=OraGq;?srt@!FB(2>lS".>5_S*=BAT'<rZ2"
+<;ohr;ZBVl;#a>k:Adic9`Ic_9)V?\8GPdR7f5^I7/0.A6LI.[rtG.KZ`BprSXPk2QBhLMgr?e!
+J?StP$ceWlIs?'QI<p0_M#E,/LAur,L&Qf5Knb;6KS+r3KnB;Vs+UK-!JlU%L]3+m62a.K6i0:O
+7K5jU7t4'$8P2TJ92&&S:/=\_;,U=k<*!%$=BSg4>[:]D@:E_XAnPdlCM[m,EH6/DGBeF\I=?]t
+K7nu8M2R=QO-5]lQC+,1SXuLKUnsugWiW>+Z*UgG\%0)_^;%M$`5Td<b0/&TcdC1je^rF+g=tH?
+hr*JRj5oFckiq?tm-G&GmdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*;s*t~>
+JcC<$RK)pYrr)ior;6Njs7uZhAbYolp%@tLoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]O,^:_(g\$iZMZ*1:2Wi2hlUS4?PS=>q5Q'@GnO,]'SLk^V9JUg-V6UjO;:/Fb_
+:JO[^:&due:\mi_:]F2e:]!ri:JO[a:&[o[;"mfe;#X8f;#F/j<Vfbp<V]\g=6`rL=T2J%=Sl/W
+Xg#(:['mHS]=bkm_8=.0a2lEHc-FY_daZguf@em4gtgiFi8WeWjQ>Ufkiq?slg4!*mdC)C!q>aM
+qss^Wp%84SqXX[Vrp]mTs6fpSrp9[Ns6BUJ!pJh1roS[kjQ,@]io8qTi8<GKh;-lAgY1B7f\"g-
+f%&:"e'c[ldEp4bcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[C!9HZE^X<YHG"0X/`2!
+W2HPjV50o^TqS-OSt;LCS"#k6R$X,(Q'@JqP*(ieNfB!VMi*@JLkl"b'nq<nK7\Z)J:E#rI=-Bf
+H?jaZGBS-.F:NA4EH,r9DJj<.Chmg$C&VcHB4h-S!G#^>@KKtG@/aL6?=!P8s'#J,rE02(=',B%
+s&K(ur_rhps&&\js%iYir([/as%E5]rCQuZq+(?Pr'g6Gpd=[?mQnqo7Egg.>#eHq:/+AS9M)je
+I:l_Y7q]U*fPj;C4#f2X5!;"k77B^<7n?-@84Q3B8kDWK91qlJ8kMcM9hS2T9MJ5V9i+[_:\IQH
+62a.K6i0:O7K5jU7t4'$8P2TJ92&&S:/=\_;,U=k<*!%$=BSg4>[:]D@:E_XAnPdlCM[m,EH6/D
+GBeF\I=?]tK7nu8M2R=QO-5]lQC+,1SXuLKUnsugWiW>+Z*UgG\%0)_^;%M$`5Td<b0/&TcdC1j
+e^rF+g=tH?hr*JRj5oFckiq?tm-G&GmdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;QZerdk*;s*t~>
+JcC<$RK)pYrr)ior;6Njs7uZhs7ZNerq0LfoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V%1h\@/cNZ*:@3Wi;nmUnOHQS=>q6Q'@GoO,]*ULk^V9Jq.WYG^kR9Ur:"B
+^%]8>^]2(W_8F1/`Q#s>aN;TIoum?YoZdB\pW```rQk;epUKn*ppg@5rjMd7p9t"1qmZX7rO2g;
+\+dH2])T>7])TB"Xfnt8['mHS]"G_k_8=.0a2lEHbg+P^daZdtf@\g3gtgiFi8N_VjQ>Ufkiq?s
+lg4!*mdC)C!q>aMr:9jYnFZ\NqssdWrp]mTs6fpSrp9[N!:'OI#O(@6k2tdejSn0Nio/kSi8<GK
+h;-l@gY1B7f`'KPf%&:"e'cXkd*U+acHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\@8oT[C!9H
+ZE^X<YHG"/X/`2!W2HPjV50l\TqS-OSt;LCS!ob4R$X,(Q'@JqP*(fdNfB!VMi*@JLkg_>KnP)2
+Jq8H&IsufoI!^0cH$FOWG'.nK!HW;\E<U<"DJj<-rbDOLC&VcHB4h-S!G#^>@L$=L?sd8I?=!P8
+s'#J,r`T8's&]2#s&K(ur_rhps&&_kr_NPhr([2br_*,\r^m&Zq+(BQr'g6Gpd=[?m6Shn$23WD
+h:'Zmai;@!rr`,VW0I8\%bSh+Un3m8PG"M>SY33nriud8Z*LX=ZEgh9Z2_-0ZidY;Ycmu/!OfE(
+[c]sS6N':K7/o^U7fGpX8H29]9)hP59MJ5V:Jakb;H$Lo<`W:)=^#'8?=.)K@Us%^BP;-rD/O93
+EccGJG^=^bIXm!%KnbD?Mi<[XP*;/sR$sM8T:r!TV5L;mXKA_3Za@0M\\#Mg^VRe*`Q-'BbK\>Z
+dF-Opf@S^0gtgiEi8N_VjlYail07O#m-X60n*olIncA@Srq-?dp\4[^s7u]kr;6Kkrr)KgJcD/<
+J,~>
+JcC<$RK)pYrr)ior;6Njs7uZhs7ZNerq0LfoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V%1h\@/cNZ*:@3Wi;nmUnOHQS=>q6Q'@GoO,]*ULk^V9Jq.-:B5D[:JWZ#g
+Nq&/9OHGWeP*2#nPl?sIPl-gGPQ6pHPl?sBPl$aEQN!0HQMm0MQN*;kORJ>.OT1FCP5(.sXfnt8
+['mHS]"G_k_8=.0a2lEHbg+P^daZdtf@\g3gtgiFi8N_VjQ>Ufkiq?slg4!*mdC)C!q>aMr:9jY
+nFZ\NqssdWrp]mTs6fpSrp9[N!:'OI#O(@6k2tdejSn0Nio/kSi8<GKh;-l@gY1B7f`'KPf%&:"
+e'cXkd*U+acHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\@8oT[C!9HZE^X<YHG"/X/`2!W2HPj
+V50l\TqS-OSt;LCS!ob4R$X,(Q'@JqP*(fdNfB!VMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FOW
+G'.nK!HW;\E<U<"DJj<-rbDOLC&VcHB4h-S!G#^>@L$=L?sd8I?=!P8s'#J,r`T8's&]2#s&K(u
+r_rhps&&_kr_NPhr([2br_*,\r^m&Zq+(BQr'g6Gpd=[?m6Sko-el25VP9WNQ^=#(s8V3)];L4'
+p](9LToXeMFDl#6G^"=RG_Us,L])o.L4t?\L'*-^K7s5X!.t3&rIt?/M=?<#M!%)%6N':K7/o^U
+7fGpX8H29]9)hP59MJ5V:Jakb;H$Lo<`W:)=^#'8?=.)K@Us%^BP;-rD/O93EccGJG^=^bIXm!%
+KnbD?Mi<[XP*;/sR$sM8T:r!TV5L;mXKA_3Za@0M\\#Mg^VRe*`Q-'BbK\>ZdF-Opf@S^0gtgiE
+i8N_VjlYail07O#m-X60n*olIncA@Srq-?dp\4[^s7u]kr;6Kkrr)KgJcD/<J,~>
+JcC<$RK)pYrr)ior;6Njs7uZhs7ZNerq0OgoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V%1h\@/cNZ*:@3Wi;nmUnOHQS=>q6Q'@GoO,]*ULk^V9Jq-0T6q9^>8l&8Z
+q+gc^r_E8brD*5cqbR;h:Amod:@qBW;$9]k:/=[a;#4#h;uTbs<r5tk<q]Sp=RB8M=T2J'=Su5X
+Xfnt8['mHS]"G_k_8=.0a2lEHbg+P^daZdtf@\g3gtgiFi8N_VjQ>Ufkiq?slg4!*mdC)C!q>aM
+r:9jYnFZ\NqssdWrp]mTs6fpSrp9[N!:'OI#O(@6k2tdejSn0Nio/kSi8<GKh;-l@gY1B7f`'KP
+f%&:"e'cXkd*U+acHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\@8oT[C!9HZE^X<YHG"/X/`2!
+W2HPjV50l\TqS-OSt;LCS!ob4R$X,(Q'@JqP*(fdNfB!VMi*@JLkg_>KnP)2Jq8H&IsufoI!^0c
+H$FOWG'.nK!HW;\E<U<"DJj<-rbDOLC&VcHB4h-S!G#^>@L$=L?sd8I?=!P8s'#J,r`T8's&]2#
+s&K(ur_rhps&&_kr_NPhr([2br_*,\r^m&Zq+(BQr'g6Gpd=[?m6Sqq,3c%L?s$E*:JXYW8kI(#
+L2C3o7mrp?nqBb%4?#5X1c@HYr]U3M#tRWY84c?D84uSS9*Rs\8k_lP9DqTb:'+-d;#3u^:?Oq@
+6N':K7/o^U7fGpX8H29]9)hP59MJ5V:Jakb;H$Lo<`W:)=^#'8?=.)K@Us%^BP;-rD/O93EccGJ
+G^=^bIXm!%KnbD?Mi<[XP*;/sR$sM8T:r!TV5L;mXKA_3Za@0M\\#Mg^VRe*`Q-'BbK\>ZdF-Op
+f@S^0gtgiEi8N_VjlYail07O#m-X60n*olIncA@Srq-?dp\4[^s7u]kr;6Kkrr)KgJcD/<J,~>
+JcC<$RK)pYrr)ior;6Njs7uZhs7ZNerq0IeoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+^bK7iF`P]R.^V.:j\@/fOZ*:C4Wi;nmUnXNRSXZ%7QB[PpO,]*UM2-e;Jq/>mFa]+,Tt0s3
+pV-U@rkJuZ_o0L5a2c9Cb0%oNb4s0Zbl>ofbkKB]cMGcgbg"DXcMc)ad/^`M\Fm?+\GE]7\Gs&5
+[f<i7\GNc8\G*Q)])K<&YHY==[C3WW]Y2(q_Sa@4aN;WLcHjnce'ut#f\5'7h;7&IiT&tZjlYai
+l07L!m-O--mdKW6nF?&Io)A7Zo_%nTo`"IZo)J7ZnGVhUmf2\Rm/QAOlM]rPki_-kk2k^cro4RL
+iSi_Qhqm5Gh;$c>g=k64rmqJ-e^W*tda?Ihci243c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1k]",A]
+\$i`Q['R*EZ*:I8Xf\\*WiE%sVl-DfUnaZXTqJ$LSt2@?R[KP1Q^3o%P`q8mOH5H_NJrgSMM[1G
+LPCP;KS+o/JUi9#IXQWlH[:!`G^"@TF`__HErL%^E,TW3D/B2e!GZ?JBE;aXrac+@A,]pB@:3JM
+?X@&Er`oJ-!*]A)s&f;&r`9&!s&Atrs&/kor)!Dhs%`Jds%NDbqb$iZrCH`SrC6]RoL/IAoKqq2
+b5Vb7jkeV9bK7iErVm$"j4U+)rr3V3nGfM[QBIJtPuO?JTVA9gZEaA4#I1S>Za$g?ZMq01ZMq'*
+YQ;2?m^D:Er'L?Lr'^NQs$luXs%!,]r^qW49MA/T:/=\_;,U=l<E<.&=]ns6?!^lG@U`kZAnYmn
+CMds.EH?5EGBeF\I=Hd!K8#&9M2[FTOHPfmQ^F53StD^NUo(&hWi`G.Z*UgG\@K5a^;%M$`5Td<
+b0/&Td*^=le^rI,g>(N@i8EVTjQ5OekiqBum-O--n*pAIs7-3^o`"Lap@nO\s7u]kr;6Kkrr)Kg
+JcD/<J,~>
+JcC<$RK)pYrr)ior;6Njs7uZhs7ZNerq0IeoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+^bK7iF`P]R.^V.:j\@/fOZ*:C4Wi;nmUnXNRSXZ%7QB[PpO,]*UM2-e;Jq/>[A86+.J;j8`
+muI[7OcbfjPEc'3s-3GHrKI;GrfmGJp6>H>rKdGJqj.2Is-EYNoT8a,plP$,rfI#<rf@,BrfH`6
+qN(`?OSP#"YHY==[C3WW]Y2(q_Sa@4aN;WLcHjnce'ut#f\5'7h;7&IiT&tZjlYail07L!m-O--
+mdKW6nF?&Io)A7Zo_%nTo`"IZo)J7ZnGVhUmf2\Rm/QAOlM]rPki_-kk2k^cro4RLiSi_Qhqm5G
+h;$c>g=k64rmqJ-e^W*tda?Ihci243c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1k]",A]\$i`Q['R*E
+Z*:I8Xf\\*WiE%sVl-DfUnaZXTqJ$LSt2@?R[KP1Q^3o%P`q8mOH5H_NJrgSMM[1GLPCP;KS+o/
+JUi9#IXQWlH[:!`G^"@TF`__HErL%^E,TW3D/B2e!GZ?JBE;aXrac+@A,]pB@:3JM?X@&Er`oJ-
+!*]A)s&f;&r`9&!s&Atrs&/kor)!Dhs%`Jds%NDbqb$iZrCH`SrC6]RoL/IAoKqq2bl9Kd^os`5
+T:D=9QBqRNo[ppYTmY&`s7qDce9c=VCi4017s0$"H$b:"KS+r3KnP/5L4t?ZKE-`)KDgN*Ll1\W
+s+oi(r'L?Lr'^NQs$luXs%!,]r^qW49MA/T:/=\_;,U=l<E<.&=]ns6?!^lG@U`kZAnYmnCMds.
+EH?5EGBeF\I=Hd!K8#&9M2[FTOHPfmQ^F53StD^NUo(&hWi`G.Z*UgG\@K5a^;%M$`5Td<b0/&T
+d*^=le^rI,g>(N@i8EVTjQ5OekiqBum-O--n*pAIs7-3^o`"Lap@nO\s7u]kr;6Kkrr)KgJcD/<
+J,~>
+JcC<$RK)pYrr)ior;6Njs7uZhs7ZNerq0FdoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+^bK7iF`P]R.^V.:j\@/fOZ*:C4Wi;nmUnXNRSXZ%7QB[PpO,]*UM2-e;Jq/>=6UaI79(u*N
+:]!oa:]!rh:JUj_s%WPioMG9Z"Ahlh:J^pcqGI8k!*9"t!*8tuoiCcf!*J_npfRMsl<+$gs&f8%
+3j5cnZaI6P]"G_k^r"".`lQ9Fbg+P^dF6Urf@\g2gtgiEi8N_VjQ5Oekiq?slg4!*mdBQ4nF5u<
+rUTsZrUfdUr:L![qssdWrp]mTs6fpSrp9[N!:'OI#O(@6k2tdejSn0Nio/kSi8<DJh;-l@gY1B7
+f`'J/f%&:"e'cXkd*M^:FNr%QbK@rJaN)<>`Pf[2_SO%&^V7Co]=PP`\@8oT[C!9HZE^X<Y-"h-
+X/`2!W2HPjUnjc[TqS-OSt;LBS!ob4R$X,(Q'@JqOcYWbNfB!VMi*@JLkg_>KnP)2Jq8H&Isufo
+I!^0cH$FOWG'.nKF)q8""`SBtDJa4hCB80arb)=FB)Z?BA7PUJ#@V"J?XI,G?2e+/>6%k+=oVV(
+=8l8#<W?%t;u]bq;>a8j:]F2f:&dod9D_?\8c;3U8,YpT7J'"C6hE_46-]Em_2)`,;c-:b9M8&O
+d]ejW@8ooiIGOCe9m21I2`3HN3'&`V4[D:s84c?C7nH6B8P)TG9M.lJ91hiO9M>=Y"A_ce:f.!a
+pJ0m;r'L?Lr'^NQs$luXs%!,]r^qW49MA/T:/=\_;,U=l<E<.&=]ns6?!^lG@U`kZAnYmnCMds.
+EH?5EGBeF\I=Hd!K8#&9M2[FTOHPfmQ^F53StD^NUo(&hWi`G.Z*UgG\@K5a^;%M$`5Td<b0/&T
+d*^=le^rI,g>(N@i8EVTjQ5OekiqBum-O--n*pAIs7-3^o`"Lap@nO\s7u]kr;6Kkrr)KgJcD/<
+J,~>
+JcC<$RK)pYrVc`nrVQWks7uZhs7ZNerq0LfoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`P]R.^V.:k\@/fOZEUL6Wi;nnUnXQSSXZ(8QBdVqO,f0VM2-h<Jq/>fFE`CrRB"1$
+^%]8=^]2(T_8=+.`Q-$?ao'<VbPo`cblGu^c2Q#bbll88c-FW5ch>cb\b<Q+\+mK4\,*W6\,*Q5
+\,<`@\$icT[^N]UpUU:7!4i$=!4i$=3NfTlZaI6O\\#Pi^r"".`lQ9Fbg+M\dF6Uqf@\d1gtgiE
+i8N\UjQ5Oekiq?slg4!*mdBQ4nF5uHo)A7Zo^VVQo_nCZo)J7ZnGVhUmJuYQliQM<lMg&JkQ'fF
+k5XNCjSn0?io0mp!T2c5h#Z<crn8"<f[na+e^`1!e'cXkd*L"_c-611E6?;DaN)<>`Pf[2_SO%&
+^:h1l]=PP`\@8oT[C!9HZE^X;Y-"h-X/`2!W2HMhUnjc[TqS-OSt2C@S!ob4R$X,(Q'@GpOcYWb
+NfB!VMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FOWG'.nKF)q8""`SBtDJa4hCB80arb)=FB)Z?B
+A7PUJ#@V"J?XI,G?2e+/>6%k+=oVV(=8l8#<W?%t;u]bq;>j>j:]F2f:&dod9D_?\8c;3U8,YpT
+7IrqB6hNe56-]E9o&o#ddEK_P`Q%lV"7G!AhZ!Nmo#C^7Oc"pXQ'P<MT:hpTU8"NhZ*:I9Z*O>5
+!jK#;rj)O,r3-41[I:Qd62X(J6i9@P7K,dU8,l*[8cD<_92,=ZInid9:f1.i<)lt#=BSd2>[:ZC
+?t*VVAS5[jCM[j*E,fr@G'A4XI!pKpJqJc3M2I7OO-#NhQ'[l-S=Z@HUSOcbWiN8)Yd1UC[^`l[
+]YD8!_o9X:aihoRcHstfeCN7(g=k?<hVd>Oj5f=akNM0qlg4!+n*fc9o()DDo`+Uap&Ojcp]C9f
+qY^6ir;HTdrdk*;s*t~>
+JcC<$RK)pYrVc`nrVQWks7uZhs7ZNerq0LfoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`P]R.^V.:k\@/fOZEUL6Wi;nnUnXQSSXZ(8QBdVqO,f0VM2-h<Jq/>W@qKS"I"d^Z
+Nq8>3NrP.EOHGZgPEV7+Q2HjHPQ$gHQ1gI>Q2R$JQ2?mGQi<<LQN3*<OS+\0OR\D2OSb+7OS"\1
+OSk5$Y->4<[C3TU]=ktp_Sa@4aN;WLcHaeae'uq"f\,!6h;7&IiSrnYjlYail07L!m-O--mdKW6
+nF?JJrq$*\nb)kQrU]sXs7-*XrU9dS!:BaO!pf.:rosIH!9a@Ds5a7Aro4%=iVqa9hqn@g!SlH/
+g(N)kf@SU(e^W*tda?Ihcd'h\bl5e)b/q`Ga2Z*;`5BI/_8*h"]tD"i]",A]\$i`Q['R*EZ*:F7
+Xf\\*WiE%sVl$;dUnaZXTqJ$LSXc1=R[KP1Q^3o%P`h2lOH5H_NJrgSMM[1GLPCP;KS+o/JUi9#
+IXQWlH[:!`G^"@TF`__HErL%^E,TW3D/B2e!GZ?JBE;aXrac+@A,]pB@:3JM?X@&Er`oJ-!*]A)
+s&f;&r`9&!s&Atrs&/korD<Jhs%`Jds%NDbqb$iZrCH`SrC6]Ro0i@@og8%3cMn*u[B$0tS!s>B
+#aPGii5W!rJ?]%Q)o%g@JSSe,D/X>^96PQ*I!L$bJqSl4K7nu5L&Q`/K7no4K7s5VrIt?/MXZB$
+Luq#$6N':L7/o^T7fGpX8,u6\8c_RYr_7l;:Jakb;c?Xq<``C+=^,-:?=.)L@q9.`BPD6uD/O<4
+F*)SLH$XjdIt3-'KnbGAN/`m[P*D5uR%'V;T:r$UVPgGpXfen6ZaI6O\\#Mh^r"".`lQ9Fbg+M\
+dF6Urf@\g2gtgiFi8WeXjlYail0@U$m-a?2nF?)?oCMVSp&F^cp\jjgq>0scqu6NlrUg)?s-`n;~>
+JcC<$RK)pYrVc`nrVQWks7uZhs7ZNerq0IeoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`P]R.^V.:k\@/fOZEUL6Wi;nnUnXQSSXZ(8QBdVqO,f0VM2-h<Jq/>;6:F@69M,%T
+nPB$WqbR)c!DcJh:&drg:\7KX;$9]k:/=[a;#4#l;H$Ll<W6%t<<-(s=7oVf<rc@l=TDS&<rcA!
+=6iuf=oVSaY->4<[C3TU]=ktp_Sa@4aN;WLcHaeae'uq"f\,!6h;7&IiSrnYjlYail07L!m-O--
+mdKW6nF?JJrq$*\nb)kQrU]sXs7-*XrU9dS!:BaO!pf.:rosIH!9a@Ds5a7Aro4%=iVqa9hqn@g
+!SlH/g(N)kf@SU(e^W*tda?Ihcd'h\bl5e)b/q`Ga2Z*;`5BI/_8*h"]tD"i]",A]\$i`Q['R*E
+Z*:F7Xf\\*WiE%sVl$;dUnaZXTqJ$LSXc1=R[KP1Q^3o%P`h2lOH5H_NJrgSMM[1GLPCP;KS+o/
+JUi9#IXQWlH[:!`G^"@TF`__HErL%^E,TW3D/B2e!GZ?JBE;aXrac+@A,]pB@:3JM?X@&Er`oJ-
+!*]A)s&f;&r`9&!s&Atrs&/korD<Jhs%`Jds%NDbqb$iZrCH`SrC6]Ro0i@@og8%3d/Q#ZRr_k8
+;,9q]9hJ#K]UaOb=&)7s^[ApL:rP@H0/>CC3\`HS5sIV$6UOF:84c?D84lNH91f+T"A)6\92#4X
+s%WVi:f.!apeKs;r'L?Lr'^QRr^QlWs%!,]r^m2a9`@b9:/=\_;,^Cm<E<1'=]ns6?!^lG@Uiq[
+B4u!pCi+'/EH?5FGBnL^I=Hd!K8#&:MN!OUOHPinQ^F84StD^OUo(&iX0&P/ZEpsI\@K5a^VI_(
+`Q$!@bKS8Wd*^=lf%8R.g>(N@i8EVTjQ5OekiqBum-O0/n*ol<o(2JFs7QEc!;HHe!r;]hr;6Kk
+rVcBfJcD/<J,~>
+JcC<$R/cjYrVc`nrVQWks7uWg!Vc<eoiq([o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/Wi)_iU7n3NS!o_1Q'7AlNf8mQLPCJ7J:DugG(#.-UVcl@
+otLI@s1eiT_SX40a2e2#!6P2^q9/`\!mSs5ps&f`qTT/ec-=PZrQk,`rjr*>q7-")m^W;+"1YhK
+[emQ3\GWf:\[_LHq76R:rON!=rjk(nZ*UgG\@K5a^;%M$`5Td<b0/&Td*^=le^rF+g=tH>hr*JQ
+j5f=akNM0plKdg'mI'E2n*oi:rUU![rUfLMrUg*\r:9mXrp]mT!q,ICrTjUOlK\B5s6'IGroOII
+jQ,@]io8qrhuV`lrnRq:gY1B7g"=p.f%'cLJ()indEp4bcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co
+]Xtbc\[],W[^EKKZE^X<YHG"0XK/A$WMcYkV50o^U7n9RT:VUDS"#k7R$a5+Q'@JqP*(ieO,f3Y
+N/NRMM26qAL4k23Jq8H&IsufoI!^3dH?jaZGBS+NFE;JBEW9t\Df0H0D#S2XC2%?pB4kgfARo=]
+raGn:@/aO5?3":1>QS,5>5h\)=9)G$<rZ/"<;fbq;ZBVm;#X8j:Adid9`@]^9)_E\8GPdS7f5^I
+7/0.A6L@(crsAPdj58D5b/hTCrVluqh4p86ru[U-\!2Z&=-\u0=I5\TUnXT\Uf:9rYHb=:ZEUU<
+Z*OA8!jJl2r3-1,mC).Cr'LBMqaCHQs$lrW!_>mSr^qZ59MJ5V:Jakb;H$Ln<E<1'=^#$7?!grI
+@Uit\B4u!pCi402EH?5FGBnL^I=Hd"KSG8=MN!OUOckroR$jG6StMdPUo1/kX0&S0ZEpsI\@T>d
+^VI_(`Q$!@bKS8XdF$Fmf%8R.gYCWBi8N\UjQ5OekiqBum-X60n*olInd"dYo_%nNp@nR]s7u]k
+r;6KkrVcEgJcD,;J,~>
+JcC<$R/cjYrVc`nrVQWks7uWg!Vc<eoiq([o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/Wi)_iU7n3NS!o_1Q'7AlNf8mQLPCJ7J:DuUASQ71J<B\g
+plG<4s,[2A"d+t3PE_=,Q2d*JPPp^GQ1gI>Q2R$JQ2?mGQi36JQh-=9O8b1:O8+h,O8b7>O8+e;
+Oc]F%rK7/CplPK;33]Zo['mKT]=bkm_8=.0a2lEHc-F\`e'uq"f@em4h;-uHiSrnYjlYail07L!
+m-O--mdKW6nF?JJs7?3]mIgGMrq$'Ys7-*XrU0gUmHsl=!pf.:rosIH!9a@D#Nb%-j5].YiVqa9
+hqn@g$JaCig=b03f@SU(rmZGHda?Ihcd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q
+['R'CYct=6Xf\\*WiE%rVl$;dUnaZXTqJ$LSXc1=R[KP1Q^3o$PEM)kOH5H_NJrgSMM[1GLPCP:
+K7ec,J:N,uI=6KiH[:!`G^"@TF`__HEcH+!E!1)sDJa4hCC=lkBP;$kAn>OaA7PUJ!F]C8?iOF4
+?2e(1>?Y50=oVS(=8c2"<<-"s;u]bq;>j>j:]F2f:&dod9D_?\8c;3U8,YpT7J'"C6hE_46.,]f
+j1VUmURn!BQC!p;s6@h>V1<aZs8USms+Y?#AOpZVCJ/\lG'eL\H[JIZKnG)6KSG3[KEHgYKS9;V
+!/1?+s+p-!!/Tc'r'LBMqaCHQs$lrW!_>mSr^qZ59MJ5V:Jakb;H$Ln<E<1'=^#$7?!grI@Uit\
+B4u!pCi402EH?5FGBnL^I=Hd"KSG8=MN!OUOckroR$jG6StMdPUo1/kX0&S0ZEpsI\@T>d^VI_(
+`Q$!@bKS8XdF$Fmf%8R.gYCWBi8N\UjQ5OekiqBum-X60n*olInd"dYo_%nNp@nR]s7u]kr;6Kk
+rVcEgJcD,;J,~>
+JcC<$R/cjYrVc`nrVQWks7uWg!Vc<eoiq([o()>?n*f]3m-O$%l0%3kjQ#7Yi83;Fg=k32e^W'q
+d*BnZb/hWB`59@*]tCqe\$`QJYcb+/Wi)_iU7n3NS!o_1Q'7AlNf8mQLPCJ7J:Du76UjU;9MkR\
+nk]6[s%NJgqG6ub!)EJes%`SiohbB["Ahlh:J^pcqG@Do;c?Rl;>XDm<<-)!=7TDc<rc@t=oVV$
+=TDRt=85nr=oDG&=8c5$=8l>^Yd(OA[^`l[]Y;.s_SjF6aND]NcHstfeCE1&g"P3:h;@/LioB+]
+k3(sml0@U$m-X6/n*fc8nbr%YoDS=Kp&4O^oDJ1Znc&%VmfMqEmJZAQlg!d7l2TrIkPjTKjlGL_
+j5T(Wrnmh7hYu=<gtUQ:g"G$0f@JLOe:5rqdF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf
+\[f5Z[^NTNZa-j?Yck43XfSS'Wi;noVPU)aUS=HUTV%gHS=?":R@'A.QBd\uP*1rhO,o<\N/W[P
+M2@%DL5(A6K7\Z)J:E#rI=-BgH?sj]GB\4QFEDSEEH2"t"E/0qD/B2e$YjBhBP1siAS#C_A,]p<
+@:9(As'>\2r`fM/>$Co.s&]8&rDrqu!*&nqs&/korD<Jhs%`Jds%NDbqb$iZrCH`SrC6]RoL/IA
+oKqq2e,L]h[XVgh<DcOe9hS,N`hnN.>Z!sYR-`[W6,l#@0/5%;3'/r_r]pKM&jo)I3(QY57nHBG
+91_]G91_`Kr_3Yn9heDX9hnM]qG6l]k!Ao3r^6QNs$crWrC6o[8P/nRInNI09hnJ\:f1+h;cHat
+='/U/>?kH@?X[DRAS#LfBkqO&DfKc<FEVkRH@1-jJ:iN0LP^nINK93bPa.W(S"-(CTqeE]W2co#
+YHY==[C3TV]Y2(q_Sa@4aN;WLcHjnce'ut#f\5*8h;@/LioB+]k3(smlKdg(mdKW6nc/.boCV\J
+p%J+RrqQNhs8)Zjrqu`np&9OBR/_[~>
+JcC<$R/cjYrVc`nr;6Nj!;ZTg@/'Bgp%@tKo()>?n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$iZLYck10Wi2ejUS4<OS=5h3Q'7AmNf8mQLk^S8JUi2gGC#"&TXt$6
+r4`-CrkAEIrkSQM#K+L"a2l<Bao0BWbPo]ec-4E,c2Q#bblGuec2Z)gch,TbdeLBJ\F[2q\Giu2
+\Giu;\GNi8])K5?\G3TiYHbF@[^WfZ]Y;.s_SjF6aND]NcHsteeCE.%g"P3:h;@/LioB+]k2tml
+l0@U$m-X6?mfN"Knbr%YoDeIHp&=U_oDJ1Znc/+Wn,MhUmJcJPli68LklU)3kPjTKjlGL_j5T(W
+rnmh7hYu>[gtUQ:g"G$0f@JL%eC2mpdF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f5Z
+[^NTMZa-j?Yck43XfSS'WMl_mVPU)aUS=HUT:VXFS=?":R@'A.Q'IStP*1rhO,o<\N/W[PM2@%C
+L4t;5K7\Z)J:E#rI=-D@H4kLJGB\4QFEDSEEH,r:Df0H0D#S2XC2%?pB4kgfARo=]raGn:@/aO5
+?3":1>QS,5>5h\)=9)G$<rZ/"<;fbq;ZBVm;#X8j:Adid9`@]^9)_E\8GPdS7f5^I7/0.A6L@(e
+rsA/Shq?B$aMu6<rr3-#i7O[srr4@=s4ElkLg#t,P#kSRUSOTWV5.$g=]qo3Yd(I=YctI>Za@!?
+YHY5/YQ;2?n$_@Er'L?LqaCHQs$lrWHq6h#8kM`L9MJ5V:Jakb;H$Ln<`W:(=^#$7?!grI@Uit]
+B4u$qCi402EccGJG^=^bIXm!%KSG8=Mi<[WOckuqR$jG7StMdQV5L8lXKA\1ZEq!K\[oGe^VI_(
+`Q$!@bKS8XdF-Oof%8U/gYL]Ci8N\UjQ>Ufl0/iGlg4$,n*fc9o()DEo_%nNp@nR]s7u]kr;6Kk
+rVcEgJcD,;J,~>
+JcC<$R/cjYrVc`nr;6Nj!;ZTg@/'Bgp%@tKo()>?n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$iZLYck10Wi2ejUS4<OS=5h3Q'7AmNf8mQLk^S8JUi2V@VB_%IZ+)`
+plG93rf75EOckomPk^LDPl-aEPQ7!BPkp[EQMm*HQMm0KQM[$;OSk18NW>.7OReJ&OSb1:P4t%n
+YHbF@[^WfZ]Y;.s_SjF6aND]NcHsteeCE.%g"P3:h;@/LioB+]k2tmll0@U$m-X6?mfN"Knbr%Y
+oDeIHp&=U_oDJ1Znc/+Wn,MhUmJcJPli68LklU)3kPjTKjlGL_j5T(Wrnmh7hYu>[gtUQ:g"G$0
+f@JL%eC2mpdF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^NTMZa-j?Yck43XfSS'
+WMl_mVPU)aUS=HUT:VXFS=?":R@'A.Q'IStP*1rhO,o<\N/W[PM2@%CL4t;5K7\Z)J:E#rI=-D@
+H4kLJGB\4QFEDSEEH,r:Df0H0D#S2XC2%?pB4kgfARo=]raGn:@/aO5?3":1>QS,5>5h\)=9)G$
+<rZ/"<;fbq;ZBVm;#X8j:Adid9`@]^9)_E\8GPdS7f5^I7/0.A6L@(gs#Ku!Z)XXoS=,_1QBV@A
+f"\/VI)Z-cl%&)uF'`EMD/O2a8U#E*H$Xgb91r,YKSG/6Knb86K7el4r.G$(",2JcMXQ>_62X(J
+6i0:O7K5jU7smj!8P2TJ92&&S:/=\_;,U=k<*!%$=BSg3>[:]D@:E_XAnPdlCM[m,EH6/DGBeF\
+I=?]tK7nu7M2R=QO-,TjQC+)0SXuLJUnsufWiW>+Yd1UD\%0)_]t_A"_o9X:aihoRcdC1jeCN7)
+g=tH>hr*JQj5f@bkNV4DlKdg(mdKW6nac8Bo^qhLp@e7[q#C0iqY^6ir;HTerdk*:s*t~>
+JcC<$R/cjYrVc`nr;6Nj!;ZTg@/'Bgp%@tKo()>?n*f]3m-O'&l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$iZLYck10Wi2ejUS4<OS=5h3Q'7AmNf8mQLk^S8JUi2:6pjI79MPCZ
+nP9-[r_<Dfs%`Vir_NDf!)NMer_N2`pJD)j:JOY\:]=2e;$Kos;c6Lj;>=2j<W?,!=7]Jd=8uD$
+=o2=u=TDRt=8Q+r=TDOu=>I(bZa@0M\\#Mg^VRe*`Q-'BbK\>ZdF-Opf%8U/gYL]Ci8N\UjQ5Od
+kiq?slg4!*mf)YVnF?&Io)J=]o]YuIo`"I[o)J7[nGVhUmf2\Rm/QDOlMg#Lki_..jp1#/jQ#:[
+io0mp!T2c5h1"/6g=k65f[na+e^W*te'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`
+\@8oT[Bm3FZ*:I9Y-"h-X/`.tVl-DgUnjc[TqS*MSt2C@S!ob4R$X)'P`q8nOcYWbNfB!VMi*@J
+Lk^Y<KS+o/JUi9#IXQWlHiA=(H$FOWG'.nKF)l8?E,]`5DJa4hCC=lkBP;$kAn>OaA7PUJ!F]C8
+?iOF4?2e(1>?Y50=oVS(=8c2"<<-"s;u]bq;>j>j:]F2f:&dod9D_?\8c;3U8,YpT7J'"C6hE_4
+6.Putd$&6L<DlRc9h\/P8?n;#@T6&kGKfB;8!mI6.PED63]f,O5!M:u5sn("3'BGt7n?9E9M7uL
+8kDZK9_qHa:/1^aqG6o^k!Ao3rBpHMs$crWrC;6+8P)NH91qrQ9hnJ\:f1+h;cHdu='/U/>?kH@
+?X[DRAS,RgC27X'DfKf>Fa&(VH[U?nJV/W1LP^qJNfT<cQ'Rf*S"6.DTqnN_W2cr$YHY==[^WfY
+]Y2(q_Sa@4aN;WLcHjndeC<($g"P3:h;@/LioB+^k3)!n''efLmI'H3nF?)?oCV\Jp%J+RrqQNh
+s8)Zjrqu`np&9OBR/_[~>
+JcC<$R/cjYrVc`nr;6Njs7uZh#5@ibp%@tKrpj.\nF,f4m-O'&l0.9ljl>C[i8<AHgY1?4f$r0r
+d*L"]bK7iF`59@*^:_(g\$iZMYck11Wi2hkUS4?PS=>n4Q'@GnO,]'SLk^V9JUi2tF*E+iPc)Il
+^&>YF^])"T_8*q+`l?'>aN=D'priZ\!6tMeq9AoaqTT#arltJgrm(Skp!EojdF#J6qmc^:r42^7
+q7#e%rjhg6rjha4!OfN0\H'/:\M:=oZaR?R]"G_k^r"%/a2lEHbg+P^daZdtf@\g3gtgiFi8WeW
+jlY^gl07L!m-O--rpKpXnaZVLs7?6^q=XOVp\"OXrq$'Ys7--YrU9dSs6]gPs6K^MrojLJkNDj,
+!TiDAit15/iS`YOhqm2Fgt^Z<g=b-Xf*0aUeC;sqrm?2Acd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu
+]tD"i]",A]\$i]OZa6sBYct=6Xf\\*Wi;qpVl$;dUnaZXTV%gISXc1=R[KP1QBd`"PEM)kOH5H_
+NJrgSMM[.EL5(D8K7ec,J:N,uI=6KiH?sj]G^"@TF`__HEcH)<Df>Yn!GuZPCC=lkBP;$kAn>Oa
+A7PUJ!F]C8?NOP>?2e(1>?Y50=oVS(=8c2"<<-"s;u]bq;>j>k:]=,e:&dod9D_?\8c;3V8,PjS
+7J'"C6hNe46.PuApZUYld`oqS`Q%lV"6nO8hZ!O"m_Af%I>1X_Pa,EOStDgPTr"P`<*<;*Xfeh2
+Z*:I=ZF$pCrN?@/Yd(F>mC).Cr'L?Lr'^NQs$luXs%!,]r^qW49MA/T:/=\_;,U=k<E<.%=]np5
+>[CcF@:E_XAnYjmCMds-EH6/DGBeF\I=?]tK7nu8M2R=QO-5]lQC+,1SXuLKUnsugWiW>+Yd:^F
+\%0)_]t_D#`5Td<b0/&TcdC1je^i@*g=tH>hr*JRj5f@bkiq?sm-O--n*^GLnac8Bo`"Lbp@n=\
+q#C0iqY^6ir;HTerdk*:s*t~>
+JcC<$R/cjYrVc`nr;6Njs7uZh#5@ibp%@tKrpj.\nF,f4m-O'&l0.9ljl>C[i8<AHgY1?4f$r0r
+d*L"]bK7iF`59@*^:_(g\$iZMYck11Wi2hkUS4?PS=>n4Q'@GnO,]'SLk^V9JUi2t@V'@sH\7IZ
+Nqe\3NrG(@OHG_*Pk^O@PQ$dHQ1gI=Q2[*JQ2HsGQi36HQiE-8OSk18NW>.7O8t@>OT(=?OT(=4
+O9(E(rfQu=!g/S*qiEP:ZEq!K\[oGe^VI_)`Q-'BbKS8XdF-Oof%8R.gYCWAi8EVTj5oFckNV6r
+lg4!*mf)YVnF?&Jo)J=\o_J1Tp@n7Zo`"I[o)J7[nGVhUmf2\Rm/QDOlMg#Lki_..joOT)ro4RL
+iSi_Qhr!;Hh;$f?g=k64rmq>)e^W*tdf.XCd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`
+\@8oS['R*EZ*:I9Y-"h-X/`.tVl-DgUnjc[TqJ$LSt2C@S!ob4R$O#&P`q8nOcYWbNfB!VMi*@I
+LPCP;KS+o/JUi9#IXQWlH[:!`G^+FVG'.nKF)l8?E,T[pD?4TjrbDmVBkV0mB4b^dA7T3L@KBnF
+ra,_5?![G7!aAi3r`T8'!*B,"s&B%urDW_os&&_ks%iVhr([2br_*,\r^m&ZqFCHQr'g6Gpd=^@
+lp95&'&C.!VP0QLR$X/(s8V-"XeL?Irr3bCQMg,T@mk-NDbNcHGBnI[H[JIZ:eq"C!eH&Zre(E+
+KnP)3re(6*",2JdM!g&\62X(J6i9@O7K5jV8,l*[8cD>292&#R9hnJ\:f1+h;cQk!='8[0>[1TB
+?t!MSAS,UhC27[(DfKf>Fa&(VH[U?nJV/W1Ll%%KNfT?eQ'Rf+S"6.DU84W`WN*&%YHY@?[^WfY
+]Y2(r_SjF6aND]NcHjndeCE.%g"P3:h;@/Lj5]4_k32'olKmm)mdKTJnF?)?oCW%T!quB_rqQNh
+s8)Zjrqu`np&9OBR/_[~>
+JcC<$R/cjYrVc`nr;6Njs7uZh#5@ibp%@tKrpj+[nF,f4m-O'&l0.9ljl>C[i8<AHgY1?4f$r0r
+d*L"]bK7iF`59@*^:_(g\$iZMYck11Wi2hkUS4?PS=>n4Q'@GnO,]'SLk^V9JUi2t6UXF78ko:[
+o1o?]r_EMhr_<;cr_NDf!)EJe!)EMhohbB["].ui:/=[a;#=)m;H$Ll;Z0Jm<VTVn<W?,!=7]Jd
+<rcA#=o2=u=TDS!<rl?'r`Jnt!E`G#=>@%cZaR?R]"G_k^r"%/a2lEHbg+P^daZdtf@\g3gtgiF
+i8WeWjlY^gl07L!m-O--rpKpXnaZVLs7?6^q=XOVp\"OXrq$'Ys7--YrU9dSs6]gPs6K^MrojLJ
+kNDj,!TiDAit15/iS`YOhqm2Fgt^Z<g=b-Xf*0aUeC;sqrm?2Acd'h\bfe2PaiMQD`l5p8_ns:,
+^q[Xu]tD"i]",A]\$i]OZa6sBYct=6Xf\\*Wi;qpVl$;dUnaZXTV%gISXc1=R[KP1QBd`"PEM)k
+OH5H_NJrgSMM[.EL5(D8K7ec,J:N,uI=6KiH?sj]G^"@TF`__HEcH)<Df>Yn!GuZPCC=lkBP;$k
+An>OaA7PUJ!F]C8?NOP>?2e(1>?Y50=oVS(=8c2"<<-"s;u]bq;>j>k:]=,e:&dod9D_?\8c;3V
+8,PjS7J'"C6hNe46.l3$mAtVB=&Ddh9he8Q8\CLDBin,#?Dm+r?r<nu.5!).2`iiQ5!VA"5sn%!
+3'BDs8kDWH8PD`J91_ZG9h\7Z:&[od;#3u`:?Fk?6N':L7/fXT7fGpX8,u6\8q'E,9MJ5V:Jakb
+;H$Lo<`W:)=^#'8?=.)K@Uit]BP;-rD/O93EccGJG^=^bIXm!%KSG;>Mi<[WP*;/sR$sM8StMgR
+V5L;mXKA\1Za@0M\[oGe^VRe*`Q-'BbK\>YdF-Opf%8U/gYL]Ci8N_VjQ>Ugl07L"m-X60mfi4N
+o()DErq-?dp\4[^s7u]kr;6KkrVcEgJcD,;J,~>
+JcC<$R/cjYrVc`nr;6Njs7uZh@JBKhp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]R-^:_(g\@/cNZ*1:2Wi2hlUnOHQS=>q6Q'@GnO,]*TLk^V9JUi2tEcl_aNM=/\
+^&P_I]tV4qr4iTS_SjI6a2lBErlY#ZqTSc[rQb;b!mJp6rm(Mh!7:GermCkqd*Va$osst0q7#e%
+rjhs:qRH^<\%&sI\bWc*\MpauZaI6O]"G_k^r"".`lQ9Fbg+P^dF6Urf@\g2gtgiEi8N_VjQ>Uf
+kiqBum-O--mdKW6naZVLs7?9_qXsFQq=XaZrq$'Ys7--YrU9dSs6]gPs6B[MrosIH!9a@Ds5a7A
+ro4%=iVqa>hqm5Gh;$cag()fgf@SU)e^W*tda?Ihci24+c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l
+]=PP_\$i`Q['R*EZ*:I9Y-"e+WiE%sVl-DgUnjcZTqJ$LSt2C@S!ob4Q^3o%P`q8nOcYWbNfB!U
+MM[1GLPCP;KS+o/JUi9#IXQWlH[:!`GlDmnG'.nKF)l8?E,Y_n&8c6!CMITuBP;$jAn>OaA7PUJ
+!F]C8?NOP>?2e(1>?Y50=oVS(=8c/$<E)rr;u]bq;>j>k:]=,f:&[ic9D_?\8cD9V8,PjS7J'"D
+6hE_36.c,CmGd!Sd*9YO`5MZT"8L[%QMph$Q2e1D<eld&Q;^bRT;/*RVPI-i>#qf.Y-.`-s0;g7
+ZEg[;Y5GL(Z0f!]62X(J6i9@P7K,dU8,l*[8cD<_92,=ZInid9:f1+h<)lt"=BSd2>[:ZC?t*SU
+AS,UiC27[(E,fr@Fa&(VH[U?nJqJc3Ll%%LO-#NgQ'[l,S"61FU84W`WN*&%Yd(OA[^WfZ]Y;.s
+_SjF6aND]NcHsteeCE1&g"P3:hV[8Mj5]7`k32'olKmm)mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6i
+r;HTerdk*:s*t~>
+JcC<$R/cjYrVc`nr;6Njs7uZh@/'Bgp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]R-^:_(g\@/cNZ*1:2Wi2hlUnOHQS=>q6Q'@GnO,]*TLk^V9JUi2t?t<tkFFa=M
+q2b?3rJpuAPQ$gCQ2d*GPOat7Q2[*KQ2?mFQi*0FQgp11O8b1;O7A>2O8k:AOnt.@O-#J&Oo(4A
+OcY_&P5UO@O>jDLZaI6O]"G_k^r"".`lQ9Fbg+P^dF6Urf@\g2gtgiEi8N_VjQ>UfkiqBum-O--
+mdKW6naZVLs7?9_qXsFQq=XaZrq$'Ys7--YrU9dSs6]gPs6B[MrosIH!9a@Ds5a7Aro4%=iVqa>
+hqm5Gh;$cag()fgf@SU)e^W*tda?Ihci24+c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP_\$i`Q
+['R*EZ*:I9Y-"e+WiE%sVl-DgUnjcZTqJ$LSt2C@S!ob4Q^3o%P`q8nOcYWbNfB!UMM[1GLPCP;
+KS+o/JUi9#IXQWlH[:!`GlDmnG'.nKF)l8?E,Y_n&8c6!CMITuBP;$jAn>OaA7PUJ!F]C8?NOP>
+?2e(1>?Y50=oVS(=8c/$<E)rr;u]bq;>j>k:]=,f:&[ic9D_?\8cD9V8,PjS7J'"D6hE_36.u8h
+mDQ6-US+-FQC!l#s6e1CV4Dkes8UMjs+t/SASZ4&7S.`FG^4U`HqI%.:]?"SJVAc0KS+l0KS+sW
+K*I!_L5(J>M!p,\62X(J6i9@P7K,dU8,l*[8cD<_92,=ZInid9:f1+h<)lt"=BSd2>[:ZC?t*SU
+AS,UiC27[(E,fr@Fa&(VH[U?nJqJc3Ll%%LO-#NgQ'[l,S"61FU84W`WN*&%Yd(OA[^WfZ]Y;.s
+_SjF6aND]NcHsteeCE1&g"P3:hV[8Mj5]7`k32'olKmm)mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6i
+r;HTerdk*:s*t~>
+JcC<$R/cjYrVc`nr;6Njs7uZh@JBKhp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f$r3t
+dEg+^bK7iF`P]R-^:_(g\@/cNZ*1:2Wi2hlUnOHQS=>q6Q'@GnO,]*TLk^V9JUi2t6pj@585)eP
+:]*ue:BaKf9h\5Tr_EGgrD<Mis%WPgr_EJhoMG9Z!`2Zfr_NJhqbdAk!`MuprDESkr_rktrDro!
+q,[Jro2bQd!*K/%qH3Yur`B)$qcEc!pK@Dr2mBTo[C3TV]Y2(q_Sa@4aN;WLcHjnce'ut#f\5'7
+h;7&IiT&tZk2tjjl0@U$m-X6/n*fc9nc&+ZoDeIZp%%hPp&=U_oDJ1Znc/+Wn,MhUmJcJPlN$5L
+l2TrIkPjWDjT+B@irS/urnn"<hVR)EgtVh^%b]Ldf@JO'eC;sqdF$=erm#?)bfe2PaiMQD`l5p8
+_ns:,^q[Xu]tD"i]",>[[^NTNZa6sBYct=6XfSS'Wi;qpVl$;dUnaWWTV%gISXc1=R[KP0QBd`"
+PEM)kOH5H_NJrdQM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]rc\ZlF`__HEcH)<DuOVcD/=!'C2.Hr
+BP1phAS#C_A,]p<@:9(A!a]/<r`fM/>$Co.s&]8&rDiu"<)ifps&/korD<Mir_EDdr_3;aqb$iZ
+r^ciTr'pTQoL/LBoKqn1gAa=UM.]sl;G^+_8kMZGWJYV";+a61f[Y73a$hI,0f:mM0/PdV5!hP%
+6T6tg5"\F=8kDTJ8k;TI84lTN9`.Wa:An#c:\miJ62X(J6i9@P7K,dU8,l*[8cD<_92,=ZInid9
+:f1+h<)lt"=BSd2>[:ZC?t*SUAS,UiC27[(E,fr@Fa&(VH[U?nJqJc3Ll%%LO-#NgQ'[l,S"61F
+U84W`WN*&%Yd(OA[^WfZ]Y;.s_SjF6aND]NcHsteeCE1&g"P3:hV[8Mj5]7`k32'olKmm)mdKW6
+nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTerdk*:s*t~>
+JcC<$R/cgXrr)ior;6Njs7uZhs7]sqp%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@/fOZ*:C4Wi;nmUnXNRSXZ%7QB[PpO,]*UM2$_:Jq/?!D/jcNMO19\
+]`#P@]EQ!_^;%IurP/ZT`5]g;aN2L%b5'6VbkfT_cMPifbg"E3cMl,id.YlddKItEd*L&8\FmE0
+\G3Pd\,a#7\F[6hZ*UjH\@K5a^;%P&`Q$!@bKJ/Ud*^=le^rI,g>(N@hr*JRj5f@bkNM0plg4!*
+mI'H3nF?&Jo)J=]o_\=LpA4I]o`"I[o)J7[nGVhUmJuYQm/QAOlMg&JkQ'fFk5XNCjSn0?io0mp
+!T2c5h#Z<crn7k8f[na+f%&:"e'cXkd*M^:H-ORVbK@rJaN)<>`Pf[2_SO%&^V7Co]XkYa\@8oT
+[C!9HZE^X<YH=q.X/`2!W2HPjV50l\TqS-OSt;LCS"#h5R$X,(Q'@JqP*(ieO,]*WMi*@JLkg_>
+KnP)2Jq8H&IsufoI!^0cH$FOWG'8"MFE;JBEH#jqDA@#)CMR["BkV0mAnGUcA7K+Y@UW\Qra,_5
+?![G7!aAi3r`T8'!*B,"!``3!rDW_os&&_ks%iVhr([2br_*,\r^m&Zq+(BQr'g6Gpd=[?m6TJ+
+$2!B;g<n0d`Pfdqrri;[f:hX3s!=QBgRWbJ=H\kF=.GkVTq\?Y<)d%&Y-"h/Z*CO;ZEggCZELI7
+qlg+0[J[N*[cKgQ6N0@L7/o^U7f>jW8,u6\8c_RYr_7l;:Jakb;c?Xq<``C+>$G6;?=.)L@q9._
+BPD6uD/O<4F*)SLH$XjdIt3-'KnbD@N/`m[P*D5uR$sP:T:r!TVPgDnXfen5Za@0N\\#Mg^VRe*
+`Q-'BbK\>ZdF6Uqf@\d1gtgiEi8WeWjlYail0@U$m-X60n*ol<o(2MQo`Fj]p\ssfq>^<hqu6Nm
+rUg)?s-Wh:~>
+JcC<$R/cgXrr)ior;6Njs7uZhs7]sqp%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@/fOZ*:C4Wi;nmUnXNRSXZ%7QB[PpO,]*UM2$_:Jq/?!?".G`EdWV(
+Nr"h0NWP9(P5^^CQ2[$FPOat7Q2[*KQ2?mFQi*0DQg^%(O7854O-#J&Onb%:OT:I=OT1IBP5CC@
+O>aAM[C3TU]=bkm_Sa@4aN;WKc-F\`e'uq"f\,!6h;7&IiT&tZk2tjjl07O#m-X3.n*fc9nc&+Z
+oDeI[p$VPMp&=U_oDJ1Znc/+Wn,MeUmJZDOlN$5Ll2TrIkPjWDjT+B@irS/urnmh7hYu=3gtVh^%
+b]Ldf@JO'eC;sqdF$=erm#f6bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"h\[f5Z[^NTNZa6sBYct=5X
+fSS'Wi;qpVl$;dUS=HUTV%gISXc1=R@'A.QBd`"PEM)kOH5H^N/W[PM2@%DL5(D8K7ec,J:N,uI
+=6KiH?sj]GB\4RF`__HEcH)<DuOVhD/=!'C2.HrBP1phAS#C^@q&nU@:9(A!a]/<r`fM/>$Co.s
+&]8&rDiu"<)ifps&/korD<Mir_EAcs%NDbqb$iZrCH`SrC6]RoL/IAoKqq2g]'.[[]H="SXPn2Q
+B_FFf=n2UI_#LYl@[KcEF!'GCi2[8F`qtRH$jp192JB:K7ni1KnG&2K)LB$KE$Z.KnbD@mYBmir
+'LBMqaCHQs$lrWs%!,]r^m2a9`@b9:/=\_;,^Cm<E<1'=^#$7?!^lG@Uiq[AnYmoCi+'/EH?5FG
+BnL^I=Hd!K8#&9MN!OUOHPinQ^F53StD^NUo(&hWi`G.Z*UgG\@K5a^;%M$`5Td<b0/&Td*^=le
+^rI,g>(N@hr*MSj5oFdkiqBum-O--n*fc9o()DErq-?dp\4[^s7u]kr;6Kkrr)KgJcD,;J,~>
+JcC<$R/cgXrr)ior;6Njs7uZhs7]ppp%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8<DIgtLH5f@AC!
+dEg+^bK7iF`P]R.^V%1h\@/fOZ*:C4Wi;nmUnXNRSXZ%7QB[PpO,]*UM2$_:Jq/?!6:+(08kVfS
+q+pl_r_EPi:&[fd:&[oe:]=2i:]!le:\.EW;$'Qi:B"&f;#=,i;?Bcp;Z0Jm:]X?er)<YrrDro!
+q,[JroN(Wd!*K/%qH3]!qH3VrrE/htr`D(`ZaI6O\\#Mg^V[n-`lQ9FbK\>ZdF6Uqf@\d1gtgiE
+i8N_VjQ>Ufkiq?tm-O-,mdKW6naZVLs7?9_qt9CNqXsj[rq$'Ys7--YrU9dS!:BaOs6B[MrosIH
+!9a@Ds5a7Aro4%=iVqa9hqn@g!SlH/g()fgf@SU)e^W*tda?Ihci248c-4ASb/q`Ga2Z*;`5BI/
+_8*h#^:h1l]",A]\$i`Q['R*EZ*:I9Xf\\*WiE%sVl-DgUnaZXTqJ$LSt2C@S!fY2Q^3o%P`q8n
+OcYWbNJrgSMM[1GLPCP;KS+o/JUi9#IXQWlH[:!`G^"@TG'.nKF)l8?E,Y_n'l@c&CMITuBP;$j
+An>Oa@q/tW@:<RC?NOP>?2e(1>?Y50=oVS(=8c/$<E)rr;u]bq;>j>k:]=,e:&dod9D_?\8c;3U
+8,YpT7J'"C6hE_46/DQ'nYgP9=&Dmi:.e)L8@4V)@T6&jBX$BZ8Ut&!.PND43A!'O5<hJ$6UWpo
+5!DS291qlM91h`I8kDWK9_qHa:/1X_qG6r_j[&f2r^6QNs$crWrC?lY!(m/^!D?,c9n,o6:f("f
+;cHat='/U/>?kH??XR>QA7]@dBkqO%DK'T:FEVkRH@1-jJ:`E-L5:_GNK90aPa.T&R[ftATq\?[
+Vl?\uY->1;['mKT]=bkm_8=.0a2lEHc-F\`e'uq"f\,!6h;7&IioB(\k3(smlKdg'mI'H3nF?)?
+oCW%T!quB_rqQNhs8)Zjrqucoo_sFAR/_[~>
+JcC<$R/cgXrr)ior;6Njs7uZhs7ZNerq0OgoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+_bK@oG`P]R.^V.:j\@/fOZ*:C5Wi;nnUnXQSSXZ(8QBdVqO,f0VM2-h<Jq/?!HuaCXLl\@L
+pUpL=s1SKJrP/ZT_o9X9aN2L%b5'6VbkfT_cMPifbg"E3cMl/id.bredf7\td*L%`chY*D\H'.p
+\,Ef:\+R91[fNqHrj_^52nHQ+['mHS]=bkm_8=.0a2lEHc-F\`daZh!f@em4h;-uHiSrnYjlYai
+l07L!m-O--n*fc9nc&+ZoDeI\p&+OVp\X[\p&F[`oDJ1Znc/+Wn,MeUmJZAQlg!d7l2TrIkPjTF
+jlGM%irS/urnmh7hYu=3gtVh^"khP[f@JLOe-XUPdF$=ecHa\Yrl]-#aiMQD`l5p8_ns:,^q[Us
+]Y(kf\[f5Z[^NTNZa6sBYck43XfSS'Wi;qpVkp2bUS=HUTV%gISXc1<R@'A.QBd`"PEM)kO,o<\
+N/W[PM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]GB\4QrcA<bEcH)<DuOVhD/=!'C2%BqBP1phAS#C^
+@q&nU@:9(A!a]/<r`fM/>$Co.!a&N*rDiu"<)ifps&/korD<Mir_EDdr_3;aqb$iZr^ciTr'pTQ
+oL/IAoKqq2h#@ZFinW#-ai;9<rVlubg7OW/s!RB;s8R@u;NR*,=]M&eUnOKY;cHXqY-"h/Yd(F:
+^Tb)OZ*1=4Ycn#0!OT<4\+I,j62X(J6i0:O7K5jU7fl4Q8cD>392&&S:/=\_;,U=k<)lt#=BSg3
+>[:]D@:E_XAS5[jCM[m,E,fr@G'A4XI!pKpJqJf5M2I7OO-,TiQ'[o.S=Z@HUSOcbWiN8)Yd1UC
+[^`l[]YD8!_o9X:aihoQcHstfeCE1'g=k?<hVd>Oj5f=akNM0qlg4!*n*fc9rpg*]o`"Lap@nO\
+s7u]krVQQkrr)KgJcD,;J,~>
+JcC<$R/cgXrr)ior;6Njs7uZhs7ZNerq0OgoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+_bK@oG`P]R.^V.:j\@/fOZ*:C5Wi;nnUnXQSSXZ(8QBdVqO,f0VM2-h<Jq/?!HsgN#Ed3.t
+qN(<0!frJ,rfm;Frfm;Dns'!9rg*PKqj./Hqj-rBm?%"%mZ@=,s,d5B!0?o:rfR2A!0@)?s,m;D
+qiNduZa@0M\\#Mg^VRe*`Q-'BbK\>ZdF-Opf@S^0gYL]Ci8N\UjQ5Oekiq?slg4!*mdKW6naZVL
+s7?9_r:U!]p%S@WqXsm\rq$'Ys7--YrU9dS!:BaO!pf.:rosIH!9a@D!p/M(ro4%=iVqa9hqn@g
+!SlH/g'-0^f@SU(rmV8'da?Ihcd'h\bl5e%b/q`Ga2Z*;`5BI/_8*h"]tD"i]",A]\$i`Q['R*E
+Z*:F7Xf\\*WiE%sVl-AeUnaZXTqJ$LSt2C@R[KP1Q^3o%P`q8nOcPQ`NJrgSMM[1GLPCP;KS+o/
+JUi9#IXQWlH[:!`G^"@TFoHIdF)l8?E,Y_n'l@c&CMIQtBP;$jAn>Oa@q/tW@:<RC?NOP>?2e(1
+>?Y50=TV],=8c/$<E)rr;u]bq;>j>k:]=,f:&[ic9D_?\8cD9V8,PjS7J'"C6hE_46/MVppr'D4
+U7@^>QBd^7s5h5'U4%4Gs8T`cs6Np!6u-XW9Ls>LH$FX]8kV`OKS+r0rIb<7Jq\l2r.Fs&!JuX#
+LZLi"6N':K7/o^U7f>gY84cDP8q0K-9heAY:f("e;c?Xq<``C+>$G6;?XI5N@qB4aBPD6uDJsK6
+F*)SLH$XjdIt3-'L51VCN/`m\P*D5uR@B_<T:r$UVPgGpXfen6ZaI6O\\#Mh^r"".`lQ9Fbg"G[
+dF6Uqf@\g2gtgiFi8WeXjlYail0@U$m-X91nF?MK!V>s_o`=d\rV6Egs8)]krVZZno_sFAR/_[~>
+JcC<$R/cgXrr)ior;6Njs7uZhs7ZNerq0LfoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+_bK@oG`P]R.^V.:j\@/fOZ*:C5Wi;nnUnXQSSXZ(8QBdVqO,f0VM2-h<Jq/?!HpU1h84cPO
+:]!od:B=3br_*;dr_EGgr_WSiqbH]YpJCug:JUmbr)!;gs&&ns;H!Ei!DlSk:ARoi<W#ns=8Gts
+=8Q%d=8uD#=oDG'='5E(qH3VrrE/ht2H[;m[^WfZ]Y;.s_SjF6aND]NcHsteeCE1&g"P3:h;@/L
+ioB+]k3(sml0@U$m-X60n*ol;rpp*\s7H6^r:]gXqtBmZs7H<^r:9mXs7$!Us6]mSrTjUOlK\B5
+s6'IGroO:DjQ-=#!TN);huV`lrnRV1g]#n1g"=p.f%'cL$.I>MdEp4bcHXT4bA>>CaN2EA`Pod5
+_SX.)^V7Co]Xtbc\[],W[^EKKZa-j?YHG"0XK/A$WMl_mV50o^U7n9RT:VXFS=>t8R$a5+Q'ISt
+P*1rgO,f3YN/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH?jaZGBS-.F9Q`+EH,r9rb`HfChmg$Bk_6o
+B4baeARo:\@U`bS@/aL7?<pk9>QS,5>5hY+=BAT&<WZ9#<;fbq;ZBVm;#a>j:Amod9`@]^9)_E]
+8GPdR7f5^I7/0.A6L@(rs$Y>!Am&&/9h\5Q84UCdK5"F`7RWBf[:D\0U*hQC2E<`S1I")i6:=4%
+3&a#n8P;]K91hfW8kV`J91qrQ:/+JX:JO[^;#3ub:?=e>6N':K7/o^U7f>gY84cDP8q0K-9heAY
+:f("e;c?Xq<``C+>$G6;?XI5N@qB4aBPD6uDJsK6F*)SLH$XjdIt3-'L51VCN/`m\P*D5uR@B_<
+T:r$UVPgGpXfen6ZaI6O\\#Mh^r"".`lQ9Fbg"G[dF6Uqf@\g2gtgiFi8WeXjlYail0@U$m-X91
+nF?MK!V>s_o`=d\rV6Egs8)]krVZZno_sFAR/_[~>
+JcC<$R/cgXrVc`nrVQWks7uZhs7ZNerq0RhoCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX/^V.:k\[JoPZEUL6X/`(pUnXQTSsu19QBdYsO,f0WM2-h=K7JH"HuF(MKT2J,
+^\kbD]DoMG]tV4qrP/]T_o0O6a2lBErlY&[q98][rQb;b!mJp6rm(Mhs3UMfrmLho"jkTAcHji9
+\a$]i[fEr3\+I01\,No:\,Wr=\%)@H!4`$=2S-3#[^WfY]Y2(q_SjF6aND]McHjndeC<($g"P39
+h;7)JioB+]k2tmll0@U$m-X60n*oi:rpp*\s7H6^rV#dUr:^$\rq-3]rUTsXs7$$Vs6fpSrp9[N
+s6BUJ!pJh1roS^ljQ,@]io8qTi8<GKh;-lAgY1B7f\"g-f%&:"e'lamdEp4bcHXSVbK@rJaN)<>
+`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKKZa$a=YHG"0XK/A$WMl_lV50o^U7n9RT:VXES"#k7R$a5+
+Q'IStP*(ieO,f3YN/NRMM26reL)#DqK7ec,J:N,uI=6KiH?sj]GB\4QrcAfpEcH)<Df0H0D/=!'
+C2%BqBP1rVAHuaU@q&nU@:9(A!a]/<r`fM/>$Co.!a&N*r`9&!s&Aqqs&/korD<Mis%`Jdr_3;a
+qb$iZr^ciTr'pTQoL/IAoKqq2hu<lUk2"_9bPfEZrri,Re=Q71s"0`?NeUSgNKfZ+<19GSTV83V
+<)Qc"Xf\b1Z*:J4s1Z7QYck14YHY79Yd:dHqmZ4+j[&f2rBpHMs$crWrC;<-8P)NH91qrQ9hnJ\
+:f1+h;cHdu='/U/>[1QA?X[DRAS,RgC27X'DfKf>Fa&(VH[U?nJV/W1LP^nINfT<cPa7])S"-(C
+TqeE]W2co#YHY==[C3WW]Y2(q_Sa@4aN;WLcHjnce'ut#f\5*8h;7)KioB+]k3(smlKeK:%drfS
+nF?)?oCMVIp%J+RrV-HiqYL-erqu`no_sFAR/_[~>
+JcC<$R/cgXrVc`nrVQWks7uZhs7ZNerq0RhoCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX/^V.:k\[JoPZEUL6X/`(pUnXQTSsu19QBdYsO,f0WM2-h=K7JH"HsU5oDKU>a
+OSk14NWP9'P5UXFPlR'JQ2[$GPOat7Q2[*KQ2?mEQi!'LQ^7E5qiKm"o8is7rfHu;s,d8CpQ,B9
+q2bfAOH>TeP*5a*26sQs\%0)_]t_A"`5Td<b0/#ScdC1jeCN7)g=tE=hVd>Oj5f=ak32'olKdg'
+mI'H3nF5uIo)J=]o_eC\p@7nTpA=O^o`"I\o)A1ZnG_nVmf2\Rm/QDOlMg#Lki_..k'uLRjQ#:[
+io/hRhr!;Hh;$f?g=k64f[na+e^W*te'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`
+\@8oT[C!9HZ*:I9Y-"h-X/`2!W2HMhUnjc[TqS-OSt;IAS!ob4R$X,(Q'@JqOcYWbNfB!VMi*@J
+Lkl"b'nq<nK7\Z)J:E#rI=-BfH?jaZGBS-.F;&_9EH,r9DJj<.Chmg$Bk_6oB4h-S#@q=S@U`bS
+@/aL7?<pk9>QS,5>5hY+=BAT'<rZ2"<;fbq;ZBVm;#a>k:Adic9`@]^9)_E]8GPdR7f5^I7/0.A
+6L@(ss#8rJWhc;WR?j/(Q2gC%\u)$H^&S,fHKT3V7Up1LDb*KCGBe@XH[ACX:5"7QJqSf0K`D(5
+O+dLb#D.S_KnY8<M!]uZ62X(J6i0:O7K5jU7t+!#8P2TJ92&&S:/=\_;,U=k<*!%$=BSg4>[:]D
+@:E_XAnPdlCM[m,EH6/DGBeF\I=?]tK7nu7M2I7PO-,TiQC+)0S=ZCIUSOfdWiN8*Yd1UC[^iu^
+]t_A"_o9X:aihoRcdC.heCN7(g=tE=hVdAPj5f=akNM0qli6;]mdKW6nac8BoCV_Kp@e7Zp]C9f
+qY^6ir;HTdrdk*:s*t~>
+JcC<$R/cgXrVc`nrVQWks7uZhs7ZNerq0OgoCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX/^V.:k\[JoPZEUL6X/`(pUnXQTSsu19QBdYsO,f0WM2-h=K7JH"HpU1f7n63F
+qbR,a!)EMh!DZAg9E7fc:B"&g;#X8i:B+,\;"mfg:esjc:]+&d;>jAn;,I6h!DlSj:B"8i<;T\i
+<rQ1t<qBAm=T)>$=Su=u=T;P&=9)G%=Sl1u=T;M(=T)A[ZEq!K\[oGe^VI_)`Q-'BbKS8XdF-Oo
+f%8U/gYCWAi8EVTjQ5Odkiq?slg4!*mdKW6nF?MKs7?9_r:U$^nb;tTqt9s\rq$*Zrpg$XrpTmT
+s6]gPs6K^MrojLJkNDj,J*#bPj5].YiS`YOhqm2Fgt^Z<g=b-2f@SU(eC;srda?Ihcd'h\bfe2P
+aiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R*DYct=6Xf\\*WiE%sVl$;dUnaZXTqJ$LSt):>
+R[KP1Q^3o%P`q8mOH5H_NJrgSMM[1GL]<)DKnP)2Jq8H&IsufoI!^0cH$FOWG'3e+'6A26EH#i6
+DJa6,CMR[!BkV0mB)Z?HA7K+Y@UW\Qra,_5?![G7!aAi3r`K;)=',B%s&K(urDW_os&&_ks%iYi
+r([/ar_*,\r^m)[q+(?Pr'g6Gpd=[?m6T_27(IbS=&Dgg9M.lI8?.Vf?W9]eD7@fA6Cg.e.5Eb=
+3AE?P5<hJ#6:<dl4\A:=91hiM9)nol<_6"Y9MJ8V:/+MY9i(X_qG6u`j[&f2rBpHMs$crWrC;<-
+8P)NH91qrQ9hnJ\:f1+h;cHdu='/U/>[1QA?X[DRAS,RgC27X'DfKf>Fa&(VH[U?nJV/W1LP^nI
+NfT<cPa7])S"-(CTqeE]W2co#YHY==[C3WW]Y2(q_Sa@4aN;WLcHjnce'ut#f\5*8h;7)KioB+]
+k3(smlKeK:%drfSnF?)?oCMVIp%J+RrV-HiqYL-erqu`no_sFAR/_[~>
+JcC<$QiHaXrVc`nr;6Nj!;ZTg!Vc<eoj.4]o()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$iWKYck10Wi2ejUS4<OS=5h3Q'7AmO,T!RLk^S8JUi2tH?"+XLm"UV
+qRcd?&A>fk^;%Fu^qmn*`Q#s=aN=G(q9/TXqT\uaps&f`rQbJjpX/rf#gq#Fcd'h^cHZ9tlF?i&
+qmQ@1!OfK7\G!E.\-'4M\@MLHrjVR21paTu\@T>d^VI_(`Q$!@bKS8XdF$Fmf%8R.g>(N@i8EVT
+j5oFckNV6rlg4!*mdKW6nF?MKs7?9_rUp-_qtKs^qY0s^qXsm\rq$*Zrpg$XrpTmTs6]gPs6K^M
+rojLJkNDj,!TiDAj*p"HiS`YOhqm2Fgt^Z<g=b-2f@SU(eC;sqda?Ihcd'h\bfe2PaiMQD`l5p8
+_ns:,^q[Xu]tD"i]",A]\$i`QZa6sBYct=6Xf\\*WiE"qVl$;dUnaZXTqJ$LSXc1=R[KP1Q^3o%
+P`h2lOH5H_NJrgSMM[1GLPCP;K`?Z:Jq8H&IsufoI!^0cH$FOWG'3e+'6A26EH#i6DJa6,CMR[!
+BkV0mB)Z?HA7K+Y@UW\Qra,_5?![G7!aAi3r`K;)=',B%s&K(urDW_os&&_ks%iVhrD!8br_*,\
+r^m)[q+(?Pr'g6Gpd=[?m6T_2#k-a,eBQ+S`5V]T"6\@2Q2^e#m'ZliG_B7]P*/q9StVjPUn^pg
+=Kej0Xo5I*ZN't(^'_WWY-5(6Z*:OB[edK+[cBaP6N':L7/fXT7fGpX8,u6\8q'E,9MJ5V:Jakb
+;H$Lo<`W:)=^#'8?=.)K@Us%^BP;-rD/O93EccGJG^=^bIXm!%KSG;>Mi<[WP*;/sR$jG7StMgR
+V5L8lXKA\1ZF%'L\[oGe^VI_(`Q$!@bKS8XdF-Oof%8U/gYL]Ci8N\UjQ>Ufl07L!m-X60mgJXT
+o()DEo_%nNp@nR]s7u]kr;6KkrVcEgJcD):J,~>
+JcC<$QiHaXrVc`nr;6Nj!;ZTg!Vc<eoj.4]o()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$iWKYck10Wi2ejUS4<OS=5h3Q'7AmO,T!RLk^S8JUi2tH=:?#Ed<8#
+n;[R3P*>d-rK[DIqigW9qN_&Grg!>Gr0R5Fpm;#Hq2jZuplPB8rfHu;q2bT;n<![4rf[;D1paTu
+\@T>d^VI_(`Q$!@bKS8XdF$Fmf%8R.g>(N@i8EVTj5oFckNV6rlg4!*mdKW6nF?MKs7?9_rUp-_
+qtKs^qY0s^qXsm\rq$*Zrpg$XrpTmTs6]gPs6K^MrojLJkNDj,!TiDAj*p"HiS`YOhqm2Fgt^Z<
+g=b-2f@SU(eC;sqda?Ihcd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`QZa6sBYct=6
+Xf\\*WiE"qVl$;dUnaZXTqJ$LSXc1=R[KP1Q^3o%P`h2lOH5H_NJrgSMM[1GLPCP;K`?Z:Jq8H&
+IsufoI!^0cH$FOWG'3e+'6A26EH#i6DJa6,CMR[!BkV0mB)Z?HA7K+Y@UW\Qra,_5?![G7!aAi3
+r`K;)=',B%s&K(urDW_os&&_ks%iVhrD!8br_*,\r^m)[q+(?Pr'g6Gpd=[?m6Tb3.F#/qU7Id?
+Q'IU6s5:esTRM.8s8B9^im1_98S`-Z96>?#G^4[a9M81\KEm']KnG&1s8W%Y$%mh_L4t>9M26uU
+LZCc!6N':L7/fXT7fGpX8,u6\8q'E,9MJ5V:Jakb;H$Lo<`W:)=^#'8?=.)K@Us%^BP;-rD/O93
+EccGJG^=^bIXm!%KSG;>Mi<[WP*;/sR$jG7StMgRV5L8lXKA\1ZF%'L\[oGe^VI_(`Q$!@bKS8X
+dF-Oof%8U/gYL]Ci8N\UjQ>Ufl07L!m-X60mgJXTo()DEo_%nNp@nR]s7u]kr;6KkrVcEgJcD):
+J,~>
+JcC<$QiHaXrVc`nr;6Nj!;ZTg!Vc<eoj7:^o()>?n*f]3m-O$%l0.9ljQ#7Yi8<AGgY1<3f$r0r
+d*BnZb/hWB`59@*^:_%f\$iWKYck10Wi2ejUS4<OS=5h3Q'7AmO,T!RLk^S8JUi2tH:(%h84lQP
+:]=,e9`Rrf:B=3br_3>dr_EGgr_WSis%`Mgo2,0Y!`2Zfr_NGgqbd;i!Du\m;#sKhrD*Ags&T"s
+rD`YopK%8pqc<JnqcNbt!*K5'pfIMtpfRMsqH3Yu1paTu\@T>d^VI_(`Q$!@bKS8XdF$Fmf%8R.
+g>(N@i8EVTj5oFckNV6rlg4!*mdKW6nF?MKs7?9_rUp-_qtKs^qY0s^qXsm\rq$*Zrpg$XrpTmT
+s6]gPs6K^MrojLJkNDj,!TiDAj*p"HiS`YOhqm2Fgt^Z<g=b-2f@SU(eC;sqda?Ihcd'h\bfe2P
+aiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`QZa6sBYct=6Xf\\*WiE"qVl$;dUnaZXTqJ$LSXc1=
+R[KP1Q^3o%P`h2lOH5H_NJrgSMM[1GLPCP;K`?Z:Jq8H&IsufoI!^0cH$FOWG'3e+'6A26EH#i6
+DJa6,CMR[!BkV0mB)Z?HA7K+Y@UW\Qra,_5?![G7!aAi3r`K;)=',B%s&K(urDW_os&&_ks%iVh
+rD!8br_*,\r^m)[q+(?Pr'g6Gpd=[?m6Th50BJmI>?"Hp9hS/N8Aq0MAQDPq7"r^[>t:$2-SI,1
+2``c[5!D4u6UWmn5"S=<9)_Hc8kB!^rDrql!)NSg"&DWd:ARf`:]*uK62X(J6i9@O7K5jV8,l*[
+8cD>292&#R9hnJ\:f1+h;cQk!='8[0>[1TB?t!MTAS,UhC27[(DfKf>Fa&(VH[U?nJV/W1Ll%%K
+NfT?eQ'Rf*S"6.DU84W`W2cr$YHY=>[^WfY]Y2(q_Sa@4aN;WLcHjndeC<($g"P3:h;@/LioB+^
+k3)!nlKdg(mdKTPnF?)?oCV\Jp%J+RrqQNhs8)Zjrqu`np&9OBQiDR~>
+JcC<$QiHaXrVc`nr;6Nj!;ZTgA,#]jp%@tKo()>?n*f]3m-O'&l0.9ljQ#:Zi8<AHgY1<3f$r0r
+d*BnZbK.`C`59@*^:_(g\$iZLYck10Wi2hkUS4?PS=>n4Q'@GnO,]'SLk^S8JUi2tHZ=1SKoVh;
+]_]8?]FMWh^;%J!_8=(,`Q#s>ao9HZbP9<Xc2Gr_c2Q#ecN)>ddJ_JqdEp4crQYMibK79h\a?p+
+\,Wo5\,<Z7\,3]/\,*W5\bN]0\MUY#[^`l[]Y;.s_o9X:aihlPcHstfeCE1'g"P6;hV[8Mj5]4_
+k3(smlKdg'mI'H3nF5uIo)J:]o_eC]pAF[Wq#'mbpA=O^o`"I\o)J7[nGVhUmf2\Rm/QAOlMg&J
+kQ'fFk5XNCjSn0Nio/kSi8<DJh;-l@gY1B7f`'J+f%&:"e'e6CIaHEdcHXSVbK@rJaN)<>`Pf[2
+_SO%&^V7Co]Xtbc\[],W[C!9HZE^X<YHG"0XK/A#W2HPjV50o^U7n9QSt;LCS"#k7R$a5+Q'@Jq
+P*(ieO,f3YN/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH?jaZGBS+NFE;MDEH,r9s).jR"DhjhC2*Z\
+!G?$DAH?=OraGq;?srt@!FB(2>lS".>5_S*=BAT'<rZ2"<;fbq;ZBVm;#a>k:Adic9`Ic_9)V?\
+8GPdR7f5^I7/0.A6L@)!rs7lJg="9f`Pfaorr_62U"95C*3.lQQ[=HhOHEC>S=cOLTr+Pa;HBs&
+YH>(6Yd+0,r4`38"L52:[C5n?osWpIr'LBMqaCHQr^QlWs%!,]r^m2a9`@b9:/=\_;,U=l<E<.&
+=]ns6?!^lG@U`kZAnYmnCMds.EH6/DGBeF\I=?]tK8#&9M2R=ROHPfmQC+,1SXuOLUnsugWiW>+
+Z*UgG\%0)_^;%M$`5Td<b0/&TcdC1je^i@*g=tH>hr*JRj5f@bkNV6rm-O--n*fc9o()DErq-?d
+p\4[^s7u]kr;6KkrVcEgJcD):J,~>
+JcC<$QiHaXrVc`nr;6Nj!;ZTgA,#]jp%@tKo()>?n*f]3m-O'&l0.9ljQ#:Zi8<AHgY1<3f$r0r
+d*BnZbK.`C`59@*^:_(g\$iZLYck10Wi2hkUS4?PS=>n4Q'@GnO,]'SLk^S8JUi2tHXC5qDfgGe
+O7J;4OHG_*PQ$gFQ2d*GPOk%8Q2[*KQ26gEQhcsBQiE?QP`q1'OQ_`*NrG+7OSb1>OSY%$OT1IC
+Ou0MQ[^`l[]Y;.s_o9X:aihlPcHstfeCE1'g"P6;hV[8Mj5]4_k3(smlKdg'mI'H3nF5uIo)J:]
+o_eC]pAF[Wq#'mbpA=O^o`"I\o)J7[nGVhUmf2\Rm/QAOlMg&JkQ'fFk5XNCjSn0Nio/kSi8<DJ
+h;-l@gY1B7f`'J+f%&:"e'e6CIaHEdcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[C!9H
+ZE^X<YHG"0XK/A#W2HPjV50o^U7n9QSt;LCS"#k7R$a5+Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5
+K7\Z)J:E#rI=-BfH?jaZGBS+NFE;MDEH,r9s).jR"DhjhC2*Z\!G?$DAH?=OraGq;?srt@!FB(2
+>lS".>5_S*=BAT'<rZ2"<;fbq;ZBVm;#a>k:Adic9`Ic_9)V?\8GPdR7f5^I7/0.A6L@)#s"EiU
+XJMY^R[08)PQ1[B_Pj&UV"4QNL9.Or>%1'=D+@3?G'8+VI!\LY:P=CRJVF)VrVunXrf78<KnY8<
+LktGRj?`]1r^6QNs$coVr^ZuZ!(m/^!D?,c9n,o6:f("e;cHat<`iL->?kH??XR>PA7]@dBkhF#
+DK'T9FEMePH@('hJ:W?,L5:\EN/s'`PEhH$R[]k>Tq\?ZVl?\tXfo"9['mHS]"Gbl_8=.0a2lEH
+c-FY_daZguf@em4h;-uHiT&tZk2tjkl0@X%mI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrqu`np&9OB
+QiDR~>
+JcC<$QiHaXrVc`nr;6Nj!;ZTgAbYolp%@tKo()>?n*f]3m-O'&l0.9ljQ#:Zi8<AHgY1<3f$r0r
+d*BnZbK.`C`59@*^:_(g\$iZLYck10Wi2hkUS4?PS=>n4Q'@GnO,]'SLk^S8JUi2tHU:(g7S$-F
+:JO[_:&duf:C']i9MA/S9hnI_:]=2i:B4/f:\.EW;$'Qi:B"&e;#=,g;?9Wkr_W\m:]4&g:]F/i
+<VTVn<;9Ji<rQ2"<qTPk=Su7^=T;P(=T2G[ZaI6O\\#Mg^VRh,`lQ9FbK\>ZdF6Uqf@\d1gtgiE
+i8N_VjQ>UfkiqBum-O--n*fc8nc&+Zo)SF\p&=[_p[n7Yp\jg_p&=U_oDS7[nc/+Wn,MhUmJcJP
+lN$5Ll2TrIkPjWDjT+B@it15/iS`YOhVR)EgtUT;g=b-Xf*0aUeC;sqrm?2Acd'h\bfe2PaiMQD
+`l5p8_ns:,^q[Xu]tD"i]",A]\$i]OZa6sBYct=6Xf\\*Wi;qpVl$;dUnaZXTq@pJSXc1=R[KP1
+Q^3o$PEM)kOH5H_NJrgSMM[1GLPCP;KS+o/JUi9#IXQWlH[:!`G^"@TF`__HF)l8?E,Ybos(qmT
+CMR[!rb)=FB)Z?BA7PUJ!b#JEra,\4?2e+/>6%k*=TV],=8l8#<W?%s;u]bq;>j>k:]F2f:&[id
+9D_?[8cD9V8,PjS7J'"C6hE_460A2'b)9k6;G^+_8kV]Ga/"8s<),k`R`1C^?sPE60.f%@0/PgW
+5XIb'6od1i8kDZK8kVcLrVudr##.ie:/+GXq,$o`r(c<=r'LBMqaCHQr^QlWs%!,]r^m2a9`@b9
+:/=\_;,U=l<E<.&=]ns6?!^lG@U`kZAnYmnCMds.EH6/DGBeF\I=?]tK8#&9M2R=ROHPfmQC+,1
+SXuOLUnsugWiW>+Z*UgG\%0)_^;%M$`5Td<b0/&TcdC1je^i@*g=tH>hr*JRj5f@bkNV6rm-O--
+n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcEgJcD):J,~>
+JcC<$QiHaXrVc`nr;6Njs7uZh#5@ibp%@tKrpj4^nF,f4m-O'&l0.<mjl>C[i8<AHgY1?4f$r0s
+dEg+^bK7iF`P]O,^:_(g\@/cNZ*1:2Wi2hlUnOHQS=>q6Q'@GoO,]*ULk^V9Jq/;uHZ!bGJ;KGf
+bP\sU]">Vg^:sT]#f+9n_o0R8aN=G(s3(Das3(2]qT\uaps&f`rQbJjpX/rf"4>KAci),lc-+5L
+a8NOD\a-d"[fEl9[/m_FqmcO4qRH=2pp^@8\GWli['mHS]=bkm_8=.0a2lEHc-F\`daZh!f@em4
+h;-uHiSrnYjlYail07O#m-X6?mfDqJrpp*\!;-3^s7ZEcn+chTrV$0^rq-3]rUU!Ys7$!Us6]mS
+rTsRM!:'RJs6'IGroX7B!9F.>!TN);i!/)qhVI#Cg]#oVg"=p.f%/C$eC2jndEp4ccHa\YbKJ&M
+aN2EA`Pod5_SX.)^V@Lr]Y(kf\[],W[^EKKZa-j?Yck43XfJJ%WMl_mVPU)aUS=HTT:VXFS=?":
+R@'A.Q'IStP*1rhO,o<\N/W[PM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]s*#-"F`__HEcQ/>E,TW3
+D/=$(CMIS_BE;aXrac+@A,]p=@:3LB?NFJ=r`oJ-!*]>(!a&N*r`9&!s&Aqqs&/korD<Mis%`Jd
+r_3;aqb$iZr^ciTr'pTQoL/IAog8"2k5P_YjP8D5b0%cDr;QlXe=bk$rtq:+O+gVfNK]Q0<19GT
+TVA8]<*ED+Y-+u-YQ1s,s8'G3Yd1XEpp]t*j?`]1rBpHMs$crWrC6o[8P/nRIS3@/9hnJ[:f1+h
+;cHat='/U/>?kH??XR>QA7]CeBkqO%DK'T:FEVkRH@1-jJ:`E-L5:_GNK90aPa.T&R[]n@Tq\?[
+Vl?\tY->1;['mKT]=bkm_8=.0a2lEHc-F\`daZh!f@em4h;7&IiT&t[k2tmll0@X%mI'H3"n;'Q
+o(2MQo`Fj]p\ssfq>^<hqu6NlrUp/@s-Nb9~>
+JcC<$QiHaXrVc`nr;6Njs7uZh#5@ibp%@tKrpj4^nF,f4m-O'&l0.<mjl>C[i8<AHgY1?4f$r0s
+dEg+^bK7iF`P]O,^:_(g\@/cNZ*1:2Wi2hlUnOHQS=>q6Q'@GoO,]*ULk^V9Jq/;uHX1)mCiaoT
+POa_:OHPfjPQ$gEPlR'HPOk%7Q2[*KQ26gEQhcsBQiE?OPl?mFO84n'O8Y+<O8+h6OoCI=O6r#1
+O-#G%OT1Fq['mHS]=bkm_8=.0a2lEHc-F\`daZh!f@em4h;-uHiSrnYjlYail07O#m-X6?mfDqJ
+rpp*\!;-3^s7ZEcn+chTrV$0^rq-3]rUU!Ys7$!Us6]mSrTsRM!:'RJs6'IGroX7B!9F.>!TN);
+i!/)qhVI#Cg]#oVg"=p.f%/C$eC2jndEp4ccHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[],W
+[^EKKZa-j?Yck43XfJJ%WMl_mVPU)aUS=HTT:VXFS=?":R@'A.Q'IStP*1rhO,o<\N/W[PM2@%D
+L5(D8K7ec,J:N,uI=6KiH?sj]s*#-"F`__HEcQ/>E,TW3D/=$(CMIS_BE;aXrac+@A,]p=@:3LB
+?NFJ=r`oJ-!*]>(!a&N*r`9&!s&Aqqs&/korD<Mis%`Jdr_3;aqb$iZr^ciTr'pTQoL/IAog8"2
+kPkkB\#H0qS!]S.QN$n-iPMOaIBN>EeU#ba@7Fa@CMlj=FEVnRH@&7W:ecUrJqO&U!.t1LrJpo=
+"HJ4nLl(MSj?`]1rBpHMs$crWrC6o[8P/nRIS3@/9hnJ[:f1+h;cHat='/U/>?kH??XR>QA7]Ce
+BkqO%DK'T:FEVkRH@1-jJ:`E-L5:_GNK90aPa.T&R[]n@Tq\?[Vl?\tY->1;['mKT]=bkm_8=.0
+a2lEHc-F\`daZh!f@em4h;7&IiT&t[k2tmll0@X%mI'H3"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6Nl
+rUp/@s-Nb9~>
+JcC<$QiHaXrVc`nr;6Njs7uZh#5@ibp%@tKrpj:`nF,f4m-O'&l0.<mjl>C[i8<AHgY1?4f$r0s
+dEg+^bK7iF`P]O,^:_(g\@/cNZ*1:2Wi2hlUnOHQS=>q6Q'@GoO,]*ULk^V9Jq/;uHU0td7n?9I
+:ejda:&duf:B4/f9`Ife:B"&g;#!iY;"dcd;#O2f;#4&g;?9Wkr_W\m:]4&g:]4&e<V]\f<<-(q
+=8c1m=8Q+t=5[15['mHS]=bkm_8=.0a2lEHc-F\`daZh!f@em4h;-uHiSrnYjlYail07O#m-X6?
+mfDqJrpp*\!;-3^s7ZEcn+chTrV$0^rq-3]rUU!Ys7$!Us6]mSrTsRM!:'RJs6'IGroX7B!9F.>
+!TN);i!/)qhVI#Cg]#oVg"=p.f%/C$eC2jndEp4ccHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf
+\[],W[^EKKZa-j?Yck43XfJJ%WMl_mVPU)aUS=HTT:VXFS=?":R@'A.Q'IStP*1rhO,o<\N/W[P
+M2@%DL5(D8K7ec,J:N,uI=6KiH?sj]s*#-"F`__HEcQ/>E,TW3D/=$(CMIS_BE;aXrac+@A,]p=
+@:3LB?NFJ=r`oJ-!*]>(!a&N*r`9&!s&Aqqs&/korD<Mis%`Jdr_3;aqb$iZr^ciTr'pTQoL/IA
+og8"2l2NU6Xa=AU;c$.^91hkJc)-&'<)#bdTtbn?L,g_40JtaK2DdN]5XIe+3B02d8kM`K8kV`H
+rVuaq"BA2k9htI[qG7&bj?`]1rBpHMs$crWrC6o[8P/nRIS3@/9hnJ[:f1+h;cHat='/U/>?kH?
+?XR>QA7]CeBkqO%DK'T:FEVkRH@1-jJ:`E-L5:_GNK90aPa.T&R[]n@Tq\?[Vl?\tY->1;['mKT
+]=bkm_8=.0a2lEHc-F\`daZh!f@em4h;7&IiT&t[k2tmll0@X%mI'H3"n;'Qo(2MQo`Fj]p\ssf
+q>^<hqu6NlrUp/@s-Nb9~>
+JcC<$QiHaXrVc`nr;6Njs7uZhAG>fkp%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V.7i\@/fOZ*:C4Wi;nmUnXNRSXZ%7QB[PpO,]*UM2-e;Jq/?!I!TdRI"mWS
+^:X?T!P?#D^&PeR^VI\%_Sa@5aN;R#b5]Z[bk]N_cM5Z`cMc&hd.brcdK7eAci),nc-4>Na2YXe
+\H'/8\aI!-\c927\,Wo:[/m_FqmcO4rj_L/s1&$<!4r0?1UFO!\[oGe^VI_(`Q$!@bKS8XdF-Oo
+f%8U/gYCWBi8N\UjQ5Oekiq?slg4$,mdKW6nc&+Zo)SF\p&Faap[.bRp\sm`p&=U`oDJ1Znc/+W
+mfMqEmJZAQlg!d7l2TrIkPjTKjlGL_j5T(Wrnmh7hYu=3gtVh^G1kO"f@JL&eC;sqdF$=ecHa\Y
+bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"h\[f5Z[^NTNZa6sBYct=6XfSS'Wi;qpVl$;dUnXQVTV%gI
+SXc1=R[KP0QBd`"PEM)kOH5H_NJrgSMM[1GLPCM9K7ec,J:N,urd>6'H[:!`G^"@TF`__HErL%c
+E,TW3D/=$(CMIS_BE;aXrac+@A,]p=@:3LB?NFJ=r`oJ-!*]>(!a&N*r`9&!s&Aqqs&/korD<Mi
+s%`Jdr_3>bqb$fYr^ciTr'pTQoL/IAog8"2kl1qUiS2i+b0%fEr;R_od[o\&s8.rY^j(BaNKfZ1
+<19GRTV82]<EXSGY5PU%s7sA/[J.0([cBaP6N':K7/o^U7f>i+84cBF8kVfN9heAY:f("e;c?Xq
+<``C+>$G6;?XI5N@qB4aBPD6uDJsK6F*)SLH$XjdIt3-'L51VCN/`m\P*D5uR@B_<T:r$UVPgGp
+Xfen5ZaI6O\\#Mg^VRe*`Q-'BbK\>ZdF6Uqf@\d1gtgiEi8WeWjlYail07O6lj<(In*fc9o()DE
+rq-?dp\4[^s7u]kr;6Kkrr)KgJcD):J,~>
+JcC<$QiHaXrVc`nr;6Njs7uZh@e]Tip%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V.7i\@/fOZ*:C4Wi;nmUnXNRSXZ%7QB[PpO,]*UM2-e;Jq/?!I!T42BlA*B
+o8`j3"-A\/PPpaFPm!D<P`q=$PkgUCQN*6HQMd*EQMHmIQ2m3LP6$i-r/^o>q2jp'rJpl<plPB8
+rfI#<l];+/rfAqB[^WfY]Y2(q_Sa@4aN;WLcHjndeC<($g"P39h;@/LioB+]k3(sml0@U$mI'E2
+n*olHo)J:]o_eC^pAOaQq#'mcpA=O^o`+O\o)J7[nGVeWmd9E?liQM<lMg&JkQ'fFjp1#/jQ#:[
+io0mp!T2c5h#Z<crn;PKf[na+e^`1!e'cXkd*L"_c-4DTbK@rJaN)<>`Pf[2_SO%&^V7Co]XkYa
+\@8oT[C!9HZE^X<YHG"/X/`2!W2HPjV50o]TqS-OSt;LCS"#k7R$X,(Q'@JqP*(ieO,f3YN/NRM
+M26qAKnP)2Jq8H&It%BF%=EMKH?jaZGBS+NFE;L%E=-Z'DJj<-Chmg$C&VcHB4h-S!G#^>@KKtG
+@/aL6?=!P8s'#J,rE02(=',B%s&K(urDW_os&&_ks%iYir([/as%E5]rCQuZq+(?Pr'g6Gpd=^@
+lp9q:$N8&OVP9WMR$X,(rr4,(_P`oPZN'sCF7#2p?Y!keDG3TCGC"L[HV6t,@>0>cre(9(qu?JP
+!/^&tj?`]1rBpHMs$crWrC;<-8P)NH91qrQ9hnJ\:f1+h;cHat='/U/>?kH@?X[DRAS#LfBkqO&
+DfB];FEVkRH@1-jJ:`E.LP^nINK93bPa.T'S"-(BTqeE\VlHf"Y->1;[C3TU]=bkm_8=.0a2lEH
+c-F\`e'uq"f\,!6h;7&IioB(\k3(sml0JB9$170Ln*ol<o(2MQo`Fj]p\ssfq>^<hqu6NmrUg)?
+s-Nb9~>
+JcC<$QiHaXrVc`nr;6Njs7uZhAG>fkp%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V.7i\@/fOZ*:C4Wi;nmUnXNRSXZ%7QB[PpO,]*UM2-e;Jq/?!I!S+H7RfsB
+9htX]s%W\m:/4MXrCm5c!)EJgrD<>doMG3X!)WVir)!5e#uXVu;,C(d;,C'e:B"&g:&n)e<WH.q
+<qKAl<r#hq<qTPk=Su7j=T;Iu=T)AYZaR?R]"G_k^r"".`lQ9Fbg+P^daZdtf@em4gtglGiSrnY
+jlYail07L!m-X6/n*fc9rpp*\!;-3^s7ZEcmJ-VRrq?6^rq-6^r:9mXs7$!U!q,ICrTjUOlK\B5
+s6'IGroOIIjQ,@]io8qrhuV`lrnRV1g]#oMg"=p.f%&=#eC2jndEp4bcHXSWbKJ&MaN2EA`Pod5
+_SX.)^V@Lr]Y(hd\[],W[^EKKZa-j?Yck43XK/A$WMl_mVPU)aU7n9RT:VXFS=?":R@'>,Q'ISt
+P*1rhO,o<\N/W[PM2@%DL4t;5K7\Z)J:E%II1:RNH?sj]GB\4QFEDSErc&9aDf0H0Ci!m&C2*Z\
+!G?$DAH?=OraGq;?srt@!FB(2>lS".>5_S*=BAT'<rZ2"<;fbq;ZBVm;#a>k:Adic9`Ic_9)V?\
+8GPdR7f5^I7/0.B6L7#(s"E#jBj4P7:/+GT8k\s4YD-Od9133g[;7sq:+%SJ1c@?N1d+#f6:41#
+3'KZ#9M>@W!(m(fqGmVs:A7T]:]4&L62X(J6i0:O7K5jU7t+!#8P2TJ92&&S:/=\_;,U=k<)lt#
+=BSg3>[:]D@:E_XAS5[jCM[m,E,fr@G'A4XI!pKpJqJf5M2I7OO-,TiQ'[o.S=Z@HUSOcbWiN8)
+Yd(OB[^`l[]Y;.s_SjF6aND]NcHstfeCE1'g"P6;hV[8Nj5]7`kNM0pli6;XmI'H3nF?)?oCW%T
+!quB_rqQNhs8)Zjrqucoo_sFAQiDR~>
+JcC<$QiH^Wrr)ior;6Njs7uZhs7^!rp%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK@oG`P]R.^V.:j\@/fOZ*:C5Wi;nnUnXQTSXZ(8QBdYrO,f0VM2-h=Jq/?!I!T^MGCbU7
+Wm(IR!P?#D^&G_S^VI\%_o9X9aN;TIao0B^bP9<Wc2Q#`c2Q#ecN)>ddJVGmciDDjc3MV<b/hTB
+`Phbcn[\/!s1/0>pp^:3"1>SG\,3]6\,Wu(\c')q\[AlU\\,Vj^r"".`lQ9Fbg+P]dF6Urf@\g2
+gtgiFi8WeWjlY^hl07L!m-O--n*fc9rpp*\!;-6_rq??cl1k5OrV$0^rq-6^r:9mXs7$!U!q,IC
+rTjUOlK\B5!pJh1roOIIjQ,@]io8qrhuV`lrnRq:gY1B7g"=p.f%'cL$.I>MdEp4bcHXT4b@Jc;
+aN2EA`Pod5_SX.)^V@Ip]Xtbc\[],W[^EKKZa-j?Ycb+1XK/A$WMl_mVPU)`U7n9RT:VXFS=?":
+R$a5+Q'IStP*1rhO,o<\N/W[OM26qAL4t;5K7\Z)J:E#rI=-D@H3nkAGB\4QFEDSErc&*\Df0H0
+D#S2NC2*Z\!G?$DAH?=OraH+@?sm>K?=$q:>lS".>5_S*=BAT'<rZ2"<;fbq;ZBVm;#a>k:Adic
+9`@]_9)V?\8GPdR7f5^I7/94B6L7#(rsAM`hqHH%b/q`Dr;RhrT:,*Hs6?BZds6XMNf]E,R%9nE
+Tq\>_<EQH-Xf_T,qZ$<(pp^"+j$ET0rBpKNr^HiVr^ZuZ!(m/^HV7%+9heAY:f("e;c?[s<``F,
+>$P<=?XR;O@qB7bBPM=!DJsN8FEMePH@('hJ:W?+L51VCN/is]P*D9"R@B_<TV8-VVl6VrXfen6
+ZaI6O\\,Vj^r"".`lQ9Fbg+M\dF6Urf@\g2gtgiFi8WeXjlYail0@U$lic_Dn*olHncA@Srq-<c
+p\jmeq>^<hqu6NmrUg)?s-Nb9~>
+JcC<$QiH^Wrr)ior;6Njs7uZhs7^!rp%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK@oG`P]R.^V.:j\@/fOZ*:C5Wi;nnUnXQTSXZ(8QBdYrO,f0VM2-h=Jq/?!I!T..ASlI6
+KU)7ks,[2A!g/Y0rfmGJs-<_OP`tX%pQb`Ds-<GHr0R/DqNq5J!1!PIrf[8AnW<.!rJpc9qiL];
+rf@,@l&bk+1Q]#Q\@K8c^VI_(`Q$!@bKS8Xd*^=lf%8R.g>(N@i8EVTj5oFckiq?slg4!*mdKW6
+nc&+Zo)SF]p&=[apZ_JOp\jg`p&=U`oDJ1Znc/+WmfMqEmJZAQlg!d7klU)3kPjTKjlGL_j5T(W
+rnmh7hYu=<gtUQ:g"G$0f@JLOe-XUPdF$=ecHa\Yrl\ipaiMQD`l5p8_ns:,^q[Xt]Y(kf\[f5Z
+[^NTNZa6sBYct:4XfSS'Wi;qpVl$;dUS=HUTV%gISXc1=R[BJ/QBd`"PEM)kOH5H_NJrgSM2@%D
+L5(D8K7ec,J:N,uI=6Kird"lrG^"@TF`__HErL%^E,TW3D/B2e!GZ?JBE;aXrac+@A,]pB@:3JM
+?X@&Er`oJ-!*]>(!a&N*r`9&!s&Aqqs&/korD<Mis%`Jdr_3;ar(?oZr^ciTr'pTQoL/LBoKqn1
+m/IFU\uV[$S!o_2QBhIL,OraOIX8L's0."!W**S%C2@f^F*2YNG^Oj28l(+oK7S]0K_k`CNp_\_
+62X(J6i9@O7K5jV8,l*[8cD>/92&#R9hnJ\:f1+h;cQk!='8[0>[1TB?t!MSAS,RgC27X'DfKf>
+Fa&(VH[U?nJV/W1LP^nINfT<cPa7])S"-(CTqeE]W2co#Y->4<[C3TU]Y2(q_Sa@4aN;WLcHaea
+e'ut#f\5'7h;7)JioB+]k3(smlKdg'"RYXGnF?MK!V>s_o`=d\rV6Egs8)Zjrqucoo_sFAQiDR~>
+JcC<$QiH^Wrr)ior;6Njs7uZhs7^!rp%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH5f@AC!
+dEg+^bK@oG`P]R.^V.:j\@/fOZ*:C5Wi;nnUnXQTSXZ(8QBdYrO,f0VM2-h=Jq/?!I!S.J6q0[<
+:/Cg_rD*Aer(I/d:/:darD<;cp/(BY!)WVir)!5e#uXVu;,C(d;,C'e:B"&f:B+,X<q]Mn<r#hq
+<qTPk=T)=n=Sl1r=T2GY[C3TU]Y2(q_Sa@4aN;WLcHjkbe'ut#f\5'7h;7)JioB(\k2tmll0@U$
+m-X60n*olHo)J:]o_nI^pAXgNq#0scpAFU_o`+O\o)J7[nGVeWmd9E?liQM<lMg#Lki_..jp1#/
+jQ#:[io0mp!T2c5h$Vrlg=k65f[na+ec+&)e'cXkd*L"_c-611ABN$8aN)<>`Pf[2_SO%&^V.:m
+]=PP`\@8oT[C!9HZE^X<Y-"h-X/`2!W2HPjV50l\TqS-OSt;LCS"#k6R$X,(Q'@JqP*(ieO,f3Y
+N/NOLLkg_>KnP)2Jq8H&IsufoI!bj=$$gc>GBS+NFE;L%E<U<"DJj<-rbDOLC&VcHB4h-S!G#^>
+@L$=L?sd8I?=!P8s'#J,rE02(=',B%s&K(urDW_os&&_ks%iYir([/ar_*/]rCQuZq+(?Pr'g6G
+q*Xd@lp:(>0B^-'@9?B)9MJ5R8k]-A[u=ru7RLdoW`q]=?mmT[2)dNP4?ktn6:++#3'Kr+9DqKZ
+s7fUp<VTDe:]=,L62X(J6i9@O7K5jV8,l*[8cD>/92&#R9hnJ\:f1+h;cQk!='8[0>[1TB?t!MS
+AS,RgC27X'DfKf>Fa&(VH[U?nJV/W1LP^nINfT<cPa7])S"-(CTqeE]W2co#Y->4<[C3TU]Y2(q
+_Sa@4aN;WLcHaeae'ut#f\5'7h;7)JioB+]k3(smlKdg'"RYXGnF?MK!V>s_o`=d\rV6Egs8)Zj
+rqucoo_sFAQiDR~>
+JcC<$QiH^Wrr)ior;6Njs7uZhs7ZNerq0dnoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLK7f@AC!
+dEp1`bK@oH`PfX/^V.:k\[JoPZEUL6X/`(pUnXQTSsu19Q^*btO,f0WM2-h=K7SQ$I!U'WFF8h'
+Tu=OR]=bfU^&G_N^VRb'`5]j=rQ4u[!6b/]qT\r`q9AoarQbJjpX/oes3LblrQY_obf\#Ha2Q!7
+_>Lh1\b3K2\H'/7\,Ni8\+dB6\%&sF\c02>\H9@Q])K8;\i7(-\\#Mg^VRe*`Q-'BbK\>ZdF6Uq
+f@\d1gtgiEi8N_VjQ>Ufl07L!m-O--n*fc9nac8BoCW"Srq?Bdk4noLrq?6^rq-6^rUU!Ys7$!U
+s6fpSrp9[N!:'OI!pJh1roO7CjSn1gio/kSi8<GKh;-lAgY1B7f\"g-f%&:"e'lamdEp4bcHXSV
+bK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?YHG"0XK/A$WMl_mVPL#_U7n9RT:VXF
+S=>t8R$a5+Q'IStP*1rhO,o<\N/NRMM26qAL4t<\K-,\rJ:N,uI=6KiH?sj]G^"@TF`__HEcH)<
+E,TW3D/B2e!GZ?JBE;aXrac+@A,]pB@:3JM?X@&Er`oJ-!*]A)s&f;&r`9&!s&Atrs&/kor)!Dh
+s%`Jdr_3>bqb$fYr^ciTr'pTQoL/IAog8"2mJdI]iS2l-bf\)Lqu7i!T:#TWs/F>>L0'(0Oci[E
+R@^+HU8=Vc<*6?,YH>(6YPJ4l^A>>5[c9[O6N0@L7/o^T7fGpX8,u6\8c_RYr_7l;:Jakb;H$Op
+<`W=*=^,-9?=.)K@Us%^BP;-rD/O93EccGJG^=^bIXm!%KSG;>Mi<[WOcu&rR$jG7StMdQV5L8l
+XKA\1ZEpsJ\[oGe^VI_(`Q$!@bKS8XdF$Fmf%8R.gYCWAi8N\UjQ5OekiqBum-O0/n*ol<o(2GV
+o_%nNp@nO\!r;]hr;6KkrVcBfJcD):J,~>
+JcC<$QiH^Wrr)ior;6Njs7uZhs7ZNerq0UioCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLK7f@AC!
+dEp1`bK@oH`PfX/^V.:k\[JoPZEUL6X/`(pUnXQTSsu19Q^*btO,f0WM2-h=K7SQ$I!U'F@VTk(
+J!'Gbs,R8DOckq-PlI$KQ2m3<Pk^OCQN*6HQMd*DQMQsJQ2m3KPQ$^FOo1:-OS+\7OT1C?Nr+n7
+OSb1=O8t@4O8t@?OSb/![^`l[]Y;.s_SjF6aND]NcHstfeCE1'g"P6;hV[8Mj5]4_k3)!nlKdg'
+mI'H3nF?&>o(2JFrUp0`s7b[NrV-<bqt9s\s7?3[s7--YrU9dSs6]gPs6B[MrTOCIkNDj,!TiDA
+j*p"HiS`YOhqm2Fgt^Z<g=b-2f@SU(eC;srda?Ihcd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i
+]",A]\$i`Q['R*EZ*:F7Xf\\*WiE%sVl-DfUnaZXTqJ$LSt2C@R[KP1Q^3o%P`q8nOcYWbNfB!U
+MM[1GLPCP;K`?ZHJq8H&IsufoI!^0cH$FRXGBS+NFE;JBEH#l8DJj<-rbDOLC&VcHB4h-S!G#^>
+@L$=L?sd8I?=!P8s'#J,r`T8's&]2#s&K(ur_rhps&&\js%iYir([/as%E5]rCQuZq+(?Pr'g6G
+pd=^@lp:(>$.#rUUS"$EQ^=$:s!.9[WIB-3s6bT5IptoX8Si9796>?#H$Xgb91i!5KnFr0KS0+#
+p5\Wtj$ET0r^6QNs$coVr^ZuZ!(m/^!D?,c9n,o6:f("e;cHat<`iL->?kE>?XR;OA7]@dBPM="
+DJsN8FEMePH@('hJ:W?+L5:\EN/is]PEhH$R@Bb=TV80XVl6VsXfnt7ZaI9Q]"G_k^r"".`lQ9F
+bg+P^dF6Urf@\g3gtgiFiSrnYjlYail0@U$m-a?2nF?)?oCE.Xp%A%Pp\jjgq>0scqu6NlrUg)?
+s-Nb9~>
+JcC<$QiH^Wrr)ior;6Njs7uZhs7ZNerq0RhoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLK7f@AC!
+dEp1`bK@oH`PfX/^V.:k\[JoPZEUL6X/`(pUnXQTSsu19Q^*btO,f0WM2-h=K7SQ$I!U')6q0X9
+9)VK^:&n#d9E\'b:/=[_;#=&\;"[Zc;#O2f;#4#q;Gg=h:f("d:f%$br_NJfr_ESj='+ZfqGmGo
+r`B"uoiLli!*Ahqr`9)#r`Au!3*E]"\\#Mg^VRe*`Q-'BbK\>ZdF6Uqf@\d1gtgiEi8N_VjQ>Uf
+l07L!m-O--n*fc9nac8BoCW"Srq?Bdk4noLrq?6^rq-6^rUU!Ys7$!Us6fpSrp9[N!:'OI!pJh1
+roO7CjSn1gio/kSi8<GKh;-lAgY1B7f\"g-f%&:"e'lamdEp4bcHXSVbK@rJaN)<>`Pf[2_SO%&
+^V7Co]Xtbc\[],W[^EKKZa-j?YHG"0XK/A$WMl_mVPL#_U7n9RT:VXFS=>t8R$a5+Q'IStP*1rh
+O,o<\N/NRMM26qAL4t<\K-,\rJ:N,uI=6KiH?sj]G^"@TF`__HEcH)<E,TW3D/B2e!GZ?JBE;aX
+rac+@A,]pB@:3JM?X@&Er`oJ-!*]A)s&f;&r`9&!s&Atrs&/kor)!Dhs%`Jdr_3>bqb$fYr^ciT
+r'pTQoL/IAog8"2nc's0bcZ(n<)ZRe9MA)OpAaEmP&4/f6ZTo/8leD1.5*813&!3P5!]*6$:?d4
+5"\C>8kDZIq>^Ipq,RJqqG@#ar_DK>r'LBMqaCHQr^QlWs%!,]r^m2a9`@b9:/=\_;,U=l<E<.&
+=]ns6>[CcF@:EbYAnYjmCMds-EH6/DGBeF\I=?]tK7nu8M2R=QO-,WkQC+)0SXuLJUnsufWiW>+
+Yd1UC\%0)_]t_A"_o9X:aihoRcdC.heCN7(g=tE=hVdAPj5f=akNM0qlg4!+n*fc9o()DD"n_K\
+p@e7Zp]C9fqY^6ir;HTdrdk*9s*t~>
+JcC<$QiH^WrVc`nrVQWks7uZhs7ZNerq0amoCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bK@oH`PfX0^V7@l\[T#SZEUO7X/`+rUnaWUSt):;Q^*btOH5BZM26n>K7SQ%I=$9ZEHZki
+QE/6@]=e-VrOrNO_84%.`lH1"ao'9]bP9<Xc2>l_c2Q#ecN)>ddJVDodEp5<c4%tAbK.]C`Pf[2
+^q[AU\F$j"\G`u<\G<W5[edK6\,<`;\%&sI\c')>\bs#>\\%jP3k;i5[^WfY]Y;.s_SjF6aND]N
+cHjndeCE.%g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?&>o(2JFrUp3arqH-]qt]p[rV-<bqt:!]
+rq$*Zs7--YrU9dSs6]gPs6B[MrosIH!9a@Ds5a7Aro4RLiSi_Qhqm5Gh;$c>g=k64rmq>)e^W*t
+df.XDd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZ*:I9Y-"h-X/`2!W2HMh
+Unjc[TqS-OSt;LCS!ob4R$X,(Q'@JqP*(ieO,]*WMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FRX
+GBS+NFE;JBEH#l8s)%jSD#S2NC2*Z\!G?$DAH?=OraH+@?sm>K?=$q:>lS".>5h\)=T;J%<rZ2"
+<;ohr;ZBVl;#a>k:Adic9`Ic_9)V?\8GPdR7f5^I7/0.B6L7#,rs7oJg<n0ibKA!)rugEqYl=\&
+QiFI9KN3toPZ_"TT:hmPV5%'i=Kej1XK\u)s7O)+^\kS9[c9[O6N':K7/o^U7f>jW8,u6\8c_RY
+r_7i::Jakb;c?Xq<`W=*=^,-:?=.)L@Us%^BPD6tD/O<4F*)PKG^=^bIXm$&KnbD?Mi<^YP*;/s
+R$sM8StVmSV5L;mXKA\1Za@0M\[oGe^VRe*`Q-'BbKS8XdF-Oof%8U/gYL]Ci8N\UjQ>Ufl07L!
+m-X60n*ol<o(2nRs7QEc!;HKfs7u]kr;6KkrVcBfJcD):J,~>
+JcC<$QiH^WrVc`nrVQWks7uZhs7ZNerq0XjoCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bK@oH`PfX0^V7@l\[T#SZEUO7X/`+rUnaWUSt):;Q^*btOH5BZM26n>K7SQ%I=$9J@:a4q
+H\@[ZNrG(?OHKO+!gJt8rg!PLn!*U4rg*SLqNh&Gp6PTBs-<\NPl?mGP5^U?O6r&%O8b7?O8k7;
+O8b7;OTCQ+rK%#?plGK:r/^o>rK0.&Ocd)]\[oGf^VRe*`Q-'BbK\>YdF-Opf%8U/gYL]Ci8N\U
+jQ5OekiqBum-O--n*fc9nac8BoCW"Ss7ZHdpA"O\p%\L[rq?6^s7H<^rUU!Ys7$!Us6fpSrp9[N
+!:'RJs6'IGroX7B!9F.>&E;[-i8EMLhVI#CgY:H9g"?;U"kM5ReC2kFd=9NhcHa\YbKJ&MaN2EA
+`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^NTNZa6p@Yck43XfSS'Wi;qpVPU)aUS=HUTV%gISXc1<R@'A.
+QBd`"PEM)kOH5H^N/W[PM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]G^"@TF`__HEcH)<E,Ybo!GuZP
+CB80arb)=FB)Z?BA7PUJ#@V"J?XI,G?2e+/>6%k+=oVV(=8l8#<W?%t;u]bq;>a8j:]F2f:&[id
+9D_?[8cD9V8,PjS7J'"C6hNe461Fm\_6'T/SXQ"8Q^@[N,6#igIuD8Fi-=@@=CF[5Ci)j;F`qtR
+H@(!392C4oK7ei2q#BuHo7u?lr'L?LqaCHQs$lrWs%!,]r^m2a9`@b8:/=\_;,^Cm<E<.&=]ns6
+?!^lG@U`kZAnYmoCMds.EH?5EGBeF\I=?]uK8#&9M2R=ROHPfmQC+,1SXuOLUnsugWiW>+Yd:^F
+\%0)_]t_D#`5Td<b0/#ScdC1jeCN7)g=tH>hr*JQj5f@bkNV6rlg4$,n*fc9o()DPo`+Uap&Ojd
+q#C0iqY^6ir;HTdrdk*9s*t~>
+JcC<$QiH^WrVc`nrVQWks7uZhs7ZNerq0[koCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bK@oH`PfX0^V7@l\[T#SZEUO7X/`+rUnaWUSt):;Q^*btOH5BZM26n>K7SQ%I=$9,6pjI8
+8ki)Ur([5dr(R,br_<Ghr)!;eo2,*W!)WVir)!5e#uXVu;,L.d;,C'e:B"&f:Amug:&n>o=6`i_
+<V0>e=8H#!=8Z/#=7o\p<rc;#=8c5[[^WfY]Y;.s_SjF6aND]NcHjndeCE.%g"P3:h;@/LioB+]
+k3(smlKdg'mI'H3nF?&>o(2JFrUp3arqH-]qt]p[rV-<bqt:!]rq$*Zs7--YrU9dSs6]gPs6B[M
+rosIH!9a@Ds5a7Aro4RLiSi_Qhqm5Gh;$c>g=k64rmq>)e^W*tdf.XDd*L"_c-4ASb/q`Ga2Z*;
+`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZ*:I9Y-"h-X/`2!W2HMhUnjc[TqS-OSt;LCS!ob4R$X,(
+Q'@JqP*(ieO,]*WMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FRXGBS+NFE;JBEH#l8s)%jSD#S2N
+C2*Z\!G?$DAH?=OraH+@?sm>K?=$q:>lS".>5h\)=T;J%<rZ2"<;ohr;ZBVl;#a>k:Adic9`Ic_
+9)V?\8GPdR7f5^I7/0.B6L7#0rs.5gRV#]$;GI-a-r!A*s6mpoDcK:tEl3VsQU`DU.l0+F1c.?\
+5=%\)6T@%h8kDZI8PJpZrDiYo!*/qnqG7,dj$ET0rBpHMs$crWrC?lY!(m/^!D?,c9n#i5:f("f
+;cHat<`iL->?kH??XR>PA7]@dBkqL$DK'T:FEMePH@('hJ:`E-L5:\EN/s'`PEhH$R[]k>Tq\?Z
+Vl?\tXfnt8['mHS]"G_k_8=.0a2lEHbg+P^daZdtf@em4h;-uHiSrnYk2tjkl0@U$mI'H3nF?)?
+oDeI_p&F^cp\ssfq>^<hqu6NlrUg)?s-Nb9~>
+JcC<$QN-XWrVc`nr;6Nj!;ZTgB(u#mp%@tKo()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*L"]bK7iF`59@*^:_(g\$iZMYck11Wi2hlUS4?PS=>q5Q'@GnO,]*TLk^V9Jq/;uH[9pSF*rY%
+U;jgXrk89E#J\'j_SjI6a8O-Yb5]Z\bl>ofbl,facM>`acMc&hd.brcdK7hCd/M>jbmhn?aiMK@
+`5BI-^V7FjrjVg8n@8V3\[hCCqmlX7qmZ4-qmlR7r4Dp=/@W1$]Y2(q_Sa@4aN;WLcHjnde'ut#
+f\5*8h;7)JioB+]k3(sml0@X%mI'uB!V#XYncJFTo`"O`pAXg^q"+=Uq#:$epA=O_o`"I\o)J7[
+nGVhUmJuYQm/QAOlMg&JkQ'fFk5XNCjSn0?io0mp$fBgth;-l@gY1B7f`'J+f%&:"e'e6CER<%W
+cHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EHJZE^X<YHG"0XK/A$WMcYkV50o^U7n9R
+T:VXES"#k7R$a5+Q'IStP*1rgO,f3YN/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH?jc7G7Je=FEDSE
+EH,r9Df0H0D#S2XC2%?pB4kgfARo=]raGn:@/aO5?3":1>lS".>5h\)=T;J%<rZ2"<;ohr;ZBVl
+;#a>k:Adic9`Ic_9)V?\8GPdR7f5^I7/0.B6L-r/rsADZgt:!!c-+8Oqu7f&T<\@ps/l<`<J=J:
+P#PPNR\6CJTqt^h>?7o0YH>%6p]'p#s1e68j$ET0rBpHMs$crWrC;<-8P)NH91qrQ9hnJ\:f1+h
+;cHat='/U/>?kH@?X[DRA7]CeBkqO&DK'T:FEVkRH@1-jJ:`E-L5:_GNK90aPa.T&R[]n@Tq\?[
+Vl?\tY->1;['mHS]=bkm_8=.0a2lEHc-FY_daZguf@em4h;-uHiT&tZk2tjkl0A<8&+/fRn*ol<
+o(2MGp%A%Qp\ssfq>^<hqu6NlrUp/@s-E\8~>
+JcC<$QN-XWrVc`nr;6Nj!;ZTgAG>fkp%@tKo()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*L"]bK7iF`59@*^:_(g\$iZMYck11Wi2hlUS4?PS=>q5Q'@GnO,]*TLk^V9Jq/;uH[9pD@;9_(
+Js,qirJq/EOctunQ'M?7s-<VK!1!;C!0dDHpm(iEs-<GHr0R)Br0RGL!L8oKPQ$aCOnb")OS+\6
+O91K)OSOt:OS=n+OSY(j\%0)_]t_A"_o9X:aihoRcdC1ieCN7(g=tE=hVd>Oj5f=akNM0plKmm)
+mf)YUnF?MK!qZ'Vrq6<brqH6`oD/.UrqHEcqt:!]rq$*Zs7--YrU9dS!:BaOs6B[MrosIH!9a@D
+s5a7Aro4%=iVqaChqm5Gh;$c>g=k64rmq>)e^W*tdf.X6d*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#
+^:h1l]=PP`\@8oT[Bm3FZ*:I9Y-"h-X/`2!Vl-DgUnjc[TqS-OSt;IAS!ob4R$X,(Q'@JqP*(fd
+NfB!VMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$K=4%X)u:FE;JBEH#i7DJj<-rbDmVBkV0mB4b^d
+A7T3L@KBnFra5\3!+#S/s'#J,r`T8's&]2#s&K(ur_rhps&&\js%iYir([/as%E5]rCQuZq+(?P
+r'g6Gpd=^@lTt1C$M:m/US+*GR[KP0r;RqhY'u;Js4N"NBgcK'Ci2d:F*)VOGC"U.92\N<KS"l1
+L%kTIO7eM5NV/(e62X(J6i0:O7K5jU7t+!#8P2TJ92&&S:/=\_;,U=k<)lt#=BSg3>[:]D@:E_W
+AS5[jCM[m+E,fr@G'A4XI!pKpJqJc3Ll..NO-#NhQ'[l,S"?7GU84ZaWN*&&Yd(OA[^WfZ]Y;.s
+_SjF6aND]NcHjndeCE.%g"P3:h;@/Lj5]4_k3)!nlMp2]mI'H3nF?)?oCV\Jp%J.SrqQNhs8)Zj
+rqu`np&9OBQN)I~>
+JcC<$QN-XWrVc`nr;6Nj!;ZTgA,#]jp%@tKo()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1<3f$r0r
+d*L"]bK7iF`59@*^:_(g\$iZMYck11Wi2hlUS4?PS=>q5Q'@GnO,]*TLk^V9Jq/;uH[9p'77K^;
+9D_Ka:&@Td9hnGZr)!>fp.t`br_W8b!)WVir)!5er_ibns%ibo:f%$br_NJfrD3Ae"]e]+<``Af
+<r,hf<r#hh=9)Fp=Sl2"==gql]"G_k^r"".`lQ9Fbg+P^daQ^sf@\g3gtgiFi8WeXjlYail07L"
+m-X6?mfDqJrpg-^o^r.Us7ZHdq=sRWp\=a^rq?6^s7H<^rUU!Ys7$!Us6]mSrTsRM!:'RJs6'IG
+roX7B!9F.>!TN);i!\H!hVI#CgY:H9g"?;U"kM5ReC2kFd;dOZcHa\YbKJ&MaN2EA`Pod5_SX.)
+^V@Lr]Y(kf\[f5Z[^NTMZa-j?Yck43XfSS'Wi;noVPU)aUS=HUTV%gIS=?":R@'A.QBd`"PEM)k
+O,o<\N/W[PM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]rc\iqF`__HEcH)<Df9N2D/B2e$YjBhBP1si
+AS#C_A,]p<@:9(As'>\2r`oJ-!*]A)s&f;&r`9&!s&Atrs&/kor)!Dhs%`Jdr_3>bqb$fYr^ciT
+r'pTQoL/IAog7t1p]!)5_53&t<_uXe9he;U9C;cObFW]S7RhF;Im/K:-8@)03&*6N5!D1q6:<dm
+5!DS191hcLp](.kq,RJqr_N;aj$ET0rBpHMs$crWrC;<-8P)NH91qrQ9hnJ\:f1+h;cHat='/U/
+>?kH@?X[DRA7]CeBkqO&DK'T:FEVkRH@1-jJ:`E-L5:_GNK90aPa.T&R[]n@Tq\?[Vl?\tY->1;
+['mHS]=bkm_8=.0a2lEHc-FY_daZguf@em4h;-uHiT&tZk2tjkl0A<8&+/fRn*ol<o(2MGp%A%Q
+p\ssfq>^<hqu6NlrUp/@s-E\8~>
+JcC<$QN-XWrVc`nr;6Njs7uZh#5@ibp%@tKrpj:`nF,f4m-O'&l0.<mjl>C[i8<AHgY1?4f$r3t
+dEg+^bK7iF`P]R.^:_(g\@/cNZ*:@3Wi;nmUnXNRSXZ%7QB[PpO,]*UM2$_:Jq/?!H[9pUEd*%k
+R&nR3^&PeU]tV4q^qmn+`Q#s>aiXM(s3()ZrltAdq9Aoar6P,br6bYod*Vd;s32%tbK7iF`l,d3
+^q[Ut]tF?Qq6p@6n[\Y1n%&>*r3uO4#Ih4Q\$ifW\b`l@]=PVd]"7mQ1:jp(\\#Mh^r"".`lQ9F
+bg"G[dF6Uqf@\g2gtgiEi8N_VjlY^hl07L!m-O--n*fc9rpg-^o^r.Us7ZHdqY9RUp\=a^rq?6^
+s7H<^rUU!Ys7$!Us6]mSrTjUOlK\B5s6'IGroO:DjQ-=#!TN);huV`lrnRV1g]#n:g"=p.f%/C$
+eC2jndEp5=c?daZbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^EKKZa-j?Yck43XfSS'WMl_m
+VPU)aUS=HUTV%gHS=?":R@'A.QBd`"PEM&iO,o<\N/W[PM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]
+GB\4RF`__HEcH)<DuOVcD/=!'C2.HrBP1siAS#C_A,]p<@:9(As'>\2r`fM/>$Co.s&]8&rDrqu
+!*&nqs&/korD<Jhs%`Jdr_3>bqb$fYr^ciTr'pTQoL/IAog7t1p&><`hqQW-c-=GSqYpW_TX+Rs
+'VO-+KNX@uP?LtRStMgPUSLpj>?Cg,!NiQus7O,*^\G7s62X(J6i9@O7K5jV8,l*[8cD>392&#R
+9hnJ\:f1+h;cHdu='/U/>[1QA?X[DRAS#LfC27X'DfKf=FEVkRH@1-jJ:`H/LP^nINK93bPa.T'
+S"-(BTqeE\Vl?`!Y->1;[C3TU]=bkm_8=.0a2lEHc-F\`daZh!f@em4h;7&IiT&t[k2tmll0I^&
+mI'H3"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6NlrUp/@s-E\8~>
+JcC<$QN-XWrVc`nr;6Njs7uZh#5@ibp%@tKrpj:`nF,f4m-O'&l0.<mjl>C[i8<AHgY1?4f$r3t
+dEg+^bK7iF`P]R.^:_(g\@/cNZ*:@3Wi;nmUnXNRSXZ%7QB[PpO,]*UM2$_:Jq/?!H[9pD@:j=s
+I"ms_NrP.EOHGZgPE_@3QMd$DPl6gFPkgUDQN*6GQMm0CQMd*LQ3!88rfd>Er/q#Bp5dsiq2bN:
+qN1oAOH>N`p5fE<OH>NarK/hC\@K5a^VI_(`Q$!@bKS5Vd*^=le^rI-g>(N@hr*JRj5oFckiq?s
+lg4!*mdKW6nc&(\oCV\Sp&Fabp\O[Sq=j[`p\sm`p&F[`oDS7[nc/+Wn,MeUmJZAQlg!d7l2TrI
+kPjTFjlGM%irS/urnmh7hYu=3gtVh^%b]Ldf@JO'eC;sqdF$=erm#i7bfe2PaiMQD`l5p8_ns:,
+^q[Xu]tD"i]",A]\$i]OZa6sBYct=6Xf\\*Wi;qpVl$;dUnaZXTqJ$LSXc1=R[KP1Q^3o%P`q8m
+OH5H_NJrgSMM[1GLPCP;KS+o/JUi9#IXQWlH[:!`G^"@TG'.nKF)l8?E,Y_n&8c6!CMITuBP;$k
+An>OaA7PUJ!F]C8?iOF4?2e(1>?Y50=oVS(=8c2"<<-"s;u]bq;>j>j:]F2f:&[id9D_?[8cD9V
+8,PjS7J'"C6hNe3621Bdqs(D`U7@aBS!fZ@rufptIuDAId=/*"@S1BODbWiFG'A1WH@/@X:ecXs
+JqJaLs8S/QNW>(6LZ1Vt6N':L7/fXT7fGpX8,u6\8q0K-9MJ5V:Jakb;H$Ln<`W:(=^#'8?!grI
+@Uit\B4u$qCi402EcZ>GGBnL^I=Hd!KSG8=MN!OUOckroQ^O>5StD^OUo(&hX0&P/Z*UjH\@K5a
+^;%M$`5Td<b0/&Td*^:ke^rF+g=tH?hr*JRj5oFckiq?tm-O--n*^GLnac8Bo`"Lbp@n=\q#C0i
+qY^6ir;HTerdk*8s*t~>
+JcC<$QN-XWrVc`nr;6Njs7uZh#5@ibp%@tKrpj:`nF,f4m-O'&l0.<mjl>C[i8<AHgY1?4f$r3t
+dEg+^bK7iF`P]R.^:_(g\@/cNZ*:@3Wi;nmUnXNRSXZ%7QB[PpO,]*UM2$_:Jq/?!H[9p(6pjF8
+92/4]:B+&c9`Ifg:/=[a;#a>b;#O2h;"d`d;#O2f;#4&g;ZBVo:]aKj:]4&f:]*ue:]!od<r?&!
+<rZ1Q<r#hn=9_f-=&r@'=7oYr='#9$0t+U&]=bno_Sa@4aN;WLc-F\`e'uq"f\5'7h;7&IiT&t[
+k2tmll0@U$m-X60n*olHncJFTo`"O`pAXg_q!e+Rq#:$epA=O_o`"I\o)J7[nGVhUmJuYQliQM<
+lMg&JkQ'fFjoXZ*jSn0?io0mp!T2c5h#Z<crn7k8f[na+f%&:"e'cXkd*M^:HHj[WbK@rJaN)<>
+`Pf[2_SO%&^V7Co]Xtbc\[],W[C!9HZE^X<YHG"0XK/A#W2HPjV50o^U7n9RT:VUDS"#k7R$a5+
+Q'IStP*(ieO,f3YN/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH?jaZGBS.PFEDSEEH,r9rb`9aChmg$
+C2%?pB4kgfARo=]raGn:@/aO5?3":1>QS,5>5h\)=9)G$<rZ/"<;fbq;ZBVm;#X8j:Adic9`Ic_
+9)V?\8GPdR7f5^I7/0.B6L-r6s"sDnZ&sH=<`)Ud9MS8U\E<hfdA1qe7RhI@G<K+W/h](@3]/`V
+5<qP$6:Ejn5<VS291__Js8>sl<WQ2rq+fp8r'L?Lr'^NQs$luXs%!,]r^qZ59MA/T:/=\_;,U=k
+<*!%$=BSg4>[:]D@:E_XAS5[kCM[m,EH6,BG'A4XI!pKpJqSl6M2I7OO-,TiQ'[o.S=Z@HUSOcb
+WN3/(Yd(OB[^`l[]Y;.s_SjF6aND]NcHsteeCE1&g"P3:hV[8Mj5]7`k32'olg4!*mdKTJnF?)?
+oCW%T!quB_rqQNhs8)Zjrqu`np&9OBQN)I~>
+JcC<$QN-XWrVc`nr;6Njs7uZhAbYolp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V.7i\@/fOZ*:C5Wi;nmUnXQSSXZ(8QBdVqO,f0VM2-h=Jq/?!I!U'^DfU2X
+Nhjbn]b.un^VRb(`5Td<aiV]Iai_cLp!!E[!m]'8rm(Abs3CMfpX/oe!n#BArm(Pgs3(qpaMu6<
+_ns7)^V7Co]_f/5\+mJo\bio7\+dE4\H'/1\h^h-\%0,`^;%M$`5Td<b0/&Td*^:ke^rF+g=tH?
+hr*JQj5f@bkNM0qlg4!*mdKW6nc&(\oCV\Sp&Fabp\O[Pq=saap\sm`p&F[aoDJ1Znc/+WmfMqE
+mJZAQlg!d7klU)3kPjTKjlGL_j5T(Wrnmh7hYu=3gtVh^J(`K+f@JL&eC;sqdF$=ecHa\Zbfe2P
+aiMQD`l5p8_ns:,^q[Xu]tD"i]",>[[^NTNZa6sBYct=6Xf\\)Wi;qpVl$;dUnaZXTq@pJSXc1=
+R[KP1Q^3o%P`h2lOH5H_NJrgSMM[1GLPCP;KS+o/JUi9#IXQWlH[:!`GlMspG'.qLFE;JBEH#jq
+D@gZ$CMR["BkV0mB4b^dA7T3L@KBnFra,_5?![G7!aAi3r`T8'!*B,"s&B%urDW_os&&_kr_NPh
+r([2br_*,\r^m&Zq+(BQr'g6Gpd=[?lTt:F#jC0udF$4ac-#n_*poW*s8Vu.M0Xi8PE]$IR%9nE
+TVA5]<`N7'Y-+n/o`+NsrkJ<<i^*K/r^6QNs$coVr^ZuZ!(m/^!D?,c9n#i5:f("e;cHat<``F,
+>$P<=?XR;OA7]@dBPM="DJsN8FEMePH@('hJ:W?+L51VCN/is]P*D9"R@B_<TV8-VVl6VrXfen6
+ZaI6O\\#Pi^r"".`lQ9Fbg"G[dF6Uqf@\g2gtgiFi8WeXjlYail0@U$m-X60n*ol<ncA@Srq-?d
+p\4[^s7u]kr;6Kkrr)KgJcD&9J,~>
+JcC<$QN-XWrVc`nr;6Njs7uZhAbYolp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V.7i\@/fOZ*:C5Wi;nmUnXQSSXZ(8QBdVqO,f0VM2-h=Jq/?!I!U'^?t!_e
+G(GhQNrG(COHG]iPa204rg!MJ!1!MIr0.,E!gT"7r0@8Is-<DGrKm/BrKmPMs-3YMPEZ!/r/puA
+o8hXfplG$.!0?Z30p/rU]=bkm_8=.0a2lEHc-F\`daZh!f@em4h;7&IiSrnYk2tjjl0@U$m-X60
+n*olHncJFTo`"O`pAXg_q!InPq#:$epA=O_o`+O\o)J7[nGVeWmd9E?liQM<lMg#Lki_..jp1#/
+jQ#:[io0mp!T2c5h#Z<crn;kTf[na+e^`1!e'cXkd*L"_c-=JUbK@rJaN)<>`Pf[2_SO%&^V7Co
+]Xtbc\@8oT[C!9HZE^X<YHG"0XK&;"W2HPjV50o^U7n9QSt;LCS"#k7R$a5+Q'ISsP*(ieO,f3Y
+N/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH?jc8G7&M9F`__HEcH)<DuOVcD/=!'C2.HrBP1siAS#C_
+A,]p<@:9(A!a]/<r`fM/>$Co.s&]8&rDrqu!*&nqs&/korD<Jhs%`Jds%NDbqb$iZrCH`SrC6]R
+oL/IAoKqk0q>Ufjh5[<FSXl4=R[F!P+54#MMou(>O)%m/C2Rr[8oo,uH$=R\8P;ZO9SJ.NK(T*C
+O7SA3NV\Fi62X(K6i0:O7K,dU8,l*[8cD<_92,=ZISN[8:f1+h<)lt"='8[0>[1TB?t!MTAS,Uh
+C27[(DfKf>Fa&(VH[U?nJV/W1LP^nINfT<cPa7])S"-(CTqeE]W2co#Y->4<[C3TU]=ktp_Sa@4
+aN;WLc-F\`e'uq"f\5'7h;7)JioB+]k3(smlKdg'mI'H3nF?)?!V>s_o`Fj]p\ssfq>^<hqu6Nm
+rUg)?s-E\8~>
+JcC<$QN-XWrVc`nr;6Njs7uZhAG>fkp%@tLoCDJBnF,i6m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V.7i\@/fOZ*:C5Wi;nmUnXQSSXZ(8QBdVqO,f0VM2-h=Jq/?!I!U'^6UO73
+8PB"W!)<>as%NPi:J^LWr(m;g!`;cjq,%,gr_NDfqGI5is&&em!`;cjrD*;erD*;eqbI#hqc<bu
+rDhTQqH!YtoiD/p=7fTN=&rD3\\#Mg^VRe*`Q-'BbK\>ZdF-Opf@S^0gYL`Di8N\UjQ>UfkiqBu
+m-O--n*fc9rpg-^o^r.Us7ZHdqY9IRq"Xj_rq?6^s7H?_r:9mXs7$!U!q,ICrTjUOlK\B5!pJh1
+roOIIjQ,@]io8qrhuV`lrnRV1g]#oVg"=p.f%&=#eC2jndEp4bcHXVXbKJ&MaN2EA`Pod5_SX.)
+^V@Lr]Y(kf\[],W[^EKKZa-j?Yck43XfSP&WMl_mVPU)aUS=HUT:VXFS=?":R@'A.QBd`"P*1rh
+O,o<\N/W[PM2@%DL5(D8K7ec,J:N,uI=6KiH?sj]s*"fnF`heJF)l8?E,Y_n&8c6!CMITuBP;$k
+An>OaA7PUJ!F]C8?NOP>?2e(1>?Y50=oVS(=8c2"<<-"s;u]bq;>j>j:]F2f:&dod9D_?\8c;3U
+8,YpT7J'"C6hE_262^a=ftEl.E`l=<:/4JX9hhbErVtTNH!*U+GKObp2^^:82EEQL4$Gkn5s[js
+3&j)a8P;ZIo`+kioi;&mqG-$9r'LBMqaCHQr^QlWs%!,]r^m2a9`@b8:/=\_;,U=l<E<.%=]np5
+>[CcF@:EbYAnYjmCMds-EH6/DGBeF\I=?]tK7nu7M2I7PO-,TiQC+)0S=ZCIUSOfdWiN8)Yd1UC
+[^`l[]t_A"_o9X:aihoQcHstfeCE1'g=k?<hVd>Oj5f=akNM0qlg4!*mdKW6nac5OoCW%T!quB_
+rqQNhs8)Zjrqucoo_sFAQN)I~>
+JcC<$QN-UVrr)ior;6Njs7uZhs7^'tp%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+_bK@oH`P]R.^V.:k\[JoPZEUL6X/W"oUnXQTSsu19QBdYsO,f0WM2-h=K7SQ$I!U'^Df^/Q
+MOCTkrOr3E"i%mj_o9XpaSs<]aoKWXbkoZacMGfccMPr]dJ_JsdEp7dcHcF6$-^Q5a2Z*9_SO"d
+^&YkG]_8f0\+7'/\H'/,\c0,=[fEl9\,Nl;\,Nl>\%&rYost.6rjjbn]"G_k^r"%/a2lBGbg+P^
+daZdtf@em4gtglGiSrnYjlYail0@U$m-X60n*olHncJFTo`"O`pAXg`q#'s\qYL$`q#:$epAFU_
+o`+O]o)A1ZnG_nVmf2\Rm/QDOlMg#Lki_..jp1#/jQ#:[io0mp!T2c5h$Vrlg=k65f[na+ec+&)
+e'cXkd*L"_c-611D9BuAaN)<>`Pf[2_SO%&^V7Co]=PP`\@8oT[C!9HZE^X<YHG"/X/`2!W2HPj
+V50o^U7n6PSt;LCS"#k7R$a5+Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH?jaZ
+GBS-.F9Q`+EH,r9rb`HfChmg$C2%?pB4baeARo=]@U`bS@/aL7?<pk9>QS,5>5h\)=9)G$<rZ/"
+<;fbq;ZBVm;#X8j:Adid9`@]^9)_E\8GPdR7f5^I7/94B6L-r5rs7Q;e^Mpkc-=H.rt"RlZN'so
+hW&*EO-<UHR@=,K$_jGl<`N=)Y-"h-Y4MYn^%8u;^\tV#62X(J6i0:O7K5jU7fl4Q8cD<_92,=Z
+HVR@5:f1.i<)lt"=BSd2>[:ZC?t*SUAS,UiC27[(E,fo?Fa&(VH[U?nJV/W1Ll%%KNfT?eQ'Rf*
+S"6.DTqnN_W2cr$YHY==[C<]X]Y2(q_Sa@4aN;WLcHjnce'ut#f\5*8h;7)JioB+]k3(smlKdg'
+mI0N5nc&([oCW%T!VZ9dq#C0iqY^6ir;QZerdk*8s*t~>
+JcC<$QN-UVrr)ior;6Njs7uZhs7^'tp%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+_bK@oH`P]R.^V.:k\[JoPZEUL6X/W"oUnXQTSsu19QBdYsO,f0WM2-h=K7SQ$I!U'^?X[P_
+FFAt2qMtT:s,d>FPl?sIQMZsHPl$[APl$aFQ2m3GQMm0AQN!6NQN*3OP`q=1P5LI?P5^L-O8b79
+O6r&,NrY4<O9pu.O,oB`OH5Kcp5f98rfAeD]"G_k^r"%/a2lBGbg+P^daZdtf@em4gtglGiSrnY
+jlYail0@U$m-X60n*olHncJFTo`"O`pAXg`q#'s\qYL$`q#:$epAFU_o`+O]o)A1ZnG_nVmf2\R
+m/QDOlMg#Lki_..jp1#/jQ#:[io0mp!T2c5h$Vrlg=k65f[na+ec+&)e'cXkd*L"_c-611D9BuA
+aN)<>`Pf[2_SO%&^V7Co]=PP`\@8oT[C!9HZE^X<YHG"/X/`2!W2HPjV50o^U7n6PSt;LCS"#k7
+R$a5+Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH?jaZGBS-.F9Q`+EH,r9rb`Hf
+Chmg$C2%?pB4baeARo=]@U`bS@/aL7?<pk9>QS,5>5h\)=9)G$<rZ/"<;fbq;ZBVm;#X8j:Adid
+9`@]^9)_E\8GPdR7f5^I7/94B6L-r8rs/5We>T+6S=TYJ!L`WYru^%&J;h_P\#m)57;?[19656"
+H$O^`I7m10:54FSJqEUo"HSS'O,s0us,[,=!0-r4i^*K/rBpHMs$crWrC6o[8P/nR!D?,c9m]W2
+:f("f;cHat<`iL->?kH??XR>PA7]@dBkhF#DK'T9FEMePH@('hJ:W?+L5:\EN/is^PEhH$R@Bb=
+TV80XVl6VsXfnt7ZaI9Q]"G_k^r"".`lQ9Fbg+P^dF6Urf@\g3gtgiFi8WeXjlYail0@U$m-X91
+nF?MK!V>s_o`=d\rV6Egs8)Zjrqucoo_sFAQN)I~>
+JcC<$QN-UVrr)ior;6Njs7uZhs7^.!p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEg+_bK@oH`P]R.^V.:k\[JoPZEUL6X/W"oUnXQTSsu19QBdYsO,f0WM2-h=K7SQ$I!U'^6UF11
+84uWP:/1RY##.if:Jak`ohbN]qb[&b!`2Zgqb[,drDEer:f("c;#O/f:]*ue:\dcZ<rQ/#<rH%q
+<qTJc<rZ1j<rZ8$<rQ/%<``?$=7o\q="h+q]Y2(q_SjF6aN;WLcHjndeC<($g"P39h;@/LioB+]
+k3(smlKdg'mI'H3nF?MK!qZ'Vrq6<brqH<br;$$^qYBs^rqHEcr:U']s7?3[rpg$XrpTmTs6]gP
+s6K^MrojLJkNDj,#Nb%-j5].YiVqa9hqn@g$JaCig=b03f@SU(rmV8'da?Ihcd'h\bl5e&b/q`G
+a2Z*;`5BI/_8*h#^:h1k]",A]\$i`Q['R*EZ*:I9Y-"e+WiE%sVl-DgUnjc[TqJ$LSt2C@S!ob4
+R$X,(P`q8nOcYWbNfB!VMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FOWG'3e+"`n^(EH#jqDA@#)
+CMR["BkV0mAnGUcA7T1Z@UW\Qra,_5?![G7!aAi3r`T8'!*B,"s&B%urDW_os&&_kr_NPhr([2b
+r_*,\r^m&Zq+(?Pr'g6Gq*Xd@lTtRN2!DlTMg'#>;G^+_9MS;UV:PJBi2h907RqaI?t+"#.lK@A
+2*3rb5XIe)6T@%h5"\C=91ngUr`/Pj!*/tmi^*K/rBpHMs$crWrC6o[8P/nR!D?,c9m]W2:f("f
+;cHat<`iL->?kH??XR>PA7]@dBkhF#DK'T9FEMePH@('hJ:W?+L5:\EN/is^PEhH$R@Bb=TV80X
+Vl6VsXfnt7ZaI9Q]"G_k^r"".`lQ9Fbg+P^dF6Urf@\g3gtgiFi8WeXjlYail0@U$m-X91nF?MK
+!V>s_o`=d\rV6Egs8)Zjrqucoo_sFAQN)I~>
+JcC<$QN-UVrr)ior;6Njs7uZhs7ZNerq0dnoCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`PfX0^V.:k\[T#RZEUO7X/`+qUnaWUSt)7:Q^*btOH5?YM26n>K7SQ%I=$9aG&VMM
+KTDqM]tD&X^'MKh_8=.0a2c:"aT9Q-p!!H\!6kGerm(Pg!7(Sgrm(Gf!7:GerR1_n!RT0lcMu,q
+bfe)J`l5j4_8-&a!58BEs1S?=!4D[3mC2Jmqml:-s1&-=rjhg8rjanr\\,Vj^r"".`lQ9Fbg+P]
+dF6Urf@\g2gtgiFi8WeWjlYail07L"m-X60n*oi:o()DDo`"O`pAXgaq#'sXqYU*aq#:$epAFU_
+o`+O]o)J7[nGVhUmf2\Rm/QAOlM]rPki_-kk2k^cro8LfiSi_Qhr!;Hh;$f?g=k64f[na+e^W*t
+e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHG"/X/`2!W2HPj
+V50o^U7n6PSt;LCS"#k7R$a5+Q'@JqP*(ieO,f3YN/NRMM26qAL4t<\K+W]dJ:N,uI=6KiH?sj]
+GB\4QrcA<bEcH)<DuOVhD/=!'C2.HrBP1phAS#C_@q&nU@:9(A!a]/<r`fM/>$Co.s&]8&rDrqu
+!*&nqs&/korD<Jhs%`Jds%NDbqb$iZrCH`SrC6ZQogJRBoKqk0qu6oWg!nKud*0c1ru(="ZN's1
+s0%#XP*K!HR\-=JU8=Vc<a8a.riQ7&o)J^&o=k4=s0goQr'L?LqaCHQs$lrWIn3.&8kM`L9MJ5V
+:Jakb;H$Ln<E<1'=^#$7?!^lH@Uiq[B4u!pCi+'/EH?5FGBnL^I=Hd!K8#&9M2R@SOHPfmQ^F52
+SXuOLUnsugWiW>+Yd:^F\%0)_]t_A"_o9X:aihoRcdC1ieCN7(g=tE=hr*JQj5f=akNM0qli6;]
+mdKW6nac8BoCV_Kp@e7Zq#C0iqYg<ir;QZerdk*8s*t~>
+JcC<$QN-UVrr)ior;6Njs7uZhs7ZNerq0[koCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`PfX0^V.:k\[T#RZEUO7X/`+qUnaWUSt)7:Q^*btOH5?YM26n>K7SQ%I=$9aG$ncn
+DKg\qqi:];#*=t1P*D2rqNh,Grfm>Es-*MIrfm>GoToHBo9T?A"dYF=P`q=1P5LI=P4ak'O8k7:
+O7&,,O8b7<O8k:ANq/8h\@K8c^VI_(`Q$!@bKS8Xd*^=lf%8R.g>(N@i8EVTj5oFdkiq?sm-O--
+n*fc8nac8BoCW%Ts7ZHdr:p3cnbW.Yq=ss`rq?9_rq-6^rUU!Ys7$!Us6fpSrp9[N!:'OI#O(@6
+k2tdejSn1hio/kSi8<GKh;-lAgY1B7f\"g-f%&:"e'lamdEp4bcHXSVbK@rJaN)<>`Pf[2_SO%&
+^V7Co]Xtbc\[],W[^EKKZa-j?Yck43XK/A$WMl_mVPU)aUS=HTT:VXFS=?":R@'A.QBd\uP*1rh
+O,o<\N/W[PM2@%DL5(D8s+:o8JUi9#IXQWlH[:!`G^"@TFoHIdF)l8?E,Y_n'l@c&CMITuBP;$j
+An>OaA7K(X@:<RC?NOP>?2e(1>?Y50=oVS(=8c2"<<-"s;u]bq;>j>j:]F2f:&dod9D_?\8c;3U
+8,YpS7J0(D6hE_263$rorp&.VVP0ZRSXZ%9cLh&7*oXJVN6_H_g4Nd*CiDm:FEVqRH@:378l8AX
+KnP&0o)JZKrf@#<rK$l:s+fT"r'L?LqaCHQs$lrWIn3.&8kM`L9MJ5V:Jakb;H$Ln<E<1'=^#$7
+?!^lH@Uiq[B4u!pCi+'/EH?5FGBnL^I=Hd!K8#&9M2R@SOHPfmQ^F52SXuOLUnsugWiW>+Yd:^F
+\%0)_]t_A"_o9X:aihoRcdC1ieCN7(g=tE=hr*JQj5f=akNM0qli6;]mdKW6nac8BoCV_Kp@e7Z
+q#C0iqYg<ir;QZerdk*8s*t~>
+JcC<$QN-UVrr)ior;6Njs7uZhs7ZNerq0[koCDJBnF,i6mHj0(l07BnjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`PfX0^V.:k\[T#RZEUO7X/`+qUnaWUSt)7:Q^*btOH5?YM26n>K7SQ%I=$9aG!e\e
+7S-3Jr_<;a!)<Gfr_N/_r(m>h!)NSjpe_)h:J^jaqGI2h"]8)m;,C*e:B"&e:B"&b:B+,f<WH.r
+<rQ/#<rH%q<rQ+u<;KVl<r,hb<r?#!<r?%n=>dV!]Y2(q_Sa@4aN;WLcHjkbe'ut#f\5'7h;7)J
+ioB(\k3(sml0@X%mI'H3nF5u=o(2JFrq6<brqH?cr;#mZqt^'_rqHEcr:U']s7?3[s7--YrU9dS
+s6]gPs6B[MrTORNkND!ijlPS&j+$(IiS`YOhqm2Fgt^Z<g=b-2f@SU(eC;srda?Ihcd'h\bfe2P
+aiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"e+WiE%sVl-DgUnjc[TqJ$LSt2C@
+S!ob4R$X,(P`q8nOcYWbNfB!VMi*@JLkg_>KnTJY&V>RaJ:E#rI=-BfH?jaZGBS-.F9Q`+EH,r9
+rb`HfChmg$C2%?pB4baeARo=]@U`bS@/aL7?<pk9>QS,5>5h\)=9)G$<rZ/"<;fbq;ZBVm;#X8j
+:Adid9`@]^9)_E\8GPdS7f,XI7/0.A6L-ondBf$cDIZRA:JOVY92Bc%ch@D%Z[c:M7siHWO?>*J
+2)m<I4[)(r6:4+"3'KMg8P;]Jo)JYgnQ,Zbi^*K/rBpHMs$crWrC;?.8P)NH91qrQ9hnJ\:f1+h
+;cHat='/U/>?kH??X[DRA7]CeBkqO%DK'T:FEVkRH@1-jJ:`E-L5:\ENK90aPEhK%R[]k>Tq\?Z
+Vl?\tXfnt8['mHS]"G_k^r"".`lQ9Fbg+P^daQ^sf@\g3gtglGiSrnYjlYail0@U7ljiIPn*ol<
+o(2JFp%A%Pp\jmeq>^<iqu-HlrUg)?s-E\8~>
+JcC<$QN-UVrr)ior;6Njs7uZhs7ZNerq0amoCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bK@oH`PfX0^V7@l\[T#SZEUO7XK&4sUnaWVSt):<Q^*euOH5B[M26n?K7\W&I=$9bGAhPI
+IuB`"be<th%DT`q_SjF5a2l?Dai_g!bQQ27bg"E3c32D;cHXW4cMYugd.YlbdK7hCd/M>jbmhn?
+aiDB>`59@+^V7Fqrk/3C!4MU/pU9M!k-tE#pUL14!P5i@])9)k]=bkm_8=.0a2lEHc-F\`daZh!
+f@em4h;7&IiT&tZk2tjkl0@U$m-X60n*olHncA@SrUp3as7cHdrV>jWr;$0`rqHEcr:U']s7?3[
+s7--YrU9dSs6]gPs6B[MrosIH!9a@Ds5a7Aro4RLiSi_Qhqm5Gh;$c>g=k64rmuYNe^W*tdaHOj
+d*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^X;Y-"h-X/`2!W2HPjV50o]
+TqS-OSt;LCS"#k7R$a2)Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH?jaZGBS-/
+FT6D&EcH)<Df0H0D/=!'C2%BqBP1phAS#C^@q&nU@:9(A!a]/<r`fM/>$Co.s&]8&rDiu"<)ifp
+s&/korD<Mir_EAcs%NDbqb$iZrCH`SrC6]RoL/IAoKqk0rVm/Yg""X#dEKl1qYqE(TsF^uVZ27'
+<g-HbR[p+FU8;I'<a8a0riQ:'Y4;Pk^%/o:^Z%QW6N':L7/fXT7fGpX8,u6\9)hP69MJ5V:Jakb
+;H$Ln<`W:(=^#$7?!grI@Uit\B4u!pCi401EH?5FGBnL^I=Hd!K8#&:MN!OUOHPinQ^F53StD^N
+Uo(&hWiWA-Z*UgG\%0,`^;%M$`5Td<b0/&TcdC1je^i@*g=tH>hr*JQj5f@bkNV6rlg4$,n*fc9
+s7-Edo^qhLp@e7[q#C0iqY^6ir;HTdrdk*8s*t~>
+JcC<$QN-UVrr)ior;6Njs7uZhs7ZNerq0^loCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bK@oH`PfX0^V7@l\[T#SZEUO7XK&4sUnaWVSt):<Q^*euOH5B[M26n?K7\W&I=$9bG@+ci
+D01/_Q2H[ANs(T.PE_=1Q2[*LPlm>;Pa)'/"I,+6Pa)*2oToHBns99A"dYF=P`q=1P5LI;OoUR7
+Nqnb5OSt7<NpVo,OSb(?OH5M#O8G"?O-#G!O>"/V]Y;.s_SjF6aND]NcHsteeCE1&g"P3:hV[8M
+j5]4_k3)!nlKdg'mI'H3nF?MK!V>s^p&Facp\agbq<e%Vq>'gbp\smap&=U`oDS7[nc/+Wn,MhU
+mJcJPlN$5Ll2TrIkPjWDjT+B@it15/iS`YOhVR)EgtUT;g=b-Xf72B%eC;sqda?Ihcd'h\bfe2P
+aiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:F7Xf\\*WiE%sVl-DgUnj`YTqJ$LSt2C@
+S!ob4R$O#&P`q8nOcYWbNfB!VMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FOWG'3h,s)T3$EH,r9
+DJj<.Chmg$Bk_6oB4baeARo:\@U`bS@/aL7?<pk9>QS,5>5h\)=9)G$<WZ9#<;fbq;ZBVm;#a>j
+:Adid9`@]^9)_E\8GPdS7f5^I7/0.A6L-o?n(l=)U]-khSXc+:_XIF&)s"GXN8+Aas'TA/D+@9B
+Fa&(VHW3[2;GU&AK`6Sns8J&VO8b1;O8P$t62X(J6i9@O7K5jV8,l*[8cD?^97KW09hnJ\:f1+h
+;cHdu='/U/>?kH@?X[DRAS#LfBkqO&DfB];FEVkRH@1-jJ:`E-L5CeHNK90aPa.T&R[ftATq\?[
+Vl?\tY->1;['mHS]=bkm_8=.0a2lEHc-FY_daZguf@em4h;-uHiSrnYk2tjkl0@U$mI'H3nF?PL
+#P7T[p%A%Pp\ssfq>^<hqu6NlrUg)?s-E\8~>
+JcC<$QN-UVrr)ior;6Njs7uZhs7ZNerq0dnoCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp1`bK@oH`PfX0^V7@l\[T#SZEUO7XK&4sUnaWVSt):<Q^*euOH5B[M26n?K7\W&I=$9bG="Va
+7n?6G:JFR^9E\'`9hnI_:\dfe;>sDh:BXKi:Jam_;?'Gm:]!ub;>jDm;$9]m;,C'e:B"&e:B"&b
+:B"#i:fmNpr)N_sr`9)#rDi_qr`/hprDi_qqGlubpf@Mt=',B'rDtY_]=bkm_8=.0a2lEHc-F\`
+daZh!f@em4h;7&IiT&tZk2tjkl0@U$m-X60n*olHncA@SrUp3as7cHdrV>jWr;$0`rqHEcr:U']
+s7?3[s7--YrU9dSs6]gPs6B[MrosIH!9a@Ds5a7Aro4RLiSi_Qhqm5Gh;$c>g=k64rmuYNe^W*t
+daHOjd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^X;Y-"h-X/`2!W2HPj
+V50o]TqS-OSt;LCS"#k7R$a2)Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH?jaZ
+GBS-/FT6D&EcH)<Df0H0D/=!'C2%BqBP1phAS#C^@q&nU@:9(A!a]/<r`fM/>$Co.s&]8&rDiu"
+<)ifps&/korD<Mir_EAcs%NDbqb$iZrCH`SrC6]RoL/IAoKqk0/VS7Y?VsZs:eaYW:2Z?4nc.sb
+JmCi9KuZch.5!230Jl!X5sdn,3B/u^5!;L:9)qQRs8H$e<oQFC6N':L7/fXT7fGpX8,u6\9)hP6
+9MJ5V:Jakb;H$Ln<`W:(=^#$7?!grI@Uit\B4u!pCi401EH?5FGBnL^I=Hd!K8#&:MN!OUOHPin
+Q^F53StD^NUo(&hWiWA-Z*UgG\%0,`^;%M$`5Td<b0/&TcdC1je^i@*g=tH>hr*JQj5f@bkNV6r
+lg4$,n*fc9s7-Edo^qhLp@e7[q#C0iqY^6ir;HTdrdk*8s*t~>
+JcC<$QN-UVrVc`nrVQWks7uWg!Vc<eolKcso()>?n*f]3m-O'&l0.9ljQ#:Zi8<AHgY1?4f$r0r
+dEg+^bK7iF`P]O,^:_(g\@/cNZ*1:2Wi2hlUnOHQSXZ%7Q'@GoO,]*UM2$_:Jq/?!H[9p\F`2AM
+KTE%Q]tV1n^;%M$_o0O6a2lBEb00>!rlt2_qp,8hp<ifd!n#BArm(Pg$I$]9a2Z*:_SO('rkABE
+qn;s:qmHC0rjDO0r3uX5pp^+0p:'Y'!4Vp:rji'?!4i*?s1'bn]Y2(r_SjF6aND]McHjndeC<($
+g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?MK!qZ'Vrq6<bs7cHdrV?<dqYU*br;$0`rqHEcr:U*^
+rq$*Zs7--YrU9dS!:BaO!pf.:rosIH!9a@Ds5a7Aro4%=iVqaChqm5Gh;$c>g=k64rmq>)e^W*t
+df.X*d*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZ*:I9Y-"h-X/`2!W2HPj
+Unjc[TqS-OSt;LCS"#k6R$X,(Q'@JqP*(ieO,f3YN/NRMM26qAKnP)2Jq<oO07SG!I=-BfH?jaZ
+GBS+NFE;JCEH,r9DJj<.Chmg$Bk_6oB4baeARo:\@U`bS@/aL7?<pk9>QS,5>5h\)=9)G$<WZ9#
+<;fbq;ZBVm;#a>j:Adid9`@]^9)_E\8GPdS7f5^I7/0.A6L-oEs8C^)f%/3rbg#SPrtk@%ZN'ro
+s*0B\P?1eQT;/3YUK:H!=BGL)!N`Ems8K\5^:h5O^AkqJ^?%ZY6N':K7/o^U7f>jW8,u6\8c_RY
+r_7i::Jakb;H$Op<`W:)=^#'8?=.)K@Uit]B4u$qCi402EccGJG^4U`IXm!%KSG8=MN!RVOckro
+R$jG6StD^OUo(&iX0&P/Z*UjH\@K5a^;%M$`5Td<b0/&Td*^:ke^rF+g=tH?hr*JRj5oFckiq?s
+m-O--n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;HTerdk*7s*t~>
+JcC<$QN-UVrVc`nrVQWks7uWg!Vc<eojRLao()>?n*f]3m-O'&l0.9ljQ#:Zi8<AHgY1?4f$r0r
+dEg+^bK7iF`P]O,^:_(g\@/cNZ*1:2Wi2hlUnOHQSXZ%7Q'@GoO,]*UM2$_:Jq/?!H[9p\F^S`p
+E-R"tr/Uf<"d"k0PE_=2Q2?mIPlR'DPQ$gFQ1UC@Qh$IAQN`\?Q'@Msrf[2ArfR8DqNCf<r/U`8
+rJpZ6r/go=qi:')!06W2!07#=s,d&;0=e[,]t_D#`5Td<b0/#ScdC1jeCN7)g=tH>hr*JQj5f=a
+kNM0qlg4!*mdKW6nc&(\oCV\Sp&Facp\agbq>0saqt^*dq>'gbp\smap&F[`oDS7[nc/+Wn,MeU
+mJZAQlg!d7l2TrIkPjWDjT+B@irS/urnn1AhVR)EgtUT;g=b-Xf*0aUeC;sqrm><(cd'h\bfe2P
+aiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R*DYct=6Xf\\*WiE%sVl-DfUnaZXTqJ$LSt2C@
+S!o_3Q^3o%P`q8nOcYWbNfB!VMi*@JLkg_=KS+o/Jc:0QIsufoI!^0cH$FOWG'.nKF)l;@EH#i6
+DJa6,CMR[!BkV0mAnGUcA7K+Y@UW\Qra,_5?![G7!aAi3r`T8'!*B,"!``3!rDW_os&&_ks%iVh
+r([2br_*,\r^m&Zq+(BQr'g6Gpd=[?lTkop];)'lSt)==S%@SVru1.3J;iOgHI5i+CMua:F*DqT
+I!n[\;,9l>K`6Sms8S,[Nr"e:Nr"h7No`S)6N':K7/o^U7f>jW8,u6\8c_RYr_7i::Jakb;H$Op
+<`W:)=^#'8?=.)K@Uit]B4u$qCi402EccGJG^4U`IXm!%KSG8=MN!RVOckroR$jG6StD^OUo(&i
+X0&P/Z*UjH\@K5a^;%M$`5Td<b0/&Td*^:ke^rF+g=tH?hr*JRj5oFckiq?sm-O--n*fc9o'uhQ
+o`"Lbp@n=\q#C0iqY^6ir;HTerdk*7s*t~>
+JcC<$QN-UVrVc`nrVQWks7uWg!Vc<eoj[Rbo()>?n*f]3m-O'&l0.9ljQ#:Zi8<AHgY1?4f$r0r
+dEg+^bK7iF`P]O,^:_(g\@/cNZ*1:2Wi2hlUnOHQSXZ%7Q'@GoO,]*UM2$_:Jq/?!H[9p\F[AJb
+7nH<K:&@Tc9hnI_:]+&f;>sDe:]=2d;><ua;?'N";c6Ii:f1(d:]4&f:]!oe:\dcb:]=2h=8Z+p
+<W?)#='#6!r)Wesqc*MorDrntqc*Gmoi;)p<r5qu<rQ2"=>3ge]"G_k_8=.0a2lEHbg+P^daZdt
+f@em4h;-uHiSrnYjlYail0@U$m-X60n*olHncJFTo`"O`pAambq#1$bqYL*bqY^0bq#:$epAFU`
+o`"I\o)J7[nGVhUmJuYQliQM<lMg&JkQ'fFk5XNCjSn0?io0mp$fBgth;-l@gY1B7f`'J+f%&:"
+e'e6CA^JcKcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKKZa$a=YHG"0XK/A$WMl_m
+VPL#_U7n9RT:VXFS=?":R$a5+Q'IStP*1rhO,o<\N/W[PM2@%DL4t;5K7\[RJ1lD$I=6KiH?sj]
+GB\4QFEDSEEcH)<Df0H0D/=!'C2%BqBP1phAS#C^@q&nU@:9(A!a]/<r`fM/>$Co.s&]8&rDiu"
+<)ifps&/korD<Mir_EAcs%NDbqb$iZrCH`SrC6]RoL/IAoKqk0/n&!`;,U4b9hS8rN4J3Qn@aTa
+7RrER7"cpB1c[9I4?btr6UNgm4[(u"91qlKnGiGemT/F8r'L?LqaCHQs$lrWs%!,]r^m2a9`@b8
+:/=\_;,U=l<E<.%=]np5>[CcF@:E_XAnPdlCM[m,EH6/DGBeCZI=?]tK7nu7M2I7PO-,TiQ'du/
+S=Z@HUSOcbWiN8)Yd(OB[^`l[]Y;.s_SjF6aND]NcHsteeCE1&g"P3:hV[8Mj5]7`k32'olKmm)
+mdKW6nac5OoCW%T!quB_rqQNhs8)Zjrqu`np&9OBQ2c@~>
+JcC<$Q2gOVrVc`nr;6Njs7uZhBD;,np%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V%1h\@/fOZ*:C4Wi;nmUnXQSSXZ%7QBdVqO,f0VM2-h=Jq/?!I!U'^G&MDJ
+IuKi&bl59a^;.S%_o0O7aN2KGbOs'ZbP]Qac1oT\cN)>cdJVDodEp8>cMu,rbfe/L`l5m6_SO%e
+^AbeB^&PbB[f!Q5[/RB5['d=@[e@3*[f*]3\Fd9+\GWi9\,j(Krjhp;1VCE9^r"".`lQ9Fbg+P^
+dF6Urf@\g2gtgiFi8WeXjlYail07L"m-X60n*ol;o()DEo`"O`pAambq#:*dqXj[]qYg6cq#:$e
+pAFU`o`+O\o)J7[nGVeWmd9E?liQM<lMg#Lki_..joXZ*jSn0?io0mp!T2c5h#Z<crn;hSf[na+
+f%&:"e'cXkd*L%`cHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKKZE^X<YHG"0XK/A$
+WMl_mV50o^U7n9RT:VXFS=?":R$a5+Q'IStP*1rhO,o<\N/W[PM2@"BL4t;5K7\Z)J:E#sI=6Ki
+H?pBQG^"@TF`__HEcQ/>E,TW3D/F*)CMIS_BE;aXrac=F@q/tW@:<RC?NOP>?2e(1>?Y50=TV],
+=8c/$<E)rr;u]bq;>j>k:]=,e:&dod9D_?\8c;3U8,YpT7J'"C6hE_25mZ9!f@JBsc->5DrtbC'
+ZN's%Tmp++Q;pqSTq\<Z<``:'If?JOXfS\os80M#^Abn162X(J6i0:O7K5jU7fl4Q8cD<_92,=Z
+ISN[8:f1.i<)lt"=BSd2>[:ZC?t*SUAS,UhC27[(DfKf>Fa&(VH[U?nJV/W1LP^qJNfT<cQ'Rf*
+S"6.DTqeE]W2co#YHY==[C3TU]Y2(q_Sa@4aN;WLc-F\`e'uq"f\,!6h;7)JioB(\k3(sml0I^&
+mI'H3nF?)?!V>s_o`Fj]p\ssfq>^<hqu6NlrUp/@s-<V7~>
+JcC<$Q2gOVrVc`nr;6Njs7uZhBD;,np%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V%1h\@/fOZ*:C4Wi;nmUnXQSSXZ%7QBdVqO,f0VM2-h=Jq/?!I!U'^G$\Tg
+Cib#_Pl?^CNs1W-P*;)org!AHs-3SKp6,K@rK[#@rKm;F!1!GIs-NbO"-o+8PPp[COo:FCOnk1;
+O8P%9NW+t;O7n\5O84gcO#4G\]t_A"_o9X:aihoRcdC.heCN7(g=k?<hVd>Oj5f=akNM0plKmm)
+mdKW6naZ2@oCV\Sp&Facp\agcq>:$\qtg0fq>'gbp\smap&F[aoDJ1Znc/+WmfMqEmJZAQlg!d7
+klU)3kPjTFjlGM%irS/urnmh7hYu=3gtVh^IbEB*f@JO'eC;sqdF$=ecd'h\bfe2PaiMQD`l5p8
+_ns:,^q[Xu]tD"i]",A]\$i`Q['R'CYct=6Xf\\*WiE%sVl-AeUnaZXTqJ$LSt2C@S!o_3Q^3o%
+P`q8nOcYWbNfB!VMi*@JLPCP;KS+o/JUi9#IXZ]nI!^0c(O:7LGBS+NFE;JCEH,r9DJj<.Chmg$
+C&VcHB4h-S#@q=S@U`bS@/aL7?<pk9>QS,5>5hY+=BAT&<WZ9#<;fbq;ZBVm;#a>j:Adid9`@]^
+9)_E\8GPdS7f5^I7/0.A6L-oDUS4<PS=?":Z.JpR*U^IhN:-^tIpGN\Db!BAGBnO^9h\/TAVGeh
+JV&OCs8S,[OR\D3NrG+&62X(J6i0:O7K5jU7fl4Q8cD<_92,=ZISN[8:f1.i<)lt"=BSd2>[:ZC
+?t*SUAS,UhC27[(DfKf>Fa&(VH[U?nJV/W1LP^qJNfT<cQ'Rf*S"6.DTqeE]W2co#YHY==[C3TU
+]Y2(q_Sa@4aN;WLc-F\`e'uq"f\,!6h;7)JioB(\k3(sml0I^&mI'H3nF?)?!V>s_o`Fj]p\ssf
+q>^<hqu6NlrUp/@s-<V7~>
+JcC<$Q2gOVrVc`nr;6Njs7uZhB_V5op%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V%1h\@/fOZ*:C4Wi;nmUnXQSSXZ%7QBdVqO,f0VM2-h=Jq/?!I!U'^G!SJ`
+7n?6F:JLd]s%NJgr_NMiqbd>hp.kZbpegi`qGI8j#ZFVu;,C+e:f%$br_NDds%iGcr_NJh!)NJn
+r)WVno2b`gr`&hrrDrntqc*Dlp/_/o!EN5!<rQ2#=>[V%]t_A"_o9X:aihoRcdC.heCN7(g=k?<
+hVd>Oj5f=akNM0plKmm)mdKW6naZ2@oCV\Sp&Facp\agcq>:$\qtg0fq>'gbp\smap&F[aoDJ1Z
+nc/+WmfMqEmJZAQlg!d7klU)3kPjTFjlGM%irS/urnmh7hYu=3gtVh^IbEB*f@JO'eC;sqdF$=e
+cd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R'CYct=6Xf\\*WiE%sVl-AeUnaZX
+TqJ$LSt2C@S!o_3Q^3o%P`q8nOcYWbNfB!VMi*@JLPCP;KS+o/JUi9#IXZ]nI!^0c(O:7LGBS+N
+FE;JCEH,r9DJj<.Chmg$C&VcHB4h-S#@q=S@U`bS@/aL7?<pk9>QS,5>5hY+=BAT&<WZ9#<;fbq
+;ZBVm;#a>j:Adid9`@]^9)_E\8GPdS7f5^I7/0.A6L-r:;(5=:9hS5kK!"&4oYHDl7Ri]Q5=d:U
+2EEQL5!MA"6o[1d5!_b591h`In,N;cmT/L:r'L?LqaCHQs$lrW!_>mSr^m2a9`@b8:/=\_;,^Cm
+<E<.&=]ns6?!^lG@U`kZAnYjmCMds-EH6/DGBeF\I=?]tK7nu7M2R=QO-,TjQC+)0SXuLJUSOfd
+WiN8*Yd1UC[^`l\]t_A"_o9X:aihoQcHstfeCE1'g"P6;hVd>Oj5]7`kNM0plg4!*mdKW6nac5O
+oCW%T!quB_rqQNhs8)Zjrqu`np&9OBQ2c@~>
+JcC<$Q2gOVrVc`nr;6Njs7uZhGPCh)p%@tKoCDJBnF,i5m-O''l0.<mjlGI]i8<DIgY1?4f@AC!
+dEg+^bK7iF`P]R.^V.:k\@/fOZEUL6X/W"oUnXQTSsu19QBdYsO,f0WM2-h=K7SQ%I!U'^G'%YF
+I"dZ[ah>C%^VI\&`5K[:aN;TIbP]Tac2Z#dbPfWbc2#Z\ci;AcdJ_JpdEp8>cMu,rbfe/N`l5p7
+_SO%e^AY_A]`PjY]D8o5[K!W4ZN7G@rjMF-qmQL5q7-@3!4Md6s0r'<qmZX8ppg@7rjjnt]Y;.s
+_SjF6aND]NcHsteeCE1&g"P3:hV[8Mj5]4_k3)!nlKdg'mI'H3nF?)?oCMVRp&Facp\agcq>:$Z
+qtp6fq>0mcp\smap&=U`oDJ1Znc/+Xn,MhUmJcJPli68LklU)3kPjTKjlGL_j5T(Wrnmh7hYu=3
+gtVh^%b]Ldf@JL&eC;sqdF$=erm$#<bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i]OZa6sB
+Yct=6Xf\\*WiE%sVl$;dUnaZXTqJ$LSt2C@R[KP1Q^3o%P`q8nOcYWbNfB!VMM[1GLPCP;KS+o/
+JUi9#IXQWlI!^0cH$FOWG'.nKF)l;@EH#i6DJa4nChmg$C&VcHB4h-S#@q=S@U`bS@/aL7?<pk9
+>QS,5>5h\)=9)G$<WZ9#<;fbq;ZBVm;#a>j:Adid9`@]^9)_E\8GPdS7f5^I7/0.A6L-oAf@8?t
+dD4$&rtM6Crr8@jIoM\t=e)%WU8+Md='Si+Y5bU(Y3l8e^$rc8^Ze&^6N':L7/fXT7fGpX8H29]
+9)hP69MJ5V:Jakb;H$Ln<E<1'=^#$7?!^lG@Uiq[B4u!pCMds.EH?5FGBeF\I=?]uK8#&9M2R=Q
+OHPfmQC+,1SXuLKUnsufWiW>+Yd1UD\%0)_]t_A"_o9X:aihoRcdC.heCN7(g=k?<hVd>Oj5f=a
+kNM0qlg4!*mdKZ8rpg*]o`"Lbp@n=\q#C0iqY^6ir;QZerdk*7s*t~>
+JcC<$Q2gOVrVc`nr;6Njs7uZhC%q>pp%@tKoCDJBnF,i5m-O''l0.<mjlGI]i8<DIgY1?4f@AC!
+dEg+^bK7iF`P]R.^V.:k\@/fOZEUL6X/W"oUnXQTSsu19QBdYsO,f0WM2-h=K7SQ%I!U'^G'%)$
+CN+NOOcGJ$NsCc/P*;,qPa2*2!gT"7pQGTAr0?o?rg3DG!1!GIs-NbO"-o+8PPp[COo:FCOnY%7
+O8P%8NW5%<O7SJ4O8Ft2O8+b"O#+D\^;%M$`5Td<b0/&Td*^:ke^rF+g=tH?hr*JRj5f@bkNV6r
+lg4!*mdKW6nac8BoCW%Ts7ZKer:p9eqtfm\qtg6dqY:'arq?9_rq-6^r:9mXs7$$Vs6fpSrp9[N
+s6BUJ!pJh1roOIIjQ,@]io8qrhuV`lrnRV1g]#n:g"=p.f%&=#eC2jndEp5=c@=*_bKJ&MaN2EA
+`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^EKKZa-j?Yck43XfSS'Wi;qpVPU)aUS=HUTV%gISXc1<R@'A.
+QBd`"PEM)kOH5H_NJrgRM2@%DL5(D8K7ec,J:N,uI=6KjH[:!`G^"@TF`__HEcQ/>E,TW3D/BDl
+CMR[!rb)=FB)Z?HA7K+Y@UW\Qra,_5?![G7!aAi3r`T8'!*B,"!``3!rDW_os&&_ks%iVhr([2b
+r_*,\r^m&Zq+(BQr'g6Gpd=[?lTkfKTUhUBR\\'rrVml:`.X5ns*9W17Vm!;F`hqRI!n[];GMq!
+Jq8Q,mJd0IrK-H.!0HG2r'L?Lr'^NQs$luXs%*/]s%<;aInWR2:/=\_;,U=k<)lt#=BSg3>[:ZC
+?t*VVAS5[jCMRd)E,fr@G'A1WH[U?nJqJc3Ll%%KNf]EfQ'Rf+S"6.DU84W`W2cr$YHY==[^WfY
+]Y2(q_Sa@4aN;WLcHjnce'ut#f\5'7h;7)JioB+]k3(smlKdg'mI'H4nc&([oCW%T!quB_rqQNh
+s8)Zjrqucoo_sFAQ2c@~>
+JcC<$Q2gOVrVc`nr;6Njs7uZhBD;,np%@tKoCDJBnF,i5m-O''l0.<mjlGI]i8<DIgY1?4f@AC!
+dEg+^bK7iF`P]R.^V.:k\@/fOZEUL6X/W"oUnXQTSsu19QBdYsO,f0WM2-h=K7SQ%I!U'^G'$)>
+6q0a?:]3ue9`Rrf:]=2e;>sDd:B45d;><ub;?'N";c6Lj:f1(d;#O/g:]!oe:\dcb:]4,h:\7]]
+<V'8j<W5ts<W#ns<Vobm<W?)"<Voeu<E<0"=8l5%<E<0"=#7J$^;%M$`5Td<b0/&Td*^:ke^rF+
+g=tH?hr*JRj5f@bkNV6rlg4!*mdKW6nac8BoCW%Ts7ZKer:p9eqtfm\qtg6dqY:'arq?9_rq-6^
+r:9mXs7$$Vs6fpSrp9[Ns6BUJ!pJh1roOIIjQ,@]io8qrhuV`lrnRV1g]#n:g"=p.f%&=#eC2jn
+dEp5=c@=*_bKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^EKKZa-j?Yck43XfSS'Wi;qpVPU)a
+US=HUTV%gISXc1<R@'A.QBd`"PEM)kOH5H_NJrgRM2@%DL5(D8K7ec,J:N,uI=6KjH[:!`G^"@T
+F`__HEcQ/>E,TW3D/BDlCMR[!rb)=FB)Z?HA7K+Y@UW\Qra,_5?![G7!aAi3r`T8'!*B,"!``3!
+rDW_os&&_ks%iVhr([2br_*,\r^m&Zq+(BQr'g6Gpd=[?lTtPI-VmE2;Hn41e,'*kR:])^GKW9Q
+/1WV>2*X8i5XIju3BfW!91qiJ9'uZU<W6#!<Us2T62X(J6i9@O7K5jV8,l-[8cME_97KW09hnJ\
+:f1+h;cHat='/U/>?kH??XR>QA7]CeBkqL$DK'T:FEVkQH@('hJ:`E-L5:\EN/j!_PEhH$R[]k>
+TVA6YVl6VsXfnt7ZaR?R]"G_k^r"".`lQ9Fbg+P^dF6Urf@\g2gtgiFi8WeXjlYail0@U$m-X60
+nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NmrUg)?s-<V7~>
+JcC<$Q2gLUrr)ior;6Njs7uZhs7^[0p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX0^V.:k\[SuQZEUO7X/`+qUnaWUSt)7:Q^*btOH5?YM26n>K7SQ%I=$9bGBIkF
+H[q'E[EZD!^;.V&_o9X9aN;TJbPfZbc25]_bl>racM>fdd.YlcdK@nDd*M^:s31kob/q]C`PfX0
+_#D%J^&G\A]`c![]=PTP[J731[/dT3ZN7G@rjM+$rj_I,n$rA-0"S^0^VRe*`Q-'BbK\>YdF-Op
+f%8U/gYL]Ci8N\UjQ5OekiqBum-O--n*fc9rpg*]o_nFap@n=Zq#:*eqX47XqYg6dq#0sepA=O_
+o`+O]o)A1ZnG_nVmf2\Rm/QDOlMg#Lki_..joOT)ro=%<"l\Cthr!;ih$Vrlg=k65f[na+ec+&)
+e'cXkd*L"_c-611EluMFaN)<>`Pf[2_SO%&^V7Co]Xtbc\@8oT[C!9HZE^X<YHG"0XK/A$W2HPj
+V50o^U7n9RT:VXFS"#k7R$a5+Q'IStP*1rhO,o<\N/NRMM26qAL4t;5K7\Z)J:E#rI=-BgH?sj]
+GB\4QFEDSErc&9aDf0H0Ci!m&C2*Z\!G?$DAH?=OraPn9!+>e5!a]/<r`fM/>$Co.!a&N*rDiu"
+<)ifps&/korD<Mir_EDdr_3;aqb$iZr^ciTr'pTQoL/IAoKqk0"kM&IOc')5ru%`Fli3aSIoM\t
+=IPkXV5@6p<a&S-Xf\Y+m/R!srOr9HqRusEqnE'ElTtG8r^6QNr^HiVr^ZuZ!(m/^InNI/9heAY
+:f("e;c?Xr<``C+>$G6;?XI5N@qB4aBPD6uDJjE5F*)SLH$XjdIt3-'KnbD?N/`m[P*;/tR$sM8
+T:r!TV5L;mXKA\2Za@0M\[oGe^VRe*`Q-'AbKS8XdF-Lnf%8R.gYCWBi8N\UjQ5OekiqBum-O0/
+mgJXTo()DDo_%nNp@nO\s7u]krVQQkrr)KgJcD#8J,~>
+JcC<$Q2gLUrr)ior;6Njs7uZhs7^R-p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX0^V.:k\[SuQZEUO7X/`+qUnaWUSt)7:Q^*btOH5?YM26n>K7SQ%I=$9bGBI8$
+Ao)R;NKfE_O-#HcOckomQ'M64!gT"7pQPWArK[#@rg3DG!1!DHs-EnTQ'IStPQ$aCOoCODOnOt:
+Nqe\8Nr+h9NrG+/OT1CANrP1>OSOt4NpMfZ]"Gbl_8=.0a2lEHc-FY_daZguf@em4h;-uHiSrnY
+jlYail0@U$m-X60n*olHncA@SrUg6cp\4U\rqZKgmecnXrV?<brV-?cqt:!]s7?3[rpg$XrpTmT
+s6]gPs6K^MrojLJkNDj,!TiDAj8\*BiS`YOhqn@g$JaCig=b03f@SU(rmV8'da?Ihcd'h\bl5e+
+b/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP_\$i`Q['R*EZ*:I9Y-"h-X/`1uVl-DgUnjc[TqS-OSt;LB
+S!ob4R$X,(Q'@JqP*(ieO,f3YMi*@JLkg_>KnP)2Jq8H&IsufoI!^3dH?jaZGBS+NFE;L%E=-Z'
+DJj<-Chmg$C&VcHB4h-S!G#^>@fKj:@/aL7?<pk9>QS,5>5hY+=BAT&<WZ9#<;fbq;ZBVm;#a>j
+:Amod9`@]^9)_E]8GPdR7f5^I7/0.A6L-oASt)9lE5L`7ru07=Nj\n<a'M5PDbY=uH?jm19hS>X
+KnFr.K'`L;O8G%=NrY:<NrY:=O8b7,62X(K6i0:N7K5jV8,l*[8cD>392&#R9hnJ\:f1+h;cHdu
+='/U/>?kH@?X[DRAS#LfBkqO&DK'T:FEVkRH@1-jJ:`E-L5:\FNK90aPEhK%R[]k?Tq\?ZVl?\t
+Xfo"9['mHS]"G_k_8=.0a2lBGbg+P^daQ^sf@\g3gtglGiSrnYjlYail0@U$m-a?2$h3]Wo(2JF
+p%A%Pp\jmeq>^<iqu-HlrUg)?s-<V7~>
+JcC<$Q2gLUrr)ior;6Njs7uZhs7^.!p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX0^V.:k\[SuQZEUO7X/`+qUnaWUSt)7:Q^*btOH5?YM26n>K7SQ%I=$9bGBH5>
+6Us[?9Mk^^!)<Gfs%iVjqbd>hpJ:fcq,-o`qbdAk#ZFW!;,C+e:f.'br_NDd!)NDcr_NGgs%iYi
+nlGHan5fKfqH!Sqqc*GmlrGaM]Y;.s_SjF6aND]NcHjndeCE.%g"P3:h;@/LioB+]k3(smlKdg'
+mI'H3nF?MK!V>s^o`Fj]p\agcq>C*Wqtp6gq>0mbp]'sap&F[aoDS7Znc/+Xn,MhUmJcJPli68L
+klU)3kPjTEjlHF$s5F4@i8EMMhYu=<gtUQ:g"G$0f@JLOe-XUPdF$=ecHa\Yrl]?)aiMQD`l5p8
+_ns:,^q[Xu]tD"i]",>[[^NTNZa6sBYct=6Xf\\*WiE"qVl$;dUnaZXTqJ$LSt2@?R[KP1Q^3o%
+P`q8nOcYWbNfB!UMM[1GLPCP;KS+o/JUi9#IXQWlH[C'bH$FOWG'.nKF)q8"$?0p$DJa3+CMR[!
+rb)=FB)Z?BA7PUJs'Yn8ra,_5?![G7!aAi3r`K;)=',?$!``3!rDW_os&&_ks%iVhrD!8br_*,\
+r^m)[q+(?Pr'g6Gpd=[?lTlLe9h[rCDN;I#s5Ktr9grUB89l^92```V5X.V'r]'p@"A)6Y84i1J
+q,IDqr`/MilTtG8r^6QNr^HiVr^ZuZ!(m/^InNI/9heAY:f("e;c?Xr<``C+>$G6;?XI5N@qB4a
+BPD6uDJjE5F*)SLH$XjdIt3-'KnbD?N/`m[P*;/tR$sM8T:r!TV5L;mXKA\2Za@0M\[oGe^VRe*
+`Q-'AbKS8XdF-Lnf%8R.gYCWBi8N\UjQ5OekiqBum-O0/mgJXTo()DDo_%nNp@nO\s7u]krVQQk
+rr)KgJcD#8J,~>
+JcC<$Q2gLUrr)ior;6Njs7uZhs7ZNerq17&oCDJBnF,i6mHj0(l07Bnk2bR^iS`SKgtUQ8f@AC"
+dEp1`bK@oH`PfX0^V7@l\[T#SZEUO7XK&4sUnaWVSt):<Q^*euOH5B[M26n?K7\W&I=$9bGBI_?
+G(,13W62ig^VI_'`5Ta:aN;TJrlbGgbfot-rQP;dqp,#`rm:Adr6kVl!71Yis32,!bK7fE`PfX0
+^q[Ut]tCtiqn3'D]=\'RqR-+,s0_m6r3HC1qmPn$rj_U0!4Mm9osb"2r4"Ai]Y2(q_Sa@4aN;WL
+cHjkbe'ut#f\5'7h;7)JioB+]k3(sml0@X%mI'H3nF?MK!qZ'Vrq-?dp\4U\rqZNhlhgSUrV?<b
+rqHEcr:U']s7?3[s7--YrU9dSs6]gPs6B[MrTOCIkNDj,!TiDAj!NdEiS`YOhqm2Fgt^Z<g=b-2
+f@SU(eC;srda?Ihcd'h\bfe2Pao9A!a2Z*;`5BI/_8*h#^:h1k]",A]\$i`Q['R*EZ*:I9Y-"h-
+X/`.tVl-DgUnjc[TqS-OSt2C@S!ob4R$X,(Q'@JqP*(ieNfB!VMi*@JLkg_>KnP)2Jq8H&Isufo
+I!^0cH$OXYGBS+NFE;L%E<U<"DJj<-rbDOLC&VcHB4h-S!G#^>@KKtG@/aL6?=!P8s',M,r`K;)
+=',B%s&K(urDW_os&&_ks%iVhr([2br_*,\r^m&Zq+(BQr'g6Gpd=[?lTk^&P)G'EIf03`YI)j[
+YQ'#MQ;h"VTr"N^<`iC+=0AX-XKUsirOr-Cs1eKGrkJBFrP.bdr'L?LqaCHQs$lrWs%!,]r^m2a
+9`@b8:/=\_;,U=l<E<.%=]np5>[CcF@:E_XAnPdlCM[m,EH6/DG'A4XI!pKpK7nu7M2I7OO-,Ti
+Q'[l-S=Z@HUSOcbWN*)'Yd(OA[^`l[]Y;.s_SjF6aND]NcHjndeCE.%g"P3:h;@/LioB+^k3)!n
+lKdg(mdKW6nac8No*+dZp%J+RrV-HiqYL-erqu`no_sFAQ2c@~>
+JcC<$Q2gLUrr)ior;6Njs7uZhs7ZNerq0gooCDJBnF,i6mHj0(l07Bnk2bR^iS`SKgtUQ8f@AC"
+dEp1`bK@oH`PfX0^V7@l\[T#SZEUO7XK&4sUnaWVSt):<Q^*euOH5B[M26n?K7\W&I=$9bGBI.u
+ASZ:3KT_@Vrf@;GP*;,pQ2?mIPlR'CPQ-mGQ1UC@Qgg:FQ^3o%P`q=1P5LI@P5g[<P5:46O8P%;
+NW5%9O7SJ1O8b79O84h(O"J#X^VI_(`Q$!@bKS8Xd*^=lf%8R.g>(N@i8EVTjQ5Oekiq?sm-O--
+n*fc9rpg-^o^r.U!quB_r:p9erVGjWqtg9eqY:'arq?9_rq-6^rUU!Ys7$!Us6fpSrp9[N!:'OI
+!pJh1roO7CjSn0dio/kSi8<GKh;-lAgY1B7f\"g-f%&:"e'lamdEp4bcHXSVbK@s+aDT&<`Pod5
+_SX.)^V@Lr]Xtbc\[],W[^EKKZa-j?Yck43XfSS'WMl_mVPU)aUS=HUTV%gHS=?":R@'A.QBd`"
+PEM)kOH5E]N/W[PM2@%DL5(D8K7ec,J:N,uI=6KiH?sj^G^"@TF`__HErL%^E,TW3D/B2e!GZ?J
+BE;aXrac+@A,]p=@:3LB?NFJ=r`oJ-s'#D)!a&N*r`9&!s&Aqqs&/korD<Mir_EAcs%NDbqb$iZ
+rCH`SrC6]RoL/IAoKqk0"e0URDJEqbrsd\@NMQT4m9N2!85=8Ord+rF9hSAYKnFu0K^8[6O91K)
+OSk1=OSk1<OR>F46N':K7/o^U7f>jW8,u6\8c_RYr_7i::Jakb;H$Op<`W:)=^#'8?=.)K@Uit]
+B4u$qCi402EccGIGBnL^I=Hd"KSG8=MN!OUOckroQ^F84StD^OUo(&hWi`G.Z*UgG\@K5a^;%M$
+`5Td<b0/&TcdC1je^i@*g=tH>hr*JQj5f@bkNV6rlg4$,n*fc9o()hP"n_K\p@e7Zp]C9fqY^6i
+r;HTdrdk*7s*t~>
+JcC<$Q2gLUrr)ior;6Njs7uZhs7ZNerq0gooCDJBnF,i6mHj0(l07Bnk2bR^iS`SKgtUQ8f@AC"
+dEp1`bK@oH`PfX0^V7@l\[T#SZEUO7XK&4sUnaWVSt):<Q^*euOH5B[M26n?K7\W&I=$9bGBH2=
+6q'U:92J;Ur_3Gh:J^sdqbd>hpJ:fcpegi`qbdAk!`Mupr)!Jk:]4&f:]!le:\dca:]4,i:]=,V
+<qTJa<rH%o<rQ+s<;T\g<WH.s<\:tt^VI_(`Q$!@bKS8Xd*^=lf%8R.g>(N@i8EVTjQ5Oekiq?s
+m-O--n*fc9rpg-^o^r.U!quB_r:p9erVGjWqtg9eqY:'arq?9_rq-6^rUU!Ys7$!Us6fpSrp9[N
+!:'OI!pJh1roO7CjSn0dio/kSi8<GKh;-lAgY1B7f\"g-f%&:"e'lamdEp4bcHXSVbK@s+aDT&<
+`Pod5_SX.)^V@Lr]Xtbc\[],W[^EKKZa-j?Yck43XfSS'WMl_mVPU)aUS=HUTV%gHS=?":R@'A.
+QBd`"PEM)kOH5E]N/W[PM2@%DL5(D8K7ec,J:N,uI=6KiH?sj^G^"@TF`__HErL%^E,TW3D/B2e
+!GZ?JBE;aXrac+@A,]p=@:3LB?NFJ=r`oJ-s'#D)!a&N*r`9&!s&Aqqs&/korD<Mir_EAcs%NDb
+qb$iZrCH`SrC6]RoL/IAoKqk0!)<G\+@/?Us6R+<:dnL7:n0$d2_R$M5X7Y(3B/u^4\87;8PJIM
+oMtH_mQpb;rBpHMs$crWrC?lY!(m/^!D?,c9n#i5:f("e;cHat<``F,>$P<=?XR;O@qB7bBPM=!
+DJsN8FEMbNH$XjdIt30)L51VCN/`m\P*D5uR%'V;T:r$UVPgDnXfen5Za@0N\\#Mg^VRe*`Q-'B
+bK\>YdF-Opf%8U/gYL]Ci8N\UjQ>Ufl07L!m-X60n*ol<o)J:bo_%nNp@nO\!r;]hr;6KkrVcBf
+JcD#8J,~>
+JcC<$Q2gLUrVc`nrVQWks7uZhs7ZNerq14%oCDJBnF,i6mHj3)l07Eok2bR^iS`VLgtUQ8f@JI#
+dEp4bbfe,L`l5g2^V7@m\[T#SZa$^9XK&4sV50fXSt2@=R$Nu"OcPK\MM[+BK7\W'I=-?cGBJ"H
+EdNFuS[?VT^VRe)`5Ta:ai_g(bkoT]bQ,occM5`ad.brcdf7Yoci23'c-4DTaiDE?`59@+^V7Fq
+]Xthhr4W-C!5&0?rO)X3rjDR1s0_m6r3HF2[J[Jd\+$mU]Y;.s_SjF6aND]NcHstfeCE1'g"P6;
+hV[8Mj5]4_k3)!nlKdg'mf)YZnF?)?oCV\Sp&Facp\jmdq>L0Rqu$<hq>0mcp\smap&F[`oDS7[
+nc/+Wn,MeUmJZAQlg!d7l2TrIkPjWDjT+B@it15/iS`YOhVR)EgtUT;g=b-Xf7)<$eC;sqda?Ih
+cd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h,WiE%sVl-DgUnjc[
+TqS-NSt2C@S!ob4R$X,(Q'@JqP)t`cNfB!VMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FRXG6N/4
+FEDSErc&*\Df0H0D#S2NC2*Z\!G?$DAH?=OraGq;?srt@!FB(2>lS%.>5hY+=BAT'<rZ2"<;fbq
+;ZBVm;#a>j:Adid9`@]^9)_E\8GPdS7f5^I7/0.A6L-o@Mhck4I>n1*(pplbs0r#W<0pQfR\?OQ
+Vc[)&>$%l/Y,ppgrOr-CrP/<FrP/?GqnMVdr'L?LqaCHQs$lrW!_>mSr^qZ59MJ5V:/=\_;,^Cm
+<E<.&=]ns6?!^lG@U`kZAnYjmCMds-EH6/DGBeF\I=?]tK7nu7M2I7PO-,TiQC+)0S=ZCIUSOcc
+WiN8)Yd1UC[^`l[]Y;.s_SjF6aND]NcHsteeCE1&g"P3:hV[8Mj5]7`k32'olKmm)mdKTJnF?)?
+oCW%T!quB_rqQNhs8)Zjrqu`no_sFAQ2c@~>
+JcC<$Q2gLUrVc`nrVQWks7uZhs7ZNerq1+"oCDJBnF,i6mHj3)l07Eok2bR^iS`VLgtUQ8f@JI#
+dEp4bbfe,L`l5g2^V7@m\[T#SZa$^9XK&4sV50fXSt2@=R$Nu"OcPK\MM[+BK7\W'I=-?cGBJ"6
+@q]b$IZ'JPOH>TfPEV5rqj.8I!0m2@!0mDHoToKCn<O9FQBd`"PEZ!/r/pr@rfQl:pQ#'1p5]'3
+o8rj1rfH]3s,QT0.(m:/_8=.0a2lEHc-F\`e'uq"f\,!6h;7&IiT&tZk2tjkl0@U$m-alA#4V0R
+o(2MGrq6<bs7cKerqZNhkkk;SrV?<brqHEcr:U*^rq$*Zs7--YrU9dS!:BaO!pf.:rosIH!9a@D
+s5a7Aro4RLiSi_Qhqm5Gh;$c>g=k64rmuVMe^W*tdaHOjd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#
+^:h1l]=PP`\@8oT[C!9HZE^X<YHG"0X/`2!W2HPjV50o^U7n9RSt;LCS"#k7R$a5+Q'IStP*1of
+O,f3YN/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH?ja[GBX46F`__HErL%^E,TW3D/B2e!GZ?JBE;aX
+rac+@A,]p=@:3LB?NFJ=r`oJ-s'#D)!a&N*r`9&!s&Aqqs&/korD<Mir_EAcs%NDbqb$iZrCH`S
+rC6]RoL/IAoKqk0+`VC8C2.G^s5B$"P5g^F?:Jg'9m(]-I!eX_92\K<JqAR=s8S/ROSt7=OT(=<
+ORPR66N':K7/o^U7f>gY84cDP8q0K-9heAX:Jakb;c?Xq<`W=*=^,-:?=.)L@Us%^BP;-rD/O93
+EccGJG^=^bIXm!%KSG8=MN!RVOckrpR$jG6StMdPUo()jX0&P/ZEpsI\@K5a^;%M$`5Td<b0/&T
+d*^:ke^rF+g=tH?hr*JRj5oFckiq?sm-O--n*^GLnac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*7
+s*t~>
+JcC<$Q2gLUrVc`nrVQWks7uZhs7ZNerq0dnoCDJBnF,i6mHj3)l07Eok2bR^iS`VLgtUQ8f@JI#
+dEp4bbfe,L`l5g2^V7@m\[T#SZa$^9XK&4sV50fXSt2@=R$Nu"OcPK\MM[+BK7\W'I=-?cGBJ!n
+779U89MA7]:&drg:]=2f;>sDc:B45d;><ub;?'Mp;c<Nj!DlSj:B"&d:B+,c:B"&e:]O;h:?tsR
+<V'8h<Vfbq<Vobn<Ua$;]Y;.s_SjF6aND]NcHstfeCE1'g"P6;hV[8Mj5]4_k3)!nlKdg'mf)YZ
+nF?)?oCV\Sp&Facp\jmdq>L0Rqu$<hq>0mcp\smap&F[`oDS7[nc/+Wn,MeUmJZAQlg!d7l2TrI
+kPjWDjT+B@it15/iS`YOhVR)EgtUT;g=b-Xf7)<$eC;sqda?Ihcd'h\bfe2PaiMQD`l5p8_ns:,
+^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h,WiE%sVl-DgUnjc[TqS-NSt2C@S!ob4R$X,(Q'@Jq
+P)t`cNfB!VMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FRXG6N/4FEDSErc&*\Df0H0D#S2NC2*Z\
+!G?$DAH?=OraGq;?srt@!FB(2>lS%.>5hY+=BAT'<rZ2"<;fbq;ZBVm;#a>j:Adid9`@]^9)_E\
+8GPdS7f5^I7/0.A6L-r;6m"`]67q]=J5\s4buV&!.lT1?4?l,!76*=f5!;J08kA7Is&AVjnlG6G
+r'L?LqaCHQs$lrW!_>mSr^qZ59MJ5V:/=\_;,^Cm<E<.&=]ns6?!^lG@U`kZAnYjmCMds-EH6/D
+GBeF\I=?]tK7nu7M2I7PO-,TiQC+)0S=ZCIUSOccWiN8)Yd1UC[^`l[]Y;.s_SjF6aND]NcHste
+eCE1&g"P3:hV[8Mj5]7`k32'olKmm)mdKTJnF?)?oCW%T!quB_rqQNhs8)Zjrqu`no_sFAQ2c@~>
+JcC<$PlLFUrVc`nr;6Nj!;ZTg#5@ibp%@tKrpjjpnF,f4m-O'&l0.9ljl>C[i8<AHgY1?4f$r3t
+dEg+^bK7iF`P]R.^V%1h\@/fOZ*:C4Wi;nmUnXQSSXZ(8QBdYrO,f0VM2-h=K7JH"I!U'^G'%P>
+G'\n+V9?Wh_8=+.`l?*Ab0%p*bkoT^bl>recM5``d.brcdf7Yoci23!c-4DTb/_N@`59@+^V9]\
+s189Dr4W-Cs1A6@!kZ+Pr3ZR4Zi.62[J702[C#k<!OT94[cFps\G3Q*\2(_2^VRe*`Q-'BbK\>Y
+dF-Oof%8U/gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DDo`"O`pAamcq#:*fqW@\QqYg6dq#:$e
+pAFU`o`"I\o)J7[nGVhUmJuYQliQM<lMg&JkQ'fFk5XNCjSn0?io0mp$fBgth;-l@gY1B7f`'J+
+f%&:"e'e6CEmW.XcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck43XK/A$
+WMl_mVPU)aUS=HTT:VXFS=?":R@'A.QBd`"PEM&iO,o<\N/W[PM2@%DL5(D8K7ec,J:N,uI=6Ki
+H?sj]rc\iqF`__HEcH)<E,TW3D/B2e!GZ?JBE;aXrac+@A,]p=@:3LB?NFJ=r`oJ-!*]>(!a&N*
+r`9&!s&Aqqs&/korD<Mir_EDdr_3;aqb$iZrCHcTr'pTQoL/IAog7n/*e/TaUmqCl]sn$Ls&<6f
+<a(udUnjqk=]\g/Y-"k.l2Uarr4`$B!5A?F!5A<EnNm(>rBpKNr^HiVr^ZuZs%35_s%@f79heAY
+:f("e;c?Xq<``C+>$G6;?=.)L@q9.`BPD6tD/O<4F*)PKG^=^bIXm!%KnbD?Mi<[WP*;/sR$jG7
+StMdQV5L8lX0&S0ZEpsI\@T>d^VI_(`Q$!@bKS5Vd*^=le^rI,g>(N@i8EVTj5oFdkiq?tm-O--
+n*^GLnac8Bo`"Lbp@n=\q#C0iqY^6ir;HTerdk*6s*t~>
+JcC<$PlLFUrVc`nr;6Nj!;ZTg#5@ibp%@tKrpjFdnF,f4m-O'&l0.9ljl>C[i8<AHgY1?4f$r3t
+dEg+^bK7iF`P]R.^V%1h\@/fOZ*:C4Wi;nmUnXQSSXZ(8QBdYrO,f0VM2-h=K7JH"I!U'^G'%%u
+A86+0K9MAqO9^o2PE_>uQBhH8!gT"7pQPWArg!)@rg3DG!1!;E"-o+8PQ$aCOo1CBOnt4@PPgRE
+PE#9rpQ,<6rf@&=r/]TonW,H<^;%M$`5Td<b0/&TcdC1jeCN7)g=tH>hr*JQj5f=akNM0qlg4!*
+mdKW6nac8BoCW%Ts7ZKerV6BfrVG[Rr;-BfqY:'arq?9_s7H<^rUU!Ys7$!Us6]mSrTjUOlK\B5
+s6'IGroX7B!9F.>!TN);i!\H!hVI#CgY:H9g"?;U"kM5ReC2kFd;mU[cHa\YbKJ&MaN2EA`Pod5
+_SX.)^V@Lr]Y(kf\[f5Z[^NTNZa6sBYct=6XfSS'Wi;qpVl$;dUnaZXTV%gISXc1=R[KP1Q^3o%
+P`q8mOH5H_NJrgSMM[1GLPCP;KS+o/JUi9#IXQWlH[:!`GlDmsG'.nKF)l8?E,]`5DJa4hCB80a
+rb)=FB)Z?BA7PUJ!b#JEra,\4?2e+/>6%k*=TV],=8l8#<W?%s;u]bq;>j>k:]=,f:&[ic9D_?\
+8c;3V8,PjS7J'"C6hNe162t[%=a>)Jrf@lpORPY2Db*QEG^=ac:/+D[9ne1NJa*46O7eS7O8G"=
+O8=t.62X(J6i9@O7K5jV8,l-[8cME_97BQ/9hnJ\:f1+h;cHat='/U/>?kH??XR>QA7]CeBkqL$
+DK'T:FEMePH@('hJ:W?,L5:\EN/is^PEhH$R@Bb=TV80XVl6VrXfnt7ZaI6O]"G_k^r"".`lQ9F
+bg"G[dF6Uqf@\d1gtgiFi8WeWjlYail07O#m-X60mfi4No()DErq-?dp\4[^s7u]kr;6KkrVcEg
+JcCu7J,~>
+JcC<$PlLFUrVc`nr;6Nj!;ZTg#5@ibp%@tKrpjCcnF,f4m-O'&l0.9ljl>C[i8<AHgY1?4f$r3t
+dEg+^bK7iF`P]R.^V%1h\@/fOZ*:C4Wi;nmUnXQSSXZ(8QBdYrO,f0VM2-h=K7JH"I!U'^G'$);
+6:FF992PU^!_uNer_WJhr_W>bs%rMgpe^ibs&',$;Gg:f;,L.crD*>fqbI/eq+gobr)!Dhr([8g
+<U*WX<TdEX<UNmC]Y;.s_SjF6aND]NcHjndeC<($g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?
+oCMVRp&Facp\jmdq>L0Pqu$<hq>0mcp\smap&F[`oDS7[nc/+Wn,MeUmJZAQlg!d7l2TrIkPjWD
+jT+B@irS/urnn1AhVR)EgtUT;g=b-Xf*0aUeC;sqrm>c5cd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu
+]tD"i]",A]\$i`Q['R*EZ*:I9Y-"e+WiE%sVl-DgUnjc[TqJ$LSt2C@S!ob4R$X,(Q'@JqOcYWb
+NfB!VMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$K=4%X)u:FE;JBEH#l8DJj<-rbDOLC&VcHB4h-S
+!G#^>@KKtG@/aL6?=!P8s'#J,rE02(=',B%s&K(urDW_os&&_ks%iVhrD!8br_*,\r^m&ZqFCHQ
+r'g6Gpd=^@kWp4U,r@B.;b'O*<M1Wj3&!3P5=._+3B0#_4\87;8Ep0R<:X&^<q/KR6N':L7/fXT
+7fGpX8H29]9)hP59MJ5V:Jakb;H$Ln<E<1'=^#$7?!^lG@Uiq[B4u!pCMds.EH?5EGBeF\I=?]t
+K8#&9M2R=QO-5]lQC+)0SXuLJUnsufWiN8*Yd1UC[^`o]]t_A"_o9X:aihoQcHstfeCE1'g"P6;
+hVd>Oj5]7`kNM0plg4!*mdKTJnF?)?oCW%T!quB_rqQNhs8)Zjrqu`np&9OBPlH7~>
+JcC<$PlLFUrVc`nr;6Njs7uZhFnbV'p%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V.:k\@/fOZEUL6X/W"oUnXQTSsu19Q^*btOH,9XM26n>K7SQ%I=$6`G'%eD
+EdN:pS$:,P_8F1/`lQ6Cb0/!,bkoT]bQ,oecM5``d.Ylcdf7Yoci23!c-4DTb/hTA`59@+^V9]\
+s1A<DrOr6Ds1A6@"hVF\]sP0D[K!W4Zi.<.[K*`7[/[H5['fV9n$`;*rO;d9pp]t,/A8g6_Sa@4
+aN;WLcHjkbe'ut#f\5'7h;7)JioB(\k2tmll0@X%mI'H3nF?MK!V>s_p&Facp\jmdq>L0Nqu$<h
+q>0mcp\smap&F[aoDJ1Znc/+WmfMqEmJZAQlg!d7l2TrIkPjTFjlGM%irS/urnmh7hYu=3gtVh^
+IbEB*f@JO'eC;sqdF$=ecd'h\bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I8
+Xf\\*WiE%sVl-DgUnjc[TqJ$LSt2C@S!ob4R$X,(Q'7AoOcYWbNfB!VMi*@JLkg_>KnP)2Jq8H&
+IsufoI!^0c!I8qhG7Je=FEDSEEH,r:Df0H0D#S2NC2*Z\!G?$DAH?=OraH+@?sm>K?=$q:>lS".
+>5_S*=BAT'<rZ2"<;fbq;ZBVm;#a>k:Adic9`@]^9)_E]8GPdR7f5^I7/0.B6KpcTF.o"<D3L1`
+UoK)LPuLnVUSO]`>$4p2<j&O+kl:Rork@X3o0N:@r^6QNs$coVr^ZuZ!(m/^HqR.,9heAY:f("e
+;c?Xr<``C+>$G6;?XI5N@qB4aBPD6uDJsK6F*)SLH$XjdIt3-'KnbD?N/`m[P*;/tR$sM8T:r!T
+V5L;mXKA\1Za@0M\[oGe^VI_(`Q$!@bKS8XdF$Fmf%8R.g>(N@i8EVTjQ5OekiqBum-G&GmdKZ8
+nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTerdk*6s*t~>
+JcC<$PlLFUrVc`nr;6Njs7uZhDtiu!p%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V.:k\@/fOZEUL6X/W"oUnXQTSsu19Q^*btOH,9XM26n>K7SQ%I=$6`G'%e3
+@VBS!I#=2NOHG]iPl6mIQN!-LPkL:@Pl?s>QN!6GQ2m3EQ33D:P`u*0r/po?rfR)@!0d>Drfd>@
+p5\d+s,[5Arf6]5muRO1oT8[*/A8g6_Sa@4aN;WLcHjkbe'ut#f\5'7h;7)JioB(\k2tmll0@X%
+mI'H3nF?MK!V>s_p&Facp\jmdq>L0Nqu$<hq>0mcp\smap&F[aoDJ1Znc/+WmfMqEmJZAQlg!d7
+l2TrIkPjTFjlGM%irS/urnmh7hYu=3gtVh^IbEB*f@JO'eC;sqdF$=ecd'h\bfe2PaiMQD`l5p8
+_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I8Xf\\*WiE%sVl-DgUnjc[TqJ$LSt2C@S!ob4R$X,(
+Q'7AoOcYWbNfB!VMi*@JLkg_>KnP)2Jq8H&IsufoI!^0c!I8qhG7Je=FEDSEEH,r:Df0H0D#S2N
+C2*Z\!G?$DAH?=OraH+@?sm>K?=$q:>lS".>5_S*=BAT'<rZ2"<;fbq;ZBVm;#a>k:Adic9`@]^
+9)_E]8GPdR7f5^I7/0.B6KpcT>^1<k;K[$[K8<r-Db*WHH$Xjd:/+DZ:5+:Nkl:RAk)f1#r'LBM
+qaCHQr^QlWs%!,]r^qQ29MA/T:/=\_;,U=k<*!%$=BSg3>[:]D@:E_XAS5[jCM[m,E,fr@G'A4X
+I!pKpJqJc3Ll%(MO-#NgQ'[l,S"61FU84W`WN*&%YHY@?[^WfY]Y2(q_Sa@4aN;WLcHjnce'ut#
+f\5'7h;7)JioB+]k3(smlKdg'$170LnF?&>o(2MQo`Fj]p\ssfq>^<hqu6NlrUp/@s-3P6~>
+JcC<$PlLFUrVc`nr;6Njs7uZhD>3btp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V.:k\@/fOZEUL6X/W"oUnXQTSsu19Q^*btOH,9XM26n>K7SQ%I=$6`G'%dl
+6UF758k`#T:/4Ua;#=,h;"dZe:f1(drDE;cqbdAk#ZFW!;,C+e:f%$br_NDds%iGcr_NGgs%iPf
+r_NPokuR7QmoBHh<qo\a<\1r!^r"".`lQ9Fbg+P]dF6Urf@\g2gtgiFi8WeWjlY^hl07L"m-X60
+n*olHncA@Srq6<bs7cKerqZNhjSSlOrV?<brqHEcr:U*^s7?0Zs7--YrU0gUmHsl=!pf.:rosIH
+!9a@D!p/M(ro4%=iVqa9hqn@g!SlH/g4%`-f@SU)e^W*tda?Ihcd0n^c-4ASb/q`Ga2Z*;`5BI/
+_8*h#^:h1l]=PP`\@8oT[C!9HZE^X<Y-"h-X/`2!W2HPjV50o^U7n6PSt;LCS"#k7R$a5+Q'IPr
+P*(ieO,f3YN/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH3&;9rc\iqF`__HEcH)<E,TW3D/B2e!GZ?J
+BE;aXrac+@A,]pB@:3JM?X@&Er`oJ-!*]>(!a&N*r`9&!s&Aqqs&/korD<Mis%`Jdr_3;aqb$iZ
+r^ciTr'pTQoL/IAog7n/)_a''0-WVCdn*@f/NGRC5!MA$76*=f5!DP18a-3P<:Eo^<qAWT6N0@L
+7/o^T7fGpX8,u6\8pj9*9MJ5V:Jakb;H$Ln<`W:(=^#$7?!grI@Uit\B4u!pCi401EH?5FGBnL^
+I=Hd!K8#&9M2[FTOHPfmQ^F52SY)UMUnsugWiW>+Yd:^F\%0)_]t_A"_o9X:aihoRcdC.heCN7(
+g=k?<hVd>Oj5f=akNM0qlg3sEmI'H4naZ2@oCW%T!quB_rqQNhs8)Zjrqu`np&9OBPlH7~>
+JcC<$PlLFUrVc`nr;6Njs7uZhs7^R-p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX0^V.:k\[SuQZEUO7X/`+qUnaWUSt):;Q^*euOH5BZM26n?K7SQ%I=$9bGBJ"C
+E-?S^OJU%6_8F40`lH0Bb00b-qoeo]!6tMgps8iapX/rf"4>KBci22uc-4DSaN)9=`59@+^](nK
+]XthhrOr3Cs1A9A!P?#C^&>>8[K!W4Zi7?0[JmT7[J[E3[I^in\,Wu5\,Wu;\,Efk^;%M$`5Td<
+b0/&Td*^:ke^rF+g=tH?hr*JRj5f@bkNV6rlg4!*mdKW6nac8Bo^r.U!quB_r:p<frVGONr;-Bf
+qY:'as7Z?_s7H?_r:9mXs7$$Vs6fpSrp9[Ns6BUJ!pJh1roOIIjQ,@]io8qrhuV`lrnRV1g]#n:
+g"=p.f%&=#eC2jndEp5=c>LnNbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^NTNZa6sBYck43
+XfSS'Wi;qpVl$;dUnXQVTV%gISXc1=R[KP1Q^3o$PEM)kOH5H_NJrgSMM[1GLPCP;KS+o/JUi9#
+IXQWlH[:!`GlDmsG'.nKF)l8?E,TZ4DJa4hCB80arb)=FB)Z?BA7PUJ#@V"J?XI,G?2e+/>6%k*
+=TV],=8l8#<W?%s;u]bq;>j>k:]F2f:&[ic9D_?\8cD9V8,PjS7J'"C6hNe15o>r(Jq.crJcCOh
+QrI.YUSOfa>$+g1<j&Ods80J0^?<9)62X(J6i0:O7K5jU8,l*[8cD<_92,=ZHqmI6:f1+h<)lt"
+='8[0>[1TB?t!MSAS,RgC27X'DfKf>FEVkRH@1-jJ:`H/LP^nINK93bPa.T&S"-(BTq\?[Vl?\t
+Y->1;['mHS]=bkm_8=.0a2lEHbg+P^daZdtf@em4h;-uHiSrnYjlYail0@U$m-a?2nF?MK#4qK[
+p%J+RrV6Egs8)Zjrqucoo_sFAPlH7~>
+JcC<$PlLFUrVc`nr;6Njs7uZhs7^I*p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX0^V.:k\[SuQZEUO7X/`+qUnaWUSt):;Q^*euOH5BZM26n?K7SQ%I=$9bGBJ"5
+?t<tkG(Ys>OckolPa.L1PlR'BP5pjHQ1C7?QhcpIQ1pUEPld26PQ$aDOo1C@Oo(:APPp[BP5pR?
+NV8D)O8b71O6r#/O84n6NrY4=O"nA`_8=.0a2lEHc-F\`daZh!f@em4h;7&IiT&tZk2tjkl0@U$
+m-X60n*ol<o(2MGrq-?dp\4U\s7uWiiqrZMrV?<brqHHdqt:!]s7?0Zs7--YrpTmTs6]gPs6K^M
+rojLJkNDj,#Nb%-j5].YiVqa9hqn@g!SlH/g()fgf@SU(e^W*tda?Ihci24-c-4ASb/q`Ga2Z*;
+`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^X;Y-"h-X/`2!W2HPjV50o]TqS-OSt;LCS"#k7R$a5+
+Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5K7\Z)J:E#rI=-BfH?jc7G7Je=FEDSEEH,r9Df0H0D#S2N
+C2*Z\!G?$DAH?=OraH+@?sm>K?=$q:>lS".>5_S*=BAT'<rZ2"<;fbq;ZBVm;#a>k:Adic9`@]^
+9)_E]8GPdR7f5^I7/0.B6KpcQEE?RU?>Es+Ao)EW9Qk],IXOsc92SH<KBE42O62Pt62X(J6i0:O
+7K5jU8,l*[8cD<_92,=ZHqmI6:f1+h<)lt"='8[0>[1TB?t!MSAS,RgC27X'DfKf>FEVkRH@1-j
+J:`H/LP^nINK93bPa.T&S"-(BTq\?[Vl?\tY->1;['mHS]=bkm_8=.0a2lEHbg+P^daZdtf@em4
+h;-uHiSrnYjlYail0@U$m-a?2nF?MK#4qK[p%J+RrV6Egs8)Zjrqucoo_sFAPlH7~>
+JcC<$PlLFUrVc`nr;6Njs7uZhs7^C(p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX0^V.:k\[SuQZEUO7X/`+qUnaWUSt):;Q^*euOH5BZM26n?K7SQ%I=$9bGBJ!q
+5sn%27nZWQ:/=\^;#=,h;"dZe:f1(dr_`>br)*Jl"B/2r;,I6h!DlSj:B"&d:&n)c:B"&d;#a>i
+:Amrg:?>OC<Ua&a<VKMo<W,rQ^;%M$`5Td<b0/&Td*^:ke^rF+g=tH?hr*JRj5f@bkNV6rlg4!*
+mdKW6nac8Bo^r.U!quB_r:p<frVGONr;-BfqY:'as7Z?_s7H?_r:9mXs7$$Vs6fpSrp9[Ns6BUJ
+!pJh1roOIIjQ,@]io8qrhuV`lrnRV1g]#n:g"=p.f%&=#eC2jndEp5=c>LnNbKJ&MaN2EA`Pod5
+_SX.)^V@Lr]Y(kf\[f5Z[^NTNZa6sBYck43XfSS'Wi;qpVl$;dUnXQVTV%gISXc1=R[KP1Q^3o$
+PEM)kOH5H_NJrgSMM[1GLPCP;KS+o/JUi9#IXQWlH[:!`GlDmsG'.nKF)l8?E,TZ4DJa4hCB80a
+rb)=FB)Z?BA7PUJ#@V"J?XI,G?2e+/>6%k*=TV],=8l8#<W?%s;u]bq;>j>k:]F2f:&[ic9D_?\
+8cD9V8,PjS7J'"C6hNe15o;=0.4RPC-Bp5C3\`HV5X@b+3B/u^5"SB/s8,d_<<6-#r)WMWr'L?L
+qaCHQs$lrWs%!,]r^m2a9`@b6:/=\_;,U=l<E<.%=]np5>[CcF@:E_XAnPdlCM[m,EH6/CG'A4X
+I!pKpJqSl6M2I7OO-,TiQ'[l-S=Z@HU84ZaWN*&&Yd(OA[^WfZ]Y;.s_SjF6aND]McHjndeC<($
+g"P3:h;@/LioB+]k3(smlKdg'mdKW6nc&(`oCV_Kp@e7Zq#C0iqY^6ir;QZerdk*6s*t~>
+JcC<$PlLCTrr)ior;6Njs7uZhs7ZNerq11$oCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX0^V7@l\[T#SZEUO7XK&4sV5'`WSt):<Q^*euOcPK\MMR"@K7\W'I=$9bGBJ"J
+DfL&OMjpoo_Sa:0`lH0Bb00b-qoer^s3:Pgq9Sucp<iie"4>KBci22uc-4DTaN)<=`59@+^](nK
+]Xtegr4W-Cs1A6@!5&-Aqm6I5['d=?[/73.[/@?.ZiIN*[e$s.[f!T7[f*Z8[f*Z8[f!W7\1t_4
+_8=.0a2lEHbg+P^daZdtf@em4gtglGiSrnYjlYail0@U$m-X60n*ol<o(2JFrq6<b!;HEds7uWi
+i;<HKrV??crqHEcr:U']s7?3[s7--YrU9dSs6]gPs6B[MrTOCIkNDj,!TiDAj8\*=iVqa9hqn@g
+$JaCig=b03f@SU(rmZDGda?Ihcd'h\c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[C!9H
+Z*:I9Y-"h-X/`2!W2HPjV50l\TqS-OSt;LCS"#k7R$a2)Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5
+K7\Z)J:E#rI=-BfH?jaZGBS+OFE@k2EcH)<Df9N2D/B2e#&7jcBP1sirac+@A,]pB@:3JM?X@&E
+r`oJ-!*]A)s&f;&r`9&!s&Aqqs&/korD<Mis%`Jdr_3;aqb$iZr^ciTr'pTQoL/IAoKqh/(4q!R
+D/3luA6W9.U8Fcd=B\j.>ZS#0jo>7ls1[X1pd+gErBpKNr^HiVrC;<-8P)NH91qrQ9hnJ\:f1+h
+;cHat='/U.>?kH??XR>PA7]@dBkhF#DJsN8FEMePH@('hJ:W?+L51VCN/is]P*D6!R@B_<TV8-V
+VPgGpXfen5ZaI6O\\#Mg^VRe*`Q-'BbK\>ZdF-Opf%8U/gYL]Ci8N\UjQ>Ufl0/iGlg4$,n*fc9
+o()DDo_%nNp@nO\!r;]hr;6KkrVcBfJcCu7J,~>
+JcC<$PlLCTrr)ior;6Njs7uZhs7ZNerq1!toCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX0^V7@l\[T#SZEUO7XK&4sV5'`WSt):<Q^*euOcPK\MMR"@K7\W'I=$9bGBJ"J
+?=IP_F*rh0OHG]hPQ$gFQ2d'MPE_=.PQ-mHQ1L=@QgU1>Pld26PQ$aDOo1C?Oo1@BPPgU@PPgC=
+NW5%=NVSV-O8k=2O7SG5O8P(>O8Y.?O8b4AO,j't0ttE=_SjF6aND]McHjndeC<($g"P39h;@/L
+ioB+]k3(smlKdg'mI'H3nF?)?oCMVRp&F^cp\agdq>L0Jqu$<hq>9sdp\smap&=U`oDS7[nc/+W
+n,MhUmJcJPlN$5KklU)3kPjTEjlHF$s5F%;rnmh7hYu=<gtUQ:g"G$0f@JLOe:,lpdF$=ecHa\Z
+bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R*DYct=6Xf\\*WiE%sVl-DgUnaZXTqJ$L
+St2C@S!ob4R$O#&P`q8nOcYWbNfB!VMi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$FOWG'.qLF:*)0
+EH,r9Df0H0D#S2SC2%?pB4kiUAH?=OraH+@?sm>K?=$q:>lS".>5h\)=T;J%<rZ2"<;fbq;ZBVm
+;#a>k:Adic9`@]^9)_E]8GPdR7f5^I7/0.A6L$iP?X@)H?<gK.9hohVI!g?::/+AY:5+>^s8%f=
+OSD->6N':L7/fXT7f>i+84cBF8kVfN9heAY:f("e;c?Xq<``C+=^,-:?=.)L@Us%^BPD3sD/O93
+EccGJG^=^bIXm!%KSG8=MN!RVOckroR$jG6StMdPUo(&iX0&P/Z*UjH\@K5a^;%M$`5Td<b0/&T
+d*^:ke^i@*g=tH>hr*JQj5f@bkNV4DlKdg(mdKW6nac8BoCV_Kp@e7Zp]C9fqY^6ir;HTdrdk*6
+s*t~>
+JcC<$PlLCTrr)ior;6Njs7uZhs7ZNerq1!toCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX0^V7@l\[T#SZEUO7XK&4sV5'`WSt):<Q^*euOcPK\MMR"@K7\W'I=$9bGBJ"J
+5smt.84ZEM:/4S];#=,h:]aEh;#3uc:]OAc;#4&g;ZK_n;#sKhrD*>fqb@,eq+gobqb[;gr(d5e
+r_E8i"'&B%<UWuT<V'5m<E</t<W?)"<W,qu<Vf`N^;%M$`5Td<b0/#ScdC1jeCN7)g=tE=hr*JQ
+j5f=akNM0qlg4!*mdKW6nac8BoCW%Ts7QHer:p<frVGILr;-BfqtU0brq?9_rq-6^rUU!Ys7$!U
+s6fpSrp9[N!:'OI!pJh1roO7CjSn3>iW.s:huV`lrnRq:gY1B7g"=p.f%'cLIac`mdEp4bcHXVX
+bKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^NTNZa6p@Yck43XfSS'Wi;qpVl$;dUS=HUTV%gI
+SXc1=R[KP1QBd`"PEM)kOH5H_NJrgSMM[1GLPCP;KS+o/JUi9#IXQWlH[:!`G^"@TF`heJ$?L6-
+EH#i7DJj<-rbD^QBkV0mB4h-S!G#^>@L$=L?sd8I?=!P8s'#J,r`T8's&]2#s&K(urDW_os&&_k
+s%iYir([/ar_*,\r^m)[q+(?Pr'g6Gpd=[?l9Q18.6g'_4uG,O1cmrf6:Epq3&j)c8PA1FqGcc\
+!EN5"<qnuY6N':L7/fXT7f>i+84cBF8kVfN9heAY:f("e;c?Xq<``C+=^,-:?=.)L@Us%^BPD3s
+D/O93EccGJG^=^bIXm!%KSG8=MN!RVOckroR$jG6StMdPUo(&iX0&P/Z*UjH\@K5a^;%M$`5Td<
+b0/&Td*^:ke^i@*g=tH>hr*JQj5f@bkNV4DlKdg(mdKW6nac8BoCV_Kp@e7Zp]C9fqY^6ir;HTd
+rdk*6s*t~>
+JcC<$PlLCTrr)ior;6Njs7uZhs7ZNerq1.#oCDJBnF,i6mHj3)l07Eok2bR^iS`VLgtUQ8f@JI#
+dEp4bbfe,L`l5g2^V7@m\[])TZa$a:XK&7tV50iYSt2@=R$O##OcPN]MM[+CK7\W'I=-?dGBS(L
+CN"?AKTW(G_SX40`Q-'Ab5TWbbQ#`abP]Qac2Q#`ci)5adJ_JqdEp7drlu5&bfn8Pa2Z'9_SO%&
+^:h4m]=Y_grOr3C!5&3@!5&'?!4DX0!jf8@oX"J&!4D[1!4DF,q6p@4o!\V-p9uQe^r"".`lQ9F
+bg+M\dF6Uqf@\g2gtgiEi8N_VjlY^hl07L!m-X60n*olHncA@Srq6<bs7cKerqZQipA=U^oDAI^
+rV??crqHEcr:U']s7?3[s7--YrU9dSs6]gPs6B[MrTORNkND!ijlPS&it^S4iS`YOhqm2Fgt^Z<
+g=b-2f@SU(rmV8'da?Ihcd'h\bl5e'b/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT['R*EZ*:I9
+Y-"h-X/`2!W2HPiUnjc[TqS-OSt;LCS"#k7R$X,(Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5K7\Z)
+J:E%JS:#[0H?jaZGBS-.F9Q`+EH,r9rb`9aChmg$C2%?pB4kgfARo=]raGn:@/aO5?3":1>lS".
+>5h\)=T;J%<rZ2"<;ohr;ZBVl;#a>k:Adic9`Ic_9)V?\8GPdR7f5^I7/0.A6L$i:D>n;]BP(gX
+Sti*ZVH[5+?<UF5jT#4ms1J<Ek.gaYr'LBMqaCEPs$luXs%!,]r_!2`IS<I1:/=\_;,U=k<)lt#
+=BSg3>[:ZC?t*VVAS5[jCMRd)E,fr@Fa&(VH[U?nJV/Z2Ll%%KNfT?eQ'Rf*S"6.DTqeH^W2co#
+YHY==[C3TU]Y2(q_Sa@4aN;TJc-F\`e'uq"f\,!6h;7&IiT&t[k2tmll0@X%mI'H3"n;'Qo(2MQ
+o`Fj]p\ssfq>^<hqu6NlrUg)?s-3P6~>
+JcC<$PlLCTrr)ior;6Njs7uZhs7ZNerq0proCDJBnF,i6mHj3)l07Eok2bR^iS`VLgtUQ8f@JI#
+dEp4bbfe,L`l5g2^V7@m\[])TZa$a:XK&7tV50iYSt2@=R$O##OcPN]MM[+CK7\W'I=-?dGBS(L
+>[V)VE-?kpOHG_)PQ-mHQ2[$CP5pjHQ1L=@QgL(@Q'@Jrrf[2ArK@)@r/q&Dr0$l>!0-c4qi1B2
+plGH:n;mC,!0?]4!0@)?qN!/A^r"".`lQ9Fbg+M\dF6Uqf@\g2gtgiEi8N_VjlY^hl07L!m-X60
+n*olHncA@Srq6<bs7cKerqZQipA=U^oDAI^rV??crqHEcr:U']s7?3[s7--YrU9dSs6]gPs6B[M
+rTORNkND!ijlPS&it^S4iS`YOhqm2Fgt^Z<g=b-2f@SU(rmV8'da?Ihcd'h\bl5e'b/q`Ga2Z*;
+`5BI/_8*h#^:h1l]=PP`\@8oT['R*EZ*:I9Y-"h-X/`2!W2HPiUnjc[TqS-OSt;LCS"#k7R$X,(
+Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5K7\Z)J:E%DG^OjaH?jaZGBS-.F9Q`+EH,r9rb`9aChmg$
+C2%?pB4kgfARo=]raGn:@/aO5?3":1>lS".>5h\)=T;J%<rZ2"<;ohr;ZBVl;#a>k:Adic9`Ic_
+9)V?\8GPdR7f5^I7/0.A6L$iM?X6oA>$>'&GBnLaInrg6;c6>DjT#"9k)fF*r'LBMqaCEPs$luX
+s%!,]r_!2`IS<I1:/=\_;,U=k<)lt#=BSg3>[:ZC?t*VVAS5[jCMRd)E,fr@Fa&(VH[U?nJV/Z2
+Ll%%KNfT?eQ'Rf*S"6.DTqeH^W2co#YHY==[C3TU]Y2(q_Sa@4aN;TJc-F\`e'uq"f\,!6h;7&I
+iT&t[k2tmll0@X%mI'H3"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?s-3P6~>
+JcC<$PlLCTrr)ior;6Njs7uZhs7ZNerq0ssoCDJBnF,i6mHj3)l07Eok2bR^iS`VLgtUQ8f@JI#
+dEp4bbfe,L`l5g2^V7@m\[])TZa$a:XK&7tV50iYSt2@=R$O##OcPN]MM[+CK7\W'I=-?dGBS(L
+6pa7/7n?9K:/4S]qbd8fpJ:<Uqb[>kr_iepr)!Jk:]4&f:]!oe:\mic:\mlf:]*ue:]*ue<Vohn
+<Uj,V<V]Yq<V]\m<<6-#p/W]Y^r"".`lQ9Fbg+M\dF6Uqf@\g2gtgiEi8N_VjlY^hl07L!m-X60
+n*olHncA@Srq6<bs7cKerqZQipA=U^oDAI^rV??crqHEcr:U']s7?3[s7--YrU9dSs6]gPs6B[M
+rTORNkND!ijlPS&it^S4iS`YOhqm2Fgt^Z<g=b-2f@SU(rmV8'da?Ihcd'h\bl5e'b/q`Ga2Z*;
+`5BI/_8*h#^:h1l]=PP`\@8oT['R*EZ*:I9Y-"h-X/`2!W2HPiUnjc[TqS-OSt;LCS"#k7R$X,(
+Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5K7\Z)J:E$36[X6,H?jaZGBS-.F9Q`+EH,r9rb`9aChmg$
+C2%?pB4kgfARo=]raGn:@/aO5?3":1>lS".>5h\)=T;J%<rZ2"<;ohr;ZBVl;#a>k:Adic9`Ic_
+9)V?\8GPdR7f5^I7/0.A6L$i<5X.F24q0Y35!VA#6od=g5<_8&jT#!SoMtliq,IJs<EAr^r'LBM
+qaCEPs$luXs%!,]r_!2`IS<I1:/=\_;,U=k<)lt#=BSg3>[:ZC?t*VVAS5[jCMRd)E,fr@Fa&(V
+H[U?nJV/Z2Ll%%KNfT?eQ'Rf*S"6.DTqeH^W2co#YHY==[C3TU]Y2(q_Sa@4aN;TJc-F\`e'uq"
+f\,!6h;7&IiT&t[k2tmll0@X%mI'H3"n;'Qo(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?s-3P6~>
+JcC<$PlLCTrVc`nrVQWks7uWg!Vc<eol'Koo()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1?4f$r3t
+dEg+^bK7iF`P]R.^V%1h\@/fOZ*:C5Wi;nnUnXQTSXZ(8QBdYsO,f0WM2-h=K7SQ$I!U'^G'%eF
+DK0lLMOCTj_Sa=2a2uKHbKKk,rlb;brltGfps8ocp!Nce"4>KBci23!c-4DTb/hT@`59@+^V9]\
+"2)7Y]`#PC]`5VC\cKFUpq?^7s0_^1rNcO1Zi%-+Zh:[*[Ht=&[C5n?!k,MFpU;uf\$rf\_8=.0
+a2lEHc-F\`daZh!f@em4h;-uHiSrnYk2tjjl0@U$m-X60n*ol<o(2MGrq-?dp\4X]rqZQip\XR[
+o_\U`rV?<brqHEcr:U*^rq$*Zs7--YrU9dS!:BaO!pf.:rosIH!9a@Ds5a7Aro8IeiSi_Qhqm5G
+h;$c>g=k64f[na+e^W*te'cXkd*L"_c-4ASb/qcHaN)<>`Pf[2_SO%&^V7Co]Xtbc\[])V[C!9H
+ZE^X<YHG"0XK/A$WMl_lV50o^U7n9RT:VXFS=?"9R$a5+Q'IStP*1rhO,o<\N/W[PM2@%DL5#nd
+KS+o/JUmb"rgXRIH?sj]GB\4QF`__HEcH)<DuOVcD/=!'C2.HrBP1siAS#C_A,]p<@:9(As'>\2
+r`oJ-!*]A)s&f;&r`9&!s&Atrs&/kor)!Dhs%`Jdr_3>bqb$fYr^ciTr'pTQoL/IAoKqh/&Sbuj
+AnYmmAu2G0>?P'5=g"mes8Te4]`,VD^?<62^AU@q6N':K7/o^U7f>jW8,u6\8c_RYr_7l;:Jakb
+;H$Lo<`W:)=^#'8?!grI@Uit\B4u!pCi401EH?5FGBnL^I=Hd!K8#&9M2[FTOHPfmQ^F52SXuOL
+UnsufWiW>+Yd1UD\%0)_]t_A"_o9X:aihoRcd:(geCE1'g=k?<hVd>Oj5f=akNM0plg4!*mdKW6
+nac5OoCW%T!quB_rqQNhs8)Zjrqu`np&9OBPQ-.~>
+JcC<$PlLCTrVc`nrVQWks7uWg!Vc<eok3pgo()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1?4f$r3t
+dEg+^bK7iF`P]R.^V%1h\@/fOZ*:C5Wi;nnUnXQTSXZ(8QBdYsO,f0WM2-h=K7SQ$I!U'^G'%eF
+?=@D]Ed`_.Oco^-qipl>rfmDIns99AmZms?Pa%C2P5LI?P5LI?OoU^EP4t1<NVJJ.NVeb3O8k=+
+Nrb9%q2kT:plGN;NrG(n^VRe*`Q-'BbK\>ZdF-Opf@S^0gYL]Ci8N\UjQ>UfkiqBum-O--n*fc9
+o()DEo`"Lbp@n=[q#:*gqY0mYr:KmbqYg6dq#:$epAFU`o`"I\o)J7[nGVhUmJuYQliQM<lMg&J
+kQ'fFk5XNCjSn1gio/kSi8<DJh;-l@gY1B7f\"g-f%&:"e'lamdEp4bcHXSVbK@rKaN2EA`Pod5
+_SX.)^V@Lr]Y(kf\[f5Y[^EKKZa-j?Yck43XfSS'Wi;qpVPU)aUS=HUTV%gISXc1=R@'A.QBd`"
+PEM)kOH5H_NJrgSMM[1GLPCNiKnP)2Jq8IHp\Ff5&UShMH$FOWG'.qLFE;JBEH#jqD@gZ$CMR["
+BkV0mB4b^dA7T3L@KBnFra5\3!+#S/s'#J,r`T8's&]2#s&K(ur_rhps&&\js%iYir([/as%E5]
+rCQuZq+(?Pr'g6Gpd=[?l9YGSs&fM,=]e[PJ,W1G9iFlAK]E+,O6;T)O8VBB6N':K7/o^U7f>jW
+8,u6\8c_RYr_7l;:Jakb;H$Lo<`W:)=^#'8?!grI@Uit\B4u!pCi401EH?5FGBnL^I=Hd!K8#&9
+M2[FTOHPfmQ^F52SXuOLUnsufWiW>+Yd1UD\%0)_]t_A"_o9X:aihoRcd:(geCE1'g=k?<hVd>O
+j5f=akNM0plg4!*mdKW6nac5OoCW%T!quB_rqQNhs8)Zjrqu`np&9OBPQ-.~>
+JcC<$PlLCTrVc`nrVQWks7uWg!Vc<eok3pgo()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1?4f$r3t
+dEg+^bK7iF`P]R.^V%1h\@/fOZ*:C5Wi;nnUnXQTSXZ(8QBdYsO,f0WM2-h=K7SQ$I!U'^G'%eF
+5smt.8OuKM:Jgpcr_W8`nkf0[!)ieps&/em!DlSj:B"&d:B+,c:B"&d;#a>i:Amuc:AIoh<qB>d
+<om<^<)r`pr`&ksqGoFQ<`W58_8=.0a2lEHc-F\`daZh!f@em4h;-uHiSrnYk2tjjl0@U$m-X60
+n*ol<o(2MGrq-?dp\4X]rqZQip\XR[o_\U`rV?<brqHEcr:U*^rq$*Zs7--YrU9dS!:BaO!pf.:
+rosIH!9a@Ds5a7Aro8IeiSi_Qhqm5Gh;$c>g=k64f[na+e^W*te'cXkd*L"_c-4ASb/qcHaN)<>
+`Pf[2_SO%&^V7Co]Xtbc\[])V[C!9HZE^X<YHG"0XK/A$WMl_lV50o^U7n9RT:VXFS=?"9R$a5+
+Q'IStP*1rhO,o<\N/W[PM2@%DL5$"gKS+o/JUiiEPQ!o]H[:!`G^"@TF`heJF)l8?E,Y_n&8c6!
+CMITuBP;$kAn>OaA7PUJ!F]C8?iOF4?2e+/>6%k+=oVV(=8l8#<W?%t;u]bq;>a8j:]F2f:&[id
+9D_?[8cD9V8,PjS7J'"C6hE_15m'>85!Am-$9LUE3B9&Y5<_\2j8T*Zpf-odrD`JjrB^?JrBpHM
+s$crWrC?lY!(m/^!D?,c9n,o6:f("e;c?[s<``F,>$P<<?XI5N@qB4aBPD6uDJsK6F*)SLH$Xjd
+It3-'KnbD?N/`m[P*;/tR$sM8StVmSV5L8lXKA\1ZEq!K\[oGe^VI_(`Q$!@bKS8Xd*^=le^rI-
+g>(N@i8EVTjQ5Oekiq?tm-O--n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;HTerdk*5s*t~>
+JcC<$PlLCTrVc`nr;6Nj!;ZTg#5@ibp%@tKrpj[knF,f4m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V.:k\@/fOZEUL6X/`(pUnXQTSsu19Q^*btOH5?YM26n>K7SQ%I=$9bGBJ"J
+EGflDK9;tAb/D6<a2n8&rQ,&^rlb;brltGfq9T#do[3]e"4>KBci),tc-4DSaN)9<_ns7*^](nL
+]Xteg]`,VC]E#SB\cBA;^&PbEZh^s2Za@*GZh^p(Zh:[*[Hb3p[fEl1[k#50_SjF6aN;WLcHjnd
+e'ut#f\5*8h;7)JioB+]k3(sml0I^&mI'H3nF?MK!V>s_p&F^cp\jmdq>U6cqsXIUqu$<iq>0mc
+p\smap&F[aoDJ1Znc/+WmfMqEmJZAQlg!d7l2TrIkPjWDjT+B@irS/urnn1AhVR)EgtUT;g=b-X
+f59*heC;sqda?Ihcd'h\bfe2PaiMQDa2Z*;`5BI/_8*h#^:h1l]=GJ^\$i`Q['R*EZ*:I9Y-"h-
+X/`2!Vl-DgUnjc[TqS-OSt;LCS!ob4R$X,(Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5qu?Vb#^^lD
+H$FOWG'3e+"`n^(EH#jqD@gZ$CMR["BkV0mAnGUcA7T3L@KBnFra5\3!+#S/s'#J,r`T8's&]2#
+s&K(ur_rhps&&\js%iYir([/ar_*,\r^m)[q+(?Pr'g6Gpd=^@kX#5_$YX*]@:!2B=Bo!1Y2TB]
+]tF6UrkA-As1\-?s1\M!r'L?Lr'^NQs$lrW!_>mSr^qQ29MJ5V:/=\_;,^Cm<E<.&=]ns6>[CcF
+@:EbYAnPdlCM[m,EH6/DG'A4XI!pKpJqSl6M2I7OO-#NhQ'[l,S=Z@HU84ZaWN*&%Yd(OA[^WfY
+]Y2(r_SjF6aN;WLcHjnde'ut#f\5*8h;7)JioB+]k3(smlKdg'"RYXGnF?MK!V>s_o`Fj]p\ssf
+q>^<hqu6NlrUp/@s-*J5~>
+JcC<$PlLCTrVc`nr;6Nj!;ZTg#5@ibp%@tKrpj[knF,f4m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V.:k\@/fOZEUL6X/`(pUnXQTSsu19Q^*btOH5?YM26n>K7SQ%I=$9bGBJ"J
+EF33hDfp\mQB@>oP*>m0plkW?r0@>Lp6P]Em[!m<!gJn4rf[5Br0$r>rfR8Fqi^`<s-!A?r/LN2
+q2P93q2bQ;kE#A!!0?i8/&/p;`5Td<aihoRcdC1ieCN7(g=tE=hVd>Oj5f=akNM0plg4!*mdKW6
+nc&([oCW%Ts7QHerV6BfrqcEen,2kUr;-EgqY:'arq?9_s7H?_r:9mXs7$!U!q,ICrTjUOlK\B5
+s6'IGroX7B!9F.>!TN);i!\H!hVI#CgY:H9g"?;UF4SmkeC2jodF$=ecHa\YbKJ&MaN2EB`l5p8
+_ns:,^q[Xu]tD"i\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%rVl$;dUnaZXTqJ$LSt2C@R[KP1Q^3o%
+P`q8nOcYWbNfB!VMi*@JLkg_>KnP*No_%tRq>GODH[:!`G^"@TFoHIdF)l8?E,Y_n&8c6!CMITu
+BP;$jAn>OaA7PUJ!F]C8?iOF4?2e+/>6%k+=oVV(=8l8#<W?%t;u]bq;>a8j:]F2f:&[ic9D_?\
+8cD9V8,PjS7J'"C6hNe05n-q!=&`*r;,9q\;c-8CiW&q=s,d)<k`Gh*s$?QLrBpKNr^HiVrC6o[
+8P/nRHqR.-9hnGZ:f("f;cHat<`iL->?kE>?XR;OA7]@cBPM=!DJsN8FEMbNH$XjdIt3-(L51VC
+N/`m[P*D5uR$sP:T:r!TVPgDnXKA_3Za@0M\[oGe^VRe*`Q-'AbKS8XdF-Lnf%8R.gYCWAi8EVT
+jQ5OekiqBum-FlBmdKZ8rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTerdk*5s*t~>
+JcC<$PlLCTrVc`nr;6Nj!;ZTg#5@ibp%@tKrpjXjnF,f4m-O''l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V.:k\@/fOZEUL6X/`(pUnXQTSsu19Q^*btOH5?YM26n>K7SQ%I=$9bGBJ"J
+EC3,`7Rp-I;,C+e;#X;l;"IKT;#*ug;Z9Sp;Z0Gn:f%!ar_NGes%iGcr_NAe!)NMfr_N>b!`N&t
+q,RDpnQ#Hej&PhS!*/_n/&/p;`5Td<aihoRcdC1ieCN7(g=tE=hVd>Oj5f=akNM0plg4!*mdKW6
+nc&([oCW%Ts7QHerV6BfrqcEen,2kUr;-EgqY:'arq?9_s7H?_r:9mXs7$!U!q,ICrTjUOlK\B5
+s6'IGroX7B!9F.>!TN);i!\H!hVI#CgY:H9g"?;UF4SmkeC2jodF$=ecHa\YbKJ&MaN2EB`l5p8
+_ns:,^q[Xu]tD"i\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%rVl$;dUnaZXTqJ$LSt2C@R[KP1Q^3o%
+P`q8nOcYWbNfB!VMi*@JLkg_>KnP)=O,oBbPPmiSH[:!`G^"@TFoHIdF)l8?E,Y_n&8c6!CMITu
+BP;$jAn>OaA7PUJ!F]C8?iOF4?2e+/>6%k+=oVV(=8l8#<W?%t;u]bq;>a8j:]F2f:&[ic9D_?\
+8cD9V8,PjS7J'"C6hNe05mBG53&s#]3W:u?5!;&#iW&pXpf-ufqc*>j"&r8d62X(J6i9@O7K5jU
+7fl4Q8cD>092&&S:/4S]:f1.i<)lt"=BSd2>[1TB?t!MTAS,RgC27X'DfKf>F`qtSH@1-jJ:`H/
+LP^nINK90aPa.T&R[ftATq\?[Vl?\tXg#(:['mHS]"G_k_8=.0a2lBGbg+P^daQ^sf@\g3gtgiF
+i8WeXjlYail0@U$lic_Dn*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcEgJcCr6J,~>
+JcC<$PQ1=TrVc`nr;6Njs7uZhF8,D%p%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX0^V.:k\[T#RZEUO7X/`+rUnaWVSt):<Q^*euOH5B[M26n?K7\W&I=$9bGBJ"J
+EGTW=I#FAnc,7K>aN2NGao9?]b5TT`bl5ldcM5`bd.>Wgda?Ihcd2U9'[=kGbK.`C`5BI.^q[Us
+]tCth]Y+6Wrk/6Brji6E]Y2"kr4W*B!5837r3ZI0pTj\&os=_,p9jt1rjMj7!OfE7[f<f:[f3`>
+[^W]R\$l1C34?<3_Sa@4aN;WKc-F\`e'uq"f\,!6h;7&IiT&tZk2tjkl0@U$m-a?2nF5u=o(2MG
+p%A%Pp\4X]s7uZjq"sIVp&"^arV?<brqHEcr:U*^s7?0Zs7--YrU0gUmHsl=!pf.:rosIH!9a@D
+!p/M(ro4%=iVqa9hqn@g!SlH/g&]mZrmq>)e^W*tdf.X&d*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#
+^:h1l]=PP`\@8oT[C!9HZE^X<YHG"0XK/A#W2HPjV50o^U7n9RT:VXFS"#k7R$a5+Q'IStP*1rh
+O,o<\N/W[OM26qAL5#I'qjd\4"aP?:GBS-.F9Q`+EH,r9rb`9aChmg$C2%?pB4baeARo=]raGn:
+@/aO5?3":1>lS".>5h\)=T;J%<rZ2"<;ohr;ZBVl;#a>k:Adic9`Ic_9)_E\8GPdS7f5^I7/0.A
+6Kg`8@gHFH>@1cB=]_carrKgGq7ZgBpqQdAp:pU@qa19LqaCEPs$luXs%*/]s%<;aIS<I1:/=\_
+;,U=k<)lt#=BSg3>[:ZC?t*SUAS,UiC27[(DfKf>Fa&(VH[U?nJV/W1LP^nINfT<cPa.W(S"-(B
+TqeE\Vl?`!Y->1;['mKT]=bkm_8=.0a2lEHc-FY_daZguf@em4h;-uHiSrnYk2tjkl0@U$mI'H3
+$h3]Wo(2JFp%A%Pp\jmeq>^<hqu6NmrUg)?s-*J5~>
+JcC<$PQ1=TrVc`nr;6Njs7uZhDYNkup%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX0^V.:k\[T#RZEUO7X/`+rUnaWVSt):<Q^*euOH5B[M26n?K7\W&I=$9bGBJ"J
+EF!!aCNFlYQB@;mr0.,Crfd5D!1!MKs-NGFrg3&=s-3YMPEZ!/r/pr@qN:Q9rf[>Fr0.)B!0-r9
+qi1H2q2P93q2bN:oT'!6rf@)>!KW9>O8k:AO8b4EO-#E`OH9:#3000:_Sa@4aN;WKc-F\`e'uq"
+f\,!6h;7&IiT&tZk2tjkl0@U$m-a?2nF5u=o(2MGp%A%Pp\4X]s7uZjq"sIVp&"^arV?<brqHEc
+r:U*^s7?0Zs7--YrU0gUmHsl=!pf.:rosIH!9a@D!p/M(ro4%=iVqa9hqn@g!SlH/g&]mZrmq>)
+e^W*tdf.X.d*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHG"0XK/A#
+W2HPjV50o^U7n9RT:VXFS"#k7R$a5+Q'IStP*1rhO,o<\N/W[OM26qAL5#3io^qhNq"af3s*=io
+G^"@TFoHIdF)l8?E,Y_n&8c6!CMITuBP;$jAn>OaA7PUJ!F]C8?iOF4?2e+/>6%k+=oVV(=8l8#
+<W?%t;u]bq;>a8j:]F2f:&[id9D_?\8c;3U8,YpT7J'"C6hE_/62sjh;G^+f<)QOdL#E"2O8Y1;
+O8+h:O7\P5O8D9C6i0:N7K5jV8,l-[8cME_97BQ/9hnJ\:f1+h;cHat='/U/>?kH??XR>PA7]@d
+BkhF#DJsN8FEMePH@('hJ:W?+L51VCN/is]P*D6!R@B_<T:r$UVPgDoXfen5Za@0N\\#Mg^VRe*
+`Q-'BbK\>YdF-Opf%8U/gYL]Ci8N\UjQ>Ufl07L!m-X60mgJXTo()DDo_%nNp@nO\s7u]kr;6Kk
+rr)KgJcCr6J,~>
+JcC<$PQ1=TrVc`nr;6Njs7uZhCA7Gqp%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX0^V.:k\[T#RZEUO7X/`+rUnaWVSt):<Q^*euOH5B[M26n?K7\W&I=$9bGBJ"J
+EBurZ7S$$DrD<Jjs%r\ipJ:EXpe_#hr_iepr)!Jk:]4&f:]*ue:\mic:\mof:]4&f:\RTb<E/rr
+q,RDpnQ#KfmSs6fr`/tt!EE+t<W?)"<W6#&<E<+"<`T#t3)s"p_Sa@4aN;WKc-F\`e'uq"f\,!6
+h;7&IiT&tZk2tjkl0@U$m-a?2nF5u=o(2MGp%A%Pp\4X]s7uZjq"sIVp&"^arV?<brqHEcr:U*^
+s7?0Zs7--YrU0gUmHsl=!pf.:rosIH!9a@D!p/M(ro4%=iVqa9hqn@g!SlH/g&]mZrmq>)e^W*t
+df.X.d*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHG"0XK/A#W2HPj
+V50o^U7n9RT:VXFS"#k7R$a5+Q'IStP*1rhO,o<\N/W[OM26qAL4tSGNfT6_Od#Z0s*=ioG^"@T
+FoHIdF)l8?E,Y_n&8c6!CMITuBP;$jAn>OaA7PUJ!F]C8?iOF4?2e+/>6%k+=oVV(=8l8#<W?%t
+;u]bq;>a8j:]F2f:&[id9D_?\8c;3U8,YpT7J'"C6hE_/5m9;23B0#^r]U?G8`9XK<VKJf<W,ns
+;u]hn<W5tp6N0@L7/fXT7fGpX8H29]9)hP59MJ5V:Jakb;H$Ln<E<1'=^#$7?!^lG@U`kZAnYmn
+CMds-EH6/DGBeF\I=?]tK7nu7M2I7PO-,TiQ'du/S=Z@HUSOcbWN3/(Yd(OA[^`l[]Y;.s_SjF6
+aND]NcHjndeCE.%g"P3:h;@/LioB+^k3)!nlKdg(mdKTPnF?)?oCMVIp%J+RrV6Egs8)Zjrquco
+o_sFAPQ-.~>
+JcC<$PQ1=TrVc`nr;6Njs7uZhs7ZNerq17&oCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX0^V7@m\[T#SZ`pX8XK&4sV5'`WSt):<R$Eo!OcPK\MM[+BK7\W'I=-?dGBS(L
+EH#f;H%M0P\BMq4aN;QFa2c9Crlb;brltGfps8rdnBh<acd2U9'[=kGbK7fD`5BI.^q[Us]tCth
+]Y+6WrOi0Brji6E]Y2"kqn<$Brk837pTsOuqm5t&!4DF,!4DR0rjMs;\$l%?0>YND`Q-'BbK\>Y
+dF-Opf%8U/gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DDo`"Lbp@n=[q#:*hqY9sQr:^$dqYg6d
+q#:$fpA=O_o`+O\o)J7[nG_nVmf2\Rm/QDOlMg#Lki_..jp1#/jQ#:[io0mp!T2c5h#Z<crn;2A
+f[na+f%&:"e'cXkd*U+acHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck43
+XfSP&WMl_mVPU)aUS=HUTV%gHS=?":R@'A.QBd`"PEM)kOH5H_NJrdQM2@%Dp](&Z%siMGGB\4Q
+FEDSFEcH)<DuOVcD/=!'C2.HrBP1phAS#C_A,]p<@:9(As'>\2r`oJ-!*]A)s&f;&r`9&!s&Atr
+s&/kor)!Dhs%`Jdr_3>bqb$fYr^ciTr'pTQoL/IAog7k.#\%+J>?P"/Y--[^p:^79qnDg>rkA=t
+rBpHMs$crWrC?lY!(m/^IS3@.9heAY:f("e;c?Xr<``C+>$G6;?XI5N@q9.`BPD6uD/O<4F*)SL
+G^=^bIXm!%KnbD?Mi<[WOcu&rR$jG7StMdPV5L8lX0&P/ZEpsI\@K5a^;%M$`5Td<b0/&Td*^:k
+e^rF+g=tH?hr*JRj5f@bkiq?sm-O--s6g?bnac8Bo^qhLp@e7[q#C0iqY^6ir;HTdrdk*5s*t~>
+JcC<$PQ1=TrVc`nr;6Njs7uZhs7ZNerq0mqoCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX0^V7@m\[T#SZ`pX8XK&4sV5'`WSt):<R$Eo!OcPK\MM[+BK7\W'I=-?dGBS(L
+EH#8oBPhpCNKjF*rfd>Es-*AFrg!JKrg3;Drg3&="-o+7PQ$aCOo:I=Onk1>P5pdCPQ$aFOoC@=
+N;AP2N;8J4NrP.?Nqnb8OR\A3Nq\V6O91K)O8"_h_8=.0a2lEHc-FY_daZguf@em4h;-uHiSrnY
+jlYail0@U$m-X60n*ol<o(2JFrq-?dp\4X]rqZTjq"s@SpA=gbrV?<brqHHdqt:!]s7?0Zs7--Y
+rpTmTs6]gPs6K^MrojLJkNDj,#Nb%-j5].YiVqa9hqn@g!SlH/g320%f@SU)e^W*tda?Ihd*L"_
+c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHG"0XK&;"W2HPjV50o^U7n9R
+T:VUDS"#k7R$a5+Q'IStP*1rhO,o<\N/NRMM26rVo()DEo_%tSq>#7GH?jaZGBS+NFE;MDEH,r9
+rb`9aChmg$C2%?pB4baeARo=]raGn:@/aO5?3":1>lS".>5h\)=T;J%<rZ2"<;ohr;ZBVl;#a>k
+:Adic9`Ic_9)V?\8GPdR7f5^I7/0.B6Kg`7<!?/s:5":PhuEP7rK$`8rK$W5rf@"ErBpHMs$crW
+rC?lY!(m/^IS3@.9heAY:f("e;c?Xr<``C+>$G6;?XI5N@q9.`BPD6uD/O<4F*)SLG^=^bIXm!%
+KnbD?Mi<[WOcu&rR$jG7StMdPV5L8lX0&P/ZEpsI\@K5a^;%M$`5Td<b0/&Td*^:ke^rF+g=tH?
+hr*JRj5f@bkiq?sm-O--s6g?bnac8Bo^qhLp@e7[q#C0iqY^6ir;HTdrdk*5s*t~>
+JcC<$PQ1=TrVc`nr;6Njs7uZhs7ZNerq0proCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtLK7f@AC"
+dEp1`bK@oH`PfX0^V7@m\[T#SZ`pX8XK&4sV5'`WSt):<R$Eo!OcPK\MM[+BK7\W'I=-?dGBS(L
+EH"636pjO<:/Fdd;#sKhr_E2`ohbB[!)iepqb[Aj:]4&f:]*ue:\mic:\mof:]4&f:\@K_<W?%t
+;u]ho<W6%d<<-(c<<-"m<W6##<E<,o<\M;+`5Td<b0/&TcdC1je^i@*g=tH>hr*JQj5f=akNM0q
+lg4!*mdKW6nac8BoCW%T!quB_rV6Bfs8)NflMUAQrVHKgqY:'as7Z?_s7H?_r:9mXs7$$Vs6fpS
+rp9[Ns6BUJ!pJh1roOIIjQ,@]io8qrhuV`lrnRV1g]#oMg"=p.f%/C$eC2jndEp7dcHa\YbKJ&M
+aN2EA`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\\)Wi;qpVl$;dUnaZXTqJ$LSXc1=
+R[KP1Q^3o%P`q8nOcYWbNfB!UMM[1GLPq+MNK0'\OHPh'6P"KgG^"@TF`__HF)l8?E,Y_n&8c6!
+CMITuBP;$jAn>OaA7PUJ!F]C8?iOF4?2e+/>6%k+=oVV(=8l8#<W?%t;u]bq;>a8j:]F2f:&[id
+9D_?[8cD9V8,PjS7J'"C6hNe05mT_>5!;%m8kD\5s8H$o<;9Jl<;fbq<;T\p<;f/^6i0:O7K5jU
+8,l*[8cD>292&#R9hnJ\:f1+h;cHdu='/U/>?kH@?X[DRA7]CeBkqO%DK'T:FEVkQH@('hJ:W?,
+L5:\EN/is]PEhH$R@Bb=TV8-WVl6VrXfen6ZaI6O\\#Mg^VRe*`Q-'BbK\>ZdF-Opf@S^0gYL`D
+i8N_VjQ>Ugl07L"m-X6@mgJXTo()DEo_%nNp@nR]s7u]kr;6KkrVcBfJcCr6J,~>
+JcC<$PQ1:Srr)ior;6Njs7uZhs7ZNerq17&oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp4bbfe,L`l5j3^V7@m\[])TZa$a:XK&7tV50iZSt2@>R$O#$OcPN]MM[+CKS+i*I=-?dGBS(L
+EH#c6G'f(5W6E9$a2l?B`lH0Crlb;brlt2`rQt&]s3Lblrltttbfn8Pa2Q!8_ns7*^AbhG]DoPB
+^&G\E]D];D]Y2"k]_oJC]_oGCZMh'.Z2q;;q6T_!rj)[5Za9>3!4D:(!joDDr3lF10"&0s\$s5l
+`Q$!@bKS8XdF$Fmf%8R.g>(N@i8EVTj5oFckiq?sm-O--n*fc9rpg*]o`"O`pAamcq#C0hqYC$P
+r:^$dqYg6eq#:$epAFU_o`+O]o)J7[nGVhUmf2\Rm/QAOlM]rKki_..joOT)ro=%<!9*q8!T2c5
+h#Z<crn7k8f[na+e^`1!e'cXkd*M^:=3\t4bK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKK
+Za-j?Yck43XK/A$WMl_mVPU)aUS=HUTUqaGS=?":R@'A.QBd`"PEM)kOH5E]N/W[PM>$uDS1&]/
+G^"@TF`__HF)l8?E,TW3D/F*)CMIQtBP;$jAn>Oa@q/tW@:<RC?NOP>?2e(1>?Y50=oVS(=8c2"
+<W?%t;u]bq;>a8j:]F2f:&[id9D_?\8c;3U8,YpT7J'"C6hNe/62t$hXfeh-h>d5_s1\?Eq7c[>
+rkA=trBpHMs$crWrC6o[8P/nR!D?,c9n,o6:f("e;cHat<``F,>$P<=?XR;O@qB7bBPM=!DJsN7
+F*)SLH$XjdIt3-'KnbD?N/`m[P*;/tR$sM8StVmSV5L8lXKA\1ZEq!K\[oGe^VI_(`Q$!@bKS8W
+d*^=le^rI,g>(N@hr*JRj5oFdkiq?tm-O--n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*5
+s*t~>
+JcC<$PQ1:Srr)ior;6Njs7uZhs7ZNerq1(!oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp4bbfe,L`l5j3^V7@m\[])TZa$a:XK&7tV50iZSt2@>R$O#$OcPN]MM[+CKS+i*I=-?dGBS(L
+EH#5lAS?+1L6[maPEM+.OTCW/qiq)Fqj7#Brg3&="-o+7PPp[COo1C=Onk1>PQ-gDPQ$aEOT:L=
+N<"q6NVe\1NW5">O-'*sr/gf:s,cu9!f`8$r/^Z8/rl$SOH@>s`Q$!@bKS8XdF$Fmf%8R.g>(N@
+i8EVTj5oFckiq?sm-O--n*fc9rpg*]o`"O`pAamcq#C0hqYC$Pr:^$dqYg6eq#:$epAFU_o`+O]
+o)J7[nGVhUmf2\Rm/QAOlM]rKki_..joOT)ro=%<!9*q8!T2c5h#Z<crn7k8f[na+e^`1!e'cXk
+d*M^:@a3-?bK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck43XK/A$WMl_mVPU)a
+US=HUTUqaGS=?":R@'A.QBd`"PEM)kOH5E]N/W[PM=9s'o()DEp%J.UpNS*4H$FOWG'.nKF)uAA
+EH#i6DJa6,CMR[!BkV0mAnGUcA7K+Y@UW\Qra,_5?![G7!aAi3r`T8'!*B,"s&K(ur_rhps&&\j
+s%iYir([/as%E5]r^m&Zq+(BQr'g6Gpd=^@k<T8I9S8"MJ_gA%O8t@9OSb+5OT(=>6N':K7/o^U
+7f>gY84cDP8c_RYr_7l;:Jakb;H$Op<`W:)=^#'8?=.)K@Uit]B4u$qCi402EH?5FGBnL^I=Hd!
+K8#&9M2[FTOHPfmQ^F52SXuOLUnsufWiW>+Yd1UD\%0)_]t_A"_o9X:aihoRcHstfeCE1'g"P6;
+hV[8Mj5]7`kNM0plg4!*mdKW6nac5OoCW%T!quB_rqQNhs8)Zjrqu`no_sFAPQ-.~>
+JcC<$PQ1:Srr)ior;6Njs7uZhs7ZNerq0proCDJBnF,i6mHj3)l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp4bbfe,L`l5j3^V7@m\[])TZa$a:XK&7tV50iZSt2@>R$O#$OcPN]MM[+CKS+i*I=-?dGBS(L
+EH"336UXF89MeRb;$Bck9heAXpeUT[pJLrg!`Mupr)!Jk:]4&f:]!oe:\dcb:\mlf:]4&f:\7B^
+:]",i;u]hp<W6%I<<?-"<:j0C<)lmt<PlYm`lQ9Fbg+P^dF6Urf@\g2gtgiFi8WeWjlY^hl07L"
+m-X60n*olHncA@Srq6<bs7cKes7uZjq>9CRpA=gbrV??crqHEcr:U']s7?3[s7--YrU9dSs6]gP
+s6B[MrTOCIkNDj,!TiDAj8\*=iVqa9hqn@g!SlH/g()fgf@SU(e^W*tda?Ihci24!c-4ASb/q`G
+a2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHG"/X/`2!W2HPjV50o^U7n9RSt;LCS"#k7
+R$a5+Q'IStP*1rhO,f3YN/NRMMMmCON/`jYO-#P!6R[8+G^"@TF`__HF)l8?E,TW3D/F*)CMIQt
+BP;$jAn>Oa@q/tW@:<RC?NOP>?2e(1>?Y50=oVS(=8c2"<W?%t;u]bq;>a8j:]F2f:&[id9D_?\
+8c;3U8,YpT7J'"C6hNe/5m9G88P;]Ih>[IUr`/bnqGmJnqc!MorDihrrBgHMqaCHQs$lrW!_>mS
+r^m2a9`@b9:/=\_;,U=l<E<.%=]np5>[CcF@:E_XAnPdlCM[m,EH-&AG'A4XI!pKpJqJc3Ll%(M
+O-#NgQ'[l,S"6.EU84W`W2cr$YHY==[^WfY]Y2(q_Sa@4aN;WLcHaeae'uq"f\,!6h;7&IiT&t[
+k3(sml0I^&mI'H3nF?)?!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s-*J5~>
+JcC<$PQ1:SrVc`nrVQWks7uWg!Vc<eok=!ho()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1?4f$r3t
+dEg+^bK7iF`P]R.^V.:j\@/fOZ*:C5X/W"oUnXQTSsu19Q^*btOH,9XM26n>K7SQ%I=$9bGBJ"J
+EGo]9H%D!L\';qla8a-[aN=G)rlkDe!7(AcrQsu[!mo9>rltqsbfn2M`l5m6_SO%%rk8?Ds1J<D
+rk/6Brjr-Bs1JEFr4W'A%DBEf]tUk\Za-mAZ*L\1Zh:U)Za0S:o<eG'n?r>)qmQ:/0>bWG`lQ6D
+bK\>ZdF-Opf@S^0gYL`Di8N\UjQ>Ufl07L!m-O--n*fc9o()DEo`"Lbp@n=[q#C0hqYC$`r;-Bc
+r:^$dqYg6eq#:$epAFU_o`+O]o)J7[nGVhUmf2\Rm/QAOlM]rPki_-kk2k^cro4aQiSi_Qhr!;H
+h;$f?g=k65f[na+ec+'(e'cXkd*L"_c-=JUbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKK
+Za-j?Yck43XK/A$WMl_mVPU)aUS=HUT:VXFS=?":R@'A.QBd`"PEM)kO,o<\N/[E/pRM8Q*-ldQ
+GBS+NFE;JCEH,r9DJj<.Chmg$Bk_6oB4h-S#@q=S@U`bS@/aL7?<pk9>QS,5>5h\)=9)G$<rZ/"
+<;fbq;ZBVm;#X8j:Adic9`Ic_9)V?\8GPdR7f5^I7/0.B6Kg]:X/r>Vs7O)*^A>V?^AG\D^A^Iu
+6i0:N7K5jU7s7Ep8P2TJ92&&S:/=\_;,U=k<)lt"=BSd2>[:ZC?t!MTAS,UhC27[(DfKf>Fa&%T
+H@1-jJ:iN0LP^nINK90aPa.T&R[ftATq\?[Vl?\tXfo"9['mHS]"G_k^r"".`lQ9Fbg+P^dF6Ur
+f@\g2gtgiFi"b83jQ5OekiqBum-O--n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCr6J,~>
+JcC<$PQ1:SrVc`nrVQWks7uWg!Vc<eok=!ho()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1?4f$r3t
+dEg+^bK7iF`P]R.^V.:j\@/fOZ*:C5X/W"oUnXQTSsu19Q^*btOH,9XM26n>K7SQ%I=$9bGBJ"J
+EGo/lB5D^@Ng5b+P5gXFP*>d-s-3SMqj7#Brg3>E!13PJs-<SIrf[5Br0$o=q3(]?!0[8Drf[8C
+rfHT.rJ^Q3"-/A$NqJJ1OSk1<O8t@>OSt4?Nr+n4O>"Jg`Q$!?b0/&Td*^:ke^rF+g=tH?hr*JQ
+j5f@bkNV6rlg4!*mdKW6nac8Bo^r.U!quB_rV6EgrqcHfq#(!epAFX]rVHKgqtU0brq?9_rq-6^
+rUU!Ys7$!Us6fpSrp9[N!:'OI#O(@6k2tdejSn0Sio/kSi8<GKh;-lAgY1B7g"=p.f%'cLC=CVY
+dEp4bcHXVXbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^NTNZa6sBYct=6XfSS'Wi;qpVl$;d
+UnaZXTq@pJSXc1=R[KP1Q^3o%P`q8nOcPQ`NJrh`mdKZ8o()DEp%J.UpNZ^^*-ldQGBS+NFE;JC
+EH,r9DJj<.Chmg$Bk_6oB4h-S#@q=S@U`bS@/aL7?<pk9>QS,5>5h\)=9)G$<rZ/"<;fbq;ZBVm
+;#X8j:Adic9`Ic_9)V?\8GPdR7f5^I7/0.B6Kg]:JU`7+s7hZUO7n\4O84n9O8_KF6i0:N7K5jU
+7s7Ep8P2TJ92&&S:/=\_;,U=k<)lt"=BSd2>[:ZC?t!MTAS,UhC27[(DfKf>Fa&%TH@1-jJ:iN0
+LP^nINK90aPa.T&R[ftATq\?[Vl?\tXfo"9['mHS]"G_k^r"".`lQ9Fbg+P^dF6Urf@\g2gtgiF
+i"b83jQ5OekiqBum-O--n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCr6J,~>
+JcC<$PQ1:SrVc`nrVQWks7uWg!Vc<eokX3ko()>?n*f]3m-O'&l0.9ljl>C[i8<AHgY1?4f$r3t
+dEg+^bK7iF`P]R.^V.:j\@/fOZ*:C5X/W"oUnXQTSsu19Q^*btOH,9XM26n>K7SQ%I=$9bGBJ"J
+EGn02779[?9MeS`:f%'b!)E;bohbB["&`&q;Ys;l:f%$br_NGes%iGcr_NAes%iVhrD3)]r_NPo
+qc*Jl!*&krr`7BG!*&kr!*&_n0>bWG`lQ6DbK\>ZdF-Opf@S^0gYL`Di8N\UjQ>Ufl07L!m-O--
+n*fc9o()DEo`"Lbp@n=[q#C0hqYC$`r;-Bcr:^$dqYg6eq#:$epAFU_o`+O]o)J7[nGVhUmf2\R
+m/QAOlM]rPki_-kk2k^cro4aQiSi_Qhr!;Hh;$f?g=k65f[na+ec+'5e'cXkd*L"_c-=JUbK@rJ
+aN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck43XK/A$WMl_mVPU)aUS=HUT:VXFS=?":
+R@'A.QBd`"PEM)kO,o<\N/WUMMMmCON/`jYO-#Ot6QCArGB\4QFEDSEEcH)<Df0H0D/=!'C2%Bq
+BP1rVAHuaU@q&nU@:9(A!a]/<r`fM/>$Co.s&]8&rDrqu!*&nqs&/korD<Jhs%`Jdr_3>bqb$fY
+r^ciTr'pTQoL/IAog7k.!_>sTh#I@Ss&JhnqGmJnqc!Mos&K"sr^-TOqaCEPs$lrWG">1r8kM`L
+9MJ5V:Jakb;H$Ln<E<.&=]ns6?!^lG@:EbYAnYjmCMds-EH6/DGB\=YI!pKpK7nu7M2I7OO-#Nh
+Q'[l,S=Z@HU84ZaWN*&%YHbF@[^WfY]Y2(q_Sa@4aN;WLcHjnce'ut#f\5'7h;7)J(#n97jlYai
+l0@U$m-X60n*ol<o(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?s-*J5~>
+JcC<$P5k4SrVc`nr;6Njs7uZhD>3btp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f@AC!
+dEg+_bK@oH`P]R.^V.:k\[JoPZEUL6X/`+qUnaWUSt):;Q^*euOH5BZM26n?K7\W&I=$9bGBJ"J
+EGo]3G']"2Vp!-Z`W=-%rlb;bs31Phps8ocma;']!71Yi'[=kGb/hWB`5BI.^qROr]tCth]Y+6W
+rk&<E]Y"-R"2)=\]_oJ@]`,VE^&l!SZi.62Zi79)Zh:X$Zh1X"[JRB7[C3NOr3cU5pU2Q\_SjF6
+aND]McHjndeC<($f\5*8h;7)JioB+]k3(sml0I^&mI'H3nF?MK!V>s_p&F^cp\jmeq>U6dqtg6`
+rV-6aqu-Biq>0mcp\smap&F[aoDJ1Znc/+Wn,MeUmJZAQlg!d7l2TrIkPjWDjT+B@it^S4iS`YO
+hqm2Fgt^Z<g=b03f@SU(rmY*"da?Ihcd'h\c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT
+[C!9HZE^X<YH=q.X/`2!W2HPjV50o^U7n6PSt;LCS"#k7R$a5+Q'IStP*1ofO7E8GSG\j(H$FOW
+G'.nKF)l;@EH#i6DJa6,CMR[!BkV0mAnGUcA7K+Y@UW\Qra,_5?![G7!aAi3r`T8'!*B,"s&B%u
+rDW_os&&_kr_NPhr([2br_*,\r^m&Zq+(BQr'g6Gpd=[?kWo3Mg]-oZs1\<DqS)pCrP&:urBpHM
+s$coVr^ZuZ!(m/^s%@f79heAY:f("e;c?Xq<``C+>$G6;?=.)L@Us%^BPD3sD/O<4EccGJG^=^b
+IXm!%KSG8=Mi<[WOckroR$jG6StD^OUo(&hX0&P/Z*UgG\@K5a^;%M$`5Td<b0/&TcdC1jeCN7)
+g=tE=hr*JQj5f=akNM0qlg4!*n*^;Hnc&([oCW%T!quB_rqQNhs8)Zjrqu`np&9OBP5g%~>
+JcC<$P5k4SrVc`nr;6Njs7uZhD"mYsp%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f@AC!
+dEg+_bK@oH`P]R.^V.:k\[JoPZEUL6X/`+qUnaWUSt):;Q^*euOH5BZM26n?K7\W&I=$9bGBJ"J
+EGo/jAS6%0Kp;S"s,d>FPP^UDQM[$AQN!6GQN*<JQN*6LPQ$aCOo:I=OoLREPPgUCP5pdDPQ$aD
+Oo:CAN;\b8N:`,0N;8J3Nq8>.OT(=<O9CW+OH5M%NrY4>O8b4nO-#HaOM\rTa2lEHbg+P^daZdt
+f@\g3gtgiFi8WeXjlYail07O#m-X60n*olHncA@Srq6<b!;HHes7uZjq>:$dp&4X_p\XpcrV?<b
+rqHEcr:U*^s7?0Zs7--YrU9dS!:BaO!pf.:rosIH!9a@Ds5a7Aro4aQiSi_Qhr!;Hh;$f?g=k65
+f[na+ec+'4e'cXkd*L"_c-=JUbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck12
+XK/A$WMl_mVPU)aUS=HTT:VXFS=?":R@'A.QBd`"PEM)jO,rYomHs?1nF?)@oCV_Kp\FW0r-'N6
+G^"@TF`__HEcQ/>E,TW3D/F*)CMIQtBP;$jAn>Oa@q/tW@:<RC?NOP>?2e(1>?Y50=oVS(=8c2"
+<<-"s;u]bq;>j>j:]F2f:&dod9D_?\8c;3U8,YpT7J'"C6hE_/5lcJjs8%iUO7eV4O8G%;O8hQF
+6i0:O7K,dU8,l*[8cD?^97BQ/9hnJ\:f1+h;cHat='/U/>?kH??XR>PA7]@dBkhF#DK'T9FEMeP
+H@('hJ:W?+L51VDN/is]P*D6!R@B_<T:r$UVPgDoXfen5Za@0N\\#Mg^VRe*`Q-'BbK\>YdF-Oo
+f%8U/gYCWBi8N\UjQ5OekiqBum-O-.mfDqJrpg*]o`"Lbp@n=\q#C0iqY^6ir;HTerdk*4s*t~>
+JcC<$P5k4SrVc`nr;6Njs7uZhDtiu!p%@tKoCDJBnF,i5m-O''l0.<mjl>C[i8<DIgY1?4f@AC!
+dEg+_bK@oH`P]R.^V.:k\[JoPZEUL6X/`+qUnaWUSt):;Q^*euOH5BZM26n?K7\W&I=$9bGBJ"J
+EGn-16UaL892JJ]:B!rf:A@WX;"mfh;Gg=iqb[Aj:]4&f:]*ue:\mic:\dfe:]4&f:\7E\:]FDm
+<W#hp;uTbp<W?+F<<-"q<A%6N<E)u8`5Td<b0/#ScdC1jeCN7(g=tE=hVd>Oj5f=akNM0plg4!*
+mdKW6nc&([oCW%Ts7QHerV6EgrqcHfqY^$bp\ad_rVHKgqY:'arq?9_s7H?_r:9mXs7$!Us6]mS
+rTjUOlK\B5s6'IGroX7B!9F.>(#n32i8EMMhVI#CgtUQ:g"G$0f@JLOe7mC[dF$=ecHa\Zbfe2P
+aiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Xf\\*WiE%sVl-DgUnjc[TqJ$LSt2C@
+S!ob4R$X,(Q'@JqP)t`cLPUbCM2I4LN/`gWO,oBcoKt!OG^"@TF`__HEcQ/>E,TW3D/F*)CMIQt
+BP;$jAn>Oa@q/tW@:<RC?NOP>?2e(1>?Y50=oVS(=8c2"<<-"s;u]bq;>j>j:]F2f:&dod9D_?\
+8c;3U8,YpT7J'"C6hE_/5laI1s8?!u<VTPh<W5tq;u0Jn6N':K7/o^T7fGpX8,u6\9)hP59MJ5V
+:Jakb;H$Ln<E<1'=^#$7?!^lG@U`kZAnYmnCMds.EH6/DGBeF\I=?]tK7nu7M2R=QO-,TiQ'du/
+S=Z@HUSOcbWN3/(Yd(OA[^`l[]Y;.s_SjF6aND]NcHjndeC<($g"P39h;@/LioB+]k3(smlKdg'
+mI0KEnF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUp/@s-!D4~>
+JcC<$P5k4SrVc`nr;6Njs7uZhD>3btp%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`PfX0^V7@l\[T#SZEUO7XK&4sV5'`WSt):<R$Eo!OcPK\MM[+BK7\W'I=-?dGBS(L
+EH#f3F*W:rS@-Q>`WF3&b5KN`bQ?&7cM5`cd-T-\d*M^:%F*,@bK7fD`5KO/^q[V_^&P_E]`#PC
+]`,PB])TDE]tD#V^&#DA]`l-`^:gkYrj2R1rNlO2qQg1-riu7(os4Y*rj2L/rNuX4rjDa6"LY\G
+[^Q(@q6i,t`Q$!@bKS8Wd*^=le^rI,g>(N@hr*JRj5f@bkNV6rlg4!+n*fc8nac8Bo^qhLp@e7T
+rV6EgrqcKgqu#s^q>C!ar;-EgqY:'arq?9_s7H?_r:9mXs7$!U!q,ICrTjUOlK\B5s6'IGroX7B
+!9F.>!TN);i#U_3hVI#CgY:H9g"=s/f@JL%eC2mpdF$=ecHa\Yrl[mUaiMQD`l5p8_ns:,^q[Xu
+]tD"i]",A]\$i`Q['R*EZ*:F7Xf\\*WiE%sVl-DgUnjcZTqJ$LSt2C@S!ob4R$X,(Q'@GpOmi>I
+SG8QZG^"@TF`__HErL%cE,TW3D/=$(CMIS_BE;aXrac=F@q/tW@:<RC?NOP>?2e(1>?Y50=oVS(
+=8c2"<<-"s;u]bq;>j>j:]F2f:&dod9D_?\8c;3U8,YpT7J'"C6hE_16/)A=]_9&;^&c!_qnN!A
+rkJEG!(-WOqaCHQs$lrWs%!,]r^m2a9`@b9:/=\_;,U=k<E<.%=]np5>[:]D@:E_XAS5[jCM[m+
+E,fr@G'A4XH[U?nJqJc3Ll%%KNfT?eQ'Rf*S"6.DTqeH^W2co#Y->4<[C3TU]=bkm_8=.0a2lEH
+c-F\`daZh!f@em4h;-uHiSrnYk2tjkl0@U$mI'H3nF?)?s76Edp%A%Pp\jmeq>^<hqu6NmrUg)?
+s-!D4~>
+JcC<$P5k4SrVc`nr;6Njs7uZhDYNkup%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`PfX0^V7@l\[T#SZEUO7XK&4sV5'`WSt):<R$Eo!OcPK\MM[+BK7\W'I=-?dGBS(L
+EH#f%@;'M"IZ'GRrfR5ErKR>Irg*GJp6P]Epm1oGqN_5KP`q=1P5LFCP*>m.qN:T:rfdAFrKI2C
+rfR/@!KiKAN;\b7N;nk;N:2c(NqSM8OH5J%OT(=@O8t@=O9CW+O-#J%NrY4>O8P(sO2JrVaN;WL
+cHaeae'uq"f\,!6h;7&IiT&tZk2tjkl0@U$m-a?2nF5u=o(2MGp%A%Pp\4X]s7uZjqYU0fnGW1\
+p\XmbrqZEcrqHEcr:U*^s7?0Zs7--YrU0gUmHsl=!pf.:rosIH!9a@Ds5a7Aro4%=iVqaUhqm5G
+h;$c>g=k64f[na+e^W*te'cXkd*L"_c-611>KY(/aN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKK
+Za-j?YHG"0XK/A$WMl_mVPU)aUS4BST:VXFS=?":R@'A.QBd`"P*1snlg4!*mdBQ5nac;Co_%nP
+q>5F3G6iG;GBS+NFE;L%E=-Z'DJj<-Chmg$C&VcHB4h-S#@q=S@U`bS@/aL7?<pk9>QS,5>5h\)
+=9)G$<rZ/"<;fbq;ZBVm;#X8j:Adid9`@]^9)_E\8GPdS7f5^I7/0.A6L$kjs8S/XOSb+:O8t@=
+OSk1;OSt4?6N':K7/o^U7f>jW8,u6\8c_RYr_7l;:Jakb;H$Lo<`W:)=^#'8?!grI@Uit\B4u!p
+Ci4-0EH?5FGBnL]I=?]uK8#&9M2R=QO-5]lQC+)0SXuLJUSXleWiN8)Yd1UC[^`l[]Y;.s_SjF6
+aND]NcHsteeCE1&g"P3:h;@/LioB+^k3)!nlKdg(mdKW6nac8No*+dZp%J+RrV6Egs8)Zjrquco
+o_sFAP5g%~>
+JcC<$P5k4SrVc`nr;6Njs7uZhF8,D%p%@tLoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`PfX0^V7@l\[T#SZEUO7XK&4sV5'`WSt):<R$Eo!OcPK\MM[+BK7\W'I=-?dGBS(L
+EH#e^6UX=58PN#W:/+GX:A@WY;"[]c;Yj5j:]4&f:]*ue:\dcb:\mof:]=,g:\7EZ:]+2j<Vo_q
+;u0J:<<-"o<Adan`Q$!@bKS8Wd*^=le^rI,g>(N@hr*JRj5f@bkNV6rlg4!+n*fc8nac8Bo^qhL
+p@e7TrV6EgrqcKgqu#s^q>C!ar;-EgqY:'arq?9_s7H?_r:9mXs7$!U!q,ICrTjUOlK\B5s6'IG
+roX7B!9F.>!TN);i#U_3hVI#CgY:H9g"=s/f@JL%eC2mpdF$=ecHa\Yrl\NgaiMQD`l5p8_ns:,
+^q[Xu]tD"i]",A]\$i`Q['R*EZ*:F7Xf\\*WiE%sVl-DgUnjcZTqJ$LSt2C@S!ob4R$X,(Q'@Gp
+ObSUGLkpnEMMmFPNK&sZOHG^s6O7p\GBS+NFE;L%E=-Z'DJj<-Chmg$C&VcHB4h-S#@q=S@U`bS
+@/aL7?<pk9>QS,5>5h\)=9)G$<rZ/"<;fbq;ZBVm;#X8j:Adid9`@]^9)_E\8GPdS7f5^I7/0.A
+6L$kjs8Q*t<WH.o;uouuqc3Vpr_rVl!(-WOqaCHQs$lrWs%!,]r^m2a9`@b9:/=\_;,U=k<E<.%
+=]np5>[:]D@:E_XAS5[jCM[m+E,fr@G'A4XH[U?nJqJc3Ll%%KNfT?eQ'Rf*S"6.DTqeH^W2co#
+Y->4<[C3TU]=bkm_8=.0a2lEHc-F\`daZh!f@em4h;-uHiSrnYk2tjkl0@U$mI'H3nF?)?s76Ed
+p%A%Pp\jmeq>^<hqu6NmrUg)?s-!D4~>
+JcC<$P5k4SrVc`nr;6Njs7uZhs7ZNerq0mqoCDJBnF,i6mHj0(l07Bnk2bR^iS`SKgtUQ8f@JI#
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$a:XK&7tV50iYSt2@=R$O##OcPN]MM[+CKS+f)I=-?dGBS(L
+EH#f4Cit)\Pc"H"!lrC)r6#2dc-=Q/ci2;kd/_Vad/q\@ci22uc-+;PaMu3;_ns7*^AbhG]DoPB
+^&G\D]DfDA]E5dZ]_oGD]Y"-TqRlsC[']\9rNuU2rNuI.rj)I,q6KOsqR$4/s0`'<[^NTPq6g10
+/]>WKaND]NcHsteeCE.%g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCMVRo`Fj]p\jmeq>U6e
+qtp<[rV6<bqu-Biq>0mcp]'sbp&=U`oDJ1Znc/+Xn,MhUmJZAQlg!d7l2TrIkPjTFjlGM%irS/u
+rnn1AhVR)EgtUT;g=b-Xf3$VSeC;sqda?Ihcd'h\bfe2PaiVWFa2Z*;`5BI/_8*h#^:h1l]=PP`
+\@8oT[C!9GZ*:I9Y-"h-X/`2!W2HPjV50o]TqS-OSt;LCS"#k7R$a5+Q'IU$s8AJ^RgQX5G^"@T
+F`__HErL%cE,TW3D/=$(CMIS_BE;aXrac=F@q/tW@:<RC?NOP>?2e(1>?Y50=oVS(=8c/$<E)rr
+;u]bq;>j>k:]=,e:&dod9D_?\8c;3U8,YpT7J'"C6hE_46.l5:]_9&9^AG\A^&YqH^AUFr7/fXT
+7f>gY84cDP8q'E,9heAY:Jakb;c?Xq<`W=*=^,-9?=.)K@Uit]B4u$qCi402EH?5FGBnL^I=Hd!
+K8#&9M2[FTOHPfmQ^F52SXuOLUnsufWiW>+Yd1UC\%0)_]t_A"_o9X:aihoQcHstfeCE1'g"P6;
+hV[8Mj5]7`k32'olKmm)mf2_`nF?)?oCV\Jp%J+RrqQNhs8)Zjrqu`no_sFAP5g%~>
+JcC<$P5k4SrVc`nr;6Njs7uZhs7ZNerq0mqoCDJBnF,i6mHj0(l07Bnk2bR^iS`SKgtUQ8f@JI#
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$a:XK&7tV50iYSt2@=R$O##OcPN]MM[+CKS+f)I=-?dGBS(L
+EH#f#?t<niH%c*Y!0d>F!1!PLrKm,As-NPIrKmAH!L8oKPQ$aDOo1C=Onk1>PQ-gDPQ$aEOnt.@
+O,].sN;JV7N;\b7N:`,-NqSP5OT1@AORnM7OH5M!O8Y.l`5Td<b0/&Td*^:ke^i@*g=tH>hr*JQ
+j5f=akNM0qlg4!*mdKW6nac8BoCW%T!quB_rV6EgrqcKgqu#p]q#'m`rVHKgqY:'as7ZB`rq-6^
+r:9mXs7$$Vs6fpSrTjUOlK\B5s6'IGroO:DjQ-=#!TN);i!\H!hVI#CgY:H9g"?;UCt@.deC2jo
+dF$=ecHa\YbKJ&MaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R'CYct=6Xf\\*WiE%sVl-Dg
+Unj`YTqJ$LSt2C@S!ob4R$X,(Q'CS!lg*p)mI'E2nF?)@oCV_Kq"al5pNQXs#^CQ;G'.nKF)q8"
+$?0p$DJa3+CMR[!rb)=FB)Z?HA7K+Y@UW\Qra,_5?![G7!aAi3r`T8'!*B,"!``3!rDW_os&&_k
+s%iVhr([2br_*,\r^m&Zq+(BQr'g6Gpd=[?m6TD)rf@)@plGH:rK$i;r/^i=rK$nEqaCEPs$lrW
+!_>mSr^qW49MJ5V:JXe`;,^Cm<E<.&=]ns6>[CcF@:E_XAnPdlCM[m,EH-&AG'A4XI!pKpJqJc3
+Ll%(MO-#NgQ'[l,S"6.EU84W`W2cr$YHY==[C<]X]Y2(q_Sa@4aN;WLc-F\`e'uq"f\,!6h;7&I
+iT&t[k2tmll0@X%mI(#C$h3]Wo(2MGp%A%Pp\ssfq>^<hqu6NlrUg)?s-!D4~>
+JcC<$P5k4SrVc`nr;6Njs7uZhs7ZNerq0proCDJBnF,i6mHj0(l07Bnk2bR^iS`SKgtUQ8f@JI#
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$a:XK&7tV50iYSt2@=R$O##OcPN]MM[+CKS+f)I=-?dGBS(L
+EH#e^6UO:485)kX:A@WX;"dcd;Yj5k:f%$bs%iPfr_N>br_NAes%iVhr_N/]q+q#jqGdDnm8V8/
+/]>WKaND]NcHsteeCE.%g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCMVRo`Fj]p\jmeq>U6e
+qtp<[rV6<bqu-Biq>0mcp]'sbp&=U`oDJ1Znc/+Xn,MhUmJZAQlg!d7l2TrIkPjTFjlGM%irS/u
+rnn1AhVR)EgtUT;g=b-Xf50$geC;sqda?Ihcd'h\bfe2PaiVWFa2Z*;`5BI/_8*h#^:h1l]=PP`
+\@8oT[C!9GZ*:I9Y-"h-X/`2!W2HPjV50o]TqS-OSt;LCS"#k7R$a5+Q'ISfKnb>;LkpnEMMmFP
+NK&sZOHG^t6iU$iG^"@TF`__HErL%cE,TW3D/=$(CMIS_BE;aXrac=F@q/tW@:<RC?NOP>?2e(1
+>?Y50=oVS(=8c/$<E)rr;u]bq;>j>k:]=,e:&dod9D_?\8c;3U8,YpT7J'"C6hE_46.l5:<W?,"
+<V08f<W5qt;u'Dk6i0:N7K5jU7fl4Q8cD>292&&S:/=Y^:f1.i<)lt"=BSd2>[1TB?t!MSAS,Rg
+C27X'DfKc<FEVkRH@1-jJ:`E-L5:\FNK90aPEhK%R[]k>Tq\?ZVl6VsXfnt7ZaI9Q]"G_k^r"".
+`lQ9Fbg"G[dF6Uqf@\d1gtgiEi8N_VjlY^hl07L"m-X6@mgJXTo()DEo_%nNp@nR]s7u]kr;6Kk
+rVcBfJcCo5J,~>
+JcC<$P5k1Rrr)ior;6Njs7uZhs7ZNerq1(!oCDJBnF,i6mHj3)l07Eok2bR^iS`VLh:pZ9f@JI#
+dF$:cbfe,L`l5j4^q[Oo\[])UZa$a;XfA@uVPKr[T:MI?R$O#$P)t]_Mi!7EKS+i+IXQQhG^":P
+EcH#8CN=ZMMjplna2lC#b6,u5c-H+1rm:\m!7LAas3Lblrlu2%bfn5N`l5m6_SO%%^:h4m]=bfT
+^&G\D]DfAA]DT>?]`GdXrOi-C!5AHGs1AKH]!JcNqm-@0Za9D5qm6:-qm$()rj2I,pTse)!OK3*
+[P,%s`5Td<aihoRcdC.heCN7(g=k?<hVd>Nj5]7`k32'olKdg(mdKW6naZ2@oCW%Ts7ZKerqQKg
+s8)ThqY]aZqY^'arVHKgqtU0brq?9_rq-6^rUU!Ys7$!Us6fpSrp9[Ns6BUJ!pJh1roOIIjQ,@]
+io8qrhuV`lrnRV1g]#n-g"?;U"kM5ReC2kFd0\1GcHa\YbKJ&Mrl@=E`l5p8_ns:,^q[Xu]tD"i
+]",A]\$i`QZa6sBYct=6Xf\\*WiE%sVl-DgUnaZXTqJ$LSt2C@S!ob4R$X-)s8SV`Rf]%f\,Ni9
+G6N/4FEDSErc&*\Df0H0D#S2NC2*Z\!G?$DAH?=OraPn9!+>e5!a]/<r`fM/>$Co.s&]8&rDiu"
+<)ifps&/korD<Mir_EAcs%NDbqb$iZrCH`SrC6]RoL/IAoKr"4fDki_otC7:qnMm>rBpHMs$coV
+r^ZuZ!(m/^s%@i89heAY:f("e;c?Xq<``C+>$G6;?=.)L@Us%^BPD3sD/O93EccGJG^=^bIXm!%
+KSG8=MN!OUOckroQ^F84StD^NUo(&hWiW>,Z*UgG\%0)_]t_A"_o9X:aihoRcdC.heCN7(g=k?<
+hVd>Oj5f=akNM0plg4!*mdKTJnF?)?oCW%T!quB_rqQNhs8)Zjrqu`no_sFAP5g%~>
+JcC<$P5k1Rrr)ior;6Njs7uZhs7ZNerq1(!oCDJBnF,i6mHj3)l07Eok2bR^iS`VLh:pZ9f@JI#
+dF$:cbfe,L`l5j4^q[Oo\[])UZa$a;XfA@uVPKr[T:MI?R$O#$P)t]_Mi!7EKS+i+IXQQhG^":P
+EcH#8?XRJ`FFK%0P*2%,PQ7!JQN!6AQN!6IQMm0HQN*6LPQ$aCOo:I=Ont7?PQ$aDPQ$aEOnt1<
+O8b.:N:W&*N:i/1NqSP5OSb(=OR/#\OMo,YaN;WLcHjnce'ut#f\5'7h;7)JiT&t[k2tmll0@U$
+mI'H3nF?&>o(2MQp&Facp\sseq>^<fqtg6XrVHHcqu-Biq>9sdp\smap&=U`oDS7[nc/+Wn,MhU
+mJcJPli68LklU)3kPjTKjlGL_j5T(Wrnmh7hYu=3gtVh^!SQ-)f*0aUeC;sqrm;&!cd'h\bfe2P
+ao9@_a2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[Bm3FZ*:I9Y-"h-X/`2!W2HPjV50l\TqS-OSt;LC
+S"#k7R$a5+kiqBtlg4!*mI'E2nF?)@oCV_Kq"]/ZpNHU\r/L`#"a5$1FE;L%E<U<"DJj<-rbDOL
+C&VcHB4h-S!G#^>@fKj:@/aL7?<pk9>QS,5>5h\)=9)G$<WZ9#<;fbq;ZBVm;#a>j:Adid9`@]^
+9)_E\8GPdS7f5^I7/0.A6LR4ls6PgDOSk.>OSt7=6i0:O7K,dU8,l*[8cD?^97KW09hnJ\:f1+h
+;cHat='/U/>?kH??XR>PA7]@dBkhF#DJsN8FEMePH@('hJ:W?+L51VCN/`m\P*D5uR%'V;T:r!T
+VPgDnXKA_3Za@0M\[oGe^VI_(`Q$!@bKS8XdF$Fmf%8R.g>(N@i8EVTjQ5Oekiq?tm-O--n*^GL
+nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*4s*t~>
+JcC<$P5k1Rrr)ior;6Njs7uZhs7ZNerq0ssoCDJBnF,i6mHj3)l07Eok2bR^iS`VLh:pZ9f@JI#
+dF$:cbfe,L`l5j4^q[Oo\[])UZa$a;XfA@uVPKr[T:MI?R$O#$P)t]_Mi!7EKS+i+IXQQhG^":P
+EcH#86UO7184Q?Mr_E5aohb$Q!DlSj:B"&f:B"&b:B"&c;#a>j:B"&\:ARcc:B"8g<;]bp;ufqh
+<7+\t`5Td<aihoRcdC.heCN7(g=k?<hVd>Nj5]7`k32'olKdg(mdKW6naZ2@oCW%Ts7ZKerqQKg
+s8)ThqY]aZqY^'arVHKgqtU0brq?9_rq-6^rUU!Ys7$!Us6fpSrp9[Ns6BUJ!pJh1roOIIjQ,@]
+io8qrhuV`lrnRV1g]#n-g"?;U"kM5ReC2kFd0\1GcHa\YbKJ&MrlA*[`l5p8_ns:,^q[Xu]tD"i
+]",A]\$i`QZa6sBYct=6Xf\\*WiE%sVl-DgUnaZXTqJ$LSt2C@S!ob4R$X+lKS>,7LPL\AM2@+J
+N/WaVNfT9aP4_0B6Msa]G6N/4FEDSErc&*\Df0H0D#S2NC2*Z\!G?$DAH?=OraPn9!+>e5!a]/<
+r`fM/>$Co.s&]8&rDiu"<)ifps&/korD<Mir_EAcs%NDbqb$iZrCH`SrC6]RoL/IAoKr"4fDkYH
+oMk]fpJh)YqaCHQr^QlWs%!,]r_!2`InWR2:/=\_;,U=k<)lt#=BSg3>[:ZC?t*SUAS,UiC27[(
+DfKf>Fa&(VH[U?nJV/W1LP^nINK93bPa.T&S"-(BTq\?[Vl?\tXg#(:['mHS]"G_k^r"".`lQ9F
+bg+P^dF6Urf@\g2gtgiFi8WeXjlYail07O#m-X60mfi4No()DErq-?dp\4[^s7u]kr;6KkrVcBf
+JcCo5J,~>
+JcC<$P5k1RrVc`nrVQWks7uWg!Vc<eokX3ko()>@nF,f4m-O'&l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V.:k\[JoPZEUL6X/`(pUnaWUSt)7:Q^*euOH5BZM26n?K7\W&I=$9bGBJ"J
+EGo`1D0:2\Pbkn1aiaS*s3(PhcHc42rm:YmnBh6_rQZ)$bfe/M`l5m6_SO%%^:h1l]=bfT^&G\D
+]DfAF]=bei]Y+3Vs1JBDrk/3C#J@a_]=YYc]Df/:[/704ZE^^AZhLj'ZN7A<pTjh*o<SA%qm6@2
+o<p6i`lQ9EbK\>ZdF6Uqf@S^0gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DEo`"Lbp@n=[q#C0i
+qYL*dr9=1Vr:g*eqYg6eq#:$epAFU_o`+O]o)J7[nGVhUmf2\Rm/QDOlMg#Lki_..jp1#/jQ#:[
+io0mp!T2c5h#Z<crn7_4f[na+f%&:"e'e6C8C5].cHXSVbK@rJaN)<?`Pod5_SX.)^V@Lr]Y(kf
+\[f5Z[^EKKZa-j?Yck43XfSS'Wi;qpVl$;dUS=HUTV%gISXc1=R[NC>!1`hRs-iqrrO2`M"a5$1
+FE;L%E=-Z'DJj<-Chmg$C&VcHB4h-S#@q=S@U`bS@/aL7?<pk9>QS,5>5h\)=9)G$<WZ9#<;fbq
+;ZBVm;#a>j:Adid9`@]^9)_E\8GPdS7f5^I7/0.A6LmFnrrB_(^%f;B^V9Z]pqH_pqaCHQs$lrW
+s%!,]r^m2a9`@b7:/=\_;,U=k<*!%$=BSg3>[:]D@:E_WAS5[jCMRd)E,fr@Fa&(VH[U?nJV/W1
+LP^qJNfT<cPa7])S"-(BTqeE\Vl?`!Y->1;['mKT]=bkm_8=.0a2lEHbg+P^daZdtf@\g3gtglG
+iSrnYjlYail0@U$m-X60nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUp/@s,m>3~>
+JcC<$P5k1RrVc`nrVQWks7uWg!Vc<eokX3ko()>@nF,f4m-O'&l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V.:k\[JoPZEUL6X/`(pUnaWUSt)7:Q^*euOH5BZM26n?K7\W&I=$9bGBJ"J
+EGo`"?XmbhG_1s=PEYs0s-;u;rg3MJqj7/F!0mJHrf[2ArK?u=q3(`@s-!>Erf[5BqiL]9rf$l:
+qi(K5!0$Z3pPes.s,Qf6s,d,=q2k60/]G`Nai_fOcHstfeCE1&g"P3:h;@/LioB+]k3(smlKdg'
+mI'H3nF?)?oCV\So`Fj]p\jmeq>^<fqtp<UrVHHdqu-Biq>9sdp\smap&=U`oDS7[nc/+Wn,MhU
+mJcJPli68LklU)3kPjTKjlGL_j5T(Wrnmh7hYu=3gtVh^$JF(`f@JO'eC;sqrm>0$cd'h\bfe2P
+aiMQD`l?!:`5BI/_8*h#^:h1l]=PP`\@8oS['R*EZ*:I9Y-"h-X/`2!W2HPjV50l\TqS-OSt;LC
+S"#k7k2tmkl0@R"m-O-,mdBQ5nac;Co_%nPq=f+5G5@3uG6N/4FEDSErc&9aDf0H0Ci!m&C2*Z\
+!G?$DAHuaU@q&nU@:9(A!a]/<r`fM/>$Co.s&]8&rDiu"<)ifps&/korD<Mir_EAcs%NDbqb$iZ
+rCH`SrC6]RoL/IAoKr+7f)P#r!K`B@OSFn96i0:O7K5jU8,l*[8cD<_92,=ZI83R7:f1+h;cHdu
+='/U/>?kH@?X[DRA7]CeBkqL$DK'T:FEMePH@('hJ:W?+L51VDN/is]P*D9"R@B_<T:r$UVPgDo
+Xfen5Za@0N\\#Mg^VRe*`Q-'BbKS8XdF-Oof%8R.gYCWBi8N\UjQ5OekiqBum-O--n*olHncA@S
+rq-?dp\4[^s7u]kr;6KkrVcEgJcCl4J,~>
+JcC<$P5k1RrVc`nrVQWks7uWg!Vc<eokF'io()>@nF,f4m-O'&l0.<mjl>C[i8<DIgY1?4f%&9u
+dEg+^bK7iF`P]R.^V.:k\[JoPZEUL6X/`(pUnaWUSt)7:Q^*euOH5BZM26n?K7\W&I=$9bGBJ"J
+EGo_\6UaC484uZPp.t?Xm83j[rD*Agr(d2dqG.#cqG@2fr_EDfoM53XrD*>ks&Jnp!)rkrr)Nbr
+r`/Ykr)NVngf5rF`lQ9EbK\>ZdF6Uqf@S^0gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DEo`"Lb
+p@n=[q#C0iqYL*dr9=1Vr:g*eqYg6eq#:$epAFU_o`+O]o)J7[nGVhUmf2\Rm/QDOlMg#Lki_..
+jp1#/jQ#:[io0mp!T2c5h#Z<crn7_4f[na+f%&:"e'e6C@F3?GcHXSVbK@rJaN)<?`Pod5_SX.)
+^V@Lr]Y(kf\[f5Z[^EKKZa-j?Yck43XfSS'Wi;qpVl$;dUS=HUTV%gISXc1=R[Jb[K7no3L5(J=
+LkpnEMMmFPNK0$[OHG_#6iTLL;ZCqEG'.nKF)q8"$?0p$DJa3+CMR[!rb)=FB)Z?HA7K+Y@UW\Q
+ra,_5?![G7!aAi3r`T8'!*B,"!``3!rDW_os&&_ks%iVhr([2br_*,\r^m&Zq+(BQr'g6Gpd=[?
+nj1k,q,Qub!EE+t<VTPm6i0:O7K5jU8,l*[8cD<_92,=ZI83R7:f1+h;cHdu='/U/>?kH@?X[DR
+A7]CeBkqL$DK'T:FEMePH@('hJ:W?+L51VDN/is]P*D9"R@B_<T:r$UVPgDoXfen5Za@0N\\#Mg
+^VRe*`Q-'BbKS8XdF-Oof%8R.gYCWBi8N\UjQ5OekiqBum-O--n*olHncA@Srq-?dp\4[^s7u]k
+r;6KkrVcEgJcCl4J,~>
+JcC<$OoP+RrVc`nr;6Njs7uZhDtiu!p%@tKoCDJBnF,i5m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX0^V.:k\[T#RZEUO7X/`+rUnaWVSt):<R$Eo!OcPK\MM[(AK7\W'I=-?dGBS(L
+EH#f4CNF]NMj^Zkb5BEbbg"DXps8ue!7CeonBh9`ci)-%c-4>Pa2Q!8_ns7)^:h4m]=bfS^&G\D
+]DfDA]E#YE]`,VE]E#SA]_oGM]Xtee]">ScZa6t9ZN.B1ZNd_?Z*L[AZhCd(ZN@M?Zh^p,Zh(L%
+Zi@E4Zi@B5[C5n?rjF2na2lEHbg+P^daQ^sf@\g3gtgiFi8WeXjlY^hl07L"m-X60n*olHncA@S
+rq6<b!;HHes7uZjqYU3gkPb8Tp\XpcrV??crqHEcr:U*^rq$*Zs7--YrU9dSs6]gPs6B[MrTOCI
+kNDj,!TiDAj8\*=iVqa9hqn@g!SlH/g)J_tf@SU)e^W*tda?Ihd*L"_c-4ASb/q`Ga2\+t1rR;K
+_SO%&^V7Co]Xtbc\[T#U[C!9HZE^X<YHG"0XK/A$WMl_mV50o^U7n9RT:VXFS=A^A!1`kSrgNhq
+rjMd7%sN2>FEDSEEH,r:Df0H0D#S2NC2*Z\!G?$DAH?=OraGq;?srt@!a]/<r`fM/>$Co.!a&N*
+rDiu"<)ifps&/korD<Mir_EDdr_3;aqb$iZr^ciTr'pTQoL/IAog8::eGo0SoY1:=qS)tsqaCEP
+s$lrW!_>mSr^qW49MJ5V:/=\_;,U=l<E<.%=]np5>[CcF@:E_XAS5[kCM[m,E,fr@G'A4XI!pKp
+JqJc3Ll%%KNf]EfQ'Rf*S"6.DTqeH^W2co#Y->4<[C3TU]=bkm_8=.0a2lEHc-F\`daZguf@em4
+h;-uHiSrnYk2tjjl0@U$m-aoB!V#XYncA@Srq-<cp\jmeq>^<hqu6NlrUp/@s,m>3~>
+JcC<$OoP+RrVc`nr;6Njs7uZhDtiu!p%@tKoCDJBnF,i5m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX0^V.:k\[T#RZEUO7X/`+rUnaWVSt):<R$Eo!OcPK\MM[(AK7\W'I=-?dGBS(L
+EH#f4?".A^G(#14PPgXIQ'R`$n!<s>r0I5HqNh/Gs-*DErK7&Aq2tK9rfd>Erfd;DrfR)>q2bQ7
+!/pf7!0-i6rf-r:p5T!/!f`.tqi1W9r/Ui>r/^l>qiC9/rf8GGa2lEHbg+P^daQ^sf@\g3gtgiF
+i8WeXjlY^hl07L"m-X60n*olHncA@Srq6<b!;HHes7uZjqYU3gkPb8Tp\XpcrV??crqHEcr:U*^
+rq$*Zs7--YrU9dSs6]gPs6B[MrTOCIkNDj,!TiDAj8\*=iVqa9hqn@g!SlH/g)J_tf@SU)e^W*t
+da?Ihd*L"_c-4ASb/q`Ga2\+t:;k&e_SO%&^V7Co]Xtbc\[T#U[C!9HZE^X<YHG"0XK/A$WMl_m
+V50o^U7n9RT:VXFS=AU#k2tmkl0@R"m-O-,mdBQ5nac;Co_%qQpil^\pPf]-G'.nKF)l8?E,]`5
+DJa4hCB80arb)=FB)Z?BA7PUJ!b#JEra,_5?![G7!aAi3r`K;)=',?$!``3!rDW_os&&_ks%iVh
+rD!8br_*,\r^m)[q+(?Pr'g6Gpd=^@oKh",kE#S'qN(YDqaCEPs$lrW!_>mSr^qW49MJ5V:/=\_
+;,U=l<E<.%=]np5>[CcF@:E_XAS5[kCM[m,E,fr@G'A4XI!pKpJqJc3Ll%%KNf]EfQ'Rf*S"6.D
+TqeH^W2co#Y->4<[C3TU]=bkm_8=.0a2lEHc-F\`daZguf@em4h;-uHiSrnYk2tjjl0@U$m-aoB
+!V#XYncA@Srq-<cp\jmeq>^<hqu6NlrUp/@s,m>3~>
+JcC<$OoP+RrVc`nr;6Njs7uZhD>3btp%@tKoCDJBnF,i5m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX0^V.:k\[T#RZEUO7X/`+rUnaWVSt):<R$Eo!OcPK\MM[(AK7\W'I=-?dGBS(L
+EH#f46:4.17n?;H:\@QO;#sKhrD!>gqbI,dq+gobqG@2fr_EGgo1o-XqbI/j!)rhq!*/nqs&8kq
+r)E_rr)NYo!``3!r)NAgn5]9br`(>ba2lEHbg+P^daQ^sf@\g3gtgiFi8WeXjlY^hl07L"m-X60
+n*olHncA@Srq6<b!;HHes7uZjqYU3gkPb8Tp\XpcrV??crqHEcr:U*^rq$*Zs7--YrU9dSs6]gP
+s6B[MrTOCIkNDj,!TiDAj8\*=iVqa9hqn@g!SlH/g)J_tf@SU)e^W*tda?Ihd*L"_c-4ASb/q`G
+a2\+t:;k&e_SO%&^V7Co]Xtbc\[T#U[C!9HZE^X<YHG"0XK/A$WMl_mV50o^U7n9RT:VXFS=>(]
+JqJ]/KnY89LPL\AM2@+JN/WaVNfT9apd>$IqbmAk%sN2>FEDSEEH,r:Df0H0D#S2NC2*Z\!G?$D
+AH?=OraGq;?srt@!a]/<r`fM/>$Co.!a&N*rDiu"<)ifps&/korD<Mir_EDdr_3;aqb$iZr^ciT
+r'pTQoL/IAog8::eGoDGm8X$aqGdJ^qaCEPs$lrW!_>mSr^qW49MJ5V:/=\_;,U=l<E<.%=]np5
+>[CcF@:E_XAS5[kCM[m,E,fr@G'A4XI!pKpJqJc3Ll%%KNf]EfQ'Rf*S"6.DTqeH^W2co#Y->4<
+[C3TU]=bkm_8=.0a2lEHc-F\`daZguf@em4h;-uHiSrnYk2tjjl0@U$m-aoB!V#XYncA@Srq-<c
+p\jmeq>^<hqu6NlrUp/@s,m>3~>
+JcC<$OoP+RrVc`nr;6Njs7uZhs7^C(p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$^9XK&7tV50iYSt2@=R$O##OcPN]MM[+CKS+f)I=-?dGBS(L
+EH#f5Ci"6>L681<bl,`bbl5o`ci2;jdeD/hd/22jci)/hbRr"=a2Z*:_ns7)^:h4m]=Y_grOr3C
+rk&0@!5&0ArOi3Drk&-Ark8<Ds1A<B"1u.T])8l7ZM:a0ZE^X<Z*OA8rNlR2qm?@/rj2[3qQg+,
+oWnJ&qm6I5[^W^A[k,P?aihoRcHstfeCE1'g"P3:hV[8MioB+^k3(smlKdg'mI'H3nF?)?oCV\S
+o`Fj]p\jmeq>^<fqu$BRrVHHdqu-Biq>9sdp\smap&F[`oDS7[nc/+Wn,MhUmJcJPlN$5Ll2TrI
+kPjWDjT+B@is4T&iS`YOhqn@g<SZ?_g=b03f@SU(e^W*tda?Ihcd0n^c-4ASb/q`Ga2Z*;`5BI/
+_8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHG"0XK/A$WMl_lV50o^U7n9RT:VY9rrASbS,SlU\,Wo6
+[h!\+F`__HEcH)<E,TW3D/B2e!GZ?JBE;aXrac+@A,]p=@:3LB?NOP>?2e(1>?Y50=TV],=8c/$
+<E)rr;u]bq;>j>k:]=,e:&dod9D_?\8c;3V8,PjS7J'"C6hE_>6.>i6]_B,0^AYhD^&UOt7/o^T
+7fGpX8,u6\9)hP69MJ5V:Jakb;H$Ln<E<1'=]ns6?!^lG@U`kZAnYjmCMds-EH6/DG'A4XI!pKp
+JqJc4M2I7OO-#NgQ'[l,S"61FU84W`W2cr$YHY==[C<]X]Y2(q_Sa@4aN;WKc-F\`e'uq"f\,!6
+h;7&IiT&t[k2tmll0@U$mI'H3$h3]Wo(2MGp%A%Pp\jjeq>U6hqu-HlrUg)?s,m>3~>
+JcC<$OoP+RrVc`nr;6Njs7uZhs7^C(p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$^9XK&7tV50iYSt2@=R$O##OcPN]MM[+CKS+f)I=-?dGBS(L
+EH#f5>@(fQE-QnlQ2QsFQ11+=Qi!*GQi*0LPlR'JPQ$aDOo1C<Onk1?PQ$aDPQ$aEOo(79Nrb9%
+r/:W6oS`d0rJ^]7!0$f7rf$W3s,R#<r/^u@OHB@#n;o3@aN;WLcHaeae'uq"f\,!5h;7&IiSrnY
+k2tjjl0@U$m-X60n*ol<o(2MGrq-?dp\4X]s7u]kqYU3gjo,&Rp\XpcrV??crqHEcr:U*^rq$*Z
+s7--YrU9dSs6]gPs6B[MrosIH!9a@Ds5a7Aro47CiSi_Qhr!;ih,`=cg=k65f[na+e^`1!e'cXk
+d*L%`cHXSVbK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;qpVPU)a
+US=HUTV%gIj8S->k5XWYl0@R"m-O-,mdBQ5nac;Co_%qQqKMj\p5KT,G'.nKF)l8?E,]`5DJa4h
+CB80arb)=FB)Z?BA7PUJ!b#JEra,_5?![G7!aAi3r`K;)=',?$!``3!rDW_os&&_ks%iVhr([2b
+r_*,\r^m&ZqFCHQr'g6Gpd=[?pHd:.k)]J&qi:_EqaCHQr^QlWs%!,]r_!2`InWR2:/=\_;,U=k
+<)lt#=BSd2>[:ZC?t*SUAS,UhC27[(DfKf>F`qtSH@1-jJ:`E-LP^nINK90aPEhK%R[]k?Tq\?Z
+Vl6VsXfnt7ZaI9Q]"G_k^r"".`lQ9FbK\>ZdF6Uqf@\d1gtgiEi8N_VjlY^hl07L!m-X60mgJXT
+o()DEo_%nNp@nO\!;ZWjrVQQkrr)KgJcCl4J,~>
+JcC<$OoP+RrVc`nr;6Njs7uZhs7^C(p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$^9XK&7tV50iYSt2@=R$O##OcPN]MM[+CKS+f)I=-?dGBS(L
+EH#f55sdt-77U!G;#!i[;"RWb;#=)i:\RW_:\dcb:\mof:]=,g:\.?X:\dc`;ufkk<!-&s;H*Nn
+rD`hsqc3Vpq,Qf]pJpuh/B5cQbKS8Wd*^=le^rI,g=tH?hr*JQj5f@bkNM0qlg4!*mdKW6nac8B
+o^r.U!quB_rV6Egs8)Thr;>[TqY^*brVHKgqtU0brq?9_s7H<^rUU!Ys7$!Us6fpSrp9[N!:'RJ
+s6'IGroX7B!9F.>#NF_$i8EMMhYu>NgtUQ:g"G$0f@JL&eC;sqdF$=ecd'h\bfe2PaiMQD`l5p8
+_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HMhUnjc[TqS-OSt:I`JV&K+K7nr4
+L5(J=LkpnEMMmFPNK0$[OHTH-r'L<Zqbn#LG'.nKF)l8?E,]`5DJa4hCB80arb)=FB)Z?BA7PUJ
+!b#JEra,_5?![G7!aAi3r`K;)=',?$!``3!rDW_os&&_ks%iVhr([2br_*,\r^m&ZqFCHQr'g6G
+pd=[?pHd:.!*&qtl;[^^qc!P_qaCHQr^QlWs%!,]r_!2`InWR2:/=\_;,U=k<)lt#=BSd2>[:ZC
+?t*SUAS,UhC27[(DfKf>F`qtSH@1-jJ:`E-LP^nINK90aPEhK%R[]k?Tq\?ZVl6VsXfnt7ZaI9Q
+]"G_k^r"".`lQ9FbK\>ZdF6Uqf@\d1gtgiEi8N_VjlY^hl07L!m-X60mgJXTo()DEo_%nNp@nO\
+!;ZWjrVQQkrr)KgJcCl4J,~>
+JcC<$OoP+RrVc`nr;6Njs7uZhs7ZNerq1!toCDJBnF,i6mHj0(l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp4bbfe,L`l5j4^V7@m\[])TZa$a;XK&7tVPKr[T:MI?R$O#$P)kW^Mi!7EKS+i+IXQQhG^":P
+EcH#8Che!7I>XAi_u@g[bg$.4qTo,e!7CeopsK,gr6YPlci)-&c-4AQa2Z*:_ns7)^:q:n]Xthh
+rOr3Crk&-?s1AEH]Y+3V!5/9Brk/6D!PH,F]DoGB]DfDA\brc5Zi79,ZN7A:rNH:-rNlO2rNl:+
+!42O-rj27&rj2L/!O]B5[jSW)aND]NcHjndeC<($f\5*8h;7)JioB+]k3(sml0@X%mI'H3nF?MK
+!V>s_p&F^cp\jmeq>U6fqu$BdrV?HcrVHHdqu-Bjq>0mcp\smap&F[`oDS7[nc/+Wn,MeUmJZAQ
+lg!d7l2TrIkPjWDjT+B@it^S4iS`YOhqm2Fgt^Z<g=b-2f@SU(rmV,#da?Ihci23Nc-4ASb/q`G
+a2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHG"0XK/A$W2HPjV50o^U7n:?rrAScS,SlT
+[fEl3[gmS(FEDSEEH,r:Df0H0D#S2NC2*Z\!G?$DAH?=OraGq;?srt@!a]/<r`fM/>$Co.!a&N*
+rDiu"<)ifps&/korD<Mir_EAcs%NDbqb$iZrCHcTr'pTQoL/IAog8I?df9?[q7Z41s1eHF!(6WO
+s$crWrC?lY!(m/^!D?,c9n#i5:f("e;c?Xr<``C+>$G6;?XI2M@q9._BPD6tD/O<4EccGJG^=^b
+IXm!%KSG8=MN!OUOckroQ^F84StD^NUo(&hWiW>,Z*UgG\%0)_]t_A"_o9X:aihoRcd:(geCN7(
+g=k?<hVd>Oj5]7`kNM0plg4!*mdKW6nc/.\oCW%T!quB_rqQNhs8)Zjrqu`no_sFAOoKq~>
+JcC<$OoP+RrVc`nr;6Njs7uZhs7ZNerq1!toCDJBnF,i6mHj0(l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp4bbfe,L`l5j4^V7@m\[])TZa$a;XK&7tVPKr[T:MI?R$O#$P)kW^Mi!7EKS+i+IXQQhG^":P
+EcH#8Cg:C\C3+`TP5LRDQ1:1<Qi*0IQhm!KQ'D93rf[2ArK?u=plbZ@s-!>Erf[8CqN1K5s,Qr7
+repW3!/pf7!/pc6s,Hu9nr<[0r/^W7r/^E1-HF3MbK\>YdF-Oof%8R.gYCWAi8EVTjQ5Oekiq?s
+m-O--n*fc9rpg*]o`"O`p&Ojcq#C0hqYU0fr:g0crq66dr:g*eqYp<eq#:$epAFU`o`"I\o)J7[
+nGVhUmJuYQliQM<lMg&JkQ'fFk5XNCjSn0Sio/kSi8<GKh;-lAgY1B7f\"g-f%'cL"k1oIdEp5=
+c9BLsbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\\*WiE"qVl$;dUnaZX
+U#4hfj8S*Uk3(sll0@R"lg4$+mdBQ5nac;Co_%qQr-/$]o8O6'F`__HEcH)<E,TW3D/B2e!GZ?J
+BE;aXrac+@A,]p=@:3LB?NOP>?2e(1>?Y50=TV],=8c/$<E)rr;u]bq;>j>k:]=,e:&dod9D_?\
+8c;3V8,PjS7J'"C6hNeA6.5eoO8k==NrVQE7/o^U7f>jW8,u6\8c_RYr_7i::Jakb;H$Ln<`W:(
+=^#$7?!grH@Uiq[AnYmoCMds.EH6/DGBeF\I=?]tK7nu7M2I7OO-,TiQ'[l-S=Z@HU84ZaWN*&%
+Yd(OA[^WfY]Y2(q_Sa@4aN;WLcHjkbe'ut#f\5'7h;7)JioB(\k3(sml0I^&mI'H3nF?PL!V>s_
+o`Fj]p\ssfq>^<hqu6NlrUg)?s,m>3~>
+JcC<$OoP+RrVc`nr;6Njs7uZhs7ZNerq1!toCDJBnF,i6mHj0(l07Bnk2bR^iS`VLgtUQ8f@JI#
+dEp4bbfe,L`l5j4^V7@m\[])TZa$a;XK&7tVPKr[T:MI?R$O#$P)kW^Mi!7EKS+i+IXQQhG^":P
+EcH#8CdLHV77]pC:&.TX;"[]c;#F/k:f%$b!)NMfr(m/ar_NAes%iSgr_N,\qbQr]qGdGmqGdJn
+rDNPms&K"so2Y*Uq,R8l-HF3MbK\>YdF-Oof%8R.gYCWAi8EVTjQ5Oekiq?sm-O--n*fc9rpg*]
+o`"O`p&Ojcq#C0hqYU0fr:g0crq66dr:g*eqYp<eq#:$epAFU`o`"I\o)J7[nGVhUmJuYQliQM<
+lMg&JkQ'fFk5XNCjSn0Sio/kSi8<GKh;-lAgY1B7f\"g-f%'cL"k1oIdEp5=c<8E9bKJ&MaN2EA
+`Pod5_SX.)^V@Lr]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\\*WiE"qVl$;dUnaZXTmhH?J:W9'JqJ]/
+KnY89LPL\AM2@+JN/WaVO,oBcr'U?Jr)3;g%X)u:FE;JBEH#l8DJj<-rbDOLC&VcHB4h-S!G#^>
+@KKtG@/aL7?<pk9>QS,5>5hY+=BAT&<WZ9#<;fbq;ZBVm;#a>j:Adid9`@]^9)_E\8GYjS7f5^I
+7/0.B6MWpqs5[/Z<Vo_q6i0:O7K5jU8,l*[8cD<_92,=ZISN[8:f1+h;cHdu='/U/>?kH@?XR>Q
+A7]@dBkqL$DK'T9FEMePH@('hJ:W?+L51VCN/`m\P*D5uR%'V;T:r!TVPgDnXKA_3Za@0M\[oGe
+^VI_(`Q$!@bKS8Xd*^=lf%8R.g>(N@i8EVTj5oFdkiq?tm-O--n*fc9s7-3^o`"Lbp@n=\q#C0i
+qY^6ir;HTdrdk*3s*t~>
+JcC<$OoP(Qrr)ior;6Njs7uZhs7ZNerq1!toCDJBnF,i6mHj3)l07Eok2kX`iS`VLh:pZ:f@JI$
+da?Cdbfe,L`l5j4^q[Rq]"#2VZa-g<XfJJ"VPKu\T:VRAR$X)&P)t`aMi!7EKnFu-IXQQhG^":P
+EcH#8D/3p/H@h-IY5ZTEbl5occhl&hdJhSidJ_Gjd/q\@ci23'c-4DRa2Z-;`5BF,^:q:o]Xthh
+r4W*Bs1A6@s1A?Frk/6Ds1J<Brk/9Erk&6Cqmlg=])K8?Zh:X%ZN7A:rNH=-ZM1^$ZiIH2Z3%A<
+ZMq3+Z2h0.ZMq30ZiIH3ZiRSCrjOGuaN;WLcHjkbe'uq"f\,!6h;7&IiT&tZk2tjkl0@U$m-X60
+n*ol<o(2MGrq-?dp\4[^rqZTjqtp<hq>KsbpAOmdp\XpcrV?<bs7cNdr:U']s7?0Zs7--YrpTmT
+s6]dO!pf.:rosIH!9a@Ds5a7Aro4%=iVqaHhqm5Gh;$f?g=k64f[na+ec+&`e'cXkd*L"_c-=JU
+bK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck43XfSS'WMl_mVPU)aUYu.PSGJ`T
+Re!ou\9<":FE;JBEH#i7DJj<-rbDOLC&VcHB4h-S!G#^>@KKtG@/aL6?=!P8s'#J,rE02(=',B%
+s&K(urDW_os&&_ks%iVhrD!8br_*,\r^m)[q+(?Pr'g6Gpd=^@qa&X0qRtq'r'^NQs$lrW!_>mS
+r^m2a9`@b8:/=\_;,U=l<E<.%=]np5>[:]D@:E_XAS5[jCM[m+E,fr@G'A4XH[U?nJV/Z2Ll%%K
+NfT<dQ'Rf*S"-(CTqeE\VlHf"Y->1;[C3TU]=bkm_8=.0a2lEHbg+P^daZdtf@\g3gtgiFi8WeX
+jlYail0@U$m-X60n*olIncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcCl4J,~>
+JcC<$OoP(Qrr)ior;6Njs7uZhs7ZNerq1$uoCDJBnF,i6mHj3)l07Eok2kX`iS`VLh:pZ:f@JI$
+da?Cdbfe,L`l5j4^q[Rq]"#2VZa-g<XfJJ"VPKu\T:VRAR$X)&P)t`aMi!7EKnFu-IXQQhG^":P
+EcH#8D/3HeBl/$CMNe%(rg!&?qj72GrKmAHs-<PHrf[5BrK?u=plbZ@rf[8Erf[8CqN1N6!KN6?
+NW>"5N;SV3N;eb8N;eb0N:`,/Nr"h8O91K)OSk1=O8t@?O8t@@O=\DmaihoRcd:(geCE1'g"P6;
+hV[8Mj5]4_k3)!nlKdg'mI'H3nF?)?oCV\So`Fj]p\sseq>^<gqu$BfrUg*_rVQNequ-Biq>0md
+p\smap&=U`oDJ1Znc/+Xn,MhUmJZAQlg!d7l2TrIkPjWDjT+B@irS/urnn@FhVR)Egt^Z<g=b-2
+f@SU(rmXEdda?Ihcd'h\c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHG"0
+XK/A#W2HPjV50o^h;@,KioC%!(ZsoEkiqBtlg*p)mI'E2nF?)@oCV_Lq#5L6G4LV'N-9>cFE;JB
+EH#i7DJj<-rbDOLC&VcHB4h-S!G#^>@KKtG@/aL6?=!P8s'#J,rE02(=',B%s&K(urDW_os&&_k
+s%iVhrD!8br_*,\r^m)[q+(?Pr'g6Gpd=^@qa&X0!05lrr'^NQs$lrW!_>mSr^m2a9`@b8:/=\_
+;,U=l<E<.%=]np5>[:]D@:E_XAS5[jCM[m+E,fr@G'A4XH[U?nJV/Z2Ll%%KNfT<dQ'Rf*S"-(C
+TqeE\VlHf"Y->1;[C3TU]=bkm_8=.0a2lEHbg+P^daZdtf@\g3gtgiFi8WeXjlYail0@U$m-X60
+n*olIncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcCl4J,~>
+JcC<$OoP(Qrr)ior;6Njs7uZhs7ZNerq1$uoCDJBnF,i6mHj3)l07Eok2kX`iS`VLh:pZ:f@JI$
+da?Cdbfe,L`l5j4^q[Rq]"#2VZa-g<XfJJ"VPKu\T:VRAR$X)&P)t`aMi!7EKnFu-IXQQhG^":P
+EcH#8D/2I)6pjL89i1^_ohb?ZrD<Gi!`2Zgr_<GhqbI)cq+gobqb[;grD*>fo1o-Xp.kB^r)<Mm
+s&8kos&8Yko2Y-Vq,RAo/B5cQbKS8Xd*^=le^rI,g>(N@hr*JRj5f@bkNV6rlg4!*mdKW6nac8B
+o^r.U!quB_rqQKgs8)Wir;?Bho`"R_qu$3crVHKgqY:*brq?9_rq-6^r:9mXs7$$Vs6fpSrTjUO
+lK\B5s6'IGroX7B!9F.>!TN);i"4f&hVI#CgtUQ:g"=s/f@JLOe7$hSdF$=ecHa\Zbfe2PaiMQD
+`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-X/`.tVl-DgUnjc5I=?WpJ:W9'JqJ]/
+KnY89LPL\AM2@+JN/WaVO,oBcr^6NKr)35e%X)u:FE;JBEH#i7DJj<-rbDOLC&VcHB4h-S!G#^>
+@KKtG@/aL6?=!P8s'#J,rE02(=',B%s&K(urDW_os&&_ks%iVhrD!8br_*,\r^m)[q+(?Pr'g6G
+pd=^@qa&X0!*.iSr'^NQs$lrW!_>mSr^m2a9`@b8:/=\_;,U=l<E<.%=]np5>[:]D@:E_XAS5[j
+CM[m+E,fr@G'A4XH[U?nJV/Z2Ll%%KNfT<dQ'Rf*S"-(CTqeE\VlHf"Y->1;[C3TU]=bkm_8=.0
+a2lEHbg+P^daZdtf@\g3gtgiFi8WeXjlYail0@U$m-X60n*olIncA@Srq-?dp\4[^s7u]kr;6Kk
+rVcBfJcCl4J,~>
+JcC<$OoP(QrVc`nrVQTj!;ZTg!Vc<eo`=^VrpjamnF,f4m-O''l0.<mjl>C[i8<DIgY1?4f@AC!
+dEg+_bK@oH`PfX/^V.:k\[T#RZEUO7X/`+rUnaWVSt):<R$Eo!OcPK\MM[+BK7\W'I=-?dGBS(L
+EH#f4CMId1I>O2c\'3(@rm(MhqU#8i!7LYirQtPkrm1_mcHcF6&^/>;a2Z*:_ns4(^:h4m]=bfS
+^&G\D]DfDA]E#YE]`,VE]_oD@]`5\F]E#SB\c]RU\[q^LrNl.%rNcO1Z2Lm,Z2V')Zh_!.Zi79+
+ZhC[+Za-q6ZmiDk\&cY5bK\>ZdF-Opf%8U/gYL]Ci8N\UjQ5Oekiq?tm-O--n*fc9rpg*]o`"Lb
+p@n=[q#C0iqYL*fr;-B\rqQHgr:p0fqYg6dq#:$fpAFU_o`+O\o)J7[nG_nVmf2\QliQM<lMg&J
+kQ'fFjoXZ*jSn0?io0mp&Du@$h;-l@gY1B7f\"g-f%'cL4k%j,dEp4bcHXSWbKJ&MaN2EA`Pod5
+_SX.)^V@Lr]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\Y(Wi;qpVl$<IrrAScRfJoK\,<`FF`__HEcH)<
+Df9N2D/B2e!GZ?JBE;aXrac+@A,]p=@:3LB?NFJ=r`oJ-!*]>(!a&N*r`9&!s&Aqqs&/korD<Mi
+s%`Jdr_3;aqb$iZr^ciTr'pTQoL/IAog8XDci<sWiP,4Xs$coVr^ZuZ!(m/^s%@i89heAY:f("e
+;c?Xq<`W=*=^,-9?=.)K@Uit]B4u$qCi402EH?5FGBnL^I=Hd!K8#&9M2R@SOHPfmQC+,1SXuLJ
+UnsufWiN8*Yd1UC[^`l[]Y;.s_SjF6aND]NcHsteeCE.%g"P3:h;@/LioB+^k3(smlKdg'mdKTF
+nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUp/@s,d82~>
+JcC<$OoP(QrVc`nrVQTj!;ZTg!Vc<eo`=^VrpjXjnF,f4m-O''l0.<mjl>C[i8<DIgY1?4f@AC!
+dEg+_bK@oH`PfX/^V.:k\[T#RZEUO7X/`+rUnaWVSt):<R$Eo!OcPK\MM[+BK7\W'I=-?dGBS(L
+EH#f4CKk.VBlSEMN;f(@Q1C7=Qi!*JQhZjHPl6gFP5UOAP5(17OoU^FP5^[EP5UO?OSOq<NfX1"
+s,I#9q2G60r/CB.q2Fs*rf6o;!06u<rfI&=pQ5Er,g+<TcHsteeCE.%g"P3:h;@/LioB+]k3(sm
+l0I^&mI'H3nF?MK!V>s_o`Fj]p\jmeq>^<fqu-HhrU9a\rVHHequ-Biq>0mcp]'sbp&=U`oDJ1Z
+nc/+Xn,MhUmJZAQlg!d7l2TrIkPjTFjlGM%irS/urnn@FhVR)EgtUT;g=b-2f@SU(rmX*[da?Ih
+cd'h\bfn8Rb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHG"0X/`2!W2HPjV>f<N
+hZDcrj8S*Vk3(sll0@R"lg4$+mdBQ5nac;Co_%qQGPQFQNW"eFF`__HEcH)<Df9N2D/B2e!GZ?J
+BE;aXrac+@A,]p=@:3LB?NFJ=r`oJ-!*]>(!a&N*r`9&!s&Aqqs&/korD<Mis%`Jdr_3;aqb$iZ
+r^ciTr'pTQoL/IAog8XDci=!)i/de(s$coVr^ZuZ!(m/^s%@i89heAY:f("e;c?Xq<`W=*=^,-9
+?=.)K@Uit]B4u$qCi402EH?5FGBnL^I=Hd!K8#&9M2R@SOHPfmQC+,1SXuLJUnsufWiN8*Yd1UC
+[^`l[]Y;.s_SjF6aND]NcHsteeCE.%g"P3:h;@/LioB+^k3(smlKdg'mdKTFnF?MK!V>s_o`Fj]
+p\ssfq>^<hqu6NlrUp/@s,d82~>
+JcC<$OoP(QrVc`nrVQTj!;ZTg!Vc<eo`=^VrpjXjnF,f4m-O''l0.<mjl>C[i8<DIgY1?4f@AC!
+dEg+_bK@oH`PfX/^V.:k\[T#RZEUO7X/`+rUnaWVSt):<R$Eo!OcPK\MM[+BK7\W'I=-?dGBS(L
+EH#f4CI(<W77Tj@:B"&[:^']m:f1%crDEMir_`Yk!`)Qdr_NGerD35ar_NDfr_NMgr_N,\qG6`Y
+qG[Gpr`&eor)EYor_iSkr)E5em8Wj\-W\=0b0/&Td*^:ke^i@*g=tH>hr*JQj5f=akNM0plg4!*
+mdKW6nc&([oCW%T!quB_rV6Egs8)ThrVZNjn,E+\qY^-crVHKgqY:'as7ZB`rq-6^r:9mXs7$$V
+s6fpSrTjUOlK\B5s6'IGroO:DjQ-=#!TN);i"4f&hVI#CgY:H9g"=s/f@JLOe32:/dF$=ecHa\Y
+bfe2PaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h,WiE%sVl-Dgrd4ltIXZcs
+Jc:9$K,'&nKnb>;LkpnEMMd=NN/`jYO-#Mlq*P!Wo2?*@FEDSEEH,r9Df0H0D#S2NC2*Z\!G?$D
+AH?=OraGq;?srt@!FB(2>lS".>5_S*=BAT'<rZ2"<;fbq;ZBVm;#a>k:Adic9`@]^9)_E]8GPdR
+7f5^I7/0.B6N09ss8Q*V<;]/a7K,dU8,l*[8cD?^97KW09hnJ\:f1+h;cHat<`iL->?kE>?XR;O
+@qB7bBPM=!DJsN7F*)SLH$XjdIt3-'KnbD?MiEdZP*;/sR$sM8StMdQV5L8lX0&S0ZEpsI\@K5a
+^;%M$`5Td<b0/&Td*^:ke^i@*g=tH>hr*JQj5f@bkNM0qlg4!+n*^;Hnc&([oCW%T!quB_rqQNh
+s8)Zjrqu`np&9OBOT0h~>
+JcC<$OoP(QrVc`nr;6Njs7uZhEVK2#p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$^9XK&4sV50iYSt2@=R$O##OcPN]MM[+CKS+i*I=-?dGBS(L
+EH,o7Chma(G^ta@XNf#hcMu5dd.Ylad/VMmd/VDlcMl&tbf\#I`l>s8_SEq#]tOBWr4W*Brk&-?
+s1AEH]Y+3V!5/3@rk&9F]`,P?])&u;])/i2ZMq-)ZMUj-Z*L\2Zh_!,ZN.<.Zi@<2Zh^p+Z2_-2
+['T\;1:>3GbKS8XdF-Lnf%8R.g>(N@hr*JRj5oFckNV6rlg4!+n*fc8nac8Bo^qhLp@e7TrqQNh
+rqcNhrVZNjmJcnZqu$3crVHKgqtU0brq?9_rq-6^rUU!Ys7$!Us6fpSrp9[Ns6BUJ!pJh1roOII
+jQ,@]io8qrhuV`lrnRV1g]#n-g"?;U%bB1[eC2jodF$=ecHa\YrlZk8aiMQD`l5p8_ns:,^q[Xu
+]tD"i]",A]\$i`Q['R*EZ*:I9Y-"e+WiE%sg].)=o=+P*s)\ThEcH)<Df9N2D/B2e!GZ?JBE;aX
+rac+@A,]pB@:3JM?X@&Er`oJ-!*]>(!a&N*r`9&!s&Aqqs&/korD<Mis%`Jdr_3;aqb$iZr^ciT
+r'pTQoL/IAog6q'h7ihUs$crWrC?lY!(m/^InNI/9heAY:f("e;c?Xq<``C+>$G6;?=.)L@Us%^
+BPD3sD/O93EccGJG^=^bIXm!%KSG8=MN!OUOHPinQ^F52StD^NUnsugWiW>+Yd1UD\%0)_]t_A"
+_o9X:aihlPcHstfeCE1'g"P3:hV[8Mj5]4_k3)!nlKdg(mf2_`nF?)?oCMVIp%J+RrV6Egs8)Zj
+rqucoo_sFAOT0h~>
+JcC<$OoP(QrVc`nr;6Njs7uZhEVK2#p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$^9XK&4sV50iYSt2@=R$O##OcPN]MM[+CKS+i*I=-?dGBS(L
+EH,o7Chm<bASlO9LR",'Q1C7<Qi!*KQhZjIQ'D62s-!;Brf[&=pQ>TAP*5d-rf[8CqN1N6rJpf8
+!K2j7Mu&D1Mu8M7Mi.=gq2G$,!KN0=NrG+>Nq\V7NrP.@OH9@%s,SnUb0/#ScdC1ieCN7(g=k?<
+hV[8Mj5]7`k3)!nlKdg'mdKW6nF?)?oCV\Jp%J+Rp\ssfq>U6fqu-HhrU'UZrVQNequ-Biq>9sd
+p\smap&=U`oDS7[nc/+Wn,MhUmJcJPli68LklU)3kPjTKjlGL_j5T(Wrnmh7hYu=3gtVh^!SQ-)
+f+-B^eC;sqda?Ihcd'h\bl5dEb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHG"/
+X/`2!W8$(^gtgiEhr3STroF+B($OoHlK[^$m-X3.mdKZ8o(2JFp%J1VG4CRhN;mu,F)l8?E,TZ4
+DJa4hCB80arb)=FB)Z?BA7PUJ#@V"J?XI,G?2e+/>6%k*=TV],=8l8#<W?%s;u]bq;>j>k:]F2f
+:&[ic9D_?\8cD9V8,PjS7J'"C6hNdjs4rb77/o^U7f>jW8,u6\8q0K-9MJ5V:Jakb;H$Ln<E<1'
+=^#$7?!^lG@U`kZAnYmnCMds-EH6/DGBeF\I=?]tK7nu7M2I7OO-#NhQ'[l,S"?7GU84W`WN*&%
+YHY==[^WfY]Y2(q_Sa@4aN;WKc-F\`e'uq"f\,!5h;7&IiT&tZk2tjkl0@U$mI(#C$h3]Wo(2JF
+p%A%Pp\jmeq>^<hqu6NmrUg)?s,d82~>
+JcC<$OoP(QrVc`nr;6Njs7uZhEVK2#p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$^9XK&4sV50iYSt2@=R$O##OcPN]MM[+CKS+i*I=-?dGBS(L
+EH,o7Chl='6UjR99MeOO;#X>h;#aDl;#a;k:B"&d:B"&b:B"&c;#a>i:B"&]:Adlg:/CLWr_N>h
+"'&B%<;]\m<;]\p;YF&_<<-)!<UEc]<ADS;bKS8XdF-Lnf%8R.g>(N@hr*JRj5oFckNV6rlg4!+
+n*fc8nac8Bo^qhLp@e7TrqQNhrqcNhrVZNjmJcnZqu$3crVHKgqtU0brq?9_rq-6^rUU!Ys7$!U
+s6fpSrp9[Ns6BUJ!pJh1roOIIjQ,@]io8qrhuV`lrnRV1g]#n-g"?;U%bB1[eC2jodF$=ecHa\Y
+rl[:DaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"e+WiE%sH?spcI!pElIXcm!
+rdt0&'SM0oL5(J>Ll$tGMMmFPNK0'\OHTE+r)3#_s)\ThEcH)<Df9N2D/B2e!GZ?JBE;aXrac+@
+A,]pB@:3JM?X@&Er`oJ-!*]>(!a&N*r`9&!s&Aqqs&/korD<Mis%`Jdr_3;aqb$iZr^ciTr'pTQ
+oL/IAog6q's&IrUrC$ZSs$lrWs%!,]r^qZ59MA/T:/=\_;,U=k<)lt#=BSg3>[:ZC?t*SUAS,Ui
+C27[(DfKf>Fa&(VH[U?nJV/W1LP^nINK90aPa.T&R[]n@Tq\?ZVl?\tXfnt7ZaR?R]"G_k^r"".
+`lQ9FbK\>ZdF6Uqf@\d1gYL`Di8N_VjQ>Ufl07L!m-X6@mgJXTo()DDo_%nNp@nO\s7u]kr;6Kk
+rr)KgJcCi3J,~>
+JcC<$OT5"QrVc`nr;6Njs7uZhs7^*up%@tLoCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtUQ8f@JI#
+dEp1`bfe,L`l5j3^V7@m\[])TZa$a;XK&7tVPKr[T:MI?R$O#$P)t]_Mi!7EKS+i+IXQQhG^":P
+EcH#8D#S2VFaJh*Ts`(hcHl73psJrb!7C_k(XLCPc-=JUaiDHA`Pf[1^q[Rr]Y(kh]_oJB]`5VB
+])TDC^&G\D]`YpZ]=S!Rqn)p@qRZO6rji0C[C#h;q6L")qm$:-YHRo/!O8s0ZN.B2Zh_!#ZN@G=
+Zhh!-Zh^sXaihlPcHsteeCE1&g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCMVRo`Fj]p\jme
+q>^<gqu-HhrTaCXrVQNequ-Biq>9sdp\smap&F[`oDS7[nc/+Wn,MhUmJcJPlN$5KklU)3kPjTE
+jlHF$s5F%;rnmh7hYu=3gtVh^!SQ-)f*0aUeC;sqrm<LJcd'h\bfe2Pb/q`Ga2Z*;`5BI/_8*h#
+^:h1l]=PP`\@8oT[C!9HZE^X<Y-"h-X/anRq4$ubpUL6F$?L6-EH#i7DJj<-rbD^QBkV0mB4h-S
+!G#^>@L$=L?sd8I?=!P8s'#J,rE02(=',B%s&K(urDW_os&&_ks%iYir([/ar_*,\r^m)[q+(?P
+r'g6GpI"^Bc2ZV6r^?`Ss$lrW!_>mSr^m2a9`@b8:/=\_;,U=l<E<.%=]np5>[:]D@:E_XAS5[j
+CM[j*E,fr@Fa&(VH[U?nJV/W1LP^qJNfT<cPa.W(S"-(BTqeE\Vl?\uY->1;['mHS]"G_k_8=+/
+`lQ9Fbg+P^dF6Urf@\g2gtgiFi8WeWjlYail07O#m-X60n*olIncA@Srq-?dp\4[^s7u]kr;6Kk
+rVcBfJcCi3J,~>
+JcC<$OT5"QrVc`nr;6Njs7uZhs7^F)p%@tLoCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtUQ8f@JI#
+dEp1`bfe,L`l5j3^V7@m\[])TZa$a;XK&7tVPKr[T:MI?R$O#$P)t]_Mi!7EKS+i+IXQQhG^":P
+EcH#8Chm6^@q]h*J;aAko9T<@qN_,JpQbiFPl6gFP5UOAP5177OoU^FP5^[EP5^U?OSOt8Nr4k?
+Nf8pTMMhCkq2G<2r/:W6regT2repi:rJ^H0r/U]9!06l9p5gcGbKJ/Ud*^:ke^rF+g=tH>hr*JQ
+j5f=akNM0qlg4!*mdKW6nac8BoCW%T!quB_rV6Egs8)WirVZNjlMgVXqu$3crVHKgqtU0brq?9_
+s7H<^rUU!Ys7$!Us6fpSrp9[N!:'OI!pJh1roO7CjSn3>iW.s:huV`lrnRV1g]#n-g"?;U"kM5R
+eC2kFd6H"(cHa\YbKJ&NaiMQD`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I8Xf\\*WnH+\
+gYCT?hV[8MioC%!(?aoFl07Kulg*p)mI'E2nF?)@oCV_Lq0)^r!06`3qMbGr$?L6-EH#i7DJj<-
+rbD^QBkV0mB4h-S!G#^>@L$=L?sd8I?=!P8s'#J,rE02(=',B%s&K(urDW_os&&_ks%iYir([/a
+r_*,\r^m)[q+(?Pr'g6GpI"^Bc2ZU\r^?`Ss$lrW!_>mSr^m2a9`@b8:/=\_;,U=l<E<.%=]np5
+>[:]D@:E_XAS5[jCM[j*E,fr@Fa&(VH[U?nJV/W1LP^qJNfT<cPa.W(S"-(BTqeE\Vl?\uY->1;
+['mHS]"G_k_8=+/`lQ9Fbg+P^dF6Urf@\g2gtgiFi8WeWjlYail07O#m-X60n*olIncA@Srq-?d
+p\4[^s7u]kr;6KkrVcBfJcCi3J,~>
+JcC<$OT5"QrVc`nr;6Njs7uZhs7^F)p%@tLoCDJBnF,i6mHj0(l07BnjlGI]iS`SKgtUQ8f@JI#
+dEp1`bfe,L`l5j3^V7@m\[])TZa$a;XK&7tVPKr[T:MI?R$O#$P)t]_Mi!7EKS+i+IXQQhG^":P
+EcH#8Chl='6q0X:85AMJs&&Vh!)`Yj!DcJi:]!od:\[]a:]!ug:]4&f:\.?Y:\7E[:\Rfl<E<.#
+<)iiqr)ESmrDNDhs&Aeor`9&!mo9*_.`olWc-F\`daZh!f@em4h;-uHiSrnYjlYail0@U$m-X60
+n*ol<o(2JFrq-?dp\4X]s7u]kqtp?iqYf^Yq>L3gp\XpcrV??crqHEcr:U*^rq$*Zs7--YrU9dS
+s6]gPs6B[MrTOCIkNDj,!TiDAj8\*=iVqa9hqn@g!SlH/g&]mZrmq>)e^W*tdf.WZd*L"_c-4AS
+b0%iIaN)<>`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Ycb+1XK/@HH$Xd`I!g?jIXcitJc:9$
+K+iolKnb>;LkpnEMMd=NN/`jYO-'0(rDN#]s)\ThEcH)<Df9N2D/B2e#&7jcBP1sirac+@A,]pB
+@:3JM?X@&Er`oJ-!*]>(!a&N*r`9&!s&Aqqs&/korD<Mis%`Jdr_3;aqb$iZr^ciTr'pTQoL/F@
+pd37*rDhfUr^?`Ss$lrW!_>mSr^m2a9`@b8:/=\_;,U=l<E<.%=]np5>[:]D@:E_XAS5[jCM[j*
+E,fr@Fa&(VH[U?nJV/W1LP^qJNfT<cPa.W(S"-(BTqeE\Vl?\uY->1;['mHS]"G_k_8=+/`lQ9F
+bg+P^dF6Urf@\g2gtgiFi8WeWjlYail07O#m-X60n*olIncA@Srq-?dp\4[^s7u]kr;6KkrVcBf
+JcCi3J,~>
+JcC<$OT5"QrVc`nr;6Njs7uZhs7ZNerq1.#oCDJBnF,i6mHj3)l07Eok2bR^iS`VLh:pZ:f@JI#
+da?Cdbfe,L`l5j4^q[Rq\[])UZa-g<XfJJ"VPKu\T:VRBR$X)&P)t`aN/<@FKnFu-IslZiG^":P
+EcH&9D/3m&Ed)tjR&RdEchPl^dJ;,hdJVAkcP=aMbfn8QaN)<>`5BF,^:h4m]Xthhr4W*Bs1A6@
+s1A?Frk/6Ds1ABE])B8=]`5SI]",D`\[qUIs186B!4r0<!k#DBrNl:)s0;L-s0;U-rNQ=,!4)I-
+rj2[3rNuI.s0;[3ZMUs.ZMq01Z2V'/Zi%0Zb0/&TcdC1ieCN7(g=k?<hVd>Oj5]7`k32'olKdg(
+mdKW6naZ2@oCW%Ts7QHerV6EgrqcNhrVZQkl2LJVqu$3crVHNhqY:'arq?9_s7H<^rUU!Ys7$!U
+s6fpSrp9[N!:'OI!pJh1roO7CjSn3>iW.s:huV`lrnRV1g]#n-g"?;U"kM5ReC2kFd0\1GcHa\Y
+bKJ&Mrl?;(`l5p8_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:F7Xf^7UqO@)cpUL45#'=p,EH,r9
+rb`9aChmg$C2%?pB4kgfARo=]raH+@?sm>K?=$q:>lS".>5h\)=T;J%<rZ2"<;f_s;Gg<h;#a>k
+:Adic9`Ic_9)V?\8GPdS7f5^I7/0.F6HfB/^#$L'7/o^U7f>jW8,u6\9)hP59MJ5V:Jakb;H$Ln
+<E<.&=]ns6>[CcF@:E_XAnPdlCM[m,EH-&AG'A4XI!pKpJqJc3Ll%%KNfT?eQ'Rf*S"6.DTqeE]
+W2co#Y->1;[C3TU]=bkm_8=.0a2lEHbg+P^daZdtf@\g3gtgiFi8WeXjlYail0@U$m-X6@mfi4N
+o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCi3J,~>
+JcC<$OT5"QrVc`nr;6Njs7uZhs7ZNerq1.#oCDJBnF,i6mHj3)l07Eok2bR^iS`VLh:pZ:f@JI#
+da?Cdbfe,L`l5j4^q[Rq\[])UZa-g<XfJJ"VPKu\T:VRBR$X)&P)t`aN/<@FKnFu-IslZiG^":P
+EcH&9D/3lk@:a1qH\@NGQ1L=?QhcpIQhH^GQ'D93rf[2Arf[&=rfR8DplbW?rf[8Cq2kH6r/U]7
+rf6u;!K;s8MZ8V1N;nh6N;nh9MYi>2Mu\k9N;ee:N;AP5NrP(>O,j*u!07&>!07&>!K`B?O=A>q
+c-FY_daQ^sf@\g2gtgiFi8WeWjlY^hl07L!m-X60n*ol;o()DErq6<b!;HHes7uZjqtp?iqu,dY
+q#1*fp\XpcrqZEcrqHEcr:U*^rq$*Zs7--YrU9dSs6]gPs6B[MrTOCIkNDj,!TiDAj8\*=iVqa9
+hqn@g!SlH/g&]mZrmq>)e^W*tdf.W#d*L"_c-4ASb/sY(9?5&k`Pf[2_SO%&^V7Co]Xtbc\[],W
+[^EKKZa-j?YHG"0g"G*5gY:Q>h;7&IiSrnYjQ5Rgkiq?slKdd&mHs?0n*ol<oCMVJp\K(%NVe\6
+N<XKGEcH)<DuOVcD/=!'C2.HrBP1siAS#C_A,]pB@:3JM?X@&Er`oJ-!*]A)s&f;&r`9&!s&Aqq
+!`Dlmr)!Dhs%`Jdr_3>bqb$fYr^ciTrC6]RoL/IAq*N:)!05oss$ZlUs$lrWs%!,]r_!2`IS<I1
+:/=\_;,U=k<)lt"=BSd2>[1TB?t!MSAS,RgC27X'DfKc<FEVkRH@1-jJ:`E-L5:\EN/is^PEhH$
+R@Bb=TV8-VVl6VrXfen5ZaI6O\\#Mg^VRe*`Q-'BbKS8XdF-Oof%8R.gYCWAi8EVTjQ5OekiqBu
+m-O--s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*2s*t~>
+JcC<$OT5"QrVc`nr;6Njs7uZhs7ZNerq1(!oCDJBnF,i6mHj3)l07Eok2bR^iS`VLh:pZ:f@JI#
+da?Cdbfe,L`l5j4^q[Rq\[])UZa-g<XfJJ"VPKu\T:VRBR$X)&P)t`aN/<@FKnFu-IslZiG^":P
+EcH&9D/3lQ6:=757nc\I:]O;c:]OAj;#=&d:B+,a:B"&d;#a>i:B"&\:Adli:/=VZp.kN]!)E/c
+#?=f*<E)pr;uBVl;uT\h;uTbn<W6&!<UWoa<@Q)6c-FY_daQ^sf@\g2gtgiFi8WeWjlY^hl07L!
+m-X60n*ol;o()DErq6<b!;HHes7uZjqtp?iqu,dYq#1*fp\XpcrqZEcrqHEcr:U*^rq$*Zs7--Y
+rU9dSs6]gPs6B[MrTOCIkNDj,!TiDAj8\*=iVqa9hqn@g!SlH/g&]mZrmq>)e^W*tdf.W#d*L"_
+c-4ASb/sY(.*'?H`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?YHG"0G^+LZH@#R<s*Y$!It*!"
+rdt0&'82'nL5(J>Ll$tGMMmFPNK0'\OnqEC;XIE^<!IGcEcH)<DuOVcD/=!'C2.HrBP1siAS#C_
+A,]pB@:3JM?X@&Er`oJ-!*]A)s&f;&r`9&!s&Aqq!`Dlmr)!Dhs%`Jdr_3>bqb$fYr^ciTrC6]R
+oL/IAq*N:)r`.lUs$ZlUs$lrWs%!,]r_!2`IS<I1:/=\_;,U=k<)lt"=BSd2>[1TB?t!MSAS,Rg
+C27X'DfKc<FEVkRH@1-jJ:`E-L5:\EN/is^PEhH$R@Bb=TV8-VVl6VrXfen5ZaI6O\\#Mg^VRe*
+`Q-'BbKS8XdF-Oof%8R.gYCWAi8EVTjQ5OekiqBum-O--s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6i
+r;HTdrdk*2s*t~>
+JcC<$OT4tPrr)fnrVQWks7uZhs7ZNerq1.#oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@JL%
+da?Cdbfe/Ma2Q!6^q[Rq]",;YZa-g=XfJJ#Vkg)]TUq[CR@'8(P*(fbN/EIIL4b).Isl]jH$=FR
+F)c/:D/=!%CialVO.<Aschc#`dIGQqcd'e[bfn5Oa2c3=_ns7)^:jHWr4W*Bs1A3?"MDF]]Y+3V
+!5/0?rOi0B"hM7U\[oBJ\c0/?]DfD@[KX.K[^ENMrj)X2Zh(L&Z2_$*YlCs.ZLkI'[-k7(ZEpjD
+['Tb=.`olXc-F\`e'uq"f@em4h;-uHiSrnYjlYail0@U$m-X60n*ol<o(2JFrq-?dp\4X]s7u]k
+qtp?iqu,[Vq>L3gp\XpcrqZEcrqHEcr:U*^s7?0Zs7--YrU9dS!:BaO!pf.:rosIH!9a@Ds5a7A
+ro47CiSi_Qhr!;ih#Z<crn7_4f[na+f%&:"e'e6C/'uVfcHXSVbK@rJaN)?@`Pod5_SX.)^V@Lr
+]Y(kf\[f5Z[^NTNZa6p@YgrdNS,Ker\G3Q.\GNi:Es-N'EH#jqD@gZ$CMR["BkV0mB4b^dA7T3L
+@KBnFra5\3!+#S/s'#J,r`T8's&]2#s&K(ur_rhps&&\js%iYir([/as%E5]rCQuZq+(?Pr'g6G
+q*Y'HaoD@RiP#:[r^HiVrC6o[8P/nR!D?,c9n#i5:f("e;c?Xq<``C+>$G6;?=.)L@Us%^BPD3s
+D/O93EccGJG^4U_I=Hd!K8#);MN!OUOHPfmQ^F52SXuOLUnsufWiW>+Yd1UC[^`l[]YD8!_o0O7
+aND]NcHsteeCE.%g"P3:h;@/LioB+]k3(smlKdg'mdKW6nc&([oCW%T!quB_rqQNhs8)Zjrqu`n
+o_sFAOT0h~>
+JcC<$OT4tPrr)fnrVQWks7uZhs7ZNerq1.#oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@JL%
+da?Cdbfe/Ma2Q!6^q[Rq]",;YZa-g=XfJJ#Vkg)]TUq[CR@'8(P*(fbN/EIIL4b).Isl]jH$=FR
+F)c/:D/=!%?"7SeGCGC6Q26dHQi36KQgC"=Q'D62rf[5Brf[&=rf[;Dr/q,FP*5d-rf[8CqN1Q7
+r/UZ6rJpf7!KE$9MZ8V*N;nh9MYrA6N/NYoNW"h9NW"h7NVnh9O8b1;Nrk?&Nr+nfaihoQcHstf
+eCE1&g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCMVRo`Fj]p\jmeq>^<gqu-HirT=+TrVQNe
+qu-Bjq>0mcp\smap&F[aoDJ1Znc/+Wn,MeUmJZAQlg!d7l2TrIkPjWDjT+B@is4T&iS`YOhqn@g
+!SlH/g'ZNcf@SU)e^W*tdf.Wqd*L"_c-4ASb/q`Ga2c3=`Pf[2_SO%&^V7Co]Xtbc\[],W[^EKK
+Za$a=f%8R-g"P07gt^`AhV[8MioB+\k3(sll07Kulg*p)mI'E2nF?)@oC_hOqf_CerJ^W5s)S<`
+EH,r9rb`9aChmg$C2%?pB4kgfARo=]raGn:@/aO5?3":1>lS".>5h\)=T;J%<rZ2"<;ohr;ZBVl
+;#a>k:Adic9`Ic_9)V?\8GPdR7f5^I7/94J6HT9,No?$!7/fXT7f>gY84cDP8c_RYr_7i::Jakb
+;H$Ln<E<1'=^#$7?!^lG@U`kZAnYmnCMds-EH6/DGBeCZI!pKpJqJc4M2I7OO-#NgQ'[l,S"6.E
+U84W`W2cr$YHY==[C3TU]=bno_Sa=2a2lEHc-F\`daZguf@em4h;-uHiSrnYjlYail0@U$m-a?2
+nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s,d82~>
+JcC<$OT4tPrr)fnrVQWks7uZhs7ZNerq1+"oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@JL%
+da?Cdbfe/Ma2Q!6^q[Rq]",;YZa-g=XfJJ#Vkg)]TUq[CR@'8(P*(fbN/EIIL4b).Isl]jH$=FR
+F)c/:D/=!%6:=4184H<Lo2,B]nkf6[!DZGh:&n)a:B"&d;#a>h:B"&]:Adli:/=VZp.kN]r_Dr^
+s&JhnqG[DlqbmJmqG[Dnr`/nt!*/Shs&B%ur`(GibKS5Vd*^=le^rF+g=tH>hr*JQj5f=akNM0q
+lg4!*mdKW6nac8BoCW%T!quB_rV6Egs8)WirVZQkk5P2Tqu$3crVHNhqY:'arq?9_s7H?_r:9mX
+s7$!Us6]mSrTjUOlK\B5s6'IGroX7B!9F.>#NF_$i8EMMhYu=3gtVh^$JF(`f@JO'eC;sqrm<[O
+cd'h\bfe2PaiMQDa2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZ*:HUGB\:VH$O^_H[L5?IK+ct
+J:[]Os+:u<KnY89LPUbCM2I1KN/WaVO,oG#6N'gM;u9PoEs-N'EH#jqD@gZ$CMR["BkV0mB4b^d
+A7T3L@KBnFra5\3!+#S/s'#J,r`T8's&]2#s&K(ur_rhps&&\js%iYir([/as%E5]rCQuZq+(?P
+r'g6Gq*Y'HaoD<>i`#nGr^HiVrC6o[8P/nR!D?,c9n#i5:f("e;c?Xq<``C+>$G6;?=.)L@Us%^
+BPD3sD/O93EccGJG^4U_I=Hd!K8#);MN!OUOHPfmQ^F52SXuOLUnsufWiW>+Yd1UC[^`l[]YD8!
+_o0O7aND]NcHsteeCE.%g"P3:h;@/LioB+]k3(smlKdg'mdKW6nc&([oCW%T!quB_rqQNhs8)Zj
+rqu`no_sFAOT0h~>
+JcC<$OT4tPrVc`nr;6Nj!;ZTgEqf;$p%@tKoCDJBnF,i5m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$^9XK&4sV50iYSt2@=R$O#$OcPN]Mi!4DKS+i+IXQNfGBS(M
+EcH#8Chmd$DfpJaQ)(h6r6Y5dnB_focHa\Ybfe,La2Z*:_nj.&]tOBWqn<!As1A6@s1AEH]Y+3V
+s1ABE])92>]`5VD])T;B]",EJ\c95@]DfAD\[o5Xr3uX5!k#AArj24%s0;I*s0;I,n$</&Za-pD
+rNuO0rj4Ddb0/&TcdC1jeCN7(g=k?<hVd>Oj5]7`k32'olKdg'mdKW6nF?)?oCV\Jp%J+Rp\ssf
+q>U6gqu-HirT*tRrVQNequ-Bjq>0mcp\smap&F[aoDJ1Znc/+WmfMqEmJZAQlg!d7l2TrIkPjWD
+jT+B@is4T&iS`YOhqn@g+Pb`*g=b03f@SU(e^W*tda?Ihd*L"_c-4ASb/q`Ga2\+t(W=5._SO%&
+^V7Co]Xtbc\[],W[^EHJZIAjNS,Tns\G<W/\G3T<F)l8?E,Y_n&8c6!CMITuBP;$kAn>OaA7PUJ
+!F]C8?iOF4?2e+/>6%k+=oVV(=8l8#<W?%t;u]bq;>a8j:]F2f:&[id9D_?[8cD9V8,YpT7J'"C
+6iTKorrB_1]`>eD^$3927K,dU8,l-[8cME_97BQ/9hnGZ:f("e;cHat<``F,>$P<<?XI5N@qB4a
+BPD6uD/O<4F*)PKG^=^bIXm!%KSG8=MN!RVOckroQ^F84StD^NUo(&hWiW>+Yd:^F\%0)_]t_A"
+_o9X:aihoRcHstfeCE1'g"P6;hV[8Mj5]7`k32'olKmm)mf2_`nF?)?oCV\Jp%J+RrV-BgrqcQi
+rqucoo_sFAO8j_~>
+JcC<$OT4tPrVc`nr;6Nj!;ZTgEVK2#p%@tKoCDJBnF,i5m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$^9XK&4sV50iYSt2@=R$O#$OcPN]Mi!4DKS+i+IXQNfGBS(M
+EcH#8Chmcj?Y!njG_(eMQN!6NQMm08Q3!88rfd>ErK7)BplYN<!0R)?rKI5DrfR#<r/Ul=O8P%9
+NW"k=NK0"oN;nh9MZ8V6Mu\e/N;ne9MZ&G9N/`dTNUr,/NVne?O,f9\NfNprrfAjqb0/&TcdC1j
+eCN7(g=k?<hVd>Oj5]7`k32'olKdg'mdKW6nF?)?oCV\Jp%J+Rp\ssfq>U6gqu-HirT*tRrVQNe
+qu-Bjq>0mcp\smap&F[aoDJ1Znc/+WmfMqEmJZAQlg!d7l2TrIkPjWDjT+B@is4T&iS`YOhqn@g
++Pb`*g=b03f@SU(e^W*tda?Ihd*L"_c-4ASb/q`Ga2\+t2T3MM_SO%&^V7Co]Xtbc\[],W[^EHJ
+ZIIIVf@\d0g=k<:gtgfChr*JQj5f:`kNM-olK[^$rp1$[mdBQ5nac;Dp%J1XG41FhN;/A9F)l8?
+E,Y_n&8c6!CMITuBP;$kAn>OaA7PUJ!F]C8?iOF4?2e+/>6%k+=oVV(=8l8#<W?%t;u]bq;>a8j
+:]F2f:&[id9D_?[8cD9V8,YpT7J'"C6iTKorrA&WNW>.;Np2W)7K,dU8,l-[8cME_97BQ/9hnGZ
+:f("e;cHat<``F,>$P<<?XI5N@qB4aBPD6uD/O<4F*)PKG^=^bIXm!%KSG8=MN!RVOckroQ^F84
+StD^NUo(&hWiW>+Yd:^F\%0)_]t_A"_o9X:aihoRcHstfeCE1'g"P6;hV[8Mj5]7`k32'olKmm)
+mf2_`nF?)?oCV\Jp%J+RrV-BgrqcQirqucoo_sFAO8j_~>
+JcC<$OT4tPrVc`nr;6Nj!;ZTgEVK2#p%@tKoCDJBnF,i5m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$^9XK&4sV50iYSt2@=R$O#$OcPN]Mi!4DKS+i+IXQNfGBS(M
+EcH#8ChmcO5t4=77S-AK;#3uZ;#3ud:&n)`:B"&d;#a>i:B"&\:Amue:&n#_:Adoe:'=9d;GpH^
+;ufqn<;TVo;YsDl;Yj>l<<#tt<WH.r<;fhq<;ffNb0/&TcdC1jeCN7(g=k?<hVd>Oj5]7`k32'o
+lKdg'mdKW6nF?)?oCV\Jp%J+Rp\ssfq>U6gqu-HirT*tRrVQNequ-Bjq>0mcp\smap&F[aoDJ1Z
+nc/+WmfMqEmJZAQlg!d7l2TrIkPjWDjT+B@is4T&iS`YOhqn@g+Pb`*g=b03f@SU(e^W*tda?Ih
+d*L"_c-4ASb/q`Ga2\+t,K.L:_SO%&^V7Co]Xtbc\[],W[^EHJZ?185GB\:VH$O^_HiABrIXQ]q
+J:[]Os+:u<KnY89LPUbCM2I1KN/WaVO,oG#6N0mN;ts;qF)l8?E,Y_n&8c6!CMITuBP;$kAn>Oa
+A7PUJ!F]C8?iOF4?2e+/>6%k+=oVV(=8l8#<W?%t;u]bq;>a8j:]F2f:&[id9D_?[8cD9V8,YpT
+7J'"C6iTKos8,gn;s@9]7K,dU8,l-[8cME_97BQ/9hnGZ:f("e;cHat<``F,>$P<<?XI5N@qB4a
+BPD6uD/O<4F*)PKG^=^bIXm!%KSG8=MN!RVOckroQ^F84StD^NUo(&hWiW>+Yd:^F\%0)_]t_A"
+_o9X:aihoRcHstfeCE1'g"P6;hV[8Mj5]7`k32'olKmm)mf2_`nF?)?oCV\Jp%J+RrV-BgrqcQi
+rqucoo_sFAO8j_~>
+JcC<$O8nnPrVc`nr;6Njs7uZhEqf;$p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]iS`SKgtUQ8f@JI#
+dEp1`bfe,L`l5j3^V7@m\[])TZa$a;XfA@uVPKr[T:VO@R$X)%P)t``Mi!7EKnFr,IXQQhG^":P
+EcH#8D/3m"Bl\KLN1$]drQt>enBh3]&C/PFbfn5Na2Z*:_ns4(^:jKXqn<!As1A6@s1A?Frk/6D
+s1ABE])92=]Ec'[\[f;^\[qUIq76U;])B&C\%&rW\@B#W[f3]6ZiIH1ZN%9,Z3@M;Yd(F:riu4'
+o!8D'Za9Y<!42[3-aU1ebKS8Wd*^=le^rF+g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nc&([oCW%T
+!quB_rV6Egs8)WirVZTlir8cPqu$6drVHKgqtU0brq?9_rq-6^rUU!Ys7$!Us6fpSrp9[Ns6BUJ
+s6'IGroX7B!9F.>!TN);i"4f&hVI#CgtUQ:g"G$0f@JLOe/$N]dF$=ecd'h\bfe2PaiMQD`l5p8
+_u@L`_8*h#^:h1l]=PP_\$i`Qd/X$5rjVp;qR?4/p:1?JEcH)<DuOVcD/=!'C2%BqBP1phAS#C_
+A,]p<@:9(As'>\2r`fM/>$Co.s&]8&rDrqus&Atrs&/korD<Jhs%`Jds%NDbqb$iZrCH`SrC6]R
+oL/IAa8c.Nrk/*@lb<Bfs$lrWs%!,]r_!2`IS<I1:/=\_;,U=k<)lt"=BSd2>[1TB?t!MSAS#Lf
+BkqO&DfB];FEVkRH@1-iJ:`E-L5:\EN/is]P*M?#R@B_<TV8-VVPgDoXfen5Za@0M\\#Mg^VRe*
+`Q$!@bKS8XdF$Fmf%8R.g>(N@i8EVTj5oFdkiq?tm-O--s6g?bnac8Bo^qhLp@e7[q#C0iqY^6i
+r;HTdrdk*1s*t~>
+JcC<$O8nnPrVc`nr;6Njs7uZhFSGM&p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]iS`SKgtUQ8f@JI#
+dEp1`bfe,L`l5j3^V7@m\[])TZa$a;XfA@uVPKr[T:VO@R$X)%P)t``Mi!7EKnFr,IXQQhG^":P
+EcH#8D/3m">[_2]FaAh-QBqH8!1*PLlBVI9Pl?mFP5^UDP4k%;P5g[?P5^[EP5UO>OSk.?NfX*u
+qi1N6!KE-=NVAA6Mi*FNrf$i7oo/m.!fW%rrJgf8s,6Z2s,Hr:rf7&=rJiFiNfT6_O-#IHbg+M\
+dF6Uqf@S^0gYL]Ci8N\UjQ5OekiqBum-O--n*fc9rpg*]o`"Lbp@n=[q#C0iqYU0gr;?NQrqZNi
+r:p0fqYg6eq#:$epAFU_o`+O]o)J7[nGVhUmf2\Rm/QDOlMg&JkQ'fFk5XNCjSn0?io0mp&Du@$
+h;-lAgY1B7g"=p.f%'cL(=U^ZdEp4ccHa\YbKJ&MaN2EA`Pod5rk^q:^q[Xu]tD"i]",>[[^NTm
+e'umuf%8R-g"P07gt^`AhV[8MioB+\k3(sll0@R"lKmm)mI'E2nFH/Ao_%qQr-%Lfrf$Q1"`n^(
+EH#jqD@gZ$CMR[!BkV0mAnGUcA7T3L@KBnFra5\3!+#S/!aAi3r`T8'!*B,"s&K(ur_rhps&&_k
+r_NPhr([2br_*,\r^m&Zq+(BQr'g6Gpd<+%rf-Z4l];'7s$lrWs%!,]r_!2`IS<I1:/=\_;,U=k
+<)lt"=BSd2>[1TB?t!MSAS#LfBkqO&DfB];FEVkRH@1-iJ:`E-L5:\EN/is]P*M?#R@B_<TV8-V
+VPgDoXfen5Za@0M\\#Mg^VRe*`Q$!@bKS8XdF$Fmf%8R.g>(N@i8EVTj5oFdkiq?tm-O--s6g?b
+nac8Bo^qhLp@e7[q#C0iqY^6ir;HTdrdk*1s*t~>
+JcC<$O8nnPrVc`nr;6Njs7uZhEVK2#p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]iS`SKgtUQ8f@JI#
+dEp1`bfe,L`l5j3^V7@m\[])TZa$a;XfA@uVPKr[T:VO@R$X)%P)t``Mi!7EKnFr,IXQQhG^":P
+EcH#8D/3m"5sn".7n-2I;#*oY;#*oX:B"&d;#a>i:B"&\:Adoe:&n#^:Amud:'OEf<)Z[m;uTbq
+<V'2i<Vobm;u]bm;uKVi;u]f!<E<.#qGd;k-WF)GbKS8Wd*^=le^rF+g=tH>hr*JQj5f=akNM0q
+lg4!*mdKW6nc&([oCW%T!quB_rV6Egs8)WirVZTlir8cPqu$6drVHKgqtU0brq?9_rq-6^rUU!Y
+s7$!Us6fpSrp9[Ns6BUJs6'IGroX7B!9F.>!TN);i"4f&hVI#CgtUQ:g"G$0f@JLOe/$N]dF$=e
+cd'h\bfe2PaiMQD`l5p8_u@Lo_8*h#^:h1l]=PP_\$i`QF)uGFG'8(RG^+LZH@(#<Hld`bIt*!"
+JqAW-KS5&5L5(J>Ll$tGMMmFPNK0'\Oo.QF;XRKX<!H9BEcH)<DuOVcD/=!'C2%BqBP1phAS#C_
+A,]p<@:9(As'>\2r`fM/>$Co.s&]8&rDrqus&Atrs&/korD<Jhs%`Jds%NDbqb$iZrCH`SrC6]R
+oL/IAa8c$:!*&holW!mQs$lrWs%!,]r_!2`IS<I1:/=\_;,U=k<)lt"=BSd2>[1TB?t!MSAS#Lf
+BkqO&DfB];FEVkRH@1-iJ:`E-L5:\EN/is]P*M?#R@B_<TV8-VVPgDoXfen5Za@0M\\#Mg^VRe*
+`Q$!@bKS8XdF$Fmf%8R.g>(N@i8EVTj5oFdkiq?tm-O--s6g?bnac8Bo^qhLp@e7[q#C0iqY^6i
+r;HTdrdk*1s*t~>
+JcC<$O8nnPrVc`nr;6Njs7uZhs7ZNerq14%oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLh:pZ:f@JI#
+da?Cdbfe,L`l5j4^q[Rq\[])UZa-g<XfJJ"VPKu\T:VRBR$X)&P)t`aN/EFGKnFu-Isl]jH$=FR
+F)c/:D/3p$C2@s;Kp&1:bg=`3dI5Eocd'h\bfn8PaN)<=_ns7*^:jHWr4W*Bs1A6@"hVF\]tD#V
+]`>_A]D]AC]=RsO!4qp8qmlsA]"5G^\brl9\,<`>\[],X[^Q1C!4;[0rj2C*s0;R-s0;.#rj)^4
+Za6t7Zhq*aZa@p#cHjndeC<($f\5*8h;7)JiT&t[k2tjkl0@U$m-X60n*ol<o(2MGp%A%Pp\4[^
+s7uZjqtp?ir;GURq>L3gq"t$drV??crqHEcr:U']s7?3[s7--YrU9dSs6]gPs6K^MrosIH!9a@D
+!p/M(ro4%=iVqaHhqm5Gh;$f?g=k64f[na+ec+&%e'cXkd*M^:*R2gObK@rJaN)<>`Pf[2_SO%&
+^V7Co]Xtbc\[],os8AGd\,No7\+dE(\HHqmEH#jqD@gZ$CMR[!BkV0mAnGUcA7T3L@KBnFra,_5
+?![G7!aAi3r`T8'!*B,"s&B%urDW_os&&_kr_NPhr([/as%E5]rCQuZq+(?Pr'g6Gr'SI'rO`'A
+q7Z10!_#RJrC6o[8P/nR!D?,c9n,o6:f("e;c?Xq<``C+>$G6;?=.)L@Us%^BP;-rD/O93EccGI
+GBnL^I=Hd!K8#&9M2[FTOHPfmQC+,1SXuLJUnsufWiN8)Yd1UC[^`l[]Y;.s_SjF6aND]NcHjnd
+eC<($f\5*8h;7)JioB+]k3(smlKdg'mI'H3nF?PL!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s,[21~>
+JcC<$O8nnPrVc`nr;6Njs7uZhs7ZNerq1.#oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLh:pZ:f@JI#
+da?Cdbfe,L`l5j4^q[Rq\[])UZa-g<XfJJ"VPKu\T:VRBR$X)&P)t`aN/EFGKnFu-Isl]jH$=FR
+F)c/:D/3p$>[LuRE-?_gQM-[0Q33D:PEYs.s,m;Dp5oE>Oco^+qNCf@rf[8Cq2kN8qi:N4rf-u<
+r/U`8qMYE6repi8r/CT4oS`d.rf$f8rf$f6qMbH6$BC++NfB'[O,f6[rf6r<0TaK&cHjndeC<($
+f\5*8h;7)JiT&t[k2tjkl0@U$m-X60n*ol<o(2MGp%A%Pp\4[^s7uZjqtp?ir;GURq>L3gq"t$d
+rV??crqHEcr:U']s7?3[s7--YrU9dSs6]gPs6K^MrosIH!9a@D!p/M(ro4%=iVqaHhqm5Gh;$f?
+g=k64f[na+ec+&%e'cXkd*M^:*R2gObK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[]-Idk9/#f%/L+
+g"G*6gYCT?h;7&IiSrqZjlYaikiqBtlg!j'mHs?0n*oo=oCV_Lq#,C'NW4t/N<F9AEH#jqD@gZ$
+CMR[!BkV0mAnGUcA7T3L@KBnFra,_5?![G7!aAi3r`T8'!*B,"s&B%urDW_os&&_kr_NPhr([/a
+s%E5]rCQuZq+(?Pr'g6Gr'SI'rJgN2m>h<;7Rm>H!_>mSr^m2a9`@b9:/=\_;,U=k<)lt#=BSg3
+>[:ZC?t*SUAS,UhC27[(DfKf>F`qtSH@1-jJ:`E-L5:\FNK90aPEhH$R[]k>TV80XVl6VrXfen6
+ZaI6O\\#Mg^VRe*`Q-'BbK\>YdF-Oof%8R.gYCWAi8EVTjQ5OekiqBum-O--n*fc9s7-3^o`"Lb
+p@n=\q#C0iqY^6ir;HTdrdk*1s*t~>
+JcC<$O8nnPrVc`nr;6Njs7uZhs7ZNerq1.#oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLh:pZ:f@JI#
+da?Cdbfe,L`l5j4^q[Rq\[])UZa-g<XfJJ"VPKu\T:VRBR$X)&P)t`aN/EFGKnFu-Isl]jH$=FR
+F)c/:D/3p$5X@h,7nQ?J:]+&a:\%?Y:[q3Z:]+&h:]*ue:\.?[:]=,h:%qB`:Jh$dr_<Vk:/4MX
+:B"5l;uTbo<V9>j<W#es;c<9erDNAgr`/eo!EE1s<A2P?cHjndeC<($f\5*8h;7)JiT&t[k2tjk
+l0@U$m-X60n*ol<o(2MGp%A%Pp\4[^s7uZjqtp?ir;GURq>L3gq"t$drV??crqHEcr:U']s7?3[
+s7--YrU9dSs6]gPs6K^MrosIH!9a@D!p/M(ro4%=iVqaHhqm5Gh;$f?g=k64f[na+ec+&%e'cXk
+d*M^:0$VV`bK@rJaN)<>`Pf[2_SO%&^V7Co]Xtbc\[]+hF)uGFF`qqPGBeCYH?spbrd=`os*t'"
+s+:9's+LE+s+V#=LkpnEMMmCON/`jYO-0B-r_i/_p/M#i"EJL%E,Y_n&8c6!CMIQtBP;$jAn>Oa
+A7PUJ!F]C8?NOP>?2e(1>?Y50=oVS(=8c2"<<-"s;u]bq;>j>j:]F2f:&[id9D_?[8cD9V8,PjS
+7J'"G6cK*%<<-"p;sdNc77KcF7fl4Q8cD<_92,=ZInid9:f1+h;cHat='/U/>?kH??XR>PA7]@d
+BPM="DJsN8FEMbNH$XjdIt3-'KnbD?N/`m[P*;/sR$sM8StMdQV5L8lX0&P/ZEpsI\@K5a^;%M$
+`5Td<b0/&TcdC1jeCN7(g=tE=hVd>Oj5f=akNM0qlg4!*mdKW6nc/.\oCW%T!quB_rqQNhs8)Zj
+rqu`no_sFAO8j_~>
+JcC<$O8nkOrr)ior;6Njs7uZhs7ZNerq1.#oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@JL%
+da?Cdbfe/Ma2Q!6^q[Rq]",;YZa-g=XfJJ#Vkp/^TUq[CR@';)P*(fcN/EIIL4k//Isl]jH$=FR
+F)c/;DJX*&BPD@/IuBYl\+\5=d/VE'cHXVXbf\#I`l5m6_SEq#^&>V@^&PbF]DT5C]Y2"k]`#PD
+]E,XUqn)m@!kZ%Tr4)g=q76C6$G!aY]",>\\$WQNrO)^8r4)d;s1&*<!4Mm7!OT34ZMLp)ZMh&t
+Z2q;;rj)[3Za0J7r3R]mcHjkbe'uq"f\,!5h;7&IiSrnYjlYail0@U$m-X60n*olHncA@Srq-?d
+p\4X]s7u]kqtp?ir;GOPqYg9gq"t$drV??crqHEcr:U']s7?3[s7--YrU9dSs6]gPs6K^MrojLJ
+kNDj,!p/M(ro4%=iVqaHhqm5Gh;$c>g=k64f[na+ec+&%e'cXkd*M^:)U6LLbK@rJaN)<>`Pf[2
+_SO%&^V7Co]Xtbcbl@[3rjVj9r3uF1n[TZ\EH,r9DJj<.Chmg$Bk_6oB4baeARo=]@U`bS@/aL7
+?<pk9>QS,5>5h\)=9)G$<rZ/"<;fbq;ZBVm;#X8j:Adid9`@]^9)_E\8GPdS7f,XH7/oWls89M,
+]_fAD^:h5N^A^V$8,l-[8cD>392&&S:/4S]:f1+h<)lt"='8[0>?kH@?X[DRA7]CeBkqL$DK'T9
+FEMePH@('hJ:W?+L51VCN/`m[P*D5uR$sM9T:r!TV5L8lXKA\1ZEpsI\[oGe^VI_(`Q$!?b0/&T
+d*^:ke^rF+g=tH>hr*JQj5f@bkNM0qlg4!+s6g!Xnc&([oCW%T!quB_rqQNhs8)Zjrqu`no_sFA
+O8j_~>
+JcC<$O8nkOrr)ior;6Njs7uZhs7ZNerq1.#oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@JL%
+da?Cdbfe/Ma2Q!6^q[Rq]",;YZa-g=XfJJ#Vkp/^TUq[CR@';)P*(fcN/EIIL4k//Isl]jH$=FR
+F)c/;DJX*&BO,"XCNFfSN:rV'Q33D:PEYp-!0R8Dp5oE>Oco^+qNCf@rf[8Cq2kN8qi:N4rf.&>
+NfEssqi1H2s,Hf4rJU-'rf-r:qhtB2s,@DHNK0!YNK9-\NfB%sN[0\0cHjkbe'uq"f\,!5h;7&I
+iSrnYjlYail0@U$m-X60n*olHncA@Srq-?dp\4X]s7u]kqtp?ir;GOPqYg9gq"t$drV??crqHEc
+r:U']s7?3[s7--YrU9dSs6]gPs6K^MrojLJkNDj,!p/M(ro4%=iVqaHhqm5Gh;$c>g=k64f[na+
+ec+&%e'cXkd*M^:)pQUMbK@rJaN)<>`Pf[2_SO%&^V7Co]XtbcdJVH4eCE.$f\"m1g=tB;gtgfC
+hr*MRjQ,FbkNM-orTaFLs6]jS#k.<So(2MHpA"W1m#;"(nVnQ0EH,r9DJj<.Chmg$Bk_6oB4bae
+ARo=]@U`bS@/aL7?<pk9>QS,5>5h\)=9)G$<rZ/"<;fbq;ZBVm;#X8j:Adid9`@]^9)_E\8GPdS
+7f,XH7/oWls87lMNWP9%Nq/817fGpX8H29\8q0K-9heAX:Jakb;H$Op<`W:)=^#$7?!grI@Uiq[
+B4u!pCMds.EH6/DGBeF\I=?]tK7nu7M2I7OO-#NhQ'[l,S"?7GU84W`W2cr$YHY==[C3WW]Y2(q
+_Sa@4aN2NIc-F\`daZh!f@em4h;-uHiSrnYk2tjjl0@U$m-aoB!V#XYncA@Srq-?dp\4[^s7u]k
+r;6KkrVcBfJcCf2J,~>
+JcC<$O8nkOrr)ior;6Njs7uZhs7ZNerq14%oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@JL%
+da?Cdbfe/Ma2Q!6^q[Rq]",;YZa-g=XfJJ#Vkp/^TUq[CR@';)P*(fcN/EIIL4k//Isl]jH$=FR
+F)c/;DJX*&BL5!P7Rp!A9i+[Z:\.EY:\%9[:]+&h:]*ue:\%9Z:]=)h:%qE\:]=)p9hnDX9heAX
+;u9Mo;uK\o<V9>h<W5qt;uBPg;uT\h;tj5k<W6%u<?o`5cd:(geCE1'g"P3:hV[8MioB+]k3(sm
+lKdg'mI'H3nF?MK!V>s_o`Fj]p\jmeq>^<gqu-HjrSRVNrVHHequ-Biq>9sdp\smap&=U`oDS7[
+nc/+Wn,MhUmJcJPli68LklU)3kPjTFjlGM%irS/urnn@FhVR)EgtUT;g=b-2f@SU(rmV,#da?Ih
+ci23/c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=POlrc0$#FEDYKG'A.TH$O^^H[L3fI!pEmIt<0&
+JqJ]/K`6Z9L51S@M2@+JMi<XTNfT6`r^-T^mSigYr)4VVEH,r9DJj<.Chmg$Bk_6oB4baeARo=]
+@U`bS@/aL7?<pk9>QS,5>5h\)=9)G$<rZ/"<;fbq;ZBVm;#X8j:Adid9`@]^9)_E\8GPdS7f,XH
+7/oWls7oXp<;KMp<)Z`d<;oAd8,l-[8cD>392&&S:/4S]:f1+h<)lt"='8[0>?kH@?X[DRA7]Ce
+BkqL$DK'T9FEMePH@('hJ:W?+L51VCN/`m[P*D5uR$sM9T:r!TV5L8lXKA\1ZEpsI\[oGe^VI_(
+`Q$!?b0/&Td*^:ke^rF+g=tH>hr*JQj5f@bkNM0qlg4!+s6g!Xnc&([oCW%T!quB_rqQNhs8)Zj
+rqu`no_sFAO8j_~>
+JcC<$O8nkOrVc`nrVQWks7uWg!Vc<eo`=^VrpjdnnF,f4m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$^9XK&7tV50iZSt2@>R$O#$P)kW^Mi!7EKS+i+IXQQhG^":P
+EcH#8D/3m"B5DX7JrlP*bkTTSck4ULcHXSWbK7lH`l,d3_8*dur4Ms@rk/9CrOW$A!kl7Zr4N*C
+qRc^=!P>r6\c95@\c02?\Hf^V\@B#W[^H+A!4Dd6!4Vp:!P,f@\c0)>\$l:D!jo;>r3QF1!42O-
+s0;4%s0Ma2rj)X2Zhgs-Zi.6Pc-F\`daZdtf@\g3gtgiFi8WeWjlY^hl07L!m-O-=mgS^Uo()DE
+o_%nNp@n=\q#C0hqY^6hr;?NLrqcTjr:g*eqYg6eq#:$epAFU`o`"I\o)J7[nGVhUmf2\Rm/QAO
+lM]rKki_..jp1#/jQ#:[io0mp!T2c5h$2ZhgY1B7f`'JJf%&:"e'lamdEp4bcHXVXbKJ&MaN2EA
+`Pod5_SX.)^V@Lr]ZU9RS,]tp\G`o2\F6sK\8cM-Df0H0D/=!'C2%BqBP1phAS#C^@q&nU@:9(A
+!a]/<r`fM/>$Co.s&]8&rDrqu!*&nqs&/korD<Jhs%`Jds%NDbqb$iZrCH`SrC6]RoL&[H_uKSF
+r4Mg<o=b2orC?lY!(m/^HV7%+9heAY:f("e;c?Xq<`W=*=^,-9?=.)K@Uit\B4u!pCi4-0EH?5F
+GBnL]I=?]tK7nu8M2R=QO-,TiQ'du/S=Z@HUSOcbWN*&%Yd(OA[^WfY]Y2(q_Sa@4aN;WLcHaea
+e'uq"f\,!6h;7&IiT&tZk2tmlkn<:Im-X60n*ol<o(2JFp%A%Pp\jmeq>^<hqu6NlrUp/@s,R,0~>
+JcC<$O8nkOrVc`nrVQWks7uWg!Vc<eo`=^VrpjdnnF,f4m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$^9XK&7tV50iZSt2@>R$O#$P)kW^Mi!7EKS+i+IXQQhG^":P
+EcH#8D/3m"B3\n[Dg-\dQ2$^1Q33D:P`u'/!0R8Doo]6:rfR)@r0.,CrfR#<rK$f8qMkK7s,Hl8
+rf$o:rJgZ4rJgW3rep0&!f`.tqMYB5s,?r:!0$l:rf7&=r/MiCcHsteeC<($f\5*8h;7)JioB(\
+k2tmll0@U$m-Xf@%.NfXo(2MGp%A%Pp\4[^s7uZjr;6Hjr;GINqYg<hp\XpcrV??crqHEcr:U*^
+rq$*Zs7--YrU9dSs6]gPs6B[MrTOCIkNDj,#Nb%-j5].YiVqa9hqn@g#2Itfg=k64rmrRLe^W*t
+e'cXkd*L"_c-=JUbK@rJaN)<>`Pf[2_SO%&^V7Cod*U1fr6lV7e^i=(f\+s3gY:N=h;7#Gi8WbW
+jQ5Oekih:1l43.Hm-X3.mdK]:o(2MHp\o?gNW3u:E,TW3D/F*)CMIQtBP;$jAn>Oa@q/tW@:<RC
+?NOP>?2e(1>?Y50=oVS(=8c2"<<-"s;u]bq;>j>j:]F2f:&dod9D_?\8c;3U8,YpT7J&tJ6c8s#
+NUr2%NrVZJ8,l*[8cD>/92&#R9hnJ\:f1+h;cHat<`iL->?kE>?XR;O@qB4aBPD6uDJjE5F*)SL
+H$XgcIXm!%KSG;>Mi<[WOckroR$jG6StD^OUo(&hWiW>,Z*UgG\%0)_]t_A"_o9X:aihoRcHstf
+eCE1'g"P6;hV[8Mj5]4_k32'o''efLmI'H3nF?)?oCMVIp%J+RrV6Egs8)Zjrqu`np&9OBNrOV~>
+JcC<$O8nkOrVc`nrVQWks7uWg!Vc<eo`=^VrpjamnF,f4m-O''l0.<mjlGI]i8EJJgtLH6f@AC!
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$^9XK&7tV50iZSt2@>R$O#$P)kW^Mi!7EKS+i+IXQQhG^":P
+EcH#8D/3m"B0epR7S-'CoM>$SqG.,e:\.?]:]!ug:]4&f:\%9Z:]=,h:&%K`:BF?g:]4&g9a=Ef
+9hnDX:K7<lp/Luj!`W0"q,I2j!E<"m;XIEY;ufqt<Zb>dcHsteeC<($f\5*8h;7)JioB(\k2tml
+l0@U$m-Xf@%.NfXo(2MGp%A%Pp\4[^s7uZjr;6Hjr;GINqYg<hp\XpcrV??crqHEcr:U*^rq$*Z
+s7--YrU9dSs6]gPs6B[MrTOCIkNDj,#Nb%-j5].YiVqa9hqn@g#2Itfg=k64rmrRLe^W*te'cXk
+d*L"_c-=JUbK@rJaN)<>`Pf[2_SO%&^V7CoE,T]7rc/HhFEDYKG'A.TH$O^^Hi8?lIK+fsJcC?%
+K+iolKnb;9LPUbCM2I4LN/`gWO-'?-s&/5_oi1cds)ArrDf0H0D/=!'C2%BqBP1phAS#C^@q&nU
+@:9(A!a]/<r`fM/>$Co.s&]8&rDrqu!*&nqs&/korD<Jhs%`Jds%NDbqb$iZrCH`SrC6]RoL&[H
+_uKI2!*&\ko2G]ZrC?lY!(m/^HV7%+9heAY:f("e;c?Xq<`W=*=^,-9?=.)K@Uit\B4u!pCi4-0
+EH?5FGBnL]I=?]tK7nu8M2R=QO-,TiQ'du/S=Z@HUSOcbWN*&%Yd(OA[^WfY]Y2(q_Sa@4aN;WL
+cHaeae'uq"f\,!6h;7&IiT&tZk2tmlkn<:Im-X60n*ol<o(2JFp%A%Pp\jmeq>^<hqu6NlrUp/@
+s,R,0~>
+JcC<$O8nkOrVc`nr;6Njs7uZhF8,D%p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLK7f@JI#
+dEp1`bfe,L`l5j3^V7@m\[])UZa$a;XfA@uVPKr[T:VO@R$X)%P)t`aMi!7EKnFu-IXQQhG^":P
+EcH&9D/3m#BPVF-I#4)`[.r&<d/VE&cHXVXbf\&K`l,d3_SEq#r4Mp?s1JBDrON0E]Y2"k]`#PD
+]_f;J]Xthh]=PS`\[f6E\c')C\[o>_\[h^L!4Vp8s0_d3rjMj9rj`!=!4r0?rO<$?[^NTO[/RB4
+['Tb=n$;u"!4)R0!4)L.qm%NS['\-)d*^=le^rI,g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nc&([
+oCW%Ts7QHerV6Egs8)WirVZTlh#@0Kqu$3crVHNhqY:'arq?9_s7H<^rUU!Ys7$!Us6fpSrp9[N
+!:'OI!pJh1roOIIjQ,@]io8qrhuV`lrnRV1g]#n-g"?;U%bB1[eC2mpdF$=ecHa\YrlYeoaiMQD
+`l5p8_ns:,^q[qis-s%tqRHO6ppfb&rj_uJ$?0p$DJa3+CMR[!rb)=FB)Z?HA7K+Y@UW\Qra,_5
+?![G7!aAi3r`T8'!*B,"s&B%urDW_os&&_kr_NPhr([2br_*,\r^m&Zq+(BQr'g<I_>j>Cqn2a<
+otCDqr^ZuZs%32^!D?,c9n,o6:f("e;c?Xr<``C+>$G6;?=.)L@Us%^BP;-rD/O93EccDHGBnL^
+I=Hd!K8#&9M2R=ROHPfmQC+)0SXuLJUSOfdWiN8)Yd(OB[^`l[]Y;.s_SjF6aND]McHjnde'ut#
+f\5'7h;7)JioB+]k3(sml0I^&mI'H3nF?PL#P7T[p%A%Pp\ssfq>^<hqu-HlrUg)?s,R,0~>
+JcC<$O8nkOrVc`nr;6Njs7uZhFSGM&p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLK7f@JI#
+dEp1`bfe,L`l5j3^V7@m\[])UZa$a;XfA@uVPKr[T:VO@R$X)%P)t`aMi!7EKnFu-IXQQhG^":P
+EcH&9D/3m#BO"qUBQABMMO+()lBVO;Pa%C-P4aq=P*(q+Oo(=?PQ$aEOnk+;O8=n5NW+q>NK0"n
+Nr=t:N;nn5N;\b6N;nn;Mu\e)N!,&tN/NYlMZA_8N<"q6N<#"<O8k7?N?ZZod*^=le^rI,g=tH>
+hr*JQj5f=akNM0qlg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)WirVZTlh#@0Kqu$3crVHNhqY:'a
+rq?9_s7H<^rUU!Ys7$!Us6fpSrp9[N!:'OI!pJh1roOIIjQ,@]io8qrhuV`lrnRV1g]#n-g"?;U%
+bB1[eC2mpdF$=ecHa\YrlZ&!aiMQD`l5p8_ns:,^q\.=cd:%ddf%Ype/Hlgf\"m1g=k<9gt^`Bh
+Vd>OioK1^k3(sll2KrMlg4!*rpC*]nac8Bo_%s%G1MZQE=-Z'DJj<-Chmg$C&VcHB4h-S#@q=S@
+U`bS@/aL7?<pk9>QS,5>5h\)=9)G$<rZ/"<;fbq;ZBVm;#X8j:Adid9`@]^9)_E\8GPdS7f5^K7
+)Ap#NW5%<O7nV,NrVZK8,l-[8cD<_92,=ZInid9:f1+h;cHdu='/U/>?kH??XR>PA7]@dBPM="D
+JsN8FED\MH$XjdIt3-'KnbD?Mi<^YP*;/sR$jG7StMdPUo1/kX0&P/Z*UjH\@K5a^;%M$`5Td<b
+0/#ScdC1ieCN7(g=k?<hVd>Oj5f=akNM0plg4!*mdKW6nc/.boCV\Jp%J+RrqQNhs8)ZjrVZZno
+_sFANrOV~>
+JcC<$O8nkOrVc`nr;6Njs7uZhFSGM&p%@tLoCDJBnF,i6mHj0(l0.<mjlGI]i8EJJgtLK7f@JI#
+dEp1`bfe,L`l5j3^V7@m\[])UZa$a;XfA@uVPKr[T:VO@R$X)%P)t`aMi!7EKnFu-IXQQhG^":P
+EcH&9D/3m#BL5'S77Tg<9i:U[o2,3Xo1o9\r)!Dhr(d5enkT0[r_EJfpJ(`b;#X8i:'"'arD!;e
+rD3Gmr)<Gk!`N&tqGmPps&K%tq,IDno2>$Ur)=tB<`[Mld*^=le^rI,g=tH>hr*JQj5f=akNM0q
+lg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)WirVZTlh#@0Kqu$3crVHNhqY:'arq?9_s7H<^rUU!Y
+s7$!Us6fpSrp9[N!:'OI!pJh1roOIIjQ,@]io8qrhuV`lrnRV1g]#n-g"?;U%bB1[eC2mpdF$=e
+cHa\YrlZ&!aiMQD`l5p8_ns:,^qXf+E,]`7EW0u7F*)MHG'A.TG^4R\H@($dI!g?jIt*$#JqAW-
+KS>,7KnbA=Ll$tGMi3ORNfK0^6:+RJmSi^Vq,@<5$?0p$DJa3+CMR[!rb)=FB)Z?HA7K+Y@UW\Q
+ra,_5?![G7!aAi3r`T8'!*B,"s&B%urDW_os&&_kr_NPhr([2br_*,\r^m&Zq+(BQr'g<I_>j4/
+!*&\koi(o\r^ZuZs%32^!D?,c9n,o6:f("e;c?Xr<``C+>$G6;?=.)L@Us%^BP;-rD/O93EccDH
+GBnL^I=Hd!K8#&9M2R=ROHPfmQC+)0SXuLJUSOfdWiN8)Yd(OB[^`l[]Y;.s_SjF6aND]McHjnd
+e'ut#f\5'7h;7)JioB+]k3(sml0I^&mI'H3nF?PL#P7T[p%A%Pp\ssfq>^<hqu-HlrUg)?s,R,0~>
+JcC<$NrSeOrVc`nr;6Njs7uZhs7ZNerq11$oCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JI#
+da?Cdbfe,L`l5j4^q[Rq]"#2VZa-g<XfJJ#VPKu\TUq[CR?s2'P*(fbN/EIIKnFu-Isl]jH$=FR
+F)c/:DJX*&BP2+%H%CsDWkJ8Vn'DZmcHa\Ybfe/Ma2Ps6_SO%%^&>V@^&PbF]D];E]=bhj]Y+3V
+s1ABE])9/J]Xthh]=PP`\@K/[pppF9!P,f?\HTRT\@B#Wr3cU4rO)U2!4Dg7!4Vm9s180>$b3aX
+\@8oT[C*BK[JdH4Zgb:"ZN.B+Zi%*WZd-qFdaZguf@\g3gtgiFi8WeWjlY^hl07L!m-O--n*fc9
+o()DEo`"Lbp@n=\q#:*hqYU0hr;?NIrqcTjr:g*eqYp<eq#:$epAFU`o`"I\o)J7[nGVhUmf2\R
+m/QAOlM]rKki_..joOT)ro=%<!9*q8!T2c5h#Z<crn7D+f`'J4f%&:"e'c[ldEp4bcHXT4b6uJ7
+aN2EA`Pod5_SX:l!h6[.qRHO6ppf_%r4!,SE,TW3D/=$(CMIS_BE;aXrac=F@q/tW@:<RC?NOP>
+?2e(1>?Y50=TV],=8c/$<E)rr;u]bq;>j>k:]=,e:&dod9D_?\8c;3V8,PjS7JT?ds7j5']_T87
+^A^Y&8,u6\9)hP69MJ5V:/=\_;,U=l<E<.%=]np4>[:]D@:E_WAS5[jCMRd)E,fo?Fa&(VH[U?n
+JV/W1LP^nINK90aPa.T&R[]k>Tq\?ZVl6VsXfnt7ZaI6O\\#Mg^VRe*`Q-'BbK\>YdF-Opf%8U/
+gYCWBi8N\UjQ5OekiqBum-O--s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*0s*t~>
+JcC<$NrSeOrVc`nr;6Njs7uZhs7ZNerq11$oCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JI#
+da?Cdbfe,L`l5j4^q[Rq]"#2VZa-g<XfJJ#VPKu\TUq[CR?s2'P*(fbN/EIIKnFu-Isl]jH$=FR
+F)c/:DJX*&BP1RZASu[<Kol.tl';F:P`q=-P4Oe9P5UO?P5UUDP5UO>OSk1:Nqn\7NrG%3Nr=q<
+NfF!r!0-f5s,@#;rf$o:qi13+!/pf7p58p0rJgf8r/L`:.Z]UMcHsteeCE.%f\5*8h;7)JioB(\
+k2tmll0@U$m-X60n*ol<o(2MGrq-?dp\4[^rqZTjqtpBjr;G@KqYg<hp\XpcrqZEcrqHEcr:U*^
+rq$*Zs7--YrU9dSs6]gPs6B[MrTOCIkNDj,!TiDAj8\*=iVqa9hqn@g!SlH/g&]mZrmqY2e^W*t
+daHOjd*L"_c-611,Ke-LaN)<>`Pf[2_TL*Ic-Ob`dF-Lle'lgrf%/L+g"G*5g]#t<h;7#Hi8WbW
+jQ5Oekih:1l4<4Im-X6/n*ff;o(2PIpNG#F$ZU-(DJj<-Chmg$C&VcHB4h-S#@q=S@U`bS@/aL7
+?<pk9>QS,5>5hY+=BAT&<WZ9#<;fbq;ZBVm;#a>j:Adid9`@]^9)_E\8GYjS7f5^N7)/cuNW5%<
+O7nV-O8_ZL8,u6\9)hP69MJ5V:/=\_;,U=l<E<.%=]np4>[:]D@:E_WAS5[jCMRd)E,fo?Fa&(V
+H[U?nJV/W1LP^nINK90aPa.T&R[]k>Tq\?ZVl6VsXfnt7ZaI6O\\#Mg^VRe*`Q-'BbK\>YdF-Op
+f%8U/gYCWBi8N\UjQ5OekiqBum-O--s6g-\nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*0s*t~>
+JcC<$NrSeOrVc`nr;6Njs7uZhs7ZNerq11$oCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JI#
+da?Cdbfe,L`l5j4^q[Rq]"#2VZa-g<XfJJ#VPKu\TUq[CR?s2'P*(fbN/EIIKnFu-Isl]jH$=FR
+F)c/:DJX*&BP0Os6UjU:8l#+Vnkf-Xq+^ocqbI/erD<Jhr(d5enP9'Zr_EJfpeLib!`2Zgr_EGe
+"\qcd:/+L]:]FAm<;]\l<;ohr<<-"d<<6&tmo&aUrDY1FcHsteeCE.%f\5*8h;7)JioB(\k2tml
+l0@U$m-X60n*ol<o(2MGrq-?dp\4[^rqZTjqtpBjr;G@KqYg<hp\XpcrqZEcrqHEcr:U*^rq$*Z
+s7--YrU9dSs6]gPs6B[MrTOCIkNDj,!TiDAj8\*=iVqa9hqn@g!SlH/g&]mZrmqY2e^W*tdaHOj
+d*L"_c-611'["P=aN)<>`Pf[2_JF+.DfBW6E,kkt137PZG'8(RG^+LZH@(!dH[L3hI=HcuJV&K+
+K7nr4L4tD<LkpnEMMmCONK0$[O[;rDmSi[UpeqT#EH#i6DJa3+CMR[!rb)=FB)Z?HA7K+Y@UW\Q
+ra,_5?![G7!aAi3r`K;)=',?$!``3!rDW_os&&_ks%iVhr([2br_*,\r^m&ZqFCHQr'gEL^]3t,
+!*&\kp/M#]s%!,]r_!2`InWR2:/4S]:f1+h<)lt"='8[0>?kH@?X[DRA7]CeBkqL$DK'T9FEMeP
+H@('hJ:W?+L51VCN/`m[P*D5uR$sM8StVmSV5L8lXKA\1ZEpsI\@K5a^;%M$`5Td<b0/&TcdC1j
+e^i@*g=tE=hr*JQj5f=akNM0qlg4!*mf2_ZnF?)?oCW%T!quB_rqQNhs8)Zjrqu`no_sFANrOV~>
+JcC<$NrSeOrVc`nr;6Njs7uZhs7ZNerq14%oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8![r]",;Y['Hp>XfSP$Vkp2_TUq^DR@';*P*(fcN/EIIL4k21J:;onH$=IT
+FE2A>DJX*'BP2$qFaJh*T!-E9dJ;,hchYrfcO\=Gc-4DTaiMK?_ns:+^V9ZZqRlsC]=\!P!5/<E
+!5/6C!5/0?"h_I[]XtcR\H'/6\c95A\[q[K!4`$;qR6@0rO)X3s0_j7r3ud<](rl:\Gir=[C!=?
+[K!W6Zh1O-Z*L[AZa-t3ZR)o`ZE_a'dF6Uqf@\d1gYL`Di8N\UjQ5Oekiq?tm-O--n*fc9rpg*]
+o`"O`p&Ojcq#C0iqYU0gr;HTHrqcTjr:p0fqYg6dq#:$fpA=O_o`+O\o)J7[nGVhUmJuYQliQM<
+lMg&JkQ'fFk5XNCjSn3>iW.s:huV`lrnRV1g]#n-g"?;U"kM5ReC2kFd1F[NcHa\YbKJ&NaiMQD
+`l5p6s8TS(\Gs&5\Epd'\-m:qDf0H0Ci!m&C2*Z\!G?$DAH?=OraPn9!+>e5!a]/<r`fM/>$Co.
+!a&N*r`9&!s&Aqqs&/korD<Mir_EDdr_3;aqb$iZrCHcTr'pTQr'\6upUg=8q7ZR;r^R#\8P/nR
+HV7%+9heAY:f("e;c?Xq<``C+=^,-9?=.)K@Uit\B4u!pCi4-0EH?5FGBeF\I=?]tK7nu7M2R=Q
+O-,TiQ'[l-S=Z@HU84ZaWN*&%YHY@?[^WfY]Y2(q_Sa@4aN;WKc-F\`e'uq"f@em4h;-uHiSrnY
+k2tjkkm6S?m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcCc1J,~>
+JcC<$NrSeOrVc`nr;6Njs7uZhs7ZNerq14%oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8![r]",;Y['Hp>XfSP$Vkp2_TUq^DR@';*P*(fcN/EIIL4k21J:;onH$=IT
+FE2A>DJX*'BP1OVA8#q*Iu'BeQhcpIQ1L=APl[,5q3(0.qi^oArf[8Cq2kQ9qMtE3rf6u;ooAp/
+s,I)=oS`j2N/[Ljrepi:pl,31s,?l6!/g`5!/gc7s,Hr8rf-r<,)sprdF6Uqf@\d1gYL`Di8N\U
+jQ5Oekiq?tm-O--n*fc9rpg*]o`"O`p&Ojcq#C0iqYU0gr;HTHrqcTjr:p0fqYg6dq#:$fpA=O_
+o`+O\o)J7[nGVhUmJuYQliQM<lMg&JkQ'fFk5XNCjSn3>iW.s:huV`lrnRV1g]#n-g"?;U"kM5R
+eC2kFd65k&cHa\YbKJ&NaiMQD`l5p=ai_fNc-FY^d*^:jdaQ[peCN4'f\+s3g=tE<h;-rEi8EVS
+jQ,FbkNM-orot!Zm-O--mdKW7o()DFp%Qjn$ZU-(DJj<-Chmg$C&VcHB4h-S!G#^>@fKj:@/aL7
+?<pk9>QS,5>5hY+=BAT'<rZ2"<;fbq;ZBVm;#a>j:Amod9`@]^9)_E\8GYjS7f5^Q7(rWrNW5%<
+O7nV/O8_WN84cDP8pa3)9MJ5V:Jakb;H$Ln<E<1'=]ns6>[CcF@:E_XAS5[jCM[m+E,fr@G'A1W
+H[U?nJV/W1LP^qJNfT<cPa.T&S"-(BTq\?[Vl?\tXfnt8['mHS]"G_k^r"".`lQ9FbK\>ZdF6Uq
+f@S^0gYL]Ci8N\UjQ>Ufl0/K=lg4$,n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*0s*t~>
+JcC<$NrSeOrVc`nr;6Njs7uZhs7ZNerq1$uoCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8![r]",;Y['Hp>XfSP$Vkp2_TUq^DR@';*P*(fcN/EIIL4k21J:;onH$=IT
+FE2A>DJX*'BP0Rs77I2G!DQDg:B4/h:]+#h:\di`:B=9fqG.&dr(d5er_WSir(d2dnkT0[r_EJf
+peL`_rD*2`s%`GerDWYor)<Mmr_j##<E)pt<E/Nh!E<"c;Y3oe<$BT8dF6Uqf@\d1gYL`Di8N\U
+jQ5Oekiq?tm-O--n*fc9rpg*]o`"O`p&Ojcq#C0iqYU0gr;HTHrqcTjr:p0fqYg6dq#:$fpA=O_
+o`+O\o)J7[nGVhUmJuYQliQM<lMg&JkQ'fFk5XNCjSn3>iW.s:huV`lrnRV1g]#n-g"?;U"kM5R
+eC2kFd2^NZcHa\YbKJ&NaiMQD`l5o4CM[j*Df9T5E,]grE\VWWFEVhOGBe@XH$XgaI!^6gI=?Zr
+J:W<(K7ei2Knb;:LPUbCM2I4LN/`jXO-*@=mSiXTq,@8l$ZU-(DJj<-Chmg$C&VcHB4h-S!G#^>
+@fKj:@/aL7?<pk9>QS,5>5hY+=BAT'<rZ2"<;fbq;ZBVm;#a>j:Amod9`@]^9)_E\8GYjS7f5^Q
+7(rWm<<-"m;ts>k7fl4Q8cD>/92&#R9hnJ\:f1+h;cHat='/U.>?kE>?XR;O@qB4aBPD6uDJjE5
+F*)SLG^=^bIXm!%KSG8=Mi<[WOckroQ^F84StD^NUo(&hWiW>+Yd:^F\%0)_]t_A"_o9X:aihlP
+cHstfeCE1&g"P3:h;@/LioB+^k3)!n#jUaBmI'H3nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?
+s,R,0~>
+JcC<$NrSbNrVc`nrVQWks7uWg!Vc<eo`=^VrpjjpnF,f4m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$a:XK&7tV50iZT:MI?R$O#$P)t]_Mi!7EKnFr,IXQQhG^":P
+EcH&9D/3m#BP)"!GCGF7UU&8FdJ;,hchPj!cd'h\bg"ASaN)6:_ns7*^:jNYqRupA!5&0?"hVF\
+]tD#V^&PbB]*>p[]=beg])9)=\G3W7])0&:\,a#4[f!N1[K!W4[/m_FrODd9rjr'=s0r'<rNu[5
+[JmQ5ZhUj+Zi790Zi7?3ZNIM>Za0P9-dL)ddaZguf@\g3gtgiFi8WeWjlY^gl07L!m-O--n*fc9
+o()DEo`"Lbp@n=\q#:*hqY^6hr;?NFrqcTjr:p0fqYg6dq#:$fpA=O_o`+O\o)J7[nGVeWmd9E?
+liQM<lMg&JkQ'fFk5XNCjSn0@io/kqhuV`lrnRV1g]#n6g"=p.f%/C$eC2kFd1+IKcHa\YbKJ&M
+aiMQD_#FDDm^VSnq7$TIDf0H0D#S2NC2*Z\!G?$DAH?=OraGq;?srt@!a]/<r`fM/>$Co.!a&N*
+r`9&!s&Aqqs&/korD<Mir_EDdr_3;aqb$iZr^ciTr'pTQr^=I"ot1+6s1SEErk8-A"@l!R8P/nR
+!D?,c9n,o6:f("e;c?Xr<``C+>$G6;?=.)L@Us%^BP;-rCi402EcZ>GGBnL^I=Hd!K8#&9M2R=Q
+O-5]lQC+)0S=ZCIUSOcbWN3/(Yd(OA[^WfY]Y;.s_Sa@4aN;WLcHjkbe'uq"f\,!6h;7&IiT&t[
+k2tmll0@X%mI'H3nF?PLs76Edp%A%Pp\jmeq>^<hqu6NlrUp/@s,I&/~>
+JcC<$NrSbNrVc`nrVQWks7uWg!Vc<eo`=^VrpjgonF,f4m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$a:XK&7tV50iZT:MI?R$O#$P)t]_Mi!7EKnFr,IXQQhG^":P
+EcH&9D/3m#BP(IWASZ@5JW'Gmq3D#Gns0BCP`q=-P3nD0P5UUDP5^U>OSk1:Nqn\7Nr=t.Nr"b8
+Npr#-N<#"8NW4t;NVSP'MZA_8N<P9!N/W[Rrf&;Nd*^:ke^i@)g=tE=hVd>Oj5]7`k3)!nlKdg'
+mI'H3nF?)?oCV\So`Fj]p\sseq>^<hqu-HjrR_&FrVQNfqu-Biq>0mcp]'sap&F[aoDJ1Znc/+W
+mfMqEmJZAQlg!d7l2TrIkPjWDjT+B@ir\6!iVqa9hqn@g!SlH/g'ZNcf@SU)e^W*tdf.W(d*L"_
+c-4ASb/qcHaN)C$aU626c-=P[d*^7idf.]8eCE.%f\"m1g=k<:gtgfChr*GPioK1^kNM-ol2KrX
+lg4!*mdBQ5nac8Bp%A(*N<O9>DJj<-rbDOLC&VcHB4h-S!G#^>@KKtG@/aL7?<pk9>QS,5>5hY+
+=BAT'<rZ2"<;fbq;ZBVm;#a>j:Amod9`@]^9)_E]8GPdR7f5^S7(rWpNW5%<O7nV0Ns%sD84cDP
+8c_RYr_7l;:Jakb;H$Ln<`W:(=^#$7?!^lG@U`kZAnYjmCM[m,EH6,BG'A4XI!pKpJqJc3Ll%%K
+NfT?eQ'Rf*S"-(CTqeE\Vl?`!Y->1;['mHS]"Gbl_8=+/`lQ9Fbg+P]dF6Uqf@\d1gtgiEi8N_V
+jlY^hl07L"m-X60n*olIo)J:bo_%nNp@nO\s7u]kr;6KkrVcEgJcC`0J,~>
+JcC<$NrSbNrVc`nrVQWks7uWg!Vc<eo`=^Vrpk!tnF,f4m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`PfX0^V7@m\[T#SZa$a:XK&7tV50iZT:MI?R$O#$P)t]_Mi!7EKnFr,IXQQhG^":P
+EcH&9D/3m#BP'Os6psI58PN&X:JO[a:]+#h:\[ca:]F5k:\mid:]!oe:]=2i:]!od:[q3Z:]=)h
+:%qE\:]=,d9`e'a:A@Tb<;fbn<;TVn<<#l%;H$Oo;cHarnl>]hmS`[U-dL)ddaZguf@\g3gtgiF
+i8WeWjlY^gl07L!m-O--n*fc9o()DEo`"Lbp@n=\q#:*hqY^6hr;?NFrqcTjr:p0fqYg6dq#:$f
+pA=O_o`+O\o)J7[nGVeWmd9E?liQM<lMg&JkQ'fFk5XNCjSn0@io/kqhuV`lrnRV1g]#n6g"=p.
+f%/C$eC2kFd14OLcHa\YbKJ&MaiMQDD#S2aCi+'.DfBW6E,or=EcZ>FG'8(RGlDsgHMr14I!pEl
+It3'#JqAW-KS>,7L51P?Ll$tGMi3ORNfT6`m8NOSq,@2j#$#V\DJj<-rbDOLC&VcHB4h-S!G#^>
+@KKtG@/aL7?<pk9>QS,5>5hY+=BAT'<rZ2"<;fbq;ZBVm;#a>j:Amod9`@]^9)_E]8GPdR7f5^S
+7(rWk<<-"m;u'Aq7n?0B8cD<_92,=ZInid9:f1+h;cHdu='/U/>?kH??XR>PA7]@dBPM=!DJsN8
+F*)SLH$XjdIt3-'KnbD?Mi<[WP*;/sR$jG6StMdPUo(&hX0&P/Z*UgG\%0)_^;%M$_o9X:aihoR
+cd:(geCE1'g"P6;hV[8Mj5]7`k32'olKmm)mdKW6nc/1[o*+dZp%J+RrV6Egs8)Zjrqu`np&9OB
+NW4M~>
+JcC<$NrSbNrVc`nr;6Njs7uZhFnbV'p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLK7f@JI#
+dEp1abfe,L`l5j4^q[Oo\[])UZa$a;XfJG!VPKu\T:VRBR$X)&P)t`aN/EFGKnFu-Isl]jH$=FR
+F)c/:D/=!%BP1mmFF&OuR]3gqdJM;ichYrfcN)8ibmVb=aiDB=_ns:+^V9][q7QjB]=\$Q"hVF\
+]tD#U]`PjY]_oAF]Xteg]=RRDs1/6A])0#<\Giu2[edB([/m_Frj_m:qmug<s0r*=[f3Z8[^H+A
+s0MO,s0Dm7Za6sDZi7?0ZQuoaZHpqGe'uq"f\,!5h;-uHiSrnYjlYail07O#m-X60n*olHncA@S
+rq6<b!;HHes7uZjr;6Hjr;G4GqYg<hq"t$drV??crqHEcr:U']s7?3[rpg$XrpTmTs6]dO!pf.:
+rosIH!9a@Ds5a7Aro47CiSi_Qhr!;ih#Z<crn7_4f[na+f%&:"e'e6C$..#DcHXSVbK@r?s6dD^
+\bET:Df0H0D#S2NC2*Z\!G?$DAH?=OraGq;?srt@!FB(2>lS%.>5hY+=BAT'<rZ2"<;fbq;ZBVm
+;#a>j:Adid9`@]^9)_E\8GPdS7f5]errBY']Cro:^&,MG]gt[cr^mAf9MA/T:/CjcIo0-C<)lt"
+='8[0>[1QA?X[DRA7]CeBkqL$DK'T9FEMePH@('hJ:W?+L51VCN/`m[P*;/tR$sM8StMgRV5L8l
+X0&P/ZEpsI\@K5a^;%M$`5Td<b0/#ScdC1jeCN7(g=tE=hVd>Oj5f=akNM0plg4!*mdKW6nac8B
+o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*/s*t~>
+JcC<$NrSbNrVc`nr;6Njs7uZhFnbV'p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLK7f@JI#
+dEp1abfe,L`l5j4^q[Oo\[])UZa$a;XfJG!VPKu\T:VRBR$X)&P)t`aN/EFGKnFu-Isl]jH$=FR
+F)c/:D/=!%BP1m]@q]_&H\@CWQi!*JQ1L=APl[,5qNCQ7!0I#=qi^oArf[8CqN1W9qi:K3s,R&;
+nW*X/rf6l8!KN00N;nn:NqSJ4Mu\e8N;&51MZ/M8N/NYoNVeYYMpKeue'uq"f\,!5h;-uHiSrnY
+jlYail07O#m-X60n*olHncA@Srq6<b!;HHes7uZjr;6Hjr;G4GqYg<hq"t$drV??crqHEcr:U']
+s7?3[rpg$XrpTmTs6]dO!pf.:rosIH!9a@Ds5a7Aro47CiSi_Qhr!;ih#Z<crn7_4f[na+f%&:"
+e'e6C)plpVcHXSVbK@rGa2l?Dai_fMc-=S]d*^7idf.]JeCE.%f\"m1g=tB;gtgfChr*GPj5f=a
+kNM-ol0@Nulg4!*mdBQ5nac8Bp%J.)N<F0;DJa4hCB80arb)=FB)Z?BA7PUJ!b#JEra,\4?2e+/
+>Q7n+=TV],=8l8#<W?%s;u]bq;>j>k:]=,e:&dod9D_?\8c;3U8,YpT7D&R"N;&>3NrG+5Nr+k>
+N^u]4r^mAf9MA/T:/CjcIo0-C<)lt"='8[0>[1QA?X[DRA7]CeBkqL$DK'T9FEMePH@('hJ:W?+
+L51VCN/`m[P*;/tR$sM8StMgRV5L8lX0&P/ZEpsI\@K5a^;%M$`5Td<b0/#ScdC1jeCN7(g=tE=
+hVd>Oj5f=akNM0plg4!*mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*/s*t~>
+JcC<$NrSbNrVc`nr;6Njs7uZhG5(_(p%@tKoCDJBnF,i6m-O''l0.<mjlGI]i8EJJgtLK7f@JI#
+dEp1abfe,L`l5j4^q[Oo\[])UZa$a;XfJG!VPKu\T:VRBR$X)&P)t`aN/EFGKnFu-Isl]jH$=FR
+F)c/:D/=!%BP1mC6psI67nHENr_EGgr_WSiq,$ubr_NSjqbI)crD*>fr_WSir(d5en4s!Zr_EJf
+peL`_r_E8`s%`;ar)E\pr)EMks&B"sr_ibp"&`&r<:a,i;ufkc;YF$4cdC.heCE1'g"P3:h;@/L
+ioB+]k3(sml0I^&mI'H3nF?MK!V>s_p&F^cp\jmeq>U6gqu-HjrRUuErVQNfqu-Biq>9sdp\sma
+p&=U`oDS7Znc/+Xn,MhUmJZAQlg!d7l2TrIkPjWDjT+B@is4T&iS`YOhqn@g!SlH/g'ZNcf@SU)
+e^W*tdf.W&d*L"_c-4ASb/nC6D#S2fCi+$,DfBW5E,]i;EcQ5CF`qqPGBeCYH@#O:#(1iIIXclu
+rdt0&!/1?*",;SdM#N5:MMmCONK0']OmZ0;<;KPk<;ff"Df0H0D#S2NC2*Z\!G?$DAH?=OraGq;
+?srt@!FB(2>lS%.>5hY+=BAT'<rZ2"<;fbq;ZBVm;#a>j:Adid9`@]^9)_E\8GPdS7f5]err?$h
+<<-"n;u0Gq;b0GNr^mAf9MA/T:/CjcIo0-C<)lt"='8[0>[1QA?X[DRA7]CeBkqL$DK'T9FEMeP
+H@('hJ:W?+L51VCN/`m[P*;/tR$sM8StMgRV5L8lX0&P/ZEpsI\@K5a^;%M$`5Td<b0/#ScdC1j
+eCN7(g=tE=hVd>Oj5f=akNM0plg4!*mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*/s*t~>
+JcC<$NW8\NrVc`nr;6Njs7uZhs7ZNerq1=(oCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JI#
+da?Cdbfe,L`l5j4^q[Rq]",8WZa-g=XfJJ#Vkg)]TUq[CR@'8(P*(fbN/EIIL4k20Isl]jH$=FR
+F)c2<DJX*'BP1miCNXuVP+Sl"dF%m=rQkDg!71Yk!mf0;rlknrb/hT@_o'@-^qRLp]_T8@]E#SB
+])TDA]`>_C^&PbB]*>p[]Y(kf])K5?\G!H5])&u;\,s.J\+R03[C!<IqR#t(!k,SIrj_j9r4;m<
+"LtqM[^H+CrNuU2!OB'2Z2h0-ZSJhnZa@'F['[0GZF&!+daZguf@em4gtgiFi8WeWjlY^gl07L!
+m-O--n*fc9o()DDo`"Lbp@n=[q#C0iqYU0hr;?NCrqcTjr:p0fqYg6eq#:$epAFU_o`+O]o)J7[
+nGVhUmf2\Rm/QDOlMg#Lki_..joXZ*jSn0bio/kSi8<GKh;-lAgY1B7g"=p.f%&=#eC2jndEp7d
+cHa\YbIdfC\EUQt\--_fDJa4hCB80arb)=FB)Z?BA7PUJ!b#JEra,\4?2e+/>6%k*=TV],=8l8#
+<W?%s;u]bq;>j>k:]=,f:&[ic9D_?\8cD9V8,PjV7CiHu](N]/]`,VC^&u&>8P/nR!D?,c9n#i5
+:f("e;c?Xq<``C+=^,-9?=.)K@Uit\B4u!pCi4-0EH?5FGBeF\I=?]tK7nu7M2I7PO-,TiQ'[l,
+S=Z@HU84W`WN*&%YHY==[C3WW]Y2(q_Sa@4a2lEHc-F\`daZguf@em4h;-uHiSrnYjlYail0@U$
+m-X60nGi%YncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC`0J,~>
+JcC<$NW8\NrVc`nr;6Njs7uZhs7ZNerq1=(oCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JI#
+da?Cdbfe,L`l5j4^q[Rq]",8WZa-g=XfJJ#Vkg)]TUq[CR@'8(P*(fbN/EIIL4k20Isl]jH$=FR
+F)c2<DJX*'BP1m\?=[_gG(,42Q^@W9rKZr>"-o+7PP^O:OT:L<Oo1C@PQ$aEOnk+;O8=n4NW5%;
+NUVr.N;S\8Nr"b(Mu\k:NqJD3N;/;2MYrA:MN!LRN/WbqN$sUCd*^:ke^i@*g=tE=hVd>Oj5]7`
+k3)!nlKdg'mI'H3nF?)?oCMVRo`Fj]p\jmeq>^<gqu6NkrRCiCrVQNfqu-Biq>9sdp\smap&=U`
+oDS7[nc/+Wn,MhUmJcJPli68LklU)3kPjTFjlGM%j!<XCiS`YOhqm2Fgt^Z<g=b03f@SU(e^W*t
+da?Ihd*L"_c-4B1`BqVdaN;QHbKJ/Ucd:%ddF6Ome'umtf@S[-g"G*6gYCT?h;7&IiSrnYjlYai
+kiq?sl0@U$m-X6/n+#r=oCMYKpWSU"Df0H0D#S2NC2*Z\!G?$DAH?=OraGq;?srt@!FB(2>lS".
+>5_S*=BAT'<rZ2"<;fbq;ZBVm;#a>j:Amod9`@]^9)_E]8GPdR7fPofs8S&PNW5%<O7nV4NrtD5
+8P/nR!D?,c9n#i5:f("e;c?Xq<``C+=^,-9?=.)K@Uit\B4u!pCi4-0EH?5FGBeF\I=?]tK7nu7
+M2I7PO-,TiQ'[l,S=Z@HU84W`WN*&%YHY==[C3WW]Y2(q_Sa@4a2lEHc-F\`daZguf@em4h;-uH
+iSrnYjlYail0@U$m-X60nGi%YncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC`0J,~>
+JcC<$NW8\NrVc`nr;6Njs7uZhs7ZNerq1=(oCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JI#
+da?Cdbfe,L`l5j4^q[Rq]",8WZa-g=XfJJ#Vkg)]TUq[CR@'8(P*(fbN/EIIL4k20Isl]jH$=FR
+F)c2<DJX*'BP1mC6UX=384QBN:/:das%rYipe^obr_NSjqbI)cr_EDfr_WSiqbI,dnP9*[r_EJf
+peL`_rD*/_!)E5`"&;co;uBSp;uBVk;uT_r;uKSo;uTYr;cH`q<W?%o<W?%u;t3c\;^Tl=daZgu
+f@em4gtgiFi8WeWjlY^gl07L!m-O--n*fc9o()DDo`"Lbp@n=[q#C0iqYU0hr;?NCrqcTjr:p0f
+qYg6eq#:$epAFU_o`+O]o)J7[nGVhUmf2\Rm/QDOlMg#Lki_..joXZ*jSn0gio/kSi8<GKh;-lA
+gY1B7g"=p.f%&=#eC2jndEp7dcHa\Yb@t^+CM`uc$#FHqDf9T5DfB^pErU4qF`qqPGBeCYH?spc
+H[C-gI=H`sJGt0#K)gT(Kb/uoLPUeDMMd=MN/`jYOHEN3;t!]_;uBVl<<R5XDJa4hCB80arb)=F
+B)Z?BA7PUJ!b#JEra,\4?2e+/>6%k*=TV],=8l8#<W?%s;u]bq;>j>k:]=,f:&[ic9D_?\8cD9V
+8,PjV7CiHu<:X&h<;TVn;ufqt<!-&i8P/nR!D?,c9n#i5:f("e;c?Xq<``C+=^,-9?=.)K@Uit\
+B4u!pCi4-0EH?5FGBeF\I=?]tK7nu7M2I7PO-,TiQ'[l,S=Z@HU84W`WN*&%YHY==[C3WW]Y2(q
+_Sa@4a2lEHc-F\`daZguf@em4h;-uHiSrnYjlYail0@U$m-X60nGi%YncA@Srq-?dp\4[^s7u]k
+r;6KkrVcBfJcC`0J,~>
+JcC<$NW8YMrr)ior;6Njs7uZhs7ZNerq1=(oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@SR&
+da?Cdc-+8Na2Q!6_8!^s]",;Y['R!?XfSP%Vkp2`TUq^DR[BD+PELueN/NOKL4k21J:;onH?aXV
+FE2A>DJa0(BP;!hCN=WKLmFjBd*_j>qp58gs3L\ks3C\jrlkhpbK7fD`5BL0^q[V_]_T5B]XtfS
+\cBAA]`>_C^&PbB]DoPD])oXW])9)=\G*N6])0&;\Gs&2[f3Z<[^EKLZa9J7ppL+0!4Vm9r42d;
+rOE0C\$icS[^EOA[/I?1ZN%68ZEpjD['R+:[/\N'e'uq"f\,!5h;-uHiSrnYjlYail07L"m-X60
+n*ol;o()DEo_%nNp@n=\q#C0hqY^6hr;?NCrqcTjr:g*eqYp<eq#:$epAFU`o`"I\o)J7[nGVhU
+mf2\Rm/QDOlMg#Lki_..joXZ*jSn0?io0mp&Du@$h;-lAgY1B7f\"g-f%'cL#Lh,KdEp4ccFNuD
+\EUQq\GpFID/B2e!GZ?JBE;aXrac+@A,]pB@:3JM?X@&Er`oJ-!*]>(!a&N*r`9&!s&Aqqs&/ko
+rD<Mir_EDdr_3;aqb$iZrCHcTr'n3rrjqd7p:U@;s1SQJ8P/nR!D?,c9n,o6:f("e;c?Xr<``C+
+>$G6;?=.)L@Us%^BP;-rCi402EcZ>GGBnL^I=Hd!K8#&9M2R=QO-,TjQC+)0S=Z@HUSOcbWN*&&
+Yd(OA[^WfY]Y2(q_Sa@4aN;WLcHaeae'uq"f\,!5h;7&IiT&tZk2tjkl0@U$mI'H3nF?MK!V>s_
+o`Fj]p\ssfq>^<hqu6NlrUg)?s,I&/~>
+JcC<$NW8YMrr)ior;6Njs7uZhs7ZNerq1=(oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@SR&
+da?Cdc-+8Na2Q!6_8!^s]",;Y['R!?XfSP%Vkp2`TUq^DR[BD+PELueN/NOKL4k21J:;onH?aXV
+FE2A>DJa0(BP;!h>[h8[F*`FqQC%T:qj$c=s-3VLPP^O:OoLO=Oo(=@PQ$aDOnt1;O8Ft5NW5%;
+NU`#/NW+t:N:`,!N;eh9NqJD3N:r/2MMmAjN;nn;N%Kt8dF6Uqf@\d1gYL]Ci8N\UjQ5Oekiq?s
+m-O--n*fc9nac8Bo^qhLp@e7TrqQNhrqcQirVZTleGf=Cqu$3crVHNhqY:'arq?9_s7H<^rUU!Y
+s7$!Us6fpSrp9[Ns6BUJ!pJh1roO:DjQ-=#!TN);i"4f&hVI#CgtUQ:g"=s/f@JLOe.'mTdF$=e
+cd'GH`5T^8rlG,]&^&;?c-FY^d*^7hdaQ[peCE1Mf`0VNg=tB;gtgiDhr*JQj5f=akNM-ol0@O!
+lg4!*mdBQ6nac;Cp%Rp7!05ios)%jSD#S2NC2*Z\!G?$DAH?=OraH+@?sm>K?=$q:>lS".>5_S*
+=BAT'<rZ2"<;fbq;ZBVm;#a>j:Amod9`@]^9)_E\8GYjS7_&KtN;&>3NrG+4NrG+>8cD<_92,=Z
+Inid9:f1+h;cHdu='/U/>?kH??XR>PA7]@dBPM=!DJsN8F*)SLH$XjdIt3-'KnbD?Mi<[WOckuq
+R$jG6StD^OUo(&hWiWA-Z*UgG\%0)_]t_A"_o9X:aihoRcHstfeCE1'g"P3:hV[8Mj5]4_k3)!n
+lKdg(mdKW6nc&([oCW%T!quB_rqQNhs8)Zjrqu`no_sFANW4M~>
+JcC<$NW8YMrr)ior;6Njs7uZhs7ZNerq1=(oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@SR&
+da?Cdc-+8Na2Q!6_8!^s]",;Y['R!?XfSP%Vkp2`TUq^DR[BD+PELueN/NOKL4k21J:;onH?aXV
+FE2A>DJa0(BP;!h5sn%/7Rp$F;bm*`q,$ubr_NSjqbI)cs%`Jfr_WSir(d5en4s!Zr_<GfpJ1W^
+r_E5_!)E8ar_<Mj;H!Kmoi1ifr_rkrrDEVor_i_o"&r9"<W5tn<W,kf;Yj>ld43Vpe^rI,g=tH>
+hr*JQj5f=akNM0plKmm)mdKW6naZ2@oCV\Jp%J+Rp\ssfq>U6gqu-HjrRCiCrVQNequ-Bjq>0mc
+p\smap&F[`oDS7[nc/+Wn,MhUmJcJPli68LklU)3kPjTFjlGM%irS/urnn@FhVR)Egt^Z<g=b-2
+f@SU(rmV5&da?Ihcd0mMrb2ILCMRbcCBA<hD>eDQE;sqXEWgH*FEMd+G6E/9H$Xf9HiJKnIK+fs
+JGt0#K)gT(KarimLPUeDMMd=MN/`jYOSVrM;smW_;uK\i<W?q;D/B2e!GZ?JBE;aXrac+@A,]pB
+@:3JM?X@&Er`oJ-!*]>(!a&N*r`9&!s&Aqqs&/korD<Mir_EDdr_3;aqb$iZrCHcTr'n3rr`&Gg
+s&Akor`&nts&B"ir^m2a9`@b9:/=\_;,U=k<*!%$=BSg3>[:ZC?t*SUAS,UhC27X'DfKf=FEVkR
+H@1-jJ:`E-L5:\EN/is]P*M?#R@B_<T:r$UVPgDnXKJe4Za@0M\[oGe^VI_(`Q$!@bKS8Wd*^=l
+e^rI,g=tH?hr*JRj5f@bkNV6rlg4$,n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*/s*t~>
+JcC<$NW8YMrVc`nrVQWks7uWg!Vc<eo`=^VrpjmqnF,i5m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`PfX0^V7@m\[])TZa$a;XfA@uVPKr[T:VO@R$X)%P)t`aN/<@FKnFu-Isl]jH$=FR
+F)c/:D/3p$BP1meD01)UNgluVrm:Pgs3U_jrm:\k!7(Sg%Euu9`l,d4_SO%%]tM)S^&P_F]D];A
+]=e-V!5/6C!kc.Xr4<$C]=e-T!4qa3!4r$;s0r->[^Yq<rjDd7"LkhI[C#n=qm?+*s0hm8"Lu"Q
+\@DLJrjr'=s1&*<s0hs8s0Vd3!4)O/#-tM>Za@'Frj3iTdF-Opf%8R.gYCWAi8ESSj5f@bkNM0q
+lg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)WirVZWmdJj"@r;?<drVHNhqY:'arq?9_s7H<^rUU!Y
+s7$!Us6fpSrp9[Ns6BUJ!pJh1roO:DjQ-=#!TN);i"4f&hVI#CgY:H9g"=s/f@JLOe-+7KdF$=M
+s7*V^\am91D?4TjrbDOLC&VcHB4h-S!G#^>@L$=L?sd8I?=!P8s'#J,rE02(=',B%s&K(urDW_o
+s&&_ks%iYir([/ar_*,\r^m)[q+(HS\,ZB;ot0q1r4N)%r^qZ59MA/T:/=\_;,U=k<)lt"='8[0
+>[1QA?X[DRA7]CeBkqL$DK'T9FEMePH@($fIt3-'KnbGAN/`m[P*;/sR$sM8StMdPV5L8lX0&P/
+Z*UjH\@K5a^;%M$`5Td<aihoRcdC.heCN7(g=k?<hVd>Nj5]7`k32'olKmjJmI'H3nF?)?oCV\J
+p%J+RrV6Egs8)Zjrqu`np&9OBN;nD~>
+JcC<$NW8YMrVc`nrVQWks7uWg!Vc<eo`=^VrpjmqnF,i5m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`PfX0^V7@m\[])TZa$a;XfA@uVPKr[T:VO@R$X)%P)t`aN/<@FKnFu-Isl]jH$=FR
+F)c/:D/3p$BP1me?"7PbG'nq#rg*GHp6G]Frg!YOP`q=/P4t+<OSP%8P5^[EP5^U?OSk1:NqeS6
+Nr4n)NrG%6N;&>(N;nn:N;eh9NWG-"pPo33regc6rJLl=Mi!=LN/RXn+cFareCE.%f\5*8h;7)J
+iT&tZk2tjjl0@U$m-X60n*olHncA@Srq6<b!;HHes7u]kqtp?irVb.CqYg?ip\XpcrqZEcrqHEc
+r:U*^rq$*Zs7--YrU9dSs6]gPs6K^MrojLJkNDj,!p/M(ro4%=iVqaHhqm5Gh;$c>g=k64f[na+
+ec+&&e'cXkd)*^"`;ddX`lQ7#aUu\=c-FV\d*U1fdaHUneC<%#rn%t=g=k<9gt^`BhV[8MioK1^
+kND'ml2KrJli-5XmI'E2naZ2AoC_kJNW5$mNW3ksD/B2e!GZ?JBE;aXrac+@A,]pB@:3JM?X@&E
+r`oJ-!*]>(!a&N*r`9&!s&Aqqs&/korD<Mis%`Jdr_3;aqb$iZr^ciTs$jKtr/CB0s,R)>oo9'6
+8cD>392&#R9hnJ\:f1+h;cHat<``F,>$P<<?XI5N@q9.`BPD6tD/O<4EccGJG^=^aI=Hd!K8#&:
+MN!OUOHPfmQC+,1SXuLJUSXleWiN8)Yd(OB[^`l[]Y;.s_SjF6aN;WLcHjnce'ut#f\5'7h;7)J
+iT&t[k2tmll0@X%&+/fRn*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUp/@s,?u.~>
+JcC<$NW8YMrVc`nrVQWks7uWg!Vc<eo`=^VrpjmqnF,i5m-O''l0.<mjlGI]i8EJJgtLH6f@AC"
+dEp1`bK@oH`PfX0^V7@m\[])TZa$a;XfA@uVPKr[T:VO@R$X)%P)t`aN/<@FKnFu-Isl]jH$=FR
+F)c/:D/3p$BP1me6:=4184Z<HpeUod!)NJgrD3Dh!)NJerD3GgqbR5gr_NGerD2oX"]%lh:/+IX
+:A[ie:A@N`:A.K_:B+)i;uT\m;tj8g;u]es;u0Dl;>sMj<;KSp<;]\p;ZB\k;Z'H9dF-Opf%8R.
+gYCWAi8ESSj5f@bkNM0qlg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)WirVZWmdJj"@r;?<drVHNh
+qY:'arq?9_s7H<^rUU!Ys7$!Us6fpSrp9[Ns6BUJ!pJh1roO:DjQ-=#!TN);i"4f&hVI#CgY:H9
+g"=s/f@JLOe-+7KdF$>?B`DfHCB&&LD#S2OCi+(gDuXeVEW:%^F*)MHG5c[gG^4R\HN&9kI/eWp
+J,b'!K)^K'K`6Z8L51P?M2@+IMi3ORNfT:p<;fb^<;oho<:s8kD?4TjrbDOLC&VcHB4h-S!G#^>
+@L$=L?sd8I?=!P8s'#J,rE02(=',B%s&K(urDW_os&&_ks%iYir([/ar_*,\r^m)[q+(HS\,ZA*
+nl>]hr)3Spr)E_gr^qZ59MA/T:/=\_;,U=k<)lt"='8[0>[1QA?X[DRA7]CeBkqL$DK'T9FEMeP
+H@($fIt3-'KnbGAN/`m[P*;/sR$sM8StMdPV5L8lX0&P/Z*UjH\@K5a^;%M$`5Td<aihoRcdC.h
+eCN7(g=k?<hVd>Nj5]7`k32'olKmjJmI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`np&9OBN;nD~>
+JcC<$NW8YMrVc`nr;6Njs7uZhH2%%+p%@tKoCDJBnF,i6mHj0(l0.<mjlGI]iS`SKgtUQ8f@JI#
+dEp4bbfe,L`l5j4^q[Rq\[])UZa-g<XfJJ#VPKu\T:VRBR?s2'P*(fbN/EIIL4b).Isl]jH$=FR
+F)c/;DJX*&BP1mfBPhm>Kp/.2`R*!*ci)2kcd)O7%F!#;a2Q!8_ns4(^V.;T]`PjY]D];@]`,SE
+]_oJC]_f>?]EGjZ]=PTP\H'//\c9/@\$id?[K3eErO)R3s0i'<[C,q=qm?+*s0hm8rji'=rOE$A
+\[f<M\c92>\,Wo:[JmQ/ZN7A<rj3]P[*d@Pe^rI,g=tH>hr*JQj5f=akNM0plKdg(mf)YZnF?)?
+oCV\So`Fj]p\jmeq>^<gqu6NkrR(W@rVQNequ-Bjq>0mcp\smap&F[aoDJ1Znc/+Wn,MeUmJZDO
+lN$5KklU)3kPjTKjlGL_j5T(Wrnn@FhVR)EgtUT;g=b-2f@SU(rmUqs[/]^,k.0uk!cDjkrbD^Q
+BkV0mB4h-S!G#^>@L$=L?sd8I?=!P8s'#J,r`T8's&]2#s&K(urDNbq;,R6fs%iYir([/ar_*/]
+rCQuZqF@snqmuI4!5/6Ar4N!Ar^m2a9`@b8:/=\_;,U=k<)lt#=BSd2>[1TB?t!MSAS#LfBkqO&
+DK'T:FEVkQH@('hJ:W?+L51VCN/`m\P*D5uR$sM9T:r!TV5L8lXKA\1ZEpsI\@K5a^;%M$`5Td<
+b0/&TcdC1jeCN7)g=tE=hVd>Oj5f=akNM0qlg4!*mdKTJnF?)?oCW%T!quB_rqQNhs8)Zjrqu`n
+o_sFAN;nD~>
+JcC<$NW8YMrVc`nr;6Njs7uZhH2%%+p%@tKoCDJBnF,i6mHj0(l0.<mjlGI]iS`SKgtUQ8f@JI#
+dEp4bbfe,L`l5j4^q[Rq\[])UZa-g<XfJJ#VPKu\T:VRBR?s2'P*(fbN/EIIL4b).Isl]jH$=FR
+F)c/;DJX*&BP1mf>[CrTE-QkgP*VF2Q1pREQi<9QQ'@Msr0$f:rK-l<qNCiArf[8Cq2kN8qi:H2
+!07#;nW![1NfO*us,R,=rJU`7r/CE1qMbH6rf$i9s,?o9qi:E1s,?l6s,?u9!K)g7N#dh8dF6Uq
+f@\d1gYL]Ci8N\UjQ5Oekiq?slg4$,rpL'\nac8Bo^r.U!quB_rV6Egs8)Wirqu]mdJj"@qu$3c
+rVHNhqY:'arq?9_s7H?_r:9mXs7$!Us6]mSrTsRM!:'OI!pJh1roOIIjQ,@]io8qri"4f&hVI#C
+gY:H9g"=s/f@JLOe-4=9^V[n+rkoGg`lH0AaiV]JbK\>Xcd:(edaJ-Ds3qt<f@\a/g"P07gt^`A
+hV[8LioB+]jlbgjkir*3%dWKJmHs?0nF?)?oC_eNnr<X/fSorMD/B2e#&7jcBP1sirac+@A,]pB
+@:3JM?X@&Er`oJ-!*]A)s&f;&r`9&!s&Aqq!`Dlmr)!Dhs%`Jdr_3;ar(?oZr^clU[K$,_pPo35
+!0@&<rf?r:r^m2a9`@b8:/=\_;,U=k<)lt#=BSd2>[1TB?t!MSAS#LfBkqO&DK'T:FEVkQH@('h
+J:W?+L51VCN/`m\P*D5uR$sM9T:r!TV5L8lXKA\1ZEpsI\@K5a^;%M$`5Td<b0/&TcdC1jeCN7)
+g=tE=hVd>Oj5f=akNM0qlg4!*mdKTJnF?)?oCW%T!quB_rqQNhs8)Zjrqu`no_sFAN;nD~>
+JcC<$NW8YMrVc`nr;6Njs7uZhGPCh)p%@tKoCDJBnF,i6mHj0(l0.<mjlGI]iS`SKgtUQ8f@JI#
+dEp4bbfe,L`l5j4^q[Rq\[])UZa-g<XfJJ#VPKu\T:VRBR?s2'P*(fbN/EIIL4b).Isl]jH$=FR
+F)c/;DJX*&BP1mf6UF107nH<H:A7Q[;#X8j;#a>g:Amrg:A[id;#X8h:AmuX:B+,h:&n#`:A[id
+:A@N`:A7Q_:B+,i:'"<mr_iVlpJh#g!`W)srDNYm"]A2q;c6Qn;ufkq<;]bq<;f_q;Z0Po;?9]o
+r)4Q^e'uq"f\,!5h;-uHiSrnYjlYail07L!m-X6?mfr:Oo()DEo`"Lbp@n=[q#C0iqYU0hr;?N@
+rqcTjr:g*eqYp<eq#:$epAFU`o`+O\o)J7[nGVhUmJuYQm/QAOlM]rKki_..jp1#/jQ#:[io0mp
+&Du@$h;-l@gY1B7f\"g-f%'cL!7Up[rb2=G$>O?lCi!m&Ci!s+rGV^Ts)J'Z$ZgE4F`qtQG^+LZ
+HMr3jI/eU$It3'#JqAW-KS9>Y%YfaoLl$tGMMmFPNK0']h,OAPr)E5e!cDjkrbD^QBkV0mB4h-S
+!G#^>@L$=L?sd8I?=!P8s'#J,r`T8's&]2#s&K(urDNbq;,R6fs%iYir([/ar_*/]rCQuZqF@sn
+qc*2fs&Ahn!*&nsr^m2a9`@b8:/=\_;,U=k<)lt#=BSd2>[1TB?t!MSAS#LfBkqO&DK'T:FEVkQ
+H@('hJ:W?+L51VCN/`m\P*D5uR$sM9T:r!TV5L8lXKA\1ZEpsI\@K5a^;%M$`5Td<b0/&TcdC1j
+eCN7)g=tE=hVd>Oj5f=akNM0qlg4!*mdKTJnF?)?oCW%T!quB_rqQNhs8)Zjrqu`no_sFAN;nD~>
+JcC<$NW8YMrVc`nr;6Njs7uZhs7ZNerq1=(oCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JI$
+da?Cdbfe,L`l5j4^q[Rq]",;YZa-g=XfSP$Vkp2_TUq^DR@';*PECodN/NOJL4k21J:;onH?aXV
+FE2A>DJa0(BP;!hA8?41Iu0GbZ-iKq"4#6=cMl/gciMJ<rlkhpb/hWB`5BI.^q[VX^&P_F]D];A
+]=dpP!kc.XrO`*Br4E!>!4qg5!4r'<s1&*<osXe+ppU12rjD^2q6^10s0V^3#.D"N\$rlWn@AS/
+s0r$:rj<'=['R'DZa-mCZMq3QdaZdtf@\g2gtgiEi8N_VjQ>UfkiqBum-O--n*fc9rpg*]o`"O`
+p&Ojcq#C0hqY^6hr;HT?rqcTjr:p0fqYg6dq#:$fpA=O_o`+O\o)J7[nGVhUmJuYQm/QAOlMg&J
+kl9iFjp1#/jQ#:[io0mp!T2c5h$2ZhgY1B7f`'J'f%%&*rODm<q7,Osn$isID/=!'C2.HrBP1si
+AS#C_A,]p<@:9(As'>\2r`oJ-!*]A)s&f;&r`9&!s&Atrs&/kor)!Dhs%`Jdr_3;ar(?oZr^cuX
+ZiBm5n%8M1s1SG)s%@f79heAX:Jakb;H$Lo<`W:(=^#$7?!^lG@U`kZAnYjmCM[m,EH6,BG'A4X
+I!pKpJqJc3Ll%%KNfT<cPa7])S"-(BTqeE\Vl?\tXfo"9['mHS]"G_k^r"".`lQ9EbK\>ZdF-Op
+f@S^0gYL]Ci8N\UjQ5OekiqBum-G&GmdKZ8nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*.s*t~>
+JcC<$NW8YMrVc`nr;6Njs7uZhs7ZNerq1:'oCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JI$
+da?Cdbfe,L`l5j4^q[Rq]",;YZa-g=XfSP$Vkp2_TUq^DR@';*PECodN/NOJL4k21J:;onH?aXV
+FE2A>DJa0(BP;!hA6`PRCialQMYi\4QN*<NQN*3LPPp[=Oo:C<Onk1>PQ$aEOnt1;O8Ft4N<#":
+NUi)0NW+t;NW+t:NVnb8Mu8P1NV\V6N<5-"N:r53NfF!tpPo33repc7s,-l7rehlHeC<($f\5'7
+h;7&IiT&tZk2tjjl0@U$m-X60n*olHncA@Srq6<b!;HHes7uZjr;6HjrVb(AqYg<hq"t$drV?<b
+rqHHdqt:!]s7?0Zs7--YrU9dS!:BaOs6B[MrosIHs6'CD#Nb%-j5].YiVqa9hqn@g#2Itfg=k64
+rmqJ-e\&W1^VI_(_u@Re`Q#s>aN;QHbKJ/UcHjkbdF-JBe,Ro9f%8R+g"G*5gYCT?h;7&IiSrnY
+jlP[gkih:1l43.Hm-X3.mdTc;o(2PJp[aCCNn97&DJa3*CMITuBP;$kAn>OaA7PUJ!F]C8?iOF4
+?2e+/>6%k+=oVV(=8l8#<W?%t;u]bq;>a8j:]F2f:&[ic9DhE\8cD9Z8$i6lN;&>-NrG+<NrM`O
+97BQ/9hnGZ:f("e;c?[s<``C+>$G6;?=.)L@Us%^BP;-rCi402EcZ>GGBnL^I=Hd!K8#&9M2R=Q
+O-,TiQC+)0S=Z@HUSOcbWN*&%YHbF@[^WfY]Y2(q_Sa@4aN;TJc-F\`daZh!f@em4h;-uHiSrnY
+jlYail0@U$lj<(In*ol;o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcC]/J,~>
+JcC<$NW8YMrVc`nr;6Njs7uZhs7ZNerq1=(oCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JI$
+da?Cdbfe,L`l5j4^q[Rq]",;YZa-g=XfSP$Vkp2_TUq^DR@';*PECodN/NOJL4k21J:;onH?aXV
+FE2A>DJa0(BP;!hA3iOM77Ba=:Jgsb!)EMhqG@/es%r_kqbI)c!)EAds%r\jrD*8dn4j*^:/=VZ
+pJ1T]s%`>`s%`>brD*>fr_EJn!E<"s;Yj>e<;KMp<)Z`p;Z'Aq;Gg:h;cN`prD`_qqc*Dj,Z7Q?
+;cD,oeCN7(g=k?<hV[8Mj5]4_k3(smlKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>U6gqu-HkrQkK>
+rVQNfqu-Biq>0mcp]'sap&F[aoDJ1Znc/+Wn,MeUmJZDOlN$5Ll2TuIkPjTKjlGL_j5T(Wrnmh7
+hYu=8gtUT;g=b-Xf*'[TAS,QRBE)ZEB`i*cCM`uc")MgkDZ+MRE;sqXEX-Z-F`hkOGBj+4!.+Tj
+s*P3&IXcluJV&K+K7npWKarimLPUeDMMd=NN/`jZOPNn9;uBVa<=s+cChmg$C2%?pB4kgfARo=]
+raGn:@/aO5?3":1>lS".>5h\)=T;J%<rZ2"<;ohr;ZBVl;#a>k:Adic9`@]_9)V?\8Gu&bs8#^f
+<W5to;g),?<D#kV92&&S:/4S]:f1+h;cQk!='/U/>?kH??XR>PA7]@dBPM=!DJsN8F*)SLH$Xjd
+It3-'KnbD?Mi<[WOckrpR$jG6StD^OUo(&hWiW>+Z*UgG\%0)_]t_A"_o9X:ai_fOcHsteeCE1&
+g"P3:h&,&-iSrnYjlYail0@U$m-X60nF?&>o(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?s,?u.~>
+JcC<$N;rSMrVc`nr;6Njs7uZhs7ZNerq1=(oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@SR&
+da?Fec-+8Na2Q!6_8!^s]=GDZ['R$AXfSP%Vkp2`Tq@mFR[BG,PEM#gN/NOKL4t83J:;onH?aXV
+FE;G@DJa0)BkV*iA7BCsG_;!CVR?BKs3:YkcMl/gciMJ<rQP\maiMK?`5BI-^q]TV!kc.Wrji0C
+]Y+'Rrk&KJ]Xteg]XtiU]DoJ6\H'5?\H'/=\HKFO\$id?[emK0[f<`8\Gir9[fj.I[C!=?Zi.62
+Zi7?3[JdK3[/dZ6\,Wu-\c92>\,NfA['mBLZa6sDZMq0Ue'uq"f\,!5h;-uHiSrnYjlY^hl07L!
+m-O--n*fc9o()DDo`"Lbp@n=[q#C0iqYU0hr;?N=rqcTjr:p0fqYg6dq#:$fpA=O_o`+O\o)J7[
+nGVeWmd9E?liQM<lMg&JkQ'fFk5XNCjSn3>iW.s:huV`lrnRV1g]#n0g"=p.r365#\Gj&8\E(3f
+\.ELnCMR["BkV0mB4b^dA7T3L@KBnFra5\3!+#S/s'#J,r`T8's&]2#s&K(ur_rhps&&\js%iYi
+r([/as%E5]rCQuZs$sBpq7?%,r4IKl8kViO9heAY:f("e;c?Xq<`W=*=^#'8?!grI@Uiq[B4u!p
+CMds.EH6/DGBeF[I!pKpJqJc3Ll..NO-#NgQ'Rf*S"6.DTqeE\W2co#Y->1;['mHS]=bkm_8=.0
+`lQ9Fbg+P]dF6Uqf@\d1gtgiEi8N_VjlY^hl0/iGlg4$,n*fc9o()DDo_%nNp@nO\s7u]kr;6Kk
+rVcBfJcC]/J,~>
+JcC<$N;rSMrVc`nr;6Njs7uZhs7ZNerq1=(oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@SR&
+da?Fec-+8Na2Q!6_8!^s]=GDZ['R$AXfSP%Vkp2`Tq@mFR[BG,PEM#gN/NOKL4t83J:;onH?aXV
+FE;G@DJa0)BkV*iA7AhQBPhm=K8]\np6P`Fs-<YMrfdDHr0$i;rK-l<q3(`@rf[8CqN1T8qi:6,
+nr<d2NfO'trf6i7r/CQ3repl;N;S\3N:2c*NqJD2MunorN;\Y[e'uq"f\,!5h;-uHiSrnYjlY^h
+l07L!m-O--n*fc9o()DDo`"Lbp@n=[q#C0iqYU0hr;?N=rqcTjr:p0fqYg6dq#:$fpA=O_o`+O\
+o)J7[nGVeWmd9E?liQM<lMg&JkQ'fFk5XNCjSn3>iW.s:huV`lrnRV1g]#n6g"=p.]"G\i^;%M`
+_uI[T`<aK(aN2KFb0/!-cMu8kdJqYodk9/#f%8R+g"G*6gYCT?h;7&IiSrnYjlP[gkih9rl0I[%
+m-X3.mdTc;o(2PJp[jICNn'+#D/=!'C2.HrBP1siAS#C_A,]p<@:9(As'>\2r`oJ-!*]A)s&f;&
+r`9&!s&Atrs&/kor)!Dhs%`Jdr_3>bqb$fYr^d&ZZN'`ZpPo!/rf@&=I7d.+9MJ5V:Jakb;H$Ln
+<E<.&=]np5>[:]D@:E_WAS5[jCMRd)E,fo?Fa&(VH@1-jJ:`E-L5:_GNK90aPEhH$R@Bb=TV8-V
+VPpMqXfen5Za@0M\\#Mg^VRe*`Q$!@bKS8Xd*^=le^rI,g>(N@hr*JRj5oFckiq=ElKdg(mdKW6
+nac8BoCV_Kp@e7Zq#C0iqY^6ir;HTdrdk*.s*t~>
+JcC<$N;rSMrVc`nr;6Njs7uZhs7ZNerq1.#oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh:pZ:f@SR&
+da?Fec-+8Na2Q!6_8!^s]=GDZ['R$AXfSP%Vkp2`Tq@mFR[BG,PEM#gN/NOKL4t83J:;onH?aXV
+FE;G@DJa0)BkV*iA7@kn6iKOU85B+Zs%`Siq,$o`qbHi\r_WSir_EAemS3j[:/4OY:A[ie:A7H_
+:A7Q_:B+,e:B+8p<E)oq;Yj>k;ufkp<;TSq<)Z`p;YX)q;H$Ll;H$On<)ifrrDWhu<)i`n-<+!o
+eCE1'g"P3:h;@/LioB+]k2tmll0@U$m-X60n*ol<o(2JFrq-?dp\4X]s7u]kqtpBjr;Fq?qYg<h
+q"t$drV?<brqHHdqt:!]s7?0Zs7--YrU0gUmHsl=!pf.:rosIH!9a@Ds5a7Aro=%<!9*q8!T2c5
+h#Z<crn7_4f[n_aAS#IcB4q3Wrb2ILCMRbcCBA<hD>\>PE;sqXEY`_<F`hkOGBeCYH?spaH[C-f
+I=H`sJGt0#K)gT(K`Hl,LC8opM2I4LN/`gWOHB*6!*/>a!)repm8X^7Chmg$C2%?pB4kgfARo=]
+raGn:@/aO5?3":1>lS".>5h\)=T;J%<rZ2"<;ohr;ZBVl;#a>k:Adic9`Ic_9)V?\8H22cs7oXe
+<W,no;h%bH8kViO9heAY:f("e;c?Xq<`W=*=^#'8?!grI@Uiq[B4u!pCMds.EH6/DGBeF[I!pKp
+JqJc3Ll..NO-#NgQ'Rf*S"6.DTqeE\W2co#Y->1;['mHS]=bkm_8=.0`lQ9Fbg+P]dF6Uqf@\d1
+gtgiEi8N_VjlY^hl0/iGlg4$,n*fc9o()DDo_%nNp@nO\s7u]kr;6KkrVcBfJcC]/J,~>
+JcC<$N;rPLrr)ior;6Njs7uWg!Vc<eo`=^Vrpk!tnF,f4m-O''l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bKJ#K`l5j4^V7@m\[])UZa$a;XfJG!VPKu\T:VRBR$X)&P)t`aN/EIIKnFu-Isl]jH$=FR
+F)c/;DJX*&BP1mf@qfh(I>3oTXhN-YcMl/gciMJ<rlkkqbK7fD`5KO/^q[XupUpU?]DfDA])]M=
+]`PjY]`#JA]`,PC\cK@QoXOt5rj`3B\[f5[\+I-,[JI?2[JmZ9\,Ec8[g':K[C!<IZi.91Zi@E4
+[J[B5[C3OA[fEr/\c9/?\%)FHr3e;c['R*EZIICTf@\g2gtgiEi8N\UjQ5Oekiq?tm-O--n*fc9
+nac8Bo^qhLp@e7TrqQKgs8)Wirqu]mc2RS<qu$6drVHKgqtU0brq?9_rq-6^rUTsXs7$$Vs6fpS
+rTjUOlK\B5s6'IGroX7B!9F.>s5F%;rnmh7hYu=3gtVh^s8)iprNQ>%\G`u8\E(3e\.NUqChmg$
+C2%?pB4baeARo=]raGn:@/aO5?3":1>QS,5>5h\)=T;J%<rZ2"<;ohr;ZBVl;#a>k:Adic9`Ic_
+9)V?]8?r3g](!?1]E1\u9`@b8:/=\_;,U=k<)lt#=BSd2>[:ZC?t!MSAS,RgBkqO&DK'T:FEMeP
+H@('hJ:W?+L51VCN/`m[P*D5uR$sM8StVmSV5L8lX0&S0ZEpsI\@K5a^;%M$`5Td<b0/#ScdC1i
+eCN7(g=k?<hVd>Oj5f=akNM0plg4!*mdKTPnF?)?oCV\Jp%J+RrV-BgrqcTjrVZZno_sFAMuS;~>
+JcC<$N;rPLrr)ior;6Njs7uWg!Vc<eo`=^Vrpk$unF,f4m-O''l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bKJ#K`l5j4^V7@m\[])UZa$a;XfJG!VPKu\T:VRBR$X)&P)t`aN/EIIKnFu-Isl]jH$=FR
+F)c/;DJX*&BP1mf@pEAPBlJ9ELQ[pfp6P]Es-<SJs-*DEplYK9qiUZ:rfd>ErfR&=r/^`8pl,96
+r/L9-s,I&=rJgf:pPo'/qhtB2rJgZ4mZ%7,"c\J#N/`enN<,'!rf$l8s3rIJf@\g2gtgiEi8N\U
+jQ5Oekiq?tm-O--n*fc9nac8Bo^qhLp@e7TrqQKgs8)Wirqu]mc2RS<qu$6drVHKgqtU0brq?9_
+rq-6^rUTsXs7$$Vs6fpSrTjUOlK\B5s6'IGroX7B!9F.>s5F%;rnmh7hYu=3gtVh^s1/0@#J@aa
+^VI_(_u@RW`Q#p<aSs:Eb0.uRcHjkadF$Cje'lgrf%/L+f@ej2gY:N=h;-rFi8N\UjQ5OekNM-o
+lKRX#m-O-,mdBT7o()DFp@n6>qi93d&T2H%CMR["BkV0mAnGUcA7T3L@KBnFra5\3!+#S/!aAi3
+r`T8's&]2#s&K(ur_rhps&&\js%iYir([/as%E5]rCR#[Z2aNVpl5*0rf7/A8kVkW9n#i5:f("e
+;c?Xq<``C+=^,-:?=.)K@Uit]B4u!pCi4-0EH?5EGBeF\I=?]tK7nu7M2I7OO-#NhQ'[l,S"6.E
+U84W`W2co#YHY==[C3TU]=bkm_8=.0a2lEHbg+P^daQ^sf@\g2gtgiFi8WeXjlYail07O#m-X60
+mgJXTo()DEo_%nNp@nO\!;ZWjrVQQkrr)KgJcCZ.J,~>
+JcC<$N;rPLrr)ior;6Njs7uWg!Vc<eo`=^VrpjdnnF,f4m-O''l0.<mjlGI]i8EJJgtLK7f@AC"
+dEp1`bKJ#K`l5j4^V7@m\[])UZa$a;XfJG!VPKu\T:VRBR$X)&P)t`aN/EIIKnFu-Isl]jH$=FR
+F)c/;DJX*&BP1mf@mNCL7K,gZ92JF`:B"&c;#3ub:A%E_;#X8i:AdoV:&n)h:&n#_:Adoe:A@Q`
+:A@W`:B"&g:'scl:JY"k<)Zaq;uKSp;cNWms&AtrrD`\n!`W)sr_iGe"&_un;Z0Po<;fhs<;ont
+;u]hs;ub>qf%8R.g>(N@hr*JQj5f=akNM0plg4!*mdKW6naZ2@oCV\Jp%J+Rp\sseq>^<gqu6Nk
+rQY?<rVQNfqu-Biq>9sdp\smap&=U`oDS7Znc/+Xn,MhUmJZAQlg!d7l2TrIkPjWDjT+B@j8\*=
+iVqa9hqn@g!SlH/gAYLb@qB4`AnPcUB`DcHCAquKD#S2UCi+$-DJsH4E;jkWErU7]FoHRfG^4R\
+HMr0pI!pEmIt3(KK)^H'K`6Z9L51P?Ll$tGMi3ORNK0*^oi1rkk#C\I&T2H%CMR["BkV0mAnGUc
+A7T3L@KBnFra5\3!+#S/!aAi3r`T8's&]2#s&K(ur_rhps&&\js%iYir([/as%E5]rCR#[Z2aMs
+p/V&jqbmPg92,=ZISN[8:f1+h;cHat='/U.>?kH??XR;O@qB7bBPD6uDJjE5F*)PKG^=^bIXm!%
+KSG8=MN!OUOHPinQ^F52SXuOLUnsufWiN8*Yd1UC[^`l[]Y;.s_SjF6aND]McHjnde'ut#f\5'7
+h;7)JioB+]k3(sml0I^&mI'H3$h3]Wo(2MGp%A%Pp\jjeq>U6hqu-HlrUg)?s,6o-~>
+JcC<$N;rPLrVc`nr;6Njs7uZhGk^q*p%@tLoCDJBnF,i6mHj0(l07BnjlGI]iS`VLgtUQ8f@JI#
+da?Cdbfe,L`l5j4^q[Rq]",8WZa-g=XfJJ#Vkp/^TUq[CR@';)P*(fcN/EIIL4k21J:;onH?aXV
+FE2A>DJX*'BP1pg@q'4oG_(a:Ts=L?rm1Pi!RK'ibm_e<aN)9<_ns7*^q[VY^&P_L]=PSc]=bfP
+^&GYL]=bbf]Y(khrjr0Arj`$?p:117rji'="M)%P\$u"<r3cF1qm?[=\[]/Y\$i^C[f3]7ZiIH1
+[/RE3ZiIN3[/[N6[emQ6\FmE1\Gs#B\@8rU[C3OCZl[`If@S^0gYL]Bi8EVTj5oFckNV6rlg4!*
+mdKW6nc&([oCW%Ts7QHerV6EgrqcQirVZWmbPqA:qu$6drVHKgqtU0brq?9_rq-6^rUTsXs7$$V
+s6fpSrTjUOlK\B5s6'IGroX7B!9F.>#NF_$i8EMMhYu=2h#@0MqZ6WoYl=^5rOMg8j14Nds)&Qg
+Chmg$Bk_6oB4baeARo:\@U`bS@/aL7?<pk9>QS,5>5h\)=9)G$<rZ/"<;fbq;ZBVl;#a>k:Adic
+9`Ic_9)_Dcs7Ntp]DfD@]73II9heAX:Jakb;H$Lo<`W:(=^#$7?!^lG@U`kZAnYjmCM[m,EH6,B
+G'A4XI!pKpJqJc3Ll%%KNfT<cPa7])S"-(BTq\?[Vl?\tXfnt7['mHS]"G_k^r"".`lQ6DbK\>Z
+dF-Opf%8U/gYL]Ci8N\UjQ5OekiqBum-G&GmdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*-
+s*t~>
+JcC<$N;rPLrVc`nr;6Njs7uZhGk^q*p%@tLoCDJBnF,i6mHj0(l07BnjlGI]iS`VLgtUQ8f@JI#
+da?Cdbfe,L`l5j4^q[Rq]",8WZa-g=XfJJ#Vkp/^TUq[CR@';)P*(fcN/EIIL4k21J:;onH?aXV
+FE2A>DJX*'BP1pg@q&\OAo2U7J;X#crg3VLrfdDHr0$l<r/gf<plbW?rf[8CqN1T8qi:K3!06r9
+o8`j1s,R#:s,QZ0qi(H2q2><5pPeHus,6u:N;\_]N/ipXN/Z9:f@S^0gYL]Bi8EVTj5oFckNV6r
+lg4!*mdKW6nc&([oCW%Ts7QHerV6EgrqcQirVZWmbPqA:qu$6drVHKgqtU0brq?9_rq-6^rUTsX
+s7$$Vs6fpSrTjUOlK\B5s6'IGroX7B!9F.>#NF_$i8EMMhYu=Agpjl)\[oAa]Y;+p^r"",rknrY
+`lH0ArlHP1bK\>Xcd:%ddF-Ile'umuf@\^-g"P07gYCT?hV[5LiT&t[jlbh+kQgA;l0I[%m-Xf?
+#Oq9So(2PJp\'UDNms'gDA@#)CMR[!BkV0mAnGUcA7K+Y@UW\Qra,_5?![G7!aAi3r`T8'!*B,"
+s&B%urDW_os&&\js%iYir([/as%E5]r^j<noo/[*p5XVq9MJ5V:/=\_;,U=k<E<.%=BSg3>[:ZC
+?t*SUAS,UhC27X'DfKf=FEVkRH@1-jJ:`E-L5:\EN/is]P*D9"R@B_<T:r!TVPgDnXKA\1ZF%'L
+\[oGe^VI_(`Q$!?b0/&Td*^:ke^i@*g=tH>hr*JQj5f=akNM0qlg3sEmI'H3nF?)?oCW%T!quB_
+rqQNhs8)Zjrqu`no_sFAMuS;~>
+JcC<$N;rPLrVc`nr;6Njs7uZhH2%%+p%@tLoCDJBnF,i6mHj0(l07BnjlGI]iS`VLgtUQ8f@JI#
+da?Cdbfe,L`l5j4^q[Rq]",8WZa-g=XfJJ#Vkp/^TUq[CR@';)P*(fcN/EIIL4k21J:;onH?aXV
+FE2A>DJX*'BP1pg@q%bk6UjI785;tZ:&n)c;#3ub:A.K`;#O2i:AdoT:'49e9hkCXqbR5epItW_
+peUf_s%iMerD3Go!EE+u;ZTirr_`er<)icor`&kqr`&eos&8tsr)3Gi!)WMhs&/eos&Aeo+]D?>
+eCE1&g"P3:h;7)JioB(\k2tjkl0@U$m-X60n*olHncA@Srq6<b!;HHes7uZjr;6HjrVaq=qYg<h
+q"t$drV??crqHEcr:U']s7?3[rpg$XrpTmTs6]dO!pf.:rosIH!9a@Ds5a7Aro47CiSi_Qhr!;i
+h#cA?@/aR;@Uit]B)ZHBB`DcLC27U%D#S2UCi+'.DJsH4E;jhdEcZ>EF`qtPGBeCYH@#R;s*Ouu
+IXcluJc:9$K)gT(Kb&onLPUbCM2I4LN/`gWOHB08r`//]l;dk%'l@c&CMIQtBP;$jAn>Oa@q/tW
+@:<RC?NOP>?2e(1>?Y50=oVS(=8c2"<<-"s;u]bq;>a8j:]F2f:&[id9D_?\8[&0e<;'>j;ufkq
+;L_>59heAX:Jakb;H$Lo<`W:(=^#$7?!^lG@U`kZAnYjmCM[m,EH6,BG'A4XI!pKpJqJc3Ll%%K
+NfT<cPa7])S"-(BTq\?[Vl?\tXfnt7['mHS]"G_k^r"".`lQ6DbK\>ZdF-Opf%8U/gYL]Ci8N\U
+jQ5OekiqBum-G&GmdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*-s*t~>
+JcC<$N;rPLrVc`nr;6Njs7uZhs7ZNerq1@)oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]",;Y['R$@XfSP%Vkp2`Tq7gER[BD+PEM#fN/NOKL4t82J:;onH?aXV
+FE;G@DJa0)BkV*iA7B"`F*N:sR&74hc2Z)gci)5jcMl&sbfe,L`l,g5_8*k$^A#;G]Xtbd]=Y_g
+r4N*Erk8?E"1u4X]D]DA]DoJ@\H'58\H'5?\HTLR\[],XoX=Y)r3lF/!4Vm9rjVp9!k5VHrO)L/
+rNlO2!4Dd4s0Vs;\$rgD[fEr6\H9:O\bEW6\,WlT[+*[Yf\5'7h;7&IiSrnYjlYail07L!m-X6?
+mfr:Oo()DDo`"Lbp@n=[q#C0iqYU0hr;?N[rql`WrqcTjr:p0fqYp<eq#:$epAFU`o`"I\o)J7[
+nGVhUmf2\Rm/QDOlMg#Lki_..k5XNCjSn0Hio/kSi8<GKq"X[aq?$QlrNQ;%\GWo9\Db!c\/B4&
+DJa6,CMR[!BkV0mAnGUcA7K+Y@UW\Qra,_5?![G7!aAi3r`T8'!*B,"s&B%urDW_os&&_kr_NPh
+r([2br_*,\XoJ%)q7HF5s1<bS9heAY:f("e;c?Xq<`W=*=^#'8?!grI@Uiq[B4u!pCMds.EH6/D
+GBeF[I!pKpJqJc3Ll%%LO-#NgQ'Rf*S"6.DTqeE\VlHf"Y->1;['mHS]"G_k^r"".`lQ9Fbg+M\
+dF6Uqf@\d1gYL`Di8N_VjQ>Ufl07L!m-X6@mfDqJrpg*]o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*-
+s*t~>
+JcC<$N;rPLrVc`nr;6Njs7uZhs7ZNerq1@)oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]",;Y['R$@XfSP%Vkp2`Tq7gER[BD+PEM#fN/NOKL4t82J:;onH?aXV
+FE;G@DJa0)BkV*iA7B"R@;'M"I"@7NQN*<OQN!0LPlHsGP5(1<OSb18P5UUEP5^U?OSb+9NqeS6
+Nr4n-NrP(=Nr+e9NpVi'N;\\%N:W#/N;ee<N/`hqN;\b9NZ*o,f%8R.g>(N@hr*JQj5f=akNM0p
+lKdg(mf)YZnF?)?oCMVRo`Fj]p\jmeq>^<gqu6NkrTsO\s5j7VrVQNfqu-Bjq>0mcp\smap&F[`
+oDS7[nc/+Wn,MhUmJcJPli68LklU)3kPjWDjT+B@isXl*iS`YOhqkiO\@DOKs186Cs1SNK_#D7N
+`;dgga2l?Dai_fMc-FV]d*^7hdf.]JeCE.%f[ng0g=k<9gt^`Bhr!DOj5]7_kND'ml07Ktlg*p(
+mI'E2nF?)?oC_hONVSUbN>ZYPDJa6,CMR[!BkV0mAnGUcA7K+Y@UW\Qra,_5?![G7!aAi3r`T8'
+!*B,"s&B%urDW_os&&_kr_NPhr([2br_*,\XoJ$Pp5Sm.InWR2:/=\_;,U=k<)lt"=BSd1>[1QA
+?X[DRA7]CeBkqL$DK'T9FEMePH?sseIt3-'KnbD?MiEdZP*;/sR$jG7StMdPUo(&iX0&P/Z*UgG
+\%0)_]t_A"_o9X:aihoRcHstfeCE1'g"P3:hV[8Mj5]4_k3)!nlKdg(mf2_VnF?MK!V>s_o`Fj]
+p\ssfq>^<hqu6NlrUg)?s,6o-~>
+JcC<$N;rPLrVc`nr;6Njs7uZhs7ZNerq1@)oCDJBnF,i6mHj3)l07Bnk2bR^iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]",;Y['R$@XfSP%Vkp2`Tq7gER[BD+PEM#fN/NOKL4t82J:;onH?aXV
+FE;G@DJa0)BkV*iA7B"76pjC47nQMT:B+,d;#O/k:esma:Adlf:A[fe;#O2i:AdoT:'49e:/1IX
+r(m;epItW_peUf_s%iPfqbR/k!EE+r;u]_q;uTbp;uTbp;uTbp;uTbr;uKVm;?'Ji;?'Pl;u]hn
+<>nidf%8R.g>(N@hr*JQj5f=akNM0plKdg(mf)YZnF?)?oCMVRo`Fj]p\jmeq>^<gqu6NkrTsO\
+s5j7VrVQNfqu-Bjq>0mcp\smap&F[`oDS7[nc/+Wn,MhUmJcJPli68LklU)3kPjWDjT+B@isar+
+iS`YOhqhaK@:<RC@0C%MAS,QRBE)ZEC&VoIC`@/+D/F0/DJsH4E,fl<EcZ>EF`qtPG^+LZH@#R;
+s*OuuIXcluJc:9$K)gT(KarimLPUbCM2I4LN/`gWOS;`P<U!KJ<>f^mDJa6,CMR[!BkV0mAnGUc
+A7K+Y@UW\Qra,_5?![G7!aAi3r`T8'!*B,"s&B%urDW_os&&_kr_NPhr([2br_*,\XoJ#mq,R8j
+!)rkpInWR2:/=\_;,U=k<)lt"=BSd1>[1QA?X[DRA7]CeBkqL$DK'T9FEMePH?sseIt3-'KnbD?
+MiEdZP*;/sR$jG7StMdPUo(&iX0&P/Z*UgG\%0)_]t_A"_o9X:aihoRcHstfeCE1'g"P3:hV[8M
+j5]4_k3)!nlKdg(mf2_VnF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s,6o-~>
+JcC<$MuWJLrVc`nr;6Njs7uZhs7ZNerq1L-oCDJBnF,i6mHj3*l07Epk2kX`iS`VMh;$`;f[n['
+e'ZOfc-+8Na2Q!6_8!^s]=GG[['R$AY-"_'Vl$8bTq@pHR[BG,P`h,hNJraOL4t83J:DupH?j^X
+FE;G@Df0B,BkV-jARf1`DKgM`Oe&Mac-=Q5ci)2kcd)L6%*Zo:a2Q$8_SO%'^V9KVs1J<Bs1J?E
+!ku@^rk89Crk&-Arjr6C\[qFD!4r0?s0r0A\@B$>[f!Q1[eI30\,<c7[g9FO\$i]P[^EO?[/@9-
+[/[N6[f3`9[f!T7\G<Z=\@K,Z\$u4Ds0j$!f@S^0gYCWAi8EVTj5f@bkNM0qlg4!*mdKW6nc&([
+oCW%Ts7ZKerqQNhrqcQirVZTlm/Hn^jo5,Tqu$3crVHNhqY:'arq?9_s7H<^rUU!Ys7$!Us6fpS
+rp9[Ns6BUJs6'IGroX7B!9F.>$0'q&i8F>'q"aabq?$QlrNQ>!\c0+s\a?m6E,TW3D/=$(CMIS_
+BE;aXrac=F@q/tW@:<RC?NOP>?2e(1>?Y50=oVS(=8c/$<E)rr;u]bq;>j>j:]F2f:&dod9DqJa
+s7<ht]D/u:9n#i5:f("e;c?Xq<``C+>$G6;?=.)K@Uit]B4u$qCi4-0EH?5EGBeF\I=?]tK7nu7
+M2I7OO-#NhQ'[l,S"6.DU84W`W2co#Y->4<[C3TU]=bkm_8=.0a2lBGbg+P^dF6Urf@\g2gtgiE
+i8N_VjlY^hl07L!m-X60mgJXTo()DDo_%nNp@nO\s7u]kr;6KkrVcBfJcCZ.J,~>
+JcC<$MuWJLrVc`nr;6Njs7uZhs7ZNerq1C*oCDJBnF,i6mHj3*l07Epk2kX`iS`VMh;$`;f[n['
+e'ZOfc-+8Na2Q!6_8!^s]=GG[['R$AY-"_'Vl$8bTq@pHR[BG,P`h,hNJraOL4t83J:DupH?j^X
+FE;G@Df0B,BkV-jARf1R?=R_hGCG7-q3M&Is-EYLrfdDHr0$l<rK-r>p6,E=rf[8CqN1W9s,I)=
+rJp]5!06r9o8`g0!06r9!06f5s,Qc3repo<N/[^nm>UXr"cSG"NJrkpN;\_Ve^rF+g=tE=hVd>O
+j5]4_k3(smlKdg'mI'H3nF?MK!V>s_p&Facp\ssfq>U6gqu-HjrTsO\s5j7VrVQNequ-Bjq>0mc
+p\smap&F[`oDS7[nc/+Wn,MhUmJcJPli68Ll2TrIkPjWDjT+B@is4T&iS`Y%[C?.Frji'?"h_O_
+^;.Sa_uIXg`Q#p<aN2KFb0/#RcHae`dF$CjrmNLLe^i@)f@ej2g=tB;gtgiEhr3PSj5oCckNM-o
+l0@R"lg4!*mdBT6nac8Bp@e9@pl<ma$?0p$DJa3+CMR[!rb)=FB)Z?HA7K+Y@UW\Qra,_5?![G7
+!aAi3r`T8'!*B,"!``3!rDW_os&&_kr_NPhr([2br_*2^XT.mNp5Ss0r_7i::Jakb;H$Ln<E<1'
+=^#$7?!^lG@:E_XAnPdlCM[m+E,fr@Fa&(VH[U?nJV/W1LP^nINK90aPa.T&R[]k>TVA6YVl6Vr
+Xfen6ZaI6O\\#Mg^VRe*`Q-'AbKS8XdF$Fmf%8R.g>(N@hr*JRj5oFckiq?slg4$,n*^YRnac8B
+oCV_Kp@e7Zq#C0iqY^6ir;HTdrdk*-s*t~>
+JcC<$MuWJLrVc`nr;6Njs7uZhs7ZNerq1L-oCDJBnF,i6mHj3*l07Epk2kX`iS`VMh;$`;f[n['
+e'ZOfc-+8Na2Q!6_8!^s]=GG[['R$AY-"_'Vl$8bTq@pHR[BG,P`h,hNJraOL4t83J:DupH?j^X
+FE;G@Df0B,BkV-jARf186:++484cBK:/4U];#X8j;#X8f:Amug:Adlf;"d]O:'+3d:%qE[:]F2a
+9`Rr`:]*uf:]!o_:B4Jp<WQ3"qGRPq;cHar<;fbq<;]\p<;fbn;ufkq;Z9Pl;#O8k;Z'Jn<;TZ9
+e^rF+g=tE=hVd>Oj5]4_k3(smlKdg'mI'H3nF?MK!V>s_p&Facp\ssfq>U6gqu-HjrTsO\s5j7V
+rVQNequ-Bjq>0mcp\smap&F[`oDS7[nc/+Wn,MhUmJcJPli68Ll2TrIkPjWDjT+B@irnB#iS`Ym
+?jC+J?t!JQ@V,ONs(D=Erb;@I#]+9mCM[j*Df5Pms)A!Xs)JosFEM_LGBS4UH$O^_H@(!dI!pHn
+J:N4MK)^H;KS>,7L51P?Ll$tGMi3ORNfT9%<Vf\m<U!KI<=3\`DJj<-Chmg$C&VcHB4h-S#@q=S
+@U`bS@/aL7?<pk9>QS,5>5h\)=9)G$<WZ9#<;fbq;ZBVm;#X8j:Adid9`@]`9!&'a<;BPj;uooq
+r_7i::Jakb;H$Ln<E<1'=^#$7?!^lG@:E_XAnPdlCM[m+E,fr@Fa&(VH[U?nJV/W1LP^nINK90a
+Pa.T&R[]k>TVA6YVl6VrXfen6ZaI6O\\#Mg^VRe*`Q-'AbKS8XdF$Fmf%8R.g>(N@hr*JRj5oFc
+kiq?slg4$,n*^YRnac8BoCV_Kp@e7Zq#C0iqY^6ir;HTdrdk*-s*t~>
+JcC<$MuWGKrr)ior;6Njs7uWg!Vc<eo`=^Vrpk+"nF,f4m-O''l0.<mjlGI]i8EJJgtLK7f@JI#
+dEp1abfe,L`l5j4^q[Rq\[])UZa-g<XfJJ#Vkg)]TUq[CR@';)P*(fcN/EIIL4k21J:;onH?aXV
+FE2A>DJX*'BP1pgA7At_EHctlP+f/'c-H=7rm1_mcHcC5$d?f8`l5m6_83q%^A#;@]`#JB]`,SH
+^:h7prk8?E#JId^]=beg]`,PC])T;B]",EI\c98?\c9/A\[],XoX=Y)r3l7*!k>_KqmcL3"h(hI
+[^EO@[/73,[/[Q5\,Ni8[fEr8\HB@P\@MUKrjMp:\,Nl]f%8R-g>(N@hr*JQj5f=akNM0plKdg'
+mI'H3nF?)?oCMVRp&F^cp\jmeq>^<gqu-HkrU'UXs6'CXrVQNequ-Bjq>0mcp\smap&F[`oDS7[
+nc/+Wn,MhUmJcJPli68LklU)3kPjTFjlGM%is4T8o_%tRq"apc"8i#prilG"\c91s\a?m7EH#i6
+DJa3+CMR[!rb)=FB)Z?HA7K+Y@UW\Qra,_5?![G7!aAi3r`T8'!*B,"!``3!rDW_os&&_kr_NPh
+r([2br_!5`WrE(2o=Fb0q76W%:/CjcISj!A<)lt"='/U/>?kH@?XR>PA7]@dBPM=!DJsN8F*)SL
+H$XjdIt3-'KnbD?Mi<[WOckroQ^O>5StD^NUo(&hWiW>+Yd1UC[^iu^]t_A"_o0O7aND]NcHjnd
+eC<($g"P39h;7)JioB+]k3(smlKdg'mI'H3nF?)?!V>s_p&F^cp\ssfq>^<hqu-HlrUg)?s,-i,~>
+JcC<$MuWGKrr)ior;6Njs7uWg!Vc<eo`=^Vrpk$unF,f4m-O''l0.<mjlGI]i8EJJgtLK7f@JI#
+dEp1abfe,L`l5j4^q[Rq\[])UZa-g<XfJJ#Vkg)]TUq[CR@';)P*(fcN/EIIL4k21J:;onH?aXV
+FE2A>DJX*'BP1pgA7AtP?Y+(qH%1^9qj.8Krg*PKrfdDHrK?r<rK-u?p6,B<rf[;DqN1T8qi:H2
+!06u:nrEa0!06N-s,R,=s,Qc3s,?u;s,?o7m#:[u!fW+tqi(Z9Mi@Xp,1bAug"P6;hV[8MioB+]
+k3(sml0@U$m-X60n*ol<o(2JFrq6<b!;HHes7u]kqtp?irVc-_pAa=TqYg<hp\XpcrqZEcrqHEc
+r:U*^rq$*Zs7--YrU9dSs6]gPs6K^MrojLJkNDj,!p/M(ro4%=Zi7?5[^Z7Grj`*A]=e-W!l2[j
+rP\]T&BDl5aiV`Lbg"GZd*U1fdaJ-D0%AG'f@\^.g"P07gYCW@hV[8MioB+]k3(pkkiq?slKdd&
+m-X6/nF5u=o(2SKq2P-/eVsrVE,TW3D/=$(CMIS_BE;aXrac=F@q/tW@:<RC?NOP>?2e(1>?Y50
+=oVS(=8c/$<E)rr;u]bq;>j>j:]F2f:&dod9)qSarrA&MN:r8/NWMpM:]=1>;,U=l<E<.%=BSg3
+>[:]D?t*SUAS,UhC27X'DfKf=FEVkRH@1-jJ:`E-L5:\EN/is]P*D5uR@B_<T:r!TVPgDnXKA\1
+ZEpsI\[oGe^VI_(`5Td<b0/&TcdC1jeCN7)g=tE=hVd>Oj5f=akNM0qlg4!*mdKW6nac5OoCW%T
+s7QHerqQNhs8)ZjrVZZno_sFAMZ82~>
+JcC<$MuWGKrr)ior;6Njs7uWg!Vc<eo`=^Vrpk+"nF,f4m-O''l0.<mjlGI]i8EJJgtLK7f@JI#
+dEp1abfe,L`l5j4^q[Rq\[])UZa-g<XfJJ#Vkg)]TUq[CR@';)P*(fcN/EIIL4k21J:;onH?aXV
+FE2A>DJX*'BP1pgA7At56UXC57nHHO:/Ca`r_NMir_NGer_NMgnPAIG"&DZe:%qE\:]=,`9`Rr`
+:]*uf:]!o_:]F5l<EK-"!``3!pf%2ms&Aqq!*&ho!*&kpr)<ku;,L4h;,R6frD<PmqGRAnr`(/n
+f@\d1gtgiEi8N\UjQ5Oekiq?slg4!*mdKW6nac8BoCW%Ts7QHerV6Egs8)WirVZWmmJchZkPk>V
+qu$3crVHNhqY:'arq?9_s7H<^rUU!Ys7$!Us6fpSrp9[Ns6BUJ!pJh1roO:DjQ-=#"6*Wn?i=@;
+@:3JO@:E_Xrau1Crb2=G!,DLK#]+9mCMdp+Df5Pms)A!X$$(*.FEMbMGB\<2GpI]_H@(!dI!pHn
+J:W9'JqJ]/KS>,7L51P?Ll$tGMi3ORNfT:n<U*QI<=<ecDf0H0Ci!m&C2*Z\!G?$DAHuaU@q&nU
+@:9(A!a]/<r`fM/>$Co.s&]8&rDiu"<)ifps&/korD<Jhs%`Jds%NDb!(s9k!*/Viq,R8j"&hoh
+:]=1>;,U=l<E<.%=BSg3>[:]D?t*SUAS,UhC27X'DfKf=FEVkRH@1-jJ:`E-L5:\EN/is]P*D5u
+R@B_<T:r!TVPgDnXKA\1ZEpsI\[oGe^VI_(`5Td<b0/&TcdC1jeCN7)g=tE=hVd>Oj5f=akNM0q
+lg4!*mdKW6nac5OoCW%Ts7QHerqQNhs8)ZjrVZZno_sFAMZ82~>
+JcC<$MuWGKrVc`nr;6Njs7uZhHh[7-p%@tLoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JI$
+da?Cdbfe,L`l5j4^q[Rq]",;Y['Hp>XfSP$Vkp2`TUq^DR[BD+PELueN/NOKL4t82J:;onH?aXV
+FE2A?DJa0(BkV*iA7B"UCiXcQNL-KJcMl/hd/VDlcMbusbfe/M`l5j4_8*k$^:sEVs1J?Cs1J?E
+r4`3Es1AHI]Y(lT]`#GD]",EE\H'5?\brr;\+@'+[JRE([JRH6\bru6[fj.I[C3L?[/73-[/[N8
+[^WaF[f3`9\G!K3\Gs#`[^Wcug"P39h;7)JiT&tZk2tjjl0@U$m-X60n*ol;o()DEo`"Lbp@n=[
+q#C0iqYU0gr;HT]rq6<SrqcTjr:p0fqYg6eq#:$epA=O_o`+O\o)J7[nGVhUmf2\Rm/QAOlM]rK
+ki_..joa`+jRN6@"n_N_q"X[aq?-WmrVj&$r42j;hmr-arc&9aDf0H0Ci!m&C2*Z\!G?$DAH?=O
+raPn9!+>e5!a]/<r`fM/>$Co.!a&N*rDiu"<)ifps&/korD<Mir_EAcs%EDcW;ln0o=Fb0qRV,N
+:Jakb;H$Ln<E<1'=]ns6>[CcF@:E_XAS5[jCMRd)E,fo?Fa&(VH@1-jJ:`E-L5:\EN/s'`PEhH$
+R@B_<TV8-VVPgDnXfen5Za@0M\[oGe^VI_(`Q$!@bKJ/Ud*^:ke^rF+g=tH>hr*JQj5f=akNM0q
+lg4!*mdL2F"S)'RoCW%T!quB_rqQNhs8)Zjrqu`no_sFAMZ82~>
+JcC<$MuWGKrVc`nr;6Njs7uZhHM@.,p%@tLoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JI$
+da?Cdbfe,L`l5j4^q[Rq]",;Y['Hp>XfSP$Vkp2`TUq^DR[BD+PELueN/NOKL4t82J:;onH?aXV
+FE2A?DJa0(BkV*iA7B"U?=@MbFF8Xur0IALs-EVKrfmGHrK?r<rfI)@p6,B<rf[8CqiL]9s,I)=
+rJp]5!06u:nrE'rrJpc7!07#;!06o8s,?u;!0$l7!K<$7Mu\e0N9lNLMi<YIg"P39h;7)JiT&tZ
+k2tjjl0@U$m-X60n*ol;o()DEo`"Lbp@n=[q#C0iqYU0gr;HT]rq6<SrqcTjr:p0fqYg6eq#:$e
+pA=O_o`+O\o)J7[nGVhUmf2\Rm/QAOlM]rKki_..jp'r.jKc+u[/RK5\,Wu;\c95H]=kqm^VI_(
+_u@UR`rF-ZaoBNcbg+N5d/VMndf7ere,\%uf)s[Yg"QG[,2D#1hr!DOj5]4^k3(pkkiqBslKdd&
+m-X6/nF5u=o(2SKqMk3/erBZK$?0p$DJa3+CMR[!rb)=FB)Z?BA7PUJs'Yn8ra,_5?![G7!aAi3
+r`K;)=',?$!``3!rDW_os&&_ks%iVhr([2b!)'9js,HW/p5T$2ISN[8:f1+h;cHat='/U.>?kE>
+?XR;O@qB4aBPD6tD/O<4EccGJG^=[`I=Hd!K8#&9M2R=ROHPfmQC+)0S=ZCIUSOcbWN*)'Yd(OA
+[^WfY]Y2(q_Sa@4aN;WKc-F\`daZh!f@em4h;-uHiSrnYjlYail0@U$m-X60s6p0]o()DErq-?d
+p\4[^s7u]kr;6KkrVcBfJcCW-J,~>
+JcC<$MuWGKrVc`nr;6Njs7uZhEqf;$p%@tLoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JI$
+da?Cdbfe,L`l5j4^q[Rq]",;Y['Hp>XfSP$Vkp2`TUq^DR[BD+PELueN/NOKL4t82J:;onH?aXV
+FE2A?DJa0(BkV*iA7B"Ur^6ZS!_H*^qb[;grD<Jhr(d5er_DuZl:qCV:/1IXr(m;epJ(Z_q+po`
+s%iMeq+prcrD`l!<W6##<E)rm;u]ht<;]Yp<;'8g<!H8u;,U:h;>a8h;#jMi;^57Af@em4gtgiF
+i8N_VjQ>UfkiqBum-O--n*fc9nac8Bo^r.U!quB_rV6Egs8)WirVZWmmJceYkPk>Vqu$6drVHKg
+qtU0brq?6^s7H?_r:9mXs7$!Us6fpSrp9[N!:'OI!pJh1roO@FjQ'WQra#S3ra>b7"^kbI@U`mI
+B)ZHCB`;]KC27U%D#S5MD>nGQDuXeUE<L<'FED[)FrkjPH$O^^H[:$cI!gBlJ:N3%JqAW-KS5&4
+L5(J=M#N59MMmCONK0*^o2Y*UkZ.V%$?0p$DJa3+CMR[!rb)=FB)Z?BA7PUJs'Yn8ra,_5?![G7
+!aAi3r`K;)=',?$!``3!rDW_os&&_ks%iVhr([2b!)'9js&JYiq,R8jISN[8:f1+h;cHat='/U.
+>?kE>?XR;O@qB4aBPD6tD/O<4EccGJG^=[`I=Hd!K8#&9M2R=ROHPfmQC+)0S=ZCIUSOcbWN*)'
+Yd(OA[^WfY]Y2(q_Sa@4aN;WKc-F\`daZh!f@em4h;-uHiSrnYjlYail0@U$m-X60s6p0]o()DE
+rq-?dp\4[^s7u]kr;6KkrVcBfJcCW-J,~>
+JcC<$MuWGKrVc`nr;6Njs7uZhs7ZNerq1F+oCDJBnF,i6mHj3)l07Eok2kX`iS`VMh:pZ:f@SR&
+da?Fec-+8Na2Q!6_8!^s]=GG[['R$AY,nY&Vl$8aTq@pHR[BG,P`h,hNJraOL4t83J:DupH?j^X
+FE;G@Df0B,BkV-jARf1XBl8*BL6A")[f4VPciVP=cMburbfe,K`Poa2_8*h"^APYE^AbeG]`,PC
+]`,VB^AbeG]`,VA]`,PB\cK@Qp::47rji'="1bqN\+I-+[J[K&[/mnMqmZX:r4)U4!4Mj6qm?:-
+qQp71qmHR8\@D@F!4`$=rj`!;*4FMQg=tH>hr*JQj5f=ak32'olKdg'mI'H3nF?MK!V>s_p&Fac
+p\ssfq>U6fqu6NkrU9aUs60IYrVQNequ-Bjq>0mcp]'sap&F[aoDJ1Znc/+Wn,MeUmJZDOlN$5K
+kmck>kN:pqnF?&?oCV_LrqHKhrqZ]orVj##r4)g;hRW$`$$($*E,]`5DJa4hCB80arb)=FB)Z?B
+A7PUJ!b#JEra,\4?2e+/>Q7n+=TV],=8l8#<W?%s;u]bq;>j>k:]=,e9rJ$i]CWW1]DK0g:/=\_
+;,U=k<*!%$=BSg3>[:ZC?t!MTAS,RgC27X'DK'T:FEVkQH@('hJ:W?+L51VCN/`m[P*D5uR$sM8
+StMdQV5L8lX0&P/Z*UjH\@K5a^;%M$`5Td<aihoRcd:(geCE1'g"P6;hV[8Mj5]7`k3)!nlKdg(
+mdKTKnF?)?oCMVRo`=d\rV6Egs8)Zjrqu`no_sFAMZ82~>
+JcC<$MuWGKrVc`nr;6Njs7uZhs7ZNerq1F+oCDJBnF,i6mHj3)l07Eok2kX`iS`VMh:pZ:f@SR&
+da?Fec-+8Na2Q!6_8!^s]=GG[['R$AY,nY&Vl$8aTq@pHR[BG,P`h,hNJraOL4t83J:DupH?j^X
+FE;G@Df0B,BkV-jARf1X>@(fSEHce`MuK%AQN3?LQ2[!JPPp[>OoCI@OnFn9PQ$aEOo(7;Nrk?$
+NW+t6NW5%:NUr20N<#"-NW+t<NW5%9N<#":N<#"8N<"q:N<"q:MZSisNVn_9NK!jppl+p+!0$f7
+*fc5>f\,!5h;-uHiSrnYjlY^hl07L!m-O--n*fc9rpg*]o`"O`pAamdq#C0hqYU0hr;?N^rpg$P
+rqcTjr:g*eqYp<eq#:$fpA=O_o`+O\o)J7[nGVhUmJuYQm/QAOlM]rSki_-kk-2+rZEpn:[03qI
+\%&sI\I,p[]=kqm^qmq,_u@UR`rF-[aT]i1bfnAYrm:\ms3gqr"k;)Rf@\^SfbW;rgYCT?h;@,K
+iT&tZjlYahkih9rl2L#KljE.Jn*ol;o(2MIpA9jCNn'*qEcH)<E,TW3D/B2e!GZ?JBE;aXrac+@
+A,]p=@:3LB?NFJ=r`oJ-s'#D)!a&N*r`9&!s&Aqqs&/korD<Mir_EAcVuQ^To8NO*!0$o:s,MP'
+:Jakb;H$Ln<`W:(=^#$7?!^lG@:EbYAnPdlCM[m+E,fr@G'A1WH[U?nJV/W1LP^nINK90aPa.T&
+R[]k>TV80XVl6VrXfen5ZaI6O\\#Mg^VRe*`Q-'AbKS8Xd*^=le^rI,g>(N@hr*JRj5oFckNV6r
+lg4$,n*^JMnac8BoCW%T!VZ9dq#C0iqY^6ir;HTdrdk*,s*t~>
+JcC<$MuWGKrVc`nr;6Njs7uZhs7ZNerq1F+oCDJBnF,i6mHj3)l07Eok2kX`iS`VMh:pZ:f@SR&
+da?Fec-+8Na2Q!6_8!^s]=GG[['R$AY,nY&Vl$8aTq@pHR[BG,P`h,hNJraOL4t83J:DupH?j^X
+FE;G@Df0B,BkV-jARf1X5sdn,7n?-D:&@`e:]+&g:]=,g:]4&c:B45d:[1[T:\7E[:]=,`9`Rra
+:]!le:\mi^:]=2j:B=9mqGmMq!``3!q,7Ap<E3#s;u]hp;ZKeo;uT_r;uTYo;Z9Pm;#O5k;Ya61
+f\,!5h;-uHiSrnYjlY^hl07L!m-O--n*fc9rpg*]o`"O`pAamdq#C0hqYU0hr;?N^rpg$PrqcTj
+r:g*eqYp<eq#:$fpA=O_o`+O\o)J7[nGVhUmJuYQm/QAOlM]rNki_-kk$@girF#Y6"^kbI@UisJ
+B)ZHCB`;`FCB\QkCMRa'rbh^Rs)@sW%<?N3FEMbNG'J7WH$Xf8HiJI+IXcltJUrE)K7ei1KnP28
+LPL]bM$JorMi<XUOHAp2n5SRN$$($*E,]`5DJa4hCB80arb)=FB)Z?BA7PUJ!b#JEra,\4?2e+/
+>Q7n+=TV],=8l8#<W?%s;u]bq;>j>k:]=,e9rJ$i<V'2d<VoaE:/=\_;,U=k<*!%$=BSg3>[:ZC
+?t!MTAS,RgC27X'DK'T:FEVkQH@('hJ:W?+L51VCN/`m[P*D5uR$sM8StMdQV5L8lX0&P/Z*UjH
+\@K5a^;%M$`5Td<aihoRcd:(geCE1'g"P6;hV[8Mj5]7`k3)!nlKdg(mdKTKnF?)?oCMVRo`=d\
+rV6Egs8)Zjrqu`no_sFAMZ82~>
+JcC<$MZ<AKrVc`nr;6Njs7uZhs7ZNerq1L-oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$`<f[n['
+e'ZOfc-+;PaMu3:_SEq!]=GG[[Bm0CY-"b)W2?AcTqJ!IS!fY/P`h/iNf8jPLPCJ7JUi2tH[9p\
+F`_YDDf0E-C1q9mARo7Y?tjV)JVfS^Xh2pYd/VE'cHXYZc-4ARaMu3;_SO%'^](tI^&GbG^&PbF
+]DoPC^&PeH^](tE^&>SF]tD#W]*5dV]",A_pUL:8rjhs:!4VR.!4;[3rO2+$s1JQH\[]/[ppg10
+!4Mj6qm?=.qR$70rO)m=\@B)[\GNi:\Gs,>\/2U+g=k?<hV[8MioB+]k3(sml0@U$mI'uB#4V0R
+o(2JFrq6<b!;HHes7uZjr;6HjrVc0`nc.eOqYg?ip\XpcrV??crqHEcr:U']s7?0Zs7--YrU9dS
+!:BaOs6B[MrTOaSmI'H4nF?)@oCV_MrqH]nqYL*erVj##fX^CZ$?L6-EH#l8DJj<-rbDOLC&VcH
+B4h-S!G#^>@KKtG@/aL6?=!P8s'#J,rE02(=',B%s&K(urDW_os&&_ks%iVhr_99ir4D.'s%n2B
+;H$Ln<E<.%=]np4>[:]D@:E_WAS,UhC27[(DfKf=FEVkRH@1-jJ:`E-L5:\EN/is]P*D5uR%'V;
+T:r!TV5L;mXKA\1ZEpsI\@K5a^;%M$`5Td<b0/&TcdC1jeCN7(g=tE=hVd>Oj5f=akNM0plg4!*
+mdKW6nac5UoCV\Jp%J+RrV-BgrqcQirqucoo_sFAM>r)~>
+JcC<$MZ<AKrVc`nr;6Njs7uZhs7ZNerq1L-oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$`<f[n['
+e'ZOfc-+;PaMu3:_SEq!]=GG[[Bm0CY-"b)W2?AcTqJ!IS!fY/P`h/iNf8jPLPCJ7JUi2tH[9p\
+F`_YDDf0E-C1q9mARo7Y?sI&MD0'rOLQRo%QiEBMQ2[$IPQ$a?OoCIAOnFn8PQ-gFOo(7;O8k7?
+NW+t6N<#":NUi,-N<"q.NW"k;NW+q>NKB4uN<#"9N<#"7N<>-!NK!jp!fW+urJUc:N;SV0N;\_9
+N;JV7N;SYNf\5'7h;7&IiSrnYjlYail07L!m-X6?mfr:Oo()DDo`"O`p&Ojcq#C0hqY^6hr;HT^
+rpg$OrqcTkr:g*eqYg6eq#:$epAFU_o`+O\o)J7[nGVhUmJuYQm/QAOlM]rIkl.dfZ*L\7Zi7?8
+[^W`U\Gj#I]">Yh^;%J#_o0I2`;[dUaT'?ib0/#QcHjkadF$CjrmN%?e^rF*f@ej2g=tB;gtgiE
+hr3PSj5f=akND'ml0@R"li-5XmI'H4nac8Bo_/%WNV/=^N='`IEH,r:Df0H0D#S2NC2*Z\!G?$D
+AH?=OraGq;?srt@!FB(2>lS".>5_S*=BAT'<rZ2"<;fbq;ZBVm;#a>j:B!tbs87lBN;efcN_iPL
+;H$Ln<E<.%=]np4>[:]D@:E_WAS,UhC27[(DfKf=FEVkRH@1-jJ:`E-L5:\EN/is]P*D5uR%'V;
+T:r!TV5L;mXKA\1ZEpsI\@K5a^;%M$`5Td<b0/&TcdC1jeCN7(g=tE=hVd>Oj5f=akNM0plg4!*
+mdKTPnF?)?oCV\Jp%J+RrV-BgrqcQirqucoo_sFAM>r)~>
+JcC<$MZ<AKrVc`nr;6Njs7uZhs7ZNerq1L-oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$`<f[n['
+e'ZOfc-+;PaMu3:_SEq!]=GG[[Bm0CY-"b)W2?AcTqJ!IS!fY/P`h/iNf8jPLPCJ7JUi2tH[9p\
+F`_YDDf0E-C1q9mARo7Y?pd:L7R]j=928:X;#X8j:Amue:Adoe;#*oO:'+3d:%qE\:]=,`:&dua
+:]!le:]=)h:&[oa:]4)i:]=/j:]=Dk<W6##<E)rn;Zg!!<E/rrr`&hp!*&hor_s&";Gg:h;Z0Jm
+;#O5k;YsB.f\5'7h;7&IiSrnYjlYail07L!m-X6?mfr:Oo()DDo`"O`p&Ojcq#C0hqY^6hr;HT^
+rpg$OrqcTkr:g*eqYg6eq#:$epAFU_o`+O\o)J7[nGVhUmJuYQm/QAOlM]rIkl"fe?3":0?N":3
+@0BtH@U`jGB)cNCB`;`GCBeTlCi!m'D>nDdE,TZ6E,fl<EcZ>EG'8(QG^+LZrd+Tks*OuuIXclt
+Jc:9$KE$W)L&Zo-LC8opM2I1KN/WaVOHAa-p/L0S$?L6-EH#l8DJj<-rbDOLC&VcHB4h-S!G#^>
+@KKtG@/aL6?=!P8s'#J,rE02(=',B%s&K(urDW_os&&_ks%iVhr_99ir)MoZs%n2B;H$Ln<E<.%
+=]np4>[:]D@:E_WAS,UhC27[(DfKf=FEVkRH@1-jJ:`E-L5:\EN/is]P*D5uR%'V;T:r!TV5L;m
+XKA\1ZEpsI\@K5a^;%M$`5Td<b0/&TcdC1jeCN7(g=tE=hVd>Oj5f=akNM0plg4!*mdKW6nac5U
+oCV\Jp%J+RrV-BgrqcQirqucoo_sFAM>r)~>
+JcC<$MZ<>Jrr)fnrVQWks7uWgI/!@.p%@tKoCDJBnF,i6m-O''l0.<mjlGI]iS`SKgtUQ8f@JI#
+dF$:cbfe,L`l5j4^q[Rq]",;YZa-g=XfSP$Vkp2_TUq^DR@';*PELueN/NOKL4t82J:;onH?aXV
+FE;G@DJa0)BkV*iA7K(V?Yab1JrGthY/UCe"4,9=cMl&rbfe,K`l5j4_8*h#rk8BGrkABF!PH&D
+]`,VE^&YqI^&bp]qn<$Bs1J]N]=bbf]"5G`p:117rOMm:s0qX/qmH@1o<eS*rj;a5rj;a1rk/HH
+\[f5\ppg10!4Mj6qm6F2['TS8rjDa6!k5\Lr4)p>\[f6K\KSH8g=tE=hVd>Oj5]4_k3(smlKdg'
+mI'H3nF?&>o(2MGrq-?dp\4X]s7u]kqtp?irVc3amf2MMqYg?ip\XpcrV??crqHEcr:U']s7?3[
+s7-*XrpTmTs6]dO&aS`Il0Rd(mdKW6naZ5Bo_%qWp]1-hq?$Qmric@R\aI!-F:*)0EH,r9Df0H0
+D#S2NC2*Z\!G?$DAH?=OraH+@?sm>K?=$q:>lS".>5_S*=BAT'<rZ2"<;fbq;ZBVm;#a>j:8Ipe
+]BQp,:k)>?;c?Xq<``C+=^,-9?=.)K@Uit\B4u!pCMds.EH6/DGBeF[I!pKpJqJc3Ll%%KO-#Ng
+Q'Rf*S"-(CTqeE\Vl?\tY->1;['mHS]"G_k^r"".`lQ9EbK\>ZdF-Opf%8U/gYL]Ci8N\UjQ5Oe
+kiqBum-O--n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*+s*t~>
+JcC<$MZ<>Jrr)fnrVQWks7uWgI/!@.p%@tKoCDJBnF,i6m-O''l0.<mjlGI]iS`SKgtUQ8f@JI#
+dF$:cbfe,L`l5j4^q[Rq]",;YZa-g=XfSP$Vkp2_TUq^DR@';*PELueN/NOKL4t82J:;onH?aXV
+FE;G@DJa0)BkV*iA7K(V?X@2UD01&QLQ_Y'!1*PJrfmDGrf[)>rfI,Aoof6:rf[8CqiL]9!fi8"
+rf6f6s,R#:o8`a.!0$H-rf7#<s,R&;",`2%O8Fn:Nr+e9Nr"b8N;nkGN/NUQN/`gUNJrjVN;SV/
+N;SY;N/`gUrJ_tZg"P39h;7)JioB([k2tjjl0@U$m-X60n*ol;o()DEo`"Lbp@n=[q#C0iqYU0g
+r;HT_rpKgMrqcTkr:g*eqYg6eq#:$epAFU_o`+O]o)J7ZnG_nVmf2\QliZS=lKS;Oricg9ZEggC
+['d<M\$rlWrj`<G]=Ybj^;%M$r5ATSrlG,]$d6c<c-FY^d*^7hdf.]JeCE1&f[ng0g=k<9gt^`B
+hr*JQj5f:`k3(pkkiqBtlg*p(mHsB2nF?)?o_%qVNUr1]NW4)-F)l8?E,TZ4DJa4hCB80arb)=F
+B)Z?BA7PUJ#@V"J?XI,G?2e+/>6%k*=TV],=8l8#<W?%s;u]bq;>j>k:]=+bs8.fAN;nn;:k)>?
+;c?Xq<``C+=^,-9?=.)K@Uit\B4u!pCMds.EH6/DGBeF[I!pKpJqJc3Ll%%KO-#NgQ'Rf*S"-(C
+TqeE\Vl?\tY->1;['mHS]"G_k^r"".`lQ9EbK\>ZdF-Opf%8U/gYL]Ci8N\UjQ5OekiqBum-O--
+n*fc9o'uhQo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*+s*t~>
+JcC<$MZ<>Jrr)fnrVQWks7uWgFnbV'p%@tKoCDJBnF,i6m-O''l0.<mjlGI]iS`SKgtUQ8f@JI#
+dF$:cbfe,L`l5j4^q[Rq]",;YZa-g=XfSP$Vkp2_TUq^DR@';*PELueN/NOKL4t82J:;onH?aXV
+FE;G@DJa0)BkV*iA7K(V?U7!W70?(Q9i(O\r_EMhr(m8drD3Dhq+p9N!)N2]r(m;epItW_q+pl_
+s%iVh!_lEbrD*Dgr_NMis%iYkrD*DfrDr_os&K2$<)iZl"]SK%<)Z`o<!6-!;cH`n;u]f!;c6Ii
+r_iMg!)ibo+PGK'gtgiFi8WeWjQ>UfkiqBum-O--n*fc9nac8Bo^r.U!quB_rV6Egs8)WirVZWm
+n,DbTkl1GWr;?<drVHKgqtU0brq?9_rq-6^rUU!Yrp]pUs6fpSrTj^RlK[V=>l@t-?3":1?3"@3
+@/j[8?ishH@q5LMrb)4Ds(MOLCMWocs(_aSDJjB1rbqgUs)AosF)uGGG'8(QG^+LZH@'sbH[L3i
+IXcluJc:9$K*$^[L&Qi,LC/ioM2I1KN/WaVOQ9F?<97-[F:*)0EH,r9Df0H0D#S2NC2*Z\!G?$D
+AH?=OraH+@?sm>K?=$q:>lS".>5_S*=BAT'<rZ2"<;fbq;ZBVm;#a>j:8Ipe<U!K_:k)>?;c?Xq
+<``C+=^,-9?=.)K@Uit\B4u!pCMds.EH6/DGBeF[I!pKpJqJc3Ll%%KO-#NgQ'Rf*S"-(CTqeE\
+Vl?\tY->1;['mHS]"G_k^r"".`lQ9EbK\>ZdF-Opf%8U/gYL]Ci8N\UjQ5OekiqBum-O--n*fc9
+o'uhQo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*+s*t~>
+JcC<$MZ<>JrVc`nr;6Njs7uZhI/!@.p%@tLoCDJBnF,i6mHj3)l07Bnk2bR_iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]=GDZ['R$AXfSP%Vl$8aTq@pGR[BG,PEM#gNJraNL4t83J:DupH?j^X
+FE;G@Df0B,BkV-jARf1X?YXG$IY3ZIUp9pGs3L_js31npbK7iG`Pf[1_8-&b!PZ8G^AbhE]`,VE
+^AktF^AknH^'23_]tM(krjr?F\[oA_](``8])K8<\Gs&2[K3eCr3cL3p9an/qm?F2r3ZR2Z2D<8
+])T>?\,a#8\GEZ7[f3Z9['d==ZiIH1ZiRSArjDd7s0r!;!P,`:\K&,ig=k?<hV[8MioB+]k2tml
+l0@U$m-X60n*olHncA@Srq6<bs7cKes7u]kqtpBjr;H-ali65KqYg?ip\XpcrV??crqHEcr:U']
+s7?3[s7--YrU9dSs6]dOs6K^Os6U0]n*oi:o(2JFp%JC[!;ZWj!rW#rYQ*4bm^N^KFEDSEEH,r9
+Df0H0D#S2SC2%?pB4kiUAH?=OraH+@?sm>K?=$q:>lS".>5_S*=BAT'<rZ2"<;fbq;ZBVm;#a=c
+s8'@m\p[CP;H$Lo<`W:(=^#$7?!^lG@U`kZAnPdlCM[m+E,fr@Fa&(VH[U?nJV/W1LP^nINK90a
+PEhK%R[]k>TV8-WVl6VrXfen5Za@0N\\#Mg^VRe*`Q$!@bKS8Xd*^=le^rI,g>(N@hr*JRj5f@b
+kNV6rlg4$,n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*+s*t~>
+JcC<$MZ<>JrVc`nr;6Njs7uZhJ+r[1p%@tLoCDJBnF,i6mHj3)l07Bnk2bR_iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]=GDZ['R$AXfSP%Vl$8aTq@pGR[BG,PEM#gNJraNL4t83J:DupH?j^X
+FE;G@Df0B,BkV-jARf1X?X-rKBPqs>J;TYZQN3?MQ2[$IPQ$a?OoLOBOn=h7PQ$aFOTCQ+rK-o;
+s,R,=rf6f6!06u:o8`^-!0$K.rJpo;!06r9s,-c:!0@#:!06r9!06r9rf$l:r/CT6!fW+ur/:6,
+qMcJRNS<+Ah;7&IiSrnYjlY^hl07L!m-O--n*fc9rpg*]o`"O`pAamcq#C0iqYU0hr;?N_rp0UK
+rqcTkr:g*eqYg6eq#:$epAFU_o`+O]o)J7[nGVhUmf2\QliaMrYck80YlCs.ZMq30[03qI\%&sI
+\HodY]Y2%o^VRhd`!+-"`lH0ArlG;dbfnAYrm:\ms3gnq!S#[!f+cljg"P07gYCT?hV[8MioB+]
+k3(q,kRm(ElKdd&m-X3/n*ol<o(;VKrf-K/er:,]FEDSEEH,r9Df0H0D#S2SC2%?pB4kiUAH?=O
+raH+@?sm>K?=$q:>lS".>5_S*=BAT'<rZ2"<;fbq;ZBVm;#a=cs8%`@N.-a_;,U=k<E<.%=BSg3
+>[:ZC?t*SUAS,RgC27X'DK'T:FEMePH@('hJ:W?+L51VCN/`m[P*;/tR$sM8StMdPV5L8lX0&P/
+Z*UgG\@K5a^;%M$`5Ta;aihoRcd:(geCE1'g"P6;hV[8Mj5]4_k3)!nlKdg(mdKW6nc&([oCW%T
+!quB_rqQNhs8)Zjrqu`no_sFAM>r)~>
+JcC<$MZ<>JrVc`nr;6Njs7uZhI/!@.p%@tLoCDJBnF,i6mHj3)l07Bnk2bR_iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]=GDZ['R$AXfSP%Vl$8aTq@pGR[BG,PEM#gNJraNL4t83J:DupH?j^X
+FE;G@Df0B,BkV-jARf1X?U7%F6qBj=8P](XpeUi`rD3AgqG6<M!`)QcpJ1W^r_E2^s%`DdqG%#d
+r_<Pi:/+L_:B4/h:]4,i:B45g:BOEf<E9$!qGd`!<E<.#<)i]ms&B"upf%;n<)icos&8tsrDNYo
+!)iVi*E#g7g=k?<hV[8MioB+]k2tmll0@U$m-X60n*olHncA@Srq6<bs7cKes7u]kqtpBjr;H-a
+li65KqYg?ip\XpcrV??crqHEcr:U']s7?3[s7--YrU9dSs6]dOrET8+s'>\2rEfG1s'Z(=@:E\U
+AH$3?BE)ZEBaAHhCi+!)CM[keDZ4SSE;jh[EcZ;DFoHOrGBe@XH$Xg`H[C-fIXZcsJ:[]Os+:H-
+KnY89reCi:M2@+JMi<XTNf_1Z%<Zc7F)l8?E,TZ4DJa4hCBeNfBP;$kB)Z?BA7PUJ#@V"J?XI,G
+?2e+/>6%k*=TV],=8l8#<W?%s;u]bq;>j>k:SRmc<U*P3:f1+h;cQk!='/U/>?kH??XR>PA7]@c
+BPM=!DJjE5F*)PKG^=^bIXm!%KSG8=MN!OUOHPfmQ^F52SXuLJUSXleWiN8)Yd(OA[^`l[]Y;.s
+_SjF5aN;WLcHjkbe'uq"f\,!6h;7&IiT&tZk2tjkl0@U$mI'H3nF?MK!V>s_o`Fj]p\ssfq>^<h
+qu6NlrUg)?s,$c+~>
+JcC<$M?!8JrVc`nr;6Njs7uZhs7ZNerq1O.oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-+8Na2Q!6_8!^s]=GG[[Bm-BY-"b)Vl$8bTqJ!IS!fY/P`h/iNf8jPLPCJ7JUi2tH[9p\
+F`_YDDf0E-C1q9mARo7Z?sdVdGC54/RAdI=rm(Sirlkqsb/q]D`PfX1_8*k$^;'W\!PQ5G]`>_E
+^&PhG^\khG^&PhE]a29_]Xtee]",EG\H'5>\c'&<\+I*2[C!?KrjD^5pU("0rj;a5rj;a5qm?O7
+Za-h6]a)3`]=YYb\@DOIrOD[4!4Mj6!OT9/[/792[KF"I\@;IIrOEcT\[gGKgtgiFi8N_VjQ5Oe
+kiq?sm-O--rpL'\nac8BoCW%Ts7QHerV6EgrqcNhrqu]mnG__QlMgYYqu$3crVHNhqY:'arq?9_
+s7H<^rUU!Ys7$!Us6fpS''\]Hlg*p(mI'E2nF?&>oCV_LrqQNhrqc`priZ:R\a?m,FoHIdF)l8?
+E,Y_n&8c6!CMITuBP;$jAn>OaA7PUJ!F]C8?iOF4?2e+/>6%k+=oVV(=8l8#<W?%s;ZK_p;>sCb
+s7s:m\pdOU;cHat<`iL->$P<<?XI5N@q9._BPD3sD/O93EcZ>GGBnL^I=Hd!K8#&9M2R=QO-,Ti
+Q'[l,S=Z@HU84W`W2cr$YHY==[C3TU]=bkm_8=.0a2lEHbg+P^daQ^sf@\g2gtgiFi8N_VjlY^h
+l07L"m-X60n*ol<o)J:bo_%nNp@nO\s7u]kr;6KkrVcBfJcCT,J,~>
+JcC<$M?!8JrVc`nr;6Njs7uZhs7ZNerq1U0oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-+8Na2Q!6_8!^s]=GG[[Bm-BY-"b)Vl$8bTqJ!IS!fY/P`h/iNf8jPLPCJ7JUi2tH[9p\
+F`_YDDf0E-C1q9mARo7Z?sd/GASZ:.I=mEDQBqK7rfmDGrf[)>!0I2Bo90$8rf[2ArK-o;!07&<
+s,Qo7s,R#:o8`g0",r4uN:W&-NrP+=NqnY9MM[2gOT1C;N<"q2NW+k:NVe\3N<"q8Mt;lFNJrjV
+g=tE=hVd>Nj5]4^k3(sml0@X%mI'uB#4V0Ro(2JFrq6<b!;HHes7uZjqtpBjr;H-alMp/KqYg<h
+p\XpcrqZEcrqHEcr:U*^rq$*Zs7--YrU9dSs6]fg!O&a,YPta5Z*L[AZa@-J[^N[E\Gj&=]*5j\
+^;%J#r59&``l?'?aN;QHbKS2Uci2;kdJqYpdfS%Lf)F8:f\+s3g=tB;h;-rFi8N\UjQ5OekNM./
+klpA<lg4!*rpL-^nac8Cp%FB)nW)1[!-S9_"`n^(EH#jqD@gZ$CMR["BkV0mAnGUcA7T3L@KBnF
+ra5\3!+#S/s'#J,r`T8's&]2#s&K(urDN\or_`YkT`=hIl\p9j;c?Xq<`W=*=^#'8?!grI@Uiq[
+AnYmnCMds-EH6,BG'A4XI!pKpJqJc3Ll%%KNfT<cPa.T&R[ftATq\?ZVl6VsXfnt7ZaI6O\\#Mg
+^VRe*`Q-'BbKS8XdF-Lnf%8R.g>(N@i8ESSj5oFckiq?sm-O--n*fc9o()hP"n_K\p@e7Zq#C0i
+qY^6ir;HTdrdk*+s*t~>
+JcC<$M?!8JrVc`nr;6Njs7uZhs7ZNerq1L-oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-+8Na2Q!6_8!^s]=GG[[Bm-BY-"b)Vl$8bTqJ!IS!fY/P`h/iNf8jPLPCJ7JUi2tH[9p\
+F`_YDDf0E-C1q9mARo7Z?sc8f6:4.18P;eS;#!ib:B+,f;#3uP:&n)]:Adoe:A7H_:AI]^:&n)h
+:B+#g:Amri:/=[a;#a>k;#*oe:]O8i<<?3$<r5ns<!63%<`E&o;Z]ou<V05p;cH[o<)cfp;Z9Vp
+;Ys<,;VKm\h;7)JiT&tZjlYail07L"m-X6?mfr:Oo()DDo`"O`p&Ojcq#C0hqYU0hr;?N_rp'OK
+rqcTjr:g*eqYp<eq#:$epAFU`o`"I\o)J7[nGVhUmf2\R>Q%h)?2n42?2\+/@/aR<?t!MS@qGUN
+s(D@Frb;CJ#&J-mCMRa'rbh^Rs)@sW"EJR*FERS+!I&efGmo"GH@(!dI"$NoIt3+LK)^H9KS>)6
+L51P?Ll$tGMi3ORNK0+=<<.1@F9Q`+EH,r9rb`9aChmg$C2%?pB4baeARo=]raGn:@/aO5?3":1
+>lS".>5h\)=T;J%<rZ2"<;f_q;Z9Pm:n[ja<U3V5;H$Ln<E<.&=]np5>[:]D@:E_WAS,UiC27[(
+DfKf=FEVkRH@1-jJ:`E-L5:\EN/is]P*D5uR$sP:T:r!TV5L8lXKA\1ZEpsI\@K5a^;%M$`5Td<
+b0/#ScdC1ieCN7(g=k?<hVd>Nj5]7`k32'olKmm)mdKW6nac8No*+dZp%J+RrV6Egs8)Zjrqu`n
+o_sFAM>r)~>
+JcC<$M?!5Irr)ior;6Njs7uWg!Vc<eo`=^Vrpk.#nF,i5m-O''l0.<mjlGI]i8EJJgtLK7f@JI#
+dF$:cbfe,L`l5j4^q[Rq]",;XZa-g=XfSP$Vkp2_TUq^DR@';*PELueN/NOKL4t82J:;onH?aXV
+FE;G@DJa0)BkV-jA7K(W?XIShG_(a9SufI$cOA+Dc-4AQaMu3<_ns7h_#M1H^&bp]qn<$DrkJKI
+rkAQL]tV8\^AbhG]`5VB\cK@QpppF9rjhs:s0q[0s0Vj6rO)U4p9an/rj;m9[C*BKqm?U9[C*KN
+Zi%N9]EPp[\[f5[rjVj9q6p@4rO)X3s0_a2s0_m8rNug<[^`iV\GNfYg=tH>hr*GPj5]7`k3(sm
+lKdg'mI'H3nF?&>o(2MGrq-?dp\4X]s7u]kqtp?irVc6bkl9rIqYg<hp\XpcrqZEcrqHEcr:U*^
+rq$*Zs7--YrU0mPkiq?srp($[mHs?1nF5u=oCMVIpAXgfq>1*f!WE##s4FmM\,pktFoHIdF)l8?
+E,Y_n&8c6!CMITuBP;$jAn>OaA7PUJ!F]C8?iOF4?2e+/>6%k+=oVV(=8l8#<W?%t;u]bq;#jFb
+s8T\+]C!1Y;H$Ln<E<1'=^#$7>[CcF@:E_XAS5[jCMRd)E,fo?Fa&(VH@1-jJ:`E-L5:\EN/is^
+PEhH$R@B_<T:r$UVPgDnXKA\1Za@0M\[oGe^VI_(`Q#s>b0/&Td*^:ke^i@*g=tE=hr*GPj5f=a
+kNM0qlg4!*mdKW6nac5OoCW%Ts7QHerV-BgrqcQirqucoo_sFAM#Vu~>
+JcC<$M?!5Irr)ior;6Njs7uWg!Vc<eo`=^Vrpk7&nF,i5m-O''l0.<mjlGI]i8EJJgtLK7f@JI#
+dF$:cbfe,L`l5j4^q[Rq]",;XZa-g=XfSP$Vkp2_TUq^DR@';*PELueN/NOKL4t82J:;onH?aXV
+FE;G@DJa0)BkV-jA7K(W?XI,KAScF4It`lJQ'VE7s-3MHrfZr:nrip7rf[;D"d5"0OcY\%O8k7>
+NW5%7N<#":NUr2.NW4t.NW"n;N<#"6NW4t;MZAY4OT1@ANqn\7N;/D+N;S\8N;JP)N$$d.h;-uH
+i8WeWjlY^gkiqBum-O--n*fc9nac8Bo^r.U!quB_rV6Egs8)WirVZWmnG_YOlMgYYqu$3crVHNh
+qY:'arq?9_s7H<^rUU!Ys7$!U!N`F&Y5b[*Yl:j+YlCs.ZMq06['d<M\$u@Hrj`HL]Y(tm^VI_)
+`5BO4rl,,^aN2KFb5TTgcHjkadF%sAs3h;(e^rF*f@\d0gA]hOgtgfDhr3PSjQ,IckND'ml07Ku
+lg*p(mI0N5nF?)?o_%p;nW)1[!dAg1rcA<bEcH)<DuOVcD/=!'C2.HrBP1phAS#C_A,]p<@:9(A
+s'>\2r`oJ-!*]A)s&f;&r`9&!s&Atrs&/ko!)T<fs,?c5m>QKl;c?Xq<``C+>$G6:?=.)K@Uit\
+B4u!pCMds.EH6/DGBeF[I!pKpJqJc3Ll%%KNfT?eQ'Rf*S"-(BTqeE\Vl?\tXfnt8['mHS]"G_k
+^r"".`lH0CbK\>ZdF-Opf%8U/gYCWBi8EVTjQ5OekiqBum-O--n*fc9o'uhQo`"O`p&Ojcp]1-h
+qY^6ir;QZerdk**s*t~>
+JcC<$M?!5Irr)ior;6Njs7uWg!Vc<eo`=^Vrpk.#nF,i5m-O''l0.<mjlGI]i8EJJgtLK7f@JI#
+dF$:cbfe,L`l5j4^q[Rq]",;XZa-g=XfSP$Vkp2_TUq^DR@';*PELueN/NOKL4t82J:;onH?aXV
+FE;G@DJa0)BkV-jA7K(W?XH,e6UaI78P;hU;#*ob:&n)e;#=&Q:'+3d:\@K\:]=,`:&dub:\mid
+:]F/l9hnDXr_NPhs%iSis%`VkpeUobr_WJl!`W0"r_rktr_s##<`N*uqGRGp<E8Hds&8npr)3Sn
+rD=ZjgYL]Ci8EVTj5oFckNM0qlg4!*mdKW6naZ2@oCV\So`Fj]p\jmeq>^<gqu-HkrUBgMs6BU[
+rVQNequ-Bjq>0mcp\smap&F[`oDS7[nc/+Wmf6Pi>Pqb)?2n72?2e.1?iFI4@0L%J@Uiq[rFQ%B
+rb2:Fs(_dSD/=!'D#A2NDuXeUEW:+[FT6LfGBS1TH$T@7s*Ocns*juus+10$s+:r;KnY89LPL\A
+M2@+JMi<XUNf_4[!dAg1rcA<bEcH)<DuOVcD/=!'C2.HrBP1phAS#C_A,]p<@:9(As'>\2r`oJ-
+!*]A)s&f;&r`9&!s&Atrs&/ko!)T<fs&Aeom8SO4;c?Xq<``C+>$G6:?=.)K@Uit\B4u!pCMds.
+EH6/DGBeF[I!pKpJqJc3Ll%%KNfT?eQ'Rf*S"-(BTqeE\Vl?\tXfnt8['mHS]"G_k^r"".`lH0C
+bK\>ZdF-Opf%8U/gYCWBi8EVTjQ5OekiqBum-O--n*fc9o'uhQo`"O`p&Ojcp]1-hqY^6ir;QZe
+rdk**s*t~>
+JcC<$M?!5Irr)fnrVQTj!;ZTgJ+r[1p%@tKoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JI$
+da?Cdbfe/Ma2Q!6_8!^s]",;Y['R$AXfSP%Vkp2`Tq@pGR[BG,PEM#gNJraNL4t83J:DupH?j^X
+FE;GADf0B,C1q6lARf1X?sdS`F*`ItQ(b=pci;;jbmM\;aN)<>`5BI._>_4M^\YYL]tV1n^:h7p
+rP&TO^VIV!^:qA]^'23a]tD%krk&-?pUL:8rOMm:s0qX/!4Dg5rjDa6p9jq/s0Vj6rjDd5r3cR5
+rNua9\@/dB^&5MG]=GJ^\G`o9\G3N5[f*W5[/[Q4[/[N_[^W]R[C*HP\@8rW\[]/[g>(N@hr*JQ
+j5f=akNM0plKdg'mI'H3nF?MK#kR]\p%A%Pp\4X]s7u]kqtp?irVc6bkl9oHqYg<hq"t$drV?<b
+rqHHdqt:!]s7?0Zs7--Ys5s@E!pJn6rp0UN&FJoRn*ol;o(2MHp@n@Wq>1*f!rW&sY5\L5ft$O\
+s*#]2F`__HEcQ/>E,TW3D/F*)CMIQtBP;$jAn>Oa@q/tW@:<RC?NOP>?2e(1>?Y50=oVV(=8l8#
+<W?%t;u]_q;4dgc])0,-\pmXX<E<.%=BSg3>[:ZC?t*SUAS,RgC27X'DfB];FEVkQH@('hJ:W?+
+L51VCN/`m[P*;/sR$sM8StMdPUo1/kX0&P/Z*UgG\%0)_]t_A"_o9X:aihoRcHstfeCE1&g"P3:
+h;@/LioB+^k3(smlKdg'mI0N5naZ2@oCW%T!quB_rqQNhs8)Zjrqu`no_sFAM#Vu~>
+JcC<$M?!5Irr)fnrVQTj!;ZTgJ+r[1p%@tKoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JI$
+da?Cdbfe/Ma2Q!6_8!^s]",;Y['R$AXfSP%Vkp2`Tq@pGR[BG,PEM#gNJraNL4t83J:DupH?j^X
+FE;GADf0B,C1q6lARf1X?sd,F@:j=tH%:[5QN!0KPl?mGP4k%/P5CICP5gXEP5^RFOHGY%NrY4>
+NW5%7NW5%:NUr20N<>-!N/[@frJpl:!06i6rJUi9Mi3JjOT(=@Nr+h7N;AP2N;nh7N;\b8N;JP/
+N#[b7N8!(ChV[8MioB+]k3(sml0@U$m-X60n*olHnd+jZo_%nNp@n=[q#C0iqYU0gr;HT`rojCH
+rqcTjr:p0fqYg6dq#:$fpA=O_o`+O\o)J7[nGTEiXfei(YPtd+Ym@YAZa@-J[^N[E\Gj#E]">Vg
+^:q@u_YqCT`Q#p<rlG,]$-UQ:cHab_d*^8?df7c"eCE1&f\$2V-JI5/gt^`Bhr*JQj5f:`k3(pk
+kiq?slKdd&m-a?2nF5u=o(;VKn;c(Zs*#]2F`__HEcQ/>E,TW3D/F*)CMIQtBP;$jAn>Oa@q/tW
+@:<RC?NOP>?2e(1>?Y50=oVV(=8l8#<W?%t;u]_q;4dgcN;JV&N.4c*<E<.%=BSg3>[:ZC?t*SU
+AS,RgC27X'DfB];FEVkQH@('hJ:W?+L51VCN/`m[P*;/sR$sM8StMdPUo1/kX0&P/Z*UgG\%0)_
+]t_A"_o9X:aihoRcHstfeCE1&g"P3:h;@/LioB+^k3(smlKdg'mI0N5naZ2@oCW%T!quB_rqQNh
+s8)Zjrqu`no_sFAM#Vu~>
+JcC<$M?!5Irr)fnrVQTj!;ZTgIeWR0p%@tKoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JI$
+da?Cdbfe/Ma2Q!6_8!^s]",;Y['R$AXfSP%Vkp2`Tq@pGR[BG,PEM#gNJraNL4t83J:DupH?j^X
+FE;GADf0B,C1q6lARf1X?sc2d6UO:484cQPrD<>dqbI/er)!8dkt_7S!DZG`:Amue:A@Q`:AI]^
+:'+3d:B!uf:B"#j:/=[a;#X5j;#!ib:&n#f;#=8j;ufkp<<#tt<;TSq<)lrd<<#nr;Z'Jm;An3D
+h;7&IiSrnYjlYail07L!m-O--n*fc9rpg?do^qhLp@e7TrV6Egs8)WirVZWmnG_YOl2LPXqu$6d
+rVHKgqY:'as7Z?_s7H?_r:9mXs7$%k!*];)rET8+s'>\2rEfJ2rF#h:@UinYrau.Brb2=G!GZEK
+C]\BgD>eAODuXeVE=?l/F*)MIG'A.TG^4T6HN&7*I!pHnJ:N3%JqAW-KS5&5L5(J=M#N59MMmCO
+NK0']`Duq^,Be3OFE;JCEH,r9DJj<.Chmg$Bk_6oB4baeARo:\@U`bS@/aL7?<pk9>QS,5>5h\)
+=T;J%<rZ2"<;ohr;?0Rcs85jn<UNh9;cHat<``C+>$G6;?=.)L@Us%^B4u$qCi401EH?5FGBeF\
+I=?]tK7nu7M2I7OO-#NgQ'Rf+S"6.DTqeE]W2co#Y->1;['mHS]"G_k^r"".`lQ9Fbg+M\dF6Uq
+f@S^0gYL]Ci8N\UjQ>UfkiqBum-O-.n*ol;o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCQ+J,~>
+JcC<$M?!5IrVc`nr;6Njs7uZhs7ZNerq1[2oCDJBnF,i6mHj3)l07Eok2kX`iS`VMh:pZ:f@SR&
+da?Fec-+8Na2Q!6_8!^s]=GG[[Bm-BY-"b)Vl$8bTq@pHS!fY/P`h/iNf8jPLPCJ7JUi2tH[9p\
+F`_YDDf0E-C1q9mARo7Z?sd5SD0C>]NL-HFbg+JX&Br>>aMu3<`59C-^qmh$^q]f]!l)I_r4`-E
+#/7jf^V@LsrP/BHrk8?E!kZ+WrOVd7s1/9B]".^J!4VU/!4Dg5s0_g6p9b%3[C*BKrjDd5r3ZO5
+r3cR5"LY_J\@2=Kqn*'D\[f5[rO;d9ppUC7[C*HOr3cL1s0X#Y\$i`Q\$rfT\@9#Y\D5osi8ESS
+j5f@bkNM0plg4!*mf)YZnF?)?oCMVRp&F^cp\jmdq>^<gqu6NkrUBgKs6BU[rVQNfqu-Biq>0mc
+p]'sap&F[aoDJ1Zjo4BFkNM0plMg)^m-X3.mdT`9o()DEp%J.Tq"adcqZ6WoXoAC4ft$O\-?s`Y
+G'.nKF)l;@EH#i6DJa6,CMR[!BkV0mAnGUcA7K+Y@UW\Qra,_5?![G7!aAi3r`T8'!*B,"s&K(u
+r_o?eq7?O:n%*dD<E<1'=]ns6>[CcE@:E_WAS,UiC27[(DfKf>FEVkRH@1-jJ:`E-L5:\EN/is]
+P*D5uR$sM9T:r!TV5L8lX0&S0ZEpsI\@K5a^;%M$`5Td<aihoRcdC.heCN7(g=k?<hV[8Mj5]7`
+k32'olKdg(mdKW6nc&([oCW%T!quB_rqQNhs8)Zjrqu`no_sFAM#Vu~>
+JcC<$M?!5IrVc`nr;6Njs7uZhs7ZNerq1R/oCDJBnF,i6mHj3)l07Eok2kX`iS`VMh:pZ:f@SR&
+da?Fec-+8Na2Q!6_8!^s]=GG[[Bm-BY-"b)Vl$8bTq@pHS!fY/P`h/iNf8jPLPCJ7JUi2tH[9p\
+F`_YDDf0E-C1q9mARo7Z?sd5E?t3nhFaJ[sPl?sIPlHsHP4at/P5CIBOogc/P5UOCOSk1>NrG"<
+Nqn\7Nr4n-NrG%;N:Mu-NrG"<NqeV3N;nkAM2I1KMiWquOSk.>Nr+h6N;JV4N;nh5N;nn:N;AJ/
+N;neLgtgiFi8N_VjQ>Ufkiq?tm-O--rpL'\nac8BoCW%Ts7QHerV6Bfs8)Wirqu]mnG_SMlMgYY
+qu$6drVHKgqY:'as7Z?_s7H?_r:9lgr2fn#s/uF,ric@+s02R0rj)d8[C*HO\,No:\c98G]Y2%o
+^r""g`;dgV`Xg,2aN;QHbKS2Ucd0tbdF%sAs3q"urmr(@g"G*5gY:N=h;7&IiSrnYjQ>UfkNM-o
+lK\B7s6L*\n*fc9nac;Dp%Im8er;#$GB\4QFEDSEEcH)<Df0H0D/=!'C2%BqBP1phAS#C^@q&nU
+@:9(A!a]/<r`fM/>$Co.s&]8&rDrqus&AtrSH&DDrJg9)GuRdE='/U.>?kE>?XI5N@q9._BPD3s
+D/O93EccDHGBnL^I=Hd!K8#&9M2R=QO-,TiQ'[l,S"?7GU84W`W2co#YHY==[C3TU]=bkm_8=.0
+a2lBGbg+P^dF6Urf@\g2gtgiEi8N_VjlY^hl07L!m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6Kk
+rVcBfJcCQ+J,~>
+JcC<$M?!5IrVc`nr;6Njs7uZhs7ZNerq1U0oCDJBnF,i6mHj3)l07Eok2kX`iS`VMh:pZ:f@SR&
+da?Fec-+8Na2Q!6_8!^s]=GG[[Bm-BY-"b)Vl$8bTq@pHS!fY/P`h/iNf8jPLPCJ7JUi2tH[9p\
+F`_YDDf0E-C1q9mARo7Z?sd5,6U=(084Q6I:Jgj_qbI/eqbR>i:f.-el;%:RohPE\r_E2^!)E;b
+qbI/es%`Pf!)EMhs%`Sir_WSi!)WGdr(d8f"AMQb:f.$h!*&enrDWbsrD`Ymr`/qs!*0"ts&Jem
+!)rhorDW_o'AVF#i8ESSj5f@bkNM0plg4!*mf)YZnF?)?oCMVRp&F^cp\jmdq>^<gqu6NkrUBgK
+s6BU[rVQNfqu-Biq>0mcp]'sap&F[aoDJ1W=TDY'>Q%h)>ln><?2\+/?jL1M@:<VS@q0'JB)cND
+BFANfBkhF"D/=!'Ci0/hrbqdTs)A0^F)uGGrcSEgG^+LZrd+Qj++/KcIt3'#JV&K+K7no3Knb>;
+LPUeDMMd=MN/`jYOMt3HG^"@TF`__HEcQ/>E,TW3D/F*)CMIQtBP;$jAn>Oa@q/tW@:<RC?NOP>
+?2e(1>?Y50=oVS(=8c2"<W?%t;k3m`<;fhb<-VDD='/U.>?kE>?XI5N@q9._BPD3sD/O93EccDH
+GBnL^I=Hd!K8#&9M2R=QO-,TiQ'[l,S"?7GU84W`W2co#YHY==[C3TU]=bkm_8=.0a2lBGbg+P^
+dF6Urf@\g2gtgiEi8N_VjlY^hl07L!m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcCQ+
+J,~>
+JcC<$M#[/IrVc`nr;6Njs7uZhs7ZNerq1[2oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$`<f[n['
+e'ZOfcHOJRaMu3:_SEq"]XkV][Bm0CYH=k*W2HJeTqJ!JS!fY0Q'7AlNf8mQLk^V9JUi2tH[9p\
+F`_\EE,KN/CM@HpARo:[@:*AIBQ&-ELle%$ZHg_>#g:B3a2Z*:_nuDhrkSNJ!5AHI#/7jd^;%Cr
+rkANM^VBc`rP/BJs1\QJrk/<Erk&3A!P>r;\H'5>\brr;\+I*/[JmQ4[JmW.[K!]8[K!W6[JmQ3
+[K!]5[K!]8[g'.G[^ETU]`#P?]EGjW\[]0J[fX(K\G3Q4[K*f8[K*`6[/RK4[K<kG[f3`X\@:;M
+hr*JQj5]7`k3)!nlKdg'mI'H3nF?&>o(2JFrq6<b!;HHes7uZjqtpBjr;H-ajo=WFqYg?ip\Xpc
+rV??crqHEcr:U']s766]ro=(@rT44FkiqC2lPJpTmdBQ5naZ2Ao_%qPq"X[]qu$?grVir!!4pmp
+m^W:B#^CQ;G'.nKF)q8"$?0p$DJa3+CMR[!rb)=FB)Z?HA7K+Y@UW\Qra,_5?![G7!aAi3r`T8'
+!*B,"s&B)!;k!^d\bWi8]CEI]<E<.%=BSg3>[:ZC?t!MSAS#LfBkqO%DK'T9FEMePH@($fIt3-'
+KnbD?Mi<[WP*;/sR$jG6StD^OUo(&hWiW>+Yd1UD\%0)_]t_A"_o0O7aND]NcHjndeC<($f\5*8
+h;7)JioB+]k3(sml0I^&mI'H3nF?)?oCV\Tp&F^cp\jmeq>^<hqu6NlrUg)?s+p]*~>
+JcC<$M#[/IrVc`nr;6Njs7uZhs7ZNerq1a4oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$`<f[n['
+e'ZOfcHOJRaMu3:_SEq"]XkV][Bm0CYH=k*W2HJeTqJ!JS!fY0Q'7AlNf8mQLk^V9JUi2tH[9p\
+F`_\EE,KN/CM@HpARo:[@:*AI?!h2[E-?V]MjBWmQ'D93rfZr:o90!7qi^o?!0I)=!07#;!06l7
+s,R#:o8`g0",r4uN:W&-NrG"<NqeV4N;eh:NWk8sMM[4Nrf@)@qi:`;qi1N4qi1Q5s,6`4s,I&;
+qMY3/s4nXOi8N\Uj5oFckNV6rlg4!*mdKW6naZ2@oCMVRp&F^cp\jmeq>U6fqu6NkrUBgJs6BU[
+rVZTfqu-Biq>9sdp\smap&=U`o)S@\WW9*tX9,N,Y55@%YlCs3ZEpmE['fnArODj;#J7X]]tV7s
+_YqFQ`W*pba2l?Dai_fNbg+Q6d/VMndf.\re^j`O.bNG-g=k<9gt^`Bhr*JQj5f:`k3(pkkiqBt
+lg*p(mI'H3nF?)?oCV_Ln;c+[s*4lpGB\4QFEDSErc&9aDf0H0Ci!m&C2*Z\!G?$DAHuaU@q&nU
+@:9(A!a]/<r`fM/>$Co.s&]8&rDrqu!E<!drr@uQN;\b+N.+c-<``C+>$G6;?=.)K@Uit\B4u!p
+Ci+'/EH6/DGBeF\I!pKpJqJc3Ll%%KNfT?eQ'Rf*S"-(BTqeE\Vl?\tXfnt7ZaR?R]"G_k^r""-
+`Q-'BbK\>YdF-Oof%8R.gYCWAi8EVTjQ5Oekiq?tm-O--n*fc9o()DEo`+Uap&Ojcq#C0iqY^6i
+r;HTdrdk**s*t~>
+JcC<$M#[/IrVc`nr;6Njs7uZhs7ZNerq1R/oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$`<f[n['
+e'ZOfcHOJRaMu3:_SEq"]XkV][Bm0CYH=k*W2HJeTqJ!JS!fY0Q'7AlNf8mQLk^V9JUi2tH[9p\
+F`_\EE,KN/CM@HpARo:[@:*AI6UF+-7S$*C;#3ue:&n#f:B"&b;#X8U:Ado\:Amue:A@Q`:AI]^
+:'+3d:Amlg:/=[b:&n)g;#X5j;#!ib:B"&h:^'Tg9h\;]qc*Vqpf%2l!*/qrqbmc"<E3!t<E3!t
+r`/_m!)rbms&8sR)rKT4ioB(\k2tjkl0@U$m-X60n*ol;o()DDo`"O`p&Ojcq#C0hqYU0hr;?N_
+roO1FrqcTkr:g*eqYg6eq#:$epAFU_o`+LbnlJpqrE9/(rEK2)rE]G0s'>V1!af>CrF#k;@U`hX
+Ac63@BDuTDC&_rQCi+!(CM[kdDZ=YTE;jh[EcZ;DFoHOrGBe@XH$Xg`H[C-fIXZcsJ:[]Os+C?)
+s+UK-s+^u<M2@+IMi<USNfT7@<W@=MG^"@TF`__HErL%cE,TW3D/=$(CMIS_BE;aXrac=F@q/tW
+@:<RC?NOP>?2e(1>?Y50=oVS(=8c2"<<6&tRf<@dq,I;mnPjs;<`W:(=^#$7?!^lG@:E_XAS5[j
+CM[j*E,fo?Fa&(VH[L6kJ:`E-L5:\EN/is^PEhH$R@B_<T:r$UVPgDnXKA\1ZEq!K\[oGe^VI_(
+`5Td<b0/&TcdC1jeCN7(g=tE=hVd>Oj5f=akNM0plg4!*mdKW6nac8Bo^r1Vs7QHerV6Egs8)Zj
+rqu`no_sFAM#Vu~>
+JcC<$M#[,Hrr)ior;6Njs7uWg!Vc<eo`=^VrpkR/nF,i6m-O''l0.<mjlGI]iS`VLgtUQ8f@JI#
+da?Cdbfe,La2Q!6_8![r]",;Y['R$@XfSP%Vkp2`Tq@mFR[BG,PEM#gNJraNL4t83J:DupH?j^X
+FE;GADf0B,C1q6lARf1X?sd5FCN+NLMNXL0[*Hn=aiMNB`Pf[o_Z%CO_"k_S^;%Fs^;%Fu^q[Y"
+^qoua!5STKrkAEGrk&BG]"5MbpppF9!kGnQqmZX8oX4b-rj;[4rjMR/rjDm9[']h?rj;X3s0hm6
+rjMj9s0`3>ZEpsJ\%9/`rOr'?"1u+S\G`o:\Fd67[^W]S\$`XC[/[N7['fnA!O]B8[hmlWhr*JQ
+j5f=akNM0plKdg'mI'H3nF?MK!qZ'Vrq-?dp\4X]s7uZjr;6HjrVc6bj8\EDqYg<hq"t$drV??c
+rqHEcr:U*^!9="<!9O4B"R#"5lK\B7!UT4QmLAXSnac8Bo_%qPq"X[]rqccprr0)#!4pjom^NXN
+H$FRXGBS+NFE;L%E<U<"DJj<-rbDOLC&VcHB4h-S!G#^>@fKj:@/aL7?<pk9>QS,5>5h\)=9)G$
+<WH-es8TY*])923])PfW='8[0>?kH@?XR>PA7]@dBPM=!DJsK6F*)SLG^=^bIXm!%KSG8=MN!OU
+OHPfmQC+,1SXuLJUSOcbWiN8)Yd(OA[^WfY]Y2(q_Sa@4aN;WLc-F\`daZh!f@em4h;-uHiSrnY
+jlYail0@U$m-X60n*ol<o(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?s+gW)~>
+JcC<$M#[,Hrr)ior;6Njs7uWg!Vc<eo`=^Vrpk@)nF,i6m-O''l0.<mjlGI]iS`VLgtUQ8f@JI#
+da?Cdbfe,La2Q!6_8![r]",;Y['R$@XfSP%Vkp2`Tq@mFR[BG,PEM#gNJraNL4t83J:DupH?j^X
+FE;GADf0B,C1q6lARf1X?sd5F?=IJ^Ed<.fMj9QlPl?mGOo^].plY02qih#B#a(:5OcbfhOc]I$
+!07&<!06l7s,R#:nrE^/",r4uN:`,.Nq88/N;eh:NrP(?MM[2hMZ8_8NrY:=NrY4;NVe\4NV&/0
+NW"h5MuASNh;7&IiSrnYjlYail07L!m-O--n*fc9rpg-^o^r.U!quB_rV6EgrqcQirVZWmnG_JJ
+lMgYYqu$6drVHKgqtU0brq?9_s7H2g!3?%!!j/W.qlg%(riuI/!joACrjMg9rj`<G]=bej^;%M%
+rPT2b`l?'>aN2KFb08)ScHlL:s3^kps3h"uec+2#f`0Y)gAfq-g`YG0i8EVSj5f=ak3(pkkiqBt
+lg*p(mI'H3nF?)?oC_eFNn96uH?ja[GB\4QFEDSErc&*\Df0H0D#S2NC2*Z\!G?$DAH?=OraPn9
+!+>e5!a]/<r`fM/>$Co.s&]8&rDinuR/d2Eq2G62o8N]MH<46P>$G6;?XI2M@Us%^BP;-rCi401
+EH?5FGBeF\I=?]tK7nu7M2I7OO-#NgQ'Rf+S"6.DTqeE\VlHf"Y->1;['mHS]"G_k^r"".`lQ9F
+bg"G[dF-Opf@S^0gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcBf
+JcCN*J,~>
+JcC<$M#[,Hrr)ior;6Njs7uWg!Vc<eo`=^Vrpk1$nF,i6m-O''l0.<mjlGI]iS`VLgtUQ8f@JI#
+da?Cdbfe,La2Q!6_8![r]",;Y['R$@XfSP%Vkp2`Tq@mFR[BG,PEM#gNJraNL4t83J:DupH?j^X
+FE;GADf0B,C1q6lARf1X?sd5F6:4(.77TpCqbR2d!)<Gfr_N;cr_MfSrD3)]r(m;epItW_peUc^
+s%iYir_<Dfs%iYi!)NPio2#<[r_NPjs%iYi"]%id9N5!h<<-"k;ZKhs<;BGm<;TYq<;fhm;ufko
+;A\0Ghr*JQj5f=akNM0plKdg'mI'H3nF?MK!qZ'Vrq-?dp\4X]s7uZjr;6HjrVc6bj8\EDqYg<h
+q"t$drV??crqHEcr:U*^!*K5%s&f5&!a8f5r`f>+r*9A1?![D8!af>Cr*]_;@q0%\rFQ%Brb2:F
+!,MRMs(hXNr,2OQs)@sWs)\3^rc\<c!-nKgrd+Tk#CLrKIt*!!Jc:9$K*$^[L&Qi,LC/ioM2I4L
+N/WaVO2Y*,H?ja[GB\4QFEDSErc&*\Df0H0D#S2NC2*Z\!G?$DAH?=OraPn9!+>e5!a]/<r`fM/
+>$Co.s&]8&rDinuR/d1bq,I8lo2P`jH<46P>$G6;?XI2M@Us%^BP;-rCi401EH?5FGBeF\I=?]t
+K7nu7M2I7OO-#NgQ'Rf+S"6.DTqeE\VlHf"Y->1;['mHS]"G_k^r"".`lQ9Fbg"G[dF-Opf@S^0
+gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCN*J,~>
+JcC<$M#[,HrVc`nr;6Njs7uZhEqf;$p%@tLoCDJBnF,i6mHj0(l07Eok2bR_iS`VMh:pZ:f@SR&
+da?Fec-+8Na2Q!6_8!^s]=GG[[Bm-BY-"b)Vl$8bTqJ!IS!fY/P`h/iNf8jPLPCJ7JUi2tH[9p\
+F`_YDDf0E-C2%?nARo7Z(gp]W?!M/dH\@?CTW>`Kb/hWC`Poa3_nuDhrP/HK_"teI^;%G^^]V?e
+^qp#c!5JNKrP&]R]tD%k]=PSc]"7^Js180>r3ua9oX4b-rj;X3s0hX/s0hs8s0Vd5rj;[4s0hj5
+rjMj9rO*$:Z*L[C[C<`Y]D]G=]E>dV\[_XJs1%j5!k>_LqmQX8[C,q>rO)X5(Z!s+i8WeWjQ>Uf
+kiq?slg4$+mdKW6nc&([oCW%Ts7ZKerV6Egs8)WirVZTlnc%SKlMgVXr;?<drVHKgqtU0brq??a
+rT!h:rT44Fl07L3lN-A>rpC6bnaZ2@o_%qPp\=R\qu-EmriQ2#]%OX^\GpjUH$K=4%X)u:FE;JB
+EH#i7DJj<-rbDOLC&VcHB4h-S!G#^>@KKtG@/aL6?=!P8s',M,r`K;)=',B%QiI&qq7?L9oX]3I
+=BSd2>[1TB?t!MSA7]CeBkhF#DJsN8FED\MH$XjdIt3*&KSG8=Mi<[WOckroQ^F52SY)UMUnsuf
+WiN8)Yd1UC[^`l[]Y;.s_SjF6aN;WLcHjkbe'uq"f\,!6h;7&IiT&tZk2tjkl0@U$mI'H3nF?MK
+!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s+gW)~>
+JcC<$M#[,HrVc`nr;6Njs7uZhEqf;$p%@tLoCDJBnF,i6mHj0(l07Eok2bR_iS`VMh:pZ:f@SR&
+da?Fec-+8Na2Q!6_8!^s]=GG[[Bm-BY-"b)Vl$8bTqJ!IS!fY/P`h/iNf8jPLPCJ7JUi2tH[9p\
+F`_YDDf0E-C2%?nARo7Z%q&aN?!L`GB5Ma9JVK;PPl?mGOogc/P5(13P5:C>Op-u2P*(ifr/^l<
+rf$o<q2PE7rJgB.rf%#=NJrhqN<"q3NW"n0NW"h7NW5%;NVnY5MZ8_0O8k7<NV\V4N<>-!N/dIg
+rJLZ5reqZLhVd>Oj5]4_k3(sml0@U$mHs?1n*olHncA@Srq6<bs7cKes7u]kqtp?ir;H0bj8\ED
+q>L6hp\XpcrV??crqHEcrq-8jq5X@o!j/W.qQKq's02a5Za7$G[JmW5\Gj#E]">Vf^:qD"_u@US
+`W*pXa8X-fai_fNbg+P\d*U1frmLhq!S#[!fDjM'f`9b*gC;rohVR2Kio9%[k2tjiroasYlK[^$
+m-O-,n*fc9o()DFp$e!mNW4;*H$K=4%X)u:FE;JBEH#i7DJj<-rbDOLC&VcHB4h-S!G#^>@KKtG
+@/aL6?=!P8s',M,r`K;)=',B%QiI&Cq2G62oSdrp=BSd2>[1TB?t!MSA7]CeBkhF#DJsN8FED\M
+H$XjdIt3*&KSG8=Mi<[WOckroQ^F52SY)UMUnsufWiN8)Yd1UC[^`l[]Y;.s_SjF6aN;WLcHjkb
+e'uq"f\,!6h;7&IiT&tZk2tjkl0@U$mI'H3nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s+gW)~>
+JcC<$M#[,HrVc`nr;6Njs7uZhIeWR0p%@tLoCDJBnF,i6mHj0(l07Eok2bR_iS`VMh:pZ:f@SR&
+da?Fec-+8Na2Q!6_8!^s]=GG[[Bm-BY-"b)Vl$8bTqJ!IS!fY/P`h/iNf8jPLPCJ7JUi2tH[9p\
+F`_YDDf0E-C2%?nARo7Z?sd5G>XCkI7Rfp?s%`SirD*Aer_EGgpe^rcl;%:Rp.kN]rD*,^s%`Ac
+qG%)f:/:a^!_uNer_<GhrD<,^rD*;es%rYi!)<Gfs%NPg<)icq!*&Yj!E<"s<;9Dl<<-(p<VfYp
+;uKT1h;7)JioB([k2tjjl07L!m-X3.n*fc9rpg*]o`"O`pAamcq#C0iqYU0gr;?N`ro=%DrqZNj
+r:g*eqYg6eq#:$epAX^b=8l>$=8uD$=TM]2rEK5*r*9A1?![G9%:<LN@:<VR@:E\U@q90MB)cNB
+BEDm_C]8/MCB86grbh[Qs)A!X"EJR)FEIM*s*"NhH$T@7s*FuuI=?ZqJ:N4MK)^H9KS>,7L51P?
+Ll$tGMi3ORNK0(=<W@@GH$K=4%X)u:FE;JBEH#i7DJj<-rbDOLC&VcHB4h-S!G#^>@KKtG@/aL6
+?=!P8s',M,r`K;)=',B%QiI%`q,I8loMg!8=BSd2>[1TB?t!MSA7]CeBkhF#DJsN8FED\MH$Xjd
+It3*&KSG8=Mi<[WOckroQ^F52SY)UMUnsufWiN8)Yd1UC[^`l[]Y;.s_SjF6aN;WLcHjkbe'uq"
+f\,!6h;7&IiT&tZk2tjkl0@U$mI'H3nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s+gW)~>
+JcC<$M#[,HrVc`nr;6Njs7uZhs7ZNerq14%oCDJBnF,i6mHj3*l07Epk2kX`io&bOh;$`<f[n['
+e'ZOfcHOJRaMu3:_SEq"]XkY^[Bm0CYH=k*W2HJfTqJ!JS!o_1Q'7AmNf8mQLk^V9Jq/;uH[9s]
+G'%eFE,KN/CM@HpAS#@\@:*@Z?!M#ZFFJt(PbG:uaiMNB`Pf^4_SX.*^qoub!PcGK^]2(L^\YbF
+_>V.M_8-&b!5AHGs1AQJ]">Sc\[qXJs1/9B]".^J!4VU/!4Dg5rjDa6pU1"/!4Dg5s0_g4rjDd7
+r3cR5rjVd5#I1M<ZEggE[/RW:]DfM>]`5VD\H04LrjW$=[^Q(BrODj9s0`$=[^EO?[/[NS[bfp"
+iSrnYjlY^gl07L!m-O--n*fc8nac8BoCW%Ts7ZKerqQKgs8)WirVZWmnG_JJl2LPXqu$6drVHKg
+qY:'a!VYOMj87p:jojl2l07L3lN$>OmLJ^Tnac8Bo_%qPp\=R\qu6KorVir!!4pjon$j0]H[:!`
+G^"@TG'.nKF)l8?E,TZ4DJa4hCB80arb)=FB)Z?BA7PUJ!b#JEra,\4?2e+/>Q7n+=TV],=-`ga
+\bWi7]Ciab=BSg3>[:ZC?t!MSAS,RgBkqO%DK'T9FEMePH?sseIt3-'KnbD?Mi<[WOckuqR$jG6
+StD^NUo(&hWiW>+Yd1UC[^`l[]Y;.s_SjF6aND]NcHjnde'ut#f\5'7h;7)JioB(\k2tmll0@X%
+mI'H3nF?)?oCMVIp%J+RrV6Egs8)Zjrqu`no_sFAL];l~>
+JcC<$M#[,HrVc`nr;6Njs7uZhs7ZNerq1[2oCDJBnF,i6mHj3*l07Epk2kX`io&bOh;$`<f[n['
+e'ZOfcHOJRaMu3:_SEq"]XkY^[Bm0CYH=k*W2HJfTqJ!JS!o_1Q'7AmNf8mQLk^V9Jq/;uH[9s]
+G'%eFE,KN/CM@HpAS#@\@:*AI>[1WHBQ&'?JVfPSrfd5Bq2tT<!0R)?qNLi?"d+t2Ocbb&Ns1Q'
+NfB'ZqMkN8r/L9-rf%#=NJrhqN<"q4NW"n;N<"q2NW+n:N<,'!rf6l8!/UK.rf6Z4s,R#:q2G00
+rf$l8repo<N/R[o!/pi8*8]T2iSrnYjlY^gl07L!m-O--n*fc8nac8BoCW%Ts7ZKerqQKgs8)Wi
+rVZWmnG_JJl2LPXqu$6drVHKgqY:'a!VWJjWVNRlX9,N,Y55=%Yl:m2ZEpmE['fnArODm<$+da\
+]Y2%o_8F1i`;dgV`Xg,2aN;QHbKS5Vcd0tbdF%sAs3h#!f)F8$f`'P(gA]hNgtgiDi8EVSjQ5Od
+kND'ml07Kulg*p(mI'H3nF?)?oC_eGNn97,I!^0cH$FOWG'8"MFE;JBEH#i7DJj<-rbDOLC&VcH
+B4h-S!G#^>@KKtG@/aL6?=!P8s',M,r`K;)='([erJUK1r/LB.IooiW>?kH??XR;O@qB7bBPD6u
+D/O<4EccGJG^=[`I=Hd!K8#&9M2R=QO-,TjQC+)0S=Z@HU84ZaWN*&%YHY==[C3TU]=bkm_8=.0
+a2lEHc-FY_daQ^sf@\g2gtgiFi8WeWjlY^hl07L"m-X60n*ol<o(2JFp%A%Pp\jmeq>^<hqu6Nl
+rUg)?s+gW)~>
+JcC<$M#[,HrVc`nr;6Njs7uZhs7ZNerq1a4oCDJBnF,i6mHj3*l07Epk2kX`io&bOh;$`<f[n['
+e'ZOfcHOJRaMu3:_SEq"]XkY^[Bm0CYH=k*W2HJfTqJ!JS!o_1Q'7AmNf8mQLk^V9Jq/;uH[9s]
+G'%eFE,KN/CM@HpAS#@\@:*AI>XCbC6UjU98Pi/X:/:a^r_EJhpe^rcl;%7Qp.kN]r_E2^!)E;b
+qbI/es%`Me"\qih:/+L^;#a;k:A.K_:B+)j:f%'eqbI5f:&[lh:JFO^<;]bm;ZK_m;ZKek;Zg!!
+<`]3"s&AqsqG\M7;Vp<hiSrnYjlY^gl07L!m-O--n*fc8nac8BoCW%Ts7ZKerqQKgs8)WirVZWm
+nG_JJl2LPXqu$6drVHKgqY:'a!;?=ls&f8%r`K/&!a8f5r`f;*rETD0ra#M0#[^tI@:<VR@:K4G
+!+l+@s(D@Frb2dUCM[j(CMRa'DJa9/rbqgUs)A0^F)uGGrcSEgG^+LZrHeKj#CLrKIt*$"Jc:9$
+K+`ikKnb>;LPUbCM2I4LN/`gWO2b09I!^0cH$FOWG'8"MFE;JBEH#i7DJj<-rbDOLC&VcHB4h-S
+!G#^>@KKtG@/aL6?=!P8s',M,r`K;)='([erDWMkr)NDhIooiW>?kH??XR;O@qB7bBPD6uD/O<4
+EccGJG^=[`I=Hd!K8#&9M2R=QO-,TjQC+)0S=Z@HU84ZaWN*&%YHY==[C3TU]=bkm_8=.0a2lEH
+c-FY_daQ^sf@\g2gtgiFi8WeWjlY^hl07L"m-X60n*ol<o(2JFp%A%Pp\jmeq>^<hqu6NlrUg)?
+s+gW)~>
+JcC<$L]@&HrVc`nr;6Njs7uZhs7ZNerq-<aoD\<1naQ#9mHj3*lKRNqk2k[aio/hPh;$c=f[n^(
+e'cXicHOJRaN)9<_SO"#]XkY_[^<BGYcY",WMcVhU7n3NS!o_2Q'@GnO,]*UM2-e;Jq/?!I!U'^
+G'%hHEGo`2CMINrAn>L^@:3GK?!M&^G_(^4RA@(.a2Z-<`5BL0s1n]Prk\QKrP/6Fs2"`NrPAKK
+!5\WL#/@mc]Y1tjrO`'?qmla<rOMj9!4VU/!4Dd4rjDd7p9jn.rj;[4rNuR3s0hg4!k,SIppLF7
+ZE^[=ZEgk9\cKFUrk80@rk&3@s0r-@\@;FFr3uX7s0qs8s0_m6!4Dg5s0Wg'i8N\UjQ5Oekiq?s
+lg4!*mdKW6naZ2@oCV\Sp&F^cp\jmeq>U6fqu6NkrUKmEs6BU[rVZTfqu-Bjq>0jgi8N\Tqr@V8
+!9O4B"6f"6lM^#Lm-Xf?%I`iWo()GGp@n=Vq>1!equH_trrBX`\aR$8I=-BfH?jaZGBS-.F9Q`+
+EH,r9rb_aRD#S2SC2%?pB4kiUAH?=OraGq;?srt@!FB(2>lS%.>5hY+=Jr'`s80A&])927])PoW
+>$P<<?XI5N@Us%^BP;-rCi401EH?5FGBeF\I=?]tK7nu7M2I7OO-#NgQ'Rf*S"6.DTqeE\Vl?\u
+Y->1;['mHS]"G_k^r"".`lQ9EbK\>ZdF-Opf%8U/gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DE
+rq6<b!;HHe!;ZWjr;6Kkrr)KgJcCK)J,~>
+JcC<$L]@&HrVc`nr;6Njs7uZhs7ZNerq-<aoD\<(naQ#9mHj3*lKRNqk2k[aio/hPh;$c=f[n^(
+e'cXicHOJRaN)9<_SO"#]XkY_[^<BGYcY",WMcVhU7n3NS!o_2Q'@GnO,]*UM2-e;Jq/?!I!U'^
+G'%hHEGo`2CMINrAn>L^@:3GK?!LTAAo)F/H\74TPP^O<OoCODOnk1:PPC:BOcY\%O8b.?NK3go
+s,R&;nrEX-s,?r:s,?`4rf7#<!0$T1rf$f8s,Qr8s,I2<MMR/gM>`J-O8b1;NVJJ0NW4t:MuS_9
+NW+n:MuS_UMr3IOioB+]k3(sml0@U$m-X60n*ol;o()DEo`"O`p&Ojcq#C0hqYU0hr;?N`rnmb@
+rqcTkr:g*eqYp<eq#7/kW;`dlWW9*uX9,N,Y55@%Yl:p-Zi@B4[JmT9\%&sH\Jr,l]Y(ql^qmq,
+`5BO4`l?'>aN2KFb08)ScHlL:s3^hos3iXOf%8O+f\+s3g=tB;gtgiFi8WbVj5oFckND'ml07Ku
+lg*p(mI'H4nF?)?oC_eGNn96tI=-BfH?jaZGBS-.F9Q`+EH,r9rb_aRD#S2SC2%?pB4kiUAH?=O
+raGq;?srt@!FB(2>lS%.>5hY+=FP^cs8.`MN;S\0N;m%)>$P<<?XI5N@Us%^BP;-rCi401EH?5F
+GBeF\I=?]tK7nu7M2I7OO-#NgQ'Rf*S"6.DTqeE\Vl?\uY->1;['mHS]"G_k^r"".`lQ9EbK\>Z
+dF-Opf%8U/gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DErq6<b!;HHe!;ZWjr;6Kkrr)KgJcCK)
+J,~>
+JcC<$L]@&HrVc`nr;6Njs7uZhs7ZNerq-<aoD\;tnaQ#9mHj3*lKRNqk2k[aio/hPh;$c=f[n^(
+e'cXicHOJRaN)9<_SO"#]XkY_[^<BGYcY",WMcVhU7n3NS!o_2Q'@GnO,]*UM2-e;Jq/?!I!U'^
+G'%hHEGo`2CMINrAn>L^@:3GK?!R@q#=CmM8kVrT:Amod:B"&b;#a>T:Amu]:Amue:A@Q`:AI]^
+:B+)i:Amoe:&n)h:&n)h;#a;k:A%E^:Amug;#!fk9i"MZ9hnGZrD`\p!*&hos&/>b"]SK&<`N0!
+<;fhn<#a`QiSrnYjlYail07L!m-O--n*fc9nac8Bo^r.Us7QHerV6EgrqcNhrqu]mnc%GGlMgYY
+r;?<drVHNhqY1%kqcEc!r`B,%rE0;->[1K<>Q%h)>ln><?2e11?N=L5@0^7M@:E_VA7b^O!,):E
+rb2@JrbVUMs(qUNs)7pVrc.pY$$:<5G'A.TG^4T6HN&9kIK+fsJH(3#K)UB8KS>,7L51P?Ll$tG
+Mi3ORNfK1?<=4/%H[:!`G^"@TFoHIdF)l8?E,Y_n!GuZPCBeNfBP;$kB)Z?BA7PUJ!b#JEra,\4
+?2e+/>Q7n+=TV\s8XKJS;u'Dj<VKJm=a+%S>[:]D@:E\VAS,UhC27X'DfB];FEVkQH@('hJ:W?+
+L51VCN/`m[P*;/sR$jG7StMdPUo(&hWi`G.Z*UgG\%0)_]t_A"_o9X:ai_fOcHsteeCE.%g"P3:
+h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCW%Ts7QHerV-BgrqcQirqucoo_sFALAuc~>
+JcC<$L]@#Grr)fnrVQTj!;ZTg+8>L&p%@tKoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh/h?)g"4g*
+eC)ajcHXPTaN)9<_SO"$]Xt_a[^<BGYcb+/WMcVhUS4<OS=>q6Q'@GoO,f0VM2-h=K7SQ%I=$9b
+GBJ"JEH#f4CMIQsAn>L_@UNPL?!LTMEd<7qOIN)Qa2Z-<`5BI/_8=(*_8=%(_8-#aqnW6J&&?#t
+_SO%(^qmk&^qmh$^AbeG]`#JA])0&;\cTFR\bil:\+I*/[JmQ3[K!]/[K!Z8[JmQ4[JdK3[K!]4
+[/m_FrO)^6qR-a<Za@$CYctF>]"@sQ!5/9DqRlg>s1&9B\[f5Zr3lR5rj`!;rO)a7[/IE4[/]%t
+iT&tZk2tjjl07L!m-O--n*fc9rpg-^o^r.U!quB_rV6EgrqcNhrqu]mnc%DFlMg\Zqu$3crVHNh
+rqQKN!9*q:qr@Y9!9O4B"R#"5l0A65!:BdR!q5XKrpg?ep%J.Sq"ad`rqlfqriH,"]%X^_\Gps`
+I!^0cH$FOWG'3e+"`n^(EH#jqD@gZ$CMR["BkV0mB4b^dA7T3L@L$=L?sd8I?=!P8s'#J,rE05)
+VPg?hW1X+d\bWi7]D/s^>$G6;?=.)K@Uit\B4u!pCMds-EH6/CG'A4XI!pKpJV/W1LP^nINK93b
+Pa.T&R[]k>TV80XVl6VrXfen5Za@0N\\#Mg^VRe)`Q$!@bKS8Wd*^=le^rI,g=tH>hr*JQj5f@b
+kNM0qlg4!*n*fc9nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*(s*t~>
+JcC<$L]@#Grr)fnrVQTj!;ZTg+8>L&p%@tKoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh.,3ng"4g*
+eC)ajcHXPTaN)9<_SO"$]Xt_a[^<BGYcb+/WMcVhUS4<OS=>q6Q'@GoO,f0VM2-h=K7SQ%I=$9b
+GBJ"JEH#f4CMIQsAn>L_@UNPL?!LT?@:j@tG^b:(PEYm,q2tZ>s,m,?q31T:s,m>CrK$r<!f`5#
+qMkN8r/L9-rf%#=NJrhqNW4t4NW+t<N<"q1NW4t8N<#"7NW"n:M#iKirJCH4ooK*4r/LH0rJgi9
+qhkH6reqYON8WXQj5]4_k3(sml0@U$m-X60n*olHncJFTo`"Lbp@n=[q#C0hqYU0hr;?N`rnd\?
+rqlZkr:g*eqYp<iq#@5iVZ<[pWVWUpX8K%#Xfei'Y5kg+Ym%G>Za@*IrjMd8s1/0@#J7X]]t_A"
+_u@US`W*pXa8X-bai_cMbg"J[rm:\ms3gqr#Lq;Tf@S[-g&B_*g]-(/hZ)O6iX=f-jlY^gkNM-o
+lK\B7s6L*[n*fc9nac8Bp%@g7f8]fY$%.)GH?jaZGBS-.F9Q`+EH,r9rb`9aChmg$C2%?pB4kgf
+ARo=]raH+@?sm>K?=$q:>lS".>5_S(=T3dIIfP%ls8%ZLN;S\1N-JN1>[:ZC?t!MSAS#LfBkqL$
+DJsN8FED\MH$XjdIt3*&KSG8=MN!OUOckroQ^F52SXuLJUnsufWiN8)Yd(OA[^`l[]Y;.s_Sa@4
+aN;WLcHaeae'uq"f\,!5h;-uHiSrnYk2tjjl0@U$m-X91nF?&>o(2MQo`Fj]p\ssfq>^<hqu6Nl
+rUg)?s+^Q(~>
+JcC<$L]@#Grr)fnrVQTj!;ZTgIeWR0p%@tKoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]=GG[['R$AY-"b(Vl$8bTq@pHS!fY/P`h/iNf8jPLPCJ7JUi2tH[9p\
+F`_YDE,KN.C2%?nARo:[?sd5G>['N]6UXC5!_H$]r([/cr_NAes%hfQrD3)]rD3DfpItW_peUc^
+s%iYirCmJk:JX_[:/Cjcs%`ViohYT_r(d;hrD*DgqbR5es%NYm:/+GX:Ae)j<W?%p;u]bb;Zp'"
+<`N/u<;]bq<<(kiiT&tZk2tjjl07L!m-O--n*fc9rpg-^o^r.U!quB_rV6EgrqcNhrqu]mnc%DF
+lMg\Zqu$3crVHNhrqQInqH*]!r`B,%rE9/(s',V0>[./3q-Eu+#[^tI@:<VR@:K4G!G#d@B)cNC
+B`DcIC2<fb");UfD#A2NDuXeUEW:+[F9Qf1G'A.TrcnQkH$]I:s*aoss+(-#s+:9's+LE+s+^Q/
+!/UW2#E"FtN/`jXO2b3"I0k:JH?sj]GB\4QrcA<bEcH)<DuOVcD/=!'C2.HrBP1siAS#C_A,]pB
+@:3JM?X@&Er`oJ-!*]>(!*K4lr(6r^TE"adq,I8lpf)KA>?kH??XR;O@qB4aBPD6tD/O93EccDH
+GBnL^I=HcuK7nu7M2I7OO-,TiQ'[l,S"6.DTqnN_W2co#Y->1;['mKT]=bkm_8=+/`lQ9Fbg+M\
+dF6Uqf@\d1gYL]Ci8N\UjQ>UfkiqBum-O-.n*ol;o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcCK)
+J,~>
+JcC<$L]@#GrVc`nr;6Njs7uZhs7ZNerq1d5oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-+;PaMu3:_SEq"]XkV][Bm0CYH=k*W2HJfTqJ!JS!o_1Q'7AmNf8mQLk^V9Jq/?!I!U'^
+G'%eFE,KQ0CM@HpAS#@\@:3GK>[1HLFFAk&Panb]`l5mr_Zmuo_SX.+_Z%CO_#D+H_"tkI_Yh7K
+^]_Ed]tV2Z]`,PB])0&;])K8<\,a#1[K*`6[/IB4[e@-.[f*T5[J[E2[/dZ4[0!eG\+I*1\$WOA
+Zi.-5ZF[WZ]"5NO^&,J@]DT2?\@;=Cs0r$<rjNcR[C3QP[C!<Li8N\UjQ5OdkNM0qlg4!*mf)YU
+nF?MK!V>s_p&Facp\jmeq>^<gqu-HjrUKmDs6BU[rVQNfqu-Bkq$Gm6hV[8LiSieUqr@V8!9O4B
+!9jFHrp0UN!:BdR#Oh3Qo()DFpAXdgq>1!crqlcpX8gk`n$jirI=6KiH[:!`G^"@TF`__HEcQ/>
+E,TW3D/F*)CMIQtBP;$jAn>OaA7PUJ!F]C8?iOF4?2e+/>6%k*=T_c-Vl0Ejs/,msWhf[b])929
+\pR^e?!^lG@U`kZAnPdkCM[j*E,fo?Fa&(UH@1-jJ:`E-L5:\EN/is]P*D6!R@B_<T:r!TV5L;m
+XKA\1ZEpsI\@K5a^;%M$`5Td<b0/#ScdC1ieCN7(g=k?<hVd>Nj5]7`k32'olKdg(mdKW6nac8B
+oCV_Kp@e7Zq#C0iqY^6ir;HTdrdk*(s*t~>
+JcC<$L]@#GrVc`nr;6Njs7uZhs7ZNerq1[2oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-+;PaMu3:_SEq"]XkV][Bm0CYH=k*W2HJfTqJ!JS!o_1Q'7AmNf8mQLk^V9Jq/?!I!U'^
+G'%eFE,KQ0CM@HpAS#@\@:3GK>[1H<@qfh%H%(I,qi^f<rK@2CplbH:q3(c?rK.#>rf.&>NfNsq
+s,R&;nrEX-s,?r:s,?`4rf7#<s,?Z2rf$f8s,Qo7r/Lc<r.tQ4M2I1Iqi:T8!06u<rJpf8oo&m1
+req_QMMmFON/W[Ri8N\UjQ5OdkNM0qlg4!*mf)YUnF?MK!V>s_p&Facp\jmeq>^<gqu-HjrUKmD
+s6BU[rVQNfqu-Bkq#I8hVZ*InW;`dlWW9*uXT,C&Y5,7$Yl:m.ZEsP;rjDg9rODm<&\>Te]Y2%o
+_8F1/_o0O5`lH.!a:$,4bKS5Vcd0tbdF%sAs3i1Bf%8O)f\"m1g=k<9gt^cDi8N\Tj5f=ak3(pk
+kiqBtlg+Q:$LR<NnF?&>oCMYJnW)4\.XleoI!^3dH?jaZGBS+NFE;JCEH,r9DJj<.Chmg$Bk_6o
+B4baeARo=]raGn:@/aO5?3":1>lS".>5_S+=BBs#r-n]srILdEnVmC*q2B]*>[:ZC?t*SUAS,Rg
+BkqO%DK'T9FEMePH$XjdIt3-'KnbD?Mi<[WOckroR$jG6StD^NUnsugWiW>+Yd1UC[^`l[]Y;.s
+_SjF6aND]McHjnde'ut#f\5'7h;7)JiT&t[k2tmll0@U$mI'H3nF?)?oCMVIp%J+RrV6Egs8)Zj
+rqu`no_sFALAuc~>
+JcC<$L]@#GrVc`nr;6Njs7uZhs7ZNerq1[2oCDJBnF,i6mHj3*l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-+;PaMu3:_SEq"]XkV][Bm0CYH=k*W2HJfTqJ!JS!o_1Q'7AmNf8mQLk^V9Jq/?!I!U'^
+G'%eFE,KQ0CM@HpAS#@\@:3GK>[1Gu5t+117n69Lr_<Aer_NDfr_NGe!)MuWr(m#]r(m;epeCc`
+q+pi^s%`VirD!;e"A_cf9i(abs%iYip.tZ_rD3GipJ:]^!`2TcqbI#fr`/ttqc!Jlo2>`h;c?Zo
+<W5tp<=n*IioB+]k2tjjl0@U$m-X6?mfDqJrpg*]o`"O`pAamcq#C0iqYU0gr;?N`rnd\?rqcTj
+r:p0fqZ$?k=8Q%t<rcA%=8uD%=8uD$=UA8:>[(H;>[:T>r*9;/ra#P1s'Gb6ra?%@@:<VT@q90L
+B)cNDB`;]SC2@^%Chda%D/O3.DZ4SSE;jkWErgB*rc\<c!-nKgrd+Tks*Y'"It*!!Jc:9$KE$W)
+L&Zo-LC8opM2I1KMi<XUO,q=].XleoI!^3dH?jaZGBS+NFE;JCEH,r9DJj<.Chmg$Bk_6oB4bae
+ARo=]raGn:@/aO5?3":1>lS".>5_S+=BA'cr(?o\!)03gnPoEdq,D`G>[:ZC?t*SUAS,RgBkqO%
+DK'T9FEMePH$XjdIt3-'KnbD?Mi<[WOckroR$jG6StD^NUnsugWiW>+Yd1UC[^`l[]Y;.s_SjF6
+aND]McHjnde'ut#f\5'7h;7)JiT&t[k2tmll0@U$mI'H3nF?)?oCMVIp%J+RrV6Egs8)Zjrqu`n
+o_sFALAuc~>
+JcC<$LB$rGrVc`nr;6Njs7uZhs7ZNerq1d5oCDJBnaQ#8mHj3*lKRNqk2k[aio&bOh;$c=f[n^(
+e'cXicHOJRaMu3;_SO"#]XkY_[^<BGYcY",WMcVhU7n3NS=5h3Q'@GnO,]*UM2-h=Jq/?!I!U'_
+GBJ"JEGo`3CMINrAn>L^@UNPL?!LTID0CGaNg66=]#DVf_tq7L_$%Qg^VIYY_#V@L_>h:P_8*hb
+^&YkG]`,PB])9,<\cTFR\bil:\+I*/[JdK2[/dZ/[JmW6[/RK2[/RH5[emH5[^Z4D!4DX2rO;g8%
+^WOKZa-j@Yd(aM]">Pbr4Vs>rO`!<"1YhK\,<]2[fa(H[^Z7D)<'T8jQ5Oekiq?slg4!*mdKW6n
+aZ2@oCMVRp&Facp\jmeq>^<gqu-HjrUKmCs6BU[rVQNfqu?Nlg]H<ghu;O6iVqj6j8J'=jo=HLk
+NM0plKdd&lg4W=s6fsXrpg?dp%J.Sq"ad`rqufpXT&:3ft$R]"b1uLI=-D@H3nkAGB\4QFEDSEr
+c&iqDf0H0Ci!m&C2%BqBP1phAS#C^@q&nU@:9(As'>\2r`oJ-!*]A)s&]A)VPg?hVu`fprMfn!X
+K)<i](io;])Q#]?=.&J@Uiq[AnYjmCM[m,E,fr@G'A1WH[U?nJV/W1LP^nINK90aPEhH$R@B_<T
+V8-VVPgDnXKA\1Za@0M\[oGe^VI_(`5Td<b0/&TcdC1jeCN7(g=tE=hVd>Oj5f=akNM0plg4!*m
+dKW6nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTdrdk*(s*t~>
+JcC<$LB$rGrVc`nr;6Njs7uZhs7ZNerq1[2oCDJBnaQ#8mHj3*lKRNqk2k[aio&bOh;$c=f[n^(
+e'cXicHOJRaMu3;_SO"#]XkY_[^<BGYcY",WMcVhU7n3NS=5h3Q'@GnO,]*UM2-h=Jq/?!I!U'_
+GBJ"JEGo`3CMINrAn>L^@UNPL?!LT=?t=%kFa8Lmqi^i=rf[8CplbH:s,mAGqNCl@rfI,?r/UW5
+s,R#:nrE^/",r4uN;eh:N;/D3NrP(=N:i21N;SY8Nr=q;N;\b6Nr>%9M$&QkM2;%hr/^l<r/^f:
+r/LW5!/pT1+H),8N/NXRiSrnYjlYail07L!m-O--n*fc9nac8BoCW%Ts7ZKerV6Egs8)WirVZTl
+nc%AElMgYYqu$6ds8)\jr20Ik!iW)tq5OFqr2]t%Y-.W)!3lI-!j]/=rj;[5(q7#b\[]2]]">Vf
+]tV;!_o0L2`5T^8a2e2#s2kYkbg"GZcd:%ddJhSodf\.Of@U#Ss4ID+rnAXPh;7&JiSrkXjQ5Od
+kND'ml0@R"lg4!*mdKW6nac8BoCVO4f8Tr`IXQWlHiA<tH$FOWG'.nKF)q8")K9V4DJa3+CMR[!
+BkV0mAnGUcA7K+Y@UW\Qra5\3!+#S/s'#J,r`T8'!*B/Kr."KmWrMRIpl5<4s'0kV?XI5N@q9._
+BP;-rCi401EH?5FGBeF\I=?]tK7nu7M2I7OO-#NgQ'Rf*S"-(CTqeE\Vl?\tXfnt8['mHS]"G_k
+^r""-`Q-'BbK\>YdF-Oof%8R.gYCWAi8EVTjQ5Oekiq?tm-O--n*fc9o()DEo_%nNp@nO\s7u]k
+r;6KkrVcBfJcCK)J,~>
+JcC<$LB$rGrVc`nr;6Njs7uZhs7ZNerq1@)oCDJBnaQ#8mHj3*lKRNqk2k[aio&bOh;$c=f[n^(
+e'cXicHOJRaMu3;_SO"#]XkY_[^<BGYcY",WMcVhU7n3NS=5h3Q'@GnO,]*UM2-h=Jq/?!I!U'_
+GBJ"JEGo`3CMINrAn>L^@UNPL?!LV563fkG84H3H:JLg`rD3;e!)NMfr_MoVrD3)]rD3DfpItW_
+peU`]!`)QdrCmJk:JX_[:/Cjcs%`ViohYT_r(d;hrD*DgqbR&`#u+/i9heDX:/4O\<;fes<;KPm
+;YX/j<;f_t;H$LnrDiksr)FWnioB+]k3(sml0@U$m-X60n*ol;o()DDo`"O`pAamcq#C0iqYU0g
+r;?N`rn[V>rqcTjr:p0hqYaLn<r,nt=T);$=T)D&>5qh0>?kB<r`o5(s'G_4!+>e7!b,SHraPt>
+Ac?<ABDuTEB`VsarbVUMs(hgTDJa9/rbqgUs)J$Z"*A[/G5c[eG^4T5HN/<sI=?WpIt3'#rdt0&
+!ec8]reCH.$AaOqMMd=NN/`jY``31lIXQWlHiA<tH$FOWG'.nKF)q8")K9V4DJa3+CMR[!BkV0m
+AnGUcA7K+Y@UW\Qra5\3!+#S/s'#J,r`T8'!*B.kr(?r]r_*Ad8kQ,`n5T0_s&B#'H<src@:E_W
+AS,UhC27X'DfB];FEVkQH@('hJ:W?+L51VCN/`m[P*;/sR$jG6StMdPUo(&hWiW>+Yd:^F\%0)_
+]t_A"_o0O7aND]NcHjndeC<($f\5*8h;7)JioB+]k3(sml0I^&mI'H3nF?)?oCV\Jp%J+RrV6Eg
+s8)Zjrqu`no_sFALAuc~>
+JcC<$LB$oFrr)ior;6Njs7uWgGk^q*p%@tKoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]=GG[[Bm-BY-"b)Vl$8bTqJ!IS!fY0P`h/iNf8mQLPCJ7JUi2tH[9p\
+F`_\EE,KN/CM@HpARo:[@:*AI>[.qGBQ/6KMNF0tY._ck_ns:._ns:i_>h:P^VIYY_>hCP_#V@O
+_#qKh_8-&b!5AHFrk&0@r42a:s1/';!4VR.r3ZI2s0hX/s0hm5rjD[2rj;a7qm?I5\,E`8[J@90
+\,NfK\%&iP['R-FZE_'T\[f>a]"G]T^%o>@])fRUr42d8qmQF3!O]B8[hI`\j5f=akNM0plKdg'
+mI'H3nF?MK!qZ'Vrq6<b!;HHerqZTjqtp?ir;H0bh#H^>qYg<hqYU9HrnI_6hV[5Ki8O[pqr@V8
+"Qee.kNMp0rp0UN!:BdR#Oh0Po()DEpAXdgq"ad`rqlfqriH,"]%OX_\-db9IXQWlH[:!`GlDmj
+G'.nKF)q8""`SBtDJa4hCB80arb)=FB)Z?HA7K+Y@UW\Qra,_5?![G7!aAi3r`T8's&]5uql'Om
+r2KduXT#?*s6mPo]6:bk?=.)K@Uit\B4u!pCMds-EH6/CG'A4XI!pHoJV/W1LP^nINK90aPa.T&
+R[]k>TV8-VVl6VrXfen5Za@0M\[oGe^VI_(`Q$!@bKS5Vd*^:ke^rF+g=tH>hr*JQj5f=akNM0q
+lg4!*mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*'s*t~>
+JcC<$LB$oFrr)ior;6Njs7uWgGk^q*p%@tKoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]=GG[[Bm-BY-"b)Vl$8bTqJ!IS!fY0P`h/iNf8mQLPCJ7JUi2tH[9p\
+F`_\EE,KN/CM@HpARo:[@:*AI>[.V>?!h/YEHZYYLlqY!r/puArfQu=plbcBPEYp-"d>+3OHGY(
+O8Ft7NW+t:NU`&,N<"q9NW4t4NW5%=NW4t1NW4t8N<#";N<"q9NVnh6Nrt8tM2M4f!fE&"qi:W9
+rJpi;s,I,@Nr4n7N!"usMi7Iks,6l8'B/!3jQ5Oekiq?slg4!*mdKW6nc&(\oCV\Sp&F^cp\jmd
+q>^<gqu-HjrUKmBs6K[\rVQNhqu3DiV>R4iVZ<[pWVNOoX8T."XT5O"Y5kg+YlV/:rj2[5rjMd8
+s1/0@#J7X^]t_A"_u@US`W*sXa8a3cai_cMbg"J[rm:\mrmLhq"kD2Uf@\aTfd>G-gYCT?hr!DO
+ioB+\k2tjikih9qlK[^$m-O--n*fc9o()DEo^ImmN=(2cIXQWlH[:!`GlDmjG'.nKF)q8""`SBt
+DJa4hCB80arb)=FB)Z?HA7K+Y@UW\Qra,_5?![G7!aAi3r`T8's&]5Lr-n]soms=Hmu7%$G)T^5
+?XR;O@qB4aBPD6tD/O93EccDHGBnL^I=?]tK7nu7M2I7OO-#NhQ'[l,S"6.DTqeE]W2co#Y->1;
+['mHS]"G_k^r"".`lQ9Fbg"G[dF-Opf@S^0gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DErq-?d
+p\4[^s7u]kr;6KkrVcBfJcCH(J,~>
+JcC<$LB$oFrr)ior;6Njs7uWgIJ<I/p%@tKoCDJBnF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]=GG[[Bm-BY-"b)Vl$8bTqJ!IS!fY0P`h/iNf8mQLPCJ7JUi2tH[9p\
+F`_\EE,KN/CM@HpARo:[@:*AI>[1H"6:4*F6qKp@:/=V[r(m5e!)NPgrD2cTr_N/]rD3DfpeCc`
+peUc^s%iYir_<Df$VsMm9hnJ\:esk^:A%E_:Adlf;#O/i:A[i_:&n)h:&drg:&Rie<Vobo<<-"p
+;u]bl;Zfor<)iiqs&/kqs&B"ur`&nt'B/!3jQ5Oekiq?slg4!*mdKW6nc&(\oCV\Sp&F^cp\jmd
+q>^<gqu-HjrUKmBs6K[\rVQNhqu0Xp=8Q%t<rcA%=8uD%=8uD$=TDY&>QA(/>kq\*?N4C4@/FC3
+@g6IUAn>ReBDuTEB`VsarbM[OCM[hbDZ=YSE;sqWEsZr2G'8(RG^+LZrH\csI!pHmIt*!!Jc:9$
+K*6j]Knb?]LC/ioM2I4LN/WaVO2b0,J:E#rI=-BfH?jc7G6N/4FEDSErc&*\Df0H0D#S2NC2*Z\
+!G?$DAHuaU@q&nU@:9(A!a]/<r`fM/>$Co.s&f;&s%3,\r_*2`s%<;_!D6"gs6iq^<H_>I?=.)K
+@Uit\B4u!pCMds-EH6/CG'A4XI!pHoJV/W1LP^nINK90aPa.T&R[]k>TV8-VVl6VrXfen5Za@0M
+\[oGe^VI_(`Q$!@bKS5Vd*^:ke^rF+g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo`"Lbp@n=\
+q#C0iqY^6ir;HTdrdk*'s*t~>
+JcC<$LB$oFrVc`nr;6Njs7uZhGk^q*p%@tLoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-+;PaMu3:_SEq"]XkV][Bm0CYH=k*W2HJfU7e*KS!o_1Q'7AmO,T!RLk^V9Jq/?!I!U'^
+G'%eFEGo`2CMINqAn>I]@:3GK>[.qH=`&2*K8YhXTWc8N_SX4._Sa7i_>_7M_>h@T_8=%*_Z%CN
+_@XQ#_8=%(_83q%^V7Fq]tD#W]DfD?\c')A]=PP`r3ua9oX4b-r3ZI2!4MU/rjMd4s0_a2ppL"-
+s0_[2rjVg6r3l[6rNlO/s1AEF\[qdPs1J?Eq7HgA]Y(iS\H'/<\,Wo:[JdQ5[hZ?ZioB(\k2tjj
+l07L!m-O--n*fc9rpg-^o^r.Us7QHerV6Bfs8)WirVZTlnc%;ClMgYYr;?Qk!8@D+rS.J1hV\=j
+!9*q:qr@Y9s5j:C#3Y47l0@U#rp9XPs6fsXrpg-^p%JCZ#Pn5nr;?HirN#qu]%OX`\/p3OJ:E#r
+I=-BfH?jaZGBS.PFEDSEEH,r:Df0H0D#S2NC2*Z\!G?$DAHuaU@q&nU@:9(A!a]/<r`fM/>$Co.
+s&f;&s/5^l!N2pqWWB0%qlR4)mCN,*s'KVN@U`kZAnPdlCM[j*E,fo?Fa&(UH@1-jJ:`E-L5:\E
+N/is]P*D5uR$sP:T:r!TV5L8lX0&S0ZEpsI\@K5a^;%M$`5Td<aihoRcd:(geCE1'g"P6;hV[8M
+j5]4_k3)!nlKdg(mdKW6nc&([oCW%T!quB_rqQNhs8)Zjrqu`no_sFAL&ZZ~>
+JcC<$LB$oFrVc`nr;6Njs7uZhGk^q*p%@tLoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-+;PaMu3:_SEq"]XkV][Bm0CYH=k*W2HJfU7e*KS!o_1Q'7AmO,T!RLk^V9Jq/?!I!U'^
+G'%eFEGo`2CMINqAn>I]@:3GK>[.V?=^>ELD0'oJJVjAhrK7#@rfR,A!gAe1plbiDPEV/nrfR>H
+P*5g,!g&J(qMtK5rJpi9nrE^/",r4uN;eh9N;8J4NrP+=N:r81N;/D4N;\b6NqeYFMMm@KM27"E
+Ll%1RNfK2"Nr4t:Nr>"@NfT6]rJg`6r/:H2'oRt/j5]7`k3(sml0@U$m-X60n*olHncJFTo`"O`
+p&Ojcq#:*hqYU0gr;?N`rnIJ<rqcTkr;QQnU]%"dV>R4iVZNfrWW&mtWVrjsX8T."XT5O"YPtg,
+Z2h61[/RKN\%&rY\@K/]]=bei^;.S&_o0I2`Poj;a8X-bai_cMc-=S\rm:\ms3gqr-IgVtf@JU,
+g"G*5gY:N>hV[;Nio9"ZjQ>UfkNM-ol0@R"lg4!+rpL'\nac8Bo^qX5fSpr'J:N,uI=6KiH?sj]
+GB\4RF`__HEcH)<E,TW3D/B2e!GZ?JBE;aXrac=F@q/tW@:<RC?NOP>?2e(1>?Y50=oVV(=9!aH
+J+J3kK!YLEN;8J5?Ys1[@Us%^B4u$qCi+'/EH6/DGBeCZI!pKpJqJc3Ll%%KNfT<cPa.T&R[ftA
+Tq\?ZVl6VrXfnt7ZaI6O\\#Mg^VRe*`Q-'AbKS8Xd*^=le^rI,g>(N@hr*JRj5f@bkNV6rlg4$,
+n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*'s*t~>
+JcC<$LB$oFrVc`nr;6Njs7uZhGk^q*p%@tLoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-+;PaMu3:_SEq"]XkV][Bm0CYH=k*W2HJfU7e*KS!o_1Q'7AmO,T!RLk^V9Jq/?!I!U'^
+G'%eFEGo`2CMINqAn>I]@:3GK>[.Y@=[GMF6UjR:92A=\:B=9fr_NSjrD*8dm8!XVoM5<[r_E5_
+!)E;bqG%)f:/:a^!_uNer_<Ghr_WVjs%`8`s%`;as%`Geq+grcs%i\kr_3_p9heDY:/t:n<)ros
+r)E_rqGRAlqG[Dl"B/9!;cEZnr_jY5<E3!tioB(\k2tjjl07L!m-O--n*fc9rpg-^o^r.Us7QHe
+rV6Bfs8)WirVZTlnc%;ClMgYYr;?Qkr)W_sr)Wbt"B\`,=BPN'!*K2&s'#>*s'>Y0pg*o+s'Gb6
+ra?%@@:<VT@q9-KB)cNCB`DcRC2@^%CMIX$Ci4+hDZ=YTE;jkVF8pC_G5lddGlN'gHN/<tI"$No
+It3'#Jc:9$K+`ikKnb>;LPUbCM2I4LN/`gWO7ZEP<7OtiJUi9#IXQWlH[:!`G^"@TG'.nKF)l8?
+E,]`5DJa4hCB80arb)=FB)Z?HA7K+Y@UW\Qra,_5?![G7!aAi3r`T8's&]4lqb$i\r_*Gf8kMZH
+r_!5`ZiBDlqc3Yqs'KVN@U`kZAnPdlCM[j*E,fo?Fa&(UH@1-jJ:`E-L5:\EN/is]P*D5uR$sP:
+T:r!TV5L8lX0&S0ZEpsI\@K5a^;%M$`5Td<aihoRcd:(geCE1'g"P6;hV[8Mj5]4_k3)!nlKdg(
+mdKW6nc&([oCW%T!quB_rqQNhs8)Zjrqu`no_sFAL&ZZ~>
+JcC<$LB$oFrVc`nr;6Njs7uZhs7ZNerq1a4oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$c=f[n^(
+e'cXicHOJRaMu3;_SO"#]XkY_[^<BGYcY",WMcVhU7n3NS=5h3Q'@GoO,]*UM2-h=K7SQ%I=$9b
+GBJ"JEGo`3CMIQsAn>L^@UNPL?!LT;=_r/-Ko;%\V6Tp8s2+cOs1nZN$Gs]t_SO++_8=%)qSN3I
+s1nZL"MVR_]Y+6Urjr*>rON*C]"5HM\,s.J\+R3-[/IB4[e@-/[f!N4[JR?+[/m_FrO)^6ppU12
+r3lU6!k>JErjMp7[/I?1]EPpY]"GYerk/9Eq7HgA]Y(iS\H'/<\,Wo8[/dZ6[hn)cjlY^hl07L!
+m-O--n*fc8nac8BoCW%Ts7ZKerV6EgrqcNhrqu]mnc%8BlMgYYrVZWJr7h5+!o;_jrnme8ro3h8
+r8dn>!p8\0rosFJ!po=ArpBgUnG_tgoCV_Lp\4IYqYU0fr;HSprrBXa\aR$?Jq8H&IsufoI!^0c
+H$FOWG'3e+$?L6-EH#i7DJj<-rbDOLC&VcHB4h-S!G#^>@fKj:@/aL7?<pk9>QS,5>5h\)=9M]+
+<i;kkW;WarWrT6sXge>s])0*b?XR;O@q9._BPD3sCi402EH?5FGBeF\I=?]tK7nr5Ll%%LO-#Ng
+Q'Rf*S"-(BTq\?[Vl?\tXfnt7ZaI6O\\#Mg^VRe*`Q-'BbK\>YdF-Lnf%8R.g>(N@i8EVTj5oFc
+kiq?sm-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcCH(J,~>
+JcC<$LB$oFrVc`nr;6Njs7uZhs7ZNerq1a4oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$c=f[n^(
+e'cXicHOJRaMu3;_SO"#]XkY_[^<BGYcY",WMcVhU7n3NS=5h3Q'@GoO,]*UM2-h=K7SQ%I=$9b
+GBJ"JEGo`3CMIQsAn>L^@UNPL?!LT;=^GTPDfU#LJrBYlrfR)@s,m;D"I#"4P*5F#rf[;F!0[>D
+s,[5Apl>?5rJpi9nW*O,!0$l9rf$Z4s,R,=rf$Q1s,?l8!07#;!0$i8r/UN4#EX[uMMm@KM#E20
+NrY4>O8k7<O8P%;NrtE'O,j0urJ^T2!K<$;N#1O8jlY^hl07L!m-O--n*fc8nac8BoCW%Ts7ZKe
+rV6EgrqcNhrqu]mnc%8BlMgYYrVZSgrM9@frMKRl!3#mrq5OFqrN-%$!3Z:(!3lI+"gG8:ZEgh8
+[/RK6\,EfM\[oAa]Y2"n^r"",`5BO4`Q#s=rlG,^#Kt?9cHjh`d/MGmdf7cMe^i='f@\a/g"P07
+gYL]Chr3PRj5]4]k2tjikih9qlK[^$m-O0/n*oi:o()DEo^ImnN=gbnJ:N,uI=6KiH?sj]GB\4Q
+rcAKgEcH)<Df9N2D/B2e!GZ?JBE;aXrac+@A,]s;@/s^7?NOP>?2e(1>?Y50=oVS-=&r@NIXh?G
+!IoXsJcC8uJc120s6P^ANHnl=@:E_WAS,UiC27X'DfKc<FEVkQH@('hJ:W?+KnbD?MiEdZP*;/s
+R$jG6StD^NUo(&hWiW>+Yd1UC[^`l[]Y;.s_SjF6aND]NcHjnde'ut#f\5'7h;7)JioB(\k2tml
+l0@X%mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`no_sFAL&ZZ~>
+JcC<$LB$oFrVc`nr;6Njs7uZhs7ZNerq1^3oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$c=f[n^(
+e'cXicHOJRaMu3;_SO"#]XkY_[^<BGYcY",WMcVhU7n3NS=5h3Q'@GoO,]*UM2-h=K7SQ%I=$9b
+GBJ"JEGo`3CMIQsAn>L^@UNPL?!LT;=[GJE6UjO89DVEa;#O2h:B+)k:esmR:B"&^:Adoe:A@Q`
+:A@W^:B+,i:B!uf:B+)p:/+JZ:f'q`r_E/_s%`Jf!)WVi!)EDeq+grcr(m_k:JFPW9hnDW:/Cjh
+!*&qts&Anrq,78kqG[Dl"&i/t;uBN5;cH^r<9*'$k2tmll0@U$m-X60n*oi:o()DDo`"O`pAamc
+q#C0hqYU0hr;?N`rn@D;rqcTlr;Tar<W#nr=8Q%t=8uD&=8uD$<rcA$=TM]1r*98-s'5A*ra,V3
+!+>\4raPq=rFZ%As(MFHs(_RMrbMOM"Dr$nDJoGls)A!X%WZW3FEM_LG'A.TG^4R\rd,f9I=?Wp
+It3'#JV&K+K7no3Knb>;LPUbCM2I4LN/`gWO7ZHL<8(=aJq8H&IsufoI!^0cH$FOWG'3e+$?L6-
+EH#i7DJj<-rbDOLC&VcHB4h-S!G#^>@fKj:@/aL7?<pk9>QS,5>5h\)=9M]+<_5m]9)VE]9`I`b
+8H;B\9)qYps6N_`<W?$D?XR;O@q9._BPD3sCi402EH?5FGBeF\I=?]tK7nr5Ll%%LO-#NgQ'Rf*
+S"-(BTq\?[Vl?\tXfnt7ZaI6O\\#Mg^VRe*`Q-'BbK\>YdF-Lnf%8R.g>(N@i8EVTj5oFckiq?s
+m-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcCH(J,~>
+JcC<$L&^iFrVc`nr;6Njs7uWg!Vc<eo`=^VrpkC*nF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]=GG[[Bm-BY-"b)W2?AcTqJ!IS!fY0Q'.8jNf8mQLk^V9JUi2tH[9p\
+G'%eFE,KQ0CM@HpAS#@\@:3GK>[1H8B5Da?KoD.`VR-3<!5eTK!5e`Qr5/KMqSE9L_Yq=N^^%Wg
+]tD"i]Y"0SrOMm<"hV@W\[]3L\,s.J\+[61[J[E&[JmW5Zi[YD[JR?+[J[K5[J@91\,3W5\,EfE
+Z*:aI\$`TMZa6sNrk/9B"1u4X]DfJC^&#AA]DfGC])B/>\G`o:[f*W6[hn)cjlYail07L!m-O--
+n*fc8nac8BoCW%Ts7ZKerV6EgrqcNhrVZWmnG_/AlMg\Zs4R>(qqM,*#2S.ni8ESQro3h8rT+"?
+s5jOKkiq?slg+Q:rpBjVnF6GJ!qZ'Xrq?NiqYL*gquQcqX8gk`n$iOQJUi9#If=a.I!^0cH$FOW
+G'.nKF)uAAEH#jqD@:;tCMR["BkV0mB4h-S#@q=R@fM^$@/aL7?<pk9>QS,5>5h\)=9M]+<i2ej
+VuWgrWrK+"XS8j.s7!Vo]6I^l@Uit\B4u!pCMds-EH6/CG'A4XH[U?nJV/W1LP^nINK90aPEhH$
+R[]k>TV8-VVPgDnXfen5Za@0M\[oGe^VI_(`Q$!@b0/&Td*^:ke^i@*g=tH>hr*JQj5f=akNM0q
+lg4!*mdKW6nac8Bo^qhLp@e7Zp]1-hqY^6ir;HTdrdk*'s*t~>
+JcC<$L&^iFrVc`nr;6Njs7uWg!Vc<eo`=^VrpkL-nF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]=GG[[Bm-BY-"b)W2?AcTqJ!IS!fY0Q'.8jNf8mQLk^V9JUi2tH[9p\
+G'%eFE,KQ0CM@HpAS#@\@:3GK>[1H8>[M#TD0'rMKT)(VOo(=AOoCOBPQ-g=P67&5P*5g.!0[>D
+!g&J(qMkT9NrG%:NWP3#NU`&,NW4t:NW+n4NW+t<NW4q<NK3dnrf$W3s,?l8r/UN4#`t+/OG/CH
+MMqFis+pW7!07&>s,R#<r/Uf<!07&>!07#;rf$Z2s,@iTjQ5Oekiq?slg4!*mdKW6nF?)?oCMVR
+p&Facp\jmeq>U6fqu-HkrUBg?s6BU\r;`SfU]%"eV>[:iVZNfrWVNRoX8T."Xn]+!Z2_*0Zi7<6
+[C3NQrODm<s186Cs1JWP_8=+._o)Jm!li:$rlG,^$-UQ;cHjh`d*^8?df7bue^i@(rn.8(s4[M-
+'A_O&i8NYSj5]4^k2tjikih9rlMg)Xm-X60n*oi:o()DEp$n'oN<OobJ:N,urd>E,H[:!`G^"@T
+F`__HF)l8?E,Y_n$Z0]qCMITuBP;$kB)Z?HA7K(Xs)VRUra,_5?![G7!aAi3r`T8'$<L8/IXZcr
+IXZcsqgnctqgn]t!/%l_n;R+$G[Orh@qB4aBPD6tD/O93EccDHGBnL]I=?]tK7nu7M2I7OO-#Ng
+Q'Rf+S"6.DTqeE\Vl?\uY->1;['mHS]"G_k^r"".`lQ9EbK\>ZdF-Opf%8U/gYL]Ci8N\UjQ5Oe
+kiqBum-O--n*fc9o()DEo_%nNp@nO\!;ZWjr;6KkrVcBfJcCH(J,~>
+JcC<$L&^iFrVc`nr;6Njs7uWg!Vc<eo`=^VrpkC*nF,i6mHj0(l07Bnk2bR^iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]=GG[[Bm-BY-"b)W2?AcTqJ!IS!fY0Q'.8jNf8mQLk^V9JUi2tH[9p\
+G'%eFE,KQ0CM@HpAS#@\@:3GK>[1H86U3t(6:OI892PCZs%`Ph!)WYjm8!XVoM5<[r_<Jg:ARZb
+:A@W]:'+3d:Amlg:/=[b:&n)h;#a>k:'"-epJ1capJ:faqbR#_s%iPh"]8)m8P2eX9a"3c9hnI^
+<<-"t<W?%r<VfVo;Ya8k;Z9Vm;ArJ5<9*'$k3(sml0@U$m-X60n*oi:o()DDo`"O`pAamcq#C0h
+qYU0gr;HT`rn@D;rqlZm;Z]ou<Vohr=8Gtt=8uD%=8uD%<rcA$=oV\&>QA(/>kq\*?N4@4@/==3
+A,g*>AclUVB4q3Ws(MpWCM[d&C27X%D/O3.DZ4SSE;sqWF8pC_G5c[cGlDskH@(!dI/\TpJ,b$!
+Jc:9$KE$W)L&Zo-LB*/0M$JorMi<XUNfWg4oi0jL"bM;UJ:E%II1gpSH?sj]GB\4QFEDSFEcH)<
+DuOV^D/=!'C2.HrBP1sirac=F@q&p25[\"!?NOP>?2e(1>?Y50=oVS,=&r?n8c;9Z9E%Wa9)hK[
+9E.\ss6s"a<W5sB?t!MSAS#LfBkqL$DJsN8FED\MH$XgcIXm!%KSG8=MN!OUOHPfmQC+,1SXuLJ
+USOcbWN*)'Yd(OA[^WfY]Y2(q_Sa@4aN;TJc-F\`daZguf@em4h;-uHiSrnYjlYail0@U$m-X60
+n*ol<o(2MGp%A%Pp\jjeq>U6gqu6NlrUg)?s+UK'~>
+JcC<$L&^fErr)fnr;6Nj!;ZTgF8,D%p%@tLoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-+;PaMu3:_SEq"]XkY^[Bm0CYH=n+W2HJfU7n0LS!o_2Q'7AmO,]*ULk^V9Jq/?!I!U'^
+G'%hHEGo`2CMINrAn>L^@O5Dh?<pf?>$5QVGCYI.QCXq]`5KR2_SO(*_84"*_o0I0_ns:.p;-pJ
+_SO(f^]M9b^&>SD]DfD@\c',>])]GA\HTLR\@B#WosXb)o!SJ*rNuU4qR$%*r3lX5q6p:3r3lO4
+rj`!=!jf/9rO3!=['I!D]tOEXs1/9D]Y![Gr4*u\\%&oV[^NTO[c?H2k3(sml0@U$m-X60n*ol;
+o()DDo`"O`pAamcq#C0hqYU0hr;?N_rn.8:rW2uMr7V#%r7h5+!o;_jrnme8rSm_7rT+"?!p8\0
+rojUOlg*p)m/HDSn*olHncJFUpAXdkq>1!cr;?NlWrLb_n@8LN$%d_YJ:E#rI=-D@H6[][GB\4Q
+FEDSEEcH)<Df0H0D/=!'C2.HrBP1siAS#C_s8W%_"^k\E?=$q:>lS%.>5h\)=9)G%<r])nW;`gr
+WrT6tXTP`.XKB29n%/;+EFNEgAS,UhC27X'DK'T9FEMePH$XjdIt3-'KnbD?Mi<[WOckroQ^F52
+SXuOLUnsufWiN8)Yd(OA[^`l[]Y;.r_Sa@4aN;WLcHaeae'uq"f@em4h;-uHiSrnYk2tjjl0@U$
+m-X91nF?&>o(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?s+LE&~>
+JcC<$L&^fErr)fnr;6Nj!;ZTgF8,D%p%@tLoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-+;PaMu3:_SEq"]XkY^[Bm0CYH=n+W2HJfU7n0LS!o_2Q'7AmO,]*ULk^V9Jq/?!I!U'^
+G'%hHEGo`2CMINrAn>L^@M*!T?<pf?>$5*<@qot)H@CR.q2toDP*2#mPl?jHP4b"@P`q;orfd>E
+s,dAEO,s*srf-f8!0-K.r/C]8rJgf8q2PB6s,I&;pPo-1pl5<4r/LW7ooK'5re:E2reg`4reU?1
+!06u<qMtK7!07#;rf$`4(l[M9k2tjjl07L!m-O--n*fc9nac8BoCW%Ts7ZKerV6EgrqcNhrqu]m
+nG_)?li$q`U&C_^U]%"dV>[:iVuNakWrK.!XT#?sYPtg,Z2h61[/RK6\,EfK\[oAa]Y(qm^r"",
+`5BO4`Q%nts2YGeb0%rQc-O`8d/VMmdf7erf)OA%f`'PJg=tB;h;7)JiSihWjQ,Fbk3(pkkiqBt
+lg*p(mI'H2n+#oHncACUnW)7]s+:W0JUi9#IXQWlHiA=9H$FOWG'.nKF)l;@EH#i6DJa6,CMR["
+BkV0mB4b^dA7Y`?rGr-M?XI,G?2e+/>Q7n+=oVS(=8l5%IsunHIK=qKr.4itr.4`s!/%ubmu7%$
+EFNEgAS,UhC27X'DK'T9FEMePH$XjdIt3-'KnbD?Mi<[WOckroQ^F52SXuOLUnsufWiN8)Yd(OA
+[^`l[]Y;.r_Sa@4aN;WLcHaeae'uq"f@em4h;-uHiSrnYk2tjjl0@U$m-X91nF?&>o(2MQo`Fj]
+p\ssfq>^<hqu6NlrUg)?s+LE&~>
+JcC<$L&^fErr)fnr;6Nj!;ZTgIeWR0p%@tLoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-+;PaMu3:_SEq"]XkY^[Bm0CYH=n+W2HJfU7n0LS!o_2Q'7AmO,]*ULk^V9Jq/?!I!U'^
+G'%hHEGo`2CMINrAn>L^@UNPL?!LT;=[PMB#!bOH84Q<Lq+h&e:J^sdr_MoVr_N2^qbR/c!DQ>e
+:&du`:]!oe:]F2g9`e'c:]=)h:]=2j:]F2`:]F2a:]F2e:\mid:]+&h;>sAl:]<lj:JFPW9hnDW
+:\[oi<;]_r<:Noe;ZBYr;GmEk(fTJUk2tjjl07L!m-O--n*fc9nac8BoCW%Ts7ZKerV6EgrqcNh
+rqu]mnG_)?li$n_r`&hps&B"ur)Wi!!EN;!<rQ2#=T;J%=T2A%=T)A'>$Lo0s'>Y0pg*o+s'Gb6
+qdBV:@q0%[rau.Brb)^SC2.R$CMR[#Ci"!+rbh^Rs)A!XrcA*^s*"Eds*4Qhs*F]l!IT=pIfFot
+J,k0"K)^H'K`6]*LB!#:Ll$tGMMmCONK0$[oMtB[k#MG6$%d_YJ:E#rI=-D@H6[][GB\4QFEDSE
+EcH)<Df0H0D/=!'C2.HrBP1siAS#C_kNDe/"^k\E?=$q:>lS%.>5h\)=9)G%<WPfarC[)_s%<8a
+!)*5^r(I#_!):0,mo90ar`!lH@q9._BP;-rCi4-0EH6/DGBeCZI!pKpJqJc3Ll%%KNfT<cPa.T&
+R[]k>Tq\?ZVl6VrXfen5Za@0N\\#Mg^VI_(`Q$!@bKS8Wd*^=le^rF+g=tH>hr*JQj5f@bkNM0q
+lg4!*n*fc9nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*&s*t~>
+JcC<$L&^fErVc`nr;6Njs7uZhs7ZNerq1I,oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$`<f[n^(
+e'ZRhcHOJRaMu3;_SO"#]XkY_[^<BGYcb(-WMcVhU7n3NS=>q5Q'@GoO,f0VM2-h=K7SQ%I=$9b
+GBJ"JEH#f4CMRWtB4YU`@UWVN?!LW<=]l5LDg?nhNL$39\&?2$_SQ/e!Q2kT_Z[io_ns=g_Z.OQ
+_Z%@T^qmh$^:jNYs1A9As1/*>s1A<B!kGhOrjW$=[^Yt=!4D^2rj;a7pU1"/rNuR3qR$(+!OfE8
+[f3]1[f<i6[f3`:\@;IIr42j6!O0!1\,EZ5^AY_E\cTOV]C<K2\c0)R[^W]Q[H6Q5kNM0qlg4!*
+mdBQ4nF?MK!qZ'Vrq6<b!;HEds7u]kqtp?ir;H0bf)P4<s4@;'qq:r%qqM,*#2S.ni8ESQro3h8
+rT+"?s5j=ErojgUlg*p(mHs?0n*fcFncJFTp&=[kq"ad`qu$BjrMonN\a[*HKS+o/JUi9#IXQWl
+H[:!`H$FOWG'.nKF)q8"&TDZ+DJa6,CMR[!BkV0mAnGWRrrSCKPl6mI?iOF4?2e+/>Q7n+=oVS(
+=8l5$VPj?j"0&5tWW&ptWrT7!Xo>L'XTGT+Xhk&)](rsW@qB4aBPD3sCi402EH?5FGBeF\I=?]s
+JqJc3Ll%%KNfT<cPa7])S"-(BTq\?ZVl6VsXfnt7ZaI6O\\#Mg^VRe*`Q-'BbKS8XdF$Fmf%8R.
+g>(N@hr*JRj5oFckiq?slg4$,n*fc9o()DDo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*&s*t~>
+JcC<$L&^fErVc`nr;6Njs7uZhs7ZNerq1I,oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$`<f[n^(
+e'ZRhcHOJRaMu3;_SO"#]XkY_[^<BGYcb(-WMcVhU7n3NS=>q5Q'@GoO,f0VM2-h=K7SQ%I=$9b
+GBJ"JEH#f4CMRWtB4YU`@UWVN?!LW<=]l&:?tO4oFF&LlO8+n<P5pjHP5pd>PQ$dJPEM+.PQ$^I
+OcYZcpl>B6r/Li<NfERhr/L`8rJgf8qMkK7s,I&;p5T$0rJ^f9rf-o9r/LW7pl>K<O,s.!s+^Z1
+MMqIk"GqqkM3.Oos,R&=pl><6!07#;rf$c5&EW':kNM0qlg4!*mdBQ4nF?MK!qZ'Vrq6<b!;HEd
+s7u]kqtp?ir;H0bf)P4<rhBFdrhB4`rM9CgrMKOk!iW)tq5XIqriH+$!3Z:(!3lI+"gG8:ZEgh9
+ZiIN5[K*f8\-]^W]">Vg]t_A"rPSWR!li:$rlG,^$HpZ<c-O__dEp:grmDe8eCN4&f@\a/g"Y68
+gYL`Ci8NYSj5]4^k2tjirob!ZlK[^$m-X6/n*]Z7nFH2Ao_%a7fSpc%K7ec,J:N,uI=6KiH?sj^
+G^"@TF`__HErL%jE,TW3D/F*)CMIQtBP;$jAnCuAs)A$ZrH&!Gs'>\2r`oJ-s'#D)s&]8&r`9#J
+rdFltJGXotJGXorJcgXWK7h#?m>Uk#E+<HjB4u!oCM[m,EH-&AG'A1WH[U?nJ:`E-L5:\EN/is]
+P*D9"R@B_<T:r!TV5L8lXKA\1ZEpsI\@K5a^;%M$`5Td<b0/#ScdC.heCN7(g=k?<hV[8Mj5]7`
+k32'olKdg(mdKW6nac8BoCW%T!quB_rqQNhs8)Zjrqu`no_sFAK`?Q~>
+JcC<$L&^fErVc`nr;6Njs7uZhs7ZNerq1X1oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$`<f[n^(
+e'ZRhcHOJRaMu3;_SO"#]XkY_[^<BGYcb(-WMcVhU7n3NS=>q5Q'@GoO,f0VM2-h=K7SQ%I=$9b
+GBJ"JEH#f4CMRWtB4YU`@UWVN?!LW<=]n$X6:40?8H2EZ:]=2i:[CjU:\IQ\:]=)i9htR[s%`>b
+qG%#dr_EGes%WPir_<Ghr_WVjs%`5_!)EDe!)EMhr_E>dqG.&drD<Jjr_WPh#>.NX:/=SY9`7]\
+<W?%s<W?%g;u]bq;\W,,;GuW=k3(smlKdg'mI'E2n*olHncJFTo`"O`p&Ojbq#C0iqYU0gr;?N`
+rmq,<rW#mo<;fbq;ufqq<rZ7s<rZ8#=T;J&=T)>"=TVc2>Pqb+?2n1*?2n71?N=L2@K0j;AGp->
+BE)ZFC&_rJD#\8SC2@^'DJfAj!,qjUs)A]mF)uGGF`qqPGBe@YH$Xd`H[L8@IfFotJ,k0"K)^H)
+KS>-ZLB!#:Ll$tGMMmCONK0'\oMt3VlW"gUK7ec,J:N,uI=6KiH?sj^G^"@TF`__HErL%mE,TW3
+D/F*)CMIQtBP;$jAnC)ck5IUD5lY3k?3":1>lS%.>5h\)=9)G%<WG_h9)_Ha8k].Wr(?r]r(I/d
+9MNA'm8X$arD[`GAS#LfBkhF"DJsN7F*)SLG^=^bIXls#K8#&9M2R=QO-,TiQC+)0S=Z@HU84W`
+W2cr$YHY==[C3TU]=bkm_8=.0a2lEHbg+P^dF6Urf@\g2gtgiEi8N_VjlY^hl07L!m-X60n*ol<
+o(2JFrq-?dp\4[^s7u]kr;6KkrVcBfJcCE'J,~>
+JcC<$K`C`ErVc`nr;6Njs7uWg!Vc<eo`=^VrpkL-nF,i6m-O''l0.<mjlGI]iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]=GG[[Bm0CY-"b)W2HGdTqJ!JS!fY0Q'7AlNf8mQLk^V9Jq/?!I!U'^
+G'%eFE,TW1CMINqAn>I]@:3GK>[1K9=]fN\H%Cg5Pb>(h_u@LU_ns:._u7OO_tq7M_Z[io_SO+g
+_#hEe^&>SI]=PVc\[h[Mrk&3ArOMs<rjVU0qm>q%rjMd4rjDX1ppL%.s0_X1s0qm6r3u[8r42j;
+"M(_AZEO59#.CqFZbO5grk&BG]">Ven@Sb5r42g:%C`e-k2tmll0@U$m-X6?mfDqJrpg-^o^r.U
+!quB_rV6Bfs8)WirVZTlnG_&>oD\d>!nPuTrn.,$rS%/'s4d\3hV\=js5Et:qr@\:roF4DkNMp0
+"mYF>m-X0=mK2kHnG_t[oC_hVpB^Qjqtp<gr;HVqrrBX`\a[*@KnP)2Jq8H&IsufoI!^0cH$K=4
+"a5$1FE;L%E=-Z'DJj<-Chmg$C&VcGBDhf/PQ-mHQ2b4k?3":1>lS".>5_S*=BAT&<WK&pVuirs
+WW&ptX8f:"Xo5C'XfVK'`;f28qn$u]AS#LfBkqL$DJsN8FED\MH$XgcIXm!%KSG8=MN!OUOHPfm
+QC+)0S=ZCIUSOcbWN*&%YHY==[^WfY]Y2(q_SX71a2lEHc-FY_daZdtf@\g3gtgiFi8WeXjlYai
+l07O#m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+LE&~>
+JcC<$K`C`ErVc`nr;6Njs7uWg!Vc<eo`=^VrpkI,nF,i6m-O''l0.<mjlGI]iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]=GG[[Bm0CY-"b)W2HGdTqJ!JS!fY0Q'7AlNf8mQLk^V9Jq/?!I!U'^
+G'%eFE,TW1CMINqAn>I]@:3GK>[1K9=]es<B5;L0H%:X3q2tfCPa(d'rKI>HP5UUEP5gXGOH5It
+NW>(&Nr4k:N;\b7N;AP5NrP+=N;&>1N;/D4N;JV4Nr>"=Nr"h2O9^DmL4tMCMMh@h!0R&;!06u<
+pl><6!07#;req;EMWO!_kiq?slg4!*mf)YUnF?MK!qZ'Vrq-?dp\4X]rqZTjqtp?ir;H-afDkIA
+s.T@b!29Cdq4mk`rMBIirMT[pq5XFpriH+$poak*Z*CU?Zi7<6[C3NQrODm<s186Cs1JWP_Sa:0
+_o)Jm!li:$rlG,^"j>08cHji9d/VMndf7cBe^i='f@\a/g"P07gtgiFi8NYSj5]7_k2tjikih9q
+lK[^$m-Xc>!q5XKrpg']n;c.\&VYmjK7\Z)J:E#rI=-BfH?jc7G6N/4FEDSErc&9aDf0H0Ci!m&
+C2*Z\!,)60rc.sYs)S?a?XI,G?2e+/>6%k*=TV],=8c2!J,autIfP#sJcC8tJbt&tK>dfVN;JTW
+A7]=bBPD6tD/O93EccDHGBnL]I=?]tK7nu7M2I7OO-#NgQ'Rf*S"-(CTqeE\Vl?\tXfnt7ZaR?R
+]"G_k^r!t,`Q-'BbK\>YdF-Oof%8R.gYCWAi8EVTjQ5Oekiq?tm-O--n*fc9o()DEo_%nNp@nO\
+s7u]kr;6KkrVcBfJcCE'J,~>
+JcC<$K`C`ErVc`nr;6Njs7uWg!Vc<eo`=^VrpkF+nF,i6m-O''l0.<mjlGI]iS`VLh:pZ:f@JL%
+da?Cdc-+8Na2Q!6_8!^s]=GG[[Bm0CY-"b)W2HGdTqJ!JS!fY0Q'7AlNf8mQLk^V9Jq/?!I!U'^
+G'%eFE,TW1CMINqAn>I]@:3GK>[1K9=]e!X6pa=57n?DN:]4,h:[LpV:\IQ[:]!ob:&du`:]!oe
+:]F2g9`e'c:]=)h:]=2j:]F2T:]F2e:\mic:]4,h;>sDg:Ba*V7n?EOqb7&ipf.;nr)NbrnPfHc%
+T?8&jlY^hl07L!m-O--rpKmWnc&(\oCV\So`Fj]p\jmdq>^<gqu-HjrUBg<s7?6g;u9Pm;u]hs<
+Voes=8>nr=8uD&=8l>$<sMi1=^"s3>?h#1!+#S/q-F#,s'Gb6qI0D6s().A"(c(WBDuTEC&_oUC
+hmg$CM[g(DJa9/rbqgUs)A*\F*%>'s*"Eds*4Qhs*F]ls*aors*t'!s+10$s+:H-KnY89reCi:M
+2@+JMi<USNfWg4j](_L&VYmjK7\Z)J:E#rI=-BfH?jc7G6N/4FEDSErc&9aDf0H0Ci!m&C2*Z\"
+_ZiTjlP\'5Q3qJ?iOF4?2e+/>6%k*=TV],=8c1t9)_Ha8P8tU!)*8_r_*,^"&2H`9uR(u<<#ts<
+-;__AS5[jCMRd)DfKf>FEVkRH@('hJ:W?+L51VCN/`m[P*;/sR$jG6StMdPUo(&hWiW>+Yd1UD\%
+0)_]t_A"_SjF6aND]NcHjndeC<($f\5*8h;7)JioB+]k3(sml0I^&mI'H3nF?)?oCV\Jp%J+RrV
+6Egs8)Zjrqu`no_sFAK`?Q~>
+JcC<$K`C]Drr)fnrVQTj!;ZTgF8,D%p%@tLoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-4AQaMu3:_SEq"]XkY_[Bm0CYH=n+W2HJfU7n3MS!o_2Q'7AmO,]*UM2-e;Jq/?!I!U'^
+GBJ"JEGo`3CMIQsAn>L^@M3'U?<pf?>$4s/D0(&WMNF*rXo?38_uIXa`Pf[4_o'F1_Sa7._SZ8h
+rkeWM!l2O`rOi-A!P5i>])K;C]",EO\c0)=\+R3,[.:X)[K*`7[/RK0[.h!-[f3]1[f<i5[f!W6
+\G`u<\Gj&=\-/t>ZE^k;[g0@K['IK^^:jNYs1A$<!5&'>#.qIW\@K,[rjW[)kNM0plKdg'mI'H3
+nF5u=o(2JFrUg6cp\4X]rqZTjqtp?ir;H0bf)PLD!7Lkq!S#[!fDjM#g&9Y$g]-%3h;7&Ii;V^7
+ir%j8jSn6Ak32g/s6:-\m-O-,mdBQ4nF?)?oCV_SpBUNjqtp<hrV`br!4pmpn@/[WKnP)2Jq<oO%
+=`hTI=-BfH?jaZGBS-.F:*)0EH,r9Df0H0D#S2PC2%?pr;Ze]rKI8GrfmRm?=$q:>lS".>5_S*=
+BAT&<WK#rVuEUrWMlcpWrK.!XSo:#Y5bU(XSf3@s6mPo]5D1lBP;-rCi4-0EH6/DGBeCZI!pKpJ
+qJc3LP^nINK90aPa.T&R[]k>TV8-VVPpMqXfen5Za@0M\[oGe^VI_(`Q$!@bKJ/Ud*^:ke^rF+g
+=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*%s*t~>
+JcC<$K`C]Drr)fnrVQTj!;ZTgF8,D%p%@tLoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-4AQaMu3:_SEq"]XkY_[Bm0CYH=n+W2HJfU7n3MS!o_2Q'7AmO,]*UM2-e;Jq/?!I!U'^
+GBJ"JEGo`3CMIQsAn>L^@M3'U?<pf?>$4s/?"%D`EHZ_[M><>6PlHpIPkUC?Pl$[DP5gXGOH5Iu
+NW>(%Nr4k:N;\b7N;AP5NWP3!N:r80N;\_9N;eh9N;JV4Nr>"=Nr+n1OT1@DK8#&6r/1K1s,ll5
+pQ#66"HJJ$N/dgq'^"TBl07L!m-O--n*fc8nac8BoCW"S!quB_rV6Bfs8)WirVZTlnc%,>p\t,a
+s.TCcs.TFdq4mk`rh]RjrMK^qWN#]nri?(#riH1'q6'k(Z*F;6rj2[5rjDg9rO<?J]"5Md]tM1r
+_Sa:0_o2Pnrl>#Zs2kDdc-?76s3UenrmCnteCE.LfDjM'g&KbEgYCWAi8ESRioB(\jlY^gkNM-o
+l0@R"lg=*<mKW.LnaZ2Ao^ImoN<Y,kKS+o/Jc:0/IsufoI!^0cH$FOWG'3e+$?L6-EH#i7DJj<-
+rbDUNBkV2Xs86m:EWC1[EW]ZT?=!P8s'#J,rE02(=',?$s*sur!IoXsJc1,tJc10$K7a#Ra8bUe
+pl00&AnYjmCM[m+E,fo?Fa&(UH@1-jJ:`E-L51VCN/`m[P*D5uR$sM8StMdPUo()jX0&P/Z*UgG
+\%0)_]t_A"_o9X:aihlPcHsteeCE1&g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCW%T!quB_
+rqQNhs8)Zjrqu`no_sFAKE$H~>
+JcC<$K`C]Drr)fnrVQTj!;ZTgIeWR0p%@tLoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-4AQaMu3:_SEq"]XkY_[Bm0CYH=n+W2HJfU7n3MS!o_2Q'7AmO,]*UM2-e;Jq/?!I!U'^
+GBJ"JEGo`3CMIQsAn>L^@UNPL?!LT;=]e`ks$R)Z77Kg?9i"O`:]!uf:[LpV:\d`d:JU^]s%WPi
+r_EJf"&;Qc:A7Q]:&n)h:B!uf:B+)l:/+JZr_NYl:/:4Q!)EMhr_E>drD!Dg:/:darD<Mks%i_n
+;#*oe:'a9[84ZNP:/+F]:&e2`<W?%g;uTZ/k3(sml0@U$m-X60n*oi:o()DDo_nFap@n=[q#:*h
+qYU0gr;?N`rmq,DrqTLi<;fbq;ufqp<WH4s<rZ8#=T;J%=T2D$=oV\*>Pqb+?2e+.>l\..>l\41
+?N=L2@0C%LA7T9NB)ZHBBF8HgC2@^%CMIX$D#S;ODZ4SSE!C<&EcZ>FFoHRaG5umeGlW0iHN8Kn
+IfFotJH(3#K)UB+KS>,7L55bas+pu<Mi3OQNK0(l<TR3M<<e23KS+o/Jc:0/IsufoI!^0cH$FOW
+G'3e+$?L6-EH#i7DJj<-rbDjUBkV2>j5]7a5X>32r]gQm?=$q:>lS".>5_S*=BAT&<WG_j8c_RW
+r_!5_rCm/^rCd&^"\hZb9h\7$s6iqb<W,m7AS,UhC27X'DK'T9FEMePH$XjdIt3-'KnbA>MN!OU
+OHPinQ^F52SXuLJUSOccWiN8)Yd(OA[^WfY]Y2(q_Sa@4aN;WKc-F\`daZh!f@em4h;-uHiSrnY
+jlYail0@U$m-X60n*ol<o(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?s+C?%~>
+JcC<$K`C]DrVc`nr;6Njs7uZhs7ZNerq1I,oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$c=f[n^(
+e'cXicHOJRaN)9<_SO"$]XkY_[^<BGYcb+.WMcVhUS4<OS=>q6Q'@GoO,f0WM2-h=K7SQ%I=$9b
+GBJ"KEH#f4Chm`uB4YXa@UWYO?<g`==]l)6Ao)O:KStt[Ts=O5rknfUrl"iS#K4Nu_ns=/_Yh=M
+_@FE!_8!^t]tD%k]Xtee\bs&<]DfD@\c0)=\+[9-[.:X([f*T4[JI9)[JmW6[J[H9[C3NQ\,*Q2
+\,No9\c92>\bilJWNNP4[C3QR[^NQM_8!^u^&GYE]D9,>]D0#Y]=PP`\@B)Zk3(sml0@U$m-X60
+n*oi:o()DDo_nFap@n=[q#:*hqYU0gr;?N_rmh&Irr:CFdf7c!eCE+$fDaG"g&9Y%g]-(/h#cKl
+i;V^7iqqd8jSn6Bk3(t-kmQeBlg4$*mI'E2nF6GJ!qZ'Wrq?]nqYU-dqu$ElWrLb_n@8LQ$&+%b
+K7\Z)J:E%II0k:JH?sj]GB\4QrcAKgEcH)<Df9N2D/B2e!,DE2!0dDHr0./Fs-3[n?=$q:>lS".
+>5_S*=BAT&<Wc@!Vl0Klri,pts/Z.#rN6%$!NiI#Xi^V2])'$Q\n>\jC27X'DfB];FEMePH@('g
+It3-'KnbD?Mi<[WOckroQ^F52SY)UMUnsufWiN8)Yd(OB[^`l[]Y;.s_Sa@4aN;WLcHaeae'uq"
+f\,!5h;7&IiSrnYk2tjkl0@U$m-a?2nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s+C?%~>
+JcC<$K`C]DrVc`nr;6Njs7uZhs7ZNerq1I,oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$c=f[n^(
+e'cXicHOJRaN)9<_SO"$]XkY_[^<BGYcb+.WMcVhUS4<OS=>q6Q'@GoO,f0WM2-h=K7SQ%I=$9b
+GBJ"KEH#f4Chm`uB4YXa@UWYO?<g`==]l)6>@1lTD/siJJW'Gh!0dDHs-!GIq3(iDPPg[BPQ$aF
+OoLLCO84e9NTcE%N<5-"N;\b7N;AP5NrP+=N:r80N;\_9N;eh9N;JV4NrG(>Nr>"?NfT7pOSb(C
+ItNK1MM[8jMZ8J6OHGXrO7eM7O,f8"N>7E7kNM0plKdg'mI'H3nF5u=o(2JFrUg6cp\4X]rqZTj
+qtp?ir;H-aec5UI!2'.]rh9=cs.TFdq4mk`rMBLjrMT[o!3,mr!ir?$ri?%"riPt!"gG8:ZEgh9
+ZimeF[^WaE\-]^W]">Vg]t_A"rPJWRrl+oXrlG,^"j>-7c-O`8d/VMmdNI#ge^i@(f\"m1g=k<:
+gtglGi8N\Tj5f=`k2tjikih:1l3$A=mHso@s6g-\nac8BoC7jnNW4_>KnP)2Jq8H&It%BF$%.)G
+H?jaZGBS-.F:*)0EH,r9Df0H0D#S2MCA\#2E;OYPEW]ZT?=!P8s'#J,rE02(=',?$!EFXJIfFlt
+JGausJGk&rK):2Bs6bjANG)s<BkhF"DJsK6F*)PKG^=^bI=Hd!K8#&9M2R=QO-,TiQ'[l,S"61F
+U84W`W2co#Y->1;[C3TU]=bkm_8=+/`lQ9Fbg+M\dF6Uqf@\d1gYL`Di8N\UjQ>Ufl07L!m-O0/
+n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcCB&J,~>
+JcC<$K`C]DrVc`nr;6Njs7uZhs7ZNerq1X1oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$c=f[n^(
+e'cXicHOJRaN)9<_SO"$]XkY_[^<BGYcb+.WMcVhUS4<OS=>q6Q'@GoO,f0WM2-h=K7SQ%I=$9b
+GBJ"KEH#f4Chm`uB4YXa@UWYO?<g`==]nil6:4*G6q0[;8l&2X:]!uf:[LpU:\mid:B4/c:BF9e
+:]=)h:&Ri]:]!oe:]F2g9`e'c:]=)h:]=2j:]F2X:B4/h:]=,e:]*rj9hnGZ:]+&h;>j>f:]!lr
+5XS.7:JO\[9h\8U<)iEgr`&Vj!)i_n'^"TBl07L!m-O--n*fc8nac8BoCW"S!quB_rV6Bfs8)Wi
+rVZTlnG^u<rVlgpqbmPo;cEQmrDW_q!*/kr!*Atss&]2%s&]/$s&T8(=]t`-s',D+!+#S/q-F#,
+ra5M1s'u(>s(2:CB)ZHBBEMs`C2Elb"_qjiD/O4iDZ4SSE"m;4F)uGGF`qqPGBe@XH$Xd`H[U>A
+IfFotJ,k0"K)^K'K`?c+LAcr.M$JorMi<XTNfWg4k#ChMs+Ui6KS+o/JUi9#If=a%I!^0cH$FOW
+G'3e+$?L6-EH#i7DJj<-rbDaRiSieVj5iN)5l*_F5QbA"?=!P8s'#J,rE02(=',?$!*/tirC[/_
+9E%Tb9E%Q^9DM9]9`[p\aoD6;r)NPlr`/kqBP2!mC27X'DfB];FEMePH@('gIt3-'KnbD?Mi<[W
+OckroQ^F52SY)UMUnsufWiN8)Yd(OB[^`l[]Y;.s_Sa@4aN;WLcHaeae'uq"f\,!5h;7&IiSrnY
+k2tjkl0@U$m-a?2nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s+C?%~>
+JcC<$K`C]DrVc`nr;6Njs7uZhs7ZNerq-<aoD\;pnaQ#9mHj3*lKRNqk2k[aio/hQh;-i>g"4g*
+eC)ajcHXPTaN)9<_SO"$]Xt_a[^EHIYcb+/Wi2hlUS4?PSXZ%7QBdYsOH5?YM26n?K7\W'I=-?d
+GBS(LEcH#8Chmd!BP(gd@U^*\?X@#C>?Y03=(cAmItirFR\m@-`5DSms2FiQotpgI_u@LT^q[Ut
+rk/HI]=YYbr4;m>rjr*>rj`!;p9sk*o!SJ*rNuU4qR#t(s0hj5rO)g9[^N[A[emQ5\Gj&<\Gs,7
+\-8M)Z*CUBr3ljF_83n#^AY\E]D9,=]DB2?])K5E\@Ledl07O5ljN4Kn*fc9nac8BoCW%Ts7ZKe
+rV6EgrqcNhrVZTlnc%)=s3U\ks3gnq"4YlPfDaG!g&B_%g]-%3h;7&Ii;V^7iqqd8jSn6Ak32g/
+s6:0]m-O-,mdBQ4nF?)?oCV_Lrq?]oqYU0fr;HTnWrLb_n@0$bL5(D8K7ec,J:N,uI=6Kird#'"
+G^"@TF`__HF)l8?E,Y_n!c;ahq>^AWr0.,Es-<Uj!+#S/s'#J,rE02(=',?$"BD=rVl0Nmri,pt
+ri?%"riQ.%!j/Q*r2p"%bl@(Aqn$m[BPD6uD/O93EccDHGBnL]I=?]tK7nu7M2I7OO-#NgQ'Rf*
+S"-(BTq\?ZVl?\tXfnt7ZaI6O\\#Mg^VRe*`Q-'BbKS8XdF-Lnf%8R.g>(N@i8ESSj5oFckiq?s
+m-O--n*fc9o()DDo_%nNp@nO\s7u]kr;6KkrVcBfJcCB&J,~>
+JcC<$K`C]DrVc`nr;6Njs7uZhs7ZNerq-<aoD\</naQ#9mHj3*lKRNqk2k[aio/hQh;-i>g"4g*
+eC)ajcHXPTaN)9<_SO"$]Xt_a[^EHIYcb+/Wi2hlUS4?PSXZ%7QBdYsOH5?YM26n?K7\W'I=-?d
+GBS(LEcH#8Chmd!BP(gd@U`_P?<pf?>$4s/>$tlSDf^/OKSobls-*GH!gAk5qNLc?qNLl@s,d>D
+O5GuqN<"q9NW"h4NW+t<NW4t3NVnb7NW4t;NVnb5NVnh9NrY4=Nrk?&O7n\3O8k:HG(57#L5LkH
+reg`="H\b-O,imoo8`j1"cVX.l07O5ljN4Kn*fc9nac8BoCW%Ts7ZKerV6EgrqcNhrVZTlnc%)=
+s.01]s.B1]rh9=cs.TIepnRb_rh]RjrMK^qWN#]nri?(#riH1'q6'k(Z*F;6rNuR4s0r!;!4i*?
+$G='c^;.V'_o0I1rl"rYa2e2#s2kMgbg"DYci2;kdJhSoeGn,"fDjJ7g"P37gYCW@hr*GPioB(\
+jo4EBkPs`Kl0@R"li$5Nmf2_ZnF?)?oCVR5fSpGtL5(D8K7ec,J:N,uI=6Kird#'"G^"@TF`__H
+F)l8?E,Y_n!c;ahq>^81qJuUB!+#S/s'#J,rE02(=',?$!`a`"rI+csJGaurJGt,rK)1,Ds6YdA
+NH&WGCM[j*DfKf>FEVkRH@('hJ:W?+L51VCN/`m[P*;/sR$jG6StD^NUnsugWiW>+Yd1UC[^`l[
+]Y;.s_SjF6aND]McHjnde'ut#f\5'7h;7)JiT&t[k2tmll0@X%mI'H3nF?)?oCMVIp%J+RrV6Eg
+s8)Zjrqu`no_sFAKE$H~>
+JcC<$K`C]DrVc`nr;6Njs7uZhs7ZNerq-<aoD\<1naQ#9mHj3*lKRNqk2k[aio/hQh;-i>g"4g*
+eC)ajcHXPTaN)9<_SO"$]Xt_a[^EHIYcb+/Wi2hlUS4?PSXZ%7QBdYsOH5?YM26n?K7\W'I=-?d
+GBS(LEcH#8Chmd!BP(gd@U`_P?<pf?>$4s/5!VG%77Tj>9MSAZqb[8fmS<[Us%WPirD!Ah:AI]c
+:&n)h:B+#i:/+LW:]!le:]=,g:&dug:]=)h:]=2j:]F2Y:]F2i:]*ud:]4#g:&[of:]+&h;$'Qk
+;#*o^:'<F=8kDPP:]=&n;,U@m<E)stp/V,lpJ_)ir_is_kiq?trp1$[mdKW6naZ2@oCMVRp&Fac
+p\jmeq>U6fqu-HjrUKm;s8#Xl;ZK_o;uBVm;Z]ou<V9Am=8l8#=8l>%=8l>$<rcA$>5qh(>QA(/
+>lJ"/>l@t.?N4@4@/F@>@UinYAS,OcAnPcUBE2cGC'e]lCMIU#Ci+',rbhaSs)8]mEcQ5CFEM_L
+G'A.TH$Xa^H@(!eIK"]qJ,b$!Jc:9$K)gT(L&Zo,M#N59MMmCONK&sZr)NYor`/,\mo9pSL5(D8
+K7ec,J:N,uI=6Kird#'"G^"@TF`__HF)l8?E,Y_n$>jTpi8ESRioB.^r':'Bs$6Tj!+#S/s'#J,
+rE02(=',?$!*/tirCd/_r_*;brC[&^qb.5h9MJ5T9M8%&s8#^m<V]So<Voa8BPD6uD/O93EccDH
+GBnL]I=?]tK7nu7M2I7OO-#NgQ'Rf*S"-(BTq\?ZVl?\tXfnt7ZaI6O\\#Mg^VRe*`Q-'BbKS8X
+dF-Lnf%8R.g>(N@i8ESSj5oFckiq?sm-O--n*fc9o()DDo_%nNp@nO\s7u]kr;6KkrVcBfJcCB&
+J,~>
+JcC<$KE(TCrr)ior;6Ki!;ZTgI/!@.p%@tLoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-4AQaMu3:_SEq"]XkY_[^<?EYH=n+WMcSgU7n3NS!o_2Q'@GnO,]*UM2-h=K7SQ%I=$9b
+GBJ"JEH#f4CMRWtB4YU`@UWVN?!LW<=]l,6<bZDoJ;9)HR\mIj`;dd_`l5m8`5KX5_o28d#/\9p
+_8*h"rk8?Es1A-=rk&0@rji$<s0qa2qm>q%rjDg7rj;[4qR$")rjMg6!OfE8[K*`7[K*f5[emQ5
+\Gj&<\Gs,4\.N&DXg57@[^W]R\%oeq_8!^uot::9!4r$>s186@%I!'@lKdg'mI'E2n*olHncJFT
+o`"O`pAamcq#C0hqYU0gr;?N`rn7>Oci2;hdJqYodfe1Nf%8OQf_aA#gA9P-gtgiEhr+Ils5Nq9
+roF%>!U&\GkmQeBlg4$*mI'E2nF6GJ!qZ'Wrq?Khq>1*f!rW#qWW1Y^n[KZtLkg_>KnP)2Jq8H&
+IsufoI!^0cH$FRXGBS+NFE;L%E<1#srbhN2!0d8DrKI2E"-m1u?2e+/>6%k*=TV],=8c/&<MlXk
+VuEXnWW0!uX8]4!XoGR'XT5I"XoGQLs6R>q]5kJrC27X'DK'T9FEMeOH$XjdIt3*&KSG8=MN!OU
+OHPfmQC+)0SXuLJUSOcbWN*&%YHY@?[^WfY]Y2(q_Sa=2a2lEHc-FY_daZdtf@\g3gtgiFi8WeX
+jlYail07O#m-X60n*ol<o(2MGp%A%Pp\ssfq>^<hqu-HlrUg)?s+:9$~>
+JcC<$KE(TCrr)ior;6Ki!;ZTgI/!@.p%@tLoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-4AQaMu3:_SEq"]XkY_[^<?EYH=n+WMcSgU7n3NS!o_2Q'@GnO,]*UM2-h=K7SQ%I=$9b
+GBJ"JEH#f4CMRWtB4YU`@UWVN?!LW<=]l/7<aB*DC2nBBIY3WCrfd5DqNLf@qND/IPEM)kOcYX]
+NrG">NfB"qNW"h5NW"k=NJrhiNW"h7N<"q:NW+k;NK!aorJpo=s,R)>"-/G&O7n\3Nrb?'rf@7^
+H\.!,qhkE:rfR5A!fi>%plG!+%I!'@lKdg'mI'E2n*olHncJFTo`"O`pAamcq#C0hqYU0gr;?N`
+rn7>LSc55\TDYA]U&LedU&Le^U\gkdV>d@jVuN[qWVNRmX8f:#XT5O"Y6(r5Z2V'.ZimeF[^WaE
+\-]^W]">Vg]tV;!r58NQrl>#Z"Nnp2c-?76!7:\ls3gqs)qENjf@S[-g"P37gt^`Bi8ESRioB+]
+jlY^gkPjZJl0@R"m/?>OmK`4MnF?)?oCVR5fo7)1Lkg_>KnP)2Jq8H&IsufoI!^0cH$FRXGBS+N
+FE;L%E<1#srbhN2!-%gT!HN2UEWTQQ?2e+/>6%k*=TV],=8c/$<I]MsIK=qKqgn]rrIOp!!J?""
+K?jM`N;SZTBPM=!DJjE5EccGJGBnL^I=HcuK7nu7M2I7OO-#NgQ'Rf*S"6.DTqeE\Vl?\tXfnt8
+['mHS]"G_k^r""-`Q-'BbK\>YdF-Oof%8R.gYCWAi8EVTjQ5Oekiq?tm-O--n*fc9o()DEo_%nN
+p@nR]s7u]kr;6Hjrr)KgJcC?%J,~>
+JcC<$KE(TCrr)ior;6Ki!;ZTgJ+r[1p%@tLoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOfc-4AQaMu3:_SEq"]XkY_[^<?EYH=n+WMcSgU7n3NS!o_2Q'@GnO,]*UM2-h=K7SQ%I=$9b
+GBJ"JEH#f4CMRWtB4YU`@UWVN?!LW<=]ng,5Q=%T6q0a;84u`Sqb[8fs%WPinP9$Ys%WPirD*&^
+!_uNer_<GfrD*)_qbI/er_EGe!)EMhs%WPirD3Pk:/:4Q!)EMhr_<Ji:B"&e:&n#f:B+,g;#X;n
+:f1'b:\RWa9a!aD77p,M:BsWh9i4bc<)riqr`&qtr)N_qpJ_)i%I!'@lKdg'mI'E2n*olHncJFT
+o`"O`pAamcq#C0hqYU0gr;?N`rn7>G;YsAo;H$Nk<;fbq;ufqf<WH5#=T2D$=T;G'=BYT+s',D+
+!+#S/pg!l+ra5M1"CbkOA7baPrb)4D$#+-hCi!m&C27YaD?"MRDuO\YEH6)AFT-F_G5laqG^4U\
+H?spbI=6QnIt.HJ!.k-$s+:K.KnY89L]3,/M$JorMi<XUNfX-=hc0&E+,Pf/L5(D8K7ec,J:N,u
+I=6KiH?sj]G^"@TF`__HErL%ZE,Y_n$/XRti8N\TjQ/W&5l!VH5[I`%r`oJ-!*]>(!a&N*rDir!
+8c;9[9*%UWr_38_rCd&^!DQ8e9`Rld9@!S5<;]bg<,lSdCM[m+E,fo?Fa&%TH@1-jJ:W?+L51VC
+N/`m[P*;/sR$jG7StMdPUo(&hWiW>+Yd:^F\%0)_]t_A"_o0O7aND]NcHjndeC<($f\5*8h;7)J
+ioB+]k3(sml0I^&mI'H3nF?)?oCV\Jp%J+RrqQNhs8)ZjrVZZno_sFAK)^?~>
+JcC<$KE(TCrVc`nr;6Njs7uZhs7ZNerq1I,oCDJBnF,i6mHj3*l07Epk2k[aio&bOh;$c=f[n^(
+e'cXicHOJRaN)9<_SO"$]Xt_a[^<BGYcb+/Wi)_iUS4?PS=>q6QBdVqO,f0WM26n?K7\W'I=-?d
+GBS(LEH#i6Chmd!B4b^b@UWYO?<pf?=]l29=&s*SG_([2PFSS\`;[^U`r<sW_uRdU`;d^V`5BOg
+_Zdon^V@Lsrk8?E!5&*=rk&0@rOMs<!4V[1qm>q%rjMd4rjDU0q6^=3[C3OA[JdN6[J%'+\,No;
+\c'#<\b!?1\Ik=1Z*LmJ[^W]R\%oeq^q[Utot1F>]"5McrO`NL]=PQ;l0@U$m-X6?mfDqJrpg-^
+o^r.Us7ZKerV6EgrqcNhrVZTlnc%DFqp55frR(VmrmUnt!S5m$f_aA#gABV/gtgfChr*GliVqj6
+j8S-=jT4N-rosIJ&F8]LmHs?0n*fc9o()DDo_/:Y!VlNiqZ?]ori,qN\ad0PM26qAL4t;5K7\Z*
+J:N,uI=6KiH?sj]GB\4RF`__HErL%ZE,YLNs-*MIr07&ArKIAK?![G7!aAi3r`T8's&]2#s&B2$
+VP^8hri#gqs/Q+"rN-"#s/uC(!NrO$XoGO(YL*=8])TDB\nYtqD/O93EH?5EGBeF\I!pKpJqJc3
+Ll%%KNfT<cPa.T&R[]k>TV8-VVl6VrXfen5Za@0M\[oGe^VI_(`Q$!@bKJ/Ud*^:ke^rF+g=tH>
+hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*$s*t~>
+JcC<$KE(TCrVc`nr;6Njs7uZhs7ZNerq1I,oCDJBnF,i6mHj3*l07Epk2k[aio&bOh;$c=f[n^(
+e'cXicHOJRaN)9<_SO"$]Xt_a[^<BGYcb+/Wi)_iUS4?PS=>q6QBdVqO,f0WM26n?K7\W'I=-?d
+GBS(LEH#i6Chmd!B4b^b@UWYO?<pf?=]l5:=&rR7Anu@.G^b@+PEYm.qNLf@plboFPEM&jOH8:Z
+r/C]8rJg`6qi1T8s,I&;p5T$0rf-r:s,Hr8qMkH6s,[2?rf7&>rf?f8q2YQ<O8=qBF+/gtMMd8h
+MZ8hBOHGZdO8b17O8+_8NW+t<klpA<m-O--rpKmWnc&(\oCV\Sp&Facp\jmeq>U6fqu-HjrUKmD
+s7`)aT)YG[T`1YbUAgkdUA1M]V#@.hVZ!CnW2]Zo!ir?$ri?(#riH1'q60h&!3uO/!42[3"LY\H
+\$u=G$+[XY]=bhk^V[kd_Z7XS`W!pXa9B].bKS5Urm1Vks3^hos3q)"f)F;$f`0\*g]-%Sh;7)J
+iSrkXjQ5Lck3(pkkiq?slKdg(mI'B0mdKZ7nac8Bo^RspN?F(6LPCP;KS+o/JUr?%IsufoI!^0c
+H$FOWG'8"MFE;L%E<1#sp](85!-%aRpi?C?r`fM/>$Co.s&f;&r`9&!!`XZ!rI+csJGaurJGk&u
+JcULUq1A[#d/WEjrJbQ,CMds-EH-&AFa&(VH[L6kJ:`E-L5:\EN/is]P*D5uR$sM8StMdPUo1/k
+X0&P/Z*UgG\%0)_]t_A"_o9X:aihlPcHsteeCE1&g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?
+oCW%T!quB_rqQNhs8)Zjrqu`no_sFAK)^?~>
+JcC<$KE(TCrVc`nr;6Njs7uZhs7ZNerq1^3oCDJBnF,i6mHj3*l07Epk2k[aio&bOh;$c=f[n^(
+e'cXicHOJRaN)9<_SO"$]Xt_a[^<BGYcb+/Wi)_iUS4?PS=>q6QBdVqO,f0WM26n?K7\W'I=-?d
+GBS(LEH#i6Chmd!B4b^b@UWYO?<pf?=]nj.<^/r<63fnK7Rp*G:f%'er_NPh!)NMf!)N>ar(dAh
+:J^sbnk]0Y!DcJa:]!oe:]F2h:&dug:]=)h:]=2j:]F2Y:]F2i:]*ud:]4&g:&duf:]4,f;#jGh
+:\IQ\9a<F<8kMlT:/Cj`$rKo$<)lms;c?Xq<E/iqs&Ahn$W9o%;X*H2lg4!*mf)YUnF?MK!qZ'V
+rq6<bs7cKes7uZjqtp?ir;H0bhZ*OQpJUofs&/hpr)ESm!E<(k<WH5#<rZ8$=T2D#=T;G&=T)G&
+>Pq_+?2e+.>l\..?2n71?i"42A,g*>AcZITrb)4D$#+-hChmd$C27YaD?"MQDuXeVEWgH*FEMa*
+G5lddGli;;HN&6kIK"]qJ,b'!Jc:9$K*6j]Knb?]M#N82MZ8S;N/`jXO8`/;<:*[.M26qAL4t;5
+K7\Z*J:N,uI=6KiH?sj]GB\4RF`__HErL%dE,XRhhV[8MiSrqZr]g<Gq`k'Ds$$QM?![G7!aAi3
+r`T8's&]2#s&B%urC[#]s%<8a!)*8_r_*,^!DQ8e9`n'^92*_4pf./koi,[@CMds-EH-&AFa&(V
+H[L6kJ:`E-L5:\EN/is]P*D5uR$sM8StMdPUo1/kX0&P/Z*UgG\%0)_]t_A"_o9X:aihlPcHste
+eCE1&g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrqu`no_sFAK)^?~>
+JcC<$KE(TCrVc`nr;6Njs7uZhs7ZNerq-<aoD\<1naQ#9md0<+lKRNqk2tabio/hQh;-i>g"4g*
+eC)akcHXPTaN)9<_SO"$]Xt_a[^EHIYck10Wi2hlUnXNRSXZ(8Q^*btOH5B[MM[(AK7\W'I=-?d
+G^":PEcH#8D/3m#BP(gd@q&kR?X6o@>$4s/<`X'WH%Lj4PFehcs2G#Xrl"rW`Pq\lrPK#]_o'F1
+_SX+(^V7G\]`GdXqRZ[<rjr-?"1l%Q\G!?2[JR?&[JmT7[JmQ4[JI62[C#_:s0hj5rjMj7s0_p:
+q6p41rODm<rO;j<o=4_/s1/f9XKf(>[C<TR]"l(r_8!b!^@f/<])TDA]Eu3]l07L!m-O--rpKmW
+nc&(\oCV\Sp&Facp\jmeq>U6fqu-HjrUBgIs8U@CcMZ#ed/;;kdf.\teCE.$rRh##rS%/'s4db5
+hV[5KrSdb8r8[e;rT+(Ckl0iHl4<4ImHj6.mdKZ7nac8Bo_&1W#Pn5nqu$BjrMfhM\a[-/M%,8r
+L5(D8K7ec,J:N,urd>?*H[:!`G^"@TF`heJF)l8?pAalOq31cAs'>V/s'#J,r`T8's&]/"!EE+u
+V?!OnW;`dqWrK.!XSo:$Xokf/XfVE%s/lC+Yg`XO\a?t@]=PRiD/O93EccDHGBnL]I=?]tK7el4
+Ll%%KNfT<cPa.T&R[ftATq\?ZVl6VrXfen5ZaI6O\\#Mg^VRe)`Q$!@bKS8Wd*^=le^rI,g>(N@
+hr*JRj5f@bkNV6rlg4$,n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*$s*t~>
+JcC<$KE(TCrVc`nr;6Njs7uZhs7ZNerq-<aoD\<'naQ#9md0<+lKRNqk2tabio/hQh;-i>g"4g*
+eC)akcHXPTaN)9<_SO"$]Xt_a[^EHIYck10Wi2hlUnXNRSXZ(8Q^*btOH5B[MM[(AK7\W'I=-?d
+G^":PEcH#8D/3m#BP(gd@q&kR?X6o@>$4s/<`TQ6?tO4oG'\UmOH]R+qigoAq3(fCrf[MKOcb`d
+O5Q&uN<>3#NK!gqr/CQ5rJpo;!0$W2rJ^]7s,?u;r/CK3rJgl=rf7#>rf-u>p5o-3!g&J(p5fE%
+JVAi8rJCT7rf[8C"-AS(Nq\V7NW>.;NX1X/l0@U$m-X6?mfDqJrpg-^o^r.Us7ZKerV6EgrqcNh
+rVZTlnG_MKo:>oQrh'(\rh9@ds.TIepnRb_rMBLjrMT[o!3,dorN#t"riH1'q6'k(Z*F;6rj2[5
+rjMj9rjW9F]"5Md]tM.q_Yh=N`<+'"a8X0[b5]]cc2Z*Nd*^4fdF-IleC<%"f@S[-g"P07gYCT@
+hVdAOio9%[jlPXekND'mlKRU!m-O-,md9H1n*oi:o()DANnKElM%,8rL5(D8K7ec,J:N,urd>?*
+H[:!`G^"@TF`heJF)l8?pAY,5ol9bIs'>V/s'#J,r`T8's&]/""'&<MJ,OfsIt7EIrIFp!s*t*#
+rdk0'K)($"KS@nT!fW%qm>V%(A8H+#DfKf>FEVkRH@('hJ:W?*KnbD?Mi<[WOckroQ^F53StD^N
+UnsufWiN8)Yd(OB[^`l[]Y;.s_Sa@4aN;WLcHaeae'uq"f\,!6h;7&IiT&tZk2tjkl0@U$mI'H3
+nF?MK!V>s_o`Fj]p\ssfq>^<hqu6NlrUg)?s+:9$~>
+JcC<$KE(TCrVc`nr;6Njs7uZhs7ZNerq-<aoD\<(naQ#9md0<+lKRNqk2tabio/hQh;-i>g"4g*
+eC)akcHXPTaN)9<_SO"$]Xt_a[^EHIYck10Wi2hlUnXNRSXZ(8Q^*btOH5B[MM[(AK7\W'I=-?d
+G^":PEcH#8D/3m#BP(gd@q&kR?X6o@>$4s/<`VKb6O#qJ7n?BL:]=2i:BF9e:]=,g:\[]^:BXEg
+:JO[T:]F/j:JULWqb@,er_<Pi:/+L_:]F/i:]4,i:B4/X:]F2i:]*ue:]*uf:&duf:]4,i;$0Wl
+;,I*bp.k?V"?8hB8P]7\!)<Gi$W9r'<E)pr;cQgs;u9Si;[?:cl0@U$m-X6?mfDqJrpg-^o^r.U
+s7ZKerV6EgrqcNhrVZTlnG_MKs&/\lpJUrgr_ibpr)ESms&98(<`W4$<`N1#qGmZ!<`f9&r`B)$
+s&T8(=]t`-s',D+!+#P.r`oM/rETD0ra,Y5qdBb>@q9+]AnGUdrb)7E!,;FI$#FBmC2.R$D/O4i
+D?+VSDut$"ErL1\FoQXbG63#7H2`-iHNAMBrdOlss+(-#s+:9'!/1?*",;SeM#E/8MMmCON/`jY
+r`.ZOnl>^H%>]doL4t;5K7\Z)J:E%II2dQ\H?sj]GB\4QF`__HEcH*Sh;$iChV[;Nj5g,&r':-D
+rBC6Gs'>V/s'#J,r`T8's&]/"!``2krC[#]!(m,_qFU`\r(I8g9MA/T9`@Zc9M<k7!`W)sl;V;1
+D/O93EccDHGBnL]I=?]tK7el4Ll%%KNfT<cPa.T&R[ftATq\?ZVl6VrXfen5ZaI6O\\#Mg^VRe)
+`Q$!@bKS8Wd*^=le^rI,g>(N@hr*JRj5f@bkNV6rlg4$,n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6i
+r;HTdrdk*$s*t~>
+JcC<$K)bKBrr)ior;6Njs7uWgI/!@.p%@tLoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOgcHOJRaMu3:_SEq"]XkY_[^<BGYcY",WMcVhU7n3NS=>q5Q'@GoO,f0WM2-h=K7SQ%I=$9b
+GBS(LEH#f5Chm`uB4YXa@UWYO?<g`>=]l29=&r=<EI3FrOHuK=]`#kK`<XE%`5T[5`PhYk$,ja!
+_SO((^V@M^]`GdXqRZ[<rjr'=s0r'<pU1(0qm>q%rjMd4rjDU0!O]<1[K!]4[JmW7[J.*1\$l7E
+rO;j<rO;j<o!nV.qmlm.Z*Ln<[L0+O^q[\$^V7Fq]D&r=]=IpPrjrTOl0@U$m-X60n*oi:rpg-^
+o^r.Us7ZKerV6EgrqcNhrVZTlnG_\P!R&^dblc89cHc=5rm:Sjs3gkp"4buRfDXA!g&9Y%gBHBg
+hVR/Jr8I\8qr@\:roF1Ckl0iHl2p;<m/HATmdKW6nG_t[oCV_TpB^Qiqtp6er;HVos4OsQ\.spZ
+M2@%DL5(D8K7ec,J:N,uI=6Kird"`nG^"@TFoHI_F7fM+Pk^I@PQ5"g>QS,5>5h\)=T;J$<X)Q'
+<2QOjVuEUpWVrjsX8]4!XoGR(XT>T+qlTn$s/uF,ec5ETn@JX;CN+96FEMeOH$XjdIXm!%KSG8=
+MN!OUOHPfmQC+)0S=Z@HU84W`WN*&%YHY==[C3TU]=bkm_8=.0a2lEHbg+P^dF6Urf@\g2gtgiF
+i8N_VjlY^hl07L"m-X60n*ol<o(2JFp%A%Pp\jmeq>^<hqu6NlrUg)?s+:9$~>
+JcC<$K)bKBrr)ior;6Njs7uWgI/!@.p%@tLoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOgcHOJRaMu3:_SEq"]XkY_[^<BGYcY",WMcVhU7n3NS=>q5Q'@GoO,f0WM2-h=K7SQ%I=$9b
+GBS(LEH#f5Chm`uB4YXa@UWYO?<g`>=]l29=&r=,@VBOsG'SUnOo(CCPQ-jIPP^U?P5pjHPQ-gG
+OTCQ)i/[_p!0$l9r/CN4rf7#<s,?Z2rJ^]7!fW+uqi(B2rJh#ANfK0]rJgl=pQ533!K`B4O9g8g
+L5UnGMM[,eP5gXFOH9C$pQ,?7!0@&<$gHsBm-O--n*fc8nc&(\oCV\Sp&Facp\jmeq>U6fqu-Hj
+rUBgNrrAPfSF`<NT)YG[T`1YbUAgkdUA1M]V#@.iVZ!FmVuWgoWWK6$WrB(!XT#=%Y5,:$YlD!.
+Z2h61ZimeF[^WaE\-]^W]">Vg]tV;!r58NQrl>#Zs2kDec-?76s3UtrdF$CjrmV2'f%8O+f\,!X
+gD\l(hV[8Mio9"ZjQ5Lck3(pkkiqBtlg4!*mJZGWn*oi:o()DBNnKC,Mi*@JLkg_>KnP)2Jq8H&
+IsufoI!bj="aP?:GBS-.F9$CSs8I'4EVFJR?2e(1>?Y50=oVV(=8c/%<E)qIrI4cr!.auurIFp!
+s*t*#rdk0'K)('!KE-bWs8S&SMt2i,NW3m3E,fo?Fa&%TH@1-iJ:W?+L51VCN/`m[P*;/sR$jG6
+StD^NUnsugWiW>+Yd1UC[^`l[]Y;.s_SjF6aND]McHjnce'ut#f\5'7h;7)JiT&t[k2tmll0@X%
+mI'H3nF?)?oCMVIp%J+RrV6Egs8)Zjrqu`no_sFAK)^?~>
+JcC<$K)bKBrr)ior;6Njs7uWgI/!@.p%@tLoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOgcHOJRaMu3:_SEq"]XkY_[^<BGYcY",WMcVhU7n3NS=>q5Q'@GoO,f0WM2-h=K7SQ%I=$9b
+GBS(LEH#f5Chm`uB4YXa@UWYO?<g`>=]kl0=&r<er^-iW7n6-G:B")e:]F2g:\[]\:]F2[:]*rg
+:JUUZqbI/es%`Me!_uNer_<Ghr_WVjs%`5_!)EDe!_uNeqbI,drD*>ds%`Sir)!;g!)WPgohP-R
+"&;*Q9)VNh:/+V`;,[?lr_io!<)Z`n<<-"o;[_jTlg4!*mdKW6nF?MK!qZ'Vrq6<bs7cKes7uZj
+qtp?ir;H-al2Uc\r)3DjpJUofs&/kqqc*Jl!E<(u<WuK(<E<.#rDj&&<`W:'r`K/$rE0)$!*K2'
+r`f;*!+#S/q-F#,ra5Y5!+>e7"CbkOA7baPrb)4D&8>loCMR[#C27X%D/O3.DK#Mns)J'ZrcJ0_
+s*"Eds*4iqH$Xd`H[U>AIfFotJ,k0"K)^K'K`?c+L]<2/M$SusMi<USNfR2j<;'<,Mi*@JLkg_>
+KnP)2Jq8H&IsufoI!bj="aP?:GBS-.F96O<g]#t5h;7#HiSrnYqEOpDq`k!Bs$$Khr`fM/>$Co.
+s&f;&rDiu"<)i]d#tml`9M8#N8kDVQ9)D9b9h\8U9`@]b9E7`9s8Q'p;t*cdDJO32EccGJGBnL^
+I=?]tK7nu7M2I7OO-#NgQ'Rf*S"-(BTq\?ZVl?\tXfnt7ZaI6O\\#Mg^VRe*`Q-'BbKS8XdF$Fm
+f%8R.g>(N@i8ESSj5oFckiq?sm-O--n*fc9o()DDo_%nNp@nO\s7u]kr;6KkrVcBfJcC?%J,~>
+JcC<$K)bKBrVc`nr;6Njs7uZhs7ZNerq1U0oCDJBnF,i6mHj3*l07Epk2k[aio&bOh;$c=f[n^(
+e'cXicHOJSaN)9<_SO"$]Xt_a[^EHHYcb+/Wi2ejUS4?PSXZ%7QBdYsOH5?YM26n?K7\W'I=-?d
+GBS(MEcH#8D/3m"BP(gd@U`_P?<pf?>$4s/<`TQ-D5DW6MNF-qX1nSQs2G#Xrl+oU!l`*rrkf/_
+_o0L2_ns:,^qd_!rk/?F]DB,<]DfDA\HBFR\@D7@!4D^2o!SJ*rNuU4qR$:1!4;X2"15JE[emK4
+[f<c/[emQ4\,a)<\,a)1\GWo5])TATX08h=[^NZ<^qd_"^qd_!^:_)P]Fh`c\[oAa]B\_Km-X60
+n*oi:rpg-^o^r.Us7ZKerV6EgrqcNhrVZTlnG_nVrlY5`!6kDdrm(DerQtMjrmLep!7_#!rRh##
+rS%/'s4db5hVR/Jr8I\8qr@_;rT+(Bkl0iHl4E:JmHj6.mdKW6nac8Bo_%qWpAt'crqcfqrVc_p
+s4OsQ\0-`gMM[1GLPCP;KS+o/JUi9#IXQWlH[:!`H$FOWG'.ous8S;UPkgOAPQ5"g>lS".>5_S*
+=BAT&<rZ/&<2QOjVuEUpWVidrX8]4"XoGR(XTGZ-XSf4#Y5b[+YccUXpUTh*Ci=<5F*)PKG^=[`
+I=Hd!K7nu7M2I7OO-#NgQ'Rf*S"6.DTqeE\Vl?\tXfnt7ZaI9Q]"G_k^qmn+`Q-'BbK\>YdF-Oo
+f%8R.gYCWAi8EVTjQ5Oekiq?tm-O--n*fc9o()DEo_%nNp@nO\!;ZWjr;6KkrVcBfJcC?%J,~>
+JcC<$K)bKBrVc`nr;6Njs7uZhs7ZNerq1U0oCDJBnF,i6mHj3*l07Epk2k[aio&bOh;$c=f[n^(
+e'cXicHOJSaN)9<_SO"$]Xt_a[^EHHYcb+/Wi2ejUS4?PSXZ%7QBdYsOH5?YM26n?K7\W'I=-?d
+GBS(MEcH#8D/3m"BP(gd@U`_P?<pf?>$4s/<`TQ-?[Z[+EcubZLQ_V#!0dAG!0d;EqNLrDrfd>E
+!g/S*i/[hs"-/A#N;\b6N;JV6NrP+=N:r80N;eh:N;nn7N;AP1NrP1=NW>.7OS=h)OT1FEJVAjW
+M?&,(P5^REOH9C$pQ#?8O8Y(GlKdg'mI'H3nF5uIncJFTo`"O`pAamcq#C0hqYU0gr;?N_rpTjm
+R$jA2R[]e:SFW6NT)PAZT`1VbUAgkdUA1M]V#@.hVZ!FmVuWgmWr9!uXT#=%Y5,:$YQ1s-ZMq62
+[K!]8\,Ei:])TDB]`Pp__Yh:O`;[aTa8X-_b0/#RcMl/gdJqW7e'umte^i@(f\"m2gY:N=hVR/K
+iSrkWjQ5Lck5OQDkQ:#6lMg/LmJlVRmf`.No(2JCNnKC7N/NRMM26qAL4t;5K7\Z)J:E#rI=-Bf
+H?jd\GB\4QFS#P4EW'qPEVjbVF8g1[?2e+/>6%k*=TV],=8c2"<<?-LJ,OfsIt7EIrIFp!s+(*#
+s+:<'q1Aa%L4e+Xrf$]3nr.FFDfKc<FEMePH?sseIt3-'KSG8=MN!OUOHPfmQC+)0SXuLJUSOcb
+WN*&%YHY==[C<]X]Y2(q_8=.0a2lEHc-FY_daZdtf@\g3gtgiFi8WeXjlYail07O#m-X60n*ol<
+o(2MGp%A%Pp\jjeq>U6gqu6NlrUg)?s+:9$~>
+JcC<$K)bKBrVc`nr;6Njs7uZhs7ZNerq1^3oCDJBnF,i6mHj3*l07Epk2k[aio&bOh;$c=f[n^(
+e'cXicHOJSaN)9<_SO"$]Xt_a[^EHHYcb+/Wi2ejUS4?PSXZ%7QBdYsOH5?YM26n?K7\W'I=-?d
+GBS(MEcH#8D/3m"BP(gd@U`_P?<pf?>$4s/<`W3e63okD7R]m?:/4X_:]F2g:\[][:B4/Z:]F/j
+:JULWqb@,er_EGes%`Sir_<Ghr_WVjs%`5_!)EGfs%`SiqbI/er(d8dr_EJhrD<Dh!)WMfp.k6S
+s%`Mg"%5^Q:B"$#8l8J`;GpIo<)cdp<)lmr<;]bm;[VgUm-O--n*fc8nc&(\oCV\Sp&Facp\jme
+q>U6fqu-HjrUBgTs8Gjq;Z9Pk;Yj>e;Z'Jm;ZB\n<;]\p<!ZK)<`N.#<E<,u<rZ5'<``='r`K/$
+r`K2%!a&T.r`]>+s',P0qHX#*!*oJ.!+,Y3!+>\4#\%:SA7]@bAS1pSrb2:G!GlQNC'\TkD/F0-
+DJjClE!:6%EcZ>ErcS6as*+Kg#C:ZAH@(!eIK"]qJ,b$!Jc:9$K)gT(L&Zr.L^T&qM2@+JMi<XT
+NfV^ioi3])Mi*@JLkg_>KnP)2Jq8H&IsufoI!^0cH$OXYGBS+Ng"P39gYCW@hV[8Nj5W<eq*4jD
+q`jsA!C'lh>lS".>5_S*=BAT&<rZ/"<;K5e9*%XYr_*8`s%32^!)*5`!DQ8e9`Rld9*.d[9@s4C
+<;KPi<;ohn<,?JmEH?5EGBeF[I!pKpJqJ`2LP^nINK90aPEhH$R@Bb=TV8-VVPgDnXKA\1ZEpsJ
+\[oGe^VI\&`5Td<b0/&TcdC1jeCN7(g=tE=hVd>Oj5f=akNM0plg4!*mdKW6nac8Bo^qhLp@e7Z
+p]1-hqY^6ir;HTdrdk*$s*t~>
+JcC<$K)bKBrVc`nr;6Njs7uZhs7ZNerq-<aoD\<'naQ#9md0<+lKRNqk2tabio/hQh;-i>g"4j+
+eC)akcHXPTaN2B?_ns4(]tCqe[^EHIYck11Wi2hlUnXQTSsu19Q^*euOH5B[MM[+CKS+i+IXQQh
+G^":PF)c/:D/=!%BP1mf@q&kS?X?uB>?P*2<`TZ0BVVGPL5M(YSu]`Ja8O$W`<O9"`Pf^4_u%CP
+_ZI]k_>_1P^:h4m]DB,<]DfAF\[oA_\[V=As0_d3o!SJ*!4Dg5rjDU0!k#DBq6g72r3cO4s0_O.
+r3tn"r42X7s1A3?!jT>ErjMjBs1eTLs1\WL]t=$O!4r->!:0XN$gmBNn*ol;o()DDo_nI_p&Ojb
+q#C0hqYU0gr;?N_rq6<kaT'B\b5TTabl5igcHjf4ci2;hdJqYodfe1Nf%/IOf_jG#gABV/gtgiD
+hr*GkiW%p7j8S-=jT4N,rosIJ!pf4>rpBaR'^tP\nac8Bo_%qPp\=R\qYU0frV`\pft$[`&%RXW
+MM[1GLPCP;KS+o/Jc:0+IsufoI!^0cH$K=4!-[u6r0-f<qNLiAr`fM/>$Co.s&f;&rDrqus&B#q
+s/5mqs/Gsss/Z.#rN6+&s/c=)XSf4#Y5b[,Yck4_s7X"p\n5l#EcZ>GGBeF\I=?ZrJqJc3Ll%%K
+NfT<cPa.T&R[]k>TV8-VVPgGpXfen5Za@0M\[oGe^VI_(`Q$!?b0/&Td*^:ke^i@*g=tH>hr*JQ
+j5f=akNM0qlg4!*mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s*t~>
+JcC<$K)bKBrVc`nr;6Njs7uZhs7ZNerq-<aoD\<'naQ#9md0<+lKRNqk2tabio/hQh;-i>g"4j+
+eC)akcHXPTaN2B?_ns4(]tCqe[^EHIYck11Wi2hlUnXQTSsu19Q^*euOH5B[MM[+CKS+i+IXQQh
+G^":PF)c/:D/=!%BP1mf@q&kS?X?uB>?P*2<`T]1>C:m6DKC#JJ;9;PPEY[(qih#Drfd>E!g/S*
+i/RkuNfNsqr/CQ5rJpo;!0$W2rJ^]7s,?u;r/CH2qMkQ:r/Lc<plP31mu[R3r/_/;Mi!=JM3F)$
+P5^RHOH5B]NqJG6NpH]2$gmBNn*ol;o()DDo_nI_p&Ojbq#C0hqYU0gr;?N_rq69kRJ`HPRK&`U
+S,SrLSc>;\TDG5[T`ChdT`Ch]U\pqdV>mFkVuEXiWrB(!XT#@%Y5,7&Yd(J4ZMq34[C3OC\,NlD
+\[oAa]Y2"m^r$#e"iSC!`lH.!aT'BebKS5Vcd0u:d3$fce'umte^i@)f\,!4gY:N>hVR2LiSrkW
+jQ5Lck3)^,$L-j@m-O-,m-X3.rpL!Zo()DEnW):^%ZH='M2@%DL5(D8K7ec,rdY<)IXQWlH[:!`
+GlDmeG4Yb3EW'qQEW0t]EH6)@F8g4Z>QS,5>5h\)=T;J$<rZ2";uhFHIKG"LJGautJGt*$J:E.L
+JcULUq1Ad&KnY35s8@oQMt;m>DfKf=FEVkQH@('hIt3-'KnbD?Mi<[WOckroQ^F52SXuLJUSOcb
+WiN8)Yd(OA[^WfY]Y2(q_Sa@4aN2NIc-F\`daZguf@em4h;-uHiSrnYjlYail0@U$m-X60n*ol<
+o(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?s+13#~>
+JcC<$K)bKBrVc`nr;6Njs7uZhs7ZNerq-<aoD\<1naQ#9md0<+lKRNqk2tabio/hQh;-i>g"4j+
+eC)akcHXPTaN2B?_ns4(]tCqe[^EHIYck11Wi2hlUnXQTSsu19Q^*euOH5B[MM[+CKS+i+IXQQh
+G^":PF)c/:D/=!%BP1mf@q&kS?X?uB>?P*2<`W3c5smq+77Kj=s%`Ge!)EGfpeKsI!)EJg!)W>a
+r(d8fr_EGe!)EMhs%WPirD<Mi!)DrXs%`Sir(d5erD*>ds%`PhrD<Dh!)WPgohP-R!)E8a#"_Qa
+:JX_^r_Wer;cHarr_rhrs&/nsrDiep!E/7_ljN4Kn*fc9nac8BoCW"Ss7QHer:p<frqcNhrVZTl
+nG`+\s&/_ks&/hnrDNJjpJUrgr_i_orD`Ym$<1#+<`N.#<E3("rDrhtr`K,#r`K2%!E`M(>5hb(
+>QA(.>lJ"/>l@q.?N+:6?t!JOra?(A@q9+]AnGUdrb)4Drb;FKrG)@K!,_XOs)@sW!HN8\FT6L`
+G5ladGl;mfHN&9kIK+crJ,b'!JcC?$K*?p^KnbA<reLo<Ll%"IMi<XTNfVdko2Q9ZMi*@JLkg_>
+KnP)2Jq<oO$%IDPI=-BfH?jc7G6<$Ag=lP\#Me.khr*JQj8;+:5Q="G5PdPD5Q4mh>?Y50=oVV(
+=8c2"<W?%q9)hNg8kViN91hhS8H;B]9`Iie9`Iie9`Icc9E@d[g&M"MqG[5iqGV!EEH6,BG'A1W
+H[U?mJ:`E-L5:\EN/is]P*D5uR$sM8StMdPUo(&iX0&P/Z*UgG\%0)_]t_A"_o9X:aND]NcHste
+eCE.%g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcC6~>
+JcC<$K)bKBrVc`nr;6Njs7uWgIeWR0p%@tKoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOgcHOJRaMu3:_SEq"]XkY_[^<BGYcb+.WMcVhUS4<OS=>q6QBdVqO,f0WM26n?K7\W'I=-?d
+GBS(LEH,o7Chmd!BP(gd@U`_P?<pf?>$4s/s&KS.MQa"0L5M+ZT<$#Pa8O$T`<!opqo&NP$GsWq
+^qd_!^:h1kqRZ[<rji*?rji0A\@;7ArjD^3n[8A)rNuR3qQp=3[']\;rjMa4s0hp7osXe-l+$W$
+q7?U<qmld<rO<<E[^Nf`^q[Y"^q[Xu^%f8?]DfA@ljW:LmdKW6naZ2@oCMVQo`Fj]p\agdq>U6f
+qu-HjrUBg`s8U.:a8j?\b5KK`bl5ihcHje]qp58gr6bPmrmLntec+.uf_aA#gABY)g]ZHihV[8h
+iW%p7j8\3=jT4N-rosIJ&F8]Mm-X3.n*fc9o()DEp%A=Y!VlKiqu?QprVibqft$^a'tK<_N/NRM
+M26qAL4t;5K7\Z)J:E%II0P(GH?sj]GOb_0POt+<PP^UD>QS,5>5h\)=T;J$<X2W(<)]ZkVl0Nm
+!3,psri?%"riQ4's/c@*XfVH&#-P/5Yct:#g]-rWoX\FMEccGIGBnL]I=?]tK7nu6Ll%%KNfT<c
+Pa.T&R[]k?Tq\?ZVl6VrXfen5Za@0M\[oGe^VI_(`Q$!@bKS5Vd*^=le^rF+g=tH>hr*JQj5f@b
+kNV6rlg4!+n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#s*t~>
+JcC<$K)bKBrVc`nr;6Njs7uWgIeWR0p%@tKoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOgcHOJRaMu3:_SEq"]XkY_[^<BGYcb+.WMcVhUS4<OS=>q6QBdVqO,f0WM26n?K7\W'I=-?d
+GBS(LEH,o7Chmd!BP(gd@U`_P?<pf?>$4s/s&KJ+Ck.(PDf^,KJVjAirfdDJq3:c?s-3MHrfR>F
+OH8:Z!f`5#qi1K3r/L]9s,I&;p5T$0rJ^f9rf-i7s,@#;r/LQ5!0@)=s,Zr:ooJU(s,m/>rf78A
+M2I1PPEGj-rfI8DO,a.!r/^l<rf@*G%.3KNn*fc9nac8BoCW"S!quB_r:p<frqcNhrVZTlnG`=b
+s-W_Pr0[MPs-itWs.&\Orgs+]qk3q^!2BIds.]:`r1s:frhfXls/5psq5XCos/c4%!3Z:(!3Z=)
+s0)L.riuO1rj2g9[^NZSrO<0E]"5Md]tV7s_Yh=N`W!pXa9fu2bKS2UcHjkarR!%Ae'lgre^`:'
+f\+s3g=tB;h;7#HiSieUj5f=`k2tjikih9qlK[a&r9XLPrpL!Znac;DnW):^s,7PJMM[1GLPCP;
+KS+o/JUi9#If=a"I!^0cH$FQ'rr@$8EW'qREW:(YEW'tYErK;F>?Y50=oVV(=8c/'<E)prIt.EG
+!IoXtJc:2uJHLCQJqEuS!.t$!",)D]FkcorNW"h4MtDs9EH6/DG'A4XH[U?nJV/W1L5:\EN/is]
+P*D5uR$sM8T:r!TV5L8lX0&P/Z*UgG\%0)_]t_A"_o9X:aihoQcHstfeCE1&g"P3:h;@/LioB+^
+k3)!nlKdg'mdKW6nc&([oCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcC6~>
+JcC<$K)bKBrVc`nr;6Njs7uWgIeWR0p%@tKoCDJBnF,i6mHj3)l07Eok2kX`iS`VMh;$`;f[n['
+e'ZOgcHOJRaMu3:_SEq"]XkY_[^<BGYcb+.WMcVhUS4<OS=>q6QBdVqO,f0WM26n?K7\W'I=-?d
+GBS(LEH,o7Chmd!BP(gd@U`_P?<pf?>$4s/s&KJ+4[MP&6UaI98P\qSpeL!J##7ri:esnaohYN]
+s%iVhr_<Dfs%iVh!)NSjs%iYiohPQ_qbI2er_NGes%iPfr_<Dfr_NMiqb[>ir_ESl:J^[Zo1]3[
+p.tW^%8T\n:Jakc;,U:k<)loo;uK\r<;ohrljW:LmdKW6naZ2@oCMVQo`Fj]p\agdq>U6fqu-Hj
+rUBg`s8>gn;Z'Dl;Z9Pl;Yj>d;Z'Jm;ZB\n<;]\p<!$'#<r,hq<rZ5$<rQ2"=T2D$=T;G(=BSf+
+>5hb$>lJ"/>l@t.?N+=2@/s^7@1$IRA7]=aAS,OeBDuQEC&ViIC]8&NCM[j)rGD[TE,ber!HN8\
+FT6L`Focf3rH\Ehs*FcoIK"]qJ,b'!Jc:9$K*?p^KnbA<reLo<Ll.(JMi<XUNfVglo2QKaN/W[P
+M2@%DL5(D8K7ec,J:N,urd>*#H[:!`G^%fmg&B_*gBZNihV[;OiSs\tq*+jEq`jm?r`fM/>$Co.
+s&f;&rDj##<)cfm9)_Ha9M>@Wr(-l\rCm2bs%NGe!)3Ab"&)?\7bdqC;uK\l;u0Jj;daTcFEMbN
+H$XgcIXm!%KSG5;M2R=QO-,TiQ'[l,S"61FU84W`W2co#Y->1;['mHS]"G_k^r"".`lQ9Fbg"G[
+dF6Uqf@S^0gYL]Ci8N\UjQ>Ufl07L!m-O0/n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$
+J,~>
+JcC<$JcGBArVc`nr;6Njs7uZhs7ZNerq1U0oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$c=f[n^(
+eC)ajcHXPTaN)9<_SO"$]Xt_a[^EHIYcb+/Wi2hlUnOHQSXZ(8Q^*btOH5B[MM[+CK7\W'I=6Hg
+G^":PEcH&9D/3p$BP1me@q&kR?X6oA>$5!1<`T]1<0"2.J;/rDQD1J$`lJ(ur5J]S!5nZO$cBiu
+_83q%^V7Co]DB,<]DfAF\[oA_\[V=ArjD^3o!SJ*!4Dg5rjDU0s0Vj6qm?O5[C3O@[K!]7[Iq!,
+\+mH5\+7'+\b`o:]DK/>\bru:\HTLOYeRuhrkA]R^V@Lr]XtfS]Ec']]",B<mI'uB!V#XYo)J:]
+o_nFap@n=Zq#C0hqYU0gr;?N`rW:*[aSa*Ua8j?[b5TQabl,cfcHjf4ci;AidJhSndf@nsec=>#
+f_jG#gAK_)h#H44hr*GkiW%p7j8S-=jT4N,rosFIs6LWjm-X3.n*oi:o()DEp%J.Sq"X^^qtg6h
+rMT\L\b!?2\K$WhN/W[PM2@%DL5(D8K7ec,J:N,uI=6KiH[:#-s7_`LPl?mDPQd=W>[(B8r`T8'
+s&]/"s&K(u#?.LsVl-JlWVidrX8]4"XTku3Y-"h/XSf4#Y5Y[*Y2''L\b3OEF*)PKG^4U_I=Hcu
+K7nu7M2I7OO-#NgQ'Rf*S"-(BTq\?ZVl6VrXfnt7ZaI6O\\#Mg^VRe*`Q-'AbKS8Xd*^=le^rI,
+g>(N@hr*JRj5oFckiq?slg4$,n*fc9o()DDo`"Lap@nO\s7u]kr;6KkrVcBfJcC<$J,~>
+JcC<$JcGBArVc`nr;6Njs7uZhs7ZNerq1U0oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$c=f[n^(
+eC)ajcHXPTaN)9<_SO"$]Xt_a[^EHIYcb+/Wi2hlUnOHQSXZ(8Q^*btOH5B[MM[+CK7\W'I=6Hg
+G^":PEcH&9D/3p$BP1me@q&kR?X6oA>$5!1<`TW/<,[:uCiFE>H\.*<rfdDJq3:c?rfmDGrfR>F
+OH81Wqi1K3r/L]9s,@#;oo8p/rf-r:s,Ho7s,@#;r/LT6!0@&<!0?o:oT/O(rfR&=rf?r<&;l:-
+PED#kOckigOH5B\NfO+"#EFk)NK<Gnmf)YUnF?MKs766_rUg6cp\4U\s7uZjqtp?ir;H0bqj7>M
+r0dJMs-`nUs-s%Yo:>iOs.B1]q4Re_pS7\_r2'FjrMTXnpo=:n!3H1%s/u1$!jJr7rj)O1s0Vj8
+rjVj9s186Bs1J]P^V[n+_Sa:0rl+lWs2YJfbKJ,ScHjh`r6bPnrm^tus47A*g"G*Yg]-(1hV\=k
+s5G'ZjQ5Lck3(pkkiq?slKmm)m-X0,mdBQ4nF?)Ao^RsqN?!t<N/W[PM2@%DL5(D8K7ec,J:N,u
+I=6KiH[:#-s8R'6EW'qNE<(%XEs?Z+>[1K:>5h\)=T;J$<rZ2";uopIrI+csJGXotJGk$(It3*%
+JqJ]-qLeg$!el8\h#ID6rJ^T2oo*F&FEMePH$XjdIt3*&KSG8=MN!OUOHPfmQC+)0S=Z@HU84W`
+W2co#YHY==[C3TU]=bkm_8=.0a2lBGbg+P]dF6Uqf@\d1gtgiEi8N_VjlY^hl07L!m-X60n*ol<
+o(2JFrq-<cp\jmeq>^<hqu6NlrUg)?s+13#~>
+JcC<$JcGBArVc`nr;6Njs7uZhs7ZNerq1U0oCDJBnF,i6mHj3*lKRNqk2k[aio&bOh;$c=f[n^(
+eC)ajcHXPTaN)9<_SO"$]Xt_a[^EHIYcb+/Wi2hlUnOHQSXZ(8Q^*btOH5B[MM[+CK7\W'I=6Hg
+G^":PEcH&9D/3p$BP1me@q&kR?X6oA>$5!1<`TT.<'*E65sn.38P2bP:\[]\:B4/Y:B4/g:B45`
+:]4&g:]=)k9hnDXr_NPh!)NPis%`VioM5H^r(m>fs%iMes%iSgrD!;es%iSiqb[>ir(lu\o1]3[
+p.tT]!`)WhrD3GirDNYp!EE+q;uTc#<)QZ]mI'uB!V#XYo)J:]o_nFap@n=Zq#C0hqYU0gr;?N`
+rr5dl;#O8j;Ys>k;ZBVl;Yj>e;Z'Jm;Z9Vn<;TSr<)lt"qGmJpr)`l"rE&u#s&T5'=oMV(>Pq_+
+?2\%->l\..>l\41?OpOQ@:3MO@:E_WA7]=aAS1pSrb2:G"`%jeC2.P`D$+ZmDJoGm%<?H.F)uGG
+FEM_LG'A30H2i3jHiJNnIfFotJ,k0"K)UB-KS>,7LPUbAreUT3s,.#=NK0$[hc'SSr)E5e/WPgL
+N/NRMM26qAL4t;5K7\Z)J:E#rI=-BgH@"/of\"m2g"P38gtgiEi8NYh54h)74p=/U>[(B8r`T8'
+s&]/"s&K(u!)rberC[,ar_!&Z!)*8as%WMes%N_l91qrP91qt6s8Q$r<;KPi<;][*F*)PKG^4U_
+I=HcuK7nu7M2I7OO-#NgQ'Rf*S"-(BTq\?ZVl6VrXfnt7ZaI6O\\#Mg^VRe*`Q-'AbKS8Xd*^=l
+e^rI,g>(N@hr*JRj5oFckiq?slg4$,n*fc9o()DDo`"Lap@nO\s7u]kr;6KkrVcBfJcC<$J,~>
+JcC<$JcGBArVc`nr;6Njs7uZhs7ZNerq-<aoD\<(naQ#9md0<+lKRQrk2tabio/hQh;-i>g"4j+
+eC)akcHXPUaiMK@_ns4(]tCqe\$iZMYck11Wi;nnUnXQTSt):;Q^*euOcPN]Mi!4DKS+i+IXQQh
+G^"=QF)c/;DJX*'BP1pgA7AtT?X@#C>?Y03=&r?0<)\sbH@gp1OI2iHrl>#X"NAC#`Pq\l%E69'
+_SO+*^qd_!]tCuR])K>=\cTFP\+mE2[JdK&[JmT7[JmQ4[JI63[C!=:[K!]5[JmW7[Igp+\+mH5
+\+7'+\b`o;]DB)=\bru;\bio9\c9JE^BD?e^:h2Y]D]AF]=dLtmf)YUnF?MKs766_rUg6cp\4U\
+s7uZjqtp?iqu-Bj!6+fS!lrC'r5\`V!6P/]s3(GdrQP>fps8rdrR(VmrmM&#e^i='fDaG#g&0S$
+g]-(.h>uNlr8I\8qr@_;rT+(Bkl0iHl2^/Lm/QG[mdKW6naZ2Ao^qhUpB^Qiqtp6er;HVms4Y$U
+\Gj#WNfB!VMi*@JLkg_>KnP)2Jq8K'J:E#rI=-D1s7DNIPlHsEPQd=W>[(B8r`T8's&]/"s&K(u
+"B21pVl0Nm!3,pss/Z1$rN-7+YHG"0Y5>@$Y5PU)Y293M\c98>]DT6RFEVkQH@('gIt3-'KnbA>
+MN!OUOHPfmQC+)0S=Z@HUSOcbWN*&%YHY==[C3TU]=bkm_8=.0a2lEHbg+P^daQ^sf@\g2gtgiF
+i8WeWjlY^hl07L"m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+13#~>
+JcC<$JcGBArVc`nr;6Njs7uZhs7ZNerq-<aoD\<(naQ#9md0<+lKRQrk2tabio/hQh;-i>g"4j+
+eC)akcHXPUaiMK@_ns4(]tCqe\$iZMYck11Wi;nnUnXQTSt):;Q^*euOcPN]Mi!4DKS+i+IXQQh
+G^"=QF)c/;DJX*'BP1pgA7AtT?X@#C>?Y03=&r?2<)[dfASc=,G^P+#Pa)04s-*MKrKR2CrfmDG
+rfR>FOH84XqMkB2r/L]9!f`.tp5T$0rJgi9s,Hr8rf$o:r/LT6!0@&<!0?o:oT/L'!0R)=rf?c7
+rK.JNOcbfgOH5E]NK0%uNs(K(m-X6?mfDqJrpp*\!;-6_!quB_r:p<frqcNhrVZQkqYgJ]qj@8I
+rg<YPqj@DOs-`qWrg`SNrLX%]qk3eZs.]:`r1s:fs/,^ls/5psq5XCos/c4%!3Z:(!3Z=)s0)L.
+riuO1rj2a7[^Q1ErjW9F]"5Md]tV4r_Yh:``5T^8a2c9Bai_fMbg+M[d*Va=$.@;OeC<%!f%8OQ
+f`9b*gBl]mhV[;Nio9"YroO1Bs6'FG!9sLJ!pf4?rp0sYmdKW6nF?)Ap%"-rN>dh:N/W[PM2@%D
+L5(D8K7ec,JUi9#IXQWlHgh"5E;4GOEqXMQEr:"Y>QS,5>5h\)=T;J$<rZ2";uopIrI4cr!.auu
+s*t*#rdk9(It<3'pOiHu!euA^hZ*S7rJ^T2s,?f6s,:W5G'A1WH[U<lJ:`E-L51VCN/`m[P*;/s
+R$jG6StD^OUo(&hWiW>+Yd1UC[^`l[]Y;.s_SjF6aND]McHjnde'ut#f\5'7h;7)JioB(\k2tml
+l0@X%mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`no_sFAJcC6~>
+JcC<$JcGBArVc`nr;6Njs7uZhs7ZNerq-<aoD\<-naQ#9md0<+lKRQrk2tabio/hQh;-i>g"4j+
+eC)akcHXPUaiMK@_ns4(]tCqe\$iZMYck11Wi;nnUnXQTSt):;Q^*euOcPN]Mi!4DKS+i+IXQQh
+G^"=QF)c/;DJX*'BP1pgA7AtT?X@#C>?Y03=&r@$;`mE7#!kUH84cHKpeUZ[qG7,dm8!g\:Jam\
+:]4&f:]=,h:&duf:]F/i:]4)k:JO[Q:]F2i:]*ue:]4&f:&[of:]=2e;$Bcl:Jah_ohP*Q!)E5`
+r([;h:f-p_!)`\mr`&\ls&B/#m-X6?mfDqJrpp*\!;-6_!quB_r:p<frqcNhrVZQkqYgRn;,C*d
+:]4,g;?'Pj;>sGn;>a>g;ts8g;uKVn;uTbm;Z]ou<r#bp<rZ5)<``='=BPK&s&f;&!a&T.r`];*
+pg!f(s'5M.!+,Y3"(5PG@/aR;@UiqZAc66?BE)WFC&McNBkhBuCi+%fD?=`qE;jhZEcZ>ErcS3`
+s*+iqG^4R\H@(!eIK"]qJ,b$!Jc:9$KE$W)L&Zo,L^SuoM2I4LN/WaVO-&'pnPpZkNJrgSMM[1G
+LPCP;KS+o/JUr?%IsufoI!aDpf@S[Rfa-<dgt^`Chr*Jc54q/84p=/U>[(B8r`T8's&]/"s&K(u
+!)r_dr_!>e91hhR8H;B]9`@cd9ES!_9M>@Ys%<>chZ*RRrD`VlqGdDlBQSEAG^=^bI=Hd!K8#&8
+M2I7OO-#NgQ'Rf*S"-(BTqeE\Vl?\tXfnt7ZaI6O\\#Mg^VRe*`Q-'BbKS8XdF-Lnf%8R.g>(N@
+i8EVTj5oFckiq?sm-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$J,~>
+JcC<$Jc>`Mo`"jgrqu]ks8)ckrV1j9p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5].Wi83;Fg=k32
+f$r0rdEg+^bK7iG`PfX0^V7@m\[])TZa$a;XfJJ#VPKu\TUq^DR@';*PEM#gN/NOKL4t83J:Dup
+H?j^XF`_YDDf0E-C2%?nARo:[@:*AI>[(B7=]bW($rp8*PI,UfLPq:`V6Kp=r5J`Url"iU"N89u
+`5DSk#f4<l^V7Co]=[sOrk&'=!kGhMppU10rj;1&s0_p8rNuU4q6U42[']\;rjMa4rjMj7osXe-
+q7$F6n[SJ,qRZ^=qRQ[;r4)d;qmcX9!P5i=\coXZ^V7Cork&-A!U]=SmfDqJrpp*\!;-6_!quB_
+r:p<frqcNhr;?Qms2=oSrl"iUqo/cZaN2EArl=oWr6#&_rlkAd!7(Acrm:Sjs3gkp!7h)"s4@8&
+r7V#%r7h5+s5!h7i8FRms5Nn8s5a1@"Qnn2l0834&F8]Mm-X3.n*oi:o()DEp%JCZ#l+8mqtg6h
+rVibqft$dcrji&i(QOK6N/NRMM26qAL4t;5K7\Z)J:E&tII7(*POt(>PP^UEPlk8q>$Cl-!a&N*
+rDrqus&B"s!N)dnW;igsWr8suXS]+(YHG%1Y-+l)XT>T.rNQ=)!1r-KrOVd7rOW!?r46<[GBnL]
+I=?]sJqJc3Ll%%KNfT<cPa.T&R[]k>TV8-VVPgDnXKA\1Za@0M\[oGe^VI_'`5Td<b0/&TcdC1j
+eCN7(g=tE=hVd>Oj5f=akNM0qlg4!*mdKW6nac8Bo`"O`p&Ojdq#C0iqY^6hr;QZerdk*#rrE(L~>
+JcC<$Jc>`Mo`"jgrqu]ks8)ckrV1j9p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5].Wi83;Fg=k32
+f$r0rdEg+^bK7iG`PfX0^V7@m\[])TZa$a;XfJJ#VPKu\TUq^DR@';*PEM#gN/NOKL4t83J:Dup
+H?j^XF`_YDDf0E-C2%?nARo:[@:*AI>[(B7=]bW($rp8*F+In>E-$8PJr9Gjqiq&CrKR;FrfRPL
+OH5E^O,f6]j,Wtqr/CN4s,R,=s,?Z2rJ^]7!0$o:r/CW7!0$i8oo9$5q2k3/n;mX4qiCoBOH5Iq
+OT(C>O9gu3OcYZcNfB%tNrP.@mI'uB!V#XYo)J:]o_nFap@n=Zq#C0hqYU0fr;QZoPlR-IQi*6I
+QiEHORJWBORK&`US,]#WSH,2TSc,/[TDP;WT`Ch]U]%"dV>mFkVuEUpWVNRmWrT7#XoGR"YQ(g,
+Z2V$7Za@*I[C3NQ\,Ei:])TDB]`l-b_8=+,rkncT!65#Ys2YDdb0.uQcHcF9rQuV5e'lgre^i='
+f\+s3g=tB<h;7&IiSieUj5f=`roX7Ds6'IIrosLLrTsRO#O_'LnF5u>o^RsqNW5%UNfB!VMi*@J
+Lkg_>KnP)2Jq8H&It)oqmJm*'pMp.PpMp1Qr,VsF>?Y5/=TV],=8c2"<W?%u;u;(EJGOiqJcgLQ
+JV*lR!.t*#re(B-K8"O-s8@uVN;SV4N;8HAG'A4XH[U?nJ:`E-L5:\EN/is]P*D5uR$sM8StMdP
+Uo(&hWiW>+Yd:^F\%0)_]t_A"_SjF6aND]NcHjndeC<($f\5*8h;7)JioB+]k3(smlKdg'mI'H3
+nF?)?oCW%Ts7QHerqQNhs8)ZjrVZZno_sFAJc>`MJ,~>
+JcC<$Jc>`Mo`"jgrqu]ks8)ckrV1j9p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5].Wi83;Fg=k32
+f$r0rdEg+^bK7iG`PfX0^V7@m\[])TZa$a;XfJJ#VPKu\TUq^DR@';*PEM#gN/NOKL4t83J:Dup
+H?j^XF`_YDDf0E-C2%?nARo:[@:*AI>[(B7=]bW($rp8*4@;G%6q9^;8l#1XpeL]^r_DlWr)!&^
+r_EGgr([8e:B"&h:B+,h;#a>k:A%B_:A[fe:B"&e:B"&f:B!ue:B"&h;#=,i;#a;l:f$^Yo1]3[
+p.tT]!`)WhoM>H]"A_in<E/fn"&r:fmf)YUnF?MKs766_rUg6cp\4U\s7uZjqtp<hrr)Rf!Du\j
+:]+&g;?'Pj;>jAm;>jDh;tj2f;uT\n;uTbn;[-3$<`W4#<;fhr<r?#!<rQ5"=8uD%<rlE+r`];*
+pK[]'!*oJ.!+,V2s'bn7$t3USA7T7_An>RdB4q3W!,;CH")2LbC]82MDZ=YTE;jkWEr^=\FoQUd
+GBeB2Gm/M@H[L6irdOlss*t*#rdt0&s+LE+s+Uu=LPU_AM2I4LN/WaVO4mS'<WA*rNfB!VMi*@J
+Lkg_>KnP)2Jq8H&It)oqrm_,%f@S[Sg&Kb2gYCT@hr*GOrB:3EpHJ:8pce^B"'f&6>5_S*=BAT&
+<rZ2"<<#no9)hQ`9`@Z]8H;E_9`@cd9`Iff9M>@Ys%<Ad7,\+@<;KPi<;og)G'A4XH[U?nJ:`E-
+L5:\EN/is]P*D5uR$sM8StMdPUo(&hWiW>+Yd:^F\%0)_]t_A"_SjF6aND]NcHjndeC<($f\5*8
+h;7)JioB+]k3(smlKdg'mI'H3nF?)?oCW%Ts7QHerqQNhs8)ZjrVZZno_sFAJc>`MJ,~>
+JcC<$Jc>`Mo`"gfrqu]ks8)ckrqQNf!;?EbIe<7&o'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AGgY1?4
+f$r3tdEg+_bK@oH`PfX0^V7@m\[])UZa-g=XfSP$Vkp2`Tq@mFR[BG,P`h,hNJraOLPCJ7JUi2t
+H[9p\F`_\EE,KN/CM@HpAS#@\@:3GK>[1K9=]ea+<E)mq$^@uDJ;9&GR\m@1a8EpY`Pf^l`=9c'
+_Sa7,_8*k$^:_(iqmud=qmug<s0qd3rjDa4n[8A)!4Dg5rjDU0s0_m6qR-@3qmHI4rjDF-r3uL3
+!4VL.r42=.!4i$;!4hs9r42^9!4i*=qRQU:!PIk"mfDqJrpg-^o^r.Us7ZKer:p<fs8)Q-rPAQP
+rl"cQrknfUqo/WVrlG&YqT/WXrlb>crlkGgpWrldr6bPmrR1brrmq,$rn./%qqCu&s4mV1!T2i6
+iVqj6j8\3=jT4N-rosIJ!:0XNs6U?bn*fc9nac8Bo_%qPp\=R_q?$TnrMT\K\b<Q4\Hod-O,f3Y
+N/NSmM%#2qL5(D8K7ec,J:N.9s8S8PPO=\8Plk8q>$Cl-!a&N*rDrqus&Anps&/hn!DofqWrT6u
+XoGR-Y-"h/XSf4#YPta.YHG$uirA_`rji!=!5&0?@C^W.H@1-iJ:W?+L51SAMi<[WOckroQ^F52
+SXuLJUSOfdWiN8)Yd(OA[^WfY]Y2(q_Sa@4aN2NIc-F\`daZguf@em4h;-uHiSrnYjlYail0@U$
+m-X60n*ol<o(2MQo`Fj]p\ssfq>^<hqu6NlrUg)?s+11Ms*t~>
+JcC<$Jc>`Mo`"gfrqu]ks8)ckrqQNf!;?EbIe<7&o'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AGgY1?4
+f$r3tdEg+_bK@oH`PfX0^V7@m\[])UZa-g=XfSP$Vkp2`Tq@mFR[BG,P`h,hNJraOLPCJ7JUi2t
+H[9p\F`_\EE,KN/CM@HpAS#@\@:3GK>[1K9=]ea+<E)mq$$:c1CN+?@I=dCTQ2?gFPPpaFPQ$^K
+OcYWaNfWak!0-H-qi1K3r/L]9s,@#;oo8p/rJ^l;NK*gos,I&;rJgH0!0?r;o8iC&!0R/?"-J\+
+O7eV7Oo(7?OoLREOoCI<OTCL1rpKmWnc&(\oCV\Sp&Facp\agdq>^9kP5:C@Pl-dHQM[$HR/30L
+R/NHLR/`TSRK/iVSGeuYSGA`RT)YG\T_Y;]U&_"aU]%"eV>mFkVuEUpWVNRmX8f:#XoGR'Y5ka)
+YQ(g,Z2M!-[/[N6[f3c7\Gs/?]+)Hf^;.V'_SX4.`5T^8rl>&[!6Y;as3:\ld*Va=!n,QHrmV&#
+f%8OQg&Kb;gYCW@hV[8LiSrkWjQ5Lck5OQDkQ:#6lMg,Km/HDPmf`.MnauJDNnTKmNs1Q'N/W[P
+reV&>LPCP;KS+o/JUi9#m/R*(r,D@Lrc7aQrGqjX"'f&6>5_S*=BAT&<rZ2"<;]\p;Z9Mn;#>hB
+Jd6jWJV&K+K7`rPs+CN/KS>,(irAq:s,Hu9rep`6qMem-H$XjdIXm!%KSG8<M2R=QO-,TiQ'[l,
+S"6.DTqeE]W2co#Y->1;['mHS]"G_k^r"".`lQ6DbK\>ZdF-Opf%8U/gYL]Ci8N\UjQ5OekiqBu
+m-O--n*fc9o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcC<$!<7Q~>
+JcC<$Jc>`Mo`"gfrqu]ks8)ckrqQNf!;?EbIe<7&o'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AGgY1?4
+f$r3tdEg+_bK@oH`PfX0^V7@m\[])UZa-g=XfSP$Vkp2`Tq@mFR[BG,P`h,hNJraOLPCJ7JUi2t
+H[9p\F`_\EE,KN/CM@HpAS#@\@:3GK>[1K9=]ea+<E)mq#sCRA6:4748kMkU:\[]^:]=,W:]!u]
+:]=,g:]=)h:&[oe:]F/i:]4,i:B4/^:B4/e:BF9e:]!oe:]*ue:&due:B45f;$Bcl:Jak`oM5!P
+!)E5`r([8g;"IK^:&n)f;#O2i;#X;m;ssYR!V#XYncJFTo`"O`pAambq#C0iqXmYb;>*fe;,I-c
+qb[8h!)iYjrDEVmrDNGipeq#grDNVnr`&_m!`W0#r`&qtrDihts&TA)=&rC)=Su8#=T;G(=BSf+
+>5hb#>lS+0>l@q.?N+:6?t!JOra>t>@q9+]Ac?<@BDuTCCB&#JC&i)LD>nDSDfB[pE<:0%FSp:]
+G5ldsH$FU[H?spbI!pElIXckHJ,k0"K)^H'K`6]*LAlu.M#W>3MZeuuNK0+T<:EofNs1Q'N/W[P
+reV&>LPCP;KS+o/JUi9#rm^tu&(]@af\+p1g=k<:hVR/Ji;>e=4n_)65PRGB56G.p>$Cl-!a&N*
+rDrqus&Anps&/hn!`2Qar_!&Z!)*8a#Ydue9MA/S9M>@Y"%u<]6fS.><;]\k<<#m)G^4U_I=?]t
+K7nu7Ll%%KNfT<cPa.T&R[]k>TV8-VVl6VrXfen5Za@0M\[oGe^VI_(`Q$!?b0/&Td*^:ke^i@*
+g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo`"Lbp@n=\q#C0iqY^6ir;HTdrdk*#rrE(L~>
+JcC<$Jc>`Mo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nojQmn*f]3m-Es$l0%3kjQ#7Yi8<DIgY1?4
+f@AC"dEp1`bfe,L`l5j4^q[Rq]",;Y['R$AXfSP%Vl$8bTq@pHS!fY0Q'.8jNf8mQLk^V9Jq/?!
+I!U'^G'%eGEGo`2CMINrAn>L^@UNPL?!LT;=]ea+<YJJ4;c8mfH@gp2P+&8Pa2c3?a2\+ts2G2\
+`l5p8rke`QrkScR^:h1l]DK2=]DK/@\[]-C[f3]7[.(L&[K*`7[/RK0ZiIN5[/.31[emK4[f3]-
+[f!W2\Gs&:\,a)5\GWo,\cB;5\GWo7\cB;?\GEc8\cTFR])92=]E#YD^&YqD_"PVC_Z.OR`;IOQ
+_uRdR`rF*Za90K&a2e%t!6P5_rlb>crQP>fps8rdrR(VmrmLu!e^i=NfDaG$g&'M$g]$".h>uNl
+r8IY7qr7\;rT+1EkNM0prot'\m-X0,mI'H4nF?)?oCV_Lrq?]nq>:'cr;HTnVuPG\ppg:5s1/c'
+O,o<\N/W[PM2@%DL5(D8rdt6'Ja<@6P4=b*Pl6mI>6%k*=oVS(=8c2"<W5tr;uT\o;>X/i:]7C#
+Y-5"1Xfeh.rN6+'rNQ=)!1r6No"+h4qmp!VH@($fIt3-'KSG8=MN!OUOHPfmQC+)0S=Z@HU84W`
+W2co#Y->1;['mHS]"G_k^r"".`lQ9Fbg"G[dF6Uqf@S^0gYL]Ci8N\UjQ>Ufl07L!m-O0/n*olH
+ncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$!<7Q~>
+JcC<$Jc>`Mo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nojQmn*f]3m-Es$l0%3kjQ#7Yi8<DIgY1?4
+f@AC"dEp1`bfe,L`l5j4^q[Rq]",;Y['R$AXfSP%Vl$8bTq@pHS!fY0Q'.8jNf8mQLk^V9Jq/?!
+I!U'^G'%eGEGo`2CMINrAn>L^@UNPL?!LT;=]ea+<Xi&.;c7aiAnu@-H$t:%rK[AH"I549PEYp/
+!gAk4rfRPLOH5E_O,f6]if<nqqi(H4rf.&>N/[IirJ^]7s,?u;qi(Q7s,?o9oSrp4qN1<0rf@,@
+plGK:rK%#Ar/gr@!K`B7OT1I@OT(CBOoUXDOR8/1P5UUBP5gaCP5:C?Pl6jIQM[$HR/30LR/EBL
+R/`TSRK/iVSGeuYSG8ZRT)YG[T_Y8_U8+O[U]%"dV>mFkVuEUpWVWXmWrT7#XoGR&Y5ka)YQ(g,
+Z2V$5Za@*I[C3OC\,NlF\[oDb]Y2%o^r""+rkeoX`Q#p<a8X-cb0.uPcHab_d/D>udaQ[peCE.$
+f@^)U*890%gtgfDhr*GOio9%[jlPXekND'ml07Kulg+N9$17*Hn*fc9o(2MDNnTI(OH5H_NJrgS
+MM[1GLPCP;K`6T)Jq<7fr,;OQol0tPp2U"Nrc80^>?b;0=oVS(=8c2"<W5tr;uT\o;>X/i:]5nF
+JH(6#K)gN#KDpN+KnP/(j8]":s,Hl6rf$o:r/Fp*H@($fIt3-'KSG8=MN!OUOHPfmQC+)0S=Z@H
+U84W`W2co#Y->1;['mHS]"G_k^r"".`lQ9Fbg"G[dF6Uqf@S^0gYL]Ci8N\UjQ>Ufl07L!m-O0/
+n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$!<7Q~>
+JcC<$Jc>`Mo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_npU&tn*f]3m-Es$l0%3kjQ#7Yi8<DIgY1?4
+f@AC"dEp1`bfe,L`l5j4^q[Rq]",;Y['R$AXfSP%Vl$8bTq@pHS!fY0Q'.8jNf8mQLk^V9Jq/?!
+I!U'^G'%eGEGo`2CMINrAn>L^@UNPL?!LT;=]ea+<`N*t;F!Q8#"(dL7nQBJrD32`qbR/cmSEaW
+oM>K^rD3;crD3Gg!)NPi!`)QdmSEjXs%iMes%iSgrD!;er_NPjqG@Dm:JXe`:]*rf:]!oX9`Rr^
+:]*uX:]=)h:]+&f:]=2j;>*ia:]F8k;>sDk:\%<^;>*fe;,I*br)!Ais&/_kpJUidpeq#grDNSm
+s&Ahn##nT'<`N.!rDihts&T;'='&H%=T)>$=T;J&=9)M'>5_\#>lJ"/>l7n+?iFL6?j:%K@Uiq[
+Ac66?BDuTCC&huICAr)LDZ=VnE,fl<EH?5DG'.tNF`qtRG^4OZH$Xd`I!pGBIfFotJH(3"K)^H)
+KS>-ZLAlu.M#W>3MZeuuNK0+V<:3`tOH5H_NJrgSMM[1GLPCP;K`6T+Jq;A!rm^tu!nPuTrn%S2
+g=tB<hV[5K5!Am/rB9g;pcnR<rBL<d!*]>(s&]8&rDrqur`&hpr_i_mqbR8grCI#^9E%Wb:&[ic
+9`Ric9`I`d9LRq@ku:l3H@($fIt3-'KSG8=MN!OUOHPfmQC+)0S=Z@HU84W`W2co#Y->1;['mHS
+]"G_k^r"".`lQ9Fbg"G[dF6Uqf@S^0gYL]Ci8N\UjQ>Ufl07L!m-O0/n*olHncA@Srq-?dp\4[^
+s7u]kr;6KkrVcBfJcC<$!<7Q~>
+JcC<$JcGcMp&=pgrqu]ks8)ckrV1g8p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ij5].Wi83;Fg=k32
+f$r0sdEg+^bK@oH`PfX0^V7@m\[])UZa-g<XfJJ#Vkp2_TUq^DR[BG,PEM#gNJraOLPCJ7JUi2t
+H[9p\F`_YDE,KN/CM@HpAS#@\@:3GK>[1K9=V4b;<`N*t;c8sjH\.'4Od`2QrQ"`Rs2FuU!Q2eR
+_$.Tf]tCthqmud=r43!@\@B$C[f*T6[-tF&[K*`7[/RK0[/[Q5[/791[f!Q4[f<c-[f!W7\,a#:
+\Gs&;\,a)4\GWo,\cB;4\G`u8\cB;?\GE`9])K8?])92=]E#YE^&u'_^VBZ]p;-^Es24lTr58QQ
+!6+fS"NSU)a2\,!qoJfZrlY8as31Gd!7(>bs3U\ks3gkp!7_#!rn%2&r7Uu$rS.>,rn[\5i;MX6
+iqqd9jSe0@k3)a.rp'LLrpBaS%.NfWo()DEp%J.Sq"amb"8r,srhoeM\bN]6\c0/SP*(ieO,f3Y
+N/NRMM26qAL4t;5KB`F5P5gaFP4k+1PQ?u4r07:e>5_V(=T;J$<rZ2"<;]\p;Z9Ph;#X5kXfqZ*
+!3H.$"g5&4Yck;1XoP!Rs8KY&])TD>\n$,6I=?ZrJqJc3LP^nINK90aPEhH$R@B_<T:r!TV5L8l
+X0&S0ZEpsI\@K5a^;%M$`5Ta;aihoRcd:(geCE1'g"P6;hV[8Mj5]7`k32'olKdg(mdKW6nac8B
+oCV_Kp@e7Zq#C0iqY^6ir;HTdrdk*#rrE(L~>
+JcC<$JcGcMp&=pgrqu]ks8)ckrV1g8p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ij5].Wi83;Fg=k32
+f$r0sdEg+^bK@oH`PfX0^V7@m\[])UZa-g<XfJJ#Vkp2_TUq^DR[BG,PEM#gNJraOLPCJ7JUi2t
+H[9p\F`_YDE,KN/CM@HpAS#@\@:3GK>[1K9=VFn=<`N*t;c7ajBPh^1G^Y4%Q'M<4#*kF:PE_;s
+rKR>GrfR;EOSt4ANfT7pNW>(,Nr+h5N;S\8NrP(=N:i2/N;\_9N;eh7N;eh:N;\b/NrP1:OSk.>
+OSOt:O8t@:O8t@?O8tF@OT1FDOH9$qs,m5@rfR5D!0R8Bm?%O7PEV5orfR5Ds-*>CqNLiAr078J
+r0R;Jqj7>Mr0dDKs-WnVS,SrVSc>5USc#)ZTDYAXU&UkeV"pebV#-tgVZ!FlVuWgmWr9!uXT#@%
+Y5YU)Y5YX(Yl1j2Za@*I[C6(DrODm=#.qO]]t_A!rkeZP!l`1!rl>&[s2kJfbg"GYrm:\mrmLhq
+s3r7Cf%/I*g"G*5gYCW@hV[5Ki8WbVjQ,Fak2tjikih9qlK\?6s6TaPs6g*[nac;DnrDF`'U"T?
+O,o<\N/W[PM2@%DL5(D8K7iFgqJZ=Ol>c`BrcA*[!F&b+=oVV(=8c2"<W?%r;u]bp;>F&f:BuH$
+JV&K+K7`rPs+CN/KS>,)jo>1;qi1T6rJgc9A9rTNIXcm"K8#&8M2I7OO-#NgQ'Rf*S"-(BTq\?Z
+Vl6VrXfnt7ZaI6O\\#Mg^VRe*`Q$!@bKS8Xd*^=le^rI,g>(N@hr*JRj5oFckiq?slg4$,n*fc9
+o()DDo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$!<7Q~>
+JcC<$JcGcMp&=pgrqu]ks8)ckrV1g8p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ij5].Wi83;Fg=k32
+f$r0sdEg+^bK@oH`PfX0^V7@m\[])UZa-g<XfJJ#Vkp2_TUq^DR[BG,PEM#gNJraOLPCJ7JUi2t
+H[9p\F`_YDE,KN/CM@HpAS#@\@:3GK>[1K9=VFn=<`N*t;c5kI6UO727nZKM:J^a\qbR,bmn`gW
+oM5H^rD38br_NPhs%iVjs%`VioM5H^qbI2er_NGer_NJfr_<Aer_NPjqG@8i:]=/j:]4#g:\miW
+9`Rr^:]*uX:]=)h:]+&f:]=2j;>*ib:BF?g;#X>Z:]OAd:]XEiqG7#crD<PmqGI#cqG[,dr)3\q
+;,U<k;uTbm;Z]ou<r#bp<rZ5)<``='=BPK&s&f;&!a&T.r`];*pK[`(s'5M.!+,Y3$".1M?smDO
+@U`mIAc?<@BDuQEC&VlIC&_oJD#S;NDZ=VZE,fl<EcZ@%FTcl1G'8*.GlN'hHN/BmIK"ZuJ:E*"
+Jc:9#K*$^[L&Hc+L]<21M>rJ:N/`jXOPWt)<?@<cOH5H_NJrgSMM[1GLPCP;KS+p)dF-Lne'upu
+f)F8.f\+s3gYCT@hr!Dk55IG9557A<55d\I5[.Fj=oVV(=8c2"<W?%r;u]bp;>F&f:B=$[rCdJk
+9MJ2S9he;Sr_*De9M@k9s63KnH@('hIt3-'KnbA>MN!OUOHPfmQC+)0S=Z@HU84W`W2co#YHY==
+[C3TU]=bkm_8=.0`lQ9Fbg+P]dF6Uqf@\d1gtgiEi8N_VjlY^hl07L!m-X60n*ol<o(2JFp%A%P
+p\jmeq>^<hqu6NlrUg)?s+11Ms*t~>
+JcC<$JcGcMo`"jgrVZTjs8)ckrqQNf!;?EbHh?q#o'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bK@oI`l5j4^q[Rq]",;YZa-g=XfSP%Vl$8aTq@pHS!fV.P`h/iNf8mQLk^S8JUi2t
+I!U'^G'%eFEGo`2CMINrAn>L^@UNPL?!LT;=]ea+<Y/81;c6J[\U&j`NKK^/ZcC,b`WX?%a2c3u
+`='W%_SX.*^V7Co]=[sOrk&-?s1&0?\+d?1[K!W'[JmT7[JmQ4[JI91[JmQ1[JmW4[JmW7[Iq!+
+\,Nl;\,No:\,Nl;\b3K0\ad62\b!?0\bir<\c0,4\c98=]DfJ?]`Pp_^\bh?_>V7N_u@UQ_u@UN
+`WX?'aN)="a8<sXao9H_bPo`bblH&`ci;AidJqYndf\+Mf%0iPrn.2&qqCu&s4db5hVR/Jr8IY7
+qr7\;rT+1EkNM0protKhm-X0,mI'H4nF?&>oCV_Lp@n=Vq>1!bqY^<kVZ5A\q7-F7rONK%OcYWb
+NfB!VMi*@JLkkta!/9Y:qN:iBqi^];nrs0=Pl?pN_S]S]>5h\)=T;J$<rZ2"<;]\o;Z0Jf;#O2h
+Y5GC.Y-5%5YHY76Y+FeUq7HF5!5&->@si]RJ:W<)KnbD?Mi<[WOHPfmQC+)0S=Z@HUSOcbWN*&%
+YHY==[C3TU]=bkm_8=.0a2lBGbg+P^dF6Urf@\g2gtgiFi8N_VjlY^hl07L"m-X60n*ol<o(2MG
+p%A%Pp\jjeq>U6gqu6NmrUg)?s+14Ms*t~>
+JcC<$JcGcMo`"jgrVZTjs8)ckrqQNf!;?EbHh?q#o'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bK@oI`l5j4^q[Rq]",;YZa-g=XfSP%Vl$8aTq@pHS!fV.P`h/iNf8mQLk^S8JUi2t
+I!U'^G'%eFEGo`2CMINrAn>L^@UNPL?!LT;=]ea+<Y&20;c6J9KP,.?Fa/=fN0XC,%@*0BPE_;s
+Q'@MuPa%C2Oo^],rJq#?O,s$qs,HK-qMkE3qi1W9s,@#;oo8p/rJ^f9rf-i7rf-r:rJgK1!0?u<
+nrNg4s,Zu;s,[,?!0R5ArfQc5s,m5@rfR5D!0R5AmudU4s-!GGrfR5Ds-*;BqigoArKRAKr0R;J
+qj7;LrL*MLs-WqWS"'DIrLNtYqORPUs.B1]q4RkaUSR^\rM9@fs/,amrhogrr2KdsWr/mtXT#@%
+Y5PO(Y5YX)YQ1s-Z3%A>[/RH5[f3c7\Gs/?]E>j]^VTodrkeiV`Q#ps`sBc.b0.uPcHac8d/VMn
+df._qe-"7Pf%BuTs4RY2gtgfChu;R6irA*=jo=KCk6U;7l07Kulg*j7m/QJQmf`.No(2MENnTI&
+P*(ieO,f3YN/NRMM26rdL&cqks8-^7DZ4SQE9hNAErL.[OTJ`j>5h\)=T;J$<rZ2"<;]\o;Z0Jf
+;#O/iK(josK`6Z*Gio&%NqA>1NamHbIXm!$K8#&9M2R=QO-#NgQ'Rf*S"-(BTqeE\Vl?\tXfnt7
+ZaI6O\\#Mg^VRe*`Q-'AbKS8XdF$Fmf%8R.g>(N@i8ESSj5oFckiq?sm-O--n*fc9o()DEo_%nN
+p@nO\!;ZWjr;6Kkrr)KgJcC<$s8RT~>
+JcC<$JcGcMo`"jgrVZTjs8)ckrqQNf!;?EbHh?q#o'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bK@oI`l5j4^q[Rq]",;YZa-g=XfSP%Vl$8aTq@pHS!fV.P`h/iNf8mQLk^S8JUi2t
+I!U'^G'%eFEGo`2CMINrAn>L^@UNPL?!LT;=]ea+<Xr,/;c6IY6pj=17Rp*G:&%K\:]!oU:]+&]
+:]F2h:\mib:BF9e:]4,i:B4/^:B4/e:B4/h:]*ue:]4&f:&[oe:B45e;$Bcl:f'q`rD!>gqG-TU
+!)E5`qbH]Xs%`Sir)!>fr_WVloMGK^!)WYlm8*d[p.tce;#3ub;#X;l;Yj8c;Yj>d;Z'Gq;Gg:h
+r_reqqGRGp<EB*!!*&nsr`9&#"'/K(<rQ5"=8uD&=8l>$>5_\#>lJ%/>l@t,?O1%J@:3JO@:EaG
+Ac66?BDuTEC'JBeBk_<tD#S;ODZ=VTE;jkWErU7ZFTlr4G^+FWrcnZnH[L3hIK"ZuJ:E*"Jc:9#
+K*$^[L&Qf/KnkG>re^Z5"H8>#Nf`-tm8XXZOcYWbNfB!VMi*@JLkkta!JSo"d/_Vodf\+Me^j`O
+$eX.cg=tE=hV[9T4oRY?4nh/85P[MB56Oqc>?Y50=oVV(=8c2"<W?%r;uT\n;><ud:]F)g:&I]b
+9`Ri`9E7NDs63KmI!pHoJV&N.L5:\EN/is\P*;/sR$jG6StD^OUo(&hWiW>+Yd1UC[^`l[]Y;.s
+_SjF6aN;WLcHjnce'ut#f\5'7h;7)JiT&t[k2tmll0@X%mI'H3nF?)?oCV\Jp%J+RrV-BgrqcQi
+rqucoo_sFAJcGcMJ,~>
+JcC<$JcGcMo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_np9iqn*f]3m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@AC"dEp4bbfe,L`l5j4^q[Rq]",;Y['R$AY-"b)Vl$8bTqJ!JS!fY0Q'7AmO,]*TLk^V9Jq/?!
+I!U*`GBJ"JEH#f4CMRWtB4YXa@UWVN?<g`>=]nj.<`N*t;[cQVQaV6nLlIReVmOP@`rO-X`<sQ$
+_SX.)^V7@n]DK2=]D]>?\H',4[f3Z7[-tF&[K*`6[/RK0Zid_C[C#e<s0hg4s0hp7osXe-s1&*<
+rj_s:s1&*>p:0t0o"+k3o=4b0qmld<rj_[4s18-?rOi'A!kuFaqnVpArPJQOs2=lRrknfUqo/f[
+aN2EA`r=$UaT'B^b5TTabl5lecM,Wbd/;;jdf._qeGe%ufDjM%g%sG$g]$"-h>uNlrSd_7r8[h<
+rT+1EkNM0prosRNm-O`=s6p!W$h<fYoCV_Lp\4IXq>U3mqu$ElVZ5A\qRHO8rjr-As,mkSOH5H_
+NJrgSMM[1GLPG!lnWNX1nWa'h!PuYP_uEp>=oVV(=8c2!<W?%r;uKVn;=RH_XSo:!Y5kg+XoP!U
+s73es\m0Z5J:W?+L5(M@Mi<[WOckroQ^F52SXuLJUSOcbWN*&%YHY==[C3TU]=bkm_8=.0a2lEH
+c-FY_daZdtf@\g3gtgiFi8WeXjlYail07O#m-X60n*ol<o(2MQp&F^cp\ssfq>^<hqu6NlrUg)?
+s+14Ms*t~>
+JcC<$JcGcMo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_np9iqn*f]3m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@AC"dEp4bbfe,L`l5j4^q[Rq]",;Y['R$AY-"b)Vl$8bTqJ!JS!fY0Q'7AmO,]*TLk^V9Jq/?!
+I!U*`GBJ"JEH#f4CMRWtB4YXa@UWVN?<g`>=]nj.<`N*t;\)c?G(aOGE-6GTKT).[Q'M<4s-3bP
+Q'ISuPQ$^GOc]O&!fi>&pQ#64muI7(r/CN4"HJJ$N/[IirJ^]7s,?u;qi(Q7rf$f8oo9$5qN19/
+s,[5AplPN:rK%#ArK.&AnW<d5r/go?s,mAErK-H0s-!DG!0[>Ds-!DGqNC`>qiq&E!1*MKr0[>I
+s-WbQqO%8M!LfMWSGf#YSGJfST)YG[T_Y;]UAq%bU].(dV#[CkVuEXpWVWXmWrT7#XoGR'Y5ka)
+YPta+Z2V$4Za@*I[C6%CrjW6E]">Vf]t_=urkeZP&]D]/a2l<BaN;TJbfnAYcd:&<dJqYpe,Iks
+ecFCTrn7>*s4d_4hV[5ii!89%jQ,Fak2u[+($OiFlKRQulg!j'lg4$,n*oi;o(2MENnTKmOq*V9
+O,o<\N/W[PM2@%DL?JU6DuOYQDuO_GE<(%WEW'qWOSt=A>5h\)=T;J$<rQ,!<;]\n;Z9P`:]Q+E
+KDpQ&K`HA]s723HNW5#DI=HcuK7nu6Ll%%KNfT<cPa.T&R[]k>TV8-VVPgDnXKA\1ZEpsI\@K5a
+^;%M$`5Td<b0/&TcdC1jeCN7(g=tE=hVd>Oj5f=akNM0plg4!*mdKW6nac8Bo`"O`p&Ojdq#C0i
+qY^6ir;HTdrdk*#s8W+L~>
+JcC<$JcGcMo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_npU&tn*f]3m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@AC"dEp4bbfe,L`l5j4^q[Rq]",;Y['R$AY-"b)Vl$8bTqJ!JS!fY0Q'7AmO,]*TLk^V9Jq/?!
+I!U*`GBJ"JEH#f4CMRWtB4YXa@UWVN?<g`>=]nj.<`N*t;c5_Dr^-fV7S$-Eq+gf_qbHQTrD<)]
+!)EJgrD!Ah:Adlh:/=[b;#a>k:@:pX:B+,e:B+,f:B!uf:Amrj:f1(frDEJh!)NPgs%iJdo1f6[
+pJ:W\nkT6\r_NGgrD3Dhs&&DbrD*Dir_`&Z!)`>aqG7#cp/1Q^qG[/er)3_r;,L4hr_rhrq,7>o
+<EAoqr`8u!"'/K*=Su8#=T;G(=BSf+>5hb#>lJ"/>l7n,?NOVD@K'[7@0'hJral%?rb)4DrFuFK
+C2.P_D?"MRD[p`+EH6)@FEMbLFEM_LGPuddH2i0pH[L3hI=?YCJ,k0"K)UB9KS>)5Knb;:LPUeD
+MMmFPNK0$\i)K,Es&T/_&Wr09O,f3YN/NRMM26qAcHjl:dJqYpdh1*[e^i='f@\d1g"Y?>hV^R]
+o0)h3q`b-I5<o!.rD`brs'#D)s&f;&rDrnts&AnprDNVlnPBE`9h\5T9hY=V!(?&Nku:o9It3*&
+KSG5;M2R=QO-,TiQ'[l,S"6.DTqeE\Vl?\tXfnt7ZaI6O\\#Mg^VRe*`Q-'BbK\>YdF-Oof%8R.
+gYCWAi8EVTjQ5Oekiq?tm-O--n*fc9o()DErq6<b!;HKfs7u]kr;6KkrVcBfJcC<$s8RT~>
+JcC<$JcGcMo`"gfrqu]ks8)ckrV1m:p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;FgY1<3
+f$r3tdEg+_bK@oH`PfX0^V7@m\[])UZa-g=XfSP$Vkp2`Tq@pGR[BG,P`h/iNJraOLPCJ7JUi2t
+H[9s]G'%eFE,TW1CMINrAn>L^@UNPL?!LT;=]ec*<Ynb8;c6JGRBh0lLlR^iVmXUdaN)?BaN+;!%
+*$9)_ns:,^qRLp]Y"'Ps1A3?s1/0=p9st.!4;4&s0_p8rj;[4qR$:1rj;R1rjMa4rjMj7oX=\,s
+1&*<rj`!;rj`!=p:0t0o""h3o!nY/qmld<rj_[4s18*>rk/0B!kuFaqnVpAr5/KOs2=lRrPS]Tr
+5J`Wrl>,\`r=$UaSs9]b5TTabl,cdcM,Zbd/;;kdf%VqeCFQLrmq/&r7Uu$r7h8,rn[\5i;MX5i
+r.m=jQ#>"jTO`/kiq@2l5]-VmHj6-mdKW6naZ2Ao_%nNp\4IYq>0p`r;HSks4Os^\G`r=]".gOs
+18f*P*1rhO,o<\N/W[PMM[2Os6u3GPP::CPE_=0_#M7M_uEp>=oVV(=8Z,!<W5tq;uKVl;=[Q_X
+T5O&Y6;)5Y-+;Zs7!Ys\m'Z7JqJ`2LP^nINK0'^P*D5uR$sM8StMdPUo(&hX0&P/Z*UgG\%0)_]
+t_A"_o9U8aND]NcHjndeCE.%g"P39h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCW%T!quB_rqQNhs
+8)Zjrqu`no_sFAJcGcMJ,~>
+JcC<$JcGcMo`"gfrqu]ks8)ckrV1m:p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;FgY1<3
+f$r3tdEg+_bK@oH`PfX0^V7@m\[])UZa-g=XfSP$Vkp2`Tq@pGR[BG,P`h/iNJraOLPCJ7JUi2t
+H[9s]G'%eFE,TW1CMINrAn>L^@UNPL?!LT;=]ec*<Y&20;c6J-G(OFFE-?MUKT,nqs-3>E!L/fI
+Oo^],qN(B2s,HH,qi1N4qi1W9s,@#;oo8p/rJ^f9rf-i7rf-r:r/LB0!0?u<nrEj6O,s'ts,[,?
+!0R8BrfQc5rfR,?rfI8FOcfU(mZIO4s-!GGrfR5Ds-*;Bs-*JGs-*;Drg!MLqj78KqNq5Lr0dGL
+rg<eUS,JlVSc5/USc#)ZTDP;XU&UhfUSR^\rM9@fs/,amrhogrr2KdsWr/mtXT#@$Y5YU)Y5YX)
+YQ1s-Z2h61[/[N6[f3c7\Gs/?]E>j]^VKfbrkf5b`l?'?a2lBEb08)ScHlL:rmCbos3q"t"P))S
+f@^)U)qs'%gtpoFhr*GOj5]4]jlPXekND'lkNM3ql2KuHlj)qGmdT`:o(2C3gPl`-P*1rhO,o<\
+N/W[PMM[2Os8-a5DZ4SQE:S#JErL(YEWD0tOT1FEOBPie=oVV(=8Z,!<W5tq;uKVl;=[Q]KDgK&
+K`HA^s6bpFNE^m_JqJ`2LP^nINK0'^P*D5uR$sM8StMdPUo(&hX0&P/Z*UgG\%0)_]t_A"_o9U8
+aND]NcHjndeCE.%g"P39h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrqu`n
+o_sFAJcGcMJ,~>
+JcC<$JcGcMo`"gfrqu]ks8)ckrV1m:p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;FgY1<3
+f$r3tdEg+_bK@oH`PfX0^V7@m\[])UZa-g=XfSP$Vkp2`Tq@pGR[BG,P`h/iNJraOLPCJ7JUi2t
+H[9s]G'%eFE,TW1CMINrAn>L^@UNPL?!LT;=]ec*<Xr,/;c6IU5smt+77]s@9`%T]:]!oU:]+&\
+:B4/h:\mi^:]=2j:B4/^:B4/e:B4/h:]*ue:]4&f:&[oe:]F8f;$Bcl:f("brD*AgqG-WV!)E5`
+qG-TW!)EJgrD<GgrD3JkoMGK^!)WYllqd[ZoMGB[r)!)apJUidpJUof"&_un;Z9Vo<;KMp<)luu
+<<-"s<W6&!<s)K)<`]3%rE'#$s&]2%r`]8)pK[`(s'5M.!+,Y3!FT@7?ijbG@f9m;B)ZHBBF&<e
+BkhBsC27VaD>nGQDuObVEW^B*Fa!b,s)o-$G^"CWH$O^_H[L6iIXZcsJ:W6%Jc:69K7\`/KnP,5
+KnbA<Ll$tHMi<USNf`0upJq,lrDiku/!H-ZOcYWbNfB!VMi*CKM9O5icd:%ddF-Ile'uq!e^i='
+f@\d2gtgiEi;Pq34nh/<5Q3qG55nLZ<;ont>5h\)=T;J#<rZ2!<;]\n;Z'D_;#X/g:&7N`7-Xa>
+<;ohr<*Oj&JqJ`2LP^nINK0'^P*D5uR$sM8StMdPUo(&hX0&P/Z*UgG\%0)_]t_A"_o9U8aND]N
+cHjndeCE.%g"P39h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCW%T!quB_rqQNhs8)Zjrqu`no_sFA
+JcGcMJ,~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrqQNf!;?EbJ+W@'o'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bKJ#K`l5j4^q[Rq]",;Y['R$AY,nY&Vl$8bTqJ!IS!fY0Q'7AlNf8mQLk^V9Jq/?!
+I!U'^GBJ"JEGo`3CMRWtB4YU`@UWVN?<g`>=]nj.<`N*t;[cQ$Kpf5oK8GVRS>N^ma:cV9a2Z-<
+`l5p7_SO('^:h1k]DK/>]DT5C\[]2Z\+[9-[/dZ+[0!eE[JmQ4[JI91[JmQ1[JmW4[JmW7[Igp*
+\,Wu<\,Wu;\,Wu;\b<Q0\am<3\am9/\bir<\c0,4\c98;]DoPA]`Pp_^\Yb?_>M1M_uI[R_u7OQ
+`W!jWa8X-_a2Z->a8<sVaTTc0bKS3/blH&_ci;AjdJqYndfe1Ne^i=NfDjM%g%sG$g]$"-h>uNl
+rSd_7qr7\;rT+1EkNM0prosRNm-O`=(%1P[nF?&>oCV_Lp@n=Vq"jj_qY^;gs4Op_\GWo8])K;N
+P`q8nOcYWbNfB!VMi-Tqn<*g9P5CFCP5UU?PQ6pF^]VEg_86,f!aAi3rE9/&s&],!s&K%tqc!Dj
+nPT9`s/c:(ric@+s/lC+J*[.)]DT8>\QXN8K8#&8M2I7OO-#NgQ'Rc(R[]k>Tq\?ZVl6VrXfen5
+Za@0M\[oGe^VI_(`Q$!?b0/&Td*^:ke^i@*g=tH>hr*JQj5f=akNM0qlg4!*mdKZ7nac8Bo`"Lb
+p@n=\q#C0iqY^6ir;HTdrdk*#s8W+L~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrqQNf!;?EbJ+W@'o'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bKJ#K`l5j4^q[Rq]",;Y['R$AY,nY&Vl$8bTqJ!IS!fY0Q'7AlNf8mQLk^V9Jq/?!
+I!U'^GBJ"JEGo`3CMRWtB4YU`@UWVN?<g`>=]nj.<`N*t;[cQ$CNkAED/j]EItN^VPm3P>Q'R]"
+PQ$^GOc]F#pl>?5m>h+(r/CN4s,R,=!0$T1rf$c7!0$o:r/CW7s,?l8p5]06qiL?/!g&J(plPN:
+q2kT<o8rp5r/gf<rK-]7s-!;Bs-!DG!0[>Ds-!DGqNClBrfR8FqNUrD!1*GIs-WYLrg<YPqO%;N
+!LfMVSGo)XSGJfTT)YGZT_bA^U&_"aU].(dV#[CkVuEXpWVWXmWrT7#XoGR'YQ(d*YPta+Z2V$1
+Za@+=[/dZ7\,NlC\[oDc]Y2%p_>_=N_Z7XS`rF*da2uHGbKS5Vcd2U;s3^kprmUns"4buRfDaJ'
+g(E)ph;7#Ghr*GOj5]4]jlPXerTF4ErTX@I$gd3Gm-X6/nF?&>o'qapN=D,9P*1rhO,o<\N/W[P
+jT#*qqelCOs)8!YE:S#IEWC+WO8Y.DOcYZ/>$Cl-s&f;&r)Whtr`&bnr)3&^r_i]Ire16(!+G3n
+m>h.)>(D3WKnbA>MN!OUOHPfmQC!u-S"6.EU84W`W2co#Y->1;['mHS]"G_k^r"".`lQ6DbK\>Z
+dF-Opf%8U/gYL]Ci8N\UjQ5OekiqBum-O--n*oi:o()DErq-?dp\4[^s7u]kr;6KkrVcBfJcC<$
+s8RT~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrqQNf!;?EbJ+W@'o'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bKJ#K`l5j4^q[Rq]",;Y['R$AY,nY&Vl$8bTqJ!IS!fY0Q'7AlNf8mQLk^V9Jq/?!
+I!U'^GBJ"JEGo`3CMRWtB4YU`@UWVN?<g`>=]nj.<`N*t;[ZK#4@)>$5se(58PK+YpeUc^mn`mY
+mSEdV!DcJc:]=2j:B4/^:B4/e:B4/h:]*ue:]4&f:&[oe:]F8f;#sKhr_NSjr_EGgqG-WV!)E5`
+qG.&d!)E2_!)EJgrD<Jhr(mAjoMGK^!)WYllqd[ZoM>N_qbR)cp/1T_qG[,dr)3Snr_W_p;cEZp
+qG[Dn"BAK&<E/lrr`08*<``@'='/T&=8uD&<ruK,=oMV'>PVP&?2n1.?2\.0?j0nF@:<VTral%?
+rb)4D"_qacC2.J^C]82NDZ4SRE?K:CFEM_LFEM_LG'J4TG^+LZH@($eI=6QnIt3'#J:W:LJeNci
+KS>)5KnbA=Ll%"IMi<XTNf2jqpf6re'pOoFP*(ieO,f3YN/NS8bKS5Vcd:&<d0%hGe("BIs475%
+#2%YbgtgiErBBj:!Br[?55d_F5QO)5q,@5k!aAi3rE9/&s&],!s&K%tqc!DjnPT9`!_c<_rCd>g
+9MA/>li6?OrDQmMJqJc3LP^nINK90aPEhH#R$sM8StVmSV5L8lX0&P/Z*UgG\%0)_]t_A"_o9X:
+aND]NcHsteeCE.%g"P3:h;@/LioB+]k3(smlKdg'mI'H4nF?)?oCW%T!quB_rqQNhs8)Zjrqu`n
+o_sFAJcGcMJ,~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrqQNf!;?EbJ+W@(o()>?n*f]3m-Es$l0.9ljl>C[i8<DIgtLK7
+f@JI#dF$:cbfe,La2Q!6_8!^s]=GG[[Bm0CY-"b)W2HJfU7e*KS!o_2Q'@GnO,]*UM2-h=K7SQ%
+I=$9bGBS(LEH#f5Chmd!B4b^c@U`_P?<pf?>$4s/<`W4!;[u]&:ktLEI>!K>Q(4_ZaSs9_aN)@"
+`X9Z%_SO('^:h1l]DK/>]D];D\[]2[\+[8q[03qG[C!=?[J@30[JmQ1[K!]4[JmW7[Iq!+\,No;
+\,Wu;\,Wu;\b<Q0\am<3\ad3/\bir<\c0,4\c98;]DoPA]`Pp_^\Yb?_>M1M_uI[Q_u@UQ`W!j\
+a2l?B`lA"ur5eiY!m8^0rlkAd!7(;as3U_lrmLeps3q&!rmq,$s4I8&qqCu&s4mV1!T2i6iVhd5
+irJ0=jTO`/kiq@1l2p>>m/HDPmg/FQnac;Co_%qWpAk!fq#gKjr;EMm!;Y?Z!4_s;r4;j=$^?j<
+P*(ieO,f3ZN8ss+P51=AP5UUCPl8Dt_>h=K_$.\\>[(E9rE9/&r`B&!r`/qsq,?c\qbmKtrN?@.
+YHG$um/QUfr4;m<<.]aVL5:\DN/`m[P*;/sR$jG6StD^NUnsufWiN8)Yd(OA[^WfY]Y2(q_Sa@4
+aN;WKc-F\`daZh!f@em4h;-uHiSrnYk2tjjl0@U$m-a?2nF?MK!V>s_o`Fj]p\ssfq>^<hqu6Nl
+rUg)?s+14Ms*t~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrqQNf!;?EbJ+W@(o()>?n*f]3m-Es$l0.9ljl>C[i8<DIgtLK7
+f@JI#dF$:cbfe,La2Q!6_8!^s]=GG[[Bm0CY-"b)W2HJfU7e*KS!o_2Q'@GnO,]*UM2-h=K7SQ%
+I=$9bGBS(LEH#f5Chmd!B4b^c@U`_P?<pf?>$4s/<`W4!;[lW%:i(B.C2S*8H[g^-r0@;J"dPC>
+Q'@L3Oo^],qN(H4rJg6*qi1N4qi1W9nr<X-rJgi9s,Ho7rf-r:r/LE1!0?u<mZ7.)s,[#<rK6]5
+rK7#>s,d;ErfR,?pQ>H<r/q#Bs-!GGrfR5Drfd5Bs-*GFrfd8ErK[DKq3M)KqNq2KrL*MLs-WqW
+S"'AHrgj"Xqjm\Wrh'(\qP!q`!McIdU]%"dV#[CjVuEUpWViasWN,ls!3H1%riZ7(!3Z=)rilC-
+s0Ma4s0_m8s0qs:#e@OY]Y(tn^qp#erkf/``l?'?a2lBFb08)Srm1VkrmCbos3pts"4buSfDaG*
+g=tE<rn[Y4ro!h9roF(?!9X7C!U/_Gl2BlSlg4!*mdBT7mG#;ENnTI#P`q8nOcYWbNfB$Wj8\so
+qel@Ns)@II!HO:uO8G%=>lS".>5_V(=T2D#<rQ+u<;BJ^;YsDmKDpQ&K`HAas6PdFNDtL^KnbD?
+MN!OUOHPfmQC+)0S=Z@HU84W`W2co#Y->1;['mHS]"G_k^r"".`lQ9FbK\>ZdF-Opf@S^0gYL]C
+i8N\UjQ>UfkiqBum-O0/n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$s8RT~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrqQNf!;?EbJ+W@(o()>?n*f]3m-Es$l0.9ljl>C[i8<DIgtLK7
+f@JI#dF$:cbfe,La2Q!6_8!^s]=GG[[Bm0CY-"b)W2HJfU7e*KS!o_2Q'@GnO,]*UM2-h=K7SQ%
+I=$9bGBS(LEH#f5Chmd!B4b^c@U`_P?<pf?>$4s/<`W4!;[u]&:ch!36UF:584cKM:A7Q_:@:pW
+;#a;k:@V-Y:B+)i:A@Wa;"@B^:A[ie:B+,e:B"&f:B!uf:Amug;#4#i:f%'e!)NShr_NAc!DQ8\
+9`Rr^:\mid:B4/_:B4/g:]4,i:]!rg;=m]`:B45j;=RK_;>sAl;=m]b:A[ib;"dc];Yj>d;Z'Gn
+;Z9Mn;Z9Vp<;BGo<)lup<W6&!<s)K)<`]3%r)Wr%=',B'!a8`1rEK#$s'>Y0rETD0rEfh=?sd;L
+@:<VUral%?rb)7E$#+-gC2.HtCMRbcD?"MRD\@#/EH6)@F`hkMFEM_LG'J4TGlE!gHiJKnI0Y4N
+It3'#J:[]O!J?"'KDpQ(L&Zo-L^8ipMi3ORLjEjr<;9Jb<[j8sP*1rhO,o<\NJts#b0/#RcHjka
+dEp:he'lgre^i:%f@\d2gtgfCq`aX8o03.<!'p-Ss'5S.!*]>(s&f8%rDrntr`&\ln5B-^!)<Dc
+!)<Gd!(?2Rlr<s_<.]aVL5:\DN/`m[P*;/sR$jG6StD^NUnsufWiN8)Yd(OA[^WfY]Y2(q_Sa@4
+aN;WKc-F\`daZh!f@em4h;-uHiSrnYk2tjjl0@U$m-a?2nF?MK!V>s_o`Fj]p\ssfq>^<hqu6Nl
+rUg)?s+14Ms*t~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrV1m:p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Xi83;FgY1?4
+f%&9udEp1`bK@oH`Poa3^q[Rq]",;YZa-g=XfSP%Vl$8aTq@pHS!fY0P`h/iNf8mQLk^V9Jq/?!
+f;Nt=G'%hHEGo`3CMIQsAn>L_@UWVN?!LW<=]nl,<Y8>2;c?Rk:ktO?It`cAQ(+SUrlP2]r5K&]
+_SX.)^V7@n]Cri9\c0)=\+[9-[/dZ'[K!W5[JI91[JdK1[JmW4[JmW7[Igp*\,Wu;\,Wu;\,Wu<
+\b3K/\am<3\b3H4\,No:\bir<\c0,4\c98;]DoPA]`Pp_^\YbG_#V:H_>V7N_uI[Q_u@UP`W*p[
+a2l?Brl4uYqoJ`Xrlb>crltJgp<WccrmC_nrR1esec+/!fDjM%g%sG$g]-%4h;7#Ghr+IlrSm_7
+!9F+?"Qnn2l0834!pf4>rp:6an*oi:nac;Dp%A%Qp\=O_q#gKkr;NYp!qkF!e[bUhrO`)p#aCO9
+P*(ieO,i3!mZR@/rf[8E!0mArpqZr9r`oJ-s'#A(s&f;&r)WesrD_rYs&Attric@+s/l@+mJlgj
+ppsJ9K7nr5Ll%%KNfT9bPEhH$R@B_<T:r!TV5L8lX0&P/Z*UjH\@K5a^;%J#_o9X:aihoRcHstf
+eCE1'g"P3:hV[8Mj5]4_k3)!nlKdg(mdKW6nc&([oCW%T!quB_rqQNhs8)Zjrqu`no_sFAJcGcM
+J,~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrV1m:p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Xi83;FgY1?4
+f%&9udEp1`bK@oH`Poa3^q[Rq]",;YZa-g=XfSP%Vl$8aTq@pHS!fY0P`h/iNf8mQLk^V9Jq/?!
+S:l03G'%hHEGo`3CMIQsAn>L_@UWVN?!LW<=]nl,<Y8>2;c?Rk:i1H.Bl.p6H%(F*rg!ML!1!PL
+!L8oKOo^],qN(H4r/L-)qi1Q5qi1T8o8W^-rJ^f9rf-i7rf-r:qi1<0!0?u<mZ7.)rf?u=r/pW5
+r/po=!g/Y/rfR,?plYK;rK7,Cs-!GGrfR5Drfd5Bs-*GFrKI/DrK[DKq3M)Kqj78KrgEVMrg<eU
+S,JlVSc,)TSc55[TDP;WT`Us`V"g_aV#-tgVZ!FlW;ijqWWK0"Wr/mtXT#@%Y5YX)Y5YX)YQ1s-
+Z2h61[/[N6[f3c7\-KRV]Y(ql^qfocs2,Ac`Q#p<aN)BDb0/#Rc-O`8d/MGmdf7ereGn&#f%8OQ
+g&Kh,h#H72huDU;iSrkXjSe0Hk3(mikNM*ml0803$L@'GmI'E+e%)NRnrDIas-3kSPEM)kOH5H_
+iW&dnrGDURrbh[Q!-%IJ!0R8BqN(T:!+#S/s',M,rE9/&s&],!r`/nrk>VC[r`'#PKS98WmJlg=
+r/LZ8<K2WaKnbD?Mi<[WOHPfmQC+)0S=Z@HU84W`W2co#Y->1;[C3TU]=bkm^r"".`lQ9Fbg+M\
+dF6Uqf@\d1gYL`Di8N_VjQ>Ufl07L!m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6KkrVcBfJcC<$
+s8RT~>
+JcC<$JcG`Lo`"gfrqu]ks8)ckrV1m:p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Xi83;FgY1?4
+f%&9udEp1`bK@oH`Poa3^q[Rq]",;YZa-g=XfSP%Vl$8aTq@pHS!fY0P`h/iNf8mQLk^V9Jq/?!
+:el:[G'%hHEGo`3CMIQsAn>L_@UWVN?!LW<=]nl,<Y8>2;c?Rk:cq'26UO:47S6?LpJ:c`m8*^X
+!`)QdnPB*YohYQ`nkT6\qbI2er_NGer_NGer_<DfrD*DiqGI8h"A_ij:J^sbs%iJds%NJeoh>E]
+p.tN[!`)QdohPQ_rD3Ag!)NGf"Aqul;,R*brD*Dir_`/]r_W\m;=mZd:JO[_:]!u_;>3ub;ts8g
+;u]bq;#jMn;uTbm;u]hq<<-"r<W?,"<sD],<`W:(=Su5#=T2A'=BSc*>5_\(>QA"+>lS+0>l@q.
+?N+=2?j0nF?t!JRrFPt?rb)4Drb;CI!,;FJrb_XPs)/0^EH-#?FEM_LrH8-`s*+Kfs*4lrH[C-f
+I=6TprdY'$J:[WMre(3's+UK-s+p]4s,.#7F_+fXjAbkRo2bmV'9n]DP*(ieO,h9%aNDZKbg"GY
+ci2;kdJqVqe("BI#hIV\g=tE=h;8&no0)Y.!C'QV;u]_q?2e+/>Q7n*=oVV(=8Z+u<W,n[;u]hr
+<W5\l:&dle:@8)R<;]\n<)lkLKS>/:M2R=QO-#NgQ'Rf*S"-(BTq\?ZVl6VrXfen5ZaI6O\\#Mg
+^VI_(`Q$!@bKS8Wd*^=le^rI,g=tH?hr*JRj5f@bkNV6rlg4$,n*fc9rpg*]o`"Lbp@n=\q#C0i
+qY^6ir;HTdrdk*#s8W+L~>
+JcC<$JcG]Ko`"gfrqu]ks8)ckrqQNf!;?Eb>kIXYo'u8>n*fZ1m-Es$ki_*jjQ#7Yi8<AHgY1?5
+f@AC"dEp1abfe,L`l5j4^q[Rq]",;Y['R$AY-"b)W2HGdTqJ!JS!o_1Q'7AmO,]*UM2-h=K7SQ%
+f\$/$0Q_AUE,KQ0CM@HpAn>I]@:3GK?!LT;=]ea+<`N's;Gg7eLn'laKo1qVS#*F5b/jP%$c^0'
+_SX.)^:q:n]D&o:\HKFQ\@8s@[e7$.[e-s-[/RK/[/[Q4[/RH6[^H+Cr3cO4s0_L-r3u^9rjVp;
+rjVp;s1.g4qRQ1.!4hg5s0r!;rjhp;!4i*=p::47qRcd?r4N0G^VBW\s1n]Nq8*!G!5nfSrPSWQ
+r5J]U"38L(a8X*Xa8<sWaTTc0bKS3/blH&_ci;AjdJqYndfe1Ne^i=NfDjM%g%sG$g]$"-h>uNl
+rSd_7qr7\;rT+1EkNM0prTXIMmHji>s6g6_naZ2@oCV_Lrq?EfrV6Nlr;N\q"Rb'jaiDuCr4;g<
+s-3eQPEM)kOH8?"rK@2Cnrig4r0%&or4r6Hs2+fPs'>V/s',M,rE9,%s&](ur`/kqn5K9br`/nt
+s&TE.Yct=6Y+4t\o=On2rjc<fL51VBMi<[WOckroQ^F52SXuLJUSOcbWN*&%YHY==[C3TU]=bkm
+_8=.0`lQ9Fbg+P]dF6Uqf@\d1gtgiEi8N_VjlY^hl07L!m-X60n*ol<o(2JFp%A%Pp\jmeq>^<h
+qu6NlrUg)?s+14Ms*t~>
+JcC<$JcG]Ko`"gfrqu]ks8)ckrqQNf!;?Eb>kIXYo'u8>n*fZ1m-Es$ki_*jjQ#7Yi8<AHgY1?5
+f@AC"dEp1abfe,L`l5j4^q[Rq]",;Y['R$AY-"b)W2HGdTqJ!JS!o_1Q'7AmO,]*UM2-h=K7SQ%
+S=KP2/p)/SE,KQ0CM@HpAn>I]@:3GK?!LT;=]ea+<`N's;Gg7eD0^D@DKBrGIY<WEqN_>NPEM,m
+Oc]F#q2YE5mZ..'rJ^W5rf6T0rf$c7!0$o:r/CW7s,?l8oo9$5qN1-+plPK9r/gi=ooT'5r/go@
+rfR,?plYK;rK7,Cs-!GGrfR2Cs-*>Cs-*DErfd8ErK[DKnX'3As-`_Nrg<eUS,JlVSc##SSc55[
+TDP;XU&Uk]U].(dV#[CjVuN^qWViasWN,ls!3H1%riZ7(!3Z=)ril@,!jf8@rj;a7rjVm:#e@RZ
+]Y(tn^qp#erkeiV`Q#sta9B].b08,Trm1Sjs3^hos3q"t"P))Sf@^)Us4[t;h;7#Ghr*JPio9%[
+rT4%@roa=Fs69LI$L@'GmGlL"W1]WKnrDIas-3eQPEM)kOH8?"rGVLLs)7pTrbqgUoPskl!g/S+
+qN(T:s'>V/s',M,rE9,%s&](ur`/kqn5K9br`/nts&]5RrIk5rn,N!>pl/R4L51VBMi<[WOckro
+Q^F52SXuLJUSOcbWN*&%YHY==[C3TU]=bkm_8=.0`lQ9Fbg+P]dF6Uqf@\d1gtgiEi8N_VjlY^h
+l07L!m-X60n*ol<o(2JFp%A%Pp\jmeq>^<hqu6NlrUg)?s+14Ms*t~>
+JcC<$JcG]Ko`"gfrqu]ks8)ckrqQNf!;?Eb>kIXYo'u8>n*fZ1m-Es$ki_*jjQ#7Yi8<AHgY1?5
+f@AC"dEp1abfe,L`l5j4^q[Rq]",;Y['R$AY-"b)W2HGdTqJ!JS!o_1Q'7AmO,]*UM2-h=K7SQ%
+;,R9e/p)/SE,KQ0CM@HpAn>I]@:3GK?!LT;=]ea+<`N's;Gg7e4$uA'6q'R88k_uVq+q#cm8*^X
+s%iYink]3Zs%`VkpJ:cbnkT6\qbI2er_NGer_NJfr_<Aes%iVjqG@8i:]=/j:]4&g:\mff9h\7R
+9`Rr^:\RWW:B4/g:\7K^;><ud:B45i;=RK\;=mZb:]=,f:\mo_;>3ub;ZTcnq,7,h!)ien!)iep
+s&Aem!*&\mr`9&#"]e]*<``E#<ruK*=8l>%=TDY(>PDD&?2n1-?2\.1@/jR=?t!JR@qB1^rFZ%A
+rb2:FrbDFJrb_XPs)7mVs)S0^qfVp^rceBes*=Tj#CLrJIXcitJGk'!Jd6jYJqJZ-KS9>Ys+Ul:
+M2I1@Ear3M;,-.OpJpcbs-47^PEM)kOH7B#a2l?EbKJ,ScHac7ck"OPdaQ^qf%/I*g"G*7h;8)o
+n3-D-r_ierohtoi?![G7s',M,rE9,%s&](ur`/kqn5K9br`/nts&]4os%WMe!(?;Uo2PK`?%drf
+M2@.LNfT<cPa.T&R[]k>TV8-VVPgDnXKA\1ZEpsI\@K5a^;%M$`5Ta;aihoRcd:(geCE1'g"P6;
+hV[8Mj5]7`k32'olKdg(mdKW6nac8BoCV_Kp@e7Zq#C0iqY^6ir;HTdrdk*#s8W+L~>
+JcC<$JcG]Ko`"gfrqu]ks8)ckrV0gqp@e1Po^h\Fo'u5<n*]T0m-<j"kiV$hj5].Wi83;Fg=k32
+f$r0sdEg+^bK@oH`PfX0^V7@m\[])UZa-g=XfSP%Vkp2`Tq@pHS!]P-P`h/iNf8mQLk^V9Jq/@'
+f_DBrDJa0(BkV*iA7K(W?XI)D>Zt95=B8I&<)Z^n;,C)GSTfX<M2mdhVQn7aaSs3f`l5j5_SO"$
+^:h1kr42m?rjr*>"Lu"P\$u(>r3ZO5qm?F4oX+\+rjDU0rjD^3rj;d8[JmW6[/m_DrjMj7oX=\,
+s1&*<rj`!;rj`!=osjn0n[\_2p:1.3rj_s<rji3B]"5HO\G!K5])'&=]_oGC^AbnE_#M4N_"khD
+_?.Wn`;RUQ`;IUS`W4'Ya8j9[`r=$VaSj3_b0/#QrQP>fp!3WbrR(VmrmUns!7h)"s4@8&rRq&$
+rS.A-"l8%lhr!AkiV_^4irJ0=jTO`/kiq@2l2p;<m/HA_mdKZ7naZ2Ao^qhMp\4IXrV6NlrVikt
+#3jjdaiMECf=CjkqRZrtQ'IStP*4]%r0%&Ao9'-<Pl$[EP52ll_#2%K_?4.O?![D6s',M,rE9,%
+s&](ur)N2br`/hrs&T2&r`KE.Yct:4Yjh\`]DT8>\QjlEM2I7NNfT<cPa.T&R[]k>TV8-VVPgDn
+XKA\1ZEpsI\@K5a^;%M$`5Td<aihoRcdC.heCN7(g=k?<hV[8Mj5]7`k32'olKmm)mdKW6nac8B
+o^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#s8W+L~>
+JcC<$JcG]Ko`"gfrqu]ks8)ckrV0gqp@e1Po^h\Fo'u5<n*]T0m-<j"kiV$hj5].Wi83;Fg=k32
+f$r0sdEg+^bK@oH`PfX0^V7@m\[])UZa-g=XfSP%Vkp2`Tq@pHS!]P-P`h/iNf8mQLk^V9Jq/?@
+SG7^cDJa0(BkV*iA7K(W?XI)D>Zt95=B8I&<)Z^n;,C)+H"C`-EccSUKT#\m#F(F9P*1rhOSb+=
+NW>.<Nr=t*Nr"b7N;AP5NrP(=NqSJ3N;SY8N;eh9Mueosrf-r:r/LE1s,[#<mZ7.)rf@#>qiUQ5
+qiUf<!g/Y/rfR,?plYK;rK7,Cs-!GGrK7,Cs-*>Crfd>Erfd8ErK[DKpm1uHqj75Js-`_Ns-WnV
+S,AfVSbnrSSc55[TDP;WT`Us`V"peaV#-tgVZ!FlW;ijqWWK0"Wr/mtXT#@$Y5b^*Y5YX)YQ1s-
+Z2h61[/[N6[f3c7\-T[X]=bhl^VRbc_Z.LV`5T^9a8X0[aofi2c-H=7s3Ubm!RfBpe,Ro%e^i='
+f\+sWgAp(/hZ)I6i8O[ps5X@FjQ5Lck5FKCkl9oGlMp2Vh8lq#TUM73POaagN<Y]6Q'@JqP2?6:
+Du";IDuXeNEW;0tOSY%<O98ir?![D6s',M,rE9,%s&](ur)N2br`/hrs&T2&r`K5Sre1B+L%,-5
+NqnZ>L51VCN/WdXOckroQ^F52SXuLJUSOcbWN*&%YHY==[C3TU]=bkm_8=.0a2lBGbg+P^dF6Ur
+f@\g2gtgiEi8N_VjlY^hl07L"m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+14Ms*t~>
+JcC<$JcG]Ko`"gfrqu]ks8)ckrV0jrp@e1Po^h\Fo'u5<n*]T0m-<j"kiV$hj5].Wi83;Fg=k32
+f$r0sdEg+^bK@oH`PfX0^V7@m\[])UZa-g=XfSP%Vkp2`Tq@pHS!]P-P`h/iNf8mQLk^V9Jq/>J
+;,-j].;j!<C2%?nARo:[@:*AI>[1H8=]e^*<E)mq;Gg7e4@2A&779U88k`"V:]F2V:]F8k:]F2[
+:]4&g:B45d:]4,i:B45b:]F2e:B4/h:]=)i:JUmbrD*>dr_EJhr_WGg!DlSk:]O;i:B+,d:'+-`
+9_M3\:A.KX:A%B_:Amu\;#O8d;#O/i;#O8];#F2_:]O;i:Amub;#!o_;Yj;m;Gm6fr)3Snr_WYn
+r_reqqG[DnpJq5os&TD*=&r@'=BPK&!*K5%!a&T-r`]8)rEK>,r*98-s'5M.!+,V2$Xd=K?smDP
+@q9.]Ac66@BDuTDC&VlHCB/2MD?"MRDZFbUEW:+[FTur1FEM_LG5c^cGRSkDH[C-fI=6QoIt3(J
+JcC<%Jc:9$KE$W)L&Qf6Ll$Is@TlZ,9h7\7<;0D_<[j?"Q'@JqP/G5W`lH0Bb0.uPc-=P[d*U+c
+dF-IleCE.$f@\d0gYCWAr''U5!BraD56"UP;ZgB5?![D6s',M,rE9,%s&](ur)N2br`/hrs&T2&
+r`KCu9he;S:@S;S<;BHtL51VCN/WdXOckroQ^F52SXuLJUSOcbWN*&%YHY==[C3TU]=bkm_8=.0
+a2lBGbg+P^dF6Urf@\g2gtgiEi8N_VjlY^hl07L"m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6Nl
+rUg)?s+14Ms*t~>
+JcC<$JcGZJo`"jgrVZTjs8)ckrqHQhp@eLY=nM=Vo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bKJ#K`l5j4^q[Rq]",;Y['R$AY-"_'Vl$8bTqJ!JS!fY0Q'7AmO,]*UM2$_:Jq/CN
+fDqiCW&JF(B4YXa@UWYO?<pf?>$4s/<`W0u;c6Ih:euq?GCY7%Nfom0Z,t).a2c3<`5BI.^V7Fq
+]Y"-Rs1A9ArOMs<s0q^1rO)[6qm?F4n[82"s0_d3rO)X5r3cO4rjDF-r3u[8s0r$<rjVp;rjh^3
+qml7.!4hj6rjVm:rOE0E\[f;_\[]0B\c98;]DoPD^&GYE^&GeD_#M7N_"tnD_?%QmrPSTPrPefV
+!6>)[!6>)YrQ"iWrlG2`bPo`bblH&^ci;AkdJhSmdfItKrmq)#s4I;'qV(o&rnRM0!oMqoro*h8
+qr7\;rT+1EkNM-orTXIMmHji>s6p!W$h<fYoCV_Kp@n=Vq#:'jqY^;nrs7f?bK%ZC`k8Y2\bs&8
+]*4OeQ'ISth>dA8r/pZ8s-*JIrKHujs1nNJ!5e_Bs'>\2rETA,s'#>'r`K2%q,Zraqc<\ts&f8'
+s&oV2>[4M9Y-7Bq!5.s9r4;j;>DJ&mN/`m[OckroQ^F52SXuLJUSOcbWN*&%YHY==[C3TU]=bkm
+_8=.0a2lEHbg+P^dF6Urf@\g2gtgiFi8WeWjlY^hl07L"m-X60n*ol<o(2MGp%A%Pp\jmeq>^<h
+qu6NlrUg)?s+14Ms*t~>
+JcC<$JcGZJo`"jgrVZTjs8)ckrqHQhp@eLY=nM=Vo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bKJ#K`l5j4^q[Rq]",;Y['R$AY-"_'Vl$8bTqJ!JS!fY0Q'7AmO,]*UM2$_:Jq/CN
+SFqL]BkV-jARf1X?sd5G>[(B7=BAO(<)Z^n;,C(bD0fc.D/s`EIYE^XQ3`b?P`q8nOcY\%Nrk?&
+O8Y+:NUDi'NW+n6NW"n;N<#"5NW"h7N<"q:NVnb7NW+n7NV8A4O8=t*O8+h9O8Y1;OnOn6Oo(4A
+Ockn,Oo(79Oo1C@Oo:I@OoLUEPP^OBPPp[EPP^UDQ2d0FQiEBLQi!-MRJN<NR0&hHS,JlVSc##S
+Sc>;[TDYAXU&Uk]U].(dV>mFlVuEXpWViasWN,irriQ1&ric@)s0)F+!3uO/!42[3s0Vj8rjVm:
+#e@OY]=bhl_86)e#/eBt`Q#s=rl>>ebKJ/TcHji9d/MDpda?Omrm^u!#hR_^g"P38gthtd#2e@t
+iSrkWrT*t>!9X7Cs60LI%dN<Dm+TFaVOs6BPEC`VnrDLb"dbO?Q'@Kgs8-a1DZ+JRE;jbUE;=MP
+Onb%9NrY:@?iOF4?2\%.>Q7n)=oMP'=8>nc<Vohr=8uD%=oVY,>?kG3L%50CO7J>-NE_0pMN!OU
+OHG]jQ'[l,S"6.DTqeE\Vl?\tXfnt7ZaI6O\\#Mg^VRe*`Q-'BbKS8XdF$Fmf%8R.g>(N@i8EVT
+j5oFckiq?sm-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$s8RT~>
+JcC<$JcGZJo`"jgrVZTjs8)ckrqHQhp@eLY=nM=Vo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bKJ#K`l5j4^q[Rq]",;Y['R$AY-"_'Vl$8bTqJ!JS!fY0Q'7AmO,]*UM2$_:Jq/CN
+;#j;`:*s[gB4YXa@UWYO?<pf?>$4s/<`W0u;c6Ih:es5?6:=./7Rp'D:A[fe:?t[W:esmd:@V-Z
+:B+,i;#!ib;#a;k;"dZb:A[fe:B"&e:B"&e:B!uf:Amug;#4#i:f%'e!)NShr_NAc!_l?^p.bQ^
+p.tEXn5&[QrDE>d!)NSh!)NPjnPK-\oM>N`r(d5eq,$lapepod!E)ek;YsAs;Gg:h;H$Nn<;BGm
+<;fes<;]bq<X2],<``='='5?$!a&N*r`K2'!*]A+p0@T&!*oG-rEfP4ra5\5"^tkMA7T9MB)ZEE
+BPD/ZC&VlICB/2MD>nGQDZXltEW1%YFoQR`FoQXaG8,:IH$XgaI!g?kIXcitJ:W6%JqARPK)UB6
+KS>,7L51+l?W^0$9M%W@6g%GC<Uj*3Q^3o%P`ru$_o0O6a2uHGbKJ,Rc-FY^d*L(ddaHUormh;*
+f\,!5gthllmlg\7s$-HGs&8qsnl,Nps'>\2rETA,s'#>'r`K2%q,Zraqc<\ts&f8's&oV2>[0us
+9MP'WnPo?`>DJ&mN/`m[OckroQ^F52SXuLJUSOcbWN*&%YHY==[C3TU]=bkm_8=.0a2lEHbg+P^
+dF6Urf@\g2gtgiFi8WeWjlY^hl07L"m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+14M
+s*t~>
+JcC<$JcGZJo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nl5/Kn*f]3m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@AC"dF$:cbfe,La2Q!6_8!^s]=GG[[Bm0CYH=k*W2HJfU7n3MS!o_2Q'@GoO,f0VM2-h=K7SRO
+f_;?BWAA*r@q&kR?X6oA>$5!1<`W4";c?Rk:f'rFSXP(\M2mdgVQ\(^a2Z-<_ns7*^V@Iq]Y"0S
+s1A6@rji$<s0q^1rO)[6r3ZO5n?r)!s0_g4r3cO4r3cO4s0_L-r3u[8s0r$<rjVp;rjha4qRQ.-
+!4hm7rO;a8qmla<!P,`4\c98;]DoPD^&GYH]tV7rqnW6Js1nKIqSN-IrP\ZRrl,&\aN2F#`r3sU
+aT'?_b00e.rltJgp!3WbrR(YnrR1o!e^`7%rn%/%rRq&$rS.A-rnd\4!9!k8r8RV6!9F+?"Qnn2
+l0834!pf4>rU'XR%.NfWo()DEp%J.Sq"Xg`!rMrqYQ"t+j4)8n`l5p.Yc-6cr4;^9"IPOAQ'L2*
+q3(W;rK@2CqiUrCrfm&i#f+9m_SX.*?srt@s'G_2rETA,s'#>'r`K/$k>qR`s&f5&s&oD,r`fY5
+?='h<Y-ITur4Mg:r4;j;>)A,qNK90aPEhH#R$sM8StMdPUo(&hWiW>+Yd1UC[^`l[]Y;.s_SjF6
+aND]McHjnde'ut#f\5'7h;7)JioB(\k3(sml0I^&mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`n
+o_sFAJcGcMJ,~>
+JcC<$JcGZJo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nl5/Kn*f]3m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@AC"dF$:cbfe,La2Q!6_8!^s]=GG[[Bm0CYH=k*W2HJfU7n3MS!o_2Q'@GoO,f0VM2-h=K7SRO
+SFV:WARo:[@:*AI>[1H8=]e^*<E)mq;Gg7e:MtH'C2J!5H[^X+rK[\RP`q;oOcbb"O8k4@O,j0u
+m>h('rJ^W5rJgr=NfNjnrf$c7!0$o:r/CW7s,?l8oo9$5qN1-+plPH8r/gi=pQ566qiClAP*5g,
+qiLW9r0%#@rK@)@s-!DGqNClBrK@2EqNUuEs-EJIrg*MLo9]NGrgEhVr1*eXqjdPSrgs+]qk3bY
+!2B4_rM9=e!2f^mri#jrrMoms!35st!3H1%riZ:)s/u@)ril@,"gbSC[C*IB\,EfB\\#Jd]YD4t
+_>_=O_uIXV`Q-$uaT'BebKS5VcHji9d/D?9daQ[peCE.$f@\d0g=tB<h;7#Ghr*JPio9"ZjlGOb
+jQ5P&kPs`Vl0@Nsf"A,\Sskt.OG\^AnrDIa"IPOAQ'L2*qJZ.HrGV^T!,qjUrG_k#P5LI9OT1CA
+@/aO5?N4=0>lS%.>5VP&=T2Cb<rQ2#=T)D&=o_e+>QS2;?N#TLs87rNNr+f>M2I7OO-#NgQ'Rc(
+R[]k>TV8-VVPgDnXKA\1ZEpsI\@K5a^;%M$`5Td<b0/#ScdC1ieCN7(g=k?<hVd>Oj5]7`kNM0p
+lg4!*mdKW6nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#s8W+L~>
+JcC<$JcGZJo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nl5/Kn*f]3m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@AC"dF$:cbfe,La2Q!6_8!^s]=GG[[Bm0CYH=k*W2HJfU7n3MS!o_2Q'@GoO,f0VM2-h=K7SRP
+;#jG`:)[\S@q&kR?X6oA>$5!1<`W4";c?Rk:f'qM6N0=U6q0[=8l"DBrD)lYs%`Ph!)WDcrD3Pk
+:f-j]!)EDe!)EMhr(d5er(d8dr_EDf!)WJg"].uk:esmd:B"&c:'+-`9_M3\:A.Ha:/CX[nPAdR
+rDE>d!)NSh!DcPk;=RK[;?'Gm:\R]_:B+,b;#4&`;Yj;m;Gm6fr)3Snr_WYnr_rhrq,78mp/V,n
+s&TD*=&r@'=BPK&!*K5%!a&T-r`]8)rEK>,r*98-s'5M.!+,V2!aoABra5b9A,^!=Ac66?B*)a\
+B`;`FCB&&OCi4*,rbhaS!cW."rc80aFEM^)FoQXbGQ2mgH$]I:s*Xiqs*t#u"bD2TJq8LOJeE]h
+K7nr4K6Cs7<_uUc8OZ$753Go?<UWs!R$X,(Q,1>T_o0O6aN;QHrlYDfc-=Q5cOS=LdaQ^re^i='
+f\5*8h>9D'4TI\F56+UU;ZK_k;u^8)?iOI4?2\%.>Q7n)=oMP&=6EW`=8uD$=oVY*>Q.k3?!^i3
+9MA:Ss6s"b;d,$8N/`m[P*;/sQ^F52SXuLJUSOcbWN*&%YHY==[C3TU]=bkm_8=.0a2lEHbg+P^
+daQ^sf@\g2gtgiFi8WeWjlYail07O#m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+14M
+s*t~>
+JcC<$JcGZJo`"gfrqu]ks8)ckrV0^np@e1Po^h\Fo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;FgY1<3
+f$r3tdEg+_bK@oH`Poa3^q[Rq]",;Y['R!?XfSP%Vl$8bTq@pHS!fY0Q'7AlNf8mQLk^V9Jq3dO
+po*qd/RVpl?!LT;=]ea+<`E!r;Gg7e:JZk=R=KjDNKTa-Y/nZ'`l,d3_8*h"]tCuV])K>?])K8>
+\,a#3[f*W5[f!N5[d^^$[/RK3[/@?2[f3Z8[^H+Cs0_L-r3u^9rjVp;rjVp;s1.g4s1&->rOMI0
+!4hm7r3u[8qmla<o""e3qRcd?s1SEE"22F`^\bhH_>h=I_>;%F_u7OQ`W!mW`rX9%rPnfVqoAr_
+b0%oObl,cdcLoK`d/DAkdf%VqeCFQLs4@8&rRq&$rS.A-!8[Y2!oMqoro*h8qW%P9"Qnn2kir'2
+!pf4>rp:-^n*oi:nac;Do_%qPrqQKg!rDinYl>1)gsaEe`5BR)YGe@pUYrZ_])B2;](il=R$X,n
+s7_]TOo:ICOnk12^]2(L_>_:R@UW\QrEoS2s'>S.s',M,qcWo#r)`DhrE&u#rE9/(s',J-$!gkD
+?XI2LY-"r#s7j8)]DT8=\QOiLNfT9bPEhH$R@B_<T:r!SUo(&hX0&P/Z*UgG\%0)_]Y;.s_SjF6
+aND]NcHjnde'ut#f\5*8h;7)JioB+]k3(sml0I^&mI'H3nF?)?oCV\Jp%J+RrV-BgrqcQirqu`n
+o_sFAJcGcMJ,~>
+JcC<$JcGZJo`"gfrqu]ks8)ckrV0^np@e1Po^h\Fo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;FgY1<3
+f$r3tdEg+_bK@oH`Poa3^q[Rq]",;Y['R!?XfSP%Vl$8bTq@pHS!fY0Q'7AlNf8mQLk^V9Jq3ch
+mXlTh?X@#C>?Y03=&r@$;c?Rk:f'q`DL-VDD/s`EIY3RXQ3W\>PEV/lOc]<u"-/G'Nr=t)Nr+h8
+N;AP5NrP+=Nq\P4N;SY8N;eh9Mueosrf-r:r/LB0!0?u<mZ7C0!0@#=rK$l<r/p`8qN:Z:!g/Y/
+rfR)>q2tT<rK7&Ar/q#Bs-*;Bs-*DEs-*8Cs-<VMpm;#HrKmAJ!1E_Os-`nU!1WnVs.0%Wqjm_X
+rLa"\q4Re_p7qV_qka=irhoaos/Gpr!NE*rWrfB)Xo5C&YPt^(YQ(g,Z2V$/Zi7?3[JdT6\-]^W
+]=Y_h^VI\%rk]2``5KX7a2c9Bai_fMbg+N5ci;Aid2LH^e'umtf%/L+g"P07gtgfChV[5KiSieU
+j8S-<jo=KCk7d(Bkiq'J\#Q0lR?WhpM1gD/H[>:DgPl9%Q^6D+pM]qHrGVLNplY62"(G\I@/XI4
+?N4=0>lS%.>5MJ%=Su7j<rH,!=T)D&>5qh+>R=\B?=.&I@>0Aho`+ZHpl><4=c86!O-#NgQ'Rf*
+S"-(BTq\<XVPgDoXfen5Za@0M\[oGd^;%M$`5Td<b0/&TcdC1ieCN7(g=tE=hVd>Oj5f=akNM0p
+lg4!*mdKW6nac8Bo^qhLp@e7Zp]1-hqY^6ir;HTdrdk*#s8W+L~>
+JcC<$JcGZJo`"gfrqu]ks8)ckrV0^np@e1Po^h\Fo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;FgY1<3
+f$r3tdEg+_bK@oH`Poa3^q[Rq]",;Y['R!?XfSP%Vl$8bTq@pHS!fY0Q'7AlNf8mQLk^V9Jq3ht
+s%rSfr_<,^*ai>]?!LT;=]ea+<`E!r;Gg7e:JX)?6pa:07RfsAj%oVKnPB0[s%iYkpJ:cbs%iYk
+pJ:faqbI2er_NMg!DcJi:]4&f:&[of:]=2e;?'Gq:Jak`:]=,h:\d`e9h\7T:&[o]:B=3dpeL?T
+o2,B_q+q&er_<Ji;#X>^;#=,i;#a>e;#a>h:B"&b;#4&`;Yj;m;Gm6fr)<Vns&&eos&8nrq,78m
+rD`hsr)N_s#?Or-=&rC(=Sl/$=BAT'=T;M(>5h_0>[(H;>[.,2ra#P/rE]A/!+>e5s'Yk9!+Z"=
+!+l.Arau4Er+Z.Fs(hXNrb_[Qs)/!YEH-$uF8^4\FoHRaGQ2pfHN&7$I!pHmIt*!!JUi9%Jq8LO
+K)UB6KmduQ>Z4Kr91VK=6U![r3pBW=<UNm9R$X,R^qmn*_o0O6aN;NFb0%oObg"GYcd0tcdaQ^q
+e^i='g"P39h>BJ%4oS=X;Ya8j;Z0Mr@UW\QrEoS2s'>S.s',M,qcWo#r)`DhrE&u#rE9/(s',J-
+$!gkD?XI2L9M81Rs8Gse<;f`uMi<[WOHPfmQC+)0S=Z@HU8+N]Vl?`!Y->1;['mHS]"G\i^VRe*
+`Q-'BbK\>YdF-Lnf%8R.gYCWAi8EVTjQ5Oekiq?tm-O--n*fc9o()DEo_%nNp@nO\!;ZWjr;6Kk
+rVcBfJcC<$s8RT~>
+JcC<$JcGWIo`"jgrVZTjs8)ckrqQNf!;?Eb=S24Uo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC"dEp1abfe,L`l5j4_8!^s]=GG[['R$AY-"b)W2HJfTqJ!JS!o_2Q'@GnO,]*UM2-h=K7WpQ
+s/>jnr2B@hs'.!V=]nj-<`N*t;c6Ih:esiCS<n_VL5h@aVQRtZ`Pf[2_8*h"]tCtg])K>?])K8=
+\,a#3[f3]5[f*W6[d^^$[/RK3[/IE3[f!Q3[f<c-[f!W7\Giu;\Gs&;\Gs,4\GEc+](if5\,Ei6
+\c983\c98;]DoPD^&GYH]tV7rqnW3Is1nNJqSN*HrP\ZRs2P)Z!Q`=[`r*mTaT'?ab0/#QrQP>f
+oZmNarmC_nrR1esec+/!fDaG%g%jA$g]$"-hZ)I5i;V^5iqqa9jSe0Ck3(sml2KuJli6>NmJlYT
+n-ALSo(2MHp%SI\rV6Nlr;O#%&F.rma2c*=_mHPDW2-/^Tq12Rs183?r4;[8s-VO?!0Qu<rK7)B
+rfR,An%T4F_84"*@U`bS?srt@s'G_2r*98+r`]2%r)iMkrE/r"s'#G,r`fk;?=$uG?t!JQ@UlRE
+p&Fj#qRcR7;N-WsOckonQC+)0S=Z@HU84W`W2co#Y->1;['mHS]"G_k^r!t,`Q-'BbK\>YdF-Oo
+f%8R.gYCWAi8EVTjQ5OekiqBum-O--n*fc9o()DErq6<b!;HHe!;ZWjr;6KkrVcBfJcC<$s8RT~>
+JcC<$JcGWIo`"jgrVZTjs8)ckrqQNf!;?Eb=S24Uo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC"dEp1abfe,L`l5j4_8!^s]=GG[['R$AY-"b)W2HJfTqJ!JS!o_2Q'@GnO,]*UM2-h=K7Woi
+s+Kcls'-gQ=]nj-<`N*t;c6Ih:esi'H$O.AEHQPTJr5k[Q'@JqP*(ifpl>Q<O,o<]rf-9)qi1T6
+qMkK7!0-u<pPo02rJ^f9rf-i7rJgi9r/C`;NVJP6O8=t+O84n8O8P+;Onb%6Oo(4AOckn,Oo(79
+Oo1C@Oo1C@OoLUEPPUIBPPp[DPPUOCPlR-FQiEBLQhm'LRJW?RR@9V7r1*bWr1*YTrgs(\r1NkZ
+s.]7_rhTCe!2f^mri#jrrMoms!35st!3H1%riQ7)riZ7(ricC-riuO1rj2^6[f*]8\Gs)E]">Vf
+^;.P#rPJQP%`QH.a2l?DbKJ,ScHab^rm:Sj!RfHre-aaWf@\a/g=tB;h>Z73hr+Lms5O(=s5X@F
+jQ5Ldk5FHUgVgCpT:)%0P)Y6LIXcZhG'A3'NnfWoR+hT:DZt#sDfBW5r,2FNrG_dupQ>02s'l":
+s'Yh5s'G_2r*98+r`]2%r)iMkrE/r"s'#G,r`fk;?=$uG?t!JQ@Uk(Gp&FZFqi:W7;N-WsOckon
+QC+)0S=Z@HU84W`W2co#Y->1;['mHS]"G_k^r!t,`Q-'BbK\>YdF-Oof%8R.gYCWAi8EVTjQ5Oe
+kiqBum-O--n*fc9o()DErq6<b!;HHe!;ZWjr;6KkrVcBfJcC<$s8RT~>
+JcC<$JcGWIo`"jgrVZTjs8)ckrqQNf!;?Eb=S24Uo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC"dEp1abfe,L`l5j4_8!^s]=GG[['R$AY-"b)W2HJfTqJ!JS!o_2Q'@GnO,]*UM2-h=K7Wns
+ohG<YrD!;s)Hp9H=B8I&<)Z^n;,C(b:-:j26:=427S$*Gk"knMnP90\:]4,b:]4)i:]=2b:]F2f
+:B4/h:]*ud:]4&f:&[of:]=2e;#sKhr_NSjrD*AgqG%#br_3&\r_E)]peL?To2,B_q+q&er_<Ji
+;#X>^;#=,i;#a>e:]O;g:B"&a;#4&a;Yj>l;?0Sj;YsAs;Gg:h;H$Nn<;BGm<;'>l<rZ5*<``=&
+='/T&<rcA%=8l>$>5_\)>lS%+>lJ"/>l@q.?MRq2?t!MRA,^$;B)ZECB`)TDC'&0eD#S;NDZ=VV
+E,fptF8p=dF`__JF`qs-G7]"EH?spbI!g?kIXcitJ:W7KJc:69K7\`%CLC:D:J4;N7mo[,5!(ec
+4$2e.pJpW^s-O_<^;%J#_Sa=2`Q-'AaN2KFb0/#RcHab^d*_jA#h7DUf@ej2gYDZirB1-EqE4gB
+q*"ROs&/\lr)3Pns'l":s'Yh5s'G_2r*98+r`]2%r)iMkrE/r"s'#G,r`fk;?=$uG?t!JQ@Ui)+
+p&Fqgmo32DNfT<cPEhH$R@B_<T:r!TV5L8lX0&P/Z*UgG\%0)_]t_A"_SjF6aND]NcHjndeC<($
+f\5*8h;7)JioB+]k3(smlKdg'mI'H3nF?)?oCW%Ts7QHerV-BgrqcQirqu`no_sFAJcGcMJ,~>
+JcC<$JcGWIo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nl,)Jn*f]3m-Es$l0.9ljl>C\i8EJJgtLK7
+f@JI#da?Cdc-+8Na2Q!6_8!^s]=GG[[Bm0CYH=n+WMcVhU7n3NS=>q6QB[PpO,f0WM26n?K7`sQ
+po"%gp8KBA=BAO(<)Z^n;,C(b:JQb9Q@4==NKTa+XiA>u_ns7)^V7Co]=S!Rr4;m<rj`!;p9st.
+rjMa4s0hF)qm?@1r3ZF1rjMa4rjMj7oX=\,rj_s:s1&*<rj`!=osjk/q76R:qRZL4qmZO6qmla<
+o""b2qn)m@s1SEE"22F`^\YbG_>h=I_>D+G_u7OP`W*sW`rX9%rPnfVqoAi\b00e.rlkGgoZmNa
+rR(YnrR:errmq)#rn.2&qV(o&s4dh7hVR/Ii8FUnr8RV6rT+4FkNM-ol2KuJlN$;Nm0rFOn*ol;
+o()DEp%J.Zq#1!ir;Q]'rtYIne]c%Qa3;N-Wi;qkTVA%*b.tTrjgkB%s1/'=pq$O;g&M&6p6,E;
+"d5"1P*1t,P5N,d^]2(N_89^\@KKtG@/XI4?N4=0>lIt,>5;=l=Sc2">5qh+>lS(0?N+:=?t!JQ
+@Uiq[AS/(<rrBb+]_K,=\l"KKOckroQC+)0S=Z@HU84W`W2co#Y->1;['mHS]"G_k^r"".`Q-'B
+bK\>YdF-Oof%8R.gYCWAi8EVTjQ5OekiqBum-O--n*fc9o()DErq6<b!;HHe!;ZWjr;6KkrVcBf
+JcC<$s8RT~>
+JcC<$JcGWIo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nl,)Jn*f]3m-Es$l0.9ljl>C\i8EJJgtLK7
+f@JI#da?Cdc-+8Na2Q!6_8!^s]=GG[[Bm0CYH=n+WMcVhU7n3NS=>q6QB[PpO,f0WM26n?K7`ri
+k^t'^=BAO(<)Z^n;,C(b:JPbOH"h/9Fa/=dM3aEkPEV/lOHB-rs,R,=m#Lq%rf$f8!fW+urf-u<
+rf6c5rf$c7!0$o:r/CW7s,?i7p5T-6q2k$*q2kK7rK-r>plP<6qiClAP*5g,qiLT8rK@,Ar0%#@
+s-!DGqNClBr0%)Ds-*MIrKR;Hs-EJIs-ESLqO%;Nr0RMQRf8fSSH#/XSGJfUT)G;[T_P2\U@tA]
+V#$nfVZ*LmW;`dqWrK$uWr&gsXT#@$XoP[)Y5YX)YQ1s,ZMq62[JdT6\-]^W]"G\h^VI\%rk\ZQ
+rknlXa2e2#"3Sg2bl5ofci2;idJqVue'umte^j`P"khVagtgfchZ)O6iW%p:j8J'=jo=KCk8)U]
+XeVJSQBIGkLOsu(H?j[YR[&tpN:r:eNS4@.DuOVSDuO_UDuFSNDu>^lOnXq;A,Tj<@:3LA?iOI4
+?2\%->Q.h%=n5\k=oMV)>Q.n->l\41?OC1L@:E\UA7]=aK_GH=O8+b8NDY^sOckroQC+)0S=Z@H
+U84W`W2co#Y->1;['mHS]"G_k^r"".`Q-'BbK\>YdF-Oof%8R.gYCWAi8EVTjQ5OekiqBum-O--
+n*fc9o()DErq6<b!;HHe!;ZWjr;6KkrVcBfJcC<$s8RT~>
+JcC<$JcGWIo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nl,)Jn*f]3m-Es$l0.9ljl>C\i8EJJgtLK7
+f@JI#da?Cdc-+8Na2Q!6_8!^s]=GG[[Bm0CYH=n+WMcVhU7n3NS=>q6QB[PpO,f0WM26n?K7`qs
+rClQP)-L'C<`W0u;c6Ih:esk^4@)A%6UaI784ZM>:]!oX:BF9e:]4,b:]4)i:]=2c:]=,e:B4/h
+:]*ue:]*ue:&due:]F8f;#sKhr_NSjrD*AgqG%#br_3&\s%`/]peL?To2,B_q+q&er_<Ji;#X>]
+;#F2j;#X8e;#a>g:B"&b;#4&a;Ya5l;Gm6fr)3Yp;,R<js&8qsq,78mp/V,ns&TD*=&r@'='56!
+r`K2'!*];)"C,/9>?h#1s'>Y0ra#P1qHs81!b#PIraZ"?rFZ(B"))C_B`;`FC'ABhD/O3-rbhaS
+!c`7$rcA*]!HiM`FoQXbGQ2mlH$Xd`H[L8@IfForJGk$<Jq8N*K6M$9=&Dad8OZ*85Wq:m3]fDp
+84Z0;mo9$]mT(?.]Y2"m^VRe(_o0O6a2l?BaN;QHbKS5VcHjh`df.]#eCE.&g"P38q`ap@r]^3B
+s$$BEs&/\jr_iSkr)*N)rF,h:?srq?s'G_2rET>+r`],#nlY`kr`]>+r`oJ/!+,Y3$=I:N@U`hX
+AS#IHpAb"gn5N8FO-,TiQ'Rf*S"-(BTq\?ZVl6VrXfen5Za@0M\[oGe^VI_(`Pom=b0/&TcdC1j
+eCN7(g=tE=hVd>Oj5f=akNM0qlg4!*mdKW6nac8Bo`"O`p&Ojcp]1-hqY^6ir;HTdrdk*#s8W+L~>
+JcC<$JcGWIo`"gfrqu]ks8)ckrV0Xlp@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bKJ#K`l5j4^q[Rq]",;Y['R$AY-"b)W2?AcTqJ!JS!o_2Q'7AmO,]*UM2-h=q:YD<
+r2BCi-Fp_!<E)mq;Gg7e:JOW@S%O-!LPq7_U9;JQ_ns4(^V7Co]=PVdqmud;rj`!;p9t"/rO2^5
+"1GVG[dgd%[/RK2[/IE3[f3Z8[^H+Cs0_L-r3u[8rjMm;rjVm:s1.g4qRQF5!4i!<!4hp8qmZO6
+qmla<o""b2qn)m@s1SEE"22F`^\YbG_>h=I_>D+G_u.IP`W*sUa8O$Va8<pZai_g+bl5lecLfH]
+dJhSmdf\+Mf%0iPrRh,&q:bi&s4dV1rn[_6i8FUnr8RV6!9F+?"Qnn2l0803!pf4>rpBaSs6p9`
+o()DEo_%tWq#:'jqY^?$rsAMYd`TVI`5B0jrhp7!TV7q$a1f'kZE^Tpkdg](s1/*>pUf&Wr/p]9
+rK7&AqnW-E!5A0A"i.rbA7K-K@fKm:@/XI4?N4=/>lIt,>3]8i>5hb)>lS(0?N+=3?jgCP@Uiq[
+AS,RgBPI5@rk89Crk80@qn#[cOckroQ^F21S=Z@HU84W`W2co#Y->1;['mHS]"G_k^r"".`lH0C
+bK\>YdF-Opf%8U/gYCWAi8EVTjQ5OekiqBum-O--n*fc9o()DErq6<b!;HHe!;ZWjr;6KkrVcBf
+JcC<$s8RT~>
+JcC<$JcGWIo`"gfrqu]ks8)ckrV0Xlp@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bKJ#K`l5j4^q[Rq]",;Y['R$AY-"b)W2?AcTqJ!JS!o_2Q'7AmO,]*UM2-h=q4-W#
++bGc:OB#7Y;c6Ih:esh\DKpqND/aT@I"I3>PEV/lOcY[tO8k4BNK0$[mZ.:+!07&<s,?l8!fW+u
+qi:E1rf$c7!0$o:repl;N;eh:N;S\.NW>.:OR8,)OSb+;OSt=9OSP%9O91Q-P5^U@OSFt:P5UO@
+P5UOCP5gaBP5gaDP5gaGPQ6pGPl?sJQM[!NQC!o'r0R8Is-`eP"IY^JR[a5Fs.0%Wqjm_XrLa"\
+q4Re_p7qV_qP=1hrMTXns/Gsss/?!ur2Th!riQ1&!3cC)ric=*!3uO/!42[3!O]B7\,Wu<\Hf^Y
+]Y2"o^qoudrko/_`lH-@aN;WLbg$.4s3L\k+OSQ`dF-IleC<%!f@\a/g"P6:h;-rEhr*GOiSrkW
+ioC!us5agSiQ\p6U7@X8OcP<PJpr)lrc\X8P)kQZLk^P)q2X9jfDk_dqel@Os)7pTrGVOoqN1i@
+OcfI$s().>raPn9s'Ye4s'G_2r*95*r`\Sir`];*rETA.!+,Y3s'Q4C@U`hXAS#IdBP;,Ss7MHH
+N_ke!P*D5uR$jG6StD^NUnsufWiN8)Yd(OA[^WfY]Y2(q_Sa@4a2lEHc-FY_daZguf@em4gtgiF
+i8WeXjlYail0@U$m-X60n*ol<o(2MQp&F^cp\jjeq>U6gqu6NlrUg)?s+14Ms*t~>
+JcC<$JcGWIo`"gfrqu]ks8)ckrV0Xlp@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bKJ#K`l5j4^q[Rq]",;Y['R$AY-"b)W2?AcTqJ!JS!o_2Q'7AmO,]*UM2-h=q,%,d
+qFp<OrDa>,;c?Rk:f'q_9fta36:1Z?s%*2cl;.:PrD*Dip.kcc:Japf;#*o_;"mcb:Adlf:B"&g
+:'"-cr_NGes%WJfr_NMiqG@8i:]=/j:]4&g:\mfd:&[i\:&du[:B=3dqG-QVnkf<_q+q&er_<Ji
+;#X>];#F2j;#X8d:]O;g:B"&b;#4&`;Yj;n;Gg<f;Z'Jn;ZBVo;ZB\p<;BGm<;fes<;T\q<X;c-
+<``=&='/T"=8l;'=^##->6%q,>Pqb*>l\./?2n70?N=L5?NabF@U`jHA,p3?B)ZECB`)TDC("fn
+D/F0-D/O60DfG\rrcA*]"*J^.FoHRaG6<)8H$]I:$@I8NIXcitJ:E*"qgf]8Eb8QV:JXSQ6pj7(
+5!:nd4$#u*7R]^25sRd-<;0D\<[kSj]=bhk^qmn)_o0R7a2c3?aN;QHbKS5Vcd:%ddaQXneCE.&
+g"P38q`am?rBC0CrBC6[r_iSir_iVlrDNZ+s'u%;s'bq8rEoS2s'>P-r`fA*l<4*ir`f>+s'5V2
+ra5\5$XmLR@q9.^AnPdjC%qZ,<;fbc<)AX<P*D5uR$jG6StD^NUnsufWiN8)Yd(OA[^WfY]Y2(q
+_Sa@4a2lEHc-FY_daZguf@em4gtgiFi8WeXjlYail0@U$m-X60n*ol<o(2MQp&F^cp\jjeq>U6g
+qu6NlrUg)?s+14Ms*t~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nl,)Jn*f]2m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@JI#dF$:cbfe,La2Q!6_8!^s]=GG[[Bm0CYH=n+W2HJfU7n3NS=>q5Q'@GoO,f0WM26n?g"HAY
+rRpb>r2BIkrOMs>*)]X1:esk^9u*14I"7$2OdMlG`5BF,^V@Ip]=S!Rqmug<rODm:p9jt/r3lR3
+rjM@)qR$:1r3ZF1rO2^5!OfE8[f<c-[f!W6\Gir;\Giu;\Gj&3\GEc3\cB;<\cB;;\GE]4\GWo;
+](3E2])0,>]`,VE]E>j]^VBW\s2"]Mqn`0Hq8<0Lrl+oWr5\`Trl=lVs2kDdc-6.2!7(5_!7:_m
+rmLbo!S#[!f)F;#f_sM"gATe+g^)`mhV[5Ki8NYliqqa9jSn6Ek3(sll0803&F8]LmHs?1n*oi:
+o()DEp%A:YrqQZmqu-N(ruLXbd*'JIahY<dW2ZSdU7e'LSt*3p[BcQf_91$Llacf%pq,,Wq2tE7
+rK.)CqS;R7!5SSF!b>eNrF,h:?srq?ra,V1qcs,)qc`\rr*')(r*98-s'G\3&7ApT@U`hXA7]=a
+B4tsmCMW_Fr4N6G]tM.orOr!=:Q^g)Q'[l,S"6.CTq\?ZVl6VrXfen5Za@0M\[oGe^VI_(`Q$!?
+b0/&Td*^:ke^i@*g=tE=hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo`"O`p&Ojcp]1-hqY^6ir;HTd
+rdk*#s8W+L~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nknrHn*f]2m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@JI#dF$:cbfe,La2Q!6_8!^s]=GG[[Bm0CYH=n+W2HJfU7n3NS=>q5Q'@GoO,f0WM26n?pmgQ#
+s+:31s,\'q;,C(b:JOWMG_p-OE-->QJr#YTP*(lgqi:`=qi:o@NK0$[O7&&)NW4t9NW4t;NVeb2
+NW"h2NW+k;NK!jrs,?l8oo9$5qN1**q2kK7rK-u?pQ535qiClAP*5g,qN1N8rK@,Ar0%#@s-!AF
+qi^uCr0%)Ds-*MIrKR8Gs-ESLr0I;JqO%8MrL!VQ!h,UJqj[YWqjdPSrgs%[rLiqZ!2B1^rhTCe
+!2fanri#gqri6!t!35ps!3H1%qQBh$s02O.rj)L0!4Mj8s1&'=#J.R]]t_@u_>_:U_o0L4`l?'u
+a90T.bg$.4rm1Vk(X^UWd*^:ie'umtf%8R,g"P39gtgfChYuI5iVqj:j8S->jWWBu[]#jgR$3\l
+L4k)+HZs^YF`hkLMMR%AIWLO5Q'RGjgPseaqJZ7Ks)7mUrbhgTDu,RiOnb%;AHHCPA,Tj<@:3LA
+?iFC3?2In+>PhUt=o;J&>Pqb+?2n71?P$UR@:E\UA7T7_AnPdjBkqMZs7MHHN_be#Pa.T&R[]k>
+T:r!TV5L8lX0&P/Z*UgG\%0)_]t_A"_o9X:aND]NcHsteeCE.%g"P39h;@/LioB+]k3(smlKdg'
+mI'H3nF?)?oCW%Ts7QHerV-BgrqcQirqu`no_sFAJcGcMJ,~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nknrHn*f]2m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@JI#dF$:cbfe,La2Q!6_8!^s]=GG[[Bm0CYH=n+W2HJfU7n3NS=>q5Q'@GoO,f0WM26n?pe_#c
+pe:EV!)EDcqc+8,;,C(b:JOVV6:O:/77B[;8knYJqG.#cs%rAaqb[)aq,$i^rD*,`r_<Ji:B"&f
+:B!ue:B+,h;#4&h:]sQj:esmd:B"&c:&n#f9_V9]:@h6^:/C[\nk\gQr_`Jfs%iYi!DcPk;=IE[
+;>sDl:\dfe:\mid:\di`;>sGn;u9Jh;u]_q;>O2f;Zouq;,U<k;u]hm;ZKen<<-)!<W?,"<sD],
+<`W:'=SPts=T;M(>5h_+>5MP%>lJ"/>lJ%/?M\"3?t!JQ@f9j9B)cKGBPD0orb;@H"`%pkD/O4i
+D?OlsE,p!uF8U.[FoHRaG7JkCH?spbI!pElIXcitJ,OosJJNNJ@p;i.9M%ZA6pX"$4ZPP`4$5Sb
+7/fIU7RBI077-ZHpJpZ_%CisZ]">Yh^;.S%_Sa=j`<jQ)aN;TJbg"GZrm1YmrmD&#eCE.%g"P3X
+55[PE5!Ad,r]L6Fr)<Plr)*Air)<Vnrac.A@q5IH!b#JErEoP1s'>M,r`f8'p0%;sr`f;*s'>Y2
+ra-4E@:<VS@q9+]AS,RgBPD6tq#C1i!)rGf:Q^g)Q'[l,S"6.CTq\?ZVl6VrXfen5Za@0M\[oGe
+^VI_(`Q$!?b0/&Td*^:ke^i@*g=tE=hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo`"O`p&Ojcp]1-h
+qY^6ir;HTdrdk*#s8W+L~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrqQNf!;?Eb=S24Vo()>?n*f]3m-O$%l0.<mjlGI]i8EJJgtUQ9
+f@JL%da?Fec-+8NaMu3:_SEq"]XkY_[^<BGYcb+/WMcVhUS4?PSXZ%7QBdYsOH5B[MM[+Cg"HAY
+r7M(KpS[ebr2K^p!4i'>rj`iV:esh\:!/m?H\%!2OdMiF_SO%&^:h2X]DK2=\c'#<\+[91[J[K5
+[/m_DrjMC*q6^10r3ZF1rO2[4rO)^6o="S+s1&$:!4`$;s1&*>osjk/pppI9qmuU5qR?C4r42j=
+o""b2qn)m@rk8<D!kuFaqS<-IrkSEIqSN'Grl"fTrl4oWr5S`VqT&f]b0/#QrQP>foZmNarR(Yn
+rR:errmq)#rn.2&q:bi&s4dV1rn[_6i8FUnr8RS5rT+1EkNM-orTaFK!:9^P"RbaJnF?MK"7u0X
+p\jmeq>^9lr;O8,'^OGqa2Ps<_m?A@VkK`WTU_XDS!j8B$(-X]_90m!ZDb(s\bNc3]@?lTOnk1>
+Onc`k^Au(@^].pFAcH<@A,]s;@K0a5?iOI3?2@h'>PVJ">Ph\*?2n70?P?gU@:E\UA7T7_AnPdj
+BkhF!D/T1Lr4`3Es1SKJrP&3Crk)$iPE_?!R$sM8StMdPUnsufWiN8)Yd(OA[^WfY]Y2(q_Sa@4
+aN;TJc-F\`daZguf@em4h;-uHiSrnYjlYail0@U$m-X60n*ol<o(2MQp&F^cp\jmeq>^<hqu6Nl
+rUg)?s+14Ms*t~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrqQNf!;?Eb<qQ"To()>?n*f]3m-O$%l0.<mjlGI]i8EJJgtUQ9
+f@JL%da?Fec-+8NaMu3:_SEq"]XkY_[^<BGYcb+/WMcVhUS4?PSXZ%7QBdYsOH5B[MM[+CpRD;;
+KS8`FrIP$1qN)GS:esh\9r`DpBPh^0G^Y4#PEM&jOS+\4NrP1.NrP(=Nr=q;N;\b8N;nn8Nq\P4
+N;&>1N;\_9N;JS8NfEgos,[#<mZ7.)r/^c;rK6l:plYH8!g/Y/rfR&=q2tW=rK7#@rK7,Crfd5B
+s-*ADs-*JI!0d>Frg!MLr0R>IrKmAJrgE\O".>UIS,8`USc##TSc,/YTDbGXT`Ch\U].(cV#[Ck
+VuEXpWVrjsW;rsqX8]7#XoP[)Y5PR(YQ1s,ZMq62[f*Z8\Gj#V]">Vg^;%J"_8=(,_o0L4`l?'?
+aN;TKbg$.4s3L\k!7CemrmLeqs472%s4[J-!8[Y2s5<n8ro3t<ro><U^p9f.R?s)"NJN18I<p-_
+GBJ%LF`VVGEHuP^Mj'6OM0smKN<"q$NR\"*Dtn5MDZFbUDtoFnOT:RAOnk+=B)ZBAAH-0=@fKm:
+@/OC3?N+7,>l.b$>5MP$>lS+0?N"4E?t!JQ@UiqZAS#IdBP;*pCMRd)q>^ASqiCH2:Qgp+Q'[l,
+S"6.DTqeE[Vl6VrXfen5Za@0M\[oGe^VI_(`Q$!@b0/&Td*^:ke^i@*g=tH>hr*JQj5f=akNM0q
+lg4!*mdKW6nac8Bo`"O`p&Ojcq#C0iqY^6ir;HTdrdk*#s8W+L~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrqQNf!;?Eb<qQ"To()>?n*f]3m-O$%l0.<mjlGI]i8EJJgtUQ9
+f@JL%da?Fec-+8NaMu3:_SEq"]XkY_[^<BGYcb+/WMcVhUS4?PSXZ%7QBdYsOH5B[MM[+CpJCob
+pIt?Vr_EDdq,Iu,:esh\9is_M6:=727S-3Hn4s'[:\dcb:]F8a:B=9hrD<>dq,$f]r_E2`rD*;e
+rD*>ds%`Phr_WGg"].uj:f'sd:B+,c:&n#f9_V9]:@h6^:/C[\nk\gQr_`Ge!)NSh!)WYln50!Z
+s%r_kq+q&eqG.#cqG?ubpepod!E)en;?0Yp;Z'Gp;Gg<j;ZB\p<;BJc<W?)*=&r@'<`W:(=SPts
+=9Vi2>$G37qciu'r`oM/ra#P1rEfP4ra5Y5s'kq;rFQ4GBP;*oB`;`GC'JHiD/F0-D>nGQE;jnW
+F8U.[FoQXaGQ2sgHN/<tI!pElIXcitJ,Om-JTba7=A_jf84?$:5Wq=13r_8Q4?GP_2`Wrg6:3n&
+5s%Cn2u$AH<Ua$"\%&uZ]"5Pf]t_A!_SX4/rP])_a2uKIbKS5Vci2;kdJqW"e'uq!f\,!5r''s?
+!Br[C56"OY;u9Jk;>jDj;Z]j/B)ZBAAH-0=@fKm:@/OC3?N+7,>l.b$>5MP$>lS+0?N"4E?t!JQ
+@UiqZAS#IdBP;*pCMRd)q>]tar_req:Qgp+Q'[l,S"6.DTqeE[Vl6VrXfen5Za@0M\[oGe^VI_(
+`Q$!@b0/&Td*^:ke^i@*g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo`"O`p&Ojcq#C0iqY^6i
+r;HTdrdk*#s8W+L~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrV-Hgp@eLY=7l+To'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?5
+f@AC"dEp4bbfe,L`l5m5_8!^s]=GG[[Bm0CYH=k*W2HJfU7n3NS!o_2Q'@GoO,f0WM26o>g&B_&
+g&.fKVtd4eWW&jp])T><])T;Q:!/m?H\$p0OdMiC]"l(p]tF<Ur4;j;rO;j:p9jt/qmHL4r3l.'
+q6U.0qm?@1rO2^5!OfE8[f<c-[f!W6\G`l<\@8sH\Gs,4\GEc3])T><](rl7\,Wl:\,<c6\c982
+\c98<]DoMD^&5ME]tV5Z^\P\B_>;%D_uI[R`W*sUa8O$Va8<pZai_g+bl5lecLfE_d/MGldf%Vs
+eCE.$rn%,$rn7,$rS.A-rnd\4s5<q9qr7M5!9F+?"Qnn2l0803!pf4>rpBaSs6p9`o()DDo_%tX
+q#:'jqYU6'rtkOle]PnN_ofZtWMuegStV^DSXc1;Q^@];$^I%&\tkUoR$h2tFn3*;])'%frrA/R
+Oo1CBOnZZi^\ttA^].pHB)Q<@A,p-<@fKm:@/OC2?N+7(>l7h#>lJ%/?N"72?iXX7@M30]A7]=a
+B4tsmC27U$D/O92EVoe3^AG\F^AGTCPEhE"R$sM8StMdPUo(&hWiN8)Yd(OA[^WfY]Y2(q_Sa@4
+aN;TJc-F\`daZguf@em4gtglGiSrnYjlYail0@U$m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6Nl
+rUg)?s+14Ms*t~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrV-Hgp@eLY<V5nRo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?5
+f@AC"dEp4bbfe,L`l5m5_8!^s]=GG[[Bm0CYH=k*W2HJfU7n3NS!o_2Q'@GoO,f0WM26o[SEtn+
+K):Z,OoLLR9riJqBPh^0G^Y-uNffEbr/Ui>r/^c9rf?K-!f`5#rf-r:rJgf8!0-l9pl562r/C]:
+rf-o9!KE';NW4t8NW5"=NVJM6O84n*O8+h7O8P+<Ont.?Oc]C$qN(c@P*5g,qN1N8rK@,Ar0%#@
+rf[;Fqi^rBrK@2ErfdDHrKR8G!1*PLr0I8IqO%;Nr0RMQRf8fSSH#/XSGJfUT)>5ZT_Y;]U@tA]
+V#$nfVZ*LmW;`dqWrK$uWr&gsXT#@$XoP[)Y5YX)YlD!-Z2h61[/[T5[fEr;\HfaZ]tM.q^qp#e%
+`?6'`Poj;a2l?DbKS5Urm(PiqU#5is3q,#f%0iQ#hn%ggtgfChV\=j!9*n9)ror<d(69PSX5Y(P
+Dk3IIXQKdGB\1PEccACF8g.eE,h+tHua[TDF@H*qMk?1mu>frqJZ(Fs)7Rls,m8CrK6r<s(;=Dr
+FQ">!+Yt:s'bq8r*TG0ra#5&r*/o#ra#P1rEoS4!+Gk9&n>H_AS#IdBP;*pCMRa'DJsK6qu?SUq
+iCH2<0NT4Q^F52SXuLJUSOcbWN*#$Y->1;['mHS]"G_k^r"".`lQ9EbK\>ZdF-Opf%8U/gYCWBi
+8N\UjQ5OekiqBum-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$s8RT~>
+JcC<$JcGTHo`"gfrqu]ks8)ckrV-Hgp@eLY=7l+To'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?5
+f@AC"dEp4bbfe,L`l5m5_8!^s]=GG[[Bm0CYH=k*W2HJfU7n3NS!o_2Q'@GoO,f0WM26m_;#!oa
+9__?V:A\&e<WYus6N0=U6q0X;8PSbO!_uNeq+grcr_W;a!`2`kr_WDdq,$i^rD*8d!)WYjr_<Ji
+:B"&e:B+&f:B"&g;#4#m:esk`:f%$bs%iGc!)<GdpJ(Z_o1oB^:\dcV:\%?];>O)j;,C'f:&n)W
+;#=,i;#a>h:]jKi:f$p_r_N>dqGHubqGRGn;,R0fr)<Vns&&eor_rhrq,78mqGdMrr`/u!s&TD*
+=&r@'='56!rE'5+>$>-7>5MP%>lJ"1>[:Y7?MRt-@0'hIrabt>s(D@F!GQ6HC&ViIC]8/UDJa6.
+DJsK6rc8!Z"*A[-FT-F_G5ldcH2i3jHiJKqIXQ\DIk#tuIrf7-<`)[c8Ol375<_7l3BK8a4?>J^
+3BB2]3''/f4Zb\a0eOFq.f33?<Ua$%\$icU\[f;a]tM1q^qmn)_o0Lm`<40%b00e.!mT$:rQkku
+daHUoe^rI-g\X224o[\G5Q*eE;Z'Jg;?0Sl;Z'JnB)lQBAcH9@A,Tm:@K0a5?iFC2?1qP$>PDD%
+?2n70?iOL6@K'^K@q9+]AS,RgBPD3sCM[j*DfB^ns6s"c;cJsGQ'[l,S"6.DTqeE\Vl?\sXfen5
+Za@0M\[oGe^VI_(`Q$!@b0/&Td*^:ke^i@*g=tE=hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo^qhL
+p@e7Zq#C0iqY^6ir;HTdrdk*#s8W+L~>
+JcC<$JcGQGo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nl##In*f]3m-Es$l0.9ljl>C[i8EJJgtLK7
+f@JI#da?Cdc-+8Na2Q!6_SEq"]XkY_[^<BFYH=n+WMcVhUS4?PS=>q6QBdYsOH5B[MM[,Ag&B_%
+g%D<=WVi^p\b3NF\]pPZH[pm1OI2Z<\\Gkl]`#JB\cK@QrOMj9!4VF*!4Da5o!S8"!4Da3rO)U4
+rj;d8[JmW7[Igp*\,No9[fX(K\,No;\b3K/\bWi:\biu6\G`o:[K*f7\GWo;](*?2])0)@]XtfR
+]E5d\^AYhA_#2%F_Y:qJ`;R[T`r*mT`r=$Ua9B].bKJ,RrQP>foZmNarmC_nrR1esec+/!fDXA$
+g%jA$g]-%/h>Z74hr*GliV_^3j8J'Ck3(sll0834s6K^Os6U3^n*fc9nac8Bo_%qVq#C0iq>pNn
+^&JW;gsO?f_oBI$X/DnlT:__RRhhH\Q^=)*Q^*l#PE_5mR<i+MI8>-AMY4OS])0+fs8J,POoCO:
+_#1tF_"kbEBEDgYB)ZBAAH-0<@fKm9@/OC2?N"0u>lJ%.?Mn.3?t!LC@Kp=QA7]=aBDuQPBkhF"
+D/O60E,fo>r;ZT-!kuFarkSQKs1\HF;jEZ8R$sM8StMdPUo(&hWiW>+Yd(OA[^WfY]Y2(q_Sa@4
+aN;TJc-F\`daZguf@em4gtglGiSrnYjlYail0@U$m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6Nl
+rUg)?s+14Ms*t~>
+JcC<$JcGQGo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nkelGn*f]3m-Es$l0.9ljl>C[i8EJJgtLK7
+f@JI#da?Cdc-+8Na2Q!6_SEq"]XkY_[^<BFYH=n+WMcVhUS4?PS=>q6QBdYsOH5B[MM[,]SF2%+
+K)^o)OUdJVGD^'LE--;NJVB&EOSk.>OSt7<Nr>%,NWP3#NrG%<N;eh8Mu\k8Nq\P3N;SY8NrG%;
+Mueosrf-r:r/L`:!0-c6!0?r;mZ7.)r/^c;rK6r<!KiK>Ont.@Ockn,Ont18Oo:I@Oo:IAOoCOD
+PP^OBPPp[EPQ$dHPPpaEQ2d0JQi36JQhm*LRJ`EPRJrWTS,8]USbnrSSc55YTDbGXT`Ch\U].(c
+V#[ClVuEXoWW&psW;rsqX8T1#XoP[(Y5YX)YQ1s,ZMq33[C6%C!4`$=)7mGn]tV7s_84"*_o'F3
+`Q#p<aN2KFbK\<2cMl/gciVP?d/MJne.'sZf%AX/g=tE<h;-rFr8@P5/D\:TW1]ZJPECl]KR\H!
+G^+FUG&q\FF)l>ADfK`9DfBW5DKK)N9jC%i@qbe"qMas(df9/^oksejooT08r0%)BqiLej!bZ+W
+ral+?s'u":s'bn7r*TG0rE\ksra#M0r*KM5@:B.E#%M1SAS#Idrb)[RC27X&DJjB3EH6-us87uU
+O8+`8O,fKkQ^F52SXuLJUSOcbWN*&%YHY:<['mHS]"G_k^r"".`lQ9EbK\>ZdF-Opf%8U/gYCWB
+i8N\UjQ5OekiqBum-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$s8RT~>
+JcC<$JcGQGo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nl##In*f]3m-Es$l0.9ljl>C[i8EJJgtLK7
+f@JI#da?Cdc-+8Na2Q!6_SEq"]XkY_[^<BFYH=n+WMcVhUS4?PS=>q6QBdYsOH5B[MM[*b;#!lf
+;"[QS:@_Em>XCeF6:+127n?AH:]F/i:\[Zb:]=2a:]F8k;>sDg:\di]:]4&d:B45j:]=)i:JUmb
+r(d8dr_EGgr_WGg!DlSk:]O;i:B+,d:B+&f9__?]:@h6^:/C[\nk\dPs&&Pf!)NSh!)MuYqbdAi
+s%iPhs%`Yl:\dcc:\di`;>3ub;u]_q;>O2f;Z]io;>sJn;u]hm;ZKei<W?)"=8c2"<rc@s=8l>%
+=Tho4>?Y5.>Pqb*?2n.0?2e1+?NabF@:E^EAGp*DB4tsmBP@BZs(_RLr,)FN!cN$trc8$[r,hs]
+rc\<cs*=Wjs*FosI=6QmIf4a5Hu<M"<)64\7n#g25!(ng3BB5b3''&Z3W;&N3B&uY4$#A^2CKRk
+0.ee43;unP<Uj,i[K!Zb\%&uZ]=bhk^VIY$_SX4.`5KX7aN;TJbKS5UcHjkacd:(fdaQatf@\gS
+55.2A5!M:.;Z'Jb;Z0PnBEDgYB)ZBAAH-0<@fKm9@/OC2?N"0u>lJ%.?Mn.3?t!LC@Kp=QA7]=a
+BDuQPBkhF"D/O60E,fo>r;ZRkpJh)i;jEZ8R$sM8StMdPUo(&hWiW>+Yd(OA[^WfY]Y2(q_Sa@4
+aN;TJc-F\`daZguf@em4gtglGiSrnYjlYail0@U$m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6Nl
+rUg)?s+14Ms*t~>
+JcC<$JcGQGo`"gfrqu]ks8)ckrV0Rjp@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bfe,L`l5j4^q[Ur]=GG[['R$AY-"b)W2HJfU7n0LS!o_2Q'@GoO,f0WM2;/as4[;%
+pSdhcrM]aqr42X7&@oBeR)+0%Ll@F^SZ&s1]tF?Vs186@!4r->rODm:l*g/jo!JD(r3lU4r3lX5
+oX=\,rj_p9!k>_Krj`!=osjk/q7?U:qmuX6r3u^7!4Vm9r42j=n[\\2pq-I:!kl=^rP/-Cr5&6H
+pVR!LrPefVr5\`Trl=oW"j+p0bKS3/blH&\cN)>kdJqYne,Rqsf)F;"f`'S"gA]k,g]610hZ)L5
+i;_d5iqqa9jSe0Ck3(sll2BlKlg4!;m0)kGnF5uIncSLUp@nR]s7u]k!W2f/rtt1Xbf@]@ahG']
+W2HD_T:VOBS=5n6QC+$<Q4fIIPEV,jPED&mP]D,-N)<Q,LA8=Q])K=fs8J,OOoN2i_#(nE_"thG
+C&VfGB)lQBAcH<@A,Tm:@K'[3?i47$?2\+-?iFF5@JsXP@q9+]AS,RfBP;*pCMRa'DJsK6EH6/C
+FoD@5^\kkJ^V9]\;O3]<R[]k>TV8-VVPgDnXKA\1ZEpsI\@K2`]t_A"_o9X:ai_fOcHsteeCE.%
+g"P39h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`no_sFAJcGcMJ,~>
+JcC<$JcGQGo`"gfrqu]ks8)ckrV0Rjp@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bfe,L`l5j4^q[Ur]=GG[['R$AY-"b)W2HJfU7n0LS!o_2Q'@GoO,f0WM2:eomt:Lh
+s+C62q2l/KOcXdEB5DL-G^4dlNKF+"s,d2?rJpi;lAkk'!0$l9rf$l:r/UQ3r/CT6s,R)<rf$c7
+s,?l8s,I)=pl5?8q2k0.!0I2@plPE7r/gl>plP<6qN(iBP*1riq2kE7rK@)@rK@,Arf[;FqNClB
+rK@/Ds-*MIr072Gs-ESLrKdAJqO%;Nr0[MPs-`qWqjd\Wr1*YTrLWt[rLiqZ!huHapS7baq5"(g
+rhoaori,ptri#mtql9^uriQ1&!3cC)rNH7*!3uO/"gbSC[C3OB\,EiD]"G_j^;.P#_8?2h%)g-(
+`lH-@aiV]Lc-?75s3LYj#g^lEdF-IleCFQL"5);\g]$".h#ZBir89?hin)&QVOs9AP`h#]Jpi#n
+G'A.RFE;MDEcH,>E,]f:E,]]4D/X<2DJrT]ASOb,A7bb"qi(9/!0$o:ci<i[pMKtkr/^Q5s,m5B
+s,m5@s(VIGs(;=DrFQ">s'u":s'bn7qd98-nm23#r*TG2!+Gh8(h7)eAS#IdB4tsmC27U$D/O92
+EH-#@FERQ^r/gf:pPr15QC+)/S"6.DTqeE\Vl?\tXfnt7ZaI6O\[oGe^VI_(`Q$!@b0/&Td*^:k
+e^i@*g=tE=hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#s8W+L~>
+JcC<$JcGQGo`"gfrqu]ks8)ckrV0Rjp@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bfe,L`l5j4^q[Ur]=GG[['R$AY-"b)W2HJfU7n0LS!o_2Q'@GoO,f0WM2;.-pe_#f
+q+^<Qnl>fZ5stW<"[tpM8P)\N:\@H_:]=2b:]F8j;>sDh:\[c]:]*ud:]F8j:]=,e:]4&f:&[of
+:]4,e;?'Gq:Jak`:]4&g:\mid:&[i]:&[o[:]F/i:\dcV:[q9];><rf:]=)h:[M!U;?'Jm:]+&h
+:BF?g:\mid:\di`;>3ua;Z]io;>O2g;Z]io;>sJn;uTbl;ZKeq<<-(s<W?)*=&r@'<`W:'=SPtr
+=9D]0>$Lu0r*0)(r`oP0?2\++?N=L5@0'hIrFGk=rb)@IBP@BZ");UeD#A/LD?4Zqrc8!Zs)\co
+FEDYJG'8+SG^4R\H@(#;IK"[5Is,O6>#A-j8ju075<_4m3BT>a4#]2\3]R+!'K7p/3BK5\3B&rY
+4?=uI2*!QO1cP20pJq8or`0Z:ZF%$I[^NZT\[f>b^:q@t_86,fs2,Ge`lQ9Db0%oOc-=P[d*L%b
+dJhPseCE1(gAX;95Q<qA4o8+Y;,U<i;t<id;u^S2B`D]FB)Q<@AH-0<@fKm9@/F=/?LhD#?Mn10
+?iXX6@MiTcA7]=aB4kmkBkhF!Ci+'.E,fl<FED[(s7K=g;uoosr_l^\R$jD4SXuLJUSOcbWN*&%
+YHY==[C3TU]"G_k^r"".`lQ9EbK\>ZdF-Opf%8U/gYCWBi8N\UjQ5OekiqBum-O--n*fc9o()DE
+o_%nNp@nO\s7u]kr;6KkrVcBfJcC<$s8RT~>
+JcC<$JcGQGo`"gfrqu]krqcZjrqHQhp@eLY;tT\Po'u5<n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI#dF$:cbfe/Ma2Q!6_8!^s]=GG[[Bm0CYH=n+WMcVhUS4<OS=>q6QBdYsOH5B[MY#L$W;ELh
+W;NXpW;ERj\b`lM\[n*AI"@$1Od2H8Ye@]]]=PTL\c'&<\*:?m[ILX'[J[K5[JRB4[I^j)\,No6
+\,No;\b3K/\bWi:\biu7\GWi9[K*f6\G`u<](*?2](io8]E#YE^AbnB_#2%F_Y:tJ`;[aU`r*mT
+`r=$Ta99W-bKS3/blH&\cN)>kdJhSmdf\+Mf%0iPr7M&&ptG`%s4dV1rn[e8i8ESQqr7J4rT+4F
+kNM-ol2BlYlg4!*mI'H3nF5u=o(2JGpAOadq>U3kqu+A2)#NOJb/VH=`P/UVVP^)[St)7ra2,BT
+Q^@];%@<<DPEV,jPED#mQ'7@0Op7,2LQ.OeSboti]$C?SOS+b7^\knI^\ttE^\ttF^B87dC2*W[
+s(;=DrFQ">s'tt9s'bn7pg<]#q-X/0raGe8s'l%>racjWB4kmkBkhF!Ci+'-DfB]:F*)MIGBa&d
+pV?dCr4r?Is1V?tR@B_;StMdPUo(&hWiW>+Yd1UC[^`lZ]Y2(q_Sa@4aN;TJc-F\`daZguf@em4
+gtgiFi8WeXjlYail07O#m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+14Ms*t~>
+JcC<$JcGQGo`"gfrqu]krqcZjrqHQhp@eLY;tT\Po'u5<n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI#dF$:cbfe/Ma2Q!6_8!^s]=GG[[Bm0CYH=n+WMcVhUS4<OS=>q6QBdYsOH5B[MY!A-KDgE!
+KDL]+OUR>/GDKjHDKBuJItN^ZO8b7?O8Y+:O6Vc)N<"q:NW"h9NW"n3NVnb6NW5%<NW4t7N<"q7
+NW5"=NVSV7O8=t*O8+h7O8P+<Onb%6Ont.BOckliOnk+7Oo:I@Oo:I@OoLUEPPUIBPPp[DPQ-jI
+PPg[EQ2[*JQi*0JQhm*KRJ`ESR@9V7qO@PVr1*VSrgs%[rLit[s.]1]s.oLf!2fanrM]aqs/Q$s
+!35psrN5q!ric@+s0;R/s0Vg6!4Mj8!4`$=$+da]^:q@t_84"f_Z7XS`W!pXaT9Q-rQYAfs3L\k
+s3L_l%+3MOeC<%"f%AX.gY;__(>[j)hr*DMi8N"oYGIhWQ]dGhKn4Z"rH8EgS!B.sF)u@#DuaqX
+E;segD/O60Ci=3.Ci"!.D.[U'F*3K?N;&>2N6_J"Dtn5MO8Y+:O84n:Oo:IBOoCFECMITurFl4D
+!+u1@s().>r*o\7ra>M.oj7H$s'Yh7raPn;!+c(?(1q2lBP;*pCMRa'DJjB3EH6,BFEVkPrr;qY
+qiCK3s,U$ER@B_;StMdPUo(&hWiW>+Yd1UC[^`lZ]Y2(q_Sa@4aN;TJc-F\`daZguf@em4gtgiF
+i8WeXjlYail07O#m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6NlrUg)?s+14Ms*t~>
+JcC<$JcGQGo`"gfrqu]krqcZjrqHQhp@eLY=7l+To'u5<n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI#dF$:cbfe/Ma2Q!6_8!^s]=GG[[Bm0CYH=n+WMcVhUS4<OS=>q6QBdYsOH5B[MGI#E;#!lf
+;#O/e:%_9\:]=,[<XVD`6UF()6UjL89MP:XohPN_r_W>b!)WVkr_WJfq,$f]r(d2ds%r\js%`Ge
+rD*>ds%`Phr_WGg##J)k:f'q`rD*AgqG%#brClu\r_E)]s%WPiq+gKVnPK6_peUrdr_<Ghm83[W
+s%r\jrD<Mis%i\kqG.#cqG?ubpepod!`DlmqGR5is&/kor_ibps&Aem!*&ep!*9%us&KD,<``=&
+='&L+pfIGss&fA+>Q.h(>Pqb)>le29rEfA.s'Yh7!FfR<A,p3?B)QBDBk[K[!,DLK$>aQqD/=',
+DJsK6rc8!ZrH/$]!I&_dGlN'hH3&A?rI#Z7Ir]++=&D^d8Oc*55s7@m3BB/]:.n,I3]]8^r\t$@
+4#o;^r]('?3]f>#2[;<'3B9/_5XG9IpK%8n'="jJZEppF[C3QS\[oDd^:q@t_>M.Y_o9[<ai_`J
+bKS5UcMc&td*^:hdaZk#ff_J^55d_G55RM=;Z9Mn;Z'Jb;?Tp6C2.J]B`D]FB)Q<@AH-0;@fKm9
+@/++%?MRt.@/aU6@fKp<AH$-UAnPaiBPD3sCM[j*DJsK6EcZ>EG'A00s7'%f<;f`mR$jG6SXuLJ
+USOcbWN*&%YHY==[C3TU]"G_k^r"".`lQ9EbK\>ZdF-Opf%8U/gYCWAi8EVTjQ5Oekiq?tm-O--
+n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$s8RT~>
+JcC<$JcGNFo`"gfrqu]ks8)ckrqQNf!;?Eb;tT\Qo()>?n*f]3m-O$%l0.<mjlGI]i8EJJgtUQ9
+f@JL%da?Fec-+8OaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hlUnOHQSXZ(8Q^*euOcPN]MXoF#VYR.d
+W:m4b\c02?\I5*r]R,*\MNF$kV69g0s18$:rODm:l*g2ko!JD(qmQO4qmHL4oX=\,rj_d5s1&*>
+oXOb.q7?U:qmuX6r3u^7!4Vj8rOMs>n[\\2pq-I:!58BGrkJ6Dqn`0HpV[$Lrl+lVrQ"fTrl=oW
+!m/U.rlkAds3C8_s3UenrmLbo!S#[!f)OA"f`'S"gA]k,g]610h>lI4huMa4iqqa9jSe0Ck3(pk
+l2BoIlN$;Nm0)kGn*olHncSLUp%J@ZrqZZmr5/IWp#"3?b/D02\?;d/UnF<MSDME+^:1JTZ&=m4
+Pa%AqOc]O("-f+8P5^XJP)t]aO8b+?Nf]D&\bs#=]DK1`s8A&WOT:RBOo2ul_">D>_#1tHCBA6b
+C&VfGBE)TBAcH<@A,Kg8@JsU$?i=C4@JjR9@q9-LAJf#lB4tsmC27U$D/O60E,fl<F*)PJGBeE3
+s6mc'^J)A0S"-(ATV8-VVPgDnXKA\1ZEpsI\@K2`]t_A"_o9X:ai_fOcHsteeCE.%g"P39h;7)J
+ioB+]k3(sml0I^&mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<hqu6NlrU^#>s+11Ms*t~>
+JcC<$JcGNFo`"gfrqu]ks8)ckrqQNf!;?Eb;tT\Qo()>?n*f]3m-O$%l0.<mjlGI]i8EJJgtUQ9
+f@JL%da?Fec-+8OaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hlUnOHQSXZ(8Q^*euOcPN]MXm;.KE$Pt
+KD1K,OoLLPH?P'VBlA!7G^Y."O,s:%s,[,=qiC$&rf$o:rf-l8s,Hu;pPo*0rf-o;rf-r:qi(T7
+r/L`:s,Hi7s,[#<m>q%(r/^`:rfQu;q2tN8"Hek1OcfF#qN:`>r/pr@r/q#Bs-*;Bs-*ADs-*JI
+s-*DGrg!JKrKmGJr0R8Is-`eP"IY^JR[a2E!1j%XqORVWr1Eq\pn7b`US@LXs.oLfs/,dnri#gq
+!36!ss/Q!t!3H1%riQ7)riZ4's0)L.riu^6['[6K[f3c9\Gs,>\cf[Z^;%J__#V@O_u@U[`lH-@
+ai_cLrQP>frm*mWcd:"ad*U1gdaZgtf%8R-g=tB;gtgfChr!AMgrHn(Tq%O8OH#'LJ:;ijGBS/)
+R$<\kM26n,DfBZ6E,TW3D>nGcD/X</D/=*.Ci4*+Ci+$,Df5Q5pl593bl@NXq/61mqMtK7r/go?
+rK@/BrfI+p!buF`rb2=Es(;4@s().>r*oY6rF##"rF#Y6r*f_;A7Y[N(hRDnBP;*pCMRa'DJjB3
+EH-#?FEMbNG^98frfHl8qMn71R@B_<StMdPUo(&hWiW>+Yd1UC[^`lZ]Y2(q_Sa@4aN;TJc-F\`
+daZguf@em4gtgiFi8WeXjlYail07O#m-X60n*ol<o(2JFrq-?dp\4[^s7u]kr;6KkrVc?eJcC<$
+!<7Q~>
+JcC<$JcGNFo`"gfrqu]ks8)ckrqQNf!;?Eb;tT\Qo()>?n*f]3m-O$%l0.<mjlGI]i8EJJgtUQ9
+f@JL%da?Fec-+8OaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hlUnOHQSXZ(8Q^*euOcPN]MZ-BO;#!lg
+:f$dZqbHo^!)E)c$U-mE6U4"+7n-'A:ARcY:B+,h;#!id;#O8j;#F,a;"mc`:B"&g;#X8j:A[ic
+:B+&f:B"&g;#4#m:esk`:f%$bs%iGc!)<DcpeCc`o1oE_:J^d]nk\dPs&&Pf!)NSh!)MrXr)*Gi
+s%iSis%iYk!)NDcs%iGeqGHubqGRAlr_`PjqbmPo;,R<js&8qspf$ics&K,$r)Wi!!*K2$!*9#!
+r`B/'qc`o%r*95,!F/q/?N+:7?=.&I@/aU7@f9j9B)ZKDB`MiGB`MoICBSHjD/=%fD?=csEW1"Y
+F8U.[FoHUbGlDsjH@($erd?&;DIcsP:ejYT7RTO-3^#Pc4#p,08k29:69mmt2E*ZW2``rYr]1!?%
+llU.3''#[3B9,\3]]>c55nRW<rQ,!Yl:m=ZEppF[C3QS]"5Pf^:q@t_>V4Q_o0R9rlP2_"j>-7c
+-FW6cNqnFd*^=lf%8XS4o[_E5Q<qH4o&"R;?'Pn;t<icCBA6bC&VfGBE)TBAcH<@A,Kg8@JsU$?
+i=C4@JjR9@q9-LAJf#lB4tsmC27U$D/O60E,fl<F*)PJGBeE3s6NZWR@B_<StMdPUo(&hWiW>+Y
+d1UC[^`lZ]Y2(q_Sa@4aN;TJc-F\`daZguf@em4gtgiFi8WeXjlYail07O#m-X60n*ol<o(2JFr
+q-?dp\4[^s7u]kr;6KkrVc?eJcC<$!<7Q~>
+JcC<$JcGNFo`"gfrqu]ks8)ckrV-Hgp@eLY;Y9SOo'u5<n*]T0m-Es$ki_*jjQ#7Yi8<DIgtLH6
+f@AC"dF$:cbfe,La2Q!6_8!^s]=GG[[Bm0CYH=n+WMcVhU7n3NS=>q6QBdYsOH,9Xr7^ktor%ef
+!3,srq5O%t&\>NaUm/N<IY<Q>PFA;N]=YZL\c'&<\*:?n[ILX'[JRB4[JI<6[C3NQpU:"/rj_g6
+rj`!=osjh.q7?U:qmuX6r3u^7!4Vj8rOMs>s1&-@oXY"5pq-I:!58BGrkJ3Cr5&6Hpr!-Mrl+lV
+r5\`Trl=oW"j+p1bKS3/blH&\cN)>kdJqYne,Rqsf)F;!f`0Y"gA]k,h#?11huDX7iVVX2j8J'C
+k3(pkl0803$L@'FmHs?0n*oi:rpg0_o_/%Yp]1-hq>pNn`;_4Qg<[j\_o99qX/W"kT:MLAeAoA:
+[Bd'$Lr-mVd^5*sOHP`fP`q@2Oq<h?OHGTaO,]6[NfK6bPEqO5])K>?]$(-OOSb1?OoUX>^\tt@
+^\knG^]/-LC]A/LC&VfGBE)TBAcH<?A,Ba6@JXC1?i"1/@JjU7A,g*=AK,5oB4tsmC2.O"Ci+'-
+DfB]:F*)MHGB\:XH@,Ykm_Jk;8t2?BT:hmQUo(&hWiW>+Yd1UC[^WfY]Y2(q_Sa@4aN2NIc-F\`
+daZdtf@\g3gtgiFi8WeXjlYail07O#m-X60n*ol<o(2JFrq-?dp\4[^s7u]kr;6KkrVc?eJcC<$
+!<7Q~>
+JcC<$JcGNFo`"gfrqu]ks8)ckrV-Hgp@eLY<:oeQo'u5<n*]T0m-Es$ki_*jjQ#7Yi8<DIgtLH6
+f@AC"dF$:cbfe,La2Q!6_8!^s]=GG[[Bm0CYH=n+WMcVhU7n3NS=>q6QBdYsOH,9XSXoABo7Qsm
+q1J@%%Zuj8HZb'SC2S$7H%(C%rfI/@r/UZ8lAkb$r/CZ8rf6]3r/CW7rf6u;!0$c6$&jk'NfB$Y
+NfB%oNrP1:ORA2)OSb+9OT(C;OSP%8O91Q-P5^U>OSY+<P5LI@P5LIBP5gaBP5gaDP5gaGPlHsF
+PlI$JQMm0JQMd*GR/`TPQiNQRRK/iLSGSlUT)>5[T_P2^U8+IVU]7.dV#[ClVu<RoW;rsrW;rsq
+WrT7#Xo>I'YPt^'Y6(r5Z2V$3Za@*I[f!W7\c98@]`5\K^VI\%_Z%FQ`;[^[`lH-@ai_g)bm2P?
+cd:"bd*M^<s3_/$e^`7%f@\dUg]-(/h>c@Xi7GiQVk0<CPE1ZXJpr,pG'/"OS<f=uN/3:4DN9aJ
+R=oHoD>e>VD/O0+D/=(gD?OfmCi4(gDZalsE,bT3s,>/$qJZ4JrfI/@pl>95rK.&ArK@,A!g%57
+rbMOKs(VIGs(D@DrFQ">raYh7rF,P1rEoD/rF,V5s'u(>rad$\B4kmkBkhBuCM[j*DJsK6EcZ>E
+Fa&%SH?sr;s8J,OO8Y)2S"-(BTV8-VVPgDnXKA\1ZEpsI\%0)_]t_A"_o9X:aND]NcHsteeC<($
+f\5*8h;7)JioB+]k3(sml0I^&mI'H3nF?)?oCMVRo`Fj]p\ssfq>^<hqu6NlrU^#>s+11Ms*t~>
+JcC<$JcGNFo`"gfrqu]ks8)ckrV-Hgp@eLY;Y9SOo'u5<n*]T0m-Es$ki_*jjQ#7Yi8<DIgtLH6
+f@AC"dF$:cbfe,La2Q!6_8!^s]=GG[[Bm0CYH=n+WMcVhU7n3NS=>q6QBdYsOH,9Xr_EMjpe_)h
+:J^RVr(d&`s&\hns$6rY5sn%/7Rp$C:&IfY:B+,h;#*oe;#F2i;#F,b;"d]_:B"&g;#X5j:ARcb
+:B+&f:B+,g;#4#m:esk`:f%$bs%iGc!)<GdpJ(Z_o1oB^:\RWU:B=9hnk]<`peUrdr_<GhlqmUW
+r_WVjr(mJk:f's`:B+,c;#4&`;Yj>l;ZBVj;Z'Gp;Gg<i;ZB\q<;BGm<;KSp<rH#!<`f3"s&]5&
+r`9)#r)`l"s&o8'qciu'r`oM/r*KD1!+,Y3s'Yh7!FfR;AH$3>BE;g\rFu7H"`/$lD/=%fD?4]r
+rc8!Zr,hs]rc]*&G^4R\H@($eI<KC6>#S-h8OZ'95lNn\3BB2\9hIlE6pj:/5t".47mAsn3;kiC
+4$#D]2`WlX3rV,G3'0/`4[)"l4?rUAs&Bl=Yck:8Z*CU@['[9N\@K2_]Y2%n^VI\b_?Ror`Q-'A
+aSs9bb0/#Qc-H=7rm1eqe(*%&r&k-G4[)(.56*nA;Z'Dj;?0Ye;ZCS4C]A/LC&VfGBE)TBAcH<?
+A,Ba6@JXC1?i"1/@JjU7A,g*=AK,5oB4tsmC2.O"Ci+'-DfB]:F*)MHGB\:XH@,Yklr-NGS=Z@G
+TqeE\Vl?\tXfnt7ZaI6N\[oGe^VI_(`Q$!?b0/&Td*^:keCN7(g=tE=hVd>Oj5f=akNM0plg4!*
+mdKW6nac8BoCW%T!quB_rqQNhs8)Zjrqu`noDX=@Jc>`MJ,~>
+JcC<$JcGNFoD\afrVZTjs8)ckrqQNf!;?Eb!VH!_nkJZDn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ8
+f@JI$da?Cdc-+8NaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hkUS4?PSXZ(8Q^*euOcPK\p"KH!rn7FM
+VPa'bqPa=ko!o4>Um&?8J:WN:P*_oE](`c6\,a#%[e-uu[/RK0[K*`0[K*f2[f!W6\GE]6\Gs,4
+\GEc2])T><])&r7\,Wl:\,3]6\c982\c989]DT>A^&PhF^\GVB_>;%D_uI[R`W*sUa8EsVa8<p]
+ai_cLbfp%1!7(2^s3UenrmLbo"4YlPf)F;!f`'S"gA]k,g]610h>lI4huMa4iqqa9jSn9@k5XTG
+kiq@2lMp2Mm/QGUmdKW6nG_t\oCV_LrV6Bg!W2f7s$?DBf#l%Q_o00jXJ_tkT:;=?dDil/['Hoq
+K#>p\af1&kXH6qSPE_/lP*(ojOcYWaO,]0ZNfK6cPEhDrWg/j\rk&0@b5_@#qiLlAo=k:@oY:=>
+s1eSO!c;airbMOK!,;CFs(D@Dr+5n=raYb5nmVB(raYt=ral+As(D@Fs(N?cCMRa'DJjB3EH-#?
+FEMbNGBnL\I!pJDs6RNhS=Z@GTqeE\Vl?\tXfnt7ZaI6N\[oGe^VI_(`Q$!?b0/&TcdC1jeCN7(
+g=tE=hVd>Oj5]7`k32'olKmm)mdKW6nc&([oCW%T!quB_rqQNhs8)ZjrVZWmo_sFAJc>`MJ,~>
+JcC<$JcGNFoD\afrVZTjs8)ckrqQNf!;?Eb!VH!_nk\fFn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ8
+f@JI$da?Cdc-+8NaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hkUS4?PSXZ(8Q^*euOcPK\SXoAB!1ie8
+pk&ErnrOEDHuk$TBl%^2G^Y1!Nf]<_rJp`8r/Lc<nW*L+qi(Q7rf6]3rJ^`8rf6r:!0$Z3#*+\&
+NfK*Yq2YK9qN1-+plPB6qiLf>plP<6qN(c@P*5g,q2kH8rK@)@rK@)@s-!DGqNClBr0%)Ds-3PI
+r072Grg*MLrKdAJqO%;Nr0[MPs-`qWqO@PVr1*YTrLWqZrLiqZ!huHapS7baqPF4hrhoaori#mt
+rMfgsr2Th!rN6+&!3cC)rNH7*s0;R/s0Vg6!4Mj8$+ROV]"5Pf^;%G^_&^D1_o0L4`Q#s=aN;TI
+bK\;Uc-=P[cd:"bd*L(crmD,%e^`7&f\,!5g]#tch;7#1\uqj!R[0/!N.le1I<TgUG'04;OGo$P
+KlV$mQ^EnaC3b/A8T&B^Ci!s)D/=',DJf>f$>sd"DK'Q8E.DqJqi(T7b5VHZqJZ:Ls,m;Brf?f6
+r/^l>rfR5Dr/q"s!c;airbMOK!,;CFs(D@Dr+5n=raYb5nmVB(raYt=ral+As(D@Fs(N?cCMRa'
+DJjB3EH-#?FEMbNGBnL\I!pJDs8J,KO$oM0T:hmQUo(&hWiW>+Yd1UC[^WfY]Y2(q_Sa@4aN2NI
+c-FY_daZdtf@\g3gtgiFi8WeWjlY^hl07L"m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6HjrVcBf
+JcC<$!<7Q~>
+JcC<$JcGNFoD\afrVZTjs8)ckrqQNf!;?Eb!VH!_nkJZDn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ8
+f@JI$da?Cdc-+8NaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hkUS4?PSXZ(8Q^*euOcPK\r_EMjpe_#f
+r_N&Yr(d/cr)`Sms$-lW5sn".7Rp!A:&[rZ:B+,i;#!fd;#F2h;#O2b;"d]_:B+,h;#O/i:ARcb
+:B+&f:B+,g;#=,i:]O;j:]O;i:B+,d:B+&f9_V9]:@h6^:/CUZo2"jP!)`Mf!)NShs%i#YqbdAi
+s%iPh"&D`i:\dcb:\moa;>3ua;ZK_p;>X8h;u]bq;>sJn;u]hm;ZKen<<-(u<V]\q<rcA$<rc;!
+=8l>%=o;J$>Pqb(?2\+0?iOI4?iFI5@K0g8A-6CTAnV!Srb2@IrbMFJ"`8-pDfB^qErL,CFE;PG
+F`hkOG^4RZH$O^^I!]gB>ut!"9h7`@69dRq4?>M`3D2q66ps@+6U*t.7RB3t3&WH43'0/^2`L[p
+rAb<G3BB8c4Zkkj5X7q-6Mje+<N`L.Yck77Z*L^C['mEP\[oDc]tM.o^VI\&_Sa=2a8O'baiMTH
+bKS2TcMc)hci_\De^jU\!'^BFs#pEIrDWGgrDE&^s)%mTCi')ds(VOJrFl4Ds(;1?s()+=q-ro'
+qI9G6s()+?s(;:Ds(MFH)/<r&Ci+'-DfB]9EcZ>FG'A.UH?sseIfKH7;ad.IT:hmQUo(&hWiW>+
+Yd1UC[^WfY]Y2(q_Sa@4aN2NIc-FY_daZdtf@\g3gtgiFi8WeWjlY^hl07L"m-X60n*olHncA@S
+rq-?dp\4[^s7u]kr;6HjrVcBfJcC<$!<7Q~>
+JcC<$JcGKEo`"gfrqu]ks8)ckrV0Igp@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC"dEp1abfe,L`l5m5_8!^s]=GG[[Bm0CYH=n+WMcSgU7n3NS=>q6QBdVqO,f1fgA[rJVY6qa
+W;iji\c92>[g]Z_Y^1_JLlRUaTW#<p\brr;\+[64\$i`QpU:"-!4;X2n[/;'qR-C3ppU43pU:"/
+rj_g6rj`!=osjk/pq$L9qmuX6r3u^7!4Vj8rOMs>n[\\2pq-I:s1SHHrP/-Cr5&6Hpr!-MrPefV
+r5\]Ss2Y#Xs2b;abPo`bblH&[cN;J@dJhSmdfItKrmq,$qq1r%ptGc&s4dV1rnd\4s53t;ioBsr
+qW%P9s5jFHkih:0l3ckDm-X3.mdKW6nc&(]oCV_MrqHKhrqZZmrlG*pnD;O6aMu!.\$2j0VP0WO
+R[_L9]<nlKXbjTpda,4jOfs+U>\\[\H%_';P)k]cNfK1uNXq89PGkI[X-Am:Q^ODV]=Q)`qN1W;
+pqQjCotLL@r4i0F!P`RPDZ=PRD#J,NC2%D\B`D`FB)H6>AGp$(@fBm:AGp*>AcQKCB`DcLC27U$
+D>nDdDfKc;F*)MHG'A1VH@($fIXltKm(bu[T:qsRUo(&hWiW>+Yd1UC[^WfY]Y2(q_Sa@4a2lEH
+c-FY_daZdtf@\g2gtgiFi8WeWjlY^hl07L!m-X60n*olHncA@Srq-?dp\4[^s7uZjr;6KkrVcBf
+JcC<$!<7Q~>
+JcC<$JcGKEo`"gfrqu]ks8)ckrV0Oip@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC"dEp1abfe,L`l5m5_8!^s]=GG[[Bm0CYH=n+WMcSgU7n3NS=>q6QBdVqO,f0iSb&BOSbRj1
+K)C8mOT1@ONF@ENBkqX1G^P*sNKB5"Nr"h7NW>.;NW>.8Nr+h8N!>3!N/`gWNqJD1N;eh9Nr=q;
+N;/D4NW>(<NrP+8NrP19OReG4OT(=9OSk19OT(C;OSP%8O91Q-P5^U>OSY+<P5LI@P5LIBP5gaB
+P5gaDP5gaFPQ6pFPl?sIQMm0KQMd*GR/`TOQirhGR[]f>SGJfUT)5/ZT_P2^U8+IVUB%+cV#[Cl
+Vu<RoW;rsrW;rsqWrT7#Xno4!Y6(r5Z2V$4Za@*I[C6%C*OrYj]">Yi^V@S#_8=(,_o0O5`l?'?
+aNDZKbK\91c2Q#nd*L(ccd:&<dRr$>e^rF*g=k<9gt^`<_R6;6S!TG%NJW@?I=-6]G'.nmP)bKW
+L4XB&LRXZ`H#S7?=[c(k6<dr5D/3s*DJa9-Chmg'Df0H3If=j$EcZ>FG'EqFaSu6Xpi$1MrK7)@
+s,Zo7r/^i=s,m>ErK.(urbhaQ!,VUL!buF`rFl4Ds(;1?rabt;lXKj'rabt=s(27Drb2=G"DV^f
+Ci0/h'5ql1EcZ>EF`qtRH$XgbI=?]ss8J,KO$fM2TqS6WVPgDnXKA\1ZEpsI\%0)_]t_A"_o9X9
+aND]NcHjndeC<($f\5'7h;7)JioB(\k2tmll0@U$mI'H3nF?MK!V>s_o`Fj]p\ssfq>U6gqu6Nl
+rUg)?s+11Ms*t~>
+JcC<$JcGKEo`"gfrqu]ks8)ckrV0Igp@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC"dEp1abfe,L`l5m5_8!^s]=GG[[Bm0CYH=n+WMcSgU7n3NS=>q6QBdVqO,f1u:]F8e;#jGk
+:[UsT:B+,c=8Z+u<=Dhj6pX+,6qBd<8P;eJ:&n)h;#F,h:]aEh;#F2h;#O2c;"[W]:&n)h;#O/i
+:ARcb:&n#f:B"&g;#4&h:]sQj:esmc:B+,d:B+&f9_V9]:@h6^:/CUZo2"jP!)`Mf!)NShs%i#Y
+qbdAis%iPh"A_ij:J^g^r_NAeq,-obq,78kr_`PjqbmPo;,R<jr_rhrq,@2k!*8qrqH!Vt!*K2$
+!*9#!r`K2'r*&u%r*92+r*KD1s'G_4s'Yk8s'bt<rFGq?s(D4Bs(MIJr+l7I"`8-pDfKdrErU1]
+FE@G'"Eem2GBj%2)gZXB@Tuf/9hS&G6pX%"4Zb_c3&jN$7RKO.5Q4"g7moO#3&r]@*[WKk0/PUH
+3&`iY3BB,Z3]T;#4UFeR8P2986UO:2r`0-&Xfei+Y8jdOZ*L^C[C3NR]"5Md]tV4q^VI\&_Sa=3
+a2l="a9Kc/bKS2TcMl,od*^7he(*(C4o/+O;ZBVa;?1Y7DZ=PRD#J,NC2%D\B`D`FB)H6>AGp$(
+@fBm:AGp*>AcQKCB`DcLC27U$D>nDdDfKc;F*)MHG'A1VH@($fIXltKlr-9CT:qsRUo(&hWiW>+
+Yd1UC[^WfY]Y2(q_Sa@4a2lEHc-FY_daZdtf@\g2gtgiFi8WeWjlY^hl07L!m-X60n*olHncA@S
+rq-?dp\4[^s7uZjr;6KkrVcBfJcC<$!<7Q~>
+JcC<$JcGKEo`"gfrqu]krqZWjrV-Hgp@eLY;=sJNo'u5=n*fZ1m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI#da?Cdc-+8Na2Q$8_SEq"]XkY_[^<BGYcb+/Wi)_iUS4?PSXZ(8Q^*btOH5Cig&TgqVtd4d
+\c'#L\%&rUZu;dfI"I06OdM`=Zhh61\,a#0[K*`0[f!N5[/@?$[/RK&[f<i3[f!W5\GE]6\Gs,4
+\GEc3])K8;])&r7\,Wl:\,3]6\c982\c989]DT>A^&PhF^\GVB_>;%D_u@UR`W*sUa8<mUa8<pZ
+ai_g+bl,cdcL]?^d/MGmdf%YpeGe%ufDO;$g%a;#gBQHhh;7#Ghu;R0iqqa9jSn9@k5XTGkiq@2
+l2p;<m/HAUmdKW6nF?MK!qZ'XrV6Bg!rMrqbPt--kLRhsa25[)Z)ah$UnF6IRa]9i\[AZFPD6s!
+bfHZ:S=uEXEck-%JVo7[:kaX^P*VZ0U7b=\;,h8.WiD2GPa@`)SXuUMa8c1#qiLf>s1nBDrkA-A
+s1\EGrP8GP!,qgR!c;airG)ILBkdNZrb)7Cqdo_:qd]G2qd]V9r+5n?s(D=E+DGS*CMRa&D/O60
+E,fl<F*)PJGB\:XH@('gIXls#K7rX-8"ZKKUSOcbWN*&%YHY==['mHS]"G_k^r"".`Q-'BbK\>Y
+dF-Lnf%8R.g>(N@hr*JRj5oFckNV6rlg4!+n*fc8nac8Bo`"O`p&Ojcq#C0iqY^6ir;HTcrdk*#
+s*t~>
+JcC<$JcGKEo`"gfrqu]krqZWjrV-Hgp@eLY;tT\Po'u5=n*fZ1m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI#da?Cdc-+8Na2Q$8_SEq"]XkY_[^<BGYcb+/Wi)_iUS4?PSXZ(8Q^*btOH5BlSb&BOSH>=6
+KCXWhKCt<<O-#H_NF@9IBPVU0G^FspN0!ptqN(T8s,Z]1r/LZ6"cJ=uNK&tjNW"h8NW+t0NW5"=
+NW+t<NV\\8O84n.NrY:@O8+h7O8=t;Onb%6Ont.@Ockn,Onk+8Oo:I@Oo:I@OoLUEPPUIAPPp[E
+PQ$gHPPpaFQ2[*JQi*0JQhd!KRJW?SR@9V6S+W<JSc,/XTDkMYU&C_[U]7.dV>mFlVuEXjWW0!r
+WrT7"Xo#:"YQ(j,Z2V$3Za@*I[f*ZS\@K/]]"G_k^VI\%_SX4.`5KX6`lH-@ai_fMrlkAds3LPg
+"jtcHe'uqIf)aOXrnC'#bdssPS=,b,OGnpGJ:2fhFEM_pP`C`[L5'hhOHu/nI;3nIECEi.6s3r2
+Ak,@%Anu:(F`r"S7nH3E>(;'RE,fo?Fa&%TH@*^4s).aQ!,hdSs-!>Cr/^o>pQ#04r/gl>s)7sV
+rGD[RCi'&c!buF`rFl1Cs(;.>rFGe8q-s52rabq<s(;:Drb*KiC2.O"Ci!s+DJsK6EH6,BF`qtQ
+G^=[_I=6QpJ:`E,OHApl8"ZKKUSOcbWN*&%YHY==['mHS]"G_k^r"".`Q-'BbK\>YdF-Lnf%8R.
+g>(N@hr*JRj5oFckNV6rlg4!+n*fc8nac8Bo`"O`p&Ojcq#C0iqY^6ir;HTcrdk*#s*t~>
+JcC<$JcGKEo`"gfrqu]krqZWjrV-Hgp@eLY;=sJNo'u5=n*fZ1m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI#da?Cdc-+8Na2Q$8_SEq"]XkY_[^<BGYcb+/Wi)_iUS4?PSXZ(8Q^*btOH5D":B45e;#jGj
+:[h*R:A7if<X;])5=%P#6UO?B7fc4VnkK6^:f.$brD<AgrD<Jhq,$ub!)WMfqb@,er_W;ar([5d
+r_EGgr_WGg"].uj:f'sc:B+,d:B+&f9__?]:@h6^:/CUZo2"jP!)`Mf!)NShs%i#YqbdAis%iPh
+!)NSj!)NDcs%iGeqGHubqG[Dlr_`Pjr)3Yp;,R9is&8qsq,78mqGdMrrDiYoqcEeurE&r"s&o8'
+r*0)(r*B8-s'Pe4s'Pb5s'Yq;A,Tp?AS,Rfqe5tC%VfcpC2@[$Ci!s*DJjE5rc7pXrcJ0`s*"Hf
+rHUbKAR/>8:/+>N6:3t#4$>Vc3&jT&7mo[25XRk+77BI'3B/iL*[rTl/2B+D2DR-K3]fMi5X[t!
+2`Nob91hf?5sds<6jH.N7]WVlXfhW+'<naHZEpsH[^WfY]">Vg^:q@t_>_:Q_o9Xp`sTo.aN;QH
+bKS2TcMl,nd*^:ie(44Us&A_kku.P#!,qgR!c;airG)ILBkdNZrb)7Cqdo_:qd]G2qd]V9r+5n?
+s(D=E+DGS*CMRa&D/O60E,fl<F*)PJGB\:XH@('gIXls#K7rVj8"ZKKUSOcbWN*&%YHY==['mHS
+]"G_k^r"".`Q-'BbK\>YdF-Lnf%8R.g>(N@hr*JRj5oFckNV6rlg4!+n*fc8nac8Bo`"O`p&Ojc
+q#C0iqY^6ir;HTcrdk*#s*t~>
+JcC<$JcGKEoD\^erqu]ks8)ckrqQNf!;?Eb;=sJOo()>?n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfcHOJRaMu3;_SO"$]Xt_a[^EHIYck11Wi2hlUnXQTSt):<R$Eo!OcS2agAfjmW;`^p
+W;a:,\bEW6[g]Z]T:1+WLPq7ZSYr^h\c'&<\+d<6\$i`Q[J73.[K!W3[ILX&[ICX)\+mE0\,No6
+\,Ef:\b*E.\bWi9\bs&7\GWi9[K*f6\G`u<](*?2](io8]`5\F^AYhA_#2%F_Y:tJ`;[aT`r3sT
+`r=$Ua9B].bKJ,RrQP>fo?[H`s3^horR1brrmq)#qq1r%ptGc&s4d\3hVS7hs53n9qVqD4!9F+?
+#3P+3kih9qrp'OMrTsaUn*fc8rpg0_o_%tWq#C0lqu$H;s%)\=dE9MK^r3[dX/;hjSsu4<cbd?%
+ZEgWmKWiVE[\&\cIs#%3Int?ENCm*#KSknWS=QCH:f:.j<L0VaWf`O2R$aA7Sti!us8J)WO8tF?
+_"YVB^AG\E^A5MI^i=@5Df>Vms)%dPrbMOKs(VCEs(D=CqITM6rF>Y6qdoe>s(D:D,ACn-CMRa&
+D/O60E,fl<F*)MHG'A1VH?sseI=HcuJqJ`2L@2kWTh;)UVPgDnXKA\1ZEppH\%0)_]t_A"_o0O7
+aND]NcHjnde'ut#f\5'7h;7&IiT&tZk2tjkl0@U$m-X60n*ol<o(2MGp%A%Pp\jmeq>^<hqu6Nl
+rU^#>s+13#~>
+JcC<$JcGKEoD\^erqu]ks8)ckrqQNf!;?Eb;tT\Qo()>?n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfcHOJRaMu3;_SO"$]Xt_a[^EHIYck11Wi2hlUnXQTSt):<R$Eo!OcQ$'Sb&BOSc>5C
+KCb3)Nsq"UH?s4>E,g&IItN^YNr+n9NrG+;NW>.8Nr+h8N;nh9N;nk;NrG"<N;/D3N;\b9Nq/20
+NW>(<NW>(7NrP1:OR\A3OT(=9OSk19OT1I;OSP%8O91Q-P5^U>OSY+;P5UO@P5UOCP5^[BP5^[D
+P5^[FPlHsFPlI$IQN!6KQMd*GR/`TPQiNQRRK/iRS,f,XSGSlUT)>5[T_G,]U8+IVUB%+cV#[Ck
+VuEXpW;rsrW;rsqWrT7"Xo#:"YQ(j,Z2_*5Za@*I[C6%C&@f9]]"5Sh^VIY$_8=(,`5MYo"NJL'
+aNFM*rlkDe!m]-<rQkVld*_j@s3sorf@S[.g=t2q[]5shQ^3_oM2$V2I!KjWG''+7Nf/[JK5tg_
+QB[&JE.;=t7SdAW>@_G687Q7GDK0fCG^2eN7nl["J:N2iE,p&DGBe@YHc?$aDZ+JSDK#E8s,m2?
+s,Zu9r/^c;rK7,"!cW'rrbhaQs(q[Ms(_RJr+Q+Crau"<qIKP7q.0A6s(;:DrFdHjC2.O"Ci!s+
+DJsK6EH6,BFEMbNG^4U]I!pEmJ:W<)KSG5CmuRLB8u&2ZVl?\tXfnt7Za@0M\[oGe^VI_(`5Td<
+b0/&TcdC1ieCN7(g=k?<hV[8Mj5]4_k3)!nlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`n
+oDX=@JcC6~>
+JcC<$JcGKEoD\^erqu]ks8)ckrqQNf!;?Eb;"XANo()>?n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfcHOJRaMu3;_SO"$]Xt_a[^EHIYck11Wi2hlUnXQTSt):<R$Eo!OcTE9!)WJg!)WPg
+k>)"WpK.>p$WTAV6UF"*7Rp!?9(GaV;#F,f;#=,g;#X8e:]X?gr(d;hqG6u`!`)WhohYK\!_lEb
+r_NJhqG@Dm:JXe`:]*rf:\dcc:&[i]:&[oZ:B=3dpJ1<Un5'*^peUrdr_EJhm83[Ws%r\jrD<Mi
+s%i\kq+gobqG@#cpJUfc!)ienqbm>js&&horDNVn!*&_lqGdSt<EB*!q,[Ao!*9&"rE0)&r*&u%
+r*9/*rE]J2ra,V3s'Yk8s'bt<rF?"AAnPcUBF&<cBPD0qC27S`C]8,RD/O61EH1tur,_jZs)q=b
+G^4RXBjt=J;bKbR7R]X.5!;%j3&`ch84Q!75sRe(6UX:*3&`fP-6OTg/hf.B0f1[D3BKAf5sdpu
+2`X&b7nZEF5=7b)77BU57Ra;VX/rH%Y5b[=Yd(I=['d<N\@K2^]=bhk^;%J"rk];d`Q#p<`lH-@
+aiV]Kbg+M[d*Vd>s3^qsebD<)<;0>`;Z9Vp;Z9Ms;K6\qDf>Vms)%dPrbMOKs(VCEs(D=CqITM6
+rF>Y6qdoe>s(D:D,ACn-CMRa&D/O60E,fl<F*)MHG'A1VH?sseI=HcuJqJ`2L@/"?Th;)UVPgDn
+XKA\1ZEppH\%0)_]t_A"_o0O7aND]NcHjnde'ut#f\5'7h;7&IiT&tZk2tjkl0@U$m-X60n*ol<
+o(2MGp%A%Pp\jmeq>^<hqu6NlrU^#>s+13#~>
+JcC<$JcGHDo`"gfrqu]ks8)ckrV-Hgp@eLY:\=8Lo'u5<n*]T0m-Es$ki_*jjQ#:Zi8<DIgtLK7
+f@JI#da?Cdbfe/Ma2Q!6_SEq"]XkY_[^<BGYcb(-WMcVhUS4?PSXZ(8QBdYsOSd`'gAfh+f^Pj8
+VZ<[g\Gs#J[^W\]R^[WpLPq:ZSYWIf\bru;[fNqHpU:+0pU:"-s0Va4s0Md4o<eJ(n[AG+qR-F6
+[f!W6\GE]6\Gs,3\GEc3])B2<](rl6\,Wl:\,*W6\c982\c989]DT>A^&PhF^\>PB_>;%C_uI[S
+`W!mTa8<mVa8<p]ai_cLbfp%1!7(2^s3UenrmLbo!S#[!f)OA!f`0Y"gA]h/gtgfCrnmb6!9*b5
+r8[h<roF.BroX@Hl0834!UK+NmJlVSmfDqJrpg0_o_%tXp]^Kiqu$Bkci6T7lJ'S(a25[)Z`U7(
+V4X?LR[_I7\[8TFXbjj6aiCBOVQ,_aEck'!Jr32u:kFI`PFJ):T28E_<E,fpWi;t^Q'[f'S=cFK
+Tu@!0O8P(>^\GV@^\bbE^\tnB^Ar<REW:"XDuOYSD?"GOC]A/KC&M`EBDlH,Ac?<ABDlNDB`MoI
+C]A2mD/O60E,]f:EcZ>FG'A.TH$XgbI=?ZrJV&N-L5(M@n%_DeUSOcbWN*&%YHY==['mHS]"G_k
+^r!t,`Q-'BbKS8XdF$Fme^rI,g>(N@hr*JQj5f@bkNM0qlg4!*mdKW6nac8Bo^r.U!quB_rqQNh
+s8)Wirqu`noDX=@K)^?~>
+JcC<$JcGHDo`"gfrqu]ks8)ckrV-Hgp@eLY:\=8Lo'u5<n*]T0m-Es$ki_*jjQ#:Zi8<DIgtLK7
+f@JI#da?Cdbfe/Ma2Q!6_SEq"]XkY_[^<BGYcb(-WMcVhUS4?PSXZ(8QBdYsORSe?Sc5/BKCt?+
+Nt.22O'd*jB5;F)GBnXiM#NG3O8b1<O7SD.NW+n:MuSb7N<5&uN;/D3N;\b9Nq88,NW>(7NrP1:
+OR\A3OT(=9OSk19OT1I;OSP%8O91Q-P5^U>OSY+;P5UO@P5UOCP5^[BP5^[DP5^[FPlHsFPlI$I
+QN!6KQMd*GR/`TPR/`TSRK/iLSGSlUT)5/ZT_P2_U8+HWpS7baqPF4hrhoaori#mtrMfgsr2Th!
+rN5t"r3$1+Z*F;6"LGJB[C,qA#.V4S]">YirkJWP_SX4i`;dgV`r='XbQ#fcc2Q&fciVP@dJhSo
+e.pQdf@ej(]<S0'R[B5!N/*%8I=$-[rcC&aOH#*OKn=6&OctoUGC"OK79!>U=^l#184I0'D/aT?
+G^2eM7nl^,J:W9%E,]f<G'J:WH@*U1rGMUQs)%h!plbQ:s,Zu9r/^c;rfI2$rc.sWs)7mSs)%dP
+rbMOKrb;=Erb)1Al"0j+s(D:Ds(MIJrbMOM+)Pn5DfBZ8EH6,BF`qtQG^4U^I!pHnJ:W<)KSG5;
+M=6KpU8+N]Vl?\tXfnt7Za@0M\[oGe^VI_'`5Td<b0/#ScdC.heCE1'g"P6;hV[8MioB+^k3(sm
+lKdg'mI'H3nF?)?oCV\So`Fj]p\ssfq>^<gqu6NlrU^#>s+:9$~>
+JcC<$JcGHDo`"gfrqu]ks8)ckrV-Hgp@eLY:\=8Lo'u5<n*]T0m-Es$ki_*jjQ#:Zi8<DIgtLK7
+f@JI#da?Cdbfe/Ma2Q!6_SEq"]XkY_[^<BGYcb(-WMcVhUS4?PSXZ(8QBdYsOShlS;#X;l;#O8e
+:ZtOR:\.Ze<XV,X6pa1-77Tj=8PT+X!)<>crD<DfrD<Dhr)!AgqG@/e"AV`g:f.!arD!Ji:/=\_
+ohYBYr_NJhqG@Dm:JXe`:]4&g:\dcc:&[i]:&[oZ:B=3dpJ1<Uk"l%Rr_EJhm83[Ws%r\jrD<Mi
+s%i\kq+gobqG@#cpJUfc!)ibmr)3Dj!`DlmrDNYos&Aemr)Ebu<W6%u<V]\l<rc;#=8Z/#=o2D%
+>6.u5r*9/*q-O&-s'Yk8!b,YLrF?%BB4kmlr+H7JC2.O!CAr#JC^"ZnDK'T8rc7sYrcJ-_s*.mi
+AmSS;9h\/K6ps7)4?P\e3]K)i7n#d25WqG%6UX."4ZG;P*@WHj/M]4<2)@-M3]oVl6:3^k3'KN"
+91_]I5sn"+6q'L377O2RWiN5&Xfee.Y-5%5Z*CXC[C3RD])TAd]Y2%n^VI\&_Sa:0`Q#p<a2lBF
+bKJ,ScHjhad*^4fdaHV>4TSM^q,I)epJUofr_WZ9rc.sWs)7mSs)%dPrbMOKrb;=Erb)1Al"0j+
+s(D:Ds(MIJrbMOM+)Pn5DfBZ8EH6,BF`qtQG^4U^I!pHnJ:W<)KSG5;M=4A4U8+N]Vl?\tXfnt7
+Za@0M\[oGe^VI_'`5Td<b0/#ScdC.heCE1'g"P6;hV[8MioB+^k3(smlKdg'mI'H3nF?)?oCV\S
+o`Fj]p\ssfq>^<gqu6NlrU^#>s+:9$~>
+JcC<$JcGHDo`"gfrVZTjs8)ckrqQNf!;?Eb!VH!_nk/HAn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYcb+/Wi2hlUnXQTSt):;Q^*euOo*i(gAfk+f_;?9
+VuN^f\Gs#I[C48F]R#-\M34$kUTa[-r4)d9pU113[^EO;[f*W5[/IE4ZiIH,Zi[YB[/@?%[f3c4
+[edK4\GE]6\Gs,4\G<]2])B2<](rl6\,Wl:\,*W6\c982\c989]DT>A^&PhF^\>PB_>;%C_uI[R
+`W*sUa8<mVa8<sXaT9Q-rlkAds3C5^s3Uens3gkps4%&!rn%&"s4R2$s4dS/!o;_irnde8iSjXm
+r8[h<rT4%As60LIrosLMr9XXTn*fc8rUL$]p%J@Z"T&#mr;G"B8b;#lb/hW=_Rd"QWMH;]SXZ(q
+a1esgZ`oUI^WOd5U5#k2HsC30:3hPQ:Jc[tMNsKuS=`PT;,pSmWMunrPEhH#Q^F;7TVJ7!s87rW
+OScfi_"kb9^AYeKFE;JCrc.sWs)7mSs)%dPrG2FJs(V@Drb)+?ok"&5rb)1Cs(VLJrbMOM!,_^Q
++)c+<EH6,BFEMbNGBnL\H[U<kIt3*&K8#&8Ll%"JN:F\PUSOcbWN*&%YHY:<['mHS]"G_k^qmn+
+`Q-'BbKS8Xd*^=le^rI,g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8BoCW%T!quB_rqQNhrqcQi
+rqu`noDX=@K)^?~>
+JcC<$JcGHDo`"gfrVZTjs8)ckrqQNf!;?Eb!VH!_nk/HAn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYcb+/Wi2hlUnXQTSt):;Q^*euOmnn@Sc,)AKCt<=
+OcYZbO/R8XB527%Fa8@eLlRMmO8b1;O7\J/NW4t:MuSb7NW+n3NW4t8N<#"0NV\Y8NV\\7O8=t+
+O8"b6O8=t<OnXt4Oo(4AOckn,Onk+8Oo1C@Oo1C@OoLUDPPUIBPPp[DPQ-mIPPg[FQ2R$JQi*0I
+Qhm*LRJW?SR@9S6S+W<JSc,/XTDkMYU&C_ZUB%+cV#[CkVuEXpW;rssWW0!qWrT7"Xo#:"YQ(j,
+Z2_-0ZNISB[C6%Cs1&*>#.qO^^VIY$rkeWPs2=uXrl>)]rlb;brltJhqp>Ajs3^tteCFQM9#J';
+URRU8OH5<QJpr)oGBJ%MR?NYhLk^S)DiL!FLjNleC0a5$>shh-BgtU&A86"$F`r%%84QBKIXm!#
+IrKCIF*)SMH$Xd`_uKXPrbq[rqi^r@s,d5@q2Y<4rf@8FFE;JCrc.sWs)7mSs)%dPrG2FJs(V@D
+rb)+?ok"&5rb)1Cs(VLJrbMOM!,_^Q+)c+<EH6,BFEMbNGBnL\H[U<kIt3*&K8#&8Ll%"JN:Drt
+USOcbWN*&%YHY:<['mHS]"G_k^qmn+`Q-'BbKS8Xd*^=le^rI,g=tH>hr*JQj5f=akNM0qlg4!*
+mdKW6nac8BoCW%T!quB_rqQNhrqcQirqu`noDX=@K)^?~>
+JcC<$JcGHDo`"gfrVZTjs8)ckrqQNf!;?Eb!VH!_nk/HAn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYcb+/Wi2hlUnXQTSt):;Q^*euOo.uT;#X>i;#!iN
+:B+,\=8l5-5X@_&6:41384cPS:&n#c:An#f:]4,e;>a8j:\mod:BXEg:Jama:]4#j9hnJ\ohY?X
+s%iMgr)*Jjs%`\m:J^pas%iGc!)<GdpJ(Z_nkT9]:\RWU:ZbIR:]=,h:[M!U;>sDl:]+#k:Jak`
+peLibqG?ubpJUids&/hnqbm>j!`DlmrDNVn!*&bmr)Ebu<W,tt<VTVm<rc;#=8uA)=]ed/qc`o%
+qcs&)q-O).ra>b7s'u"<"_D:YB4u#XBE2cGC'&0cCAr#KD#\APD?4]rrc7pXs)\6`rcT&l@9ci3
+9M7lE6UF"#4$>_g3&jN$7n*DC9g_356UEsu3B/`B*@39h0JtjK1Gh'Q3^#_o6T6q`5!DY58P2Q@
+6:4./7R]^577O2RVlHbtXK8P+XKAY/Yd(I>['d<N\%0)]]=biV^'_Wj_8=(,_o0O6a8X-aai_iP
+c-FZ4ci_\DdQ[Ljs&J\js&8nrr)<Sms&8npr)3_rFE;JCrc.sWs)7mSs)%dPrG2FJs(V@Drb)+?
+ok"&5rb)1Cs(VLJrbMOM!,_^Q+)c+<EH6,BFEMbNGBnL\H[U<kIt3*&K8#&8Ll%"JN:Bh8USOcb
+WN*&%YHY:<['mHS]"G_k^qmn+`Q-'BbKS8Xd*^=le^rI,g=tH>hr*JQj5f=akNM0qlg4!*mdKW6
+nac8BoCW%T!quB_rqQNhrqcQirqu`noDX=@K)^?~>
+JcC<$JcGHDoD\^erqu]ks8)ckrqQNfs7ZKcs7B%Wo()>?n*f]3m-O''l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZRhcHOJSaN)9<_SO"$]Xt_a[^EHIYck11Wi;nnUnaWVSt2@=R$O#$P5Er)gAfk*f`.o8
+VuO7&\Gs&;\Gs#K[C3f7]R,0[M3!pjUTCo7r4)a8qR-F4[f*W.[f3]5[/RK5[/[K,Zi[YB[/@?%
+[f3c4[emQ4\GE]6\Gs,4\G<]2])B2<](rl6\,Wl:\,*W6\c982\c989]DT>A^&PhF^\>PA_>;%D
+_uI[R`W*sUa8<mVa8<sXaT9Q-rlk>c!7(2^s3UenrmLbo!7_#!rn%&"s4R2$s4dS/s4m\3rnmb6
+!9*b5rT!q=rT4"@s6'IIrosOMm/?>Omf2bUnG_t\oCV_MrqHWlqYU3hdJlf)hTj3``P9'nYH"Fq
+URdpDS^#$_['?p>OG'dZb-IOsX`\8iCg1t2M/?'cK8>YRS"64E;c-OoN2ikVW0<I3Q^F/2St;XL
+UV[!.O8k=;^\knF^Au(J^[f)=^]&?TF8p:[EW9tXDuFSRD?"GNC]8)KC&2N?BD?*:BDZBAC&_rI
+C]A2ND>nDsDfB]9EcZ>EF`qtQG^4U]I!pEmJ:N6(K8#&8Ll%"JNK0(j^d"WlVl?\tXfen5Za@0M
+\[oGe^V@V%`5Td<aihoRcd:(geCE1&g"P3:h;@/LioB+]k3(sml0@X%mI'H3nF?MK!V>s_p&F^c
+p\jmeq>^<hqu-HkrUg)?s+:9$~>
+JcC<$JcGHDoD\^erqu]ks8)ckrqQNfs7ZKcs7B%Wo()>?n*f]3m-O''l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZRhcHOJSaN)9<_SO"$]Xt_a[^EHIYck11Wi;nnUnaWVSt2@=R$O#$P5CaBSH#/XSEPV!
+OT(CBO:I;3NHBqgC27d1H@1=!Nr+n;Nr>">OH9'pq2GB5rJU]7rf-l8pl5<4r/C]:nr<L+!0-i8
+rf?o;mZ7+(r/^]9s,m&;plYK9s,m>ErfQu;qiUf>rK7#@rK7)Bs-*;Bs-*ADs-*JIrfd;Frg!GJ
+rg3SLr0R8Is-`bO!1EhT!1WYOqORSVqk*n]pS%P[pS._aq5"(grMTXnri#mtri,ptql9^urN5q!
+rN?4*riuL/"gbSC[C*IA[g'@Q\\#Jf^AbqH_Z%LR`W*sWa8jB^bPo`cblZ2:chu/idJhSoe.L6Z
+^9a`0R[B;#NJN7=I=6Barc:#cOcG9SLOsSaKp.[OGAqt8:/+SW=C>cB7n.$$DJsW?G]u_K9h]JU
+JUr;iEH-&AG'A4UH?t"Us86d7DuPjrOo1CAOoCI@O8Ft4NrY:@FT6F^ErL(YDuahTDZ=SRD#J/K
+CB&#EB_uH;B)H<=B`;`GCAr#KC]J>ODBWq;EH-#?FEDYKGB\:WH?sseI=HctJqJ]0L51SAMN!OT
+nW,o1VPgDnXKAY0Z*UgG\%0)_]t_=u_SjF6aN;WLcHjkbe'uq"f@em4h;-uHiSrnYjlYail07L"
+m-X60n*olHncA@Srq6<b!;HHes7u]kr;6HjrVcBfJcC?%J,~>
+JcC<$JcGHDoD\^erqu]ks8)ckrqQNfs7ZKcs7B%Wo()>?n*f]3m-O''l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZRhcHOJSaN)9<_SO"$]Xt_a[^EHIYck11Wi;nnUnaWVSt2@=R$O#$P5J)U;#X;l;"IKH
+:B+Ak=8u>!=8u;36U4"+5XRk+84Z<F:JOVYr([5frD<Ggr_WJhqbR8gq,%&ds%WVk:f-s`r_EJf
+!_uNfohYBYr_NDfr)!Yp:JXe`:J^pas%iJds%WJdpJ(Z_nkT9]:\RWU:ZbIR:]=,h:[CpU;>sDl
+:]+#k:Jak`peLibqG?ubpJUfc!)ienqbm>js&&hor)3Pn!*&bm!*&nsrDir#<rQ+o<r5r%<``@)
+=BYW*qHEl&!F/k,>l7n'?N+=3@/j[7A,Tp<B)ZHCB`r*`BP;,XCAr#KC^+ZlD/O92EW1"VF8p>%
+F`D&&>#S6m8Ol0:5X.Fs4?5G_3_;k37R9:(6iKCm5s.1d2D61!.4Zo(2Dm?J2E3i^4[2;&2`Eo`
+7SE_Ps$@;b6q0U66psI48>`8^W2ZesX8]1WXfek2Yd(L>Za@-K\%&u[]">Vg^:q@s^qmn)_o0L4
+`lQ9Db0%oOc-FV\cd:%bd*U1ge,DQ04o87K<;]Yp;Z0Mo;Z'JmFT6F^ErL(YDuahTDZ=SRD#J/K
+CB&#EB_uH;B)H<=B`;`GCAr#KC]J>ODBa"<EH-#?FEDYKGB\:WH?sseI=HctJqJ]0L51SAMN!OT
+O7H46Uo(&hWiW>*Yd(OA[^WfY]Y2(p_8=.0a2lBGbg+P]dF6Uqf@S^0gYL]Ci8N\UjQ5Oekiq?s
+m-O--n*fc9rpg*]o`"O`p&Ojcq#C0iqY^6hr;HTdrdk*$s*t~>
+JcC<$JcGECo`"gfrqu]ks8)ckrV-Hgp@eLY:A"/Ko'u5=n*f]2m-Es$l0%3kjl>C[i8EJJgtUQ8
+f@JI$da?Fec-+8OaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hlUnXQTSsu19Q^*euqq:Vqs4RD(kGRm[
+&%8sSZ]htHIY!<7P*qo?Zi%?4\,*Q1[J.-/[JdK3[K!W6ZhUp-[/dT2[IUd)\,3W1\,Ei5\,No;
+\b3K/\bNc7\c',8\GWi9[K*f5\Gj&=](*?2](io7]E5d\^AYh@_#2%F_YD%K`;R[T`r*mR`rF*V
+a9B].bKJ,RrQP>fo?[E_s3^kprR1esec+/"fDF5#g%X2#g]#t0h;7#fhZD`piVMR4j8\3=jT+HB
+kPscGl2U&Klhp/Mmf2_VnF?MK"7u3Zp\spjq>:*grm^s5o]FcL`lPm3]s"H8UnaTQS=?(n`4E=]
+[',XI\&un$T7a5!G%#07F*rk#:elXuOcu9)TUf"Y<E#foW2Zb\Q2[*SSXuFHTqeF!s8.lW_"b\C
+_">D6^Ai?TFT6C^ErBtZE,T[nDZ=SRD#A)JCAqr1B`DfGCAhoLCi+%gD?4Zprc''$F*)MHG'A.T
+H?spcI=?ZrJV&N-KnbA>M2R=PNfT<co>!_jVl?\tXfen5Za@0M\[oGd^;%M$`5Td<aihoRcHste
+eCE.%g"P39h;7)JioB(\k2tmll0@U$mI'H3nF?&>o(2MQp&F^cp\jmeq>^<gqu6NlrU^#>s+C?%~>
+JcC<$JcGECo`"gfrqu]ks8)ckrV-Hgp@eLY:A"/Ko'u5=n*f]2m-Es$l0%3kjl>C[i8EJJgtUQ8
+f@JI$da?Fec-+8OaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hlUnXQTSsu19Q^*euqj[;Ls.0(XkC`>e
+&!)g4NH9hbBkqX/H$t0rN;S_:Nr"h1NqeS6N;\\7N;eh8N;/A4N9lQ"NW>(:NWG3$rf?o;nrEd4
+rf?f8r/^]9s,m)<pQ>B8s,m>ErfQu;qiUf>rK7#@rK7)Bs-*;Bs-*ADs-*JIrfd;Frg!GJrg3PK
+rKm>I!1E_O!1EhT!1WVNqjm\Wqk*k\pn@Y\pS._apn[tfrho^ns/?!uri,ptqlBaur2on"r3$1+
+Z*F;6!OK04[JdT7\-TXV]=bkm^qdec_YqCZ`Q#p<aN2KGbKKn/rltGg!RT0ld/VMmdS/03\?2Qt
+R$NepNJ<%7I!^!YF*)GiOc>3QLP'\dMNj9WG\;G9<_-"m='oQO7RUd!DK']@G]u\K9hg+fJ:W/g
+EH?8FGBnFZH@:1Vs8-^6OT1C@OSt=?P5^UAOSk1=Nq\V7FoHL_Er^7ZE<:)tDuFSRD?"GMC]8)J
+C$010C&VlGCBA<hD>nDRDfG\q+EDOFFEMbNGBeF[H[L6jIt3*%K7nr5LP^kGN/`jYOco<s6`-c\
+WiW>*Yd(OA[^WfY]Y(tn_8=.0a2lBGbg+M\dF-Opf%8U/gYCWAi8EVTj5oFckiq?slg4$,n*fc9
+nac8Bo`"O`p&Ojcq#C0iqYU0hr;HTcrdk*%s*t~>
+JcC<$JcGECo`"gfrqu]ks8)ckrV-Hgp@eLY:A"/Ko'u5=n*f]2m-Es$l0%3kjl>C[i8EJJgtUQ8
+f@JI$da?Fec-+8OaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hlUnXQTSsu19Q^*eur(d;hr_WYlo2"OE
+o2ZB'<``=&5XRk(6U=(/8OuJQ:&I`d:]=2g:]=2g;>O)h:]+#i:Jh!cs%WVk:f-s`r_EJf!)EAd
+s%`MgpeLfar)!8f"].uj:f'sc:B+,d:B+&f9_V9]:@h9]:&n)a:@h9D;#a>j:&n)V;#=,i;#a>h
+:]sQj:esm_:B"&c;#4&`;Ya5k;Z0Jj;YsAo;Gg<i;ZB\q<;KMn<;]bq<WZ?'<rQ+o<r?#*<``@)
+=BSd/=BYN)r`f2'r*B,)ra5\5!F]I:A,^$=B)cKJBPD0oBk_8XCAquSChmj(D/O92EW1"VF%:=f
+@Tuo39M@rE6pj4%4Ztke3]T2l84H$65s@Y&6UO.%3B/rS,9\Eh/2B+E2D[6N4?Yel6q'$n5!;S3
+8P2QA6UF1/77@,D6:a\EV5C/hW2ZesX/rD)Xfek2Yd(L>Za@-K\@B)\]">Vg^:q@t^qmk(_Sa=3
+a2lBEb08)Sc-FSZcd:%bd*U1hq`b$\q,R,fs&Jtrr_rhrr_rhpr_ri>rcJ0]!-8$X!cW'rrGMXP
+s(qUKrbDFHk@jm0rbDCI!c2^jrb_aTE;ji"EcZ>EF`qtQG^=[_I!pHnJ:W<)KS>/9M2@.LNK0'^
+P4MU>VPgDnXKAY0Z*UgG\%0)_]Y;.s_SjF6aN;WLcHaeadaZguf@em4gtgiFi8WeWjlY^hl07L!
+m-X60n*ol;o()DErq6<b!;HHes7u]kqtpBjrVc?eJcCB&J,~>
+JcC<$JcGECoD\^erqu]ks8)ckrqQNf!;?Eb:A"/Lo()>?n*f]3m-O''l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZOgcHOJRaN)9<_SO"$]Xt_a[^EHIYck11Wi;nnUnaWVSt):<R$O#$o@a&qs4RA'ri#.\
+o!\Y-[f3ZBOKs.YJr#DJQ^jqWrODj9qmQ@/pU:+0r3ZL3s0Vd3ppC(/!4;X2o!\J*r3lI2rODa6
+rO;j<oXOb.pq$F7rOVg7r3u^7!4Vg7rODp>n[\\2pq-F9!kl=^rP/*Br5&6Hpr!*Lrl+lVrQ"cS
+s2Y#X"j+p0bKS3/blH&[ci;AldJqYne,Rqsf)O@uf`0Y"g&Tn,h#H11hYuF4huMa3ir.m;jSe3?
+k5OQDkl9lKlKdd6mJlVSn,MnUncSOWp\4[^"8_rorRLoYmGQ:3`PfO(\$)g0USFENrgGde_Rd+Z
+ZEKLJ^r+=+Tnfq6Ip-B0:O7hU:Jlh#NK]m&TV#+Z<E,NfW2Z#FQ'Rc(St;UMUSO^"s8A#W_#V:H
+^\kn>^\5AEGBS.PFoHIaF)l="E<:)tDuFSRD>nALC]8)HC%5m8C&VlGC]A5ND>nDRDfG\q,][sJ
+FEMbNGBeCZH@($fIXcm!JqJ`1L51VBMi<XUO-,ThQ'M$X6`6o`X0&P/Z*UgG\%0&]]Y;.s_SjF5
+aN;WLc-F\`daZguf@\g3gtgiFi8N_VjlY^gl07L!m-O--n*fc9o()DEo`"Lbp@n=\q#C0hqY^6i
+r;HTcrdk*%s*t~>
+JcC<$JcGECoD\^erqu]ks8)ckrqQNf!;?Eb:A"/Lo()>?n*f]3m-O''l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZOgcHOJRaN)9<_SO"$]Xt_a[^EHIYck11Wi;nnUnaWVSt):<R$O#$opbuOr13_Tre0Ti
+nrNm4O8b.IEIqe9C2e6;H[g^*ooJg,pl530s,?u;qi(?1!0$9(o8`a0qN19/!0I2@pQ5<6qN1`>
+plP64r/gr@s-!ADplPB8r0%#@r0%#@rf[;FqNClBr0%)DrfmGHr075HrKdGLr0I8IqNq8Nqj@DO
+s-`qWoUPcKrLWnYs.K+[rM'%]!2TFe!2fanrM]^p!36$t!35pss/c+"r3$"%!3lI-s0D[2rO)U5
+$+ROV]"G_k^VIYa_>qLP`;dg^a2l?Db0%oNrlkAds3Chpcd0tbrm<mWdD*#eTpqC4O,\sKJ:;lk
+G&q\FF-ViHM2?t=F`*5!ObS0sKPFd[9O0qgASO_)@qBIpFEVqR84H?KH2`=&EH#o<FEVnSH?ssd
+I_Pg^D>nGOOSt7>OT1I@P5g[@OSk1>Nqn_=GBS.PFoHIaF)l="E<:)tDuFSRD>nALC]8)HC%5m8
+C&VlGC]A5ND>nDRDfG\q,][sJFEMbNGBeCZH@($fIXcm!JqJ`1L51VBMi<XUO-,ThQ'M$'6`6o`
+X0&P/Z*UgG\%0&]]Y;.s_SjF5aN;WLc-F\`daZguf@\g3gtgiFi8N_VjlY^gl07L!m-O--n*fc9
+o()DEo`"Lbp@n=\q#C0hqY^6ir;HTcrdk*%s*t~>
+JcC<$JcGECoD\^erqu]ks8)ckrqQNf!;?Eb;"XANo()>?n*f]3m-O''l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZOgcHOJRaN)9<_SO"$]Xt_a[^EHIYck11Wi;nnUnaWVSt):<R$O#$:J^g`mSE.DmoKHg
+!^8q:r^$fV7Rp$B9hkR]s%iVjr(m>hqbcu^r(m;es%rJds%`Pf!)EAds%`MgpeLibqb[2fs%r\j
+!DlSi:&n)c:B+&f9_V9]:@h9]:&n)`:@q?E;#a>j:&n)V;#=,i;#a>h:]O;j:]O;d:B+,d;#4&`
+;Ya5k;Z0Ji;Z'Gp;Gg<i;Z9Sp<;KPn<;fhr<rZ5$<rQ+o<r5r(<``@)=]nj/=oMS)>Q.h+>PMJ%
+?2.b*?NjhG@:E_VrFGq?#\RgbBkV0oBPI?Yr+cRSD/F00E,fo=rc<O1EbA]_;c6:]7RKO/5Wq7m
+3]]5\2b-G/76s1'6UF.(5s@=h3AE!(,V:T%1c[HL1c[WZ5!VP(2`Eoa8kMZI5XRk+77B[76q'R;
+8Yr5ZVP^8iW2ZetXK8P,Xfek2Yd(L>ZaI3M\@B)\]">Vg^:h7q^qmk(_Sa@5aN4D'#Kt?8bKS5U
+cMYuid*gA@55\IW<VKJk<W#hr;uTbr;uTYtGBS.PFoHIaF)l="E<:)tDuFSRD>nALC]8)HC%5m8
+C&VlGC]A5ND>nDRDfG\q,][sJFEMbNGBeCZH@($fIXcm!JqJ`1L51VBMi<XUO-,ThQ'M#@6`6o`
+X0&P/Z*UgG\%0&]]Y;.s_SjF5aN;WLc-F\`daZguf@\g3gtgiFi8N_VjlY^gl07L!m-O--n*fc9
+o()DEo`"Lbp@n=\q#C0hqY^6ir;HTcrdk*%s*t~>
+JcC<$JcGBBo`"gfrqu]ks8)ckrV-Hgp@eLY9_@rIo'u5<n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI$da?Cdc-+8NaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hlUnXQSSXZ(8Q^.-pr7_2(r7LnFm\fli
+qR-sC\$WQLDl@r/J;0#EQ(4\Rrj_s:r3lF/pU:+0r3ZL3!4;^2q6]q)o!\G)rO2R3qmcR5rO;j<
+oXOb.pq$F7rOVg7r3u^7!4Vg7rODp>n[\\2pq-F9!58BGrkJ0BrPA?Ipr!*Lrl+lVr5\]Ss2Y#X
+s2b;abPo`bc2Z)\ci;AldJhSmdf@nsf)O@uf`0Y!gATe.h;7#fhZD`piVMR3j8J*>k5OQDkl9lI
+lMg,ImJlVSmfDqJrpp*]!VZ9ep]UEir;HWIrtb@kfZ_CU^VmdgX/MhgTpqO>S'&[^\GicgXcnRW
+bJq2kLmO?k=\!d3G_:uJ;M'X\PF%i6T28E\<DoirWMl#FQC!r0StMgQUo(j*rK$ils1nKGrP8'?
+pV$WPrceBc!-S6^!crC&rG_mXDf>Pks)%aOqeQ+EoP+5<r+l=Ks)%^P/8oKHEH-#?F*)MHG'A.T
+H$XdaI=6QpJ:W<)KSG5:M2@.LNK9-_P*;/sQ^IK^6E-ucXfen5Za@0M\@K5a^;%M$_o9X:aihlP
+cHsteeC<($f\5'7h;7&IiT&tZk2tjjl0@U$m-X60n*ol<o(2JFrq-?dp\4X]s7u]kr;6HjrVcBf
+JcCB&J,~>
+JcC<$JcGBBo`"gfrqu]ks8)ckrV-Hgp@eLY:%\&Jo'u5<n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI$da?Cdc-+8NaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hlUnXQSSXZ(8Q^+*6S,]#VSbelRK^OKg
+OSt7>O:[J7NK0!,IqED1D0'lII=d:KO8"\0N<"q8MuS_9NV\UpNUi,-O8=t/NrY:@O8"b7O84n;
+Onb%4Oo1=@OoLUDOnb%8Oo1C@Oo1C?OoLUEPPUIBPPgUDPQ$gGPPpaGQ2HsJQi*0IQhm*LRJW?S
+R@9S6S+W<JSc,/WTDtSYU&C_[UB%+cV>mFmVu<RnW;rssWV`aqXSf4#Xob`.Y5GI'Yl:p-Z2h60
+[J[N6\I6!\]Y;.q^qmn)_o)Jls2P)Zs2Y5_b5TTabl5iecMc)gd/VKeb.+RLSsYh*OH#!GIXHEa
+F`h_HQB@2cLk^V5F`3>*Ob\9uEc,VX4^16U@VJ,!@qB=kF*2_R84c9F97VPDIW9=IFEMhRH?sse
+J%bm\D>TFmO8k=AOo:IBOnk+3NrXG(GQ2gdFo?C`F)l="E<:)tDu=MQD>nAKC]%r>C&D`DC]A5N
+D>e?'DfBZ8EH6,AFEDYKGB\:WH?sseI=?]sJV&N-L5(J?M2R=PO,oEdPEhH#R.cS-WN*#$Y->1;
+['mHR\\#Mg^VRe)`Q$!@bKJ/Ud*^:keCN7(g=k?<hV[8Mj5]4_k3(smlKdg'mI'H3nF?)?oCMVR
+o`Fj]p\jmeq>^<hqu-HkrUg)?s+C?%~>
+JcC<$JcGBBo`"gfrqu]ks8)ckrV-Hgp@eLY9_@rIo'u5<n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI$da?Cdc-+8NaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hlUnXQSSXZ(8Q^.PGqG?HQmS<RYpf.f'
+<E).K6:4+*6q'U98PT.Ys%iVjrD3Giqbcu^r(m;e!`)WhpeUobr_3AfqG7,drD3/_s%iPhs%rkp
+;,L0e:]*rf:\dcc:&[i\:&du[:]F/i:\IQU:ZbLR:]=)h:[CpT;?'Jl:]4)i:]=/j:\[]b:\mo`
+;>3ub;u]bo;>a>i;u]_q;>a>l;u]hn;ZKeq<W6&!=8u>#<VTVm<rc;#=8l>0=BSd1>$G37>$G50
+>QA(.>l7n,?3":0?N"47?t!MR@q5LK$>!g]BP;*oBPM6qqeH"DrbV^TE,bess)UqO@pE,59hS&H
+6UF"#4[)%j3B/ui84Q'85=%J#6:4%)4?5>Y0e=:l/1iJ23%m*F2``ua5=7dr2`<lZ91_`I6UF+-
+6q0X66q0^=USRmcs/$%!W2ZesX/rE%XV%_>YHY:;ZF.*L\@B)\]">VfrOiWS^qmn)_o9X9aN;TI
+rQ>8dc-?75rm(VmdeuB*<r,hk<;T\i<!#urGlDpeFoZ[`F96N(ErBtZE,T[mDZ=SQD#8#GC@l6<
+CA_lID#\ANDCf^FE,fl<F)uGFF`qtQG^4U]I!pElJ:N3&K7nu6LP^kGN/`mZOckonQC"!4;aRI`
+X0&P/Z*UgG\%&u\]Y;.s_Sa@4aN;WKc-F\`daZdtf@\g2gtgiEi8N_VjQ>UfkiqBum-O--n*fc9
+o()DDo`"Lbp@n=[q#C0iqY^6hr;HTdrdk*%s*t~>
+JcC<$JcGBBo`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nji6>n*f]3m-O$%l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfcHOJRaMu3;_SO"$]Xt_a[^EHIYck11Wi;nnUnaWUSt):<R$R<rr7_2(qq1M=pS[nt
+rjMX1rj30ADk<ADItEQ>Q'e2C[(-+ErO2L/pU:+0r3QO5[']h=ppBh(o!\G)rO2R3qmcR5rO;j<
+oXOb.q7?L7rOVg7r3u^7q7-C6!4q^2s18!;qn)pBrkABHp;$XCqSN$Frl"cSs2OuWqSrQUr5eo[
+!QrUbbl,cdcL]B]d/VMndf%VueCE.$f@TiNs4R2$!8IM.s4m\3rnmb6!9*e6r8[_:s5s=Ds60LI
+rp0LLrpBjVnF6GJ$hO#_p@n@Wq>1$frn7<An)Da:a2Pg/\#u^.UnjZPR@'Ga^pgYTZ*0IPXKT[f
+\Y=hIQ'GHCG"m.3Le^raK8G_TS=?0J;c$LnWN)qsPE_E"Q^s_@rhI()s,ZulrP8?Gr4r$@p:^TR
+G^043!d8^/rcJ0]s)S'Xs)A!VrGMUOrbV=EphKS>s(q[OrbhaS!-%pWs)KQ0FEDYKGB\:WH?spc
+I=6TqJ:W?*KSG5;M2I4MNK9-_P*;/sQ^F52SG9l^WiN8)Yd(O@[C3TU]=bkm^r"".`lQ6DbK\>Y
+dF-Lnf%8R.g>(N@hr*JQj5f=akNM0plg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Wirqu`noDX=@
+K`?Q~>
+JcC<$JcGBBo`"gfrquZjs8)ckrqQNf!;?Eb!VH!_njr<?n*f]3m-O$%l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfcHOJRaMu3;_SO"$]Xt_a[^EHIYck11Wi;nnUnaWUSt):<R$O98S,]#VSc##WS+D=-
+KDUc'O8k4LNF7$ZAnl1%FaAIeKoGhgpQ#!-!0$l7s,?u;r/:Z7N9#uiNr4t6OReG4OT(=9OSk18
+OT1I<OS=n8OT1ICP5^U=OSb1<P5UO@P5LIBP5gaBP5gaDP5gaFPl?mFPlI$HQN*<LQMd*GR/`TO
+QiNQRRK/iMSGJfTT)5/ZT_P5ZUA(G_V#$qfVZ3RmW;`drWrB!oX8f9uXT>T,riZ1&riuL/!OK03
+[JdQ<\@K2^]Y4<Zs2"`P!5ncR!li:$rl>2`b0/!-bl>ofcMZ#fcp5@RWM,iKPE1][K7JAuH?F:K
+Ec[J+NJWCDJp23fK9MIPH>.J<CI(*d6<I]/6V19gB5DO0G'QYM7nl^.JUr@NE<gQ-GBnL\I!rU+
+s)%atr/gf:!g&P,r0%#@qiLK3!dT$8rc\EeF`m\*s)\3\rGhjVs)7jRrb_XNpM9P=phTnGrb_XP
+s).mVrc.sY.<BTQF`qtQG^4U]H[L6iIt3'#K7ei3L5:\DMi<XVO-,ThQ'Rc(R[]iBO$'GCXfen5
+Za7'J\@K5a^;%J#_o9X:aND]NcHjnde'ut#f\5'7h;7&IiSrnYjlYail07O#m-X60n*olHncA@S
+rq6<b!;HHes7u]kqtpBjrVc?eJcCE'J,~>
+JcC<$JcGBBo`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nk&B@n*f]3m-O$%l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfcHOJRaMu3;_SO"$]Xt_a[^EHIYck11Wi;nnUnaWUSt):<R$LNDq,$$GpJ1Tdo2Q&q
+5X@e*5X@_(r^[2d9hnGZ:]=2i:]F8g;=dW^:]=)i:Jgd]!)EJe!)EDer_EGgp.kW`rD<Jj"&Mil
+;#=&d:&n)c:B+&f9__?]:@h9]:&n)`:@q?D:]O;j:&n)V;#=,i;#X8h:]O;j:]O;d:B"&c;#4&`
+;Ya5k;Z0Jj;YsAn;Gm?ir_ierqG[DnrDikur`9)#r`/_oqc<i"=',B(s&]8(r`T;+r`T;+pK[Z&
+rE]J0rEfJ1s'Yk9s'u%=%V96aB4tsmBkV6qBkhBsrbD@H!,VXO!cN$src24V?s-H.9h@iC69mdu
+5!:tf2`N`e84>s55s@_(69[\$4?>DY0eF@n/M8Y22_[-K3&s&`5<qUr2`Eo_91hcJ5XIh*6q'O4
+77KhBU8+K[V5C)dVPpGmWiE-!XT,C5Y-5(7ZEgjG[^WcV\[oAark/9E$GO9j_8=+/`l?'?rQ,,`
+bKKn/$-gc@cd:%dd69be<r,hn;uouur)NGi"&jJiGlDmgG'.s,FT6F^ErC"XE;skTDZ4MPD"h`?
+CA;TED#S;NDZ=VTE;jkWE[u3QFEMbNGBeCZH@($fI=HctJV/T.L5(M@MMmFQO,oEdPEhH#R$sM7
+;cENj4K>HaY->1;ZaI6O\\#Mg^VI_(`Q$!?b0/&TcdC1ieCN7(g=k?<hV[8MioB+]k3(sml0I^&
+mI'H3nF?MK!V>s_p&F^cp\jmeq>^<gqu6NlrU^#>s+LE&~>
+JcC<$JcG?Ao`"gfrqu]ks8)ckrV07ap@e1Po^qbGo'u5<n*]T0m-Es$ki_*jjQ#:Zi8<DIgtLK7
+f@JI#da?Cdc-+8Na2Q$8_SEq"]XkY_[^<BGYcb+/Wi2hlUS4?PSXZ(8Qh&i-gA]e&f^Pj9Vtdb$
+[K*`4Zk9XOZYPu>H@:@#NKBHtVm3_?r3lC.pU:+0qR$4-q6]n(o!\G)rO2R3qmcR5rO;j<osjh.
+q7?L7rOVg7r3u^7ppg=6!4q^2s18!;qn)pBrkA?GpV?aDqSN$Frl"cSs2OuWqSrQUr5eo["Nnp2
+bfp%1!7(2^rm:\ms3gho!7h)"!8%&!s4R2$!8IJ-!o;_irnde8iSjXmr8[b;s5s=Droa@HrTjCK
+s6fpUs7$'Zs76Qhp%J.Tq"agcrnIH3qWHY[aMu!7]sF]:V4sWOR[KSd_S!=_Z*:0hL:4q<^oFSs
+X,;F/8U=*RJr!-!:kOUfPan;<r_a;-<)]fqWK`U4QC")4Sti!S\c;\kpqcgBrkJEIp:p@9s*F]j
+!-nHd!d8^/rcJ0]s)S'Xs)A!VqelCMrG:q<rG;LNr,2OQ!-%pWs)KZ3FEDYJG'A.TH$Xd`I!pHn
+J:N6(K8#&7Ll%"IN/`mZOckonQC!u-S"-(Bq7o:sXfen4ZEpsI\@K5a]t_A"_o9U8aND]McHjnc
+e'uq"f@em4h;-uHi8WeXjlY^hl07L!m-O--n*fc9o()DEo`"Lbp@n=\q#:*hqY^6hr;HTcrdk*'
+s*t~>
+JcC<$JcG?Ao`"gfrqu]ks8)ckrV0:bp@e1Po^qbGo'u5<n*]T0m-Es$ki_*jjQ#:Zi8<DIgtLK7
+f@JI#da?Cdc-+8Na2Q$8_SEq"]XkY_[^<BGYcb+/Wi2hlUS4?PSXZ(8Q^m`<s.'"Xrg`kTn:^Xj
+plP93%uu^2?[.WDC2@j1G'ngnMu&M/Nq\M5N;\Y9N/`hpN;ne9N9#uiNr4t6OReG6OH5IsOSk17
+O8tF<OS=n8O8tFBP5^U=OSb1<P5UO@P5LIBP5gaBP5^[DP5^[FPl?mFPlI$HQN!6LQMd*FQiNQO
+QirhGR@9W;SGSlTT)5/[T_G/YUA1M`V#$qeV?!OmW;W[qWr8poX8]3uXTYf/Xfei)Y5kg+Z2_-0
+[/RH5[f3`G\@K2^]=bkm^VRb'_Sa:j`;djWa8X0[b5]ZabQ?&7cMZ!^cFL*SSsbn*OH,'HIsZKc
+FE;JCQB7,bLPCD0F)HhmO,JFADgZ5*69SL==^ku17n$p"D/aQ>H:URs:/+B4JUh`ZE,p&EH$=R\
+Hb'1VD>fUpOSY">OHG\(P5CC?OS4b8HN/6jGl;gfG'.s,FT6F^ErC"XE;skRDZ4MOD!u0<D#\AM
+DZ=VTE;jkWE\)9RFEM_LGB\:WH?spcI=?ZrJ:`E+Knb><M2I4MNK9-_P*;/sQ^F52S=ZAKO$ThK
+Y->.9ZaI6O\\#Mf^VI_(`Pom=b0/#ScdC.heCE1&g"P3:h;@/KioB+]k2tmll0@U$m-X60n*ol<
+o(2MGrq-?dp\4[^rqZTjr;6HjrVc?eJcCH(J,~>
+JcC<$JcG?Ao`"gfrqu]ks8)ckrV0=cp@e1Po^qbGo'u5<n*]T0m-Es$ki_*jjQ#:Zi8<DIgtLK7
+f@JI#da?Cdc-+8Na2Q$8_SEq"]XkY_[^<BGYcb+/Wi2hlUS4?PSXZ(8QVUEO;#X8g:]aEh;!LjQ
+:A@l_<=_8Z76j+*6psL78P;`P:J^sdr_NPjqbcu^r(m;e!DcPd:]F2g9`Rrc:]=,g:\IQ`:]4,h
+;>j>g:]*rf:\mic:&do]:&[oZ:\.?R:ZYCQ:]=)h:[CpT;?'Jl:\dfe:\[]a:\moa;>3ua;ZK_o
+;>X8h;u0Dk;ZKem;ZKeq<W?,!=8u>#<VTVm<rc;#=8lA&=9hu4>$G37>$Lo0!+#P.rETD.q-O&-
+s'Q7D@U`hWA7T7_AnG^irb2@Irb2CJC&VlECHlWPD/O92E,K/k=]/$i8Ol094$>Yf4?5D]3(ZS/
+6UF+'4[MG$5!_=m6oI"X.3'Zc/hSn</i>=A3BKDh5XbT1s#pcM8kDW?6UO7177R8F#"bM_U8+KZ
+rM:I1Vl6PnWiE,$XKAV-YHP18ZEpsI[^WcV\[oBO],J>q^;%J"_Sa=2`lH0AaiMTGb0.rNbfn>V
+cMl/ld69ba<r>to<;]bi<<%:EGlW*fG62r1FoHL_F8p:ZEW:"XDu4GOD>e;>C]/)LD>\;ODZFbU
+EW:&1F*)MHF`qtQG^4U]H[L6jIt3'$K7el4L5:\DMi<XVO-,ThQ'Rc(R[]h=TD;ANX0&P/Yd1UC
+[^`l[]Y2(q_Sa@3a2lEHbg+P^dF6Uqf@S^0gYL]Ci8EVTjQ5Odkiq?slg4!*mdKW6nac8Bo^r.U
+!quB_rqQKgs8)ZjrVZWmoDX=@L&ZZ~>
+JcC<$JcG?Ao`"gfrqu]krqcZjrqQNf!;?Eb!VH!_nji6>n*f]3m-Es$l0.9ljlGI]i8EJJgtUQ9
+f@JL%da?Fec-4AQaMu3;_SO"$]Xt_a[^EHIYck11Wi;nnUnXQTSt):<R+V#`qqD)'qUkbEm\p/q
+p:((1'Xb<TZa@'Dba5neI"I*3Od;Q6Xge8;pU0b(s0_^1rj2C,pU0V$qR?I4qR?=2rO;7*q76=4
+r42d;q7-@3s0h^4rj`$?rj`$?ost+6pq-F9!58BGrP/*BrPA?Ipr!*LrPefVr5\ZRs2Y#X"j+p0
+bKS3/c2Z)\ci2;kdJqYndf@qtec==sfDsV"gAfq,h#H11hYuF4huMa4ir%j9jo+?@kPscGl2L#H
+mJcPRmgejWo()DDo_/%Rq"adarnRNHn)Dj>aN(s1]!/35UnOBLR[BM`^UCGQYc<nC]Z.t4Xdk$I
+PET3eBn&p'K8`H';1j[fPan;<P>b@Z<E#osWKNI/Q^=)2StMdO\,Z*:qS3*Gr4r*BpV-ZSrd"Wk
+G^043s*"EbrcJ0]s)S'Xrc%mUqel=KnSJ/@r,2OQs)@sWs)J*\rcBZ5G'A.TH$Xd`I!pElIt3*%
+K7nr5LPUeEMi<XVO-,ThQ'Rc(R[]h=T:hnS^d,$)YHY==[C3TU]"G_k^r""-`Q-'BbKS8Xd*^=l
+e^rF+g=tE=hVd>Oj5]7`k3)!nlKdg'mI'H3nF?)?oCMVRo`Fj]p\jmeq>^<hqu-HkrU^#>s+UK'~>
+JcC<$JcG?Ao`"gfrqu]krqcZjrqQNf!;?Eb!VH!_nj`0=n*f]3m-Es$l0.9ljlGI]i8EJJgtUQ9
+f@JL%da?Fec-4AQaMu3;_SO"$]Xt_a[^EHIYck11Wi;nnUnXQTSt):<R.?aBSGJ`RKC4EbOSk.N
+NfT3ZW-*i+BPhU-G'e^lM#<>.NqSG4N;eb8N;nn8N;ne9N9-&iNr4t5ORnM7OH5IsOSk17O8tF<
+OSFt8O8tFBP5UO<OSk7=P5UO@P5LIBP5gaBP5^[DP5^[FPl6gFPl?sGQN*<LQMm0GQiNQOR/`TS
+RK/iLSGJfTT)5/[T`(PaUAU_`UA1M_V#."fV?!OmW;W^qWrB!sWrfB'X8]3rXo>L$YPk^.ZEppF
+rj<?H\$rlW]"5Mc]tV7s_84"*_u7LR`r=$XaT'E_bQ#fdc2Z'bcd'kQ[&TghQ]mGjMhH\1H?sdW
+F)u>bNf/aKKR\,_MiWs\J9GUUChc@7:L6@l@VJ/#7:]tHE--;MDb3Mp9hTtdJT5XJEHHAJG^=[_
+\,Z>fqN1W9s,[5Cr0$l<s,d#:s*O`k!dT$8rceBcs)n<_s)\3\rGhgUs)7dPr,(t?rGDIMs)7pV
+rc.sY!-A-].s6#ZGBeCZH@($fI=?ZrJV&N-KnbA=M2I4MNK9-_P*;/sQ^F52S=Z@GU&'g8Xfek3
+ZEpsI\@K2`]t_A"_o0O7aND]McHjkbe'uq"f@em4gtgiFi8WeWjlY^gl07L!m-O--n*fc9o()DD
+o`"Lbp@n=[q#C0iqY^6hr;HTcrdk*'s*t~>
+JcC<$JcG?Ao`"gfrqu]krqcZjrqQNf!;?Eb!VH!_njr<?n*f]3m-Es$l0.9ljlGI]i8EJJgtUQ9
+f@JL%da?Fec-4AQaMu3;_SO"$]Xt_a[^EHIYck11Wi;nnUnXQTSt):<QqpNP;#X8d;#a>h;#O/W
+:]FMi<r#`+<*)=P5<hP'6q9a<8P2cSr_WVjs%rSioMGE\s%`Si!)WDc!)EGd!)EGfrD*AgohPN_
+rD<MkrD<;cohPK\s%N/]r_E&\o1npRs%i\mkYM7Tr_<GhlqmRVr_WVjq,%)eq+glaqb[,dp/:`c
+s&/emr)3DjqbmDls&Ahns&Aqs!*9&"!*9)!!EN:u<r5r"<``B$=Tqo1>$>-7r`T;+r`fG/qcs,+
+!F/q+?N4C4?iXX7@fKs<A-HOVAnPdjrb2ONBk_<rC&VlICB/,KCNaN2D/X?*?s-K+:/"/I6pEq!
+4$5P`3B/rg7mod35<VA#5sdq(4#],Y0eXLo-nm8-2*!?K1H%3S4[22!6T6qd4uu>.83fL.5t".2
+7RT[7TV/!QU8+KZV50rbVPgAkWMunuWiN5&Y-5%5Z*LaF[^WcV\c')L]=bhj^;%J#_o0L4`l?'s
+a9]o1b0.uPc-=T5d-Xm4<Vobm<VTPnHiA<mH$FT5GQ2jdFoHL_F8p:ZEW0qWDu4GMD=MH@D>\;O
+DuXeUEW:%ZF8g83F`qtQG^4U]H[L6iIXcm!JqJ`1L51SAMMmFQO,oEdPEhH#R$sM7StD[LqGKS\
+Y-5(8ZaI6O\[oGe^VI_(`5Td<b0/#Scd:(geCE1&g"P39h;7)JioB(\k2tjkl0@U$m-X60n*ol<
+o(2JFrq-?dp\4X]s7u]kr;6HjrVc?eJcCH(J,~>
+JcC<$JcG?AoD\^erqu]ks8)ckrqQNf!;?Ebs7AqTo()>?n*f]3m-O''l0.<mjlGI]iS`VMh;$`;
+f[n^(e'cXicHOJSaN)9<_ns4(]tCqe\$iZMZ*:C5X/`+qUnaWVSt2@>f\#iLqV(u&q:G\Eqkrt_
+r4)I0s0`NIZa-mAOgBC]J:i`APae>G[/RN/[J%'/[JdH8[C!<IZhUp%[IUd&\,Ni7[fX(K\,*W5
+\*pj'\bNc6\c0/?\bWc5[fNqHppg=6!4q^2s18'=!kc.Wr4E$CrkA?GpV?^CqSN'GrP\]Srl4oW
+q8WHTr5eo[!QrUbbl,cdcL]B]d/VMndf%VqeCFQLpt,T"ptGc&s4db3gtgiDrnde8iSjXmrSmn=
+roO.Aroa=Fs69LJr9aLO&+B#Wo()DDo_%qPq"X^_rSIQJp>juRa2c$8^9OZ9Unj]RS!]Vb_Rm4]
+YHOj^K!3/6[@rAHT8d;gBRNTsJr!&r;LsRYOd)B-ThnZc<E3"tWi;t^PEqN$SXl@IU:1*k_=tb?
+^\GMFI=-EhrH\NjG^043s*"EbrH/'\s)S'Xrc%jTq/5hAq/64Ns)@pVs)J*\rcA0`G5c\8G^4U]
+H[L6iIXls"JqJ`1L51SAMN!LRO-#KePEhH#R$sM7St;UKUSOa`^cAU&ZEpsI\%0)_]t_A!_SjF6
+aN;WLcHaeadaZguf@\g3gtgiEi8N_VjQ>UfkiqBum-O--n*fc9rpg*]o`"O`pAamdq#C0hqY^6i
+r;?Nbrdk*(s*t~>
+JcC<$JcG?AoD\^erqu]ks8)ckrqQNf!;?Ebs7AkRo()>?n*f]3m-O''l0.<mjlGI]iS`VMh;$`;
+f[n^(e'cXicHOJSaN)9<_ns4(]tCqe\$iZMZ*:C5X/`+qUnaWVSt2@>n=09EqO7JRqLe<kooT$2
+&<;a0N,jP^B5;='Fa8CdLQ2:opQ"s,#)nIuN/WaUr/CW5!0$$!o8`^/plP-/s,d8ApQ5<6mZ@4+
+qiCf?rf[8CpQ5<8r0$u?rK@)@s-!DGqNCiAr0%)Ds-3JGrfmDIr0IALr0I8IqNq8NqNqDRR[T_8
+opklLrLWnYrh07a!2B@arM'+_rhKUlUnn!drMKLkrM]dsri#mtr2]dtr2g+)Xf\b/qlg"(s0D[3
+rO)X6%_0'\]=Y_h^VIY$_8=(,rP\]UrQ,#]!6bAc8'T?)ccEStV4O*@OH>KVJU`)oGBItJEg2ZE
+Mhd"<I;j%VOH5!=Bm+Q284cQ^6!.N,6UsXVA8#duFa&.&8P)ZO9RhVEJGsKlEclSOGC"VEs7qfP
+OT(:BOHG\(P4t+7NrsfXI!bg<!dT$8rceBcs)n9^s)\3\rGhgUrbqUMoPODAs)7pVrGhjX!-A-]
+!HiSbG:Ii_H?spcI=6QpJ:W<)KS>/9Ll%"JN/`m[OckonQC!u-S"-(ATV8-VV>H<6YHY==[C3QT
+]"G_k^qmn+`Q-'AbKS8Wd*^:ke^i@)g=tE=hV[8Mj5]4_k3(smlKdg'mI'H3nF?MK!V>s_p&Fac
+p\ssfq>U6gqu6NkrU^#>s+^Q(~>
+JcC<$JcG?AoD\^erqu]ks8)ckrqQNf!;?Ebs7AkRo()>?n*f]3m-O''l0.<mjlGI]iS`VMh;$`;
+f[n^(e'cXicHOJSaN)9<_ns4(]tCqe\$iZMZ*:C5X/`+qUnaWVSt2@>r_N8bs%i,\qG-QVr)`Sm
+qc+))5!hM#5X@b*7n6*D:B"&k:Jama;=m]_:]=)j:Jam_:]F2f9`Rrd:]4&g:\@K_:]4,i;>j>e
+:\@K^:&do]:&du]:BF9e:\.?R:ZYCQ:]=)h:[:jT;>sDl:\[`d:\[]a:\moa;>3ua;ZK_o;>a>h
+;u9Jk;ZKen;u]hq<<-(u=8Z(n<r?#$<``@)r`T8'!EiV*>Q7k,>PDD%?2n1*?N+:5?t!LC@K9p;
+A-HOVB4kmkrb2LMBk_<rrG)7Gs(i-]C1(7H;Gg1]7mfU,4oRPm4#o8[84Q*96:!dt6U<t(5<Ltc
+3&3-/,:+up/ho792DR'H3'9Ah5t(]2$9UL68kDTH5XIk*qaD'gTV/!PU8"EXUnji`VP^8iri,ms
+&$)e6Y-5(7ZEppG[^WcV\c0/I]=bhj^;%J#_Sa=k`=g22aN2EBaN;QHbKJ,RcHjh`d-=[2<Vobn
+<V]SrI=-EhrH\NjG^043s*"EbrH/'\s)S'Xrc%jTq/5hAq/64Ns)@pVs)J*\rcA0`G5c\8G^4U]
+H[L6iIXls"JqJ`1L51SAMN!LRO-#KePEhH#R$sM7St;UKUSOa`;)thaZEpsI\%0)_]t_A!_SjF6
+aN;WLcHaeadaZguf@\g3gtgiEi8N_VjQ>UfkiqBum-O--n*fc9rpg*]o`"O`pAamdq#C0hqY^6i
+r;?Nbrdk*(s*t~>
+JcC<$JcG<@o`"gfrqu]ks8)ckrV-Hgp@eLY9D%iHo'u5=n*f]2m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-+;PaMu3:_SO"$]Xt_a[^EHIYck11Wi2hlUnXQTSt);&f_*qngAfk*f`'S'f_q]E
+VtI"Z\G`l:[f3ZFZ#ZM*H@UU)NK]a%WO'%Aq6fn(s0_g4"LYVDZa9G6pU0V$q6pF6\$l7Es0r'<
+qRHL5n$r5)pq$C6rji*?q7-@3!OfK4\Gj#=](*?2])'#?]XtfR]`5\F^AYh?_#;+G_YM+J`;[aT
+`r*mR`rF*WaT'?_b00e.rQP>fo[!K_s3^kprR1esec+.pf`0Y#gAfq-g]ZBeh;-rehuDU7iVMR4
+irJ0>jo+?@k6'r4l0A96!:9[OrpKgT%IioYo(2JFp@e7Uq>:*Is%M_8d`KPL]>_@bWMcPeSXZ%8
+R)ZqMZE^X4ObLTr`keULNN72C=^lbPG(>B@:f2arLQ@UdSY2WQ;c-Oq<2ustWKWO3Q'[r2StMaa
+s6[Yt_"th?^A`Q\HiSNlH3/A:GlDpeG5l^`FT6F^Er9qVE;a_ADZ4SRE;aeVEWC1[FT6IdG'A.T
+H2`+<H[L6jIt3'#JqJ`1L51SAMN!LSO-#KePEhE"R$jG6St;UKUSO`aW;OFfYd1UB[^WfY]Y2%o
+_8=.0`lQ9FbK\>ZdF-Oof%8R.g>(N@hr*JQj5f=akNM0plKdg(mf)YZnF?)?oCV\So`Fj]p\jme
+q>^<hqu-HkrU^#>s+^Q(~>
+JcC<$JcG<@o`"gfrqu]ks8)ckrV-Hgp@eLY9D%iHo'u5=n*f]2m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-+;PaMu3:_SO"$]Xt_a[^EHIYck11Wi2hlUnXQTSt):=RdusESGSfTReMI-K^t6#
+Nt71XH$a.<D/aQ@H[pd-O,s$qp5K67Mi3OQNVe\6MZA_/N<"q/NUi,,O8+h/O8k=AO8"b6O7&,)
+Oo(4?OoCOCOnXt8Oo1C?Oo:I@OoLUDPPUIBPPgUDPQ-mGPQ$gGQ2HsJQiE?QQ^3s8Qhm'LRJN9N
+RJrWTS+W<KSbo#UTDtS`T`ChaU&C_]U].%jV50pdV>[7kVu<RmWW0!uW;rstWr]<&rN,drs/u:'
+!3lI-"1#8?[/RHC[^W`U\[oDb]Y2%o^qdec_>qLQ_uRgVa8X0[b5]ZabYQO/^9FQ.S=#P$OGedB
+IsQHaF)l;@PE(QXL4aqrDN0sCMgTkhHX'N;93X_b?tM\o87H(@D/aQ<G'QYN85;oRIt<0$E,T]9
+FE_qPH$Zmus,d#<plGT=OH>V&P5(1=OSk1=IK+ZpHi86lH$FT5GQ2jdFo?F^F8p:YEW0qUDsVB@
+DuO_SEW:%ZF8g:]FTcl3GBeE4H74,fI=?ZrJ:W<)KS>/9Ll%"JN/is\OckonQ'[l+S"-(ATV8-V
+V5L9iO#4)HZa@0M\[oGe^;%M$`5Ta;aihlPcHsteeC<($f\5'7h;7&IiSrnYjlYail07L!m-X6?
+mfr:Oo()DEo`"Lbp@n=[q#C0iqY^6hr;HTcrdk*(s*t~>
+JcC<$JcG<@o`"gfrqu]ks8)ckrV-Hgp@eLY9D%iHo'u5=n*f]2m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-+;PaMu3:_SO"$]Xt_a[^EHIYck11Wi2hlUnXQTSt)9G:Z>4F:A%ER=8Gr2<E)1L
+6:!e#6:=:68P;`R:esnaqGHo^r(m;e!)NSjpeUobr(R/dr(m8ds%i>`r_NGg!)`\kq+pZYr_<Dd
+pJ(Z_ohPWa:J^RWoM=RF!)NShs%huXqbdAis%iDd!)NAbr_NAeqGHubq,78kr)*Air)<JjrDW_q
+qc!MorDikur`9)#rD`l!=8Gtp<ruE(=T2J'=92Q.rEK;*!*fD,!*fA+s'>Y0!+#D,s'Gh8@:B.E
+s'u%="D)1XBP@BZs(VXMC2.J^CAVcqCh6mS<)HC_7n#d04Ztnh4?5G^3(HG,6pX"$6U=(.5X%4l
+2`366*[L_;.l0(62DR*I3'05e5=7dt2`Ei`4%i.:8jG^06UjL47RT\:T:_dLTq\9VU].(hV#dHk
+r2:R6WiE/&Y-5%5Z*L^D[^NZT\@K/]]">Vg]tV;]_?[us`5T^8a2\,!$cpH3b0%oOc-FV\d-"I.
+<W5tn<W#hqIK+ZpHi86lH$FT5GQ2jdFo?F^F8p:YEW0qUDsVB@DuO_SEW:%ZF8g:]FTcl3GBeE4
+H74,fI=?ZrJ:W<)KS>/9Ll%"JN/is\OckonQ'[l+S"-(ATV8-VV5L9i;)GM_Za@0M\[oGe^;%M$
+`5Ta;aihlPcHsteeC<($f\5'7h;7&IiSrnYjlYail07L!m-X6?mfr:Oo()DEo`"Lbp@n=[q#C0i
+qY^6hr;HTcrdk*(s*t~>
+JcC<$JcG<@o`"gfrVZTjs8)ckrqQNf!;?Eb9D%iIo()>?n*f]3m-O''l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZRhcHOJSaN)9<_SO%&]tCqe\$iZMZ*:C5Wi;nnUnaWVSt2A'f_*qlgABS%f`.iBVtd4[
+\Gs#N[^WWMZu;<2H[pd*N00BsVQRB'[Ips.[JdK4[K!T6ZhUp$[I^j&[fEl6\+[?3\*gd&\bNc6
+\c0/?\bWc5[fNqHppf_%s18'=!kc.Wr4N'Cs1\HHp;$XCqSN'GrP\ZRs2OuWq8NETr5eo["Nnp2
+bfp%1!7(2^rQtSls3gkp"4YlPf([esg&B\*g&9Y(gBHBegYCWArSIY6iVDL4j8\3>jo+?@kPj]G
+lMg)Lm/?>Nmf2_bnF?)?oCV_Lp@nCZqu,OS:%R>rc,IZ9a1nm\W2HA`S=,e3R)?MBZEUF/LoS)(
+`iYb_VMg%,8Td^IIYs%Z;1O=TOHZ''SY/eW;H?gs<N<!sOHPfnQ'[o1StMa_s6[Yt_"th@^&ie5
+If=`sI!^5>HN/9jGlDpeG5l^`FT6F]Er0kUE;FMLDYnAOE;X_UErU4[FT6I`G5c\>G^4U]H[L6i
+IXcluJqJ]/L5(J?M2I7NNfT9aP*;/sQ^F21S=Z=FTqeE[Vl6SpXT$!pZ*UgG\%0)^]Y;.s_Sa@4
+aN;TJc-FY_daQ^rf@\d1gYL]Ci8EVTj5oFckNV6rlg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Wi
+rqu`no)=4?L];l~>
+JcC<$JcG<@o`"gfrVZTjs8)ckrqQNf!;?Eb9D%iIo()>?n*f]3m-O''l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZRhcHOJSaN)9<_SO%&]tCqe\$iZMZ*:C5Wi;nnUnaWVSt2@>RdusESGSfSRe27-K^b*%
+Nt@;0NaR(GB5)4#Ed)k\K8GZ`NqSG9N/NXRNK*jprJLZ7oo/s1o8W=$r/^T6oT0$6s,Zo9r/^9-
+plYH8!0R8DrfQr:r/po?r/pr@r/q#Brfd2As-*ADs-*JIr0.,Es-<JI"dbO@Q^3s8Qhd!KRJW?S
+R@9P4S+W<JSc#)VTDtS`U&UkaU&Le^U\^edV>[7kVu<RlWW/t"WN)usX8K'oXT5O$YPk^-ZEpq:
+[K!`9\-fdY]=bej^VIY$_>_=N_uRdTa8a3]aiaV+s3)%n[]-!lR$<\pO+W"5I!KpYrc0<)Oc50Q
+Kn+SiK8beNIs5ONBO="g=@6+sAS=S)@Uj%eE,p&CH2^>H:JFPVJUi;iDfBZ9F*;bNH?uptr/g]9
+plPN<rK?o;rK.&?!e5ZJrd=iqH[Ga<s*=WhrceBcs)n9^s)\0[qf2USqJZ4JqeuIQr,MaWs)\0]
+s)e<brc^&@H$Xd`I!pElIt3'$K7ei3L51VBMN!LSO-#KePEhH#R$jG6St;UKUSO`aW2Zeurf9%D
+Za@0M\[oDc^;%M$_o9X:ai_fOcHjnde'uq"f\,!5h;-uHi8WeWjlY^gl07L!m-O--n*fc9rpg*]
+o`"O`p&Ojcq#C0iqYU0hr;HTbrdk*)s*t~>
+JcC<$JcG<@o`"gfrVZTjs8)ckrqQNf!;?Eb9D%iIo()>?n*f]3m-O''l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZRhcHOJSaN)9<_SO%&]tCqe\$iZMZ*:C5Wi;nnUnaWVSt2?H:\%?Y;>3oZ:A@WS=8c2"
+<=Mtm5tF7)6:F:47nH9Hr_WDfp/(W^r_<Ghr_WDds%`Gc!)EJgr([5fohPK^pe^`]p.kQ\s%N/]
+s%`5_!_uNeo1npRj\PqQr_EJhlqmRVs%r_kpeUrdpeLc`qb[,dpJUfcs&/emr)3Djr)3Gk!*&ho
+s&Anr!*9)#!*9%upK%,ls&f;(r`B2(>5hb+>5qh%>lS+/>QA(*?3FVC?t!LC@K9p;A--=SB)ZKC
+Ba&6cBkhBsrbDCI%qf6Q<DZ@\8Oc*85!:tj4oRDC2`O8qr^&M,4@2>#5sIFi2`<?=*%*9h/29%C
+2DR*I3''2e5=.as2E*c_4?H/,83fC+6UO=277BU5St>qRs.BFeU8%X^s.gR0VP^8iVl-JmWiE/&
+Xfek2Yd1UC[^NZT\@MUM#.qO]]tV:urke]Q'Z@u/`Q#p<`lH0Aai_cMc-=P[cdCfSr`/ttpf7>n
+!e5ZJrd=iqH[Ga<s*=WhrceBcs)n9^s)\0[qf2USqJZ4JqeuIQr,MaWs)\0]s)e<brc^&@H$Xd`
+I!pElIt3'$K7ei3L51VBMN!LSO-#KePEhH#R$jG6St;UKUSO`aW2Zeur_YY[Za@0M\[oDc^;%M$
+_o9X:ai_fOcHjnde'uq"f\,!5h;-uHi8WeWjlY^gl07L!m-O--n*fc9rpg*]o`"O`p&Ojcq#C0i
+qYU0hr;HTbrdk*)s*t~>
+JcC<$JcG9?o`"gfrqu]ks8)ckrV-Hgp@eLY"n_EWo'u5Kmm$4+m-Es$l0%3kjl>C\i8EJJgtUQ8
+f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYck10Wi2hlUnXQTSt,f4p=]2oqq:o"r20"^r3u4+
+s0iNI[EOf=I=$R$MNa?rTrYX![Igm-[JmQ4[K!T6Zh_!$[I^j&[fs4L\%&oVosk%2n$r2(qRQ^>
+])9,<\cB;:\GWf:[^Z%AmCE8.qRZgA]=\!Rs1SHHrP/'ArPA?Ipr!*LrPefVr5\WQs2Y)Zs2k;`
+!mAg3rQYAfo[!K_s3^kprR1o!e^i@(pt,T"rn7A*rS%8*"l.kegtgfbhuDU7iVMR5j8\3>jo+?@
+k6'r4l0A96!:9XNrpKgT%Is#[oCMVIp@n@Yqu$HTs%3.Ph9X-^_S*aqXJi(nU7RgAR?tq.[Bd$@
+WK)Y?_T03]LSCAn?#=CMDg7(r:JuXnLQ@UeS"H<L;GpIo<)orsWK<:,Q'I]'rgj+aZ2a1,pV?^A
+pqHcYs*k#trI"`pH[Ga<s*=WhrceBcs)n6]s)\0[qJl=MrbqXPqJlOUs)\0]s)e<brc\BfH2`,3
+H[L6iIXcm!JqJ]/L5(J?M2I7NNfT9aP*;/rQ^F21S=Q7ETq\?ZVl-MoXKAY@^pCDV\%&u\]Y;.r
+_Sa@4a2lEHbg+P]dF6Uqf@S^0gYCWAi8ESSj5f@bkNM0qlg4!*mdKW6naZ2@oCV\Jp%J+Rp\sse
+q>^<hqu-HkrU^#>s+gW)~>
+JcC<$JcG9?o`"gfrqu]ks8)ckrV-Hgp@eLY"n_EWo'u5Kmm$4+m-Es$l0%3kjl>C\i8EJJgtUQ8
+f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYck10Wi2hlUnXQTSt,eKo:,THqj[PQ!1Wn<nUpb#
+n<![2%?@6*K4ek5DK0fFIY*CMNqSG6N/NYoNW"h6MZA_0NW4t/NV8A6O,f7tO8"b.O8k:AO7n\6
+O6r&(Oo(4?OoCOCOnXt8Oo1C?Oo:I@OoLUDPPUIBPPgUDPQ$gFPQ$gHQ2?jNQ^3r(QBqH8q3V/M
+qj@AN!LfMNSGJfSScGG\T)t[ZU&Le`U&C_^U\^edV>[:kVuEXmWW0!uW;rstX8B!nXoGR%Y5kg+
+Z2_-0[/RK5\,Wu<\HKOW]Y2&Y^];4M_>qLQ_uRgVa8a3]aiaV+4NY1<V4X3COc>BVK7JDuH$47L
+EcI;'MM[(?I;s+ZNK/^<Bm4T-6r6`E<*NmI7n@&uB5DL-FE`"%84`_S$VQ&$JT#LGDfTrCGQ)jh
+rVlf's7qcOOnt1>Oo(=;Oo1=@JH(*!If4ZrI!^5>HN/9jGlDpeG5l^_FT6F]Er'eOE;jePE;FSS
+ErU4[FT6I`G5c[dG^9:7FF/C`I=?ZrJV&N,KSG5:M2@+KN/is\OckonQ'[l+S"-%@TV8*UV5L5j
+WiW>*O,pWS[^WcW]=bkm^r"".`lH0CbKS8Xd*^=le^rF+g=tE=hVd>Nj5]4_k3(smlKdg'mI'H3
+nF?&>o(2MGp%A%Pp\4[^rqZTjr;6HjrVc?eJcCN*J,~>
+JcC<$JcG9?o`"gfrqu]ks8)ckrV-Hgp@eLY"n_EWo'u5Kmm-:,m-Es$l0%3kjl>C\i8EJJgtUQ8
+f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYck10Wi2hlUnXQTSt&UH;#4&_;#F&X:Ae/]=8u;&
+;E[>F5Q=(T77Tj>8l&:Z;>*i`:]F/i:]4,c:B4/d9`Rre:]*rf:\@K_:\R]\:\IQ^9`Rl\:&dug
+:B45d:BF9e:\%9R:ZYCQ:]=,h:[CpT;?'Jl:]4)i:]=/j:\[]`:\mob;>*o`;ZK_o;>a>h;uKVk
+;u]hp;u]hp<<-)!=8u>#<W?)"=8Gtp<s2Q*=BSf+=92Q.rEK;*!*fD,!*fA+!+#S/!+#D,"CGPE
+@:B+D!+Z"=!G,mBB`;]GCAqrEC+j@;@9co4;+jPP6q'='4?GYf3BB,[7R][469[S#5sR_$4?>J]
+0e==m.4-Mu2)tRl(H+664[22!6T?t`4$Gbg8kDQ=5=.\(7/]Oh7%Bg=St;RHTV/!PU8"EWUnji`
+VPa?js/7$=WiN5'Xfnq4ZEgjF[^NZT\@K/]]">Vh^;%J!_8=(g_\0i(`5KX7`lH0Aai_fNc-=P[
+d,A%)<<-"n<W@ULIfOrrI0+eCHiA?kH2i-gGQ2jdFo6@]F8g4VEVXSQDu+GLEW:(ZF8g:]FT?Ua
+G6)r6rd&[5I!pElIt3*%K7ei3L51VBMN!LSO-#KePEhE"R$jG6SXuLJU84W`Vl?\tXfbMuZa@0M
+\@K5a^;%J#_o9X9aND]McHjkbe'uq"f@em4gtgiFi8N_VjQ>UfkiqBum-O--n*fc9nac8Bo^qhL
+p@e7TrqQKgs8)ZjrVZWmoDX=@L];l~>
+JcC<$JcG9?o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_njDs:n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZOgcHOJSaN)9<_SO"$]Y(hd\$iZMYck11Wi;nnUnaWVSt5l5o@`rnr7V##!8%%DoV_Mo
+osk%2&@T!PZ]CfPI=d*/O->m$WO2W3o="V)rjDI,p9jM#osY"4\$u%?s0qI,q76:3r42g<!4hp8
+r3l^8\+mK#\c98;]DoMD]DT>A^&PhF^\5JA_>;%D_u@UQ`W*sUa8*aTa8F$YaT9Q-rlk>c!7(5_
+rQtSlrmLep"OtuQf@TiNrn7>*s4RD*qV)&+h>Q71i;)C4j8S-=jo+?@kPj]GlMg)Lm/?>Nmf2_b
+nF?)@oCV\Jp\=U^r;GdX8FYQgbK.Z:`kARSVP^&[S=,b2R)6JBYct.+LTA/,`Mo;aWJP_"@sUgm
+Jr<9$:P=F^P*qf4T28E_<E<%tWMleYOcu&pQ^IcD!MZ6js8Be6_XbP;_#1tC^Aic`JH(*!If=cq
+I/eQmHN/9jGlDpeG5cX_FT-@\Ep.NBErU4ZFT6I`G5c^cG]J(UH@($fI=?ZrJ:W<)K8#&7LP^kG
+N/WdXOHG]iQ'I]'R@B_;StMdOUnsrdWN*&%Y->1H['d?P\\#Mf^VI_(`5Td<b0/#ScHsteeCE.%
+f\5'7h;7&IiSrnYjlYail07L!m-O--n*fc9o()DDo`"O`p&Ojcq#C0iqYU0hr;HTbrdk**s*t~>
+JcC<$JcG9?o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_njDs:n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZOgcHOJSaN)9<_SO"$]Y(hd\$iZMYck11Wi;nnUnaWVSt5kLo:,QGr1!YRs-s"=r.=Qn
+q2b31rf7SMNK%n'I;*D5E-6DQJ;&pWNrP(=Nqn\6N;eh8N;SS6N:r82N:`,&NWP9%Nr+n3OS+\+
+OSk1,OSFt8O8tFBP5^U;OSt=>P5LI@P5LIBP5^[AP5gaDP5gaFPl6gFPlI$GQN*9PQC%T:r0R8I
+!1E\N"IY^IS"',AqORPUqOde\!29@cr1X(`qP3k^!2]Xks/5jpql0Uq"KAE$X/l)urN-($rN-(&
+qlft'!j]/>rj<*A\%&rY\\#Me]tOB["2Vjk_u@RT`Q%nts2Z>)b0.].WM,iKP`ClcK7JGuH$FFP
+F)l8^N/<:BIsl3erf&(LF`)P=<'s>a6!7W15tFCRA8H1)FE`%%8OlNM97VSEJGsKjDfKlBGQ)jh
+HN!gArj;_!OSFt:OT(C=P5:=?OT0n2JH(*!If=cqI/eQmHN/9jGlDpeG5cX_FT-@\Ep.NBErU4Z
+FT6I`G5c^cG]J(UH@($fI=?ZrJ:W<)K8#&7LP^kGN/WdXOHG]iQ'I]'R@B_;StMdOUnsrdWN*&%
+Y->0l['d?P\\#Mf^VI_(`5Td<b0/#ScHsteeCE.%f\5'7h;7&IiSrnYjlYail07L!m-O--n*fc9
+o()DDo`"O`p&Ojcq#C0iqYU0hr;HTbrdk**s*t~>
+JcC<$JcG9?o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_njW*<n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZOgcHOJSaN)9<_SO"$]Y(hd\$iZMYck11Wi;nnUnaWVSt/YQnkf-Zp/(QZoM53_o2klk
+$p?pA5!VD%6q0[<9MG7Zs%i\mqG@#a!_uNerD<>ds%`Db!)EMhmnWjXpJCW\p.k-Ps%`5_!DZG\
+:A%EE:]O;j:B+,V;#=,i;#X8d:]O;d:Adob;#4&`;Ya5k;Z'Di;Z'Jl;YsDm<;]\p<;]br<rZ8$
+<WuK&<E<.%q,[>ns&]8(rE')'>5hb*>5_\+>Pq_+?2\".?27h,@/aU5@f9g<AnV*V!GQ<IC&_oJ
+C&ViRAR/D<;,0_T6:Cf<6TdLp3]K)Z3(?;&5X7Lq6:!k'5W^qa2_u^#,VCW#1H7'G0K(mO4[22!
+5r^e^5!M)$8P)N>5XIh*6q'L4779S7SGo)ZT)YG_TF.BeU8+HXUnji`VZ!FmW"5l.XKAV-YHY==
+Za@-K[^Z7G$G!aZ]=kqm^VI\%qn`r_`5KX7`lH0AaihiMbg"G[d,.mu<W@XLJH(*!If=cqI/eQm
+HN/9jGlDpeG5cX_FT-@\Ep.NBErU4ZFT6I`G5c^cG]J(UH@($fI=?ZrJ:W<)K8#&7LP^kGN/WdX
+OHG]iQ'I]'R@B_;StMdOUnsrdWN*&%Y->0.['d?P\\#Mf^VI_(`5Td<b0/#ScHsteeCE.%f\5'7
+h;7&IiSrnYjlYail07L!m-O--n*fc9o()DDo`"O`p&Ojcq#C0iqYU0hr;HTbrdk**s*t~>
+JcC<$JcG9?oD\^erqu]ks8)ckrV0+]p@e1Po^qbGo'u5<n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI$da?Fec-+8OaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hlUnXQTgA]arg%jA"g&0M&fCl*:VuO7#
+[edH9[^W`RZi7<?ELUusJ:rc>P*MZ8Xo>a*[K*f5[f3Z4[J.'$[I^j"\,Wr<\+R62\*gd%\bWi5
+\c95@\bWc5[fNqHpUKY%s18'=s1A?Dr4N'Cs1\HHp;$XCqSN$Frl"cSrl4lVq8NETr5eo["Nnp2
+bfp%1!7(2^rQtSls3gkps4.,#qUkf#s4[M+rn@5'!o2Vgrnm_5!9*e6s5X+>roO+@roXRNl07Ku
+lg*p(rU'UPs6p!Xs7?9_#PIfcq>:*grosGHq;g>V`lGp1]X+Z:VP9]SR@0D/`4radYcascK"JtB
+\=nSDP_E.JFA$\)LeCQ@It`lFR%9kA:f:.j<)TaqW=5#TQ'IT"R\$+CU7e6`rr^*S_SQ/eo>17<
+qS2m@s+:9%rdY'"IX_9Es*Xinrd+Tis*4Kds*"Ebr,hmYrGqFJrGqpZr,hs]!-\?cs*+Nhrd&=+
+I!pElIt3'#JqJ`1L5(M@M2R=ONfT9aP*;/rQ^F21S"6.DTq\?YVPgDnX0&P/Z*L^D[^`lZ]Y2(q
+_8=.0a2lBGbg"G[dF-Oof%8R-g=tH>hr*JQj5f=ak3)!nlKdg'mI'H3nF?MK!V>s_p&Facp\ssf
+q>U6gqu-HkrU^#>s+p]*~>
+JcC<$JcG9?oD\^erqu]ks8)ckrV0(\p@e1Po^qbGo'u5<n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI$da?Fec-+8OaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hlUnXQTn!j-Cr1!YRrgWe9r.=]rooJs2
+"HSY+O,a.!$t+?dB52:%FE`(^KSfPcs,@#=qi(]<NJrhpNW+n6MZA_1NW+n/NV/>3NrY4;O8"b/
+O7SJ2O6r&(Oo(4?OoCOCOnOn7Oo:I@Oo1C@OoCODPPUIBPPgUCPQ-mFPQ-mHQ2?jIQi*0IQhm'L
+RJN9NRJrWTS+`BJSc55VTDtPaU&C__U&C__U\U_cV>d@kVuN^mWW0!uW;rstX8B!sXT5I#XT5O%
+Y5kg*YlV2<rj?gU\%&rY\[oDc]tM.q_8*n'_Sa:0`5T^8a2c9Bai1`kV4F$?OH,9RJU`,qG^"7N
+EH75&MM[%>I;s([NfSm=BQJ$"5YP3F<aTE(7RgitCMn07G'Z\M7SQTLIt3*#E,fi8EcZDKG^4R\
+I/Np@rVlf's7;?IOoLOBOnY%;OoCIBK)^E$J-(4LIf=cqI/eQmHN/9jGl;jdG5l^_FT$:ZEq+/J
+ErU4YFT6I`G5c^cGQ<$gH>7eSI=6QoJ:N3&K7nr5L5:\CMi<UTO-#KePEhE"R$jG5SXuLJU84T^
+Vl?\sXfen5ZEpsI\@K2`]t_A!_SjF6aN;WLc-F\`daZdtf@\d1gYL]Ci8N\UjQ5OdkNV6rlg4!*
+mdKW6nc&([oCW%Ts7ZKerqQNhrqcQirVZWmoDX=@M#Vu~>
+JcC<$JcG9?oD\^erqu]ks8)ckrV0(\p@e1Po^qbGo'u5<n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI$da?Fec-+8OaMu3:_SEq"]XkY_[^<BGYcb+/Wi2hlUnXQTr_N)]q,-f]p.b<WoiCfgr)O4j
+68q1o5sn%17nH9HqGI8h!)`ShqG.,e:]+&c:B4/c9`Rrf:[_'X:]+#h:]4,b:\IQR:&du]:B=3d
+nP8aQj\PqQr_EJhlqmRVr_WVjq,%)eq+gi`qb[,dpJUfcs&/emr)3Djr_iSk!*&kps&Anrs&T/$
+s&K>(<)lq!<`f,uq,[T!=o;A%>5_\*>5__+>PMJ'?2n42?2\(1?XWh@raH(AA7]:_AnV*Vqe?(F
+s(Ou2>#nKs9hIrE6U!Xp4?Ybd3&rof770I/5!D:u5X@Xt3B/rP//ore/h8Y70/YRB3''/d5=7as
+2`<i`3(lh68jG[05sn'=70l:M8Xl3>S=Q5MT)YG_TEq6cTq\9VUnspdV@TT'W2ZhuXKAV-Yd(L?
+['fnAs0i0A\[oAa^&G_a^VI\%_SO+*_SX4/`5Ta:a2lBEb0.uQcd0tm<r,hrK)^E$J-(4LIf=cq
+I/eQmHN/9jGl;jdG5l^_FT$:ZEq+/JErU4YFT6I`G5c^cGQ<$gH>7eSI=6QoJ:N3&K7nr5L5:\C
+Mi<UTO-#KePEhE"R$jG5SXuLJU84T^Vl?\sXfen5ZEpsI\@K2`]t_A!_SjF6aN;WLc-F\`daZdt
+f@\d1gYL]Ci8N\UjQ5OdkNV6rlg4!*mdKW6nc&([oCW%Ts7ZKerqQNhrqcQirVZWmoDX=@M#Vu~>
+JcC<$JcG6>o`"gfrqu]krqZWjrV6Ee!;?Eb!VH!_njDs:n*f]3m-O$%l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOgcHOJRaN)9<_SO"$]Xt_a[^EHIYck11Wi;nnUnaWVg=ZAWr7LDir7M&$!8-n?qksA$
+s0ha2!4Md6'"53T[BXS8OaDV3L5V4\S"QdgqR-C5qmHL4rj;X3pU'Y%o="G'!k>_Kn[JS.m^W,(
+pq$=4s1/3@q7-@3!OfK3\F-p-](rr=]Y"*Ss1SHHrP/$@rk\HJpr!'Krl+lVr5\WQs2Y)Zs2bDd
+bKJ,RrQYAfo[!K_s3^kprR1esec+1sf_sJ'gA]e)gA9P)gtr%frS[M2!9=%=roO+@roXCIl07L4
+lN$;MmJcPRmg\dVo(2JFo_%tSqY^<klMj$7i7-#l`P0@)YGe@rTq7aBR$j8X]XG&KX/UlNZbXMY
+RZ48$EEQn%9m;>M:JlRnLlmmlR\*AR;,pRnWrAptPEPp1#a_$PStD^MUSP!k!5\ZOs24cOotgI>
+qS2pAre(6&!.k*!!e5ZJrdFfos*O`ks*=WhrHJ9brcS*[r,_IMrH%jXs)n?brc`1'H$O^^H[L3h
+I=?ZrJ:W?*KS>/8Ll$tHN/WdXOHG]iQ'I]'R@B\:StD^NUSOcbW2co#Y-5(8ZaI6N\[oGe^;%M$
+`5Ta;ai_fOcHjnce'uq"f@em4gtgiFi8N_VjQ>Ufkiq?tm-O--rpL'\nac8BoCW%Ts7QHerV6Eg
+s8)Wirqu]moDX=@M>r)~>
+JcC<$JcG6>o`"gfrqu]krqZWjrV6Ee!;?Eb!VH!_nj2g8n*f]3m-O$%l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOgcHOJRaN)9<_SO"$]Xt_a[^EHIYck11Wi;nnUnaWVn!j-Cr1!YRrgNnXr.=lur.=fu
+nrNX/s,R_OO,RIhEG'$'DfKrII=[-2rJpo;s,Qu9"-/A"N;eh8N;JM5N;&>2N:i2*NWP9%Nq\V/
+OSOq>OH5Kao8rm2rf@,@nW<O.qiCf?rf[8Cp5o37rK@)@r0%#@rf[;FqNCiArK@/Ds-3GFs-3MJ
+qj%5Kr0I8IqNq8NqO%8M!LfMPSG8ZST(noZTV8(YU&gs^rLs1aqP4%c!2KLg!2][lrhodpqPa\!
+WMuntX/l)uriQ4%rN-(&ql^"(rilL0Zi.9J[^`iX\[oDc]Y2%o_8*n'_SX4.`5KX7rl77E^Tj`1
+SX,P$OGngBIX66`FE2GCE0?0;L4au(DLdG"NIH"fH=]uA9O0tgA8+M'@:NqdE-$/I84Z3E9hU!8
+J-Bk1DfKf?rc\KjH@(!drVZ]os8KD*n<!@+pQGH:!0I24s+16%rI=s!IX_9Es*Xinrd+Tis*4Kd
+s*"BaqfMaWo5aeNqfMj\s*"BcCj:5NH?spcI!pElIt3'#K7ei2L5(M@M2R=ONfT9aP*;/rQ^F21
+S"6.CTq\<XVPgAmX0&P.Yd1UC[^WfY]Y2%o_8=.0`lQ9EbK\>YdF$Fme^rF+g=tE=hVd>Nj5]4_
+k3(sml0I^&mI'uB#4V0Ro(2JFrq6<b!;HHes7u]kqtpBjr;H6dJcCT,J,~>
+JcC<$JcG6>o`"gfrqu]krqZWjrV6Ee!;?Eb!VH!_nj2g8n*f]3m-O$%l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOgcHOJRaN)9<_SO"$]Xt_a[^EHIYck11Wi;nnUnaWVrD29Ho1f*WnlGQfrDj@k5WM(n
+5XIh-84Q9H:&Rrh;#aDh;#!ia;#=&g:AITc:/=[S:B"&d:]O;j;"mcZ:@V$Y:@q<_:/CCTohX[G
+!)NShs%huXqbd>hs%iDd!)NDcr(m/cqbd&bq,78krDEGir)3Yp;c<Nl"&r2u<;fbq<;T\q<XDi.
+<`N*u<E<.%qH!DnqH*c$>5_Y+>$Lu2s',5&s'5\4?![D8!+5\5raPn;#A%FWAS5XhB_uNDC.Dc?
+=&`$k8P)695X.Fn4?PY`3]8ia770F.5!2.t5<qCn2`<QL,9J6e/2/q@1c$sJ3BKAf5X[Oi2Ej;b
+91_ZH5sdq+6:CfAs$QoX8P8rMs-s%Ys.97_s.BUjU7n<UUSO^bV>mFmVuN\3WiN2%Xfen5ZEpmE
+[C3KO\$rlX]">VgrkABHs1nWMs2"lU`5KXo`sKi/ai_iOcHjkbgK+2Ore(6&!.k*!!e5ZJrdFfo
+s*O`ks*=WhrHJ9brcS*[r,_IMrH%jXs)n?brc`1'H$O^^H[L3hI=?ZrJ:W?*KS>/8Ll$tHN/WdX
+OHG]iQ'I]'R@B\:StD^NUSOcbW2co#Y-5(8ZaI6N\[oGe^;%M$`5Ta;ai_fOcHjnce'uq"f@em4
+gtgiFi8N_VjQ>Ufkiq?tm-O--rpL'\nac8BoCW%Ts7QHerV6Egs8)Wirqu]moDX=@M>r)~>
+JcC<$JcG6>o`"gfrVZTjs8)ckrqQNf!;?Eb8+cEEo()>?n*f]3m-O''l0.<mk2bR_iS`VMh;$`<
+f[n^(e'cXicHXPTaN2B?_ns4(]tCqe\$iZMZ*:C5X/`+rV50iZg\fb&f^7AffDsOmVZ3Ri\,Ni3
+[JmW6[1K[MZETI-H@:F#MN*daT;8Xf[f<i7[f<c8[/@?3ZiIN2[.Uj#[K<qH[eR?3\,a#.\,a#+
+\GNi2])&u;\cB;:\GWf:[^Z"@m^`A/q7?[?]DT>A^&PhF^\,DA_>1tD_u7OQ`W!mTa8!XSa8X0Z
+aoBK`bPo`ablH&]ci)5jdJhSndfItKrn%#!rRh2)rn7;)rn@G,rn@M0h;8.grnme8qVhM8r8dn>
+r9"%B#jCO;lK[^$m-O]<s6fpUs6pEeoCMVHp%J4Xqu$EZs%i=Hg!%IU^qm^iX/MniT:VF<R$j;Y
+^9t2LXK%,/Yee8[SUmDdF')q#:3VDM:JlRmLlmsnStAhV:K:;NWMleoP*D5rQ^XM;TV8$RV5C<n
+s2"]Or58QOotgL?pqQdA!el;\rdt9(JV!fNs*t&trdFfo!.4Zjs*=WhrHJ6arcS$Yo5jbMs)n?b
+rHA<fH$TC8CjUPXI=?ZrJ:W<)K7nr5LPUeDMi<UTO-#KePEhE"R$jD4SXuIITqeE\Vl6VrXKA\1
+ZEppH\%0&]]Y;.r_Sa@4a2lEHbg+P]dF-Opf%8R.g>(N@hr*JQj5f=ak32'olKdg'mI'H3nF?MK
+#kR]\p%A%Pp\4X]s7u]kqtpBjrVc<dJcCW-J,~>
+JcC<$JcG6>o`"gfrVZTjs8)ckrqQNf!;?Eb8G)NFo()>?n*f]3m-O''l0.<mk2bR_iS`VMh;$`<
+f[n^(e'cXicHXPTaN2B?_ns4(]tCqe\$iZMZ*:C5X/`+rV50iZS=K)<qOIJQrL*_UrgWtXn:L[m
+mZ7@/rf7VNNK&m;=_;DbD/sfEI"?s.rf-u<rf6l8!fi8!rJgc7qhkH5pl562pl,?8NK*^ns,R/?
+pQ,'1q2YQ<O7A>0O8k=AO7JD,Oo(4?OoCOCOnOn7Oo:I@Oo1C@OoCODPPUIAPPp[DPQ-mFPQ-mH
+Q2?jNQ^3r(QBqH8nsKEE!h,UJpmh,MrgrnWs.B@cr1a.`rM'.`rhKOhrM9Iis/,am!3#an!36$t
+s/Q+"qlKe!s/c.#!3Z7'!3lI-!j]/>rj<0C\%&uZ]"5Pe]tM.qrP8QP_o)Jl<Q2tu_R?J?SX5V&
+NJiOCJ9uTdG&q\EE,q,$M2$_7I;`nSNK/L3Ap%Wa6;(TM=^u/87q#nADK'Z?H:LIp9hfMUJUi5h
+DfKf>G'J4VH@(!gJ,9'Ar;QZprjDdpOS+b1P5ULEKnP-YK*$XUJc:3"J,ausIK+ZpHi89jH2i-f
+GQ)dbFnp.NF8C"YFoQX`G63#7H2`,+H[L6iIXcluJV&N,KS>/9Ll$tHN/WdXOHG]iQ'I]'R@9V9
+StD^MUSOcbW2co"Xfnt7Za@0M\[f>b^;%J#_o9X9aND]McHjkbdaZguf@\g2gtgiEi8N\UjQ5Od
+kiq?slg4!*mdKW6nc&(boCV\Jp%J+Rp\jmeq>^<gqu6NlrUTr=s,-i,~>
+JcC<$JcG6>o`"gfrVZTjs8)ckrqQNf!;?Eb7eH<Do()>?n*f]3m-O''l0.<mk2bR_iS`VMh;$`<
+f[n^(e'cXicHXPTaN2B?_ns4(]tCqe\$iZMZ*:C5X/`+rV50iZr_NMir(lcX!)N>cn4ipXmT03d
+rDj=i2aBJk5t".37n?3Hr_WYlr_`Mgq+h#f;>j>g:B4/b9`e'c:]!le:\IQ^:]=/l:Jajd;"mcY
+:@_*Z:@q<_:/CCTohX[G!)NShs%huXqbd>hs%iDd!)NAbr(m2dqbd&bq,78kr)*AiqGRAlr)3bu
+;cH^p<;oer<;T\q<XMo/<`N*u<E3(#=8Gtn<rlE+r`B8(=B\o->6.o3r`oG,pKRf+?<pk8?3+D@
+rF,\7!+Yt=!G6!DB`DdHBPD0l?WpE+:eO;I770:'4?G\f3&irW2+Bu#6U<q!6U3k%5<Cha2D-<t
+,VL`'1cR<J1cRKV4[DG$3&`c[4@Vn58kD676:+(.77K[67S$3FR$mrBrgWqXs.(:(T:_dLTqS3T
+USO]^V5C)dVl-JnX/i>(Y->19ZEpmErj<<G\$rlX]">Vg^:q:p^VIV"rkScT_o'F3`r=!aaN;QI
+c-=P\d+MIu<<@l-K`6T*Jq8LPJH(-!If=cqHiSNlHN/9jGl;jcG5cX[FRsSMFT6L`G5ZUdG^4T6
+H>IqUI=6QoJ:N3&K7ei2L51SAM2R=ONfT9aP*;/rQ^F20S"6.CTqS6WVPgAmX/rG,Yd1UB[^WfX
+]=bkm^r"".`lH0CbKS8Xd*^:ke^i@)g=k?<hV[8MioB+]k2tmll0@U$m-X60n*olHnd+jZo_%nN
+p@n=[q#C0iqYU0hr;HTbrdk*,s*t~>
+JcC<$JcG3=o`"gfrqu]ks8)ckrV6Ee!;?Eb!VH!_nj2g8n*f]3m-Es$l0.9ljlGI]i8EMKh:pZ:
+f@SR&e'ZOfcHOJRaN)9<_SO"$]Xt_a[^EHIYck11Wi;nnUnaX<r7V##mFhNlrRq5'!S>ojV?"(!
+\,Ni4[JmQ5Zi@9?Y@q`jIY!<3N00BqTrYR"[f<i7[f<`8[/792ZiIN2[.Uj#[K<qH[emN;\@8rW
+\@:>)qRQ@3qml^;!4hp8qR?4/m^`>.qRcU:s1SHHrP/$@rPA?Iq8<0LrPefVr5\WQs2Y,[rlP2_
+!6bAcrQP>fo?[B^s3^kprmLque^j`Oqq1i"!8@G*rn@5'!SlQ2hu2L/ir%m:jo+?@k6L58l0@R"
+lg4T;s6fpUs6pEdo(2JFo_/%Tqu$E[rt+GPe'#eN^rEg`W2QMaT:),HQmoqg\[J`GXK.20ZG+>^
+SUmPkG#i$t9Qu,I:JuXmLQIdkSY&_V:fUDarhp9iP*D5tR@TqATqS6XVPsOp_>_=J_tCkB_"b\C
+^''1EKnP-YK*$XUJc:3"IfOrrIK+ZpHi89jH2i-eGQ)dbFm=)JFoQX`GQ2mfH2`,2H[L3hI=?Zr
+J:W<)K7nr5LPUeDMi<UTO-#KePE_?!R$jD4SXuIITqeE[Vl6VqXKA\1Z*UgG\%&u\]Y;.r_Sa=2
+a2lBGbg"G[dF-Oof%8R-g=tH>hr*GPj5]7`k3(smlKdg'mI'H3nF5u=o(2JFrq6<b!;HHes7u]k
+qtpBjr;H6dJcCW-J,~>
+JcC<$JcG3=o`"gfrqu]ks8)ckrV6Ee!;?Eb!VH!_nj)a7n*f]3m-Es$l0.9ljlGI]i8EMKh:pZ:
+f@SR&e'ZOfcHOJRaN)9<_SO"$]Xt_a[^EHIYck11Wi;nnUnaX^SFW0GSG\iVRf&ZTSH#)HJcLhu
+O8P%<N"CnI=B]BQCi4<;H@CBuN/insNr4n:Nr4n7N;JM5N;/D1N;8G7NfB%nNrP.?Nqe\0OSY%;
+O8t@3OSk1>OT(=4OS=n7O8tFBP5^U;OSk7>P5LI?P5UOBP5gaBP5^[CP5gaGPl$[EPlI$DQ3*D=
+QMd*GQiNQMR/`TSRK/iPSG/TRT)##YTE(\_UAgkaUACYbU]@1fU]RBiVZ!CmW:m4jWrK-rXT,F%
+XSo:$Y5GI,Yd(I=ZEsP<s0`HI\[f;_]=bhj^;%M$_8=(g_u@Re`Oi=OTUM42Nf]*LIslZgGBIp)
+E]]DDMi*:BJ:2?PKoD%BG%Pr1=?oJ`6<Rf47n@&uB5MU/Fa?PJ7SQU'J:W5hEH#o=G'A1UH@(!f
+J,0*?!;lcns8Drr[K#]Woo]!3rK.5;KnY25rdt9(JV!fNs*k#trI+]n!.4Zjs*=Whr-/-`rcRLJ
+rcS6arHJ9d!."QiF*i:^I=6QoJ:N3&K7ei2L51SAM2R=ONfT9aP*;,qQ^F20S"6.CTqS6WV5L8l
+WiW>+Yd(OA[^WcW]=bkm^r""-`Q-'AbKS5Vd*^:keCN7(g"P3:h;@/KioB(\k2tjjl0@U$m-X60
+n*oi:o()DDo`"O`p&Ojcq#C0iqYU0hr;?Nbrdk*,s*t~>
+JcC<$JcG3=o`"gfrqu]ks8)ckrV6Ee!;?Eb!VH!_nj)a7n*f]3m-Es$l0.9ljlGI]i8EMKh:pZ:
+f@SR&e'ZOfcHOJRaN)9<_SO"$]Xt_a[^EHIYck11Wi;nnUnaX\:]=,`:\mod:\IWQ9`S2Y<r>r.
+2`<NV5X7\'7S$*C9hnP^r_`MgqG7,f!)`\kr(m>fpe:ca:\mfd:\d`e:JO[`:]=2h:]F8d:\@KQ
+9`Rr\:[_'O:ZYCQ:]=,h:[:jS;?'Jm:\[`d:\[]_:]!ub;>3ua;u]bo;>a>g;ZK_n;u]es;uTbq
+;ZKen<W,qu<W5r"<E<.%qH!Dn!E`M(=9DW,=^(],s'5S.!*],%r*B8-!+5\5raH(AA7]@aAnV*V
+rb4c6@9ci3:eaMO6:4%&4$>Yf2`EWQ2+Bu%6U<q#4@;D"5X.=i2`338*$['f/i5OF1c.-O3^,eq
+69$n_5!2G/84l-5r^-u[77BU57S$0EQN!3NR/WKSR[a;Hs.'LgT:_dMTq\9VUnmpb&#Q8'WN)u!
+Xfek3Z*CXA[/RHF[^W`U\[oDc]tM.n^:h7q^VKib&]2H'`5]g;a2l?DbKS8Xcd:(m<rH#$L4t>7
+K`6T*Jq8LPJH(*!If4]pHiSNlHN/9jGl2dbG5cXLFT-F_G5ZXbGQ<$gH?4F\I!pElIt3'#JqJ]/
+KnbA=M2@.LN/is\OckomQ'[l+R[]k>T:qsRUnsufWiE/&YHY:<['mHR\\#Mg^VI_(`5Td<aihoQ
+cHsteeC<($f\,!5h;-uHi8WeWjlY^gkiqBum-O--n*fc8nac8BoCW%Ts7QHerV6Egs8)Wirqu]m
+oDX=@MZ82~>
+JcC<$JcG3=o`"gfrVZTjs8)ckrqQNf!;?Eb9D%iIo()>?n*f]3m-O''l0.<mjlGI]iS`VMh;$`<
+f[n^(e'cXicHXPTaN)<>_ns4(]tCqe\$iZMZ*:C5X/`+rV52o#g"P05g&0Lcg&K\+f@JL@VZ+%#
+\,Ni9\,Ni5[1osSZ*CO:B52=3J:r`:Mj'HuV6.3*\,Ec7[/dT2[0!_C[J[E)[J[H=\$i`S[^NZS
+[emQ6\,a"l\GNi1])0&<])T>9\GNc0\F-p,])'&7]E#YE^Abn?_#;+G_YM+J`;R[T`r=!ZaN++r
+rl>#Zs2k;`s3(GdrQP>fps/rcrQkGhs3^kprmUns!7q/$qq1i"!8@G*rn@5'!o2Vgrnm_5!9*e6
+!9="<s5j1@s5s[Ol07Kulg*p(rU'XQ!:TpV!:p-\s7?Khq"jmdrp]q[p#4TL`l>a5]WnH5W1fcP
+R$jA/Qc$DCZ*:C1O+sL7^Vm:GJYIs<?:T?8FF]<B<.9CROHc9)T2AK`<)[P2W2PoCPa.Q'SXuJQ
+U&h-iVuQb4rkeNLrkeHHqnVp?s1SJgreCH,!/1?(s+16%rI=s!IX_6D!do?ArHeKhrcn?brc\3^
+oQ:%Src\3`s*+Nhrd+Tk!.=coBmtP^J:W<)K7nr5LPUeDMi<UTO-#KePE_>uR$jD4S=Z@GTqeE[
+Vl6SpXKAY0Z*UdE[^`lZ]Y2(q_8=.0`lQ9EbK\>YdF$Fme^rF+g=tE=hV[8MioB+]k3(sml0@U$
+m-X60n*olHncA@Srq6<bs7cKes7u]kqtpBjrVc<dJcCZ.J,~>
+JcC<$JcG3=o`"gfrVZTjs8)ckrqQNf!;?Eb7.g*Bo()>?n*f]3m-O''l0.<mjlGI]iS`VMh;$`<
+f[n^(e'cXicHXPTaN)<>_ns4(]tCqe\$iZMZ*:C5X/`+rV54*\s.01[oUG]Ip7))PrgWA.r/U]9
+rf6]5s,R,<s,.=d<`s'MCN"99G^P$qM>`J4NW5%;NVe\4MuSb3NVeY@NK0!XNfB$YNfEgoqi:`;
+qiCK5qN('+r/^i=rf?W3plYH8!0R8DrfQo9r/pr@r/po?r/q#Bs-*;Brfd8Cs-*JIqih&Es-<GH
+!gf4>rg*JKqj7AOq3_/L!LfMQSG/TRT)##YT`:_`UAgkaUACYbV#R4gV#R7kVYm@bWW0!uX8B!t
+XoGL#XT5O%Y5kg+YnF@K['d<M[^WcW]"5Md]tM.p_#;.K_\9u&ZDjUiR$E_oN.cb2H[9jWEcD"t
+4ckVZKnY,,F)HM]NK&I3Ap7ib76Fd?=CGo087?"@D/aW?Gt:Iq9hec@JUhZXE,fo@GBe@YH[L<m
+q"X[aq>gElr;Z`qrjDdoOS+b0P5gXEL]3&.K`Hf*KE$N'Jc1*#IsukFI0+eCHi89jH2`'dGQ)d`
+FnBeSFoHR^GQ2mfH2`-iHN8HmI;+.[J:N3&K7ei2L51SAM2R=ONfT9aP*;,qQC+)/S"-(BTV8-V
+V5L8kWiW>*Yd(O@[C3TU]"G_k^qmn+`Q$!@b0/&TcdC.heCE1&g"P39h;7&IiSrnYjlYail07L!
+m-O--n*fc9rpg*]o`"O`pAamcq#C0iqYU0hr;HTbrdk*-s*t~>
+JcC<$JcG3=o`"gfrVZTjs8)ckrqQNf!;?Eb7.g*Bo()>?n*f]3m-O''l0.<mjlGI]iS`VMh;$`<
+f[n^(e'cXicHXPTaN)<>_ns4(]tCqe\$iZMZ*:C5X/`+rV53r`r(d&`qG@,dohbQ\ohGK]r`/u!
+s&]2#r`/Ym!EE2!<=LlD1d4/i6UXC67n?3GrDEDfqbR5gs&&_k!DcPk:B4/a9`e'c:]*uf:\mid
+:B4/f:BF?g;#O/i;"mcY:@V$Y:A%EN:A%EE:]O;i:&n)U;#=,i;#X8d:]O;e:A[ia;#4&`;YX2g
+;>X8a;u]es;uK\p;u0Mm<WH/!<<#tu<WH4t<r#hs=oVV(<ruK,>5VV)>lS"/>$Lr1!*fA+rE]>-
+!+>b6s'l"<!+l+@rFcdW@pN5:;GKnT779C)5!:ti3rV#k2)[lk6UF(&4$u>!5<qFq3&``J,p+Hd
+/MAn>0/bXF3BB8e5X[Uj2Ej8f8OuH<62j7O7/o^T7gM[YQ'IZ$Q^=*=RK&`US,\ubSXuIHTV8'R
+U8.[_s.p1%Vl-JlWN*&&YHY::ZMq0=['d<M\$rlY]">Vg^AY_I^;%J!rkS`S_o0O6rl5;cair#S
+cHjh`f2hoO!/LQ.s+LH+re(6&!.k*!!e5ZJrI"`pH[G^;s*=Tgr-/-`r,qXRrH8*_r-/0c!."Qi
+s*F`nrdAL0It3'#JqJ]/KnbA=M2@.LN/is\OckomQ'Rf*R[]h=T:hmQUnsufWN*&%Y->1;ZaI6O
+\[oGe^VI\&`5Ta;ai_fOcHjnce'uq"f@em4gtgiEi8N\UjQ5Oekiq?slg4!*mdKW6nc&([oCW%T
+s7ZKerV6Egs8)Wirqu`no)=4?MuS;~>
+JcC<$JcG0<o`"gfrqu]ks8)ckrV-Hgp@eLY7J-3Bo'u8>n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-4AQaMu3;_SO"$]Xt_a[^EHIYck11Wi;nnUtsf)gAfk'f`0Xuf_*qtfE9aVe^X;j
+qPO.us0qp7s0Vj8r3[BKZa-pBZ*:I9AnZ=6I"-m,N0KWuTWGN0rO2=*r3Z.)rO2a8s0`*?[^NZS
+[f3`>\@8rW\@;1A!4h7%qmlC2r42j=s1.m6r3uF1m^`>.qRcR9!58BGrP/$@rk\HJq8<0LrPefV
+rl5)]a2e(srQ"oYs2k;`s3(DcrltJgq9K&drQkGhs3^hormLquf%0iPr7Lbsrn@5'!SlQ2hu2L0
+iW/$:jSn9>k5OQCl2U&Kli6>NmJlVSn,MkWnc&.[oEFs`q>:*ho)DP`jkJ2)`PBC,Z`Bt#US"*E
+R@0G/_S*C_Z*1.0L4ZbI`4r4;MkY</?"&"PFF]9A;G_t"OHQ*'TMSNa<E2nrW2YoBPa.Q&SXuIJ
+US=ZcV>pG/qSW<LpqcjCqnE-FrP&KLLkphAre:K.KS9>Ws+16%rI=s!IX_9Es*XinrHeHgs*4Ba
+r-%aUrHA'^s*4Qhrd"cqI!g?jIXh?ICOq(iK7nu6LPUeEMi<UTO-#KePE_>uR$a>3S=Z=FTq\?Z
+Vl-MoX0&P/Z*L^D[^WfY]Y2%o_8=+/`lQ6DbKS8Xd*^=le^i@)g=k?<hV[8MioB(\k2tjjl0@U$
+m-X60n*oi:o()DDo`"O`p&Ojcq#C0hqY^6hr;HTcrdk*-s*t~>
+JcC<$JcG0<o`"gfrqu]ks8)ckrV-Hgp@eLY6hL!@o'u8>n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-4AQaMu3;_SO"$]Xt_a[^EHIYck11Wi;nnV#6e`SGSfFSGAZSSGerNK)^E"K'SHr
+NW4t:M[rce@V'7gD/aT?H@CL%N/mgqrf6r:qi(H2rf$]5qi(K5"ceS%NfK+oNr+k;Nr>">OH9-t
+qiC-+r/^i=rf?T2q2tQ9!0R8DrfQl8r/puAr/po?r/q#Bs-*8As-*ADs-*GHr0./Fs-<GHrg3VM
+r0R>Ks-`\Mrg<hVS"'2CpmqDUpn%V\TqV@Xs.T@bq4e"eUSIa_!Mu[kVZ<[gW<0*#X88ptXo>F"
+XT5O%Y84@IZ*L^B['d?N\$roZ]">Se]tV4r_>_=N_`GZEXJDGVQ][;fKn=f$G^4LSEcQ/<Oc>6S
+KnFi'D/4ocNer.)DK]5\77g]L=CGo07n$luD/XN>H2^A79c?WRJ:MNUDfKf?GBe@YH[C3lp\4IY
+q>0sbqu6NnrVul)s6c!AOo(:AOo:FGObegKL]3#0KnP-YKE$N'Jc1*#IsukGIK+]pHi89iH2i-c
+GPlXWFo?L\GQ2pfH2`*oH[L3hI=?\FJ89^fK7ei3L51SAMMmFPNfT9aP*;,qQC+&.S"-(ATV8*U
+V5L5jWiN8)Yd(L?[C3QT]"G_j^VRe)`Q$!?b0/#Scd:(geCE.%f\5'7h;7&IiSrnXjlY^gkiqBu
+m-O--n*fc8nac8BoCW%Ts7QHerV6EgrqcQirVZWmoDX=@MuS;~>
+JcC<$JcG0<o`"gfrqu]ks8)ckrV-Hgp@eLY6hL!@o'u8>n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-4AQaMu3;_SO"$]Xt_a[^EHIYck11Wi;nnV#!ma:@D!N;"%0R=8u=n<W#f,2DmW^
+5=.S$6UsX;8PMuXq,$ra!)WYlrD3Yn:esk^:A7KY:&n)f:'FEg:/=Y\r(d;hr(m>hpJ:HWnkK-Z
+ohY!NohX[G!)NPg!)MoWqbdAir_N>ds%iJdqG6ubqbd&bq,@/fr)32dr_rtu<)los;u'Gm<WH.u
+<!--$<`f,uq,[i(=]ed-='/U/qca5/>?b97>Q.k->Pqb(?2\(1?XWh@"CbkNA7baP%qfQhB3nb@
+;G^(Z7RTR-5Q*]62E*NO2ag&$6U<mt4$c+t69dUm2`<NH,T\3a/MAn>0/YF>3BB;f5X[Oi2EX2_
+91_Z=5X[t,6psI37S--B99b[+Q'Ra8QiEF+R@9S6S"-">T:_dLTqS3TUSO]^UnsobVl-JmX/rJ,
+YHY::ZEpjC['d<M\$rr[rk&0Bs1SHH(;IZ#_84"*`5T^8a2c9DbKS5UcHje^gf=DTrDj&$LkphA
+re:K.KS9>Ws+16%rI=s!IX_9Es*XinrHeHgs*4Bar-%aUrHA'^s*4Qhrd"cqI!g?jIXh?ICOq(i
+K7nu6LPUeEMi<UTO-#KePE_>uR$a>3S=Z=FTq\?ZVl-MoX0&P/Z*L^D[^WfY]Y2%o_8=+/`lQ6D
+bKS8Xd*^=le^i@)g=k?<hV[8MioB(\k2tjjl0@U$m-X60n*oi:o()DDo`"O`p&Ojcq#C0hqY^6h
+r;HTcrdk*-s*t~>
+JcC<$JcG0<o`"gfrquZjs8)ckrqQNf!;?Eb8G)NFo()>?n*f]3m-O''l0.<mjlGI]iS`VMh;$`;
+f[n^(e'cXicHXPTaN)9<_ns4(]tCqe\$iZMZ*:C5X/`+rUtsh]gY2Y[r7M&&p"8rjs4IA&s4$P8
+osX\(rj;X1'!edHYH;K5G^Y-uLPh1XQ(FnVrO2=*rNu4)rO2a8!4MX2"h;%N\@B$A\,a)%\GNi0
+])9,=\cB;6\G`o2\F-p,])'&7]E#YE^AYh>_#;+H_YM+J`;R[S`W4'Ya8j9Y`r*mVaSs<]aoKWa
+bl,cgcHjh^r6PDgrQkGhs3^kprmUnt!7q/$r7Lo"!8@G*rn@5'!o2Vgrnm_5!9*h7s5X%<s5j1@
+s5sCGrosIJ!pf4>rTs[Sn*g8F!:p-\#5%T_q>:*goD_YPh:0]h`kTU&Y,J.mSt;I>Q^<uS^:1JR
+Yc=g[J[`b=^o*WPXH.I6?>+a]GCkcG<.0CSOHQ'&TMSQa<`N%rWMki@PE_?!S=cCHTVJB_V#U;-
+rkeZPrPJ<FrP89ErkABHs,$c3!/LQ.s+UK+rdt9(JV!fNs*t&trdFfos*OZis*=TgpilFTq02j`
+s*=Qh!df<BrdAR2It3'#JqJ]/Knb>;Ll%"IN/WdXO-,ThPa.Q%R$sM7St;UKU84T^Vl?\sXfek3
+ZEppH\%0&]]Y;.r_Sa@3a2lBGbg"G[dF-Lnf%8R-g=tE=hVd>Nj5]4^k3(sml0@U$m-X60n*olH
+ncJFTo`"Lbp@n=[q#C0iqYU0hr;?Nbrdk*.s*t~>
+JcC<$JcG0<o`"gfrquZjs8)ckrqQNf!;?Eb6hL!Ao()>?n*f]3m-O''l0.<mjlGI]iS`VMh;$`;
+f[n^(e'cXicHXPTaN)9<_ns4(]tCqe\$iZMZ*:C5X/`+rV#6e_SG\lGSGAZRSGerKK)U>jNVeb6
+N=h,-MMY>]AS5dpDK0fFI"I$/r/L]9rf-c5rJUW5qi1H2rf-H.qi:`;rJpu@O8+h5O6r&,O8b7?
+O788-Oo(4AOckn+OnFh6OoCOAOoLRGPEM+,OoLUEPPLCAPPgUDPQ$gEPQ-mHQ26gHQi<<KQi3<M
+RJN<MR0&hHS+rNJSc55VTDkP]UApqbUA:PaV#I.fV#R:gVtI%hWrK-sXT#@%XSf1#Y5>F%Z2_-9
+['d<M\$rlX])K<6]Y;+p^qmn)_o''fVkBNEP`Ci^Jq/8rG^":ME,fiYO,AaHKRSDfC57q3ML9PY
+Htc\U7Sd>W=^u/3875n=CiFE;Gt:Ls9h\7[J.?F8E,fo?GC"IZH[L<mpAXgdq#C-jqYU9is8Dus
+[K$5gn<!=*qi^r@s,mPJM2@%EL]3&.L&Zi*K*$XUJc:3"J,ausIK+]pHi/3iH2`'`GP64UGQ2pf
+H2W$jH[L5?I;=:]J:N3&K7ei2L5(J>M2I4MN/is[OckomQ'Rf)R[]h=StMdOUnjlcWN*#$Y-5(8
+Za@0M\[f>b^;%J#_o9U8aN;WLc-F\`daQ^sf@\d1gYCWAi8ESSj5f=akNM0plKdg'mI'H3nF?MK
+!qZ'Vrq-?dp\4X]s7u]kqtpBjr;H6dJcC]/J,~>
+JcC<$JcG0<o`"gfrquZjs8)ckrqQNf!;?Eb6hL!Ao()>?n*f]3m-O''l0.<mjlGI]iS`VMh;$`;
+f[n^(e'cXicHXPTaN)9<_ns4(]tCqe\$iZMZ*:C5X/`+rV"mga:@:pM;#X2\:A%]f<qKDj<"1]N
+5<_@s6:=:57n?6Iq,$ubs%r\lqb[;g!)E5^qG.&dr([Dk:/4S\:Adlf;#F,h;#!iY:@_-Z:A%EN
+:A%E^:]O;U;#a>j:&n)U;#=,i;#X8c:]O;g:AI]_;#=,f;?0Sl;Ya8g;>a>h;u]hq;uT_u;cHar
+r_rVmr`0#!rD`ess&K,$qH!Go$!:>5=BJX+=BSi*>6S89>?Y37r`oJ-r*92+rE]P4?srtB)e*;e
+A7T7`AnPaa>#eNu9hRrE6pNt"4?Ybc3;tco7RTR05X7In5s[_$5Wq(d2`EE=+Wr'a/1rb=0fCgE
+3BB;f5X[Li2a0Dd91_Z<5XRk)6psL4r^R#]8sB7=s-<VMs-NbQ(7CV[S"#q<StDXJTV8'RU8+NZ
+Unsobrhodp'rn@:Xfek3Z*L^AZa@-J[^W`U\[oBO])]MC^&PeI^qp#es2,/]`Poj;aN;WLbl5le
+cJ)D!<W6&!M>rA3L]3&.L&Zi*K*$XUJc:3"J,ausIK+]pHi/3iH2`'`GP64UGQ2pfH2W$jH[L5?
+I;=:]J:N3&K7ei2L5(J>M2I4MN/is[OckomQ'Rf)R[]h=StMdOUnjlcWN*#$Y-5(8Za@0M\[f>b
+^;%J#_o9U8aN;WLc-F\`daQ^sf@\d1gYCWAi8ESSj5f=akNM0plKdg'mI'H3nF?MK!qZ'Vrq-?d
+p\4X]s7u]kqtpBjr;H6dJcC]/J,~>
+JcC<$JcG0<oD\^erqu]ks8)ckrV-Hgp@eLY6hL!@o'u5=n*f]2m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-4AQaMu3:_SO"$]Xt_a[^EHIYck11Wi;nmhYu=5gtLH7r7M#%p=T&ks4IA&rm^G7
+pU9n*!OT94[/[HIZ*:C5YAKW=I!p['MN*deS"Zmj[^Pe8rj;=*r3lX7!4M[3s0r'<o!e\1kICK$
+!kPqQpppL<])0&<\cB;6\Giu7\,a)<\F-p,])'&=]E#YC]E#YE^AYh>_#;+H_YM+I`;[aT`W4'Y
+a8j9Y`r!gVaSs<]b5]Zbbl,cgcHje]r6PDgrQkGhs3^hos3q"u!nPuTqq1f!!8@G*rS%,&!SuW3
+hu2L0iW/$9jT"?>joOZ/rosIJs6K^Orp9dTn*g8F!:g$Z#5.]bqY^<kpA[GIhpoum`P'7'Z)aau
+Tq.aBQC!o%^q$kWYGnUZJ\/k6_P`lUV3$aC@V'mZF+&g9:/QIlLldgiS=iYV;--aqSGoGuP`q8p
+Q^OG:U7n?WW3!,(Y,;6r_>D(L_u7II_>M+F^\khGMZ/G6LkgcbLAur-K`6W(K)^E$JH(-!If=cq
+I/eQkHN&3hGjBSQGlN'fHN/<lI/\QoIW0deJ:W<)K7nr5L51SAMMmFPNfT6`P*;,qQC+&.S"-%@
+TV8*TUo(&gWiN5'YHY:<['mEQ\\#Mf^VI_'`5Ta;aihlPcHjnce'uq"f@em3gtgiEi8N\UjQ5Od
+kNV6rlg4!*mdKW6nF?)?oCMVRp&F^cp\jmeq>U6gqu-HkrU^#>s,?u.~>
+JcC<$JcG0<oD\^erqu]ks8)ckrV-Hgp@eLY6hL!@o'u5=n*f]2m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-4AQaMu3:_SO"$]Xt_a[^EHIYck11Wi;nmT)>/ZSG\lGSGAZRSG\lGK'eQqNrP(R
+N/NRMMI:[aAS>mtEclSQItNN8NK*msrf-c5rep]5qi1K3rJgB.qiCc;rJpu@O8+h5O6r&,O8k=?
+O788-Oo(4AOckn+OnFh6OoCOAOo1C?OoLUDPPUIBPPgUDPQ$gDP5pjHQ26gGQN3?KQi3<MRJE6M
+RK&]US+rNJSc55VTDbJ]UApqbU@k;[V#R:gVZ<[gWW/suX88ptXo>F"XT5O%YAg_NZ*L^B['d<M
+\%&u[]">Se]tV7s_8=($Yc+:eR$E_oN.cb0H['[UF)Z,<DiTa3L4au*E,:DmMi<%+BR"9)6qL'W
+6!%E(6:OLS@qTXsFEMk"8OlKK9mM8?J8]CFEHH>JH$OaaI=Hg!JqEarp]L?gqYU9is8Dus[K$,d
+o8rO*rf[2As,-f4!f2VereCH,!/1?(s+:9%rdb#us*jrqs*Xinr-J?frcmaQrcnHgrHeKj!.=co
+s*ep:J:N3&K7ei2L5(J>M2I4MN/is[OckomQ'Rf)R[]h<StMdOUSOcbW2co"Xfnt6Za@0L\@K5a
+]t_A"_SjF5aN;WKc-FY_dF6Uqf@S^0g>(N@hr*JQj5f=ak3)!nlKdg'mI'H3nF5u=o(2JFrq6<b
+!;HHes7uZjr;6HjrVc?eJcC]/J,~>
+JcC<$JcG0<oD\^erqu]ks8)ckrV-Hgp@eLY6M0m?o'u5=n*f]2m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-4AQaMu3:_SO"$]Xt_a[^EHIYck11Wi;nmq+po`mSEFNqb?cZnlPfkpf75k"$f1?
+6N04V6UaL984cKO:f%$drD3GirDEPj##S2n:JX_\pJ(KZs%iSgs%`VinkT6^pJ:T[s%iYinP'!Y
+oM><Ys%iAaohYQ`s%hoVs%iVh!)MoWqbd>hs%iAcr(d#_qb[,drDEVmr)3>h!)i_lqbm>js&Atr
+rDX##<)lms;c?Zk<W6%t<<#tu<WH4t<r,nt=T;M.=BAR+=^##*>Q.e/>?kE;>Pqb(?2e11?N=L4
+@K0j;A4U9DAn"tF;c$:a8jbs35X%@o3BB)W2)[<[6pa.)5!2.s6:!k#3]8rT0J+=i,qU]"0fCU@
+1,LpM3]oYm6oI"`4[(u#8OuJP63fqI6q9X97nEVPs%EEWrg!MLs-NbQs-X=bS"#q=StDXJTV8'R
+UAgniUnsrcrhg($WN3,'Y-5(7Z2V$6Za@-J[^WcWrOW$@!5/<E"2DXe_>_=O_Z[os`l?."b5TWb
+blQ,9i)]kXr`8qss,-f4!f2VereCH,!/1?(s+:9%rdb#us*jrqs*Xinr-J?frcmaQrcnHgrHeKj
+!.=cos*ep:J:N3&K7ei2L5(J>M2I4MN/is[OckomQ'Rf)R[]h<StMdOUSOcbW2co"Xfnt6Za@0L
+\@K5a]t_A"_SjF5aN;WKc-FY_dF6Uqf@S^0g>(N@hr*JQj5f=ak3)!nlKdg'mI'H3nF5u=o(2JF
+rq6<b!;HHes7uZjr;6HjrVc?eJcC]/J,~>
+JcC<$JcG-;o`"gfrqu]krqcZjrqQNf!;?Eb!VH!_nj`0=n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZRhcHOJSaN)9<_SX+']tCqe\$iZMZ*:C5X/W#ShVR)EgtUT;gAKV)g=c2PrRq5)s4RD*
+#hdk_f%/@$e^X,drO2=*q6U..rN[$=Xf[_fG^b7!Ll7C\R\6R_[e$p+[.Ld)[e.'/\,a#/\,a)&
+\G`r>]",BH\cKFSqmla<!4ha3s0qm8s1/-=m^`>.qRcd?rk8<D!58BHqS<-IqS<'Gqni0HrP\WQ
+s2G&Zrl>)[rPn]Ss2b2]s2tAbrlkAdrQbAfrm(Mhr6YJkrmLhq"OtuQf%9iPp"B>uqV)),h;8.g
+!oVtoqVqP8r8dn>r8n(Dkii$1s69UMrp9XO!UfFTn,W%Yo*4j\p\F^brV?Itrq5.#ccF/F`5AdZ
+VPU&ZS=>q3Q^,D#\$3'=X,MV3^pM"\SVEYuL0\1tH:r=.LPS`):4n7[OdMW0T28E_<`N%dW2HSW
+PED)qR@Kk@Tq\<ZX/rM.Xfnq5WW2_/rPJTNs2+QIrP8?Gs1SKJrOrAmMi3JkM#rKgL]3#0KnP-Y
+KE$N'Jc1*#IsukFIK+]pHi&-gH2W!ZGPudcH2W'hHiJKmI0"eHrd\[5JqJ]/Knb>;Ll%"IN/WdX
+O-,TgPa.Q$R$jG5SXuIITqeE[Vl6VqXKAY0Z*UdE[^`lZ]Y2%o_8=+/`lH0CbKS8Wd*^:keCN7(
+g"P3:h;7)JiT&tZjlYail07L!m-O--n*fc9rpg-^o^r.U!quB_rV6Egs8)Wirqu]moDX=@NW4M~>
+JcC<$JcG-;o`"gfrqu]krqcZjrqQNf!;?Eb!VH!_niu[6n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZRhcHOJSaN)9<_SX+']tCqe\$iZMZ*:C5X/W"hSt>eLr1!bXn!s<FrLEhU!1NM2s+1-/
+m>_.+r/D;HMMcG)AS>jrD/siGIY*61NW"n;NVSP4Mu8P3NV\V5NU`&+O8k7=O7n\3O6r&,O8k=?
+O8P(>O7eV3Oo(4AOckn+OnFh6OoCOAOo1C?OoLUDPPUIBPPgUCPQ-mEP5pjHQ26gGQN3?KQi<BM
+RJE6LR/rbGpRM&MrLWhW!20=bs.TLgpnIGVrM9Ii!2fXkor7tks/Z!ts/l=&qlTe"!3lI-rj)j:
+[C3NR\@T9N]2ZJX^;%Lq[&9XiR?`qrNeW+6I!^'\F`25<DNKg6L4k,,EGU>gKoCJ'Ble*#77^'U
+6!.K*B1>BY@qBFnEccMO84c<G9MKb]J:MKTDK']?G'SE5HNJ\JJGk-#LB%#Nq>0sbrqufp!<0D+
+qN:B2n<!^6rK.2@Mi3JkM#rKgL]3#0KnP-YKE$N'Jc1*#IsukFIK+]pHi&-gH2W!ZGPudcH2W'h
+HiJKmI0"eHrd\[5JqJ]/Knb>;Ll%"IN/WdXO-,TgPa.Q$R$jG5SXuIITqeE[Vl6VqXKAY0Z*UdE
+[^`lZ]Y2%o_8=+/`lH0CbKS8Wd*^:keCN7(g"P3:h;7)JiT&tZjlYail07L!m-O--n*fc9rpg-^
+o^r.U!quB_rV6Egs8)Wirqu]moDX=@NW4M~>
+JcC<$JcG-;o`"gfrqu]krqcZjrqQNf!;?Eb!VH!_niZI3n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZRhcHOJSaN)9<_SX+']tCqe\$iZMZ*:C5X/W#r;#F,h;#F)h;"IKP:]O;d:&7WV<r?%u
+<qo\o<";,Z5sIY!6:=738P2WN:]4,g:]F8i;>sAr;,C(b:JO[Z:&7Tb:]*uf:B4/\:B45c:\dcc
+:]=,[9`Rr\:\mid:\RWW:]=2i:[:jW:]=)h:]4/Z;#=,h;#a>c:]O;i:A@W^;#4&f;?0Sk;YsDm
+;Z0Jh;Z'Jn<;ohm<!63#;c?Zj<W?+u<;oku<`f)tqcEf"s&oA(s&T8(=^(Z+r`]>+s'5S.r*92+
+ra,V3s'Yh7&n5?]A7]4T=]83o:.RlC69m^tr]C-=-8m_=6q0O25Wq4s5=%S#4ZYP^2)$U'+XJ`m
+/2B+E2)I!D3&j#br^$QD'K80=4A&198j>R,6:F:07RT^98P/nS*_f=$9hpt=QBml(R$a;1R[]h<
+StDXJTV8'RU8+N[rh]Uk$)a`$X/rG+Y-5)/Z2_*6['d<M\$rmG\I,p[]=bhj^;%J!_>_:W_o0L4
+a2lBEb5TQdbg"DXhcB\U!*9%u",r.rMZ&A5LkgcbL'!'^K`6W(JcLB#J-(4LIf4]pI/eQjHN&3g
+Gk6.XGlE!eHN/?lI/\NpIXh?IBRtbfK7nr5L51SAMMmFPNfT6`P*2&pQC!u,S"#t?T:qsRUnsuf
+WiE/&Y->1;ZaI6O\[oGe^;%M$_o9X9aND]McHaeadaZdtf@\d1gYL]Bi8ESSj5f=akNM0plKdg'
+mI'H3nF?MK!qZ'Vrq-?dp\4X]s7u]kqtpBjr;H6dJcC`0J,~>
+JcC<$JcG-;oD\afrVZTjs8)ckrV/tYp@e1Po^qbGo'u5<n*]T0m-Es$l0%3kjl>C[i8EJJgtUQ8
+f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYck10Wi4k5hYu@2g]H6agAT_)gAfh+f_sG"f`'S#
+gAfh-f[n^ReH+1Kr201ar3cR5pU0h(rj2X0&[8OCX`'YQH[pd)MMmXdS"m%U[K!W*[JdQ2[fEr9
+\*pj+\`gR%\H0:PpUUC;])0&<\cB;4\,a#8\Gj&=\F-p,])'&=]`,VD]E#YE^\YbF_>D%H_>;%F
+_u7OO`W*sXa8a3\a8O$Sa8a6[ao9H_bQ#fac2Q#fci)/hchl)hdJqYpdfe1Ne^i@Mf_*qsgA9P*
+gtgidhZMfoi8FIk!9<t;s5j1@s60FGs69[Om-O`=!UfFTn,W"Xo*=p]p\F[_rVl]o>P[42ccO/G
+_Sid_Vl-8\S=Gt3QBmcK\?iBBWNV&-Ydh][Sr/o'H!aicH>@SMLJ(B>IY*95Od2E*TMJH_;,gLm
+W2Z_VP*;&oQC456T:r!SV5gW!Y-"n2Yl1i-s7F,-_Y(bC_#;%D^Aa)kMZAY6M>rA3L]3&.L&Zi*
+K*$XUJc:3"J,aurIK+]oHi&-fH1H4ZH2N!gHiJKmIK+`rJ,Xt/JV&N,KS>/8LPUeEMi<UTO,oBc
+P*D5tQ^F21S"6.CTV8-VV5L5jWiW>*YctF>[C3QT]">Vh^VI_(`Pom=aihoQcHjnde'uq"f@em4
+gtgiEi8N\UjQ5OdkNM0qlg4!*mf)YUnF?MK!V>s_p&Facp\jmeq>^<gqu6NlrUTr=s,R,0~>
+JcC<$JcG-;oD\afrVZTjs8)ckrV/tYp@e1Po^qbGo'u5<n*]T0m-Es$l0%3kjl>C[i8EJJgtUQ8
+f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYck10Wi2P]T)"rUSH#/LSGerTSGerWRfA!2Jb>&o
+N>.D4NJrjSMI:[<A8,muEcu\TJ:i[VNW>(6N;nh5N;S\4N;\b,Nr+n:NrG+4OT1@AOT(=.OSb+=
+OSt7<O8t@6OSk7<O91Q-P5UO9OSk7?P5LI?P5LIBP5^[AP5gaDP5^[FPl$[EPlI$FQM-[FR/EBJ
+R/WKTR[]fASGA`RT),&ZT`(PbU8.LXoV;D]s.o^mqkjFmor7tk!3>striQ4%r2ft%rNH7*s02p:
+Za7$G[^N]U\[qdP?bF(d]sju9Ssbq0O,f!KIXQNeG'.hEE,KTRMhct<I=?$JKSb\?GAD29?:RIX
+>>eO0AO/dU?X[P^DK9iBGt:Ir7SQQLJ:N2gDJsH5FEMeQH?spbI=Qj#JV/T.L&H`-q>1!fr;Z`q
+rjDe&On4\#OoC=>MZAY6M>rA3L]3&.L&Zi*K*$XUJc:3"J,aurIK+]oHi&-fH1H4ZH2N!gHiJKm
+IK+`rJ,Xt/JV&N,KS>/8LPUeEMi<UTO,oBcP*D5tQ^F21S"6.CTV8-VV5L5jWiW>*YctF>[C3QT
+]">Vh^VI_(`Pom=aihoQcHjnde'uq"f@em4gtgiEi8N\UjQ5OdkNM0qlg4!*mf)YUnF?MK!V>s_
+p&Facp\jmeq>^<gqu6NlrUTr=s,R,0~>
+JcC<$JcG-;oD\afrVZTjs8)ckrV/kVp@e1Po^qbGo'u5<n*]T0m-Es$l0%3kjl>C[i8EJJgtUQ8
+f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYck10Wi5nnohYTaohXsOnP/p]oiCulr`9"uqc!Y_
+5sRU45R'SE84c?E9`7fe:]F8h;?'Jm;?'Jm:B4/a:&.Na:]4&W:]=2c:\dcc:]=,[9`Rr\:\mic
+:\[]_:B4/e:]=2h:[CpX:]=)h:]4/Z;#=,h;#a>c:]O;j:A7Q_:]aKj;#=,h;Z9Pk;YsDm;Z0Jh
+;Z'Jm<<#nn<!?9$<)ZaqqGmPrs&K%tr`/\nqcEc!s&oA("BS].=^(c.!Er_+=p/&7>[(G1>l7n-
+?N+=3@/jXG@UiqX?<C-&:.n2M7RKL+r]L<D3&pmq-8e.X5sR[u4@)4s5X.:h3B&ZE+!2d]-nI,2
+0/YLA1cRKX5!D8#r\bcU4[(l!8Ou'35sdq,6UX@277g$@9M8#P9hS)R:B"&hQ5>mTR$jD3S=H.@
+StDXJTV8'RU8+N[V5=0gs/-U2WiN8(Y-5(7Z*L^AZa@-J[^NZS\Gj#G]">Vg]tV4q^qmkd_?Iiq
+`5]m>rlGAebKJ,Sbg#$Gpf7<Ps,-l7re^Z2!/LQ.s+UK+rdt9(JV!fNs*t&trI+]nrd4NgrH[sY
+rd"Efs*OcnrdFfq!.XuuA:]>bK7nr5L51SAMMmFPNfT6_P*2&pQC!u,S"#t?T:hmQUnsueWN*&%
+Y->.9ZaI6N\[oDc^;%J#_o9U8aN;WLc-FY_daQ^rf@S^0gYCWAhr*JQj5f=ak3(smlKdg'mI'uB
+!V#XYncA@Srq6<bs7cKes7u]kqtpBjrVc<dJcCc1J,~>
+JcC<$JcG*:o`"gfrqu]krqZWjrV6Ee!;?Eb!VH!_niZI3n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZRhcHOJSaN)9<_SO"$]tCqe\$iZMYck11Wi=qUhZ2O4h#cBdgAKY(g&]mZr7Cl!s4RD*
+s4dP,"5)5Wf)F2$eC2h9V>R^m[JmQ/ZN7A:riZp9CQc#OI=[-/Mj'NuTW,-&[e@*/[.Ld([emN6
+\GWi)\Gj&&\G`u3])K>=\c95@\a6j*\c92=\c922\c02:]DoPC^&GYH]tV7rqS<*HqS<*HqSN*H
+rP\WQrl,)]aN2EBrPn`T!6G)[s2t>a!6kAcrm(MhrQbGhqp>AjrmCu!eC<%"f)++mg&Ke&gB$*c
+rndV2!9!_5s5X%<s5j1@roj@Gs6BXMs6TaP!:KgT$h<fZoCV_Mq"jmdrr)juqW6JYb/D<6`4)kJ
+UnaZUS=5_/QBf:r['-[3Xb_P2_S`pXQ][q\A6<8TCNFoZ8kr32J;B8KR@9_>:Jt%e<)cbnW2HST
+PEV/nQ^O>7T:qsRV5^PuriZ:*qQ[1&lbNS:rPAHJr4i*B!fi8"repo:MMhCi!f2Vere:K.KS9>W
+s+:9%rdb#us*jops*XfmqKh[Wqg/6g!.=`nFaegiJ:N3%JqJ]/Knb>;Ll%"IN/WaWO-#NfPa.N#
+R$jD4S=Z@GTq\?ZVPgDnX0&P.Yd1UB[^WcW]=bhl^qmn+`Q$!@b0/&Tcd:(geCE.%f\5'6h;-uH
+i8N_VjQ5Oekiq?slg4!*mdKW6naZ2@oCV\Sp&F^cp\jmeq>U6gqu-HkrUTr=s,[21~>
+JcC<$JcG*:o`"gfrqu]krqZWjrV6Ee!;?Eb!VH!_niZI3n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZRhcHOJSaN)9<_SO"$]tCqe\$iZMYck11Wi;WiT),#USH#/ESG\lVRK/cHJc(N"NqSJ4
+N;e_JMI1FWA8,drDfU#IIY*92NfK+nMu\e5N;\b4N;\b,Nr+n:NrG+4OT1@AOT(=.OSk1=OSt7<
+OT1C6OT(C=O91Q-P5UO9OSk7?P5LI?P5LIBP5^[AP5^[DP5^[FPl-aEPlI$EQM6aFR/EBJR/`TS
+RK/iPSGA`RT),)ZT`1YbU&^t`U@k;\V#R:kVYd:`W<0*#X88ptXoGL"Xo5I'YlD!.ZN%68['mEP
+\@K3L]1K]FX.u;VQB[DkLkC5+H[0jZFDu2;DN9X2KnOo)DejucNJ)OqC33TO6:t'O='oN)7Rpir
+Ao2F,FEVq#8Ol6E9MBtdJ:MNUrbr!]Fa&+Wrd+p!J:N9'JqJc2qM#%Iqu6NnrVul*s7_ZKOR/)2
+NfB%tMunopMZ/G6LkgcbL'!'^K`6W(K)^E$JH(-!If4]pI/\KhHLZ:XHN&6kI/SJ9IXcitJ:W9'
+K7ei2L5(J>M2I4MN/`mZOHPckQ'I]'R@9V8StD[LU84W_Vl?\sXfek3ZEppH\%&u\]Y2(q_8=.0
+`lQ9EbK\>Yd*^=le^i@)g=k<;h;@/KiT&tZjlYail07L!m-O--n*fc9nac8Bo^r.Us7QHerV6Eg
+rqcQirVZWmo)=4?O8j_~>
+JcC<$JcG*:o`"gfrqu]krqZWjrV6Ee!;?Eb!VH!_niQC2n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZRhcHOJSaN)9<_SO"$]tCqe\$iZMYck11Wi>qnohYTaohY?Z!)`Mf!)N8^r_35hp/V#k
+r)`ku!*/qr!^T(=rBLZU779X:92&)W;#X5j;#4#o:f1(d:esk^pJ(?V!DQ>X:]=2d:\[]a:]F2\
+9`Rr\:]!oc:\[]_:B4/f:]4,f:[M!Y:]=)i:Jh$fmnijXs%i\kp.tfd:/:IXr_WVl!)WMhs&/hn
+r)3Djr_i_mq,7/ir`&nrq,@>orD`Vnr`0#!r`&hrpK%2nr`K2's&f;&!a&T/rEB;+>Q%b*>Q7t.
+>Pqb(?2n72?iOO5@1m$T>?=]t9M@uH6U<q"4Zkee3;tg*2+0f!5s[Xp6U3k&5<:b]0f(F*+!W-]
+/2K.:2)6sH3&s,d5sdpt3&W]Y4uu>.84l-46UO1.6UXF47S$$?9M.uO9MJ4[:AdofQP5aSR@9V8
+S=Q4BT:_dLTqS3TUSRmc%]6)"Vl6VrXf\b/YHY::riuU4[^H+C!k5\Lrj`'A]`,SJ^;%Fu_86,f
+"iJ9t`lQ7#aTBW.bPo`B<r#_sNfB%tMunopMZ/G6LkgcbL'!'^K`6W(K)^E$JH(-!If4]pI/\Kh
+HLZ:XHN&6kI/SJ9IXcitJ:W9'K7ei2L5(J>M2I4MN/`mZOHPckQ'I]'R@9V8StD[LU84W_Vl?\s
+Xfek3ZEppH\%&u\]Y2(q_8=.0`lQ9EbK\>Yd*^=le^i@)g=k<;h;@/KiT&tZjlYail07L!m-O--
+n*fc9nac8Bo^r.Us7QHerV6EgrqcQirVZWmo)=4?O8j_~>
+JcC<$JcG*:o`"gfrVZTjs8)ckrqQNf!;?Ebs7ASJo()>?n*f]3m-O''l0.<mk2bR_iS`VMh;$`<
+f[n^(eC)akcHXPTaiMK@_ns4(]tCqe\$iZMZ*:C5X/b+9rnd_4rS7J.qUu#(f\$/Sr7M&&s4[J,
+rn7J-f@SUPeH=7Id*VN_rh]CsoX+\+qm6=.'="dFYHG!fT6bs9K85AEPF8#:WTU\g[edK5\-'4M
+\$u@H!4h[1rjha4"1bqO\bN]5\b3Q5]DK,?]",B<\G<]6\FmE3])'&=]`,VD]E>j]^VBW\rk\HH
+rPABJ!Q2kR_u7OP`VmdVa8X-[a8O$S`rO3ZaoBN_bQ#fac2Z)gci)/hchl)hdJhPte'umte^jWM
+p"BB!q:bo)rSIP2!T;r5iW/$9jT"??joX`0kl0iHlMp2Mm/HAQmdL,D!:p-\AbGclq"jpfs8Vr]
+gsjQf`P0:+XfJ:oU7[sEQBml%_7I(ZYHG$dJ@!)(]q^pYJTu0KB4u%"I>:Hk:k+%OO-6!%T:ShV
+;-$[q;5gImW0!4,Ocu-"S"?7FTVA9]XKA_0Xfel&Z2V&4s6IN#^];4K_#;%E^Aj8oNW>(<N;ne9
+MZ/J4L]E50LAuu-K`6T*Jq8LOJH(-!If4]oI/eQdHN/9aHN/?kI/\QoIK4lsJ,t4Qre"g9Knb>;
+Ll%"IN/WaWO-#NfPEhE"R$jD4S=Z=FTq\?YVPgAmX/rG,Yd(OA[C3TU]"G_j^VRe)`Q#s>b0/#R
+cHstee'uq"f@em4gtgiEi8N\UjQ5OdkNM0qlg4!*mdBQ4nF?MK!qZ'Vrq-?dp\4X]s7u]kqtp?i
+rVc?eJcCf2J,~>
+JcC<$JcG*:o`"gfrVZTjs8)ckrqQNf!;?Ebs7ASJo()>?n*f]3m-O''l0.<mk2bR_iS`VMh;$`<
+f[n^(eC)akcHXPTaiMK@_ns4(]tCqe\$iZMZ*:C5X/_eargrbQl(%X?!1EhRoRR"&q2P$,qMc;M
+NJrgSMi*C2H=U]&CMn39H$k-oL5_,]N;\b5N;S\+Nr+n;Nr>%3OT1@COH5IhOSk1=OSt7<OT(=5
+OT1I>O91Q-P5UO9OSk7?P5LI?P5LIBP5^[AP5^[CP5gaGPl6gEPlI$EQM6aFR/EBJR/WKSR[a)B
+q47GTqOde\rh9@d!2K=`oV;D]!i;ckqkjFmor7tk!3>sts/l:%r2ft%rNH7*s0;U0#ICeF[^W`V
+\c033[]ZI"S=#S'O,J[CI=6EdF`_S@Df(PnMM?b7IrT7YN/<=:F)#)d<DQ7_:f^q65t4=O@qKOq
+F*)YO7n?0F9MA'/J:W5gDuO\XF*2\Ord"luI=Hj"JV&N,L%U3#qu6NnrjMk!Onk+*OoLLBNW>(<
+N;ne9MZ/J4L]E50LAuu-K`6T*Jq8LOJH(-!If4]oI/eQdHN/9aHN/?kI/\QoIK4lsJ,t4Qre"g9
+Knb>;Ll%"IN/WaWO-#NfPEhE"R$jD4S=Z=FTq\?YVPgAmX/rG,Yd(OA[C3TU]"G_j^VRe)`Q#s>
+b0/#RcHstee'uq"f@em4gtgiEi8N\UjQ5OdkNM0qlg4!*mdBQ4nF?MK!qZ'Vrq-?dp\4X]s7u]k
+qtp?irVc?eJcCf2J,~>
+JcC<$JcG*:o`"gfrVZTjs8)ckrqQNf!;?Ebs7ASJo()>?n*f]3m-O''l0.<mk2bR_iS`VMh;$`<
+f[n^(eC)akcHXPTaiMK@_ns4(]tCqe\$iZMZ*:C5X/]#or_WGeqbZr]rD<Agpe^rcoM#?d<;KPm
+<;BPl<rH,"<rZ1u<"_A\5sIY!5t+147nH9H:Jah`;#F2j;#X;l;#X8b:%_6]:$tgV;#*o_:Amug
+:@_*Z:A%EZ:Amu`:Adof:Amue;#F,U:]O;j:'"-er_`)[qbcr]!DcJ_:]F8j;#jGh;#jMm;>X8h
+;uT\o;>F,g;uKYq;u'Ao<E)ut<;TYu<`N1#<W5tr<VTVm=8c8$=oVS,='/U.>5_Y+>$Lr/!*fG-
+s',G,r*B;.s'Pe6&n,-N<Du^h9M.cD5sIRt4?P\ar\c2^6pj=-5Wq4s5XI_#4ZYJU/M&7r,pk#k
+1,U^B0f(dK3^#_m6:3Xi2Z>lQ2bQ_58jYd/6:+(,6q'L47n6/M9*@p_9M8(X:Adoe;#Zm_S,]#Y
+SHtgZT:hjNTq\=]V#I2(VPgAmWiW>)Y-+t4Z*L^B['[6KrjE'@\@B)[]=Y`T]`c'a^VI\b_Z.LU
+`Q#s>rlP2_rlb>chH'JQs,[2?!0-u:s,-l7re^Z2!/LQ.s+UK+rdt9(JV!cMs*t&trI+Zms*OEb
+s*=<as*O`mrdFfq!.Xuu!J,k%K4]djL5(J>M2I4MN/`mZOHPcjQ'I]'R@9V8St;UKU84T^Vl6Vr
+XKA\1Z*UgF[^`lZ]Y2%o_8=+/`lH0CbKS5Vd*^:jeCE1&g"P39h;7&IiSrnYjlY^gkiqBum-O--
+mdKW6nc&(\oCV\So`Fj]p\jmeq>^<gqu-HkrU^#>s,[21~>
+JcC<$JcG'9o`"gfrqu]ks8)ckrV6Ee!;?Eb!VH!_ni?70n*f]3m-O$%l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOgcHOJRaN)9<_SO"$]Xt_a[^EHIYck11rnmn;i8<Dih#Z<cq:Yl&f`'M#f`'P(gA]k+
+g'QHbf@JL&eC;porm:>6rj2@+osOh,r3HC.rics:X_j?2H@CL$M2[R_R@g@Yl*^N!qR?L7"1PeL
+\,No;\b*E1\b<N8\[]2\ppg:5pppO;]"7mQ!4r*=!kPqQqmZX:o=4V,rODO2rjqs<s1J?Erk&?H
+^;%GZ_#D1H_#;+I_>qLQ`;IOP`;dgR`W4'Ya8j9Z`r!gVaSj6\b5TTabl#`bc2c2fc2c2fd/MGm
+dK\1MeCE+#fDO:nf`9b%gB$*crn[e8hV[5KqVqP8qr@b=rT=.Cs60LIs6BUL!:9[O!:KgT!:p-\
+AG,Zkq"agcp[d7mbfRlA`kegWVPKuYS=Gt2Q'@NH\$E0?W31l*[B@EIS!8GMFDGH#95o968kr33
+JVT8KR[]t";Gp@l<)TWmVl5W=P*D/pR@9\:T:hmPV>lmKYHG"2YH[c+qm*O-s2"`Pp;$aEqn`'C
+r4i*BrJq#?NK*pr!fMqnreU]4LPPk`!el;\re(6&s+10"s*t&tr-eQlrd4'Zrd4WlrI"`rIt.HJ
+!J,k%K5?3pL5(J>M2I4MN/`mZOHG]iPa.Q%R$sM7SXuIIU8+N\Vl6SpXKAY0Z*L^D[^WfY]=bkm
+^r""-`Q-'Ab0/&TcdC.heCE.%f\5'6h;-rGi8N_VjQ5Oekiq?slg4!*mdKW6nF?)?oCMVRp&Fac
+p\sseq>^<gqu6NlrUTr=s,d82~>
+JcC<$JcG'9o`"gfrqu]ks8)ckrV6Ee!;?Eb!VH!_ni?70n*f]3m-O$%l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOgcHOJRaN)9<_SO"$]Xt_a[^EHIYck11rLa1`T'r6<SGerWRK/cSR.Z%.Nqn\&NYRM2
+N/WXO?Z^s3BPMC&F*;hXJq]#?nVmI,qMb?3o8`^/rf6u=nW3a3l]D%*rfI)>r/go=oT9*8qN1`>
+!0[;CooT*6rf[2Ar0$u?s-!AFqNCiAr0%)DrfdDHqiq,Gqj-oArg<VOq3_/L!h,UJpmh5PqO[_Z
+!hQ$Vrh07as.TLgpnIDUrhKOjrhfUk!3#Ohs/H("qQ'\!rN,t"!3Z:(rif8)ZEggC[C3QR\@K2Z
+Z)47eR$NkqNJ2q4I<p*\F`MG=D/G5iLP18-IVieSJW,#"D.?dM:J=ML<F03%7RpirASc:+Fa7If
+84H9H97VMAJGsF#E,ou@G'J:XH@($fj`GTqJqJ]/L%0otquZirrjVq-OoLU;Oo(7,Oo:=BNfB%t
+MunopMZ/G6LkgcbL'!'^K`6W(K)^E$JH(-!If+WnI/\K\HN&9jI/SHpIXckHJ,t4Qre#$?Knb>;
+Ll%"IN/WaWO-#KePE_>uR$a>3S=Q7DTq\<XV5L8kWiW>*Yd(L?[C3QT]">Vh^VI_(`5Td<ai_fO
+cHjnce'uq!f@\g2gYL]Bi8ESSj5f=akNM0plKdg'mI'H3nF5u=o(2JFrq6<bs7cNfrqZTjqtpBj
+rVc<dJcCi3J,~>
+JcC<$JcG'9o`"gfrqu]ks8)ckrV6Ee!;?Eb!VH!_ni?70n*f]3m-O$%l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOgcHOJRaN)9<_SO"$]Xt_a[^EHIYck11rDESkqG6l_q+prcqGI#arD3)\rDikspf%,j
+pJq,lr`'P05!VFu5<qJ"77Kd;8kMfS;#=,i;#X>j:\RTW:B+&b:]F2b:]4,c:\dca:]=,\9`Rrd
+:B4/e:\mff:Jaj]:Adlf:Adod;#=&U:]O;j:'"-er_`)[qbco\o1o?_rD<PkqG@5jr)*AirDW\n
+rDE>fs&8hp!)r\m!``3"r`&bprDinur`&hrpf@;orE0&%#$=r.=BSg2qcj&'!*fG-s',D+r*B;.%
+UWUM>$+^":J48K6pa.&r]Ek93&`ZP2)[fh69me"4$c+r5!Ctb1G1+(+s\Kf/29%82)6sI2`a)c5
+X[gq2E*f`3D2q783oL+6UO1,6pj@17S$'AKKh[o9he8QqbI&bqbST-S"#q<SXl@ET:hjNU8"EYU
+SXc`VPg>kWiN5'Y-+t4Z*CU@Zi.<2[Kj:O\[f;`]=e-V"2;Rd_>V4S_o0R8a2n8%$-LB4bKJ.2<
+``A]<r,hpNrk?$NW+k<Mi*DkM#rKgL]3#0KnP-YKE$Q'Jc:3"J,auqIK"WnHgZ4ZHiAEkI0+kIJ
+,Xs!JV*lRCkRLsL51SAMMmFPNK9-^OckomQ'Rf)R[]h<StD^NUSO`aW2ZeuXfen5ZEpsI\%0)^]
+Y;.r_Sa=2a2lBFbK\>YdF$Fme^i@)g=k<;h;7)JiT&tZjlYail07L!m-O--n*fc8nac8BoCW%Ts
+7ZKerqQKgs8)Wirqu`no)=4?OT0h~>
+JcC<$JcG'9o`"gfrVZTjs8)ckrqQNf!;?Ebs7AGFo()>?n*f]3m-O''l0.<mk2bR_iS`VMh;$`<
+f[n^(eC)ajcHXPTaN2B?_ns4(]tCqe\$iZMZ*:C5qVVD3hYu=2h"]S(g"?;UrRh,&!nuD`rRqS2
+f[n^)eC;sqdJ_GkU\LY]Zi.9#[JmNKZ*Ua@Y-+n/O.^iKJ:r`9NKfg#TW#'\[JmW2\,Nl>\[]/Y
+rj`!=oXOk1p:1(3ppg:5pppU=]"5Mcrjr'=!P5i<\,a)7\,a)<\G<]6\FmE3])'&=]`,VD]E>j]
+^VBW\rk\HHrPAHLrkncSr58KOqSiNUrl>)[rPn]S!6G,\rlY8as31DcrltMiqp#2fqp>>is3gqr
+s3q,#f%9fOp"9?!ptGf)qq_D3i8OOl!9<t;s5j4A#3Y46l07Kurp'RNrTsXRn,Dfcnac;Do_/%S
+q>0gEfZhOW`ko[#X/D_fTU_O?QBmf"^ppbTYH"^^K!321[@_r6HZO%:B7"B:K8NE%I=I$5Od_c3
+BMhW'<)ZYlW2HSTPEV/nQC456StMaKUSOjgs-K,PQN3?EYkbQ1rrBn5_YCtG_#D1F_#1tE^Aj;q
+OT(=@NW>(<N;ne9MZ/J4L]E50LAur-K`-N)Jq8LOJH(-!If+WnI/J?bHMi-hI/SKnIfFotJH(19
+JqJ]/KS>/8LPUeEMi<USNfT9aP*;,qQC!u,S"#t?T:qsRUnsueWN*#$Y-5(8Za@0M\@K5a]t_=u
+_SjF5aN2NIbg+M\dF-Lne^rF+g=tE=hV[8MioB(\k2tjjl07L!m-O--n*fc9rpg-^o^r.U!quB_
+rV6EgrqcQirVZWmoDX=@OT0h~>
+JcC<$JcG'9o`"gfrVZTjs8)ckrqQNf!;?Ebs7AGFo()>?n*f]3m-O''l0.<mk2bR_iS`VMh;$`<
+f[n^(eC)ajcHXPTaN2B?_ns4(]tCqe\$iZMZ*:C5rLj.^s.8bOm[X<HrgNkTrL!8/if4,"NJrhp
+M@OTO@q]RlDK']BH@CI"MXl`*NVe\3NUr2-O8b1=O5uB&O8+h7O8k=>O8Y1=O7\P6Ont19OnFh5
+OoCOBOo1C?OoCODPPUIAPPgUDPP:=<QLgICR/EBJR/WKTR[]fASGSlRT)YD_T)PA]T`1YbU&^t`
+U@b5[V#I7gVt?tgWW9*rX8oC$XSo:$Y5PR(YlD!.Z;S$9[^NZT\[8?1SXPn0NfSpHIsZKdF`qhF
+EGfWRMhm(=Isl9OK92"CG@ki#=&DXc>Z"[6BgtU"@V9LqEclY.84Z3D91j\aJ:DHTDfBZ:FoHUk
+H$XgbIXgJ@F8U.QL&$K'rVul+rrA2ZP4Xn9OR&#/OT(=@NW>(<N;ne9MZ/J4L]E50LAur-K`-N)
+Jq8LOJH(-!If+WnI/J?bHMi-hI/SKnIfFotJH(19JqJ]/KS>/8LPUeEMi<USNfT9aP*;,qQC!u,
+S"#t?T:qsRUnsueWN*#$Y-5(8Za@0M\@K5a]t_=u_SjF5aN2NIbg+M\dF-Lne^rF+g=tE=hV[8M
+ioB(\k2tjjl07L!m-O--n*fc9rpg-^o^r.U!quB_rV6EgrqcQirVZWmoDX=@OT0h~>
+JcC<$JcG'9o`"gfrVZTjs8)ckrqQNf!;?Ebs7ASJo()>?n*f]3m-O''l0.<mk2bR_iS`VMh;$`<
+f[n^(eC)ajcHXPTaN2B?_ns4(]tCqe\$iZMZ*:C5:f("dr)!;epe^f_rD<>fq,$rar_3)]qc3Vp
+pJ_)kpJh8o<E/rts&9Il5X.=q5!hS*84Q0C8l#@_!DlYm;#X>k:B4/b:%qBc9hnDW:A[ie:A@W`
+;#3u_:Amuf:@h0[:Amuf:Adob:B+)j:f$g\r(d;fr(m8fqbQTU!)NSh!DcPk;=79Z;#sKjoM>Qc
+;"RQ`;"[Zc;Z'Di;Z0Pn;Z0Jf;Z9Vn;ufkl<<#tt<;T\q<Wc?&<E9#ts&B%upK%5orE0&%s&]D*
+=BSg2rEB;+>Q%b(>QJ#4rET8+ra$XQ>Zk'(:JFJP77':)4?Yeg3&ifS2)Ici6UF(&4%'!5.R#pQ
+3&W99-6sll.5!G92)I-J3''2d5X[[m2E<ra2bQ_58jYd06UF.-r^6`Ur^R&]98%uq5Q=IP:AI]c
+SGeuuStDXJTqS3TUSFW]V5C,fWN*##Xf\b/YHY:;Zi.92[JmTC\%&u[]">Vf]tV7r_#D1L_@+<$
+`lH0AaiMQFaiaV,!*9#!j&Z%Ws,d;Crf@)>!0-u:s,-l7re^Z2!/LQ.s+LH+rIY0'JV!cMs*t&t
+r-eQlr-S-`r-SEjrI+]ps*t'!s++s;K7ei1Knb>;Ll%"IN/WaVO-#KePE_>uQ^F21S"6.CTqS6W
+V5L5jWiN8)YHY==['mHR\\#Mf^V@V%`5Ta;aND]McHaeadaQ^rf@S^0gYCWAhr*JQj5]7`k3(sm
+l0@U$m-X60n*olHncJFTo`"Lbp@n=[q#C0hqY^6hr;HTcrdk*2s*t~>
+JcC<$JcG'9oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_ni61/n*f]3m-O$%l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfcHOJRaN)9<_SO"$]Xt_a[^EHIYck2*i;_[;hVHuAg\KP*g"=s/qq1r%!8@G,s4Rh5
+f[na+e^W*tdF%m=r1j+apTsh*o!SM)(U^WUZa-d;Y&B\PH@LO$M2@:XR%C%O[-k@$[emQ4\,a);
+\Gj&2\GWo3\G`u5\G`u5\cfRT]">TR])B/?]".[Is1.s8s1/-=q76I6ost(5qRcd?qRlsE^VBT[
+s2"QIrPAHLrkncSr58NP!6+fSs2Y/\s2Y,YqSrTWr5nu]rlb>cr6>8e!71Pfs3LVirmCbos3q"t
+!nGlRqq1f!!8.2%rS%>-rS.A.r8.J2!9!_5s5X";!9O1As6'FG!pT"8rTjFLs6^lqnF5u=oCV\J
+p\=LBf[%^Z`P'4#X/DegTU_L@rg#'tOhS?4YHOt.Mh.qI_6]Y]S">=:B51smG_\md:k!tNNg#p%
+Skr<^<E)lqV\,kgPEM,nR$sV:T:_dMUSXrlrr;h]s-EGap9D(+s2"NJqn_j=qnN'CrfR>FOHBI&
+!fi8"repl9MZ/J4L]E50LAuu-K`6W(JcLB#JH(,uIf+WlI.VdaI/JEmIfFosJ8'RdJqJ]/KnY89
+LPUeEMi<USNfT9aP*;,qQC!u,S"#t?T:hmPUnsrdW2co"Xfnt6Za@-K\@K2`]Y;.s_Sa@3a2lBG
+bK\>YdF$Fme^i@)g=k<;h;7)JiT&tZjlY^hl07L!m-O--rpKmWnc&([oCW%Ts7ZKerV6Egs8)Wi
+rqu]moDX=@OoKq~>
+JcC<$JcG'9oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_ni61/n*f]3m-O$%l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfcHOJRaN)9<_SO"$]Xt_a[^EHIYck2-T`1S_T(8H?SH#)XReiEEJ`MjkN<,'!rf$i6%
+UaHiAS5^nDfKrGI=Hm)o8N^/qMb91ooAm0rf6u=jH'A&q2kK7s,d2?r/gl<oT9*8qN1]=!0[>Do
+T9!5rf[5Brf[;Fs-!ADrf[;FqNCiAr/q&DpQPZCqNg`>s-W\OqO%8Ms-`qWpmh5PqO[_Z!1s1^r
+h07as.TLgpnIDUrhTLir20OnoVqkj!3>doriQ1&rNH7*(9t0NZa7'J\$W03T:2+3NfT$KJ:2chr
+cL;ADf0B.NJiUHJpr,eCOqP(JTk^HEFV=0:JOelA3`US@:NteE--5J7n?0F9MBtdIt2ETDfKc=G
+'J92H3\eFIt3+2jQ?A]rH.ggp4iVH\GuSkq3'^!rfR>FOHBI&!fi8"repl9MZ/J4L]E50LAuu-K
+`6W(JcLB#JH(,uIf+WlI.VdaI/JEmIfFosJ8'RdJqJ]/KnY89LPUeEMi<USNfT9aP*;,qQC!u,S
+"#t?T:hmPUnsrdW2co"Xfnt6Za@-K\@K2`]Y;.s_Sa@3a2lBGbK\>YdF$Fme^i@)g=k<;h;7)Ji
+T&tZjlY^hl07L!m-O--rpKmWnc&([oCW%Ts7ZKerV6Egs8)Wirqu]moDX=@OoKq~>
+JcC<$JcG'9oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_ni61/n*f]3m-O$%l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfcHOJRaN)9<_SO"$]Xt_a[^EHIYck2-;#F)h;#F,b;#3ud;#4&b;#3uc9_qKY<W5to
+;Zp&u;cH`k<Vo`.5=%=o4?Ynq6UaI88P2ZP;,C-h;#aAm;#X5j:A@QZ:'OEf9hnDX:Adoe:A@W_
+;#=&a:A[ie:@h0[:Amuf:Adob:B+,i;"m`_:]F2g:BOEj:f.$bm83^V!)WYlmSEm\rD3JkoM>Qc
+;"[Wa;#F/j;YErg:f7*fr_reor)*8fr_rDfr`/qsr)N\rs&K%ts&B)!<VTVm=8c8#=oDJ%>5MP'
+=o_e+>lIq0>[(H<r*;j">Zb$(:/+>O779F,4Ztkg3B/rU2`*B\6UF+)4Zc"r5XIUq2`N]N/fc5d
+/LiG20/YLA3&j#`5!qXs2`<i`3_N%88jYd0r^6WP#t@HV8P)QLK7emQ5PS"I:C<Y_SXl@ETV/!P
+UAgo#UnsrcVl6SpX/rG*Y-5(7Z*Ue9[/RK5[f<f:\c0/F]Y2"m^;%FurkSfU_o0O6`lJ"u#0G'3
+c-03hq,c]Zr)N`Z!g/S+rf7,@NK*pr!K2j7M>rA3L]3&.L&Zi*KE$N'Jc1-!J,XopIJeKbHi8?i
+IK+crJ,Xt4JV&K+K7nr4L5(J>M2I4MN/`jYOHG]iPa.Q$R$jG5SXuIHTq\?ZVPgAmX/rG,Yd(OA
+[C3TU]"G\i^VRe)`Pom=aihlPcHjnce'uq!f@\g2gYL]Bi8ESSj5f=ak32'olKdg'mI'uB!V#XY
+ncA@Srq6<bs7cKes7u]kqtpBjr;H6dJcCl4J,~>
+JcC<$JcG$8o`"gfrquZjs8)ckrqQNf!;?Eb4nS@;o()>?n*f]3m-O''l0.<mk2bR^iS`VMh;$`<
+f[n^(e'cXicHXPTaN)9=_ns4(]tCqe\$iZMZ*:D/iVqa<hqm5Fg\BM&f`KgXfDO;$g&0S'fa$0]
+f%&="daJ$>!71>6rNl4)s0_d5qR$R8[C!?KZEg_6Xq$PdH[^KuL5CkRQ^OMDY4/jt[emQ4\,a);
+\Gj&3\GNi2\GWo5\Gs)?]".UIs1/-@rOW!=!P5i=\G`u7\Gj&=\G<]6\FmE3])'&=]_];C^;%GY
+_#M7I_#;+J_Z%IQ`;IOP_uRdP`W=-$rl=uWqoA`XrQ5)^rlb>cr6=u]!71PhrmCbo!7Uqs!nGlR
+qq1l#s4I5%rS%>-rS%A.h>?%1hr*JjirA'9jT"??k5XTHkiqBtrTjFLs6a4^nF5u=oCV_Kp>t&X
+bf7W9`4`4NV4sWRS"#_/P`q0B\@&WFYG\L[JZ?B!YaU$6S:t$[CIi5eLIt<=It<E9PF\89:Jt"h
+<)KQlVl,W=P*;3#SXlCFTV8-YX/u3upm;#Hqlo^t!3j!5s2"EGrk\0@qnN'C!0dDFs,d;Crf@)>
+!0-u:!fMqnreU]4LPPk`!el;\re(6&s+1-!s*t&tqL/6gr-S<gqgJKns*t#uFFf$qK7ei2Knb>;
+Ll$tGN/WaVO-#KeP*D5sQ^F20S"-(ATV8*TUo(&gWiE/&Y->1:ZaI6N\[f>b]t_A!_SjF5aN2NI
+bg+M\dF-Lne^rF+g=tE=hV[8MioB([k2tjjl07L!m-O--n*fc9nac8BoCW%Ts7QHerV6EgrqcNh
+rqu`no)=4?P5g%~>
+JcC<$JcG$8o`"gfrquZjs8)ckrqQNf!;?Eb4nS@;o()>?n*f]3m-O''l0.<mk2bR^iS`VMh;$`<
+f[n^(e'cXicHXPTaN)9=_ns4(]tCqe\$iZMZ*:D/T`1S_T(/B@SGnuZR[KT?R.Z%"Nr4t7NX(Q(
+NK0!WN/IUk%WQl+BPD7#Df^)IIY*<1oo/p1qMb91ooAp1rf6r<mZ7F0plPN:qN1W9rfI)>r/gl<
+oT9'7qiLf>s-!DEoT9!5rf[5Brf[;Fs-!ADrf[;Fq3(cArK7/Ep6>TBqj-i?rg<VOqO%5L!LfMP
+SG\rRScYOUT)PA]T`1VdU8+LYU@k;\U]@7jVYm=lW:QthWiPut!3Q4$riQ1&rNH7*;mEX6Za7$F
+X/)DWR$EbnN.Z\/I!KjVF)l5<Ci,2jLk^S7IXZ3NJVoA8F_5f9@mEge4]GZr5t4@QA8#h"F*;h!
+84Q?I8q2ABIr9.BE-$/GGlE!rH[UBpJE,\NjQ>V%F8g:]F8L[`L&eHfs8S5TP2q`*PQ$aFOT:LB
+O8k4?NW+k<Mi*DkM#rKgL]3#0KnP-YKE$Q'Jc1-!J,auoIJ\EiHi&3fIK+crJ,Xt?JV&K+K7nr4
+L5(J>M2@+KN/`jYOHG]hPa.N#R$jD4S=Z=FTq\<XVPgAmWiW>*Yd(L?[C3QT\\#Mf^VI\&`5Ta;
+aND]McHaeadaQ^rf@S^0gYCWAhr*JQj5]4_k3(sml0@U$m-X60n*ol;o()DDo`"O`p&Ojcq#C0h
+qYU0hr;HTbrdk*4s*t~>
+JcC<$JcG$8o`"gfrquZjs8)ckrqQNf!;?Eb4nS@;o()>?n*f]3m-O''l0.<mk2bR^iS`VMh;$`<
+f[n^(e'cXicHXPTaN)9=_ns4(]tCqe\$iZMZ*:D/;"mc[;#=&f;#aDl;#X>h;#*le;"[QU<Us,c
+<Vo`*5!_4n5<_D"77Tg;8kMkV;#aAq:esk^:A@QZ:'"'ar_<Dfr(m;epeUfaqbR,b!)<Gfr(m;e
+oM,?\s%iPfrD3;c!)NSj!)NAbr(m;er(m>hqbQTUr(d;hr__oV!)`Ab!Du\d:]=2i;?'Pg;?'Gm
+;>X8k;uKVl;>=&g;tO&g<W5tq<W,tt<W5r!<E)rl<rH+u=T2J%=9)M'>5MP(=o_e+>Qe87>?kD3
+>l@q9=BAEt9h\,J6pX%$r]U9@!&sj71IXVt69dXs4$u;!69[Ii3&`QE*%!$].PN\32)@*L3BTGj
+6:*Uh2Ej;`91_ZH5<qS&6iBC]7S--A91qm/JqJ]0L%[b.:@q=%YaqAXT:hjNU8"EYUnsobVPpGn
+X/rG*Y-+t4Z2Cp.[/RK5[Kj:O\[oDb]Y4<Y$bsKl^qmk(`5KX7`r=$Xa9Ki3bKS12<q]VZ<r>qt
+PQ$aFOT:LBO8k4?NW+k<Mi*DkM#rKgL]3#0KnP-YKE$Q'Jc1-!J,auoIJ\EiHi&3fIK+crJ,Xt?
+JV&K+K7nr4L5(J>M2@+KN/`jYOHG]hPa.N#R$jD4S=Z=FTq\<XVPgAmWiW>*Yd(L?[C3QT\\#Mf
+^VI\&`5Ta;aND]McHaeadaQ^rf@S^0gYCWAhr*JQj5]4_k3(sml0@U$m-X60n*ol;o()DDo`"O`
+p&Ojcq#C0hqYU0hr;HTbrdk*4s*t~>
+JcC<$JcG$8oD\^erqu]ks8)ckrV-Hgp@eLY47r.8o'u5=n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-4AQaMu3:_SO"$]Xt_a[^EHIYl!DYi;_[:hVHuApt>`$pt5W"rS%8(!SH$'eHFCM
+dEp8;cN'a5V!bYa[K<kD[JmK3YRmspR<a(,JVAo<Ng,s&U8bEm[0!eE[f3]6[emQ3\,a)<\G`u2
+\GNi4\GEc7\,s4N\Gj&4])T>?]D]>?\H0:PqmcU8qmc7.rODO2rjqs<s1J3A!kuFaq8!$Hq7usF
+rkeZPs2=iQrknfUq8NHUaSs6Y`r!gVaSs<\b5TTabl#`[c2c2fd/MGmdf7ere,n1OfDF5!g&BY%
+f`9b*g]-(.gB-0dh>H.0hZ;Zor8R_9r8dn>rT=.Cs60LJrTaIMrpB^Q>jq1Po(2MEl.a_3ai;0:
+_69l9US+0JR?s8*PE3Ae['Hp<W3)&2V8B=PW0r1$O+UAKDb"VkLIt<dIt<H:Pan;9:Jt%i<)KQl
+Vi?k%Od)6%SXuLITq\E`XKD@!pQtfDs021$rNNm5r5&'Co>(7<r4`2q!0dAE!KiKCO8k4?NW+k<
+Mi*DkM#rKgL]3#0KnP-YKE$Q'Jc1-!J,XomIJ8-bIK+crJ,OluJV*lR!JH1+L1Q-rM2@+KN/`jY
+O-,TgPa.N#R$a>3S=Q7DTqS6WV5L5jWiN8)YHY==['mEQ\[oGe^;%M$_o9U8aN;WKc-FY_dF6Uq
+f%8R-g=tH>hVd>NioB+]k2tjjl0@U$m-X6/n*fc9rpg-^o^r.U!quB_rV6EgrqcQirVZWmoDX=@
+P5g%~>
+JcC<$JcG$8oD\^erqu]ks8)ckrV-Hgp@eLY47r.8o'u5=n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-4AQaMu3:_SO"$]Xt_a[^EHIYkt*mTD>)MSbnrSSc>5ZRfo1JR@'B>QN3EFJaSQl
+Nrk?$NrG";M@bV^G@Y2sBl%[,Fa8@aJqf0WMu\k6N;8J+Nr+n:Nr>%2OT1IAO8t@:OT1C<OSk1=
+OSt7<OSt7;O8t@>OSt==OT(CBP5g[:OSb1?P5UOBP5gaGP5^UCP5gaAP5gaGP5^[=PlI$GQLgIB
+R/EBLR/E?RR[]fASGf#OT)PA]T`1YbU&^t`UAL\cV#-qeU]@7jVYm@lW;EOoW;ERoWW9*mXT,F$
+Y5PR(YlD":Za-[.TU_C8OH5BTJpr&mGBJ"JDJj</Nf8dKKn=c%E,:&cJW+tuAT)9k4]53@;dEp#
+7U9G5BPha1G'QSK7ncQJIt)ucDJsK7F*;bPH?spcIt*!#iT&tZjlPWFEr'hWFSp4[L%U3!Ye'l4
+OnFn$OoLXGPPpXFOc]R's,I)=repo:MMhCi!f2Vere:K.KS9>Ws+:9%rIFotrdOZkpO)dbs*jut
+rI=p"K)UB'KSBD[AVZ(uM2I7NNK0'\OckllQ'I]'R$sM7SXuIITqeE[Vl-MoX0&P.Yd1UB[^N]V
+]"G_j^VRe)`Pom=aihlPcHjnce'uq!f@\d1gYL]Bi8ESRj5f=ak3(smlKdg'mI'E2n*olHncJFT
+o`"Lbp@n=[q#C0hqY^6hr;HTcrdk*4s*t~>
+JcC<$JcG$8oD\^erqu]ks8)ckrV-Hgp@eLY47r.8o'u5=n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-4AQaMu3:_SO"$]Xt_a[^EHIYkq8j:\R]`:\did;>X2a:B4)]:$P^Y<;]br<WQ3$
+r)F;-4[;(l5!2%q6UjR88P)WOr_Ner:f'q`:/:UZq+gf]s%`Jfr_E5ar)!8dr([5dr_EAer_E)[
+s%`Sir(d2dqb@,er_NSjpeL`_r_E>d!)WPgm83^V!)WVkl;.IXoM>Td:f-m^r_WSkr_iJfs%r_m
+r)3Pnr_iVjpeq)io2P]hs&AnrrDrntr_ru"<)clm<r?%t=T2J&=9)M'>5MP(>5qh,>lS".>5hb+
+>S:=I=B8<s:.n/K6pa.(4?bkh3rCp-770F/5Wq:m6:!k'4?bba2`!0=)(6p^.kih52)7!J3BTGj
+6UE^j2Ej8_91VT>5<qM&6:4(-7n6*@8kMcKJ:`B*KS5%C55d\G5l!YE:A%E]YQLGfStQ%V&Yu1t
+V5:&fW2ckuXKAV-YHY;1Z37M@['d=@[L0OT\[oDc]Y2%o^Abk[^r!t+`5T^8a2Z0@aiV]KbKA!*
+<qTP]<r>ttPQ6pGOo^],rf@)>!0-u:!fMqnreU]4LPPk`!el;\re(6&s+1-!s*t#sq0i!bq0i9l
+s*sut!J,k%K)pXZre>!>Ll$tGN/WaVO,oEdP*D5sQ^F//S"-%@T:qsRUnsueWN*#$Y-5(8Za@0L
+\@K2`]tV7t_Sa@3a2lBGbK\>YdF$Fme^i@)g"P3:h;7)JiSrnYjlY^gkiqBum-O--mdKW6nc&(\
+oCV\So`Fj]p\jmeq>U6gqu-HkrU^#>s-!D4~>
+JcC<$JcG!7o`"gfrquZjs8)ckrqQNf!;?Eb47r.9o()>?n*f]3m-O''l0.<mjlGI]iS`VMh;$`;
+f[n^(e'cXicHOJSaN)9<_SO%&]tCqe\$iZLYkm>XhuqrohVHr]gAT_$fDsV&gAfh2f[n^)eC2jm
+ps8c3rh]Xlj0fi4[C!<HYct:5YE>H&IXd!*M2[O]S"?CU[/.05[^EQO[JdQ2\,Ei:\c'&:\bW`:
+\[]0G\c9/>\bru6\c'&<\H'/=\bE]7\H9@S]DT8=\bio8\bio.\c'&2\c02:]DfJ?]`Pp_^\P\F
+_>1nF_>_=N_uI[Q_u@RS`VIOOa8O$S`rO3[ao0B]bQ#fbc1fN`chl)hdJqYpe,Ro!e^i@Lf_sM&
+f_sM'gA]k,h#H./h#H4-h?)TmiV_^7j8A!;jo+?Ak5sl3lM^#Km/?>Omf2bUnON*3gXF9d`l5p7
+ZDjasU7[pER?j&$O1`$1ZELF/X/DDba/QqVS!JhkLNHHbF@pJ!LIuc8ItEN=Q(4G;:Jt"h;c0Hk
+ViLb=%$[0MS=Z@GTq\KdXfhL"s-N\Mr0R8GpTa\$ri`s6qSDsDrk\<DqS2sBs-3YMPEZ!/!g/S+
+rf7)?NW+n:MZAY6M#rKgL]3&.K`Hf)K*$XUJc(&uJ,Xo`IK"]qJ,OotJH1<$K)pXZre>3DLl$tG
+Mi<XUO,oBcP*;,qQC+&-S"#t?T:hmPUnsrdW2co"Xfnt6Za7'J\%0)^]Y;.r_SX71`lQ6DbKS8W
+d*^:jeCE1&g"P08h;-uHi8WeWjQ5Oekiq?slg4!*mdKW6nF?)?oCMVRp&Facp\jmeq>^<gqu6Nk
+rU^#>s-*J5~>
+JcC<$JcG!7o`"gfrquZjs8)ckrqQNf!;?Eb47r.9o()>?n*f]3m-O''l0.<mjlGI]iS`VMh;$`;
+f[n^(e'cXicHOJSaN)9<_SO%&]tCqe\$iZLYkk$lTCnfMSc,)TSc5/ZRf]%HR/30LR/_^;JGFcr
+K&_n0NK0!XN/ELLM2H;"A7fLjDJsT?H@16rLPtte!0-i6q2P'-r/^f:r/^N4s,m8A!0?r;rf?o;
+qiC`<rf?u=rK$i;s,[,?rK6r<s,m>Es,lr8oTB0:s-*JGrfR2Cs-*8AqNLT:!1!GIo9]HDr0dGL
+r0dSR!1WbRrLNVQrh'1_rh9@d!2K:_s.][lUSO^_UB%+hV>mFjVuN^mW;rmnWW0!kXT,F$Y5GJ3
+Yd(I6UnF3FQB[GjL4Xl$G^+=QF)Pu6D2jI0L4k,,I<p$dP(/C<G&qG8B37>[=$]hmAO9U,@:X%g
+EH?;K7n?-D92'hcJ8K1AEH6,DGBeF[H[L<oJV2q@j5]4^jlZG\olKn_!3uL,ri`s6qN:H6lB2+3
+!gJn4rfR>FOHBI&!KN0=N;ne9MZ/G6LkgcbLAur-K`-N)Jq8LNJH(,uIdDL^IfForJH(0#K)UB'
+KSBD[CPR_&M2I4MNK0'\OHPcjPa.Q%R$jG5SXuIHTq\?ZVPgAmX/rG,Yd(O@[C3QT]">Vh^VI_'
+`5Ta;aND]McHaeadaQ^rf@S^0g>(N?hr*GPj5]4^k3(sml0@U$m-X60n*oi:o()DDo`"O`pAamc
+q#C0iqYU0hr;?Nbrdk*5s*t~>
+JcC<$JcG!7o`"gfrquZjs8)ckrqQNf!;?Eb47r.9o()>?n*f]3m-O''l0.<mjlGI]iS`VMh;$`;
+f[n^(e'cXicHOJSaN)9<_SO%&]tCqe\$iZLYkh2i:]F5k;>O,e:\die;>O,`:]=&`:&duO<rH"u
+<;T\p<"qJ^3^,bk5s[q/7n-'B9MeP_:esmd:AIW[:A[cc:B"&h:B+&g:A@W`;#F,d:B+&g:A[ie
+:@h3U:B"&c:&n)h:]O;d:Adoe:A[fe;#=&U;#F)h;#O8V;#aDc;#aAm;#!ib;#X>k;Ys;m;Gg<i
+:]OAj;ZB\p;Yj8d;Z9Vd<;okt<;]bo<rH%r;ufqt<WH.s<rH+u=T)D&=T;P'>5MM/>$G39>[(E9
+r*'b8<`;gi91_WB6:!e!4Zkhe3W:p.2ap&$69[Op4#o5b6p3[p2a'&U2CBIl/1rJ-2D-[<1H7BW
+4[DG%2`N]Z4ZQ/,83oI*5t""+6UXC684Q<H91j_cJqAW.KSB:er]gEJqEOaN!3uL,riZBpT:u7Y
+&Yl.tV5:&eW2ZesXKAV-Y-5,/Z3%A>[/RK5[Ka4N\[oAa]_fDI^VI\&_o'Fl`W*p`a2uHGbK@uL
+b5,06=7]Jm<W#nq<WA<cP`q=1Oogc-OT(:ANfF$ss,-l7reU]4LPPk`s+LH+rIY0'JV!`Ls*t#s
+m!\k^s*suts+(0%rdt6)L&QgBLPUeDMMmFQNfT6_P*2#nQ'Rf)R@B\:StD[LU84W_Vl6VrXKA\1
+Z*UdE[^WfY]=bkm^r!t,`Q$!?b0/#ScHstee'uq"f@em3gtgfDi8EVTj5f=akNM0plKdg'mI'H3
+nF5u=o(2JFrq6<bs7cKes7u]kqtpBjr;H6dJcCr6J,~>
+JcC<$JcG!7oD\afrVZTjs8)ckrV/YPp@e1Po^qbGo'u5=n*f]2m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-+;PaMu3:_SEq"]XkY_[^<BGqVhG3s5*q8h;$c[gABS%fDsV&gAfh-f[n[Qe,n(G
+d/2/gc2c,eV#@.hVW5,b[0!_@Zi7-?Y,cK+WdK5DKntYHPa@l5VQKd(rO2a6rO2U4rODm<rODd9
+qR?U;\@D@F!P#]<\G<]7\Gs)>\Gj&5])K5A]">TP])B2:\G`u8\F[90\GEc9])K8>])0,<]_fAD
+^;%GY_#M7H_#;+K_Yq@P`;RUP_uRdO`r3sV`qm^WaN;R%b5TTabl#`[c2c2fd/MGmdf7c!eCE+$
+fDF5"g&BY&g&B_*g]#t0gYCT`h>H.0huD[5irA':jSn9>k5XWEkQ'oHli6>NmJcPRmmH6md`KVN
+`PTL%WMZDbSt)7=QBIDnO1DR%YH=b'VO3U0O,^$)MM[sVHr+TjHq\U3F`hkQIt`iCQ^XP<:f:(i
+;c3Ol%ul[5Od)3$S=Z@GTqeQdY4qtqQhm$HQhm$GYQ1s,YlCp+Y5bW<s7aA+_Yq=F_"thE^&XJu
+Q2d'KPQ$aFOT:LBNsC])NJrgSMi.Lj!f2Vere:K.KS9;V!ePuSr.+crrdO?brdOirrIFp!!.t3&
+!JH1+L1Z3sM2@+JN/WdXO-#KePE_>uQ^F20S"-(ATV8*TUo(&gWN*&%Y->.9Za@0M\@K5a]t_=u
+_Sa@3a2lBGbK\>YdF$Fme^i@)g"P39h;7&IiSrnYjlY^gkiq?slg4!*mdKW6nc&(\oCV\Sp&F^c
+p\jmeq>U6gqu-HkrUTr=s-3P6~>
+JcC<$JcG!7oD\afrVZTjs8)ckrV/YPp@e1Po^qbGo'u5=n*f]2m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-+;PaMu3:_SEq"]XkY_[^<BGqOmh[nt,]KrLE\S!1a"W!h,OErKmPMrKmG4rIOs"
+j,a5#!f`.trJ;)@@!.$2B5)7$E-->NI=d01nr3C(ooAs2rJpf:ooT39rfI,?qN1Z:qiL]9rK.&?
+r/gl<qiLi=r/go?q2b`AP*1rioT8^-s-!AF!0[>Drf[;Fq3(T<qiq,GrKI;Iqj-l@rL!JMrL!JM
+s-`qWpRM5RoUc&Ss.K=as.TLgpnI_^rhTFd"JhljVPa9hs/>gos/>gos/H("orJ.qr3#t$>,nBl
+S!]M*O,f$IIX?EdF`VVCDJX-)Mhm(?JUVrkFDu)5BmXu<CNEuj4&8RW6!.Pu=^56@@qfh#FEi%#
+8OlHI9RhSDD/O61EH?;IG^=[_I=Hg"hr*JQro4(@jlQ;YoQ0qb!3uL,s0)F)s/j$8pQ>*2mZ@L8
+rg!MJ!0dDFs,d;Crf7;ENK&mUMi3JlM#rKgL]3#0KnP-XK*$XUJc(&tJ,XodIK"]pJ,OotJH1<$
+K)pXZre>$?Ll$tGMi<UTO,oBbP*;,qQC!u,R[]h=StMdOUSOcbW2ZeuXfen4ZEppH\%&u\]Y2(p
+_8=+/`Q-'AbKJ/UcdC.heCE.%f\,!5gtgiEi8N\UjQ5OdkNM0plKdg'mI'H3nF?MK!qZ'Vrq6<b
+!;HHes7uZjr;6HjrVc<dJcCu7J,~>
+JcC<$JcG!7oD\afrVZTjs8)ckrV/YPp@e1Po^qbGo'u5=n*f]2m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-+;PaMu3:_SEq"]XkY_[^<BGrD<)]r_WVlr_NVk;#*oc;#O8g;#=&g:Amud9`7]b
+:?,CQ<W,l2;a3K45<M(o5sRq/77TpA:/Fb_:]=,b:&.Q]:&duf:]F2i:&du`:]+&f:]!od:&dud
+:]=,]:&7W`:\mfd:]=/j:\[]_:BO?d:/:^_!)WPgm83^V!)WVkl;7LXohbZc!)WGdr_WSkr)3Gi
+!`DlmrD3JkpJUibpeq)io2PNcr)Wbrqc!Yt<`W5t<r?%t=T2J'=T;P'>5MM(>5h`7>[(E9>?b?6
+<`2gj8P;TC6:*n!4Zkkf3B&lT2`3rj69[Rr3]T/V2)@$L3&riP1+4"e-SI&(1b1:61G^pK4?l+u
+69$t`5!;#$8Ou-35X@_'6pjC47n?0D9MBnbJ:[]O!eZ/ZrBL6Er]g?Hq`k!S!3uL,s0)F)s/d97
+U7n<VUnjiaVPgDnWiN5'Xfek3Z*:L=Za-pErj<$?\$roZ]">Vgrk8]P^:qD!_SX71`;[aU`WsT,
+aiMTFaiX9XqH*8hr)NbtrD`i`rg!MJ!0dDFs,d;Crf7;ENK&mUMi3JlM#rKgL]3#0KnP-XK*$XU
+Jc(&tJ,XodIK"]pJ,OotJH1<$K)pXZre>$?Ll$tGMi<UTO,oBbP*;,qQC!u,R[]h=StMdOUSOcb
+W2ZeuXfen4ZEppH\%&u\]Y2(p_8=+/`Q-'AbKJ/UcdC.heCE.%f\,!5gtgiEi8N\UjQ5OdkNM0p
+lKdg'mI'H3nF?MK!qZ'Vrq6<b!;HHes7uZjr;6HjrVc<dJcCu7J,~>
+JcC<$JcFs6o`"gfrqu]krqcZjrqQNf!;?Eb!VH!_nhot,n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZRhcHOJRaN)9<_SO"$]Xt_a[^EI"q;M>2"lJ1nh;$c\gA'>%f\-2Vs4IJ+f@BlM"k(fF
+d*L&9cMl&gU\gkbV=q@b[0F(HZa-j?Y5YO9Ngk9@ItEB2MN3piT;&<l[C3L;[f!W4\Gj&=\GNi5
+\Gs)>\G<Z9\@MOIq76L7s1&3@\[hFFrj`'@]DB,;\c9/@\[]0J\c9/>\c0,1\c'&7\bWi6]D]DB
+^&>YF^\>PD_>1nF_>V7M_uI[T_u.IQ`V@IOa8O$Ta8a3\ao'<\bQ#fac1fK`chl)gdJqYpdfe1N
+f%/IMf`'S&f`'S'gAfq,g]cHfgtgiCqq_D3i8ORms5X(=rT4(Aroa=F!9sIJs6T^O7df[*gsX<d
+`l5d2];hd'U7[pDR$NntP)d&ZZEC=/W2>oGO,f-TLP:A-H[9gXEcZ>CEclMKGC>!sO-#g"TNP,i
+:K:@krhg9cO-5ThQ'n/6TV/!QW2cuns8J;aQhQgGQhcsEYlCp,Y5>?9s7aA+_Yq=M_#M1I_#;%F
+^&sahQBqN8#F(F9P*1riOT(:GNfB$WN/NUOreU]4LPPk`!el;\rIb-%s+1-!rI=cpp3ljfs*srs
+!eGrTrdt6)L&Qg9LPUeDMMmFPNK0']OckomQ'Rc(R@9V8SXuIITqeE[Vl-MoX0&M-Yd(OA[C3QT
+]">Vh^VI_'`5Ta;aND]McHaeadaQ^rf@S[/g>(N?hr*GOj5]4^k2tmll0@U$m-X6?mfDqJrpg-^
+o^r.U!quB_rV6Egs8)WirVZWmoDX=@PlH7~>
+JcC<$JcFs6o`"gfrqu]krqcZjrqQNf!;?Eb!VH!_nhot,n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZRhcHOJRaN)9<_SO"$]Xt_a[^EH6q4R_ZnXfZLrLE\S!1a"W".GXFQi!*JQN3ELJGaua
+O8"Y<NJrgSMM_=g%rli(AS5^oE,]rFI"-d&MtDu(NV/>0O8b1:O7eV7OoCIAO8=t:O8G%9O8Y1?
+O8Y1=O8=t<O8G%=Onk(AOckliOn=b,OT:RCPP^OCPPLC;PPg[FQ2QpIQ26g>Qi*6KRJiNLR0&hH
+S+rNQSb/NQTDtS_U&UheU\CM_U]%"cUB%+hV>mFjVuN^nWW/poWW/suX7`OoXo,@%Y8".>UnO6D
+QB[GiM1^8(H['[REH#gpC_hqaKnY),H[0^PD/3ftARf1T>?b33<rH)1=BSg4?Xm\aDK9iE9h@oH
+r_*BCJ:[];s)8]nFa/.WH@($hJUu\7i8EVSj5f:_jo08qEqOJSEeaLrs0)I*qlRX5pQ>'1o8s6=
+Occ#tQBqN8#F(F9P*1riOT(:GNfB$WN/NUOreU]4LPPk`!el;\rIb-%s+1-!rI=cpp3ljfs*srs
+!eGrTrdt6)L&Qg9LPUeDMMmFPNK0']OckomQ'Rc(R@9V8SXuIITqeE[Vl-MoX0&M-Yd(OA[C3QT
+]">Vh^VI_'`5Ta;aND]McHaeadaQ^rf@S[/g>(N?hr*GOj5]4^k2tmll0@U$m-X6?mfDqJrpg-^
+o^r.U!quB_rV6Egs8)WirVZWmoDX=@PlH7~>
+JcC<$JcFs6o`"gfrqu]krqcZjrqQNf!;?Eb!VH!_ni$%-n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f[n['e'ZRhcHOJRaN)9<_SO"$]Xt_a[^EG=;>j>_:]F8k;>j>d:]4,g;>O)h:\mib:\mc_:%hWT
+<<-(t<<-"t;\;/W3B]Ph5=._,7n-*C92JD[rD*2`qG-l]!)EMhs%`Pfs%`>br)!>fr(d2bs%`Jf
+r_E)[qG-ubqG%#dr_NSjpeL`_"&;Qb:Amug;#=&V;#F,h;#X>k;#O2Y:]OAb:]XEiq+pudrDEJj
+r)!Mn;,R9gs&&Siq,-obr_rDfq,R>nrDi_o"BAK'<E8osrE&r"rE0,&r`T8)pKJeG>?b99=&r6s
+:eFAO7R9@*4Zbeh3B9&V2Dm<Z6pa+%4oRJA2$bul1GLR9/M/OQ/,h(@/MA\/0f([H3^#Yk6om7e
+2Ej;d91_Z?5sI\%6UX<@7hJ9^92&!,I=H`tJV&N,KS2NQrBL3Dr]g<Gr'(0Wr364)s/u7$s.L+#
+USO`_VPgDmWiE/&Xfeh1Z*:M4ZN%62[/RK5[g0FR]=Y_g]tOEZ"2DXf_Z%IP`;ddYa2uEErQ,#\
+pK%,lqH!Vrr)WPl".5F@QN!-SP`q;oP*(lgrf7;ENK&mUMi3JlM#rKgL]3#0KnP-XKE$Q'Jc1,t
+J,OiiIJeQoJ,FfuJV&LQK)pXZre=m;Ll$tGMi<USNfT9aP*;,qQC!u,R[]h<StD^MUSO`aVl?\s
+Xf\e2Z*UgF[^WfY]=bkm^r!t,`Q$!?b0/#ScHstee'uq"f@\g2gtgfDi8ESSj5f=ak32'olKdg'
+mI'uB!V#XYncJFTo`"Lbp@n=[q#C0iqYU0gr;HTcrdk*6s*t~>
+JcC<$JcFs6o`"gfrVZTjs8)ckrV/VOp@e1Po^qbGo'u5<n*]T0m-Es$l0%3kjl>C[i8EJJgtUQ8
+f@JI$da?Fec-+8NaMu3:_SEq"]XkY_[^=ugiVqd8hZVflgtUTYg@a.ug'cTdf%&=#e'l^kd*MU7
+rQY>:rM9@fosOG!rj*WPZa7$FZa$d>Y-"b+XHK6'I=R$,M2RO`S=l^Z[/RK6\,*Q2\,Ei8\c92:
+\bio.\HB@P\[_FFrj_m:p:C76!P5o>])B2>\Gs)>\G`u<\Gs,>\FR30\GEc3])0,<]`5\D^&YqB
+_#D1H_#;+J_Z%IQ_uR^P`;dgO`r3sV`r!gVaSO'ZbPo`ac1fN`chl)gd0S1Le'upuf%8ONf`'S'
+f`'S'gAfq,h#H+0gthe_s53n9qr7Y9rT*q=roX7Ds6'LJlMg,Km/QH)m,ZpLb/hTA_SNd^WM?2Z
+R[KS0O-#H_\?W?BY,\LTJ#ABgMi!.?K6qohGBNn+s)KH.F\Y_[JVK/GQ^XM;:fC4n<)c\mW2GZ;
+OcblmR@Kh?T:hpVX/u!on!3s?q3D)IYHRr.r2ot"!3<s9p;-UBrk\QKrP/BJr4i-Cs-WhQ!1*VL
+#F(F9P*1riOT(:ANfF$ss,-l7reU]4LPPk`!el;\re(6&rdjutrdXHerI=crs+13%rdt6)L&QgD
+LPUeDMMmFPNK0']OckllQ'IZ&R$sM6SXuIHTq\?YVPgAmWiW>*Yd(L?['mHR\\#Mf^V@V%_o9U8
+aN;WKc-FY^dF-Oof%8R-g=tE=hV[8MioB([k2tjjl07L!m-O--n*fc8nac8BoCW%Ts7ZKerV6Eg
+s8)Wirqu]moDX=@Q2c@~>
+JcC<$JcFs6o`"gfrVZTjs8)ckrV/VOp@e1Po^qbGo'u5<n*]T0m-Es$l0%3kjl>C[i8EJJgtUQ8
+f@JI$da?Fec-+8NaMu3:_SEq"]XkY_[^;\&T_kART(&<JRff(GQ^@W9rg3YPrdacpqi:-+r/Uc9
+s,?u9!fDhjreCu)Ht-f'Ci403GBnXgKno>[q2P*.r/^f:r/^N4rfR2Arf?o;rK$f:qiC`<s,[,?
+rK$f:s,[#<!0R,>s,m>E!0Ql7o8s$9rKI,Arfd2Aq31`@s-<PIq3L`@qj@;Lrg<ML!h,UJpmh>S
+o:GuS!204_!huHbpnIb_rhTFds.o[ks/,^ls/>jpri#aos/Q+"r2]n!qlK[t/ZPV?R[9>)O,SpI
+J:)]gG&q_DD/=$*Mhd">JUVr_BRsu8BkCmb@U3/@=BAQ&=!1OH=[khf@V0CoEHHGN7nH6G9MA$,
+It2ESD/XB6Fa/01H4,+MJUlS5hr!ANioC%!!9O&sqf;COrGqqAriZ1$ri?+#_>j4ko9/^-rfI/I
+s-E_Orfm_QPEV/mOcbb)Nrb9#rf$l8!/gc4!f2Vere:K.KS9>Ws+:6$r.+crnUCFdrIFp!s+:6&
+!JH1+L2D^%M2@+JN/WaVO-#KeP*D5sQC+&.S"#t?T:hmPUnjlcW2cl!Xfen5ZEppH\%&u\]Y2(p
+_8=+/`Q-'AbKJ/Ucd:(feC<($f\,!5gtgiEi8N\Uj5f@bkNM0plKdg'mI'H3nF5u=o(2JFrq6<b
+s7cKes7u]kqtpBjr;H6dJcD#8J,~>
+JcC<$JcFs6o`"gfrVZTjs8)ckrV/YPp@e1Po^qbGo'u5<n*]T0m-Es$l0%3kjl>C[i8EJJgtUQ8
+f@JI$da?Fec-+8NaMu3:_SEq"]XkY_[^8n/rD<Mis%`8`s%r_mr_W>br_WPjqG7/fqG-rar_3)]
+oi:W`r_req!*/qrrDNkt5!h@m5Q3qQ6q0U991_kU:AR]]:A[cc:B"&h:B!uf:A@W_;#F,f:Amoe
+:Adoe:@h0\:/1[^rD3;cs%iYks%iDbr(dDi9heC]:]F8g:[V'W:]F8j;>sDj:[_*[;=mZc;,I*b
+r_WMir)3Gi!E)em;#aDk;?0Sn;YX,a;ZBYr<)rTjq,R>n"'&B%<VfYs<E<+"qc<VrrE0&%!*K5'
+s'#>)!aJr7r*02%'N.e)91h`D6:3t#4$5Sa3B/lS2DkD#s$%/[4$c.t2Dd-E0eb75/1W;&.P!(L
+/M/V51c%!J3]oYn6UEam2Ea5e2bQ_569mb$5sn%-7R]d;7nHBHI!pHmIt3*%rdt?,5<h=qq`k'D
+r]g6Er'14briZ1$ri?^4Tq\<XV5:&fWN)u!XKAY.YPtd)ZN%68['d?N\$rpI]*#^Z]Y4<Y!l)Rg
+qnif[`Pom=a2l?BaN2Ks<r,no<rH%t<qfVoR/`KQQN!-SP`q;oP*(lgrf7)?NW+n:MZAY6M#rKg
+L]3#0KnP-YKE$Q&Jc(&tJ+8!dJ,OotJcC?$K)pXZre>9FLl$tGMi<USNfT9aP*2&pQ'Rf)R[]e;
+StD[LU84T^Vl6VqXKAY0Z*L^C[^WcW]=bhl^VRe)`Pom=aihlPcHjkbdaZdtf@\d1gYCWAhr*JQ
+j5]4_k3(sml0@U$m-X60n*oi:o()DDo`"O`pAamcq#C0iqYU0hr;?Nbrdk*7s*t~>
+JcC<$JcFs6oD\^erqu]ks8)ckrV6Ee!;?Eb!VH!_nhot,n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfcHOJRaMu3;_SO"$]Xt_a[^G&OqVhG3s5*q8h;-lag\]^ug&B\+g"?;Ss3q5$da?Fg
+ci)/dc2OO<U].(fV=q=r[.q!(Z5p3UZ*CO;Y-"h+X,<9hH[pa&M2I7TR@U(LX0oCFqR6=2rODg:
+!4_m9qmc.+!4_d6!4`$=!kPqQp:C:7s1/3Bq7?O8!4_m9s1&'=!4_R0s1%p9q7?I8rOi0DrOr9H
+pV?dEqS<'GrPJQOpV['Npr<9QrPn]S!6G#Zrlb>cr6=u]!71PhrmCbo#1M)Pe^i@(qq1o$rn.5'
+rS%;+rnIY2gtgiEqq_D3i8FIks5X+>r8mq?"R#"4l0835rp3eRjP/,)aMu39_7?PEUS=BNR[KS-
+OH,@5Z*LO7WiDkFUoLi?YD%U\I<g!ZF`;GCEefNJ:/HFmLlRUcR\66K;c$Rq<)JXQW2G]=Od))r
+R%0\=T:hpVWq68NQ2m3JXo>F#WrT0:s7X;*_Z%CM_"YV@^&XT#R/`KQQN!-SP`q;oP*(lgrf7)?
+NW+k<Mi*DkM#iEfrItB-KS9;Vs+:9%qgeWppO<$ir.+fus+:6&!JH1+L2Md&M2@+JN/WaVO,oBc
+P*;,qQC!u,S"#q>StMdOUSO`aW2ZetXfek3Z*UgF[^`lZ]=bkm^r!t,`Q$!?b0/#RcHstde'uq!
+f@\g2gYL]Bhr*JQj5f=ak3(sml0@U$m-X60n*ol;o()DDo`"O`p&Ojcq#:*hqYU0hr;HTbrdk*8
+s*t~>
+JcC<$JcFs6oD\^erqu]ks8)ckrV6Ee!;?Eb!VH!_nhot,n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfcHOJRaMu3;_SO"$]Xt_a[^Da"qOmYVoq(`F!1`qU".GXFQi*0JQiEHFJbb>uO8Y+:
+N>me7Mi3IMM26tBLMqBHA8#^oDfBfBI"6g'LlM.fqMk3/r/^f:r/^T6!KiKCOoCI@O8P+:O8G%9
+O8b7@O8Y.BO-#HaqN1`<qN(]>qN1`>s,mAEo8rR+!0[;Eqi^rBqNCc?q3:oEs-3PKq3LcAqO%2K
+rg<PMrgEhVpRM8So:GrRr1X+a!2K=`rhKFfr1j:fs/#^lr29Rnr2K^pr2K^rs/Z(!!3?!u0s.U]
+Xf8+hR[9>)O,SpIIscNcG'%eGD/=!)Mhd%?Jpr&kBn(VeN.,;G?sQu?<`W6"<Y8kU7R]gT@qTXs
+F*)\Q7nH3Gr_*`=J:W2fDJsN8EccPNrd"ZoIY$;Rh>c@7i8N\Uro=(@pMp%MpN-:Rr2ot"rMopu
+_Z0=lqNCl@r0$Z6s,[5Krg<_P!1*VL#F(F9P*1riOT(:ANfF$s!fMqnreUZ3L])r/KnP-XKE$Q'
+JbsurJ+nEiJ,FisJcC?$K)pXZre><GLl$tGMi<USNfT6_P*2#nQ'Rc(R@B\9St;UKU8+N\Vl6Sp
+X0&P.Yd(OA[C3TU]">Vh^VI_'`5Ta;aND]Mc-F\`dF6Uqf%8R.g=tH>hV[8MioB+]k2tjjl07L!
+m-O--n*fc9nac8BoCW%Ts7QHerV6Bfs8)Wirqu`no)=4?QN)I~>
+JcC<$JcFs6oD\^erqu]ks8)ckrV6Ee!;?Eb!VH!_nh]h*n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfcHOJRaMu3;_SO"$]Xt_a[^H*3r_WVjrD*,`q,$i^rD<JjqG75h:f%!aqbQiYp/V)k
+pf%#erDW_qs&8np&jAQ@4$Ghm5s[q-7nH?F9MJ8Wq+^`]qb7&cr_NMgr_<Aer(d;fr_NJhrD3>d
+r([2dr(m>fo1]6\:&Ric:]!oe:]F8k:\[]_:BO?d9htX_s%rSgmSNgWs%r\lr_WPhmna!]r_NSl
+peV#h:f.$br_WMir)3Dh!E)em:]OAk;ZBVo;YX,a;Z9Vd<;KVm<rH%p;up!"r`/ksqcEc!q,m]$
+qHEr)r`^7B=&Vsl91hcE6:!h"4$#G`3B/rT2)IZe6iK;,4#oSl4?l"k0/,"1/1W8%.P!&#2*!NO
+1Gq*N4$>bm6UEam2EX)b4@Vn58O5U+6UF1.7/fXY84Q6FHiAEmIKP(MJV*lR!/0r.s$$EHq*=mC
+r2ot"rMpU3U8"H[VPpJnWiE/&Xfeh1YctD2Z2h61[03qI\%'$K]DoPD^&G_H^r$&f"2_sn`;[dS
+a8a3\anAd3=8Gtf<</HdR/`KQQN!-SP`q;oP*(lgrf7)?NW+k<Mi*DkM#iEfrItB-KS9;Vs+:9%
+qgeWppO<$ir.+fus+:6&!JH1+L2Md&M2@+JN/WaVO,oBcP*;,qQC!u,S"#q>StMdOUSO`aW2Zet
+Xfek3Z*UgF[^`lZ]=bkm^r!t,`Q$!?b0/#RcHstde'uq!f@\g2gYL]Bhr*JQj5f=ak3(sml0@U$
+m-X60n*ol;o()DDo`"O`p&Ojcq#:*hqYU0hr;HTbrdk*8s*t~>
+JcC<$JcFp5o`"gfrVZTjs8)ckrqQNfs7ZKcs7A;Bo()>?n*f]3m-O''l07Bnk2bR_iS`VMh;$`<
+f[n^(eC)ajcHXPTaN)9<_ns4(]tCqe\$k5Qq;M>2"lJ1nh;$f_g\ok!g&Kb-g"=mTe-=CMdF$=f
+ci)/cc2=F8V#R:c[J[E1Zh:U/Z*Ud?YHFq-ri-NkSpPj9KntSEO-H*)USk6'qR6@3r4)^9!4_m9
+qmc=0!4qa3!4`$=!kPqQpU^=6!kQ"Uq7?R9!4_p:rj_=*!4_s;pU^76r4E$CrOr9HpV?dEqS<$F
+rke]Qp;?sMpr<9QrPn]S!6P)[rlb>cr6=u]!71PhrmCbo#1M)Pe^i='qUkf#rn%5(r7_2*rnRP.
+s5!_4r8%P5i8NYlirA'<jS\-=joFTDkY17+lg*p&jP/,(aMl*6_7?PEUS4<NR[KP-OH,E`ZEUL5
+X/i%HT<>K;Y*s[-T6O^E@!P@aI"m>M;1!kIN/s6nS"<DQ;,C=m<)KLkV[nfMOcu#oR[fn=StD^O
+W2fFgo9TEAn!<sSrN#gq`W,YJq830Js1e]N^qf]Zqn<-#R@4&A!LK,OPm<P;PEM)kOc]R'!KN0=
+Mueiore^Z2!/LQ.s+UK+re(6&rdjrsnULIerdb'$rIY-(L&Qg;LPUeDMMmFPNK0'\OHG]iPa.Q$
+R$jD4S=Q7DTqS6WV5C/hWiN5'Y->1:ZaI6N\@K5a]t_=u_Sa@3a2lBFbK\>Yd*^:keCE1&g"P08
+h;-uHi8N_VjQ5Odkiq?slg4!*mf)YUnF?MK!qZ'Vrq-?dp\4X]s7u]kqtp?irVc?eJcD&9J,~>
+JcC<$JcFp5o`"gfrVZTjs8)ckrqQNfs7ZKcs7A;Bo()>?n*f]3m-O''l07Bnk2bR_iS`VMh;$`<
+f[n^(eC)ajcHXPTaN)9<_ns4(]tCqe\$hp$q4RSVoq(`Fs.'"Us-WqUQ^@Z:rKmMNoRZ+arf%/A
+NK&gPLk^]aL(A9M@qB@iDf9W;H$t0nL5Pbbqi19/r/^f:r/^T6rK7)@r/^c;qiCW9qiCc=rf@#>
+"-8P*O8G%<O8G%=Ont1>OoLREOn4\+OT:RCPP^OBPPUI?PPLI?Q2-a@Qhd$GR/iWMRJrWTS+iHQ
+Sb&HPTDYD^UAq"`U&^tdV#7"fV#R:jVYm@lW;NXoW;W^qWrB'sX8o=!XBVg.WMH2UQ^3eqN/<.;
+I!BmZF`VP>CM[d%Lk^V7J:)TVI=m33IWT(AEa;1&8QnAZ?Y!_;7:'J8C2S!3Fa6JJ84Q?J9M0__
+JU_QSDJsK7FEVqTH?spdIt@USs5!_4"5r.tj8J'<E;4GKEr:"YErU4YErN0=X8Ap9s7VTNP5LIB
+P5CC?OT(CAO91l=RJrQSQ^7W9#F(F9P*1riOT(:ANfF$s!K2j7M>rA3L]3&.L&Zi*KE$Q&Jbsuf
+J,FirJH1<#K)pXZre=s=Ll$tGMi<USNfT6_OckomQ'Rc(R@9V8SXuIITqeE[VPgAmX/rG+Yd(L?
+[C3QS\\#Mf^V@V%_o9U8aN;TJc-FY^dF-Ooe^rF+g=k?<h;@/KiT&tZjlY^hl07L!m-O--rpKmW
+nc&(\oCV\So`Fj]p\jmeq>^<gqu-HkrU^#>s-E\8~>
+JcC<$JcFp5o`"gfrVZTjs8)ckrqQNfs7ZKcs7A5@o()>?n*f]3m-O''l07Bnk2bR_iS`VMh;$`<
+f[n^(eC)ajcHXPTaN)9<_ns4(]tCqe\$l95rD3Jir(d#_qG?u`r)!>hr(m;gs%iSgr(m>hoM,'[
+r)EVnoMY]fqGIo&4[M7o5X.P#6q'O78P;WM:AIW]:Adid:B"&h:Adid:Adof:B+,f;#X8h:B!rj
+9MJ5V:Adof:@V'W:Adoc:B+,i:]O;b:Amrj:/+GXrD3GiqbQWVr(m>hr_`YkrD2lY!Du\m;><rh
+;,C*d:]F8g;>X8h;#sQlr(mAjr_i_m!)iPgpeq)io2PTeqH!SqqGdAmqc<VrrE/o!!*]8(s'-7A
+=BAEu:.n2N77':+5!(eg4?5D\r\Xs>6:!k"4ut_kr]Vhs3B/rV1+aRi,V:W!1H%6N2)@$G3BTGi
+6:<aj3&Wra5<2>-84c-65=%U76O-"L7Rfp>8kf52s*Xiq"+PiPK)L<'4[)'u5P@AB5Q7b_X8An'
+UnsufWN)u!XKDK)"0\r5Z2V$0ZaB_>&[o3[\@T;a]">Vg]tV7t_8=+g_?@cp`5T^p`r=$YaS&[1
+=8l8#<W?+i<<AVWRJrQSQ^7W9#F(F9P*1riOT(:ANfF$s!K2j7M>rA3L]3&.L&Zi*KE$Q&Jbsuf
+J,FirJH1<#K)pXZre=s=Ll$tGMi<USNfT6_OckomQ'Rc(R@9V8SXuIITqeE[VPgAmX/rG+Yd(L?
+[C3QS\\#Mf^V@V%_o9U8aN;TJc-FY^dF-Ooe^rF+g=k?<h;@/KiT&tZjlY^hl07L!m-O--rpKmW
+nc&(\oCV\So`Fj]p\jmeq>^<gqu-HkrU^#>s-E\8~>
+JcC<$JcFp5oD\^erqu]ks8)ckrV6Ee!;?Eb!VH!_nhot,n*f]3m-O$%l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfc-4AQaMu3:_SEq"]XkY_hr!AMpYl/1"5htkh"f_)g@a,%g=b02f)F/$e'c[lrm1Yk
+q9Akurf-lRr2'%nrNuO0pp(mEZEga>Ycb./X/W(TQ'loGK8#/?N0'?oStr9er3lO4s0r*?\F[65
+\@K,Zrji'?qRQX;o!nb1rjh[4rOMp>q7?I6s186@rj_+$s1/3BqRZR9r4E$CrOr9HpV?dEqS<$F
+rke]Qp;?sMpr<6PrPn`T!Q`C[b5TTabl#`[cMu5gd/MGmdf7c"eCE+#f@ToPrn7;'s4R>(s4dP.
+"P__fhV\7fs53k8qVqP8s5a(=roX1C?0^b@jP//)ai236_RZ\FUS=BOR[B>)OcYT_Z`p[9XK/4K
+I]KinXdFEtSUb'L@!G:aIYUQk:jRVGNK9KrT4Ukr:fgRp;KJb7ViHb"P*D2sQ_'_<StD^OW2Zlg
+s7qr\Q2HsFQ1C4CQ^4\Qq5XIo`rGbKqSN6Js1n<BqnE*"!h,OFrg3_QQN!-]P`q;oP*(ifO,o<]
+NJrgSMi.Lj!f2VereCH,!/1<'s+:6$q1/3hqLJTss+:3%!JH1+L&m'creYBIMi<UTO,oBbP*2&p
+Q'[l*R[]e;StD[LU84T^Vl6SpXKAY/Yd(OA[C3TU]">Vh^VI_'`5Ta:aND]Mc-FY_dF6Uqf%8R-
+g=tE=hV[8MioB([k2tjjl07L!m-O--n*fc8nac8BoCW%Ts7ZKerV6Egs8)Wirqu]moDX=@QiDR~>
+JcC<$JcFp5oD\^erqu]ks8)ckrV6Ee!;?Eb!VH!_nh]h*n*f]3m-O$%l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfc-4AQaMu3:_SEq"]XkY_StGSHs.B"Vq47MV!1j+\!M#YVRKJtFR$[`:rg*VPrb_^S
+rbh[dr.4!jrf%nVNK&mTMi*CHL4t>!FE_5+CM[m-Ecl\UItNK6qMb<2p5]$2rf6o;p5o68rfI&=
+r/gc9r/gf:s,d5@rK%#?plPK9qiLi?qN1`>s,mAEplGK<rK-W5!0[;Eqi^rBqNCc?q3:`@qNh/J
+s-ESLpmCZ@rgNkVpmh>So:?#UTV27WrhBFfpn@b`qkX1crhKOjrMKLjs/>jps/>mqs/Q(!p8et-
+US+'BQBI8fM1^>+H$FLTEc5o6rb=0EL4k/.I!TRAK7o23FCT91@7N[W>!Q.rAO/dT?XdYbDK9iE
+<(KPL9MJ2R?\!]XDuOVaEH6&AGBeCZH@('iJUlMSg^)`mhV[8MioB(ujSa&uE;+AKErC(YErL.X
+ErW39WrK'<s7VTOP4Oh2OT1dOR[KTCQiWP>rfn([PEV/mOcYZcO,f6[N/W[QMZ/G6LkgcbLAur-
+K`-Q'K)U>sJG4QiJH(3#K)L<&KSBD[!JcL1M/%p+N/WdXO-#KeP*D5sQ^F//S"#t?T:hmPUnjlc
+W2ZeuXfek3Z*UgF[^`lZ]=bkm^r!t,`Q#s>b0/#RcHjnce'uq!f@\d1gYCWAhr*JQj5]4_k3(sm
+l0@U$m-X60n*oi:o()DDo`"O`pAamcq#C0iqYU0hr;?Nbrdk*9s*t~>
+JcC<$JcFp5oD\^erqu]ks8)ckrV6Ee!;?Eb!VH!_nhK\(n*f]3m-O$%l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfc-4AQaMu3:_SEq"]XkY_r)*Gis%iVhpJ:N[rD3;er_WYlqbR2fqbR/er]pWQ5sR^6
+:AdiY<W,nq;t<id;#jGl;$9!G5<:q+5mTkG6q0X:8kMkT:&@]`9`Rre:]F2g:&[oc:]F2i:]+&g
+:]4&f:&doe9`Rrc:[h*W:Adoc:&n)h:]O;b:B"&h:B+#g:Amug;#=#h:f6^Yr(m>hr_`YkrD2lY
+r)*5cs%rbmqbI2gq,.&fr)!Jm;>a8j;?'Pn;#jMg;>3uf;Z]os;tj8g<Vfbp<Vf\m<W#np=8l=t
+=o)>:=BABr:eOGP7RBF,5!(eg3]K#W2Z>T567P2`3]fVn5X.Fn2`N]N0-;8^/M&D-2(g^C1Gq0R
+4[)+t3]B#W4[)(l5lO:X69mh%5skQ<#t.9Q7S$'B9M0X1HO,"II=?ZrJV&LQKDn%654:`.5QX0N
+X8/dqW?.q7WMunuXKAV-Y-5(6Z*CU?Za7$H[C3NR\[oAa])K;I]Y;+q_SO++_>_:O_u7LY`Q#p<
+a2lBDp/_#krDr>ds-j(YR@4&A!LK,OPnB7EPEM)kOH>NaNfK*XN/NUOreU]4LPPk`s+LH+rIb-%
+rdjlqpOE$is+13%rIY-(L&Qf-LPYqdC5Rq.N/is[OHG]hPa.N#R$a>3S"6.CTV8*UUo(&gWN*&%
+Y-5(7Za@-K\@K2_]Y;.r_SX71`lH0CbKS5VcdC.heCE.%f\,!5gtgiEi8N\Uj5f@bkNM0plKdg'
+mI'H3nF5u=o(2JFrq6<bs7cKes7u]kqtpBjr;H6dJcD):J,~>
+JcC<$JcFm4o`"gfrVZTjs8)ckrqQNf!;?Ebs7A;Bo()>?n*f]3m-O''l0.<mk2bR_iS`VMh;$`<
+f[n^(e'ZRhcHOJSaN)9<_SO"$]Xt_ahr!AMp>H25hr!;Hh>,h*gA9M%gAT\/f[eU&eC)eDd/q\@
+cMYoeN;\b5NrP(?Ni&]QV=M%n[/RE*ZN%3/Y5k^(WtMA/N15*=J:rZ5Mi<gbR\-LVYPu!.\,Wr=
+\[_7A"1YnO\Gj&=])&u;](!9$])K5?])B8:])9,=])T>?\E:@%])K>>])0,;]E#YD^&YqB_#D1G
+_#;+K_Z.OI_uRdN`r=$V`r!dWaN=;$rlb>cr6>5d!6tGes3LVirQto!e'lgse^i@(qUkf#rn%5(
+r7_2*#i+1igYCWAhr"Chs53h7qr7V8!9F%=roX1C>O(;'f#l+Q`5'4"W2QJbT:MF=Q'IAkNJk0I
+Y-"k0X+Po)`Oi:EItjV2DcB/N8oT-38ki-.ItirFR[TjE;G^1h<)Q\oW2HPQOHPflQ'n)3S=cCF
+U84`fY4)DaQN!-LQM?a;QN!3NQN!o]W;rm<s7O5)_Z.IO_"GJ?^&X]&Rf]%HRJrQSQ^7W9!L/fI
+Oo^],rf7)?NW+k<Mi*DkM#iEfrItB-KS9;Vs+:6$l[\tcs+:3%FbGI&L5(J>Ll$tGMi<USNfT9a
+P*2#oQ'Rc(R@9V8St;UKTqeE[Vl-MoX/rG,Yd(L?[C3QS\\#Mf^;%M$_o0O7aN;TJbg+M\dF-Ln
+e^rF*g=k<;h;7)JiSrnYjlY^gkiq?slg4!*mdKW6naZ2@oCMVRp&F^cp\jmdq>^<gqu6NlrUTr=
+s-Wh:~>
+JcC<$JcFm4o`"gfrVZTjs8)ckrqQNf!;?Ebs7A5@o()>?n*f]3m-O''l0.<mk2bR_iS`VMh;$`<
+f[n^(e'ZRhcHOJSaN)9<_SO"$]Xt_aStGPGs.B"VqORJS"J)'PR[X5Drg3\Pr0IAL!,_^Q!,_LK
+s+:6$nW*.!s,?r7!/^]2&qu!XG[b5sBl%a.EcubVJ:iT7r/CN4p5]$2rf6o;pQ5<8rfI&=r/gc9
+r/gf:s,d5@o8rs4qiLi?q2kT=!0R&<rfR5Bo8s$9rKI,Arfd2AqigoAq3CfB!13\Nqj7,GoU5WG
+!1WbRrgiYP!hZ-YrLs1a!2K:_qkX4drM0FirMKLjs/>gos/>prs/Q(!qlE/cXK8CrTUM75P`Lc[
+K7J;oG^"7NE,]W/C1rKZKS+f)Hu*MLO,&1-AnlEg;*R-F5ZM-%5Xn4M@qKOpEccOq7n6&J9E7`b
+J-pdED/XB5EccMLGlE!nI"$QrK%o)ZgBcTkhV[8MiT&ttjR.$cEr:"XErL.WErN*9W;rm<s7MNN
+P4Oh3O8tgMRf]%HRJrQSQ^7W9!L/fIOo^],rf7)?NW+k<Mi*DkM#iEfrItB-KS9;Vs+:6$l[\tc
+s+:3%FbGI&L5(J>Ll$tGMi<USNfT9aP*2#oQ'Rc(R@9V8St;UKTqeE[Vl-MoX/rG,Yd(L?[C3QS
+\\#Mf^;%M$_o0O7aN;TJbg+M\dF-Lne^rF*g=k<;h;7)JiSrnYjlY^gkiq?slg4!*mdKW6naZ2@
+oCMVRp&F^cp\jmdq>^<gqu6NlrUTr=s-Wh:~>
+JcC<$JcFm4o`"gfrVZTjs8)ckrqQNf!;?Ebs7A/>o()>?n*f]3m-O''l0.<mk2bR_iS`VMh;$`<
+f[n^(e'ZRhcHOJSaN)9<_SO"$]Xt_ar)*Dh!)NShp.tN]!)`Dcs&&ems%iVhpeUod!'pNLrBUBK
+rBUBXr_;r`rD`\npJUibs%j7i5<D"k5!_G%6UX@48P;`Pr([&`rD!;er_NPhr([/crD3Dfr_NJh
+r_NJfr_<Dds%WMgr(lfVr_E;crD!>gr_NSjp.kT_s%`Sg!)EJgs%rSg!)WYlnkf6[s%r\lr_WPh
+m83dZpe^uf!)WPg!)WJgr)3Dh!)i\j!)`_nohkE\r_ikt;cEBhr)NPnr`/eor)NVpr)`i!qH3f%
+rEDuu<)ZUi9M7oF6UF%%4?>Pa3B&lT2)R3X6:!n%4?>_m6:!^p3&icO/gMGa/1rG.2(pgD1H.?U
+4[),"2`EWR4$>\g84c?E5sR_$62j4Y6q0^:8Ol<E9M0U.H3ekGI=?ZrJ:`CPK)e+54TI\65P%,?
+5Q7\[WW/n#WN)u!XKDK)&$N4AZ*CU?Za@*I[C3QT\bs#A]=bkm_#D.O^qmkd_Z%FV`5T^8`lJ)"
+oiCojrDrAe!1a%X!h,OFrg3_QQN!-MP`u*0!KiKCNrb9#repo:MMhCi!JlO0L'!'^K`-Q'K)U>e
+JGt-"K)L=EKS>,7L51S@M2@+JN/WaVO-#KeP*;/rQC!u,R[]h=StMdNUSO`aVl?\sXKA\1Z*L^D
+[^WcW]=bhk^VRe)`5Td<ai_fNcHaeadaQ^rf@S[/g=tH>hVd>NioB+]k2tjjl07L!m-O--n*fc9
+nac8BoCW%Ts7QHerV6Bfs8)Wirqu`no)=4?R/_[~>
+JcC<$JcFm4oD\^erqu]ks8)ckrV-Hgp@eLY3qW%7o'u8>n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-+8OaMu3:_SEq"]XkZ1hr!AMpYc>7hr!;Hh;%k]s4[;%r7VD/f[n['e'lbDd07nC
+cHXSWrepc7qi1N6s,@)?VPWdirj;[2pTjh()Qp3EY,nY'WMYcMH$t6sL5:_IPa7f2VQ-u2rO;g:
+s1&->n[SY0rji$>qRQU:rOMs>pUTk+rj`$?r4Dg:r42g<!4i*=k.1N'qn)m>qn)d=!58BGs1e<D
+rk\EGrPAKMs24QK!6+]Ps2Y#Vqo8`Yanj0ZbQ#fac2Pugc2>ldci)5hd07tIe'upurn%#!rn7;'
+!878'rnID,s5!b5rSIS3!oW%rqr7V8!9F"<:?La&kih'[e]GkM`5'4!WMcMaTUhO<QBdPmNK&jT
+N3BCdY,?l$VmF.<R!as^F^/0^HqJF0Mb-Z>IY*N=QC4@A;,C(g<)QVmVl,N7rfRDLR$jM8rgj=f
+USt/mY-.0ls-<>Ens/m6rg*VNri,dnaoD%MqSN9KrkS6Bqn<*%SGo#XRK/cTQiWP>rfmMKPQ$^G
+Oc]R'!KN0=Mueiore^Z2!/LQ.s+UK+rIb-%rdjHerdk*$rI]'BKnY89LPL\BM2I4MN/`jYO-#Ke
+PE_>uQ^F20S"-%@T:hmPUnjlcW2ZeuXfek3Z*UgF[^`lZ]=bkm^qmn*`Q#s>aihlPcHjkbdaZdt
+f@S^0gYCW@hr*GOj5]4^k2tmll0@U$m-X6/n*fc9rpg-^o^r.U!quB_rV6EgrqcQirVZWmo)=4?
+RK%d~>
+JcC<$JcFm4oD\^erqu]ks8)ckrV-Hgp@eLY3:uh5o'u8>n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-+8OaMu3:_SEq"]XkYFStGSHs.B"Vq47GT"J)'QS!s8Cs-WhQrKdJ"")D^hD>nGN
+D>S2OJq<EOnW!R-)2a9-MMR%CL4jVq@V'7hCiF?7GC"[eK8,<`N;JV/Nr"h9Nr4t4OSk7@OSb+;
+OSFn8OSk1<OT1C5OT(=<O8tF<OT1FDP*,O$m?.C2!0d;Crfd/@r0.)DpQbE;r0R5HoU5WG!1WbR
+rgiYP!hZ-Yrh97as.f@`qP=.dr1j=hrMKLjs/>jps/>prri5suqlDr[US"!BQ'75eM1^;*H$=IT
+E,fi5CMIQtB4upLIt)f^BRkbnHuih8Dd5\"9O0nb@;/"r7:9YADK'ZB7fGpW9ERq<JUdZ:&8uN.
+F*2\OH$Xd`I=HctJqEsU$/4.ggtpoFhr3Soj8S*?EH(>cqf;IQqJuS7ql%X:oo]*6o9&j1!M,b[
+S,\oWRJrQSQ^7W9!L/fIOo^],rf7)?NW+k;Mi.Ljs+gZ1reCH,s+L?'s+:6$m=>1es+:3%E.iq!
+L5(J=Ll$tGMi<USNfT6_OckomQ'Rc(R@9V8SXuIHTq\?YVPgAlWiW>*YHY:<['d?P\[oDc^;%J"
+_Sa@4a2lBGbK\>Yd*^:keCN7'g"P39h;-uHi8N_VjQ5Odkiq?slg4!*mdBQ4nF?MK!qZ'Vrq-?d
+p\4X]s7uZjr;6HjrVc<dJcD/<J,~>
+JcC<$JcFm4oD\^erqu]ks8)ckrV-Hgp@eLY2>$M2o'u8>n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-+8OaMu3:_SEq"]XkZN;>sAl:]=,^:]!ub;#jGk;#sKjr_NSjr(d&`r]gBIr^$QL
+r]g9F!DZAY<W#hg;u0Ak:_5cW4Zu%n5sIY&6UjR;8k`"Z:&@]a:&duf:]F2g:&Icc:]4&g:]+#h
+:]*uf:&R`e9hnI]:B4/\:&Ri`:]=,h:]=/j:\IQ_:]F2i9`Rre:B45f:B45j;=[Q]:\dfh:JOY\
+m83aYq,%)g!)WPg"&Mil;Z'Dj;Yj5k;Gm?g!)`_nohkE\r_ikt;cEBhr)NPnrDi\nr)NYqqcEc!
+q-!`%'Ne=4:ej\W84>m35<_1j3]T2Y2`CXm,Vq>55s7Fp3^>tr5<V%d3&NEB*[)g`/M8h>0JtXD
+2`a&b5XPH/"?&A*4?NO5!C9'O5lX4O6jH.N7R]j=8kf4Vs*=Wj$$giCH[U<kIXm"KK)UE!4o[_7
+5Oh#<WVWOpWN3-"XTbl2YHY79riu^6['d<M\GWo:\cBGA^])"K_>_:[_ns=/`5T^8a2l<Aan8^2
+=8l7g<<8Y\rgWqV!1EhR!LK,OPl[,5rfR;EOT(:ANfF$s!K2j7M>rA3L]3&.L&Zi)KE$Q&JaJ!e
+JcC?#K5cKtKnb>;LPUeDMMmFPNK0'\OHG]iPa.Q$R$jD4S=Q7DTV8*UUo(&gWN*&%Y-5(7Za@-K
+\@K2_]Y;.r_8=+/`lH0BbKJ/Ucd:(feC<($f@em4gtgfDi8ESSj5f=ak32'olKdg'mI'E2n*olH
+ncJFTo`"Lbp@n=[q#C0hqY^6hr;HTbrdk*;s*t~>
+JcC<$JcFj3o`"gfrquZjs8)ckrqQNf!;?Eb3qW%8o()>?n*f]3m-O''l0.<mjlGI]iS`VMh:pZ:
+f[n['e'ZOgcHOJRaMu3;_SO"$]Y!%Whr!AMpYl/1"lJ1nh;$f_gAot,g&B_)g&9Y(f`]pXeC;tH
+dJhJocd'f7N;JP4N;JV0NpjCT[/RE2ZMUmFY-4t/X/i8"W/?k-H$t<uLPh"LOdMZ3VlR3([fEr&
+\c',;\c',<\H'57\am?2\H'5=]D9&:\c0/?\c0,9\H'5.\c984]DT;A^&GbG^\5JC_>1nF_>_=O
+_tM"K`V7CPa8<mQ`rO6Xb5TTabl#`ccMu/fcMc)fd/D>rdaQ[pe^`7MfDF5!g&K_)g&0S&g]$".
+hYuF4hZ)I7i8NYlir7s<jSJ!<k$@*,g!e'a`5KI-\Z2O#T:haER$O#!N/WdUNK&mQM2I1KM4hGY
+\"]48Ru3/#CMHCTG(b`J:j@SGNK0BpT2/?^:K(.gKr9ujNfoNgQ'n)3S=Z@EU8=fgY-5%2m/I'M
+qN^rDpQbcCrK[)Bs-N_Nri#amb5VIWpVH[Bs2"`NotUF=".l'SSGnumR[KS2R$X,)Q'IStPEM)k
+OH>NaNfF$s#E+IsM2@%EL])r/KnP-XKDpK%Jae3hJc:9"K5lQuKnb>;LPUeDMMmFPNK0'\OHG]h
+Pa.N"R$a;2S"-(ATV8*TUnsueWN*##Xfnt6ZEppH\%&u[]Y2%o^r""-`Q$!?b0/#RcHjnce'uq!
+f@\d1gYCWAhr*JQj5]4_k3(sml0@U$m-X60n*oi:rpg*]o`"O`pAamcq#C0iqYU0gr;HTcrdk*;
+s*t~>
+JcC<$JcFj3o`"gfrquZjs8)ckrqQNf!;?Eb2"^D2o()>?n*f]3m-O''l0.<mjlGI]iS`VMh:pZ:
+f[n['e'ZOgcHOJRaMu3;_SO"$]Y"07!2&hTs.B(XrLNqZrgj"Zrga1^S!oe6rg<\Org*7o!,_^Q
+qec4JmuI1&qi(Q4!/^]2'o.NuDg$A8AnPmsE,foAH[^O!Ll@;iNVAJ/O8k7=O7n\6OoCI>O8Y18
+O8Y1<O8Y1?O8P(>Onk+<O8G"=Onb%:Onb%*OoCLDPP^OBPPLC>P5pj>Q1^I@Qhd$@RJ`NRS,/ZQ
+Sb/KRTDkM_U&C_cU\LP`U\gkeU\pnfV>d@hVuN^mWW/psWW&psX8T+6Vk]lQQ^*bqN/<1:I!BjZ
+FDl,:D#J)LBPIEY-Y@"&H]!9+H#dA8B4X/#:d%][@q\>$?"%>]D/jZB7S$$<9h\2oJ,X<jD/XB6
+F*DhRrd"fsIXZj#JqJ^TgCDrlg=tB;h;7&Hi8NYTj8S-8E:IrFEqj_PErN$8Voo&5Onk13Ont.A
+St2FBrgOXkR@0G0Q^3r&Q'@JrP*1rhOH5H_NW+kAMi*CKM26tCrItB-KS9;Vrdt-#n::Lhrdt*$
+EJ0%"L5(J=Ll$tGMi<USNfT6_OckllQ'IZ&R$jG5S=Z=FTq\<XV5L5jWiN5'YHY:;Za@0M\@K2`
+]tV7s_Sa=2`lQ6DbKS5VcdC.heCE.%f\,!5gtgiEi8N\Uj5f@bkNM0plKdg'mI'H3nF5uIncA@S
+rq6<bs7cKes7u]kqtp?irVc?eJcD/<J,~>
+JcC<$JcFj3o`"gfrquZjs8)ckrqQNf!;?Eb2"^D2o()>?n*f]3m-O''l0.<mjlGI]iS`VMh:pZ:
+f[n['e'ZOgcHOJRaMu3;_SO"$]Y"#;rD3Jir_E;c!)EJgr(ur]s%r_krD*5cs$?BEr^$QLrBL0E
+moB<crDN\qrDW_qs&8ko'i@e(4?l"k4[2(p5Xe%-77^!A9284Y:B!uf:B"&g:Amob:B"&f:B+,g
+;#a>i:B!ud9`Ife:Adlf:@_-X:AI]c:B+,h:]O;d:'"-cr_NPhs%NJgrD*DiqG.)fr_`5_r(m,b
+"A_cf:J^[\!)NGfrDEAes%rbmqbI;j;,L6h;>a>h;#sQlr)!Djs&/PfohtWbp/Lujq,[GoqGdAm
+qc<VrrE/r"*`uHC;,C(^91_Q@5sIOp4$>Sa2*!QQ2)R3K1,UjDr\Zep5=7Rs3ArfR0J+1j.46Mt
+1cR?M0f:pN4[),"2`WcS5!:tq83K7)5<qJ$6:4.27n-$>85)]L9MJ3*rcnZnH$Xd`I/\QtIt3'$
+K)UE#4oRSD4TI\65Oh#<W;NOqWiN8(riQ7)ricC-riua7['d?O\@MUK%Cs'^]Y;.q^;%Cs^qdea
+_Z.LV`5T^9a8X-[anAd2=8l7h<<Jh`SXf\K'q1PYR$a5+QBd`"PEV/mOcYZcO,f5!N!G8uMM[1G
+Lkkq`!el;\rIb*$rdjQhrdk'#rI]*CKnY89LPL\BM2I4MN/`jYO-#KeP*D5sQC+&-S"#q>StMdO
+USO`aVl?\sXKA\1Z*L^C[^WcW]"G_j^VI_(`5Ta;aND]Mc-FY_dF6Uqf%8R-g=tE=hV[8MioB([
+k2tjjl07L!m-O--n*fc8nc&([oCW%Ts7ZKerV6Egs8)WirVZWmoDX=@RK%d~>
+JcC<$JcFj3oD\^erqu]ks8)ckrV-Hgp@eLY1\C;0o'u5=n*f]2m-Es$l0.9ljl>C[i8EJJgtLK7
+f@JI$da?Cdc-+8Na2Q!6_8!^s]Dg[ehuDX/i<J5thqm2Fh##h+gA]e"g'?<`f[eU&e'e6Crm1_m
+c&DR[rJ^]5!fXY!qi1?1n[8D(rj2X1s03`OZ*:F9Y-+k-WiW2"VMpmdH@:C!LP^qKP*hi7W3*J:
+\EUR&])9,;])T>?](``9]"@UGrOE!@]=e*SqRZX9rji0A\@DCGs17X/s17s:!5/<Cr4E$CrkAEI
+p;$^Eq7upEs2+fRpVd*NpVm3RqSrEQs2Y2^qo\o]s31Dcs3CVgrm(Jgr6YGj#1CuLeCE+#rn%&"
+rRh2'rn75'rS.>,!SuW2hZhrphr*GOiV_^6j8.j_jP&,3a2l3:_nrsbVk]oXSXYt2Q&gudNJidS
+Mhm4HMM[1GLAlrcL6[UTF`C5JED(.qL.b9>H@^j2PF@u4:Jt%k<)QVQNK0![Od)#qR@Tn@St;[Q
+W2d#'Xf^mgr07&CrKd8Er072Gn<WpKbl@XWq8)pErk\WMp:pO>"eVBXSXl;MRfStGrg3_QQN!-M
+P`u*0#*G".O,f6[repl9MZ/G6LkgcbLAuu-K`-Q&K)U>lJGt-!K)L<'KS>-ZL&m'creYHKMi<US
+NfT6`P*2#nQ'Rc(R@9V8SXuIHTq\?YVPgAlWiW>*YHY:<['d?O\[oDc]t_=u_Sa@3a2lBFbK\>Y
+d*^:jeCE1&f\5'6h;-rGi8N\UjQ5OdkNM0plKdg'mI'H3nF?&>o(2JFrq6<b!;HHerqZTjqtpBj
+rVc<dJcD2=J,~>
+JcC<$JcFj3oD\^erqu]ks8)ckrV-Hgp@eLY1\C;0o'u5=n*f]2m-Es$l0.9ljl>C[i8EJJgtLK7
+f@JI$da?Cdc-+8Na2Q!6_8!^s]DeE%TCSZTTD>)WSbJ]\SXc4>R[TY4rg<\Os-E\%r+u@Lr+uCm
+rbhUMqJPqcq2P?3*fGu8MMm@LLkphBL51G%G@=umC2@d+EH?DRIt<<0pl5-1q2YN9r/^Q5rK7)@
+qiCc=!KiK<O8k==O8P(>O8P(>Onk+=O8=t<Onk+;Onb%*OoCLDPPUIBPPLC?P5pj=Q1^I@Qhd$@
+RJ`NRS,/ZQSb/KRTDkM_U&:YbU\^_bU\^bdU\pqfV>mFhVZ<[mWW/psWVrjrWu%e2TV%X>Q'.;i
+M1^>+I!BdUEGoc3C23`^2eQf;B4baeAS,LaAn,@iCMR-S4?QY1<*a$#7S$ipB5DO,Fa-DI7nlZN
+95A?\DJa92EH?8HH2`+/I"$KpK7\`.g=b36gY1E9g=tE=hV[5KiSieUro<ZjnT"MJpiH7OqPVR;
+oo]*6nr`g2"eVBXSXl;MRfStGrg3_QQN!-MP`u*0#*G".O,f6[repl9MZ/G6LkgcbLAuu-K`-Q&
+K)U>lJGt-!K)L<'KS>-ZL&m'creYHKMi<USNfT6`P*2#nQ'Rc(R@9V8SXuIHTq\?YVPgAlWiW>*
+YHY:<['d?O\[oDc]t_=u_Sa@3a2lBFbK\>Yd*^:jeCE1&f\5'6h;-rGi8N\UjQ5OdkNM0plKdg'
+mI'H3nF?&>o(2JFrq6<b!;HHerqZTjqtpBjrVc<dJcD2=J,~>
+JcC<$JcFj3oD\^erqu]ks8)ckrV-Hgp@eLY2"^D1o'u5=n*f]2m-Es$l0.9ljl>C[i8EJJgtLK7
+f@JI$da?Cdc-+8Na2Q!6_8!^s]2JK&r_NSjr_E8br_<Ghr(ur]!`2Zgr(d/c!'gHJr^$?Fs&K%a
+s$6NIqEXRNr)E;e##S8q;,BD@r]C9J4[D=36j6%N84lTPqbI/cs%`Phr_EDdr(d8fr(d8frD<Mi
+rD*>drCm5c##7rj:JX_\nkK$WqG7,ds%iVj!)NAbr(m>fs%WDe!)WMf!)WYlnkf6[q+q2i:/4S\
+pe^rcqG@,fq,%)gs%rVh"&Mim;Z'Di;Ys;l;Gm?gs&&bnpJLT]qG[)er`/\nrDi\nr)NYqqcEc!
+rE0h:<)c^k:/"8P77BI+5!D(k3B9&Zr\Xg71c-pDr\OO2q_K0L1c$d4)^d0h.kih62)I'H3&s,c
+6UWjn2Ea5&4T@PS5sR_%6UX:07n?*@7n?>Q9)hQbGQ)jeGm/M>H$XgbrdG!"J:N3%rdsu0r&k!C
+mm$;,qPOCrXf_T*!3cC+#dL\@Za@-K[^c=Gs0r0A]=koU^';Bf^qmk(_>_:U_o0L5`Q#staRrU1
+=8c1h<<]"dSt2FBrgNqWRJrQSQ^7W9!L/fIOp7&1O,o<]NW+k;Mi.Lj!f2VereCH,s+L?'rdt-#
+npp^jrdt*$!ec8]re:H/M#N6IMMmFPNK0'\OcklkPa.Q$R$jD4S=Q7DTV8*UUo(&gWN*&%Y-5(7
+Za@-K\%0)^]Y2(p_8=+/`Q-'Ab0/&Tcd:(fe'uq"f@\g2gYL]Bi8ESRj5f=ak3(sml0@U$m-X60
+n*ol;o()DDo`"O`p&Ojcq#:*hqYU0hr;HTbrdk*<s*t~>
+JcC<$JcFg2o`"gfrqu]krqcZjrqQNf!;?Eb1\C;1o()>?n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfc-4AQaMu3:_SEq"]`-aihr*JOp>H56hqm2Fgt_e]!8@G*qV(r%s4@J*e^W'rrmCbm
+!71P$qi1N4s2OuHr/L]9!0?u:osO_)s0Ma2rimQLY-"h/X/rD&WMlbURs'+,KSYD?MN<siTVAEg
+[^j!?\c98>\bs&:\c',>\c',8\ad90\c9;A]`,P=])K8?])T>@\G`r@]",A_](NW6])B2=](`i3
+]E#YE^AbnA_#M7H_#2%J_Z.OL`;[aD`r3sXaT'BYb5TTabkTH^cMZ#ed/MGmdf7breGe&!fDF5!
+f`9\'g&9Y&gBQHhh;7#Gi;MR5i;_d6ir.m;jSe0cin2`'a2Z'9_nrp_VPBcTSXYt2Q&Uf`N4c]Y
+Mi!=HLkgeBLAlr2L4t87LAlu]LO;[6I>^`n:k!tPNg-!);,:%d<JHBgN/`jWO-,WiR@9\:T:VaO
+VlHo&Xf\eks8S;ZPkpXFQMHgBPl?s?QMef$Vp58?_"khC_Z%CO_"PP@^Aji*T)Y>]SGnuYR[O/B
+&!rTIQ'@MsP*1rhOH5H_NW+kAMi*CKM26tCrItB-KS98Urdt*"p43*mrdt*$s+CB+re>6ELkpnE
+MMmFPNK0'\OHG]iPa.N#R$a;2S"-(ATV8*TUnsueWN*##Xfen4ZEppH[^`lZ]Y(tn^r!t,`Q#s>
+aihlPcHjkbdaZdtf@S^0g>(N?hr*GOj5]4^k2tjkl0@U$m-X3.n*fc9rpg-^o^r.U!quB_rV6Eg
+rqcQirVZWmo)=4?S,\!~>
+JcC<$JcFg2o`"gfrqu]krqcZjrqQNf!;?Eb3:uh6o()>?n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfc-4AQaMu3:_SEq"]UkaeStGPG!2'%XrLNeVrgj(Z!h5XIrgEeRrg3P!rbVXOrbDLM
+rbV^QQBqH/s).^Nq/6(ip5Sp-!/pi5!/gc3!/LQ.&TW/*A8#[oD/XE9H$b$mL5M#gNVeb6O8k=A
+NrY4=O7n\4OoLO@O8P+6O8k==O8P(>O8P+>Ont1>O8Y.COcYZeOnk+9Ont1,OoCLDPPUIBPPLCA
+PQ$g<Q1^I@Qi*3NQi<BFRJWEQS,8`QSb/NRTDkM_U&C_cU\^_aU\gheU]%"fV>mFhVuN^mWW/ms
+WVrh4X/D_cSXGe.PECi]Jq/5qGBItHDf9IkC'foYB4tmgAnGUdrae`5ARo:]AS#IbAn>75='oZ-
+7RgcqBPh^1GXk:q7nm]2CM[m*Df'E3EH?>KH$Xd`I=?a!JqJ]/f\+s3g=t?7g=k<:h;7#Gi8NYo
+irA*0E:IrIEqaYSEr;4#Vp58?OoCOAOnt74Ont1>TDtM_SH,2ZRfStGrg44_QBd`"P`q8nOcYZc
+O,f5!N!G8uMM[1GLkkq`!el;\r.G!#rIOZmrIOs"rIb-'!/:E,Ckmh&M2@+JN/WaVO,oBbP*;,q
+Q'[l*R@B\9St;UKU8+N\Vl-MoX/rG+YctF>['mEQ\[oGd^;%J#_SjF5a2lBGbK\>Yd*^:keCN7'
+g"P08h;-uHi8N_VjQ5OdkNV6rlg4!*mI'H3nF?MK!qZ'Vrq-?dp\4X]s7uZjr;6HjrVc<dJcD5>
+J,~>
+JcC<$JcFg2o`"gfrqu]krqcZjrqQNf!;?Eb1\C;1o()>?n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOfc-4AQaMu3:_SEq"]_tb,;>j;n:JOY\r_WPhr_<GhqbZl]!`2Zgr(d5eq`jsC!($QK
+s%`Jls$6WMr'1!Bnl>Wfqc!Jlr_ieprD=Cq5Wh+j5!D4t6UXC58P)TL:/4S[:/+GXrD3Dfr_<8b
+s%iPfr_NMi!)NJes%WDb!DQ>f:B4/[:&Ic^:B4/h:BF?g:]!lg:JO[_:]=)h:%V3];#X>_;#F,b
+:]sQh:/=[\;#O2e;#O8e;#X;l;#=#i;,U<h;>jDf;>a5j;>sJf;>!i_;tj8j<VKPm<Vf\m<Vohp
+=8l>%=X@-K;c$4`9M.fD6U3h!4Zbbd3B/uT2)I-Z6SgPT1,:^D1GUaAr\GKN1c.!G1c7-F/M8h=
+0JtRB2`Wua5XRCf3&Wqu4;C%C5s@P!6:4+.7n,m;7nQHI9MA/SrceBes*4usH$O^_I!pHmIt3(K
+JcC>s4o@GB4nV#>55RS:5l=RYVuNmuXokl3Yd+25!OK34[f3`<\@T;ark8<FrkAHKrk\QM$,a^"
+`Q#s=aN;R&<rQ1u<r,nr<q',hTDtM_SH,2ZRfStGrg44_QBd`"P`q8nOcYZcO,f5!N!G8uMM[1G
+Lkkq`!el;\r.G!#rIOZmrIOs"rIb-'!/:E,Ckmh&M2@+JN/WaVO,oBbP*;,qQ'[l*R@B\9St;UK
+U8+N\Vl-MoX/rG+YctF>['mEQ\[oGd^;%J#_SjF5a2lBGbK\>Yd*^:keCN7'g"P08h;-uHi8N_V
+jQ5OdkNV6rlg4!*mI'H3nF?MK!qZ'Vrq-?dp\4X]s7uZjr;6HjrVc<dJcD5>J,~>
+JcC<$JcFg2o`"gfrVZTjs8)ckrV/DIp@e1Po^qbGo'u5<n*]T0m-Es$ki_*jjQ#:Zi8<DIgtLK7
+f@JI#dF$:cbfe,La2Q!6_8!_>h>Z73hr+1d"5r(nh>Z12gY1B\gAot,g%jA%fa$0]f%&:!daJ-B
+o8NU,rl+ZBs,@&>NW+q<O84h5[JI9/Zi@?1YT0jLY,nb*Wi<"rWK<]pH[^X&Ll..RQ(+G@Wi``'
+\c98@\c98>\bs#@\[oA_p:C:7!4r*=s1/3BqRZ^=rOW!="M24W]Y+3Tq7?U:s186@s1&$<s1/9B
+]"7RFrjr*>rjqj9pq-U?rkABHpV?gFq7upErke]Qq8E9Om`,4Gs2b5^qTAi]rlk>c!6kDds3CMf
+rQtSlrmLhq!7_#!rn%)#pt>Z#qqM/+s4mb5hr+Ijro!h8ro3k9-fjCNhpp/ta2Z'9`ko-^V5'ZS
+SXYt1P`Uo`Mn6@'Ycb(+WJ?4aLAlrEKnP29Lkgb?L4tD:KnbA;L51M<LPLV<re:N/KSG6\M\M/3
+N0'0dPaS#3SXuFHUo15qY-"kis8A/XPk(+8Pl?sCQMAK#aSi$_s89\/_>1tJ_>_7E^\keITqJ%W
+SdV*ZS=?":R@0G0Q^7W9&<rBAP*(lgO,o<\NJrgSMMhCi!f2VereCH,s+L?'rIXruqgeTqrdt'#
+s+CB+re>*ALkpnEMMmFPNK0'\OHG]hPEhE!Q^F20S"-%@T:qsQUnjlcW2ZetXfek3Z*UdE[^WfX
+]=bhl^VRe)`5Ta;aND]McHab`dF6Uqf%8R-g=tE=hV[8MioB([jlYail07L!m-O--rpKmWnc&([
+oCW%Ts7ZKerV6Egs8)Wirqu]moDX=@S,\!~>
+JcC<$JcFg2o`"gfrVZTjs8)ckrV/>Gp@e1Po^qbGo'u5<n*]T0m-Es$ki_*jjQ#:Zi8<DIgtLK7
+f@JI#dF$:cbfe,La2Q!6_8!_`T)PAPTE(VZT)G5UT)YA]SH#&YRf8`SR/CgrD#A)JQM?O?DZ+GI
+DY/qcN;e_6M&;#(L5(D:KnaYp@V'4eCN"04G'SIbK8,<^NVe_BO-#HaO-#HaO,j1"p5o06rfI)>
+rK-]5!0I)=p5o<:qN1`<rK.&A!g&P,q2kH8qiL3-rfR8FqNClBq3(`@s-3,?op5QCr0[MNrg<AH
+r0mYTqjdPSoq)/Trh07arM'=eqP*tarM0FiqkX4fs/,Ui!3#dos/5psri-^1Tq@jBQB[MoNJN.8
+I!^'[F)c,9D#S,qN/<=DK7JArAnGUaA7]7]A7fCaA7f@`@qK:`AnPafB4YahAnP`TB`D]KBkhBu
+Ci')g'5qi0F`r%UH@(!eI=[!%K7hb-f`'P4g=b35g"P39h;7#Hi;V^8irA'>Dte5NEVXSGEW1"R
+F82"#QMm`-s88#VOoUX?P4Oh5O92,KTDkDiSXc4>S!ob5R$a5+rfn%ZPEM)kOcYWbNfB$WN/NRN
+reU]4LPPk`s+UK+rIb'#r.4`qr.4j!r.G$&!/:E,BSVD"M2@+JN/WaVO,oBbP*2#oQ'Rc(R@9V8
+SXuIITq\?YVPgAlWiN8)YHY:<ZaI6N\[f>b]t_=u_Sa=2`lQ6DbKS8WcdC.heCE.%f\,!5gtgiE
+i8N\Uj5f=akNM0plKdg'mI'uB!V#XYncA@Srq6<bs7cKes7u]kqtpBjr;H6dJcD5>J,~>
+JcC<$JcFg2o`"gfrVZTjs8)ckrV/>Gp@e1Po^qbGo'u5<n*]T0m-Es$ki_*jjQ#:Zi8<DIgtLK7
+f@JI#dF$:cbfe,La2Q!6_8!_\;Z9Pm:]jKg:/CjcrD3>dr(uu^s%i\kqbI/TpHSL>r_E5f!^T(:
+rBL'BoMtihr)<Mkqb\+l5s@=l5!2(s6q'R77n?6F:JOYZ:/:dar(d8dqbI/erD*;es%r\jr(d5c
+rCd5d:Amrg:@V'V:@_3X:B+)i:Adod:@q<^;#X>_;#F,a;#X2i:\[cb:]!ue;>F&f;#jGj:BOEj
+;H!BhrDNDfrD<Mkr_iMgohtQ`p/M&lpK%2lqc*Gmr)W_sr`CRL<)HFd:.n2L6ps=)4Zthg3B9&X
+2)d?M77'@-5<_4k2)@!E1GgmDr\Os>1c@-I2)[<J2E1Up$T9k#2E<`U3B'#\48qAX4?G_m5<hG#
+6pjC58Ol9A8kVcK9MGG/s*+He$@-l@H$XgcI=?Zqrdb$"!ePtcof`79!'U<Fq*4mCq`jj@pJ_$g
+"0J`/YPta/Z*L[A[/IB4[f3`9\c02B]Y2#W^AktI^];4L_?e&t`5]g<aN;O$<r5qu<r#hr<q')j
+TqJ%WSdV*ZS=?":R@0G0Q^7W9&<rBAP*(lgO,o<\NJrgSMMhCi!f2VereCH,s+L?'rIXruqgeTq
+rdt'#s+CB+re>*ALkpnEMMmFPNK0'\OHG]hPEhE!Q^F20S"-%@T:qsQUnjlcW2ZetXfek3Z*UdE
+[^WfX]=bhl^VRe)`5Ta;aND]McHab`dF6Uqf%8R-g=tE=hV[8MioB([jlYail07L!m-O--rpKmW
+nc&([oCW%Ts7ZKerV6Egs8)Wirqu]moDX=@S,\!~>
+JcC<$JcFg2oD\^erqu]krqcZjrqQNf!;?Eb!VH!_nh0J%n*f]3m-O$%l0.<mjlGI]i8EJJgtUQ9
+f@JL%da?Fec-+8Na2Z*9_SEq@h#?.2hr+.c#2nCqh;$f?rRq;,gA]e$gAfh3f[n^)e'c[ld/Asn
+N;gcr`q6bANK3msq2Y0UrNlO0s02X/Y-.c*(9=I5VMCA-GBeUhLl%"KOd;N1U8k?'qmcmA\[f;_
+\c02=\bWf:\b3N7\[q^Ls1/3BqRZ^=rOW!=!P5oB]_oAA\biu<\c98@\c92<\c95B\[oBF\c',>
+\c027]D0#=^&GbF^]2+J^\ttJ_>1nE_>_=O_t_1M`W*pXa771Ka8X0[anj0ZbQ#fbbm)D:c-4GW
+cMPrcciDJmdf7breG[tufDX@rg&B_%gBQHhh;7#Gi;VX4huMa8iqqa=g!nHj`r3e-^TOQ4U7e-I
+R$X)#O,]'U]!J]FY,nY%IsSZ>[(rVpKnbD=L5(A7L5(D9KSG3[L*VJ.LP:G:L4tA9KnbA@M2S6k
+NffKgQ'n25SXuFHUo:;rY-"nis8%rUPk:78Pl?sHQM/Aua90P]Vl.oAr4r0Fq830Js1nBDqn<0+
+TV.qVScPCPrgNqWRJrQWQ^3o%P`u*0$^$O3O,f6[N/W[QMZ/G6LkgcbLAuu-K`$K%K(=KlK)C9$
+KE-`*LB!$KLl$tGMMmFPNK0'\OHPcjPa.Q$R$a>3S"6.BTV8*TUnsueWN*##Xfen4ZEppH[^`lZ
+]=bkm^qmn*`Pom=aihlPcHaeadaQ^rf@S[/g=tH>hV[8MioB+]k2tjjl07L!m-O--n*fc9nac8B
+oCW%Ts7ZKerqQKgs8)Wirqu`no)=4?SH"*~>
+JcC<$JcFg2oD\^erqu]krqcZjrqQNf!;?Eb!VH!_nh9P&n*f]3m-O$%l0.<mjlGI]i8EJJgtUQ9
+f@JL%da?Fec-+8Na2Z*9_SEpWSt>qRn=TcRq4@PUq4@VWrgX"YRf8]TR/Lq!D>J)JC]0RkO7@,]
+NVe\7M]Rb4M26qBL4t84Dfg>9@qTLmDfTlAH@:9qL5LqLNW"n:O8k:AO8b7;O7n\3OoLOAO8Y15
+NrY:>O7eV7Ont1>O8Y1?OTLW,Onk+7Oo1=.OoCLHPEM)mPPpXEPPLC@PQ-m<Q1^IBQi*6NQi<BE
+RJiTRS,AfRSb8TRTDkM^U&C_aU]$qcU].(hV>R.fV#[CfVZ<[mWW&hOUnOEKR$<erNf/UCI=-?b
+F`MG<D/3j!BoIq(KS+f'H=pfFM1g_5A7]:aAS#C`@V'-MB)cKDAc?9FB4b^fAnM$Ts(MFI)f'8>
+D/O61E,p)FG^4U^H[^EpJqAW.f%/I)f_X8)g=tE=hVS7is5=(>j5]4uDtn;NEVaYHEW1"WF7YY!
+QDURXd/O*/rK6Z6o9&p3"/2B\TDkD_SXf\K!LfGUQj&hBQ'IStrfRYOOH5H_NfB!VMi3JlM#rKg
+L]3&.L&Zi(KDpJnJc:9!KE$T)L&Qi,LN/-,M2I1KN/WaVO,oBcP*;,qQC!u+R[]e;St;UKU8+N\
+Vl-MoX/rG+YctF>['mEQ\[oDc^;%J"_Sa@3a2lBGbK\>Xd*^:jeCE1&f\5'6h;-rFi8N\UjQ5Od
+kNM0plKdg'mI'H3nF?&>o(2JFrq6<bs7cNfrqZTjqtpBjrVc<dJcD8?J,~>
+JcC<$JcFg2oD\^erqu]krqcZjrqQNf!;?Eb!VH!_ngs>#n*f]3m-O$%l0.<mjlGI]i8EJJgtUQ9
+f@JL%da?Fec-+8Na2Z*9_SEq];ZBVn;#X8g;#a>h:B+,h;"@Ha:f%$bq*+[?s$6TKr]pEWoMb9F
+p/V#ir_rbnr)"2*4$Q(q4[)"o5<qP&7n-!=8ki&T:Adod:&n#b:&n)f:Amug;#X8f:B+&e9E@j_
+rD*DgnkK!Vnk]-Xs%`Vir(m8doM5H`r_`5_r(m5erD3Df!)NAdrD3;erDEAer_WYlr(d>i;>sJk
+;>a>f;>j>j;>sJh;>!i];tj8k<VKPl<Vf\l<W,tr=".6P;c$7b:.e&G6pj7(5!M+k3B9&W2)[9I
+770C-5Wq4j5<_Cu5!D"`r\Og:1Gq$H2)Y@hs"sm<2`N_p3#4M62`N`X3]fJf4$?5#69d\"6UX:1
+8,c$Z8,Z*\9`K88G5c^`GQN/:HiAHmJ,b&tJc@k54S(`94T@SD55@DC55IMB5k7hmVPg>pY-5(6
+Z*CU@Za@*I[C3NQ\@K2_]=beir4W?L^q[\#_>V4R_o9U8a8O*W<q9>k<q')kTqJ'Nrgj.]SGnuY
+R[O/B"dbO?Q'@L3OpdD6O,o<]NJrgSMi.Lj!f2VereCH,s+L<&rds]lrdt'#s+CB+reCH.EJTI.
+MMd=NN/`jYO-#NfPE_>uQ^F//S"#t?StMdOUSO`aVl?\sXKAY0Yd1UB[^N]V]">Vh^VI\&_o9U8
+aN;WKc-FV]dF-Lne^rF*g=k<;h;7&IiSrnYjlY^gkiq?slg4!*mdKW6naZ2@oCMVRp&Facp\sse
+q>^<gqu6NlrUTr=s.'+>~>
+JcC<$JcFd1o`"gfrVZTjs8)ckrV/SNp@e1Po^qbGo'u5<n*]T0m-Es$ki_*jjQ#7Yi8<DIgY1?5
+f@AC"dEp1abfe,L`l5j4^q\[[h;7&Ghr+1d#2nCqh;$f?rS%;+rn7,$rn.J,e^W'sdeAanN;^]q
+`pgJ<Nr+n4Nq]p[ZN7>:rid<DXfSS'Wi;nQQ'cc?IY<H4Mi<daS=lUTXL.u;s186@s1/3@rjr*>
+qmlmA]"5HL\cBA?\cTFR])K8?])K>>])B8?])K5C]"G_h]_oD7])T;D\@K2]\bs&3\bNc1]D0#>
+]tXEZs1nTJrP8EKq7usFrke]Qpr*3O!li:$n](ULrlG)\qTAf\rlkDerlbPjbfn>WcMPrdd/VMm
+dK7nIec+/"fDX@qg&Ke&g]-(/h#uTli8<Gii;_d9ir7sBin)W(`l5ss_CE*sVk^#ZSXGk2PE:fa
+MMo'NZ*(40W2Y5j]>_FmTpKhaO,$q@Knb;8LAZc'L)5PuLP:J:L4tA9Ln^T?ViHb!P*2,uS=KSM
+#,.llWiiM,jT"q;r06o?op#H@n]1[Nrhe*Cr4r-EqSN6Js1nBDr4W?/TqS-PTDkDqSXc1=R[TY3
+R$X,(Q'@MsP*1rhrf7)?NW+k;Mi.Lj!f2VereCH,s+L<&rIX]nrIXs"s+LE+re:H/M#N6EMMmFP
+NK0'\OHG]hPEhE!Q^F20S"-%@T:hmPUnjlcW2ZetXf\e2Z*L^C[^WcW]"G\i^VI_'`5Ta:aN;WK
+c-FY^dF-Ooe^rF+g=k?<h;@/KiSrnYjlY^gkiq?tlg4!*mdKW6nc&(\oCV\Sp&F^cp\jmeq>U6g
+qu-HkrUTr=s.01?~>
+JcC<$JcFd1o`"gfrVZTjs8)ckrV/MLp@e1Po^qbGo'u5<n*]T0m-Es$ki_*jjQ#7Yi8<DIgY1?5
+f@AC"dEp1abfe,L`l5j4^qZG2St;RHqk*q_pRhMYpn%JUq4@SVs-s"V!1Eb%r,2@JqeZ1rnrNg2
+pMTqHs).Rjs,75CMi<ROMMR(Dre;,@KPtsV@qB:dD/XE7G'\RdK8#,?rf6r<s,[5ArfI#<rf@,B
+qN1N8rfI/@qiL<.ooT39qiLf<rK-r>q2kE7r/g9-r0%)DrK7/Eq3(`@s-3)>op5QCrg<YNs-WGH
+rL3_TqjdVUrLO"]pn%JWrh07a"/;K`UA^kdUAUecV#R:hV#@+iVYI%hW;<JSU7e'FQ'IMoNei@<
+I!^-_F`MJ>DJX$"Bo@h&K7\Z&HY6lHO,/I6EF*NsA4/aoA7]@cB4baeAS,NPAe/HcAnP^hB4u$p
+I!g?kDJfAk&or)=G^4U]H[^HqJqAX)eCE+#rn%&##hn%gh;-rFi8FUns5O+?pi$%Kqf2OQoPskN
+s-E2?rhe*Cm?7%&r/_)VTqS-PTDkDqSXc1=R[TY3R$X,(Q'@MsP*1rhrf7)?NW+k;Mi.Lj!f2Ve
+reCH,s+L<&rIX]nrIXs"s+LE+re:H/M#N6EMMmFPNK0'\OHG]hPEhE!Q^F20S"-%@T:hmPUnjlc
+W2ZetXf\e2Z*L^C[^WcW]"G\i^VI_'`5Ta:aN;WKc-FY^dF-Ooe^rF+g=k?<h;@/KiSrnYjlY^g
+kiq?tlg4!*mdKW6nc&(\oCV\Sp&F^cp\jmeq>U6gqu-HkrUTr=s.01?~>
+JcC<$JcFd1o`"gfrVZTjs8)ckrV/;Fp@e1Po^qbGo'u5<n*]T0m-Es$ki_*jjQ#7Yi8<DIgY1?5
+f@AC"dEp1abfe,L`l5j4^q]VA!)`\kr_EVm;,C*g:]4&g:]4,_;?'Jl:B4/f4o%;<5Q3qG:B"5a
+;u/cY62NqA<W5tt;uKVk;%-8`5X%:l5!;.s5XRp<8,l-]92>C\rD!>eqbI/erD*5c!)WVir(d5c
+s%NGe!)EMhs%`Jds%N5_qbH`YrD!Di:/:U\rD)u\!)WYlnkf-Xs%rYir_<Ghpe^obqb[5gq,%&f
+!)WSh!DlYm;Z'Di;Ya2h;#O8j;Yj8`;YF&`<<#tl<r>tp<;T\n<rZ58<`;pn:ea\X7n#j55X%@o
+4$,G]2uY`81_iGG5sRUt4$#Sj6U3ju3]8lP0.n=gr\X[3r\P6G2`E]U2`N]U3]8uX2ENr]5!8d:
+s$?ZL#sgsH6q0[98Ol;M8d.m_F`_bKrc\9brHJTnH@($fI=?ZqrdY'$J:ZuKr]]j:q,@2jr)<Tl
+$EgS9YctC<ZEpmErj<'@\%&u[]=Y_h]`,VC^AktJ^];4L_?.Zp`r3pXaS]*0=8c1i<<]+jTqJ'N
+rgjdoS=?":R[KP1Q^3o%Pa%ApP*(k*Nrb9#repl9MZ/G6LkgcbLAuu-K`$K$K(X]nK)C9$K`?c*
+L&m'creY<GMi<USNfT6_OcklkQ'IZ%R$jD4S=Q7DTV8*UUo(&gWN*#$Xfnt6ZEppH\%&u[]Y(tn
+^r!t,`Q#s>aihlPcHjkbdaZdsf@S^0g>(N?hr*GOioB+]k2tjjl07O"m-O--n*fc9rpg-^o^r.U
+s7QHerV6EgrqcQirVZWmo)=4?Sc=3~>
+JcC<$JcFd1oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_nh9P&n*f]3m-Es$l0.9ljl>C\i8EJJgtLK7
+f@JI#da?Cdbfe/Ma2Q!6_:mZ!h;8.g!9!P/"Q81oh;&"arn@D,!nu>\rRqY4g=k65f\"g+eC2k>
+NW4t;NVJJ2`W!mF\GhNdO84e9O86-jZa$dAYct:4XfAG$rhgNiQC2oAI=m92MMmO\R\-:QY-Y[M
+]".gO!4i'>s1/$<!5&'<s1A3?!P,f@\c02>]D]>=]DfD@\HKLV]tM)V]D9#<]DfD?\c95@\bs&3
+\bNc1]D0#>]tXEZs1nTJrP8EKpqZjEs2+fRpr*3O!li:$nAbLK!6G/]q9&][rlkDeqof,dcHc=5
+r6PGkrmCkseCFQLrn%/%p=]H!qV)81h;-rFhr*Dii;_d9iaUs+e^;RZ`5BO3_R?D@US4<MR[9>'
+OcYQ\N4Q<uXfSM%V1*Zm_nN=GH]4DGNDF>%HqA:)Lk\Z"NIZ\>KnY89Knb7W:JOkg>G@gfVN-Xu
+P*2#sR[p"ASt;aTW3!/)XlKHUP5pdEPQ$g@Q1pOCQ0lWiVUGM?_#;+F_Z.IO_"b\A^&Xo,Ta%0^
+T:VXFSGnukR[KP1Q^3r&Q'@JqP*(ifO,o<\repl9MZ/J4L]E5/L&cr,K`$K#K(soqK)C9$K`?c*
+L'EEhLl$tGMuJZBNK0'\OcklkPa.N#R$a>3S"6.BTV8'SUnsrdW2cl!Xfek3Z*UgF[^WfX]=bhl
+^VRe)`5Ta;aND]Mc-FY_dF6Uqf%8R-g=tE=hV[8LioB([jlYail07L!m-O--rpKmWnc&(\oCV\S
+o`Fj]p\jmeq>U6gqu-HkrUTr=s.97@~>
+JcC<$JcFd1oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_nhK\(n*f]3m-Es$l0.9ljl>C\i8EJJgtLK7
+f@JI#da?Cdbfe/Ma2Q!6_47'eSt;RHqOmk^q4I_[pn%JUrLO:cSt;LDS=H(<rgNIrs).^NrbVFs
+nW3[0pMTkF!,hRks,./BMMd7HLk^Y<re(r)G'RS/BPMF'Df^&HI"-a&M2I>mO8b4@O8Y1>Nrb?'
+rf@,BqN1Q9rfI,?qiLN4!0I,>ooT39qiLf<rK-r>q2kE7r/g9-r0%)DrK7/Eq3(`@s-3)>op5QC
+rg<YNrg<AHrL3_TqjdVUo:GrRrh07a"/;K`UA^kdUAUecV#R:gV#@.bVuN^pWE6!kSt277P`h/h
+Lk1&'H?j[TEcGr5Ch[NpMhm(?JUVukBOlaUM19\ZCiX#s4&8UW5ZV6(Ak#7+@:X(aAn>UeB4aV'
+7SHKPI!gBlDJjB3E,g#DGBs16s*auuJc:9%e,Ii*e^i='f@\a/g">!3g]$%/hu;O:iSrnXjSEcq
+E,YPk!c`7$r,M[Spi6=SqNgc=r2.pBm?7('qiCfPrh0OhT:_^HSXf\K':P>VR$X,)Q'IStP*1rh
+OH5H_NW+k;Mi.Ljs+gZ1rIt<+re13%r.=]prIXs"s+LE+re:W4LkpnEMMqIm?]C),O-,TgPE_>t
+Q^F//S"#t?StMdNUSO``Vl6VqXKAY/Yd(OA[C3QT\\#Mf^V@V%_o0O6aN2NIbg"GZdF$Fme^i@)
+g"P39h;7&Ii8WeWjQ5Oekiq?slg4!*mf)YUnF?MK!qZ'Vrq-?dp\4X]s7uZjr;6HjrVc<dJcD>A
+J,~>
+JcC<$JcFd1oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_nga2!n*f]3m-Es$l0.9ljl>C\i8EJJgtLK7
+f@JI#da?Cdbfe/Ma2Q!6_>I12;>X5k;>a5k:Jh$fs%i\kr([5fr)!)as%r\joKE+9q`k*Vr(cc]
+r_ik`5<o*3r^$BGq,IPs;c?Xor_i\lr_O4j5Wh.l5!D4t5X[t/7S--D9ht[`rD!>eqbI/erD*&^
+r(d8dr_3>d!)EMh!)EDcs%N5_r(cfYrD*Ag!)E;br_E)]!)WYlnkf-Xs%rYir_<Ghpe^obqG@/g
+pe^ufs%rVh!)`_nqbd;ipe_#fr)*GkqGHl_pJ^rg!*/tss&Jeor)NSmr)NVps&1pS:JO\Y7mod4
+5<_4m4ZbY_2`<QN2)R`f5sRXu4$#Vk5=.Lo3B/lQ/h7he-SR,(1,_0O2*a#W3rV)@2`WiVr]($C
+4$ER9'M:VV5<hD"6pj@284H*?7nQBI9hkM-rc\<crHJNlH[L3hIX_9Gs*t0%J:ZrJr'(-F!'^9E
+s$66Ur)EYor2'ItricF.ZMq01[/RH5\Gj#@]"G\frk/9Es1SlS^;%Fu_84"*_o'Il`rF'ZaSAm0
+=8c1i<</cmTa%0^T:VXFSGnukR[KP1Q^3r&Q'@JqP*(ifO,o<\repl9MZ/J4L]E5/L&cr,K`$K#
+K(soqK)C9$K`?c*L'EEhLl$tGMuJZBNK0'\OcklkPa.N#R$a>3S"6.BTV8'SUnsrdW2cl!Xfek3
+Z*UgF[^WfX]=bhl^VRe)`5Ta;aND]Mc-FY_dF6Uqf%8R-g=tE=hV[8LioB([jlYail07L!m-O--
+rpKmWnc&(\oCV\So`Fj]p\jmeq>U6gqu-HkrUTr=s.97@~>
+JcC<$JcFa0o`"gfrquZjs8)ckrqQNf!;?Eb2>$M3o()>?n*f]3m-O''l0.<mjlGI]iS`VLh:pZ:
+f@JL%da?Fec-+8NaMu3:_V3`!h;-rehZ2U-i</#qh;/(brRqA.g=b0XgAKV.f[n^)eVoI\NW+k:
+NVJG4`;R[S`rEO7\,_NeNrP1>Nr"h8Zm;raZ*1@6YH=q,XK/A"W2GTAF*;hXK85;BN0'<mTV8<g
+Ye%C@\cB;;])TD=])TD=])K8>])B8?\cTLV]`,PB])T;D]=bhj]_oD;])TDB])B28](NW/](`i3
+]E,^[r4i9IrP/<Hrk\KI!l)OdrPAKM!5nTMs2>&Za2d\h!QW:[ana*XbQ#fcc2>fcblH&dchu,i
+dJhPqe'uqIf)F;#f_4"tgA9S(g]cNjhr!ALr8@S5"5MARb5T@V`5]^%W2?;]TUM:9Q&q)iMiEY*
+Yd(:1Wi;b@SZ]K>XdOHjSni:AAoC1RFG,TE:47P@L5qC`R\$(:;,9qd<)]NbUSarJNKK?dPF7i0
+Sc52bTqeNcY-+kas7hfWP5CICPkgU>PQ8eka8Vq6VUYY@_#;+F_>qFO_"YVA^Ajr.UAgheTV)4T
+"eD0QS!ocEQk#IKQ'IStP*1rhOH5H_NW+k;Mi.Ljs+gZ1rJ(?+s+L<&qh"`sqh"`us+LE+reCH.
+!/UW2DMj@2N/`jYO-#KeP*D5sQC!u,R[]h<StD[LU84T^Vl-MoX/rG+Yd(L?['mEQ\[oGd^;%J"
+_Sa@3a2lBFbKS8Wd*^:jeCE.%f\,!5gtgiEi8N\Uj5oFckNM0plKdg'mI'H3nF5u=o(2JFrq6<b
+s7cKes7u]kqtpBjr;H6dJcD>AJ,~>
+JcC<$JcFa0o`"gfrquZjs8)ckrqQNf!;?Eb2tZ_5o()>?n*f]3m-O''l0.<mjlGI]iS`VLh:pZ:
+f@JL%da?Fec-+8NaMu3:_OR-eSXuFFTDP;[U&(GWT)P;ZT)>/ZSGo#XD>eAKD>nAGD>BLtNpr,.
+NrEqrD>eALD#nNmrJ_5ENJi[OM2I+FL51M<re(u*G@>#nB5;@&EH?8JI"6d$Ll7=Tq2bZ=OH9=$
+s,m2?qN:c=rf?o;pQ,?9rK$W5!0R,>rf@#>r/pf:q2tT:m#h4/s-*DEs-*;Brfd>Go9K!7rKmMN
+rKmMNopP`HrgWhUrgiVOrh'1_r1X+arM0Cer1j4ds/#XhrM9Lkq5=7k6`HrVT:2+3PE:odLOai#
+HZs[TEH#c2CM.?mMhd"=J:MukB6o2cMg]_WC3*HV4AJj<;-@CB5t,9k@qKOpEHHGLF8eZ/9E7`b
+Hkq3\DJa<1E,p&CGC"O\H@('hJV&H)df._qe,n1Of)F;$fFHTef\5*8h;-rFhr*GOir7s@jDSsU
+DtS&ODfB]9rGqjVs)@gS!13GGp6GWRrMJ*Em#pt&r/grR!2BId!MH(aSct[TS"#k7rg41^QBd`"
+PEM)kOH>NaNfF$s!K2j7M>rA3L])u-L&Zi(KDU8uJbt&sKE$W)L&Qi,LB*/0M/J3/N/WaVO,oBb
+P*2&pQ'Rc(R@9V8SXuIHTq\?YVPg>kWiN5'Y->1:Za@0L\@K2`]Y;.r_8=+/`Q-'Ab0/#ScHste
+e'uq!f@\d1gYCWAhr*JQj5]7`k3(sml0@U$m-X60n*oi:o()DDo`"O`pAamcq#C0iqYU0hr;?Nb
+rdk*@s*t~>
+JcC<$JcFa0o`"gfrquZjs8)ckrqQNf!;?Eb0D+l-o()>?n*f]3m-O''l0.<mjlGI]iS`VLh:pZ:
+f@JL%da?Fec-+8NaMu3:_Y[72;>jAm;>F&f;#sKhqb@8i:esnap/1fc!BiR=4oRSB4oISE5Q4IV
+:B+;c<V]Vl5Q3nJ62<eE<<6'!r)3SnqG@l%4[;.m5<h=s5<hP&7Rfp?8kenQrD3Dfp.tQ\!)<Gd
+r_3Afr_NDcs%N5_qbH`YrD)u\s%`/]r_`5_q+q#erD3Df!)NAdrD38ds&&Mes&&emr(dDk;,U<h
+;>jDf;#jGl;$'Wm;>sJk;=d][;u9Mo<W,ns<VKPk<<6'!rD`\pr`9%t+&Ym1:.\)K770C+4Zttk
+4#o8[2)[6I1.+Ar5X%@m3rV>g5X%4f2`3BE-Q4E`.4Qu.3A<<Q1cIEV4[;8!6UWpp3'98crC[;c
+5s[_!62j7O71VmX84Z6C9M.uPFEM_JF`dV*s*"Bc%!Zu@H$XgbI!pHmIt.BH!.j>ss#pTN5!D1p
+55d\G<:Nob<;r`mVZ3k2Z*L[AZa@-K[^`iX\[oDcrOW'Br4NEN^V@S#_8=(,`;[aU`rF*Q<qf\p
+<q02iUB%%fT`LgYrgj:aS=?":RJrQ`Q^3o%P`q8nOcYZcO,f5!Mueiore^Z2!/LN-s+UK+r.Flu
+r.4`sr.G$&s+UH,s+^T1reYNMMi<USNfT6_OckllQ'IZ%R$jD4S=Q7DTV8*UUo(&fWN*##Xfen5
+ZEppH[^`lZ]Y(tn^qmn*`Pom=ai_fNcHaeadaQ^rf%8R-g=tE=hV[8MioB(\k2tjjl07L!m-O--
+n*fc8nac8BoCW%Ts7ZKerV6Egs8)Wirqu]moDX=@T)X<~>
+JcC<$JcFa0oD\^erqu]ks8)ckrV-Hgp@eLY2"^D1o'u5<n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@AC"dEp4bbfe,L`l5j4g"P3:hVS7h!9!M."lS7ngtUT^gAfq,g&9Y'f`TmYe^XGSp5Sj+s2=oU
+rPnfFm(!)+rf-o;#EOn*O,oBaO8b7@ZiIE2YQ:o1ri?."WrAq1VN%!aG'\UiL5ChIOd2<+Tr5#r
+q76R:rji0C]"7mQrON'B]"7mQ!P5oA])K8>])B8?\cTLV]`,PB\d#^V]=bhj]_oD;])TD@])T>?
+\cBA?](W]0](`i3]E,^[r4i9IrP/<Hrk\KI!5JNKrk\TNs24ZNs2G#Xrl=TL!QW:\anX$WbQ#fc
+c25]dc-FW3ci)5jdJhPse'uq!f)F;$f_!krgA9P,gtgiEhtc2>f$Vjd`5]^4`5SsYV4sQQR@0D,
+NKB*XNJP*NYHP"-Whk/hXi%lSS9]pWD/rHCE(4SdKo8MsN.6J=O-?!"T:&GM:K1:lU7nE\Vi?[t
+OckooR@Tq=T:VXLV5L>sY,nb_s7_]ZP*;)mqih&Eqj%,E!1!PJrQ+EIr2'@hec5E[r5&9Is2"`N
+p:pR?s.gg5U8"?TTV%jJSt2C@S!ob5R$a5+Q'IStP*1riOH5H_NW+k;Mi.Ljs+gZ1rJ(?+s+L9%
+nq-aks+CB+rIt?.M#N6LMMmFPNK0'\OHG]hPE_>uQ^F//S"#q>StMdNUSO``Vl6VqXKAY/Yd(O@
+[C3QS\[oGe^;%J#_SjF5a2lBGbK\>Yd*^:keCE1&g"P08h;-rGi8N\UjQ5OdkNM0plKdg'mI'H3
+nF?&>o(2JFrq6<b!;HHerqZTjqtpBjr;H6dJcDABJ,~>
+JcC<$JcFa0oD\^erqu]ks8)ckrV-Hgp@eLY2Y?V3o'u5<n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@AC"dEp4bbfe,L`l5j4S=H.@St;RHqOmb[r1O(^q4@SVrLWtYs.'+YrbVOMrGMIKr+u=Kpm1l=
+n;mI,!,h^Os).^N"`A6sNK&nrM?\opLkgb>LAli>K5u3E@qB7eD/O?6G'SLcJV8c8q2bT;rf@2D
+OHBI(rK-u?s-!ADrfI,?qiLN4s,d2?pQ,H=OHKC$rf@#>r/pf:q2tQ9m?.=0s-*DEs-*;Brfd>G
+o9K!7rKmMNrKmMNo9oTHrgWeTs.0%Y!2'%Xrh'4`qk=%as.][lUS=L\U]%"gV>I(fV#[CgVa[PX
+St2=9Q'@AmNJ;t4H[0dXF)c)7CMRQrB8VM!K7SJuH=pc>Nei.-A8,p`<BNBD4]5HnBgG1(@:O"f
+E-$,GF@Jbir_3?>%=N\SDJa90E,ouAG^+H3H3/MEIf=m$JqMP#df.\reCFQLs4@;'rn.h9gYCWA
+hV[5Ki8N\Tj5]4uDtJ#KDZOfsqf;LPrKm5Dq3ClSrMJ-Fs,m#<!0R/ArK7,AooUM]Unjc[U7n9R
+T:_^HSXc1=R[KS2R$X,(Q'@JqP*(lgO,o<\repl9MZ/J4L]E5/LAuu-K_pDmK):3#KE-`)L&m'c
+reYQNMi<USNfT6_OcklkPa.Q$R$a>3S"-(ATV8'SUnsrdW2cl!Xfek3Z*UdE[^WcW]"G_j^VI_'
+`5Ta:aN;WKc-FY^dF-Ooe^rF+g=k?<h;7)JiSrnYjlY^gkiq?slg4!*mdKW6naZ2@oCMVRp&F^c
+p\jmdq>^<gqu6NkrU^#>s.B=A~>
+JcC<$JcFa0oD\^erqu]ks8)ckrV-Hgp@eLY0(ec+o'u5<n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@AC"dEp4bbfe,L`l5j4r)3Gir_`_nqG@,f!DlSi:'+3f;#X8b;?'J]4o@GB4o[_F:]!oc<9dHb
+5<_:15P@AB<W5ts;ZK_l;%?Dc5s.7o5!D4t5XIh,8,c'\8l,4WrD3GgoM>B[!)<Gdr_3Ji:JXa_
+:&do_:&7WW:]4&L:BF?i;=[QZ:]F8k:]*rf:\[cb:[V'Y;#jGk:BF?i;>sJk;>a>b;$'Wm;>sJk
+;=d][;uBVo<W5tt<VTVk<<6'!rD`\p(04C5;,9q^8P;QB6:4"'4Ztkg3B&iSr\Z;`6:*t'5<_+h
+5X.G"4ZYM\2D[$6)C[0d.kih@0/Z!O2E<l_5!VM)2E<c[4$ER9&kY_]5X.Fu6pX.-6q'X97n?-B
+r_!8d9`B,6Fo?F^FoHRaGQ)glH$XgbI=6QnrdP'$It3'#jur`.r]g?FrD`;cr`&flrMBY#Z*OA8
+&%/jT\%&rY]">Pd]Xteg]`#PD^AkqN^qmn)_u7LV`Q#p<a7E@/=8l8#<<-"j<WAj<US=KVTqJ$M
+St;LCS"#k7R@'A.QBd`"PEM)kOcYWbNfF$s!K2j7M>rA3L])u-L&Zi'KCXWkKE$T)L&H`,LPYqd
+Di0I3N/`jYO-#KeP*;,qQC!u+R[]e:St;UKTqeE[VPgAmWiW>*YHY:<ZaI6N\@K2`]tV7s_SX71
+`lH0BbKJ/Ucd:(feC<%#f@em3gtgfCi8ESRj5f=ak3(sml0@U$m-X60n*ol;o()DDo`"O`p&Ojc
+q#:*hqYU0hr;?Nbrdk*As*t~>
+JcC<$JcF^/o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nhBV'n*f]3m-O$%l0.<mjlGI]i8EJJgtUQ8
+f@JI$da?Cdbfe/Ma2Q!Kf\,!6h;7#fhZ2U-i</#qh;&"arn@D,!nu>\rS%5'!SH!%N;nn;Mu\k:
+N:r8.N;pip`VdaK\+@-.\bqHdNW>.9O9VqoZ*(41X8](7W2?GgOI^H:H@:?uMN!OXPa@u7Vld25
+pppO=]"7mQrjr-A!4r-@!kQ"Urjr-?rjr!=s1/3Brk/3Arji*Ark/<Er4Dd9rk&!;s1A3?pUU(1
+pUg45!PQ5F^])%J^\ttI_>:qK^VIYa_>_=O_th7N`W*pZa2l<l`rF*ZanNsVbPo`cc25]dc-FW3
+chu,idJhPse'uq!f)=2#f_!krgA9S(h#H72hu2JCgXFKj`l>s6_8O!eV50iVSXGn4Q&UlbNJrb*
+ZELF5X/i7NH_S-M\YGI4Q&gPu?tF^XEdWd::/64gLl@LdR\-!D:JOke<M?1bVi6UsOckoqR@^">
+T:VXJUSb&nY-+n0h>d24s-!/@s-3GHr06utn]1X)rMBIif)PQ]pqcsHs2"`N!5JKHqnN*DrhKRi
+UAghiTV%gISXf\K&t55UR$X,(Q'@JqP*(lgO,o<\repl9MZ/J4L]E5/LAuu-K_pDnK):3#K`?c*
+LB!$GLl$tGMMmFPNK0'\OHG]hPEhE!Q^F20S"-%@T:hmPUSO`aVl?\rXKAY0Yd1UB[C3QT\\#Mf
+^V@V%_o0O6aN2NIbg"GZdF$FmeCN7'g"P39h;-uHi8N_VjQ5OdkNV6rlg4!*mdBQ4nF?MK!qZ'V
+rq-?dp\4X]s7uZjr;6HjrVc<dJcDDCJ,~>
+JcC<$JcF^/o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_ngO%tn*f]3m-O$%l0.<mjlGI]i8EJJgtUQ8
+f@JI$da?Cdbfe/Ma2Q!qSH#/[T)YG[T_bA\TE(V[T)P;ZT)G2\S=B=jr,)@Lr,)=Ip6P--p5]/i
+rbVCI!,hdSre^f7Lkg`aKboDpK7\/j?t3_YBl%[,EclVSIt33,Mi[Xp!g/S+rfR2Ar/guBrfR/@
+s,[&=ooK*6s,Zl8rfR&=rf@#>r/pf:q2tK7mudO2rfd>Es-*8As-*GHo9K!7rKmMNr0RGNopGiJ
+RJrZSS,8]USa`6MTDtS]U&Uk\U]%"fV>R.fV#[CjVcT[eSXYt4PEV,iMM-J,H[0gXEcGu3CMIKp
+ArDFuKS"`(Htm8AMg^>*EaNa!?pI7V>X2=sB0\pT?t*ecE-$,GF@Sbh9hS3.I!pH\D/O92EccGK
+G^'.5"ab]IJUrFPKDs<sdfe1Ne^i=NfDjM&g&Ke5gtgiDhr!ANio9stqJYnC!-.gTs)Ih#pQk]A
+rhTLhrMJ0Gr/pi=r/puArK7#>pQ>HN!McCgT`q*]St;LCrgOOhR@'A.QBd`"PEM)kOcYWbNfF$s
+!K2j7M>rA3L])u-L&Zi'KCa]lKE$W)L&Qi,LM_j(M2I1KN/WaVO,oBbP*2#oQ'Rc(R@9V8SXuIH
+Tq\<XV5L5jWiE/&Y->.9Za@-K\%0&]]Y2(p_8=+.`Q$!?b0/#RcHjnce'umuf@S^0gYCW@hr*GO
+j5]4^k2tjkl0@U$m-X6/n*fc9rpg-^o^r.U!quB_rV6EgrqcQirVZWmo)=4?T`9N~>
+JcC<$JcF^/o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nga2!n*f]3m-O$%l0.<mjlGI]i8EJJgtUQ8
+f@JI$da?Cdbfe/Ma2Pto;>a>i;?'Mo;>F&f;#sKhr([;h:f.-e!)WMhs%rSVn3-Y2rD38bj&Q"@
+!'g0Br`&nrr_i_mr_O1j69ICq5!;+r5X@_*7nH3B9DM?]:]F2^:]*rh9h\7[:&Ica:&[i_:&%K_
+:B45e:]4&L:[_-U:]=/j:]*rf:\R]b:[V'Y;#jGk:BXKk;,U<h;>jDh;#jMm;>sGn;>sJl;=[WZ
+;uBVo<W?%s<V]\q<<-"p<W,ns<<?,u;Z9Gt9M%cD6UF+)55mVN3]B#T2)I0I0ge;,5t+""3^>no
+5s7=j2E!EH/K>r]0J+k33%m*F1H.?V4[;5"76*=e4?Yc!9M7r@5X.G!6pX1.6q'X98Ou?D9M8#Q
+9hTPKqfDj]FT-F_G5c^bGlN'rH[L6iIXZcrJ:IQKj#mK.5<_:+<:Wrf<;r]lV>[7pZ*L^C['fnB
+!4`$>rk&3A"hVFZ]Y2#X^AkqL^r!te_uI[T`<+'"a7*./=8u>#<W,nk<W8cpUS@a]"e_KZSt2DN
+RhD0XR$a5+Q'IStP*1riOH5H_NW+k;Mi.Ljs+gZ1rJ(?+s+L9%o7Hjls+LE+reCH.D2=%*MMd=N
+N/`jYO-#KeP*;/rQC!u,R[]h<StD[LU8+N\Vl-MoWiW>*YctF>['d?O\[f>b]t_=u_Sa=2`lQ6D
+bKS5VcdC.heC<($f@em4gtgfDi8ESSj5f=ak3)!nlKdg'mI'E2n*olHncJFTo`"Lbp@n=[q#C0h
+qY^6hr;HTbrdk*Bs*t~>
+JcC<$JcF^/oD\^erqu]ks8)ckrV/GJp@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bK@oH`l6N]g"Y9;hqn@i!9!P/s53q7h>Z1-g&Tn(gAT\*Mi@Rnrf$f8!06Z1s,?rq
+rl+cSn[J"t!4i&f"ceY(NfT8"OT1C@XrOODWiE"pVkp;RRr`atI"I-0NK96fQ_'hHX0K/5\cBAA
+])TAB])K>@])TAB])'&<])T>?])0)@]">TR]_oAC]">WS]`>_C]D9&:]DK2<]DT8<\c98@\bNc1
+]D0#>]tXEZrkSNJrP8EKqS3*GrkSQMrkeZPq8<<Q`r3sJ`W=-$prWZ[b0'_,rlkDeqof,dcHc=5
+rQtPkrmCkse^aTL!8-nr!8@5&CY[b&hr!AKda$(Y`5BO1_8<^ZVPKrXS!fV.PE1`^M2R1tY-+n.
+XKALRIX&9=\>l*GLl?:o:e,IuCjUqo:/6h#KT;+\R\-*H:/Fkg<MH7cVMpOqOHYs!S",t?St;[O
+V5^T"Y-"k1YMB0@PPpdHPk<&ga8Db3V>d=lVqD%E_">JC_#M1H^AbnG^Ak&0U`cG,U7n9RT:VXF
+S=H(<R[KP1Q^3o%P`q8nOcb`dO,f5!Mueiore^Z2!/LN-s+UK+qh+Nmqh+p%s+UH,s+^T1reY3D
+Mi<USNK0']OcklkPa.N#R$a;2S"-(AT:qsQUnjlcW2ZetXKAY0Z*L^C[^N]V]">Vg^VI\&_o9U8
+aN;TJbg+M\dF$Fme^i@)g"P39h;7&IiSrnXjQ5Oekiq?slg4!*mf)YUnF?MK!V>s_p&Facp\jme
+q>^<gqu6NkrU^#>s.KCB~>
+JcC<$JcF^/oD\^erqu]ks8)ckrV/5Dp@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bK@oH`l4I<rga1`T:V[IqOmVWs.K1Zrgj"ZrLNt)rGD@HqJH4Lr,)IMop5*.p5]$0
+!,_^OqJH7Mrbqdl*/B9&KnP)3JqS5k?t*VWBkqU*F*2bUJ:N<-MN7[t!0R8Bs,d;CrfR5BqiLlA
+rfR/@s,[&=p5f-5!0?r;!g/S+rfR&=s,[,?qiUW7qiUT6nr`j5rfd>Es-*8As-*GHns/m6rKmMN
+rKmMNp6buLR@4&Cs-rnUs./YNrgs1`qOmn`pS7Y^rh]LfrhW2`Vl-DbSXc(5P`q2iNei79H[C!\
+F)c)7C2%BoAS-dQKS"c)Isc!DA;6+uI<B(8C04M!4]OdH>\%M;7VlLDC2S'5G]u\K7fH-^I/eX%
+D/O60EcQ;EH$K=7$[dAPJ:W<(K7ei1dJ_Mke,Rttf)F;$f`0Y)gAp%.h>c@:i8NYSioB(nDt.fD
+EqG^lQN!0IV#@.hV?!OHs7qfTP4k%6OSY+>V>m>6US=KVTqJ$LSt2CAS"#k7R$a5+Q'IStP*1ri
+OH5H_NW+k;Mi.Ljs+gZ1rJ(?+s+L9%oRcsms+LE+reCH.!/UW2AVuD)N/`gWO-#KeP*;,qQ'[l*
+R@B\9St;RJTq\?YVPgAlWiN5'Y->1:Za@0L\@K2_]Y2(q_8=+/`Q-'Ab0/#ScHstde'uq!f@\d1
+gYCWAhr*JQj5]4^k3(sml0@U$m-X6?mfDqJrpg*]o`"O`pAamcq#C0iqYU0hr;?Nbrdk*Bs*t~>
+JcC<$JcF^/oD\^erqu]ks8)ckrV/5Dp@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bK@oH`l1ePr)3Gir_`_nqG@,f!)WPf!DcPk:B45f;>EBO54^r;4T/(P:&n)M<W,nq
+4odhB5lX(J<;oet;Gg<j:_Q#Z4$>bk4[21s5se"18OQ-C:/Lpbr(m>fo2#<[!_l?^r_<>dqb@&`
+qG$c\oM>E\jA55@q+pudqb@,epJCfamnj!\!)WYjs%r_m!)iVir_iSi!)ibmqGR8hnP]0]qc*Pp
+s&Aqsq,[Mq!*&epr_sk;;c-@d:/+DQ84,d25sIIp4?GS`2`*BK1bpdPr]re45!1kl5X.S$4ZYJ[
+2)?m6)^d-g.kih@2)RWT2)m]`5XIjs3B9/a4\JIA8O#L*5"%b)6UXC77S--A8kVcKrCd5dErL.W
+F9?Z-F`m\,rceBes*>*#I!g?kIXcirIt*!!k<8i/rB9dPo2GR_rMBLj"fJZ4['mFB[fEu<\cBA@
+])K;C]Y2#X^&l'b_>V7N_uI[T`W*sC<rZ1r<;KVpV>m>6US=KVTqJ$LSt2CAS"#k7R$a5+Q'ISt
+P*1riOH5H_NW+k;Mi.Ljs+gZ1rJ(?+s+L9%oRcsms+LE+reCH.!/UW2AVuD)N/`gWO-#KeP*;,q
+Q'[l*R@B\9St;RJTq\?YVPgAlWiN5'Y->1:Za@0L\@K2_]Y2(q_8=+/`Q-'Ab0/#ScHstde'uq!
+f@\d1gYCWAhr*JQj5]4^k3(sml0@U$m-X6?mfDqJrpg*]o`"O`pAamcq#C0iqYU0hr;?Nbrdk*B
+s*t~>
+JcC<$JcF[.o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nh0J%n*f]3m-Es$l0.9ljl>C[i8<DIgtLK7
+f@AC"dEp4bbfe,L`l6K\f\5*9hYc72i:Z%4i8<DIgtVe]s4dJ*rRq1.!fDnpqi1W7rJg`8pl59k
+rPeZR!4Va3q7#b$!0-u<!0@,>s,[/@rf82&Wi;qpWhu_mOd^?7H$t7!Ll@FYQ'\)9V5pi.]">Pb
+q7H[<qRZa?rk&3As1/-?q7HR;#.qO[]=PVerk/<Eqn)j=!kZ%Tqn)d;r4Dm<rOM[6!kZ%TpUg45
+!PQ5F^])%I^])%J_>:qI^])%K_>_=N_th4O`Q%hro#:aOaN=;$s2k;`rQG5brltAb!6tMgqp58g
+rmC_n!n>cNr7Cu$o[s5uptH&/h;7#@da#u6`!O;o`PS[RVPKoWrg=%VOc>?XMi3J!riJ,\WN;nF
+H)%RJ]r[fjFH_Q6<FKHd8TK6:8l&90JVfALR[]mE:Jaec;.H;rVl#H6OHGftS=H)JSdM6hVlQu'
+Xfeh1YM0$LP5pd9P6$o5nAt=DqP=+erh][nf`1Z\pqcpEs1e3?!N)^mU]mNfTqS-OrgjmrS=?":
+R@'A.QBd`"PEM)kOH>NaNfF$s!K2j7M>rA3L])u-L&Zi&KD'ooKDpQ(L&QgLLPUbCM2I1KN/WaV
+O,oBbP*2#oQ'Rc(R@9V7SXuFGTq\<XV5C/hWiE/&Y-5(7Za7'J\%&u[]Y(tn^r!t,`Q#s>aihlP
+cHjkbdaQ^rf@S[/g=tH>hVd>NioB+]k2tjjl07L!m-O--n*fc9nac8BoCW%Ts7QHerV6Bfs8)Wi
+rqu`no)=4?U&TW~>
+JcC<$JcF[.o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nh0J%n*f]3m-Es$l0.9ljl>C[i8<DIgtLK7
+f@AC"dEp4bbfe,L`l4F;S=Q4BT)G;]TE(\bT_P5[TE(V\T)P;\T)G5[C]J>OD#J5HD#%rIDZ4MF
+Q2m$=O7\J+NW!\oDZ"AODZ+MRLAuoHK8"o1K62BH@:WtbCMn*4Fa8@aJV/]6NKB9aOSP"=OSb.?
+P5^UBOT1C=OS4b5O8t@>O9Lc.OHGZerfR#<!0@)?qiUQ5rK6f8nr`j5rfd;D!0d5As-*GH!gT"7
+op,39rKmMNrKmMNpR2#J!1EhTrgWeT!1itX!2'%Xrh'"[s.]Og!2TLer1s:fr1s:f(o*^mR?j,%
+P)k]bKn+W"H$=FQE,TN*CMNi\7Yc\MJUi/sGA1W;K7\o-G&Uf,B43tq9O'e_?YD_p7:0P<CiFH<
+GXb+k7SQHRI"$QqD/O93EclJKG^Fd`I=H]sJV&N,re1<us3^hormLnte,Intf)F;$f`0V7g=tB;
+h;7#Gi8NYSioB(kDt.cJEH7B8QhQdGQ27<UV>d=lVqD%COT:R?OoCFBOnOn8OTD>UrhK^mU7n9R
+TDkDtSXc1=R[KP1Q^3o%P`q8nOcYZcO,f5!Mueiore^Z2!/LN-s+UK+qLeKnqh+m$s+UH,Fbbd/
+M2@+IMi<USNfT6_OcklkQ'IZ%R$jD4S"6.BTV8*TUnsrdW2cl!Xfek3Z*UdE[^WcW]"G\i^VI_'
+`5Ta:aN;WKc-FY^dF-Lne^rF*g=k<;h;7)JiSrnYjlY^gkiq?slg4!*mdKW6naZ2@oCMVRp&F^c
+p\jmdq>^<gqu6NlrUTr=s.TIC~>
+JcC<$JcF[.o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_ngEtsn*f]3m-Es$l0.9ljl>C[i8<DIgtLK7
+f@AC"dEp4bbfe,L`l7pSr)3Gis&/hnr)!>hs%i\krD!Di:f.-e!)WSjr]]s;rBBm;qG7)cr_EMo
+pf-]^pJh/Ws#pEIq*=pD$rg/';Gg=h:f'>A4$<L+%6m*B6pa=484H3D92A=\:B4/\:]4#i9h\7[
+:&Rie9a+3b9MJ2Sq+^Z[o2#?\jA55@q+puds%`Sgs%WPipJCfamnj!\s%r_ks%rDdrDNAepeq,h
+n5B0_s&8tsr)ESo!*&nsq,RPs<)iZns&0A(:JO\[8Oc3;6UF%&4T7E@3]AuR2)[3E1dXMp5X%:k
+2aBVm5<_4k3ArcQ0J+7g-86u&1H-sD2)@3Q4?Ynq6T6tb3'05d91qfH5sIM"6UF+-7Ros?84Q6D
+8PDfP9MJ6$rc8!ZrcA0`FSp:]G5c^cGRf"FH@($fI=?WpIXcitJE/ln54DPF;u3<hV>d>$VmEb<
+[^NZT\@K2^\[hXL$bO'a]tM.p^VIY$_>_:O_u@US`<!utr)WhtoN(lipJh)k!N)^mU]mNfTqS-O
+rgjmrS=?":R@'A.QBd`"PEM)kOH>NaNfF$s!K2j7M>rA3L])u-L&Zi&KD'ooKDpQ(L&QgLLPUbC
+M2I1KN/WaVO,oBbP*2#oQ'Rc(R@9V7SXuFGTq\<XV5C/hWiE/&Y-5(7Za7'J\%&u[]Y(tn^r!t,
+`Q#s>aihlPcHjkbdaQ^rf@S[/g=tH>hVd>NioB+]k2tjjl07L!m-O--n*fc9nac8BoCW%Ts7QHe
+rV6Bfs8)Wirqu`no)=4?U&TW~>
+JcC<$JcF[.o`"gfrVZTjs8)ckrqQNf!;?Eb1\C;1o()>?n*f]3m-O'&l0.<mjlGI]i8EJJgtUQ8
+f@JI$da?Cdbfe/Ma3rMhf\5*8h>Q72i:c+7i8<GKh;$c>rn@D,r7_2(pl#94N/[Xn!0$f7qi:Z8
+rP\]Sq8WHDn@%hqr4)`d!0@&<!frG)rJqnqW2HSj6B@P'GBeLbL5LhLP*VK,T;8KiZFILA])]G<
+])]MC]DK27]DT;C]=bfU])]MC]`>_A]DoJB])]G=]D]><]DK2>\bE]-]D0#>]tXEZrkSKIrP8HL
+r4iBM^q]las2"]OrknTNs2G#XrQ"iU!6=lS!lrC(qTAi[s2t>arlkAdrQP;ds3CJerm:YlrmLhr
+!7gtu!8-qss4[5%A(/ZEaMc$7^r4*tVkp2_T:D=9Q'@;hO,JmP[BHd:XK&D%J:)U@_m-G=Q$J%D
+K8s&77X.RCI#!JQ:6'pWNK0BoT:SkS:fLCoO/&SLN/ip\PF7i/S"H:EUSXlhY-+n0Y5YWXs8S>W
+PQ-g;PO-Bca8_q3V#I4iVZ3RJs8Kk/_"khH_#D+@^&k40V>d84US=HUTV.pKSt2C@S!ob4R$X,(
+Q'@JqP*(ifO,o<\repl9MZ/G6LkgcbLAlo,K_g>qK)1-"K`?c*LB!#/M#N53MMqImAW;_2O-#Nf
+PE_>tQC+&-R[]h<StD[LU8+N\Vl-MoX/rG+YctF>['d?O\[f>b]tV7s_Sa=2`lQ6DbKS5Vcd:(f
+eC<($f@em3gtgfDi8ESSj5f=ak3(smlKdg'mHs?1n*olHncJFTo`"Lbp@n=[q#C0hqY^6hr;HTb
+rdk*Ds*t~>
+JcC<$JcF[.o`"gfrVZTjs8)ckrqQNf!;?Eb2"^D2o()>?n*f]3m-O'&l0.<mjlGI]i8EJJgtUQ8
+f@JI$da?Cdbfe/Ma.&QgSXuCDT:l1Us.K@bs.K7_r1F%^qO[\Ws.97]q/#kDqJ>tErbh\"p6PH6
+ooAI"rb_UOs(qaRqemF+KS+o.6?7?r@U`k^C2Im2Fa/7^J:iQ2MN<kpOT:L<Onb"<OoCI9O7n\8
+OT:L>On=b5On=b7OnOn-Oo1CAPPpXEPPLCAPP^U;Q1^IAQi<BNQi<BHRJrQRRJrZSS,8]USbeoX
+TD5#WTD>2\UA1M\V#I4eUgTgbS<oP*P)t`aLk:/)HZsUTDfBW1Bk_6nAVl(nJq/<!Htd2&J<#23
+G]I8-CL_$E5Wi18<*a'I7Rh6'@r#q%F*Vt"7Rg'G:2tZ1IVit?DfKlAGBnL]H@:9lJUrFPKDpQ'
+d/MGldf7eqeGn(uf)F;$f`'V)g]lTkhV[8MiVqg<j)Au4DuXeVDt@rFQL^C;QN*`WV#I4iVZ3RJ
+s6Pm=OT(@DVl$<iU`ZA+TqS-PT:VXFS=?":R@'A.QBd`"PEM)kOH>NaNfF$s!K2j7M#rKgL]3&-
+L&Zi&KD0uoKE$W)L&Qi,LB*/0M#iKlretEJNfT6_P*2#nQ'IZ&R$jD4S=Q7DTV8*TUnsueWN*##
+Xfen4ZEppG[^WfX]=bhk^VI_(`5Ta;aND]Mc-FY^dF-Oof%8O,g=k?<h;@/KiT&tZjlY^gkiqBu
+m-O-,mdKW6nc&(\oCV\So`Fj]p\jmeq>U6gqu-HkrUTr=s.]OD~>
+JcC<$JcF[.o`"gfrVZTjs8)ckrqQNf!;?Eb/+iH)o()>?n*f]3m-O'&l0.<mjlGI]i8EJJgtUQ8
+f@JI$da?Cdbfe/Ma8Jm5;Z'Dk;Z0Ji;#aAn:f%$b!`)Whr_EMjr_`DRlok>3!)NShr_EMhqbI8i
+<E7aPq`jsCrBL<[*)TU269[\#4?Pej5!_A!6:4767nH<H9MeM\:/:@UrD!Af9`@cb:B+&g9E\'`
+9h\7V:&.QT:B4/M:[_-U:]=/j:]=)g:B+,d:]OAj:[V'Z;?'Jm:]F5l;,[-cr_iJfr_ibprDEVm
+rDEVooMYTcs&9/#<)cjt<;'>i<WZ9%<W5tr<F]'.;,C(b9M.fD6pa7.5!D+i3]f>\2)I0K1,D6_
+6:!du4?,Sk5!M:q4?5;Z1bp[:*??LZ/LrM53]8i\2)[HX5X7Y'2E<cZ4Zu>08kD955=%\)6UX=5
+7nH6A8P2QJ9M>=Ys)J!Xs)\0]s)eBbF`mV*rce?es*FrtI=6QnIt%BH!e<Hupc\X@nNH8=pJ_*e
+qkX4frhf^n%CEOO\$rlX\[o>]\[o?N\dZ3`]Y2%n^V@S"_84"e_u7LR`V`d6<W?,"<Vohr<V9>j
+<<B(qV>d84US=HUTV.pKSt2C@S!ob4R$X,(Q'@JqP*(ifO,o<\repl9MZ/G6LkgcbLAlo,K_g>q
+K)1-"K`?c*LB!#/M#N53MMqImAW;_2O-#NfPE_>tQC+&-R[]h<StD[LU8+N\Vl-MoX/rG+YctF>
+['d?O\[f>b]tV7s_Sa=2`lQ6DbKS5Vcd:(feC<($f@em3gtgfDi8ESSj5f=ak3(smlKdg'mHs?1
+n*olHncJFTo`"Lbp@n=[q#C0hqY^6hr;HTbrdk*Ds*t~>
+JcC<$JcFX-o`"gfrqu]ks8)ckrV-Hgp@eLY1\C;0o'u5<n*]T0m-Es$ki_*jjQ#7Yi8<AHgY1?4
+f@AC!dEp1`bK@oHdaZk#g"P3:hYl@3i:l41i!&#phVHuArn@D,r7V/(rJgK/nW!O.!5nfSrl+ZP
+r3u1(n[JA)rK$o;qMuSWW'Wh5R@/2BI=?s-NK90dQ^OJ>VlR,3]=Y`S])]G<]DoPD]DK2>])]M@
+]D9,=]*,d[]tD#S]DoJ9]DfD;]CEK)]DfJA^&P_G]tXEZrkSKIrP8HLs1nTL!PlJL_#D1L_Z.ON
+`;[aU`rF'[aN*nls2P/]ans6ZaoBK`bP]Tac2Prdc2Z)cci)2jdJhSodfS%Mf)4/"f_!hsgA9Q7
+eBZ7X`PKI/^;IadW268aT9tq2Q'72cNf&XIZELC4X/E"pIsIj'W4f*rHZ5^9EaVd9DL"ioI#!SO
+:JZIkMN3piSXrSP:/=hf;PBq`VMpRrOd2E+SXc:CTqnNaY-4q/Y5YWVs8A2HPN^*b`rMk5U\gke
+V>d@kVq_7L_>:tC_>_7M^[o/^Vl$;eUnjc[TqS-PT:VXFS=?":R@'A.QBd`"PEM)kOT(:FNfB!V
+Mi3JlM#rKgL]3&.L&Qc%KD:&pKE$W)L&HaALPUbCM2I1KN/WaVO,oBbP*2#nQ'Rc(R$sM6S=Z=E
+TqS3VUo(&gWN*##Xfen4ZEppH[^`lZ]=bhl^VRe)`5Ta;aND]Mc-FY_dF6Uqf%8R-g=tE=hV[8L
+ioB([jlYail07L!m-O--rpKmWnc&(\oCV\So`Fj]p\jmeq>^<gqu-HkrUTr=s.fUE~>
+JcC<$JcFX-o`"gfrqu]ks8)ckrV-Hgp@eLY0D+l,o'u5<n*]T0m-Es$ki_*jjQ#7Yi8<AHgY1?4
+f@AC!dEp1`bK@oHR[]e;Sc52bT:hjLT:hkOU&:S`TDP5ZSc>8]Sb$[pD>A#ED#fh"Q2d-MQ2$[@
+O7nUsNVRJfD]46p6?7?r@:<\\C2Is3Fa&1\J:`H0MN*a\P4t(=P5^U:OT1@DNfT6]qiCH4p6#!/
+rfQ<(qN:c?r/po?rfd;D!0d8B!0d5Cop,39rKmMNrKmPOpR1uIs-`nUrgWeTs./_Prh'4`q4Re_
+rhBIhrM04brMBLhA>,Q`R$X##OH5E[K7JDuH['XQDf9H,B52*lAVl+nJU`)rH"^`;N.$M/F(AO!
+Am._h4]5KL<F03L5t4:O@qfe!FE`!u7n#pB91XGYIXZ-ODK0Z=Fa/.WH@(*jJ:W9'K7j/Vrm1Sj
+s3^hormUnsrmh#!s4@;'!nl;]rnRM0s5<q9s5F%=rG_OMq/H@Pr,D\&qNgZ<qj%5VrhK@ds/#^l
+rhnNNlB1b$rK/5#VPU,bUnaZXTqJ'NSt;LCS"#k7R$a5+Q'IStP*1rhrf78DNJrgSMi.Lj!f2Ve
+reCH,re1-#pk&?ps+LE+rJ#*CLkpnEMMd=NN/`jYO-#KeP*;,qQC!u+R[]e:St;RJTq\?YVPgAl
+WiN5'Y->.9Za@0L\@K2_]Y2(p_8=+.`Q$!?b0/#RcHjnce'uq!f@\d1gYCWAhr*GPj5]4^k3(sm
+l0@U$m-X6?mfDqJrpg-^o^r.U!quB_rV6Egs8)WirVZWmo)=4?U]5i~>
+JcC<$JcFX-o`"gfrqu]ks8)ckrV-Hgp@eLY/+iH(o'u5<n*]T0m-Es$ki_*jjQ#7Yi8<AHgY1?4
+f@AC!dEp1`bK@oH;Z0Jj;Z'Di;?0Sj;#aAn:f%$bs%r\j!`2`kn36;(rD*,`r_WMmfi7l6q`t'D
+),`df5!_@p4[2(n5!VA$6q0R97S?BJ:JO[U:]=,h9`Rld:&[of:&.KY:&.Q`:B4/A:\%?^;#jGg
+:]=/j:]=)g:B+,g:]OAl;#F,W;#X;l;#X5j;"mfi;Gg:h;YErf;Z9Vn;?0Sm;?0Ye;Z9Vl<<#qu
+<;'>i<WZ9%<W5tt<<uN$;,9t]9M.eR6iTLQ56!YM3BB)W2)I0J1,Ahq-UBsY3B9;g5X7Fo3]AuU
+2(pL')^d$g/M&S43AEBJ1c@<U4[;>#2?#QF3^#Gq9M%c?5X.V'6pa<@7gMXW8kVcM9he=\:&f23
+EW1"XF8g:]FoQUbFoHR_GQ)meHiAHlIfFltJGh\,4oIS<4mZ/B;ZNQkU\gkeV>d@kVZ=.([fO"L
+r4)d;rji0C]Y4<Ys1\TM_>_:W_ns=._o'F2`V`d0<W6%t<VBDj<?S3:V59u`US=HUTV.pKSt2C@
+S!ob4R$X,(Q'@JqP*(k*Ns:W(N/W[QMZ/G6LkgcbLAuu,K_g>rK)1-"K`?c)L22R#Ll$tGMMmFP
+NK0'\OHG]hPE_>uQ^F//S"#q>StD^MU84T^Vl6SpX/rG+YctF>['mEQ\[oDc]t_=u_Sa=2`lQ6D
+bKS5VcdC.heCE.%f\,!5gtgiEi8EVTj5f=akNM0plKdg'mI'uB!V#XYncJFTo`"Lbp@n=[q#C0i
+qYU0gr;HTbrdk*Es*t~>
+JcC<$JcFX-o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nhBV'n*f]3m-Es$l0.9ljl>C[i8<DIgtLH6
+f@AC"dEp1abfe,LdF6\!g"Y9:h;@,gi:c+1i8=Oj!SuQ0gA]h-g=uUdrf$i9oo/F#!Q)bR`;[aU
+`rF$T`r!77[d^d+\GWf<[ZHQ2rf6u=!g#]6rB_6]R?r&?I=$['NK'!_Q^FA;U8b<%\FmK5]`5V@
+])TAB]_f>7]`,VE]`#GC]Y"0SoXb+7pq-10!P>r8]DfJ>]`>eE^])%I^Au(C_#_?drkSNLrke]Q
+r5AQQs2P)Z!Q`=\`W4'S`r=!ZaN=>%rQ5)^!6b;arltGd!mT$9ps8rd!7Ceos3h&!e^jZMs4Hts
+s4[J,9%hS6a2Z$8_7de)Xf&%kTq7gAQ'RMmN/EUQLki:=XKAM'WgJ-WW5Q0HS!8#YQ[<L4>\\XY
+E.!G!8l&90ItW]>Pae/69iFhar_sh7U8FiINfK3aR$sP7SXuIJV5LAtXf\e2Yck7]rrA5[PkgLC
+P4b%#aSj0YUAgqcV#R:jVZ*LKs7jG/_"khF_#M1B^Ak,2V?E`kUna[`Td6;'St;LCS"#k7R$a5+
+Q'IStP*1rhO,o<\NJrgSMMd7ILkpibLAuu,K_g>sK)('!K`?c*LB!#/M#N53MMqImCQ4@8O-#Ke
+P*D5sQC!u,R[]h<St;UKU8+N\VPgAmWiN8(YHY:;ZaI6N\@K2`]Y;.r_8=+/`Q-'Ab0/#ScHste
+e'uq!f@\d1gYCWAhr*JQj5]7`k3(sml0@U$m-X60n*ol;o()DDo`"O`pAamdq#:*hqYU0hr;?Nb
+rdk*Es*t~>
+JcC<$JcFX-o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_ng3hqn*f]3m-Es$l0.9ljl>C[i8<DIgtLH6
+f@AC"dEp1abfe,LrgO(]SY)LFTDP;TU&:P`TD>&ZSY#dqn8/&?pMBkHs-3DGs-E\Mqj-c4if*qs
+qelCO!cUFkrB_6>G^*V*AS5^oEH?5FH$XphK7nu;O8"b:P5^U:O9L]*NfT3\qN(B4rfI2DqN:?1
+!0R8B!0?B+qN:c?r/po?rfd;DplkN<op,39s-EbRQi<BMQhHjGR/`TRRf8fRS,f,VScGDZT)PA^
+T_Y;]UAptgV#@(aV#I1qU7Id@QBd\srf0'pJq&/oG^"7LE,KH*BP;*lA;5eiJ:;ooF_5-5OG&(+
+E*dI#>Z!7F:L-4c?"@Y87n-cn@qfe!F*2a,7i4]i9hn<.IXc0ODJsN:G'A1VH?ssfIY!(LKE$Z*
+KE0<sci2;jdJhSoe,Ikrec45"f*9m\g"P39h#?11i;V[:io=qSE;4AKE;OSQQhQg:Qi36LUAgqc
+V#R:jVZ*LKs5oI=OT(CBVuNUsV50o^UAgi3TV%gISXc1=R[KP1Q^3o%P`q8nOcYWbNfB$WN/NRN
+M2@%EL])u-L&Qc%KDC,pKE$W)L&Qi,LB*/0M#iKlretWPNfT6_OckllQ'IZ%R$jD4S=Q7CTV8*T
+UnsrdW2ckuXf\e2Z*L^D[^WcW]"G\i^VI\&_o9U8aN;TJbg+M\dF-Lne^i@)g"P39h;7&IiSrnX
+jlY^gkiq?slg4!*mdKW6naZ2@oCMVRp&Facp\sseq>^<gqu6NkrU^#>s.fUE~>
+JcC<$JcFX-o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_ng<nrn*f]3m-Es$l0.9ljl>C[i8<DIgtLH6
+f@AC"dEp1abfe,L;Z0Jj;Z'Dg;Ys;i;#sKhr_<Ghr_N\m:d72054q)::ARc`:]OJm<S(4M5P[SE
+62a+a5!V@q5!D+m5!VA"6UO=37nH<G:%qE`:Amuf:&n#f9`Iid:&n#d9E7fd9_qKY:B+,i:=i;4
+;#X>l;#=&f:]sQh9heC^:\dib:[V'Y;#jGl:\R`d;ZBSo;Y<le;Z9Vj;Z0Pe;Z9Vo<!$'!<:a,f
+<rQ,!<!#uq;>sAk9)h?`6UX:-55mYW3]T5Y2`*?L1bg^P69mh!4#f8"59E6V3]K&V2DZj0)^6U^
+/hA\53&*6I1Gq'M4?Yqr6oY**+ZhhN4\JF<5X7V"6UX=06q9^;7n?3D8PDiP:/4MXDfB[oEW1"Y
+F8g:\FoHObGBWt0s*4Qh!d]3?rd=frIK"ZsIt9`[557;;55[S/<;9DkUAgqcV#R:jVZ*Ip[^WaE
+\Gs#>\@9!H\cTOX^&G_J^VI\%qSN9Ms2=h9rDi_ooi:cdr`/urs/#pqUnjc[rh1U1T:VXFS=?":
+R@'A.QBd`"PEM)kOH5H_NK&mUMi*CKM26tCrJ(?+re1-#q1AEps+LE+reCH.!/UW2!K)g7N,+E5
+O,oBbP*2&pQ'Rc(R@9V8SXuFGTq\<XV5C/hWiE,%Xfnt6ZEpsI\%&u[]Y(tn^qmn*`Pom=ai_fN
+cHaeadaQ^rf%8R-g=tE=hV[8MioB(\k2tjjl07L!m-O--n*fc9nac8BoCW%Ts7ZKerqQKgs8)Wi
+rqu]moDX=@U]5i~>
+JcC<$JcFX-oD\^erqu]ks8)ckrV/JKp@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Xi83;FgY1<3
+f$r0sdEg+^bK8&Ve(*+(g=tE=hV[5hi;)=<i8NVPhqm5GgtVh^rS%C2Mi@Om!0$l9p5Ja*"H8>"
+_ScAkqSi<Nq7#k%laQo&!jf8?rf?qBrB_6ZQ^Do<H@1@"M2dRXQ'[r3TVecp[J.<3]E#S@\cTLV
+]_f>7]`,SE]_oAB]Y"0Sl+?W"p:L@;s1A9CqRlmCr4i6HrP&?Jp;$jH^VIY`_>_=O_u.IO`W*sV
+a8a0Za8![Q`rX9'r6"u[s2t5_rltJes3:Shps8rdrR1_p"4YlPf)4,"f_!ksg1oBjbK.]A_8="&
+^pp>@UnXNRR['2%P)tW[N/E@DZ)t1/VlZhHHD7sL^8.'?LQI($='9!X95Jp/N(HfAH%:O*O-?!#
+T:SeS:/Fni;c99bVN$UqNf]NoR[fk<St;aSW2m,(Y-+t4Yg`XPP5gaGPkgOCP51=Aal:ACa.]4+
+UAq"dV#R:jVZ!FKs7O2._"tnG_#(nA^Ab#6VPU)aUS@a])5*UnSt2C@S!ob4R$X,(Q'@JqP*(ie
+O,f5!Mueiore^Z2!/LN-s+UK+q1JNqq1J^#re:?+s+^T1reYBIMi<USNfT6_OcklkPa.N#R$a;1
+S"-%@T:hmPUSO`aVl?\rXKAY/Yd(O@[C3QT\\#Mf^;%J#_SjF5a2lBGbK\>Yd*^:keCE1&f\5'7
+h;-rGi8N\UjQ5OdkNM0plKdg'mI'H3nF?MK!qZ'Vrq6<b!;HHes7uZjqtpBjr;H6dJcDPGJ,~>
+JcC<$JcFX-oD\^erqu]ks8)ckrV/8Ep@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Xi83;FgY1<3
+f$r0sdEg+^bK60@S"#q=T)PAYT_Y8^TV;@X!hZ-Xpn%4qnne5@q/$(qpQbT@n;cIe!fN"qrbhU!
+rB_6>GBRA'@qTOnDK9f@G^=dgJqSr;N;8S9P5^U:O8t@>Nr"h2OT(@BP5:=/OT1C,OSY+=P5LI?
+P5^[DP5(7:PkLC7Q33J@R$[c=rg*VPp6kiG!1EhTrgWeT!1itX!2'.[rLa+_pn7\^rhBIhrhK:b
+9;S;OR[08'P)bT`MM$D-H?j^WFDl&6CM@BnBOtY,K7\T%I!TF:I>NB/H#dD/CLL%*6;(NJ<*WsJ
+5t=CN@:X(gE,p&GGt(:n7fH+!8UGo8D/O3.E,p&DH$FU\H[U?mJ:W?*K`6Z*c2Q#fci2;kdJhSn
+e,Iksec+/!fDjP(gCW/rh;7&Hi8ESQio9!9DJsImE;4ALE;jeQQhHa8QNEJHU&LedU\pqfV>d@j
+VqqC5Oo(7>OoD6^VPU)aUS@a])5*UnSt2C@S!ob4R$X,(Q'@JqP*(ieO,f5!Mueiore^Z2!/LN-
+s+UK+q1JNqq1J^#re:?+s+^T1reYBIMi<USNfT6_OcklkPa.N#R$a;1S"-%@T:hmPUSO`aVl?\r
+XKAY/Yd(O@[C3QT\\#Mf^;%J#_SjF5a2lBGbK\>Yd*^:keCE1&f\5'7h;-rGi8N\UjQ5OdkNM0p
+lKdg'mI'H3nF?MK!qZ'Vrq6<b!;HHes7uZjqtpBjr;H6dJcDPGJ,~>
+JcC<$JcFX-oD\^erqu]ks8)ckrV/,Ap@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Xi83;FgY1<3
+f$r0sdEg+^bK3UZ;Z0Jj;Z'Dh;?0Sk;#aAr:esk^:/Cgb!^/_2rBKO1qE=aOqG6rarD`_qg/J2R
+<)Zaqr]p?HrB^`O5X%:n4$>h-4odkI6j?+P7nH?I9_qNb:Amuf:&n#f9`Iid:&n#d9EIp^9_hEX
+:B+,h:B"#h:>AY9;#X>l;#=&f:]sQh9heC^:\dib:[V'Y;$0Wj:Jgd_r_i>b!)iboqGR8johtcf
+r_s&$<)cjt<qTJl<rQ)]<`;mm9i"GU84Q$86pj.#4?GVc3'0#V1c%!F0f26b5X.@m3^5en5<M+i
+2`ETL/gVP],qU]!0K(pF2#]?U2E<l_5!VJ%2`WiW4$5\h8kV]@69mb%6pa7.7Rp!>84`_P##%`b
+9hnH$rbqgUrc.pXrcA'\rcS6aqfi'bs*=`nI!km@rdG'$J:]mG4[&d.pc\F:k>_7Us.TFds.fLf
+s/#^lrMTY(s0`*?[^NZT\c0/M]=bhj^:q@u^qmk(_8=%e_Z%IN<rH%n<:s8g<;onsVZiroUnjc[
+rh14&T:VXFS=?":R@'A.QBd`"PEM)kOH5H_NW+k;Mi.Ljs+gZ1rJ(?+s+L3#qL\Nqs+LB*reCH.
+!/UW2C5Rq.N/`jYO-#KeP*;,qQ'[l*R@9V8SXuIHTq\<XV5L5jWiE/&Y-5(7Za7'J\%0&]]Y2%o
+^r!t,`Q#s>aihlPcHjkbdaZdsf@S[/g>(N?hVd>NioB+]k2tjjl07L!m-O--n*fc9rpg-^o^r.U
+s7QHerV6EgrqcNhrqu]moDX=@V#Pr~>
+JcC<$JcFU,o`"gfrquZjs8)ckrqQNf!;?Eb2>$M2o'u8>n*fZ1m-Es$ki_*jjQ#7Yi8<AHgY1?4
+f%&9udEg+_bKA,Vdact&g=tE=hV[5hi:u:2i;VU9hVHuArn@D,s,$c3"Gr"nMi7=hoo/[*"Mqsm
+`5MMkq8WHCe[PLc"gt_BZE^S262NtaNL4U)FaAFeK8>MJOHGltT:r$WY-b_:])fRVrOi0BrOW$@
+rk/3Aot::;!5/9Brk/6Ake$Q"p:L16qRlmCr4i6HrP&?Jp;-^CrPAKMs24cQr5AZUrQ"rXrl=iS
+rPnr[ao'<[aoBN\bl5lebQ?&7cM,ZaciDJmdf7bueCE.$r7Cu$p"=*/ccF/F_o'7&`58[RV5'`W
+SX5V,OcYT]LP^nCYcb+/WMlbbI!2R+[&f^[F,uE3?WBU:7qm*tN(ZrBH%1I)Ng-!$T:JbR:/Fqi
+;cA@DVPfE6NK0'bR[BS6SXuFIV5L>sY-"k0YcuOTrK?l<rf[2Cr5n!?rLs7crhKFfs/#amr20On
+hZ*VmpVHmFqn`0FqnN$B!3#mp-`3`9UnaZXTqJ$LSt2C@S!ob4R$X,(Q'@JqP*(ifO,o<\N/W[Q
+MZ/G6LkgcbLAlo,K_^8tK(suuK`?c)L22R#Ll$tGMi3OQNK0'\OHG]hPE_>uQ^F//S"#q>StD^M
+U84T^Vl6SpX/rG+YctF>['d?O\[f>b]t_=u_Sa=2`lQ6DbKS5VcdC.geC<($f@em4gtgfDi8ESS
+j5f=ak32'olKdg'mI'uB!V#XYncJFTo`"Lbp@n=[q#C0iqYU0gr;HTbrdk*Gs*t~>
+JcC<$JcFU,o`"gfrquZjs8)ckrqQNf!;?Eb0D+l,o'u8>n*fZ1m-Es$ki_*jjQ#7Yi8<AHgY1?4
+f%&9udEg+_bK?6AS"-">T)PAYT_P5\TECgZT:bqNrG)CLp1sM@!,_RKq/$+Jrfm2CqN_,Hr/Uf:
+rJp]7rJp$"!K;s9M#`>062NtaE-PPo?t3h_Bl%d0F*;hUIXm')LPq5kOTL].OnFh9O8Y+6O8+h:
+OoCO@Om\>1O6_o(OoCOAOo1CAPPp[>PPLI<Q1L=AQi<?PQi<BPQiEHHRJ`EPRJrZSS,8`TSb/NQ
+TDtSZU&UkeUB%+hU\giVTU_I<QBdVpNfK*SJ:DrmH$+1JE,KK+BOtdgAVPkjJUW#pG@tH:N.ZS%
+E*mEr?Um=E<]j5]@qe4u7U9G5C2@j1FEr*/7N,#q91ioGIXc3PD/O93FEMhQH@'scIXZiuK)UE&
+L&T<qcMl/hd/MGldK.hFrm^qts475%&_Pdig=tB;h;-uGi8ESQio9"sDZ+MQE;FMODuahPQiEB8
+Qi3WXUAgqdV#R:kVYm=lW8@RSP4t+=ORJ>/O8u6YV^J@<Unjc[TqS-OSt;LCS"#k7R$a5+Q'ISt
+P*1rhOH5H_NJrgSMi.Lj!f2VereCE+s+L3#qh"Tqs+LE+rJ#*CLkpnEMMmCON/`jYO-#KeP*;,q
+QC!u+R[]e:St;RJTq\?YVPgAlWiN5'Y->.9Za@-K\%0&]]Y2(p_8=+.`Q$!?b0/#RcHjncdaZdt
+f@S^0gYCW@hr*GOj5]4^k2tmll0@U$m-X6?mfDqJrpg-^o^r.U!quB_rV6Egs8)WirVZWmo)=4?
+V>l&~>
+JcC<$JcFU,o`"gfrquZjs8)ckrqQNf!;?Eb..m-%o'u8>n*fZ1m-Es$ki_*jjQ#7Yi8<AHgY1?4
+f%&9udEg+_bKBZYr)3GiqGI;jr)!Djs%rYis%r_Zr]U3Dr]fO/!'U3SqbR&b!)NGjqc2NQpf%,W
+qa)#Z5W(Vc4$>en5!M:u6UO@384Q9F:&Ice:B"&g:B+&f9E7fd:B+&d9EIp^9_hEY:B"&f:B+,i
+:>J_:;#X>l;#=&f:]sQh9heC^:\dib:[V'Y;>j>c;>sJb;#jMm;u0Dl;Z]os;tX&f;u]et<E/rt
+!*8bmr`0P0;c-=e:eseZ7n,m65sIR44T@DQ2`WcP2)@'F1.";p5s@Cl3W22r4utY^2)R*@+<;g[
+.4Qu-3&!6K1Gq'O4$>bm6p`gl3&s,`4ZPu*91V<65X.P&r^-iX7n6*?8H)6]9`Iie:B,,1D>nJR
+E;aeUErU4[FT-F^Focf1rceBe!dT*<rd5!"I!pElIXcm"rB1$Ar]^0Ar''4AqG[?ds.]LfrM9Ii
+s/,^l"K8f<[^H+Cs0rBG]"5Mc]Y2%o^])"P_8*n&_86#c"N+;B<`]0!rD`eqqc*5gqc!Qorhh-@
+V50o^U7n9RT:VXFS=?":R@'A.QBd`"PEM)kOH>NaNfB!VMi3JlM#rKgL]3&-L&Zi%KDU8qKE$W)
+L&HaALPUbCM2I4LN/WaVO,oBbP*2#nQ'Rc(R$sM6S=Z=ETqS3VUo(&gWN*##Xfen4ZEppG[^WfX
+]=bhl^VRe)`5Ta;aND]Mc-FY_dF-Oof%8O,g=tE=h;@/KiT&tZjlY^hl07L!m-O--rpKmWnc&(\
+oCV\So`Fj]p\jmeq>^<gqu-HkrUTr=s/#aG~>
+JcC<$JcFU,oD\^erqu]ks8)ckrqQNf!;?Eb2Y?V4o()>?n*f]3m-O$%l0.9ljl>C[i8<DIgtLH6
+f@AC"dEp1`bKJ/VdF6_#g=tE<h;7&HrS[M1s5<k5!oDbfrS%(("GhnlMi7Rnq2P*,qi(`o_8=./
+q8N-Kq6o1iqR6F1s02X0YH\#/q*GgbDf^&FH@CF"MN3dZQ'e&5TVecq[f3o9]`5VB])TDA]`#J8
+]`#PB]DfGE]=PT9]D/u9]DoPA]DB/@]tXEX!5ABGrkSKI!5S<ErP8BJrkeZPrP\WQs2P)Zrl4rX
+q8WBR!Q`C[b5KE_b00\+qoo,dp<Wcc!7Ceos3h)"e^`7KfDjM$g&K_)fkf*]b/VE<_SWst^q$GB
+USFKSR?j)#P)tWZL5:\@ZELC3W2HS`I!2O*[]>j\Ef>iu=]f$V95Jp0MFgT=I=[05OdMW1Sk`'V
+:fLFm;k]t`VN$UqNf]HjR[fn>SXuFIV5L>rYH4k/YHY7XrrA2ZP5(7=P5g^Gb506Aa8hn2U&Uke
+U]%"gV>mFkVuN^Qs8Bh0_>M+K_>1nC^\tnHW;ib9VPU)aUS=HUTV%gISXc1=R[KP1Q^3o%P`q8n
+Oc]R'#*+\%N/NRNreU]4LPPk`s+UH*q1JQrq1J["s+UH,s+^T1reYTOMi<USNK0'\OHG]iPa.N"
+Q^F20S"-%@StMdOUSO``Vl6SpX0&M-Yd(L?['mEQ\[oDc]t_A!_Sa@3a2lBFbKS8Wd*^7ieCE.%
+f\,!5gtgiEi8N\Uj5f@bkNM0plKdg'mI'H3nF5u=o(2JFrq6<bs7cKes7u]kqtpBjr;H3cJcDVI
+J,~>
+JcC<$JcFU,oD\^erqu]ks8)ckrqQNf!;?Eb0_Fu.o()>?n*f]3m-O$%l0.9ljl>C[i8<DIgtLH6
+f@AC"dEp1`bKH9@S"#q=SY#hQqOmYXs.K:^qk!1jnne2?!gAk5pQbWArg!)8qiC]9k`,V#reUc5
+Lkgb>q*H$E=C>NGAS,UmDK0`>GC"^gJV/c9NKK?dP*(n"OT1C?Nqe\2OT(CAP5CC0OSk1,OSY+=
+P5LI?P5^[DP5(7:Pk^O7Q2m9NQiNKPR/`NQR.ZmGR/`TRRf8fRSH#/WScGD[T)PA^T_P5\UAptg
+V#@(gUhQHjR[9;(P`h)fNer@;IsZHbG&qS>ChdTqAS,RdLP1;2IscWeB4QONK77r]?>F.W6psUL
+5u_-#BL,*W?XdV`DK0cDG=G(k7ncWL8UPo7IVit>DK'T:G'8+TH$ajbIXZiuJ:`E,re1?qrlbAe
+rm(Mhrm:\mr6kSn!n>cNrmhD-f\"m2gY:N>h>Z=3i;_d9iW3t:rbhdSr,;OQr,;USpQtiEl^%UE
+r1X.bs.fOgs/#amrMT[ohuEY<plYK9mudU2s/>sq*N#[/UnaZXTqJ$LSt2C@S!ob4R$X,(Q'@Jq
+P*(k*Ns:W(N/W[PMZ/G6LkgcbLAuu,K_^8tK)(&uK`?c*LB!#/M#N6MMMmFPNK&sZO-#KePE_>t
+QC!u,R[]h<St;UKU8+N\VPgAlWiN8(YHY:;Za@0L\@K2_]Y2(q_8=+/`Q-'Ab0/#ScHstde'uq!
+f@\d1gYCWAhr*JQj5]4_k3(sml0@U$m-X60n*oi:o()DDo`"O`pAamcq#C0iqYU0hr;?Nardk*H
+s*t~>
+JcC<$JcFU,oD\^erqu]ks8)ckrqQNf!;?Eb..m-&o()>?n*f]3m-O$%l0.9ljl>C[i8<DIgtLH6
+f@AC"dEp1`bKK]Yr)3JjqGI;jqb[;is%rYiqEOa=!'f^3!)NMfqG6ub!`)QcdT$*B!)ibo!)iVZ
+(-j]<4$5Vg5<V1o5XRq-84c9B92%rRr_EJhr_EJfrCm2cs%W;_q+^i`!)NPgr_NGe!)NShhG<]=
+r_`\lqbR2f"A_ce9ht[`qb[,bm83g[rD<5cr_iAcs&/eoq,.;n<)cfh;Z9Vp<;]br<r#bq<$t[H
+;Gg4c:/4JU84Q'96U="#4?bhf3&rrW2Dd3G2D@Kb6U*du3][1)4[D7m3&W]P0J"7f,:tQ!0JkaD
+2)I-J3''2e5XIgs3B/u[4$>Pr9M7oA5X.J#6pj@06UjR984Q3C9M8%X9F"9e:2=W]D/T>ks)@sW
+rc8!ZrcJ-^s)nHfG'<k/"*f*;HN&:!I=-HkIXZcsJNQ*o4T%A@55[SD53,]>;ZNKgU&UkeU]%"g
+V>mFkVuN^o[0j@O\%&rY]"5Md^AbkL^;%IurP8HLs2+fPs2+_9s&T,!rD`\nqc*Mos&Akqr`&or
+s/-m7V50o^U7n9RT:VXFS=?":R@'A.QBd`"PEM)kOT(:FNfB!VMi*DkM#rKgL]3&.L&Qc$KDU8r
+KDpQ(L&Qi,LB*/0M/\?1N/WaUNfT6_OckomQ'IZ%R$jD4S=Q7CTV8*TUnsrdW2ZetXf\e2Z*L^C
+[^N]V]">Vg^VI\&_o9U8aN;TJbg+M\dF$Fme^i@)g"P39h;7&IiSrnXjQ>Ufkiq?slg4!*mdKW6
+nF?)?oCMVRp&Facp\jmeq>^<gqu6NkrUTr=s/,gH~>
+JcC<$JcFR+o`"gfrqu]ks8)ckrV/JKp@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;Fg=k32
+f$r0rd*L"]bKS8Zdad"(gYCWAhV[5hi;DO6i;V^8i;MO6hVA+aqhY**",MekMu/J4N<"q8NV\V5
+N<R,6_Sa=1qSi3Ks0qa2pUBq-q7$.-$+7.JZEUO8YHP,.XSY=#6YgLVF*;nZJV8l@OHGZmS"H@N
+VQR;8qRlj?rjr-As1J9Ap:U=:!5/<Crk/9C!4q:(q7?O:rOi-AqRcgAr4W3F^APbF_#;"J_"PVC
+_#;+K_Z%IO`;IUR`W4'Y`r=$R`r=!ZaN=>%rQ,)_bPTN\c1TE_ciDJmdK@tJeCFQLr7Cu$rRhA,
+d`]eP_u@OQ]`5cCXJhtkTq@d?Q]dGjNJWCDLP^bhXf\\&V5pJBGbW*RZ(@5(M3;Fa<Ch7*C3bPl
+8l/93K8GYRR[Tjk:/4Vc<)QYgUSarLNf]6]Q'Rl/rgj(\"JVZgW2op"s/u@*cN!m+s-!,?#F(F:
+PEV0Pb4j$AaSqk2U&UkeU]%"gV>mFkVuN[qWSmgT_YM%D^];4I_#(nF^Ak/XW2HPjV50o^U7n9R
+T:VXFS=?":R@'A.QBd`"PEM)kOH5H_NW+k;Mi.Lj!f2VerJ(?+s+L3#qL\Nqs+LE+rJ#KNLkpnE
+MMd=NN/`jYO-#KeP*;,qQ'[l*R@9V8SXuIHTq\<XV5L5iWiE/&Y-5(7Za7'J\%&u[]Y(tn^qmn*
+`Q#s>aihlPcHaeadaQ^rf%8R.g=tH>hV[8MioB+]k2tjjl07L!m-O--n*fc9nac8BoCW%Ts7QHe
+rV6Bfs8)Wirqu]moDX=@VZ2/~>
+JcC<$JcFR+o`"gfrqu]ks8)ckrV/;Fp@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;Fg=k32
+f$r0rd*L"]Q^F20S"-%@T:bkNq4[h]r1EqZk\Kd+rbVY!rfm2CqNh,Gs,Z6$nW!R-$]Bt$M26qC
+LPCM:K_n(S6WR;l?smJVBP_R+F*2\QI"$X#KntYIP*(n"O8t@>Nq\V2OT(CAP5CC0OSb+;O8tF7
+OSY+=P5LI?P5^[DP5(79PkgU8Q2m9NQiNKPQiNKOR.csHR/`TRRf8fRSGo)WScGD[T)P>^T_>&Z
+UAgp&Una]VS=5b/Pa%>kO,f0QIt)ilG]\"HDf'6'An>LaB4Q[KK7JH"I<oR;I?/f-G&Ui(CJdhl
+4]apI>[qJ67RgcqBP_X.Fa.4_7Rg*H8kFDXIXc3PDJa<2F*;_OGBnL\I"$QpJ:W=OKDpT'b6#o4
+c2Q#fci2;jdJVGle,Insf)OA8g"P07gt^cChr!AMiSieVDJsIjE;a_PE;skMQi!*9Qi<ZVU&Uke
+U]%"gV>mFkVuN[qWSmgTP5179OR\J5OT2:*W2HPjV50o^U7n9RT:VXFS=?":R@'A.QBd`"PEM)k
+OH5H_NW+k;Mi.Lj!f2VerJ(?+s+L3#qL\Nqs+LE+rJ#KNLkpnEMMd=NN/`jYO-#KeP*;,qQ'[l*
+R@9V8SXuIHTq\<XV5L5iWiE/&Y-5(7Za7'J\%&u[]Y(tn^qmn*`Q#s>aihlPcHaeadaQ^rf%8R.
+g=tH>hV[8MioB+]k2tjjl07L!m-O--n*fc9nac8BoCW%Ts7QHerV6Bfs8)Wirqu]moDX=@VZ2/~>
+JcC<$JcFR+o`"gfrqu]ks8)ckrV.u=p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;Fg=k32
+f$r0rd*L"];#*ud;Z0Jg;?0Sk;#aAm;#X8h5kdM)4oeCU:A[i`:]aEf:=<,>;uKVo;uT\l65i3K
+1bq-T4Zu"n5!VD#6pjF47S$-C9h\;X:]=)h:&I]a:&n#`9_qK_:B"&g:B"&`:>\k<;#X>l;#=&f
+:]sQh9heC^:]=2a:[V'Z;>a8b;?'Pd;>sJm;u'>j;ufki;Z9Vp<;fhr<r#a2<)QUj:JX_Z91_]B
+6UF()5<V(g3]T2Y2D[0G1GUdB5sn"(5<M"f5<_>"4?PV`2Dd0@+rr$^/h/M23&*<I2)dQ[4[)2#
+4>]&Y5!(kd92%uL5X7P!6UO1.6UX@57Rfs>8P;]J9MA/Sr_<K0CAquLCi0/is)@pVrc8$[rH/'^
+qf`!`"F,3;H@,R;s*XuuIt<1M4T7MD4T%A>56!e*<;TVnT`(SaUAq"eV#R:kVZ!FmVuWgr[JmW@
+\@K2_]=bhk^](qJ^V9]^s1nZN!5e`O!Q)eR=8l5#<W,nm;u0Gn<W#hq<W?%uW?eF?Vl$;dUnaZX
+TqJ$LSt2C@S!ob4R$X,(Q'@JqP*(ieO,f5!MueioreU]4LPPh_s+UK+q1JNqq1J^#s+UE+G)(m0
+M2@+IMi<USNfT6_OcklkPa.N#R$a;1S"-%@T:hmPUSO`aVl6VqXKAY/Yd(O@[C3QS\[oGd^;%J"
+_Sa@4a2lBGbK\>Xd*^:jeCE.%f\5'6h;-rFi8N\UjQ5OdkNM0plKdg'mI'H3nF?&>o(2JFrq6<b
+!;HHerqZTjqtpBjr;H6dJcDVIJ,~>
+JcC<$JcFR+o`"gfrVZTjs8)ckrqQNf!;?Eb2Y?V3o'u8>n*fZ1m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f$r3tdEg+^bKJ/VdF?e$gYCW@hVR/Iro!_5qV_>0!SuQ&M#<)3Ll$tGqMbE5s,?l8rJ^cl"2Vjl
+`;.CG`qm1@[f!W7\Gs&9\G<W.[f3]6Zi@97Xfee/XK8K#6N9ChBPhU-FEr1_Jqo>IP*20#SY2XQ
+VlmA8rOi*@"M24W]Y+0Sp:U=:s1JBDrk/9C!4q:(q7?O:o=P(:qS)mBrkSKI!5S<ErP8HLqniBN
+r5AQQrl4uYs2P&Ypr<9Q!Q`C\b5KE_b00\+qp"cZ!mo?BrmLhr!7h)"r7Cu$s4J==b0.c@_83n"
+]"c(bWMQ>`T:;45PECl`MMV7c4c$;EX/`(rWMl85FelOJ];1a=K:Qgu5AP+-Bm,)e8l&?3JVT8L
+R[]pH:ejhd<)HPeUo(#LNK0*bQ'n-?SHYUZV5C5mriQ4'!3cC+bl@^)rfR5DpQPT@rQ=iUlH'!t
+rh04`!huHbrM9Iis/,dns/>ss!35&YrPJBHn\G"9rk9GRWMuhoVl$;dUnaZXTqJ$LSt2C@S!ob4
+R$X,(Q';31$B^F2O,f3YN/NUOreU]4LPPk`s+UH*q1JNqq1J^#s+UE+!JcL1M//!,Mi<USNfT6_
+OcklkPa.Q$R$a;2S"-(AT:qsQUnjibVl?\sXKAY0Yd1UB[C3QT\\#Mf^;%J#_SjF5a2lBGbK\>Y
+d*^:keCE1&g"P08h;-uHi8N\UjQ5OdkNM0qlg4!*mI'H3nF?MK!qZ'Vrq-?dp\4X]s7uZjr;6Hj
+rVc<dJcDYJJ,~>
+JcC<$JcFR+o`"gfrVZTjs8)ckrqQNf!;?Eb0_Fu-o'u8>n*fZ1m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f$r3tdEg+^Q^=)-R[fn=StGbMq4[e\qk)tcs(h[PoPFPkrfm2Cqj%5IrKd;@k`5=q!K<$;N;eb8
+M>`50K`Hf(6N9Ch<``C1@:Ee\Bl.d/F`r%VIt3'&KSbSIooK07r/UN4qN1]=rf[/@mZ@7*n<!L/
+rf[2Ar0%&CrK?r>pltT>ns09Brg3\Pq3_,Ks-W_Pr0RJPrgNhUqjdYVr13n\qO[\Yp7_M\s.^L'
+S=,Y,PEV,iNK&mOJ:;omH$=@ME,BB*B4h-R5A#V&Jq8E"I<p*L@Xa,`L3[cKBQ7*Q1Jh%6;-.4A
+6:XIO@qTUsEclUt84H'C9h@p(I"$N^D/O93F*2VLH2`*oI"$QqJ:`CPKDgN'b5TQabl5ldcMl/h
+d/VMndK%\odL=USeCE+#f%8R,g"P0Zh#H71huDU;iSrm7D>nGKDuahRE:fLmQLL7@TDkM^T`Us`
+U]%"gV>mFlVuN^qW;rsXs8A,VOnFh/OoLLaWi;trVl-DgUnjc[TqS-OSt;LCS"#k7R$a5+Q'IR4
+Op[>5O,o<\N/W[QMZ/G6LkgcbLAuu,K_^8sK)('!K`?c)L&m'creYEJMi3OQNK0'\OHG]hPE_>u
+Q^F/.S"#q>StD^MU84T]Vl-MoX/rG+YctF>['d?O\[f>b]tV7s_SX71`lH0BbKJ/Ucd:(feC<%#
+f@em3gtgfDi8ESRj5f=ak3(smlKdg'mHs?1n*olHncJFTo`"Lbp@n=[q#C0hqY^6hr;HTbrdk*I
+s*t~>
+JcC<$JcFR+o`"gfrVZTjs8)ckrqQNf!;?Eb..m-%o'u8>n*fZ1m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f$r3tdEg+^:f-sbr)3JjqbmDjqb[8hrB:3GrBU*AlTPG75!Db<qbI#aqb[8fs%q6F!E2tn;uTYp
+;uT\m6N9Cl1,CUF4?Pbl5Wq=s6:4+/84Q-?8kMcN:/4MXr(I2e:/4OZ9_hE^:Amug:B"&_:>eq=
+;#X>l;#=&f:]sQh9heCP:[V'Y;>sDc;>sGp;,C*`;?'Pm;u0Dk<<#nj;Z9Vo<;onr<Xr,/<)lpr
+;,U4c9MJ2Q8H)!V5Su^K5!1ne3&iiR1c$pC1H%Wg69d[u4#o>#5TN0T4ZYM]2)6g4)_*<d.4mA:
+0f1aD2E<l_5!h[or](3H4$5Mr9M.nU5SumU6:4(,7n#m<7n?6F91_fN9h\;X:JP^(CB&&MCi0,h
+s)@sWrc8!ZrcJ-^!HrVbG5lafG^4T6Hi8?lI04qJJ:[V\pHAF<i)KVQs.B:`rLj:eUSId`s/#am
+rhodps/?@*[^NZS\@T8`]=e-Vq7cmDrP8HL!Q)bQ=8l8"<W?%k;tEs0Wi;trVl-DgUnjc[TqS-O
+St;LCS"#k7R$a5+Q'IR4Op[>5O,o<\N/W[QMZ/G6LkgcbLAuu,K_^8sK)('!K`?c)L&m'creYEJ
+Mi3OQNK0'\OHG]hPE_>uQ^F/.S"#q>StD^MU84T]Vl-MoX/rG+YctF>['d?O\[f>b]tV7s_SX71
+`lH0BbKJ/Ucd:(feC<%#f@em3gtgfDi8ESRj5f=ak3(smlKdg'mHs?1n*olHncJFTo`"Lbp@n=[
+q#C0hqY^6hr;HTbrdk*Is*t~>
+JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb0_Fu.o()>?n*f]3m-Es$l0%3kjQ#:Zi8<DIgY1?4
+f@AC!dEp1\b0/&UdF6\"gYD_`s53h6r8IM1rndb5M>W/3M27"Fq2"p)"c/"lMMmDjN;eh7N;nn;
+^]_Kj_o0Lk`V7CO`rO-N\,Ni*\+R3.[K!Q4YQ:o1riH4%XSkKa6Q0ZVE,g#DH[UF!M2m^^PaRu2
+T:r0[Y-POL]_f>@]`#J9]_oJB]`5VD]]$Ku])B84]E#YA^APbF_#;"J_"PVD_#D1I_Z.OO`;[aS
+`rF*Y`rF*S`r3pYaN=>%rlG2`bPTN]blH&^ci;AldJhSoe,\%tf)=34f[@pb_na%&^:_"l^oaT6
+U7n3KR$EhtNf8gML4t;9YHP",W2HPlRs]@PZ)kC5R?NYaQ[F6QDJE`sF+0$@:Jc@fLlROaR\-*F
+:/=kh;H'9aVP]?6NK9?lR@Te;St;[QV5^NpXoGU%Yfm%HOSk7?P4t1>ao9HTamI1LT)YG_T`(Sa
+U&^teV#R7kVZ!FmVuiruWoF'Y_>hCJ_=>>;^](r%Wi;trVl-DgUnjc[TqS-OSt;LCS"#h5R$X,(
+Q'@JqP*(ieO,f6[N/W[PMM[1GLkkq`s+UK+q1JNqq1J["s+UH,s+^T1reUZ5MuJZDNK0'\OHG]h
+Pa.N"Q^F20S"#t?StMdNUSO]_Vl6SpX/rG+YctF>['d?O\[f>b]t_=u_Sa=2`lQ6DbKS5VcdC.h
+eC<($f\,!5gtgiEi8EVTj5f=akNM0plKdg'mI'uB!V#XYncA@SrUg6cp\4X]s7u]kqtp?irVc<d
+JcD\KJ,~>
+JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb-1pg#o()>?n*f]3m-Es$l0%3kjQ#:Zi8<DIgY1?4
+f@AC!dEp2<QO9+JR[]h<StD[KU%tAWU&Ue`T)`]cCB/2MD>J)KPQ$gAQ2$XJQ'R_rNqJJ#NqJD1
+N;ne8M$A`kL51M;L&F@:6Prg+?=72MA7oOkDfTrAGC+^eJ:W?,M2IAiOT1C?NqSP1OT(CBP5170
+OS4b+OSY+=P5LI?P5^[DP4t19PkgU8QN*<OQiNKKR/NHQR/<<MQiNQRRf8fSSGf#XScbOTStGnO
+rh'(]!20:a)krmnR$Eo!P)t]`N/WF?IscNeGB@hDDJNs#AH$(4@YKJeJ:E#pH?X"2I"[$'HZX1A
+BPq-]2c<II:fh%=5t4=O@:s@nEclYO7n6!B9hS'*I"$N]Ci434FEMeOH$XdaIsuotJqAW-K_pH'
+ao9H]bPocccMl/hd/;;jdK7nIeGdu3f%8O+g"P07gt^`BhV[5Ki8NYSrGDRPrbqgUs)IpTnsB-;
+nsBBJs.B=arLs7c!2KLgs.o^mrMT[o!i`3"irB%@s-!2?ooSj/s,\t8WMuhoVl$;dUnaZXTqJ$L
+St2C@S!fY2Q^3o%P`q8nOcYWbNfK*XN/NRNM2@%EL])u-L&Zi%KDL2qKDpQ(L&Qi,LB*/0M#iKl
+ret9FNfT6_OckllQ'IZ%R$jD4S"6.BTV8'SUnjlcW2ZetXKAY0Yd1UB[C3QT\\#Mf^V@V%_o0O6
+aN2NIbg"GZdF$FmeCN7(g"P39h;7&Ii8WeWjQ5Oekiq?slg4!*mf)YUnF?MK!V>s^o`Fj]p\jme
+q>^<gqu-HkrUTr=s/>sJ~>
+JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb..m-&o()>?n*f]3m-Es$l0%3kjQ#:Zi8<DIgY1?4
+f@AC!dEp07:Jgjas&&hqr_i_mqGR5gr_WVlrB:*Cniuq6r]Ts=s%iMeqbR)cs%iSido?3CqGI>k
+;Z/r\6Q%[>3]]Ac4Zu"n5!VD#6pj@26q9d?8k_oQrCm5c!_uHar(I/d9MG:WrD*;es%`SiohOF@
+nkf<_s%rSgr_N_n:/+GXn5&IKr_`Ykp/1fe!`;cjpJLrgrDWSk!)rkrs&8Vhr_reqrDihts&BM+
+;,L+`9MA)O7mfX15lO"J49IZ)2`^jq!AuY30gS,n5s[_"4?5De5<qIu4ZYM[1Ggp?.2jT],q1H%
+3&!6J1H.9R4?l)!75R"b5!1qe92%rL5<qM$6UO1.6UsU:r^d;e8P)TL9hkL\qeH.H!GlWODuXeT
+EW1"YF8^4\FTQ`/FoHOqGBeCYH@(!dH[C-fI=6QoJaP\Y<;]\pT)YG_T`(SaU&^teV#R7kVZ!Fm
+W!KB&Wj]CH\[f<M]DfJC^&,PD^B;9d^qfrd#/aJB='&F'r`/qsnl,6]0rh4PW2HPjV50o^U7n9R
+T:VXFS=?"9R$a5+Q'IStP*1rhO,o<]NJrgSMMd7ILkpibLAuu-K_^8sK)(&uK`?c*LB!#/M#N53
+MMqIm@?$;.O-#KeP*D5sQC!u,R[]e;St;UKTqeEZVPgAlWiN5'Y->.9Za@-K\%0&]]Y2(p_8=+.
+`Q$!?b0/#RcHjnce'umuf@\d1gYCWAhr*GPj5]4^k3(sml0@U$m-X6?mfDqJrpg*]o_nFap@n=[
+q#C0iqYU0gr;HTbrdk*Js*t~>
+JcC<$JcFO*o`"gfrqu]krqZWjrV/AHp@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ij5].Wi83;Fg=b-1
+e^W'qd*BbTbK\>[dact'gYL`CrSRV4qVhA1rnmL-!f2\iregW1s+pH,s,-c5rJ^`8s,?rm!l;ak
+rl"fTq8W<P!QN+W\,Ni8\+$iq\,Wo:[0s@IZ*CL9Xf\b.X/l1cr'M>iO-jp/Fa&.[K8PVLP*;,u
+R[p(FVP^N%\,Er;]`,P;]_fD=]]$Ku])B87]`,V?^APbF_#;%J_"#8<_Z.OO`;[aS`rF*Y`r=$S
+`r3pYaN=>%rQ,2bbKS2RrlkAdrm(5`rm1ksdaHUne^aWLs4;#5b/hH8^VIUr\\Pn[W2?5]T:VO<
+OckidLkUM9KS+u]XK/=tV5^&6FeGS3Z`':TN.?/$J6,cC@:i,QIu6or:O.DDNK9EpTUekQ:/Fkg
+<MH7cVi6UpO-Q'"S=?(@Str3[X0&P,YHRf,aT):%r/po?r0-fqr5efXp;m*NrLX%]s.K@bs.]Og
+rhTRj!2f^m!iW)tri5#Yp;-14rP/?Gs/Q*u.&a&AVPU)aUS=HUTV%gHS=?":R@'A.QBd`"PEM)k
+OH5H_NJrgSMi.Lj!f2VereCH,re1-#pk&?pre1<*re:K0Lku%eE/KR4N/`jYO-#KeP*;,qQ'Rc(
+R@9V8SXuIHTq\<XV5C/hWN*#$Xfnt6ZEppH[^`lZ]=bkm^qmn*`Pom=ai_fNcHaeadaQ^rf%8R-
+g=tE=hV[8MioB(\k2tjjl07L!m-O--n*fc9nac8BoCW%Ts7ZKerqQKgs8)Wirqu]mo)=4?WW.J~>
+JcC<$JcFO*o`"gfrqu]krqZWjrV.l:p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ij5].Wi83;Fg=b-1
+e^W'qd*DWW#ah$JR[fn=StGbMpn@_\rh'.+r+u@JrbVUMrbV"<s(qUMrfd>Gq3CcAs-3\PQ'I[3
+NrP1=Nr"h$NrP+=N!kQ$M2@%ELPCS=Kn]Ilr'M>iF*Cqu?t!SZC2@g0F*)SOI=?a!K8,5@O8P+=
+O8b16O84n;OoCO=On"P4O8k7:O7JD1Oo:I@Oo1CAPPp[=PPLI=Q26dHQhm$JQi<?PQhm*KRJrTN
+RJiNQRJrZSS,SrTSc>8`SXuFFqk!h[s.K=as.KCc#G%?NQ'7AoOoC>IMhQY0I<^$]F`VP?Ch[Km
+A7K+Y@tTDcJ:;ilG\CT6I=ZusFDbi&>@(Z&5s@n85uqB+6UsXQ@V':jEHHJN7n6$<9heB1I"$Q]
+D/O94F*2\NH$XdbIXcp#JqJ]/qM"mirlY5`!6kGes3CVirQtJis3^nrrm^turn%2&#MIkdgtgfC
+hYuF4hu_lsiqdNiDu=PSR.?U;QM-[FQMmETTDtS`U&UkeU].(hV#[CkVZNfrWW&pXs7VTJOSt=@
+P5LIBOT2?\W@4^CVl$;dUnaZXTqJ$LSXc1=R[KP1Q^3o%P`q8nOcYWbNfB!VMi3JlM#rKgL]3&.
+L&Qc%KD:&pKDpQ(L&Qf.LPUccM/\?1N/WaVO,oBbP*2#nQ'IZ%R$jD4S=Q7DTV8*TUnsrdW2Zet
+Xf\e2Z*L^C[^N]V]">Vh^VI\&_o9U8aN;TJbg+M\dF-Lne^i@)g"P39h;7&IiSrnXjlY^gkiq?s
+lg4!*mdKW6naZ2@oCMVRp&Facp\sseq>^<gqu6NkrUTr=s/H$K~>
+JcC<$JcFO*o`"gfrqu]krqZWjrV/#>p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ij5].Wi83;Fg=b-1
+e^W'qd*>E_:f-sbr)3JjqbdGl;#O8j;#3?Q54_#655RM@55n@T:AdoZ:t8P@;u0Al;>iiZ6Pi-S
+5s%.j4?Ynl5<_=u6UX=0779[:8P8qTqb@#_s%NJeqb?u`q+pZYi(ruA!Du\m;?'Ji:]=/o:JOVY
+:/:=TmSNm[r_W;cr_i_lpJLrgrDWVlr_req!)rShs&8kqrDiku%8p&":eaYX9M%`A6UF*<4r6=C
+4#]2[3B8oR1bpd?1I4>m5Wq4j3C*O-5<Ltc2D[!9/h7q`-R:#k/i#@<2E!?K2`Wua5XRjs3]K,\
+4ZuG391V945sdq*6UF117S--A8PD]L9MJ2V;#F,hC&2TECB89irbqdTrc.pXrcA'\r,r!^s*"Nh
+H@#L9s*Xips*juun3,T,rDWZds.B=arh9@ds.fRhs.o^mrMK^qWN#lsrODp>rjrEH]=Y_h]tV2Y
+^&u-a^VBcas2"cRr`9&!!*9)!s&AMepJh0ms/@EFVl-DgUnjc[TqS-OSt2C@S!ob4R$X,(Q'@Jq
+P*(ieO,f3YN/NUOreU]4LPPk`s+UH*qLeQpqLed#s+UH,!f)SfreYTOMi<USNfT6_OcklkPa.N"
+Q^F20S"-%@T:hmPUSO``Vl6SpX0&M-Yd(L?['mEQ\[oDc^;%J"_Sa@3a2lBFbKS8Wd*^:jeCE.%
+f\,!5gtgiEi8N\Uj5oFckNM0plKdg'mI'H3nF?&>o(2JFrq6<bs7cNfrqZTjqtpBjr;H3cJcD_L
+J,~>
+JcC<$JcFO*oD\afrVZTjs8)ckrqQNf!;?Eb2tZ_4o'u8>n*]T0m-Es$ki_*ijQ#7Xi83;FgY1<3
+f$r0rdEfqWb08,VdaZk$g>1WChV[5Khu;R1iVh[7hscL#MYr>2M#)u+MZ&J4N;gTo_8=+h`;[aP
+`qm^Y`l5p+\)Fdg[gKROZa@*DZELI7Xo>@$WW#6^6iTOmNg+I$FEVtXItro?O->clR@9\=Tr+cl
+ZF@IE]`,P;]_]>=]]$Ku])B87]`,SE^AYhG^APbF_#;%J_"#8<_Z.ON`;[aT`W4'X`r=$S`r3pY
+aN=>%rlP2_"3\p3bPo`bc2Q#_ci)5jd2^T`e(*""f%&0ja2>[,_7mOk^V$\HV4jQSSsYlDOAh0t
+Lk^V9K7^5+X/W"lW1SK^S=ZgeVjW]iJ9Z!G?UeF5F\6\&Ll=r&:O.JFNK9EqTUntS:/Fnh;08M.
+V2^IpOHl*!S"#t?St`'XX0&P,YHRf,`rH"!r/po?s-*&rqoJZVpW39Qs.0.\s.B=arh9@d!2KLg
+!i;ckrhodp!3,psjT"nhn%ek9rkAE4.B08DVl$>fUnaZXTqJ$LSt2C@S!ob4Q^3o%P`q8nOcYWb
+NfK*XN/NSmM>rA3L])u-L&Zi&KD0uoKE$W)L&HaFLPUbCM2I1KN/WaVO,oBbP*2#nQ'I]'R$jD4
+S=Q7DTV8*TUnsueW2cl!Xfek3Z*UdE[^WcW]"G\i^VI\&`5Ta:aN;WKc-FY^dF-Lne^rF*g=k<;
+h;7)JiSrnYjlY^gkiq?slg4!*mdKW6nc&(\oCV\Sp&F^cp\jmeq>U6fqu6NlrUTr=s/H$K~>
+JcC<$JcFO*oD\afrVZTjs8)ckrqQNf!;?Eb,kU^!o'u8>n*]T0m-Es$ki_*ijQ#7Xi83;FgY1<3
+f$r0rdEhcX#ah$KS"-%?StGbMqk<t]!2&t%nnd`0rbVRtrfm2Cqj.&Coo9$3qMtE5mZ%=-N;e_=
+M2I+FLPGe^!/1><r'UKP)f^"+?X[ARAnc("Df^#BG'SLbJUrH-M2RFVOT(=?Nq\V2OSt=AP5(1;
+O8t@9OT(=?Nqnb.OSk7>P5LI?P5^[DP51=9PkgUAQN!6IQ2m9NQiNKLR/`TQR/<<NR/WNQRf8fU
+SGSi\St2FDStGkN!hZ-YrLn&#Ssu(4P*2#jO,]-VKReQ"G^4LTFDu/8C1h-gA7B"VKS+l,I=-Ed
+B4Q=9JUi)hDI6gU<),tG85*/O<aTHQ5t=CN@V'=lEHHJN7n-!<9h\,bI!pH\DJa<3EclSMH$Xda
+IXZj"JqJ]/qM"pirlP/^rlb>cs3:Pgrm1Sj#LUoFdF$Cje,IkseH4=RfDaD/g=tB;h;-rEhr"Fk
+!TE&5D?"MODuH'pQh6U<QiEWUT)YG_T`1YbU&^teU]RBiVZ*LnVuWgqWoX3QOnFh7Oo1CAOoLOC
+W[XpGVl-DhV50l\TqS-OSt;LCS"#k7R$X,(Q'@JqP*(ieO,f6[N/W[Pre^Z2!/LN-s+UK+qLeNo
+qLeg$s+UE+E/07*M2@+IMi<USNfT6_OcklkPa.N#R$a;1S"-%@T:hmPUSO`aVl6VqXKAY/Yd(O@
+[C3QS\[oGd^;%J"_SjF5a2lBGbK\>Yd*^:jeCE1&f\5'6h;-rGi8N\UjQ5OdkNM0plKdg'mI'H3
+nF?MK!qZ'Vrq6<b!;HHes7uZjqtpBjrVc<dJcD_LJ,~>
+JcC<$JcFO*oD\afrVZTjs8)ckrqQNf!;?Eb,kU^!o'u8>n*]T0m-Es$ki_*ijQ#7Xi83;FgY1<3
+f$r0rdEhefs%rMgr)3JjqbdSp:f("d;"QpL55.;A56!kA56!eG4T7MC:]!oa:\@Qa:]45D<;]Yq
+;H*NlrDEP\r'UKP)*U8H3]fGe5!;"k5!VG$6q'L46q0[<8k_qV:&Rc\:&Ic^:\IQ@:\7K];?'Ji
+:]=/o:JOVY:/:=ToM>N`r)!Air_W;cs&&hor_WAerDNSmrDNVnr`&nrp/1lhr)=&(;c-Ce:JFMW
+91h_R6N]Y>5!Am-s#;nq3&roT1GppC1I=Am5<_4k3C#em5<h:l3ArfJ.Oc\h,:"Nh0.nt;3A<?J
+1c73P4?c"t6TG'*$pHa85tajB5X@V$6UUi@!_,UMr^[2d8PDfP:&Rof:]>&*C&ViLCM[j*rGV^T
+rc.mWs)\0]s)e<`rcS6arc\KjH?spard4Zm"FY`IIXglNgJn/Ns.0.\s.B=arh9@d!2KLg!i;ck
+rhodp!3,pss1/0>!4i'>s1A9Cs1S9Cs1eWNrkeY8qc3VpnPf0]s/INIW2HPjVPU)`U7n9RT:VXF
+S=?":R@'>,Q'IStP*1rhO,o<]NJrgSMZ/J4L]E5/LAuu-K_g>qK)1-"K`?c)L2_p(Ll$tGMMmFP
+NK0'\OHG]hPE_>tQ^F/.R[]h<StD[LU8+N\Vl-JnWiW>*YHY:<ZaI6N\@K2`]Y;.r_8=.0`lH0B
+bKJ/Ucd:(fe'uq"f@\g2gYL]Bi8ESRj5f=ak3(sml0@U$m-X60n*olHncJFTo`"O`p&Ojcq#C0h
+qYU0hr;HTbrdk*Ks*t~>
+JcC<$JcFL)o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nfI>jn*f]3m-Es$l0%3kjQ#7Yi8<AHgY1?4
+f$r3tdJh5rb0/&TdaQe#gYCZDhu2L5iW%g:iSsdoro!!s!/g]2r.t<.r/1H2!5JNK!l;akrl"fT
+rPnWQs2G,Z`5DJ]rjMR/pU:%.oX4b-rj3!;Z*:I9XfSY*X8YH`6iBC]P*p<3FE`%YJVT,BO8b=L
+R@Be?U8=ln[(-+Js1A$<q7Z^=iOertr4D[8rk/<GoY:FArP/BJn\P+>s24`Prl+]Qrl=fRrPnoZ
+qo\o[s2kGebfe3/bl>rdcM,Zad/MGmdg"=Pd`onQ_#D+K]OSI`]re3.TqS*MR?s%uOH><SKSG&0
+JZl,SX/2SiUjdTZT!5]$R?D]IRW)nH7q$[:C3G&_:/FbbH@U^-Ng#p#TUenR:/P"j;-fljVN$Ut
+Ng,fsS"$"@SYE!XW3!,'YHRc+`W#q#rK-r>r0$WmprNBTp;m9Ss.'+[rgs.^!20=bs.TLgrM0Lk
+VPa?j!iW)tri6"!jo>%jm_Jb8s1U%bWiE%sVl-DgUnjc[TqS-OSt;LCS!ob4R$X,(Q'@JqP*(ie
+O,f3YN/NUOreU]4LPPk`s+UK+qLeKnqLeg$s+UH,s+^T1reUZ5MuJZDNK0'\OHG]hPEhE!Q^F//
+S"#q>StD^MU84T^Vl-MoX/rG+YctF>['d?O\[f>b]tV7s_SX71`lQ6DbKS5Vcd:(feC<($f@em3
+gtgfDi8ESSj5f=ak32'olKdg'mI'uB!V#XYncJFTo`"Lbp@n=[q#C0iqYU0gr;HTbrdk*Ls*t~>
+JcC<$JcFL)o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nfI>jn*f]3m-Es$l0%3kjQ#7Yi8<AHgY1?4
+f$r3tdJT=:R$jD4S=H1CTD"rVU&UkdT`/a)D"ql=D"qfGD#.rGPQ$gBQ2R$AQ2$C<N<#":NV\\7
+O78/4NJrdSMZ/G9Lkg\=Kn]Lmr'UEN(j(%0?X[ASAnc%!DfTrBGBnXeJqA]2M2hIps,Qi7q2kQ;
+!0[/?qiLi=plPK9r/UZ8oT9!5rK@)@qi^uCrK@2EnW`j7qj.5JqN_,Jrg3\PoU,NDrg<\QrgNhU
+s.&qV!1s1\s.04_qk!e[DP<\lR?s2%OHGTbN/WXIIt)ijH$4=NE,KK,BP;!f@q&i!Jq8E"I!g3Q
+AU8ZTKR7fX?YOIX9h%3;=[Q(h@:r#!7R^]o@qok!EccSM84Q0>9he2UI!gBYDJa92EHQJKG^=X_
+IsuluJV/T.q1SghrlG&[s2t;`!mJp6rm(Mhrm1_od*Vd>#L_)MeC<%!f)F;$fE9g]gYDeas5*e5
+rnmh9DYS)HDZ?(#R.Zg;QMHmISH#/ZT)YD_T`1YbU&^teU]RBiVZ*IpW2ZcqWrK-]s7VTIOT(C<
+OtMlYX/`2!W2HPjV50o^U7n9RT:VXFS=>t8R$a5+Q'IStP*1rhO,o<\N/W[QMZ/G6LkgcbLAuu-
+K_g>pK)1-"K`?c*LB!#/M#N53MMqIm@?$;.O-#KeP*;/rQC!u+R[]e:St;RJTq\?YVPg>kWiN5'
+Y->.9Za@-K\%0&]]Y2%o^r!t,`Q$!?b0/#RcHjkbdaZdtf@S^0g>(N?hr*GOj5]4^k2tmll0@U$
+m-X6?mfDqJrpg-^o^r.U!quB_rV6Egs8)WirVZWmo)=4?WrIS~>
+JcC<$JcFL)o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nf[Jln*f]3m-Es$l0%3kjQ#7Yi8<AHgY1?4
+f$r3td8!I9:BXKk;,U<j;>X8i;>a;l;>sAl;=$IE55RSE4p!l24nq5@4o[YC:]!ob:\IWa:]F8Z
+;tj8i;tEud;u9Jm;>ro[6iBCj4[D.l4$5Yj4$,Si5X@_)7RKX57S$-D9MGF[s%N/]rD*>f!)WSh
+p.jL@oMGH_s%rPfs%ikp:/+GX:@V-Q;#a>g;#aDl:]aKl;Y<oe;#!od;Z0Pn;Z0Pn<<#nj;Z0Qi
+;Gg:f:J=GT8kMWB6UF('5X%=o4#]/X2`NWP1c7'G1.+;m5X%:k3Bo\l4[2(j3ArcQ1+=Oq,U4im
+.k`\<0Jk[G1Gq'M4?Pem6q'$53?14E4?H208j>R,5XRn,6U=437nH9C8kM`M9h\@\;#a>kBE2]E
+B`;`EC'/9hDJoGlrc%jVrc8!ZrcA0`FT-F^G5ladGl2meHN8HlI/nch4o[Xt<<#nsSH#/ZT)YD_
+T`1YbU&^teU]RBiVZ*IpW2ZcqWrK.!\,a):])TDB]E5d\^AbhG^]2(O_SO(*r`8ttrD`;cpJ`]E
+WiE%sVl-DgUnjc[TqS-OSt;LCS!ob4R$X,(Q'@JqP*(ieO,f3YN/NUOreU]4LPPk`s+UK+qLeKn
+qLeg$s+UH,s+^T1reUZ5MuJZDNK0'\OHG]hPEhE!Q^F//S"#q>StD^MU84T^Vl-MoX/rG+YctF>
+['d?O\[f>b]tV7s_SX71`lQ6DbKS5Vcd:(feC<($f@em3gtgfDi8ESSj5f=ak32'olKdg'mI'uB
+!V#XYncJFTo`"Lbp@n=[q#C0iqYU0gr;HTbrdk*Ls*t~>
+JcC<$JcFL)o`"gfrqu]ks8)ckrV.f8p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5]+Vhqm2Dg=b*0
+e^W$prQ,Gibg+Vae_&X3h;I8khuVfprSdb8ro*n8qhb?1k)&tk!f;ekqhkEgs1e]P_ScAkrl+lV
+s2P,Zq8WWX`Pf[2r4)U4!4M[1pU9n*qmQO4rj;[/s/lI)XK8E#6Ms4K6lV2QE,p#BG^FjjLPq4T
+P*;,tR\$1HVQ6o,\%D@HrOi3FrOr0BkI^c,rO_p;r4D[8rk/<GoY:FArP/BJn\P+>s24lT!5nfS
+rl+]Qrl=iSr5SiZans6[aoBN^bQ#fdc2>l^ci2;jd::PLaN)01^:h4m]XYPcXf/+iTq@gBQBI>k
+O,JdIL4k,,Jul#QW2-2cQ[<_HZFQp(O*$,FDhh,!@X1[`G_D&N:esr:Jr#AIQ("58SPW'U:KCCn
+;N.<FV2UCpOHc#uR@O8J"JDTfVlTg!s0):'_uBb"OT(CBOSY+/anNmRanNmVRf]+NSc55\T)bP`
+U&UheU].(hV#[ClVuN[qWW&ptWr]<(kPt+ho"b.;s1T\XWiE%sVl-DgUnjc[TqS-OSt2C@S!ob4
+R$X,(P`q8nOc]R'"ceS$N/NSmM>rA3L])u-L&Zi&KD'onKE$W)L&Qi,LB*/0M/\?1N/WaUNfT6_
+OckomQ'IZ%R$jD4S"6.BTV8'SUnjlcW2ZetXf\b1Yd1UB[C3TU]">Vg^V@V%_o0O6aN2NIbg"GZ
+dF$Fme^i@)g"P39h;7&IiSrnXjQ>Ufkiq?slg4!*mdKW6nF?)?oCMVRp&Facp\jmeq>^<gqu-Hk
+rUTr=s/Z0M~>
+JcC<$JcFL)o`"gfrqu]ks8)ckrV.f8p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5]+Vhqm2Dg=b*0
+e^W$pqj.SVR[Tb:SXuIGpRqJYs.TOfT_iO%D"MT<D#%lDD#KRsPk^ODQMZpIPkp[<Nq87tNrP+<
+N;e\6LBE6bKnTFlr'UBM)KL",?XR;PAS,XlDfBc=G'81[IY!'(LPUnJooJm0rfI2Dq2tQ9rf?l:
+rf?u;qiCB2r/pr@r/pl>s-*DEs-)u;q3CiCrg3JI!13\P!13;EqjIGNs-`hSrgNnXqOIVVrgj(\
+!2'+Z"e;!IQ'%4.O>i5ZN/<7?IscNdGB@nFDes0&B4b[a?smDpJUr<!H?s^G@=<f`H?F+5BQ$s\
+4%r:N6W7/uC.%tj.UZ^uCMe'5Fa8.#84H*D9h\/sI!gBYD/=*0EHQGJG^=X^IXZctJV/Q-q1\jg
+!6>&ZrlP/^rlY;crltGfrm1Mhrm:eqe'n<Grmq,$"5);[gA]n-h>c@3hZMfoi8FNNphfnpr0[2E
+nWs*>s-j([SXobOs.9:arh9@d!2KOhs.o^mrhodp!3,sts/Q1%Xlo`TOnFe9Onk1?OWpj+Wi;qp
+Vl$;dUnaZXTqJ$LSXc1=R[KP1Q^3o$PEM)kOT(:ENfB!VMi.Ljs+gZ1rJ(?+s+L6$p4E-ns+LE+
+reCH.!/UW2E/KR4N/`gWO,oBbP*;,qQ'Rc(R@9V7SXuFGTqS6WUo(&gWN*#$Xfen4ZEppG[^`lZ
+]=bhl^VRe)`5Ta;aND]Mc-FY_dF6Uqf%8R-g=tE=hV[8MioB([k2tjjl07L!m-O--n*fc8nac8B
+oCW%Ts7ZKerV6Egs8)WirVZWmo)=4?X8d\~>
+JcC<$JcFL)o`"gfrqu]ks8)ckrV.f8p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5]+Vhqm2Dg=b*0
+e^W$pr_EGg"Ar&o;H!Eir)3Jjr)*Sn:f-sOlok>3r]^NL4ZtnirB:$ArD3;cqbR5g"&D`i;>sDi
+:B=9hk>V7Wq,@#e!)ren"&Vro;>ro[6i9=k4?knh3]]Ad5<V(j5X7V'6q'I27n6-C8P;`Np.bK\
+r_NPjrD3,^hbWl@r)*JjqG7,f"]%lf9hnIR:\R]a:BF?g:]=2i;?'Jl;YEud;#!oe;Z0Pn;Z9Vn
+<<#nj;Z9Mo:f%'b"\VH[7n#fE62j%X4?>M^2`<NN2Dm6H1,CZa5q,#^3]T2b5Wq=p4#o/W2)?m8
+)C-R\/h/P43&!9L1c%$N3]oSk6:=7%r](6K4$,Sp92%rBr]g]T6UX7,84Q2L8-V[Z92&#R:ARci
+BP2!lBDuTCC&ViLCMds,rGV^Trc.pXrc@sYrcS6a!dAm6r-J?hs*Xfo!.XT'fMqlLs-j([SXobO
+s.9:arh9@d!2KOhs.o^mrhodp!3,sts/Q1%Xo>g2]".dNs1A<D!kl7[rkAEIrkJZQ_GsT:rDiYm
+oMbK`,-.`DWMl_mVPU)aUS=HUTV%gHS=?":R@'A.QBd\uP*1rhrf75CNJrgSMZ/J4L]E5/LAuu-
+K_g>pK)1-"K`?c*LB!#/M#N6MMMmFPNK&sZO-#KePE_>tQC!u,R[]e;St;UKTqeEZVPgAlWiN8(
+Y->.9Za@-K\@K2_]Y2(p_8=+.`Q$!?b0/#RcHjnce'uq!f@\d1gYCWAhr*JQj5]4_k3(sml0@U$
+m-X60n*oi:o()DDo`"O`pAamcq#C0iqYU0gr;HTbrdk*Ms*t~>
+JcC<$JcFL)oD\afrVZTjs8)ckrqQNf!;?Eb+nYBso'u5<n*]T0m-Ep#ki_*ij5].Whqm2Eg=b-1
+e^W(GaU626c-Xngf@o!8hu;U7i;;L3iW.s2M>iD.M>iD#M>rA3M>W53^;'Z_!l;akrl"iUqo8HP
+s2G8^`5BI.\@DFH!4_s9r3lO2pU9b&&%&[KZ`pa>Y-+n.X/`3e6Ms4I6lVD/E,p#DH$t*nLl7:U
+PE_B#S=lOMV5LB![(6%Gr4N*ErOr0BqRZa?n%8S3rk&$<r4D[8rk/<GoY:FArP/BJn\P(=rPSWQ
+rl+ZPs2XuUr5\iY!6P,\rlG/_r6,)`!6tGeps8rd#LCK4_SEk!]DfBE\[]/MVk]rYT:D@9PE:ic
+MM?n<K7\](Y,eS&Vkg)`J9mfXWNi1cNcL/>RV,9.D0JWnIYg`q:j.5<LlII^R\-0H:eaY[<E)mq
+PG+bKN/j!ZOd23"S"'DK"JMZgVlTg!!3c4&_>aRuOc]="m`G.Cr5ncUrgWqXs.0.\#G7Z^TqS3T
+U].(hV#[ClVZNfrWW&n"X/rD)kPt%foYCC>s1SK6ri.QLW2HPjV50l\TqS-OSt;LCS!ob4R$X,(
+Q'@JqP*(ieO,f3YN/NUOM2@%EL])u-L&Zi'KCjclKE$W)L&Qi,LB*/0M/\?1N/WaVO,oBbP*2#n
+Q'IZ&R$jD4S=Q7DTV8*TUnsrdW2ZetXf\e2Z*L^C[^N]V]">Vh^VI\&_o9U8aN;TJbg+M\dF-Ln
+e^i@)g=k<;h;7&IiSrnYjlY^gkiq?slg4!*mdKW6naZ2@oCV\Sp&F^cp\jmdq>^<gqu6NkrU^#>
+s/Z0M~>
+JcC<$JcFL)oD\afrVZTjs8)ckrqQNf!;?Eb+nYBso'u5<n*]T0m-Ep#ki_*ij5].Whqm2Eg=b-1
+e^W(EQO&tIS"-">StDYKT`(PcU24Z@C\qrGD>nGJD>7rEC]8/JPQ$g;Q2d*DQ2Qd<Nq/2!NrP(J
+Mi<OPMMR%CKnY266:1T;qEu9F>[C`E@Uit^BkqX,F*2YMH[UBpJqSi5MN*YmO8"b/Oo(7=O8=t;
+O8P%8O7\P3Oo:I@Oo(=APPp[EPOXn4Q2HsIQi!*JQiEEQQh-UARJrQRRJ`NQS,&TTSGo)VSctXP
+Q^*_rrfA%YO,SmPK7SN"H$FRTEcGo2CM.3h@q&kT?\JE01k'k!H"^c9H[pWlF)5,tBRNW9;,gac
+='oT,84Hik@VBRrEH?DN7n?->78-EM9QPT/IVf"$&T;Z0F`r"SH?jjdIXcp"JqAXNK`K*k`W4'X
+aSs<\b5TQabl5iecMZ#gciDDkd/VJndf._qe,n1Of)F8'g"P07rnRP0s5*b4s5<lprbhRLpm:lF
+q3UQ9rg3VRs.'+[rgj@eTV/!PU8"F^V#R7kVZ*IpW2ZcqWWT<'XKC[cn<*I,rfR,As,d;^ri.QL
+W2HPjV50l\TqS-OSt;LCS!ob4R$X,(Q'@JqP*(ieO,f3YN/NUOM2@%EL])u-L&Zi'KCjclKE$W)
+L&Qi,LB*/0M/\?1N/WaVO,oBbP*2#nQ'IZ&R$jD4S=Q7DTV8*TUnsrdW2ZetXf\e2Z*L^C[^N]V
+]">Vh^VI\&_o9U8aN;TJbg+M\dF-Lne^i@)g=k<;h;7&IiSrnYjlY^gkiq?slg4!*mdKW6naZ2@
+oCV\Sp&F^cp\jmdq>^<gqu6NkrU^#>s/Z0M~>
+JcC<$JcFL)oD\afrVZTjs8)ckrqQNf!;?Eb,4tKto'u5<n*]T0m-Ep#ki_*ij5].Whqm2Eg=b-1
+e^W&DrD*Ag!)WVlqGI2hrDEJjrB1!@r''@."[5(45!;(-4T.G@:]!o_:BF?i;>sDi:]F8k;?'VX
+;uBVb;Z]ir;uKVn;?&u\6i'1N55dME3BTGhr]L<I5skQ=#t@9P7n?3D92/1X:&Icc:]F8i:\IQ@
+:\7K];?'Jh:]F5p:JOVY:/:=Tpe^`]s%rSis&/Sgr)!/cr_i\ns&/bnr`&kqr_`_nr_a5':f'q`
+9MS5R84c3:6:(T9<BNE+4#o>\2`NTN2)@$F1bqEb5X@Os3]K>f5X.Fp4#o/V1b_!:)_*<l/MAk<
+0JtaC1H%9U4?c"t69$td3B98c4Zu>/9M7W95=%V&6UX:08Oc5L8-V[[92&#R:ARcbBE)WFBDlNC
+C&_oLCM[keDZ4SRE;jkWEWU6%F8L(YFoHOcG^4T4HN&6oI!pBkJ,MS+4oJ=5;ufkrS,]#YSc52c
+T:hjNTq\9VrhTRj!2fan!iW)tri-7)XK8P5\%&uZrOW$@s1JBFr4`3Gs1nZOs&K%ts&JempJ^fc
+!3?+!/ZG\HVl$;dUS=HUTV%gISXc1<R@'A.QBd`"PEM)kOH5H_NJrgSMi*@JLkpibLAuu-K_pDo
+K)1-"K`?c*LB!#/M#N6MMMmFPNK0'\OHG]hPE_>tQC+&-R[]h<StD[LU8+N\VPgAlWiN8(YHY:;
+Za@0L\@K2_]Y;.r_8=+/`Q-'Ab0/#ScHstee'uq!f@\g2gYL]Bhr*JQj5f=ak3(sml0@U$m-X60
+n*ol;o()DEo`"O`p&Ojcq#:*hqYU0hr;?Nbrdk*Ms*t~>
+JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nf72hn*fZ1m-Es$ki_*ijQ#7Xi83;Fg=k32
+f$r1HaoBKibg4\cf%Jg5hVe@k!93q8rSmX/qhb9/q2,!+mtq%$#JRsf^qmk(_u@UR`V[[Oa8a-_
+`Pf[2_8,uYqRQU8rO;X3!4DR0pU(.2[Bd$@riZL-XK8J(6Mj.G6le^aDK0]=GC"[cL5:bKOHbrq
+R%0b?Tq\E`X0K.Frk/0Bs1\HFrOi$>!5.d4rOi0BqRZU:p:UC<!5A*?s1nQI!5S-@qSN3KrknlW
+`5VMkrl=rVqoA`X!6P,\rlG/_r6,)`s3:Mfps3Koahtm*]=PYe]XbM_YGe=nTUqdFS!B5#O,]'P
+KnY).IsnDuWi2ekUSFEFHC^S&XeD,AEJ]Hl>ZaR>7r!:$ND">7H%1R*O-Q0)T3+l`9i"_e;I6&j
+V5903O-#NhQ'n/4rLO:iV5L8mXf\b0poqR6s,[;EOHB=$s2k2]oZ?^Gr5niWs-iqV!h>gPrgj@e
+TV/!PU8"F^U^*`nVPg>jW2]cr!irE(riPDamD8P4r4i9G/$#\MWMl_mVPU)aUS=HUTV%gHS=?":
+R@'A.QBd\uP*1rhO,o<\NJrgSMZ/G6LkgcbLAuu-K_pDmK):3#K`?c*L2_p(Ll$tGMMmFPNK0'\
+OHG]hPE_>tQ^F/.R[]h<StD[LU8+N\Vl-JnWiW>*YHY:<ZaI6N\@K2`]Y;.r_SX71`lH0BbKJ/U
+cd:(feC<%#f@em3gtgfDi8ESSj5f=ak3)!nlKdg'mI'E2n*olHncJFTo`"Lbp@n=[q#C0hqY^6h
+r;?Nbrdk*Ns*t~>
+JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nf72hn*fZ1m-Es$ki_*ijQ#7Xi83;Fg=k32
+f$r1EQNESDS,Sr]StDXJT`1Y_T`(S[D#8#FD#8)HDYJ#CD#\;LPPpa;Q2QsBQ26R7NqA>%NX^u.
+Mi*CKMMd4FLPCLLqa:0I*CY-V?=.&KAS#LgCN"36F`r%VI=?]sK8#&:Mi<bsO7n\.Oo1==O8G%<
+O8P%8O7\P3Oo:I@Oo(=APPgRDPOXn4Q2HsIQi*0JQi<?PQhZpJQi<BLRJrQRRJ`NRRfJuTSc>5Y
+SHYUTS!]P*rfI,?B8h\*L4Fc&I!9g[F)l59CMINpA7K(W?snV<J:N)sH?sdUAU8ZOIX#jK?#!tT
+7RB=@4]5HnC-l$-?"%5XD/jZ@Gtpn#7R^!F92^.aI=?!MD/O?5EclPKG^=X]I"$NoJUrH*KD:0#
+`WX9#`lH.!aSj6[b5]Zbbl>oicHjh^rm(Vlci2;jd07tIe'upurmh8)f\"p4g]$".h>Q41hZ2U5
+D?+VSDZ+GPQM-[BR.ls;QN*EQRf]+NSc52cT:hjNTq\9VrhKdqVP^8hW2Q]pWWK6&XT#?cs6YsF
+OSb1?P5gXpX/`2!W2HPjV50o^U7n9RT:VUDS"#k7R$a5+Q'@JqP*(ieO,f3ZN/W[PreU]4LPPk`
+s+UK+qh+Hkqh+p%s+UH,E/07*M2@+IMi<USNfT6_OcklkPa.N#R$a;1S"-%@T:hmPUSO`aVl6Vq
+XKAY/Yd(O@[C3QS\[oGd^;%J#_SjF5a2lBGbK\>Yd*^:keCE1&g"P08h;-uHi8N_VjQ5OdkNV6r
+lg4!*mdBQ4nF?MK!qZ'Vrq-?dp\4X]s7uZjr;6Hjr;H6dJcDhOJ,~>
+JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nf@8in*fZ1m-Es$ki_*ijQ#7Xi83;Fg=k32
+f$r/Er(d8f!)`\mqbd;irDEMkofW19!'^0@r]]X2s#g3TqbHu`s%r\lr_WMg!)WYlr`/ttoi(li
+oMbZeoMb`erDNer;,TaX6hs+N76pf4(-=ZB5!1tl5X@Y&770L46q9^;8P2TNrD!2b!`)Wgr_WPh
+pJ0UAoMGH_s%rPfs%i_l:B!rf:@V-W;"RN`;#=,h;Ya2e;#!od;YO,h<;ohq;Z9N::ej\W9M7rJ
+7n,j55X.Lu4$5Yf3BB)X3&EKK2)6pC1.2%+s#r"r3B9&_5<h=o3]JuU2)$R(*[iQh.PES>0JG4:
+2E!TY5!MD&2`NiY3BfJe55n1l8j5I*5XIe)6pj:384H*?84cEG92&#R:AIZcB)-*=B`2WIC27X&
+rbh[Qs)@sWs)J*Zrc/'^F*%>&rcJ?eGB\=Xrd+Tk!.+Wks*OirJ,MP/55dXo<<&EdRf]+NSc52c
+T:hjNTq\9VrhKdqVP^8hW2Q]pWWK6&XT#=(\%&rYrOW$@s1JBFr4`3G"i.sj_GjP(<;KPf<%G#L
+Wi;qpVl$;dUnaZXTqJ$LSXc1=R[KP1Q^3o$PEM)kOH5H_NK&mUMi.Lj!f2VereCH,s+L9%nq-ak
+s+LE+re>BILkpnEMMd=NN/`jYO-#KeP*;,qQ'[l*R@9V8SXuIHTq\<XV5L5iWiE/&Y-5(7Za7'J
+\%&u[]Y(tn^r!t,`Q#s>aihlPcHjkbdaZdsf@S^0g>(N?hr*GOj5]4^k2tjkl0@U$m-X6/n*fc9
+rpg-^o^r.U!quB_rV6EgrqcQirVZTloDX=@XT*e~>
+JcC<$JcFI(o`"gfrqu]ks8)ckrV.f8p@e1Po^h\Fo'u5<n*]T0lg!a!kN:pfj5T%Uhqd)Bg=Y$.
+eC2L[rQ,GibK\G_eCWI1hV[8iiW%p9iW%p2M#3&+MYi8-MXZK&MZ:Bj_#;(M_ScAks2FlTqT&WU
+"NA<t_nuDhqRHC4rj_d5o="D$$FI.GYHG"0X0&Bgqa:3JrC%0aE,fo>FF&@bKntYIOoCOQR$jP<
+TqJ3ZX0&_;]`#PC^AYbD]_oAA]^NK2]`5V?])926]`,SE^@]2?_#1qI_!o2;_YqCP`;d^U`5VMk
+rl=oUqo8`Yans6[ans9\bl>rdcMc(%cHOAL^q@:k]"GYb\%&cDVkTrZSt;=9QBRGlN/ECDK7JK%
+I]99EVl->bUmmU2NJ`V$[@`\BDkMc.='J4A9l,*0EcZ;FH@^m2O-c?/Ski*U:/t4l;kft^V2p^t
+OHl*!R@Ke<rgjCkV5L8mXf\b0pTV@2s,m8ArK7-$rlP)\ouZaFr5nrZ#ah$KR[]e:S=TYN#G7Z^
+TqS3TU].%iV5F6i#H4W$WiE,#XT#=%Y3GuN_>D%F^G<O)X/`2!W2HPjV50o^TqS-OSt;LCS!ob4
+R$X,(Q'@JqP*(ieO,f3YN/NRNM2@%EL]3&.L&Zi'KCOQkKDpN(L&HaALPUbCM2I4LN/WaVO,oBb
+P*2#nQ'Rc(R$sM6S=Z=ETqS3VUnsueWN*##Xfen4ZEppG[^WfX]=bhk^VI_(`5Ta;aND]Mc-FY_
+dF6Upf%8R-g=tE=hV[8LioB([jlYail07L!m-O--rpKmWnc&([oCW%Ts7ZKerV6Egs8)WirVZWm
+o)=4?XoEn~>
+JcC<$JcFI(o`"gfrqu]ks8)ckrV.`6p@e1Po^h\Fo'u5<n*]T0lg!a!kN:pfj5T%Uhqd)Bg=Y$.
+eC45["IPXIS=TYNs.B=arLs1_s.St!!,MIJqec4JoPOJAs-*;Ds-3SKpQb]ApQY`CplFs*p5S^)
+s,@;CM2@%ELPUXNqa:3JrC%]M>[CcE@:Ee]C27^,F*)MKH$ashJq8T0LP^qKooSm0r/gf:r/go=
+r/UZ8oT9!5rK@)@qi^uCr/q&Dn<Ea6qj.8Krg*GJrg3\Pq3_/Js-W\Org<SOs-s%Yr13eV"J)'O
+Q^.Q48</dmN/<IKJ:N,sH?aXVF)Yu5Ch[QoA7AtU?s\G8IsufoI!KmTDJX!"JqA2eCKu!m><t_B
+>=)7nA6)c7>[LrRCN"99H$K<X!(Hi[s*PZ3IV`k=DK0]>F`r"TH?jgbIXZctJV/Q,pOrUdr5ScW
+r5elZrlP5arlkDes3:YkcMPred/VJndf._qec+,%f@\a/rnIG-s4mn9h;7#GiSjNKr0I&Cr0[2E
+o9KZLR@9S6S"-">rgj@eTV/!PU8"F^U]I<hrhg""WMuntX/i?$XT5Ngs65[FOS=klXK/A$WMl_m
+VPU)aUS4BST:VXFS=>t8R$a5+Q'IStP*1rhO,o<\N/W[PMM[1GLkktas+UK+qh+Ejr.G!%!/:B+
+CPR_%M2@+JMi<USNfT6_OcklkPa.Q$R$a>3S"-(AT:qsQUnjibVl?\sXKAY0Yd1UB[C3QT\\#Mf
+^;%J#_o0O6aN2NIbg"GZdF$FmeCN7(g"P39h;7&Ii8WeWjQ5Oekiq?slg4!*mf)YUnF?MK!V>s_
+p&Facp\jmeq>^<gqu-HkrUTr=s/l<O~>
+JcC<$JcFI(o`"gfrqu]ks8)ckrV.o;p@e1Po^h\Fo'u5<n*]T0lg!a!kN:pfj5T%Uhqd)Bg=Y$.
+eC.2h:/4O_:&n,e;Z0Jk;Z0Jm;XcgA4o7G94oRSB4o8%P:AR`d;#X>k;#F,h;#O8k<;ont<:s2e
+<:j)h<:j,h;ZBYt;H$FZqa:3JrC$cQ4$<L'!^&Y/r]L?J5sdp;6jZ:M7Ros?92&#Rr([;h:f70f
+rD32`hbWl@r)*JjqG7,f!DcJi9`RrX:]F8c:]4&g:B45g;>sJh;>sAn:Jam_;>jDe;uTbr;uTYn
+:]F''9M.oJ7R][05<qFt4$>_f3&iiU3&WYl1BB3sr]qqq5!(ec2E*NK1Hdc\3&NTN0.\+c-8$o%
+0fCX:0ekOE3''/c5XRmur]'sBr]L0Q"A1jD5=5<:"%,OJ7K,d_84cEH92&#R:A@W`B)Q?DBP1uV
+B`;]HC2Eldrbh^Rs)@gSs)S*[rcJ-^"*Sm4H2`*lH[:$brHeWoI=QkF4oIRn<!\kZR[T_8S=H/L
+Sd1m\TV8'RU8.^`!Mu[mV['0"WN)u!X/u<&"g5>E\@K0K])TDB]`5\C^Al"K_<Fqu;tj6GXK/A$
+WMl_mVPU)aUS4BST:VXFS=>t8R$a5+Q'IStP*1rhO,o<\N/W[PMM[1GLkktas+UK+qh+Ejr.G!%
+!/:B+CPR_%M2@+JMi<USNfT6_OcklkPa.Q$R$a>3S"-(AT:qsQUnjibVl?\sXKAY0Yd1UB[C3QT
+\\#Mf^;%J#_o0O6aN2NIbg"GZdF$FmeCN7(g"P39h;7&Ii8WeWjQ5Oekiq?slg4!*mf)YUnF?MK
+!V>s_p&Facp\jmeq>^<gqu-HkrUTr=s/l<O~>
+JcC<$JcFF'o`"jgrVZTjs8)ckrqIf6p@e1Po^qbGo'u5<n*]T0m-<j"kiV$gj5]+Vhqd,Cg=b*/
+eGRAsai_fMbg4\ce_/a6hr+IlrSmh8s+pQ/qhY-+q25--pknj'rJ1T5^;%J!rkSWP_u@UR`V[[P
+a8X'[`Pf[n_Z%CM\cB;>\Gs)>])B2=\Fm?'[f3ZB['d<JZE^X;X/rD'r'U9JrC%etPF?K0F)uGL
+I=R!+N/Wg\P*D6!R[p(EU8=chYdM(?^AYbD]`#GB]^NK2]`5V?])926]`,SE^@]2>_#;"J_"#8;
+_YM(P`5T^8`V[[Sa8<mR`ra?(ans3^ai_d'bQ#fdc2>ijbK.fB^qBZXA\#=][CE98Tqe6PSXGn3
+Q]dMmN/E=CJUr8tI&a*AVPKoZU3Vr`N/NIEJq&2pG&qS8F&-I\I;<Y9E,fuCNdZP:Nffd#TU\hO
+9hn_f;LY=7VPfE6Od)-"R@Kh=StD^QV5L?mXT>T.p9;1/!g&P,rK.&A!li:$rlG,]qo\ZTnAtOL
+"j!'uR@9TDRfT%Mrgj^oTV/!PU8+KZUnsrcVl-JlWW&muX/u<&s/l@*lMp(ar4r0D!3?+!,,qN=
+VPU)aUS=HUTV%gHS=?":R@'A-Q'IStP*1rhO,o<\repl9MZ/G5Lkkq`!/:E*r.Fp!qLSQrr.G!%
+!/:B+#)A"jM2@+JretWPNfT6_OcklkQ'IZ%R$jD4S"6.BTV8'SUnjlcW2ZetXf\b1Yd1UB[^N]V
+]">Vg^V@V%_o9U8aN;TJbg+M\dF-Lne^i@)g"P39h;7&IiSrnXjlY^gkiq?slg4!*mdKW6naZ2@
+oCMVRp&Facp\jmeq>^<gqu-HkrUTr=s/uBP~>
+JcC<$JcFF'o`"jgrVZTjs8)ckrqIl8p@e1Po^qbGo'u5<n*]T0m-<j"kiV$gj5]+Vhqd,Cg=b*/
+e<ZErQO9.LS"-%@StDXJT_kG^T^?RoD?"GLD>8#DD>\2MPP178Q2HmEPlR-LQ2[$@O7&&(NW5%<
+O8b.ENK0$YN/NRMrJ1;<q*b0M*_(3p>[:]E@:<\ZBkhO)EcZ;GGC"XbIt<6*KntYHp5o'3rK-f8
+rfI,?r/UZ8oT9!5rK@)@qi^rBrK7/EnW`g6qj.5J!1*JJrg3\PqO%5Jrg<SN!goCDqjISUS=KMJ
+FI\efR$<brOH5KaNJiUMKRnT"H[0gYFE2A=D/<p!ARo4X?XI)hJ:E#rH['gIE,B?(B4PFY?<^K3
+<)cp\:/,%m;H-Xs=BTNL@VBRqF*;eP84H$99he;nI!gBmCi4-1EHQDIG^4U]H[U<lJUrH+JqWiO
+s2FlTs2Y&YrQ,8dbKJ/Sbg$%1r6PAhrmC_o!n>cNrmh/&g"HAZrnRP0#N":mhV[5LD>A&NPa.O3
+QM-[ER.H[<QN*<RR@9TDRfT%Mrgj^oTV/!PU8+KZUnsrcVl-JlWW&muX/u<&s/l@*lMp%0!0Hr;
+!3?+!,,qN=VPU)aUS=HUTV%gHS=?":R@'A-Q'IStP*1rhO,o<\repl9MZ/G5Lkkq`!/:E*r.Fp!
+qLSQrr.G!%!/:B+#)A"jM2@+JretWPNfT6_OcklkQ'IZ%R$jD4S"6.BTV8'SUnjlcW2ZetXf\b1
+Yd1UB[^N]V]">Vg^V@V%_o9U8aN;TJbg+M\dF-Lne^i@)g"P39h;7&IiSrnXjlY^gkiq?slg4!*
+mdKW6naZ2@oCMVRp&Facp\jmeq>^<gqu-HkrUTr=s/uBP~>
+JcC<$JcFF'o`"jgrVZTjs8)ckrqIf6p@e1Po^qbGo'u5<n*]T0m-<j"kiV$gj5]+Vhqd,Cg=b*/
+eG`8D:B!uf:&n,f;Z0Ji;Z9P\4S:l4557;?497N+qbR)a!`)WhrD*DirDEPjrD3Giqbd,foi(Ta
+pJ_&jqbmPq;cEQkr'U9JrC%;f5!M(i3BT>b5!1nh4[21t62j4X779L77Rp'C92>I^!`2`krD<Gg
+q+fgCoMGH_s%rPfr_NSir_3AfnPB-\peUc^!DcPh;>sJh;?'Jm:]=2d;>jDe;^#+=;,L.b:J=DR
+91_]E770=)5sIRr4$5Ma3B8uV2`<NMrA+a66U3k#5!:tf5lNVD1GUU:1&`a3/1WA%)C-X_.k<4N
+/.40t1cRNX4$Gu"75t3+*BlSK6q^3I83T7(6:4./6UjR884H-@8k_iL9h\:\:AIZcAc-0=BE)ZF
+BDuTDB`VsbrbV^SDf5Mls)@pVs)8$ZEcV,"s)e6_!dAm6rd+Ni#C:`CH[C0jJGMG/4oeO1<<&<e
+R@9TDRfT%Mrgj^oTV/!PU8+KZUnsrcVl-JlWW&muX/u<&s/lL.\@B)[rOW$@s1JBFrkAEIrkJNM
+k>VF[pJ_-nri.0AW2HMhUnjc[TqS-OSt2C@S!ob4R$O#&P`q8nOcYWbNfF$s!K2j7M#iEfrIt<+
+re13%r.=crr.=j!re(9*rItN3LkpnEMMqImCQ4@8O-#KeP*;/rQC!u,R[]e;St;UKTqeEZVPgAl
+WiN8(Y->.9Za@0L\@K2_]Y2(p_8=+/`Q-'Ab0/#ScHstee'uq!f@\d1gYCWAhr*JQj5]7`k3(sm
+l0@U$m-X60n*ol;o()DDo`"O`pAamcq#C0iqYU0gr;HTbrdk*Ps*t~>
+JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb+8#0qo'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg=b*0
+ebdDsai_fMc-b"hfA#*<hr+Ilro*q:qhb<0q2#*-qhb')re^9)qMG3d!5SQL"2_so`;[aR`qmaT
+`rF$W_u[cmrk\NDqmc^:pUL:6rO;a8rjVI,$+7.HZ*LU:Y,nf(6hs.K7K5h#8!KN`DfTuDH@10m
+Ko(bIOH>ZkQC4;9TqJ6ZVld22\%_gSr4N$@!5/->s1J0>rOi0BqRZU:ot:=<!5A*?rkSKI!5S3B
+pqljE!lW'rrl+fTrl=rVqT&TWqoSu^b0'V)rQKB,aN)66^Uq+h\@B#V[^<9<VPBlZSt279QB@Al
+O,/XHKReMuH[MfiV50l\T:U:LS[#i*K7A;sG'._?BjshKBPV?uCi=63;GN:&L5M"VS"-*\:eOMX
+<`;nQTqeKFO-#NiQ'n/2St)CDV5:&hXf\b0oWYn+"-J\,Oo:C@`<+'"a8X0Zao'<Vam[=LaT.\,
+QiWVDrgOIhSXl@DT:hjNTq\<WUnjiarhg""WMuntX/rE%XTGZ/Yj;>P_>V1G^FQCdWiE%sVl-Dg
+Unjc[TqJ$LSt2C@R[KP1Q^3o%P`q8nOcYWbNfB!VMi.Lj!f2VereCH,s+L<&r.=`qr.=j!s+LE+
+reCH.!/UW2!K)g7N+J!/O,oBbP*;,qQ'Rc(R@9V8SXuFGTq\<XV5C/hWN*#$Xfnt6ZEppH[^`lZ
+]Y(tn^qmn*`Pom=aihlPcHjkbdaQ^rf@S[/g=tH>hVd>NioB+]k2tjjl0@U$m-X3.n*fc9rpg-^
+o^r.U!quB_rV6EgrqcNhrqu]mo)=4?YQ'+~>
+JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb+nYBso'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg=b*0
+eWuNsQOB1KS"#t?T:V[ITV24V!20:-s(q[Onndr8oPXMBop#H@s-EYL!g]+:rfm>Grg*PKrfll4
+pl><6rf6`4r/V/ENJrdRMM[1GM>Ta:7/]RS7Nb3BG["BZ@:<VTAnYprDK9f>Fa&(WI=?a!KS>2<
+MN*\nOT1FCP5LI@OS=h9OT1C=Nr+n0OSk7>P5LI>P5^[DOoU^;PkLC>QM-[EQiNKMR/E<MR/<9Q
+R$jB>RfAlWS7S1VR$Nu!OHGTaNK/sSLkgP2IX?BcG'%bDDf'<+Bk:jc@:<ML?@RKSIXHKdG%G00
+K8P(e@:!/@=&r3p9gVTO:esqe<*!$k7W)[GBl.d0G'HtW7R]^>9h]>MI",sKDJsT:rc\<d$$giF
+IXcp"K7\aJL&T'j`W4'Y`W4'Ya8j?]aSs9`b0.uPrlkMic-?75rm(Vlci)5idf._pe-4FTf@em3
+rnIG-s5!Y1!T2i7D$4`nD/O7jP6-u6Q2?m@QN3EDQhZjHQi<?QR@=,E&=f;^St;RITV8'RUSFW\
+V5F6i#H4W$WiE,$XT#='Y-5(qs4i_eXK/A$WMl_mVPU)aUS=HTT:VXFS=>t8R$a5+Q'IStP*1rh
+O,o<\N/W[PreU]4LPPk`s+UK+r.Fp!q18Hqr.G$&s+UH,s+^T1reUZ5MuJZHNK0'\OHG]iPa.N"
+Q^F20S"-%@StMdOUSO``Vl6SpX0&M-Yd(L?['mEQ\[oGd^;%J"_Sa@3a2lBGbK\>Yd*^:jeCE1&
+f\5'6h;-rGi8N\UjQ5OdkNM0qlg4!*mI'H3nF?MK!qZ'Vrq-?dp\4X]s7uZjqtpBjr;H3cJcDqR
+J,~>
+JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb+8#0qo'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg=b*0
+ebr;D:Amlf:Jq'g!E2np;>a;l;>rZV4T7M74RbN/55dYD49/4T:]4#g:]=2h:B45i;>sDj:]=2j
+;#jMn;>sSq<;ohr<:Wuf<;fhr<;0>f<;BJj6hs.K7K5g\7m91"4?EF(s#^?G3^*I,!^]7Br^HfV
+#"VB\9MSA\rD<DfqbH!DoMGE^!)WMfr_NSir_3Afo2#6[q+pi^!DcPi;>sJi;?'Jl:]=2d;>jDi
+;\`2-:f'q_:/";S8P)HC7R][/5sR\"r]C->#rXXu2`<QO1c$uf1(HZ:5<_4m3]TDi5X@Rr0`<R,
+.kE5$.P(KJ&Lf1[/1rJ42*NiU3]fJh6UWm33=7r34[i";90Y[,6N'7\6qBd;7n?3D91hfM9hkL[
+qbR3&r+>k>s(DCFrb2=G#\n-kD/F0.Df5Mls)A!Xs)A!V"`\R'F)uC#Es-W/GBeE3H38M?H[>[<
+s*OisJGDA-;?0YG;ui9aQiWVDrgOIhSXl@DT:hjNTq\<WUnjiarhg""WMuntX/rE%XTkr3Ydh3R
+\c',>]DfJC^&PhG^]2+)<%G&NWiE%sVl-DgUnjc[TqJ$LSt2C@R[KP1Q^3o%P`q8nOcYWbNfB!V
+Mi.Lj!f2VereCH,s+L<&r.=`qr.=j!s+LE+reCH.!/UW2!K)g7N+J!/O,oBbP*;,qQ'Rc(R@9V8
+SXuFGTq\<XV5C/hWN*#$Xfnt6ZEppH[^`lZ]Y(tn^qmn*`Pom=aihlPcHjkbdaQ^rf@S[/g=tH>
+hVd>NioB+]k2tjjl0@U$m-X3.n*fc9rpg-^o^r.U!quB_rV6EgrqcNhrqu]mo)=4?YQ'+~>
+JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nf.,gn*]T0m-Es$ki_*ijQ#7Xi83;Fg=b-1
+aiXG$$HgQ8bg4_ee_&[6ro!h8"6/;!iqSB-MY)c!M?&M%MZ1Bj_#D.N_ScAkrl+lVprEES#04a&
+`Pf^4r5&EFr4;d9rj_d7rO;j:q7-F5q6g:2rj)U1ricI*Y,qRhq*b3Nr^QlW+dJR8E-$,EH?ssi
+K8#5CO-5TeQ'du2TVJ6XVPpPtZaI@A]`,MC]_T2=]_]8=]`5V?])923]E,^[otULArP&?Jo>14=
+q8<3Mrl+cSs2Y)XqSrTWrlOrXqoa0'`l,[-]Xk\b[^WcU\$EEAWM?2[T:D:8Q'7AmOGo$PKn"T"
+H[:":VPBr]Tq.ZrF.8l.[]#aZG*8PWQtes*A:/BBFao4,>Yn4WIY!<6OI)H0T2/9W9ib7m;0\e0
+VN$UsOd)0!R[fq>T:r-ZW2m&&Y-7K%\,ZAgs,d9#rPefVs2Y/\rlP&[qoS3G!m-aprg4(]R[T_8
+S=Q4BStD\TT`Lm_rhKpuVPg>jW2ZesX/i?$XTYf1YHY7ts6mf(_#(tE_#;#%XK/A$WMl_lV50o^
+U7n9RSt;LCS"#k7R$X,(Q'@JqP*(ieO,f3YN/NRNM2@%EL]3&.L&Zi(KDgDqJc12uKE$W)L&Qi,
+LB*/0M.MR&N/WaVO,oBbP*2#nQ'IZ&R$jD4S=Q7DTV8*TUnsueW2cl!Xfek3Z*UdE[^WcW]"G_j
+^VI_'`5Ta:aN;WKc-FY^dF-Oof%8O,g=tE=hV[8LioB([jlYail07L!m-O--rpKmWnc&([oCW"S
+!quB_rV6EgrqcQirVZTloDX=@YQ'+~>
+JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nepuen*]T0m-Es$ki_*ijQ#7Xi83;Fg=b-1
+rKd8G"IPXISXo\Ns.K=a!,V7DoPF2;mr%c^!1!AG!L8oHQ2R$JQ2[$JQ._2pNW5"ANJrjVMuJS8
+Ll$rd6hs.L7K,dU7j2qu>?tQB@:<VWB4u'uE,p&CFa/1ZIXcp#KS>/9LPq+PrfHu=rK-`6!g&J(
+qi:Q7oT8s4rf[2Aqi^rBrK7/Eo9As6qj-oAs-NeQr0[AJrg<JKr0deYR@'8)P5^P\NfT-YMi*@I
+KRnT!G^4OVFE2;=ChdZsARo=[?<plBIsufnH[9pYA7Bh3JqSMoD.%7)B6d<3;GC@t?<:NHBhV)h
+DI?peCMe'4H$VqN7R]sD9hJiAI"-!KCi=<6FEVnSH$XgcIXZj!K7\dKL&]*j`VmgVa8a0UaT'B^
+aoKZ]c2Q#fcNV\Acd:%drR1_ps3q)"f)F8&g"P0Zg]-(.h#uTjhVR/dD>TOsPlI$HQKFP0Q2m9N
+Qj]=NR[]e:SXl@DT:l1W!MZ@gU^O#rVl-JlWN)u!X/u<&"Knr3Yd!KoglX:lX/`2!W2HMhUnjc[
+TqS-NSt2C@S!ob4Q^3o%P`q8nOcYWbNfB!VMi*CKM26tCreCH,s+L<&rIX`orIXs"s+LE+reCH.
+!/UW2AVuD)N/`jYO-#KeP*;,qQ'Rf)R@9V8SXuIHTq\<XV5L5iWiE/&Y-5(7Za7'J\%&u[]Y2%o
+^r!t,`Q#s>aihlPcHjkbdaZdtf@S^0gYCWAhr*GPj5]4^k3(sml0@U$m-X6?mfDqJrpg*]o_nFa
+p@n=[q#C0hqY^6hr;?Nbrdk*Qs*t~>
+JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nf72hn*]T0m-Es$ki_*ijQ#7Xi83;Fg=b-1
+;,L0h:]F2h9`\!brDNYo!)i_lr_iPR!'L-AoK;J'pce^Sr(m>frD3Dh!)NSjr)*Gis%iSi!`;in
+r)*Jpr`/ttlVdd_qGmMoqc!>jqc!G\q*b3Nr^QlW!^8k2r]19G4?Yeg5!(h)5Q=%Z6UaL67nH3@
+7S?BK9MPC[qbH!Dnkf9^!)WMfr_NSjr_3Afo2#6[q+pi^!DcPh;?'Pj;#jGk:]=2d;>jDm;]J\3
+:JOY\9hJ#N84uNF7R]a15sRUq4?GVb3&`hr2-2[n1c$mD1bpjQ5<_7o4ZYSg5<_:r4?GM[3&`]K
+2^KCj-8%&1/i#@G1c@6V1c@<S4?c"t6Spha3Bo\g4?uP590YX)5XRk*6UjR87n-'A8k_lN9MP.S
+qdo\;rFZ1FB4q0Vs(VXPD/O4gD?=`oDuO\ZEH#l8DfPbs$Zg?/F)uGGG'8(SH2MsoH$Xd`H[L6j
+J,2>*;ZB\J;ur;Org4(]R[T_8S=Q4BStD\TT`Lm_rhKpuVPg>jW2ZesX/i?$XTu#4YHY7@\[hXL
+s1A<D!58?Fs1eTJgf,u/X/`2!W2HMhUnjc[TqS-NSt2C@S!ob4Q^3o%P`q8nOcYWbNfB!VMi*CK
+M26tCreCH,s+L<&rIX`orIXs"s+LE+reCH.!/UW2AVuD)N/`jYO-#KeP*;,qQ'Rf)R@9V8SXuIH
+Tq\<XV5L5iWiE/&Y-5(7Za7'J\%&u[]Y2%o^r!t,`Q#s>aihlPcHjkbdaZdtf@S^0gYCWAhr*GP
+j5]4^k3(sml0@U$m-X6?mfDqJrpg*]o_nFap@n=[q#C0hqY^6hr;?Nbrdk*Qs*t~>
+JcC<$JcFF'o`"gfrqu]ks8)ckrV-Tkp@e1Po^i(Q)tEFdn*]Q/lg!`ukN:mej5T"ThVHu@g=Y$"
+ans-laihoOc-Xqhf%]!;iSieTio9"rMY;o,MY)beMZ(9i_#;(M_ScAks2FuWouI*P"NAC!_nu;e
+pq#h&oXOn0rjMj5#-kJ<Y->(1rBpBKrC-`Ur'r0$SSiCeFED_RI"6d$M2[OXP*;/tR%'_@TqeEZ
+Vl-W%ZaRKY]=Y_gqRc^=rOW*C]D]AB]D9&9]CWZ;]tV7spV6^CrP&?Jo>14=q8<3Mrl+cSs2Y)X
+qoA`XrlOrX$H^?/`594#]=GJ^rjFr!['I!>WMH>`SXc+7Pa7GoNfT'TLkC;/I=-EhVkp/^U7e$D
+G&j4PWN;k_O)p&DI>Cs,96,>UEI3M%r_P+BI=[00Ng,s%TV#"V92&,^<)cbOTr"TFO-#QjQ^O;4
+SXuFHVP^;mY-"o!YdON-Onlur`rF*VaS3gCa:X]'QC!u+R@0M5S"-%?St;RIrh0[nUSO]^VP^8h
+W2]cr!NW=$XTGZ/YPtcms7!l%_#M7G_#M.rXK/A$WMl_mVPU)aU7n9RT:VXFS"#k7R$a5+Q'@Jq
+P*(ieO,f5!N!>2tM2@%EL]3&.L&Zi(KDgDoJc:9!KE$W)L&Qi,LB*/0M/S90N/WaVO,oBbP*2#n
+Q'Rc(R$jG5S=Z=ETqS3VUnsueWN*##Xfen4ZEppG[^WfX]=bhl^VRe)`5Ta;aND]Mc-FY_dF6Uq
+f%8R-g=tE=hV[8MioB(\k2tjjl07L!m-O--n*fc8nac8BoCW%Ts7ZKerV6Egs8)WirVZWmo)=4?
+YlB4~>
+JcC<$JcFF'o`"gfrqu]ks8)ckrV-Tkp@e1Po^i(Q)Y*=cn*]Q/lg!`ukN:mej5T"ThVHu@g=Y#D
+rg*GJ#+1aDR@9Y:r1F"^s.KFerG2@Jqec@Ls)%CEokjA>s)%dRrKI;GplkcDqNh#DqNh,G!0mDH
+duOEes,7/>Mi!7HM2;*tq*b0Ms$loV,'A09?!L`D@:E_ZBPD:#EcQ8FG'J=]IXcp#KS,#7Ll..N
+qiUi=p5]9:O,s0uqiCB2qiUi?rK6u?rfd;D!0d#=p6GN@op>]Gs-NYNr0RDMpmEIrR@';)P*(ie
+NK0!XN/EFJLkL>.I!U![F`hbEE,TN,BP:sf@UT1B86g[pI=-?dGB7;'H[^HnH#mh/BQ%3e5smk;
+>XMOuASX_*7n@#tB52:%F*)\Q84Z3>7nlZN8o&g&IV`n<DfKi@GBeCYH@,X@"+YrTKCafq`;dgS
+`r3sWa8j9Za90Q,bKK\*rm(Mh#ggoEdF-IldaJ-Ds3q/$f@S[Sg&Kb+g]$",h#cHhhYM*bPQ-mI
+Q2?m0Qi33^Q'R`&R$a;0R[]e:SXl@DT:l1W$DO;kUnsrcVl-Jmri-""XT#='Y-5&.YjDDGOX@01
+WiE%sVl-DgUnj`YTqJ$LSt2@?R[KP1Q^3o$PEM)kOH5H_NW+k@Mi*@JLkpicLAuu-K`$K$K(OWn
+K)C9$K`?c*LB!#/M#N6LMMmFPNK0'\OHG]hPE_>uQ^F/.S"#q>StD^MU84T]Vl-MoX/rG+YctF>
+['d?O\[f>b]t_=u_Sa=2`lQ6DbKS5VcdC.heCE.%f\,!5gtgiEi8N\Uj5oFckNM0plKdg'mI'H3
+nF5u=o(2JFrq6<bs7cKes7u]kqtp?irVc<dJcDtSJ,~>
+JcC<$JcFF'o`"gfrqu]ks8)ckrV-Tkp@e1Po^i(Q*:`Oen*]Q/lg!`ukN:mej5T"ThVHu@g=Y"T
+;,I6fs%`Me"AVcj;H!Km!)i_l!)iJOrB1*CoK;;"s$$EYpeUW\r_`Ge!)`_nqbd;mr`/ttku7R\
+qGmMos&8hpr)<P]q*b0Ms$loVs#pZL3'0/^4Ztq+3sIi55<hM&62j:]84c?C7S$0F9heDY:]*uZ
+:B45Y:[q9\;#jGh:]=/n:JOVY:@h9Y;#*o`:'"-eqbdAkq,.)dr_WDf*`>j3:ejh^9M7rM8P2ND
+8ju0:5X.Ru4ZYVd3]K)XrAO[4!];ekr\H2_5X.Lt5!1ka5X7P!5<Cqd2)[<I/hJ(c-n@#*/MT.D
+0/b^F1c@9R4?c"r6UWj23>k%D4$?#*9M.K55<qS&6pjF47n-!@8P2TKr_<#[q.9J9rFZ+Drb)4D
+"DMXfD/K/f$u^$$DfBZ8E,TZ6EH1kr"ES[-G'<k0rHeKhs*F]l"+5NFIel5';ZB\L<"YC]QC!u+
+R@0M5S"-%?St;RIrh0[nUSO]^VP^8hW2]cr!NW=$XTGZ/YPtd+\Gs,<])TAD]Y2#U^Akn&<$n]I
+WiE%sVl-DgUnj`YTqJ$LSt2@?R[KP1Q^3o$PEM)kOH5H_NW+k@Mi*@JLkpicLAuu-K`$K$K(OWn
+K)C9$K`?c*LB!#/M#N6LMMmFPNK0'\OHG]hPE_>uQ^F/.S"#q>StD^MU84T]Vl-MoX/rG+YctF>
+['d?O\[f>b]t_=u_Sa=2`lQ6DbKS5VcdC.heCE.%f\,!5gtgiEi8N\Uj5oFckNM0plKdg'mI'H3
+nF5u=o(2JFrq6<bs7cKes7u]kqtp?irVc<dJcDtSJ,~>
+JcC<$JcFC&o`"jgrVZTjs7u`krV.W3p@e1Po^qbGo'u5<n*]T0lg!a!kN:mej5T%UhVHuAg=Y$V
+ans-db0/#QcI(.lf\G?_iVqj:Mtr7pM<Bcp^Au(J_#_Ejrl"fTrl4WOrl,)[`5BF.r5%s8lad#)
+pp^71"gYD<Ycb,,6hs.L7K,dS8,l+,PFQK-E-$,GH[L6lK85AFOHPflQ'[i*SXuOLUnjlbW3*A4
+\%KBP]DB2>]DK5@]D/u9]CWZ;]tV7spV6O>o>11<qSW<Nrl+QMs2P2^a2e/"rlP,]0$2/Q_S3[q
+]",>Z[C<TPZ*^^8USFQUSt2=;QC!bsOH,0SL4t;2I=$6dVP^2brh)iSRsK1GTWGc$RuhfKOF_j`
+78%WI96#E;N(d&FH%1O(NK9EqTV#"U9MA/V<E)po<hZ:cNfK6cPa.W)R\$(BSti0[WN<5(YO\p(
+s88#T`W*mV`W*pXa8<sQamI1KPl[2;rg4@eR[]e:SXl@DT:hmOU8"EYUnssfV[KH&WiE,#XKAV-
+Y-7i/!3tqkn%nP0rkBVXX/`1uVl-DgUnjc[TqS*MSt2C@S!fY2Q^3o%P`q8nOoCCFNfB!VMi.Lj
+!f2Vere:K.KS98UrIXWlrdt'#s+LE+re>?HLkpnEMMd=NN/`jYO-#KeP*;/rQC!u,R[]e;St;UK
+TqeEZVPgAlWiN8(YHY:;Za@0L\@K2_]Y;.r_8=+/`Q-'Ab0/#ScHstee'uq"f@\g2gYL]Bi8ESR
+j5f=ak3(sml0@U$m-X60n*olHncJFTo`"O`p&Ojcq#:*hqYU0hr;?Nardk*Ss*t~>
+JcC<$JcFC&o`"jgrVZTjs7u`krV.]5p@e1Po^qbGo'u5<n*]T0lg!a!kN:mej5T%UhVHuAg=Y#D
+Qi<<JQi<?]R@B_<T:hjLT:hjNCM``\rG;IMnndo7pMU"J!L&cIPPCCBQ26dHQ1gO<Q1^1:O6ho'
+NW+t;NW+n:MZ8M6Lkkprq*b3Nr^QfUs%"JYG[+KZ?sd;N@V07dCi=<7F*2YMG^+RaIY!*&KS,#7
+Ll74QOcfX)p5f68!0@#;q2b62qiUi?rfR&?q31E7op,H@nX'0@qj7;LrL*\QC6k*KP)tcdNfB!V
+MM[1GKn=f&H[9s\GBIqGDf'?*BkLse@pr_P?<r)2IslZkH?j[F@X<BQLO4/\?tsLd?:6_:<Eqgk
+?Y4%?84[&rASGsuEccSP84Q-=77BpE9M%m)I"#mICi497rcSZoH$XgbI=Hg!JqAXGL&8dg`VdaS
+a8a6\a8O*Zap6,6bg"AVc-613rm(Mhrm:PjrmM/&e^`7&f@\d0rn7_6gt^`@h;-lBgt_gEs-38A
+s-*MKqj-B2s-EYL!LB)OQkPmVS"#q=SXuFFTV8'RU8+N[V5F6i$`L&)WiN2%Xf\b/YPta+Z0hSH
+OWgg,WiE"qVl$;dUnaZXTq@pJSXc1=R@'A.QBd`"PEM)krf75CNJrgSMZ/G6LkgcbL'!'^K`$K$
+K(FQmK)C9$K`?c*L2Vj'Ll$tGMMmFPNK0'\OHG]hPEhE!Q^F20S"#t?StMdNUSO]_Vl6SpX0&M-
+Yd(L?['mEQ\[oDc^;%J"_Sa@3a2lBFbKS8Wd*^:jeCE1&f\5'6h;-rGi8N\UjQ5OdkNM0plKdg'
+mI'H3nF?MK!qZ'Vrq6<b!;HHerqZTjqtpBjr;H3cJcE"TJ,~>
+JcC<$JcFC&o`"jgrVZTjs7u`krV.c7p@e1Po^qbGo'u5<n*]T0lg!a!kN:mej5T%UhVHuAg=Y"T
+;,L0h:]F2g9a"6g;,L6j;ZK_o;>WKN4755o4TS>TpeU`_s%iVjr_`Mgs&&bnqb[>iqH!Sqr)DoZ
+s&Anrqc*GkrBpBKr^HfUr($cX!Bi^H3WV6&r]M#Z4Zb_g5!M;"6:"".7R]m>84Q0A9MGC[nk]9^
+mSE@Lr_`\lqbR2f!)NPgo2#6[peUc^!DcP^;#jGk:]=2h;#jGk:/st\8kM`K8P2NC6q'F,5sROr
+4Zkhf3B9#W3&NTM1c$sE0/5+85X7Ou5!;%i3Bo_n5!D%h3&W]Q1bUF%*@WKo/hJh93&!3J1Gq*O
+3]oYn6UN^frAb*H4?GYd92%tW57p.J6UF1/7Rp!>7nH9F8kViPnkT3r!+bt<r+>n?!+u4Cs(DIJ
+C2<fcrb_gTDJj=jD?XrtDfBW6rc.sYrc&9dFEM_LGB\:WH$]F7s*=Zlrd=`o!.Oi/!)rShs&/qt
+<SpdTPl[2;rg4@eR[]e:SXl@DT:hmOU8"EYUnssfV[KH&WiE,#XKAV-Y-7i/"L5JH\[h[Mrk/6D
+rk8HI^:rB%+fq`EWi2hnVPU)aUS=HUT:VXFS=?"9R$a5+Q'IStP*1t,Ns1Q'N/W[PreU]4LPPk`
+!el;\r.Fs"o7?mmr.G$&s+UH,Dhj.)M2@+IMi<USNfT6_OcklkQ'IZ%R$jD4S"6.BTV8'SUnjlc
+W2ZetXf\e2Z*L^C[^N]V]">Vh^VI\&_o9U8aN;TJbg+M\dF-Lne^rF*g=k<;h;7)JiSrnYjlY^g
+kiq?slg4!*mdKW6nc&(\oCV\Sp&F^cp\jmdq>^<gqu6NkrUTr=s0;TS~>
+JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb*;&jno'u5<n*]T0m-<j"kN:pfj5T%Uhqd,Cg=cDG
+r5]8fb08)ScdL=pg>1Zcir=u6Mu&>$M#`G2M<Toq^Au(J_#_Ejrl"fTrl4oW!6G&XrPelV_u@ON
+_#hE_\aR,q\c'&:[g0=JZa$g?Z*"!mq*b3Nr^QfUr^d&\.@639Df]uCH$asfJ:iT7NKB9dPE_B"
+R@Bb?TqeE[VQ$]&ZF.3Q]Y(rU]`5VD]E#YE]E#S=])B84]E>j]^VKTYq7uU<pVQaDrPS]Tp;[-Q
+s2Y2\r5eoYI`B@D_7dFl]=PJ[[^EQPZa$a:W2$&[St;I?R[B>'PE:i_M26q@Jpr/sH?aRPE,0,s
+?='"DF-ro3YH4=[Men0'?tVlJCjo)uI#3hV;,MUgL5M"UR[g$K:ese[:K:=m;,W^RVP]?6Ocu#p
+Q^F23SXuFGVPU2jXf\b0o!#D!rK6inrl"iUs2P)Zr5e`VmE#<ls-3VNQi<?^R@9V7S=Q4BStD[L
+Tq\=]U]mTlVl-Jmri-""XT#=&Y-7i/s02R0mf2dmnA,(=0W_=TWi;qpVl$;dUS=HUTV%gHS=?":
+R@'A-Q'IStP*1rhO,o<\N/W[PMM[1GLPPk`s+UK+rIb*$qLSWrqgn]trIb-'s+UH,C57V$M2@+J
+Mi<USNfT6_OckomQ'IZ%R$jD4S=Q7DTV8*TUnsrdW2cl!Xfek3Z*UdE[^WcW]"G\i^VI_'`5Ta:
+aN;WKc-FY^dF-Oof%8O,g=k?<h;@/KiT&tZjlY^hl07L!m-O--rpKmWnc&(\oCV\So`Fj]p\jme
+q>U6fqu6NkrUTr=s0DZT~>
+JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb*;&jno'u5<n*]T0m-<j"kN:pfj5T%Uhqd,Cg=cFk
+rg*JKrg3hVR[]k>r1Nq&rbV=EoP=MEr+te<r,2CqplkiFQBh<4!13GGp6GQ:pQ#04muI(##E4Ot
+Ll$nDLAjR97/fXS7f5dU8H27.G'$tp?!guI@Us+aBl%[+EccDHG'A4XI=?]tJqSf2M2@%IN/s(p
+O8b7<Nqnb0OSb1=P5^U?P51=5PkC==QL^C?R/<3XR?s8+Q'@JpOH>N`rf%nVM2@%CK7JAuH?j^X
+G'%bEE,9B+BP1pg@prbPra#P-:KUXs;c6G6ARTh4Kn+SpEGJ]kAkl)[<Dd*i<aTHS6:a[S@:a1j
+DKBuG7n6*?7n$-H9M%ftI"$N\D/=-2F*2VKG^4R\H@:6kJUrH*KCX`q_u.FQ`V[[R`ra?&a8O'd
+b0.uPbg"AVc-4E2c2Q#fcNMVBdaHPBdf._peHOOUf@\d0rn@A,rS@M/!ScE.D>9@mPQ-mIQ2Hs1
+QiE<MPl[2;rg41`R[]e:SXl@DT:hmOU8.^`"f8)oVl6ToWWB0%riH4(YPtd+YlM)ts4rekXK/A$
+WMl_mVPU)`U7n9RT:VUDS"#k7R$a2)Q'@JqP*(ieO,f3YN/NRNM2@%DL]3&.L&Zi)KDpK!Jc:2s
+Jc13!KE$W)L&QgALPUbCM2I4LN/WaVO,oBbP*;,qQ'Rc(R@9V8SXuIHTq\<XV5C/hWiE/&Y-5(7
+Za7'J\%&u[]Y(tn^r!t,`Q#s>aihlPcHjkbdaZdtf@S^0g>(N?hr*GOj5]4^k2tmll0@U$m-X6?
+mfDqJrpg-^o^r.U!quB_rV6EgrqcNhrqu]mo)=4?ZN#F~>
+JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb-M6p#o'u5<n*]T0m-<j"kN:pfj5T%Uhqd,Cg=]D&
+;Gg:f:JX_\rCmDi:JandrDNer;*I2B4nLl:4n(Su4oJ1V:A[ib;#O2i;#X>f;#aDm;Z'Dl;#a>k
+<WH.r<rQ+q<:!Q`<;]bp<;]Yp;Z9&Z7/fXS7f5dU8H26^5<Sm)+?DSI4Zkki4$5Si5=%V&6UF72
+6q0[;7n?-C9MS>Y:JUX[r_W&ZnPK3^s%rSgr_NSjrD)r[qb[&`qb@/f;"7B_;#O/i;Z9ED9i"PX
+8kVcJ8kMWG7R]d869dh#5X.Co4$#D^2`N]T2Dd6H1c$pC1G^a@1,(Qa1++e;5<qFt5s77h2`*BJ
+0eF[j.4?l&/2B+D0fCpH2)mZZ4[;>&3&pmt%6-O54$5Jn9M@uA5=%R66OlOQ7Rop;7nH9E9M.uP
+:%D'YAcH<;Ac-0>B)lQCBE)WIBkhF"rb_[Q!c;gmrbVXQr,2UTEr0hWEc_5&"*Sm4GlE!gGlN$j
+H@(#:HiSTn4oJ=Q;ZB\Q<<&3_Pl[2;rg41`R[]e:SXl@DT:hmOU8.^`"f8)oVl6ToWWB0%riH4(
+YPtd+Ym%GC\[f;_rk&0Bs1JKJ]tOEZh,H)0X/`2!W2HPjV50l\TqS-OSt2C@S!ob4R$O#&P`q8n
+OcYWbNfB!VMi*CKM26qBreCH,s+L?'rdsutrdalsrIY!#s+LE+re>0CLkpnEMMmCON/`jYO-#Ke
+PE_>tQC!u,R[]h<StD[LU8+N\VPgAmWiW>*YHY:<ZaI6N\@K2`]Y;.r_SX71`lH0BbKJ/Ucd:(f
+eC<($f@em3gtgfDi8ESSj5f=ak32'olKdg'mI'uB!V#XYncJFTo`"Lbp@n=[q#C0hqYU0hr;?Na
+rdk*Ts*t~>
+JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb*q]'po'u5<n*]T0m-<j"kiV$hj5]+Vhqd,Cg=aQg
+rlP&Y%*?]:bg+Saf%Ad7i8XWmpP]!-nqldl!/pZ1r4`6IrP8NO_u@UR`W!mVa8X0Wa8X']`Pf[2
+_Yh4S^qmju\[o?N])B84]'Hm5\@/iRZa@$CYHRpmq*b3Nr^QfUr^d&\s%4;pS8E1aEccPPH@:6m
+K8#);O-#NgQBdf)R[p%DUAgtpVPgDpZEgjH\c05C]=bfU]`GdXpq$F9o=P1=^;%JX^\P\9_>(nC
+_u7LR`W!mW`V[XTa8X-h`l5m6_7mRm]=YVa[^Q1CDR?^QYH=e"US"-JSsbt6Q'@MrO,o<[LkUJ3
+J:)WfGH,_$CLq!^?!CK7=BS[OH[M-=G]&8)Ck#2mAUI6hHA7GU;,L5@KntbPR[g$H;,0h[=&i3t
+<)TBbM2dUZP*D6!QC454SY2RJVPgAmriH1(nZ]4srK6rprPe]Qs2>&Za2e(ur5nBJ*0QMMQ'IZ$
+Q^F/.R[]e:SXl@DT:hmOU8+N[V5F6i&ZD\/WiN5&Xf\b0YHY79Z*L_(s7*qt_#D(K_#D)%X/`2!
+W2HPjV50o^TqS-OSt;LBS!ob4R$X,(P`q8nOcYWbNfB!VMi3ILM26tCreCH,!/19&rdt*"pji9n
+rdt*$s+LE+re:W4LkpnEMMqImAW;_2O-#NfPE_>tQC+&-R[]h<StD[LU8+N\Vl-MoWiW>*YHY:<
+ZaI6N\[f>b]tV7s_Sa=2`lQ6DbKS5VcdC.heCE.%f\,!5gtgiEi8N\Uj5f@bkNM0plKdg'mI'H3
+nF5uIncA@Srq6<bs7cKes7uZjr;6Hjr;H3cJcE(VJ,~>
+JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb*;&jno'u5<n*]T0m-<j"kiV$hj5]+Vhqd,Cg=c@i
+!1*MKrg3hVS"6.Crh0:+qJ5nCr+kq@j_amYpltcC!g]+:rg*PMpm1Q;p5f!/r/^E/q2PE5#)e@s
+M26n@r^6KLr^HfUr($`Ws%35_'QeP&>[:TA?t!MSAnPdmCi=<6FERS,&UAbQIY!*'KS>29LkghG
+N/`tuO8b7@O8Y+7O8b4@Ont1:Oo:IBOnt7:POat4Q26g;Qi*47Q^3u(Pa%>mO-#?]NK&mVMMd7E
+LP18/I!U'_GBJ%LEcQ)9CMRTrARf4Y@:*;G>_-$\<`Dsp:JOSW91qkU>o[m%@9[D`='Ia]9jC%b
+?"Ie=84Z6[A8,muF*;g+8,c4&928*+I;E_:D/XH8FEM_MG^+O]H@10jJUrE)KCOZp_Z.OP`;dgR
+`qd[Ta9'K+bP]Qac2Prdc2Q#fci2;kdJhSoe,Ro$e^i='f\$2V!SZ<,g]H<eh#?%.h#;0kD=s.j
+P6-u6Q2?mAQN3?DQQ20PPa.N"QC!u+R@9V7S=Q4BStD[LTq\<XUnssfV\,l,WiE,$XKAV-YHP17
+Z*CU@mf2+*0<;+QWMl_mVPU)aUS4BST:VXFS"#k7R$a5+Q'@JqP*(ieO,f3YN/NUOM2@%EL]3&.
+K`Hf(KDpK$JbXcnJc:9"KE$W)L&Qf2LPUbCM2I5jN+J!/O,oBcP*;,qQ'Rf)R@9V8SXuIHTq\<X
+V5L5jWiE/&Y-5(7Za7'J\%0&]]Y2%o^r""-`Q$!?b0/#RcHjnce'uq!f@\d1gYCWAhr*JQj5]4_
+k3(sml0@U$m-X60n*oi:rpg*]o`"O`pAamcq#C0hqY^6hr;?Nardk*Us*t~>
+JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb,4tKto'u5<n*]T0m-<j"kiV$hj5]+Vhqd,Cg=]D'
+;Gg:fr_NPhrCmDi:JandrDW_Zq*+[="[5(45!D./55dY;4R501:]4&c:]=2f:]=2i;>F#h;,[9g
+s%r\j"Ai-#<`]0!qH!SqqGco^s&Anr!`W)trDW\_q*b3Nr^QfUr^d&\s%<;U*&]f=3'',_3''2c
+4?>Ve4$Z(r5smt*7RTX784WYM#>7Z_:/4MZ:Amuf;".9M;#X>l;#=&f:]O;i:@h9Y;#!i_:&n)[
+;$'He;#X5g8cVN`8h*A'7R]d86U3t(5X.Fr4$,J`3B&rW2`3KM1GUaC1,UjE6SUDS1GU^A1&`pa
+0f(XC1H.0M2)I*A.2sQZ/h\\.2*<QM2)I0M3^#Yl6:Npn3]]8c5!(nj4A&:35X@Y#r^6ZQs$d>d
+7n-$@8k_fM9MP%Prac%?rabn;r+>tAs(;4B"DMUdCi')f"`A0oDJa4hD>nJQE;snXE;jhaEcZ>E
+F`qqPG^+N4GR&M?H@(!dH[Ga>!'^BFmns-aiD^e[PE_>tQBml)R$jD4S"-%?St;RITqS3UUnjia
+rhgL0WN)u!XK8P+Y-5%5Yd(I=ZadNV])92?]E#YE]`,SE^@>2%;t*a>X/`2!W2HPjV50o^TqS-O
+St;LBS!ob4R$X,(P`q8nOcYWbNfB!VMi3ILM26tCreCH,!/19&rdt*"pji9nrdt*$s+LE+re:W4
+LkpnEMMqImAW;_2O-#NfPE_>tQC+&-R[]h<StD[LU8+N\Vl-MoWiW>*YHY:<ZaI6N\[f>b]tV7s
+_Sa=2`lQ6DbKS5VcdC.heCE.%f\,!5gtgiEi8N\Uj5f@bkNM0plKdg'mI'H3nF5uIncA@Srq6<b
+s7cKes7uZjr;6Hjr;H3cJcE(VJ,~>
+JcC<$JcF@%p&=pgrqu]ks8)ckrqQNf!;?Eb)t`amo'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2DgAT+l
+ans-dai_iOcdC:pgYLcbN:Vu)MY)c&MYrD.MZ/P5M?JjP^q[Y`_#;(M_ScAkrl+lVrl>#ZqoA]U
+!Q;nT_YM%J]DfDA]DfD>]CWW&\H04NrjE'=Za6m@YX:eR7/fXS7f5dU8H29[8g$cnO`#,ZF*DhS
+I!pKmJ:rc:N006eQ'Rc(S=Q4CU7n=[V$EotWj/q<\%)CM!5/*<rO_[6"22F`_"YV>_",>:_YM+J
+`;ddV`r<sT`WjE"_8*aq\,NrT\@8lSZa6sDYcY(1WMcG`St;C>R$jA+rfRePNK/mPKnP#*H[0gY
+Wi)fpU^<cfSp+@>='/UOrI"Ql3dZ=(8nWKB96PoG:Jt%eIY<Q=OI2Q2;,C%_:/=kh;cJU3MMmLV
+OHYooQC454SXuFFVPgAlXKSb/n$&qorfQoms2FrTs2>/[`Q#p<a8F$Wam[=NOo^c2rfmeUQ^F/.
+R[]e:Sc52iT:hmOU8+N[V5C/gW2]cr#-4i-Xfeh1ricO1ZEggCnGi$pr4r?IqS<'E0ttE(X/`2!
+W2HMhUnjc[TqS*MSt2C@S!fY2Q^3o%P`q8mOH5H_NK&mUMi*@JLkpicLAuu-K`-Q&K)L8oJGk&u
+K)L?%K`?c*L&m'creYQNMi<USNfT6_OcklkPa.N#R$a;2S"-(AT:qsQUnjlcVl?\sXKAY0Yd1UB
+[C3TU]">Vg^V@V%_o9U8aN;TJbg+M\dF-Lne^i@)g=k<;h;7&IiSrnYjlY^gkiq?slg4!*mdKW6
+naZ2@oCMVRp&Facp\jmeq>^<gqu-HkrUTr=s0M`U~>
+JcC<$JcF@%p&=pgrqu]ks8)ckrqQNf!;?Eb*;&jno'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2Dg6h`'
+!1*MKrg3kWS"6.CT_E4$CZfO2D>\;BD>KIkPl$aFQN!6GQM-UDQM6I?OSk16NrP13Nr+eCN/NXP
+M2@"CL-n?(7/fXS7f5dU8H29[8hE\ZF'DjT?=72N@V'.aBkqR%Df^#DG'A1VH[U<lJV&K,KS>,8
+LkpnHN/`p\rK$u=q2bN:rfR,?qiUi?rfR&?q31B6q3C`@ns;G(Q'IPrOcYWbNK&sWNJi[NMMHq@
+KRnW#I!L!]F`_\GE,]]2CMINrARo:Y?=$oB>_.HUIXQTiG]mWs9`Ia-?!^fB?=.)I?X7&H4A]9I
+6<[i577g$@?t<tfDf^&Hr'qVn9he;UC2@X$CMdj,EcQ8EGBeCYH[:'fJ,Y!#K7\aFL&]!f_>qLP
+`;[aR`r=!Y`r3sXa8sE*rlbJfbfn90bl5ldcMl/hd/MGmdK%bqeGe%uf`0V)gA]k*g]cHfgYCQ;
+rbhForK[>Gs-*JIs-<MJq3V)Hp6YfB!L&cIPmNbCR$a;1S"#q=rgjRkTV8'RUSO]^VPg>jWW&n%
+X/rG*Y-+u-YQV5:ZEpn,s4rejXK/A$WMl_lV50o^U7n9QSt;LCS"#h5R$X,(Q'@JqOcYWbNfB$W
+N/NRMM26tCreCH,s+L?'rdt*"p43*mrdt*$s+LE+re:H/M#N6LMMmFPNK0'\OHG]hPE_>tQ^F/.
+S"#q>StD^MU84T^Vl-MoX/rG+YctF>['d?P\[oDc]t_=u_Sa@3a2lBFbKS8Wd*^:jeCE.%f\5'6
+h;-rFi8N\UjQ5OdkNM0plKdg'mI'H3nF?&>o(2JFrq6<bs7cKes7u]kqtp?irVc<dJcE(VJ,~>
+JcC<$JcF@%p&=pgrqu]ks8)ckrqQNf!;?Eb)t`amo'u5<n*]T0m-Ep#kiV$hj5]+Vhqm2DgAY%N
+;ZBSo;#X8j:Amlh:/=\`r_rPSqE=mBrBC'Bs$$<C!'L6Dr]KR2s%iPfnk]6]r_`Mgq,%,grD3Gi
+o2YTes&JtrmSa*br`/qsr_rhaq*b3Nr^QfUr^d&\rCR,a5!8d()EKr?2`No_4Zkhi3^,hp5!_J$
+5t"+07Rp$?r^d&]#"qZc9i"M\n5&OMr_`\lqbR2fmSE^VpeUob!)NPg"A_ik:f.'e#u=;l:JO\]
+91hhU9,^Ao7nQ9@7R]d86:+(+5<_1m4?GS`3&rrX2uYZ61Cl2q1GL^C69mh$5!:qf3C!L!,;M)3
+1c$sD1bpjE1Ggm5-7p]!0/PU@2E*NM2EEr`5X@as3;to@3'KAd55m\Y5=%Lu5X[n+6q'O67n5s<
+8P2WKr_*;dn4isnrF>n>rFGb9rFQ%BrFZ%A!GH6HD#.uKD#S;ODZaruE,bbqs)J*\rcJ-_rHJ<d
+rcnEgs*FfnH[Ga>r]TsQq,@;ks&7uXs,mDHPl?pSQC!u+R@9V7S=TYN%A0;eTq\<XUnsrdVl6To
+WWoN*Xf\b/YPta0Z*L[AZap(Hq7HX=s1Rr%qG[#c0<D4SWi;qpVPU)aUS=HUT:VXFS=?"9R$a5+
+Q'IStP*(ieO,f3ZN/W[PM2@%EL]3&.L&Zi)KDpK$JbFWmJc:9"KE$W)L&Qf-LPYqdDi0I3N/`jY
+O-#KeP*;,qQ'[l*R@B\9St;RJTq\?YVPg>kWiN5'Y->.9Za@-K\@K2_]Y2(p_8=+/`Q-'Ab0/#S
+cHstee'uq!f@\g2gYL]Bhr*JQj5f=ak3(sml0@U$m-X60n*ol;o()DDo`"O`pAamcq#C0iqYU0g
+r;HTbrdk*Us*t~>
+JcC<$JcF@%o`"jgrqu]ks8)ckrV-Tkp@e1Po^i(Q(@gn_n*TK.lg!`ukN:mej5T"ShVHu@r5eo[
+qoB/eb0/#Rd*pOugkq$cN:Mo+MY)c&MYN,.MYrD._#;(L_u@UR`W!mVa8X0Wa8X'[`Pf[n_YCt:
+]CNQ(\HKFO\$`[DZi@<16hs.L7K,dS8,c'Z8c;9]9E.[=S8E1_EcZDLH$k!gIt<'&M2R@VPa%Gu
+QBmu1StDUITq\B[VPg>lX0T+?[(!TUqmua<rOi0Dq7HgC^;%JX^\GV9_>(nC_u7MM`Q#d3_8=%&
+]tV%d\\#G_[^WWMZE^[<XKJY(VPBfWStDL@QC=,*PED#hNfK'SL4b,0IX?6\F/l+5USFNWT:L1E
+R]*Bj[&9LYIXQZmHi8BmIK>"MrdQSMIt3*#J:iZ;OI;T2;G^2@JqAQ,L4tJBMkc>oOHPinQC454
+SY)LJVl$DmYH>"oYc[s*On6Kk`V[UR`W*sWa8<sXamd@OOoCLkPE_>tQC!u+R@9V7S=Q7CT:hmO
+U8"EYUnsrdVl6SpWiN5&Xf\b0ricI/ZEjJ9nGi$prP8?Gr4r9Gs1Tq_WiE%sVl-DgUnaZXTqJ$L
+SXc1=R[KP0QBd`"PEM)kOH5H_NJrgSMZ/G5Lkktas+UK+rIb*$rdjZkrdk'#rIb-'s+UH,!JcL1
+M.qj*N/WaVO,oBbP*2#nQ'Rc(R$sM6SXuFGTqS6WV5C/hWN*#$Xfnt6ZEppH[^`lZ]Y(tn^qmn+
+`Q#s>aihlPcHjkbdaZdsf@S^0g>(N?hr*GOj5]4^k2tmll0@U$m-X6/n*fc9rpg-^o^r.Us7QHe
+rV6Bfs8)Wirqu]mo)=4?[/YX~>
+JcC<$JcF@%o`"jgrqu]ks8)ckrV-Tkp@e1Po^i(Q(@gn_n*TK.lg!`ukN:mej5T"ShVHu@rg<;D
+"dk^HS=Z>CCB&)CD#A)ED#/#EDYS)EPPLI?Q2[*KQhZm@Q2Hs@O8P+<O62K&MueforeU`5LI4H)
+7/fXS7f5dU8H29[9)hQa9I"dc>$G<=?=./O@q91bBPVF$Dfg/HG'A.TH[UBlIt<0&K7s5Ys+gl:
+N/`dUOHKC#rfI#>s,d,?rK@/BqNCW;o9B'9pm1iE8sYa.P`q8mP)tcdO,f3[NK&mSM26tCKnb53
+J:2imH$OXYG&q\CE,KK.CM@HoA7]4[@U35C>Ch<RI=6HhG]mV)H%CTuK6h]YrEfP1rF,_611F[%
+@preU@:E\S@q][sEclXt84I3(B4bdjBkhBuHu!P7E,p#BFa&+UH?sseIt*$#re'Qk!5SNLs24lT
+rPeZR!lr=#rPo8dai_cLbfn8Sbfg"0rltGfrm1SjrmCbo!7Uqs!nGoSrn%;*g=lP\!8RM,"kqY`
+g2:g"Pl-gDPl?sIQKsk;OoCLkPE_>tQC!u+R@9V7S=Q7CT:hmOU8"EYUnsrdVl6SpWiN5&Xf\b0
+ricI/ZEjJ9nGh=,.BBJKWMl_mVPU)`U7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieO,f3YN/NSmM#iEf
+reCH,s+L?'rdt-#o76gkrdt*$s+LE+re:H/M#N6FMMmFPNK0'\OHG]hPE_>uQ^F//S"#t?StMdN
+USO``Vl6SpX0&M-Yd(L?['mEQ\[oGd^;%J"_SjF5a2lBGbK\>Yd*^:keCE1&g"P08h;-uHi8N_V
+jQ5Odkiq?slg4!*mdBQ4nF?MK!qZ'Vrq6<b!;HHerqZTjqtpBjr;H3cJcE+WJ,~>
+JcC<$JcF@%o`"jgrqu]ks8)ckrV-Tkp@e1Po^i(Q(@gn_n*TK.lg!`ukN:mej5T"ShVHu@rDW_o
+!Du\m:]F2g9a=Eh:f1+h4?W0tq*+R<r]]F,s%iMes%iVhpeUlcr_`JfqbdAir(m;gn5]Kf!``9$
+rDinur)E)_!`W)sr`&nbq*b3Nr^QfUr^d&\rC[)_s%F7o3&rrZ3BB5`2`Ei\4$#Je4?5Vk5sR\&
+r^$fX6q'R77nESMs%<Gg:/=Xa;"mcT;#X>l;#=&e;#F,e;#*ob;"m`e:/=[a:'FEj:/F\]r_=/(
+9hS,Q91hiL8k;ND7Ros<6:4(+r]q2^4Zkef3B0&[3]B#X1GpsF1bgfb1_N/A5<h=p4ZbYg5!M:t
+5<V(g2uYW91,CaDr\FR12#]?82Dm<K2?#KZ3BTDg5smLh3B0&Z3BB8a4Zbi$5X.Iu6pj@2779U8
+84Q6C9)_K`:$bXSA,0[4Ab]m;B*)a\C\qrHD?"GPD?"JWDfBZ8E,bers)J?cFEDYKGB\<1G63#7
+H2DpeHiJKn4T\S];ta,_;rpsYOoCLkPE_>tQC!u+R@9V7S=Q7CT:hmOU8"EYUnsrdVl6SpWiN5&
+Xf\b0ricI/ZEjJ9s1/0@rO`*@rk&0B!57o%pf$lc.BBJKWMl_mVPU)`U7n9RT:VUDS"#k7R$X,(
+Q'@JqP*(ieO,f3YN/NSmM#iEfreCH,s+L?'rdt-#o76gkrdt*$s+LE+re:H/M#N6FMMmFPNK0'\
+OHG]hPE_>uQ^F//S"#t?StMdNUSO``Vl6SpX0&M-Yd(L?['mEQ\[oGd^;%J"_SjF5a2lBGbK\>Y
+d*^:keCE1&g"P08h;-uHi8N_VjQ5Odkiq?slg4!*mdBQ4nF?MK!qZ'Vrq6<b!;HHerqZTjqtpBj
+r;H3cJcE+WJ,~>
+JcC<$JcF@%o`"jgrVZTjs7u`krV.N0p@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mej5T"ThVHu0r5elZ
+qoB#ab0/&TdFHnIMYrD.N;JM5MYi>3MYi51M#E2-MXcT+^qmkb_#D1M_>qLQ`;[aT`r=$XaSX$W
+`WX9!_o'@b_="r(](ifD\@8rU['d<KZa$`%q*b3Nr^QfUr^d&\rC[)_s%NGe2OLdeDfB]:F*2eU
+I!pNoItNQ5N/j$bPa7T#Q^4)2StD[KU8"N]Vl-JjWN*#$Za@-J[^WfYrOi0Dq7HgC^;%JX^\GV9
+_>(nG_[OK#^Vdn']t:nd\%'!J\Gip.[Bd*BZ*1=1XfJ=pU7e0OSsu4:Q^=#'PEV,lO,f0TLkUJ3
+IsQEbG'%]%VPL#\TV%a@F)7>A\$WH3PDj=6S:#Qd7<<0kIt@TK"b(rOJUr@NJH^XVJqAW+rIQ&@
+K7el3KV>3:UQ:P"PEhE!S"6(@StW'ZW2d#&YNE'lrrA2G`;dgV`rF*EaT%>TOcklkPa.N"Q^F/.
+R[]e:SXuFFTV8'RUSO]^VPg>jWMuntX/rG*Y-+t4Yd(I=rj2X3o)J6rrP83C!5SNIs1\N5-E3rA
+Vl$;dUnaWWTV%gISXZ+;R@'A.Q'IStP*1rhO,o<\N/W[PreUo:LPLV=KnY25rIb-%rIONirIP!#
+rIb-'s+UK-s+^T1reY0CMi<USNfT6_OckllQ'IZ%R$jD4S=Q7DTV8*TUnsrdW2cl!Xfek3Z*UdE
+[^WfX]=bhk^VI_'`5Ta;aND]Mc-FY_dF6Upf%8R-g=tE=hV[8MioB([k2tjjl07L!m-O--rpKmW
+nc&(\oCV\So`Fj]p\jmeq>U6fqu-HkrUTr=s0_lW~>
+JcC<$JcF@%o`"jgrVZTjs7u`krV.K/p@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mej5T"ThVHubR.lpI
+QN!3RR$jG7C[Gm4C]A5GC\hlBD>J/LD$#ocPl-aBPk^OCQN!6GQ3*>;QMd$DQLKt8OSt7)NrP(=
+N;\Y:M26pSq*b3Nr^QfUr^d&\rC[)_s%NGe"*]W+>5hb=?!^uK@q94aBk_@#Df9]=Fa!b.)L6^X
+I=?]tJV8`0L5(J;LkpnDMi<XTNfT<aqiUo?qiUi?rfR&?plk<6q3ClD&!`BDQ'@GpOH>NaOH,<\
+NrG#9N/NOJM2-h?KS+i*I=6HhG^+CTF`VPCDf'B.C2%<mARf4X?X@&B=^#!ZJ:;lmHZjUS@U+5-
+L4Xu#E,/TkE*lj=2cW[[@:<VR@pieT@U`mHA,TpA@qB1]AnV'U)/">FI!][HDfKf>FEi"SH$Xgc
+IXcp"K7ej?L&Ssf_Z7XQ`Vd^Ua8X*Xa8a3aaihlObKKb+rltGfrm1Vkrm:eqe'n<Grmh/&f\$2W
+rn@S0gY1E9rn7;)!H+1mPl-gDPlI$JQL1%=O=u`ZP*;,qQ'Rc(R$jD4S"-%@StD[LTq\<XUnsrd
+Vl6SoWiE,$Xf\b/YHY79Z*OA8s0V@sgl_W:-E3rAVl$;dUnaWWTV%gISXZ+;R@'A.Q'IStP*1rh
+O,o<\N/W[PreUo:LPLV=KnY25rIb-%rIONirIP!#rIb-'s+UK-s+^T1reY0CMi<USNfT6_Ockll
+Q'IZ%R$jD4S=Q7DTV8*TUnsrdW2cl!Xfek3Z*UdE[^WfX]=bhk^VI_'`5Ta;aND]Mc-FY_dF6Up
+f%8R-g=tE=hV[8MioB([k2tjjl07L!m-O--rpKmWnc&(\oCV\So`Fj]p\jmeq>U6fqu-HkrUTr=
+s0_lW~>
+JcC<$JcF@%o`"jgrVZTjs7u`krV.N0p@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mej5T"ThVHsdrDW_o
+s%rbmr_NPhrCmAh:Jas`4RtZ754q/=541Q84?Yk,:\IQY:]=2i;>O,e;?'Ji:B=9fr_W#_qc*Sq
+!*9)!qc*2d!`DrqrDEV_q*b3Nr^QfUr^d&\rC[)_s%NGe*^;hJ3B0#Y3]]>_2`a#^4?Yhi4$>_k
+5X@Y#6:4%*r^6fW7n<PLr^m,_#u"&f:/+M\:JjpW;#X>l;#=&e;#F,e;#*oc;"mcc:`W;,:JO\]
+:/=MV8P)QJ8k_iM8kDNC77]p<6:4%+r]plV5!;"i3]f;^3B$jrs#'m71]B3I1GgmE1c%Ha5<_7n
+4$#8a4[2+p4?GP^r\Y!</M&"b.OQf)2?#K?1c%!J2)dHR2`1Ll%lH1)3B0&Y4$5Se3)!"=9)_'f
+6:4.0779U87n-'A8kVfN9hjeGrF>b9qdoP7s(;LKBkqO$C]/&LD>\2PD/O92rc.sW"`\R'F*)O'
+Fo?IdGBS1TGl2jfH2`-iHiABm4oJ=O;YF&Q<<&%5OcklkPa.N"Q^F/.R[]e:SXuFFTV8'RUSO]^
+VPg>jWMuntX/rG*Y-+t4Yd(I=rj2X3!4i*?!5&0?rk&3CnPo-Zq,IBo-E3rAVl$;dUnaWWTV%gI
+SXZ+;R@'A.Q'IStP*1rhO,o<\N/W[PreUo:LPLV=KnY25rIb-%rIONirIP!#rIb-'s+UK-s+^T1
+reY0CMi<USNfT6_OckllQ'IZ%R$jD4S=Q7DTV8*TUnsrdW2cl!Xfek3Z*UdE[^WfX]=bhk^VI_'
+`5Ta;aND]Mc-FY_dF6Upf%8R-g=tE=hV[8MioB([k2tjjl07L!m-O--rpKmWnc&(\oCV\So`Fj]
+p\jmeq>U6fqu-HkrUTr=s0_lW~>
+JcC<$JcF@%o`"gfrqu]ks7u`krV.Q1p@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mej5T"ThVHu1ans0Z
+ans-_ai_iPd*qWErJUK1s,6c3!/pi6pPJd)o8EUas1nWMrPJQO!6"fSs2P&YrlFrVrl,)[`5BL0
+otgC7!5/0?rjr-Aot(18r4;a8s0W$:['Hs@6hs.L7K,dR8,l-[8c;9]9E.]b:&ds):RRGbDfKl>
+GBeC[I"$QqJqSf3LPh(Rrfd_TQ^=)0StVjNU&LbkTqnT`VlH\pri6"$&$`LL[C<WT\@K/]]=bkm
+_"YV=_"PVC^];(I^DFVt]Xk\b]"5D[\$i`S[^NQN['R'DZ*F;4%'6D/X/2PbTqS'KR[X5B&!iHE
+PE:ldO,f-SL5(>2IK"KkF%(#FVkg)]TV.mGRs/jfS=ZdjU7.0eOI(c3DG+V^H$4RUIu9;@;MpB]
+JVT,CP*qf2K7JN*KM5*><10>NTqnEXO,oHfrfmq]S"6.CSu/B`WiW>*YN)jjs8U"#`;[aU`rF*H
+aT%;IOHG]hPE_>tQC!u+R@9V7S=Q7CT:hmOU8+N[V5C/gW2ZesX/u<&!NrX*YQ;#7rj2X3!4DCt
+o"k:?o"Y4=/uu"PWMcYkV50o^U7n6PSt;LCS!ob4R$X,(P`q8nOcYWbNfB!VMi*CKM26qBre:K.
+KS9;Vs+:6$mstCgs+:3%s+CB+reCH.EeoR/MMmCON/`jYO-#KePE_>tQC+&-R[]h<StD[LU84T]
+Vl-MoX/rG+YctF>['d?P\[oDc]t_=u_Sa@3a2lBFbKS8Wd*^:jeCE.%f\5'6h;-rGi8N\UjQ5Od
+kNM0plKdg'mI'H3nF?&>o(2JFrq6<bs7cKes7u]kqtp?ir;H3cJcE1YJ,~>
+JcC<$JcF@%o`"gfrqu]ks7u`krV.K/p@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mej5T"ThVHuaR/N?O
+QMd*LQN*9PR@<ndm:u3-rbVUO!,V7Ds)%gRrfmGHpQP`EQBqH6rg*PMoToKAp6P$*!0I/?l])4.
+N/ELLM24Op7/fXS7f,^U8H29[9)hQa9`@cd:*i\[FBVjR>@(WD@:<VUB4kmkCMdp-DfBf@Fa/+T
+H$b!gIXclurdb3*KnY89reCf9M2I.KN/`gXO8b7?OTU]-P*5g,qNCW;oooH?rfR>FP*>m-s,d2?
+r/CrANK&mTN/<DhLj4W,K7e](I=?KgG^":OFE2D@E,TW2CMIQtB4PO_@UNMJ>[(E8It2urI!g9c
+G'7D+>^:[HKR%ZV?uBsr:/X)I='Ag9=CGfXAk?fU?t*_`D/OE:G\(DsAn4G$9MB\YH[L6hHu!P;
+EH6,CG'A4WH@($gIt3+LKB%[c_Yq@P`;IUP`rF*Z`r3sXaTBW.bl5fbbQ?&5bl5ldcMl/iciDJm
+df.]$eCE.$f@S[.g&9V)g&B_&g&KdmPl6mDPlI$JQLL7@O!TmMP*2#nQ'IZ%R$a;1S"#q=St;RI
+TqS3UUnjiaVl-JmWiE,$riH4(YPta,Z*OA8s0Md6o)IO./uu"PWMcYkV50o^U7n6PSt;LCS!ob4
+R$X,(P`q8nOcYWbNfB!VMi*CKM26qBre:K.KS9;Vs+:6$mstCgs+:3%s+CB+reCH.EeoR/MMmCO
+N/`jYO-#KePE_>tQC+&-R[]h<StD[LU84T]Vl-MoX/rG+YctF>['d?P\[oDc]t_=u_Sa@3a2lBF
+bKS8Wd*^:jeCE.%f\5'6h;-rGi8N\UjQ5OdkNM0plKdg'mI'H3nF?&>o(2JFrq6<bs7cKes7u]k
+qtp?ir;H3cJcE1YJ,~>
+JcC<$JcF@%o`"gfrqu]ks7u`krV.N0p@e1Po^h\Fo'u5<n*]Q/lg!`ukN:mej5T"ThVHsdr)<Vn
+s%rbmrD*DgrD!;ep,r@:rB0^8r]^<GrBC'Br''p>rB1*C!'L6Vs%WPipeLW\r_WSkq,%#es%rJd
+"&Mch;"7Qc<;oku<)rcor`/eop/Cle!(6QMr^HfUqa^ZWs%3/]s%EAcr_<Df+AY0a2E!TU3BB/]
+3]K2^4?Yki4utei5<hJ!5sIV$6pprBr^HoY7fGsX8H_XY8kMeV:&dug:]=2j:]F5l;,I6hs%rSg
+o2,9Zs%r_m#>e2k:/+JZ:]=)j:eFF\8d%d\91qkU8,l*]6q0ZF6kD[Q5XRk(4?bni4?GVc3&itt
+3!;,u1c.)h1BB?hr\P9E5X7Ou5!;%k3B9>h4[)(q4?5D"2EiiJ-Q=?`/MT+81c@BU2aBSa2)mZY
+4?l(t3B0#[1cdW]4\JIC9MA)P5X.M"6psI56q9a:77g'C9M8&R:#f"KA,9a6AbTdGB5)*rCM[d$
+CM[g(Chs#d"E&-sE,khq!HN8ZFT6L\Fp<2:H$Xd^HN&3iHN&9kI/d+B;tEo\;sRE_O!TmMP*2#n
+Q'IZ%R$a;1S"#q=St;RITqS3UUnjiaVl-JmWiE,$riH4(YPta,Z*OA8s0Ms;\[f;^\bir?]=beg
+nl5*WrDYDMWiE%rVl$;dUnaZXTV%gISXc1<R@'A.QBd\uP*1rhO,o<\N/W[PMM[1GLPPk`!el;\
+rIb-%rdjNgrdk*$rIb-'!/:E,s+bWNM2@+JMi<USNfT6_OckomQ'IZ&R$jD4S=Q7DTV8*UUnsue
+WN*##Xfen4ZEppG[^`lZ]=bhl^VRe)`Pom=ai_fNcHaeadaQ^rf%8R.g=tH>hVd>NioB+]k2tjj
+l07L!m-O--n*fc9nac8BoCW%Ts7ZKerV6Egs8)WirVZTlo)=4?[f:j~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqI`4p@e1Po^qbGo'u5<n*]T0lg!`ukN:mej5T"ThVHu1b/hX$
+a8j?Ya90T.b_thFrJUT4rep]3oniR'oo&^`rkeWOs2=fRs2P#XrlFoU"ieO"_o'@__>V"H^&>VD
+]`>_E]`>_A]D];@]CEK0\HTIP['?m?q*b3Nr^QcTs%*/]rC[)_s%NDds%WPir_Ol,Zu9f"EcH2F
+G'\L`I=?ZsK7nr5L5M%TPa.Q#R[KS6S=lIGrh'apUSFQZVP^8iW2ZetWiQ-#s/l:(s0)X2Za-mD
+os=V)!joAErjMg5!42[1s0Dd6[C#q@s0Mj4Za9V9s0+#YYc=V!Wi2kkTqJ-QT:VL>Q^!c#P`q;n
+OH>K^Mi*CHL4t/.IXH?`E,fdpV*^lKT:VU@RWrdfS#*Hf]!@rpNcKl8JT"pdF)-8"DgR1tMG$j)
+H[gd.Nff]uTV.d?:/4MW<E+gHTV/'RU5Y.oP5UXTS"-%@T:VpXW2Zl#Y-6]dZ2ad?n&5(?"N89u
+`lA"unAmAFO,oBbP*2#nQ'IZ%R$a;1S"#q=St;RITqS3VUnsrdVl6PnWiE,$Xf\b0YHY79ZEjJ9
+!joACo)J<tr4qm<s1\N5+fVE<Vkp2bUS=HUTUqaGS=?"9R$a5+Q'IStP*(ieO,f5!N!>2tM2@%E
+L]3#0KnP-XKE$Q&JaS'fJcC?#KE$T)L&Qi,LBNEiM2I5jN+@p.O-#KeP*;,qQC!u+R@B\9St;RJ
+TqeEZVPgAlWiN8(YHY:;Za@0L\@K2`]Y;.r_8=.0`lH0BbKJ/Ucd:(feC<%#f@em3gtgfDi8ESS
+j5f=ak3)!nlKdg'mHs?1n*olHncJFTo`"O`pAamcq#C0iqYU0gr;HTbrdk*Xs*t~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqI`4p@e1Po^qbGo'u5<n*]T0lg!`ukN:mej5T"ThVHtTR$X0=
+R/WHOQMm0MQ3*ChC]8/BC[Gm3C]/)AD>\5BPlI$JQMd$HQN!6DQN*6AQKF5.OSk1/NrP(@MM[1F
+q*b3Nr^QcTs%*/]rC[)_s%NDds%WPir_NuGMHX.f>[C`E@:E^FA,g0@B`DiYD/O<5FEMbNH$FU]
+I!pHmrI5'&K7SZ/L4tB[L]*#7M26tFM2I.IN;\b4Nr+h4NW>(<NW>(<M\qG4NJrdRN/imWN/NRO
+M2-nALkpe=KS"jUJJN]_H[C$_GBS(NF)l;@E,KN0CMRWtBDuHA@U<JL?!^c>=atmJI!^3cG]e.>
+?sJ#+Km\Z*G&hG(Bkq0[8NBgJ?UIgu@VTRD7r2RCASZ.$F*)\QF`U&D7n-3IDL?eXI=-EXDJa?4
+EccGJG'S=YH[L9lJ:N6(KAM=]_uI[Q`VdaT`rO-X`rO3Zb5TT`bl5lec2c,gcMl,kd*^8?df.\s
+eCE+Kf)s[Yg"QDXqq1o$s4Z@prg!MLns;+lO,oBbP*2#nQ'IZ%R$a;1S"#q=St;RITqS3VUnsrd
+Vl6PnWiE,$Xf\b0YHY79ZEjJ9!joACo)IO.s/I6AW2HPiUnjc[TqS-NSt2C@S!fY2Q^3o%P`q8m
+OH5H_NW+k@Mi*@JLkpicL'!'^K`-Q'K)U>hJGt-"K)L?%KE-`*LB!#3Ll$tGMuJZGNK0']Ocklk
+Pa.Q$R$a;2S"-(AT:qsRUnjlcW2ZetXf\e2Z*L^C[^N]V]"G\i^VI\&`5Ta:aN;WKc-FY^dF-Oo
+e^rF+g=k?<h;@/KiT&tZjlY^gl07L!m-O-,mdKW6nc&(\oCV\Sp&Facp\jmeq>^<gqu-HkrUTr=
+s0hrX~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqI`4p@e1Po^qbGo'u5<n*]T0lg!`ukN:mej5T"ThVHsd<)Z]o
+;u]_r;,I0d!)EMf!'Tm8q`Fa=oKE4<rB:*Cs$-BEqE=a=qbQu^q+prcr_`Phr_`Sip.tZa!*8\k
+oi(okr)E\rqGd2frDNGZr^HfUqa^ZWs%3/]s%EAcr_<Df!)NSj*^2_I2`<WT3B9,[3B0&Z4$5Yi
+4$,Pe4[2.r5X@\$r]pu[6UO7177Ka:6q9d>8c)-Y9DV?^:&n#d:AI]^:*`V09MJ2U:/+DS91qfK
+8kDWJ9M8#N8Ol6A84c<?7Rom76:!m96N08L69ICn3BB/]4#o>\3''#X2`<QO1c.!E1bppE1,CaO
+5X.Fr4?P\d3^>nm5<hCs4?>J]2)[<K/h8+d.OZu(.kie=3\`QX1c@<S3]fPk6UX@4r]1iU5WhP1
+9h\5R9L1g.5XRq-77K[87n,uI8d%g[9MJ7<:B+i)Ac60:Ac63@BDlECBPIB[!buLdrG;LNs).dS
+"`J@!EH6-tFT6L_Foll4Gl2geGlE!fHN/?lI,n3';sdO>NfT6_OcklkPa.N"Q^F/.R[]e:SXuFF
+TV8'RUnjiaVl-JlWN)u!XKAV-YHP17Z*L\7ZN@MA[Jm]@]",A_]=PTP])]D4<:s/i<;fbo<<&sA
+WMl_mV50o^U7n9RSt;LCS"#h5R$X,(Q'@JqOcYWbNfF$s#)e@qM26tCre:K.KS9;Vs+:6$mXY:f
+s+:3%s+CB+reCH."GhnkMMqImA;uV1OHG]hPE_>uQ^F/.S"#q>StD^MUSO]_Vl6SpX0&M-Yd(L?
+['mEQ\[oGd^;%J"_SjF5a2lBGbK\>Yd*^:keCE1&g"P08h;-uHi8N_VjQ5OdkNV6rlg4!*mI'H3
+nF?MK!qZ'Vrq6<bs7cKes7u]kqtp?irVc<dJcE1YJ,~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqI]3p@e1Po^qbGo'u5<n*]T0lg!a!kN:mej5T%UhVHH#bK9b(
+rlG,]qT&ZYqhs]rqMY**reUW4re^N0pP]$erPJQOqo&EO!64oVrlG&Ys2YGc`l?!9_o'@`_>h:N
+^\tkJ]tV5Y^&5VE^&PbB]D]>=\H0:Pr4;g:"h2"M[^EL<7/fXS7f5dU8H29[9)hQa9`@cd:&n)h
+;#aBP;H)tID/O?6FEMeNGC+U\I=?`uJqSi4L5:kMO->lsQ^XA4S=H1AStVjNTqS6UUSFW^V5L8j
+VuEOsVlQkuWiZ0$s/u7&s0)L.r3-1)ricU3ZEpjAZ*4/2s0!HGYdCgFXf&+oVPpAfU7n6QStMO<
+Q^F&'QBm`!P5^PZO,f0TLl$q?KS+o,IslWcF`MA8VPU#\St2=:QZd=`R\@?mZD3kPN,k#>Q[Na[
+<D$hFHusFYM3!<gB8h=mM2d[aS"64CQVU@O9N4u0StMdQTq[O.Ocu&rQB[f,S=Q:FTVeTaWN<5*
+YNi=mnF?IDp9:n'qSVjApqm<S`Poj:a2dbl.#j7JO-#KeP*;,qQ'Rc(R$jD4S"-%@T:hmOU8+N[
+V5C/gW2ZesX/u<&#-P/6Yd(I=rj2X3s0Vj8o`+O!r4qj;0#"?cWMl_mVPU)`U7n9RT:VUDS"#k7
+R$X,(Q'@JqP*(ieO,f3YN/NRMM26tCre:K.KS9;Vs+:6$m=>1es+:3%s+CB+re>-BLkpnEMMmFP
+NK0'\OHG]hPE_>uQ^F20S"#t?StMdOUSO``Vl6VqXKAY/Yd(O@[C3QT\\#Mf^;%J#_o0O6aN2NI
+bg"GZdF$Fme^i@)g"P39h;7&IiSrnXjQ5Oekiq?slg4!*mf)YUnF?MK!qZ'Vrq-?dp\4X]s7uZj
+qtp?irVc<dJcE4ZJ,~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqIQ/p@e1Po^qbGo'u5<n*]T0lg!a!kN:mej5T%UhVJ1!!1<bP
+!1<_OrKdGL!1*@qnS@`2phTnGs(qaPoPOSDpQYQ?rg*PKqj.5JrKdJMm$@[:s,m;Bi/dSls,I&;
+!K2j27/fXS7f5dU8H29[9)hQa9`@cd:&n)h;#aAr;H'iC=^(f0"^YSC?t!LC@h!$`B5)*rD/XB3
+EclMJrc\`pH$O^_I"$NoJUi=MK)^H*KS>,5re:T1LPL\AL\Zc$M>W82M$AcnMM[.FL]3*FLPCS?
+Lkgb?K7ec,JV&B"I=$<dH$=IUF`_bJF)l5;DJX0+CM@HoB4bXbART"T?X6rA>$+jUI=6KgGBS(L
+A7&SeI#*3%H$!t??#==o?r]ca4&K'b>?>3ECh?7>D.7!gCi+06G'\@Sr^R\m9MAc?H[L6hHu!S:
+EH-)CF`qtSH2`*mI"-WrJc:;eL&\OYFS:Ci_o0Lk`V[XVa2Z-ua8a6Zb5TT`bl,fdcMu2jcMl/h
+dJhSne,Ro(e^i='f\+s1f[p&R!8%5&rn.;*gm%i(s-E;D.#j7JO-#KeP*;,qQ'Rc(R$jD4S"-%@
+T:hmOU8+N[V5C/gW2ZesX/u<&#-P/6Yd(I=rj2X3s0Vj8o`*a0s/ITKW2HPjV50l\TqS-OSt2C@
+S!ob4Q^3o%P`q8nOcYWbNfB!VMi*@JLkpicL'!'^K`-Q'K)U>gJGt-"K)L?%KE-`*L1uF!Ll$tG
+Mi<USNfT6_OcklkPa.Q$R$jD4S"6.BTV8*TUnsrdW2cl!Xfek3Z*UdE[^WfX]=bhk^VI_(`5Ta;
+aND]Mc-FY_dF6Uqf%8R-g=tE=hV[8MioB([jlYail07L!m-O--rpKmWnc&(\oCV\So`Fj]p\jme
+q>U6fqu-HkrUTr=s0r#Y~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqI]3p@e1Po^qbGo'u5<n*]T0lg!a!kN:mej5T%UhVD+/<)iip
+"]J;s;,L0f:]F/i4S_/54SV#:4SLu=55@A<55IGA4TA4W:B"&a:A[ia;#X>h:]OAi;"[W_;#=;i
+<W,ku;cH`j;u]eu;cH]l;uoospJV&iq*b3Nr^QfUr^d&\rC[)_s%NDds%WPir_WVl##\Ad4#]&V
+rAXm<3B/tr3r_>M4$#Ga4$>\j5<qO55lO(L6N9CS6q'QB7K>sX8-):Qr^d)\r^m2a9);3X9E@d[
+r(@Sn91qfF84Z<C8kDTF84Q9Cr^HoW7fGaU5=GK<s$6oU5sdau5!;"ir](fV2E3]X3B/uS2E*NP
+1c.!I1c.'H2)I*Fr]`b64?PYd3']Yj5<V1n4ZbY_2)dHN1+jt!+<N-b0Jk=92**]V4$PMZ3B]Jg
+5XIk-763Fi3BoYn8khuQ92%W85sRg:7/o[a6q9^:7n?3D91qrQ:$PLR>5^\Z:AeZ"Abfp>B4u&Y
+C]A/KC]8,MD>nGQE;a_TE<:0&FT-@\F9$I_G5ZXdH$K12s*FZk!IRi0;ZBVj;ZB\b<%*`dO,oBb
+P*2#nQ'IZ%R$a;1S"#q=StD[LTq\<XUnsrdVl6SpWiN6#XTkr3YctC;ZMq31[/[N<[^ioX\[o?M
+])oRS\*d5j;u'DmW[k'IVl-DgUnaZXTqJ$LSXc1=R[KP0QBd`"PEM)kOH5H_NJrgSMM[1GLkkta
+!el;\rIb-%rdjHerdk*$rIb-'!/:E,BnqM#M2@+JN/WaVO,oBbP*2#nQ'Rc(R@9V7SXuFGTq\<X
+V5C/hWiE/&Y-5(7Za7'J\%0&]]Y2%o^r""-`Q$!?b0/#RcHjnce'uq!f@\d1gYCWAhr*JQj5]4^
+k3(sml0@U$m-X6?mfDqJrpg-^o^r.U!quB_rV6EgrqcNhrVZWmo)=4?\,Us~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb*VAsoo'u5<n*]T0lg!a!kN:pfj5T%UhVHH$bfe*,
+a8X0[ans0RMs#upMu8J4MZJ]nr/(K4qhk3-"2_mk_YqCJ`;IRS`r!gUaT'<ZaT'9^`l5mq_uIUH
+_>h=H^\Y\E^\PSF]tD#T]DfD@\c98@]DfDA\H'/=\,Wf8Zhd)h7K,dR8,l-[8c;9]9E.]b:&dug
+:]=0C;,U:j;cK$(QY^PZEHH;GGBeIZH[:-jJUrE)KS>/8LkpqKOHG`kQ'n)/R[p&KT*h6`T:qpN
+T:qsSV>[:iVuEXnWVrh0WN)qtX/rJ0YcOk(W2HSmVl$<iVZ<OlUAghiTUhO=R@!o=rf[_QOHGZb
+O,]*WMMI)gL1Z-jJq&2rH#n%HDf'?dVPKoXS=Gq4G&_8cUq3M0TU1b!DhXa;Ap[fSChn-C:OI;5
+L5_$`;i6ZdKo;"UR[p.EQqgCM9iG"fJY8[1TqRI-OHc#qQBmu0S=Q:DUSaodW3!/)YNW4in,`'F
+qNq#^ZiC'Cm)8V8#fO^$`l?'>aN4A$q8b+GNK0'\OHG]iPa.N"Q^F/.R[]e;St;RITqS3UUnjia
+Vl-JmWiE,$Xf\b0ricI/ZEjJ9"LPSE[^Pi.o>1C@n\>+</?5\JVl-DgUnj`YTqJ$LSXc1=R[KP0
+QBd`"PEM)kOH5H_NJrgSMM[1GLkkta!el;\rIb-%s+0Hcs+13%rIb-'!/:E,!JcL1M/J3/N/WaV
+O,oBbP*;,qQ'Rf)R@9V8SXuIHTq\?YV5L5jWiN5'Y->.9Za@-K\@K2_]Y2(p_8=+/`Q-'Ab0/#S
+cHstee'uq!f@\g2gYL]Bhr*JQj5f=ak3(sml0@U$m-X60n*oi:o()DDo`"O`pAamcq#C0hqYU0h
+r;?Nardk*Zs*t~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb)"dFjo'u5<n*]T0lg!a!kN:pfj5T%UhVJ-u"IGF@
+Q^I`<rKdJMnndc1rbDIKs(_RL!,DIJs(h[NrG;LNs).LH!,VCoqj%2IrK[8Grg3YNrKli9rg!>B
+rf@,@rfI/Br/^u@OHAmkr/U`8!fMqnqF(<Or^QcTs%*/]rC[)_s%NDds%`Sir_Ob8;GpFl<-DMi
+>$5-8>[(N@?X[DQA7K.]AnYmnC27[(DZ4VTEs6]0G'J7WrHeKk!e#NHrdP*%JUrE)Jc:8tKDL6*
+KnP/5Knb?]LBE9aJqO#Q!.t)urd=ipH$K:3(NaeAF)l;@E,TZ4DJX0+C1q<nAn>L`@fBau?X6r@
+>$5!0IXQZmH?a[VF(AT^H$kEqJU)<RC0G:lAQ)i'3DrdW?q"I+?tF(e6:l$4@V'=lDf^)JH$0*V
++@](!95/^"I=-EXCi465F*2VLGBe=WH?ssgJ:N6'K7iBArNlQGqK2Oerl"`Rq8WBRs2k8_rQG5b
+rQY5brm1Vk!7Ceos3q"t!S,d#f)jUVfDa>&f[naSf_a>)g6@heQ/7c*Q1U@nN/`jYO-#KePE_>t
+QC!u+R@9V7SXuFFTV8'RUSO]^VPg>jWN)u!XKAV-YPta-Z*L\7ZNRYC[C3O9s4regWi;qpVl$;d
+UnXQVTV%gHS=?":R@'>,Q'IStP*1rhO,o<\N/W[PM2@%EL]3#0KnP-XKE$Q'Ja.dcJcC?#KE$T)
+L&Qf-LPYqdDMj@2N/`jYO-#KePE_>tQC+&-R[]h<StD[LU84T]Vl-MoX/rG+YctF>['d?P\[oDc
+]t_=u_Sa@3a2lBFbKS8Wd*^:jeCE.%f\5'6h;-rFi8N\UjQ5OdkNM0plKdg'mI'H3nF5u=o(2JF
+rq6<bs7cKes7uZjqtpBjr;H3cJcE7[J,~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb-hR$$o'u5<n*]T0lg!a!kN:pfj5T%UhVD+/<)cdo
+;H$Ll;Gg:f;#O2b4S_/84SLr94Sh5@4odbF55m_A55IDC4AYrOr_EPi:\mi`:]!uf;>!`f;,C%b
+pJ:]`r)Nbts&Jtr!)rkrlVdmb;c?Zk;uT\k7/fXS7f,^U8H29[9)hQa9`@cd:B+,h:`iP4;H$Ln
+5;,)W2)dKS2`NcW3]T5]3]fDc4Zkeg4$!:%!BiOD56=):5l<qI6N0@L7/]RU7n3>FrCHlWs%*,Z%
+7W`R779O4779O26pa3=6iTOX6UF+)5=594*BcMI3BB,[4#o>`3B9,[2DmBN1c.'I2`!9H1c7/i1
+f6%n5X.Lu4ZYYc5X%=q4[)"k3]T,U2)I0E/Lqq`,qUW$0K(R>2)mZP2EsGb2`j/c5X@b)76!:g3
+BoYj7SHEJ92%W95X@e+77B^87Rom;r^[2b9M8&R:$>@N=o^b_5P\(PAGg$:Ad`6`AnPdlCMR[#C
+23``rbMROrbhaS!,hdSs)A-]F)uC$F8g:[G5HLcH$FT4H2i3iHN8Hk;sI9X;>sJn;t<m=N/`jYO
+-#KePE_>tQC!u+R@9V7SXuFFTV8'RUSO]^VPg>jWN)u!XKAV-YPta-Z*L\7ZN[_D[C3NQrji$>"
+hV@U[^ER1<;TVh<%P&KW2HPjV50o]TqS-OSt2C@S!ob4Q^3o%P`q8nOcYWbNfB!VMi*@JLkpicL
+'!'^K`-Q'K)^DeJH(3#K)L?%KE-`*L&m'creYNMMi<USNfT6_OckomQ'IZ&R$jD4S=Q7DTV8*UU
+nsueWN*##Xfen4ZEppG[^`lZ]=bhl^VRe)`Pom=ai_fNcHaeadaQ^rf%8R.g=tH>hV[8MioB+]k
+2tjjl07L!m-O--n*fc8nac8BoCW%Ts7ZKerV6EgrqcNhrqu]mo)=4?\Gq'~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb(\I=io'u5<n*]T0lg!a!kN:pfj5T%Uhu1e$bf\$*
+a8a6\ao0<OMs#ufMuS\3MZAY3MZC]o_tM%H`W*sTa8!aU`s0Q&`Pf[2_XtYI^q[Xu_"PPA^A>V@
+^&bp[qn)d;r4<0E\[T#T['TWtr^HfUqa^ZWs%3/]s%EAcrCm>g:J^sd!`;inr_kdU<E<.ZCi!m(
+EGoi<F`qqRH$=O\I!pKpJ:W<'K8##9Ll%%INf]EfP*2#nPa@c,SXc1>SXuFGrLj4cr1O"^s.]Xk
+USIg_!i)H^rgsLgT:VUES!f\2Qi<:sP`qAsPEM#gP*(c`NfB!WMi!CMM26q?L4b&-IXQTjG'.eC
+E,TWiUnscXSt)=?QBuW0B:>?qYH41WNHV1ZQ?RI]8o/<dHV\R)Jr5VE9i=iGIY*3/Nff^!StMTN
+:/+GV<)c_ETVSBWUQ:M#Q'IZ#R@B\;T:_kWVZa$$XfnqjYl*tknX'6@q3V&a!N2g&s89e&`:_%J
+_udot`qmaQaT%2GNK0'\OHG]iPa.N"Q^F/.R[]h<St;RITqS3VUnsrdVl6SpWiN6#XTkr3YctC;
+ZMq31ZiIN5[e0Ul_>V1=^F6grWMl_mVPU)aUS=HTT:VXFS"#k7R$a5*Q'@JqP*(ieO,f3YN/NSm
+M#iEfre:K.KS9;Vs+:9%q1/9jq1/Krs+:3%!ec8]re>9FLl$tGMMmFPNK0'\OcklkPa.N#R$a;2
+S"-(AT:qsRUnjlcW2ZetXf\e2Z*L^C[^WcW]"G\i^VI_'`5Ta:aN;WKc-FY^dF-Oof%8O,g=k?<
+h;@/KiT&tZjlY^gl07L!m-O-,mdKW6nc&(\oCV\Sp&Facp\jmeq>^<gqu-HkrUTr=s1&)Z~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb(\I=io'u5<n*]T0lg!a!kN:pfj5T%Uhu&lDR$X-8
+Qi<9NQgS\PC\hlED>eAID>'4eQ2?mBQNWV@Q^4!-QMm'KP4k%:OT1I8ORS;3NfF$rs,-\Ar^HfU
+qa^ZWs%3/]s%EAcrCm>g:J^sd!`;inr_j,&<E<.>=BJ^0>5h_1>[C]C?t*RDA,g'AAS5Ufrb2^T
+D/O60DfB]9F*.D)s*"HgrceTlH[:!bI/SKnHiSTjI/A?hI/eKmH2`'gH2i'iG'.s+F96K&ErKtZ
+DJa9.rbMOJs(D@CBOk[b@prbR?=$lB>$+j,=FP^HI!^0aG^":O@U3/_HA$cqF`D5*Hu!S(=\CeR
+<*3Eo='T3JChH1088VdGAnc("EclVPG"G4p7n-0G94rU"I=-E[DK'T9F`qqPGBnI]H@13mJV*lR
+k(WiArj2[3rc8!ZqfMdj!iMp6r5JHNs2Y/\!6P5_rQG2arltJg!6tMgrm1Vk!7CeormLr!f%0fO
+!S5g#f)=5#f`Km[f`'P(g=VYhQ1pUEN$aOEO,oBbP*;,qQ'Rc(R$jD4S=Q7CT:hmOU84T]VPg>j
+WN)u!XT#=+Y-5(6Z*CV6Zi@B4[JmW,s5&kcWi;qpVl$;dUnaZXTV%gISXZ+;R@'A.Q'IStP*1rh
+O,o<\N/W[PreUZ3L]3#0KnP-XKE$Q'JbailJ,+WpJcC?#K*$^[L&QgDLPUeDMMd=NN/`jYO-,Tg
+PE_>tQ^F/.S"#q>StD^MUSO]_Vl6SpX0&M-Yd(L?['mHR\[oGd^;%J#_SjF5a2lBGbK\>Yd*^:k
+eCN7'g"P08h;-uHi8N_VjQ5OdkNV6rlg4!*mI'H3nF?MK!qZ'Vrq6<bs7cKes7u]kqtp?irVc<d
+JcE7[J,~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb(\I=io'u5<n*]T0lg!a!kN:pfj5T%Uhu6RR<;oeq
+;u]bq;>sAl:[pRC4o7A83rhDA4nh,A4[)(,4TI\C4TJ=W:Adob:ARc`;#X>d;#aDl:]O;j;#3ub
+:]aZt<V]Sp;cMILr_iV]r^HfUqa^ZWs%3/]s%EAcrCm>g:J^sd!`;inr_jD.<E<-^1,CmI2`<ZU
+3''#Z3rM&F3]K/^4Zkhg4?E@$!'L0Cs$$]R5X@\&5sbE8nj<CDq*Y-Js$6]Q5sYE5&j/<?5<h=q
+4ZYbh3]K2\3]fA]r\tWN2)R9M2`EWQ1c.!D1c.*J1c.!E1Aj?B5!;"i3]]Jh4T7Q;4?>J]1c@EP
+1+b""*%!6g0eY(11c@BU1,h0W1c@3P4Zu"q6:=:&3]K,[5<_4u9h\5R9Kka.6psI47n#m;7S$$@
+7nZNK9MJ7D:A\5o56*nC5Q+=XVl'H(qdfe@B)H9EBPD0rC]%rIC]8/MD>\;ODZFbUEW1"XF8p=^
+FoHOdGBe@VrcnBeqg/9h!.=T@p/:feqbmDjr_N_p;GpFloMkjL-B4%HO-#KePE_>tQC!u+R@9V8
+SXuFFTV8'RUnjiaVl-JmWiE,$riHC-YHY79Z*OA8s0Md6rjMj:rOE-D\@&]O\%([%s&8kq!*/ts
+-`X/EVl-DgUnjc[TqJ$LSt2@?R[KP1Q^*i#PEM)kOH5H_NJrgSMZ/G5Lkkta!el;\rIb-%s+0ur
+q1&3js+13%rIY0)Kn]M\D23q(M2I1KN/WaVO,oEdP*;,qQ'[l*R@B\9St;RJTqeEZVPgAlWiN8(
+YHY:;Za@0M\@K2`]Y;.r_SX71`lH0BbKJ/Ucd:(feC<($f@em3gtgfDi8ESSj5f=ak3)!nlKdg'
+mHs?1n*olHncJFTo`"O`pAamcq#C0iqYU0gr;HTbrdk*Zs*t~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb)>*Oko'u5<n*]T0m-<j"kiV$gj5T%Uhp0OHblc/2
+aN4>#s2k8]m>L(`k_fG[ou-XE!64rWp;dEX`lH*;_u@OF_$7]i^V7Cs^uiE/^AknH]`#JB])B8@
+\H9:L[eiJl7K,dR8,l-[8c;9]9E.]a9`e'c:]=/l;,U<k;ZTitr`0\6=BVJ1CM[d&Df9Z<F)uPK
+G'A00H4>4LI=HctJV/Q.LPUbCr/1W8NK!js!K`HCP5UUAPQ6p?PR<V=PEM&lPEM#hOoCGZO,f-X
+N/W[QMMd7ILPLV;L51D5K7SQ%I!p?cF*)><Df0?cUS4<OSsu1:Pa-9,BU>3\\=U@<R?NSbI?9.l
+IoAmR91hj+G(PX6LJ:ZDN.?S;Mia'hR[p.FQr-[T9hePc;,a-\US=KCOHTR-&!rcTSXuFFV5C/g
+Xf\b0YNE(gn,2YXPa.N"QM$RHV50o^\,Z<Bn&4h8"N89u`l@kqrl?[LN/WaVO,oBbP*;,qQ'Rc(
+R$sM6S=Q7CT:qsQUSO]^VPg>jWN)u!XKAV-YPta3Z*L[AZa@*I[JdQ-s8Be4_#2%I_"5>=^+64_
+Vl-DgUnjc[TqJ$LSt2C@R[KP1Q^3o%PEM)kOH5H_NJrgSMMd7ILkktas+LH+rIb-%s+1#sp4)ph
+s+13%rI]!@KnY89LPL\BM2I4MN/`jYO-#KeP*;,qQC!u,R[]h<StD[LU8+N\VPgAmWiW>*YHY:<
+['d?O\[f>b]tV7t_Sa=2`lQ6DbKS5VcdC.heCE.%f\,!5gtgiEi8N\Uj5f=akNM0plKdg'mI'uB
+!V#XYncJFTo`"O`p&Ojcq#:*hqYU0gr;HTbrdk*[s*t~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb)>*Oko'u5<n*]T0m-<j"kiV$gj5T%UhjU#4RK&WR
+QMd*KQK`5MC\V`AD>nGND>ogqPkLC?QL^C2QMm'KPk:+$OS=h9N<5&sMu,pA7K,dR8,l-[8c;9]
+9E.]a9`e'c:]=/l;,U<k;ZTitr`0>,=BToJ='/R->5hb+>manD?t*MO@:E\UAH$-EAnPaiBkqJ^
+C]A2UD/O91E,]i;r,MgZFSp7]FS'VVFE;JBqf)RQ!,qjS#]+?oCMRa%BkmTZ"D)+T@q5LI#@V"I
+?<pi@>5hVI<IT=CH[9p\G'.kH@U32_G^>-jL4=;`CM$shA5?Do4&Z&B(1CEUBP_<M8kEl/AS5dr
+Df^&EH?s[)r^RYl9h\5RH[L6hHYdS<EH-&BG'A1Vrd"frIt*!#JqJ^;L&\CdZEpmE['OamEcH)>
+Er:"VF9AA8Undk,q8WHTrlG&\rlb;brltGf!mf0;rm1Vk!7CeormUks"4l)Tf)F5!f)OA%f_aA%
+g=;GfQ2HsIPq@oQN/`jYO-#KePE_>tQC!u+R[]e:SXuFFTqS3UUnjiaVl-JmWiE,$Xf\b0ric[5
+ZEggC['[6KrO2G"rK7&?lB2(-/Wl-pWMcYkV50o^U7n6PSt;LCS!ob4R$X,(Q'7AoOcYWbNfB!V
+Mi*CKM26rdLAur-K`-Q'K)^DuJG+KhJH(3#K)L=>KS>,7L51P?M2@+JN/WaVO,oBbP*2#nQ'Rc(
+R@9V8SXuIHTq\<XV5C/hWiE/&Y-5(7Za@-K\%0&]]Y2%o_8=+.`Q$!?b0/#RcHjnce'uq!f@\d1
+gYCWAhr*JQj5]4^k3(sml0@U$m-X6?mfDqJrpg-^o^r.Us7QHerV6Bfs8)WirVZWmo)=4?\c70~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb*q]'po'u5<n*]T0m-<j"kiV$gj5T%Uhc*QR;cH^p
+r_i_os&&blkrer.q)nF6s#g<Ep-/I=r]L!>s%iSgr(m>fpJ:]`r_`Acs&&Vh!`;cjr(m2d!`)it
+r`/ttku7RZmo06aqaCEPr^QcTs%*/]rC[)_s%NAc!_uNer_NYn;H!Km!E<(u<YSV;=Z\>s2DmBO
+2E<]U2`WiX3B0(u3<2,>497N+r]('A3BB1u3WV?)r&jsAs$-?Ds#p<E!'U*>s#p?D%Qum83]fDa
+3]fAa3]]>_r\sp92Z>WA2)[9I1GpsF1Go%f>r4>n1,M6[5!M1m4?>M_3']Vi5<h=r4Zthc2`3?C
+1GCF1*?QaW-RUc)1H%9U1,_*V1c@<T4Zu"p6:4+.2``oZ3BoYj4\SLB91qK75XIh*77B^97n,s=
+84cGQ9`IiK:An>o=opfL54^uBV50o^A7YXM!bQ(Yqe#qCC&2TDC]8/KD>nGPDZXltEW1"YEr^=]
+FT?U^GQ)jcH2`-hHiJKf;ta,e;u0Dl;>j;o;,U:j;tj6CMi<USNfT6_OckomQ'IZ%R$a>3S"-%@
+StD^MU8+N[V5C/gW2ZesX/rG*Y-7i/#dL\@Za7$G[C,tAs1&3@\[VRF!k#JHrD`_oj]!b1WMcYk
+V50o^U7n6PSt;LCS!ob4R$X,(Q'7AoOcYWbNfB!VMi*CKM26rdLAur-K`-Q'K)^DuJG+KhJH(3#
+K)L=>KS>,7L51P?M2@+JN/WaVO,oBbP*2#nQ'Rc(R@9V8SXuIHTq\<XV5C/hWiE/&Y-5(7Za@-K
+\%0&]]Y2%o_8=+.`Q$!?b0/#RcHjnce'uq!f@\d1gYCWAhr*JQj5]4^k3(sml0@U$m-X6?mfDqJ
+rpg-^o^r.Us7QHerV6Bfs8)WirVZWmo)=4?\c70~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb+nYBso'u5<n*]T0m-<j"kiV$gj5T%Ucd0n^c-=JT
+aN)C#`ra?(aQ\WFMX$*"`V%1G`VmgVa8O*Zanj*W`ra5u_u@OF_$%Qg^:q;Z^uN3*^&l!\]`#GB
+])K8?[JWGl7K,dR8,l-[8c23\9)qZa:&drg:]=2j;#jMn;^taH<E<.%=BJ^/>$GNGCM[g&Df0K2
+F)uJGF`qqQGBeCZH@(!dIXZcqJGt*#KnKAXs+LZ4L51S?M2D4hrep`6rf%/ANK&mTMi*GlMZ8P4
+L]`EgM2D4e#Dn1hKS4u2Jc:00IXHKiH?XOQFE)8;Df0CjU0aLbS=H(;P`g'+BpG0aVOaolS<f7o
+DeOfLE,0,p=&Daf95S9gKT1pb<)JO&Jqf5FOdV`1TqIKE:/4JW9N4tfBqM&oUnONDOd))qQBn#3
+S=Q:EU8=fdXKJ\/YN2nfmelPPnG\^OPlI'BQN3_hs7jM$`::bE_u[isqo:2-MMmFPNK0'\OHG]i
+Pa.N"Q^F20S"#q=StD[LTq\<XUnsueW2ZesX/u<&#-P/6Yd(I=rj2X3!4Da5pAb-.q7m!HrP8$>
+r4X\]WMcYkV50o^U7n6PSt;LCS!ob4R$X,(Q'7AoOcYWbNfB!VMi*CKM26rdLAur-K`-N'K)U>u
+JFe9fJH(3#K)L=CKS>,7L51P?M2@+JN/WaVO,oBbP*2&pQ'Rc(R@9V8SXuIHTq\?YV5L5jWiN5'
+Y->.9Za@0L\@K2_]Y2(q_8=+/`Q-'Ab0/#ScHstee'uq!f@\g2gYL]Bhr*JQj5f=ak3(sml0@U$
+m-X60n*oi:rpg*]o_nFap@n=[q#C0hqYU0hr;?Nardk*\s*t~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb(A.4ho'u5<n*]T0m-<j"kiV$gj5T%UrL3_R!go=>
+rg*ML!1)\^lYH*.qJ?7ND>BIrPk:7@QLC1/QMm'KPkgI)OReG4NrG%<Mu6!B7K,dR8,l-[8c23\
+9)qZa:&drg:]=2j;#jMn;]Jb:<E<.%=BJ^/>$F]t>ZY$0>$G37>?b?:>[:Y7?OU=N@prhVA7]@a
+AnPcUB)cKIBkV3oBPR<X!,VXO!GlWPD#\AOC]S<grbMdSC2%?oB5%0T!G5pBAH$'I@UW\Q?XI)D
+?<g`>>5_PcIXQTkH?j^YG&qY4?<_VuI=?KlI!0OJCKjhQ>?=]t8OPm05X/CI?=[ec6qU'g@Us(e
+DK'Z>G'S@O8H)-Z7fQ.&93Q[hI!pBiD/XB5F*2VLG^+L[I!U3jJ:`B*K7r<>rNZC.rNlKDqf2UU
+r,_gY!29A1r5JiZ`l?'uaT'?^b5BH^bl,fcc2l8:rm(YmdF%sArmUks!S#]uec"(ufE0aYf`'S(
+g=__fP6-u6Q2[*LPpqTKN/WaVO,oBbP*;,qQ'Rc(R@9V7S=Q7DTV8'RUSO]^Vl-JmWiE,$riHC-
+YHY79Z*OA8s0Md6r3l>!rfR#<mZIF//#oSHVl$;dUnaZXTV%gISXc1<R@'A.QBd`!P*1rhO,o<\
+N/W[PMM[1GL]3&.K`Hf)K)gN&JbsuhJ,=crJcC?#K6)^"Knb>;LPUeDMMmFPNK0'\OHG]hPa.N"
+Q^F20S"-%@T:hmPUnjibVl?\sXKAY0Yd1UB[^N]V]">Vg^VI\&_o9U8aN;TJbg+M\dF-Lne^i@)
+g=k<;h;7&IiSrnYjlY^gkiq?slg4!*mdKW6nF?MK!V>s^o`Fj]p\jmeq>U6fqu6NkrUTr=s185\~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb(\I=io'u5<n*]T0m-<j"kiV$gj5T%U;uTbr;u]eu
+;Gg?j;Z]io;#WW54Sh/>4T%A>55m_?4T@PE:\miV:]F8g;>O,h:\[cc;?'Jk:]F5k;>j;k:]4>n
+<W?%^;u9Jb;u]bn7/fXS7f,^U8H29Z9)hNa9`7]c:&n)h;#aAm;Z9T5<)lq!<``C*=]np4,;;AB
+3&NTO2E!NQ3&`eq3!;-"3&ihq3WD/P4?>J`3]T/Y3]T8^3&rrZ48V&33r_5>3X.T*3BB2]3W1o>
+3]AuUr\jg8r\YHJ1GgsE2)I*I2`EQO2`3EK1,LaB5X5638if's4#f2a4Zu"n5!M1m3]T/Y2)[<K
+/Lr4s,U4Q[,ptN"0f:pO0K1gQ1H%-Q4?Ynp6:O=03''#[3B9;d5!_h99MA)Q5!_J%r^75d7Rfm;
+7n?3C92/)R9hj\D!*];'rEB.^!^/_2o038LAGp'?AnV*V!bQ(Xrb27F!c)OcrbMLLrGDOOrbhjW
+EH1tus)S0^rH8'^s*+Edrd"Hgs*Ocns&A_kp/:cdqGR>jrD<Jj!E)km<%3]_N/WaVO,oBbP*;,q
+Q'Rc(R@9V7S=Q7DTV8'RUSO]^Vl-JmWiE,$riHC-YHY79Z*OA8s0Md6r3lX8#e%.IZa@-L\%)E:
+q,@#er`/Yk/#oSHVl$;dUnaZXTV%gISXc1<R@'A.QBd`!P*1rhO,o<\N/W[PMM[1GL]3&.K`Hf)
+K)gN&JbsuhJ,=crJcC?#K6)^"Knb>;LPUeDMMmFPNK0'\OHG]hPa.N"Q^F20S"-%@T:hmPUnjib
+Vl?\sXKAY0Yd1UB[^N]V]">Vg^VI\&_o9U8aN;TJbg+M\dF-Lne^i@)g=k<;h;7&IiSrnYjlY^g
+kiq?slg4!*mdKW6nF?MK!V>s^o`Fj]p\jmeq>U6fqu6NkrUTr=s185\~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb(A.4ho'u5<n*]T0m-Ep#kiV$gj5]+Vrm1Sh#0kB7
+aN)?Brl5)]M2D.fl\jn_o8EU*s,-ru`Pqhprl+lTpr36Ps2Y/\qoJo\aiXP'rl5)[`5MVkotg[D
+!PcAFNW6f[^[Ai9]EPpX\@8rUrC$WRrC6]Ts%*,\rC[)_s%NDds%WPir_WVl!)iep(fXL8<`W:'
+=BSd1>?b?;?!^lpBonNpD/K8is)7mVs)\lpGBe@VG'8(SH$O^_I!^6gI=M*Es+1<'J:RWMrIXlu
+rdc/?J:N3'J:N)tI=-HjI=6HeG]n7NEH#l8EGfW1CM]^DTO+.\SXc1?PEL!+C6k?\]Ul+'Q][/K
+CPdb5I[Y[f9PJB]I=#g[:k+@bM,$uHN.?S=NffWsS=uUD;,0e[9h\Pd:lq<BU8+EVNf]EgQ'IZ%
+R\$(@T:VaQVl?\uXo>NaYl=(fn,DhSQ2d'MQ'@O4Q1pUFQFd+k`;[[G`9tPC`;dgS`rClHMi<US
+NfT6_OckomQ'IZ&R$jD4S"6.BT:hmOUSO]^VPg>jWN)u!XKAV-YPta3Z*L[AZa@*I[JdN6\+]k%
+_>(hG^])%@^\b`!WMl_lV50o^U7n9QSt;LCS"#h5R$X,(Q'@JqOcYWbNfB!VMi3ILM26qBL5(D9
+K`-Q'K)^E!JF\3eJH(3#K)UE&KE-`*L&m'creY!>Mi<USNfT6_P*2#nQ'I]'R$sM6S=Z=FTqS6W
+V5C/hWN*#$Xfnt6Za7'J\%&u[]Y2%o^r!t,`Q#s>aihlPcHjkbdaZdtf@S^0g>(N?hr*GOj5]4^
+k2tjkl0@U6ljN4Kn*fc9nac8BoCW%Ts7ZKerV6Egs8)WirVZWmo)=4?])R9~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb(\I=io'u5<n*]T0m-Ep#kiV$gj5]+VRJ`NRR0/hB
+Q'M?7s-NRtk%s@!n8/,Arg*PKrg*JI!1*DFs-E\Org<YNs-WYLoTfKBrKdDIqJ?1ojH/qns,I&;
+!/peDr^HcTr($cXr^m&\s%EAcr_<Df!)NSjs%rbor_jP2<E3(#='&L,=^#$6>[1Q@;/'9UFoGMC
+=Tqu3>?b98r`fb9?XR2J?sd8L@K'a9@0'hIqIKS:!b>eNrac%?s'uLKA7]=_AS#C`A7K-I@UEPQ
+?sd;L@:<ML?!^c@>?b64=]eg0=&s]rH[L0cG^":RFE1kt>Bb@=LO"5nFDkr&=__Se@")<J4&ApU
+?!UTB6XaVEBLPNaDI[6mD/aN;GC"RX84Z3@7n-3H961#Y(4CRXD/F32EcZAHGBeCYH?spbIXm!$
+re'3ar3?4+rj2NCs)A$Zr,MaWqK)[Y!lW'srPniW!65#Zs2bPhbKJ,Pb0/#QrQY>e#LC]@cd0tc
+dJ_Mme,Iksec4.uec42#fDaD(f@\aSf`9b'PQ7!)Pl$[DPlI$KM(FRDN/`jYO-#KePE_>tQC+&-
+R[]e;St;RITqS6WUnsrdVl6SpWiN5'Xfel,YR%M>ZEpmE['d=?[K*f1s8S5TOR\J1O>*Z4Vl$;d
+UnaZXTq@pJSXc1=R@'A.QBd`"PEM&iO,o<\N/W[QMM[1GLPLV=KnY3YKE$Q'JbsugJ,=crJcC?$
+KE$T)L&Qf-LPYqd?]'c#N/`jYO-#NfPE_>tQ^F//S"#q>StMdNUSO``Vl6SpX0&M-Yd(O@[C3QS
+\[oGe^;%J#_SjF5a2lBGbK\>Yd*^:keCN7'g"P08h;-uHi8N_VjQ5OdkNV6rli-5YmI'H3nF?&>
+o(2JFrq6<bs7cKes7u]kqtp?irVc<dJcE=]J,~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb(A.4ho'u5<n*]T0m-Ep#kiV$gj5]+Vr_r\n!`Dln
+rDN_p4oIMC45i:%48_5:3t"264?Yeh4Ztnj4?`F$s%`Mep.tW^r_NPjr)*;erD38dr)*JjrD3;e
+!'U3As&T/"r`&,\pJUidr_i\_r^HcTr($cXr^m&\s%EAcr_<Df!)NSjs%rbor_jP2<E3(#='&L,
+=^#$6>[1Q@1,_<Z4oI8?2)[>j2Zu*!2E*Vm2[_T(3B0#Y3&roV3'$t!r&Od9r\ss>3&pmr!B<+=
+2\J#*2Dd<L2)[?O2E*KM2)R9M2#]?<2Dm?K1c$pC2#]B45>FC-5!;"j4$,D]5Wq7p5!;7q4#o>\
+2`<NN1G^XK-lsBT/L`;-1c6a<2E<lT2E!cW3'',a5<hJ%6U`sq3'')\5Wh5$92/)R92%Q85lO.Z
+779X87n6$:84cBGr_3>di_KMWqcWl$s#pEGrB1*C!'^!=s(24Bs(;=Fqe#qCC&VlICB/,KC]/)K
+D>nGPDuObUEWC1[FS^.ZGQ)jcH2`-hHN8Hm<Vobm;ta,e;u0Dk;>j>k;?'Pn;u]hsM(FRDN/`jY
+O-#KePE_>tQC+&-R[]e;St;RITqS6WUnsrdVl6SpWiN5'Xfel,YR%M>ZEpmE['d=?[f<f:[/R?9
+['d?N\%#C:p/Cfeqc3Dj0WD"KVPU)aUS=HUT:VXFS=?"9R$a5+Q'IStP*(ieO,f3YN/NUOM2@%D
+LPCP;KnTDWs+:9%qge6eqge]ts+:6&s+CB+re:H/M#N6<MMmFPNK0'\OHPcjPa.N#R$a>3S"-(A
+TV8'SUnsrdW2ZetXf\e2Z*UdE[^WcW]"G_j^VI_'`5Ta:aN;WKc-FY^dF-Oof%8O,g=k?<h;@/K
+iT&tZjlY^gl07L!rp1$[mdKW6naZ2@oCMVRp&Facp\jmeq>^<gqu-HkrUTr=s185\~>
+JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(%h+go'u5<n*]T0m-Ep#kiV$hj5]+rci22lc-+5M
+rl5#[p5/^)mYg.`onrm/a2[eks2OrTrl4oXr5er]rlP/\rl5)[`5MVkot^[E^\!NV^[Ai3]`c'^
+]=GHM7/fXR7f5dV8H)3Z9)hQa9`@cd:&n)g:]XEkr_rhr!*0#!$<L>4=^#!5>[1Q@ra-:GLgFq_
+P%ff7P%ncLDf'B1DK,Sp$?1!*F`VYHF`qtPr-/9gG^045r-/NnG^+LZG^=UZGQ)h+GBS1RGBe:S
+F`_VDE,KT5D/F')Cn@5jSXZ.?rgH$AP`h/lO,]*VL4b)LT<#/^OGS*pK85Y4DIud>G"[(/;LhP@
+KoM0k:K17iKR\T/NKB?lSY)RICJdi%9MPLc&;HdKTVJ<WOH>]jQ'IZ%R\'ML#bRcaUo:5mY,qW+
+iNN=LrU0UPrU9fOr0@2Er078JqNh2J])Us3m)/kAs2G#X08PIAMMmFQNfT6_OckomQ'IZ&R$jD4
+S=Q7CT:hmPUSO]^VPg>jWN)u!XKAV-YPta,Z*OA8s0Vg6rO2a8q#CB1pqZ=4qn=2OVl$;dUnaZX
+TqJ!KSXc1=R[BJ/QBd`"PEM)jO,o<\req5CMM[1GLPLV=KnY3ZKE$Q'JbsuqJ,4WlJ,=crJcC?$
+KE$T)L&Qg?LPUeDMMmFPNK0'\OHG]hPEhE!Q^F20S"-%@T:hmPUSO`aVl?\sXKAY0Yd1UB[C3QT
+\\#Mf^V@V%_o0O6aN;TJbg+M[dF$Fme^i@)g"P39h;7&IiSrnXjQ5Oekiq?slg4!*mf)YUnF?MK
+!qZ'Vrq6<b!;HHerqZTjqtp?irVc<dJcE@^J,~>
+JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(%h+go'u5<n*]T0m-Ep#kiV$hj5]+tRJ`NRR/iTP
+PlR-CCZ]HsC\2ECQ1L=9Q2R'KR/`NOR/30CQN*6JQN*3MD=q`&OSOq?OH,?\NVu9E7K#^R8,l-Z
+8c;9]9E.]b:&drg:]4)j;,[Bls&8tur`0A-=BSd1>$G6:?!dM;&7B6I=`edkDK9i#=BJ^.>$Ci.
+!a8f4r*0G3>[1TA?XNe="'o5>@/OC3@/XI4?jC%F?<piA>[@;5s',M,r`T)"#(1cEH$Xa\rcV.]
+F)c2<Df'6'BP(h#H@:3`DJ<H[B4u$`=&(tB=?ftr7U\VOAnl3P78$9FBOYOcCN"05Fa/1V=@YnP
+84H9I9Pf*&H[U<hCi432F)uJIGQ)jnH@1'cI=Hd!K)UB&L>dgeYH[o/rj)O0!H<&WEr9qWErL(X
+Er0qX`;IXR`rO3[ao0E_b5TQabl5lacMu2pd*^:ie'c\De,%Snec45#f)jUVfDaG%g&KdVPkpUD
+PV7iLM2I4MNK0'\OHG]iPa.N"R$a;1S"-%@StD[LU8+N[V5C/gW2ZesX/rG*Y-7i/!O8s0Zi@E4
+[JdQ6\+p"'On+V+Oo(4_W2HMhUnjc[TqS-NSt2C@S!o_3Q^3o%P`q8nOH5H_NW+kEMi*@JLkgb?
+L4t>7re(6&s+1&tr."Qlr."Tos+13%re(6(!/:E,BSVD#M2I4MN/`jYO-#KeP*;/rQC!u,R[]h<
+StD[LU8+N\Vl-MoX/rG+YctF>['d?O\[f>b]t_=u_Sa=2`lQ9EbKS8WcdC.heCE.%f\,!5gtgiE
+i8N\Uj5f=akNM0plKdg'mI'uB!V#XYncJFTo`"O`p&Ojcq#:*hqYU0gr;HTbrdk*]s*t~>
+JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(A.4ho'u5<n*]T0m-Ep#kiV$hj5])trDWVn"]J8q
+;H$Nm4oIM=4756/49%G?49%G<48_5948h;A:Amle:A@W^:B"&f;#aDh;#O2d;#=)i;#O2f:]N]Y
+4nq/><W5tY;u0Di;ZK_o7/fXR7f5dV8H)3Z9)hQa9`@cd:&n)g:]XEkr_rhr!*0#!$<L>4=^#!5
+>[1Q@ra-7F4"rNS5!M+l4?#,U2Dd9N2Z5W82@)0!2E<]S2`<Pj2ZPc82ZPi72ZYfqrAag8#W4Lt
+2)[?M2DkCjr\OX62?#E01&sT=5"In#4Ztnj3BB/Z3&roU2`*BK4?Ybf3]AoS2)R3E/1W%f+"ANf
+1,(R8.lB:H0JGFE2*EcT3'05c5=%S'76NUj3]]8c5<VO79E\!S5X@d:6i][S7fZ!V8-V[[9h\5T
+:#JbH>Q.h'=oMS)>P^M`4oRPE4[/O'!G,mBB*2g[AnM$T#\[pdC2.O"C23``rbVOMs).gSrc.pX
+!-A-]s)n?`rcJ9cGBa"1rd"Hgs*Ocn!*9)!pf.5koMYWdqGR)cs&/kq08PIAMMmFQNfT6_Ockom
+Q'IZ&R$jD4S=Q7CT:hmPUSO]^VPg>jWN)u!XKAV-YPta,Z*OA8s0Vg6rO2a8s02j8['d<M\$f78
+o2GTepf7/i+K238V50o^U7n9RSt;LCS"#k6R$X,(Q'@JqP)t`cNfF$s$]Bn!M26qBL5(D9K`6W(
+K)^E!JGaonIf+]mJH(3#K)UE&KE-`*L1l?uM2@+JN/WaVO,oBbP*2#oQ'Rc(R@9V8SXuIHTq\<X
+V5L5jWiN5'Y->.9Za@-K\%0&]]Y2(p_8=+.`Q$!@b0/#ScHjnce'uq!f@\d1gYCWAhr*JQj5]4^
+k3(sml0@U$m-X6?mfDqJrpg-^o^r.Us7QHerV6Bfs8)WirVZWmo)=4?]DmB~>
+JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb)>*Oko'u5<n*]T0m-Ep#kiV$hj5]+Ecd:&<ci;8l
+bfe--a8_%dM>`>'MrT]hMuLcs`qm[O`r*dU`r=$YaSa0Zb5KH^aSs6[`<=)q_ns:`_=rohNqeV2
+^Z<-.]`c![]=GKO7/fXS7f,^U8H)3Z9)hQa9`@cd:B+,h:^9iq;H$Ln<)rou!EWD&=TM]1r`gON
+?=.&I@:E\UHWjR1NejgBQ\:<XOcu&qQYUDQD/4"eDZFeUDujs"rcA0^FT$:\EY`_:F)l;@EcH#8
+DJsE1Df0B-C203+R/WLFQ^O2+Q^=#)OcXEpBP3U!SY!$^Y-kEXGBS+MEcQ)7CR'$\A5Q$?:/6%3
+:JOea:/Oh_:/?7eK8,8BOHZ*%SY;^KR8H^Q9hkUd+E3mCTV/*TUQ1M$Q'IZ%R@]q>StD^NVQ$Pq
+XKA\0Yd",1iirIMr9jOPr:'WKs-3\NQ'@O/Q2d0IQb<@\`9Y>?`&>SiLl$tGMi<XUO,oBcP*;,q
+QC!u+R@B\9SXuIHTqS3UUnsrdVl6SpWiN5'Xfek2YctC<ZMq03['d=>[f<i3rrBn1_!8]7^+ZF_
+Vkp2bUS=HUTV%gHS=?":R@'>,Q'IStP*1rhO,o<\N/W[PM2@%DLPCP;KnTDW!ePuSqgeWppO<$i
+r.+fus+:6&F+f7$L5(J=Ll$tGMi<USNfT6_OckomQ'IZ&R$jD4S=Q7DTqS3VUo(&gWN*#$Xfnt6
+ZEppH[^`lZ]Y(tn^qmn*`Q#s>aihlPcHjkbdaQ^rf@S[/g=tH>hVd>NioB+]k2tjjl07L!m-O--
+n*fc8nc&(\oCV\So`Fj]p\jmeq>U6fqu-HkrUTr=s1JA^~>
+JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(%h+go'u5<n*]T0m-Ep#kiV$hj5]+tRJWHQR0/b>
+Q'LrVj)"!rpMBMgrg3YNqj%,GrKmPO!13SMqNq#Dr0@2GrGD(@hN7_trf7#;r^?`Sr^QcTs%*,\
+rC[)_s%NDds%`Sir_Nhs;GpFl<)cls<WQ9(r`K8*>Q.kO?!^lF?t!MR@q/2'Anu(-Jp1pIEH?5F
+GBd.j=BSd1=]nr-=U826=^#$7>?Y2+>5qe6>[(E8=^"s1=BSc(<s)K)G^912.s?&YFEDSDE*QXP
+>'G7;H@gTqJp^j.=]ng-<E)mpCKae75!;n26!QlG7/fXS6kMjU?t*\[C2@d,F*)VPH$OO'r^R)^
+9M8)crd,H/I=-EZDfBc=F`qtRG^4U_H[:0lJ:`CPKAD7]YQ(j'Z2_-/Zi+hIEH6)>EcH*qEWC+Y
+Er:"Y`W!mU`rO3[ao9K^b5TQcbg"E0cMu2kd*_d>rR:er!7UqsrRLo!!nc,Vrn.5's4Yncqi`mm
+Ll$tGMi<XUO,oBcP*;,qQC!u+R@B\9SXuIHTqS3UUnsrdVl6SpWiN5'Xfek2YctC<ZMq03['d=>
+[f<i3rrA2MORnV7O>!Q1Vkp2bUS=HUTV%gHS=?":R@'>,Q'IStP*1rhO,o<\N/W[PM2@%DLPCP;
+KnTDW!ePuSqgeWppO<$ir.+fus+:6&F+f7$L5(J=Ll$tGMi<USNfT6_OckomQ'IZ&R$jD4S=Q7D
+TqS3VUo(&gWN*#$Xfnt6ZEppH[^`lZ]Y(tn^qmn*`Q#s>aihlPcHjkbdaQ^rf@S[/g=tH>hVd>N
+ioB+]k2tjjl07L!m-O--n*fc8nc&(\oCV\So`Fj]p\jmeq>U6fqu-HkrUTr=s1JA^~>
+JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(\I=io'u5<n*]T0m-Ep#kiV$hj5])t<;]\n<!-#q
+;H*HUrB0^6o/t\fq+glar_WSiqbI,d!DlSc;#O2d;#F2j:]O;h:]OAk55m_;4TAC=;uKVo;u]bp
+7/fXS7f,^U8H)3Z9)hQa9`@cd:B+,h:^9iq;H$Ln<)rou!EWD&=TM]1r`gIL?=.&I@:E\U4#8<=
+2DmNX4ukVb4Zkkl5;b8T2#K322Z,E52DtIls"sp92)[?MrA=O0qD8+."uJ+l1,D0\rBC`V5<V1o
+4$,G`3^,Yh4oRZ15!M4o4ZY8N0.nh./hS\*1+b"&*ZljX-8@2'.k</'0.nk10/PLE2`Wr_5!M7u
+6Ua@23BB/]3^5ho6;'pFrCd8W5XYN=&k,8Z84Q-?84cBG9MJ/R9heAXr_;BIs',D)r)s&'s',Fb
+rB:3Gr]^<Es$$0Ar+H%Arb)7E!,;=FrbMOMr,)FNs).mVrc&![F*.D(s)\EcFEDYJG5c^bGlE!e
+HN/<mI!binr`/_mr_r#Ype`qILPUeDMMmFQNfT6_P*2#nQ'Rc(R$jG5S=Q7DTV8'RUSO``Vl-Jm
+WiE,$Xf\b0YHY79ZEjJ9!joACr3lX7$*ghE[C3QQ[^T6-;uK\j<VfZJW2HPiUnjc[TqS-OSt2C@
+S!ob4Q^3o%P`q8nOcYWbNfB!VMi*@JLkgb?L4t>7rIY0'JV!]KrI=Qjr."Wps+13%re#9FKnY89
+LPL\BM2I4MN/`jYO-#KePE_>tQC+&-R[]h<StD^MU84T^Vl6SpX0&M-Yd(L?['mEQ\[oGd^;%J"
+_Sa@4a2lBGbK\>Yd*^:jeCE1&f\5'6h;-rGi8N\UjQ5OdkNM0plKdg'mI'H3nF5uIncJFTo`"Lb
+p@n=[q#C0hqYU0gr;HTbrdk*^s*t~>
+JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb)"dFjo'u5<n*]T0m-Ep#kiV$hj5\D0cd2U;#LC]@
+c-+5Na8:b_M>E,)Mr]cjM[.AFaN)<?`PqMirP\iXa2e2#!6P,\s2bAcaiVX'`rj?#`PhbnrkeNJ
+s,Hu;s,Hu;r4_rc!06!O#edsc]XkYa6q$uBr^QfUr^d&\rC[)_s%NAc!_uNer_WVl!)iep2,mRU
+<`W:(=BSd1>?b?;?!^lF?smDP@Uiq[AWNX7>CT^^BRtAKI%-:^SnMeOMi<[WOcu"*Q2R!KQi<?c
+Q^O;2S"-";S",t8R@0CSB4YXbrF5hArb*I@Q'@`6RC\ukX.blDMhc4cOb8j`J73G:?;Fa*=&i3u
+<W5l9;,:%dJp<!/N.HV=NKB9iS"61FT:'(`:J4GW:&\*7ELrbpTVJ<WNKTHiQ'Rc)St;LET:_gS
+W2Zi!Xfek3YkbK`Yl=%dmf)\QnGe^IPl$aGQMm'KQMm/`s5h2___?h#Ll$tGMi<XUO,oBcP*;,q
+QC!u+R[]e:St;RITqS6WUnsrdVl6SpWiN5'Xfel,YQ;#7rj2X3s0_d5s0qe'pqZ+.0>=?^VPL#_
+U7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieO,f3YN/NRMM26tCL5(D9K`-N)Jq8LMJGt&jIf4coJH(3#
+K)UC:KS>,7L51S@M2@+JN/WaVO,oEdP*;,qQC!u+R[]e;St;UKU8+N\VPgAmWiW>*YHY:<ZaI6N
+\[f>b]tV7s_Sa=2`lQ6DbKS5VcdC.geC<($f@em4gtgfDi8ESSj5f=ak3(smlKeH9$gmBNn*ol;
+o()DDo`"O`pAamcq#C0hqYU0hr;?Nardk*_s*t~>
+JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(A.4ho'u5<n*]T0m-Ep#kiV$hj5ZMorgE\Q"IYXD
+QB^oTi,%drph]Yiqj7;JrK[AJrKm;Hq3UuEqN_)Hs)%^PqeZIuP*(lgphTqIh2hf#NJrfa7/]RR
+7f5dU8H29[9)hQa9`7Ze:/=[b;#aAm;Z9TN<)lq!<``C*=]np4>?kE=?=.&I?t!MR@q9.^E-u4i
+@7NphAQ`5FG]\(T>?tHNDK'T:rcS'\q02a]20jCiG^"@TG'$__<)Zap;cH\#>$G3TG'/%WGDCHl
+I!BaOCM@!TCM.L%@8L'*7m0C57R]fG70,kHr^7MhAm]7iDI[9lCi434FEMnTH$*"T7n3JJ*DK1$
+?@.'GH[L6gD/aE7F*2VLGBnI[I!^0hIt3.LKA)%ZXoP[)YkkX(ZN%92Du4MQEV"5MF8j/Y`r=!c
+aN;QHb0.rLai_d*b6H28c-FY\c2Q#gciVVCdJ_Joe'e6E!7Lhqs4%,#qUbc"rRh2)c]nHn0p79H
+Ll$tGMi<XUO,oBcP*;,qQC!u+R[]e:St;RITqS6WUnsrdVl6SpWiN5'Xfel,YQ;#7rj2X3s0_d5
+s0qe'mu[%$s/.EFUnjc[TqS-OSt2C@S!ob4Q^3o%P`q8nOcYWbNfB!VMi*@JLkph@L4t>7rIY0'
+JV!]KrdXQhrI=`qs+13%re"p<KnY89LPUbCM2I4MN/`jYO-,TgPE_>uQ^F//S"#t?StMdOUSO``
+Vl6VqXKAY/Yd(O@[C3QT\\#Mf^;%J#_o0O6aN2NIbg"GZdF$CleCN7'g"P39h;-uHi8N_VjQ5Od
+kNM0qli-5YmI'H3nF?&>o(2JFrq6<bs7cKes7uZjqtpBjr;H3cJcEF`J,~>
+JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(\I=io'u5<n*]T0m-Ep#kiV$hj5X':<;]\n<!#ur
+;>EBR4RP<+4PMsn:A@Zb:\mic:\R]`:\moc;>a5j;>WTU4p!lB:B";m4T7GB49.P";uT\p7/]RR
+7f5dU8H29[9)hQa9`7Ze:/=[b;#aAm;Z9TB<)lq!<``C*=]np4>?kE=?=.&I?t!MR@q9.^6q0Bn
+1FFA!2(UL?r]U]T5!;(h3]]>a4Zu"+4TI\E5Q*eG5Q3nJ5Q3eT5!;(l4>erP2)R0G1c5.os$%Pg
+5<h:q4?P\e3]AuT2`*<J1GUU7.juP\.k</%.OtBJ)(dHm/NGgV5<h"b3]fAc5<hG"7RT[,3'')!
+3[6pT5=%q99MJ2S90Y[.6q'L37Rfm<7S$'B8kVfO92&&S:/:UZjA,YXqc`r$s&oJ.>WhgFs$$BG
+r]U?I55@GCB)uUWral.Crb2.CrbMOMs)%dR!,_^Q!cN$src.sZs)\<bFEIM'!H`J`G5ldcGl;pe
+HN/<mH@,Qjr`/\lr_qcR0SY@=M2@+JN/`jYO-#NfPE_>uQ^F//S"#q>StD[LTqeEZV5C/gW2Zes
+X/rG*Y-7i/!O8s0Zi@E4[J[K5\,Wi8[KO"H[^Wa;;uK\j<V]VoV_"^@UnaZXTqJ$LSXc1=R[KP0
+QBd`"PEM)kOH5H_NJrgSMM[1GLkg_>KnY3YK*$XUJbsusJ+S3gJ,FisJcC?$K5$!mKnb>;LkpnE
+MMmFPNK0'\OcklkPa.Q$R$a>3S"6.BTV8*TUnsrdW2cl!Xfek3Z*UdE[^WfX]=bhk^VI_(`5Ta;
+aND]Mc-FY_dF-Oof%8O,g=tE=h;@/KiT&tZjlY^gkiqBurp1$[mdKW6naZ2@oCMVRp&Facp\jme
+q>U6fqu6NkrUTr=s1SG_~>
+JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb,4tKto'u5<n*]T0m-Ep#kiV$hj5\D0cd0tbdEp7c
+cHXPSp58EtoSWX+onia+n;@(#"j>'1aiMNn`W4!V`rF*Za8j?Uap#o.a2l<@rl+oUs2+iRqnWJo
+Mi3OQNK*gqrOr?C^VBc^p5S(Gs1AHG\O8ja7K,dS8,c'Z8c;9]9E.]a:&drg:]=2j;#jMn;u]es
+<W6#"='5H)%U*(A>[:ZB?XI2L@U`hXrad*^B5!p-<*G9$Q<J`U?=\b>MI^U^Oe/_OVRi+iRJN3J
+Pk^LSPa7]+Un*m^XIZGDJRDhlrE_^?DJX#tObAaTKkPgX?rB`pE)()"G]/+/;M9sgP)b<LH\IN>
+N)>%]NKKEnS"6:IT:8YQ91qrP<)ZeXSt2JPT`:epUPt>!Q'@T$Q_'cISd:s^Uo12kXKAVpYNN.h
+m/QJKmf2bQnG\UNPQ$dHQ2?gDQ2R$KQ2d0MQbWR^`9>)sKnbA=M2@+JN/`jYO-,TgPEhE!Q^F20
+S"-%@StD^MU8+N[V5L5iWN)u!XKAV-Y-5(6Z*CV6Zi@E4[J[K5\,$(!_!&Nd^8Im+Unjc[TqS-O
+St2C@S!ob4R$O#&P`q8nOcYWbNfB!VMi*@JLkph@L4t>7re(6&s+1)urdXKfrI=`qs+(0%rIY-(
+L&Qg?LPUeDMMmFPNK0'\OHG]hPEhE!Q^F20S"-%@T:hmPUnjlcVl?\sXKAY0Yd1UB[^N]V]">Vg
+^VI\&_o9U8aN;TJbg+M\dF-Lne^i@)g"P39h;7&IiSrnXjQ5Oekiq?slg4!*mf)YUnF?MK!qZ'V
+rq6<bs7cKes7u]kqtp?ir;H3cJcEIaJ,~>
+JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(A.4ho'u5<n*]T0m-Ep#kiV$hj5ZMorL*SP!h#FB
+ltcN8rGCh9mVDZ8op5KArg!PLqj.5JopGWCqj.)Dr+uCMrGMXPrK75AOcfX)p2&`Mrf.&=6q$uB
+r^QfUr^d&\rC[)_s%NAcs%WPir_WVl!)ieps&8tur`0&$=T2G5>$G6:?!^iE?XR;O@UisJAKPMs
+BRG+u9Q+6V8RPXn:1\!O<*O'RFF8@[Lj",iG'3A!s*+Kd$?p`CH$>!nH$s%/rD<Mk,>`#W>$"X=
+B52-j<*`X!5<V535u;&s>@KrfA7oXpCM7<jC&W!+7Ug+KDfBc>G'\IZG">+m7RomB9MKJQH[L-d
+H[U<iDf9T9F*2YLG^4U^H@1$fIXls#re(6(g4fI-!3cC+qm$+*s0M]Bs)7aQrc.XPrGr"Y`r=$Y
+a8j?]ap#u2aN;QHrQG5crltMgrm(Pj!n#HDqU,GodaJ*Cs4%8'f@SU)rn%/%rn.;*c'1/NKnbA=
+M2@+JN/`jYO-,TgPEhE!Q^F20S"-%@StD^MU8+N[V5L5iWN)u!XKAV-Y-5(6Z*CV6Zi@E4[J[K5
+\,$'mORSD4V_"^@UnaZXTqJ$LSXc1=R[KP1QBd`"PEM)kOH5H_NJrgSMM[1GLkg_>KnY3ZKE$Q'
+Jc(&tJ+A'eJ,FisJH1<#K)pXZre>*ALl$tGMi<USNfT6_OcklkQ'IZ%R$jD4S=Q7DTV8*UUo(&f
+WN*##Xfen4ZEppH[^`lZ]=bhl^qmn*`Pom=ai_fNcHaeadaQ^rf%8R-g=tE=hV[8MioB([jlYai
+l07L!m-O--rpKmWnc&(\oCV\Sp&Facp\jmeq>^<gqu-HjrUTr=s1\M`~>
+JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb)"dFjo'u5<n*]T0m-Ep#kiV$hj5X*;<)ifpr)<Yp
+oKE.8lT=o)iB-m2s%iJfr(dAh:J^par_N2`s%iJfqbd>h!)`\Xr]^3DrD!>lr)Ne[r]C-@s#^3B
+hbsSS6q$uBr^QfUr^d&\rC[)_s%NAcs%WPir_WVl!)ieps&8tur`0&$=T2G5>$G6:?!^iE?XR;O
+@UisJAJJfiBM(rT1dF#]/2Jq./i,=B1c@6Or]10E5s7Fsr]^<GpHJL>r]^?Fs$$HF4Y\TH1c$jA
+1G^jG2Dm<K1c-s@/hJOt*ZlOX,q:Z*1c?d61c@<S4$#Ac5<h=r/iPjR4[21r6:4.07Q<L/3XRi3
+5sRq492&#R9E%U"5!MD%6psI37Rp!>7n?9F8P;`M9MFtNk=u"\qHNi#$X$Y:>?Y694Ztnj4S_/?
+55RPE55@DGAnPagB)ZHDC&2QNCM[d&Ci+$,DJfAj!cN$src%pZr,hmYs)e9`!d8d3rHS<erd"Zn
+H?sr7<rQ+n<;ohV;Ds5`LPUeDMMmFQNfT6`P*2#oQ'Rc(R@9V8SXuFFTqS3UUnjibVl6SpWiN5'
+Xfeh1YctC;ZMq31[/[Q3[f<f;[C6(BrjMDsrD`MkrDYLM<)fcnVPL#_U7n9RT:VUDS"#k7R$a2)
+Q'@JqP*(ieO,f3YN/NRMM26tCL5(D9K`6W(K)^E"JGt&hIf4coJH(0#K)L<&KSBD[BSVD#M2I4M
+N/`jYO-#KeP*;/rQC!u,R[]h<StD[LU84T^Vl-MoX/rG+YctF>['mEQ\[oDc]t_A!_Sa@3a2lBF
+bKS8Wd*^:jeCE.%f\,!5gtgiEi8N\Uj5f=akNM0plKdg'mI'uB!V#XYncJFTo`"O`pAamcq#C0i
+qYU0gr;?Nardk*`s*t~>
+JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb+nYBso'u5<n*]T0m-Ep#kiV$gj3>fmcHjh`da?Fg
+cd'c*MXu\cM?&M#M@#3bbfe/NaN2EBn](OJ!Q`C\b5TQrb0.uNb/q`Fa2Z*;`l5m6_SZ8fs,-c5
+s,?f6r4W32[Jmu@^]2%CN<#""^AkkI^-qogr^QfUr^d&\r(?u^!)3>cs%WPirD3_r;GpFl<)cls
+<WQ9(r`K8*>Q.k_?!^lF?t!JQ@Uiq[AS,RgBPD3s<E5NLN)`q]ODpLf>$4p-<-;2A@=NoUML^;4
+Lj=:EH<ZAhR]is#Xg"=VNaT/LJr#\TNIQ%VFFeslJV8\\=^+a$:f2mnEd1J[<)Z_YNJM+FKo_4P
+;,gIm<fN9+R%0Y9TVA-MQr-XQ92&#Y;i79?SXuIHTqnHDOHfa0s-NkVSt5kP$(mlaUo12lX/rGi
+YN`:hm/QJKmJu_Sn,i.LnGSRMOoU^?Pl$aBQG<Iq`:UtD`9G/oKS>/8Ll$tGMi<XUO-#KeP*D5s
+QC+&-R[]h<StD[LTq\<XV5C/gW2ZesX/rG*Y-7i/!jT&:rj2X3s0_a4s0qk)q7u1.0#"3ZUnjc[
+TqS-OSt2C@S!ob4R$O#&P`q8nOcYWbNfB!VMi*@JLkph@L4t>7re(6&s+1)urdXfor-eHkrdXls
+s+13%re(6(EJ9.%LPL\BM2I4MN/`jYO-#NfPE_>tQ^F//S"#t?StMdNUSO``Vl6VqXKAY/Yd(O@
+[C3QS\[oGe^;%J#_SjF5a2lBGbK\>Yd*^:keCE1&g"P08h;-rGi8N\UjQ5OdkNM0plKdg'mI'H3
+nF5uIncA@SrUg6cp\4X]rqZTjqtp?irVc<dJcEIaJ,~>
+JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb'D1neo'u5<n*]T0m-Ep#kiV$gj8GAERJWEQRJq'u
+D"29@D"ql7D!Yp<CmXg\qj7&Cs-N>Er0R>Iqj%1sqeZ+Gr/q)5N;f">OoLO<C]J>5OT1@BO@9%9
+r^QfUr^d&\r(?u^!)3>cs%WPirD3_r;GpFl<)cls<WQ9(r`K8*>Q.kE?!^lF?t!JQ@Uiq[AS,Rg
+BPD3s9hKbPD>m0CDdIHV8k;QD7Ti)G93c"5B4PUfBjLXCs(`ZrM33gQMfrrT;NY[*BPqTu?s-3-
+@:3MP@q/;0:."qI%V&jN?:77P77M01Bi.N<rb`WD8Ou?CD/O<5F`hkRH@'gW84Z6?7n$0HDLDG1%
+XNJKI=,pNEH?5DG'8+Urd#$#I!^0gIt3*%JqJ]/K\(qSY5b^*Yl(d)ZMq3/DuOVSDuO\UEW'kUE
+VFMRErsA%a8X-[ao0?baiMTGb5TQcbg"E3c3;J<cHjkarR(Pk!7Ceor6tYq!nZ#Srn%/%r7U\+q
+NKp'0nb78L5:\CMMmFQNfT9aP*2&pQ'Rf)R@9V8SXuIHTqS3UUnsrdVl6SpWiN5'Xfel,YQD)8Z
+Mq31[/[Q2[f<i5s6u-=OY*H,Unjc[TqS-OSt2C@S!ob4R$O#&P`q8nOcYWbNfB!VMi*@JLkph@L
+4t>7re(6&s+1)urdXfor-eHkrdXlss+13%re(6(EJ9.%LPL\BM2I4MN/`jYO-#NfPE_>tQ^F//S
+"#t?StMdNUSO``Vl6VqXKAY/Yd(O@[C3QS\[oGe^;%J#_SjF5a2lBGbK\>Yd*^:keCE1&g"P08h
+;-rGi8N\UjQ5OdkNM0plKdg'mI'H3nF5uIncA@SrUg6cp\4X]rqZTjqtp?irVc<dJcEIaJ,~>
+JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb)>*Oko'u5<n*]T0m-Ep#kiV$gj&K&X;cH`p;uK\p
+55[SB55@A>4T7DB4RbH-4Qnm+:]!le:]=2f:]=,f:]=,h:]+&g;$'Qk;><u^;>EBO55n=W:B=9j
+q,[>Qs#U3CiDT_ErC-]Tr($`Ws%3,\s%<>crD!;e!)NPi#>nAs;c?Xp<W6#"='5H)!Er_,>VKGi
+?XI2L@:E\UA7]=aB4tsmC25pn912*)1c.EU3\2m:0.82!+sA0\0eP4:2)I2i1&`jB2Dm?Y7n#X2
+3]K,U7l<+Y1bpa;/M&IP0c)Mu0f1dH,pjre0JPFB.kE8(0020V2)kIu#r"(i1,:pS5<_@35nZUR
+7RT3s3]K/[5XJ"78kViO:&[id56""M7/fXT7LVgX7n?0C8P2WL91qtF:$GFQ>52>%=q4b?>$G07
+>?kB;5!D1q55m\I5!;%mrB:0EoKN=frb)4Ds(VLJ!,;FI!,MRMrG;p[D/F0.DfBZ8EH6."FT6C^
+ErL+[FT$@]GQ)jcH2i0nH$Xd`Hhg_B<W?%k;rpn3KS>/8Ll$tGMi<XUO-#KeP*D5sQC+&-R[]h<
+StD[LTq\<XV5C/gW2ZesX/rG*Y-7i/!jT&:rj2X3s0_a4s0r$9r3l5rrD`MkrD`_o/Z,A?UnaZX
+TqJ$LSXc1=R[KP1QBd`"PEM)kOH5H_NJrgSMM[1GLkg_>KnY3ZKE$Q'Jc(&tJ,=]mIJ\KmJ,Oot
+JcC?$KE$UEKnb>;LPUeDMMmFPNK0'\OHPcjPa.N#R$a>3S"6.BTV8'SUnsrdW2cl!Xfek3Z*UdE
+[^WcW]"G_j^VI_'`5Ta:aN;WKc-FY^dF-Ooe^rF+g=k?<h;7)JiSrnYjlY^gkiq?slg4!*mdKW6
+nF?MK!V>s^o`Fj]p\jmdq>^<gqu-HkrUTr=s1\M`~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb)YEXlo'u5<n*]T0m-<j"kiV$gj3>imc-O__rmLhn
+!mc^[mu$UkeVaCN"O506b/sY(r5\NNrl5)]aiXG's31Mds2tA`!m&F&rPeoX`5DPjr/1H2s,?l8
+qnE*D"/`E?_>D%J^\a#iNrP1&^&YhE7K,dR8,l-[8c23\9E.]b:&dug:]=/l;,U<k;ZTitr`0D.
+=BJ^/>$G39>[:\8?T);#@U`hXAS#IcB4tsmC27U$D,XG6S:6HXO.96N=H\_rHZN.d<E<1$=+PI@
+IXcp"JqJ_U<;oerJbt08KSFr&F`;e-;H$SLLQ-h7JV&MWr`CjUDNBj<;H-Oo<`N*s<)Ze3H$X7&
+;c6Ff9MA)P9hSGb;dGQXSXuIHUnj]HP*D5srg<_V%A'2`StD^OVPgDnX/rH&Y5kflYO&InlhTlI
+mJ62Mn,MnVnGr(RP6$i1pQYK=rKb;"pVc^Aqo&BLp;6^E14t76L5(M@M2I7NNK0']OckomQ'I]'
+R$sM6S=Z=ETV8*TUnjiaVl-JnWiN2%Xf\b0ricI/ZEjJ9s0Vg6qR-C5qZ$E-k.`LFV50o^U7n9R
+T:VUDS"#k7R$a2)Q'@JqP*(ieO,f3YN/NRMM26tCL5(D9K`6W(K)^E"JGt&sIe\?hIf=iqJH(3#
+K)UB,KS>,7L51TaM-l-uN/WaWO-#KeP*;/rQC!u,R[]h<StD[LU84T]Vl-MoX/rG+YctF>['d?O
+\[oDc]t_=u_Sa=2`lQ6DbKS5VcdC.heCE.%f\,!5gtgiEi8ESSj5f=ak3(smlKeH9$gmBNn*ol;
+o()DDo`"O`pAamcq#C0hqYU0hr;?Nardk*as*t~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'D1neo'u5<n*]T0m-<j"kiV$gj8GAFRJNBPD"qlD
+D"DH?D#%rCD#\AKD!u0<Qh-OBQi*0HQh-UBQi*0JQ1f%lD?#b!PPgRGJr5_Tqi^u@qeZ1Ik)]S'
+rC-]Tqa^ZWs%3,\s%EAcr_<Dfs%iVj!`;inr_ihs<W6#,='/R-=^#$6>[1Q@ra-pY@:E\UA7]=a
+AnPdjBkhF!Ci)j?9R:5fDK0kn8P=&ABOtO@rC@&]87Pq4rF#h<@q.tsr^73(@qB4^A7]7^?X@#C
+@fAdu7qH:HrF,b:rCd5b>Q/R?8H)0\8Gu*n<afH>84lHE8Oc3>7n6!C9h\H+rd,T1H[U<hE,fl>
+FEMbNG^4U]H[C-eI=H`sJV&LQK@>PQXo,@%YPk^)Z2M!,ZhSG>DK#Mnrc.sWr,MUS"*&@%a8X-b
+ai_cJaiMQFrlY8a!R/gec3)>:cHlL:rmCbo"4>QEdJ_Mmdf@npec+/!f`0V+f\+sLPk^I8PkL=<
+PVRlEKnb><M2@+KN/`jYOHG]iPa.N#R$a>3S"-(AT:hmPUSO]^VPg>jWiE,#XKAV-YPta-Z*L\7
+Zi@E4[JI<3\,--pORJ;`VPU)aUS=HUTV%gHS=?":R@'A-Q'IStP*1rhO,o<\N/W[PM2@%ELPCP;
+KnTGXs+:9%r.+crrI4Nir-nWprIFp!s+:6&#)%\aL5(J>reY!>Mi<USO,oBbP*2#oQ'Rc(R@9V8
+SXuIHTq\?YV5L5jWiN5'Y->.9Za@-K\%0)^]Y2(p_8=+.`Q$!?b0/#RcHjnce'uq!f@\d1gYCWA
+hr*GOj5]4^k2tjjl0@U6ljN4Kn*fc9nac8BoCW%Ts7ZKerV6EgrqcNhrqu]mo)=4?^]/f~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb(%h+go'u5<n*]T0m-<j"kiV$gj&B%U<;ohr<<#,O
+55.584RbH.4RP<0:]4&f:]4)i:\mib:]=,h:B45d;>F&_;>*0N56"CS:BFEo<V]\m3r_8C4?Yjh
+;uK/a7f,^U8H29Z9)hQa9`@cd:B+,h:]aKl;Z9Sq<)rou$WgG4=]np4>?kE=?N+:_?t!MR@q9.^
+AnG[hBPD3sCM[iO4?H7r6UF101c.!R5sILn0JY76/M/M32>K$-.0V1M-o*S5r\=U20JP=<r\jd+
+s""+,"ZA+k1G^ld2@26'5<hCf1,:R>rA+d;2)dW[3\rcU3]m7#.6'RX5sIk391qrQ9MA)E5sn%.
+77BU67Rp!>7n?6D8kM`M91qrQ9hnIK:$bUT>Q.h)>6%q)>6%k+>6.u5rET:a!'^BHpce^@s$$*?
+rau4Erb;=GrbMIKrbW*^D/F0.DfBZ8EH6,BFT-=]ErL.[FT6L`G5HL`GQW5;H?oL9!.=NAs&K(u
+oMbQ`p/1]b14t76L5(M@M2I7NNK0']OckomQ'I]'R$sM6S=Z=ETV8*TUnjiaVl-JnWiN2%Xf\b0
+ricI/ZEjJ9s0Vg6qR-C5rO)X5oi(fgpJq/krDP;FV50o^U7n9RT:VUDS"#k7R$a2)Q'@JqP*(ie
+O,f3YN/NRMM26tCL5(D9K`6W(K)^E"JGt&sIe\?hIf=iqJH(3#K)UB,KS>,7L51TaM-l-uN/WaW
+O-#KeP*;/rQC!u,R[]h<StD[LU84T]Vl-MoX/rG+YctF>['d?O\[oDc]t_=u_Sa=2`lQ6DbKS5V
+cdC.heCE.%f\,!5gtgiEi8ESSj5f=ak3(smlKeH9$gmBNn*ol;o()DDo`"O`pAamcq#C0hqYU0h
+r;?Nardk*as*t~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'_M"fo'u5<n*]T0m-<j"kiV$gj37MI"4#6=d/MGn
+d.`CgMXcPbMZ8P+M?2&KrlkVjbK@rJaSa*P`rF'\aN;U(bPKEbbK@uLrQ"uZrl,,\`5BI0M>N2.
+MuSb8NVpNg]`XOoYe9nMqnN9JNK*gq!KW?-^AknG7K,dR8,l-Z8c;9]9E.]b:&dug:]=/l;,U<k
+;[69%<E<.%='5H)$<gY=>[:WA?XI2LraI$\A7]=aB4tsmC27U$Ci+'-Dc9S8<)oK;:77'$Oe&/?
+F8])=<rQ/%<*#.ZO8k4ENJrdRN/NSmM#W;QLl.:UNf[1=;c?[sBoe@=P*:HKJ:U[!;H-Ok;,C-h
+:C^)l92/,\<)Zdr?%\]>T)PAkU84KFP*D5sQC+#/Sc52cTV%pPVPpJpri?1)Y--cfm]c`V!:0LJ
+s6]gR!:TpTrpTmVrp^!XrK?r>r0.8JPa(j+!1(M%ou-L?rP\NLotp^Gs+<4_KnbA=M2@+KN/`mZ
+OHG]iPa.Q$R$jD4S=Q7CT:qsQUSO``Vl-JmWiE,$Xf\b/YHY79Z*O>7s0Vg6q6p2#qS;7./\\'W
+UnaZXTqJ$LSXc1=R[KP1Q^*i#PEM)kOH5H_NJrgSMM[1GLkg_>KnY3ZKE$Q'Jc1,uJ,OihIJnWo
+J,OotJH1<$KE$T)L&Qg?LPUeDMMmFPNK0'\OHG]iPa.N#R$a>3S"-(ATV8'SUnsrdW2ZetXf\e2
+Z*UdE[^WcW]"G\i^VI\&`5Ta:aN;WKc-FY^dF-Lne^i@)g=k<:h;7&IiSrnXjQ>Ufkiq?slg4!*
+mf)YUnF?MK!qZ'Vrq6<bs7cKes7u]kqtp?irVc9cJcEOcJ,~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'D1neo'u5<n*]T0m-<j"kiV$gj8>;ERJ`NJD#8)J
+D"2<>D"MTDD#A/ID";BAR0&bBR/NBLQMHmFQMm0@R/<6JQN*6AD#S8RPEM,nr/q2HGCPC0r0./D
+rK./CCi&oalB)%,r^HfUqa^ZWr^m&\s%EAcr_<Dfs%iVj!`;inr_j&$<E3(#='&N'=UJ>:>[1Q?
+?=.&I@K'^e@q9.^AnPdjBkhF!Ci!s+DJr3B9h\3+@nM&cDK9rHHsTB:91hiM8kVcKE;XVPD>nAM
+C]8&XBl%a-Df8-:8P2QH<c.eR$XmLR@nB9b8OuHF8c;3[7fGma:/">U9i5YPH[>[<s*YW/E,fl=
+FEMbMG^4U]H[:'dI"$TrJc:9$KE$VOL&\7QXo5F&YPta.Z*:L<r3H:-rGM@JrG_OOqf2^Wa8X0[
+aoKQ^aSs?^b66&6cHa]6cMu5id/MGmdK.bBrmC_ns3q"ts4%,!rmh&"!8%,#s4Qt-pQP97oooB>
+s+<4_KnbA=M2@+KN/`mZOHG]iPa.Q$R$jD4S=Q7CT:qsQUSO``Vl-JmWiE,$Xf\b/YHY79Z*O>7
+s0Vg6q6p2#nW<1$/>]/<US=HUTV%gHS=?":R@'A.Q'IStP*1rhO,o<\N/W[PM2@%ELPCP;KnTGX
+s+:9%rIFlsrI4EfrI4`qrIFp!!.t3&s+CB+re>*ALl$tGMi<USNfT6_OckomQ'I]'R$sM6S=Z=F
+TqS6WV5C/hWN*#$Xfnt6Za7'J\%&u[]Y(tn^qmn+`Q#s>aihlPcHjkbdaQ^rf%8R.g=tE=hV[8M
+ioB([k2tjjl07L!m-O--rpKmWnc&(\oCV\Sp&Facp\jmeq>^<gqu-HkrUKl<s1nYb~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb(A.4ho'u5<n*]T0m-<j"kiV$gj&8oWqc*So!*&\U
+q`b!B!'^'=q)n1/q)n+-s%r_k!)WJer_WVjqbI)c!_uNer_WAeqG?raqE=gArB:-D!DcJd:BO9c
+;,dBmqH!VWs#^6Cs#pBGs&A8^r^HfUqa^ZWr^m&\s%EAcr_<Dfs%iVj!`;inr_j&$<E3(#='&N'
+=UJ>:>[1Q??=.&I@K'^a@q9.^AnPdjBkhF!Ci!s+DJq^&4?Ybu3''Z"6:=:46T[._1G^jE1B''4
+5X.M!5Q!eH5PIDs5<qG!0etI?0f1dN4$Gek2DR$D2`EWR2E!NR3''&Z3]T5^3C#ho5<qA$9MA&Q
+:&[fi90km36q%#C$q<ZT84Q0@8P)NI92,=XhbEN6"^,#5>?Y5/>Q7t->6%q->6.u5qHWhZ!^8h5
+oKN"6s(D@Fs(VFH!,MIJqeZCPDf>Vo"`e[*FEDU&ErU4\F9$I_Foll2G5c[lG^4R\H$O^^H[PKe
+s&K(uoMbQ`ohk]ds+<4_KnbA=M2@+KN/`mZOHG]iPa.Q$R$jD4S=Q7CT:qsQUSO``Vl-JmWiE,$
+Xf\b/YHY79Z*O>7s0Vg6q6g@3[C-"Boi(fgpJq/kr)5/CUnjc[TqS-OSt2C@S!ob4R$X)'P`q8n
+OcYWbNfB!VMi*@JLkph@L4t>7re(6&s+1-!rdXlqomQdfrdXlss+(0%re(6(!/:E,BSVD#M2I4M
+N/`jYO-#KePE_>tQ^F//S"#q>StMdNUSO``Vl6SpX0&M-Yd(O@[C3QS\[oGd^;%J"_SjF5a2lBG
+bK\>Yd*^:jeCE.%f\5'6gtgiEi8N\Uj5f@bkNM0plKdg'mI'uB!V#XYncJFTo`"O`pAamcq#C0i
+qYU0gr;HTardk*bs*t~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'(kedo'u5<n*]T0m-<j"kN:pfrlkAd"jYH?dF-M=
+M>`8.M=uhuM<'QkM>W5=da6=cc-=JVbK7iHr5\TPrPo,`ai_fMbfp%1s3(Pfb0'_*s2Y2\rl4uW
+!6"knqMP<2r/:W8r4`$@"GN&4XLeAIr5&<H!0@)=qiC0Zs1SG$r^QcTs%*,\rC[)_s%NAc!_uNe
+r_WVl!)ieps&8tur`0&$=T2G(>$Lu2!F9%2?NjhG@U`hXracXQB4tsmC27U$D/O60E,fl<r_s2(
+;H$Rp<E>Z[RJrW]N/`m[OH,HgR@EfBq4mta%\]MbS=#V-P`UlbNK0!Xr/:l=R@0M5S"-,KSc>8^
+TTK/;'9e]JR$aA5SXuFFSt;UKU8=ffWrB(%Xfek1bch34kiqC3lhp,Jm/ZSRmf;eSn,DeWnaQO?
+!KrTEP5(7=Pl?pJQM6Z^s7=2$_u@UK_tLtI_uG?IKS>/9Ll$tHN/WdXO-#NfPEhE!R$a;1S"-%@
+T:hmOU84T]VPg>jWN)u!XKAV-YHP17Z*CV5Zi@E3[J@9/s80Un^EUCfUnaZXTqJ$LSXc1=R[KP1
+Q^*i#PEM)kOH5H_NJrgSMZ/G:Lkg_>KnY3ZKE$Q'Jc1,uJ,OigIJnWpJ,FfuJV&LQK*I!_Knb>;
+M#N6FMMmFPNK0']OcklkQ'IZ%R$jD4S=Q7DTV8*TUnsueWN*##Xfen4ZEppG[^WfX]=bhl^VRe)
+`5Ta;aND]Mc-FY_dF-Oof%8O,g=k?<h;@/KiSrnYjlY^gkiq?slg4!*mdKW6nF?MK!qZ'Vrq6<b
+!;HHerqZTjqtp?irVc9cJcERdJ,~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'_M"fo'u5<n*]T0m-<j"kN:pfR@3u?s-`nU!1Wq(
+qJ?1IrG2ILrG:k:!,Ut<r+u"@#Fh0NR@0G/R.?UCQM[$>R/`NQR/`NNQMt_$DZ+GIC]\I;Pl?mG
+P5URID0:5[Nr"t>P5LFBDYJ#9OT1CA7K,dR8,l-Z8c;9]9E.]a9`e'c:]=2j;#jMn;u]es<W6#"
+='5H)!Er_,>QJ,:ra,h:@:E\UAH$-OAnPdjBkhF!Ci+'-DfB]9ErJ`4:&IZc976Y`$u^*(Df9T7
+FEMeSI!ka:qKi-f$[R/IH?aUWFEDSFEVsePDuY+`H2`*mI!^0cHiA<kHiA!dEcZC&G5lgbH3\eC
+H[L9lJ:[]Os+:?*K?T&LX8f:!Xo>L'YPtd)Z21d+Zi4h>DYJ)JE;aeVE;jkTEWX>&a83mVap-&5
+bg"GYc2>lecN)>hd/_PmdJ_Jne,7_peH"2"fDjJ+f@\a/g$t=#POt+5PQ-mIK/SC:L51SAM2R=O
+NfT6_P*2#oQ'Rf)R@9V8SXuIHTqS3VUnsrdVl6SpWiN5'Xfek2YctC;ZMh-0[/RK/[f$0rOR821
+U`ZA+TqS-OSt2C@S!ob4R$X)'P`q8nOcYWbNfB!VMi.Lj#)J%hL4t>7re(6&s+1-!rdXlqoR6[e
+s*srs!eGrTrdtE.KnY89LPYqdBo7h-N/`jYOHG]hPEhE!Q^F20S"-%@T:hmPUSO`aVl?\sXKAY0
+Yd1UB[C3QT\\#Mf^V@V%_o0O6aN2NIbg"GZdF$CleCN7'g"P08h;-uHi8N\UjQ5OdkNM0plKdg'
+mI'H3nF5uIncJFTo`"O`p&Ojcq#:*hqYU0gr;HTardk*cs*t~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'(kedo'u5<n*]T0m-<j"kN:pfr_rhsqGd5QrB0F0
+rB0I/q)n..qbR;h;"d]^:ARcc;#!oa;#4&`4o%;7:BX<b:/Fmc<Vfbq4T@SA55eIM;u];c7f,^U
+8H)3Z9)hQa9`7Ze:/=[b;#aAm;Z9Vp;ufqt<WQ9(r`K8*>Q.k.?!dM;"^kbJ@UisJAIrHdBP;*p
+CMRa'DJjB3EH-$u4TIVD3s7Z-3(lpC9)h<Y6iTOU77TfG6NBOL7JoUe6pj=277'C277Kd:77BU3
+6UguA!^oIGr^6ZWr_!8c9)VBg9h\2I6pj=07/]O^7R]d;84H*@8kDTHr(@#`r_:U3"BS]-=^(T)
+s',P.r`oG,qcj,*qE4X<of`FA5!Jd,s(D=E!,;FI!,MRM!c;aiqeZCPDf>Vo!-8!Y!-8$ZrcA-_
+qf_s_qKW-hI!kNds&K(upeq/lr_rSip/1ifs+<4_KnbA=M2@.LN/is[OHPcjQ'IZ&R$jD4S=Q7D
+TV8'RUnjiaVl-JmWiE,$Xf\b0YHY79Z*O>7s0Vd5q6p:1!OfE0;uK\i<W,no;u`X8US=HUTV%gH
+S=?":R@'A.Q'IStP*1rhO,o<\N/W[PreUi8LPCP;KnTGXs+:9%rIFlsrI4BerI4crr."j"JqEuS
+#)%\aL5(J>reY?HMi<USNfT9aP*2#oQ'Rc(R@9V8SXuIHTq\<XV5L5jWiN5'Y->.9Za@-K\%0&]
+]Y2(p_8=+.`Q$!?b0/#RcHjncdaZdtf@S^0g>(N?hr*GOioB+]k2tjjl07L!m-O--n*fc8nc&(\
+oCV\Sp&F^cp\jmdq>^<gqu-HkrUKl<s2"_c~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'(kedo'u5<n*]T0lg!a!kN:pfrlk>c"jYH@d>3VS
+M=uc(M><%tM<BcnM$/^cda6>>c3DP;bf\&KaSa*X`r!gUaT'?_b00Y+!mJj2rlY8_s2Y;_`lH*r
+M?&M4MZ/M6MZ/P4N;gQc]a&_6OI`D]_o)AgqnW?L_85l,o"G4>^:Zo67f,^T8H29[9)hQa9`7]c
+:&n)g:]aKl;Z9Sq<)rous&T\4=]np3>?kE=?!^lF?t'%D"_2(SAS,TSBFeflCMRa'DJjB3EH-#?
+FEI@Y!EN+s;Zp'"T:__SSHG@MS"&W0!1NnV"eD9XSt;MPSd:sZSt;RGStM2EPQmD>R$a>4SGo)c
+T:VXITqS9[WW&psX8o=#Y5k`GYQa.NkNM0qrp0LKrU'CKr:'`Lr/q#B!L&]APPgXFQ2HsEQ,N\&
+_t1h=_uI[K_tLr'JV/T.KnbA=M2I4MNK0']OckllQ'I]'R$sM6S=Z=ETV8*TUnjiaVl6SpWiN5&
+Xf\b0rilF-!4)R0s0Vd5q6p5$r4qC.s.ga3U7n9RSt;LCS"#k7R$a5*Q'@JqP*(ieO,f3YN/NSm
+M#iEfre:H-K`6W(K)^E#JGt&tIe%pdIf=iqJH(3#K)UB'KSBD[A;>ttM2I4MN/`jYO-#NfPE_>t
+Q^F//S"#t?StMdNUSO``Vl6VqX0&M-Yd(L?[C3QS\[oGd^;%J"_Sa@3a2lBFbKS8Wd*^:jeCE.%
+f\,!5gtgiEi8EVTj5f=ak32'olKeH9$gmBNn*ol;o()DDo`"O`pAamcq#C0hqYU0gr;HTbrdk*c
+s*t~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'_M"fo'u5<n*]T0lg!a!kN:pfR@3r>"IY^ICi&rb
+qJ>8/qJ>Y<rG;.Bs-s%WrgE_Pl^%X>QggCAQN3?JD>nGMD>\5MPl?jHP5:@I@r$.4K8YnUqigo?
+rfR1tqeZ=LnrNs7OH2j07f,^T8H29[9)hQa9`7]c:&n)g:]aKl;Z9Sq<)rous&T\4=]np3>?kE=
+?!^lF?t'%D"_2(SAS,TSBFeflCMRa'DJjB3EH-#?FEI@Q!DQ2b9E@d\r-JEkrH\Hhl[&SVrH\]q
+I!g9eH@(#<H4#"FH@1'dEH-#?FT-FbG^4T6H4,"FH[:$dIXZcsJV!cO"+u8[K?&]GWWK6&XST(!
+Y5b^*Yl(d%Z3%@MDZ+GOD?4ZnpM^"Ls)J!Vr,MaW#KFg*aN)BCao0B^bQc>;cHXY[c2Q#gchu2j
+d/DAkdK%bneGn)!f)O>'f[naSf`0V)POk%2POt+5P;@cBK7nr5LPUeEMi<XUO-#KeP*D5sQ^F//
+S"#q>StD[LU8+N[V5C/hWN)u!XK8P+Y-7i/s02R0rNlO2rjDR1r;ZAMm?.FE+/>R(TqJ!KSXc1=
+R[KP1Q^*i#PEM)kOH5H_NJrgSMZ/G5Lkkta!JQ4+KE$Q'Jc1,uJ,XofIK"]pJ,OotJcC?$K)pXZ
+re=s=Ll$tGMi<USNfT6_P*2#nQ'I]'R$sM6SXuFGTqS6WV5C/hWiE,%Xfnt6ZEpsI\%&u[]Y(tn
+^qmn*`Pom=ai_fNcHaeadaQ^rf%8R-g=tE=hV[8LioB([jlY^hl07L!rp1$[mdKW6naZ2@oCMVR
+p&Facp\jmeq>U6fqu-HkrUTr=s2"_c~>
+JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'(kedo'u5<n*]T0lg!a!kN:pfr_ikt<E8rrs#g*?
+p,qn/rB0I/pcS.0!'KsOpeUc^qG7,fpJLc`rDE/LqEFOI"\D?\:/Fja<VTSp4nq5?<W#hj;ZK8c
+7f,^T8H29[9)hQa9`7]c:&n)g:]aKl;Z9Sq<)rous&T\4=]np3>?kE=?!^lF?t'%D"_2(SAS,TS
+BFeflCMRa'DJjB3EH-#?FEICC!BrXE3s%H)3VuGL9)_KI9)M<`9M8"S9E%Wb9ajZ^6psI377B[7
+6UXBB8H20\8P8tR"%l3Z9`@]_9ug$.=8uA(=^##)>P_V)>Pqb+>Q6k_497T-qE=[=!^Ak4pcemF
+B4kmkrb;FKqeZ.HrGM^UEW1"]EcZ8ArH%s[!-S0^s*+Kf"aP?;H$O`7HiR1<<rZ2"<;9Al<;ohk
+;YEsDJV/T.KnbA=M2I4MNK0']OckllQ'I]'R$sM6S=Z=ETV8*TUnjiaVl6SpWiN5&Xf\b0rilF-
+!4)R0s0Vd5q6p4/pJ_#ipJq,jr)<Wk+/>R(TqJ!KSXc1=R[KP1Q^*i#PEM)kOH5H_NJrgSMZ/G5
+Lkkta!JQ4+KE$Q'Jc1,uJ,XofIK"]pJ,OotJcC?$K)pXZre=s=Ll$tGMi<USNfT6_P*2#nQ'I]'
+R$sM6SXuFGTqS6WV5C/hWiE,%Xfnt6ZEpsI\%&u[]Y(tn^qmn*`Pom=ai_fNcHaeadaQ^rf%8R-
+g=tE=hV[8LioB([jlY^hl07L!rp1$[mdKW6naZ2@oCMVRp&Facp\jmeq>U6fqu-HkrUTr=s2"_c~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf(&%=no^qbGo'u5<n*]T0lg!a!kN:q)bl5igcHji9M"QW!
+M#E2*MX62bM?\oC>h.?PdJhJlc3;J:bK@rJouI!Os2b;abkfQcbfe3/b5]Q`aSs3^Mi*CMpko$.
+rf$l8rP%s<"`f0SS>`mq_u%=F_>]JnO8b4@OnZTi^&PbD7f5dU8H29Z9)hQa9`@cd:B+,h;#aAm
+;Z9Sr<)lrt<WQ9(r`K8*>Q.k.?!dM;"^kbJ@UisJAI2s]BP;*pCMRa'rb`']E,fl<F*)MHG'EXZ
+!EE%o;[ZK&<)Z^p<)lmr<)icor_`_pqbdi";c?[p;H$V!DhXXMrgj"Zs.B:^"ehT^Uo1-iWrB(#
+X02H*!3X,AroO1Bs5sOKlK[^$rTsLMs6f^Or:'THrfR2Cs-*JIqNLiA!L8uLQiE?QQ,q%cs8Kq-
+`9kJ?_>qLK_CpFjK7ei2L51SAMMmFQNfT9aP*;,qQC!u,R[]h<St;UKTq\<XV5C/gW2ZesX/u<&
+!NrX*YlCs.ZMh-/[/IE0[f-7$_!&NV^8.NuTqS*MSt2C@S!ob4R$X)'P`q8nOcYWbNfB!VMi.Lj
+#)J%hL4t>7re(6&s+1-!s*surnU:CcrdXlss+(0%re(6("GMSbLPYqdA;Z;(N/`mZOHG]hPEhE!
+Q^F20S"-%@T:hmPUnjibVl?\sXKAY0Yd1UB[C3QT\\#Mf^V@V%_o0O6aN2NIbg"GZd*^:keCE1&
+g"P07h;-rGi8N\Uj5oFckNM0plKdg'mI'uB!V#XYncJFTo`"O`pAamcq#C0iqYU0gr;?Nardk*d
+s*t~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf(A@Foo^qbGo'u5<n*]T0lg!a!kN:orrgE\Os-`k&pMKbC
+kA0^+p20\CqJ-4>>b%:QqjIMQrKuo;pm;&Lqj@ALrbhFH!,h[N!,VUuoofSgC3"WOM37_!qih#B
+rK6nmrbV7hs,[+Jr($`Ws%3,\s%EAcr_<Dfs%iVjs%rbor_ikt<E9$!!EWD&=TM]1r`fJ0?N+:8
+?t!MR@q>RM$"dg`BPD3sCM[keD@1<$EH-#?FEDYKGP+Z/9)qZ`9*e6b9M.rN9M8"W9DqK^8bu$f
+8P;ZJ8P)QJ9j;:SH2)^bHiJBlIJnWpJc13#KE$T)K><3=WWK6&XST%!Y5PR$Z1tWtDZ=YTE;=GF
+E!(*DP/dF@!6P5_#Kt?8c-=PYcMl)gcMu2nd*^7fdJhMldJqYpe,Rnte,Ihsebn"sfDjM'g&@3-
+Pk1+8Pl-^FPk^FqJ:W?*KS>/9Ll%"IN/`jYOHG]iPa.Q$R$jD4S=Q7CTV8'RUSO``Vl-JmWiE,$
+riH4(YPtd+YlM*.Zi7?1[JRE2s7;?=OW^HpU7n9QSt;LCS"#k7R$a5*Q'@JqP*(ieO,f3YN/NSm
+M$AckL5(D9K`6W(K)^E#JH(,tIdqjcIf=iqJH(0#K)UE&KER!`L51TaM.DL%N/WaWO-#KeP*;/r
+QC!u,R[]h<StD[LU84T]Vl-MoX/rG+YctF>['d?O\[f>b]t_=u_Sa=2`lQ6DbKS5Vcd:(feC<%#
+f@em3gYL]Bi8ESRj5]7`k3(sml0@U$m-X6?mfDqJrpg-^o^r.Us7ZKerV6Egs8)WirVZTlo)=4?
+_Z,,~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf(&%=no^qbGo'u5<n*]T0lg!a!kN:q);Z]ou<W5ts4S:l/
+4SV)<4RG6%4Sh,??!R;(rDEPjl;%CVpJLfas%rbmr]]p:r''XH#"M9[:/Fhfp/Urir]U'@qc3So
+rDWYar($`Ws%3,\s%EAcr_<Dfs%iVjs%rbor_ikt<E9$!!EWD&=TM]1r`fJ0?N+:8?t!MR@q>RM
+$"dg`BPD3sCM[keD@1<$EH-#?FEDYKGP=6(5<Cth4?NL(!':*@#Wat*3]]8]3&pappcApG4#o;^
+3]TAh6psI47f,aU7fZ0Z8HDFWrC[,ar(Xt%r)`l"s&f>*q-3Z"!*fD,r`f1]rB1*Cs$$9Br''m?
+s%WN+"DDLaC2<Z^r+uFOrbhpYEH6,Ar,VdXs)e9`s)nBbrHA0brd"Khrd+Wmr`/Pjs&K(upeq/l
+r_rSipe`\pJV/T.KnbA=M2I4MNK0']OckomQ'Rc(R@9V8SXuFGTqS3UUnsrdVl6SpWiN6#XT>T.
+rilF-!4)R0rj;X3qmQI1q,7;n;uK\i<W#hn;]qm2U7n9QSt;LCS"#k7R$a5*Q'@JqP*(ieO,f3Y
+N/NSmM$AckL5(D9K`6W(K)^E#JH(,tIdqjcIf=iqJH(0#K)UE&KER!`L51TaM.DL%N/WaWO-#Ke
+P*;/rQC!u,R[]h<StD[LU84T]Vl-MoX/rG+YctF>['d?O\[f>b]t_=u_Sa=2`lQ6DbKS5Vcd:(f
+eC<%#f@em3gYL]Bi8ESRj5]7`k3(sml0@U$m-X6?mfDqJrpg-^o^r.Us7ZKerV6Egs8)WirVZTl
+o)=4?_Z,,~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqI<(p@e1Po^qbGo'u5<n*]T0lg!a!kN:n'bl5iecK^8bM#E2(
+MX-,hMAD,-MI'Rne^`0udEp4ccHa\YbK@rJaS*[SaSa-\bKTk.s3(JdrQ5,^rlFek!/g]4!K;s8
+N;UE_]a2>]AUTK(V6e#:`;[XK_>M+JNW>.>OT(C<^&l!\]`(Cu8,c'Z8c23\9E.]a9`e'c:]=2j
+;#jMn;u]es<W6#1='/R-=^#!5>[1Q@?=.&I@K'^>@q9.^AnV*V(27N!CM[j*DJsK5EH-#?FEDYK
+GB\:Wn5L*%<)lms;,L7i;H$Ik;c?[s<`N*srDESm#@;+fLR=m6VuEXpWW0"!Wr/suWrfB)Y5PQ5
+Yl<_`jo4BGkNV6rlKeH9qs=COq="7NqNCl@"-Se0P5UUDPkpUBPQI,9Qi5#*`rO3$s89e2`9+u0
+_Z,-BJV/T.L5(J>M2I4MNK0']OckonQ'Rc(R@9V8SXuIHTqS6WUnsrdVl6SpWiN5'Xfeh1rilF-
+!4)O/rj;U2rO2\)ot]t0s1TVOUS=HTT:VXFS=?":R@'A-Q'IStP*1rhO,o<\N/W[PreUZ3L]3#/
+KnTGXs+:9%rIFotrdO<ardOlsrIFp!s+:6&!JH1+L2Md&M2@+JN/WaVO,oBcP*;,qQC!u+R[]e;
+St;UKTqeE[VPgAmWiN8(YHY:;Za@0M\@K2`]Y;.r_8=+/`Q-'Ab0/#ScHstde'uq!f@\d1gYCW@
+hr*GOj5]4^k2tjjl07L!m-O--n*fc8nc&(\oCV\So`Fj]p\jmdq>^<gqu-HkrUTr=s2+ed~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqIB*p@e1Po^qbGo'u5<n*]T0lg!a!kN:lqRf8`QR/CdmD>J)6
+C[l6:D>%cK?<pg+SGerTRfAcUR/30LR/307Qi`UkD>nGED#eJQD>]XkP6dCS=D2YuIts*]P5(7@
+P5^U@D>e;GOT1C@7f5dU8H29Z9)hQa9`7Ze:/=[b;#aAm;Z9Vp;ufqt<Y/>7=BSd1>$G6:?!^iE
+?XR=A@Kg7PAS#Idrb*']C27U$D/O60E,]f:EcZ>EF`qtQG^8dP"AMQa9M>@Ys%E8`rCm;d9)D0a
+;-.+?G^b,@J,artJGt,rK)L?$KXZ[3WWB0%q5jY"ric@+r3?%&oPXVGrc%^PqJcCsrfR?(aiOJ'
+s2tAbrlkSkc-FSXrlkPjd*U2;d/D>ldehMne,\%rf)F;$f`0Y&PPUO<PPp[APPUO9PQ-.hJV/T.
+L5(J>M2I4MNK0']OckonQ'Rc(R@9V8SXuIHTqS6WUnsrdVl6SpWiN5'Xfeh1rilF-!4)O/rj;U2
+rO2\)q2kQ;!0HW2s,\A!US=HTT:VXFS=?":R@'A-Q'IStP*1rhO,o<\N/W[PreUZ3L]3#/KnTGX
+s+:9%rIFotrdO<ardOlsrIFp!s+:6&!JH1+L2Md&M2@+JN/WaVO,oBcP*;,qQC!u+R[]e;St;UK
+TqeE[VPgAmWiN8(YHY:;Za@0M\@K2`]Y;.r_8=+/`Q-'Ab0/#ScHstde'uq!f@\d1gYCW@hr*GO
+j5]4^k2tjjl07L!m-O--n*fc8nc&(\oCV\So`Fj]p\jmdq>^<gqu-HkrUTr=s2+ed~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqI<(p@e1Po^qbGo'u5<n*]T0lg!a!kN:n&;Z]ru<9l^B4S_/<
+4RG5u49Str>Yn8n;>j>W:]F8d;>F&g4oRY84o[_7:]Eie8P;cQ;H36fqH!SYqEF^Ts&8tsr^QfU
+r^d&\r(?u^s%NAc!_uNer_WVl!)ieps&8tur`0S3=BJ^/>$>-8>[:ZB?XI2LraH%@A7]=aBDuQ[
+BkhF!Ci+'-DfBZ8EH6,BFEMbNGBeE&4T[l355[MB3rD&B4[2.p4o.5E4[;>%7nH;M8cVN`9`%H_
+9_D,m:AIrk=T2G'>52=p>lIss4oRYA4oISD5Pn+[9k\6UC27X$C]/)HD>nGUE,ou?qf;XV!-J*\
+s)nBdrcnEfrHeKj!.=]Do2YchpJV&kr_rPhqbdBD1P(12KSG5:Ll%"IN/`jYOHG]iQ'IZ%R$jD4
+S=Q7DTV8'SUnjiaVl-JmWiE,$Xf\b/YPtd+YlM*-Zi7?0[JdN6Zi7?.;uTbr<<-"m<W#hp;u]`<
+UnaZXTV%gISXc1=R[KP1QBd`"PEM)kOH5H_NJrgSMZ/G5Lkkta!JQ4+KE$Q'Jc1-!J,XocIK"]q
+J,OotJcC?$K)pXZre><GLl$tGMi<USNfT6_P*2#nQ'Rc(R$sM6SXuFGTqS6WV5C/hWiE,%Xfnt6
+ZEppH\%&u[]Y(tn^qmn*`Pom=ai_fNcHaeadF6Uqf%8R-g=tE=h;@/KiT&tZjlY^gkiq?slg4!*
+mdKW6nF?MK!qZ'Vrq-?dp\4X]rqZTjqtp?irVc<dJcEUeJ,~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqI9'p@e1Po^qbGo'u5<n*]T0lg!`ukN;WbrltJ#j,*>amYUIk
+(1:KU?!Pt2e^W$pd*U+acHXSVbK@rJpW*-P!QrX_c2YufbPoZ`ao..tMY;u.N;S\4^@o5?^AbnH
+@g$t9U9D9.`;[[R_YCtH^]9DoO8G(:^&YhF7f,^U8H)3Z9)hQa9`7]c:&n)g:]aKl;Z9T"<)lq!
+<``@)r`K8*>Q.k.?!dM;-X^@l@UiqZAS#IdBP;*pC27U$D/O60E,fl<F)uGFF`qtQG^4U]Hh:;.
+;[uc0?Y4(nG^Y4%OHuH4WVirrYlE_\jSe6@kl9lKlKdd8m/-2Gn,2\QOoCOBOo:I@PQ-mDPQ-mF
+aSa*"s8'Y0`9+u2_CU1eJ:`E+Knb>;M2@+KN/is[OckllQ'I]'R$sM6S=Z=ETV8*TUnjiaVl6To
+WWoN*Xf\b/YPtd+Z2_-.Zi.9,[Jg-u_!\u:^)s)CTqJ$LSt2C@S!ob4Q^3o%P`q8nOcYWbNfB!V
+Mi.Lj!JlO1L&m!]re(6&s+1-!s*t#smX>(`s*suts+(0%re#KLKnY89LPUeDMMmFPNK0'\OHG]h
+Pa.N"R$a;1S"-%@T:hmPUnjlcVl?\sXKAY0Yd1UB[C3QT\\#Mf^;%J#_SjF5a2lBGbK\>Yd*^:j
+eCE1&f\5'6gtgiEi8N\Uj5f=akNM0plKdg'mHs?1n*ol;o()DDo`"O`pAamcq#C0hqYU0hr;?Na
+rdk*es*t~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqI9'p@e1Po^qbGo'u5<n*]T0lg!`ukN;c5!1NnTrg<S!nSS,=
+m;)3-q/,qD"CPSC?!RB!qO@MRrgEPKrKl`8qeYe>s).^upQPQ?!0dC_"ClJ$L5l"loooB<r,)@J
+qiCf=r^QcTs%*,\rC[)_s%NAcs%WPirD3Pm;H!Km#?4]'<`W:'=T2G(>$Lu2!F9%2?RK5i@U`hX
+A7]=aB4tsmC2.O"Ci+'-DfB]9EcZ;DFEMbNGBeCZH@,9Xnk0Hd:K(:t?=IM\D/j]DI=_<LV1nrK
+po4=qpoOV#YHRr0r3?('!,qFGr,;USqJZCQr0.&As2bJdaiV]JbKTn/rlkAd"4#6=d/MAid/MGh
+dfn7Oe^i:$rmq)#rn%5(qNLc?plkW=qigl@p6.%WJ:N6(K8#&7LP^kFN/WdXO-,TgPa.N#R$a>3
+S"-(AT:hmPUSO]^VPgAlri-1'XKAV-Y-7i/s0;U0rNlI0q6g2$qN0s(rfA4rTqS-OSt;LCS"#k7
+R$X,(Q'@JqP*(ieO,f3YN/NSmM#iEfre:H-K`6W(K)^E#JH(,uIdVX`IfForJH(0#K)UCJKS>,7
+L51SAM2I4MN/`jYO-#KeP*D5sQC+&-R[]h<StD[LU84T^Vl-MoX/rG+YctF>['d?O\[f>b]tV7s
+_SX71`lH0BbKJ/Ucd:(fe'uq"f@\g2gYCWAhr*JQj5]4^k3(sml0@U$m-X3.n*fc9nac8BoCW%T
+s7ZKerV6EgrqcNhrqu]mo)=4?_uG5~>
+JcC<$JcF@%o`"gfrqu]ks8)ckrqI?)p@e1Po^qbGo'u5<n*]T0lg!`ukN5Z?qc!Mokrni)p-&F<
+loX`""CPSC?!RA*qGI,dq+q#epJ1ccpJLfar]C*Amlg/9r_NSjr^6r]92/2[<)iKiqGmSrrB:$A
+qc*Vqr^QcTs%*,\rC[)_s%NAcs%WPirD3Pm;H!Km#?4]'<`W:'=T2G(>$Lu2!F9%2?RK5i@U`hX
+A7]=aB4tsmC2.O"Ci+'-DfB]9EcZ;DFEMbNGBeCZH@,9IniRCF5!M:u6:4./77Kg>8ke5=^J=c/
+q,dMts'#5&pfmf)r`oJ-lokA4q)n^ApItU$rbDFJrbMaTCi!s*DZ4PSE;OYRErL+^FEM_JrcJ9c
+GB`n.rd"Nj!.=WBo2YchpJV&kr_rPhrD>+qJ:N6(K8#&7LP^kFN/WdXO-,TgPa.N#R$a>3S"-(A
+T:hmPUSO]^VPgAlri-1'XKAV-Y-7i/s0;U0rNlI0q6g1-qc!JnoMtfgrDW\n+/5I&TV%gISXc1=
+R[KP0QBd`"PEM)kOH5H_NJrgSMZ/G5Lkkta!JQ4+KE$Q'Jc1-!J,XobIK"]qJ,OotJH1<$K6`-(
+Knb>;Ll$tGMi<USNfT6_OckllQ'IZ&R$jD4S=Q7DTV8*UUo(&fWN*##Xfen4ZEppG[^WfX]=bhk
+^VI_'`5Ta:aN;WKc-FY^dF-Lne^rF*g=k<:h;7&IiSrnXjQ5Oekiq?slg4!*mI'H3nF?&>o(2JF
+rq6<bs7cKes7uZjqtpBjr;H3cJcEXfJ,~>
+JcC<$JcF@%o`"gfrqu]ks7u`krV.3'p@e1Po^h\Fo'u5<n*]Q/lg!`ukK_?NbQH,6bg$$BmYUn"
+r/'m"q2,'-rJC-'%UiaP?<u17f%&=#e'cUirm(eoc-4ARaiO>!rlFrX!R&^`bm)D8bKA#NanUem
+MYW21Muo!!^\bbE^&PhF^&G_J^V7Itrac%=")j!f\Ga>D`;RUQ_YCtI_#KJpO8tFBO9L]Z]tHm)
+qa^ZWr^m&\s%EAcrD!;es%iVjs%rbor_rhr!*0#!.p#hT=]np4>?kE=?=$uG?t!JQ@Uiq[AS,Oe
+BP;*pCMRa&D/O60E,fl<F8g7iF`qtQG^4U]H[L3hIJQq5;[uo:ASZ:1I=mE=QCXbKYGAE#iW/$<
+j8e<@k5XWEkQC)7lKeE8r9XLPq=":Onr`m6pQGTtqT/QSaT)(RqS_O6pqet=It3'$K7el4L5:\C
+Mi<XUO-#KePE_>uQ^F20S"-%@StMdNU8+N\VPg>jWN)u!X/rG*Y-+u-YlD!.ZMV!%[/^1!_!\u9
+^AjlHTV%gISXc1=R[KP0QBd`"PEM)kOH5H_NJrgSMZ/G5Lkkta!JQ4+KE$Q'Jc1-!J,XobIK"]p
+J,XuuJcC?%KE$UAKnb>;LPUeDMMmFPNK0']OcklkPa.Q$R$jD4S=Q7DTV8*TUnsrdW2cl!Xfek3
+Z*UdE[^WcW]"G\i^VI\&_o9U8aN;TJbg+M[dF$FmeCN7'g"P08h;-uHi8N\UjQ5OdkNM0plKdg'
+mI'uB!V#XYncJFTo`"O`pAamcq#C0hqYU0hr;?Nardk*fs*t~>
+JcC<$JcF@%o`"gfrqu]ks7u`krV.3'p@e1Po^h\Fo'u5<n*]Q/lg!`ukF7q>S,\rVRJLacD>\5=
+C\_fFD>e;BD$49T?X@%6SGSfURK/cOR/`N>QiNQQR/Uq&DZ4MMD"_]GDYfUsPQ-mHPPLFL=B8F%
+<aBQjN0O=*q3(E7s-!@uqJ6:rO,lb"qa^ZWr^m&\s%EAcrD!;es%iVjs%rbor_rhr!*0#!.p#hT
+=]np4>?kE=?=$uG?t!JQ@Uiq[AS,OeBP;*pCMRa&D/O60E,fl<F8g7iF`qtQG^4U]H[L3hIJQY-
+9+F]p<a&g<Anc+%Fa8CdKVX>$W;`dmWrK+"XSJsuY5YX(Yl1j&ZMSS4DYJ)IPl?mDOoWZ(aTK]/
+bKTn/rlkAdqTo,es3Uqse'lbDe,.\pf)=2&f\+s3q31Z>q31]=qigl@pldXcIt3'$K7el4L5:\C
+Mi<XUO-#KePE_>uQ^F20S"-%@StMdNU8+N\VPg>jWN)u!X/rG*Y-+u-YlD!.ZMV!%[/^1&OQho+
+OT2!oTV%gISXc1=R[KP0QBd`"PEM)kOH5H_NJrgSMZ/G5Lkkta!JQ4+KE$Q'Jc1-!J,XobIK"]p
+J,XuuJcC?%KE$UAKnb>;LPUeDMMmFPNK0']OcklkPa.Q$R$jD4S=Q7DTV8*TUnsrdW2cl!Xfek3
+Z*UdE[^WcW]"G\i^VI\&_o9U8aN;TJbg+M[dF$FmeCN7'g"P08h;-uHi8N\UjQ5OdkNM0plKdg'
+mI'uB!V#XYncJFTo`"O`pAamcq#C0hqYU0hr;?Nardk*fs*t~>
+JcC<$JcF@%o`"gfrqu]ks7u`krV.0&p@e1Po^h\Fo'u5<n*]Q/lg!`uk>V@Xs&/nsr_ql@pcS44
+r]L$=rB1$?o/m.a?sd5Gr)!)as%rPfr_WAcs%i_n;#*ue;"m'N4S:l;:@h9[;#X5j7K#UV77g3N
+rDW\pp/Uujs&JeWr`/tfqa^ZWr^m&\s%EAcrD!;es%iVjs%rbor_rhr!*0#!.p#hT=]np4>?kE=
+?=$uG?t!JQ@Uiq[AS,OeBP;*pCMRa&D/O60E,fl<F8g7iF`qtQG^4U]H[L3hIJQ+s4:XM<5<qM%
+6psI584cEH9]Jja:A\)g=8uD%=oV\$>PMJ'?2n10>Q6hJ4oA%L9`Jf0C2%EuC]8,RD/=$*D/T>k
+qJlISs)\3^!d/U,rcJ3arceBe!-eEercnKjrd=N@s&B%up/V)kpJV&kqc!8f2h$7,J:`E+Knb><
+M2@.LNK0']OckomQ'Rc(R@9V8SXuFGTqS3UUnsrdVl6SpWiN2%Xf\b/YPtd+Z2_-,ZhCd+ZM[Z"
+<:j2g<;fbo;ZEF1TV%gISXc1=R[KP0QBd`"PEM)kOH5H_NJrgSMZ/G5Lkkta!JQ4+KE$Q'Jc1-!
+J,XobIK"]pJ,XuuJcC?%KE$UAKnb>;LPUeDMMmFPNK0']OcklkPa.Q$R$jD4S=Q7DTV8*TUnsrd
+W2cl!Xfek3Z*UdE[^WcW]"G\i^VI\&_o9U8aN;TJbg+M[dF$FmeCN7'g"P08h;-uHi8N\UjQ5Od
+kNM0plKdg'mI'uB!V#XYncJFTo`"O`pAamcq#C0hqYU0hr;?Nardk*fs*t~>
+JcC<$JcF@%o`"jgrqu]ks8)ckrV-EfpAX^co^i(Q&+T/Xmd9B-lg!`ukKhGuc2Poec1QtjM#`G/
+M><&/MscJuM=6<*@UWYO?<mK]&D#C^eC)akdEp4ccHa\Yb/sP$rQ+iW!m8^1q9Ao_!6atlqhk6.
+!5JEF!58?Frk86D!5JKH!+Z"=s'l.DJ=*S2_u@OK_>]MpOSt4?7f,^T8H29Z9)hQa9`@cd:B+,h
+;#aAm;Z0Mp<)rous&T2&r`K8*>Q.k.?!dM;$=I:O@UinYAS#Idrb)ILC27U$D>nDkDfB]9EcZ>E
+F`hkOGBeCZH@($eI=6QoJ:LVh;[uo:ASZ:1I=mE=QCXbKYGnc+WrCrViVqg:j8S->jo=KBk61#5
+lK[^5m/QGRmd:#AqsXLQmudR3r0-uts2auUb5_4RqS_g>!5eTMqSG4?IXcm!JqJ`1L51SAMMmFQ
+NfT9bP*;/rQC+&-S"#q=StD[LTqeEZV5C/gW2ZesX/rD)Xfek2rilF-rj)C,q6U40s8Vf.m_A_7
+s.LF*T:VXFS=?"9R$a5+Q'IStP*1rhO,o<\N/W[PreUi8LPCP;KnTGXs+16%rIFlsrdO6_rdOls
+rI=s#JqEuS!JH1+L2Vj'M2@+JN/WaVO,oBbP*;,qQ'[l*R@B\9St;RJTqeEZVPgAlWiN5'Y->.9
+Za@-K\%0&]]Y2%o^r!t,`Q#s>aihlPcHjkbdaQ^rf%8R-g=tE=hV[8LioB([jlY^gkiq?slg4!*
+mdKW6nF?MK!qZ'Vrq6<b!;HHerqZTjqtp?irVc9cJcE^hJ,~>
+JcC<$JcF@%o`"jgrqu]ks8)ckrV-EfpAX^co^i(Q&Fo8Ymd9B-lg!`ukF7s0R[a;Fs)%aOr+uFO
+q/$+Lmqr#>rbMOMoP=A@mqi5;@:3GK>kjfhS,SrXS,\oWRH0b7RK&ZJDZ+GMD#/#FPQ6pGPQ6pA
+PlI$K=T;J&<<H?9G_c6^rfd2AoTT;lqJ61L7f,^T8H29Z9)hQa9`@cd:B+,h;#aAm;Z0Mp<)rou
+s&T2&r`K8*>Q.k.?!dM;$=I:O@UinYAS#Idrb)ILC27U$D>nDkDfB]9EcZ>EF`hkOGBeCZH@($e
+I=6QoJ:L>`9+F]p<a&g<Anc+%Fa8CdKW0\*WrApqW;`dmWrK+"XSK!uY5b^'YlD!(ZMJM1DZ"GH
+Pl6gFOoibJb5TTablQ&5rQP;d"O>?>cHcC7rQkVndaJ-DrmV"ueC=KJrRUu#rn7A,pQPH<qigi=
+qigl@qNEmeIXcm!JqJ`1L51SAMMmFQNfT9bP*;/rQC+&-S"#q=StD[LTqeEZV5C/gW2ZesX/rD)
+Xfek2rilF-rj)C,q6U40s8VtXl&kq+s.LF*T:VXFS=?"9R$a5+Q'IStP*1rhO,o<\N/W[PreUi8
+LPCP;KnTGXs+16%rIFlsrdO6_rdOlsrI=s#JqEuS!JH1+L2Vj'M2@+JN/WaVO,oBbP*;,qQ'[l*
+R@B\9St;RJTqeEZVPgAlWiN5'Y->.9Za@-K\%0&]]Y2%o^r!t,`Q#s>aihlPcHjkbdaQ^rf%8R-
+g=tE=hV[8LioB([jlY^gkiq?slg4!*mdKW6nF?MK!qZ'Vrq6<b!;HHerqZTjqtp?irVc9cJcE^h
+J,~>
+JcC<$JcF@%o`"jgrqu]ks8)ckrV-EfpAX^co^i(Q%IrrVmd9B-lg!`uk>YCY;?9]qmQCP6of_q0
+p-%P#"_(nJ?X@"7;#O5k;Ys>k;#=#j:f1(dpJ:fcpeh&f!'Kg6rB0p>r_E,^rD<Ae!(6WO!_>s[
+qG[Amoi:ojpHARHqa^WVs%3,\s%EAcr_<Dfs%iVjs%rborDN_r<W6&!<rcA%=TM]1r`fJ0?N+:=
+?t!MR@q0%\AS,TSBE`*bCMRa'rb`WmE,fl<F*)MHF`qtQG^4U]H[L3hI=?ZrJ3EEb%R!!?5X@b*
+6q'R98P2WLj%[Qhs/PipqH*Yu!*T;)q-3Sus'>V.r]U3Bm61DCr([2ds%WDb"DVXbC23``rbMmX
+DJjB2E,fl:E;abVErL.ZFT-F]FoZabGQ;seGQrG>H[L3hIJ6\><;'>k<;0;k<;TVj;E0)RIt3*%
+K7nr5LPUeEMi<XUO-#NfPEhE!R$a;2S"-%@T:hmOUSO]^VPg>jWN)u!XK8P+Y-5&.YlD!-ZMLp'
+Zi[S=Z2IW#<:a,g<;]\n;ZEF1TV%gISXc1=R@'A.QBd`"PEM)kOH5H_NJrgSMZ/G:Lkg_>KnY3Z
+KE$N'Jc1,uJ,XoaIK"]qJ,Om!JV&LQK)pXZre>?HLl$tGMi<USNfT6_OckomQ'I]'R$jG5S=Z=E
+TqS6WUo(&gWN*##Xfen4ZEppG[^WfX]=bhk^VI_'`5Ta:aN;WKc-FY^dF-Lne^i@)g"P39h;7&I
+i8WeWjQ5OdkNM0plKdg'mI'H3nF5uIncJFTo`"O`p&Ojcq#:*hqYU0gr;HTardk*gs*t~>
+JcC<$JcF@%p&=pgrqu]ks8)ckrqQNf!;?Eb(\I=io'u5<n*]T0m-Ep#kg.W%ccs_YbjUGhM>E,0
+M>2u)Mti/0Mu&>.M=ZT=A7K(W?XI,Ef\"g-f%&@$e'cXjd/MAkc2u54ans-WaSO!ab0/#RcHa\[
+cMl&gbjLDgMYi;8^q[Uu^;'NY!58!<s()(<s'c(SOJot`_uIUL_>fPr7K,dR8,c'Z8c23\9E.]a
+:&drg:]4)k;,U<k;Z]ou<W6#"='5H)&6`:B>[1Q??=.&I@:<VS@q>RM.qWF-BPD3rCMRa'DJjB2
+E,fl<F*)MHG'8(RG^4U]H[L3hI=?ZrJ:W9'KD&4R=C5WTEHlnaMNF-pU8Y9!YlC^%W;YTRi;V^7
+irA'=jSn9@k5XTJkiq?slg+K8rpB[Pr9sURm#h70rlFQKbQ%7QqS_j?s2+WMr5/J^0n+V&JV&N-
+KnbA>M2I7NNK9-_P*2&pQ'[l*R[]e;St;RITq\<XUnsrdVl6SpWiN6#XoGO(YPk^*Z2_-"ZiC("
+_!\u8^)`o?T:VXFS"#k7R$a5+Q'IStP*1rhO,o<\N/W[PreUi8LPCP;KnTGXs+16%rIFlss*j<_
+rdOlsrIFp!!.t3&s+CN/L5(J>reYBIMi<XUO,oBbP*2&pQ'Rc(R@9V8SXuIHTq\<XV5L5iWiE/&
+Y-5(7Za7'J\%&u[]Y(tn^qmn*`Pom=ai_fNc-FY_dF6Upf%8O,g=k?<h;7)JiSrnXjlY^gkiq?s
+lg4!*mdBQ4nF?MKs766_rq6<bs7cKes7uZjqtpBjr;H3cJcE^hJ,~>
+JcC<$JcF@%p&=pgrqu]ks8)ckrqQNf!;?Eb&+oJao'u5<n*]T0m-Ep#kl%"NRK8nHp20YDs)%UM
+mqqf8oP=DApMC4I@q&kR?X@!.Sc,)WSc,)YS,\oWRHKt7RIY7fD<mG`Q2Oei=&r=$@rd0aqiq)D
+rfZf8s(h[(r^QcTr^d&\r(?u^s%NAcs%WPirD3Pm;H!Km!`W0"r`0&$=T2G7>$G39>[:WA?XI2L
+@:E\UAH$-jAnPdjBkhBuCM[j*DJsH4EH-#?FEDYKG'A.TH$Xd`I!g?jIXcluJUrE*p.Glj;H?t-
+@:j4jEHQPTJV:4\s/H!rrMKUmri#dpql0^uXK;3!s/u@)rNH:,q6L!;r,;:Hs)%^Prg!)>rK@9*
+b5TTac25`bc2Z&jcd'i7ci)5idf%VteC2mreG[qtecXOVf\-5Wooo9;qigf<qigl@r0.//0n+V&
+JV&N-KnbA>M2I7NNK9-_P*2&pQ'[l*R[]e;St;RITq\<XUnsrdVl6SpWiN6#XoGO(YPk^*Z2_-"
+ZiC()OQVc(O<($fT:VXFS"#k7R$a5+Q'IStP*1rhO,o<\N/W[PreUi8LPCP;KnTGXs+16%rIFls
+s*j<_rdOlsrIFp!!.t3&s+CN/L5(J>reYBIMi<XUO,oBbP*2&pQ'Rc(R@9V8SXuIHTq\<XV5L5i
+WiE/&Y-5(7Za7'J\%&u[]Y(tn^qmn*`Pom=ai_fNc-FY_dF6Upf%8O,g=k?<h;7)JiSrnXjlY^g
+kiq?slg4!*mdBQ4nF?MKs766_rq6<bs7cKes7uZjqtpBjr;H3cJcE^hJ,~>
+JcC<$JcF@%p&=pgrqu]ks8)ckrqQNf!;?Eb'D1neo'u5<n*]T0m-Ep#kZ(V^<;f_^4o.A=4n1Z5
+4TI\@4mtK<A7K(W?XI,EqbR8ir)3Dh!)WMf"&Mil;"mcc;#*rk:d$s(4S(Z54Sq;?:A7Q_;#!fd
+:B!TX6NfkN9i+a`;uTbh<W,tu4oe%N7f,^T8H29Z9)hQa9`7]c:&n)g:]aKl;Z9Sr<)lrt<WQ9(
+r`Ke9>?b?;?!UcD?XR;N@U`hXradTlB4tsmC2.O"Ci+'-Df9T7EH6,BFEMbMGB\:WH?spcI!pEl
+It3'#JV&OJ4:XM<5<qM%6psI584cEH9]Jjl:B.<mW;T`k<r,nt=9)M'>52=s>Qe>;>[(G04o7A6
+4oS7R:&n#c:B+&g9`Jc,BkmW_rbMmXDJjB2E,]f9E;abVErC(YFT-F^FoZacGlN!eGQE)9rd=`o
+s&A_kr`&Skr`&Acr)3QC0n+V&JV&N-KnbA>M2I7NNK9-_P*2&pQ'[l*R[]e;St;RITq\<XUnsrd
+Vl6SpWiN6#XoGO(YPk^*Z2_-"Zi@<1;uTbf<W#ho;uBN6TqJ$LSt2@?R[KP1Q^3o%P`q8nOcYWb
+NfB!VMi.Lj#)J%hL4t>7re(6&!.k*!rdXrsm!\k^s*suts+(0%re(6("GMSbLPYqdC5Rq.NK0'\
+OHG]hPa.N"Q^F20S"-%@T:hmPUSO`aVl6VqXKAY/Yd(O@[C3QS\[oGd^;%J"_Sa@3a2lBFbKS5V
+cdC.heC<($f@em3gtgfCi8ESRj5]7`k3(sml0@U$m-X6/n*fc9rpp*\!;-9`s7ZKerV6EgrqcNh
+rqu]mo)=4?`W(G~>
+JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb(A.4ho'u5<n*]T0m-Ep#kg.W&cd0k\onra,l&,(j
+oSWU(rJLK1s,%+oA7K(W?XI,Eg&9P7f@JO&eC2jndEp4ccHXVVaSj0WaSs<]b5]Qcb0/#Rqp#5e
+cK'ld_8*k$_#;%B^AktF^AkqJ_#7dCAH-0>@KUS)TXaF-s2+TJr^QcTs%*,\rC[)_s%NAcs%`Si
+r_WVl!)ieps&8tur`9&#!*K5'!Er_,>QJ,:ra,\6@K'^C@q9.^AnG[hBPD5\CB\NkDJjB3rc&*^
+F*)MHG5c[mG^4U]H[L3hI=?\FJ-LRVK7ei1L&=jZ=C5WTEHlnaMNF-pU8Y9'YkY-nhuDX6iW%p;
+j8S->jo4EAkl9lKlKdd7m/?>MmeuVQnElA<Oo^]cq8i-IbQ$D9o>3>2I=6QpJ:W?*KSG5;M2@.L
+NK0']OckomQ'Rc(R@9V8SXuFGTqS3UUnjibVl6PnWiE,$riQ4'!3c@*riuI.o<\JspqZ=4qn=&B
+St;LCS"#k7R$a5+Q'IStP*1rhO,o<\N/W[PreUi8LPCP;KnTGXs+16%rIFotrdO0]rdOlsrI=s#
+JqEuSDhNh!L51P?M2@+JN/WaVO-#KeP*;,qQC!u,R[]e;St;UKTqeE[VPgAlWiN8(YHY:;Za@0L
+\@K2_]Y2(p_8=(-`Q#s>aihlPcHjkbdaQ^rf%8R-g=tE=hV[8LiT&tZjlY^gkiq?slg4!*mf)YU
+nF?MK!qZ'Vrq6<bs7cKes7u]kqtp?ir;H3cJcEaiJ,~>
+JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb&+oJao'u5<n*]T0m-Ep#kkpqMRe:O`DXMB:D"qf@
+D#\>XARo:[@:*AJ>kX`eSH#&[R[KT.R/<<KD>%l?D#fjfPkgUC=8uD&<s;W)?>b1Mrfd>GlBD3:
+qa^ZWr^m&\s%EAcrD!;es%iVjs%rbor_rhr!*0#!s&T2&r`K8*>Q.k.?!dM;!FT@8@L?UUAS#Ic
+B4tsmCAquPCi+'-DfG\q"`e[+FEMd+G7&S?H?spcI!pElJ,Xs&JV&N,KS5'W9+F]p<a&g<Anc+%
+Fa8CdKXHO/Vu*@jVuEXoWVidrWroH*XfhN&s/u=(rNQ+'q/-1Nrb_^Sphg+LPkgU9PQd8nbKJ,S
+rlkDcs3(Jfqp,/drm1YmrmL_n!7Lkq!7_"us4.5&f`'S'g&TmtPkgO;P4=_mH[U<kJ:N3'K7nu6
+Ll$tHN/`jYOHG]iPa.Q$R$jD4S=Q7CTV8'RUSO]^Vl-JlWN)u!XT#@%XoP[(Yl:p,ZLbF&s8S2[
+Oo:I2Oo(4[T:VXFS=?":R@'A.QBd`"PEM)kOH5H_NJrgSMZ/G:Lkg_>KnY3ZKE$N'Jc1-!J,Xo_
+IK"]qJ,Om!JV&LQK5ZEsL5(J=Ll$tGMi<USNfT9aP*2#nQ'Rc(R@9V7SXuFGTqS6WV5C/hWN*#$
+Xfnt6ZEppH[^`lZ]=bhl^VRe(`5Ta:aN;WKc-FY^dF-Lne^i@)g"P39h;7&Ii8N_VjQ5OdkNM0p
+lKdg'mI'uB!V#XYncJFTo`"O`pAamcq#C0iqYU0gr;?Nardk*hs*t~>
+JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb&+oJao'u5<n*]T0m-Ep#kl+T^<<#kc4oIM@4oISB
+4mG/q4o[VMARo:[@:*AJ>l7Ft;>a>i;?'Ji:BOEj;,I3es%rVh"&Mil;#F/j4oIM548qA?4oA(N
+:]+&b:]4&g6i04M6N]_J9i(ac!)iSjr`&Sks&T+gqa^ZWr^m&\s%EAcrD!;es%iVjs%rbor_rhr
+!*0#!s&T2&r`K8*>Q.k.?!dM;!FT@8@L?UUAS#IcB4tsmCAquPCi+'-DfG\q"`e[+FEMd+G7&S?
+H?spcI!pElJ,Xs&JV&N,KS5'W4:XM<5<qM%6psI584cEH9]Jjr:AC^e<;]bk<r5tu=T2J&>5MM)
+>[.,2!*fA+r`f1]q)nU=s#pHH:AI]W:'OF+BPD3sC]8,PD/O60qf)LR!-8$ZrcJ-^s*"Ed!-nEc
+"*f*;HiAElI0*DJ<;0>f<;KVo<:*U@H[U<kJ:N3'K7nu6Ll$tHN/`jYOHG]iPa.Q$R$jD4S=Q7C
+TV8'RUSO]^Vl-JlWN)u!XT#@%XoP[(Yl:p,ZLbC*Yd%,+<;ons<qo\m<;]\l;B2=#St2C@S!ob4
+R$X,(Q'@JqP*(ieO,f3YN/NSmM$AckL5(D9K`6W(JcLB#JH(,uId;F]IfForJ-(:RK)UC@KS>/8
+LPL\BM2I4MN/`jYOHG]hPE_>uQ^F20S"#t?StMdNUSO``Vl6SpX0&M-Yd(L?['mEQ\[oDc]t_=u
+_SX71`lH0BbKJ/Ucd:(fe'uq!f@\d1gYCWAhr*GOj5]4^k2tjjl07L!m-O--rpKmWnc&(\oCV\S
+p&Facp\jmeq>^<gqu-HjrUTr=s2P(h~>
+JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb(%h+go'u5<n*]T0m-<j"cHjh`d*L#9MuSb6MuS\2
+MsQ>rMZA_6Mt;f+M>W80MuS_EAn>L_@UWVN?<l4;g&BV0f@JO'eC;sqdJhJqcd'bXanWsWao'<]
+b6#o4c2Gofch`UcMuUWm^]M?f_#1qI^AP_I^;%G\^&c!arPADArFGq<")<CTZ2MT>_Y1nD_Yh7J
+8,l-Z8c;9]9E%Wa:&dug:]=2j;?'Pn;Z]ou<W6#"='5H)'j=gG>[1Q??=.&I?t!MR@q0%\AS,TS
+BF8HgCMRa&D/O60E;jhoEcZ>EF`qqPGBeCZH@(!dI=6QoIt3'#K)UB'KSBD[%YojsM/dcgK8PbV
+SYE'd^T[^7o;2SchVS.erS[\6s5O"<s5j:Cs6'CF!U8nKli-8LmJQDOn,;bPOoLU;Onm&paRdHs
+rrC!n_t1`,I!pEmJ:N6(K8#&8Ll%"IN/`jYOHPcjQ'IZ&R$jG5S=Q7DTV8'RUSO``Vl-JmWN)u!
+XK8P+Y-+t3rNQ:+r3H1*rNZG'p;$14qn=DLSt;LCS"#k7R$a5+Q'IStP*1rhO,o<\N/W[PM2@%E
+LPCP;KnTGXs+16%rIFotrdO0]rdOlsrIFp!!.t3&!JH1+L1Z3sM2@+JN/WaVO,oBbP*;,qQ'[l*
+R@B\9St;RJTq\?YVPg>kWiN5'Y->.8Za7'J\%&u[]Y(tn^qmn*`Pom=ai_fNc-FY_dF-Oof%8O,
+g=k<;h;7&IiSrnXjQ5Oekiq?sli-5YmI'H3nF?&>o(2JFrUg6cp\4X]rqZTjqtp?irVc<dJcEai
+J,~>
+JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb&+oJao'u5<n*]T0m-<j"Rf&WTRdk7\DY7iHDYJ#C
+D#8#FC^OccA7K(W?XI,ET(\`RS-5=MR[KT0R/<<CD>S5FD?#n#PQ7!>PkgUCQMsq`=8uD&<s)Z@
+G_kaNpQGGEs%*,\rC[)_r_3;cs%`Sir_WVls&/hp!`W0"r`0&$=T2G<>$G39>[:WA?XI2K@:E\U
+@q9.^AnV*V$>F6jCM[g(DJjB3rc&cqF*)MHG'8(RG^4U]H[C-gI=?ZqJ:N3&rdt6)L&Qf:LPUeD
+?=@G[D/j]DI=['dK`It@V?!IlV?!IkVZ!FlW;ijoWWB0%rN-(&qlTn$qlg%(!3uC+rbqIIrbqdR
+q3:cAo9B3trQG5b!6tMg!6tMgrQbPldF%sArR:bo!n5ZKrm_,%f@S[Sg&Kb,g"PnZqig]9nrl._
+I=6TqJ:`E+KnbA=M2I4MNK0']P*2#oQ'Rf)R@B\9SXuIHTqS3UUnsrdVl6SoWiE,$XKAV-Y-5&-
+Yl:p*ZMLp+Z3(&fOT(C<P4Fb4O=$TkSt2C@S!ob4R$X,(Q'@JqP*(ieO,f3YN/NRMM26tCL5(D9
+K`6W(JcLB#JH(,uId;F]IfForJH(0#K)UB'KSBD[Aqu2!M2I4MN/`jYO-#KePE_>tQ^F/.S"#q>
+StD^MU84T^Vl-MoX/rG+YctC=ZaI6N\@K2`]Y;.r_8=+/`Q-'Ab0/#RcHjncdaZdtf@S^0g=tH>
+hV[8MioB([jlYail07L!rp1$[mdKW6naZ2@oCMVQo`Fj]p\jmdq>^<gqu-HkrUTr=s2P(h~>
+JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb&+oJao'u5<n*]T0m-<j"<;fet<)`ZXof`"2qE<n%
+n3%(iARo:[@:*AJ>l7Cu;>F,f;?'Ji:BF?i;>X2e:]4,i;#jGh4oRS63rhDB4oA(O:\mob:\dca
+6iKFP62s7S6UsgG;Z0Jm;YX2i<;'>i8,l-Z8c;9]9E%Wa:&dug:]=2j;?'Pn;Z]ou<W6#"='5H)
+'j=gG>[1Q??=.&I?t!MR@q0%\AS,TSBF8HgCMRa&D/O60E;jhoEcZ>EF`qqPGBeCZH@(!dI=6Qo
+It3'#K)UB'KSBD[%YojsM*XKs6q'R98P2WLj%\?)!2]:a!2]WnrDiVnrDs)'='/T&=oV\&>Ph\)
+>Q.n+>P:5T49.P?:ARcY:&o#-CB&,MD?"JRDuO\UDuO_UEW:(XF8g:\FoQX`G5ugcG6<)9H[GX;
+"BJN&<)iTjqGd;kr`&;a4+)I)It3'$K7el4LPUeEMi<XUO-#NfPEhE!R$a;2S"-%@T:hmOU8+N\
+VPg>jWMuntX/rD)Xfeh1YPk^)Z2Cp(Zi.03Y>\D"r`/eqr)NYor)<Jj-D-m$SXc1=R[KP1Q^3o%
+P`q8nOcYWbNfB!VMi*@JLkph@L4t>7re(6&!.k*!s*t#sl[Ab]s*suts+(0%rdt6)L&Qg=LPUeD
+MMmFPNK0'\OHG]iPa.N#R$a;2S"-(AT:qsQUnjlcVl?\sXKAY0Yd(O@[C3QS\[oGd^;%J"_Sa@3
+a2lBFbKS5VcdC.geC<($f@em3gYL]Bhr*JQj5]4^k3(sml0@U6ljN4Kn*fc9nac8BoCW"S!quB_
+rV6Bfs8)WirVZWmo)=4?`rCP~>
+JcC<$JcFC&o`"gfrqu]ks8)ckrqIE+p@e1Po^qbGo'u5<n*]T0lg!a!c-FY]d*V]Kpl+s*rJLQ3
+!/gc6!/g`5!/gQ0q2G*,!K)g3MZ/MFN+cm:ARo7Z@:*AI>h[obg&BY(f*9gVeC;sqdJhJrcd'bW
+aN=8!s2k5^s3(Dc"3o-:ch!+bMuUWp_8-&drP/]T^qd_#^q[Y"rkJHH!l)OdrPANL!P`+CA,Ts<
+AcH9DAUKZ@_Z%IM_YV1K_>qFL_>qFO8,c'Z8c23\9E.]a:&drg:]4)k;,U<k;u]es<W6&!<rcA%
+=TM]1r`fh:?=$uG?t!JQ@UisJAH?CUrb)XQC27U$D/F0.DfG\q$?C30FEMbMGB\:Wrd#<+I!pEl
+IXcluJUrE*K7nr4L5(J=M#N53MMqIm!N3*AYPk6bU]B6LhYc:/i;_d9iW/$<jT"?Ak5FKBkl9rI
+li-8MmJH>On,;_UOo:C>Oo:I?On?ZoaRR<rs8Ksn_t:f"H[L6jIt3*%K7nr5LPUeEN/WaWO-,Tg
+Pa.N#R$a>3S"-(AT:hmPUSO]^VPg>jWW&n!X/rE%XTGZ/YPbX'Z1bL%Z1l'4^]2%A^\Y\ESg0er
+S"#k7R$a5+Q'IStP*1rhO,o<\N/W[PM2@%ELPCP;KnTGXs+16%rIFotrdO-\s*jutrIFp!!.t3&
+E.iq!L5(J>M2@+JN/WaVO,oBbP*2&pQ'Rc(R@9V8SXuIHTq\<XV5C/hWiE/&Xfnt6ZEppH[^`lZ
+]=bhl^VRe)`5Ta:aN;WKc-FV]dF-Lne^i@)g"P39h;-uHi8N\UjQ5OdkNM0plKdg'mI'uB!V#XY
+o)J:]o`"O`pAamcq#C0hqYU0hr;?Nardk*is*t~>
+JcC<$JcFC&o`"gfrqu]ks8)ckrqI9'p@e1Po^qbGo'u5<n*]T0lg!a!R[X2El>>s,phfhEphfY>
+s(DdPARo7Z@:*AI>b7P\Sc5/ZS,\rVRI$=>RJh$mD>J/LD>oe#Pl?sHPQ7!GPkLC=QMOY^=8c5'
+B6Aiinrrj3rf[>Fr^ZrYs%3,\s%EAcrD!;e!)NPi!`;inr_rhr!*0#!s&T2&r`K8*>Q.k8?!^iE
+?XR;N@U`hXrac+BBDuQOBkhF!Ci+$,DJsLnE=-`-FEDYKG'A.TH2`+)H[L6iIXZcsJ:W9'K7ei2
+Knb>;LPYqd!K)g7MueH]aFsMem\KlZs/,gmrhfUkrhogrqPjRsXSo:$Y5GF$Y5>C(Yd(J2Z2q:L
+r,;7Gs)7Oo!1!)=!mJj3rQG5b"O56;c-?75rQbJjrmC_n!n5TFrmLhq!S#[!f)F;#f_sLkPl$[;
+P4OkkH[L6jIt3*%K7nr5LPUeEN/WaWO-,TgPa.N#R$a>3S"-(AT:hmPUSO]^VPg>jWW&n!X/rE%
+XTGZ/YPbX'Z1bL%Z2Kg\P4Fb3OT1msSXc1=R[KP1Q^3o%P`q8nOcYWbNfB!VMi*@JLkph@L4t>7
+re(6&!.k*!s*t#sl@&\]s*suts+(0%re#0CKnY89LPUeDMMmFPNK0'\OHG]hPa.N"Q^F20S"-%@
+T:hmPUSO``Vl6VqXKAV.Yd(L?['mEQ\[oDc]t_=u_Sa=2`lH0BbKJ/UcHstee'uq!f@\d1gYCW@
+hr*GOioB+]k2tjjl07L!m-O--rpKmWnc&+Zo)SF^p&Facp\jmeq>U6fqu6NkrUTr=s2Y.i~>
+JcC<$JcFC&o`"gfrqu]ks8)ckrqI9'p@e1Po^qbGo'u5<n*]T0lg!a!<)ifro03(8o/uh3jZN3!
+s(DdPARo7Z@:*AI>Z"As:]OAf;Z0Jl;#F)j:f1*e;#*lh:f1%Or]C'@q`Xm?oK3"Hq+pf_r(m&^
+!DPoX6iTLP5mBYE8ki2^;Z9Pl;YX2i<;KVo8,c'Z8c23\9E.]a:&drg:]4)k;,U<k;u]es<W6&!
+<rcA%=TM]1r`fh:?=$uG?t!JQ@UisJAH?CUrb)XQC27U$D/F0.DfG\q$?C30FEMbMGB\:Wrd#<+
+I!pElIXcluJUrE*K7nr4L5(J=M#N53MMqIm!D?,-:&UjUV#"'i<VTVo=8Z1s=TDY%>Pqb)>Q.n,
+>Ot#T4S2DF:]F2f:]=,gCB&,MD?"JRDuFYTE<'tVE<(%YF8g:[FTQc1FoHR`G5upfHN&9jI/[1H
+<W?%m;u0Ji<W5te;_WQGI=?ZrJV&N-KnbA=M2I7NNK9-_P*2&pQ'[l*R[]e:St;RITq\<XUnsrd
+Vl6ToWWK6&XT#='Y-5&,Yl1j#ZMh'.<<#to<r>tq<;]\k;ZE=5SXc1=R[KP1Q^3o%P`q8nOcYWb
+NfB!VMi*@JLkph@L4t>7re(6&!.k*!s*t#sl@&\]s*suts+(0%re#0CKnY89LPUeDMMmFPNK0'\
+OHG]hPa.N"Q^F20S"-%@T:hmPUSO``Vl6VqXKAV.Yd(L?['mEQ\[oDc]t_=u_Sa=2`lH0BbKJ/U
+cHstee'uq!f@\d1gYCW@hr*GOioB+]k2tjjl07L!m-O--rpKmWnc&+Zo)SF^p&Facp\jmeq>U6f
+qu6NkrUTr=s2Y.i~>
+JcC<$JcFC&o`"gfrqu]ks7u`krV.9)p@e1Po^qbGo'u5<n*]T0lg!`Xbg"J\chiXkN:`&*N;eb4
+N;eb+N;/>1MZ8SHC1q6lARo7Z?sd8H>hdudg"HAWs47J+e^W*tdaA'@"jbH;b/qd%aT'B\b5]Za
+bl>ofcKgG_MZL`4qnW9Jrk\WMs2"WKr4`6Ir5&BJ$,=9k@:3JP@q0'GAHR.9Uq6NBpqm$JrkeQK
+!l@Gtr^d&\r(?u^s%NAcs%`Sir_WVls&/hp!`W0"r`08*=BJ^/>$>/0>QJ,:ra,\6@K'^:@q>RM%
+q]HfBPD0qCMRa'D/O60E;jhaEcZ>EF`qqPGBeE4H3&A?rd=frJ,Xs!JV*lR!JH1+L'NKiLl$tGM
+MqIm!f`5#rf7,BOcfX+s-!GIlE:2Yr1<kZrh0"Zo:c?Agt^`ahYl@0i;_d9ir8!<jT"<Ak54?Ak
+Q'lHlMp2Mm/HDKmJu_SnG\RHOSP"=aRdIN`q.6ss89gn_t:f#H@($fIXcm!K7ei3L5:\CMi<XUO
+-#KePE_>uQ^F20S"-%@StMdNU8+N[V5C/gW2]cr!irE(riQ4's0)=(oWeA!pqZmDqS)g@qS"8IS
+Xc1=R[KP1Q^3o%P`q8nOcYWbNfK*XN/NRMM26tCL5(D9K`6W(JcLB#JH(,uId2@]If=irJH(0#K
+)UE&KER!`L51TaM/8'-N/WdXO-#KeP*;/rQC!u,R[]e;St;UKTqeE[VPgAlWiN8(Y->.9Za@-K\%
+0&]]Y2%o^qmn*`Pom=ai_fNc-FY_dF-Ooe^rF*g=k<;h;7&IiSrnXjQ5OdkNV6rlKdg'mI'H3nF
+5uIncJFTo`"O`p&Ojbq#C0iqYU0gr;?Nardk*js*t~>
+JcC<$JcFC&o`"gfrqu]ks7u`krV.9)p@e1Po^qbGo'u5<n*]T0lg!`&R@9S6S)S;TDY@rBDYS)H
+C_(8oB4b^c@U`_P?X6p/St>bKqjd\Us-a"WR[X5Dqj7AOpmD#JphoM:r,2=q!0mJJr06r@qN_;O
+QC!q?=8Gts=8uA)A9*6^nWWa2!g?,Er^d&\r(?u^s%NAcs%`Sir_WVls&/hp!`W0"r`08*=BJ^/
+>$>/0>QJ,:ra,\6@K'^:@q>RM%q]HfBPD0qCMRa'D/O60E;jhaEcZ>EF`qqPGBeE4H3&A?rd=fr
+J,Xs!JV*lR!JH1+L'NKiLl$tGMMqIm!f`5#rf7,BOcfX+s-!GIl@]/.r1<kZrh0"Zo:l2Zs/#am
+rh]XlrMTUm!3,ps"fnZ'X/rE%Xo>L$XoGR$Y5kg+Z2V'/ZN=u]DYe;IDW$cZb5f]abQ#fdblZ28
+c2Q#eci)5fdJhPre'upurRV##rn.2&mZdU4o9/d10m\1oI=?ZrJV/T.L5(M@M2R=PNfT9aP*;,q
+QC!u,R[]h<St;UKTq\<XUnsrdVl6ToWWK6&XT#@%Y5b^&Yk54!YlBj\P4Fb3O<pKhS=?":R@'A.
+QBd`"PEM)kOH5H_NfB!VMi*@JLkph@L4t>7re(6&!.k*!s*t#sl@&\]rdXots+(0%re(6("GMSb
+LPYqdCl4.0N/is[OHG]hPEhE!Q^F20S"#t?StMdNUSO``Vl6SpX0&M,YctF>['d?O\[f>b]tV7s
+_8=+/`Q-'Ab0/#RcHjncdaZdsf@S[/g=tH>hV[8MioB([jlY^gl07Kulg4!*mdKW6nF?MK!qZ'V
+rq6<b!;HEds7u]kqtp?ir;H3cJcEgkJ,~>
+JcC<$JcFC&o`"gfrqu]ks7u`krV.9)p@e1Po^qbGo'u5<n*]T0lg!_5;cH^r<U;pI4o%524oRS@
+4mtN24Ul.>B4b^c@U`_P?X6o5qbd)cs&&\jr_NPjr_`SirD3>d!`(p@pH/@:qE=g?q)eRNrD*Di
+rD38dqbQr]"&2Nc62j4I6OlFK5sn1::f:4j;Gg:h;Y*id<!$&i8,c'Z8c23\9E.]a:&dug:]=2j
+;?'Pn;Z]ou<W6#(='/R-=^#!5r`fJ0?N+:4?t'%D!Fo[>AIiBcBP;*oC27U$D/F0.DfG\q$?C30
+FEMbMGB\:Wrd"TlI/\NpIXh?I!J,k%K)pXZre:Z5LkpnEMMd>kMuo!!NrG(@OHG\)P5g^GPj1sC
+Sc#)XTDkMXU%>#P<<#to<rH+u=SZ)">5DJ&>QA(->Q7t,>Q-bV4TIV4:@q<a:hjc^rb_[Qs)7mU
+!c`0urGhdVrcA'\"*Jd1FoHRaGQ2pdHN/?kI/I%F<W?%n;u0Jh<W5tg;_`TFI!pHnJ:W?*KSG5;
+M2@.LNK0']OckomQ'Rc(R@9V8SXuFGTqS3UUnjiaVl-Jmri-%#XK;E's/uC*qlo^trNH?&<E8iq
+r)NYor)<Gi-(^ZtS"#k7R$a5+Q'IStP*1rhO,o<]NJrgSMM[1GLkg_>KnY3ZKE$N'Jc1-!J,Xo^
+IK+cqJ,XuuJH1<$KE$T-Knb>;M#N6IMMmFPNfT6_OcklkQ'IZ%R$jD4S"6.BTV8'SUnsrdW2Zet
+Xf\b1Yd1UB[C3QT\\#Mf^;%J"_Sa@3a2lBFbKS5VcdC.geC<%#f@\g2gYL]Bhr*JQj5]4^k2tjk
+l0@R"m-O--n*fc8nc&(\oCV\Sp&F^cp\agdq>^<gqu-HjrUTr=s2b4j~>
+JcC<$JcFC&o`"jgrqu]ks8)ckrV.6(p@e1Po^h\Fo'u5<n*]Q/lg!`Wbfn>XqMX^!qMX*eqMPiB
+CM@HpAn>L^@UNPL?!R?^s4RD(s47h5e^W*tda?Fgcd0k[bK@uLqoJfZrlP5arQP;dqi0m"r/:Ql
+s2+TJ!5STM!PlPN_#M1K_#(tD_#%OC@Uiq[Ac?9FATETu[)2dZoYULAs%!)[r^m&\r_*8brCm>g
+:J^pc!`;inr_rhr!*0#!s&T2&r`L=H>?b?;?!UcD?XR8M@U`hWA7]=aAnPdjBkhBuCM[keD?4Zp
+rc'$#F*)MHF`qtQG^4R\H@($eI=6QoIt3'#JqAW-KS5'YL&m'cre^Z4!/pi8!f`5#rf@)@!0R8D
+s-*JIrg!MLs-N\Os-`kTrL<eVrginWrL`t[pn@Z?s4[V1h;/%ds53\2s5O";!9F.@qre"Cs69OJ
+!pf4>r9aCLs6p!W!:fuLpQ,B;rQ+WOq8W-Kci<m\iPY?*s*?AGI=6QpJ:`E+KnbA=M2I4MNK9-^
+P*2#oQ'Rf)R@B\9SXuIHTqS3UUnjiaVl-Jmri-%#XK;B&s/uC*l`gAl!PlPN_#D+B^AktC^*K8>
+S"#k7R$a5+Q'IStP*1rhO,o<\NJrgSMM[1GLPLV=KnY3ZKE$N'Jc1-!J,Xo^IK+cqJ,XuuJH1<$
+KE$UNKnb>;LkpnEMMmFPNK0']OcklkPa.Q$R$a>3S"-(AT:qsQUnjlcVl?\sXKAY/Yd(O@[C3QS
+\[oDc]t_=u_Sa=2`lQ6CbKJ/UcHstee'uq!f@\d1gYCW@hr*GOioB+]k2tjjl07L!m-O-,mdKW6
+naZ2@oCMVQo`Fj]p\jmdq>^<gqu-HkrUTr=s2b4j~>
+JcC<$JcFC&o`"jgrqu]ks8)ckrV.'#p@e1Po^h\Fo'u5<n*]Q/lg!a6RK&`4D=MN8D>J/FD%18p
+BP1pgA7B"U?X@#CrLWhUqjd\Ur0mVQs-WhQs-WbQrL!POrb_:Fmqq]^s-3;Ds-<YMqj.&Es&]5&
+!*B%urDs23DgmY1Q'Cs*plbYIs%*,\rC[&^s%NAc!_uNerD3Pm;H!Kms&8tur`9&#!*K5'+'MlQ
+>[1Q??=.&I?t!MR@q0%\AS,OeBP;*pC27U$D>nDRDfG\q+*)FEFEM_LGB\:WH$Xd`I!g?jIXcit
+J:W<(K7ei1L&Qf-LPYqds,$f7repo<NfO+"s,[5Crf[;Fs-3MJs-E\OrL!VQrgNeTrg`tYqO[YX
+qk3_XrM0:dqka:hrMT[os/H!tqlBaus/l7&rN-(&q6'k(Z*F85!4;`Bs).XNrb__$hNS&ab5TQa
+bl5ldc2c,gcMl/gd/25idK%erec")!fDXA$f`9aoPl$[8P4t1?H8'\oI=?]sJqJ]0L51SAMMmFQ
+O,oBcP*;/rQC+&-S"#q=StD[LTq\<XUnsrdVl6ToWWK6&XSo:$Y5b]kYl:g,P*>j-nr`^/,b:Hp
+S!ob4R$X,(Q'@JqP*(ieO,f3ZN/W[PM2@%DLPCP;KnTGXs+16%rIFotrdO-\s*jrsrdb$"!.t3&
+s+G]PL5(J>Ll$tGMi<USNfT9aP*2#nQ'Rc(R$sM6S=Z=ETqS3VUo(&fWN*##Xfek3Z*UdE[^WcW
+]">Vg^V@V%_o0O6aN2KHbK\>Xd*^:jeCE.%f\,!5gtgfDi8ESRj5f=ak3(sml0@U$m-X3.n*fc9
+nac8BoCW"S!quB_rV6Bfs8)WirVZWmo)=4?aT$b~>
+JcC<$JcFC&o`"jgrqu]ks8)ckrV.'#p@e1Po^h\Fo'u5<n*]Q/lg!a6;u]hX55[PD4QATp4:c4A
+BP1pgA7B"U?X@#C:f.$dqbdDmr_ibnmna']:f%!aq`OL4r]L$?r]L3Bs%`Ge!)EJgqb[,bpeCfb
+r_EJhrB^ELqEkQU6UsaC:f1+g;uT\d;u]hs8,l-Z8c;9\9E.]a9`e'c:]4)k;,U<k;u]es<W6&!
+<rcA%=W^gO>?kE=?!^lF?smDP@UinYAS#IcB4tsmC2.O"Ci0/h!H2rVE?B4BFEDYJG'A.TH$O^^
+H[L3hI=?ZqJ:N3&JqJ]/KSBD[!JcL1M>rG5MuJY:NK0%uO8k:AOoCODPQ-mHQ2d0MQi3<ORJrZR
+S,SrWSberVTDP;VU%21^<Vohp=8uCt=oMV&>Ph\'>6%q,>PpVW4TJ:B:A@Wb:]Y<HrbVXQrbqdT
+!,qjUrc.mWrcA*]s)eWkF`hkNGB\:VH2W'gHiAEi<rZ2"<;9Dg<;KVn<:j,hH8'\oI=?]sJqJ]0
+L51SAMMmFQO,oBcP*;/rQC+&-S"#q=StD[LTq\<XUnsrdVl6ToWWK6&XSo:$Y5b]kYl:g,<`f6#
+r)NYor)<Ag,b:HpS!ob4R$X,(Q'@JqP*(ieO,f3ZN/W[PM2@%DLPCP;KnTGXs+16%rIFotrdO-\
+s*jrsrdb$"!.t3&s+G]PL5(J>Ll$tGMi<USNfT9aP*2#nQ'Rc(R$sM6S=Z=ETqS3VUo(&fWN*##
+Xfek3Z*UdE[^WcW]">Vg^V@V%_o0O6aN2KHbK\>Xd*^:jeCE.%f\,!5gtgfDi8ESRj5f=ak3(sm
+l0@U$m-X3.n*fc9nac8BoCW"S!quB_rV6Bfs8)WirVZWmo)=4?aT$b~>
+JcC<$JcFC&p&=pgrqu]ks8)ckrqQNf!;?Eb%J98_o'u5<n*]T0m-Es9aoT]0qMXQrrJTTmrJg`6
+s,.G*Chm`uB4YXa@UWYO?<u@@r7V/(rn.8&&D#C]eC2jnd*U+ac-4ARaiXG$s2k;`!6bAcs3:1q
+nVmF+s,?rqs2+oT_8>u`!lDdirkJTM^qfla!5e`OrkSKKs2+eFs'bq8s'bq:!Fo[=Ad!%)RBOI)
+_Z.OJ_Yh7L8H29Z9)hQa9`7]c:B+,h;#aDm;Z9Sr<)lrt<X2].=BSd1>$Lu2!F9%2?P$UR@:E\U
+A7T7_AnPaiBPD5\CB86grb_aTE;jhlEcZ>EF`hkOGBe@XH?spbI!pElIXh?I!J,k%K*R'`Knb>;
+LPYqd!fDnorepo<NfO+"s,d8Crf[;Fs-3MJs-EYNrL!VQrgN_Rrg`qXpR_;Tq:Yr*gt^`ah>lI0
+i;_d6irnH)jlY_(kPscFl2KrKlg4N9r9jRQ!q>aMrfI2BqiUf<!6P/[p;cgFrQ"lV!6<Leo#0h2
+rPJEK3l6/gH@1-hIt3*%K7nr5LP^kFN/WdXO-,ThPa.Q$R$a>3S"-(AT:hmOU8+N[V5C/gW2Zbr
+WiN2%rN6(%ribjrrNH7(rN-(8rkIa4'V(Y^R[KP1Q^3o%P`q8nOcYWbNfF$s$]Bn!M26qBL5(D9
+K`6W(JcLB#JH(,uId2@\IfFosJH(3#K)^K'KQ)X"L51P?M2@+JN/WaVO,oBcP*;,qQ'[l*R@B\9
+SXuIHTq\<XV5L5iWiE/&Xfnt6ZEppH[^WfX]=bhk^VI_'`5T^9aN;TJbg"GZdF$CleCE1&f\5'6
+gtgiEi8EVTj5f=ak3(sml0@U$m-X6?mfDqJrpg-^o^r.Us7ZKerV6EgrqcNhrqu]mo)=4?ao?k~>
+JcC<$JcFC&p&=pgrqu]ks8)ckrqQNf!;?Eb%J98_o'u5<n*]T0m-Es7RGD`IDX20>C_1H"CM@Hp
+AS#@\@:3GK?([_]SbnrVS,JfTR/iWRQiEHQRJWBORJ1RjDY7iKQC!o'm?RI4pQklGr`8quqc<_u
+"'o\gM#EV5PPC=?8H29Z9)hQa9`7]c:B+,h;#aDm;Z9Sr<)lrt<X2].=BSd1>$Lu2!F9%2?P$UR
+@:E\UA7T7_AnPaiBPD5\CB86grb_aTE;jhlEcZ>EF`hkOGBe@XH?spbI!pElIXh?I!J,k%K*R'`
+Knb>;LPYqd!fDnorepo<NfO+"s,d8Crf[;Fs-3MJs-EYNrL!VQrgN_Rrg`qXpR_;Tq4mnaqPF4h
+r29Ons/PprriH.%riZ4%!3Z1%s0)L.rNcI0r,)FNqelIPrfu<(!6bAcrltJgs3:PgrQkGh!R]9m
+d07tIeC<%!rRUu"rn.8(!nc1jo99*:qigZ8rfd2C3g4i8H@1-hIt3*%K7nr5LP^kFN/WdXO-,Th
+Pa.Q$R$a>3S"-(AT:hmOU8+N[V5C/gW2ZbrWiN2%rN6(%ribjrrNH7(rN6*_nr`[.'V(Y^R[KP1
+Q^3o%P`q8nOcYWbNfF$s$]Bn!M26qBL5(D9K`6W(JcLB#JH(,uId2@\IfFosJH(3#K)^K'KQ)X"
+L51P?M2@+JN/WaVO,oBcP*;,qQ'[l*R@B\9SXuIHTq\<XV5L5iWiE/&Xfnt6ZEppH[^WfX]=bhk
+^VI_'`5T^9aN;TJbg"GZdF$CleCE1&f\5'6gtgiEi8EVTj5f=ak3(sml0@U$m-X6?mfDqJrpg-^
+o^r.Us7ZKerV6EgrqcNhrqu]mo)=4?ao?k~>
+JcC<$JcFC&p&=pgrqu]ks8)ckrqQNf!;?Eb%eTA`o'u5<n*]T0m-Eq9rDW2Lq`XO7h*(Ts%rH,u
+BkV-jARf1X?sd5G:]+&f;>3ug;=76\:]4&\4S1`74Sq;A:Adoe:Amuc;#3ud:'"-crD*DgqbI2Y
+r^$QL!($TNqa1ZX7nZTS:f1(f;Y!cd<;oGg8c23\9E.]a:&dug:]=2j;?'Pn;Z]ou<W6#(='/R-
+=^#!5r`fJ0?N+:C?t!JQ@UiqZAS#IdB4tsmCAquLCi0/h!H2rVE><M8FEDYJG'A.TG^4U]H[C-g
+I=?WprdY$#K)UB-KS>,7L51P?reU]6Mi7Rn!f`5#rf@)@s,m;Ds-*JIrg!MLrg3SNs-`kTqj[ST
+rLN\Sr1<sfn5TBer)W_sr`K,%!*]A)rEB/(rEKA->l7h*>lIt'4Sh2@;>sDl:[V!Q:]+&gD#eJQ
+DuXeVDuO_SEW'qWF8g=\G5c[eG^4T5HN&6mI!^8:<rQ+g<;KVd<'!s'H?sseI=HcuJqJ`1L51VB
+MN!LSO,oEdPE_>uQ^F//S"#q>StD[LTq\<XUnsrdVl6SoWiE,#XSo:#Y5YWpYl1d*Y5PL&<r>tq
+<;]\h;A>XjS!ob4R$X,(Q'@JqP*(ieO,f5!N!kQ$M2@%DLPCP;KnTGXs+16%rIFotrdO-\rdOls
+rdb$"s+:9's+G?FL5(J=Ll$tGMi<USNfT6_P*2#nQ'I]'R$jG5S=Q7DTV8*TUnsueW2cl!Xf\e2
+Z*L^C[^NZU\\#Mf^;%J#_SjF4a2lBFbKS5VcdC.geC<%#f@\g2gYCWAhr*GPj5]4^k2tjjl07L!
+m-O--rpKmWnc&(\oCV\Sp&Facp\jmeq>U6fqu6NkrUTr=s2k:k~>
+JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb%J98_o'u5<n*]T0m-Ep7b2nT]NV8>2NW+n6NW+n6
+NW+n-N=p,GCMRWtB4YXa@UWYO?<u@Ag\fb*g&BY(f*'[TeC;qGd0.hBcHXT4aoKQ]aT'B]aofi2
+c-H9JqMkB4rf-H,!6+oTs24fP"i8'l_SO(f_Z.IN_#;+K_Yh4M_Z%CL_Z!sF@UW^E?iXX7@L-IT
+AnGe.PcDOu_=YVC_>d(*8c;9]9E.]a:&dug:]4)k;,U<k;u]es<W6&!<rcA%=U/,7>?kE=?!dM;
+!FT@8@KBtLrac+BBDuQFBkmW_!GlWPD?4Zprc%sZF8g7^Fa!b.!I/nhH3&A?rd=frJ,Xs"JV&LQ
+K)pXZreCH.!/UW2s,$f7rf$l:!07#=s,[5CrK@2Es-3JIs-EYNr0[MPrgN\Qr1*YTp=fN#!o2Vf
+rn[Y4qr%M5!94"<rT""@k5FKCkl'cGl2g5;qX+4KrpKpXnacU?rK-u?r5noYoZ-@=df8gTlbiY;
+qnk:9H$XgbI=?ZrJV/T.L5(M@MMmFQNfT9aP*;,qQC!u,R[]h<St;RITq\<XUnsobVl-JmWW&n!
+X/rE$Xo>L$YPGF#YPt^&XoGL&WrTp"^*B/;S!ob4R$X,(Q'@JqP*(ieO,f3YN/NUOM2@%DLPCP;
+KS9>W!ePuSrIFotrdOQhs*XQhrdOlsrI=s#JqEuS!JH1+L1l?uM2@+JN/WaVO,oBbP*;,qQ'Rf)
+R@9V8SXuIHTq\<XV5C/hWN*##Xfen4ZEppG[^WcW]"G\i^VI\&_o0O6aN2KHbK\>Yd*^:jeCE.%
+f\,!5gtgfCi8ESRj5]7`k3(sml0@U6liukFn*fc9nc&([oCW"S!quB_rV6Bfs8)WirVZWmo)=4?
+ao?k~>
+JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb%J98_o'u5<n*]T0m-Ep7RHeYgDZ=SMDZ+G=DXM?T
+Ci4**CM@HpAS#@\@:3GK?([a\optuMrgWnUrL!YQrg*\RR@3u?s-`RtmV_o=rg3YNo9B<Arg!8E
+op>ZDr`B"ur`B&!s&T>+BQf)nrKRAIp65H<s%*,\rC[)_s%NAcs%`SirD3Pm;H!Kms&8tur`9&#
+!*K5'#?k>9>[1Q??N+:4?t'%D!Fo[>AH?CUrb)=HCAquLCi0/h!H2rVE<1*$rcA0`G5c[dG^9:7
+!IK4nI0"eHrdY'$JqEuS!JH1+LB!#/M#N82M?&S6N;nk;Nr>%=O8tFAP5gaGPl6mIQN!6KR/`TR
+ReiNOSGSlNU\pqaV>d@kVZ<[pWW0!qX8T."XoGR&XoGR$YPta+Z2V'/ZN.B-D#eJQDu,a\PlI$H
+PlAo*blZ28c2Q#echl)fdJq\qeGn)!f)O;#ec=>$fE9gZf\-7go990<qigT6rfd5D20aCmH[L6j
+It3*&K7nu6Ll%"IN/`jYOHG]iPa.Q$R$jD4S=Q7CT:hmPUSO]^V5C/gW2ZcqWWK6&XSo:#Y5GL!
+Yl(^(Y5GF%XT,?mOnXq^S=?":R@'A.QBd`"PEM)kOH5H_NJrgSMi*@JLkgb?L4t;6rdt9(JV!cM
+s*t#sp3lsgpO3$is*sut!eGrTrdt6)L&Qg?LPUeDMMmFPNK0'\OHG]iPa.N"R$a;1S"-%@T:hmP
+USO``Vl6SpX/rG+YctF>['d?O\@K2`]Y;.r_8=+.`Q$!?aihlPcHjkbdaQ^rf%8R-g=tE=h;7)J
+iSrnXjlY^gkiq?sli-5TmI'H3nF?&JncA@SrUg6cp\4X]rqZTjqtp?irVc<dJcEjlJ,~>
+JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb&bP\co'u5<n*]T0m-En8<)Z`a54q)352/44DJa0)
+BkV-jARf1X?sd5G:J^mbrDEAgs&&Yir_`>b!`)Qdp,r48r]Kg7r]C6V:/:dar(d2drD3Pm:f.$b
+s%`Mgs%rDb"[YRC6:!p:5QF+J6N9CV6qBsG;,[Bjs&/Ges%*,\rC[)_s%NAcs%`SirD3Pm;H!Km
+s&8tur`9&#!*K5'#?k>9>[1Q??N+:4?t'%D!Fo[>AH?CUrb)=HCAquLCi0/h!H2rVE<1*$rcA0`
+G5c[dG^9:7!IK4nI0"eHrdY'$JqEuS!JH1+LB!#/M#N82M?&S6N;nk;Nr>%=O8tFAP5gaGPl6mI
+QN!6KR/`TRReiNOSGSlU;ufko;ufqm<;onr<rH+t=T;P'>5qb'>5hb)>kqV&>QJ&6pH8F<qGI5g
+s%i2\q+pi`s)%aQs).sXDf>VorGhdVs)\3^rcS3`rce?ds*=Tir-S0=r`/GeqGm/e20aCmH[L6j
+It3*&K7nu6Ll%"IN/`jYOHG]iPa.Q$R$jD4S=Q7CT:hmPUSO]^V5C/gW2ZcqWWK6&XSo:#Y5GL!
+Yl(^(Y5GF%XT,@"<W#ho;tj07S=?":R@'A.QBd`"PEM)kOH5H_NJrgSMi*@JLkgb?L4t;6rdt9(
+JV!cMs*t#sp3lsgpO3$is*sut!eGrTrdt6)L&Qg?LPUeDMMmFPNK0'\OHG]iPa.N"R$a;1S"-%@
+T:hmPUSO``Vl6SpX/rG+YctF>['d?O\@K2`]Y;.r_8=+.`Q$!?aihlPcHjkbdaQ^rf%8R-g=tE=
+h;7)JiSrnXjlY^gkiq?sli-5TmI'H3nF?&JncA@SrUg6cp\4X]rqZTjqtp?irVc<dJcEjlJ,~>
+JcC<$JcFF'o`"gfrqu]ks8)ckrqI0$p@e1Po^qbGo'u5<n*]T0m-;dnb2eNXNW4t9N<"q8NW"k;
+NW+q=NK3Ie!07&<'5qc*CMRWtB4YXa@UWYO?<uCBg\fe*g&BY(f*'[TeC2kFd0.hBcHOK2aoKQ]
+aT'B^ao]c1c2<Y$Nr=t2NrG%4N;^]t`5T[4rk\ZQq8*6O_SO(f^]M?h_>V7L_>h@P_=teJ@UNUC
+@JjL5@K'^@A7]>!Oeo\,rPAKM!5\HI!(d)\r(?u^s%NAcs%`Sir_WVls&/hp!`W0"r`0)%=BPQ*
+#?k>9>[1Q??N+:4?t'%D!Fo[>AH?CUrb)=HCAquLCi0/h!H2rVE<1*$rcA0`G5c[oG^4R\H@($e
+I=6QnJ,Xs'JV&K+K7no3reCH.!/UW2s,$f7rJUf;NfO+"s,d8CrK@2Es-3GHs-EYNqj@ANrL3SP
+rRpu"rS%D/h;/(es53e5s5Et:!9="<!p/S-rTO1D"7#4<m.p&Jmf)\Tn,`(NqN:];qT8WUo>g@?
+e,SjSm)/_;rPLO;G^=[_I=6TqJ:`E,KnbA=M2I7NNK9-_P*2&pQ'[l*R@B\9SXuIHTqS3UUnjia
+VPg>jWN#lss/Z1$r2oq#pTOLtr2p"#s/Z*u!NE$g^AY_d^:g#)R@'A.QBd`"P`q8nOcYWbNfB!V
+Mi*CKM26rdL'!'^K`6T*Jq8LOJH(,uId2@\IfForJ-(:RK)UB'KSBD[D23q(M2I4MN/`jYO-#Ke
+P*D5sQC!u,R[]h<St;UKTqeEZVPg>kWiN5'Y-5(7Za7$I[^`lZ]=bhk^VI_'`5Ta:aN;TJbg+M[
+dF$CleCE1&f\5'6gtgiEi8EVTj5f=ak3(sml0@U$m-X6?mfDqJrpg-^o^r.Us7ZKerV6EgrqcNh
+rqu]mo)=4?b5Zt~>
+JcC<$JcFF'o`"gfrqu]ks8)ckrqI0$p@e1Po^qbGo'u5<n*]T0m-:&=RH\S[DYS&KDZ+GFDXhQW
+Df0E-CM@HpAS#@\@:3GK?(dg]oUYoMrL<eTrL*YOs-WhSrKmYSCi&f^nS\ADqelA!s-E8Ap6PN@
+!1*PLqj.7_r`Att!*B%u"(cP*O8P:CPkL:@8H)3Y9)hQa9`7]c:B+,h;#aDm;Z9Sr<)lrt<WZ?)
+=T2G.>$G39>[:WAra,\6@K'^:@q>RM!G6!DBE;g^rbDOND>nDRDfG\q!HN8\F9-N-rc\cqH$O^^
+H[L3hI=?WprdY6)JqAW-KS5'YLB!#/M#N82M?&S5Muo!!NrG+>OT1IAP5gaGPl-gHQN!6JR/WNP
+ReiNPUA1M]V"gedVZ*LnVuWgrWr/prXT#=%Y5GF$Y5PR&YQD)8ZMq03ZtsRQD$#ugQM6[0Pl$aG
+PlJu+c2Z&hc2Grechl)gd/_Voe,@eqeH4=RfDaD)f@\a/r06f:s-3DEnWNm8rKK3aG^=[_I=6Tq
+J:`E,KnbA=M2I7NNK9-_P*2&pQ'[l*R@B\9SXuIHTqS3UUnjiaVPg>jWN#lss/Z1$r2oq#pTOLt
+r2p"#s/Z*u!NE$lOo1=>NujCDS!ob4R$X,(Q'@MsP*1rhO,o<\N/W[PMM[1GL]3#0KnP-YK*$XU
+Jc1-!J,Xo^IK"]qJ,Om!JV&LQK)pXZre>9FLl$tGMi<USNfT6_OckllQ'IZ%R$jD4S=Q7CTV8'S
+UnjlcVl?\sXKAY/Yd(O@['mEQ\[oDc]tV7s_SX71`lH0Bb0/#ScHjncdaZdsf@S[/g=tE=hV[8L
+ioB([jlY^gkiq?slg4!*mf)YUnF?MK!qZ'Vrq6<bs7cKes7uZjqtpBjr;H3cJcEmmJ,~>
+JcC<$JcFF'o`"gfrqu]ks8)ckrqI-#p@e1Po^qbGo'u5<n*]T0m-=OKm69i!!']=(r]UoWDf0E-
+CM@HpAS#@\@:3GK?27:q;"mi`;#X>c;#a>h4o%564oRS<49&%T:&n)d:Amub;#=#g:Amuf;"[Wa
+:B*WZ63'=L5QF+I63B_M9i1ge!)`_np/:r^r^m#[s%EAcrD!;es%iVjs&&eor_ikt<E9$!!`rK+
+r`KJ0>?b?;?!Ue9?NFPCraGn<AH$-@AnV*V!GQ<JCB86grb_aTE;jhXEc_5%!HiSbG78_AH$Xd`
+I!g?jIXZeGJ-UXWJqJ]/KSBD[s+^T1re^Z4!/pf7!f`5#rf@)@s,m8Cs-*JIr0@;Jrg3MLrgE_R
+qO@=\!)repr`/_ms&K"urE&kus&fA+>PVJ%>Q%e->?^r/r`fP2>[1S-4S2MN;#a>c:A@W\;#bD3
+DZ"GPE;jkUEWC1[FT-F^G5c^aGl;pkH[:!bHhCG=<U`ua<VBBMGBeF[H[U<lJ:N6(KS>/9Ll%"J
+N/`mZOckllQ'I]'R$jG5S=Q7DTV8'RUSO]^VP^8hW2ZcqWrK."XSf4!Y4o-tY5GF%XT,@"WWB)t
+r)ESmr)3Jj*`>k)R[KP1Q^3o%Pa%ApP*(ieO,f3YN/NRNM2@%Dre:K.KS9>W!ePuSrIFotrdO-\
+rdOlsrI=s#JqEuS!JH1+L2D^%M2@+JN/WaVO,oBbP*2&pQ'Rc(R@9V8SXuFGTqS6WUo(&fWN*##
+Xfek3Z*UdD[^N]V]">Vg^;%J#_SjF5a2lBFbKS8WcdC.geC<%#f@\g2gYCWAhr*GPj5]4^k2tjj
+l07L!m-O--rpKmWnc&(\oCV\Sp&Facp\jmeq>U6fqu6NkrUTr=s2t@l~>
+JcC<$JcFF'o`"jgrVZWkrqZWjrV.-%p@e1Po^h\Fo'u5<n*]T0lfu[:b2eNPNUr2/O8b19N<#";
+NW5"XEcH#8D/3m#BP1me@q&kS?X@$oh;$c>g=k65r7M&$&D#C]daHOjd*L%_bfe/PbK9\'s2b>b
+bKTmF!0I/?oT&s4qi:W7rJ^`p"ieO#`5BIk_uIUQ_Z7RQ_Z[im_8*n^_>qFC_?.Qj^&DL@@/j[5
+@/jX?@UinYGDr9)rPJQM!5e`Os2+cO!_>mSr(?u^s%NAcs%`SirD3Pm;H!Kms&8turDir#=T2J'
+=o_e+>R+P@?=.&I?t'%D!Fo[>AH?CUrb)=HCAquLCi0/h!H2rVE<1*$rcAQkG'8(RG^+L[H@(!d
+rd>$#It*!!JUrFPKE$T)L&Qi,LB*/0M>rJ5MuJ\8NW5%<O8k=AOo:IBPQ-mFQ2[*KQhd$KRK(k=
+f_jG!gABY)h#H41hZ)L2i;MX8j8A!<joFTDkkjWEl2p;<m/$,LmeuVSn,W"QOoLO<anWsKa7I="
+s80b2`VRO@_th1K__u^aH@($fIXcm!JqJ`2L51VBMi<XUO-#KePE_>uQ^F20S"#q=StD[LTq\<X
+UnsobVl-JlWVrjsX8f9tXnJpoXo>F%X8T%"WMlcpVZ<Ul^&YqH^A5GXR[KP1Q^3o%P`q8nOcb`d
+O,f3YN/NSmM#iEfre:K.KS9>W!ePuSrIFotrdO-\rdOlsrI=s#JqEuS!JH1+L1uF!M2@+JN/WaV
+O,oBbP*2#oQ'Rc(R@9V7SXuFFTqS3VUnsueWN)u"Xf\e2Z*L^C[C3QT\\#Mf^;%J"_Sa@3`lQ6D
+bKS5Vcd:(fe'uq!f@\d1gYCW@hVd>NioB([jlYail07L!rp0jVmdKW6nF?MK!qZ'Vrq6<bs7cKe
+s7u]kqtp?ir;H6dJcEmmJ,~>
+JcC<$JcFF'o`"jgrVZWkrqZWjrV.-%p@e1Po^h\Fo'u5<n*]T0lfsq-RJh$eD>.rBD>S/JD>.rB
+D&./3Df0E-C2%?oARo:[@:3GK?(dj_T(JTOSGerVRf8]VR$X0=R/`TRR.tLqD>8#KDtn5KD#eJP
+QiEBDQ2R$KQi36FQiEBKQi*0LPlQjC<rZ5%=BGH%!*B)!"(?.tNV\n?PkgLE84cDN9)hQa9`7]c
+:B+,g:]aKl;Z9Vp;ufqs<WQ9(r`T8)!*fG-#@1YB?XI2K@K'^:@q>RM!G6!DBE;g^rbDOND>nDR
+DfG\q!HN8\F:<;8G'A.TG^4U]H[C/>I0Y4NIt3'#JV*lRs+CB+reCH.!/UW2s,-i7rf$l:s,R)>
+s,d8CrK@/Ds-3GHrg*PMq3_2Ms.T=aqP3q`pndqds/5mq!3,strN#mup9"@t!3c:(s0;U0rj2Q?
+!,VLKr0Hu?l]h:3!6kDd!m]'8rQbAf!mo9>rm:\m!7Lhprm^qtrRV,'f@U#S!86Lun<3d7rff<b
+H$XgbI=?ZrJV&N-L5(J?M2R=PNfT9aP*;,qQC!u,R[]e:SXuIHTqS3UUnji`VPg>jW2]`qs/Z1$
+qQ9IoqQ9aus/Z*u!i`,srhfanqiUi=q2Z;[R@'A.QBd`"PEM)kOcYWbNfB!VMi.Lj!JlO1L'!'^
+K`6T*Jq8LOJH(,uId2@\IfForJ-(:RK)UB'KSBD[BnqM$M2I4MN/`jYO-#KeP*;/rQC!u,R[]e;
+St;RJTq\?YV5L5jWiE/&Xfnt6ZEppG[^WfX]=bhk^VI\&_o9U7aN2NIbg"GZd*^:jeCE.%f\,!5
+gtgfCi8ESRj5]4^k3(sml0@U6liukFn*fc8nc&(\oCV\Sp&Facp\jmeq>^<gqu-HjrU^#>s2t@l~>
+JcC<$JcFF'o`"jgrVZWkrqZWjrV.$"p@e1Po^h\Fo'u5<n*]T0lg"IKk!&)oq`O1-s#q'9EGo`3
+CMIQsB4YU`@UWYO?=!>%r_WAeq+q&gp/(cbs#p9Dr&t'Bpc\X@q`Xm?rB($RpJ1W^"&Mci;"d]_
+;"d]^:AmKX63]_@5X.Iu62a+P7S-9Mpepre!_>mSr(?u^s%NAcs%`SirD3Pm;H!Kms&8turDir#
+=T2J'=o_e+>R+P@?=.&I?t'%D!Fo[>AH?CUrb)=HCAquLCi0/h!H2rVE<1*$rcAQkG'8(RG^+L[
+H@(!drd>$#It*!!JUrFPKE$T)L&Qi,LB*/0M>rJ5MuJ\8NW5%<O8k=AOo:IBPQ-mFQ2[*KQhd$K
+RK$4X<;]_t<)lrq<<#tt<rH+s=T;P(=p%u4>?gu.r`f>+r*0,)s'5k74?Pbi4?Yk*4RZ/I;#X5m
+:/=V[peUW\!,_[PrGV[SrGhgW!-A-]rcS3`rHJ9d!."Ee!df<BoN(fgoMkZepJa%pH$XgbI=?Zr
+JV&N-L5(J?M2R=PNfT9aP*;,qQC!u,R[]e:SXuIHTqS3UUnji`VPg>jW2]`qs/Z1$qQ9IoqQ9au
+s/Z*u!i`,srhfdo<;]\n;Ya0*R[KP1Q^3o%P`q8nOcb`dO,f3YN/NSmM#iEfre:K.KS9>W!ePuS
+rIFotrdO-\rdOlsrI=s#JqEuS!JH1+L1uF!M2@+JN/WaVO,oBbP*2#oQ'Rc(R@9V7SXuFFTqS3V
+UnsueWN)u"Xf\e2Z*L^C[C3QT\\#Mf^;%J"_Sa@3`lQ6DbKS5Vcd:(fe'uq!f@\d1gYCW@hVd>N
+ioB([jlYail07L!rp0jVmdKW6nF?MK!qZ'Vrq6<bs7cKes7u]kqtp?ir;H6dJcEmmJ,~>
+JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nd"^Sn*fZ1m-FYoj,EPgn;d=*r/MSSNfK0A
+EcH#8D/3m#BP(gd@q&kR?X@":h>c7/gAfk(f`0P6f%&9uda?Ihcd'h\bfe2Pr5f&^aiV^#O8b7?
+O8+b2O8=kCNQ/rV`l?!:`5M;cs2"cPiPGT.r*o\6s'bn7rF,_8"*'*eZMVN8_>hCP8c;9\9E.]a
+:&dug:]=2j;?'Pn;u]es<W6&!<rcA%=TVc2>Q.k.?!dM;#@LtK@U`hWAH$-@AnV*V!GQ<JCB86g
+rb`-_E,]f:EcZ;DFEM_Lrc\BfH2`*pH[L3hI=?Wprdb$"!.t3&!ec8]reCH.!/UT1!fDnorJ^c9
+!07#=s,d5BrK@/Drfm;Frg*PM!7q/$rn./%qqCr%s4mY1s5*e5rS[_7s5O%<ro=1Ck3(q,kks]F
+lMp2Mm/?>OmK)_CqsORTnb81=an<aGa7mU's7sV0`VROA_t_))_fp?NH@($fIXls#K7el4LPUeE
+Mi<XVO-#NfPEhE!Q^F20S"#t?StD[LTq\<XUnsobrhfgrWN#lsri?(#m&g8gs/Z*us/H$srhfmr
+V59u`qS)d=!1EhR&snoLQ'@JqP*(ieO,f6[N/W[PreUZ3L]3#0KnP-YK*$XUJc1-!J,Xo^IK+cq
+J,Om!JV&LQK)pXZre><GLl$tGMi<USNfT6_OcklkQ'IZ%R$a>3S"-(AT:qsQUSO``Vl6VqX0&M-
+YctF>['d?O\@K2`]Y2(p_8=+.`Q#s>aihlOcHab`dF-Ooe^rF*g=k<:h;7&Ii8WeWjQ5OdkNM0p
+lKdg'mI'uB!V#XYo)J:]o`"O`pAamcq#C0hqYU0gr;HTbrdk*ms*t~>
+JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nd"^Sn*fZ1m-FY>q/5M8pMT_BokaPCqel:J
+'6A26Df0E-C2%?nARo:[@:*AJ>lLAsT:Y\Gr1*bUrL3_Rqj7GQR$d_eph]qHr,2=KqelFNr0RGL
+!L8uGQ2R$IQiEBGQi<<JQi36IPlQjA<WcE*=BGH%!*B/#"(,kkMYNJ6PQ+5Q9)_K`9`7]c:B+,h
+;#aDm;Z9Vp;ufqt<rZ5$=T2G)>$G51>QJ,:ra,n<@:<VS@q0'KAH?CUrb)=HCAquLCi0/h$u^*(
+EH-#?F*)MHFa!b.!I/nhH3\eEI!pElIXh?Is+(0%rdt9*Kn]M\s+^T1rJ:T5Mi7Oms,@#=rK$u?
+rfR/Brfd>Gqj%/Hrg*VXrLs(^qkO%aq5+%erMT[pri5sur2fUos/l@*r361*rj)R1pMK_lnWiF)
+rg!?)rQb8crm1YmrmLeprm^tus47)!"PD>YfTbQ_mZRR51R**.H$XgbI=?]sJqJ]0L51SAMMmFQ
+O,oBcP*;/rQC!u,R[]e;St;RITqS3UUnji`VZ*IpW2ZcqWrB(!XR*(gXT,@"WrK'uW;`\!VPU,b
+Ulgf;OSOq;RJrQdQ^3o%P`q8nOcYWbNfK*XN/NSmM#iEfre:K.KS9>W!ePuSrIFotrdO-\s*jrs
+rI=s#JqEuS!JH1+L2Md&M2@+JN/WaVO,oBbP*2#oQ'Rc(R$sM6S=Z=ETqS3UUnsrdW2ckuXf\e2
+Yd1UB[C3QS\[oGd]t_=u_Sa=2`lH0BbKJ,TcHjncdaZdsf@S[/g=tE=hV[8LioB([jlY^gkiq?s
+lg4!*mf)YUnF?MKs766_rq6<bs7cKes7uZjqtp?irVc<dJcEpnJ,~>
+JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nd=pVn*fZ1m-@VL<:)jL4nq5.4nUr-4VU)$
+EcH#8D/3m#BP(gd@q&kR?X@"8:]4#g:]=2j;<UjV:\[*N55.5955IDB4T8(L:@:pU;#X5j:A[i]
+:'+-V6N'4M6N9@O57'M<5X@_'6qL$Ip/:ifs%3/]r_*8brD!;es%iVjs&&eor_rhr!*0#!s&T2&
+r`K;+>?h)3!F9%2?O'tI@:E\U@q>RM!G6!DBE;g^rbDOND>nD]DfBZ8EH6,AFEDYJG5c[dG^9:7
+#CCiGI=6QnJ,XuuJH1<$K*$^[L&Qi,LB*//M#rQmMuAV7N<#";O8k=@Oo:IBPQ$gDQ2[*KQiC"b
+;t<o`<Vobq<W?+u=8>tt>5VV&>5hb)>l@n)>lJ%.4T7MB53YrC;#!iZ;#P;1DuO_SEW0tYF8g:[
+FoHR`G63#7H2`*iH2`-iHN8Ha<r,hg<;KVj<&/ZBH$XgbI=?]sJqJ]0L51SAMMmFQO,oBcP*;/r
+QC!u,R[]e;St;RITqS3UUnji`VZ*IpW2ZcqWrB(!XR*(gXT,@"WrK'uW;`\!VPU,bUf14i;Ya/i
+RJrQdQ^3o%P`q8nOcYWbNfK*XN/NSmM#iEfre:K.KS9>W!ePuSrIFotrdO-\s*jrsrI=s#JqEuS
+!JH1+L2Md&M2@+JN/WaVO,oBbP*2#oQ'Rc(R$sM6S=Z=ETqS3UUnsrdW2ckuXf\e2Yd1UB[C3QS
+\[oGd]t_=u_Sa=2`lH0BbKJ,TcHjncdaZdsf@S[/g=tE=hV[8LioB([jlY^gkiq?slg4!*mf)YU
+nF?MKs766_rq6<bs7cKes7uZjqtp?irVc<dJcEpnJ,~>
+JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb%eTA`o'u5<n*]T0m)mJogPl,kpQ#04pl>95rK-r<
+'m+M:EGo`2CMINrAn>L_@UWVN?<l@dh>c7/g&Th'f`0P6f%&9uda?Ihd*L"^bfn8QqT8,cqi:<0
+s,I*"r5S`T!6"NIrke]Qrk\ZQrke]Qm_\q?!PZ5G@K9j9@f9a6@/aR:DM+=Zq8*-Jrk\]P8c23\
+9E.]a:&dug:]4)k;,U<k;u]hs<W6##='/T(=U/,7>?kE=?!dM;#@LtK@U`hWAH$-@AnV*V!GQ<J
+CCG#rD/O60E,]f:EcQ7#F9-N-rc\EgH$TC8!IK4nIK+`rJ,Xs"JV&LQKE$T)L&Qi,L]<20M>rJ5
+MuAV7NW5%;O8k=@Oo1CAPQ$gEQ2fG7fDaG"g&'M$g]$".h#cHjhu;R4iVhg9j9+N+kNDg-rosIJ
+rp'RNrU'ROq<nCTOHB=$o?$REo#LRGf)PWcrPeWQs2G#VrknBFrPSWOqnrGX0mJ"jI!pEmJ:W<)
+KS>/9M2@.LN/is[OckllQ'I]'R$jD4S=Q7CT:hmOU8+N[V5:'gVuN[qWVrjrX8T-lXo5@#X8K!t
+WW/prVZN`lV>d7mUS=HUrkA0@s-NhRQN!-UP`q8nOcYWbNfF$s!K2j7M#iEfre:K.KS9>W!ePuS
+rIFotrdO0]rdOlsrIFp!s+:9's+CB+re>?HLl$tGMi<USNfT6_OcklkPa.Q$R$a>3S"-(AT:hmP
+USO``Vl6SpX/rG+YctC=ZaI6M\@K2_]Y2%o^r!t,`Pom=ai_fNc-FY^dF-Lne^i@)g"P39h;-rG
+i8N\Uj5f=akNM0plKdd&m-X6?mfDqJrpg-^o^r.Us7ZKerV6EgrqcQirVZTlo)=4?bl<1~>
+JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb&+oJao'u5<n*]T0m$X91D>.r1D>8#DD=_TBD>e>e
+D00i=EGo`2CMINrAn>L_@UWVN?<mH%!M>tUSc##WS,SlTRJN<ID>eAOD>J)ID#eJHDuOYOQi36H
+Q2?mHQN3?GQiE?OQ2[*IQi<<GPlZo)rDj/)<`W:'=BJZ'<WuQ*?#"Y>pQbcC!L$+Q9)hQa9`7]c
+:B+,g:]aKl;Z9Vp<<#tt<WZ?)=T2G.>$G39>[:WAra,n<@:<VS@q0'KAH?CUrb)=HCAquWCi+$,
+DJsK5EH-#>F8g7^Fa!b.!dK!9rd"TlI/\QoIK4lsJ-(:RK)UE&KE-`*LB!&/M#N82MZ8V5N;nn;
+Nr>%=OT(C?P5^[EPl-dIT:l+UqP*k^r1s@h!2TUjr20Fj!N<!rWrK-rX9#H)qQ9e#s0)@)riuC,
+s(qOKpQk64l]_I9c-6.2rm(Adrm1YmrmLeprRChss4.2%rmq,$s4I=8m$%1,rfR&?qih&(0mJ"j
+I!pEmJ:W<)KS>/9M2@.LN/is[OckllQ'I]'R$jD4S=Q7CT:hmOU8+N[V5:'gVuN[qWVrjrX8T-l
+Xo5@#X8K!tWW/prVZN`lV>d7mUS=HUrfHo9s-NhRQN!-UP`q8nOcYWbNfF$s!K2j7M#iEfre:K.
+KS9>W!ePuSrIFotrdO0]rdOlsrIFp!s+:9's+CB+re>?HLl$tGMi<USNfT6_OcklkPa.Q$R$a>3
+S"-(AT:hmPUSO``Vl6SpX/rG+YctC=ZaI6M\@K2_]Y2%o^r!t,`Pom=ai_fNc-FY^dF-Lne^i@)
+g"P39h;-rGi8N\Uj5f=akNM0plKdd&m-X6?mfDqJrpg-^o^r.Us7ZKerV6EgrqcQirVZTlo)=4?
+bl<1~>
+JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb$hX&]o'u5<n*]T0m/Bra4RG?.4o[_04nCf24V`'[
+EH,o7Chmd!BP(gd@q&kR?X?u6r(m8d!)NSjs&&Vh!)N/^s%iYYkrni+qE=jQoM4mOr)!DhrD*8d
+ohPN]r'LBKs$H`O!'pNI"[G@A84u_N;?9]fr(?u^s%NAcs%`SirD3Pm;H!Kms&B"ur`0)%=BPQ*
+#?k>9>[1Q??N+::?t!JQ@UinYrac+BBDuQFBkmW_$uBctDJjB3E,fl<Ec_5%!HiSbG63#7H2`*j
+H[Pg@s*artrdY'$JqEuSs+CB+reCH.s+pZ2s,-i7rJ^c9s,R&=s,d5Br0%&Crfm>Gm8Wm]r`&hr
+s&T,#q,dW"r`]8)qca#(qcj,*q-<r*q)eX?m8<m[qGI)c!)N/^s).dRrc%gUs)S*[rcJ-^rc\9b
+"*f*:GlE!fH3/G@I.125<V08a<W?%uG;4>gH@1-hIt3*%K7nr5LP^kGN/WdXO-,TgPa.N#R$a;1
+S"-%@StD[LTq\<XUnsobrhodp!3,psri?"!oWA(nri>sss/H$srhfgpV5=0e"/DTaU&Isb;?*!a
+Q^7W9$'^X:P*(ieO,f5!MueioreUZ3L]3#0KnP-YK*$XUJc1-!J,Xo_IK"]qJ,OotJcC?%KE$T)
+L&QgFLPUeDMMmFPNK0'\OHG]hPE_>uQ^F//S"#q>StD[LU8+N\VPgAlWiN5'Y->.8Za7'J[^`lZ
+]=bhk^VI_'`5T^9aN;TJbg"GZd*^:jeCE.%f\,!5gtgfCi8ESRj5]4^k3(sml0@U#m-O--rpKmW
+nc&(\oCV\Sp&Facp\jmeq>U6gqu-HjrUTr=s31Ln~>
+JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb%J98_o'u5<n*]T0m)mK&N;eh9Nq/8,NW>.:O<Jdh
+F)c/;DJX*'BP;!hA7B"U?XI)DhVR)DgtUT;g"G$1r7Cr!!S,^!dL"=Jd*L"^bfn8Qr5nntoT/p3
+rK$c7s,[,?s,R6'aN+1t!QE"K_Z7RQ_Z7RP_Z7RP_th1L_tq7I_uIR\]jP5V@UW\Q@:NgG@JaF7
+I$CYGp;6c#s%E>brD!;es%iVjs&&eor_rhr!*0#!s&T2&r`T8)!*fG-s'5V2ra,\6@K'^@@q9+]
+AS,Oerb)=HCAquRCi+$,DJsH4rc%sZF8g7_F`qs-G6)r6rd+Tk!.=co!e,WKrdY'$JqEuSs+CB+
+rJ(?-!/UT1s,-i7rJ^c9s,R#<s,d5Bqi^oAs-3Q7s4@8&qq:i"r7h8,s5!_3!8me6ro!k:ro<t<
+"6J\-kPaWEl2U&Ili$5JmeZAPnbnRJOn$Q^aSs3[aS*[P`n(1d`;R[O`rF$X`;[[H_Z.OO_YqA*
+G'A1VH@($fIXls"K7el4LPUeEMi<XUO-#KePE_>uQ^F//S"#q=St;RITqS3UrhKRkVZ*LnW;ijp
+Wr9!iXSo3tWrK'uW;WUqVPU-gU]I6brh0FeT:VYL]`sjjQBd`"PQ$^KOcYWbNfF$s#)e@qM26tC
+re:K.KS9>W!ePuSrIFlss*j9^rdOlsrIFp!s+:9's+CB+re>`SLl$tGMi<USNfT6_OcklkPa.Q$
+R$a;2S"-%@T:hmPUSO``Vl6SpX/rG+YHY:;Za@0L\%0&]]Y(tn^qmn*`5Ta;aN;WKc-FV]dF$Fm
+eCN7'f\5'6gtgiEi8ESSj5f=ak3(sml0@U$m-X6/n*fc9nac8BoCW"S!quB_rV6Bfs8)WirVZWm
+nc"+>c2W:~>
+JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb&+oJao'u5<n*]T0m$X8YD=qf.D=qfAD=_TDD&7A;
+F)c/;DJX*'BP;!hA7B"U?XI)DTqVIY!M>t\Sb8NPS,8WSRJ`HPDY7lGD?=`oDYe5HDY\5IQi36J
+Q2$[<QiEBOQ2[*IQiEBDPlZnHqc<Mo$!(&+<``sYKT_SoQ2O>T9E%W`:&dug:]=2j;?'Pn;u]es
+<W6&!<rcA%=oVY*>Q.n->l\41?NFPCraH+BA7T7_AnG]TBE;g^rbDaTD/F0.Df9UoE<1*$rcA3a
+G'<k/!I/nhHN/<lI/\NqIXckHJ-(:RK)UE&KE-`)LB!#/M#E21MZ8V5N;nn;Nr4t<OT(C>P5UUE
+PlIESU&1S\U\^ecV>d@iVZNfrWVrgsX7r^mXo5C&YPYR'Z2M!,D#J5DQKsh8PQ7!=PQB"QrlkDe
+"4#6=cMc)gd/MGkdf%YoeH4=Pec+,&f@JO)fDUs#PPC=>Ont7>P:q*'G^4U^I!pHoJ:W?*KnbA=
+M2I4MNK0']OckomQ'Rc(R$sM6S=Q7CT:hmOU8.^`!Mu[mVuN^qWVidpX7NFkX8K!tWW/pqVZN`l
+V>d7kUS@a]"/)9XT(n?NR$X,(Q'@L3Op-u0O,o<\req&>MM[1GLkkta!el;\rdt9(JV!cMrdXrs
+l[Ab]s*suts+13%s+C?)!/:E,HA@<5M2I4MN/`jYO-#KeP*;,qQC!u+R@B\9SXuIHTq\<XV5C/h
+WN*##Xfek3Z*L^C[^NZU\\#Me^;%J"_Sa=2`lQ6CbKJ/UcHstde'umuf@S[/g=tE=hV[8LiT&tZ
+jlY^gkiq?slg4!*mdBQ4nF?&>o(2JFrUg6cp\4X]rqZTjqtp?irVc9cJcF!pJ,~>
+JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb&+oJao'u5<n*]T0lr6qH4Sq;555[S=4Q\g&4S_,V
+G'%eFE,TW1CMINrAn>L^@UNPM?!L3&r(m8d!)NDer(m5e!)NAdpceL:q`a^:q`b$CpeL`]s%`#Y
+!)WVir(d/cnkK0Zqa(<N6N0:N6N9=V5<V.n5XnCBoht`\s%E>brD!;es%iVjs&&eor_rhr!*0#!
+s&T2&r`T8)!*fG-s'5V2ra,\6@K'^@@q9+]AS,Oerb)=HCAquRCi+$,DJsH4rc%sZF8g7_F`qs-
+G6)r6rd+Tk!.=co!e,WKrdY'$JqEuSs+CB+rJ(?-!/UT1s,-i7rJ^c9s,R#<s,d5Bqi^oAs-3+S
+s&8kqqGmPprDihts&]"ur`T8)rEK/&!*fD,!+#;'s'>F_m8<^VqGI5g!)`8_!,_[Ps).mVrG_gX
+rH%s[!d/U,rcJEgGB\:WG^045rHeKj!.=69qGm/ep/NbhGBeCZH[L6jJ:N3'K8#&8Ll%"IN/`jY
+OHG]iPa.Q$R$a>3S"-%@StD[LTq\=]U]I<hrhodps/GprrN#OkrN#jrs/H$srMK^oV5=0e!McCg
+T`^s[St>^S#+1aCQ'IStrfRGIOH5H_NW+k@Mi*@JLkpicL'!'^K`6T*Jq8LOJGt&uId;F]IfFor
+JH(3#K)^K'KE-`*L3eW2M2@+JN/WaVO,oBbP*2#nQ'Rc(R$jG5S=Q7DTV8*TUnsrdW2ZetXKAY/
+Yd(L?['mEP\[f>b]Y;.r_8=+.`Q$!?aihlPcHaeadF6Upf%8O+g=k<:h;7&Ii8N_VjQ5OdkNM0p
+lKdg'mI'E2n*ol;o()DDo_nFap@n=[q#:*hqYU0gr;HTardk*os*t~>
+JcC<$JcFI(o`"jgrqu]ks8)ckrV.$"p@e1Po^h\Fo'u5<n*]T0aiW(lrf-i9mZ.@.qMuP=F`_\E
+E,KQ0CMINqAn>L^@UNPM?!Q:DhVJ1d"l%bag"=sTfDa>%e^OKF#gq#FcHa\Yb0'_*q2PN9NfNss
+plPH8qi:W9s,d9'!QiCZ`W=&skJR)3rPSKKrPSTNs1o7V@:3GM?t!JO?t!PT@U`bSrEo_FMPn,]
+_Z!1-9E.]a:&dug:]4,i;#jMm;Z]ou<W6&!<rcA%=oVY*>Q.k/?!^k:?NFPCraGq=A7Y[N!G6!D
+BEr6dC27U$Ci0/h!H2rVE<:0%F8g7^Fa!b.s*+Nhrd"WmI!kpA!e,WKrdb$"!.t0%!ec8]rItB/
+Lku"ds,-i7r/CZ8s,R#<s3:YkOnY%<fDaG$g%jA!g]-%2h;7#Gro!e7s5O(=roF+@s5j=Eroj@G
+!:'OKs6TdQqX+CQmeuSTnF?C;!g1UIn]C1>n]1[LfDkWarPeWQs2G#VrknBF!5n]Ns2-O5GB\:X
+H@('gIt3*%K7nr5LP^kFN/WaWO-#NfPEhE!Q^F20S"#q=St;RITqS3UrhKUlVPa?js/>ssql94f
+qPsRpri#gos/,gmrhKRiUAghmTV%jJSt2CA]Y+3V$C@'EQ'IStP*1rhrf7GINJrgSMi*@JLkpic
+L&m!]rIY0'JV!cMrdXorm!\k^s*suts+(0%re(6(FG5I(LPL\BM2I4MN/`jYO-#KeP*;,qQC!u+
+R@B\9SXuIHTq\<XUo(&fWN)u"Xf\e2Z*L^C[C3QS\[oGd]t_=u_SX71`lH0Bb0/#RcHjkbdaQ^r
+f%8R-g=tE=h;7)JiSrnXjQ5Oekiq?slKdg'mI'uB!V#XYncJFTo`"O`pAamcq#C0hqYU0hr;?Na
+rdk*os*t~>
+JcC<$JcFI(o`"jgrqu]ks8)ckrV.*$p@e1Po^h\Fo'u5<n*]T0R@.o/o5<`.m;D]9q.ppmF`_\E
+E,KQ0CMINqAn>L^@UNPM?!O+tU&L\cT:YqNopl#Nr0mYRrg<P"p20eHr,;UQrbq[OqeuJ$r0RDK
+rK[,Cp6YfFrK[AJr0IDLr0@;Hq3CuEr`Aqsq,[c$<E3@FJrohnrg!ITs%EAcrD!;es%iSis%rbo
+rDNbs<E9$!s&T2&r`T8)!*fG-!aT,=ra,\6@K'^;@q9-LAH?CUrb)ONC2.O"Ci!tfD?4Zprc&![
+F*%>&!HiSbGQ2mfH2`*kH[L5?I0+kIJ,XuuJH1<#K*$^[L&H`-LPUcbM>rJ5Mu8P6NW5%:O8b[M
+DZ4SNP5CsOUA:S\V#I4jVYm@lVuWgpWrK-qX8o=!Xo5F%YPYR(Z2M!*C]\I>Qh?[/Q1't9bQ,ob
+cMl/hd/DAjdf7bueCE'urmgnss4@.4m$%:/qiU`<s-#-ZGB\:XH@('gIt3*%K7nr5LP^kFN/WaW
+O-#NfPEhE!Q^F20S"#q=St;RITqS3UrhKUlVPa?js/>ssql94fqPsRpri#gos/,gmrhKRiUAghm
+TV%jJSt2CANfO(!$C@'EQ'IStP*1rhrf7GINJrgSMi*@JLkpicL&m!]rIY0'JV!cMrdXorm!\k^
+s*suts+(0%re(6(FG5I(LPL\BM2I4MN/`jYO-#KeP*;,qQC!u+R@B\9SXuIHTq\<XUo(&fWN)u"
+Xf\e2Z*L^C[C3QS\[oGd]t_=u_SX71`lH0Bb0/#RcHjkbdaQ^rf%8R-g=tE=h;7)JiSrnXjQ5Oe
+kiq?slKdg'mI'uB!V#XYncJFTo`"O`pAamcq#C0hqYU0hr;?Nardk*os*t~>
+JcC<$JcFI(o`"jgrqu]ks8)ckrV.0&p@e1Po^h\Fo'u5<n*]T0;c>b>4?W=#qEFg?n3$M0!'K^5
+!'L*@(3anCF)c/:DJX*'BP1pgA7B"U?XI)Dr_WMgrD!>gq,$c\qG?uOr]U0Cs#p!<q`OpCr]L<H
+4\toLqG$ubpJ1carD*Ji:JUmbqbI#amnO$P5X@\&62j1O6ULc<%7<HJ5sILq5tFaK<)cfm;Z9;g
+9E.]a:&dug:]4,i;#jMm;Z]ou<W6&!<rcA%=oVY*>Q.k/?!^k:?NFPCraGq=A7Y[N!G6!DBEr6d
+C27U$Ci0/h!H2rVE<:0%F8g7^Fa!b.s*+Nhrd"WmI!kpA!e,WKrdb$"!.t0%!ec8]rItB/Lku"d
+s,-i7r/CZ8s,R#<r_ieZr]U+@pJh)irD`GirDrr"qH3]!r`];*qcWu(r`oG.pKR`)?MZbb;,Zj[
+ohbN_mnit#!,qjUrc%pYrH%jXrcJ6bGPl^aH2`-iHN8H\<r,hg<;9HIFa&%SH?spdI=HcuJqJ`1
+L51VBMN!LRO,oBcP*;/rQC!u,R[]e:SXuFFTV8'RU].%jV5C-hVuN^qWV`^dX88jrWW&jqVuNXo
+V>d7kUS@a]#G@]]St;LCSGQ.jQ^3r&Q'@JqP*(k*Nsgu-N/W[QMM[1GLkkta!JQ4*K*$XUJc1,u
+J,Xo`IK"]qJ,OotJH1<$KE$UHKnb>;LPUeDMMmFPNK0'\OHG]hPE_>uQ^F/.S"#q=StD[LU8+N[
+VPg>kWiE/&Xfnt6ZEppG[^WcW]"G\h^V@V%_SjF5a2lBFbKS5Vcd:(fe'uq!f@\d1gYCW@hVd>N
+ioB([jlYail07Kulg4!*mf)YUnF?MK!qZ'Vrq6<bs7cKes7uZjqtpBjr;H3cJcF!pJ,~>
+JcC<$JcFI(p&=pgrqu]ks8)ckrqQNf!;?Eb!VH!_nd"^Sn*f]2m)]0b!0,ThrJg`8lAla-G^":P
+F)c/:D/=!%BP1pgA7B"U?X@%;huDO5h>Z12gY1?[f_jA#ec=8!dgFONcd0n_c-+8Pao.;!Nqn\7
+Nr4t4OS=e@ONbnjaiMQDrPelW`9>,7_Y_7H_>qLM_Yq:QAn#4Xra5S2!+Pq;#\%4N?smDkR'lb,
+s%<;ar_38bs%`Sir_WVls&/hps&B"ur`0)%=BPQ*!a8f4r`f\6?=$uG?smFB@L$CRA7]=aAnV*V
+#AIpfCMRa&D>nDXDfBZ8EH6)@rcA3aG'<k/!dK!9rd"WmI!kpA!e,WKrdb$"!.t0%s+CB+rJ(?-
+s+pW1s,-f6rJ^Tu!0R2@!0R8DrfR64rRh/'pY,Q""l.qihVR/gi;_d9ir8!;jT"<Dk3(slrTO=I
+rp0RM!:BaQ!:B[Os6g$YnaZL<!6P)[oZ?UDnAkOJf`1Z`rPeWQs2G#Vrkn-?0m.Y`G^4U^I!pHn
+J:W?*Knb><M2I4MNK0']OckomQ'I]'R$jD4S"-%@StD[LTq\=]V#R7kVZ!FmW;`d^WrB!sW;WXo
+V?!IlV#R1iUAgi1TV%jJSt2FBS"#k7R(U)FQBd`"PEV/mOcYWbNfB$WN/NSmM$JilLPCP;KnTGX
+s+:9%rIFlsrdO6_rdOirrI=s#JqEuSIY<E/L5(J>Ll$tGMi<USNfT6_OcklkPa.Q$R$a;1S"-%@
+T:hmOUSO]_Vl-JnWiN8(YHY7:Za7'J\%&u[]=bhk^VI_'_o9U8aN2NIbK\>Yd*^:jeC<($f@em3
+gYL]Bhr*GPj5]4^k2tjjl07L!m-O--mdKW6naZ2@s766_rUp3a!;HEds7u]kqtp?ir;H3cJcF$q
+J,~>
+JcC<$JcFI(p&=pgrqu]ks8)ckrqQNf!;?Eb!VH!_nd=pVn*f]2m$Va.D=MN.D=)63D&7MCGBJ"K
+EH#f4Chm`uB4b^c@U`_P?=!Q)s.TFb!M>t\Sb8NQS,Si\S!oe6R@%jaDYJ#GDXhZFRK&ZOQiE?O
+Q1gO:QiEBKQ2[*KQiEBNQ2HmCPlR-KPlk)g=',2uq,dSs!bZe:r0.,Es%<;ar_38bs%`Sir_WVl
+s&/hps&B"ur`0)%=BPQ*!a8f4r`f\6?=$uG?smFB@L$CRA7]=aAnV*V#AIpfCMRa&D>nDXDfBZ8
+EH6)@rcA3aG'<k/!dK!9rd"WmI!kpA!e,WKrdb$"!.t0%s+CB+rJ(?-s+pW1s,-f6rJU`Hqjd_(
+qelCOrfR,PrhB.^qkX1erMK[nVuEUpWViarX88ptWrT7#Xo5F#YPYO(Z2M!*C]KdtQhcs5Q0jh8
+bl5lfc2Q#bci;>ldJ_Mje,Ro!e^i=Mec44rPjFV2P5:=;Oth*&GBeCZH[L6jIt3*&K8#&7Ll%"I
+N/`jYOHG]iPa.N#R$a;1S"#q=St;RITqS3UrhTRj!2f^ms/>prl`0r`ri#dns/#dmrhTRh!2BId
+,+tR#St;LDS=?":R@'"pO-Z&rP`q;oP*(ieO,f3ZN/W[PreUl9LPLV=KnY3ZKE$Q'Jc1,uJ,Xoa
+IK"]pJ,Om!JV&LQK78K-Knb>;LkpnEMMmFPNK0'\OHG]hPE_>uQ^F/.R[]h<StD[LTqeEZVPg>j
+WiE,%Xfnt5ZEpmF[^WcW]">Vg^;%J#_Sa@3a2l?EbKJ/Ucd:(fe'umuf@S^0g=tH>hV[8LioB([
+jlY^gkiq?slg4!*mdBQ4nF?&>o)J:]o_nI_p&Ojbq#C0iqYU0gr;?Nardk*ps*t~>
+JcC<$JcFI(p&=pgrqu]ks8)ckrqQNf!;?Eb!VH!_nd"^Sn*f]2lr3mFq)n@6!'^<Dl9,)0nN?S0
+(j^FNF`_\EE,KN/CM@HpAn>L^@UNPL>u1Dqr(m8d!)NDep.tT_q*+O9k<AoAr(d#]s%`>bpJ(]a
+r(d)alV7IE62WtJ62j1[6UF()6:4(*5sIM"8l>Rd!E<"s;ZBAh9E%W`:&dug:]=2j;?'Pn;u]hs
+<W6##='/T(=TVc2>Q.k4?!^iE?XR8MraH+BA7T7_AnG]TBEr6dC27U$Ci0/h#B+R#EH-#>F8g7_
+F`qs-G63#7H2`*kH[L5?I0+kIJ,XuuJH1<#KE$T)L&Hc+L]<2/M>rJ4MuAV2;ZJrZ49%GA4oUT>
+<;]\m<;BPk<rQ1r=T;P&>5qe.>$5#->5qh,>l@t&>QJ,:q`FjUqGQu`pe^lar_NSlm83h#!H2rV
+EW'qVF8Bt^F`qqPG^'+2rd"Khs*Fco<U<c_<V08e<AAW>GBeCZH[L6jIt3*&K8#&7Ll%"IN/`jY
+OHG]iPa.N#R$a;1S"#q=St;RITqS3UrhTRj!2f^ms/>prl`0r`ri#dns/#dmrhTRh!2BId%%s5b
+St;LDS=?":R@*tN&sefJP`q;oP*(ieO,f3ZN/W[PreUl9LPLV=KnY3ZKE$Q'Jc1,uJ,XoaIK"]p
+J,Om!JV&LQK78K-Knb>;LkpnEMMmFPNK0'\OHG]hPE_>uQ^F/.R[]h<StD[LTqeEZVPg>jWiE,%
+Xfnt5ZEpmF[^WcW]">Vg^;%J#_Sa@3a2l?EbKJ/Ucd:(fe'umuf@S^0g=tH>hV[8LioB([jlY^g
+kiq?slg4!*mdBQ4nF?&>o)J:]o_nI_p&Ojbq#C0iqYU0gr;?Nardk*ps*t~>
+JcC<$JcFL)o`"gfrqu]ks8)ckrqQNf!;?Eb$hX&]o'u5<n*]T0a8LtsNRs-hNW"n;O8=n-Nu<7h
+G^":PEcH&9D/3p$BP1mf@q&kS?X@$prnmb4!8[Y0!o)G^rn./#rmh,#e,Iksdf7Yscd'eZbPdP#
+O8b1<NW"h8N<#":O8+h6O8k:Hbfe/NaN2EBrl+uX`9G29_YD%=_>qFOQ2R$J@/s^7?i=@@@:NeX
+@q/tV?uV%$_>D(P8kVfN9`7]c:B+,g;#aDm;Z9Vp;ufqt<rZ8$=T2G)>$G51>QJ,:ra5\5!+Gk9
+!b5bOrac+BBDuQGBkhD^CB86grbhaS!-%pW!ci@'rcABfG'8(RG^+N4H3/G@I/\NqIXckHJH(3#
+K)L<'KS>-YLB!&/M#E2'cMWh%OT(FCfDX@qgAK\/gtgfChV\7h!TE&9j8\0CjlY^gkl'cGlMp2K
+li?GPmf)SSmd9u@s7$'Yr/^p#oud$No#U:?rl+qFg&L]_rPeWQs2G#Vrkn0@.!9]WG^=[_I=6Tq
+JV&N-KnbA=M2I7NNK9-^P*2#nQ'Rc(R$jD4S=TYN#+qQ^Tq\<WrhKUlVPa<iri#dpnuD\gri#am
+s/,gmrhTRh!2BIds.B@argj.]SGnukR[KP1Q^3r&Q'@JqP*(lgO,o<\repl9MZ/G5Lkktas+LH+
+re(6&s+1-!rdXorm="t_s*suts+13%rdt6)L&Qf-LPYqdD2O71N/`jYO-#KeP*;,qQC!u+R@9V8
+SXuIHTqS6WUnsueW2ckuXf\b1Yd(O@[C3NR\[f>b]tV7s_8=+.`Q#s>aihlOcHab`dF-Ooe^rF*
+g"P39h;-uHi8N\Uj5f=akNM0plK[^%m-X6?mfDqJrpg-^o^r.Us7ZKerV6EgrqcNhrqu]mo)=4?
+cMrC~>
+JcC<$JcFL)o`"gfrqu]ks8)ckrqQNf!;?Eb$hX&]o'u5<n*]T0RHnbQD>\;MDu4GDD&IYFG^":P
+EcH&9D/3p$BP1mf@q&kS?X@$3rhBFds.KCa!1s(Ypmh>S!1a"WrgEhTq/,nEqJH.JpMU%LqeuM&
+s-W\MoTo3;rg*DGrg*SNs-EYLqNUoCrg!PLqJlO9s&]/"oiD3&E.[qM"A2<[9MGCZs%`SirD<Mk
+s&/hps&8tur`9&#s&f8'!a8f4r`fJ0?N+=3?iXX7@KL%MAH$-@AnV*V!blCarbDOND>nGQDZFbU
+E<:0%F8g7dF`qqPGBe@XrH\NlI!kpA!e,WKrdb$"s+:3%!ec8]rJ(?-s+pW1!1j%Xqjd_'rGDFL
+"E/0qTqVFZp7qM\rh]Xls/5jn"/i)sWViarX8B!tWrfB)Xo5F!Y6(r3YPtd)ZM\M=QM-[BQL0t(
+PQkL=c-FVZc2,`bcN;J@dJ_Mndfe+JdaHVBeG[ntf(YErPP^O=Oo(:iF`qtRH?spdI=HcuJqJ`1
+L51SAMN!LRO,oBcP*;,qQC!u+R@9V8Sc52bT:hmOU8+L_U]RBiVZ!FlW;W^dWrB!sW;NRnVZ3Ll
+V#R1iUAgkdTE(V`ScPCPrgORiR@'A.QBmf$P`q8nOcb`dO,f5!MueioreUZ3L]3&.K`Hf*KE$Q'
+Jc1,uJ,XoaIK"]qJ,OotJcC?$K)pXZre:H/M#N6JMMmFPNK0'\OHG]hPE_>uQ^F/.R[]h<StD[L
+TqeEZV5L5iWiE,%Xfen4Z*UdE[^N]V\\#Mf^;%J"_Sa=2`lH0BbKJ,TcHjncdaZdsf@S[.g=tE=
+h;@/KiSrnXjQ5Oekiq?slKdg'mI'uB!V#XYncJFTo`"O`pAamcq#C0hqYU0hr;?Nardk*ps*t~>
+JcC<$JcFL)o`"gfrqu]ks8)ckrqQNf!;?Eb$hX&]o'u5<n*]T0<;eoL4T%A&4T.G24<$G0H$FOU
+FE2A?DJa0)BkV-jARf1X?sd5G:/Cgbr(m8d!)NDerD3GirD3Ag!'U-AqE=d>r&sC1s%iSgq+^la
+peUBSqG6]Xs%WDdr]^9F!CB*M5QF+L63'CP5lsA?6N07O7nrhY"A2<[9MGCZs%`SirD<Mks&/hp
+s&8tur`9&#s&f8'!a8f4r`fJ0?N+=3?iXX7@KL%MAH$-@AnV*V!blCarbDOND>nGQDZFbUE<:0%
+F8g7dF`qqPGBe@XrH\NlI!kpA!e,WKrdb$"s+:3%!ec8]rJ(?-s+pW1oi(cO"$AY,4T%A><;TVl
+<;KVp<rZ8$<rH+q=9)M#>5h\)>5_\(?2.\(>l\4/49/7O;Yj8c;"RQQ:]k'CE,bbqrc7sY!d&L)
+rH/'_qKDpard"Hgs*XfGlrNs_oMk]f.!9]WG^=[_I=6TqJV&N-KnbA=M2I7NNK9-^P*2#nQ'Rc(
+R$jD4S=TYN#+qQ^Tq\<WrhKUlVPa<iri#dpnuD\gri#ams/,gmrhTRh!2BIds.B@argj.]SGnuk
+R[KP1Q^3r&Q'@JqP*(lgO,o<\repl9MZ/G5Lkktas+LH+re(6&s+1-!rdXorm="t_s*suts+13%
+rdt6)L&Qf-LPYqdD2O71N/`jYO-#KeP*;,qQC!u+R@9V8SXuIHTqS6WUnsueW2ckuXf\b1Yd(O@
+[C3NR\[f>b]tV7s_8=+.`Q#s>aihlOcHab`dF-Ooe^rF*g"P39h;-uHi8N\Uj5f=akNM0plK[^%
+m-X6?mfDqJrpg-^o^r.Us7ZKerV6EgrqcNhrqu]mo)=4?cMrC~>
+JcC<$JcFL)o`"gfrqu]ks8)ckrqI*"p@e1Po^qbGo'u5<n*]T0a8V%qNVn_8NUDc*NV&2-NW+t7
+O8k=;NrY:@NuNImH$=ITFE2A?DJa0)BkV-jARf1X?sd5GhVS7hs5!b3rnIY2g=b-2qq(hu!7h%t
+#1M#Id*L"^q2kH6s,R&;s,?o9rf?]5rJq0-bfe/NaiOG$!QN+V`;%7M`;daS`;IOO_Y:t<_>ohs
+Pm*Jj_82G'ra>k9?XN_=$=[LTA7K+YAUp8Yr4rA+r_38bs%`SirD3Pm;H!Hl!`W0"r`9&#!*K5'
+s&oD,r`oJ/!+,Y3s'Ph8raGq=A7Y[N!G6!DB`DcHCAquMCi+%gD?4Zprc.sY!-A-]s)e<brceBe
+!."Qis*OcnrdFfq!.Xrts+(0%rIb-'s+UE+n]pijrK.'2!nc2ZptGW"s4mY1s5!b5r8@S6rT!q=
+$g$O6kNM-ol0@R"li$2MmJlVOmJcPRn,MkZnWArqrQ4WQqT8<Ln]1UJs'FCYn&5(Arl"cQnA6Vr
+G'A1VH@($fIXcm!K7ei3L5:\CMi<UTO,oEdP*;/rQC!u+R@B\9Sc52bT:hmOU8"F^V#R:kVYm@j
+W:R"eW;ELmVZ3LkV#R1iUAgkdTE(V`ScPCPrgNqWRJrQ\Q^3o%Pa%ApP*(k*Nrb9#repl9MZ/G5
+Lkktas+LH+re(6&s+1-!rdXormX>(`rdXlss+(0%re(6(!/:E,!JcL1M0Oo9N/WaVO,oBbP*2#n
+Q'Rc(R$jD4S=Q7CTV8'RUnjiaVl6SpX/rG+YHY:;Za@0L\%0&\]Y(tn^VRe(`5Ta:aN;TJbg"GZ
+d*^:jeCE.%f\,!4gYL]Bhr*GPj5]4^k2tjjl07L!m-O--mdKW6naZ2@oCMVQp&F^cp\agdq>^<g
+qu-HjrUTr=s3L^q~>
+JcC<$JcFL)o`"gfrqu]ks8)ckrqI*"p@e1Po^qbGo'u5<n*]T0RH\VMD>nGLDuX_JD&[kKH$=IT
+FE2A?DJa0)BkV-jARf1X?sd5GTqVI[s.TIcs.9:_r13YRr1*hXrL<hUs)7mSrGD1Er,)FNpM]nG
+"IbaHR$dc;oTo6<r0I8Gqj.5Hq3:iCrKd4urg!M'!*9)#s&Seo"'TGcMu8b=9E%W`:&dug:]4)k
+;,U<j;Z]ou<W6&!<rcA%=oVY*>Q.n->l\41?iOL6@K'^;@q9-LAH?CUrb2=G!,DLK!c2^jrb_aT
+E;jkWEWC1[FT6I`G5c^cGQ<$gHN/?lI/\QoIK4lrJH(0#K)L?%K`?c)LB!eCSc##TSc<R)D#\AN
+D?OlqTq\:TU\pqfUB%+hV>mCmVu<IqVl6PnWVrgsX8K'tWr]<(rN?+&!3Z.$!3lI-"0uf^D>fdo
+Qi!*9Q0jh9?3AErbfoq.rQbDhrQt\pdF%sA!7Ukq!7h(us4-1oqi^]9rK8UOG'A1VH@($fIXcm!
+K7ei3L5:\CMi<UTO,oEdP*;/rQC!u+R@B\9Sc52bT:hmOU8"F^V#R:kVYm@jW:R"eW;ELmVZ3Lk
+V#R1iUAgkdTE(V`ScPCPrgNqWRJrQ\Q^3o%Pa%ApP*(k*Nrb9#repl9MZ/G5Lkktas+LH+re(6&
+s+1-!rdXormX>(`rdXlss+(0%re(6(!/:E,!JcL1M0Oo9N/WaVO,oBbP*2#nQ'Rc(R$jD4S=Q7C
+TV8'RUnjiaVl6SpX/rG+YHY:;Za@0L\%0&\]Y(tn^VRe(`5Ta:aN;TJbg"GZd*^:jeCE.%f\,!4
+gYL]Bhr*GPj5]4^k2tjjl07L!m-O--mdKW6naZ2@oCMVQp&F^cp\agdq>^<gqu-HjrUTr=s3L^q~>
+JcC<$JcFL)o`"gfrqu]ks8)ckrqI*"p@e1Po^qbGo'u5<n*]T0<;nu>4T@M04Sh544</`pH$=IT
+FE2A?DJa0)BkV-jARf1X?sd5G:/4U`;#F,f:&n)c;#X8i;#O2i;#``V4o.A>4o7A@4nh/?4o@MC
+:]4&a:%_<R:B"&h;#a>_:Amod:&mKS57'SO:JX5@6:!k&r]gHLrBgKL#!t[D6:OREr)3Sgr_38b
+s%`SirD3Pm;H!Hl!`W0"r`9&#!*K5's&oD,r`oJ/!+,Y3s'Ph8raGq=A7Y[N!G6!DB`DcHCAquM
+Ci+%gD?4Zprc.sY!-A-]s)e<brceBe!."Qis*OcnrdFfq!.Xrts+(0%rIb-'s+UE+s&&bnp/C`L
+"[5(34[)%.<;BJl<;KVo<rQ/#<r?%p=9)M$>5h\)>5_Y*>lJ%(>l@q.?N*(c;=[W];>j>Z:\@Qa
+?Mnd@E<(%XF8p:\ErpH+G5ZXbG5ladGl;peHN&9i<U<c_<V08h<@N$5GBeCZH[L6jIt3*&K7nu6
+Ll$tHN/WdXO-,TgPEhE!Q^F/.S"#q=rgj=dTV8'RU8.^`s/#amr29Llo;V\eqksIks/#[is.]Rg
+rh9@b!2'7^!M,b[RfStGrg4%ZQBd`"P`q8nOc]R'!KN0=MueioreUZ3L]3&.K`Hf*KE$Q'Jc1,u
+J,XobIK"]pJ,OotJH1<$KE$T)L&Qf-LPYqdG`%E<N/`jYO-#KeP*;,qQC!u+R@9V8SXuFGTqS3V
+UnsrdW2ZetXKAY/Yd(L?['mEP\[f;a]Y;.q_8=(-`Q#s>ai_fNc-FY^dF-Lne^i@)g"P07h;-rF
+i8EVTj5f=ak3(sml0@U$m-X6/n*fc9nac8BoCW"Ss7QHer:p<fs8)WirVZTlo)=4?ci8L~>
+JcC<$JcFL)p&=pgrqu]ks8)ckrV-rup@e1Po^h\Fo'u5<n*]S`rJ^T4rf$]5oSiR)qi(H4rf6i9
+q2kW;rfA.KI!U'^G'%hHEGo`3CMIQsB4YU`@UWYO?<uFFhYuF4h?VllgtUQ9f\$&Prmh)"rR:u!
+da6@eoT8j/s,I/?NfF$ur/^K3#LC]>bK@rKaSj0Z`rF![`l5m7qnrBN!5ncRr58NNpVZR=qj%)F
+qSE;sQBq8Q!b#PIrF5nPO/i2q!_Z3\rD!;es%iSis&&eor_rhrs&K&!s&T2&r`T8)!*fG-s'5V2
+ra5\5!+Gk9s'l%>rac.CB4q3W!GQ<JC]A2ND>nDSDfB[pE<:0%F8g7_F`qs-GQ2mfH2W$jH[L5?
+IK+crJ,XuuJcC?$KDj'hcMu/ecM`juOTLWsf`'S$gA0M'g]610hZ)L4i;_d9ir8!<jT"<Jk3(pk
+kiq?slg+N9p?hkI!:TpV!qDD8prW6Pq8r*Hp;d*Ns'>Y0g].;mn&5(Arl"cQo"lkuFa&%SH?spd
+I=HcuJqJ`1L51SAMMmFQNfT9aP*;,qQ'Rc(R@9V7S=TYN!M?%aT`Us`U].(hV>mFhVt-e_VuNXn
+V>d:jU]7(fU&UbcTDkDnSXc4>S!ob5R$a5+QBd`"PQ$^VOcYWbNfK*XN/NUOM2@%EL]3#0KnP-Y
+KE$Q'Jc(&uJ,OicIJnWpJ,OotJcC?$KE$T)L&QgALPUeDMMmCON/`jYO-#KeP*D5sQC!u+R@9V8
+SXuFGTqS3VUnsrdW2ZetXKAY/Yd(L?['d?O\@K2_]Y2(p^r!t+`Pom=aND]Lc-FV]dF$FmeCE1&
+f\,!5gtgfDi8ESRj5]4^k3(t-klpA<m-O--rpKmWnc&+Zo)SF^p&Facp\jmdq>^<gqu-HkrUTr=
+s3L^q~>
+JcC<$JcFL)p&=pgrqu]ks8)ckrV-rup@e1Po^h\Fo'u5<n*]S3kAKBuphg(Mq/6+I*IW<]H$=FR
+FE2A>DJa0(BkV-jA7K(W?sd5GTV8(YUA^bdTV)+Pq4.AR!1a"Ws).[Omr&,Ar,2CMqJQ>%s-`nS
+r0Qu?pm:oErg!>Grg!>ErK[>Ip2U+tr0@G&EH,%L<rulRL&R8;92&%X:&dug:]4,i;?'Pn;u]hs
+<W6&!<rcA%=oVY*>Q.n->l\41?iOL6@K'a9@fU'=AHHIVBDuQFBkmW_s(h[Prb_dUE,ber!ci@'
+rcA3aG'<k/s*+NhrH\NlI!kpAs*jutrdb$"s+:6&r1*\UrLE_T!,h^Or+uCMrbhb1pnR_^rhKLh
+s/#Og!N2mqWW0!uX8T-uX8f:$XoGR&YQ(d$Y5kg+Yl_4KDYTOnQi!*6Q1:+=?2n10bl>ofbl,fc
+c2c2hd/25hdf7ereGn"se,e+Nj-0A'p6#B<.WffWGBeF[H[U<lJ:W<)KS>/9Ll%"IN/`jYOHG]i
+Pa.N"Q^F20S"#q=rgj._T`1VdU8+L_V#R:kVY[4]W;<FlVZ*FkV#R4iUAgkdTE(V`Se.H_S=?":
+R@0G0Q^3r&Q'@L3Oq<b;O,o<]NJrgSMi*@JLkpicL'!'^K`6W(K)^E"JH(,tIdhdaIfForJH(3#
+K)UE&KE-`*L2)L"M2@+JMi<USNfT6_OckllQ'IZ%R$a;1S"-%@StMdNU84T]VPgAlWiN5'Y-5(7
+ZEppG[^WcW]">Vg^V@S$_Sa@3a2l?EbKJ/UcHstde'umtf@S[.g=tE=h;@/KiSrnXjQ5Oekl0fM
+lKdg'mI'uB!V#XYo)J:]o`"O`pAamcq#:*hqYU0gr;HTbrdk*qs*t~>
+JcC<$JcFL)p&=pgrqu]ks8)ckrV-rup@e1Po^h\Fo'u5<n*]RCrB'%%pcIk*!'Ts:)L[!ZH$=FR
+FE2A>DJa0(BkV-jA7K(W?sd5Gr_EGgs%r_kqG%#do2,B]r]^!<r'(!@rB1!@q`ap@!B`OD:]4&c
+:&du]:\7E^:]+&h:\IQ[:&@0Q5lOUY:BimG5XIb&6N04P5sdn*rBUQQ6UaUBr_ikk9MGCZs%`Si
+rD<Mks&/hps&B"ur`9&#!*K5's&oD,r`oJ/!+,Y3s'Ph8raPn;!+c(?!bQ(Xrb)=HCAr#KC]J>O
+D?=`qE;jhYEcZ=$F96T.G5c^cGQ<$fH3/G@I/\QoIfFosJH(3#K)UE$;#X>k;YF&]4o[\G4nhkT
+<;BPo<q]Vk=T2J'=ohc0r`T8)rEK8+!+#;'s'5_3>s(7E;>*o];>j>Z:\die?2n1/E;abXEcZ=#
+EWpN+F`hnPr-&'`rceEgrd+Tk!.=ZDlrNs_oMkij.WffWGBeF[H[U<lJ:W<)KS>/9Ll%"IN/`jY
+OHG]iPa.N"Q^F20S"#q=rgj._T`1VdU8+L_V#R:kVY[4]W;<FlVZ*FkV#R4iUAgkdTE(V`Se.H_
+S=?":R@0G0Q^3r&Q'@L3Oq<b;O,o<]NJrgSMi*@JLkpicL'!'^K`6W(K)^E"JH(,tIdhdaIfFor
+JH(3#K)UE&KE-`*L2)L"M2@+JMi<USNfT6_OckllQ'IZ%R$a;1S"-%@StMdNU84T]VPgAlWiN5'
+Y-5(7ZEppG[^WcW]">Vg^V@S$_Sa@3a2l?EbKJ/UcHstde'umtf@S[.g=tE=h;@/KiSrnXjQ5Oe
+kl0fMlKdg'mI'uB!V#XYo)J:]o`"O`pAamcq#:*hqYU0gr;HTbrdk*qs*t~>
+JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nceRQn*fY`r/C]:q2GB5oSr^+m>_+*qN(B4
+s,e=NI=$9cGBS(LEH,o7Chmd!BP(gd@q&kR?X@!ohYc:2hZ)C8gtUQ9f\$&Prmq,"rmV"uda7HE
+p5f66pQ,-3s3Ctrc-+;QaiMNDrl=uWs2=uVr586Ho#("7s-<AFpVQpGs-<^o?XNV:$XmLR@q0>0
+T"2\R9`7]c:B+,g;#aDm;Z9Vp<<#tt<WZ?)=T2J'=o_e+>lS(0?N+=3?iXX7@fKp<AH$-AAnPcU
+BEDm_CAquMCi+%gD?4ZprG_mZF*%>&!d/[0rceBe!."Nh!df<BrI"iuIt,\cbPfZ_c2,`ac2Grf
+O8t@>OSP%=OT3u4g&'M#g]-(.h>c@2hZi#tiSrkWj8S->jo=KBk61#5l0@U5m.B]Emf)\VnrWIb
+qo\ZTlcB"Eqo8V?s'+:Yo#:IDqSiHPrPS<F/AZFNG'A1VH@($fIXcm!K7ei3L5:\CMi<UTO,oBc
+P*;,qQC!u+R@9V7S=TYN!M?%aU&UheU]%"gV>d@WVuERnV>R.hU]7(fT`UmZTDkDsSXc4>S!oe6
+R$a5,QBd`"PEV/mOc]R'!KN0=MueioreU]4LPPk`!el;\re(6&s+1)urdXornU:@bs*srss+13%
+rdt`7KnY89LPUbCM2I4MN/`ksO)0o@P*;,qQ'Rc(R$jG5S=Q7CTV8'RUnjiaVl6SpX/rG+YHY:;
+Za@-K\%&u[]=bhk^VI\&_o0O6aN2KHbKS8WcdC.ge'uq!f@\d1g>(N?hV[8MioB([jlY^gkiq?s
+lg4!*mI'H3nF?&JncJFTo`"O`pAamcq#C0hqYU0hr;?Nardk*rs*t~>
+JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nceRQn*fY3r,(\9kABO&++AWbH?j^XFE;GA
+Df0B,C1q9mARo:[@:*AJ>bIa`U&LebT`LgYr13VQr1*nZS"'1jqJY;0rL*eUR$dl>nWrm8r0@>J
+pm1c@rK[;Hp2U+tr0I;Hs-3P'r`8eqs&T/$#$l(oNg#Z#rD!;es%iSis&&eor_rhrs&K&!!`rK+
+r`T8)!*fG-s'5V2ra5\5!+Gk9s'l%>rac.CB4q3W!blCarbDROD/K8i!H2rUE<:0%F8g7_F`qs-
+GQ2mfH2W$jH[L5>I0+kIJ+]?0Sc>5USc3L+DYn;KD#\>PUA(G^V#7"eV#R:gVZ3RoW;`grX8]4!
+X8f:#XT5O&YPt^$YQ(j+YlV.Io9T<@qj-B0p6>P]s',EFrQY>erQkJirR(VmqpYPos4-+mqi^`:
+rfSdRF`qtRH$XgbI=?ZrJV/T.L5(M@M2R=ONfT6_P*2#nQ'Rc(R$jD4S"-&KScPIVrh9@d!2KLg
+s/#^llDOWYs/#Xhs.fUgrh0CdT:c+S'qLkbS"#k8R@'A.Q^3o%P`q;oP*(k*Nrb9#repl9MZ/G6
+LkgcbL'!'^K`6W(K)^E"JGt&tIdqjbIfFoqJH(3#K)UB5KS>,7L51S@M2@+JN/WaVrf:lWP*2#n
+Q'IZ%R$a;2S"-%@StMdNU84T]VPgAlWiN5'Y-5(7ZEppG[^WcW]">Vg^;%J"_Sa=2`lQ6CbKJ,T
+cHjncdaQ^rf%8R-g=k?<h;7&IiSrnXjQ5OdkNM0plKdg'mHs?1n*ol;rpg-^o^r.Us7ZKerV6Eg
+rqcNhrqu]mo)=4?d/SU~>
+JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nceRQn*fXCr&`q$niQ5$r&ap@)h*3^H?j^X
+FE;GADf0B,C1q9mARo:[@:*AJ>l@Fs:]F8k:]!oe:\dib;$'Qi:\m9/4oRPE:JUmbrD*;cr_E2`
+!`2ZgoM5E^r_WMgpJ(``:Amoe5PRM@;#3uf5l<tJ5Rp(H6:4"'5s[n19N"ef9`7]c:B+,g;#aDm
+;Z9Vp<<#tt<WZ?)=T2J'=o_e+>lS(0?N+=3?iXX7@fKp<AH$-AAnPcUBEDm_CAquMCi+%gD?4Zp
+rG_mZF*%>&!d/[0rceBe!."Nh!df<BrI"`rIt.Gqs&&Vhs&&bnpJ_&RnicbHs&Akqs&SeoqcNSq
+s'#A*mT]cu4S)GI;XdQ_;!q-X;#X`">Q8[AEW'nXEW0t[F*)O%FoHR_G63#7H2W$iH[PWhlrNs_
+oMd>_F`qtRH$XgbI=?ZrJV/T.L5(M@M2R=ONfT6_P*2#nQ'Rc(R$jD4S"-&KScPIVrh9@d!2KLg
+s/#^llDOWYs/#Xhs.fUgrh0CdT:c+S'qLkbS"#k8R@'A.Q^3o%P`q;oP*(k*Nrb9#repl9MZ/G6
+LkgcbL'!'^K`6W(K)^E"JGt&tIdqjbIfFoqJH(3#K)UB5KS>,7L51S@M2@+JN/WaVrf:lWP*2#n
+Q'IZ%R$a;2S"-%@StMdNU84T]VPgAlWiN5'Y-5(7ZEppG[^WcW]">Vg^;%J"_Sa=2`lQ6CbKJ,T
+cHjncdaQ^rf%8R-g=k?<h;7&IiSrnXjQ5OdkNM0plKdg'mHs?1n*ol;rpg-^o^r.Us7ZKerV6Eg
+rqcNhrqu]mo)=4?d/SU~>
+JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb%eTA`o'u5<n*]T0m-Es$rJpT2!05rrrJpc9pQ-GY
+JUi2tH[9p\G'%eFE,TW1CMINrAn>L_@UWVN?!RBdro!h6s5*e3"l.kdg"=sRfDaA"eH47Le*E+`
+O84n:cNMP<bfe0.aTBQ(aSs6[`rF!X`;[[H`;%4M`;@IE_Xs/h_YM"LP*VF0?iFF<@:E\WI?q%P
+rD!;es%iSis%rborDW_q!*/tu!`rK+r`T8)!*fG-s'5V2ra5\5!+Gk9s'l%>ral+A!,):Es(MIJ
+rbMOM!,_^Qs).mVrc.sY!-A*\!d/[0rceBes*=Ti!.4Xe!6Y;arQP2arQb8arQb>%!0I2@rfI&?
+s,d95s4R;'rS.>,rS@M1rnmb7s5O(=s5a.?!9X:Ds6'XNlKdd&m/?>Om.fuJmf2_WnF?,KaR[FQ
+b4Wm?aSNm[>[(E9>$9Y\!64TKo>L:=r5/JU.WorZG^=[`I=6TqJV&N-KnbA=M2I4MNK0']Ocklk
+Q'IZ%R$a;1S"#q=rgj1`TV2:X!huHbr1s=grMK4br20Iir1s@fs.]Lds.KCargj@cS=H(<R[TZD
+QiWP>rfmMKPQ$^LOcYWbNfK+uMueioreU]4LPPk`!el;\re(6&s+1)urdXlqo6pRdrdXlss+13%
+re(6(!/:E,!JcL1M/\?1N/WaVO,oBbP*2#nQ'IZ%R$a;2S"-%@StMdNU84T]VPgAlWiN5'Y-5(6
+ZEpmF[^N]V]">Vg^;%J"_Sa=2`lH0Bb0/#RcHjkbdaQ^rf%8O,g=k<:h;7&Ii8N\UjQ5OdkNM0p
+lKdd&m-X6?mfDqJrpp*\!;-9`s7ZKerV6EgrqcNhrVZWmo)=4?d/SU~>
+JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb%eTA`o'u5<n*]T0m-Es$k&0I$lu!hpJ:;onH?aXW
+FE;G@Df0B,C1q9mARo:[@:*AI>lLGpUA^bdTV).QpmhATr1*V$no*Z.r0dYSR/NBCQLpO8QN*6J
+Pl6mGQLo.sQ26gHQ26^HD/jRk<rH,"<WlN;G)):[:&dug:]4,i;#jMm;u]es<W,r"='/T(=oVY*
+>Q.n->l\41?iOL6@K'a9@fU'=AcH?BBDuTEB`MoIC]A2ND>nGQDZFbUEW:%ZF8^1^F`qs-GQ2pf
+H2`*iHi'<*SFW6KD"VZFD"j_)V#-qdV#I4hVZ3OrW2Zbrr2]gu!3?+#rN-(&ric4%qQKq's02R1
+mZmj>qNg0,qNM1h>?b97=j-fgrQY>erQkGhrmCVkrmUboj-/qps)]`5GB\:XH@1-hIt3*%K7nr5
+LPUeEMi<XUO-#KeP*;/rQC!u+R@9V7S=TYN!hZ-Yrh0CfUSIa_rh]RjoV_Varh]Ogs.fUgrh9@b
+s.B:^#G%BTS"#k8RJrQSQ^7W9!L/fIOp7&1O,o<]NW+k;Mi.Lj!f2Vere:K.KS9>Ws+:9%r.+cr
+rI4?drI4`qrIFp!s+:6&s+CB+re:H/M#N6MMMmFPNK0'\OHG]hPE_>tQC!u+R@B\9SXuFGTqS3V
+UnsrdW2ZetXKAY/YctF>ZaI6M\@K2_]Y2%o^qmn*`5Ta:aN;TJbg"GZd*^:jeCE.%f@em3gYCWA
+hr*GOioB+]k2tjjl07L!lg4!*mf)YUnF?MKs766_rq6<bs7cKes7uZjqtp?irVc<dJcF*sJ,~>
+JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb%eTA`o'u5<n*]T0m-Es$j#l]jniZe2*J&`iI=$9b
+GBS(LEH#i6Chmd!BP(gd@q&kR?X6q9:Adof;#a>i:B+,a;#F2j;"d*04oRPH:JOY\:]!le:&[oa
+:]F/i:]=2i:\@K^:B45h:\7E^:%U^J;"dZf4?u.u62j1[5sR\$6:4()5X@n5:fI<es%`SirD<Mk
+!)ibos&8turDiu$=BPQ*s&oD,r`oJ/!+,Y3s'Ph8raPn;!+c(?s(27Drb2=G!,DLKs(h[PrbhaS
+!-%pWs)J*\rH&*`G'<k/s*4Qhrd"Qkqbd>js&&Vhr_`Ympf%,Qr&j^:q,@;mrDihtoN1unqcWr$
+s&oA*rEK5*s',>)"']#7>Q%e,?1(Pi;X73Y;"%0g>[(E9>$5f`EH6)>ErL%_EcZ;DF`hg*Fo?L_
+GPugdHN&9e<U3]S<W@.jFa&%SH?sseI=HcuJqJ`1L51SAMMmFQNfT9aP*2#oQ'Rc(R$jD4S"-&K
+ScYOWT`1VdU8+L]V#I4hVY$eaVZ*FiV#R4iUAgkdT`:Y`Sd1gVS=?":R[O/B!LK,OPl[,5rfRJJ
+OH5H_NfF$s!K2j7M#rKgL]3#0KnP-YKE$Q'Jc(&tJ,OifIJnWoJ,OotJcC?$KE$T)L&Qf-LPYqd
+E/KR4N/`jYO-#KeP*;,qQ'Rc(R$jG5S=Q7CTV8'RUnjiaVl6SpX/rG+YHY7:Za7'J[^`lZ]=bhk
+^VI\&_o0O6a2lBFbKS5Vcd:(fe'uq!f@S^0g=tE=hV[8LiSrnYjlY^gkiq?slg*p(mI'uB!V#XY
+o)J:]o`"O`pAamcq#C0hqYU0gr;HTbrdk*rs*t~>
+JcC<$JcFO*o`"jgrqu]krqZWjrV.?+p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5]+oN<#%9NpD])
+NrG%;Nr>%=O8t@9O<9++J:;onH?aXVFE;G@DJj9+C1q6lARo7Z?sd8HhV\=js5=+=hr!;IrnR_3
+g=b-2qUbYrs4%,!muRO3qN1**rK.!(s3:Sf"3\j0ao0<[a8a-Z`UCbA_u@UO_u%:N_u@OEQMA>m
+_>;"LQBhASrEoS4$=RCbNM]EE:/4S\rD<Mks&/eo!`W0"r`9&#s&f8's&oD,r`oJ/!+,Y3s'Ph8
+raPn;!+c(?s(27DrFc7HC23``!c2^jrb_dUE,bers)J*\rH&3cG'8(RbPo``bPoWdbKA#Orlk;b
+s3CPes31Jerm(J(pQ,?9rfI5Cf`'S$gAfq-h##q-h>lI4i;_g9irJ0=jo4EBk6C/7lK[^$m/?>N
+m.fuImK;qInauXukfN,2r5\iWs',M,rE7tVrl4NJo>L=>rPC@3FEMbNG^4U^I!pHoJ:W?*KSG5:
+M2@+KN/`mZOHG]iPa.N"Q^F/.R[]e:SXl@DT:_eUU&UkeU\gkcV=^Y`V>I(fU]7(eU&UbcTDb>d
+SXc4>S!oe6rg3_QQN!-MP`u*0%$?X5O,o<\NJrgSMMhCi!JlO1LAuu-K`6W(K)^E"JGt&rIeA-f
+If=ipJH(3#K)UCPKS>,7L51P?M2@+IMi<USNfT6_OcklkPa.N"Q^F20S"#q=StD[LTq\?YV5C/h
+WN*##Xf\e2Yd1UA[C3NR\[f>b]Y;.q_8=(-`Pom=aND]Lc-FV]dF$FmeCE1&f\,!5gtgfCi8ESR
+j5]4^k2tjjl07L!m-O--mdKW6s7-*Z!qZ'Vrq6<bs7cKes7u]kqYU9ir;H3cJcF-tJ,~>
+JcC<$JcFO*o`"jgrqu]krqZWjrV.?+p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5]+aDX;6-DBFL^
+J:;onH?aXVFE;G@DJj9+C1q6lARo7Z?sd8HT:l1Wr1a+_!2'1[pmhATrg`h&lYcc@rGV4DrL3bS
+s-WbOop5-7p6PWAs-3PKs-<YOrg*.q!1!DHs-<GFrK[AJs)A!<q,[Ms$!(GRJ5&a5:/=[a;#aDm
+;Z0Mq<)lrt<rZ8$=T2J'=o_e+>lS(0?N+=3?iXX7@fKp<AH$0?AcQKBBEDm_CAquMCi+%gD?=`q
+E;jkWEWC1ZF9Qf1G'A/!p7(`Fnt#YorbMOMphff$!2B=brM9Iirhf^ns/5stWr&jrXT,F&Y5bX'
+Y5b^%Y5GL%YQM/9Z^9g?i0F>,s',M,rE9-D!mSs5rQY;drQkJirmC_nrR1o!e'ujqifikp1NRY\
+G'A1VH@($fIXls"K7ei3L51VBMN!LRO,oBbP*;,qQ'Rc(R$jD4S"-%?St;RHT`1YbUAq"cV#@.^
+VZ!@gV#I.hUA^ecTE(V_Sd1gVS=?":R[O/B!LK,OPl[,5rfR\POH>NaNfB$WN/NRNreUZ3L]3&.
+L&Zi*KE$Q'Jc(&tJ,FcgIJnWoJ,FisJcC?$K7AQ.Knb>;LPUeDMMd=NN/`jYO-#KeP*;,qQ'Rc(
+R@9V7S=Q7DTV8'RUnjiaVl6SpX/rG*YHY7:Za7'J[^`lY]=bej^V@V%_SjF4a2l?EbKJ/UcHstd
+e'umtf@S[.g=tE=h;7)JiSrnXjQ5OdkNM0plKdg'mI'E2n*pAIrpg-^o^r.Us7ZKerV6Egs8)Th
+rqu]mo)=4?dJn^~>
+JcC<$JcFO*o`"jgrqu]krqZWjrV.?+p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5]+o49.P94RG6$
+4T%8_K7SQ%I=$9bGBJ"KEH#f5Chmd!B4b^c@U`_P?X6B#r_EAes%r\jr_EJhpeV#h;H!Kknim%9
+!']^3pcS(AqbR5e!)NMhs%`\k:J^^[qbQo\!)NShoKWC@qbZfYs%r_\s$?WN!($TLs$I,Z5X\1>
+9heAX:J^pcs&&eorDNbs<E9$!s&]5&r`T8)!*fG-s'5V2ra5\5!+Gk9s'l%>ral+A!,)7D!blCa
+rbDROD/K8i!cN$src.sY!-A*\"Eem2GBa$a!Du\i;>jDm;>X2h;>sJg;u/TO4T%A=;uTbr<W?+t
+=8u=s=8l>"=oDG&=oDP(>Q%h+>Pqb&>6A,7>[>fUrD<,^s',M,rE08BEH6&<rGhgX"E\d.FERS)
+s)eEeGB\<1H2`-iHN8Hf<U3]U<AS]<F`qtRH$XgbI=?]sJV/T.L5(J?M2I7NNK9-^OckomQ'IZ%
+R$a;1S"#q=SXuFFT:l1Ws.]OgqkX1eoVVS`qkX4ds.]Ics.B@arLO7bS=H(<R[TZDQiWP>rfmMK
+PQ$^ROcYZcO,f3ZN/W[PMZ/G5Lkktas+UK+re(6&s+1)urdXipomQdfrdXirs+13%re#]RKnY89
+LPL\BM2I1KN/WaVO,oBbP*2#nQ'IZ%R$jD4S"-%@T:hmOU84T]VPgAlWiN5'Xfnt5ZEpmF[^N]V
+\\#Me^;%G!_SX71`Q-'@b0.uQcHaeadF6Upe^rF*g"P39h;-rGi8N\Uj5f=ak3(sml0@U$m-X6/
+n*fcGnc&(\oCV\Sp&Facp\jmeq>^<fqu6NkrUTr=s3^js~>
+JcC<$JcFR+o`"gfrqu]ks8)ckrV-EfpAX^co^i(Q)=d4bn*]T0lg!a!kN:pfj5T%Uhqd,Cg=_J[
+NpVi(Nr+n0O<K7.J:E#rH[9p\F`_\EE,KQ0CMINqAn>L^@UNPM?/OPtro*n:%,p.&hqm2FgtUQ9
+g"?/Qqpt_,rfI#<r/g`:r/gK1qiLj(s3CYhs3(Sgb0%j(aT'<\`W4!H`;IOM`;@IO_YqCBQ2ni!
+_YM%A_Yq=J?41+H?=7/WKM>3::J^pcs&&eor_rhrs&K&!s&]5&r`T8)!*fG-s'5V2rEfV6@:B.E
+!b5bOrac.CB4q3Ws(MIJrbMOM!,_[P!cN$src.hWrQG/`!6b2\s3(AbrQP>drltAbrltJgqiUf<
+q2YW>YcudZg&0P*gYCT\h>c=7hr*GOir.p:jo4EAk5sl3l2KuJlh]uCmJlVSmfN"Lo^p5kam@+E
+a8]?A=oVS(=5NuF`r3mM`:q1K_Z.ORF=_TZGBnL\I!pHnJ:W<)KS>/9Ll%"IN/`jYO-#NfPE_>t
+QC!u+R@9V7S=H/LScYOWT`1YbUAgqaV"CMZV#I.hUA^ecT`:Y`T)Y>]SGo#XRK/cTQk>[NQBd`"
+PEV/mOcb`dO,f6[repl9MZ/J4L]E50LAur-K`-Q'K)^E"JGjuqIeeEhIf=ipJH(3#K)UE&KE-`*
+L'EEhLl$tGMuJZPNK0'\OHG]hPE_>tQC+&-R[]e:SXuIHTqS3VUnsrdW2ZetXKAV.YctF>Za@0L
+\%0&\]Y(qm^VI_'_o9U7aN2KHbKS8WcdC.ge'uq!f@\d1g=tH>hV[8LiSrnYjlY^gkiq?slg*p(
+mI'uB!V#XYo)J:]o`"O`pAamcq#:*hqYU0gr;HTbrdk*ss*t~>
+JcC<$JcFR+o`"gfrqu]ks8)ckrV-EfpAX^co^i(Q)"I+an*]T0lg!a!kN:pfj5T%Uhqd,Cg=c"6
+m;;9/+bPAsIsufmH?aXVFE;G@DJj9+C1q6lARo7Z?sd8HTV/"XUAUbeU7qRZ!1s+Zpmh>SrGV[Q
+iG\@+rL3bSqj.;KrKmDIn<`j7q3:rGrKm%oqNh/HqNUrDrg*MJrKR:]q,R]*CJ@Q!:J^pcs&&eo
+r_rhrs&K&!s&]5&r`T8)!*fG-s'5V2rEfV6@:B.E!b5bOrac.CB4q3Ws(MIJrbMOM!,_[P!cN$s
+rc.\$p7)&O!1WbRoUYkrr+u@JrG;LNs+U?FrM'1arhTRjrMKRms/Gjqs/Z4&n#lVmr3-7-ZEsIq
+l'C4ls'#A(s&]>(bKKk.rQY>erQkJir6bPm!7Ukos3okhoTK6<s)]f8GB\=YH@1-iIt3*%K7nr5
+LPUeEMi<XUO,oBcP*;,qQ'Rc(R$jD4S"-">rgj1`TV2:Xs.]LfqP<b[q5""bs.]Ics.KCargs.\
+!1a%Xs-`qUrg4:aQBmf$P`q;oP*(lgO,o<]NW+k;Mi.Ljs+gZ1reCH,!/1<'s+:9%r.+`qr-nHi
+qgSNor.+fus+:6&s+CB+re:W4LkpnEMMqImD2jR:O-#KeP*;,qQ'Rf)R@9V7S=Q7DTV8'RUnjia
+Vl6SpX/rG*YHY7:Za7$I[^WfX]"G\h^V@S$_Sa@3`lQ6CbKJ,TcHjncdaQ^rf%8R-g=k<;h;7&I
+i8N\UjQ5OdkNM0plKdd&m-X6?mfDqJrpp*\!;-9`s7ZKerV6Bfs8)WirVZWmo)=4?dJn^~>
+JcC<$JcFR+o`"gfrqu]ks8)ckrV-EfpAX^co^i(Q)"I+an*]T0lg!a!kN:pfj5T%Uhqd,Cg=c?c
+s#^$=m5sl$rAu0TJq/?"I=$9bGBJ"KEH#f5Chmd!B4b^c@U`_P?X6B#:AI]c;#X8i:B+,b:]OAl
+;Wg744o%5=:%V3[:]=,h:]+&e:\RW]:\[]`:\R*S5Q!eE;"@EV:]aEY62j1N62j.K6Np"T:/4S\
+rD<Mks&/hps&B"ur`9&#s&f8's&oD,r`oJ/!+,V2!aoGFraGq=A7Y[N!bQ(Xrb2=G!,DLKs(h[P
+rGD[TE,berqbd5gpeh#gr_`Mgr_`\nq,?rJ!'L6DrB1*Nqc!Jn!``9%r)`kur)`eur)ru#s&f>*
+r`T8)qHNo's',M,qca)+?-cCH;#!id>5_V(=92KCrc%jV!ci@'piHR[G'<k/"*f*:GlDsiH@1+t
+<q98jF=_TZGBnL\I!pHnJ:W<)KS>/9Ll%"IN/`jYO-#NfPE_>tQC!u+R@9V7S=H/LScYOWT`1Yb
+UAgqaV"CMZV#I.hUA^ecT`:Y`T)Y>]SGo#XRK/cTQk>[NQBd`"PEV/mOcb`dO,f6[repl9MZ/J4
+L]E50LAur-K`-Q'K)^E"JGjuqIeeEhIf=ipJH(3#K)UE&KE-`*L'EEhLl$tGMuJZPNK0'\OHG]h
+PE_>tQC+&-R[]e:SXuIHTqS3VUnsrdW2ZetXKAV.YctF>Za@0L\%0&\]Y(qm^VI_'_o9U7aN2KH
+bKS8WcdC.ge'uq!f@\d1g=tH>hV[8LiSrnYjlY^gkiq?slg*p(mI'uB!V#XYo)J:]o`"O`pAamc
+q#:*hqYU0gr;HTbrdk*ss*t~>
+JcC<$JcFR+o`"gfrqu]ks8)ckrqQNf!;?Eb,kU^!o'u5<n*]T0m-Es$ki_*ijQ#7Xi83;FgY1<3
+f$r0sdEhfPmZ%4+q2b-/,DCc%J:DupH?j^YF`_YDE,KN/CM@HpAS#@\@:3GK?/XVti;V^8ir@sE
+i8<DJh;$c=g"G$RfDa@tO8Y+=O8k7=O8P+9Oo1==O8k==O8b4BOjDDRcMu/hbl>inb/qcHaiMQD
+a2Z-u`ULhG_t_1I_Z7RQ_siuj_u@OK_=b\;_>dgA?2e.5A55lq:]4,i;?'Pn;u]hs<W6&!=8uD%
+=oVY*>Q.n-?2n71?NOVD@K'a9@fU'=AcH?BBDlKFBkhD^CB/2HaSX*Zb5TT`bQ,ibb5]T^aoKW`
+bl>rebQ,o`bl>rfcMN_%Oo(7:Yl38TgA]k%h>c=9hr*GOioB(uj8e<@k5OQCkQ'lGlMp2Im.fuJ
+mf2_WnF?/?aR@7=aS<gS=oVV'<rc:Xs6[i)`V.7F_u7G%F*)PJGBeCZH[U<kJ:N3'K7nu6LP^kF
+N/WaVO-#KeP*;,qQ'Rc(R$jEBRfT%Mrgs.^s.K=as.]Lfm%jTTs.]Fbs.KCarLO(]S=KSJs-`qU
+rg3qWQBmf$Pa%C2Oo^],rf7;ENK&mUMi3JlM#rKgL]3#0KnP-XKE$Q'Jc(&sJ,=]lIJ\KlJ,Fis
+JH1<#K*$^[L&Qf-LPYqd"cA4sN/`ksO(j]<P*2#nQ'Rc(R$jD4S"-%@T:hmOU84T]VPgAlWiE/&
+Xfnt5Z*UdD[^NZU\[oDc]tV7s_8=+.`Q#s>ai_fNc-FY^dF-Lne^i@(f\5'6gtgiEi8ESRj5]4^
+k2tjjl07L!m-O--rpL*]naZ2@oCMVQp&F^cp\agdq>^<gqu-HjrUTr=s3gpt~>
+JcC<$JcFR+o`"gfrqu]ks8)ckrqQNf!;?Eb,kU^!o'u5<n*]T0m-Es$ki_*ijQ#7Xi83;FgY1<3
+f$r0sdEhN(n87`6rG<d5K7\W'I=-?dGB\1OEcH&9D/=!%BP1mf@q&kS?X@$3TV/"XUAUbeU7qRZ
+!2'4\pRD5SeSk5#r0mYQp6PlIQ^3s)QhHaDQ2[*KQgf"kQ2m3HPl-gGQMm*FPl$aG<rH#$=ADUe
+:]4,i;?'Pn;u]hs<W6&!=8uD%=oVY*>Q.n-?2n71?NOVD@K'a9@fU'=AcH?BBDlKFBkhD^CB/2H
+RJ**?S+rNGSbm7%D>S/GL&IeEUAL_cV#R:iVZ3RoVuiruWr&h(XKAV-Y-5%3Y-"i#Y5GL%YlCs0
+Z^-pRQgC$rQ2Okc=T2A'<m/\_bl5lcci;>lci2;kdJ_MmdJ_MMPOt"fF*)PJGBeCZH[U<kJ:N3'
+K7nu6LP^kFN/WaVO-#KeP*;,qQ'Rc(R$jEBRfT%Mrgs.^s.K=as.]Lfm%jTTs.]Fbs.KCarLO(]
+S=KSJs-`qUrg3qWQBmf$Pa%C2Oo^],rf7;ENK&mUMi3JlM#rKgL]3#0KnP-XKE$Q'Jc(&sJ,=]l
+IJ\KlJ,FisJH1<#K*$^[L&Qf-LPYqd"cA4sN/`ksO(j]<P*2#nQ'Rc(R$jD4S"-%@T:hmOU84T]
+VPgAlWiE/&Xfnt5Z*UdD[^NZU\[oDc]tV7s_8=+.`Q#s>ai_fNc-FY^dF-Lne^i@(f\5'6gtgiE
+i8ESRj5]4^k2tjjl07L!m-O--rpL*]naZ2@oCMVQp&F^cp\agdq>^<gqu-HjrUTr=s3gpt~>
+JcC<$JcFR+o`"gfrqu]ks8)ckrqQNf!;?Eb,kU^!o'u5<n*]T0m-Es$ki_*ijQ#7Xi83;FgY1<3
+f$r0sdEhYN!'KX1niZk4,DCc%J:DupH?j^YF`_YDE,KN/CM@HpAS#@\@:3GK>u"*g:AI]c;#*o^
+:]XEkl9522ofi::s$$<CrB1!PoM,B^qbI/er)!>fp.kK\qG.#cr]g?HpHSRPnk]*Ys%`VkpJ:fU
+#XCU=5XS:A:J^pcs&&eor_rhrs&K&!s&]5&r`T8)!*fG-s'>Y2ra,_7@:B.Es'l%>ral+A!,)7D
+!blCarbDLMr)!Gjqbd,dnko6[!)`YlqGZuIs#g-K!*&nqs&B"us&T,#qc<Vrr`K2'!E`M$=Sl8$
+>5MP(>lIt,>5DG'?-?+D;#F,f=oVV'<rc;#E;sqXErL._F*)MFrH/!]s*"]mH$FRZH$Xi:I,@ur
+<@W'3F`qtRH$XgcI=?]sJV/T.L5(J?M2I7NNK0']OcklkPa.N"Q^F/.Rf8cWS=TYNs.B=arLs7c
+rhJhUrM0Cer1X.`s.B7]!hGjOrgWqV!1EhR#FCaBQ'ISuPQ$^GOc]R'#EFe'N/W[QMZ/G6Lkgcb
+L'!'^K`-Q'K)^E"JGjupIf"QjIf4coJH(0#K)L<'KS>-ZL&m'creUf9Mi<USNrG)ROHG]hPE_>u
+Q^F/.R[]e:SXuIHTqS3VUnsrdW2ZesXKAV.YctC=Za@0L\%0&\]=bhk^VI\&_o0O6a2lBFbKS5V
+cd:(fe'uq!f@S[/g=tE=hV[8LiSrnXjQ5OdkNM0plKdg'mI'uB#Oq9Ro()DDo_nI_p&Ojbq#C0i
+qYU0gr;?Nardk*ts*t~>
+JcC<$JcFR+o`"jgrVZTjs8)ckrqJ5Bp@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ij5].Wi83;Fg=k32
+f$r0rd*L"]bK7iF`Uf)fNrG+.O<TF5K7\W'I=-?dGBS(MEcH#8D/3p$BP1mf@q&kS?X@$uiVqd7
+iW%p;i<eH"hVR)DgY1?5pt#MsrK-r<oo9$5qN1Q9o8s!5s,[9.ci)/hc2PohbK@uLrQ+uYs2P&W
+ji$u4!L8uMQh6U@_th.B_X,,:_>qLQ;#aDm;Z0Po<<#tt<rZ5$=T)D&=o_e+>lS+0?N+:5?t!LC
+@fKp=A7bbZr5S]Up;m0Rs2t2]!6Y5]qo\r^!R/adbl>l^bl5iecM3M"OnQ!Zg&B_)g]-()h>c=8
+hr*JPioC%!#3G"0kNM-orojCHrTaCJr9X1Fs6fpU!qGp)mE"k?nAt@Es&oA(s&],!huE#^rPeNL
+pr!*J.s#fTG'A1VH@($fIXcm!JqJ`1L51SAMMmFPNK9-^OcklkPa.N"Q^F/.Rf8cXS=Q5MScYOW
+T_tM^UAUe]V#-qcUAU_bT`1S_T)YA]SGo#XRK/cTQi`V?QN!-MP`u*0#Eb+0O,o<]NW+kAMi*CK
+M26tCrItB-KS9;Vs+:9%qgeWpnp^Oeqge]ts+:6&s+CB+re>NMLkpnEMMmCON/`jYO-#KeP*;,q
+Q'Rc(R$jD4S"6.BT:hmOUSO]^VPgAlWiE/&Xfen4Z*UdD[C3QS\[oDc]tV7s_8=+.`Q#s>ai_fN
+c-FV]dF$FmeCE1&f\,!5gtgfChr*JQj5]4^k2tjjl07L!rp0[Qmf)YUnF?MK!qZ'Vrq6<bs7cKe
+s7uZjqtp?irVc<dJcF0uJ,~>
+JcC<$JcFR+o`"jgrVZTjs8)ckrqJ5Bp@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ij5].Wi83;Fg=k32
+f$r0rd*L"]bK7iF`VXQDD=VTDD'F^gK7\W'I=-?dGBS(MEcH#8D/3p$BP1mf@q&kS?X@$5UAgkc
+UAUbjU7n6QT:VVHSGI1(E8kg9E;=GNDZ#q)R@'AuQh?[EQ2R$KQg\qkQ2m3HPl?sGQN!0FPjjt<
+QMs_\;?'Pm;u]hs<W6&!<rcA$=oVY*>Q.n-?2n71?NOVD@K'a9@f^+OrgEPKp6kWCnsfWK!1WnV
+pRV>Uph]nGr.b*&!2K@ar1j:f!2]XkrhfjsWN)uqX8f7%XfhW+!3Z='pTFCsrNH=-Zhp'bQg^7!
+Q2b"e=T;J#<WgOhbfft/s3:Shqp5;h!R]9ndKItEd*^8>dbU,[Ot1TqF`qtRH$XgbI=?ZrJV&N-
+KnbA=M2I4MN/`mZOHG]hPE_>tQC!u+R@=,E!h>gPrgj1`TV24VrM'4bpn[e^rM'4`s.K@`rgs.\
+s.'(Xs-`qUrg3bRQBqN8!L/fIOp@,2OH5H_NfF$s#E+IsM2@%EL])r/KnP-XKE$Q'JbsurJ+A'e
+J,=crJcC?$KE$T)L&QgKLPUbCM2I4LN/WaVO,oBbP*2#nQ'IZ%R$a;1S"#t?StD[LTqeEZV5C/h
+WN)u"Xf\b1Yd(O@['d?O\@K2_]Y2%o^qmn*`5Ta:aN;TJbg"GYd*^7ieC<%#f@\d1gYCW@hV[8M
+ioB([jlY^gkiq?sli-5OmI'uB!V#XYncJFTo`"O`pAamcq#C0hqYU0gr;HTbrdk*ts*t~>
+JcC<$JcFR+o`"jgrVZTjs8)ckrqJ5Bp@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ij5].Wi83;Fg=k32
+f$r0rd*L"]bK7iF`U#\W4T7DcL4t83J:DupH?j^XFEDPCDf0E-CM@HpAS#@\@:3GK>u1Dor_NJf
+!`)Whr(lu^cT_=k!Ba-T:%D$Z:]4&g:]+&h:\.?Y:]4&e:]ETX4odhH55meC55e=P:\IWK:]+&h
+;?'Pm;u]hs<W6&!<rcA$=oVY*>Q.n-?2n71?NOVD@K'a9@f^+Oohb?Zp/:BWr)!Djs&/Vj!*&SP
+rC?]Ts&B"ss&8tur`9&#qH!Jps&]8(pK7;qr`]5(rET>+!*]5'!*mQAr)!Drs&f;&r)Wf9s)S-\
+"a"g,FE;O&F9$I^G5c^aGQN2<HiAEL<qKBBF*)PJGBeCZH[L6jIt3*%K7nr5LPUeEMi<USO,oBb
+P*2#nQ'IZ%R$a;1rgNtZSXobO!hZ-Yr1X(`r1j%_qkO+ar1X.`rh'1]s.01[rgWqV!1EhR!gf4=
+rfmMKPQ$^MOcYZcO,f6[req)?MMd7ILkpibL'!'^K`-Q'K)^E!JGjugIf4cnJH(3#K)UE&KE-`*
+L3/3,Ll$tGMi3OQNK0'\OHG]hPE_>tQC!u+R@9V7SXuFFTV8'SUnjiaVl6SpWiW>)Y->.8Za7$H
+[^WcW]">Vg^;%J"_Sa=2`lH0Bb0/#RcHaeadF6Upe^rF*g"P39h;-rFi8N\Uj5f=ak3(sml0@U6
+liHMArpKmWnc&(\oCV\Sp&Facp\jmeq>U6fqu-HkrUTr=s3gpt~>
+JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nh'D$n*f]3m-Es$l0%3kjQ#:Zi8<DIgY1?4
+f@AC"dEp1`bK@rJ`l5j4^q[Rqr/Cc<NK*ptrK$H0,_q,-K7SQ%I=-?dGBS(LEcH#8D/3m#BP1me
+@q&kS?X@$uj5U$qs5F";s5=:Bhqm5GgtUQ:f_O.mOSk1;NrP1>OT(C@P5:=<O8tF=OT3Z-chu)f
+blu>7bK@rKr5eoY"NJL%`PprWr58N!rKdJMpQk]orkeTLrPJQOrPIp;r5/3Gn&56t!*fD,!+#N@
+rl+fRrl+fTrQ"cU!6P5]r5nu]s3(Gbs3(Gbr5niY"O"s2bKTq.prrc_rK$f:!3u."rn7A,r7q5+
+rS@Y6i8NYoj8\3Ek3(pkl0A01s6BXMq<[nDs6^$YnF5u?r5n?IouZgHouI)7s&](us&J"Ws2F<D
+rPeNLqSW<L,B@mJFa&%SH?spdI=HctJqJ]/L5(J?M2I4MNK0'\OHG]iPl?pOQC!u+R@=,Es-s([
+rLX%]s.K7_qkEq^qP*h[s.K@`rLX%[!1a"W!h,OFrg3bRQBqN8#F(F9P*1riOT(:ANfF$ss,-l7
+re^Z2!/LQ.s+UK+rIb-%s+1&trI=EfrI=]ps+13%re(6(s+UK-s+^T1reY`SMi<USNK0'\OHG]h
+PE_>tQC!u+R@9V8SXuFFTV8*TUnjiaVl6SpWiW>)Y->.8ZEppG[^WcW]">Vg^;%J"_Sa=2`Q-'@
+b0.uQcHab`dF-Lne^i@)g"P07gtgiEi8ESRj5]4_k3(sll07L!m-O--rpL-^naZ2@oCMVHrq6<b
+s7cKes7uZjqtpBjr;H3cJcF4!J,~>
+JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nh9P&n*f]3m-Es$l0%3kjQ#:Zi8<DIgY1?4
+f@AC"dEp1`bK@rJ`l5j4^q[RqDJoGj!,hRKpMU"JrbhaQ,_q,-K7SQ%I=-?dGBS(LEcH#8D/3m#
+BP1me@q&kS?X@$5US@^\s.]Fd#GRobTV%gHSbS`ODtn;JDZFbSDuFYODu+GMDuX_RRf/ZSR.lsG
+R-^1/QMPXpEVc"$Q2HmHQ2d0LQN3?NQ26a6Q1gO@QiEBGQiD70>Q%e,?2U)`RJ<0GR/i]TRJ**?
+RfJuXS,AfNSH,8TC]K7cLAZc#UA^hiUnsobVZ!CoW2ZcmX8]1%Xfel,Y5PKsY55@$YQ;#8p6P`F
+mZujts&f;&qc<_s!mJj2rQP8d!6tMgrQkMjs3^bkrmC_ngQVAp,B@mJFa&%SH?spdI=HctJqJ]/
+L5(J?M2I4MNK0'\OHG]iPl?pOQC!u+R@=,Es-s([rLX%]s.K7_qkEq^qP*h[s.K@`rLX%[!1a"W
+!h,OFrg3bRQBqN8#F(F9P*1riOT(:ANfF$ss,-l7re^Z2!/LQ.s+UK+rIb-%s+1&trI=EfrI=]p
+s+13%re(6(s+UK-s+^T1reY`SMi<USNK0'\OHG]hPE_>tQC!u+R@9V8SXuFFTV8*TUnjiaVl6Sp
+WiW>)Y->.8ZEppG[^WcW]">Vg^;%J"_Sa=2`Q-'@b0.uQcHab`dF-Lne^i@)g"P07gtgiEi8ESR
+j5]4_k3(sll07L!m-O--rpL-^naZ2@oCMVHrq6<bs7cKes7uZjqtpBjr;H3cJcF4!J,~>
+JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nh'D$n*f]3m-Es$l0%3kjQ#:Zi8<DIgY1?4
+f@AC"dEp1`bK@rJ`l5j4^q[Rqr&Xm@pcJ%/s#VH\L4k21J:;ooH?j^XFE;JBDf0E-C2%?oARo:[
+@:3GK>u+8o:B+,g:'+3f;#=&`:ujh=5O1K6:JUj_o1o6[!)EMhqG?]WqbR5er_NJVr'(6H5<o!.
+r_W;ap/'sKp/(3Ts$6WhrEK>.q,-WXqG@5jr_`GgmSWs[rDE8erAsd:njiXXs&J_mqcESqs&o>'
+rE9/(r*'5+>?h#1s'#J,qHEr)_GU>8s&](us&B,>EH:hqs)e6_rc\6as*+QiHN&9kI,7or<?lO+
+FEMeOG^=[_I=6TqJ:`E+KSG5:M2@+JN/`jYO-#KePEc'3"dYLBR$jEBS,\uYSc,/[TDtS]U&1S\
+U\^_]U&UebTDbA]SH,2YRf]%HRJrQTQ^3s:Pm<P;PEM)kOc]R'!KN0=N;ne9MZ/J4L]E50LAuu-
+K`-Q'K)^E!JGjuhIf4cnJH(3#K)UE&K`?c+LB!#/M#N6QMMmFPNK&sZO-#KeP*;,qQ'Rc(R$jD4
+S=Q7CT:hmPUSO]^VPgAlWiE/&Xfen4Z*L^C[C3QS\[oDc]tV7s_8=+.`Pom=aND]Lc-FV\dF$Ck
+eCE.%f\,!4gYCWAhr*GOioB([k2tjjkiq?slg4!*mf)Y\nF?&>o(2JFo`"O`pAamcq#C0hqYU0h
+r;?Nardk*us*t~>
+JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb47r.8o'u5=n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEg+_bK@oH`PfX0^V7@m\[])UZa-fqNr4t-O=#g>L4k21J:;onH?aXWFE;GADf0B,C2%?n
+ARo:[@:3GK?012/j8@m8iWA)shu;I9h;$c=g=cATooT39r/gr>!K`BAOT(C:P5LIBOSY+=OT*W,
+ci22pcd'h\c-4ARrlP)ZrPnuZ`PqbnrPe3Cs24`"q3UuEqnr<J!5\TMrkn]OmD8_;p;?@;qjmk[
+>[76Grl+fRrl+fTrQ"WQr5eu^ana*WanNsTbP03\OSb+=OS5sUYlEDWg\oq)h>Z7>hr*JQioB([
+jlYail29iGl2U#KlhBc@m/ZSRmfW(Lou[3Sr5n?IprW3MoZ-u5r)Wesr`%hU!lW'slc/nBpVcsH
+s2$C/F*)PJGBeCZH[L6jIt3*%K7nr5LPUeDMi<USNfT6`P*2#nQ'IZ$Q^F/.R[X5F!h>gPrLX%]
+rh/GJrh07_r1<qZs.'(Xs-itUrg3bRQBqN8#F(F9P*1riOT(:BNfB%tMunopMZ/G6LkgcbLAur-
+K`-Q&K)^E!JGaojIf+]mJH(3#K)L<'KS>-ZL(B&qLl$tGMi3OQNK0'\OHKO*A!<.BQ'Rf)R@9V7
+S=Q7CT:hmPUSO]^Vl-JmWiN5'Xfen4Z*L^C[C3QS\[oDc]tV7r_8=(-`Poj<aN;WKbg"GZd*^:j
+eCE.%f@\g2gYCW@hVd>NioB([jlY^gkiq?sli-5TmI'H3nF5uIncJFTo`"O`pAamcq#:*hqYU0g
+r;HTardk+!s*t~>
+JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb3V;q6o'u5=n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEg+_bK@oH`PfX0^V7@m\[])UZa-h5DZ=SJDYe2rM2-h=K7SQ%I=$9bGBS(LEH,o7Chmd"
+BP(gd@q&kS?X@$6Undg]rhKIe"JMK]T:c+S!1j"Wol'SD!,qaRs)IgQrGVOOr,2S)rL3\Qrg3_Q
+R/NBKR-L%0QM#:oEVl(!PlR'JQ2d0LQi36HPjan2QLgIAR/2%,>lC&fR/i]RRJ<0CRJ**;S,8`N
+SH,8VD#/qaLAZc%UAUbgUnsobrhoaori5jrri?.&Y5,3oY5GL$YQ;#8i0NDgs&],!r`/qsrlb>c
+s31Vjc-?75rQk8crm:_ormBG`q3!@NF*)PJGBeCZH[L6jIt3*%K7nr5LPUeDMi<USNfT6`P*2#n
+Q'IZ$Q^F/.R[X5F!h>gPrLX%]rh/GJrh07_r1<qZs.'(Xs-itUrg3bRQBqN8#F(F9P*1riOT(:B
+NfB%tMunopMZ/G6LkgcbLAur-K`-Q&K)^E!JGaojIf+]mJH(3#K)L<'KS>-ZL(B&qLl$tGMi3OQ
+NK0'\OHKO*A!<.BQ'Rf)R@9V7S=Q7CT:hmPUSO]^Vl-JmWiN5'Xfen4Z*L^C[C3QS\[oDc]tV7r
+_8=(-`Poj<aN;WKbg"GZd*^:jeCE.%f@\g2gYCW@hVd>NioB([jlY^gkiq?sli-5TmI'H3nF5uI
+ncJFTo`"O`pAamcq#:*hqYU0gr;HTardk+!s*t~>
+JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb3V;q6o'u5=n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEg+_bK@oH`PfX0^V7@m\[])UZa-h54T@M44=#c=L4k21J:;onH?aXWFE;GADf0B,C2%?n
+ARo:[@:3GK>u4An:]*uc:\R]H55%524p4\X:/+IY:&n)c:A[ia;#X8\:AI]b55meC5lO"H55nCQ
+:\@QJ:\IWR;#ir[62t3d;=IEU;>X8W;?'Jm;>jDe;u/QT47>]><;onk<rQ2#<rZ7u=Su;'=BSf+
+>5VV(>5qh*>lS%.=o_e*>5haC;?'_q<rQ+u<!RD`F)uACF)q5#!-J3_s)nBbrHA?gH$Xf7HN8BK
+<qTHFEcZ>FG'A1VH@($fIXcm!JqJ`1L51SAM2R=ONK0'\OcklkPa.N"QC!u+R@9TDRf]+NSc,/[
+TDkMHU&L_aTDY;\Sc>5ZS,\rWRJrQTQ^3s:Pm<P;PEM)kOc]R'!fi8"repo:MMhCi!f2VereCH,
+!/1<'rdt0$qgeTop3uphqge]ts+:3%!ec8]re:r=LkpnEMMmCON/`jYO-#M'P%0]?Q'IZ&R$jD4
+S"-%@StD[LU8+N[V5L5iWN*##Xf\b1Yd(L?['d?O\@K2_]Y2%o^VRe(`5T^8aN2KHbKS5Vcd:(f
+e'uq!f@S[/g=tE=h;7)JiSrnXjQ5OdkNM0plKeH9#4:jIn*oi:rpg-^o^r.Us7ZKerV6Bfs8)Wi
+rVZWmnc"+>eGk%~>
+JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb5kO[=o'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;FgY1<3
+f$r0sdEg+^bK@oH`PfX0^V7@m\[])UZa$a;XfJJ#VkijE.#Nk:L4k21J:;onH?aXVFE;G@Df0B,
+C1q9mARo:[@:*AJk2tdejQ$$p$K0h!hVR)DgY1?5r7Ct2q2kK9rf[&=p6,66rfI#>!7Cems3C\j
+rQbVlc-=JUrQ>/^s2b)X#0+X$`5KX6rl4uWr58TSou-cps-EAFrKdE"oYUUFrPIs<r5/6Hm_nml
+s.0/-rl+fRrl+cSrl5#[rl=lVqT8c[s2k;`qT8HRr6+iYr/^o>rj(ss"5;Mah"]_*hZ;Zoro3t<
+#j(43kih9rlKeB5s6KCFq!A@Tn*fc9o(C,HqoJZVo#URIpW3!I!*B)!r`/qsr_qeUs2=oUqSr!C
+p;HgF,]e'LG'A.UH?sseI=HctJqJ]/L5(J>M2I4MN/`mZOHG]hPEc'3!LB)OQiWVDrgWqXs.0(Z
+rh'.^nY,oSrLa"Zs.0.ZrgWqVs-`kRs-NbOrfm_QPEV/mOcbb)O8k4?NW+n:MZAY6M>rA3L])r/
+KnP-XKDpK&JbjomJ,aunJ,4]qJcC?#KE$T)L&Qi,LO+c5M2I1KN/WaVNfT6_OcklkPa.N"Q^F/.
+R[]e:SXuFGTqS3UUnjlcVl6SpX/rG*Y->.8ZEppG[^WcW]">Vf^;%G!_SX40`Q$!?ai_fNc-FY^
+dF$FmeCE1&f\,!5gtgfChr*GPj5]4^k2tjjl07Kulg4!*mf)Y[nF?&>o(2JFrUp3a!;HEds7uZj
+qtpBjr;H3cJcF7"J,~>
+JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb5kO[=o'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;FgY1<3
+f$r0sdEg+^bK@oH`PfX0^V7@m\[])UZa$a;XfJJ#Vkj9.qel:J-]3b9L4k21J:;onH?aXVFE;G@
+Df0B,C1q9mARo:[@:*AJV59u`U\geaU]7%kTqJ'NTDkD^Sc##XE;=GLE;jkPE;4GKE;"5MS,JfR
+RIZa2Qh?[;EqaSOQM6[EQN!6LQMm*JPjan4QLU=@R.b_(R.QgAQiNQRR/36ERdHUBSG8WTT)3?s
+L\HQ%UACYbV#R=lVuEXpW;rspX8]3pXnT!tYPPI(Z*`DSjcogIr)Wesr`&kqs2tDdqp#)bs3C\j
+rm1Vk"4,??ci2;kd/hS?oons0qigT6,]e'LG'A.UH?sseI=HctJqJ]/L5(J>M2I4MN/`mZOHG]h
+PEc'3!LB)OQiWVDrgWqXs.0(Zrh'.^nY,oSrLa"Zs.0.ZrgWqVs-`kRs-NbOrfm_QPEV/mOcbb)
+O8k4?NW+n:MZAY6M>rA3L])r/KnP-XKDpK&JbjomJ,aunJ,4]qJcC?#KE$T)L&Qi,LO+c5M2I1K
+N/WaVNfT6_OcklkPa.N"Q^F/.R[]e:SXuFGTqS3UUnjlcVl6SpX/rG*Y->.8ZEppG[^WcW]">Vf
+^;%G!_SX40`Q$!?ai_fNc-FY^dF$FmeCE1&f\,!5gtgfChr*GPj5]4^k2tjjl07Kulg4!*mf)Y[
+nF?&>o(2JFrUp3a!;HEds7uZjqtpBjr;H3cJcF7"J,~>
+JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb5kO[=o'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;FgY1<3
+f$r0sdEg+^bK@oH`PfX0^V7@m\[])UZa$a;XfJJ#VkiiF-AmY8L4k21J:;onH?aXVFE;G@Df0B,
+C1q9mARo:[@:*AJ;,L.dq+po`r(m)as$$HGq`Y!Er'(*EpceC9nim(:s%i\kqbHu`pJ1`aqb[5e
+n4rmWqEFmCpd"gCs%rAapJC'Lpe^BU!(6NJ"$od^;Z9P_:]OAl;#4&g;Ys>k;#aAm;"@Ha:f7-g
+pJ^rMr^luXoLJj[r`0##r)Wbtr`9&#r)ir$!*]>(!*];)s'#D)!*]A+!aJr6p0%H$_bgD8r)Wes
+r`&kq"EJR(Ec_5#s)\3^#'G$0F`hkNrce<drd"WmH@#6bnl>Hcoi38YFED\MGBnL\I!pEmJ:N6(
+K7nu6LPUeEMi<USO,oBbP*2#nrfmMMQi<?QR@=,Es.'+[r1<n[rLi\SrLj+]r1<qZrg`tWs-itU
+rg<_Ps-EYL#F(F9P*1riOT(=@NW>(<N;ne9MZ/J4L]E5/L'!'^K`-Q&K)^DuJGF]pIeeKiJH(3#
+K)L?%KE-`*LB!$TLl$tGMMmFPNK0$[O-#KeP*;,qQ'Rc(R$jD4S"-%@StMdNU8+N[VPg>jWN*##
+Xf\b1Yd(L?['d?O\@K2_]Y(tn^VRe(_o9U7aN2KGbKS5Vcd:(ee'umtf@S[.g=tE=h;7&Ii8WeW
+jQ5OdkNM0plK[^%m-X6?mg&@Pnac8BoCW"Ss7QHer:p<frqcNhrqu]mo)=4?eGk%~>
+JcC<$JcFU,o`"jgrqu]ks8)ckrV0+]p@e1Po^h\Fo'u5<n*]T0lg!a!kiV$hj5]+Vhqm2Eg=b-1
+e^W'qd*Bq\bK7iF`P]R.^V.:k\[T#SZa$a;XK&7tVPKu\T:VRBRJDpkMi!7EKnFu-Isl]kH?aXV
+FE;G@DJj9+C1q6lARo7Z@:*AIkN:q+jT4H&q;MD4rndn9h;$c=f_sFmOnOq<OnFn0OT:LAOU'=^
+dEp7dd*Vd<rltYkbfn8RrQ5,^rlG#X!65#Ws2P)Z!64uV!6"iTpVd)uq3L`@!1*T$otp[FrPIs<
+r5/6Hm_ndi!6"iTrl"`Rqo8KQqT/'Gp<*<VpWWVt!g'drrNcL0n$2oI!8RD+s5!e7iVha=jQ5Oe
+kl0fHlM^&KlMg,Cm.frPmdKZ8oCV_TaoBHSanNmLan3[La8K'<<W5tp;r[iU`;[aP`p^n@`;@Fu
+EccDGGB\:XH@('gIXcm!JqJ`1L51SAM2I4MNK0'\OHG]hPEc'3!LB)OQi`\ERf8fVSH#/WT)G;O
+T`(MZT)YA\SGerWRfAfTR/`KQQMm'MP`q=1Op@,2OH5H_NfF$ss,-l7re^Z2s+gT.s+UK+rIb-%
+rdjorn:1:bs+13%rIb-'!/:E,s+^T1reUZ5MuJZ[NK0'\OHGZgP*;,qQ'Rc(R$jD4S"6.BT:hmO
+U8+N\VPg>jWN*##Xf\e2Yd(L?['d?O\@K/^]Y(tn^VI_'_o9U7a2lBFbKS5VcHstddaZdsf%8R-
+g=k<;h;7&Ii8N\Uj5f=ak3(sml0@U$m-X6/n*fc8nc&(\oCV\Sp&Facp\jmeq>U6fqu-HkrUTr=
+s4%(!~>
+JcC<$JcFU,o`"jgrqu]ks8)ckrV0+]p@e1Po^h\Fo'u5<n*]T0lg!a!kiV$hj5]+Vhqm2Eg=b-1
+e^W'qd*Bq\bK7iF`P]R.^V.:k\[T#SZa$a;XK&7tVPKu\T:VRBRJC\HMi!7EKnFu-Isl]kH?aXV
+FE;G@DJj9+C1q6lARo7Z@:*AIVPU-gV#R4gUA^keUApngTV%kUScG>\SFUXmE<'tNEVj_JDuQ7(
+RerNPR/`TKR/!$JR/`NPR/E<FQN)"$EVa_REVc!tQ2R$KQi366Q2$[9Qi3<EGP%<qR/36ERdHUB
+SG8WTT)EKrL\HQ'UA:PfUnsobVl0Nms/Pssr2fXps0)7$!3c7'"L58<[$^iZig08&qj.#BrDrnt
+r`&bn!6bAd!6kDdrltMir6>AicHc11o98a.rKHf8-$"*LFa&%SH?spdI=?ZrJV&N-KnbA=M2@+J
+N/`jYO-#KeP*;.0Pl[2;rg3bTR[X5Fs.'+[qk!bYnY#iQqO[_Xrg`qVs-itUrg<_P!1*SK!gJn4
+rfRMKOH>NaNfK+uN;ne9MZ/J4M#W80LAuu-K`-Q'K)U>tJFJ'bJH(3#K)L?%KE-`*LB!#/M#N53
+MMqImG`@`EO-#KdP*2#nQ'IZ%R$a;1S"#t?StD[LTq\<XV5C/gW2ZetXKAV.YctC<Za@-K\%&uZ
+]=bej^V@S$_Sa@3`lH0Bb0/#RcHaeadF-Ooe^i@)g"P07h;-rFi8ESRj5]4^k2tjjl07L!m-O--
+mdKW6nF?MK!qZ'Vrq6<bs7cKes7uZjqtp?irVc<dJcF7"J,~>
+JcC<$JcFU,o`"jgrqu]ks8)ckrV0+]p@e1Po^h\Fo'u5<n*]T0lg!a!kiV$hj5]+Vhqm2Eg=b-1
+e^W'qd*Bq\bK7iF`P]R.^V.:k\[T#SZa$a;XK&7tVPKu\T:VRBRJArlMi!7EKnFu-Isl]kH?aXV
+FE;G@DJj9+C1q6lARo7Z@:*AI;Gg<j;#3uc:Adoa;#WZO5Q<qB56*n?5P@;;4oS:X:B4/^:\[]b
+:]=2e:]F2h:\@K^:]EWS4o[_F5Pm\I5>Y2J:\diN:\[cS;>!<U;ZBVo;#=,^;#=)i;#=,c;".?[
+;YO,g3r;PG8cM?U8,cNe<WH5#<r?%u<rZ8#=T2J$>5q_,>$G51>5_V">5qb%>5qe->Z:W"!`;in
+b#/+<r`/qsqc!K7!-/!Y!-A$Z!-S9arce<dqg.j7nl>Neoi3;YFEDYLGBeF[H[U<kIt3*%K7nr5
+LPUeDMMmFQNfT6_OcklkPl?pKQC%T<!h#LGrgWqXs.0%YrL`VQrL`qXs.0.ZrL<hUs-`kRs-E_O
+rKRGKPEZ!/#Eb+0O,o<]NW+n:MZAY6M>rD3L]3&.L&Zi)KE$Q&JbjodJ,4]qJcC?#KE$T)L&Qi,
+LB*/0M#iKlreu)]NfT6_OcbfiPE_>tQC!u+R@9V7SXuFFTV8'RUSO``Vl-JmWiN5'Xfnt5Z*L^C
+[C3QS\[f>b]Y;.q^r!t+`Poj;aN;TJbg"GYd*^7heC<%"f@\d1g=tH>hV[8LiSrnXjQ5OdkNM0p
+lKdg'mI'E2n*oi:rpg-^o^r.Us7ZKerV6EgrqcNhrVZWmo)=4?eGk%~>
+JcC<$JcFX-o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no=3hn*fZ1m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bK@oH`l5j4^q[Rq]",;XZa-g=XfSP%Vkp2`Tq@pHS!fV.P`h/iNf8mQLk^V9Jq/?!
+I!U'^GBJ"JEH#f4Chm`uB4b^c@U`_P?X;jXroX7Bs5a+<ro*q:rne+?h;$f>f[n`;Ockn$Om8+u
+OoCFDda?J>d/2,gc2Z#dbQ#]daiMR$a8X*Va8a0T`VROQQg9t:_tCnD_Z7R?_>M1H_uI[L`VIIE
+T)Q\-`W*mS`V[[Oa83mFan3aRbPB?`NK0(s[/@9.ZLtI(gYCT]h>c=4hr+Im"QSS*kNMp0s6BCF
+p?_VB#O_'Lnac;Ep?Tj!aR[ICaSa*Y<rQ+u<;KPm;WRiX_u.IP`VRUG`;mpU`VRON_^9DFFEMbN
+G^4U^I!pHnJ:N6(K7nu6LPUeEMi<USNfT6_OcklkPl?pKQC%T<s-WkUrL<hWrgikVo:PfLrgj(Z
+r1!_Ts-`hQ!gf4=rg!MJ!0dAE!g/S+rf7,@NK*pr!fMqnre^Z2!/LN-s+UK+rIb-%rdjlqoRH[e
+rdk*$rIb-'s+UH,H&%33M2@+IMi<USNfK0]OHG]hPE_>tQC!u+R@9V7S=Q7CT:hmOU84T]VPg>j
+WiE,$Xf\e2Yd(O@['d?O\@K/^]Y(qm^VI_'_o0O6a2lBFbKJ/UcHjncdaQ^rf%8O,g=k<:h;-uH
+i8N\Uj5f=ak3(sml0@U6liHMArpKmWnc&+Zo)SF]o`Fj]p\agdq>^<gqu-HjrUTr=s4.."~>
+JcC<$JcFX-o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no=3hn*fZ1m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bK@oH`l5j4^q[Rq]",;XZa-g=XfSP%Vkp2`Tq@pHS!fV.P`h/iNf8mQLk^V9Jq/?!
+I!U'^GBJ"JEH#f4Chm`uB4b^c@U`_P?X9P+rh]Xjs.fOerM0Ces.KFcrh'4^s./_"l>cH8q/?8%
+qjR2G!goCDqj@8IpmCrFqNh&"p2TqL!-.b!rg!8EkEYn0n<a-AoQTqqoU,KCq3pQ;r1*VS!1s1+
+mYCRlpnJ.kV5:&eVl6PnWV`anXST'uY5YX'Y5PR#YQ_;;Za?*erg2W1oTf6<r0@:_r`/qsqG[Ak
+!mSs4rlkAd!7(Sgs3CSfrltMir6>>hP4Fh.P5UU9OsY3jFEMbNG^4U^I!pHnJ:N6(K7nu6LPUeE
+Mi<USNfT6_OcklkPl?pKQC%T<s-WkUrL<hWrgikVo:PfLrgj(Zr1!_Ts-`hQ!gf4=rg!MJ!0dAE
+!g/S+rf7,@NK*pr!fMqnre^Z2!/LN-s+UK+rIb-%rdjlqoRH[erdk*$rIb-'s+UH,H&%33M2@+I
+Mi<USNfK0]OHG]hPE_>tQC!u+R@9V7S=Q7CT:hmOU84T]VPg>jWiE,$Xf\e2Yd(O@['d?O\@K/^
+]Y(qm^VI_'_o0O6a2lBFbKJ/UcHjncdaQ^rf%8O,g=k<:h;-uHi8N\Uj5f=ak3(sml0@U6liHMA
+rpKmWnc&+Zo)SF]o`Fj]p\agdq>^<gqu-HjrUTr=s4.."~>
+JcC<$JcFX-o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no=3hn*fZ1m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bK@oH`l5j4^q[Rq]",;XZa-g=XfSP%Vkp2`Tq@pHS!fV.P`h/iNf8mQLk^V9Jq/?!
+I!U'^GBJ"JEH#f4Chm`uB4b^c@U`_P?X6Q-r_`\lqG7#aqbR/es$#m9rBBg;oKN(6r_WAcr_WJf
+peL]^!)E>coM5<Jp-&=;r]g!Mq,$6MqG@,fqbm/coL&UUoMP?Zqb[Dk;,R!_mns'^pJ_&PnOiaO
+r(-fWr`/qu!`rE'r)`hts&]5&r`SquqH<Vtr`T/&s',M.s&8\jhGO8KoMPWhr`/qsqG[Aks)J$Z
+rcA-]rcA-_rc\<cs*4Ngs*=Zjrd"QDq,R8lo2YWfp/NG[F*)PJGBeCZH[L6jIt3'$K7ei3L51SA
+MMmFPNK0'\OHG]hPEc'3!LB)OR/`QSRf/`USGo)TT(ATLT)P;\SG\lVRfAfSQi`V?QN!0LPQ6pG
+Oogc-OT(:BNfB%tMunopMZ/J4L]E5/LAuu-K`-Q'K)U>sJFn?eJGt-"K)L?%K`?c*L3\Q1Ll$tG
+MMmFPNK0$[O-#KeP*;,qQ'Rc(R$jD4S"-%@StD[LTq\?YV5C/gW2ckuXKAV.YctC=Za@-K\%&uZ
+]=bei^V@S$_Sa=2`lH0Bb0.uQcHab`dF-Lne^i@(g"P07gtgfDi8ESRj5]4^k2tjjl07L!rp0[Q
+mf)YUnF?MKs766_rUg6cp\4U\s7u]kqtp?ir;H3cJcF:#J,~>
+JcC<$JcFX-o`"gfrqu]ks8)ckrqQNf!;?EbFS,1qo'u5<n*]T0m-Es$ki_*ijQ#7Xi83;FgY1<3
+f$r3tdEg+_bK@oH`PfX0^V7@m\[])UZa-g=XfJJ#Vkp2`Tq@mFR[BG,P`h/iNf8jPLPCJ7Jq/?!
+I!U'^G'.nIEH#f4CMRWtB4b^c@U`_P?=!Qnr9"%@roF+>ro+:Di8<GKh;$c<fTH#npQ=j+l]DA"
+da?LjdJhMlchl#fc2Z#ebQ#]daiMQqa8a0T`VmaNQi<<BQ2\\o_YV1L_XPD=_YV1M`:V%H`:KT#
+`;IUJ`qmaOaR@7Cb5BHYbQ*[u[/73'ZM_!-h#-".h?)TmiVqg>j5f=bkl0iGlM0]=m/$)VmdKW7
+o(2PJpWCY3amR4Ma8T*=<;KPl;Z9PSs8Tt@`5BL2`5T^k`pC\?`$iNDF*)PJGB\=YH@1-hIXls"
+JqJ`1L5(M@M2I4MN/`jYO-#KeP*;.0Pld8<Qi<?RR@9TBS,]#WSa2mGSc5/VS,\rWRJiNQQiEBN
+Q2d'KPPpXGOcY\(Nrk?$NW+n:MZAY6M>rD3L])r/KnP-WKDpK%JbXcjJ,"QnJcC?#KE$W)L&Qf3
+LPUbCM2I1Kreq#?NfT6_OoCMZPE_>tQC!u+R@9V7S=Q7CT:hmPUSO]^VPg>kWiE,$Xfek3Yd(O@
+['d?O\@K/^]Y(qm^VI\&_o0O6a2lBFbKJ/UcHjkbdaQ^rf%8O+g"P39h;-rFi8N\Uj5f=ak3(sm
+l0@R"m-O--rpL-^naZ2@oCMVHrq6<bs7cKes7uZjqtpBjr;H3cJcF:#J,~>
+JcC<$JcFX-o`"gfrqu]ks8)ckrqQNf!;?EbFS,1qo'u5<n*]T0m-Es$ki_*ijQ#7Xi83;FgY1<3
+f$r3tdEg+_bK@oH`PfX0^V7@m\[])UZa-g=XfJJ#Vkp2`Tq@mFR[BG,P`h/iNf8jPLPCJ7Jq/?!
+I!U'^G'.nIEH#f4CMRWtB4b^c@U`_P?=!Q-r2'Fhq4mq`#,.]^St;LDmr7Z6m;W)Dqj[JOo9oKC
+rg3;Fqj78Irc@sWoPskNka(M!qNgN8oQC4YoU5B>q3h2Mk*u:=qOIYYD!-TOLAI\FV#R7rVPgAk
+WMuntrN#gsqlTe!p94@ts02X2ZaKb!qj6H2nWip9!1!O`s&AhnrDNVls3(Dcrlkbnc-=JWbfn>V
+bl5lecMc#fcMs'uPOjt:POt"cEcZ>FG'A.UH?sseI=?]sJV&N-Knb><M2@+JN/WaVO,oBbP*2#n
+rfmPNQ^@]=!h#LGr1!_VrLN8GrLNqXqj[VSs-`hQs-NbOrg!MJ!0dAE!g/S+rf7,@NK*prs,-l7
+re^Z2s+gQ-!el;\r.G!#rdjippj`'hrdk*$rIb-'s+UH,#D\+kM2@+IMuJY=NK0'\OHKO*CQk!J
+Q'Rc(R$jD4S"-%@StD[LU8+N[V5C/gWN)u!XKAY/YctC=Za@-K\%&uZ]=bei^V@S#_Sa=2`lH0B
+b0.uQcHab_dF-Lne^i@(f\,!5gtgfChr*JQj5]4^k2tjjl07Kulg4!*mf)Y\nF?&>o(2JFo`"O`
+pAamcq#C0hqYU0hr;?Nardk+"s*t~>
+JcC<$JcFX-o`"gfrqu]ks8)ckrqQNf!;?EbFS,1qo'u5<n*]T0m-Es$ki_*ijQ#7Xi83;FgY1<3
+f$r3tdEg+_bK@oH`PfX0^V7@m\[])UZa-g=XfJJ#Vkp2`Tq@mFR[BG,P`h/iNf8jPLPCJ7Jq/?!
+I!U'^G'.nIEH#f4CMRWtB4b^c@U`_P?=!P.r)*Jjr(m5cq+guSoKW:<s$-3@qEO@2s#g?Zr)!;e
+qG?u`oM53XpJ1KIoKE1;r_W>bpe^-LqG@,fr)35co0`OUr_`Jhs&&Meqbco\mnj<f;c?Xp;cH`o
+;ZJoB9)V<_86&[h<r,nq<rZ8#=T2Iu>5;=s>5h\%>5qh-?2[^q;WCXM:]OAl;#F2i<W?%p;uKVn
+;#kY9F8p@^Er^=]Fo?L_Gl2gkG^4R\HW3u@<V]\e<Vohk<@;g.FEMbNGBnL\I!pElJ:N3&K7nr5
+L5:\CMMmFPNK0'\OHG]hPEc'3!g]1>rg3bTR[X/Ds.'%Yl^n'Grg`kTs-itUrL!VOs-EYLs-*MI
+rK75EOHBI&!fi8"rf$l8!/gc4s+p]1rItB-KS98Urdt-#pji-hpji?ps+:3%s+LE+re:Z5LkpnE
+MMd>kN!53$O,oBbrfV&\Pa.N"Q^F/.R[]e:SXuFFTV8*TUnjiaVl-MoWiN5'Y-5(6Z*UdD[C3QS
+\[f>b]Y2(p^qmn*`5Ta:aN;TJbK\>Xcd:(fe'uq!f@S[.g=tE=h;7&IiSrnXjQ5OdkNM0plK[^%
+m-X6?mg/FQnac8BoCV\Sp&Facp\jmeq>U6fqu6NkrUTr=s4.."~>
+JcC<$JcFX-o`"jgrqu]ks8)ckrV1^5p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5]+Vhqm2Eg=k32
+e^W'qd*L"]bK7iF`P]R/^V7@l\[T#SZa$a;XfJJ#VPKu\TUq^DR[BD+PEM#gNJraOLPCJ7JUi2t
+H[9s]G'%eGEGo`3CMRWtB4YXa@UWYO?=!Nmr9"%@roF+>ro+1Ai8EMLh;$caOnY%3OnFn%OTO(^
+e,7YodJ_Glchu)gc2PojbK@uLaN4%ps2OiQ!6"Jqrg*>Er58BJs24iSqnr<JoYLFAqSW?Oou6jI
+!2&hRrP\]SpW!'Mq8i$Ho?.!Sqof)c[I^d%ZhC^'h>Z:2hu;R<ioB+]kNMp0rTa1Ds6TaNqs=1H
+#k.9Qo(;VKq"Xj2fu`['!``3!qG[>jr)!Gjjo>4qrl"iUq8VjApr"e)F*)MHGB\:XH@($fIXcm!
+JqJ]/L5(J>M2@+JN/WdWO,oBbP*2#nPa.N"QC%Q;s-`nUr1!\UqORGRqORSTqj[VSrgE_Ps-NbO
+rg!MJs-*GFs,m>Crf7,@NK*prs,-l7rJ:T3LPPh_s+UK+r.G$$rdj3^s+10$rIb-'s+UH,s+^T1
+reUZ5MuJY9NK4"!G*%iLP*;,qQ'Rc(R$jD4S"-%@StD[LTq\<XUnsrdW2ZesX/rG+YHY79Za7$H
+[^WcW\\#Me]t_=t_8=+.`Q#s>aND]Lbg"GZd*^:jeC<%#f@\d1g>(N?hV[8LiSrnXjQ5OdkNM0p
+lKdg'mHs?1n*oi:rpg-^o^r.Us7ZKerV6Bfs8)WirVZWmo)=4?ec1.~>
+JcC<$JcFX-o`"jgrqu]ks8)ckrV1^5p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5]+Vhqm2Eg=k32
+e^W'qd*L"]bK7iF`P]R/^V7@l\[T#SZa$a;XfJJ#VPKu\TUq^DR[BD+PEM#gNJraOLPCJ7JUi2t
+H[9s]G'%eGEGo`3CMRWtB4YXa@UWYO?=!N,r2'Fhq4mq`"JMK\T:Y7col958!1`hRqjR2Gr0RJN
+nsK<@!1*P(pi?%IjHf5!qNgoC!1*DH!-e!WopPK?q3h5NjI?(;qjd_Yn;%%"o8!:>r1s@is/,mr
+WW&prX8B!rXo#9pYPk[2Z*L^B['[6-Qi!0LQhZmEQ1L=5Q2$XH<E)ro;uKVl;#jGjbPo]dc-6.0
+qof/ebfn?2bQ,odP4Fh.OoU^<OtL`qFEDYLGBeF[H[L6jIt3*%K7ei3L51SAM2I4MN/ipZO-#Ke
+P*;,pQ'IZ$Qi3<ORK&`RS,SrSSb\lRSc,)US,\rVRJiNQQiEBNQ2d*KPQ$aFOoLOBNrk?$NW+n:
+MZAY5M#rKgL])u-L&Zi(KE$Q&J`_L_Jc:9"KE$W)L&Qi,LB*/0M#iKlrepl;NrG)_OHG]hPE_>t
+QC!u+R@9V7S=Q7CT:hmOU8+N[V5C/hWN)u!XKAY/YctC=Za@-K\%&uZ]=bei^V@S#_Sa=2`lH0A
+b0.uPc-FY^dF-LneCE1&f\,!4gtgfChr*GOioB([jlY^gkiq?slg4!*mI'H3nF5uIncJFTo`"O`
+pAamcq#:*hqYU0gr;HTbrdk+"s*t~>
+JcC<$JcFX-o`"jgrqu]ks8)ckrV1a6p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5]+Vhqm2Eg=k32
+e^W'qd*L"]bK7iF`P]R/^V7@l\[T#SZa$a;XfJJ#VPKu\TUq^DR[BD+PEM#gNJraOLPCJ7JUi2t
+H[9s]G'%eGEGo`3CMRWtB4YXa@UWYO?<pM/;Z'Dl;#F)h:A7Q`54h(h55nFR;#X>i;#a>j;#a>`
+:AI]^:@g[L4TI\@4oA.P:\mo`:B45Z:\mod;>a>d;#j&U7.jIX;>3oa;=[QQ;?'Pj<;]Yp8`<;?
+<r#hr<rQ2!=T)D$>4u+r>5VP&>5h_->[:Y2;tX&R;=@<`;,pRpqG[>jr)!Gjrc8'[rc8']rcS3`
+!-eEe!."Hd!d]3?rD`Vnq,[)erDrYm/obrSFEMeOG^=[_I!pHnJ:W<)K7nu6LPUeDMMmFPNfK0]
+OHG]hPE_;sQ'R`&rL!VQs-ikTrg`hUq4@GRrLEbSs-iqTrL!VOs-EYLs-3PIrf[;Ds,d5@!fi8"
+rf$l8!/g`3!f2VerJ(?+s+L<&s+:6$k(*J_rdt*$s+LE+reCH.!/UW2!K)g7Mueourf;5aOcklk
+Pa.N"Q^F/.R[]e:SXuFFTV8'RUSO]^VPgAlWiE,$Xfek3Yd(O@['d?O\@K/^]Y(qm^VI\&_o0O6
+a2l?EbKJ,ScHjkbdaQ^qe^rF*g"P08h;-rFi8ESRj5]4^k2tjjl07L!m-O-,mdKW6nF?MK!qZ'V
+rq6<bs7cKerqZTjqtp?irVc<dJcF:#J,~>
+JcC<$JcF[.o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no+'fn*f]2m-Es$ki_*jjQ#7Yi8<AHgY1?4
+f@AC!dEp1`bKJ#K`l5j4^q[Rq]",;Y['R$AY,nY&Vl$8bTqJ!IS!fY0Q'7AmO,]*UM2-h=K7SQ%
+I=$9bGBS(LEH,o7D/3m#BP1mf@q&kS?XEWmr9"%@qrA"Bio/kSi8<AfOSt=<P5:=5P3A#1f%&:"
+r6t\o#LUuIdEp7dchu)gc2YujbK@rJaRmOQ`WF-!`r*gDQN3?JQ2SVs_Z.OM`;@IL_YM%E_YV1M
+`:_+I`;QA)TDbA[`;[aM`r*jYaN)?taR@7Bb5BH\bl>rd[J7--[JR?-Zi.30h>Q41i;_a>ioB+]
+kNMp0r9F"A!:'RLr9X@K$L[BPnalDGp@n@XrQ<g8n&YN.qc!Gkr)*Dhk5Y7prl"iUqSqX9.<9NP
+F`qtRH$XgbI=6TqJ:W<)KS>/8LP^kFMi<USNfT6_OHG]hPE_=2Pld8<Qi3<ORK&`PS,/ZPSbelP
+S,SlVRJ`HPQiEBMQ2d*KPQ$aFOT:LANrk?$NW+n:MuS\6M>rD3L]3&.L&Qc(KDpK$Ja%^aJc:9"
+KE$W)L&Qi,LB*/0M$o3!Mi<USNfK0]OHKO*BTn[GQ'Rc(R$jD4S"-%@StD[LTq\<XV5C/gW2Zes
+X0&M,YHY7:Za7$H[^WcW\\#Me]t_=t_8=+.`Pom=aN;WKbg"GZd*^7ieC<%"f@\d1g=tE=hV[8L
+iSrnXjQ5OdkNM0plKeH9!U]=SmfDqJrpp*\!;-6_s7QHer:p<frqcNhrqu]mo)=4?f)L7~>
+JcC<$JcF[.o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no+'fn*f]2m-Es$ki_*jjQ#7Yi8<AHgY1?4
+f@AC!dEp1`bKJ#K`l5j4^q[Rq]",;Y['R$AY,nY&Vl$8bTqJ!IS!fY0Q'7AmO,]*UM2-h=K7SQ%
+I=$9bGBS(LEH,o7D/3m#BP1mf@q&kS?XEW,r2'Fhq4mq`!hl9ZrGh4DoPs)6!hGjOoUGiKq3_;Q
+R@3E/r0Qnnpi-:Sjd,>"qNgoC!1*DHrHIpXopPH>qO.>OjI?(;qjd_YrJ:6(rJ:K/!/U6%s.fOg
+s/#ams/,stWN)uqX8K'uXnf-nY6D/8Z*L^Brj;^5qj7/Hs-N_Nop,9;o9K0<!gckcqc!Gkr)*Dh
+rQG/`"3Sa.b5KN`bQ,i^bkmRpPN@rVEccDGG'A1VH@($fI=HctJV&N-Knb>;M2@+JN/WaVO,oBa
+OcklkPa)04!g]1>rL!VQs-ieRqOIGRqOIANrgNkTr0[MNs-EVKs-3PIrf[;D!0I/?!fi8"rf$l8
+s,-f4s+p]1reCH,re16&rdt*"l%&bardt*$s+LE+reCH.!/UW2$]9k#N/WaVNfT6_OoCMWPE_>t
+QC!u+R@9V7S=Q7CT:hmOU8+N\VPg>jWN)u!Xf\b0YctF>Za@-K\%&uZ]=bei^V@S#_Sa=2`Q-'@
+aihlOc-FY^dF$FmeCE.%f\,!4gYCWAhr*GOioB([jlY^gkiq?sli-5OmI'uB!V#XYo)J:]o_nI_
+p&Ojbq#C0hqYU0hr;?Nardk+#s*t~>
+JcC<$JcF[.o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noF9in*f]2m-Es$ki_*jjQ#7Yi8<AHgY1?4
+f@AC!dEp1`bKJ#K`l5j4^q[Rq]",;Y['R$AY,nY&Vl$8bTqJ!IS!fY0Q'7AmO,]*UM2-h=K7SQ%
+I=$9bGBS(LEH,o7D/3m#BP1mf@q&kS?X?]2;uT\m;?'Ja:]!<R54h(n55J.S;#4&a;#a>a:A@W_
+:A@$H5PdSB;#3u`;#3ub;"@EY;#O8h;YO&Y7J0RY;>*ic;=IEQ;?'Po;u0Jk;tN]\9DV9X9DqK^
+<WZ?'<r5qu<r,nt=T)A&>4bts>5;>$>5qh)>kCtg;XdQM;#aMl;uKVl;>j;qF)l;BF*)O&FTQ`1
+GQ)ggGBe?1GlE$d<;KVk<q98i<qfTCEccDGG'A1VH@($fI=HctJV&N-Knb>;M2@+JN/WaVO,oBa
+OcklkPa)04!g]1>rL!VQs-ieRqOIGRqOIANrgNkTr0[MNs-EVKs-3PIrf[;D!0I/?!fi8"rf$l8
+s,-f4s+p]1reCH,re16&rdt*"l%&bardt*$s+LE+reCH.!/UW2$]9k#N/WaVNfT6_OoCMWPE_>t
+QC!u+R@9V7S=Q7CT:hmOU8+N\VPg>jWN)u!Xf\b0YctF>Za@-K\%&uZ]=bei^V@S#_Sa=2`Q-'@
+aihlOc-FY^dF$FmeCE.%f\,!4gYCWAhr*GOioB([jlY^gkiq?sli-5OmI'uB!V#XYo)J:]o_nI_
+p&Ojbq#C0hqYU0hr;?Nardk+#s*t~>
+JcC<$JcF[.o`"gfrqu]ks8)ckrqQNf!;?EbFS,1qo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AGgY1?4
+f$r3tdEg+_bK@oH`PfX0^q[Rq\[])UZa-g=XfSP%Vl$8aTq@pHS!fY0Q'.8jNf8mQLk^V9Jq/?"
+I=$9bGBJ"KEH#i6Chmd!BP(gd@q&kS?XETlr9""?r8\(Bio/kSi8=3hrK7&As,l]3m?%J%f%0iN
+s4$tqrmLhorQtPi!7(Sg"jG04aiMQra8<mV`W);)R.-I@QN!0L_Z7XR_u@OP_tM%I_u7IJ_>M1K
+_uI[S_uI[R`W!mP`VH2&TDtM^`;[aM`rF*OaR@7Ab5KN_bl>ogcF3DRrj;F-qm?=.s5!_3s53k8
+s5F.@jQGb+l20c@li$,Ili-8LmJlYTnH\XWp%S7Wq>1$3pW<6Pn]C[L!6OfQ!*&horDNPjqG?>S
+pr!-Mrl+`RkJ\okF*)PJGB\=YH@('gIXcm!JqJ]/KnbA=M2@+JN/WaVO,oBaOcklkPEc'3s-E\O
+rL!VQrgNJK!1`YMrL3_Rr0[MNs-EVKs-3PIrK75EOHBF%!fi8"rf$l8s,-f4s+p]1rJ(?+s+L<&
+rdt*"l[\qbrdt*$s+LE+reCH.!/UW2(lF60N/WaUNfT6_OcbfiPE_>tQC!u+R@=,E=IbqRT:hmO
+U8+N[V5C/gW2ZetXKAV-YHY:;Za7$H[^WcW\\#Me]t_=t_8=+.`Pom=aN;TJbg"GZd*^7heC<%"
+f@S^0g=tE=h;7&IiSrnXjQ5OdkNMp0$gR'Em-X6/n*fc9nc&(\oCV\Sp&Facp\jmeq>U6fqu-Hk
+rUTr=s474#~>
+JcC<$JcF[.o`"gfrqu]ks8)ckrqQNf!;?EbFS,1qo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AGgY1?4
+f$r3tdEg+_bK@oH`PfX0^q[Rq\[])UZa-g=XfSP%Vl$8aTq@pHS!fY0Q'.8jNf8mQLk^V9Jq/?"
+I=$9bGBJ"KEH#i6Chmd!BP(gd@q&kS?XET+r2'CgqP4%a!MQ1_EUn)9EU@]HSt2GNSG8TNRfAfQ
+RK/cAR/`N>Er'bUQfaV'Q2d0KQi<<>Qi21-GP?:SRIlmCRJrZ8S,JlSSc"??M#N2+M"HK&U]%"g
+VZ3RoVu`ltq5aIqs/l(!pTOV$!jT&;rj;[4!4Mlmq3V&Is-NVKp6GK?n<O$>!LHd_;uKVl;>O,h
+b5TTab5]Qbb/qd)b5]Wkb0.uNb0.uPbKKdGnrr7".WTTPF`qtQH$Xd`I=6QoJ:W<)K7nr5LPUeD
+MMmFPNK0'\OH>TfP*;)org!MLs-N\Os-`kToU>iNo:,]IrgE\Os-NbOrK[DIs-*DE!g/S+rJq#?
+NK*prs,6o7re^Z2s+gQ-s+UK+r.G!#rIO9brIOs"rIb-'s+UH,s+^T1reVJLMi3OQNK&sZO-#Kd
+P*2#nQ'IZ%R$a;1rgR#[SXuIHTqS3UUnjiaVl-JmWiN5'Xfek3Z*L^B['d?O\@K/^]Y(qm^VI\&
+_o0O5a2l?Db0/#RcHjkbdF-Ooe^i@(g"P07gtgfChr*JQj5]4^k2tjjrojgUlg4!*mdBQ4nF?&J
+ncJFTo`"O`pAamcq#C0hqYU0gr;HTbrdk+#s*t~>
+JcC<$JcF[.o`"gfrqu]ks8)ckrqQNf!;?EbGkCUuo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AGgY1?4
+f$r3tdEg+_bK@oH`PfX0^q[Rq\[])UZa-g=XfSP%Vl$8aTq@pHS!fY0Q'.8jNf8mQLk^V9Jq/?"
+I=$9bGBJ"KEH#i6Chmd!BP(gd@q&kS?X?Z1<)`cor)*GiohY6DrBBj<i'-m4!)WAdq+q&eohP6W
+s%`2Nq*=mCr]^<XqG6o`q+plaoM>K`rDEPjrDEJjpegKKp/:ofpe^ibnPJmUrDNSmrD`YmpIbEX
+r^uQNqc<;is&f8'!a&T-rE05+=^##.=TDY"=oV\*>Pqb*;Y<u\;Y<o]:]O;c:]OJl;uKVl;>O,h
+Er^=YFoHUbGlMsdGQ2pfGli;;H2CS:<Vfbe<W?+p<@W$1FEMbNGBnL\H[U<kIt3*%K7ei2L51SA
+M2I4MN/`jYO-#HcP*2#mPl?sJQN*<MR/`TRRe3'LSF`6KRf8`QR/`NQQMm*KPlHsGOogc-OSt4A
+NfB%tN;nh9MZ/J4M#W8/LAuu-K`$K%K)L8dJGk&uK)L?%K`?c*LB!#/M#N5JMMmCON/`gWO,oBb
+OcklkPa.N"Q^F/.Rf8dYS=Q7DTV8'RUSO]^VPg>jWN*##Xf\b0Yd(L?Za@-K\%&uZ]=bei^V@S#
+_Sa=2`Q-'@ai_fNc-FY^dF$CleCE.%f@em3gYCW@hV[8MioB([jlY^gkl0fSlKdg'mI'E2n*ol;
+rpg-^o^r.Us7ZKerV6EgrqcNhrVZWmo)=4?f)L7~>
+JcC<$JcF[.o`"jgrqu]ks8)ckrV1^5p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5]+Vi83;Fg=k32
+f$r0rdEg+^bK7iG`PfX0^V7@m\[])UZa-g=XfJJ#Vkp2`Tq@pGR[BG,P`h/iNf8mQLk^V9Jq/?!
+I!U*`GBJ"KEH#f5Chmd!BP(gd@q&kS?XEQkqrRq@k5=<DjQ#:[iU`01Ol;JpOTO1efDX;#ebmnt
+e("<Es3_>'d*L"_c-=JUb/qcHoZ-mLqO%8MqO%#Drg*N$qSVjA!5nfQqSE'GrPSQOqo/QSpr2Zo
+rl"iUpW!6Ro>p=@oud3UrQP>fqmPUos0Vd]s53k7s5F.@jQ5V)l2']AlhTiElN$;Nm0rFOnF?,B
+p%S7WqYU3fb4s*OaS*a@aS]!8;Z0Jd;!7lP_uI[S`VRU=`?oVHFED\MGBeF[H[L6jIt3'#JqJ`1
+L5(J>M2@+JN/WaVO,oBaOoCLFPE_=2Q2d0MQi*6MRJiTCS,JfSRJWBNQiEBMQ2d*KPPp[EOoLOB
+O8k7?NW+n:MuS\5M#rKgL])u,L&Zi(KDpK$Ja@pdJc:9!KE$W)L&Qi,LB*/0M>rG5MuJY9NK4"!
+"d"k0P*;.0Q"H>KR$a;1S"#q=St;RITqS3UUnjiaVl-MoWiN5'Xfek3Z*L^B['mEP\@K/^]Y(qm
+^VI\&_o0O5`lQ6Cb0/#RcHaeadF-Lne^i@(f\,!5gtgfChr*GOioB([jlY^gkiq?sli-5OmI'uB
+!V#XYo)J:]o_nFap@n=Zq#C0iqYL*gr;?Nardk+$s*t~>
+JcC<$JcF[.o`"jgrqu]ks8)ckrV1^5p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5]+Vi83;Fg=k32
+f$r0rdEg+^bK7iG`PfX0^V7@m\[])UZa-g=XfJJ#Vkp2`Tq@pGR[BG,P`h/iNf8mQLk^V9Jq/?!
+I!U*`GBJ"KEH#f5Chmd!BP(gd@q&kS?XEQ*qkX=hV>R.gU]7(eEr'eME92*2DuuZ'T)G5[SG&HG
+RK/cAR/1k&F7OALEW)1'Q0Xb0Q2-a0Qi;7"GP@NtR/36MRdusIRe<0JSG\rTMZ8P'M"QQ&U]7.i
+V>dCmVu`ltq5aIq!3Q.$!3Q7'!3c@(r3$L4Z*L^B['[6L[^WaBQLgI?QM-UAQLU7?QMa\[;Z0Jd
+:]nk`b0'V'!6G/]rlP5aqo\r^q3(<4l&mB6F*)MIGB\:XH@($fIXcluJV&N-Knb>;Ll$tGMi<US
+NfT6_OHKO*!gAk5rg!MLs-NYNrgE_Rn!j9ErL*PMrg3YNrK[DIs-*DEs,m>Crf@)>s,I#:s,6o7
+rJ:T3LPPh_re:B*r.G!#rIO<crdk'#r.G$&s+UH,s+^T1re^Z4!/pi8!KE-=Ns1W-P*2#nrfq)]
+Q^F/.R[]e:SXuFFTV8'RUSO]^VPg>kWiE,$Xf\b0Yd(L?Za@0L\%&uZ]=bei^V@S#_Sa=2`Q$!?
+ai_fNc-FV]dF$CkeCE.%f@\d1gYCW@hV[8LiSrnXjQ5OdkNM0plKeH9!U]=SmfDqJrpp*\!;-6_
+!quB_r:p<fs8)Thrqu]mo)=4?fDg@~>
+JcC<$JcF[.o`"jgrqu]ks8)ckrV1m:p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5]+Vi83;Fg=k32
+f$r0rdEg+^bK7iG`PfX0^V7@m\[])UZa-g=XfJJ#Vkp2`Tq@pGR[BG,P`h/iNf8mQLk^V9Jq/?!
+I!U*`GBJ"KEH#f5Chmd!BP(gd@q&kS?X?W/<)cfq;Ys;l:f7!a!)N&Hr]]s=j?EQ?rD<Mkr)!)a
+qbR8gp.k<WqEY$Gn3Ht;rD<Ggpe^c^qb[,bq,$c^r)3;er^HTMqF1-Vr_`VjpJLres%i;apJLle
+qc!Moq,@/_s%3/]nOraQs%E2ho2kro!*T8&r`T8)!*fD*!*Jqt!*]>*rET1sq,?`[p/1fcq+pud
+r_NGjrDNSkp.u':FEM_JFEM_LGPcR_G5umdGl`/6q,I/iqGui\-?=0LFEVkPG^=[_I!pHnJ:N3&
+K7nr5L51SAM2I4MN/`jYO-#HcrfR>HPa)04s-E\Or0[JOrL32ErL3\Qqj@ALs-EVKs-3PIrK@2C
+s,d5@s,R,=rf$l8s,-c3!f2VerJ(<*s+L<&rdt*"m"#(drdt'#s+LE+reCH.!/UW2s,$f7repl;
+NrG(COHG]hPEc'3AsSdNR$jD4S"-%@StD[LTq\<XUnsrdVl?\rX/rG*Y-5(7ZEpmE[^NZT\[f>b
+]Y2(p^qmn*`5T^8aN2KGbKS5VcHstddaQ^rf%8O+g"P39h;-rFi8ESRj5]4^k2tjjl07L!rp0[Q
+mf)YUnF?MKs766_rUg6cp\4U\s7u]kqYU9ir;H3cJcF@%J,~>
+JcC<$JcF^/o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no4-gn*f]2m-Es$l0%3kjQ#7Yi8<DIgY1?4
+f@AC"dEp1`bfe,L`l5j4^q[Rq]",;Y['R$AY-"b)W2HGdTqJ!JS!o_2Q'@GoO,]*UM2-h=K7\W'
+I=-?dGB\1OEcH&9DJX*'BP;!hA7K(W?XI.6kPF?=jT=N'j7JH0OT:RDPN%c#OoO)6fDX;#ebmqs
+ec4,!ec+&"e'cVAc3MV<bK@rKaN4"o!li:$nsTBB!1E\N!13Z&qSVjArPJWPqn`3IrPSNNr5JWS
+q8M`or5JKOs2XlTs2Y)ZmE,"Cs3(Gd!6tJfq6o@l%Gfmui8ESRj5f=bkiq@-lMKoAlMg)\m-X3.
+n*oo=o_%qQq"adarVF\9aT0KZan<aJanWsWa83mV;uKVm;=dWJs7O;/`;dgP`p:SfEcZ>EFa&%S
+H$XgbI=6QoJ:W<)K7nr5L51SAM2I4MN/`ksNrb?)rf[;F!0mGIs-E\Oqj@;LnXBBDqO%8Krg*MJ
+s-3MHrK75EOHBF%s,R,=rf$l8s,-c3s+p]1rJ(?+s+L9%rdt'!n::Ffrdt'#s+LE+reCH.!/UW2
+s,$f7repl;NrG)YOHG]hPEV5rQ'Rc(R$jD4S"-">St;RITqS6WUnsrdVl6SpWiN5'Xfnt5Z*L^B
+[C3NQ\@K2_]Y(qm^VI\&_o0O5`lQ6Cb0/#RcHab`dF-LneCN7'f\,!4gtgfChr*GOioB([jlY^g
+kiq?sli-5OmI'uB#k7BSo()DDo^r.Us7ZKerV6EgrqcNhrVZWmo)=4?fDg@~>
+JcC<$JcF^/o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no4-gn*f]2m-Es$l0%3kjQ#7Yi8<DIgY1?4
+f@AC"dEp1`bfe,L`l5j4^q[Rq]",;Y['R$AY-"b)W2HGdTqJ!JS!o_2Q'@GoO,]*UM2-h=K7\W'
+I=-?dGB\1OEcH&9DJX*'BP;!hA7K(W?XI.6VY[.eV#I.cEqjYPE8P[1E;uR1T)G5[SGerVSGSfO
+RfAfBR.>=qEWC1WEWC+XQMm*:QM-U>QMHjIR.?U>GkH:TR/iWQRJE6HRK&`IS,A`IS,JlTSb\0=
+M>)i"LBjTMUnsobVl0Nm!NE*sWr]<&r2]n#r3$%$q6'\"s02R1rj;^5"1G\K\G)<ZQi*0BPlR->
+Q2X_\;Z0Ja;#AB7a8j9ZaSX*Yao]]-bP.1jPO"AUEcZ>EFa&%SH$XgbI=6QoJ:W<)K7nr5L51SA
+M2I4MN/`ksNrb?)rf[;F!0mGIs-E\Oqj@;LnXBBDqO%8Krg*MJs-3MHrK75EOHBF%s,R,=rf$l8
+s,-c3s+p]1rJ(?+s+L9%rdt'!n::Ffrdt'#s+LE+reCH.!/UW2s,$f7repl;NrG)YOHG]hPEV5r
+Q'Rc(R$jD4S"-">St;RITqS6WUnsrdVl6SpWiN5'Xfnt5Z*L^B[C3NQ\@K2_]Y(qm^VI\&_o0O5
+`lQ6Cb0/#RcHab`dF-LneCN7'f\,!4gtgfChr*GOioB([jlY^gkiq?sli-5OmI'uB#k7BSo()DD
+o^r.Us7ZKerV6EgrqcNhrVZWmo)=4?fDg@~>
+JcC<$JcF^/o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no4-gn*f]2m-Es$l0%3kjQ#7Yi8<DIgY1?4
+f@AC"dEp1`bfe,L`l5j4^q[Rq]",;Y['R$AY-"b)W2HGdTqJ!JS!o_2Q'@GoO,]*UM2-h=K7\W'
+I=-?dGB\1OEcH&9DJX*'BP;!hA7K(W?XI.=;u]es;uKVj;>F&T4oIS:5Nb61;>!cY;>a8j:\[]X
+:\$gK5QF+H5QF%I;#O2b;#*oa;#3u`;#*ri;Gg<h;Ya2c7J0(C;Y!]b;#O2_;#*uf;Ya8k;ZB\q
+;Z'Jh9)M9[9)2-P9`.rj<s)K)='#,uqH3c#s'#D+!*]8&!*K,$!*]A+qcrknpf$c^nkoB_pJ:ce
+rDNSko2,@,"*Jd1Fo$:]G6<)8H$K=4pJguhq,Zf],'%aHFEMeOG^4U^I!pElIt3*%K7ei2L5(J>
+M2@+JN/WaVrf7)AOoCODP5pjGQ2d0MQi!0JRIQaDRJN<MQi<<LQ2d*JPPpXGOcY\'O8k7?NW+n:
+MuS\5M>rD3L])u-L&Zi'KDpK#Jae3fJc:9!KE$W)L&Qi,LB*/0M>rG5MuJY9NK4"!E0-3FP*;)o
+Q'IZ%R$a;1S"#q<SXuFFTV8'SUnjiaVl-JmWiE,$Xf\e2Yd(L?ZaI6M\%&u[]=bei^V@S#_Sa=2
+`Q$!?ai_fNc-FV\dF$CkeC<($f@\d1g>(N?hV[8LiSrnXjQ5OdkNM0plKeH9!U]=Smg/FQnac8B
+oCV\Sp&Facp\jmeq>U6fqu-HkrUTr=s4@:$~>
+JcC<$JcF^/o`"gfrqu]ks8)ckrqQNf!;?EbG4bCso'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bK@oI`l5j4^q[Rq]",;Y['R$AXfSP%Vl$8bTqJ!JS!fY0Q'7AmO,]*UM2-h=K7SQ%
+I=-?dGBS+NEcH&9D/=!%BP1pgA7B"V?XI.'pZM;5s5a7AooT'5g628o!87A(rn%/#o[OK%e'cUh
+cHa\Zbfe/OaiMQpa7>YgR/Ou"_t(bE_uIUN_>M1K_u%CD`W!mDT`2q*`rF*VaSX$VaT'B^aSEsX
+aSX*Qb5]Zabl>rdc2b?L[d1?u[LBS#hr*JPioB+^kih:+lMTrKlKS'.s6C9`mI'E2nac;Ep\=R\
+qu$EkbO`mPan3[Janj*Wa8X-[;uKVl;=RKHs7jM3_Z.OQ`;dgP`pCYbEccDGG'A1VH?spdI=?Zr
+J:W<)KS>/8LPUeDMMqIm!KE-=Nrb?)rf[;Fs-3JIs-EYNpmC]ApR(oGrg*JIs-3MHrK@2Cs,d2?
+!fi8"rJ^c7s,-c3s+p]1rJ(?+re13%rIXrunppXhrdt'#s+LE+rJ(?-!/UW2s,$f7repl;NrG(?
+OHKO*"d>19Q'Rd9Qu8=\S"#q=St;RITqS3UUnjiaVl-JmWiE/&Xfek3Yd(L?['d?N\%&u[]=bei
+^V@S#_Sa=2`Q$!?ai_fNc-FV\dF$CkeC<%#f@\d1g=tE=hV[8LiSrnXjQ5OdkNM0plK[^%m-X6/
+n*fc9nc&(\oCV\Sp&Facp\jmdq>^<gqu-HjrUTr=s4I@%~>
+JcC<$JcF^/o`"gfrqu]ks8)ckrqQNf!;?EbFnG:ro'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bK@oI`l5j4^q[Rq]",;Y['R$AXfSP%Vl$8bTqJ!JS!fY0Q'7AmO,]*UM2-h=K7SQ%
+I=-?dGBS+NEcH&9D/=!%BP1pgA7B"V?XI.5VY[.hU][HhUndj.no=JEhf/^:EH1rLrgs+[pRM/N
+r0mSPm[3-X!-8'[s-NbOqN^W;oTf9=m$I^=m!&&hpmCuIrgEnXR[X&Aq3prFr1*bW!1rtConiO$
+reLB,",E\JV>d=qVl6PnWN,ls!N`F%XT,F%Y5>@"Y5bX(Y5b[7Yd(I>['d<M[^W`U\X3/Yl^.L7
+k`l-HrDNPjnPB;/aN4A$rl4uY"3AU+aSO![b0A9+P4Fh'Or\RbFEMbNG^4U]H[U<kIt3'#JqJ`1
+L5(J>M2@+Jrepl;NrG(?OHKO*s-*JIrK[DKrg3DIoU5H@rKmMLr0@;Hrfd;Ds,m>CrJq#?NK*mq
+s,6o7rJCQ1s+gQ-s+UH*r.Fs"r.4Ehr.4j!r.G$&s+UE+s+^T1re^Z4!/pi8!KE-=Nrb?)rfRGK
+Pa.N"Qi<@iR@9V7S=Q7CT:hmOU8+N[V5C/gW2ZesXKAV-YHY79ZEppG[^NZT\[oDc]Y2(p^qmn*
+`5T^8aN2KGbKS5VcHjncdaQ^qe^rF*g"P07gtgiEi8ESRj5]4^k2tjjl07Kulg4!*mdBQ4nF?&J
+ncJFTo`"O`pAamcq#:*hqYU0gr;?Nardk+%s*t~>
+JcC<$JcF^/o`"gfrqu]ks8)ckrqQNf!;?EbFnG:ro'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bK@oI`l5j4^q[Rq]",;Y['R$AXfSP%Vl$8bTqJ!JS!fY0Q'7AmO,]*UM2-h=K7SQ%
+I=-?dGBS+NEcH&9D/=!%BP1pgA7B"V?XI.:;ufkq;Yj8j;#O8Q4oIS;5P.,>4o.>B;=RKV;?'Jk
+:\dcZ:]EZX5kmY=5lX(J5lFOY:\R]^:]!u`:\mo];=mcQ7/0[R;>j>g:\@Q[;?'Pj;ts8h;uK;g
+9DqKY8cD?Z9D)!X<rH)#<`f9$qcESq!EiV(>6J,4=]ei*=Su;&>$Ll/s'>Funl,B_l;@RXqbI2j
+rDNPjnPK1+rH/0bF`mY+!-eBd!-\?c!-n3:qGm>llr>'HFEDYKGBeCZH@('gIXcluJV&N-Knb>;
+Ll$tGMuJY9NK4"!!K`HCP5gaGPl6mIQN!6GR.Qg@R/NBNQMd$JPl?mFP5g[EOSt4ANfB%sN;nh9
+MZ&D3M#W8/LAuu,K`$K$K)C2jJGautK)C9$K`?c)LB!#/M#N82M?&S6Mueourf7)AOoCLIPE_>t
+QC%T<DOHr_S"-%@StD[LTq\<XUnsrdVl6SpWiW>)Y-5(6Z*L^C[C3NQ\@K2_]Y(qm^VI\&_o0O5
+`lQ6Cb0/#RcHab`dF-LneCE1&f\,!4gYCWAhr*GOioB([jlY^gkiq?slKdg'mI'E2n*ol;rpg-^
+o^r.Us7ZKerV6Bfs8)WirVZTlo)=4?f`-I~>
+JcC<$JcF^/o`"jgrqu]ks8)ckrV1a6p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5].Wi83;Fg=k32
+f$r0sdEg+^bK@oH`PfX0^V7@m\[])UZa-g=XfSP%Vkp2`Tq@pHS!fY0Q'7AmO,]*UM2-h=K7SQ%
+I=$9cGBS(LEcH#8D/3p$BP1pgA7B"U?XN'skkO?;k5ONDk4au6On=h:PNe8)OoO)7f_X4uf)=.s
+f)O5%e'ZOgrltbnbfe/OaiMQra8_UtRIcgF`;@IN_uR^K`;RUR_Yh7I_Z%IH`:q7N`p05j`rF*Z
+aS3aNaSEsXaSO$Sb5TTabl,fccMG$J[dgcu[f>:ciW\B'jlYdkpZh_Cs69UKq!.kE&FAfPn*ol=
+p%A(Tq>:*frVl`<o#ggNoZ6aJrQ+lVr_iYkmSN0Jqo&9Is2=oUo#CUHqSXFqF*)PJGB\:XH@($f
+I=?]sJV&N,KS>/8LPUeDMMqIm!KE-=NrkE*OoCODPQ-mFQ2d0KQg'n9Qi36JQ2[$JPPgUDOoLOA
+O8k7?NW"h9MuS\5M>rD3L])u,L&Zi'KDgE!Jb=QkJc12uKE$W)L&Hc+LB*/0M>rG5MuJYCNK0$[
+O-#KdP*2#nrfqAeQ^F/.R[]e:SXuFFT:hmOU8+N[V5L5iWN)u!XKAV-YHY7:Za7$H[^NZU\[oDc
+]Y;.q^qmn*`5T^8aN2KGbKJ/UcHjkbdaQ^qe^i@)g"P07gtgfCi8ESRj5]4^k2tjikiq?slg4!*
+mI'uB!V#XYo)J:]o_nI_p&Ojbq#C0hqYU0hr;?Nardk+%s*t~>
+JcC<$JcF^/o`"jgrqu]ks8)ckrV1^5p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5].Wi83;Fg=k32
+f$r0sdEg+^bK@oH`PfX0^V7@m\[])UZa-g=XfSP%Vkp2`Tq@pHS!fY0Q'7AmO,]*UM2-h=K7SQ%
+I=$9cGBS(LEcH#8D/3p$BP1pgA7B"U?XNH&pS@kcrc7@Fqf(M6rGqn1rLa(\rLN_RrgWhSrL*/B
+i,\sdQBqE5rK[GKoTo*6rg)o;rg;tpoU5`Hs-`ePr0dGNq4%/JopblLrgi_>oni3ps/#am!2ogp
+s/?!urMoq"riQ4%riQ4'qQ9b"rN6+&$*US;ZEppG[^N[E\,a);QN3?5Qi!*8Q2X\Z;=79\a8<jV
+a8F$XaT0E]aTBZ1d-["ePPLC?OWJOaFEMbNGBeF[H[L6iIXls"JqJ]/Knb>;Ll$tGMuJY9NK4"!
+!g&P,rf[;Fs-3GHs-EVMl'VF9rKdAHrfmGHr0%)Bs,d2?s,R,=rJ^c7s,-c3s+p]1rJ(<*s+L9%
+rIXotomlskrIXs"s+LE+rJ(?-!/UW2s,$f7req5ENfK0]OHGZgP*;.0Q#;nSR$a;1S"#q=St;RH
+TV8'RUSO]^Vl-JmWiE,$Xf\b0YctF>Za@-K[^WfX]">Vf^;%Fu_8=+.`Poj<aN;TJbK\>Xcd:(f
+e'umtf%8R-g=k<:h;-rGi8N\Uj5f=ak3(pkl07L!m-O-,mf)YUnF?MKs766_rUp3a!;HEds7uZj
+qtpBjr;H3cJcFC&J,~>
+JcC<$JcF^/o`"jgrqu]ks8)ckrV1^5p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5].Wi83;Fg=k32
+f$r0sdEg+^bK@oH`PfX0^V7@m\[])UZa-g=XfSP%Vkp2`Tq@pHS!fY0Q'7AmO,]*UM2-h=K7SQ%
+I=$9cGBS(LEcH#8D/3p$BP1pgA7B"U?XNV.!)rhop/0j5pceX@oKN%5!']aGq,./grD3;cp.t?G
+qEXX:!)WVinPK6]qbZr]r_W8boht'Cpepobr_WSis%`Gepe^farDNSmohtcfqb$o_r(Hu\q+:TY
+qFgZYs&T/$qH!MqpfIQ">5_Y,>$5#,=T;J&=T)A(>$G51>Q\8<?![,$nl,B_l;@OW!)NSlr))lY
+rH.pZ!-\?crceKgG'<h.m8`^Xoi3&RF*)PJGB\:XH@($fI=?]sJV&N,KS>/8LPUeDMMqIm!KE-=
+NrkE*OoCODPQ-mFQ2d0KQg'n9Qi36JQ2[$JPPgUDOoLOAO8k7?NW"h9MuS\5M>rD3L])u,L&Zi'
+KDgE!Jb=QkJc12uKE$W)L&Hc+LB*/0M>rG5MuJYCNK0$[O-#KdP*2#nrfqAeQ^F/.R[]e:SXuFF
+T:hmOU8+N[V5L5iWN)u!XKAV-YHY7:Za7$H[^NZU\[oDc]Y;.q^qmn*`5T^8aN2KGbKJ/UcHjkb
+daQ^qe^i@)g"P07gtgfCi8ESRj5]4^k2tjikiq?slg4!*mI'uB!V#XYo)J:]o_nI_p&Ojbq#C0h
+qYU0hr;?Nardk+%s*t~>
+JcC<$JcFa0o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no4-gn*f]3m-Es$l0%3kjQ#:Zi8<DIgY1?5
+f@AC"dEp1abfe,L`l5j4_8!^s]=GG[[Bm0CY-"b)W2HJfU7n3NS=5h3Q'@GoO,f0WM26n?K7\Z)
+IXQQhG^"=QF)l8=DJa0)BkV-jARo7Z?sd:=klBrBkPOEAk5^Y@OSY+.P5^[-P5ULCg&0M!fD*qr
+eHOIOda?FfrltVjbfe0.aT0EWa8VM+RdQU=R/Y&$_u7ON_u%CL_u.@K_YqCG`;%=N`p05h`q@CJ
+aT'B^aSa-[aSO$Tb5]Zbbk]KacFEPVs0hO,qmQC2s5=1BjQ5Oekiqj,rp0IHs6KXKrTb'^mI'H4
+o(;VKp\F^`rVc`pbl#ZQb506PaSX*VaSa*Y;Z0JY;!S)X`:h+K`;[aH`r3mR`#j#@FEMbNGBeCZ
+H[L6iIXcluJV&N,KS>/8LPUeDMMqIm!KE-=O8k:AOo:ICPQ-mEQ2R$FQhm*FQi*0HQ2[$IPPgUD
+OoLOAO8b1>NW"h9MuS\5M>rD3L\uo,L&Qc&KDgDtJbsuoJc12tKE$W)L&Hc+LB*/0M>rG5MuJZ\
+NK0$[O-#KdP*2#nPa.N"Q^F/.R[T_8S=Q7CT:hmOU8+N[V5C/gW2ZesX/rG*Y->.8ZEpmE[C3QS
+\[f;`]Y2%o^VI\&_o0O5`lQ6Cb0.uQcHab_dF-LneCE.%f\,!4gYCW@hV[8LiSrnXjQ5OdkNM0p
+lKeH9!U]=Smg/FQnac8BoCV\Sp&Facp\jmeq>U6fqu-HkrUTr=s4I@%~>
+JcC<$JcFa0o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no4-gn*f]3m-Es$l0%3kjQ#:Zi8<DIgY1?5
+f@AC"dEp1abfe,L`l5j4_8!^s]=GG[[Bm0CY-"b)W2HJfU7n3NS=5h3Q'@GoO,f0WM26n?K7\Z)
+IXQQhG^"=QF)l8=DJa0)BkV-jARo7Z?sd:6VY6hdEoqB>E8P[4T`1S^T)G5USGScURf&TFR/V-c
+Erq\oQMZsGQMZs?QM6[DQL1%;R/D3tGOV$uR/EBLReWBJRfAlWReiNNSGo)ZMtW&#M=QK&V$Elq
+Vl6PnWN,ru!3H!us/u$s!3H1%s/u^4Z*L^C[C3QRrjVs=g6_`'n<O#OrDDlW!65#Wrl4rY!6>&Z
+s2P;aaihoRd-HkcPP^OAOWSUbFEMbNGBeCZH[L6iIXcluJV&N,KS>/8LPUeDMMqIm!KE-=O8k:A
+Oo:ICPQ-mEQ2R$FQhm*FQi*0HQ2[$IPPgUDOoLOAO8b1>NW"h9MuS\5M>rD3L\uo,L&Qc&KDgDt
+JbsuoJc12tKE$W)L&Hc+LB*/0M>rG5MuJZ\NK0$[O-#KdP*2#nPa.N"Q^F/.R[T_8S=Q7CT:hmO
+U8+N[V5C/gW2ZesX/rG*Y->.8ZEpmE[C3QS\[f;`]Y2%o^VI\&_o0O5`lQ6Cb0.uQcHab_dF-Ln
+eCE.%f\,!4gYCW@hV[8LiSrnXjQ5OdkNM0plKeH9!U]=Smg/FQnac8BoCV\Sp&Facp\jmeq>U6f
+qu-HkrUTr=s4I@%~>
+JcC<$JcFa0o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noF9in*f]3m-Es$l0%3kjQ#:Zi8<DIgY1?5
+f@AC"dEp1abfe,L`l5j4_8!^s]=GG[[Bm0CY-"b)W2HJfU7n3NS=5h3Q'@GoO,f0WM26n?K7\Z)
+IXQQhG^"=QF)l8=DJa0)BkV-jARo7Z?sd8><;onr<!#ur;YEuG4l\a)4mGl>;#jGj:]=,_:Z"A:
+;#O2V;#X>l;"mcb;"[]Y;ZB2_7.`kH7/9^\;>j>i;?'Gm:]*ub:\[cb;>O/j;uBPn;>*oa9DM9[
+9DhE\8cD?\9D_E_<WH4t<rH+p=T;P'>Q7k0=]ed-=Su8"=T;P(>5qh+?2e.1;t<iW;u'>W;?'Pm
+;<q'XFT-F]G5ZUbGl;gbG5upS<Us2b<?H7&FEMbNGBeCZH[L6iIXcluJV&N,KS>/8LPUeDMMqIm
+!KE-=O8k:AOo:ICPQ-mEQ2R$FQhm*FQi*0HQ2[$IPPgUDOoLOAO8b1>NW"h9MuS\5M>rD3L\uo,
+L&Qc&KDgDtJbsuoJc12tKE$W)L&Hc+LB*/0M>rG5MuJZ\NK0$[O-#KdP*2#nPa.N"Q^F/.R[T_8
+S=Q7CT:hmOU8+N[V5C/gW2ZesX/rG*Y->.8ZEpmE[C3QS\[f;`]Y2%o^VI\&_o0O5`lQ6Cb0.uQ
+cHab_dF-LneCE.%f\,!4gYCW@hV[8LiSrnXjQ5OdkNM0plKeH9!U]=Smg/FQnac8BoCV\Sp&Fac
+p\jmeq>U6fqu-HkrUTr=s4I@%~>
+JcC<$JcFa0o`"gfrqu]ks8)ckrqQNf!;?EbFnG:ro'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bK@rJ`l5j4^q[Rq]",;Y['R$AY-"b)W2HGdTqJ!JS!o_2Q'@GoO,f0WM26n?K7\W'
+I=6HgG^":PF)c2<DJa0(BkV-jARf1Y?sd:<klBrCkPOEAkP^MCOSY+&P5ga-OoX23f_X4sf)=,&
+eC2jnd*M^:#0kB8b/qfIprE6!s-i;Br0[E#rkn]QpV[$LqnrHNs2"TLrknEIp;Q6gou?sN!6FuV
+ouR*R!6G#YrQ>)^!6k2^!7(SRp:'h*q6g./qmQdhjQ5Oekiqg+!:0LHrTjFIrp(-_mdKZ9o(;YM
+q"adarVlisrlk>am)o1Ho>pjOrQ+uYrDDcTlMpb"!5nKJrl+KKr5JTP)fg"AFEMeOG^4U]H[L6j
+It3'#JqJ]/Knb>;M#N53MMqIm!f`5#rf7,BOcfU*s-*GHqN^E5pm(iCrfd8CrfR5Br/^l<s,Hu9
+s,6o7rJCN0s+gQ-re:?)qh+fumXb:fr.G!%s+UE+s+^T1re^Z4!/pi8&<2^1O,oBaOcklkPa%Gu
+QC%T<ELE8bS"-%@StD[LTq\<XUnsobVl6SpWiN5'Xfek3Yd(L?Za@0L\%&uZ]">Vg^;%Fu_SX4/
+`Pom=aN;TJbK\>Xcd:(fe'umtf%8O,g=k<:h;-rFi8ESRj5]4^k2tjjl07L!lg4!*mdBQ4nF?&J
+ncJFTo`"O`pAamcq#:*hqYU0gr;?Nardk+&s*t~>
+JcC<$JcFa0o`"gfrqu]ks8)ckrqQNf!;?EbG4bCso'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bK@rJ`l5j4^q[Rq]",;Y['R$AY-"b)W2HGdTqJ!JS!o_2Q'@GoO,f0WM26n?K7\W'
+I=6HgG^":PF)c2<DJa0(BkV-jARf1Y?sd9=oqqJ[iGna6k&LB@q4R_ZrLX"ZqOIST!1a%X!1NhR
+s-NeSpR(o"rc@aSnT4Vorg!GJpQbK=q3CrFop>TDrg3VOpj)CSn<s9CqjI;Lq4%#FrL<VQrgj%H
+p58L!nq[[MVPg>jWMuntX/rDtXT5NuXo,7-Xfeh1Z*CXA[C*IB[fX(M\^m,EQM$OA;<UjU`W*sX
+`rX9$qSrf]b0/&Vda[TGnrrs6rfJ.?F*)MHGB\:WH?spcI=?ZrJ:W<)K7nr5L51TaM#iKlrepo<
+NfO+"!g&P,rK@2Erfm8Em$@F3rfmDGr0%&As,d/>s,R,=rJ^c7s,-c3reUT0rJ(<*re10$r.=?f
+r.=j!re1<*rJ(?-!/UW2s,$f7reqDJNfK0]OH>TfP*;,pQ'IZ%rg7\nR[]e:SXuFFTV8'RUSO]^
+V5C/hWN)u!XKAV-YHY79ZEpmE[^NZT\[f;`]Y2%o^VI_'_o0O5a2l?Db0.uQcHab_dF-LneCE.%
+f@em3gYCW@hV[8LiSrnXjQ5OdkNM0plKdd&m-X6/n*fc9nc&(\oCV\Sp&Facp\jmdq>^<gqu-Hj
+rUTr=s4RF&~>
+JcC<$JcFa0o`"gfrqu]ks8)ckrqQNf!;?EbGkCUuo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bK@rJ`l5j4^q[Rq]",;Y['R$AY-"b)W2HGdTqJ!JS!o_2Q'@GoO,f0WM26n?K7\W'
+I=6HgG^":PF)c2<DJa0(BkV-jARf1Y?sd8>;cN`rrD`eq!)iPggHFR\l;7:R!)WShs%`8`hEV!8
+lVRRXrD<;cr_W8bp/:ZSr^?BGq,.)er)!Jk:]!ob:\moe;#sQlp/:fcp/:WXoM#9Xp.G3U!`iB(
+qc<\tpK.c*>$>-6>$4s0=',?$r`B)$s&oA*s'5S0ra#S'mSa$_r)3Aiq,6NUkYV;$rH/0bGBWq/
+!HrVaFour6H[Y3[nQ,Hc)fg"AFEMeOG^4U]H[L6jIt3'#JqJ]/Knb>;M#N53MMqIm!f`5#rf7,B
+OcfU*s-*GHqN^E5pm(iCrfd8CrfR5Br/^l<s,Hu9s,6o7rJCN0s+gQ-re:?)qh+fumXb:fr.G!%
+s+UE+s+^T1re^Z4!/pi8&<2^1O,oBaOcklkPa%GuQC%T<ELE8bS"-%@StD[LTq\<XUnsobVl6Sp
+WiN5'Xfek3Yd(L?Za@0L\%&uZ]">Vg^;%Fu_SX4/`Pom=aN;TJbK\>Xcd:(fe'umtf%8O,g=k<:
+h;-rFi8ESRj5]4^k2tjjl07L!lg4!*mdBQ4nF?&JncJFTo`"O`pAamcq#:*hqYU0gr;?Nardk+&
+s*t~>
+JcC<$JcFa0o`"jgrqu]ks8)ckrV1a6p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5].Wi83;Fg=k32
+f$r0sdEg+_bK@oH`PfX0^V7Co]",;YZa-g=XfSP%Vl$8bTqJ!JS!o_1Q'7AmO,]*UM2-h>K7\W'
+I=-?eG^":PF)c/;DJX*'BkV-jARf1X?sd7:klBrCkPOEAP5CCAO8tF*P5CI,P4mQ*fDF.ueHF@L
+da?D?c3MV<bKA#NaiOD#"3ANORf&TNRd-:B`5T^k`:UtI_YqCI_YqCF`:h15T_?Cta7[OPaT0E\
+ao0B\bPfZ`blH&eblH&f\Fm?%[K*`/[KYaRk3(smpZheEqWe(Gqs"g[m-X61nac;DpA"FZqu$El
+s8W&ArQFHJqT8?Ms2k5\!6>%8k"u'Vrr2utrVllsp](*.s24QKrPeEKrPe]Q*--+BFEMbNGBnL\
+H[L6iIXcluJV&N,KS>/8LPYqd!K)g7Muo!!NrG+>OT1IAP5^[EPiJ&-Pl?mDP5g[DOSk1>NrP+;
+N;eb8MZ&D3M#N2.LAlo+K_g?!K(+?hK):3#K`6])LB!&/M#N82M?&S6N"Cu/NfT6_OHG]hPEV5r
+Q'Rd9Qj&nHS"#q=rgm;cTV8'RUSO]^VPg>jWN)u!XKAV-YHY79Za7$H[^NZT\[f>b]Y2%o^VI_'
+_o0O5a2l?Db0.uQcHab_dF$FmeCE.%f@\d1gYCW@hV[8LiSrnXjQ5OdkNMp0$gR'Em-X3.n*fc8
+nc&+Zo)SF]o`Fj]p\agdq>U6fqu6NkrUTr=s4RF&~>
+JcC<$JcFa0o`"jgrqu]ks8)ckrV1g8p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5].Wi83;Fg=k32
+f$r0sdEg+_bK@oH`PfX0^V7Co]",;YZa-g=XfSP%Vl$8bTqJ!JS!o_1Q'7AmO,]*UM2-h>K7\W'
+I=-?eG^":PF)c/;DJX*'BkV-jARf1X?sd6<VtHq_V;6.kE8km2TE(V^T)YAXSG\lVRf/WUR$jB=
+QiibDF*%8"rcA'\q/uXXp2g5"q3LZ<q3LlBqNgoCr0[MNrKubnnX9BDr0dDMpm^oErL<bU!1j+Z
+rgitFp58L!o8!OHVl6Pnri-""XRiRoXT,C8XKAS*X/i>'Xfek3Z*L^C[C*IB[fX(M]@<2FQM6[C
+;<C[V`5T^m`W4'X`X'W,b082[e'jNGP4Xt7P5gXaEcZ>EF`qtQH$Xd`I!pElIt3'#JqJ]/Knb>;
+M#N53MMqIm!f`5#rf@)@s,m8Crfd>Gj-BS-rfd5Bs,m;Br/^l<s,Hu9repf6rJCQ1reLH,re:?)
+qLe]tn:CLhqh+p%re:?+s+gW1re^Z4!/pi8&<2^1O,oBaOcklkPE_>tQC%T<"dtgKS"-&KSm%bZ
+TqS3UUnjiaVl-JmWiE,$Xf\b0YctC=Za@-K[^WcW\\#Me]tV7r^r!t+`5T^9aN2KGbKJ/UcHjkb
+dF6Upe^i@(f\,!5gtgfChr*GOioB([jlY^gkl0fSlKdg'mHs?1n*oi:rpp*\!;-6_!quB_r:p<f
+rqcNhrqu]mo)=4?g&HR~>
+JcC<$JcFa0o`"jgrqu]ks8)ckrV1a6p@e1Po^qbGo'u5<n*]T0m-<j"kiV$hj5].Wi83;Fg=k32
+f$r0sdEg+_bK@oH`PfX0^V7Co]",;YZa-g=XfSP%Vl$8bTqJ!JS!o_1Q'7AmO,]*UM2-h>K7\W'
+I=-?eG^":PF)c/;DJX*'BkV-jARf1X?sd7>;ZKer<W,ns;ZK_k;;47n55n@D;#=,i;#O/i:A@Tc
+:f$^Jq*=L8s%hlUs&&Me!)NPiohkE\ogSjJp-\jWpe^lc"&Mcg:]4&e:\dic;?0Sg;Ys>i;?0Ym
+;X[9R9`7W\9)M?^=8Q%u=8#_t=^##.=TMW+r`9&!r`9#"s&f;(#[1G:>[1Q@?=2YhqG[2fn58=E
+!-J0^rH8<fG'8"NrH89fH@1,)<Us2e<?-%#FEDYKGB\=YH@($fI=?ZrJ:W<)K7nr5L51TaM#iKl
+repo<NfO+"s,d8CrK@/DrflH.rKR;Fqi^uArfI&=s,R,=rJ^`6s,-c3s+pZ0rJ(<*re1-#r.=Eh
+r.=fus+LB*reCH.s+pZ2s,$f7reqDJNfK0]OH>TfP*;)oQ'IZ%rg3kWR[]e:Sc53aT:hmOU8+N[
+V5C/gW2ZesX/rG*Y-5(6Z*UdD[C3NQ\@K/^]Y(ql^V@S$_Sa=2`Q-'@ai_fMc-FV\d*^7ieC<%"
+f@S[.g=tE=h;7&Ii8N\Uj5f=ak3(t-kmQeBm-O-,mdKW6nF?MKs766_rUg6cp\4U\s7uZjqtpBj
+r;H3cJcFF'J,~>
+JcC<$JcFd1o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noF9in*f]3m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@AC"dEp4bbfe,La2Q!6_8!^s]=GG[[Bm0CYH=n+WMcSgU7n3NS=>q6QBdYsOH5B[MM[+CKS+i+
+Isl]jH$=ITFE2A?DJj9+C2%?nAS#@\@:3GKkkaNDkkO??joCS<OT:LAOm\D*PO"D2g%X.sfDF/!
+eI'gTe'cXjcd'h\bl5cjb/q`FaN)?BrL<GJm@!jjr5AEKmDAh>q8E6Lr5ANPn=fTLou?gJn]:RK
+rlY2_q9/i`rm(GdqRH7.k-bKVkNM0plKe92rp0IHs6K^Ms69RKs6C0^mdTc;oCV_Lq"ad`rVlcq
+rltGdrlaKIqT86Js&%fQ"T85srr)iq"9&5trqHHi`;RUI`;R[J`r3mS`#!K:FEMbNGBeCZH[L6i
+IXcluJV&N,KSBD[!JcL1M#iKlrf$l:!07#=s,d8Cr0%&Cr06W7r07/DqNCi?s,d,=s,R,=r/CZ6
+s,-`2s+p]1r.b3)re1-#qh"Bir.=fure1<*rJ(?-s+pZ2s,$f7reu8bNfK0]OH>TfP*;)oQ'IZ%
+Q^F/.R[]e:S=Q7CT:hmOU8+N[V5C/gW2ZesX/rG*Y-5(6Z*L^B['d?N\%&u[]=bei^;%J"_SX4/
+`Q#s>aN;TJbg"GYcd:(ee'umtf%8O+g"P39h;-rFi8ESRj5]4^k2tjjkiq?sli-5OmI'uB!V#XY
+o)J:]o_nI_pAamcq#C0hqYU0gr;HTbrdk+&s*t~>
+JcC<$JcFd1o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noXEkn*f]3m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@AC"dEp4bbfe,La2Q!6_8!^s]=GG[[Bm0CYH=n+WMcSgU7n3NS=>q6QBdYsOH5B[MM[+CKS+i+
+Isl]jH$=ITFE2A?DJj9+C2%?nAS#@\@:3GKVPg?bVYd4%EV?(*TDY8\SbelQRfJoRRJrQUR@'A0
+rH.jVqK2XXpN6CUqj72Gp6GE=qN^Z<s-NYNs-N_Pn9XhSl'_O>oUGlLrgW\OrL3eWrgj%Ys./b>
+qMP$(o8*FF!3,sts/Q.$or\(lqlBb!s/uU1ZEpmE[JmT8\@MRLe<g&uq3CtWj%ofp`PhSk%*$?0
+ai_lTdaHUnPEY9pooo99rfJ"<FEDYKGB\:WH@($fI=?ZrJ:W<)K7nsXL&m'creUZ5MuJ\8N<#";
+O8k=AOo1CAPPg[5Q2HmFPPUIAOoLO?O8k7?NVnb8MuS\4M>rD3L\uo+L&Qc%KDU8kJc(,sKDpQ(
+L&Hc+L]<20M>rG5MuJZ`NK0$[O-#HcP*2#mPa.N"Q^=),R@9V7S=H.AStD[LTq\<XUnsrdVl6Sp
+WiN5'Xfek3Yd(L?Za@-K[^WcW]">Vf]tV7s_8=(,`5Ta:aN2KGbKS5VcHjkbdF6Upe^i@(f\,!5
+gtgfChr*GOioB([jlY^gkih9qlKeH9!U]=SmfDqJrpp*\!;-6_s7ZKerV6EgrqcNhrVZWmo)=4?
+g&HR~>
+JcC<$JcFd1o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no=3hn*f]3m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@AC"dEp4bbfe,La2Q!6_8!^s]=GG[[Bm0CYH=n+WMcSgU7n3NS=>q6QBdYsOH5B[MM[+CKS+i+
+Isl]jH$=ITFE2A?DJj9+C2%?nAS#@\@:3GKrDW_qs&Jtr!E2nn;#icP53b;g55S.K:]OAg;#=)i
+;"RNa:dFJ6nj*1=s%hcRs%rbml;@:Ro1&^Js$ZZM!)`GdrD<Pkp.tQ^s&&_m!)`JgqG@5jr_r_m
+k"G_Jqb-ZU!*B%us&\nrrE9/&!EW>!<W6#0='/R-=^#!5>[1Q??=.&Gr_qcRqG[2fp/0jH!-J3_
+s*+Hc!HiM`FoQUgG^=^aI=:<ZnlGWf(NX\?F`qtQG^4U^I!pElIt3'#JqJ]/L&Qf-LPYqd!K)g7
+N;nk;Nr>%=OT1I@P5^[CPjXh7Pl6gBP5^UDOSb+=NrP+:N;nh9MYr>2M#W8.LAlo+K_g>uK(=Kj
+K):3"K`?c)LB!&/M#N82M?&S6N.$\GNfT6_OHG]hPEV5rQ'Rc'R$a;1S"#q<SXuFFTV8'RUSO]^
+VPg>jWN)u!XKAV-YHY79ZEpmE[C3NQ\@K2_]Y(ql^VI\&_Sa=2`lH0Aai_fNc-FV\d*^7ieC<%"
+f@S[.g=tE=h;7&Ii8N\Uj5f=ak3(sll07L!rp0[Qmf)YUnF?MKs766_rUp3as7cKes7uZjqtp?i
+rVc<dJcFF'J,~>
+JcC<$JcFd1o`"gfrqu]ks8)ckrqQNf!;?EbGkCUuo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bKJ#K`l5j4^q[Rq]",;Y['R$AY-"b)W2HJfU7n3NS=>q6QBdYsOH5B[MM[+CKS+i+
+IXQTiH$=FSFE2A?DJj9+C1q9mARo:[@:3I)kNDd,s60OIpu_Y>nWEg4r/pK3p64p-s4RJ+p"9/n
+r72J1eC;sqdEp4ccHXVXbKJ&Mao0<\SGJ`QRfAlURdZ[>`;mjP_tCn>_th7L_tV+2U%ZM'a7%+G
+ao9H^bPKH_c2Grcc2"m@\*:='kNV6rrp0FGrp0IH!pf.:rTOjYm-X3/nFH2Cp@e7UqYU6gs8(">
+bl5fGb5KH^a8j?WaP]kpqu-EqrVZWlrV$9g_Z[oq_o0L``V7CM`Vm^lEccDGG'A.TH$Xd`I!pEl
+It3'#JqJ]/L&Qf-LPYqd!K)g7N;nn;Nr>%=OT1I>P5LO6Pl$[?P5UOCOSb+=NrG%9N;nh9MYr>2
+M#N2-LAlo+K_g>uK(FQkK)1-"K`6](LB!#/M#E/3MMmDlN"q>4NfT6_OHG]hPEV5rQ'Rc'R$a;1
+rgR/_SXuFFTV8'RUSFW\V5C/gW2ZesX/rG*Y-5(6Z*L^B['d?O\@K/]]=bei^;%J"_SX4/`Q#s>
+aN;TJbg"GYcd:(ee'umtf%8O+g"P07h;-rFi8ESRj5]4^roOCIkiq?sli-5OmI'uB!q>aMrpg-^
+o^r.Us7ZKerV6Bfs8)WirVZWmo)=4?g&HR~>
+JcC<$JcFd1o`"gfrqu]ks8)ckrqQNf!;?EbG4bCso'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bKJ#K`l5j4^q[Rq]",;Y['R$AY-"b)W2HJfU7n3NS=>q6QBdYsOH5B[MM[+CKS+i+
+IXQTiH$=FSFE2A?DJj9+C1q9mARo:[@:3H=rMKRlpnn"dqf'>jpRqGVrgs+[r1*SP!1NbP!1<\P
+s)n0[r,_jZqK;COpm:lDqN^*,s-NJIpj2X\q0MV"rL3bSr0m)DpmV5Ps.'%Ys.'(Zq2561p5Ad)
+qhb*(rJ:TSWiH'!s/c$u!j&N+r2fmuri,t!ri?7*YHY:;rj2g9[^WcWr4:UK!1<VLqNh&Ei(sNn
+`5KRl`W*j``lQ9Ec-Oebe'c\,P4k+:P5gX]EccDGG'A.TH$Xd`I!pElIt3'#JqJ]/L&Qf-LPYqd
+!K)g7N;nn;Nr>%=OT1I>P5LO6Pl$[?P5UOCOSb+=NrG%9N;nh9MYr>2M#N2-LAlo+K_g>uK(FQk
+K)1-"K`6](LB!#/M#E/3MMmDlN"q>4NfT6_OHG]hPEV5rQ'Rc'R$a;1rgR/_SXuFFTV8'RUSFW\
+V5C/gW2ZesX/rG*Y-5(6Z*L^B['d?O\@K/]]=bei^;%J"_SX4/`Q#s>aN;TJbg"GYcd:(ee'umt
+f%8O+g"P07h;-rFi8ESRj5]4^roOCIkiq?sli-5OmI'uB!q>aMrpg-^o^r.Us7ZKerV6Bfs8)Wi
+rVZWmo)=4?g&HR~>
+JcC<$JcFd1o`"gfrqu]ks8)ckrqQNf!;?EbGP(Lto'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bKJ#K`l5j4^q[Rq]",;Y['R$AY-"b)W2HJfU7n3NS=>q6QBdYsOH5B[MM[+CKS+i+
+IXQTiH$=FSFE2A?DJj9+C1q9mARo:[@:3G@;uTYt;cH^r<W#es;c<Qkq`X^=rBBO1j$*66q,%#e
+q,%)gs&/kos%iYkq+guerBU*Aks4?,k>CtOn4*@FqF($RrDEMiq+plas&&bns&&Si!`MuprDESm
+rDWVlh+RK7qc<_unQ5rr<`N.!<;ff"<``C+=oMS,>?kH>ra#Y5?=*J,iDTJMqGR5gi(sDrqfWEk
+F*)MHF`r"UH[C-gIJ-Y1<V'8h<>]auFEMbNGBeCZH@($fI=?ZrJ:W<)K7nsXL&m'creUZ5MuJ\8
+NW5%;O8k=AOnt7=POXn7PPLC?OoLO?O8k7>NVnb8MuS\4M>rD2L\uo+L&Qc%KDU8lJc(,rKE$W(
+L&Hc+LB*//M#rQmMuJYMNK0$[O-#HcP*2#mPa.N"Q^=),R@=,E>b%@VStD[LTq\<WUnjiaVl-Jm
+WiE,$Xf\b0YctC<Za7$H[^WcW\[oDc]Y2%o^qmn)_o0O6a2l?Db0/#RcHab_dF$FmeCE.%f@\d1
+g=tH>hV[8LiSrnXjQ6C'"m>+6l0@U6liHMArpKpXnaZVL!qZ'Vrq6<bs7cKerqZTjqtp?irVc<d
+JcFF'J,~>
+JcC<$JcFd1o`"jgrqu]ks8)ckrV1m:p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ij5].Wi83;FgY1<3
+f$r3tdEg+_bK@oH`Pf[2^q[Rq]",;Y['R$AY-"b)W2?AcTqJ!JS!o_2Q'@GoO,f0WM26n?K7e`*
+IXQQhH$=FRFE2A?DJa3*C1q9mARo:[@:3I(k3(q*kl9lIkkaKBk5UV6Oo1=<On+\/POan:gAfju
+f_jA!edp<\eC2jod*L%`cHXSVbKBh+!6G#,oUGTDs-`_Ppr36Nqnr*Dp;?[DoY^$hrh0.^pW!*N
+n&YILrQ>&]rQP/`rQbAdpUKV"n?rD_lK\?6qs+.GqWe(Es6:*[mI'H4o(2MHpA"I[r;HKlp<ET\
+!6a3@rlP)Zhba1H!W;rjs7XA1`:CnA`r!aT`"[65FED\MGBeCZH@($fI=?ZrJ:W=OK*I!_L5(J=
+M#N54MMmDlN;nk;Nr4t<OT(C;P4=b1P5UOBOSb+<NrG%9N;nh8MZ&D2M#W8-LAlo+K_^8tK(acl
+K)1-"K`6](LB!#/M#E/3MMmDlN"q>4NfT6_OHG]hPEV5rQ'R`&R$a;1rgO(]SXuFFT`1WuU8+N[
+V5C/gW2ZesX/rG*Y-5(6Z*L^B['d?N\%&uZ]">Vg^;%Fu_8=(,`Poj;aN2KGbKS5VcHjkbdF6Up
+e^i@(f\,!4gYCWAhr*GOioB([jQ5OdkNM0plKdd&m-X6/n*fc8nc&(\oCV\Sp&Facp\agdq>^<f
+qu6NkrUTr=s4[L'~>
+JcC<$JcFd1o`"jgrqu]ks8)ckrV1g8p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ij5].Wi83;FgY1<3
+f$r3tdEg+_bK@oH`Pf[2^q[Rq]",;Y['R$AY-"b)W2?AcTqJ!JS!o_2Q'@GoO,f0WM26n?K7e`*
+IXQQhH$=FRFE2A?DJa3*C1q9mARo:[@:3H<V>[:jVu!:gV=nlIEV?(&TDkG^Sc##RRfJoNRJM's
+FSU(SFT.[%Qi*0JQ/e21QhZsCHMr3dI/&'_RJ!$7S,/QRS,AfTSH,2ZSc4NDMtr8.Mtr8,M#`A,
+M#aRTX8]4#XoGL%XoGI&Xo,7%X/`6!WXc)2Xfek4Z*L^C[C*HP\GWo=\[p(QqN_,Hhba<i&B)K(
+`5T^8ai_iQd*U1gda@0>pQPH:'p3NXFED\MGBeCZH@($fI=?ZrJ:W=OK*I!_L5(J=M#N54MMmDl
+N;nk;Nr4t<OT(C;P4=b1P5UOBOSb+<NrG%9N;nh8MZ&D2M#W8-LAlo+K_^8tK(aclK)1-"K`6](
+LB!#/M#E/3MMmDlN"q>4NfT6_OHG]hPEV5rQ'R`&R$a;1rgO(]SXuFFT`1WuU8+N[V5C/gW2Zes
+X/rG*Y-5(6Z*L^B['d?N\%&uZ]">Vg^;%Fu_8=(,`Poj;aN2KGbKS5VcHjkbdF6Upe^i@(f\,!4
+gYCWAhr*GOioB([jQ5OdkNM0plKdd&m-X6/n*fc8nc&(\oCV\Sp&Facp\agdq>^<fqu6NkrUTr=
+s4[L'~>
+JcC<$JcFd1o`"jgrqu]ks8)ckrV1j9p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ij5].Wi83;FgY1<3
+f$r3tdEg+_bK@oH`Pf[2^q[Rq]",;Y['R$AY-"b)W2?AcTqJ!JS!o_2Q'@GoO,f0WM26n?K7e`*
+IXQQhH$=FRFE2A?DJa3*C1q9mARo:[@:3G?;cEZns&/tu<E8rr!E2nq;>`QU4oRYB5Q3k14m,$(
+:\dib;>F#g;>jAm;>j>f:\d9P5NtGp;"@K^;Yj8c;Y3HS8,c!T7JBXW;>j>i:\IW\;>X5n;c6Lj
+qbmAkrDM3>rC[#hs&\_m!EN4t<;ol)<`iL->$>-7>[:Y6?34J??1q4U;Ya8e;Vt=NFoul1F`dV(
+rcJHiG^=^aI!pD7<:X&]<r>r3EcZ>EG'A.TH$Xd`I!pElIt3'#K)UB,KS>/8LPL]bM#rQmMuJ\8
+N<#":O8k=@Onb+0PP:7=OoCI>O8b1=NVnb8MuJV4M>i>2L\li*L&Qc$KDU8oJbjupKE$W(L&Hc+
+LB*//M#rQmMuJYMNK0$[O-#HcP*2#mPa.N"QC!u+R@=,E"e;-TStD\TTkL0qUnjiaVl-JmWiE,$
+Xf\b0YctC<Za7$H[^NZT\[f;`]Y2%o^VI\&_Sa@3`lH0Aai_fNc-FV\d*^7ieC<%"f@S[.g=k<:
+h;7&Ii8N\Uj5f:_k2tjjl07L!lg4!*mdBQ4nF5uIncJFTo`"O`pAambq#C0iqYL*gr;?Nardk+'
+s*t~>
+JcC<$JcFg2o`"gfrqu]ks8)ckrV-EfpAX`1o^h\Fo'u5<n*]T0lg!a!kN:pfj5]+Vhqm2Eg=b-1
+f$r0rdEg+^bK7iG`PfX0^V7@m\[])UZa-g=XfSP%Vl$8bTqJ!JS!o_2Q'@GoO,f0WM26n?K7\W(
+IXQQhG^"=QFE2A?DJa3*C1q9mARo:[@:3I(jlZL(s60LIs60@Cplb$,o9/O*plYZAgAT^sf_a;!
+f)O82eC2mpdEp4ccHa\XbK@uLqj[GPp7)#Lq4%>Orl+oWrPefTqSW9Ks24`Np;?[DoY]mdr1Nf(
+qoA9K!6P,\q9/`\qT\uas3:Shp:07oqR6F5!pT"8r9O=Hqs4:I!pT"8rok!Zlg4!*n+#u?o_/%S
+qYU3iq>^-4s31DahTGc<hbX=Mr;$HkrUg-`_u@UF`V@IM`=9b+F*)MHG'A.UH?spcrd><+It3'#
+JqJ]/KS>/8LPL]bM#rQmMuJ\8NW5%:O8b7>Olqo*Oo:C=O8b1=NVe\7MuJV3M>rD2L\uo+L&H]#
+KDC,pJbjupKDpQ(L&Hc+L]<20M>rJ5MuJY9NK4"!IuoeTP*2#mPa.N"QC!u+R@9S6S"-%@StDXJ
+TqS3UUnjiaVPg>jWN)u!XKAV-YHY79ZEpmE[C3NQ\@K/^]Y(ql^V@S#_SX71`Q#s>aN;TJbg"GY
+cd:(edaZdsf%8O+g"P07gtgfChr*GOioB([jlY^gkiq?slKdg'mJlVSn,MkWnc&+Zo)SF]p&Fac
+p\jmeq>U6fqu-HkrUTr=s4[L'~>
+JcC<$JcFg2o`"gfrqu]ks8)ckrV-EfpAX`1o^h\Fo'u5<n*]T0lg!a!kN:pfj5]+Vhqm2Eg=b-1
+f$r0rdEg+^bK7iG`PfX0^V7@m\[])UZa-g=XfSP%Vl$8bTqJ!JS!o_2Q'@GoO,f0WM26n?K7\W(
+IXQQhG^"=QFE2A?DJa3*C1q9mARo:[@:3H<Uo"!drhoXjrh]1)j`1<@ol9nMpi-:Soq;2Srgs+[
+rLEeTs.'+Y".GXHRf&TNFS^.NFSU(XFSqNuQi330QN*<HR.Ye(Hh`!dHhWs(Rcg1>RerTQSGeuY
+SGo)WMYi=oMY`20MZ0[UXT,F%XT,F!XT,@!WrB%,XKJb2Z*L^C[C3NRrODp>rOL%:rg)G<qniZW
+`Q#s?bK\B3d/VJndc?SdPP^LPO`GMbFEMbNGBnL\H[Pg@%t9"YJ:W<)K7no3L5(J=M#N54MMmDl
+N;nn;Nr4t;OSt=)P5LI@OSb+<NrG%8N;nh8MYr>2M#N2-LAlo*K_^8rK)'uoK)1-!K`?c)LB!&/
+M#N82MZ8V6Mueourf;PjOcbfiPEV5rQ'R`&R$a;1R[]e:SXuFFT:hmOU8+N[V5C,fVl6SpWiN5'
+Xfek3Yd(L?Za@-K[^WcW\\#Me]tV7r^qmn)`5T^8a2l?Db0/#RcHab_dF$CleCE.%f@\d1g=tE=
+h;7&Ii8N\Uj5f=ak3(sml0@R"m-O->mf2bUn,W"Xo)J:]o_nI_pAamcq#C0hqYU0gr;HTbrdk+'
+s*t~>
+JcC<$JcFg2o`"gfrqu]ks8)ckrV-EfpAX`2o^h\Fo'u5<n*]T0lg!a!kN:pfj5]+Vhqm2Eg=b-1
+f$r0rdEg+^bK7iG`PfX0^V7@m\[])UZa-g=XfSP%Vl$8bTqJ!JS!o_2Q'@GoO,f0WM26n?K7\W(
+IXQQhG^"=QFE2A?DJa3*C1q9mARo:[@:3G?;H$Nm;?Kis<E8rr!`MuoofW+7rBBR2o03(:pHJCK
+pJC`aqG@2hrDEVmr_WMgq`jsCpcnU?q*FsEj\YPGlr*@Cpdb?Rr^HQXrDDuZq,.&fs&8\jrDWYm
+dS'R@!a&N*pK.Dsr`BA+<`N*u;cEWo$W^>1=BSg3>?kE=?N+=2?N4=&;rCRH;r:FMFo?C]F9Hc2
+G^4W4Hh15-<V9Dk<=EnhFEDYKGB\=YH@(&=I1LdVJ:N3&K7ei1Knb>;LPYqd!fDnorf$l:s,R#<
+rfI)@kE>b*rK-o;rf6u;qi(Q5regW1s+pZ0r.b3)rIk!!q1AEnqL\Qrre1<*rJ(?-s+pZ2s,-i7
+repl;NrG)hOHGZgP*;)oQ'IZ$Q^F/.R[T_8S=Q7CT:_dMTq\<XUnsrcVl-JmWiE,$Xf\b0YctC<
+Za7$H[^NZT\[f>b]Y2%o^VI\&_SjF4`lH0Aai_fNc-FV\d*^7heC<%"f@S[.g=k<:h;-rFi8ESR
+j5]4^k2tjjl07Kulg4!*s6fpUs6p$Yrpp*\!;-6_s7ZKerV6EgrqcNhrVZWmo)=4?gAc[~>
+JcC<$JcFg2o`"gfrqu]ks8)ckrqQNf!;?EbHM$h"o'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bfe,L`l5j4^q[Ur]=GG[[Bm0CYH=n+W2HJfU7n3NS=>q6QBdYsOH5B[MM[+CKnFu-
+Isl`lH?aXWFE;JBDf0E-CM@HpAn>L_@UWYOjQ5Lcr9*t@rTEL0r/pT6o99-;o99.+n_!ckrRV#!%
+b/tVda?Fgcd0n]c-4ARpRCuKpm_/Lq3qB'rl4oUs2=ZLrl"?EpVcaBjIuRG!6+cRrQ"NN"3J^.b
+Po`^bPKHXc2>iechb3K\DF^olN-A<qs+%Dqs".G&*rWNn*oo>p%J.UqYU6jrqcWprq=V5bl5f?b
+2H1r;?-Fpq"agbrq-6__u@UF`VRUM`?0/CFEMbNGBeCZH@($fI=?ZrJ:W9'K7ei2Knb>;LPYqds
+,-i7rf$l:rf6l:rK-l<plbH8r/g`8rf6u;qi(N4s,-]1s+pZ0qhG*(re1'!q1AKpq1AEps+LB*r
+J(?-s+pZ2s,$f7rf$l:!07&>'p+Q?P*2#mPa.N"QC!u+R@9S6S"-&KSctaZTqS3UrhNSkVPg>jW
+N)u!XKAV-YHY79ZEpmE[C3NQ\@K/]]=bei^;%Fu_8=+.`Poj;aN2KHbKS5VcHjkbdF-Ooe^i@(f
+\,!4gYCW@hV[8LiSrnXjQ5OdkNMp0!UB"MliHMArpKpXnaZVL!qZ'Vrq6<bs7cKerqZTjqtp?ir
+Vc<dJcFI(J,~>
+JcC<$JcFg2o`"gfrqu]ks8)ckrqQNf!;?EbHM$h"o'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bfe,L`l5j4^q[Ur]=GG[[Bm0CYH=n+W2HJfU7n3NS=>q6QBdYsOH5B[MM[+CKnFu-
+Isl`lH?aXWFE;JBDf0E-CM@HpAn>L_@UWYOUSFW]r20Cir20%(kAg<<qf24JrGhG%qk*kZs.0+Y
+s-rkT!1WtV".PaIRJ1h!Fn0YOFoQR^R.Zg<Q2m9<QN*<IR.5LpHiJBlHha$-RdZaFSF;sFSGSlR
+MYi>"MZ8P(MXRYHWr]6"r2L1,Xfek4Z*L^C[C3QSrOMs<"1PeM\'UKAQN*<KQJk[>;%(7W_SX4/
+`lH3Ebg$(3!n#HEifa,$qN;qAFEDYKGB\:WH?spcI=6QoJ:N3%JqJ]/KnY89LPL]bM>rJ5MuJ\8
+NW+t8O8Y1:Onb+8Oo1=:O8b1=NVe\6MuS\3M>rD2L\li*L&Qc#KDC,rJbaonKE$W(L&Hc+L]<20
+M>rG5MuJ\8N<#"<Ntmb=OcklkPE_>tQBml)R$jD3S"#q=rgj:cTV8'RU].&iV5C/gW2ZesX/rG*
+Y-5(6Z*L^B['d?N\%&uZ]">Vf]tV7r^qmn*`5T^8a2l?DbKJ,ScHab_dF$CleCE.%f@\d1g=tE=
+h;7&Ii8N\Uj5f=ak3(t-klL)8rp0[Qmf)YVnF?&JncJFTo`"O`pAamcq#:*hqYU0gr;HTbrdk+'
+s*t~>
+JcC<$JcFg2o`"gfrqu]ks8)ckrqQNf!;?EbHh?q#o'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC!dEp1`bfe,L`l5j4^q[Ur]=GG[[Bm0CYH=n+W2HJfU7n3NS=>q6QBdYsOH5B[MM[+CKnFu-
+Isl`lH?aXWFE;JBDf0E-CM@HpAn>L_@UWYO;c6Ll;uKSp;cN`rr)E5Lk<8E#o0<1;q+pZ[r)*;e
+s%rbor_j&";,C(d:esm_5lX(G5kdM>5l!_6;#O8i;"IQO;XHsK8,c!R;#4&Z;#!oc;?0Yh;Z9Vo
+;Z9A=9Dqrm=85nt=8uA*=&r=#<;fbq<!lW+=BJ^/>$P<<?N"47?<plC>[6_ri)9ALiDBMN%<Z`5
+EcZ;DFEMbOH$O`8HNJM?Hgt)+<VBJl<?H:(FEMbNGBeCZH@($fI=?ZrJ:W9'K7ei2Knb>;LPYqd
+s,-i7rf$l:rf6l:rK-l<plbH8r/g`8rf6u;qi(N4s,-]1s+pZ0qhG*(re1'!q1AKpq1AEps+LB*
+rJ(?-s+pZ2s,$f7rf$l:!07&>'p+Q?P*2#mPa.N"QC!u+R@9S6S"-&KSctaZTqS3UrhNSkVPg>j
+WN)u!XKAV-YHY79ZEpmE[C3NQ\@K/]]=bei^;%Fu_8=+.`Poj;aN2KHbKS5VcHjkbdF-Ooe^i@(
+f\,!4gYCW@hV[8LiSrnXjQ5OdkNMp0!UB"MliHMArpKpXnaZVL!qZ'Vrq6<bs7cKerqZTjqtp?i
+rVc<dJcFI(J,~>
+JcC<$JcFg2o`"jgrqu]krqZWjrV1j9p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;FgY1<3
+f$r3tdEg+_bK@oH`l5j4^q[Rq]",;Y['R$AY-"b)W2HJfU7n3NS=>q6QBdYsOH5B[MM[+CKS+l,
+Isl]jH?aXVFE;GADf0E-CM@HpAn>L_@UW['j5g7%!9X4Bqrn(CrKHi9rfcf6o98p5p65F-nCRcn
+f`'M$edp<\eC2jndEp7dcd'eZS"&`6qO@GPqO@H'rl+fRq8;mDqSW'Gou$U"l(J*Mq8WBRprNEU
+s2tAbnBCXO!7(Mgs18!9rODR1rj_=(s6B^PlhfuElN$5Jkn*.Glg4$.nac;Dp@nCZqu-Nks8W)u
+rV4Y3bl5f@b2Q7q;$?XgqYL0^s74)-`::hD`qmX_F*)MHG'A.TH$Xd`I/\NtIXcluJV*lR#D@eb
+L5(J=M#E/3MMmDkN;eh:Nqnb2OSk78OSFn8NrG%8N;eb7MYi81M#N2,LAlo*K_U2dK)(&uK`?c(
+LB!&/M#N82M?&S6N;nk;NrG(SOHGZgP*;,pQ'IZ%Q^F/.R[T_8S=TYN%\KDfTq\<WUnjiaVl-Jm
+ri/ntXKAV-YHY79ZEpmE[C3NQ\@K/]]=bei^;%J"_SX4/`Poj;aN;TJbKS5VcHjkbdF6Upe^i@(
+f\,!4gYCW@hV[8LiSrnXjQ5OdkNM-ol0@U6liHMArpKpXnaZVL!qZ'Vrq6<bs7cKerqZTjqtp?i
+r;H3cJcFL)J,~>
+JcC<$JcFg2o`"jgrqu]krqZWjrV1m:p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;FgY1<3
+f$r3tdEg+_bK@oH`l5j4^q[Rq]",;Y['R$AY-"b)W2HJfU7n3NS=>q6QBdYsOH5B[MM[+CKS+l,
+Isl]jH?aXVFE;GADf0E-CM@HpAn>L_@UWZ=U8+IaUo"!dr29OkrGhFJluD--qJcM-oUu#Ps.94\
+opc&PRf8cVRd"t`FT.[.R.Zg?QN!6MQiNKKQN!0GQN*<IR/)+&HLuOaHMO!-Re*$ESF;sGS,f,Z
+T)YAWMY`8!MYW,)MXdbLX/`3!WW&n+X/rJ-Yd(L?['[6M\Gj&=\G`o:[a1<8QJta=;$t.V_o'I5
+aND`Oc2Puhcd;[>i0*u$qN;8.FEDYKGB\:WH?spcrd=s!It3'#K)UB-KS>,7L51P?rJ:T5Mi7Om
+rf-r<q2b<4r/p`8plGB6rf-f6repc5qhb?/reLB*re:<(pk.pbq1J["s+UB*s+gW1re^Z4!/pi8
+s,@#=rf7eUOcbfiPE_;sQ'Rc'R$a;1R[]e:Sc52jT:hmOU8+KZUnsrdVl6ToW`,t"Xf\b0YctC<
+Za7$H[^NZT\[f;`]Y(ql^VI\&_Sa=2`Q#s>ai_fMbg"GYcd:(ee'umtf%8O+g"P07gtgfChr*GO
+ioB([jlY^gkih9qlKeH9!U]=SmfN"Knc&(\oCV\Sp&Facp\jmdq>^<gqu-HjrUTr=s4dR(~>
+JcC<$JcFg2o`"jgrqu]krqZWjrV1j9p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;FgY1<3
+f$r3tdEg+_bK@oH`l5j4^q[Rq]",;Y['R$AY-"b)W2HJfU7n3NS=>q6QBdYsOH5B[MM[+CKS+l,
+Isl]jH?aXVFE;GADf0E-CM@HpAn>L_@UWYE<)`fps&8ko!E2ts<W5tr4nCf&4nCl/5PdS<:\@Q^
+;>O)i;,[Bl!)ibm!)WPXr^$6Cp-8L@qEaRHl;?qHq+'sEq*tESqG7/hrDNYmp/(H[m8Em]s&/\f
+rCm2`!)26Br`B/%q,mVt"^"i,<)Z]m;[ZQ*<``C+>$>-8?!dM;!+,Y1s'5S.r`&;ahbsGPi_]PM
+rGqmZ"Eo!6H$T=6s*O67nQ#?brDa8IFEDYKGB\:WH?spcrd=s!It3'#K)UB-KS>,7L51P?rJ:T5
+Mi7Omrf-r<q2b<4r/p`8plGB6rf-f6repc5qhb?/reLB*re:<(pk.pbq1J["s+UB*s+gW1re^Z4
+!/pi8s,@#=rf7eUOcbfiPE_;sQ'Rc'R$a;1R[]e:Sc52jT:hmOU8+KZUnsrdVl6ToW`,t"Xf\b0
+YctC<Za7$H[^NZT\[f;`]Y(ql^VI\&_Sa=2`Q#s>ai_fMbg"GYcd:(ee'umtf%8O+g"P07gtgfC
+hr*GOioB([jlY^gkih9qlKeH9!U]=SmfN"Knc&(\oCV\Sp&Facp\jmdq>^<gqu-HjrUTr=s4dR(~>
+JcC<$JcFj3o`"gfrqu]ks8)ckrV-EfpAX`5o^h\Fo'u5<n*]T0lg!a!kiV$hj5]+Vhqm2Eg=k32
+f$r0rdEg+^bK@oH`PfX0^V7Co]",;Y['R$AY-"b)W2HGdTqJ!JS!o_2Q'@GoO,o9ZMM[+CKS+i+
+Isl]jH?aXVFE;GADf0E-CM@HpAn>L_@UW[&iT'"\jlZL(r9+1EPk^I?P4Xt5P5:CAPl6g9PkgO@
+g$IAifDjD+e^W*tdaHPAciDDfS*QUBS,\rRS,C8+`VmaI_t_1J_tM%B_Z6IoUALVa`VRUQ`rO3V
+ao0B\bPfWbc25`Wc2Greci;Aj](ro1\G`o2\F[3.lhp&Hli-2Jkn!(Flg4'.nFH5Ep\=U^r;HWo
+#ljo(rr2lpr;HK:qTSu_!6k5]il_;Cj\YkPrDE^mqu-'bs2=WK!5e]Pq8E-Kqo8NP&T`&9F`qtQ
+G^4R\H@($fI=?\FJ,t4Qrdt6)L&Qi,LB*//M>rJ5Mu8P6NW"mrO8P%;NV\V5MuJV2M>i>1L\li*
+L&Qc#KDC,pJbaooKDpQ(L&?Z,LPUcbM#rQmMuJY:NK0%uNrb?)rfRYQPa%GuQC!r*R$jEBRfT%M
+rgm_oTV8'RUSFW\V5C/gW2Q\qWiN5'Xfek3Yd(L?Za@-K[^WcW\[oDc]Y2%o^VI\&_Sa=2`Q-'@
+ai_fMbg"GYcd:(fe'umtf%8O+g"P07gtgfChr*GOioB([jlY^gkNM0plKeH9!U]=Sn,MkWnc&+Z
+o)SF]o`Fj]p\agdq>U6fqu6NkrUTr=s4dR(~>
+JcC<$JcFj3o`"gfrqu]ks8)ckrV-EfpAX`5o^h\Fo'u5<n*]T0lg!a!kiV$hj5]+Vhqm2Eg=k32
+f$r0rdEg+^bK@oH`PfX0^V7Co]",;Y['R$AY-"b)W2HGdTqJ!JS!o_2Q'@GoO,o9ZMM[+CKS+i+
+Isl]jH?aXVFE;GADf0E-CM@HpAn>L_@UWZ<U8"EXUo"!dr20OlpMotIrc.gUpi6.Nrc@OKpMp2)
+pRq8Qrgs(ZpRM2OmreSNq/u:NrgEeRpQtW?s-NYNrKmJKs-<DGs-NSLja6lNq3h2MoUGfL!1WqW
+n!a<IrLNqZs.0.H!/p`3oS`C"nqdL,XK/G'qlBk"XK;E%!36!ss/H^4XKAY/Z*L^C[C3NQ\@B#X
+\$u7Cd$OQos-;\Br)*Dj#/eBu`lH0CrQGDhcd:(drmCb0rK?i9q3(B6qiVP4FEDYKGB\:WH$Xd`
+I!pElJ,Xs!JV*lR!JH1+LB!#/M#E21MZ8V4N;nn9No?&sNrG%7N;eb7MYi80M#N2,LAlo+K_U2q
+K)'unK)1-!K`?c(L'!-dM#E/3MMmDlMuo!!NrG(?OHKO*$^6g>Q'IZ%Q^F/.Rf8cWS=TYNAtP`i
+Tq\<WUnjiaVl-JlWN)u!XKAV-YHY79ZEpmE[C3NQ\@K/]]=bei^;%Fu_8=(,`5T^9aN2KGbKJ,S
+cHab_dF-LneCE.%f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(pkl07L!rp0[Qmf)\Tn,W"Xo)J:]o_nFa
+p@n=Zq#C0hqYU0hr;?Nardk+(s*t~>
+JcC<$JcFj3o`"gfrqu]ks8)ckrV-EfpAX`7o^h\Fo'u5<n*]T0lg!a!kiV$hj5]+Vhqm2Eg=k32
+f$r0rdEg+^bK@oH`PfX0^V7Co]",;Y['R$AY-"b)W2HGdTqJ!JS!o_2Q'@GoO,o9ZMM[+CKS+i+
+Isl]jH?aXVFE;GADf0E-CM@HpAn>L_@UWYF<E)mp;H$Onr_`r!<)cjt<':"?p,r=;q`ad<qEFmC
+rBBg;qEFmAohY9XqGI2f!)`_ns&8np!)`ARs$?EFoKW:>r^$9TrD3>flr!1Kj[]2;qb[;irDNPj
+rD</am8EdZs&/hj!)E5^q+TmC!a&N*qH3Ys"BJK#;H!Hl$<1#+='8[0>?kH>r*BA/r`oD+s&K"s
+m8O$_r_qoVj\YkPrDEoAF)uGFG'A1UrH\9ds&JSgq,Qrcr`'POFEDYKGB\:WH$Xd`I!pElJ,Xs!
+JV*lR!JH1+LB!#/M#E21MZ8V4N;nn9No?&sNrG%7N;eb7MYi80M#N2,LAlo+K_U2qK)'unK)1-!
+K`?c(L'!-dM#E/3MMmDlMuo!!NrG(?OHKO*$^6g>Q'IZ%Q^F/.Rf8cWS=TYNAtP`iTq\<WUnjia
+Vl-JlWN)u!XKAV-YHY79ZEpmE[C3NQ\@K/]]=bei^;%Fu_8=(,`5T^9aN2KGbKJ,ScHab_dF-Ln
+eCE.%f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(pkl07L!rp0[Qmf)\Tn,W"Xo)J:]o_nFap@n=Zq#C0h
+qYU0hr;?Nardk+(s*t~>
+JcC<$JcFj3o`"gfrqu]ks8)ckrqQNf!;?EbJ+W@'o'u8>n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC"dEp1abfe,L`l5m5_8!^s]=GG[[Bm0CYH=n+WMcVhUS4?PSXZ(8Q^*euOcPN]Mi!7FL4k21
+J:;ooH?jaZF`_\EEGo`3CMRWtB4b^c@q&kShVdAPjQ5Ock5FK@kl$bGQ1pOBPPpa7PPUOBQ0sn8
+PQ'88gAfjkf`0P.f%&=#e'c[lrQtD1k+)18qo8ZTs2=9As2=oSou-RAq4db[n=olTqSrQUs2b)Z
+rlY2_r64QQqTf,erm:SSppoCoqR?Iis6BRK!:9^Ns6BXKs6:*[m-X60nac>Gp\F^arVcTls8Drp
+!<)i?qTSfZ!6Y&ZjN?X^qbd;is&/srrpg$e`;%7L_YqCK`;.CN`r!^aF*)MHG'8(RG^4U]H[Pg@
+#(D&PJ:W9'rdt6)L&Qi,L]<2/M>rJ5Mu8P4NW"n'O8Ft9NVSP4MuJV1M>i>1L\li*L&H]"KD0ur
+JbXinKDpQ'L&Hc+L]<20M>rJ5MuJY?NK0$[O-#HcrfR;GPl?pKQC%T<!L]DURfT%MrgjIhTV8'R
+U8+N[V5F6i:oL@nWiN5'Xfeh1YctC<Za7$H[^NZT\[f;`]Y(ql^V@S#_SX40`Q#s>aN;TJbKS5V
+cHjncdaQ^qe^i@(f\,!4gYCW@hV[8LiSrnXjQ6C'&Ei9Al0@U#m-O--mdKW6nF?MKs766_rUp3a
+s7cKes7uZjqtp?irVc<dJcFL)J,~>
+JcC<$JcFj3o`"gfrqu]ks8)ckrqQNf!;?EbGP(Lto'u8>n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC"dEp1abfe,L`l5m5_8!^s]=GG[[Bm0CYH=n+WMcVhUS4?PSXZ(8Q^*euOcPN]Mi!7FL4k21
+J:;ooH?jaZF`_\EEGo`3CMRWtB4b^c@q&kSU&LedU]7+iV>[:hVt"d+E;OYDEqaYMEqFANTD5)O
+TDY;\SbJZSS,RQpFSU(SFT.^)R/NBDQM$RFQBh62s-NSLid:WMqO.;Nn!j?Im[O6HrLEq[rLND7
+pP\g(nqm@Hq5jUsri5pr$EC/.Xfnt6ZEpsHrjDj:\Giu;[K*`5[ca"UR-p=9Q2m35;#=,g;ZBZ'
+_o9[<b0%oNbg"GZrm:\m!7Lh0rK?i9qNCK7r/qM1FEDYKG'A.TH$Xd`I/\NuIXcluJUrFPK)pXZ
+reCH.s+pW1s,-i7r/CT6rJp3)qi:W7q2G<2regQ/reUQ/qhG*(rIjrupO`?ppk&?pre19)rJ(?-
+s+pZ2s,-i7req)ANfK0]OH>V(Oo^c2rfmMMQi<?QR@=,E!M#_[SdM*_TqS3TUSO]^VZ*JiW2Zes
+X/rG*Y-+t4Yd(L?Za@-K[^WcW\[oDc]Y2%o^VI\&_Sa@3`lH0Aai_fMbg"GYcdC.ge'umtf%8O+
+g"P07gtgfChr*GOioB([jo4BRkNM0plKdd&m-X6/n*fc8nc&+Zo)SF]p&Facp\jmeq>U6fqu-Hk
+rUTr=s4dR(~>
+JcC<$JcFj3o`"gfrqu]ks8)ckrqQNf!;?EbHM$h"o'u8>n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC"dEp1abfe,L`l5m5_8!^s]=GG[[Bm0CYH=n+WMcVhUS4?PSXZ(8Q^*euOcPN]Mi!7FL4k21
+J:;ooH?jaZF`_\EEGo`3CMRWtB4b^c@q&kS<`W4"qG[Dls&/tu<E8EKr&sR6qEOpDmQ^Y6ohY3V
+qGI5g!)`_nr_rhpo0E1=qEXa=rBUBKpJC`_r_VrYmS`%7rC6]]s&&eos%rborD<Pko25KbrDW;c
+qc!Jlr(QfYoh=UCs&],#rDs,&=&i7"r_i_o#ujr,='/U/>?kJ3?4'tC>?kB:>$>-7<rH%b;uK\o
+;s7-B;#=,g;ZBYtF)lAGrHJ3cs*=Zjrd+NCnPo?bnQ,Zi%<HW5F`qqPGBeCZH@(&=I0P.MJ:N3%
+K)UB'KSBD[s+gW1rJCQ3s,6f6rJgc9l]:q'rJgW3repc5qMG3-reLB*re:<(pk/<mrIO`qqLed#
+re:<*s+gW1re^Z4s,6l8#E=b(O,oBaOoCLEPEc'3!LB)OQiWVDrgNqYSc52fT:hmOU8"EYUnssf
+Vbj=kWiE,$Xf\b/YHY79ZEpmE[C3NQ\@K/]]=bei^;%Fu_8=(,`Poj;aN2KGbKJ,ScHab`dF-Ln
+eCE.%f@\d1g=tE=h;7&Ii8N\Uj5f>$jq-_>l07L!lg4!*mdBQ4nF5uIo)J:]o_nI_pAamcq#C0h
+qYU0gr;HTbrdk+(s*t~>
+JcC<$JcFj3o`"jgrqu]krqZWjrV1F-p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi8<AGgY1?4
+f%&9udEp1`bKJ#K`l5j4^q[Rq]=GG[[Bm0CYH=n+WMcVhUS4?PSXZ(8Q^*euOcPN]Mi!7EKnP)0
+J:;ooH?j^YF`_\EE,TW2CMOStBP1pgA7K(W@,'MpiSrq[jlY_'kPs`GPkC=@Pl-gDPl6g@PQ7!D
+Pk^O>PQ7!EPlKG7gAfjlf`0P*f%&="rmLho!7:>,qjdPSopklJr5SZR!6"9BnAP%<pS.MXn=foV
+rPniWr5eiYrQ=u\lco7N!71YkqRZL5gpd@NrTjIL!pf4>rp0LI$L@'Hn+#u@pA"I\rVc]orr)cm
+!;lc?!R/gdbkfNZb4s0Db32\!;>jDj;t0h]`:_%E`;.CO`r!aSF;/k@GB\:WH?spbI!pElIt*!!
+JV&LQK*$^[L&Qi,LB*//M>iD4Mu&D1NU2]&NVSP3MuJV1M>i>1L\cc)L&H]"KDC,pJbaooKDpQ'
+L&Hc+L]<20M>rJ5MuJY?NK0$[O-#HcrfR;GPl?pKQC%T<!L]DURfT%MrgjIhTV8'RU8+N[V5F6i
+(9"44WiN5&Xf\b0YctC<Za7$H[^NZTrjau!]=bhk^V@S#_SX4/`Poj;aN2KGbKJ,ScHjkbdF-Ln
+eCE.%f@\d1g=tE=h;7&Ii8N\Uj5f>$jpUA9l07Kulg4!*mI'uB!V#XYo)J=]o`"O`pAamcq#:*h
+qYU0gr;HTbrdk+(s*t~>
+JcC<$JcFj3o`"jgrqu]krqZWjrV1m:p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi8<AGgY1?4
+f%&9udEp1`bKJ#K`l5j4^q[Rq]=GG[[Bm0CYH=n+WMcVhUS4?PSXZ(8Q^*euOcPN]Mi!7EKnP)0
+J:;ooH?j^YF`_\EE,TW2CMRWtB4b^c@q&kSStMeWUAgngUo"!ds/4jrpi6@Uqf;@Npi?1Ms.B(Z
+nt5iOs./nSq/tnCqK;^Xs-NeSq3^iAq3LuGrKmSOpQkiGqNq81i-PHMrL*JM!1WtVhjaY9pmpT*
+repQ/o83FHqlKasri6!t$EC/.Xfek4ZEppGrO2[6!4Ma3!4M-YpmCH8r0HPCqbd;ir)3pAaNDZI
+b0/#Rc2Q#kd*^:iqiguAp6#06p65B:rcAisG'A.TH$Xd`H[L6iIXcitJ:W<(rdt9*Kn]M\s+^T1
+rJCN2s,6`4r/L''qi1E1rJUZ4qMG3-reL?)re:<(pk/Boq18?nqLed#re:<*s+gW1re^Z4s,6l8
+#E=b(O,oBaOoCLEPEc'3!LB)OQiWVDrgNqYSc52fT:hmOU8"EYUnssfV\Z51WiE,$XKAV-YHY79
+ZEpmE[C3NQ\Gj#t]">Vg^;%Fu_8=(,`5T^8a2l?Db0.uPc-FY^dF$CkeC<%"f@S[.g=k<:h;-rF
+i8ESRj5]4^roOUOkiq?slKdg'mHs?@mfDqJrpp*\s7H<`s7ZKerV6Bfs8)WirVZWmo)=4?g])d~>
+JcC<$JcFj3o`"jgrqu]krqZWjrV1m:p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi8<AGgY1?4
+f%&9udEp1`bKJ#K`l5j4^q[Rq]=GG[[Bm0CYH=n+WMcVhUS4?PSXZ(8Q^*euOcPN]Mi!7EKnP)0
+J:;ooH?j^YF`_\EE,TW2CMRWtB4b^c@q&kS<E<-$<E/]ks&8t[k</]+mQ^J3!'gEGofr.Gnkf0[
+r_NSlr_i_o!($6Bog/L@oKN=@p/(Z_s%r/]r_`_nmS_q4!(Qf]r_`\l!)`_lnPT<arDW;cqc!Jl
+oM#0Wp.XaEs&]/$rE&u!(faO6;c6Ll<)cju='/R->$G9<?=$oC>[784qc`u!qc*,bpf./im8E.E
+qbd;ir)3W;Fo?IaGBit0s*FQBnl5Ebo2bijrcAisG'A.TH$Xd`H[L6iIXcitJ:W<(rdt9*Kn]M\
+s+^T1rJCN2s,6`4r/L''qi1E1rJUZ4qMG3-reL?)re:<(pk/Boq18?nqLed#re:<*s+gW1re^Z4
+s,6l8#E=b(O,oBaOoCLEPEc'3!LB)OQiWVDrgNqYSc52fT:hmOU8"EYUnssfV\Z51WiE,$XKAV-
+YHY79ZEpmE[C3NQ\Gj#t]">Vg^;%Fu_8=(,`5T^8a2l?Db0.uPc-FY^dF$CkeC<%"f@S[.g=k<:
+h;-rFi8ESRj5]4^roOUOkiq?slKdg'mHs?@mfDqJrpp*\s7H<`s7ZKerV6Bfs8)WirVZWmo)=4?
+g])d~>
+JcC<$JcFm4o`"gfrqu]ks8)ckrV-EfpAX`7o^h\Fo'u5<n*]T0lg!a!kiV$hj5]+Vhqm2Eg=k32
+f$r0sdEg+_bK@oH`Pf[2^q[Rq]",;Y['R$AY-"b)W2HJfU7n3NS=>q6QBdYsOH5B[Mi!7EKnFu.
+J:;onH?j^XF`_YDE,TW2CMIQsB4b^c@q&lsf%Ss:i8N_V!p&J*r9*g?rg!MLp6F[&mZmg:ptGc$
+lIZ6kf%&:!rmCeorLEGJqjdPSpRM/Ns2P)Zs2P)Xs2=<Bq8E3MrP\HJoV2/TnY5m#rlG#Zs2t>a
+rQONNq9B&fd*VR"rOVp;o=4e1m^W;_s6KaQqs4m[m-Es&m-O-.nF?,Bp\=R]rqu`orVc`nrqc]l
+p<<HXp<*-Qm)nWjqbd8hqGRAnnGi:%m)/e?rl+lVr5Aq_FEDYKGB\:Wrd"TlI/\NpIXh?I#_@SZ
+K7ei1Kn]M\s+gW1rJCN2repQ1m>^gurJUW3qMG3-rJ19)rIt6(pOi9npjr6mqLed#s+UB*s+gW1
+re^Z4!/pi8s,@#=rf7,BOcfX+!L&cIPl[2;rg3_SRf8cWS=TYNDkE\rTq\9VUnjiaVPg>jWN)u!
+X/rG*Y-5(6Z*L[AZa@-K[^WcW\[oDc]Y2%o^VI\&_Sa=2`Q#s>aN;TJbg"GYcd:(edaQ^qe^i@(
+f\,!4gYCW@hV[8LiSrnXjQ5Lck3(sml0@R"m-O-,mf)YVnF?&JncJFTo`"O`pAamcq#:*hqYU0g
+r;?Nardk+)s*t~>
+JcC<$JcFm4o`"gfrqu]ks8)ckrV-EfpAX`3o^h\Fo'u5<n*]T0lg!a!kiV$hj5]+Vhqm2Eg=k32
+f$r0sdEg+_bK@oH`Pf[2^q[Rq]",;Y['R$AY-"b)W2HJfU7n3NS=>q6QBdYsOH5B[Mi!7EKnFu.
+J:;onH?j^XF`_YDE,TW2CMIQsB4b^c@q&l8S=ZCIr1X4eV#7+EEVskUEVjePF7XGPEVQ3pTDP2[
+Sc5,^SXc7ASG%*fFSU%ZR/WNNR.cmAQMm0JQiNKKQN!6JR/MEjHh*W^S,]#TS`,J*Mu/D(M>sXR
+XT,=$XT#:#WrK+*XKAY/YctF>[/IB4[f3c9[f<`8[/78nQhQm:Qi369;#=,f;Yj;l<;joDb0/#Q
+c-FV\r6bD*rK?i9q3(K9r/q>,FEDYKGB\:Wrd"TlI/\NpIXh?I#_@SZK7ei1Kn]M\s+gW1rJCN2
+repQ1m>^gurJUW3qMG3-rJ19)rIt6(pOi9npjr6mqLed#s+UB*s+gW1re^Z4!/pi8s,@#=rf7,B
+OcfX+!L&cIPl[2;rg3_SRf8cWS=TYNDkE\rTq\9VUnjiaVPg>jWN)u!X/rG*Y-5(6Z*L[AZa@-K
+[^WcW\[oDc]Y2%o^VI\&_Sa=2`Q#s>aN;TJbg"GYcd:(edaQ^qe^i@(f\,!4gYCW@hV[8LiSrnX
+jQ5Lck3(sml0@R"m-O-,mf)YVnF?&JncJFTo`"O`pAamcq#:*hqYU0gr;?Nardk+)s*t~>
+JcC<$JcFm4o`"gfrqu]ks8)ckrV-EfpAX`5o^h\Fo'u5<n*]T0lg!a!kiV$hj5]+Vhqm2Eg=k32
+f$r0sdEg+_bK@oH`Pf[2^q[Rq]",;Y['R$AY-"b)W2HJfU7n3NS=>q6QBdYsOH5B[Mi!7EKnFu.
+J:;onH?j^XF`_YDE,TW2CMIQsB4b^c@q&kE;H-[t<E8rrr)3SWi]R3'r]^6ErBC0E!'^?Gs$6EF
+r''sApeU<Sr)!Vq;,C(d;>sGn;tWHQ5kRGB5kRA9;#F,h;".?I;VXbB;=dWS;=%3Y;u]bP9^YOR
+=8l>#=8l5%<E)rs;[u](<)lq!='/U/>?kE=?N+44>[(B9r*',)oi1K\pJh&hnP\[Lqbd8hqGRGp
+F`m\,s*"QiH$OZ6H2`-e<Uj&a<V0>l<=!YfFEMbNGBeE4H3&A?rd=frJ,Xs(JV&K+K7no3L&Qi,
+L]<2/M>iD3Mti7uNV8>0MuAP0M>i>0L\li)L&Qc"KDC,oJbaooKDpQ(L&?]*L]<20M>rG5MuJ\8
+N<#"<NrkE*OoCLEPEc'3!LB)OQiWVDrgNqYSc54!T:hmOU8"EYUnsrcVl-JmWiE,#XKAV-YHY79
+ZEggC['d?N\%&uZ]">Vf]tV7r^qmn)_o0O5`lH0Aai_fNc-FV\d*^7he'umtf%8O+g"P07gtgfC
+hr*GOioB([jlPXekNM0plK[^%m-X3.rpKpXnaZVL!qZ'Vrq6<bs7cKerqZTjqtp?ir;H3cJcFO*
+J,~>
+JcC<$JcFm4o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_npU&tn*f]2m-Es$l0%3kjQ#7Yi8<DIgY1?5
+f@AC"dEp4bbfe,La2Q!6_8!^s]=GG\[^<BGYcb+/Wi2hlUnXQTSt):<R$O#$P)t`aN/EIIL4t83
+J:E#rH[9s]G'.nIEH#i6Chmd"BP1pgA7K(We'uq#gtprHioB+]rT<j?qNq/Hpm'd%qN_)Hqj$m/
+s4R%srRq2&#hdk^f%&:!daJ#^s.'%WqOI5JqjdPQs.'+Y!65#YrPnlVp;HgF!Q;nP`;@OP`:q1>
+UA:MXUAU_^a8*jWb5TT^bj3OKcMl2h])0,9])B24\G*Q,\-20cmd9E>li?GOlj<(InF?)@p%S7W
+rqc]nr;?ZorVcWuqtg0bq9-tVbl#ZTb4j*Kb3i+';>a>f;uT_r<Up+``9bD?`;RXT`r*dYF*)MH
+G5c[nG^4U]H[L3hI=?WprdY$#K)L<'KS>-ZLB!&.M#<,/MZ/OmN;SV4MYW,.M#E,+LAci)K_U2r
+K(OWjK)1-!K`?c)LB!&/M#E/3MMmDlN;nk;NrG(JOHGZgP*;)oQ'IZ$Qi<?QR@=,E'V(_cStDXJ
+TqS3TUSO]^VP^8hW2]cr"fn`,Xfel,YR.S?Za7$H[^NZTrjb2']=bei^;%Fu_8=(,`5Ta:aN2KG
+bKJ,ScHab_dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4]jlY^gkl0fIlKeH9!U]=SmfN"Knc&(\
+oCV\Ro`Fj]p\agdq>U6fqu-HkrUTr=s4mX)~>
+JcC<$JcFm4o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_np0cpn*f]2m-Es$l0%3kjQ#7Yi8<DIgY1?5
+f@AC"dEp4bbfe,La2Q!6_8!^s]=GG\[^<BGYcb+/Wi2hlUnXQTSt):<R$O#$P)t`aN/EIIL4t83
+J:E#rH[9s]G'.nIEH#i6Chmd"BP1pgA7K(WR@9V:TV/!Prh9FgV#I43EVjeVF7aMHT^JHOSck[W
+SXl;LSaLXbFT$=^R/WNCR/*'KQMm0KR/WHLQMm0IR/23nHi/3]Rc'\6SGf#YS,f,<MZ/P1MY2i(
+XSo4"XSo1+XKAY.YHP4:Za9P:rjMj7rj;X3s0hrpjHoV.oU#NBmSNdXr)3>hr_s5)aiMTHbK\8T
+cHlI9s3^Y+rK?i9qNCT:rK7;)FEDYKrc\`pH$Xd`I!g?jIXZeGJ,t4QrIY0)Kn]M\s+gT0r/(E1
+reo`or/:N2q2,*,rJ19)rIt3'pk/EpoRZjjqLed#s+UE+s+gW1rJ:T5Mi7Rns,@#=rf7JLOcbfi
+PEV5rQ'R`&rg3_SRf8cjS=Q7CT:_dMTq\9VUnjiaVPg>jWW&n$X/rG*Y-7i/$*geBZa@-K[^WdG
+\NRO9]Y(ql^V@S#_SX4/`Q#s>aN;TJbKS5VcHjkbdF-LneCE.%f@\d1g=tE=h;7&Ii8N\Uj5f:_
+k2tjjrojIKli-5OmI'uB!q>aMrpg-^o^r+T!quB_r:p<frqcNhrVZWmo)=4?h#Dm~>
+JcC<$JcFm4o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nosWnn*f]2m-Es$l0%3kjQ#7Yi8<DIgY1?5
+f@AC"dEp4bbfe,La2Q!6_8!^s]=GG\[^<BGYcb+/Wi2hlUnXQTSt):<R$O#$P)t`aN/EIIL4t83
+J:E#rH[9s]G'.nIEH#i6Chmd"BP1pgA7K(W;GpFm<`]3"qGd;Qk</Q'nim(:mQLV8q+pc^s&&Jd
+r_`\n##S2n;,L4hqa(!DoKi.8q`b'Go2+jPku%LNiCEf8!)`AbnPSdRpf%2jrCbj<oh5<er`B)"
+!``9$r`&nr!*&ns"'8T-=oMV*>l@t.>PhV&>P1t`;tj8h;tX&V;#=,f;Ya8j<!cQIF`qtQG^4RZ
+r-8<hHhg\3<;KVe<WuKEFEDYKrc\`pH$Xd`I!g?jIXZeGJ,t4QrIY0)Kn]M\s+gT0r/(E1reo`o
+r/:N2q2,*,rJ19)rIt3'pk/EpoRZjjqLed#s+UE+s+gW1rJ:T5Mi7Rns,@#=rf7JLOcbfiPEV5r
+Q'R`&rg3_SRf8cjS=Q7CT:_dMTq\9VUnjiaVPg>jWW&n$X/rG*Y-7i/$*geBZa@-K[^WdG\NRO9
+]Y(ql^V@S#_SX4/`Q#s>aN;TJbKS5VcHjkbdF-LneCE.%f@\d1g=tE=h;7&Ii8N\Uj5f:_k2tjj
+rojIKli-5OmI'uB!q>aMrpg-^o^r+T!quB_r:p<frqcNhrVZWmo)=4?h#Dm~>
+JcC<$JcFm4o`"jgrVZTjs8)ckrqLs:p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bfe,L`l5j4_8!^s]=GG[[Bm0CYH=n+WMcVhUS4?PSXZ(8Q^*euP)t`aN/EIIL4t83
+J:DuqH[9s]G'%hHEH#f5Chmd"BP1pgA7K(We'eZRe^rO2hV[;Oj5p:&qNg]=rg*AFhin,+qNh/H
+s$?>3s4R/!qq1u%rn.J-f@JL%e+B1.S,/Z@RfSttrl=uWrPeQMqnr3IqSiEOpquNo!28nVs.T>2
+qoSl\s3(;`rltJg!71SgoZd?[r6PAhpU^C:pU^@7ppfh(r4)dprpBaPs6TjTmJcMYn*ol=o_%qQ
+rVH6c#5e8mqYBp]qoel\r6+QOpWN3OnPK'Zr)3>hr`&ks!*8[j!5nQLkemG=qS`SYFEDYKrc\Bf
+H2`*jH[Pg@#C_/PJ:N3%K)L<'KS>-YLB!&.M#<,.MYrD"N;AJ1MYW,-M#N2+LAci)K_U2rK(4Eh
+K)1-!K`?c)LB!&/M#E/3MMmDlMuo!!NrG(?OHKO*,a4IWQ'IZ$Q^F/.R@9V7S=H.AStDXJTqS3U
+USO]^VP^8hW2]cr<3*+&Xfek2YctC<Za7$H[C3NQ\@K/]]=bei^;%Fu_8=(,`5T^8a2l?Db0.uP
+c-FV\d*^7he'umtf%8O+g"P07gtgfChr*GOioB([jQ5OdkNMp0!UB"MliHMArpKpXnaZVLs766_
+rUp3as7cKes7uZjqtp?irVc<dJcFO*J,~>
+JcC<$JcFm4o`"jgrVZTjs8)ckrqLm8p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bfe,L`l5j4_8!^s]=GG[[Bm0CYH=n+WMcVhUS4?PSXZ(8Q^*euP)t`aN/EIIL4t83
+J:DuqH[9s]G'%hHEH#f5Chmd"BP1pgA7K(WrgEkWT)PD_U&UhhUSO]^qJcLUbAm)ns$?=Nn"0TO
+rh'4^rLNk0m<.]9!1<bRn<ij7q3_/Js-EVMr0[5+pNuRZr-SHirgWSLqO@MRlC7gDqjdeYSXnYq
+rJU<*r/(ESr2]gu$E^D3Xfeh1YctC<rNuO2rjDg7rNuU4rO2TjjHoV.pQtlFnPK'Zr)3>hr`&ks
+"'3Lbb5TQdbg+P\rm:\m!0[/ArK?u=rK?]7rK7;)FEDYKrc\BfH2`*jH[Pg@#C_/PJ:N3%K)L<'
+KS>-YLB!&.M#<,.MYrD"N;AJ1MYW,-M#N2+LAci)K_U2rK(4EhK)1-!K`?c)LB!&/M#E/3MMmDl
+Muo!!NrG(?OHKO*,a4IWQ'IZ$Q^F/.R@9V7S=H.AStDXJTqS3UUSO]^VP^8hW2]cr<3*+&Xfek2
+YctC<Za7$H[C3NQ\@K/]]=bei^;%Fu_8=(,`5T^8a2l?Db0.uPc-FV\d*^7he'umtf%8O+g"P07
+gtgfChr*GOioB([jQ5OdkNMp0!UB"MliHMArpKpXnaZVLs766_rUp3as7cKes7uZjqtp?irVc<d
+JcFO*J,~>
+JcC<$JcFm4o`"jgrVZTjs8)ckrqLm8p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f%&9udEp1`bfe,L`l5j4_8!^s]=GG[[Bm0CYH=n+WMcVhUS4?PSXZ(8Q^*euP)t`aN/EIIL4t83
+J:DuqH[9s]G'%hHEH#f5Chmd"BP1pgA7K(WrDN\qr`9&!qc*DRlTFu+nilS,pce^Dq+plaqbd)a
+r_`\n!Du\m;>!6I6MNk=5QF%?;"%9G;Z&u\7d!;A7K?<W;"[]Q;ZB\m<;ohp9)D969`.Q_=8c/#
+<EB*!r`&kss&K/%=T)D/>?kH=>[(E9=oDM)>?q/3nPnpTpJh)ipepWYqGI/gq,@8lr`';+FEVkQ
+GB\=XG^045!d]2mq,QranQ#Qh"]]VcFEMd+G6)r6rd"TlI/\O!IXcitJ:W9'rIY0)Kn]J[s+gT0
+r/(B0r/9s$qMY9/q2,'+reL?)rIt3'pk/EpnU^RhqLed#s+UE+s+gW1rJ:T5Mi7Rn!f`5#rf7)A
+OoCLhPE_;sQ'R`&R$a;0R[]e:S=Q7CT:_dMTq\<WUnjiaVPg>jWW&nsX/rG*Y-5%5Yd(L?Za@-J
+[^NZT\[f;`]Y(ql^V@S#_SX4/`Poj;aN2KGbKJ,ScHab_dF$CkeC<%"f@S[.g=k<:h;-rFi8ESR
+j5]4]jlY^gkl0fIlKeH9!U]=SmfN"Knc&+Zo)SF]p&Facp\jmeq>U6fqu-HkrUTr=s4mX)~>
+JcC<$JcFp5o`"gfrqu]ks8)ckrV1d7p@e1Po^h\Fo'u5<n*]T0m-<j"kiV$hj5].Wi83;FgY1<3
+f$r3tdEg+_bK@oI`l5j4^q[Rq]",>Z[Bm0CYH=n+WMcVhUS4?PSXZ(8Q^*euOcPN^N/EIIL4k22
+J:DuqH[9p\G'%hHEH#f5Chmd"BP1pgA7K(WrmM8)e^iF.h;7)Lj5f>#QL^C<QMQm:Pkp[APkLCB
+QMs2BgA]e&f_!i"f[n^)eFfC$SF2mHa8![Q`VmaO_uIXT`Vd[K`W*mO_sF,tU%"fVaSO$YaoKW\
+bl5lbcN)8hci;;ec25f_ci;Ac])TD:](`c8\Eg^*mf)STmd9HAmf;kVnH8@Sp%SF\rVQKi"9&/o
+qYp<iq"Mu2bl#ZOb4j*Rb4SU,;>X8e;uTbp<W6%is8U"4`95&;`;@ORF:iY=G'A.TH$O^^H[L3h
+I=?Wprdb$"!.t0%s+LE+rJ(?-reUE-r/0m"qhk-)rJ:E-qM+s&rIjruqh"3dr.=ctre1<*rJ(?-
+s+pZ2s,-i7repo<NfO+"!K`HCOsH6UPa.N"Q^=),R@0M5S"-">St;RITV8'RUSFW\V5C,fVl6To
+WWB0%riH@,YHY79ZMq0:['d?N\%&uZ]"@sS3k`8B^VI\&_Sa=2`Q#s>aN;TJbKS5VcHjkbdF-Ln
+eCE.%f@\d1g=tE=h;7&Ii8N\Uj5f:_k2tjjrojIKli-5OmI'uBs6p$Yrpp*\!;-6_s7ZKerV6Eg
+rqcNhrVZWmo)=4?h#Dm~>
+JcC<$JcFp5o`"gfrqu]ks8)ckrV1d7p@e1Po^h\Fo'u5<n*]T0m-<j"kiV$hj5].Wi83;FgY1<3
+f$r3tdEg+_bK@oI`l5j4^q[Rq]",>Z[Bm0CYH=n+WMcVhUS4?PSXZ(8Q^*euOcPN^N/EIIL4k22
+J:DuqH[9p\G'%hHEH#f5Chmd"BP1pgA7K(WrgNtXS"9MN!29@crGhXRlZ)lBol9hKqJl.Jr^$1L
+l_"0Js./V%ol]\Es-`ADqNq5L!1EDFqj75Jr-eEhp3Z:Ts-rbOqj[MPqO@MT!hGjOqO@DQpRU/u
+rJU-%s/c.!"g"i.Y-+u-Xobf2ZMh-,[/dZ5[0!_C[J[K-R/30LR-p=8R/**KQM")M;>X8e;uTbp
+<W6#(ai_cMbg"GZrQtPks-!2ArK?u=rK?`8rK@2&&Tr8?GB\:WH$Xd`I!g?jIXZeGJH(0#K)L?%
+K`?c)LB!&.M#)u+MX??!MYDu+M#E,*LAci)K_U2sK'e-eK)1-!K`?c)LB!&/M#N82MZ8V6Muo!!
+NrG(?OHKO*,a4IWQ'IZ%Q^F/.R@9V7S=H.AStD[KTqS3UUSO]^VP^8hW2]cr!NW=$XTbl2YctC<
+rj)p<[C3NQ\@K/]]DfH(]tV7r^qmn)_o0O5`lH0Aai_fMbg"GYcd:(edaQ^qe^i@(f\,!4gYCW@
+hV[8LiSrnXjQ,Fbk3(t-klL)8rp0[Qmf)\Tn,W"Xo)J:]o_nI_pAamcq#C0hqYU0gr;HTbrdk+)
+s*t~>
+JcC<$JcFp5o`"gfrqu]ks8)ckrV1d7p@e1Po^h\Fo'u5<n*]T0m-<j"kiV$hj5].Wi83;FgY1<3
+f$r3tdEg+_bK@oI`l5j4^q[Rq]",>Z[Bm0CYH=n+WMcVhUS4?PSXZ(8Q^*euOcPN^N/EIIL4k22
+J:DuqH[9p\G'%hHEH#f5Chmd"BP1pgA7K(Wr`&nr!*&qus&K"srB':,p-%h-mlg\7r^$?Uqb[)c
+q,%#es&/em!(-<Dr^-6Eqa19JpH\LMmSO$`;,QRUpdP*Mk=>2Aqbd>hs&&2^r)<Dj!E2tq9)D9M
+9`7]c9`7]S9`J2i<r,es<`o<'r`fA,s',D)qHNAemSijZr)<MkohbH]qbm5gr`&hrr`02GGB\:V
+H2`'gH2`*kHW3u?<Uj&Z<W6#5<HN>*G'8(RG^4R\H@($eI=6QnJ,XuuJH1<#KE$W)L&Hc+L]3,+
+M>W7uMu/D+M>`8/L\cc(L&H]"KDU8fJc(,rKDpQ(L&Hc+L]<20M>rJ5MuJY:NK0%uNrb?)rfSOj
+Pa%GuQC!r*R$jA2S"#q<SXuFFTV/!PU8+KZUnsrcVl-Jmri-""XT#=*Y-5(6Z*OA8$+.+K[^WcW
+\[oEP]K3a?^V@S#_SX4/`Poj;aN2KGbKJ,ScHab_dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4]
+jlY^gkl0fIlKeH9!U]=Sn,MkWnc&+Zo)SF]p&Facp\jmeq>U6fqu-HkrUTr=s4mX)~>
+JcC<$JcFp5o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noO?jn*f]2m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@JI#dF$:cbfe/Ma2Q!6_SEq"]XkY_[^<BGYcb+/Wi2hlUnXQTSt2@>R$X)&P*(fcN/NRMLPCJ7
+Jq/?!I!^0aGBS(MEcH&9DJX*'BkV-kARo:[daJ*C#h7DVg"Y?>ioBQqq3LiAl]g\"rB^/2kLfmg
+fC>EjSH#)Ya8*aQ`VmaP_u@UC`;mjQ_sa?"U[b)WUBRC5aN;QHrlG2`bP06\blH&gci;;bchG`]
+ci;Ab])K>:]&1'umeuS`nF,l9nac8Bo_/"Qq>(!crVQQk!rMiiqY9^+!6kDbn&k1Dqo\b3pJLfc
+pf%/krDibr!*Adl!5e`QqS_O6rl"cSs)e9`"a5*6G^+N5H3&A?rdFfq!.Xuus+(0%rIb-'s+UB*
+s+gQ/pkeBqp5/^'rJ13'rIt3'pk/Hql@JncqLed#s+UE+s+gW1re^Z4s,6l8#E=b(O,oBaOoCLE
+PEc'3)O?_VR$a;1R[]e:SXl@DT:hjNTq\<WUnjiarhfdqWW&muX/u<&;6I+,Yd(L>Za7$H[^NZT
+\@K/]]=bei^;%Fu_8=(,`5T^8a2l?Db0.uPc-FV\d*^7he'umtf%8O+f\,!4gYCW@hV[8LiSrnX
+jQ,Fbk3(t-klL)8rp0[Qmf)\Tn,W"Xo)J:]o_nI_pAamcq#C0hqYU0gr;HTbrdk+)s*t~>
+JcC<$JcFp5o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no=3hn*f]2m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@JI#dF$:cbfe/Ma2Q!6_SEq"]XkY_[^<BGYcb+/Wi2hlUnXQTSt2@>R$X)&P*(fcN/NRMLPCJ7
+Jq/?!I!^0aGBS(MEcH&9DJX*'BkV-kARo:[qjRYWSY#hQ!hc9^nT+/>oPjSFl>lhhp7UT@s.8M!
+k]QoIs-`ADqj7;Lr0d/Drg3SNpjN$eom?:Vs-rhQr1!MNqj[PSr13VQqOI_YSXk\qMYrD%MYsRT
+XoGR&Y6D/8Z*L^BrNuO2s0hd3r3l6bs-NPKoU#-9qj.;KqG?o`qbm2fr`&hrr)O#'b0/#Qc-H75
+s3LbnrK?u?rK@#>rK?`8rf[;'s)eKgGB\:VH2`*jH[Pg@s*artrdb$"!.t0%s+LE+r.b6,rJ:6*
+m>CUor.t<,q1ej%rIjruqh"*arIXlure1<*rJ(?-s+pZ2s,-i7req)ANfK0]OH>V(Oo^c2rfnCf
+Q^=),R@9S6S"-%?St;RITV8'RUSFW\V5F6i!N<!sWWB0%riK&#YHY79ZEggC['d?N\%&rY\[oDc
+]Y2%o^VI\&_Sa=2`Q#s>aN;TJbKS5VcHjkbdF-LneCE.%f@\a/g=k<:h;-rFi8ESRj5]4]jlY^g
+kl0fIlKeH9!U]=Sn,MkWnc&+Zo)SF]p&Facp\jmeq>U6fqu-HkrUTr=s4mX)~>
+JcC<$JcFp5o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no=3hn*f]2m-Es$l0%3kjQ#:Zi8<DIgtLH6
+f@JI#dF$:cbfe/Ma2Q!6_SEq"]XkY_[^<BGYcb+/Wi2hlUnXQTSt2@>R$X)&P*(fcN/NRMLPCJ7
+Jq/?!I!^0aGBS(MEcH&9DJX*'BkV-kARo:[q,@Gr<`W6"<9ZOA4TI\<4nLr+4oI\C:\[c^;>a8f
+;#jMn;>`cO62j4I6i04C62s4G;!h-C;Y3EU7d<JG;,C(dqb[2fqb[;ir_ibno2>KbqG[Mp<)i`e
+qb-BOn4iUMr`Attr)Eo$='&L,=oDM(>Q.n+>Q7n'>6%pn<:j,Z<;]Yp;Yj5a;>X8d;uTbp<W#ku
+=*FRf!-eBdr-J<@q,QubnQ#Tis)e9`"a5*6G^+N5H3&A?rdFfq!.Xuus+(0%rIb-'s+UB*s+gQ/
+pkeBqp5/^'rJ13'rIt3'pk/Hql@JncqLed#s+UE+s+gW1re^Z4s,6l8#E=b(O,oBaOoCLEPEc'3
+)O?_VR$a;1R[]e:SXl@DT:hjNTq\<WUnjiarhfdqWW&muX/u<&;6I+,Yd(L>Za7$H[^NZT\@K/]
+]=bei^;%Fu_8=(,`5T^8a2l?Db0.uPc-FV\d*^7he'umtf%8O+f\,!4gYCW@hV[8LiSrnXjQ,Fb
+k3(t-klL)8rp0[Qmf)\Tn,W"Xo)J:]o_nI_pAamcq#C0hqYU0gr;HTbrdk+)s*t~>
+JcC<$JcFp5o`"jgrVZTjs8)ckrqQNf!;?EbG4bCso'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC"dEp4bbfe,La2Q!6_8!^s]=GJ][^<BGYcb+/Wi2hlUnXQTSt):<R$O#%P*(fcN/NOKLPCJ7
+JUi5uI!^0aGBS(MEcH&9DJX*'BkV-kARo:[rmL_n#1_;Wg>1WDm?[g=pQb33!0d5Cn!3f:pY+`^
+!8-t7qOQW9s2XfPrl+fRl,EY?r58$!rLs:en=ooWrlP,]!6b)[s3:DcrQkDgnBV*]qRcU8rk%p9
+iOT!W!q>aMrU:6co()DEp@n=Vq>'m`rVQQk!rMiirV-BerqHKfm`Y1Dlc]=Nr_W;cqbm2frD`br
+qc<\t!*Jmnrke]QqS_L5s2=oUs)e9`!-\?c!I/nhH3/G@I/\NqIXckHJH(0#K)L?%K`6]'LAlu,
+LuF3fM#E,)LAci(K_U2tK)'ukJGFcpK):3"K`?c)LB!&/M#N82MZ8V6Mueourf@)@!0R8D!L&cI
+Pl[2;rg3_SRf8cWS=TYN!M?%aT`Lm_rhKRkVZ*IoW2]cr!NW=$XU;57YctC;ZEpmE[JmTe\%&uZ
+]">Vf]tV4q^VI\&_Sa=2`Q#s>aN;TJbKS5VcHjkbdF-LneCE.%f@\dUg'QNhh;-rFi8ESRro4RN
+jlY^gkih9qlKdd&m-X6/rpKmWnbr"[oCV\Sp&Facp\agdq>U6fqu6NkrUTr=s5!^*~>
+JcC<$JcFp5o`"jgrVZTjs8)ckrqQNf!;?EbG4bCso'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC"dEp4bbfe,La2Q!6_8!^s]=GJ][^<BGYcb+/Wi2hlUnXQTSt):<R$O#%P*(fcN/NOKLPCJ7
+JUi5uI!^0aGBS(MEcH&9DJX*'BkV-kARo:[q3qDUT)G8]T^6^nEUIfAEURrG62.&ITDkMQTBCC^
+FoRlmR/!*=R/VR1IJS?aHhD^\Rf&ZMRf&WTSGf#VT(SZPS,f,VMrKWlMt)])X9,N,YPkX&Y6D/8
+ZEggCrj;R1s0ha2rjDg7k*Z"3n<j'=r_W;cqbm2frD`brqc<\t#$B'mc-=PZrQbPldF%lTq31c?
+q2tW=oTT9;s)e9`!-\?c!I/nhH3/G@I/\NqIXckHJH(0#K)L?%K`6]'LAlu,LuF3fM#E,)LAci(
+K_U2tK)'ukJGFcpK):3"K`?c)LB!&/M#N82MZ8V6Mueourf@)@!0R8D!L&cIPl[2;rg3_SRf8cW
+S=TYN!M?%aT`Lm_rhKRkVZ*IoW2]cr!NW=$XU;57YctC;ZEpmE[JmTe\%&uZ]">Vf]tV4q^VI\&
+_Sa=2`Q#s>aN;TJbKS5VcHjkbdF-LneCE.%f@\dUg'QNhh;-rFi8ESRro4RNjlY^gkih9qlKdd&
+m-X6/rpKmWnbr"[oCV\Sp&Facp\agdq>U6fqu6NkrUTr=s5!^*~>
+JcC<$JcFp5o`"jgrVZTjs8)ckrqQNf!;?EbG4bCso'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC"dEp4bbfe,La2Q!6_8!^s]=GJ][^<BGYcb+/Wi2hlUnXQTSt):<R$O#%P*(fcN/NOKLPCJ7
+JUi5uI!^0aGBS(MEcH&9DJX*'BkV-kARo:[pf%Ds<`W4#<:rBL4TI\B4oRY54o%8A5Q!_<4o@VD
+:\7KZ;?'Jd;>EQM62O"F6iKFF62FFJ;>jAm;<LjR7Is"88,cB`;#O8e;#*ub;Yj>g<;]Yp<;9)`
+9Bo4C:&%E[=8l7u<<ZE)=BJ^/r`];*r*95*!*];)r`nSbqGZ]Zs&8nnp/1]bpf%,jr`/hrr`9,&
+GlDpeGlN'eH2pnB<;BPa<:NugFT6I`G5c[dG^9:7!df<Brd=isIt.HJs+(0%rIb-'re:9)reLH.
+iJIGfrJ13'rIt0&pk/Krq186iq18Krqh+m$s+UE+s+gW1re^Z4s,6l8!KE-=O8k:AOoCLEPEc'3
+!LB)OQiWVDrgNqYSc52]T:l1W!MZ@gU]I<hrhfdqWW&muX/u<&$EgS:Yd(I=Za7$HrjFGg\@K/]
+]=bei^:q@s^qmn)_o0O5`lH0Aai_fMbg"GYcd:(edaQ^qe^i@(f\-8X$/=7kh;7&Ii8N\pit1;5
+k2tjjkiq?slg*p(mI'EAmfDqJrUL$]o^r.Us7ZKer:p<frqcNhrqu]mo)=4?h>`!~>
+JcC<$JcFs6o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;FgY1?4
+f%&9udEp1`bKJ#K`l5j4_8!^s]=GG[[Bm0CYH=n+WMcViUnXQTSt):<R$O#$P)t`bN/NOKL5(A6
+JUi5uI!U*`GBS(MEcH&9DJX*'BkV-kARo:[rR1Vm"Ou#Sg"Z"_q3L]=n!*1(qa'o/pY#T#s4RA)
+q:Y5,r12o=!6FrUrl4iSrl4oWrl4`P!64oTrl"cQ!6"H'rM9@dn"Kr[aiV]Jrlb)\rlt8ar6P>g
+r6bGh!mf6?r6P>Rqn2m>s183Apq#Fp!V,a[nc/+YnI"m[p@n=Vq"aa^qY9phqYBp]p]&D)bOis@
+bP+m1;YX2h<;fho<rQ2"=S)Oo_8=(g_u.I6_u@US`W(#\Fa!b.!dK!9rd"TlI/\QoIfFosJH(3#
+K)L?%K`6]'LAco)M!^&qM#<&'LAci(K_U2tK)1&eJGausK):3"K`?c)LB!&/M#N82M?&S6N;nk;
+NrG(EOHGZgP*;)orfmMMQi<?QR@=,E!M#_[ScPIVrh0@eU].%iV5F6i!N<!sWWB0%riI<GYHY79
+Z*L^B['d<M[^WcW\[oDb]Y(ql^V@S#_SX4/rl$5(a2l?Db0.uPc-FV\d*^7he'umtf%8O+g"P07
+gYCW@hV[8LiSsjs&EMs8k3(sll07L!lg4!*mdC)C!q>aMrpg-^o^r.Us7ZKer:p<frqcNhrVZWm
+o)=4?h>`!~>
+JcC<$JcFs6o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;FgY1?4
+f%&9udEp1`bKJ#K`l5j4_8!^s]=GG[[Bm0CYH=n+WMcViUnXQTSt):<R$O#$P)t`bN/NOKL5(A6
+JUi5uI!U*`GBS(MEcH&9DJX*'BkV-kARo:[pmVDVSXuIGpi?7QpN#qHp2KkJluMth!2&tXq4IVY
+s.B=apRgJhlZE2qkEtq1o9fE(qL/3foR$=YqO7GR!h,UJrL*eWR[X2ErLEkXs.9"Xr1<nYrL<nZ
+N;eb4N;\[tMYrD'M?'gXYPt^)Y6D/8ZEggCrNuI0!4ML,igBb4m[3m<pJLcbpf%,jrDi_qr`B)$
+"O#$6cHZ@6s3L_ls3^_,q31c?q2tW=oooB<s)\9aG5c[eG^4T6H3&A?rdFfqs*t#us+13%rIb-'
+re:9)rJ19+m>:[qr.k'%rIt0&pk/KrqLS*cr.4fuqh+m$s+UE+s+gW1re^Z4!/pi8s,@#=rf7;G
+OcbfiPEV71Pl[2;rg3_SRf8cWS=TYN!M?%aT`Lm_rhKRkVZ*IoW2]cr!NW=$XWXdMYctC;ZEpmE
+[C*HO\%&uZ]">Se]Y2%o^VI\&_Sa=k`?rUFaN2KGbKJ,ScHab_dF$CkeC<%"f@S[.g=k<9gtgfC
+hr*GOir7sLjQ5OdkNM-ol0@U#m-O--mf)YVnF?&JncJFTo`"O`pAambq#C0hqYU0gr;HTbrdk+*
+s*t~>
+JcC<$JcFs6o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5<n*]T0m-Ep#ki_*ijQ#7Xi83;FgY1?4
+f%&9udEp1`bKJ#K`l5j4_8!^s]=GG[[Bm0CYH=n+WMcViUnXQTSt):<R$O#$P)t`bN/NOKL5(A6
+JUi5uI!U*`GBS(MEcH&9DJX*'BkV-kARo:[pJ_,mr`8eVq*"+/p-&79p-8I=r&spCr_NGgrDEAe
+mnr=9n3d1Aq*FmSnPS:DpI4"0s&&\js&&Vhp/1T_mo'3Zr^u`SlqI"Fqb6ujs&T%t"]e],=BSf*
+>5hb)>l@k,>5DJ'>lRa`<<#n\<;08d;YX2h<;fho<rQ2"=T*FDGl;peH38MA;cEWoq,Qranl>^3
+!HiSbG63#7H2`*jH[Pg@s*jutrdb$"s+:3%s+LB*r.b0*qhXWrqM>')pkJa$r.Oitr.=crmst=e
+rIXp!re1<*rJ(?-s+pZ2s,$f7rf$l:!07&>#EY(1P*2#mPl?pKQC%T<!L]DURfT%Mrgj._T`1Vc
+U8.^`!Mu[mVZE`qri-""XT#=EY-5(6Z*CU@Za@-J[^NZT\[f;`]=bei^;%Fu_8=(,`;[_&`lH0A
+ai_fMbg"GYcd:(edaQ^qe^i@(f\,!4gY:N>h;7&Ii8N\pit1;5k2tjjkiq?slg*p(mI'EAmfN"K
+nc&(\oCV\Sp&Facp\agdq>U6fqu-HkrUTr=s5!^*~>
+JcC<$JcFs6o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-Es$l0.9ljl>C[i8EJJgtLK7
+f@JI$da?Cdc-+8NaMu3:_SEq"]Xt_a[^EHIYck11Wi;nnUnaWVSt2C@R@';*PEM#gNJrdPLk^V:
+K7SQ&I=-?eG^"=QFE2A?DJj9+CM@HpAn>L_@fFdWe'c\BdfJ"Mqj6i=m$7=0lBM?9qa'i-q:YMr
+r7U>)rgi5Bs2b8^r5nu[pW*-Orl>#XrPe]Srl+lTrke`Srh\qVm\Bg(!6Y8`qTSuapWi``qU#/f
+p!EKGq7Q[<q7>Oqs76-Y#4qK[p\4IXrV6HiqtpEis7u]ip\4R-o#p[Jl-&s$qGR#crD`brqH!Ss
+r`K/&o`+s-rke]Qr5@U4s2=qZ#Bb35GB\:VH2`*kH[L5?IK+`rJ,OotJcC?#KDpQ'L&-Q%L[9in
+L\HQ$L&H]"KD^>uJa%^`Jc12tKE$W)L&Hc+L]<20M>rG5MuJ\8N<#"<O$\qjOcklkPa%GuQBml)
+R$jA2S"#q<SXuFFT:hmOU8"EYUnsobVl-JlWN)u!X/rG*Y-+t4Yd(I=Za7$H[C3NQ\Gj#W]">Vf
+]tV7r^qde'_Sa=2`Q#s>aN;TJbKS61c4SCLdF$CkeC<%"f@S[.g=k<:rnSIKhr*GOioB([jQ5Od
+kNM-ol0@U#m-O--mf)YVnF?&JncJFTo_nFap@n=Zq#C0hqYU0gr;HTbrdk+*s*t~>
+JcC<$JcFs6o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-Es$l0.9ljl>C[i8EJJgtLK7
+f@JI$da?Cdc-+8NaMu3:_SEq"]Xt_a[^EHIYck11Wi;nnUnaWVSt2C@R@';*PEM#gNJrdPLk^V:
+K7SQ&I=-?eG^"=QFE2A?DJj9+CM@HpAn>L_@fDhsSGScWS=Q5BEr:"SEq+/DE9_HD6Mj(JTD"rR
+TD>/VTAOh[FoRlkR.ZmAR/VU3Ie\?gI-u@XRL,IPR[]e8R[]e:rL<_Ts.01]oq2/RqOR,7l&,Cs
+nr!INr2p4,Yd(L>Zi.9%[/dT1[J6-dRG4,,QhsYV;YF&f<;ono<rQ2"=T2J'bl,cjcHjh`d*^8;
+P51=?P4at/P5fV/F`qqPGBe@Xrd"WmI!kpAs*artrIFp!s+:3%re19)qM+p'm"kLnpP/U"rIjru
+r.=fsl%&_`rIXp!s+LE+rJ(?-s+pZ2s,$f7rf$l:!07&>6BI=lP*2#nPa.N"QC!u+R@0M5S"-">
+St;RHTV8'RU8+N[V5:&eVl6PnWiE,#XKAV-Y-5(6Z*CU@Za@-J[^NZTrj`rY]=bei^;%Fu^qmn)
+_o0O5`lH0Aai_fMbg$.4&^ShOdF-LneCE.%f@\d1g=tE^h&5),i8ESRj5]4]jlY^gkih9qlKdd&
+m-X6/rpKpXnaZVL!qZ'VrUg6cp\4U\s7uZjqtp?irVc<dJcFR+J,~>
+JcC<$JcFs6o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-Es$l0.9ljl>C[i8EJJgtLK7
+f@JI$da?Cdc-+8NaMu3:_SEq"]Xt_a[^EHIYck11Wi;nnUnaWVSt2C@R@';*PEM#gNJrdPLk^V:
+K7SQ&I=-?eG^"=QFE2A?DJj9+CM@HpAn>L_@fB=,<Vf\p<<,2V4T7M)55.525P[JC6Mj(J:]4,d
+;>F&Z;:7i26N0:L;!V!A;Z9/Z7H6i<;Gm*`r)!Gjqbd&bn5JgLrCZr[mS*@Lr(I2o<`N3"<<ZE)
+=BJ^/rEB,'s'5M,r`])$qbta=qbd2fp/Cohr`/eqr`B)$r`T5E!-nEe!.+Wkr_rbpq,QZYqc3Z<
+#Bb35GB\:VH2`*kH[L5?IK+`rJ,OotJcC?#KDpQ'L&-Q%L[9inL\HQ$L&H]"KD^>uJa%^`Jc12t
+KE$W)L&Hc+L]<20M>rG5MuJ\8N<#"<O$\qjOcklkPa%GuQBml)R$jA2S"#q<SXuFFT:hmOU8"EY
+UnsobVl-JlWN)u!X/rG*Y-+t4Yd(I=Za7$H[C3NQ\Gj#W]">Vf]tV7r^qde'_Sa=2`Q#s>aN;TJ
+bKS61c4SCLdF$CkeC<%"f@S[.g=k<:rnSIKhr*GOioB([jQ5OdkNM-ol0@U#m-O--mf)YVnF?&J
+ncJFTo_nFap@n=Zq#C0hqYU0gr;HTbrdk+*s*t~>
+JcC<$JcFs6o`"jgrVZTjs8)ckrqQNf!;?EbGP(Lto'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?5
+f@AC"dF$:cbfe/Ma2Q!6_SEq"]XkY_[^<BGYck11Wi;nnUnaWVSt2@>R$X,(PEM#gNJrdPLk^V:
+K7SQ&I=-?eG^"=QFE2A?DJj9+CM@HpAn>L_e,7Yje,Pd)QJ@c'Pjt%<6Ms.>gAT^pg&Th)S`u[E
+SbnrHS,15,b5KH^aRmURaSs6R`r<p[`5BL2`VZP(V>m@fV=CA]aTBW.bPKH_c1oT_chGf]dJhMk
+dIFjK]_oD<]&C1+o(2GDo_%qPq"Xg`rqcQi!W)Wkq#C*gpA+IXb4NmIb3dCO;>F,a;uK\o<Vfbq
+=8l>"=TDXts8Kk7_Z%IO`8SW6F96T.G5c[dG^9:7s*OcnrdFfq!.Xrts+13%r.G!%re:-%lA,%e
+rIt0&pk/Krr.3pZrIOp!r.G$&re:?+s+gW1re^Z4!/pi8s,@#=rf7)AOoCM,PE_;sQ'Rc'R$a;1
+R[]e:SXl@DT:hjNTq\<WUnjiaVPg>jWMuntX/i>(Xfeh1YctC;ZEpmE['d?N\%)FJ%_B9b]Y2"m
+^V@S#_SX4/rl$t=a2l?Db0.uPc-FV\d*^7he'lgre^i@(f\,!4gYCW@hVR/Ji8N\Uj5f:_k2tjj
+kiq?slg*p(mI'EAmfN"Knc&(\oCV\Ro`Fj]p\agdq>U6fqu-HkrUTr=s5!^*~>
+JcC<$JcFs6o`"jgrVZTjs8)ckrqQNf!;?EbG4bCso'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?5
+f@AC"dF$:cbfe/Ma2Q!6_SEq"]XkY_[^<BGYck11Wi;nnUnaWVSt2@>R$X,(PEM#gNJrdPLk^V:
+K7SQ&I=-?eG^"=QFE2A?DJj9+CM@HpAn>L_qj[GP!-.%>jDj^1r^-NKr1E_Vpn.5P!2&(jqK;OS
+q3gH6p6k`Dqg\HknU9qTr0mYTs-ikTrgWtXr1*eXs.8tWr1O"\qO[/7qhsp#qht''riZ[3YHY79
+ZEggC[']D3rj;O0pmCfDhO+8.r_`JhpJ_#irDi\pr`B)$r)j&(bPfZdcHlI9s3^Y*q31c?oo\p1
+s)\<bG'<k/!I/nhHN/?lI/\QoIK4lrJH(3#K)C9#K`6]#L?aQeLAci(K_U2tK)C2\JGk&tK)C9$
+K`6])LB!&/M#N82M?&S6N;nk;NrG(?OHKO*4d2+pQ'IZ%Q^F/.R[T_8S=Q4BStD[KTqS3UUSO]^
+VP^8hW2ZbrWiN2%Xf\b/YHY79Z*L^B['[6L[^WdG\IQ3_]Y(qk^;%Fu_8=(,`;[_;`lH0Aai_fM
+bg"GYcd:(edaQ[peCE.%f@\d1g=tE=h;7#Gi8ESRj5]4]jlY^gkih9qlKdd&m-X6/rpKpXnaZVL
+!qZ'VrUg6cp\4U\s7uZjqtp?irVc<dJcFR+J,~>
+JcC<$JcFs6o`"jgrVZTjs8)ckrqQNf!;?EbG4bCso'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?5
+f@AC"dF$:cbfe/Ma2Q!6_SEq"]XkY_[^<BGYck11Wi;nnUnaWVSt2@>R$X,(PEM#gNJrdPLk^V:
+K7SQ&I=-?eG^"=QFE2A?DJj9+CM@HpAn>L_qc*Mor`&h[r]U6Cr]S[nr'1$ArB:-Hr'C6Vp/1W^
+oMOF3n3R1Q;,R6hmSW1Ge40I8r)!Dhr_WMi!)WPioMY3Xmn<@Hqb-?Nr_<;a$!(&,<E<1&=BSf*
+>5DG'>lIt+=o__&>5hb$;p\MC;>F,a;uK\o<Vfbq=8l>"=ThoPG^+N5GQ<$fHN8Hl;uK\k<U!K]
+<W@.BF`qs-G6)r6rd+Tks*Xfos*artrIFp!s+:0$re19)pkJ'honNF!r.Oitr.=itjFI2[rIXs"
+s+LB*reCH.s+pZ2s,$f7rf$l:!07&>!K`HCP!,"nPa.N"Q^=),R@9S6S"-%?St;RITV8'RUSFW\
+V5C,fVl6SoWiE,#XKAV-Y-5(6Z*CU@Za@*I[^NZTrj`NM]=bei]tV7r^qmn)_o2Pn43#=^aN;TJ
+bKS5VcHjkbdF-LmeC<%"f@S[.g=k<:h;-rEhr*GOioB([jQ5OdkNM-ol0@U#m-O--mf)YVnF?&J
+ncJFTo_nFap@n=Zq#C0hqYU0gr;HTbrdk+*s*t~>
+JcC<$JcG!7o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC"dEp1abfe,La2Q!6_8!^t]XkY_[^<BGYcb+/Wi2hlUnaWVSt2@>R$X)&P*1ofNJraOLk^V9
+K7SQ%I=-?eG^"=QFE2A?DJj<,CM@HqAn>O`rmUhoqpPP4r0R/Df9Q?"o9K5?rBUG<iS"@fg=l@n
+hjj>.s2jQKrQ,&\rQ"WOr5JZ6q5=%cqPF"b!2]Cbs2k;aq98f_"4,9=cMZ#]d.bofd/;;T]DB,!
+\Hqj#p%J+Rp\=O]q>C'jqtg-fq#C*epA"CTb4s0Ib43[O;YF&e<;ono<rQ2"=Sl8$>5qh"s8Be5
+_Z%IQ`8SW6FT6I`G5c[eG^4T6HN/<lI/SKnIK4lrJGt-"K)C9#K`-V\LAZc'K_U2tK)C2XJGk&u
+K):3#K`?c)L'!-dM#N82M?&S6N;nk;NrG(?OHKO*$^6g>Q'IZ%Q^F/.Rf8cWS=TYN!M?%aT`Lm_
+rhKRkVZ*J8W2ZbrWiN5&Xf\b/YHY79Z*L^B['[6L[^WcV\[f;`rk&EJ^;%Fu_>_:X_o0O5`lH0A
+aiaV+%F!)BcHjkbdF-LneCE.Lf-8l#g=k<:h;-rFhr*GOioB([jQ5OdkNM-ol0@U#m-O-,mf)YV
+nF?&JncJFTo_nI_pAamcq#C0hqYU0gr;HTbrdk+*s*t~>
+JcC<$JcG!7o`"gfrqu]ks8)ckrV1g8p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC"dEp1abfe,La2Q!6_8!^t]XkY_[^<BGYcb+/Wi2hlUnaWVSt2@>R$X)&P*1ofNJraOLk^V9
+K7SQ%I=-?eG^"=QFE2A?DJj<,CM@HqAn>O`SGSfQS,dX/EWC1VErU4MEoh<4Er89&62mMNT_P/N
+T_Wd*Fm=/IFnp.VRf&T=R.csGR.,UrIKFqHIJ/'fRf/`URf/`RS-,=PSXobOoq2/Tr1EkXlAYOs
+onrX)oSWXOs02O.s0D[2rj;^5rj2a7[']b=r3Z:-opGKAiL'V2qGR#cr)EYqqH!Ssr`K&#s'#G,
+"O#'7cHc@7!R]?iP51=?P4k%3P5fY(FT?UaG63#7H2`-iHN8HlIK+`rJ,OosJcC?"KDpQ&L#%L]
+L&?W!KD^?!J`)(WJc:8uKE$W)L&H`-LPUccM>rG5MuJ\8N<#"<Nrb?)rfRYQPa%GuQC!r*R$jEB
+RfT%Mrgj._T`1VcU8.^`!Mu[mV]Vk:WN)u!XK8P+Y-+t4Yd(I=Za7$G[C3NQ\@B)[]"@sS"hhXb
+^VI\b_?n,u`Poj;aN2KGrlYbpc-FV\d*^7he'umtf)F8Ff\,!4gYCW@hV[5Ki8N\Uj5f:_k2tjj
+kiq?slg*p(mHs?@mfN"Knc&(\oCV\Rp&Facp\jmeq>U6fqu-HkrUTr=s5!^*~>
+JcC<$JcG!7o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?4
+f@AC"dEp1abfe,La2Q!6_8!^t]XkY_[^<BGYcb+/Wi2hlUnaWVSt2@>R$X)&P*1ofNJraOLk^V9
+K7SQ%I=-?eG^"=QFE2A?DJj<,CM@HqAn>O`qGdDns&8t_pceX>b!,\cr'L?Jr(m>hp/1cbo25<N
+pHn+3oKiOTr)2fWlr*4?o1/IC"B&)o:f.*dr_WMi!)WSjo2>*Wl:^bAqFgHSr_<Ac#Zar+<``C*
+=]tZ+s',J+!F&b,>Q.h*=o;J'>Q.n#;q+eC;YF&e<;ono<rQ2"=Sl8$>5qh,GQ`58G^4W5HhUM8
+<Td?]FT6I`G5c[eG^4T6HN/<lI/SKnIK4lrJGt-"K)C9#K`-V\LAZc'K_U2tK)C2XJGk&uK):3#
+K`?c)L'!-dM#N82M?&S6N;nk;NrG(?OHKO*$^6g>Q'IZ%Q^F/.Rf8cWS=TYN!M?%aT`Lm_rhKRk
+VZ*J8W2ZbrWiN5&Xf\b/YHY79Z*L^B['[6L[^WcV\[f;`rk&EJ^;%Fu_>_:X_o0O5`lH0AaiaV+%
+F!)BcHjkbdF-LneCE.Lf-8l#g=k<:h;-rFhr*GOioB([jQ5OdkNM-ol0@U#m-O-,mf)YVnF?&Jn
+cJFTo_nI_pAamcq#C0hqYU0gr;HTbrdk+*s*t~>
+JcC<$JcG!7o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noO?jn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ8
+f@JI$da?Fec-+;PaMu3:_SO"$]Xt_a[^EHJZ*:C5X/`+rV50iZT:VUCR[BG,P`h/jO,]*UM26n?
+K7\Z)IXQTiH?aXWFEDPCE,TW2CMRWtBP(geACUV-rR1Yns-WMHpm0-hq*P*I!o;Ydo@j2u!SZ<)
+gA9RbSGA`MSGAZLb43[Tb5TN_aSa*N`W3%:WV`XmVt?k^Vtm4iV#e]]qTSuas3CSh!RT0jd/VMk
+d-]6B]Cic"\c;C'p]($`q>^<kq>^6gp\aa[p[QE'bNd7CbPb?4;uBVn<Vfbq=8l>!=oV\)>Q7t%
+s8'V2_uI[8_uIXWFEM_LrceBe!."Nh!df<BrI+]p!.Xoss+10$r.Fs$r.X?hqM"j#pOiBqr.4Eh
+p4)acrdk'#r.G$&s+UE+s+^T1rJ:c:Mi3OQNK&ttNrb?)rfR;GPl?pKQC%T<!L]DURfT%Mrgj._
+T`1VcU8.^`!Mu[mVZE`qri.'@XK8P+Y-5%5Yd(I=Za7$G[C3NQ\%&uZ]">Se]Y2&Y^F[1:_SX4/
+`Poj:a2l?Db0.uPc-FV\cd:(edaQ^qe^i@(f\+s3g=tE=h;7&gi!SH&j5]4^jlY^gkl0fOlKdd&
+m-X3.rpKpXnaZVLs766_rUp3as7cKerqZTjqtp?ir;H3cJcFU,J,~>
+JcC<$JcG!7o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noXEkn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ8
+f@JI$da?Fec-+;PaMu3:_SO"$]Xt_a[^EHJZ*:C5X/`+rV50iZT:VUCR[BG,P`h/jO,]*UM26n?
+K7\Z)IXQTiH?aXWFEDPCE,TW2CMRWtBP(geA=T1eS,JlOF8g:VF7OA<EU\#E6N9=PTV(tOoq1oM
+l?2H:qfVgYqjQl>q3^fBs-Wb8nUL+YomQk/rL3eUrL<_Trgj%[pn%PZm[rKtreofos02O.s0DU0
+p9ae+qm?1,nX0-?j-]h4rDN>fr)EVpqH!Ssr`K&#s'#D+s',ZNcHji7ciMPBp6,68q3(91s,mJ+
+F`hm,GQ2mfH2W$jH[L5>IK+`rJ,FisJc:9!KDgK$L$49fL&?VuKD^?!Jb"?bJ+\?kJc:9!KE$W)
+L&Hc+LB*//M$JorMi<USNK4"!!K`HCOo^c2rfmMMQi<?QR@=,E!M#_[ScPIVrh0@eU].%iV5F6i
+!N<!sWZS:CXKAV-YHP17Z*CU@Za@*I[^NZS\@K/]]=Y_g]tXK\/AT*=_Sa=2`Q#p<aN2KGbKJ,S
+cHab^d*^7he'umtf%8O+g"G*5gYCW@hV\=j$K:")j5f=`k2tjjroj[Qlg*p(mHs?@mfN"Knc&+Z
+o)SF]p&Facp\jmdq>^<gqu-HjrUTr=s5*d+~>
+JcC<$JcG!7o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noF9in*f]3m-Es$l0.9ljl>C\i8EJJgtUQ8
+f@JI$da?Fec-+;PaMu3:_SO"$]Xt_a[^EHJZ*:C5X/`+rV50iZT:VUCR[BG,P`h/jO,]*UM26n?
+K7\Z)IXQTiH?aXWFEDPCE,TW2CMRWtBP(geAGK4'<W>;"557;:6N9=O;#=#g;"[Zc;#!of;#aDm
+;!LC36hs%K;W:RC;?0Y\7d3GC;#jGj:B45e;#jMm;>=&V;rUIG9)D9L9`J,q='/R-o3),urEB2'
+rEB5*r*8bjfMqfIp/ClgrDi\pr`B)$qcWr&r`fD-s*+Kgrd+NiqGd,fk>VP*F`hm,GQ2mfH2W$j
+H[L5>IK+`rJ,FisJc:9!KDgK$L$49fL&?VuKD^?!Jb"?bJ+\?kJc:9!KE$W)L&Hc+LB*//M$Jor
+Mi<USNK4"!!K`HCOo^c2rfmMMQi<?QR@=,E!M#_[ScPIVrh0@eU].%iV5F6i!N<!sWZS:CXKAV-
+YHP17Z*CU@Za@*I[^NZS\@K/]]=Y_g]tXK\/AT*=_Sa=2`Q#p<aN2KGbKJ,ScHab^d*^7he'umt
+f%8O+g"G*5gYCW@hV\=j$K:")j5f=`k2tjjroj[Qlg*p(mHs?@mfN"Knc&+Zo)SF]p&Facp\jmd
+q>^<gqu-HjrUTr=s5*d+~>
+JcC<$JcG$8oD\afrVZTjs8)ckrqQNf!;?EbH1^_!o'u8>n*f]2m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI#da?Cdc-+8NaMu3:_SEq#]Xt_a[^EHIYck12X/`+rV50iZT:VRBR[BG,P`h/iO,]*UM26n?
+K7\Z)IXQTiH?aXWFEDPCE,TW2CMRZuBP1mfAC]3/e,@_pe*`RsQM6[>QMQmDQLg@A6hitJ62o[@
+gtVSWr7h8,s4[P-pY5\:ka_:9p72)N!6k;_s31&Wr6#&]!6G#W!QN1V`rE%;Wr/joW:-YZW;ELl
+bPo``c2Gued,EC5]C3?"\H;O#q"+:]q#0s`pA4Lap@msss3(;^!6OiTo?6f*r)EVpqH!Ssr`K&#
+r`];*r*8sqq83*J!6!m7"*A[.G5ZUdG^4T6HN/?lI/\QoIf=iqJGt-"K)1,tK_L2tLA$>uK_L,s
+K)C2lJF.j\JGt-!K)C9$K`?c*LB!#/M#E/8MMmCON/`gWrf7)AOoCLEPEc'3!LB)OQiWVDrgOIh
+SXuFFT:hmOU8"EYUnsobrhfdqWW&muX/u<&)Qp9IYctC<ZEpmE['d?N\$rlX\[oDb]Y(qlrkArY
+_8=(,`5KX6`lH0AaiaV+'$SVGcHjkbdF-LmeC<%"f@S[.rn7P1gtgfChu;O@iSrnXjQ5Lck3(t-
+km-M>lg4!*mI'uB!q>aMrpp*\!;-6_s7ZKerV6Bfs8)WirVZTlo)=4?hZ&*~>
+JcC<$JcG$8oD\afrVZTjs8)ckrqQNf!;?EbGP(Lto'u8>n*f]2m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI#da?Cdc-+8NaMu3:_SEq#]Xt_a[^EHIYck12X/`+rV50iZT:VRBR[BG,P`h/iO,]*UM26n?
+K7\Z)IXQTiH?aXWFEDPCE,TW2CMRZuBP1mfAGhtrS,]#UF7aSKF7+)FEU@cH6hitJ62.&BTD5)@
+FmXALFoQRXRdHO@R.QdHR/)9oJ,XolIK#]2S,JlWSc>;]T)bJ]TDG5LTAGP*Ms#s!Z*L\4ZhCd+
+[J@00[JmW5[I'@]RGaJ4Qh=;T<;fhn<rQ2"=Sl8#>5hb(>lE"Kd/MDndaRlPq31W;nW<oqF`hm+
+G63#7H2`-iHiJKmIK+cqJ,OosJcC>uKD^DsL&6VuL&6PtKD^?!Jb4K[J+nKmJc:9!KE$W)L&Qi,
+LB*//M$JorMi<USNK4"!!K`HCOo^c2rfmMMQi<?QR@=,E&=f;_StDXJTqS3TUSO]^V5F6i!N<!s
+WWB0%riI*AYHP17Z*L[AZa@*I[^NZS\@K/]]=Y_g]tXK\%`#ot_Sa=1`Poj;aN2KGrlYquc-FV\
+d*^7he'lgre^i@(f\-8X"l%hgh;7&gi!SH&j5]4^jlY^gkl0fOlKdd&m-X3.rpKpXnaZVLs766_
+rUp3as7cKerqZTjqtp?ir;H3cJcFU,J,~>
+JcC<$JcG$8oD\afrVZTjs8)ckrqQNf!;?EbGP(Lto'u8>n*f]2m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI#da?Cdc-+8NaMu3:_SEq#]Xt_a[^EHIYck12X/`+rV50iZT:VRBR[BG,P`h/iO,]*UM26n?
+K7\Z)IXQTiH?aXWFEDPCE,TW2CMRZuBP1mfAH#R.<W,ns<U)aJ4n:f35Oq#24TIkE63'=N;#F,h
+;!q3X:]NlF6Kpl96K(f<;?0Yk;?0YU7dikI;#jGl:]F8f;>sGq;,U:hqGQWX!)2-?s%<2^mS!ab
+=BJ^/n65`mr`T;+ra#J-m8Me>oi(cfrDi\pr`B)$qcWo%r`f;*!I/ngHN&9kI/R%7<U!HbFEM_L
+rHA<fH$TC8s*OcnrdFfqrdXlsrdk*$qLe^!pP&L!p4`BspOiBqr.4Kjm=4k\rdk'#r.G$&s+UH,
+s+^T1rJ:c:Mi3OQNK&ttNrb?)rfR;GPl?pKQC%T<!L]DURh2*\St;RHTV8'RU8+N[V5:'gVZE`q
+ri-""XT#=?Y-5%5Yd(L>Za7$G[C3NQ\%&uZ]">Se]Y2&Y^CJ&q_SX4/`5T^8a2l?Db5TQsbg"GY
+cd:(edaQ[peCE.%f@\dUg'-6dh;-rFrnn.BioB([jlPXekNMp0#O:X@m-O-,mf)YVnF?&Jo)J:]
+o_nI_pAamcq#:*hqYU0gr;?Nardk++s*t~>
+JcC<$JcG$8o`"gfrqu]ks8)ckrV1m:p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?5
+f@AC"dF$:cbfe/Ma2Q!7_SEq"]XkY`[^EHIYck11Wi;nnV50iZT:VRBR@';*P`h/iNfB!TM2-h>
+K7\Z)IXQTiH?aXWFEDPCE,TW2CMRZuBP1mfeCE(LeG@YmR.?U6Q2m33QM-UC6hj"Gh#Z<cqV(l%
+r7q&$rg`nUka_=:opkHoqoefX!m/O)prE?QrM]@fr2B4boVhf5rlkDerm(PirQtSlrR(\prmCeo
+r6kSlo$RNOqn21*l+6T!o_A[eq=s^YpAXgapAOa`p&OjKb5BBVb4<aN;uBVn<V]\p=8l>!=oMV(
+>Pqb+>l\4*s89am_tq=OF96T.G5c^cGQ<$fHN/?lI/SKnIfFoqJGt-!K)(&oK_U8qK_9uqK)C2m
+JG4QhIe\EgJGt-!K)L?%K`?c)L'!-dM#N59MMmCON/`gWrf7)AOoCLEPEc'3!LB)OQlh`bS"#q<
+SXuFFTV/!PU8+KZUnsrcVl-JmWN)u!X/u<&!NrX*YQ;#7rj*?H[C*HO\$rlX\[oAa]Y(ql^;%Fu
+_>_:]_o0O5`lH-@aN;TJbKS61c6^f`dF$CkeC<%!f%8O+g"P07gt^`AhV[8LiSieVj5f=`k2tjj
+roj[Qlg*p(mHs?@mfN"Knc&+Zo)SF]p&Facp\jmdq>^<fqu6NkrUTr=s5*d+~>
+JcC<$JcG$8o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?5
+f@AC"dF$:cbfe/Ma2Q!7_SEq"]XkY`[^EHIYck11Wi;nnV50iZT:VRBR@';*P`h/iNfB!TM2-h>
+K7\Z)IXQTiH?aXWFEDPCE,TW2CMRZuBP1mfp72,'nT=;B!HN89ErJH$6MR5ATDP;>FmaGNFn(pi
+RK&ZHR/iWKJE24ZIenKmRKAtIRf/`USGo)ZT)##ST^SN/N;JOtMYXUP[/RK1[/[N6[emK#R/E<J
+R/WHJQiNKEQiNKJ;uBVn<V]\p=8l>!=oMV(>Pqb+>l\41cN)>kdJhSdP4=b7P4k%<F96T.G5c^c
+GQ<$fHN/?lI/SKnIfFoqJGt-!K)(&oK_U8qK_9uqK)C2mJG4QhIe\EgJGt-!K)L?%K`?c)L'!-d
+M#N59MMmCON/`gWrf7)AOoCLEPEc'3!LB)OQlh`bS"#q<SXuFFTV/!PU8+KZUnsrcVl-JmWN)u!
+X/u<&!NrX*YQ;#7rj*?H[C*HO\$rlX\[oAa]Y(ql^;%Fu_>_:]_o0O5`lH-@aN;TJbKS61c6^f`
+dF$CkeC<%!f%8O+g"P07gt^`AhV[8LiSieVj5f=`k2tjjroj[Qlg*p(mHs?@mfN"Knc&+Zo)SF]
+p&Facp\jmdq>^<fqu6NkrUTr=s5*d+~>
+JcC<$JcG$8o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<AHgY1?5
+f@AC"dF$:cbfe/Ma2Q!7_SEq"]XkY`[^EHIYck11Wi;nnV50iZT:VRBR@';*P`h/iNfB!TM2-h>
+K7\Z)IXQTiH?aXWFEDPCE,TW2CMRZuBP1mfr)EPnmQU>-q`aO7q*+@4r^6HIr)!;es%r8`qG@,X
+j?i)uiDKDKr_r_m!)q]CoLAs[:f%$drDE8drDN\ol;I[XrD!5ag.Um.rE8SmrE08,>?kH>qcrAa
+n5KBdnl5B_r)EVpq,[Jrr`K&#r`];*r*98-!FC'LH38MAI!bcjkuI:Rs)\<bG'<k/s*+NhrHeKj
+s*Xcns*jutr.+ctrdsrupk8ErpOr3lr.=itomlddq0r*gq1/Hqrdt*$s+LE+rItB/Lku%e#E"Ft
+N/WaUNrG(?OHKO*!L&cIPl[2;rg4dqR[]e:S=Q7CT:hjNTq\<WUnjiaVPg>jWMuntX/i?$XT>T.
+ricF.ZMq0F['d<M[^W`U\[f;_]=bei^:q@s^qp#e%`?6(`Q#s=aN2KGbKJ,Srluh9d*^7he'umt
+e^i@(f\,!4gYCT?h;7&Ii8NYSj5]4^jlY^gkl0fOlKdd&m-X3.rpKpXnaZVLs766_rUp3as7cKe
+rqZTjqYU9ir;H3cJcFU,J,~>
+JcC<$JcG$8o`"gfrqu]ks8)ckrqQNf!;?EbI.[%%o()>?n*f]3m-O'&l0.<mjlGI]i8EMKh:pZ:
+f@SR&e'ZOfcHOJRaN)9<_SO%&]tCqe\$iZMZEUO7XK&7tVPKu\Tq@pHS!fY0Q'@GoO,f3YMM[+C
+KnFu.J:;ooH?sg[G'%hHEH#i6D/=!&BkV-kA^f/Ze^XKFqO$oAd['`pr'U9HqV;2-g]#q)g\BS"
+g\dT<S+W<9SbJZMc1]BVbPTH^aoBHVa8)\,WVNLdVtR(hbQ#fbcMu5id/MGldf._ldf7eqde;/g
+eG-`S]^NJn])B/>q"FLhqYBp]p\+=Tp\X[`p\XXapZ0KmanX$QbPG08<;fhm<rQ2!=Sl8#>5qh(
+>lS+/?3"@-s8'Uk_u%@SFEMbMrceBes*=Qh!df<Br-eTos*sorrdk'#on2jhnq6jlr.4Qlq1%a[
+r."Qnrdk*$r.G$&!/:B+!f)SfreU]6Mi7Rn!KE-=Nrb?)rfR;GPl?pTQC!u+R@0M5S"-&KScPIV
+rh0@eU].%iV5F6i!N<!sWX#T+XKAV-Y-7i/!O8s0ZPp3Y[C3NQ\@B)[]"5Md]Y2%n^V@S#_8=(,
+`;[^Z`lH0AaiaV+"jG6:cHjl:d07tIeC<%"rmq>+g"P07h#?+:hV[8LiSrkWj5f>$joOZ/roj[Q
+lg*p(mHs?@mfN"Knc&+Zo)SF]p&Facp\jmdq>U6fqu6NkrUTr=s5*d+~>
+JcC<$JcG$8o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-O'&l0.<mjlGI]i8EMKh:pZ:
+f@SR&e'ZOfcHOJRaN)9<_SO%&]tCqe\$iZMZEUO7XK&7tVPKu\Tq@pHS!fY0Q'@GoO,f3YMM[+C
+KnFu.J:;ooH?sg[G'%hHEH#i6D/=!&BkV-kAbMY]FR=/,Er8<#6MdA?TDbGIFlITDFo7[%Rc0Y7
+R.PplJ,"KmIJoW6S,\uYSc55YT)bJ[TDbGMTA5D$MsQ<$ZMV!$[/[Q3[.^osR-g7?R/30DR/0bZ
+<;fhm<rQ2!=Sl8#>5qh(>lS+/?3"@2d/D>ld.3@iPPp[=OTT]JG'<k/s*4QhrH\NlI!kj?s*jut
+qgeZsrdsfqo7Z[er.=itp42sgm!ek^qLJQrs+:0$s+CB+rItB/Lku%e!fDnorepl;NrG(?OHKO*
+!L&cIPmWhDR$a;0R[]e:Sc52]T:l1W!MZ@gU]I<hrhfdqWW&n&X/rD)Xfeh1ricF.ZMq0K['d<M
+[^WcV\[f;_]=bei^:q@s^qmk(_Sa=k`<F9%aN2KGrlYJhc-FV\d/MDrdaQ^qe^j`O"k_M^g=tE^
+h$W#ri8ESRioB([jo4BCkNMp0#O:X@m-O-,mf)YVnF?&Jo)J:]o_nI_pAamcq#:*gqYU0hr;?Na
+rdk++s*t~>
+JcC<$JcG$8o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-O'&l0.<mjlGI]i8EMKh:pZ:
+f@SR&e'ZOfcHOJRaN)9<_SO%&]tCqe\$iZMZEUO7XK&7tVPKu\Tq@pHS!fY0Q'@GoO,f3YMM[+C
+KnFu.J:;ooH?sg[G'%hHEH#i6D/=!&BkV-kAc#I)<UE!@4o@M>5P[M34o@\C6MaOV:]F8a;>F&c
+6gmA!6iL!C;>a>i;uTYp;q=G78,Z9_;>3ub;ZK_\;ZTWhqG-u`r_2HIs%NAan4Wgar`T#"s&o5&
+rE08,>?kE=qHW,\p/LlepJgufr)EVpq,[JrrE/r"r`]>+qcs/,ra#S3rHeEh!.+K@kuI=S"*A[/
+G5c^cGlN'fH3/G@I/JEmIfFopJGt-!K(XcfK^scnK)C2nJGF]]If+]lJGt-"K)C9$KE-`)L'!-d
+M#N54MMmDlMueourf7)AOoCLEPEc'3$C7$GR$jA2S"#q=rgj._T`1VcU8.^`!Mu[mVZE`qri-4(
+XK8P+Y-+u-YQ;#7rj*NM[C*HO\%&rY\[oAa]Y(ql^;%Fu_84"*_o2Pn"ieU(aN;U(b6?,7cHab_
+rm:nte'umtf)F8)f\,!4gYDea$Js[ui8N\Tj5]4^roO7Ekl0fOlKdd&m-X3.rpKpXnaZVLs766_
+rUp3as7cKerqZQiqtpBjr;H3cJcFU,J,~>
+JcC<$JcG$8o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_np']on*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-4AQaMu3;_SO"$]Y(hd\$iZMZ*:C5XK&7tVPKu\TV%gGS!fY0Q'@GoO,f0XMM[+C
+KnFu.J:;ooH?sg[G'.nJEH,o7D/=!&BkV-kA^o2Ye^`1Je+]7"Qdh?#Q23lE6MT@:h##k$h"f_"
+SGAZPSE$1:SGph7cMl)ebQ,o]bkoTZb5]T`aSs6ZaRuLuWUHecbl>recMl/hd/VMldf._qde_Dn
+eC4<EpXSfIqn2R5o"+k5o"+Mi!VlEfpAXgap&Ojbp&k!]p@mUip<!*Pqoet;qc*Moq,[JrrE/r"
+r`];*r*95,ra,S2p](*,iPYT3"*A[.G5ZXbGQ<$fHN/?lI/JEmIf=ipJGk&tK&D:YK)C2nJGXik
+IeA-bIf4cnJGt-"K)L?%K`?c*LB!#/M#N82M?&S6Mueourf7)AOoCLSPE_>tQBml)R$jD3S"#q=
+rgj[nTV8'RU8+N[V5:&eVl6Pnri-""XT#=,Y-5%5Yd(I=rj)X4[JmTQ\%&rY\[oAa]Y(qk^;%Fu
+^qmn)_o0L4`Q#sta9B].bKJ,Srlt\nd*^7he,Ii#e^i@(f\-8X$JX@lh;7#Gi8ESRro4%?jo4BC
+kNMp0#O:X@m-O-,mf)YVnF?&Jo)J=]o`"O`pAambq#C0hqYU0gr;HTbrdk++s*t~>
+JcC<$JcG$8o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noO?jn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-4AQaMu3;_SO"$]Y(hd\$iZMZ*:C5XK&7tVPKu\TV%gGS!fY0Q'@GoO,f0XMM[+C
+KnFu.J:;ooH?sg[G'.nJEH,o7D/=!&BkV-kAY/[ekB-06j)Xu`qEjtMm@X?MlZM!+r0d>Ki0j+c
+k(!2UrgNeT!h>gQr1EqZj.G%aoS`@!s,$WZosF_+s0VR/!4;a5n<i.#qj@@]qc*Moq,[JrrE/r"
+r`];*r*95,ra,S2rQkPlrm1\lcLR.gPPp[>OTT]JFa!_-s*+NhrHeKjs*X`ms*jrsr.+`srIWs[
+qh"`sp43$ipjVmaq0r9lqgeZss+:3%s+LE+reCH.!/UW2s,$f7repl;NrG(?OHKO*&!N6CQ'R`&
+R$a;1R[]e:Sc52lT:hmOU8"EYUnsobVl-JlWW&muX/u<&#Hk86YctC;ZMq02['fnA)Rm5d\[f;_
+]=bei]tV7r^qde'_Sa=1`Poj;rl>8bb0.uPc2Pulcd:(edaS3F"kD2Uf@\dUg'ZTih;-rEhr*GO
+ir7s=jQ6C'!U&\Gkm-M>lg4!*mI'uB!q>aMrpp*\s7H<`s7ZKer:p<frqcNhrVZWmo)=4?hZ&*~>
+JcC<$JcG$8o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noO?jn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%da?Fec-4AQaMu3;_SO"$]Y(hd\$iZMZ*:C5XK&7tVPKu\TV%gGS!fY0Q'@GoO,f0XMM[+C
+KnFu.J:;ooH?sg[G'.nJEH,o7D/=!&BkV-kAQAS+s&J5GnNHV1lTP)3qEjsRs%iPhoMPQ`pI"U?
+gdD'=i_fMLr);$5rC?larDEMk!)rhonP]Eep/Cifs%`AcqbI)ar_2WNr(R,bnkB'dp0%H!qH<r'
+>$LZ)k>V(RoMbWdr_r\nrDiYor`B&#qcWo%r`f;*ra#M0ra,YNrH\TlH?sdZqGc]ZoMbp7F`hm+
+GQ2mfH2W'hHiJKkIK+cqJ,FiqJc12YKDU8uJbFWkJ,"KcIJJ?jJ,=cqJcC?#KE$W)L&Qi,LB*/0
+M>rG5MuJY9NK4"!!K`HCOq3b@Q'IZ$Q^F/.R[T_8S=TYN&>,VhTq\9VUnji`VPg>jW2]cr!NW=$
+XTu#4YHY79Z*OA8!OT96[MlWb\@K/]]">Vf]tM.p^VIY$_SX4/`5T^8a8X-`ai_fMbg$.4"jbQC
+dF-MCe-4CRf@S[.rn7_6gtgfChV[8LiSsjs!T`AAjoOZ/roj[Qlg*p(mHs?@mfN"Knc&+ZoDeI^
+p&Facp\agdq>U6fqu-HkrUTr=s5*d+~>
+JcC<$JcG'9o`"gfrquZjs8)ckrqQNf!;?EbGP(Lto'u5=n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI$da?Fec-+8OaMu3:_SO"$]Xt_a\$iZMZ*:C5X/`.sVPKu\TUq^ES!fY0Q'7AnO,f0XMM[+C
+KnG#/J:DupH[9p\G'.nJEH,o7DJX*'BkV0lAc:-XeH+1Ko9es4qNh,Iig'R4qEt*Gp>#f*gY;JX
+rn@G.r7gq8pRD)Njdl=>s3Uel!m]'9n]gsSp<*EWr5e]5or%kirM\kXrltJgs3L_lrmC_nqpPPp
+rmU_no$m`kl+R#-q7HX;s1A$:qRcR7!*&gjrV6Bdrq?9as7QHcrV$-]oZI0Vo#gRGpr`W[!)rep
+rDiYorE&u#qH<f$r`f;*ra#M0r*KG3q#C-+iPYZ5"E\d/G'<k/s*4QhrHeKjs*X`mrdOlsqLJNq
+qh"-dqL\TqpON-jqL7aYqgSNoqgeZss+:3%s+CB+rItQ4LkpnEMMd>kMueourf7)AOoCLNPE_>t
+QBml)R$jEBRi7ffSt;RHTV8'RUSFW\V5C,fVl6SoWiE,#XT#=&Y-7i/#I1S?Za7$G[JmT8\%)FJ
+)S3Pm]Y(qk^;%Fu^qmn)_o'F3`Q#s=aN2KGrlYJhc-FV\d/ME+daQ^qe^i='f@\d1g=tB;h;-rF
+rnmh9ir7s=jQ6C'!U&\GklL)8rp9[P!:KjT!q>aMrpp*\s7H<`s7ZKer:p<frqcNhrVZWmo)=4?
+hZ&*~>
+JcC<$JcG'9o`"gfrquZjs8)ckrqQNf!;?EbH1^_!o'u5=n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI$da?Fec-+8OaMu3:_SO"$]Xt_a\$iZMZ*:C5X/`.sVPKu\TUq^ES!fY0Q'7AnO,f0XMM[+C
+KnG#/J:DupH[9p\G'.nJEH,o7DJX*'BkV0lAY,LlSc5/;FRjM:EWL5LqEt*Gp7UfFs.JOti-,'e
+pR:$.q186ik(!8Ws-iqV!h>gQrL`tYj.G"`s,Hu9oS`O&!*&m&osFS's0Vd5rNlU3[.KabRJ`H1
+QiEEQ;uBVn<V]\o=8l=u=oMV(>Pqb*?2e1.?N=L3cihY?cHqdFP4=b7P5::DFEM_LG5c^cGlN'f
+HN/?lI/JElIfFooJGk&rK'S'cK):,nJGXimId;FZIf=ioJGt-"K)L?%KE-`)L'NKiLl$tGMMqIm
+!KE-=Nrb?)rfRVPPa.N"QC!u+R@=,E)P!@iStDXJTqS3UUSO]^VP^8hW2ZbrWiN2%riH4(YPta2
+Z*L[AZa@*IrjDj:\Gj#W]">Se]Y2"m^V@S"_8=(,_o0O5`lH-@aN;U(b6?,7cHab_rm;D-e'umt
+f%/I)f\,!4gY:N>h;7&ghuVfrro4%?jo4BCkNMp0!UB"Mm/QGQmf)YVnF?&Jo)J=]o`"O`pAamb
+q#C0hqYU0gr;HTbrdk++s*t~>
+JcC<$JcG'9o`"gfrquZjs8)ckrqQNf!;?EbH1^_!o'u5=n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI$da?Fec-+8OaMu3:_SO"$]Xt_a\$iZMZ*:C5X/`.sVPKu\TUq^ES!fY0Q'7AnO,f0XMM[+C
+KnG#/J:DupH[9p\G'.nJEH,o7DJX*'BkV0lAQ;b,<8]t:4nLr*4TR`7qEt*Go2,0Yr_WPjs%r\^
+r^-KLo0VA&s&/>`rDN8bpeq,jq+'%+s%!&crDNVns&/;a!*&Vir)EShpJ:QZrD!8bpe1W\rCd#]
+qG$cZ!E<4i=o_e+>lS%)>lS%#;uTbl;t3iY;u]es;uBVn<V]\o=8l=u=oMV(>Pqb*?2e1.?N=L5
+HN/6mG^"=Tn5SpXp/D0:F`hkNrceBes*=Qhs*Ocnr-eQns*slqrIOitl\#%cqgnKlqg\Hkl[AYZ
+rdXfqrdk*$rIb-'!/:B+#D\+kM2@+IMuJY9NK4"!!K`HCOp[D;Q'IZ$Q^F/.Rf8cpS=Q7CT:_dM
+Tq\<WUnjiaVPg>jWMuntX/i?$XT>T.ricX4ZEggC['[7?[K3kIrj`rY]=Y_g]tM.p^VIY$_SX4.
+`5T^8a2c9BaiaV+"jG6:cHjl:d1asWeC<%"f%8O+g"P07gYCW@hV\=j!TE&;irS6&roO7Ekl0fI
+lKeH9s6TgSrpKpXnaZVLs7?9_rq6<bs7cHds7uZjqtp?irVc<dJcFU,J,~>
+JcC<$JcG'9o`"gfrqu]ks8)ckrV1j9p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<DIgY1?5
+f@JI#da?Cdc-+8NaMu3:_SEq#]Xt_a[^EHJZ*:C5X/`+rVPKu\TUq^DS!fY0Q'7AnO,f0XMM[+C
+KnG#/J:DupH[9p\G'.nJEH,o7DJX*(BkV0le'n6Es4%,!n<i4%rKd>IpQk`DrC$KLr'LG>rndJ,
+ptPl(rS7>*!1i_OqO@8Mk+2LAs3^kn!71GcrltJgrltGdrlaoUs2b8^ql'7goVhefpSdba#L1Q>
+cd0tbdJ_Mle,Ikse,.Yaec+.h^&G\<^&5PA]DoJ<]D]>6])]GA<;uXqq=saZq"a[`q#C'hp@\CX
+rq-9`rq6$.pWN6PrQ5&[prW?Ss&Anrq,[Gqr`K#"r`];*qcs/,ra,M0ra>b7q#C-+iPYZ5s)n?b
+rHJ9ds*=Qhs*Ocnr-eQnrdXcpqgms_qLS?jr."Tmj*giSrdXirrdk*$re(6(s+UH,s+^T1reV2D
+Mi3OQNK0$[O-#KdP*2#nrfmYQQ^F/.Rf8c`S=Q7CT:_dMTq\=]U]I<hrhfdqWW&n&X/rD)Xfeh1
+ricF.ZMq03['d=@[K3kIrja,^]=Y_g]tM.p^VIY$_SX4.`5T^8`lH0Aai_cLbKS61c4eONdF$Ck
+e'umtf%8O+f\,!4gYDea!T)`5i!\N'j5]4]jlY^gkNMp0!UB"MliQSBmf)YVnF?&Jo)J=]o`"O`
+pAambq#C0hqYU0gr;HTbrdk++s*t~>
+JcC<$JcG'9o`"gfrqu]ks8)ckrV1j9p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<DIgY1?5
+f@JI#da?Cdc-+8NaMu3:_SEq#]Xt_a[^EHJZ*:C5X/`+rVPKu\TUq^DS!fY0Q'7AnO,f0XMM[+C
+KnG#/J:DupH[9p\G'.nJEH,o7DJX*(BkV0lSXoePqjl;[q/ZOVqfDLPr,_g)qEt0Is.K@bq4R2K
+!2/=oj*('`iL04eqLI^XrdOm:rgX"[T)PAXT&cNqN;8J2N;/>1MZ-TRZh_!-[0<qF[^NTOrNuU4
+rj;[2!4;HepmM&Iq3UuEn<a/Sr)NPnrE&u#qH<f$r`f8)s'>V1r*TG2s'Z5[cHje\c-OhfPOXh+
+PPgU@OoKS(G5ZXbGlN'fHN/?lI/JElIf=inJGXo]K)1&lJGaooIcGkSIf=ipJGt-"K)UE&K`?c*
+LB!#/M#N5BMMmCON/`jXO,oBbOcklkPl?pOQC!u+R@=,E$CmZYStDXJTqS3UrhKRkVZ*IoW2]cr
+#HOr-Xf\b/YPta,Z*OA8!joACrjDj:\Gj#\]">Se]Y2"m^V@S"_8=(,_o0O5`l?'?aN;TIbKJ,S
+rlu2'd*^7he'lgre^i@(f\"m2g=tE^h#ZBirnn1CioB([jQ5OdkND(.klL)8rp0^RmdC)C!q>aM
+rpp*\s7H<`s7ZKer:p<frqcNhrVZWmo)=4?hZ&*~>
+JcC<$JcG'9o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<DIgY1?5
+f@JI#da?Cdc-+8NaMu3:_SEq#]Xt_a[^EHJZ*:C5X/`+rVPKu\TUq^DS!fY0Q'7AnO,f0XMM[+C
+KnG#/J:DupH[9p\G'.nJEH,o7DJX*(BkV0lrDibp!*.''nicq>qEt0Is%r\lq,$i`qG@/gp-S[E
+nj;A(n59*]o25?^s&82Q!(QfTlULbLjAYqRs&8kqo1o9\nP9'Xr_3;an4`XPr`&Jm"'\r5>Q.n+
+>Pqb)>PD(j;ufk^<:s2i<;]bl<rH,!=Sc2">5hb'>lS+/?Mn10@/jX8H2`'gFoll5Hgk#)<VBDl
+FoQX`GQ2pfH2W'hHiJKkIK"]pJ,4]mJ`q^^JbFWlJ,=]TIJeQnJ,FirJcC?$KE$W)L&Qi,LB*/0
+M%GQ&Mi<USNfK0]OHGZgP*;.0Pm*J?R$a;1rgO7bSXuFFT:hmOU8.^`!Mu[mVZE`qri-4(XK8P+
+Y-+u-YQ;#7rj)[5[C-"B!OoT<\KADp]=bei]tV7r^qde'_Sa:0`Poj:a2l?Db0%oNbg$.4'@5%Q
+dF-LmeC<%"f@S[-g"P07h#?+1hV\=j$fU+*j5f:_k2tjikl0fIlKeH9!q#FDrpKpXnaZVLs7?9_
+rq6<bs7cHds7uZjqtp?irVc<dJcFU,J,~>
+JcC<$JcG'9o`"gfrqu]ks8)ckrqQNf!;?EbGkCV!o()>?n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOgcHOJSaN)9=_ns4(]tCtf\@/fOZEUR9XfJJ#Vkp2aTqJ!JS!ob4QBdYsOcPN]N/EII
+L4t84JUi5uI!^0bGB\1OF)l8>DJj<,CMINrB@?e.rR:htm$Q%ar'^?JrBgA;q;(c"qqM%>qj[YW
+lC@(/"J!rhdEqU5!RAsfcMl)bbOis9W:Qq`W!B<Jcd:%ddaJ'BqpYVpr7(Yps47+ur7:hu!8.7a
+o=an2r4Vs>k.CUks7l9]rV6Ee"SVN]p@eLYrq-3_q9&6Nqo\cWqoJQSrQ>(=q,[Gqr`K#"r`];*
+qcs,+ra,M0ra>b7raP^'f#%X/F`hkNrHJ9ds*=Ngs*OcnqgJKnrI=Tmq186kpjr'fr."TmhL5?O
+rdXirs+13%rIb-'!/:E,s+^T1re^Z4%Z?:)NK&sZO-#KdP*2#nrfmYQQ^F/.Rf8c[S=Q7CT:l1W
+!MZ@gU]I<hrhfdqWW&muX/u<&#Hk86YctC;ZMq08['d<M[^W`Urj`HK]=Y_g]tM.p^VIY$rk\]R
+`;[^V`lJ)"$H^H6bKS2TcHab_rm;8)e'umte^i@(f\+s3g=tE^h%8H#i8ESQioB([jQ5OdkND(.
+klL)8rp9[P!:KjT!q>aMrpp*\s7H<`s7ZKer:p<frqcNhrVZWmo)=4?hZ&*~>
+JcC<$JcG'9o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOgcHOJSaN)9=_ns4(]tCtf\@/fOZEUR9XfJJ#Vkp2aTqJ!JS!ob4QBdYsOcPN]N/EII
+L4t84JUi5uI!^0bGB\1OF)l8>DJj<,CMINrBDnD$T)P;/FQ[`C7/94K6MdDOT^n`TT\ahSG5[p(
+RcBh9JFJ-eJE24[SH#,[T)G;XT&ZIANRWpbNVe\3MZAY6;uX-"[/IE2[f<c2[/@61[.9UZRJ`EP
+Qh6U9Qi0q[<rH,!=Sc2">5hb'>lJ%.?Mn10@/j[7@f=ORd*gIrrfcl8nWWp7r/q#%s*"?bs*4Qh
+r-JBis*X]ls*jorpji0kp4E'joRQjhqgRCMrI4`qr.+fus+:3%s+CB+reCH.!/UW2s,%;EN/WaU
+NfT6_OcbfiPEc'3"dYLBR$jEBRg#=QSt;RIrh0@eU].%iV5F6i!N<!sWWB0%riHF.YHP17Z*CV6
+ZNmkF[C3NQ\%)FJ%(a'_]Y(qk^;%Fu^qp#e!Q2kT`<"!!rl>Ggb0.uPbg"GYcd;[=&(8qVeCE+#
+f@S[.g"P07h#?+@hV[8LiSieVj5f:_k2tjikl0fIlKeH9s6TgSrpKpXnaZVLs7?9_rq6<bs7cHd
+s7uZjqtp?irVc<dJcFU,J,~>
+JcC<$JcG'9o`"gfrqu]ks8)ckrqQNf!;?EbGkCV!o()>?n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f@SR&e'ZOgcHOJSaN)9=_ns4(]tCtf\@/fOZEUR9XfJJ#Vkp2aTqJ!JS!ob4QBdYsOcPN]N/EII
+L4t84JUi5uI!^0bGB\1OF)l8>DJj<,CMINrB2ne/r`$Zsq*"XDq*Y*IqGI2fpJLibr_NPj!)`JV
+r'LBMn3Z;*n59*]o25B_r_rhdkXYA<pdb0M!(Zucmo'3aq,@&dr_reqr_<Ghh+mlBlq@CRr_rDl
+s',P0r`oA*r`o>)q,>sGq,@5lq,[Gqr`K#"r`];*qcs,+ra,M0ra>b7raGkOrcSBgH$au-<:Nu`
+<<%+@G5ZXbGlN'eHN/?lI/A?lIf4ckJGFciK(sohJGaooIboMOIf=ipJH(3#K)L?%KE-`*LB!#/
+M#N82M@PQ'N/`gWO,oBbOcklkPl?pOQC!u+R@=,E"e;-TStD\TT`Lm_rhKRkVZ*IoW2]cr!NW=$
+XTu#4YHY79Z*OA8#ILnH[^NZS\Gj#I]">Se]Y2"m^V@S"_>_:P_o2Pn!QN1Za9p&3bKJ,Rc-FV\
+d/ME'daQ^qe^`7&f@\d0g=k<:rnS.Bhr*GOiSrnXjQ,Fbk3(pkrojIKli-8Nm/ZSRmfN"Knc&+Z
+oDeI^p&Facp\agdq>U6fqu-HkrUTr=s5*d+~>
+JcC<$JcG*:oD\afrVZTjs8)ckrqQNf!;?Eb!VH!_nosWnn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%e'ZOfcHOJRaN)9<_SX+']tCqe\@/fOZEUO8XfJJ#Vkp2aTqJ!JS!ob4QBdYsOcPN]N/EIJ
+L4t84JUi5uI=$9cGB\1OF)l8>Df0E.CMIQsB@>8We'n<Gl'TterL!FLqEt3Jo\TQ&qV:r%nt#?A
+iLL/$da?Ihd.kr_c2c,fbkoTWb20)bVuP-DdJVJge,[tqeGn(lf)F;$f`'Rt^A5J']^EE1;uHCi
+q#0sbp]C3`pA4IYo_cksbP]N\anWsPaT,?:<rH,!=Sc2">5hb'>lJ%.?Me+0@/aU4@K9p7s6[_l
+_Z%IQ`;au[G5ZXaGlN'fHN&9kI/A?kIf4chJFS3]JGaooIe/!WI.r'fIf=iqJH(3#K)L<'KS>-Z
+L'!-dM#N53MMqIm$B:(,O-#HcP*2#nrfmYQQ^F/.Rf8c[S=Q7CT:l1W'r%J!UnsobVl-JmWN)u!
+X/rG*Y-+u-YQqG=ZEpmE['fnA#Ih4Q\[f;_]DfGJ]tV4q^VIY$rk\]R`;[^V`lJ)"&';u;bKS2T
+cHab^d*^7he,Ihte^j`O+5#9#g=tB;h;-rFhr*GOio9"YjQ5Lck3(sll07Kuli-5PmI'EAmfN"K
+nc&+ZoDeI^p&Facp\agdq>U6fqu-HkrUTr=s5*d+~>
+JcC<$JcG*:oD\afrVZTjs8)ckrqQNf!;?Eb!VH!_noO?jn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%e'ZOfcHOJRaN)9<_SX+']tCqe\@/fOZEUO8XfJJ#Vkp2aTqJ!JS!ob4QBdYsOcPN]N/EIJ
+L4t84JUi5uI=$9cGB\1OF)l8>Df0E.CMIQsB:Spks.04]c?/AnqF(0IrBg.MrLihUs.K=6kB5a,
+rL<MLj-fdpq18QtqgnWpkC<N&s.94^pn$N<r/UZ6i/IVmn;RC*rDWa&rj;R1rO)g9[^EOBZiIH3
+[/RB3ZMq3.QiNQIR.m$JR/WHEQM?dH<V]\o=8l=u=oMV(>Ph\)?2e1-?iOO5@JjR>A'N<Gdact&
+rKHc7plk93s)n?brHJ6cs*=Qhrd4ZmqgJHmrI=KjnU^7]r."Tmo6p+UpO3!hrdXlss+13%rIY0)
+Kn]M\!f)SfreUZ5MuJYBNK0'\OH>TfP*;.0Pm*J?R$a;1rgO(]SXuFFT`1W"U8+N[V5:&eVl6So
+WiE,#XKAV-Y-7i/#I1S?Za7$G[JmT>\%&rY\[oAark&KL^:q@s^qdec_?%Qmrl"oXa8X-jai_fM
+bfn>WcHjh`dF$CkrmUu!f)F8Cf\,!4gY:N>h;7&Hi8ESRioB([jlPXekNM-ol0@R"rp0^RmdC)C
+!q>aMrpp*\s7H<`s7ZKer:p<frqcNhrVZWmo)=4?hZ&*~>
+JcC<$JcG*:oD\afrVZTjs8)ckrqQNf!;?Eb!VH!_noaKln*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9
+f@JL%e'ZOfcHOJRaN)9<_SX+']tCqe\@/fOZEUO8XfJJ#Vkp2aTqJ!JS!ob4QBdYsOcPN]N/EIJ
+L4t84JUi5uI=$9cGB\1OF)l8>Df0E.CMIQsB2hl1rD`hs`'3u[rB0pEqEt3Js%r/]rD<>dnj31?
+!(6NJiBuEur)3JlqaT[;n4<OKs&/>br_iMiqGR5ir`%9?rCuiVrDWDns'#J.ra#P/r`fA,!+#G*
+r);*EqbmJpq,[Gqr`K#"r`];*qcs,+ra,J/s'Yh7r*fn@F`qtSH[U>0<;9Ja<<%+@G5ZXaGlN'f
+HN&9kI/A?kIf4chJFS3]JGaooIe/!WI.r'fIf=iqJH(3#K)L<'KS>-ZL'!-dM#N53MMqIm$B:(,
+O-#HcP*2#nrfmYQQ^F/.Rf8c[S=Q7CT:l1W'r%J!UnsobVl-JmWN)u!X/rG*Y-+u-YQqG=ZEpmE
+['fnA#Ih4Q\[f;_]DfGJ]tV4q^VIY$rk\]R`;[^V`lJ)"&';u;bKS2TcHab^d*^7he,Ihte^j`O
++5#9#g=tB;h;-rFhr*GOio9"YjQ5Lck3(sll07Kuli-5PmI'EAmfN"Knc&+ZoDeI^p&Facp\agd
+q>U6fqu-HkrUTr=s5*d+~>
+JcC<$JcG*:o`"gfrqu]ks8)ckrV-Hgp@eLYHh?q#o'u5<n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI$da?Fec-4AQaN)9<_SO"%]tCqe\$i]NZEUO7XK/A"Vkp2`TqJ!JS!ob4QBdYsOcPN]N/EIJ
+L4t;5JUi5uI=$9cG^"=QFE2A?Df0E.CMIQsdF-Ile,IkYR,42(R.s)G6iKFChYl:-h#,q)SAq*&
+e'cXkd.kr^cMl&gbl#ZXb3#Z#WV`X_VZP8odf._feGIemf(mqsg&Ke&^\bbA^$WK3]Cii1]DGP*
+p\FUap]'sep&F[`p&=R`oDJ7[b3I1Gb5BBTaSX*V<rH+u=Sl8">5hb'>lJ%/?Me+/@/aU4@fBj;
+AGZ>n_sP>@_Z7XSFoQX`GQ2peH2W'gHiAEiIJnWnJ)5_QJ,FcfIHQ"RIK"]pJ,OotJcC?$KE$W)
+L&Qf-LPYqd#)\=sN/WaVrf75EOcklkPl?pOQC!u+R@=,E':bVbStD[LTq\9VUnjiaVPg>jWW&mu
+X/u<&#Hk86YctC;ZMq03['d=@[K3kIrji'?!5&6C#JIjc^V@S"_>_:P_o2Pn!QN1Za8sE*rlY>d
+c2Puhcd;[=&(8qVeCE+#f@S[.g"P07h#?+1hV\=j!TE&;irS6&roOIKkih9qlK[^7liQSBmf)YV
+nF?&Jo)J=]o`"O`pAambq#C0hqYU0gr;HTbrdk++s*t~>
+JcC<$JcG*:o`"gfrqu]ks8)ckrV-Hgp@eLYHh?q#o'u5<n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI$da?Fec-4AQaN)9<_SO"%]tCqe\$i]NZEUO7XK/A"Vkp2`TqJ!JS!ob4QBdYsOcPN]N/EIJ
+L4t;5JUi5uI=$9cG^"=QFE2A?Df0E.CMIQsR[]h<Sc55FF9$IEFRF5F7/B:M6LpiKT_P/ZT_`j)
+FjtU7SGo#QRcKn2JG=ZqK(a`qJE_R_ScGDVT(elTT`:Y^T`1S^TE(\^O7eLqN;&8(N;HNUZa@*I
+q6p70s0Mp8ZEpmErj2U0rj1pXrL*GJrg3;Dqj71\rE&r"qcWl$r`f8)ra#P1qd9>1raG_6raQ1D
+d*gLtf\,$?POjt:FoQX`GQ2peH2W'gHiAEiIJnWnJ)5_QJ,FcfIHQ"RIK"]pJ,OotJcC?$KE$W)
+L&Qf-LPYqd#)\=sN/WaVrf75EOcklkPl?pOQC!u+R@=,E':bVbStD[LTq\9VUnjiaVPg>jWW&mu
+X/u<&#Hk86YctC;ZMq03['d=@[K3kIrji'?!5&6C#JIjc^V@S"_>_:P_o2Pn!QN1Za8sE*rlY>d
+c2Puhcd;[=&(8qVeCE+#f@S[.g"P07h#?+1hV\=j!TE&;irS6&roOIKkih9qlK[^7liQSBmf)YV
+nF?&Jo)J=]o`"O`pAambq#C0hqYU0gr;HTbrdk++s*t~>
+JcC<$JcG*:o`"gfrqu]ks8)ckrV-Hgp@eLYH1^_!o'u5<n*]T0m-Es$l0%3kjQ#:Zi8<DIgtLK7
+f@JI$da?Fec-4AQaN)9<_SO"%]tCqe\$i]NZEUO7XK/A"Vkp2`TqJ!JS!ob4QBdYsOcPN]N/EIJ
+L4t;5JUi5uI=$9cG^"=QFE2A?Df0E.CMIQs;H$Qm<Tu[I5N"a#4o7A:7/B:M6N'aO;>j>f:[ULK
+6IeH[;>jDk;tic88,>dJ;u0De;u]bk;uBVk:AIW;:Amo`9`%ce>5MP'>QA(&>l.b);sI?Z;t3i_
+;u9Vo=8c7u=oDP'>Ph\)?2n7.?iFI4@JjU6@g?OhH$apdIXUQ^q,R#crcS6arHJ9drd"Hgrd4Wl
+qgJElrI<[Sqg\NmoR5nMq0i6krdXlss+13%re(6(s+UH,!JcL1M$AiqMi<USNrG(COHG]hPEc'3
+"dYLBR$jEBRhM<_St;RITqS3TUSO]^VP^8hW2]cr!NW=$XTu#4YHY79Z*OA8!joACrjDj:\Gj&=
+\cBAA]Ec-a^;%Fu^qp#e!Q2kT`<"!!rl>,^b5TQbbg$.4!RK-ld1=[SeC<%!f%8O+g"G*5gYDea
+!T)`5huVfrro4%?jo4BIkNM-ol0@R"rp0^RmdC)C!q>aMrpp*\s7H<`s7ZKer:p<frqcNhrVZWm
+o)=4?hZ&*~>
+JcC<$JcG*:o`"gfrqu]ks8)ckrV1j9p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<DIgtLK7
+f@JI$da?Cdc-+;PaMu3;_SO"$]tCqe\$iZMZEUO7XK&;!Vkp2`TqJ!JS!ob4QBdYsOcPN^N/EIJ
+L4t;5JUi6!I=$9cG^"=QFE2A@Df0H/CMRWtdF&!Bs3q"ts-WbQo9fHDrg<_RrL!VO!1<)=r0[8I
+pI+jFs$HbCo%s?$rnRP0s4mY/qOISVqO[#D!1rDFs3q"r!R]9hchYlcc25`Yb5S@>WT^;WWVEFd
+VZ>0Ee+M5gebI_nfDjM&g&B_*g\S\]^@],0]`#J4]`#J>;Z6@ep]1'fp&OdboEb'\o^h\Ho^h\P
+o_Q`#bOs$Uan*URao5?>=8c7u=oDP'>Ph\)?2e1.?iFI4@JaO6A,^!=AbuGo_sG8>_uFlZG5QRa
+GlN'eHN&9jI/89iIf"WYJGOcmIeA-cI-l:XI/89kIf=iqJH(3#K)UE&KE-`*L)l&*Ll$tGMMmFP
+NK0$[O-#KeP*;)oQ'IZ%R$a;1rgOCfSXuFFTV8'RU8+N[V5F6i!N<!sWWB0%riH4(YPta-Z*L\7
+ZN7G@rjMj9!4`$=!kQ"Urk&9F^AbkK^qmkd_?%Qmrl"oXa8X-kai_cLbKS5UcHab_d*^7he,Iht
+e^j`O!SH*)g&]s`rnRV3hu;O7iSsjs!T`AAjoOZ/rosIJ!:0XN!q#FDrpKpXnaZVLs7?9_rq6<b
+s7cHds7uZjqtp?ir;H6dJcFU,J,~>
+JcC<$JcG*:o`"gfrqu]ks8)ckrV1j9p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<DIgtLK7
+f@JI$da?Cdc-+;PaMu3;_SO"$]tCqe\$iZMZEUO7XK&;!Vkp2`TqJ!JS!ob4QBdYsOcPN^N/EIJ
+L4t;5JUi6!I=$9cG^"=QFE2A@Df0H/CMRWtR[O;IS=TYNm<&)Fk&g6:s)\6^pI+jFs$H4KrLiqX
+gNER@k]ZurrgWYNjdH*us+0urm"+h[pODe+qOdAPs.KFcrh9:bqN(K5oSr9tnVdC*!/p_Ps0Vg6
+s0hm8s0Vp8[C#q>r3H@/rNcF/!1DT/rg3;Ds-N^crE&r"qcWl$r`f8)ra#M0r*TG2raG\5s'u%=
+"D-*6f\-8Yo9/U,oTK5ss*"<as*4Qhr-J?hrd=QjrI4Wnk^`MZqgS3dqL%[WqgA6gs*jrsrIFp!
+s+:6&s+CB+re;GKLkpnEMMd=NN/`jXO,oBbP*2#mPa.N"Q^F/.Rf8cdS=Q7CT:hmOU8"EYUnssf
+VZE`qri-""XT#=&Y-7i/!jT&:rj)X4[JmW7[fEr;\H9@S]DfGD]tXK\!l2Xgrk\]R`;[^V`lJ)"
+&BW);bKJ,Sc-FV\d*U1fdaS3F!S,d#f)aOWrn7D-h#?+1hV\=j!TE&;irS6&roO7Ekl0iHl2^/L
+liQSBmf)YVnF?&Jo)J=]o`"O`pAambq#C0hqYU0gr;?Nbrdk++s*t~>
+JcC<$JcG*:o`"gfrqu]ks8)ckrV1j9p@e1Po^qbGo'u5<n*]T0m-Es$ki_*ijQ#7Yi8<DIgtLK7
+f@JI$da?Cdc-+;PaMu3;_SO"$]tCqe\$iZMZEUO7XK&;!Vkp2`TqJ!JS!ob4QBdYsOcPN^N/EIJ
+L4t;5JUi6!I=$9cG^"=QFE2A@Df0H/CMRWt;GmNo<;fha55.;,541Q64SM8?6iTLM;"@K_;#=&b
+61mS46NBO<6f_,D;Z9Pl;Z0Pn7fQ!S7c-`47fQ!P;tj2[;u'Dh:AR]`9__?B:A@Q\;ZBr!>Q7t.
+?1qM'>Q.n(>P_:g<:s2`<;0>j<rH+u=Sl8">5hb'>lJ%.?Mn10@/aU3@fKs;A--=hI/\NpIXUfe
+n5]9`r)<W<s*"<as*4Qhr-J?hrd=QjrI4Wnk^`MZqgS3dqL%[WqgA6gs*jrsrIFp!s+:6&s+CB+
+re;GKLkpnEMMd=NN/`jXO,oBbP*2#mPa.N"Q^F/.Rf8cdS=Q7CT:hmOU8"EYUnssfVZE`qri-""
+XT#=&Y-7i/!jT&:rj)X4[JmW7[fEr;\H9@S]DfGD]tXK\!l2Xgrk\]R`;[^V`lJ)"&BW);bKJ,S
+c-FV\d*U1fdaS3F!S,d#f)aOWrn7D-h#?+1hV\=j!TE&;irS6&roO7Ekl0iHl2^/LliQSBmf)YV
+nF?&Jo)J=]o`"O`pAambq#C0hqYU0gr;?Nbrdk++s*t~>
+JcC<$JcG*:o`"gfrqu]ks8)ckrqQNf!;?EbIe<7'o()>?n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f[n^(e'cXicHXPTaiMK@_ns7)^:_+i\[T#SZa-g=XfSP%W2HJfU7n6OSXZ(9R$O#$P*(fcNJraO
+Lk^Y;K7\W'IXQTiH?aXWF`_\EEH#f5D/3p%C!b8TdaHUnopPTBp6klJrL*MLs-N_Prg3MLr0dDM
+!(HTLqEk6Lqqq#%q:u&+o:>fNq47#Hm%+1+s3q"rr6Y,_rlt>ar6+u[r2At]q5F4jp8Ihc!7USi
+s4-enrR_)%rn.;*qqLt]!5J?DotBq/rO_^7r4Vo(s7cHd!Vc<eo`4XZoDeC]oDJ7Tb4a$Lb5'0P
+aSf3==Sc2">5hb'>lJ%.?Me+/@/aU4@fBm:AGp*9s6[_i_?@c!F`qs+GQ2peH2N!fHiAEgIJeQj
+J+A-bJ,=]gIJS?dHhMd]Hi8?hIK"]qJ,OotJcC?$K*$^[L&Qf-LPYqd!K)g7N"V,1O,oBbOcklk
+Pa.N"Q^F/.Rf8csS=Q7CT:hmOU8+KZUnsrdVl6PnWiE,#XKAV-Y-7i/!O8s0Zi@B4[JmT9\%&sI
+\H0:Rrk/9E!5AHI!l2Xgrk\]R`;[_4`lH-@aN;TIbKJ,Rc-FV\cd:(edaHUoeCE+#f@S[-g"P07
+gYCW@hVR/Ji8NYSj5]4]jo4BCkNMp0!p]+;rp0^RmdC)C!q>aMrpp*\!;-6_s7ZKer:p<frqcNh
+rVZTloDX=@hZ&*~>
+JcC<$JcG*:o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f[n^(e'cXicHXPTaiMK@_ns7)^:_+i\[T#SZa-g=XfSP%W2HJfU7n6OSXZ(9R$O#$P*(fcNJraO
+Lk^Y;K7\W'IXQTiH?aXWF`_\EEH#f5D/3p%C&XP'S"-(Ar,q@JpN>\Ar,_^V!(HTLqEk6Lm@jKO
+!M?%aTDNj!G49_BG5n*0S+<$IRJiTSRJ`NNRJ_TuJaS'bJ+fK2TD"rQT`ChaU\]uNO84h)NV&1u
+Mtp9M[/dZ7[fNqFrj2[3pp0q)rNcF/!1DK,s-NGF!13XcrE/o!r`];*qcs,+ra,J/ra>_6r*oY8
+rabt="4u5\g]#q#P3nJ+P5f\)G5QRaGlE!dHN&9jI//3gIenQbJG=WkIeJ3dI/&'^HMMpdI/A?k
+IfForJH(3#K)UB(KS>-ZL&m'creUZ5MuJYJNK0'\OHGZgP*;,qQ'Rc(R$jEBRiS#iSt;RITqS3U
+USO]^VPg>jW2ZesX/i>(Xfeh1ricF.ZMq31ZiIN5[K<qJ\Gj#>]"@sSs1JEHrkANM_86,f!Q2kT
+`AGTTa2l?Db0%oNbfn>WcHjh`dF$Cje'umte^i@(f\"m2g=tB;h;-rEhr*GOiSrnXjQ,G%joOZ/
+rojLLlg+Q:!q#FDrpKpXnaZVLs766_rUp3as7cHds7uZjqtp?ir;H6dJcFU,J,~>
+JcC<$JcG*:o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-O'&l0.<mjlGI]iS`VLh:pZ:
+f[n^(e'cXicHXPTaiMK@_ns7)^:_+i\[T#SZa-g=XfSP%W2HJfU7n6OSXZ(9R$O#$P*(fcNJraO
+Lk^Y;K7\W'IXQTiH?aXWF`_\EEH#f5D/3p%C&V!4;cHasr'0p>q`Xj@pHS:6krf#8p-eaE!(-KX
+nPT<_r_N5SnO)e6oL&F@jAG\Mr)<M_njiUK!(luWnONFFqc!)an5K0_q+g`[oh>6Wkt_(Lq,72r
+s'5P/!aJr6qHX#("'f&7>l@n,>kV+j<:<c`<:s2g=8c7t=oMV(>Ph\)?2e1-?iFI4@JjU6A,^$;
+Ac@)[I!^6gnl5-Zq,I;ks)n?br-/0crd"Efrd4Wlq0i0iqLA'dpj`0ip3ldbpj;^\q0W'fqgJHm
+s*suts+13%rdt9*Kn]M\!JcL1M#iKlreqJLNfT6_OcbfiPE_>tQC!u+R@=,E*Lr[lStD[LTq\<W
+UnjiaVl-JlWN)u!X/rG*Y-+u-YQ;#7rj2X3!4Dg7!k5\Lrj`'@]DfJC]`>eG^B23e_>_:P_o2Pn
+1rdSVaN2KGb0.uPbg"GYcd0tcdF-IleC<%!f%8O+f\,!4gY:N>h;7#Gi8ESQioB([jQ6C'!U&\G
+klU/9li-5PmI'EAmfN"Knc&+Zo)SF]p&Facp\agdq>U6fqu-HjrU^#>s5*d+~>
+JcC<$JcG-;o`"gfrqu]krqZWjrV6Ee!;?EbIe<7&o'u8>n*f]3m-Es$l0.9ljl>C\i8EJJh:pZ:
+f@SR&e'ZRhcHOJSaN)<>_ns7)^:_(g\[T#SZa$a<XfSP%W2HJfU7n6OSXZ(9R$O#%P*(fdNJraO
+Lk^Y;K7\W(IXQTiH?aXWF`_\FEH#i6D/=!&cd0tcda?L4pmM2PrL3SNr0dVRns]<@!1<SMp6ttL
+pI+jF!^bi&rS[Y3rSIM1rS@P1rndY1oUYfLqOR#Fn=9^4eC;srrmLhorQt>crm(PgrQP)\s2t5<
+ri"_Ror.kfo[Nokpt#Dqrn.8(rS%2(!8R@`qS2g>qn;p?!580?pq-C8rOr&)s&&jkrqHNfp&=Rb
+oCDJMoD8%XoD\C^oD?](b5fcabOisSan3XS=8c7t=oMV(>Ph\)?2e1-?iFI4@JaO5A,g*:AcHB>
+s8'V(_s>2>FoQX_GQ)jdH2N!eHiAEgIJSE[J,+QdIJ\EgHg?"UHi8?hIK+crJ,OotJcC?$K+N]i
+Knb>;LPUeDMMd=NN/`ksNuF+BP*2#nQ'IZ%R$a;1R[]e:SXuFFTV8'RU].%rV5C/gW2ZbrWiN6#
+XTu#4YHY79Z*OA8#ILnH[^NZS\Gj&=\cBAA]E5d\^AbkP^qmk(_Sa:0rl#,^a2c9BaiV^)b5oi3
+rltPjd/MDndaS3F!S,d#f)aOWrn7D-h#?+1hV\=j!TE&;is4Z,jlY^gkNMp0#O:X@m-O-,mf)\T
+nGi%Xo)J:]o_nI_pAambq#C0hqYU0gr;?Nardk+,s*t~>
+JcC<$JcG-;o`"gfrqu]krqZWjrV6Ee!;?EbGkCUuo'u8>n*f]3m-Es$l0.9ljl>C\i8EJJh:pZ:
+f@SR&e'ZRhcHOJSaN)<>_ns7)^:_(g\[T#SZa$a<XfSP%W2HJfU7n6OSXZ(9R$O#%P*(fdNJraO
+Lk^Y;K7\W(IXQTiH?aXWF`_\FEH#i6D/=!&R[X5F!LfPQFmjGCFlRTC7JB4H6NTTJU&C_]U&C_a
+T`CbbU&UbcTD<]uG3sMCG57[.S+2sIS+W6MRJ;<qJaJ!eJ+fK3TD"rTU&C__UZda,NV/8(Mu$<N
+;Z=*1\$i]O['R*EZ2V'&YlM*.ZN-EIR/30JQMm-M=8c7t=oMV(>Ph\)?2e1-?iFI4@JaO5A,g*:
+AcH?Cg=cGYqN:]=m$%1,s)n?br-/-brd"EfrHnNkq0i*gm=4q\omQ^bqKqOSr-SBiqgJKns*sut
+s+13%rdtc8KnY89LPL\BM2I1KN/WaVrf7tZOcklkPa.N"Q^F/.R[T_8S=Q7CT:hmOU8.^`$DjVt
+Vl6SoWiE,$riHF.YHP17Z*CV6ZNmkF[C3NQ\%)FJs1/3Brk&<G^:sT]#Je0l_SX4.`;[^\`lH-@
+aN;QHrlY>dc2Puhcd;[=!RfHre,e+Nrmq2'g&B\+gYDea!T)`5huVfrro47EjlPXekND(.km-M>
+lg4!*mI'uBs7$'Yrpp*\!;-6_s7ZKer:p<frqcNhrVZTlo)=4?huA3~>
+JcC<$JcG-;o`"gfrqu]krqZWjrV6Ee!;?EbG4bCso'u8>n*f]3m-Es$l0.9ljl>C\i8EJJh:pZ:
+f@SR&e'ZRhcHOJSaN)<>_ns7)^:_(g\[T#SZa$a<XfSP%W2HJfU7n6OSXZ(9R$O#%P*(fdNJraO
+Lk^Y;K7\W(IXQTiH?aXWF`_\FEH#i6D/=!&r)3Vo;tiKV54Lf655%5=53P0/7JB4H6NBII;#!oe
+;#O8k:]O;Q6g[;?6h`qH60(o<;Z0Pd7eT@M8GGdU8Fo@N7fH?a;Z9Pg;XdW^<:N`Y:%h9X:&7W^
+:&@]`:&7`e;ZC#$>m">9>?_#1r`oJ-s'#8'rEK>.o2GTegf"2SrE/o!r`];*qcs,+ra,J/ra>_6
+qdTP7s()"<s(2:[I/\HmI/6e:<:Eo`<<#nsFoQX_GQ)jdH2N!eHiAEgIJSE[J,+QdIJ\EgHg?"U
+Hi8?hIK+crJ,OotJcC?$K+N]iKnb>;LPUeDMMd=NN/`ksNuF+BP*2#nQ'IZ%R$a;1R[]e:SXuFF
+TV8'RU].%rV5C/gW2ZbrWiN6#XTu#4YHY79Z*OA8#ILnH[^NZS\Gj&=\cBAA]E5d\^AbkP^qmk(
+_Sa:0rl#,^a2c9BaiV^)b5oi3rltPjd/MDndaS3F!S,d#f)aOWrn7D-h#?+1hV\=j!TE&;is4Z,
+jlY^gkNMp0#O:X@m-O-,mf)\TnGi%Xo)J:]o_nI_pAambq#C0hqYU0gr;?Nardk+,s*t~>
+JcC<$JcG-;o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5<n*]T0m-Es$l0%3kjl>C\i8EJJgtUQ9
+f@SR&e'ZOgcHOJSaN)<>_ns4(^:_(g\@8oRZa$a<XfSP%Vl-AeU7n6OSXZ(9R$O#%P*(fdNJrdP
+Lkg_<K7\Z)IXQTjH?j^YF`__GEH#i6D/=!'rm(\ndF-J5S,/QRS*?C:RIZdH7f>dM7/B7Pio/ko
+i:Z"'hWUR,SaE$?Sc71=eGn"rdK%\md/MAicMPidbkTB]XSJpsWW9*nWp?YWVuWaheGe"qf)F;#
+f_sJ'gAK_&h"\VS^\PVB^&PhE^&>V6]DfJ;;$-Lcp&=O_o)A1Znc84Snc8:ZoE=d/bKA!$bQ#f\
+bP00SanWsW=Sc2">5hb'>lJ%.?Me+/@/aU3@fBm:AG]s;B)cNAs7aD(_s5)=FoHR^GQ)jdH2Dpe
+Hi8?dIHQ(OIJeKhHfTMNHiAEjIK+crJ,OotJH1<$KE$T)L&Qf-LPYqd!K)g7N!YK(O,oBbP*2#n
+rfn(]Q^F/.R[]e:SXuFFTV8'RU].%mV5C/gW2]cr!NW=$XT>T.ricX4ZEggC['[7?[K<qJ\Gj#?
+]">TR]E,^[rkJKK!5\ZOs2+iTrl#,^a2c9BaiV^)b5oi3rltPjd/ME.daQ[peCE.$f@S[.g"P07
+gYCW@hVR/hhuVfrro4%?jo4BDkNM./klL)8rp9[P!:KjTs7$'Yrpp*\!;-6_s7ZKer:p<frqcNh
+rVZTlo)=4?huA3~>
+JcC<$JcG-;o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5<n*]T0m-Es$l0%3kjl>C\i8EJJgtUQ9
+f@SR&e'ZOgcHOJSaN)<>_ns4(^:_(g\@8oRZa$a<XfSP%Vl-AeU7n6OSXZ(9R$O#%P*(fdNJrdP
+Lkg_<K7\Z)IXQTjH?j^YF`__GEH#i6D/=!'rgNeTr,qIMn9+2A!-RpU!(QoUpI+jFrLs1arLs%]
+s.TIerLrq/lZVZ>o61#$rgWGHqj[>Ks+9*Ym!o(cpn%AToq;;X!2B1^iK!DeqMb0,pJD1'[^EKL
+Za-n8Yl_/7YkbR'ZMh-0RGF8"QiC1a=oMV(>Ph\)?2e1-?iFI4@JaO5A,^$9Ac?<ABE-Zag@pa.
+P5UU?PkgO;OoTY(G5QR`GlE!cHN&9iI.r'PIe8'dI/83NHMi-hI/JEmIfForJH(0#K)UE&KE-`*
+L&m'creUZ5MuJYANK0'\OHG]hPEc'3&XJcNR$jD4S"-%@StD[LTq\=]U]mTlVl-Jmri-""XT#=&
+Y-7i/#I1S?Za7$G[JmT9\%&sI\H9@S]DfGD]tXK\s1eWNrke]Q!6"lU#KFg)aN2KFb5TQbbg$.4
+!RK-ld2(0Ze'umtf%/I)f\+s3g=tB;h;-rEhu;O7iSsjs!T`AAjoX`0kl0fIlKeH9s6TgSrpTmV
+s7-*Zs766_rUp3as7cHds7uZjqtp?ir;H3cJcFX-J,~>
+JcC<$JcG-;o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5<n*]T0m-Es$l0%3kjl>C\i8EJJgtUQ9
+f@SR&e'ZOgcHOJSaN)<>_ns4(^:_(g\@8oRZa$a<XfSP%Vl-AeU7n6OSXZ(9R$O#%P*(fdNJrdP
+Lkg_<K7\Z)IXQTjH?j^YF`__GEH#i6D/=!'qG[;Vpce.0r''g=r''O3!(QoUpI+jFohbQ`qG7/h
+r_WS]rC#g9!(?TLpI,!JpHejGp/1ZapJLW^s&8JXogegKqap]Vog]!OrDNJhqGQrapJ_,kr_EGg
+r_E>dpeLWZrCm&^qbHWTpJD&u?!LT<r`]2'rEB,'qcj,,nl,QfgJe,SqH<f$r`f8)ra#M0qd9>1
+raG\5raYq<qdob=s(D7VpJ^$Ms&/o?rc\3`rcnEfqg/6grI"?fkC3&Or-\?fjEg`Nrd=Wls*jut
+rIFp!!.t3&s+CB+re:H/M#N53MMqIm$&st+O-#KeP*;.0PnB=KR$a;1S"#q=St;RITqS3UrhK^o
+VPg>jWW&muX/u<&!NrX*YQqG=ZEpmE['fnA!k5\Lrj`*A]=\'T!PQ5H^]2(L_>_=O_Z7XS`<XE'
+a2l?DaiaV+!R/gfc2l8<rm;M0e'lgre^i='f@\d0g=k<9gtgfChV\=j!TE&;irS6&roO:Fkii$1
+!UB"Mm/QGQmf)\TnGi%Xo)J:]o_nI_pAambq#C0hqYU0gr;?Nardk+,s*t~>
+JcC<$JcG0<o`"gfrVZTjs8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-O''l0.<mk2bR_iS`VMh;$`<
+f[n^)eC)akcHaYWb/hWB`P]R.^V7@m\[],W['R$AYH=n+WMcYjUnXQUSt2@?R@';*P`h/jO,]*V
+M2@"BKnFu.J:DuqH[9s^GBS(MF)c2<DJj<,C]2Q[d*^sEkaDL@n!a8GrC-EJqa:ABs5Eb2q;;)+
+k+;=<nXf?Cs4.;&f%&=Ke,[tsdf.Yjchu)gc2>fbbNc2+X8]-gWV3:aeGn(tec=>$f_aA$g&Tn&
+h#H4)^?WK0^AGV@]^rc0;$?L]nac5Kn,i.LnG_tTo)A7XoDm,.bPBB[bOs$Nao'6W=oMV(>P_V(
+?2e1-?iOO5@JaO5A,^$9Ac?<@BDuTBs7aD(_s>2>FoQX^GQ)jdH2DpdHi8?aII_jXIJ\EhHes)J
+HiAEjIK+crJ,OotJH1<$K+rumKnb>;LPUeDMMd=NN/`jYO-#M'OtDl^Q'IZ%R$a;1S"#q=St;RI
+TqS3UUnji`VPg>jWN)u!X/rG*Y-+t4Yd(I=rj)X4[JmW7[fEr;\c95@]DfJC]`>eG^B23e_>_:Q
+_o0Lm`<"!!rlG,]!6Y;a!R/gfc4&%Gd*^7hdaQ^qe^`7Mf)aOWrn7D-h#?+7hV[5Ki8NYSro4%?
+jo4BIkNM-ol0@R"rp9[P!:KjTs7$'Yrpp*\!;-6_s7ZKer:p<frqcNhrVZTlo)=4?huA3~>
+JcC<$JcG0<o`"gfrVZTjs8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-O''l0.<mk2bR_iS`VMh;$`<
+f[n^)eC)akcHaYWb/hWB`P]R.^V7@m\[],W['R$AYH=n+WMcYjUnXQUSt2@?R@';*P`h/jO,]*V
+M2@"BKnFu.J:DuqH[9s^GBS(MF)c2<DJj<,C]0_%S*P1fFl%3AF%/Xt7J9.H6i3SUUA^eYUApqY
+GNsAAGOp"VSc>5XS,/TNRfJuVS+iBFK&hLMJGl)2TD>/[U&Uk[UYLn%NV\V/Mt^'K[/RB8ZE^[=
+Yd+,1qm$()rNcQmR@3!#m[*fRr`];*qHX#*ra,J/s'Yh7qdTP7rabn;rau.Brb);brS%".rK@,C
+pltT<q3(c#s*"9`rcnEfqg/3frI"6cnp^.XqgA9fhKo0Jrd=Wls*jutrIFp!!.t3&'SM0oL5(J=
+Ll$tGMMmFPNK0'\OHKO*/X)EaQ'Rc(R$jD4S"-%@StD[LTq\<XUnsobVl-JmWiE,#XKAV-Y-5(6
+Z*CV6ZN7G@rjMj9!4`$=s1/3Brk/9E!5AHI!l2Xgrk\`S`5MYo!QN1ZaT'?^b5TQbbg$.4%+!;I
+dF$Cje'umte^j`O!SH*)g&]s`rnRh9hr!AMiSieqirS6&roOIKkih9qlK[^7m/QGQmf)\TnGi%X
+o)J:]o_nI_pAambq#C0hqYU0gr;?Nardk+,s*t~>
+JcC<$JcG0<o`"gfrVZTjs8)ckrqQNf!;?EbGkCV!o()>?n*f]3m-O''l0.<mk2bR_iS`VMh;$`<
+f[n^)eC)akcHaYWb/hWB`P]R.^V7@m\[],W['R$AYH=n+WMcYjUnXQUSt2@?R@';*P`h/jO,]*V
+M2@"BKnFu.J:DuqH[9s^GBS(MF)c2<DJj<,CK::2pcdb%r''g=r''a9s$lrUp-edFo2,Hap.tfd
+6:1T;r^>g7r^-NMqaCBMpHnRNo2>TcoMY]Xm7-k@rCHiVr(-BKr_iPhqGR,fpf./is&/hkqG7)e
+pJ:NYoM,3Xo1esV!aJr6rEB,'qc`u'q-3o*oMbQbk>V@Zr)<Jqr`];*qHX#*ra,J/s'Yh7qdTP7
+rabn;rau.Brb27W!.=N>i)K`!s*"9`rcnEfqg/3frI"6cnp^.XqgA9fhKo0Jrd=Wls*jutrIFp!
+!.t3&'SM0oL5(J=Ll$tGMMmFPNK0'\OHKO*/X)EaQ'Rc(R$jD4S"-%@StD[LTq\<XUnsobVl-Jm
+WiE,#XKAV-Y-5(6Z*CV6ZN7G@rjMj9!4`$=s1/3Brk/9E!5AHI!l2Xgrk\`S`5MYo!QN1ZaT'?^
+b5TQbbg$.4%+!;IdF$Cje'umte^j`O!SH*)g&]s`rnRh9hr!AMiSieqirS6&roOIKkih9qlK[^7
+m/QGQmf)\TnGi%Xo)J:]o_nI_pAambq#C0hqYU0gr;?Nardk+,s*t~>
+JcC<$JcG0<o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_noO?jn*f]3m-O'&l0.<mjlGI]iS`VMh;$`<
+f[n^(eC)akcHXSVaiMNA`5BI-^V.:l\[])V['R$AYH=n+WMcYjUnXQUSt2@?R@';*P`h2kO,]*V
+M2@"BKnG#/J:E#rI!U*`GBS+NF)l8>Df0E.c-H:6o:,]Ko:,6<p7(`DrC6`SpI+mGr8Rb8pu)//
+!9!e4s5)b,p7:rLnXTg9f@SU)rmgtsrmUkp!7C\jqp5;frltDcq5jOsmB$;fri5Rhpo+&=r71et
+s4I2$rn@A+rS78*pV,h*r4_g:qn2j=pe^rerp]dQs7#sVs76-[qt0g1r6+ZTr6+lXo?%$Rr`T5(
+r`f5(ra#M0qd9>1raG_6raYq<qITY<rb).Br;Yrss2"9Cs)n<ar-/-brH\9drHnHigjT'Iqg7p\
+nTjkTrd4Wlr-eTo!.Xrt!eGrTre!CfKnY89LPUbCM2I4MN/`gWO,oBbP*2#nQ'IZ%R$a;1S"#q=
+St;RITqS3UUnjiaVPg>jWN)u!XK8P+Y-7i/#I1S?Za7$G[JmT9\%&sI\H9@S]DfGE]tV5[^B23e
+_>_:V_o0L4`Q#p<rlG,]!6Y;a!R/gfcMu2jd/MDndaS3F!S,d#f*Bs]g"P07gYDea!T)`5huVfr
+ro=%>!9O4B!U&\Gl2U#Kli-8Nm/ZSRn,MkWnbr%Yo)SF]p&Facp\agdq>U6fqu-HjrUTr=s53j,~>
+JcC<$JcG0<o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_noO?jn*f]3m-O'&l0.<mjlGI]iS`VMh;$`<
+f[n^(eC)akcHXSVaiMNA`5BI-^V.:l\[])V['R$AYH=n+WMcYjUnXQUSt2@?R@';*P`h2kO,]*V
+M2@"BKnG#/J:E#rI!U*`GBS+NF)l8>Df0E.R@4#Bj`LKEfQ@']rC-HKqa:1Q!2B=`p7hG.rHS!Z
+m<85JnTOo's./eO!1`\Nq3pu-!.sThrdsutmst8,s.9%YqOmk^rM'"\fT,T`qi(H2pe^re!OB!*
+YQ1m)YlD!*ZMh,eR-^1==oMV(>P_V(?2e1-?iFI4@JjU6A,^$8Ac?<@BDcECg&9XtOnk11PPUIB
+FoHR^GQ)jcH2DpdHi/9HIJ\EhHh2RRH1uXaHiAEjIK+`rJ,Om!JV&LQK0FsBKnb>;LkpnEMMmFP
+NK&sZO-#KeP*;,qQ'Rc(R$jD4S"-%@StD[LTq\<XUnsrcVl-JmWiE,$XKAV-YPta2Z*L[AZa@*I
+rjDm;\@DOK!kQ"Urk&<G^:sT]!l2Xgrk\oX`5KX6`l?'uaT'?^b5TQbbg$.4s3C\lrm:bpe,Iht
+e^j`O#M@__g=k<9h#?+1hV\=j!TE&;j8\0?jo4BCkNMp0s69UMrp9[P!:KjTs6p$YrUU![!;-6_
+s7ZKer:p<frqcNhrVZTlo)=4?huA3~>
+JcC<$JcG0<o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_no=3hn*f]3m-O'&l0.<mjlGI]iS`VMh;$`<
+f[n^(eC)akcHXSVaiMNA`5BI-^V.:l\[])V['R$AYH=n+WMcYjUnXQUSt2@?R@';*P`h2kO,]*V
+M2@"BKnG#/J:E#rI!U*`GBS+NF)l8>Df0E.r`'#!;cETXg-,?tp-8I=qE=dHrC-HKqa9OC!)NJY
+!(6<FqEs^<njE:@nknUKr'fp@q+(ETl::kPq,.#eqc!2f!)r_lrD*5crD<5ao1npPpeL`]pe^re
+qc`r&qc`u'pfmf)pJ^W^mSim[s&8o"r`];*qHX#*ra,J/ra>_6r*oY8rabk:rau.Br+Q"TiD]GL
+s)n<ar-/-brH\9drHnHigjT'Iqg7p\nTjkTrd4Wlr-eTo!.Xrt!eGrTre!CfKnY89LPUbCM2I4M
+N/`gWO,oBbP*2#nQ'IZ%R$a;1S"#q=St;RITqS3UUnjiaVPg>jWN)u!XK8P+Y-7i/#I1S?Za7$G
+[JmT9\%&sI\H9@S]DfGE]tV5[^B23e_>_:V_o0L4`Q#p<rlG,]!6Y;a!R/gfcMu2jd/MDndaS3F
+!S,d#f*Bs]g"P07gYDea!T)`5huVfrro=%>!9O4B!U&\Gl2U#Kli-8Nm/ZSRn,MkWnbr%Yo)SF]
+p&Facp\agdq>U6fqu-HjrUTr=s53j,~>
+JcC<$JcG0<o`"gfrqu]krqcZjrqQNf!;?Eb!VH!_nosWnn*f]3m-O$%l0.<mjlGI]iS`VMh;$`<
+f[n^(eC)akcHXSVaiMNA`59C,^V.:l\[])V['R$AY-"e*WMcYjUnXQUSt2C@R@'>+P`h2kO,f0W
+MM[+CKnP)1J:E#rI!U*`GB\1OF)l8>Df0H/bfn>Wcd2EVnsoECpR:H<qjROTrC6`SpI+pHq;MD5
+ro!h8pu),.qk*#BoUY`JpRV>Ss4RP-f[p,Rr71_prmLenq9]/fs3CYhs312<m&g)bs/Z!rr2K^p
+r2K_Gp=08rf@\aRg&Ke(g]-(*h>c=3htFeH^\tn6^&G\;:]OAkmf;eSn,2\Tnc&+YoDA1Abl5f\
+b4NgUaSoBA>Ph\)?2e1-?iFI4@JaO5A,^$9Ac?<@BDQ<AC&J"o_Z.IC_>n`XG5HL_Gl;paHMi-f
+I,o_PI/A9`HK]YMHN&9kI/JEmIfFosJ-(:RK)UB'KSBD[!JcL1M(X[DN/WaVO,oBbP*2#nQ'IZ%
+R$a;1S"#q=St;RITqS3UUnjiaVPg>jWN)u!XT#=&Y-7i/!O8s0ZNmkF[C3NQ\%)FJs1/3Brk/9E
+!5AHIs1eWNrke]Q!6"lUs2G&Zrl>/_b0'_,!R/gfcMu2jd/MDndaS3F#M%DVf@S[-g&B\+gYDea
+#N"@qi8ESQir7sCjQ5Lck3(pkrojLLlg+Q:!q#FDrpTmV!:g$Y!qZ'VrUp3as7cHds7uZjqtp?i
+r;H3cJcFX-J,~>
+JcC<$JcG0<o`"gfrqu]krqcZjrqQNf!;?Eb!VH!_no=3hn*f]3m-O$%l0.<mjlGI]iS`VMh;$`<
+f[n^(eC)akcHXSVaiMNA`59C,^V.:l\[])V['R$AY-"e*WMcYjUnXQUSt2C@R@'>+P`h2kO,f0W
+MM[+CKnP)1J:E#rI!U*`GB\1OF)l8>Df0H/r0[PR\odsBrC6`SpI+pHqP!n_pn@MXom$(Pm<85J
+olg>+s./tUrL<YRpRD&Kh1>TXqLS0erLa%[pn.DUs.T@bpS6)qoSrj/ohYZdYPta+YPtd*YPbX(
+Z2M!-Zi@>cR.?UDQMt(d>Ph\)?2e1-?iFI4@JaO5A,^$9Ac?<@BDQ<AC&H]XOnk19P5pjCPP^LC
+FoHR]GQ)jcH2;jbHi/9PIJS?gHhD^KH22dcHiJKkIK+crJ,Xs"JV&LQK)pXZre:H/M#N5`MMmFP
+NK0'\OHG]hPE_>tQC!u+R@9V7S=Q7CT:hmOU8+N[V5C,fVl6SpWiN6#XT>T.ricF.ZMq08['d<M
+[^W`Urji'?!5&6Cs1JEHrkJKK!5\ZOs2+iTrl+oW!6>)[!m/U-rlY>dc2Q#gcN)>kd/h\ErmV2'
+f%/I)f\"mVg&]s`rnRh9hr!AMiSieqis4Z,jlY^gkNMp0!p]+;rp0^RmdC)Cs6p$YrUL$]o^r+T
+s7ZKer:p<frqcNhrVZTlo)=4?huA3~>
+JcC<$JcG0<o`"gfrqu]krqcZjrqQNf!;?Eb!VH!_nosWnn*f]3m-O$%l0.<mjlGI]iS`VMh;$`<
+f[n^(eC)akcHXSVaiMNA`59C,^V.:l\[])V['R$AY-"e*WMcYjUnXQUSt2C@R@'>+P`h2kO,f0W
+MM[+CKnP)1J:E#rI!U*`GB\1OF)l8>Df0H/<)cjt<)h4-q`amArBC*As%!#WrC-HKr'LN^:J^4O
+p-\C=qEs^<njEFDo24mQrDW_oqF0O9rC?iXm77+Qqbd5gqc!>jr)<Gip.kW`s%r5]qG-NSpJ1BX
+!)`\urEK,%s',5&!+#@umSrRPqGdGtrEK/(ra#M0qd9>1raG\5raYq<qdob=rb)(@s(VCXnPf*Y
+r)<>h!-S9aqfi$arH\6cr-S?hjF-lPqg8!^k]uuMrd4Zmr-eTos*t#u!eGrTrdt6)L&Qf-LPYqd
+/rGRGN/`jYO-#KeP*;,qQ'Rc(R$jD4S"-%@StD[LTq\<XUnsrcVl-JmWiE,$riH4(YPta,Z*OA8
+#ILnH[^NZS\Gj&=\cBAA]`5YF^AbnI^];4M_Z.LR`;[aU`W4'Ya9'K+b5TQbbg$.4s3C\lrm:bp
+e,Ii%e^i='f@\a/rn7D-h#?+7hV[5Ki8NYSro47EjlPXekND(.klU/9li-5PmI'EAn,MkWnbr"[
+oCV\Rp&Facp\agdq>U6fqu-HjrUTr=s53j,~>
+JcC<$JcG3=oD\^erqu]ks8)ckrV-Hgp@eLYHh?q#o'u5=n*f]2m-Es$l0.9ljlGI]iS`VLh:pZ:
+f[n^(e'cXicHXPUaiMNA`59C,^V.:l\[])V['R$AYH=n+WMl_kUnaWVSt;IAR@'>+P`q8lO,f0X
+MM[.DL4k22J:N)sI!^0bG^"=QFE;GAE,KQ1bKS2TcMj<rSG8QRRc0_9Rf5hU7f>dM7/]LQj7qX3
+i<&#tiVVO5htE]*T(\`IT(ni_gY1?6f\"g-f%0`Ks3q%trmLbms3U_lrm1_mcHb1HqQ0LnpT"&>
+!nPuTrn.5'rn@A+rS7>,#N"@qi8ESQir6^g^?*--^?iQ*;#g"^melPRnG_tXo)J:^o_&.Ss3:Md
+!6slSrQG#Zp<!9S!*]A+qcs,+ra,J/ra>_6qdTP7rabn;rau.BqIokBrbDE3kJI26oYLTNrHA'^
+rcnBeq0MscqL%[Yq0`'dom6FZnTaqVq0N'frd=Zms*artrI?_UJqAW-KS5&6L51P?M2@+JN/WaV
+NfT6_OcklkPa.N"Q^F20S"#q=St;RITqS3UUnjiarhfpuWN)u!XT#=+Y-5(6Z*CV6ZN7G@rjDm;
+\@DOK!kQ"Urk&<G^:sT]!l2Xgrk\`S`5MYo!li:$rl>/_b0'_,#L(H;cHab^d/MDtdaQ[peCE+#
+rmq2'g&B_*gAp%.h#ZBirnn%?io9"YjQ,G%joX`0kl0fJlKdd8liQSBmf)\Tn,W"WncJFTo_nI_
+pAambq#C0hqYU0gr;?Nardk+,s*t~>
+JcC<$JcG3=oD\^erqu]ks8)ckrV-Hgp@eLYG4bCso'u5=n*f]2m-Es$l0.9ljlGI]iS`VLh:pZ:
+f[n^(e'cXicHXPUaiMNA`59C,^V.:l\[])V['R$AYH=n+WMl_kUnaWVSt;IAR@'>+P`q8lO,f0X
+MM[.DL4k22J:N)sI!^0bG^"=QFE;GAE,KQ1r0dP,]QF-CrC6`SpI+sIs.]@`rhB1]r1X18np'_L
+n94GJpicV-s./\Mp7(uKd=Lk=rLa(\qOd_Zr1Wt]qkO+crf>EdoSrK>!O&a+Y5ka(YPtd(Z2_-/
+Zi.3'QiNK5R.lsHQ2k+f>Ph\)?2e1-?iFI4@JaO5A,^$9Ac?<@BDQ<@C&VlGg@UO&P4=b6OoTY'
+G5HL_Gl;p`HMi-dI-l@XI/A9`HMMjVGl)d^HN/?kI/SKnIK4lrJ2Dh/JqJ]/KS>/8LPL\BM2I4M
+N/`jXO,oBbP*2#nQ'IZ%R$jD4S"-%@StD[LTq\<XUnssfVZj#uWiE,$riHC-YHY79Z*OA8!OT96
+[K<qJ\Gj#?]">TR]E5d\^AbkK^qmkd_?.Wn`;[^W`lH.!a9'K+b5TQhbg"DXcHjh`rm:u!e'lgr
+e^`7Mf)aOWrn@D,!8RS0!T)`5i!86#ioB([jQ6C'!pAe2rojLLlg+Q:!q#FDrpTmV!:g$Y!qZ'V
+rUp3as7cHds7uZjqtp?ir;H3cJcFX-J,~>
+JcC<$JcG3=oD\^erqu]ks8)ckrV-Hgp@eLYHh?q#o'u5=n*f]2m-Es$l0.9ljlGI]iS`VLh:pZ:
+f[n^(e'cXicHXPUaiMNA`59C,^V.:l\[])V['R$AYH=n+WMl_kUnaWVSt;IAR@'>+P`q8lO,f0X
+MM[.DL4k22J:N)sI!^0bG^"=QFE;GAE,KQ1;cH^r<Q[Ju55RMB8,YpU7JB4K6hjIW:]O;_:tnA+
+6M!S:;=7?Z;sd$S8,YpM7fZ$B8,Z?a;>X8g;uTbi;u9Jc:@1jR:@1dQ:@q?_>Q.h*>P_P'>Pqb+
+?2e(0?!d2&nPndPrDWc#r`f8)ra#M0qd9>1raG\5raYq<qdob=rb)(@rb;@H"+,??Hgao+;Z0Ph
+;uh(>G5HL_Gl;p`HMi-dI-l@XI/A9`HMMjVGl)d^HN/?kI/SKnIK4lrJ2Dh/JqJ]/KS>/8LPL\B
+M2I4MN/`jXO,oBbP*2#nQ'IZ%R$jD4S"-%@StD[LTq\<XUnssfVZj#uWiE,$riHC-YHY79Z*OA8
+!OT96[K<qJ\Gj#?]">TR]E5d\^AbkK^qmkd_?.Wn`;[^W`lH.!a9'K+b5TQhbg"DXcHjh`rm:u!
+e'lgre^`7Mf)aOWrn@D,!8RS0!T)`5i!86#ioB([jQ6C'!pAe2rojLLlg+Q:!q#FDrpTmV!:g$Y
+!qZ'VrUp3as7cHds7uZjqtp?ir;H3cJcFX-J,~>
+JcC<$JcG3=oD\afrVZTjs8)ckrqQNfs7ZKcs7CU.o()>?n*f]3m-O''l07Bnk2kX`io&bOh;-i>
+g"4j+eC2jncd'eYbK7iF`PfX0^q[Rq]=GG[[C!9FYck11Wi;qpV50l[TUqaFS!fY1Q'IPrOcPN^
+N/EIJLPCJ7Jq8H%I=6HgH$FOVF`_\FEH#i6D9L,Hbh\fFS,>eT7f>dN7/]LOj7hO5j8J!;iV_X&
+TBr0HSaE$HSc@IJgY1B6f`'M%f)F5"eGn"tde(reciDDFXno-hX8UWLeH4=RfDXD$g&Tn)h#?+8
+hV[5Ki8NYSir7s<jOq<D^@Ao-;#]n_mJZJPn,MnWnH&4Prq-0^s7H<8rm(Gdo$$jOr6"iWqoAbA
+qcs,+ra,J/ra>_6qdTP7rabn;rau+Aqe5qBrbDFJrr;,trPA0Ds)n<aqKMp`rH\0aqg7IQqKqm]
+qK_:LrH\9drd4ZmrI+]ps*t#u$\<n]K7ei2Knb>;M#N5VMMmFPNK0'\OHG]hPE_>tQC!u+R@9V7
+S=Q7CTV8'RUSO]^VZ*J2W2ZesX/rG*Y-+t4Yd(L>Za7$H[C3NQ\%)FJs1/3Brk/9E!5AHIs1eWN
+rke]Qs2=oU!li:$rl>/_b0'_,#L(H;cHab^d/MDodaQ\Ee,e+Nrmq5(g"HAY!ScE/h#cHjhu;O7
+iSsjs!p&J)roOIKkih9qlK[^7m/QJQmf)YVnF?&Jo)J=]o_nI_pAambq#C0hqYU0gr;?Nardk+,
+s*t~>
+JcC<$JcG3=oD\afrVZTjs8)ckrqQNfs7ZKcs7CI*o()>?n*f]3m-O''l07Bnk2kX`io&bOh;-i>
+g"4j+eC2jncd'eYbK7iF`PfX0^q[Rq]=GG[[C!9FYck11Wi;qpV50l[TUqaFS!fY1Q'IPrOcPN^
+N/EIJLPCJ7Jq8H%I=6HgH$FOVF`_\FEH#i6D>fn"Fh`%r8,YpU7JK:L6iEbWU&1S[U&UheU&9-,
+Gg^g6G5e*0Sa`0FS,Sl&Jb4KkTDtM\TDYA]U%Y2\U\pqdV=ou3Nqe\5NqSJ';#[ZqXoP[(YlD!.
+ZMq01ZMq31ZLsU`QfFJ.QN17e>lJ%.?Me+/@/aU3@fBm:AG]s;B)QB>B`2ZECAr#Jg@UO%P4Xt7
+P5f\(G5?F^Gl;p_HM`'OI/83_HMVpNGl;pbHN&9kI/SKnIfFosJ.$p[JqJ]/KnY89LPYqd,`7M=
+N/`jYO-#KeP*;,qQ'Rc(R$jD4S"-%@StMdNU8+N[V5F6i)5sO7WiN5'Xfeh1YctC<ZEpmE[C*HO
+\$rmH\c95@]DfJC]`>eG^]2(L_>_=O_uI[S`<+'"a8X-]ai_d*b6Q89c-FV\cd;[=!n,QHrmUu!
+f)F8&f\+sWg&]s`rnRY4hr"Fk!TE&;ir\<'jo4BIkNM-ol0@R"rp9[Ps6fmT!q>aMrpp*\s7H9_
+s7ZKer:p<frqcNhrVZTlo)=4?huA3~>
+JcC<$JcG3=oD\afrVZTjs8)ckrqQNfs7ZKcs7CU.o()>?n*f]3m-O''l07Bnk2kX`io&bOh;-i>
+g"4j+eC2jncd'eYbK7iF`PfX0^q[Rq]=GG[[C!9FYck11Wi;qpV50l[TUqaFS!fY1Q'IPrOcPN^
+N/EIJLPCJ7Jq8H%I=6HgH$FOVF`_\FEH#i6D,XA4<5h#s55[SA8,YpU7JK:L6h=+H:sMH'6MEk=
+;<_!E7f5dM8GbpL7f,^S;Z9Pl;X.3\;Z0P]:Adod:B"&Z:A.E[:@_6\>5MP(>5_\)>l7n+?L^tg
+<9R9Z;ug/">lJ%.?Me+/@/aU3@fBm:AG]s;B)QB>B`2ZECAr#KH2r<\;tNu_;uTbrFoHR\GQ)jc
+H2)^_Hff_PHhD^]H0BMOH2DpeHiJKlIK+crJ,Xs+JV&K+K7nr4L5(J>reVnXMi<USNfT6_Ocklk
+Pa.N"Q^F/.R[]e:SXuFGTqS3UUnjiarhgX4WN)u!XKAV-Y-5(6Z*L[AZa@-J[^NZS\Gj&=\cBAA
+]`5YF^AbnI^];4M_Z.OR`;[^W`lH.!a9'K+b5TQhbg"DXcHjh`rm:eqe'n<G!S,d#f)jUXg&B\+
+gYDea!oDhlrnmh9ir7s>jQ5M&jp1)5kiq?slKeH9s6]jSrpKpXnaZVLs7?9_rUp3as7cHds7uZj
+qtp?ir;H3cJcFX-J,~>
+JcC<$JcG3=o`"gfrquZjs8)ckrqQNf!;?EbHh?q$o()>?n*f]3m-O''l0.<mk2bR_iS`YNh;$c=
+g"4j+eC2gmcd'eYb/q`E`PfX0^q[Rq]=GG[[C!9FYck11WiE"qV50l[TV%gGS!o_2QBdYsOcPQ_
+N/NOLLPCM8K7SQ&IXQTiH?aXXF`__GEH,o7b0%oNbiG;mSbel?S,8`P8,c!V7JB4L6i5p7irA!;
+i9-a&T)"rESdCtEh;-l@g=b03rn%2$s4./!s3q"ro[3]c!709!m]?Dgr71o#f`'S(gATe(h#H17
+hr*GOiSrkqj8S*>jk%9?^@o81;#BYYmKE"Jnac;Mo`"O^oDm/2cMYrXbl#Z\b5BBWaSfBC?2e1-
+?iFI4@JaO5A,^$9Ac66?BDQ<@C&MfDC]=@r_Yh7D_>n`XG5?F]Gl;p^HMMpVI//-]HM`!aGjoqS
+Gl;pbHN/?lI/SKnIK4lsJH(0#K)UB'KSBD[22@!EM2I4MN/`gWO,oBbP*;,qQ'Rc(R$jD4S"-%@
+StD[LTq\<XUnsrdVl6SpWiN5'Xfel,YQ;#7rj)X4[JmT9\%&sI\H0:Rrk/9E!5AEH!l2Xgrk\`S
+`5MYos2G&ZrlG,]!6Y;as3(Jfrm(Pi!7:_ms3^nrrmV2'f%/I)f\"mVg'?BfgtgfChV\=j!o`.u
+ro4%?jo4EBk5a`Fl2U#Kli-8Nm/ZSRn,MnWnc&+ZoDeI]p&Facp\agdq>U6fqu-HjrUTr=s53j,~>
+JcC<$JcG3=o`"gfrquZjs8)ckrqQNf!;?EbHh?q$o()>?n*f]3m-O''l0.<mk2bR_iS`YNh;$c=
+g"4j+eC2gmcd'eYb/q`E`PfX0^q[Rq]=GG[[C!9FYck11WiE"qV50l[TV%gGS!o_2QBdYsOcPQ_
+N/NOLLPCM8K7SQ&IXQTiH?aXXF`__GEH,o7Q^=)-RJ:plFS9k@FSg4W8,c!V7JB4L6i3SXU%tGW
+U%`d(GgU^8G5Im1SaN$ES,Sl$Jb=QiTDYA[U&(M_U].(fV>[:YO7\J0NrY43O8b18NU]j@Y5b[.
+Yd(I=ZMq30Z2h60ZLjO\QfOP2Qi11g?2e1-?iFI4@JaO5A,^$9Ac66?BDQ<@C&MfDC]<&[OnY%2
+PPUFBFoHR\GPudbH1uX\Hgc@XHh;X]H2;dTGPcX`H2DpfHiJKlIK+`rJ,XuuJH1<$K)pXZre<:c
+Ll$tGMi<USNK0'\OHG]iPa.N"Q^F/.R[]e:SXuFFTV8'RUSO]^VPg>jWN)u!XKAV-YPta,Z*OA8
+!OT96[K<qJ\Gj#>]"@sSs1JEHrP&EL_86,f!lMsprl+oW!6>)[s2b8`rlb>c!6tMgs3C\lrmCbo
+!7Uqs#M%DVf@S[-g&B\1gYCT?h;7#Grnmk:io9st!T`AAk5XTEkl0iHl2^/Lm/QGQmf)\TnGi%X
+o)J=]o_nI_pAambq#C0hqYU0gr;?Nardk+,s*t~>
+JcC<$JcG3=o`"gfrquZjs8)ckrqQNf!;?EbG4bCto()>?n*f]3m-O''l0.<mk2bR_iS`YNh;$c=
+g"4j+eC2gmcd'eYb/q`E`PfX0^q[Rq]=GG[[C!9FYck11WiE"qV50l[TV%gGS!o_2QBdYsOcPQ_
+N/NOLLPCM8K7SQ&IXQTiH?aXXF`__GEH,o7rDN\qj?<3#kWSf,qFCNSrC-HKr^-Z^nPAsWb<tti
+qa9mNlVct:qa^BOr($0EpJU*OgJ.`EmnWgUrD)lZs'#)"!*oG-qd/YgrD_fU!*&o%ra#M0qd9>1
+raG\5raYq<qdo_<rb)(@rb;=GqeQ4X!.405o2>B_r_rl?rc\-^rHS9dpNlX^msOqXoQpC[qKVLR
+qfr'bqg/9hs*Xcns*artrdb$"!.t3&!JH1+L,FaBM2@+JN/WaUNfT6_OckomQ'IZ%R$a;1S"#q=
+St;RITqS3UUnjiaVl-JmWiE,$Xf\b0ricF.ZMq02['fnA!k5\Lrj`'@]DfJC]`>eF^B23e_>_:Q
+_o0Lm`W*pXa8X0[aT0K_bQ#cdc2Q#gcN)>kdJqVpe,Ii%e^i='f@\a/rn7V3gt^`AhVR/hhu_ls
+ir7s=jQ6C's5sCGrosIJ!:0XNs6TgSrpTmVs7-*Zs7?9_rUp3as7cHds7uZjqtp?ir;H3cJcFX-
+J,~>
+JcC<$JcG6>oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_no=3hn*f]3m-O'&l0.<mjlGI]iS`VMh;$c=
+g"4g*eC2gmcd'eYb/q`E`PfX0^V@Ip]",>Z[C!9FYck11WiE"qV50l[TV%gGS!o_3QBd\tOcYW`
+N/NRMLPCM9K7\W(IXQTjH?jaZG'%hIEcH&:rQ<ues.0(Xn!j$@s%)uVr^QiTpI,$Kq;_J6rT!\4
+ih-";!2&8Bs53k4s4d\1g=lPYrn%2#s3q,!daId8s3UMBrN>suordtim]?H?s4I>(rn7A,r7q>.
+s5!n9i8ESQro3k9roF+@d_GUlpV$)ns6TgQr9XXTn*ol<qt'm]qt0m6pWi]]o$%$Tr6"u[q8iS@
+ra#M0qd9>1s'be6raYq<qITY<rb)(@rb;=GqJ6+Irr;,trPA0D!-S6`qKMm_rH\'^k'Q`Hqg&$_
+l$*)NrH\<es*OcnrI+]p!.Xuus+(0%re!4aKnb>;LPUeDMMmFPNK0'\OHG]hPE_>tQC!u,R[]e:
+SXuFFTV8'RUSO]^VPg>jWN)u!XKAV-YPta1Z*L^B['[7?[K3kIrj`*A]=\'T!kl=^rkJKK!5\ZO
+s24lTrl"rYa2e2#s2b8`rlb>c!6tMgs3C\lrmCbo!7Uqs!nGlQrmq2'g&B_*gAp%.h$;fohr*GO
+iSsjss5X1AroO:Fkii$1!p]+;rp0^RmdC)Cs7$'Yrpp*\s7H9_s7ZKerV6BfrqcNhrVZTlo)=4?
+huA3~>
+JcC<$JcG6>oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_noF9in*f]3m-O'&l0.<mjlGI]iS`VMh;$c=
+g"4g*eC2gmcd'eYb/q`E`PfX0^V@Ip]",>Z[C!9FYck11WiE"qV50l[TV%gGS!o_3QBd\tOcYW`
+N/NRMLPCM9K7\W(IXQTjH?jaZG'%hIEcH&:R/WHEFmF/GFmjGGFoP#/8,c!V7JB4M6h[8QU]7(b
+U$-aLGQ4<3T)5)QSG/NQR`^3UJH)8>T_P5YUA^kdV#."gVZ3RTO8P%7O8G%7O8Ft9NU]jFY5PL&
+Xotr4Yd(J3ZhUj*RJ*$CQfFJ5QiC=i?2e1-?iFI5@JaO5A,^$8Ac?<@BDQ<@C&MfCC]A5Mg&R</
+OnY%0PPgRDFo?L[GPudbH1cLGHh;X]H2;dMGPudbH2N!gHiJKlIK+`rJ,XuuJH1<$K/nU=L5(J=
+Ll$tGMi<USNfT6_OcklkPa.N"Q^F20S"#q=St;RITqS3UUnjiaVl-JmWiE,$Xf\b0ricU3ZEpmE
+['fnA!OoT<\H9@S]DfGE]tV5[^]2(L_>_=O_uI[S`<+'"a8X0[aT0K_bQ#cdc2Q#gcN)>kdJqVp
+e,Ihue^i=Nf)aOWrn@D,!8RS0#N"@qi8ESQir8!<j8e<@joX`0kl0fJlKdd8liQSBmf)\TnGi%X
+o)J=]o_nI_pAamcq#:*gqYU0gr;?Nardk+,s*t~>
+JcC<$JcG6>oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_noaKln*f]3m-O'&l0.<mjlGI]iS`VMh;$c=
+g"4g*eC2gmcd'eYb/q`E`PfX0^V@Ip]",>Z[C!9FYck11WiE"qV50l[TV%gGS!o_3QBd\tOcYW`
+N/NRMLPCM9K7\W(IXQTjH?jaZG'%hIEcH&:<)cdphEC^!mlgA.s%)uVr^QiTpI,$K"Aqul:J^sd
+p.tT_fgG<sr^6?Fs$Q?SlVcq9kst85ohtTarD`AefM;<>mnWCLs'#,#s'5P/q-O&"bu=XIra#M0
+qd9>1s'be6raYq<qITY<rb)(@rb;=GqJ6+I!df6>mo/dTpeq2mFo?L[GPudbH1cLGHh;X]H2;dM
+GPudbH2N!gHiJKlIK+`rJ,XuuJH1<$K/nU=L5(J=Ll$tGMi<USNfT6_OcklkPa.N"Q^F20S"#q=
+St;RITqS3UUnjiaVl-JmWiE,$Xf\b0ricU3ZEpmE['fnA!OoT<\H9@S]DfGE]tV5[^]2(L_>_=O
+_uI[S`<+'"a8X0[aT0K_bQ#cdc2Q#gcN)>kdJqVpe,Ihue^i=Nf)aOWrn@D,!8RS0#N"@qi8ESQ
+ir8!<j8e<@joX`0kl0fJlKdd8liQSBmf)\TnGi%Xo)J=]o_nI_pAamcq#:*gqYU0gr;?Nardk+,
+s*t~>
+JcC<$JcG6>oD\^erqu]ks8)ckrV-Hgp@eLYG4bCso'u8>n*f]3m-O$%l0.<mjlGI]iS`VMh;$`<
+f[n^)eC2glcd'eYb/q`E`PfX0^q[Rq]=GG[[^<BGYck11X/`+rVPKu\Tq@pIS!ob4QBd\tP)t`b
+N/WXNLk^Y;K7\Z)Isl`lH?sg[G'.nJEcH);rlX]"s./>Cn=06D!(m/\qFCNSrC-HK!(658qr62!
+j.6V:i8EMLh;$c>g"HAW#1qGWe^W'rqpG5f!7CYFriZ:'ordqjpoaLro;qrFrnID,s5!_3rnm_5
+s5<t;r8[e;"m+n/kND'O^\GM2;#KY_mI'H4nbr(Ro`+U]chG`bc10$VbP]N]ao'6[a8]HE?Me+/
+@/aU4@fBm:AGTm:B)ZH>B`;`ECADZDC]J>Os4>-fFoHR[GPl^aH1Q@MHh2R\H2DjIGPudcH2N!f
+HiJKmIK+`rJ,XuuJI-p\K7no3L5(J>reWgrMi<USNfT6_OckomQ'IZ%R$a;1S"#t?StD[LTq\<X
+UnsrdVl6SpWiN5'Xfek3Yd(I=Za7$H[C3NQ\%)FJ!P5oB]`5YF^AbnI_#M7M_?.Wn`;[aU`W4'X
+a9'K+b5TQcbg"E3cMu2jd/MGmdK%bqe,n1Of)F8+f\+s3g=tB;rn[V2!8me6!o`.uro47EjlPXe
+kND(.l2U#Kli$/OmI'EAn,MkWnbr%YoDeI^p&=[bp\jmdq>U6fqu-HjrUTr=s53j,~>
+JcC<$JcG6>oD\^erqu]ks8)ckrV-Hgp@eLYG4bCso'u8>n*f]3m-O$%l0.<mjlGI]iS`VMh;$`<
+f[n^)eC2glcd'eYb/q`E`PfX0^q[Rq]=GG[[^<BGYck11X/`+rVPKu\Tq@pIS!ob4QBd\tP)t`b
+N/WXNLk^Y;K7\Z)Isl`lH?sg[G'.nJEcH);rg<4us)e9`eo^_1!(m/\qFCNSrC-HK!(6@PrM0Ce
+rLr=te9:ncqk*n[p7;/Ppm_;R!1V#[q1/45rhBCe!i2TdrhTOirhf[m!2f^m!3"P2o8rg/s,HJD
+rN6+&"0\r6Z21d+Z2Cp-Zhp0dR.Zg-R/^Ik?Me+/@/aU4@fBm:AGTm:B)ZH>B`;`ECADZDC]J>O
+g@UO%P4Fh8P5f\(G56@[Gl;pZHL?.OHM`!bGiX)IGlE!dHN&9kI/\QoIK4lsJH(0,JqJ]/KS>/8
+LPYqd5)P8WN/`jYO-#KePE_>tQC!u+R@9V7SXuFFTV8'RUSO]^VPg>jWN)u!XKAV-YHY79Z*L^B
+['d<M[^W`Urj`'@]DfJC]`>eG^]2+L_>_:Q_o0Lm`W*pXa8O'\ai_d*b6#o4c2Q#gcN)>kdJqVp
+e,Ihue^i=Nf*Bs]g"P07gYDeas5!b5rnmk:io9st#NY".k2tjikl0iHl2^/KliQSBmf)\Tn,W"W
+o)J=]o`"O_pAamcq#:*gqYU0gr;?Nardk+,s*t~>
+JcC<$JcG6>oD\^erqu]ks8)ckrV-Hgp@eLYG4bCso'u8>n*f]3m-O$%l0.<mjlGI]iS`VMh;$`<
+f[n^)eC2glcd'eYb/q`E`PfX0^q[Rq]=GG[[^<BGYck11X/`+rVPKu\Tq@pIS!ob4QBd\tP)t`b
+N/WXNLk^Y;K7\Z)Isl`lH?sg[G'.nJEcH);r`&>Ls$#!sq*"dMr^clUr^QiTpI#!Kr_`Ph!`;cj
+pJ:fcj?rN*p-JUC!(6BFr_i>bpJUfc!)hoJkst>7pJUleqGd&bfM;9=nP8OLs',A(s',G,!+#M/
+rE]G0qc(sAs'>V1qd9>1raG_6raYq<qITY<rb)(@rb;=Gq.oqF")W@1Hgao(;YX2jFoHR[GPl^a
+H1Q@MHh2R\H2DjIGPudcH2N!fHiJKmIK+`rJ,XuuJI-p\K7no3L5(J>reWgrMi<USNfT6_Ockom
+Q'IZ%R$a;1S"#t?StD[LTq\<XUnsrdVl6SpWiN5'Xfek3Yd(I=Za7$H[C3NQ\%)FJ!P5oB]`5YF
+^AbnI_#M7M_?.Wn`;[aU`W4'Xa9'K+b5TQcbg"E3cMu2jd/MGmdK%bqe,n1Of)F8+f\+s3g=tB;
+rn[V2!8me6!o`.uro47EjlPXekND(.l2U#Kli$/OmI'EAn,MkWnbr%YoDeI^p&=[bp\jmdq>U6f
+qu-HjrUTr=s53j,~>
+JcC<$JcG6>o`"gfrVZTjs8)ckrqQNfs7ZKcs7?Hco()>?rpO^lm-O''l07Epk2k[aio/hQhVHu@
+g=Y$.e^W$pd*L"]bK@oI`l5m5_8!au]Xt_a[^NQLZ*:F6XK/A"Vl$8bU7n3NSXZ+:R$X)&PEM#g
+NfB!TM26qAKnG#/J:E#rI!U*aGB\4PFE;GAao9H]SGA`UT(\`>SG/NHSGl+Z8GbpU7f>dN6ioa8
+ipYq,iqoA;T'DsFT)YAKT)[gMi<nN#hVI#BgY1?6f_sD'f%&:Le+V5]Y4]!oYk#!qY5PKuX8q#Q
+h#?.0hYuF4i;V[8ir8!;jSn9@k5OTDl,pd9^@>&!;?#nemI'H4o()DDqt'm]rq-0^pWrc_r6=iW
+r6,&]qT8]Ws'GS0ra>_6qdTP7rabn;rau.BqIokBrG).DrG;FL!cJ&<f"qE0rHA!\r-8-bf6[=>
+qfq"BrcnEfr-JBis*Xfos*artrd[IhJqAW-KS>,7L51SAM2I4MN/`jYO-#KeP*;,qQ'[l*R@9V7
+S=Q7DTV8'RUSO]^VPg>jWN)u!XKAV-YHY79ZEggC['fnA!OoT<\c95@]DfGE]tV5[^B23e_>_=O
+_Z7XR`<+'"a8X0[aT0K^b6#o4c2Puicd:&<dJqVpe,IkseH"2"f)jUXg&B\,gYCT`h#ZBiro!h8
+!94"<s5X1AroX7D!9jFHs69UMrp9[P!:KgS!q>aMrUL$]o^r+Ts7ZHdrV6BfrqcNhrVZTlo)=4?
+huA3~>
+JcC<$JcG6>o`"gfrVZTjs8)ckrqQNfs7ZKcs7?Hco()>?rpO[km-O''l07Epk2k[aio/hQhVHu@
+g=Y$.e^W$pd*L"]bK@oI`l5m5_8!au]Xt_a[^NQLZ*:F6XK/A"Vl$8bU7n3NSXZ+:R$X)&PEM#g
+NfB!TM26qAKnG#/J:E#rI!U*aGB\4PFE;GArKuekhfSR7r^m)[qa^TSrC-KL!^iZTo:l5Z!2BId
+ics@)piue3#G@]]TV%jJT(nlUSG/NPSEGIcK)1&qJGl2@UA^kdV#."fVYR.fVuWgHO8"b4O8k71
+;#X>lXTkr3YHY79Z1YF$Zh^$cR.?U.R/^Li?iFI4@JaO5A,^$9Ac?<@BDQ<@C&MfBC]/)JD$+\0
+g62,kpQG97!0mDFrK7/'rHA!\r-8-bf6[=>qfq"BrcnEfr-JBis*Xfos*artrd[IhJqAW-KS>,7
+L51SAM2I4MN/`jYO-#KeP*;,qQ'[l*R@9V7S=Q7DTV8'RUSO]^VPg>jWN)u!XKAV-YHY79ZEggC
+['fnA!OoT<\c95@]DfGE]tV5[^B23e_>_=O_Z7XR`<+'"a8X0[aT0K^b6#o4c2Puicd:&<dJqVp
+e,IkseH"2"f)jUXg&B\,gYCT`h#ZBiro!h8!94"<s5X1AroX7D!9jFHs69UMrp9[P!:KgS!q>aM
+rUL$]o^r+Ts7ZHdrV6BfrqcNhrVZTlo)=4?huA3~>
+JcC<$JcG6>o`"gfrVZTjs8)ckrqQNfs7ZKcs7?Hco()>?rpO[km-O''l07Epk2k[aio/hQhVHu@
+g=Y$.e^W$pd*L"]bK@oI`l5m5_8!au]Xt_a[^NQLZ*:F6XK/A"Vl$8bU7n3NSXZ+:R$X)&PEM#g
+NfB!TM26qAKnG#/J:E#rI!U*aGB\4PFE;GArD`GQoKM.qp-/IIr^coVrC6`Spd>0N:f.-gs%rVj
+s%rJdr^,U3r'Kd:nj<1NpJL]`!`MupqGZQHiCE]5peq#gq,Ho`e5#s<nkS^Or_`Sss',A*!+#P0
+r*B>/pJf[As'GS0ra>_6qdTP7rabn;rau.BqIokBrG).DrG;FL!cE=0mo/dTpJV'7rHA!\r-8-b
+f6[=>qfq"BrcnEfr-JBis*Xfos*artrd[IhJqAW-KS>,7L51SAM2I4MN/`jYO-#KeP*;,qQ'[l*
+R@9V7S=Q7DTV8'RUSO]^VPg>jWN)u!XKAV-YHY79ZEggC['fnA!OoT<\c95@]DfGE]tV5[^B23e
+_>_=O_Z7XR`<+'"a8X0[aT0K^b6#o4c2Puicd:&<dJqVpe,IkseH"2"f)jUXg&B\,gYCT`h#ZBi
+ro!h8!94"<s5X1AroX7D!9jFHs69UMrp9[P!:KgS!q>aMrUL$]o^r+Ts7ZHdrV6BfrqcNhrVZTl
+o)=4?huA3~>
+JcC<$JcG6>o`"gfrquZjs8)ckrqQNf!;?EbH1^_"o()>?n*f]3m-O''l07Eok2k[aio/hQh;-l?
+g=Y$.e^W$pd*L"]bK@oI`l5m5_8*h!]Xt_a[^NQLZEUO7XfJJ$Vl$8cU7n6OSXc1;R$X)'PEM&h
+O,]*VM2@"BKnP)1J:N)sI=$9cG^"=RFE;JBaiV^'SG\rPT)5)ASH#)RSGA]U9)_E]8GbpU7fGjN
+7/c-5irG_7T(elHT)G5ST)>,Z62omBiW%d=hVHuBg=lPZs4IA'"kM5ReC2nCdf$BLY3N4eYjnpp
+Y5>@!XT.,UhZ)L4i;_d8iW/$;jSn9?k5XWEkQ'lHlMp1u^\bbE^\PV6;#X;tm-X60nF?)@oD/%S
+p%6Q1cM5ZWbl#Z_b4s'YaS]EE@/aU3@fBm:AG]s;B)ZH>B`;`ECADZDD#J5KD?0_(_YqC?_>n`W
+G5-:ZGl)dBHMVpbGk-(NG4p.ZGlE!eHN/?lI/\QoIK4lsJ-LRVJqJ]/L&QfgLPUeDMMmFPNK0'\
+OHG]iPa.N"Q^F/.S"#q=St;RITqS6WUnsrdVl6SpWiN5'Xfek3Yd(L>Za7$HrjDj:\Gj#>]"@sS
+s1JEHrkJKK!5\WN!lMsprl+oW!6>&Z!m/U-rlb>c!6tJf!mf6?rm:eqe'n<Gs4%,#rn%2&!87A*
+!o)McrnRY4hr"Fk!o`.uro4(@jlQL(!pAe2rojLLlg+Q:s6TgSrpTmVs7-*Zs7?9_rUp3as7cHd
+rqZTjqYU6hr;H3cJcFX-J,~>
+JcC<$JcG6>o`"gfrquZjs8)ckrqQNf!;?EbG4bCto()>?n*f]3m-O''l07Eok2k[aio/hQh;-l?
+g=Y$.e^W$pd*L"]bK@oI`l5m5_8*h!]Xt_a[^NQLZEUO7XfJJ$Vl$8cU7n6OSXc1;R$X)'PEM&h
+O,]*VM2@"BKnP)1J:N)sI=$9cG^"=RFE;JBrg<G&rH@jVmWA;Js)e$Yq/ua1r^m)[qa^TSr^HQL
+rLrYRi-=I0pildar-/3-rLs+]rh'1]qORAMs.&/$k(<G\r."dArhKIgpn[tfpo"(hrMfgsb`Dab
+qMtW:nPK3^"Kei1YH\#2p9O_*rNl9eqj?i=m$R]Xra>_6qdTP7rabn;rau.BqIokBrG).DrG;FL
+r,)PhP4Xn2P4Fh8OoTY'G5-:ZGl)dBHMVpbGk-(NG4p.ZGlE!eHN/?lI/\QoIK4lsJ-LRVJqJ]/
+L&QfgLPUeDMMmFPNK0'\OHG]iPa.N"Q^F/.S"#q=St;RITqS6WUnsrdVl6SpWiN5'Xfek3Yd(L>
+Za7$HrjDj:\Gj#>]"@sSs1JEHrkJKK!5\WN!lMsprl+oW!6>&Z!m/U-rlb>c!6tJf!mf6?rm:eq
+e'n<Gs4%,#rn%2&!87A*!o)McrnRY4hr"Fk!o`.uro4(@jlQL(!pAe2rojLLlg+Q:s6TgSrpTmV
+s7-*Zs7?9_rUp3as7cHdrqZTjqYU6hr;H3cJcFX-J,~>
+JcC<$JcG6>o`"gfrquZjs8)ckrqQNf!;?EbG4bCto()>?n*f]3m-O''l07Eok2k[aio/hQh;-l?
+g=Y$.e^W$pd*L"]bK@oI`l5m5_8*h!]Xt_a[^NQLZEUO7XfJJ$Vl$8cU7n6OSXc1;R$X)'PEM&h
+O,]*VM2@"BKnP)1J:N)sI=$9cG^"=RFE;JBr`&VTlosr&r'(-DpceL<!)!5^r^coVrC6cTpI,$W
+s%rDds%rVh!`20Kr'K^:oKrC?pd4dD!CB0O63'=G;Yj8d;?0Yj;WL=)8,PjV;Ya8c<:No':@V0[
+;?'i">Ph\(?2n7->le8=oMjIAr*TG2raG\5raYq<qdob=rb)(@rb;=Gq.oqFrGDIM!."!2nl#6]
+!-S6`pilX\qg%"DqK`!`nos_Lp36L\rd"Hgs*OcnrdFfq!.Xuu#(_AXK7ei2re<LiLl$tGMi<US
+NfT6_OckomQ'IZ%R$a;2S"-%@StD[LTqeEZV5C/gW2ZesX/rG*Y-5(6Z*L[AZa@.>[K3kIrj`'@
+]DfJC]`>eG^]2(L_>V4P_o0Lm`W*pXa8O'\ai_d*bQ#cdc2Gohcd:&<d/qbFe,IkseH"2"fDjJ'
+g&B\,gYCT`h#cHjhu;O8iSrkrir\<'jo4BDkNM./klU/9li-8Nm/ZSRn,MnWnc&+ZoDeI]p&Fac
+p\agcq>^<fqu-HjrUTr=s53j,~>
+JcC<$JcG6>o`"gfrqu]krqcZjrqQNf!;?EbGkCV!o()>?n*f]3m-O''l07Bnk2kX`io&bPh;-i>
+g=Y$.eC;pod*L"]bK@oI`l5m5_8*h!]Xt_a\$iZMZEUO8XfJJ$Vl$;dU7n6OSt):=R$X,(P`h/j
+O,f0WMM[.DL4k22JUi6!I=-?eH$=IUFEDSEaiX=JoUc#PoUPTDr1*eVoUYtRr^m,\qFCNSrC-KL
+qr7/+rL`2CpRguInt#eHr8Rk<iSjdos5"CEgtUQ:g"G$1f@SU)e^W'sdaS3D!O&['YN2qbYOSdm
+Xo>F%hu)C8iSrkWj8A!<jo=KBkPjZHl0@R4li6>!^[]&0;#=)nmdKZ8o(2VJqXjj\pWr]]r6=iW
+r6+u[qT8_Ds'Yh7qdTP7rabn;rau.BqIokBrG).DrG;FLq/664n\Y.?mD8jGrH@s[qfr!`id1HH
+qfqaWmWSALrcnEfrHeKjs*Xfos*artrdY$#K)UB`KS>/8LPUeDMMmFPNK0'\OHG]hPE_>tQ^F/.
+R[]e:St;RITqS3UUnjlcVl6SpWiN5'Xfek3Yd(M5ZO=.J[^NZS\@K/]]"@sS!kl=^rkANM_86,f
+s2+iTrl+oWs2Y,[s2b8`rQ>8dc-?75s3L_lrm:eqe'n<Gs4%,#rn%2&!87A*s4[P/rn[V2!8me6
+s5<t;ro=%>!9O4Bs5sCGrosIJ!:0UM!q#FDrpTmVs7-*Zs7?9_rUp3as7cHdrqZTjqYU6hrVc9c
+JcFX-J,~>
+JcC<$JcG6>o`"gfrqu]krqcZjrqQNf!;?EbGkCV!o()>?n*f]3m-O''l07Bnk2kX`io&bPh;-i>
+g=Y$.eC;pod*L"]bK@oI`l5m5_8*h!]Xt_a\$iZMZEUO8XfJJ$Vl$;dU7n6OSt):=R$X,(P`h/j
+O,f0WMM[.DL4k22JUi6!I=-?eH$=IUFEDSER$dYkqKDUUoQ9MDoQL4+r^m,\qFCNSrC-KLqk<PS
+!-e-]pNc.NpNPtKs$?RW!297^rgs1^qORGP!h5^M^k)K8s.oCcr20FjqPaCmr2RSoo2,<]s02F+
+pp0q+s0Vd3!4)?eqO$f>m$RcZs'Yh7qdTP7rabn;rau.BqIokBrG).DrG;FLq/65d!0[#;pQG97
+!0mDFrK7/'rH@s[qfr!`id1HHqfqaWmWSALrcnEfrHeKjs*Xfos*artrdY$#K)UB`KS>/8LPUeD
+MMmFPNK0'\OHG]hPE_>tQ^F/.R[]e:St;RITqS3UUnjlcVl6SpWiN5'Xfek3Yd(M5ZO=.J[^NZS
+\@K/]]"@sS!kl=^rkANM_86,fs2+iTrl+oWs2Y,[s2b8`rQ>8dc-?75s3L_lrm:eqe'n<Gs4%,#
+rn%2&!87A*s4[P/rn[V2!8me6s5<t;ro=%>!9O4Bs5sCGrosIJ!:0UM!q#FDrpTmVs7-*Zs7?9_
+rUp3as7cHdrqZTjqYU6hrVc9cJcFX-J,~>
+JcC<$JcG6>o`"gfrqu]krqcZjrqQNf!;?EbGkCV!o()>?n*f]3m-O''l07Bnk2kX`io&bPh;-i>
+g=Y$.eC;pod*L"]bK@oI`l5m5_8*h!]Xt_a\$iZMZEUO8XfJJ$Vl$;dU7n6OSt):=R$X,(P`h/j
+O,f0WMM[.DL4k22JUi6!I=-?eH$=IUFEDSE<)iWUjZ`2tr''a;r_!/]s%)uVr^QiTpdG*Wr_W;c
+s%r_k!Dl&Z62O">6g[5<61@8?6N9@.;TM?'8,c!P;u]hs;u0Ja;o)6#;#=,d>l@q.>k_P(?M@FL
+;uU/(@/aU3@fBm:AG]s;B)ZH>B`;`ECADZDD#J5HDZ>"N;t<i\;ZLt=G5-:YGl)dGHMVpaGk?4J
+G5-:\GlE!eHN/?lI/\QoIK4lsJ,t4Qre!7bKnb>;Ll$tGMi<USNfT6_OcklkPa.N#R$a;1S"#q>
+StD[LTq\<XUo(&fW2ZesX/rG*Y-5(6Z*OA8$ad=M[^W`U\[f;_]DfGE]tV5[^B23e_>_=O_Z7XS
+`W*sXa8X0[aT0K^b6#o4c2Q#gci;Akd/qbFe,IkseH"2"fDjJ'g&B_*gAp%.h>c=3hu;R6i;hm:
+j8\0?jo4EBk5a`Fl2U#Kli$/OmI'EAn,MnWnc&+ZoDeI]p&Facp\agcq>^<fqu-HkrUKl<s53j,~>
+JcC<$JcG9?oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l0.<mk2kX`io&bPh;-i>
+g"=p-eC;pod*Bq\bK@oI`l5m5_8*h!]Xt_a\$iZMZEUO8XfJJ$Vl-AeUS4?QSt):=R$a2)P`h2k
+O,f0XMM[.EL4t84JUi9"I=-BfH$FOVF`_^(anhP*Sb\lRSar<BS,SoXS,SrSSbu+Z8cD9X8,c!V
+7JT@MiVhd6j8\-8j8,D1T(S`IT(SZQ62]gBir@sAi8<DJgt^Z_gAfe*fDaA#eH47Le+^',YktWp
+Y5YR$XS^oYiSrkWj8A!=k5=EAkl0lGlN$;Nm/Y!#^t-9l^@G+s;$HIZo()DDq=ORWrq-$4q9Jo_
+n]^sTpWEKWra>_6r*oY8rabn;rau.BqIokBrG)1Er+u=KpMU"L!<;Z-pVZF9!-S3_pNQO[q0D4N
+q0Dj^oQU"PrH7jXqKMp`s*=Qhs*OcnrdFfq!.Xuu!J,k%K/nU=L5(J>M2@+JN/WaVO,oBbP*2&p
+Q'Rc(R$jG5S=Q7CT:qsQUSO]^VPgAlWiE,$Xf\b0YctC<rj*0C[C3NQ\@B)[]">Se]Y2"mrkJKK
+!5\ZOs24lTrl"rYa2e2#s2k;`rlb>cs3:Pgs3C\lrQt\pe'n<G!nGlQrn%2&!87A*s4[P/rn[V2
+!8me6s5<t;rSmt?jlQL(!pAe2rojLLlg+Q:s6]jSrpTmV!:g$Ys7?9_rUp3as7cHds7uZjqYU6h
+rVc9cJcFX-J,~>
+JcC<$JcG9?oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l0.<mk2kX`io&bPh;-i>
+g"=p-eC;pod*Bq\bK@oI`l5m5_8*h!]Xt_a\$iZMZEUO8XfJJ$Vl-AeUS4?QSt):=R$a2)P`h2k
+O,f0XMM[.EL4t84JUi9"I=-BfH$FOVF`_^(R/1t"G5$.MFR4/HG5Ou38cD9X8,c!V7JT@IU&:Yb
+U&(MSGjp"YGkH@FGl9r+U\gb`TE(V[T)"rWSA0XTJG,i;V?!OiW;<LlWW8.WO8=maO7H-D;>[Wo
+ZMV!.Z2h0*RIlm@Qg0t;@/aU4@fBm:AG]s;B)ZH>B`;`ECAM`DD#J5FDZ=VUg62)jpQG*2rK7/'
+r-%gYr-8$_l$E/NqfqaWp3-CWpNHCWrcnHgrHeKjs*Xfos*artrdY$#K)UB_KS>/8LPUeDMMmFP
+NK0'\OHG]hPa.N"Q^F/.S"#q=St;RJTq\<XUnsrdW2ZesX/rG*Y-5(6Z*OA8&@AjR[^WcV\[f;`
+]=bei]tXK\s1eWNrke]Qs2=oU!li:$rlG,]s2t>as31Mfrm(Pi!7:\l!n,QHrmV#"f%0iPs4@>)
+rn@D,!8RS0s5!b5ro!h8!93t;!p&J)roO:Fkii$1!p]+;rp9[Ps6fmTs6p$YrUU![s7H9_s7ZKe
+r:p<frqcKgrVZWmnc"+>huA3~>
+JcC<$JcG9?oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l0.<mk2kX`io&bPh;-i>
+g"=p-eC;pod*Bq\bK@oI`l5m5_8*h!]Xt_a\$iZMZEUO8XfJJ$Vl-AeUS4?QSt):=R$a2)P`h2k
+O,f0XMM[.EL4t84JUi9"I=-BfH$FOVF`_^(<;Jc754Lf655IMA9)_E]8GbpV7f>dO7/9[Q;>sDd
+62X(>6g-l,6iB=.;Y3H07J0+M;u9Ji;uK\`;o2<#;#4#h?2.[u?2n7,<7=eF@/aU4@fBm:AG]s;
+B)ZH>B`;`ECAM`DD#J5FDZ=VTH1"W%;YX/jFo6FWGPl^]H0KYNH2DjYGP64YFn^(UGQ)jeH2W'h
+HiJKmIK+`rJ,Xs!JV*lR3J<*@L51SAM2I4MN/`jYO-#KeP*D5sQC!u+R@B\9SXuFFTqS3UUnjia
+Vl6SpWiN5'Xfek3Yd(M5ZOjLO[^NZT\@K/]]=Y_g]tM/Z^]2(L_>_=O_uI[S`<+'"a8X0[aoBN_
+bQ#fdc2Q#gcN)>jd/qbFe,Ihue^i=NfDjJ'g&B_*gAp%.h>c=3hu;R6i;hm9ir\<'jo4BDkNM./
+klU/9li-8NmJlVRn,MkWnbr%YoDeI]p&Facp\agdq>U6equ-HkrUKl<s53j,~>
+JcC<$JcG9?o`"gfrVZTjs8)ckrV-Hgp@eLYGP(Lto'u8>n*f]3m-O'&l0.<mk2bR_iS`YNh;-i>
+g"=p-eC;pod*Bq\bK@oI`l5m5_8*h!]Xt_b\$iZMZEUR9XfSP%W2HJfUS4BRSt2@?R@'>+P`q8m
+O,o9ZMi*@HL5(A6Jq8H%I=6KhH?j^YG'%iJanqV&Sc55WSa2gDS+)sJ9DhE]8cM?X8,c!V7J]CR
+hr*GliVhd9j87j8j7f2@T&H=/T)YA[62TaBj8\-<i<J5thqm2Fh#6"-g&BV,f@JNVYP,3cZ2:d&
+YO\jpXo>C%i;V^8ir.s7k5OQDkl9oHlhp,Km/Y$$_>(h&^\#84;#4&h;ZH7go(2JJo_nI_o`"I[
+chPccchu&gc1&sRbPTH]ao5`G@fBm;AG]s;B)ZH>B`;`ECAM`ED#A/EDZ"DRE<#RIpVZgDrknQK
+!-S3_p36@XpNc@VpNcX\olp4TnoaePqfi$as*=Qhs*Ocnrd>0'It*!!JUrE*K7nsXL,=[AM2@+J
+N/WaWO-#KeP*;,qQ'[l*R@9V8SXuFFTV8*TUnjiaVl-JmWiN5'Xfek3Yd(M5ZN[_D[^NZTrj`'@
+]DfGE]tV5[^B23e_>_:Q_o0Lm`W*pXa8O*ZaT0K^b6#o4c2Q#gci;AkdJqVpe,@bte^i=NfDjJ'
+g&B_*gAp%-h#cHjhu;O8iSrkrir\<'jo4EBk5a`Fl2U&Kli-5PmI'EAn,MnWnbr"[oCV\Rp&=[b
+p\agdq>U6equ-HkrUTr=s5*d+~>
+JcC<$JcG9?o`"gfrVZTjs8)ckrV-Hgp@eLYGP(Lto'u8>n*f]3m-O'&l0.<mk2bR_iS`YNh;-i>
+g"=p-eC;pod*Bq\bK@oI`l5m5_8*h!]Xt_b\$iZMZEUR9XfSP%W2HJfUS4BRSt2@?R@'>+P`q8m
+O,o9ZMi*@HL5(A6Jq8H%I=6KhH?j^YG'%hnR/;$uG5$.KFQmrJ9DhE]8cM?X8,c!V7J]FHU&Uka
+U&Le]GkZLYHKoeCGlN!d5ldb[U]@1fUA^ecT_Y5UT"KUSJG5o:Vu!@fWW&mtOSFn/NnKKc;#4&h
+;Z!a!ZMq01ZMq05ZEpmCZMq-,RI-C@Qfjb8@JaO5A,g*:Ac?<@BDQ<@C&MfCC]/)ID>.rGDZXn3
+P4at3P51=@Pl-aEOoTY&G4p.VGkZLTHM;^^GkH:VG4KePG5HL_GlN'fHN/?lI/\O%IXcitJ:W9'
+K7ei2re<7bLl$tGMi<USO,oBbP*2#nQ'I]'R$jD4S=Q7CT:hmPUSO]^VPg>jWN*##Xf\b0YctC<
+rj)d8[C3NQ\Gj#>]"@sS!kl=^rkANM_86,f!lMsprl+oW!6>&Zs2b8`rQ>8dc-?75s3L_lrmCbo
+!7Unr!nGlQrn%2&!87A*s4[P/rS7P3hr"Fk!o`.uro4(@jlQL(s5sCGrosIJs6K[N!q#FDrpTmV
+s7-'Y!qZ'VrUp0`s7cHds7uZjqYU6hrVc<dJcFU,J,~>
+JcC<$JcG9?o`"gfrVZTjs8)ckrV-Hgp@eLYGP(Lto'u8>n*f]3m-O'&l0.<mk2bR_iS`YNh;-i>
+g"=p-eC;pod*Bq\bK@oI`l5m5_8*h!]Xt_b\$iZMZEUR9XfSP%W2HJfUS4BRSt2@?R@'>+P`q8m
+O,o9ZMi*@HL5(A6Jq8H%I=6KhH?j^YG'%h*<;Si155@A556":R9)_E^8GYjU7f>dP6i^*Z;"dcW
+62a+M6hWqG6g-l26iTLO62a^_<)`!Ys&8qdo1%h1njN1?qbm;i!*&8_!)LL-oMGB]s&/Srp0I])
+r)EGi!*%ZNraG\5raYt=qdob=rb)(@rb;=GqJ6%Gr,)1Gr,2UTHLFf);YF#hFo6FVGPZRYH1Q@V
+H2DjZGPQFQFo$:YGQ)jeH2W'hHiJKmI1(LRIt3'#JV&N,KSBD[1l$mDM2I4MN/`mZOHG]hPE_>t
+Q^F/.R[]h<St;RITq\<XUnsrdVl6SpX/rG*Y-5(6Z*OA8"gk\G[^WdG\H0:Rrk&<G^:sT]!l2Xg
+rk\`S`5MYos2G&ZrQ,#\!6Y8`!mJp6rm(Pis3Ubms3^nrrR:o!f%0iPs4@>)rn@D,!8RP/!oDhl
+rnmk:io9st!p&J)roX7D!9jFHs6BXMrp0^RmdC)Cs7$'YrUL$]o^r+Trq?Bdr:p<frqcKgrVZWm
+o)=4?hZ&*~>
+JcC<$JcG9?o`"gfrquZjs8)ckrqQNfs7ZKcs7CI*o()>?nF,i6mHj3)l07Epk2k[aj5JqShVHuA
+g=b-1f$r3tdEp1abfe/MaMu3;_SO%&]tCtf\[T#TZa-j?Y-"e*Wi2hmUnaZXT:VUDS!fY1QBdYs
+OcYWaN/WXNLkg_=K7e`*IsufnH[9s^GBS,Nao%\#SH,2XS`H=8SbnrW9`Ic`9)_E^8GYjU7f>dQ
+6ic-AhuMa/iW/$3T)bJ1TD"lS63$!?jT"9?iWA)si;VU6hYu@2h#H./gAfh(Yhu__Yl(]pY5PI&
+XT%8YjT"?>k5FKCkQL/8lKdd5m/HDP_Xt\>^u`?(^@b>";>a;lo)A7Zo_nF_o`"Leo^h\FoCDn,
+m`tgVo?@!Q!6Y5]qdTP7rabn;rau.Bqe5tCrG)1ErG;CKphotIr,D8EpVZsHqnr3G!-S3_p36=W
+jE^THolp7Ului5Lqfi'brd"Hg!df<Brd@FgIt*!!JUrE*K7nr5L51SAM2I4MN/`jYO-#KeP*D5s
+QC!u,R[]e:SXuIHTqS3UUnsrdVl6SpWiN8(Y-5(6Z*L^B['[6L[^WdG\H0:Rrk&9F^AbnI^];4M
+_Z.LR`;[aU`rF*YaT'B^b5TTabl>recMu2jd/DAldK%bpe,n1Of)F;$fDsV'g&g$ah#?+2hV[5i
+i;_a9ir8!<j8e<?joX`0kl0iHl2^/Lm/QJQmf)\TnGi%Xo)J=]o_nI_pAXgbq#:*gqYU0gr;?Na
+rdk++s*t~>
+JcC<$JcG9?o`"gfrquZjs8)ckrqQNfs7ZKcs7CI*o()>?nF,i6mHj3)l07Epk2k[aj5JqShVHuA
+g=b-1f$r3tdEp1abfe/MaMu3;_SO%&]tCtf\[T#TZa-j?Y-"e*Wi2hmUnaZXT:VUDS!fY1QBdYs
+OcYWaN/WXNLkg_=K7e`*IsufnH[9s^GBS+rR/D*uG4]qLFRjSQG5HF^9`Ic`9)_E^8GYjU7f>dQ
+7.$ZLU3LqVH16.?H1cF[62[SXV#R1iUALY\T`:Y]T(moUJc;MCVYm@eW;3CqWiN1^OS=h&NoH,m
+;#=,f;Z*d$ZEpn9Zim_@ZEpk7Z2U0:R/:@lA,^$9Ac?<@BDZBAC&MfCC]/)ID>8#GDu=PSP4Xn2
+P5UUAPl-aDOoTY&G4p.UGiX/HGkH:WG3jALG5HL`GlE!eH3/G@I/\OeIXcitJ:W9'K7ei2L5(J>
+M2@+JN/WaVO,oBbP*2&pQ'Rc(R@9V7S=Q7DTV8'RUSO``Vl-JmWiE,%Xfek3Yd(L?Za@*I[^NZT
+rj`'@]DfGD]tXK\s1eWNrke]Q!6"lUs2P)ZrlG,]s2t>as31Mfrm(Pi!7:\ls3^nrrR:o!f%0iP
+s4@>)rRq>-gt_nb!oDhlro!h8!94"<s5X1ArT41Ekii$1s69UMrp9[Ps6fmTs7$'Yrpp*\s7H9_
+s7ZHdrV6BfrqcNhrVZTlo)=4?hZ&*~>
+JcC<$JcG9?o`"gfrquZjs8)ckrqQNfs7ZKcs7CI*o()>?nF,i6mHj3)l07Epk2k[aj5JqShVHuA
+g=b-1f$r3tdEp1abfe/MaMu3;_SO%&]tCtf\[T#TZa-j?Y-"e*Wi2hmUnaZXT:VUDS!fY1QBdYs
+OcYWaN/WXNLkg_=K7e`*IsufnH[9s^GBS+.<;\oA55[Y155d_C56"=V9DhE]8cM?X8,c!V7JfLP
+;><u_;=m0P6Mj.E7/TF16Ms.G<;]\_;ZB\b7c[#/7/04E;uTb`;u]YT:B!uI:A%H\;>a>f>lS+0
+?MRk-?=3\2c;XULraYq<qdob=rb)+Arb;=GqJ6%Gr,)4HqeuCOmSimYnl#O2r-%dXq0:tGqKV[W
+qKD4Jr-%s]s*4NgrH\NlI!kpA97DA?J:N3%JqJ]/Knb>;Ll$tGMi<USNfT6_OckllQ'IZ%R$jD4
+S"-%@T:hmOU8+N\VPg>jWN)u!Xf\b0YctC<Za7$G[C3NQ\Gj#>]"@sS!PQ5H^]2(L_>_=O_Z7XS
+`W*sXa8X0[aoBN_bQ#fdc2Q#gcN)>jdJqVpe,@bte^i=NfDjJ'g&9V+gYCT`h#cHjhu;R6i;hm:
+j8\0?jo+<CkNM./l2U#Kli-8NmJlVRn,MnWnc&+ZoDeI]p&Fabp\jmdq>U6fqu-HjrUTr=s5*d+~>
+JcC<$JcG<@oD\^erqu]krqcZjrqQNf!;?Ebs7?Hco()>?rpO^lmHj0(l07Epk2k[aj5JqShVHuA
+g=b-1f$r3tdEp1abfe/MaMu3;_SO%&^:_(h\[T#TZa6p@YH=n,Wi2hmUnj`YTUqaFS!o_3QBd\t
+P)t`bNJrdPM2-h>KS+l-J:DuqI!U*aGB\5PanqV%S_BV+SH><T9`@]_9)hK^8GYjU7f>dR7/l*>
+i;_d4ipr`@T')aDT^n`PT)YG[62BR?jSe-<irA!9i;VR5h>Z40g\J)4Z2:d'YOSdqXoCcjjQ5M%
+k54??kl'fGlN$;ImHVO`_!Ac0^@kD";>a>l;ucIgo_nI^oDnR`o`"C^naPbfrQY)\qTJcYs2k7L
+raYq<qdob=rb)+Arb;@Hq.oqFrGD:Hr,;FNs)A&=oYU@?!5eKJq8*,Sqf_XVpiu+Mq0;RVqKDRT
+r,h^VrHA'^rcnHgrH\NlI!kpA6%4<5J:N3&JqJ]/Knb>;Ll$tGMi<USNfT6`P*2#nQ'I]'R$jD4
+S=Q7CT:hmPUSO]^Vl-JmWiE,$Xf\b1Yd(M5ZOaFN[^NZT\[f;_]=bei]tXK\!l2Xgrk\`S`5MYo
+!li:$rQ#&^b0'\+!mJp6rQYJjd*Va=!n,QHrm^tus472$s4@>)rRq>-gt_nbs5!b5ro!h8s5O%<
+!p&J)roX7D!9jCG!p]+;rp9[P!:KgSs6p$YrUU![s7H9_s7ZHdrV6BfrqcNhrVZTlo)=4?hZ&*~>
+JcC<$JcG<@oD\^erqu]krqcZjrqQNf!;?Ebs7?Hco()>?rpO^lmHj0(l07Epk2k[aj5JqShVHuA
+g=b-1f$r3tdEp1abfe/MaMu3;_SO%&^:_(h\[T#TZa6p@YH=n,Wi2hmUnj`YTUqaFS!o_3QBd\t
+P)t`bNJrdPM2-h>KS+l-J:DuqI!U*aGB\4tR/;%"G4B_LFRsYJFole[9`@]_9)hK^8GYjU7f>dR
+7.HuLU@3BuHK0;GGl'f#V>d7gU&gs^qk<q\s.B";qh!(Ds$Zj`rMTCgq5O4j!3?!YqN'`ul]:a9
+qGI/gs&8s&s0D[2rj;X1rj)I,m?mp?iL'URraYq<qdob=rb)+Arb;@Hq.oqFrGD:Hr,;FNs)A(n
+P4at3OoU^?Pl-aEOoTY%G4g(SGjBYNGkH:WG4p(VFSL"WG5HL_GlN'fH3/G@I/\O[IXcitJ:W<(
+K7ei2L5(J>M2@+JN/WaVO,oEdP*;,qQ'[l*R@9V8SXuFFTV8*TUnjibVl6SpWiN5'Xfen4Z*OA8
+&%&aQ[^WcW\[oAa]Y(qk^AbkK^qmkd_?.Wn`;[^W`lH-ua9'K+b5KKbbg"E2c2u>=d/D>ndaQ\E
+eGn)!f)F;$fDsV'g&g$ah#?.0h>lI4i;_d9ir7s>jQ5M&k5XTEkl'`IlKdd8m/QGQmeuVSn,W"W
+o)J=]o_nI_pAXgbq#:*gqYU0gr;?Nardk++s*t~>
+JcC<$JcG<@oD\^erqu]krqcZjrqQNf!;?Ebs7?Hco()>?rpO^lmHj0(l07Epk2k[aj5JqShVHuA
+g=b-1f$r3tdEp1abfe/MaMu3;_SO%&^:_(h\[T#TZa6p@YH=n,Wi2hmUnj`YTUqaFS!o_3QBd\t
+P)t`bNJrdPM2-h>KS+l-J:DuqI!U*aGB\41<;SiC557A@55[Y?54q,A5"nZL9DhE^8cD9W8,c!V
+7JoRO;><ub;>roQ62X(L6iKFB6fgZ362":I;uT\p;sm-:7I`eC7K5dT<;KPm<:*WD:A7KK:A.N\
+;>a>l;uBnm?2n43?W>6JraPk:rabn;rau.Bqe5tCrbD7ErG;FLpMTnIqJcIS!.+*4qbll]!-S0^
+olp1UlZr;Nolp7Up3$:TpiZOYqfi$as*=Qh!df<Brd@(]It*!!JV&K+K7nr5L51SAM2I4MN/`jY
+O-,TgPE_>tQ^F/.R[]h<St;RITq\<XUnsueW2ZesX/rG*Y->.8ZMq0@['d?N\%&uZ]"5Md]Y2"m
+rkANM_86,f!lMsprl"rYa2e/"!m/U-rQ>8dc-?44!mf6?rQt\pe'n<Gs4./#rn%2&!87>)!o)Mc
+rn[V2!8me6s5F";ro4(@jlQL(s5sCGrTOCKlg+Q:s6TgSrU9dU!:g$Ys7?9_rUp3arqHBdrqZQi
+qtp?ir;H3cJcFU,J,~>
+JcC<$JcG<@oD\^erqu]ks8)ckrV6Ee!;?EbGP(Luo()>?n*f]3m-O''l07Epk2k[aio/hQhVHuA
+g=b*0f$r0sdEp1abfe/MaMu3;_SX+'^:_(h\[T#TZa6p@YH=q-Wi;nnV50l[TV%gHS!ob4Q^*i"
+P*(fdNJrdQM26n@KnG#/J:N)sI!^0bG^"ARSbS`PS`cLCSb/HDSc;Fa9`@]_9)hK^8GbpU7f>dS
+7/YpCi8=IjrSd_7q4@Y[pn.PWl_!pEo:PuQq*FW4qVqP6ro!e5"5_k<Yk>3sYj/LkYj\doY5^oh
+k5"3>kl0iFli$2LmJZAQmD6X;_!&T7_!8]1^@tJ$;>a>j;uZFfp%n:boCDG@n*]W-c2c2icMl)a
+bkoTZb5PoMAG]s;B)ZH?B`;`FCAM`ED#J5FDYnALE;+AG_X58:_Z+cUG4^"PGk?:TGkH:WG56:P
+FSg4ZG5HL`GlN'fH3/G@I/\NuIXcitJ:W=OK2.)RL5(J>M2@+JN/WaVO-#KeP*;,qQC!u+R[]e:
+SXuIHTqS3VUnsrdVl6VqX/rG*Y-5(6Z*L^B['d?N\%&uZ]"5Md]Y2%n^V@S"_>_=O_Z7XS`W*sX
+a8X0[aT0K^bQ#cdc2Grfci;AkdJqYpe,Iksec45"fDjJ'g&9V+gYCT`h>c=3hu2I7iSrkrj8\0?
+jo4EBkPscFl2U#Kli$/OmI'E@mfN"Knbr%YoDeI]p&Facp\agcq>U6fqu-HjrUTr=s5*d+~>
+JcC<$JcG<@oD\^erqu]ks8)ckrV6Ee!;?EbG4bCto()>?n*f]3m-O''l07Epk2k[aio/hQhVHuA
+g=b*0f$r0sdEp1abfe/MaMu3;_SX+'^:_(h\[T#TZa6p@YH=q-Wi;nnV50l[TV%gHS!ob4Q^*i"
+P*(fdNJrdQM26n@KnG#/J:N)sI!^0bG^"A!pN?@VmWJAJo6'YJs%WMer_*/]s%32\qa^TSrC-ZQ
+pS%>Uq0D(Jja$]Iq*FYLrhK+[!MQ1XKBRpWJb4QoJcA.;Vtm:_WVNRiOSb*uNpi&';#=,f;Z0Po
+ZNRS?Za@+<Zi790Z2_$/YH[D]r0QK3raYq<qdob=rb)+Arb;@HqJ6%GrGD:Hqeu@NpMonhqNCiA
+pQYT>rf[;(qf_UUp3?4Tp3?7SqKD[Wo5skPrHA'^s*4QhrH\NlI!kpA#(D&OJ:N3&re!t!Knb>;
+Ll$tGMi<USNfT9aP*2#nQ'Rc(R$sM6S=Q7DTV8'RUnjiaVl-JnWiN5'Xfek3Yd(L?Za@-K[^WcW
+\[oAa]Y(ql^;%Fu^qp#es2+iTrl+oWs2Y,[s2b8`rQG5b!6tJfs3L_lrmCbos3ptss4./#rn%2&
+!87>)!o)Mcrn[V2!8mb5!o`.uro=%>!9O4Bs6'FGrosIJ!:0UM!q#FDrU0gWnaZSKs7?9_rUp3a
+s7cHdrqZQiqtp?ir;H3cJcFU,J,~>
+JcC<$JcG<@oD\^erqu]ks8)ckrV6Ee!;?EbG4bCto()>?n*f]3m-O''l07Epk2k[aio/hQhVHuA
+g=b*0f$r0sdEp1abfe/MaMu3;_SX+'^:_(h\[T#TZa6p@YH=q-Wi;nnV50l[TV%gHS!ob4Q^*i"
+P*(fdNJrdQM26n@KnG#/J:N)sI!^0bG^"@3pH@q.oKN=@pcn^@o0<7Ls%NDbr(?u\r^coVrC6`S
+rC$N[qb[/es&/h`rB^KMhEps(mm?h9oMk9XlUKu)nO3=Es$ZW\s&A;_qb?9LqG$u`peC?TpJC`a
+r)3Jls'5V0p0IZ("'o5=?2R[h;ZKeY;uU;+AG]s;B)ZH?B`;`FCAM`ED#J5FDYnALE;+AB;u]b^
+;u_";G4^"PGk?:TGkH:WG56:PFSg4ZG5HL`GlN'fH3/G@I/\NuIXcitJ:W=OK2.)RL5(J>M2@+J
+N/WaVO-#KeP*;,qQC!u+R[]e:SXuIHTqS3VUnsrdVl6VqX/rG*Y-5(6Z*L^B['d?N\%&uZ]"5Md
+]Y2%n^V@S"_>_=O_Z7XS`W*sXa8X0[aT0K^bQ#cdc2Grfci;AkdJqYpe,Iksec45"fDjJ'g&9V+
+gYCT`h>c=3hu2I7iSrkrj8\0?jo4EBkPscFl2U#Kli$/OmI'E@mfN"Knbr%YoDeI]p&Facp\agc
+q>U6fqu-HjrUTr=s5*d+~>
+JcC<$JcG<@o`"gfrVZTjs8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l07Eok2k[aio/hQhVHuA
+g=b*0e^W'rdEp1abfe/MaMu3;_SX+'^:_+i\[])U['R$AYHG".Wi;noV50l[Tq@pIS"#h5Q^3o$
+P*1ofNfB!UM2@"BKnP)1JUi6!I=-BfH$II0SbJWSS`ZI?Sb\fHSc):_9`@]`9)_E]8GbpU7f>dT
+7/5[>i;)@1T)bP\TC\ZETCJTITDtMY60mP2ir%d8huM[5Yj\dgYkG@"YjS^n7/l?Gk5a`Fl2U&K
+lhg&Klhg#Kli+`s_"tnE_YM%E_!f&7^A1V&;>a>g;ucLip&4LkoCV\Ho'u2<n*]T0m,H=hc2>f]
+bP]N^AG]s;B)ZH?B`;`FCAM`ED#J5GDYnALE:IrHEr<f@_th.LFo-@QGN=#?GPcR[FmX;KFo?L]
+GQ2pfH2W$jH[L5?I0"eHrd[[nJqJ]/KnY89LPUeDMN!LRNfT6_OckomQ'IZ&R$jD4S=Q7CT:qsQ
+USO]_Vl-JmWiN5'Xfek3Yd(L?Za@-K[^WcW\[oDb]Y(qlrkANM_86,f!lMsprl"rYa2e2#s2k;`
+rlb>cs3:Pgs3L_lrQt\pe'n9Fs4%,#rR_)%!87>)!o)Mcrn[V2s53h6!o`.uro=%>s5j7Bs5sCG
+rosIJs6K[Ns6]jSrpTmVs7-'Ys766_r:U*`s7cHdrqZQiqtp?ir;H3cJcFU,J,~>
+JcC<$JcG<@o`"gfrVZTjs8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l07Eok2k[aio/hQhVHuA
+g=b*0e^W'rdEp1abfe/MaMu3;_SX+'^:_+i\[])U['R$AYHG".Wi;noV50l[Tq@pIS"#h5Q^3o$
+P*1ofNfB!UM2@"BKnP)1JUi6!I=-BfH$G_JFT?UNFo6@RFn0_S:&dod9DqK^8cD9X8,YpU7K,^C
+UA]B!HLlC^GjBYSGkjYtV>d:fU\LSWK]n'HK)J+:Vu!@_WW0!rWW/+WORnP!Npi&);#=,f;Yj>f
+ZN.</Z2_'-YQ(ioR/**4R/UXnAc?<@BDZBAC&VlDC]/)JD>8#GDu4MDEW'qUOo1C?PP17=PQ$^F
+Fo-@QGN=#?GPcR[FmX;KFo?L]GQ2pfH2W$jH[L5?I0"eHrd[[nJqJ]/KnY89LPUeDMN!LRNfT6_
+OckomQ'IZ&R$jD4S=Q7CT:qsQUSO]_Vl-JmWiN5'Xfek3Yd(L?Za@-K[^WcW\[oDb]Y(qlrkANM
+_86,f!lMsprl"rYa2e2#s2k;`rlb>cs3:Pgs3L_lrQt\pe'n9Fs4%,#rR_)%!87>)!o)Mcrn[V2
+s53h6!o`.uro=%>s5j7Bs5sCGrosIJs6K[Ns6]jSrpTmVs7-'Ys766_r:U*`s7cHdrqZQiqtp?i
+r;H3cJcFU,J,~>
+JcC<$JcG<@o`"gfrVZTjs8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l07Eok2k[aio/hQhVHuA
+g=b*0e^W'rdEp1abfe/MaMu3;_SX+'^:_+i\[])U['R$AYHG".Wi;noV50l[Tq@pIS"#h5Q^3o$
+P*1ofNfB!UM2@"BKnP)1JUi6!I=-BfH$E<[4nCkh5Q+=V9`@]`9)_E]8GbpU7f>dT7/9^[;#=,h
+;Z/o^6e=Zu6h<Y?62ssY<;TVn<;9DJ7c6`67/9d]<:j,h;Yj>`:%1pS:%h9U:&Ic^;#=,f;Yj>j
+?2n1+>l\4-?2@OL;uU>)Ac?<@BDZBAC&VlDC]/)JD>8#GDu4MDEW'q8;ZLt;G4Kk<Gk6.VG5?@K
+FSp:[G5QRaGlN'fH3/G@I/\NpIXh?I9S%eJK7nr4L5(J>M2@+KN/`jYO-#KePE_>tQC+&-R[]h<
+St;RJTq\<XUo(&fW2ZetXKAV-YHY79ZEpmE[C3NQ\@K/]]=Y_g]tXK\!l2Xgrk\`S`5MYo!li:$
+rlG,]s2t>as31Mfrm(Pis3U_l!n,QHrRCkt!7q,#s4@>)rRq>-gt_nbs5*e5rnmk:io9sts5a4A
+roX7D!9jFHs6BXMrp9[Ps6fmTs7$'YrUU![!;-3^s7ZKer:p9erqcNhrVZTlo)=4?hZ&*~>
+JcC<$JcG<@o`"gfrVZTjs8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l07Eok2k[aio/hQhVHuA
+g=b*0f$r3tdEp1abfe/NaMu3;_ns4(^:_+i\[])V['R'BYcb+0Wi;qpVPKu]TqJ!KS=>t7R$O#%
+PEM&hO,]*VMM[.DL4t84JUi9"I=6HgH?dR0Sb\fSSa)a>Sc5/LSc;I`:&doe9DhE]8cM?X8,c!V
+7K,^JhuDU7iVqa8iUic4T(&BBT_P/S63$!EjS@j9j8e6:j8e6<irA!7Yj&@gYkG?fYl-uhk5FHE
+kiq@1lLsNDm/-)M_ns:g_>h=I_=PMD_>:t9^\bbA;#F2f;Ya8ko`"O`o`"Feo'l,:mdBK/rp'R1
+im.MIr64lX!QnsNAc?<@BDZBAC&VlDC]/)JD>8#HDu4MDEV=GPF7$m@_Z+cTG4BeAGk-(UG5?@H
+FT$@\G5QRaGlN'fH3/G@I/\NpIXh?I7Y-/DK7nr5L51SAM2I4MN/`jYO-,TgPE_>uQ^F/.S"#q=
+StD[LTqeEZV5C/hWN)u!XKAY/YctC<Za7$H[^NZT\[f;`rk&9F^AbkJ^qp#es2+iTrl+oW!6>)[
+s2k;`rlb>cs3:Mf!mf6?rR(Yns3ptss4./#rn%2&s4RD*s4dS/rn[V2!8mb5!o`.uro=%>s5j7B
+s5sCGrTOCKlg+N9!q#FDrU0gWnaZSKs7?9_rUp3arqH?cs7uZjqYU6hr;H3cJcFU,J,~>
+JcC<$JcG<@o`"gfrVZTjs8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l07Eok2k[aio/hQhVHuA
+g=b*0f$r3tdEp1abfe/NaMu3;_ns4(^:_+i\[])V['R'BYcb+0Wi;qpVPKu]TqJ!KS=>t7R$O#%
+PEM&hO,]*VMM[.DL4t84JUi9"I=6HgH?bkMFo?LMFoQR\Fo?L_Fn'YT:Amoe9`Ic`9)_E^8GYjU
+7f>dT7.-fFH0]eEH2i-gH16(R63!e\VY?neV#7(hV"peXK[,5JK)J+:Vu3LfWW&grWW&jmWW&%V
+OR/&!Npr,+;#F2f;Ya8iZO!qEZa$d>Z*:J1Y62#4Y*n[Ep6Y-5!+c"=rau.Bqe5tCrbD:FrG;FL
+php"Jqf)(Fp2^.Rr0$uApQYT>rf[;(qKDCQl?MlDqf_gYl?)uIrHA*_s*4QhrH\NlI!kpA!IfOt
+J4>*AK7ei2L5(J>M2@+JN/WaVO,oEdP*;,qQC!u+R@B\9SXuIHTqS6WUnsrdW2ZesX/rG+YHY79
+ZEpmE[C3NQ\@K/]]DfGD]tXK\!PlPN_Z.LR`;[aU`W4'YaT'B^b5TTabl>rdc2u>=d/DAldf7eq
+eGn)!f)F;$f`0Y(gAfq-h#?.0h>lI3hu_lsir8!<jT"?@k5XTEkl'`IlKdd7liQSBmeuSUnF?&I
+o)J=]o_nI_pAXgaq#C0hqYL*fr;?Nardk++s*t~>
+JcC<$JcG<@o`"gfrVZTjs8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l07Eok2k[aio/hQhVHuA
+g=b*0f$r3tdEp1abfe/NaMu3;_ns4(^:_+i\[])V['R'BYcb+0Wi;qpVPKu]TqJ!KS=>t7R$O#%
+PEM&hO,]*VMM[.DL4t84JUi9"I=6HgH?`H^4nLqh5Q=LW:&doe9DhE]8cM?X8,c!V7K,^H;>a;l
+6-hms6h!G;62XaZ<;fbd<4k^!7/Bj]<;BJh;Yj>X:%qEZ:%(dQ:&7]a;>X8e;tOAp>l7n$<7b%K
+AGg$<B)ZH?B`;`FCAM`ED#J5GDZ"GME:IrAErL.A;u_":G4BeAGk-(UG5?@HFT$@\G5QRaGlN'f
+H3/G@I/\NpIXh?I7Y-/DK7nr5L51SAM2I4MN/`jYO-,TgPE_>uQ^F/.S"#q=StD[LTqeEZV5C/h
+WN)u!XKAY/YctC<Za7$H[^NZT\[f;`rk&9F^AbkJ^qp#es2+iTrl+oW!6>)[s2k;`rlb>cs3:Mf
+!mf6?rR(Yns3ptss4./#rn%2&s4RD*s4dS/rn[V2!8mb5!o`.uro=%>s5j7Bs5sCGrTOCKlg+N9
+!q#FDrU0gWnaZSKs7?9_rUp3arqH?cs7uZjqYU6hr;H3cJcFU,J,~>
+JcC<$JcG<@o`"gfrquZjs8)ckrV-Hgp@eLY!VH!_no+'fn*f]3m-O''l07Bnk2k[aio/hQhVHuA
+g=b*0f$r3tdEp4bbfe/NaN)9<_ns7)^:h1k\[],W['R'CYcb+0X/`+rVPU)`TqJ$LSXZ+:R$X)'
+PEM&iO,f3YMi!:GL4t;5Jq8H%IXQTjH?o@Xr1*PQn!rF/!`)Qdr([2bs%E8^r^m,\qa^TSrC-`S
+s5*A)s5<pLp7V>UnXfHHm%F9KpH\f>qW.Y9qrI\:rT*t<!93gYs0)=(n?;_npTa+iqa:MJkNDj.
+rTX1DrTj7D!9sL$s24ZLrPA'AqSDsBpV6[@qb[2fr)38fs&9$kp&4LboCDD>rpC!Xm-Es&lg!ER
+rQY8ap<3DGs(;7Cqe5tCrbD:FrG;IMphp"Jqf)+Gp2]hIs)dhLqSN8Tq0)1Mnp'YJqf_gYkB-ZF
+rc\3`s*4QhrH_:eI!g?jIXZcsJ:W9'K7ei2L5(J>M2@+JN/WaWO-#KeP*;/rQC!u,R[]e;St;RJ
+Tq\<XV5C/gW2ckuXKAV-YctC<Za7$H[^NZT\[f;`rk&9F^AbkJ^qp#e!lMsprl"rYa2e2#s2b8`
+rQ>8dc-?44s3L_lrmCbos3pqrs4./#rn%2&s4RD*s4dS/rn[V2s53h6s5<t;rT!q=!9O1A!pAe2
+rosIJs6K[Ns6]jSrpTmVs7-'Ys7?9_rUp3arqHBdrqZQiqYU6hr;H3cJcFU,J,~>
+JcC<$JcG<@o`"gfrquZjs8)ckrV-Hgp@eLY!VH!_no+'fn*f]3m-O''l07Bnk2k[aio/hQhVHuA
+g=b*0f$r3tdEp4bbfe/NaN)9<_ns7)^:h1k\[],W['R'CYcb+0X/`+rVPU)`TqJ$LSXZ+:R$X)'
+PEM&iO,f3YMi!:GL4t;5Jq8H%IXQTjH?o1+pibnEqKDm_nob(1:/:^]s%NGcr(?r[s%*#WrC6`S
+s$Zm\nY4oems4>GpH\eUqPO+cqPO4frM/n9c\)4Kqa:L`W2TKjoVhbgri#gZs,m2?hN.\uo8icF
+r)*AipJ_)krNlO0!3uO-q6'h%Xo4[VR.Qa6R/LUrB)ZH?B`;`FCAM`ED#S;HDZ"GME:S#BEqOMR
+FT%EsPl-aFP5f\#G4'SFGjoqSG5?@EFT$@]G5QRaGlN'fH;Js9I!pElIXcluJUrE*K7nr5L51SA
+M2I4MN/`mZOHG]hPEhE!Q^F20S"#t?StD^MU8+N\VPg>jWiE,$Xf\b1Yd(L?Za@-K[^WcW\[oEP
+]E,^[rkAKL_>_:Q_o0Lm`<+'"a8X0[aT0K^b6#o4c2Grfci;AkdJqYpe,@erec45"fDjM'g&B_*
+g]-(.h>c@3hu;R6i;hm9j8\0?jo+<CkNM./l2U&Kli-8NmJlVRn,MnWnbr%YoDeI]p&Fabp\jmd
+q>U6equ-HjrUTr=s5*d+~>
+JcC<$JcG<@o`"gfrquZjs8)ckrV-Hgp@eLY!VH!_no+'fn*f]3m-O''l07Bnk2k[aio/hQhVHuA
+g=b*0f$r3tdEp4bbfe/NaN)9<_ns7)^:h1k\[],W['R'CYcb+0X/`+rVPU)`TqJ$LSXZ+:R$X)'
+PEM&iO,f3YMi!:GL4t;5Jq8H%IXQTjH?o0HqEFpDrBAar!`)Qdr([2bs%E8^r^m,\qa^TSrC-`S
+nPT<as$=:apH\dYqGmJnr)<VpqGmJn]LMcdqc!Gmr_rJfqbuNLpeLTYoh>B[qb[2fr)38fs&A_u
+r*05-ra#S1o2OFBrFQ"@rb)+Arb;@HqJ6%Grb_FJr,;IOno=ADolL.TlVmh+q0)1Mnp'YJqf_gY
+kB-ZFrc\3`s*4QhrH_:eI!g?jIXZcsJ:W9'K7ei2L5(J>M2@+JN/WaWO-#KeP*;/rQC!u,R[]e;
+St;RJTq\<XV5C/gW2ckuXKAV-YctC<Za7$H[^NZT\[f;`rk&9F^AbkJ^qp#e!lMsprl"rYa2e2#
+s2b8`rQ>8dc-?44s3L_lrmCbos3pqrs4./#rn%2&s4RD*s4dS/rn[V2s53h6s5<t;rT!q=!9O1A
+!pAe2rosIJs6K[Ns6]jSrpTmVs7-'Ys7?9_rUp3arqHBdrqZQiqYU6hr;H3cJcFU,J,~>
+JcC<$JcG?AoD\^erqu]krqcZjrqQNfs7ZKcs7CC(o()>@nF,i6mHj3*lKRNqk2tddj5T%Uhqm2E
+gY1?4f@JI$da?FfcHOJSaiMNA`P]R/^V@Ip]=GJ][^EHJZ*:F6XfJJ$Vl-AeUS4BRSt2C@R[BJ.
+Q'@JqOcPQ_N/NRMLkg_=K7ec+J:DuqI!U,7Sc>5OSbnrWSc##:Sc;Lc:Adid9`Ic`9)hK^8GbpU
+7f>aU7/c!6hts&?T_kAOT(elBT_C_QjQ6:"!9<n9p#Q27pTX\$m]cYnqloh"n$)[Wroa:ErTX4E
+s60dRl07Erl0.C1kQ'fF`:q1;_XbP>_#1qK^;%G\;#F2g;YX2h;ufqtoE=aTnaGrFm/ZMNl2p4p
+c/R%Hc25`[b5c,QB)ZH@B`;`ECAVfFD#S;IDZ"GME:\)BEq=AHFSNcL_Z+cSG0tO2G5?@CFT$@]
+G5QRaGlN'gHN/<lI/\NuIXcitJ:W=OK0Y*DL5(J>M2@+KN/`jYO-#KePE_>tQ^F/.R[]h<StD[L
+TqeEZV5C/hWN)u"Xf\b0YctC=Za@-K[^WcW\[oEP]EZ'`^V@S"_>_:P_o2Pns2G&ZrlG,]s2t>a
+s31Mfrm(Pis3U_ls3^nrrRCkts47/#s4@>)rS%;+s4mV0s5*e5ro!h8s5O%<s5X1ArT=.C!9jCG
+!p]+;rTjUQmdC&Bs7$'Yrpp*\s7H6^s7ZKer:p9erqcNhr;?Nlnc"+>hZ&*~>
+JcC<$JcG?AoD\^erqu]krqcZjrqQNfs7ZKcs7CC(o()>@nF,i6mHj3*lKRNqk2tddj5T%Uhqm2E
+gY1?4f@JI$da?FfcHOJSaiMNA`P]R/^V@Ip]=GJ][^EHJZ*:F6XfJJ$Vl-AeUS4BRSt2C@R[BJ.
+Q'@JqOcPQ_N/NRMLkg_=K7ec+J:DuqI!U,5Fn9eRFT?UWFo-@YGP-.Z:]F2f:&doe9DhE^8cD9X
+8,YpU70#aSU%>#5HLZ:MGkXN#V#[CdV>R4iV>m=kU\f_^K)gN#7/j.bWV3:fVuN[qVuEXpVZ<Un
+P517?OQV]$O8tF<OSt7?OShrQ;>a>e;uKYq<W9<*Z*=&-riZ7&q3gf@nX&j7!+l.Arb).Brb;=G
+qeQ.Hrb_IKr,;IOo5XGDo5jYJplt]?rf[;(q0(/0qf_gYj`LHDrc\3`s*4Qhrd+Tk!.=co#(D&O
+J:N3&re!IhKnb>;Ll$tGN/WaVO,oBbP*;,qQ'[l*R@9V8SXuIHTqS6WUnsrdW2ZesXKAV-YHY79
+Za7$H[^NZT\[f;`rk&HK^;%Fu^qp#e!Q2kT`W*pXa8X0[aoBN_bQ#fdc2Q#gci;AjdJqVpe,@er
+ec45!fDjJ'g&9Y)g]-(.h>c@3hu;R6iW%p:j8\0?jo+?Ak5a`EklU/9li$/OmI'E@n,MnWnc&+Z
+oDeI\p&Facp\agcq>U6fqu$BjrUKl<s5*d+~>
+JcC<$JcG?AoD\^erqu]krqcZjrqQNfs7ZKcs7CC(o()>@nF,i6mHj3*lKRNqk2tddj5T%Uhqm2E
+gY1?4f@JI$da?FfcHOJSaiMNA`P]R/^V@Ip]=GJ][^EHJZ*:F6XfJJ$Vl-AeUS4BRSt2C@R[BJ.
+Q'@JqOcPQ_N/NRMLkg_=K7ec+J:DuqI!U,54o.A>56*tG5Q="(5Q=OZ:Adid9`Ic`9)hK^8GbpU
+7f>aV6rNMOqa&"apH\dYqGmPppf$oe!*$U#qaC?\r)EVnpJUidiD&l<peC]\s%WDfr)*Aipf%,j
+!*0#(!aK#:qHX&+rEeqlhGXDcrau.Br+Q(DrG)4FrG;IMq/6+Kqf).HolBYFpN5n's)n-\d<GJ2
+qK:nArH8*_r-/0cs*=Tis*F`nrd>!"It*!!JV*lR5_OiGL51SAM2I7NNK0'\OHG]iPa.N#R$a;1
+S"-%@T:hmOUSO]^VPgAlWiE/&Xfek3Yd(O@['d?N\%&uZ]"@sS#/.ac^VIY$rk\]R`;[aU`W4'Y
+aT'B^b5TTabl>recMu5jd/DAldK%bpeGn)!f)=5#fDsV'gAfq-h#?.0hZ)L4i;_d9ir8!<j8e<?
+k5XTEkl'`IlKdd7liQSBmeuVSnGi%Xo)J=]o_eC^pAambq#:*gqYU0fr;HTardk++s*t~>
+JcC<$JcG?AoD\^erqu]krqcZjrqQNf!;?Ebs7C^1o()>@nF,i6mHj3*lKRNqk2tddj5T%Uhqm2E
+gY1?4f@JI$da?FfcHXPUaiMNA`P]R/^V@Ip]=PP^[^EKKZ*:F7XfSP%W2HMgUnXQUSt;IAR[KP0
+Q'IPrOcYWaNJrdPM2-h?KS+l-J:E#rI=$9dG^"@TF`_\Fn!sHKfq&.>s%iYirD!8bs%E8^s%32\
+qa^TSrC-V?p>>e>pRh>Urh'4`qk*VSp7LfHog/W?r8m_7r8me;!9NmXs0)=(p9F:ppTa:nq*b5F
+s60FG!pJn5rTF:Fkl0`Fkl'ZHk3(mhrPe9DnA=h6r4r3Er_WMir)3;grD`br$M<r[nF5o8md9E.
+rTjLK!U8eEblH&fc0imPc2Gl\b5c/RBDZBAC&VlEC]/)KD>A)IDu=SGEV=GCF7+/K_tq7LFnp41
+GPcR[FlINAFoQX_GQ2pfH2`-iHN8HmI0P.MIt3'#K)UBtKS>/8LPUeEMi<USNfT6`P*2#nQ'Rc(
+R$sM6S=Z=ETV8*TUnsrdVl6VqX/rG+YHY79ZEpmE[C3QS\[f;`]=bei^;%Fu^qmn)_o'Fl`<+'"
+a8X-]ai_d*bQ#fdc2Q#gci;AjdJqYpe,@ereH"2!fDjM'g&9Y)gAp%-h>c@3hu;R6iW%p:j8\3?
+jo4EBkPscFl2U&Kli-8NmJlVRn,MnWnbr%YoDeI]p&=[bp\agcq>U6fqu-HjrUKl<s5*d+~>
+JcC<$JcG?AoD\^erqu]krqcZjrqQNf!;?Ebs7C^1o()>@nF,i6mHj3*lKRNqk2tddj5T%Uhqm2E
+gY1?4f@JI$da?FfcHXPUaiMNA`P]R/^V@Ip]=PP^[^EKKZ*:F7XfSP%W2HMgUnXQUSt;IAR[KP0
+Q'IPrOcYWaNJrdPM2-h?KS+l-J:E#rI=$9dG^"@TF`_\Fmre\Rr-%jXqf_XVq0)d7s%iYirD!8b
+s%E8^s%32\qa^TSrC-UWp7hS5oQfSFnTjbOog.uArhfUi!2K@C`ImtSqksFlrho[k!2odm!2ogn
+rMBIUplYB6p5f*4!0?u<pQ>?7r_WMir)3;grD`br!jf/9pTFV#YPt[)XSS@TR-p=7QiLatBDZBA
+C&VlEC]/)KD>A)IDu=SGEV=GCF7+/KPl-aFP5]V"G1:a5G5?@@FT$@^G5QRaGlN'gHN/<lI/\Nu
+IXcitJ:W=OK2.)RL5(J>M2I4MN/`jYO-,TgPE_>uQ^F//S"#q>StD[LU8+N\VPg>jWiE,$Xfek3
+Yd(L?Za@-K\%&uZ]">Se]Y2%o^VIY$_SX4.`;[^W`lH.!a9'K+b5TTabl>recMu5jd/DAldf7ep
+eGn&!f)=5#f`0Y'gAfn-h#6(/hZ)L4i;_d9ir8!<jT"?@k5XWEkl0iHlMp2Lm/QJQmf)\TnGi%W
+o)J=]o_nI^pAambq#:*gqYU0gr;?N`rdk++s*t~>
+JcC<$JcG?AoD\^erqu]krqcZjrqQNf!;?Ebs7C^1o()>@nF,i6mHj3*lKRNqk2tddj5T%Uhqm2E
+gY1?4f@JI$da?FfcHXPUaiMNA`P]R/^V@Ip]=PP^[^EKKZ*:F7XfSP%W2HMgUnXQUSt;IAR[KP0
+Q'IPrOcYWaNJrdPM2-h?KS+l-J:E#rI=$9dG^"@TF`_\Fq`amAq`k-GqEWt's%r_ks%`Mer_3>b
+r(?u\r^coVrC6`Sr_i>bnj1Aaog/FSs&A\jr_rktr)CF#s$ulQr_r\n!)rShpf%,dj\=u7qb@&d
+r)*Aipf%,jr`&r(r`oG.rET;,ra#S1qGdDlp/L$M!+u4Cqe5tCrbD=GrG;IMq/6+Kr,D7Ip2]\E
+mWA/$rcS$[e9Ce5qK:e>rH8-`r-/0cs*=Tis*F`nrd>!"It*!!JV*lR:5"=UL51SAMMmFPNK0'\
+OcklkPa.Q$R$a>3S"-(AT:hmPUSO``Vl-JnWiN5'Y-5(6Z*L^B['d?O\@K/]]=Y_g]tV7r^qde'
+_Sa:0rl"rYa2e2#!m/U-rlb>cs3:Pgs3L_lrR(Yns3pqrs4%,#rR_)%s4RA)s4[P/rS@M1s53h6
+s5F";ro=%>s5j7Bs6'FGrosIJs6K[Ns6]jSrpTmVs7-'Ys7?9_rUp0`s7cHdrqZQiqtp?ir;H0b
+JcFU,J,~>
+JcC<$JcG?Ao`"gfrVZTjs8)ckrV6Ee!;?Eb#5%NYo()>?rpP:'mHj3*lKRNqk2tdcj5T%Uhqm2E
+gY1?5f@JI$da?FfcHXPUaiMNB`P]R/^q[Ur]=PP_[^NQLZEUR9XfSP&W2HMhUnaWWT:VUCS!fY1
+QBd\uP*(fdNJrdQM26qAKnP)1JUi6!I=-BfH$FOWG'%hIEcH)<Df0H0Cs\^Q;>sDl:]F2g:&[id
+9DhE^8cD9X8,YpV70)0?hY?"(T(\fHT^/6BT_(PGk5OHBjS@p5k4>hVYPYQ_Z1G3q7/lBIkksWA
+k5FKBk5XQCjS[!m`:1\5_Yh7E^]74/;>jDf;uBVn<W?)'naQ&:n*^/@s6BjRl07Epjo*I%bkoZW
+cM#N\bkTB]BDcHBC&VlEC]/)KD>A)JDu=SIEVFMEF5h<AFo0&UFng.3GPZL[Fl7B?FoHR_GQ2pf
+H2`-iHN8HmI0"eHrd\($JqJ]/Knb>;Ll$tGMi<USNfT9aP*2&pQ'Rc(R@9V8SXuFGTqS3VUnsrd
+W2ZetXKAV-YHY:;Za7$H[^NZT\[f;`]Y(ql^V@S#_8=(,`5KX6`l?'uaT'?^b5KKbbg"E2c2u>=
+d/DAldf7epeGn)!f)=5#f`0Y(gAfq-h#6(/h>lI3i;_d9ir8!<jT"?@k5XWEkl0iHlMp2Lm/QJQ
+meuVSnGi%Wo)J=]o_nI_pAXgaq#C0hqYL*fr;?N`rdk++s*t~>
+JcC<$JcG?Ao`"gfrVZTjs8)ckrV6Ee!;?Eb#5%NYo()>?rpP:'mHj3*lKRNqk2tdcj5T%Uhqm2E
+gY1?5f@JI$da?FfcHXPUaiMNB`P]R/^q[Ur]=PP_[^NQLZEUR9XfSP&W2HMhUnaWWT:VUCS!fY1
+QBd\uP*(fdNJrdQM26qAKnP)1JUi6!I=-BfH$FOWG'%hIEcH)<Df0H0D!cEGFo-@OGPu[b;>sDl
+:]F2g:&[id9DhE^8cD9X8,YpV70'"WU%kA]HLZ:WHMDj\HLlFXGlN![60>!DV"TJ^KD@q8Vu!:d
+V>R4eV=]rGOnk+<O84n'OT85U;>jDf;uBVn<W?+sYQ(j,YPbO)XfST%RI-C-Qhm*LBDcHBC&VlE
+C]/)KD>A)JDu=SIEVFMEF5h<AFoIU(P5f\"G1Us7G5HF?FT$@]G5ZXbGlN'gHN/<lI/\NpIXh?I
+=+PsUK7nr5L51SAM2I4MN/`jYOHG]hPa.N"Q^F20S"-%@StMdNU84T]VPgAlWiN5'Xfek3Z*L^B
+['d?N\%&uZ]">Vf]tV7r^qmk(_Sa=1`Poj:a8X0[aT0K^b6#o4c2Gohcd:&;dJqYpe,@erec45!
+fDjM'g&B_*g]-(-h>c=3hu2L5iW%p:j8\3?jo4EBkPscFl2U&Kli-8NmJlVQn,MnWnbr%YoDeI]
+p&Fabp\agdq>U6equ-HjrUKl<s5*d+~>
+JcC<$JcG?Ao`"gfrVZTjs8)ckrV6Ee!;?Eb#5%NYo()>?rpP:'mHj3*lKRNqk2tdcj5T%Uhqm2E
+gY1?5f@JI$da?FfcHXPUaiMNB`P]R/^q[Ur]=PP_[^NQLZEUR9XfSP&W2HMhUnaWWT:VUCS!fY1
+QBd\uP*(fdNJrdQM26qAKnP)1JUi6!I=-BfH$FOWG'%hIEcH)<Df0H0D#QZg5ib-0;>sDl:]F2g
+:&[id9DhE^8cD9X8,YpV7Jp'V;=6aH6MNq)6M*S@<W5tc;o2$$8,5RI;uTYp;>F,d;uBDP:#etK
+;#F2h;YX2g<;fhs<rZFu?2S%-<;'8b<9I3[<<$V/B`;`FCAVfFD#S;IDZ+MOE:n5FEq4;2FT6L\
+;u_"8G1Us7G5HF?FT$@]G5ZXbGlN'gHN/<lI/\NpIXh?I=+PsUK7nr5L51SAM2I4MN/`jYOHG]h
+Pa.N"Q^F20S"-%@StMdNU84T]VPgAlWiN5'Xfek3Z*L^B['d?N\%&uZ]">Vf]tV7r^qmk(_Sa=1
+`Poj:a8X0[aT0K^b6#o4c2Gohcd:&;dJqYpe,@erec45!fDjM'g&B_*g]-(-h>c=3hu2L5iW%p:
+j8\3?jo4EBkPscFl2U&Kli-8NmJlVQn,MnWnbr%YoDeI]p&Fabp\agdq>U6equ-HjrUKl<s5*d+~>
+JcC<$JcGBBoD\^erVZTjs8)ckrV6Ee!;?Eb#5%NYo()>?rpP=(mHj3*l07Epk2tdcj5T%Uhqm2E
+gY1?5f@JI$da?FfcHXPUaiMNB`PfX1^q[Ur]XkY`\$iZMZE^X;Xf\Y(WMcYjUnaZXTUqaFS!ob4
+Q^*i"P*(ieNfB!UM2@%CL4t84JUi9#I=6KhH?jaZG'.nKF)l8?E,TW3D/B5f"_qabBP1r2SH2Vc
+rD<Mis%`Mes%NDbrC[&\r^coVrC6fU!ScE-h>Q4.htiuFT(8NDT^8<FT_(PMjn7d6jnRs<Z1>-u
+YP#-_Z1bEs7/c9IkPXKAjo=HDjlZO's5a.=rPeiVn\jn6pqlpEq7uo*r)3;grD`_qrDipfrpTmS
+s6TdO!:'RJ"mG+1jiu'Bbl5l`cLoHXbk]H[B`;`FCAVfGD#S;IDZ+MOE;";IEq=A,FS^+[_Z"]Q
+G2%6:G5HF=FT-F^G5QRaGlN'gH3/G@I/\OjIXcluJUrE*K7nr5L51SAM2I4MNK0'\OHG]iPa.Q$
+R$a;2S"-(AT:hmPUSO``Vl-MoWiN5'Y-5(6ZEpmE[C3NQ\@K/]]=bei^;%Fu_>_:P_o2Pn!li:$
+rl>/_b0'_,s3(JfrQbGhs3U_l!n,QHrRCkts47/#s4IA)rS%;+s4mS/s5!b5rS[_7s5O%<s5a4A
+rT41Ekii!0s69UMrTsROs6fmTs7$'YrUU![s7H6^s7ZKer:p9erqcKgrVZTlo)=4?h>`!~>
+JcC<$JcGBBoD\^erVZTjs8)ckrV6Ee!;?Eb#5%NYo()>?rpP=(mHj3*l07Epk2tdcj5T%Uhqm2E
+gY1?5f@JI$da?FfcHXPUaiMNB`PfX1^q[Ur]XkY`\$iZMZE^X;Xf\Y(WMcYjUnaZXTUqaFS!ob4
+Q^*i"P*(ieNfB!UM2@%CL4t84JUi9#I=6KhH?jaZG'.nKF)l8?E,TW3D/B5f"_qabBP1rGG3jDR
+;GmBhs%iYirD!;cr_*2^r^m)[qa^TSs$cdWrLs.`qKhXVr-J'`pNlIWq0;NtjeVs2on:J?pdG+X
+!2TUjrM0FirhT:brM8eCplYN:r/q#@m#h3Cr)3;grD`_qrDrs&qlg%&s/c@*Xf_T'q3g`>lBhF9
+r+Q(DrbD=GrbVRNq/6.Lr,D@Lq/Z(JgN<:7!0[>(pibD9q0)XXhK8a>rc\3`s*4Qhrd"WmI!kpA
+:k!nEJ:W9'K7ei2L5(J>M2@+JN/`jYO-#KePE_>uQ^F/.S"#q>StD[LU8+N\VPg>kWiE,$Xfek3
+Yd1UA['d?N\%&uZ]">Vf]tV7r^qp#e!Q2kT`<+'"a8X-]ai_d*bQ#cdc2Grfci;Ajd/qbFe,@er
+ec45!fDjM'g&9Y)g]-(-h>c=3hu2L5iW%p:j8\3?jo+<CkNM..l2U#Kli$2MmJlVRn,MnWnbr%Y
+oDeI\p&Facp\agcq>U6equ-HjrUTr=s5!^*~>
+JcC<$JcGBBoD\^erVZTjs8)ckrV6Ee!;?Eb#5%NYo()>?rpP=(mHj3*l07Epk2tdcj5T%Uhqm2E
+gY1?5f@JI$da?FfcHXPUaiMNB`PfX1^q[Ur]XkY`\$iZMZE^X;Xf\Y(WMcYjUnaZXTUqaFS!ob4
+Q^*i"P*(ieNfB!UM2@%CL4t84JUi9#I=6KhH?jaZG'.nKF)l8?E,TW3D/B5f"_qabBP1rN5l*_D
+54Cc;;GmBhs%iYirD!;cr_*2^r^m)[qa^TSs$cc^peg9Ar'L*Ej$E`5oKiFTs&K"smo'3V_++Do
+pdFsWrDNSkr_iGgr(c<Ij\G_Nr)3;grD`_qrDrl%pg*l*s'>Y(nPf-\mSj$_r+Q(DrbD=GrbVRN
+q/6.Lr,D@Lq/Z(JgN<:7!)rl>pibD9q0)XXhK8a>rc\3`s*4Qhrd"WmI!kpA:k!nEJ:W9'K7ei2
+L5(J>M2@+JN/`jYO-#KePE_>uQ^F/.S"#q>StD[LU8+N\VPg>kWiE,$Xfek3Yd1UA['d?N\%&uZ
+]">Vf]tV7r^qp#e!Q2kT`<+'"a8X-]ai_d*bQ#cdc2Grfci;Ajd/qbFe,@erec45!fDjM'g&9Y)
+g]-(-h>c=3hu2L5iW%p:j8\3?jo+<CkNM..l2U#Kli$2MmJlVRn,MnWnbr%YoDeI\p&Facp\agc
+q>U6equ-HjrUTr=s5!^*~>
+JcC<$JcGBBoD\^erquZjs8)ckrV-Hgp@eLYJ+W@(o()>?n*f]4mHj3)l07Epk2tdcj5T%Uhqm2E
+gY1?5f@JI$da?FfcHXSVb/hWC`PfX1^q[Us]Xt_a\$i]NZa$a<Y-"e*Wi2hmUnj`YTV%gHS"#h5
+R$O#%PEM&hO,f0XMM[1FL4t;5Jq8H%IXQWkH?sj]GBS+NF9lr.EH#i6DJa4hCB\HeBP;$jrac+@
+A,]rtSc;Rf;>j>k:]F2g:&doe9DhE]8cD9X8,YmW7K)!@h#?..hYuF+TE(VDT^/6JT^tJLjm;.0
+k5sf/kPhaWYl:iWYl1d#6i][Rk5=?9jSe-;iW.s8`qdUC`:h+F_YV+F_#@4/;Ya8i<;fhm<XnNc
+md9B,lg!a!kih3lro=((pWWTZrljoWp!!9Us(MCGrbD=GrbVRNqJQ7Mr,DCMq/Z1Md<,))pNGG<
+q0)XXh/rX=rc\3`s*+NhrH_XoI!g?jIXZcsJ:W<(K7ei2L5(J>M2@.LN/`jYO-,TgPE_>uQ^F20
+S"#t?StD^MU84T]VPgAlWiN5'Xfen4Z*L^B[C3NQ\@K/]]=bei^;%Fu_84"*_o2Pn#KFg)aN2KF
+b5KKbbg"E3cMu5jd/DAldf7epeGn)!f)=5#f`0Y'gAfn-h#6(/hZ)L3i;_d9ir8!<jT"??joX`0
+kl'cGlMp2Lm/QJQmeuVSnGi%Wo)J=]o_nI_pAXgaq#:*gqYL*fr;?Nardk+*s*t~>
+JcC<$JcGBBoD\^erquZjs8)ckrV-Hgp@eLYJ+W@(o()>?n*f]4mHj3)l07Epk2tdcj5T%Uhqm2E
+gY1?5f@JI$da?FfcHXSVb/hWC`PfX1^q[Us]Xt_a\$i]NZa$a<Y-"e*Wi2hmUnj`YTV%gHS"#h5
+R$O#%PEM&hO,f0XMM[1FL4t;5Jq8H%IXQWkH?sj]GBS+NF9lr.EH#i6DJa4hCB\HeBP;$jrac+@
+A,]s6G3X;O;?0Sm;#a>k:Amoe9`Ic`9)_E]8GbpU7K>mPT`(S`U@rm5H/a/9H2MpY604sBL#n!C
+KD7h77Jrt]U\^eaV>-kbPNS+fOoA5U;Ya8i<;fhm<r0#tXT5I$WrSU_RIZa4Qhm*LB`;`FCAVfG
+D#S;JDZ+MOE;+AJEqXS%FS9kOG2IN>G5HF<FT-F^G5QRaGQ<$fH<PZCI!pElIXcluJV&K+K7nr5
+L51SAM2R=ONK0'\OcklkPa.Q$R$jD4S"6.BT:qsQUnjiaVl6SpX/rG*Y->.8ZEpmF[^NZT\[f;`
+]Y(ql^V@S#_8=(,`;[^\`lH-@aN;QHrQ>8dc-?75s3L_lrR(Yns3pqrs4./#rR_)%s4RA)s4[P/
+rS@M1s53e5s5F";ro=%>s5j4A!pAe2rTX@Is6K[Ns6]jSrU9dUs7-'Ys7?9_rUp3arqH?crqZQi
+qYU6hr;H3cJcFR+J,~>
+JcC<$JcGBBoD\^erquZjs8)ckrV-Hgp@eLYJ+W@(o()>?n*f]4mHj3)l07Epk2tdcj5T%Uhqm2E
+gY1?5f@JI$da?FfcHXSVb/hWC`PfX1^q[Us]Xt_a\$i]NZa$a<Y-"e*Wi2hmUnj`YTV%gHS"#h5
+R$O#%PEM&hO,f0XMM[1FL4t;5Jq8H%IXQWkH?sj]GBS+NF9lr.EH#i6DJa4hCB\HeBP;$jrac+@
+A,]s65PRG65Q=U];>j>k:]F2g:&doe9DhE]8cD9X8,YmW7J'LW;>!6B6M<e@6L[A662+@J;ZKer
+8&7Xp8,,IP7Jp'Y;>jDe;tNiK:$GFP;>a>f;uK\o<V]\l>l7k2?<piA>ZCGrqbm>jpJg`_qGdK.
+rb;@HqeQ1Irb_LLrGVUQpMp"Lp2eW'p3$+Qhfnm>qfU_:rcS3`r-/0c!."Nh>'kXEI=6QnIt3'#
+JqAW-KS>/8LPUeDMi<USNfT6`P*2#nQ'Rc(R@9V7SXuFFTqS3VUnsrdW2ZetXKAV-YctC<Za7'J
+[^WcW\[oDc]Y2%o^VI\%_SX4/rl#,^a2c9BaiV^(b6#o4c2Q#gci;AjdJqYpe,@erec45!fDjM'
+g&9Y)gAp%-h>c@3hu2L5iW%p:j8\3?jo+<CkNM..l2U&Kli-8NmJlVQn,MnWnbr%YoDeI]p&Fab
+p\agcq>U6equ-HjrUTr=s5!^*~>
+JcC<$JcGBBoD\^erqu]krqcZjrV-Hgp@eLY!VH!_np^,un*f]3m-O''l07Epk2tabj5T%Uhqm2E
+gY1?5f@JI$e'ZRhcHXSVb/hZD`Pf[2_8!au]Xt_b\$i]OZa-g>Y-"e+Wi;noV50l\TqJ!KS=>t8
+R$X)'PEM)jO,f3YMi*@ILPCM9K7\Z)IsufnH[:!_GB\4QFEDSDE=Qr+DJj<-CMR["BkV0mB)Z?B
+A7PUJ!F]C8?iOF5?!Qfgs&8qq!)`\ks%iYirD!;cs%E8^r^m)[qa^TSqqM/+rS@M1!8[1<nY,KG
+q4I8Onj339!9a4@r9+"?rTEaVgT^7PpI#!MrT=%=rT!q=rT!k9ro*n8r5S9GnAP.?qni9Ir4i;0
+r)3>hrD`_qq,[Jr!q#@?rTX^Rkih0kjlGL^iVq+!bk]HYbkfTTbkoT`C&VlEC]/)KD>J/KDuFYL
+EVa_NF3A\!FnU"<GPQFYFmsMKF7jYRFoQX_GQ2mfH2W$iH[Pg@<.9=HJ:N3&K7ei2L5(J>M2@+J
+N/WaVO-#KeP*D5sQC+&-R[]h<StD[LU8+N[VPg>jWiE,$Xfek3Z*L^B['d?O\@K/]]=bei^;%Fu
+_84"*_o2Pn!QN1Za9'K+b5TTabQ,odc2u>=d/DAldf7epeGn)!f)=5#f`0Y'gAfq-h#6(/hZ)L3
+i;_d9ir8!<jT"??k5XTEkl'cGlMp2Km/QGQmeuVSnGi%Wo)J=]o_eC^pAamaq#C0hqYL*fr;?N`
+rdk+*s*t~>
+JcC<$JcGBBoD\^erqu]krqcZjrV-Hgp@eLY!VH!_np^,un*f]3m-O''l07Epk2tabj5T%Uhqm2E
+gY1?5f@JI$e'ZRhcHXSVb/hZD`Pf[2_8!au]Xt_b\$i]OZa-g>Y-"e+Wi;noV50l\TqJ!KS=>t8
+R$X)'PEM)jO,f3YMi*@ILPCM9K7\Z)IsufnH[:!_GB\4QFEDSDE=Qr+DJj<-CMR["BkV0mB)Z?B
+A7PUJ!F]C8?iOF5?!QfAs&8qq!)`\ks%iYirD!;cs%E8^r^m)[qa^TSoq;>Y!20:9eU$S-!-n'#
+qkj4dr207ciJ$WOnq6[)!(Hj^s.enUrKI;Gi0*hsqNC];!)`Ylq,@5krDiYor`B-&#Ht;5Xf\\+
+Xo5="WrAIaRIHU6QhQmIC&VlEC]/)KD>J/KDuFYLEVa_NF3A\!FnU"<GPQFYFmsMKF7jYRFoQX_
+GQ2mfH2W$iH[Pg@<.9=HJ:N3&K7ei2L5(J>M2@+JN/WaVO-#KeP*D5sQC+&-R[]h<StD[LU8+N[
+VPg>jWiE,$Xfek3Z*L^B['d?O\@K/]]=bei^;%Fu_84"*_o2Pn!QN1Za9'K+b5TTabQ,odc2u>=
+d/DAldf7epeGn)!f)=5#f`0Y'gAfq-h#6(/hZ)L3i;_d9ir8!<jT"??k5XTEkl'cGlMp2Km/QGQ
+meuVSnGi%Wo)J=]o_eC^pAamaq#C0hqYL*fr;?N`rdk+*s*t~>
+JcC<$JcGBBoD\^erqu]krqcZjrV-Hgp@eLY!VH!_np^,un*f]3m-O''l07Epk2tabj5T%Uhqm2E
+gY1?5f@JI$e'ZRhcHXSVb/hZD`Pf[2_8!au]Xt_b\$i]OZa-g>Y-"e+Wi;noV50l\TqJ!KS=>t8
+R$X)'PEM)jO,f3YMi*@ILPCM9K7\Z)IsufnH[:!_GB\4QFEDSDE=Qr+DJj<-CMR["BkV0mB)Z?B
+A7PUJ!F]C8?iOF5?!R.gpHS[Vs&&horD<Mis%`Mes%NGcr(?r[r^coVrC6?UrB^*CmR-V7q*XaA
+nj2hGoi(NRmmd=Ih+%-,!(Hiar)*>hq,@5k!)rhln4r1AnP0']r)3>hrD`_qq,[JrqHWr(r*95#
+qc!5er)<;gqG[,fs(VIIqeQ.Hrb_LLrGVXRpMp%MpiFW#p3$(Pick3AqK;:Lq/c4NrH8-`r-/0c
+!."Nh!IK4nI8kZFIt3'#JqJ]/Knb>;Ll$tGMi<USNfT9aP*2&pQ'Rf)R@9V8SXuIHTq\<XUo(&f
+W2ckuXKAY/Yd(L?Za@-K\%&uZ]">Vf]tV7r^qmk(_Sa=k`<"!!rl>/_b0'_,s3(JfrQYJjd*Va=
+s3gqrrRCkts47/#s4IA)rS%;+s4mS/s5*e5rS[_7s5O%<s5a4ArT=.C!9jCGs6BXMrTsRO!:KgS
+s7$'YrUU![s7H6^s7ZKeqtU3erqcKgrVZTlnc"+>h>`!~>
+JcC<$JcGBBoD\^erqu]krqcZjrqQNfs7ZHb!VH!_npg3!n*f]3m-O''l07Epk2tabj5T%Uhqm2E
+gY1?5f@JL%e'ZRhcHXSVb/hZD`Pf[2_8!au]Xtbc\@/iQZa-j?YH=q-Wi;qpVPL#^TqJ$LSXZ+;
+R$a2)P`q8mOH5E\N/NOLLk^Y<K7ec+J:DuqI!^0bG^"@TF`_\FEH)J-Df0H0Chmg$C2%?pB4h-S
+!G#^>@KBnFra5\3!+#S/!aAi3r`T#erDNbq;,R9gs%iYirD!;cs%E8^s%32\qFCNSq:kr)s5!_1
+!8ZP+rLibUn"B2:!9i\1!9ipWgT^=RpdG*MroF%<!93q:r8R\6r8@7fnAY";r58BJqSE,.q,@5k
+rDiYor`B,%#4(R>lg!`uroXLJjlGI]i8FIVr64lXlHK.KrbD=GrbVRNqJQ7MrG_OOqf;LR`H:`p
+olfPCpicLVn9"AFp2p:Vrc\6as*4Qhrd+Tk!.=co!IfOtJ51ZIK7ei2L5(J>M2@+JN/WdXO-#Ke
+PE_>tQ^F//S"#q>StD^MU8+N\VPgAlWiN5'Xfnt5Z*L^C[C3NQ\@K2_]Y(ql^V@S#_8=(,`;[^V
+`lJ)"#g(63bKJ,Rc-?75s3C\lrR(Yns3pqrs4./#rR_)%s4RA)s4dS/rS@J0s53h6s5F";rT!q=
+s5j4As6'FGrosIJs6KXMs6]jSrU9dUs7-'Ys7?9_rUp0`s7cHdrqZQiqYU6hr;H0bJcFR+J,~>
+JcC<$JcGBBoD\^erqu]krqcZjrqQNfs7ZHb!VH!_npg3!n*f]3m-O''l07Epk2tabj5T%Uhqm2E
+gY1?5f@JL%e'ZRhcHXSVb/hZD`Pf[2_8!au]Xtbc\@/iQZa-j?YH=q-Wi;qpVPL#^TqJ$LSXZ+;
+R$a2)P`q8mOH5E\N/NOLLk^Y<K7ec+J:DuqI!^0bG^"@TF`_\FEH)J-Df0H0Chmg$C2%?pB4h-S
+!G#^>@KBnFra5\3!+#S/!aAi3r`T#?rDNbq;,R9gs%iYirD!;cs%E8^s%32\qFCNSoq;>W!2016
+e9^S/nNl?8b(]MA!/(&7r^Hg^s.eqV!2]UXqNKg"rfQi9rDNGirD`_qq,[Jrs&f3%s/l4#"KSQ&
+WN#`_r0d/DoU#3;rbD=GrbVRNqJQ7MrG_OOqf;LR`H:`polfPCpicLVn9"AFp2p:Vrc\6as*4Qh
+rd+Tk!.=co!IfOtJ51ZIK7ei2L5(J>M2@+JN/WdXO-#KePE_>tQ^F//S"#q>StD^MU8+N\VPgAl
+WiN5'Xfnt5Z*L^C[C3NQ\@K2_]Y(ql^V@S#_8=(,`;[^V`lJ)"#g(63bKJ,Rc-?75s3C\lrR(Yn
+s3pqrs4./#rR_)%s4RA)s4dS/rS@J0s53h6s5F";rT!q=s5j4As6'FGrosIJs6KXMs6]jSrU9dU
+s7-'Ys7?9_rUp0`s7cHdrqZQiqYU6hr;H0bJcFR+J,~>
+JcC<$JcGBBoD\^erqu]krqcZjrqQNfs7ZHb!VH!_npg3!n*f]3m-O''l07Epk2tabj5T%Uhqm2E
+gY1?5f@JL%e'ZRhcHXSVb/hZD`Pf[2_8!au]Xtbc\@/iQZa-j?YH=q-Wi;qpVPL#^TqJ$LSXZ+;
+R$a2)P`q8mOH5E\N/NOLLk^Y<K7ec+J:DuqI!^0bG^"@TF`_\FEH)J-Df0H0Chmg$C2%?pB4h-S
+!G#^>@KBnFra5\3!+#S/!aAi3r`T4aq`k$X!`DlmrD<Mis%`Mes%NGcr(?u\r^clUr^QodpJV#g
+!)iY[ogA.8o0r+9nNltMr_reqoi(HPmmcS4oLAUDr^HEVrDWMk!)rekkt^D9qG-ueq,@5krDiYo
+r`B,%!*fD,ra#;(qGdAkp/:fepJ_,koMkg)qeQ1Irb_LLrGVXRpi61Oq/aMsoQBhMk]cfFqK;:L
+p2fqLrcS3`rHJ9ds*=Tis*F`nrd=frJ,XsnJV&N,KS>/8LPUeDMMmFPNfT6_OckomQ'I]'R$sM6
+S=Z=ETqS3UUnsrdW2ZetXKAV.YctC<Za@-K[^WcW]">Vf]tV7r^qmk(_Sa=k`<"!!rl>Aeb0%oN
+bfn>Vrm(Pi!7:\ls3gqrrRCkts47/#s4IA)rS%;+s4mS/rnd\4ro!h8s5O";s5a4ArT=.Cs60IH
+s6BXMrTsROs6fjSs7$'YrUU![s7H9_rq?Bdr:p9erqcKgrVZTlnc"+>h>`!~>
+JcC<$JcGBBo`"gfrVZTjs8)`jrqQNfs7ZKcs7?<_rpkO.nF,i6mHj3*lKRQskN:pfj5].Xi8<DI
+gtUQ9f[n^)eC2gmcd'h[bK@rJa2Q$8_SO%&^:_+i\[],W[Bm3EYck43XK&;!Vl$;dUS=HTSt;IA
+R[KP0QBd\tP)t`cNJrgRM26qAKnP)2JUi9"I=6KiH?jaZGBS(MF)q;#%WH?(DJa3*CMITuBP;$j
+rac+@A,]p<@:9(As'>\2r`fM/>$Co.!a&N*r`9&!!*&nq!`DlmrD<Mi!)EJer_3>br(?u\r^coV
+r^QqAq:c&+gY:N<l_4*Jl(S$Jpn@1CqWRn@pZVV>s6/^Oq60"dpTO<Zr^?hIn)F<)rS[^pn&Fk9
+q8E'GqSN50q,@5krDi\prE&r"!*T<d%-d!=kN:pgjQ#7ZiSaFSrljlTqonu]r65)^qeQ1Irb_LL
+rbqaSpi64PqK'DnoQBbKm<A8IqK;=MoQ0_JrcS3`rHJ9ds*=Ti!df<Brd@jsIt3'#JV&N,KS>/8
+LPUeDMN!LRNfT6`P*2#nQ'Rc(R@9V8SXuFGTqS6WUo(&fW2ckuXKAY/Yd(L?Za@0L\%&uZ]">Vf
+]tV7r^qmn)_o0O5`l?'ua8sE*rlb>c!6tMgs3L_lrmCbos3pqrs4./#rR_)%s4R>(s4dS/rS@M1
+s53e5s5F";rT!q=s5j4As6'FGrTOCKlg+N9s6]jSrU9dUs7-'Ys7?9_r:U*`rqH?crqZQiqYU6h
+r;H0bJcFR+J,~>
+JcC<$JcGBBo`"gfrVZTjs8)`jrqQNfs7ZKcs7?<_rpkO.nF,i6mHj3*lKRQskN:pfj5].Xi8<DI
+gtUQ9f[n^)eC2gmcd'h[bK@rJa2Q$8_SO%&^:_+i\[],W[Bm3EYck43XK&;!Vl$;dUS=HTSt;IA
+R[KP0QBd\tP)t`cNJrgRM26qAKnP)2JUi9"I=6KiH?jaZGBS(MF)q;#%WH?(DJa3*CMITuBP;$j
+rac+@A,]p<@:9(As'>\2r`fM/>$Co.!a&N*r`9&!!*&nq!`DlmrD<Mi!)EJer_3>br(?u\r^coV
+r^Qp[q4RYXpNb87r-89gq0DHqrMKRlm\\'ZpOr9/r^H(Irh]XYrfm5Bd?=K,q,@5krDi\prE&r"
+"^/%4Y-"i)XT#:"WW9$lRf8`IR.?U<R/:[uD#S;JDZ4SQE;4GNEr'jlFS'_IG3sMIG5?@OFS'YJ
+FT-F^G5ZXbGlN'gH3/G@I/\OqIXcluJUrE*K7nr5L51SAM2I7NNK0'\OcklkPa.Q$R$jD4S=Q7C
+TV8'SUnjlcVl6VqX/rG+YHY:;Za7$I[^WcW\[oDc]Y2%o^VI\&_Sa=2`Q#p<rl>,^b5TTabQ,oe
+cMu5jd/MGmdf7epeGn)!f)=5#f`0Y&gAfq-h#6(/hZ)L3i;_d9ir.p;jT"??k5XWEkl'`IlKdd7
+m/QJQmeuVSnGi%Wo)J=]o_eC^pAXgaq#:*gqYL*fr;?N`rdk+*s*t~>
+JcC<$JcGBBo`"gfrVZTjs8)`jrqQNfs7ZKcs7?<_rpkO.nF,i6mHj3*lKRQskN:pfj5].Xi8<DI
+gtUQ9f[n^)eC2gmcd'h[bK@rJa2Q$8_SO%&^:_+i\[],W[Bm3EYck43XK&;!Vl$;dUS=HTSt;IA
+R[KP0QBd\tP)t`cNJrgRM26qAKnP)2JUi9"I=6KiH?jaZGBS(MF)q;#%WH?(DJa3*CMITuBP;$j
+rac+@A,]p<@:9(As'>\2r`fM/>$Co.!a&N*r`9&!!*&nq!`DlmrD<Mi!)EJer_3>br(?u\r^coV
+r^Qibqbm>hs$HNKogI_,o0i(6qGcu`r`&DXmmcS4pI=mFr^?fbr_rMgrDWMks%`PhiD/W3r_iPj
+rD`_qqH!PrrE',(>[786p0@;jr)<Agqc!Akr)<>hqeQ1Irb_LLrbqaSpi64PqK'DnoQBbKm<A8I
+qK;=MoQ0_JrcS3`rHJ9ds*=Ti!df<Brd@jsIt3'#JV&N,KS>/8LPUeDMN!LRNfT6`P*2#nQ'Rc(
+R@9V8SXuFGTqS6WUo(&fW2ckuXKAY/Yd(L?Za@0L\%&uZ]">Vf]tV7r^qmn)_o0O5`l?'ua8sE*
+rlb>c!6tMgs3L_lrmCbos3pqrs4./#rR_)%s4R>(s4dS/rS@M1s53e5s5F";rT!q=s5j4As6'FG
+rTOCKlg+N9s6]jSrU9dUs7-'Ys7?9_r:U*`rqH?crqZQiqYU6hr;H0bJcFR+J,~>
+JcC<$JcGBBo`"gfrVZTjs8)`jrqQNf!;?Ebs7?<_rpkR/nF,i6mHj3*lKRQskN:pfj5].Xi8<DI
+gtUQ9f[n^)eC2jnd*Bq\bK@rJa2Z*:_SX+'^:h1k\[f2X[C!9GYct:4XfJJ$W2HMgUnXQUT:VUD
+S!o_3QBd`!P*(ieNfB!UMM[.EL4t;5Jq8H%IXQWlH?sj]GB\1OFE;L&E=Qr+DJj<-CMR["BkV0m
+B)Z?BA7PUJ#@V"J?XI,G?2e(1>?Y50=TV],=8l8#<<-"s;Z]io;>j;m:JO[`:&dod9DqK^8cD9W
+7fZ$WgATb+gAK^rU$eZ3U$k;@kl0i?kQ'l1YkP?dYkbKt7/TLFiq_R3i:b.Z`q77J`:CeG;Ya8i
+<;fhn<rH,!=T)D&klBrHkPsZFjlHF$s5F%:p<ET\ilh>FrQG1UrbVOMqel@Nrc%XPr,V[U]QE^e
+nTOJIolg.RnT=DEp2p:Vs*"<as*4Qhrd"s!I!g?jIXZcsJ:W=OK2RAVL5(J?M2I4MN/`jYOHG]h
+Pa.N"R$a;1S"-%@T:hmPUSO``Vl6SpWiW>)YHY79ZEppG[^NZU\[oDc]Y2%o^VI\&_Sa=2`Q#p<
+aN2KFb5TQcbg"E3cMu2jd/DAldK%bpeGn)!f)=5"f`0Y'gAfq-h#-".hZ)L3i;_d9ir.p;jT"??
+k5XWEkl'cGlMp2Km/QGQmeuVSnG_tVo)J=]o_eC^pAamaq#:*gqYL*fr;?N`rdk+*s*t~>
+JcC<$JcGBBo`"gfrVZTjs8)`jrqQNf!;?Ebs7?<_rpkR/nF,i6mHj3*lKRQskN:pfj5].Xi8<DI
+gtUQ9f[n^)eC2jnd*Bq\bK@rJa2Z*:_SX+'^:h1k\[f2X[C!9GYct:4XfJJ$W2HMgUnXQUT:VUD
+S!o_3QBd`!P*(ieNfB!UMM[.EL4t;5Jq8H%IXQWlH?sj]GB\1OFE;L&E=Qr+DJj<-CMR["BkV0m
+B)Z?BA7PUJ#@V"J?XI,G?2e(1>?Y50=TV],=8l8#<<-"s;Z]io;>j;m:JO[`:&dod9DqK^8cD9W
+7fZ$WTDbG[TCR9bHL6"H62mbWVt6bcVoFGdK_Rt57IR&NV>[:hPP^OCPL5Nn;Ya8i<;fhn<rH,!
+=T)A(Y-"i&X8o=!WrAF^Rf8`HR.-I=R/Un#D#J5JDZ+MQE;4GNEr0pjFRjSEG4KkMG56:NFS'YJ
+FT-F_G5QRaGlN'gH4,(II!pElIXcluJV*lR;M9aYL51VBMMmFPNK0']OckllQ'IZ&R$jD4S=Q7D
+TV8*TUnsrdW2ZesXKAV.YctC<Za@-K[^WfX]">Vf]tV7r^qmn)_o0O5`l?'?aN;QHrlYAec-?75
+s3C\lrR(Yn!7Unrs4./#rR_&$s4RA)s4dS/r8%D0s53e5s5F";rT!q=s5j4As6'FGrTX@Is6KXM
+s6TgSrU9dUrpfsXs7?9_r:U*`s7cEcrqZQiqYU6hr;H0bJcFR+J,~>
+JcC<$JcGBBo`"gfrVZTjs8)`jrqQNf!;?Ebs7?<_rpkR/nF,i6mHj3*lKRQskN:pfj5].Xi8<DI
+gtUQ9f[n^)eC2jnd*Bq\bK@rJa2Z*:_SX+'^:h1k\[f2X[C!9GYct:4XfJJ$W2HMgUnXQUT:VUD
+S!o_3QBd`!P*(ieNfB!UMM[.EL4t;5Jq8H%IXQWlH?sj]GB\1OFE;L&E=Qr+DJj<-CMR["BkV0m
+B)Z?BA7PUJ#@V"J?XI,G?2e(1>?Y50=TV],=8l8#<<-"s;Z]io;>j;m:JO[`:&dod9DqK^8cD9W
+7fZ$U;uBPm;>W`U7+Og#7.3G<<:Wud<:EEG7d<M>7efCL7K-6Y;Z0Pj<7F\59`S)e;uK\o<Vfbp
+=8l>#=oM_,>lS%'>lI\&<VKJj;uKV[;u0JmC]8/KD>S5LDuO_NEVskSF1cVcFn'YGGP-.TFn'SG
+F7s_TFoQX_GQ2pfH2`*tH[L3hI=?WpJ:N3&re"+%Knb>;M2@+JN/WaVO-#KeP*D5sQC+&-R[]h<
+StD[LU8+N\VPgAlWiE/&Xfnt5Z*L^C[C3NQ\[f;`]Y(ql^V@S#_SX4/`Poj:a2l?DaiaV+!mJp6
+rm(Pi!7:\ls3^nrrRCkts47/#rn.8(rS%;+s4mP.s5*e5rS[_7s5O";s5a4ArT=.Cs60FGs6BXM
+rTsRO!:KgSs7$$XrUU![s7H6^s7ZKeqtU0drqcKgrVZTlnc"+>h>`!~>
+JcC<$JcGECoD\^erVZTjs8)ckrV6Ee!;?Ebs7?<_rpkO.nF,i6mHj3*lKRQskN:pgj5].Xi8<DI
+gtUQ9f[n^)eC2jnd*L"^bKJ#Ka2Z*:_ns7)^V.:l]",>Z[^<BHZ*:F7XfSP&W2HMhUnaZXTUqaF
+S"#h5Q^3o$PEM&hO,f0XMi!:HL5(D7K7\Z)IsufnH[:!`G^"=RFEA.:EcH)<Df0H0Chmg$C2%?p
+B4h-S!G#^>@L$=L?sd8I?=!P8!aAi3r`K;)=',B%!``3!r_rhps&&bls%iYirD!;cr_*2^r^m)[
+qFC55s4Zq8n"TKKrM&kVs.\sJroj7D!9j%=!9iOKp93bcr3,i_r'^VEqVq;/rS[_5ro!4`n](FE
+qS`'EqG[>lrDi\prE&u#qH<g]rT=.@ro4(>iSa[ZrlbAepWVO<!,MRMrb_LLrbqaSq/Q=Qr,_:J
+k&og.n9*H.piZ(JolKhKrcS3`rHJ9ds*=Tis*F`nrd@XmIt*!!JV&N,KS>/8LPUeDMMmFPNfT6_
+OckomQ'I]'R$sM6S=Z=ETqS3VUnsrdW2ZetXKAY/Yd(L?Za@0L\%&uZ]=bei^;%Fu_8=(,`;[^[
+`lH0AaiV^)b5oi3rQYJjd*Vd>s3gqrrm^tus47,"s4IA)rS%;+rnRJ.s5*e5rS[\6s5O";s5a4A
+rT=.Cs60FGs6BXMrTsROs6fjSs7$'YrUU![rq-0^rq?Bdr:p9erqcKgr;?Kknc"+>h>`!~>
+JcC<$JcGECoD\^erVZTjs8)ckrV6Ee!;?Ebs7?<_rpkO.nF,i6mHj3*lKRQskN:pgj5].Xi8<DI
+gtUQ9f[n^)eC2jnd*L"^bKJ#Ka2Z*:_ns7)^V.:l]",>Z[^<BHZ*:F7XfSP&W2HMhUnaZXTUqaF
+S"#h5Q^3o$PEM&hO,f0XMi!:HL5(D7K7\Z)IsufnH[:!`G^"=RFEA.:EcH)<Df0H0Chmg$C2%?p
+B4h-S!G#^>@L$=L?sd8I?=!P8!aAi3r`K;)=',B%!``3!r_rhps&&bls%iYirD!;cr_*2^r^m)[
+qFCFTrLj+]s*F3\hg4d;mm6`G!2oCb!/AFGr.Of4r'gX\p8%Y`pnmtQaccL!rD`_qqH!Prr`K#"
+riQ1$"Kec,X/l6"!3,g_!1NYMp6b66rg3\$rbVRNqJQ:NrG_RPr,V^VmW@T6k&g*8g3376n9">E
+p2p:Vrc\6as*4Qhrd+Tk!.=co;1="EJ:N3&K7ei2L5(J>M2@+JN/WdXO-#KePE_>tQ^F//S"#q>
+StD^MU84T]VPgAlWiN5'Y-5(7ZEpmE[^NZT\[f>b]Y2%o^VI\&_Sa=k`<O?&aN2KFb5TQbbg$+3
+!mf6?rmCbos3ptss4./#r7Cu$s4RA)s4dP.rS@M1s53e5ro*n:rT!q=s5j4As6'FGrTX@Is6KXM
+s6]jSrU9dUs7-'Ys7?6^rUp0`s7cHdrqZQiqYU3gr;H0bJcFR+J,~>
+JcC<$JcGECoD\^erVZTjs8)ckrV6Ee!;?Ebs7?<_rpkO.nF,i6mHj3*lKRQskN:pgj5].Xi8<DI
+gtUQ9f[n^)eC2jnd*L"^bKJ#Ka2Z*:_ns7)^V.:l]",>Z[^<BHZ*:F7XfSP&W2HMhUnaZXTUqaF
+S"#h5Q^3o$PEM&hO,f0XMi!:HL5(D7K7\Z)IsufnH[:!`G^"=RFEA.:EcH)<Df0H0Chmg$C2%?p
+B4h-S!G#^>@L$=L?sd8I?=!P8!aAi3r`K;)=',B%!``3!r_rhps&&bls%iYirD!;cr_*2^r^m)[
+qFC?[qbllNf1#I&mm6eLo2GTehadT6l::bApI+pJ!)rJes&8\lcqa7.qG[>lrDi\prE&u#qH<f&
+r`f2'!*enki`#hU!,MRMrb_LLrbqaSq/Q=Qr,_:Jk&og.n9*H.piZ(JolKhKrcS3`rHJ9ds*=Ti
+s*F`nrd@XmIt*!!JV&N,KS>/8LPUeDMMmFPNfT6_OckomQ'I]'R$sM6S=Z=ETqS3VUnsrdW2Zet
+XKAY/Yd(L?Za@0L\%&uZ]=bei^;%Fu_8=(,`;[^[`lH0AaiV^)b5oi3rQYJjd*Vd>s3gqrrm^tu
+s47,"s4IA)rS%;+rnRJ.s5*e5rS[\6s5O";s5a4ArT=.Cs60FGs6BXMrTsROs6fjSs7$'YrUU![
+rq-0^rq?Bdr:p9erqcKgr;?Kknc"+>h>`!~>
+JcC<$JcGECoD\^erVZTjs8)ckrV6Ee!;?Ebs7C^1o()>@nF,i6mHj3*lKRQskN:pgj5].Xi8<DI
+gtUQ:f[na*eC2jnd*L"^bfe/MaMu3;_ns7*^V7@n]",>[[^EKKZEUR9XfSS'WMl_lUnj`YTq@pI
+S=>t8R$X)'P`h2kO,o9ZN/EIKLPCP:K7ec+J:E#rI!^0c)0pING'.nKF)l8?E,TW3D/=!'C2.Hr
+BP1rVAH?=OraH+@?sm>K?=$q:>QS,5>5hY+=BAT'<WZ9#<;ohr;ZBVn;#a>k:Amoe9`Ic`9)_E]
+8Gl!Vg]-"*g]#q"U#r*HU$8<>60RS5Z/r4`YNN.b7/KFOiq_R3i;2@1i9eMS`qdUN`:_%G;uK\o
+<Vfbp=8l=u=oMV)kPaNGjlGI^ir7p7c2GidbPKHUbPo`QbPuDXD>S5MDuFYNEW'qUF7FA,Fm*r:
+Fl%<:FmsMEF7s_TFoHR_GQ2pfH2`*kH[L5?I8GBBJ:N3%JqJ]/Knb>;Ll$tGN/WaVO,oBcP*;,q
+QC!u,R[]h<StD[LTqeEZVPg>kWiE/&Xfen4Z*L^C[C3NR\[f;`]Y(qm^VI\&_Sa=k`=']+aN2KF
+b0.uPbg$.4s3C\lrmCbos3pqrs4./#rR_)%s4RA)rnIJ.rS@M1rnm\4s5F";r8[h<s5j4As6'FG
+rTX@Is6KXMs6]jSrU9dUs7-'Yrq$0^rUp0`s7cEcrqZQiqYU6hr;H0bJcFO*J,~>
+JcC<$JcGECoD\^erVZTjs8)ckrV6Ee!;?Ebs7C^1o()>@nF,i6mHj3*lKRQskN:pgj5].Xi8<DI
+gtUQ:f[na*eC2jnd*L"^bfe/MaMu3;_ns7*^V7@n]",>[[^EKKZEUR9XfSS'WMl_lUnj`YTq@pI
+S=>t8R$X)'P`h2kO,o9ZN/EIKLPCP:K7ec+J:E#rI!^0c)0pING'.nKF)l8?E,TW3D/=!'C2.Hr
+BP1rVAH?=OraH+@?sm>K?=$q:>QS,5>5hY+=BAT'<WZ9#<;ohr;ZBVn;#a>k:Amoe9`Ic`9)_E]
+8Gl!TTD>/XHMVp?HLQ4J62meJVZ)=dL%n(570'+VV":J]PKB!c;uK\o<Vfbp=8l=u=oMV'XTPZ,
+XK25um$[R7m?dihrb_OMrbqaSq/Q@Rr,_CMgND_%n9*T2piZ(Jo5jVIrcS3`rHJ9ds*=Ti!df<B
+rd@UlIt3'#JV&N,KS>/8LPUeDMN!LRNfT6_P*2#nQ'Rc(R@9V8SXuIHTqS6WUo(&fWN)u"Xf\b1
+Yd(L?['d?N\@K/]]=bei^V@S#_SX4/rl#8ba2l?Dai_fMbfn?2cMu2jd/MGmdf7epeGn)!f)=5#
+f`0Y'gA]k,h#6(/hYuF2i;_d9ir%j:jT"??k5XWEkl'cGlMp2Km/QJQmeuVSnGi%Wo)A7\o_nI^
+pAamaq#:*gqYL*fr;?N`rdk+)s*t~>
+JcC<$JcGECoD\^erVZTjs8)ckrV6Ee!;?Ebs7C^1o()>@nF,i6mHj3*lKRQskN:pgj5].Xi8<DI
+gtUQ:f[na*eC2jnd*L"^bfe/MaMu3;_ns7*^V7@n]",>[[^EKKZEUR9XfSS'WMl_lUnj`YTq@pI
+S=>t8R$X)'P`h2kO,o9ZN/EIKLPCP:K7ec+J:E#rI!^0c)0pING'.nKF)l8?E,TW3D/=!'C2.Hr
+BP1rVAH?=OraH+@?sm>K?=$q:>QS,5>5hY+=BAT'<WZ9#<;ohr;ZBVn;#a>k:Amoe9`Ic`9)_E]
+8Gl!N;u]bg7*\6u7.*A?<W5ti;u9Po8AIaj7/KCQ;ta,f;tj8<:A%?Z;uK\o<Vfbp=8l=u=oMUu
+>lIso<;BJl<:*WaD#S;KDZ4SQE;=MPEr:"KFPCs%FRXG0G5-4LFRsSIFT-F^G5ZXbGlN'gH3/G@
+I/\OjIXcluJUrE*K7nr5L51SAM2I7NNK0'\OHPcjPa.Q$R$jD4S=Q7DTV8'SUnjlcVl?\rXKAV-
+YctC<Za@-K[^`lY]">Vf]t_=t_8=(,`;[^``lH0AaiV]KbKS2Trm(Pi!7:_ms3gqrrRCkts47/#
+s4IA)rS%8*s4mS/s5*b4rS[_7s5Nt:s5a4ArT=.Cs60FGs6BXMrTsROs6fjSs7$'YrUTsZs7H9_
+rq?BdqtU0drqcKgrVZTlnc"+>h#Dm~>
+JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7Cd3o()>@nF,i6mHj3*lKRQskN:pgj5].Xi8<DI
+h:pZ;f[na*eC;pod*L"^bfe/NaN)9=_ns:+^V7Co]=GJ^[^NQLZE^X;Y-"e*Wi2hnV50l\TqJ$L
+SXZ+;R$a2)Q'7AnOH5E]N/NRMLkg_=KS+o.J:N,tI=-BfH?fI6(3XhBFE;JBEH#i6DJa3*CMITu
+BP;$jrac+@A,]pB@:3JM?X@&Er`fM/>$Co.!a&N*r`0)#<)iiqs&/kor_WVjs%`Mes%NGcr(?r[
+r^cuXq:Yi'r7]bsqk<DOlp9q$!9j9akcjfbl*0nMqF1ABqr%2*rS[(^o#CFCq8E-IrDWYorDi\p
+r`B&#qcWl$s',NdroO:DjQ$3u!TDu9c2,Z_b5fc[bP9<Pb6,o1D/K/frGV[Sq/Q@Rr,_LPo6'_L
+k]Q?9mWIN4pN>qHoQ0_JrH8-`r-/0c!."Nh$[[8KI=6QnIt3'#K)UC&KS>/8LPUeEMi<USNfT9a
+P*2#oQ'Rc(R@9V8SXuIHTq\<XV5C/hWN*##Xfek3Yd1UA['mEP\@K2_]Y(ql^V@S#_SX4/`Poj;
+aN2KFb0.uPbg$.4!mf6?rmCbo!7Unrs4./#rR_)%s4RA)rnIJ.rS@J0s53e5ro*n:rT!q=s5j1@
+s6'FGrTX@Is6KXMs6]jSrU9dUrpfsXs7?9_r:U*`rqH?crqZQiqYU3gr;H0bJcFO*J,~>
+JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7Cd3o()>@nF,i6mHj3*lKRQskN:pgj5].Xi8<DI
+h:pZ;f[na*eC;pod*L"^bfe/NaN)9=_ns:+^V7Co]=GJ^[^NQLZE^X;Y-"e*Wi2hnV50l\TqJ$L
+SXZ+;R$a2)Q'7AnOH5E]N/NRMLkg_=KS+o.J:N,tI=-BfH?fI6(3XhBFE;JBEH#i6DJa3*CMITu
+BP;$jrac+@A,]pB@:3JM?X@&Er`fM/>$Co.!a&N*r`0)#<)iiqs&/kor_WVjs%`Mes%NGcr(?r[
+r^cuXq4IPWgj7t*lp:ZLl_aN5`eF.TqF14Urh]=crh]LUerouqqNCeUrD`_qqH!SsrE/r"rEB5*
+s/l:%rN#jrl'_74nWs<ED/K/frGV[Sq/Q@Rr,_LPo6'_Lk]Q?9mWIN4pN>qHoQ0_JrH8-`r-/0c
+!."Nh$[[8KI=6QnIt3'#K)UC&KS>/8LPUeEMi<USNfT9aP*2#oQ'Rc(R@9V8SXuIHTq\<XV5C/h
+WN*##Xfek3Yd1UA['mEP\@K2_]Y(ql^V@S#_SX4/`Poj;aN2KFb0.uPbg$.4!mf6?rmCbo!7Unr
+s4./#rR_)%s4RA)rnIJ.rS@J0s53e5ro*n:rT!q=s5j1@s6'FGrTX@Is6KXMs6]jSrU9dUrpfsX
+s7?9_r:U*`rqH?crqZQiqYU3gr;H0bJcFO*J,~>
+JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7Cd3o()>@nF,i6mHj3*lKRQskN:pgj5].Xi8<DI
+h:pZ;f[na*eC;pod*L"^bfe/NaN)9=_ns:+^V7Co]=GJ^[^NQLZE^X;Y-"e*Wi2hnV50l\TqJ$L
+SXZ+;R$a2)Q'7AnOH5E]N/NRMLkg_=KS+o.J:N,tI=-BfH?fI6(3XhBFE;JBEH#i6DJa3*CMITu
+BP;$jrac+@A,]pB@:3JM?X@&Er`fM/>$Co.!a&N*r`0)#<)iiqs&/kor_WVjs%`Mes%NGcr(?r[
+r^cuXo2EFnr^?*=!*/tsoi(`e!)r_b`^fbkqF1-VrDWDhbYJ"/rDWYorDi\pr`B&#qcWl$s',G,
+!*f5'kYqO\pf-`]s)%XNrGV[Sq/Q@Rr,_LPo6'_Lk]Q?9mWIN4pN>qHoQ0_JrH8-`r-/0c!."Nh
+$[[8KI=6QnIt3'#K)UC&KS>/8LPUeEMi<USNfT9aP*2#oQ'Rc(R@9V8SXuIHTq\<XV5C/hWN*##
+Xfek3Yd1UA['mEP\@K2_]Y(ql^V@S#_SX4/`Poj;aN2KFb0.uPbg$.4!mf6?rmCbo!7Unrs4./#
+rR_)%s4RA)rnIJ.rS@J0s53e5ro*n:rT!q=s5j1@s6'FGrTX@Is6KXMs6]jSrU9dUrpfsXs7?9_
+r:U*`rqH?crqZQiqYU3gr;H0bJcFO*J,~>
+JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7Cg4o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EJJ
+h;$`<g"4j,eC;spdEg+`bfe/NaN)<>`59C-^V@Ip]=PP_\$i]NZa-g>Y-"e+Wi;qpVPU)`TqS*M
+St):=R@'>,Q'@JqOcYWaNJrdQM26qAKnP)1JUi9#I=6KiH?si9G7A_<FEDSEEH,r9DJj<-rbDjU
+BkV0mAnGUcA7PUJ#@V"J?XI,G?2e(1>?Y50=TV],=8l5%<E)rs;u]_q;>j>k:]F2g:&doe9DhE]
+8cD9[8+bNbUA:MQU?k22l1hOHYi2e\7/B=P7fM?Hi:,Y'i9\GR`qICC`;W^7<;fhn<rQ2!=Sl8#
+>5_\*>lNjmjlGL^ioB%WiS`Ygbj`gLbk]H[b56)UDuFYOEW'qUF7s_MFlml7FmaA=Fm!rAFmaAD
+F7s_TFoHR_GQ2pfH2`-iHN8HmI9qAPIt3'#JqJ]/Knb>;Ll$tGMi<USO,oBbP*;,qQ'[l*R@B\9
+St;RJTq\?YV5L5iWiE,%Xfek3Z*L^C[C3NR\[f;`]Y2%o^VI\&_Sa=2`Q#s>aN;QHbKJ,Rc2Pui
+cd:&<d/qbFe,Iksec45!fDjM'g&0S(g]-(,h>c@3hu)F4iW%p8j8\3?jo"9@kPscEl2U&Kli$2L
+mJlVQn,MnWnbr%XoDeI\p&Fabp\agcq>U6equ$BirUKl<s4mX)~>
+JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7Cg4o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EJJ
+h;$`<g"4j,eC;spdEg+`bfe/NaN)<>`59C-^V@Ip]=PP_\$i]NZa-g>Y-"e+Wi;qpVPU)`TqS*M
+St):=R@'>,Q'@JqOcYWaNJrdQM26qAKnP)1JUi9#I=6KiH?si9G7A_<FEDSEEH,r9DJj<-rbDjU
+BkV0mAnGUcA7PUJ#@V"J?XI,G?2e(1>?Y50=TV],=8l5%<E)rs;u]_q;>j>k:]F2g:&doe9DhE]
+8cD9[7f]4VTDtS`HeWl.H0dimVt-_[L<##C7/B=P7erkYV>R4eV>leWPLkukPQ"M[<;fhn<rQ2!
+=Sl8#>5_\*>l1T-X/`2!WiE%tl'_.1oU#GmrbqaSqJlISr,_RRpN>VAm<.i=m<.T8p3#eFoQ0_J
+rcS3`rHJ9ds*=Tis*F`nrdA+%It*!!JV&N,KS>/8LPUeDMMmFPNK9-^OckomQ'I]'R$jG5S=Z=E
+TqS3VUnsueW2ckuXf\b0Yd(L?['d?N\@K/]]=bhk^V@S#_SX4/`Poj;aN2KFb0.uPbg$.4!mf6?
+rm:eqe'n<Gs4./#rR_)%s4R>(s4dS/r8%D0s53b4s5F";r8[h<s5j1@s6'FGrTX@Is6KXMrpBaR
+rU9dUs7-'Yrq$0^r:U*`rqH?crqZQiqYU3gr;H0bJcFO*J,~>
+JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7Cg4o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EJJ
+h;$`<g"4j,eC;spdEg+`bfe/NaN)<>`59C-^V@Ip]=PP_\$i]NZa-g>Y-"e+Wi;qpVPU)`TqS*M
+St):=R@'>,Q'@JqOcYWaNJrdQM26qAKnP)1JUi9#I=6KiH?si9G7A_<FEDSEEH,r9DJj<-rbDjU
+BkV0mAnGUcA7PUJ#@V"J?XI,G?2e(1>?Y50=TV],=8l5%<E)rs;u]_q;>j>k:]F2g:&doe9DhE]
+8cD9[7fZN];nYU"7-m2><W,nj;u0Jg8B46q7/B=P7fH<`;t3i*:B"2k<;fhn<rQ2!=Sl8#>5_\*
+>lIt$>h`6M;u:J3DuFYOEW'qUF7s_MFlml7FmaA=Fm!rAFmaADF7s_TFoHR_GQ2pfH2`-iHN8Hm
+I9qAPIt3'#JqJ]/Knb>;Ll$tGMi<USO,oBbP*;,qQ'[l*R@B\9St;RJTq\?YV5L5iWiE,%Xfek3
+Z*L^C[C3NR\[f;`]Y2%o^VI\&_Sa=2`Q#s>aN;QHbKJ,Rc2Puicd:&<d/qbFe,Iksec45!fDjM'
+g&0S(g]-(,h>c@3hu)F4iW%p8j8\3?jo"9@kPscEl2U&Kli$2LmJlVQn,MnWnbr%XoDeI\p&Fab
+p\agcq>U6equ$BirUKl<s4mX)~>
+JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7C[0o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EJJ
+h;$`<g"4j,e^W'qdEp1ac-+;PaN2B?`5BI.^q[Ur]Xt_b\$i`PZa-j?YHG"/WiE%rVkp2bU7n6P
+St2C@R[KP0QBd\tP*(fdNf8pTM2@%DL4t;5Jq8H&IXQVYI!^0bG^"@TF`__HEcH)<Df0H0D#S2b
+C2%?pB4baeARo:\@U`bR?sd8I?=!P8#?tA8=]nj/=8l8#<W?%t;Z]io;>j;m:JO[`:&[id9DhE]
+8cD9\8+bN`UA1GTU?b,1l1V@KZ21]cYPCT_7K,dTi;2=2i;2@1huMa&`U_%A`Uq+I<;fhn<rQ2!
+=Sl8#>5hb(>lWpojlGL_j5T+ZiSi_Qrlt;`mE>4Irlb/\rGMUQrc%^RrGqgWpN61QhKJ@1m<%`<
+l?;lDm<&#Bp2p7Us*"<as*4Qhrd"WmI!kpA;gs4HJ:W9'K7ei2L5(J>M2@+JN/`jYO-#NfPE_>u
+Q^F20S"#t?StMdNUSO]_Vl-MoWiW>)YHY79Za7$I[^WcW]">Vf]tV7s_8=(,`5T^8a8X-fai_fM
+bfn>WcHjh`rmCbo!7Unrs4%,#rR_)%s4R>(s4dS/r8%D0s53b4s5Et:rT!n<s5j4As6'FGr9=7H
+s6KXMs6]gRrU9dUs7-$Xs7?9_r:U*`rqH?crqZNhqYU6hr;H-aJcFO*J,~>
+JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7C[0o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EJJ
+h;$`<g"4j,e^W'qdEp1ac-+;PaN2B?`5BI.^q[Ur]Xt_b\$i`PZa-j?YHG"/WiE%rVkp2bU7n6P
+St2C@R[KP0QBd\tP*(fdNf8pTM2@%DL4t;5Jq8H&IXQVYI!^0bG^"@TF`__HEcH)<Df0H0D#S2b
+C2%?pB4baeARo:\@U`bR?sd8I?=!P8#?tA8=]nj/=8l8#<W?%t;Z]io;>j;m:JO[`:&[id9DhE]
+8cD9\8,f1VT)bP^He`r1H0[cdVu!:dLAlnhL?+'a7/B@O7fB.ZV#[CdV>c_VPLYilPPnJZ<Vfbq
+=8c7u=oMV(>Pqb(XT,@!WrK'^RIQ[=Qi1h$DuO_PEW'qUF8'eOFl%<1FmX;<Fm=/DFmX;DF7s_S
+FoQX_GQ2pfH2`*kH[L5?I8bTEJ:N3%JqJ]/Knb>;Ll$tGMi<XUO,oBcP*;,qQC!u,R[]e;St;UK
+TqeEZVPg>kWiE/&Xfnt5Z*UdD[^NZT\[oDc]Y2%o^qmn)_o0O5`lJ)"$d$Q7bKS2TcHab^d/MGm
+dK%bpeGn&!f)=5#f`0Y&gAfq-h#-".hZ)L2i;_d8ir.p:jT"??k5XWEkks]FlMp2Km/QJPmeuVS
+nGi%Vo)J=]o_eC^pAXgaq#:*fqYL*fr;?N_rdk+)s*t~>
+JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7C[0o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EJJ
+h;$`<g"4j,e^W'qdEp1ac-+;PaN2B?`5BI.^q[Ur]Xt_b\$i`PZa-j?YHG"/WiE%rVkp2bU7n6P
+St2C@R[KP0QBd\tP*(fdNf8pTM2@%DL4t;5Jq8H&IXQVYI!^0bG^"@TF`__HEcH)<Df0H0D#S2b
+C2%?pB4baeARo:\@U`bR?sd8I?=!P8#?tA8=]nj/=8l8#<W?%t;Z]io;>j;m:JO[`:&[id9DhE]
+8cD9\8,cK^;nYWc62adV;u'Dd8*3A'8,5RL7K,dA<5_Q1<;fhn<rQ2!=Sl8#>5hb(>lIt$>hE$M
+;uLV5DuO_PEW'qUF8'eOFl%<1FmX;<Fm=/DFmX;DF7s_SFoQX_GQ2pfH2`*kH[L5?I8bTEJ:N3%
+JqJ]/Knb>;Ll$tGMi<XUO,oBcP*;,qQC!u,R[]e;St;UKTqeEZVPg>kWiE/&Xfnt5Z*UdD[^NZT
+\[oDc]Y2%o^qmn)_o0O5`lJ)"$d$Q7bKS2TcHab^d/MGmdK%bpeGn&!f)=5#f`0Y&gAfq-h#-".
+hZ)L2i;_d8ir.p:jT"??k5XWEkks]FlMp2Km/QJPmeuVSnGi%Vo)J=]o_eC^pAXgaq#:*fqYL*f
+r;?N_rdk+)s*t~>
+JcC<$JcGECoD\^erquZjs8)ckrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EMK
+h;$c=g"=p-e^W'rdEp4bc-4ARaN2E@`P]R0^q[Us]Xtbc\@8oSZa6sAYcb+1X/`.tVl$;dUS=HT
+T:VUCS!o_3Q^*i"P*1ofO,]*WMM[1GL5(D8K7\Z)Isufo'RY7RH$FOWG'.nKF)l8?E,TW3D/B2e
+'l%GrBP1phAS#C^@q&nU?sm>K?=$q:>QS,5>5hY*=BGK&s&K(ur_ikr;,R9gs%`VirD!8bs%E8^
+r^m)[!(Z_9c_C0-r1a.blTt++r94.EoW[_fnZ_Mdq*b'JrC-eGp>Gu.qV_D4!64EFlc/h@ou-l0
+rDi\pr`B&#qcWo%r`f8)s'5Zfjo4??irnB#i8ESjc2GlObPKH]bPTE^DZ4SQE;FSREr:"QFS^.R
+G4BeGG4B_BFR"#?G4TkDFS0_JFT-F^G5ZXbGlN'fH4,(II!pElIXcluJV*lR=G2B_L51SAM2R=O
+NK0'\OcklkQ'IZ%R$jD4S=Q7DTV8*TUnsrdW2ZetXKAY/Yd(L?['d?N\@K/]]=bhk^V@S#_SX40
+`Q#s=aN2KGbKJ,Sc-FV\cd;[=!n,QHrm^tus472$s4IA)r7_2*s4mP.s5*e5r8@S5s5Nt:s5a4A
+r9"%Bs60CFs6BXMrTsONs6fjSs7$'Yr:9mZrq-0^rq?BdqtU0drqcKgr;?Kknc"+>g])d~>
+JcC<$JcGECoD\^erquZjs8)ckrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EMK
+h;$c=g"=p-e^W'rdEp4bc-4ARaN2E@`P]R0^q[Us]Xtbc\@8oSZa6sAYcb+1X/`.tVl$;dUS=HT
+T:VUCS!o_3Q^*i"P*1ofO,]*WMM[1GL5(D8K7\Z)Isufo'RY7RH$FOWG'.nKF)l8?E,TW3D/B2e
+'l%GrBP1phAS#C^@q&nU?sm>K?=$q:>QS,5>5hY*=BGK&s&K(ur_ikr;,R9gs%`VirD!8bs%E8^
+r^m)[!(Zs[r1F"^q0V@Pi-G9IlTt*>q53n@re90_n:g[+qF1?PrM9CgrMK:brKR/Bc]\<-rDi\p
+r`B&#qcWo%r`f8)s'>Z+r2]gsri,@S!1NeQm?md;!,hdSrG_UQrc7pXpN67Sp3,tMn94>Em<%W9
+o60_Jm<&#BolU1Urc\6as*4QhrH\iuI!g?jIXZcsJ:W=OK33e\L5(J>M2@.LN/`jYO-,TgPEhE!
+Q^F20S"-%@T:hmPUSO``Vl6SpX/rG+YHY:;Za@-K[^`lY]">Vg^;%Fu_8=(,`Poj;a2l?Db0.uP
+c-=PZcd0u;d/qbFe,Iksec45"fDjM'g&0S(g]-(,h>c@3hu)F3iW%p8j8\3?jo"9@kPscDl2U&K
+li$2LmJlVQn,MnWnbhtXoD\C\p&=[bp\Xabq>U6equ$BirUKl<s4dR(~>
+JcC<$JcGECoD\^erquZjs8)ckrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EMK
+h;$c=g"=p-e^W'rdEp4bc-4ARaN2E@`P]R0^q[Us]Xtbc\@8oSZa6sAYcb+1X/`.tVl$;dUS=HT
+T:VUCS!o_3Q^*i"P*1ofO,]*WMM[1GL5(D8K7\Z)Isufo'RY7RH$FOWG'.nKF)l8?E,TW3D/B2e
+'l%GrBP1phAS#C^@q&nU?sm>K?=$q:>QS,5>5hY*=BGK&s&K(ur_ikr;,R9gs%`VirD!8bs%E8^
+r^m)[!_63hpJ\^nlTtJKpf$od!(ccQh+7$*q*b'JrC6'O`(p>3rDi\pr`B&#qcWo%r`f8)s'5Y1
+>PVP(>6%pX<;TSoDZ4SQE;FSREr:"QFS^.RG4BeGG4B_BFR"#?G4TkDFS0_JFT-F^G5ZXbGlN'f
+H4,(II!pElIXcluJV*lR=G2B_L51SAM2R=ONK0'\OcklkQ'IZ%R$jD4S=Q7DTV8*TUnsrdW2Zet
+XKAY/Yd(L?['d?N\@K/]]=bhk^V@S#_SX40`Q#s=aN2KGbKJ,Sc-FV\cd;[=!n,QHrm^tus472$
+s4IA)r7_2*s4mP.s5*e5r8@S5s5Nt:s5a4Ar9"%Bs60CFs6BXMrTsONs6fjSs7$'Yr:9mZrq-0^
+rq?BdqtU0drqcKgr;?Kknc"+>g])d~>
+JcC<$JcGECo`"derqu]krqcZjrV-Hgp@eLYJ+W@(o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EMK
+h;$c=g"=p-e^W'rdEp4bc-4ARaiMNB`Pf[2_8!b!]Y(hd\[T#U['R'CYck43XK/A#W2HMgUnaWW
+T:VXES"#h5R$O#%PEM&iO,f3YMi*@JLPCP;K7ec,J:E#rI2%'UH?jaZGBS+NFE;JBEH#i6DJa4h
+CDCSuBP;$kAn>Oa@q/tW@:3JM?X@&Er`f\4>$>'3=BJZ(<rZ/"<;f_s;Gg<j;#a>k:Amoe9`@]_
+9)_E]8-.N#pY*HXrM/XDo'-/;rTWjVm]l8cnuqjWqaLEPq;D20rS[S3s2P#Vq8W9Ml,NV>pr!/3
+rDi\pr`B&#qcWo%r`f8)ra#P1rT++Aj5L!q!T2i2c2GlMb5fc\bPoZaDuO_PEW'qVF80kRFnp4@
+GP$(KFmjG8Fo-@OFm=)EF7aSRFoHR^GQ2pfH2`-iHN8HmI0"eHrd\7)JqJ]/Knb>;Ll$tGMi<US
+O,oBbP*2&pQ'Rf)R@B\9St;RJTq\?YV5L5iWiE,%Xfen4Z*L^C[C3QS\[oDc]Y2%o^qmn)_o0O5
+`lH0Aai_fMbfn>WcHjh`rm:eqe'n<Gs4%,#rR_)%s4RA)s4dS/r8%D0rnm\4ro*n:r8[h<roO+@
+roa=FrTX=Hs6KXMrpBaRrU9dUrpfsXrq$0^r:U*`rqH?crqZNhqYU6hqu-'aJcFL)J,~>
+JcC<$JcGECo`"derqu]krqcZjrV-Hgp@eLYJ+W@(o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EMK
+h;$c=g"=p-e^W'rdEp4bc-4ARaiMNB`Pf[2_8!b!]Y(hd\[T#U['R'CYck43XK/A#W2HMgUnaWW
+T:VXES"#h5R$O#%PEM&iO,f3YMi*@JLPCP;K7ec,J:E#rI2%'UH?jaZGBS+NFE;JBEH#i6DJa4h
+CDCSuBP;$kAn>Oa@q/tW@:3JM?X@&Er`f\4>$>'3=BJZ(<rZ/"<;f_s;Gg<j;#a>k:Amoe9`@]_
+9)_E]8-#@\TE(V_T_EfsHK9AMHKmfeVu!:`LAch^L@U&o7/KFN7f9(]V>R4hV>R1jV>QSQPLGZp
+<;fhn<rQ2!=Sl8#>5hb'>lJ%/?N$r+X/c&rnX9?EqO-];rg3Y'rc%^RrGqjXpiQ@Tq0(eBoQKbI
+mr[`8qf_IOl?)iCoQ:(Trc\3`s*4Qhrd+Tk!.=co!IfOtJ6[YWK7ei2L5(J>M2@+JN/WaWO-#Ke
+P*D5sQC+&-S"#q>StD^MU84T]Vl-JnWiN8(Y->.8ZEppG[^WcW]">Vf]tV7s_8=(,`5T^8a2l?D
+b0.uPbg"GYcd0u;d/qbFe,IkseH"2!fDjM'g&9Y)g]-(,h>c@2hu2L4iW%p8j8\3>jo+?@kPscE
+l2KuJli$2LmJlVQn,MnVnbr%XoDeI\p&Fabp\agcq>L0dqu-HirUKl<s4dR(~>
+JcC<$JcGECo`"derqu]krqcZjrV-Hgp@eLYJ+W@(o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EMK
+h;$c=g"=p-e^W'rdEp4bc-4ARaiMNB`Pf[2_8!b!]Y(hd\[T#U['R'CYck43XK/A#W2HMgUnaWW
+T:VXES"#h5R$O#%PEM&iO,f3YMi*@JLPCP;K7ec,J:E#rI2%'UH?jaZGBS+NFE;JBEH#i6DJa4h
+CDCSuBP;$kAn>Oa@q/tW@:3JM?X@&Er`f\4>$>'3=BJZ(<rZ/"<;f_s;Gg<j;#a>k:Amoe9`@]_
+9)_E]8H2Z`;sd$:7fPpU7e&q462adY;tj8i8G,L/8Ff:H7/KFN7ep$]<W,np<<-";:&n8l<Vfbq
+=8c7u=oMV(>Ph\)?2n42>Ph\(>6%pU<;ohrDuO_PEW'qVF80kRFnp4@GP$(KFmjG8Fo-@OFm=)E
+F7aSRFoHR^GQ2pfH2`-iHN8HmI0"eHrd\7)JqJ]/Knb>;Ll$tGMi<USO,oBbP*2&pQ'Rf)R@B\9
+St;RJTq\?YV5L5iWiE,%Xfen4Z*L^C[C3QS\[oDc]Y2%o^qmn)_o0O5`lH0Aai_fMbfn>WcHjh`
+rm:eqe'n<Gs4%,#rR_)%s4RA)s4dS/r8%D0rnm\4ro*n:r8[h<roO+@roa=FrTX=Hs6KXMrpBaR
+rU9dUrpfsXrq$0^r:U*`rqH?crqZNhqYU6hqu-'aJcFL)J,~>
+JcC<$JcGECo`"gfrVZTjrqcZjrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lKRQskN:pgjQ#:Zi8EML
+h;$c=g"=p.e^W*sdF$:ccHOJTaiMQC`Pf[2_8*h"]tCtg\[],W[Bm3FYct=5XfSP&W2HPiUnj`Y
+TV%gHS=>t8R$X,(P`q8mOH5E]N/NRMLkg_>KS+o/JUi6!s*YT/H?sj]GB\4QFEDSEEH,r9DJj<-
+rbE6`BkV0mB4b^dA7K+Y@UWYP?XI,G?2e(0>?_#/s&]8&r`9&!!*&qrs&/kor_WVjs%`Mes%NDb
+r(?u\r^d%Ds4dG)j.bq9n"T&4rTNq=!9j@Fj0AWir3>=eq*b'JqaUMAnDX>cs2FQK!6=]Nr5\`T
+oYggKr`/eqr`B&#qcWo%r`f8)ra#M0"CL<Qjl?@""QA:shr+=Tr63m<s)@jTrGqjXpiQFVq0(M:
+p3,tKmrZs"eo^n6rc\3`s*4Qhrd+Tk!.=cos*dstJ:N3&JqJ]/Knb>;Ll$tGMi<XUO,oBbP*;,q
+QC!u+R[]e;St;UKTqeEZVPg>kWiE/&Xfnt5ZEpmE[^NZU\[oDc]tV7r^qmn*`5T^8a2l?Db5TQg
+bg"GYcd0u;d/qbFe,Ihue^i=NfDjM'g&9Y)g]$",h>Z:2hu)F4iVqj7j8\3?jo"9?kPscEl2KuJ
+li$2LmJlVQn,DhVnbhtXoDeI\p&=[bp\Xabq>U6dqu-HjrUBf;s4dR(~>
+JcC<$JcGECo`"gfrVZTjrqcZjrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lKRQskN:pgjQ#:Zi8EML
+h;$c=g"=p.e^W*sdF$:ccHOJTaiMQC`Pf[2_8*h"]tCtg\[],W[Bm3FYct=5XfSP&W2HPiUnj`Y
+TV%gHS=>t8R$X,(P`q8mOH5E]N/NRMLkg_>KS+o/JUi6!s*YT/H?sj]GB\4QFEDSEEH,r9DJj<-
+rbE6`BkV0mB4b^dA7K+Y@UWYP?XI,G?2e(0>?_#/s&]8&r`9&!!*&qrs&/kor_WVjs%`Mes%NDb
+r(?u\r^d$^q4RA,n9Y%[qg.@Lks>9For%\ao7m6ugkPKUq*b'JqaUL[n>?)InWWR-r0-Q3r`/eq
+r`B&#qcWo%r`f8)ra#M0#[a[6X/`2!WiH#sm[=*DpmLH8s)@jTrGqjXpiQFVq0(M:p3,tKmrZs"
+eo^n6rc\3`s*4Qhrd+Tk!.=cos*dstJ:N3&JqJ]/Knb>;Ll$tGMi<XUO,oBbP*;,qQC!u+R[]e;
+St;UKTqeEZVPg>kWiE/&Xfnt5ZEpmE[^NZU\[oDc]tV7r^qmn*`5T^8a2l?Db5TQgbg"GYcd0u;
+d/qbFe,Ihue^i=NfDjM'g&9Y)g]$",h>Z:2hu)F4iVqj7j8\3?jo"9?kPscEl2KuJli$2LmJlVQ
+n,DhVnbhtXoDeI\p&=[bp\Xabq>U6dqu-HjrUBf;s4dR(~>
+JcC<$JcGECo`"gfrVZTjrqcZjrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lKRQskN:pgjQ#:Zi8EML
+h;$c=g"=p.e^W*sdF$:ccHOJTaiMQC`Pf[2_8*h"]tCtg\[],W[Bm3FYct=5XfSP&W2HPiUnj`Y
+TV%gHS=>t8R$X,(P`q8mOH5E]N/NRMLkg_>KS+o/JUi6!s*YT/H?sj]GB\4QFEDSEEH,r9DJj<-
+rbE6`BkV0mB4b^dA7K+Y@UWYP?XI,G?2e(0>?_#/s&]8&r`9&!!*&qrs&/kor_WVjs%`Mes%NDb
+r(?u\r^crdqc!5XqF:KTp.#!Nl:1J9ks>;Jq,?udqagENgdq*.q*b'JqaUK_n5[G&r`/eqr`B&#
+qcWo%r`f8)ra#M0!FK(0>l._*?-Q@KE;OYRErC(SFSp:WG2%67G4B_DFO>6^FT-F^G5QRaGlN'g
+HN/<lI/\QoIT:lJJ:W<(K7ei2L5(J>M2@+JN/`jYO-#KePE_>uQ^F//S"#t?StMdNUSO]_Vl-Mo
+WiW>)YHY7:Za7$I[^WfX]">Vg^;%Fu_8=+.`Poj;aN2KGrlYMic-FV\cd;[=!n,QHrmV#"f%0iP
+s4IA)rS%;+rnRJ.rnd\4r8@V6ro3k9s5a4Ar9""As60FGrp'OLrTsONs6fjSrp]sXr:9mZs7H6^
+rq?BdqtU0drqcHfrVZTlnG\"=g])d~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYJ+W@(o()>@nF,i6mHj3*lKRQskN:pgjQ#:[i8EML
+h;$c=g=Y$/f$r3udF$=dcHXPUb/hZE`Pod4_SO"%^:_+j\[f2X[^<BIZ*:I8XfSS'WMl_lV50l\
+TqJ$LSXc1<R@'>,Q'@JqOcYWaNJrdQM26qAL4k23Jq/B$IfFg1I!U*aG^"@TF`__HEcH)<Df0H0
+D#S2bC2%?pB4kgfARo:\@U`bR?sd8I?=!P8!F&b,=oVS(=8l5%<E)rs;u]bq;>sDl:]F2g:&doe
+9D_?\8H;<Zh#cBdg]#q,U\1A9U[b)B629[:l/8l*Z2-lb7JfOS8,_B7iVUXla8![Ka8EsRa8<mM
+`;ip7<rQ2!=Sl8#>5hb'>lJ%.?N"43jlHF$s5Et8!9*^tr63p=qJlLTrH%aUr,qjZf6?q3noa;@
+eTKGbrH8*_r-/0c!."Nh!df<Brd=frJ,Xt&JV&N,KS>,7L51SAMMmFPNK0'\OcklkPa.Q$R$jD4
+S=Q7DTV8*TUnsrdW2ZetXKAY/Yd(L?['d?O\@K/^]Y(ql^VI\&_Sa=2`Q#s>aN;TJbKS5VcHjh`
+rm:bpe,IkseH"2!fDjJ'g&9Y)g]$",h>c@2hu)F4iVqj7j8\3>jo"9@kPscDl2U&Jli$2LmJlVQ
+n,DhVnbhtXoD\C[p&Fabp\agbq>U6equ$BirUKl<s4[L'~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYJ+W@(o()>@nF,i6mHj3*lKRQskN:pgjQ#:[i8EML
+h;$c=g=Y$/f$r3udF$=dcHXPUb/hZE`Pod4_SO"%^:_+j\[f2X[^<BIZ*:I8XfSS'WMl_lV50l\
+TqJ$LSXc1<R@'>,Q'@JqOcYWaNJrdQM26qAL4k23Jq/B$IfFg1I!U*aG^"@TF`__HEcH)<Df0H0
+D#S2bC2%?pB4kgfARo:\@U`bR?sd8I?=!P8!F&b,=oVS(=8l5%<E)rs;u]bq;>sDl:]F2g:&doe
+9D_?\8H;<ZU&1M<Hi&-QH0@QkVXgY\L['WoLZ!p`7/B@L7K>sVV=:AZPj">/P4Xt3OoSMY<rQ2!
+=Sl8#>5hb'>lJ%.?N"72X8f3rW;r=ERI6I=EW1"WF80kTFo$:5GP64NFmO5#Fk1[5FoHR^GQ2mf
+H2W$jH[L5?I0"eHrd\4(JqJ]/KnY89LPUeEMi<USNfT6`P*2#nQ'Rc(R@9V8SXuIHTq\<XV5C/h
+WN*##Xfek3Z*L^C[C3QS\[f>b]Y2%o^qmn)_o0O5`lH0Aai_fMbg"GYcd0u;d/h\Erm^tu!7q,#
+s4@>)rS%;+rnRJ.s5*b4r8@V6ro3k9s5a1@r9"%Bs60CFs6BULrTsONs6fjSrp]sXr:9mZrq--]
+s7ZHdr:p6drqcKgr;?Kknc"+>gAc[~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYJ+W@(o()>@nF,i6mHj3*lKRQskN:pgjQ#:[i8EML
+h;$c=g=Y$/f$r3udF$=dcHXPUb/hZE`Pod4_SO"%^:_+j\[f2X[^<BIZ*:I8XfSS'WMl_lV50l\
+TqJ$LSXc1<R@'>,Q'@JqOcYWaNJrdQM26qAL4k23Jq/B$IfFg1I!U*aG^"@TF`__HEcH)<Df0H0
+D#S2bC2%?pB4kgfARo:\@U`bR?sd8I?=!P8!F&b,=oVS(=8l5%<E)rs;u]bq;>sDl:]F2g:&doe
+9D_?\8H;<Z<;TVo7J9488+9">7Hd&;<;KPd<52!#7/B@L7K>sW<:Elf<5hT4<Vfbq=8c7u=oMV(
+>Ph\)?2e1/?i"%->68&8;pJA=EW1"WF80kTFo$:5GP64NFmO5#Fk1[5FoHR^GQ2mfH2W$jH[L5?
+I0"eHrd\4(JqJ]/KnY89LPUeEMi<USNfT6`P*2#nQ'Rc(R@9V8SXuIHTq\<XV5C/hWN*##Xfek3
+Z*L^C[C3QS\[f>b]Y2%o^qmn)_o0O5`lH0Aai_fMbg"GYcd0u;d/h\Erm^tu!7q,#s4@>)rS%;+
+rnRJ.s5*b4r8@V6ro3k9s5a1@r9"%Bs60CFs6BULrTsONs6fjSrp]sXr:9mZrq--]s7ZHdr:p6d
+rqcKgr;?Kknc"+>gAc[~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lK[WtkN:pgjQ#:[iS`VM
+h;-i>g=b*0f%&:!da?FfcHXSVb/q`F`l5m6_SO%&^:h1k]",>[[^EKKZE^X;Y-"e+Wi;qpVPL#_
+TqS-NSt2@?R[BJ/Q'ISsP*(fdNf8pTMM[.EL4t;5K7\W(0n4Y#I=-?eH$FOWG'.nKF)l8?E,TW3
+D/=$(CMIQsBP1siAS#C^@q&nU?sm>K?=$q:>QJ&4r`K;)=',B%!``3!r_rhp!)`\ks%iYirD!;c
+r_*/]r^lqAs4mOIoV1-9oV1M7qrdk?q!#T"qF(0KqaUTUlf%larPmU4oZ$mLqc<\trE/r"r`];*
+qcs,+ra,J/"Qe_)ioC!rs5<Xrr63s>rGhgWrH%dVr,qm[cZf,,oQBD?fQGefrH8*_r-/0cs*=Ti
+s*F`nrdFfq=atsPJUrE*K7nr5L51SAM2I4MN/`jYOHG]hPa.N"R$a;1S"-%@T:hmPUSO``Vl6Sp
+X0&M,YctC=Za@-K\%&u[]=bej^V@S#_Sa=2`Q#s>aN;TJbKS61c2l8<rm:bpe,IkseH"2"fDjM'
+g&9Y)g]-(-h>Z:2hu)F4iVqj7j8\3>jo"9@kPj]Cl2U&Klhp,LmJcPPn,DhVnbhtXoD\C[p&Fab
+p\Xabq>U6dqu-HjrUBf;s4[L'~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lK[WtkN:pgjQ#:[iS`VM
+h;-i>g=b*0f%&:!da?FfcHXSVb/q`F`l5m6_SO%&^:h1k]",>[[^EKKZE^X;Y-"e+Wi;qpVPL#_
+TqS-NSt2@?R[BJ/Q'ISsP*(fdNf8pTMM[.EL4t;5K7\W(0n4Y#I=-?eH$FOWG'.nKF)l8?E,TW3
+D/=$(CMIQsBP1siAS#C^@q&nU?sm>K?=$q:>QJ&4r`K;)=',B%!``3!r_rhp!)`\ks%iYirD!;c
+r_*/]r^m'_rLs7agjAsFkBZ5Vqkiq^pP8$giJ77tqF19Ns$us_s/,[iq54%RplkT<h37i$qc<\t
+rE/r"r`];*qcs,+ra,J/!ir?$q5O=[i0j/'rGhgWrH%dVr,qm[cZf,,oQBD?fQGefrH8*_r-/0c
+s*=Tis*F`nrdFfq=atsPJUrE*K7nr5L51SAM2I4MN/`jYOHG]hPa.N"R$a;1S"-%@T:hmPUSO``
+Vl6SpX0&M,YctC=Za@-K\%&u[]=bej^V@S#_Sa=2`Q#s>aN;TJbKS61c2l8<rm:bpe,IkseH"2"
+fDjM'g&9Y)g]-(-h>Z:2hu)F4iVqj7j8\3>jo"9@kPj]Cl2U&Klhp,LmJcPPn,DhVnbhtXoD\C[
+p&Fabp\Xabq>U6dqu-HjrUBf;s4[L'~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lK[WtkN:pgjQ#:[iS`VM
+h;-i>g=b*0f%&:!da?FfcHXSVb/q`F`l5m6_SO%&^:h1k]",>[[^EKKZE^X;Y-"e+Wi;qpVPL#_
+TqS-NSt2@?R[BJ/Q'ISsP*(fdNf8pTMM[.EL4t;5K7\W(0n4Y#I=-?eH$FOWG'.nKF)l8?E,TW3
+D/=$(CMIQsBP1siAS#C^@q&nU?sm>K?=$q:>QJ&4r`K;)=',B%!``3!r_rhp!)`\ks%iYirD!;c
+r_*/]r^lobs&8eai^`K-o0qh.lr;"rqFUNOqF19Ns$uTZqc(O0qc<\trE/r"r`];*qcs,+ra,J/
+!aK#:qHO#+rDV*CrGhgWrH%dVr,qm[cZf,,oQBD?fQGefrH8*_r-/0cs*=Tis*F`nrdFfq=atsP
+JUrE*K7nr5L51SAM2I4MN/`jYOHG]hPa.N"R$a;1S"-%@T:hmPUSO``Vl6SpX0&M,YctC=Za@-K
+\%&u[]=bej^V@S#_Sa=2`Q#s>aN;TJbKS61c2l8<rm:bpe,IkseH"2"fDjM'g&9Y)g]-(-h>Z:2
+hu)F4iVqj7j8\3>jo"9@kPj]Cl2U&Klhp,LmJcPPn,DhVnbhtXoD\C[p&Fabp\Xabq>U6dqu-Hj
+rUBf;s4[L'~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLY$hX&^o()>@nF,i6mJcI%lg!a!kiV$hjQ#:[iS`VM
+h;-l?g=b-1f%&:!da?IgcHaYWbK7iH`l5p7_SX+'^V.:m]",A\[^NQLZa$a=Y-"h,WiE"qVkp2b
+U7n9QSt;IAS!fY2QBd`!P*1ofO,f0XMi!:HLPCM9K7e`*J:E#rI=-?eH$FOWG'.nK-Za<JEH#i6
+DJa6,CMR[!BP;$kAn>Oa@q/tW@:3JM?X@#D>[1K;>5hY+=BAT'<WZ9#<;ohr;?0Sm;#a>k:Amoe
+9`Ic_9)hH_h>?(.h>3o<U>;U=U?4c=kP=?=l2@sVZMLojZM1^&7/B@L7f>jWir7m:iqhX4iW.s:
+imc$>`r&m:=8l>!=oMV(>Ph\)?2e1-?iFF5j8S';i;hg8iV1Umbi$\EEW1"WF89qVFo-@KGPQLI
+GPH@RFm!l#FkLm8Fo?L]GQ2pfH2W$jH[L5?I0"eHrd\1'JqJ]/KS>/8LPUeDMMmFQNfT6_Ockom
+Q'I]'R$sM6S=Z=ETqS3VUnsueW2cl!Xf\e2Yd1UA[C3NQ\[f;`]Y2%o^qmn)_o0O5a2l?Db0.uP
+bg"GYcd;[=!RfHreGn&!f)F;$f`0Y(gAfq-h#-".hZ)L2i;_d8ir%j9jT"?>k5OQDkks]ElMp2J
+m/QJPmeuVRnGi%Vo)J=\o_eC]pAamaq#:*fqYL*er;?N_rdk+'s*t~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLY$hX&^o()>@nF,i6mJcI%lg!a!kiV$hjQ#:[iS`VM
+h;-l?g=b-1f%&:!da?IgcHaYWbK7iH`l5p7_SX+'^V.:m]",A\[^NQLZa$a=Y-"h,WiE"qVkp2b
+U7n9QSt;IAS!fY2QBd`!P*1ofO,f0XMi!:HLPCM9K7e`*J:E#rI=-?eH$FOWG'.nK-Za<JEH#i6
+DJa6,CMR[!BP;$kAn>Oa@q/tW@:3JM?X@#D>[1K;>5hY+=BAT'<WZ9#<;ohr;?0Sm;#a>k:Amoe
+9`Ic_9)hKZUAgkcI.2LMHKKM861^uNVt>c=LAH]&L?"'d7/B@L7f>jKV>@(dPkUC7P2VW&<rQ2"
+=Sl8#>5hb'>lJ%.?Me+/?im=+W;3FlR,+2(Qi`[qEW1"WF89qVFo-@KGPQLIGPH@RFm!l#FkLm8
+Fo?L]GQ2pfH2W$jH[L5?I0"eHrd\1'JqJ]/KS>/8LPUeDMMmFQNfT6_OckomQ'I]'R$sM6S=Z=E
+TqS3VUnsueW2cl!Xf\e2Yd1UA[C3NQ\[f;`]Y2%o^qmn)_o0O5a2l?Db0.uPbg"GYcd;[=!RfHr
+eGn&!f)F;$f`0Y(gAfq-h#-".hZ)L2i;_d8ir%j9jT"?>k5OQDkks]ElMp2Jm/QJPmeuVRnGi%V
+o)J=\o_eC]pAamaq#:*fqYL*er;?N_rdk+'s*t~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLY$hX&^o()>@nF,i6mJcI%lg!a!kiV$hjQ#:[iS`VM
+h;-l?g=b-1f%&:!da?IgcHaYWbK7iH`l5p7_SX+'^V.:m]",A\[^NQLZa$a=Y-"h,WiE"qVkp2b
+U7n9QSt;IAS!fY2QBd`!P*1ofO,f0XMi!:HLPCM9K7e`*J:E#rI=-?eH$FOWG'.nK-Za<JEH#i6
+DJa6,CMR[!BP;$kAn>Oa@q/tW@:3JM?X@#D>[1K;>5hY+=BAT'<WZ9#<;ohr;?0Sm;#a>k:Amoe
+9`Ic_9)hKZ<;ohk7drq97dEM*61%Xj8Gc!U7/B@L7f>jN<VKJ3:Ae/l=8l>!=oMV(>Ph\)?2e1-
+?iFI.>lS++;q4kIEW1"WF89qVFo-@KGPQLIGPH@RFm!l#FkLm8Fo?L]GQ2pfH2W$jH[L5?I0"eH
+rd\1'JqJ]/KS>/8LPUeDMMmFQNfT6_OckomQ'I]'R$sM6S=Z=ETqS3VUnsueW2cl!Xf\e2Yd1UA
+[C3NQ\[f;`]Y2%o^qmn)_o0O5a2l?Db0.uPbg"GYcd;[=!RfHreGn&!f)F;$f`0Y(gAfq-h#-".
+hZ)L2i;_d8ir%j9jT"?>k5OQDkks]ElMp2Jm/QJPmeuVRnGi%Vo)J=\o_eC]pAamaq#:*fqYL*e
+r;?N_rdk+'s*t~>
+JcC<$JcGHDoD\^erVZTjrqcZjrqQNfs7ZHb$hX&^o()>@nF,i6mJcI$lg!a!ki_*ijQ#:[iS`YN
+h;-l@g=b-1f@AC#e'ZRicHa\YbK@rJa2Z*:_ns7*^V7Co]=PP_\$i]OZa-j?YHG"/X/`.tVl$;d
+US=HTT:VUDS!ob4Q^3o$PEM&iO,o9ZN/NOLLkg_=KS+o.J:N,uI=6HgH?jaZGBS-/F=2-MEH,r9
+DJj<-Chmg$BkV0mB4b^dA7K+Y@UWYP?XI,F?!LW=>?_#/!a&N*r`0)#<)iiqs&&horD<Mis%`Me
+s%NGcqapi[ptkb?ntP!9q4d";rT=%@p?;%Rpp9q+oX"4rq6U(-qaC9LqaUKRrSmk;ro++AioB([
+jSn3=iq1:gaT'<TaSa'YaS<gJ`r/s;=8l>!=oMV'>Pqb*?2e1-?iFI5@0GWMj5T(ti;V^0c1]BA
+bPlP\F8C"VFo6FQGO'M@GPH@SFlRT$FkLm8Fo?L]GQ2pfH2W'hHN8HmIK+b%It3'#JV&N,KS>/8
+LPUeDMMmFPNK0'\OcklkPa.Q$R$jD4S"6.BTV8'SUnjlcW2ZetXKAY/Yd(L?['d?O\@K2_]Y(tn
+^VI\&_o0O5`lH0Aai_fMbg"GYcd;[=!RfHre,n1Of)F8&f\+sVgAfq-h#6(/hZ)L2i;_d8ir%j9
+jT"?=k5XWDkks]ElMp2Jm/QJPmelPRnGi%Vo)A7\o_eC]pAXg`q#:*gqYC$er;6H_rdk+&s*t~>
+JcC<$JcGHDoD\^erVZTjrqcZjrqQNfs7ZHb$hX&^o()>@nF,i6mJcI$lg!a!ki_*ijQ#:[iS`YN
+h;-l@g=b-1f@AC#e'ZRicHa\YbK@rJa2Z*:_ns7*^V7Co]=PP_\$i]OZa-j?YHG"/X/`.tVl$;d
+US=HTT:VUDS!ob4Q^3o$PEM&iO,o9ZN/NOLLkg_=KS+o.J:N,uI=6HgH?jaZGBS-/F=2-MEH,r9
+DJj<-Chmg$BkV0mB4b^dA7K+Y@UWYP?XI,F?!LW=>?_#/!a&N*r`0)#<)iiqs&&horD<Mis%`Me
+s%NGcqapo]USI[[s*aclnpBtSid'ZPmABK1p4h7UqaC9LqaUKRoVMA\qipf<p6,68!0lf5rDro!
+r`K&#r`]8)r*95,ra,J/ra>b7rM]dsql/YErg<DIr0[JOrc7sYqK2XXr-%USlZhf@pic=Qj)j1$
+fl[18rHA*_s*4QhrHeKj!.=cos*e7'J:N3%JqJ]/Knb>;Ll$tGMi<USNfT6`P*2#nQ'Rc(R@9V7
+SXuFGTqS6WUo(&gWN*##Xfek3Z*L^C[C3QS\[oDc]Y;.q^qmn*`5T^8a2l?Db0.uPc-FV\d/MDn
+daS3F!nGlQrmq5(g"H>Xs4dS/rS@M1s53b4s5Et:r8[e;s5j.?s6'CFr9=4Gs6KULs6]gRr9s[T
+s7-$Xrq$0^r:U'_rqH<brqZQiq>:-gqu-'aJcFF'J,~>
+JcC<$JcGHDoD\^erVZTjrqcZjrqQNfs7ZHb$hX&^o()>@nF,i6mJcI$lg!a!ki_*ijQ#:[iS`YN
+h;-l@g=b-1f@AC#e'ZRicHa\YbK@rJa2Z*:_ns7*^V7Co]=PP_\$i]OZa-j?YHG"/X/`.tVl$;d
+US=HTT:VUDS!ob4Q^3o$PEM&iO,o9ZN/NOLLkg_=KS+o.J:N,uI=6HgH?jaZGBS-/F=2-MEH,r9
+DJj<-Chmg$BkV0mB4b^dA7K+Y@UWYP?XI,F?!LW=>?_#/!a&N*r`0)#<)iiqs&&horD<Mis%`Me
+s%NGcqapo]<E8lpgd^9lk!AB6_asbuqaC9LqaUKRqc32dh+drGlV@CZr`B)$qcWo%rEK2)ra#M0
+qd9>1s'b\-s'>@tfMqijrH%gWr,qp\nTX;Dm<A>Kol];:hf[UorH8'^r-/0cs*=Qhs*F`nrdFfq
+?%7BTJUrE*K7nr5L51SAM2I4MN/`jYO-,TgPE_>uQ^F20S"#t?StMdNUSO]_Vl6SpX/rG+YHY:;
+Za@-K\%&u[]=bej^V@S#_Sa=2`Q#s>aN;TJbKS5VcHjl:d/h\ErmV#"f%0iP!nc2ZrS%;+s4mS/
+s5*e5r8@V6ro3k9roF+@qr[qAroj:Erp'OLr9XINrpK^Qs7$'Yr:9jYs7H6^rq??cqtU0drqcHf
+rVZQknc"+>g&HR~>
+JcC<$JcGHDoD\^erVZTjs8)`jrqQNfs7ZHbJ+W@(o()>@nF,i6mHs9,lg!a!ki_*jjlGI]iS`YO
+hVHuAg=k32f@JI$e'cXjcd'eZbK@rJaMu3<_ns:,^V@Lq]Xt_b\@/iR['R'CYck43XK/A#W2HMh
+UnaZXTV%gHS=>t8R$X,(P`q8mOH5E]N/WXNM26n@KnP)1JcC6@IsufoH[:!`G^"@TF`__HEcH)<
+Df0H0D/=!'C2*Z\'k_,iARo:\@U`bR?sd8I?!U]?>?b;1=TV],=8l5%<E)rs;Z]io;>j>k:]F2g
+:&dod9DhEWhY!Z6U>MaDU?+]>jne-8k5a`0[H=jgZhm/f7JfRN7f_TIj8e6:j9=T)jQ#:]qoA]W
+rQ"`TqoJiZr5nrZs2k5\r5\KMs&T,#r`K#"r`];*qcs,+s'GS0ra>_6s'bufq;D>5p<E6Rm)oCO
+r6#(\rc@mWrH8$]o695>ms"SNp3#87icWssrH8'^r-/0crd"Khs*Ocnrd=frJ,Xs!JV*lR=bMK`
+L51SAM2I4MN/`mZOHG]hPa.N"Q^F20S"-%@T:hmPUSO``Vl6SpX/rG+YHY:;Za@-K\%&u[]=bhk
+^V@V%_Sa=2`Q-'@ai_fMbg"GYcd0tcdF-MCe,n1Of)F8&f\+sWgAfq-h#6(/hZ)L2i;_d8ir%j9
+jT"?=k5XWDkks]ElMp2Jm/HDPmelPQnGi%Vo)A7\o_\=]pAXg`q#:*fqYL*er;?N_rdk+&s*t~>
+JcC<$JcGHDoD\^erVZTjs8)`jrqQNfs7ZHbJ+W@(o()>@nF,i6mHs9,lg!a!ki_*jjlGI]iS`YO
+hVHuAg=k32f@JI$e'cXjcd'eZbK@rJaMu3<_ns:,^V@Lq]Xt_b\@/iR['R'CYck43XK/A#W2HMh
+UnaZXTV%gHS=>t8R$X,(P`q8mOH5E]N/WXNM26n@KnP)1JcC6@IsufoH[:!`G^"@TF`__HEcH)<
+Df0H0D/=!'C2*Z\'k_,iARo:\@U`bR?sd8I?!U]?>?b;1=TV],=8l5%<E)rs;Z]io;>j>k:]F2g
+:&dod9DhE\U\pk[I.M^UHKKM762dY\Vt-_TL\?JWL\jL:7JfRN7f]C`V?!IgVZ!CmW;)VPPP:79
+PPCC6PQ+\_=8l=u=oMV(>Ph\)?2n7.?iFI4@K0d<Wi;uoWpH/QR/<<LR.m!KR/E?PErL.UFT$@[
+G4Tq<GjfkPG4p(9FQ.GsFT$@\G5QRaGlE!fHN/?lI/\NpIXh?I!J,k%K3<k]L5(J>M2@+JN/WaW
+O-#KeP*D5sQC!u,R[]h<StD[LU8+N\VPgAlWiN5'Y-5(7ZEppG[^WcW]">Vg^;%G!_SX4/`Pom=
+aN;TJbKS5VcHjh`dF$CkrmV#"f%0iP!nc2Zrn@D,s4mS/s5*e5r8@V6ro3k9roF+@qr[qAroj:E
+rp'OLr9XFMs6fgRrp]sXr:9jYs7H3]s7ZHdqtU0drVHBfr;?KknG\"=g&HR~>
+JcC<$JcGHDoD\^erVZTjs8)`jrqQNfs7ZHbJ+W@(o()>@nF,i6mHs9,lg!a!ki_*jjlGI]iS`YO
+hVHuAg=k32f@JI$e'cXjcd'eZbK@rJaMu3<_ns:,^V@Lq]Xt_b\@/iR['R'CYck43XK/A#W2HMh
+UnaZXTV%gHS=>t8R$X,(P`q8mOH5E]N/WXNM26n@KnP)1JcC6@IsufoH[:!`G^"@TF`__HEcH)<
+Df0H0D/=!'C2*Z\'k_,iARo:\@U`bR?sd8I?!U]?>?b;1=TV],=8l5%<E)rs;Z]io;>j>k:]F2g
+:&dod9DhE\<W#hL7cm/$61.\P<P_3+8c(pQ7JfRN8,H<X<8C=G:[q3[<rQ2"=Sc2">5hb'>lJ%/
+?Me+/@/aU7@ej70?!d/%iD]eUr)<Z:rc@mWrH8$]o695>ms"SNp3#87icWssrH8'^r-/0crd"Kh
+s*Ocnrd=frJ,Xs!JV*lR=bMK`L51SAM2I4MN/`mZOHG]hPa.N"Q^F20S"-%@T:hmPUSO``Vl6Sp
+X/rG+YHY:;Za@-K\%&u[]=bhk^V@V%_Sa=2`Q-'@ai_fMbg"GYcd0tcdF-MCe,n1Of)F8&f\+sW
+gAfq-h#6(/hZ)L2i;_d8ir%j9jT"?=k5XWDkks]ElMp2Jm/HDPmelPQnGi%Vo)A7\o_\=]pAXg`
+q#:*fqYL*er;?N_rdk+&s*t~>
+JcC<$JcGHDoD\^erVZTjs8)`jrV-Hgp@eLY!qc*UrpkO.nF,i6md9B-lg!a!ki_*jjlGI^iS`YO
+hVI#Bg=k64f@JL%e'cXkcd'h\bKJ&LaN)<>`5BI.^q[Us]Xtbc\[T#U['R*EYct=5XfSP&WMcYk
+UnjcZTqJ$LSXc1<R@'>,Q'@JqOcYWaNJrgRM2@%CL4t;5Jq8H&It%EG,("W^H$FOWG'.nKF)l8?
+E,TW3D/F*)CMIQsBP1siAS#C^raGn:@/aL6?=!P8#?tA8=]nj/=8l8#<<-"t;u]bq;>sDl:]F2f
+:&doe9DqK[hYl?WU\U_]UZ=]BjQ5Lrk5OQ*[HFpoZhq'+7/KFM7eoRNjo4?>jT+HAjT4MbrQ"`T
+rQ5#ZqT8WWqT8WUqT&NRrE&u#qcWo%r`f8)ra#M0r*TG2raGb7s5Nn6!93[rn]^UJq8rc^F*%/!
+rH8$]olp"PqK_XVn9=\OpN>85j`TC$qfVm]qfi'brd"Khs*OcnrdAL0It*!!JUrE*K7nr5L51S@
+M2I4MN/`jYO-#KePE_>tQ^F/.S"#q>StD[LU84T]Vl-JnWiN8(Y->.9Za7'J[^WfX]"G\h^;%J"
+_SX71`Q#s>aN;TJbfn>WcHjkbdF-LmeC<%"f)F8&f\+sWgAfn-h#6(/hZ)L2i;_d8ir%j9jT"?=
+k5OQDkkjWElMg,Im/HDPmelPQnGi%Vo)A7[o_eC]pAamaq#1$fqYC$er;6H^rdk+&s*t~>
+JcC<$JcGHDoD\^erVZTjs8)`jrV-Hgp@eLY!qc*UrpkO.nF,i6md9B-lg!a!ki_*jjlGI^iS`YO
+hVI#Bg=k64f@JL%e'cXkcd'h\bKJ&LaN)<>`5BI.^q[Us]Xtbc\[T#U['R*EYct=5XfSP&WMcYk
+UnjcZTqJ$LSXc1<R@'>,Q'@JqOcYWaNJrgRM2@%CL4t;5Jq8H&It%EG,("W^H$FOWG'.nKF)l8?
+E,TW3D/F*)CMIQsBP1siAS#C^raGn:@/aL6?=!P8#?tA8=]nj/=8l8#<<-"t;u]bq;>sDl:]F2f
+:&doe9DqKWU[EO&HhD^\H1?4A5m!m[VYR.eV?!O_LXCkS7/KFM7eoRKVZNfpVu3LnWVht\Q26aB
+PPC=:POFb6PPnS^=Sl8#>5hb'>lJ%.?Mn10@/aU5@fEA'WpZ;MR/WNLR/WNLQi`[sF89qVFo6FU
+GOp(UH1H4LGPQFVFkh*#Fkq0:FoHR]GQ2peH2`-iHiJKmI;+.[It3'#JV&N,KS>/8LPUbCMMmFP
+NK0'\OHG]iPa.N#R$a;2S"-(AT:hmPUnjibVl6VqX0&M,YctF>ZaI6M\%0&\]Y(ql^VI\&_SjF4
+`lH0Aai_fNbg"GYcd:(edaQ[peCE.$rmq5(g"HAYs4[P/rS@M1s53b4s5Et:r8[e;s5j.?roa=F
+qs".Grp0LKrpBaRr9sXSs7-$Xrq$-]r:U'_s7cEcrV?Hhq>:-gqu-$`JcFF'J,~>
+JcC<$JcGHDoD\^erVZTjs8)`jrV-Hgp@eLY!qc*UrpkO.nF,i6md9B-lg!a!ki_*jjlGI^iS`YO
+hVI#Bg=k64f@JL%e'cXkcd'h\bKJ&LaN)<>`5BI.^q[Us]Xtbc\[T#U['R*EYct=5XfSP&WMcYk
+UnjcZTqJ$LSXc1<R@'>,Q'@JqOcYWaNJrgRM2@%CL4t;5Jq8H&It%EG,("W^H$FOWG'.nKF)l8?
+E,TW3D/F*)CMIQsBP1siAS#C^raGn:@/aL6?=!P8#?tA8=]nj/=8l8#<<-"t;u]bq;>sDl:]F2f
+:&doe9DqKW<V]/b7f>j<7eoLG7f>d:5lt%c<;onk;ufq58GkmQ7JfRM8+0FW<TR!P:B4/d:\RTa
+:]*ud=8l>!=oMV(>Ph\)?2e1.?iFI4@Js[4>lJ"/?LUnW<;BGo<-*-VFT$@[G4g(NGku^VGjoqQ
+G5$.7FQIZ$FSg4[G5HL`GlE!fHN/?lI/\P.IXcitJ:W9'K7ei2L5(J>Ll%"IN/WaVO,oBbP*;,q
+Q'[l*R@B\9St;RITq\?YV5L5iWiE,%Xfen4ZEpmF[^NZU\[oGd]tV7s_8=(-`Poj;aN2KGbKS2T
+cHab_dF$Cke'umtf%0iP!nc2Zrn@D,!8RP/s5*e5r8@V6ro3k9roF+@qr[n@s60@Es6BULr9XFM
+s6fgRrp]sXr:9jYrq--]rq?BdqtU-crqcHfrVZQknG\"=g&HR~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpkR/nF,i6md9B-lg!a!ki_*jjlGI^io&bP
+hVI#Cg=k64f@JL%eC2gmd*L"^bfe/NaN2B?`P]R0_8!b!]tCtg\[],W[C!9GZ*:I8Xf\Y(Wi2hn
+VPL#_TqS-NSt2@?R[BJ/Q'IStP*(ieNfB!UMM[1GL5(D8K7\Z)J:E%JI1UaOH?jaZGBS+NFE;JB
+EH#jqDA-l'CMR[!BP;$kAn>Oa@q/tW@:9(A!FB(2>R+J:>$5!1=BGK&s&B%ur_rhps&&bls%iYi
+r([2br_*8`ptte@h4sP:r1i:<ro=%>roO"=roa0elF#c]qm6:-r'^BMqaUBOrT3q=s5sXLkND'l
+kNM.-a8j?YaSO$Vb5TNZb4<[OaSs6[=8l>!=oMV(>Ph\)?2e1.?iFI4@JjU7@fYNciW%p0c0rmO
+bP'*TFSp:[G4p.TGj9SKGk-(SG5$.3FR"#*FSg4ZG5HL`GlE!eH3/G@I/\QoIK4lsJ,t4Qre"O1
+Knb>;Ll$tGMi<USNfT9aP*2#nQ'Rc(R$sM6SXuFGTqS6WUo(&fWN)u"Xf\e2Z*L^C[C3QS\[f>b
+]Y;.q^r!t+`5T^9aN2KGbKJ,ScHab_dF$Cje'umtf%0iP!SH*(g&g$ah#6(/hZ)L3i;_d8ir%j9
+jT"?=k5OQDkkjWDlMp2Im/QJPmelPQnGi%Vo)A7[o_eC]pAXg`q#:*gqYC$dr;?N_rdk+%s*t~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpkR/nF,i6md9B-lg!a!ki_*jjlGI^io&bP
+hVI#Cg=k64f@JL%eC2gmd*L"^bfe/NaN2B?`P]R0_8!b!]tCtg\[],W[C!9GZ*:I8Xf\Y(Wi2hn
+VPL#_TqS-NSt2@?R[BJ/Q'IStP*(ieNfB!UMM[1GL5(D8K7\Z)J:E%JI1UaOH?jaZGBS+NFE;JB
+EH#jqDA-l'CMR[!BP;$kAn>Oa@q/tW@:9(A!FB(2>R+J:>$5!1=BGK&s&B%ur_rhps&&bls%iYi
+r([2br_*8`pnR/&o6]JCj$E[@r20Ikr20LlqhXj!e;!lhqF19Nq+(C]r2BRnqPsCWpltQ;rfZi9
+nWa&Tr`K&#r`];*qcs,+ra,M0ra>_6r*o\9!3,donX8s8!1E8BqK2XXrH@mYpiu(LpNZ7Qq0)LT
+fQ?D$hK8X;rHA'^s*4NgrH\NlI!kpAs*artrdY$#K)UC/KS>/8LPUeDMMmFPNK0']OcklkPa.Q$
+R$a>3S"6.BTV8'SUnjlcVl?\rXKAV.Yd(L?['d?O\@K/^]Y(tn^VI_'_o0O5a2l?Db0.uPc-FV\
+d*^7hdaQ^qe^i=Nf)aOWrRq>-gt_kas5*e5rS[_7ro3k9roF+@qr[n@s60@Erp'OLqs=@MrpK^Q
+rp]sXr:9jYrq--]rq??cqtU0drqcHfr;?KknG\"=f`-I~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpkR/nF,i6md9B-lg!a!ki_*jjlGI^io&bP
+hVI#Cg=k64f@JL%eC2gmd*L"^bfe/NaN2B?`P]R0_8!b!]tCtg\[],W[C!9GZ*:I8Xf\Y(Wi2hn
+VPL#_TqS-NSt2@?R[BJ/Q'IStP*(ieNfB!UMM[1GL5(D8K7\Z)J:E%JI1UaOH?jaZGBS+NFE;JB
+EH#jqDA-l'CMR[!BP;$kAn>Oa@q/tW@:9(A!FB(2>R+J:>$5!1=BGK&s&B%ur_rhps&&bls%iYi
+r([2br_*8`pf75_oLI:u!(Gp6r`/ksqGdSr<E8ofcUdh$r'^BMqaUBOnPoHej\GVImS<^Vs&]2%
+qcWo%r`f8)ra#M0r*TG2raG_6s'u%5rE]G0m8NCOp/Cg0r,qs]p36:Vl?W,KnosnQpN>,1l?1s*
+qfVj\qfi'brd"Hg!df<BrdFfq!.Xuu!J,k%K3j4bL5(J>M2@+JN/WaVO-#KeP*;,qQC!u+R[]e;
+St;UKTqeEZVPg>kWiE/&Xfnt6ZEppG[^WcW\\#Me^;%Fu_SX4/`Pom=aN;TJbKS5VcHjkbdF-Il
+eC<%"f)F8%f\-5W!o)McrS@M1s53e5s5Et:r8[e;s5j.?roa=Fqs"+Fs6KRKs6]gRr9sXSs7-$X
+rq$-]r:U'_rqH<brqZQiq>:*fr;H-aJcFC&J,~>
+JcC<$JcGHDoD\^erquZjs8)`jrV-Hgp@eLYs7?<_rpg*[nG_m*md9B-lg!a!ki_*jjlGI^io/hQ
+hVI#CgY1?5f@SU'eC2jnd*L"_bfe2PaN2EA`Pf[2_8*h#]tD"i\[f5Y[^EKKZE^X;Y-"e+Wi;qp
+Vkp2bU7n9QSt;IAS!o_3Q^*i#P*1rhO,f3YMi*@JLPCP;KS+l-J:N,uI=6MCH4>.EGB\4QFEDSE
+EH,r9rb`3_Chmg$BkV0mB4b^dA7PUJ!F]C8?NFJ=r`f\4>$>'3=BJZ(<rZ/"<;ohr;ZBVn;#a>k
+:Adid9`@Zd9&AG$ht3`.UZ\HQU]3[A62]^Bj8J';jo+?;[d(9t[-Y-qZM[,f7JfRK8,VQJkQgA9
+l07Kul08)dq8iWZqoSBNo?%$TqoJiZr`K#"r`]>+qcs,+ra,J/s'Yh7qdTS8s((rao?HXGr6+fV
+qfMdZrH@mYq0:tGpiuCSq0)OUf6$8"j)k-?rHA$]s*4NgrH\NlI!kpAs*artrd\.&JqAW-KS>/8
+LPL\BM2I4MNK0'\OHG]hPa.N"Q^F20S"-%@T:hmPUSO``Vl6SpX/rG+YHY:;Za@-K\%&u[]=bhk
+^VI\&_Sa@3`lH0Aai_fNc-FV\d/MDsdaQ^qe^`7Mf)aOWrn@D,s4mV0s5*e5rS[\6s5Nt:roF+@
+qr[n@roj:Erp'LKr9XFMrpK^Qrp]sXqssdYrq--]rq??cqtU0drVHBfr;?HjnG\"=f`-I~>
+JcC<$JcGHDoD\^erquZjs8)`jrV-Hgp@eLYs7?<_rpg*[nG_m*md9B-lg!a!ki_*jjlGI^io/hQ
+hVI#CgY1?5f@SU'eC2jnd*L"_bfe2PaN2EA`Pf[2_8*h#]tD"i\[f5Y[^EKKZE^X;Y-"e+Wi;qp
+Vkp2bU7n9QSt;IAS!o_3Q^*i#P*1rhO,f3YMi*@JLPCP;KS+l-J:N,uI=6MCH4>.EGB\4QFEDSE
+EH,r9rb`3_Chmg$BkV0mB4b^dA7PUJ!F]C8?NFJ=r`f\4>$>'3=BJZ(<rZ/"<;ohr;ZBVn;#a>k
+:Adid9`@Zd8tr'VU[W[%HN8BhHgZ4UHiHFn62[SOVYQ&>LXq4X7/KFM7e]FOW;W^mWr9!hQ2?g2
+PPUODQ26aE=Sc2">5qh(>lJ%.?Me+0@/aU3@fKs<AGN7tRG4,+FT$@\G4p.UGiX/FGk6.TG5-43
+FQmr.FS^.YG5?F_GlE!eH3/G@I/\QoIK4lsJ6@GTJqJ]/Knb>;LPUeDMMmFQNfT6_OckllQ'IZ%
+R$jD4S=Q7DTV8*TUnsrdW2ZetXKAY/Yd(L?['d?O\@K2_]Y2%o^qmn)_o9U7a2l?Db0/#RcHab_
+rm:que'umte^j`O!SH*)gAfq-h#?.0hZ)L3i;V^8ir%j9jT"?=k5OQCkks]ElMg,Im/HDOmelPQ
+nGi%Uo)J=\o_eC]pAXg`q#:*fqYL*er;6H^rdk+%s*t~>
+JcC<$JcGHDoD\^erquZjs8)`jrV-Hgp@eLYs7?<_rpg*[nG_m*md9B-lg!a!ki_*jjlGI^io/hQ
+hVI#CgY1?5f@SU'eC2jnd*L"_bfe2PaN2EA`Pf[2_8*h#]tD"i\[f5Y[^EKKZE^X;Y-"e+Wi;qp
+Vkp2bU7n9QSt;IAS!o_3Q^*i#P*1rhO,f3YMi*@JLPCP;KS+l-J:N,uI=6MCH4>.EGB\4QFEDSE
+EH,r9rb`3_Chmg$BkV0mB4b^dA7PUJ!F]C8?NFJ=r`f\4>$>'3=BJZ(<rZ/"<;ohr;ZBVn;#a>k
+:Adid9`@Zd8lSdd<Vf8\8'ja*6KCH1<V0>f8^Bs)7fZ$V7/KFM7e]FE<;fh`:Amo^:B+,W:Amuf
+=Sc2">5qh(>lJ%.?Me+0@/aU3@fKs<AGKNq;tO&\;u:\8Fo?LWGPQLEH2)XUGPQFWFk:a"FlRT?
+Fo?L[GQ2peH2W$jH[L5?IK+`rJ,Xt$JV&K+K7nr5L51P?M2@+JN/`jYO-#KeP*D5sQC!u,R[]h<
+StD[LU8+N\VPgAlWiN5'Y-5(7ZEppG[^WcW]">Vg^;%J"_SX40`Q#s>aN;TJbg"GYcd;[=#1CuM
+eCE+#rmq2'g&B_*g]-(.h>c@3hu2L4iW%p8j8S->jnn3>kPj]Cl2KuIlhp,KmJcPOn,DhVnb_nW
+oD\C[p&=[ap\Xabq>L0dqu$BhrUBf;s4I@%~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_m+md9B-lg!a!ki_*jjlGI^io/hR
+hqm2EgY1B7f@SU(eC2jndEp1ac-4ARaiMQC`Pod4_SO%&^:h1k]",A\[^NTMZa-g>YHG"/X/`.t
+Vl$;dUS=HTT:VXES"#h5R$O#&P`h2lO,o<\N/NRMM2-h?KnP)1JUi9#IXQWks*>-"G^"@TF`__H
+EcH)<DuOVaD/=!'C2%?pB4kgfARo<M@KBnFra,\4?2e(0>?_#/s&]8&r`0)#<)iiqs&/kor_WVj
+s%`Jds%NDbq;:_<m%aKSm\TfVr^,^4r8@V6s5F%=roF"=l*gApqm?=.m'?OWqaLBOpI>3SrTO1D
+qW\+IlM\j)aSEsBb4NgOb5PN?=oMV(>Ph\*?2e1-?iFI5@JaO5A,g'?A`E^J!T;u:iUkCZbl#Z[
+b5HG\Fo?LXGPZR@H22^WGPQFWFjtO!Fm!lBFo6FZGQ2peH2W'hHN8HlI:I_UIt3'#JV&N,KS5&6
+L51SAM2I4MN/`jYO-#KePE_>tQ^F/.S"#q=StD[LU8+N\VPgAlWiN5'Y->.8Za7$I[^WfX]"G\h
+^;%J"_Sa=2`Q$!?ai_fMbg"GYcd:(edaS3F!S,d#f)aOWrn@D,!8RP/s5*e5rS[_7s5Nt:roF+@
+qr[n@roj:Erp'LKqs==Ls6fdQs7$$Xr:9jYrq--]rq??cqtU-crqcHfr;?KknG\"=fDg@~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_m+md9B-lg!a!ki_*jjlGI^io/hR
+hqm2EgY1B7f@SU(eC2jndEp1ac-4ARaiMQC`Pod4_SO%&^:h1k]",A\[^NTMZa-g>YHG"/X/`.t
+Vl$;dUS=HTT:VXES"#h5R$O#&P`h2lO,o<\N/NRMM2-h?KnP)1JUi9#IXQWks*>-"G^"@TF`__H
+EcH)<DuOVaD/=!'C2%?pB4kgfARo<M@KBnFra,\4?2e(0>?_#/s&]8&r`0)#<)iiqs&/kor_WVj
+s%`Jds%NDbq4mM.m<ekZj*Ublj[&g>rhTIgr20"?q1mXXr'^ENqaU<M!(d'fql9Oo!N`@#QLL1>
+PjFV1PkgUD=Sl8#>5hb'>lS+/?Me+/@/j[4@fBm;A-$8Ar2Tn!X/kfZhO+7`rH8'^pNQIYhKepA
+oQU+SpiY).lZMB4q/uUYqKMsard"Hgs*F`nrI&1)It*!!JUrE*K7no3L5(J>M2@+JN/WaVO,oBb
+P*;,qQ'[l*R@B\9SXuIHTq\<XV5C/hWN*##Xfen4Z*UdD[^NZU\[oGd]tV7s_8=+.`Poj<aN;TJ
+bKS5VcHjkbdF-MCe,e+Nrmq2'g&B_*gAp%-h>c@3hu2L5iW%p8j8S->jnn3>kPj]Cl2KuIlhg&J
+mJlVOn,MnVnbhtWoD\C[p&=[ap\Xaaq>U6dqu$BirUBf;s4@:$~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_m+md9B-lg!a!ki_*jjlGI^io/hR
+hqm2EgY1B7f@SU(eC2jndEp1ac-4ARaiMQC`Pod4_SO%&^:h1k]",A\[^NTMZa-g>YHG"/X/`.t
+Vl$;dUS=HTT:VXES"#h5R$O#&P`h2lO,o<\N/NRMM2-h?KnP)1JUi9#IXQWks*>-"G^"@TF`__H
+EcH)<DuOVaD/=!'C2%?pB4kgfARo<M@KBnFra,\4?2e(0>?_#/s&]8&r`0)#<)iiqs&/kor_WVj
+s%`Jds%NDbq,QiQd74+%j[&oHr)EYqq,Z`OhFRQ7r'^ENqaU<M!(d&frD`hsqGmPrrCucVohGE\
+qb?QTr`K&#r`];*qcs/,ra,J/ra>b7qdTP7s'u+@rETG/?2e*l;ta2_;uLh:Fo?LXGPZR@H22^W
+GPQFWFjtO!Fm!lBFo6FZGQ2peH2W'hHN8HlI:I_UIt3'#JV&N,KS5&6L51SAM2I4MN/`jYO-#Ke
+PE_>tQ^F/.S"#q=StD[LU8+N\VPgAlWiN5'Y->.8Za7$I[^WfX]"G\h^;%J"_Sa=2`Q$!?ai_fM
+bg"GYcd:(edaS3F!S,d#f)aOWrn@D,!8RP/s5*e5rS[_7s5Nt:roF+@qr[n@roj:Erp'LKqs==L
+s6fdQs7$$Xr:9jYrq--]rq??cqtU-crqcHfr;?KknG\"=fDg@~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_k[md9B-lg"K6J*?(Xk2kX`io/hR
+hqm2FgY1B7f[n^)eC;sqdEp4bcHOJTb/hZE`l5m6_SX+'^V7@n]=PP_\$i]OZa6p@Yck12XK/A#
+W2HMhUnaZXTV%gHS=?"9R$a2)Q'7AoOcPQ`NJrdQM2@"BL4t;5Jq8H&IsufoH[:!`G^"@TFoQP"
+F)l8?E,TW3D/F*)CMIQsBP1phAS#C^raGn:@/aL6?=!P8!F&b,=TV],=8l5%<E)rs;u]_q;>j>k
+:]F2f:&doe9DRK6V#-qWV!=fUV#3RA62f[?hu;R5iVha9j5[TE[JdK1ZgP-t7/KFM7eT=R8EoC5
+lMKoEb506Cb4WmPaoGQ@=oMV(>Ph\)?2e1.?iFI4@JjU6A,g*<AHLiKi;MU7iq(Fbbl#``bkoT^
+b5ZS_Fo6FXGPZRYH1$"PH2;dXGPZLXFjkHpFn9_KFo-@YGQ)jeH2N!gHN8HlI0+kIJ,Xs!JV*lR
+?%dodL51S@M2@+JN/WaWO-#KeP*;,qQC!u+R[]e:St;RJTq\?YV5L5iWiE,%Xfen4ZEpmF[^N]V
+\\#Me^;%Fu_SX4/`Q#s>aN;TJbg"GYcd:(edaHUoeCE.Lf)aOWrn@D,!8RP/!oDhlrS[_7s5Nt:
+roF+@qr[n@roj:Erp'LKqs==LrpK^Qrp]pWr:9jYrq--]rq??cqY:'crqcHfr;?HjnG\"=fDg@~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_k[md9B-lg"K6J*?(Xk2kX`io/hR
+hqm2FgY1B7f[n^)eC;sqdEp4bcHOJTb/hZE`l5m6_SX+'^V7@n]=PP_\$i]OZa6p@Yck12XK/A#
+W2HMhUnaZXTV%gHS=?"9R$a2)Q'7AoOcPQ`NJrdQM2@"BL4t;5Jq8H&IsufoH[:!`G^"@TFoQP"
+F)l8?E,TW3D/F*)CMIQsBP1phAS#C^raGn:@/aL6?=!P8!F&b,=TV],=8l5%<E)rs;u]_q;>j>k
+:]F2f:&doe9DP@OI-u@\HKTYQ6KUT6UApqbUAUedU]@7ZLt.:\LAaO;7JfRJ7fl5]Wr&jsWr9!s
+XSeCSQ1gI8PPUO>PlOq`=oMV(>Ph\)?2e1.?iFI4@JjU6A,g*<AbiCpRI-@AQhQmIFT-F\G5-:X
+GkZLOHM2X\Gk?4VG5-4/FQR`;FS9kSG5?F^GlN'eHN/<lI/SHpIXckHJ,t4Qre"L0Knb>;LkpnE
+MMmFPNK9-^OcklkPa.Q$R$a>3S"-(AT:qsQUnjibVl6VqX0&M,YctF>ZaI6M\@K/^]Y(tn^VI_'
+_o0O6a2l?Db0/#RcHab_dF$Cje'umtf)F8%f\-8Xs4[P/rS7P3hr"Cjs5F";r8[e;s5j.?roa:E
+r9=4Grp0IJrpB^Qr9sXSrpfpWrq$-]r:U'_rqH9arqZQiq>:*fqu-$`JcF@%J,~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_k[md9B-lg"K6J*?(Xk2kX`io/hR
+hqm2FgY1B7f[n^)eC;sqdEp4bcHOJTb/hZE`l5m6_SX+'^V7@n]=PP_\$i]OZa6p@Yck12XK/A#
+W2HMhUnaZXTV%gHS=?"9R$a2)Q'7AoOcPQ`NJrdQM2@"BL4t;5Jq8H&IsufoH[:!`G^"@TFoQP"
+F)l8?E,TW3D/F*)CMIQsBP1phAS#C^raGn:@/aL6?=!P8!F&b,=TV],=8l5%<E)rs;u]_q;>j>k
+:]F2f:&doe9)qrg<<-(i8*NMB8*WSA6KUT6<VKJk<<-(T8`rYE8,YjQ7JfRJ7fl4]<Vohr<Vfbh
+:&%KD:&.Na=Sl8#>5hb'>lJ%.?Mn10@/aU4@fBm;AGp'@?!LV4>QA'j;ta2b;u^t=Fo6FXGPZRY
+H1$"PH2;dXGPZLXFjkHpFn9_KFo-@YGQ)jeH2N!gHN8HlI0+kIJ,Xs!JV*lR?%dodL51S@M2@+J
+N/WaWO-#KeP*;,qQC!u+R[]e:St;RJTq\?YV5L5iWiE,%Xfen4ZEpmF[^N]V\\#Me^;%Fu_SX4/
+`Q#s>aN;TJbg"GYcd:(edaHUoeCE.Lf)aOWrn@D,!8RP/!oDhlrS[_7s5Nt:roF+@qr[n@roj:E
+rp'LKqs==LrpK^Qrp]pWr:9jYrq--]rq??cqY:'crqcHfr;?HjnG\"=fDg@~>
+JcC<$JcGHDoD\^erquZjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_m*md9B-lg*j#l0.<mk2k[aj5JqS
+hqm2FgtUQ9f[na+e^W'rdF$:ccHXSVb/q`G`l5p8_ns7*^V@Ip]Xt_b\@8oS['R'CYct:4XfSP&
+WMl_lV50l\TqJ$LSXc1<R@'A-Q'IPrP*(fdNfB!UMM[1FL5(D8K7\Z)J:E%JI1UdPH?jaZGBS+N
+FE;JBEH#jqD@UN"CMR[!BP;$jAn>OaA,]pA@:3GL?=$q:>QJ&4r`K;)=',B%!``3!r_rhp!)`\k
+s%iYir([/aqVV1GpSHuIr2'%]rM9LiqEjC3rnIG-s5!V0!8me6iO8TjppBn(pp0idqF1<Op.,*Q
+q<S(GqWe.*qodp?p<!-QqcWr&r`f8)ra#M0qd9A2raG\5s'u%=r+5lcs5Et:o$-gNpW`TZr6#)_
+rH8'^pilU[q0D+Kpj)^\oQU1Uq/su)drkP2q02g_s*=Ngs*F`nrI"`rIt.HJ@Y',_K7ei2Knb>;
+Ll$tGMi<USNfT6_OckllQ'IZ%R$jD4S=Q7CTV8'SUnjlcVl?\rXKAV.Yd(L?['d?O\@K2_]Y2%o
+^qmn)`5T^8a2lBFbKJ,ScHab_dF$CkeC<%"rmqD-g"G*5gY:N_h>c@3hu2L5iW%p9j8S->jnn3>
+kPj]Bl2KuIlhg&JmJlVOn,DhUnbhtWoD\CZp&=[ap\Xabq>L0cqu$BirU9`:s4@:$~>
+JcC<$JcGHDoD\^erquZjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_m*md9B-lg*j#l0.<mk2k[aj5JqS
+hqm2FgtUQ9f[na+e^W'rdF$:ccHXSVb/q`G`l5p8_ns7*^V@Ip]Xt_b\@8oS['R'CYct:4XfSP&
+WMl_lV50l\TqJ$LSXc1<R@'A-Q'IPrP*(fdNfB!UMM[1FL5(D8K7\Z)J:E%JI1UdPH?jaZGBS+N
+FE;JBEH#jqD@UN"CMR[!BP;$jAn>OaA,]pA@:3GL?=$q:>QJ&4r`K;)=',B%!``3!r_rhp!)`\k
+s%iYir([/aqP3q8q0i'dmsG"Zl?i@okX#*=q4[h_!2Jq;eVF)kqF1<Op.,*QrN#murN#jtqj-f<
+mZd[6qNUf@qcWr&r`f8)ra#M0qd9A2raG\5s'u%=r+5])l^@4/rKmDKrH8'^pilU[q0D+Kpj)^\
+oQU1Uq/su)drkP2q02g_s*=Ngs*F`nrI"`rIt.HJ@Y',_K7ei2Knb>;Ll$tGMi<USNfT6_Ockll
+Q'IZ%R$jD4S=Q7CTV8'SUnjlcVl?\rXKAV.Yd(L?['d?O\@K2_]Y2%o^qmn)`5T^8a2lBFbKJ,S
+cHab_dF$CkeC<%"rmqD-g"G*5gY:N_h>c@3hu2L5iW%p9j8S->jnn3>kPj]Bl2KuIlhg&JmJlVO
+n,DhUnbhtWoD\CZp&=[ap\Xabq>L0cqu$BirU9`:s4@:$~>
+JcC<$JcGHDoD\^erquZjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_m*md9B-lg*j#l0.<mk2k[aj5JqS
+hqm2FgtUQ9f[na+e^W'rdF$:ccHXSVb/q`G`l5p8_ns7*^V@Ip]Xt_b\@8oS['R'CYct:4XfSP&
+WMl_lV50l\TqJ$LSXc1<R@'A-Q'IPrP*(fdNfB!UMM[1FL5(D8K7\Z)J:E%JI1UdPH?jaZGBS+N
+FE;JBEH#jqD@UN"CMR[!BP;$jAn>OaA,]pA@:3GL?=$q:>QJ&4r`K;)=',B%!``3!r_rhp!)`\k
+s%iYir([/ar`&hrm76D1s$uEFqEjC3o2P]hg.CL!rC$KNr'pBMr^cugrE&bpoM,-Vj%]>EqcWr&
+r`f8)ra#M0qd9A2raG\5s'u%=r+5k3s',V2?=)Pgp/LofrH8'^pilU[q0D+Kpj)^\oQU1Uq/su)
+drkP2q02g_s*=Ngs*F`nrI"`rIt.HJ@Y',_K7ei2Knb>;Ll$tGMi<USNfT6_OckllQ'IZ%R$jD4
+S=Q7CTV8'SUnjlcVl?\rXKAV.Yd(L?['d?O\@K2_]Y2%o^qmn)`5T^8a2lBFbKJ,ScHab_dF$Ck
+eC<%"rmqD-g"G*5gY:N_h>c@3hu2L5iW%p9j8S->jnn3>kPj]Bl2KuIlhg&JmJlVOn,DhUnbhtW
+oD\CZp&=[ap\Xabq>L0cqu$BirU9`:s4@:$~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?Ebs7?<_rpg9`nF5o8md:#?J*ZCal0.<mk2k[aj5T%U
+i8<AHgtUQ:g"=p-e^W*tdF$=ecHXSVbK@rJa2Z*;_ns:,^q[Us]Xtbc\[])V[C!9GZ*:F7Xf\Y(
+Wi;noVPL#_U7n6PSt2C@R[KP0QBd`!P*1rgO,f3YMi*@ILPCP;KS+l-J:N,uI=6KhH4>.EGB\4Q
+FEDSEEH,r9rb``nChmg$BkV0mAnGUcA7K(X@:<PN?X@&E>[1K;>5hY+=BAT'<WZ9#<;ohr;?0Sm
+;#a>k:Adid9`!Z8V:).>V>*CA62oR:gA'G&gu,X.[JdK3Zi.3.7/KFM7e]FO8GqiIlhJ]ubQ#`]
+bO`mOana*X=oMV(>Ph\)?2e1.?iFI4@JjU6A,g*:AcHBBhuMa7ipk:abkB<Zbl>ifb&qk*G5-:Z
+GklXDHMMj_GkH:XG56:*FOt[3G56@]GlE!dHN/?lI/\QoIK4lsJH(0,JqJ]/KS>/8LPYqd:Pt'h
+N/`jYOHG]hPE_>tQ^F/.R[]h<StD[LU8+N\VPgAlWiN5'Y-5(7ZEppG[^WcW]">Vg^;%J"_Sa=2
+`Q-'@ai_fMc-FV\d*^7he,Ii)e^i@(f\+s3g=tB;rn[V2s53h6s5F";r8[h<s5j.?roa=Fqs"+F
+rTj@IrpB^QqsXRSrpfmVrq$-]qt9s^rqH<brqZNhq>:*fqu-$`JcF=$J,~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?Ebs7?<_rpg9`nF5o8md:#?J*ZCal0.<mk2k[aj5T%U
+i8<AHgtUQ:g"=p-e^W*tdF$=ecHXSVbK@rJa2Z*;_ns:,^q[Us]Xtbc\[])V[C!9GZ*:F7Xf\Y(
+Wi;noVPL#_U7n6PSt2C@R[KP0QBd`!P*1rgO,f3YMi*@ILPCP;KS+l-J:N,uI=6KhH4>.EGB\4Q
+FEDSEEH,r9rb``nChmg$BkV0mAnGUcA7K(X@:<PN?X@&E>[1K;>5hY+=BAT'<WZ9#<;ohr;?0Sm
+;#a>k:Adid9_tORIJJ9gHi8?OHN8Hg6Kpf*T^.EcL]'X<7JfRK8,Z!TXSo3sXSA+LQ0OV0Q2Okb
+>5hb'>lJ%.?Mn10@/aU4@fBm;AG]s<B)8RlRIQ[AQiEESQZ[HLG5-:ZGklXDHMMj_GkH:XG56:*
+FOt[3G56@]GlE!dHN/?lI/\QoIK4lsJH(0,JqJ]/KS>/8LPYqd:Pt'hN/`jYOHG]hPE_>tQ^F/.
+R[]h<StD[LU8+N\VPgAlWiN5'Y-5(7ZEppG[^WcW]">Vg^;%J"_Sa=2`Q-'@ai_fMc-FV\d*^7h
+e,Ii)e^i@(f\+s3g=tB;rn[V2s53h6s5F";r8[h<s5j.?roa=Fqs"+FrTj@IrpB^QqsXRSrpfmV
+rq$-]qt9s^rqH<brqZNhq>:*fqu-$`JcF=$J,~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?Ebs7?<_rpg9`nF5o8md:#?J*ZCal0.<mk2k[aj5T%U
+i8<AHgtUQ:g"=p-e^W*tdF$=ecHXSVbK@rJa2Z*;_ns:,^q[Us]Xtbc\[])V[C!9GZ*:F7Xf\Y(
+Wi;noVPL#_U7n6PSt2C@R[KP0QBd`!P*1rgO,f3YMi*@ILPCP;KS+l-J:N,uI=6KhH4>.EGB\4Q
+FEDSEEH,r9rb``nChmg$BkV0mAnGUcA7K(X@:<PN?X@&E>[1K;>5hY+=BAT'<WZ9#<;ohr;?0Sm
+;#a>k:Adid9`%ch<U**C7f#XD7ef=762=FZ<;TVo<74A88GYjT8GtsR7JfRK8,Z!R=8>nh:%D'E
+:&.Q_=oMV(>Ph\)?2e1.?iFI4@JjU6A,g*:AcHBB>6J2:?=.(=<8^^K<;ohrFo?LYGPl^]H/X)F
+H2;dYGPcRZFj5$[Fo$:WGQ)jdH2N!gHiJKmIK+`rJ,XuuJI-p\K7no3L5(J>reXF.Mi<USNfT9a
+P*2#nQ'I]'R$jD4S=Q7DTV8*TUnsrdW2ZetXKAY/Yd(L?['d?O\@K2_]Y2%o^qmn*`5T^9aN2KG
+bKJ/UcHjkbdF-MCe-jgXf@S[.g"P07gYDeas5*e5ro!h8s5Nt:s5a4Aqr[n@s60@Erp'IJqs==L
+rpK[Ps7$$XqssaXrq-*\rq??cqtU0drVH?er;?HjnG\"=f)L7~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?BaJ+W@(o()>@nF,i6mHs9,lg!a!ki_*jjlGI^io/hR
+hqm2FgtLK8f[na+eC;sqdF$:ccHXSVb/q`Ga2Z*:_ns:+^V@Lr]Xtbc\[T#U[Bm3FZ*:F7XfSS'
+Wi2hnV50o^TqS-NSt2C@R[KP0QBd\uP*1ofO,f0XMi*@IL]<)WKnP)1JUi9#IXQWkH?sj]GB\4Q
+FEDSEEH,r9DJj<.Chmg$BkV0mB)Z?QA7K(X@:<PN?X@#D>[1K;>5hY*=BGK&s&B%urDW_o!)`\k
+s%iYir(R/bqqq%Bs/,[ie"l_)ks>7"rRq&$hR;j[r3ZC.r^?WPqaU<Mr($fZrTs4CnBC:Cqo\`V
+q9&\>r`]>+qcs,+ra,J/s'Yh7r*oY8rabq<ral.Cro*h8nBLIHp<<T]r6,(_pilX\qK^nCq0Dj^
+olp:VqK9u'gi`F9pil[]s*=Ngs*OcnrI+]p!.Xuus+(0%rdt6)L&Qg4LPUeDMMmFPNK0'\OHG]h
+PEhE!Q^F//S"#q>StD[LU8+N\VPgAlWiN5'Y->.8Za7$I[^WfX]"G\h^V@S$_Sa=2`lH0AaihlO
+c-FV\d*^7he'umtf%8O+f\-8X!ScE/h>c=3hu2L5iW%p9j8\3>jo"9?kPscCl2BoHlhg&JmJcPN
+n,DhUnb_nVoD\CZp&=[ap\Xaaq>U6cqu-HirU9`:s474#~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?BaJ+W@(o()>@nF,i6mHs9,lg!a!ki_*jjlGI^io/hR
+hqm2FgtLK8f[na+eC;sqdF$:ccHXSVb/q`Ga2Z*:_ns:+^V@Lr]Xtbc\[T#U[Bm3FZ*:F7XfSS'
+Wi2hnV50o^TqS-NSt2C@R[KP0QBd\uP*1ofO,f0XMi*@IL]<)WKnP)1JUi9#IXQWkH?sj]GB\4Q
+FEDSEEH,r9DJj<.Chmg$BkV0mB)Z?QA7K(X@:<PN?X@#D>[1K;>5hY*=BGK&s&B%urDW_o!)`\k
+s%iYir(R/bqkNe3s*jinnU0ePomHL#ks=j4lA4)Jr^?WPqaU<Mr($fZpoF7m!135Am?R:-q3Cq^
+r`]>+qcs,+ra,J/s'Yh7r*oY8rabq<ral.CqQ&\FoU,E?rc\'\r-8'`h0SmBqfqdXqf_gYbB2N^
+q0)OWrHS?fr-JBis*Xcns*artrdb$"!.t3&!JH1+L0]RjM2@+JN/WaVO,oBbP*2#oQ'Rc(R$sM6
+S=Z=ETV8*TUnsrdW2ZetXKAY0Yd(O@['mEP\[f;a]Y2(p^r!t+`5Ta:aN2KHbKS5VcHjkbdF-Ln
+eCE.%f@\a/rn7D-h#?.0h>lI3i;_d9ir.p;jSn9=k5OQDkkjWClMg,Hm/HDOmecJPnG_tTo)A7[
+o_\=\pAXg`q#1$fqY9sdr;6H]rdk+#s*t~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?BaJ+W@(o()>@nF,i6mHs9,lg!a!ki_*jjlGI^io/hR
+hqm2FgtLK8f[na+eC;sqdF$:ccHXSVb/q`Ga2Z*:_ns:+^V@Lr]Xtbc\[T#U[Bm3FZ*:F7XfSS'
+Wi2hnV50o^TqS-NSt2C@R[KP0QBd\uP*1ofO,f0XMi*@IL]<)WKnP)1JUi9#IXQWkH?sj]GB\4Q
+FEDSEEH,r9DJj<.Chmg$BkV0mB)Z?QA7K(X@:<PN?X@#D>[1K;>5hY*=BGK&s&B%urDW_o!)`\k
+s%iYir(R5d<E8usnjh_0qa^0GpHn+1rD`Ggd7O4+pIG3NqaLBOpIG-P!(lreqH!5_kt^hEq+gol
+r`]>+qcs,+ra,J/s'Yh7r*oY8rabq<ralCJ>[:WA?=.+:<8^^P<;]\oG5-:ZGku^AHMMj`GkH:X
+G5?@)FPM$7G5-:[GlN'eHN/?lI/SKnIK4lsJH(0#K)UB'KSBD[?&+5mM2I4MN/`jYO-#KeP*;/r
+QC!u+R[]e:St;RITq\<XV5C/hWN*##Xfen4Z*UdD[^NZU\[oGd]t_=t_SX4/`Q#s>aN;WKbg"GY
+cd:(edaQ^qe^i@(f\"mVg&]s`rn[V2!8mb5s5F";rT!q=roO(?roa=Fqs"(Erp0IJrpB^QqsXOR
+rpfmVrq$-]qt9s^rqH<brV?Hhq"t$fqu-!_JcF=$J,~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?BaHh?q$o()>@nF,i6md9B-lg!a!ki_*jjlGI^io/hR
+hqm2FgtUQ:f[na+e^W*sdF$=ecHaYWbK@rJa2Z*;`5BI.^q[Xt]Y(kf\[],W[^<BIZE^X;Y-"e+
+WiE"qVkp2bUS4BSSt;LCS!ob4Q^3o$PEM)jO,o<[N%^*HM26qAL4t;5Jq8H&IsufoI!^0bG^"@T
+F`__HEcH)<Df0H0D/=!'C2%?pB4h-S&7f9[@UWYP?XI,F?!LW=>$Co.!E`G&<rZ/"<;fbq;?0Sm
+;#a>j:Amoei;MR&VYd4@V"@">5lfL6fDXA$g&Kd][edE([K*`4[/NJj7JfRK8,PpX8HA/Vm.TcC
+bQ,oUbk'$Tb59<Wb5YWD>5hb'>lJ%.?Mn10@/aU4@fBm;AG]s<B)ZEFB]7t1ro<Lmm*,CPr65/`
+!-\-]r-8'`fm<O@qfqdXqf_gYb&lWcpNH:TrHS<er-JBis*Xcns*artrdb$"!.t3&!JH1+L'<?g
+M2@+Jresg9NfT9aP*2#nQ'IZ&R$jD4S=Q7CTV8'RUnjibVl6VqX0&M-YctF>ZaI6M\@K/^]Y(tn
+^VRe(_o9U7a2lBFbKJ,ScHjkbdF-LneCE.$f@S[.rn7D-h#?.0h>lI3i;_a9ir.p:jT"?>k5OQD
+kkjWDlM^&Gm/HDOmeZDOnG_tTo)A7[o_\=\pAXg_q#:*fqYC$dr;6H^rdk+"s*t~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?BaHh?q$o()>@nF,i6md9B-lg!a!ki_*jjlGI^io/hR
+hqm2FgtUQ:f[na+e^W*sdF$=ecHaYWbK@rJa2Z*;`5BI.^q[Xt]Y(kf\[],W[^<BIZE^X;Y-"e+
+WiE"qVkp2bUS4BSSt;LCS!ob4Q^3o$PEM)jO,o<[N%^*HM26qAL4t;5Jq8H&IsufoI!^0bG^"@T
+F`__HEcH)<Df0H0D/=!'C2%?pB4h-S&7f9[@UWYP?XI,F?!LW=>$Co.!E`G&<rZ/"<;fbq;?0Sm
+;#a>j:AmoeV#@(WIe8'FI.Tbk62RANT]_."L\$?!L]0^=7JfRK8,PpX8boF_XT+XPQL0t7Pkp[F
+=oMV(>Ph\)?2e1.?iFI4@JjU6A,g*:AcHBAB)lWEX8]3ZRJ3*DQN24(GPl^^H.dN@H2DjZGPcR[
+FingcFn^(RGPudcH2N!gHiJKlIK+`rJ,XuuJH1<$K)pXZre:T3Ll$tGMuJZ7NK0']OcklkPa.N"
+R$a;1S"-%@StMdNU84T]Vl-JnWiN8(YHY7:Za7'J[^`lY]=bej^V@V%_Sa@3`lH0Bb0.uPc-FY^
+dF$CkeC<%"f%8O+g&B\+gYDeas5!b5rS[_7!93t;roF+@r9""As60@Erp'IJqs==LrpKXOrp]pW
+qssaXrq-*\rq??cqY:'crVH?er;?HjnG\"=ec1.~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?BaHh?q$o()>@nF,i6md9B-lg!a!ki_*jjlGI^io/hR
+hqm2FgtUQ:f[na+e^W*sdF$=ecHaYWbK@rJa2Z*;`5BI.^q[Xt]Y(kf\[],W[^<BIZE^X;Y-"e+
+WiE"qVkp2bUS4BSSt;LCS!ob4Q^3o$PEM)jO,o<[N%^*HM26qAL4t;5Jq8H&IsufoI!^0bG^"@T
+F`__HEcH)<Df0H0D/=!'C2%?pB4h-S&7f9[@UWYP?XI,F?!LW=>$Co.!E`G&<rZ/"<;fbq;?0Sm
+;#a>j:Amoe<rZ2"<:rfZ8+&kE7JfRP8+]:C6L-r5<;KP=8c)'T8,bpR7JfRK8,PpX8HDppr`K)"
+r)Nf!oM,0Wr(lcVq+^]\s&o>)r`f8)ra#M0r*TG2raG_6raYt=qdoe>rau4Era,V3!+>P#fM_cn
+pilX\qK^b?qg&'`olp:VqK9r&icY!=pNQR\rd"Efs*OcnrI+]p!.Xuus+(0%rdt6)L&Qf1LPUeD
+MMqIm</lp!OHG]hPE_>tQC+&-R[]h<St;UKTq\?YV5L5iWiE,%Xfnt5ZEpmF[^N]V\\#Me^;%G!
+_SX40`Q#s>ai_fMbg"GZd*^7he'umtf%/I)f\-8X!ScE/h>c=3hu2L5i;hm9j8S->jo"9?kPscC
+l2KuHlhg&JmJcPMn,DhUnb_nVoD\CZp&=[ap\O[aq>L0cqu$BhrUBf;s4.."~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV6Ees7ZHb#P@WZo()>@nG_m+md9B-lg!d"l0.<mk2k[aj5T%U
+i8<AHgtUQ:g"=p.e^W*tda?IhcHa\YbKJ&LaN)<>`P]R0_8*h"]tD"i\[f5Z[^EKKZa-g>YHG"/
+X/`.tVl-AeUnXQVTUqaGS=>t8R$X,(P`q8nOH5H_N/W[PM26qAL4t;5Jq8H&+b+rhI=-BfH$FOW
+G'.nKF)l8?E,TW3D/F*)CMIQsBP1rVAI;sX@U`bR?sd8I?2e(6>?Y35=]ed-r`9&!!*&nqs&&ho
+rD<Mir_EGe!SuW3huM[6V=CGYV;%gG6hE_362B+2fDX>%[f*Vk[edE([f!Q57/B@M7eT@N8H)0\
+mJQ>Flho!%c0`aPbO<RR=oMV(>Pqb*?2e1-?iOO5@JjU6A,^$:Ac?<ABDuTEir%g:cLK0;bkZJ\
+Gl)d:HM`!bGkQ@YG5?@(FQ[f>G4p.YGlE!cHN/?lI/SKnIK4lsJH(0#K)UC>KS>,7L51S@M2@+J
+N/WaVO,oBbP*2#nQ'Rc(R$jD4S=Q7DTV8'SUnjlcVl?\rXKAV.Yd(L?['d?O\@K2_]Y2%o^qmn*
+`5T^9aN2KGbKS5VcHjkbdF-LneCE.%f@\d0g=k<:gtgfChV\:i!o`.urT!q=s5j1@roa=Fqs"+F
+rp0FIrpB^QqX=FQrpfmVrq$-]qXsj]rqH9arqZNhq>:*fqu-!_JcF:#J,~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV6Ees7ZHb#P@WZo()>@nG_m+md9B-lg!d"l0.<mk2k[aj5T%U
+i8<AHgtUQ:g"=p.e^W*tda?IhcHa\YbKJ&LaN)<>`P]R0_8*h"]tD"i\[f5Z[^EKKZa-g>YHG"/
+X/`.tVl-AeUnXQVTUqaGS=>t8R$X,(P`q8nOH5H_N/W[PM26qAL4t;5Jq8H&+b+rhI=-BfH$FOW
+G'.nKF)l8?E,TW3D/F*)CMIQsBP1rVAI;sX@U`bR?sd8I?2e(6>?Y35=]ed-r`9&!!*&nqs&&ho
+rD<Mir_EGe!MQ7eU]@1hIHl:XIH,_TIK)\,6L7#;T_5#@M!g&kL]E;0M#Tm>7JoXK8,Z!X8c#L_
+X8nODQKaY7=oMV(>Pqb*?2e1-?iOO5@JjU6A,^$:Ac?<ABDuT@X8n^IRJE6GQhbk'Gl)d:HM`!b
+GkQ@YG5?@(FQ[f>G4p.YGlE!cHN/?lI/SKnIK4lsJH(0#K)UC>KS>,7L51S@M2@+JN/WaVO,oBb
+P*2#nQ'Rc(R$jD4S=Q7DTV8'SUnjlcVl?\rXKAV.Yd(L?['d?O\@K2_]Y2%o^qmn*`5T^9aN2KG
+bKS5VcHjkbdF-LneCE.%f@\d0g=k<:gtgfChV\:i!o`.urT!q=s5j1@roa=Fqs"+Frp0FIrpB^Q
+qX=FQrpfmVrq$-]qXsj]rqH9arqZNhq>:*fqu-!_JcF:#J,~>
+JcC<$JcGHDoD\^erVZTjrqcZjrV6Ees7ZHb#P@WZo()>@nG_m+md9B-lg!d"l0.<mk2k[aj5T%U
+i8<AHgtUQ:g"=p.e^W*tda?IhcHa\YbKJ&LaN)<>`P]R0_8*h"]tD"i\[f5Z[^EKKZa-g>YHG"/
+X/`.tVl-AeUnXQVTUqaGS=>t8R$X,(P`q8nOH5H_N/W[PM26qAL4t;5Jq8H&+b+rhI=-BfH$FOW
+G'.nKF)l8?E,TW3D/F*)CMIQsBP1rVAI;sX@U`bR?sd8I?2e(6>?Y35=]ed-r`9&!!*&nqs&&ho
+rD<Mir_EGe!E2ts<WH/!8+fFM8,GdE7JfRQ8,#LQ6hE_362":V;p@o18Gl!X7/B@M7eT@N8H)3W
+=Sc,!=T(qh:&.QU:\[]Z:&I`d=oMV(>Pqb*?2e1-?iOO5@JjU6A,^$:Ac?<ABDuTB?iOO,<81@I
+GPl^_H.@6<H2Dj[GPcR[FinghFnKqOGPudcH2DpfHiJKlIK+`rJ,XuuJH1<$K5H9qKnb>;LkpnE
+MMmFPNK0'\OHG]hPE_>uQ^F/.R[]h<StD[LTqeEZVPg>kWiE/&Xfnt6ZEppG[^WcW]">Vg^;%J"
+_Sa=2`Q-'@ai_fNc-FV\d*^7he'umtf%8O+g"G*5gYCT?h;7#GrSRb9io9pss5a4Ar9""As60@E
+rp'LKqX"4KrpKXOrp]pWqssaXrq-'[rq??cqY:'crVH?er;?Hjn,@n<ec1.~>
+JcC<$JcGKEoD\[drquZjrqcZjrV6Ee!;?Ba#P@WZo()>@nG_m*md9B-lg!d"l0.<mk2k[aj5T%U
+i8<DIh;$`<g"=p.f%&:"da?Ihcd'h\bKJ&MaN2E@`Pf[2_SO"%^:h1l]",A]\$i]OZa6p@Yck12
+XK/A#W2HMhUnj`YTq@pJSXZ+;R@'>,Q'@JqOcYWbNf8pTMM[.EL5(D8K7\[SJ/EcbI=6KhH?jaZ
+GBS+NFE;JBEH#i6DJa4hCCY)nBP;$jAS#C_@q&nU@/aL6?=!P8!F&b,=oVS(=8l8#<<-"s;Z]io
+;>j>j:]F/o:"n@Wh;7&dV=CGXV;A$H6hNe562&n.fDi;1[K!W6[J%'.[JiSk7JfRK8,Z!V8HA,R
+li68Jli#&rc1B0VbONaS>5qh(>lJ%.?Mn10@/aU4@fBm;AG]s<B)ZH@BE7&ij8@3pc/QqIbPQM]
+Gl)d7HM`!cGkQ@ZG5?@&FR=5BG4g(XGlE!cHN/?kI/SHpIXckHJH(0#K)UE&KNs4cL51P?M2@+J
+N/WaVNfT9aP*2#nQ'IZ%R$jD4S"-(AT:hmPUSO``Vl6SpX/rG+YHY:;Za@-K\%&u[]=bhk^VI\&
+_o0O6a2l?DbKJ,ScHab`dF-LneCE.Lf*9m\g=k<9h#?+1hV\:i!o`.urT!q=s5j4Aroa=Fqs"+F
+rp0FIrpB^QqX=FQrUKdUrq$-]qt9p]rqH9arqZNhq>:*fqu-!_JcF7"J,~>
+JcC<$JcGKEoD\[drquZjrqcZjrV6Ee!;?Ba#P@WZo()>@nG_m*md9B-lg!d"l0.<mk2k[aj5T%U
+i8<DIh;$`<g"=p.f%&:"da?Ihcd'h\bKJ&MaN2E@`Pf[2_SO"%^:h1l]",A]\$i]OZa6p@Yck12
+XK/A#W2HMhUnj`YTq@pJSXZ+;R@'>,Q'@JqOcYWbNf8pTMM[.EL5(D8K7\[SJ/EcbI=6KhH?jaZ
+GBS+NFE;JBEH#i6DJa4hCCY)nBP;$jAS#C_@q&nU@/aL6?=!P8!F&b,=oVS(=8l8#<<-"s;Z]io
+;>j>j:]F/o9qS)OTq\=ZIHl:XIH>kVIJlP+6L@)4T`(SFM!p,hM#Kg>7JfRK8,Z!V8c5XgXT,@!
+XSnF\Q2m31QLU7>>5qh(>lJ%.?Mn10@/aU4@fBm;AG]s<B)ZH@B`"n/Rc0\3R/30HGPl^_H.%$9
+H2Mp\GPlX\Fi\[lFn9eLGPudcH2DpfHiAEkI0+kIJ,XuuJH1<$KE$U0Knb>;LPUeDMMmFPNK0$[
+OHG]hPE_>tQC!u,R[]e:St;RITq\<XV5C/hWN*##Xfek3Z*L^C[C3QS\[oDc]tV7s_8=+.`Q#s>
+aN;WKbg"GYcdC.ge'umtf)F8*f\,!4gY:N_h#ZBirSRb9io9pss5a4ArT=+Bs60@Erp'LKqX"4K
+rpKXOrp]mVqssaXrq-*\rV$6bqY:'crVH?er;?Hjn,@n<eGk%~>
+JcC<$JcGKEoD\[drquZjrqcZjrV6Ee!;?Ba#P@WZo()>@nG_m*md9B-lg!d"l0.<mk2k[aj5T%U
+i8<DIh;$`<g"=p.f%&:"da?Ihcd'h\bKJ&MaN2E@`Pf[2_SO"%^:h1l]",A]\$i]OZa6p@Yck12
+XK/A#W2HMhUnj`YTq@pJSXZ+;R@'>,Q'@JqOcYWbNf8pTMM[.EL5(D8K7\[SJ/EcbI=6KhH?jaZ
+GBS+NFE;JBEH#i6DJa4hCCY)nBP;$jAS#C_@q&nU@/aL6?=!P8!F&b,=oVS(=8l8#<<-"s;Z]io
+;>j>j:]F/i:&\#n;cHad7f>jL8GbpS7dieC7fGpR7f>^I6L@)=<;onp<;fbm8``M18c)'X8,bpR
+7JfRK8,Z!V8buQg=8Z2!9_hEY:@_3V:@_-Y>5qh(>lJ%.?Mn10@/aU4@fBm;AG]s<B)ZH@B`2<<
+@.dLR;u:e:Gl)d7HM`!cGkQ@ZG5?@&FR=5BG4g(XGlE!cHN/?kI/SHpIXckHJH(0#K)UE&KNs4c
+L51P?M2@+JN/WaVNfT9aP*2#nQ'IZ%R$jD4S"-(AT:hmPUSO``Vl6SpX/rG+YHY:;Za@-K\%&u[
+]=bhk^VI\&_o0O6a2l?DbKJ,ScHab`dF-LneCE.Lf*9m\g=k<9h#?+1hV\:i!o`.urT!q=s5j4A
+roa=Fqs"+Frp0FIrpB^QqX=FQrUKdUrq$-]qt9p]rqH9arqZNhq>:*fqu-!_JcF7"J,~>
+JcC<$JcGKEo)AUdrquZjrqcZjrV6Ees7ZHb!qc*Urpg*[nG_kWmd:#?Id?:`l0.<mk2k[aj5T%U
+i8<DIh;$c=g=b-1f@AC#e'cXkd*L"^bfe2PaiMNB`Pod5_SO%&^V7Co]=PP`\@/iR['R'CYct=5
+XfSS'WMl_lV50l\TqS*MSt2@?R[BJ/QBd\uP*(ieO,f0XMi*@ILPCP;KS+l-J:N,us*YT/H?sj]
+GB\4QFEDSEEH,r9DJj<-rbE!YBkV0mAn>Oa@q/tW@:9(A!FB(2>QJ&4r`T8'!*B/#s&B%urDW_o
+!)`Yjs%iYi"k_M]g=tE^V<k)RV;e<J6hE_661WV*[dLQh[/[Q6[.C^*7/KFM7e]FN8Gu*[9(qQM
+li6;Oc2PrMc2,ZVbPB9\>5hb'>lJ%/?Me+/@/j[4@fKs;AGg$<B)ZH@BE;i,rSmn=q9B#ccM5ZD
+bku\_Gl2jOH2r<VHM`!cGkQ@ZG5HF&FRXGFG4^"VGlE!cHN&9kI/SKnIfFosJH(0#K)UE&KE-`*
+L0]RjM2@+IMi<USNfT6_OcklkPa.N#R$a;1S"-%@StD^MU84T]VPgAlWiN5'Y-5(7ZEppH[^WfX
+]"G\h^V@S$_Sa=2`lH0Bb0.uPc-FY^dF$CkeC<%"f@S[.rn7D-h#?+2hV[5ihu_lsir8!<jT"?>
+k5XWDkks]ElMg,Gm/HDNmecJOnG_tSo)A7[o_\=[pAXg_q#1$fqY9scr;6H]rdk+!s*t~>
+JcC<$JcGKEo)AUdrquZjrqcZjrV6Ees7ZHb!qc*Urpg*[nG_kWmd:#?Id?:`l0.<mk2k[aj5T%U
+i8<DIh;$c=g=b-1f@AC#e'cXkd*L"^bfe2PaiMNB`Pod5_SO%&^V7Co]=PP`\@/iR['R'CYct=5
+XfSS'WMl_lV50l\TqS*MSt2@?R[BJ/QBd\uP*(ieO,f0XMi*@ILPCP;KS+l-J:N,us*YT/H?sj]
+GB\4QFEDSEEH,r9DJj<-rbE!YBkV0mAn>Oa@q/tW@:9(A!FB(2>QJ&4r`T8'!*B/#s&B%urDW_o
+!)`Yjs%iYirgj1`TV2:4k'm,Sm<nbYqa:!Bmm6N;pPAHuqM=QpqhY')s$Z`QqaU<Mr(-cX!(usc
+rN$!brg!;Fpm'p+q3:q`r`f8)ra#P1qd9>1s'be6s'u%=r+5k>rb).B!,;A4!3Q'c!L]D=RJN<J
+Qi)(*Gl2jOH2r<VHM`!cGkQ@ZG5HF&FRXGFG4^"VGlE!cHN&9kI/SKnIfFosJH(0#K)UE&KE-`*
+L0]RjM2@+IMi<USNfT6_OcklkPa.N#R$a;1S"-%@StD^MU84T]VPgAlWiN5'Y-5(7ZEppH[^WfX
+]"G\h^V@S$_Sa=2`lH0Bb0.uPc-FY^dF$CkeC<%"f@S[.rn7D-h#?+2hV[5ihu_lsir8!<jT"?>
+k5XWDkks]ElMg,Gm/HDNmecJOnG_tSo)A7[o_\=[pAXg_q#1$fqY9scr;6H]rdk+!s*t~>
+JcC<$JcGKEo)AUdrquZjrqcZjrV6Ees7ZHb!qc*Urpg*[nG_kWmd:#?Id?:`l0.<mk2k[aj5T%U
+i8<DIh;$c=g=b-1f@AC#e'cXkd*L"^bfe2PaiMNB`Pod5_SO%&^V7Co]=PP`\@/iR['R'CYct=5
+XfSS'WMl_lV50l\TqS*MSt2@?R[BJ/QBd\uP*(ieO,f0XMi*@ILPCP;KS+l-J:N,us*YT/H?sj]
+GB\4QFEDSEEH,r9DJj<-rbE!YBkV0mAn>Oa@q/tW@:9(A!FB(2>QJ&4r`T8'!*B/#s&B%urDW_o
+!)`Yjs%iYiqbdJa7Rm8FoLSsOpdY0MoLAXHr'pQNoKr"4o2Pciq+9[=mRd4Fs$Z`QqaU<Mr(-cX
+!D6Jg=8c5$:&[iW:&Ic[:\dcV9`SAr>Ph\)?2n7.?iFI5@JaO6A,^$:Ac?<@BDcECC&VK>?iXX0
+<7t4JGPl^`H0KVTHg,kRH2Mp\GPlX]FiSUnFnBkLGPl^bH2DpeHiJKlIK+crJ,XuuJH1<$KE$T)
+L&Qg4LPUeDMMd=NN/`jYO-#KeP*;,qQ'[l*R@9V8SXuFFTqS3VUnsrdW2ZetXKAY/Yd(L?['mEP
+\[f;a]Y2(p^r!t+`5Ta:aN;TJbKS5Vcd:(edaQ^qe^i@(f\-8X!ScE/h#cHjhu;O8iSrkrj8\3?
+jo"9@kPj]Cl2KuIlh]uImJZJMn,;bTnbVhUoD\CZp&4U`p\O[`q>U6cqu$BhrU9`:s4%(!~>
+JcC<$JcGKEo)AUdrquZjrqcZjrV6Ees7ZHbs7?<_rpkO.nF5o8md9E.m-Es$l0.?ok2tddj5].X
+i8EMLh;-l?g=b-1f@JL%eC2jnd*L"_c-4ASb/hZE`l5p8_ns7*^V@Lr]Xtbc\[])V[C!9GZ*:I9
+Xf\\*Wi;qpVPU)`U7n9QSt;LBS!ob4Q^3o$PEM&iO,o<[N/NRMLkl"b+,,B#Jq8H&IsufoI!^0b
+G^"@TF`__HEcH)<Df0H0D#S2[C2%?pB4b^dA7K+Y@UW[D?NFJ=r`fJ.>5h\)=9)G%<rZ/"<;fbq
+;ZBVm;#a;k:B&oGf`7lHVY[4^VY6kJV#!IN6L[;>eb@Yl[dLQWZiEMj7JoXL8,PpV8cMEYlMp2M
+m/HG2c2>fQbPk`D>lJ%.?Mn10@/aU4@fBm:AGg$=B)ZH@B`;]HC?,9RqTe`Xj37LHr-8-bn9XPM
+n9Y"Xr-7pZr-%s[`cUfpolfqNr-83dqKi0grd=Zms*jutrdb$"!.t3&s+CB+re:H/M#N61MMmFP
+NK0'\OHG]hPE_>tQC!u+R[]e:SXuIHTqS6WUo(&fW2ckuXf\b1Yd(O@[C3NR\[f>b]Y;.q_8=(-
+`Poj<aN;TJbg"GYcd:(ee'umtf)F8)f\,!4gYDea!oDhlrnmk:io9sts5a4ArT=.Croj:Erp'LK
+qX"4KrpKXOrUBgVqXXXWrq-'[rq?<bqY:'crVH<dr;?Hjn,@n<e,Op~>
+JcC<$JcGKEo)AUdrquZjrqcZjrV6Ees7ZHbs7?<_rpkO.nF5o8md9E.m-Es$l0.?ok2tddj5].X
+i8EMLh;-l?g=b-1f@JL%eC2jnd*L"_c-4ASb/hZE`l5p8_ns7*^V@Lr]Xtbc\[])V[C!9GZ*:I9
+Xf\\*Wi;qpVPU)`U7n9QSt;LBS!ob4Q^3o$PEM&iO,o<[N/NRMLkl"b+,,B#Jq8H&IsufoI!^0b
+G^"@TF`__HEcH)<Df0H0D#S2[C2%?pB4b^dA7K+Y@UW[D?NFJ=r`fJ.>5h\)=9)G%<rZ/"<;fbq
+;ZBVm;#a;k:Ag[`IJeQjJ*h^\IJA3_IJnWk6hE_762dGMT_+*=MY`2!M"lc%M#3#/7/B@M7e]FN
+8Gu-[9)YgiWr/psXRqhKQ/n81>Pqb*?2e1.?iFI4@JjU6A,^$:AcHBABDcHBB`VtMrN5pbigKY1
+r0RD,r-8-bn9XPMn9Y"Xr-7pZr-%s[`cUfpolfqNr-83dqKi0grd=Zms*jutrdb$"!.t3&s+CB+
+re:H/M#N61MMmFPNK0'\OHG]hPE_>tQC!u+R[]e:SXuIHTqS6WUo(&fW2ckuXf\b1Yd(O@[C3NR
+\[f>b]Y;.q_8=(-`Poj<aN;TJbg"GYcd:(ee'umtf)F8)f\,!4gYDea!oDhlrnmk:io9sts5a4A
+rT=.Croj:Erp'LKqX"4KrpKXOrUBgVqXXXWrq-'[rq?<bqY:'crVH<dr;?Hjn,@n<e,Op~>
+JcC<$JcGKEo)AUdrquZjrqcZjrV6Ees7ZHbs7?<_rpkO.nF5o8md9E.m-Es$l0.?ok2tddj5].X
+i8EMLh;-l?g=b-1f@JL%eC2jnd*L"_c-4ASb/hZE`l5p8_ns7*^V@Lr]Xtbc\[])V[C!9GZ*:I9
+Xf\\*Wi;qpVPU)`U7n9QSt;LBS!ob4Q^3o$PEM&iO,o<[N/NRMLkl"b+,,B#Jq8H&IsufoI!^0b
+G^"@TF`__HEcH)<Df0H0D#S2[C2%?pB4b^dA7K+Y@UW[D?NFJ=r`fJ.>5h\)=9)G%<rZ/"<;fbq
+;ZBVm;#a;k:Adui7JoXC8,GaU8,Gd;8,>UF6L[;4<VK)H8F9"G8,u'S7JoXL8,PpV8cMEU<ruK*
+=6E<T:B"&c:@V'X>Pqb*?2e1.?iFI4@JjU6A,^$:AcHBABDcHBBa/<Z?smDP<VobH;uV"=Gl2jV
+HLH4MHMi'dGkQ@ZG5HF%FRsYJG4TqUGlE!bHN/?kI/SKnIfFosJH(0#K)UE&KE-`*L&m'creXU3
+Mi<USNfT6_OcklkPa.N"Q^F//S"#q=StD[LTqeEZVPg>jWiE,%Xfen4Z*UdE[^N]V\\#Me^;%G!
+_SX71`Q$!?ai_fNc-FV\d*^7ieC<%"rmq>+g"P07h#?+2hV[5ihu_lsir8!<jT"??k5XWDkks]E
+lMg,Gm/HDOmeZDNnG_tSo)A7[o_S7[pAOa^q#:*fqY9scr;6H]rdk*us*t~>
+JcC<$JcGKEo)AUdrVZTjrqcZjrV6Ees7ZHbs7?<_rpgHenF5o8mdBK/m-Es9l$_dYk2tddj5].X
+i8EMLh;-l@g=k64f@SR&eC2jndEp4bcHXPUb/q`Ga2Z*;_ns:,^q[Xu]Y(kf\[f2X[^EKKZE^X<
+Y-"h-WiE%sVl$;dUS=HUT:VXFS"#k6R$X,(P`q8mOH5H_N/W[PM26qAL4t;5Jq8H&Isufo+aeW_
+H$FOWG'.nKF)l8?E,TW3D/=!'C2.HrBP1pgARo<M@KBnFra,\4?2e(0>?_#/s&]8&r`9&!!*&nq
+s&/korD<Mi!SQ-)g&7f@Vt?kNV=gVa7/94B6LdA=eG[qrec<2U[dLQZZiEMj7JoXL8,PpV8c;6]
+lMTrJm/68Nmbc:ebjN[S>Pqb*?2e1.?iFI4@JjU6A,g*:AcHBABDcHBC&_rJjSn3<cLK0>bl;nc
+Gl)dWHKokJHM`!cGkZF[G5HFIFT-@?FS0eMG4KkTGl;paHN/?kI/SKnIfForJH(0#K)UE&KE-`*
+L&m'creXd8Mi<USNK0'\OHG]hPE_>tQ^F/.R[]e;St;RITq\<XV5C/hWN)u"Xf\e2Yd1UB[C3QS
+\[oDc]tV7s_8=+.`Pom=aN;WKbg"GYd*^7he'umtf%8O+g&B\0gYCW@hVR/hhu_lsir8!<jT"??
+k5XWEkkjWElMg,Gm/HDOmeQ>NnGVnSo)81Zo_S7[pAOa^q#1$eqYC$dr;6H\rdk*us*t~>
+JcC<$JcGKEo)AUdrVZTjrqcZjrV6Ees7ZHbs7?<_rpgHenF5o8mdBK/m-Es9l$_dYk2tddj5].X
+i8EMLh;-l@g=k64f@SR&eC2jndEp4bcHXPUb/q`Ga2Z*;_ns:,^q[Xu]Y(kf\[f2X[^EKKZE^X<
+Y-"h-WiE%sVl$;dUS=HUT:VXFS"#k6R$X,(P`q8mOH5H_N/W[PM26qAL4t;5Jq8H&Isufo+aeW_
+H$FOWG'.nKF)l8?E,TW3D/=!'C2.HrBP1pgARo<M@KBnFra,\4?2e(0>?_#/s&]8&r`9&!!*&nq
+s&/korD<Mi!M>t_TDa63J*qdGI/l\26hE_862mJPTDbGSM>N2,M<B]hM#]s?7JoXL8,PpV8c;9X
+WrB(!XT,EuQi!*9Q0FV7>Pqb*?2e1.?iFI4@JjU6A,g*:AcHBABDcHBC&_rGXo4^FRJ<0LQiD:.
+Gl)dWHKokJHM`!cGkZF[G5HFIFT-@?FS0eMG4KkTGl;paHN/?kI/SKnIfForJH(0#K)UE&KE-`*
+L&m'creXd8Mi<USNK0'\OHG]hPE_>tQ^F/.R[]e;St;RITq\<XV5C/hWN)u"Xf\e2Yd1UB[C3QS
+\[oDc]tV7s_8=+.`Pom=aN;WKbg"GYd*^7he'umtf%8O+g&B\0gYCW@hVR/hhu_lsir8!<jT"??
+k5XWEkkjWElMg,Gm/HDOmeQ>NnGVnSo)81Zo_S7[pAOa^q#1$eqYC$dr;6H\rdk*us*t~>
+JcC<$JcGKEo)AUdrVZTjrqcZjrV6Ees7ZHbs7?<_rpgHenF5o8mdBK/m-Es9l$_dYk2tddj5].X
+i8EMLh;-l@g=k64f@SR&eC2jndEp4bcHXPUb/q`Ga2Z*;_ns:,^q[Xu]Y(kf\[f2X[^EKKZE^X<
+Y-"h-WiE%sVl$;dUS=HUT:VXFS"#k6R$X,(P`q8mOH5H_N/W[PM26qAL4t;5Jq8H&Isufo+aeW_
+H$FOWG'.nKF)l8?E,TW3D/=!'C2.HrBP1pgARo<M@KBnFra,\4?2e(0>?_#/s&]8&r`9&!!*&nq
+s&/korD<Mi!)rhorC6HMmmc;,!(?WMoKr(6o2Pc_p.=@:mRd@J!(?ZPr'pENr(-cXrCZofr)iu#
+q+g*Ip.k6Ss',D+ra#M0r*TG2raG_6raYt=qdoe>rb).Brb;CIs'Yk8!+Pn,r)D<Is*+Edqg%aY
+l?i)Jqg&*apNQOYqfV1Grc@%?ol]tOnot"VrH\6cs*O`mrI+]ps*suts+(0%re(6(!/:E,!JcL1
+M-5^oN/WaUNfT6_OcklkPa.N#R$a;1S"#t?StD[LU8+N\VPgAlWiE/&Xfnt5ZEppG[^WcW]">Vg
+^;%J"_Sa=2`Q-'@aihlOc-FV]dF$CkeC<%"f@S[.rn7S2gtgfChV\=j!o`.uro=%>s5j4As6'FG
+qs".Grp0FIrpB^Qq="=PrUKdUrU^$\qXsj]rV-0`rV?Egq>:*fqu,s^JcF4!J,~>
+JcC<$JcGKEo)AUdrVZTjrqcZjrV6Ees7ZHbs7?<_rpp*Z!:^!VI.$Cgm-F!&l07Epk2tddj5].Y
+iS`YOh;-l@g=k64f@SU(eC;sqdF$=dcHXSVbK@rJaN)<>`5BI/_8*h#]tD"i]",>[[^NTNZa-j?
+Ycb+1XK&;"W2HMhUnaZXTq@pJS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5$q,KS+l-J:N,uI=6Ki
+H?jaZGBS+NFE;JBEH#i6DJa3*CMIS_BE`$\AS#C^raH(??sd8I?=!P8!F&b,=TV],=8l8#<<-"s
+;u]bq;>j;k:]8uBVY-k[VWalOU]<gX6hNe862]72ec")!\,*Pr[H4aq7/KFM7efLO8Gu-X9)\)U
+m/HDOmf2b3c1oNUbPtfE>lJ%.?Mn10@/j[4@fKs;AGg$<B)ZH@B`DfGCB&)JirIBlc/d+HGl2jY
+HKKSFHMi'dGkZF[G5QLMFS9e;FSBqPG4BeSGl;paHN&9kI/JEmIfForJH(0#K)UE&KE-`*L1?!p
+Ll$tGMi3OQNK0'\OHG]hPE_>tQC!u+R@9V8SXuFGTqS3UUnsrdW2ZetXKAY/Yd(L?['d?O\@K2_
+]Y2%o^qmn*`5Ta:aN2NIbKS5Vcd:(edaQ^qe^i@(f\,!4gYDea!T)`5hu_lsir8!<jT"?@k5OQD
+kks]FlMg,Hm/?>NmeZDNnGVnRo)A7Zo_S7[pAOa^q#1$eqY9scr;6H]rdk*ts*t~>
+JcC<$JcGKEo)AUdrVZTjrqcZjrV6Ees7ZHbs7?<_rpp*Z!:^!VI.$Cgm-F!&l07Epk2tddj5].Y
+iS`YOh;-l@g=k64f@SU(eC;sqdF$=dcHXSVbK@rJaN)<>`5BI/_8*h#]tD"i]",>[[^NTNZa-j?
+Ycb+1XK&;"W2HMhUnaZXTq@pJS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5$q,KS+l-J:N,uI=6Ki
+H?jaZGBS+NFE;JBEH#i6DJa3*CMIS_BE`$\AS#C^raH(??sd8I?=!P8!F&b,=TV],=8l8#<<-"s
+;u]bq;>j;k:]6p]IeA3ZIcYtX7/0.B6L[;9TDbGRM>N2%M=-2pM#]s@7JfRL8,PpV8c23ZWr8t%
+XKAV-Y-7VeqNgN6m$@ZUr*95,ra,M0ra>b7qdTS8rabq<rau.Br+Q+ErbDIKs/c@*Xd[t3pR(l'
+r-@m[k'QZFr-A3bpNQOYr,qCKp2f>;pN?4RnTXnUrH\6crd4Zmr-eTos*suts+(0%re(6(!/:E,
+@u#krM2@+JMi<USNfT6_OcklkPa.N"Q^F/.R[]h<St;UKTq\<XV5C/hWN*##Xfek3Z*L^C[C3QS
+\[oDc]tV7s_8=+.`Q#s>aND]Lbg"GZd*^7he'umtf%8O+g"P07h#?+1hV\=j!o`.uro=%>s5j7B
+roa=Fr9=7Hrp0IJrU'UPqX=CPrUKaTrq$*\qXsj]rV-0`rV?Egq"t!equ-!_JcF0uJ,~>
+JcC<$JcGKEo)AUdrVZTjrqcZjrV6Ees7ZHbs7?<_rpp*Z!:^!VI.$Cgm-F!&l07Epk2tddj5].Y
+iS`YOh;-l@g=k64f@SU(eC;sqdF$=dcHXSVbK@rJaN)<>`5BI/_8*h#]tD"i]",>[[^NTNZa-j?
+Ycb+1XK&;"W2HMhUnaZXTq@pJS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5$q,KS+l-J:N,uI=6Ki
+H?jaZGBS+NFE;JBEH#i6DJa3*CMIS_BE`$\AS#C^raH(??sd8I?=!P8!F&b,=TV],=8l8#<<-"s
+;u]bq;>j;k:]45f7eK:?7cd,?7/0.B6L[;5<W>\b8``M18cM<]7/KFM7efLO8Gu-X9)2Ng=Su7j
+:@1dO:@q9\>Pqb*?2e1.?iFI5@JaO6A,^$:Ac?<@BDcHCC&VlIC]7`C@TE)#h,=;Qr-8-bo6TPG
+np:4Zr-7s[r-&!\m<&&Cj`L6>pNH(Nr-80cqKi-fs*X`ms*jutrIFp!!.t3&s+CB+re=p<LkpnE
+MMmCON/`jYO-#KeP*;,qQ'Rc(R$jD4S=Q7CTV8'RUSO``Vl6SpX/rG+YHY:;Za@-K\%&u[]=bhk
+^VI\&_o0O6a2l?EbKJ,ScHjkbdF-LneCE.%f@\d1g=tE^h#ZBirnmk:io9sts5a4AroX4Cs60CF
+s6BULqs=:KrpKXOrUBdUqXXXWrUfsZrq?<bqY:$brVH<dr;?Hjn,@n<df4g~>
+JcC<$JcGKEo)AUdrVZQis8)ckr:g?fp@eIX!qc*Urpg*[nG_kWmd:#?J*ZCal0.<nk2tddj5].X
+i8EMLh;-l@g=k64f@SU(eC2jndEp4bcHXSVbK@rJa2Z*;`5BI/_8*h"]tD"i]",>[[^NTMZa-j?
+YHG"0XK&;"W2HMhUnaZXTV%gIS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5(D8K7\Z)J/j&fI=6Kh
+H?jaZGBS+NFE;JBEH#i6DJa3*CMIS_BE`$\AS#C^raH7D?sd8I?<pf@>?b;1=TV],=8l8#<W?%t
+;u]bq;>j>jfDsY!VY-k\VWXfRV#<^W6hE_962f=.ea^-2[e@-(ZiEMk7JoXL8,PpV8c23\m/HDP
+mf2bUn,i.No'aj#cLfBSbk]E^>Pqb*?2e1.?iFI5@JaO6A,^$:Ac?<@BDcHCC&VlHC]*5fblH&_
+c/m1JGl2jYHK9GEHMi'dGkcL\G5HFOFRO;9FSBqQG4KkTGl2j`HN&9jI/JEmIfForJ-(:RK)UE&
+KE-`*L'rcmLl$tGMMmFPNK4"!?]^D5P*;,qQ'Rf)R@9V7S=Q7DTV8'SUnjibVl6VqX0&M,YctC=
+Za@0L\%0&\]Y(qm^VI_'_o0O6a2lBFbKJ/UcHjkbdaQ^qe^i@(f\,!4gYCT?h;7&Hi8ESQir8!<
+j8e<?k5XWEkks]FlMg,Hm/HDNmeZDNnG_tRo)A7Zo_S7ZpAXg^q#1$eqY9scr;6H]rdk*ss*t~>
+JcC<$JcGKEo)AUdrVZQis8)ckr:g?fp@eIX!qc*Urpg*[nG_kWmd:#?J*ZCal0.<nk2tddj5].X
+i8EMLh;-l@g=k64f@SU(eC2jndEp4bcHXSVbK@rJa2Z*;`5BI/_8*h"]tD"i]",>[[^NTMZa-j?
+YHG"0XK&;"W2HMhUnaZXTV%gIS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5(D8K7\Z)J/j&fI=6Kh
+H?jaZGBS+NFE;JBEH#i6DJa3*CMIS_BE`$\AS#C^raH7D?sd8I?<pf@>?b;1=TV],=8l8#<W?%t
+;u]bq;>j>jT)bPXIeA3ZId):Z7/94B6LmG;TDbGPM>N1`M#]s@7JoXL8,PpV8c23\X8]4#Xo5F&
+Y5kg+R/30@QLL10Q2k.e>lJ%.?Mn10@/j[4@fKs;AGg$<B)ZH@B`DfGCAr#HXn\:aRcBh2R/M:-
+H1Q@CHh2R]H2Mp^GPlX]FmsMAF6[lAFng.NGPl^`H2;jdHiAEjIK+crJ,Om!JV&LQKE$T)L&Qf7
+LPUbCM2I1KN/WaVrf:EJOcklkPa.N"R$a;1S"#q=StD[LTqeEZV5L5iWiE,%Xfen4Z*UdD[^NZU
+\[oGd]t_=t_SX4/`Q#s>ai_fMc-FV\d*^:jeC<%"f@S[.g=k<:gtgfChr!AMiSieqj8\0?jo+?A
+kPscDl2U&Jlhg&JmJZJLn,;bTnbMbToDS=Xp&4U`p\FU_q>L0bqu$BhrU9`:s3^js~>
+JcC<$JcGKEo)AUdrVZQis8)ckr:g?fp@eIX!qc*Urpg*[nG_kWmd:#?J*ZCal0.<nk2tddj5].X
+i8EMLh;-l@g=k64f@SU(eC2jndEp4bcHXSVbK@rJa2Z*;`5BI/_8*h"]tD"i]",>[[^NTMZa-j?
+YHG"0XK&;"W2HMhUnaZXTV%gIS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5(D8K7\Z)J/j&fI=6Kh
+H?jaZGBS+NFE;JBEH#i6DJa3*CMIS_BE`$\AS#C^raH7D?sd8I?<pf@>?b;1=TV],=8l8#<W?%t
+;u]bq;>j>j;ZKej7eK:B7cm5>7/94B6LmG7<W,P`8aK"88btsX7/KFN7e]FN8Gu-X9))Nd=6WK<
+9`SDq>lJ%.?Mn10@/j[4@fKs;AGg$<B)ZH@B`DfGCAr#J@K0g3;ufqr<9$pU<;h(>H1Q@CHh2R]
+H2Mp^GPlX]FmsMAF6[lAFng.NGPl^`H2;jdHiAEjIK+crJ,Om!JV&LQKE$T)L&Qf7LPUbCM2I1K
+N/WaVrf:EJOcklkPa.N"R$a;1S"#q=StD[LTqeEZV5L5iWiE,%Xfen4Z*UdD[^NZU\[oGd]t_=t
+_SX4/`Q#s>ai_fMc-FV\d*^:jeC<%"f@S[.g=k<:gtgfChr!AMiSieqj8\0?jo+?AkPscDl2U&J
+lhg&JmJZJLn,;bTnbMbToDS=Xp&4U`p\FU_q>L0bqu$BhrU9`:s3^js~>
+JcC<$JcGKEo)AUdrVZQis8)ckr:g?fp@eIX!qc*Urpg*[nG_k\md9E.m-Es9l$qp[k2tddj5].X
+i8EMLh;-l@g=k64f@SU(eC;sqdF$=ecHa\YbK@rJaN)<>`Pf[2_SO"%^:h1l]=PP_\$i`QZa6sB
+Yck43XfJJ%WMcYkV50l\TqJ$LSt):>R[BJ/QBd\uP*(ieO,]*WMi*@ILPCP;KS+l-J:N,uI=3er
+H?sj]GB\4QFEDSEEH,r9DJj<-CMR[!BP;$jAn>Oa@q&nU@:3GL?<piA>[(E9r`K;)=',B%s&K(u
+r_rhps&&bls4IA)oVV8YpSR)Ls.oQ\q*Xd@o0NE,s4$kpqmYk#n[JD(qR-7.!(?ZPr'pENrCHiX
+qapkWrp]sXs7-<ao_%nNn'1[Rp!**Pr6,"Cra#P1qd9>1s'be6s'u%=r+5k>s(D7Crb;@Hr+l8k
+lcnS9s*4EdoQoJCoQpF\r-8!\r-&!\noX,;m<&,Gq0)@Rr-8-bq0N$erd=Wls*jutrIFp!s+:6&
+s+CB+re=s=LkpnEMMd=NN/`gWO,oBbP*2#nQ'IZ%R$a;1S"-%@StD[LU8+N[VPg>kWiE,%Xfen4
+Z*UdD[^NZU\[oGd]t_=t_SX40`Q$!?ai_fNc-FV\dF$CkeC<%"f@S[.g=k<:rnRV3hu;O7iSsjs
+s5a4AroX7Ds60CFs6BULr9XCLrpKXOrUBdUqXXUVrUfsZrq?<bq=sparVH<dr;?Hjmf%e;dJn^~>
+JcC<$JcGKEo)AUdrVZQis8)ckr:g?fp@eIX!qc*Urpg*[nG_k\md9E.m-Es9l$qp[k2tddj5].X
+i8EMLh;-l@g=k64f@SU(eC;sqdF$=ecHa\YbK@rJaN)<>`Pf[2_SO"%^:h1l]=PP_\$i`QZa6sB
+Yck43XfJJ%WMcYkV50l\TqJ$LSt):>R[BJ/QBd\uP*(ieO,]*WMi*@ILPCP;KS+l-J:N,uI=3er
+H?sj]GB\4QFEDSEEH,r9DJj<-CMR[!BP;$jAn>Oa@q&nU@:3GL?<piA>[(E9r`K;)=',B%s&K(u
+r_rhps&&bls.B=aoR?.VpO;IWr'^?JoKr.8qOd\YqhaTqhh_>$qF1<OpIG0Qr(6cX!3Q7'ric@+
+rilI/rg<MJns8j3q3M#Hr0I7cra#P1qd9>1s'be6s'u%=r+5k>s(D7Crb;@Hr+l85fU;Q&s*4Ed
+oQoJCoQpF\r-8!\r-&!\noX,;m<&,Gq0)@Rr-8-bq0N$erd=Wls*jutrIFp!s+:6&s+CB+re=s=
+LkpnEMMd=NN/`gWO,oBbP*2#nQ'IZ%R$a;1S"-%@StD[LU8+N[VPg>kWiE,%Xfen4Z*UdD[^NZU
+\[oGd]t_=t_SX40`Q$!?ai_fNc-FV\dF$CkeC<%"f@S[.g=k<:rnRV3hu;O7iSsjss5a4AroX7D
+s60CFs6BULr9XCLrpKXOrUBdUqXXUVrUfsZrq?<bq=sparVH<dr;?Hjmf%e;dJn^~>
+JcC<$JcGKEo)AUdrVZQis8)ckr:g?fp@eIX!qc*Urpg*[nG_k\md9E.m-Es9l$qp[k2tddj5].X
+i8EMLh;-l@g=k64f@SU(eC;sqdF$=ecHa\YbK@rJaN)<>`Pf[2_SO"%^:h1l]=PP_\$i`QZa6sB
+Yck43XfJJ%WMcYkV50l\TqJ$LSt):>R[BJ/QBd\uP*(ieO,]*WMi*@ILPCP;KS+l-J:N,uI=3er
+H?sj]GB\4QFEDSEEH,r9DJj<-CMR[!BP;$jAn>Oa@q&nU@:3GL?<piA>[(E9r`K;)=',B%s&K(u
+r_rhps&&bls&8qsoL@(qr'^?JoKr.8oi:WVnO`IGqap6I!(?ZPr'pENrCHiXqb$K_k>(;:r_EAc
+r*95,s'GS0ra>b7qdTS8rabq<rau1Cr+Q(DrbD@Hs'bq:mo8OMqGdK>qg%g[iHt3Cr-A3bpilXZ
+r,qRPl#Z66piZCUo6:+Wr-A*ard4Wlr-eTos*suts+13%re(6(!/:E,A;>tsM2@+IMi<USNK0'\
+OHG]hPE_>tQC!u+R@9V8SXuFFTV8*TUnjlcVl?\rX0&M,YctC=Za@0L\%0&\]Y(qm^VI_'_o9U7
+aN2KGbKS5VcHjncdaQ^qe^i@(f\,!4gYDea!T)`5huVfrro=%>s5j7Bs6'FGr9=7Hrp0LKrU'UP
+qX=CPrUKaTrU^![qXsj]rV--_rV?Egq"t!equ,s^JcF-tJ,~>
+JcC<$JcGKEo)AUdrVZQis8)`jrV6Ee!;?Ba!qc*UrpkL-nF5o8mdBK/m-Es%l07Epk2tddjQ#:[
+iS`YOhVI#CgY1B7f[na+e^W*tda?Ihcd'eZbKJ&MaN2EA`Pod5_SX+'^V7Co]Xt_b\@8oT['R*E
+Z*:F7Xf\Y(Wi;noVPU)`U7n6PSt;IAS!o_3Q^3o$PEM&iO,o9ZN%U$GM26qAL4t;5Jq8H&Isufo
+H[:!`G^"@TF`__HEcH)<Df0H0Chmg$BkV0mB)Z?QA7K(X@:3JM?X@#D>[1K;>5hY+=BAT'<rZ2"
+<;ohr;Z9Mq:tO=Or2/\Upnm5NqF(-Ho0W+9p!roJhRNHlr3l@-!(?]QqaU?Nr(-cXqF^eYs76Bc
+p%A%QrqHKhn'1[RoZcjKrETA.ra,J/s'Yh7r*oY8rabq<rau1Cqe6"DrbD@H!,VVolHSJ8r-@p\
+o6^=]oR$4Vr-A3bpil[[r,qUQj`Bm4q/uOWo6:+Wr-A*ard4Wlr-eTordXlss+(0%rIY0)Kn]M\
+@#'PoM2@+IMi<USNK0'\OHG]hPE_>tQC!u+R@9V7S=Q7DTV8'RUnjiaVl6SpX/rG*YHY7:Za7'J
+[^`lY]=bej^V@V%_SjF4a2l?DbKJ,ScHjkbdF-LneCE1&f\-8X"l%hgh;7&ghu_lsir7s>jQ5M&
+k5XWEkl'cFlMp2Im/HDOmeZDNnG_tRo)81Yo_S7ZpAOa]q#:*eqY9scr;6H\rdk*rs*t~>
+JcC<$JcGKEo)AUdrVZQis8)`jrV6Ee!;?Ba!qc*UrpkL-nF5o8mdBK/m-Es%l07Epk2tddjQ#:[
+iS`YOhVI#CgY1B7f[na+e^W*tda?Ihcd'eZbKJ&MaN2EA`Pod5_SX+'^V7Co]Xt_b\@8oT['R*E
+Z*:F7Xf\Y(Wi;noVPU)`U7n6PSt;IAS!o_3Q^3o$PEM&iO,o9ZN%U$GM26qAL4t;5Jq8H&Isufo
+H[:!`G^"@TF`__HEcH)<Df0H0Chmg$BkV0mB)Z?QA7K(X@:3JM?X@#D>[1K;>5hY+=BAT'<rZ2"
+<;ohr;Z9Mq:nF8Ngjf$Hn9t.$q*Xa?og/JIqk3eBg5>``pP8f;qaLBOpdb6QrCQiXril@+s0D[2
+s0VfnpQtK;ns0$:q3V%bs'>V1qd9A2raG_6raYq<r+5k>s(D4Bs(VIIr+c:KrN4_?pmCu)oQp+U
+qL%p^oQpF\r-8!\rHA*]o5s)8mr\AJqKDISr-8-bq0N$erd=Wls*jrsrIFp!!.t0%!ec8]re=g9
+LkpnEMMd=NN/`gWO,oBbP*2#nQ'IZ%R$a;1S"#q=StD[LTq\?YV5C/hWN*##Xf\e2Yd1UA[C3NR
+\[f>b]Y;.q_8=(-`Pom=aN;WKbg"GZd*^7he'umtf@S[.rn7P1gtgfChu;O8iSrkrir\<'jo4EB
+kPscEl2KuJlhg&JmJcPMn,;bTnbMbSoDS=Xp&4U_p\FU`q>C*aqu$BhrU0Z9s3Udr~>
+JcC<$JcGKEo)AUdrVZQis8)`jrV6Ee!;?Ba!qc*UrpkL-nF5o8mdBK/m-Es%l07Epk2tddjQ#:[
+iS`YOhVI#CgY1B7f[na+e^W*tda?Ihcd'eZbKJ&MaN2EA`Pod5_SX+'^V7Co]Xt_b\@8oT['R*E
+Z*:F7Xf\Y(Wi;noVPU)`U7n6PSt;IAS!o_3Q^3o$PEM&iO,o9ZN%U$GM26qAL4t;5Jq8H&Isufo
+H[:!`G^"@TF`__HEcH)<Df0H0Chmg$BkV0mB)Z?QA7K(X@:3JM?X@#D>[1K;>5hY+=BAT'<rZ2"
+<;ohr;Z9Mq:f:1ir'nXqqF(-Ho0W+9oi:TUiCWl:pI>3OqaLBOpdb6QrCQiXqH3`"r`J>Yl:q(L
+rETA.ra,J/s'Yh7r*oY8rabq<rau1Cqe6"DrbD@H"DhLT@Uek,l;RCUr-@p\o6^=]oR$4Vr-A3b
+pil[[r,qUQj`Bm4q/uOWo6:+Wr-A*ard4Wlr-eTordXlss+(0%rIY0)Kn]M\@#'PoM2@+IMi<US
+NK0'\OHG]hPE_>tQC!u+R@9V7S=Q7DTV8'RUnjiaVl6SpX/rG*YHY7:Za7'J[^`lY]=bej^V@V%
+_SjF4a2l?DbKJ,ScHjkbdF-LneCE1&f\-8X"l%hgh;7&ghu_lsir7s>jQ5M&k5XWEkl'cFlMp2I
+m/HDOmeZDNnG_tRo)81Yo_S7ZpAOa]q#:*eqY9scr;6H\rdk*rs*t~>
+JcC<$JcGKEo)AUdrVZQis8)`jrV6Ees7ZHbs7?<_rpp*Z!:^!V!Uf@Slk\pPl07EpkN:pgjQ#:[
+iS`YOhVI#Cg]#oUg"=p.f$r3uda?Ihcd'h\bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(ke\[],W[^EHJ
+ZE^X;Y-"h,WiE%rVl$;dUS=HTT:VXES"#k6R$X,(P`q8mOH5H^N/W[PM26qAL4t;5Jq8H&Isufo
+H[:!`G^"@TF`__HEcH)<Df0G!D/=!'C2%?pB4h-S&7f9[@UWYP?XI,F?!LW=>?_#/!a&N*r`9&!
+s&Aqqs&&tsf%/I)qPN\YnttZJq*b!FoKr7;qpbMne[YOdr3lF/!(?]QqaU?Nr(-cXq+:\[p&=Xh
+p\=R[qYL*Xc1TBUc1&sV>lJ%/?Me+0@/aU4@fBm:AGg$<B)cNAB`;`FCA_lHD#WDobj3O9bl)hZ
+HM)XXI._jZHMi'eGkcL\G5QLTFQ7H3FS^.VG4g(WGl2j_HMr3iI/JEmIf=iqJH(3#K)UE&K`?c*
+L'NKiLl$tGMMqImA;uV1O-#KdP*2#nQ'IZ%R$a;1S"-%@StD[LU8+N[V5L5iWN*##Xfek3Z*L^C
+[C3QS\[oDc]tV7s_8=+.`Q#s>aND]Lbg+M[d*^7ieC<%"f@S[.g=k<:h;-rEhr*GOiSsjs!p&J)
+roX7Ds60FGs6BXMqs=@MrU0ONrp]mVq==LUrUfpYrV$3aq=sparVH<dqu$?imf%e;d/SU~>
+JcC<$JcGKEo)AUdrVZQis8)`jrV6Ees7ZHbs7?<_rpp*Z!:^!V!Uf@Slk\pPl07EpkN:pgjQ#:[
+iS`YOhVI#Cg]#oUg"=p.f$r3uda?Ihcd'h\bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(ke\[],W[^EHJ
+ZE^X;Y-"h,WiE%rVl$;dUS=HTT:VXES"#k6R$X,(P`q8mOH5H^N/W[PM26qAL4t;5Jq8H&Isufo
+H[:!`G^"@TF`__HEcH)<Df0G!D/=!'C2%?pB4h-S&7f9[@UWYP?XI,F?!LW=>?_#/!a&N*r`9&!
+s&Aqqs&&horLW8'q1/*eqgS-bq*b!FoKr7;qk*bYd>IgXq1o#=qaLBOpdb6QrCQfWrNcI0rj;^5
+!4Mlop6Y<8op,B>pm:tbra#P1qd9A2raG_6raYq<r+5k>s(D7Crb;@Hr+l:Js/c=)R+Ri&R/M=&
+HM)XXI._jZHMi'eGkcL\G5QLTFQ7H3FS^.VG4g(WGl2j_HMr3iI/JEmIf=iqJH(3#K)UE&K`?c*
+L'NKiLl$tGMMqImA;uV1O-#KdP*2#nQ'IZ%R$a;1S"-%@StD[LU8+N[V5L5iWN*##Xfek3Z*L^C
+[C3QS\[oDc]tV7s_8=+.`Q#s>aND]Lbg+M[d*^7ieC<%"f@S[.g=k<:h;-rEhr*GOiSsjs!p&J)
+roX7Ds60FGs6BXMqs=@MrU0ONrp]mVq==LUrUfpYrV$3aq=sparVH<dqu$?imf%e;d/SU~>
+JcC<$JcGKEo)AUdrVZQis8)`jrV6Ees7ZHbs7?<_rpp*Z!:^!V!Uf@Slk\pPl07EpkN:pgjQ#:[
+iS`YOhVI#Cg]#oUg"=p.f$r3uda?Ihcd'h\bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(ke\[],W[^EHJ
+ZE^X;Y-"h,WiE%rVl$;dUS=HTT:VXES"#k6R$X,(P`q8mOH5H^N/W[PM26qAL4t;5Jq8H&Isufo
+H[:!`G^"@TF`__HEcH)<Df0G!D/=!'C2%?pB4h-S&7f9[@UWYP?XI,F?!LW=>?_#/!a&N*r`9&!
+s&Aqqs&&horDNJ]a%,qnpd=[?p-J@Ope'73qagNQ!(?]QqaU?Nr(-cXq+C<_s%h`OmS3IOr`oG.
+s'GS0s'Yh7r*oY8rabq<rau1Cr+Q(DrbD@HrbVRBn5SgSo2P[6oQp1WomHFZom6O]rHS*]r-&!\
+oQ9,7n9"MLqKDOUr-8-bq0N!drd=Wls*jrsrIFp!s+:6&s+LE+re:Z5LkpnEMMd>kN+@p.O,oBb
+OcklkPa.N"Q^F/.R[]h<St;RITq\<XUnsueW2ZetXKAY/Yd(L?['d?O\@K2_]Y2%o^qmn*`5Ta:
+aN2NIbKS8Wcd:(ee'umtf%8O+g"P07gtgfChV[8LiSieqir\<'jo4EBkPscEl2U&Klhg&KmJZJL
+n,DhTnbMbSoDS=Wp&4U_p\FU_q>L0bqtp<grU0Z9s3Udr~>
+JcC<$JcGKEo)AUdrVZQirqcZjrV6Ees7ZHbs7H?_s763[!:^!V#4CmGm-O''rojUMkN:pgjSn1h
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI.^q[Xu]tD"i\[f5Z[^NQL
+Za-j?YHG"0X/`2!Vl-DgUnaZXTV%gIS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5(D8K7\Z)J:E#r
+I=$9dH$FOW'm=_AFE;JBEH#i6DJa3*CMIQsBP1rVAIrB^@U`bR?sd8I?!U]?>?b;1=oVS(=8l8#
+<W?%s;u]bpf(c-/Vt6eTV>[:b7/94@6MWq?eC;#*\,<]3[JNDi7e]FO8Gu-U9)hNcpA"F^q>U6l
+r;H*/n]psTn]_#<ra#P1qd9A2raG_6raYq<r+5n?rb).Brb;@Hr+l:J!,__prlj`RkKNpNoQp4X
+nU1(Xom6O]rHS*]r-&$]oQ9)6nT=VMqf_XVr-8-bq0N$erd=TkrdOlsrIFp!s+:3%s+CB+rItQ4
+LkpnEMMd>kMueourf:6EOcklkPa.N"Q^F/.R[]e:SXuFGTqS3UUnsrdVl?\rX0&M,YctC<Za@-K
+\%&u[]=bhk^VI\&_o0O6a2lBFbKJ/UcHjkbdaQ^qe^i@(f\,!4gYCW@hV\=j!TE&;j8\0?jo4EB
+kPscEl2U&Klhp,KmJcPMn,DhTnbMbSoDS=Wp&4U_p\FU_q>C*aqtp<grU0Z9s3L^q~>
+JcC<$JcGKEo)AUdrVZQirqcZjrV6Ees7ZHbs7H?_s763[!:^!V#4CmGm-O''rojUMkN:pgjSn1h
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI.^q[Xu]tD"i\[f5Z[^NQL
+Za-j?YHG"0X/`2!Vl-DgUnaZXTV%gIS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5(D8K7\Z)J:E#r
+I=$9dH$FOW'm=_AFE;JBEH#i6DJa3*CMIQsBP1rVAIrB^@U`bR?sd8I?!U]?>?b;1=oVS(=8l8#
+<W?%s;u]bpT':auJFe9\IeH2*6h3S>61pl+MY)btM#0X<7e]FO8Gu-U9)hNaZM_*/[f<i9R.Zg2
+QN!0FQM?gH>lJ%/?Me+0@/aU4@fBm:AGg$=B)ZH@B`;`FCA_lHC]J>OY5XgARJN<MH1ZFVHguLX
+HhD^_H2W!_GPlX_FnBe8F7FAKFo-@TGPl^`H22dcHiAEiIK"]qJ,OotJcC?#KE$T)L&H`2LPUbC
+M2I1Krepl;NrG)COHG]hPE_>tQC!u+R@9V7S=Q7CTV8'RUSO``Vl-MoWiN8(Y->.8ZEppG[^WcW
+]">Vg^;%J"_Sa=2`lH0Bb0.uQcHab_dF-LneCE.%f@\d1g=tE=h;7&ghuVfrro=%>!9O4Bs6'FG
+rTX@Is6KULrpB^QqX=FQrUK^SrU^![q=X^[rV--_rV?Bfq"ssdqu,s^JcF'rJ,~>
+JcC<$JcGKEo)AUdrVZQirqcZjrV6Ees7ZHbs7H?_s763[!:^!V#4CmGm-O''rojUMkN:pgjSn1h
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI.^q[Xu]tD"i\[f5Z[^NQL
+Za-j?YHG"0X/`2!Vl-DgUnaZXTV%gIS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5(D8K7\Z)J:E#r
+I=$9dH$FOW'm=_AFE;JBEH#i6DJa3*CMIQsBP1rVAIrB^@U`bR?sd8I?!U]?>?b;1=oVS(=8l8#
+<W?%s;uBPg7`e0o7/94@6MWqG<;BP@8bu!T8,GaP7e]FO8Gu-U9)hQZ=oV\);#O2L:A.EW:B+Su
+?2n7.?iOO5@JjU6A,^$:AcHBABDcHBC&VlFC]8,MD>mu4<:NoW<;q18HM2^UI.r!\HMi'eGkcL\
+G5ZRUFQ.B3FS^.WG4g(WGl2j_HN&9jI/A?kIfForJH(3#K)L?%KE-`)L'NKiLl$tGMMqIm!KE-=
+O'7X-P*2#nQ'IZ%R$a;1S"#q=St;UKTq\<XV5C/gWN)u!Xf\b1Yd(L?['d?O\@K2_]Y2%o^qmn*
+`5Ta:aN;TJbK\>Xcd:(fe'umtf%8O+g"P07gtgfChu;O7iSsjss5X1AroX7Ds60FGs6BXMr9XFM
+rpKXOrp]mVq==LUrUfpYrV$3aq=spar;-3cqu$?imf%e;ci8L~>
+JcC<$JcGKEo)AUdrVZQirqcZjrV6Ees7ZEa!qc*UrpgWjnF5o8mdBK/m-F!&l07EproS[kjQ#:[
+iS`YOhVR)EgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xu]tD"h\[f5Z[^NQL
+Za-j?YHG"0X/`2!Vl-DgUnaZXTV%gHS=?"9R$a5*Q'@JqOcYWbNJrgSMM[.EL5(D8K7\Z)J:E#r
+I!bm>/U;SbGBS+NFE;JBEH#i6DJa3*CMIQsBP1pgARo=]@U`bR?sd8I?!U]?>?b;1=oVS(=8c/$
+<E)rr;ZK_pf(Z'-Vt6eSV#[Cc7/0.<6N0:EeBtf(\+d?.7JfRL8,PpV8bl!Y9E"\cqu-HmcK`[M
+cM,TTbl:rI?2n7.?iOO5@JjU6A,^$:AcHBABDcHBC&_rFC]A5MD#eJQir70hc0*=NH1cLXHgH.T
+HhMd`H2Mp_GPu^_FnKkLF89kJF7XMNFo-@UGPl^aH22dbHiAEiIK"]qJ,FisJcC?$KE$W)L&Qi,
+LB*/0M>rG5MuJY9NK4"!"d"k0P*;.0PtdR2R$a;1S"-%@StD[LTqeEZV5C/hWN)u"Xf\e2Yd(O@
+['mEP\[f;a]Y2(p^r!t+`Poj;aN;TJbg"GYcdC.ge'umtf@S[.g=k<:rnRt=hr*GOio9"YjQ,G%
+k5XWEkl'cGlMp2Jm/QJPmecJOnGVnQo)81Yo_J1YpAF[\q#1$eqY0mbr;-B[rdk*ps*t~>
+JcC<$JcGKEo)AUdrVZQirqcZjrV6Ees7ZEa!qc*UrpgWjnF5o8mdBK/m-F!&l07EproS[kjQ#:[
+iS`YOhVR)EgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xu]tD"h\[f5Z[^NQL
+Za-j?YHG"0X/`2!Vl-DgUnaZXTV%gHS=?"9R$a5*Q'@JqOcYWbNJrgSMM[.EL5(D8K7\Z)J:E#r
+I!bm>/U;SbGBS+NFE;JBEH#i6DJa3*CMIQsBP1pgARo=]@U`bR?sd8I?!U]?>?b;1=oVS(=8c/$
+<E)rr;ZK_pT'1\"JG+KZIe?,(6gmA@62$rGMrT]eM=uc&7JfRL8,PpV8bl!Y9Du6s[f*]8RJrTI
+Qf+2*QiC=i?2n7.?iOO5@JjU6A,^$:AcHBABDcHBC&_rFC]A5MD#eJQY5XgARJWBOH1cLXHgH.T
+HhMd`H2Mp_GPu^_FnKkLF89kJF7XMNFo-@UGPl^aH22dbHiAEiIK"]qJ,FisJcC?$KE$W)L&Qi,
+LB*/0M>rG5MuJY9NK4"!"d"k0P*;.0PtdR2R$a;1S"-%@StD[LTqeEZV5C/hWN)u"Xf\e2Yd(O@
+['mEP\[f;a]Y2(p^r!t+`Poj;aN;TJbg"GYcdC.ge'umtf@S[.g=k<:rnRt=hr*GOio9"YjQ,G%
+k5XWEkl'cGlMp2Jm/QJPmecJOnGVnQo)81Yo_J1YpAF[\q#1$eqY0mbr;-B[rdk*ps*t~>
+JcC<$JcGKEo)AUdrVZQirqcZjrV6Ees7ZEa!qc*UrpgWjnF5o8mdBK/m-F!&l07EproS[kjQ#:[
+iS`YOhVR)EgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xu]tD"h\[f5Z[^NQL
+Za-j?YHG"0X/`2!Vl-DgUnaZXTV%gHS=?"9R$a5*Q'@JqOcYWbNJrgSMM[.EL5(D8K7\Z)J:E#r
+I!bm>/U;SbGBS+NFE;JBEH#i6DJa3*CMIQsBP1pgARo=]@U`bR?sd8I?!U]?>?b;1=oVS(=8c/$
+<E)rr;uKSq7R]cB7d<M@7d!;77/0.<6N0:E<6\#38Gl!T7JfRL8,PpV8bl!Y9DVfi>5qJ!;"mcF
+:B!u`:B+Su?2n7.?iOO5@JjU6A,^$:AcHBABDcHBC&_rFC]A5MD#eJQ@I@+e;t*cdH1cLXHgH.T
+HhMd`H2Mp_GPu^_FnKkLF89kJF7XMNFo-@UGPl^aH22dbHiAEiIK"]qJ,FisJcC?$KE$W)L&Qi,
+LB*/0M>rG5MuJY9NK4"!"d"k0P*;.0PtdR2R$a;1S"-%@StD[LTqeEZV5C/hWN)u"Xf\e2Yd(O@
+['mEP\[f;a]Y2(p^r!t+`Poj;aN;TJbg"GYcdC.ge'umtf@S[.g=k<:rnRt=hr*GOio9"YjQ,G%
+k5XWEkl'cGlMp2Jm/QJPmecJOnGVnQo)81Yo_J1YpAF[\q#1$eqY0mbr;-B[rdk*ps*t~>
+JcC<$JcGKEo)ARcrquZjrqcZjrV6Ees7ZEa!qc*Urpg-\nF6GG!Uf@SliHG;rojUMkN:pgjSn1g
+io/hRhqm2FgtUQ:g"=s/f@JL%eC2jndEp4bcHXSVbK@rJaN)<>`P]R0_8*h#^:h1l]=GJ^\$i`P
+Za6sBYck43XfJJ%WMcYkV50l\TqJ$LSXc1=R@'A.Q'IStP*(ieO,]*WMi*@ILPCP;K7ec,J:N,u
+I=-BfH?jc8G91pMFEDSEEH,r9DJj<-CMR[!BP;$jAS#C^@q&nU@/aL6?=!P8s'#J,r`T8'!*B,"
+!``3!rDWaIoqq#Po;;A\pnn'[oL/IAmR$Wsk.'igrj_[2s0henqaU<MrCHlYq+CWZ!;ZTirqcir
+qtn[af?Ns3!*oM/ra,M0ra>b7qdTS8rabq<rau1Cr+Q(DrbD@HrbVUOs).kr!9="$m`jt>!."6`
+pNu1Qpj;^\rH\<cq02d\r,q^TpiGtGp2fkJqfVg[pNQO[rH\3brHnNkqgJKnrdXirs+13%rIb-'
+!/:B+!f)SfreU]6Mi7Rn!KE-=O'@^.P*2#mPa.N"Q^F/.R[]e:SXuFFTqS3UUnjlcVl6SpX/rG+
+YHY:;Za7'J[^`lY]=bej^V@V%_SjF4`lQ6Cb0/#RcHjkbdF-Lne^i@(f\,!4gYCW@hV\=j!TE&;
+ir\<'jo4BDkNM..klC#Jli$2LmJlVNn,DhTnbMbSoDS=Vp&4U_p\=O^q>L0aqtp<grU'T8s3CXp~>
+JcC<$JcGKEo)ARcrquZjrqcZjrV6Ees7ZEa!qc*Urpg-\nF6GG!Uf@SliHG;rojUMkN:pgjSn1g
+io/hRhqm2FgtUQ:g"=s/f@JL%eC2jndEp4bcHXSVbK@rJaN)<>`P]R0_8*h#^:h1l]=GJ^\$i`P
+Za6sBYck43XfJJ%WMcYkV50l\TqJ$LSXc1=R@'A.Q'IStP*(ieO,]*WMi*@ILPCP;K7ec,J:N,u
+I=-BfH?jc8G91pMFEDSEEH,r9DJj<-CMR[!BP;$jAS#C^@q&nU@/aL6?=!P8s'#J,r`T8'!*B,"
+!``3!rDN`hT&tP%JFJ'WIfDk/7/0.;6M@&7Mu&=uM>2o(7JfRK8,Z!W8bl!X9)u?t[0O.J[C3KN
+R@3l<qNp3-pm1tcra#M0r*TG2s'be6s'u%=r+5k>s(D7Crb;@Hr+l:Js)%dRriZ0dgR7r+!."6`
+pNu1Qpj;^\rH\<cq02d\r,q^TpiGtGp2fkJqfVg[pNQO[rH\3brHnNkqgJKnrdXirs+13%rIb-'
+!/:B+!f)SfreU]6Mi7Rn!KE-=O'@^.P*2#mPa.N"Q^F/.R[]e:SXuFFTqS3UUnjlcVl6SpX/rG+
+YHY:;Za7'J[^`lY]=bej^V@V%_SjF4`lQ6Cb0/#RcHjkbdF-Lne^i@(f\,!4gYCW@hV\=j!TE&;
+ir\<'jo4BDkNM..klC#Jli$2LmJlVNn,DhTnbMbSoDS=Vp&4U_p\=O^q>L0aqtp<grU'T8s3CXp~>
+JcC<$JcGKEo)ARcrquZjrqcZjrV6Ees7ZEa!qc*Urpg-\nF6GG!Uf@SliHG;rojUMkN:pgjSn1g
+io/hRhqm2FgtUQ:g"=s/f@JL%eC2jndEp4bcHXSVbK@rJaN)<>`P]R0_8*h#^:h1l]=GJ^\$i`P
+Za6sBYck43XfJJ%WMcYkV50l\TqJ$LSXc1=R@'A.Q'IStP*(ieO,]*WMi*@ILPCP;K7ec,J:N,u
+I=-BfH?jc8G91pMFEDSEEH,r9DJj<-CMR[!BP;$jAS#C^@q&nU@/aL6?=!P8s'#J,r`T8'!*B,"
+!``3!r)3Snr'gHOmmm%?l::kCoL/IAmR$VHk"4K%s$urTqaU<MrCHlYq+CWZpf[W!s&&JdpJ9[A
+!*oM/ra,M0ra>b7qdTS8rabq<rau1Cr+Q(DrbD@HrbVUOs).jF!+P=pp/CEZ!."6`pNu1Qpj;^\
+rH\<cq02d\r,q^TpiGtGp2fkJqfVg[pNQO[rH\3brHnNkqgJKnrdXirs+13%rIb-'!/:B+!f)Sf
+reU]6Mi7Rn!KE-=O'@^.P*2#mPa.N"Q^F/.R[]e:SXuFFTqS3UUnjlcVl6SpX/rG+YHY:;Za7'J
+[^`lY]=bej^V@V%_SjF4`lQ6Cb0/#RcHjkbdF-Lne^i@(f\,!4gYCW@hV\=j!TE&;ir\<'jo4BD
+kNM..klC#Jli$2LmJlVNn,DhTnbMbSoDS=Vp&4U_p\=O^q>L0aqtp<grU'T8s3CXp~>
+JcC<$JcGKEo)ARcrquWis8)ckr:p<ds7ZHbs7?<_rpp*Z!:^!V$h!ELm-O''lKRQskPjTIjlGI^
+io0mp&`;I$h;$c=g=b-1f@JL%eC2kFd;[IYcHa\YbKJ&MaN2EA`Pf[2_SO%&^V7Co]XkYa\@8oT
+['R*EZ*:F7Xf\Y(Wi;noVPU)`U7n6PSt2C@S!fY2Q^*i#PEM&iO,o9ZN/NRMLkg_>KnG#0JUi9#
+IXQTjH?sj]GB\4QFEDSEEH#jqDA$f&CMR[!BP;$jAS#C^@q&nU@/aL<?<piA>[(E9r`T8's&]2#
+s&K(us&/sLfCPm*VrafS7J'"B6h!G>ebmqY\F$d)\G!E/7JoXL8,PpV8bl!X9DSDdq>0p4e]md2
+ra#M0r*TG2s'be6s'u%=r+5k>s(D4Bs(VIIr+l:Jrb_XPs5X"#n'1(?!."6`pj;4Pq0Vg]rH\<c
+q02d\rH7gUq/bnCpiH+Mr,qp\pNQR\rH\3brd4TkqgJKnrdXirs+13%rIb-'s+UH,s+gW1reU]6
+Mi7Rn!KE-=Nrb?)rfU]RPa.N"Q^F/.R[]e:SXuFFTV8'RUSO``Vl-MoWiN8(Y-5(7ZEppG[^WcW
+]">Vg^;%J"_SX71`Q-'@aihlOc-FY^dF$FmeCE.%f@\d1g=tE=h;7&Ii8N\Tj5]4]jo4BDkNM./
+l2U&Klhp,LmJcPNn,DhUnbMbSoDJ7Up&4U_p\=O^q>C*`qu$BgrU0Z9s31Ln~>
+JcC<$JcGKEo)ARcrquWis8)ckr:p<ds7ZHbs7?<_rpp*Z!:^!V$h!ELm-O''lKRQskPjTIjlGI^
+io0mp&`;I$h;$c=g=b-1f@JL%eC2kFd;[IYcHa\YbKJ&MaN2EA`Pf[2_SO%&^V7Co]XkYa\@8oT
+['R*EZ*:F7Xf\Y(Wi;noVPU)`U7n6PSt2C@S!fY2Q^*i#PEM&iO,o9ZN/NRMLkg_>KnG#0JUi9#
+IXQTjH?sj]GB\4QFEDSEEH#jqDA$f&CMR[!BP;$jAS#C^@q&nU@/aL<?<piA>[(E9r`T8's&]2#
+s&K(us&8rik'mA]m=4YTrC-?HpI"F:qk3kZ!/frtq24Tsq2"o:r'pENr(-cXq+CWZq6^1.!OA-f
+R.ls8QN*<KQM?gG?2e1.?iFI5@JaO6A,^$:Ac?<ABDZBBC&VlFC]8/LD>nGQY5=U@RJ`EPH1cLY
+Hg#kQHhMdaH2Mp_GPu^`FnTqQF6mrBF7jYQFo6FWGPudbH22dcHi8?hIK+cqJ,FisJcC?#KE$W)
+L&Qi,L]<20M#rQmMuJY9NK4"!!K`HCP$sQ=Q'IZ%R$a;1S"#q=St;RITqS3UUnsrdVl?\rX0&M,
+YHY:;Za@-K\%&u[]=bhk^VI\&_SjF4a2l?DbKJ,ScHjkbdF6Upe^i@(f\,!4gYCW@hV[8LiSrkW
+j5f:_roO:Fkii$1s6BXMr9XINrpK[Prp]pWq==LUr:KdWrV$3aq"Xg`r;-0br;?Eimf%e;bl<1~>
+JcC<$JcGKEo)ARcrquWis8)ckr:p<ds7ZHbs7?<_rpp*Z!:^!V$h!ELm-O''lKRQskPjTIjlGI^
+io0mp&`;I$h;$c=g=b-1f@JL%eC2kFd;[IYcHa\YbKJ&MaN2EA`Pf[2_SO%&^V7Co]XkYa\@8oT
+['R*EZ*:F7Xf\Y(Wi;noVPU)`U7n6PSt2C@S!fY2Q^*i#PEM&iO,o9ZN/NRMLkg_>KnG#0JUi9#
+IXQTjH?sj]GB\4QFEDSEEH#jqDA$f&CMR[!BP;$jAS#C^@q&nU@/aL<?<piA>[(E9r`T8's&]2#
+s&K(urDWS^q*ssGnj_t9rC-?HpI"F:s&8\lj[n?#qaLEPpIG-PrCQfWr_*2ms&f2#!)`,[p.smI
+ra#M0r*TG2s'be6s'u%=r+5k>s(D4Bs(VIIr+l:Jrb_XPs'k=opf$T[!."6`pj;4Pq0Vg]rH\<c
+q02d\rH7gUq/bnCpiH+Mr,qp\pNQR\rH\3brd4TkqgJKnrdXirs+13%rIb-'s+UH,s+gW1reU]6
+Mi7Rn!KE-=Nrb?)rfU]RPa.N"Q^F/.R[]e:SXuFFTV8'RUSO``Vl-MoWiN8(Y-5(7ZEppG[^WcW
+]">Vg^;%J"_SX71`Q-'@aihlOc-FY^dF$FmeCE.%f@\d1g=tE=h;7&Ii8N\Tj5]4]jo4BDkNM./
+l2U&Klhp,LmJcPNn,DhUnbMbSoDJ7Up&4U_p\=O^q>C*`qu$BgrU0Z9s31Ln~>
+JcC<$JcGHDoD\[drVZQis8)`jrV6Ees7ZHbs7H?_rpg<anF5o8mdBKAljE(Dl07EqkN:pgjSn0C
+io/hRhqn@g&_u-pg=b-1f@JL%eC2jndEp5=c>_%PbKJ&MaN2E@`Pf[2_SO%&^V7Co]XkYa\@8oT
+['R*EZ*:F7Xf\Y(Wi;noVPU)`U7n6PSt2C@S!fY2Q^*i#PEM&iO,o9ZN/NRMLkg_>KnG#0JUi9#
+IXQTjH?sj]GB\4QFE;JBEH#i6DJa4hCCY)nBP;$jAS#C^@q&nU@/aL<?<piA>[(E9r`T8's&]2#
+s&K(u!`Rb(oqprNk,/&Fo0i=?nO!6+qUP,HoXO:trj_s:!4_p8r'gKPpIG0QrCQfWrC[,aqYC0d
+!;H96gs,Q:s'>V1r*TG2s'be6s'u%=r+5k>s(D4Bs(VIIr+l:Jrb_UOs5a""n]g:Ap3QL\k'ZuO
+p3Q[_rHS-^r-&$]pN67Ql#QT@olU+SrH@s[rHS9dq0N$erd=TkrdOirr.+fus+:3%s+LE+rJ(?-
+!/UW2s,$f7rf$l:!07&>!K`HCOp.&6Q'IZ%rg6WPR[]e:SXuIHTqS3UUnjibVl6SpX/rG*YHY79
+Za7$H[^WcW]">Vg^;%J"_Sa=2`lH0Bb0.uQcHab_dF-LneCE.%f\,!4gYCW@hV[5Ki8N\pirS6&
+roX7D!9jCGs69UMr9XINrpK^Qrp]mVq==LUrUfmXr:^*`q"Xd_rVH9cqu$?imJ_\:bl<1~>
+JcC<$JcGHDoD\[drVZQis8)`jrV6Ees7ZHbs7H?_rpg<anF5o8mdBKAljE(Dl07EqkN:pgjSn0C
+io/hRhqn@g&_u-pg=b-1f@JL%eC2jndEp5=c>_%PbKJ&MaN2E@`Pf[2_SO%&^V7Co]XkYa\@8oT
+['R*EZ*:F7Xf\Y(Wi;noVPU)`U7n6PSt2C@S!fY2Q^*i#PEM&iO,o9ZN/NRMLkg_>KnG#0JUi9#
+IXQTjH?sj]GB\4QFE;JBEH#i6DJa4hCCY)nBP;$jAS#C^@q&nU@/aL<?<piA>[(E9r`T8's&]2#
+s&K(u!`P_`l@8Y\mXOeVr'g3FpI"I;pRqPDo8E!nm>:^rr'gKPpIG0QrCQfWrC[,arj2X1s02[1
+Z*9YiR.-I9QLL7@?2e1.?iFI5@JaO6A,^$:Ac?<ABDZBBC&VlFC]8/LD>eAPY5+I@RJ`HGHMDjL
+I//-_HMr-fGklR]G5ZRXFS^(CEqseLFSp:[G5-:[Gl;p`HN&9jI/A?kIf=ipJH(3#K)L?%K`?c)
+LB!#/M#N82M?&S6N;nk;NrG(?OHKO*"d>19Q'Rd9QrBEAS"#q=StD[LTq\<XUnsueW2ZetXKAV.
+YctC=Za@-K\%&u[]=bhk^VI\&_o0O6a2lBFbKJ/UcHjkbdaQ^qe^i@)g"P07gtgfChr!AMiSsjs
+!T`AAk5XTEkl'cGl2^/Jm/QJPmelPQnGVnQo)81Yo_A+WpAOa\q#'sdqY0mar;6H[rdk*ns*t~>
+JcC<$JcGHDoD\[drVZQis8)`jrV6Ees7ZHbs7H?_rpg<anF5o8mdBKAljE(Dl07EqkN:pgjSn0C
+io/hRhqn@g&_u-pg=b-1f@JL%eC2jndEp5=c>_%PbKJ&MaN2E@`Pf[2_SO%&^V7Co]XkYa\@8oT
+['R*EZ*:F7Xf\Y(Wi;noVPU)`U7n6PSt2C@S!fY2Q^*i#PEM&iO,o9ZN/NRMLkg_>KnG#0JUi9#
+IXQTjH?sj]GB\4QFE;JBEH#i6DJa4hCCY)nBP;$jAS#C^@q&nU@/aL<?<piA>[(E9r`T8's&]2#
+s&K(ur_rY^r'p-Fo1&+;r'g3FpI"I;peq/lj@SN*!(m&Yr'gKPpIG0QrCQfWrC[,aqcNi!!*8kl
+m83LPn4s!hra,M0ra>b7qdTS8rabq<rau1Cqe6"DrbD@HrbVRNrGMXEl;[XZm8We*pj;.Nq0Vg]
+rH\?dq02a[rH7jVqK(nAq/c4Nr,qs]pil[]rH\3brd4WlqgJHmrdXirs+13%rIb-'s+UE+s+^T1
+re^Z4!/pi8s,@#=rf7)AOoCLIPE_>tQC%T<;jj)DS"-%@T:hmOU8+N[V5L5iWN*##Xf\e2Yd(O@
+['d?O\@K2_]Y2%o^qmn*`5Ta:aN;TJbK\>Xcd:(fe'umtf%8R-g=k<:h;-rFhr*GOir7s=jQ6C'
+s5sCGrTX@I!:0RLs6]gRr9sXSrUK^SrU^![q"=RYrV-*^r;$<fp\Xjcqu,p]JcEsoJ,~>
+JcC<$JcGHDo)AUdrVZQirqcZjrV6Ees7ZEa!qc*Urpg-\nF6GG!Uf@SliHG;rojIIkPjTIjlGI^
+io0mpIG`o;h;$c=g=b03f@SU(eC;sqdF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(hd\[],W
+[^<BIZE^X;Y-"e+WiE%rVl$;dUS=HTT:VUDS"#h5R$X)'P`q8mOH5H^N/W[PM26qAL4t84Jq8H&
+Isl`mH[:!`G^"?LG'.nJEcH)<Df0H0Chmg$Bk_6oB4b^dA7PUJ!F]C8?O'nC?!LW=>?_#/s&f;&
+r`9&!!`[h)pnm)LrhfXln#$(Rr'g6Gp-\F<rn7;'rn$VLm'u_trj_p9rODboqaU<MrCHiXqF^]Z
+s%Eanq"XUXp@\(MoC1&mblGu_c2>f`bPtlJ?Me+0@/aU4@fBm;AG]s<B)ZH@B`;`GCAVfHD#S;L
+DZAbtbPBBPc0<IGHMMpKI/83`HMr-fGklR^G5ZRXFS^(AEqseNFSp:ZG56@\Gl;paHN&9jI/A?k
+If=ipJH(3#K)C9$K`?c*LB!&/M#N82M?&S6N;nk;NrG(?OHKO*@[!%AQ'R`&R$a;1S"#q=St;RI
+TqS3UUnsrdVl6VqX/rG+YHY7:Za7'J[^WfX]"G\h^V@S#_Sa=2`lH0Bb0/#RcHab`dF-LneCN7'
+f\,!4gYCW@hV[8LiSrkWj5f=`roO:Fkii$1s69UMrTsONs6fgRrp]mVqXXUVr:KdWrV$0`q"Xd_
+rVH6br;?EimJ_\:bQ!(~>
+JcC<$JcGHDo)AUdrVZQirqcZjrV6Ees7ZEa!qc*Urpg-\nF6GG!Uf@SliHG;rojIIkPjTIjlGI^
+io0mpIG`o;h;$c=g=b03f@SU(eC;sqdF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(hd\[],W
+[^<BIZE^X;Y-"e+WiE%rVl$;dUS=HTT:VUDS"#h5R$X)'P`q8mOH5H^N/W[PM26qAL4t84Jq8H&
+Isl`mH[:!`G^"?LG'.nJEcH)<Df0H0Chmg$Bk_6oB4b^dA7PUJ!F]C8?O'nC?!LW=>?_#/s&f;&
+r`9&!!`YeapjW9opODjdmsjqXr^QfSoL/C?o0W5Fg5>0Pr'gKPpIG0Qr(6`WrCd/a$F-h>YHY46
+Y-"goopFs0s-E/@s'>Y2qd9A2raG_6raYt=qdoe>rb).Brb;CIqeQ4Jrb_RN!NrR"R,+2/R.bk%
+HfTSNHhMdaH2W!`GPu^`Fn^"SF6@T>F8'eSFo6FYGPudbH2;jdHiAEiIK"]pJ,FisJcC?"KE$W)
+L&Qi,L]<20M>rG5MuJ\8N<#"<Nrb?)rfU`SPa.N"QC!u+R@9V7S=Q7CT:hmOU8+N\VPg>jWiE,$
+Xfek3Yd1UA[C3NQ\[f;a]Y2(p^qmn*`5Ta:aN;TJbg"GYcdC.ge'umuf@S[.g=k<:h;-rFi8ESR
+ioB([jlQL(!pAe2rosIJ!:0UMrpBaRr9sXSrUKaTrU]sZq"=UZr:g!]r;$<fpA=dcqYfg\JcEpn
+J,~>
+JcC<$JcGHDo)AUdrVZQirqcZjrV6Ees7ZEa!qc*Urpg-\nF6GG!Uf@SliHG;rojIIkPjTIjlGI^
+io0mpIG`o;h;$c=g=b03f@SU(eC;sqdF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(hd\[],W
+[^<BIZE^X;Y-"e+WiE%rVl$;dUS=HTT:VUDS"#h5R$X)'P`q8mOH5H^N/W[PM26qAL4t84Jq8H&
+Isl`mH[:!`G^"?LG'.nJEcH)<Df0H0Chmg$Bk_6oB4b^dA7PUJ!F]C8?O'nC?!LW=>?_#/s&f;&
+r`9&!!`W)sqaLHQlppS8n43IIr'g6Gp-\F<!*/qrr_rhhj@SK)rCQoUqaU<MrCHiXqF^]Zs%NDo
+rE&u!nPSUKpJ:QZs'>Y2qd9A2raG_6raYt=qdoe>rb).Brb;CIqeQ4Jrb_RN!FfL%<;fb^<;(Y6
+HfTSNHhMdaH2W!`GPu^`Fn^"SF6@T>F8'eSFo6FYGPudbH2;jdHiAEiIK"]pJ,FisJcC?"KE$W)
+L&Qi,L]<20M>rG5MuJ\8N<#"<Nrb?)rfU`SPa.N"QC!u+R@9V7S=Q7CT:hmOU8+N\VPg>jWiE,$
+Xfek3Yd1UA[C3NQ\[f;a]Y2(p^qmn*`5Ta:aN;TJbg"GYcdC.ge'umuf@S[.g=k<:h;-rFi8ESR
+ioB([jlQL(!pAe2rosIJ!:0UMrpBaRr9sXSrUKaTrU]sZq"=UZr:g!]r;$<fpA=dcqYfg\JcEpn
+J,~>
+JcC<$JcGHDo)AUdrVZQirqcZjrV6Ees7ZEas7?<_rpp*Z!:^!V,4=jcm-O'(lKRQski_*jjlGL_
+j5T%Ui8<DJh;-l@g=k64rmuYNe^W*tda?Ihcd'h\bfe2PaiVWF`l5p8_ns:,^q[Xu]tD"h\[f5Z
+[^NQLZa-j?YHG"/X/`1uVl-DfUnaZXTV%gHS=?"9R$a5*Q'@JqOcYWbNJrgSMM[.EL5(A6K7\Z)
+J:DuqI!^0cH$FOWG'%hIEcH)<Df0H0ChmesC2%BqBP1pgARo:\@U`bRra,_5?![G7!aAi3r`K;)
+=',?$!`dn*qki&En#$%Qr'g6Gp-\I=rnI>(rjh+"!4hC)rjVm:r'gKPpIG0QrCQfWrCd/a$2*r^
+oCDJBnaQ#Fc0imLc1oK_c25``b5tsU?Me+0@/aU4@fBm;AG]s<B)ZH@B`;`GCAVfHD#S;KD?4\:
+rlb/^o$-CBpNlX^ja?lNpNla_rHS-^rHA-^piQ@Rj`:3=pN6=UrHA!\rcnBeqKi-frd=TkrdOir
+r.+fus+:0$s+LE+rItB/Lku"d!fDnorepo<NfO+"!K`HCOo^c2rfpTOQ^F/.R[]e:SXuFFTV8'R
+USO]^VPgAlWiE,%Xfek3Z*L^C[C3NR\[f>b]Y2(p^r!t+`Poj;aN;TJbg"GYd*^7he'uq!f@S[.
+g=k<:h;-rFi8ESRro4%?jo4BDkNM./l2U&Kli-8MmJlVPn,DhUnbVhToDS=Up&4U^p\4I]q>C*_
+qu$BgrU'T8s2t@l~>
+JcC<$JcGHDo)AUdrVZQirqcZjrV6Ees7ZEas7?<_rpp*Z!:^!V,4=jcm-O'(lKRQski_*jjlGL_
+j5T%Ui8<DJh;-l@g=k64rmuYNe^W*tda?Ihcd'h\bfe2PaiVWF`l5p8_ns:,^q[Xu]tD"h\[f5Z
+[^NQLZa-j?YHG"/X/`1uVl-DfUnaZXTV%gHS=?"9R$a5*Q'@JqOcYWbNJrgSMM[.EL5(A6K7\Z)
+J:DuqI!^0cH$FOWG'%hIEcH)<Df0H0ChmesC2%BqBP1pgARo:\@U`bRra,_5?![G7!aAi3r`K;)
+=',?$!`bkbqg\Noqg\-dmsjtYrC6]RoL/C?oKr>H!/fcmq24Kpr'gKPpIG0QrCQfWrCd/a$*UM6
+XfSV)X/`2kR+@T*?!^k7?iOO5@JjU6A,g*:AcHBABDcHBC&_rFC]A5MD>S2ODlrc$hO4;/pNlX^
+ja?lNpNla_rHS-^rHA-^piQ@Rj`:3=pN6=UrHA!\rcnBeqKi-frd=TkrdOirr.+fus+:0$s+LE+
+rItB/Lku"d!fDnorepo<NfO+"!K`HCOo^c2rfpTOQ^F/.R[]e:SXuFFTV8'RUSO]^VPgAlWiE,%
+Xfek3Z*L^C[C3NR\[f>b]Y2(p^r!t+`Poj;aN;TJbg"GYd*^7he'uq!f@S[.g=k<:h;-rFi8ESR
+ro4%?jo4BDkNM./l2U&Kli-8MmJlVPn,DhUnbVhToDS=Up&4U^p\4I]q>C*_qu$BgrU'T8s2t@l~>
+JcC<$JcGHDo)AUdrVZQirqcZjrV6Ees7ZEas7?<_rpp*Z!:^!V,4=jcm-O'(lKRQski_*jjlGL_
+j5T%Ui8<DJh;-l@g=k64rmuYNe^W*tda?Ihcd'h\bfe2PaiVWF`l5p8_ns:,^q[Xu]tD"h\[f5Z
+[^NQLZa-j?YHG"/X/`1uVl-DfUnaZXTV%gHS=?"9R$a5*Q'@JqOcYWbNJrgSMM[.EL5(A6K7\Z)
+J:DuqI!^0cH$FOWG'%hIEcH)<Df0H0ChmesC2%BqBP1pgARo:\@U`bRra,_5?![G7!aAi3r`K;)
+=',?$!``/tr^H]Rmml_6ogf!N!(ZuWr'g6Gp-\I=pf.;diCW3'r^m#VqaU<MrCHlYq+CTYs%EDo
+r)Wbrr)!)aj&#JG"&<-.?Me+0@/aU4@fBm;AG]s<B)ZH@B`;`GCAVfHD#S;KD?4Zak>VF[l;[M(
+q0V4Nq0Vj^r-A6cq02d\rH7mWqK(b=qK)CQr,qs]q02g_rH\6crd4WlqgJHmrdXirs+13%r.G$&
+s+UE+!f)SfrJ:T5Mi7Rn!f`5#rf7)AOoCLEPEc'3=I,;@R$jD4S"-%@StD[LTq\<XUnsrdW2Zes
+X0&M,YHY:;Za@-K[^`lY]=bei^V@S$_Sa@3`lH0Bb0/#RcHaeadF-Lne^i@(f\,!4gYCW@hV[8L
+iSsjs!T`AAjoX`0kl0iHlMp2Lm/HDPmelPQnG_tSo)81Yo_8%WpAF[Zq#1$dqY'gar;-BZrdk*l
+s*t~>
+JcC<$JcGHDo)AUdrVZQirqcZjr:p<ds7ZHbs7H?_rpg-\nF6GG!Uf@SliHG;rojIIkPjTEjlHF$
+"leM!i8<Djh%nf#g=k64f@SU)e^W*tda?Ihcd'h\bl5e7b/q`Ga2Z*:_ns:,^q[Xu]tD"i\[f5Z
+[^NQLZa-j?YHG"/X/`1uVl-DfUnaZXTV%gHS=?"9R$a5*Q'@JqOcYWaNJrgSM2@%DL5(A6K7\Z)
+J:;opI!^0cH$FOWF`__HEcH)<Df0H0Chmg$Bk_6oB4b^dA7K+Y@UW[D?NOP>?2e(1>?Y50=oVV(
+=8l5#f`%btVt$Ya8,YpS7J'"@6h`nIh>H(-g\eVC\F7!&\GSen7e]FN8Gu-V9)VE^9F=M_nF,f5
+mHs9,cMGfVcM>`bbl5labl>lcbkK<[?Mn10@/j[5@fBm:AGg$=B)ZH@B`;`FCA_lHD#\ALDZ=YT
+j8R6tbk'*DbkQMZHf]YNHhVjbH2W!`GPu^`Fng(UF8'_KEVFMMF80kUFo?LZGQ)jcH2DpeHiAEi
+IK"]pJ,FisJcC?"KE$W)L&Hc+L]<20M>rG5MuJ\8N<#"<O8k:AOoCLEPEc'3<0il<R$jD3S"#q=
+St;RITqS3VUnsrdVl6SpX/rG*YHY79Za7$H[^WcW]">Vg^;%G!_SX71`Q-'@aihlOc-FY^dF$Fm
+eCE.%f@\g2gYCW@hV\=j$fU+*j5f=`k2tjikl0iHlMp2Lm/HDPmelPRnG_tSo)81Yo_A+WpAF[Z
+q#'scqY0mar;-BZrdk*ks*t~>
+JcC<$JcGHDo)AUdrVZQirqcZjr:p<ds7ZHbs7H?_rpg-\nF6GG!Uf@SliHG;rojIIkPjTEjlHF$
+"leM!i8<Djh%nf#g=k64f@SU)e^W*tda?Ihcd'h\bl5e7b/q`Ga2Z*:_ns:,^q[Xu]tD"i\[f5Z
+[^NQLZa-j?YHG"/X/`1uVl-DfUnaZXTV%gHS=?"9R$a5*Q'@JqOcYWaNJrgSM2@%DL5(A6K7\Z)
+J:;opI!^0cH$FOWF`__HEcH)<Df0H0Chmg$Bk_6oB4b^dA7K+Y@UW[D?NOP>?2e(1>?Y50=oVV(
+=8l5#TDj?7J,k)cJFA!]IfDq:7f,XH7.iqA6MR8RMW0KhMX62t7JoXL8,PpV8bu'X9E%Tc9rn8n
+ri#psWUcG.Qi:=h?iFI5@JjU6A,^$:AcHBABDcHBC&VlFC]8/MD>S5NDZQrAp6ad+r0[8*pj;+M
+q0Vj^rH\?dq02d\rH7mWqfDLPp2ThIqK)FRrH8'^q02g_rH\9drd4WlqgJHmrdXirs+13%r.G$&
+s+UE+s+gW1re^Z4!/pi8s,@#=rf@)@!0R8D!L&cIPuO'9R$a;1R[]e:SXuFFTV8'RUnjiaVl-Jm
+WiN5'Xfnt5Z*UdD[C3QS\[oDc]tV7r_8=(-`Pom=aN;WKbg"GZd*^7ieC<%"f@S[/g=tE=h;7&g
+i!\N'j5]4^jlY^gkNMp0s6BXMrp9XOs6fgRs7$$XqXXUVrUfmXr:^'_p\=[^r;-0bqu$<hmJ_\:
+ao?k~>
+JcC<$JcGHDo)AUdrVZQirqcZjr:p<ds7ZHbs7H?_rpg-\nF6GG!Uf@SliHG;rojIIkPjTEjlHF$
+"leM!i8<Djh%nf#g=k64f@SU)e^W*tda?Ihcd'h\bl5e7b/q`Ga2Z*:_ns:,^q[Xu]tD"i\[f5Z
+[^NQLZa-j?YHG"/X/`1uVl-DfUnaZXTV%gHS=?"9R$a5*Q'@JqOcYWaNJrgSM2@%DL5(A6K7\Z)
+J:;opI!^0cH$FOWF`__HEcH)<Df0H0Chmg$Bk_6oB4b^dA7K+Y@UW[D?NOP>?2e(1>?Y50=oVV(
+=8l5#;uT5a7dik27f#XO7fQ!W7f,XH7.iqA6MOR[9&iJC8EEG@7JoXL8,PpV8bu'X9E%Tc9i_!g
+oMGQbg/.cEra,M0ra>b7r*oY8rabq<s(;7Cr+Q(DrbD@HrbVUOqelFPs'X2Qpj2^^ja?lNpNld`
+rHS-^rHA-^piQCSpN#tIpN$+OpiQIWrHA!\rcnBeqg/6grd=TkrdOirr.+fus+:0$s+LE+rJ(?-
+s+pZ2s,$f7rf$l:!07&>s,[5CrfR;GPl?qIQC!u+R@9S6S"-%@StD[LTq\?YV5C/gW2ZetXKAV.
+YctC=Za@-K\%&u[]=bhk^V@V%_SjF4a2l?DbKJ,ScHjkbdF6Upe^i@(f\5'6gtgfChu;OAiSrnX
+jQ5Lck3(pkrosIJs6K[NrpBaRr9s[TrpfjUrU^![q"=RYr:fs\r;$9ep\XjcqYfg\JcEjlJ,~>
+JcC<$JcGHDo)ARcrquWis8)`jrV6Ees7ZEa!qc*Urpp*Z!:^!V(%1JVm-O'(lKRQski_*jjlGL_
+j5T%si.'Y@h;-l@gY1B7f[na+e^`1!e'cXkd*L"_c-4ASb0%iIaN)<>`P]R0_8*h#^:h1l]=GJ^
+\$i`PZa6sBYck43XK/A$W2HPjUnjc[TqJ$LSXc1=R@'A.Q'IStP*(ieNfB!VMi!:HLPCM9K7ec,
+J:E#rI=-BfH?jaZG'3h,%<HQ0EH#i6DJa3*CMIS_BE`$\AS#C^raGn:@/aL7?<pk9>QS,5>5h\)
+=T;J&<WLauVu*@iV>R4i8,PjS7Irq@6hj"Ch#P%a\`C9h\bWc57JfRK8,Z!W8bl!X9DqNa:&XDX
+lMg&JcMYrWcM>`\bjWaT?Mn10@/aU4@fKs;AGg$<B)ZH@B`DfGCA_lHD#S;LDZ4PTE9$l>qTSTV
+l-/pKpj;+Mq0Vj^rH\?dq02g]rH7mWqfDRRn8\8EqfDOSrH8'^qKMp`rd"BerHnQlqgJHmrdXir
+s+13%r.G$&s+UE+s+gW1re^Z4s,6l8s,@#=rf@)@!0R8D!L&cIQ!'E>R$a;0R[]e:SXuFFTV8'R
+USO]^VPgAlWiE,$Xfek3Yd1UA['mEP\@K2_]Y2%o^qmn*`5T^9aN2NIbKS8Wcd:(fe'umtf%8R-
+g=k<:h;-rFi8ESRro4%?jo4BDkNM./klU/9li$/MmJcPPn,DhUnb_nUoDS=Vp&+O]p\4I\q>C*_
+qtp<frTsN7s2k:k~>
+JcC<$JcGHDo)ARcrquWis8)`jrV6Ees7ZEa!qc*Urpp*Z!:^!V(%1JVm-O'(lKRQski_*jjlGL_
+j5T%si.'Y@h;-l@gY1B7f[na+e^`1!e'cXkd*L"_c-4ASb0%iIaN)<>`P]R0_8*h#^:h1l]=GJ^
+\$i`PZa6sBYck43XK/A$W2HPjUnjc[TqJ$LSXc1=R@'A.Q'IStP*(ieNfB!VMi!:HLPCM9K7ec,
+J:E#rI=-BfH?jaZG'3h,%<HQ0EH#i6DJa3*CMIS_BE`$\AS#C^raGn:@/aL7?<pk9>QS,5>5h\)
+=T;J&<WJcJJFA!^If;k87f5^H7.s"C6N3_ZU&C_aMW0KgMXQE"7JfRK8,Z!W8bl!X9DqNa:&([W
+R+Rc*?Mn10@/aU4@fKs;AGg$<B)ZH@B`DfGCA_lHD#S;LDZ4PTE3/`"i0jP2pj2^^ja?lNpNld`
+rHS-^rc\6_piQCSq/YtEq/Z@RpiQIWrHA$]rcnEfqg/3fs*X]lrdOirr.+fus+:0$s+LE+rJ(?-
+s+pZ2s,-i7rf$l:!07&>s,[5CrfR;GPl?qNQC!u+R@0M5S"-%@StD[LTq\<XUnsrdW2ZesX/rG+
+YHY7:Za7$I[^WcW]">Vg^;%J"_Sa=2`Q-'@b0.uPcHab_dF-LneCE.%f\,!4gYCW@hV[8LiSsjs
+!T`AAjoX`0kl0fJlKdd7li?GPmeuVRnG_tTo)81Yo_A+WpAF[Zq#'scqY'g`r;-BYrdk*ks*t~>
+JcC<$JcGHDo)ARcrquWis8)`jrV6Ees7ZEa!qc*Urpp*Z!:^!V(%1JVm-O'(lKRQski_*jjlGL_
+j5T%si.'Y@h;-l@gY1B7f[na+e^`1!e'cXkd*L"_c-4ASb0%iIaN)<>`P]R0_8*h#^:h1l]=GJ^
+\$i`PZa6sBYck43XK/A$W2HPjUnjc[TqJ$LSXc1=R@'A.Q'IStP*(ieNfB!VMi!:HLPCM9K7ec,
+J:E#rI=-BfH?jaZG'3h,%<HQ0EH#i6DJa3*CMIS_BE`$\AS#C^raGn:@/aL7?<pk9>QS,5>5h\)
+=T;J&<WH(p7e9.17fQ!P7fGpU7f5^H7.s"C6N1$_<W,P28c2$S7e]FO8Gu-U9)_K^9E7f^<6.o9
+?Mn10@/aU4@fKs;AGg$<B)ZH@B`DfGCA_lHD#S;LDZ4PTE*pskpj2^^ja?lNpNld`rHS-^rc\6_
+piQCSq/YtEq/Z@RpiQIWrHA$]rcnEfqg/3fs*X]lrdOirr.+fus+:0$s+LE+rJ(?-s+pZ2s,-i7
+rf$l:!07&>s,[5CrfR;GPl?qNQC!u+R@0M5S"-%@StD[LTq\<XUnsrdW2ZesX/rG+YHY7:Za7$I
+[^WcW]">Vg^;%J"_Sa=2`Q-'@b0.uPcHab_dF-LneCE.%f\,!4gYCW@hV[8LiSsjs!T`AAjoX`0
+kl0fJlKdd7li?GPmeuVRnG_tTo)81Yo_A+WpAF[Zq#'scqY'g`r;-BYrdk*ks*t~>
+JcC<$JcGHDo)ARcrquWis8)`jrV6Ees7ZEas7?<_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA
+isOf)i8EMMhVI#Cg]#n1g"=p.f%'cLJ()indEp4bcHXSVbK@rKaN2EA`Pf[2_SO%&^V7Co]Xt_b
+\@8oT['R*EZ*:F7XfSS'Wi2hnVPL#_U7n6PSt2C@S!fY2QBd`"PEM&iO,f3YN/NOLLkg_=KS+o/
+JUi6!I=6KiH?sg[GBS+NFE;JBEH#i6DJa3*CMIQsB`D]JAn>OaA,]p<@:9(A!a]/<r`fM/>$Co.
+s&f;&!ERdtVu*@iV>d@i8,PjS7Irq?6i'+MhVJ(crOV^5laZAnqmcPmr'pENr(-cXqF^]Zr_3>d
+r941Fs60I-rQY2a!71Meq9A`Zq9/`Zqof"Gqd9A2raG_6raYt=qdoe>rb).Brb;CIqeQ4Jrb_OM
+rbhgVj87$qbk96GbkQMZHff_OHhVjaH2W!aGPu^`Fnp.WF8BqCEVa_RF80kVFo?L[GQ)jdH2Dpe
+HiAEjIK"]pJ,FisJcC?"KE$W)L&Hc+L]<2/M#rQmMuJ\8NW5%<NsCc/OcklkPEc'3!LB)OQsZ8M
+S"#q=St;RITqS3UUnjiaVl-JmWiN5'Xfek3Z*L^C[C3NR\[f;a]Y2%o^qmn*`5Ta:aN;TJbK\>X
+cd:(fe'umuf@S[.g=k<:h;-rFi8ESRj5]4]jlY^gkNMp0s69UMrTsROs6fjSrp]sXqss^WrUfmX
+r:^'_pA"R]r;--aqY^3gmJ_\:aT$b~>
+JcC<$JcGHDo)ARcrquWis8)`jrV6Ees7ZEas7?<_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA
+isOf)i8EMMhVI#Cg]#n1g"=p.f%'cLJ()indEp4bcHXSVbK@rKaN2EA`Pf[2_SO%&^V7Co]Xt_b
+\@8oT['R*EZ*:F7XfSS'Wi2hnVPL#_U7n6PSt2C@S!fY2QBd`"PEM&iO,f3YN/NOLLkg_=KS+o/
+JUi6!I=6KiH?sg[GBS+NFE;JBEH#i6DJa3*CMIQsB`D]JAn>OaA,]p<@:9(A!a]/<r`fM/>$Co.
+s&f;&!EPiIJFS-aIf)_67f5^H7.iqD63*hZU]7%gMt;hlM><%uM>Tg?7e]FN8Gu-V9)VE^9`Iid
+Vu*F^R,jV4QM[$K?Me+0@/aU4@fBm;AG]s<B)ZH@B`;`GCAVfHD#S;KDZ4PTE3/YuigKb4pj2^^
+k'ZuOpNla_rHS0_rHA-^q/lOUqJtnAqJuLTpiQLXrHA$]rcnEfqg/6grd=WlrdOirr.+fus+:0$
+s+LE+rJ(?-s+pW1!fDnorf$l:s,R)>#EY(1P*2#mPl?pKQC%T<?^[@PS"-%@StD[LTq\<XUnsrd
+Vl6SpX/rG*Y-5(7ZEppG[^N]V\[oGd]tV7s_8=+.`Q#s>ai_fMc-FV\d*^:jeC<($f@\d1g=tE=
+h;7&Ii8N\Uj5f:_k2tjikl0iHl2^/Km/QJQmeuVRnGi%Uo)81Yo_A+WpAF[Yq#'scqY'g_r;-BZ
+rdk*js*t~>
+JcC<$JcGHDo)ARcrquWis8)`jrV6Ees7ZEas7?<_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA
+isOf)i8EMMhVI#Cg]#n1g"=p.f%'cLJ()indEp4bcHXSVbK@rKaN2EA`Pf[2_SO%&^V7Co]Xt_b
+\@8oT['R*EZ*:F7XfSS'Wi2hnVPL#_U7n6PSt2C@S!fY2QBd`"PEM&iO,f3YN/NOLLkg_=KS+o/
+JUi6!I=6KiH?sg[GBS+NFE;JBEH#i6DJa3*CMIQsB`D]JAn>OaA,]p<@:9(A!a]/<r`fM/>$Co.
+s&f;&!EN.p7efL&7f5dS7f5^H7.iqD6MX[W9&</.8GkpS7e]FN8Gu-V9)VE^9`Iib<<#tu<rZ%i
+:]OAP;#O2e;#al!?iOO5@JjU6A,g*:AcHBABDcHBC&_rFC]A5MD>S5MDZOfacrBddpj;.Nq0Vj^
+r-A6cqKMm]rH7pXr,_^TlZ)cAr,_XTrcS0_qKMp`rd"Berd4Wlr-eQnrdXirs+13%r.G$&s+UE+
+s+gW1rJ:T5Mi7Rns,I&=rf7;GOcbfiPEV71Pl[2;rg7&\R[]e:SXuFFTV8'RUSO]^VPg>jWN*##
+Xf\b0Yd(L?['d?N\@K/]]Y(ql^VI\&_o0O6a2lBFbKJ/UcHjkbdaQ^qf%8O+g"P07gtgfChr*GO
+ioB([jQ5OdkND(.l2U#Kli$2MmJlVQn,DhVnb_nUoDS=Vp&+O]p\+C[q>C*_qtg6erU'T8s2b4j~>
+JcC<$JcGHDo)ARcrVZQirqcZjrV6Bd!;?Bas7H?_rpg-\nF6GG!Uf@Sm/QAblKRQski_*jjlPR`
+j5T(Wi8EMLrnRq:gY1B7g"=p.f%'cLJ()indEp4bcHXSVbK@uLaN2EA`Poa3_SO%&^V7Co]Xt_b
+\@8oT['R*EZ*:F7XfSS'Wi2hnVPL#_U7n6PSt2C@R[KP1QBd`"P*1rhO,f3YN/EIKLkg_=KS+o/
+JUi6!I=6KiH?jaZGBS+NFE;JBEH#i6DJa3*CMIQsB`D]JAn>OaA,]pB@:3JM?X@&Er`oJ-!*]>(
+s&]8&d\lf9rMBOkqa^QRr'g0EnjEFDq;1kWo""D&m^`;+r'gKPpIG0Qr(6`WrCd,`r_<CT!9jCE
+rQbGfq9Juar6G,_q98ZXpWEMBr*TG2s'bh7raYq<r+5n?rb).Brb;@Hr+l:Js)%XNrbqdTq9/WY
+p<E*Nrlb;bpj2^^k'ZuOpNld`rHS-^rHA0_piQFTqJtnAqJuLTq/lRXrc\-^rcnEfqg/9hrd=Wl
+rdOirr.+fus+:0$s+LE+rJ(?-s+pW1s,$f7rJ^c9!07&>s,[5Crf[;F!0mJJ!LB)OQr09?S"#q=
+SXuFFTV8'RUSO]^VPgAlWiE,$Xfek3Yd(O@['d?O\@K2_]Y(tn^VI_'_o9U7a2lBFbKS5VcHstd
+daQ^rf%8O+g"P07h;-rFrnmt=ioB([jo4BJkNM-ol0@R"li-8NmJlVQn,MnVnb_nVoDS=Vp&+O]
+p\4I[q>C*^qtp<frTsN7s2Y.i~>
+JcC<$JcGHDo)ARcrVZQirqcZjrV6Bd!;?Bas7H?_rpg-\nF6GG!Uf@Sm/QAblKRQski_*jjlPR`
+j5T(Wi8EMLrnRq:gY1B7g"=p.f%'cLJ()indEp4bcHXSVbK@uLaN2EA`Poa3_SO%&^V7Co]Xt_b
+\@8oT['R*EZ*:F7XfSS'Wi2hnVPL#_U7n6PSt2C@R[KP1QBd`"P*1rhO,f3YN/EIKLkg_=KS+o/
+JUi6!I=6KiH?jaZGBS+NFE;JBEH#i6DJa3*CMIQsB`D]JAn>OaA,]pB@:3JM?X@&Er`oJ-!*]>(
+s&]8&fmrUBq0r32r'pTQnjN%9s$HOWpP\-j!/p0#r'gKPpIG0Qr(6`WrCd,`r_3BjqPa"Qrg*VP
+jd5_-s'GV1ra>b7r*oY8rabq<s(;7Cr+Q(DrbD@HrbVUOqelCOrc%FqigKe5pj2^^k'ZuOpNld`
+rHS-^rHA0_piQFTqJtnAqJuLTq/lRXrc\-^rcnEfqg/9hrd=WlrdOirr.+fus+:0$s+LE+rJ(?-
+s+pW1s,$f7rJ^c9!07&>s,[5Crf[;F!0mJJ!LB)OQr09?S"#q=SXuFFTV8'RUSO]^VPgAlWiE,$
+Xfek3Yd(O@['d?O\@K2_]Y(tn^VI_'_o9U7a2lBFbKS5VcHstddaQ^rf%8O+g"P07h;-rFrnmt=
+ioB([jo4BJkNM-ol0@R"li-8NmJlVQn,MnVnb_nVoDS=Vp&+O]p\4I[q>C*^qtp<frTsN7s2Y.i~>
+JcC<$JcGHDo)ARcrVZQirqcZjrV6Bd!;?Bas7H?_rpg-\nF6GG!Uf@Sm/QAblKRQski_*jjlPR`
+j5T(Wi8EMLrnRq:gY1B7g"=p.f%'cLJ()indEp4bcHXSVbK@uLaN2EA`Poa3_SO%&^V7Co]Xt_b
+\@8oT['R*EZ*:F7XfSS'Wi2hnVPL#_U7n6PSt2C@R[KP1QBd`"P*1rhO,f3YN/EIKLkg_=KS+o/
+JUi6!I=6KiH?jaZGBS+NFE;JBEH#i6DJa3*CMIQsB`D]JAn>OaA,]pB@:3JM?X@&Er`oJ-!*]>(
+s&]8&pI>'Ncpmn&r'pTQnjN%9s$HN^pIa:6nOWRHqaU<MrCHiXqF^]Zr_3;cs&B"urDrnqqGH'F
+pJ:fqr*TG2s'bh7raYq<r+5n?rb).Brb;@Hr+l:Js)%XNrbqdTcrBddpj;.Nq0Vj^rH\?dq02d\
+rcS!Xr,_^TlZ)cAr,_[UrH8*_qKMp`rd"Bes*O`mr-eQnrdXirs+13%r.G$&s+UE+s+gW1rJCQ3
+!/pf7s,@#=rf@)@!0R8Ds-!GIrfmMMQi<@LR@9V7S=Q4BStD[LTq\<XUnsrdW2ZesX/rG+YHY79
+Za7$H[^WcW]">Vf^;%Fu_SX40`Q#s>ai_fNc-FV]dF$CkeCE.%f@\d1g=tH>hV\=j"l\J$j5f>$
+jp:/6kiq?slKdd8m/QJQmeuVSnG_tTo)A7Zo_A+WpAF[Zq"smbqXsa_r;-BYrdk*is*t~>
+JcC<$JcGHDo)ARcrVZQirqcZjr:p<ds7ZEa!qc*Urpp*Z!:^!Vs6]mSrp0[OlMg#Zki_-kk2k[b
+j5].XiS`YOhYu=<gtUQ:g"G$0f@JLOe:5rqdF$=ecHa\Ybfe2PaiMQD`l5p8_ns:+^V@Lr]Y(kf
+\[],W[^<BIZE^X;Y-"e+WiE"qVl$8cUS=HTT:VUDS!ob4R$O#&P`h2lOH5E]N/WXNM26qAKnP)2
+Jq/B$IXQWlH[9s^GB\4QFEDSEEH,r9DJj<-CMR[!BP@EY%q]BaA7K+Y@UWYP?XI,G?2e+/>Q7n+
+=oVUTVt-__V#[Cg8,YpS7Iik;6i#R=]BHia\c92<7JfRK8,PpV8bl!X9DqQ`:&jAUjo=KCjo!C(
+c2#ZUc2#TZbP''Y?Me+0@/aU4@fBm;AGg$<B)ZH@B`;`GCAVfHD#S;KDZ4SRDue&VbPBBVc19*V
+bQ#f]HM;dMI//-_HMr-fGkuX_G5ZRZFSp4WEp%H>ErC(TFT$@]G5HL_GlE!dHN&9kI/A?lIf=iq
+JGt-"K)C9$K`?c)LB!&/M#E21MZ8V6N;nn;NrG(@OHG\)Op@28Pa.N"QC%T<<gfDGS"-">St;RI
+TqS3UUnjiaVl-JmWiE/&Xfek3Z*L^B['mEP\@K2_]Y2%o^VRe(_o9U7aN2KGbKS5VcHstddaQ^r
+f%8O+g"P39h;-rFi8ESRro4%?jo4BCkNMp0!p]+;rp9[Ps6fjSs7$$Xr:9gXrq-!YrV$-_p\=X]
+qtg$`qY^3gm/DS9`rCP~>
+JcC<$JcGHDo)ARcrVZQirqcZjr:p<ds7ZEa!qc*Urpp*Z!:^!Vs6]mSrp0[OlMg#Zki_-kk2k[b
+j5].XiS`YOhYu=<gtUQ:g"G$0f@JLOe:5rqdF$=ecHa\Ybfe2PaiMQD`l5p8_ns:+^V@Lr]Y(kf
+\[],W[^<BIZE^X;Y-"e+WiE"qVl$8cUS=HTT:VUDS!ob4R$O#&P`h2lOH5E]N/WXNM26qAKnP)2
+Jq/B$IXQWlH[9s^GB\4QFEDSEEH,r9DJj<-CMR[!BP@EY%q]BaA7K+Y@UWYP?XI,G?2e+/>Q7n+
+=oVUVJFS-cIecM47f,XF7.N_@UrSDmMZ$!@7e]FN8Gu-U9)_K^9`@c`W;ideR,XJ+Q2k7g?iOO5
+@JjU6A,g*;Ac?<@BDcHBC&_rFC]A5MD>S5MDuO\UQgpI(RJrTKHM;dMI//-_HMr-fGkuX_G5ZRZ
+FSp4WEp%H>ErC(TFT$@]G5HL_GlE!dHN&9kI/A?lIf=iqJGt-"K)C9$K`?c)LB!&/M#E21MZ8V6
+N;nn;NrG(@OHG\)Op@28Pa.N"QC%T<<gfDGS"-">St;RITqS3UUnjiaVl-JmWiE/&Xfek3Z*L^B
+['mEP\@K2_]Y2%o^VRe(_o9U7aN2KGbKS5VcHstddaQ^rf%8O+g"P39h;-rFi8ESRro4%?jo4BC
+kNMp0!p]+;rp9[Ps6fjSs7$$Xr:9gXrq-!YrV$-_p\=X]qtg$`qY^3gm/DS9`rCP~>
+JcC<$JcGHDo)ARcrVZQirqcZjr:p<ds7ZEa!qc*Urpp*Z!:^!Vs6]mSrp0[OlMg#Zki_-kk2k[b
+j5].XiS`YOhYu=<gtUQ:g"G$0f@JLOe:5rqdF$=ecHa\Ybfe2PaiMQD`l5p8_ns:+^V@Lr]Y(kf
+\[],W[^<BIZE^X;Y-"e+WiE"qVl$8cUS=HTT:VUDS!ob4R$O#&P`h2lOH5E]N/WXNM26qAKnP)2
+Jq/B$IXQWlH[9s^GB\4QFEDSEEH,r9DJj<-CMR[!BP@EY%q]BaA7K+Y@UWYP?XI,G?2e+/>Q7n+
+=oVU?7eoRQ7f,XF7.N_@<rGVc8cVHT9'o4@8Gu!S7e]FN8Gu-U9)_K^9`@`d<Vfbp;u0Dk;;tFG
+:B4_u?iOO5@JjU6A,g*;Ac?<@BDcHBC&_rFC]A5MD>S5MDuO\U<RFe@HM;dMI//-_HMr-fGkuX_
+G5ZRZFSp4WEp%H>ErC(TFT$@]G5HL_GlE!dHN&9kI/A?lIf=iqJGt-"K)C9$K`?c)LB!&/M#E21
+MZ8V6N;nn;NrG(@OHG\)Op@28Pa.N"QC%T<<gfDGS"-">St;RITqS3UUnjiaVl-JmWiE/&Xfek3
+Z*L^B['mEP\@K2_]Y2%o^VRe(_o9U7aN2KGbKS5VcHstddaQ^rf%8O+g"P39h;-rFi8ESRro4%?
+jo4BCkNMp0!p]+;rp9[Ps6fjSs7$$Xr:9gXrq-!YrV$-_p\=X]qtg$`qY^3gm/DS9`rCP~>
+JcC<$JcGHDnc&LcrVZNhs8)`jrV6Ees7ZEas7?<_rUL$[nF6GG#O_!Hm-O'(lMg#Kki_s-!TiDA
+irS/urnmh7hYu=<gtUQ:g"=s/f@JLOe:5rqdF$=ecHa\Ybfe2PaiMQD`l5p8_ns7*^V@Lr]Y(ke
+\[],W[^<BIZE^X;Y-"e+WiE"qVl$8cUS4BST:VUDS!ob4R$O#&P`h2lOH5E]N/WXNM26qAKnP)2
+Jq/B$IXQWlH[9s^GB\4QFEDSEEH,r9DJj<-CMR[!BP@EY$>*j\A7K+Y@UWYPra,_5?![G7!aAi3
+rE9/&s&T2$go'Y=rMBNbq+(?Pr'g-DoL&N4s53gfl+5f`!4_trqaU<MrCHiXqF^]Zr_38brT!t=
+ro=(*p!3*Pq98ZXp<!AAr*TG2s'be6s'u%=r+5k>s(D7Crb;@Hr+l:Jrb_RNrbqdTqf)UVrQG#\
+ps&ESqTAl_pNlU]k^<2Qp3Q[_rHS0_rHA0_q/lOUqf:h=qf;UUqK2^Zrc\0_rcnEfr-J?hs*X`m
+rdOlsr.+fus+:0$s+LE+rJ(?-s+pW1s,-i7rf$l:s,R)>s,[5Crf[;F!0mJJs-<YOrg7;cR[]e:
+S=Q7CT:hmOU8+N[V5C/gW2ZesX/rG*YHY79ZEppG[^NZU\[oDc]tV7s_8=+.`Pom=aN;WKbg"GZ
+d*^7ieC<%"f@\d1g=tE=h;7&Ii8N\Uj5f=`k2tjjkiq?slKeE8!q#FDrU9dUrpfpWrq$*\q=X^[
+r:fmZr;$6dp&"U`qYfd[JcE^hJ,~>
+JcC<$JcGHDnc&LcrVZNhs8)`jrV6Ees7ZEas7?<_rUL$[nF6GG#O_!Hm-O'(lMg#Kki_s-!TiDA
+irS/urnmh7hYu=<gtUQ:g"=s/f@JLOe:5rqdF$=ecHa\Ybfe2PaiMQD`l5p8_ns7*^V@Lr]Y(ke
+\[],W[^<BIZE^X;Y-"e+WiE"qVl$8cUS4BST:VUDS!ob4R$O#&P`h2lOH5E]N/WXNM26qAKnP)2
+Jq/B$IXQWlH[9s^GB\4QFEDSEEH,r9DJj<-CMR[!BP@EY$>*j\A7K+Y@UWYPra,_5?![G7!aAi3
+rE9/&s&T2$gjnpErdOlss%)rUr'pTQnO3":rM0=e`/FR_qaU<MrCHiXqF^]Zr_38brMTUkoU,6:
+qj-oAp6G\br*TG2s'be6s'u%=r+5k>s(D7Crb;@Hr+l:Jrb_RNrbqdTqf)UVopFg.s-WP,pj;4P
+q0Vg]rH\?dqKMm]rcS$Yr,_aUk&L9=r,_^VrcS3`qfi$ard"Efrd4Zmr-eQns*srss+13%r.G$&
+s+UE+s+gW1rJCQ3s,6l8s,I&=rf@)@!0R8Ds-!GIrg!ML!13\PAso*WS"-">St;RITqS3UUnjia
+Vl-JmWiE,$Xf\e2Yd(L?['d?N\%0&\]=bhk^VI\&_o0O5a2l?DbKJ,ScHjkbdF6Upe^i@)g"P07
+gtgfChr*GOioB([jlPXekNM-ol0@R"rTjUQmdC&Bs7$$Xr:9jYrUfpYrV$0`p%\I\qtg!_qY^3g
+m/DS9`W(G~>
+JcC<$JcGHDnc&LcrVZNhs8)`jrV6Ees7ZEas7?<_rUL$[nF6GG#O_!Hm-O'(lMg#Kki_s-!TiDA
+irS/urnmh7hYu=<gtUQ:g"=s/f@JLOe:5rqdF$=ecHa\Ybfe2PaiMQD`l5p8_ns7*^V@Lr]Y(ke
+\[],W[^<BIZE^X;Y-"e+WiE"qVl$8cUS4BST:VUDS!ob4R$O#&P`h2lOH5E]N/WXNM26qAKnP)2
+Jq/B$IXQWlH[9s^GB\4QFEDSEEH,r9DJj<-CMR[!BP@EY$>*j\A7K+Y@UWYPra,_5?![G7!aAi3
+rE9/&s&T2$a%$)"q+(?Pr'g-DoL&IU!*B"gqapi[oLeLBo18gKqaU<MrCHiXqF^]Zr_38bq,[/e
+!)iPglVR:N!+,S1ra>b7qdTS8rabq<rau1Cr+Q(DrbD@HrbVRNr,2LPrc%aS!-6XipNlU]k^<2Q
+p3Q[_rHS0_rHA0_q/lOUqf:h=qf;UUqK2^Zrc\0_rcnEfr-J?hs*X`mrdOlsr.+fus+:0$s+LE+
+rJ(?-s+pW1s,-i7rf$l:s,R)>s,[5Crf[;F!0mJJs-<YOrg7;cR[]e:S=Q7CT:hmOU8+N[V5C/g
+W2ZesX/rG*YHY79ZEppG[^NZU\[oDc]tV7s_8=+.`Pom=aN;WKbg"GZd*^7ieC<%"f@\d1g=tE=
+h;7&Ii8N\Uj5f=`k2tjjkiq?slKeE8!q#FDrU9dUrpfpWrq$*\q=X^[r:fmZr;$6dp&"U`qYfd[
+JcE^hJ,~>
+JcC<$JcGECo)ARcrquWirqcZjr:p<ds7ZHbs7H?_rpp*Z!:^!Vs6]mSrp0mUlK[Wukih4/joOT)
+ro4%=iVqaGhqm2Fgt^Z<g=b-2f@SU(rmV,#da?Ihci24=c-4ASb/q`Ga2Z*;`5BI/_8!b!]tD"i
+]",>[[^NTMZa-j?YHG"/X/`1uVl-DfUnaWWTV%gHS=>t8R$a2)Q'@GpOcYWaNJrdQM2@%DL4t;5
+K7\W(IsufoI!^0bG^"@TF`__HEcH)<Df0H0Chmg$BkV0mB4b^dA7K-L@fKj:@/aL7?<pk9>lS".
+>5_V(=T;J#<rZ2!<<#n[VspS_V>a$\8,YpS7I`e>6i,[;]@a^c\c"to7eT@N8Gu-U9)_K^9`.W^
+ir\;fch>ZTc2#TZbOs$T?iOO5@JjU6A,g*;Ac?<@BDcHCC&VlFC]8/LD>S5MDuXeQEW1"XF8^4Z
+bkTHUbkK<UHM;dOI/&'_HMi'fGklR_G5ZRZFT$:YEoV0:ErC(UFT-F^G5HL`GlE!dHN/?kI/JEm
+IfFoqJH(3#K)C9$K`?c)LB!&/M#E21MZ8V5Muo!!Nr>"?OHG\)P5g^GPl?pZQC!r*R$jA2S"#q<
+SXuFFT`1W[U8+N[V5C/gW2ZetXKAV-YHY7:Za7$H[^WcW\\#Me]t_=t_8=+.`Q#s>aND]Lbg+M[
+d*^:jeC<%"f@\d1g=tE=h;7&Ii8N\Uj5f>$joOZ/rojLLlg+Q:s6]jSrpTmVrpfpWrq$-]q=X^[
+r:fp[qt^-co_\O`q>K[ZJcE[gJ,~>
+JcC<$JcGECo)ARcrquWirqcZjr:p<ds7ZHbs7H?_rpp*Z!:^!Vs6]mSrp0mUlK[Wukih4/joOT)
+ro4%=iVqaGhqm2Fgt^Z<g=b-2f@SU(rmV,#da?Ihci24=c-4ASb/q`Ga2Z*;`5BI/_8!b!]tD"i
+]",>[[^NTMZa-j?YHG"/X/`1uVl-DfUnaWWTV%gHS=>t8R$a2)Q'@GpOcYWaNJrdQM2@%DL4t;5
+K7\W(IsufoI!^0bG^"@TF`__HEcH)<Df0H0Chmg$BkV0mB4b^dA7K-L@fKj:@/aL7?<pk9>lS".
+>5_V(=T;J#<rZ2!<<#n[JF.jc8GG^R7f,XE7.s"EUYUh.N9Q9!7JfRJ8,Z!W8bl!X9DqQ^:&:aZ
+R.?U9QN!6DQMY%h@/aU4@fBm;AGg$<B)ZH@B`DfGCA_lHD#S;KDZ4SSE;FSRErL.YFT%TgRJrTK
+HM;dOI/&'_HMi'fGklR_G5ZRZFT$:YEoV0:ErC(UFT-F^G5HL`GlE!dHN/?kI/JEmIfFoqJH(3#
+K)C9$K`?c)LB!&/M#E21MZ8V5Muo!!Nr>"?OHG\)P5g^GPl?pZQC!r*R$jA2S"#q<SXuFFT`1W[
+U8+N[V5C/gW2ZetXKAV-YHY7:Za7$H[^WcW\\#Me]t_=t_8=+.`Q#s>aND]Lbg+M[d*^:jeC<%"
+f@\d1g=tE=h;7&Ii8N\Uj5f>$joOZ/rojLLlg+Q:s6]jSrpTmVrpfpWrq$-]q=X^[r:fp[qt^-c
+o_\O`q>K[ZJcE[gJ,~>
+JcC<$JcGECo)ARcrquWirqcZjr:p<ds7ZHbs7H?_rpp*Z!:^!Vs6]mSrp0mUlK[Wukih4/joOT)
+ro4%=iVqaGhqm2Fgt^Z<g=b-2f@SU(rmV,#da?Ihci24=c-4ASb/q`Ga2Z*;`5BI/_8!b!]tD"i
+]",>[[^NTMZa-j?YHG"/X/`1uVl-DfUnaWWTV%gHS=>t8R$a2)Q'@GpOcYWaNJrdQM2@%DL4t;5
+K7\W(IsufoI!^0bG^"@TF`__HEcH)<Df0H0Chmg$BkV0mB4b^dA7K-L@fKj:@/aL7?<pk9>lS".
+>5_V(=T;J#<rZ2!<<#nG7fGsR8,YpS7I`e>6i'jY8c)-@8cM?[8bP^R7JfRJ8,Z!W8bl!X9DqQ^
+:&e5k<qK>e;YEu[;"[W]?iOO5@JjU6A,g*;Ac?<@BDcHCC&VlFC]8/LD>S5MDuXeQEW1"XF8^4;
+<;:e6Hg6"RHhVjaH2`'aGQ)daFnp.XF8U(=EVjeTF8C"XFoHR]GQ2peH2N!gHiAEjIK+crJ,Fis
+JcC?"KE$W)L&Hc+L]<2/M>rJ5MuAS9NK0%tNrkE*OoCODP5pjHPn97JQ^F/.R@9V7S=H.AStD\T
+Th_>WUnjiaVl-JmWiN5'Xfek3Yd1UA['d?O\@K/^]Y(qm^VI\&_o0O6a2l?EbKJ,TcHjkbdaQ^q
+e^i@)g"P07gtgfChr*GOioB([jo4BCkNMp0!p]+;rp9[Ps6fmTs7$$Xr:9jYrq-$ZrV$0`pA"O\
+qtfs^qu$9gm/DS9`;b>~>
+JcC<$JcGECo)ARcrVZQirqcZjr:p<ds7ZEas7?<_rUL$[nF6GG#O_!Hm-O'(lMg#iki_-kk2k^c
+j5].YiS`YOhqm2Fgt^Z<g=b-2f@SU(rmV,#da?Ihci243c-4ASb/q`Ga2Z*;`5BI/_8!b!]tD"i
+]",>[[^NQLZa-j?YHG"/X/`1uVl-DfUnaWWTV%gHS=>t8R$X,(Q'7AoOcYWaNJrdQM2@%CL4t;5
+K7SQ'IsufoI!U*aG^"@TF`__HEcH)<Df0H0Chmg$C&VcRB4b^dA7T1Z@UW\Qra5\3!+#S/s',M,
+rE9/&s&]/"r`/ttqc!Jlr_WYlnYboS!i8I[r^cfSrC6ZQn3m%=!oDhlrSIF`be!hbrC-TQpIG-P
+rCQiXrCd,`qb?qH!6t5_n]gmRq9/HRr*TG2s'be6s'u%=r+5k>s(D7Crb;@Hr+l:Jrb_RNrbqdT
+qf2RTrc@pXrH8*_rlt/\p<35WpNu1Qq0Vg]rH\?dqKMm]rH7sYrH%jVic4m:rH%jXrH8-`qfi'b
+rd"Efs*O`mrI+]prdXlss+10$rIb-'s+UE+s+gW1rJCQ3s,6i7s,@#=rK$u?!0R8Ds-*JIrfmMM
+Qi<BPR:2PRS"-">St;RITV8'RUSO]^VPg>jWN)u!XKAV-YctC<Za7'J[^WcW]">Vf^;%Fu_SX4/
+`Q#s>ai_fMc-FV\d*^:jeC<($f@\d1g=tE=hV[8LiSrkWj5f=ak3(pkrojIKli-8NmJlVRn,MnV
+nbhtXoD\CXp&4U^p\+CZq>:$\qtg6drTjH6s2=qf~>
+JcC<$JcGECo)ARcrVZQirqcZjr:p<ds7ZEas7?<_rUL$[nF6GG#O_!Hm-O'(lMg#iki_-kk2k^c
+j5].YiS`YOhqm2Fgt^Z<g=b-2f@SU(rmV,#da?Ihci243c-4ASb/q`Ga2Z*;`5BI/_8!b!]tD"i
+]",>[[^NQLZa-j?YHG"/X/`1uVl-DfUnaWWTV%gHS=>t8R$X,(Q'7AoOcYWaNJrdQM2@%CL4t;5
+K7SQ'IsufoI!U*aG^"@TF`__HEcH)<Df0H0Chmg$C&VcRB4b^dA7T1Z@UW\Qra5\3!+#S/s',M,
+rE9/&s&]/"r`/ttqc!Jlr_WYlnUU+Ys%32\pdb9PqaL!Bpd5%UqkMr)s,?9%rC-TQpIG-PrCQiX
+rCd,`qb?paopG68k*GpPra>b7qdTS8rabq<rau1Cr+Q(DrbD@HrbVRNr,2LPrc%aSrGqmYqK2[Y
+rc[Rps-WS-pNu1Qq0Vg]rH\?dqKMm]rH7sYrH%jVic4m:rH%jXrH8-`qfi'brd"Efs*O`mrI+]p
+rdXlss+10$rIb-'s+UE+s+gW1rJCQ3s,6i7s,@#=rK$u?!0R8Ds-*JIrfmMMQi<BPR:2PRS"-">
+St;RITV8'RUSO]^VPg>jWN)u!XKAV-YctC<Za7'J[^WcW]">Vf^;%Fu_SX4/`Q#s>ai_fMc-FV\
+d*^:jeC<($f@\d1g=tE=hV[8LiSrkWj5f=ak3(pkrojIKli-8NmJlVRn,MnVnbhtXoD\CXp&4U^
+p\+CZq>:$\qtg6drTjH6s2=qf~>
+JcC<$JcGECo)ARcrVZQirqcZjr:p<ds7ZEas7?<_rUL$[nF6GG#O_!Hm-O'(lMg#iki_-kk2k^c
+j5].YiS`YOhqm2Fgt^Z<g=b-2f@SU(rmV,#da?Ihci243c-4ASb/q`Ga2Z*;`5BI/_8!b!]tD"i
+]",>[[^NQLZa-j?YHG"/X/`1uVl-DfUnaWWTV%gHS=>t8R$X,(Q'7AoOcYWaNJrdQM2@%CL4t;5
+K7SQ'IsufoI!U*aG^"@TF`__HEcH)<Df0H0Chmg$C&VcRB4b^dA7T1Z@UW\Qra5\3!+#S/s',M,
+rE9/&s&]/"r`/ttqc!Jlr_WYli(!`<r^cfSrC6ZQn3m%=!*/nspIY3Rj[nu5rC-TQpIG-PrCQiX
+rCd,`qb7&jqc<MjrDW5ap/1`aohYKmra>b7qdTS8rabq<rau1Cr+Q(DrbD@HrbVRNr,2LPrc%aS
+rGqmYqK2[Yrc[L)pj2[]l?rDSp3Q[_rHS0_rHA-^qK2[Wqf:\9r,VaWqfMdZs*"9`s*4Ngr-JBi
+rd=Zms*jrsrIFp!rdt*$s+LE+rJ(?-s+pW1s,-i7rJ^c9!07#=s,[5Crf[;Fs-3MJ!LB)OR/`R_
+R[]e:S=Q7CT:hjNTq\<XUnsrdVl6SpWiN5'Xfen4Z*L^B[C3NQ\@K2_]Y(tn^VI_'_o0O6a2lBF
+bKJ/UcHjkbdaQ^qf%8O+g"P07gtgiEi8ESRioB([jlY^gkNMp0!UB"Mm/QJQmf)\TnG_tUo)J=\
+o_J1YpAF[Yq"smaqXj[]r;$<Wrdk*fs*t~>
+JcC<$JcGECo)ARcrVZQirqcWirV6Ees7ZEas7H?_rpp*Z!:^!Vs6]mSrp0^PlK\B5!U/_Gjr3@B
+jQ#:[iSi_Qhqm5Gh;$c>g=k64f[na+ec+&%e'cXkd*M^:FNr%QbK@rJaN)<>`Pf[2_SO"%^:h1l
+]=PP_\$i`PZa6sBYck43XK/A$W2HPiUnjcZTqJ!KSXc1<R@'>,Q'IPrP*(fdNfB!UMM[1GL5(D8
+K7e`*J:E#rI=$9dH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\#%qOZARo=]raGn:@/aO5?3":0>lS".
+>5_V(=T2D#<rQ+u<;]\o;Z9Pj;#X8i:Aq*\VZ'0c8GPdR7f5^C7/K@JhVl'I]"@.:!4i(tqaU9L
+rCHlYq+CTYr_32`qVqP!p!*N\p!*?Wq9/EQr*TJ3raG_6raYt=qdoe>rb).Brb;CIqeQ4Jrb_OM
+rbqdTqf2UUrH%gWrH8'^q02e]oum)Uom?.Tpj;^\r-A6cqKMp^rH7sYr,_gWi,S[8rH%jXrcS3`
+r-/-bs*=Ngs*Ocnr-eTos*sutrdk*$rIb-'s+UE+s+gW1rJCQ3s,6i7s,I&=rf@)@s,m;D!gAk5
+rg!ML!13\PA!rdSS"#q<SXuFFTV/!PU8+N[V5C/gW2ZesX/rG*Y-5(6Z*UdD[C3NR\[f;`]Y2%o
+^qmn)_o9U7a2lBFbKS5VcHstddaQ^rf%8O+g"P39h;-rFi8ESRj5]4]jlY^gkl0fJlKdd8m/QGQ
+meuVSnGi%Vo)J=\o_S7ZpAF[Yq"smaqXaU\r;-BXrdk*ds*t~>
+JcC<$JcGECo)ARcrVZQirqcWirV6Ees7ZEas7H?_rpp*Z!:^!Vs6]mSrp0^PlK\B5!U/_Gjr3@B
+jQ#:[iSi_Qhqm5Gh;$c>g=k64f[na+ec+&%e'cXkd*M^:FNr%QbK@rJaN)<>`Pf[2_SO"%^:h1l
+]=PP_\$i`PZa6sBYck43XK/A$W2HPiUnjcZTqJ!KSXc1<R@'>,Q'IPrP*(fdNfB!UMM[1GL5(D8
+K7e`*J:E#rI=$9dH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\#%qOZARo=]raGn:@/aO5?3":0>lS".
+>5_V(=T2D#<rQ+u<;]\o;Z9Pj;#X8i:Ao_AIfP#mJ,W%<8GPdR7f5^C7/K=OUAL_aMrfluMi@Um
+s,?f4o8<N9qaU9LrCHlYq+CTYr_32`qPNqQn!E4'r*TJ3raG_6raYt=qdoe>rb).Brb;CIqeQ4J
+rb_OMrbqdTqf2UUrH%gWrH8'^q02Fus-WP,om?.Tpj;^\r-A6cqKMp^rH7sYr,_gWi,S[8rH%jX
+rcS3`r-/-bs*=Ngs*Ocnr-eTos*sutrdk*$rIb-'s+UE+s+gW1rJCQ3s,6i7s,I&=rf@)@s,m;D
+!gAk5rg!ML!13\PA!rdSS"#q<SXuFFTV/!PU8+N[V5C/gW2ZesX/rG*Y-5(6Z*UdD[C3NR\[f;`
+]Y2%o^qmn)_o9U7a2lBFbKS5VcHstddaQ^rf%8O+g"P39h;-rFi8ESRj5]4]jlY^gkl0fJlKdd8
+m/QGQmeuVSnGi%Vo)J=\o_S7ZpAF[Yq"smaqXaU\r;-BXrdk*ds*t~>
+JcC<$JcGECo)ARcrVZQirqcWirV6Ees7ZEas7H?_rpp*Z!:^!Vs6]mSrp0^PlK\B5!U/_Gjr3@B
+jQ#:[iSi_Qhqm5Gh;$c>g=k64f[na+ec+&%e'cXkd*M^:FNr%QbK@rJaN)<>`Pf[2_SO"%^:h1l
+]=PP_\$i`PZa6sBYck43XK/A$W2HPiUnjcZTqJ!KSXc1<R@'>,Q'IPrP*(fdNfB!UMM[1GL5(D8
+K7e`*J:E#rI=$9dH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\#%qOZARo=]raGn:@/aO5?3":0>lS".
+>5_V(=T2D#<rQ+u<;]\o;Z9Pj;#X8i:@1OM8c;3U8,PjS7IES@6iL'`<W,M\9&rS88H)'T7eT@N
+8Gu-U9)VE^9`%Q\<npUL;>X2e:]+T"@/aU4@fBm;AG]s<B)ZH@B`;`GCAVfHD#S;KDZ4SRE;OYS
+ErC(UFT$@\G56@P<;1_3Hgc@WHhMd`H2W!aGQ)daFo$4XF8^.;EVskUF8L(YFoHR^GQ)jeH2N!g
+HiJKkIK+crJ,OosJcC?#KE$W)L&Hc+L]<2/M>rJ5MuAV7NW5%<O8k=AOoCLFPE_=2Q2d-MQi<@^
+R@9S6S"-">St;RITV8'RUSO]^VPg>jWN)u!XKAV-YHY79Za7$H[^N]V\[oDc]tV7s_8=(,`Poj;
+aN;TJbg"GYd*^7he'uq!f@S[.g=tE=h;7&Ii8N\Uj5f:_k2tjjrojLLlg+Q:s6TgSrU9dUs7-$X
+s7?6^qXsg\r:fp[qt^-coDAC^qYfaZJcEUeJ,~>
+JcC<$JcGECnc&LcrVZNhrqcZjr:p<ds7ZEa!qc*UrUL$[nF6GG!q,ICrp0[OlMg&JkQ'fFjoOT)
+ro4%=iVqaHhqm5Gh;$c>g=k64f[na+ec+'He'cXkd*L%`cHXSVbK@rJaN)<>`Pf[2_SO%&^:h1l
+]=PP_\$i`PZa6sBYck43XK/A$W2HPiUnjcZTqJ!KSXc1<R@'>,Q'IPrP*(fdNfB!UMM[1FL5(D8
+K7\Z)J:E#rI=$9dH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\!G?$DAH?=OraGq;?srt@!a]/<r`oJ-
+s'#A(s&f;&r)Wess&Akor_i_mqb[8fr_E>br_*;bqPO9brCQuZq+(?PqaKm?rBpJ=i4J-_rC-TQ
+pIG-PrCQfWr_*2`qb@%Jro3q#qTJrarlbAeprr`^q98TVpWED@ra>b7qdTS8rabq<rau1Cqe6"D
+rbD@HrbVRNqelCOrc%aSrc7sYqK2[YrH@pZr-86eqTJSYom?4VpNuU[rH\?dq02g]rcS$YrH%pX
+hJrL7rH%jXrcS3`r-/0cs*=Ngs*OcnrI+Zos*suts+13%rIb-'s+UE+s+gW1rJCQ3s,6i7s,I&=
+rf@)@s,m;Ds-!GIrKRGMQ^@]=!L]DURgYaWSXuFFTV/!PU8.^`9;SM`Vl6SpWiN5'Xfnt5Z*L^B
+['mEP\@K/^]Y(ql^VI\&_o0O5a2l?Db0/#RcHjkbdF-Ooe^i@(f\5'6gtgfChr*GOioB([jo4BC
+kNMp0#jUaAm-O-,mdC)Cs7$'Yr:9mZrq-'[rV$3apA"O\qtfp]qY^0fli)J8_>f#~>
+JcC<$JcGECnc&LcrVZNhrqcZjr:p<ds7ZEa!qc*UrUL$[nF6GG!q,ICrp0[OlMg&JkQ'fFjoOT)
+ro4%=iVqaHhqm5Gh;$c>g=k64f[na+ec+'He'cXkd*L%`cHXSVbK@rJaN)<>`Pf[2_SO%&^:h1l
+]=PP_\$i`PZa6sBYck43XK/A$W2HPiUnjcZTqJ!KSXc1<R@'>,Q'IPrP*(fdNfB!UMM[1FL5(D8
+K7\Z)J:E#rI=$9dH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\!G?$DAH?=OraGq;?srt@!a]/<r`oJ-
+s'#A(s&f;&r)Wess&Akor_i_mqb[8fr_E>br_*;bqLAN;rCQuZq+(?PqaKm?rBgRZr1j1Jjc&_f
+p58f;qaU<Mr(-cXq+CWZrCm)_qPNtRm?dL3s-NJGr*TG2s'be6s'u%=r+5k>s(D4Bs(VIIr+l:J
+rb_OMrbqdTqf2UUrH%gWrH8'^pNQO[s*=L0!1<J+om?4VpNuU[rH\?dq02g]rcS$YrH%pXhJrL7
+rH%jXrcS3`r-/0cs*=Ngs*OcnrI+Zos*suts+13%rIb-'s+UE+s+gW1rJCQ3s,6i7s,I&=rf@)@
+s,m;Ds-!GIrKRGMQ^@]=!L]DURgYaWSXuFFTV/!PU8.^`9;SM`Vl6SpWiN5'Xfnt5Z*L^B['mEP
+\@K/^]Y(ql^VI\&_o0O5a2l?Db0/#RcHjkbdF-Ooe^i@(f\5'6gtgfChr*GOioB([jo4BCkNMp0
+#jUaAm-O-,mdC)Cs7$'Yr:9mZrq-'[rV$3apA"O\qtfp]qY^0fli)J8_>f#~>
+JcC<$JcGECnc&LcrVZNhrqcZjr:p<ds7ZEa!qc*UrUL$[nF6GG!q,ICrp0[OlMg&JkQ'fFjoOT)
+ro4%=iVqaHhqm5Gh;$c>g=k64f[na+ec+'He'cXkd*L%`cHXSVbK@rJaN)<>`Pf[2_SO%&^:h1l
+]=PP_\$i`PZa6sBYck43XK/A$W2HPiUnjcZTqJ!KSXc1<R@'>,Q'IPrP*(fdNfB!UMM[1FL5(D8
+K7\Z)J:E#rI=$9dH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\!G?$DAH?=OraGq;?srt@!a]/<r`oJ-
+s'#A(s&f;&r)Wess&Akor_i_mqb[8fr_E>br_*;bqF:KWrCQuZq+(?PqaKm?rBpQ`r`/kfnk/"8
+ogo$MqaU<Mr(-cXq+CWZrCm)_qH!Smf2DHBr_WN"ra>b7qdTS8rabq<rau1Cqe6"DrbD@HrbVRN
+qelCOrc%aSrc7sYqK2[YrH@pZr-86eqGd07om?4VpNuU[rH\?dq02g]rcS$YrH%pXhJrL7rH%jX
+rcS3`r-/0cs*=Ngs*OcnrI+Zos*suts+13%rIb-'s+UE+s+gW1rJCQ3s,6i7s,I&=rf@)@s,m;D
+s-!GIrKRGMQ^@]=!L]DURgYaWSXuFFTV/!PU8.^`9;SM`Vl6SpWiN5'Xfnt5Z*L^B['mEP\@K/^
+]Y(ql^VI\&_o0O5a2l?Db0/#RcHjkbdF-Ooe^i@(f\5'6gtgfChr*GOioB([jo4BCkNMp0#jUaA
+m-O-,mdC)Cs7$'Yr:9mZrq-'[rV$3apA"O\qtfp]qY^0fli)J8_>f#~>
+JcC<$JcGBBo)ARcrVZQirqcZjr:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJ#O(@6k2tde
+jSn0?io0mpJ)B,>h;-l@gY1B7f\"g-f%&=#eC2jndEp7dcHa\YbKJ&MaN2EA`Pod5_SX.)^V7Co
+]Xtbc\@8oT['R*EZ*:F7XfSS'WMl_mV50o^TqS-NSt2C@R[KP0QBd\uP*1ofO,f3YMi*@JLPCP;
+KS+l-J:N,uI=-BfH?jaZG7f"@FEDSEEH,r9DJj<-CMR[!rb)=FB)Z?BA7PUJ!b#JEra5\3!+#P.
+s'#J,r)s&%s&],!r`/ttqc!Jlr_`Phr_NMgqb@&`r_*)[r^m&Zq+(?PqaKg=qqh7`jLaTdr^H]R
+p.,'Pr(6`WrCd,`qFq#diSjdq!9<drprrc]r65)^s30oSs2t7Hs'Yh7r*oY8s()"<s(;7Cr+Q(D
+rbD@HrbVRNr,2LPrc%^Rrc7sYqK2[YrH@pZr-8*anp9qTomHFZp3Q[_rHS0_rHA0_qK2[Wr,UY6
+rGqjXqfMj\rc\3`s*4Qhr-JBis*Xcns*jutrIFp!s+:3%s+LE+rJ(?-s+pW1s,-i7rJ^c9s,R)>
+s,d8Crf[;Fs-3MJs-<YOrg<_R!1NnV$_3cYSt;RITV8'RU].&iV5C/gW2ZesX/rG*Y-5(6Z*UdD
+[C3NQ\[f;`]Y(tn^VI_'_o0O6a2l?EbKJ,ScHjkbdF6Upe^i@)g"P07gtgfChr*GOioB([jlY^g
+kNM0plK[^7liQSBmeuSUnF?&Ho)J=\o_\=[pAOaZq"sm`qXaU\r;$<Wrdk*bs*t~>
+JcC<$JcGBBo)ARcrVZQirqcZjr:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJ#O(@6k2tde
+jSn0?io0mpJ)B,>h;-l@gY1B7f\"g-f%&=#eC2jndEp7dcHa\YbKJ&MaN2EA`Pod5_SX.)^V7Co
+]Xtbc\@8oT['R*EZ*:F7XfSS'WMl_mV50o^TqS-NSt2C@R[KP0QBd\uP*1ofO,f3YMi*@JLPCP;
+KS+l-J:N,uI=-BfH?jaZG7f"@FEDSEEH,r9DJj<-CMR[!rb)=FB)Z?BA7PUJ!b#JEra5\3!+#P.
+s'#J,r)s&%s&],!r`/ttqc!Jlr_`Phr_NMgqb@&`r_*)[r^m&Zq+(?PqaKg=!2BCdhi.)`pPSr=
+qaU9LrCHiXqF^]Zr_3/_!)EHh!2og`jHoV,p6YfFr*TJ3raG_6raYt=qdoe>rb).Brb;@Hr+l:J
+rb_RNrbqdTqJlLTrH%gWrH8'^pNQO[qg%aYoR$7Yom?CYrH\?dqKMm]rcS'ZrH%mWhJrL7rH%jX
+s)n<ar-/0cs*=Ngs*OcnrI+]ps*suts+13%rIb-'s+UE+s+gW1rJCQ3s,6i7s,I&=rf@)@s,m;D
+s-*JIrg!ML!13\Ps-WkUrgO:cSXl@DT:hjNTq\=]UfO=hVl-JmWiE,$Xf\b0YctC=Za@-K[^WfX
+]">Vf^;%Fu_SX4/`Q#s>aND]Lbg"GZd*^7ieC<%"f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(pkl07Ku
+li-5PmI'E@mfN"KnbhtXoD\CZp&4U_p\+CZq>0sZqtg6drTjH6s1nYb~>
+JcC<$JcGBBo)ARcrVZQirqcZjr:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJ#O(@6k2tde
+jSn0?io0mpJ)B,>h;-l@gY1B7f\"g-f%&=#eC2jndEp7dcHa\YbKJ&MaN2EA`Pod5_SX.)^V7Co
+]Xtbc\@8oT['R*EZ*:F7XfSS'WMl_mV50o^TqS-NSt2C@R[KP0QBd\uP*1ofO,f3YMi*@JLPCP;
+KS+l-J:N,uI=-BfH?jaZG7f"@FEDSEEH,r9DJj<-CMR[!rb)=FB)Z?BA7PUJ!b#JEra5\3!+#P.
+s'#J,r)s&%s&],!r`/ttqc!Jlr_`Phr_NMgqb@&`r_*)[r^m&Zq+(?PqaKg=rD`eslq6>1pIP9P
+qaU9LrCHiXqF^]Zr_3/_!)EJns&T1spJKR@r_`T#s'Yh7r*oY8s()"<s(;7Cr+Q(DrbD@HrbVRN
+r,2LPrc%^Rrc7sYqK2[YrH@pZr-8*anp9qTomHFZp3Q[_rHS0_rHA0_qK2[Wr,UY6rGqjXqfMj\
+rc\3`s*4Qhr-JBis*Xcns*jutrIFp!s+:3%s+LE+rJ(?-s+pW1s,-i7rJ^c9s,R)>s,d8Crf[;F
+s-3MJs-<YOrg<_R!1NnV$_3cYSt;RITV8'RU].&iV5C/gW2ZesX/rG*Y-5(6Z*UdD[C3NQ\[f;`
+]Y(tn^VI_'_o0O6a2l?EbKJ,ScHjkbdF6Upe^i@)g"P07gtgfChr*GOioB([jlY^gkNM0plK[^7
+liQSBmeuSUnF?&Ho)J=\o_\=[pAOaZq"sm`qXaU\r;$<Wrdk*bs*t~>
+JcC<$JcGBBo)ARcrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp0^PlK\B5!U/_Gk5XNC
+jSn0?io0mp(#Rm)h;-l@gY1B7f\"g-f%&=#eC2kFd='BfcHa\YbKJ&MaN2EA`Pod5_SX.)^V7Co
+]Xtbc\@8oT['R*EYct=6XfSS'WMl_mV50o]TqS-NSt2@?R[KP0QBd\uP*1ofO,f0XMi*@ILPCP;
+KS+l-J:N,uI=-BfH?jaZGBS+NFE;JBEH#i6DJa3*CMIQtBP;$jrac=F@q/tW@:<RC?iOI4?2e+/
+>Q7n*=oMP'=8Z+u<W?%q;uT\o;>X2i:]=,d:&[ic9DV9[8c;3U8,PjR7I3G?hYFhG]BHj+7J]LJ
+8,PpV8bl!X9DqQ]:&ducipP"hbi$\C?iFI4@JjU6A,g*;Ac?<@BDcHBC&_rFC]A5MD>S5MDuO_P
+EW1"XF89qVFo?LXGPcX^H1H:=HhD^`H2W!`GQ)dbFnp.YF8U(MEVOMFEW'qVF8U.ZFoHR_GQ2pe
+H2W'hHiJKlIK+crJ,OotJcC?#KE$W)L&Qi,L]<2/M>rJ5MuAV7NW5%<O8k=AOo:FEPE_=2Q2d0M
+Qi<?RR@9TDRfT%Mrgm>dTV/!PU8+KZUnsrdVl6SpWiN5'Xfek3Yd(L?Za@-K\%&uZ]"G\h^;%G!
+_SX40`Q#s>ai_fMc-FV\d*^:jeC<%#f@\d1g=tE=h;7)JiSrkWj5f=ak3(t-klU/9li-5PmI'EA
+n,MnWnbr%YoD\CZp&4U_p\4I[q>:$Zqtg6crTjH6s1eSa~>
+JcC<$JcGBBo)ARcrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp0^PlK\B5!U/_Gk5XNC
+jSn0?io0mp(#Rm)h;-l@gY1B7f\"g-f%&=#eC2kFd='BfcHa\YbKJ&MaN2EA`Pod5_SX.)^V7Co
+]Xtbc\@8oT['R*EYct=6XfSS'WMl_mV50o]TqS-NSt2@?R[KP0QBd\uP*1ofO,f0XMi*@ILPCP;
+KS+l-J:N,uI=-BfH?jaZGBS+NFE;JBEH#i6DJa3*CMIQtBP;$jrac=F@q/tW@:<RC?iOI4?2e+/
+>Q7n*=oMP'=8Z+u<W?%q;uT\o;>X2i:]=,d:&[ic9DV9[8c;3U8,PjR7I3G?UYUmuMtr817J]LJ
+8,PpV8bl!X9DqQ]:&ducVuN.DQhZm=Qi1:j@/aU4@fBm;AGg$<B)ZH@B`;`GCAVfHD#S;KDZ4SR
+E;FSRErL.UFT$@\G5$4XGl)dWHJa)BHMr-fGklR_G5cX[FT-@ZEq=;GE:e/KErC(WFT-F^G5ZXb
+GlE!eHN/?lI/SKnIfForJH(3#K)L?%K`?c*LB!&/M#E21MZ8V5N;nn;NrG+>OT1IAOogi3Pl?sJ
+QN*<NQi`\ERf8cWS=TYN>G%R]TqS3UUSO]^VPg>jWN)u!XKAV-YHY79ZEpmE[C3QS\[f;a]Y2%o
+^VRe(_o9U7a2lBFbKJ/UcHjkbdaQ^qe^rF*g"P07gtgfCi8ESRioB([jlY^gkl0fJlKdd8liQSB
+mf)\TnGi%Wo)J=\o_\=[pAOa[q"smaqXXO[r:p6Vrdk*as*t~>
+JcC<$JcGBBo)ARcrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp0^PlK\B5!U/_Gk5XNC
+jSn0?io0mp(#Rm)h;-l@gY1B7f\"g-f%&=#eC2kFd='BfcHa\YbKJ&MaN2EA`Pod5_SX.)^V7Co
+]Xtbc\@8oT['R*EYct=6XfSS'WMl_mV50o]TqS-NSt2@?R[KP0QBd\uP*1ofO,f0XMi*@ILPCP;
+KS+l-J:N,uI=-BfH?jaZGBS+NFE;JBEH#i6DJa3*CMIQtBP;$jrac=F@q/tW@:<RC?iOI4?2e+/
+>Q7n*=oMP'=8Z+u<W?%q;uT\o;>X2i:]=,d:&[ic9DV9[8c;3U8,PjR7I3G?<9d*:8bbjV7J]LJ
+8,PpV8bl!X9DqQ]:&dug<rH+p;"miE;ZBVm?iFI4@JjU6A,g*;Ac?<@BDcHBC&_rFC]A5MD>S5M
+DuO_PEW1"XF89qVFo?LXGPcX^H1H:=HhD^`H2W!`GQ)dbFnp.YF8U(MEVOMFEW'qVF8U.ZFoHR_
+GQ2peH2W'hHiJKlIK+crJ,OotJcC?#KE$W)L&Qi,L]<2/M>rJ5MuAV7NW5%<O8k=AOo:FEPE_=2
+Q2d0MQi<?RR@9TDRfT%Mrgm>dTV/!PU8+KZUnsrdVl6SpWiN5'Xfek3Yd(L?Za@-K\%&uZ]"G\h
+^;%G!_SX40`Q#s>ai_fMc-FV\d*^:jeC<%#f@\d1g=tE=h;7)JiSrkWj5f=ak3(t-klU/9li-5P
+mI'EAn,MnWnbr%YoD\CZp&4U_p\4I[q>:$Zqtg6crTjH6s1eSa~>
+JcC<$JcGBBo)ARcrVZNhrqcZjr:p<ds7ZEas7H?_rpp*Z!:]sU!q,ICrp0mUlK[Wukih4/joXZ*
+jSn0?io0mp(#Rm)h;-l@gY1B7g"=p.f%/C$eC2kFd=0HgcHa\YbKJ&MaN2EA`Pod5_SX.)^V@Ip
+]Xtbc\@8oT[Bm3FZ*:F7XfSS'WMl_mV50o]TqS-NSt2@?R[KP0QBd\uP*1ofO,f0XMi*@ILPCP;
+KS+l-J:N,uI=-BfH?jaZGBS+NFE;JBEH#i6DJa3*CMITuBP;$jB)cEDA7K-K@KKtG@/aL7?<pk8
+>lS%.>5_V(=T2D"<rQ,!<;TVn;Z9Pk;#X8i:A[cb9`@]^9)V?\8GG^Q7f#RB6ic-ChY=bF]BQp,
+7J]LJ8,PpV8bl!X9DqQ]:&ducil]IC?iFI5@JaO6A,^$:Ac?<ABDZBBC&VlFC]8/LD>S5MDuO_Q
+EW'qWF89qVFo6FWGPl^_H16.>HhD^_H2W!aGQ)daFo$4YF8^.OEV+5CEW1"XF8L(YFoQX_GQ2pf
+H2W'hHiJKlIK+crJ,Om!JV&LPKE$W)L&Hc+LB*//M>rJ5MuAV7NW5%<O8k=AOo:FEPE_=1Pld8<
+Qi<BPR/i]TS,\uYSc53cT:hjNTq\<WUnjiaVl-JmWN)u!XKAV-YHY7:Za7$H[^NZT\[oDc]Y2(p
+^qmn*`5T^8aN2KGbKS5VcHjncdaQ^qf%8O+g"P07h;-rFi8ESRj5]4^jlY^gkl0fIlKeH9s6TgS
+rpTmVs7-'Yrq$0^qt9s^rV-']r;$3co)&7\q>KUXJcEIaJ,~>
+JcC<$JcGBBo)ARcrVZNhrqcZjr:p<ds7ZEas7H?_rpp*Z!:]sU!q,ICrp0mUlK[Wukih4/joXZ*
+jSn0?io0mp(#Rm)h;-l@gY1B7g"=p.f%/C$eC2kFd=0HgcHa\YbKJ&MaN2EA`Pod5_SX.)^V@Ip
+]Xtbc\@8oT[Bm3FZ*:F7XfSS'WMl_mV50o]TqS-NSt2@?R[KP0QBd\uP*1ofO,f0XMi*@ILPCP;
+KS+l-J:N,uI=-BfH?jaZGBS+NFE;JBEH#i6DJa3*CMITuBP;$jB)cEDA7K-K@KKtG@/aL7?<pk8
+>lS%.>5_V(=T2D"<rQ,!<;TVn;Z9Pk;#X8i:A[cb9`@]^9)V?\8GG^Q7f#RB7/Wk9N:;c%MZ6-A
+7e]FN8Gu-U9)_K^9`%Qa:A^pgR-L%<R/30GQLgIA?iFI5@JaO6A,^$:Ac?<ABDZBBC&VlFC]8/L
+D>S5MDuO_QEW'qWF89qVFo6FWGPl^_H16.>HhD^_H2W!aGQ)daFo$4YF8^.OEV+5CEW1"XF8L(Y
+FoQX_GQ2pfH2W'hHiJKlIK+crJ,Om!JV&LPKE$W)L&Hc+LB*//M>rJ5MuAV7NW5%<O8k=AOo:FE
+PE_=1Pld8<Qi<BPR/i]TS,\uYSc53cT:hjNTq\<WUnjiaVl-JmWN)u!XKAV-YHY7:Za7$H[^NZT
+\[oDc]Y2(p^qmn*`5T^8aN2KGbKS5VcHjncdaQ^qf%8O+g"P07h;-rFi8ESRj5]4^jlY^gkl0fI
+lKeH9s6TgSrpTmVs7-'Yrq$0^qt9s^rV-']r;$3co)&7\q>KUXJcEIaJ,~>
+JcC<$JcGBBo)ARcrVZNhrqcZjr:p<ds7ZEas7H?_rpp*Z!:]sU!q,ICrp0mUlK[Wukih4/joXZ*
+jSn0?io0mp(#Rm)h;-l@gY1B7g"=p.f%/C$eC2kFd=0HgcHa\YbKJ&MaN2EA`Pod5_SX.)^V@Ip
+]Xtbc\@8oT[Bm3FZ*:F7XfSS'WMl_mV50o]TqS-NSt2@?R[KP0QBd\uP*1ofO,f0XMi*@ILPCP;
+KS+l-J:N,uI=-BfH?jaZGBS+NFE;JBEH#i6DJa3*CMITuBP;$jB)cEDA7K-K@KKtG@/aL7?<pk8
+>lS%.>5_V(=T2D"<rQ,!<;TVn;Z9Pk;#X8i:A[cb9`@]^9)V?\8GG^Q7f#RB6i^6c<8:+98bkpW
+7J]LJ8,PpV8bl!X9DqQ]:&drg<r?%o;"7ED;?0Sm?iFI5@JaO6A,^$:Ac?<ABDZBBC&VlFC]8/L
+D>S5MDuO_QEW'qWF89qVFo6FWGPl^_H16.>HhD^_H2W!aGQ)daFo$4YF8^.OEV+5CEW1"XF8L(Y
+FoQX_GQ2pfH2W'hHiJKlIK+crJ,Om!JV&LPKE$W)L&Hc+LB*//M>rJ5MuAV7NW5%<O8k=AOo:FE
+PE_=1Pld8<Qi<BPR/i]TS,\uYSc53cT:hjNTq\<WUnjiaVl-JmWN)u!XKAV-YHY7:Za7$H[^NZT
+\[oDc]Y2(p^qmn*`5T^8aN2KGbKS5VcHjncdaQ^qf%8O+g"P07h;-rFi8ESRj5]4^jlY^gkl0fI
+lKeH9s6TgSrpTmVs7-'Yrq$0^qt9s^rV-']r;$3co)&7\q>KUXJcEIaJ,~>
+JcC<$JcGBBnc&IbrVZQirqcWirV6Bds7ZEas7?<_rUL$[nF6GGs6]mSrp9[N!:'RJs6'IGroO:D
+jQ-=#!TN);i.'Y@hVI#CgtUQ:g"G$0f@JO'eC;sqda?Ihcd'h\bfe2PaiVWE`l5p8_ns:,^q[Xt
+]Y(kf\[],W[^<BIZE^X;Y-"e+Wi;qpVPU)aU7n9QSt;LBS!ob4Q^3o$PEM&iO,o<[N/NRMLkg_>
+KnG#0JUi9#IXQTjH?sj]GBXL>F`__HEcH)<Df0H0D#S2XC2%?pB4kgfARo=]raGq;?srt@s'G_2
+rETA,s'#A(s&f8%r)Whtr`&bns&/hnqb[8fs%`Gcr_3;aqb$fYr^cfSr'pNOn3m33pUnncs185!
+qF:0KrCHiXqF^]Zr_3/_s%`UR!9=(<b00`jra>b7r*oY8rabq<s(;7Cr+Q(DrbD@HrbVRNqelCO
+rc%aSrGqmYq/lRXr-%gYqfr!`ms=,Co6U@\rHS-^rc\9`qK2[WrGqRNnSn2Arc7sYr,hs]rc\6a
+s*4QhrHeKjs*Xcns*jutrdb$"s+:3%!ec8]rJ(?-s+pZ2s,-i7rJ^c9!07#=s,d8CrK75GPa)-3
+!g]1>rg<_Rs-iqV!h>gPrgj._T`1VcU8.^`!Mu[mVb*hdWiE,$Xf\b0YctC<Za7$H[^WcW\[oDc
+]tV7r^qmn*`5T^9aN2KGbKS5VcHstddaQ^rf%8O+g"P39h;-rFi8ESRj5]4^roOFJkiq?slKeH9
+!q#FDrpTmV!:g$Yrq$0^qt9s^rqH3_qt^*bo)&7\q>KRWJcEF`J,~>
+JcC<$JcGBBnc&IbrVZQirqcWirV6Bds7ZEas7?<_rUL$[nF6GGs6]mSrp9[N!:'RJs6'IGroO:D
+jQ-=#!TN);i.'Y@hVI#CgtUQ:g"G$0f@JO'eC;sqda?Ihcd'h\bfe2PaiVWE`l5p8_ns:,^q[Xt
+]Y(kf\[],W[^<BIZE^X;Y-"e+Wi;qpVPU)aU7n9QSt;LBS!ob4Q^3o$PEM&iO,o<[N/NRMLkg_>
+KnG#0JUi9#IXQTjH?sj]GBXL>F`__HEcH)<Df0H0D#S2XC2%?pB4kgfARo=]raGq;?srt@s'G_2
+rETA,s'#A(s&f8%r)Whtr`&bns&/hnqb[8fs%`Gcr_3;aqb$fYr^cfSr'pNOn3m2Md>[gXs,-hF
+qF:0KrCHiXqF^]Zr_3/_s%`QjrhTU^l'MC:q3V#Fo9]D_ra>b7r*oY8rabq<s(;7Cr+Q(DrbD@H
+rbVRNqelCOrc%aSrGqmYq/lRXr-%gYqfr!`ms=,Co6U@\rHS-^rc\9`qK2[WrGqRNnSn2Arc7sY
+r,hs]rc\6as*4QhrHeKjs*Xcns*jutrdb$"s+:3%!ec8]rJ(?-s+pZ2s,-i7rJ^c9!07#=s,d8C
+rK75GPa)-3!g]1>rg<_Rs-iqV!h>gPrgj._T`1VcU8.^`!Mu[mVb*hdWiE,$Xf\b0YctC<Za7$H
+[^WcW\[oDc]tV7r^qmn*`5T^9aN2KGbKS5VcHstddaQ^rf%8O+g"P39h;-rFi8ESRj5]4^roOFJ
+kiq?slKeH9!q#FDrpTmV!:g$Yrq$0^qt9s^rqH3_qt^*bo)&7\q>KRWJcEF`J,~>
+JcC<$JcGBBnc&IbrVZQirqcWirV6Bds7ZEas7?<_rUL$[nF6GGs6]mSrp9[N!:'RJs6'IGroO:D
+jQ-=#!TN);i.'Y@hVI#CgtUQ:g"G$0f@JO'eC;sqda?Ihcd'h\bfe2PaiVWE`l5p8_ns:,^q[Xt
+]Y(kf\[],W[^<BIZE^X;Y-"e+Wi;qpVPU)aU7n9QSt;LBS!ob4Q^3o$PEM&iO,o<[N/NRMLkg_>
+KnG#0JUi9#IXQTjH?sj]GBXL>F`__HEcH)<Df0H0D#S2XC2%?pB4kgfARo=]raGq;?srt@s'G_2
+rETA,s'#A(s&f8%r)Whtr`&bns&/hnqb[8fs%`Gcr_3;aqb$fYr^cfSr'pNOn3m1Skt:P?qF^BO
+s%*/YqF:0KrCHiXqF^]Zr_3/_s%`Sp!*B/#r)*DhnPS=ErEoP3s'bh7raYq<r+5n?rb).Brb;@H
+r+l:Jrb_OMrbqdTqf2RTrc@mWrH8$]pNQLZqg%XVk'Q]GrH\?dq02g]rcS'ZrH%pXol9M@p2U(P
+rH%mYs)n<arHJ9ds*=Qhs*OcnrI+]ps*t#us+13%rIY0)Kn]J[s+gW1re^Z4s,6i7s,@#=rK$u?
+s,m8C!gAk5rKRGMQ^@]=s-`nUrgNtZSXobO!M?%aT`Lm_rhKRkVZ*JbW2ZesX/rG*Y-5(6Z*L^B
+['d?O\@K/]]=bhk^V@S#_Sa=2`Q-'@ai_fNc-FV]dF$CkeCE.%f@\d1gYCW@hV[8LiSrnXjQ6C'
+#3Y47l0@R"rp0^RmdC)Cs6p$YrUTsZs7H3]rq??cq"Xa^qYKd[q>C'el2H86^&NT~>
+JcC<$JcGBBnc&IbrVZQirqcWir:p<ds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'RJs6'IGroOII
+jQ,@]io8qri!8/rhVI#CgtVh^!SQ-)f+-B^eC;srda?Ihcd'h\bl5e$b/q`Ga2Q$9_ns:,^q[Xt
+]Y(kf\[],W[^<BIZEUR:Y-"e+Wi;qpVPU)`U7n9QSt;IAS!o_3Q^3o$PEM&iO,o9ZN/NRMLkg_>
+KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-rbD^QBkV0mB4h-S!G#^>@fKm:@/aO5?3":0
+>lS%.>5VP'=T2D"<rQ,!<;TVo;Z9Pj;#a>j:A[cb9`Ic^9)_E\8GG^Q7f#RE7/Ys8][=@k7J]LI
+8,Z!W8bl!W9E%W]:&[ocir@6gb5fcHbPbfJ@/aU4@fBm;AG]s<B)ZH@B`;`FCA_lHD#S;LDZ+MQ
+E;OYRErL.UFSp:[G4p.WGl)dSHKfeJHMi'eGkuX`G5ZR[FT-@[EqXM@E;+AOErL.WFT6L`G5QRa
+GlN'gHN/?lI/SKnIK4lrJH(0#K)L?%K`?c*LB!&/M#N82MZ8V5N;nk;Nr>%=OT1IBP5gaGPl6jK
+QC!s:Qi`\ERf8fVS,f,ZT)YD_T`1VcU8.^`!Mu[mVcfstWiE,$Xf\b0YctC<Za7$H[^NZT\[f>b
+]Y2%o^qmn)_o0O6a2l?EbKJ,ScHjkbdF-Ooe^i@(f\5'6gtgfChr*GOioB([jlY^gkih9qlKdd&
+m-X3.rpTmVs7-'Ys7?9_r:U'_rV--_qt^-co)&4[q#0IVJcEC_J,~>
+JcC<$JcGBBnc&IbrVZQirqcWir:p<ds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'RJs6'IGroOII
+jQ,@]io8qri!8/rhVI#CgtVh^!SQ-)f+-B^eC;srda?Ihcd'h\bl5e$b/q`Ga2Q$9_ns:,^q[Xt
+]Y(kf\[],W[^<BIZEUR:Y-"e+Wi;qpVPU)`U7n9QSt;IAS!o_3Q^3o$PEM&iO,o9ZN/NRMLkg_>
+KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-rbD^QBkV0mB4h-S!G#^>@fKm:@/aO5?3":0
+>lS%.>5VP'=T2D"<rQ,!<;TVo;Z9Pj;#a>j:A[cb9`Ic^9)_E\8GG^Q7f#RE7/`n]V9k1pMuQ6B
+7eT@N8Gu-U9)VE^9_qK_:AgsgR-U+:R-0h7?iOO5@JjU6A,g*:AcHBABDcHBC&VlFC]8/LD>\;M
+DuO_QEW'qWF89qUFo?LWGPcX^H1$"CHh2R]H2W!aGQ)daFo$4ZF8^.QEUIf?EW1"XF8L(ZFoQX_
+GQ2pfH2`-iHiJKlIK+`rJ,OotJH1<#KE$W)L&Qi,L]<20M>rJ5MuAV7N<#";O8k=AOoCODPQ-mG
+Pld8<Qi39QR@9TDS,\uYSc55\T)bP`T`Lm_rhKRkVZ*JrW2ZesX/rG*Y-5(6Z*L^B['d?N\%&uZ
+]=bei^;%J"_SX4/`Q#s>aND]Lbg"GZd*^7heC<%"f@S[/g=tE=h;7&Ii8N\Uj5f=ak3(sll07L!
+lg4!*mI'uBs7$'YrUU![s7H6^rq?<bq=sj_qtfm\q#'pcl2H86]`3K~>
+JcC<$JcGBBnc&IbrVZQirqcWir:p<ds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'RJs6'IGroOII
+jQ,@]io8qri!8/rhVI#CgtVh^!SQ-)f+-B^eC;srda?Ihcd'h\bl5e$b/q`Ga2Q$9_ns:,^q[Xt
+]Y(kf\[],W[^<BIZEUR:Y-"e+Wi;qpVPU)`U7n9QSt;IAS!o_3Q^3o$PEM&iO,o9ZN/NRMLkg_>
+KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-rbD^QBkV0mB4h-S!G#^>@fKm:@/aO5?3":0
+>lS%.>5VP'=T2D"<rQ,!<;TVo;Z9Pj;#a>j:A[cb9`Ic^9)_E\8GG^Q7f#RE7/U'K9(P^P9(PXS
+7J]LI8,Z!W8bl!W9E%W]:&[oc<rZ(`;;tLP?iOO5@JjU6A,g*:AcHBABDcHBC&VlFC]8/LD>\;M
+DuO_QEW'qWF89qUFo?LWGPcX^H1$"CHh2R]H2W!aGQ)daFo$4ZF8^.QEUIf?EW1"XF8L(ZFoQX_
+GQ2pfH2`-iHiJKlIK+`rJ,OotJH1<#KE$W)L&Qi,L]<20M>rJ5MuAV7N<#";O8k=AOoCODPQ-mG
+Pld8<Qi39QR@9TDS,\uYSc55\T)bP`T`Lm_rhKRkVZ*JrW2ZesX/rG*Y-5(6Z*L^B['d?N\%&uZ
+]=bei^;%J"_SX4/`Q#s>aND]Lbg"GZd*^7heC<%"f@S[/g=tE=h;7&Ii8N\Uj5f=ak3(sll07L!
+lg4!*mI'uBs7$'YrUU![s7H6^rq?<bq=sj_qtfm\q#'pcl2H86]`3K~>
+JcC<$JcGBBnc&IbrVZNhrqcZjr:p9cs7ZEas7?<_rUU!Y!:]sU!q,ICrp0^PlK\B5!pJh1roOII
+jQ,@]io8qri!8/rhVI#CgtVh^!SQ-)f)aIQrmV,#da?Ihci243c-4ASb/q`Ga2Z*:_ns:,^q[Xt
+]Y(kf\[],W[^<BIZEUR:Y-"e+Wi;qpVPU)`U7n6PSt;IAS!o_3Q^*i#PEM&iO,o9ZN/NRMLkg_>
+KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$C&VcHB4h-S!b>eNraGq;?srt@s'G_2
+rETA,s'#>'s&f8%r)Whtr`&eor_i_mr)!Ags%`Gcr_3;aqb$iZrCH]RqaUBMogJc9pq?U<oXj_-
+mCN?eqF:0Kr(-cXq+CWZrCm)_r_<Ghr8RIpo?70XjNIL/s'Yh7r*oY8s()%=rau.Br+Q(Ds(_FH
+rbVUOqelCOrG_XRrGqjXq/lRXr-%dXqfqs_m<\2Inp:4ZrHS-^rc\9`qK2[WrGqXPlu;`>rc8!Z
+r,hp\s*"?bs*4QhrHeKj!.=`ns*artrIFp!!.t0%!ec8]rItB/Lku"d!fDnorJ^c9!07#=s,d8C
+rf[;Fs-3JIs-<YOrKmYSR[X5Fs.'+[rgj@eTV/!PU8"F^U]I<hrhfpuWN)u!XT#=kY-5(6Z*L^B
+['mEP\@K/]]=bej^V@S#_Sa=2`Q#s>ai_fMc-FV\d*^:jeC<%"f@\d1g=tE=h;7&Ii8N\Uj5f=a
+k3(t-klL)8rp0^RmdC)Cs6p$YrUU![rq--]rq??cq=sm`qYKd[q>C!cl2H86]DmB~>
+JcC<$JcGBBnc&IbrVZNhrqcZjr:p9cs7ZEas7?<_rUU!Y!:]sU!q,ICrp0^PlK\B5!pJh1roOII
+jQ,@]io8qri!8/rhVI#CgtVh^!SQ-)f)aIQrmV,#da?Ihci243c-4ASb/q`Ga2Z*:_ns:,^q[Xt
+]Y(kf\[],W[^<BIZEUR:Y-"e+Wi;qpVPU)`U7n6PSt;IAS!o_3Q^*i#PEM&iO,o9ZN/NRMLkg_>
+KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$C&VcHB4h-S!b>eNraGq;?srt@s'G_2
+rETA,s'#>'s&f8%r)Whtr`&eor_i_mr)!Ags%`Gcr_3;aqb$iZrCH]RqaUBMogAeUrh[kupko,@
+qF:0Kr(-cXq+CWZrCm)_r_<Ghr2'.To9]?Aka26Ts'Yh7r*oY8s()%=rau.Br+Q(Ds(_FHrbVUO
+qelCOrG_XRrGqjXq/lRXr-%dXqfqs_m<\2Inp:4ZrHS-^rc\9`qK2[WrGqXPlu;`>rc8!Zr,hp\
+s*"?bs*4QhrHeKj!.=`ns*artrIFp!!.t0%!ec8]rItB/Lku"d!fDnorJ^c9!07#=s,d8Crf[;F
+s-3JIs-<YOrKmYSR[X5Fs.'+[rgj@eTV/!PU8"F^U]I<hrhfpuWN)u!XT#=kY-5(6Z*L^B['mEP
+\@K/]]=bej^V@S#_Sa=2`Q#s>ai_fMc-FV\d*^:jeC<%"f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(t-
+klL)8rp0^RmdC)Cs6p$YrUU![rq--]rq??cq=sm`qYKd[q>C!cl2H86]DmB~>
+JcC<$JcGBBnc&IbrVZNhrqcZjr:p9cs7ZEas7?<_rUU!Y!:]sU!q,ICrp0^PlK\B5!pJh1roOII
+jQ,@]io8qri!8/rhVI#CgtVh^!SQ-)f)aIQrmV,#da?Ihci243c-4ASb/q`Ga2Z*:_ns:,^q[Xt
+]Y(kf\[],W[^<BIZEUR:Y-"e+Wi;qpVPU)`U7n6PSt;IAS!o_3Q^*i#PEM&iO,o9ZN/NRMLkg_>
+KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$C&VcHB4h-S!b>eNraGq;?srt@s'G_2
+rETA,s'#>'s&f8%r)Whtr`&eor_i_mr)!Ags%`Gcr_3;aqb$iZrCH]RqaUBMogJaXk">5<qF^BO
+!(H`Rp.,$OrCQfWr_*2`qb@&b!)NMopJUT[i_o_^s'Yh7r*oY8s()%=rau.Br+Q(Ds(_FHrbVUO
+qelCOrG_XRrGqjXq/lRXr-%dXqfqs_m<\2Inp:4ZrHS-^rc\9`qK2[WrGqXPlu;`>rc8!Zr,hp\
+s*"?bs*4QhrHeKj!.=`ns*artrIFp!!.t0%!ec8]rItB/Lku"d!fDnorJ^c9!07#=s,d8Crf[;F
+s-3JIs-<YOrKmYSR[X5Fs.'+[rgj@eTV/!PU8"F^U]I<hrhfpuWN)u!XT#=kY-5(6Z*L^B['mEP
+\@K/]]=bej^V@S#_Sa=2`Q#s>ai_fMc-FV\d*^:jeC<%"f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(t-
+klL)8rp0^RmdC)Cs6p$YrUU![rq--]rq??cq=sm`qYKd[q>C!cl2H86]DmB~>
+JcC<$JcG?Ao)ARcrVZNhrqcWir:p<ds7ZEas7H?_rUL$[nF6GGs6fpSrp0^PlK\B5!pJh1roOII
+jQ,@]io8qrhu_fmhYu=3gtVh^!SQ-)f)aIQrmZAFda?Ihcd0n^c-4ASb/q`Ga2Z*;_ns:,^q[Xt
+]Y(kf\[],W[^<BIZEUR:Xf\\*Wi;qpVPU)`U7n6PSt;IAS!fY2Q^*i#PEM&iO,f3YN/NOLLkg_>
+KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$C&VcHB4h-Ss'u+>raPn9!+>b4s'G_2
+rETA,s'#>'s&f;&qc<_sr`&eor_ibnr)!Agr_EAcr_3;aqb$fYrCH]RqaUBMpI,#=!T1Th^A#>'
+]^NH47J]LH8,Z!V8bu'X9E%W]:&[lf:]05?bl,``biR%I?iFI4@JjU7A,^$:Ac?<@BDcHCC&VlE
+C]A5MD>S5MDuFYPEW'qVF89qVFo6FVGPZR\H0]eKHgc:ZH2Mp`GQ)daFo$4ZF8^.REU.T=EW1"X
+F8U.[FoHR_GQ2mfH2W'hHiJKmIK+crJ,XuuJH1<#K*$^[L&Qi,L]<20M>rJ5MuJ\8NW5%<O8k=A
+Oo:FEPE_=1Q2d-MQi3<OR/i]SRf]+NSc55\T)bP`U&UheU].%iV5F6i8#WDeWiN2%Xf\b0YctC<
+Za7$H[^NZT\[f>b]Y2%o^VI_'_o0O5a2l?Db0/#RcHab_dF-LneCE1&f\,!4gYCW@hV[8Mir7sA
+jQ5OdkNMp0!UB"MliQSBmf)YVnF?&Io)J=]o_eC]pAXg^q#'scqXXOYr:g0Rrdk*\s*t~>
+JcC<$JcG?Ao)ARcrVZNhrqcWir:p<ds7ZEas7H?_rUL$[nF6GGs6fpSrp0^PlK\B5!pJh1roOII
+jQ,@]io8qrhu_fmhYu=3gtVh^!SQ-)f)aIQrmZAFda?Ihcd0n^c-4ASb/q`Ga2Z*;_ns:,^q[Xt
+]Y(kf\[],W[^<BIZEUR:Xf\\*Wi;qpVPU)`U7n6PSt;IAS!fY2Q^*i#PEM&iO,f3YN/NOLLkg_>
+KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$C&VcHB4h-Ss'u+>raPn9!+>b4s'G_2
+rETA,s'#>'s&f;&qc<_sr`&eor_ibnr)!Agr_EAcr_3;aqb$fYrCH]RqaUBMpI+tVnr;C_qMP>B
+qF:-JrCHiXqF^]Zr_3/_r_<Ghr2&hKrKm>Il'MBVra>_6r*o\9rabq<rau.Br+Q+ErbD=Gs(q[O
+qelCOrG_XRrGqjXq/lRXr-%dXqKVj^l[&2Mms=qXr-8'^rc\6_qK2^XrGqXPlYuW=rc8!Zr,hs]
+rc\6as*+NhrHeKjs*Xfos*jutrdb$"!.t0%!ec8]reCH.s+pZ2s,-i7rf$l:s,R)>s,d8CrK75G
+Pa)-3s-<YOrL!VQ!1NkU!h>gPrgs.^!20=bs.TLgrhKRkVZ*J`W2ZesX/i>(Xfek3Yd(L?Za@-K
+[^WcW\\#Me]tV7r^r!t+`5T^9aN2KGbKS5VcHjkbdaQ^qe^rF*g"P07gtgfChr*JQro41CjlY^g
+kl0fIlKeH9!q#FDrpKpXnaZSKs7?9_r:U'_rqH6`r;$9eo)&4[p\j=TJcE=]J,~>
+JcC<$JcG?Ao)ARcrVZNhrqcWir:p<ds7ZEas7H?_rUL$[nF6GGs6fpSrp0^PlK\B5!pJh1roOII
+jQ,@]io8qrhu_fmhYu=3gtVh^!SQ-)f)aIQrmZAFda?Ihcd0n^c-4ASb/q`Ga2Z*;_ns:,^q[Xt
+]Y(kf\[],W[^<BIZEUR:Xf\\*Wi;qpVPU)`U7n6PSt;IAS!fY2Q^*i#PEM&iO,f3YN/NOLLkg_>
+KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$C&VcHB4h-Ss'u+>raPn9!+>b4s'G_2
+rETA,s'#>'s&f;&qc<_sr`&eor_ibnr)!Agr_EAcr_3;aqb$fYrCH]RqaUBMpI+sZr_(d6oLT$O
+qF:-JrCHiXqF^]Zr_3/_r_<Ji=8c7h;Z0JO;Z:&&@/aU4@fKs;AGg$<B)ZH@B`DfGCAVfHD#S;K
+DZ4SQE;OYRErC(TFT$@[G4p.VGku^OHLuRQHMr-eGkuX`G5ZR[FT-@[EqaS>E;4GPErL.XFT6L_
+G5ZXbGQ<$fHN/?lI/\QoIfFosJH(0#K)L<'KS>-ZLB!&/M#N82MZ8V6N;nn;NrG+>OT1IAOogi3
+Pl6mIQ2m9MR/`QSRf/]WS=Q5MT)YD_T`1YbU&^tfU]I<hrhi8bWN)u!X/rG*Y-5(6Z*L^B['d?N
+\%&uZ]=bei^;%Fu_SX4/`Pom=aN;TJbg"GYcd:(fe'umtf@S[.g=k<:h;-rFi8N\pis"N*k2tjj
+rojIKli-5PmI'EAmfN"Knbr%YoDeI\p&=[ap\FU^q>C*[qtU*`rTO63s185\~>
+JcC<$JcG?Anc&IbrVZNhrqcZjr:p<drq?<`s7H?_rpp*Zs7$$Vs6]mSrTjUOlK\B5!pJh1roO:D
+jQ-=#!TN);i;_[7hYu=3gtVh^IbEB+f@SU(e^W*tda?Ihd*L"_c-4ASb/q`Ga2Z*;_ns:,^q[Xt
+]Y(kf\[],W[^<BIZEUR:Xf\\*Wi;qpVPU)`U7n6PSt;IAS!fY2Q^*i#PEM&iO,f3YN/NOLLkg_>
+KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9s).jR$>aKnC2%BqBP1phrac.A@q5LI!b#JErEfV4
+?![D6r`fD+rE9,%s&],!r`/ttqc!Mmr_`Sis%iVhqb@)ar_*)[r^m&ZpIG*MpI4sI!9*q8qS):/
+o=XS)q*t'Jr(-cXq+CWZrCm)_rD*Ags5F"9qp"HNk0*a2ra>b7qdTS8rabq<rau1Cqe6"DrbD=G
+s(q[OqelCOrG_XRrGqjXq/lOWr-%dXqKVg]d!GV8r-8'^rHA0_qK2^XrGqXPpi-+Kpi-%Krc8!Z
+r,hs]s*"?bs*4Qhrd+Tks*Xfos*artrI=s#JqEuSs+CB+rItB/Lku%es,-i7rf$l:s,R)>s,d8C
+rf[;Fs-3JI!g]1>rL!VQ!1NkUs-s([rgs.^s.K@b!MZ@gV#R7kVZ*JeW2ZesX/i>(Xfek3Yd(L?
+Za@-K[^WcW\[oDc]Y2(p^qmn)_o0O6a2l?DbKJ,ScHaeadF-Lne^i@(f\,!4gYL]Bhr*GOioB([
+jo4BMkNM0plK[^%m-X3.rpTmVs7-*Zs7?9_r:U'_rqH9ar;$9eo)&4[p\j=TJcE7[J,~>
+JcC<$JcG?Anc&IbrVZNhrqcZjr:p<drq?<`s7H?_rpp*Zs7$$Vs6]mSrTjUOlK\B5!pJh1roO:D
+jQ-=#!TN);i;_[7hYu=3gtVh^IbEB+f@SU(e^W*tda?Ihd*L"_c-4ASb/q`Ga2Z*;_ns:,^q[Xt
+]Y(kf\[],W[^<BIZEUR:Xf\\*Wi;qpVPU)`U7n6PSt;IAS!fY2Q^*i#PEM&iO,f3YN/NOLLkg_>
+KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9s).jR$>aKnC2%BqBP1phrac.A@q5LI!b#JErEfV4
+?![D6r`fD+rE9,%s&],!r`/ttqc!Mmr_`Sis%iVhqb@)ar_*)[r^m&ZpIG*MpI4sIrMAS7kD]=s
+q*t'Jr(-cXq+CWZrCm)_rD*AgrM9=YkEtP$ra5Y4s'be6s'u%=r+5k>s(D4Bs(VIIqeQ4Jrb_OM
+rbqaSqf2RTrH%dVr,qp\p36@Xq0C>5r-A3bqKMm]rcS'ZrcA$YpMotIqeu7Kq/QCSrcA!Zs)n?b
+rHJ9ds*=Tis*OcnrdFfq!.Xrt!eGrTre(6(!/:B+!f)Sfre^Z4s,6l8s,I&=rf@)@s,m;Ds-*JI
+rKRGMQ^@Z<s-WkUrL<hW!1j+\s.B=arh0@eU].(hV#[ClVbF%gWiE,#XKAV-YHY79ZEpmE[C3NQ
+\@K/]]=bei^V@S#_SX4/`Q#s>aN;WKbg"GYd*^7he'uq!f@S[.g=k<;h;7&Ii8N\Uj5f>$jpUA9
+l07Kulg4!*mI'uBs7$'Yrpp*\s7H6^rq??cqY:!ar;-!]q#'mbkl-/5\Gq'~>
+JcC<$JcG?Anc&IbrVZNhrqcZjr:p<drq?<`s7H?_rpp*Zs7$$Vs6]mSrTjUOlK\B5!pJh1roO:D
+jQ-=#!TN);i;_[7hYu=3gtVh^IbEB+f@SU(e^W*tda?Ihd*L"_c-4ASb/q`Ga2Z*;_ns:,^q[Xt
+]Y(kf\[],W[^<BIZEUR:Xf\\*Wi;qpVPU)`U7n6PSt;IAS!fY2Q^*i#PEM&iO,f3YN/NOLLkg_>
+KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9s).jR$>aKnC2%BqBP1phrac.A@q5LI!b#JErEfV4
+?![D6r`fD+rE9,%s&],!r`/ttqc!Mmr_`Sis%iVhqb@)ar_*)[r^m&ZpIG*MpI4sI!*0"trCc3D
+k"5A<p.,$OrCQfWr_*2`qb@#as%iSqqbtj>ra5Y4s'be6s'u%=r+5k>s(D4Bs(VIIqeQ4Jrb_OM
+rbqaSqf2RTrH%dVr,qp\p36@Xq0C>5r-A3bqKMm]rcS'ZrcA$YpMotIqeu7Kq/QCSrcA!Zs)n?b
+rHJ9ds*=Tis*OcnrdFfq!.Xrt!eGrTre(6(!/:B+!f)Sfre^Z4s,6l8s,I&=rf@)@s,m;Ds-*JI
+rKRGMQ^@Z<s-WkUrL<hW!1j+\s.B=arh0@eU].(hV#[ClVbF%gWiE,#XKAV-YHY79ZEpmE[C3NQ
+\@K/]]=bei^V@S#_SX4/`Q#s>aN;WKbg"GYd*^7he'uq!f@S[.g=k<;h;7&Ii8N\Uj5f>$jpUA9
+l07Kulg4!*mI'uBs7$'Yrpp*\s7H6^rq??cqY:!ar;-!]q#'mbkl-/5\Gq'~>
+JcC<$JcG?Anc&IbrVZNhrqcWir:p<ds7ZEas7H?_rUU!Y!:]sU!q,ICrp9[N!:'OI!pJh1roO:D
+jQ-=#!TN);i;_[7hYu=BgtUT;g=b03f@SU)e^W*tdf.X4d*L"_c-4ASb/q`Ga2Z*;_ns:,^q[Xt
+]Y(kf\[],W[C!9HZ*:I9Xf\\)Wi;qpVPU)`U7n6PSt2C@S!fY2QBd`"P*1rhO,f3YN/NOLLkg_=
+KS+o/JUi9"I=6KiH?sj]GB\4QFEDSEEH,r9rb`*\Chmg$C2%?pB4kiUAcH9@A,]s;@K0a7?iOI4
+?2\%->Q7n)=oVV(=8Z+u<W?%r;uT\p;>X2i:]=,e:&[ic9D_?[8c;3T8,>^J7K5dSiVC4R^%8o,
+]D>"i8,Z!V8bu'X9E%W]:&[oe:]92Bc19*AbPklJ@/j[5@fBm:AGg$<B)cNAB`;`FCA_lHD#S;K
+DZ4SQE;OYRErC(SFSp:ZG4g(VGklX5HMi'dGklR_G5cX\FT$:[EqjYME:n/GE;FSRErL.XFT6L`
+G5ZUdG^4T5H3/G@I/\QoIfFosJ-(:RK)UE&KE-`*LB!&/M#N54MMmDlN;nn;NrG+>OT1IBP5gaG
+Pl?sJQN*<MQi`\ERf/`US,f,YScYOWT`1YbU&^tfUg0anVPg>jW2ZesX/i>(Xfek3Yd(L>Za7$H
+[^NZT\[oDc]Y2%o^VI\&_o0O5`lH0Bb0.uPcHab_dF$CleCE.%f@\d1gYCW@hV[8LiSrnXjQ5Od
+kNM-ol0@U6liQSBmf)YVnF?&Inc8:\o_nI^pAXg_q#1$cqXaUZr:g0Rrdk*Xs*t~>
+JcC<$JcG?Anc&IbrVZNhrqcWir:p<ds7ZEas7H?_rUU!Y!:]sU!q,ICrp9[N!:'OI!pJh1roO:D
+jQ-=#!TN);i;_[7hYu=BgtUT;g=b03f@SU)e^W*tdf.X4d*L"_c-4ASb/q`Ga2Z*;_ns:,^q[Xt
+]Y(kf\[],W[C!9HZ*:I9Xf\\)Wi;qpVPU)`U7n6PSt2C@S!fY2QBd`"P*1rhO,f3YN/NOLLkg_=
+KS+o/JUi9"I=6KiH?sj]GB\4QFEDSEEH,r9rb`*\Chmg$C2%?pB4kiUAcH9@A,]s;@K0a7?iOI4
+?2\%->Q7n)=oVV(=8Z+u<W?%r;uT\p;>X2i:]=,e:&[ic9D_?[8c;3T8,>^J7K5dSV;mQuN;\\2
+7eK:M8Gl'U9)VE^9_qK_:B"&fV":#BR-U+<?iFI5@JjU6A,^$:Ac?<ABDcHBC&VlFC]8/LD>S5M
+DuFYPEW'qVF80kTFo6FUGPcX\H.%$:H2Mp_GQ)dbFo$4YF8g4TEVXSHDu+GLEW1"XF8U.[FoQX`
+G63#7H2W$jH[L5?IK+crJ,Xs"JV&LQKE$T)L&Qi,L]<20M#rQmMuJ\8NW5%<O8k=AOoCODPQ-mH
+Q2d0MQi39QR@9TCS,\uYSc,,]T:hkVU&UheU].&oV5C,fVl6PnWiE,#XKAV-YHY79ZEggC['d?N
+\%&u[]=bei^;%Fu_8=+.`Poj;aN;TJbKS8Wcd:(edaZdsf%8O+g"P39h;-rFi8ESRj5]4^k2tjj
+kiq?sli-5PmI'EAmfN"Knbr"YoD\C\p&=[ap\O[`q>:$[qtU*`rTO63s0hrX~>
+JcC<$JcG?Anc&IbrVZNhrqcWir:p<ds7ZEas7H?_rUU!Y!:]sU!q,ICrp9[N!:'OI!pJh1roO:D
+jQ-=#!TN);i;_[7hYu=BgtUT;g=b03f@SU)e^W*tdf.X4d*L"_c-4ASb/q`Ga2Z*;_ns:,^q[Xt
+]Y(kf\[],W[C!9HZ*:I9Xf\\)Wi;qpVPU)`U7n6PSt2C@S!fY2QBd`"P*1rhO,f3YN/NOLLkg_=
+KS+o/JUi9"I=6KiH?sj]GB\4QFEDSEEH,r9rb`*\Chmg$C2%?pB4kiUAcH9@A,]s;@K0a7?iOI4
+?2\%->Q7n)=oVV(=8Z+u<W?%r;uT\p;>X2i:]=,e:&[ic9D_?[8c;3T8,>^J7K5dS<W#MN9'8eB
+7eK:M8Gl'U9)VE^9_qK_:B"&f=S#JD;Z:&&@/j[5@fBm:AGg$<B)cNAB`;`FCA_lHD#S;KDZ4SQ
+E;OYRErC(SFSp:ZG4g(VGklX5HMi'dGklR_G5cX\FT$:[EqjYME:n/GE;FSRErL.XFT6L`G5ZUd
+G^4T5H3/G@I/\QoIfFosJ-(:RK)UE&KE-`*LB!&/M#N54MMmDlN;nn;NrG+>OT1IBP5gaGPl?sJ
+QN*<MQi`\ERf/`US,f,YScYOWT`1YbU&^tfUg0anVPg>jW2ZesX/i>(Xfek3Yd(L>Za7$H[^NZT
+\[oDc]Y2%o^VI\&_o0O5`lH0Bb0.uPcHab_dF$CleCE.%f@\d1gYCW@hV[8LiSrnXjQ5OdkNM-o
+l0@U6liQSBmf)YVnF?&Inc8:\o_nI^pAXg_q#1$cqXaUZr:g0Rrdk*Xs*t~>
+JcC<$JcG?AnG`Cbr;?EgrqcZjr:p9cs7ZEas7H?_rUL$[nF6DF!q,ICrp9[N!:'RJs60LGroO:D
+jQ-=##NF_$i8EMMhYu>\gtUT;g=b03f@SU)e^W*tdaHOjd*L"_c-4ASb/q`Ga2Z*;_ns:,^q[Xt
+]Y(kf\[],W[C!9HZ*:I8Xf\\)Wi;noVPU)`U7n6PSt2C@R[KP1QBd`"P*1rhO,f3YN/EIKLkg_=
+KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEs)A6^Df9N2D/B2e!GZ?JBF&6_An>OaA7K-K@fKj:@/XI4
+?N4=0>lS%->5_V'=T;J#<rQ,!<;]\p;Z9Pk;#a>j:Adic9`@]^9)V?[8G>XM7eT:LiVC4Q^%8o.
+]D>"i8,PpV8bl!X9DqQ\:&[oe:]9/9c2#TJbPbfJ@/aU4@fBm:AGg$=B)ZH@B`;`FCA_lHD#S;K
+DZ4SQE;FSRErC(SFSp:YG4g(UGkcR8HM`!dGklR^G5cX\FT-@[EqjYOE:\#EE;FSRErL.YFT6L`
+G5ZXbGlN'gHN/<lI/SHpIXckHJ-(:RK)UB(KS>-ZLB!#/M#N82M?&S5Muo!!NrG+>OT1IBP5gaG
+Pl?sJQN*<MQi`\ERf/`US,f,YT)YD_T`1YbUAq"fU]I<hrhg.&WMuntX/i>(Xfel,YXGb%Za7$H
+[^NZT\[f;`]Y(ql^VI\&_Sa=2`lH0Aai_fNc-FV\d*^:jeC<%"f@S^0g=tE=h;7&Ii8N\Uj5f=a
+k3(t-klL)8rp0[Qmf)\TnGi%Xo)J=]o_nI^pAXg_q#1$dqXaUZr:g0Qrdk*Ws*t~>
+JcC<$JcG?AnG`Cbr;?EgrqcZjr:p9cs7ZEas7H?_rUL$[nF6DF!q,ICrp9[N!:'RJs60LGroO:D
+jQ-=##NF_$i8EMMhYu>\gtUT;g=b03f@SU)e^W*tdaHOjd*L"_c-4ASb/q`Ga2Z*;_ns:,^q[Xt
+]Y(kf\[],W[C!9HZ*:I8Xf\\)Wi;noVPU)`U7n6PSt2C@R[KP1QBd`"P*1rhO,f3YN/EIKLkg_=
+KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEs)A6^Df9N2D/B2e!GZ?JBF&6_An>OaA7K-K@fKj:@/XI4
+?N4=0>lS%->5_V'=T;J#<rQ,!<;]\p;Z9Pk;#a>j:Adic9`@]^9)V?[8G>XM7eT:LV;dKtN;nh4
+7eK:L8Gu-U9)_K^9_qK_:B"&fV!FHAR-g7=?iOO5@JjU6A,^$:AcHBABDcHBC&VlFC]8/LD>S5M
+DuFYOEW1"WF80kTFo-@TGPZRZH.I<=H2W!`GPu^aFo$4ZF8^.SEVj_HDu+GLEW1"XF8^4\FoQX`
+GQ2pfH2`-iHN8HlI0+kIJ,Xs"JV&LQK*$^[L&Qi,LB*/0M>rG5MuAS9NK0%uO8k=AOoCODPQ-mH
+Q2d0MQi39QR@9TCS,\uYSc,/[T)bP`U&UkeU].%iV5F6i$`L&(WiE,#XKAV-YPtaoZ*L^B['d?N
+\%&uZ]">Vf]tV7s_8=(,`5Ta:aN2KGbKS5VcHjkbdaQ^qe^i@(g"P07gtgfChr*GOioB([jlY^g
+kl0fIlKeH9!U]=Sn,MnWnc&+ZoDeI]p&=[ap\O[`q>C*\qtU*`rTF02s0_lW~>
+JcC<$JcG?AnG`Cbr;?EgrqcZjr:p9cs7ZEas7H?_rUL$[nF6DF!q,ICrp9[N!:'RJs60LGroO:D
+jQ-=##NF_$i8EMMhYu>\gtUT;g=b03f@SU)e^W*tdaHOjd*L"_c-4ASb/q`Ga2Z*;_ns:,^q[Xt
+]Y(kf\[],W[C!9HZ*:I8Xf\\)Wi;noVPU)`U7n6PSt2C@R[KP1QBd`"P*1rhO,f3YN/EIKLkg_=
+KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEs)A6^Df9N2D/B2e!GZ?JBF&6_An>OaA7K-K@fKj:@/XI4
+?N4=0>lS%->5_V'=T;J#<rQ,!<;]\p;Z9Pk;#a>j:Adic9`@]^9)V?[8G>XM7eT:L<VoGM9'JqD
+7eK:L8Gu-U9)_K^9_qK_:B"&f=R/oE;Z0u&@/aU4@fBm:AGg$=B)ZH@B`;`FCA_lHD#S;KDZ4SQ
+E;FSRErC(SFSp:YG4g(UGkcR8HM`!dGklR^G5cX\FT-@[EqjYOE:\#EE;FSRErL.YFT6L`G5ZXb
+GlN'gHN/<lI/SHpIXckHJ-(:RK)UB(KS>-ZLB!#/M#N82M?&S5Muo!!NrG+>OT1IBP5gaGPl?sJ
+QN*<MQi`\ERf/`US,f,YT)YD_T`1YbUAq"fU]I<hrhg.&WMuntX/i>(Xfel,YXGb%Za7$H[^NZT
+\[f;`]Y(ql^VI\&_Sa=2`lH0Aai_fNc-FV\d*^:jeC<%"f@S^0g=tE=h;7&Ii8N\Uj5f=ak3(t-
+klL)8rp0[Qmf)\TnGi%Xo)J=]o_nI^pAXg_q#1$dqXaUZr:g0Qrdk*Ws*t~>
+JcC<$JcG<@nc&IbrVZNhrqcWir:p<ds7ZB`s7H?_rpp*Zs7$$Vs6fpSrp9[N!:'RJs60LGroO:D
+jQ-=#!oi1trnmh7hYu@2g]6+.g&]mZrmu8Ce^W*te'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xt
+]Y(kf\[],W[C!9HZ*:I8Xf\\)Wi;noVPU)`U7n6PSt2C@R[KP1QBd`"P*1rhO,f3YN/EIKLkg_=
+KS+o/JUi9#IXQTjH?sj]GB\4QFEDSErc&KgDf0H0Ci!m&C2%BqBP1siral+?!+Z";s'bq8rEoS2
+s'>S.s',J+rE9,%s&],!s&K%trDW\ns&&\jr_NPhqb@)ar_*)[rCQrYpIG!Jq*k;ApV,FroXt&j
+oLJjNr(6]Vr_*2`qb@#ar_NRNs4un`qon?KrEoS4raG_6raYq<r+5n?rb).Brb;@Hr+l:Jrb_OM
+rbqaSqJlISrH%aUr,qm[oQU+Upj(S>qg&*aqKMm]rcS'ZrH%sYpi61MnSe;DqJlLTs)\*[s)n?b
+rHA<fH$TC8s*Ocnrd=isIt.HJ!eGrTrdt9*Kn]M\!f)SfreU]6Mi7Rns,@#=rJq#AOcfX+s-*JI
+rg!MLs-N\O!h#LGrL<hW!1j([s.9:arLj:eUSIgas.o^mrhg.&WMuntX/rD)Xfel,YXPh&Za7$H
+[^NZT\[f;`]Y(ql^V@S#_Sa=2`Q#s>aND]Lbg"GYcdC.ge'umtf@S[.g=k<:h;-rFi8ESRj5]4^
+k2tjjrojIKli-5OmI'uBs6p$YrUU![s7H9_s7ZHdqY:$brVH0`q#'jak5Kr3[/YX~>
+JcC<$JcG<@nc&IbrVZNhrqcWir:p<ds7ZB`s7H?_rpp*Zs7$$Vs6fpSrp9[N!:'RJs60LGroO:D
+jQ-=#!oi1trnmh7hYu@2g]6+.g&]mZrmu8Ce^W*te'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xt
+]Y(kf\[],W[C!9HZ*:I8Xf\\)Wi;noVPU)`U7n6PSt2C@R[KP1QBd`"P*1rhO,f3YN/EIKLkg_=
+KS+o/JUi9#IXQTjH?sj]GB\4QFEDSErc&KgDf0H0Ci!m&C2%BqBP1siral+?!+Z";s'bq8rEoS2
+s'>S.s',J+rE9,%s&],!s&K%trDW\ns&&\jr_NPhqb@)ar_*)[rCQrYpIG!Jq*k:Zb`2IXqaU3J
+rCHiXq+CWZrCm)_rD*>frM8PCqO$];rEoS4raG_6raYq<r+5n?rb).Brb;@Hr+l:Jrb_OMrbqaS
+qJlISrH%aUr,qm[oQU+Upj(S>qg&*aqKMm]rcS'ZrH%sYpi61MnSe;DqJlLTs)\*[s)n?brHA<f
+H$TC8s*Ocnrd=isIt.HJ!eGrTrdt9*Kn]M\!f)SfreU]6Mi7Rns,@#=rJq#AOcfX+s-*JIrg!ML
+s-N\O!h#LGrL<hW!1j([s.9:arLj:eUSIgas.o^mrhg.&WMuntX/rD)Xfel,YXPh&Za7$H[^NZT
+\[f;`]Y(ql^V@S#_Sa=2`Q#s>aND]Lbg"GYcdC.ge'umtf@S[.g=k<:h;-rFi8ESRj5]4^k2tjj
+rojIKli-5OmI'uBs6p$YrUU![s7H9_s7ZHdqY:$brVH0`q#'jak5Kr3[/YX~>
+JcC<$JcG<@nc&IbrVZNhrqcWir:p<ds7ZB`s7H?_rpp*Zs7$$Vs6fpSrp9[N!:'RJs60LGroO:D
+jQ-=#!oi1trnmh7hYu@2g]6+.g&]mZrmu8Ce^W*te'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xt
+]Y(kf\[],W[C!9HZ*:I8Xf\\)Wi;noVPU)`U7n6PSt2C@R[KP1QBd`"P*1rhO,f3YN/EIKLkg_=
+KS+o/JUi9#IXQTjH?sj]GB\4QFEDSErc&KgDf0H0Ci!m&C2%BqBP1siral+?!+Z";s'bq8rEoS2
+s'>S.s',J+rE9,%s&],!s&K%trDW\ns&&\jr_NPhqb@)ar_*)[rCQrYpIG!Jq*k9_qFf%)qaU3J
+rCHiXq+CWZrCm)_rD*>frE//[k>M7cs'Yh7r*oY8rabq<s(;7Cr+Q(DrbD@HrbVRNqelCOrG_UQ
+rGqjXpiQFVqf_UUq0;[[g3WXAr-8'^rHA0_qK2[Wrc7dRqf)(Dqf)COrc8$[r,hs]s*"?b!dK!9
+rd+Tks*Xfo!e,WKrdY'$JqEuS!ec8]re:K0Lku%e!fDnorf$l:!07#=!g&P,rf[;Fs-3MJs-E\O
+rKmYSR[X2Es-s([rLX%]!20:a!huHbrhTRj!2fan$`L&(WiE,$XKAV-YPtapZ*L^B['d?N\%&uZ
+]">Vf]tV7r^qmn*`5T^8a2l?EbKJ,ScHab`dF-LneCE1&f\,!4gYCW@hV[8LiSrnXjQ5OdkNMp0
+!UB"MliHMArpTmV!:g$Ys7?9_rUp3arqH9arV?Ego_\F]pAO.QJcE+WJ,~>
+JcC<$JcG<@nc&FarVZNhrqcZjqtU3cs7ZEas7H?_rUU!Ys7$$Vs6fpSrp9[N!:'OI!pJh1roO:D
+jQ-=#!oi1trnn%=hVR)Egt^Z`g&]mZrmq2%ec+'Ie'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xt
+]Y(kf\[],W[C!9GZ*:I8Xf\Y(Wi;noVPL#_TqS-OSt2C@R[KP0QBd`!P*1rhO,f3YN/EIKLkg_=
+KS+o/JUi9#IXQTjH?sj]GB\4QFEDSEEcH)<Df0H0D/=!'C2.J^BE;aXral+?s'u%;s'bq8ra5\3
+ra#J-s',M,r)s&%r`B&!r`/ttr)<Vnr_`Sis%iVhr([/ar_*,\rCQrYogedHr'gVDp:f=qot:2l
+oLJgMrCQfWrCd,`qG$rar_NPjs4uh^qTS<LrEoS4raG_6raYq<r+5n?rb).Brb;@Hr+l:Jrb_OM
+rbqaSqJlISrH%^Tr,qm[oQU+UpNbS@qg&*aq02d\rcS'ZrcA$Yq/Q:Nn8J2CqJlLTs)\*[s)n?b
+rceBes*=Ti!df<BrdFfq!.Xuu!eGrTrdt9*Kn]M\#D\+kM2@+IMuAS9NK0%uNrkE*OoCODPQ-mH
+Q2d0MQi<BPRK&`SS,\uYSc,/[T)bP_U&UheU].(hV#[ClVuN[qWW&n%X/rD)Xfel,YQ_;;Za7$H
+rjG>+\@K/]]=bej^V@S#_SX4/`Poj<aN;TJbKS5Vcd:(edaQ^rf%8O+g"P07gtgiEi8ESRj5]4^
+jlY^gkiq?slg*p(mHs?@mfN"Knc&+ZoDeI]p&=[bp\O[`q>L0^qt^0`rT4$0s0M`U~>
+JcC<$JcG<@nc&FarVZNhrqcZjqtU3cs7ZEas7H?_rUU!Ys7$$Vs6fpSrp9[N!:'OI!pJh1roO:D
+jQ-=#!oi1trnn%=hVR)Egt^Z`g&]mZrmq2%ec+'Ie'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xt
+]Y(kf\[],W[C!9GZ*:I8Xf\Y(Wi;noVPL#_TqS-OSt2C@R[KP0QBd`!P*1rhO,f3YN/EIKLkg_=
+KS+o/JUi9#IXQTjH?sj]GB\4QFEDSEEcH)<Df0H0D/=!'C2.J^BE;aXral+?s'u%;s'bq8ra5\3
+ra#J-s',M,r)s&%r`B&!r`/ttr)<Vnr_`Sis%iVhr([/ar_*,\rCQrYogedHr'gU]bDlCXr'p<K
+r(-cXq+CTYr_3/_r_EGgs%r`kj-fb2n!Eu[s'Yh7r*oY8rabq<s(;7Cr+Q(DrbD@HrbVRNqelCO
+rG_UQrGqjXpN6=Uqf_UUq0;XZh0SsDr-8$]rHA0_qK2^XrGq^Rqf)%Cqf)COrc8$[r,hs]s*"Bc
+s*4Qhrd"WmI!kpAs*artrdY'$JqEuS!ec8]re:Z5LkpnEMMd>jMuo!!NrG(@OHG\)P5gaGPl?sJ
+QN*<NR/`TSRf/`US,f,YT)YD_T`(SaU&^tfV#R7kVZ*LnVuWgrWWoN*XKAV-YPta0Z*L^B['fnA
+8%6"=\[oDc]Y;.q^qmn)_o0O5`lQ6Cb0.uPc-FY^dF$CkeCE.%f@\d1g=tE=hV[8LiSrnXjQ5Lc
+k3(sml0@U#m-O-,mf)YVnF?&Jo)J=]o_nI^pAam`q#1$eqXj[\r:^*Nrdk*Us*t~>
+JcC<$JcG<@nc&FarVZNhrqcZjqtU3cs7ZEas7H?_rUU!Ys7$$Vs6fpSrp9[N!:'OI!pJh1roO:D
+jQ-=#!oi1trnn%=hVR)Egt^Z`g&]mZrmq2%ec+'Ie'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xt
+]Y(kf\[],W[C!9GZ*:I8Xf\Y(Wi;noVPL#_TqS-OSt2C@R[KP0QBd`!P*1rhO,f3YN/EIKLkg_=
+KS+o/JUi9#IXQTjH?sj]GB\4QFEDSEEcH)<Df0H0D/=!'C2.J^BE;aXral+?s'u%;s'bq8ra5\3
+ra#J-s',M,r)s&%r`B&!r`/ttr)<Vnr_`Sis%iVhr([/ar_*,\rCQrYogedHr'gTbq+K(,r_*/Y
+oLJgMrCQfWrCd,`qG$rar_NPjs&e/Wlr*dhs'Yh7r*oY8rabq<s(;7Cr+Q(DrbD@HrbVRNqelCO
+rG_UQrGqjXpN6=Uqf_UUq0;XZh0SsDr-8$]rHA0_qK2^XrGq^Rqf)%Cqf)COrc8$[r,hs]s*"Bc
+s*4Qhrd"WmI!kpAs*artrdY'$JqEuS!ec8]re:Z5LkpnEMMd>jMuo!!NrG(@OHG\)P5gaGPl?sJ
+QN*<NR/`TSRf/`US,f,YT)YD_T`(SaU&^tfV#R7kVZ*LnVuWgrWWoN*XKAV-YPta0Z*L^B['fnA
+8%6"=\[oDc]Y;.q^qmn)_o0O5`lQ6Cb0.uPc-FY^dF$CkeCE.%f@\d1g=tE=hV[8LiSrnXjQ5Lc
+k3(sml0@U#m-O-,mf)YVnF?&Jo)J=]o_nI^pAam`q#1$eqXj[\r:^*Nrdk*Us*t~>
+JcC<$JcG<@nG`@arVZNhrqcWir:p<drq?<`s7H?_rUU!Ys7$$Vs6fpSrp9[N!:'OI!pJh1roX7B
+!9F.>s5F%;ro!h6!8d_2!SlH/g'66_f[na+ec+'6e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Us
+]Y(ke\[],W[C!9GZ*:F7Xf\Y(Wi2hnV50o^TqS-NSt2C@R[KP0QBd`!P*1rgO,f3YN/EIKLkg_=
+KS+o/JUi9#IXQTjH?sj]GB\4QrcA<bEcH)<DuOVTD/B2e!GZ?JBEDgYB)ZBAA,p-<@fKj:@/XI4
+?N4=/>lS%.>5VP'=T;J#<rZ2!<;fbp;ZBVl;#a>j:Adic9`@]]9)_E[8G,LG7fMB?^>-Eq]_b1j
+8,PpV8bl!W9E%W]:&[oe:]F8kguclSbjimT?iOO5@JjU6A,^$:AcHBABDcHBC&VlFC]8/LD>S5L
+DuO_PEW'qUF80kSFo-@RGPHFWH/a/HH2Mp^GQ)daFo-:ZF8g4TEVj_DDu=SNEW:(YF8^4\FoQX`
+G63#7H2`-iHN8HmIK+`rJ,XuuJH1<$K*R'`Knb>;LPYqds,$f7rf$l:!07&>s,[5CrK75GPa)04
+s-E\Org<_Rs-inU!h>gPrLX%]!20:as.TLgrM0LkVPa?j!iW)tri-""XT#=&Y-7i/9<ke/Za@*I
+[^NZT\[f;`]Y(ql^V@S#_SX71`Q#s>aN;TJbg"GYcd:(ee'umtf%8O+g"P39h;-rFi8ESRj5]4^
+k2tjikiq?sli-5VmI'E2n*oi:nc&+ZoDeI]p&Fabp\Xabq>C*^qt^0`rT4$0s0;TS~>
+JcC<$JcG<@nG`@arVZNhrqcWir:p<drq?<`s7H?_rUU!Ys7$$Vs6fpSrp9[N!:'OI!pJh1roX7B
+!9F.>s5F%;ro!h6!8d_2!SlH/g'66_f[na+ec+'6e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Us
+]Y(ke\[],W[C!9GZ*:F7Xf\Y(Wi2hnV50o^TqS-NSt2C@R[KP0QBd`!P*1rgO,f3YN/EIKLkg_=
+KS+o/JUi9#IXQTjH?sj]GB\4QrcA<bEcH)<DuOVTD/B2e!GZ?JBEDgYB)ZBAA,p-<@fKj:@/XI4
+?N4=/>lS%.>5VP'=T;J#<rZ2!<;fbp;ZBVl;#a>j:Adic9`@]]9)_E[8G,LG7fK7,NW"h57eB4K
+8Gu-U9)VE^9_qK_:B"&h;#d?ORJ<0>Qi1:k@/aU4@fBm:AGg$=B)ZH@B`;`FCA_lHD#S;KDZ+MQ
+E;FSQEr:"RFSg4XG4TqQGkZLCHMVpbGkcL^G5ZR\FT$:[EqjYOE:7`CE;FSSErL.YFT6L`G5ZUd
+G^4T6HN/<lI/\QoIK4lsJH(0#K)UB-KS>,7L51P?re^Z4!/pi8s,@#=rf@)@!0R5C!gAk5rg!ML
+s-N_Ps-`nUrL3kYSXo_Ns.9:arLs7c!2KLg!i;ckrhfgrWN#ls!NW=$XT>T.rif&#ZEpmE['d?N
+\%&uZ]">Vf]tV7r^qmn)`5T^8a2l?Db0/#RcHab_dF$FmeCE.%f@\d1gYCW@hV[8LiSrnXjQ5Od
+kND'nl0@U6lj3"HmdKW6nF?&Jo)J=]o_nI_pAXg`q#:*eqXsa]r:^*Nrdk*Ss*t~>
+JcC<$JcG<@nG`@arVZNhrqcWir:p<drq?<`s7H?_rUU!Ys7$$Vs6fpSrp9[N!:'OI!pJh1roX7B
+!9F.>s5F%;ro!h6!8d_2!SlH/g'66_f[na+ec+'6e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Us
+]Y(ke\[],W[C!9GZ*:F7Xf\Y(Wi2hnV50o^TqS-NSt2C@R[KP0QBd`!P*1rgO,f3YN/EIKLkg_=
+KS+o/JUi9#IXQTjH?sj]GB\4QrcA<bEcH)<DuOVTD/B2e!GZ?JBEDgYB)ZBAA,p-<@fKj:@/XI4
+?N4=/>lS%.>5VP'=T;J#<rZ2!<;fbp;ZBVl;#a>j:Adic9`@]]9)_E[8G,LG7fHE`9@$319D_3N
+8,PpV8bl!W9E%W]:&[oe:]F8k=PHdD;Z0u&@/aU4@fBm:AGg$=B)ZH@B`;`FCA_lHD#S;KDZ+MQ
+E;FSQEr:"RFSg4XG4TqQGkZLCHMVpbGkcL^G5ZR\FT$:[EqjYOE:7`CE;FSSErL.YFT6L`G5ZUd
+G^4T6HN/<lI/\QoIK4lsJH(0#K)UB-KS>,7L51P?re^Z4!/pi8s,@#=rf@)@!0R5C!gAk5rg!ML
+s-N_Ps-`nUrL3kYSXo_Ns.9:arLs7c!2KLg!i;ckrhfgrWN#ls!NW=$XT>T.rif&#ZEpmE['d?N
+\%&uZ]">Vf]tV7r^qmn)`5T^8a2l?Db0/#RcHab_dF$FmeCE.%f@\d1gYCW@hV[8LiSrnXjQ5Od
+kND'nl0@U6lj3"HmdKW6nF?&Jo)J=]o_nI_pAXg`q#:*eqXsa]r:^*Nrdk*Ss*t~>
+JcC<$JcG9?nc&IbrVZNhrVHQiqtU3cs7ZB`s7H?_rUL$[nF6DFs6]mSrTsRM!:'OI!pJh1roX7B
+!9F.>s5F%;ro!h6!8d_2G21j,g=k65f[na+f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xt
+]Y(ke\[],W[C!9GZ*:F7XfSS'Wi2hnV50o^TqS-NSt2C@R[KP0QBd`!P*1rgO,f3YN/EIKLkg_=
+KS+o/JUi9#IXQWlH?sj]rc\ZlF`__HEcH)<DuOVTD/B2e#ARseBP;$kB)Q9BA7K-K@fKm:@/XI4
+?N4=/>lS%.>5VP'=T;J#<rZ2"<;]\p;Z9Pl;#X8j:A[cb9`@]^9)V?Z8G#FI7fM?=^>-Er]_t=k
+8,PpU8bl!X9DqQ\:&[oe:]F8kgZ?]MbkB6Y?iOO5@JjU6A,^$:AcHBABDcHBC&VlEC]A5MD>J/L
+DuO_OEW'qVF8'eRFo$:PGPHFVH0KYMH2Mp^GPu^aFo$4ZF8^.TEVj_CDu=SOEW1"YF8U.[FoQXa
+GQ2mfH2W$oH[L3hI=?Wprdb$"!.t3&!JH1+LB!#/M#N54MMmDlMueourf@)@s,m;D!gAk5rg!ML
+s-N_Ps-`nUrgWqXs.0+[!hZ-YrLs7c!2KLgs.o^mrhodp!3,sts/Q.$riH4(YPta,Z*OA88$o\4
+[^WcW\[oDc]Y2%o^VI\&_Sa=2`Q#s>aND]Lbg"GYcd:(fe'umtf%8O+g=k<:h;-rFi8ESRj5]4^
+k2tjjkiq?sli-5OmI'uBs6p$YrUL$]o^r+Trq?BdqtU0dr;--aq>BsbjSj`1YlB4~>
+JcC<$JcG9?nc&IbrVZNhrVHQiqtU3cs7ZB`s7H?_rUL$[nF6DFs6]mSrTsRM!:'OI!pJh1roX7B
+!9F.>s5F%;ro!h6!8d_2G21j,g=k65f[na+f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xt
+]Y(ke\[],W[C!9GZ*:F7XfSS'Wi2hnV50o^TqS-NSt2C@R[KP0QBd`!P*1rgO,f3YN/EIKLkg_=
+KS+o/JUi9#IXQWlH?sj]rc\ZlF`__HEcH)<DuOVTD/B2e#ARseBP;$kB)Q9BA7K-K@fKm:@/XI4
+?N4=/>lS%.>5VP'=T;J#<rZ2"<;]\p;Z9Pl;#X8j:A[cb9`@]^9)V?Z8G#FI7fK41NVAD17e9.J
+8Gl'T9)_K^9_qK_:B"&h;#d?NRIlm?Qi1:k@/aU4@fBm:AGg$=B)ZH@B`;`FCAVfHD#S;JDZ4SR
+E;=MPErC(RFSg4WG4KkPGkQFIHMDd`GkcL]G5cX\FT-@[Eqs_PE:.ZBE;OYSErU4YFT6L`G5c^c
+GQ<$fH3\eEI!pElIXh?Is+(0%rdt6)L&Qi,LB*/0M#rQmMuJY9NK4"!s,d8CrfR>HPa)04s-E\O
+rg<_Rs-iqVs.'+[rLO(_TV27Ws.TLgrM9Ii!2fans/5psri6"!!3H1%!NrX*YQ;#7rj,,%[C3NQ
+\@K/]]=bei^;%Fu_8=(,`5T^8a2l?EbKJ,ScHab_dF-LneCE.%f@\g2gYCW@hV[8LiSrnXjQ5Od
+kNM-ol0@U6liHMArpTmV!:g$Y!qZ'VrUp0`s7cEcrqZKgpA=[`pAO(OJcDtSJ,~>
+JcC<$JcG9?nc&IbrVZNhrVHQiqtU3cs7ZB`s7H?_rUL$[nF6DFs6]mSrTsRM!:'OI!pJh1roX7B
+!9F.>s5F%;ro!h6!8d_2G21j,g=k65f[na+f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xt
+]Y(ke\[],W[C!9GZ*:F7XfSS'Wi2hnV50o^TqS-NSt2C@R[KP0QBd`!P*1rgO,f3YN/EIKLkg_=
+KS+o/JUi9#IXQWlH?sj]rc\ZlF`__HEcH)<DuOVTD/B2e#ARseBP;$kB)Q9BA7K-K@fKm:@/XI4
+?N4=/>lS%.>5VP'=T;J#<rZ2"<;]\p;Z9Pl;#X8j:A[cb9`@]^9)V?Z8G#FI7fHE_9@-929Dq?O
+8,PpU8bl!X9DqQ\:&[oe:]F8k=PHdD;Z0u&@/aU4@fBm:AGg$=B)ZH@B`;`FCAVfHD#S;JDZ4SR
+E;=MPErC(RFSg4WG4KkPGkQFIHMDd`GkcL]G5cX\FT-@[Eqs_PE:.ZBE;OYSErU4YFT6L`G5c^c
+GQ<$fH3\eEI!pElIXh?Is+(0%rdt6)L&Qi,LB*/0M#rQmMuJY9NK4"!s,d8CrfR>HPa)04s-E\O
+rg<_Rs-iqVs.'+[rLO(_TV27Ws.TLgrM9Ii!2fans/5psri6"!!3H1%!NrX*YQ;#7rj,,%[C3NQ
+\@K/]]=bei^;%Fu_8=(,`5T^8a2l?EbKJ,ScHab_dF-LneCE.%f@\g2gYCW@hV[8LiSrnXjQ5Od
+kNM-ol0@U6liHMArpTmV!:g$Y!qZ'VrUp0`s7cEcrqZKgpA=[`pAO(OJcDtSJ,~>
+JcC<$JcG9?nG`@arVZNhrqcWir:p9cs7ZEas7H?_rUU!Ys7$!Us6]mSrTsRM!:'OI!pJh1roX7B
+!9F+=!oi1trnmh7hYu@2g]6+.g&]mZrmuVMe^W*tda?Ihd*L"_c-4ARaiMQD`l5p8_SX.)^V@Ip
+]Xt_b\@8oS['R'CYck43XK/A$W2HPiUnj`YTqJ!KSXZ+;R@'>,Q'@JqP*(fdNfB!VMM[1GLPCP:
+K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r:Df0H0D/B5fs(VOJrb2=E!+u4As().>raPn9s'Ye4
+s'G_2rET>+s'#A(r`K2%rDrnts&Aqqr_ibnr)!Dhr_EAcr_3;aqF^]Xr(-ELqaUVDoY0+opUpJp
+njiUKr(6]Vr_*2`qb@#ar_NPjs4ZSZm*,@MrEoS4raG_6raYq<r+5n?rb).Brb;@HqeQ1Irb_OM
+rbqaSqJlFRrH%[SqfVdZnTXbQoQfqPpNcX\pil[[rcS'ZrH%sYpi64Nm;MoAqf2UUs)\-\s)n?b
+rHA<fH$TC8s*F`nrd>$#It*!!JUrFPK*R'`Knb>;LPYqd!K)g7N;nk;NrG(@OHG\)P5g^GPl?sJ
+QN*<NR/`QSRf/`USH#/ZT)YG_T`(SaU&^teV#R7kVZ!CoW2ZcqWX#T+XKAV-Y-7i/!O8s0ZU;+-
+[^NZT\[f;_]=bei^;%Fu_8=(-`Poj;aN2KGbKJ,ScHjkbdF-LneCE1&f\,!4gYCW@hV[8LiSrnX
+jQ5OdkNMp0!UB"MliHMArpKpXnaZVLs7?9_rUp3as7cEcrV?HhpA=[`pAO%NJcDqRJ,~>
+JcC<$JcG9?nG`@arVZNhrqcWir:p9cs7ZEas7H?_rUU!Ys7$!Us6]mSrTsRM!:'OI!pJh1roX7B
+!9F+=!oi1trnmh7hYu@2g]6+.g&]mZrmuVMe^W*tda?Ihd*L"_c-4ARaiMQD`l5p8_SX.)^V@Ip
+]Xt_b\@8oS['R'CYck43XK/A$W2HPiUnj`YTqJ!KSXZ+;R@'>,Q'@JqP*(fdNfB!VMM[1GLPCP:
+K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r:Df0H0D/B5fs(VOJrb2=E!+u4As().>raPn9s'Ye4
+s'G_2rET>+s'#A(r`K2%rDrnts&Aqqr_ibnr)!Dhr_EAcr_3;aqF^]Xr(-ELqaUU]c].[Xr^QHK
+r(-`Wq+CWZrCm)_rD*>fs%r`kigK8&qj77gs'Yh7r*oY8rabq<s(;7Cr+Q(DrbD=GrbVRNqelCO
+rG_UQr,VaWp2p1Sqf_LRpiuFVn9XhSqfqm[rHA0_qK2[Wrc7dRr,D%Ar,DOQrc8$[rH/'^s*"?b
+!dK!9rd+Tk!.=co#C_/PJ:N3%K)UB-KS>,7L51P?reUZ5MuJ\8N<#"<NrkE*OoCODP5pjHQ2d0M
+Qi<BPR/i]SS,]#YSc55\TDtS_U&UheU]%"gV#[CkVZNfrWW&n&X/rD)Xfeh1ricF.ZMq0t['d?N
+\%&uZ]"5Md]Y2%o^VI\&_SjF4`lH0Aai_fMbg"GZd*^7he'umtf@S[.g=k<:h;-rFi8ESRj5]4^
+k2tjjrojIKli-5OmI'uB!q>aMrpp*\s7H9_s7ZKeqtU-crqc?cq>Bsbj8OW0YQ'+~>
+JcC<$JcG9?nG`@arVZNhrqcWir:p9cs7ZEas7H?_rUU!Ys7$!Us6]mSrTsRM!:'OI!pJh1roX7B
+!9F+=!oi1trnmh7hYu@2g]6+.g&]mZrmuVMe^W*tda?Ihd*L"_c-4ARaiMQD`l5p8_SX.)^V@Ip
+]Xt_b\@8oS['R'CYck43XK/A$W2HPiUnj`YTqJ!KSXZ+;R@'>,Q'@JqP*(fdNfB!VMM[1GLPCP:
+K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r:Df0H0D/B5fs(VOJrb2=E!+u4As().>raPn9s'Ye4
+s'G_2rET>+s'#A(r`K2%rDrnts&Aqqr_ibnr)!Dhr_EAcr_3;aqF^]Xr(-ELqaUTcp.Nb)r^QHK
+r(-`Wq+CWZrCm)_rD*>fs%r_tgJdT>rEoS4raG_6raYq<r+5n?rb).Brb;@HqeQ1Irb_OMrbqaS
+qJlFRrH%[SqfVdZnTXbQoQfqPpNcX\pil[[rcS'ZrH%sYpi64Nm;MoAqf2UUs)\-\s)n?brHA<f
+H$TC8s*F`nrd>$#It*!!JUrFPK*R'`Knb>;LPYqd!K)g7N;nk;NrG(@OHG\)P5g^GPl?sJQN*<N
+R/`QSRf/`USH#/ZT)YG_T`(SaU&^teV#R7kVZ!CoW2ZcqWX#T+XKAV-Y-7i/!O8s0ZU;+-[^NZT
+\[f;_]=bei^;%Fu_8=(-`Poj;aN2KGbKJ,ScHjkbdF-LneCE1&f\,!4gYCW@hV[8LiSrnXjQ5Od
+kNMp0!UB"MliHMArpKpXnaZVLs7?9_rUp3as7cEcrV?HhpA=[`pAO%NJcDqRJ,~>
+JcC<$JcG6>nc&Ibr;?EgrqcWir:p<drq?<`s7H?_rUU!Ys7$!Us6]mSrTsRM!:'OIs6'IGrT41C
+jQ-=#!oi1trnmk8hVS7f!SlH/g&]mZrmq>)e^W*tdf.X0d*L"_c-4ARaiMQD`l5p8_SX.)^V7Co
+]XkYa\@/iR['R'CYck43XK/A#W2HMhUnj`YTq@pJSXZ+;R@'>,Q'@JqP*(fdNfB!UMM[1GLPCP:
+K7ec,J:N,uI=6KiH?sj]GB\4QFEDSErc%sXDuOVTD/B2e!buF`rb)@GAnM$Rs'u+>rF5e8s'Ye4
+s'G_2rET>+s'#A(s&f8%rDrqus&Anps&/kor)!Dhr_EAcr_3;aqF^ZWr(-<I!_2,+o=j%opUpMq
+njiUKr(6]VrCd,`qG$rar_NMi!SQ,dc0*=L?iOO5@JjU6A,^$:Ac?<ABDZBBC&VlEC]8/LD>S5M
+DuFYNEW'qUF7s_QFo$:NGP?@>H2;d\GPu^`Fo$4ZF8^.TEVseBDuFYOEW:(YF8^4\FoQXaGQ2mf
+H2`-iHN8HmIK+`rJ,Xs!JV*lR#D@ebL5(J=M#N53MMqIm!f`5#rf7)AOoCODP5pjGPld8<Qi<BP
+RK&`TS,]#YSc55\TDtS_U&UheU]%"gV>mFlVuN[qWW&ptWrT7#XoGO(YPta,Z*OA8::.F;[^WcV
+\[f;`]Y(ql^V@S#_SX4/`Poj;aN2KGbKS5VcHjkbdF-Lne^i@(f\,!4gYCW@hV[8LiSrnXjQ5Od
+kNM0plK[^%m-X3.rpKpXnaZVLs766_rUp0`s7cHdrV?Egp\Xgbp\j+NJcDkPJ,~>
+JcC<$JcG6>nc&Ibr;?EgrqcWir:p<drq?<`s7H?_rUU!Ys7$!Us6]mSrTsRM!:'OIs6'IGrT41C
+jQ-=#!oi1trnmk8hVS7f!SlH/g&]mZrmq>)e^W*tdf.X0d*L"_c-4ARaiMQD`l5p8_SX.)^V7Co
+]XkYa\@/iR['R'CYck43XK/A#W2HMhUnj`YTq@pJSXZ+;R@'>,Q'@JqP*(fdNfB!UMM[1GLPCP:
+K7ec,J:N,uI=6KiH?sj]GB\4QFEDSErc%sXDuOVTD/B2e!buF`rb)@GAnM$Rs'u+>rF5e8s'Ye4
+s'G_2rET>+s'#A(s&f8%rDrqus&Anps&/kor)!Dhr_EAcr_3;aqF^ZWr(-<I!_/u]c].[Xs$lQL
+r(-`Wq+CTYr_3/_r_EGgr_WWiiL/turEoS4raG_6raYq<r+5k>s(D4Bs(VIIqeQ1Irb_OMrbqaS
+q/Q@Rr,_RRqfVaYn9=VOhg,'Cpil[[rH7sYrcA$Yq/Q=Olu2iAqJlOUrcA$[s)n?brceBe!."Qi
+s*F`nrdFfq!.Xuu!J,k%K*R'`Knb>;LPYqd!K)g7Muo!!NrG(?OHKO*s-!GIrKRGMQ^@]=s-`nU
+rgWqXs.0.\s.B=arLs7c!2KLgs/#amrhodp!3,sts/Q.$riQ4'!3cC+!O8s0ZVIm8[^NZT\@K/]
+]=bei^;%Fu_8=(,`5T^8a2l?Db0/#RcHab_dF$CkeCE.%f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(sm
+l0@R"m-O-,mf)YVnF?&Jo)J:]o_nI^pAambq#1$eqY0m`r:g0Lrdk*Os*t~>
+JcC<$JcG6>nc&Ibr;?EgrqcWir:p<drq?<`s7H?_rUU!Ys7$!Us6]mSrTsRM!:'OIs6'IGrT41C
+jQ-=#!oi1trnmk8hVS7f!SlH/g&]mZrmq>)e^W*tdf.X0d*L"_c-4ARaiMQD`l5p8_SX.)^V7Co
+]XkYa\@/iR['R'CYck43XK/A#W2HMhUnj`YTq@pJSXZ+;R@'>,Q'@JqP*(fdNfB!UMM[1GLPCP:
+K7ec,J:N,uI=6KiH?sj]GB\4QFEDSErc%sXDuOVTD/B2e!buF`rb)@GAnM$Rs'u+>rF5e8s'Ye4
+s'G_2rET>+s'#A(s&f8%rDrqus&Anps&/kor)!Dhr_EAcr_3;aqF^ZWr(-<I!_-0ip.Nb)s$lQL
+r(-`Wq+CTYr_3/_r_EGgr_WVrg/IN>rEoS4raG_6raYq<r+5k>s(D4Bs(VIIqeQ1Irb_OMrbqaS
+q/Q@Rr,_RRqfVaYn9=VOhg,'Cpil[[rH7sYrcA$Yq/Q=Olu2iAqJlOUrcA$[s)n?brceBe!."Qi
+s*F`nrdFfq!.Xuu!J,k%K*R'`Knb>;LPYqd!K)g7Muo!!NrG(?OHKO*s-!GIrKRGMQ^@]=s-`nU
+rgWqXs.0.\s.B=arLs7c!2KLgs/#amrhodp!3,sts/Q.$riQ4'!3cC+!O8s0ZVIm8[^NZT\@K/]
+]=bei^;%Fu_8=(,`5T^8a2l?Db0/#RcHab_dF$CkeCE.%f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(sm
+l0@R"m-O-,mf)YVnF?&Jo)J:]o_nI^pAambq#1$eqY0m`r:g0Lrdk*Os*t~>
+JcC<$JcG6>nc&FarVZNhrqcWir:p9cs7ZB`s7H?_rUU!Ys7$!Us6]mSrTsRM!:'OIs6'IGrT41C
+jQ-=#s5F%;ro!h6!8d_2!SlH/g&]mZrmuYNe^W*tdaHOjd*L"_c-4ARaiMQD`l5p7_SX.)^V7Co
+]XkYa\@/iRZa6sBYck43XK/A#W2HMhUnaZXTq@pJS=?":R$a5+Q'@JqP*(fdNfB!UMM[1GLPCP:
+K7ec,J:N,uI=6KiH?sj]GB\4QFEDSFEcH)<Df9N2D/=%gC]A,LC&VfGB)lQBAHHCPA,Tm:@K0a6
+?iOI4?2\%.>Q7n)=oVV(=8c2!<W?%s;u]bp;>j>j:]F2e:&[ic9DV9Y8c2-L8,qN=^>-Et]DtFk
+8,GjU8bbpW9DqQ\:&[oe:]4)ifAt3>bl1uK@/aU4@fBm:AGg$<B)cN@B`DfGCAVfGD#S;KDZ+MQ
+E;=MOEr:"PFS^.UG49_MGiX/HGkZF\G5ZR[FT-@[Eqs_QE9hH?E;OYTErL.YFT6I`G5ZUdG^4T6
+H3\eEI!pElIXh?I!J,k%K+*EeKnb>;LkpnEMMd>kMueourf7,BOcfX+!gAk5rfmPNQ^@]=s-WkU
+rL3kYSXo_Ns.B=arh9@ds.fOgs.o^mrMT[o!3,ps!irE(riHF.YHP17Z*CV6ZVRs9[^NZS\@K/]
+]=bei^;%Fu_8=(,`5T^8a2l?Db0.uPc-FV\dF$CkeC<%"f@S[.g=k<;h;7&Ii8N\Uj5f=`k2tjj
+l07L!lg4!*mdC)C!V#XXncJFTo_nI_pAXgaq#:*fqY0m`r:g0Lrdk*Ns*t~>
+JcC<$JcG6>nc&FarVZNhrqcWir:p9cs7ZB`s7H?_rUU!Ys7$!Us6]mSrTsRM!:'OIs6'IGrT41C
+jQ-=#s5F%;ro!h6!8d_2!SlH/g&]mZrmuYNe^W*tdaHOjd*L"_c-4ARaiMQD`l5p7_SX.)^V7Co
+]XkYa\@/iRZa6sBYck43XK/A#W2HMhUnaZXTq@pJS=?":R$a5+Q'@JqP*(fdNfB!UMM[1GLPCP:
+K7ec,J:N,uI=6KiH?sj]GB\4QFEDSFEcH)<Df9N2D/=%gC]A,LC&VfGB)lQBAHHCPA,Tm:@K0a6
+?iOI4?2\%.>Q7n)=oVV(=8c2!<W?%s;u]bp;>j>j:]F2e:&[ic9DV9Y8c2-L8,oC1NV\S7Mam5,
+qagZWpe(NYrCm&^r_EGgrD3KhiL/tura5Y4raG_6raYq<r+5k>s(D4Bs(VIIqeQ1Irb_OMrGV[S
+q/Q=Qr,_RRqK;UWn9=VOjE^THpNQRZrH7sYrcA$Yq/Q=OlYl]?qf2XVrcA$[s)e<brHA<fH$TC8
+#CCiGI=6QnJ,Xs!JV*lR%"s=gL5(J>Ll$tGMMqIm!KE-=NrkE*OoCLFPE_=2Pld8<Qi<BPR/i]S
+Rf]+NSc,/[TDtS`U&UkeU]%"gV#[CkVuN[qWVrguX/rE%XTu#4YHY79Z*OA8:UIO<[^W`U\[f;`
+]Y(ql^V@S#_SX4/`Poj;aN2KGbKJ,ScHab`dF-LneCE.%f@\d1g=tH>hV[8LiSrnXjQ5Lck3(sm
+l0@U#m-O--mf)YUnF?JJ!qZ'VrUp3arqH?crqZNhp\Xgbp\j+NJcDhOJ,~>
+JcC<$JcG6>nc&FarVZNhrqcWir:p9cs7ZB`s7H?_rUU!Ys7$!Us6]mSrTsRM!:'OIs6'IGrT41C
+jQ-=#s5F%;ro!h6!8d_2!SlH/g&]mZrmuYNe^W*tdaHOjd*L"_c-4ARaiMQD`l5p7_SX.)^V7Co
+]XkYa\@/iRZa6sBYck43XK/A#W2HMhUnaZXTq@pJS=?":R$a5+Q'@JqP*(fdNfB!UMM[1GLPCP:
+K7ec,J:N,uI=6KiH?sj]GB\4QFEDSFEcH)<Df9N2D/=%gC]A,LC&VfGB)lQBAHHCPA,Tm:@K0a6
+?iOI4?2\%.>Q7n)=oVV(=8c2!<W?%s;u]bp;>j>j:]F2e:&[ic9DV9Y8c2-L8,lT^9@?E47e'"G
+8Gu-T9)_K^9_qK_:B"&f:]OSN;t3cb?iFI4@JjU6A,^$:Ac?<ABDZBBC&VlEC]8/LD>S5LDuO_O
+EVskTF7s_PFnp4MGP?@CH2;d[GPu^`Fo$4ZF8^.TEVseADu=SOEW:(YF8^4\FT?U`G63#7H2`*p
+H[L3hI=?WprdY$#K)UB2KS>,7L51S@M2@+IMuJY9NK4"!!g&P,rfR>HPa)04!g]1>rg<_R!1NkU
+!h>gPrLX%]s.K@bs.]OgrM9Ii!2f^ms/5psrMfq"XK;E'#Hk86YctC;ZMq1+['d?N\$rlX\[oDc
+]Y2%o^VI\&_Sa=2`Q#s>aN;TJbKS5VcHjncdaQ^qe^i@(f\,!4gYL]Bhr*GOioB([jlPXekNM0p
+lKdd&m-X6/rpKmWnbr"[oCV\Rp&Fabp\agcq>L0aqtg6brSmg-s/c6N~>
+JcC<$JcG6>nG`@arVZKgrqcWir:p9cs7ZEarq-6^rUU!Ys7$!Us6]mSrTsRMs6BUJs60LGroX7B
+!9F.>s5O(;rnmh7hYu==gtUT;g=b03f@SU(rmY`4da?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1l
+]",A\[^NTMZa-g>YHG"/X/`.tVl$;dUS=HTT:VXES"#k6R$X,(P`q8nOcPQ`NJrgRM2@%DL5(D7
+K7\Z)J:E#rI=-BfH?jaZGBS-.F:3/1EH,r:Df0H0D/B2e!buF`rb)@GAnM$Rs().>rF5e8s'Ye4
+s'G_2rETA,s'#A(r`K2%rDrqus&Anps&/kor)!Dhr_EAcr_3;aq+CTWqag9J!9!F^h7`WsnONII
+r(6]VrCd,`qG$rarD3Ag!7g,Skfj!4s'Yh7r*oY8rabq<rau1Cqe6"DrbD=GrbVRNqJQ:NrG_RP
+rGqdVolU%Qq0)4Nom#eJq0;UWrHA-^qK2^XrGq^Rr,D@J!,hOLrG_XRrc8$[rH/'^s*"Bcs*+Nh
+rd+Tk!.=co(4La_J:N3&JqJ]/KS>/8LPL\BM2I1Krepl;NrG(EOHGZgP*;)org!ML!13\Ps-WkU
+rL<hW!1j([s.9:arLs7cs.fOgs.o^mrMT[os/H!ts/Q.$riQ4'!3cC+8$TA*Za7$G[C3NQ\%&uZ
+]">Vf]tM.p^VI\&_Sa=2`Q#s>aN;TJbg"GYcd:(edaQ^qe^i@(g"P07gtgfChr*GOioB([jo4BG
+kNM0plKeH9!U]=Sn,MkWnc&+ZoDeI]p&Facp\agcq>L0bqtg6crT!m.s/>sJ~>
+JcC<$JcG6>nG`@arVZKgrqcWir:p9cs7ZEarq-6^rUU!Ys7$!Us6]mSrTsRMs6BUJs60LGroX7B
+!9F.>s5O(;rnmh7hYu==gtUT;g=b03f@SU(rmY`4da?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1l
+]",A\[^NTMZa-g>YHG"/X/`.tVl$;dUS=HTT:VXES"#k6R$X,(P`q8nOcPQ`NJrgRM2@%DL5(D7
+K7\Z)J:E#rI=-BfH?jaZGBS-.F:3/1EH,r:Df0H0D/B2e!buF`rb)@GAnM$Rs().>rF5e8s'Ye4
+s'G_2rETA,s'#A(r`K2%rDrqus&Anps&/kor)!Dhr_EAcr_3;aq+CTWqag9J!2Ro"qMYE4nONII
+r(6]VrCd,`qG$rarD3Ag!2JJ?l^7WXs'Yh7r*oY8rabq<rau1Cqe6"DrbD=GrbVRNqJQ:NrG_RP
+rGqdVolU%Qq0)4Nom#eJq0;UWrHA-^qK2^XrGq^Rr,D@J!,hOLrG_XRrc8$[rH/'^s*"Bcs*+Nh
+rd+Tk!.=co(4La_J:N3&JqJ]/KS>/8LPL\BM2I1Krepl;NrG(EOHGZgP*;)org!ML!13\Ps-WkU
+rL<hW!1j([s.9:arLs7cs.fOgs.o^mrMT[os/H!ts/Q.$riQ4'!3cC+8$TA*Za7$G[C3NQ\%&uZ
+]">Vf]tM.p^VI\&_Sa=2`Q#s>aN;TJbg"GYcd:(edaQ^qe^i@(g"P07gtgfChr*GOioB([jo4BG
+kNM0plKeH9!U]=Sn,MkWnc&+ZoDeI]p&Facp\agcq>L0bqtg6crT!m.s/>sJ~>
+JcC<$JcG6>nG`@arVZKgrqcWir:p9cs7ZEarq-6^rUU!Ys7$!Us6]mSrTsRMs6BUJs60LGroX7B
+!9F.>s5O(;rnmh7hYu==gtUT;g=b03f@SU(rmY`4da?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1l
+]",A\[^NTMZa-g>YHG"/X/`.tVl$;dUS=HTT:VXES"#k6R$X,(P`q8nOcPQ`NJrgRM2@%DL5(D7
+K7\Z)J:E#rI=-BfH?jaZGBS-.F:3/1EH,r:Df0H0D/B2e!buF`rb)@GAnM$Rs().>rF5e8s'Ye4
+s'G_2rETA,s'#A(r`K2%rDrqus&Anps&/kor)!Dhr_EAcr_3;aq+CTWqag9J!*/\bdRs%"qagWV
+q+CTYr_3/_r_EDfrD3Jqfi.H>rEoS4raG_6raYq<r+5k>s(D4Bs(VIIqeQ1Irb_LLrbqaSq/Q@R
+qfDFPqK;UWms"GLlZr;Np36IYrH7sYrcA$Yq/Q=Op29qKpM^"Lqf2UUs)\-\s)n?brceBe!."Qi
+s*F`nrd>Q2It*!!JV&K+K7no3L5(J=Ll$tGMMqIm!KE-=NsCc/OcklkPEc'3s-<YOrg<_R!1NkU
+s-s([rLX%]!20:as.]OgrM9Ii!2f^ms/>ssri6"!!3H1%s/l@*rientZEggC['[6L[^W`U\[f;`
+]Y(qk^;%Fu_8=(,`5T^8a2l?Db0/#RcHab_dF$CkeC<%"f@S^0g=tE=h;7&Ii8N\Uj5f>$josr3
+l07L!rp0[Qmf)\Tn,W"Xo)J=]o_nI_pAambq#:*fqY9sar:p6Nrdk*Js*t~>
+JcC<$JcG6>nG`=`rVZNhrVHNhr:p<drq?<`rq-6^rUU!Ys7$!Us6fpSrp9[Ns6BRI!pJh1roX7B
+s5a1>!oi1trnn%=hVR)Egt^Z`g2P`tf@SU(e^W*tda?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1k
+]",A\[^NTMZa-g>YH=q.X/`.tVl$;dUS=HTT:VXES"#k6R$X,(P`q8nOcPQ`NJrgRM2@%DL5(D8
+K7\Z)J:E#rI=-BfH?jc7G6N/4FEDSErc%sXDuOVTD/B2es(VOJrb2=Es(;7As().>raPn9s'Ye4
+s'G_2r*98+s'#A(s&f;&rDrqus&Anps&/kor)!Dhr_EAcrCm2`q+CQVqFL<M!9!F^h7`WsnONII
+rCQcVrCd,`qG$rar_NGg!7^&Rkfj!4s'Yh7r*oY8rabq<rau1Cqe5tCs(_FHrbVRNqJQ:NrG_OO
+rGqdVoQ9qPpic(LnTakToQ^(RrHA-^qK2[Wrc7gSqf(k>rG_XRrc8$[rH/'^!-\<b!dK!9rd"Tl
+I/\QoIMmWcJ:W9'K7ei1Knb>;LPUeDMMd=NN/`gWrf7)AOoCLKPE_;sQ'R`&rg<_Rs-iqV!h>gP
+rLO(_TV27Ws.]OgrhTRjs/,ams/>ssri6"!!3H.$!j8`1ricF.ZMq0<['d<M[^W`U\[f;`rk(D-
+^;%Fu_8=(,`5T^8a2l?Db0.uPc-FV\d*^7he'uq!f@S[.g=k<:h;-rFi8ESRj5]4^k2tjjkiq?s
+li-5OmI'uB!q>aMrpp*\s7H<`s7ZHdr:p9erqcEequ$6fiVnE.W;hA~>
+JcC<$JcG6>nG`=`rVZNhrVHNhr:p<drq?<`rq-6^rUU!Ys7$!Us6fpSrp9[Ns6BRI!pJh1roX7B
+s5a1>!oi1trnn%=hVR)Egt^Z`g2P`tf@SU(e^W*tda?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1k
+]",A\[^NTMZa-g>YH=q.X/`.tVl$;dUS=HTT:VXES"#k6R$X,(P`q8nOcPQ`NJrgRM2@%DL5(D8
+K7\Z)J:E#rI=-BfH?jc7G6N/4FEDSErc%sXDuOVTD/B2es(VOJrb2=Es(;7As().>raPn9s'Ye4
+s'G_2r*98+s'#A(s&f;&rDrqus&Anps&/kor)!Dhr_EAcrCm2`q+CQVqFL<M!2Ro"q2Fi6qagZW
+pe(KXr_3/_r_EGgr(mBfi0inurEoS4raG_6raYq<r+5k>s(D4Brb;CIqeQ1Irb_LLrbqaSpi67Q
+qfDCOqK;RVmW\2Gq0DUWp36IYrH7sYrH%sYq/Q:NlYl`@qf2UUs)\-\s)e<brHA<fH$TC8!IK4n
+IK+a6It3'#JV&N,KS5&6L51P?M2@+IMi<USNK4"!!K`HCOp@28Pa.N"QC%T<s-`nUrgNtZSXo_N
+!hZ-YrLs7cs.fRhs/#amrMT[os/H!ts/Q.$rN-.(YHRr0!O8s0ZO=.J[C3NQ\%&uZ]"@sS4h\SE
+^VI\&_Sa=2`Q#s>aN;TJbKS5VcHjkbdF-Lne^i@(f\,!4gYCW@hV[8LiSrnXjQ5OdkNM-ol0@U6
+liHMArpKpXnaZVLs7?9_rq6<brqH?crqZQiq"ssdq#01NJcD\KJ,~>
+JcC<$JcG6>nG`=`rVZNhrVHNhr:p<drq?<`rq-6^rUU!Ys7$!Us6fpSrp9[Ns6BRI!pJh1roX7B
+s5a1>!oi1trnn%=hVR)Egt^Z`g2P`tf@SU(e^W*tda?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1k
+]",A\[^NTMZa-g>YH=q.X/`.tVl$;dUS=HTT:VXES"#k6R$X,(P`q8nOcPQ`NJrgRM2@%DL5(D8
+K7\Z)J:E#rI=-BfH?jc7G6N/4FEDSErc%sXDuOVTD/B2es(VOJrb2=Es(;7As().>raPn9s'Ye4
+s'G_2r*98+s'#A(s&f;&rDrqus&Anps&/kor)!Dhr_EAcrCm2`q+CQVqFL<M!*/Yadn9.#qagZW
+pe(KXr_3/_r_EGgr(mApfi.H>rEoS4raG_6raYq<r+5k>s(D4Brb;CIqeQ1Irb_LLrbqaSpi67Q
+qfDCOqK;RVmW\2Gq0DUWp36IYrH7sYrH%sYq/Q:NlYl`@qf2UUs)\-\s)e<brHA<fH$TC8!IK4n
+IK+a6It3'#JV&N,KS5&6L51P?M2@+IMi<USNK4"!!K`HCOp@28Pa.N"QC%T<s-`nUrgNtZSXo_N
+!hZ-YrLs7cs.fRhs/#amrMT[os/H!ts/Q.$rN-.(YHRr0!O8s0ZO=.J[C3NQ\%&uZ]"@sS4h\SE
+^VI\&_Sa=2`Q#s>aN;TJbKS5VcHjkbdF-Lne^i@(f\,!4gYCW@hV[8LiSrnXjQ5OdkNM-ol0@U6
+liHMArpKpXnaZVLs7?9_rq6<brqH?crqZQiq"ssdq#01NJcD\KJ,~>
+JcC<$JcG3=nG`@ar;?EgrqcWiqtU3crq?<`rq-6^rUU!Ys7$!Us6fpSrp9[Ns6BRIs6'IGrT41C
+jQ-=#s5F%;ro!h6!8d_2!SlH/g4.f.f@SU)e^W*tda?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1k
+]",A\[^NQLZa$a=YH=q.WiE%sVl$;dUS=HTT:VUDS"#k6R$X,(P`q8nOH5H_NJrgRM2@%DL5(D8
+K7e`*J:E#rI=-BfH?jd\GB\4QFEDSFEcH)<Df>Yns(qaPrbDRMBkdQ[s(;=DrFQ">!+Yt:s'bq8
+rEoS2s'>S.s',M,r)s&%s&]/"s&K(urDW_or_`Vjr_NPhqb@&`rCcrYr(6]Tq+'qgh7`ZtnjiRJ
+r(6]VrCd)_qG$rar_NGg!7TuQkfj!4s'Yh7r*oY8rabq<rau.Br+Q(DrbD@HrbVOMqel@NrG_RP
+qf;UUo5seNpic%Kict-?rHA-^q/lUWrGq^Rqf(n?rG_UQs)S-\rH/'^s*"Bcs*+Nhrd"WmI!kpA
+!IfOtJ,t4Qrdu,BKnb>;LPUeDMMd=NN/`jXO,oBbOcklkPEc'3!g]1>rg3bTR[X5F!h>gPrgs.^
+s.K=a!huHbrM9Iis/,ams/5psrMomus/c4%!j8`1rilF-!4)U1'XY9U[^NZT\@K/]]=Y_g]tV7r
+^qp#e0Z1iJ`Q#s>aN;TJbKS5Vcd:(edaQ^qe^i@(f\,!4gYCW@hV[8LiSrnXjQ5OdkNMp0#3tO@
+m-X3.rpKpXnaZVL!qZ'VrUp3as7cHdrqZQiq"ssdq>K=PJcDSHJ,~>
+JcC<$JcG3=nG`@ar;?EgrqcWiqtU3crq?<`rq-6^rUU!Ys7$!Us6fpSrp9[Ns6BRIs6'IGrT41C
+jQ-=#s5F%;ro!h6!8d_2!SlH/g4.f.f@SU)e^W*tda?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1k
+]",A\[^NQLZa$a=YH=q.WiE%sVl$;dUS=HTT:VUDS"#k6R$X,(P`q8nOH5H_NJrgRM2@%DL5(D8
+K7e`*J:E#rI=-BfH?jd\GB\4QFEDSFEcH)<Df>Yns(qaPrbDRMBkdQ[s(;=DrFQ">!+Yt:s'bq8
+rEoS2s'>S.s',M,r)s&%s&]/"s&K(urDW_or_`Vjr_NPhqb@&`rCcrYr(6]Tq+&YgqMau8qagWV
+q+CTYrCm&^r_EGgr(mBehjNhurEoS4raG_6raYq<r+5k>rb).Brb;@Hr+l:JrGDFLrGVXRq/Q:P
+r,_IOq/uIUm<@Q7olp@XrH7pXrcA$Yq/Q:Nlu2iAqJlOUs)\-\s)n?brceBe!."Qi!df<Brd=fr
+J,Xs!JV*lR)MEg!L51P?M2@+IMi<USNfK0]OHGZgP*;)orfmPNQ^@]=!h#LGrgNtZSXobOs.B=a
+rLj:eUSId`s/#amrMT[o!3,pss/Z1$riH7)YHRr0s02R0rj*<G[C*HO\%&rY\[oDb]Y(ql^V@S#
+rk^A,`5T^8a2l?Db0.uPc-FY^dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^k2tjjrojXPlg4!*
+mI'uB!q>aMrpg-^o^r+Ts7ZKer:p9erqcEequ$9gir4N/V>l&~>
+JcC<$JcG3=nG`@ar;?EgrqcWiqtU3crq?<`rq-6^rUU!Ys7$!Us6fpSrp9[Ns6BRIs6'IGrT41C
+jQ-=#s5F%;ro!h6!8d_2!SlH/g4.f.f@SU)e^W*tda?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1k
+]",A\[^NQLZa$a=YH=q.WiE%sVl$;dUS=HTT:VUDS"#k6R$X,(P`q8nOH5H_NJrgRM2@%DL5(D8
+K7e`*J:E#rI=-BfH?jd\GB\4QFEDSFEcH)<Df>Yns(qaPrbDRMBkdQ[s(;=DrFQ">!+Yt:s'bq8
+rEoS2s'>S.s',M,r)s&%s&]/"s&K(urDW_or_`Vjr_NPhqb@&`rCcrYr(6]Tq+($Ldn91$qagWV
+q+CTYrCm&^r_EGgr(mApfMhB>rEoS4raG_6raYq<r+5k>rb).Brb;@Hr+l:JrGDFLrGVXRq/Q:P
+r,_IOq/uIUm<@Q7olp@XrH7pXrcA$Yq/Q:Nlu2iAqJlOUs)\-\s)n?brceBe!."Qi!df<Brd=fr
+J,Xs!JV*lR)MEg!L51P?M2@+IMi<USNfK0]OHGZgP*;)orfmPNQ^@]=!h#LGrgNtZSXobOs.B=a
+rLj:eUSId`s/#amrMT[o!3,pss/Z1$riH7)YHRr0s02R0rj*<G[C*HO\%&rY\[oDb]Y(ql^V@S#
+rk^A,`5T^8a2l?Db0.uPc-FY^dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^k2tjjrojXPlg4!*
+mI'uB!q>aMrpg-^o^r+Ts7ZKer:p9erqcEequ$9gir4N/V>l&~>
+JcC<$JcG3=nG`=`rVZKgrqcWir:p9cs7ZB`s7H<^rUU!Ys7$!Us6fpSrTsRM!:'OIs60LGroX7B
+!9F.>s5F%;ro!h6!8d_2!SlH/g&]mZrmu,?e^W*tda?Ihcd'h\bfe2OaN2EA`Pf[2_SO"%^:h1k
+]",>[[^NQLZa$a=Y-"h-WiE%rVl$8cUS=HTT:VUDS"#h5R$X,(P`q8nOH5H_NJrgRM2@%DL5(D8
+K7ec,J:E#rI=-EhH?sj]GB\4QrcA0^ErL%ZE,Y_n#]4BoCMR["BkdQ[!bZ+WrFH%@@q5IHs'bq8
+rEoS2s'>S.s',M,rE9/&s&]/"s&K(ur)<Vns&&\js%iVhqb@&`r_*#YqapQRrC?@kh7`]unjiRJ
+r(6ZUrCd,`qG$rarD3;eim$`3rEoP3s'be6raYt=qdoe>rb).Brb;@HqeQ1Irb_LLrbqaSpi61O
+r,_FNpiZ@TlZ_Z>not%Ur,qjXrH%pXq/Q=OlYl`@qf2UUs)\-\s)e<brHA<fH$TC8!IK4nI0"eH
+rdY$#K)UB'KSBD[)Ma-*M2I1KN/WaVNfT6_OcbfiPE_;sQ'R`&rg<_R!1NnVs-s([rLO(_TV2:X
+s.]OgrM9Iis/,am!iW)trMomus/c4%s/l@*rNH@.ZEjJ9!OT96[QCt.\@K/]]=Y_g]tV7r^qde'
+_Sa=2`Q#s>aN;TJbKS5VcHjkbdF-LneCE.%f@\g2gYCW@hV[8LiSsjs&*2j7k3(sml0@R"m-O-,
+mf)YUnF?JJ!qZ'VrUp3as7cHdrqZQiq>:'eq>K@QJcDMFJ,~>
+JcC<$JcG3=nG`=`rVZKgrqcWir:p9cs7ZB`s7H<^rUU!Ys7$!Us6fpSrTsRM!:'OIs60LGroX7B
+!9F.>s5F%;ro!h6!8d_2!SlH/g&]mZrmu,?e^W*tda?Ihcd'h\bfe2OaN2EA`Pf[2_SO"%^:h1k
+]",>[[^NQLZa$a=Y-"h-WiE%rVl$8cUS=HTT:VUDS"#h5R$X,(P`q8nOH5H_NJrgRM2@%DL5(D8
+K7ec,J:E#rI=-EhH?sj]GB\4QrcA0^ErL%ZE,Y_n#]4BoCMR["BkdQ[!bZ+WrFH%@@q5IHs'bq8
+rEoS2s'>S.s',M,rE9/&s&]/"s&K(ur)<Vns&&\js%iVhqb@&`r_*#YqapQRrC>(kqi()9qagWV
+pe(KXr_3/_r_EDfqb[<[iL0&"rEoP3s'be6raYt=qdoe>rb).Brb;@HqeQ1Irb_LLrbqaSpi61O
+r,_FNpiZ@TlZ_Z>not%Ur,qjXrH%pXq/Q=OlYl`@qf2UUs)\-\s)e<brHA<fH$TC8!IK4nI0"eH
+rdY$#K)UB'KSBD[)Ma-*M2I1KN/WaVNfT6_OcbfiPE_;sQ'R`&rg<_R!1NnVs-s([rLO(_TV2:X
+s.]OgrM9Iis/,am!iW)trMomus/c4%s/l@*rNH@.ZEjJ9!OT96[QCt.\@K/]]=Y_g]tV7r^qde'
+_Sa=2`Q#s>aN;TJbKS5VcHjkbdF-LneCE.%f@\g2gYCW@hV[8LiSsjs&*2j7k3(sml0@R"m-O-,
+mf)YUnF?JJ!qZ'VrUp3as7cHdrqZQiq>:'eq>K@QJcDMFJ,~>
+JcC<$JcG3=nG`=`rVZKgrqcWir:p9cs7ZB`s7H<^rUU!Ys7$!Us6fpSrTsRM!:'OIs60LGroX7B
+!9F.>s5F%;ro!h6!8d_2!SlH/g&]mZrmu,?e^W*tda?Ihcd'h\bfe2OaN2EA`Pf[2_SO"%^:h1k
+]",>[[^NQLZa$a=Y-"h-WiE%rVl$8cUS=HTT:VUDS"#h5R$X,(P`q8nOH5H_NJrgRM2@%DL5(D8
+K7ec,J:E#rI=-EhH?sj]GB\4QrcA0^ErL%ZE,Y_n#]4BoCMR["BkdQ[!bZ+WrFH%@@q5IHs'bq8
+rEoS2s'>S.s',M,rE9/&s&]/"s&K(ur)<Vns&&\js%iVhqb@&`r_*#YqapQRrC?EOeOoC&qagWV
+pe(KXr_3/_r_EDfqbYpDo2>Nora>b7qdTP7s()"<s(;7Cr+Q(DrbD=GrbVRNqJQ:NrG_OOqf;UU
+noXYLpibtIlZhuErHA*]qK2[WrGq^Rr,Ct?rG_XRrc8$[rH/'^!-\<b!dK!9rd"TlI/\NpIXh?I
+!J,k%K)pXZre;>HLl$tGMMmFPNK0$[O-#KdP*2#nPa.N"QC%T<s-WkUrgWqX!1j([!hZ-Yrh9@d
+s.fOgs/#amrMK^qWN#irs/Z1$riQ4'!3c@*!jT&:rj)X4[JmTr\%&rY\[oDb]Y(ql^V@S"_8=(,
+`5T^8a2l?Db0.uPc-FV\d*^7he'umtf%8O+g=k<:h;-rFi8ESRro4OMjlY^gkiq?slKdg'mHs?@
+mfDqJrUL$]o^r+Ts7ZKer:p9erqcHfqu$9gj8OW0U]5i~>
+JcC<$JcG3=n,E7`r;?EgrqcWiqtU0bs7ZB`s7H?_r:9mXs7$!Us6fpSrTsRMs6BUJs60LGroX7B
+s5a1>!oi1trnmh7hYu=8gtUT;g=b-Xf6,ZpeC;sqdF$=ecHa\YbKJ#KaN)<>`5BI/_8!b!]tCtg
+\[],W[C!9HZ*:I8Xf\Y(Wi;noVPL#_U7n6PSt2C@S!fY2Q^3o$PEM)kO,o<\N/W[PM26qAL4t;5
+K7\Z)J:E#rI=-BfH?jaZGBS.PFEDSErc&0^Df9N2D/F+gC]A,LC&M]HB4bcTAcH<@A,Tm:@K0a6
+?iOI4?2\%.>Q7n*=oVV(=8c2"<W?%s;u]bq;>a8i:]F2e:&[ib9DD-U8bYdE^A#>?]^*9.]^nYi
+8Gl'S9)_K^9_qK_:B"&c:u]aabl(oJ@/aU4@fBm:AGg$<B)cN@B`;`GCAVfGD#S;JDZ+MPE;4GM
+Er0qKFSL"QG3O5BGjoqTG5ZRZFT-@[EqjYPE9qN@E;OYTErL.ZFT6L`G5c^cGQ<$gH4YFNI!pEl
+IXcluJUrE*K7nsXL(B&qM2@+IMi<USNfK0]OHKO*!L&cIPm<VAQ^F/.R@=,Es-s([rgs.^s.K@b
+s.]OgrhTRjs/,ams/>ssrMomus/c4%s/uC*rilF-!4)U1s0Md6rjE3D\@B)[]">Se]Y2&Y^Bq]l
+_SX4/`Poj;rl?A,b0.uPc-FV\d*^:jeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^roOdTkiq?slg*p(
+mI'E2n*oi:rpp*\s7H<`s7ZKer:p9erqcHfqu$9gj8OW0UAo`~>
+JcC<$JcG3=n,E7`r;?EgrqcWiqtU0bs7ZB`s7H?_r:9mXs7$!Us6fpSrTsRMs6BUJs60LGroX7B
+s5a1>!oi1trnmh7hYu=8gtUT;g=b-Xf6,ZpeC;sqdF$=ecHa\YbKJ#KaN)<>`5BI/_8!b!]tCtg
+\[],W[C!9HZ*:I8Xf\Y(Wi;noVPL#_U7n6PSt2C@S!fY2Q^3o$PEM)kO,o<\N/W[PM26qAL4t;5
+K7\Z)J:E#rI=-BfH?jaZGBS.PFEDSErc&0^Df9N2D/F+gC]A,LC&M]HB4bcTAcH<@A,Tm:@K0a6
+?iOI4?2\%.>Q7n*=oVV(=8c2"<W?%s;u]bq;>a8i:]F2e:&[ib9DD-U8bYd"NVe\+8,>dS8bbpW
+9DqQ\:&[oe:\moaR-'h'R/LCk@/aU4@fBm:AGg$<B)cN@B`;`GCAVfGD#S;JDZ+MPE;4GMEr0qK
+FSL"QG3O5BGjoqTG5ZRZFT-@[EqjYPE9qN@E;OYTErL.ZFT6L`G5c^cGQ<$gH4YFNI!pElIXclu
+JUrE*K7nsXL(B&qM2@+IMi<USNfK0]OHKO*!L&cIPm<VAQ^F/.R@=,Es-s([rgs.^s.K@bs.]Og
+rhTRjs/,ams/>ssrMomus/c4%s/uC*rilF-!4)U1s0Md6rjE3D\@B)[]">Se]Y2&Y^Bq]l_SX4/
+`Poj;rl?A,b0.uPc-FV\d*^:jeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^roOdTkiq?slg*p(mI'E2
+n*oi:rpp*\s7H<`s7ZKer:p9erqcHfqu$9gj8OW0UAo`~>
+JcC<$JcG3=n,E7`r;?EgrqcWiqtU0bs7ZB`s7H?_r:9mXs7$!Us6fpSrTsRMs6BUJs60LGroX7B
+s5a1>!oi1trnmh7hYu=8gtUT;g=b-Xf6,ZpeC;sqdF$=ecHa\YbKJ#KaN)<>`5BI/_8!b!]tCtg
+\[],W[C!9HZ*:I8Xf\Y(Wi;noVPL#_U7n6PSt2C@S!fY2Q^3o$PEM)kO,o<\N/W[PM26qAL4t;5
+K7\Z)J:E#rI=-BfH?jaZGBS.PFEDSErc&0^Df9N2D/F+gC]A,LC&M]HB4bcTAcH<@A,Tm:@K0a6
+?iOI4?2\%.>Q7n*=oVV(=8c2"<W?%s;u]bq;>a8i:]F2e:&[ib9DD-U8bYdH9@ZZ+8,>dS8bbpW
+9DqQ\:&[oe:\mo>;tNud?iFI4@JjU6A,^$:Ac?<ABDZBAC&_rFC]8/LD>J/KDuFYMEVjeRF7OGJ
+Fn^(DGOp(KGPlX_Fnp.YF8^.SEVseBDu=SOEW:(YF8g:]FoQXaGQ2mfH2`+$H[L3hI=?WpJ:N3%
+JqJ]/L&Qf;LPUeDMMd=NN/`jXO,oBbrfR;GPl?pQQC!r*R$jA2rgWqX!1j+\s.B=arh9@ds.fRh
+s/#amrMT[os/Gsss/Z1$riQ4's0)F+s02R0rj2X3!4Dg7$b*XU\[f;`]=bei^AbkR^qmn)_o0O5
+`lJ)",g"3PbKS5VcHjkbdaQ^qe^i@(f\,!4gYCW@hV[8LiSrnXjQ6C'&Ei9Al0@U#m-O--mdKW6
+nF?MKs7?9_rq6<bs7cHdrqZQiq>:'eq>K@QJcDJEJ,~>
+JcC<$JcG0<nG`=`rVZKgrqcWiqtU0bs7ZB`s7H?_r:9mXs7$!Us6fpSrTsRMs6BRI!pJh1rT41C
+jQ-=#s5F%;rnr7_hVR)Egt^Z<g=b-2f@SU(eC;sqdF$=ecHa\YbK@rJaN)<>`5BI/^q[Xu]tCtg
+\[],W[C!9GZ*:I8Xf\Y(Wi2hnVPL#_U7n6PSt2C@S!fY2Q^3o$PEM)kO,o<\N/W[PM26qAL4t;5
+K7\Z)J:E#rI=-BfH?ja[GBX(2FoHI`F)q8"!H;uVD?=ZkD#S2OC2%D]B`D`FB)ZBAAH-0<@fKm:
+@/XF6?<pk8>lS%.>5_V(=T;J$<rZ2"<;fbp;ZBVl;#a>j:A[cb9`7WY9)2'U8FaFi^%o>,^&5P8
+8,>dS8bbpV9DqQ\:&[oe:]!rg;;odbbl(oJ@/aU4@fBm:AGg$<B)cN@B`;`FCA_lGD#S;JDZ+MP
+E;4GMEr'kHFSBqPG0tO2G5ZRZFT$:ZEqs_PE9qNAE;OYSErU4ZFT6I`G5ZUiG^4R\H@(!drd=fr
+J,Xs*JV&N,KS5&6L51TaM$8cpN/WaVrf7)AOoCLEPEc'3!LB)OQj9%JR[]e:S=TYNs.B=arh9@d
+s.fRhs/#amrMT[os/Gsss/Q.$rN6+&s0)F+s0;U0rj)[5[C-"B!OoT<\H]XW]=bei^Abl/^qmn)
+_o0L4`Q#s>aN;TJbKS5VcHjkbdF-LneCE.%f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(pkl07L!rp0[Q
+mf)YVnF?&Jo)J:]o_nI_pAambq#C0hqYC$dr;-BOrdk*Bs*t~>
+JcC<$JcG0<nG`=`rVZKgrqcWiqtU0bs7ZB`s7H?_r:9mXs7$!Us6fpSrTsRMs6BRI!pJh1rT41C
+jQ-=#s5F%;rnr7_hVR)Egt^Z<g=b-2f@SU(eC;sqdF$=ecHa\YbK@rJaN)<>`5BI/^q[Xu]tCtg
+\[],W[C!9GZ*:I8Xf\Y(Wi2hnVPL#_U7n6PSt2C@S!fY2Q^3o$PEM)kO,o<\N/W[PM26qAL4t;5
+K7\Z)J:E#rI=-BfH?ja[GBX(2FoHI`F)q8"!H;uVD?=ZkD#S2OC2%D]B`D`FB)ZBAAH-0<@fKm:
+@/XF6?<pk8>lS%.>5_V(=T;J$<rZ2"<;fbp;ZBVl;#a>j:A[cb9`7WY9)2'U8B["jN:]X:8Gl'S
+9)VE]9_qK_:B"&d:]OAcR-L+,R/LCk@/aU4@fBm:AGg$<B)cN@B`;`FCA_lGD#S;JDZ+MPE;4GM
+Er'kHFSBqPG0tO2G5ZRZFT$:ZEqs_PE9qNAE;OYSErU4ZFT6I`G5ZUiG^4R\H@(!drd=frJ,Xs*
+JV&N,KS5&6L51TaM$8cpN/WaVrf7)AOoCLEPEc'3!LB)OQj9%JR[]e:S=TYNs.B=arh9@ds.fRh
+s/#amrMT[os/Gsss/Q.$rN6+&s0)F+s0;U0rj)[5[C-"B!OoT<\H]XW]=bei^Abl/^qmn)_o0L4
+`Q#s>aN;TJbKS5VcHjkbdF-LneCE.%f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(pkl07L!rp0[Qmf)YV
+nF?&Jo)J:]o_nI_pAambq#C0hqYC$dr;-BOrdk*Bs*t~>
+JcC<$JcG0<nG`=`rVZKgrqcWiqtU0bs7ZB`s7H?_r:9mXs7$!Us6fpSrTsRMs6BRI!pJh1rT41C
+jQ-=#s5F%;rnr7_hVR)Egt^Z<g=b-2f@SU(eC;sqdF$=ecHa\YbK@rJaN)<>`5BI/^q[Xu]tCtg
+\[],W[C!9GZ*:I8Xf\Y(Wi2hnVPL#_U7n6PSt2C@S!fY2Q^3o$PEM)kO,o<\N/W[PM26qAL4t;5
+K7\Z)J:E#rI=-BfH?ja[GBX(2FoHI`F)q8"!H;uVD?=ZkD#S2OC2%D]B`D`FB)ZBAAH-0<@fKm:
+@/XF6?<pk8>lS%.>5_V(=T;J$<rZ2"<;fbp;ZBVl;#a>j:A[cb9`7WY9)2'U8F]@(9(YXM8Gl'S
+9)VE]9_qK_:B"&d:]OAE;tNud?iFI4@JjU6A,^$:Ac?<ABDZBAC&VlFC]/)KD>J/KDuFYMEVjeQ
+F7=;GFn^(,GPcR^Fnp.XF8^.TEVj_ADuFYPEW1"YF8^4\FT?U`G6`A<H$Xd`H[Pg@!IfOtJ-pjZ
+K7ei1Knb>;M#N57MMmFPNK4"!!K`HCOo^c2rfmMMQi<?WR@9S6S"-">rgs.^s.K@bs.]OgrhTRj
+s/,ams/>ssrMomu!3H.$s/uC*rilF-s0DX1!joACrjDj:\Gj#C]">Se]Y2&Y^H96I_SX4/`5T^8
+a2l?Db0.uPc-FV\d*^7he'umtf%8O+g"P07gtgfChr*GOioB([jlY^gkNM0plKeH9!U]=SmfN"K
+nc&+Zo)SF]p&Facp\agdq>U6dqu$BgrSmg-s.KCB~>
+JcC<$JcG-;nG`@ar;?BfrqcWiqtU0bs7ZB`s7H<^rUU!Ys7#sTs6fpSrTjUOlK\?4s60LGroX7B
+!9F.>s5F%;ro!h6!8d_2EST=&g=b03f@SU(eC;sqdF$=ecHa\YbK@rJaN)<>`5BI/^q[Xu]Y(kf
+\[],W[C!9GZ*:F7XfSS'Wi2hnVPL#_TqS-OSt2C@S!fY2Q^3o$PEM)kOH5E]N/W[PM2@"BL4t;5
+K7\Z)J:E#rI=-D@H3JS=GB\4QrcA0^ErL%`E,TZ4DJa6,rbMOKs(VIGs(;=DrFQ">s'u%;s'bq8
+rEoS2s'>S.s',M,r`T8's&]/"s&K(ur)<Vns&&\js%iVhqb@#_rCciVpdt3Nn\+b2lb35/p.+pL
+r(6WTrCd,`qG$rarD3;er___#lcf96ra>_6r*oY8rabq<rau.Br+Q(DrbD=GrbVRNqJQ7Mr,DCM
+qf;OSmr\;HpNG)2qf_p\piQLVrGq[Qr,D"@r,DOQs)S*[rcJ0_s*"Bcs*+Nhrd"s!I!g?jIXcit
+J:W=OK*?p^L5(J>reUf9Mi<USNrG(NOHG]hPEV5rQ'R`&R$a;0Rf8cXS=Q5MScYOWT`1YbU&^te
+V#R:kVZ!CoW2ZcpWrK."XSo:$Y5b^)YlD!.ZMq31ZiIN5[f<f:\Gj#>]"@sS!PQ5H^B)-drk^G.
+`5T^8a2l?Db0.uPc-=PZcd:(edaQ^qe^i@(f\,!4gYCW@hV[8LiSrnXjQ5OdkNMp0!UB"MliHMA
+rpKpXnaZVL!qZ'VrUp3as7cKerqZQiqYU0fqu,RSJcD>AJ,~>
+JcC<$JcG-;nG`@ar;?BfrqcWiqtU0bs7ZB`s7H<^rUU!Ys7#sTs6fpSrTjUOlK\?4s60LGroX7B
+!9F.>s5F%;ro!h6!8d_2EST=&g=b03f@SU(eC;sqdF$=ecHa\YbK@rJaN)<>`5BI/^q[Xu]Y(kf
+\[],W[C!9GZ*:F7XfSS'Wi2hnVPL#_TqS-OSt2C@S!fY2Q^3o$PEM)kOH5E]N/W[PM2@"BL4t;5
+K7\Z)J:E#rI=-D@H3JS=GB\4QrcA0^ErL%`E,TZ4DJa6,rbMOKs(VIGs(;=DrFQ">s'u%;s'bq8
+rEoS2s'>S.s',M,r`T8's&]/"s&K(ur)<Vns&&\js%iVhqb@#_rCciVpdt3NduF9ap.+pLr(6WT
+rCd,`qG$rarD3;er_`6Rn!WU2r*TG2raG_6raYq<r+5k>rb).Brb;@HqeQ1Irb_LLrGVUQpMp(N
+qK)+IpN?4ReT^n6rH7mWrcA$Ypi64Nlu2f@qf2XVrcA'\s)n?brceBe!."Qi$[[8KI=6QoIt3'#
+K)UB+KS>/8LPYqd"cA4sN/`ksNt@D8P*2#mPa.N"QC!u+R@0NCRf]+NSc52^T:hkVU&UheU]%"g
+V>mFkVZNfrWVrjsX8f:"XoGR(YPtd+Z2_-/Zi@B4[JmW7[fEr;\H0:Rrk&9F^AbkJ^qp#e1;h&L
+`Q#s>aN;TJbKS5UcHab_dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^k2tjjrojIKli-5OmI'uB
+!q>aMrpg-^o^r+Ts7ZKerV6BfrqcKgqu$?ij8OW0T)X<~>
+JcC<$JcG-;nG`@ar;?BfrqcWiqtU0bs7ZB`s7H<^rUU!Ys7#sTs6fpSrTjUOlK\?4s60LGroX7B
+!9F.>s5F%;ro!h6!8d_2EST=&g=b03f@SU(eC;sqdF$=ecHa\YbK@rJaN)<>`5BI/^q[Xu]Y(kf
+\[],W[C!9GZ*:F7XfSS'Wi2hnVPL#_TqS-OSt2C@S!fY2Q^3o$PEM)kOH5E]N/W[PM2@"BL4t;5
+K7\Z)J:E#rI=-D@H3JS=GB\4QrcA0^ErL%`E,TZ4DJa6,rbMOKs(VIGs(;=DrFQ">s'u%;s'bq8
+rEoS2s'>S.s',M,r`T8's&]/"s&K(ur)<Vns&&\js%iVhqb@#_rCciVpdt3Nc:[e#q+1ETpIbBW
+r_3/_r_EDfqb[8hfi.QAr*TG2raG_6raYq<r+5k>rb).Brb;@HqeQ1Irb_LLrGVUQpMp(NqK)+I
+pN?4ReT^n6rH7mWrcA$Ypi64Nlu2f@qf2XVrcA'\s)n?brceBe!."Qi$[[8KI=6QoIt3'#K)UB+
+KS>/8LPYqd"cA4sN/`ksNt@D8P*2#mPa.N"QC!u+R@0NCRf]+NSc52^T:hkVU&UheU]%"gV>mFk
+VZNfrWVrjsX8f:"XoGR(YPtd+Z2_-/Zi@B4[JmW7[fEr;\H0:Rrk&9F^AbkJ^qp#e1;h&L`Q#s>
+aN;TJbKS5UcHab_dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^k2tjjrojIKli-5OmI'uB!q>aM
+rpg-^o^r+Ts7ZKerV6BfrqcKgqu$?ij8OW0T)X<~>
+JcC<$JcG-;n,E7`r;?EgrVHNhqtU3crq?9_s7H<^rUU!Ys7#sTs6fpSrTsRMs6BUJs60LGroX7B
+s5a1>#NF_$i8EMMhYu=3gtVh^B\D%if@JL%eC2jndEp4bcHXSVb/q`Ga2Z*:_ns7*^V@Ip]Xt_b
+\@8oS['R'CYck43XK/A#W2HPiUnjcZTqJ$LSXc1=R@'A.QBd\uP*1rhO,f3YN/NRMM26qAKnP)2
+Jq8H&It%BF"akZCH?jc7G6W55FEDSFErL%ZE,Y_ns(qaPrbMOKs(VIGs(;=DrFQ">s'u%;s'bq8
+rEoS2s'>V/s',M,rE9/&s&]/"s&K(urDW_or_`Vjr_NMgqb@#_rCccToh"UCs1S9Alb380p.+pL
+qapQTrCd)_qG$rarD3;er_`Ymqc!Jns&JR5m*,B7ra>_6qdTS8rabq<rau.Br+Q(DrbD=GrbVOM
+qJQ7MrG_IMqJuCQmWA2Gp3,58qKDdZq/lRVrGq[Qr,D"@rG_XRrc8$[rH/'^!-\<b!I/nhHN/=K
+I!pElIXcluJV&K+K7nr5L51P?M2@+JN/WaVNfT6_OcklkPE_>tQC!r*R$jD3S"#q<Sc52^T:hkV
+U&UheU]%"gV#[CkVuN^qWVrjsX8f:"XoGR(YPtd+Z2_-/Zi@E4[JmT9\%&sI\H0:Rrk&HK^:q@s
+^qp#e1W./M`Q#s=aN2KGbKJ,ScHab_dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRioB([jlY^gkl0fN
+lKdg'mHs?@mfN"Knc&(\oCV\Sp&Facp\agcq>U6equ$BgrT4$0s.'+>~>
+JcC<$JcG-;n,E7`r;?EgrVHNhqtU3crq?9_s7H<^rUU!Ys7#sTs6fpSrTsRMs6BUJs60LGroX7B
+s5a1>#NF_$i8EMMhYu=3gtVh^B\D%if@JL%eC2jndEp4bcHXSVb/q`Ga2Z*:_ns7*^V@Ip]Xt_b
+\@8oS['R'CYck43XK/A#W2HPiUnjcZTqJ$LSXc1=R@'A.QBd\uP*1rhO,f3YN/NRMM26qAKnP)2
+Jq8H&It%BF"akZCH?jc7G6W55FEDSFErL%ZE,Y_ns(qaPrbMOKs(VIGs(;=DrFQ">s'u%;s'bq8
+rEoS2s'>V/s',M,rE9/&s&]/"s&K(urDW_or_`Vjr_NMgqb@#_rCccToh"UCif3nqp.+pLqapQT
+rCd)_qG$rarD3;er_`Ymqc!Jns&Jr`o9o'7r*TG2raG\5s'u%=r+5k>rb).Brb;@HqeQ1IrGDCK
+rGVXRp2TqLq/btGpN?1QgirU<r,qgWrH%pXpi64Nlu2iAqf2UUs)\-\s)e<brHA9eH2`-iHSg+u
+I=?WpJ:N3&JqJ]/Knb>;LPUeDMMmFPNK0$[O-#KeP*;)oQ'IZ%Q^F/.R[T_8S=H/LScYOWT`1Yb
+U&^teV#R7kVZ!FmW;ijqWrK."XSo:$Y5b^)YlD!.ZMq31[/[Q5[K<qJ\Gj#>]"@sS#/.ab^V@S#
+rk^J/`5T^8a2c9Bai_fMbg"GYcd:(edaQ^qe^i@(f\,!4gYCW@hV[8LiSrkWj5f=ak3(t-km$G=
+m-O-,mf)YVnF?&JncJFTo`"O`pAambq#:*gqYL*er;-BRrdk*>s*t~>
+JcC<$JcG-;n,E7`r;?EgrVHNhqtU3crq?9_s7H<^rUU!Ys7#sTs6fpSrTsRMs6BUJs60LGroX7B
+s5a1>#NF_$i8EMMhYu=3gtVh^B\D%if@JL%eC2jndEp4bcHXSVb/q`Ga2Z*:_ns7*^V@Ip]Xt_b
+\@8oS['R'CYck43XK/A#W2HPiUnjcZTqJ$LSXc1=R@'A.QBd\uP*1rhO,f3YN/NRMM26qAKnP)2
+Jq8H&It%BF"akZCH?jc7G6W55FEDSFErL%ZE,Y_ns(qaPrbMOKs(VIGs(;=DrFQ">s'u%;s'bq8
+rEoS2s'>V/s',M,rE9/&s&]/"s&K(urDW_or_`Vjr_NMgqb@#_rCccToh"UChFdK3q+1BSpe(KX
+rCm&^r_EDfqb[8hr_iVlr`&nts&8kolr3UUr*TG2raG\5s'u%=r+5k>rb).Brb;@HqeQ1IrGDCK
+rGVXRp2TqLq/btGpN?1QgirU<r,qgWrH%pXpi64Nlu2iAqf2UUs)\-\s)e<brHA9eH2`-iHSg+u
+I=?WpJ:N3&JqJ]/Knb>;LPUeDMMmFPNK0$[O-#KeP*;)oQ'IZ%Q^F/.R[T_8S=H/LScYOWT`1Yb
+U&^teV#R7kVZ!FmW;ijqWrK."XSo:$Y5b^)YlD!.ZMq31[/[Q5[K<qJ\Gj#>]"@sS#/.ab^V@S#
+rk^J/`5T^8a2c9Bai_fMbg"GYcd:(edaQ^qe^i@(f\,!4gYCW@hV[8LiSrkWj5f=ak3(t-km$G=
+m-O-,mf)YVnF?&JncJFTo`"O`pAambq#:*gqYL*er;-BRrdk*>s*t~>
+JcC<$JcG*:nG`=`rVZKgrVHNhqtU3crq?9_s7H<^rUTsXs7$!Us6fpSrTsRMs6BRIs6'IGrT41C
+jQ-=#s5F%;rnmh7hYu=3gtVh^G1kO"f@JL%eC2jndEp4bcHXSVb/q`Ga2Q$9_ns7*^V@Ip]XkYa
+\@/iRZa6sBYck43XK/A#W2HPiUnjcZTqJ$LSXc1=R@'A.QBd\uP*1rhO,f3YN/NRMM26qAL4t;5
+K7\Z)J:E#rI=-BfH?ja[GB\4QrcA0^ErL(YDuahUD?=ZkD#S5MC&huHBEDgYB)Q9BA7K-J@fKm:
+@/aO5?N4=0>lS%.>5h\)=T;J$<rZ2"<;fbp;ZBVl;#a>j:AR]`9`.QT9(GR>8H)-K]`>_E^%b+m
+8Gc!Q9)VE]9_qK_:B"&d;#O8j;YsDl<;onp<rQ2"=T-M2bkkcI@/aU3@fBm;AG]s<B)ZH?B`DfG
+CAVfFD#S;JDZ+MOE;";IEqj_CFSBqOG2d`BG5HFWFT$:ZEqjYPE:%TAE;OYTErL.ZFT6L`G5c^c
+GQ<$gH3&A?rd=frJ,Xs%JV&N,KSBD[(Pdg'M2I4MN/`jXO,oBbP*2#nPa.N"Qi<?QR@=,E!M#_[
+T)YD_T`1YbU&^teU]RBiVZ!FmW;ijrWrK."XSo:$Y5b^(YlD!.ZMq31[/[Q5[f<f:\Gj&=\cBAA
+]E,^[rkAKL_>_;8_o0O5`l?'?aN;TJbKS5VcHjh`dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^
+jlY^gkiq?slKdg'mHs?@mfDqJrpp*\s7H<`s7ZKer:p9es8)Qgr;?Hjk5Kr3Rf@m~>
+JcC<$JcG*:nG`=`rVZKgrVHNhqtU3crq?9_s7H<^rUTsXs7$!Us6fpSrTsRMs6BRIs6'IGrT41C
+jQ-=#s5F%;rnmh7hYu=3gtVh^G1kO"f@JL%eC2jndEp4bcHXSVb/q`Ga2Q$9_ns7*^V@Ip]XkYa
+\@/iRZa6sBYck43XK/A#W2HPiUnjcZTqJ$LSXc1=R@'A.QBd\uP*1rhO,f3YN/NRMM26qAL4t;5
+K7\Z)J:E#rI=-BfH?ja[GB\4QrcA0^ErL(YDuahUD?=ZkD#S5MC&huHBEDgYB)Q9BA7K-J@fKm:
+@/aO5?N4=0>lS%.>5h\)=T;J$<rZ2"<;fbp;ZBVl;#a>j:AR]`9`.QT9(GR>8H)-KN<"q:NVH$=
+8Gc!Q9)VE]9_qK_:B"&d;#O8j;YsDl<;onp<rQ2"=SeHSR/:7j@/aU3@fBm;AG]s<B)ZH?B`DfG
+CAVfFD#S;JDZ+MOE;";IEqj_CFSBqOG2d`BG5HFWFT$:ZEqjYPE:%TAE;OYTErL.ZFT6L`G5c^c
+GQ<$gH3&A?rd=frJ,Xs%JV&N,KSBD[(Pdg'M2I4MN/`jXO,oBbP*2#nPa.N"Qi<?QR@=,E!M#_[
+T)YD_T`1YbU&^teU]RBiVZ!FmW;ijrWrK."XSo:$Y5b^(YlD!.ZMq31[/[Q5[f<f:\Gj&=\cBAA
+]E,^[rkAKL_>_;8_o0O5`l?'?aN;TJbKS5VcHjh`dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^
+jlY^gkiq?slKdg'mHs?@mfDqJrpp*\s7H<`s7ZKer:p9es8)Qgr;?Hjk5Kr3Rf@m~>
+JcC<$JcG*:nG`=`rVZKgrVHNhqtU3crq?9_s7H<^rUTsXs7$!Us6fpSrTsRMs6BRIs6'IGrT41C
+jQ-=#s5F%;rnmh7hYu=3gtVh^G1kO"f@JL%eC2jndEp4bcHXSVb/q`Ga2Q$9_ns7*^V@Ip]XkYa
+\@/iRZa6sBYck43XK/A#W2HPiUnjcZTqJ$LSXc1=R@'A.QBd\uP*1rhO,f3YN/NRMM26qAL4t;5
+K7\Z)J:E#rI=-BfH?ja[GB\4QrcA0^ErL(YDuahUD?=ZkD#S5MC&huHBEDgYB)Q9BA7K-J@fKm:
+@/aO5?N4=0>lS%.>5h\)=T;J$<rZ2"<;fbp;ZBVl;#a>j:AR]`9`.QT9(GR>8H)-G9)(pO8Gc!Q
+9)VE]9_qK_:B"&d;#O8j;YsDl<;onp<rQ2"=S#Jb;Ysi$@/aU3@fBm;AG]s<B)ZH?B`DfGCAVfF
+D#S;JDZ+MOE;";IEqj_CFSBqOG2d`BG5HFWFT$:ZEqjYPE:%TAE;OYTErL.ZFT6L`G5c^cGQ<$g
+H3&A?rd=frJ,Xs%JV&N,KSBD[(Pdg'M2I4MN/`jXO,oBbP*2#nPa.N"Qi<?QR@=,E!M#_[T)YD_
+T`1YbU&^teU]RBiVZ!FmW;ijrWrK."XSo:$Y5b^(YlD!.ZMq31[/[Q5[f<f:\Gj&=\cBAA]E,^[
+rkAKL_>_;8_o0O5`l?'?aN;TJbKS5VcHjh`dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^jlY^g
+kiq?slKdg'mHs?@mfDqJrpp*\s7H<`s7ZKer:p9es8)Qgr;?Hjk5Kr3Rf@m~>
+JcC<$JcG'9nG`=`rVZKgrqcThqtU3crq?9_s7H<^rUTsXs7$!Us6fpSr9OLNlK\?4s60LGroX7B
+!9F.>s5F%;rnn"<hVR)EgtVh^D;!Rnf@JL%eC2jndEp4bcHXPUb/q`G`l5p8_ns7*^V7Co]XkYa
+\$i`QZa6sAYck43XK/A#W2HMhUnj`YTqJ$LSXc1=R@'A.QBd\uP*1rhO,o<[N/NRMM26qAL4t;5
+K7\Z)J:E#rI=-D@H4,"CGB\4RF`__HF)q8"!cW'rrb_dSCi')d!buF`rb2=Es(;7As().>rF5e8
+!+>b4s'G_2r`oJ-s'#A(s&f;&rDrqus&Aqqs&/kor)!Agr_E;arCm)]n4N1Am7?n?rkABFqFC9N
+qapNSrCd)_qG$rar_NAer_`Ymqc!Jnr`/eqr`B)$qcWl$r`f'>qd9>1raG_6raYq<r+5k>rb).B
+rb;@HqeQ1IrGDCKrGVUQol9eJpN,YBpN?1Ql$)oGr,qdVr,_gWpi61Mmr/,Cqf2UUs)\-\s)e<b
+rHA9eH2`-iHO5(JI=?WpJ:N3&rdtN1Knb>;Ll$tGMuJYFNK0'\OHG]hPE_;sQ'Rd9Qj/tIS"#q<
+Sc52cT:hjNTq\9VrM0LkVPa<i!iW)trMomus/c1$s/uC*rNQ=,s0DU0!joACrjMj9s1&'=!kQ"U
+rk&9F^AbkJ^qp#e!Q2kT`<F9%aN2KGrl[4Dc-FV\d*^7he'umtf%8O+g"P07gYCW@hV[8LiSrnX
+jQ5OdkND'nl0@U#m-O--mdKW6nF?MKs766_rUp3as7cKerqZQiqYU3gqu,^WJcD,;J,~>
+JcC<$JcG'9nG`=`rVZKgrqcThqtU3crq?9_s7H<^rUTsXs7$!Us6fpSr9OLNlK\?4s60LGroX7B
+!9F.>s5F%;rnn"<hVR)EgtVh^D;!Rnf@JL%eC2jndEp4bcHXPUb/q`G`l5p8_ns7*^V7Co]XkYa
+\$i`QZa6sAYck43XK/A#W2HMhUnj`YTqJ$LSXc1=R@'A.QBd\uP*1rhO,o<[N/NRMM26qAL4t;5
+K7\Z)J:E#rI=-D@H4,"CGB\4RF`__HF)q8"!cW'rrb_dSCi')d!buF`rb2=Es(;7As().>rF5e8
+!+>b4s'G_2r`oJ-s'#A(s&f;&rDrqus&Aqqs&/kor)!Agr_E;arCm)]n4N1Am7?n?rf6u;qFC9N
+qapNSrCd)_qG$rar_NAer_`Ymqc!Jnr`/eqr`B)$qcWl$r`f&_qd9>1raG_6raYq<r+5k>rb).B
+rb;@HqeQ1IrGDCKrGVUQol9eJpN,YBpN?1Ql$)oGr,qdVr,_gWpi61Mmr/,Cqf2UUs)\-\s)e<b
+rHA9eH2`-iHO5(JI=?WpJ:N3&rdtN1Knb>;Ll$tGMuJYFNK0'\OHG]hPE_;sQ'Rd9Qj/tIS"#q<
+Sc52cT:hjNTq\9VrM0LkVPa<i!iW)trMomus/c1$s/uC*rNQ=,s0DU0!joACrjMj9s1&'=!kQ"U
+rk&9F^AbkJ^qp#e!Q2kT`<F9%aN2KGrl[4Dc-FV\d*^7he'umtf%8O+g"P07gYCW@hV[8LiSrnX
+jQ5OdkND'nl0@U#m-O--mdKW6nF?MKs766_rUp3as7cKerqZQiqYU3gqu,^WJcD,;J,~>
+JcC<$JcG'9nG`=`rVZKgrqcThqtU3crq?9_s7H<^rUTsXs7$!Us6fpSr9OLNlK\?4s60LGroX7B
+!9F.>s5F%;rnn"<hVR)EgtVh^D;!Rnf@JL%eC2jndEp4bcHXPUb/q`G`l5p8_ns7*^V7Co]XkYa
+\$i`QZa6sAYck43XK/A#W2HMhUnj`YTqJ$LSXc1=R@'A.QBd\uP*1rhO,o<[N/NRMM26qAL4t;5
+K7\Z)J:E#rI=-D@H4,"CGB\4RF`__HF)q8"!cW'rrb_dSCi')d!buF`rb2=Es(;7As().>rF5e8
+!+>b4s'G_2r`oJ-s'#A(s&f;&rDrqus&Aqqs&/kor)!Agr_E;arCm)]n4N1Am7?n?r_*5_qFC9N
+qapNSrCd)_qG$rar_NAer_`Ymqc!Jnr`/eqr`B)$qcWl$r`fD$pJUlqra>_6r*oY8rabq<rau.B
+r+Q(DrbD=GrbVOMqJQ7Mr,D=Kq/Z4NlZDlDp3,\EpicRXpiQFTrGq[Qqf)"Br,DOQrc8$[rH/'^
+!-\<b!I/nhHN/<uI!pElIXcluJV*lR$&""eL51SAM2I5jN"1i-O,oBbP*2#nPa.N"Qi<?VR@9V7
+S=H/LSd1m\TV8'RU8.[_!i;ckrMK^qWN#irs/Z1$rN6+&s0)C*s0;U0rNcR4[C-"Bs0r$<rj`*A
+]=\'T!PQ5H^B)-drk\]R`;[^Z`lH0AaiaV+2U'FkcHjkbdF-LneCE.%f@\d1g=tB;h;-rFi8ESR
+j5]4^k2tjikiq?slg*p(mI'E2n*oi:rpp*\!;-6_s7ZKerV6BfrqcKgr;?HjkPg&4R/_[~>
+JcC<$JcG'9nG`=`r;?BfrqcWiqtU0brq?9_s7H<^r:9mXs7#sTs6fpSrTsRMs6BRI!pJh1roX7B
+s5a1>!TN);i,df4hVI#CgY:H9g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pod4_SO%&^:h1k]",A\
+[^NQLZa-g>YH=q.X/`.tVl$;dUnXQVTV%gHS=?"9R$a5+Q'@JqP*(ieO,f3YMi*@JLkg_>KnP)2
+Jq8H&It%BF"akZCH?jc7G6)l0rcABdEcQ/>E,]apDZ=PRD#S5MCB&#IB`D`FB)ZBAAH-0=@fKm:
+@/aO5?N4=0>lS".>5_V(=T;J$<rZ2"<;fbq;Z9Pk;#X8i:AR]_9`%KL9(5F=8G#FE8Gc!Q9)VE]
+9_qK^:B"&d;#O8j;YsDl<;onp<rH,!=Sl8#>5_\&>lJ%.?Me+/@/aU4@fBm:AGg$<B)ZH@B`;`F
+CAVfGD#J5IDZ"GNE:e/GEqXS?FSBqLG4KkOG5?@VFT$:YEqjYNE:RrEE;OYSErU4ZFT6L`G5c[e
+G^4T6H3&A?rd>l;It3'#JqAW-KS>/8LPUeDMMd=NN/`jYO-#KeP*;.0Pn97JR$a;1R[]e:SXl@D
+T:hkVT`Us`U].%jV5C-hVuN^qWVrguX/rE$XoGR(YPbX)Z2_-/Zi@E4[JdN8\%&sI\c95@]DfJC
+]`>eG^B)-drk\]R`;[^c`lH0AaiV]KbKS5VcHjl:d2p`beC<%"f@S[.g=k<:h;-rFi8ESRioB([
+jlY^gkl0fIlKeH9!U]=SmfN"Knc&(\oCV\Ro`4^bp\jmdq>^<fqu$BhrTX<4s-<V7~>
+JcC<$JcG'9nG`=`r;?BfrqcWiqtU0brq?9_s7H<^r:9mXs7#sTs6fpSrTsRMs6BRI!pJh1roX7B
+s5a1>!TN);i,df4hVI#CgY:H9g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pod4_SO%&^:h1k]",A\
+[^NQLZa-g>YH=q.X/`.tVl$;dUnXQVTV%gHS=?"9R$a5+Q'@JqP*(ieO,f3YMi*@JLkg_>KnP)2
+Jq8H&It%BF"akZCH?jc7G6)l0rcABdEcQ/>E,]apDZ=PRD#S5MCB&#IB`D`FB)ZBAAH-0=@fKm:
+@/aO5?N4=0>lS".>5_V(=T;J$<rZ2"<;fbq;Z9Pk;#X8i:AR]_9`%KL9(5F=8G#FE8Gc!Q9)VE]
+9_qK^:B"&d;#O8j;YsDl<;onp<rH,!=Sl8#>5_\&>lJ%.?Me+/@/aU4@fBm:AGg$<B)ZH@B`;`F
+CAVfGD#J5IDZ"GNE:e/GEqXS?FSBqLG4KkOG5?@VFT$:YEqjYNE:RrEE;OYSErU4ZFT6L`G5c[e
+G^4T6H3&A?rd>l;It3'#JqAW-KS>/8LPUeDMMd=NN/`jYO-#KeP*;.0Pn97JR$a;1R[]e:SXl@D
+T:hkVT`Us`U].%jV5C-hVuN^qWVrguX/rE$XoGR(YPbX)Z2_-/Zi@E4[JdN8\%&sI\c95@]DfJC
+]`>eG^B)-drk\]R`;[^c`lH0AaiV]KbKS5VcHjl:d2p`beC<%"f@S[.g=k<:h;-rFi8ESRioB([
+jlY^gkl0fIlKeH9!U]=SmfN"Knc&(\oCV\Ro`4^bp\jmdq>^<fqu$BhrTX<4s-<V7~>
+JcC<$JcG'9nG`=`r;?BfrqcWiqtU0brq?9_s7H<^r:9mXs7#sTs6fpSrTsRMs6BRI!pJh1roX7B
+s5a1>!TN);i,df4hVI#CgY:H9g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pod4_SO%&^:h1k]",A\
+[^NQLZa-g>YH=q.X/`.tVl$;dUnXQVTV%gHS=?"9R$a5+Q'@JqP*(ieO,f3YMi*@JLkg_>KnP)2
+Jq8H&It%BF"akZCH?jc7G6)l0rcABdEcQ/>E,]apDZ=PRD#S5MCB&#IB`D`FB)ZBAAH-0=@fKm:
+@/aO5?N4=0>lS".>5_V(=T;J$<rZ2"<;fbq;Z9Pk;#X8i:AR]_9`%KL9(5F=8G#FE8Gc!Q9)VE]
+9_qK^:B"&d;#O8j;YsDl<;onp<rH,!=Sl8#>5_\&>lJ%.?Me+/@/aU4@fBm:AGg$<B)ZH@B`;`F
+CAVfGD#J5IDZ"GNE:e/GEqXS?FSBqLG4KkOG5?@VFT$:YEqjYNE:RrEE;OYSErU4ZFT6L`G5c[e
+G^4T6H3&A?rd>l;It3'#JqAW-KS>/8LPUeDMMd=NN/`jYO-#KeP*;.0Pn97JR$a;1R[]e:SXl@D
+T:hkVT`Us`U].%jV5C-hVuN^qWVrguX/rE$XoGR(YPbX)Z2_-/Zi@E4[JdN8\%&sI\c95@]DfJC
+]`>eG^B)-drk\]R`;[^c`lH0AaiV]KbKS5VcHjl:d2p`beC<%"f@S[.g=k<:h;-rFi8ESRioB([
+jlY^gkl0fIlKeH9!U]=SmfN"Knc&(\oCV\Ro`4^bp\jmdq>^<fqu$BhrTX<4s-<V7~>
+JcC<$JcG$8nG`=`r;?BfrqcThqtU3crq?9_rq-6^r:9mXrp]mTs6fpSr9XIL!:'OIs60LGroO:D
+jQ-=#IH'5Ei8EMMhVI#CgtUQ:g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pod4_SO%&^:h1k]",>[
+[^NQLZa$a=YH=q.WiE%sVl$;dUnXQVTV%gHS=?"9R$a5+Q'IPrP*(ieO,f3YN/NRMLkg_>KnP)2
+Jq8K'J:E#rI=-D@H3SY>GB\4RFoHI`F)q8"s)7sVrbhaQ!,VXMs(_RJrb2=E!+u1@s'u+>rF5e8
+s'Yh5s'G_2r`oJ-s'#A(!a&N*rDrqus&Anps&/koqb[8fr_E;aqb6l[k=Y58gdq95p.G9VrCm&^
+r_EDfqb[8hr_iSkr`&ksqc<Ysr`K&#r`]8)qcs,+ra,J/ra>_6qdTP7s()"<s(;7Cqe5tCrbD=G
+rbVOMq/6.Lqf).Hp2]kJlu_rDicb0@pN6=SrGqXPqJc"Dr,DLPs)S*[rH/'^!-\?cs*+Nhrd"cq
+I!g?jIXh?I"bD8XK7nsXL(T2sM2@+JN/WaVO,oBbP*2#nrfmYQQ^F/.Rf8cWS=TYN!M?%aT`Us`
+U].%jV5C-hVuN^qWW&ptX8f:"XoGR(YPk^*Z2_-.Zi@E4[JdN8\%&sH\H9@S]DfGE]tV5[^B)-d
+rk\]R`;[^V`lJ)"'$8;>bKS5UcHab_dF$CkeC<%"rmqV3g"P07gtgfChr*GOir7sAjQ5OdkNMp0
+!UB"MliHMArpKpXnaZVL!qZ'Vrq6<bs7cHds7uZjqYU6hr;Gp[JcCo5J,~>
+JcC<$JcG$8nG`=`r;?BfrqcThqtU3crq?9_rq-6^r:9mXrp]mTs6fpSr9XIL!:'OIs60LGroO:D
+jQ-=#IH'5Ei8EMMhVI#CgtUQ:g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pod4_SO%&^:h1k]",>[
+[^NQLZa$a=YH=q.WiE%sVl$;dUnXQVTV%gHS=?"9R$a5+Q'IPrP*(ieO,f3YN/NRMLkg_>KnP)2
+Jq8K'J:E#rI=-D@H3SY>GB\4RFoHI`F)q8"s)7sVrbhaQ!,VXMs(_RJrb2=E!+u1@s'u+>rF5e8
+s'Yh5s'G_2r`oJ-s'#A(!a&N*rDrqus&Anps&/koqb[8fr_E;aqb6l[k=Y58gdq95p.G9VrCm&^
+r_EDfqb[8hr_iSkr`&ksqc<Ysr`K&#r`]8)qcs,+ra,J/ra>_6qdTP7s()"<s(;7Cqe5tCrbD=G
+rbVOMq/6.Lqf).Hp2]kJlu_rDicb0@pN6=SrGqXPqJc"Dr,DLPs)S*[rH/'^!-\?cs*+Nhrd"cq
+I!g?jIXh?I"bD8XK7nsXL(T2sM2@+JN/WaVO,oBbP*2#nrfmYQQ^F/.Rf8cWS=TYN!M?%aT`Us`
+U].%jV5C-hVuN^qWW&ptX8f:"XoGR(YPk^*Z2_-.Zi@E4[JdN8\%&sH\H9@S]DfGE]tV5[^B)-d
+rk\]R`;[^V`lJ)"'$8;>bKS5UcHab_dF$CkeC<%"rmqV3g"P07gtgfChr*GOir7sAjQ5OdkNMp0
+!UB"MliHMArpKpXnaZVL!qZ'Vrq6<bs7cHds7uZjqYU6hr;Gp[JcCo5J,~>
+JcC<$JcG$8nG`=`r;?BfrqcThqtU3crq?9_rq-6^r:9mXrp]mTs6fpSr9XIL!:'OIs60LGroO:D
+jQ-=#IH'5Ei8EMMhVI#CgtUQ:g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pod4_SO%&^:h1k]",>[
+[^NQLZa$a=YH=q.WiE%sVl$;dUnXQVTV%gHS=?"9R$a5+Q'IPrP*(ieO,f3YN/NRMLkg_>KnP)2
+Jq8K'J:E#rI=-D@H3SY>GB\4RFoHI`F)q8"s)7sVrbhaQ!,VXMs(_RJrb2=E!+u1@s'u+>rF5e8
+s'Yh5s'G_2r`oJ-s'#A(!a&N*rDrqus&Anps&/koqb[8fr_E;aqb6l[k=Y58gdq95p.G9VrCm&^
+r_EDfqb[8hr_iSkr`&ksqc<Ysr`K&#r`]8)qcs,+ra,J/ra>_6qdTP7s()"<s(;7Cqe5tCrbD=G
+rbVOMq/6.Lqf).Hp2]kJlu_rDicb0@pN6=SrGqXPqJc"Dr,DLPs)S*[rH/'^!-\?cs*+Nhrd"cq
+I!g?jIXh?I"bD8XK7nsXL(T2sM2@+JN/WaVO,oBbP*2#nrfmYQQ^F/.Rf8cWS=TYN!M?%aT`Us`
+U].%jV5C-hVuN^qWW&ptX8f:"XoGR(YPk^*Z2_-.Zi@E4[JdN8\%&sH\H9@S]DfGE]tV5[^B)-d
+rk\]R`;[^V`lJ)"'$8;>bKS5UcHab_dF$CkeC<%"rmqV3g"P07gtgfChr*GOir7sAjQ5OdkNMp0
+!UB"MliHMArpKpXnaZVL!qZ'Vrq6<bs7cHds7uZjqYU6hr;Gp[JcCo5J,~>
+JcC<$JcG$8n,E7`r;?BfrVHNhqtU0brq?9_rq-6^r:9jWs7$!UrpKgRrTsRMs6BUJs60LGroX7B
+!9F.>s5F%;rnr:`hVI#CgtUQ:g"=p.f%&:"e'cXkd*L"^bfe2PaiMNB`Poa3_SO"%^:h1k]",>[
+[^EKKZa$a=YH=q.WiE%sVl$;dUnXQVTV%gHS=?":R$a5+Q'IStP*(ieO,f3YN/NRMM26qAL4t;5
+K7\Z)J:E#rI=-EhH?sj]G^"?:G'.qLFE;MDrc&!YDf>Vm!c;airbMOK!,;CF!bZ+WrFH%@@q5IH
+!b#JErEfV4?![D6s'#J,rE9/&s&]/"s&K(urDW\ns&&\jr_NJfq+^`[q+Kd@nO_k6pdt0OrCd)_
+q+^i`r_NAer_`YmqG[Amr`/hrrE&u#qcWl$r`f8)ra#M0qHs81raG\5raYq<r+5k>rb).Brb;@H
+qJ6(HrGD@Jr,;LPnT"5BolKMBol]MBq/uCQr,_gWp2TnIpM]nIqJlLTs)\-\s)n?brc\ouH$O^^
+H[C-gI=?WpJ:N3&rdu8FKnb>;Ll$tGMi<USNfT6_OcklkPa%GuQC!u+R@=,E#+V6UStDXJrh0@e
+U].(hV#[ClVuN^qWW&ptX8f:"XoGR(YPk^*Z2_-.Zi@E4[JdN8\%&sH\H9@S]DfJC]`>eG^]2(L
+_>_:P_o2Pn!QN1Za8sE*rlZ)$c-FV\d*^7hdaQ^qe^i@(f\,!4gYDea(uF0.i8N\Uj5f=`k2tjj
+l07Kulg4!*mI'uB!V#XYo)J=]o`"O`pAamcq#:*gqYU0gr;6HZrdk*2s*t~>
+JcC<$JcG$8n,E7`r;?BfrVHNhqtU0brq?9_rq-6^r:9jWs7$!UrpKgRrTsRMs6BUJs60LGroX7B
+!9F.>s5F%;rnr:`hVI#CgtUQ:g"=p.f%&:"e'cXkd*L"^bfe2PaiMNB`Poa3_SO"%^:h1k]",>[
+[^EKKZa$a=YH=q.WiE%sVl$;dUnXQVTV%gHS=?":R$a5+Q'IStP*(ieO,f3YN/NRMM26qAL4t;5
+K7\Z)J:E#rI=-EhH?sj]G^"?:G'.qLFE;MDrc&!YDf>Vm!c;airbMOK!,;CF!bZ+WrFH%@@q5IH
+!b#JErEfV4?![D6s'#J,rE9/&s&]/"s&K(urDW\ns&&\jr_NJfq+^`[q+Kd@nO_k6pdt0OrCd)_
+q+^i`r_NAer_`YmqG[Amr`/hrrE&u#qcWl$r`f8)ra#M0qHs81raG\5raYq<r+5k>rb).Brb;@H
+qJ6(HrGD@Jr,;LPnT"5BolKMBol]MBq/uCQr,_gWp2TnIpM]nIqJlLTs)\-\s)n?brc\ouH$O^^
+H[C-gI=?WpJ:N3&rdu8FKnb>;Ll$tGMi<USNfT6_OcklkPa%GuQC!u+R@=,E#+V6UStDXJrh0@e
+U].(hV#[ClVuN^qWW&ptX8f:"XoGR(YPk^*Z2_-.Zi@E4[JdN8\%&sH\H9@S]DfJC]`>eG^]2(L
+_>_:P_o2Pn!QN1Za8sE*rlZ)$c-FV\d*^7hdaQ^qe^i@(f\,!4gYDea(uF0.i8N\Uj5f=`k2tjj
+l07Kulg4!*mI'uB!V#XYo)J=]o`"O`pAamcq#:*gqYU0gr;6HZrdk*2s*t~>
+JcC<$JcG$8n,E7`r;?BfrVHNhqtU0brq?9_rq-6^r:9jWs7$!UrpKgRrTsRMs6BUJs60LGroX7B
+!9F.>s5F%;rnr:`hVI#CgtUQ:g"=p.f%&:"e'cXkd*L"^bfe2PaiMNB`Poa3_SO"%^:h1k]",>[
+[^EKKZa$a=YH=q.WiE%sVl$;dUnXQVTV%gHS=?":R$a5+Q'IStP*(ieO,f3YN/NRMM26qAL4t;5
+K7\Z)J:E#rI=-EhH?sj]G^"?:G'.qLFE;MDrc&!YDf>Vm!c;airbMOK!,;CF!bZ+WrFH%@@q5IH
+!b#JErEfV4?![D6s'#J,rE9/&s&]/"s&K(urDW\ns&&\jr_NJfq+^`[q+Kd@nO_k6pdt0OrCd)_
+q+^i`r_NAer_`YmqG[Amr`/hrrE&u#qcWl$r`f8)ra#M0qHs81raG\5raYq<r+5k>rb).Brb;@H
+qJ6(HrGD@Jr,;LPnT"5BolKMBol]MBq/uCQr,_gWp2TnIpM]nIqJlLTs)\-\s)n?brc\ouH$O^^
+H[C-gI=?WpJ:N3&rdu8FKnb>;Ll$tGMi<USNfT6_OcklkPa%GuQC!u+R@=,E#+V6UStDXJrh0@e
+U].(hV#[ClVuN^qWW&ptX8f:"XoGR(YPk^*Z2_-.Zi@E4[JdN8\%&sH\H9@S]DfJC]`>eG^]2(L
+_>_:P_o2Pn!QN1Za8sE*rlZ)$c-FV\d*^7hdaQ^qe^i@(f\,!4gYDea(uF0.i8N\Uj5f=`k2tjj
+l07Kulg4!*mI'uB!V#XYo)J=]o`"O`pAamcq#:*gqYU0gr;6HZrdk*2s*t~>
+JcC<$JcG!7n,E7`r;?BfrVHNhqY:*brq?6^s7H<^r:9mXs7#sTs6fpSrTsRMs6BRIs6'IGrT4@H
+jQ,@]io8qrhuV`lrnVYNgY1B7f[na+e^W*tda?Ihcd'eZbKJ&LaN)<>`5BI/^q[Xu]Y(kf\[],W
+[C!9GZ*:I8Xf\\)Wi;qpVPU)aU7n9RT:VUDS"#k6R$X,(Q'@JqOcYWbNfB!VMi*@JLkg_>KnP)2
+Jq8H&IsuipI=-D@H3SY>GB\4RFoHIfF)l;@EH#l8rbhaQs(q[M!buF`rb2=Es(;7As().>raPn9
+s'Yh5s'>\2rETA,s'#D)s&f;&rDrqus&Aqqr_ibnqb[8frD*,^qb6cXj@\r6lq$kBoh,0UrCm&^
+rD*>fqG@/gr_iVlrD`brqc<\trE/r"rEB2)qcs)*ra,J/ra>_6r*oY8rabn;s(;7Cqe5tCrbD=G
+rG;IMphp"Jqf(tColB_Hm<%uCo60hMolU.Rr,VLNp2L"LpMftKrc8$[rH/'^s*"Bcs*+Nhrd"Tl
+I/\NpIXh?I'nLshK7nr5L51SAM2I4MN/`jYO-#M'OqNtCQ'IZ%R$a;1S"#q<SXuFFT`1ViU8+KZ
+Unsobrhodp!3,pss/Q.$rN6+&s0)C*s0;U0rNlO2rjDa6s0r$<rOMs>!5&3B!kl=^rkANM_86,f
+!Q2kT`<"!!rl>,^b5TQobg"GYcd:%ddF-LneCE.Lf-]/'g=k<:h;-rFi8ESQioB([jlY^gkNM0p
+lKdd&m-X6/n*fc8nc&+Zo)SF]p&Facp\jmdq>^<fqu-HjrTjH6s,d82~>
+JcC<$JcG!7n,E7`r;?BfrVHNhqY:*brq?6^s7H<^r:9mXs7#sTs6fpSrTsRMs6BRIs6'IGrT4@H
+jQ,@]io8qrhuV`lrnVYNgY1B7f[na+e^W*tda?Ihcd'eZbKJ&LaN)<>`5BI/^q[Xu]Y(kf\[],W
+[C!9GZ*:I8Xf\\)Wi;qpVPU)aU7n9RT:VUDS"#k6R$X,(Q'@JqOcYWbNfB!VMi*@JLkg_>KnP)2
+Jq8H&IsuipI=-D@H3SY>GB\4RFoHIfF)l;@EH#l8rbhaQs(q[M!buF`rb2=Es(;7As().>raPn9
+s'Yh5s'>\2rETA,s'#D)s&f;&rDrqus&Aqqr_ibnqb[8frD*,^qb6cXj@\r6lq$kBoh,0UrCm&^
+rD*>fqG@/gr_iVlrD`brqc<\trE/r"rEB2)qcs)*ra,J/ra>_6r*oY8rabn;s(;7Cqe5tCrbD=G
+rG;IMphp"Jqf(tColB_Hm<%uCo60hMolU.Rr,VLNp2L"LpMftKrc8$[rH/'^s*"Bcs*+Nhrd"Tl
+I/\NpIXh?I'nLshK7nr5L51SAM2I4MN/`jYO-#M'OqNtCQ'IZ%R$a;1S"#q<SXuFFT`1ViU8+KZ
+Unsobrhodp!3,pss/Q.$rN6+&s0)C*s0;U0rNlO2rjDa6s0r$<rOMs>!5&3B!kl=^rkANM_86,f
+!Q2kT`<"!!rl>,^b5TQobg"GYcd:%ddF-LneCE.Lf-]/'g=k<:h;-rFi8ESQioB([jlY^gkNM0p
+lKdd&m-X6/n*fc8nc&+Zo)SF]p&Facp\jmdq>^<fqu-HjrTjH6s,d82~>
+JcC<$JcG!7n,E7`r;?BfrVHNhqY:*brq?6^s7H<^r:9mXs7#sTs6fpSrTsRMs6BRIs6'IGrT4@H
+jQ,@]io8qrhuV`lrnVYNgY1B7f[na+e^W*tda?Ihcd'eZbKJ&LaN)<>`5BI/^q[Xu]Y(kf\[],W
+[C!9GZ*:I8Xf\\)Wi;qpVPU)aU7n9RT:VUDS"#k6R$X,(Q'@JqOcYWbNfB!VMi*@JLkg_>KnP)2
+Jq8H&IsuipI=-D@H3SY>GB\4RFoHIfF)l;@EH#l8rbhaQs(q[M!buF`rb2=Es(;7As().>raPn9
+s'Yh5s'>\2rETA,s'#D)s&f;&rDrqus&Aqqr_ibnqb[8frD*,^qb6cXj@\r6lq$kBoh,0UrCm&^
+rD*>fqG@/gr_iVlrD`brqc<\trE/r"rEB2)qcs)*ra,J/ra>_6r*oY8rabn;s(;7Cqe5tCrbD=G
+rG;IMphp"Jqf(tColB_Hm<%uCo60hMolU.Rr,VLNp2L"LpMftKrc8$[rH/'^s*"Bcs*+Nhrd"Tl
+I/\NpIXh?I'nLshK7nr5L51SAM2I4MN/`jYO-#M'OqNtCQ'IZ%R$a;1S"#q<SXuFFT`1ViU8+KZ
+Unsobrhodp!3,pss/Q.$rN6+&s0)C*s0;U0rNlO2rjDa6s0r$<rOMs>!5&3B!kl=^rkANM_86,f
+!Q2kT`<"!!rl>,^b5TQobg"GYcd:%ddF-LneCE.Lf-]/'g=k<:h;-rFi8ESQioB([jlY^gkNM0p
+lKdd&m-X6/n*fc8nc&+Zo)SF]p&Facp\jmdq>^<fqu-HjrTjH6s,d82~>
+JcC<$JcG!7n,E4_r;?BfrVHNhqtU0brq?6^s7H<^r:9mXrp]mTrpKgRrTsRMs6BUJs60LGroO:D
+jQ-=#!TN);huV`lrnW%YgY1B7f[na+e^W*tda?IhcHa\YbKJ&LaN)<>`5BI/^q[Xu]Y(ke\[],W
+[C!9GZ*:F7Xf\Y(Wi;qpVPU)`U7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieNfB!VMi*@JLkg_>KnP)2
+JqAQ(J:E#rI=-BgH?sj]G^"@TF`m_+s)S0\rc.sW!,qjSs(qaPrG)ILBkdQ[s(D@Dral+?!+Yt:
+!b#JEra5\3s'>V/s',M,rE9/&!*B,"s&K%trDW\ns&&Yir_NJfpJ(HWoh4C=mRd=Ink&LHrCd)_
+q+^i`rD3;er_`YmqG[Amr`/eqr`B&#qcWl$r`f5(ra#M0qd9>1raG\5raYt=qdob=s(D4Brb;@H
+qJ6(HrGD=Ir,;IOluDZ<olKMBiH=d7r,_dVp2TA:qJlLTrcA$[s)e<brHA9eH2`-iHOY@NI=?Zq
+J:N3&K7ei2re;VPLl$tGMi<USNfT6_OcklkPa.N"Q^F/.R[]e:SXl@DT:l1W!MZ@gU^3foVPg>j
+W2ZcqWWK6&XSo:$Y5b^(YlD!.ZMh-0[/[Q4[f<i:\G`u<])TDA]`5YF^AYeO^qmk(_Sa:0rl#8b
+a2c9Bai_cLbKS61c3;P@dF$CkrmVS2f%8O+g"P07gYCW@hV[8LiSsjs$KU=2k3(sll07L!rp0[Q
+mf)\Tn,W"Xo)J:]o_nI_pAamcq#C0hqYL*fr;?N[rdk*1s*t~>
+JcC<$JcG!7n,E4_r;?BfrVHNhqtU0brq?6^s7H<^r:9mXrp]mTrpKgRrTsRMs6BUJs60LGroO:D
+jQ-=#!TN);huV`lrnW%YgY1B7f[na+e^W*tda?IhcHa\YbKJ&LaN)<>`5BI/^q[Xu]Y(ke\[],W
+[C!9GZ*:F7Xf\Y(Wi;qpVPU)`U7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieNfB!VMi*@JLkg_>KnP)2
+JqAQ(J:E#rI=-BgH?sj]G^"@TF`m_+s)S0\rc.sW!,qjSs(qaPrG)ILBkdQ[s(D@Dral+?!+Yt:
+!b#JEra5\3s'>V/s',M,rE9/&!*B,"s&K%trDW\ns&&Yir_NJfpJ(HWoh4C=mRd=Ink&LHrCd)_
+q+^i`rD3;er_`YmqG[Amr`/eqr`B&#qcWl$r`f5(ra#M0qd9>1raG\5raYt=qdob=s(D4Brb;@H
+qJ6(HrGD=Ir,;IOluDZ<olKMBiH=d7r,_dVp2TA:qJlLTrcA$[s)e<brHA9eH2`-iHOY@NI=?Zq
+J:N3&K7ei2re;VPLl$tGMi<USNfT6_OcklkPa.N"Q^F/.R[]e:SXl@DT:l1W!MZ@gU^3foVPg>j
+W2ZcqWWK6&XSo:$Y5b^(YlD!.ZMh-0[/[Q4[f<i:\G`u<])TDA]`5YF^AYeO^qmk(_Sa:0rl#8b
+a2c9Bai_cLbKS61c3;P@dF$CkrmVS2f%8O+g"P07gYCW@hV[8LiSsjs$KU=2k3(sll07L!rp0[Q
+mf)\Tn,W"Xo)J:]o_nI_pAamcq#C0hqYL*fr;?N[rdk*1s*t~>
+JcC<$JcG!7n,E4_r;?BfrVHNhqtU0brq?6^s7H<^r:9mXrp]mTrpKgRrTsRMs6BUJs60LGroO:D
+jQ-=#!TN);huV`lrnW%YgY1B7f[na+e^W*tda?IhcHa\YbKJ&LaN)<>`5BI/^q[Xu]Y(ke\[],W
+[C!9GZ*:F7Xf\Y(Wi;qpVPU)`U7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieNfB!VMi*@JLkg_>KnP)2
+JqAQ(J:E#rI=-BgH?sj]G^"@TF`m_+s)S0\rc.sW!,qjSs(qaPrG)ILBkdQ[s(D@Dral+?!+Yt:
+!b#JEra5\3s'>V/s',M,rE9/&!*B,"s&K%trDW\ns&&Yir_NJfpJ(HWoh4C=mRd=Ink&LHrCd)_
+q+^i`rD3;er_`YmqG[Amr`/eqr`B&#qcWl$r`f5(ra#M0qd9>1raG\5raYt=qdob=s(D4Brb;@H
+qJ6(HrGD=Ir,;IOluDZ<olKMBiH=d7r,_dVp2TA:qJlLTrcA$[s)e<brHA9eH2`-iHOY@NI=?Zq
+J:N3&K7ei2re;VPLl$tGMi<USNfT6_OcklkPa.N"Q^F/.R[]e:SXl@DT:l1W!MZ@gU^3foVPg>j
+W2ZcqWWK6&XSo:$Y5b^(YlD!.ZMh-0[/[Q4[f<i:\G`u<])TDA]`5YF^AYeO^qmk(_Sa:0rl#8b
+a2c9Bai_cLbKS61c3;P@dF$CkrmVS2f%8O+g"P07gYCW@hV[8LiSsjs$KU=2k3(sll07L!rp0[Q
+mf)\Tn,W"Xo)J:]o_nI_pAamcq#C0hqYL*fr;?N[rdk*1s*t~>
+JcC<$JcG!7mf*+^r;?BfrVHNhqY:'as7Z?_rq-6^r:9jWs7#sTs6fpSrTsRMs6BRI!pJh1roX7B
+!9F.>!TN);huV`lrnVMJgY1B7f[na+e^W*tda?IgcHa\YbKJ#KaN)<>`5BI.^q[Xt]Y(ke\[])V
+[C!9GZ*:F7Xf\Y(Wi;qpVPU)aU7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5
+K7\Z)J:E%II0"_Brd"TjGlDmfG'3e+s)S0\rc&!YDf>Vm!c;airbMOKs(VIG!bZ+Wral+?s'u%;
+s'bq8ra5\3!+#P.s'#J,rE9/&s&]/"s&K(ur)<Vnr_`Phr_NJfohG3ToLn==iCWZ6r(Hu^qG$o`
+r_NAer_`YmqG[Amr`/eqr`B)$qH<c#r`f5(ra#M0qd9>1raG\5raYq<r+5k>rb).Brb;@HqJ6%G
+rb_CIr,;CMl#H?9p2fVCkB6B<r,_dVoPs;<q/QCSrcA$[s)e<brHAKkH$O^^H[C/>I0G(LJ:N3&
+rduAIKnb>;Ll$tGMi<USNfT6_OcklkPa.N"Q^F/.R[]e:Sc52gT:hmOU8"EYUnsobrhfgrWN#ls
+!irE(rN-.(YHRo/s0;U0rNlO2rjD^5s0r$<rOMs>s1A9Cs1SHHrkJKK!5\ZOs2+iTrl"oXa8X-a
+ai_cLbKS61c2l8<rm:nte'umtf)F8;f\,!4gYCW@hV[5Ki8N\Uj5f=`k2tjjrojIKli-5OmI'uB
+!q>aMrpg-^o^r+T!quB_r:p<frqcNhrVZQkmf%e;NW4M~>
+JcC<$JcG!7mf*+^r;?BfrVHNhqY:'as7Z?_rq-6^r:9jWs7#sTs6fpSrTsRMs6BRI!pJh1roX7B
+!9F.>!TN);huV`lrnVMJgY1B7f[na+e^W*tda?IgcHa\YbKJ#KaN)<>`5BI.^q[Xt]Y(ke\[])V
+[C!9GZ*:F7Xf\Y(Wi;qpVPU)aU7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5
+K7\Z)J:E%II0"_Brd"TjGlDmfG'3e+s)S0\rc&!YDf>Vm!c;airbMOKs(VIG!bZ+Wral+?s'u%;
+s'bq8ra5\3!+#P.s'#J,rE9/&s&]/"s&K(ur)<Vnr_`Phr_NJfohG3ToLn==iCWZ6r(Hu^qG$o`
+r_NAer_`YmqG[Amr`/eqr`B)$qH<c#r`f5(ra#M0qd9>1raG\5raYq<r+5k>rb).Brb;@HqJ6%G
+rb_CIr,;CMl#H?9p2fVCkB6B<r,_dVoPs;<q/QCSrcA$[s)e<brHAKkH$O^^H[C/>I0G(LJ:N3&
+rduAIKnb>;Ll$tGMi<USNfT6_OcklkPa.N"Q^F/.R[]e:Sc52gT:hmOU8"EYUnsobrhfgrWN#ls
+!irE(rN-.(YHRo/s0;U0rNlO2rjD^5s0r$<rOMs>s1A9Cs1SHHrkJKK!5\ZOs2+iTrl"oXa8X-a
+ai_cLbKS61c2l8<rm:nte'umtf)F8;f\,!4gYCW@hV[5Ki8N\Uj5f=`k2tjjrojIKli-5OmI'uB
+!q>aMrpg-^o^r+T!quB_r:p<frqcNhrVZQkmf%e;NW4M~>
+JcC<$JcG!7mf*+^r;?BfrVHNhqY:'as7Z?_rq-6^r:9jWs7#sTs6fpSrTsRMs6BRI!pJh1roX7B
+!9F.>!TN);huV`lrnVMJgY1B7f[na+e^W*tda?IgcHa\YbKJ#KaN)<>`5BI.^q[Xt]Y(ke\[])V
+[C!9GZ*:F7Xf\Y(Wi;qpVPU)aU7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5
+K7\Z)J:E%II0"_Brd"TjGlDmfG'3e+s)S0\rc&!YDf>Vm!c;airbMOKs(VIG!bZ+Wral+?s'u%;
+s'bq8ra5\3!+#P.s'#J,rE9/&s&]/"s&K(ur)<Vnr_`Phr_NJfohG3ToLn==iCWZ6r(Hu^qG$o`
+r_NAer_`YmqG[Amr`/eqr`B)$qH<c#r`f5(ra#M0qd9>1raG\5raYq<r+5k>rb).Brb;@HqJ6%G
+rb_CIr,;CMl#H?9p2fVCkB6B<r,_dVoPs;<q/QCSrcA$[s)e<brHAKkH$O^^H[C/>I0G(LJ:N3&
+rduAIKnb>;Ll$tGMi<USNfT6_OcklkPa.N"Q^F/.R[]e:Sc52gT:hmOU8"EYUnsobrhfgrWN#ls
+!irE(rN-.(YHRo/s0;U0rNlO2rjD^5s0r$<rOMs>s1A9Cs1SHHrkJKK!5\ZOs2+iTrl"oXa8X-a
+ai_cLbKS61c2l8<rm:nte'umtf)F8;f\,!4gYCW@hV[5Ki8N\Uj5f=`k2tjjrojIKli-5OmI'uB
+!q>aMrpg-^o^r+T!quB_r:p<frqcNhrVZQkmf%e;NW4M~>
+JcC<$JcFs6mf*+^r;?BfrVHNhqY:'arq?9_rq-3]r:9mXrp]mTrpKgRrTsRM!:'OIs6'IGroX7B
+!9F.>#3+V#i8EMLrnVAFgY1B7f[na+e^W*tda?IgcHa\YbK@rJaN)9=`5BI.^q[Us]Y(hd\[])V
+[C!9GZ*:F7Xf\Y(Wi;qpVPU)aU7n9RT:VUDS"#k7R$a5*Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5
+K7\[RJ.R3ZI=6KjH[:!`G^+FVG'8$-F96N(ErL%[E,T[oD?=ZkD#S5MC&huHBEDgYB)ZBAA,p-<
+@KKtG@/aO5?N4=1>lS%.>5h\)=T;J$<rZ2!<;fbp;Z9Pj;#O2f:@q9S9_;!A9'Ak<9)M?\9_hE^
+:Amuc;#X>j;YsDl<;fho<rH,!=Sc2!>5hb&>lJ%-?Me+/@/aU4@fBm:AG]s<B)ZH?B`;`FCAM`F
+D#J5FDYnAJE92*4EqaYAFROABFSg.WEq=;@E;4GPErL.YFT6L`G5c^cGQ<$gH3&A?rd=frJ,XsN
+JV&N,KS>/8LPUeDMMmFPNK0'\OHG]hPE_>tQC!u+R@9V7S=Q7CT:_dMTq\=]U]I<hrhodp!3,st
+!irE(riQ4's0)C*s0;U0rNlO2s0_g6s0r$<r42j=s1A9Cs1SHHrkJKKs2"]O!lMsprl"oXa8X-f
+ai_cLbKS5UcHab_rm;_6e'umte^i@(f\,!4gY:N>h;7&Ii8NYSj5]4^roOUOkiq?slKdg'mHs?@
+mfN"Knc&(\oCV\Sp&Facp\agdq>U6fqu-HjrU0Z9s,?u.~>
+JcC<$JcFs6mf*+^r;?BfrVHNhqY:'arq?9_rq-3]r:9mXrp]mTrpKgRrTsRM!:'OIs6'IGroX7B
+!9F.>#3+V#i8EMLrnVAFgY1B7f[na+e^W*tda?IgcHa\YbK@rJaN)9=`5BI.^q[Us]Y(hd\[])V
+[C!9GZ*:F7Xf\Y(Wi;qpVPU)aU7n9RT:VUDS"#k7R$a5*Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5
+K7\[RJ.R3ZI=6KjH[:!`G^+FVG'8$-F96N(ErL%[E,T[oD?=ZkD#S5MC&huHBEDgYB)ZBAA,p-<
+@KKtG@/aO5?N4=1>lS%.>5h\)=T;J$<rZ2!<;fbp;Z9Pj;#O2f:@q9S9_;!A9'Ak<9)M?\9_hE^
+:Amuc;#X>j;YsDl<;fho<rH,!=Sc2!>5hb&>lJ%-?Me+/@/aU4@fBm:AG]s<B)ZH?B`;`FCAM`F
+D#J5FDYnAJE92*4EqaYAFROABFSg.WEq=;@E;4GPErL.YFT6L`G5c^cGQ<$gH3&A?rd=frJ,XsN
+JV&N,KS>/8LPUeDMMmFPNK0'\OHG]hPE_>tQC!u+R@9V7S=Q7CT:_dMTq\=]U]I<hrhodp!3,st
+!irE(riQ4's0)C*s0;U0rNlO2s0_g6s0r$<r42j=s1A9Cs1SHHrkJKKs2"]O!lMsprl"oXa8X-f
+ai_cLbKS5UcHab_rm;_6e'umte^i@(f\,!4gY:N>h;7&Ii8NYSj5]4^roOUOkiq?slKdg'mHs?@
+mfN"Knc&(\oCV\Sp&Facp\agdq>U6fqu-HjrU0Z9s,?u.~>
+JcC<$JcFs6mf*+^r;?BfrVHNhqY:'arq?9_rq-3]r:9mXrp]mTrpKgRrTsRM!:'OIs6'IGroX7B
+!9F.>#3+V#i8EMLrnVAFgY1B7f[na+e^W*tda?IgcHa\YbK@rJaN)9=`5BI.^q[Us]Y(hd\[])V
+[C!9GZ*:F7Xf\Y(Wi;qpVPU)aU7n9RT:VUDS"#k7R$a5*Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5
+K7\[RJ.R3ZI=6KjH[:!`G^+FVG'8$-F96N(ErL%[E,T[oD?=ZkD#S5MC&huHBEDgYB)ZBAA,p-<
+@KKtG@/aO5?N4=1>lS%.>5h\)=T;J$<rZ2!<;fbp;Z9Pj;#O2f:@q9S9_;!A9'Ak<9)M?\9_hE^
+:Amuc;#X>j;YsDl<;fho<rH,!=Sc2!>5hb&>lJ%-?Me+/@/aU4@fBm:AG]s<B)ZH?B`;`FCAM`F
+D#J5FDYnAJE92*4EqaYAFROABFSg.WEq=;@E;4GPErL.YFT6L`G5c^cGQ<$gH3&A?rd=frJ,XsN
+JV&N,KS>/8LPUeDMMmFPNK0'\OHG]hPE_>tQC!u+R@9V7S=Q7CT:_dMTq\=]U]I<hrhodp!3,st
+!irE(riQ4's0)C*s0;U0rNlO2s0_g6s0r$<r42j=s1A9Cs1SHHrkJKKs2"]O!lMsprl"oXa8X-f
+ai_cLbKS5UcHab_rm;_6e'umte^i@(f\,!4gY:N>h;7&Ii8NYSj5]4^roOUOkiq?slKdg'mHs?@
+mfN"Knc&(\oCV\Sp&Facp\agdq>U6fqu-HjrU0Z9s,?u.~>
+JcC<$JcFp5n,E4_r;??erVHNhqY:'arq?6^s7H<^r:9jWs7#sTs6fpSrTsRMs6BUJs60LGroO7C
+jSn0Dio/kSi8<Djh.PNtg=k64f@SU(eC;sqdEp4bcHXSVb/q`G`l5p8_SX.)^V7Co]=PP`\$i`Q
+Za6sBYck43XfJJ%WMcYkV50o]TqS-OSt;IAS!ob4R$X,(P`q8nOcYWbNfB!VMi*@JLkg_>KnTGX
+"bM;UJ:E%II0"_Brd"TjGlDmgG'.s,F9-H'rc.sW!,qjSs)%dPrbDRMBkdQ[s(;=DrFH%@@q5LI
+s'Yn8rEfV4?![D6!aAi3rE9/&s&]/"s&K(ur)<Vnr_`MgrD3>dnkJdNoh4L@mn*%Ar(Hu^q+^i`
+rD38dr_`YmqG[Amr`/eqrE&u#qH<c#r`f5(rE]D/qd9>1raG\5raYq<r+5k>rb)+Arb;@HqeQ.H
+rGD:HqJZ+Ij)Od5piF`&qfDXTno=ABp2U(PrcA$[s)n?brceBe!."Qis*G3&I=6QnIt3'#JqJ]/
+L&QfVLPUeDMN!LRNfT6_OcklkPa.N"Q^F/.R[]e:SXuFFTV/!PU8+N[V5:'gVZE`qri6"!!3H1%
+s/uC*rilF-s0DU0s0Vg6r3lX7s1&$<s186BrOi0Ds1\HH!l2Xgrke]Q!6"lUs2G&Zrl>Ymb0%oN
+bfn>WcHjh`dF$CkrmVV3f%8O+f\,!4gYCW@hVR/Ji8N\pit1;5k2tjjkiq?slg*p(mI'EAmfDqJ
+rpp*\s7H<`s7ZKerV6Bfs8)ThrVZTln,@n<MuS;~>
+JcC<$JcFp5n,E4_r;??erVHNhqY:'arq?6^s7H<^r:9jWs7#sTs6fpSrTsRMs6BUJs60LGroO7C
+jSn0Dio/kSi8<Djh.PNtg=k64f@SU(eC;sqdEp4bcHXSVb/q`G`l5p8_SX.)^V7Co]=PP`\$i`Q
+Za6sBYck43XfJJ%WMcYkV50o]TqS-OSt;IAS!ob4R$X,(P`q8nOcYWbNfB!VMi*@JLkg_>KnTGX
+"bM;UJ:E%II0"_Brd"TjGlDmgG'.s,F9-H'rc.sW!,qjSs)%dPrbDRMBkdQ[s(;=DrFH%@@q5LI
+s'Yn8rEfV4?![D6!aAi3rE9/&s&]/"s&K(ur)<Vnr_`MgrD3>dnkJdNoh4L@mn*%Ar(Hu^q+^i`
+rD38dr_`YmqG[Amr`/eqrE&u#qH<c#r`f5(rE]D/qd9>1raG\5raYq<r+5k>rb)+Arb;@HqeQ.H
+rGD:HqJZ+Ij)Od5piF`&qfDXTno=ABp2U(PrcA$[s)n?brceBe!."Qis*G3&I=6QnIt3'#JqJ]/
+L&QfVLPUeDMN!LRNfT6_OcklkPa.N"Q^F/.R[]e:SXuFFTV/!PU8+N[V5:'gVZE`qri6"!!3H1%
+s/uC*rilF-s0DU0s0Vg6r3lX7s1&$<s186BrOi0Ds1\HH!l2Xgrke]Q!6"lUs2G&Zrl>Ymb0%oN
+bfn>WcHjh`dF$CkrmVV3f%8O+f\,!4gYCW@hVR/Ji8N\pit1;5k2tjjkiq?slg*p(mI'EAmfDqJ
+rpp*\s7H<`s7ZKerV6Bfs8)ThrVZTln,@n<MuS;~>
+JcC<$JcFp5n,E4_r;??erVHNhqY:'arq?6^s7H<^r:9jWs7#sTs6fpSrTsRMs6BUJs60LGroO7C
+jSn0Dio/kSi8<Djh.PNtg=k64f@SU(eC;sqdEp4bcHXSVb/q`G`l5p8_SX.)^V7Co]=PP`\$i`Q
+Za6sBYck43XfJJ%WMcYkV50o]TqS-OSt;IAS!ob4R$X,(P`q8nOcYWbNfB!VMi*@JLkg_>KnTGX
+"bM;UJ:E%II0"_Brd"TjGlDmgG'.s,F9-H'rc.sW!,qjSs)%dPrbDRMBkdQ[s(;=DrFH%@@q5LI
+s'Yn8rEfV4?![D6!aAi3rE9/&s&]/"s&K(ur)<Vnr_`MgrD3>dnkJdNoh4L@mn*%Ar(Hu^q+^i`
+rD38dr_`YmqG[Amr`/eqrE&u#qH<c#r`f5(rE]D/qd9>1raG\5raYq<r+5k>rb)+Arb;@HqeQ.H
+rGD:HqJZ+Ij)Od5piF`&qfDXTno=ABp2U(PrcA$[s)n?brceBe!."Qis*G3&I=6QnIt3'#JqJ]/
+L&QfVLPUeDMN!LRNfT6_OcklkPa.N"Q^F/.R[]e:SXuFFTV/!PU8+N[V5:'gVZE`qri6"!!3H1%
+s/uC*rilF-s0DU0s0Vg6r3lX7s1&$<s186BrOi0Ds1\HH!l2Xgrke]Q!6"lUs2G&Zrl>Ymb0%oN
+bfn>WcHjh`dF$CkrmVV3f%8O+f\,!4gYCW@hVR/Ji8N\pit1;5k2tjjkiq?slg*p(mI'EAmfDqJ
+rpp*\s7H<`s7ZKerV6Bfs8)ThrVZTln,@n<MuS;~>
+JcC<$JcFp5mf*+^r;??erVHNhqY:'arq?6^rq-3]r:9mXrp]mTrpKgRrTjUOlK\?4!pJh1roOUM
+jQ,@]io8qTi8<Djh-\slg=k64f@SU(eC;spdEp4bcHXPUb/q`F`l5p7_SX.(^V7Co]=PP_\$i`P
+Za6sBYck43XK/A$WMcYkV50o]TqS-OSt;LBS!ob4R$X,(Q'@JqP*(fdNfB!VMi.Lj$&F@kL4t;5
+K7\[RJ.$jUI=6KjH[:!`H$K=4!HrVbFT6C^ErL(YDuahUDZ=PRD#S5MCB&#IBEDgYB)ZBAA,p-<
+@KKtG@/aO5?N4=1>lS%.>5h\)=T;J$<rZ2!<;]\o;Z9Pi;#F,e:@:jL9_M-)9)M?[9_qK^:Amuc
+;#O8j;YsDk<;ono<rH,!=Sc2!>5hb&>l@t-?Me+.@/aU4@fBm:AG]s<B)ZH?B`;`FCAM`ED#J5E
+DY\5DE8ts4Eqj_)FS^(UEnta7ErL.YFT6L`G5ZUdG^4T6H3&A?rd?nXIt3'#JqAW-KS>/8LPUeD
+MMmFPNK0'\OHG]iPa.N"Q^F/.R[]e:SXuFFTV/!PU8+N[V5C,fVl6Sori-""XT#@%Y5b^)YlD!.
+ZMh-0[/[Q4[f<i:\GWo;])TD@]`5\F^AYhH^];4L_?.Wn`;[aU`W4'Ya<SgLb0.uPbg"GYcd0tc
+dF-IleC<%"f%8O+g"P07gYCW@hV\=j$K:")j5f=`k2tjjrojIKli-5UmI'E2n*oi:rpp*\!;-6_
+s7ZKerV6Bfs8)WirVZTln,@n<MZ82~>
+JcC<$JcFp5mf*+^r;??erVHNhqY:'arq?6^rq-3]r:9mXrp]mTrpKgRrTjUOlK\?4!pJh1roOUM
+jQ,@]io8qTi8<Djh-\slg=k64f@SU(eC;spdEp4bcHXPUb/q`F`l5p7_SX.(^V7Co]=PP_\$i`P
+Za6sBYck43XK/A$WMcYkV50o]TqS-OSt;LBS!ob4R$X,(Q'@JqP*(fdNfB!VMi.Lj$&F@kL4t;5
+K7\[RJ.$jUI=6KjH[:!`H$K=4!HrVbFT6C^ErL(YDuahUDZ=PRD#S5MCB&#IBEDgYB)ZBAA,p-<
+@KKtG@/aO5?N4=1>lS%.>5h\)=T;J$<rZ2!<;]\o;Z9Pi;#F,e:@:jL9_M-)9)M?[9_qK^:Amuc
+;#O8j;YsDk<;ono<rH,!=Sc2!>5hb&>l@t-?Me+.@/aU4@fBm:AG]s<B)ZH?B`;`FCAM`ED#J5E
+DY\5DE8ts4Eqj_)FS^(UEnta7ErL.YFT6L`G5ZUdG^4T6H3&A?rd?nXIt3'#JqAW-KS>/8LPUeD
+MMmFPNK0'\OHG]iPa.N"Q^F/.R[]e:SXuFFTV/!PU8+N[V5C,fVl6Sori-""XT#@%Y5b^)YlD!.
+ZMh-0[/[Q4[f<i:\GWo;])TD@]`5\F^AYhH^];4L_?.Wn`;[aU`W4'Ya<SgLb0.uPbg"GYcd0tc
+dF-IleC<%"f%8O+g"P07gYCW@hV\=j$K:")j5f=`k2tjjrojIKli-5UmI'E2n*oi:rpp*\!;-6_
+s7ZKerV6Bfs8)WirVZTln,@n<MZ82~>
+JcC<$JcFp5mf*+^r;??erVHNhqY:'arq?6^rq-3]r:9mXrp]mTrpKgRrTjUOlK\?4!pJh1roOUM
+jQ,@]io8qTi8<Djh-\slg=k64f@SU(eC;spdEp4bcHXPUb/q`F`l5p7_SX.(^V7Co]=PP_\$i`P
+Za6sBYck43XK/A$WMcYkV50o]TqS-OSt;LBS!ob4R$X,(Q'@JqP*(fdNfB!VMi.Lj$&F@kL4t;5
+K7\[RJ.$jUI=6KjH[:!`H$K=4!HrVbFT6C^ErL(YDuahUDZ=PRD#S5MCB&#IBEDgYB)ZBAA,p-<
+@KKtG@/aO5?N4=1>lS%.>5h\)=T;J$<rZ2!<;]\o;Z9Pi;#F,e:@:jL9_M-)9)M?[9_qK^:Amuc
+;#O8j;YsDk<;ono<rH,!=Sc2!>5hb&>l@t-?Me+.@/aU4@fBm:AG]s<B)ZH?B`;`FCAM`ED#J5E
+DY\5DE8ts4Eqj_)FS^(UEnta7ErL.YFT6L`G5ZUdG^4T6H3&A?rd?nXIt3'#JqAW-KS>/8LPUeD
+MMmFPNK0'\OHG]iPa.N"Q^F/.R[]e:SXuFFTV/!PU8+N[V5C,fVl6Sori-""XT#@%Y5b^)YlD!.
+ZMh-0[/[Q4[f<i:\GWo;])TD@]`5\F^AYhH^];4L_?.Wn`;[aU`W4'Ya<SgLb0.uPbg"GYcd0tc
+dF-IleC<%"f%8O+g"P07gYCW@hV\=j$K:")j5f=`k2tjjrojIKli-5UmI'E2n*oi:rpp*\!;-6_
+s7ZKerV6Bfs8)WirVZTln,@n<MZ82~>
+JcC<$JcFm4mf*+^r;??erVHNhqY:'arq?6^rq-3]r:9jWs7#sTs6fpSrTsRMs6BUJs6'IGroOUM
+jQ,@]io8qTi8<Djh.YTug=k64f@SU(eC2jndEp4bcHOJTb/q`F`l5p7_SX.(^V7Co]=PP_\$i`P
+Za6sAYck43XK/A$WMcYkV50o^TqS-OSt;LCS!ob4R$X,(Q'@JqP*(ieO,f3YN/NRMM26qAL4t<[
+K,&uhJ:N,uIXQWlH[C'bH$FRXGBS.PrcA3_EcV/!!cW'rrb_dSCi')ds(VOJrb2=E!+u1@!b>eN
+raPn9!+>b4!a]/<r`oJ-s'#A(s&f;&rDrqus&Anpr_i_mq,$ubqG-EPp.Y3RdRsC0rCm#]rD*>f
+qG@/grDNMkrD`brqH!SsrE/o!rEB/(qHX#*rEfA.ra>_6qdTP7rabq<rau.Bqe5tCrbD:FrG;FL
+oksPCnSmT0pi?1OeTCY/qf:V7rGqmYrH/$]!-\<b!dK!9rd"cqI!g?jIXh?I."Qu&K7nr5L51SA
+M2I4MN/`jYO-#KeP*;,qQ'Rf)R@9V7S=Q7CT:l1W"eqcfUnssfVZE`qri-%#XK;E'!j8`1rilF-
+s0DX1s0Vg6rO2^7s1&$<s183ArOi0Ds1\HHs1nZNrke]Q!6"iT!li:$rl>>db0%oNbfn?2c2l8<
+rm:bpe,Ii(e^i@(f\+s3g=tE^h$W#ri8ESRioB([jo4BHkNM0plK[^7liHMArpKpXnaZVL!qZ'V
+rUg6cp\4U\s7uZjqtp?irVc9cJcCN*J,~>
+JcC<$JcFm4mf*+^r;??erVHNhqY:'arq?6^rq-3]r:9jWs7#sTs6fpSrTsRMs6BUJs6'IGroOUM
+jQ,@]io8qTi8<Djh.YTug=k64f@SU(eC2jndEp4bcHOJTb/q`F`l5p7_SX.(^V7Co]=PP_\$i`P
+Za6sAYck43XK/A$WMcYkV50o^TqS-OSt;LCS!ob4R$X,(Q'@JqP*(ieO,f3YN/NRMM26qAL4t<[
+K,&uhJ:N,uIXQWlH[C'bH$FRXGBS.PrcA3_EcV/!!cW'rrb_dSCi')ds(VOJrb2=E!+u1@!b>eN
+raPn9!+>b4!a]/<r`oJ-s'#A(s&f;&rDrqus&Anpr_i_mq,$ubqG-EPp.Y3RdRsC0rCm#]rD*>f
+qG@/grDNMkrD`brqH!SsrE/o!rEB/(qHX#*rEfA.ra>_6qdTP7rabq<rau.Bqe5tCrbD:FrG;FL
+oksPCnSmT0pi?1OeTCY/qf:V7rGqmYrH/$]!-\<b!dK!9rd"cqI!g?jIXh?I."Qu&K7nr5L51SA
+M2I4MN/`jYO-#KeP*;,qQ'Rf)R@9V7S=Q7CT:l1W"eqcfUnssfVZE`qri-%#XK;E'!j8`1rilF-
+s0DX1s0Vg6rO2^7s1&$<s183ArOi0Ds1\HHs1nZNrke]Q!6"iT!li:$rl>>db0%oNbfn?2c2l8<
+rm:bpe,Ii(e^i@(f\+s3g=tE^h$W#ri8ESRioB([jo4BHkNM0plK[^7liHMArpKpXnaZVL!qZ'V
+rUg6cp\4U\s7uZjqtp?irVc9cJcCN*J,~>
+JcC<$JcFm4mf*+^r;??erVHNhqY:'arq?6^rq-3]r:9jWs7#sTs6fpSrTsRMs6BUJs6'IGroOUM
+jQ,@]io8qTi8<Djh.YTug=k64f@SU(eC2jndEp4bcHOJTb/q`F`l5p7_SX.(^V7Co]=PP_\$i`P
+Za6sAYck43XK/A$WMcYkV50o^TqS-OSt;LCS!ob4R$X,(Q'@JqP*(ieO,f3YN/NRMM26qAL4t<[
+K,&uhJ:N,uIXQWlH[C'bH$FRXGBS.PrcA3_EcV/!!cW'rrb_dSCi')ds(VOJrb2=E!+u1@!b>eN
+raPn9!+>b4!a]/<r`oJ-s'#A(s&f;&rDrqus&Anpr_i_mq,$ubqG-EPp.Y3RdRsC0rCm#]rD*>f
+qG@/grDNMkrD`brqH!SsrE/o!rEB/(qHX#*rEfA.ra>_6qdTP7rabq<rau.Bqe5tCrbD:FrG;FL
+oksPCnSmT0pi?1OeTCY/qf:V7rGqmYrH/$]!-\<b!dK!9rd"cqI!g?jIXh?I."Qu&K7nr5L51SA
+M2I4MN/`jYO-#KeP*;,qQ'Rf)R@9V7S=Q7CT:l1W"eqcfUnssfVZE`qri-%#XK;E'!j8`1rilF-
+s0DX1s0Vg6rO2^7s1&$<s183ArOi0Ds1\HHs1nZNrke]Q!6"iT!li:$rl>>db0%oNbfn?2c2l8<
+rm:bpe,Ii(e^i@(f\+s3g=tE^h$W#ri8ESRioB([jo4BHkNM0plK[^7liHMArpKpXnaZVL!qZ'V
+rUg6cp\4U\s7uZjqtp?irVc9cJcCN*J,~>
+JcC<$JcFj3mf*+^r;??erVHKgqY:'arq?6^rq-3]r:9mXrp]mTs6fmRrp9[Ns6BUJs6'IGroX7B
+$0:.,io8qTi8<Djh.5<qg=k64f@SU(eC2jndEp4bc-4ASb/hZE`l5m6_SX+'^V7@n]=PP_\$i]O
+Za6sAYck43XK/A$WMcYkV50o^U7n6PSt;LCS"#k6R$X,(Q'@JqP*(ieO,f3YN/NRMM26rdL'<9a
+K7ec,rdY$!If=`rI!bj=!I8qhG62r1FoHIaF)l=#E<:)tDuOVUD/=%fCBA6bC&VfGB)lQCAcH9@
+A,Tj<@:3LB?iOF4?2\%.>6%k*=oVV(=8c2!<W?%r;uKVn;><uc:\dcP:%q?V9@lf69DhKZ:&Rid
+:\mod;>sJi;uTbq<Vfbp=8c7t=oDP&>P_V(?2\+,?iFI4@JaO5A,^$9AcHBABDZBAC&MfCC]/)J
+D=h`>Ds_N.EVXYMF4k[3F89k;EW'qWF8U.ZFT?U`GQ2mfH2`+FH[L3hI=?WpJ:N3&K7ei1Knb>;
+Ll$tGMi<XUO,oBbP*2#nQ'IZ%R$a;1S"-%@StD\TT`q0cUnjiarhft!WN)u!X/u<&!j8`1rilF-
+!4)R0s0Vg6rO2a8s1&!;s186BrOi-Cs1\HHs1nZNrke]Qs2=oUs2G&ZrlG,]!6Y;as3(JfrltPj
+d/MDndaS3F!S,d#f*^0`g=k<9gtgfChu;OKiSrnXjQ,Fbk3(sll07L!lg4!*mI'uB!q>aMrpg-^
+o^r.Us7ZKerV6Bfs8)WirVZWmo)=4?L&ZZ~>
+JcC<$JcFj3mf*+^r;??erVHKgqY:'arq?6^rq-3]r:9mXrp]mTs6fmRrp9[Ns6BUJs6'IGroX7B
+$0:.,io8qTi8<Djh.5<qg=k64f@SU(eC2jndEp4bc-4ASb/hZE`l5m6_SX+'^V7@n]=PP_\$i]O
+Za6sAYck43XK/A$WMcYkV50o^U7n6PSt;LCS"#k6R$X,(Q'@JqP*(ieO,f3YN/NRMM26rdL'<9a
+K7ec,rdY$!If=`rI!bj=!I8qhG62r1FoHIaF)l=#E<:)tDuOVUD/=%fCBA6bC&VfGB)lQCAcH9@
+A,Tj<@:3LB?iOF4?2\%.>6%k*=oVV(=8c2!<W?%r;uKVn;><uc:\dcP:%q?V9@lf69DhKZ:&Rid
+:\mod;>sJi;uTbq<Vfbp=8c7t=oDP&>P_V(?2\+,?iFI4@JaO5A,^$9AcHBABDZBAC&MfCC]/)J
+D=h`>Ds_N.EVXYMF4k[3F89k;EW'qWF8U.ZFT?U`GQ2mfH2`+FH[L3hI=?WpJ:N3&K7ei1Knb>;
+Ll$tGMi<XUO,oBbP*2#nQ'IZ%R$a;1S"-%@StD\TT`q0cUnjiarhft!WN)u!X/u<&!j8`1rilF-
+!4)R0s0Vg6rO2a8s1&!;s186BrOi-Cs1\HHs1nZNrke]Qs2=oUs2G&ZrlG,]!6Y;as3(JfrltPj
+d/MDndaS3F!S,d#f*^0`g=k<9gtgfChu;OKiSrnXjQ,Fbk3(sll07L!lg4!*mI'uB!q>aMrpg-^
+o^r.Us7ZKerV6Bfs8)WirVZWmo)=4?L&ZZ~>
+JcC<$JcFj3mf*+^r;??erVHKgqY:'arq?6^rq-3]r:9mXrp]mTs6fmRrp9[Ns6BUJs6'IGroX7B
+$0:.,io8qTi8<Djh.5<qg=k64f@SU(eC2jndEp4bc-4ASb/hZE`l5m6_SX+'^V7@n]=PP_\$i]O
+Za6sAYck43XK/A$WMcYkV50o^U7n6PSt;LCS"#k6R$X,(Q'@JqP*(ieO,f3YN/NRMM26rdL'<9a
+K7ec,rdY$!If=`rI!bj=!I8qhG62r1FoHIaF)l=#E<:)tDuOVUD/=%fCBA6bC&VfGB)lQCAcH9@
+A,Tj<@:3LB?iOF4?2\%.>6%k*=oVV(=8c2!<W?%r;uKVn;><uc:\dcP:%q?V9@lf69DhKZ:&Rid
+:\mod;>sJi;uTbq<Vfbp=8c7t=oDP&>P_V(?2\+,?iFI4@JaO5A,^$9AcHBABDZBAC&MfCC]/)J
+D=h`>Ds_N.EVXYMF4k[3F89k;EW'qWF8U.ZFT?U`GQ2mfH2`+FH[L3hI=?WpJ:N3&K7ei1Knb>;
+Ll$tGMi<XUO,oBbP*2#nQ'IZ%R$a;1S"-%@StD\TT`q0cUnjiarhft!WN)u!X/u<&!j8`1rilF-
+!4)R0s0Vg6rO2a8s1&!;s186BrOi-Cs1\HHs1nZNrke]Qs2=oUs2G&ZrlG,]!6Y;as3(JfrltPj
+d/MDndaS3F!S,d#f*^0`g=k<9gtgfChu;OKiSrnXjQ,Fbk3(sll07L!lg4!*mI'uB!q>aMrpg-^
+o^r.Us7ZKerV6Bfs8)WirVZWmo)=4?L&ZZ~>
+JcC<$JcFj3mJd"]r;??erVHKgqY:'arq?6^rq-3]r:9jWs7#sTs6fpSrTjUOlK\B5s6'IGroX7B
+$0:.,io8qTi8<Djh.b[!g=k64f@JL%eC2jndEp1ac-4ASaiMQD`l5m6_SO%&^V.:m]=GJ^\$i]O
+Za6p@Yck43XK/A$WMl_lV50o^U7n6PSt;LCS"#k7R$a5+Q'IPrP*(ieO,f3ZN/W[PM2@%DL5(D8
+rdtc6JUi9#IsufoI!^3dH?jd\rc\TjF`heJF)uC$EW9tXDuOYSD#eDOC]A,LC&VfGBE)TCAHHCP
+A,]s;@/s^7?iOI4?2e+/>Q7n*=oVV(=8c2"<W5tp;uT\n;><ua:\[]P:&%EV9AW;<9DhKZ:&Ric
+:\moe;>sJi;uTbp<Vfbp=8l=t=oDP&>P_V'?2e1,?iFI4@JaO5A,g*:Ac?<@BDZBAC&VlCC]/)I
+D=_Z9DsVH1EVXYMF5:s6F89k>EVskVF8U.ZFoQXaGQ2mfH2`-iHN8HmI7/O6J:N3%JqJ]/Knb>;
+Ll$tGMi<USNfT6`P*2#nQ'IZ%R$a;1S"#q>StD[LTq\9VUnjiaVl-JmWN)u!XK8P+Y-+u-YlCs.
+ZMh-0ZiIN4[f<i:\GWo;])TD?]`5\F^AYhH_#M7L_Z.OR`;RXV`lH.!aT'?^b5TQcbg"E3c2l8<
+rm;,%e'lgre^i='f@\dUg&]s`rnS+Ahr*GOiSrnXjQ5Lck3(t-klL)8rp0^RmdC)C!V#XYo)J=]
+o`"O`pAamcq#C0hqYU0gr;HTbrdk*'s*t~>
+JcC<$JcFj3mJd"]r;??erVHKgqY:'arq?6^rq-3]r:9jWs7#sTs6fpSrTjUOlK\B5s6'IGroX7B
+$0:.,io8qTi8<Djh.b[!g=k64f@JL%eC2jndEp1ac-4ASaiMQD`l5m6_SO%&^V.:m]=GJ^\$i]O
+Za6p@Yck43XK/A$WMl_lV50o^U7n6PSt;LCS"#k7R$a5+Q'IPrP*(ieO,f3ZN/W[PM2@%DL5(D8
+rdtc6JUi9#IsufoI!^3dH?jd\rc\TjF`heJF)uC$EW9tXDuOYSD#eDOC]A,LC&VfGBE)TCAHHCP
+A,]s;@/s^7?iOI4?2e+/>Q7n*=oVV(=8c2"<W5tp;uT\n;><ua:\[]P:&%EV9AW;<9DhKZ:&Ric
+:\moe;>sJi;uTbp<Vfbp=8l=t=oDP&>P_V'?2e1,?iFI4@JaO5A,g*:Ac?<@BDZBAC&VlCC]/)I
+D=_Z9DsVH1EVXYMF5:s6F89k>EVskVF8U.ZFoQXaGQ2mfH2`-iHN8HmI7/O6J:N3%JqJ]/Knb>;
+Ll$tGMi<USNfT6`P*2#nQ'IZ%R$a;1S"#q>StD[LTq\9VUnjiaVl-JmWN)u!XK8P+Y-+u-YlCs.
+ZMh-0ZiIN4[f<i:\GWo;])TD?]`5\F^AYhH_#M7L_Z.OR`;RXV`lH.!aT'?^b5TQcbg"E3c2l8<
+rm;,%e'lgre^i='f@\dUg&]s`rnS+Ahr*GOiSrnXjQ5Lck3(t-klL)8rp0^RmdC)C!V#XYo)J=]
+o`"O`pAamcq#C0hqYU0gr;HTbrdk*'s*t~>
+JcC<$JcFj3mJd"]r;??erVHKgqY:'arq?6^rq-3]r:9jWs7#sTs6fpSrTjUOlK\B5s6'IGroX7B
+$0:.,io8qTi8<Djh.b[!g=k64f@JL%eC2jndEp1ac-4ASaiMQD`l5m6_SO%&^V.:m]=GJ^\$i]O
+Za6p@Yck43XK/A$WMl_lV50o^U7n6PSt;LCS"#k7R$a5+Q'IPrP*(ieO,f3ZN/W[PM2@%DL5(D8
+rdtc6JUi9#IsufoI!^3dH?jd\rc\TjF`heJF)uC$EW9tXDuOYSD#eDOC]A,LC&VfGBE)TCAHHCP
+A,]s;@/s^7?iOI4?2e+/>Q7n*=oVV(=8c2"<W5tp;uT\n;><ua:\[]P:&%EV9AW;<9DhKZ:&Ric
+:\moe;>sJi;uTbp<Vfbp=8l=t=oDP&>P_V'?2e1,?iFI4@JaO5A,g*:Ac?<@BDZBAC&VlCC]/)I
+D=_Z9DsVH1EVXYMF5:s6F89k>EVskVF8U.ZFoQXaGQ2mfH2`-iHN8HmI7/O6J:N3%JqJ]/Knb>;
+Ll$tGMi<USNfT6`P*2#nQ'IZ%R$a;1S"#q>StD[LTq\9VUnjiaVl-JmWN)u!XK8P+Y-+u-YlCs.
+ZMh-0ZiIN4[f<i:\GWo;])TD?]`5\F^AYhH_#M7L_Z.OR`;RXV`lH.!aT'?^b5TQcbg"E3c2l8<
+rm;,%e'lgre^i='f@\dUg&]s`rnS+Ahr*GOiSrnXjQ5Lck3(t-klL)8rp0^RmdC)C!V#XYo)J=]
+o`"O`pAamcq#C0hqYU0gr;HTbrdk*'s*t~>
+JcC<$JcFg2mf*(]r;??erVHKgqY:'arV$-]rq-6^qssdWrp]mTs6fpSrTsRM!:'OIH0FGSk2tde
+jQ#:[io/hRhqm2FgtUT;g=Y$/f%&:"e'cXkcd'h\bfe/NaN2E@`Pf[2_8*h"]tD"i\[f5Z[^EKK
+Za$a=YHG"/X/`2!W2HMhUnjc[TqS*MSt2C@S!ob4R$X,(Q'@JqP*(ieO,f3YN/NRMM26rdL'iWf
+K7ec,JUi9#If=`rI!bj=#C1Q=GB\4RFoHL_Er^7[E<:)tDuOVUD/=%fCBA6bC&VcIB4bcTAcH9@
+A,]s;@K0a7?NOP>?2\"0>?Y5/=oVV(=8Z,!<W5tp;uT\n;>*i^:\RWP:&.KW9B8_A9DhKY:&[od
+:\moe;>jDh;uTbp<Vfbq=8c7s=oDP&>P_V'?2e1,?iFI4@JaO5A,^$:Ac?<@BDZB@C&VlDC]&#H
+D=DH/Dt.f8EVa_NF5V08F89kAEVskUF8U.[FoHR`GQ2pfH2`*jH[Pg@!IfOtJ2Dh/K7ei2L5(J>
+M2@+JN/WaVO,oBbP*2&pQ'Rc(R$jD4S"-%@StD[LTq\<XUnsrdVl6ToWWB0%riH4(YPtd+YlM*.
+ZN@MA[JdQ6\,Wu:\c98@]DT>A^&GbE^]2+L_>V7N_uI[R`W*pXa8O'\ai_d*b6#o4c2Puhcd;[=
+("1R[eC<%!f%8O+f\,!4gYCT?h;7&ghuVfrro4%?jo4BCkNMp0!UB"MliHMArpTmV!:g'Zs766_
+rUp3as7cKes7uZjqtpBjr;H6dJcCE'J,~>
+JcC<$JcFg2mf*(]r;??erVHKgqY:'arV$-]rq-6^qssdWrp]mTs6fpSrTsRM!:'OIH0FGSk2tde
+jQ#:[io/hRhqm2FgtUT;g=Y$/f%&:"e'cXkcd'h\bfe/NaN2E@`Pf[2_8*h"]tD"i\[f5Z[^EKK
+Za$a=YHG"/X/`2!W2HMhUnjc[TqS*MSt2C@S!ob4R$X,(Q'@JqP*(ieO,f3YN/NRMM26rdL'iWf
+K7ec,JUi9#If=`rI!bj=#C1Q=GB\4RFoHL_Er^7[E<:)tDuOVUD/=%fCBA6bC&VcIB4bcTAcH9@
+A,]s;@K0a7?NOP>?2\"0>?Y5/=oVV(=8Z,!<W5tp;uT\n;>*i^:\RWP:&.KW9B8_A9DhKY:&[od
+:\moe;>jDh;uTbp<Vfbq=8c7s=oDP&>P_V'?2e1,?iFI4@JaO5A,^$:Ac?<@BDZB@C&VlDC]&#H
+D=DH/Dt.f8EVa_NF5V08F89kAEVskUF8U.[FoHR`GQ2pfH2`*jH[Pg@!IfOtJ2Dh/K7ei2L5(J>
+M2@+JN/WaVO,oBbP*2&pQ'Rc(R$jD4S"-%@StD[LTq\<XUnsrdVl6ToWWB0%riH4(YPtd+YlM*.
+ZN@MA[JdQ6\,Wu:\c98@]DT>A^&GbE^]2+L_>V7N_uI[R`W*pXa8O'\ai_d*b6#o4c2Puhcd;[=
+("1R[eC<%!f%8O+f\,!4gYCT?h;7&ghuVfrro4%?jo4BCkNMp0!UB"MliHMArpTmV!:g'Zs766_
+rUp3as7cKes7uZjqtpBjr;H6dJcCE'J,~>
+JcC<$JcFg2mf*(]r;??erVHKgqY:'arV$-]rq-6^qssdWrp]mTs6fpSrTsRM!:'OIH0FGSk2tde
+jQ#:[io/hRhqm2FgtUT;g=Y$/f%&:"e'cXkcd'h\bfe/NaN2E@`Pf[2_8*h"]tD"i\[f5Z[^EKK
+Za$a=YHG"/X/`2!W2HMhUnjc[TqS*MSt2C@S!ob4R$X,(Q'@JqP*(ieO,f3YN/NRMM26rdL'iWf
+K7ec,JUi9#If=`rI!bj=#C1Q=GB\4RFoHL_Er^7[E<:)tDuOVUD/=%fCBA6bC&VcIB4bcTAcH9@
+A,]s;@K0a7?NOP>?2\"0>?Y5/=oVV(=8Z,!<W5tp;uT\n;>*i^:\RWP:&.KW9B8_A9DhKY:&[od
+:\moe;>jDh;uTbp<Vfbq=8c7s=oDP&>P_V'?2e1,?iFI4@JaO5A,^$:Ac?<@BDZB@C&VlDC]&#H
+D=DH/Dt.f8EVa_NF5V08F89kAEVskUF8U.[FoHR`GQ2pfH2`*jH[Pg@!IfOtJ2Dh/K7ei2L5(J>
+M2@+JN/WaVO,oBbP*2&pQ'Rc(R$jD4S"-%@StD[LTq\<XUnsrdVl6ToWWB0%riH4(YPtd+YlM*.
+ZN@MA[JdQ6\,Wu:\c98@]DT>A^&GbE^]2+L_>V7N_uI[R`W*pXa8O'\ai_d*b6#o4c2Puhcd;[=
+("1R[eC<%!f%8O+f\,!4gYCT?h;7&ghuVfrro4%?jo4BCkNMp0!UB"MliHMArpTmV!:g'Zs766_
+rUp3as7cKes7uZjqtpBjr;H6dJcCE'J,~>
+JcC<$JcFd1mJd"]r;??erVHKgqY:$`rq?6^rq-3]r:9jWs7#sTs6fpSrp9[Ns6BUJId#tXk2tde
+jQ#:[io/hRhqm2FgtUQ:g"=p.f%&:"e'cXjcd'h\bfe/NaN2B?`PfX1_8*h"]tD"h\[f5Z[^EKK
+Za$a=YHG"/X/`2!W2HMhUnjc[TqS-OSt2C@S!ob4R$X,(Q'@JqP*(ieO,f3YN/NRNM2@%DL5(D8
+rdt6'Jc:0#It%BF!IT7nH3&;9rceBc!-S9_!crC&rc&!YDf>Vm!GuZPC]A,LC&M]HB4bcTAHHCP
+A,]p=@:3LB?iOI4?2e+/>Q7n*=oVV(=8Z,!<W5tp;uKVl;>!c\:\[]R:&.KW9Bo.F9DhKY:&Rid
+:\did;>sJi;uK\p<V]\p=8c7s=oDP&>PVP'?2\++?iFI4@JaO5A,g*:Ac?<@BDZBAC&MfCC]&#H
+D=)6(DtJ#=EVa_NF5qB:F8'_FEVa_SF8L(ZFoQX`GQ2pfH2`*jH[Pg@6[jN7J:N3&K7ei2Knb>;
+Ll$tGN/WaVO,oBbP*2#nQ'Rc(R$jD4S"-%@StD[LTq\<XUnsrdVl6SpWiN2%Xf\b/YPta-Z*L\7
+ZN@MA[JmW7\,Wu:\c02?]D]DB^&GbE^])%K_>V7N_uI[R`W*sXa8X0[aT0K^b6Q89c-FV\cd;[=
+0@J=ueC<%!f%8O+f\,!4gY:N>h;7#Gi8ESRioB([jlPXekNM-ol0@U#m-O-,mf)YVnF?&JncJFT
+o_nFap@n=Zq#C0iqYU0gr;HTbrdk*&s*t~>
+JcC<$JcFd1mJd"]r;??erVHKgqY:$`rq?6^rq-3]r:9jWs7#sTs6fpSrp9[Ns6BUJId#tXk2tde
+jQ#:[io/hRhqm2FgtUQ:g"=p.f%&:"e'cXjcd'h\bfe/NaN2B?`PfX1_8*h"]tD"h\[f5Z[^EKK
+Za$a=YHG"/X/`2!W2HMhUnjc[TqS-OSt2C@S!ob4R$X,(Q'@JqP*(ieO,f3YN/NRNM2@%DL5(D8
+rdt6'Jc:0#It%BF!IT7nH3&;9rceBc!-S9_!crC&rc&!YDf>Vm!GuZPC]A,LC&M]HB4bcTAHHCP
+A,]p=@:3LB?iOI4?2e+/>Q7n*=oVV(=8Z,!<W5tp;uKVl;>!c\:\[]R:&.KW9Bo.F9DhKY:&Rid
+:\did;>sJi;uK\p<V]\p=8c7s=oDP&>PVP'?2\++?iFI4@JaO5A,g*:Ac?<@BDZBAC&MfCC]&#H
+D=)6(DtJ#=EVa_NF5qB:F8'_FEVa_SF8L(ZFoQX`GQ2pfH2`*jH[Pg@6[jN7J:N3&K7ei2Knb>;
+Ll$tGN/WaVO,oBbP*2#nQ'Rc(R$jD4S"-%@StD[LTq\<XUnsrdVl6SpWiN2%Xf\b/YPta-Z*L\7
+ZN@MA[JmW7\,Wu:\c02?]D]DB^&GbE^])%K_>V7N_uI[R`W*sXa8X0[aT0K^b6Q89c-FV\cd;[=
+0@J=ueC<%!f%8O+f\,!4gY:N>h;7#Gi8ESRioB([jlPXekNM-ol0@U#m-O-,mf)YVnF?&JncJFT
+o_nFap@n=Zq#C0iqYU0gr;HTbrdk*&s*t~>
+JcC<$JcFd1mJd"]r;??erVHKgqY:$`rq?6^rq-3]r:9jWs7#sTs6fpSrp9[Ns6BUJId#tXk2tde
+jQ#:[io/hRhqm2FgtUQ:g"=p.f%&:"e'cXjcd'h\bfe/NaN2B?`PfX1_8*h"]tD"h\[f5Z[^EKK
+Za$a=YHG"/X/`2!W2HMhUnjc[TqS-OSt2C@S!ob4R$X,(Q'@JqP*(ieO,f3YN/NRNM2@%DL5(D8
+rdt6'Jc:0#It%BF!IT7nH3&;9rceBc!-S9_!crC&rc&!YDf>Vm!GuZPC]A,LC&M]HB4bcTAHHCP
+A,]p=@:3LB?iOI4?2e+/>Q7n*=oVV(=8Z,!<W5tp;uKVl;>!c\:\[]R:&.KW9Bo.F9DhKY:&Rid
+:\did;>sJi;uK\p<V]\p=8c7s=oDP&>PVP'?2\++?iFI4@JaO5A,g*:Ac?<@BDZBAC&MfCC]&#H
+D=)6(DtJ#=EVa_NF5qB:F8'_FEVa_SF8L(ZFoQX`GQ2pfH2`*jH[Pg@6[jN7J:N3&K7ei2Knb>;
+Ll$tGN/WaVO,oBbP*2#nQ'Rc(R$jD4S"-%@StD[LTq\<XUnsrdVl6SpWiN2%Xf\b/YPta-Z*L\7
+ZN@MA[JmW7\,Wu:\c02?]D]DB^&GbE^])%K_>V7N_uI[R`W*sXa8X0[aT0K^b6Q89c-FV\cd;[=
+0@J=ueC<%!f%8O+f\,!4gY:N>h;7#Gi8ESRioB([jlPXekNM-ol0@U#m-O-,mf)YVnF?&JncJFT
+o_nFap@n=Zq#C0iqYU0gr;HTbrdk*&s*t~>
+JcC<$JcFa0mf*(]r;?<drVHKgqY:'arV$-]rq-3]r:9mXrp]mTs6fpSrTjUOlK\B5HKaPTk2tde
+jQ#:[io/hRhqm2FgtUQ:g"=p.f%&:"e'ZRicd'h[bKJ&MaN)<>`P]R0_8*h"]tCtg\[f5Y[^EKK
+Za$a=YHG"/X/`2!W2HPiUnjc[TqS-OSt;LCS"#k7R$X,(Q'@JqP*(lgO,o<\N/W[PM2@%Dre;/A
+KS+o/JUr?%IsuipI=-BgH?sj^GlDmlG'.qLFE;MDrc.sW!,qjS!c;airbDRMBkdQ[!bZ+Wrac.A
+@q5LIs'Yn8rEfV4?![G7s',M,rE9/&s&],!r`/qsqG[>jr)*&^pJ:QZnP/gQoh4pLpIkBWpeC]^
+rD38dr_`VlqG[AmrDi\prE&r"q-!Z"rEK)&rE]D/qHs50raG\5raYq<qdob=s(D1Arb;@Hq.onE
+qebD3lYlN:no=MHpN,M>p2f87rH%gWs)n?brHJ9ds*=Ti7sfW2I=6QnIt3'#JV&N,KS>/8LPUeD
+MMmFPNK0'\OcklkPa.N"Q^F20S"#q=St;RITqS3UUnjiaVl-JmWiE,$XKAV-YPtd+YlM*/ZN@MA
+[JmW7\,Wu:\c98@]DT>A^&PhE^]2+L_>M1M_uI[R`W*sXa8O'\ai_d*bQ#cdc2Q#gcN)>kdJqVp
+e,Ihte^j`O!SH*)g&]s`rnRV3hu;O7iSsjs!T`AAjoOZ/rojIKli-5PmI'EAmfN"Knc&(\oCV\S
+p&Facp\jmdq>^<gqu-HkrUTr=s+LE&~>
+JcC<$JcFa0mf*(]r;?<drVHKgqY:'arV$-]rq-3]r:9mXrp]mTs6fpSrTjUOlK\B5HKaPTk2tde
+jQ#:[io/hRhqm2FgtUQ:g"=p.f%&:"e'ZRicd'h[bKJ&MaN)<>`P]R0_8*h"]tCtg\[f5Y[^EKK
+Za$a=YHG"/X/`2!W2HPiUnjc[TqS-OSt;LCS"#k7R$X,(Q'@JqP*(lgO,o<\N/W[PM2@%Dre;/A
+KS+o/JUr?%IsuipI=-BgH?sj^GlDmlG'.qLFE;MDrc.sW!,qjS!c;airbDRMBkdQ[!bZ+Wrac.A
+@q5LIs'Yn8rEfV4?![G7s',M,rE9/&s&],!r`/qsqG[>jr)*&^pJ:QZnP/gQoh4pLpIkBWpeC]^
+rD38dr_`VlqG[AmrDi\prE&r"q-!Z"rEK)&rE]D/qHs50raG\5raYq<qdob=s(D1Arb;@Hq.onE
+qebD3lYlN:no=MHpN,M>p2f87rH%gWs)n?brHJ9ds*=Ti7sfW2I=6QnIt3'#JV&N,KS>/8LPUeD
+MMmFPNK0'\OcklkPa.N"Q^F20S"#q=St;RITqS3UUnjiaVl-JmWiE,$XKAV-YPtd+YlM*/ZN@MA
+[JmW7\,Wu:\c98@]DT>A^&PhE^]2+L_>M1M_uI[R`W*sXa8O'\ai_d*bQ#cdc2Q#gcN)>kdJqVp
+e,Ihte^j`O!SH*)g&]s`rnRV3hu;O7iSsjs!T`AAjoOZ/rojIKli-5PmI'EAmfN"Knc&(\oCV\S
+p&Facp\jmdq>^<gqu-HkrUTr=s+LE&~>
+JcC<$JcFa0mf*(]r;?<drVHKgqY:'arV$-]rq-3]r:9mXrp]mTs6fpSrTjUOlK\B5HKaPTk2tde
+jQ#:[io/hRhqm2FgtUQ:g"=p.f%&:"e'ZRicd'h[bKJ&MaN)<>`P]R0_8*h"]tCtg\[f5Y[^EKK
+Za$a=YHG"/X/`2!W2HPiUnjc[TqS-OSt;LCS"#k7R$X,(Q'@JqP*(lgO,o<\N/W[PM2@%Dre;/A
+KS+o/JUr?%IsuipI=-BgH?sj^GlDmlG'.qLFE;MDrc.sW!,qjS!c;airbDRMBkdQ[!bZ+Wrac.A
+@q5LIs'Yn8rEfV4?![G7s',M,rE9/&s&],!r`/qsqG[>jr)*&^pJ:QZnP/gQoh4pLpIkBWpeC]^
+rD38dr_`VlqG[AmrDi\prE&r"q-!Z"rEK)&rE]D/qHs50raG\5raYq<qdob=s(D1Arb;@Hq.onE
+qebD3lYlN:no=MHpN,M>p2f87rH%gWs)n?brHJ9ds*=Ti7sfW2I=6QnIt3'#JV&N,KS>/8LPUeD
+MMmFPNK0'\OcklkPa.N"Q^F20S"#q=St;RITqS3UUnjiaVl-JmWiE,$XKAV-YPtd+YlM*/ZN@MA
+[JmW7\,Wu:\c98@]DT>A^&PhE^]2+L_>M1M_uI[R`W*sXa8O'\ai_d*bQ#cdc2Q#gcN)>kdJqVp
+e,Ihte^j`O!SH*)g&]s`rnRV3hu;O7iSsjs!T`AAjoOZ/rojIKli-5PmI'EAmfN"Knc&(\oCV\S
+p&Facp\jmdq>^<gqu-HkrUTr=s+LE&~>
+JcC<$JcFa0mJct\r;?<drVHKgqY:$`rq?3]rq-6^qssdWs7$!Us6fpSrTjUOlK\B5!pJh1roS[k
+jQ#:[io/hRhqm2FgtUQ:g"=p.f%&:"da?Ihcd'eZbKJ&MaN)<>`P]R0_8!b!]tCtg\[f5Y[^EKK
+Za$a=YHG"0X/`2!W2HPjV50l\TqS-OSt;LCS"#k7R$a5+Q'IStP*1rhO,o<\N/W[PMM[1GLPCP;
+KS4u1Jq<oO!IoRtI0"_Brd"WkG^043!HrVbF96N(ErL%[E,T[oD?4TjrbMOK!,;FGs(;=Dral+?
+!+Yt:!b#JEra5\3!+#P.s',M,rE9/&s&],!r`/qsqG[;iqbcl[peU]\nkJpRj%K5BpeC]^rD38d
+rDEPlqG[>lr`/bprE&r"q-!Z"rEK)&rE]A.qd9;0raG\5raYq<r+5k>rb)+ArFu7GphTeDqJFo'
+oPaPEo5XSHpiGV?olKD=qfDUUrcS6arHJ9ds*=Ti!df<Brd=frJ,XsWJV&N,KS>/8LPUeDMMmFP
+NK0'\OHG]iPa.N"Q^F/.R[]h<St;RITqS3UUnjiaVl-JmWiE,$riH4(YPta,Z*OA8s0Md6rjMj9
+s1&$<s186BrOi0Ds1\EGs1nWMrPJQOs2=lTs2P)ZrQ,#\!6Y8`!mJp6rm(Pi!7:_m!n,QHrmUu!
+f)F8Df\+s3g=tE<h;-rFhr*GOio9"YjQ5Lck3(pkl07Kuli-5OmI'uBs6p$Yrpp*\s7H<`s7ZKe
+rV6Bfs8)WirVZWmo)=4?K`?Q~>
+JcC<$JcFa0mJct\r;?<drVHKgqY:$`rq?3]rq-6^qssdWs7$!Us6fpSrTjUOlK\B5!pJh1roS[k
+jQ#:[io/hRhqm2FgtUQ:g"=p.f%&:"da?Ihcd'eZbKJ&MaN)<>`P]R0_8!b!]tCtg\[f5Y[^EKK
+Za$a=YHG"0X/`2!W2HPjV50l\TqS-OSt;LCS"#k7R$a5+Q'IStP*1rhO,o<\N/W[PMM[1GLPCP;
+KS4u1Jq<oO!IoRtI0"_Brd"WkG^043!HrVbF96N(ErL%[E,T[oD?4TjrbMOK!,;FGs(;=Dral+?
+!+Yt:!b#JEra5\3!+#P.s',M,rE9/&s&],!r`/qsqG[;iqbcl[peU]\nkJpRj%K5BpeC]^rD38d
+rDEPlqG[>lr`/bprE&r"q-!Z"rEK)&rE]A.qd9;0raG\5raYq<r+5k>rb)+ArFu7GphTeDqJFo'
+oPaPEo5XSHpiGV?olKD=qfDUUrcS6arHJ9ds*=Ti!df<Brd=frJ,XsWJV&N,KS>/8LPUeDMMmFP
+NK0'\OHG]iPa.N"Q^F/.R[]h<St;RITqS3UUnjiaVl-JmWiE,$riH4(YPta,Z*OA8s0Md6rjMj9
+s1&$<s186BrOi0Ds1\EGs1nWMrPJQOs2=lTs2P)ZrQ,#\!6Y8`!mJp6rm(Pi!7:_m!n,QHrmUu!
+f)F8Df\+s3g=tE<h;-rFhr*GOio9"YjQ5Lck3(pkl07Kuli-5OmI'uBs6p$Yrpp*\s7H<`s7ZKe
+rV6Bfs8)WirVZWmo)=4?K`?Q~>
+JcC<$JcFa0mJct\r;?<drVHKgqY:$`rq?3]rq-6^qssdWs7$!Us6fpSrTjUOlK\B5!pJh1roS[k
+jQ#:[io/hRhqm2FgtUQ:g"=p.f%&:"da?Ihcd'eZbKJ&MaN)<>`P]R0_8!b!]tCtg\[f5Y[^EKK
+Za$a=YHG"0X/`2!W2HPjV50l\TqS-OSt;LCS"#k7R$a5+Q'IStP*1rhO,o<\N/W[PMM[1GLPCP;
+KS4u1Jq<oO!IoRtI0"_Brd"WkG^043!HrVbF96N(ErL%[E,T[oD?4TjrbMOK!,;FGs(;=Dral+?
+!+Yt:!b#JEra5\3!+#P.s',M,rE9/&s&],!r`/qsqG[;iqbcl[peU]\nkJpRj%K5BpeC]^rD38d
+rDEPlqG[>lr`/bprE&r"q-!Z"rEK)&rE]A.qd9;0raG\5raYq<r+5k>rb)+ArFu7GphTeDqJFo'
+oPaPEo5XSHpiGV?olKD=qfDUUrcS6arHJ9ds*=Ti!df<Brd=frJ,XsWJV&N,KS>/8LPUeDMMmFP
+NK0'\OHG]iPa.N"Q^F/.R[]h<St;RITqS3UUnjiaVl-JmWiE,$riH4(YPta,Z*OA8s0Md6rjMj9
+s1&$<s186BrOi0Ds1\EGs1nWMrPJQOs2=lTs2P)ZrQ,#\!6Y8`!mJp6rm(Pi!7:_m!n,QHrmUu!
+f)F8Df\+s3g=tE<h;-rFhr*GOio9"YjQ5Lck3(pkl07Kuli-5OmI'uBs6p$Yrpp*\s7H<`s7ZKe
+rV6Bfs8)WirVZWmo)=4?K`?Q~>
+JcC<$JcF[.mf*(]r;?<drVHKgq=ss`rV$-]rq-3]r:9mXrp]mTs6]mSrTsRM!:'RJDWp9Hk2tde
+jQ#:[io/hRhqm2FgtUQ:g"=p.f%&:!da?Ihcd'eZbKJ&LaN)<>`5BI/^q[Xu]tCtg\[f5Y[^EKK
+Za$a=YHG"0X/`2!W2HPjV50o^TqS-OSt;LCS"#k7R$a5+Q'IStP*1rhrf7PLNJrgSMM[1GLPLV=
+KnTGX$\Eq[J:E&tI=6KjHiA<lH$K=4s)nBbrcA0^ErL(YDuahUD?=ZkD#S2OC2%D]BEDgYB)Z?C
+A7K-K@KKtG@/aO5?N4=1>lS%.>5_V'=T;J#<rQ+t<;BJj;Yj8[;#*o`:@_-S9^5:I9_V9Z:B"&b
+;#X>j;Yj>k<;fhn<rH+u=SQ%t>5VV#>lJ%-?M\%.@/aU3@fBm:AG]s;B)ZH?B`;`ECA;TBD#%qu
+DYA#FE:\)GEqaY=FRjMEEqsePFT6L_G5ZXbGlN'gHN/<lI/\NpIXh?I7Y-/DK7no3L5(J>M2@+J
+N/`jYO-#KeP*;,qQC!u+R@9V7SXuFFTV8'RUSO]^VPg>jWN)u!XKAV-YHP17Z*L[AZa@*IrjMj9
+s1&'=s186BrOi0Ds1\EGs1nWMr5/KOs2=iSs2P)ZrQ,#\s2t>as31MfrltSkd*Vd>!n,QHrmV2'
+f%/I)f\"mVg&]s`rnRV3hu;O7iSsjs!T`AAjoOZ/roj[Qlg*p(mHs?@n,MkWnc&+Zo)SF]p&Fac
+p\jmeq>U6fqu-HkrUTr=s+LE&~>
+JcC<$JcF[.mf*(]r;?<drVHKgq=ss`rV$-]rq-3]r:9mXrp]mTs6]mSrTsRM!:'RJDWp9Hk2tde
+jQ#:[io/hRhqm2FgtUQ:g"=p.f%&:!da?Ihcd'eZbKJ&LaN)<>`5BI/^q[Xu]tCtg\[f5Y[^EKK
+Za$a=YHG"0X/`2!W2HPjV50o^TqS-OSt;LCS"#k7R$a5+Q'IStP*1rhrf7PLNJrgSMM[1GLPLV=
+KnTGX$\Eq[J:E&tI=6KjHiA<lH$K=4s)nBbrcA0^ErL(YDuahUD?=ZkD#S2OC2%D]BEDgYB)Z?C
+A7K-K@KKtG@/aO5?N4=1>lS%.>5_V'=T;J#<rQ+t<;BJj;Yj8[;#*o`:@_-S9^5:I9_V9Z:B"&b
+;#X>j;Yj>k<;fhn<rH+u=SQ%t>5VV#>lJ%-?M\%.@/aU3@fBm:AG]s;B)ZH?B`;`ECA;TBD#%qu
+DYA#FE:\)GEqaY=FRjMEEqsePFT6L_G5ZXbGlN'gHN/<lI/\NpIXh?I7Y-/DK7no3L5(J>M2@+J
+N/`jYO-#KeP*;,qQC!u+R@9V7SXuFFTV8'RUSO]^VPg>jWN)u!XKAV-YHP17Z*L[AZa@*IrjMj9
+s1&'=s186BrOi0Ds1\EGs1nWMr5/KOs2=iSs2P)ZrQ,#\s2t>as31MfrltSkd*Vd>!n,QHrmV2'
+f%/I)f\"mVg&]s`rnRV3hu;O7iSsjs!T`AAjoOZ/roj[Qlg*p(mHs?@n,MkWnc&+Zo)SF]p&Fac
+p\jmeq>U6fqu-HkrUTr=s+LE&~>
+JcC<$JcF[.mf*(]r;?<drVHKgq=ss`rV$-]rq-3]r:9mXrp]mTs6]mSrTsRM!:'RJDWp9Hk2tde
+jQ#:[io/hRhqm2FgtUQ:g"=p.f%&:!da?Ihcd'eZbKJ&LaN)<>`5BI/^q[Xu]tCtg\[f5Y[^EKK
+Za$a=YHG"0X/`2!W2HPjV50o^TqS-OSt;LCS"#k7R$a5+Q'IStP*1rhrf7PLNJrgSMM[1GLPLV=
+KnTGX$\Eq[J:E&tI=6KjHiA<lH$K=4s)nBbrcA0^ErL(YDuahUD?=ZkD#S2OC2%D]BEDgYB)Z?C
+A7K-K@KKtG@/aO5?N4=1>lS%.>5_V'=T;J#<rQ+t<;BJj;Yj8[;#*o`:@_-S9^5:I9_V9Z:B"&b
+;#X>j;Yj>k<;fhn<rH+u=SQ%t>5VV#>lJ%-?M\%.@/aU3@fBm:AG]s;B)ZH?B`;`ECA;TBD#%qu
+DYA#FE:\)GEqaY=FRjMEEqsePFT6L_G5ZXbGlN'gHN/<lI/\NpIXh?I7Y-/DK7no3L5(J>M2@+J
+N/`jYO-#KeP*;,qQC!u+R@9V7SXuFFTV8'RUSO]^VPg>jWN)u!XKAV-YHP17Z*L[AZa@*IrjMj9
+s1&'=s186BrOi0Ds1\EGs1nWMr5/KOs2=iSs2P)ZrQ,#\s2t>as31MfrltSkd*Vd>!n,QHrmV2'
+f%/I)f\"mVg&]s`rnRV3hu;O7iSsjs!T`AAjoOZ/roj[Qlg*p(mHs?@n,MkWnc&+Zo)SF]p&Fac
+p\jmeq>U6fqu-HkrUTr=s+LE&~>
+JcC<$JcFX-mf*(]qu$6dr;-Bfq=ss`rV$-]rq-6^r:9jWs7$!Us6fpSrp9[N!:'RJs6'dPk2tde
+jQ#:[iVqbbhqm2FgtUQ:g"=p-e^W*tda?IgcHa\YbK@rJaN)9=`5BI.^q[Xu]Y(kf\[f2X[^EKK
+ZE^X<YHG"0XK&;"W2HPjV50o^U7n9RT:VXFS"#k7R$a5,QBd`"PEM)kOH5H_NJrgSMMd7ILkg_>
+KnY24K7\Z*J:N,uIXQWls*Ocls*4Thrc\TjF`heJF)uC$E<:)tDuOVTD/B2es(VOJrb2=E!+u4A
+s'u+>raPn9s'Yh5s'>\2rETA,s'#A(s&f8%r)Wbrr`&Ykqbm5enPK$WqG-WVp.Y'Npe:BUrD*;e
+q,%&frDNJjrD`brq,[GqrE/htrEB,'q-<l(ra,G.ra>\5qdTP7s()"<rau.BqIokBrG)+CqeZ(F
+dVehuqJc(HqJu=OkB,a*pN6CWs*"<as*4Qhrd+Tk!.=co#(D&OJ:N3&re!+^Knb>;Ll$tGMi<US
+NfT9aP*2#nQ'IZ&R$jD4S"-%@T:hmOU8+N[V5C/gW2ZesX/rG*Y-7i/!O8s0ZN@MA[JmT9\%&sI
+\c98@]D]DB^&PhF^])%K_>M1M_u@UQ`W!mWa8O*ZaoBN^b6#o4c2Q#gci;Akd/qbFe,Ii%e^i='
+f@\a/rn7D-h#?+AhV[5Ki8N\Tj5]4]jlY^gkNMp0!UB"MliQSBmf)YVnF?&JncJFTo_nI_pAamc
+q#C0hqYU0hr;?Nbrdk*%s*t~>
+JcC<$JcFX-mf*(]qu$6dr;-Bfq=ss`rV$-]rq-6^r:9jWs7$!Us6fpSrp9[N!:'RJs6'dPk2tde
+jQ#:[iVqbbhqm2FgtUQ:g"=p-e^W*tda?IgcHa\YbK@rJaN)9=`5BI.^q[Xu]Y(kf\[f2X[^EKK
+ZE^X<YHG"0XK&;"W2HPjV50o^U7n9RT:VXFS"#k7R$a5,QBd`"PEM)kOH5H_NJrgSMMd7ILkg_>
+KnY24K7\Z*J:N,uIXQWls*Ocls*4Thrc\TjF`heJF)uC$E<:)tDuOVTD/B2es(VOJrb2=E!+u4A
+s'u+>raPn9s'Yh5s'>\2rETA,s'#A(s&f8%r)Wbrr`&Ykqbm5enPK$WqG-WVp.Y'Npe:BUrD*;e
+q,%&frDNJjrD`brq,[GqrE/htrEB,'q-<l(ra,G.ra>\5qdTP7s()"<rau.BqIokBrG)+CqeZ(F
+dVehuqJc(HqJu=OkB,a*pN6CWs*"<as*4Qhrd+Tk!.=co#(D&OJ:N3&re!+^Knb>;Ll$tGMi<US
+NfT9aP*2#nQ'IZ&R$jD4S"-%@T:hmOU8+N[V5C/gW2ZesX/rG*Y-7i/!O8s0ZN@MA[JmT9\%&sI
+\c98@]D]DB^&PhF^])%K_>M1M_u@UQ`W!mWa8O*ZaoBN^b6#o4c2Q#gci;Akd/qbFe,Ii%e^i='
+f@\a/rn7D-h#?+AhV[5Ki8N\Tj5]4]jlY^gkNMp0!UB"MliQSBmf)YVnF?&JncJFTo_nI_pAamc
+q#C0hqYU0hr;?Nbrdk*%s*t~>
+JcC<$JcFX-mf*(]qu$6dr;-Bfq=ss`rV$-]rq-6^r:9jWs7$!Us6fpSrp9[N!:'RJs6'dPk2tde
+jQ#:[iVqbbhqm2FgtUQ:g"=p-e^W*tda?IgcHa\YbK@rJaN)9=`5BI.^q[Xu]Y(kf\[f2X[^EKK
+ZE^X<YHG"0XK&;"W2HPjV50o^U7n9RT:VXFS"#k7R$a5,QBd`"PEM)kOH5H_NJrgSMMd7ILkg_>
+KnY24K7\Z*J:N,uIXQWls*Ocls*4Thrc\TjF`heJF)uC$E<:)tDuOVTD/B2es(VOJrb2=E!+u4A
+s'u+>raPn9s'Yh5s'>\2rETA,s'#A(s&f8%r)Wbrr`&Ykqbm5enPK$WqG-WVp.Y'Npe:BUrD*;e
+q,%&frDNJjrD`brq,[GqrE/htrEB,'q-<l(ra,G.ra>\5qdTP7s()"<rau.BqIokBrG)+CqeZ(F
+dVehuqJc(HqJu=OkB,a*pN6CWs*"<as*4Qhrd+Tk!.=co#(D&OJ:N3&re!+^Knb>;Ll$tGMi<US
+NfT9aP*2#nQ'IZ&R$jD4S"-%@T:hmOU8+N[V5C/gW2ZesX/rG*Y-7i/!O8s0ZN@MA[JmT9\%&sI
+\c98@]D]DB^&PhF^])%K_>M1M_u@UQ`W!mWa8O*ZaoBN^b6#o4c2Q#gci;Akd/qbFe,Ii%e^i='
+f@\a/rn7D-h#?+AhV[5Ki8N\Tj5]4]jlY^gkNMp0!UB"MliQSBmf)YVnF?&JncJFTo_nI_pAamc
+q#C0hqYU0hr;?Nbrdk*%s*t~>
+JcC<$JcFU,mJd"]qu$3crVHKgq=sp_rq?6^rq-3]r:9mXs7$!Us6fpSrp9[N!:'RJs6'dPk2tde
+jQ#:[iVqbChqm2FgtUQ:g"4j,e^W*tda?FfcHa\YbK@rJaMu3<`5BI.^q[Xu]Y(kf\[f2X[^EKK
+Za$a=YHG"0XK/A#W2HPjV50o^U7n9RT:VXFS=?":R@'A.QBd`"PEM)kOT(:NNfB!VMi*@JLkph@
+L4t<[K)pRTrdY$!If=`rI!bj=!dT$8rc\BdFoHIaF)l=#E<1#srbhaQ!,VXM!buF`rb)@GAnM$R
+!b>eNraGq;?srt@s'G_2rETA,s'#A(s&f8%qc<\rrD`JhqGR,dnkf0YqbH]Vj@o8Ar(d2dqG@,f
+r_iSkrD`_qq,[GqrE/htrEB,'q-<l(rEf>-ra>_6qdTP7rabn;rau.Bqe5qBrG)+CqJ>kBdr+u"
+qf)1IqJu@Pj)j[0olU.Trc\6arcnHgrd+Tk!.=co5^n34J:N3&JqJ]/Knb>;Ll$tGMi<USNfT6_
+OckomQ'IZ%R$a>3S"-%@StD^MU8+N[V5C/gW2ZesX/rG*Y-7i/#-kJ?Za@*IrjDm;\@DOKs186B
+rk/9Es1\EGs1nWMrPJQOs2=iSs2P&YrQ,#\s2t;`s31Mfrm(Pi!7:\l!n,QHrmV2'f%/I)f\"mV
+g'?BfgtgfChV\=j!TE&;irS6&roOIKkih9qlK[^7liHMArpTmV!:g$Y!qZ'Vrq6<bs7cHds7uZj
+qtpBjr;H6dJcCB&J,~>
+JcC<$JcFU,mJd"]qu$3crVHKgq=sp_rq?6^rq-3]r:9mXs7$!Us6fpSrp9[N!:'RJs6'dPk2tde
+jQ#:[iVqbChqm2FgtUQ:g"4j,e^W*tda?FfcHa\YbK@rJaMu3<`5BI.^q[Xu]Y(kf\[f2X[^EKK
+Za$a=YHG"0XK/A#W2HPjV50o^U7n9RT:VXFS=?":R@'A.QBd`"PEM)kOT(:NNfB!VMi*@JLkph@
+L4t<[K)pRTrdY$!If=`rI!bj=!dT$8rc\BdFoHIaF)l=#E<1#srbhaQ!,VXM!buF`rb)@GAnM$R
+!b>eNraGq;?srt@s'G_2rETA,s'#A(s&f8%qc<\rrD`JhqGR,dnkf0YqbH]Vj@o8Ar(d2dqG@,f
+r_iSkrD`_qq,[GqrE/htrEB,'q-<l(rEf>-ra>_6qdTP7rabn;rau.Bqe5qBrG)+CqJ>kBdr+u"
+qf)1IqJu@Pj)j[0olU.Trc\6arcnHgrd+Tk!.=co5^n34J:N3&JqJ]/Knb>;Ll$tGMi<USNfT6_
+OckomQ'IZ%R$a>3S"-%@StD^MU8+N[V5C/gW2ZesX/rG*Y-7i/#-kJ?Za@*IrjDm;\@DOKs186B
+rk/9Es1\EGs1nWMrPJQOs2=iSs2P&YrQ,#\s2t;`s31Mfrm(Pi!7:\l!n,QHrmV2'f%/I)f\"mV
+g'?BfgtgfChV\=j!TE&;irS6&roOIKkih9qlK[^7liHMArpTmV!:g$Y!qZ'Vrq6<bs7cHds7uZj
+qtpBjr;H6dJcCB&J,~>
+JcC<$JcFU,mJd"]qu$3crVHKgq=sp_rq?6^rq-3]r:9mXs7$!Us6fpSrp9[N!:'RJs6'dPk2tde
+jQ#:[iVqbChqm2FgtUQ:g"4j,e^W*tda?FfcHa\YbK@rJaMu3<`5BI.^q[Xu]Y(kf\[f2X[^EKK
+Za$a=YHG"0XK/A#W2HPjV50o^U7n9RT:VXFS=?":R@'A.QBd`"PEM)kOT(:NNfB!VMi*@JLkph@
+L4t<[K)pRTrdY$!If=`rI!bj=!dT$8rc\BdFoHIaF)l=#E<1#srbhaQ!,VXM!buF`rb)@GAnM$R
+!b>eNraGq;?srt@s'G_2rETA,s'#A(s&f8%qc<\rrD`JhqGR,dnkf0YqbH]Vj@o8Ar(d2dqG@,f
+r_iSkrD`_qq,[GqrE/htrEB,'q-<l(rEf>-ra>_6qdTP7rabn;rau.Bqe5qBrG)+CqJ>kBdr+u"
+qf)1IqJu@Pj)j[0olU.Trc\6arcnHgrd+Tk!.=co5^n34J:N3&JqJ]/Knb>;Ll$tGMi<USNfT6_
+OckomQ'IZ%R$a>3S"-%@StD^MU8+N[V5C/gW2ZesX/rG*Y-7i/#-kJ?Za@*IrjDm;\@DOKs186B
+rk/9Es1\EGs1nWMrPJQOs2=iSs2P&YrQ,#\s2t;`s31Mfrm(Pi!7:\l!n,QHrmV2'f%/I)f\"mV
+g'?BfgtgfChV\=j!TE&;irS6&roOIKkih9qlK[^7liHMArpTmV!:g$Y!qZ'Vrq6<bs7cHds7uZj
+qtpBjr;H6dJcCB&J,~>
+JcC<$JcFR+mJct\r;?<dr;-Bfq=sp_rq?6^rq-3]rUTsXs7$!U!q,ICrp9[N!:'RJs6+gmk2tde
+jQ#:[iS`YOhVR)EgtLK8f[na+e^W*tdF$=ecHa\XbK@rJa2Z*;`5BI.^q[Xt]Y(kf\[],W[^EKK
+Za$a=YHG"0XK/A$WMcYkV50o^U7n9RT:VXFS=?":R@'A.QBd`"PEV/mOcYWbNfB!VMi3ILM26rd
+L(K&lK7ec-JUi9#IsufoI!g;?H3&;9rc\EeF`m\*!HW;\E<:)tDuOVTD/B2es(VOJrb2=E!+u4A
+s'u+>raPn9!+>b4s'>\2rETA,s'#>'s&f8%qc<Yqr)EAgq,7#co2,<[qG-TUlV-qFrD*8dqG@,f
+r_iSkrD`_qq,[GqrE/esrEB,'pg!c'rEf>-ra>_6qdTP7rabn;rau.Bqe5qBrG)(BqJ>P9g2?b*
+qf)4Jqf;FPa)q9&rc\3`s*4QhrHeKj!.=cos*b9(J:N3%JqJ]/L&QflLPUeDMMmFQNfT6_Ocklk
+Pa.Q$R$a;1S"-%@StD[LTqeEZV5C/gW2ZesX/rG*Y-5(6Z*CU@Za@-J[^NZS\Gj&=])TDA]`5\F
+^AYhH_#M7K_Z%IQ`;IUS`r=$WaSs<]b5KN`bl>recMu5jd/MGmdK%bpe-FOTf%8O+f\-8X!o)Mc
+rnRV3hu;OBiSrkWj5f=`k2tjikl0fOlKdd&m-X3.rpTmV!:g'Zs7?9_rq6<bs7cKerqZTjqtp?i
+r;H6dJcCB&J,~>
+JcC<$JcFR+mJct\r;?<dr;-Bfq=sp_rq?6^rq-3]rUTsXs7$!U!q,ICrp9[N!:'RJs6+gmk2tde
+jQ#:[iS`YOhVR)EgtLK8f[na+e^W*tdF$=ecHa\XbK@rJa2Z*;`5BI.^q[Xt]Y(kf\[],W[^EKK
+Za$a=YHG"0XK/A$WMcYkV50o^U7n9RT:VXFS=?":R@'A.QBd`"PEV/mOcYWbNfB!VMi3ILM26rd
+L(K&lK7ec-JUi9#IsufoI!g;?H3&;9rc\EeF`m\*!HW;\E<:)tDuOVTD/B2es(VOJrb2=E!+u4A
+s'u+>raPn9!+>b4s'>\2rETA,s'#>'s&f8%qc<Yqr)EAgq,7#co2,<[qG-TUlV-qFrD*8dqG@,f
+r_iSkrD`_qq,[GqrE/esrEB,'pg!c'rEf>-ra>_6qdTP7rabn;rau.Bqe5qBrG)(BqJ>P9g2?b*
+qf)4Jqf;FPa)q9&rc\3`s*4QhrHeKj!.=cos*b9(J:N3%JqJ]/L&QflLPUeDMMmFQNfT6_Ocklk
+Pa.Q$R$a;1S"-%@StD[LTqeEZV5C/gW2ZesX/rG*Y-5(6Z*CU@Za@-J[^NZS\Gj&=])TDA]`5\F
+^AYhH_#M7K_Z%IQ`;IUS`r=$WaSs<]b5KN`bl>recMu5jd/MGmdK%bpe-FOTf%8O+f\-8X!o)Mc
+rnRV3hu;OBiSrkWj5f=`k2tjikl0fOlKdd&m-X3.rpTmV!:g'Zs7?9_rq6<bs7cKerqZTjqtp?i
+r;H6dJcCB&J,~>
+JcC<$JcFR+mJct\r;?<dr;-Bfq=sp_rq?6^rq-3]rUTsXs7$!U!q,ICrp9[N!:'RJs6+gmk2tde
+jQ#:[iS`YOhVR)EgtLK8f[na+e^W*tdF$=ecHa\XbK@rJa2Z*;`5BI.^q[Xt]Y(kf\[],W[^EKK
+Za$a=YHG"0XK/A$WMcYkV50o^U7n9RT:VXFS=?":R@'A.QBd`"PEV/mOcYWbNfB!VMi3ILM26rd
+L(K&lK7ec-JUi9#IsufoI!g;?H3&;9rc\EeF`m\*!HW;\E<:)tDuOVTD/B2es(VOJrb2=E!+u4A
+s'u+>raPn9!+>b4s'>\2rETA,s'#>'s&f8%qc<Yqr)EAgq,7#co2,<[qG-TUlV-qFrD*8dqG@,f
+r_iSkrD`_qq,[GqrE/esrEB,'pg!c'rEf>-ra>_6qdTP7rabn;rau.Bqe5qBrG)(BqJ>P9g2?b*
+qf)4Jqf;FPa)q9&rc\3`s*4QhrHeKj!.=cos*b9(J:N3%JqJ]/L&QflLPUeDMMmFQNfT6_Ocklk
+Pa.Q$R$a;1S"-%@StD[LTqeEZV5C/gW2ZesX/rG*Y-5(6Z*CU@Za@-J[^NZS\Gj&=])TDA]`5\F
+^AYhH_#M7K_Z%IQ`;IUS`r=$WaSs<]b5KN`bl>recMu5jd/MGmdK%bpe-FOTf%8O+f\-8X!o)Mc
+rnRV3hu;OBiSrkWj5f=`k2tjikl0fOlKdd&m-X3.rpTmV!:g'Zs7?9_rq6<bs7cKerqZTjqtp?i
+r;H6dJcCB&J,~>
+JcC<$JcFR+m/Hn\qu$3cr;-Bfq=sp_rq?6^rq-3]r:9mXs7$!U!q,ICrp9[N!:'RJE9QKJk2tdd
+jQ#:[iS`YOhVI#CgY1B7f[na+e^W*sdF$=ecHXSVbK@rJa2Z*;`59C-^q[Us]Y(kf\[],W[^EKK
+Za$a=YHG"0XK/A$WMl_mVPU)aUS=HUTV%gISXc1=R[KP1Q^3o%P`q8nOc]R'"ceS$N/NSmM&M2*
+L5(D8KS+o/JUr?%IsuipI=-BgH?sj^GlDmfG'3e+!crC&rc%sXDuOVUD/=%fCBnTgBkV0mB4h-S
+s'u+>rF,h:?srt@s'G_2rETA,s'#>'r`K2%qH!Ppr)E;eq,7&doMGE\qG-NSo1\^LrD*8dqG@,f
+rDNJjr`&hrq,[Gqr)i_sr*'#&pg!c'rEf>-ra>_6qdTP7rabn;rau.BqIohArG)(Bph\]%m;Dc=
+r,D=Kqf;LRa`RH'rc\0_s*4QhrHeKj!.=cos*artrd[1`JqJ]/KnY89LPUeDMMmFPNK0']Ocklk
+Pa.N"R$a;1S"#q>StD[LTq\?YV5C/gW2ZesX/rG*Y-5(6Z*OA8!OT96[Ks@P\@K/]]">TR]`5\F
+^AbnH_#M7L_Z%IQ`;IUR`rF*WaT'B]b5KN`bl>rdcMu2jd/DAldK%bqeGn&!f)F;$fDsV(gAfn-
+h#?+7hV[5Ki8NYSro4%?jo4BIkNM-ol0@R"rp0^RmdC)C!q>aMrpp*\!;-6_s7ZKerV6Bfs8)Wi
+rVZWmo)=4?KE$H~>
+JcC<$JcFR+m/Hn\qu$3cr;-Bfq=sp_rq?6^rq-3]r:9mXs7$!U!q,ICrp9[N!:'RJE9QKJk2tdd
+jQ#:[iS`YOhVI#CgY1B7f[na+e^W*sdF$=ecHXSVbK@rJa2Z*;`59C-^q[Us]Y(kf\[],W[^EKK
+Za$a=YHG"0XK/A$WMl_mVPU)aUS=HUTV%gISXc1=R[KP1Q^3o%P`q8nOc]R'"ceS$N/NSmM&M2*
+L5(D8KS+o/JUr?%IsuipI=-BgH?sj^GlDmfG'3e+!crC&rc%sXDuOVUD/=%fCBnTgBkV0mB4h-S
+s'u+>rF,h:?srt@s'G_2rETA,s'#>'r`K2%qH!Ppr)E;eq,7&doMGE\qG-NSo1\^LrD*8dqG@,f
+rDNJjr`&hrq,[Gqr)i_sr*'#&pg!c'rEf>-ra>_6qdTP7rabn;rau.BqIohArG)(Bph\]%m;Dc=
+r,D=Kqf;LRa`RH'rc\0_s*4QhrHeKj!.=cos*artrd[1`JqJ]/KnY89LPUeDMMmFPNK0']Ocklk
+Pa.N"R$a;1S"#q>StD[LTq\?YV5C/gW2ZesX/rG*Y-5(6Z*OA8!OT96[Ks@P\@K/]]">TR]`5\F
+^AbnH_#M7L_Z%IQ`;IUR`rF*WaT'B]b5KN`bl>rdcMu2jd/DAldK%bqeGn&!f)F;$fDsV(gAfn-
+h#?+7hV[5Ki8NYSro4%?jo4BIkNM-ol0@R"rp0^RmdC)C!q>aMrpp*\!;-6_s7ZKerV6Bfs8)Wi
+rVZWmo)=4?KE$H~>
+JcC<$JcFR+m/Hn\qu$3cr;-Bfq=sp_rq?6^rq-3]r:9mXs7$!U!q,ICrp9[N!:'RJE9QKJk2tdd
+jQ#:[iS`YOhVI#CgY1B7f[na+e^W*sdF$=ecHXSVbK@rJa2Z*;`59C-^q[Us]Y(kf\[],W[^EKK
+Za$a=YHG"0XK/A$WMl_mVPU)aUS=HUTV%gISXc1=R[KP1Q^3o%P`q8nOc]R'"ceS$N/NSmM&M2*
+L5(D8KS+o/JUr?%IsuipI=-BgH?sj^GlDmfG'3e+!crC&rc%sXDuOVUD/=%fCBnTgBkV0mB4h-S
+s'u+>rF,h:?srt@s'G_2rETA,s'#>'r`K2%qH!Ppr)E;eq,7&doMGE\qG-NSo1\^LrD*8dqG@,f
+rDNJjr`&hrq,[Gqr)i_sr*'#&pg!c'rEf>-ra>_6qdTP7rabn;rau.BqIohArG)(Bph\]%m;Dc=
+r,D=Kqf;LRa`RH'rc\0_s*4QhrHeKj!.=cos*artrd[1`JqJ]/KnY89LPUeDMMmFPNK0']Ocklk
+Pa.N"R$a;1S"#q>StD[LTq\?YV5C/gW2ZesX/rG*Y-5(6Z*OA8!OT96[Ks@P\@K/]]">TR]`5\F
+^AbnH_#M7L_Z%IQ`;IUR`rF*WaT'B]b5KN`bl>rdcMu2jd/DAldK%bqeGn&!f)F;$fDsV(gAfn-
+h#?+7hV[5Ki8NYSro4%?jo4BIkNM-ol0@R"rp0^RmdC)C!q>aMrpp*\!;-6_s7ZKerV6Bfs8)Wi
+rVZWmo)=4?KE$H~>
+JcC<$JcFO*m/Hn\qu$0br;-Bfq=sp_rq?6^rq-6^r:9mXs7$!Us6]mSrp9[N!:'RJ#3b75k2tdd
+ro7eRiS`YOhVI#CgY1B7f[na+eC;sqdF$=dcHXSVbK7iHa2Z*:_ns:,^q[Us]Y(kf\[],W[^EKK
+Za-g>YHG"0XK/A$WMl_mVPU)aUS=HUTV%gISXc1=R[KP1Q^3o%P`q;oP*(ieO,f5!N!5,sM2@%D
+re:H-K`6T)Jq<oO!IoRtI0"_Brd"fpG^+FVG'8$-F9-H'rc&!YDf>Vm!GuZPC]A,LC&VcIB4bcT
+AHHCPA,]s;@/s^6?iOI4?2\%.>Q7n)=oMP&=8>nq<Vobe;u0Dg;>!c_:]!o>:&Ica:\did;>jDh
+;uK\o<V]\o=8Z1q=o;J$>PMJ%?2\++?i=C3@JaO5A,^$9Ac?<@BDQ<?C&Mf?C\DSsD=MN@Du=SJ
+EVa_PF3Sh)Fo?L\GQ)jeH2W$jH[L5?IK+`rJ,Xs!JV*lR3J<*@L51SAM2I4MN/`jYO-#KeP*D5s
+QC!u+R[]e:SXuFGTqS3UUnjlcVl6SpWiN5'Xfek3Yd(M5ZNdeE[^NZS\Gj#?]">TR]`5YF^AYhH
+_#M7K_Z.OR`;IUR`rF*WaSs<]b5BH_bl>rdcMu5jd/MGmdf7eqeGn&!f)F;$fDsV(gAfn-h#?+2
+hV[5ihuVfrro47EjlPXekND(.klU/9li-5OmI'uBs6p$YrUL$]o^r+Ts7ZKerV6EgrqcNhrVZWm
+o)=4?KE$H~>
+JcC<$JcFO*m/Hn\qu$0br;-Bfq=sp_rq?6^rq-6^r:9mXs7$!Us6]mSrp9[N!:'RJ#3b75k2tdd
+ro7eRiS`YOhVI#CgY1B7f[na+eC;sqdF$=dcHXSVbK7iHa2Z*:_ns:,^q[Us]Y(kf\[],W[^EKK
+Za-g>YHG"0XK/A$WMl_mVPU)aUS=HUTV%gISXc1=R[KP1Q^3o%P`q;oP*(ieO,f5!N!5,sM2@%D
+re:H-K`6T)Jq<oO!IoRtI0"_Brd"fpG^+FVG'8$-F9-H'rc&!YDf>Vm!GuZPC]A,LC&VcIB4bcT
+AHHCPA,]s;@/s^6?iOI4?2\%.>Q7n)=oMP&=8>nq<Vobe;u0Dg;>!c_:]!o>:&Ica:\did;>jDh
+;uK\o<V]\o=8Z1q=o;J$>PMJ%?2\++?i=C3@JaO5A,^$9Ac?<@BDQ<?C&Mf?C\DSsD=MN@Du=SJ
+EVa_PF3Sh)Fo?L\GQ)jeH2W$jH[L5?IK+`rJ,Xs!JV*lR3J<*@L51SAM2I4MN/`jYO-#KeP*D5s
+QC!u+R[]e:SXuFGTqS3UUnjlcVl6SpWiN5'Xfek3Yd(M5ZNdeE[^NZS\Gj#?]">TR]`5YF^AYhH
+_#M7K_Z.OR`;IUR`rF*WaSs<]b5BH_bl>rdcMu5jd/MGmdf7eqeGn&!f)F;$fDsV(gAfn-h#?+2
+hV[5ihuVfrro47EjlPXekND(.klU/9li-5OmI'uBs6p$YrUL$]o^r+Ts7ZKerV6EgrqcNhrVZWm
+o)=4?KE$H~>
+JcC<$JcFO*m/Hn\qu$0br;-Bfq=sp_rq?6^rq-6^r:9mXs7$!Us6]mSrp9[N!:'RJ#3b75k2tdd
+ro7eRiS`YOhVI#CgY1B7f[na+eC;sqdF$=dcHXSVbK7iHa2Z*:_ns:,^q[Us]Y(kf\[],W[^EKK
+Za-g>YHG"0XK/A$WMl_mVPU)aUS=HUTV%gISXc1=R[KP1Q^3o%P`q;oP*(ieO,f5!N!5,sM2@%D
+re:H-K`6T)Jq<oO!IoRtI0"_Brd"fpG^+FVG'8$-F9-H'rc&!YDf>Vm!GuZPC]A,LC&VcIB4bcT
+AHHCPA,]s;@/s^6?iOI4?2\%.>Q7n)=oMP&=8>nq<Vobe;u0Dg;>!c_:]!o>:&Ica:\did;>jDh
+;uK\o<V]\o=8Z1q=o;J$>PMJ%?2\++?i=C3@JaO5A,^$9Ac?<@BDQ<?C&Mf?C\DSsD=MN@Du=SJ
+EVa_PF3Sh)Fo?L\GQ)jeH2W$jH[L5?IK+`rJ,Xs!JV*lR3J<*@L51SAM2I4MN/`jYO-#KeP*D5s
+QC!u+R[]e:SXuFGTqS3UUnjlcVl6SpWiN5'Xfek3Yd(M5ZNdeE[^NZS\Gj#?]">TR]`5YF^AYhH
+_#M7K_Z.OR`;IUR`rF*WaSs<]b5BH_bl>rdcMu5jd/MGmdf7eqeGn&!f)F;$fDsV(gAfn-h#?+2
+hV[5ihuVfrro47EjlPXekND(.klU/9li-5OmI'uBs6p$YrUL$]o^r+Ts7ZKerV6EgrqcNhrVZWm
+o)=4?KE$H~>
+JcC<$JcFL)m/Hk[qu$0brVHHfq=ss`rV$-]s7H<^rUU!Ys7$!Us6]mSrTjRNlMg#Pki_-kk2k\'
+j&Y0ui8EMLh;-l@g=k64f@JL%eC2jndEg+`c-4ARaiMQD`l5m6_SX.)^V7Co]Xtbc\@8oT[C!9H
+ZE^X<Y-"h-X/`2!W2HPjV50o^U7n9RT:VXFSGnueR[KP1Q^3o%P`q8nOc]R'"ceS$N/NSmM%ti%
+L5(D9KS+o/Jq8H&It)oqI=-Ehrd"TjGlDmfG'3e+#BOp+EH,r:DuOVUD/=%fCB80arb2=E!+u4A
+s'u+>rF,h:?srq?!a]/<r*98+s'#>'r`K,#q,[Dnqc*,bqbm;gohbN]qbGp@r(d/cq,%#er_iPj
+r`&hrq,[DprE/esr*'#&pK[Z&rEf>-ra>_6qdTP7rabn;rau+AqIohArG(t?g2-=soPXPEr,DCM
+qf;LRe9(M/rHA$]rcnHgrHeKjs*Xfos*artrdY$#K)UBnKS>/8LPUeDMMmFPNK0'\OHG]hPE_>u
+Q^F/.R[]h<St;RITq\<XUnsrdW2ZesX/rG*Y-5(6Z*L^B['d<M[^WcV\[f;_]DfJC]`>eF^]2+L
+_>V7N_u@UQ`W!mWa8<sXao9H]bPo`cc2Grfci;AjdJqVpe,@ereH"2"fDjJ'g&B_*gAp%.h>c=3
+hu;O=iSrkWj5f:_roOIKkih9qlK[^7m/QGQmf)\Tn,W"Xo)J=]o`"O`pAambq#C0hqYU0gr;HTb
+rdk*%s*t~>
+JcC<$JcFL)m/Hk[qu$0brVHHfq=ss`rV$-]s7H<^rUU!Ys7$!Us6]mSrTjRNlMg#Pki_-kk2k\'
+j&Y0ui8EMLh;-l@g=k64f@JL%eC2jndEg+`c-4ARaiMQD`l5m6_SX.)^V7Co]Xtbc\@8oT[C!9H
+ZE^X<Y-"h-X/`2!W2HPjV50o^U7n9RT:VXFSGnueR[KP1Q^3o%P`q8nOc]R'"ceS$N/NSmM%ti%
+L5(D9KS+o/Jq8H&It)oqI=-Ehrd"TjGlDmfG'3e+#BOp+EH,r:DuOVUD/=%fCB80arb2=E!+u4A
+s'u+>rF,h:?srq?!a]/<r*98+s'#>'r`K,#q,[Dnqc*,bqbm;gohbN]qbGp@r(d/cq,%#er_iPj
+r`&hrq,[DprE/esr*'#&pK[Z&rEf>-ra>_6qdTP7rabn;rau+AqIohArG(t?g2-=soPXPEr,DCM
+qf;LRe9(M/rHA$]rcnHgrHeKjs*Xfos*artrdY$#K)UBnKS>/8LPUeDMMmFPNK0'\OHG]hPE_>u
+Q^F/.R[]h<St;RITq\<XUnsrdW2ZesX/rG*Y-5(6Z*L^B['d<M[^WcV\[f;_]DfJC]`>eF^]2+L
+_>V7N_u@UQ`W!mWa8<sXao9H]bPo`cc2Grfci;AjdJqVpe,@ereH"2"fDjJ'g&B_*gAp%.h>c=3
+hu;O=iSrkWj5f:_roOIKkih9qlK[^7m/QGQmf)\Tn,W"Xo)J=]o`"O`pAambq#C0hqYU0gr;HTb
+rdk*%s*t~>
+JcC<$JcFL)m/Hk[qu$0brVHHfq=ss`rV$-]s7H<^rUU!Ys7$!Us6]mSrTjRNlMg#Pki_-kk2k\'
+j&Y0ui8EMLh;-l@g=k64f@JL%eC2jndEg+`c-4ARaiMQD`l5m6_SX.)^V7Co]Xtbc\@8oT[C!9H
+ZE^X<Y-"h-X/`2!W2HPjV50o^U7n9RT:VXFSGnueR[KP1Q^3o%P`q8nOc]R'"ceS$N/NSmM%ti%
+L5(D9KS+o/Jq8H&It)oqI=-Ehrd"TjGlDmfG'3e+#BOp+EH,r:DuOVUD/=%fCB80arb2=E!+u4A
+s'u+>rF,h:?srq?!a]/<r*98+s'#>'r`K,#q,[Dnqc*,bqbm;gohbN]qbGp@r(d/cq,%#er_iPj
+r`&hrq,[DprE/esr*'#&pK[Z&rEf>-ra>_6qdTP7rabn;rau+AqIohArG(t?g2-=soPXPEr,DCM
+qf;LRe9(M/rHA$]rcnHgrHeKjs*Xfos*artrdY$#K)UBnKS>/8LPUeDMMmFPNK0'\OHG]hPE_>u
+Q^F/.R[]h<St;RITq\<XUnsrdW2ZesX/rG*Y-5(6Z*L^B['d<M[^WcV\[f;_]DfJC]`>eF^]2+L
+_>V7N_u@UQ`W!mWa8<sXao9H]bPo`cc2Grfci;AjdJqVpe,@ereH"2"fDjJ'g&B_*gAp%.h>c=3
+hu;O=iSrkWj5f:_roOIKkih9qlK[^7m/QGQmf)\Tn,W"Xo)J=]o`"O`pAambq#C0hqYU0gr;HTb
+rdk*%s*t~>
+JcC<$JcFI(m/Hk[qu$0br;-Bfq=sp_rq?6^s7H<^rUU!Ys7$!Us6]mSrp9[N!:'RJ!U/_Gk'lFQ
+j5].XiS`YOhVI#CgY1?5f@SU(eC;sqdEp4bcHXSVb/q`Ga2Z*:_ns:,^q[Us]Y(kf\[],W[^EKK
+Za-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ$LSt2C@S!ob4R$X,(Q'@MsP*1rhO,o<\NJrgSMM[1G
+Lkg_>L&Zi+K)pRTrdY$!If=a(I!^3dH?ja[GB\4RFoHI`F)q8"#B4U"DJj<.D#S2OC2%D]BEDgY
+B)Z?CA7K-K@fKm:@/aO5?N4=0>lIt->5MJ%=T)=r<r5nn<:j,d;Ys>b;#=&b:?,(G:Ado_;#X>j
+;Ya8j<;fhl<rH+t=SGtr>5MP!>l@t,?M\%-@/aU3@fBm:AG]s;B)ZH>B`2ZCC@c5jD"hf>DZ"GN
+E;+AMEr'k6FRsYPG56@]GlN'eHN/?lI/\QoIK4lsJ,t4Qrdt6)L&QfiLPUeDMMmFPNK0'\Ocklk
+Pa.N"Q^F20S"#q>StD[LTqeEZV5C/gW2ckuXKAV-YHY79ZEpmE[C*HO\%)FJ#J.OZ]Y(qk^AYhH
+^];4L_Z%IQ`;R[S`rF*VaT'B]b5BH_bl5lccMu5jd/DAldf7epe,n1Of)F;$fDsV(gAfn-h#?.0
+h>lI4i;_a9ir7sCjQ5Lck3(pkrojLLlg+Q:!q#FDrpKpXnaZVLs766_rUp3as7cHds7uZjqtpBj
+r;H3cJcCB&J,~>
+JcC<$JcFI(m/Hk[qu$0br;-Bfq=sp_rq?6^s7H<^rUU!Ys7$!Us6]mSrp9[N!:'RJ!U/_Gk'lFQ
+j5].XiS`YOhVI#CgY1?5f@SU(eC;sqdEp4bcHXSVb/q`Ga2Z*:_ns:,^q[Us]Y(kf\[],W[^EKK
+Za-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ$LSt2C@S!ob4R$X,(Q'@MsP*1rhO,o<\NJrgSMM[1G
+Lkg_>L&Zi+K)pRTrdY$!If=a(I!^3dH?ja[GB\4RFoHI`F)q8"#B4U"DJj<.D#S2OC2%D]BEDgY
+B)Z?CA7K-K@fKm:@/aO5?N4=0>lIt->5MJ%=T)=r<r5nn<:j,d;Ys>b;#=&b:?,(G:Ado_;#X>j
+;Ya8j<;fhl<rH+t=SGtr>5MP!>l@t,?M\%-@/aU3@fBm:AG]s;B)ZH>B`2ZCC@c5jD"hf>DZ"GN
+E;+AMEr'k6FRsYPG56@]GlN'eHN/?lI/\QoIK4lsJ,t4Qrdt6)L&QfiLPUeDMMmFPNK0'\Ocklk
+Pa.N"Q^F20S"#q>StD[LTqeEZV5C/gW2ckuXKAV-YHY79ZEpmE[C*HO\%)FJ#J.OZ]Y(qk^AYhH
+^];4L_Z%IQ`;R[S`rF*VaT'B]b5BH_bl5lccMu5jd/DAldf7epe,n1Of)F;$fDsV(gAfn-h#?.0
+h>lI4i;_a9ir7sCjQ5Lck3(pkrojLLlg+Q:!q#FDrpKpXnaZVLs766_rUp3as7cHds7uZjqtpBj
+r;H3cJcCB&J,~>
+JcC<$JcFI(m/Hk[qu$0br;-Bfq=sp_rq?6^s7H<^rUU!Ys7$!Us6]mSrp9[N!:'RJ!U/_Gk'lFQ
+j5].XiS`YOhVI#CgY1?5f@SU(eC;sqdEp4bcHXSVb/q`Ga2Z*:_ns:,^q[Us]Y(kf\[],W[^EKK
+Za-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ$LSt2C@S!ob4R$X,(Q'@MsP*1rhO,o<\NJrgSMM[1G
+Lkg_>L&Zi+K)pRTrdY$!If=a(I!^3dH?ja[GB\4RFoHI`F)q8"#B4U"DJj<.D#S2OC2%D]BEDgY
+B)Z?CA7K-K@fKm:@/aO5?N4=0>lIt->5MJ%=T)=r<r5nn<:j,d;Ys>b;#=&b:?,(G:Ado_;#X>j
+;Ya8j<;fhl<rH+t=SGtr>5MP!>l@t,?M\%-@/aU3@fBm:AG]s;B)ZH>B`2ZCC@c5jD"hf>DZ"GN
+E;+AMEr'k6FRsYPG56@]GlN'eHN/?lI/\QoIK4lsJ,t4Qrdt6)L&QfiLPUeDMMmFPNK0'\Ocklk
+Pa.N"Q^F20S"#q>StD[LTqeEZV5C/gW2ckuXKAV-YHY79ZEpmE[C*HO\%)FJ#J.OZ]Y(qk^AYhH
+^];4L_Z%IQ`;R[S`rF*VaT'B]b5BH_bl5lccMu5jd/DAldf7epe,n1Of)F;$fDsV(gAfn-h#?.0
+h>lI4i;_a9ir7sCjQ5Lck3(pkrojLLlg+Q:!q#FDrpKpXnaZVLs766_rUp3as7cHds7uZjqtpBj
+r;H3cJcCB&J,~>
+JcC<$JcFF'm/Hk[qY^'arVHHfq=ss`rV$0^rq-6^r:9mXs7$$Vs6]mSrp9[N!:'RJ!U/_Gk'Q4N
+j5].Xi8EMLh;-l@g=k64f@SU(eC;spdEp4bcHXPUb/q`Ga2Q$9_ns:,^V@Lr]Y(kf\[f2X[^EKK
+Za-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ$LSt2C@S!ob5R$a5+Q'IStP*1rhOH5H_NJrgSMi*@J
+Lkkta!JQ4+K)pRTrdY$!If=`rI!bj=!I8qhG78Y;F`__HF)l8?E,]apD?k#pChmg$C2*Z\s(;=D
+ral+?!+Yt:!b#JErEoS2s'>S.r`fD+qcWl"rE&_oqGmAkoi(`cr)*/aqbR&`kY:nKr(m)ar_`Vl
+q,@5kr`/_orE&o!p0%;sqcii#r*B8-qHs50rF,S4raYq<qdob=rb)(@rFu1En8$Niq/,eBrGVUQ
+pi61OqfD(FlZN#Hpil^^rd"Hgs*OcnrI"`rIt.HJ#(_AXK7ei2re<CfLl$tGMi<USNfT6_Ockll
+Q'IZ%R$a>3S"-%@T:hmOU8+N\VPg>jWN*##Xf\b0YctC<Za7$HrjE$?\@K/]]"@sS!kl=^rkJKK
+!5\WNs24lTr5J]Us2Y#Xs2k8_r6,)`s3:Jes3L_lrR(Yns3pqrs4./#rn%2&!87A*s4[P/rn[V2
+!8me6s5<t;ro4(@jlQL(#Nt=7l07Kuli-8Nm/ZSRn,MkWnbr"[oCV\Rp&Facp\jmdq>^<fqu6Nk
+rUTr=s+C?%~>
+JcC<$JcFF'm/Hk[qY^'arVHHfq=ss`rV$0^rq-6^r:9mXs7$$Vs6]mSrp9[N!:'RJ!U/_Gk'Q4N
+j5].Xi8EMLh;-l@g=k64f@SU(eC;spdEp4bcHXPUb/q`Ga2Q$9_ns:,^V@Lr]Y(kf\[f2X[^EKK
+Za-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ$LSt2C@S!ob5R$a5+Q'IStP*1rhOH5H_NJrgSMi*@J
+Lkkta!JQ4+K)pRTrdY$!If=`rI!bj=!I8qhG78Y;F`__HF)l8?E,]apD?k#pChmg$C2*Z\s(;=D
+ral+?!+Yt:!b#JErEoS2s'>S.r`fD+qcWl"rE&_oqGmAkoi(`cr)*/aqbR&`kY:nKr(m)ar_`Vl
+q,@5kr`/_orE&o!p0%;sqcii#r*B8-qHs50rF,S4raYq<qdob=rb)(@rFu1En8$Niq/,eBrGVUQ
+pi61OqfD(FlZN#Hpil^^rd"Hgs*OcnrI"`rIt.HJ#(_AXK7ei2re<CfLl$tGMi<USNfT6_Ockll
+Q'IZ%R$a>3S"-%@T:hmOU8+N\VPg>jWN*##Xf\b0YctC<Za7$HrjE$?\@K/]]"@sS!kl=^rkJKK
+!5\WNs24lTr5J]Us2Y#Xs2k8_r6,)`s3:Jes3L_lrR(Yns3pqrs4./#rn%2&!87A*s4[P/rn[V2
+!8me6s5<t;ro4(@jlQL(#Nt=7l07Kuli-8Nm/ZSRn,MkWnbr"[oCV\Rp&Facp\jmdq>^<fqu6Nk
+rUTr=s+C?%~>
+JcC<$JcFF'm/Hk[qY^'arVHHfq=ss`rV$0^rq-6^r:9mXs7$$Vs6]mSrp9[N!:'RJ!U/_Gk'Q4N
+j5].Xi8EMLh;-l@g=k64f@SU(eC;spdEp4bcHXPUb/q`Ga2Q$9_ns:,^V@Lr]Y(kf\[f2X[^EKK
+Za-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ$LSt2C@S!ob5R$a5+Q'IStP*1rhOH5H_NJrgSMi*@J
+Lkkta!JQ4+K)pRTrdY$!If=`rI!bj=!I8qhG78Y;F`__HF)l8?E,]apD?k#pChmg$C2*Z\s(;=D
+ral+?!+Yt:!b#JErEoS2s'>S.r`fD+qcWl"rE&_oqGmAkoi(`cr)*/aqbR&`kY:nKr(m)ar_`Vl
+q,@5kr`/_orE&o!p0%;sqcii#r*B8-qHs50rF,S4raYq<qdob=rb)(@rFu1En8$Niq/,eBrGVUQ
+pi61OqfD(FlZN#Hpil^^rd"Hgs*OcnrI"`rIt.HJ#(_AXK7ei2re<CfLl$tGMi<USNfT6_Ockll
+Q'IZ%R$a>3S"-%@T:hmOU8+N\VPg>jWN*##Xf\b0YctC<Za7$HrjE$?\@K/]]"@sS!kl=^rkJKK
+!5\WNs24lTr5J]Us2Y#Xs2k8_r6,)`s3:Jes3L_lrR(Yns3pqrs4./#rn%2&!87A*s4[P/rn[V2
+!8me6s5<t;ro4(@jlQL(#Nt=7l07Kuli-8Nm/ZSRn,MkWnbr"[oCV\Rp&Facp\jmdq>^<fqu6Nk
+rUTr=s+C?%~>
+JcC<$JcFC&m/HhZqu$0br;-?eq=ss`rq?6^s7H<^rUU!Ys7$$Vs6]mSrp9[N!:'RJ!U/_Gk#CI'
+j5].Xi8EMLh;-l@g=k64f@SU(eC2jndEp4bcHOJTb/q`G`l5p8_ns:,^V@Lr]Y(kf\[f5Y[^EKK
+Za-j?Yck43XfSS'Wi;qpVl$;dUna[`TadZeSt;LCS"#k7R$a5+rfmtXPEM)kOH5H_NfB!VMi.Lj
++,G],L4t>7K7ec,JUi9#IXZ]nI!^3dH?jd\GB\4RFoHI`F)q8"#B4U"DJj<.D#S2OC2%D]BEDgY
+B)Z?CA7K-K@fKm:@/XI4?N4=/>lS%->5MJ$=Su7o<r,hn<:s2f;Z'Dc;#=&`:@M!R:A[i^;#O8j
+;Ya8i<;fhm<r?%s=S>nq>5MOu>l@t,?MRt-@/aU3@fBm:AG]s;B)QB=B`2ZCC?o[1D!Ys1D#/#B
+DZ+MOE;4GNEr0qJFRF;EG4p.YGlE!dHN/?lI/SHpIXckHJ3ng=JqJ]/KnY89LPUeDMMmFPNK0'\
+OHG]hPE_>tQ^F/.R[]h<St;RITq\<XUnsueW2ZesX/rG+YHY79ZEpmE[JmTB\%&uZ]">Se]Y2"m
+rkJKK!5\WNs24lTrPefVrl=rXs2k8_r6,)`rltDerm1Vkr6bPms3pqr!nGlQrRV,'g"HAYs4[P/
+rS7P3hr"Fk!TE&;j8\0?jo4EBk5a`FklU/9li-5PmI'EAmfN"Knc&+ZoDeI]o`4^bp\jmeq>U6f
+qu-HjrU^#>s+:9$~>
+JcC<$JcFC&m/HhZqu$0br;-?eq=ss`rq?6^s7H<^rUU!Ys7$$Vs6]mSrp9[N!:'RJ!U/_Gk#CI'
+j5].Xi8EMLh;-l@g=k64f@SU(eC2jndEp4bcHOJTb/q`G`l5p8_ns:,^V@Lr]Y(kf\[f5Y[^EKK
+Za-j?Yck43XfSS'Wi;qpVl$;dUna[`TadZeSt;LCS"#k7R$a5+rfmtXPEM)kOH5H_NfB!VMi.Lj
++,G],L4t>7K7ec,JUi9#IXZ]nI!^3dH?jd\GB\4RFoHI`F)q8"#B4U"DJj<.D#S2OC2%D]BEDgY
+B)Z?CA7K-K@fKm:@/XI4?N4=/>lS%->5MJ$=Su7o<r,hn<:s2f;Z'Dc;#=&`:@M!R:A[i^;#O8j
+;Ya8i<;fhm<r?%s=S>nq>5MOu>l@t,?MRt-@/aU3@fBm:AG]s;B)QB=B`2ZCC?o[1D!Ys1D#/#B
+DZ+MOE;4GNEr0qJFRF;EG4p.YGlE!dHN/?lI/SHpIXckHJ3ng=JqJ]/KnY89LPUeDMMmFPNK0'\
+OHG]hPE_>tQ^F/.R[]h<St;RITq\<XUnsueW2ZesX/rG+YHY79ZEpmE[JmTB\%&uZ]">Se]Y2"m
+rkJKK!5\WNs24lTrPefVrl=rXs2k8_r6,)`rltDerm1Vkr6bPms3pqr!nGlQrRV,'g"HAYs4[P/
+rS7P3hr"Fk!TE&;j8\0?jo4EBk5a`FklU/9li-5PmI'EAmfN"Knc&+ZoDeI]o`4^bp\jmeq>U6f
+qu-HjrU^#>s+:9$~>
+JcC<$JcFC&m/HhZqu$0br;-?eq=ss`rq?6^s7H<^rUU!Ys7$$Vs6]mSrp9[N!:'RJ!U/_Gk#CI'
+j5].Xi8EMLh;-l@g=k64f@SU(eC2jndEp4bcHOJTb/q`G`l5p8_ns:,^V@Lr]Y(kf\[f5Y[^EKK
+Za-j?Yck43XfSS'Wi;qpVl$;dUna[`TadZeSt;LCS"#k7R$a5+rfmtXPEM)kOH5H_NfB!VMi.Lj
++,G],L4t>7K7ec,JUi9#IXZ]nI!^3dH?jd\GB\4RFoHI`F)q8"#B4U"DJj<.D#S2OC2%D]BEDgY
+B)Z?CA7K-K@fKm:@/XI4?N4=/>lS%->5MJ$=Su7o<r,hn<:s2f;Z'Dc;#=&`:@M!R:A[i^;#O8j
+;Ya8i<;fhm<r?%s=S>nq>5MOu>l@t,?MRt-@/aU3@fBm:AG]s;B)QB=B`2ZCC?o[1D!Ys1D#/#B
+DZ+MOE;4GNEr0qJFRF;EG4p.YGlE!dHN/?lI/SHpIXckHJ3ng=JqJ]/KnY89LPUeDMMmFPNK0'\
+OHG]hPE_>tQ^F/.R[]h<St;RITq\<XUnsueW2ZesX/rG+YHY79ZEpmE[JmTB\%&uZ]">Se]Y2"m
+rkJKK!5\WNs24lTrPefVrl=rXs2k8_r6,)`rltDerm1Vkr6bPms3pqr!nGlQrRV,'g"HAYs4[P/
+rS7P3hr"Fk!TE&;j8\0?jo4EBk5a`FklU/9li-5PmI'EAmfN"Knc&+ZoDeI]o`4^bp\jmeq>U6f
+qu-HjrU^#>s+:9$~>
+JcC<$JcF@%li-bZqY^'ar;-Bfq=sp_rq?9_rq-6^rUU!Ys7$$Vs6]mSrp9[N<U/i5kih3lk2k[b
+j5].Xi8EMLh;-l@g=k64f@JL%eC2jndEp1ac-4ASb/q`F`l5p8_ns:+^V@Lr]Y(kf\[f5Z[^EKK
+Za-j?Yck43XfSS'Wi;rrV^&(8Unjc[TqS-OSt;LCS"#k7R@'A.QBd`"PEM)kOcYWbNfF$s$B'du
+M26qBL5(D8rdt6'Jc:0#It%BF!IT7nH3&;9rc\coF`heJF)l;@EH#l8rb_sXCi!m&C2.J^B`D]F
+B)ZBAAH-0=@fKm:@/XI4?N4=/>lIt,>5DD#=Su7n<r,hn<;0>h;Z'Dc;#3uL:A[i^;#O8i;Ya8i
+<;fhm<r?%s=S>np>5MOu>l7n+?M\%.@/XO2@fBm:AG]s;B)QB=B`2ZBC<:8dD#8)DDZ+MOE;=MO
+Er:"MFS0eHG4TqVGlE!cHN/?lI/SKnIfFosJ4kHFJqJ]/KnY89LPUeDMMd=NN/`jYOHG]hPE_>t
+QC!u,R[]e:St;RITqS6WUnsrdW2ZesX/rG*YHY79ZEpmE[C3NQ\%&uZ]"@sS#edsd^V@S"_86,f
+s24lTrPefVs2Y&Ys2k8_r6,)`rltAds3L\krR(Vms3pqrs4./#rn%2&s4RD*s4[P/rn[V2s53h6
+!o`.uro4%?jo4EBk5a`Fl2U#Kli-8Nm/ZSRn,MnWnc&+Zo)SF]p&Facp\agdq>U6fqu-HkrUTr=
+s+:9$~>
+JcC<$JcF@%li-bZqY^'ar;-Bfq=sp_rq?9_rq-6^rUU!Ys7$$Vs6]mSrp9[N<U/i5kih3lk2k[b
+j5].Xi8EMLh;-l@g=k64f@JL%eC2jndEp1ac-4ASb/q`F`l5p8_ns:+^V@Lr]Y(kf\[f5Z[^EKK
+Za-j?Yck43XfSS'Wi;rrV^&(8Unjc[TqS-OSt;LCS"#k7R@'A.QBd`"PEM)kOcYWbNfF$s$B'du
+M26qBL5(D8rdt6'Jc:0#It%BF!IT7nH3&;9rc\coF`heJF)l;@EH#l8rb_sXCi!m&C2.J^B`D]F
+B)ZBAAH-0=@fKm:@/XI4?N4=/>lIt,>5DD#=Su7n<r,hn<;0>h;Z'Dc;#3uL:A[i^;#O8i;Ya8i
+<;fhm<r?%s=S>np>5MOu>l7n+?M\%.@/XO2@fBm:AG]s;B)QB=B`2ZBC<:8dD#8)DDZ+MOE;=MO
+Er:"MFS0eHG4TqVGlE!cHN/?lI/SKnIfFosJ4kHFJqJ]/KnY89LPUeDMMd=NN/`jYOHG]hPE_>t
+QC!u,R[]e:St;RITqS6WUnsrdW2ZesX/rG*YHY79ZEpmE[C3NQ\%&uZ]"@sS#edsd^V@S"_86,f
+s24lTrPefVs2Y&Ys2k8_r6,)`rltAds3L\krR(Vms3pqrs4./#rn%2&s4RD*s4[P/rn[V2s53h6
+!o`.uro4%?jo4EBk5a`Fl2U#Kli-8Nm/ZSRn,MnWnc&+Zo)SF]p&Facp\agdq>U6fqu-HkrUTr=
+s+:9$~>
+JcC<$JcF@%li-bZqY^'ar;-Bfq=sp_rq?9_rq-6^rUU!Ys7$$Vs6]mSrp9[N<U/i5kih3lk2k[b
+j5].Xi8EMLh;-l@g=k64f@JL%eC2jndEp1ac-4ASb/q`F`l5p8_ns:+^V@Lr]Y(kf\[f5Z[^EKK
+Za-j?Yck43XfSS'Wi;rrV^&(8Unjc[TqS-OSt;LCS"#k7R@'A.QBd`"PEM)kOcYWbNfF$s$B'du
+M26qBL5(D8rdt6'Jc:0#It%BF!IT7nH3&;9rc\coF`heJF)l;@EH#l8rb_sXCi!m&C2.J^B`D]F
+B)ZBAAH-0=@fKm:@/XI4?N4=/>lIt,>5DD#=Su7n<r,hn<;0>h;Z'Dc;#3uL:A[i^;#O8i;Ya8i
+<;fhm<r?%s=S>np>5MOu>l7n+?M\%.@/XO2@fBm:AG]s;B)QB=B`2ZBC<:8dD#8)DDZ+MOE;=MO
+Er:"MFS0eHG4TqVGlE!cHN/?lI/SKnIfFosJ4kHFJqJ]/KnY89LPUeDMMd=NN/`jYOHG]hPE_>t
+QC!u,R[]e:St;RITqS6WUnsrdW2ZesX/rG*YHY79ZEpmE[C3NQ\%&uZ]"@sS#edsd^V@S"_86,f
+s24lTrPefVs2Y&Ys2k8_r6,)`rltAds3L\krR(Vms3pqrs4./#rn%2&s4RD*s4[P/rn[V2s53h6
+!o`.uro4%?jo4EBk5a`Fl2U#Kli-8Nm/ZSRn,MnWnc&+Zo)SF]p&Facp\agdq>U6fqu-HkrUTr=
+s+:9$~>
+JcC<$JcF=$li-_Yqu$0br;-?eq=ss`rq?9_rq-6^rUU!Ys7$$Vs6]mSrp1$YlK[Wukih3lk2k\'
+j'q$,i8EMLh;-l@g=k63f@JL%eC2jndEg+`c-4ASb/hZE`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN
+Za6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OT:VXFS=?":R@'A.QN!-QP`q8nOc]R'$BC+)N/NRN
+M2@%Dre;>FKS+o/Jq8H&It)oqI=-EhH?sj^G^"@TG'3e+!HW;\E<1#srbhaQ!,VXM!buF`rb)@G
+AnM$R!b>eNrF,h:?srq?ra,V1r*95*r`],#r)ihtoiCriqc*;gr)3GipJCZ]lq[CQpJCfcrDNGi
+rD`_qq,[Dpr)iVpqc`l$p0@Q%rEf;,ra>_6qdTP7rabk:rau.Bq.T\?r+a5eq/#tGpMTqJrG_RP
+rGqgWolTtOoQK\Ir-80cqg/9hrd=Zms*artrI=p"K)UE&KLCNKL51S@M2@+JN/WaVO,oBbP*2&p
+Q'Rc(R$jG5S=Q7DTV8'RUSO``Vl-JnWiN5'Xfek3Z*L^B['d?N\%&rY\[oEP]E,^[rkANM_86,f
+s2+iTrPefVs2Y&Ys2k8_r6,)`rltAdrm1Vkr6bPmrmUhqs4./#rR_)%!87>)s4[P/rS7P3hr"Fk
+!o`.uro4(@jlQL(!pAe2rojLLlg+Q:!q#FDrpTmV!:g$Y!qZ'VrUp3as7cKerqZQiqtp?irVc<d
+JcC?%J,~>
+JcC<$JcF=$li-_Yqu$0br;-?eq=ss`rq?9_rq-6^rUU!Ys7$$Vs6]mSrp1$YlK[Wukih3lk2k\'
+j'q$,i8EMLh;-l@g=k63f@JL%eC2jndEg+`c-4ASb/hZE`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN
+Za6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OT:VXFS=?":R@'A.QN!-QP`q8nOc]R'$BC+)N/NRN
+M2@%Dre;>FKS+o/Jq8H&It)oqI=-EhH?sj^G^"@TG'3e+!HW;\E<1#srbhaQ!,VXM!buF`rb)@G
+AnM$R!b>eNrF,h:?srq?ra,V1r*95*r`],#r)ihtoiCriqc*;gr)3GipJCZ]lq[CQpJCfcrDNGi
+rD`_qq,[Dpr)iVpqc`l$p0@Q%rEf;,ra>_6qdTP7rabk:rau.Bq.T\?r+a5eq/#tGpMTqJrG_RP
+rGqgWolTtOoQK\Ir-80cqg/9hrd=Zms*artrI=p"K)UE&KLCNKL51S@M2@+JN/WaVO,oBbP*2&p
+Q'Rc(R$jG5S=Q7DTV8'RUSO``Vl-JnWiN5'Xfek3Z*L^B['d?N\%&rY\[oEP]E,^[rkANM_86,f
+s2+iTrPefVs2Y&Ys2k8_r6,)`rltAdrm1Vkr6bPmrmUhqs4./#rR_)%!87>)s4[P/rS7P3hr"Fk
+!o`.uro4(@jlQL(!pAe2rojLLlg+Q:!q#FDrpTmV!:g$Y!qZ'VrUp3as7cKerqZQiqtp?irVc<d
+JcC?%J,~>
+JcC<$JcF=$li-_Yqu$0br;-?eq=ss`rq?9_rq-6^rUU!Ys7$$Vs6]mSrp1$YlK[Wukih3lk2k\'
+j'q$,i8EMLh;-l@g=k63f@JL%eC2jndEg+`c-4ASb/hZE`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN
+Za6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OT:VXFS=?":R@'A.QN!-QP`q8nOc]R'$BC+)N/NRN
+M2@%Dre;>FKS+o/Jq8H&It)oqI=-EhH?sj^G^"@TG'3e+!HW;\E<1#srbhaQ!,VXM!buF`rb)@G
+AnM$R!b>eNrF,h:?srq?ra,V1r*95*r`],#r)ihtoiCriqc*;gr)3GipJCZ]lq[CQpJCfcrDNGi
+rD`_qq,[Dpr)iVpqc`l$p0@Q%rEf;,ra>_6qdTP7rabk:rau.Bq.T\?r+a5eq/#tGpMTqJrG_RP
+rGqgWolTtOoQK\Ir-80cqg/9hrd=Zms*artrI=p"K)UE&KLCNKL51S@M2@+JN/WaVO,oBbP*2&p
+Q'Rc(R$jG5S=Q7DTV8'RUSO``Vl-JnWiN5'Xfek3Z*L^B['d?N\%&rY\[oEP]E,^[rkANM_86,f
+s2+iTrPefVs2Y&Ys2k8_r6,)`rltAdrm1Vkr6bPmrmUhqs4./#rR_)%!87>)s4[P/rS7P3hr"Fk
+!o`.uro4(@jlQL(!pAe2rojLLlg+Q:!q#FDrpTmV!:g$Y!qZ'VrUp3as7cKerqZQiqtp?irVc<d
+JcC?%J,~>
+JcC<$JcF:#li-_YqY^'ar;-?eqY:'arq?6^s7H?_rUU!Ys7$$Vs6]mSrp10]lK[Wuki_-kk2k[a
+j5T%si(;h_h;$c=g=b-1f@JL%eC2jnd*L"_c-4ASaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN
+Za6sBYct=6Xf\\*WiE%sVl-DgrhL=)U7n9RT:VXFS=?":R[KP1Q^3o%P`u*0"d+n-O,f5!N":i(
+M2@%ELPCP;KS4u1Jq<oO!IoRtI0"_Brd"TjGlDmfG'3e+#BOp+EH,r:DuOVTD/B2es(VOJrb2=E
+!+u4As().>raPn9s'Yb3s'G_2qcs,)rEB#"qcN_soiCujr)EDhrDNPjp/(KZp.k?Xp/(]brDNGi
+rD`_qq,[Dpr)iVpqHEc#p0@N$rEf>-rF#V5qdTP7rabn;rFZ%Aq.T\?qeF)cqeZ1Iphp%KrG_RP
+rGqgWp2p.RpNGtKqfr$aqKi0grd=Zms*jutrdb$"!.t3&s+F.$L5(J>Ll$tGMi<USNfT6_Ocklk
+Pa.N#R$a;1S"#t?StD[LU8+N[VPg>jWN*##Xf\b0YctC<Za@-K[^WcV\[f;`]Y(qk^;%Fu^qp#e
+s2+iTrPefVs2Y)ZrlP2_r6,)`rltAdrm1Sjr6bPmrmUhqs4./#rR_)%s4RA)!o)Mcrn[V2s53h6
+!o`.uro=%>!9O4Bs5sCGrosIJ!:0XNs6TgSrpTmVs7-*Zs7?9_rq6<brqHBdrqZTjqtp?ir;H3c
+JcC?%J,~>
+JcC<$JcF:#li-_YqY^'ar;-?eqY:'arq?6^s7H?_rUU!Ys7$$Vs6]mSrp10]lK[Wuki_-kk2k[a
+j5T%si(;h_h;$c=g=b-1f@JL%eC2jnd*L"_c-4ASaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN
+Za6sBYct=6Xf\\*WiE%sVl-DgrhL=)U7n9RT:VXFS=?":R[KP1Q^3o%P`u*0"d+n-O,f5!N":i(
+M2@%ELPCP;KS4u1Jq<oO!IoRtI0"_Brd"TjGlDmfG'3e+#BOp+EH,r:DuOVTD/B2es(VOJrb2=E
+!+u4As().>raPn9s'Yb3s'G_2qcs,)rEB#"qcN_soiCujr)EDhrDNPjp/(KZp.k?Xp/(]brDNGi
+rD`_qq,[Dpr)iVpqHEc#p0@N$rEf>-rF#V5qdTP7rabn;rFZ%Aq.T\?qeF)cqeZ1Iphp%KrG_RP
+rGqgWp2p.RpNGtKqfr$aqKi0grd=Zms*jutrdb$"!.t3&s+F.$L5(J>Ll$tGMi<USNfT6_Ocklk
+Pa.N#R$a;1S"#t?StD[LU8+N[VPg>jWN*##Xf\b0YctC<Za@-K[^WcV\[f;`]Y(qk^;%Fu^qp#e
+s2+iTrPefVs2Y)ZrlP2_r6,)`rltAdrm1Sjr6bPmrmUhqs4./#rR_)%s4RA)!o)Mcrn[V2s53h6
+!o`.uro=%>!9O4Bs5sCGrosIJ!:0XNs6TgSrpTmVs7-*Zs7?9_rq6<brqHBdrqZTjqtp?ir;H3c
+JcC?%J,~>
+JcC<$JcF:#li-_YqY^'ar;-?eqY:'arq?6^s7H?_rUU!Ys7$$Vs6]mSrp10]lK[Wuki_-kk2k[a
+j5T%si(;h_h;$c=g=b-1f@JL%eC2jnd*L"_c-4ASaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN
+Za6sBYct=6Xf\\*WiE%sVl-DgrhL=)U7n9RT:VXFS=?":R[KP1Q^3o%P`u*0"d+n-O,f5!N":i(
+M2@%ELPCP;KS4u1Jq<oO!IoRtI0"_Brd"TjGlDmfG'3e+#BOp+EH,r:DuOVTD/B2es(VOJrb2=E
+!+u4As().>raPn9s'Yb3s'G_2qcs,)rEB#"qcN_soiCujr)EDhrDNPjp/(KZp.k?Xp/(]brDNGi
+rD`_qq,[Dpr)iVpqHEc#p0@N$rEf>-rF#V5qdTP7rabn;rFZ%Aq.T\?qeF)cqeZ1Iphp%KrG_RP
+rGqgWp2p.RpNGtKqfr$aqKi0grd=Zms*jutrdb$"!.t3&s+F.$L5(J>Ll$tGMi<USNfT6_Ocklk
+Pa.N#R$a;1S"#t?StD[LU8+N[VPg>jWN*##Xf\b0YctC<Za@-K[^WcV\[f;`]Y(qk^;%Fu^qp#e
+s2+iTrPefVs2Y)ZrlP2_r6,)`rltAdrm1Sjr6bPmrmUhqs4./#rR_)%s4RA)!o)Mcrn[V2s53h6
+!o`.uro=%>!9O4Bs5sCGrosIJ!:0XNs6TgSrpTmVs7-*Zs7?9_rq6<brqHBdrqZTjqtp?ir;H3c
+JcC?%J,~>
+JcC<$JcF7"lMgYYqY^$`r;-Bfq=ss`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#Kki_s-J*#bO
+j5T%Ui8<DIh;$c=g=b-1f@JL%e'cXkd*L"_c-4ARaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN
+Za6sBYct=6Xf\\+X/`2!W2HPjV50o^U7n9RTV%gISXc1=R[KP1Q^=#'Q'@JqP*(ifO,o<\N/W[Q
+MM[1GL]3#/KnTGX)M3NjJ:E&tI=6KjH[:!`H$FOWG'8"MFE;MDrc%sXDuOVUD/=%fCBA6bC&VcI
+B4bcTAcH9@A,Tm:@K0a5?iOI3?2In+>Q%b"=o;D!=7oVl<W,nk;uKVl;>!cM:\@Q^;>jDg;uK\o
+<V]\n=8Z1n=o)=u>P;>"?2\+*?iFI4@JaO4A,^$9Ac?<?BDH6=C&2S`C\qrHD>8#JDuFYNEW'qV
+F80kSFnp4KGPQL]H22dcHiAEkIK"ZqJ,OotJH1<$K2@5TKnb>;LPUeDMMmFPNK0'\OHG]hPE_>t
+QC!u,R[]e:SXuIHTqS6WUnsrdW2ZesX0&M,YHY79ZEpmE[^NZT\@K/]]=bei^:q@s^qmkd_?.Wn
+`;[aU`rF*XaT'B^b5BH^bl5lbcMl/hd/;;jdf7eoeGn)!f)4/"f`0Y(gAfq-h#?.0hZ)L4i;_a9
+ir8!<j8e<@k5XTEkl0iHlMp2LliQSBmf)\Tn,W"Wo)J:]o_nI_pAambq#C0hqYU0gr;?Nardk*$
+s*t~>
+JcC<$JcF7"lMgYYqY^$`r;-Bfq=ss`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#Kki_s-J*#bO
+j5T%Ui8<DIh;$c=g=b-1f@JL%e'cXkd*L"_c-4ARaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN
+Za6sBYct=6Xf\\+X/`2!W2HPjV50o^U7n9RTV%gISXc1=R[KP1Q^=#'Q'@JqP*(ifO,o<\N/W[Q
+MM[1GL]3#/KnTGX)M3NjJ:E&tI=6KjH[:!`H$FOWG'8"MFE;MDrc%sXDuOVUD/=%fCBA6bC&VcI
+B4bcTAcH9@A,Tm:@K0a5?iOI3?2In+>Q%b"=o;D!=7oVl<W,nk;uKVl;>!cM:\@Q^;>jDg;uK\o
+<V]\n=8Z1n=o)=u>P;>"?2\+*?iFI4@JaO4A,^$9Ac?<?BDH6=C&2S`C\qrHD>8#JDuFYNEW'qV
+F80kSFnp4KGPQL]H22dcHiAEkIK"ZqJ,OotJH1<$K2@5TKnb>;LPUeDMMmFPNK0'\OHG]hPE_>t
+QC!u,R[]e:SXuIHTqS6WUnsrdW2ZesX0&M,YHY79ZEpmE[^NZT\@K/]]=bei^:q@s^qmkd_?.Wn
+`;[aU`rF*XaT'B^b5BH^bl5lbcMl/hd/;;jdf7eoeGn)!f)4/"f`0Y(gAfq-h#?.0hZ)L4i;_a9
+ir8!<j8e<@k5XTEkl0iHlMp2LliQSBmf)\Tn,W"Wo)J:]o_nI_pAambq#C0hqYU0gr;?Nardk*$
+s*t~>
+JcC<$JcF7"lMgYYqY^$`r;-Bfq=ss`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#Kki_s-J*#bO
+j5T%Ui8<DIh;$c=g=b-1f@JL%e'cXkd*L"_c-4ARaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN
+Za6sBYct=6Xf\\+X/`2!W2HPjV50o^U7n9RTV%gISXc1=R[KP1Q^=#'Q'@JqP*(ifO,o<\N/W[Q
+MM[1GL]3#/KnTGX)M3NjJ:E&tI=6KjH[:!`H$FOWG'8"MFE;MDrc%sXDuOVUD/=%fCBA6bC&VcI
+B4bcTAcH9@A,Tm:@K0a5?iOI3?2In+>Q%b"=o;D!=7oVl<W,nk;uKVl;>!cM:\@Q^;>jDg;uK\o
+<V]\n=8Z1n=o)=u>P;>"?2\+*?iFI4@JaO4A,^$9Ac?<?BDH6=C&2S`C\qrHD>8#JDuFYNEW'qV
+F80kSFnp4KGPQL]H22dcHiAEkIK"ZqJ,OotJH1<$K2@5TKnb>;LPUeDMMmFPNK0'\OHG]hPE_>t
+QC!u,R[]e:SXuIHTqS6WUnsrdW2ZesX0&M,YHY79ZEpmE[^NZT\@K/]]=bei^:q@s^qmkd_?.Wn
+`;[aU`rF*XaT'B^b5BH^bl5lbcMl/hd/;;jdf7eoeGn)!f)4/"f`0Y(gAfq-h#?.0hZ)L4i;_a9
+ir8!<j8e<@k5XTEkl0iHlMp2LliQSBmf)\Tn,W"Wo)J:]o_nI_pAambq#C0hqYU0gr;?Nardk*$
+s*t~>
+JcC<$JcF4!lMgVXqY^$`r;-BfqY:'arq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg$<ki_*jjlPR`
+j5T%Ui8<DIh;$c=g=b-1f@AC#e'cXkd*L"_bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN
+Za6sBrid<EY-"h-X/`2!W2HPjV59u`US=HUTV%gISXf\K(RgbZR$X,(Q'@MsP*1rhO,o<]NJrgS
+MZ/GCLkg_>KnY24K7\Z*J:N,urd=fpHiA<lH$K=4!HrVbF9cl-EcH)<Df>Vm!GuZPC]A,LC&VfG
+B)lQBAcH9@A,Tm:@K0a5?iFC3?2@h)>Q%b!=o2>!=8#\n<W#hk;uKVl;=[QT:\.E\;>a>f;uK\o
+<V]\n=8Z1m=o)=u>P;>"?2\+*?iFI3@JaO5A,^$9Ac66?BD?0<C&)M`C\qrHD>A)JDuFYOEW1"W
+F80kTFo-@OGPQL[H2)^aHiAEjIK+crJ,Om!JV&LQK+!?dKnb>;LPUeDMMqIm16%<TO-#KePE_>t
+QC!u+R@B\9SXuFGTqS3UUnsrdVl?\rX/rG+YHY79ZEpmE[C3QSrj`3D]=bei^AbkJ^qp#e!lMsp
+rl+oWs2Y,[s2k8_rQG2as3:Gdrm1Sjr6bMlrmUeps4./#r7Cu$s4RA)s4[P/rS@M1!8mb5!o`.u
+ro=%>!9O1A!pAe2rojLLlg+Q:s6TgSrpTmVs7-*Zs7?9_rUp3as7cKerqZQiqtp?irVc<dJcC<$
+J,~>
+JcC<$JcF4!lMgVXqY^$`r;-BfqY:'arq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg$<ki_*jjlPR`
+j5T%Ui8<DIh;$c=g=b-1f@AC#e'cXkd*L"_bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN
+Za6sBrid<EY-"h-X/`2!W2HPjV59u`US=HUTV%gISXf\K(RgbZR$X,(Q'@MsP*1rhO,o<]NJrgS
+MZ/GCLkg_>KnY24K7\Z*J:N,urd=fpHiA<lH$K=4!HrVbF9cl-EcH)<Df>Vm!GuZPC]A,LC&VfG
+B)lQBAcH9@A,Tm:@K0a5?iFC3?2@h)>Q%b!=o2>!=8#\n<W#hk;uKVl;=[QT:\.E\;>a>f;uK\o
+<V]\n=8Z1m=o)=u>P;>"?2\+*?iFI3@JaO5A,^$9Ac66?BD?0<C&)M`C\qrHD>A)JDuFYOEW1"W
+F80kTFo-@OGPQL[H2)^aHiAEjIK+crJ,Om!JV&LQK+!?dKnb>;LPUeDMMqIm16%<TO-#KePE_>t
+QC!u+R@B\9SXuFGTqS3UUnsrdVl?\rX/rG+YHY79ZEpmE[C3QSrj`3D]=bei^AbkJ^qp#e!lMsp
+rl+oWs2Y,[s2k8_rQG2as3:Gdrm1Sjr6bMlrmUeps4./#r7Cu$s4RA)s4[P/rS@M1!8mb5!o`.u
+ro=%>!9O1A!pAe2rojLLlg+Q:s6TgSrpTmVs7-*Zs7?9_rUp3as7cKerqZQiqtp?irVc<dJcC<$
+J,~>
+JcC<$JcF4!lMgVXqY^$`r;-BfqY:'arq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg$<ki_*jjlPR`
+j5T%Ui8<DIh;$c=g=b-1f@AC#e'cXkd*L"_bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN
+Za6sBrid<EY-"h-X/`2!W2HPjV59u`US=HUTV%gISXf\K(RgbZR$X,(Q'@MsP*1rhO,o<]NJrgS
+MZ/GCLkg_>KnY24K7\Z*J:N,urd=fpHiA<lH$K=4!HrVbF9cl-EcH)<Df>Vm!GuZPC]A,LC&VfG
+B)lQBAcH9@A,Tm:@K0a5?iFC3?2@h)>Q%b!=o2>!=8#\n<W#hk;uKVl;=[QT:\.E\;>a>f;uK\o
+<V]\n=8Z1m=o)=u>P;>"?2\+*?iFI3@JaO5A,^$9Ac66?BD?0<C&)M`C\qrHD>A)JDuFYOEW1"W
+F80kTFo-@OGPQL[H2)^aHiAEjIK+crJ,Om!JV&LQK+!?dKnb>;LPUeDMMqIm16%<TO-#KePE_>t
+QC!u+R@B\9SXuFGTqS3UUnsrdVl?\rX/rG+YHY79ZEpmE[C3QSrj`3D]=bei^AbkJ^qp#e!lMsp
+rl+oWs2Y,[s2k8_rQG2as3:Gdrm1Sjr6bMlrmUeps4./#r7Cu$s4RA)s4[P/rS@M1!8mb5!o`.u
+ro=%>!9O1A!pAe2rojLLlg+Q:s6TgSrpTmVs7-*Zs7?9_rUp3as7cKerqZQiqtp?irVc<dJcC<$
+J,~>
+JcC<$JcF-tlMgVXqY^'ar;-BfqY:'arq?9_s7H?_rUU!Ys7$$V&FSrQm-O'(lKRQski_*jjlHF$
+@H-8(i8<DIh;$c=g=Y$/f%&:"e'cXkd*L"^bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTO
+['R*EZ*:I9Y-"h-X/`2!WMl_mVPU)aUS=HUTV.pKSt2C@S!ocEQk#IKQ'IStP*1riOH5H_NW+kD
+Mi*@JLkgb?L4t<[K,T>mJ:N-!IXQWlH[C'bH$FRXGBS+OFEDSFErL%ZE,Y_n!c;airbDRMBkdQ[
+!bZ+Wral+?s'u":s'bq8r*TG0ra#A*r*0,'p0%8pr)`VnrDieqpf%)gr))0Er)*Djq,@2jrDiYo
+r)`btoi_)oqHNVtr*B8-qHs2/raG\5raYn;qdob=rFbq>qe>h?j(nF)m;)W9rGD@JrbqaSqJlLT
+rH%dVr,qp\o6:"TqK_d\rHnNkr-eQns*suts+(0%rI[^qKnY89LPL\BM2I4LN/WaVO,oBbP*2#n
+Q'I]'R$jD4S"6.BT:hmPUSO]^Vl-JmWiN5'Xfek3Z*L^B['d?N\%&uZ]">Vf]tXK\!PlPN_?%Qm
+rl+oWs2Y,[s2k;`r6,,arltAdrm1Sjr6bMlrmUeprmh&"r7Cu$s4RA)s4dS/rS@M1!8mb5s5<t;
+ro=%>s5j7B!pAe2rosIJ!:0XNs6]jSrpTmV!:g$Ys766_rUp3as7cHdrqZTjqYU6hrVc<dJcC<$
+J,~>
+JcC<$JcF-tlMgVXqY^'ar;-BfqY:'arq?9_s7H?_rUU!Ys7$$V&FSrQm-O'(lKRQski_*jjlHF$
+@H-8(i8<DIh;$c=g=Y$/f%&:"e'cXkd*L"^bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTO
+['R*EZ*:I9Y-"h-X/`2!WMl_mVPU)aUS=HUTV.pKSt2C@S!ocEQk#IKQ'IStP*1riOH5H_NW+kD
+Mi*@JLkgb?L4t<[K,T>mJ:N-!IXQWlH[C'bH$FRXGBS+OFEDSFErL%ZE,Y_n!c;airbDRMBkdQ[
+!bZ+Wral+?s'u":s'bq8r*TG0ra#A*r*0,'p0%8pr)`VnrDieqpf%)gr))0Er)*Djq,@2jrDiYo
+r)`btoi_)oqHNVtr*B8-qHs2/raG\5raYn;qdob=rFbq>qe>h?j(nF)m;)W9rGD@JrbqaSqJlLT
+rH%dVr,qp\o6:"TqK_d\rHnNkr-eQns*suts+(0%rI[^qKnY89LPL\BM2I4LN/WaVO,oBbP*2#n
+Q'I]'R$jD4S"6.BT:hmPUSO]^Vl-JmWiN5'Xfek3Z*L^B['d?N\%&uZ]">Vf]tXK\!PlPN_?%Qm
+rl+oWs2Y,[s2k;`r6,,arltAdrm1Sjr6bMlrmUeprmh&"r7Cu$s4RA)s4dS/rS@M1!8mb5s5<t;
+ro=%>s5j7B!pAe2rosIJ!:0XNs6]jSrpTmV!:g$Ys766_rUp3as7cHdrqZTjqYU6hrVc<dJcC<$
+J,~>
+JcC<$JcF-tlMgVXqY^'ar;-BfqY:'arq?9_s7H?_rUU!Ys7$$V&FSrQm-O'(lKRQski_*jjlHF$
+@H-8(i8<DIh;$c=g=Y$/f%&:"e'cXkd*L"^bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTO
+['R*EZ*:I9Y-"h-X/`2!WMl_mVPU)aUS=HUTV.pKSt2C@S!ocEQk#IKQ'IStP*1riOH5H_NW+kD
+Mi*@JLkgb?L4t<[K,T>mJ:N-!IXQWlH[C'bH$FRXGBS+OFEDSFErL%ZE,Y_n!c;airbDRMBkdQ[
+!bZ+Wral+?s'u":s'bq8r*TG0ra#A*r*0,'p0%8pr)`VnrDieqpf%)gr))0Er)*Djq,@2jrDiYo
+r)`btoi_)oqHNVtr*B8-qHs2/raG\5raYn;qdob=rFbq>qe>h?j(nF)m;)W9rGD@JrbqaSqJlLT
+rH%dVr,qp\o6:"TqK_d\rHnNkr-eQns*suts+(0%rI[^qKnY89LPL\BM2I4LN/WaVO,oBbP*2#n
+Q'I]'R$jD4S"6.BT:hmPUSO]^Vl-JmWiN5'Xfek3Z*L^B['d?N\%&uZ]">Vf]tXK\!PlPN_?%Qm
+rl+oWs2Y,[s2k;`r6,,arltAdrm1Sjr6bMlrmUeprmh&"r7Cu$s4RA)s4dS/rS@M1!8mb5s5<t;
+ro=%>s5j7B!pAe2rosIJ!:0XNs6]jSrpTmV!:g$Ys766_rUp3as7cHdrqZTjqYU6hrVc<dJcC<$
+J,~>
+JcC<$JcF*slMgVXq>Bs`r;-BfqY:'as7ZB`s7H?_rUU!Y!:]sU!Uf@Slr*07lKRQskND!ijlGI^
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkcd'h\bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(kg]",A]\$i`Q
+['R*EZ*:I9Y5YOFXK/A$WMl_mVPU,bUnaZXTqJ$LSt2FBS"#k7R$a5+rfmYOPEM)kOT(:JNfB!V
+Mi*CKM26rdL'iWfK7ec,JUi9#If=`rI!bj=!I8qhG6)l0rcA0^ErL%`E,TZ4DJa6,rbMOK!,;FG
+s(D@Dral+?s'u":s'bn7r*TG0ra#>)r*0)&p0%;qr)`YorDieqpf%)gr))BKqbd8hq,@5krDiVn
+r)`euoNCunq-3Msr*B8-q-X,/rF,S4raYq<qITY<rFbn=qe>e>mq_0&nn\/>rGDCKrGV[Sqf2RT
+rc@mWrH8'^olp7WqK_a[r-SBiqgJHms*suts+13%re(6(!/:E,:PXa^M2@+JMi<USNfT6_Ocklk
+Pa.N"Q^F20S"#q=StD[LTqeEZV5C/hWN)u!Xf\b0YctF>Za@-K[^WcW\[oDc]Y2%o^VI\%_SX4.
+`;[^W`lH.!aT'B^b5KN`bl5lbcMu5id/25idf._meGn(uf)4/"f`0Y&gAfq-h#6%1hV[5hhu_ls
+ir.m=jQ5M&k5XTEkl0iHlMp2Lm/QGQmf)\TnGi%Xo)J=]o_nI_pAambq#C0hqYL*gr;?Nardk*#
+s*t~>
+JcC<$JcF*slMgVXq>Bs`r;-BfqY:'as7ZB`s7H?_rUU!Y!:]sU!Uf@Slr*07lKRQskND!ijlGI^
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkcd'h\bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(kg]",A]\$i`Q
+['R*EZ*:I9Y5YOFXK/A$WMl_mVPU,bUnaZXTqJ$LSt2FBS"#k7R$a5+rfmYOPEM)kOT(:JNfB!V
+Mi*CKM26rdL'iWfK7ec,JUi9#If=`rI!bj=!I8qhG6)l0rcA0^ErL%`E,TZ4DJa6,rbMOK!,;FG
+s(D@Dral+?s'u":s'bn7r*TG0ra#>)r*0)&p0%;qr)`YorDieqpf%)gr))BKqbd8hq,@5krDiVn
+r)`euoNCunq-3Msr*B8-q-X,/rF,S4raYq<qITY<rFbn=qe>e>mq_0&nn\/>rGDCKrGV[Sqf2RT
+rc@mWrH8'^olp7WqK_a[r-SBiqgJHms*suts+13%re(6(!/:E,:PXa^M2@+JMi<USNfT6_Ocklk
+Pa.N"Q^F20S"#q=StD[LTqeEZV5C/hWN)u!Xf\b0YctF>Za@-K[^WcW\[oDc]Y2%o^VI\%_SX4.
+`;[^W`lH.!aT'B^b5KN`bl5lbcMu5id/25idf._meGn(uf)4/"f`0Y&gAfq-h#6%1hV[5hhu_ls
+ir.m=jQ5M&k5XTEkl0iHlMp2Lm/QGQmf)\TnGi%Xo)J=]o_nI_pAambq#C0hqYL*gr;?Nardk*#
+s*t~>
+JcC<$JcF*slMgVXq>Bs`r;-BfqY:'as7ZB`s7H?_rUU!Y!:]sU!Uf@Slr*07lKRQskND!ijlGI^
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkcd'h\bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(kg]",A]\$i`Q
+['R*EZ*:I9Y5YOFXK/A$WMl_mVPU,bUnaZXTqJ$LSt2FBS"#k7R$a5+rfmYOPEM)kOT(:JNfB!V
+Mi*CKM26rdL'iWfK7ec,JUi9#If=`rI!bj=!I8qhG6)l0rcA0^ErL%`E,TZ4DJa6,rbMOK!,;FG
+s(D@Dral+?s'u":s'bn7r*TG0ra#>)r*0)&p0%;qr)`YorDieqpf%)gr))BKqbd8hq,@5krDiVn
+r)`euoNCunq-3Msr*B8-q-X,/rF,S4raYq<qITY<rFbn=qe>e>mq_0&nn\/>rGDCKrGV[Sqf2RT
+rc@mWrH8'^olp7WqK_a[r-SBiqgJHms*suts+13%re(6(!/:E,:PXa^M2@+JMi<USNfT6_Ocklk
+Pa.N"Q^F20S"#q=StD[LTqeEZV5C/hWN)u!Xf\b0YctF>Za@-K[^WcW\[oDc]Y2%o^VI\%_SX4.
+`;[^W`lH.!aT'B^b5KN`bl5lbcMu5id/25idf._meGn(uf)4/"f`0Y&gAfq-h#6%1hV[5hhu_ls
+ir.m=jQ5M&k5XTEkl0iHlMp2Lm/QGQmf)\TnGi%Xo)J=]o_nI_pAambq#C0hqYL*gr;?Nardk*#
+s*t~>
+JcC<$JcF'rl2LMWqY^$`rVHKgqY:'arq?<`s7H?_rUU!Y!:^!Vs6]mSrp0jTlK[Wuki_s-:$(Hr
+j5T%Ui8<DIh;$c=g=b-1f@JL%eC2gmd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT
+[C!9HZE^[=Yck43XfST&WX5Z'Vl-DgUnjc[rh1d6T:VXFS=?":R[KP1Q^3o%P`q;oP*(ieO,f3Z
+N/W[PM2@%ELPCP;K`6T)Jq<oO'n:[\I=-EhH?sj]G^"@TF`heJF)uC$E<1#srb_dSCi')d!buF`
+rb2=Es(;7As().>rF5b7s'Y_2ra,P/q-<i%qc`_sr)io!pf@>nrD`Pjr)3Dhk"tqPr)3;grD`_q
+pf@;or)iSoq-*PtoN_<"rEf;,ra>_6qI9G6rabn;rFZ"@ph9P=bA-ZbrG;FLqJQ7Mrc%aSrc7sY
+qK2[YrH@pZqfr!`oQpF^r-\?hs*jrsr.+fu!.t0%s+CB+re=C-LkpnEMMd=NN/`jYO-#KeP*;,q
+Q'Rc(R$jD4S=Q7CT:qsQUSO``Vl-JnWiN5'Y-5(6Z*L^C[C3NQ\@K/]]=bei^;%Fu_84"*_o0L4
+`Q#p<rlG,]s2t;`s31Mfr6G>grm:PirmLepqpbVqs47)!s4IA)r7_2*s4mS/s5*e5rSRb9io9ps
+!p&J)roX7D!9jCG!p]+;rp9[Ps6fmTs6p$YrUU![s7H9_s7ZKerV6BfrqcNhrVZTlo)=4?JcC6~>
+JcC<$JcF'rl2LMWqY^$`rVHKgqY:'arq?<`s7H?_rUU!Y!:^!Vs6]mSrp0jTlK[Wuki_s-:$(Hr
+j5T%Ui8<DIh;$c=g=b-1f@JL%eC2gmd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT
+[C!9HZE^[=Yck43XfST&WX5Z'Vl-DgUnjc[rh1d6T:VXFS=?":R[KP1Q^3o%P`q;oP*(ieO,f3Z
+N/W[PM2@%ELPCP;K`6T)Jq<oO'n:[\I=-EhH?sj]G^"@TF`heJF)uC$E<1#srb_dSCi')d!buF`
+rb2=Es(;7As().>rF5b7s'Y_2ra,P/q-<i%qc`_sr)io!pf@>nrD`Pjr)3Dhk"tqPr)3;grD`_q
+pf@;or)iSoq-*PtoN_<"rEf;,ra>_6qI9G6rabn;rFZ"@ph9P=bA-ZbrG;FLqJQ7Mrc%aSrc7sY
+qK2[YrH@pZqfr!`oQpF^r-\?hs*jrsr.+fu!.t0%s+CB+re=C-LkpnEMMd=NN/`jYO-#KeP*;,q
+Q'Rc(R$jD4S=Q7CT:qsQUSO``Vl-JnWiN5'Y-5(6Z*L^C[C3NQ\@K/]]=bei^;%Fu_84"*_o0L4
+`Q#p<rlG,]s2t;`s31Mfr6G>grm:PirmLepqpbVqs47)!s4IA)r7_2*s4mS/s5*e5rSRb9io9ps
+!p&J)roX7D!9jCG!p]+;rp9[Ps6fmTs6p$YrUU![s7H9_s7ZKerV6BfrqcNhrVZTlo)=4?JcC6~>
+JcC<$JcF'rl2LMWqY^$`rVHKgqY:'arq?<`s7H?_rUU!Y!:^!Vs6]mSrp0jTlK[Wuki_s-:$(Hr
+j5T%Ui8<DIh;$c=g=b-1f@JL%eC2gmd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT
+[C!9HZE^[=Yck43XfST&WX5Z'Vl-DgUnjc[rh1d6T:VXFS=?":R[KP1Q^3o%P`q;oP*(ieO,f3Z
+N/W[PM2@%ELPCP;K`6T)Jq<oO'n:[\I=-EhH?sj]G^"@TF`heJF)uC$E<1#srb_dSCi')d!buF`
+rb2=Es(;7As().>rF5b7s'Y_2ra,P/q-<i%qc`_sr)io!pf@>nrD`Pjr)3Dhk"tqPr)3;grD`_q
+pf@;or)iSoq-*PtoN_<"rEf;,ra>_6qI9G6rabn;rFZ"@ph9P=bA-ZbrG;FLqJQ7Mrc%aSrc7sY
+qK2[YrH@pZqfr!`oQpF^r-\?hs*jrsr.+fu!.t0%s+CB+re=C-LkpnEMMd=NN/`jYO-#KeP*;,q
+Q'Rc(R$jD4S=Q7CT:qsQUSO``Vl-JnWiN5'Y-5(6Z*L^C[C3NQ\@K/]]=bei^;%Fu_84"*_o0L4
+`Q#p<rlG,]s2t;`s31Mfr6G>grm:PirmLepqpbVqs47)!s4IA)r7_2*s4mS/s5*e5rSRb9io9ps
+!p&J)roX7D!9jCG!p]+;rp9[Ps6fmTs6p$YrUU![s7H9_s7ZKerV6BfrqcNhrVZTlo)=4?JcC6~>
+JcC<$JcF$ql2LJVqY^'ar;-BfqtU0brq?<`s7H?_rUL$[nF6GGs6]mSrp0[OlMg#Oki_*jjlHF$
+7H3:ai8<DIh;$c=g=b-1f@JI$e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT
+[C*BJZa-j?Yck5/XV._9WiE%sVl-DhV50o^U7n9RTDkE)SXc1=R[KP1Q^=#'Q'@JqP*(ifO,o<\
+N/W[QMM[1GL]3#8KnP)2Jq8K'J:E%II0"_Brd"TjGlDmfG'3e+!HW;\E<gH$Df0H0D/B2es(_RJ
+rb2=E!+u1@s().>r*o\7ra>V1rEfG.pg!`$r*&htr)io!q,[GorD`Pjr)3>fmnigWr)3;gr)EVp
+pf@>pqcNJnpfdJto3D3!rEf;,ra>\5qdTP7rabk:rFZ%ApLsD;bA-]crG;FLqJQ:Nrc%aSrc8!Z
+qK2^ZrH@s[r-8*aom6L^r-\<grdOirr.+fus+:6&s+LE+re=""LkpnEMMmCON/`jYO-#KeP*;,q
+Q'Rc(R$jD4S"6.BT:hmPUSO]^Vl-JmWiN5'Xfen4Z*L^B['mEP\@K/]]=bei^;%Fu_>_:P_o2Pn
+!li:$rl>/_b0'\+s31MfrQbDgs3UYjrmLepqpbVqrmq#!rn.8(r7_2*rnRJ.s5*e5ro!h8s5O%<
+s5a4AroX7Ds60IHs69UMrTjUQmdC)Cs7$'Yrpp*\s7H9_s7ZKer:p9es8)ThrVZWmnc"+>JcC6~>
+JcC<$JcF$ql2LJVqY^'ar;-BfqtU0brq?<`s7H?_rUL$[nF6GGs6]mSrp0[OlMg#Oki_*jjlHF$
+7H3:ai8<DIh;$c=g=b-1f@JI$e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT
+[C*BJZa-j?Yck5/XV._9WiE%sVl-DhV50o^U7n9RTDkE)SXc1=R[KP1Q^=#'Q'@JqP*(ifO,o<\
+N/W[QMM[1GL]3#8KnP)2Jq8K'J:E%II0"_Brd"TjGlDmfG'3e+!HW;\E<gH$Df0H0D/B2es(_RJ
+rb2=E!+u1@s().>r*o\7ra>V1rEfG.pg!`$r*&htr)io!q,[GorD`Pjr)3>fmnigWr)3;gr)EVp
+pf@>pqcNJnpfdJto3D3!rEf;,ra>\5qdTP7rabk:rFZ%ApLsD;bA-]crG;FLqJQ:Nrc%aSrc8!Z
+qK2^ZrH@s[r-8*aom6L^r-\<grdOirr.+fus+:6&s+LE+re=""LkpnEMMmCON/`jYO-#KeP*;,q
+Q'Rc(R$jD4S"6.BT:hmPUSO]^Vl-JmWiN5'Xfen4Z*L^B['mEP\@K/]]=bei^;%Fu_>_:P_o2Pn
+!li:$rl>/_b0'\+s31MfrQbDgs3UYjrmLepqpbVqrmq#!rn.8(r7_2*rnRJ.s5*e5ro!h8s5O%<
+s5a4AroX7Ds60IHs69UMrTjUQmdC)Cs7$'Yrpp*\s7H9_s7ZKer:p9es8)ThrVZWmnc"+>JcC6~>
+JcC<$JcF$ql2LJVqY^'ar;-BfqtU0brq?<`s7H?_rUL$[nF6GGs6]mSrp0[OlMg#Oki_*jjlHF$
+7H3:ai8<DIh;$c=g=b-1f@JI$e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=PP`\@8oT
+[C*BJZa-j?Yck5/XV._9WiE%sVl-DhV50o^U7n9RTDkE)SXc1=R[KP1Q^=#'Q'@JqP*(ifO,o<\
+N/W[QMM[1GL]3#8KnP)2Jq8K'J:E%II0"_Brd"TjGlDmfG'3e+!HW;\E<gH$Df0H0D/B2es(_RJ
+rb2=E!+u1@s().>r*o\7ra>V1rEfG.pg!`$r*&htr)io!q,[GorD`Pjr)3>fmnigWr)3;gr)EVp
+pf@>pqcNJnpfdJto3D3!rEf;,ra>\5qdTP7rabk:rFZ%ApLsD;bA-]crG;FLqJQ:Nrc%aSrc8!Z
+qK2^ZrH@s[r-8*aom6L^r-\<grdOirr.+fus+:6&s+LE+re=""LkpnEMMmCON/`jYO-#KeP*;,q
+Q'Rc(R$jD4S"6.BT:hmPUSO]^Vl-JmWiN5'Xfen4Z*L^B['mEP\@K/]]=bei^;%Fu_>_:P_o2Pn
+!li:$rl>/_b0'\+s31MfrQbDgs3UYjrmLepqpbVqrmq#!rn.8(r7_2*rnRJ.s5*e5ro!h8s5O%<
+s5a4AroX7Ds60IHs69UMrTjUQmdC)Cs7$'Yrpp*\s7H9_s7ZKer:p9es8)ThrVZWmnc"+>JcC6~>
+JcC<$JcEsol2LJVqY^'arVHKgqtU0brq?<`s7H?_rUL$[nF6GG8FGm4m-O'(lKRQski_*jjlGI^
+io/kSi8<DIh;$c=g=b*0f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=S!P$+RIQ
+[^EKKZa-k8YQ_55Xf\\*ri-U1W2HPjV50o^US=HUTV%gISXf\K(RgbZR$X,(Q'@MsP*1rhO,o<]
+NJrgSMZ/G9Lkg_>KnTGX++f&oJ:E&tI=6KiH[:!`G^+FVG'.qLFE;JCEH,r:DuOYSD#eDOC]A,L
+C&M]HB4bcSAcH<@A,Kg8@K'[2?iFC0?2%V%>Pq\"=oDJ$=8>nr<W,nk;uBPd;>j>a;>X8c;uK\o
+<VTVm=8Q+l=nl1q>Ou+t?2S%*?i=C3@JaO4A,^$9Ac66>BD?09C!(2bC]&#JD>J/LDuO_QEW1"X
+F8L(YFo?L[GPl^`H1lR]Hi&3dIJnWoJ,FirJcC?#KE$T)L&Qi,LB*/0M$AiqMi<USNrG)#OHG]h
+PE_>tQC+&-R[]e:SXuIHTqS3VUnsrdW2ZesX0&M,YHY:;Za7$H[^WcW\[oDc]Y2%o^VI\b_?%Qm
+rl"oXa8X0[aT0K^b6#o4c2>leci;AhdJqYoe,%Snec+.sfDjM&g&0S(g]$",h>c@3hu2L5iW%p:
+j8\3?jo4EBkPscFl2U#Kli$2Mm/ZSQmfN"Knbr%YoDeI]p&Facp\agdq>U6equ6NkrUTr=s+11M
+s*t~>
+JcC<$JcEsol2LJVqY^'arVHKgqtU0brq?<`s7H?_rUL$[nF6GG8FGm4m-O'(lKRQski_*jjlGI^
+io/kSi8<DIh;$c=g=b*0f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=S!P$+RIQ
+[^EKKZa-k8YQ_55Xf\\*ri-U1W2HPjV50o^US=HUTV%gISXf\K(RgbZR$X,(Q'@MsP*1rhO,o<]
+NJrgSMZ/G9Lkg_>KnTGX++f&oJ:E&tI=6KiH[:!`G^+FVG'.qLFE;JCEH,r:DuOYSD#eDOC]A,L
+C&M]HB4bcSAcH<@A,Kg8@K'[2?iFC0?2%V%>Pq\"=oDJ$=8>nr<W,nk;uBPd;>j>a;>X8c;uK\o
+<VTVm=8Q+l=nl1q>Ou+t?2S%*?i=C3@JaO4A,^$9Ac66>BD?09C!(2bC]&#JD>J/LDuO_QEW1"X
+F8L(YFo?L[GPl^`H1lR]Hi&3dIJnWoJ,FirJcC?#KE$T)L&Qi,LB*/0M$AiqMi<USNrG)#OHG]h
+PE_>tQC+&-R[]e:SXuIHTqS3VUnsrdW2ZesX0&M,YHY:;Za7$H[^WcW\[oDc]Y2%o^VI\b_?%Qm
+rl"oXa8X0[aT0K^b6#o4c2>leci;AhdJqYoe,%Snec+.sfDjM&g&0S(g]$",h>c@3hu2L5iW%p:
+j8\3?jo4EBkPscFl2U#Kli$2Mm/ZSQmfN"Knbr%YoDeI]p&Facp\agdq>U6equ6NkrUTr=s+11M
+s*t~>
+JcC<$JcEsol2LJVqY^'arVHKgqtU0brq?<`s7H?_rUL$[nF6GG8FGm4m-O'(lKRQski_*jjlGI^
+io/kSi8<DIh;$c=g=b*0f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=S!P$+RIQ
+[^EKKZa-k8YQ_55Xf\\*ri-U1W2HPjV50o^US=HUTV%gISXf\K(RgbZR$X,(Q'@MsP*1rhO,o<]
+NJrgSMZ/G9Lkg_>KnTGX++f&oJ:E&tI=6KiH[:!`G^+FVG'.qLFE;JCEH,r:DuOYSD#eDOC]A,L
+C&M]HB4bcSAcH<@A,Kg8@K'[2?iFC0?2%V%>Pq\"=oDJ$=8>nr<W,nk;uBPd;>j>a;>X8c;uK\o
+<VTVm=8Q+l=nl1q>Ou+t?2S%*?i=C3@JaO4A,^$9Ac66>BD?09C!(2bC]&#JD>J/LDuO_QEW1"X
+F8L(YFo?L[GPl^`H1lR]Hi&3dIJnWoJ,FirJcC?#KE$T)L&Qi,LB*/0M$AiqMi<USNrG)#OHG]h
+PE_>tQC+&-R[]e:SXuIHTqS3VUnsrdW2ZesX0&M,YHY:;Za7$H[^WcW\[oDc]Y2%o^VI\b_?%Qm
+rl"oXa8X0[aT0K^b6#o4c2>leci;AhdJqYoe,%Snec+.sfDjM&g&0S(g]$",h>c@3hu2L5iW%p:
+j8\3?jo4EBkPscFl2U#Kli$2Mm/ZSQmfN"Knbr%YoDeI]p&Facp\agdq>U6equ6NkrUTr=s+11M
+s*t~>
+JcC<$JcEpnkl1AUqY^*br;-EgqtU0brq?<`s7H?_rpp*Zs7$$V!Uf@Sliue@lKRQskPjU1jlGI^
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=YYb\[],W
+[^ELAZN[Y>Yct=6riH@*X/`2!W;`\-VPU)aUS=HUTV.pKSt2C@S!ocEQj&hBQ'IStrfRbROH5H_
+NJrgSMi*@JLkkta$AF.cK7\Z*J:N,urd=fpHiA<qH$FOWG'8$-F9-H'rc&!YDf>Vm!c;airbDRM
+BkdNZ!bZ+WrFQ">raYk8raGe6qHs2-r*B&%r*0,'pf[PtrE&hrrDieqpJ^lcmnrpZp/Cohr)NMm
+rE&kuoNColpKR5oqd'/,q-X,/rF,S4raYq<qITV;rb(t=phAl*n7hW3pM9_Drb_LLrbqdTr,M^V
+rc@sYrcS3`qKMm_r-A$_r-S<gpO3!hrdXfqs+10$rIb-'s+UH,s+^T1reUi:Mi3OQNK4"!3foJe
+P*;,qQ'Rc(R$jG5S=Q7CT:qsQUSO]_Vl-JnWiN5'Y-5(6Z*L^C[C3NQ\@K2_]Y(ql^V@S#rk\lW
+`5T^8`lJ)"!m/U-rlb>c!6tJfs3L\kr6bPmrmUbormgtuqq(i"s4R;'s4dP.rS@M1rnm\4s5F";
+ro=%>s5j7Bs6'FGrosIJs6K[Ns6]jSrpTmVs7-*Zs7?9_rUp3as7cHdrqZQiqtp?ir;H3cJcC<$
+!<7Q~>
+JcC<$JcEpnkl1AUqY^*br;-EgqtU0brq?<`s7H?_rpp*Zs7$$V!Uf@Sliue@lKRQskPjU1jlGI^
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=YYb\[],W
+[^ELAZN[Y>Yct=6riH@*X/`2!W;`\-VPU)aUS=HUTV.pKSt2C@S!ocEQj&hBQ'IStrfRbROH5H_
+NJrgSMi*@JLkkta$AF.cK7\Z*J:N,urd=fpHiA<qH$FOWG'8$-F9-H'rc&!YDf>Vm!c;airbDRM
+BkdNZ!bZ+WrFQ">raYk8raGe6qHs2-r*B&%r*0,'pf[PtrE&hrrDieqpJ^lcmnrpZp/Cohr)NMm
+rE&kuoNColpKR5oqd'/,q-X,/rF,S4raYq<qITV;rb(t=phAl*n7hW3pM9_Drb_LLrbqdTr,M^V
+rc@sYrcS3`qKMm_r-A$_r-S<gpO3!hrdXfqs+10$rIb-'s+UH,s+^T1reUi:Mi3OQNK4"!3foJe
+P*;,qQ'Rc(R$jG5S=Q7CT:qsQUSO]_Vl-JnWiN5'Y-5(6Z*L^C[C3NQ\@K2_]Y(ql^V@S#rk\lW
+`5T^8`lJ)"!m/U-rlb>c!6tJfs3L\kr6bPmrmUbormgtuqq(i"s4R;'s4dP.rS@M1rnm\4s5F";
+ro=%>s5j7Bs6'FGrosIJs6K[Ns6]jSrpTmVs7-*Zs7?9_rUp3as7cHdrqZQiqtp?ir;H3cJcC<$
+!<7Q~>
+JcC<$JcEpnkl1AUqY^*br;-EgqtU0brq?<`s7H?_rpp*Zs7$$V!Uf@Sliue@lKRQskPjU1jlGI^
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=YYb\[],W
+[^ELAZN[Y>Yct=6riH@*X/`2!W;`\-VPU)aUS=HUTV.pKSt2C@S!ocEQj&hBQ'IStrfRbROH5H_
+NJrgSMi*@JLkkta$AF.cK7\Z*J:N,urd=fpHiA<qH$FOWG'8$-F9-H'rc&!YDf>Vm!c;airbDRM
+BkdNZ!bZ+WrFQ">raYk8raGe6qHs2-r*B&%r*0,'pf[PtrE&hrrDieqpJ^lcmnrpZp/Cohr)NMm
+rE&kuoNColpKR5oqd'/,q-X,/rF,S4raYq<qITV;rb(t=phAl*n7hW3pM9_Drb_LLrbqdTr,M^V
+rc@sYrcS3`qKMm_r-A$_r-S<gpO3!hrdXfqs+10$rIb-'s+UH,s+^T1reUi:Mi3OQNK4"!3foJe
+P*;,qQ'Rc(R$jG5S=Q7CT:qsQUSO]_Vl-JnWiN5'Y-5(6Z*L^C[C3NQ\@K2_]Y(ql^V@S#rk\lW
+`5T^8`lJ)"!m/U-rlb>c!6tJfs3L\kr6bPmrmUbormgtuqq(i"s4R;'s4dP.rS@M1rnm\4s5F";
+ro=%>s5j7Bs6'FGrosIJs6K[Ns6]jSrpTmVs7-*Zs7?9_rUp3as7cHdrqZQiqtp?ir;H3cJcC<$
+!<7Q~>
+JcC<$JcEjlkl1AUqu$0brVHKgqtU3crq?<`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg$8ki_*jjlGL_
+j5T%Ui8<DIh;$c=g=b-1f@JL%eC2jndEp4bcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Cp]Y(kf\[f5Z
+rjEWN['R*EZ*CO;YHG"0XK/D%Wi;qpVl$<iU_9GsTqS-OSt;LDS=?":R@'A.QN!-QP`q8nOc]R'
+"ceS$N/NSmM$8]jL5(D8rdt`5JUi9#IsufoI!^3dH?jc7G6`;6F`__HEcV/!!H;uVDZ=PRD#J,N
+C2%D\BEDgYB)H6?AH-0:@fBg8@/41-?N"1(>l@n)>5;>#=T)=s<rQ+s<;0>`;ZBVd;YF&e<;fhl
+<r?%s=S#\j>4u1k>l.h*?MRt,@/aU3@f9g9AGTm:B)QB9B_Z<.C?fO.CA;TCD#J5JDZ4SSE;OYS
+ErU4XFT-F^G5?F^Gl;p_HMi-fI.r'eIf4cnJGt-"K)C9$K`?c*LB!&/M#N53MMqIm!KE-=O#iAb
+P*2#nQ'IZ%R$a;1S"#t?StD[LU8+N[V5C/hWN*##Xf\b1Yd(L?ZaI6M\%&uZ]"G\h^;%Fu_>_:Z
+_o0O5`lH-@aN;QHrlb>cs3:Pgs3L_lr6bMls3pkprmh#!qUb`!rn75'rnIG-rS@J0s53e5s5F";
+rT!q=s5j7Bs6'FGrosIJs6K[Ns6]jSrpTmVs7-'Ys7?9_rUp3as7cHds7uZjqYU6hrVc9cJcC<$
+!<7Q~>
+JcC<$JcEjlkl1AUqu$0brVHKgqtU3crq?<`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg$8ki_*jjlGL_
+j5T%Ui8<DIh;$c=g=b-1f@JL%eC2jndEp4bcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Cp]Y(kf\[f5Z
+rjEWN['R*EZ*CO;YHG"0XK/D%Wi;qpVl$<iU_9GsTqS-OSt;LDS=?":R@'A.QN!-QP`q8nOc]R'
+"ceS$N/NSmM$8]jL5(D8rdt`5JUi9#IsufoI!^3dH?jc7G6`;6F`__HEcV/!!H;uVDZ=PRD#J,N
+C2%D\BEDgYB)H6?AH-0:@fBg8@/41-?N"1(>l@n)>5;>#=T)=s<rQ+s<;0>`;ZBVd;YF&e<;fhl
+<r?%s=S#\j>4u1k>l.h*?MRt,@/aU3@f9g9AGTm:B)QB9B_Z<.C?fO.CA;TCD#J5JDZ4SSE;OYS
+ErU4XFT-F^G5?F^Gl;p_HMi-fI.r'eIf4cnJGt-"K)C9$K`?c*LB!&/M#N53MMqIm!KE-=O#iAb
+P*2#nQ'IZ%R$a;1S"#t?StD[LU8+N[V5C/hWN*##Xf\b1Yd(L?ZaI6M\%&uZ]"G\h^;%Fu_>_:Z
+_o0O5`lH-@aN;QHrlb>cs3:Pgs3L_lr6bMls3pkprmh#!qUb`!rn75'rnIG-rS@J0s53e5s5F";
+rT!q=s5j7Bs6'FGrosIJs6K[Ns6]jSrpTmVs7-'Ys7?9_rUp3as7cHds7uZjqYU6hrVc9cJcC<$
+!<7Q~>
+JcC<$JcEjlkl1AUqu$0brVHKgqtU3crq?<`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg$8ki_*jjlGL_
+j5T%Ui8<DIh;$c=g=b-1f@JL%eC2jndEp4bcHXSVbK@rJaN)<>`Pf[2_SO%&^V7Cp]Y(kf\[f5Z
+rjEWN['R*EZ*CO;YHG"0XK/D%Wi;qpVl$<iU_9GsTqS-OSt;LDS=?":R@'A.QN!-QP`q8nOc]R'
+"ceS$N/NSmM$8]jL5(D8rdt`5JUi9#IsufoI!^3dH?jc7G6`;6F`__HEcV/!!H;uVDZ=PRD#J,N
+C2%D\BEDgYB)H6?AH-0:@fBg8@/41-?N"1(>l@n)>5;>#=T)=s<rQ+s<;0>`;ZBVd;YF&e<;fhl
+<r?%s=S#\j>4u1k>l.h*?MRt,@/aU3@f9g9AGTm:B)QB9B_Z<.C?fO.CA;TCD#J5JDZ4SSE;OYS
+ErU4XFT-F^G5?F^Gl;p_HMi-fI.r'eIf4cnJGt-"K)C9$K`?c*LB!&/M#N53MMqIm!KE-=O#iAb
+P*2#nQ'IZ%R$a;1S"#t?StD[LU8+N[V5C/hWN*##Xf\b1Yd(L?ZaI6M\%&uZ]"G\h^;%Fu_>_:Z
+_o0O5`lH-@aN;QHrlb>cs3:Pgs3L_lr6bMls3pkprmh#!qUb`!rn75'rnIG-rS@J0s53e5s5F";
+rT!q=s5j7Bs6'FGrosIJs6K[Ns6]jSrpTmVs7-'Ys7?9_rUp3as7cHds7uZjqYU6hrVc9cJcC<$
+!<7Q~>
+JcC<$JcEjlkPk8TqY^*brVHKgqtU3cs7ZB`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Oki_*jjlHF$
+2WE]Ri8<DIh;$c=g=b-1f@JL%eC2jndEp4bcHXSVbK@rJaN)<>`Pf[2_SO%'^V@Lr]Y(kfrj`3B
+\$i`Q[/RBJZE^X<YHG%1XfSS'Wi;qqVl-DgUnjc[rh0stT:VXFS=?":R[KP1Q^3o%P`u*0%Zuj6
+O,f3YN/NUOM2@%Dre:T1KS+o/Jc:02IsufoI!g9eH?jd\GB\4RFoHI`F)q8"s)7sVrb_dSCi')d
+s(_RJrFl4Ds(;4@s()+=qdTP5rF#D-rEfD-pg!c%rEB#"r`K,#qH!Ppr)E>fmS`[Ur)ESopf@;o
+r)iSopKI8pnQbrsr*K5,rF#V5qI9G6rabk:rau(@pLs;8n7q*"q.fY>rbVOMqelFPrc%dTrc8!Z
+r,hp\rc\0_rcnBeq0N!dr-\6erI4ZoqLJQrrdt'#s+LE+rItB/Lku%es,$f7repl;NrG)#OHG]h
+PE_>tQC!u+R@9V7S=Q7DTV8'RUnjiaVl-MoWiN8(Y-5(7ZEpmE[C3QS\[f;`]Y(tn^VI\b_?Iiq
+`Poj;rl>/_b0'_,!mJp6rm(Pis3U_lrmLhqqpbVqrmpturRh,&qqD&(s4mM-s5*e5r8@V6s5O";
+s5a4AroX7Ds60FG!p]+;rTjUQmdC&Bs6p$YrUU![s7H9_s7ZHdrV6BfrqcNhrVZTlo)=4?JcGcM
+J,~>
+JcC<$JcEjlkPk8TqY^*brVHKgqtU3cs7ZB`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Oki_*jjlHF$
+2WE]Ri8<DIh;$c=g=b-1f@JL%eC2jndEp4bcHXSVbK@rJaN)<>`Pf[2_SO%'^V@Lr]Y(kfrj`3B
+\$i`Q[/RBJZE^X<YHG%1XfSS'Wi;qqVl-DgUnjc[rh0stT:VXFS=?":R[KP1Q^3o%P`u*0%Zuj6
+O,f3YN/NUOM2@%Dre:T1KS+o/Jc:02IsufoI!g9eH?jd\GB\4RFoHI`F)q8"s)7sVrb_dSCi')d
+s(_RJrFl4Ds(;4@s()+=qdTP5rF#D-rEfD-pg!c%rEB#"r`K,#qH!Ppr)E>fmS`[Ur)ESopf@;o
+r)iSopKI8pnQbrsr*K5,rF#V5qI9G6rabk:rau(@pLs;8n7q*"q.fY>rbVOMqelFPrc%dTrc8!Z
+r,hp\rc\0_rcnBeq0N!dr-\6erI4ZoqLJQrrdt'#s+LE+rItB/Lku%es,$f7repl;NrG)#OHG]h
+PE_>tQC!u+R@9V7S=Q7DTV8'RUnjiaVl-MoWiN8(Y-5(7ZEpmE[C3QS\[f;`]Y(tn^VI\b_?Iiq
+`Poj;rl>/_b0'_,!mJp6rm(Pis3U_lrmLhqqpbVqrmpturRh,&qqD&(s4mM-s5*e5r8@V6s5O";
+s5a4AroX7Ds60FG!p]+;rTjUQmdC&Bs6p$YrUU![s7H9_s7ZHdrV6BfrqcNhrVZTlo)=4?JcGcM
+J,~>
+JcC<$JcEjlkPk8TqY^*brVHKgqtU3cs7ZB`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Oki_*jjlHF$
+2WE]Ri8<DIh;$c=g=b-1f@JL%eC2jndEp4bcHXSVbK@rJaN)<>`Pf[2_SO%'^V@Lr]Y(kfrj`3B
+\$i`Q[/RBJZE^X<YHG%1XfSS'Wi;qqVl-DgUnjc[rh0stT:VXFS=?":R[KP1Q^3o%P`u*0%Zuj6
+O,f3YN/NUOM2@%Dre:T1KS+o/Jc:02IsufoI!g9eH?jd\GB\4RFoHI`F)q8"s)7sVrb_dSCi')d
+s(_RJrFl4Ds(;4@s()+=qdTP5rF#D-rEfD-pg!c%rEB#"r`K,#qH!Ppr)E>fmS`[Ur)ESopf@;o
+r)iSopKI8pnQbrsr*K5,rF#V5qI9G6rabk:rau(@pLs;8n7q*"q.fY>rbVOMqelFPrc%dTrc8!Z
+r,hp\rc\0_rcnBeq0N!dr-\6erI4ZoqLJQrrdt'#s+LE+rItB/Lku%es,$f7repl;NrG)#OHG]h
+PE_>tQC!u+R@9V7S=Q7DTV8'RUnjiaVl-MoWiN8(Y-5(7ZEpmE[C3QS\[f;`]Y(tn^VI\b_?Iiq
+`Poj;rl>/_b0'_,!mJp6rm(Pis3U_lrmLhqqpbVqrmpturRh,&qqD&(s4mM-s5*e5r8@V6s5O";
+s5a4AroX7Ds60FG!p]+;rTjUQmdC&Bs6p$YrUU![s7H9_s7ZHdrV6BfrqcNhrVZTlo)=4?JcGcM
+J,~>
+JcC<$JcEdjkPk8Tqu$3crVHKgqtU3cs7ZB`!qc*UrUL$[nF6GG$h!ELm-O''lKRQskPjTQjlGI^
+io/hRhqm2FgtVh^*SK)sf@JL%eC2jndEp4bcHXSVbK@rJaN)<>`Pf[n_@FDt^V@Lr]Y(kg]",A]
+\,NfY[C!9HZE^[=Yck43XfSS(WiE%sVl-DgV50o^U7n9RTDkDpSXc1=R[KP1Q^3r&Q'@JqP*(k*
+Nt.20N/W[PM2@%ELPCP;K`6T2Jq8H&IsuipI=-D@H3&;9rc\BdFoHL_Er^7[E<:)tDuOVUD/=%f
+C]A/LC&M`FBE)TAAcH<?A,Ba6@JsU/?i47/?2.\'>Q.h%=oMP%=8Gtq<W,nO;u9Pl<VTVm=8Z1m
+=nl1m>OYnp?2S%)?iFI4@JXI4A,^$8Ac66>BD-$2C&)N$C&2T>C]8/KD>S5NDuO_REW1"YF8U.Z
+FoHR^GQ)jcH2;jcHi8?eIJeQlJ,+WoJc:8uKE$W)L&Hc+L]<20M#rQmMuJY9NK4"!6]dFnP*;,q
+Q'Rc(R$jD4S"-%@StD^MU8+N[VPg>jWN*##Xf\e2Yd(L?['d?N\@K/]]=bei^;%Fu_8=(,`5T^8
+a8X-\aiaV+s3(Jfrm(Pis3U_ls3gnqr7(_rrmpturn.2&qqD&(rnRG-rnd\4r8@V6s5O";s5a4A
+rT=.Cs60FG!p]+;rTsRO!:KgSs7$'YrUL$]o^r(Ss7ZKer:p9es8)ThrVZTlo)=4?JcGcMJ,~>
+JcC<$JcEdjkPk8Tqu$3crVHKgqtU3cs7ZB`!qc*UrUL$[nF6GG$h!ELm-O''lKRQskPjTQjlGI^
+io/hRhqm2FgtVh^*SK)sf@JL%eC2jndEp4bcHXSVbK@rJaN)<>`Pf[n_@FDt^V@Lr]Y(kg]",A]
+\,NfY[C!9HZE^[=Yck43XfSS(WiE%sVl-DgV50o^U7n9RTDkDpSXc1=R[KP1Q^3r&Q'@JqP*(k*
+Nt.20N/W[PM2@%ELPCP;K`6T2Jq8H&IsuipI=-D@H3&;9rc\BdFoHL_Er^7[E<:)tDuOVUD/=%f
+C]A/LC&M`FBE)TAAcH<?A,Ba6@JsU/?i47/?2.\'>Q.h%=oMP%=8Gtq<W,nO;u9Pl<VTVm=8Z1m
+=nl1m>OYnp?2S%)?iFI4@JXI4A,^$8Ac66>BD-$2C&)N$C&2T>C]8/KD>S5NDuO_REW1"YF8U.Z
+FoHR^GQ)jcH2;jcHi8?eIJeQlJ,+WoJc:8uKE$W)L&Hc+L]<20M#rQmMuJY9NK4"!6]dFnP*;,q
+Q'Rc(R$jD4S"-%@StD^MU8+N[VPg>jWN*##Xf\e2Yd(L?['d?N\@K/]]=bei^;%Fu_8=(,`5T^8
+a8X-\aiaV+s3(Jfrm(Pis3U_ls3gnqr7(_rrmpturn.2&qqD&(rnRG-rnd\4r8@V6s5O";s5a4A
+rT=.Cs60FG!p]+;rTsRO!:KgSs7$'YrUL$]o^r(Ss7ZKer:p9es8)ThrVZTlo)=4?JcGcMJ,~>
+JcC<$JcEdjkPk8Tqu$3crVHKgqtU3cs7ZB`!qc*UrUL$[nF6GG$h!ELm-O''lKRQskPjTQjlGI^
+io/hRhqm2FgtVh^*SK)sf@JL%eC2jndEp4bcHXSVbK@rJaN)<>`Pf[n_@FDt^V@Lr]Y(kg]",A]
+\,NfY[C!9HZE^[=Yck43XfSS(WiE%sVl-DgV50o^U7n9RTDkDpSXc1=R[KP1Q^3r&Q'@JqP*(k*
+Nt.20N/W[PM2@%ELPCP;K`6T2Jq8H&IsuipI=-D@H3&;9rc\BdFoHL_Er^7[E<:)tDuOVUD/=%f
+C]A/LC&M`FBE)TAAcH<?A,Ba6@JsU/?i47/?2.\'>Q.h%=oMP%=8Gtq<W,nO;u9Pl<VTVm=8Z1m
+=nl1m>OYnp?2S%)?iFI4@JXI4A,^$8Ac66>BD-$2C&)N$C&2T>C]8/KD>S5NDuO_REW1"YF8U.Z
+FoHR^GQ)jcH2;jcHi8?eIJeQlJ,+WoJc:8uKE$W)L&Hc+L]<20M#rQmMuJY9NK4"!6]dFnP*;,q
+Q'Rc(R$jD4S"-%@StD^MU8+N[VPg>jWN*##Xf\e2Yd(L?['d?N\@K/]]=bei^;%Fu_8=(,`5T^8
+a8X-\aiaV+s3(Jfrm(Pis3U_ls3gnqr7(_rrmpturn.2&qqD&(rnRG-rnd\4r8@V6s5O";s5a4A
+rT=.Cs60FG!p]+;rTsRO!:KgSs7$'YrUL$]o^r(Ss7ZKer:p9es8)ThrVZTlo)=4?JcGcMJ,~>
+JcC<$JcE^hkPk8Tqu$3crVHNhqtU3cs7ZB`!qc*UrUL$[nF6GG!Uf@SliHG;rol`4kN:pgjlGI^
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*U+acHXSVbK@rJaN)<>`Pf[3_SX.)^V@Lr]tD"i])K5R
+\@8oT[C!<IZa-j?Yck75Xf\\*ri-U1W2HPjV50o^US=HUTV%gISXf\K&t55UR$X,(Q'@JrP*1rh
+O,o<\req>FMM[1GLPCP;KnP)2Jq<oO&:].WI=-EhH?sj^G^"@TG'3e+#BOp+EH,r:DuOYSD?"GO
+C]A/LC&M`FBE)TAAc?6>A,9[5@JsU/?i47/?27b(>Q.h&=oDJ%=8>nq<W#hR;uBVm<VKPm=8Z1m
+=nl1m>OGbn?2S%)?i=C3@JaO4A,^$8Ac?<>BD-#^C&2T>C]8/LD>S5MDuXeSEW1"YF8U.ZFoQX^
+GQ2peH2;jdHi8?eIJnWmJ,"QnJc12tKE$W(L&Hc+L]<20M>rG5MuJ\8N<#"<Ns1W-P*2#nrfoO1
+Q^F/.S"#q=St;RITqS6WUnsrdW2ZesXKAV-YHY:;Za7'J[^WcW]">Vf]tV7r^qmn)_o0O5`lJ)"
+!QiL`b6#o4c2Puicd:&;dJqYpe,7_pec+.sfDaG%g%sG%g]$"*h>Z:2hu)F3iW%p9j8\3?jo+?A
+kPscEklU/9li$2MmJlVRn,MnWnbr%YoDeI]p&Fabp\jmdq>U6equ-HkrUKl<s+14Ms*t~>
+JcC<$JcE^hkPk8Tqu$3crVHNhqtU3cs7ZB`!qc*UrUL$[nF6GG!Uf@SliHG;rol`4kN:pgjlGI^
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*U+acHXSVbK@rJaN)<>`Pf[3_SX.)^V@Lr]tD"i])K5R
+\@8oT[C!<IZa-j?Yck75Xf\\*ri-U1W2HPjV50o^US=HUTV%gISXf\K&t55UR$X,(Q'@JrP*1rh
+O,o<\req>FMM[1GLPCP;KnP)2Jq<oO&:].WI=-EhH?sj^G^"@TG'3e+#BOp+EH,r:DuOYSD?"GO
+C]A/LC&M`FBE)TAAc?6>A,9[5@JsU/?i47/?27b(>Q.h&=oDJ%=8>nq<W#hR;uBVm<VKPm=8Z1m
+=nl1m>OGbn?2S%)?i=C3@JaO4A,^$8Ac?<>BD-#^C&2T>C]8/LD>S5MDuXeSEW1"YF8U.ZFoQX^
+GQ2peH2;jdHi8?eIJnWmJ,"QnJc12tKE$W(L&Hc+L]<20M>rG5MuJ\8N<#"<Ns1W-P*2#nrfoO1
+Q^F/.S"#q=St;RITqS6WUnsrdW2ZesXKAV-YHY:;Za7'J[^WcW]">Vf]tV7r^qmn)_o0O5`lJ)"
+!QiL`b6#o4c2Puicd:&;dJqYpe,7_pec+.sfDaG%g%sG%g]$"*h>Z:2hu)F3iW%p9j8\3?jo+?A
+kPscEklU/9li$2MmJlVRn,MnWnbr%YoDeI]p&Fabp\jmdq>U6equ-HkrUKl<s+14Ms*t~>
+JcC<$JcE^hkPk8Tqu$3crVHNhqtU3cs7ZB`!qc*UrUL$[nF6GG!Uf@SliHG;rol`4kN:pgjlGI^
+io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*U+acHXSVbK@rJaN)<>`Pf[3_SX.)^V@Lr]tD"i])K5R
+\@8oT[C!<IZa-j?Yck75Xf\\*ri-U1W2HPjV50o^US=HUTV%gISXf\K&t55UR$X,(Q'@JrP*1rh
+O,o<\req>FMM[1GLPCP;KnP)2Jq<oO&:].WI=-EhH?sj^G^"@TG'3e+#BOp+EH,r:DuOYSD?"GO
+C]A/LC&M`FBE)TAAc?6>A,9[5@JsU/?i47/?27b(>Q.h&=oDJ%=8>nq<W#hR;uBVm<VKPm=8Z1m
+=nl1m>OGbn?2S%)?i=C3@JaO4A,^$8Ac?<>BD-#^C&2T>C]8/LD>S5MDuXeSEW1"YF8U.ZFoQX^
+GQ2peH2;jdHi8?eIJnWmJ,"QnJc12tKE$W(L&Hc+L]<20M>rG5MuJ\8N<#"<Ns1W-P*2#nrfoO1
+Q^F/.S"#q=St;RITqS6WUnsrdW2ZesXKAV-YHY:;Za7'J[^WcW]">Vf]tV7r^qmn)_o0O5`lJ)"
+!QiL`b6#o4c2Puicd:&;dJqYpe,7_pec+.sfDaG%g%sG%g]$"*h>Z:2hu)F3iW%p9j8\3?jo+?A
+kPscEklU/9li$2MmJlVRn,MnWnbr%YoDeI]p&Fabp\jmdq>U6equ-HkrUKl<s+14Ms*t~>
+JcC<$JcE[gk5P2Tqu$3crqcThr:p9cs7ZEas7H?_rpp*Z!:^!V&FSrQm-O'(lKRQski_*jjlHF$
+)<0W5i8<DIh;$c=g=b-1f@JL%eC2jndEp5=c3_b>bKJ&MaN2EArl#&Z_ns:,_#D(U^:h1l]=YYb
+\[]-J[L0FLZa6sCZ*:I9Y5YO,XK/A$WMofo&uMM$UnaZXTqJ'NSt;LCS"#k7rg4"YQBd`"PEM)k
+OT(:NNfB!VMi*@JLkph@L4t<[K*m3]J:N,uIXQWlHiA<lH$K=4#Bk64FEDSFErL(YDuahUDZ=SR
+D#S5MCB&#HB`;ZEB)H6>AGp$7@f9a6@/++-?N"1*>lIt+>5DD$=T)=t<r>tp<9R9W<;]bj<r?%s
+=S5hl>4Ytb>l.h)?MRt,@/aU2@fBm:AGTm9B)QB9BZb&dCA;TDD#S;KDZ=YSE;X_UErL.YFT-F_
+G5QR`GlE!cHN&9jI//3hIf+]jJGk&uK)1-!K`?c(LB!&/M#E/3MMmDlN!kW*NfT6_OHG]hPEc'3
+7$a1,R$jD4S"-(AT:hmOU8+N\VPg>kWiE,$Xfek3Yd1UA['d?O\@K/]]Y(ql^V@S#_SX4/`Poj;
+aN2KFb0.uPbg$.4s3C\lrR(Yns3pqrrmh&"qq(f!rn7/%rnIG-qVD2.rnmY3ro*n:r8[h<s5j4A
+s6'FGrTX@I!:0UMs6]jSrU9dU!:g$Ys7?9_r:U*`s7cHdrqZQiqtp?ir;H0bJcC<$s8RT~>
+JcC<$JcE[gk5P2Tqu$3crqcThr:p9cs7ZEas7H?_rpp*Z!:^!V&FSrQm-O'(lKRQski_*jjlHF$
+)<0W5i8<DIh;$c=g=b-1f@JL%eC2jndEp5=c3_b>bKJ&MaN2EArl#&Z_ns:,_#D(U^:h1l]=YYb
+\[]-J[L0FLZa6sCZ*:I9Y5YO,XK/A$WMofo&uMM$UnaZXTqJ'NSt;LCS"#k7rg4"YQBd`"PEM)k
+OT(:NNfB!VMi*@JLkph@L4t<[K*m3]J:N,uIXQWlHiA<lH$K=4#Bk64FEDSFErL(YDuahUDZ=SR
+D#S5MCB&#HB`;ZEB)H6>AGp$7@f9a6@/++-?N"1*>lIt+>5DD$=T)=t<r>tp<9R9W<;]bj<r?%s
+=S5hl>4Ytb>l.h)?MRt,@/aU2@fBm:AGTm9B)QB9BZb&dCA;TDD#S;KDZ=YSE;X_UErL.YFT-F_
+G5QR`GlE!cHN&9jI//3hIf+]jJGk&uK)1-!K`?c(LB!&/M#E/3MMmDlN!kW*NfT6_OHG]hPEc'3
+7$a1,R$jD4S"-(AT:hmOU8+N\VPg>kWiE,$Xfek3Yd1UA['d?O\@K/]]Y(ql^V@S#_SX4/`Poj;
+aN2KFb0.uPbg$.4s3C\lrR(Yns3pqrrmh&"qq(f!rn7/%rnIG-qVD2.rnmY3ro*n:r8[h<s5j4A
+s6'FGrTX@I!:0UMs6]jSrU9dU!:g$Ys7?9_r:U*`s7cHdrqZQiqtp?ir;H0bJcC<$s8RT~>
+JcC<$JcE[gk5P2Tqu$3crqcThr:p9cs7ZEas7H?_rpp*Z!:^!V&FSrQm-O'(lKRQski_*jjlHF$
+)<0W5i8<DIh;$c=g=b-1f@JL%eC2jndEp5=c3_b>bKJ&MaN2EArl#&Z_ns:,_#D(U^:h1l]=YYb
+\[]-J[L0FLZa6sCZ*:I9Y5YO,XK/A$WMofo&uMM$UnaZXTqJ'NSt;LCS"#k7rg4"YQBd`"PEM)k
+OT(:NNfB!VMi*@JLkph@L4t<[K*m3]J:N,uIXQWlHiA<lH$K=4#Bk64FEDSFErL(YDuahUDZ=SR
+D#S5MCB&#HB`;ZEB)H6>AGp$7@f9a6@/++-?N"1*>lIt+>5DD$=T)=t<r>tp<9R9W<;]bj<r?%s
+=S5hl>4Ytb>l.h)?MRt,@/aU2@fBm:AGTm9B)QB9BZb&dCA;TDD#S;KDZ=YSE;X_UErL.YFT-F_
+G5QR`GlE!cHN&9jI//3hIf+]jJGk&uK)1-!K`?c(LB!&/M#E/3MMmDlN!kW*NfT6_OHG]hPEc'3
+7$a1,R$jD4S"-(AT:hmOU8+N\VPg>kWiE,$Xfek3Yd1UA['d?O\@K/]]Y(ql^V@S#_SX4/`Poj;
+aN2KFb0.uPbg$.4s3C\lrR(Yns3pqrrmh&"qq(f!rn7/%rnIG-qVD2.rnmY3ro*n:r8[h<s5j4A
+s6'FGrTX@I!:0UMs6]jSrU9dU!:g$Ys7?9_r:U*`s7cHdrqZQiqtp?ir;H0bJcC<$s8RT~>
+JcC<$JcEXfk5P2TqY^-crVHNhr:p9cs7ZEas7H?_rpg-\nF6GG'^kAUm-O'(lKRQskND!ijlGI^
+io0mp(#Rm(h;$c=g=b-1f@JL%eC2jndEp5=c5b*QbKJ&MaN2EA`l5p8_ns:,_8*h#^:h4m]XtcS
+\I,jU[^NTO['R*EZ2Us;YHG"0XK/D%Wi;qpVl$<iUbSX=TqS-OSt;LDS=?":R@'A.QBd`"PEV/m
+OcYWbNfB!VMi3ILM26qAL4t>7K7ec,rdYQ0IXQWlI!^0cH$OXYGBS.PrcA3_EcV/!!cW'rrbhaQ
+s(q[Ms(_RJr+Q+Crau(>rFGn;q-s;2r*]>-rEfG.qHX#(rEB)$rE0&#pf@;mqGcu`pf./kpK%2n
+r)iVpq-*Aol!4*kr*K2+rF#V5qI9G6rabk:rFZ"@ok;N_qeGnArbVRNr,2LPs)@mUrc8$[r,hs]
+s*"<arcnHgqg/6grd=QjrI4]pq1/EprIXitre19)r.b6,s+pW1s,$f7rJUc:NrG+>OA(e"P*;,p
+Q'IZ%R$a;1S"#q=St;UKTq\<XUnsueW2ZetXKAV.YctC<Za@-K[^`lY]">Vf^;%Fu_8=(,`5T^8
+a2l?Dai_fMbfn?2c2u>=d/MGmdf7epeGn(uf)4/!f`'S#gATe*h"ok+hYuF1i;V^8ir%j:jT"?>
+k5XWEkl'cGl2^/Km/QJQmeuVSnGi%Wo)J=]o_nI_pAXgaq#C0hqYL*fr;?Nardk*#s8N%K~>
+JcC<$JcEXfk5P2TqY^-crVHNhr:p9cs7ZEas7H?_rpg-\nF6GG'^kAUm-O'(lKRQskND!ijlGI^
+io0mp(#Rm(h;$c=g=b-1f@JL%eC2jndEp5=c5b*QbKJ&MaN2EA`l5p8_ns:,_8*h#^:h4m]XtcS
+\I,jU[^NTO['R*EZ2Us;YHG"0XK/D%Wi;qpVl$<iUbSX=TqS-OSt;LDS=?":R@'A.QBd`"PEV/m
+OcYWbNfB!VMi3ILM26qAL4t>7K7ec,rdYQ0IXQWlI!^0cH$OXYGBS.PrcA3_EcV/!!cW'rrbhaQ
+s(q[Ms(_RJr+Q+Crau(>rFGn;q-s;2r*]>-rEfG.qHX#(rEB)$rE0&#pf@;mqGcu`pf./kpK%2n
+r)iVpq-*Aol!4*kr*K2+rF#V5qI9G6rabk:rFZ"@ok;N_qeGnArbVRNr,2LPs)@mUrc8$[r,hs]
+s*"<arcnHgqg/6grd=QjrI4]pq1/EprIXitre19)r.b6,s+pW1s,$f7rJUc:NrG+>OA(e"P*;,p
+Q'IZ%R$a;1S"#q=St;UKTq\<XUnsueW2ZetXKAV.YctC<Za@-K[^`lY]">Vf^;%Fu_8=(,`5T^8
+a2l?Dai_fMbfn?2c2u>=d/MGmdf7epeGn(uf)4/!f`'S#gATe*h"ok+hYuF1i;V^8ir%j:jT"?>
+k5XWEkl'cGl2^/Km/QJQmeuVSnGi%Wo)J=]o_nI_pAXgaq#C0hqYL*fr;?Nardk*#s8N%K~>
+JcC<$JcEXfk5P2TqY^-crVHNhr:p9cs7ZEas7H?_rpg-\nF6GG'^kAUm-O'(lKRQskND!ijlGI^
+io0mp(#Rm(h;$c=g=b-1f@JL%eC2jndEp5=c5b*QbKJ&MaN2EA`l5p8_ns:,_8*h#^:h4m]XtcS
+\I,jU[^NTO['R*EZ2Us;YHG"0XK/D%Wi;qpVl$<iUbSX=TqS-OSt;LDS=?":R@'A.QBd`"PEV/m
+OcYWbNfB!VMi3ILM26qAL4t>7K7ec,rdYQ0IXQWlI!^0cH$OXYGBS.PrcA3_EcV/!!cW'rrbhaQ
+s(q[Ms(_RJr+Q+Crau(>rFGn;q-s;2r*]>-rEfG.qHX#(rEB)$rE0&#pf@;mqGcu`pf./kpK%2n
+r)iVpq-*Aol!4*kr*K2+rF#V5qI9G6rabk:rFZ"@ok;N_qeGnArbVRNr,2LPs)@mUrc8$[r,hs]
+s*"<arcnHgqg/6grd=QjrI4]pq1/EprIXitre19)r.b6,s+pW1s,$f7rJUc:NrG+>OA(e"P*;,p
+Q'IZ%R$a;1S"#q=St;UKTq\<XUnsueW2ZetXKAV.YctC<Za@-K[^`lY]">Vf^;%Fu_8=(,`5T^8
+a2l?Dai_fMbfn?2c2u>=d/MGmdf7epeGn(uf)4/!f`'S#gATe*h"ok+hYuF1i;V^8ir%j:jT"?>
+k5XWEkl'cGl2^/Km/QJQmeuVSnGi%Wo)J=]o_nI_pAXgaq#C0hqYL*fr;?Nardk*#s8N%K~>
+JcC<$JcERdk5P2Tqu$6drVHNhr:p9cs7ZEas7?<_rUL$[nF6GG!Uf@SliHG;rojIIkPjTMjlGI^
+io/hRhqn@g)Vj*$g=b-1f@JL%eC2jndEp4ccHa\YbKJ&Mrl>8``l5p8_u@LR_8-&b&&,`i]Xtee
+\[f5Z\$i`Q[/RBJZE^X<YHG%1XfSS'Wi;trVl-DgUnjc[rh0XkT:VXFS=?":RJrQ[Q^3o%P`q8n
+Oc]R'(QOK6N/NRMM26qBL5(D8K7ec,JUi9#If=`rI!bj=!I8qhG62r1FoHI`F)q5!!cW'rrbhaQ
+s(q[MrbDIIrFl1Crau%=rabt;q-s81rF#G.ra,P/qHX#(r`]/$r`K,#pf@8ll;[U[p/_)mr)iVp
+q-*Dpk$7dhr*K2+rF#V5qI9G6rFGe:rFYt?p1VW`qeGqBrG;IMr,2LPs)@mUs)S-\r,hs]s*"<a
+s*4Ngr-J?hs*XZkrdOfqq1/EprIXitre19)qhG-+reUN0s,-i7rf$l:!07&>#*=t0P*2#nrfp'@
+Q^F/.R[]e:SXuFFTV8*TUnjiaVl6SpWiN8(Y-5(7ZEpmF[^NZT\[oDc]Y2%o^qmn)_o0O5`lH0A
+aiV]KbKS5UcHab^d/MGmdf7epeGn)!f)4/!f`'S#gA]k*h"ok+hYuF0i;V^7ir.p:jT"??k5XWD
+kl'cGlMp2Lm/QJQmeuVSnGi%Wo)J=]o_nI^pAambq#:*gqYL*fr;?Nardk*#s8N%K~>
+JcC<$JcERdk5P2Tqu$6drVHNhr:p9cs7ZEas7?<_rUL$[nF6GG!Uf@SliHG;rojIIkPjTMjlGI^
+io/hRhqn@g)Vj*$g=b-1f@JL%eC2jndEp4ccHa\YbKJ&Mrl>8``l5p8_u@LR_8-&b&&,`i]Xtee
+\[f5Z\$i`Q[/RBJZE^X<YHG%1XfSS'Wi;trVl-DgUnjc[rh0XkT:VXFS=?":RJrQ[Q^3o%P`q8n
+Oc]R'(QOK6N/NRMM26qBL5(D8K7ec,JUi9#If=`rI!bj=!I8qhG62r1FoHI`F)q5!!cW'rrbhaQ
+s(q[MrbDIIrFl1Crau%=rabt;q-s81rF#G.ra,P/qHX#(r`]/$r`K,#pf@8ll;[U[p/_)mr)iVp
+q-*Dpk$7dhr*K2+rF#V5qI9G6rFGe:rFYt?p1VW`qeGqBrG;IMr,2LPs)@mUs)S-\r,hs]s*"<a
+s*4Ngr-J?hs*XZkrdOfqq1/EprIXitre19)qhG-+reUN0s,-i7rf$l:!07&>#*=t0P*2#nrfp'@
+Q^F/.R[]e:SXuFFTV8*TUnjiaVl6SpWiN8(Y-5(7ZEpmF[^NZT\[oDc]Y2%o^qmn)_o0O5`lH0A
+aiV]KbKS5UcHab^d/MGmdf7epeGn)!f)4/!f`'S#gA]k*h"ok+hYuF0i;V^7ir.p:jT"??k5XWD
+kl'cGlMp2Lm/QJQmeuVSnGi%Wo)J=]o_nI^pAambq#:*gqYL*fr;?Nardk*#s8N%K~>
+JcC<$JcERdk5P2Tqu$6drVHNhr:p9cs7ZEas7?<_rUL$[nF6GG!Uf@SliHG;rojIIkPjTMjlGI^
+io/hRhqn@g)Vj*$g=b-1f@JL%eC2jndEp4ccHa\YbKJ&Mrl>8``l5p8_u@LR_8-&b&&,`i]Xtee
+\[f5Z\$i`Q[/RBJZE^X<YHG%1XfSS'Wi;trVl-DgUnjc[rh0XkT:VXFS=?":RJrQ[Q^3o%P`q8n
+Oc]R'(QOK6N/NRMM26qBL5(D8K7ec,JUi9#If=`rI!bj=!I8qhG62r1FoHI`F)q5!!cW'rrbhaQ
+s(q[MrbDIIrFl1Crau%=rabt;q-s81rF#G.ra,P/qHX#(r`]/$r`K,#pf@8ll;[U[p/_)mr)iVp
+q-*Dpk$7dhr*K2+rF#V5qI9G6rFGe:rFYt?p1VW`qeGqBrG;IMr,2LPs)@mUs)S-\r,hs]s*"<a
+s*4Ngr-J?hs*XZkrdOfqq1/EprIXitre19)qhG-+reUN0s,-i7rf$l:!07&>#*=t0P*2#nrfp'@
+Q^F/.R[]e:SXuFFTV8*TUnjiaVl6SpWiN8(Y-5(7ZEpmF[^NZT\[oDc]Y2%o^qmn)_o0O5`lH0A
+aiV]KbKS5UcHab^d/MGmdf7epeGn)!f)4/!f`'S#gA]k*h"ok+hYuF0i;V^7ir.p:jT"??k5XWD
+kl'cGlMp2Lm/QJQmeuVSnGi%Wo)J=]o_nI^pAambq#:*gqYL*fr;?Nardk*#s8N%K~>
+JcC<$JcELbk5P2Tr;??erVHNhr:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp1!XlKRQski_*jjlHF$
+$0'q%i8<DIh;$cag)J_tf@SU(eC;sqdF$=fcd'h\bfe2PaiVWFa2\+t&&cB&_SO((^V@Lr]tD"i
+])K5@\@;IG$FR7IZa-mAYct=6riH@*X/`2!W;`\$VPU)aUS=HUTV)4T.%QltS!ob4R$X,(Q'@Ms
+P*1rhO,o<\N/W[QMM[1GLPCP;KS4u1Jq<oO$\*VRI=-EhH?sj^GlDmlG'.qLFE;MDrc.sWs)7mS
+s)%dPrG2FJs(VCErb)4BqITV9raY_4rF,\5q-X,-rE];*r`f>)qcWl"rE&bppf6udpf6ufr)`eu
+p0%2poipE\qd',+pg=#.rF,S4rF>h;qITV;rFbe:b\?rhq.otGrb_OMs)7mUrGhjXrcA$[s)n?b
+r-/0cs*=Ngrd4Wlr-eNmrdXcprIOp!q1JX!re:6(reLN0r/(H2s,6l8s,I&=rf7)AOoCLEPEc'3
+3gQ,"R$jD4S"-%@StD[LTq\?YV5C/gW2ckuXKAY/YctC=Za@-K\%&uZ]"G\h^;%Fu_8=+.`Poj;
+rl>Jhb0.uPc-=PZcd:&<d/qbFe,@erec44ufDjM&g&'M%g]$"(h>Z:0htu@2iW%p7j8\3?jo"9@
+kPscEl2U&Kli$2MmJlVQn,MnWnbr%YoDeI\p&Fabp\agdq>U6equ-HjrUKl<s+14Ls*t~>
+JcC<$JcELbk5P2Tr;??erVHNhr:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp1!XlKRQski_*jjlHF$
+$0'q%i8<DIh;$cag)J_tf@SU(eC;sqdF$=fcd'h\bfe2PaiVWFa2\+t&&cB&_SO((^V@Lr]tD"i
+])K5@\@;IG$FR7IZa-mAYct=6riH@*X/`2!W;`\$VPU)aUS=HUTV)4T.%QltS!ob4R$X,(Q'@Ms
+P*1rhO,o<\N/W[QMM[1GLPCP;KS4u1Jq<oO$\*VRI=-EhH?sj^GlDmlG'.qLFE;MDrc.sWs)7mS
+s)%dPrG2FJs(VCErb)4BqITV9raY_4rF,\5q-X,-rE];*r`f>)qcWl"rE&bppf6udpf6ufr)`eu
+p0%2poipE\qd',+pg=#.rF,S4rF>h;qITV;rFbe:b\?rhq.otGrb_OMs)7mUrGhjXrcA$[s)n?b
+r-/0cs*=Ngrd4Wlr-eNmrdXcprIOp!q1JX!re:6(reLN0r/(H2s,6l8s,I&=rf7)AOoCLEPEc'3
+3gQ,"R$jD4S"-%@StD[LTq\?YV5C/gW2ckuXKAY/YctC=Za@-K\%&uZ]"G\h^;%Fu_8=+.`Poj;
+rl>Jhb0.uPc-=PZcd:&<d/qbFe,@erec44ufDjM&g&'M%g]$"(h>Z:0htu@2iW%p7j8\3?jo"9@
+kPscEl2U&Kli$2MmJlVQn,MnWnbr%YoDeI\p&Fabp\agdq>U6equ-HjrUKl<s+14Ls*t~>
+JcC<$JcELbk5P2Tr;??erVHNhr:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp1!XlKRQski_*jjlHF$
+$0'q%i8<DIh;$cag)J_tf@SU(eC;sqdF$=fcd'h\bfe2PaiVWFa2\+t&&cB&_SO((^V@Lr]tD"i
+])K5@\@;IG$FR7IZa-mAYct=6riH@*X/`2!W;`\$VPU)aUS=HUTV)4T.%QltS!ob4R$X,(Q'@Ms
+P*1rhO,o<\N/W[QMM[1GLPCP;KS4u1Jq<oO$\*VRI=-EhH?sj^GlDmlG'.qLFE;MDrc.sWs)7mS
+s)%dPrG2FJs(VCErb)4BqITV9raY_4rF,\5q-X,-rE];*r`f>)qcWl"rE&bppf6udpf6ufr)`eu
+p0%2poipE\qd',+pg=#.rF,S4rF>h;qITV;rFbe:b\?rhq.otGrb_OMs)7mUrGhjXrcA$[s)n?b
+r-/0cs*=Ngrd4Wlr-eNmrdXcprIOp!q1JX!re:6(reLN0r/(H2s,6l8s,I&=rf7)AOoCLEPEc'3
+3gQ,"R$jD4S"-%@StD[LTq\?YV5C/gW2ckuXKAY/YctC=Za@-K\%&uZ]"G\h^;%Fu_8=+.`Poj;
+rl>Jhb0.uPc-=PZcd:&<d/qbFe,@erec44ufDjM&g&'M%g]$"(h>Z:0htu@2iW%p7j8\3?jo"9@
+kPscEl2U&Kli$2MmJlVQn,MnWnbr%YoDeI\p&Fabp\agdq>U6equ-HjrUKl<s+14Ls*t~>
+JcC<$JcEIak5P2Tqu$9erVHNhr:p<ds7ZEas7H?_rpp*Z!:^!V4RVV(m-O'(lKRQskND!ijlGI^
+io8qTi8<DIh;$c=g=b-2f@SU(eC;sqdF$=fcd'h\bfe2Pb/q`Ga2\+t!Q;nT_?%KgrkB/]]tD"i
+]=PP`\@B#V[^EKLZa6sBricR0Y-"h-X8]+QWMl_mVPU)aUSFQWTqJ$LSt2C@S!ob5R$a5+Q'ISt
+P*1rhO,o<]NJrgSMM[1GL]3#8KnP)2Jq8K'J:E%II0"_Brd"fpG^+FVG'8$-FT6C^ErL(YE;skU
+DZ=SRD#A)KCB&#FB`;ZDB)6*;AGp$6@f9a7@/=7/?N+7->lIt+>5MJ$=T)=o<p`oZ<r5tr=S>no
+>4u1X>l%b(?MIn,@/XO2@f9g9AGTm9B)QB8B[(8gCA;TDD#S;LDZ=YSE;aeVErL.YFT6L`G5ZXa
+GlN'fHN&9kI/A?kIf=ioJGk&tK)(&uK`-W$LAlu-M#E20MZ8V5Muo!!NrG+>O8tFBOo^c2rfoj:
+Q^F/.R[]e:SXuFFTV8'RUSO]_Vl-JmWiN5'Xfen4Z*L^C[C3NQ\[f;`]Y(tn^VI\&_Sa=2`Q#s>
+aN;TJbKS61c2u>=d/MDodaQ\EeGn)!f)=5"f`0Y%gATe*h"ok*hYl@/i;V^7iqqd9jSn9=k5XWE
+kl'cGlMp2Km/QJQmeuVSnGi%Vo)J=]o_nI^pAambq#:*gqYL*fr;?N`rdk*#s8N%K~>
+JcC<$JcEIak5P2Tqu$9erVHNhr:p<ds7ZEas7H?_rpp*Z!:^!V4RVV(m-O'(lKRQskND!ijlGI^
+io8qTi8<DIh;$c=g=b-2f@SU(eC;sqdF$=fcd'h\bfe2Pb/q`Ga2\+t!Q;nT_?%KgrkB/]]tD"i
+]=PP`\@B#V[^EKLZa6sBricR0Y-"h-X8]+QWMl_mVPU)aUSFQWTqJ$LSt2C@S!ob5R$a5+Q'ISt
+P*1rhO,o<]NJrgSMM[1GL]3#8KnP)2Jq8K'J:E%II0"_Brd"fpG^+FVG'8$-FT6C^ErL(YE;skU
+DZ=SRD#A)KCB&#FB`;ZDB)6*;AGp$6@f9a7@/=7/?N+7->lIt+>5MJ$=T)=o<p`oZ<r5tr=S>no
+>4u1X>l%b(?MIn,@/XO2@f9g9AGTm9B)QB8B[(8gCA;TDD#S;LDZ=YSE;aeVErL.YFT6L`G5ZXa
+GlN'fHN&9kI/A?kIf=ioJGk&tK)(&uK`-W$LAlu-M#E20MZ8V5Muo!!NrG+>O8tFBOo^c2rfoj:
+Q^F/.R[]e:SXuFFTV8'RUSO]_Vl-JmWiN5'Xfen4Z*L^C[C3NQ\[f;`]Y(tn^VI\&_Sa=2`Q#s>
+aN;TJbKS61c2u>=d/MDodaQ\EeGn)!f)=5"f`0Y%gATe*h"ok*hYl@/i;V^7iqqd9jSn9=k5XWE
+kl'cGlMp2Km/QJQmeuVSnGi%Vo)J=]o_nI^pAambq#:*gqYL*fr;?N`rdk*#s8N%K~>
+JcC<$JcEIak5P2Tqu$9erVHNhr:p<ds7ZEas7H?_rpp*Z!:^!V4RVV(m-O'(lKRQskND!ijlGI^
+io8qTi8<DIh;$c=g=b-2f@SU(eC;sqdF$=fcd'h\bfe2Pb/q`Ga2\+t!Q;nT_?%KgrkB/]]tD"i
+]=PP`\@B#V[^EKLZa6sBricR0Y-"h-X8]+QWMl_mVPU)aUSFQWTqJ$LSt2C@S!ob5R$a5+Q'ISt
+P*1rhO,o<]NJrgSMM[1GL]3#8KnP)2Jq8K'J:E%II0"_Brd"fpG^+FVG'8$-FT6C^ErL(YE;skU
+DZ=SRD#A)KCB&#FB`;ZDB)6*;AGp$6@f9a7@/=7/?N+7->lIt+>5MJ$=T)=o<p`oZ<r5tr=S>no
+>4u1X>l%b(?MIn,@/XO2@f9g9AGTm9B)QB8B[(8gCA;TDD#S;LDZ=YSE;aeVErL.YFT6L`G5ZXa
+GlN'fHN&9kI/A?kIf=ioJGk&tK)(&uK`-W$LAlu-M#E20MZ8V5Muo!!NrG+>O8tFBOo^c2rfoj:
+Q^F/.R[]e:SXuFFTV8'RUSO]_Vl-JmWiN5'Xfen4Z*L^C[C3NQ\[f;`]Y(tn^VI\&_Sa=2`Q#s>
+aN;TJbKS61c2u>=d/MDodaQ\EeGn)!f)=5"f`0Y%gATe*h"ok*hYl@/i;V^7iqqd9jSn9=k5XWE
+kl'cGlMp2Km/QJQmeuVSnGi%Vo)J=]o_nI^pAambq#:*gqYL*fr;?N`rdk*#s8N%K~>
+JcC<$JcEC_k5P5Uqu$9erqcWir:p9cs7ZEas7?<_rUL3`nF5o8mdBKAliHG;rojIIkPjTIjlGI^
+io0mp$/aUqh;$c=g=b-Xf+-B^eC;sqdF$=fcd'h\bl5d,b/q`Ga2c3=`Pf[3_SX.)^q[Xu]tM(k
+]=PSa\[]-J[K3eCrj+VjZ*:I9Y-+n/XK/A$WMlbnVl$;dUnaZXTqJ$MSt;LCS"#k7R$a5+Q'ISt
+PEM)kOH5H_NJrgSMZ/G9Lkg_>KnTGX!J5n%J-LLPI=6KjHiA<lH$K=4s)nBbrcA3_EcV/!s)A!V
+rGMXPs(qXLrbDIIqe5tAratt;rFGk:qI9D3ra>S0ra,S0qHX#(r`]/$rE0#"g/e)Pr)iYqqHEYu
+gKaP[r*K/*ra>\5qdTM6rabk:rFZ"@ok;TaqeGqBrbVRNqelFPs)@mUs)S-\rH/'^s*"?bs*4Ng
+rHeKjrd=Wls*jrsqgeZsrIXlurIk-'qM,!)rJ:B.s,-i7r/:]:NfO(!#EY(1P*2#mPl?q8QC!u+
+R@9V7S=Q7CT:hmOU8+N[V5C/hWN)u!Xf\b0Yd(L?Za@0L\%&u[]=bei^;%J"_SX4/`Poj;aN2KG
+bKJ,SrltPjd/MGmdK%bqeGn)!f)=5#f`'S%gA]k*h"ok+hYl@.i;MX6iqqd9jSn9=k5XWDkl'cG
+lMp2Km/QJQmelPRnGi%Wo)J=]o_eC^pAambq#:*gqYL*fr;?N`rdk*#s8DtJ~>
+JcC<$JcEC_k5P5Uqu$9erqcWir:p9cs7ZEas7?<_rUL3`nF5o8mdBKAliHG;rojIIkPjTIjlGI^
+io0mp$/aUqh;$c=g=b-Xf+-B^eC;sqdF$=fcd'h\bl5d,b/q`Ga2c3=`Pf[3_SX.)^q[Xu]tM(k
+]=PSa\[]-J[K3eCrj+VjZ*:I9Y-+n/XK/A$WMlbnVl$;dUnaZXTqJ$MSt;LCS"#k7R$a5+Q'ISt
+PEM)kOH5H_NJrgSMZ/G9Lkg_>KnTGX!J5n%J-LLPI=6KjHiA<lH$K=4s)nBbrcA3_EcV/!s)A!V
+rGMXPs(qXLrbDIIqe5tAratt;rFGk:qI9D3ra>S0ra,S0qHX#(r`]/$rE0#"g/e)Pr)iYqqHEYu
+gKaP[r*K/*ra>\5qdTM6rabk:rFZ"@ok;TaqeGqBrbVRNqelFPs)@mUs)S-\rH/'^s*"?bs*4Ng
+rHeKjrd=Wls*jrsqgeZsrIXlurIk-'qM,!)rJ:B.s,-i7r/:]:NfO(!#EY(1P*2#mPl?q8QC!u+
+R@9V7S=Q7CT:hmOU8+N[V5C/hWN)u!Xf\b0Yd(L?Za@0L\%&u[]=bei^;%J"_SX4/`Poj;aN2KG
+bKJ,SrltPjd/MGmdK%bqeGn)!f)=5#f`'S%gA]k*h"ok+hYl@.i;MX6iqqd9jSn9=k5XWDkl'cG
+lMp2Km/QJQmelPRnGi%Wo)J=]o_eC^pAambq#:*gqYL*fr;?N`rdk*#s8DtJ~>
+JcC<$JcEC_k5P5Uqu$9erqcWir:p9cs7ZEas7?<_rUL3`nF5o8mdBKAliHG;rojIIkPjTIjlGI^
+io0mp$/aUqh;$c=g=b-Xf+-B^eC;sqdF$=fcd'h\bl5d,b/q`Ga2c3=`Pf[3_SX.)^q[Xu]tM(k
+]=PSa\[]-J[K3eCrj+VjZ*:I9Y-+n/XK/A$WMlbnVl$;dUnaZXTqJ$MSt;LCS"#k7R$a5+Q'ISt
+PEM)kOH5H_NJrgSMZ/G9Lkg_>KnTGX!J5n%J-LLPI=6KjHiA<lH$K=4s)nBbrcA3_EcV/!s)A!V
+rGMXPs(qXLrbDIIqe5tAratt;rFGk:qI9D3ra>S0ra,S0qHX#(r`]/$rE0#"g/e)Pr)iYqqHEYu
+gKaP[r*K/*ra>\5qdTM6rabk:rFZ"@ok;TaqeGqBrbVRNqelFPs)@mUs)S-\rH/'^s*"?bs*4Ng
+rHeKjrd=Wls*jrsqgeZsrIXlurIk-'qM,!)rJ:B.s,-i7r/:]:NfO(!#EY(1P*2#mPl?q8QC!u+
+R@9V7S=Q7CT:hmOU8+N[V5C/hWN)u!Xf\b0Yd(L?Za@0L\%&u[]=bei^;%J"_SX4/`Poj;aN2KG
+bKJ,SrltPjd/MGmdK%bqeGn)!f)=5#f`'S%gA]k*h"ok+hYl@.i;MX6iqqd9jSn9=k5XWDkl'cG
+lMp2Km/QJQmelPRnGi%Wo)J=]o_eC^pAambq#:*gqYL*fr;?N`rdk*#s8DtJ~>
+JcC<$JcE=]k5P5Ur;?BfrqcWir:p<ds7ZEas7H?_rpp*Z!:^!V,4=jcm-O'(lKRQski_*jjlGL_
+j5T%Ui8<DJh;-l@g=k64rmq>)e^W*tdf.W$d*L"_c-4DTbK@s+a8s?$rl"oV_u@LR_8-&b!PZ8H
+]E,XUrj`'>\,NfC[C!9HZE^[=Yck5/XVS"=WiE%sVl-DgV50o^U7n9RT:VXFSGnurR[KP1Q^3o%
+P`q8nOcYWbNfK*XN/NRMM26rdL'iWfK7ec,JUi9#If=a#I!^3dH?jd\rc\EeF`m\*!crC&rc.sW
+s)7jRs)%dPr+l=Irb;7CrFc+Aq.9M8raYb5raGe6qHs5.ra#D+r`fA*q-!Yur)_iXqcEYsp0%8r
+q-2KVq-El(pg=#.rF,S4rF>h;qITV;rFbh;c>!,iphTkFrb_RNs)7mUrGhjXs)\-\s)n?brHJ9d
+s*=Qhrd4Zmr-eTordXirrdk'#qLea"rIt*&rJ1B.qhb?1rep`6s,I&=rJq#AOcfX+$^6g>Q'IZ$
+Q^F/.Rf8d;S=Q7CT:hmPUSO]^VPg>jWiE,$Xf\e2Yd(L?['d?O\@K/]]=bhk^V@S$_Sa=2`Q#s>
+aN;TJbKS61c2l8<rm:eqe'n<G!nGlQrR_)%s4R>(rnIG-qVD,,rnmP0rSdb8qr@\:roO(?roa=F
+r9=7Hs6KXMs6]jSr9s[Ts7-'Ys7?9_r:U*`rqH?crqZQiqYU6hr;H0bJcC<$rVqB~>
+JcC<$JcE=]k5P5Ur;?BfrqcWir:p<ds7ZEas7H?_rpp*Z!:^!V,4=jcm-O'(lKRQski_*jjlGL_
+j5T%Ui8<DJh;-l@g=k64rmq>)e^W*tdf.W$d*L"_c-4DTbK@s+a8s?$rl"oV_u@LR_8-&b!PZ8H
+]E,XUrj`'>\,NfC[C!9HZE^[=Yck5/XVS"=WiE%sVl-DgV50o^U7n9RT:VXFSGnurR[KP1Q^3o%
+P`q8nOcYWbNfK*XN/NRMM26rdL'iWfK7ec,JUi9#If=a#I!^3dH?jd\rc\EeF`m\*!crC&rc.sW
+s)7jRs)%dPr+l=Irb;7CrFc+Aq.9M8raYb5raGe6qHs5.ra#D+r`fA*q-!Yur)_iXqcEYsp0%8r
+q-2KVq-El(pg=#.rF,S4rF>h;qITV;rFbh;c>!,iphTkFrb_RNs)7mUrGhjXs)\-\s)n?brHJ9d
+s*=Qhrd4Zmr-eTordXirrdk'#qLea"rIt*&rJ1B.qhb?1rep`6s,I&=rJq#AOcfX+$^6g>Q'IZ$
+Q^F/.Rf8d;S=Q7CT:hmPUSO]^VPg>jWiE,$Xf\e2Yd(L?['d?O\@K/]]=bhk^V@S$_Sa=2`Q#s>
+aN;TJbKS61c2l8<rm:eqe'n<G!nGlQrR_)%s4R>(rnIG-qVD,,rnmP0rSdb8qr@\:roO(?roa=F
+r9=7Hs6KXMs6]jSr9s[Ts7-'Ys7?9_r:U*`rqH?crqZQiqYU6hr;H0bJcC<$rVqB~>
+JcC<$JcE=]k5P5Ur;?BfrqcWir:p<ds7ZEas7H?_rpp*Z!:^!V,4=jcm-O'(lKRQski_*jjlGL_
+j5T%Ui8<DJh;-l@g=k64rmq>)e^W*tdf.W$d*L"_c-4DTbK@s+a8s?$rl"oV_u@LR_8-&b!PZ8H
+]E,XUrj`'>\,NfC[C!9HZE^[=Yck5/XVS"=WiE%sVl-DgV50o^U7n9RT:VXFSGnurR[KP1Q^3o%
+P`q8nOcYWbNfK*XN/NRMM26rdL'iWfK7ec,JUi9#If=a#I!^3dH?jd\rc\EeF`m\*!crC&rc.sW
+s)7jRs)%dPr+l=Irb;7CrFc+Aq.9M8raYb5raGe6qHs5.ra#D+r`fA*q-!Yur)_iXqcEYsp0%8r
+q-2KVq-El(pg=#.rF,S4rF>h;qITV;rFbh;c>!,iphTkFrb_RNs)7mUrGhjXs)\-\s)n?brHJ9d
+s*=Qhrd4Zmr-eTordXirrdk'#qLea"rIt*&rJ1B.qhb?1rep`6s,I&=rJq#AOcfX+$^6g>Q'IZ$
+Q^F/.Rf8d;S=Q7CT:hmPUSO]^VPg>jWiE,$Xf\e2Yd(L?['d?O\@K/]]=bhk^V@S$_Sa=2`Q#s>
+aN;TJbKS61c2l8<rm:eqe'n<G!nGlQrR_)%s4R>(rnIG-qVD,,rnmP0rSdb8qr@\:roO(?roa=F
+r9=7Hs6KXMs6]jSr9s[Ts7-'Ys7?9_r:U*`rqH?crqZQiqYU6hr;H0bJcC<$rVqB~>
+JcC<$JcE7[kPk>Vr;?BfrqcWir:p<ds7ZEas7H?_rpg-\nF6GG&FSrQm-O''lKRQskND!ijlHF$
+"leM!i8<Djh%&5pg=k64f@SU)e^W*tdf.WLd*L"_c-=JUbK@rKaN2EA`l5p8_o'@._83q%^V7Fq
+]Y(kg]",A]\@8oT[C!<IZa-k8YQ_55Xf\\*ri.$=W2HPjV50o^U7n9RTV%gISXc1=R[KP1Q^3o%
+P`u*0$'C=1O,f3YN/NSmM$8]jL5(D8rdt6'Jc:0#It%BF!IT7nH3/A:GlDmgG'.s,F96N(ErL(Y
+E;skTDZ4MQD#A)JCAqrEB`2TCB)-$:AH$*8@fBg8@/F=1?N+7,>lIt,>5;>"=Sl1b<r#hp=S>no
+>5DIT>k_P$?MIn+@/XO2@f9g9AGTm9B)QB9B[:DhCA;TDD#S;LDZ4SSE;aeVErU4ZFT6L`G5ZXb
+GlN'fHN/?lI/JEmIfFopJH(3"K)1-!K`-W$LAco,M#)u-MZ8V4N;nn;Nr>%=O8tFAOo^c2rfm\R
+Q^=),R@=,E5Fe:9StD[LTq\<XV5C/gW2ZesXKAV-YHY:;Za7'J[^WcW]">Vf^;%Fu_8=(,`Poj;
+aN2KGbKJ,Sc-FV\d/MDndaS3Fs4./#rn%2&s4R>(s4dP.qVD/-rSRG/ro*h8qW%S9roO(?roa=F
+r9=7Hrp0OLs6]jSr9s[Ts7-'Ys7?6^rUp0`s7cHdrqZQiqYU6hr;H0bJcC<$r;V9~>
+JcC<$JcE7[kPk>Vr;?BfrqcWir:p<ds7ZEas7H?_rpg-\nF6GG&FSrQm-O''lKRQskND!ijlHF$
+"leM!i8<Djh%&5pg=k64f@SU)e^W*tdf.WLd*L"_c-=JUbK@rKaN2EA`l5p8_o'@._83q%^V7Fq
+]Y(kg]",A]\@8oT[C!<IZa-k8YQ_55Xf\\*ri.$=W2HPjV50o^U7n9RTV%gISXc1=R[KP1Q^3o%
+P`u*0$'C=1O,f3YN/NSmM$8]jL5(D8rdt6'Jc:0#It%BF!IT7nH3/A:GlDmgG'.s,F96N(ErL(Y
+E;skTDZ4MQD#A)JCAqrEB`2TCB)-$:AH$*8@fBg8@/F=1?N+7,>lIt,>5;>"=Sl1b<r#hp=S>no
+>5DIT>k_P$?MIn+@/XO2@f9g9AGTm9B)QB9B[:DhCA;TDD#S;LDZ4SSE;aeVErU4ZFT6L`G5ZXb
+GlN'fHN/?lI/JEmIfFopJH(3"K)1-!K`-W$LAco,M#)u-MZ8V4N;nn;Nr>%=O8tFAOo^c2rfm\R
+Q^=),R@=,E5Fe:9StD[LTq\<XV5C/gW2ZesXKAV-YHY:;Za7'J[^WcW]">Vf^;%Fu_8=(,`Poj;
+aN2KGbKJ,Sc-FV\d/MDndaS3Fs4./#rn%2&s4R>(s4dP.qVD/-rSRG/ro*h8qW%S9roO(?roa=F
+r9=7Hrp0OLs6]jSr9s[Ts7-'Ys7?6^rUp0`s7cHdrqZQiqYU6hr;H0bJcC<$r;V9~>
+JcC<$JcE7[kPk>Vr;?BfrqcWir:p<ds7ZEas7H?_rpg-\nF6GG&FSrQm-O''lKRQskND!ijlHF$
+"leM!i8<Djh%&5pg=k64f@SU)e^W*tdf.WLd*L"_c-=JUbK@rKaN2EA`l5p8_o'@._83q%^V7Fq
+]Y(kg]",A]\@8oT[C!<IZa-k8YQ_55Xf\\*ri.$=W2HPjV50o^U7n9RTV%gISXc1=R[KP1Q^3o%
+P`u*0$'C=1O,f3YN/NSmM$8]jL5(D8rdt6'Jc:0#It%BF!IT7nH3/A:GlDmgG'.s,F96N(ErL(Y
+E;skTDZ4MQD#A)JCAqrEB`2TCB)-$:AH$*8@fBg8@/F=1?N+7,>lIt,>5;>"=Sl1b<r#hp=S>no
+>5DIT>k_P$?MIn+@/XO2@f9g9AGTm9B)QB9B[:DhCA;TDD#S;LDZ4SSE;aeVErU4ZFT6L`G5ZXb
+GlN'fHN/?lI/JEmIfFopJH(3"K)1-!K`-W$LAco,M#)u-MZ8V4N;nn;Nr>%=O8tFAOo^c2rfm\R
+Q^=),R@=,E5Fe:9StD[LTq\<XV5C/gW2ZesXKAV-YHY:;Za7'J[^WcW]">Vf^;%Fu_8=(,`Poj;
+aN2KGbKJ,Sc-FV\d/MDndaS3Fs4./#rn%2&s4R>(s4dP.qVD/-rSRG/ro*h8qW%S9roO(?roa=F
+r9=7Hrp0OLs6]jSr9s[Ts7-'Ys7?6^rUp0`s7cHdrqZQiqYU6hr;H0bJcC<$r;V9~>
+JcC<$JcE1Ykl1GWr;?BfrqcWir:p<ds7ZEas7?<_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-*9H8A
+j5T%Vi8EMLh;-lAgY1B7f[na+f%&:"e'e6C!RT0lc2l26rlY>bao9?^a2\+t!Q;nT_?%KgrkB#Y
+]tM(k]=PSa\[],X[^NTNrj**?Z*:I9Y-+n/XK/A$WMofo,,V34UnaZXTqJ$LSt2C@S!ob5R$a5+
+Q'IStP*1rhO,o<\req#=MM[1GL]3#>KnP)2Jq8K'J:E#sI=6KjHiA<lH$K=4s)nBbrH&*^EcV+u
+s)A!VrGMXPrbVLJrbDFHqIoh?ratt;rabt;qdTP5ra>V1ra,S0qcs,)rEB#"r)i_qpK%#iqH3Go
+qc`i#f3IuSqHir(rF#V5qI9G6rFGb9rau+Ap1X)4phJo)qJ,e@rbVRNqelFPs)@pVrc8$[rcJ0_
+s*"?bs*4QhrHeKjs*Xcns*jutr.+cts+:-#re16(qM,!)rJ:<,reg]5r/CW7s,R&=s,d8CrfR>H
+Pa)04!LB)OQiWVDrgQ-BSXuFFTV8'RUSO]^Vl-JmWiE,$Xfek3Yd1UA['d?O\@K/^]Y(ql^VI\&
+_Sa=2`Q-'@ai_fMbg"DXcHjl:d/h\Erm^tu!7q/$s4IA)rS%8*s4mM-rSIP2q;D51rSm\6roF(?
+qr[n@roj:Es6BXMr9XINs6fgRs7$'YrUTsZs7H6^s7ZKeqtU0drqcKgrVZTlnc"+>JcGZJJ,~>
+JcC<$JcE1Ykl1GWr;?BfrqcWir:p<ds7ZEas7?<_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-*9H8A
+j5T%Vi8EMLh;-lAgY1B7f[na+f%&:"e'e6C!RT0lc2l26rlY>bao9?^a2\+t!Q;nT_?%KgrkB#Y
+]tM(k]=PSa\[],X[^NTNrj**?Z*:I9Y-+n/XK/A$WMofo,,V34UnaZXTqJ$LSt2C@S!ob5R$a5+
+Q'IStP*1rhO,o<\req#=MM[1GL]3#>KnP)2Jq8K'J:E#sI=6KjHiA<lH$K=4s)nBbrH&*^EcV+u
+s)A!VrGMXPrbVLJrbDFHqIoh?ratt;rabt;qdTP5ra>V1ra,S0qcs,)rEB#"r)i_qpK%#iqH3Go
+qc`i#f3IuSqHir(rF#V5qI9G6rFGb9rau+Ap1X)4phJo)qJ,e@rbVRNqelFPs)@pVrc8$[rcJ0_
+s*"?bs*4QhrHeKjs*Xcns*jutr.+cts+:-#re16(qM,!)rJ:<,reg]5r/CW7s,R&=s,d8CrfR>H
+Pa)04!LB)OQiWVDrgQ-BSXuFFTV8'RUSO]^Vl-JmWiE,$Xfek3Yd1UA['d?O\@K/^]Y(ql^VI\&
+_Sa=2`Q-'@ai_fMbg"DXcHjl:d/h\Erm^tu!7q/$s4IA)rS%8*s4mM-rSIP2q;D51rSm\6roF(?
+qr[n@roj:Es6BXMr9XINs6fgRs7$'YrUTsZs7H6^s7ZKeqtU0drqcKgrVZTlnc"+>JcGZJJ,~>
+JcC<$JcE1Ykl1GWr;?BfrqcWir:p<ds7ZEas7?<_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-*9H8A
+j5T%Vi8EMLh;-lAgY1B7f[na+f%&:"e'e6C!RT0lc2l26rlY>bao9?^a2\+t!Q;nT_?%KgrkB#Y
+]tM(k]=PSa\[],X[^NTNrj**?Z*:I9Y-+n/XK/A$WMofo,,V34UnaZXTqJ$LSt2C@S!ob5R$a5+
+Q'IStP*1rhO,o<\req#=MM[1GL]3#>KnP)2Jq8K'J:E#sI=6KjHiA<lH$K=4s)nBbrH&*^EcV+u
+s)A!VrGMXPrbVLJrbDFHqIoh?ratt;rabt;qdTP5ra>V1ra,S0qcs,)rEB#"r)i_qpK%#iqH3Go
+qc`i#f3IuSqHir(rF#V5qI9G6rFGb9rau+Ap1X)4phJo)qJ,e@rbVRNqelFPs)@pVrc8$[rcJ0_
+s*"?bs*4QhrHeKjs*Xcns*jutr.+cts+:-#re16(qM,!)rJ:<,reg]5r/CW7s,R&=s,d8CrfR>H
+Pa)04!LB)OQiWVDrgQ-BSXuFFTV8'RUSO]^Vl-JmWiE,$Xfek3Yd1UA['d?O\@K/^]Y(ql^VI\&
+_Sa=2`Q-'@ai_fMbg"DXcHjl:d/h\Erm^tu!7q/$s4IA)rS%8*s4mM-rSIP2q;D51rSm\6roF(?
+qr[n@roj:Es6BXMr9XINs6fgRs7$'YrUTsZs7H6^s7ZKeqtU0drqcKgrVZTlnc"+>JcGZJJ,~>
+JcC<$JcE.Xkl1GWr;?BfrqcZjr:p<drq??as7H?_rpp*Z!:^!V#O_!Hm-O'(lMg#Tki_*jjlPR`
+j5T%si#(A.h;-l@gY1B7f[na+f%&:"e'c[ldEp5=c2l26rlY>bao9?ia2Z-<`Pf^4_SX.*_#D(L
+^:jNY!P>rB\H04LrjEcR['R*EZ*CO;YHG"0XK/D%Wi;qpVl$;dUna[`Tb3riSt;LCS"#k7R$a5+
+Q'IStrfRSMOH5H_NJrgSMZ/G9Lkg_>KnTGX!J5n%J,t.Krd=iqH[Ga<!I8qhGQ2jdFoHL_F8p:[
+EW:"XDu=MQD>nAKC]8)JC&2NABDuN>Ac60=A,Ba7@K'[3?iFC2?2In+>Q%b#=o)7h=8>tk=o2D"
+>MEEN?2@n%?i=C3@JXI4A,Ts8Ac66>BD-$6C$]U)C%lB;C]8/LD>S5NDuXeTEW0tYF8^4\FoQX`
+GQ2pfH2`-iHiJKlIK+crJ,FisJc:9!KDpQ'L&-Q'L]*&*M>iD2Mu8P5NW5%:O8k=AOoCODP5pjH
+Q2d-MQi<?QR@=,E5Fe:9StD[LTq\<XUnsrdVl?\rX/rG*YHY79ZEppG[^NZU\[oDc]tV7r^qmn*
+`5T^8a2l?Db0.uPc-FV\d/MDndaS3F!nGlQrn%2&s4RA)s4dS/r8%>.rnmS1rSd_7q;_J8rT3q=
+roa:Er9=7Hrp0LKs6]jSr9s[Ts7-'Yrq$0^r:U*`rqH?crqZQiqYU6hr;H-aJcC<$r;V9~>
+JcC<$JcE.Xkl1GWr;?BfrqcZjr:p<drq??as7H?_rpp*Z!:^!V#O_!Hm-O'(lMg#Tki_*jjlPR`
+j5T%si#(A.h;-l@gY1B7f[na+f%&:"e'c[ldEp5=c2l26rlY>bao9?ia2Z-<`Pf^4_SX.*_#D(L
+^:jNY!P>rB\H04LrjEcR['R*EZ*CO;YHG"0XK/D%Wi;qpVl$;dUna[`Tb3riSt;LCS"#k7R$a5+
+Q'IStrfRSMOH5H_NJrgSMZ/G9Lkg_>KnTGX!J5n%J,t.Krd=iqH[Ga<!I8qhGQ2jdFoHL_F8p:[
+EW:"XDu=MQD>nAKC]8)JC&2NABDuN>Ac60=A,Ba7@K'[3?iFC2?2In+>Q%b#=o)7h=8>tk=o2D"
+>MEEN?2@n%?i=C3@JXI4A,Ts8Ac66>BD-$6C$]U)C%lB;C]8/LD>S5NDuXeTEW0tYF8^4\FoQX`
+GQ2pfH2`-iHiJKlIK+crJ,FisJc:9!KDpQ'L&-Q'L]*&*M>iD2Mu8P5NW5%:O8k=AOoCODP5pjH
+Q2d-MQi<?QR@=,E5Fe:9StD[LTq\<XUnsrdVl?\rX/rG*YHY79ZEppG[^NZU\[oDc]tV7r^qmn*
+`5T^8a2l?Db0.uPc-FV\d/MDndaS3F!nGlQrn%2&s4RA)s4dS/r8%>.rnmS1rSd_7q;_J8rT3q=
+roa:Er9=7Hrp0LKs6]jSr9s[Ts7-'Yrq$0^r:U*`rqH?crqZQiqYU6hr;H-aJcC<$r;V9~>
+JcC<$JcE.Xkl1GWr;?BfrqcZjr:p<drq??as7H?_rpp*Z!:^!V#O_!Hm-O'(lMg#Tki_*jjlPR`
+j5T%si#(A.h;-l@gY1B7f[na+f%&:"e'c[ldEp5=c2l26rlY>bao9?ia2Z-<`Pf^4_SX.*_#D(L
+^:jNY!P>rB\H04LrjEcR['R*EZ*CO;YHG"0XK/D%Wi;qpVl$;dUna[`Tb3riSt;LCS"#k7R$a5+
+Q'IStrfRSMOH5H_NJrgSMZ/G9Lkg_>KnTGX!J5n%J,t.Krd=iqH[Ga<!I8qhGQ2jdFoHL_F8p:[
+EW:"XDu=MQD>nAKC]8)JC&2NABDuN>Ac60=A,Ba7@K'[3?iFC2?2In+>Q%b#=o)7h=8>tk=o2D"
+>MEEN?2@n%?i=C3@JXI4A,Ts8Ac66>BD-$6C$]U)C%lB;C]8/LD>S5NDuXeTEW0tYF8^4\FoQX`
+GQ2pfH2`-iHiJKlIK+crJ,FisJc:9!KDpQ'L&-Q'L]*&*M>iD2Mu8P5NW5%:O8k=AOoCODP5pjH
+Q2d-MQi<?QR@=,E5Fe:9StD[LTq\<XUnsrdVl?\rX/rG*YHY79ZEppG[^NZU\[oDc]tV7r^qmn*
+`5T^8a2l?Db0.uPc-FV\d/MDndaS3F!nGlQrn%2&s4RA)s4dS/r8%>.rnmS1rSd_7q;_J8rT3q=
+roa:Er9=7Hrp0LKs6]jSr9s[Ts7-'Yrq$0^r:U*`rqH?crqZQiqYU6hr;H-aJcC<$r;V9~>
+JcC<$JcE%Ul2LSYr;?EgrqcWir:p<ds7ZEas7?<_rUL$[nF6GG!Uf@SljN.ElKRQskND!ijlHF$
+$KC%&i8<GKh;-l@rn8:Df[na+f%&:"e'lamdEp4ccHa\Zbfe2Pb/sY(!QW4Z`=0]&_ns:,_8*h#
+^:q;[]FVWc\[f5[\$i`Q['[0GZEaD5$*UM6XfSS'Wi;rrV`L]OUnjc[TqS-OSt;LCS"#k7R$a5+
+QBd`"PEM)kOH5H_NJrgSMi*@JLkg_>KnY24K7\Z*J:N-!If=`rI!bj=s*4ThrceBc!-S6^s)\3\
+rGhjVs)7gQs)%aOqeQ.Frb;4BrFc+AqITY:raYh7raGe6r*TG0ra#A*r`f>)p0$Z_o3(roqciGm
+gKjV]pL!l,rF,P3raYq<qITV;rFbk<phAo+q.]J9phThErb_RNs)7mUrGhjXs)\-\!d/[0rHJ9d
+s*=Tis*OcnrI+]ps*suts+10$r.G$&re:6(reLH.qMG3/rJUQ3rf-o;rK$u?rfR2Cs-*JIrfp*A
+Q^=),R@0M5S"-">St;RITqS3UUnjiaVl-JmWiN5'Xfek3Z*L^B['mEP\@K2_]Y(qm^VI\&_Sa@3
+`lH0Aai_fMbg"GYcd;[=!RfHre,e+NrRV,'g"H>Xs4dS/r8%A/rnmS1rSd_7q;_G7roO"=roa:E
+r9=4Gs6KULrpBaRr9s[Ts7-$Xs7?9_r:U*`rqH?crqZQiq>:-gr;H0bJcC<$qu;0~>
+JcC<$JcE%Ul2LSYr;?EgrqcWir:p<ds7ZEas7?<_rUL$[nF6GG!Uf@SljN.ElKRQskND!ijlHF$
+$KC%&i8<GKh;-l@rn8:Df[na+f%&:"e'lamdEp4ccHa\Zbfe2Pb/sY(!QW4Z`=0]&_ns:,_8*h#
+^:q;[]FVWc\[f5[\$i`Q['[0GZEaD5$*UM6XfSS'Wi;rrV`L]OUnjc[TqS-OSt;LCS"#k7R$a5+
+QBd`"PEM)kOH5H_NJrgSMi*@JLkg_>KnY24K7\Z*J:N-!If=`rI!bj=s*4ThrceBc!-S6^s)\3\
+rGhjVs)7gQs)%aOqeQ.Frb;4BrFc+AqITY:raYh7raGe6r*TG0ra#A*r`f>)p0$Z_o3(roqciGm
+gKjV]pL!l,rF,P3raYq<qITV;rFbk<phAo+q.]J9phThErb_RNs)7mUrGhjXs)\-\!d/[0rHJ9d
+s*=Tis*OcnrI+]ps*suts+10$r.G$&re:6(reLH.qMG3/rJUQ3rf-o;rK$u?rfR2Cs-*JIrfp*A
+Q^=),R@0M5S"-">St;RITqS3UUnjiaVl-JmWiN5'Xfek3Z*L^B['mEP\@K2_]Y(qm^VI\&_Sa@3
+`lH0Aai_fMbg"GYcd;[=!RfHre,e+NrRV,'g"H>Xs4dS/r8%A/rnmS1rSd_7q;_G7roO"=roa:E
+r9=4Gs6KULrpBaRr9s[Ts7-$Xs7?9_r:U*`rqH?crqZQiq>:-gr;H0bJcC<$qu;0~>
+JcC<$JcE%Ul2LSYr;?EgrqcWir:p<ds7ZEas7?<_rUL$[nF6GG!Uf@SljN.ElKRQskND!ijlHF$
+$KC%&i8<GKh;-l@rn8:Df[na+f%&:"e'lamdEp4ccHa\Zbfe2Pb/sY(!QW4Z`=0]&_ns:,_8*h#
+^:q;[]FVWc\[f5[\$i`Q['[0GZEaD5$*UM6XfSS'Wi;rrV`L]OUnjc[TqS-OSt;LCS"#k7R$a5+
+QBd`"PEM)kOH5H_NJrgSMi*@JLkg_>KnY24K7\Z*J:N-!If=`rI!bj=s*4ThrceBc!-S6^s)\3\
+rGhjVs)7gQs)%aOqeQ.Frb;4BrFc+AqITY:raYh7raGe6r*TG0ra#A*r`f>)p0$Z_o3(roqciGm
+gKjV]pL!l,rF,P3raYq<qITV;rFbk<phAo+q.]J9phThErb_RNs)7mUrGhjXs)\-\!d/[0rHJ9d
+s*=Tis*OcnrI+]ps*suts+10$r.G$&re:6(reLH.qMG3/rJUQ3rf-o;rK$u?rfR2Cs-*JIrfp*A
+Q^=),R@0M5S"-">St;RITqS3UUnjiaVl-JmWiN5'Xfek3Z*L^B['mEP\@K2_]Y(qm^VI\&_Sa@3
+`lH0Aai_fMbg"GYcd;[=!RfHre,e+NrRV,'g"H>Xs4dS/r8%A/rnmS1rSd_7q;_G7roO"=roa:E
+r9=4Gs6KULrpBaRr9s[Ts7-$Xs7?9_r:U*`rqH?crqZQiq>:-gr;H0bJcC<$qu;0~>
+JcC<$JcE"Tl2LSYr;?EgrqcWir:p<ds7ZEa!qc*Urpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA
+isOf)i8EMMhVI#Cg]#n-g"?;U#1h>SeC2mprm:bnci22jc-611#Kk01aN2EB`r<pX`5DSk'u@]$
+^V@Lr]tD"i]=PP`\@8rU[^ELAZN[Y>Yct=6riINKX/`2!W2HPjV50o^U8"?TTV%gISXc1=R[KP1
+Q^3o%P`q8nOc]R''98'2N/NRMM26tCL5(D8KS+o/Jc:0)IsuipI=-Ehrd+Ti!-nKes*"EbrcJ0]
+s)S'Xrc%mUr,2LNrbVIIrbDCGqIok@rFYq<rac"<r*oY6ra>V1ra,S0qcs)(rEAbppfR#gqc`l$
+nQaUMpg3Z$rF#S4qI9G6rabk:rau+ApLsA:dVAMlrG;IMr,2OQrc%gUs)S-\rH/'^!-\<bs*+Nh
+rHeKjs*Xfos*jutrIFp!s+:0$re1<*qhG**reUE-regZ4qi(N6rf6l:s,d8CrK@2Es-3MJs-<YO
+rg6-BR[T_8S=Q4BStD[LTq\<XUnsrdVl6SpWiN5'Y-5(6Z*UdD[C3QS\[f;a]Y2%o^VRe(_o0O5
+a2l?Db0.uPc-FV\d/MDndaS3F!S,d#fDjJ'g&9Y)g]-(-h>Z:1htu@1iVhd3j8J';jn\'<kPj]B
+l2U&Jlhp,LmJcPPn,DhVnbhtXoDeI\p&=[bp\Xabq>U6equ-HirUKl<s+14Is*t~>
+JcC<$JcE"Tl2LSYr;?EgrqcWir:p<ds7ZEa!qc*Urpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA
+isOf)i8EMMhVI#Cg]#n-g"?;U#1h>SeC2mprm:bnci22jc-611#Kk01aN2EB`r<pX`5DSk'u@]$
+^V@Lr]tD"i]=PP`\@8rU[^ELAZN[Y>Yct=6riINKX/`2!W2HPjV50o^U8"?TTV%gISXc1=R[KP1
+Q^3o%P`q8nOc]R''98'2N/NRMM26tCL5(D8KS+o/Jc:0)IsuipI=-Ehrd+Ti!-nKes*"EbrcJ0]
+s)S'Xrc%mUr,2LNrbVIIrbDCGqIok@rFYq<rac"<r*oY6ra>V1ra,S0qcs)(rEAbppfR#gqc`l$
+nQaUMpg3Z$rF#S4qI9G6rabk:rau+ApLsA:dVAMlrG;IMr,2OQrc%gUs)S-\rH/'^!-\<bs*+Nh
+rHeKjs*Xfos*jutrIFp!s+:0$re1<*qhG**reUE-regZ4qi(N6rf6l:s,d8CrK@2Es-3MJs-<YO
+rg6-BR[T_8S=Q4BStD[LTq\<XUnsrdVl6SpWiN5'Y-5(6Z*UdD[C3QS\[f;a]Y2%o^VRe(_o0O5
+a2l?Db0.uPc-FV\d/MDndaS3F!S,d#fDjJ'g&9Y)g]-(-h>Z:1htu@1iVhd3j8J';jn\'<kPj]B
+l2U&Jlhp,LmJcPPn,DhVnbhtXoDeI\p&=[bp\Xabq>U6equ-HirUKl<s+14Is*t~>
+JcC<$JcE"Tl2LSYr;?EgrqcWir:p<ds7ZEa!qc*Urpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA
+isOf)i8EMMhVI#Cg]#n-g"?;U#1h>SeC2mprm:bnci22jc-611#Kk01aN2EB`r<pX`5DSk'u@]$
+^V@Lr]tD"i]=PP`\@8rU[^ELAZN[Y>Yct=6riINKX/`2!W2HPjV50o^U8"?TTV%gISXc1=R[KP1
+Q^3o%P`q8nOc]R''98'2N/NRMM26tCL5(D8KS+o/Jc:0)IsuipI=-Ehrd+Ti!-nKes*"EbrcJ0]
+s)S'Xrc%mUr,2LNrbVIIrbDCGqIok@rFYq<rac"<r*oY6ra>V1ra,S0qcs)(rEAbppfR#gqc`l$
+nQaUMpg3Z$rF#S4qI9G6rabk:rau+ApLsA:dVAMlrG;IMr,2OQrc%gUs)S-\rH/'^!-\<bs*+Nh
+rHeKjs*Xfos*jutrIFp!s+:0$re1<*qhG**reUE-regZ4qi(N6rf6l:s,d8CrK@2Es-3MJs-<YO
+rg6-BR[T_8S=Q4BStD[LTq\<XUnsrdVl6SpWiN5'Y-5(6Z*UdD[C3QS\[f;a]Y2%o^VRe(_o0O5
+a2l?Db0.uPc-FV\d/MDndaS3F!S,d#fDjJ'g&9Y)g]-(-h>Z:1htu@1iVhd3j8J';jn\'<kPj]B
+l2U&Jlhp,LmJcPPn,DhVnbhtXoDeI\p&=[bp\Xabq>U6equ-HirUKl<s+14Is*t~>
+JcC<$JcDqRlMg\Zr;?EgrqcWirV6Eerq??as7H?_rpp*Z!:^!V#O_!Hm-O'(lMg#Kki_s-&*;m4
+j5T(Wi8EMLhVI#Cg]#n-g"?;U!S5g#e,e%Hrm:bnci22pc-4DTbK@uLrl>,\`r<sW_uR^S_?%Kg
+rkAKJ^&GYF]=S!P!P#W<[O\bmZa6sBZ*:I9Y-"h-X/`2!WMl_mVPU)aUS=HUTV%gISXc1=R[KP1
+Q^7W9&sSTCP*(ieO,f3YN/NUOM2@%Dre:H-K`6T)Jq<oO!IoRtIK+ZpHiA?kGlW*fG62r1Fo?F^
+F8p:ZEW0qWDu=MPD>e;JC]8)IC&2NBBDuN?Ac?6>A,Kg8@K'[4?iFC2?2@h)>Pq[_=o)>!>Ol%J
+?2%\!?i4=2@JXI4A,Ts8Ac66>BD?0:C"$hiC]/)KD>\;NDuXeTEW:(ZF8^4\FT?U`GQ2mfH2W'h
+HN8HlIK+crJ,XuuJc:9"KE$W)L&6W)L]3,+M>iD2Mu/J3NW+t8O8k=@Oo:ICPQ-mHQ2d0MQi<?Q
+R@=,E8t;HCSt;RITqS3UUnjiaVl-JmWiE,$Xf\e2Yd(L?['d?N\%&u[]=bej^V@S#_Sa=2`Q#s>
+aND]Lbg"GYcd:%ddF-LneCE+#rmq5(g"HAYs4dS/rS@M1rnmV2ro*h8q;_D6rT3n<rTF1DqW\%F
+rp0LKrpBaRr9sXSs7-$Xs7?9_r:U'_rqH?crqZQiq>:-gr;H0bJcC<$qYu'~>
+JcC<$JcDqRlMg\Zr;?EgrqcWirV6Eerq??as7H?_rpp*Z!:^!V#O_!Hm-O'(lMg#Kki_s-&*;m4
+j5T(Wi8EMLhVI#Cg]#n-g"?;U!S5g#e,e%Hrm:bnci22pc-4DTbK@uLrl>,\`r<sW_uR^S_?%Kg
+rkAKJ^&GYF]=S!P!P#W<[O\bmZa6sBZ*:I9Y-"h-X/`2!WMl_mVPU)aUS=HUTV%gISXc1=R[KP1
+Q^7W9&sSTCP*(ieO,f3YN/NUOM2@%Dre:H-K`6T)Jq<oO!IoRtIK+ZpHiA?kGlW*fG62r1Fo?F^
+F8p:ZEW0qWDu=MPD>e;JC]8)IC&2NBBDuN?Ac?6>A,Kg8@K'[4?iFC2?2@h)>Pq[_=o)>!>Ol%J
+?2%\!?i4=2@JXI4A,Ts8Ac66>BD?0:C"$hiC]/)KD>\;NDuXeTEW:(ZF8^4\FT?U`GQ2mfH2W'h
+HN8HlIK+crJ,XuuJc:9"KE$W)L&6W)L]3,+M>iD2Mu/J3NW+t8O8k=@Oo:ICPQ-mHQ2d0MQi<?Q
+R@=,E8t;HCSt;RITqS3UUnjiaVl-JmWiE,$Xf\e2Yd(L?['d?N\%&u[]=bej^V@S#_Sa=2`Q#s>
+aND]Lbg"GYcd:%ddF-LneCE+#rmq5(g"HAYs4dS/rS@M1rnmV2ro*h8q;_D6rT3n<rTF1DqW\%F
+rp0LKrpBaRr9sXSs7-$Xs7?9_r:U'_rqH?crqZQiq>:-gr;H0bJcC<$qYu'~>
+JcC<$JcDqRlMg\Zr;?EgrqcWirV6Eerq??as7H?_rpp*Z!:^!V#O_!Hm-O'(lMg#Kki_s-&*;m4
+j5T(Wi8EMLhVI#Cg]#n-g"?;U!S5g#e,e%Hrm:bnci22pc-4DTbK@uLrl>,\`r<sW_uR^S_?%Kg
+rkAKJ^&GYF]=S!P!P#W<[O\bmZa6sBZ*:I9Y-"h-X/`2!WMl_mVPU)aUS=HUTV%gISXc1=R[KP1
+Q^7W9&sSTCP*(ieO,f3YN/NUOM2@%Dre:H-K`6T)Jq<oO!IoRtIK+ZpHiA?kGlW*fG62r1Fo?F^
+F8p:ZEW0qWDu=MPD>e;JC]8)IC&2NBBDuN?Ac?6>A,Kg8@K'[4?iFC2?2@h)>Pq[_=o)>!>Ol%J
+?2%\!?i4=2@JXI4A,Ts8Ac66>BD?0:C"$hiC]/)KD>\;NDuXeTEW:(ZF8^4\FT?U`GQ2mfH2W'h
+HN8HlIK+crJ,XuuJc:9"KE$W)L&6W)L]3,+M>iD2Mu/J3NW+t8O8k=@Oo:ICPQ-mHQ2d0MQi<?Q
+R@=,E8t;HCSt;RITqS3UUnjiaVl-JmWiE,$Xf\e2Yd(L?['d?N\%&u[]=bej^V@S#_Sa=2`Q#s>
+aND]Lbg"GYcd:%ddF-LneCE+#rmq5(g"HAYs4dS/rS@M1rnmV2ro*h8q;_D6rT3n<rTF1DqW\%F
+rp0LKrpBaRr9sXSs7-$Xs7?9_r:U'_rqH?crqZQiq>:-gr;H0bJcC<$qYu'~>
+JcC<$JcDkPli-e[rVZNhrqcWir:p<ds7ZEas7?<_rpp*Zs7$'Ws6]mSrp1BclK[Wukih3lk2k^c
+j5].XiS`YOhYu=3gtVh^!SQ-)f)aIQrmV2%daHOjd*L&;c2l26rlYPhaiVWFa2c4!`<X?!_ns:,
+_8-&b!PZ8H]E,XUrjc%=\$i`Q[C!9HZE^X<YHP+2XfSS'Wi;qpVl$;dUnaZXTqJ'NSt;LCS"#k7
+R$a5+Q'IStP*1rhO,o<]NJrgSMM[1GLkg_>KnP,3K7\Z*J:N-!If=`sI!^5>HN/6jGl;gfG'.s+
+FT6F^Er9qVE;skRDZ4MPD#.rHCAhlDB`;ZDB)?0=AH-0:@fKm9@/F=1?N+7,>l7h'>3]8d>5MOq
+>k_OM?M7b(@/XO1@fBm:AGTm:B)QB;B_uN;C@c60C@Z0=D#J5KDZ4SSE;aeVErU4ZFT6I`G5ZUd
+G^4T5H3/G@I/\QoIfForJH(3#K)L?%K`?c(LB!&.M#3&.MZ/P1N;\b8Nr+n:OT(C@P5^[FPl?sJ
+QN*<NR/`QSRf8cWS=TYN5bF^CTq\<XUnsrdVl6SpWiN5'Xfek3Z*L^B['mEP\@K/^]Y(ql^VI\&
+_Sa@3`lH0Aai_fMbg"GYcd:(edaS3F!S,d#f)jUXg&B\,gYCT_h>c@2hu)F3iVhd4j8A!:jn\';
+kPaWAl2KuIlhg&KmJcPOn,MnVnbhtXoDeI\p&=[ap\agcq>L0dqu-HjrUBf;s+14Hs*t~>
+JcC<$JcDkPli-e[rVZNhrqcWir:p<ds7ZEas7?<_rpp*Zs7$'Ws6]mSrp1BclK[Wukih3lk2k^c
+j5].XiS`YOhYu=3gtVh^!SQ-)f)aIQrmV2%daHOjd*L&;c2l26rlYPhaiVWFa2c4!`<X?!_ns:,
+_8-&b!PZ8H]E,XUrjc%=\$i`Q[C!9HZE^X<YHP+2XfSS'Wi;qpVl$;dUnaZXTqJ'NSt;LCS"#k7
+R$a5+Q'IStP*1rhO,o<]NJrgSMM[1GLkg_>KnP,3K7\Z*J:N-!If=`sI!^5>HN/6jGl;gfG'.s+
+FT6F^Er9qVE;skRDZ4MPD#.rHCAhlDB`;ZDB)?0=AH-0:@fKm9@/F=1?N+7,>l7h'>3]8d>5MOq
+>k_OM?M7b(@/XO1@fBm:AGTm:B)QB;B_uN;C@c60C@Z0=D#J5KDZ4SSE;aeVErU4ZFT6I`G5ZUd
+G^4T5H3/G@I/\QoIfForJH(3#K)L?%K`?c(LB!&.M#3&.MZ/P1N;\b8Nr+n:OT(C@P5^[FPl?sJ
+QN*<NR/`QSRf8cWS=TYN5bF^CTq\<XUnsrdVl6SpWiN5'Xfek3Z*L^B['mEP\@K/^]Y(ql^VI\&
+_Sa@3`lH0Aai_fMbg"GYcd:(edaS3F!S,d#f)jUXg&B\,gYCT_h>c@2hu)F3iVhd4j8A!:jn\';
+kPaWAl2KuIlhg&KmJcPOn,MnVnbhtXoDeI\p&=[ap\agcq>L0dqu-HjrUBf;s+14Hs*t~>
+JcC<$JcDkPli-e[rVZNhrqcWir:p<ds7ZEas7?<_rpp*Zs7$'Ws6]mSrp1BclK[Wukih3lk2k^c
+j5].XiS`YOhYu=3gtVh^!SQ-)f)aIQrmV2%daHOjd*L&;c2l26rlYPhaiVWFa2c4!`<X?!_ns:,
+_8-&b!PZ8H]E,XUrjc%=\$i`Q[C!9HZE^X<YHP+2XfSS'Wi;qpVl$;dUnaZXTqJ'NSt;LCS"#k7
+R$a5+Q'IStP*1rhO,o<]NJrgSMM[1GLkg_>KnP,3K7\Z*J:N-!If=`sI!^5>HN/6jGl;gfG'.s+
+FT6F^Er9qVE;skRDZ4MPD#.rHCAhlDB`;ZDB)?0=AH-0:@fKm9@/F=1?N+7,>l7h'>3]8d>5MOq
+>k_OM?M7b(@/XO1@fBm:AGTm:B)QB;B_uN;C@c60C@Z0=D#J5KDZ4SSE;aeVErU4ZFT6I`G5ZUd
+G^4T5H3/G@I/\QoIfForJH(3#K)L?%K`?c(LB!&.M#3&.MZ/P1N;\b8Nr+n:OT(C@P5^[FPl?sJ
+QN*<NR/`QSRf8cWS=TYN5bF^CTq\<XUnsrdVl6SpWiN5'Xfek3Z*L^B['mEP\@K/^]Y(ql^VI\&
+_Sa@3`lH0Aai_fMbg"GYcd:(edaS3F!S,d#f)jUXg&B\,gYCT_h>c@2hu)F3iVhd4j8A!:jn\';
+kPaWAl2KuIlhg&KmJcPOn,MnVnbhtXoDeI\p&=[ap\agcq>L0dqu-HjrUBf;s+14Hs*t~>
+JcC<$JcDeNm/Hn\rVZNhrqcWir:p<ds7ZHbs7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Zki_-kk2k[b
+j5].XiS`YOhYu=3gtVh^!SQ-)f*BmWe^W*tdaJ-B!RT0lc2u87bl5cdb/sY(s2P,Zrl"oV_u@Lf
+_8*k$^V7Fq]Y(kg]",A]\@8oT[C#q>$*ph?Yck43XfST&W\:?MVl-DgUnjc[TqS-OSt;LCS"#k7
+R$a5+Q'IStPEM)kOH5H_NJrgSMi*@JLkkta!JQ4+K*R!ZJUi9#It%BF!do?Ard+Tis*4Nes*"Eb
+rH/'\s)S$Wrc%jTqelCMrbVFHrbDFHqe5tArau%=s()+=r*oY6ra>V1ra,S0q-<f$k$%UcoN_/s
+b[0pKr*]J3qI9G6rFGe:rFZ%Aph9P=phJ2lr+u@LqelFPrc%gUs)S-\rH&*`G'<h.!dK!9rd+Tk
+s*Xfos*jutrdb$"s+:3%s+LE+rJ(<,s+pT0reg]5qMbE5rJpc9rfI,Aqi^uCs-3JIs-E\Org<_R
+!1NnVs-sCdSt;RHTV8'RU].&JV5C/gW2ZetXKAV-YHY79Za7$H[^N]V\[oDc]tV7r^r!t+`5T^8
+aN2KGbKJ,ScHab_dF$CkrmUu!f)F8%f\-5W!o)McrS@M1s53b4s5Eq9qW%P8rT3h:rTF.CqW[tD
+rp0LKrpB^Qr9s[TrpfpWs7?6^r:U*`rqH<brqZQiqYU3gr;H-aJcC<$qYu'~>
+JcC<$JcDeNm/Hn\rVZNhrqcWir:p<ds7ZHbs7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Zki_-kk2k[b
+j5].XiS`YOhYu=3gtVh^!SQ-)f*BmWe^W*tdaJ-B!RT0lc2u87bl5cdb/sY(s2P,Zrl"oV_u@Lf
+_8*k$^V7Fq]Y(kg]",A]\@8oT[C#q>$*ph?Yck43XfST&W\:?MVl-DgUnjc[TqS-OSt;LCS"#k7
+R$a5+Q'IStPEM)kOH5H_NJrgSMi*@JLkkta!JQ4+K*R!ZJUi9#It%BF!do?Ard+Tis*4Nes*"Eb
+rH/'\s)S$Wrc%jTqelCMrbVFHrbDFHqe5tArau%=s()+=r*oY6ra>V1ra,S0q-<f$k$%UcoN_/s
+b[0pKr*]J3qI9G6rFGe:rFZ%Aph9P=phJ2lr+u@LqelFPrc%gUs)S-\rH&*`G'<h.!dK!9rd+Tk
+s*Xfos*jutrdb$"s+:3%s+LE+rJ(<,s+pT0reg]5qMbE5rJpc9rfI,Aqi^uCs-3JIs-E\Org<_R
+!1NnVs-sCdSt;RHTV8'RU].&JV5C/gW2ZetXKAV-YHY79Za7$H[^N]V\[oDc]tV7r^r!t+`5T^8
+aN2KGbKJ,ScHab_dF$CkrmUu!f)F8%f\-5W!o)McrS@M1s53b4s5Eq9qW%P8rT3h:rTF.CqW[tD
+rp0LKrpB^Qr9s[TrpfpWs7?6^r:U*`rqH<brqZQiqYU3gr;H-aJcC<$qYu'~>
+JcC<$JcDeNm/Hn\rVZNhrqcWir:p<ds7ZHbs7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Zki_-kk2k[b
+j5].XiS`YOhYu=3gtVh^!SQ-)f*BmWe^W*tdaJ-B!RT0lc2u87bl5cdb/sY(s2P,Zrl"oV_u@Lf
+_8*k$^V7Fq]Y(kg]",A]\@8oT[C#q>$*ph?Yck43XfST&W\:?MVl-DgUnjc[TqS-OSt;LCS"#k7
+R$a5+Q'IStPEM)kOH5H_NJrgSMi*@JLkkta!JQ4+K*R!ZJUi9#It%BF!do?Ard+Tis*4Nes*"Eb
+rH/'\s)S$Wrc%jTqelCMrbVFHrbDFHqe5tArau%=s()+=r*oY6ra>V1ra,S0q-<f$k$%UcoN_/s
+b[0pKr*]J3qI9G6rFGe:rFZ%Aph9P=phJ2lr+u@LqelFPrc%gUs)S-\rH&*`G'<h.!dK!9rd+Tk
+s*Xfos*jutrdb$"s+:3%s+LE+rJ(<,s+pT0reg]5qMbE5rJpc9rfI,Aqi^uCs-3JIs-E\Org<_R
+!1NnVs-sCdSt;RHTV8'RU].&JV5C/gW2ZetXKAV-YHY79Za7$H[^N]V\[oDc]tV7r^r!t+`5T^8
+aN2KGbKJ,ScHab_dF$CkrmUu!f)F8%f\-5W!o)McrS@M1s53b4s5Eq9qW%P8rT3h:rTF.CqW[tD
+rp0LKrpB^Qr9s[TrpfpWs7?6^r:U*`rqH<brqZQiqYU3gr;H-aJcC<$qYu'~>
+JcC<$JcD_LmJd%^r;?EgrqcZjr:p<ds7ZEas7?<_rUL$[nF6GG#O_!Hm-O'(lMg#Kki_s-!TiDA
+irS/urnmh7hYu=3gtVh^%,':cf@SU(e^W*te'e6C!mo9>rltPhbl5fcaoKQ_a9Tc*`l5p8`5DSk
+&Ac/t^V@Lr]tD"i]"5G_\@;IG"gt_DZa-k8YVWJcXf\\*WiE%sVl-DgUnjc[TqS-OSt;LCS=?":
+R@'A.QBd`"PEM)kOH5H_NfB!VMi.Lj#)J%hL4t>7rdt6'Jc:0$IsukGI0+eCHiA?kH2i-fG5ugc
+Fo?F^F8g4XEW:"WDu+AND>nAKC]8)JC&;TCBDuN@Ac?6?A,Ba8@K'[3?iFC1?2.\#>Ou%m>P)1r
+?1qUi?gV1i?i4=1@JXI3A,^$8Ac?<?BDH6=C&)MiC]/)JD>S5NDuO_SEW:(ZF8^4\FT?U`G63#7
+H2`-iHiJKmIK+`rJ,Om!JV&LPKE$W)L&Hc+L]<2.M>iD3Mu/J4NW"n7O8Y1>Oo1CAPQ$gFQ2d0M
+Qi39QR@9TDRgYaWSXuFFT:hmOU8.^`2l3CLVl6SpWiN5'Y-5(6Z*L^C[C3NQ\@K2_]Y(qm^VI\&
+_SjF4`lH0Ab0.uPc-FV\d*^7he,Ihte^j`O!SH*)gAfn-h#6(/hZ)L3i;V^7iqqd7jSe38k5=E@
+kkXKBlMg,Hm/HDOmelPQnGi%Uo)J=\o_eC^pAXg`q#:*gqYC$er;?N_rdk*#s7u\F~>
+JcC<$JcD_LmJd%^r;?EgrqcZjr:p<ds7ZEas7?<_rUL$[nF6GG#O_!Hm-O'(lMg#Kki_s-!TiDA
+irS/urnmh7hYu=3gtVh^%,':cf@SU(e^W*te'e6C!mo9>rltPhbl5fcaoKQ_a9Tc*`l5p8`5DSk
+&Ac/t^V@Lr]tD"i]"5G_\@;IG"gt_DZa-k8YVWJcXf\\*WiE%sVl-DgUnjc[TqS-OSt;LCS=?":
+R@'A.QBd`"PEM)kOH5H_NfB!VMi.Lj#)J%hL4t>7rdt6'Jc:0$IsukGI0+eCHiA?kH2i-fG5ugc
+Fo?F^F8g4XEW:"WDu+AND>nAKC]8)JC&;TCBDuN@Ac?6?A,Ba8@K'[3?iFC1?2.\#>Ou%m>P)1r
+?1qUi?gV1i?i4=1@JXI3A,^$8Ac?<?BDH6=C&)MiC]/)JD>S5NDuO_SEW:(ZF8^4\FT?U`G63#7
+H2`-iHiJKmIK+`rJ,Om!JV&LPKE$W)L&Hc+L]<2.M>iD3Mu/J4NW"n7O8Y1>Oo1CAPQ$gFQ2d0M
+Qi39QR@9TDRgYaWSXuFFT:hmOU8.^`2l3CLVl6SpWiN5'Y-5(6Z*L^C[C3NQ\@K2_]Y(qm^VI\&
+_SjF4`lH0Ab0.uPc-FV\d*^7he,Ihte^j`O!SH*)gAfn-h#6(/hZ)L3i;V^7iqqd7jSe38k5=E@
+kkXKBlMg,Hm/HDOmelPQnGi%Uo)J=\o_eC^pAXg`q#:*gqYC$er;?N_rdk*#s7u\F~>
+JcC<$JcD_LmJd%^r;?EgrqcZjr:p<ds7ZEas7?<_rUL$[nF6GG#O_!Hm-O'(lMg#Kki_s-!TiDA
+irS/urnmh7hYu=3gtVh^%,':cf@SU(e^W*te'e6C!mo9>rltPhbl5fcaoKQ_a9Tc*`l5p8`5DSk
+&Ac/t^V@Lr]tD"i]"5G_\@;IG"gt_DZa-k8YVWJcXf\\*WiE%sVl-DgUnjc[TqS-OSt;LCS=?":
+R@'A.QBd`"PEM)kOH5H_NfB!VMi.Lj#)J%hL4t>7rdt6'Jc:0$IsukGI0+eCHiA?kH2i-fG5ugc
+Fo?F^F8g4XEW:"WDu+AND>nAKC]8)JC&;TCBDuN@Ac?6?A,Ba8@K'[3?iFC1?2.\#>Ou%m>P)1r
+?1qUi?gV1i?i4=1@JXI3A,^$8Ac?<?BDH6=C&)MiC]/)JD>S5NDuO_SEW:(ZF8^4\FT?U`G63#7
+H2`-iHiJKmIK+`rJ,Om!JV&LPKE$W)L&Hc+L]<2.M>iD3Mu/J4NW"n7O8Y1>Oo1CAPQ$gFQ2d0M
+Qi39QR@9TDRgYaWSXuFFT:hmOU8.^`2l3CLVl6SpWiN5'Y-5(6Z*L^C[C3NQ\@K2_]Y(qm^VI\&
+_SjF4`lH0Ab0.uPc-FV\d*^7he,Ihte^j`O!SH*)gAfn-h#6(/hZ)L3i;V^7iqqd7jSe38k5=E@
+kkXKBlMg,Hm/HDOmelPQnGi%Uo)J=\o_eC^pAXg`q#:*gqYC$er;?N_rdk*#s7u\F~>
+JcC<$JcDYJmf*._r;?HhrqcWir:p<ds7ZEa!qc*Urpp*Zs7$$V!Uf@Sm/QAOlMg#Kki_s-!TiDA
+irS/urnmh7hYu=9gtUT;g=b03rmq2%ec+&"e'c\Dd/hV?rm(Pg!6kGc!m8X,rl>>b`l?!:`5KRm
+_?%KgrkAKJ^&GYF]=S!P1Usp&[^ENMZa6sBYct=6Xf\\+X/`2!W2HPjV50o^U7n9RT:VXFS=?":
+R@'A.QBd`"PQ$^_OcYWbNfB!VMi3ILM26qBL5(D8KS+o/Jq<oO!e5ZJrdFfo!.4Zj!dT$8rHJ9b
+s)n6]s)\0[r,M^Trbq[OrGDOMqeQ1Grb;:Drb)7Cqdoe<raYk8raGe6qd9>/rE])$mT]3dqH`o'
+^L-nHrF,M2raYq<qITY<rFbq>rFu+CcYNGprGDCKs)7mUrGhjXs)\-\!d/[0rHA<fH$TC8s*F`n
+rI"`rIt.HJs+13%re(6(s+UE+s+gW1r/(H2rep]5rf-o;qN(W;rK6u?rfdAHr0@8Is-N_Ps-`nU
+rgWqX!1j+\!M?%aT`Lm_rhMZQVPg>jWN)u!XKAV-YctC<Za7$H[^WcW\[oGd]tV7r_8=(,`5Ta:
+aN2KGbKJ,TcHjkbdF-IleC<%"rmq2'g&B\,gYCT`h>c@3hu2L4iW%p7j8J';jnS!:kPXQ>l2BoH
+lh]uImJlVOn,DhVnbhtWoD\C[p&Fabp\Xabq>U6dqu-HirUKl<s+14Fs*t~>
+JcC<$JcDYJmf*._r;?HhrqcWir:p<ds7ZEa!qc*Urpp*Zs7$$V!Uf@Sm/QAOlMg#Kki_s-!TiDA
+irS/urnmh7hYu=9gtUT;g=b03rmq2%ec+&"e'c\Dd/hV?rm(Pg!6kGc!m8X,rl>>b`l?!:`5KRm
+_?%KgrkAKJ^&GYF]=S!P1Usp&[^ENMZa6sBYct=6Xf\\+X/`2!W2HPjV50o^U7n9RT:VXFS=?":
+R@'A.QBd`"PQ$^_OcYWbNfB!VMi3ILM26qBL5(D8KS+o/Jq<oO!e5ZJrdFfo!.4Zj!dT$8rHJ9b
+s)n6]s)\0[r,M^Trbq[OrGDOMqeQ1Grb;:Drb)7Cqdoe<raYk8raGe6qd9>/rE])$mT]3dqH`o'
+^L-nHrF,M2raYq<qITY<rFbq>rFu+CcYNGprGDCKs)7mUrGhjXs)\-\!d/[0rHA<fH$TC8s*F`n
+rI"`rIt.HJs+13%re(6(s+UE+s+gW1r/(H2rep]5rf-o;qN(W;rK6u?rfdAHr0@8Is-N_Ps-`nU
+rgWqX!1j+\!M?%aT`Lm_rhMZQVPg>jWN)u!XKAV-YctC<Za7$H[^WcW\[oGd]tV7r_8=(,`5Ta:
+aN2KGbKJ,TcHjkbdF-IleC<%"rmq2'g&B\,gYCT`h>c@3hu2L4iW%p7j8J';jnS!:kPXQ>l2BoH
+lh]uImJlVOn,DhVnbhtWoD\C[p&Fabp\Xabq>U6dqu-HirUKl<s+14Fs*t~>
+JcC<$JcDYJmf*._r;?HhrqcWir:p<ds7ZEa!qc*Urpp*Zs7$$V!Uf@Sm/QAOlMg#Kki_s-!TiDA
+irS/urnmh7hYu=9gtUT;g=b03rmq2%ec+&"e'c\Dd/hV?rm(Pg!6kGc!m8X,rl>>b`l?!:`5KRm
+_?%KgrkAKJ^&GYF]=S!P1Usp&[^ENMZa6sBYct=6Xf\\+X/`2!W2HPjV50o^U7n9RT:VXFS=?":
+R@'A.QBd`"PQ$^_OcYWbNfB!VMi3ILM26qBL5(D8KS+o/Jq<oO!e5ZJrdFfo!.4Zj!dT$8rHJ9b
+s)n6]s)\0[r,M^Trbq[OrGDOMqeQ1Grb;:Drb)7Cqdoe<raYk8raGe6qd9>/rE])$mT]3dqH`o'
+^L-nHrF,M2raYq<qITY<rFbq>rFu+CcYNGprGDCKs)7mUrGhjXs)\-\!d/[0rHA<fH$TC8s*F`n
+rI"`rIt.HJs+13%re(6(s+UE+s+gW1r/(H2rep]5rf-o;qN(W;rK6u?rfdAHr0@8Is-N_Ps-`nU
+rgWqX!1j+\!M?%aT`Lm_rhMZQVPg>jWN)u!XKAV-YctC<Za7$H[^WcW\[oGd]tV7r_8=(,`5Ta:
+aN2KGbKJ,TcHjkbdF-IleC<%"rmq2'g&B\,gYCT`h>c@3hu2L4iW%p7j8J';jnS!:kPXQ>l2BoH
+lh]uImJlVOn,DhVnbhtWoD\C[p&Fabp\Xabq>U6dqu-HirUKl<s+14Fs*t~>
+JcC<$JcDYJmJd%^rVZNhrqcWirV6Ees7ZEas7H?_rpp*Z!:^!Vs6]mSrp1'ZlK[Wukih3lk2k^c
+ro4%=iVqa9hqn@g#Me(gg=k65f`'J'f%'cLs3gtrrm:eocd2U9!mSs5rlYPhaiVWFa2c4!`<X?!
+_ns:,_8-&b!PZ8H]J$n.\[f5[\$i`Q['R*EZ*CO;YHG"0XK/A$WMl_mVPU)aUS=HUTV%gISXc1=
+R[O/B&snoLQ'@JqP*(ieO,f6[N/W[PreUZ3L]3#5KnP,3K7\]+rdY'"IX_9Es*Xinrd+Tis*4Kd
+s*"Ebr,hs[rc7mUrc%jTqelCMrbVIIrbDIIqe6"Brau(>rac%=qdTS6ra>S0rEfG.gKaS\q-L[?
+r*]J3q-s>5rFGe:rau+AqIoe@qeFJnqeZ1IqelCOrc%gUs)S-\rH/'^!-\<b!dK!9rd+Tk!.=co
+s*artrI=s#JqEuSs+LE+rJ(?-s+pW1s,-i7qi(Q7rf6i9rfI)@qi^rBrfm;Fs-E\OrL!VQs-iqV
+s.'+[s.97_!20=b6)(-MUnsobVl-JmWiE,$Xf\b0YctF>Za@-K[^WfX]">Vg^;%Fu_8=+.`Poj;
+aN;TJbKS5VcHjkbdF-LneCE.Lf)aOWrn7G.gt_nbs5!b5rS[\6s5Nt:rT*t>q<%V<r93q?rTaCJ
+qX"1JrpK^Qrp]pWr:9jYs7H3]rq?BdqtU0drVHBfr;?KknG\"=JcGNFJ,~>
+JcC<$JcDYJmJd%^rVZNhrqcWirV6Ees7ZEas7H?_rpp*Z!:^!Vs6]mSrp1'ZlK[Wukih3lk2k^c
+ro4%=iVqa9hqn@g#Me(gg=k65f`'J'f%'cLs3gtrrm:eocd2U9!mSs5rlYPhaiVWFa2c4!`<X?!
+_ns:,_8-&b!PZ8H]J$n.\[f5[\$i`Q['R*EZ*CO;YHG"0XK/A$WMl_mVPU)aUS=HUTV%gISXc1=
+R[O/B&snoLQ'@JqP*(ieO,f6[N/W[PreUZ3L]3#5KnP,3K7\]+rdY'"IX_9Es*Xinrd+Tis*4Kd
+s*"Ebr,hs[rc7mUrc%jTqelCMrbVIIrbDIIqe6"Brau(>rac%=qdTS6ra>S0rEfG.gKaS\q-L[?
+r*]J3q-s>5rFGe:rau+AqIoe@qeFJnqeZ1IqelCOrc%gUs)S-\rH/'^!-\<b!dK!9rd+Tk!.=co
+s*artrI=s#JqEuSs+LE+rJ(?-s+pW1s,-i7qi(Q7rf6i9rfI)@qi^rBrfm;Fs-E\OrL!VQs-iqV
+s.'+[s.97_!20=b6)(-MUnsobVl-JmWiE,$Xf\b0YctF>Za@-K[^WfX]">Vg^;%Fu_8=+.`Poj;
+aN;TJbKS5VcHjkbdF-LneCE.Lf)aOWrn7G.gt_nbs5!b5rS[\6s5Nt:rT*t>q<%V<r93q?rTaCJ
+qX"1JrpK^Qrp]pWr:9jYs7H3]rq?BdqtU0drVHBfr;?KknG\"=JcGNFJ,~>
+JcC<$JcDYJmJd%^rVZNhrqcWirV6Ees7ZEas7H?_rpp*Z!:^!Vs6]mSrp1'ZlK[Wukih3lk2k^c
+ro4%=iVqa9hqn@g#Me(gg=k65f`'J'f%'cLs3gtrrm:eocd2U9!mSs5rlYPhaiVWFa2c4!`<X?!
+_ns:,_8-&b!PZ8H]J$n.\[f5[\$i`Q['R*EZ*CO;YHG"0XK/A$WMl_mVPU)aUS=HUTV%gISXc1=
+R[O/B&snoLQ'@JqP*(ieO,f6[N/W[PreUZ3L]3#5KnP,3K7\]+rdY'"IX_9Es*Xinrd+Tis*4Kd
+s*"Ebr,hs[rc7mUrc%jTqelCMrbVIIrbDIIqe6"Brau(>rac%=qdTS6ra>S0rEfG.gKaS\q-L[?
+r*]J3q-s>5rFGe:rau+AqIoe@qeFJnqeZ1IqelCOrc%gUs)S-\rH/'^!-\<b!dK!9rd+Tk!.=co
+s*artrI=s#JqEuSs+LE+rJ(?-s+pW1s,-i7qi(Q7rf6i9rfI)@qi^rBrfm;Fs-E\OrL!VQs-iqV
+s.'+[s.97_!20=b6)(-MUnsobVl-JmWiE,$Xf\b0YctF>Za@-K[^WfX]">Vg^;%Fu_8=+.`Poj;
+aN;TJbKS5VcHjkbdF-LneCE.Lf)aOWrn7G.gt_nbs5!b5rS[\6s5Nt:rT*t>q<%V<r93q?rTaCJ
+qX"1JrpK^Qrp]pWr:9jYs7H3]rq?BdqtU0drVHBfr;?KknG\"=JcGNFJ,~>
+JcC<$JcDVImf*+^rVZNhrqcZjr:p<ds7ZEas7?<_rUL$[nF6GG!q,ICrp0[OlMg#Qki_-kk2k^c
+ro4%=iVqa9hqn@g!o2Pbrn7D+f`'M&ec=8"e,n+Idf.Vqd*L&;c2u87bl5cdb/sY(s2P,Zrl#Vj
+_o'@._83q%^V7Fq]Y(kg]",A]\,Nfp[C!9HZE^X<YHG"0XK/D%Wi;qpVl$;dUnaZXTqJ$LSt2C@
+S!ob4R$X,(Q'@JqP*(lgO,o<\req&>MM[1GLkkta!JQ4+K*$XUJc:0$IsukGIK+]pHiA?kH2i-e
+GQ2jdFo6@\F8g4XEW0qVDu4GOD>nAKC]8)KC&DZDBE)T@AcH<?A,Kg8@K'[2?i==.?0,>f?27g:
+?i4=0@JOC3A,Ts8Ac66?BDQ<>C&D_oC\_fED>J/MDuO_REW:(ZF8g:]FoQXaGQ2pfH2`*kH[L5?
+IK+`rJ,XuuJH1<#K*$^[L&Hc+LB*//M>iD4Mu8P6NW+t8O8b7?Ont7?PQ$gDQ2[*LQi*6NRK&`S
+Rf]+NSc53NT:hjNTq\9VUnji`VPg>jWN)u!XKAV-YHY79ZEppG[^NZT\[oDc]Y2%o^qmn)_o9U7
+a2l?DbKJ,ScHab_dF$CkeC<%"rmq2'g&B\,gYCT`h#cHjhu2L5iW%p8j8S-=jn\';kPXQ=l29iF
+lh]uHmJcPNn,DhVnb_nVoDeI[p&=[bp\Xabq>L0cqu-HjrUBf;s+14Es*t~>
+JcC<$JcDVImf*+^rVZNhrqcZjr:p<ds7ZEas7?<_rUL$[nF6GG!q,ICrp0[OlMg#Qki_-kk2k^c
+ro4%=iVqa9hqn@g!o2Pbrn7D+f`'M&ec=8"e,n+Idf.Vqd*L&;c2u87bl5cdb/sY(s2P,Zrl#Vj
+_o'@._83q%^V7Fq]Y(kg]",A]\,Nfp[C!9HZE^X<YHG"0XK/D%Wi;qpVl$;dUnaZXTqJ$LSt2C@
+S!ob4R$X,(Q'@JqP*(lgO,o<\req&>MM[1GLkkta!JQ4+K*$XUJc:0$IsukGIK+]pHiA?kH2i-e
+GQ2jdFo6@\F8g4XEW0qVDu4GOD>nAKC]8)KC&DZDBE)T@AcH<?A,Kg8@K'[2?i==.?0,>f?27g:
+?i4=0@JOC3A,Ts8Ac66?BDQ<>C&D_oC\_fED>J/MDuO_REW:(ZF8g:]FoQXaGQ2pfH2`*kH[L5?
+IK+`rJ,XuuJH1<#K*$^[L&Hc+LB*//M>iD4Mu8P6NW+t8O8b7?Ont7?PQ$gDQ2[*LQi*6NRK&`S
+Rf]+NSc53NT:hjNTq\9VUnji`VPg>jWN)u!XKAV-YHY79ZEppG[^NZT\[oDc]Y2%o^qmn)_o9U7
+a2l?DbKJ,ScHab_dF$CkeC<%"rmq2'g&B\,gYCT`h#cHjhu2L5iW%p8j8S-=jn\';kPXQ=l29iF
+lh]uHmJcPNn,DhVnb_nVoDeI[p&=[bp\Xabq>L0cqu-HjrUBf;s+14Es*t~>
+JcC<$JcDVImf*+^rVZNhrqcZjr:p<ds7ZEas7?<_rUL$[nF6GG!q,ICrp0[OlMg#Qki_-kk2k^c
+ro4%=iVqa9hqn@g!o2Pbrn7D+f`'M&ec=8"e,n+Idf.Vqd*L&;c2u87bl5cdb/sY(s2P,Zrl#Vj
+_o'@._83q%^V7Fq]Y(kg]",A]\,Nfp[C!9HZE^X<YHG"0XK/D%Wi;qpVl$;dUnaZXTqJ$LSt2C@
+S!ob4R$X,(Q'@JqP*(lgO,o<\req&>MM[1GLkkta!JQ4+K*$XUJc:0$IsukGIK+]pHiA?kH2i-e
+GQ2jdFo6@\F8g4XEW0qVDu4GOD>nAKC]8)KC&DZDBE)T@AcH<?A,Kg8@K'[2?i==.?0,>f?27g:
+?i4=0@JOC3A,Ts8Ac66?BDQ<>C&D_oC\_fED>J/MDuO_REW:(ZF8g:]FoQXaGQ2pfH2`*kH[L5?
+IK+`rJ,XuuJH1<#K*$^[L&Hc+LB*//M>iD4Mu8P6NW+t8O8b7?Ont7?PQ$gDQ2[*LQi*6NRK&`S
+Rf]+NSc53NT:hjNTq\9VUnji`VPg>jWN)u!XKAV-YHY79ZEppG[^NZT\[oDc]Y2%o^qmn)_o9U7
+a2l?DbKJ,ScHab_dF$CkeC<%"rmq2'g&B\,gYCT`h#cHjhu2L5iW%p8j8S-=jn\';kPXQ=l29iF
+lh]uHmJcPNn,DhVnb_nVoDeI[p&=[bp\Xabq>L0cqu-HjrUBf;s+14Es*t~>
+JcC<$JcDPGn,E7`rVZNhrqcWirV6Bds7ZHbs7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJ!U/_Gk5XNH
+jQ#:[io0mp#N+Cph;-lAg]#n3g"=s/f@JO'rm^ts!7Lkos3Lblrm(Pg!6kGcs2k>`rlG,[!65#W
+!Q;nT_@+2q^q[Xu]tM(k]=S!P"h;%M[^ELAZR)o^Yct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+S"#k7R$a5+rfmYOPEM)kOT(:PNfB!VMi*CKM26qBL5(D9K`6W(JcLB$JH(*!If4]pHiSNlHN/9j
+Gl2dcG5cX^FT-@]Er0kUE;jeQDZ4MPD#A)JCB&#GB`;ZEB)H6>AH-0:@fBg8@/41-?M@b">kVJ!
+?LM7e@,52e@/OI/@f9g9AG]s:B)ZH>B`2ZCC@>rpD#8)FDZ4SRE;aeUErU4[FT6L`G5c^cGlN'g
+H3/G@I/\NqIXckHJH(0#K)UE&K`?c*LB!&/M#N82MZ8V4N;nn:Nr4t;OT(C=P5^[EPkp[EQN*<L
+R/`TRRf8fVSH#/ZT)YD_T`1WTU8+KZUnsrcVl-JmWiE,$Xf\b0YctC<Za7$I[^WcW\[oGd]tV7r
+^r!t+`5T^9aN2KGbKJ,ScHjkbdF-LneCE+#f@S[.rn7D-h#?.0hZ)L4i;_d9ir%j:jSn9;k5FK@
+kkF??lMTuDm/HDNmecJPnG_tTo)A7\o_\=\pAXg`q#:*gqYC$dr;?N_rdk*#s7cPD~>
+JcC<$JcDPGn,E7`rVZNhrqcWirV6Bds7ZHbs7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJ!U/_Gk5XNH
+jQ#:[io0mp#N+Cph;-lAg]#n3g"=s/f@JO'rm^ts!7Lkos3Lblrm(Pg!6kGcs2k>`rlG,[!65#W
+!Q;nT_@+2q^q[Xu]tM(k]=S!P"h;%M[^ELAZR)o^Yct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+S"#k7R$a5+rfmYOPEM)kOT(:PNfB!VMi*CKM26qBL5(D9K`6W(JcLB$JH(*!If4]pHiSNlHN/9j
+Gl2dcG5cX^FT-@]Er0kUE;jeQDZ4MPD#A)JCB&#GB`;ZEB)H6>AH-0:@fBg8@/41-?M@b">kVJ!
+?LM7e@,52e@/OI/@f9g9AG]s:B)ZH>B`2ZCC@>rpD#8)FDZ4SRE;aeUErU4[FT6L`G5c^cGlN'g
+H3/G@I/\NqIXckHJH(0#K)UE&K`?c*LB!&/M#N82MZ8V4N;nn:Nr4t;OT(C=P5^[EPkp[EQN*<L
+R/`TRRf8fVSH#/ZT)YD_T`1WTU8+KZUnsrcVl-JmWiE,$Xf\b0YctC<Za7$I[^WcW\[oGd]tV7r
+^r!t+`5T^9aN2KGbKJ,ScHjkbdF-LneCE+#f@S[.rn7D-h#?.0hZ)L4i;_d9ir%j:jSn9;k5FK@
+kkF??lMTuDm/HDNmecJPnG_tTo)A7\o_\=\pAXg`q#:*gqYC$dr;?N_rdk*#s7cPD~>
+JcC<$JcDPGn,E7`rVZNhrqcWirV6Bds7ZHbs7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJ!U/_Gk5XNH
+jQ#:[io0mp#N+Cph;-lAg]#n3g"=s/f@JO'rm^ts!7Lkos3Lblrm(Pg!6kGcs2k>`rlG,[!65#W
+!Q;nT_@+2q^q[Xu]tM(k]=S!P"h;%M[^ELAZR)o^Yct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+S"#k7R$a5+rfmYOPEM)kOT(:PNfB!VMi*CKM26qBL5(D9K`6W(JcLB$JH(*!If4]pHiSNlHN/9j
+Gl2dcG5cX^FT-@]Er0kUE;jeQDZ4MPD#A)JCB&#GB`;ZEB)H6>AH-0:@fBg8@/41-?M@b">kVJ!
+?LM7e@,52e@/OI/@f9g9AG]s:B)ZH>B`2ZCC@>rpD#8)FDZ4SRE;aeUErU4[FT6L`G5c^cGlN'g
+H3/G@I/\NqIXckHJH(0#K)UE&K`?c*LB!&/M#N82MZ8V4N;nn:Nr4t;OT(C=P5^[EPkp[EQN*<L
+R/`TRRf8fVSH#/ZT)YD_T`1WTU8+KZUnsrcVl-JmWiE,$Xf\b0YctC<Za7$I[^WcW\[oGd]tV7r
+^r!t+`5T^9aN2KGbKJ,ScHjkbdF-LneCE+#f@S[.rn7D-h#?.0hZ)L4i;_d9ir%j:jSn9;k5FK@
+kkF??lMTuDm/HDNmecJPnG_tTo)A7\o_\=\pAXg`q#:*gqYC$dr;?N_rdk*#s7cPD~>
+JcC<$JcDJEnG`@arVZNhrqcZjr:p<ds7ZEas7?<_rUL$[nF6GGs6]mSrp0^PlK\B5!U/_Gjp1#/
+jQ#:[io0mp#N+Cph;-lAg]#n.g"=sVf)jORec+&"e'c\Dd/q\@ci25iblGuebQ#]bao9?_a2Z-u
+`<!oprk\]P_#D(L^:jNY,.kFs\[],X[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[rh0psT:VXF
+S=?":R@'A.QBd`"PQ$^KOcYWbNfF$s!K2j7M$JilLPCP;KnTGXs+16%rdb#us*jrqs*XinrHeKh
+s*4Hcs*"Bar,hpZrc7mUrc%mUqelCMs(qRJs(_OIr+Q+Crau(>s()+=qdTP5ra>M.q-NSspKmAs
+g0j2Qq-a).q-s>5rFGe:rau+AqIokBr+bk>ghce'php(Lrc%dTs)S-\rH/'^s*"Bcs*+Nhrd+Tk
+s*Xfo!e,WKrdY'$JqEuS!ec8]reCH.!/UT1s,-i7rJ^c9s,R#<rfI,Aqi^rBrKR2ErKdGLr0[JO
+s-inUs.'+[rgs.^s.K@b!MZ@gU]I<hrhhoXWN)u!XKAV-YHY79ZEpmE[C3NR\[f;`]Y(tn^VI\&
+_SjF4`lH0Bb0.uPc-FV\d*^7he'umtf%8O+g&B\+gYDeas5!b5rSRb9io9mrs5a1@qr[k?rTO%@
+r9F4Gq!@tHrpKXOrp]pWqssaXrq-*\s7ZHdqY:'crqcHfr;?Kkn,@n<JcGKEJ,~>
+JcC<$JcDJEnG`@arVZNhrqcZjr:p<ds7ZEas7?<_rUL$[nF6GGs6]mSrp0^PlK\B5!U/_Gjp1#/
+jQ#:[io0mp#N+Cph;-lAg]#n.g"=sVf)jORec+&"e'c\Dd/q\@ci25iblGuebQ#]bao9?_a2Z-u
+`<!oprk\]P_#D(L^:jNY,.kFs\[],X[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[rh0psT:VXF
+S=?":R@'A.QBd`"PQ$^KOcYWbNfF$s!K2j7M$JilLPCP;KnTGXs+16%rdb#us*jrqs*XinrHeKh
+s*4Hcs*"Bar,hpZrc7mUrc%mUqelCMs(qRJs(_OIr+Q+Crau(>s()+=qdTP5ra>M.q-NSspKmAs
+g0j2Qq-a).q-s>5rFGe:rau+AqIokBr+bk>ghce'php(Lrc%dTs)S-\rH/'^s*"Bcs*+Nhrd+Tk
+s*Xfo!e,WKrdY'$JqEuS!ec8]reCH.!/UT1s,-i7rJ^c9s,R#<rfI,Aqi^rBrKR2ErKdGLr0[JO
+s-inUs.'+[rgs.^s.K@b!MZ@gU]I<hrhhoXWN)u!XKAV-YHY79ZEpmE[C3NR\[f;`]Y(tn^VI\&
+_SjF4`lH0Bb0.uPc-FV\d*^7he'umtf%8O+g&B\+gYDeas5!b5rSRb9io9mrs5a1@qr[k?rTO%@
+r9F4Gq!@tHrpKXOrp]pWqssaXrq-*\s7ZHdqY:'crqcHfr;?Kkn,@n<JcGKEJ,~>
+JcC<$JcDJEnG`@arVZNhrqcZjr:p<ds7ZEas7?<_rUL$[nF6GGs6]mSrp0^PlK\B5!U/_Gjp1#/
+jQ#:[io0mp#N+Cph;-lAg]#n.g"=sVf)jORec+&"e'c\Dd/q\@ci25iblGuebQ#]bao9?_a2Z-u
+`<!oprk\]P_#D(L^:jNY,.kFs\[],X[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[rh0psT:VXF
+S=?":R@'A.QBd`"PQ$^KOcYWbNfF$s!K2j7M$JilLPCP;KnTGXs+16%rdb#us*jrqs*XinrHeKh
+s*4Hcs*"Bar,hpZrc7mUrc%mUqelCMs(qRJs(_OIr+Q+Crau(>s()+=qdTP5ra>M.q-NSspKmAs
+g0j2Qq-a).q-s>5rFGe:rau+AqIokBr+bk>ghce'php(Lrc%dTs)S-\rH/'^s*"Bcs*+Nhrd+Tk
+s*Xfo!e,WKrdY'$JqEuS!ec8]reCH.!/UT1s,-i7rJ^c9s,R#<rfI,Aqi^rBrKR2ErKdGLr0[JO
+s-inUs.'+[rgs.^s.K@b!MZ@gU]I<hrhhoXWN)u!XKAV-YHY79ZEpmE[C3NR\[f;`]Y(tn^VI\&
+_SjF4`lH0Bb0.uPc-FV\d*^7he'umtf%8O+g&B\+gYDeas5!b5rSRb9io9mrs5a1@qr[k?rTO%@
+r9F4Gq!@tHrpKXOrp]pWqssaXrq-*\s7ZHdqY:'crqcHfr;?Kkn,@n<JcGKEJ,~>
+JcC<$JcDJEnG`@arVZNhrqcWirV6Bds7ZHbs7H?_rpp*Zs7$$V!q,ICrp0mUlK[Wukih4/jp1#/
+jQ#:[io0mp!oMkkrnRV1g]#q,f`9\(fDjD%ec+(ue,Rkqd/q\@ci22kc-4E2b6#i.ao9?da2Z-<
+`Pf^4rk\]P_#D(Y^:h1l]=PSa\[],W[^ELAZR)o^Yct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+S"#k7R$a5+rfmYOPEM)kOT(:ANfF$s!K2j7M#iEfreCH,!/1?(s+16%rI=s!IX_6Ds*XinrHeKh
+s*4Hcrc\<aqfMgYrc7pVrc%jTr,2LNrbVLJs(_RJr+Q(Bs(;1?rac"<qdTP5rF#;*mU#?hpgE2l
+ggL"fpgX54rFGe:rau+AqIokBrG)"@oPEK'pMTqJrc%dTs)S-\rH/'^s*"Bcs*+Nhrd+Tk!.=co
+s*artrdb$"!.t3&s+CB+rItB/Lku%es,-i7rJ^c9s,R&=rfI,Ar0%&CrKR2ErKdGLqj@ANs-ikT
+s.'+[rLO(_TV2:X!huHbrhKRkVZ*J[W2ZesX/rG*Y-5(6Z*L^B['d?N\%&u[]=bei^;%J"_SX4/
+`Q#s>aN;TJbg"GYcd:(edaQ^qe^i@(f\+s3g=tE^h>c=3hu;R6iW%p9j8\3?jnn3>kPaW>l29iE
+lhBcEmJZJLn,;bTnb_nVoD\CZp&Fabp\O[aq>L0dqu$BirU9`:s+14Ds*t~>
+JcC<$JcDJEnG`@arVZNhrqcWirV6Bds7ZHbs7H?_rpp*Zs7$$V!q,ICrp0mUlK[Wukih4/jp1#/
+jQ#:[io0mp!oMkkrnRV1g]#q,f`9\(fDjD%ec+(ue,Rkqd/q\@ci22kc-4E2b6#i.ao9?da2Z-<
+`Pf^4rk\]P_#D(Y^:h1l]=PSa\[],W[^ELAZR)o^Yct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+S"#k7R$a5+rfmYOPEM)kOT(:ANfF$s!K2j7M#iEfreCH,!/1?(s+16%rI=s!IX_6Ds*XinrHeKh
+s*4Hcrc\<aqfMgYrc7pVrc%jTr,2LNrbVLJs(_RJr+Q(Bs(;1?rac"<qdTP5rF#;*mU#?hpgE2l
+ggL"fpgX54rFGe:rau+AqIokBrG)"@oPEK'pMTqJrc%dTs)S-\rH/'^s*"Bcs*+Nhrd+Tk!.=co
+s*artrdb$"!.t3&s+CB+rItB/Lku%es,-i7rJ^c9s,R&=rfI,Ar0%&CrKR2ErKdGLqj@ANs-ikT
+s.'+[rLO(_TV2:X!huHbrhKRkVZ*J[W2ZesX/rG*Y-5(6Z*L^B['d?N\%&u[]=bei^;%J"_SX4/
+`Q#s>aN;TJbg"GYcd:(edaQ^qe^i@(f\+s3g=tE^h>c=3hu;R6iW%p9j8\3?jnn3>kPaW>l29iE
+lhBcEmJZJLn,;bTnb_nVoD\CZp&Fabp\O[aq>L0dqu$BirU9`:s+14Ds*t~>
+JcC<$JcDJEnG`@arVZNhrqcWirV6Bds7ZHbs7H?_rpp*Zs7$$V!q,ICrp0mUlK[Wukih4/jp1#/
+jQ#:[io0mp!oMkkrnRV1g]#q,f`9\(fDjD%ec+(ue,Rkqd/q\@ci22kc-4E2b6#i.ao9?da2Z-<
+`Pf^4rk\]P_#D(Y^:h1l]=PSa\[],W[^ELAZR)o^Yct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+S"#k7R$a5+rfmYOPEM)kOT(:ANfF$s!K2j7M#iEfreCH,!/1?(s+16%rI=s!IX_6Ds*XinrHeKh
+s*4Hcrc\<aqfMgYrc7pVrc%jTr,2LNrbVLJs(_RJr+Q(Bs(;1?rac"<qdTP5rF#;*mU#?hpgE2l
+ggL"fpgX54rFGe:rau+AqIokBrG)"@oPEK'pMTqJrc%dTs)S-\rH/'^s*"Bcs*+Nhrd+Tk!.=co
+s*artrdb$"!.t3&s+CB+rItB/Lku%es,-i7rJ^c9s,R&=rfI,Ar0%&CrKR2ErKdGLqj@ANs-ikT
+s.'+[rLO(_TV2:X!huHbrhKRkVZ*J[W2ZesX/rG*Y-5(6Z*L^B['d?N\%&u[]=bei^;%J"_SX4/
+`Q#s>aN;TJbg"GYcd:(edaQ^qe^i@(f\+s3g=tE^h>c=3hu;R6iW%p9j8\3?jnn3>kPaW>l29iE
+lhBcEmJZJLn,;bTnb_nVoD\CZp&Fabp\O[aq>L0dqu$BirU9`:s+14Ds*t~>
+JcC<$JcDABnc&Lcr;?HhrqcWirV6Ees7ZEas7H?_rpp*Zs7$$V!q,ICrp0[OlMg&JkQ'fFjoXZ*
+jSn0?io0mps5*h5rnRY2gY;_]!nl5Yrn%2$!7h(us3gtrrQt\ncd2U9!mSs5rlYAcaiXP'(!">6
+`Pod6_ns:,_8*h#^:q:n]XtcS\L"bp[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+rgO4_R@'A.QBd`"PQ$^QOcYWbNfK*XN/NUOreUZ3L]3&.K`Hf*KE$Q'Jc:3"J,ausIK+]oHi89j
+H2`'dGQ2jcFo-:\F8g4WEW:"WDu=MPD?"GMC]8)KC&DZEBDuN@Ac?6>A,Ba6@JjNf?hn+%@Imsu
+@H_+p@JF=1A,^$8Ac?<@BDQ<?C&VlAC\_f'D=_ZEDuFYQEW:(YF8^4\FT?U`G63#7H2`-iHN8Hm
+IK+`rJ,Xs"JV&LQK*$^[L&Qf.LPUccM>rJ5MuJ\8NW5%:O8k=AOo1CAPQ$gCQ2[*KQhm*KRJrZQ
+S,]#YSc,/[TDtS`U&UheU].(hV*1]RVl6PnWiE,$Xf\b0YHY79ZEppG[^NZT\[f;`]Y2%o^VI\&
+_o0O5`lH0Bb0.uPc-FV]dF$CkeC<%"rmqP1g"P07gt^`AhVR/hi;_d9ir8!<jSn9=k5OQCkkOE?
+lMTuBm/68LmeZDNnG_tTo)A7[o_\=\pAXg_q#:*fqYC$er;6H^rdk*#s7QDB~>
+JcC<$JcDABnc&Lcr;?HhrqcWirV6Ees7ZEas7H?_rpp*Zs7$$V!q,ICrp0[OlMg&JkQ'fFjoXZ*
+jSn0?io0mps5*h5rnRY2gY;_]!nl5Yrn%2$!7h(us3gtrrQt\ncd2U9!mSs5rlYAcaiXP'(!">6
+`Pod6_ns:,_8*h#^:q:n]XtcS\L"bp[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+rgO4_R@'A.QBd`"PQ$^QOcYWbNfK*XN/NUOreUZ3L]3&.K`Hf*KE$Q'Jc:3"J,ausIK+]oHi89j
+H2`'dGQ2jcFo-:\F8g4WEW:"WDu=MPD?"GMC]8)KC&DZEBDuN@Ac?6>A,Ba6@JjNf?hn+%@Imsu
+@H_+p@JF=1A,^$8Ac?<@BDQ<?C&VlAC\_f'D=_ZEDuFYQEW:(YF8^4\FT?U`G63#7H2`-iHN8Hm
+IK+`rJ,Xs"JV&LQK*$^[L&Qf.LPUccM>rJ5MuJ\8NW5%:O8k=AOo1CAPQ$gCQ2[*KQhm*KRJrZQ
+S,]#YSc,/[TDtS`U&UheU].(hV*1]RVl6PnWiE,$Xf\b0YHY79ZEppG[^NZT\[f;`]Y2%o^VI\&
+_o0O5`lH0Bb0.uPc-FV]dF$CkeC<%"rmqP1g"P07gt^`AhVR/hi;_d9ir8!<jSn9=k5OQCkkOE?
+lMTuBm/68LmeZDNnG_tTo)A7[o_\=\pAXg_q#:*fqYC$er;6H^rdk*#s7QDB~>
+JcC<$JcDABnc&Lcr;?HhrqcWirV6Ees7ZEas7H?_rpp*Zs7$$V!q,ICrp0[OlMg&JkQ'fFjoXZ*
+jSn0?io0mps5*h5rnRY2gY;_]!nl5Yrn%2$!7h(us3gtrrQt\ncd2U9!mSs5rlYAcaiXP'(!">6
+`Pod6_ns:,_8*h#^:q:n]XtcS\L"bp[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+rgO4_R@'A.QBd`"PQ$^QOcYWbNfK*XN/NUOreUZ3L]3&.K`Hf*KE$Q'Jc:3"J,ausIK+]oHi89j
+H2`'dGQ2jcFo-:\F8g4WEW:"WDu=MPD?"GMC]8)KC&DZEBDuN@Ac?6>A,Ba6@JjNf?hn+%@Imsu
+@H_+p@JF=1A,^$8Ac?<@BDQ<?C&VlAC\_f'D=_ZEDuFYQEW:(YF8^4\FT?U`G63#7H2`-iHN8Hm
+IK+`rJ,Xs"JV&LQK*$^[L&Qf.LPUccM>rJ5MuJ\8NW5%:O8k=AOo1CAPQ$gCQ2[*KQhm*KRJrZQ
+S,]#YSc,/[TDtS`U&UheU].(hV*1]RVl6PnWiE,$Xf\b0YHY79ZEppG[^NZT\[f;`]Y2%o^VI\&
+_o0O5`lH0Bb0.uPc-FV]dF$CkeC<%"rmqP1g"P07gt^`AhVR/hi;_d9ir8!<jSn9=k5OQCkkOE?
+lMTuBm/68LmeZDNnG_tTo)A7[o_\=\pAXg_q#:*fqYC$er;6H^rdk*#s7QDB~>
+JcC<$JcD>Ao)ARcrVZNhrqcZjr:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJs6'IGroO:D
+jQ-=#!TN);i;_[7hYu@2g]6+.gAfh+f_sD'f%&=Me,n+Idf.YociDDjc2u87bl5cjb/qcHaN)?@
+rl"oV_u@LR_8-&b!PZ8H]Eu3]\[f5Z[^NTNrj*oVZ*:I9Y-"h-X/`2!W2HPjV50o^U7n9RT:VXF
+S=?":R@'A.QN!-\P`q8nOcYZcO,f3ZN/W[PMZ/G5Lkktas+LH+rIY0'JV!fNs*t&trI+]ns*OZi
+s*=Tgr-/-`rcS-\rcA'Zr,M^Ts)7gQrb_[Or+l=Is(VCErb)7Cqdoe<raYb5rF,S2k?n!lpgN&h
+nR;3#p0mZ(rF>h;qITY<rb)(@rb;=GphTbCokiH$rGVXRr,M^Vs)\-\s)n?brHA<fH$TC8!df<B
+rd=isIt.HJ#D%JYK7ei1L&Qi,LB*//M#rQmMuJ\8NW5%;O8k=AOo1CAPQ$gDQ2[*KQhm*KRJrZP
+S,]#XSc,/[TDtS`U&UkeU].%iV5F6i8Z8VfWiE,$Xf\b/YHY79ZEpmE[C3QS\[f;`]Y(qm^VI\&
+_Sa@3`lH0AaihlOc-FV\d*^7he'umtf%8O+g"P07gYCW@hVR/hi;_a9ir.p;jT"?>k5XWDkkXK@
+lMTuBm/68KmeQ>MnG_tSo)A7[o_\=\pAXg_q#:*fqYC$dr;?N_rdk*#s7H>A~>
+JcC<$JcD>Ao)ARcrVZNhrqcZjr:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJs6'IGroO:D
+jQ-=#!TN);i;_[7hYu@2g]6+.gAfh+f_sD'f%&=Me,n+Idf.YociDDjc2u87bl5cjb/qcHaN)?@
+rl"oV_u@LR_8-&b!PZ8H]Eu3]\[f5Z[^NTNrj*oVZ*:I9Y-"h-X/`2!W2HPjV50o^U7n9RT:VXF
+S=?":R@'A.QN!-\P`q8nOcYZcO,f3ZN/W[PMZ/G5Lkktas+LH+rIY0'JV!fNs*t&trI+]ns*OZi
+s*=Tgr-/-`rcS-\rcA'Zr,M^Ts)7gQrb_[Or+l=Is(VCErb)7Cqdoe<raYb5rF,S2k?n!lpgN&h
+nR;3#p0mZ(rF>h;qITY<rb)(@rb;=GphTbCokiH$rGVXRr,M^Vs)\-\s)n?brHA<fH$TC8!df<B
+rd=isIt.HJ#D%JYK7ei1L&Qi,LB*//M#rQmMuJ\8NW5%;O8k=AOo1CAPQ$gDQ2[*KQhm*KRJrZP
+S,]#XSc,/[TDtS`U&UkeU].%iV5F6i8Z8VfWiE,$Xf\b/YHY79ZEpmE[C3QS\[f;`]Y(qm^VI\&
+_Sa@3`lH0AaihlOc-FV\d*^7he'umtf%8O+g"P07gYCW@hVR/hi;_a9ir.p;jT"?>k5XWDkkXK@
+lMTuBm/68KmeQ>MnG_tSo)A7[o_\=\pAXg_q#:*fqYC$dr;?N_rdk*#s7H>A~>
+JcC<$JcD>Ao)ARcrVZNhrqcZjr:p<ds7ZEas7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJs6'IGroO:D
+jQ-=#!TN);i;_[7hYu@2g]6+.gAfh+f_sD'f%&=Me,n+Idf.YociDDjc2u87bl5cjb/qcHaN)?@
+rl"oV_u@LR_8-&b!PZ8H]Eu3]\[f5Z[^NTNrj*oVZ*:I9Y-"h-X/`2!W2HPjV50o^U7n9RT:VXF
+S=?":R@'A.QN!-\P`q8nOcYZcO,f3ZN/W[PMZ/G5Lkktas+LH+rIY0'JV!fNs*t&trI+]ns*OZi
+s*=Tgr-/-`rcS-\rcA'Zr,M^Ts)7gQrb_[Or+l=Is(VCErb)7Cqdoe<raYb5rF,S2k?n!lpgN&h
+nR;3#p0mZ(rF>h;qITY<rb)(@rb;=GphTbCokiH$rGVXRr,M^Vs)\-\s)n?brHA<fH$TC8!df<B
+rd=isIt.HJ#D%JYK7ei1L&Qi,LB*//M#rQmMuJ\8NW5%;O8k=AOo1CAPQ$gDQ2[*KQhm*KRJrZP
+S,]#XSc,/[TDtS`U&UkeU].%iV5F6i8Z8VfWiE,$Xf\b/YHY79ZEpmE[C3QS\[f;`]Y(qm^VI\&
+_Sa@3`lH0AaihlOc-FV\d*^7he'umtf%8O+g"P07gYCW@hVR/hi;_a9ir.p;jT"?>k5XWDkkXK@
+lMTuBm/68KmeQ>MnG_tSo)A7[o_\=\pAXg_q#:*fqYC$dr;?N_rdk*#s7H>A~>
+JcC<$JcD>Anc&IbrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp9[N!:'RJ!pJh1roO:D
+jQ-=##NF_$i8EMMhYl73gtUT_g&fs[f`'M&ec=8!e,n+Idf.YociDDjc2u87bl5cjb/qcHaN)?@
+rl"oV_u@LR_8-&b"hq[_]XtcS\Mq%-[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+S"#k8R@'A.QBd`"PEV/mOc]R'!KN0=MunopMZ/G5Lkktas+UK+re(6&!.k*!s*t&trI+]nrd4Ti
+rd"Ngqfi'`rcS*[s)\0[r,M^Ts)7gQs)%aOrG2CIs(VCEs(D=Cr+5k<rF>Y4r*eYopgMQZk@+$m
+rF>e:qITY<rb)+ArFu7Gq.onEq/+`$r,;LPqf2XVrcA$[s)n?brceBes*=Ti!df<Brd=isIt.HJ
+!J,k%KE$T)L&Qf.LPUccM>rG5MuJ\8NW5%;O8k=AOo:IBPQ-mEQ2[*KQhm*KRJrZPS,SrWSc,/Z
+TDtS`U&UkeU].(hV#[ClVZE`qri/#[XKAV-Y-5(6Z*L^B['d?N\%&u[]=bei^;%G!_SX4/`Pom=
+aN;TJbKS5Vcd:(edaQ^qe^i@(f\-8X#2@qhh;7#Grnmk:io9sts5a4Ar9"%Broj4CrTa=Hp[%eE
+r9jCLrUBdUqXXXWrUg![rq??cqY:'crVH?er;?HjnG\"=JcGBBJ,~>
+JcC<$JcD>Anc&IbrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp9[N!:'RJ!pJh1roO:D
+jQ-=##NF_$i8EMMhYl73gtUT_g&fs[f`'M&ec=8!e,n+Idf.YociDDjc2u87bl5cjb/qcHaN)?@
+rl"oV_u@LR_8-&b"hq[_]XtcS\Mq%-[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+S"#k8R@'A.QBd`"PEV/mOc]R'!KN0=MunopMZ/G5Lkktas+UK+re(6&!.k*!s*t&trI+]nrd4Ti
+rd"Ngqfi'`rcS*[s)\0[r,M^Ts)7gQs)%aOrG2CIs(VCEs(D=Cr+5k<rF>Y4r*eYopgMQZk@+$m
+rF>e:qITY<rb)+ArFu7Gq.onEq/+`$r,;LPqf2XVrcA$[s)n?brceBes*=Ti!df<Brd=isIt.HJ
+!J,k%KE$T)L&Qf.LPUccM>rG5MuJ\8NW5%;O8k=AOo:IBPQ-mEQ2[*KQhm*KRJrZPS,SrWSc,/Z
+TDtS`U&UkeU].(hV#[ClVZE`qri/#[XKAV-Y-5(6Z*L^B['d?N\%&u[]=bei^;%G!_SX4/`Pom=
+aN;TJbKS5Vcd:(edaQ^qe^i@(f\-8X#2@qhh;7#Grnmk:io9sts5a4Ar9"%Broj4CrTa=Hp[%eE
+r9jCLrUBdUqXXXWrUg![rq??cqY:'crVH?er;?HjnG\"=JcGBBJ,~>
+JcC<$JcD>Anc&IbrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp9[N!:'RJ!pJh1roO:D
+jQ-=##NF_$i8EMMhYl73gtUT_g&fs[f`'M&ec=8!e,n+Idf.YociDDjc2u87bl5cjb/qcHaN)?@
+rl"oV_u@LR_8-&b"hq[_]XtcS\Mq%-[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+S"#k8R@'A.QBd`"PEV/mOc]R'!KN0=MunopMZ/G5Lkktas+UK+re(6&!.k*!s*t&trI+]nrd4Ti
+rd"Ngqfi'`rcS*[s)\0[r,M^Ts)7gQs)%aOrG2CIs(VCEs(D=Cr+5k<rF>Y4r*eYopgMQZk@+$m
+rF>e:qITY<rb)+ArFu7Gq.onEq/+`$r,;LPqf2XVrcA$[s)n?brceBes*=Ti!df<Brd=isIt.HJ
+!J,k%KE$T)L&Qf.LPUccM>rG5MuJ\8NW5%;O8k=AOo:IBPQ-mEQ2[*KQhm*KRJrZPS,SrWSc,/Z
+TDtS`U&UkeU].(hV#[ClVZE`qri/#[XKAV-Y-5(6Z*L^B['d?N\%&u[]=bei^;%G!_SX4/`Pom=
+aN;TJbKS5Vcd:(edaQ^qe^i@(f\-8X#2@qhh;7#Grnmk:io9sts5a4Ar9"%Broj4CrTa=Hp[%eE
+r9jCLrUBdUqXXXWrUg![rq??cqY:'crVH?er;?HjnG\"=JcGBBJ,~>
+JcC<$JcD;@nc&IbrVZQirqcZjr:p<ds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'RJ!pJh1roO:D
+jQ-=#!oi1trnmk8hVS7fs4dV/rn@D*s4I>&s4.2#rR:ntdaJ-Bs3Lblrm(Pgs31Mds2k>`rl>Yk
+`l?!:`5KR1_SO((^V@Lrrk("u]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HPjV50o^U7n9RTV%gI
+SXc1=R[KP1Q^7W9!L/fIOo^],rf7)?NW+k<Mi*DkM#rKgL]3#0KnP-YKE$Q'Jc1-!J,aurIK+]o
+Hi/3iH2`'dGQ)dbFo6@]F8g4XEW:"WDuFSQD?"GMC]A/LC&DZDBDuN@Ac60=A+sI)@K0a+@I%Cn
+A*%1n@I[h*A,Ts7Ac?<?BDZBAC&MfCC]&#HD:ib%Du=SNEW1"YF8U.[FoQXaGQ2pfH2`*kH[L5?
+I0Y4NIt3'#JV*lR!ec8]re:H/M#N82M?&S5Muo!!NrG+>OT1IAP5gaFPl-gGQN*<JR/WNQReiNQ
+SGo)WT)PA^T`(SaUAq"fV#R7kVZ*LnW!TH'WiN2%Xf\b0rie;cZEpmE[C3NQ\@K/]]Y(ql^V@S#
+_Sa=2`Q#s>ai_fMbg"GYcd:(fe'umtf%8O+g"G*5gYDea!T)`5hu_lsir8!<jT"??k5XWDkkjWD
+lMTuBm/68Jme?2KnGVnRo)81Zo_S7[pAXg_q#:*fqYC$dr;6H^rdk*#s7?8@~>
+JcC<$JcD;@nc&IbrVZQirqcZjr:p<ds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'RJ!pJh1roO:D
+jQ-=#!oi1trnmk8hVS7fs4dV/rn@D*s4I>&s4.2#rR:ntdaJ-Bs3Lblrm(Pgs31Mds2k>`rl>Yk
+`l?!:`5KR1_SO((^V@Lrrk("u]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HPjV50o^U7n9RTV%gI
+SXc1=R[KP1Q^7W9!L/fIOo^],rf7)?NW+k<Mi*DkM#rKgL]3#0KnP-YKE$Q'Jc1-!J,aurIK+]o
+Hi/3iH2`'dGQ)dbFo6@]F8g4XEW:"WDuFSQD?"GMC]A/LC&DZDBDuN@Ac60=A+sI)@K0a+@I%Cn
+A*%1n@I[h*A,Ts7Ac?<?BDZBAC&MfCC]&#HD:ib%Du=SNEW1"YF8U.[FoQXaGQ2pfH2`*kH[L5?
+I0Y4NIt3'#JV*lR!ec8]re:H/M#N82M?&S5Muo!!NrG+>OT1IAP5gaFPl-gGQN*<JR/WNQReiNQ
+SGo)WT)PA^T`(SaUAq"fV#R7kVZ*LnW!TH'WiN2%Xf\b0rie;cZEpmE[C3NQ\@K/]]Y(ql^V@S#
+_Sa=2`Q#s>ai_fMbg"GYcd:(fe'umtf%8O+g"G*5gYDea!T)`5hu_lsir8!<jT"??k5XWDkkjWD
+lMTuBm/68Jme?2KnGVnRo)81Zo_S7[pAXg_q#:*fqYC$dr;6H^rdk*#s7?8@~>
+JcC<$JcD;@nc&IbrVZQirqcZjr:p<ds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'RJ!pJh1roO:D
+jQ-=#!oi1trnmk8hVS7fs4dV/rn@D*s4I>&s4.2#rR:ntdaJ-Bs3Lblrm(Pgs31Mds2k>`rl>Yk
+`l?!:`5KR1_SO((^V@Lrrk("u]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HPjV50o^U7n9RTV%gI
+SXc1=R[KP1Q^7W9!L/fIOo^],rf7)?NW+k<Mi*DkM#rKgL]3#0KnP-YKE$Q'Jc1-!J,aurIK+]o
+Hi/3iH2`'dGQ)dbFo6@]F8g4XEW:"WDuFSQD?"GMC]A/LC&DZDBDuN@Ac60=A+sI)@K0a+@I%Cn
+A*%1n@I[h*A,Ts7Ac?<?BDZBAC&MfCC]&#HD:ib%Du=SNEW1"YF8U.[FoQXaGQ2pfH2`*kH[L5?
+I0Y4NIt3'#JV*lR!ec8]re:H/M#N82M?&S5Muo!!NrG+>OT1IAP5gaFPl-gGQN*<JR/WNQReiNQ
+SGo)WT)PA^T`(SaUAq"fV#R7kVZ*LnW!TH'WiN2%Xf\b0rie;cZEpmE[C3NQ\@K/]]Y(ql^V@S#
+_Sa=2`Q#s>ai_fMbg"GYcd:(fe'umtf%8O+g"G*5gYDea!T)`5hu_lsir8!<jT"??k5XWDkkjWD
+lMTuBm/68Jme?2KnGVnRo)81Zo_S7[pAXg_q#:*fqYC$dr;6H^rdk*#s7?8@~>
+JcC<$JcD8?o)ARcrVZNhs8)`jr:p<ds7ZEas7H?_rpp*Z!:]sU!q,ICrp0^PlK\B5!pJh1roO:D
+jQ-=#!oi1tro!h6!8d_2s4mY/rn@D*!8.8%!nPoPrR:ntdaJ-Bs3LblrQYYmbfn8Rb0%j*aAp:#
+`l5p8`5BI/_8*k$^V7Co]Xtbd\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+S"#k7R@'A.QBd`"P`q8nOcb`dO,f6[repo:MMhCi!f2VereCH,!/1<'s+:9%rIFots*joprd=`m
+r-J?frcn?bs*"Bar,hpZs)S$Ws)A!Vr,2OOrbVOKrbDIIr+Q+Crau%=rFGk:o4%B$lXJa]emePe
+r+,Y8rau.Bqe5qBrbD:FrG;CKlu)!)qf)=Mrc8$[r,hs]s*"?bs*+Nhrd+Tk!.=cos*artrdY'$
+JqEuS!JH1+LB!#/M#N54MMmDlMuo!!NrG+>OT1IAP5gaGPl-gHQN!6JR/WNQReiNQSGo)VT)PA^
+T_tM`UAq"fV#R:kVZ*J$W2ZbrWiN5&Xf\b0rie;cZEpmE[C3NQ\@K/]]=bei^V@S#_SX4/`Q#s>
+aN;TJbK\>Xcd:(edaQ^qe^i@(f\,!4gYDea!T)`5hu_lsir8!<j8e<?k5OQDkkjWDlM^&Dm/-2J
+me6,InGVnQo)A7Zo_\=[pAXg_q#:*fqYC$dr;6H]rdk*#s7?8@~>
+JcC<$JcD8?o)ARcrVZNhs8)`jr:p<ds7ZEas7H?_rpp*Z!:]sU!q,ICrp0^PlK\B5!pJh1roO:D
+jQ-=#!oi1tro!h6!8d_2s4mY/rn@D*!8.8%!nPoPrR:ntdaJ-Bs3LblrQYYmbfn8Rb0%j*aAp:#
+`l5p8`5BI/_8*k$^V7Co]Xtbd\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+S"#k7R@'A.QBd`"P`q8nOcb`dO,f6[repo:MMhCi!f2VereCH,!/1<'s+:9%rIFots*joprd=`m
+r-J?frcn?bs*"Bar,hpZs)S$Ws)A!Vr,2OOrbVOKrbDIIr+Q+Crau%=rFGk:o4%B$lXJa]emePe
+r+,Y8rau.Bqe5qBrbD:FrG;CKlu)!)qf)=Mrc8$[r,hs]s*"?bs*+Nhrd+Tk!.=cos*artrdY'$
+JqEuS!JH1+LB!#/M#N54MMmDlMuo!!NrG+>OT1IAP5gaGPl-gHQN!6JR/WNQReiNQSGo)VT)PA^
+T_tM`UAq"fV#R:kVZ*J$W2ZbrWiN5&Xf\b0rie;cZEpmE[C3NQ\@K/]]=bei^V@S#_SX4/`Q#s>
+aN;TJbK\>Xcd:(edaQ^qe^i@(f\,!4gYDea!T)`5hu_lsir8!<j8e<?k5OQDkkjWDlM^&Dm/-2J
+me6,InGVnQo)A7Zo_\=[pAXg_q#:*fqYC$dr;6H]rdk*#s7?8@~>
+JcC<$JcD8?o)ARcrVZNhs8)`jr:p<ds7ZEas7H?_rpp*Z!:]sU!q,ICrp0^PlK\B5!pJh1roO:D
+jQ-=#!oi1tro!h6!8d_2s4mY/rn@D*!8.8%!nPoPrR:ntdaJ-Bs3LblrQYYmbfn8Rb0%j*aAp:#
+`l5p8`5BI/_8*k$^V7Co]Xtbd\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+S"#k7R@'A.QBd`"P`q8nOcb`dO,f6[repo:MMhCi!f2VereCH,!/1<'s+:9%rIFots*joprd=`m
+r-J?frcn?bs*"Bar,hpZs)S$Ws)A!Vr,2OOrbVOKrbDIIr+Q+Crau%=rFGk:o4%B$lXJa]emePe
+r+,Y8rau.Bqe5qBrbD:FrG;CKlu)!)qf)=Mrc8$[r,hs]s*"?bs*+Nhrd+Tk!.=cos*artrdY'$
+JqEuS!JH1+LB!#/M#N54MMmDlMuo!!NrG+>OT1IAP5gaGPl-gHQN!6JR/WNQReiNQSGo)VT)PA^
+T_tM`UAq"fV#R:kVZ*J$W2ZbrWiN5&Xf\b0rie;cZEpmE[C3NQ\@K/]]=bei^V@S#_SX4/`Q#s>
+aN;TJbK\>Xcd:(edaQ^qe^i@(f\,!4gYDea!T)`5hu_lsir8!<j8e<?k5OQDkkjWDlM^&Dm/-2J
+me6,InGVnQo)A7Zo_\=[pAXg_q#:*fqYC$dr;6H]rdk*#s7?8@~>
+JcC<$JcD8?nc&LcrVZNhrqcZjr:p<ds7ZEas7H?_rUL$[nF6GGs6fpSrp0^PlK\B5!pJh1roO:D
+jQ-=#s5F%;ro!h6s5*b2s4dV/rRq>+f\$/S!nPoPrm^tss3gnos3Lblrm(Pg!6kGcs2k>`rl>,\
+`r<pX`5DSk9>SEY^V7Fq]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OT:VXF
+S=?":R@'A.Q^3o%P`q;oP*(ifO,o<]NW+k<Mi*DkM#rKgL]3&.L&Zi)KE$Q'Jc1-!J,auqIK+]o
+Hi/3iH2`'dGQ)dcFo6@\F8p:YEW:"XDu=MQD?"GMC]A/KC&DZEBDuN>Ac60;A)CbhA)q1oA)Uno
+A,Ts6Ac?<?BDZBAC&VlDC]/)JD=h`.DtS)DEW1"XF8U.[FoHR`GQ2pfH2`-iHN8HmIK+`rJ,Xs'
+JV&K+K7no3re:H/M#N82M?&S6N;nk;NrG+>OT1IBP5gaGPl6mHQN*<KR/`TQRerTQSGo)VT)PA]
+T_tM`UAq"eV#R:kVZ*LnVuWgrWWB0%riH4(YPtafZ*L^B['d?N\%&uZ]">Vf]tV7r_8=(,`5T^8
+a2lBFbKJ,ScHaeadF-LneCE.%f@\d1g=tE<h;-rFrnmk:io9sts5X1ArT=.Cs60CFrp'IJq<\%H
+qsO1Hr:'XSq==LUrUfsZrq?<bqY:'crVH<dr;?Kkn,@n<JcG<@J,~>
+JcC<$JcD8?nc&LcrVZNhrqcZjr:p<ds7ZEas7H?_rUL$[nF6GGs6fpSrp0^PlK\B5!pJh1roO:D
+jQ-=#s5F%;ro!h6s5*b2s4dV/rRq>+f\$/S!nPoPrm^tss3gnos3Lblrm(Pg!6kGcs2k>`rl>,\
+`r<pX`5DSk9>SEY^V7Fq]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OT:VXF
+S=?":R@'A.Q^3o%P`q;oP*(ifO,o<]NW+k<Mi*DkM#rKgL]3&.L&Zi)KE$Q'Jc1-!J,auqIK+]o
+Hi/3iH2`'dGQ)dcFo6@\F8p:YEW:"XDu=MQD?"GMC]A/KC&DZEBDuN>Ac60;A)CbhA)q1oA)Uno
+A,Ts6Ac?<?BDZBAC&VlDC]/)JD=h`.DtS)DEW1"XF8U.[FoHR`GQ2pfH2`-iHN8HmIK+`rJ,Xs'
+JV&K+K7no3re:H/M#N82M?&S6N;nk;NrG+>OT1IBP5gaGPl6mHQN*<KR/`TQRerTQSGo)VT)PA]
+T_tM`UAq"eV#R:kVZ*LnVuWgrWWB0%riH4(YPtafZ*L^B['d?N\%&uZ]">Vf]tV7r_8=(,`5T^8
+a2lBFbKJ,ScHaeadF-LneCE.%f@\d1g=tE<h;-rFrnmk:io9sts5X1ArT=.Cs60CFrp'IJq<\%H
+qsO1Hr:'XSq==LUrUfsZrq?<bqY:'crVH<dr;?Kkn,@n<JcG<@J,~>
+JcC<$JcD8?nc&LcrVZNhrqcZjr:p<ds7ZEas7H?_rUL$[nF6GGs6fpSrp0^PlK\B5!pJh1roO:D
+jQ-=#s5F%;ro!h6s5*b2s4dV/rRq>+f\$/S!nPoPrm^tss3gnos3Lblrm(Pg!6kGcs2k>`rl>,\
+`r<pX`5DSk9>SEY^V7Fq]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OT:VXF
+S=?":R@'A.Q^3o%P`q;oP*(ifO,o<]NW+k<Mi*DkM#rKgL]3&.L&Zi)KE$Q'Jc1-!J,auqIK+]o
+Hi/3iH2`'dGQ)dcFo6@\F8p:YEW:"XDu=MQD?"GMC]A/KC&DZEBDuN>Ac60;A)CbhA)q1oA)Uno
+A,Ts6Ac?<?BDZBAC&VlDC]/)JD=h`.DtS)DEW1"XF8U.[FoHR`GQ2pfH2`-iHN8HmIK+`rJ,Xs'
+JV&K+K7no3re:H/M#N82M?&S6N;nk;NrG+>OT1IBP5gaGPl6mHQN*<KR/`TQRerTQSGo)VT)PA]
+T_tM`UAq"eV#R:kVZ*LnVuWgrWWB0%riH4(YPtafZ*L^B['d?N\%&uZ]">Vf]tV7r_8=(,`5T^8
+a2lBFbKJ,ScHaeadF-LneCE.%f@\d1g=tE<h;-rFrnmk:io9sts5X1ArT=.Cs60CFrp'IJq<\%H
+qsO1Hr:'XSq==LUrUfsZrq?<bqY:'crVH<dr;?Kkn,@n<JcG<@J,~>
+JcC<$JcD8?nc&IbrVZQirqcWir:p<ds7ZEas7H?_rpp*Zs7$$Vs6]mSrp9[Ns6BUJ!pJh1roX7B
+!9F.>s5O(;rnmk8hVS7fs4mY/rn@D*s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGcs2k>`rl>,\
+`r<pe`5BI/_83q%^V7Co]XtcS\LtD$[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+S"#k8R@'A.QN!-MP`u*0!KiKCO8k4?NW+k<Mi*DkM>rA3L])u-L&Zi*KE$Q'Jc(&uJ,auqIK"Wo
+Hi/3hH2i-eGQ)dcFo6@]F8g4YEW:"WDuFSRD>nAMC]8)KC&DZDBDuN=Ac-*7A+3t$A+jI!AbK[.
+A*[V#A,Km5Ac66?BDZBAC&VlDC]/)JD>.rCDrbm0EW'qWF8L(ZFoQX`GQ2pfH2`*kH[L5?I0+kI
+J,Xs!JV*lR#D@ebL5(J=M#N54MMmDlMueourJq#AOcfX+s-*JIrK[DKs-NYNrgEbSqj[STrLNhW
+rh'1_qk=%arhKFfs/#amrhodp!3,sts/Q.$riH4(YPtaYZ*L^B['d?N\%&uZ]">Vf]tV7r^qmn)
+`5T^8a2l?Db0/#RcHab_dF$CkeC<%Jf+6Neg=k<:h;-rFhr*GOiSsjs!p&J)rT=.Cs60FGrp'LK
+q<\(IqsO.Gr:'XSq""CTrUfsZrV$6bqY:$brVH<dr;?Kkn,@n<JcG9?J,~>
+JcC<$JcD8?nc&IbrVZQirqcWir:p<ds7ZEas7H?_rpp*Zs7$$Vs6]mSrp9[Ns6BUJ!pJh1roX7B
+!9F.>s5O(;rnmk8hVS7fs4mY/rn@D*s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGcs2k>`rl>,\
+`r<pe`5BI/_83q%^V7Co]XtcS\LtD$[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+S"#k8R@'A.QN!-MP`u*0!KiKCO8k4?NW+k<Mi*DkM>rA3L])u-L&Zi*KE$Q'Jc(&uJ,auqIK"Wo
+Hi/3hH2i-eGQ)dcFo6@]F8g4YEW:"WDuFSRD>nAMC]8)KC&DZDBDuN=Ac-*7A+3t$A+jI!AbK[.
+A*[V#A,Km5Ac66?BDZBAC&VlDC]/)JD>.rCDrbm0EW'qWF8L(ZFoQX`GQ2pfH2`*kH[L5?I0+kI
+J,Xs!JV*lR#D@ebL5(J=M#N54MMmDlMueourJq#AOcfX+s-*JIrK[DKs-NYNrgEbSqj[STrLNhW
+rh'1_qk=%arhKFfs/#amrhodp!3,sts/Q.$riH4(YPtaYZ*L^B['d?N\%&uZ]">Vf]tV7r^qmn)
+`5T^8a2l?Db0/#RcHab_dF$CkeC<%Jf+6Neg=k<:h;-rFhr*GOiSsjs!p&J)rT=.Cs60FGrp'LK
+q<\(IqsO.Gr:'XSq""CTrUfsZrV$6bqY:$brVH<dr;?Kkn,@n<JcG9?J,~>
+JcC<$JcD8?nc&IbrVZQirqcWir:p<ds7ZEas7H?_rpp*Zs7$$Vs6]mSrp9[Ns6BUJ!pJh1roX7B
+!9F.>s5O(;rnmk8hVS7fs4mY/rn@D*s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGcs2k>`rl>,\
+`r<pe`5BI/_83q%^V7Co]XtcS\LtD$[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC
+S"#k8R@'A.QN!-MP`u*0!KiKCO8k4?NW+k<Mi*DkM>rA3L])u-L&Zi*KE$Q'Jc(&uJ,auqIK"Wo
+Hi/3hH2i-eGQ)dcFo6@]F8g4YEW:"WDuFSRD>nAMC]8)KC&DZDBDuN=Ac-*7A+3t$A+jI!AbK[.
+A*[V#A,Km5Ac66?BDZBAC&VlDC]/)JD>.rCDrbm0EW'qWF8L(ZFoQX`GQ2pfH2`*kH[L5?I0+kI
+J,Xs!JV*lR#D@ebL5(J=M#N54MMmDlMueourJq#AOcfX+s-*JIrK[DKs-NYNrgEbSqj[STrLNhW
+rh'1_qk=%arhKFfs/#amrhodp!3,sts/Q.$riH4(YPtaYZ*L^B['d?N\%&uZ]">Vf]tV7r^qmn)
+`5T^8a2l?Db0/#RcHab_dF$CkeC<%Jf+6Neg=k<:h;-rFhr*GOiSsjs!p&J)rT=.Cs60FGrp'LK
+q<\(IqsO.Gr:'XSq""CTrUfsZrV$6bqY:$brVH<dr;?Kkn,@n<JcG9?J,~>
+JcC<$JcD5>nc&LcrVZNhrqcWirV6Bds7ZEas7H?_rpp*Zs7$$Vs6]mSrp9[Ns6BUJ!pJh1roX7B
+!9F+=!oi1tro!h6s5*b2s4mY/rn@D*s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGc4j(mgaN2EB
+`l5p8_o'@._8*h#^:q:n]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ%WSct[T
+S"#k7rg3_QQN!-MP`u*0!KiKCO8k4?NW+n:MZAY5M#rKgL])r/KnP-XKE$Q&Jc1-!J,XopIK+]o
+Hi/3iH2`'eGQ)dcFo6@]F8p:YEW:"XDuFSQD?"GMC]A/KC&DZDBDlH;Abos*A+aBdAbT`qA,Bg4
+Ac66?BDQ<@C&VlEC]8/KD>8#GDtS)-EVskUF8L(ZFoQX`GQ2pfH2`-iHiJKmI0Y4NIt3'#JV*lR
+!JH1+L'NKiLl$tGMMqIm!f`5#rf7,BOcfX+s-*JIrg!MLs-NYNs-`kTr1!YTrginWrh'1_qk="`
+rhKFfs/#amrMT[os/H!t6E@2hXf\b/YHY79Z*L^B['d?N\%&rY\[oDc]tV7r^qmn)_o0O5a2l?D
+b0.uPc-FY^dF$CkeC<%"f@S[.g=k<:rnRe8hr*GOiSsjs!p&J)roX7Ds60CFs6BULqX"1Jr9j7H
+qsaORp[\:SrUfpYrV$6bq=ssbrVH<dr;?Hjn,@n<JcG9?J,~>
+JcC<$JcD5>nc&LcrVZNhrqcWirV6Bds7ZEas7H?_rpp*Zs7$$Vs6]mSrp9[Ns6BUJ!pJh1roX7B
+!9F+=!oi1tro!h6s5*b2s4mY/rn@D*s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGc4j(mgaN2EB
+`l5p8_o'@._8*h#^:q:n]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ%WSct[T
+S"#k7rg3_QQN!-MP`u*0!KiKCO8k4?NW+n:MZAY5M#rKgL])r/KnP-XKE$Q&Jc1-!J,XopIK+]o
+Hi/3iH2`'eGQ)dcFo6@]F8p:YEW:"XDuFSQD?"GMC]A/KC&DZDBDlH;Abos*A+aBdAbT`qA,Bg4
+Ac66?BDQ<@C&VlEC]8/KD>8#GDtS)-EVskUF8L(ZFoQX`GQ2pfH2`-iHiJKmI0Y4NIt3'#JV*lR
+!JH1+L'NKiLl$tGMMqIm!f`5#rf7,BOcfX+s-*JIrg!MLs-NYNs-`kTr1!YTrginWrh'1_qk="`
+rhKFfs/#amrMT[os/H!t6E@2hXf\b/YHY79Z*L^B['d?N\%&rY\[oDc]tV7r^qmn)_o0O5a2l?D
+b0.uPc-FY^dF$CkeC<%"f@S[.g=k<:rnRe8hr*GOiSsjs!p&J)roX7Ds60CFs6BULqX"1Jr9j7H
+qsaORp[\:SrUfpYrV$6bq=ssbrVH<dr;?Hjn,@n<JcG9?J,~>
+JcC<$JcD5>nc&LcrVZNhrqcWirV6Bds7ZEas7H?_rpp*Zs7$$Vs6]mSrp9[Ns6BUJ!pJh1roX7B
+!9F+=!oi1tro!h6s5*b2s4mY/rn@D*s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGc4j(mgaN2EB
+`l5p8_o'@._8*h#^:q:n]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ%WSct[T
+S"#k7rg3_QQN!-MP`u*0!KiKCO8k4?NW+n:MZAY5M#rKgL])r/KnP-XKE$Q&Jc1-!J,XopIK+]o
+Hi/3iH2`'eGQ)dcFo6@]F8p:YEW:"XDuFSQD?"GMC]A/KC&DZDBDlH;Abos*A+aBdAbT`qA,Bg4
+Ac66?BDQ<@C&VlEC]8/KD>8#GDtS)-EVskUF8L(ZFoQX`GQ2pfH2`-iHiJKmI0Y4NIt3'#JV*lR
+!JH1+L'NKiLl$tGMMqIm!f`5#rf7,BOcfX+s-*JIrg!MLs-NYNs-`kTr1!YTrginWrh'1_qk="`
+rhKFfs/#amrMT[os/H!t6E@2hXf\b/YHY79Z*L^B['d?N\%&rY\[oDc]tV7r^qmn)_o0O5a2l?D
+b0.uPc-FY^dF$CkeC<%"f@S[.g=k<:rnRe8hr*GOiSsjs!p&J)roX7Ds60CFs6BULqX"1Jr9j7H
+qsaORp[\:SrUfpYrV$6bq=ssbrVH<dr;?Hjn,@n<JcG9?J,~>
+JcC<$JcD5>nc&IbrVZNhrqcZjr:p<ds7ZB`!qc*UrUU!Y!:]sUs6]mSrp9[Ns6BUJs6'IGroX7B
+s5a1>s5F%;rS[_5!8d\1s4dV/rS%;)s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGc!QrO`a8s?$
+rl"oV_u@M!_8*h#^:h1l]=PP`\@8oT[C*BJZa$a=YHG"0XK/A$WMl_mVPX9f$)=5gTqJ$LSt2DN
+RgY[QR$a5,QBd`"P`u*0!KiKCO8k4?NW+n:MuS\6M>rD3L]3&.L&Zi)KE$Q&Jc1,uJ,auqIK+]o
+Hi/3iH2`'eGQ)dcFo?F]F8p:ZEW:"WDuFSRD>nAMC]8)JC&;TCBDlH7Aaa0iAcHB*AbK[)A,'U0
+Ac66?BDQ<@C&VlEC]8/KD>A)IDu+G.EVjeSF8L(YFoQX_GQ2mfH2W'hHN8HmIK+`rJ,Xs'JV&K+
+K7no3re:H/M#N59MMmCON/`gWrf@)@!0R8Ds-!GIrK[DKs-N\Os-`nUqj[VUrginWrh'.^qk="`
+rhKCerh]XlrMT[os/H!ts/Q.$riJ>dYHP17Z*L[AZa@-K[^W`U\[f;`]Y(ql^VI\&_Sa=2`Q#s>
+aND]Lbg"GYcd:(fe'umtf%8O+g"P07h#?+6hV[8LiSieqir\<'jo4EBkPscEl2U&Jlhg&ImJZJH
+n,)VOnb2POoDS=Wp&4U_p\O[`q>L0bqu$BhrU9`:s+14>s*t~>
+JcC<$JcD5>nc&IbrVZNhrqcZjr:p<ds7ZB`!qc*UrUU!Y!:]sUs6]mSrp9[Ns6BUJs6'IGroX7B
+s5a1>s5F%;rS[_5!8d\1s4dV/rS%;)s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGc!QrO`a8s?$
+rl"oV_u@M!_8*h#^:h1l]=PP`\@8oT[C*BJZa$a=YHG"0XK/A$WMl_mVPX9f$)=5gTqJ$LSt2DN
+RgY[QR$a5,QBd`"P`u*0!KiKCO8k4?NW+n:MuS\6M>rD3L]3&.L&Zi)KE$Q&Jc1,uJ,auqIK+]o
+Hi/3iH2`'eGQ)dcFo?F]F8p:ZEW:"WDuFSRD>nAMC]8)JC&;TCBDlH7Aaa0iAcHB*AbK[)A,'U0
+Ac66?BDQ<@C&VlEC]8/KD>A)IDu+G.EVjeSF8L(YFoQX_GQ2mfH2W'hHN8HmIK+`rJ,Xs'JV&K+
+K7no3re:H/M#N59MMmCON/`gWrf@)@!0R8Ds-!GIrK[DKs-N\Os-`nUqj[VUrginWrh'.^qk="`
+rhKCerh]XlrMT[os/H!ts/Q.$riJ>dYHP17Z*L[AZa@-K[^W`U\[f;`]Y(ql^VI\&_Sa=2`Q#s>
+aND]Lbg"GYcd:(fe'umtf%8O+g"P07h#?+6hV[8LiSieqir\<'jo4EBkPscEl2U&Jlhg&ImJZJH
+n,)VOnb2POoDS=Wp&4U_p\O[`q>L0bqu$BhrU9`:s+14>s*t~>
+JcC<$JcD5>nc&IbrVZNhrqcZjr:p<ds7ZB`!qc*UrUU!Y!:]sUs6]mSrp9[Ns6BUJs6'IGroX7B
+s5a1>s5F%;rS[_5!8d\1s4dV/rS%;)s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGc!QrO`a8s?$
+rl"oV_u@M!_8*h#^:h1l]=PP`\@8oT[C*BJZa$a=YHG"0XK/A$WMl_mVPX9f$)=5gTqJ$LSt2DN
+RgY[QR$a5,QBd`"P`u*0!KiKCO8k4?NW+n:MuS\6M>rD3L]3&.L&Zi)KE$Q&Jc1,uJ,auqIK+]o
+Hi/3iH2`'eGQ)dcFo?F]F8p:ZEW:"WDuFSRD>nAMC]8)JC&;TCBDlH7Aaa0iAcHB*AbK[)A,'U0
+Ac66?BDQ<@C&VlEC]8/KD>A)IDu+G.EVjeSF8L(YFoQX_GQ2mfH2W'hHN8HmIK+`rJ,Xs'JV&K+
+K7no3re:H/M#N59MMmCON/`gWrf@)@!0R8Ds-!GIrK[DKs-N\Os-`nUqj[VUrginWrh'.^qk="`
+rhKCerh]XlrMT[os/H!ts/Q.$riJ>dYHP17Z*L[AZa@-K[^W`U\[f;`]Y(ql^VI\&_Sa=2`Q#s>
+aND]Lbg"GYcd:(fe'umtf%8O+g"P07h#?+6hV[8LiSieqir\<'jo4EBkPscEl2U&Jlhg&ImJZJH
+n,)VOnb2POoDS=Wp&4U_p\O[`q>L0bqu$BhrU9`:s+14>s*t~>
+JcC<$JcD2=o)ARcrVZNhrqcWir:p<ds7ZEas7H?_rUL$[nF6DF!q,ICrp9[Ns6BUJs6'IGrT41C
+jQ-=#s5O(;ro!h6s5*_1s4dV/rS%;)s4I>&s475#rm^tss3gnos3LblrltSibfp(0!QrO`a8s?$
+rl#&Z_ns:,_#D(t^:h1l]=PP`\@8oT[C!9HZE^X<YHG"0XK/A$WMl_mVPU)aUS=HUTV)4T&=o>\
+S!ob5R$a5+QBd`"P`u*0#a(41O,o<]NK*pr!fMqnrJCQ1!/LN-s+UK+r.G$$s+1)us*t#srI+Zm
+s*OZis*=TgrHJ9brcS0]s)\3\r,MaUs)7jRrb_[Or+l:Hrb;7CrFc%?g1B/Rmq(`ook")6rb)(@
+rb;@HqeQ1IrGDCKrGVRPic4X3qfDRTrcS6ar-/0cs*=Qh!df<BrdFfq!.Xuu#D%JYK7ei1L&Qf-
+LPYqd!K)g7N!G?&NfT6_OHKO*s-!GIrKRGMQ^@Z<s-`nUr1!\Us.0%YrLa(^qP!n_rhK@drh]Xl
+r29Rn!3,pss/Q.$riQ4'!3cC+!O8s0ZT,>"[^NZS\@K/]]=bei^;%Fu_8=+.`Poj;aN2KGbKJ/U
+cHjkbdF-LneCE.%f@\d1g=tE=h;7&ghuVfrro4(@jlQL(s6'FGrTX@Is6KRKrpB[Pp[A"Kqsj@M
+r:BjYq=X^[rV--_rV?Egq"t!equ,s^JcC<$nGe"~>
+JcC<$JcD2=o)ARcrVZNhrqcWir:p<ds7ZEas7H?_rUL$[nF6DF!q,ICrp9[Ns6BUJs6'IGrT41C
+jQ-=#s5O(;ro!h6s5*_1s4dV/rS%;)s4I>&s475#rm^tss3gnos3LblrltSibfp(0!QrO`a8s?$
+rl#&Z_ns:,_#D(t^:h1l]=PP`\@8oT[C!9HZE^X<YHG"0XK/A$WMl_mVPU)aUS=HUTV)4T&=o>\
+S!ob5R$a5+QBd`"P`u*0#a(41O,o<]NK*pr!fMqnrJCQ1!/LN-s+UK+r.G$$s+1)us*t#srI+Zm
+s*OZis*=TgrHJ9brcS0]s)\3\r,MaUs)7jRrb_[Or+l:Hrb;7CrFc%?g1B/Rmq(`ook")6rb)(@
+rb;@HqeQ1IrGDCKrGVRPic4X3qfDRTrcS6ar-/0cs*=Qh!df<BrdFfq!.Xuu#D%JYK7ei1L&Qf-
+LPYqd!K)g7N!G?&NfT6_OHKO*s-!GIrKRGMQ^@Z<s-`nUr1!\Us.0%YrLa(^qP!n_rhK@drh]Xl
+r29Rn!3,pss/Q.$riQ4'!3cC+!O8s0ZT,>"[^NZS\@K/]]=bei^;%Fu_8=+.`Poj;aN2KGbKJ/U
+cHjkbdF-LneCE.%f@\d1g=tE=h;7&ghuVfrro4(@jlQL(s6'FGrTX@Is6KRKrpB[Pp[A"Kqsj@M
+r:BjYq=X^[rV--_rV?Egq"t!equ,s^JcC<$nGe"~>
+JcC<$JcD2=o)ARcrVZNhrqcWir:p<ds7ZEas7H?_rUL$[nF6DF!q,ICrp9[Ns6BUJs6'IGrT41C
+jQ-=#s5O(;ro!h6s5*_1s4dV/rS%;)s4I>&s475#rm^tss3gnos3LblrltSibfp(0!QrO`a8s?$
+rl#&Z_ns:,_#D(t^:h1l]=PP`\@8oT[C!9HZE^X<YHG"0XK/A$WMl_mVPU)aUS=HUTV)4T&=o>\
+S!ob5R$a5+QBd`"P`u*0#a(41O,o<]NK*pr!fMqnrJCQ1!/LN-s+UK+r.G$$s+1)us*t#srI+Zm
+s*OZis*=TgrHJ9brcS0]s)\3\r,MaUs)7jRrb_[Or+l:Hrb;7CrFc%?g1B/Rmq(`ook")6rb)(@
+rb;@HqeQ1IrGDCKrGVRPic4X3qfDRTrcS6ar-/0cs*=Qh!df<BrdFfq!.Xuu#D%JYK7ei1L&Qf-
+LPYqd!K)g7N!G?&NfT6_OHKO*s-!GIrKRGMQ^@Z<s-`nUr1!\Us.0%YrLa(^qP!n_rhK@drh]Xl
+r29Rn!3,pss/Q.$riQ4'!3cC+!O8s0ZT,>"[^NZS\@K/]]=bei^;%Fu_8=+.`Poj;aN2KGbKJ/U
+cHjkbdF-LneCE.%f@\d1g=tE=h;7&ghuVfrro4(@jlQL(s6'FGrTX@Is6KRKrpB[Pp[A"Kqsj@M
+r:BjYq=X^[rV--_rV?Egq"t!equ,s^JcC<$nGe"~>
+JcC<$JcD2=nc&IbrVZNhrqcZjr:p9cs7ZEas7H?_rUL$[nF6DF!q,ICrp9[Ns6BUJs60LGroX7B
+!9F+=s5F%;rS[_5s5*_1!o2PbrS%;)s4I>&s475#rm^tss3gno!mo9>rlu)"bfn8Rb/qcHaN)<?
+`Pod5rk^V1^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HPjV50o^US=HUTV%gISXc4>
+S!ocEQiWP>rfmPLPEZ!/!g/S+rf7,@NK*prs,6o7re^Z2s+gQ-s+UK+r.G$$s+1)us*t#sr-eTm
+s*OZis*=TgrHJ9bs)n6]s)\3\rGhjVrbqaQs)%aOr+l:Hrb;4Br+Gh;m:Gs&j(J*ueRe\krFbt?
+rb;@HqeQ1Irb_LLrGVUQo5X#8pN-(NrcS3`r-/0cs*=Qhs*F`nrI"p"It*!!JUrFPK+*EeKnb>;
+LkpnEMMd>kMueourf7;GOcbfiPEV70Pld8<Qi39QR@9TBS,]#XSc#)YTDkM[U&C_bU\gkdV>d@i
+VuN^qWVrjsWrT7"XTu#4YHY79Z*OA86aX80[^WcV\[f;`]Y(ql^V@S#_SX4/`Pom=aN;TJbKS5V
+cHjncdaQ^qe^i@(f\,!4gYCW@hV[5Ki8N\Tj5]4]jo4EBk5a`El2U&Klhg&JmJcPKn,)VOnauDM
+oDJ7Up&4U^p\FU_q>L0bqu$BhrU0Z9s+14=s*t~>
+JcC<$JcD2=nc&IbrVZNhrqcZjr:p9cs7ZEas7H?_rUL$[nF6DF!q,ICrp9[Ns6BUJs60LGroX7B
+!9F+=s5F%;rS[_5s5*_1!o2PbrS%;)s4I>&s475#rm^tss3gno!mo9>rlu)"bfn8Rb/qcHaN)<?
+`Pod5rk^V1^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HPjV50o^US=HUTV%gISXc4>
+S!ocEQiWP>rfmPLPEZ!/!g/S+rf7,@NK*prs,6o7re^Z2s+gQ-s+UK+r.G$$s+1)us*t#sr-eTm
+s*OZis*=TgrHJ9bs)n6]s)\3\rGhjVrbqaQs)%aOr+l:Hrb;4Br+Gh;m:Gs&j(J*ueRe\krFbt?
+rb;@HqeQ1Irb_LLrGVUQo5X#8pN-(NrcS3`r-/0cs*=Qhs*F`nrI"p"It*!!JUrFPK+*EeKnb>;
+LkpnEMMd>kMueourf7;GOcbfiPEV70Pld8<Qi39QR@9TBS,]#XSc#)YTDkM[U&C_bU\gkdV>d@i
+VuN^qWVrjsWrT7"XTu#4YHY79Z*OA86aX80[^WcV\[f;`]Y(ql^V@S#_SX4/`Pom=aN;TJbKS5V
+cHjncdaQ^qe^i@(f\,!4gYCW@hV[5Ki8N\Tj5]4]jo4EBk5a`El2U&Klhg&JmJcPKn,)VOnauDM
+oDJ7Up&4U^p\FU_q>L0bqu$BhrU0Z9s+14=s*t~>
+JcC<$JcD2=nc&IbrVZNhrqcZjr:p9cs7ZEas7H?_rUL$[nF6DF!q,ICrp9[Ns6BUJs60LGroX7B
+!9F+=s5F%;rS[_5s5*_1!o2PbrS%;)s4I>&s475#rm^tss3gno!mo9>rlu)"bfn8Rb/qcHaN)<?
+`Pod5rk^V1^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HPjV50o^US=HUTV%gISXc4>
+S!ocEQiWP>rfmPLPEZ!/!g/S+rf7,@NK*prs,6o7re^Z2s+gQ-s+UK+r.G$$s+1)us*t#sr-eTm
+s*OZis*=TgrHJ9bs)n6]s)\3\rGhjVrbqaQs)%aOr+l:Hrb;4Br+Gh;m:Gs&j(J*ueRe\krFbt?
+rb;@HqeQ1Irb_LLrGVUQo5X#8pN-(NrcS3`r-/0cs*=Qhs*F`nrI"p"It*!!JUrFPK+*EeKnb>;
+LkpnEMMd>kMueourf7;GOcbfiPEV70Pld8<Qi39QR@9TBS,]#XSc#)YTDkM[U&C_bU\gkdV>d@i
+VuN^qWVrjsWrT7"XTu#4YHY79Z*OA86aX80[^WcV\[f;`]Y(ql^V@S#_SX4/`Pom=aN;TJbKS5V
+cHjncdaQ^qe^i@(f\,!4gYCW@hV[5Ki8N\Tj5]4]jo4EBk5a`El2U&Klhg&JmJcPKn,)VOnauDM
+oDJ7Up&4U^p\FU_q>L0bqu$BhrU0Z9s+14=s*t~>
+JcC<$JcD2=nc&IbrVZNhrqcWir:p<ds7ZB`s7H?_rpp*Zs7$!U!q,ICrp9[Ns6BUJs60LGroX7B
+s5a1>s5O(;rS[_5s5*_1!o2PbrS%;)s4I;%!nPoPrm^tss3gno!mo9>rltPhbl5cib/qcHaN)="
+`Ab`Q_SX.)^V@Lr]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HPjV50o^U7n9RT:_^HSXf\K
+!LfGUQiWP>rg!MJ!0dDF!g/S+rf@)>!0-r9s,-l7rJCQ1s+gQ-s+UH*rIb-%rdjuts*t&tr-eTm
+rd4Tis*=TgrHJ9bs)n9^s)\3\r,MaUs)7gQs)%aOr+l:HrFu%?q.K,-oOm<"ph0A6hdu[srFbt?
+rb;@HqeQ1Irb_LLrbqaSp2ThIl>uQ=rH8'^r-/0crd"Khs*OcnrdFfq!.Xuus+(0%rdt6)L&Qf=
+LPUbCM2I4LN/WaVNfT6_OHKO*!gAk5rfmPNQ^@]=s-`nUrL<hWs.0(Zrh'1_qP!n_rhK=crh]Uk
+qksImri,jrs/Q.$rN6+&!3cC+2R0QnZa7$G[C3NQ\@B)[]">Vf]tV7r^qmn)_o0O5`lH0AaihlO
+c-FV\d*^7he'umtf@S[.rn7n;gtgfChr*GOiSrnXjQ,G%k5XTEkl'cGlMp2Jm/HDOmeQ>LnGDbJ
+o)&%Vo_8%VpAOa]q#1$dqY9scr;6H\rdk*#s6fo;~>
+JcC<$JcD2=nc&IbrVZNhrqcWir:p<ds7ZB`s7H?_rpp*Zs7$!U!q,ICrp9[Ns6BUJs60LGroX7B
+s5a1>s5O(;rS[_5s5*_1!o2PbrS%;)s4I;%!nPoPrm^tss3gno!mo9>rltPhbl5cib/qcHaN)="
+`Ab`Q_SX.)^V@Lr]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HPjV50o^U7n9RT:_^HSXf\K
+!LfGUQiWP>rg!MJ!0dDF!g/S+rf@)>!0-r9s,-l7rJCQ1s+gQ-s+UH*rIb-%rdjuts*t&tr-eTm
+rd4Tis*=TgrHJ9bs)n9^s)\3\r,MaUs)7gQs)%aOr+l:HrFu%?q.K,-oOm<"ph0A6hdu[srFbt?
+rb;@HqeQ1Irb_LLrbqaSp2ThIl>uQ=rH8'^r-/0crd"Khs*OcnrdFfq!.Xuus+(0%rdt6)L&Qf=
+LPUbCM2I4LN/WaVNfT6_OHKO*!gAk5rfmPNQ^@]=s-`nUrL<hWs.0(Zrh'1_qP!n_rhK=crh]Uk
+qksImri,jrs/Q.$rN6+&!3cC+2R0QnZa7$G[C3NQ\@B)[]">Vf]tV7r^qmn)_o0O5`lH0AaihlO
+c-FV\d*^7he'umtf@S[.rn7n;gtgfChr*GOiSrnXjQ,G%k5XTEkl'cGlMp2Jm/HDOmeQ>LnGDbJ
+o)&%Vo_8%VpAOa]q#1$dqY9scr;6H\rdk*#s6fo;~>
+JcC<$JcD2=nc&IbrVZNhrqcWir:p<ds7ZB`s7H?_rpp*Zs7$!U!q,ICrp9[Ns6BUJs60LGroX7B
+s5a1>s5O(;rS[_5s5*_1!o2PbrS%;)s4I;%!nPoPrm^tss3gno!mo9>rltPhbl5cib/qcHaN)="
+`Ab`Q_SX.)^V@Lr]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HPjV50o^U7n9RT:_^HSXf\K
+!LfGUQiWP>rg!MJ!0dDF!g/S+rf@)>!0-r9s,-l7rJCQ1s+gQ-s+UH*rIb-%rdjuts*t&tr-eTm
+rd4Tis*=TgrHJ9bs)n9^s)\3\r,MaUs)7gQs)%aOr+l:HrFu%?q.K,-oOm<"ph0A6hdu[srFbt?
+rb;@HqeQ1Irb_LLrbqaSp2ThIl>uQ=rH8'^r-/0crd"Khs*OcnrdFfq!.Xuus+(0%rdt6)L&Qf=
+LPUbCM2I4LN/WaVNfT6_OHKO*!gAk5rfmPNQ^@]=s-`nUrL<hWs.0(Zrh'1_qP!n_rhK=crh]Uk
+qksImri,jrs/Q.$rN6+&!3cC+2R0QnZa7$G[C3NQ\@B)[]">Vf]tV7r^qmn)_o0O5`lH0AaihlO
+c-FV\d*^7he'umtf@S[.rn7n;gtgfChr*GOiSrnXjQ,G%k5XTEkl'cGlMp2Jm/HDOmeQ>LnGDbJ
+o)&%Vo_8%VpAOa]q#1$dqY9scr;6H\rdk*#s6fo;~>
+JcC<$JcD/<nc&IbrVZNhrqcWir:p<ds7ZEas7H?_rUU!Ys7$!U!q,ICrTjUOlK\?4!pJh1rT=.A
+!9F+=s5O(;rS[_5s5*_1!o2PbrS%;)s4I;%!nPoPrm^tss3gno#LLfCcHa\Zbl5cdb/sY("inX%
+`Pf[n_Ci[?^V@Lr]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc\U7n9RTDkDdSXc1=
+R[TZDQiWP>rg!MJ!0dDFs,d;CrJq#?NK*prs,6o7rJCQ1s+gN,s+UK+r.G$$s+1)us*t#srI+]n
+rd4Tis*=WhrHJ6as)n9^s)\3\rGhgUs)7gQs)%aOqeQ1GrFtn;mUsp\q.KJ7l=Kj)r+Gh=rb;@H
+qeQ1Irb_OMrGV[Spi61OpN,;8r,qs]qfi'brd"Hgs*F`nrI"`rIt.HJ#D%JYK7ei1L&Qf-LPYqd
+!K)g7Mueourf7;GOcbfiPEV71Q2d-MQi<BPRK&`TS,]#XSc,/ZTDtS]U&LebU\^ecV>d@hVuEXo
+WVrjsX8f:"XoGO(YPtd+YlM*/ZNdeE[C3NQ\Gj#m]">Vf]tV7r^qmn)_o0O5`lH0Aai_fMbg+M[
+d*^7he'umtf%8O+g"P07gtgfChu;O<iSrnXjQ,G%k5XTEkl'`IlKdd6m/HDOmeZDNnGDbJo)&%U
+o_.tVpAF[\q#'sdqY0mbr;6H\rdk*#s6]i:~>
+JcC<$JcD/<nc&IbrVZNhrqcWir:p<ds7ZEas7H?_rUU!Ys7$!U!q,ICrTjUOlK\?4!pJh1rT=.A
+!9F+=s5O(;rS[_5s5*_1!o2PbrS%;)s4I;%!nPoPrm^tss3gno#LLfCcHa\Zbl5cdb/sY("inX%
+`Pf[n_Ci[?^V@Lr]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc\U7n9RTDkDdSXc1=
+R[TZDQiWP>rg!MJ!0dDFs,d;CrJq#?NK*prs,6o7rJCQ1s+gN,s+UK+r.G$$s+1)us*t#srI+]n
+rd4Tis*=WhrHJ6as)n9^s)\3\rGhgUs)7gQs)%aOqeQ1GrFtn;mUsp\q.KJ7l=Kj)r+Gh=rb;@H
+qeQ1Irb_OMrGV[Spi61OpN,;8r,qs]qfi'brd"Hgs*F`nrI"`rIt.HJ#D%JYK7ei1L&Qf-LPYqd
+!K)g7Mueourf7;GOcbfiPEV71Q2d-MQi<BPRK&`TS,]#XSc,/ZTDtS]U&LebU\^ecV>d@hVuEXo
+WVrjsX8f:"XoGO(YPtd+YlM*/ZNdeE[C3NQ\Gj#m]">Vf]tV7r^qmn)_o0O5`lH0Aai_fMbg+M[
+d*^7he'umtf%8O+g"P07gtgfChu;O<iSrnXjQ,G%k5XTEkl'`IlKdd6m/HDOmeZDNnGDbJo)&%U
+o_.tVpAF[\q#'sdqY0mbr;6H\rdk*#s6]i:~>
+JcC<$JcD/<nc&IbrVZNhrqcWir:p<ds7ZEas7H?_rUU!Ys7$!U!q,ICrTjUOlK\?4!pJh1rT=.A
+!9F+=s5O(;rS[_5s5*_1!o2PbrS%;)s4I;%!nPoPrm^tss3gno#LLfCcHa\Zbl5cdb/sY("inX%
+`Pf[n_Ci[?^V@Lr]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc\U7n9RTDkDdSXc1=
+R[TZDQiWP>rg!MJ!0dDFs,d;CrJq#?NK*prs,6o7rJCQ1s+gN,s+UK+r.G$$s+1)us*t#srI+]n
+rd4Tis*=WhrHJ6as)n9^s)\3\rGhgUs)7gQs)%aOqeQ1GrFtn;mUsp\q.KJ7l=Kj)r+Gh=rb;@H
+qeQ1Irb_OMrGV[Spi61OpN,;8r,qs]qfi'brd"Hgs*F`nrI"`rIt.HJ#D%JYK7ei1L&Qf-LPYqd
+!K)g7Mueourf7;GOcbfiPEV71Q2d-MQi<BPRK&`TS,]#XSc,/ZTDtS]U&LebU\^ecV>d@hVuEXo
+WVrjsX8f:"XoGO(YPtd+YlM*/ZNdeE[C3NQ\Gj#m]">Vf]tV7r^qmn)_o0O5`lH0Aai_fMbg+M[
+d*^7he'umtf%8O+g"P07gtgfChu;O<iSrnXjQ,G%k5XTEkl'`IlKdd6m/HDOmeZDNnGDbJo)&%U
+o_.tVpAF[\q#'sdqY0mbr;6H\rdk*#s6]i:~>
+JcC<$JcD/<nc&Ibr;?HhrqcWir:p9cs7ZEas7H?_rUU!Ys7$$Vs6fpSrTjUOlK\?4s6'IGrT=.A
+s5a.=s5O(;rS[_5s5*_1s4mY/rn@D*s4I;%s4.2#rm^tss3gno!RT0lc3qn@bfe2Pb/q`Ga2\+t
+4iG7T_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;qqVl-DgUnjc[TqS-PT:VXFS=H(<
+R[TZDQiWP>rg!MJ!0dDFs,m>Crf@)>s,I#:s,6o7rJCQ1s+gN,s+UK+r.G$$s+1)us*t#srI+]n
+s*OZis*=WhrHJ9bs)n9^s)\3\r,MaUs)7gQrb_XNqeQ.Fqe=_sl=oa$ph/`$qe,_<rFu7GqeQ1I
+rb_OMrbqdTq/Q=QqfC\;q/uUYqKMp`s*=Ngs*OcnrdFfq!.Xuus+(0%rdtf9KnY89LPL\BM2I1K
+N/WaUNrG(?OHKO*!L&cIQ2d-MQi<BPR/i]SS,]#YSc,/[TDtS]U&LecU\^ecV>[:gVuEXoWVidq
+X8f:"XoGO(YPk[,Z*L\7ZN7G@rjDj:\Gj#i]">Vf]tV7r^qmk(_Sa@3`lH0Aai_fMbg"GYcd:(e
+daZdsf%8O+g"P07h#?+5hV[8LiSsjs!T`AAk5XTEkl'`IlKdd6m/QJPmecJOnGMhKo(qtTo_.tU
+pAF[[q#1$dqY0mbr;6H\rdk*#s6Tc9~>
+JcC<$JcD/<nc&Ibr;?HhrqcWir:p9cs7ZEas7H?_rUU!Ys7$$Vs6fpSrTjUOlK\?4s6'IGrT=.A
+s5a.=s5O(;rS[_5s5*_1s4mY/rn@D*s4I;%s4.2#rm^tss3gno!RT0lc3qn@bfe2Pb/q`Ga2\+t
+4iG7T_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;qqVl-DgUnjc[TqS-PT:VXFS=H(<
+R[TZDQiWP>rg!MJ!0dDFs,m>Crf@)>s,I#:s,6o7rJCQ1s+gN,s+UK+r.G$$s+1)us*t#srI+]n
+s*OZis*=WhrHJ9bs)n9^s)\3\r,MaUs)7gQrb_XNqeQ.Fqe=_sl=oa$ph/`$qe,_<rFu7GqeQ1I
+rb_OMrbqdTq/Q=QqfC\;q/uUYqKMp`s*=Ngs*OcnrdFfq!.Xuus+(0%rdtf9KnY89LPL\BM2I1K
+N/WaUNrG(?OHKO*!L&cIQ2d-MQi<BPR/i]SS,]#YSc,/[TDtS]U&LecU\^ecV>[:gVuEXoWVidq
+X8f:"XoGO(YPk[,Z*L\7ZN7G@rjDj:\Gj#i]">Vf]tV7r^qmk(_Sa@3`lH0Aai_fMbg"GYcd:(e
+daZdsf%8O+g"P07h#?+5hV[8LiSsjs!T`AAk5XTEkl'`IlKdd6m/QJPmecJOnGMhKo(qtTo_.tU
+pAF[[q#1$dqY0mbr;6H\rdk*#s6Tc9~>
+JcC<$JcD/<nc&Ibr;?HhrqcWir:p9cs7ZEas7H?_rUU!Ys7$$Vs6fpSrTjUOlK\?4s6'IGrT=.A
+s5a.=s5O(;rS[_5s5*_1s4mY/rn@D*s4I;%s4.2#rm^tss3gno!RT0lc3qn@bfe2Pb/q`Ga2\+t
+4iG7T_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;qqVl-DgUnjc[TqS-PT:VXFS=H(<
+R[TZDQiWP>rg!MJ!0dDFs,m>Crf@)>s,I#:s,6o7rJCQ1s+gN,s+UK+r.G$$s+1)us*t#srI+]n
+s*OZis*=WhrHJ9bs)n9^s)\3\r,MaUs)7gQrb_XNqeQ.Fqe=_sl=oa$ph/`$qe,_<rFu7GqeQ1I
+rb_OMrbqdTq/Q=QqfC\;q/uUYqKMp`s*=Ngs*OcnrdFfq!.Xuus+(0%rdtf9KnY89LPL\BM2I1K
+N/WaUNrG(?OHKO*!L&cIQ2d-MQi<BPR/i]SS,]#YSc,/[TDtS]U&LecU\^ecV>[:gVuEXoWVidq
+X8f:"XoGO(YPk[,Z*L\7ZN7G@rjDj:\Gj#i]">Vf]tV7r^qmk(_Sa@3`lH0Aai_fMbg"GYcd:(e
+daZdsf%8O+g"P07h#?+5hV[8LiSsjs!T`AAk5XTEkl'`IlKdd6m/QJPmecJOnGMhKo(qtTo_.tU
+pAF[[q#1$dqY0mbr;6H\rdk*#s6Tc9~>
+JcC<$JcD,;nc&IbrVZNhrqcWir:p<ds7ZB`s7H?_rUU!Ys7$$Vs6fpSrTsRM!:'OIs60LGrT41C
+jQ-:"s5O(;rS[_5rndV0s4mY/rn@D*s4I;%!nPoPrm^ts!7Lkos3LblrltPhbl5cdb/sY(0#tuN
+`Pf[2_SO((^V@Lr]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgrhL+#U7n9RT:_^HSXc4>
+S!ob5rg3_QQN!0LPlHsHOogc-OSt7?NW>(;N;nh9MZ&D2M#W8/LAuu,K`-Q&K)^E#JH(,uIf4]p
+I/eQlHN/9jGl;jdG5l^_FT6F^ErC"WE;skSDZ4MPD#%lECADT5B_#m(CA2H4B_H*5B(os4B`;`E
+CAVfGD#S;KDZ4SRE;FSQEr:"HFR=5IG5-:\GlE!dHN/?lI/SHpIXckHJ-(:RK)UB'KSBD[(5I^%
+M2@+JMi<USNfK0]OHGZgP*;)orfmMMQi<BPR/i]SRf]+NSc,/[TDtS^U&LecU\gkcV>d@gVuEXn
+WVidqX8f:"XoGR(YPk[,Z*L\7Zi@B4[JmT8\%)FJ"hM=Y]Y2&Y^GisE_SX4/`Poj;aN2KHbKS5V
+cHjkbdF-LneCE.%f@\d1g=tE=h;7&Ii8N\Tj5]4^jlY^gkNMm/!p]+;rTsONs6fdQrUBdUp@A(O
+qXjFQr:^'_q"Xd_r;-3cqu$?imf%e;JcG'9J,~>
+JcC<$JcD,;nc&IbrVZNhrqcWir:p<ds7ZB`s7H?_rUU!Ys7$$Vs6fpSrTsRM!:'OIs60LGrT41C
+jQ-:"s5O(;rS[_5rndV0s4mY/rn@D*s4I;%!nPoPrm^ts!7Lkos3LblrltPhbl5cdb/sY(0#tuN
+`Pf[2_SO((^V@Lr]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgrhL+#U7n9RT:_^HSXc4>
+S!ob5rg3_QQN!0LPlHsHOogc-OSt7?NW>(;N;nh9MZ&D2M#W8/LAuu,K`-Q&K)^E#JH(,uIf4]p
+I/eQlHN/9jGl;jdG5l^_FT6F^ErC"WE;skSDZ4MPD#%lECADT5B_#m(CA2H4B_H*5B(os4B`;`E
+CAVfGD#S;KDZ4SRE;FSQEr:"HFR=5IG5-:\GlE!dHN/?lI/SHpIXckHJ-(:RK)UB'KSBD[(5I^%
+M2@+JMi<USNfK0]OHGZgP*;)orfmMMQi<BPR/i]SRf]+NSc,/[TDtS^U&LecU\gkcV>d@gVuEXn
+WVidqX8f:"XoGR(YPk[,Z*L\7Zi@B4[JmT8\%)FJ"hM=Y]Y2&Y^GisE_SX4/`Poj;aN2KHbKS5V
+cHjkbdF-LneCE.%f@\d1g=tE=h;7&Ii8N\Tj5]4^jlY^gkNMm/!p]+;rTsONs6fdQrUBdUp@A(O
+qXjFQr:^'_q"Xd_r;-3cqu$?imf%e;JcG'9J,~>
+JcC<$JcD,;nc&IbrVZNhrqcWir:p<ds7ZB`s7H?_rUU!Ys7$$Vs6fpSrTsRM!:'OIs60LGrT41C
+jQ-:"s5O(;rS[_5rndV0s4mY/rn@D*s4I;%!nPoPrm^ts!7Lkos3LblrltPhbl5cdb/sY(0#tuN
+`Pf[2_SO((^V@Lr]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgrhL+#U7n9RT:_^HSXc4>
+S!ob5rg3_QQN!0LPlHsHOogc-OSt7?NW>(;N;nh9MZ&D2M#W8/LAuu,K`-Q&K)^E#JH(,uIf4]p
+I/eQlHN/9jGl;jdG5l^_FT6F^ErC"WE;skSDZ4MPD#%lECADT5B_#m(CA2H4B_H*5B(os4B`;`E
+CAVfGD#S;KDZ4SRE;FSQEr:"HFR=5IG5-:\GlE!dHN/?lI/SHpIXckHJ-(:RK)UB'KSBD[(5I^%
+M2@+JMi<USNfK0]OHGZgP*;)orfmMMQi<BPR/i]SRf]+NSc,/[TDtS^U&LecU\gkcV>d@gVuEXn
+WVidqX8f:"XoGR(YPk[,Z*L\7Zi@B4[JmT8\%)FJ"hM=Y]Y2&Y^GisE_SX4/`Poj;aN2KHbKS5V
+cHjkbdF-LneCE.%f@\d1g=tE=h;7&Ii8N\Tj5]4^jlY^gkNMm/!p]+;rTsONs6fdQrUBdUp@A(O
+qXjFQr:^'_q"Xd_r;-3cqu$?imf%e;JcG'9J,~>
+JcC<$JcD,;nc&Ibr;?EgrqcWir:p<ds7ZB`s7H?_rUU!Ys7$!U!q,ICrTsRMs6BUJs60LGrT=.A
+s5a.=s5O(;rS[\4s5*_1s4mY/rRq>+f\$/S!nPoPrm^ts!7Lko&CAbLcHa\Zbfe2Pb/q`Ga2\+t
+-,d^<_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;rrVZiroUnjc[rh0@cTDkD_SXf\K
+!h,OFrg3bRQBqN8!gJn4rf[;Ds,d5@s,R,=rJ^c7s,-c3reUT0rJ(<*s+L?'rdt0$rIFots*jlo
+s*XinrHeKhs*4Kds*"EbrH/'\s)S$Wrc%mUqelCMrbV=EpM0D9n7q<*pM0M<nS%B(oP"2;rbD:F
+rbVRNr,2LPrc%^Rrc7pXp2oqLmWS5HrcnBer-JBis*Xcns*artrI>-(JqAW-KS5'YL&m'creUZ5
+MuJY9NK4"!!K`HCOo^c2rfmPNQ^@]=!L]DTRf]+NSc55\TDtS^U&UkdU\pqdV>d@gVu<RnWV`^p
+X8]3uXoGR(YPk^*YlM*/Zi@B4[JmW7[gBRT\[oAa]Y(qlrkBks_8=(,`5T^8a2l?Db0.uPc-FV\
+dF$CkeC<%"f@S[.g=k<:h;-rFrnn">ioB([jQ6C'!pAe2rojLLlg+N9s6]jSqsXORrUKXQqXaRU
+oC`"Sr:fs\rV?Bfp\Xjcqu,s^JcC<$lMlA~>
+JcC<$JcD,;nc&Ibr;?EgrqcWir:p<ds7ZB`s7H?_rUU!Ys7$!U!q,ICrTsRMs6BUJs60LGrT=.A
+s5a.=s5O(;rS[\4s5*_1s4mY/rRq>+f\$/S!nPoPrm^ts!7Lko&CAbLcHa\Zbfe2Pb/q`Ga2\+t
+-,d^<_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;rrVZiroUnjc[rh0@cTDkD_SXf\K
+!h,OFrg3bRQBqN8!gJn4rf[;Ds,d5@s,R,=rJ^c7s,-c3reUT0rJ(<*s+L?'rdt0$rIFots*jlo
+s*XinrHeKhs*4Kds*"EbrH/'\s)S$Wrc%mUqelCMrbV=EpM0D9n7q<*pM0M<nS%B(oP"2;rbD:F
+rbVRNr,2LPrc%^Rrc7pXp2oqLmWS5HrcnBer-JBis*Xcns*artrI>-(JqAW-KS5'YL&m'creUZ5
+MuJY9NK4"!!K`HCOo^c2rfmPNQ^@]=!L]DTRf]+NSc55\TDtS^U&UkdU\pqdV>d@gVu<RnWV`^p
+X8]3uXoGR(YPk^*YlM*/Zi@B4[JmW7[gBRT\[oAa]Y(qlrkBks_8=(,`5T^8a2l?Db0.uPc-FV\
+dF$CkeC<%"f@S[.g=k<:h;-rFrnn">ioB([jQ6C'!pAe2rojLLlg+N9s6]jSqsXORrUKXQqXaRU
+oC`"Sr:fs\rV?Bfp\Xjcqu,s^JcC<$lMlA~>
+JcC<$JcD,;nc&Ibr;?EgrqcWir:p<ds7ZB`s7H?_rUU!Ys7$!U!q,ICrTsRMs6BUJs60LGrT=.A
+s5a.=s5O(;rS[\4s5*_1s4mY/rRq>+f\$/S!nPoPrm^ts!7Lko&CAbLcHa\Zbfe2Pb/q`Ga2\+t
+-,d^<_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;rrVZiroUnjc[rh0@cTDkD_SXf\K
+!h,OFrg3bRQBqN8!gJn4rf[;Ds,d5@s,R,=rJ^c7s,-c3reUT0rJ(<*s+L?'rdt0$rIFots*jlo
+s*XinrHeKhs*4Kds*"EbrH/'\s)S$Wrc%mUqelCMrbV=EpM0D9n7q<*pM0M<nS%B(oP"2;rbD:F
+rbVRNr,2LPrc%^Rrc7pXp2oqLmWS5HrcnBer-JBis*Xcns*artrI>-(JqAW-KS5'YL&m'creUZ5
+MuJY9NK4"!!K`HCOo^c2rfmPNQ^@]=!L]DTRf]+NSc55\TDtS^U&UkdU\pqdV>d@gVu<RnWV`^p
+X8]3uXoGR(YPk^*YlM*/Zi@B4[JmW7[gBRT\[oAa]Y(qlrkBks_8=(,`5T^8a2l?Db0.uPc-FV\
+dF$CkeC<%"f@S[.g=k<:h;-rFrnn">ioB([jQ6C'!pAe2rojLLlg+N9s6]jSqsXORrUKXQqXaRU
+oC`"Sr:fs\rV?Bfp\Xjcqu,s^JcC<$lMlA~>
+JcC<$JcD,;nG`@arVZNhrqcWir:p9cs7ZEarq-6^rUU!Ys7$$Vs6fpSrTsRMs6BRIs60LGrT=.A
+s5a.=s5O(;r8@V4s5*_1s4mY/rS%;)!8.8%s4.2#rm^ts!7Lko$dd5GcHa\Ybfe2Pao9@)a2Z*;
+`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHIl,$*:2-Wi;qpVl$<iU]I6brh0@cTDkD_SXf\K
+!h,OFrg3bRQBqN8s-*MIrK@2Cs,d5@s,R,=rJ^c7regZ2s+p]1r.b6*s+L<&s+:9%rIFots*jlo
+s*XinrH\NjG^0.1s*"EbrH/'\s)S$Wrc%mUqJQ:LrG:q<qeFGmqJ,k@gh?V"rG)4FrbVRNqelCO
+rc%aSrc7sYpiQ@To60>Ar-83dqg/6gs*Xcns*jutrdb$"!.t3&#D@ebL5(J=M#N53MMqIm&<2^2
+O-#HcP*2#mPa.N"QC%T<!h#LGrgNtZSXobOs.B=arLs7cs.fIes/#[kqksCkrMf[orN#t"qlTn$
+s0)@)!jT&:rNcR4[C-"B$b*XU\[f;`]=bei^Abki^qmn)_o0O5`lH0Aai_fMbg"GYcd:(edaQ^q
+e^i@(f`'S2gYCW@hV[8LiSsjs!T`AAjoX`0kl0fJlKdd7m/QJQmelPQnGVnPo)&%To^hbPpAF[Y
+q#'scqY0mar;6H[rdk*#s6BW7~>
+JcC<$JcD,;nG`@arVZNhrqcWir:p9cs7ZEarq-6^rUU!Ys7$$Vs6fpSrTsRMs6BRIs60LGrT=.A
+s5a.=s5O(;r8@V4s5*_1s4mY/rS%;)!8.8%s4.2#rm^ts!7Lko$dd5GcHa\Ybfe2Pao9@)a2Z*;
+`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHIl,$*:2-Wi;qpVl$<iU]I6brh0@cTDkD_SXf\K
+!h,OFrg3bRQBqN8s-*MIrK@2Cs,d5@s,R,=rJ^c7regZ2s+p]1r.b6*s+L<&s+:9%rIFots*jlo
+s*XinrH\NjG^0.1s*"EbrH/'\s)S$Wrc%mUqJQ:LrG:q<qeFGmqJ,k@gh?V"rG)4FrbVRNqelCO
+rc%aSrc7sYpiQ@To60>Ar-83dqg/6gs*Xcns*jutrdb$"!.t3&#D@ebL5(J=M#N53MMqIm&<2^2
+O-#HcP*2#mPa.N"QC%T<!h#LGrgNtZSXobOs.B=arLs7cs.fIes/#[kqksCkrMf[orN#t"qlTn$
+s0)@)!jT&:rNcR4[C-"B$b*XU\[f;`]=bei^Abki^qmn)_o0O5`lH0Aai_fMbg"GYcd:(edaQ^q
+e^i@(f`'S2gYCW@hV[8LiSsjs!T`AAjoX`0kl0fJlKdd7m/QJQmelPQnGVnPo)&%To^hbPpAF[Y
+q#'scqY0mar;6H[rdk*#s6BW7~>
+JcC<$JcD,;nG`@arVZNhrqcWir:p9cs7ZEarq-6^rUU!Ys7$$Vs6fpSrTsRMs6BRIs60LGrT=.A
+s5a.=s5O(;r8@V4s5*_1s4mY/rS%;)!8.8%s4.2#rm^ts!7Lko$dd5GcHa\Ybfe2Pao9@)a2Z*;
+`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHIl,$*:2-Wi;qpVl$<iU]I6brh0@cTDkD_SXf\K
+!h,OFrg3bRQBqN8s-*MIrK@2Cs,d5@s,R,=rJ^c7regZ2s+p]1r.b6*s+L<&s+:9%rIFots*jlo
+s*XinrH\NjG^0.1s*"EbrH/'\s)S$Wrc%mUqJQ:LrG:q<qeFGmqJ,k@gh?V"rG)4FrbVRNqelCO
+rc%aSrc7sYpiQ@To60>Ar-83dqg/6gs*Xcns*jutrdb$"!.t3&#D@ebL5(J=M#N53MMqIm&<2^2
+O-#HcP*2#mPa.N"QC%T<!h#LGrgNtZSXobOs.B=arLs7cs.fIes/#[kqksCkrMf[orN#t"qlTn$
+s0)@)!jT&:rNcR4[C-"B$b*XU\[f;`]=bei^Abki^qmn)_o0O5`lH0Aai_fMbg"GYcd:(edaQ^q
+e^i@(f`'S2gYCW@hV[8LiSsjs!T`AAjoX`0kl0fJlKdd7m/QJQmelPQnGVnPo)&%To^hbPpAF[Y
+q#'scqY0mar;6H[rdk*#s6BW7~>
+JcC<$JcD):nc&Ibr;?EgrqcWir:p9cs7ZEas7H<^rUU!Ys7$!Us6fpSrp9[Ns6BRIs60LGr9"%@
+s5a.=s5O%:rS[_5s5*_1s4mY/rS%;)!8.8%!nPoPrmV"udaJ-B!RT0lc2l26rl[IIaiMQD`l5p8
+_o'@._8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHG"0XK/A$WMlbnVl$;dUna]ZTqS-PTDkD_SXf\K
+s-`qUrg<_P!1*SK!gJn4rK@2C!0I/?s,R,=rJ^`6s,-c3s+pZ0rJ(?+s+L<&s+:9%rIFots*jop
+s*XinrHeKhs*4Kds*"EbrH/$[s)S$Wrc%jTqJQ7KqeY)(m;29-qJ,h?k\0j-rG).DrbVRNqelCO
+s)@jTrc7sYq/lOWqf^tCq0;g_qg/6grd=Zms*jutrdb$"s+:6&!JH1+L)#K"Ll$tGMMmFPNK0$[
+O-#KdP*2#nrfm_SQ^=),R@0NCRf]+NSc55\T)bP_U&UkeU\pqfV>d@hVu<RnWVNRnX8]3tXo>L&
+YPk^*Z2_-.ZN@MA[JmW7[fEr;\H]XW]=bei^Abl,^qmn)_o0O5`lH0Aai_fMbg"GYcd:(edaQ^q
+e^i@(f\,!4gYCW@hV[8LiSieVj5f=`k2tjikl0fJlKdd7m/QJQmelPRnGVnQo)/+Uo^_\OpA=UX
+q#'scqY'g`r;6H[rdk*#s69Q6~>
+JcC<$JcD):nc&Ibr;?EgrqcWir:p9cs7ZEas7H<^rUU!Ys7$!Us6fpSrp9[Ns6BRIs60LGr9"%@
+s5a.=s5O%:rS[_5s5*_1s4mY/rS%;)!8.8%!nPoPrmV"udaJ-B!RT0lc2l26rl[IIaiMQD`l5p8
+_o'@._8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHG"0XK/A$WMlbnVl$;dUna]ZTqS-PTDkD_SXf\K
+s-`qUrg<_P!1*SK!gJn4rK@2C!0I/?s,R,=rJ^`6s,-c3s+pZ0rJ(?+s+L<&s+:9%rIFots*jop
+s*XinrHeKhs*4Kds*"EbrH/$[s)S$Wrc%jTqJQ7KqeY)(m;29-qJ,h?k\0j-rG).DrbVRNqelCO
+s)@jTrc7sYq/lOWqf^tCq0;g_qg/6grd=Zms*jutrdb$"s+:6&!JH1+L)#K"Ll$tGMMmFPNK0$[
+O-#KdP*2#nrfm_SQ^=),R@0NCRf]+NSc55\T)bP_U&UkeU\pqfV>d@hVu<RnWVNRnX8]3tXo>L&
+YPk^*Z2_-.ZN@MA[JmW7[fEr;\H]XW]=bei^Abl,^qmn)_o0O5`lH0Aai_fMbg"GYcd:(edaQ^q
+e^i@(f\,!4gYCW@hV[8LiSieVj5f=`k2tjikl0fJlKdd7m/QJQmelPRnGVnQo)/+Uo^_\OpA=UX
+q#'scqY'g`r;6H[rdk*#s69Q6~>
+JcC<$JcD):nc&Ibr;?EgrqcWir:p9cs7ZEas7H<^rUU!Ys7$!Us6fpSrp9[Ns6BRIs60LGr9"%@
+s5a.=s5O%:rS[_5s5*_1s4mY/rS%;)!8.8%!nPoPrmV"udaJ-B!RT0lc2l26rl[IIaiMQD`l5p8
+_o'@._8*h#^:h1l]=PP`\@8oT[C!9HZE^X<YHG"0XK/A$WMlbnVl$;dUna]ZTqS-PTDkD_SXf\K
+s-`qUrg<_P!1*SK!gJn4rK@2C!0I/?s,R,=rJ^`6s,-c3s+pZ0rJ(?+s+L<&s+:9%rIFots*jop
+s*XinrHeKhs*4Kds*"EbrH/$[s)S$Wrc%jTqJQ7KqeY)(m;29-qJ,h?k\0j-rG).DrbVRNqelCO
+s)@jTrc7sYq/lOWqf^tCq0;g_qg/6grd=Zms*jutrdb$"s+:6&!JH1+L)#K"Ll$tGMMmFPNK0$[
+O-#KdP*2#nrfm_SQ^=),R@0NCRf]+NSc55\T)bP_U&UkeU\pqfV>d@hVu<RnWVNRnX8]3tXo>L&
+YPk^*Z2_-.ZN@MA[JmW7[fEr;\H]XW]=bei^Abl,^qmn)_o0O5`lH0Aai_fMbg"GYcd:(edaQ^q
+e^i@(f\,!4gYCW@hV[8LiSieVj5f=`k2tjikl0fJlKdd7m/QJQmelPRnGVnQo)/+Uo^_\OpA=UX
+q#'scqY'g`r;6H[rdk*#s69Q6~>
+JcC<$JcD):nG`@arVZNhrVHNhr:p<drq?<`s7H<^rUU!Ys7$!Us6fpSrTsRMs6BRIs60LGr9"%@
+s5a.=ro3t:rS[_5s5*_1s4mY/rS%;)s4I>&!nPoPrmVM.daHOjd*U+acHXVXbKJ&Mrl@:D`l5p8
+_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-XK/A$WMl_mVPU,bUnaZYTqS-OT:VXFSXf\K
+s-`qUrg<_Ps-EYLs-3PIrf[;Ds,d2?s,R,=r/CZ6s,-c3reUT0rJ(?+s+L<&s+:9%rIFots*jop
+s*Xinrd+Tis*4Hcs*"EbrH/$[s)S$Wrc%gSq/6(Hhe_[spMBG:qJ,)*r+c%CrG;IMqelFPrc%aS
+rc8!ZqK2[Yr-%LPms+\Spj2pdrd=Wls*jutrI=s#JqEuSs+CB+re:H/M#N53MMqIm!KE-=Nrb?)
+rfR;GPl?pKQC%T<!L]DURf]+NSc55\T)bP_U&UkeU]%"gV>d@iVuEXnWVWXoX8T-rXo>L'YPbX(
+Z2_-.Zi@B4[JdN8\%&sI\H0:Rrk&9F^AbkN^qmn)_o2Pn*6-%?aN;TJbKS5VcHjkbdF-Lne^i@(
+f\,!4gYDea&)Q4%i8N\Uj5f:_k2tjikl0iHl2^/Km/QJQmeuVRnG_tSo)/+Vo^_\OpA4OVq#'sb
+qY'g`r;6H[rdk*#s60K5~>
+JcC<$JcD):nG`@arVZNhrVHNhr:p<drq?<`s7H<^rUU!Ys7$!Us6fpSrTsRMs6BRIs60LGr9"%@
+s5a.=ro3t:rS[_5s5*_1s4mY/rS%;)s4I>&!nPoPrmVM.daHOjd*U+acHXVXbKJ&Mrl@:D`l5p8
+_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-XK/A$WMl_mVPU,bUnaZYTqS-OT:VXFSXf\K
+s-`qUrg<_Ps-EYLs-3PIrf[;Ds,d2?s,R,=r/CZ6s,-c3reUT0rJ(?+s+L<&s+:9%rIFots*jop
+s*Xinrd+Tis*4Hcs*"EbrH/$[s)S$Wrc%gSq/6(Hhe_[spMBG:qJ,)*r+c%CrG;IMqelFPrc%aS
+rc8!ZqK2[Yr-%LPms+\Spj2pdrd=Wls*jutrI=s#JqEuSs+CB+re:H/M#N53MMqIm!KE-=Nrb?)
+rfR;GPl?pKQC%T<!L]DURf]+NSc55\T)bP_U&UkeU]%"gV>d@iVuEXnWVWXoX8T-rXo>L'YPbX(
+Z2_-.Zi@B4[JdN8\%&sI\H0:Rrk&9F^AbkN^qmn)_o2Pn*6-%?aN;TJbKS5VcHjkbdF-Lne^i@(
+f\,!4gYDea&)Q4%i8N\Uj5f:_k2tjikl0iHl2^/Km/QJQmeuVRnG_tSo)/+Vo^_\OpA4OVq#'sb
+qY'g`r;6H[rdk*#s60K5~>
+JcC<$JcD):nG`@arVZNhrVHNhr:p<drq?<`s7H<^rUU!Ys7$!Us6fpSrTsRMs6BRIs60LGr9"%@
+s5a.=ro3t:rS[_5s5*_1s4mY/rS%;)s4I>&!nPoPrmVM.daHOjd*U+acHXVXbKJ&Mrl@:D`l5p8
+_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-XK/A$WMl_mVPU,bUnaZYTqS-OT:VXFSXf\K
+s-`qUrg<_Ps-EYLs-3PIrf[;Ds,d2?s,R,=r/CZ6s,-c3reUT0rJ(?+s+L<&s+:9%rIFots*jop
+s*Xinrd+Tis*4Hcs*"EbrH/$[s)S$Wrc%gSq/6(Hhe_[spMBG:qJ,)*r+c%CrG;IMqelFPrc%aS
+rc8!ZqK2[Yr-%LPms+\Spj2pdrd=Wls*jutrI=s#JqEuSs+CB+re:H/M#N53MMqIm!KE-=Nrb?)
+rfR;GPl?pKQC%T<!L]DURf]+NSc55\T)bP_U&UkeU]%"gV>d@iVuEXnWVWXoX8T-rXo>L'YPbX(
+Z2_-.Zi@B4[JdN8\%&sI\H0:Rrk&9F^AbkN^qmn)_o2Pn*6-%?aN;TJbKS5VcHjkbdF-Lne^i@(
+f\,!4gYDea&)Q4%i8N\Uj5f:_k2tjikl0iHl2^/Km/QJQmeuVRnG_tSo)/+Vo^_\OpA4OVq#'sb
+qY'g`r;6H[rdk*#s60K5~>
+JcC<$JcD&9nc&FarVZNhrqcWiqtU3crq?<`s7H<^rUU!Ys7$!Us6fpSrTsRMs6BOHs60LGrT=+@
+s5a.=ro3t:rS[_5rndV0s4dV/rS%;)!8.8%!nPoPrmUttdf.Vpd*M^:!R8jfb;7;_aN2EA`Pod5
+_SX.)^V@Lr]Y(kf\[f5Z[^NTN['R*EZ*:I9Y-"h-X/`2!WMl_mVPX9f#G\#fTqS-PTDkD`SXc5L
+Rf]%HRJrTRQN3?MQ2d*KPPp[EOT:L@O8k7?NW"h9MuS\4M>rD3L])u-L&Zi(KE$Q'Jc:3"J,aur
+IK+]pHi89jH2i-fGQ2jdFo6@]F8g4WEW0qUDt\)-D<u07D>J)?C\DN<C%uH;C]/)KD>S5MDuO_R
+EW1"XF8L(XFo?LVGP6:MH1ZF]HiAEiIK+crJ,OotJH1<#K)pXZreCH.!/UW2!K)g7N#I\9O,oBa
+OcklkPa%GuQC!r*R$jD3S"#q<Sc52^T:hkVU&UkeU]%"gV>mFjVuEXoWV`^oX8T-rXo>L%YPbX(
+Z2_-.Zi@E4[JdN8\%&sI\H9@S]DfGD]tXK\1VgiD_Sa=1`Poj;aN2KGbKJ,ScHab_dF$CkeC<%"
+f@S[.g=k<:h;-rFi8ESRioB([jo4BCkNMp0s69UMrTsROs6fjSs7$$XqXXUVr:KRQq=a[Zo_A@[
+qtg$`qu$<hmJ_\:JcFp5J,~>
+JcC<$JcD&9nc&FarVZNhrqcWiqtU3crq?<`s7H<^rUU!Ys7$!Us6fpSrTsRMs6BOHs60LGrT=+@
+s5a.=ro3t:rS[_5rndV0s4dV/rS%;)!8.8%!nPoPrmUttdf.Vpd*M^:!R8jfb;7;_aN2EA`Pod5
+_SX.)^V@Lr]Y(kf\[f5Z[^NTN['R*EZ*:I9Y-"h-X/`2!WMl_mVPX9f#G\#fTqS-PTDkD`SXc5L
+Rf]%HRJrTRQN3?MQ2d*KPPp[EOT:L@O8k7?NW"h9MuS\4M>rD3L])u-L&Zi(KE$Q'Jc:3"J,aur
+IK+]pHi89jH2i-fGQ2jdFo6@]F8g4WEW0qUDt\)-D<u07D>J)?C\DN<C%uH;C]/)KD>S5MDuO_R
+EW1"XF8L(XFo?LVGP6:MH1ZF]HiAEiIK+crJ,OotJH1<#K)pXZreCH.!/UW2!K)g7N#I\9O,oBa
+OcklkPa%GuQC!r*R$jD3S"#q<Sc52^T:hkVU&UkeU]%"gV>mFjVuEXoWV`^oX8T-rXo>L%YPbX(
+Z2_-.Zi@E4[JdN8\%&sI\H9@S]DfGD]tXK\1VgiD_Sa=1`Poj;aN2KGbKJ,ScHab_dF$CkeC<%"
+f@S[.g=k<:h;-rFi8ESRioB([jo4BCkNMp0s69UMrTsROs6fjSs7$$XqXXUVr:KRQq=a[Zo_A@[
+qtg$`qu$<hmJ_\:JcFp5J,~>
+JcC<$JcD&9nc&FarVZNhrqcWiqtU3crq?<`s7H<^rUU!Ys7$!Us6fpSrTsRMs6BOHs60LGrT=+@
+s5a.=ro3t:rS[_5rndV0s4dV/rS%;)!8.8%!nPoPrmUttdf.Vpd*M^:!R8jfb;7;_aN2EA`Pod5
+_SX.)^V@Lr]Y(kf\[f5Z[^NTN['R*EZ*:I9Y-"h-X/`2!WMl_mVPX9f#G\#fTqS-PTDkD`SXc5L
+Rf]%HRJrTRQN3?MQ2d*KPPp[EOT:L@O8k7?NW"h9MuS\4M>rD3L])u-L&Zi(KE$Q'Jc:3"J,aur
+IK+]pHi89jH2i-fGQ2jdFo6@]F8g4WEW0qUDt\)-D<u07D>J)?C\DN<C%uH;C]/)KD>S5MDuO_R
+EW1"XF8L(XFo?LVGP6:MH1ZF]HiAEiIK+crJ,OotJH1<#K)pXZreCH.!/UW2!K)g7N#I\9O,oBa
+OcklkPa%GuQC!r*R$jD3S"#q<Sc52^T:hkVU&UkeU]%"gV>mFjVuEXoWV`^oX8T-rXo>L%YPbX(
+Z2_-.Zi@E4[JdN8\%&sI\H9@S]DfGD]tXK\1VgiD_Sa=1`Poj;aN2KGbKJ,ScHab_dF$CkeC<%"
+f@S[.g=k<:h;-rFi8ESRioB([jo4BCkNMp0s69UMrTsROs6fjSs7$$XqXXUVr:KRQq=a[Zo_A@[
+qtg$`qu$<hmJ_\:JcFp5J,~>
+JcC<$JcD&9nG`@arVZKgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!Us6fpSr9XILs6BRIs60IFrT=+@
+s5a+<s5O(;r8@V4s5*_1s4dV/rS%;)!8.;&s4.2#rm^ts'%51Td*U+acHXVXbKJ&MaN2EArl$5&
+_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-XK/A$WMofo!N)^mU]I6brh0CdT:c+S!hGjO
+rgWqV!1EeQ!gf4=rK[DIs-*DEs,m>CrK$u=s,Hu9s,6l6rJCQ1s+gQ-s+UK+rIb-%s+1-!s*t&t
+rI+]n!.4Zjs*=Whr-/0as)n6]s)\0[qJlIQr,98dqJH+Gn8%]3o5";@rGDFLrbqdTqf2UUs)\'Z
+rH8*_pilU[om,_Hr-SBiqgJHms*suts+13%rdt9*Kn]M\'o.U$M2@+IMi<USNK0'\OHGZgP*;.0
+Pl[2;rg3_SRf8cWS=TYNs.9:arh9@ds.fRhs/#amr29Rnri,dpri?"!qQ9_!ric1&riuL/r3QF1
+s0_g6s0i!<rji'?!5&6Cs1LS0^V@S"_8=(,`5KX6`lH0Aai_fMbg"GYcd:(edaQ^qe^i@(f\,!4
+gYCW@hV[5Ki8N\Uj5f=`k2tjjkl0fJlKdd8m/QGQmelPRnGi%Uo)81Xo^qhPpA+ISq"smaqXsa_
+r;-BYrdk*#s6'E4~>
+JcC<$JcD&9nG`@arVZKgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!Us6fpSr9XILs6BRIs60IFrT=+@
+s5a+<s5O(;r8@V4s5*_1s4dV/rS%;)!8.;&s4.2#rm^ts'%51Td*U+acHXVXbKJ&MaN2EArl$5&
+_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-XK/A$WMofo!N)^mU]I6brh0CdT:c+S!hGjO
+rgWqV!1EeQ!gf4=rK[DIs-*DEs,m>CrK$u=s,Hu9s,6l6rJCQ1s+gQ-s+UK+rIb-%s+1-!s*t&t
+rI+]n!.4Zjs*=Whr-/0as)n6]s)\0[qJlIQr,98dqJH+Gn8%]3o5";@rGDFLrbqdTqf2UUs)\'Z
+rH8*_pilU[om,_Hr-SBiqgJHms*suts+13%rdt9*Kn]M\'o.U$M2@+IMi<USNK0'\OHGZgP*;.0
+Pl[2;rg3_SRf8cWS=TYNs.9:arh9@ds.fRhs/#amr29Rnri,dpri?"!qQ9_!ric1&riuL/r3QF1
+s0_g6s0i!<rji'?!5&6Cs1LS0^V@S"_8=(,`5KX6`lH0Aai_fMbg"GYcd:(edaQ^qe^i@(f\,!4
+gYCW@hV[5Ki8N\Uj5f=`k2tjjkl0fJlKdd8m/QGQmelPRnGi%Uo)81Xo^qhPpA+ISq"smaqXsa_
+r;-BYrdk*#s6'E4~>
+JcC<$JcD&9nG`@arVZKgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!Us6fpSr9XILs6BRIs60IFrT=+@
+s5a+<s5O(;r8@V4s5*_1s4dV/rS%;)!8.;&s4.2#rm^ts'%51Td*U+acHXVXbKJ&MaN2EArl$5&
+_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-XK/A$WMofo!N)^mU]I6brh0CdT:c+S!hGjO
+rgWqV!1EeQ!gf4=rK[DIs-*DEs,m>CrK$u=s,Hu9s,6l6rJCQ1s+gQ-s+UK+rIb-%s+1-!s*t&t
+rI+]n!.4Zjs*=Whr-/0as)n6]s)\0[qJlIQr,98dqJH+Gn8%]3o5";@rGDFLrbqdTqf2UUs)\'Z
+rH8*_pilU[om,_Hr-SBiqgJHms*suts+13%rdt9*Kn]M\'o.U$M2@+IMi<USNK0'\OHGZgP*;.0
+Pl[2;rg3_SRf8cWS=TYNs.9:arh9@ds.fRhs/#amr29Rnri,dpri?"!qQ9_!ric1&riuL/r3QF1
+s0_g6s0i!<rji'?!5&6Cs1LS0^V@S"_8=(,`5KX6`lH0Aai_fMbg"GYcd:(edaQ^qe^i@(f\,!4
+gYCW@hV[5Ki8N\Uj5f=`k2tjjkl0fJlKdd8m/QGQmelPRnGi%Uo)81Xo^qhPpA+ISq"smaqXsa_
+r;-BYrdk*#s6'E4~>
+JcC<$JcD#8nc&FarVZKgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!UrpKgRrTsRMrp'IHs60IFrT=+@
+s5a+<s5O(;r8@V4s5*_1s4dV/rS%;)!8.;&s4.2#rmUttdf.Vpd*M^:-I'cXbK@rKaN2EA`Pod5
+_SX.)^V@Lr]Y(kf\[f5Z[^NTNZa6sBricR0Y-"h-X8]+'WMl_mVP^3hU]I6brh0CdT:c+S!hGjO
+rgWqVs-`kRs-NbOrK[DIs-*DEs,m>CrK$u=s,Hu9repf6rJCQ1s+gQ-s+UK+rIb-%s+1-!!e5ZJ
+rI+]ns*O]js*=WhrHJ6as)n6]rcA'Zq/Q=Oq/>S:j_s[,qec1GiG8@-rGDCKrbqdTr,M^Vrc@sY
+rcS3`qKMj^qg%7Kq0W!dqL/?ls*srss+13%re(6(!/:E,s+^T1reUZ5MuJY9NK4"!!K`HCOqj1F
+Q'IZ$Q^F/.R[T_8S=Q4BStDXJrh9@d!2KLgs.o^mr29Rns/Gmqri?%"qQ9_!rNH(%riuI.r3QF1
+rjD^5s0i!<rOE!@]=\'T'YV5p^V@S"_8=(,`5KX6`lH0AaiaV+*R)dRcHjkbdF-LneCE.%f@\d1
+g=tE=h;7&Ii8N\pis+T+k2tjikl0fJlKdd8m/QGQmeuVRnGi%Uo)A7Yo_.tRpA"CQq"sm`qXsa_
+r;-BZrdk*#s5j92~>
+JcC<$JcD#8nc&FarVZKgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!UrpKgRrTsRMrp'IHs60IFrT=+@
+s5a+<s5O(;r8@V4s5*_1s4dV/rS%;)!8.;&s4.2#rmUttdf.Vpd*M^:-I'cXbK@rKaN2EA`Pod5
+_SX.)^V@Lr]Y(kf\[f5Z[^NTNZa6sBricR0Y-"h-X8]+'WMl_mVP^3hU]I6brh0CdT:c+S!hGjO
+rgWqVs-`kRs-NbOrK[DIs-*DEs,m>CrK$u=s,Hu9repf6rJCQ1s+gQ-s+UK+rIb-%s+1-!!e5ZJ
+rI+]ns*O]js*=WhrHJ6as)n6]rcA'Zq/Q=Oq/>S:j_s[,qec1GiG8@-rGDCKrbqdTr,M^Vrc@sY
+rcS3`qKMj^qg%7Kq0W!dqL/?ls*srss+13%re(6(!/:E,s+^T1reUZ5MuJY9NK4"!!K`HCOqj1F
+Q'IZ$Q^F/.R[T_8S=Q4BStDXJrh9@d!2KLgs.o^mr29Rns/Gmqri?%"qQ9_!rNH(%riuI.r3QF1
+rjD^5s0i!<rOE!@]=\'T'YV5p^V@S"_8=(,`5KX6`lH0AaiaV+*R)dRcHjkbdF-LneCE.%f@\d1
+g=tE=h;7&Ii8N\pis+T+k2tjikl0fJlKdd8m/QGQmeuVRnGi%Uo)A7Yo_.tRpA"CQq"sm`qXsa_
+r;-BZrdk*#s5j92~>
+JcC<$JcD#8nc&FarVZKgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!UrpKgRrTsRMrp'IHs60IFrT=+@
+s5a+<s5O(;r8@V4s5*_1s4dV/rS%;)!8.;&s4.2#rmUttdf.Vpd*M^:-I'cXbK@rKaN2EA`Pod5
+_SX.)^V@Lr]Y(kf\[f5Z[^NTNZa6sBricR0Y-"h-X8]+'WMl_mVP^3hU]I6brh0CdT:c+S!hGjO
+rgWqVs-`kRs-NbOrK[DIs-*DEs,m>CrK$u=s,Hu9repf6rJCQ1s+gQ-s+UK+rIb-%s+1-!!e5ZJ
+rI+]ns*O]js*=WhrHJ6as)n6]rcA'Zq/Q=Oq/>S:j_s[,qec1GiG8@-rGDCKrbqdTr,M^Vrc@sY
+rcS3`qKMj^qg%7Kq0W!dqL/?ls*srss+13%re(6(!/:E,s+^T1reUZ5MuJY9NK4"!!K`HCOqj1F
+Q'IZ$Q^F/.R[T_8S=Q4BStDXJrh9@d!2KLgs.o^mr29Rns/Gmqri?%"qQ9_!rNH(%riuI.r3QF1
+rjD^5s0i!<rOE!@]=\'T'YV5p^V@S"_8=(,`5KX6`lH0AaiaV+*R)dRcHjkbdF-LneCE.%f@\d1
+g=tE=h;7&Ii8N\pis+T+k2tjikl0fJlKdd8m/QGQmeuVRnGi%Uo)A7Yo_.tRpA"CQq"sm`qXsa_
+r;-BZrdk*#s5j92~>
+JcC<$JcD#8nG`@ar;?EgrVHNhr:p9cs7ZB`s7H<^rUU!Yrp]mTs6fpSr9XILs6BOHs60IFr9"%@
+roF%<ro3t:rS[_5s5*_1s4mY/rn@D*!8.;&!nPoPrmUttdf.W<d*L"_c-4DTbK@rJaN)<>`Pf[2
+_SO%&^V7Co]Xtbc\[]-J[L'@KZa6sBYct=6riHR0X/`2!W2QVlVP^3hU]I6brh9@b!2'7^s.01[
+rgWqVs-`kRs-NbOrK[DIs-*DEs,m>CrK$u=rf-l8s,6o7rJCQ1s+gQ-s+UK+rIY0'JV!cMs*t&t
+rI+]n!.4Zjrd"NgrHJ6as)n3\rcA'ZpMotIn8I9)q/>nCqJH%En8%l:r,)7IrbqdTqf2UUs)\'Z
+rcS3`qfi!`r-@jZmsFhWpO3!hrdXlsrdk*$re(6(s+UH,#D\+kM2@+IMuJY9NK4"!$BUC5P*;,p
+Q'IZ%rg3_SRf8cWS=TYN#G7Z^TqS3TU]$tiV5C-gVuN^qWVidqX8f9tXo5F%YPGF%Z2M!*Zi@E3
+[JdQ6\,Wu:\c95@]DfJC]`>eG^F[1:_8=(,`5KX6`lH0Aai_cLbKS5VcHjkbdF-LneCE.%f@\d1
+g=tE=h;7&gi!&*!j5]4^roO7Ekl0iHl2^/Lm/QJQmf)\SnGi%Vo)A7Zo_8%SpA+IPq"jg`qXj[^
+r;-BYrdk*#s5a31~>
+JcC<$JcD#8nG`@ar;?EgrVHNhr:p9cs7ZB`s7H<^rUU!Yrp]mTs6fpSr9XILs6BOHs60IFr9"%@
+roF%<ro3t:rS[_5s5*_1s4mY/rn@D*!8.;&!nPoPrmUttdf.W<d*L"_c-4DTbK@rJaN)<>`Pf[2
+_SO%&^V7Co]Xtbc\[]-J[L'@KZa6sBYct=6riHR0X/`2!W2QVlVP^3hU]I6brh9@b!2'7^s.01[
+rgWqVs-`kRs-NbOrK[DIs-*DEs,m>CrK$u=rf-l8s,6o7rJCQ1s+gQ-s+UK+rIY0'JV!cMs*t&t
+rI+]n!.4Zjrd"NgrHJ6as)n3\rcA'ZpMotIn8I9)q/>nCqJH%En8%l:r,)7IrbqdTqf2UUs)\'Z
+rcS3`qfi!`r-@jZmsFhWpO3!hrdXlsrdk*$re(6(s+UH,#D\+kM2@+IMuJY9NK4"!$BUC5P*;,p
+Q'IZ%rg3_SRf8cWS=TYN#G7Z^TqS3TU]$tiV5C-gVuN^qWVidqX8f9tXo5F%YPGF%Z2M!*Zi@E3
+[JdQ6\,Wu:\c95@]DfJC]`>eG^F[1:_8=(,`5KX6`lH0Aai_cLbKS5VcHjkbdF-LneCE.%f@\d1
+g=tE=h;7&gi!&*!j5]4^roO7Ekl0iHl2^/Lm/QJQmf)\SnGi%Vo)A7Zo_8%SpA+IPq"jg`qXj[^
+r;-BYrdk*#s5a31~>
+JcC<$JcD#8nG`@ar;?EgrVHNhr:p9cs7ZB`s7H<^rUU!Yrp]mTs6fpSr9XILs6BOHs60IFr9"%@
+roF%<ro3t:rS[_5s5*_1s4mY/rn@D*!8.;&!nPoPrmUttdf.W<d*L"_c-4DTbK@rJaN)<>`Pf[2
+_SO%&^V7Co]Xtbc\[]-J[L'@KZa6sBYct=6riHR0X/`2!W2QVlVP^3hU]I6brh9@b!2'7^s.01[
+rgWqVs-`kRs-NbOrK[DIs-*DEs,m>CrK$u=rf-l8s,6o7rJCQ1s+gQ-s+UK+rIY0'JV!cMs*t&t
+rI+]n!.4Zjrd"NgrHJ6as)n3\rcA'ZpMotIn8I9)q/>nCqJH%En8%l:r,)7IrbqdTqf2UUs)\'Z
+rcS3`qfi!`r-@jZmsFhWpO3!hrdXlsrdk*$re(6(s+UH,#D\+kM2@+IMuJY9NK4"!$BUC5P*;,p
+Q'IZ%rg3_SRf8cWS=TYN#G7Z^TqS3TU]$tiV5C-gVuN^qWVidqX8f9tXo5F%YPGF%Z2M!*Zi@E3
+[JdQ6\,Wu:\c95@]DfJC]`>eG^F[1:_8=(,`5KX6`lH0Aai_cLbKS5VcHjkbdF-LneCE.%f@\d1
+g=tE=h;7&gi!&*!j5]4^roO7Ekl0iHl2^/Lm/QJQmf)\SnGi%Vo)A7Zo_8%SpA+IPq"jg`qXj[^
+r;-BYrdk*#s5a31~>
+JcC<$JcCu7nG`@ar;?EgrqcWiqtU0bs7ZB`s7H<^rUU!Yrp]mTs6fmRrTsOLs6BOHs60IFr9"%@
+roF%<ro3t:rS[_5s5*_1s4dV/rRq>+f\$2T!S5g#e-=CMda?Ihci23:c-4ASb/q`Ga2Z*;`5KR1
+_SO%&^V7Co]Xtbc\[],W[^EKKZa-k8YR7S:Xf\\*X/`2!W;`[rVPU-gU]I6brh9@bs.B:^!hGjO
+rL3kWR@4#@s-NbOrK[DIs-*DEs,m>Cr/^l<s,Hu9s,6o7rJCQ1s+gQ-s+LH+rIb-%s+1-!!e5ZJ
+rI+]ns*O]js*=TgrHJ6arcS*[rH%pX_K#Bjqeu.FphfJ9qJH"FrbqdTqf2UUrcA!ZrcS3`qfi$a
+rH\-`pj;OYn9t4`rdXfqs+13%rIb-'s+UH,s+^T1reV2DMi3OQNK0$[O-#KdP*2#nrfn%\Q^F/.
+R@9V7S=Q4BStDXJrh0@eU]$tiV5C-hVuN^qWVrjrX8f9uXo5F%YPGF%Z2M!)Zi7?2[J[K5\,Wu:
+\c95@]D]AD]tV5[^B)-drk\lW`5KX6`lJ)"(!4VAbKS5VcHjkbdF-LneCE.%f@\dUg)/T"h;-rF
+i8ESRj5]4]jlY^gkNM0plK[^7m/QJQmf)\SnGi%Vo)A7[o_8%UpA+IOq"jg_qXj[]r;-BYrdk*#
+s5X-0~>
+JcC<$JcCu7nG`@ar;?EgrqcWiqtU0bs7ZB`s7H<^rUU!Yrp]mTs6fmRrTsOLs6BOHs60IFr9"%@
+roF%<ro3t:rS[_5s5*_1s4dV/rRq>+f\$2T!S5g#e-=CMda?Ihci23:c-4ASb/q`Ga2Z*;`5KR1
+_SO%&^V7Co]Xtbc\[],W[^EKKZa-k8YR7S:Xf\\*X/`2!W;`[rVPU-gU]I6brh9@bs.B:^!hGjO
+rL3kWR@4#@s-NbOrK[DIs-*DEs,m>Cr/^l<s,Hu9s,6o7rJCQ1s+gQ-s+LH+rIb-%s+1-!!e5ZJ
+rI+]ns*O]js*=TgrHJ6arcS*[rH%pX_K#Bjqeu.FphfJ9qJH"FrbqdTqf2UUrcA!ZrcS3`qfi$a
+rH\-`pj;OYn9t4`rdXfqs+13%rIb-'s+UH,s+^T1reV2DMi3OQNK0$[O-#KdP*2#nrfn%\Q^F/.
+R@9V7S=Q4BStDXJrh0@eU]$tiV5C-hVuN^qWVrjrX8f9uXo5F%YPGF%Z2M!)Zi7?2[J[K5\,Wu:
+\c95@]D]AD]tV5[^B)-drk\lW`5KX6`lJ)"(!4VAbKS5VcHjkbdF-LneCE.%f@\dUg)/T"h;-rF
+i8ESRj5]4]jlY^gkNM0plK[^7m/QJQmf)\SnGi%Vo)A7[o_8%UpA+IOq"jg_qXj[]r;-BYrdk*#
+s5X-0~>
+JcC<$JcCu7nG`@ar;?EgrqcWiqtU0bs7ZB`s7H<^rUU!Yrp]mTs6fmRrTsOLs6BOHs60IFr9"%@
+roF%<ro3t:rS[_5s5*_1s4dV/rRq>+f\$2T!S5g#e-=CMda?Ihci23:c-4ASb/q`Ga2Z*;`5KR1
+_SO%&^V7Co]Xtbc\[],W[^EKKZa-k8YR7S:Xf\\*X/`2!W;`[rVPU-gU]I6brh9@bs.B:^!hGjO
+rL3kWR@4#@s-NbOrK[DIs-*DEs,m>Cr/^l<s,Hu9s,6o7rJCQ1s+gQ-s+LH+rIb-%s+1-!!e5ZJ
+rI+]ns*O]js*=TgrHJ6arcS*[rH%pX_K#Bjqeu.FphfJ9qJH"FrbqdTqf2UUrcA!ZrcS3`qfi$a
+rH\-`pj;OYn9t4`rdXfqs+13%rIb-'s+UH,s+^T1reV2DMi3OQNK0$[O-#KdP*2#nrfn%\Q^F/.
+R@9V7S=Q4BStDXJrh0@eU]$tiV5C-hVuN^qWVrjrX8f9uXo5F%YPGF%Z2M!)Zi7?2[J[K5\,Wu:
+\c95@]D]AD]tV5[^B)-drk\lW`5KX6`lJ)"(!4VAbKS5VcHjkbdF-LneCE.%f@\dUg)/T"h;-rF
+i8ESRj5]4]jlY^gkNM0plK[^7m/QJQmf)\SnGi%Vo)A7[o_8%UpA+IOq"jg_qXj[]r;-BYrdk*#
+s5X-0~>
+JcC<$JcCu7nG`=`rVZKgrqcWiqtU3crq?9_s7H<^rUTsXs7#sTs6fpSr9XILrp'FGs60IFr9""?
+s5a+<s5O(;rS[_5s5*_1s4dV/rRqM0f\"g-f%/CNe,e%Hrm<(>cd'h\bfe2Pb/q`Ga2Z*;`5BI/
+_8*h#^:h1l]=PP`\@8oT[C#q>"gYD;Yck5/XT>N(ri-!uW;`[rVPU-gU]R<cUAghfTV%kUT)YA]
+SGo#XRfAfSR/`NQQMm*KPlHsGP5g[EOSk1>NrP+;N;nh9MZ&D3L]E5/LAuu-K`-N)Jq8LOJH(-!
+If4]pI/eQlHN/9jGl)^bG5cX[FT$:WEl)hnE;OSEDXVH8DZ+MQE;OYSErL.XFT-F^G5HL_GlE!a
+HM`'bI-#eRIf4cmJGt-"K)L?%K`?c*LB!&/M#W>3M?&S6Mueourf7)AOoCLNPE_>tQBml)R$jEB
+RfT%Mrgj._T`1VdU8+L_U]RBiVZ*LnW;ijrWrB(!XSf4"Y5YX$Yl1j*ZMCj+[/RK1[f<i:\GWo;
+\cBA@]`5YF^AbnI^];4M_?%Qmrl"oXa8X.-ai_fMbg"GYcd:%ddF-LneCE.%f@\d1g=tE=h;7&I
+i8N\Tj5]4^roO7Ekl0fJlKdd8liQSBmeuVSnGi%Wo)A7Zo_J1WpA4OPq"aa]qXaU\r;-BYrdk*#
+s5O'/~>
+JcC<$JcCu7nG`=`rVZKgrqcWiqtU3crq?9_s7H<^rUTsXs7#sTs6fpSr9XILrp'FGs60IFr9""?
+s5a+<s5O(;rS[_5s5*_1s4dV/rRqM0f\"g-f%/CNe,e%Hrm<(>cd'h\bfe2Pb/q`Ga2Z*;`5BI/
+_8*h#^:h1l]=PP`\@8oT[C#q>"gYD;Yck5/XT>N(ri-!uW;`[rVPU-gU]R<cUAghfTV%kUT)YA]
+SGo#XRfAfSR/`NQQMm*KPlHsGP5g[EOSk1>NrP+;N;nh9MZ&D3L]E5/LAuu-K`-N)Jq8LOJH(-!
+If4]pI/eQlHN/9jGl)^bG5cX[FT$:WEl)hnE;OSEDXVH8DZ+MQE;OYSErL.XFT-F^G5HL_GlE!a
+HM`'bI-#eRIf4cmJGt-"K)L?%K`?c*LB!&/M#W>3M?&S6Mueourf7)AOoCLNPE_>tQBml)R$jEB
+RfT%Mrgj._T`1VdU8+L_U]RBiVZ*LnW;ijrWrB(!XSf4"Y5YX$Yl1j*ZMCj+[/RK1[f<i:\GWo;
+\cBA@]`5YF^AbnI^];4M_?%Qmrl"oXa8X.-ai_fMbg"GYcd:%ddF-LneCE.%f@\d1g=tE=h;7&I
+i8N\Tj5]4^roO7Ekl0fJlKdd8liQSBmeuVSnGi%Wo)A7Zo_J1WpA4OPq"aa]qXaU\r;-BYrdk*#
+s5O'/~>
+JcC<$JcCu7nG`=`rVZKgrqcWiqtU3crq?9_s7H<^rUTsXs7#sTs6fpSr9XILrp'FGs60IFr9""?
+s5a+<s5O(;rS[_5s5*_1s4dV/rRqM0f\"g-f%/CNe,e%Hrm<(>cd'h\bfe2Pb/q`Ga2Z*;`5BI/
+_8*h#^:h1l]=PP`\@8oT[C#q>"gYD;Yck5/XT>N(ri-!uW;`[rVPU-gU]R<cUAghfTV%kUT)YA]
+SGo#XRfAfSR/`NQQMm*KPlHsGP5g[EOSk1>NrP+;N;nh9MZ&D3L]E5/LAuu-K`-N)Jq8LOJH(-!
+If4]pI/eQlHN/9jGl)^bG5cX[FT$:WEl)hnE;OSEDXVH8DZ+MQE;OYSErL.XFT-F^G5HL_GlE!a
+HM`'bI-#eRIf4cmJGt-"K)L?%K`?c*LB!&/M#W>3M?&S6Mueourf7)AOoCLNPE_>tQBml)R$jEB
+RfT%Mrgj._T`1VdU8+L_U]RBiVZ*LnW;ijrWrB(!XSf4"Y5YX$Yl1j*ZMCj+[/RK1[f<i:\GWo;
+\cBA@]`5YF^AbnI^];4M_?%Qmrl"oXa8X.-ai_fMbg"GYcd:%ddF-LneCE.%f@\d1g=tE=h;7&I
+i8N\Tj5]4^roO7Ekl0fJlKdd8liQSBmeuVSnGi%Wo)A7Zo_J1WpA4OPq"aa]qXaU\r;-BYrdk*#
+s5O'/~>
+JcC<$JcCr6nG`@ar;?EgrVHNhqtU3crq?9_rq-6^r:9mXs7#sTrpKgRr9XILrp'FGrojCFr9""?
+s5a+<s5O%:rS[_5!8d\1s4dV/rn@D*!8.;&.+Zr!eC;sqda?Ihcd'h\c-4ASb/q`Ga2Z*;`5BI/
+_8*h#^:h1l]=S!P$+RIQ[^EKKZa-k8YQ:r1riH4&X8]+"WMofo!iDfjrhKUjU8%X\s.KCargs.\
+s.'(Xs-itUrL!VOs-EVKs-3MHrK@2Cs,d2?s,R,=rJ^c7s,-f4s+p]1rJ(?+s+LB(s+:9%rI=s!
+IX_6Ds*Xinr-JBgrcn?brc\6_piQ@Ric=d7oQ'PCr,DLNherC2rG_UQrc8$[qfMj\rc\0_rcnEf
+qKi*er-[gYoR?Xdpji?ps+:0$s+LE+rItB/Lku%e#E"FtN/WaUNrG(HOHG]hPEV5rQ'Rd9Qk5[S
+S"#q<SXuFFTV/!PU8"F^U]RBiVZ*IpW2ZcpWrK."XSo:#Y5YX%Yl1j*ZMLp+[/IE0[f3c9\GWo;
+])TD@]`5YF^AYeO^qmk(_Sa:0rl"oXa8X-`ai_fMbg$.4&^ShOdF-LneCE.%f@\d1g=tE^h%\`'
+i8ESRj5]4^jlY^gkih9qlK[^7liQSBmeuSSnG_tVo)A7[o_S7YpA4OPq"X[\qXXO[r;$<Xrdk*#
+s5F!.~>
+JcC<$JcCr6nG`@ar;?EgrVHNhqtU3crq?9_rq-6^r:9mXs7#sTrpKgRr9XILrp'FGrojCFr9""?
+s5a+<s5O%:rS[_5!8d\1s4dV/rn@D*!8.;&.+Zr!eC;sqda?Ihcd'h\c-4ASb/q`Ga2Z*;`5BI/
+_8*h#^:h1l]=S!P$+RIQ[^EKKZa-k8YQ:r1riH4&X8]+"WMofo!iDfjrhKUjU8%X\s.KCargs.\
+s.'(Xs-itUrL!VOs-EVKs-3MHrK@2Cs,d2?s,R,=rJ^c7s,-f4s+p]1rJ(?+s+LB(s+:9%rI=s!
+IX_6Ds*Xinr-JBgrcn?brc\6_piQ@Ric=d7oQ'PCr,DLNherC2rG_UQrc8$[qfMj\rc\0_rcnEf
+qKi*er-[gYoR?Xdpji?ps+:0$s+LE+rItB/Lku%e#E"FtN/WaUNrG(HOHG]hPEV5rQ'Rd9Qk5[S
+S"#q<SXuFFTV/!PU8"F^U]RBiVZ*IpW2ZcpWrK."XSo:#Y5YX%Yl1j*ZMLp+[/IE0[f3c9\GWo;
+])TD@]`5YF^AYeO^qmk(_Sa:0rl"oXa8X-`ai_fMbg$.4&^ShOdF-LneCE.%f@\d1g=tE^h%\`'
+i8ESRj5]4^jlY^gkih9qlK[^7liQSBmeuSSnG_tVo)A7[o_S7YpA4OPq"X[\qXXO[r;$<Xrdk*#
+s5F!.~>
+JcC<$JcCr6nG`@ar;?EgrVHNhqtU3crq?9_rq-6^r:9mXs7#sTrpKgRr9XILrp'FGrojCFr9""?
+s5a+<s5O%:rS[_5!8d\1s4dV/rn@D*!8.;&.+Zr!eC;sqda?Ihcd'h\c-4ASb/q`Ga2Z*;`5BI/
+_8*h#^:h1l]=S!P$+RIQ[^EKKZa-k8YQ:r1riH4&X8]+"WMofo!iDfjrhKUjU8%X\s.KCargs.\
+s.'(Xs-itUrL!VOs-EVKs-3MHrK@2Cs,d2?s,R,=rJ^c7s,-f4s+p]1rJ(?+s+LB(s+:9%rI=s!
+IX_6Ds*Xinr-JBgrcn?brc\6_piQ@Ric=d7oQ'PCr,DLNherC2rG_UQrc8$[qfMj\rc\0_rcnEf
+qKi*er-[gYoR?Xdpji?ps+:0$s+LE+rItB/Lku%e#E"FtN/WaUNrG(HOHG]hPEV5rQ'Rd9Qk5[S
+S"#q<SXuFFTV/!PU8"F^U]RBiVZ*IpW2ZcpWrK."XSo:#Y5YX%Yl1j*ZMLp+[/IE0[f3c9\GWo;
+])TD@]`5YF^AYeO^qmk(_Sa:0rl"oXa8X-`ai_fMbg$.4&^ShOdF-LneCE.%f@\d1g=tE^h%\`'
+i8ESRj5]4^jlY^gkih9qlK[^7liQSBmeuSSnG_tVo)A7[o_S7YpA4OPq"X[\qXXO[r;$<Xrdk*#
+s5F!.~>
+JcC<$JcCr6nG`=`rVZKgrqcThr:p9crq?9_rq-6^r:9mXrp]jSs6fmRr9XILrp'FGroj@Er9"%@
+roF%<ro3t:rSRb7hVS4e!o2Pbrn8[Of\"g-f%/C$eC2mpdF$=ecd'h\bfe2PaiMQD`l5p8_ns:,
+_#D(X^:h1l]=PP`\@8oT[C#q>&@/RFYck44Xf\\*X/`2!WMofo!iDfjrhTRh!2BFc!hc0XrLX%[
+!1a"Ws-itUrL!VOs-ESJs-3PIrK@2Cs,d2?s,R,=rJ^c7!/g`3s+p]1reCH,s+L?'!ePuSrIFot
+s*jops*Xinr-JBgrcn<arHA-^noX5>mWA/DqJu:LqJc:Lm;Dc=rG_RPrc8!Zr,hp\s*"9`s*4Ng
+qKi-frI"9domZF\omm!lrdt$"s+LE+rItB/Lku%es,$f7req5ENfK0]OHGZgP*;.0PmWhDR$a;0
+R[]e:Sc52]T:l1W!MZ@gU]RBiVZ*IpW2ZcqWrK."XSo:$Y5YX%Yl:p,ZMCj*[/IE/[f3c8\GWo:
+])TD@]`5\F^AbnI^];4M_?.Wn`;[^V`lJ)"'$8;>bKS5UcHab_dF$CkeC<%"rmqV3g"P07gtgfC
+hr*GOir7sBjQ5OdkND(.klL)8rp9[P!:KgSs7$'YrUTsZs7H0\r:^$^nG)eSq"jRYq>C'eli)J8
+JcF[.J,~>
+JcC<$JcCr6nG`=`rVZKgrqcThr:p9crq?9_rq-6^r:9mXrp]jSs6fmRr9XILrp'FGroj@Er9"%@
+roF%<ro3t:rSRb7hVS4e!o2Pbrn8[Of\"g-f%/C$eC2mpdF$=ecd'h\bfe2PaiMQD`l5p8_ns:,
+_#D(X^:h1l]=PP`\@8oT[C#q>&@/RFYck44Xf\\*X/`2!WMofo!iDfjrhTRh!2BFc!hc0XrLX%[
+!1a"Ws-itUrL!VOs-ESJs-3PIrK@2Cs,d2?s,R,=rJ^c7!/g`3s+p]1reCH,s+L?'!ePuSrIFot
+s*jops*Xinr-JBgrcn<arHA-^noX5>mWA/DqJu:LqJc:Lm;Dc=rG_RPrc8!Zr,hp\s*"9`s*4Ng
+qKi-frI"9domZF\omm!lrdt$"s+LE+rItB/Lku%es,$f7req5ENfK0]OHGZgP*;.0PmWhDR$a;0
+R[]e:Sc52]T:l1W!MZ@gU]RBiVZ*IpW2ZcqWrK."XSo:$Y5YX%Yl:p,ZMCj*[/IE/[f3c8\GWo:
+])TD@]`5\F^AbnI^];4M_?.Wn`;[^V`lJ)"'$8;>bKS5UcHab_dF$CkeC<%"rmqV3g"P07gtgfC
+hr*GOir7sBjQ5OdkND(.klL)8rp9[P!:KgSs7$'YrUTsZs7H0\r:^$^nG)eSq"jRYq>C'eli)J8
+JcF[.J,~>
+JcC<$JcCr6nG`=`rVZKgrqcThr:p9crq?9_rq-6^r:9mXrp]jSs6fmRr9XILrp'FGroj@Er9"%@
+roF%<ro3t:rSRb7hVS4e!o2Pbrn8[Of\"g-f%/C$eC2mpdF$=ecd'h\bfe2PaiMQD`l5p8_ns:,
+_#D(X^:h1l]=PP`\@8oT[C#q>&@/RFYck44Xf\\*X/`2!WMofo!iDfjrhTRh!2BFc!hc0XrLX%[
+!1a"Ws-itUrL!VOs-ESJs-3PIrK@2Cs,d2?s,R,=rJ^c7!/g`3s+p]1reCH,s+L?'!ePuSrIFot
+s*jops*Xinr-JBgrcn<arHA-^noX5>mWA/DqJu:LqJc:Lm;Dc=rG_RPrc8!Zr,hp\s*"9`s*4Ng
+qKi-frI"9domZF\omm!lrdt$"s+LE+rItB/Lku%es,$f7req5ENfK0]OHGZgP*;.0PmWhDR$a;0
+R[]e:Sc52]T:l1W!MZ@gU]RBiVZ*IpW2ZcqWrK."XSo:$Y5YX%Yl:p,ZMCj*[/IE/[f3c8\GWo:
+])TD@]`5\F^AbnI^];4M_?.Wn`;[^V`lJ)"'$8;>bKS5UcHab_dF$CkeC<%"rmqV3g"P07gtgfC
+hr*GOir7sBjQ5OdkND(.klL)8rp9[P!:KgSs7$'YrUTsZs7H0\r:^$^nG)eSq"jRYq>C'eli)J8
+JcF[.J,~>
+JcC<$JcCo5nG`=`rVZKgrVHNhqtU3crq?9_rq-6^r:9jWs7#sTrpKdQr9XFKs6BLGs60IFr9""?
+s5a+<s5O(;rSRb7hVS4e!o2Pbrn7D+f`'J'f%'cL!RoKrd0\1GcHa\YbKJ&Mrl>hp`l5p8_ns:,
+^q[Xu]tD"i]",A]\,NfC[C!9HZE^[=Yck5/XTtr.X/`2!WMofos/#dmrM0LiU8%X\s.KCarLX%[
+s.'%Ws-itUrL!VOs-EVKs-3PIrK@2Cs,d2?s,R,=rf$l8s,-c3s+gZ1rJ(?+!/1<'s+:9%rIFot
+s*jops*Xinr-J?frcn9`rHA'\`H:rtqf;CMq/Gb?qJc7MrGqmYr,hp\rc\3`rcnHgqg/6grI"Eh
+qL80gk^`S^rIXlus+LE+r.Y9.Lku"d#E"FtN/WaUNrG(?OHKO*$Bp^>Q'R`&R$a;1rgOIhSXuFF
+T:hmOU8+KZUnsobrhfgrWN#lss/Q.$rN6+&ric7(riuI.qQp1.r3cC0rO;d9qml^;s1A3As1SHH
+rkJKK!5\WN#K+Ku`Poj:a8X.3ai_fMbfn>WcHjkbdF-LmeC<%"f@S[.g=k<:h;-rFhr*GOioB([
+jlPXekNMp0!p]+;rp0^RmdC)Cs7$'YrUU![rq-'[rV$0`nbDkSp\OFWq>C'eli)J8JcFX-J,~>
+JcC<$JcCo5nG`=`rVZKgrVHNhqtU3crq?9_rq-6^r:9jWs7#sTrpKdQr9XFKs6BLGs60IFr9""?
+s5a+<s5O(;rSRb7hVS4e!o2Pbrn7D+f`'J'f%'cL!RoKrd0\1GcHa\YbKJ&Mrl>hp`l5p8_ns:,
+^q[Xu]tD"i]",A]\,NfC[C!9HZE^[=Yck5/XTtr.X/`2!WMofos/#dmrM0LiU8%X\s.KCarLX%[
+s.'%Ws-itUrL!VOs-EVKs-3PIrK@2Cs,d2?s,R,=rf$l8s,-c3s+gZ1rJ(?+!/1<'s+:9%rIFot
+s*jops*Xinr-J?frcn9`rHA'\`H:rtqf;CMq/Gb?qJc7MrGqmYr,hp\rc\3`rcnHgqg/6grI"Eh
+qL80gk^`S^rIXlus+LE+r.Y9.Lku"d#E"FtN/WaUNrG(?OHKO*$Bp^>Q'R`&R$a;1rgOIhSXuFF
+T:hmOU8+KZUnsobrhfgrWN#lss/Q.$rN6+&ric7(riuI.qQp1.r3cC0rO;d9qml^;s1A3As1SHH
+rkJKK!5\WN#K+Ku`Poj:a8X.3ai_fMbfn>WcHjkbdF-LmeC<%"f@S[.g=k<:h;-rFhr*GOioB([
+jlPXekNMp0!p]+;rp0^RmdC)Cs7$'YrUU![rq-'[rV$0`nbDkSp\OFWq>C'eli)J8JcFX-J,~>
+JcC<$JcCo5nG`=`rVZKgrVHNhqtU3crq?9_rq-6^r:9jWs7#sTrpKdQr9XFKs6BLGs60IFr9""?
+s5a+<s5O(;rSRb7hVS4e!o2Pbrn7D+f`'J'f%'cL!RoKrd0\1GcHa\YbKJ&Mrl>hp`l5p8_ns:,
+^q[Xu]tD"i]",A]\,NfC[C!9HZE^[=Yck5/XTtr.X/`2!WMofos/#dmrM0LiU8%X\s.KCarLX%[
+s.'%Ws-itUrL!VOs-EVKs-3PIrK@2Cs,d2?s,R,=rf$l8s,-c3s+gZ1rJ(?+!/1<'s+:9%rIFot
+s*jops*Xinr-J?frcn9`rHA'\`H:rtqf;CMq/Gb?qJc7MrGqmYr,hp\rc\3`rcnHgqg/6grI"Eh
+qL80gk^`S^rIXlus+LE+r.Y9.Lku"d#E"FtN/WaUNrG(?OHKO*$Bp^>Q'R`&R$a;1rgOIhSXuFF
+T:hmOU8+KZUnsobrhfgrWN#lss/Q.$rN6+&ric7(riuI.qQp1.r3cC0rO;d9qml^;s1A3As1SHH
+rkJKK!5\WN#K+Ku`Poj:a8X.3ai_fMbfn>WcHjkbdF-LmeC<%"f@S[.g=k<:h;-rFhr*GOioB([
+jlPXekNMp0!p]+;rp0^RmdC)Cs7$'YrUU![rq-'[rV$0`nbDkSp\OFWq>C'eli)J8JcFX-J,~>
+JcC<$JcCo5n,E4_rVZKgrVHNhqtU0bs7Z?_s7H<^r:9mXrp]jSrpKdQr9XFKrp'FGroj@Er9"%@
+roF%<s5O(;rSRb7hVS7fs4dV/rn@D*/(iJ*f%/C$eC2mpdF$=ecHa\Ybfe2PaiMQD`l5p8_ns:,
+^q[Xu]tD"i])K5D\@8oT[C#q>!OB!0YQ:r1riHF,X/i8#WMuiqVuNXoV>d:jUB%%eU&UecTDbA]
+Sc>5YS,\rWRJiNQQiEBMQ2d*KPPp[EOoLOAO8k4?NW"h9MuS\6M>rD3L]3&.L&Zi*KE$Q'Jc1-!
+J,aurIK"WoHi&-gH2`'`GPZL/Fn9_PF8L"MEUIf>EW'qVF8L(ZFoHR^GQ)jdH2N!fHiAEhIJeQk
+J*2@WJbt&qKDpQ'L&Hc+L]<2/M#rQmMuJYHNK0$[O-#HcP*2#mPa.N"Qi<?ZR@9V7S=Q4BStD\T
+T`Lm_rhKRkVZ*IpW2ZcqWWK6&XSo:$Y5b^(Yl:p-ZMLp,[/IE.[f*]6\GNi9])K>>]`5\F^AYhH
+_#M7M_Z.LR`;[^e`lH-@aN;QHbKJ,Rc-FV\d/ME!daQ^qe^i@(f\-8X$/=7kh;7&Ii8N\pisXr0
+k2tjikiq?slKeH9!q#FDrpTmVs7-'Ys7?6^qt9p]rV,pYpA+IZn,)qYq>KUXJcC<$hZ&*~>
+JcC<$JcCo5n,E4_rVZKgrVHNhqtU0bs7Z?_s7H<^r:9mXrp]jSrpKdQr9XFKrp'FGroj@Er9"%@
+roF%<s5O(;rSRb7hVS7fs4dV/rn@D*/(iJ*f%/C$eC2mpdF$=ecHa\Ybfe2PaiMQD`l5p8_ns:,
+^q[Xu]tD"i])K5D\@8oT[C#q>!OB!0YQ:r1riHF,X/i8#WMuiqVuNXoV>d:jUB%%eU&UecTDbA]
+Sc>5YS,\rWRJiNQQiEBMQ2d*KPPp[EOoLOAO8k4?NW"h9MuS\6M>rD3L]3&.L&Zi*KE$Q'Jc1-!
+J,aurIK"WoHi&-gH2`'`GPZL/Fn9_PF8L"MEUIf>EW'qVF8L(ZFoHR^GQ)jdH2N!fHiAEhIJeQk
+J*2@WJbt&qKDpQ'L&Hc+L]<2/M#rQmMuJYHNK0$[O-#HcP*2#mPa.N"Qi<?ZR@9V7S=Q4BStD\T
+T`Lm_rhKRkVZ*IpW2ZcqWWK6&XSo:$Y5b^(Yl:p-ZMLp,[/IE.[f*]6\GNi9])K>>]`5\F^AYhH
+_#M7M_Z.LR`;[^e`lH-@aN;QHbKJ,Rc-FV\d/ME!daQ^qe^i@(f\-8X$/=7kh;7&Ii8N\pisXr0
+k2tjikiq?slKeH9!q#FDrpTmVs7-'Ys7?6^qt9p]rV,pYpA+IZn,)qYq>KUXJcC<$hZ&*~>
+JcC<$JcCo5n,E4_rVZKgrVHNhqtU0bs7Z?_s7H<^r:9mXrp]jSrpKdQr9XFKrp'FGroj@Er9"%@
+roF%<s5O(;rSRb7hVS7fs4dV/rn@D*/(iJ*f%/C$eC2mpdF$=ecHa\Ybfe2PaiMQD`l5p8_ns:,
+^q[Xu]tD"i])K5D\@8oT[C#q>!OB!0YQ:r1riHF,X/i8#WMuiqVuNXoV>d:jUB%%eU&UecTDbA]
+Sc>5YS,\rWRJiNQQiEBMQ2d*KPPp[EOoLOAO8k4?NW"h9MuS\6M>rD3L]3&.L&Zi*KE$Q'Jc1-!
+J,aurIK"WoHi&-gH2`'`GPZL/Fn9_PF8L"MEUIf>EW'qVF8L(ZFoHR^GQ)jdH2N!fHiAEhIJeQk
+J*2@WJbt&qKDpQ'L&Hc+L]<2/M#rQmMuJYHNK0$[O-#HcP*2#mPa.N"Qi<?ZR@9V7S=Q4BStD\T
+T`Lm_rhKRkVZ*IpW2ZcqWWK6&XSo:$Y5b^(Yl:p-ZMLp,[/IE.[f*]6\GNi9])K>>]`5\F^AYhH
+_#M7M_Z.LR`;[^e`lH-@aN;QHbKJ,Rc-FV\d/ME!daQ^qe^i@(f\-8X$/=7kh;7&Ii8N\pisXr0
+k2tjikiq?slKeH9!q#FDrpTmVs7-'Ys7?6^qt9p]rV,pYpA+IZn,)qYq>KUXJcC<$hZ&*~>
+JcC<$JcCl4n,E7`r;?BfrqcThqtU0bs7Z?_s7H<^r:9jWrp]jSrpKdQr9XFKrp'CFrojCFr9""?
+s5a.=s5O(;rSRb7hVS7f!o2Pbrn7D+f`'J'f%'cL"k1oIdEp5=c5t6SbKJ&MaN2EA`Pod5_SX.)
+^V@Ls]tD"i]",A]\,NfD[C!9HZEga>Yck75riH7'X/l6"!i`,srhfgpV5=-d!i)KarLs7as.B7]
+s.01[rL<hUs-`hQs-NbOrK[DIs-*DEs,m>Crf@)>s,Hu9!fMqnrJCQ1!/LN-s+LH+rIb-%s+1-!
+s*t&tr-eTmrd4Ngrd"EdoQS]+q/uCQqfDXTiGnd9rH%jXrcS3`r-/-bs*=Kfrd4ZmqL/?lr."?h
+nq$Icp4N<sre:9)s+gW1rJ:T5Mi7Rns,@#=rf7)AOoCLEPEc'3$C7$GR$jA2S"#q=rgj[nTV8'R
+USFW\V5C,fVl6Pnri-%#XK;E's/uC*rNQ=,rj)I.rj;X3qR6@3rOD[6rjr'?r4N'CrkA?Gs1nZN
+rke]Q!6"iT!QN1Za:$,4b0.uPbg"GYcd;[="k(lLeCE.Lf*U*_g=k<:h;-rFrnmt=ioB([jo4BC
+kNMp0!UB"Mm/QGQmf)\TnGi%Wo)J=\o_eC\pAOaXq"OUXqX47Vr:p6Urdk*#s5!^*~>
+JcC<$JcCl4n,E7`r;?BfrqcThqtU0bs7Z?_s7H<^r:9jWrp]jSrpKdQr9XFKrp'CFrojCFr9""?
+s5a.=s5O(;rSRb7hVS7f!o2Pbrn7D+f`'J'f%'cL"k1oIdEp5=c5t6SbKJ&MaN2EA`Pod5_SX.)
+^V@Ls]tD"i]",A]\,NfD[C!9HZEga>Yck75riH7'X/l6"!i`,srhfgpV5=-d!i)KarLs7as.B7]
+s.01[rL<hUs-`hQs-NbOrK[DIs-*DEs,m>Crf@)>s,Hu9!fMqnrJCQ1!/LN-s+LH+rIb-%s+1-!
+s*t&tr-eTmrd4Ngrd"EdoQS]+q/uCQqfDXTiGnd9rH%jXrcS3`r-/-bs*=Kfrd4ZmqL/?lr."?h
+nq$Icp4N<sre:9)s+gW1rJ:T5Mi7Rns,@#=rf7)AOoCLEPEc'3$C7$GR$jA2S"#q=rgj[nTV8'R
+USFW\V5C,fVl6Pnri-%#XK;E's/uC*rNQ=,rj)I.rj;X3qR6@3rOD[6rjr'?r4N'CrkA?Gs1nZN
+rke]Q!6"iT!QN1Za:$,4b0.uPbg"GYcd;[="k(lLeCE.Lf*U*_g=k<:h;-rFrnmt=ioB([jo4BC
+kNMp0!UB"Mm/QGQmf)\TnGi%Wo)J=\o_eC\pAOaXq"OUXqX47Vr:p6Urdk*#s5!^*~>
+JcC<$JcCl4n,E7`r;?BfrqcThqtU0bs7Z?_s7H<^r:9jWrp]jSrpKdQr9XFKrp'CFrojCFr9""?
+s5a.=s5O(;rSRb7hVS7f!o2Pbrn7D+f`'J'f%'cL"k1oIdEp5=c5t6SbKJ&MaN2EA`Pod5_SX.)
+^V@Ls]tD"i]",A]\,NfD[C!9HZEga>Yck75riH7'X/l6"!i`,srhfgpV5=-d!i)KarLs7as.B7]
+s.01[rL<hUs-`hQs-NbOrK[DIs-*DEs,m>Crf@)>s,Hu9!fMqnrJCQ1!/LN-s+LH+rIb-%s+1-!
+s*t&tr-eTmrd4Ngrd"EdoQS]+q/uCQqfDXTiGnd9rH%jXrcS3`r-/-bs*=Kfrd4ZmqL/?lr."?h
+nq$Icp4N<sre:9)s+gW1rJ:T5Mi7Rns,@#=rf7)AOoCLEPEc'3$C7$GR$jA2S"#q=rgj[nTV8'R
+USFW\V5C,fVl6Pnri-%#XK;E's/uC*rNQ=,rj)I.rj;X3qR6@3rOD[6rjr'?r4N'CrkA?Gs1nZN
+rke]Q!6"iT!QN1Za:$,4b0.uPbg"GYcd;[="k(lLeCE.Lf*U*_g=k<:h;-rFrnmt=ioB([jo4BC
+kNMp0!UB"Mm/QGQmf)\TnGi%Wo)J=\o_eC\pAOaXq"OUXqX47Vr:p6Urdk*#s5!^*~>
+JcC<$JcCl4n,E4_r;?BfrqcThqtU0bs7Z?_rq-6^qssaVs7#pSrpKdQqs==Js6BLGroj@ErT=+@
+s5a.=s5O(;ro!h6s5*b2&DZ$pg=k65f[na+f%&:"e'e6C%FEGHcHXSVbK@rJaN)="`=9c'_SX.)
+^V@Lr]Y(kfrj`TM\$i`Q['[0GZE^[=Yck75riH7'X/l6"!i`,srhodns/#^js.fUgrLs7as.B7]
+s.01[rL<hUs-`hQs-NbOrK[DIs-*DEs,m>Crf@)>s,I#:s,6o7re^Z2s+gT.s+UK+rIY0'JV!`L
+s*t&tr-eTmrd4Kfr-A0aa`mT)qfVUSqfDRRno=JGr,_^VrcS3`r-/-brd"Efs*O`mqgJHmrI=Tm
+qLS9jl\#.hrIt-'s+gT0rJCQ3!/pf7#E=b(O,oBaOoCLNPE_>tQBml)R$jEBRgP[VSt;RITV8'R
+U].%iV5F6i!N<!sWrK+"XT#@%Y5b^)YlD!-ZMh-/[/RK0[f*]6\G<]6])B8<]`,VE^APbG_#M7L
+_?.Wn`;[aU`W4'Ya;rCFb0.uPbg"GYcd:%ddF-LneCE+#f@S[.g=k<:rnS:Fhr*GOioB([jQ5Od
+kNM-ol0@U#rp0^RmdC)C!q>aMrUU![rq--]rq?<bpA"FYpA4.Qq#'pcl2H86JcFO*J,~>
+JcC<$JcCl4n,E4_r;?BfrqcThqtU0bs7Z?_rq-6^qssaVs7#pSrpKdQqs==Js6BLGroj@ErT=+@
+s5a.=s5O(;ro!h6s5*b2&DZ$pg=k65f[na+f%&:"e'e6C%FEGHcHXSVbK@rJaN)="`=9c'_SX.)
+^V@Lr]Y(kfrj`TM\$i`Q['[0GZE^[=Yck75riH7'X/l6"!i`,srhodns/#^js.fUgrLs7as.B7]
+s.01[rL<hUs-`hQs-NbOrK[DIs-*DEs,m>Crf@)>s,I#:s,6o7re^Z2s+gT.s+UK+rIY0'JV!`L
+s*t&tr-eTmrd4Kfr-A0aa`mT)qfVUSqfDRRno=JGr,_^VrcS3`r-/-brd"Efs*O`mqgJHmrI=Tm
+qLS9jl\#.hrIt-'s+gT0rJCQ3!/pf7#E=b(O,oBaOoCLNPE_>tQBml)R$jEBRgP[VSt;RITV8'R
+U].%iV5F6i!N<!sWrK+"XT#@%Y5b^)YlD!-ZMh-/[/RK0[f*]6\G<]6])B8<]`,VE^APbG_#M7L
+_?.Wn`;[aU`W4'Ya;rCFb0.uPbg"GYcd:%ddF-LneCE+#f@S[.g=k<:rnS:Fhr*GOioB([jQ5Od
+kNM-ol0@U#rp0^RmdC)C!q>aMrUU![rq--]rq?<bpA"FYpA4.Qq#'pcl2H86JcFO*J,~>
+JcC<$JcCl4n,E4_r;?BfrqcThqtU0bs7Z?_rq-6^qssaVs7#pSrpKdQqs==Js6BLGroj@ErT=+@
+s5a.=s5O(;ro!h6s5*b2&DZ$pg=k65f[na+f%&:"e'e6C%FEGHcHXSVbK@rJaN)="`=9c'_SX.)
+^V@Lr]Y(kfrj`TM\$i`Q['[0GZE^[=Yck75riH7'X/l6"!i`,srhodns/#^js.fUgrLs7as.B7]
+s.01[rL<hUs-`hQs-NbOrK[DIs-*DEs,m>Crf@)>s,I#:s,6o7re^Z2s+gT.s+UK+rIY0'JV!`L
+s*t&tr-eTmrd4Kfr-A0aa`mT)qfVUSqfDRRno=JGr,_^VrcS3`r-/-brd"Efs*O`mqgJHmrI=Tm
+qLS9jl\#.hrIt-'s+gT0rJCQ3!/pf7#E=b(O,oBaOoCLNPE_>tQBml)R$jEBRgP[VSt;RITV8'R
+U].%iV5F6i!N<!sWrK+"XT#@%Y5b^)YlD!-ZMh-/[/RK0[f*]6\G<]6])B8<]`,VE^APbG_#M7L
+_?.Wn`;[aU`W4'Ya;rCFb0.uPbg"GYcd:%ddF-LneCE+#f@S[.g=k<:rnS:Fhr*GOioB([jQ5Od
+kNM-ol0@U#rp0^RmdC)C!q>aMrUU![rq--]rq?<bpA"FYpA4.Qq#'pcl2H86JcFO*J,~>
+JcC<$JcCi3n,E4_rVZHfrqcWiqY:'arq?9_rq-3]r:9jWrp]gRrpKdQqs==Jrp'CFs60IFr9"%@
+s5a.=s5O(;ro!h6!8d_2s4dV/rn7D+f`'JIf%&:"e'lamdEp4bcHXSVbK@rKaN2EA`Pod5_SX.)
+^V@Lrrk&EH]",A]\,Nf:[C#q>!OB!0YlCm,Y5YO)XK/E$WrK$uW;WXoVZ3LlV#R4iUA^ecT`:Y_
+T)YA]SGerVRfAfSR/`KQQMm*KPlHsGP5gXEOSt7?NW>(;MunopMZ&A5LkgcaLAur-K`-Q'K)^E#
+JGt&uIf+WnI/SEeHM`!9Gk-(UG5QLVFSKqKEqsePFT$@]G5QR`GlE!dHN/?kI/JElIf=imJGauq
+K'%^]K`$Q"LB!&.M#E21MZ8V5Muo!!NrG(?OHKO*#*Y:9Q'IZ%rg4apR[]e:S=Q7CT:hmOU8"EY
+UnsrcVl-JmWN)u!X/u<&s/l@*rNQ=,s0DU0s0Vd5qmQL5rOD[6r4;j=qRlg@rkA<Fs1nWMrPAWR
+`5MVn!li:$rl>,^b5TQlbg"DXcHjh`dF$CkrmV,%f%8O+g&B\8gYCW@hV[8LiSrkWj5f>$joOZ/
+rojIKli-5PmI'EAn,MkWnbr%YoD\C[p&=[`p\=OZq=a[NqtU*`rTX<4s+14(s*t~>
+JcC<$JcCi3n,E4_rVZHfrqcWiqY:'arq?9_rq-3]r:9jWrp]gRrpKdQqs==Jrp'CFs60IFr9"%@
+s5a.=s5O(;ro!h6!8d_2s4dV/rn7D+f`'JIf%&:"e'lamdEp4bcHXSVbK@rKaN2EA`Pod5_SX.)
+^V@Lrrk&EH]",A]\,Nf:[C#q>!OB!0YlCm,Y5YO)XK/E$WrK$uW;WXoVZ3LlV#R4iUA^ecT`:Y_
+T)YA]SGerVRfAfSR/`KQQMm*KPlHsGP5gXEOSt7?NW>(;MunopMZ&A5LkgcaLAur-K`-Q'K)^E#
+JGt&uIf+WnI/SEeHM`!9Gk-(UG5QLVFSKqKEqsePFT$@]G5QR`GlE!dHN/?kI/JElIf=imJGauq
+K'%^]K`$Q"LB!&.M#E21MZ8V5Muo!!NrG(?OHKO*#*Y:9Q'IZ%rg4apR[]e:S=Q7CT:hmOU8"EY
+UnsrcVl-JmWN)u!X/u<&s/l@*rNQ=,s0DU0s0Vd5qmQL5rOD[6r4;j=qRlg@rkA<Fs1nWMrPAWR
+`5MVn!li:$rl>,^b5TQlbg"DXcHjh`dF$CkrmV,%f%8O+g&B\8gYCW@hV[8LiSrkWj5f>$joOZ/
+rojIKli-5PmI'EAn,MkWnbr%YoD\C[p&=[`p\=OZq=a[NqtU*`rTX<4s+14(s*t~>
+JcC<$JcCi3n,E4_rVZHfrqcWiqY:'arq?9_rq-3]r:9jWrp]gRrpKdQqs==Jrp'CFs60IFr9"%@
+s5a.=s5O(;ro!h6!8d_2s4dV/rn7D+f`'JIf%&:"e'lamdEp4bcHXSVbK@rKaN2EA`Pod5_SX.)
+^V@Lrrk&EH]",A]\,Nf:[C#q>!OB!0YlCm,Y5YO)XK/E$WrK$uW;WXoVZ3LlV#R4iUA^ecT`:Y_
+T)YA]SGerVRfAfSR/`KQQMm*KPlHsGP5gXEOSt7?NW>(;MunopMZ&A5LkgcaLAur-K`-Q'K)^E#
+JGt&uIf+WnI/SEeHM`!9Gk-(UG5QLVFSKqKEqsePFT$@]G5QR`GlE!dHN/?kI/JElIf=imJGauq
+K'%^]K`$Q"LB!&.M#E21MZ8V5Muo!!NrG(?OHKO*#*Y:9Q'IZ%rg4apR[]e:S=Q7CT:hmOU8"EY
+UnsrcVl-JmWN)u!X/u<&s/l@*rNQ=,s0DU0s0Vd5qmQL5rOD[6r4;j=qRlg@rkA<Fs1nWMrPAWR
+`5MVn!li:$rl>,^b5TQlbg"DXcHjh`dF$CkrmV,%f%8O+g&B\8gYCW@hV[8LiSrkWj5f>$joOZ/
+rojIKli-5PmI'EAn,MkWnbr%YoD\C[p&=[`p\=OZq=a[NqtU*`rTX<4s+14(s*t~>
+JcC<$JcCf2n,E7`r;?BfrVHNhqY:'arq?6^s7H<^qssaVrp]gRrpKdQqX"4Irp'FGrojCFr9"%@
+s5a.=s5O(;rnmk8hVS7f!SlH/g'66_f[na+ec+&:e'cXkd*L"_c-=JUbK@rJaN)<>`Pf[2_SO%e
+^BM?b]Y(kfrj`6C\$i`Q[C#q>!OB!0YlCm,Y5YR'X8o="WWK/uW;WUqVPU-fV#R4iUA^ecT`:Y_
+T)P;\SGerWRfAfSR/`KQQMm*KPlHsHP5g[EOT(=@NrP+<N;nh9MZ/J4M#W80LAuu-K`-Q'K)^E"
+JH(,uIf"QmI/J?`HII08GkQ@ZG5QLPFSKqKFT$@]G5HL_GlE!dHN/?kI/JElIf=ioJGk&tK(FWb
+K_C,oLAco,M#<,0MZ8V5Muo!!NrG(@OHG\)Oo^c2rfmhVQ^F/.R@9V7S=TYN"eVH]Tq\=]U]I<h
+rhfdqWW&muX/u<&s/l@*rNH@.ZEjG8s0Vd5r3lU6rj_d7rOVp=q7Q^?rP&3ErkSQMr5/KO!6"iT
+s2G&ZrlG,]!6Y;a/'Q8_cHab^d*^7he'lgre^i@(f\"m2g=tE=h;7&Hi8ESRj5]4^jlY^gkl0fO
+lKdd&m-X3.rpTmVs7-*Zrq$0^r:U'_rqH3_qYBp_l215Qp\j=TJcC<$g&HR~>
+JcC<$JcCf2n,E7`r;?BfrVHNhqY:'arq?6^s7H<^qssaVrp]gRrpKdQqX"4Irp'FGrojCFr9"%@
+s5a.=s5O(;rnmk8hVS7f!SlH/g'66_f[na+ec+&:e'cXkd*L"_c-=JUbK@rJaN)<>`Pf[2_SO%e
+^BM?b]Y(kfrj`6C\$i`Q[C#q>!OB!0YlCm,Y5YR'X8o="WWK/uW;WUqVPU-fV#R4iUA^ecT`:Y_
+T)P;\SGerWRfAfSR/`KQQMm*KPlHsHP5g[EOT(=@NrP+<N;nh9MZ/J4M#W80LAuu-K`-Q'K)^E"
+JH(,uIf"QmI/J?`HII08GkQ@ZG5QLPFSKqKFT$@]G5HL_GlE!dHN/?kI/JElIf=ioJGk&tK(FWb
+K_C,oLAco,M#<,0MZ8V5Muo!!NrG(@OHG\)Oo^c2rfmhVQ^F/.R@9V7S=TYN"eVH]Tq\=]U]I<h
+rhfdqWW&muX/u<&s/l@*rNH@.ZEjG8s0Vd5r3lU6rj_d7rOVp=q7Q^?rP&3ErkSQMr5/KO!6"iT
+s2G&ZrlG,]!6Y;a/'Q8_cHab^d*^7he'lgre^i@(f\"m2g=tE=h;7&Hi8ESRj5]4^jlY^gkl0fO
+lKdd&m-X3.rpTmVs7-*Zrq$0^r:U'_rqH3_qYBp_l215Qp\j=TJcC<$g&HR~>
+JcC<$JcCf2n,E7`r;?BfrVHNhqY:'arq?6^s7H<^qssaVrp]gRrpKdQqX"4Irp'FGrojCFr9"%@
+s5a.=s5O(;rnmk8hVS7f!SlH/g'66_f[na+ec+&:e'cXkd*L"_c-=JUbK@rJaN)<>`Pf[2_SO%e
+^BM?b]Y(kfrj`6C\$i`Q[C#q>!OB!0YlCm,Y5YR'X8o="WWK/uW;WUqVPU-fV#R4iUA^ecT`:Y_
+T)P;\SGerWRfAfSR/`KQQMm*KPlHsHP5g[EOT(=@NrP+<N;nh9MZ/J4M#W80LAuu-K`-Q'K)^E"
+JH(,uIf"QmI/J?`HII08GkQ@ZG5QLPFSKqKFT$@]G5HL_GlE!dHN/?kI/JElIf=ioJGk&tK(FWb
+K_C,oLAco,M#<,0MZ8V5Muo!!NrG(@OHG\)Oo^c2rfmhVQ^F/.R@9V7S=TYN"eVH]Tq\=]U]I<h
+rhfdqWW&muX/u<&s/l@*rNH@.ZEjG8s0Vd5r3lU6rj_d7rOVp=q7Q^?rP&3ErkSQMr5/KO!6"iT
+s2G&ZrlG,]!6Y;a/'Q8_cHab^d*^7he'lgre^i@(f\"m2g=tE=h;7&Hi8ESRj5]4^jlY^gkl0fO
+lKdd&m-X3.rpTmVs7-*Zrq$0^r:U'_rqH3_qYBp_l215Qp\j=TJcC<$g&HR~>
+JcC<$JcCc1n,E4_rVZHfrqcThqtU0brq?6^rq-3]qssaVrp]dQrpKdQqs==Jrp'CFs60IFrT=.A
+s5a.=s5F%;rSRq<hVR)Egt^Z`g*kY,f@SU)e^W*tda?Ihd*L"_c-4ASb/q`Ga2Z*;`5BL0_SO%&
+^V7D\]F_]d\[f5Z\$i`Q['[0GZEgb7YlCm,Y5YR'XT,@#WrK'uW;`^pVZ3LkV#R4iUA^ecT`1S^
+T)YA]SGerWRfAfSQi`V?QMm*KPlHsHP5gXEOSt7?NW>(;MunopMZ&A5LkgcaLAuu-K`-Q'K)^E"
+JGt&tIenKkI/A96HMVpbGkQ@ZG5?@EFSp:[G5?F^GlE!dHN&9kI/JElIfFopJGk&uK(jonK^sic
+LAZi+M#3&/MZ/P4Muo!!NrG+>O8tFBOtDl^Pa.N"QC!u+R@9S6S"-%@StD[KTqS3UUnji`VPg>j
+WMuntX/rD)Xfeh1rilF-s0DX1s0Vg6r3lU6rj_j9rOVs>pq6R=rP&-CrkSQMr5/KOs2=lTs2P)Z
+rl>/_b0'_,&BrDDcHab^d*^7hdaQ^qe^j`O"k_M^g=tE^h$)Zmi8ESRro4CIjlY^gkNM0plK[^7
+liQSBmf)YVnF?&Io)J=]o_eC]pAXg^q"sm_qW[nMr:g0Qrdk*#s4I@%~>
+JcC<$JcCc1n,E4_rVZHfrqcThqtU0brq?6^rq-3]qssaVrp]dQrpKdQqs==Jrp'CFs60IFrT=.A
+s5a.=s5F%;rSRq<hVR)Egt^Z`g*kY,f@SU)e^W*tda?Ihd*L"_c-4ASb/q`Ga2Z*;`5BL0_SO%&
+^V7D\]F_]d\[f5Z\$i`Q['[0GZEgb7YlCm,Y5YR'XT,@#WrK'uW;`^pVZ3LkV#R4iUA^ecT`1S^
+T)YA]SGerWRfAfSQi`V?QMm*KPlHsHP5gXEOSt7?NW>(;MunopMZ&A5LkgcaLAuu-K`-Q'K)^E"
+JGt&tIenKkI/A96HMVpbGkQ@ZG5?@EFSp:[G5?F^GlE!dHN&9kI/JElIfFopJGk&uK(jonK^sic
+LAZi+M#3&/MZ/P4Muo!!NrG+>O8tFBOtDl^Pa.N"QC!u+R@9S6S"-%@StD[KTqS3UUnji`VPg>j
+WMuntX/rD)Xfeh1rilF-s0DX1s0Vg6r3lU6rj_j9rOVs>pq6R=rP&-CrkSQMr5/KOs2=lTs2P)Z
+rl>/_b0'_,&BrDDcHab^d*^7hdaQ^qe^j`O"k_M^g=tE^h$)Zmi8ESRro4CIjlY^gkNM0plK[^7
+liQSBmf)YVnF?&Io)J=]o_eC]pAXg^q"sm_qW[nMr:g0Qrdk*#s4I@%~>
+JcC<$JcCc1n,E4_rVZHfrqcThqtU0brq?6^rq-3]qssaVrp]dQrpKdQqs==Jrp'CFs60IFrT=.A
+s5a.=s5F%;rSRq<hVR)Egt^Z`g*kY,f@SU)e^W*tda?Ihd*L"_c-4ASb/q`Ga2Z*;`5BL0_SO%&
+^V7D\]F_]d\[f5Z\$i`Q['[0GZEgb7YlCm,Y5YR'XT,@#WrK'uW;`^pVZ3LkV#R4iUA^ecT`1S^
+T)YA]SGerWRfAfSQi`V?QMm*KPlHsHP5gXEOSt7?NW>(;MunopMZ&A5LkgcaLAuu-K`-Q'K)^E"
+JGt&tIenKkI/A96HMVpbGkQ@ZG5?@EFSp:[G5?F^GlE!dHN&9kI/JElIfFopJGk&uK(jonK^sic
+LAZi+M#3&/MZ/P4Muo!!NrG+>O8tFBOtDl^Pa.N"QC!u+R@9S6S"-%@StD[KTqS3UUnji`VPg>j
+WMuntX/rD)Xfeh1rilF-s0DX1s0Vg6r3lU6rj_j9rOVs>pq6R=rP&-CrkSQMr5/KOs2=lTs2P)Z
+rl>/_b0'_,&BrDDcHab^d*^7hdaQ^qe^j`O"k_M^g=tE^h$)Zmi8ESRro4CIjlY^gkNM0plK[^7
+liQSBmf)YVnF?&Io)J=]o_eC]pAXg^q"sm_qW[nMr:g0Qrdk*#s4I@%~>
+JcC<$JcCc1n,E4_r;??erqcThqtU0brV$-]rq-3]qssaVrp]dQrpKdQqX"4Irp'FGs60IFrT=.A
+s5a.=!oi1tro!h6!8d_2!SlH/g&]mZrmq>)e^W*tdf.W9d*L"_c-4ASb/q`Ga2Z-<`Pf[2_SO%&
+^V7Fq]Y(kfrj`'>\,Nf@[C!<IZa-mArilF+s/u@'s/Z4$rMomss/>mos/,gmrM9Igs.]Ics.KCa
+rLX%[s.'%Ws-itUrL!VO!1*SKs-*MIrK75EOHBI&s,R,=rf$l8s,-f4s+p]1reCH,s+L<&s+:9%
+qgeZqrdOWjqL$nAn9Y"XqfqjZqKD+Gqf_g[rHS<er-J?hs*X`mrdOlsqgeZsrdt!!r.Op#kD&ef
+r.t0*s,-f6rJ^c9s,R)>s,d8Cs-!DG!0mJJ!LB)OQjT7MS"#q<SXuFFT`1VgU8+N[V5F6i!N<!s
+WWB0%riH4(YPtd+Z2_-/Zi@E4[JdQ6\,No7\c02=]D9,;^&>\@^])%J_>M1L_uI[R`W*sXa8X0[
+aT0K_bQ#cdc2Q!"cd:%ddF-IleC<%"f%8O+g&B\/gYCW@hV\=j$K:")j5f=`k2tjjroj[Qlg*p(
+mHs?@n,MkWnbr%YoDeI\p&=[ap\FU^q>'mOqt9m\rTF02s+14%s*t~>
+JcC<$JcCc1n,E4_r;??erqcThqtU0brV$-]rq-3]qssaVrp]dQrpKdQqX"4Irp'FGs60IFrT=.A
+s5a.=!oi1tro!h6!8d_2!SlH/g&]mZrmq>)e^W*tdf.W9d*L"_c-4ASb/q`Ga2Z-<`Pf[2_SO%&
+^V7Fq]Y(kfrj`'>\,Nf@[C!<IZa-mArilF+s/u@'s/Z4$rMomss/>mos/,gmrM9Igs.]Ics.KCa
+rLX%[s.'%Ws-itUrL!VO!1*SKs-*MIrK75EOHBI&s,R,=rf$l8s,-f4s+p]1reCH,s+L<&s+:9%
+qgeZqrdOWjqL$nAn9Y"XqfqjZqKD+Gqf_g[rHS<er-J?hs*X`mrdOlsqgeZsrdt!!r.Op#kD&ef
+r.t0*s,-f6rJ^c9s,R)>s,d8Cs-!DG!0mJJ!LB)OQjT7MS"#q<SXuFFT`1VgU8+N[V5F6i!N<!s
+WWB0%riH4(YPtd+Z2_-/Zi@E4[JdQ6\,No7\c02=]D9,;^&>\@^])%J_>M1L_uI[R`W*sXa8X0[
+aT0K_bQ#cdc2Q!"cd:%ddF-IleC<%"f%8O+g&B\/gYCW@hV\=j$K:")j5f=`k2tjjroj[Qlg*p(
+mHs?@n,MkWnbr%YoDeI\p&=[ap\FU^q>'mOqt9m\rTF02s+14%s*t~>
+JcC<$JcCc1n,E4_r;??erqcThqtU0brV$-]rq-3]qssaVrp]dQrpKdQqX"4Irp'FGs60IFrT=.A
+s5a.=!oi1tro!h6!8d_2!SlH/g&]mZrmq>)e^W*tdf.W9d*L"_c-4ASb/q`Ga2Z-<`Pf[2_SO%&
+^V7Fq]Y(kfrj`'>\,Nf@[C!<IZa-mArilF+s/u@'s/Z4$rMomss/>mos/,gmrM9Igs.]Ics.KCa
+rLX%[s.'%Ws-itUrL!VO!1*SKs-*MIrK75EOHBI&s,R,=rf$l8s,-f4s+p]1reCH,s+L<&s+:9%
+qgeZqrdOWjqL$nAn9Y"XqfqjZqKD+Gqf_g[rHS<er-J?hs*X`mrdOlsqgeZsrdt!!r.Op#kD&ef
+r.t0*s,-f6rJ^c9s,R)>s,d8Cs-!DG!0mJJ!LB)OQjT7MS"#q<SXuFFT`1VgU8+N[V5F6i!N<!s
+WWB0%riH4(YPtd+Z2_-/Zi@E4[JdQ6\,No7\c02=]D9,;^&>\@^])%J_>M1L_uI[R`W*sXa8X0[
+aT0K_bQ#cdc2Q!"cd:%ddF-IleC<%"f%8O+g&B\/gYCW@hV\=j$K:")j5f=`k2tjjroj[Qlg*p(
+mHs?@n,MkWnbr%YoDeI\p&=[ap\FU^q>'mOqt9m\rTF02s+14%s*t~>
+JcC<$JcC`0n,E4_r;??erqcThqY:'arq?6^rq-0\qssaVrUB^QrU0[Pqs==Jrp'FGrojCFrT=.A
+s5a1>s5O(;rnmh7hYu=NgtUT;g=b-2f@SU(eC;srda?Ihcd'h\bfe2Pao9?fa2Z*;`5BI/_8-&b
+$bj<e]Xtee\[f5[\,Nf:[C#q>s0;X0rilF+s/u@'s/c7$rMfpuW2TZms/,dlrM9Igs.]Ics.KCa
+rLX%[s.'%Ws-itUrg<_Ps-EYLs-3PIrf[;Ds,d5@s,I)=rJUf9MMh@hs+gZ1rJ(?+re16&rdt0$
+qgeWprI49bfR3LAp3QX^r-7jXlur,IrHS<eqg/9hrd=WlrdOlsr.+ctrdt$"rIk-'nqQ[ipPAR#
+rJLT4r/CZ8s,R)>s,d8CrfRhVPa%GuQBml)R$jA2S"#q=rgj:cTV8'RU].%rV5C/gW2ZbrWiN6#
+XTGZ/YPta,Z*O>7!joACrO2a8s1&!;rjr'?qRla>rP&'ArP8EKqni?Ms2=iSs2P)ZrlG,]s2t>a
+s3(Jfrlu)$d*U1fdaHUoeCE+#f@S[.rn7_6gtgfChV[8LiSsjs$fpF3k3(pkl07Kuli-5OmI'rA
+!q>aMrpp*\s7H6^s7ZHdq=sm`qtfUToDJ:[k5Kr3JcF=$J,~>
+JcC<$JcC`0n,E4_r;??erqcThqY:'arq?6^rq-0\qssaVrUB^QrU0[Pqs==Jrp'FGrojCFrT=.A
+s5a1>s5O(;rnmh7hYu=NgtUT;g=b-2f@SU(eC;srda?Ihcd'h\bfe2Pao9?fa2Z*;`5BI/_8-&b
+$bj<e]Xtee\[f5[\,Nf:[C#q>s0;X0rilF+s/u@'s/c7$rMfpuW2TZms/,dlrM9Igs.]Ics.KCa
+rLX%[s.'%Ws-itUrg<_Ps-EYLs-3PIrf[;Ds,d5@s,I)=rJUf9MMh@hs+gZ1rJ(?+re16&rdt0$
+qgeWprI49bfR3LAp3QX^r-7jXlur,IrHS<eqg/9hrd=WlrdOlsr.+ctrdt$"rIk-'nqQ[ipPAR#
+rJLT4r/CZ8s,R)>s,d8CrfRhVPa%GuQBml)R$jA2S"#q=rgj:cTV8'RU].%rV5C/gW2ZbrWiN6#
+XTGZ/YPta,Z*O>7!joACrO2a8s1&!;rjr'?qRla>rP&'ArP8EKqni?Ms2=iSs2P)ZrlG,]s2t>a
+s3(Jfrlu)$d*U1fdaHUoeCE+#f@S[.rn7_6gtgfChV[8LiSsjs$fpF3k3(pkl07Kuli-5OmI'rA
+!q>aMrpp*\s7H6^s7ZHdq=sm`qtfUToDJ:[k5Kr3JcF=$J,~>
+JcC<$JcC`0n,E4_r;??erqcThqY:'arq?6^rq-0\qssaVrUB^QrU0[Pqs==Jrp'FGrojCFrT=.A
+s5a1>s5O(;rnmh7hYu=NgtUT;g=b-2f@SU(eC;srda?Ihcd'h\bfe2Pao9?fa2Z*;`5BI/_8-&b
+$bj<e]Xtee\[f5[\,Nf:[C#q>s0;X0rilF+s/u@'s/c7$rMfpuW2TZms/,dlrM9Igs.]Ics.KCa
+rLX%[s.'%Ws-itUrg<_Ps-EYLs-3PIrf[;Ds,d5@s,I)=rJUf9MMh@hs+gZ1rJ(?+re16&rdt0$
+qgeWprI49bfR3LAp3QX^r-7jXlur,IrHS<eqg/9hrd=WlrdOlsr.+ctrdt$"rIk-'nqQ[ipPAR#
+rJLT4r/CZ8s,R)>s,d8CrfRhVPa%GuQBml)R$jA2S"#q=rgj:cTV8'RU].%rV5C/gW2ZbrWiN6#
+XTGZ/YPta,Z*O>7!joACrO2a8s1&!;rjr'?qRla>rP&'ArP8EKqni?Ms2=iSs2P)ZrlG,]s2t>a
+s3(Jfrlu)$d*U1fdaHUoeCE+#f@S[.rn7_6gtgfChV[8LiSsjs$fpF3k3(pkl07Kuli-5OmI'rA
+!q>aMrpp*\s7H6^s7ZHdq=sm`qtfUToDJ:[k5Kr3JcF=$J,~>
+JcC<$JcC`0mf*+^r;?BfrVHKgqY:'arq?3]rq-3]qXXUTrp]dQrpKaPqs==Jrp'FGs60LGrT=.A
+s5a1>s5F%;rnn@FhVR)Egt^Z<g=b03f@SU(rmV8'da?Ihcd'h\bl5clb/q`Ga2Z*;`5DSk&Ac/s
+^V7Cp]Y(kf]",A]\$u@F!O]<6Zi@?2Z2V!-Y5ka(XoGL&X8T'uWW/pqVuNXoV>[4iU]7(eU&Uec
+TDbA]Sc>5YS,\rWRJrTRQiEBNQ2d'KPPpXGOcY\(O8k7?NW+n:MuS\6M>rD3L])u-L&Zi(KDpK%
+JbjopJ,=]?IJS?gHhVjaH2DjFGPudbH2DpeHiAEjIK+cqJ,FirJcC?!KDpQ&L%pDuL[g2hM>W81
+Mu/J5NW5%;O8k=AOoCODP5pjHPl[2;rg3_SRf8ciS=Q7CT:_dMTq\<XUnsobVl-Jmri-1'XKAV-
+Y-7i/!jT&:rj)[5[C-"Bs0r$<r42g<s1A-?rOr0DpqQaBrPA?IrkncSr5JZTs2Y)Z!m/U-rQ>8d
+c-?75!RK-ldJqW)e'umte^i@(f\+s3g=tE^h$W#ri8ESRioB([jo4BCkNMp0!UB"MliQSBmf)YV
+nF?&IncJFTo_eC^pAXg_q#'sbqX"+Nr:KsLrdk*#s4%(!~>
+JcC<$JcC`0mf*+^r;?BfrVHKgqY:'arq?3]rq-3]qXXUTrp]dQrpKaPqs==Jrp'FGs60LGrT=.A
+s5a1>s5F%;rnn@FhVR)Egt^Z<g=b03f@SU(rmV8'da?Ihcd'h\bl5clb/q`Ga2Z*;`5DSk&Ac/s
+^V7Cp]Y(kf]",A]\$u@F!O]<6Zi@?2Z2V!-Y5ka(XoGL&X8T'uWW/pqVuNXoV>[4iU]7(eU&Uec
+TDbA]Sc>5YS,\rWRJrTRQiEBNQ2d'KPPpXGOcY\(O8k7?NW+n:MuS\6M>rD3L])u-L&Zi(KDpK%
+JbjopJ,=]?IJS?gHhVjaH2DjFGPudbH2DpeHiAEjIK+cqJ,FirJcC?!KDpQ&L%pDuL[g2hM>W81
+Mu/J5NW5%;O8k=AOoCODP5pjHPl[2;rg3_SRf8ciS=Q7CT:_dMTq\<XUnsobVl-Jmri-1'XKAV-
+Y-7i/!jT&:rj)[5[C-"Bs0r$<r42g<s1A-?rOr0DpqQaBrPA?IrkncSr5JZTs2Y)Z!m/U-rQ>8d
+c-?75!RK-ldJqW)e'umte^i@(f\+s3g=tE^h$W#ri8ESRioB([jo4BCkNMp0!UB"MliQSBmf)YV
+nF?&IncJFTo_eC^pAXg_q#'sbqX"+Nr:KsLrdk*#s4%(!~>
+JcC<$JcC`0mf*+^r;?BfrVHKgqY:'arq?3]rq-3]qXXUTrp]dQrpKaPqs==Jrp'FGs60LGrT=.A
+s5a1>s5F%;rnn@FhVR)Egt^Z<g=b03f@SU(rmV8'da?Ihcd'h\bl5clb/q`Ga2Z*;`5DSk&Ac/s
+^V7Cp]Y(kf]",A]\$u@F!O]<6Zi@?2Z2V!-Y5ka(XoGL&X8T'uWW/pqVuNXoV>[4iU]7(eU&Uec
+TDbA]Sc>5YS,\rWRJrTRQiEBNQ2d'KPPpXGOcY\(O8k7?NW+n:MuS\6M>rD3L])u-L&Zi(KDpK%
+JbjopJ,=]?IJS?gHhVjaH2DjFGPudbH2DpeHiAEjIK+cqJ,FirJcC?!KDpQ&L%pDuL[g2hM>W81
+Mu/J5NW5%;O8k=AOoCODP5pjHPl[2;rg3_SRf8ciS=Q7CT:_dMTq\<XUnsobVl-Jmri-1'XKAV-
+Y-7i/!jT&:rj)[5[C-"Bs0r$<r42g<s1A-?rOr0DpqQaBrPA?IrkncSr5JZTs2Y)Z!m/U-rQ>8d
+c-?75!RK-ldJqW)e'umte^i@(f\+s3g=tE^h$W#ri8ESRioB([jo4BCkNMp0!UB"MliQSBmf)YV
+nF?&IncJFTo_eC^pAXg_q#'sbqX"+Nr:KsLrdk*#s4%(!~>
+JcC<$JcC]/mf*+^r;??erqcThqY:$`rq?3]rq-3]qXXUTrp]aPrpKdQqs==Jrp'FGs60LGrT41C
+jQ-=#s5O(;s5<q7!8d_2!SlH/g()fgf@SU)e^W*tda?Ihci22rc-4ASb/q`Ga2\+t"iS<q_SO%e
+^B)'^rk&9D])K5A\@8sH[K<kD[/RB5ZE^\6YlCp,Y5PL&XT,@"WrK'uW;WXoVZ3LkV#I.hUA^ec
+T`:Y`T)YA]SGerWRK/cSQi`V?QMm'MP`q=1P5gXEOSt4ANfB%sMunopMZ&D3M#W8/LAuu,K`$K%
+K)L8qJGF]JIdqjaI/J?cHM`!`Gk-(TGl2j`HN&9jI/JElIfFoqJH(3"K)C9#K`6]$LAZi(LusQi
+MYrD/N;eh9Nr>%=OT1IBP5g^GPl?sJQ2m9NQjT7MS"#q<SXuFFT`1VgU8+N[V5F6i$E0r(WiN5&
+Xf\b0ricI/ZEjJ9!joACrjMj9s1&$<s183Ar4N!ArkA0Br4r9Ipqm$Jrl"]Qs2P)Zr5eo[s2t>a
+s3(Jfrm(Pi!7:_ms3_S0eC<%!f%8O+f\,!4gY:N>h;7&gi"4l,j5]4]jlY^gkih9qlK[^7liHMA
+rpTmVs7-*Zs7?9_rUp0`rqH<br;$9emJHJPoDRbLJcC<$eGk%~>
+JcC<$JcC]/mf*+^r;??erqcThqY:$`rq?3]rq-3]qXXUTrp]aPrpKdQqs==Jrp'FGs60LGrT41C
+jQ-=#s5O(;s5<q7!8d_2!SlH/g()fgf@SU)e^W*tda?Ihci22rc-4ASb/q`Ga2\+t"iS<q_SO%e
+^B)'^rk&9D])K5A\@8sH[K<kD[/RB5ZE^\6YlCp,Y5PL&XT,@"WrK'uW;WXoVZ3LkV#I.hUA^ec
+T`:Y`T)YA]SGerWRK/cSQi`V?QMm'MP`q=1P5gXEOSt4ANfB%sMunopMZ&D3M#W8/LAuu,K`$K%
+K)L8qJGF]JIdqjaI/J?cHM`!`Gk-(TGl2j`HN&9jI/JElIfFoqJH(3"K)C9#K`6]$LAZi(LusQi
+MYrD/N;eh9Nr>%=OT1IBP5g^GPl?sJQ2m9NQjT7MS"#q<SXuFFT`1VgU8+N[V5F6i$E0r(WiN5&
+Xf\b0ricI/ZEjJ9!joACrjMj9s1&$<s183Ar4N!ArkA0Br4r9Ipqm$Jrl"]Qs2P)Zr5eo[s2t>a
+s3(Jfrm(Pi!7:_ms3_S0eC<%!f%8O+f\,!4gY:N>h;7&gi"4l,j5]4]jlY^gkih9qlK[^7liHMA
+rpTmVs7-*Zs7?9_rUp0`rqH<br;$9emJHJPoDRbLJcC<$eGk%~>
+JcC<$JcC]/mf*+^r;??erqcThqY:$`rq?3]rq-3]qXXUTrp]aPrpKdQqs==Jrp'FGs60LGrT41C
+jQ-=#s5O(;s5<q7!8d_2!SlH/g()fgf@SU)e^W*tda?Ihci22rc-4ASb/q`Ga2\+t"iS<q_SO%e
+^B)'^rk&9D])K5A\@8sH[K<kD[/RB5ZE^\6YlCp,Y5PL&XT,@"WrK'uW;WXoVZ3LkV#I.hUA^ec
+T`:Y`T)YA]SGerWRK/cSQi`V?QMm'MP`q=1P5gXEOSt4ANfB%sMunopMZ&D3M#W8/LAuu,K`$K%
+K)L8qJGF]JIdqjaI/J?cHM`!`Gk-(TGl2j`HN&9jI/JElIfFoqJH(3"K)C9#K`6]$LAZi(LusQi
+MYrD/N;eh9Nr>%=OT1IBP5g^GPl?sJQ2m9NQjT7MS"#q<SXuFFT`1VgU8+N[V5F6i$E0r(WiN5&
+Xf\b0ricI/ZEjJ9!joACrjMj9s1&$<s183Ar4N!ArkA0Br4r9Ipqm$Jrl"]Qs2P)Zr5eo[s2t>a
+s3(Jfrm(Pi!7:_ms3_S0eC<%!f%8O+f\,!4gY:N>h;7&gi"4l,j5]4]jlY^gkih9qlK[^7liHMA
+rpTmVs7-*Zs7?9_rUp0`rqH<br;$9emJHJPoDRbLJcC<$eGk%~>
+JcC<$JcCZ.mf*+^r;??erVHNhq=ss`rV$-]rUg*\q==OTrUB[PrU0[Pqs=@Krp'FGs60LGroX7B
+s5a1>s5F%;rnmh7hYu=8gtUT;g=b-Xf.,A%eC;sqdF$=fcd'h\bfe2PaiMQDa2Z*;`5BI/_83q%
+^V7Cp]Y(kg])K5A\@8sH[K<kD[/RE3Z2h0.YlCp,Y5PL&XT,@"WrK'uW;WXoVZ3LjV#R4iUA^ec
+T`:Y`T)YA]SGeoYR[KTCR/`NQQN!0LPQ6pGOogc-OT(=@NrP+<N;nh9MZ&D3M#W8/LAlo+K_pE#
+K)L8hJD>YMIeJ3gI/J?bHMDdZGklX[HN&9iI/JElIfFoqJGt-"K)C9#K`6]&LAco+M"->lMYN,(
+N;eh9Nr4t<OT1IAP5g^GPl?sJQ2m9NQj/tIR[]e:Sc52oT:hmOU8+KZUnsrdVl6SoWiE,$riHC-
+YHY79Z*OA8!joACrjMj9!4`!<s186Br4N$BrkA3CrP8?Ipqm!IrP\TPrl4rXrQ+u[s2t>as31Mf
+rm(Pi!7:_m#L_)MeC<%!f)F83f\,!4gY:N>h;7&Hi8ESRro4%?jo4BCkNMp0!UB"MliQSBmf)YV
+nF?&Jo)J=]o_nI^pAam`q#1$dqXFCQr:9gHrdk*#s3^js~>
+JcC<$JcCZ.mf*+^r;??erVHNhq=ss`rV$-]rUg*\q==OTrUB[PrU0[Pqs=@Krp'FGs60LGroX7B
+s5a1>s5F%;rnmh7hYu=8gtUT;g=b-Xf.,A%eC;sqdF$=fcd'h\bfe2PaiMQDa2Z*;`5BI/_83q%
+^V7Cp]Y(kg])K5A\@8sH[K<kD[/RE3Z2h0.YlCp,Y5PL&XT,@"WrK'uW;WXoVZ3LjV#R4iUA^ec
+T`:Y`T)YA]SGeoYR[KTCR/`NQQN!0LPQ6pGOogc-OT(=@NrP+<N;nh9MZ&D3M#W8/LAlo+K_pE#
+K)L8hJD>YMIeJ3gI/J?bHMDdZGklX[HN&9iI/JElIfFoqJGt-"K)C9#K`6]&LAco+M"->lMYN,(
+N;eh9Nr4t<OT1IAP5g^GPl?sJQ2m9NQj/tIR[]e:Sc52oT:hmOU8+KZUnsrdVl6SoWiE,$riHC-
+YHY79Z*OA8!joACrjMj9!4`!<s186Br4N$BrkA3CrP8?Ipqm!IrP\TPrl4rXrQ+u[s2t>as31Mf
+rm(Pi!7:_m#L_)MeC<%!f)F83f\,!4gY:N>h;7&Hi8ESRro4%?jo4BCkNMp0!UB"MliQSBmf)YV
+nF?&Jo)J=]o_nI^pAam`q#1$dqXFCQr:9gHrdk*#s3^js~>
+JcC<$JcCZ.mf*+^r;??erVHNhq=ss`rV$-]rUg*\q==OTrUB[PrU0[Pqs=@Krp'FGs60LGroX7B
+s5a1>s5F%;rnmh7hYu=8gtUT;g=b-Xf.,A%eC;sqdF$=fcd'h\bfe2PaiMQDa2Z*;`5BI/_83q%
+^V7Cp]Y(kg])K5A\@8sH[K<kD[/RE3Z2h0.YlCp,Y5PL&XT,@"WrK'uW;WXoVZ3LjV#R4iUA^ec
+T`:Y`T)YA]SGeoYR[KTCR/`NQQN!0LPQ6pGOogc-OT(=@NrP+<N;nh9MZ&D3M#W8/LAlo+K_pE#
+K)L8hJD>YMIeJ3gI/J?bHMDdZGklX[HN&9iI/JElIfFoqJGt-"K)C9#K`6]&LAco+M"->lMYN,(
+N;eh9Nr4t<OT1IAP5g^GPl?sJQ2m9NQj/tIR[]e:Sc52oT:hmOU8+KZUnsrdVl6SoWiE,$riHC-
+YHY79Z*OA8!joACrjMj9!4`!<s186Br4N$BrkA3CrP8?Ipqm!IrP\TPrl4rXrQ+u[s2t>as31Mf
+rm(Pi!7:_m#L_)MeC<%!f)F83f\,!4gY:N>h;7&Hi8ESRro4%?jo4BCkNMp0!UB"MliQSBmf)YV
+nF?&Jo)J=]o_nI^pAam`q#1$dqXFCQr:9gHrdk*#s3^js~>
+JcC<$JcCW-mf*+^r;??erVHKgqY:$`rq?3]rUg'[qXXUTrUB[PrpKdQqs==Js6BRIroa@FrT=.A
+!9F.>s5F%;ro!h6'&MI#gt^Z<g=b-2f@SU(eC;sqrm;P/cd'h\bfe2PaiVWFa2Z*;`5BL0_SO%e
+^B)'^rk&<E]"7mO!k>_KrjDm9[']h=s0D[0rNQ=*s/u=&s/c7$rMomss/>jns/,gmrM9Igs.]Ic
+s.KCargs.\s.'(Xs-itUrg<_P!1*VLs-3PIrf[;D!0I/?!fi8"rJ^c7!/g]2s+p]1r.b3)re1-#
+r.=`qd=D(Cr-nBgr-\Ehh0T$HrI"Kjs*jrsr.+furdt'#s+LB*qhG**reU?+q24g&m#:k%rf6l:
+rfI/BrK@2E!0mGI#F:^CR$a;0Rf8c`S=Q7CT:_dMTq\=]U^j5uVl-JmWiE,#XKAV-YPta,Z*OA8
+s0Md6rjDm;\@DLJ!kQ"Ur4N'CrkA6DrP8BJpqlsHr5AHNrl4rXr5eo[s2t8_!mJp6rQYJjd*Vd>
+#L_)MeC<%!f)F8%f\-8X!ScE/h&>/-i8ESQioB([jlPXekNM-ol0@U#m-O-,mf)\Tn,W"WncJFT
+o_eC^pAam`q#:*eqXXOTr:0aFrdk*#s3CXp~>
+JcC<$JcCW-mf*+^r;??erVHKgqY:$`rq?3]rUg'[qXXUTrUB[PrpKdQqs==Js6BRIroa@FrT=.A
+!9F.>s5F%;ro!h6'&MI#gt^Z<g=b-2f@SU(eC;sqrm;P/cd'h\bfe2PaiVWFa2Z*;`5BL0_SO%e
+^B)'^rk&<E]"7mO!k>_KrjDm9[']h=s0D[0rNQ=*s/u=&s/c7$rMomss/>jns/,gmrM9Igs.]Ic
+s.KCargs.\s.'(Xs-itUrg<_P!1*VLs-3PIrf[;D!0I/?!fi8"rJ^c7!/g]2s+p]1r.b3)re1-#
+r.=`qd=D(Cr-nBgr-\Ehh0T$HrI"Kjs*jrsr.+furdt'#s+LB*qhG**reU?+q24g&m#:k%rf6l:
+rfI/BrK@2E!0mGI#F:^CR$a;0Rf8c`S=Q7CT:_dMTq\=]U^j5uVl-JmWiE,#XKAV-YPta,Z*OA8
+s0Md6rjDm;\@DLJ!kQ"Ur4N'CrkA6DrP8BJpqlsHr5AHNrl4rXr5eo[s2t8_!mJp6rQYJjd*Vd>
+#L_)MeC<%!f)F8%f\-8X!ScE/h&>/-i8ESQioB([jlPXekNM-ol0@U#m-O-,mf)\Tn,W"WncJFT
+o_eC^pAam`q#:*eqXXOTr:0aFrdk*#s3CXp~>
+JcC<$JcCW-mf*+^r;??erVHKgqY:$`rq?3]rUg'[qXXUTrUB[PrpKdQqs==Js6BRIroa@FrT=.A
+!9F.>s5F%;ro!h6'&MI#gt^Z<g=b-2f@SU(eC;sqrm;P/cd'h\bfe2PaiVWFa2Z*;`5BL0_SO%e
+^B)'^rk&<E]"7mO!k>_KrjDm9[']h=s0D[0rNQ=*s/u=&s/c7$rMomss/>jns/,gmrM9Igs.]Ic
+s.KCargs.\s.'(Xs-itUrg<_P!1*VLs-3PIrf[;D!0I/?!fi8"rJ^c7!/g]2s+p]1r.b3)re1-#
+r.=`qd=D(Cr-nBgr-\Ehh0T$HrI"Kjs*jrsr.+furdt'#s+LB*qhG**reU?+q24g&m#:k%rf6l:
+rfI/BrK@2E!0mGI#F:^CR$a;0Rf8c`S=Q7CT:_dMTq\=]U^j5uVl-JmWiE,#XKAV-YPta,Z*OA8
+s0Md6rjDm;\@DLJ!kQ"Ur4N'CrkA6DrP8BJpqlsHr5AHNrl4rXr5eo[s2t8_!mJp6rQYJjd*Vd>
+#L_)MeC<%!f)F8%f\-8X!ScE/h&>/-i8ESQioB([jlPXekNM-ol0@U#m-O-,mf)\Tn,W"WncJFT
+o_eC^pAam`q#:*eqXXOTr:0aFrdk*#s3CXp~>
+JcC<$JcCW-mf*+^qu$6drVHKgqY:$`rV$*\rUg'[q==LSrp]aPrpKdQr9XFKs6BRIs60LGrT41C
+jQ-=#!oi1trnmh7hYu=<gtUQ:g"G$0f@JLOe-XUPdF$=ecHa\YrlYJfaiMQD`r<p]`5BI/_83qd
+^B)'^rk&<E]"7mO!k>_KrjMj7!4;^2s0D[0rNQ=*s/u=&s/c7$r2Tdrs/>mos/,gmrM9Igs.]Ic
+s.B@arLX%[!1a"W!h,OFrg<_Ps-EYL!gJn4rf[;Ds,d5@s,R,=rf$l8s,-`2s+p]1qhG*(rIjot
+pO_1OnppXfr-nEhr-\?fm!APUrI"HirdOirr.+furdt*$re1<*qhG**reUE-r/1B0k)B+qqi:N6
+rfI/BrK@2Es-3JI!g]1>rg3_SRf8c\S=Q4BStD\TT`q0cUnjiarhfpuWN)u!XT#=0Y-5(6Z*CU@
+Za@*IrjDm;\@DOKs186BrOi0DrkA<FrkSKKpqlsHr5ABLrl4oWr5elZs2t8_s3(JfrQbGh!7:_m
+s3^nrrm^tu!7q/$!SH*)g&]s`rnRV3hu;OFiSrnXjQ,Fbk3(pkl07Kuli-5PmI'EAmfN"Knc&+Z
+oDeI]p&Fabp\Xabq>C*\qt0gVrS[[+s+13ps*t~>
+JcC<$JcCW-mf*+^qu$6drVHKgqY:$`rV$*\rUg'[q==LSrp]aPrpKdQr9XFKs6BRIs60LGrT41C
+jQ-=#!oi1trnmh7hYu=<gtUQ:g"G$0f@JLOe-XUPdF$=ecHa\YrlYJfaiMQD`r<p]`5BI/_83qd
+^B)'^rk&<E]"7mO!k>_KrjMj7!4;^2s0D[0rNQ=*s/u=&s/c7$r2Tdrs/>mos/,gmrM9Igs.]Ic
+s.B@arLX%[!1a"W!h,OFrg<_Ps-EYL!gJn4rf[;Ds,d5@s,R,=rf$l8s,-`2s+p]1qhG*(rIjot
+pO_1OnppXfr-nEhr-\?fm!APUrI"HirdOirr.+furdt*$re1<*qhG**reUE-r/1B0k)B+qqi:N6
+rfI/BrK@2Es-3JI!g]1>rg3_SRf8c\S=Q4BStD\TT`q0cUnjiarhfpuWN)u!XT#=0Y-5(6Z*CU@
+Za@*IrjDm;\@DOKs186BrOi0DrkA<FrkSKKpqlsHr5ABLrl4oWr5elZs2t8_s3(JfrQbGh!7:_m
+s3^nrrm^tu!7q/$!SH*)g&]s`rnRV3hu;OFiSrnXjQ,Fbk3(pkl07Kuli-5PmI'EAmfN"Knc&+Z
+oDeI]p&Fabp\Xabq>C*\qt0gVrS[[+s+13ps*t~>
+JcC<$JcCW-mf*+^qu$6drVHKgqY:$`rV$*\rUg'[q==LSrp]aPrpKdQr9XFKs6BRIs60LGrT41C
+jQ-=#!oi1trnmh7hYu=<gtUQ:g"G$0f@JLOe-XUPdF$=ecHa\YrlYJfaiMQD`r<p]`5BI/_83qd
+^B)'^rk&<E]"7mO!k>_KrjMj7!4;^2s0D[0rNQ=*s/u=&s/c7$r2Tdrs/>mos/,gmrM9Igs.]Ic
+s.B@arLX%[!1a"W!h,OFrg<_Ps-EYL!gJn4rf[;Ds,d5@s,R,=rf$l8s,-`2s+p]1qhG*(rIjot
+pO_1OnppXfr-nEhr-\?fm!APUrI"HirdOirr.+furdt*$re1<*qhG**reUE-r/1B0k)B+qqi:N6
+rfI/BrK@2Es-3JI!g]1>rg3_SRf8c\S=Q4BStD\TT`q0cUnjiarhfpuWN)u!XT#=0Y-5(6Z*CU@
+Za@*IrjDm;\@DOKs186BrOi0DrkA<FrkSKKpqlsHr5ABLrl4oWr5elZs2t8_s3(JfrQbGh!7:_m
+s3^nrrm^tu!7q/$!SH*)g&]s`rnRV3hu;OFiSrnXjQ,Fbk3(pkl07Kuli-5PmI'EAmfN"Knc&+Z
+oDeI]p&Fabp\Xabq>C*\qt0gVrS[[+s+13ps*t~>
+JcC<$JcCT,mf*+^qu$6drVHKgq=sp_rV$*\rUg'[q""FSrUB[PrpKdQr9XFKs6BRIs60LGroX7B
+!9F.>s5F%;rnmh7hYu=3gtVh^"khP[f@JLOe0<AidF$=ecHa\Zbfe2PaiMQDa2Z*;`5BL0_SO%'
+^V@Lr^&GYG]=PTQ\H9:M\,Ni9[K!W4Zi@?2Z2Lp,YQ(d(XoGL%X8T'uWW/pqVuNXoV>[4iU]7(e
+T`UmZTDb>_SXc5LS,\rWRJrQTQ^3s:Q2d'KPPpXGOcY\'Nrk?$NW"h9MuS\4M>i>2L\cc(L&?VX
+KCXWjJbO]mJ,FciIJJ9\Hhr-cIK"]pJ,=crJc:9"KDpQ(L&?])L]3,,M>`>1MtDtuNV8D+O8Y1>
+Oo1CBPQ-mGPld8<Qi<?RR@9TDRfT%Mrgk+%TV8'RUSFW\V5C/gW2ZbrWiN5'Xfek2YctC<rj)j:
+[C*HO\$rmH\c98@]DfJC^&GbE^])%J_>1tG_u.IJ`VdaSa8<sWao9H]bQ#fcc2Q#gci;AkdJqVp
+e,IkseH"2"f)aOWrn7b7gt^`AhV[5Ki8N\pirS6&roO7Ekl0fIlKeH9s6TgSrpTmV!:g'Zs7?9_
+rUp3arqH<brqZNho_\@[n,;,BJcC<$bl<1~>
+JcC<$JcCT,mf*+^qu$6drVHKgq=sp_rV$*\rUg'[q""FSrUB[PrpKdQr9XFKs6BRIs60LGroX7B
+!9F.>s5F%;rnmh7hYu=3gtVh^"khP[f@JLOe0<AidF$=ecHa\Zbfe2PaiMQDa2Z*;`5BL0_SO%'
+^V@Lr^&GYG]=PTQ\H9:M\,Ni9[K!W4Zi@?2Z2Lp,YQ(d(XoGL%X8T'uWW/pqVuNXoV>[4iU]7(e
+T`UmZTDb>_SXc5LS,\rWRJrQTQ^3s:Q2d'KPPpXGOcY\'Nrk?$NW"h9MuS\4M>i>2L\cc(L&?VX
+KCXWjJbO]mJ,FciIJJ9\Hhr-cIK"]pJ,=crJc:9"KDpQ(L&?])L]3,,M>`>1MtDtuNV8D+O8Y1>
+Oo1CBPQ-mGPld8<Qi<?RR@9TDRfT%Mrgk+%TV8'RUSFW\V5C/gW2ZbrWiN5'Xfek2YctC<rj)j:
+[C*HO\$rmH\c98@]DfJC^&GbE^])%J_>1tG_u.IJ`VdaSa8<sWao9H]bQ#fcc2Q#gci;AkdJqVp
+e,IkseH"2"f)aOWrn7b7gt^`AhV[5Ki8N\pirS6&roO7Ekl0fIlKeH9s6TgSrpTmV!:g'Zs7?9_
+rUp3arqH<brqZNho_\@[n,;,BJcC<$bl<1~>
+JcC<$JcCT,mf*+^qu$6drVHKgq=sp_rV$*\rUg'[q""FSrUB[PrpKdQr9XFKs6BRIs60LGroX7B
+!9F.>s5F%;rnmh7hYu=3gtVh^"khP[f@JLOe0<AidF$=ecHa\Zbfe2PaiMQDa2Z*;`5BL0_SO%'
+^V@Lr^&GYG]=PTQ\H9:M\,Ni9[K!W4Zi@?2Z2Lp,YQ(d(XoGL%X8T'uWW/pqVuNXoV>[4iU]7(e
+T`UmZTDb>_SXc5LS,\rWRJrQTQ^3s:Q2d'KPPpXGOcY\'Nrk?$NW"h9MuS\4M>i>2L\cc(L&?VX
+KCXWjJbO]mJ,FciIJJ9\Hhr-cIK"]pJ,=crJc:9"KDpQ(L&?])L]3,,M>`>1MtDtuNV8D+O8Y1>
+Oo1CBPQ-mGPld8<Qi<?RR@9TDRfT%Mrgk+%TV8'RUSFW\V5C/gW2ZbrWiN5'Xfek2YctC<rj)j:
+[C*HO\$rmH\c98@]DfJC^&GbE^])%J_>1tG_u.IJ`VdaSa8<sWao9H]bQ#fcc2Q#gci;AkdJqVp
+e,IkseH"2"f)aOWrn7b7gt^`AhV[5Ki8N\pirS6&roO7Ekl0fIlKeH9s6TgSrpTmV!:g'Zs7?9_
+rUp3arqH<brqZNho_\@[n,;,BJcC<$bl<1~>
+JcC<$JcCQ+mJd"]r;?<drVHKgq=sp_rV$'[rUg'[q==LSrUB[PrpKgRr9XFKs6BRIs6'IGrT41C
+jQ-=#!TN);i!/)qhVI#Cg]#n:g"=p.f%&=#eC2jndEp5=c3;J:bKJ&Mrl>,\`r<pX`5DSk!PuSN
+^B2-_^&GYG]=PTQ\c9/>\,Ec8[K!W4Zi@?2Z2Lp,YQ(d'XoGL&X8K!tWW/pqVuNXoV>d:jU]7(e
+T`UmZTDkG^Sc>5ZS,\oWRJrTRQiEBNPld26PQ$aFOoLOBO8k7?NW"h9MuJV3M>i>1L\Z]&L%g8M
+KDU8uJbXcnJ,FcdIJ8-]IJnWoJ,=cqJcC?"KDpQ(L&?]*L]3,,M>iD3Mti8-NV&7sO8P+<Oo(=A
+PQ-mGQ2d0MQi<BPR/i]TRgYaWSXuFFTV/!PU8.^`%]-&#Vl6SpWiN2%Xf\b0ricU3ZEpmE['fnA
+!OoT<\c95@]D]DB^&PhF^]2+K_>D+J_u.II`VdaSa8*gTao9H\bQ#fdc2Grfci;Ajd/qbFe,Ihu
+e^i=Nf)aOWrn8=Ggt^`AhV[5Ki8N\Tj5]4^jlY^gkih9qlK[^7liHMArpTmV!:g$Ys766_rUp0`
+s7cEcrqZNhp&"L]nGV,@JcC<$bQ!(~>
+JcC<$JcCQ+mJd"]r;?<drVHKgq=sp_rV$'[rUg'[q==LSrUB[PrpKgRr9XFKs6BRIs6'IGrT41C
+jQ-=#!TN);i!/)qhVI#Cg]#n:g"=p.f%&=#eC2jndEp5=c3;J:bKJ&Mrl>,\`r<pX`5DSk!PuSN
+^B2-_^&GYG]=PTQ\c9/>\,Ec8[K!W4Zi@?2Z2Lp,YQ(d'XoGL&X8K!tWW/pqVuNXoV>d:jU]7(e
+T`UmZTDkG^Sc>5ZS,\oWRJrTRQiEBNPld26PQ$aFOoLOBO8k7?NW"h9MuJV3M>i>1L\Z]&L%g8M
+KDU8uJbXcnJ,FcdIJ8-]IJnWoJ,=cqJcC?"KDpQ(L&?]*L]3,,M>iD3Mti8-NV&7sO8P+<Oo(=A
+PQ-mGQ2d0MQi<BPR/i]TRgYaWSXuFFTV/!PU8.^`%]-&#Vl6SpWiN2%Xf\b0ricU3ZEpmE['fnA
+!OoT<\c95@]D]DB^&PhF^]2+K_>D+J_u.II`VdaSa8*gTao9H\bQ#fdc2Grfci;Ajd/qbFe,Ihu
+e^i=Nf)aOWrn8=Ggt^`AhV[5Ki8N\Tj5]4^jlY^gkih9qlK[^7liHMArpTmV!:g$Ys766_rUp0`
+s7cEcrqZNhp&"L]nGV,@JcC<$bQ!(~>
+JcC<$JcCQ+mJd"]r;?<drVHKgq=sp_rV$'[rUg'[q==LSrUB[PrpKgRr9XFKs6BRIs6'IGrT41C
+jQ-=#!TN);i!/)qhVI#Cg]#n:g"=p.f%&=#eC2jndEp5=c3;J:bKJ&Mrl>,\`r<pX`5DSk!PuSN
+^B2-_^&GYG]=PTQ\c9/>\,Ec8[K!W4Zi@?2Z2Lp,YQ(d'XoGL&X8K!tWW/pqVuNXoV>d:jU]7(e
+T`UmZTDkG^Sc>5ZS,\oWRJrTRQiEBNPld26PQ$aFOoLOBO8k7?NW"h9MuJV3M>i>1L\Z]&L%g8M
+KDU8uJbXcnJ,FcdIJ8-]IJnWoJ,=cqJcC?"KDpQ(L&?]*L]3,,M>iD3Mti8-NV&7sO8P+<Oo(=A
+PQ-mGQ2d0MQi<BPR/i]TRgYaWSXuFFTV/!PU8.^`%]-&#Vl6SpWiN2%Xf\b0ricU3ZEpmE['fnA
+!OoT<\c95@]D]DB^&PhF^]2+K_>D+J_u.II`VdaSa8*gTao9H\bQ#fdc2Grfci;Ajd/qbFe,Ihu
+e^i=Nf)aOWrn8=Ggt^`AhV[5Ki8N\Tj5]4^jlY^gkih9qlK[^7liHMArpTmV!:g$Ys766_rUp0`
+s7cEcrqZNhp&"L]nGV,@JcC<$bQ!(~>
+JcC<$JcCN*mf*(]r;?<drVHKgq"Xg^rV$'[r:KsZq==LSrUB^QrpKdQrTsOLs6BUJs60LGroX7B
+!9F.>&E;[-i8EMMhVI#CgY:H9g"?;U"kM5ReC2kFd07nCcHa\YrlYkqaiMQD`l?!:`5BL0_SO((
+rkANK]tOEX!kZ%Trji'=s0qs8s0_m6rNlO0s0;O,ric@)rN6+$s/Z'ts/H$srMT[ms/#^js.fUg
+rh9@bs.B:^!hGjOrgWqV!1EeQ!gf4=rg!MJ!0dAEs,d;CrK$u=s,Hu9repf6qhb<.rJ1'#kCr;V
+oRm'nrIO]nr."Tml$`JYrI=Zos+10$r.G!%s+UB*s+gT0r/(E1repW3rJg]7kE#A!r/pf<rfd>G
+rK[DKs-N_Ps-WkUrgWqX!1j+\!M?%aTamflUnjiaVPg>jWN)u!XT#=/Y-5(6Z*L[AZa@.>[Kj:O
+\@K/]]"@pR!kl=^rP/BJrk\NLrkn]Qpr30NqoAKQrQ5&]qoeu_s3:Jes3C\lrR(Yn!7Unr!nGlQ
+rmq2'g&B\;gYCT?h;7#Gi8ESQioB([jQ6C'!U&\GklL)8rp0^RmdC)C!q>aMrpp*\s7H9_s7ZKe
+qtU0drVH6bq#'[\gAZ['JcEgkJ,~>
+JcC<$JcCN*mf*(]r;?<drVHKgq"Xg^rV$'[r:KsZq==LSrUB^QrpKdQrTsOLs6BUJs60LGroX7B
+!9F.>&E;[-i8EMMhVI#CgY:H9g"?;U"kM5ReC2kFd07nCcHa\YrlYkqaiMQD`l?!:`5BL0_SO((
+rkANK]tOEX!kZ%Trji'=s0qs8s0_m6rNlO0s0;O,ric@)rN6+$s/Z'ts/H$srMT[ms/#^js.fUg
+rh9@bs.B:^!hGjOrgWqV!1EeQ!gf4=rg!MJ!0dAEs,d;CrK$u=s,Hu9repf6qhb<.rJ1'#kCr;V
+oRm'nrIO]nr."Tml$`JYrI=Zos+10$r.G!%s+UB*s+gT0r/(E1repW3rJg]7kE#A!r/pf<rfd>G
+rK[DKs-N_Ps-WkUrgWqX!1j+\!M?%aTamflUnjiaVPg>jWN)u!XT#=/Y-5(6Z*L[AZa@.>[Kj:O
+\@K/]]"@pR!kl=^rP/BJrk\NLrkn]Qpr30NqoAKQrQ5&]qoeu_s3:Jes3C\lrR(Yn!7Unr!nGlQ
+rmq2'g&B\;gYCT?h;7#Gi8ESQioB([jQ6C'!U&\GklL)8rp0^RmdC)C!q>aMrpp*\s7H9_s7ZKe
+qtU0drVH6bq#'[\gAZ['JcEgkJ,~>
+JcC<$JcCN*mf*(]r;?<drVHKgq"Xg^rV$'[r:KsZq==LSrUB^QrpKdQrTsOLs6BUJs60LGroX7B
+!9F.>&E;[-i8EMMhVI#CgY:H9g"?;U"kM5ReC2kFd07nCcHa\YrlYkqaiMQD`l?!:`5BL0_SO((
+rkANK]tOEX!kZ%Trji'=s0qs8s0_m6rNlO0s0;O,ric@)rN6+$s/Z'ts/H$srMT[ms/#^js.fUg
+rh9@bs.B:^!hGjOrgWqV!1EeQ!gf4=rg!MJ!0dAEs,d;CrK$u=s,Hu9repf6qhb<.rJ1'#kCr;V
+oRm'nrIO]nr."Tml$`JYrI=Zos+10$r.G!%s+UB*s+gT0r/(E1repW3rJg]7kE#A!r/pf<rfd>G
+rK[DKs-N_Ps-WkUrgWqX!1j+\!M?%aTamflUnjiaVPg>jWN)u!XT#=/Y-5(6Z*L[AZa@.>[Kj:O
+\@K/]]"@pR!kl=^rP/BJrk\NLrkn]Qpr30NqoAKQrQ5&]qoeu_s3:Jes3C\lrR(Yn!7Unr!nGlQ
+rmq2'g&B\;gYCT?h;7#Gi8ESQioB([jQ6C'!U&\GklL)8rp0^RmdC)C!q>aMrpp*\s7H9_s7ZKe
+qtU0drVH6bq#'[\gAZ['JcEgkJ,~>
+JcC<$JcCN*mJd"]qu$3crVHHfq=sm^rV$$ZrUg$Zq==LSrp]gRrpKdQrTsRMs6BRIs6'IGroX7B
+!9F.>s5F%;rnn.@hVI#CgtUQ:g"?;U"kM5ReC2kFd0e7HcHa\Ybfe2Pao9?^a2\+t!Q;nT_?.Qh
+_#D(M^:h5Z]E5^V])B2>\,a#:[f<c7[/I?2ZN%3-YlCp,Y5GF%XT,@"WrK'uW;WXoVZ3LlV#R4i
+UAgkdTE(V`T)YA]SGnuZR[KTCR/`KQQMm'MP`q=1P5g[EOSt7?NrP+:N;eb8MY`2.M#2tYLA-E!
+K_L,sK)L8pJGOc`IenQiJGt-!K)C9$K`6]'LB!&/M#<,/MZ/P2N;eh8NqAD'OS"\.P5^[EPl-gH
+QN*<MR/`TSRf8cWS=TYN$_O)bTqS3UUSO]^VZ*J'W2ZesX/rG*Y-+t4Yd(M5ZNdeE[^NZS\Gj#?
+]">TR]E5d\^AYhH_#M7K_Z.OQ`;.CM`r*mOaSa0Yb50<\bl>rccMu5id/MGmdf7eqeGn&!f)F;$
+fDsV(gAfn-h#?+1hV\=j!TE&;irS6&roO7Ekl0fOlKdd&m-X3.rpTmV!:g$Y!qZ'VrUp3arqH?c
+rqZNhp\Xdao)72>JcC<$a8^Y~>
+JcC<$JcCN*mJd"]qu$3crVHHfq=sm^rV$$ZrUg$Zq==LSrp]gRrpKdQrTsRMs6BRIs6'IGroX7B
+!9F.>s5F%;rnn.@hVI#CgtUQ:g"?;U"kM5ReC2kFd0e7HcHa\Ybfe2Pao9?^a2\+t!Q;nT_?.Qh
+_#D(M^:h5Z]E5^V])B2>\,a#:[f<c7[/I?2ZN%3-YlCp,Y5GF%XT,@"WrK'uW;WXoVZ3LlV#R4i
+UAgkdTE(V`T)YA]SGnuZR[KTCR/`KQQMm'MP`q=1P5g[EOSt7?NrP+:N;eb8MY`2.M#2tYLA-E!
+K_L,sK)L8pJGOc`IenQiJGt-!K)C9$K`6]'LB!&/M#<,/MZ/P2N;eh8NqAD'OS"\.P5^[EPl-gH
+QN*<MR/`TSRf8cWS=TYN$_O)bTqS3UUSO]^VZ*J'W2ZesX/rG*Y-+t4Yd(M5ZNdeE[^NZS\Gj#?
+]">TR]E5d\^AYhH_#M7K_Z.OQ`;.CM`r*mOaSa0Yb50<\bl>rccMu5id/MGmdf7eqeGn&!f)F;$
+fDsV(gAfn-h#?+1hV\=j!TE&;irS6&roO7Ekl0fOlKdd&m-X3.rpTmV!:g$Y!qZ'VrUp3arqH?c
+rqZNhp\Xdao)72>JcC<$a8^Y~>
+JcC<$JcCN*mJd"]qu$3crVHHfq=sm^rV$$ZrUg$Zq==LSrp]gRrpKdQrTsRMs6BRIs6'IGroX7B
+!9F.>s5F%;rnn.@hVI#CgtUQ:g"?;U"kM5ReC2kFd0e7HcHa\Ybfe2Pao9?^a2\+t!Q;nT_?.Qh
+_#D(M^:h5Z]E5^V])B2>\,a#:[f<c7[/I?2ZN%3-YlCp,Y5GF%XT,@"WrK'uW;WXoVZ3LlV#R4i
+UAgkdTE(V`T)YA]SGnuZR[KTCR/`KQQMm'MP`q=1P5g[EOSt7?NrP+:N;eb8MY`2.M#2tYLA-E!
+K_L,sK)L8pJGOc`IenQiJGt-!K)C9$K`6]'LB!&/M#<,/MZ/P2N;eh8NqAD'OS"\.P5^[EPl-gH
+QN*<MR/`TSRf8cWS=TYN$_O)bTqS3UUSO]^VZ*J'W2ZesX/rG*Y-+t4Yd(M5ZNdeE[^NZS\Gj#?
+]">TR]E5d\^AYhH_#M7K_Z.OQ`;.CM`r*mOaSa0Yb50<\bl>rccMu5id/MGmdf7eqeGn&!f)F;$
+fDsV(gAfn-h#?+1hV\=j!TE&;irS6&roO7Ekl0fOlKdd&m-X3.rpTmV!:g$Y!qZ'VrUp3arqH?c
+rqZNhp\Xdao)72>JcC<$a8^Y~>
+JcC<$JcCK)mJct\r;?<dr;-Bfq"Xd]rV$$Zr:KsZq""FSrUBaRrpKgRr9XILs6BUJs60LGroOII
+jQ,@]io8qrhuV`lrnSsWgY1B7f\"g-f%&:"e'lamdEp4bcHXVXbKJ&MaiMQD`l?!:`5KRm_?.Qh
+_#D(M^:h5Z]`5VD])K8?\Gs&:[f3]7[/I?1ZN%3.Yl:j+Y5PL&XT,@"WrK'uW;WXoV?!IkU]R<c
+UAgkdT`:Y`ScYIQSGo#XRK/cTR/`NQQN!0LPQ6pGP5g[EOSt7?NrG%9N;eb7MYN&)M!ToVLAZc'
+K_U2tK)C2lJF\3`JGk&uK):3#K`6]'LB!&/M#<,0MZ/P3N;eh8Nqnb5OS=n#P5CIAPl$aGQN!6L
+R/`QSRf/]\S=Q4BStDXJrh0@eU].%mV5C/gW2]cr"fn`,Xfel,YQ_;;Za7$HrjDj:\Gj#?]">TR
+]E5d\^AbnI_#M7L_Z%IQ`;7IO`r3sOaSa0Xb5'6[bl5lacMu5jd/;8mdaQ\DeGn&!f)F;$fDsV(
+gAfn-h#?+1hV\=j!TE&;isb#1jlY^gkNM0plK[^7liQSBmf)YVnF?&Jo)J=]o_nI_pAambq#:*f
+qY0m`r:Ks=rdk*#s2=qf~>
+JcC<$JcCK)mJct\r;?<dr;-Bfq"Xd]rV$$Zr:KsZq""FSrUBaRrpKgRr9XILs6BUJs60LGroOII
+jQ,@]io8qrhuV`lrnSsWgY1B7f\"g-f%&:"e'lamdEp4bcHXVXbKJ&MaiMQD`l?!:`5KRm_?.Qh
+_#D(M^:h5Z]`5VD])K8?\Gs&:[f3]7[/I?1ZN%3.Yl:j+Y5PL&XT,@"WrK'uW;WXoV?!IkU]R<c
+UAgkdT`:Y`ScYIQSGo#XRK/cTR/`NQQN!0LPQ6pGP5g[EOSt7?NrG%9N;eb7MYN&)M!ToVLAZc'
+K_U2tK)C2lJF\3`JGk&uK):3#K`6]'LB!&/M#<,0MZ/P3N;eh8Nqnb5OS=n#P5CIAPl$aGQN!6L
+R/`QSRf/]\S=Q4BStDXJrh0@eU].%mV5C/gW2]cr"fn`,Xfel,YQ_;;Za7$HrjDj:\Gj#?]">TR
+]E5d\^AbnI_#M7L_Z%IQ`;7IO`r3sOaSa0Xb5'6[bl5lacMu5jd/;8mdaQ\DeGn&!f)F;$fDsV(
+gAfn-h#?+1hV\=j!TE&;isb#1jlY^gkNM0plK[^7liQSBmf)YVnF?&Jo)J=]o_nI_pAambq#:*f
+qY0m`r:Ks=rdk*#s2=qf~>
+JcC<$JcCK)mJct\r;?<dr;-Bfq"Xd]rV$$Zr:KsZq""FSrUBaRrpKgRr9XILs6BUJs60LGroOII
+jQ,@]io8qrhuV`lrnSsWgY1B7f\"g-f%&:"e'lamdEp4bcHXVXbKJ&MaiMQD`l?!:`5KRm_?.Qh
+_#D(M^:h5Z]`5VD])K8?\Gs&:[f3]7[/I?1ZN%3.Yl:j+Y5PL&XT,@"WrK'uW;WXoV?!IkU]R<c
+UAgkdT`:Y`ScYIQSGo#XRK/cTR/`NQQN!0LPQ6pGP5g[EOSt7?NrG%9N;eb7MYN&)M!ToVLAZc'
+K_U2tK)C2lJF\3`JGk&uK):3#K`6]'LB!&/M#<,0MZ/P3N;eh8Nqnb5OS=n#P5CIAPl$aGQN!6L
+R/`QSRf/]\S=Q4BStDXJrh0@eU].%mV5C/gW2]cr"fn`,Xfel,YQ_;;Za7$HrjDj:\Gj#?]">TR
+]E5d\^AbnI_#M7L_Z%IQ`;7IO`r3sOaSa0Xb5'6[bl5lacMu5jd/;8mdaQ\DeGn&!f)F;$fDsV(
+gAfn-h#?+1hV\=j!TE&;isb#1jlY^gkNM0plK[^7liQSBmf)YVnF?&Jo)J=]o_nI_pAambq#:*f
+qY0m`r:Ks=rdk*#s2=qf~>
+JcC<$JcCH(mJct\qu$3cr;-Bfq"Xd]r:]pYr:KsZq==LSrp]gRs6fpSr9XIL!:'OI!pJh1roX7B
+!9F.>!TN);huV`lrnRq:gY1B7g"=p.f%'cL"k1oIdEp5=c2l26rlY>bao9?^a2\+t!lW!ork\`Q
+^qfra!ku@]rO`3D]"7jNs1&*<r3lX5s0V^1s0D[0r364)s/u=&s/c7$rMomss/>mo!iDfjrhTRh
+s.]Lds.B@args.\!1a"W!h,OFrg<_P!1*SK!gJn4rK@2Cs,d2?rf7#<qi(K3rJL0&iJ@2_onNF!
+r.Oitr.=fsk^`S^rIXp!re1<*r.b3+s+pT0s,-i7qi(Q7rf6i9rK-o=l&t_'qipoArg*PMrL!VQ
+s-inU!h>gPrgk.&TV/!PU8+KZUnsrcVl-JmWiE,$XKAV-YHY79ZMq0<['d?N\$rlX\[oAark&<G
+^:sT]s1nZNrkeZPs2=iSrPniWpW39Sqo\]WrQP5bqp,2es3U\ks3gqrrm^tus472$s4@>)rn7G.
+gt_nb!T)`5i!86#ioB([jQ6C'!U&\Gkm-M>lg4!*mI'uBs6p$YrUL$]o^r+Ts7ZKeqtU0drqcEe
+qY^$beGb%!JcEXfJ,~>
+JcC<$JcCH(mJct\qu$3cr;-Bfq"Xd]r:]pYr:KsZq==LSrp]gRs6fpSr9XIL!:'OI!pJh1roX7B
+!9F.>!TN);huV`lrnRq:gY1B7g"=p.f%'cL"k1oIdEp5=c2l26rlY>bao9?^a2\+t!lW!ork\`Q
+^qfra!ku@]rO`3D]"7jNs1&*<r3lX5s0V^1s0D[0r364)s/u=&s/c7$rMomss/>mo!iDfjrhTRh
+s.]Lds.B@args.\!1a"W!h,OFrg<_P!1*SK!gJn4rK@2Cs,d2?rf7#<qi(K3rJL0&iJ@2_onNF!
+r.Oitr.=fsk^`S^rIXp!re1<*r.b3+s+pT0s,-i7qi(Q7rf6i9rK-o=l&t_'qipoArg*PMrL!VQ
+s-inU!h>gPrgk.&TV/!PU8+KZUnsrcVl-JmWiE,$XKAV-YHY79ZMq0<['d?N\$rlX\[oAark&<G
+^:sT]s1nZNrkeZPs2=iSrPniWpW39Sqo\]WrQP5bqp,2es3U\ks3gqrrm^tus472$s4@>)rn7G.
+gt_nb!T)`5i!86#ioB([jQ6C'!U&\Gkm-M>lg4!*mI'uBs6p$YrUL$]o^r+Ts7ZKeqtU0drqcEe
+qY^$beGb%!JcEXfJ,~>
+JcC<$JcCH(mJct\qu$3cr;-Bfq"Xd]r:]pYr:KsZq==LSrp]gRs6fpSr9XIL!:'OI!pJh1roX7B
+!9F.>!TN);huV`lrnRq:gY1B7g"=p.f%'cL"k1oIdEp5=c2l26rlY>bao9?^a2\+t!lW!ork\`Q
+^qfra!ku@]rO`3D]"7jNs1&*<r3lX5s0V^1s0D[0r364)s/u=&s/c7$rMomss/>mo!iDfjrhTRh
+s.]Lds.B@args.\!1a"W!h,OFrg<_P!1*SK!gJn4rK@2Cs,d2?rf7#<qi(K3rJL0&iJ@2_onNF!
+r.Oitr.=fsk^`S^rIXp!re1<*r.b3+s+pT0s,-i7qi(Q7rf6i9rK-o=l&t_'qipoArg*PMrL!VQ
+s-inU!h>gPrgk.&TV/!PU8+KZUnsrcVl-JmWiE,$XKAV-YHY79ZMq0<['d?N\$rlX\[oAark&<G
+^:sT]s1nZNrkeZPs2=iSrPniWpW39Sqo\]WrQP5bqp,2es3U\ks3gqrrm^tus472$s4@>)rn7G.
+gt_nb!T)`5i!86#ioB([jQ6C'!U&\Gkm-M>lg4!*mI'uBs6p$YrUL$]o^r+Ts7ZKeqtU0drqcEe
+qY^$beGb%!JcEXfJ,~>
+JcC<$JcCE'm/Hn\qu$3cr;-?ep\=^]r:]mXr:KsZq==OTrp]jSrpKgRrTsRMs6BUJs6'IGroX7B
+!9F.>!TN);huV`lrnRV1g]#n1g"=p.f%'cL$IdGNdEp7dcHa\YrlY>bao9?da2Z-<`Pf^4rke]O
+s1nWKs1SKHrOi0Bs180>s1&*<r3lX5rj;X1rj)R/rNQ=*riZ4%s/c7$ri6!ts/>pps/,gmrhTRh
+!2BIds.B@arLO(]S=KSJ!h,OFrg<_Ps-EYLs-3PIrK@2Cs,d/>rf6u;qMb?1qMNj\q2"p'pkJa$
+r.OitqL\*cqh"Wrre19)r.b6,reUN0reg`6r/CZ8rf6l:rfI)@p6,-5n!*I0rKdGLr0[JOs-inU
+!h>gPrgj1`TV2:X!MZ@gU^ErqVl-JlWN)u!XT#=3Y-5(6Z*L^B['[6L[^WdG\Hf^X]=bei]tXK\
+s1eWNrPJTPs2=iSrl4rXqT/TVr6"]Ur65,aqTf)ds3U\krmLhqrR:o!f%0fO!nc2Zrn7G.gt_nb
+!T)`5i;_a9ir7s=jQ6C'#Nt=7l07Kuli-5PmI'EAmfN"Knc&+Zo)SF]p&Fabp\agcq>U6cqtp<b
+rRCgts+13cs*t~>
+JcC<$JcCE'm/Hn\qu$3cr;-?ep\=^]r:]mXr:KsZq==OTrp]jSrpKgRrTsRMs6BUJs6'IGroX7B
+!9F.>!TN);huV`lrnRV1g]#n1g"=p.f%'cL$IdGNdEp7dcHa\YrlY>bao9?da2Z-<`Pf^4rke]O
+s1nWKs1SKHrOi0Bs180>s1&*<r3lX5rj;X1rj)R/rNQ=*riZ4%s/c7$ri6!ts/>pps/,gmrhTRh
+!2BIds.B@arLO(]S=KSJ!h,OFrg<_Ps-EYLs-3PIrK@2Cs,d/>rf6u;qMb?1qMNj\q2"p'pkJa$
+r.OitqL\*cqh"Wrre19)r.b6,reUN0reg`6r/CZ8rf6l:rfI)@p6,-5n!*I0rKdGLr0[JOs-inU
+!h>gPrgj1`TV2:X!MZ@gU^ErqVl-JlWN)u!XT#=3Y-5(6Z*L^B['[6L[^WdG\Hf^X]=bei]tXK\
+s1eWNrPJTPs2=iSrl4rXqT/TVr6"]Ur65,aqTf)ds3U\krmLhqrR:o!f%0fO!nc2Zrn7G.gt_nb
+!T)`5i;_a9ir7s=jQ6C'#Nt=7l07Kuli-5PmI'EAmfN"Knc&+Zo)SF]p&Fabp\agcq>U6cqtp<b
+rRCgts+13cs*t~>
+JcC<$JcCE'm/Hn\qu$3cr;-?ep\=^]r:]mXr:KsZq==OTrp]jSrpKgRrTsRMs6BUJs6'IGroX7B
+!9F.>!TN);huV`lrnRV1g]#n1g"=p.f%'cL$IdGNdEp7dcHa\YrlY>bao9?da2Z-<`Pf^4rke]O
+s1nWKs1SKHrOi0Bs180>s1&*<r3lX5rj;X1rj)R/rNQ=*riZ4%s/c7$ri6!ts/>pps/,gmrhTRh
+!2BIds.B@arLO(]S=KSJ!h,OFrg<_Ps-EYLs-3PIrK@2Cs,d/>rf6u;qMb?1qMNj\q2"p'pkJa$
+r.OitqL\*cqh"Wrre19)r.b6,reUN0reg`6r/CZ8rf6l:rfI)@p6,-5n!*I0rKdGLr0[JOs-inU
+!h>gPrgj1`TV2:X!MZ@gU^ErqVl-JlWN)u!XT#=3Y-5(6Z*L^B['[6L[^WdG\Hf^X]=bei]tXK\
+s1eWNrPJTPs2=iSrl4rXqT/TVr6"]Ur65,aqTf)ds3U\krmLhqrR:o!f%0fO!nc2Zrn7G.gt_nb
+!T)`5i;_a9ir7s=jQ6C'#Nt=7l07Kuli-5PmI'EAmfN"Knc&+Zo)SF]p&Fabp\agcq>U6cqtp<b
+rRCgts+13cs*t~>
+JcC<$JcCB&m/Hn\qu$0br;-?ep\=[\r:]mXr:KsZqXXXUrp]jSrpKgRrTjUOlK\?4!pJh1roO7C
+jSn0Iio/kSi8<DJh;-l@rn7_4f[na+e^`1!e'e6C$dd5FcHXVXbKJ&Nao9?^a2\+ts24oTrke]O
+s1nWKs1\NHrOi0Bs180>rj`!;r3lX5s0V^1s0D[0r364)s/u=&s/c7$ri6!ts/>pps/#dmrM0Li
+U8%X\!hc0Xrgs.\!1a%Xs-itUrg<_P!1*SKs-3PIrK@2CrfI&=rf6r:pPem*iem5^r.t9+pkJa$
+r.O]pnq-RfrIk0(qhG-+reUN0reg`6r/CZ8rf6o;rfI,Aq3(W=q39s*qj.2Iqj@ANs-inUs.'+[
+rgs.^!20=b$_jDkUnjiaVPg>jWW&n$X/rG*Y-7i/"gPA>Za@.>[Ka4N\[f;_]DfGD]tXK\s1eWN
+rPAWR`5MSms2P&YqoJ`Xr6"`Vqonu_q9Jrbrm:Sjs3gnqrRCkts472$s4IA)rn7G.gt_nb#N"@q
+i8ESQir7sCjQ5Lck3(pkrojIKli-8Nm/ZSRn,MkWnc&+ZoDeI]p&Facp\agcq>U6cqtp<drR:as
+s+13as*t~>
+JcC<$JcCB&m/Hn\qu$0br;-?ep\=[\r:]mXr:KsZqXXXUrp]jSrpKgRrTjUOlK\?4!pJh1roO7C
+jSn0Iio/kSi8<DJh;-l@rn7_4f[na+e^`1!e'e6C$dd5FcHXVXbKJ&Nao9?^a2\+ts24oTrke]O
+s1nWKs1\NHrOi0Bs180>rj`!;r3lX5s0V^1s0D[0r364)s/u=&s/c7$ri6!ts/>pps/#dmrM0Li
+U8%X\!hc0Xrgs.\!1a%Xs-itUrg<_P!1*SKs-3PIrK@2CrfI&=rf6r:pPem*iem5^r.t9+pkJa$
+r.O]pnq-RfrIk0(qhG-+reUN0reg`6r/CZ8rf6o;rfI,Aq3(W=q39s*qj.2Iqj@ANs-inUs.'+[
+rgs.^!20=b$_jDkUnjiaVPg>jWW&n$X/rG*Y-7i/"gPA>Za@.>[Ka4N\[f;_]DfGD]tXK\s1eWN
+rPAWR`5MSms2P&YqoJ`Xr6"`Vqonu_q9Jrbrm:Sjs3gnqrRCkts472$s4IA)rn7G.gt_nb#N"@q
+i8ESQir7sCjQ5Lck3(pkrojIKli-8Nm/ZSRn,MkWnc&+ZoDeI]p&Facp\agcq>U6cqtp<drR:as
+s+13as*t~>
+JcC<$JcCB&m/Hn\qu$0br;-?ep\=[\r:]mXr:KsZqXXXUrp]jSrpKgRrTjUOlK\?4!pJh1roO7C
+jSn0Iio/kSi8<DJh;-l@rn7_4f[na+e^`1!e'e6C$dd5FcHXVXbKJ&Nao9?^a2\+ts24oTrke]O
+s1nWKs1\NHrOi0Bs180>rj`!;r3lX5s0V^1s0D[0r364)s/u=&s/c7$ri6!ts/>pps/#dmrM0Li
+U8%X\!hc0Xrgs.\!1a%Xs-itUrg<_P!1*SKs-3PIrK@2CrfI&=rf6r:pPem*iem5^r.t9+pkJa$
+r.O]pnq-RfrIk0(qhG-+reUN0reg`6r/CZ8rf6o;rfI,Aq3(W=q39s*qj.2Iqj@ANs-inUs.'+[
+rgs.^!20=b$_jDkUnjiaVPg>jWW&n$X/rG*Y-7i/"gPA>Za@.>[Ka4N\[f;_]DfGD]tXK\s1eWN
+rPAWR`5MSms2P&YqoJ`Xr6"`Vqonu_q9Jrbrm:Sjs3gnqrRCkts472$s4IA)rn7G.gt_nb#N"@q
+i8ESQir7sCjQ5Lck3(pkrojIKli-8Nm/ZSRn,MkWnc&+ZoDeI]p&Facp\agcq>U6cqtp<drR:as
+s+13as*t~>
+JcC<$JcC?%m/Hk[qu$0br;-?epA"R[r:]mXr:KsZqssaVrp]jSs6fpSrTsRMs6BUJ!pJh1roOdR
+jQ,@]io/kSi8<DJh;-l@rn7D+f`'J0f%&:"e'c[ldEp5=c2l26rlYPhaiVWFa2c4!`W*jV_u7FR
+_8*kb^]2%J^&>VD]DoJ?\c92>\,<]7[JmQ3Zi791Z2Lp,YQ(d(XoGI&X8T'uW;rmqVZN`lV>d7l
+US=L^U&UbcTDkG^SH,2YRf]%HRJrTRQiEBMQ2d*KPPp[DOoCI>O8Y+:NT5ubMu&>)M>`8.L\Z]&
+L&6PeKD^E$L&6W(L]<2.M>iD4MuAV6NW5%:O8b7?Oo(=?PPg[5Q11+9QhZsIRJrZQS,]#YSc55\
+T)bP`U&UheU].%iV5F6i-`F#EWiN2%Xf\b0YctC;ZEpmE[C3NQ\%&uZ]">Se]Y2%n^V@S"_>V4P
+_o0Ll`W*sXa8<sWao0BWbPTN\c1]H]ci2;gdJhSne,@erec45!fDjJ'g&9V+gYCT`h$;fohr*GO
+iSsjs#NY".k2tjikl0fJlKdd8liHMArpTmVs7-*Zs766_rUp3arqHBdrqZQiq"t!eq#/_AJcC<$
+]DmB~>
+JcC<$JcC?%m/Hk[qu$0br;-?epA"R[r:]mXr:KsZqssaVrp]jSs6fpSrTsRMs6BUJ!pJh1roOdR
+jQ,@]io/kSi8<DJh;-l@rn7D+f`'J0f%&:"e'c[ldEp5=c2l26rlYPhaiVWFa2c4!`W*jV_u7FR
+_8*kb^]2%J^&>VD]DoJ?\c92>\,<]7[JmQ3Zi791Z2Lp,YQ(d(XoGI&X8T'uW;rmqVZN`lV>d7l
+US=L^U&UbcTDkG^SH,2YRf]%HRJrTRQiEBMQ2d*KPPp[DOoCI>O8Y+:NT5ubMu&>)M>`8.L\Z]&
+L&6PeKD^E$L&6W(L]<2.M>iD4MuAV6NW5%:O8b7?Oo(=?PPg[5Q11+9QhZsIRJrZQS,]#YSc55\
+T)bP`U&UheU].%iV5F6i-`F#EWiN2%Xf\b0YctC;ZEpmE[C3NQ\%&uZ]">Se]Y2%n^V@S"_>V4P
+_o0Ll`W*sXa8<sWao0BWbPTN\c1]H]ci2;gdJhSne,@erec45!fDjJ'g&9V+gYCT`h$;fohr*GO
+iSsjs#NY".k2tjikl0fJlKdd8liHMArpTmVs7-*Zs766_rUp3arqHBdrqZQiq"t!eq#/_AJcC<$
+]DmB~>
+JcC<$JcC?%m/Hk[qu$0br;-?epA"R[r:]mXr:KsZqssaVrp]jSs6fpSrTsRMs6BUJ!pJh1roOdR
+jQ,@]io/kSi8<DJh;-l@rn7D+f`'J0f%&:"e'c[ldEp5=c2l26rlYPhaiVWFa2c4!`W*jV_u7FR
+_8*kb^]2%J^&>VD]DoJ?\c92>\,<]7[JmQ3Zi791Z2Lp,YQ(d(XoGI&X8T'uW;rmqVZN`lV>d7l
+US=L^U&UbcTDkG^SH,2YRf]%HRJrTRQiEBMQ2d*KPPp[DOoCI>O8Y+:NT5ubMu&>)M>`8.L\Z]&
+L&6PeKD^E$L&6W(L]<2.M>iD4MuAV6NW5%:O8b7?Oo(=?PPg[5Q11+9QhZsIRJrZQS,]#YSc55\
+T)bP`U&UheU].%iV5F6i-`F#EWiN2%Xf\b0YctC;ZEpmE[C3NQ\%&uZ]">Se]Y2%n^V@S"_>V4P
+_o0Ll`W*sXa8<sWao0BWbPTN\c1]H]ci2;gdJhSne,@erec45!fDjJ'g&9V+gYCT`h$;fohr*GO
+iSsjs#NY".k2tjikl0fJlKdd8liHMArpTmVs7-*Zs766_rUp3arqHBdrqZQiq"t!eq#/_AJcC<$
+]DmB~>
+JcC<$JcC<$m/Hk[qu$0bqtg6dpA"R[qtBdWrUg'[qssaVrp]jSs6fpSrp9[Ns6BUJs6'IGroOsW
+jQ,@]io8qTi8<GKh;-l@gY1B7f`'J;f%&:"e'lamdEp4ccHa\Zbfe2Pb/sY(!lr=#rl+oU!5ncP
+s1n]NrP/BHs1S?Cs1A<Br42g:s0qp7s0_m6r3QF/s0;O,s0)I*rN6+$!3?'u!i`,srhodn!2][j
+s.]RgrLj:cT:c+S!hGjOrgWqV!1EeQs-NbOrK[DIs-*ADrfR2Aq2bE5pPmjbqMY9/pkes*rJ1-%
+qM"?jqh=j#reLK/r/(H2rep`6s,I#<r/^l>rfR,Arfd;FpQbN>n!EO2rL*YRqj[VUs.0+[s.9:a
+rh9@d!2KOh$`0_tVl-JmWN)u!XT#=*Y-5(6Z*OA8"gk\G[^WdG\H0:Rrk&9F^AbkK^qmkd_?.Wn
+`;[aU`rF*WaSs<\b5'6Ybl#`XcMZ#ed/)/hdf._neGn)!f)=5#f`0Y(gAfn-h#6%6hV[5Ki8NYS
+ro=%>!9O4B!U&\Gl2U#Kli-5PmI'EAmfN"Knc&+ZoDeI]p&Facp\agcq>U6dqu$BfrRUt!s+13Z
+s*t~>
+JcC<$JcC<$m/Hk[qu$0bqtg6dpA"R[qtBdWrUg'[qssaVrp]jSs6fpSrp9[Ns6BUJs6'IGroOsW
+jQ,@]io8qTi8<GKh;-l@gY1B7f`'J;f%&:"e'lamdEp4ccHa\Zbfe2Pb/sY(!lr=#rl+oU!5ncP
+s1n]NrP/BHs1S?Cs1A<Br42g:s0qp7s0_m6r3QF/s0;O,s0)I*rN6+$!3?'u!i`,srhodn!2][j
+s.]RgrLj:cT:c+S!hGjOrgWqV!1EeQs-NbOrK[DIs-*ADrfR2Aq2bE5pPmjbqMY9/pkes*rJ1-%
+qM"?jqh=j#reLK/r/(H2rep`6s,I#<r/^l>rfR,Arfd;FpQbN>n!EO2rL*YRqj[VUs.0+[s.9:a
+rh9@d!2KOh$`0_tVl-JmWN)u!XT#=*Y-5(6Z*OA8"gk\G[^WdG\H0:Rrk&9F^AbkK^qmkd_?.Wn
+`;[aU`rF*WaSs<\b5'6Ybl#`XcMZ#ed/)/hdf._neGn)!f)=5#f`0Y(gAfn-h#6%6hV[5Ki8NYS
+ro=%>!9O4B!U&\Gl2U#Kli-5PmI'EAmfN"Knc&+ZoDeI]p&Facp\agcq>U6dqu$BfrRUt!s+13Z
+s*t~>
+JcC<$JcC<$m/Hk[qu$0bqtg6dpA"R[qtBdWrUg'[qssaVrp]jSs6fpSrp9[Ns6BUJs6'IGroOsW
+jQ,@]io8qTi8<GKh;-l@gY1B7f`'J;f%&:"e'lamdEp4ccHa\Zbfe2Pb/sY(!lr=#rl+oU!5ncP
+s1n]NrP/BHs1S?Cs1A<Br42g:s0qp7s0_m6r3QF/s0;O,s0)I*rN6+$!3?'u!i`,srhodn!2][j
+s.]RgrLj:cT:c+S!hGjOrgWqV!1EeQs-NbOrK[DIs-*ADrfR2Aq2bE5pPmjbqMY9/pkes*rJ1-%
+qM"?jqh=j#reLK/r/(H2rep`6s,I#<r/^l>rfR,Arfd;FpQbN>n!EO2rL*YRqj[VUs.0+[s.9:a
+rh9@d!2KOh$`0_tVl-JmWN)u!XT#=*Y-5(6Z*OA8"gk\G[^WdG\H0:Rrk&9F^AbkK^qmkd_?.Wn
+`;[aU`rF*WaSs<\b5'6Ybl#`XcMZ#ed/)/hdf._neGn)!f)=5#f`0Y(gAfn-h#6%6hV[5Ki8NYS
+ro=%>!9O4B!U&\Gl2U#Kli-5PmI'EAmfN"Knc&+ZoDeI]p&Facp\agcq>U6dqu$BfrRUt!s+13Z
+s*t~>
+JcC<$JcC<$!<;EbqYg<hp&"X_r;$$\r:g*^p\"LWrq$!Ws7-*XrU9dSs6]dOs6B[MrosIH!9a@D
+($4N;j5].YiS`YOhqm2FgtUT;g=b-Xf)aIQrmUttdf.Vpd*M^:!R8jfb6#i.ao9?_a2Z-u`W*jV
+_u7IP_>h=L^]2%J^&5PC]DfD>\c92=\,Ec7[K!W4Zi@?2Z2Lp,YQ(d)XoGL&X8].!W;rmqVZN`l
+V>d7lUS=L^T`UmZTDkG^SH,2YRf]%HRJiNQQiEBMQ2d*JPPgUBOo:C6O6DVnNV&2.Mu8J.M>`8.
+L\$8nL%U3!L]3,-M>iD4Mu8P6NW+t:O8b7@Oo1CAPQ$gBQ2R$FQf=D/RJiTNS,SrXSc,/[TDtS_
+Ta.<eUSO]^V5F6i!N<!sWZnLFXf\b0YHY79ZEpmE[C*HO\%&uZ]">Se]Y2%n^V@S"_>_:Q_o0Lm
+`W*sXa8O*YaoBN[bPo``c1TBZchl)adJhSne,.Ypec45!fDjM'g&9Y)gAp%-h#cHjhu;O=iSrkW
+j5f:_roO:Fkii$1!UB"Mm/QGQmf)\Tn,W"Wo)J:]o_nI_pAambq#:*gqYC$dr;$<Drdk*#s0VfV~>
+JcC<$JcC<$!<;EbqYg<hp&"X_r;$$\r:g*^p\"LWrq$!Ws7-*XrU9dSs6]dOs6B[MrosIH!9a@D
+($4N;j5].YiS`YOhqm2FgtUT;g=b-Xf)aIQrmUttdf.Vpd*M^:!R8jfb6#i.ao9?_a2Z-u`W*jV
+_u7IP_>h=L^]2%J^&5PC]DfD>\c92=\,Ec7[K!W4Zi@?2Z2Lp,YQ(d)XoGL&X8].!W;rmqVZN`l
+V>d7lUS=L^T`UmZTDkG^SH,2YRf]%HRJiNQQiEBMQ2d*JPPgUBOo:C6O6DVnNV&2.Mu8J.M>`8.
+L\$8nL%U3!L]3,-M>iD4Mu8P6NW+t:O8b7@Oo1CAPQ$gBQ2R$FQf=D/RJiTNS,SrXSc,/[TDtS_
+Ta.<eUSO]^V5F6i!N<!sWZnLFXf\b0YHY79ZEpmE[C*HO\%&uZ]">Se]Y2%n^V@S"_>_:Q_o0Lm
+`W*sXa8O*YaoBN[bPo``c1TBZchl)adJhSne,.Ypec45!fDjM'g&9Y)gAp%-h#cHjhu;O=iSrkW
+j5f:_roO:Fkii$1!UB"Mm/QGQmf)\Tn,W"Wo)J:]o_nI_pAambq#:*gqYC$dr;$<Drdk*#s0VfV~>
+JcC<$JcC<$!<;EbqYg<hp&"X_r;$$\r:g*^p\"LWrq$!Ws7-*XrU9dSs6]dOs6B[MrosIH!9a@D
+($4N;j5].YiS`YOhqm2FgtUT;g=b-Xf)aIQrmUttdf.Vpd*M^:!R8jfb6#i.ao9?_a2Z-u`W*jV
+_u7IP_>h=L^]2%J^&5PC]DfD>\c92=\,Ec7[K!W4Zi@?2Z2Lp,YQ(d)XoGL&X8].!W;rmqVZN`l
+V>d7lUS=L^T`UmZTDkG^SH,2YRf]%HRJiNQQiEBMQ2d*JPPgUBOo:C6O6DVnNV&2.Mu8J.M>`8.
+L\$8nL%U3!L]3,-M>iD4Mu8P6NW+t:O8b7@Oo1CAPQ$gBQ2R$FQf=D/RJiTNS,SrXSc,/[TDtS_
+Ta.<eUSO]^V5F6i!N<!sWZnLFXf\b0YHY79ZEpmE[C*HO\%&uZ]">Se]Y2%n^V@S"_>_:Q_o0Lm
+`W*sXa8O*YaoBN[bPo``c1TBZchl)adJhSne,.Ypec45!fDjM'g&9Y)gAp%-h#cHjhu;O=iSrkW
+j5f:_roO:Fkii$1!UB"Mm/QGQmf)\Tn,W"Wo)J:]o_nI_pAambq#:*gqYC$dr;$<Drdk*#s0VfV~>
+JcC<$JcC<$s8VHbqYg9gp&"X_qt]p[r:g*^q"=UXrq$$Xrpg$Xr9s[Rs6]gPs6B[MrosIH!9a@D
+s5aFFj5].YiVqaGhqm2Fgt^Z<g=b-2f@SU(rmUttdf.Vpd*M^:!mSs5rlYAcaiXP'!lr=#rl+oU
+s24fPs2"`NrP/BHrk86Bs1A9Ar42j;s0qp7s0_m6rNlO0s0;O,s0)I*riQ4%s/Z.!!i`,srhodn
+!2][js.]Rgrh9@b!2'4]!hGjOrgWqVs-`hQs-NbOr0@;Hrfd2Ar/pl<fT5ffqi1B0rJUT2q2,$*
+qhOEjr.k9-qMG3/s,6f6s,I#<rK$u?rfR/Brfd>Gqj%,GrKm,Cm@!^;pRD/PrgitYs.B=arLj:e
+USIga&>c8$Vl-JlWN)u!X/rG*Y-7i/"gPA>Za@.>[KX.M\[f;`rk&9F^AbkJ^qp#es2+iTrl+oW
+s2Y)Zs2k;`r6,&_rQY)^qp5/dp<iierR:Ynrmh&"r7Cu$s4RD*s4dS/rn[V2!8me6s5<t;ro=%>
+!9O4B!pAe2roj[Qlg*p(mHs?@n,MnWnc&+ZoDeI^p&Fabp\jmdq>U6dqu$BgrRq1$s+13Ts*t~>
+JcC<$JcC<$s8VHbqYg9gp&"X_qt]p[r:g*^q"=UXrq$$Xrpg$Xr9s[Rs6]gPs6B[MrosIH!9a@D
+s5aFFj5].YiVqaGhqm2Fgt^Z<g=b-2f@SU(rmUttdf.Vpd*M^:!mSs5rlYAcaiXP'!lr=#rl+oU
+s24fPs2"`NrP/BHrk86Bs1A9Ar42j;s0qp7s0_m6rNlO0s0;O,s0)I*riQ4%s/Z.!!i`,srhodn
+!2][js.]Rgrh9@b!2'4]!hGjOrgWqVs-`hQs-NbOr0@;Hrfd2Ar/pl<fT5ffqi1B0rJUT2q2,$*
+qhOEjr.k9-qMG3/s,6f6s,I#<rK$u?rfR/Brfd>Gqj%,GrKm,Cm@!^;pRD/PrgitYs.B=arLj:e
+USIga&>c8$Vl-JlWN)u!X/rG*Y-7i/"gPA>Za@.>[KX.M\[f;`rk&9F^AbkJ^qp#es2+iTrl+oW
+s2Y)Zs2k;`r6,&_rQY)^qp5/dp<iierR:Ynrmh&"r7Cu$s4RD*s4dS/rn[V2!8me6s5<t;ro=%>
+!9O4B!pAe2roj[Qlg*p(mHs?@n,MnWnc&+ZoDeI^p&Fabp\jmdq>U6dqu$BgrRq1$s+13Ts*t~>
+JcC<$JcC<$s8VHbqYg9gp&"X_qt]p[r:g*^q"=UXrq$$Xrpg$Xr9s[Rs6]gPs6B[MrosIH!9a@D
+s5aFFj5].YiVqaGhqm2Fgt^Z<g=b-2f@SU(rmUttdf.Vpd*M^:!mSs5rlYAcaiXP'!lr=#rl+oU
+s24fPs2"`NrP/BHrk86Bs1A9Ar42j;s0qp7s0_m6rNlO0s0;O,s0)I*riQ4%s/Z.!!i`,srhodn
+!2][js.]Rgrh9@b!2'4]!hGjOrgWqVs-`hQs-NbOr0@;Hrfd2Ar/pl<fT5ffqi1B0rJUT2q2,$*
+qhOEjr.k9-qMG3/s,6f6s,I#<rK$u?rfR/Brfd>Gqj%,GrKm,Cm@!^;pRD/PrgitYs.B=arLj:e
+USIga&>c8$Vl-JlWN)u!X/rG*Y-7i/"gPA>Za@.>[KX.M\[f;`rk&9F^AbkJ^qp#es2+iTrl+oW
+s2Y)Zs2k;`r6,&_rQY)^qp5/dp<iierR:Ynrmh&"r7Cu$s4RD*s4dS/rn[V2!8me6s5<t;ro=%>
+!9O4B!pAe2roj[Qlg*p(mHs?@n,MnWnc&+ZoDeI^p&Fabp\jmdq>U6dqu$BgrRq1$s+13Ts*t~>
+JcC<$JcC<$rr;?aq>L3go_\O^qt]p[qtL!]q=X^Yrq$$Xs7-*XrU9dSs6]gPs6K^Mroj[OkND!i
+jlPS&irS/urnmh7hYu=GgtUQ:g"G$0f@JL&eC;sqda?Ihd*M^:!R8jfbQ#]bao09^a2Z-t`<*uq
+_u7IO_>h=K^]2%J^&,JB]DfD?\c0,=\,<]7[K!W4Zi@?2Z2V!-YQ(d)XTGT)X8].!W;rmrVuNUo
+V>d:jUB%%eT`UmZTDkG^SH,2YS,\rWRJiNQQiEBKQ2[$IPPC=:OlqhkO8P%9NVSP3MuAP-M>E%s
+L\lo(M>`>3Mu8P5NW5%:O8k=AOo1CBPQ$gEQ2R$JQhZsERIQa3S,AfUSbo#YTDtS_U&UkeU].%j
+V5C-hVZE`qri-""XT#=BY-5(6Z*L[AZa@-K[^WcV\[f;`]Y(qk^;%Fu^qp#e!Q2kT`W*sXa8X0[
+aoBN]bPo`bc2#Z_chl)]dJMAje,%Snec+.tfDjM'g&9Y)g]-(.h>c=3hu;R6iW%p;j8\0?jo4EB
+k5a`Fl2U#Kli-5PmI'EAn,MkWnc&+ZoDeI]p&Facp\agcq>U6equ$BhrS@I(s+13Ns*t~>
+JcC<$JcC<$rr;?aq>L3go_\O^qt]p[qtL!]q=X^Yrq$$Xs7-*XrU9dSs6]gPs6K^Mroj[OkND!i
+jlPS&irS/urnmh7hYu=GgtUQ:g"G$0f@JL&eC;sqda?Ihd*M^:!R8jfbQ#]bao09^a2Z-t`<*uq
+_u7IO_>h=K^]2%J^&,JB]DfD?\c0,=\,<]7[K!W4Zi@?2Z2V!-YQ(d)XTGT)X8].!W;rmrVuNUo
+V>d:jUB%%eT`UmZTDkG^SH,2YS,\rWRJiNQQiEBKQ2[$IPPC=:OlqhkO8P%9NVSP3MuAP-M>E%s
+L\lo(M>`>3Mu8P5NW5%:O8k=AOo1CBPQ$gEQ2R$JQhZsERIQa3S,AfUSbo#YTDtS_U&UkeU].%j
+V5C-hVZE`qri-""XT#=BY-5(6Z*L[AZa@-K[^WcV\[f;`]Y(qk^;%Fu^qp#e!Q2kT`W*sXa8X0[
+aoBN]bPo`bc2#Z_chl)]dJMAje,%Snec+.tfDjM'g&9Y)g]-(.h>c=3hu;R6iW%p;j8\0?jo4EB
+k5a`Fl2U#Kli-5PmI'EAn,MkWnc&+ZoDeI]p&Facp\agcq>U6equ$BhrS@I(s+13Ns*t~>
+JcC<$JcC<$rr;?aq>L3go_\O^qt]p[qtL!]q=X^Yrq$$Xs7-*XrU9dSs6]gPs6K^Mroj[OkND!i
+jlPS&irS/urnmh7hYu=GgtUQ:g"G$0f@JL&eC;sqda?Ihd*M^:!R8jfbQ#]bao09^a2Z-t`<*uq
+_u7IO_>h=K^]2%J^&,JB]DfD?\c0,=\,<]7[K!W4Zi@?2Z2V!-YQ(d)XTGT)X8].!W;rmrVuNUo
+V>d:jUB%%eT`UmZTDkG^SH,2YS,\rWRJiNQQiEBKQ2[$IPPC=:OlqhkO8P%9NVSP3MuAP-M>E%s
+L\lo(M>`>3Mu8P5NW5%:O8k=AOo1CBPQ$gEQ2R$JQhZsERIQa3S,AfUSbo#YTDtS_U&UkeU].%j
+V5C-hVZE`qri-""XT#=BY-5(6Z*L[AZa@-K[^WcV\[f;`]Y(qk^;%Fu^qp#e!Q2kT`W*sXa8X0[
+aoBN]bPo`bc2#Z_chl)]dJMAje,%Snec+.tfDjM'g&9Y)g]-(.h>c=3hu;R6iW%p;j8\0?jo4EB
+k5a`Fl2U#Kli-5PmI'EAn,MkWnc&+ZoDeI]p&Facp\agcq>U6equ$BhrS@I(s+13Ns*t~>
+JcC<$JcC<$rVu3_q>L3go_\L]qt]mZr:g*^q=XaZrq$$Xs7--Yr9j^TmHsl=!pf.:roj[OkND!i
+jlPS&irS/urnmh7hYu=3gtVh^#2.Y\f@JO'rmUttdf.Vpd*M^:s31Pfrlb>a!6P2\!lr=#rPefT
+s24fPrk\WMr4i9Grk86Brk&3Ar42j;s0qp7s0_m6rNcR2Z*F83!jAc0riQ4%s/Z.!!i`,srhfgp
+V5=0e!i)Karh9@b!2'4]!hGjOrL<hUs-`hQrg3YNqj%,Er0-N2k)oJ$p5f-3rJgW3rJUT2nqm-t
+oSNR)repZ4rf-r<r/^l>s,m5Bs-*JIr0@8Irg3JKrL*POjI>n6r13YTrh'4`r1X.b!2KLgs.o^m
+rhgs=WMuntX/i>(Xfek2YctC<Za7$G[C3NQ\@K/]]">Vf]tXK\!PlPN_?e&t`5T^8`lH.!aT'B^
+b5KN`bl5lacMc)dd.G`_dehMheG[qsf)4/!f`0Y'gAfq-h#6%1hV[5ii;_a9ir.m=jQ5M&joOZ/
+rosIJ!:0XNs6TgSrpTmVs7-*Zs766_rUp3as7cHdrqZQiqYU3gqu,IPJcC<$VuM8~>
+JcC<$JcC<$rVu3_q>L3go_\L]qt]mZr:g*^q=XaZrq$$Xs7--Yr9j^TmHsl=!pf.:roj[OkND!i
+jlPS&irS/urnmh7hYu=3gtVh^#2.Y\f@JO'rmUttdf.Vpd*M^:s31Pfrlb>a!6P2\!lr=#rPefT
+s24fPrk\WMr4i9Grk86Brk&3Ar42j;s0qp7s0_m6rNcR2Z*F83!jAc0riQ4%s/Z.!!i`,srhfgp
+V5=0e!i)Karh9@b!2'4]!hGjOrL<hUs-`hQrg3YNqj%,Er0-N2k)oJ$p5f-3rJgW3rJUT2nqm-t
+oSNR)repZ4rf-r<r/^l>s,m5Bs-*JIr0@8Irg3JKrL*POjI>n6r13YTrh'4`r1X.b!2KLgs.o^m
+rhgs=WMuntX/i>(Xfek2YctC<Za7$G[C3NQ\@K/]]">Vf]tXK\!PlPN_?e&t`5T^8`lH.!aT'B^
+b5KN`bl5lacMc)dd.G`_dehMheG[qsf)4/!f`0Y'gAfq-h#6%1hV[5ii;_a9ir.m=jQ5M&joOZ/
+rosIJ!:0XNs6TgSrpTmVs7-*Zs766_rUp3as7cHdrqZQiqYU3gqu,IPJcC<$VuM8~>
+JcC<$JcC<$rVu3_q>L3go_\L]qt]mZr:g*^q=XaZrq$$Xs7--Yr9j^TmHsl=!pf.:roj[OkND!i
+jlPS&irS/urnmh7hYu=3gtVh^#2.Y\f@JO'rmUttdf.Vpd*M^:s31Pfrlb>a!6P2\!lr=#rPefT
+s24fPrk\WMr4i9Grk86Brk&3Ar42j;s0qp7s0_m6rNcR2Z*F83!jAc0riQ4%s/Z.!!i`,srhfgp
+V5=0e!i)Karh9@b!2'4]!hGjOrL<hUs-`hQrg3YNqj%,Er0-N2k)oJ$p5f-3rJgW3rJUT2nqm-t
+oSNR)repZ4rf-r<r/^l>s,m5Bs-*JIr0@8Irg3JKrL*POjI>n6r13YTrh'4`r1X.b!2KLgs.o^m
+rhgs=WMuntX/i>(Xfek2YctC<Za7$G[C3NQ\@K/]]">Vf]tXK\!PlPN_?e&t`5T^8`lH.!aT'B^
+b5KN`bl5lacMc)dd.G`_dehMheG[qsf)4/!f`0Y'gAfq-h#6%1hV[5ii;_a9ir.m=jQ5M&joOZ/
+rosIJ!:0XNs6TgSrpTmVs7-*Zs766_rUp3as7cHdrqZQiqYU3gqu,IPJcC<$VuM8~>
+JcC<$JcC<$rVu0^q>L0fo_\L]qYBdYr:g-_q=XaZrq$'Yrpg$XrU9dS!:BaO!pf.:roj[OkND!i
+jlPS&irS/urnmh7hYu=3gtVh^!SQ-)f)aIQrmUttdf.YociDDkc2u87bl5fcaoKQ^aT'<\`r3mV
+`;daQ_Z.IO_#1tI^AbhD]`5VC])9,=\Gs&:[f<c8[/I<4ZE^\6YlCp,Y5YO)XK/E$WWK/uW;`[r
+VPU-gV#R1iUAgkdT`:Y`T)YA]SGerWRfAfRR/WHOQMQmDPk^HqP5:==OSFn8Nr=t5N;SV1MX?8t
+MZ&J1N;eh9Nr>%<OT1IAP5^[FPl-gHQN!6JR/WNPRe<0?SFN0DT)G;\T_tM`UAq"eV#R7kVZ*Ln
+VuWgrWWB0%riH4(YPta0Z*L^B['fnA"h2"P\[oEP]F2Ee^V@S"_8=(,_o2Pn!li:$rlG,]!6Y8`
+s31Jer6G8erQt;dq9o/hp=0&krRUkts4I>(rS%;+s4mS/s5*e5ro!h8!94"<s5a4AroOIKkih9q
+lK[^7m/QJQmf)YVnF?&Jo)J=]o_nI_pAamcq#:*gqYL*er;6HRrdk*#s.]OD~>
+JcC<$JcC<$rVu0^q>L0fo_\L]qYBdYr:g-_q=XaZrq$'Yrpg$XrU9dS!:BaO!pf.:roj[OkND!i
+jlPS&irS/urnmh7hYu=3gtVh^!SQ-)f)aIQrmUttdf.YociDDkc2u87bl5fcaoKQ^aT'<\`r3mV
+`;daQ_Z.IO_#1tI^AbhD]`5VC])9,=\Gs&:[f<c8[/I<4ZE^\6YlCp,Y5YO)XK/E$WWK/uW;`[r
+VPU-gV#R1iUAgkdT`:Y`T)YA]SGerWRfAfRR/WHOQMQmDPk^HqP5:==OSFn8Nr=t5N;SV1MX?8t
+MZ&J1N;eh9Nr>%<OT1IAP5^[FPl-gHQN!6JR/WNPRe<0?SFN0DT)G;\T_tM`UAq"eV#R7kVZ*Ln
+VuWgrWWB0%riH4(YPta0Z*L^B['fnA"h2"P\[oEP]F2Ee^V@S"_8=(,_o2Pn!li:$rlG,]!6Y8`
+s31Jer6G8erQt;dq9o/hp=0&krRUkts4I>(rS%;+s4mS/s5*e5ro!h8!94"<s5a4AroOIKkih9q
+lK[^7m/QJQmf)YVnF?&Jo)J=]o_nI_pAamcq#:*gqYL*er;6HRrdk*#s.]OD~>
+JcC<$JcC<$rVu0^q>L0fo_\L]qYBdYr:g-_q=XaZrq$'Yrpg$XrU9dS!:BaO!pf.:roj[OkND!i
+jlPS&irS/urnmh7hYu=3gtVh^!SQ-)f)aIQrmUttdf.YociDDkc2u87bl5fcaoKQ^aT'<\`r3mV
+`;daQ_Z.IO_#1tI^AbhD]`5VC])9,=\Gs&:[f<c8[/I<4ZE^\6YlCp,Y5YO)XK/E$WWK/uW;`[r
+VPU-gV#R1iUAgkdT`:Y`T)YA]SGerWRfAfRR/WHOQMQmDPk^HqP5:==OSFn8Nr=t5N;SV1MX?8t
+MZ&J1N;eh9Nr>%<OT1IAP5^[FPl-gHQN!6JR/WNPRe<0?SFN0DT)G;\T_tM`UAq"eV#R7kVZ*Ln
+VuWgrWWB0%riH4(YPta0Z*L^B['fnA"h2"P\[oEP]F2Ee^V@S"_8=(,_o2Pn!li:$rlG,]!6Y8`
+s31Jer6G8erQt;dq9o/hp=0&krRUkts4I>(rS%;+s4mS/s5*e5ro!h8!94"<s5a4AroOIKkih9q
+lK[^7m/QJQmf)YVnF?&Jo)J=]o_nI_pAamcq#:*gqYL*er;6HRrdk*#s.]OD~>
+JcC<$JcC<$qu>s\qYg6foDAC\qYBdYr:g0`q=XaZrq$'Ys7--YrU9dSs6]gP!pf.:rojLJkNDj,
+!TiDAirS/urnmh7hYu=3gtVh^!SQ-)f*BmWe^W*te'e6C!mo9>rltSibfp(0s2k>`rQ,#Zs2OuU
+s2=rTr5/HLs1nNHs1\KGr4N'Arjr'=s1&*<rO2a6s0Vd3s0D[0rilF+!3Z='s/Z4$ri6!t!3#mp
+s/#dmrhTRhs.]Lds.B@arLX%[s.'%Ws-iqTr0[JMrKd,Ans&@%o90$6r/g`8rJpi9pPes,o8<C&
+q2G<4rf6o;s,d5BrK@2ErfmAHrg*SNr0[JOrgNVOr1*MPih$(?rLj%]s.]LfrM0LkVPa?js/5ps
+ri6"!/$,kTY-+t4Yd(I=Za7$H[^NZS\@K/]]=bei]tV7r^qmk(_Sa=1`Poj:a8X0[aT0K^bQ#fd
+c2>ldci2;edJMAge+;)eec"(qfDaG%g&9Y(g]-(-h>c=3hu2L5i;hm9ir\<'jo4BDkNM./klU/9
+li-5PmI'EAn,MkWnbr"[oCV\Rp&Facp\agcq>U6equ-HirT4$0s+13Cs*t~>
+JcC<$JcC<$qu>s\qYg6foDAC\qYBdYr:g0`q=XaZrq$'Ys7--YrU9dSs6]gP!pf.:rojLJkNDj,
+!TiDAirS/urnmh7hYu=3gtVh^!SQ-)f*BmWe^W*te'e6C!mo9>rltSibfp(0s2k>`rQ,#Zs2OuU
+s2=rTr5/HLs1nNHs1\KGr4N'Arjr'=s1&*<rO2a6s0Vd3s0D[0rilF+!3Z='s/Z4$ri6!t!3#mp
+s/#dmrhTRhs.]Lds.B@arLX%[s.'%Ws-iqTr0[JMrKd,Ans&@%o90$6r/g`8rJpi9pPes,o8<C&
+q2G<4rf6o;s,d5BrK@2ErfmAHrg*SNr0[JOrgNVOr1*MPih$(?rLj%]s.]LfrM0LkVPa?js/5ps
+ri6"!/$,kTY-+t4Yd(I=Za7$H[^NZS\@K/]]=bei]tV7r^qmk(_Sa=1`Poj:a8X0[aT0K^bQ#fd
+c2>ldci2;edJMAge+;)eec"(qfDaG%g&9Y(g]-(-h>c=3hu2L5i;hm9ir\<'jo4BDkNM./klU/9
+li-5PmI'EAn,MkWnbr"[oCV\Rp&Facp\agcq>U6equ-HirT4$0s+13Cs*t~>
+JcC<$JcC<$qu>s\qYg6foDAC\qYBdYr:g0`q=XaZrq$'Ys7--YrU9dSs6]gP!pf.:rojLJkNDj,
+!TiDAirS/urnmh7hYu=3gtVh^!SQ-)f*BmWe^W*te'e6C!mo9>rltSibfp(0s2k>`rQ,#Zs2OuU
+s2=rTr5/HLs1nNHs1\KGr4N'Arjr'=s1&*<rO2a6s0Vd3s0D[0rilF+!3Z='s/Z4$ri6!t!3#mp
+s/#dmrhTRhs.]Lds.B@arLX%[s.'%Ws-iqTr0[JMrKd,Ans&@%o90$6r/g`8rJpi9pPes,o8<C&
+q2G<4rf6o;s,d5BrK@2ErfmAHrg*SNr0[JOrgNVOr1*MPih$(?rLj%]s.]LfrM0LkVPa?js/5ps
+ri6"!/$,kTY-+t4Yd(I=Za7$H[^NZS\@K/]]=bei]tV7r^qmk(_Sa=1`Poj:a8X0[aT0K^bQ#fd
+c2>ldci2;edJMAge+;)eec"(qfDaG%g&9Y(g]-(-h>c=3hu2L5i;hm9ir\<'jo4BDkNM./klU/9
+li-5PmI'EAn,MkWnbr"[oCV\Rp&Facp\agcq>U6equ-HirT4$0s+13Cs*t~>
+JcC<$JcC<$q>]d[q>L-eo)&:[qYBdYr:g0`qXsj[rq$*Zs7-*XrpTmTs6]gPs6B[MrosIH!9a@D
+!TiDAirS/urnnCGhVR)EgtUT;g=b-2f@SU)ec+&!e'e6Cs3Lblrm(Pgs31Jcs2tA`rQ,#Zs2P#V
+rl"iSr5/HLrkSHHrkAEGr4N$@s180>s1&*<rO2a6!4;^2s0;X0rilF+!3Z:&!j&H'ri-%!W2T]n
+!iDfjrhKUjU8%X\s.KCarLX%[s.'%WrgNhSqO%5Jqj-!%p6>H<pQGK;rK-i9rJpf8hi.PorJpf:
+rfI/Br0%)Ds-3GHs-EYNrL!SPrgN_RrLEeVl^mR;qk3_XrhBFfr1s@hs/,dns/>sss/Q+"!3H1%
+!NrX*YQ;#7rj)d8[C3NQ\Gj#B]">Vf]tXK\!PlPN_?%Qmrl"oXa8X0[aT0K^bQ#cdc2>leci2;f
+dJ_Mke+2#bebn"nfDaG%g&0S'g]-(-h>c@3hu2I7iSrkrj8\3?jo4BDkNM./klU/9li-8Nm/ZSR
+n,MnWnc&+ZoDeI]p&Facp\agdq>U6equ$BirT4$0s+13Bs*t~>
+JcC<$JcC<$q>]d[q>L-eo)&:[qYBdYr:g0`qXsj[rq$*Zs7-*XrpTmTs6]gPs6B[MrosIH!9a@D
+!TiDAirS/urnnCGhVR)EgtUT;g=b-2f@SU)ec+&!e'e6Cs3Lblrm(Pgs31Jcs2tA`rQ,#Zs2P#V
+rl"iSr5/HLrkSHHrkAEGr4N$@s180>s1&*<rO2a6!4;^2s0;X0rilF+!3Z:&!j&H'ri-%!W2T]n
+!iDfjrhKUjU8%X\s.KCarLX%[s.'%WrgNhSqO%5Jqj-!%p6>H<pQGK;rK-i9rJpf8hi.PorJpf:
+rfI/Br0%)Ds-3GHs-EYNrL!SPrgN_RrLEeVl^mR;qk3_XrhBFfr1s@hs/,dns/>sss/Q+"!3H1%
+!NrX*YQ;#7rj)d8[C3NQ\Gj#B]">Vf]tXK\!PlPN_?%Qmrl"oXa8X0[aT0K^bQ#cdc2>leci2;f
+dJ_Mke+2#bebn"nfDaG%g&0S'g]-(-h>c@3hu2I7iSrkrj8\3?jo4BDkNM./klU/9li-8Nm/ZSR
+n,MnWnc&+ZoDeI]p&Facp\agdq>U6equ$BirT4$0s+13Bs*t~>
+JcC<$JcC<$q>]d[q>L-eo)&:[qYBdYr:g0`qXsj[rq$*Zs7-*XrpTmTs6]gPs6B[MrosIH!9a@D
+!TiDAirS/urnnCGhVR)EgtUT;g=b-2f@SU)ec+&!e'e6Cs3Lblrm(Pgs31Jcs2tA`rQ,#Zs2P#V
+rl"iSr5/HLrkSHHrkAEGr4N$@s180>s1&*<rO2a6!4;^2s0;X0rilF+!3Z:&!j&H'ri-%!W2T]n
+!iDfjrhKUjU8%X\s.KCarLX%[s.'%WrgNhSqO%5Jqj-!%p6>H<pQGK;rK-i9rJpf8hi.PorJpf:
+rfI/Br0%)Ds-3GHs-EYNrL!SPrgN_RrLEeVl^mR;qk3_XrhBFfr1s@hs/,dns/>sss/Q+"!3H1%
+!NrX*YQ;#7rj)d8[C3NQ\Gj#B]">Vf]tXK\!PlPN_?%Qmrl"oXa8X0[aT0K^bQ#cdc2>leci2;f
+dJ_Mke+2#bebn"nfDaG%g&0S'g]-(-h>c@3hu2I7iSrkrj8\3?jo4BDkNM./klU/9li-8Nm/ZSR
+n,MnWnc&+ZoDeI]p&Facp\agdq>U6equ$BirT4$0s+13Bs*t~>
+JcC<$JcC<$q#BXYq>L-eo)&7ZqYBgZr:g0`qt9s\rq$'Ys7--YrpTmTs6]gPs6B[MrosIH!9a@D
+!TiDAit:;0iS`YOhVR)EgtUT;g=b03rmq2%ec+&"e'c\Dd/q\@ci25ic2Z#ebQ#`bao0<[a8a0W
+`W*mU_u%=N_>_7J^](tI^&5PC]DoJ@\c92>\,E`:[C!=?Zi@?2Z2Us/YHG&-XTGT)X8]+#WMlcp
+VZN`lV>d:jUB%%eU&UecTDbA]Sc>5XS,SlTRJE6GQg9t#Q2?gEPPC=>Oo:C;O8P%7NUVo(NW"n6
+O8k=@Oo1CBPQ-mFQ2d0MQi*6NRJrZQS,JlVSbJ`MTB`*@U&C_bU\pqfV>mFkVuN^qWW&nLX/rD)
+Xfeh1YctC;ZEpmE[C*HO\%&uZ]"5Md]Y2%o^VIY$_SX4/`5T^8a2e2#!m/U-rlYAec-?44s3L\k
+r6bJkrR:Jiq:5;lpXfArrRq)%s4dP.rS@M1s53e5s5F";ro=%>s5j7B!pAe2rosIJ!:0XNs6]jS
+rpKpXnaZSK!qZ'VrUp3as7cHdrqZQiqYU6hqu,[VJcC<$T)X<~>
+JcC<$JcC<$q#BXYq>L-eo)&7ZqYBgZr:g0`qt9s\rq$'Ys7--YrpTmTs6]gPs6B[MrosIH!9a@D
+!TiDAit:;0iS`YOhVR)EgtUT;g=b03rmq2%ec+&"e'c\Dd/q\@ci25ic2Z#ebQ#`bao0<[a8a0W
+`W*mU_u%=N_>_7J^](tI^&5PC]DoJ@\c92>\,E`:[C!=?Zi@?2Z2Us/YHG&-XTGT)X8]+#WMlcp
+VZN`lV>d:jUB%%eU&UecTDbA]Sc>5XS,SlTRJE6GQg9t#Q2?gEPPC=>Oo:C;O8P%7NUVo(NW"n6
+O8k=@Oo1CBPQ-mFQ2d0MQi*6NRJrZQS,JlVSbJ`MTB`*@U&C_bU\pqfV>mFkVuN^qWW&nLX/rD)
+Xfeh1YctC;ZEpmE[C*HO\%&uZ]"5Md]Y2%o^VIY$_SX4/`5T^8a2e2#!m/U-rlYAec-?44s3L\k
+r6bJkrR:Jiq:5;lpXfArrRq)%s4dP.rS@M1s53e5s5F";ro=%>s5j7B!pAe2rosIJ!:0XNs6]jS
+rpKpXnaZSK!qZ'VrUp3as7cHdrqZQiqYU6hqu,[VJcC<$T)X<~>
+JcC<$JcC<$q#BXYq>L-eo)&7ZqYBgZr:g0`qt9s\rq$'Ys7--YrpTmTs6]gPs6B[MrosIH!9a@D
+!TiDAit:;0iS`YOhVR)EgtUT;g=b03rmq2%ec+&"e'c\Dd/q\@ci25ic2Z#ebQ#`bao0<[a8a0W
+`W*mU_u%=N_>_7J^](tI^&5PC]DoJ@\c92>\,E`:[C!=?Zi@?2Z2Us/YHG&-XTGT)X8]+#WMlcp
+VZN`lV>d:jUB%%eU&UecTDbA]Sc>5XS,SlTRJE6GQg9t#Q2?gEPPC=>Oo:C;O8P%7NUVo(NW"n6
+O8k=@Oo1CBPQ-mFQ2d0MQi*6NRJrZQS,JlVSbJ`MTB`*@U&C_bU\pqfV>mFkVuN^qWW&nLX/rD)
+Xfeh1YctC;ZEpmE[C*HO\%&uZ]"5Md]Y2%o^VIY$_SX4/`5T^8a2e2#!m/U-rlYAec-?44s3L\k
+r6bJkrR:Jiq:5;lpXfArrRq)%s4dP.rS@M1s53e5s5F";ro=%>s5j7B!pAe2rosIJ!:0XNs6]jS
+rpKpXnaZSK!qZ'VrUp3as7cHdrqZQiqYU6hqu,[VJcC<$T)X<~>
+JcC<$JcC<$pAaFWq>L-enb`.YqYBgZrV-9aqt9s\s7?0Zs7--YrU0gUmHso>s6B[MrosIH!9a@D
+!TiDAisar+iS`YOhqm2Fgt^Z`g&]mZrmq5&e^aZK!n5TGrm:eocd2U9s3:SfrQG5`s2k5\rl>&Y
+qo/TRrknWMs2"]Mr4i6Fs1SBDrk&3Arji'=s0r!9s0_m6rj2X1!3uO-s/uF*riQ4%!3?+!s/?!s
+rhodn!2]Xi!i)KarLs7as.B7]s.0.Zqj[PQrL*/BjHoY-p6GQ?rKI&?rfR,?pQ,*0qMk91q2bN:
+rfR,ArfdAHr0@;Js-NYNs-`nUr1!\UrginWr1EhYhkBn@rM04bs/#^lrMT[o!3,ps!irE(riH4(
+YPta1Z*L[AZa@.>[KX.M\[f;`rk&TO^;%Fu_84"*_o2Pn!QN1ZaT'?^b5TTabQ,odcMu5jd/;;j
+df._jeG@_kf(7Mlf_jG"gA]k+h#-".hZ)L3i;_d9ir8!<jT"?@joX`0kl0iHl2^/KliQSBmf)\T
+n,W"Wo)J:]o_nI_pAXgbq#:*gqYL*fr;6HVrdk*#s-s%=~>
+JcC<$JcC<$pAaFWq>L-enb`.YqYBgZrV-9aqt9s\s7?0Zs7--YrU0gUmHso>s6B[MrosIH!9a@D
+!TiDAisar+iS`YOhqm2Fgt^Z`g&]mZrmq5&e^aZK!n5TGrm:eocd2U9s3:SfrQG5`s2k5\rl>&Y
+qo/TRrknWMs2"]Mr4i6Fs1SBDrk&3Arji'=s0r!9s0_m6rj2X1!3uO-s/uF*riQ4%!3?+!s/?!s
+rhodn!2]Xi!i)KarLs7as.B7]s.0.Zqj[PQrL*/BjHoY-p6GQ?rKI&?rfR,?pQ,*0qMk91q2bN:
+rfR,ArfdAHr0@;Js-NYNs-`nUr1!\UrginWr1EhYhkBn@rM04bs/#^lrMT[o!3,ps!irE(riH4(
+YPta1Z*L[AZa@.>[KX.M\[f;`rk&TO^;%Fu_84"*_o2Pn!QN1ZaT'?^b5TTabQ,odcMu5jd/;;j
+df._jeG@_kf(7Mlf_jG"gA]k+h#-".hZ)L3i;_d9ir8!<jT"?@joX`0kl0iHl2^/KliQSBmf)\T
+n,W"Wo)J:]o_nI_pAXgbq#:*gqYL*fr;6HVrdk*#s-s%=~>
+JcC<$JcC<$pAaFWq>L-enb`.YqYBgZrV-9aqt9s\s7?0Zs7--YrU0gUmHso>s6B[MrosIH!9a@D
+!TiDAisar+iS`YOhqm2Fgt^Z`g&]mZrmq5&e^aZK!n5TGrm:eocd2U9s3:SfrQG5`s2k5\rl>&Y
+qo/TRrknWMs2"]Mr4i6Fs1SBDrk&3Arji'=s0r!9s0_m6rj2X1!3uO-s/uF*riQ4%!3?+!s/?!s
+rhodn!2]Xi!i)KarLs7as.B7]s.0.Zqj[PQrL*/BjHoY-p6GQ?rKI&?rfR,?pQ,*0qMk91q2bN:
+rfR,ArfdAHr0@;Js-NYNs-`nUr1!\UrginWr1EhYhkBn@rM04bs/#^lrMT[o!3,ps!irE(riH4(
+YPta1Z*L[AZa@.>[KX.M\[f;`rk&TO^;%Fu_84"*_o2Pn!QN1ZaT'?^b5TTabQ,odcMu5jd/;;j
+df._jeG@_kf(7Mlf_jG"gA]k+h#-".hZ)L3i;_d9ir8!<jT"?@joX`0kl0iHl2^/KliQSBmf)\T
+n,W"Wo)J:]o_nI_pAXgbq#:*gqYL*fr;6HVrdk*#s-s%=~>
+JcC<$JcC<$pAaCVq#1$dnGE%XqYBj[rV-<bqXsm\rq$*Zs7--YrU0gUmHso>s6B[MrosIH!9a@D
+!TiDAis4T&iS`YOhqn@g!SlH/g'?<`f[na+f%'cLs3gtrrmCbms3L\is3:SfrQG5`rlP)Zs2Y,Y
+r5JZRrknWMs2"]Mr4i9Gs1S?Cs189BrOMs<s0r!9s0Vj6rj2X1!3uL,#Ht;5Xf\\+X8].!WW/pr
+VZN`lV>d:jU]7(eU&UecTDY;[Sc5/US,A`MRG!u(Qi*0EQ2QsGPPLC?Oo1=$O8Y1=Oo(=APQ$gF
+Q2d0LQi3<ORJrZRS,SrWSbo#XTDbGRU$8<HU\LY`V>mFjVuN^qWVrguX/rE%XTu#4YHY79Z*OA8
+'=>0U[^WcV\[f;`]Y(qk^;%Fu_>_:U_o0O5`l?'ua8sE*rlb>c!6tJf!mf6?r6bPmrmU_nr71\q
+n^mWir7Uo"rnIG-qq_;/s53e5s5F";rT!q=!9O1A!pAe2rosIJs6K[N!q#FDrpTmVs7-*Zs7?9_
+rUp3as7cHds7uZjqYU6hqu,j[JcC<$QiDR~>
+JcC<$JcC<$pAaCVq#1$dnGE%XqYBj[rV-<bqXsm\rq$*Zs7--YrU0gUmHso>s6B[MrosIH!9a@D
+!TiDAis4T&iS`YOhqn@g!SlH/g'?<`f[na+f%'cLs3gtrrmCbms3L\is3:SfrQG5`rlP)Zs2Y,Y
+r5JZRrknWMs2"]Mr4i9Gs1S?Cs189BrOMs<s0r!9s0Vj6rj2X1!3uL,#Ht;5Xf\\+X8].!WW/pr
+VZN`lV>d:jU]7(eU&UecTDY;[Sc5/US,A`MRG!u(Qi*0EQ2QsGPPLC?Oo1=$O8Y1=Oo(=APQ$gF
+Q2d0LQi3<ORJrZRS,SrWSbo#XTDbGRU$8<HU\LY`V>mFjVuN^qWVrguX/rE%XTu#4YHY79Z*OA8
+'=>0U[^WcV\[f;`]Y(qk^;%Fu_>_:U_o0O5`l?'ua8sE*rlb>c!6tJf!mf6?r6bPmrmU_nr71\q
+n^mWir7Uo"rnIG-qq_;/s53e5s5F";rT!q=!9O1A!pAe2rosIJs6K[N!q#FDrpTmVs7-*Zs7?9_
+rUp3as7cHds7uZjqYU6hqu,j[JcC<$QiDR~>
+JcC<$JcC<$pAaCVq#1$dnGE%XqYBj[rV-<bqXsm\rq$*Zs7--YrU0gUmHso>s6B[MrosIH!9a@D
+!TiDAis4T&iS`YOhqn@g!SlH/g'?<`f[na+f%'cLs3gtrrmCbms3L\is3:SfrQG5`rlP)Zs2Y,Y
+r5JZRrknWMs2"]Mr4i9Gs1S?Cs189BrOMs<s0r!9s0Vj6rj2X1!3uL,#Ht;5Xf\\+X8].!WW/pr
+VZN`lV>d:jU]7(eU&UecTDY;[Sc5/US,A`MRG!u(Qi*0EQ2QsGPPLC?Oo1=$O8Y1=Oo(=APQ$gF
+Q2d0LQi3<ORJrZRS,SrWSbo#XTDbGRU$8<HU\LY`V>mFjVuN^qWVrguX/rE%XTu#4YHY79Z*OA8
+'=>0U[^WcV\[f;`]Y(qk^;%Fu_>_:U_o0O5`l?'ua8sE*rlb>c!6tJf!mf6?r6bPmrmU_nr71\q
+n^mWir7Uo"rnIG-qq_;/s53e5s5F";rT!q=!9O1A!pAe2rosIJs6K[N!q#FDrpTmVs7-*Zs7?9_
+rUp3as7cHds7uZjqYU6hqu,j[JcC<$QiDR~>
+JcC<$JcC<$p&F:Uq#1!cn,)qWqt]s\rV-<bqt9s\s7?3[s7--YrU9dS!:BdPs6B[MrosIH!9a@D
+#Nb%-j5].YiVqa9hqn@g#Me(gg=k65f`'J(f%&=Me,n+Idf.Yod/VGjcMu/hbl,`bb5TN\aSs6Z
+`r!aT`;[[O_Z.IO_#;%I^AknF]`5SD])B2>\,a#:[K<kD[/RB5ZE^\6YQD#2Y5YO)XK/E$WWK/u
+W;`^pV?!IkV#R4iUA^ecT`:Y]T)P;ZSG&HCRcg+1R/E<LQMHgEPl?mAP5LI<OS4b2OSt=<P5^[F
+Pl-gGQN*<MR/`TRRf/`USGo)WT)PA\T_Y;XU@=rBV#7(gVYd:kW;`dqWrK."XT#@%XoP[)YR@_A
+ZEpmE[C*HO\%)FJ"hM=Y]Y2&Y^C%cm_SX4/`5T^8a8X-bai_cLbKS2TrQYJjd*Va=s3gnqqpbVq
+r7:Mlpt5GrpY,T#rnRD,rnd\4r8@V6s5O";!p&J)rT41Ekii$1s6BXMrp9[P!:KgS!q>aMrpp*\
+s7H9_s7ZKer:p9erqcNhr;?KkmJ_\:JcCu7J,~>
+JcC<$JcC<$p&F:Uq#1!cn,)qWqt]s\rV-<bqt9s\s7?3[s7--YrU9dS!:BdPs6B[MrosIH!9a@D
+#Nb%-j5].YiVqa9hqn@g#Me(gg=k65f`'J(f%&=Me,n+Idf.Yod/VGjcMu/hbl,`bb5TN\aSs6Z
+`r!aT`;[[O_Z.IO_#;%I^AknF]`5SD])B2>\,a#:[K<kD[/RB5ZE^\6YQD#2Y5YO)XK/E$WWK/u
+W;`^pV?!IkV#R4iUA^ecT`:Y]T)P;ZSG&HCRcg+1R/E<LQMHgEPl?mAP5LI<OS4b2OSt=<P5^[F
+Pl-gGQN*<MR/`TRRf/`USGo)WT)PA\T_Y;XU@=rBV#7(gVYd:kW;`dqWrK."XT#@%XoP[)YR@_A
+ZEpmE[C*HO\%)FJ"hM=Y]Y2&Y^C%cm_SX4/`5T^8a8X-bai_cLbKS2TrQYJjd*Va=s3gnqqpbVq
+r7:Mlpt5GrpY,T#rnRD,rnd\4r8@V6s5O";!p&J)rT41Ekii$1s6BXMrp9[P!:KgS!q>aMrpp*\
+s7H9_s7ZKer:p9erqcNhr;?KkmJ_\:JcCu7J,~>
+JcC<$JcC<$p&F:Uq#1!cn,)qWqt]s\rV-<bqt9s\s7?3[s7--YrU9dS!:BdPs6B[MrosIH!9a@D
+#Nb%-j5].YiVqa9hqn@g#Me(gg=k65f`'J(f%&=Me,n+Idf.Yod/VGjcMu/hbl,`bb5TN\aSs6Z
+`r!aT`;[[O_Z.IO_#;%I^AknF]`5SD])B2>\,a#:[K<kD[/RB5ZE^\6YQD#2Y5YO)XK/E$WWK/u
+W;`^pV?!IkV#R4iUA^ecT`:Y]T)P;ZSG&HCRcg+1R/E<LQMHgEPl?mAP5LI<OS4b2OSt=<P5^[F
+Pl-gGQN*<MR/`TRRf/`USGo)WT)PA\T_Y;XU@=rBV#7(gVYd:kW;`dqWrK."XT#@%XoP[)YR@_A
+ZEpmE[C*HO\%)FJ"hM=Y]Y2&Y^C%cm_SX4/`5T^8a8X-bai_cLbKS2TrQYJjd*Va=s3gnqqpbVq
+r7:Mlpt5GrpY,T#rnRD,rnd\4r8@V6s5O";!p&J)rT41Ekii$1s6BXMrp9[P!:KgS!q>aMrpp*\
+s7H9_s7ZKer:p9erqcNhr;?KkmJ_\:JcCu7J,~>
+JcC<$JcC<$oDe(Sp\jmbn,)qWqt^!]rV-<bqt:!]s7?0Zs7$*YrU9dS!:BdPs6B[MrosIH!9a@D
+#Nb%-j5].YiVqa9hqn@g!o2Pbrn7D+f`'M&ec=8"eGn"tdf.Yod/VGjcMu/hbl#Z`b5]T\aSs6Z
+`r!aT`;[[P_Z%CO_#1tI^AknF]E5^V])B/@\@8sH[f<`8[/RE3Z2h0/YlCm,Y5YR'X8o=#WrK$u
+W;WUqVPU-fV#R4iUA^ebT`1S\T)G5WSCsD+RerNJR/NBMQMHgEPl6g?P3e>+P5^[EPl-gGQN*<L
+R/`TSRf/`TSH#/XT)PA^T_bA\UAL_CV"geaVY[4iW;`dpWrK."XT#@%XoP[)YlCs.ZMq02['fnA
+$FdOU\[oAa]Y(qlrkAWP_8=(,`;[^V`lJ)"!QiL`b6#o4c2Q#gcN)>jdJqYpe,7_pec"(nfD=.p
+g%3qrg\oq(h>Z:2hu)F4iW%p9j8\3?jo+<CkNM./l2U&Kli-8Nm/ZSQn,MkWnbr%YoDeI^p&=[b
+p\jmdq>U6fqu$BirUBf;s+133s*t~>
+JcC<$JcC<$oDe(Sp\jmbn,)qWqt^!]rV-<bqt:!]s7?0Zs7$*YrU9dS!:BdPs6B[MrosIH!9a@D
+#Nb%-j5].YiVqa9hqn@g!o2Pbrn7D+f`'M&ec=8"eGn"tdf.Yod/VGjcMu/hbl#Z`b5]T\aSs6Z
+`r!aT`;[[P_Z%CO_#1tI^AknF]E5^V])B/@\@8sH[f<`8[/RE3Z2h0/YlCm,Y5YR'X8o=#WrK$u
+W;WUqVPU-fV#R4iUA^ebT`1S\T)G5WSCsD+RerNJR/NBMQMHgEPl6g?P3e>+P5^[EPl-gGQN*<L
+R/`TSRf/`TSH#/XT)PA^T_bA\UAL_CV"geaVY[4iW;`dpWrK."XT#@%XoP[)YlCs.ZMq02['fnA
+$FdOU\[oAa]Y(qlrkAWP_8=(,`;[^V`lJ)"!QiL`b6#o4c2Q#gcN)>jdJqYpe,7_pec"(nfD=.p
+g%3qrg\oq(h>Z:2hu)F4iW%p9j8\3?jo+<CkNM./l2U&Kli-8Nm/ZSQn,MkWnbr%YoDeI^p&=[b
+p\jmdq>U6fqu$BirUBf;s+133s*t~>
+JcC<$JcC<$oDe(Sp\jmbn,)qWqt^!]rV-<bqt:!]s7?0Zs7$*YrU9dS!:BdPs6B[MrosIH!9a@D
+#Nb%-j5].YiVqa9hqn@g!o2Pbrn7D+f`'M&ec=8"eGn"tdf.Yod/VGjcMu/hbl#Z`b5]T\aSs6Z
+`r!aT`;[[P_Z%CO_#1tI^AknF]E5^V])B/@\@8sH[f<`8[/RE3Z2h0/YlCm,Y5YR'X8o=#WrK$u
+W;WUqVPU-fV#R4iUA^ebT`1S\T)G5WSCsD+RerNJR/NBMQMHgEPl6g?P3e>+P5^[EPl-gGQN*<L
+R/`TSRf/`TSH#/XT)PA^T_bA\UAL_CV"geaVY[4iW;`dpWrK."XT#@%XoP[)YlCs.ZMq02['fnA
+$FdOU\[oAa]Y(qlrkAWP_8=(,`;[^V`lJ)"!QiL`b6#o4c2Q#gcN)>jdJqYpe,7_pec"(nfD=.p
+g%3qrg\oq(h>Z:2hu)F4iW%p9j8\3?jo+<CkNM./l2U&Kli-8Nm/ZSQn,MkWnbr%YoDeI^p&=[b
+p\jmdq>U6fqu$BirUBf;s+133s*t~>
+JcC<$JcC<$oDe"Qp\jjan,)tXqt^!]rqHEcqt:!]rq$*Zs7$*YrU9dS!:BdPs6B[MrosIH!9a@D
+#Nb%-j5].YiVqa?hqm5Gh;$f?rn7G,f\$2Ts4.2#rm^tss3gkns3UelrQbGfs31A`s2t>_qoJcW
+rl4iSrl"iSr5/KMrkSKIs1\NHrk/9Cs183?s0r'<rjMj7!4;a3s0;X0rilF+!3Z='s/Z4$rMfpu
+W2T]ns/,gmrM9Igs.]Fbrh07_pn%>Ql^[+,r0mPOq3_,IrKd;Fr07,Ck*#Y+rfm;Frg*SNr0[MP
+s-inUrga"ZrLX"\rh01_rM':doq_&Qn##fVri#gqr2Tass/c4%s/uC*ricF.ZMq0<['d<M[^WcV
+\[f;`rk&TO^;%Fu_84"*_o2Pn#0+^)aN;QHrlY>dc2Q#gcN)>jdJqYpe,@eqec+.rfDF4sg$dYl
+g\oq'h>Z:1hu)F4iW%p8j8\3?jo4EBkPscFl2U&Kli-8NmJlVRn,MkWnbr%YoDeI]p&Facp\agd
+q>U6equ-HkrUBf;s+131s*t~>
+JcC<$JcC<$oDe"Qp\jjan,)tXqt^!]rqHEcqt:!]rq$*Zs7$*YrU9dS!:BdPs6B[MrosIH!9a@D
+#Nb%-j5].YiVqa?hqm5Gh;$f?rn7G,f\$2Ts4.2#rm^tss3gkns3UelrQbGfs31A`s2t>_qoJcW
+rl4iSrl"iSr5/KMrkSKIs1\NHrk/9Cs183?s0r'<rjMj7!4;a3s0;X0rilF+!3Z='s/Z4$rMfpu
+W2T]ns/,gmrM9Igs.]Fbrh07_pn%>Ql^[+,r0mPOq3_,IrKd;Fr07,Ck*#Y+rfm;Frg*SNr0[MP
+s-inUrga"ZrLX"\rh01_rM':doq_&Qn##fVri#gqr2Tass/c4%s/uC*ricF.ZMq0<['d<M[^WcV
+\[f;`rk&TO^;%Fu_84"*_o2Pn#0+^)aN;QHrlY>dc2Q#gcN)>jdJqYpe,@eqec+.rfDF4sg$dYl
+g\oq'h>Z:1hu)F4iW%p8j8\3?jo4EBkPscFl2U&Kli-8NmJlVRn,MkWnbr%YoDeI]p&Facp\agd
+q>U6equ-HkrUBf;s+131s*t~>
+JcC<$JcC<$oDe"Qp\jjan,)tXqt^!]rqHEcqt:!]rq$*Zs7$*YrU9dS!:BdPs6B[MrosIH!9a@D
+#Nb%-j5].YiVqa?hqm5Gh;$f?rn7G,f\$2Ts4.2#rm^tss3gkns3UelrQbGfs31A`s2t>_qoJcW
+rl4iSrl"iSr5/KMrkSKIs1\NHrk/9Cs183?s0r'<rjMj7!4;a3s0;X0rilF+!3Z='s/Z4$rMfpu
+W2T]ns/,gmrM9Igs.]Fbrh07_pn%>Ql^[+,r0mPOq3_,IrKd;Fr07,Ck*#Y+rfm;Frg*SNr0[MP
+s-inUrga"ZrLX"\rh01_rM':doq_&Qn##fVri#gqr2Tass/c4%s/uC*ricF.ZMq0<['d<M[^WcV
+\[f;`rk&TO^;%Fu_84"*_o2Pn#0+^)aN;QHrlY>dc2Q#gcN)>jdJqYpe,@eqec+.rfDF4sg$dYl
+g\oq'h>Z:1hu)F4iW%p8j8\3?jo4EBkPscFl2U&Kli-8NmJlVRn,MkWnbr%YoDeI]p&Facp\agd
+q>U6equ-HkrUBf;s+131s*t~>
+JcC<$JcC<$nc.bNp\jg`n,)tXr;$-_rqHEcr:U']s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D
+!p/M(ro4%=iVqa:hqm5hh#Z<crn@D*!8.8%!nPoPrm^tss3gkns3Uelr6G>erlk;`rlY5^qoJcW
+rl4iSs2=oSr5/KMs1nTJs1SKHrOi0B!4r->!k>_KrjDm9[']h=!j])9ricI-Y-.c+!j&H'ri6!t
+!3#jos/,gmrM9IgrhB:`rh01]n=J[2pmh)Jr0mSPqO%5JrKd8EqipH2r07#Brg*SNr0[MPrgNeT
+s.'(ZrLX%]rh01_rhBCeqP="bq52uGr2BRnql9Xrs/c1$s/uC*ricI/ZEjJ9!OT96[K3kIrj`'@
+]DfGH]tV7r^qp#e&AuH*`Q#p<aN2KGb0.uPc-?75!mf6?rmCbos3pqrs4.,"qq(f!r7USnq:kc$
+ptbr+rnmV2s5Et:rT!q=s5j4As6'FGrosIJs6K[Ns6]jSrpTmVs7-*Zs7?9_rUp3as7cHdrqZQi
+qtp?ir;H0bJcC<$NW4M~>
+JcC<$JcC<$nc.bNp\jg`n,)tXr;$-_rqHEcr:U']s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D
+!p/M(ro4%=iVqa:hqm5hh#Z<crn@D*!8.8%!nPoPrm^tss3gkns3Uelr6G>erlk;`rlY5^qoJcW
+rl4iSs2=oSr5/KMs1nTJs1SKHrOi0B!4r->!k>_KrjDm9[']h=!j])9ricI-Y-.c+!j&H'ri6!t
+!3#jos/,gmrM9IgrhB:`rh01]n=J[2pmh)Jr0mSPqO%5JrKd8EqipH2r07#Brg*SNr0[MPrgNeT
+s.'(ZrLX%]rh01_rhBCeqP="bq52uGr2BRnql9Xrs/c1$s/uC*ricI/ZEjJ9!OT96[K3kIrj`'@
+]DfGH]tV7r^qp#e&AuH*`Q#p<aN2KGb0.uPc-?75!mf6?rmCbos3pqrs4.,"qq(f!r7USnq:kc$
+ptbr+rnmV2s5Et:rT!q=s5j4As6'FGrosIJs6K[Ns6]jSrpTmVs7-*Zs7?9_rUp3as7cHdrqZQi
+qtp?ir;H0bJcC<$NW4M~>
+JcC<$JcC<$nc.bNp\jg`n,)tXr;$-_rqHEcr:U']s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D
+!p/M(ro4%=iVqa:hqm5hh#Z<crn@D*!8.8%!nPoPrm^tss3gkns3Uelr6G>erlk;`rlY5^qoJcW
+rl4iSs2=oSr5/KMs1nTJs1SKHrOi0B!4r->!k>_KrjDm9[']h=!j])9ricI-Y-.c+!j&H'ri6!t
+!3#jos/,gmrM9IgrhB:`rh01]n=J[2pmh)Jr0mSPqO%5JrKd8EqipH2r07#Brg*SNr0[MPrgNeT
+s.'(ZrLX%]rh01_rhBCeqP="bq52uGr2BRnql9Xrs/c1$s/uC*ricI/ZEjJ9!OT96[K3kIrj`'@
+]DfGH]tV7r^qp#e&AuH*`Q#p<aN2KGb0.uPc-?75!mf6?rmCbos3pqrs4.,"qq(f!r7USnq:kc$
+ptbr+rnmV2s5Et:rT!q=s5j4As6'FGrosIJs6K[Ns6]jSrpTmVs7-*Zs7?9_rUp3as7cHdrqZQi
+qtp?ir;H0bJcC<$NW4M~>
+JcC<$JcC<$nGhYMpAO^_n,)tXr;$0`rqHEcr:U']s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D
+!p/M(ro4%=iVqd8hZ2O4h#cBdg]#n.g"=sVfDjG%ec+(ue,RkpdJqSmci)/gc2PrabPoZ`ans0Y
+a8X*U`W*mU_u7IP_>h=L^]2"J^&>SF]=PTQ\c9/>\,Ni9[/dT5ZN@G;Z2Us/YHG&-XoGI&X8T%"
+WMlcoVuNXoV>R.hU]."aU&:SZT@]\2Sc##QS,SlTRJE6LQi*0BQ1L76Q2[*KQi!0MRK&`RS,]#Y
+Sc#)ZTDtS^U&UkdU\gkcV>R4UVsLAYWVWXoX8]3uXoGO(YPk[,Z*L\7ZQ?K][C3NQ\%&uZ]"5Md
+]Y2%n^V@S#_SX4.`5T^8a8X-\aiaV+!R/gfcMu2jd/MGmdf7eqeGn(uf)4/!f_sLrgA'Fsh"BM%
+hYuF/i;_d8ir%j:jT"??k5XWEkl0iHlMp2Lm/QJQmf)\TnGi%Wo)J=]o_nI_pAambq#C0hqYU0g
+r;?N`rdk*#s,?u.~>
+JcC<$JcC<$nGhYMpAO^_n,)tXr;$0`rqHEcr:U']s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D
+!p/M(ro4%=iVqd8hZ2O4h#cBdg]#n.g"=sVfDjG%ec+(ue,RkpdJqSmci)/gc2PrabPoZ`ans0Y
+a8X*U`W*mU_u7IP_>h=L^]2"J^&>SF]=PTQ\c9/>\,Ni9[/dT5ZN@G;Z2Us/YHG&-XoGI&X8T%"
+WMlcoVuNXoV>R.hU]."aU&:SZT@]\2Sc##QS,SlTRJE6LQi*0BQ1L76Q2[*KQi!0MRK&`RS,]#Y
+Sc#)ZTDtS^U&UkdU\gkcV>R4UVsLAYWVWXoX8]3uXoGO(YPk[,Z*L\7ZQ?K][C3NQ\%&uZ]"5Md
+]Y2%n^V@S#_SX4.`5T^8a8X-\aiaV+!R/gfcMu2jd/MGmdf7eqeGn(uf)4/!f_sLrgA'Fsh"BM%
+hYuF/i;_d8ir%j:jT"??k5XWEkl0iHlMp2Lm/QJQmf)\TnGi%Wo)J=]o_nI_pAambq#C0hqYU0g
+r;?N`rdk*#s,?u.~>
+JcC<$JcC<$nGhYMpAO^_n,)tXr;$0`rqHEcr:U']s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D
+!p/M(ro4%=iVqd8hZ2O4h#cBdg]#n.g"=sVfDjG%ec+(ue,RkpdJqSmci)/gc2PrabPoZ`ans0Y
+a8X*U`W*mU_u7IP_>h=L^]2"J^&>SF]=PTQ\c9/>\,Ni9[/dT5ZN@G;Z2Us/YHG&-XoGI&X8T%"
+WMlcoVuNXoV>R.hU]."aU&:SZT@]\2Sc##QS,SlTRJE6LQi*0BQ1L76Q2[*KQi!0MRK&`RS,]#Y
+Sc#)ZTDtS^U&UkdU\gkcV>R4UVsLAYWVWXoX8]3uXoGO(YPk[,Z*L\7ZQ?K][C3NQ\%&uZ]"5Md
+]Y2%n^V@S#_SX4.`5T^8a8X-\aiaV+!R/gfcMu2jd/MGmdf7eqeGn(uf)4/!f_sLrgA'Fsh"BM%
+hYuF/i;_d8ir%j:jT"??k5XWEkl0iHlMp2Lm/QJQmf)\TnGi%Wo)J=]o_nI_pAambq#C0hqYU0g
+r;?N`rdk*#s,?u.~>
+JcC<$JcC<$nGhSKpAO[^n,*"Yr;$0`rqHEcr:U*^s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D
+s5a7Aro47CiSi_Qhr!;ih>c71g]#q,g&K_(fDjG%ec+(ue,RkodJqSmchu)fc2PrabPfT_ans0Y
+a8a0W`W!gU_u7IP_>h=M^]2%J^&G\E])]GA\c9/>\,Ni9[/dT5Zi@<2Z2V!-Y5ka)XoGL&X8].!
+WW/pqVuNXoV>I(fU]."]U%+f<TCe`QSc,)SS,SlTRJE6KQi!*7Q2HsHQi!0LRK&`RS,]#YSc#)Z
+TDtS^U&UkeU\gkdV>d@eVtd4PWUm.gX8]3tXoGR(YPk[,Z*L\7Zi@B4[JmTB\%&rY\[oDb]Y(ql
+rkAfU_8=(,`5KX6`lJ)"#0G$2bKS2TrltPjd/MGmdf7eqeGn)!f)4/!f`'S"gA9Ruh!j.thYl@.
+i;V^7ir%j:jT"??k5XWEkl'cGlMp2Lm/QJQmf)\TnGi%Wo)J=]o_nI_pAambq#C0hqYL*fr;?Na
+rdk*#s,6o-~>
+JcC<$JcC<$nGhSKpAO[^n,*"Yr;$0`rqHEcr:U*^s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D
+s5a7Aro47CiSi_Qhr!;ih>c71g]#q,g&K_(fDjG%ec+(ue,RkodJqSmchu)fc2PrabPfT_ans0Y
+a8a0W`W!gU_u7IP_>h=M^]2%J^&G\E])]GA\c9/>\,Ni9[/dT5Zi@<2Z2V!-Y5ka)XoGL&X8].!
+WW/pqVuNXoV>I(fU]."]U%+f<TCe`QSc,)SS,SlTRJE6KQi!*7Q2HsHQi!0LRK&`RS,]#YSc#)Z
+TDtS^U&UkeU\gkdV>d@eVtd4PWUm.gX8]3tXoGR(YPk[,Z*L\7Zi@B4[JmTB\%&rY\[oDb]Y(ql
+rkAfU_8=(,`5KX6`lJ)"#0G$2bKS2TrltPjd/MGmdf7eqeGn)!f)4/!f`'S"gA9Ruh!j.thYl@.
+i;V^7ir%j:jT"??k5XWEkl'cGlMp2Lm/QJQmf)\TnGi%Wo)J=]o_nI_pAambq#C0hqYL*fr;?Na
+rdk*#s,6o-~>
+JcC<$JcC<$nGhSKpAO[^n,*"Yr;$0`rqHEcr:U*^s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D
+s5a7Aro47CiSi_Qhr!;ih>c71g]#q,g&K_(fDjG%ec+(ue,RkodJqSmchu)fc2PrabPfT_ans0Y
+a8a0W`W!gU_u7IP_>h=M^]2%J^&G\E])]GA\c9/>\,Ni9[/dT5Zi@<2Z2V!-Y5ka)XoGL&X8].!
+WW/pqVuNXoV>I(fU]."]U%+f<TCe`QSc,)SS,SlTRJE6KQi!*7Q2HsHQi!0LRK&`RS,]#YSc#)Z
+TDtS^U&UkeU\gkdV>d@eVtd4PWUm.gX8]3tXoGR(YPk[,Z*L\7Zi@B4[JmTB\%&rY\[oDb]Y(ql
+rkAfU_8=(,`5KX6`lJ)"#0G$2bKS2TrltPjd/MGmdf7eqeGn)!f)4/!f`'S"gA9Ruh!j.thYl@.
+i;V^7ir%j:jT"??k5XWEkl'cGlMp2Lm/QJQmf)\TnGi%Wo)J=]o_nI_pAambq#C0hqYL*fr;?Na
+rdk*#s,6o-~>
+JcC<$JcC<$mJl8Hp&4R]nb`4[r;$3arqHEcr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojIIkPjWD
+jT+B@ir\6!iVqa:hqm5hh#cBdg]#q,f`9\'fDjG%ec""te,RkodJqSmchl#ec2Pr`bPoZ`ans0Y
+a8a0W`W*mV_u7IP_>h=M^]2"J^&G\E]DoJA\HfXR\$i`Q[C#q>s0;X0rilF+s/u@'!j&H'rMoms
+s/>morhf^lqP=(br1_i;pRqDUpn%GTrLE_RrL3\QpmCoEns90>q3_/Ls-ikTrga"ZrLX"\s.K=a
+s.]Lfr1s@hrhfOir2BLlfrFqMrN,muriZ:)rNQ=,s0DX1s0Md6rjMj9!4`$=!P5oB]F)?d^V@S"
+_8=(,`;[^e`lH0Aai_cLbKS5UcHab^d/MDodaQ\EeGn)!f)=5#f`'S#gATe&h!NqohYZ4+i;V^7
+iqqd9jT"?>k5XWEkl'cGlMp2Lm/QJQmeuSUnF?&Io)J=]o_nI_pAambq#:*gqYU0gr;?N`rdk*#
+s,6o-~>
+JcC<$JcC<$mJl8Hp&4R]nb`4[r;$3arqHEcr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojIIkPjWD
+jT+B@ir\6!iVqa:hqm5hh#cBdg]#q,f`9\'fDjG%ec""te,RkodJqSmchl#ec2Pr`bPoZ`ans0Y
+a8a0W`W*mV_u7IP_>h=M^]2"J^&G\E]DoJA\HfXR\$i`Q[C#q>s0;X0rilF+s/u@'!j&H'rMoms
+s/>morhf^lqP=(br1_i;pRqDUpn%GTrLE_RrL3\QpmCoEns90>q3_/Ls-ikTrga"ZrLX"\s.K=a
+s.]Lfr1s@hrhfOir2BLlfrFqMrN,muriZ:)rNQ=,s0DX1s0Md6rjMj9!4`$=!P5oB]F)?d^V@S"
+_8=(,`;[^e`lH0Aai_cLbKS5UcHab^d/MDodaQ\EeGn)!f)=5#f`'S#gATe&h!NqohYZ4+i;V^7
+iqqd9jT"?>k5XWEkl'cGlMp2Lm/QJQmeuSUnF?&Io)J=]o_nI_pAambq#:*gqYU0gr;?N`rdk*#
+s,6o-~>
+JcC<$JcC<$mJl8Hp&4R]nb`4[r;$3arqHEcr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojIIkPjWD
+jT+B@ir\6!iVqa:hqm5hh#cBdg]#q,f`9\'fDjG%ec""te,RkodJqSmchl#ec2Pr`bPoZ`ans0Y
+a8a0W`W*mV_u7IP_>h=M^]2"J^&G\E]DoJA\HfXR\$i`Q[C#q>s0;X0rilF+s/u@'!j&H'rMoms
+s/>morhf^lqP=(br1_i;pRqDUpn%GTrLE_RrL3\QpmCoEns90>q3_/Ls-ikTrga"ZrLX"\s.K=a
+s.]Lfr1s@hrhfOir2BLlfrFqMrN,muriZ:)rNQ=,s0DX1s0Md6rjMj9!4`$=!P5oB]F)?d^V@S"
+_8=(,`;[^e`lH0Aai_cLbKS5UcHab^d/MDodaQ\EeGn)!f)=5#f`'S#gATe&h!NqohYZ4+i;V^7
+iqqd9jT"?>k5XWEkl'cGlMp2Lm/QJQmeuSUnF?&Io)J=]o_nI_pAambq#:*gqYU0gr;?N`rdk*#
+s,6o-~>
+JcC<$JcC<$m/Q,Fo_nL]nb`4[rV?<brqHEcr:U*^s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D
+s5a7Aro=%<!9*q8!oMkkrn[V0!8IJ+!nl5YrR_)#s4.(ts3ptqr6bMjrm1JerltDcqoeu]rlP&Y
+s2Y,YrPefTs24fP!l;[frkJKIs1SEE!kZ%Trj`*?\$u@F!k#DBrj)[3Z*F;4!jAc0riQ4%s/Z*u
+s/H$sr29Okrh]FdqP38KkFqgHr1EhWrLNnWqO@GPrL)Q1rgEbSqj[VUrgj"Zs.B:`rLs7cs.fLf
+s/#^lqksFlrMfFhj/_sVpoXOuric7(s0;U0rj2X3s0_j7&@]0Z\[f;_]=bei]tV7r^qp#e$H'g$
+`Q#p<aN2KGrlY>dc2Puncd:%ddF-Ilrm^tus47/#s4IA)qqD&(r7pl!p>5W&pYc#/rSmb8roF(?
+rT=.Cs60CFs69UMrTsROs6fjSs6p$YrUU![s7H9_rq?Bdr:p<frqcKgrVZTlo)=4?JcCW-J,~>
+JcC<$JcC<$m/Q,Fo_nL]nb`4[rV?<brqHEcr:U*^s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D
+s5a7Aro=%<!9*q8!oMkkrn[V0!8IJ+!nl5YrR_)#s4.(ts3ptqr6bMjrm1JerltDcqoeu]rlP&Y
+s2Y,YrPefTs24fP!l;[frkJKIs1SEE!kZ%Trj`*?\$u@F!k#DBrj)[3Z*F;4!jAc0riQ4%s/Z*u
+s/H$sr29Okrh]FdqP38KkFqgHr1EhWrLNnWqO@GPrL)Q1rgEbSqj[VUrgj"Zs.B:`rLs7cs.fLf
+s/#^lqksFlrMfFhj/_sVpoXOuric7(s0;U0rj2X3s0_j7&@]0Z\[f;_]=bei]tV7r^qp#e$H'g$
+`Q#p<aN2KGrlY>dc2Puncd:%ddF-Ilrm^tus47/#s4IA)qqD&(r7pl!p>5W&pYc#/rSmb8roF(?
+rT=.Cs60CFs69UMrTsROs6fjSs6p$YrUU![s7H9_rq?Bdr:p<frqcKgrVZTlo)=4?JcCW-J,~>
+JcC<$JcC<$m/Q,Fo_nL]nb`4[rV?<brqHEcr:U*^s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D
+s5a7Aro=%<!9*q8!oMkkrn[V0!8IJ+!nl5YrR_)#s4.(ts3ptqr6bMjrm1JerltDcqoeu]rlP&Y
+s2Y,YrPefTs24fP!l;[frkJKIs1SEE!kZ%Trj`*?\$u@F!k#DBrj)[3Z*F;4!jAc0riQ4%s/Z*u
+s/H$sr29Okrh]FdqP38KkFqgHr1EhWrLNnWqO@GPrL)Q1rgEbSqj[VUrgj"Zs.B:`rLs7cs.fLf
+s/#^lqksFlrMfFhj/_sVpoXOuric7(s0;U0rj2X3s0_j7&@]0Z\[f;_]=bei]tV7r^qp#e$H'g$
+`Q#p<aN2KGrlY>dc2Puncd:%ddF-Ilrm^tus47/#s4IA)qqD&(r7pl!p>5W&pYc#/rSmb8roF(?
+rT=.Cs60CFs69UMrTsROs6fjSs6p$YrUU![s7H9_rq?Bdr:p<frqcKgrVZTlo)=4?JcCW-J,~>
+JcC<$JcC<$lMolCo_nI\o)&@]rV?<brqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:roj[OkND!i
+jlPS&j8\*=iVqd8hZ2O3h#cBdg]#q,g&K_'fDjG%ebmqse,IendJhMkchl#dc2Pr`bQ#`aao'6Z
+a8a0X`W*mV_u@OQ_>h=M^B2-_^&G\E])]GA\H9:M\,Nf;[C!=?ZN@G;Z2V!-Y5ka(XoGL&X8T'u
+WW&joVu<LkV=:;>U\UYXU&CY_TDG/YSc,)SS,A`PRIHU@RJiTOS,SrXSc#)ZTDtS^U&UkeU]%"f
+V>mFjVuEXoWVNRkX7NFNXo,@$YPYR(Z2_-.Zi@E4[JmT9\%&sI\H0:Rrk&9F^AbkJ^qp#e"iJ9t
+`Q#sta8sE*rlY>dc2Puhcd;[=!n,QHrmV#"f%0fOs4IA)r7_/)rnR8(ptk]$oAKQ*rSm_7roF(?
+r9"%Bs60FGs6BXMrTsROs6fjSs7$'YrUU![s7H9_s7ZKer:p9erqcNhrVZTlnc"+>JcCW-J,~>
+JcC<$JcC<$lMolCo_nI\o)&@]rV?<brqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:roj[OkND!i
+jlPS&j8\*=iVqd8hZ2O3h#cBdg]#q,g&K_'fDjG%ebmqse,IendJhMkchl#dc2Pr`bQ#`aao'6Z
+a8a0X`W*mV_u@OQ_>h=M^B2-_^&G\E])]GA\H9:M\,Nf;[C!=?ZN@G;Z2V!-Y5ka(XoGL&X8T'u
+WW&joVu<LkV=:;>U\UYXU&CY_TDG/YSc,)SS,A`PRIHU@RJiTOS,SrXSc#)ZTDtS^U&UkeU]%"f
+V>mFjVuEXoWVNRkX7NFNXo,@$YPYR(Z2_-.Zi@E4[JmT9\%&sI\H0:Rrk&9F^AbkJ^qp#e"iJ9t
+`Q#sta8sE*rlY>dc2Puhcd;[=!n,QHrmV#"f%0fOs4IA)r7_/)rnR8(ptk]$oAKQ*rSm_7roF(?
+r9"%Bs60FGs6BXMrTsROs6fjSs7$'YrUU![s7H9_s7ZKer:p9erqcNhrVZTlnc"+>JcCW-J,~>
+JcC<$JcC<$lMolCo_nI\o)&@]rV?<brqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:roj[OkND!i
+jlPS&j8\*=iVqd8hZ2O3h#cBdg]#q,g&K_'fDjG%ebmqse,IendJhMkchl#dc2Pr`bQ#`aao'6Z
+a8a0X`W*mV_u@OQ_>h=M^B2-_^&G\E])]GA\H9:M\,Nf;[C!=?ZN@G;Z2V!-Y5ka(XoGL&X8T'u
+WW&joVu<LkV=:;>U\UYXU&CY_TDG/YSc,)SS,A`PRIHU@RJiTOS,SrXSc#)ZTDtS^U&UkeU]%"f
+V>mFjVuEXoWVNRkX7NFNXo,@$YPYR(Z2_-.Zi@E4[JmT9\%&sI\H0:Rrk&9F^AbkJ^qp#e"iJ9t
+`Q#sta8sE*rlY>dc2Puhcd;[=!n,QHrmV#"f%0fOs4IA)r7_/)rnR8(ptk]$oAKQ*rSm_7roF(?
+r9"%Bs60FGs6BXMrTsROs6fjSs7$'YrUU![s7H9_s7ZKer:p9erqcNhrVZTlnc"+>JcCW-J,~>
+JcC<$JcC<$kl9W@oDSC\o_\R_rV?<brqHHdr:U*^s7?3[s7--YrpTmT!:BdPs6K^MrojLJkNDj,
+!p/M(ro4(>iSjdo!oMkkrn[V0s4dP,s4RG)rR_)#rmgqrs3ptqqU,;hrm1GdrQY>cqoeu]s2k2[
+s2Y/ZrPefT!5ncP!l;[frkJKI!58BEs189Brji'=!4Vs9s0Vj6rj2X1!3uL,!jAc0rN6+$s/Z't
+s/H!rqPX7gq5)W;qkO(`q4[b[rh'%YrLNnWpRCoGrgEMLpm_8QrgitYs.B=ar1X.bs.fOgs/#^l
+rMTXnri,dprN#jtfrb(Qr3,t$riuI.rNlO2s0_j7s0i!<rj`cT]=Y_g]tM.p^VIY$_SX4/`5T^8
+a8X-kai_fMbfn>WcHjkadF$Cje,IkseH"2!fDjJ'g&0S'g]-()h>?((hsB:uiVhd3j8S-=jo"9@
+kPj]Dl2U&Kli$2MmJlVQn,MnWnbr%YoDeI]p&Fabp\jmdq>U6equ-HjrUTr=s+13,s*t~>
+JcC<$JcC<$kl9W@oDSC\o_\R_rV?<brqHHdr:U*^s7?3[s7--YrpTmT!:BdPs6K^MrojLJkNDj,
+!p/M(ro4(>iSjdo!oMkkrn[V0s4dP,s4RG)rR_)#rmgqrs3ptqqU,;hrm1GdrQY>cqoeu]s2k2[
+s2Y/ZrPefT!5ncP!l;[frkJKI!58BEs189Brji'=!4Vs9s0Vj6rj2X1!3uL,!jAc0rN6+$s/Z't
+s/H!rqPX7gq5)W;qkO(`q4[b[rh'%YrLNnWpRCoGrgEMLpm_8QrgitYs.B=ar1X.bs.fOgs/#^l
+rMTXnri,dprN#jtfrb(Qr3,t$riuI.rNlO2s0_j7s0i!<rj`cT]=Y_g]tM.p^VIY$_SX4/`5T^8
+a8X-kai_fMbfn>WcHjkadF$Cje,IkseH"2!fDjJ'g&0S'g]-()h>?((hsB:uiVhd3j8S-=jo"9@
+kPj]Dl2U&Kli$2MmJlVQn,MnWnbr%YoDeI]p&Fabp\jmdq>U6equ-HjrUTr=s+13,s*t~>
+JcC<$JcC<$kl9W@oDSC\o_\R_rV?<brqHHdr:U*^s7?3[s7--YrpTmT!:BdPs6K^MrojLJkNDj,
+!p/M(ro4(>iSjdo!oMkkrn[V0s4dP,s4RG)rR_)#rmgqrs3ptqqU,;hrm1GdrQY>cqoeu]s2k2[
+s2Y/ZrPefT!5ncP!l;[frkJKI!58BEs189Brji'=!4Vs9s0Vj6rj2X1!3uL,!jAc0rN6+$s/Z't
+s/H!rqPX7gq5)W;qkO(`q4[b[rh'%YrLNnWpRCoGrgEMLpm_8QrgitYs.B=ar1X.bs.fOgs/#^l
+rMTXnri,dprN#jtfrb(Qr3,t$riuI.rNlO2s0_j7s0i!<rj`cT]=Y_g]tM.p^VIY$_SX4/`5T^8
+a8X-kai_fMbfn>WcHjkadF$Cje,IkseH"2!fDjJ'g&0S'g]-()h>?((hsB:uiVhd3j8S-=jo"9@
+kPj]Dl2U&Kli$2MmJlVQn,MnWnbr%YoDeI]p&Fabp\jmdq>U6equ-HjrUTr=s+13,s*t~>
+JcC<$JcC<$kPsH=oDSF]o_\R_rV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj,
+!p/M(ro4(>iSjdos5*h5rS@M/!8IJ+s4RG)r7Cu"s4."rrmUkpqU,;hrQk>crltGdr6,)^s2k2[
+s2Y/Zrl+oUs24iQs1n]NrkJKI!58BEs189Brji'=!4Vs9s0Vj6rj2X1s0;R-s0)I*rN6+$s/Z't
+ri,jppS[Y\iMH1Br1j4bqP!n]rL`qXrLNkVjI?+<rLNkXrh'4`r1X.bs.fOgs/#amr29Rnri,gq
+ri?"!pT=(jj0/3]riuI.r3QF1s0_g6s0i!<rji'?!5&6C$ba9g^V@S#_8=(,`;[^_`lH0AaiV]K
+bKS61c2l8<rm:eqe'n<G!nGlQrn%2&!87>)rnIJ.qq_2,r86l!pYl#/puDA7roO%>s6'CFrTX=H
+s6KXMs6]jSrU9dUs7-'Ys7?9_rUp3arqH?cs7uZjqYU6hr;H0bJcC<$M>r)~>
+JcC<$JcC<$kPsH=oDSF]o_\R_rV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj,
+!p/M(ro4(>iSjdos5*h5rS@M/!8IJ+s4RG)r7Cu"s4."rrmUkpqU,;hrQk>crltGdr6,)^s2k2[
+s2Y/Zrl+oUs24iQs1n]NrkJKI!58BEs189Brji'=!4Vs9s0Vj6rj2X1s0;R-s0)I*rN6+$s/Z't
+ri,jppS[Y\iMH1Br1j4bqP!n]rL`qXrLNkVjI?+<rLNkXrh'4`r1X.bs.fOgs/#amr29Rnri,gq
+ri?"!pT=(jj0/3]riuI.r3QF1s0_g6s0i!<rji'?!5&6C$ba9g^V@S#_8=(,`;[^_`lH0AaiV]K
+bKS61c2l8<rm:eqe'n<G!nGlQrn%2&!87>)rnIJ.qq_2,r86l!pYl#/puDA7roO%>s6'CFrTX=H
+s6KXMs6]jSrU9dUs7-'Ys7?9_rUp3arqH?cs7uZjqYU6hr;H0bJcC<$M>r)~>
+JcC<$JcC<$kPsH=oDSF]o_\R_rV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj,
+!p/M(ro4(>iSjdos5*h5rS@M/!8IJ+s4RG)r7Cu"s4."rrmUkpqU,;hrQk>crltGdr6,)^s2k2[
+s2Y/Zrl+oUs24iQs1n]NrkJKI!58BEs189Brji'=!4Vs9s0Vj6rj2X1s0;R-s0)I*rN6+$s/Z't
+ri,jppS[Y\iMH1Br1j4bqP!n]rL`qXrLNkVjI?+<rLNkXrh'4`r1X.bs.fOgs/#amr29Rnri,gq
+ri?"!pT=(jj0/3]riuI.r3QF1s0_g6s0i!<rji'?!5&6C$ba9g^V@S#_8=(,`;[^_`lH0AaiV]K
+bKS61c2l8<rm:eqe'n<G!nGlQrn%2&!87>)rnIJ.qq_2,r86l!pYl#/puDA7roO%>s6'CFrTX=H
+s6KXMs6]jSrU9dUs7-'Ys7?9_rUp3arqH?cs7uZjqYU6hr;H0bJcC<$M>r)~>
+JcC<$JcC<$jo=3:oDSF]p&"^arV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj,
+!p/M(ro=%<!9*n7!oMkkrS7P1gY;\\s4RD(rR_&"s4."rrR:boq9f2grQkAdrltGdr6,,_rlP,[
+s2P,ZrPefT!5ncP!l;[frkANK]tOEX!kZ%Trj`'>\,E`:[C!=?Zi@<2Z2Lp,YQ(d(XoGL%X8Apq
+WVi^FVtd.dV>-kbU]."aU&CY`TD5#USbJZQS+iHOSberWTDtS^U&UkdU]%"gV>mFkVuEXpWVidq
+X8]3sXo,?uYL]rVZ2M!*Zi7?3[JdQ6[fEr:\Hf^X]=bei]tXK\!PlPN_@OQ&`Poj:a2l?Db0%oN
+bg$.4!RK-ld/h\Erm^tu!7q/$s4IA)rn@D,rnRG-rndV2oAK9"pYto,rT*q=qr[n@s60CFs6BXM
+r9XINs6fjSs7$'YrUU![s7H9_rq?Bdr:p9erqcNhrVZTlnc"+>JcCQ+J,~>
+JcC<$JcC<$jo=3:oDSF]p&"^arV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj,
+!p/M(ro=%<!9*n7!oMkkrS7P1gY;\\s4RD(rR_&"s4."rrR:boq9f2grQkAdrltGdr6,,_rlP,[
+s2P,ZrPefT!5ncP!l;[frkANK]tOEX!kZ%Trj`'>\,E`:[C!=?Zi@<2Z2Lp,YQ(d(XoGL%X8Apq
+WVi^FVtd.dV>-kbU]."aU&CY`TD5#USbJZQS+iHOSberWTDtS^U&UkdU]%"gV>mFkVuEXpWVidq
+X8]3sXo,?uYL]rVZ2M!*Zi7?3[JdQ6[fEr:\Hf^X]=bei]tXK\!PlPN_@OQ&`Poj:a2l?Db0%oN
+bg$.4!RK-ld/h\Erm^tu!7q/$s4IA)rn@D,rnRG-rndV2oAK9"pYto,rT*q=qr[n@s60CFs6BXM
+r9XINs6fjSs7$'YrUU![s7H9_rq?Bdr:p9erqcNhrVZTlnc"+>JcCQ+J,~>
+JcC<$JcC<$jo=3:oDSF]p&"^arV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj,
+!p/M(ro=%<!9*n7!oMkkrS7P1gY;\\s4RD(rR_&"s4."rrR:boq9f2grQkAdrltGdr6,,_rlP,[
+s2P,ZrPefT!5ncP!l;[frkANK]tOEX!kZ%Trj`'>\,E`:[C!=?Zi@<2Z2Lp,YQ(d(XoGL%X8Apq
+WVi^FVtd.dV>-kbU]."aU&CY`TD5#USbJZQS+iHOSberWTDtS^U&UkdU]%"gV>mFkVuEXpWVidq
+X8]3sXo,?uYL]rVZ2M!*Zi7?3[JdQ6[fEr:\Hf^X]=bei]tXK\!PlPN_@OQ&`Poj:a2l?Db0%oN
+bg$.4!RK-ld/h\Erm^tu!7q/$s4IA)rn@D,rnRG-rndV2oAK9"pYto,rT*q=qr[n@s60CFs6BXM
+r9XINs6fjSs7$'YrUU![s7H9_rq?Bdr:p9erqcNhrVZTlnc"+>JcCQ+J,~>
+JcC<$JcC<$jT"$7oDSI^pA=gbrV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj,
+s5a7Aro=%<s5Et8s53k5rn[V0s4dM+rn7>(r7Cr!rmgkprmUhoq9f2grm1JerltGdrQG2_s2k8]
+s2Y/Zrl+oUs24iQ!l;[frkANK]tOEX!kZ%Trj`*?\$u@F!k#DBrj2X1s0;O,s0)I*r2p"#ri>jp
+qPiGPm&0cYrMB=crhKFdqP!n]rL`eTn"'3Erh'1_r1X.brhKFfs/#amrMTXns/Gssri?(#qlTh"
+rNG^pi3E0bqQp1.rjD^5s0r$<rOE!@]=\'T'tq>q^V@S"_8=(,_o0O5`l?'?aN;U(b5oi3rltPj
+d/MDndaS3F!nGlQrmq5(g"HAYs4dS/r8%A/rnmM/q;Lr)nDjH-rT3n<roa=Fr9=4Gs6KXMrpBaR
+rU9dUs7-'Ys7?9_r:U*`s7cHdrqZQiqYU6hr;H0bJcC<$M#Vu~>
+JcC<$JcC<$jT"$7oDSI^pA=gbrV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj,
+s5a7Aro=%<s5Et8s53k5rn[V0s4dM+rn7>(r7Cr!rmgkprmUhoq9f2grm1JerltGdrQG2_s2k8]
+s2Y/Zrl+oUs24iQ!l;[frkANK]tOEX!kZ%Trj`*?\$u@F!k#DBrj2X1s0;O,s0)I*r2p"#ri>jp
+qPiGPm&0cYrMB=crhKFdqP!n]rL`eTn"'3Erh'1_r1X.brhKFfs/#amrMTXns/Gssri?(#qlTh"
+rNG^pi3E0bqQp1.rjD^5s0r$<rOE!@]=\'T'tq>q^V@S"_8=(,_o0O5`l?'?aN;U(b5oi3rltPj
+d/MDndaS3F!nGlQrmq5(g"HAYs4dS/r8%A/rnmM/q;Lr)nDjH-rT3n<roa=Fr9=4Gs6KXMrpBaR
+rU9dUs7-'Ys7?9_r:U*`s7cHdrqZQiqYU6hr;H0bJcC<$M#Vu~>
+JcC<$JcC<$jT"$7oDSI^pA=gbrV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj,
+s5a7Aro=%<s5Et8s53k5rn[V0s4dM+rn7>(r7Cr!rmgkprmUhoq9f2grm1JerltGdrQG2_s2k8]
+s2Y/Zrl+oUs24iQ!l;[frkANK]tOEX!kZ%Trj`*?\$u@F!k#DBrj2X1s0;O,s0)I*r2p"#ri>jp
+qPiGPm&0cYrMB=crhKFdqP!n]rL`eTn"'3Erh'1_r1X.brhKFfs/#amrMTXns/Gssri?(#qlTh"
+rNG^pi3E0bqQp1.rjD^5s0r$<rOE!@]=\'T'tq>q^V@S"_8=(,_o0O5`l?'?aN;U(b5oi3rltPj
+d/MDndaS3F!nGlQrmq5(g"HAYs4dS/r8%A/rnmM/q;Lr)nDjH-rT3n<roa=Fr9=4Gs6KXMrpBaR
+rU9dUs7-'Ys7?9_r:U*`s7cHdrqZQiqYU6hr;H0bJcC<$M#Vu~>
+JcC<$JcC<$i;_U3o_nU`pA=gbrqZHdrqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rosIH!9a@D
+s5j:Aro=%<!9*n7s5*h5rS@M/s4dJ*s4RD(r7CnurmgkprR:_nqU,8grm1MfrltJerQG5`s2k5\
+s2Y/Zrl"rW_o)Jjs1n]NrkANK]tOEX!kZ%Trj`*?\$u@Fs0Vj6rNlO0s0;O,s0)I*qlTk!rN#Oi
+gSt"IpS[terMBCerM0@dq4[b[r1E5FrLa%]qk=%arhKFfrh]XlrMT[os/Gprs/Z1$qlTk#ric.%
+qQ\h]oX"P(rO)R3s0r$<rOE!@]=\'Ts1JEHrkAiV_84"*_o0L4`Q#sta8sE*rlYksc-FV\cd:(e
+daHUoeCE+#rn%2&!87>)!o)Mcr8%D0rnmS1r8IJ2l/VX$r8mb:roa:Er9=4Gs6KULs6]jSr9s[T
+s7-'Ys7?9_r:U*`s7cEcs7uZjqYU6hr;H0bJcC<$L];l~>
+JcC<$JcC<$i;_U3o_nU`pA=gbrqZHdrqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rosIH!9a@D
+s5j:Aro=%<!9*n7s5*h5rS@M/s4dJ*s4RD(r7CnurmgkprR:_nqU,8grm1MfrltJerQG5`s2k5\
+s2Y/Zrl"rW_o)Jjs1n]NrkANK]tOEX!kZ%Trj`*?\$u@Fs0Vj6rNlO0s0;O,s0)I*qlTk!rN#Oi
+gSt"IpS[terMBCerM0@dq4[b[r1E5FrLa%]qk=%arhKFfrh]XlrMT[os/Gprs/Z1$qlTk#ric.%
+qQ\h]oX"P(rO)R3s0r$<rOE!@]=\'Ts1JEHrkAiV_84"*_o0L4`Q#sta8sE*rlYksc-FV\cd:(e
+daHUoeCE+#rn%2&!87>)!o)Mcr8%D0rnmS1r8IJ2l/VX$r8mb:roa:Er9=4Gs6KULs6]jSr9s[T
+s7-'Ys7?9_r:U*`s7cEcs7uZjqYU6hr;H0bJcC<$L];l~>
+JcC<$JcC<$i;_U3o_nU`pA=gbrqZHdrqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rosIH!9a@D
+s5j:Aro=%<!9*n7s5*h5rS@M/s4dJ*s4RD(r7CnurmgkprR:_nqU,8grm1MfrltJerQG5`s2k5\
+s2Y/Zrl"rW_o)Jjs1n]NrkANK]tOEX!kZ%Trj`*?\$u@Fs0Vj6rNlO0s0;O,s0)I*qlTk!rN#Oi
+gSt"IpS[terMBCerM0@dq4[b[r1E5FrLa%]qk=%arhKFfrh]XlrMT[os/Gprs/Z1$qlTk#ric.%
+qQ\h]oX"P(rO)R3s0r$<rOE!@]=\'Ts1JEHrkAiV_84"*_o0L4`Q#sta8sE*rlYksc-FV\cd:(e
+daHUoeCE+#rn%2&!87>)!o)Mcr8%D0rnmS1r8IJ2l/VX$r8mb:roa:Er9=4Gs6KULs6]jSr9s[T
+s7-'Ys7?9_r:U*`s7cEcs7uZjqYU6hr;H0bJcC<$L];l~>
+JcC<$JcC<$hZ)=/pAOgbp\XpcrV??cs7cNdrUp3_s7?3[s7--YrpTmT!:BaO!pf.:rosIH!9a=C
+!p/M(ro=%<s5Et8s53k5rS@M/rnIA)s4RD(qq(etrmghorR:_nqU,;hrm1Mfs3:SfrQG5`s2k8]
+s2Y/Zrl+oU!5nfQs1n]NrkANK]tOEX!kZ%Trj`*?\$u@Fs0_m6rj2X1s0;L+s0)F)qQ9[sqlA,E
+ql0Llq5=4hrMB@drhKFdq4[\Ym[sEMqP!n_rhKFfrh]XlrMT[os/Gprs/Z1$r2p"%ric1&rNZ7*
+e$JqYrO)O2s0r$<r4)m?]=\'Ts1JEHrkJKK!5\ZO!Q2kT`<"!!rl>hrb0.uPbg"GYcd:%ddF-Lm
+eC<%!f)F8&f\+sWgAfn-h#6(.hZ)L1i;MX4ip,RujSJ!5k5FKBkkjWElMg,Im/QJQmelPRnGi%W
+o)J=\o_nI_pAXgaq#:*gqYL*fr;?N`rdk*#s+gW)~>
+JcC<$JcC<$hZ)=/pAOgbp\XpcrV??cs7cNdrUp3_s7?3[s7--YrpTmT!:BaO!pf.:rosIH!9a=C
+!p/M(ro=%<s5Et8s53k5rS@M/rnIA)s4RD(qq(etrmghorR:_nqU,;hrm1Mfs3:SfrQG5`s2k8]
+s2Y/Zrl+oU!5nfQs1n]NrkANK]tOEX!kZ%Trj`*?\$u@Fs0_m6rj2X1s0;L+s0)F)qQ9[sqlA,E
+ql0Llq5=4hrMB@drhKFdq4[\Ym[sEMqP!n_rhKFfrh]XlrMT[os/Gprs/Z1$r2p"%ric1&rNZ7*
+e$JqYrO)O2s0r$<r4)m?]=\'Ts1JEHrkJKK!5\ZO!Q2kT`<"!!rl>hrb0.uPbg"GYcd:%ddF-Lm
+eC<%!f)F8&f\+sWgAfn-h#6(.hZ)L1i;MX4ip,RujSJ!5k5FKBkkjWElMg,Im/QJQmelPRnGi%W
+o)J=\o_nI_pAXgaq#:*gqYL*fr;?N`rdk*#s+gW)~>
+JcC<$JcC<$hZ)=/pAOgbp\XpcrV??cs7cNdrUp3_s7?3[s7--YrpTmT!:BaO!pf.:rosIH!9a=C
+!p/M(ro=%<s5Et8s53k5rS@M/rnIA)s4RD(qq(etrmghorR:_nqU,;hrm1Mfs3:SfrQG5`s2k8]
+s2Y/Zrl+oU!5nfQs1n]NrkANK]tOEX!kZ%Trj`*?\$u@Fs0_m6rj2X1s0;L+s0)F)qQ9[sqlA,E
+ql0Llq5=4hrMB@drhKFdq4[\Ym[sEMqP!n_rhKFfrh]XlrMT[os/Gprs/Z1$r2p"%ric1&rNZ7*
+e$JqYrO)O2s0r$<r4)m?]=\'Ts1JEHrkJKK!5\ZO!Q2kT`<"!!rl>hrb0.uPbg"GYcd:%ddF-Lm
+eC<%!f)F8&f\+sWgAfn-h#6(.hZ)L1i;MX4ip,RujSJ!5k5FKBkkjWElMg,Im/QJQmelPRnGi%W
+o)J=\o_nI_pAXgaq#:*gqYL*fr;?N`rdk*#s+gW)~>
+JcC<$JcC<$h#H+-pAOgbp\XsdrV??cs7cNdrUp3_s7?3[s7--YrpTmT!:BaO!pf.:rosIHs6'CD
+s5a7ArT!q;!9*n7s53k5rS@J.s4dJ*rn7;'qUb\srRL_nrR:_nqpGDis3LVgs3:SfrQG5`s2k8]
+s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs189Brji'=!4Vp8s0Vj6rNlO0riuC*ric=(poX7kg8jnH
+rMfaoqPX=irh]IerM0=co:c#RoV)8YrM0:ds/#^lrMT[os/Gprs/Z1$rN6(%s0)=(riuF-p9WM\
+q6g%,rO;g:r42j=s1A9Cs1SHHrkBAe_84"*_o'F3`Q#p<aN2KFb0.uPc-=PZcd;[=!RfHre-FOT
+f%8O+f\-8Xs4dS/rn[V2rnmY3ro*h8o],N'p>tu0rTF1DqW\%Frp0LKs6]gRrU9aTs7-'Ys7?6^
+rUp0`s7cHdrqZQiqYU6hr;H0bJcC<$LAuc~>
+JcC<$JcC<$h#H+-pAOgbp\XsdrV??cs7cNdrUp3_s7?3[s7--YrpTmT!:BaO!pf.:rosIHs6'CD
+s5a7ArT!q;!9*n7s53k5rS@J.s4dJ*rn7;'qUb\srRL_nrR:_nqpGDis3LVgs3:SfrQG5`s2k8]
+s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs189Brji'=!4Vp8s0Vj6rNlO0riuC*ric=(poX7kg8jnH
+rMfaoqPX=irh]IerM0=co:c#RoV)8YrM0:ds/#^lrMT[os/Gprs/Z1$rN6(%s0)=(riuF-p9WM\
+q6g%,rO;g:r42j=s1A9Cs1SHHrkBAe_84"*_o'F3`Q#p<aN2KFb0.uPc-=PZcd;[=!RfHre-FOT
+f%8O+f\-8Xs4dS/rn[V2rnmY3ro*h8o],N'p>tu0rTF1DqW\%Frp0LKs6]gRrU9aTs7-'Ys7?6^
+rUp0`s7cHdrqZQiqYU6hr;H0bJcC<$LAuc~>
+JcC<$JcC<$h#H+-pAOgbp\XsdrV??cs7cNdrUp3_s7?3[s7--YrpTmT!:BaO!pf.:rosIHs6'CD
+s5a7ArT!q;!9*n7s53k5rS@J.s4dJ*rn7;'qUb\srRL_nrR:_nqpGDis3LVgs3:SfrQG5`s2k8]
+s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs189Brji'=!4Vp8s0Vj6rNlO0riuC*ric=(poX7kg8jnH
+rMfaoqPX=irh]IerM0=co:c#RoV)8YrM0:ds/#^lrMT[os/Gprs/Z1$rN6(%s0)=(riuF-p9WM\
+q6g%,rO;g:r42j=s1A9Cs1SHHrkBAe_84"*_o'F3`Q#p<aN2KFb0.uPc-=PZcd;[=!RfHre-FOT
+f%8O+f\-8Xs4dS/rn[V2rnmY3ro*h8o],N'p>tu0rTF1DqW\%Frp0LKs6]gRrU9aTs7-'Ys7?6^
+rUp0`s7cHdrqZQiqYU6hr;H0bJcC<$LAuc~>
+JcC<$JcC<$gAfk*p\jsdp\XsdrV?BdrqHHdr:U*^s7?3[s7$*YrU9dS!:BaOs6B[MrTOCIkNDj,
+s5j:Aro=%<s5Eq7s53k5r8%D.rnI>(rn7;'q:GSrr71YnrR:boqpGGjrm1Pgs3:SfrQ>8baiXP'
+s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs189BrOE!>\$u@Fs0_m6r3QF/s0;I*rNH.%d]N;Gr2]Um
+rMfdpqPX=irMB@drM07am\0QQrM07crh]Xlr29Rns/Gssri?(#rN6+&ric7(s0;R/q6U"+pU/P[
+rO;d9r42j=rk&0Bs1SHHrkJKK!5\ZO&AuH)`Poj;a2l?Db0%oNbg$.4!RK-ld/h\ErmUu!f)F8&
+f\+sWg&g$ah#?.0hZ)L2i;V^7iqVR0jRM@$k5=E?kkaQClMp2Im/QJPmeuVSnG_tVo)J=\o_nI^
+pAamaq#C0hqYC$er;?N`rdk*#s+^Q(~>
+JcC<$JcC<$gAfk*p\jsdp\XsdrV?BdrqHHdr:U*^s7?3[s7$*YrU9dS!:BaOs6B[MrTOCIkNDj,
+s5j:Aro=%<s5Eq7s53k5r8%D.rnI>(rn7;'q:GSrr71YnrR:boqpGGjrm1Pgs3:SfrQ>8baiXP'
+s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs189BrOE!>\$u@Fs0_m6r3QF/s0;I*rNH.%d]N;Gr2]Um
+rMfdpqPX=irMB@drM07am\0QQrM07crh]Xlr29Rns/Gssri?(#rN6+&ric7(s0;R/q6U"+pU/P[
+rO;d9r42j=rk&0Bs1SHHrkJKK!5\ZO&AuH)`Poj;a2l?Db0%oNbg$.4!RK-ld/h\ErmUu!f)F8&
+f\+sWg&g$ah#?.0hZ)L2i;V^7iqVR0jRM@$k5=E?kkaQClMp2Im/QJPmeuVSnG_tVo)J=\o_nI^
+pAamaq#C0hqYC$er;?N`rdk*#s+^Q(~>
+JcC<$JcC<$gAfk*p\jsdp\XsdrV?BdrqHHdr:U*^s7?3[s7$*YrU9dS!:BaOs6B[MrTOCIkNDj,
+s5j:Aro=%<s5Eq7s53k5r8%D.rnI>(rn7;'q:GSrr71YnrR:boqpGGjrm1Pgs3:SfrQ>8baiXP'
+s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs189BrOE!>\$u@Fs0_m6r3QF/s0;I*rNH.%d]N;Gr2]Um
+rMfdpqPX=irMB@drM07am\0QQrM07crh]Xlr29Rns/Gssri?(#rN6+&ric7(s0;R/q6U"+pU/P[
+rO;d9r42j=rk&0Bs1SHHrkJKK!5\ZO&AuH)`Poj;a2l?Db0%oNbg$.4!RK-ld/h\ErmUu!f)F8&
+f\+sWg&g$ah#?.0hZ)L2i;V^7iqVR0jRM@$k5=E?kkaQClMp2Im/QJPmeuVSnG_tVo)J=\o_nI^
+pAamaq#C0hqYC$er;?N`rdk*#s+^Q(~>
+JcC<$JcC<$f`0V'q#1'eq"t$drqZHds7cNdrUp3_s7?3[s7--YrpTmTs6]gPs6K^MrosIH!9a=C
+s5a7ArT!q;s5Eq7s53h4r8%D.rnI>(rRq/%q:GPqrRLbormUkpr6bPks3LVg!mSs5rQG5`!6P5]
+s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs1A<Brji'=!4Vp8s0_m6r3QF/riu:'r3,aqp9!qhmB->g
+r2][ori,mqqPX=irMB:bqP3bYqP3k^rh]Ukr29Rns/Gsss/Z.#rN6+&s0)@)s0;R/qm6:/r3aq\
+qR?F5qRQU:s1A6Bs1SHHrkJKK!5\ZOs2+iTrl"oXa8X-\aiaV+!R/gfc3qtFdF$Cje'umte^j`O
+!SH*)gAfn-h#6%1hV[5gi;_d8iqh^5jS@p!k54?>kkXKBlMg,Hm/QJPmelPRnGi%Vo)J=\o_nI^
+pAamaq#:*gqYL*fr;?N`rdk*#s+UK'~>
+JcC<$JcC<$f`0V'q#1'eq"t$drqZHds7cNdrUp3_s7?3[s7--YrpTmTs6]gPs6K^MrosIH!9a=C
+s5a7ArT!q;s5Eq7s53h4r8%D.rnI>(rRq/%q:GPqrRLbormUkpr6bPks3LVg!mSs5rQG5`!6P5]
+s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs1A<Brji'=!4Vp8s0_m6r3QF/riu:'r3,aqp9!qhmB->g
+r2][ori,mqqPX=irMB:bqP3bYqP3k^rh]Ukr29Rns/Gsss/Z.#rN6+&s0)@)s0;R/qm6:/r3aq\
+qR?F5qRQU:s1A6Bs1SHHrkJKK!5\ZOs2+iTrl"oXa8X-\aiaV+!R/gfc3qtFdF$Cje'umte^j`O
+!SH*)gAfn-h#6%1hV[5gi;_d8iqh^5jS@p!k54?>kkXKBlMg,Hm/QJPmelPRnGi%Vo)J=\o_nI^
+pAamaq#:*gqYL*fr;?N`rdk*#s+UK'~>
+JcC<$JcC<$f`0V'q#1'eq"t$drqZHds7cNdrUp3_s7?3[s7--YrpTmTs6]gPs6K^MrosIH!9a=C
+s5a7ArT!q;s5Eq7s53h4r8%D.rnI>(rRq/%q:GPqrRLbormUkpr6bPks3LVg!mSs5rQG5`!6P5]
+s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs1A<Brji'=!4Vp8s0_m6r3QF/riu:'r3,aqp9!qhmB->g
+r2][ori,mqqPX=irMB:bqP3bYqP3k^rh]Ukr29Rns/Gsss/Z.#rN6+&s0)@)s0;R/qm6:/r3aq\
+qR?F5qRQU:s1A6Bs1SHHrkJKK!5\ZOs2+iTrl"oXa8X-\aiaV+!R/gfc3qtFdF$Cje'umte^j`O
+!SH*)gAfn-h#6%1hV[5gi;_d8iqh^5jS@p!k54?>kkXKBlMg,Hm/QJPmelPRnGi%Vo)J=\o_nI^
+pAamaq#:*gqYL*fr;?N`rdk*#s+UK'~>
+JcC<$JcC<$ec4;$q>L3gq"t$drqZHds7cQer:U*^s7?3[s7--YrpTmTs6]gPs6K^MrosIHs6'CD
+s5j:ArT!q;s5Eq7rnmb4r8%A-rS.2&rRq/%pt,JqrRLeprmUkprR(Yls3LYhs3:Sfrlb>as2k8]
+!lr=#rl"rW_o)Jj!l;[frkANK]tOEX!kZ%Trji'=s0qs8s0_m6qm6:-riu.#f!"nPpT=Cqri>mq
+ri,mqqPX:hr2&JMrMBIir29Rnri,jrs/Z1$r2p"%s0)C*riuL/r3QC0rO)F/pp]Y#pp]q+pppC8
+rk&*@s1SHHrkJKKs2"]O#K+Ku`Poj:a8X-\aiaV+(!OqJcHjh`dF$Cke'umtf%/I)f\"mVg&g$a
+h#?.0hZ)L3i;_d9iqqd7jS\-&k4e'8kkOE@lMg,Hm/HDPmelPQnGi%Vo)J=\o_eC^pAXgaq#:*g
+qYL*fr;6H_rdk*#s+UK'~>
+JcC<$JcC<$ec4;$q>L3gq"t$drqZHds7cQer:U*^s7?3[s7--YrpTmTs6]gPs6K^MrosIHs6'CD
+s5j:ArT!q;s5Eq7rnmb4r8%A-rS.2&rRq/%pt,JqrRLeprmUkprR(Yls3LYhs3:Sfrlb>as2k8]
+!lr=#rl"rW_o)Jj!l;[frkANK]tOEX!kZ%Trji'=s0qs8s0_m6qm6:-riu.#f!"nPpT=Cqri>mq
+ri,mqqPX:hr2&JMrMBIir29Rnri,jrs/Z1$r2p"%s0)C*riuL/r3QC0rO)F/pp]Y#pp]q+pppC8
+rk&*@s1SHHrkJKKs2"]O#K+Ku`Poj:a8X-\aiaV+(!OqJcHjh`dF$Cke'umtf%/I)f\"mVg&g$a
+h#?.0hZ)L3i;_d9iqqd7jS\-&k4e'8kkOE@lMg,Hm/HDPmelPQnGi%Vo)J=\o_eC^pAXgaq#:*g
+qYL*fr;6H_rdk*#s+UK'~>
+JcC<$JcC<$ec4;$q>L3gq"t$drqZHds7cQer:U*^s7?3[s7--YrpTmTs6]gPs6K^MrosIHs6'CD
+s5j:ArT!q;s5Eq7rnmb4r8%A-rS.2&rRq/%pt,JqrRLeprmUkprR(Yls3LYhs3:Sfrlb>as2k8]
+!lr=#rl"rW_o)Jj!l;[frkANK]tOEX!kZ%Trji'=s0qs8s0_m6qm6:-riu.#f!"nPpT=Cqri>mq
+ri,mqqPX:hr2&JMrMBIir29Rnri,jrs/Z1$r2p"%s0)C*riuL/r3QC0rO)F/pp]Y#pp]q+pppC8
+rk&*@s1SHHrkJKKs2"]O#K+Ku`Poj:a8X-\aiaV+(!OqJcHjh`dF$Cke'umtf%/I)f\"mVg&g$a
+h#?.0hZ)L3i;_d9iqqd7jS\-&k4e'8kkOE@lMg,Hm/HDPmelPQnGi%Vo)J=\o_eC^pAXgaq#:*g
+qYL*fr;6H_rdk*#s+UK'~>
+JcC<$JcC<$df8#"q>L3gq"t'erqZHds7cNdrUp3_s7?3[s7--YrpTmTs6]gPs6K^MrosIHs6'@C
+s5j:ArT!q;s5Eq7rnm_3r8%>,rnI8&r7V&$pt,Jqrmgnqs3ptqrR(Yls3LYhs31PfrQ>8baiXP'
+!lr=#rl"rW_o)Jj!l;[frkANK]tOEXs189BrOMs<s0qs8rjDd5qQp.+qm"DMr3-%$q5sXtrN#gq
+ri,jpqPX7gqPEk\qPF.fqksFlri,jrs/Z.#rN6+&s0)C*s0;R/rNlL1rjDU2rO;[6cFNnbrk&'?
+s1SHHrP/BJs2"]Os2+iTrl$#"a2c9BaiV]KbKS2TcHab^d*^7he'lgre^i='f@\a/rn7G.gt_nb
+!oDhlrS[_7s5Nt:rT*q=oB,Q*p?;57rTa@Iqs==LrpK^Qrp]sXr:9mZrq--]s7ZHdr:p9erqcKg
+r;?Kknc"+>JcCE'J,~>
+JcC<$JcC<$df8#"q>L3gq"t'erqZHds7cNdrUp3_s7?3[s7--YrpTmTs6]gPs6K^MrosIHs6'@C
+s5j:ArT!q;s5Eq7rnm_3r8%>,rnI8&r7V&$pt,Jqrmgnqs3ptqrR(Yls3LYhs31PfrQ>8baiXP'
+!lr=#rl"rW_o)Jj!l;[frkANK]tOEXs189BrOMs<s0qs8rjDd5qQp.+qm"DMr3-%$q5sXtrN#gq
+ri,jpqPX7gqPEk\qPF.fqksFlri,jrs/Z.#rN6+&s0)C*s0;R/rNlL1rjDU2rO;[6cFNnbrk&'?
+s1SHHrP/BJs2"]Os2+iTrl$#"a2c9BaiV]KbKS2TcHab^d*^7he'lgre^i='f@\a/rn7G.gt_nb
+!oDhlrS[_7s5Nt:rT*q=oB,Q*p?;57rTa@Iqs==LrpK^Qrp]sXr:9mZrq--]s7ZHdr:p9erqcKg
+r;?Kknc"+>JcCE'J,~>
+JcC<$JcC<$df8#"q>L3gq"t'erqZHds7cNdrUp3_s7?3[s7--YrpTmTs6]gPs6K^MrosIHs6'@C
+s5j:ArT!q;s5Eq7rnm_3r8%>,rnI8&r7V&$pt,Jqrmgnqs3ptqrR(Yls3LYhs31PfrQ>8baiXP'
+!lr=#rl"rW_o)Jj!l;[frkANK]tOEXs189BrOMs<s0qs8rjDd5qQp.+qm"DMr3-%$q5sXtrN#gq
+ri,jpqPX7gqPEk\qPF.fqksFlri,jrs/Z.#rN6+&s0)C*s0;R/rNlL1rjDU2rO;[6cFNnbrk&'?
+s1SHHrP/BJs2"]Os2+iTrl$#"a2c9BaiV]KbKS2TcHab^d*^7he'lgre^i='f@\a/rn7G.gt_nb
+!oDhlrS[_7s5Nt:rT*q=oB,Q*p?;57rTa@Iqs==LrpK^Qrp]sXr:9mZrq--]s7ZHdr:p9erqcKg
+r;?Kknc"+>JcCE'J,~>
+JcC<$JcC<$d/Vi!q>L6hq"t$drqZKerqHHdr:U*^s7?3[s7$*YrU9dSs6]gPs6K^MrTX@G!9a=C
+s5j:ArT!n:s5En6rnm_3qq_5+rS.,$r7V&$q:GVsrmgqrs3ptqrR(Yls3L\is31PfrQ>8baiXP'
+!lr=#rl"rW_o)Jj!l;[frkANK]tOEXs1A<BrOMs<s0qp7s0_j5pp9h&e$8VNr3-+&qQ9^tri>pr
+rMfaopS[GVpo"+iri,gqs/Z1$r2p"%s0)C*s0;U0r3QF1rjD[4rO;a8o==;#o==V,r4Dj=rk8<F
+rP/BJs2"]Os2+iTrl+oW!6>)[&BW);bKJ,Sc-FV\d*U1fdaS3F!S,d#f*Bs]g"P07gYDeas5*e5
+ro!h8s5Nt:roF(?pZD86n*'<+r9F7HqX"4KrpK^Qrp]pWr:9mZrq--]s7ZHdr:p9erqcHfrVZTl
+nG\"=JcCE'J,~>
+JcC<$JcC<$d/Vi!q>L6hq"t$drqZKerqHHdr:U*^s7?3[s7$*YrU9dSs6]gPs6K^MrTX@G!9a=C
+s5j:ArT!n:s5En6rnm_3qq_5+rS.,$r7V&$q:GVsrmgqrs3ptqrR(Yls3L\is31PfrQ>8baiXP'
+!lr=#rl"rW_o)Jj!l;[frkANK]tOEXs1A<BrOMs<s0qp7s0_j5pp9h&e$8VNr3-+&qQ9^tri>pr
+rMfaopS[GVpo"+iri,gqs/Z1$r2p"%s0)C*s0;U0r3QF1rjD[4rO;a8o==;#o==V,r4Dj=rk8<F
+rP/BJs2"]Os2+iTrl+oW!6>)[&BW);bKJ,Sc-FV\d*U1fdaS3F!S,d#f*Bs]g"P07gYDeas5*e5
+ro!h8s5Nt:roF(?pZD86n*'<+r9F7HqX"4KrpK^Qrp]pWr:9mZrq--]s7ZHdr:p9erqcHfrVZTl
+nG\"=JcCE'J,~>
+JcC<$JcC<$d/Vi!q>L6hq"t$drqZKerqHHdr:U*^s7?3[s7$*YrU9dSs6]gPs6K^MrTX@G!9a=C
+s5j:ArT!n:s5En6rnm_3qq_5+rS.,$r7V&$q:GVsrmgqrs3ptqrR(Yls3L\is31PfrQ>8baiXP'
+!lr=#rl"rW_o)Jj!l;[frkANK]tOEXs1A<BrOMs<s0qp7s0_j5pp9h&e$8VNr3-+&qQ9^tri>pr
+rMfaopS[GVpo"+iri,gqs/Z1$r2p"%s0)C*s0;U0r3QF1rjD[4rO;a8o==;#o==V,r4Dj=rk8<F
+rP/BJs2"]Os2+iTrl+oW!6>)[&BW);bKJ,Sc-FV\d*U1fdaS3F!S,d#f*Bs]g"P07gYDeas5*e5
+ro!h8s5Nt:roF(?pZD86n*'<+r9F7HqX"4KrpK^Qrp]pWr:9mZrq--]s7ZHdr:p9erqcHfrVZTl
+nG\"=JcCE'J,~>
+JcC<$JcC<$c2ZSuq>L6hq"t'erV?BdrqHHdr:U*^s7?3[s7--YrpTmTs6]dOs6B[MrTX@Gs6'@C
+s5j:Ar8[h:s5Ek5rnm_3q;)#)r7h##rRq/%qUb_trmgtsrmUnqrQt\ncd2R8!mSs5rlYAcaiXP'
+!lr=#rl"rW_o)Jj!l;[frkJKI!58?Ds1A<BrOMs<s0qm6rjD[2cEm>Pqm#t$rNH4'qlTk!rN#dp
+rMfaokGS9WrMf^pri?(#r2p"%s0)C*s0;U0r3QF1s0_d5rjVm:q76@5e@YIfrOr3ErP/?Is2"]O
+s24lTrl#,^a2c9BaiV^)b5oi3rltPjd/MDndaS3F!S,d#f)aOWrn@D,!8RS0!oDhlro!h8s5Nt:
+s5a1@qW@\<pZU`'qs++FqX"1JrpK[Ps7$$Xr:9jYs7H6^rq??cr:p9erqcHfrVZTlnG\"=JcCB&
+J,~>
+JcC<$JcC<$c2ZSuq>L6hq"t'erV?BdrqHHdr:U*^s7?3[s7--YrpTmTs6]dOs6B[MrTX@Gs6'@C
+s5j:Ar8[h:s5Ek5rnm_3q;)#)r7h##rRq/%qUb_trmgtsrmUnqrQt\ncd2R8!mSs5rlYAcaiXP'
+!lr=#rl"rW_o)Jj!l;[frkJKI!58?Ds1A<BrOMs<s0qm6rjD[2cEm>Pqm#t$rNH4'qlTk!rN#dp
+rMfaokGS9WrMf^pri?(#r2p"%s0)C*s0;U0r3QF1s0_d5rjVm:q76@5e@YIfrOr3ErP/?Is2"]O
+s24lTrl#,^a2c9BaiV^)b5oi3rltPjd/MDndaS3F!S,d#f)aOWrn@D,!8RS0!oDhlro!h8s5Nt:
+s5a1@qW@\<pZU`'qs++FqX"1JrpK[Ps7$$Xr:9jYs7H6^rq??cr:p9erqcHfrVZTlnG\"=JcCB&
+J,~>
+JcC<$JcC<$c2ZSuq>L6hq"t'erV?BdrqHHdr:U*^s7?3[s7--YrpTmTs6]dOs6B[MrTX@Gs6'@C
+s5j:Ar8[h:s5Ek5rnm_3q;)#)r7h##rRq/%qUb_trmgtsrmUnqrQt\ncd2R8!mSs5rlYAcaiXP'
+!lr=#rl"rW_o)Jj!l;[frkJKI!58?Ds1A<BrOMs<s0qm6rjD[2cEm>Pqm#t$rNH4'qlTk!rN#dp
+rMfaokGS9WrMf^pri?(#r2p"%s0)C*s0;U0r3QF1s0_d5rjVm:q76@5e@YIfrOr3ErP/?Is2"]O
+s24lTrl#,^a2c9BaiV^)b5oi3rltPjd/MDndaS3F!S,d#f)aOWrn@D,!8RS0!oDhlro!h8s5Nt:
+s5a1@qW@\<pZU`'qs++FqX"1JrpK[Ps7$$Xr:9jYs7H6^rq??cr:p9erqcHfrVZTlnG\"=JcCB&
+J,~>
+JcC<$JcC<$aoC2rqYg?iq>:-erqZKerqHHdr:U*^s7?3[s7--YrU0gUmHsl=s6K^MrTX@Gs6'@C
+s5j:Ar8[h:ro*b4rnm\2q;(u(r7h##rRq/%qq(l!rmgtss3q"rrR(Yl!71Vh!mSs5rlYAcaiXP'
+!lr=#rl"rW_o)Jj!l;[frkJKIs1SEEs1A<Br42j;rjVa4rO)I.bd75QrNZ4'rNH4'qlTk!rN#ao
+r2K%]r2KRnri?%"rN6(%s0)C*s0;U0rNlL1s0_g6rjVm:qml[:r4C.brOr0DqnN0Hs2"ZNs24lT
+rl+oW!6>)[#Kb-2bKJ,Rc2Puhcd;[=!RfHre,e+Nrmq2'g&B\,gYCT`h#cHjhu;R6i;hm8j8\3?
+jne-<kPXQ)l1aK?lhKiGmJZJMn,DhUnbhtWoDeI\p&=[ap\Xabq>U6equ$BirUBf;s+13&s*t~>
+JcC<$JcC<$aoC2rqYg?iq>:-erqZKerqHHdr:U*^s7?3[s7--YrU0gUmHsl=s6K^MrTX@Gs6'@C
+s5j:Ar8[h:ro*b4rnm\2q;(u(r7h##rRq/%qq(l!rmgtss3q"rrR(Yl!71Vh!mSs5rlYAcaiXP'
+!lr=#rl"rW_o)Jj!l;[frkJKIs1SEEs1A<Br42j;rjVa4rO)I.bd75QrNZ4'rNH4'qlTk!rN#ao
+r2K%]r2KRnri?%"rN6(%s0)C*s0;U0rNlL1s0_g6rjVm:qml[:r4C.brOr0DqnN0Hs2"ZNs24lT
+rl+oW!6>)[#Kb-2bKJ,Rc2Puhcd;[=!RfHre,e+Nrmq2'g&B\,gYCT`h#cHjhu;R6i;hm8j8\3?
+jne-<kPXQ)l1aK?lhKiGmJZJMn,DhUnbhtWoDeI\p&=[ap\Xabq>U6equ$BirUBf;s+13&s*t~>
+JcC<$JcC<$aoC2rqYg?iq>:-erqZKerqHHdr:U*^s7?3[s7--YrU0gUmHsl=s6K^MrTX@Gs6'@C
+s5j:Ar8[h:ro*b4rnm\2q;(u(r7h##rRq/%qq(l!rmgtss3q"rrR(Yl!71Vh!mSs5rlYAcaiXP'
+!lr=#rl"rW_o)Jj!l;[frkJKIs1SEEs1A<Br42j;rjVa4rO)I.bd75QrNZ4'rNH4'qlTk!rN#ao
+r2K%]r2KRnri?%"rN6(%s0)C*s0;U0rNlL1s0_g6rjVm:qml[:r4C.brOr0DqnN0Hs2"ZNs24lT
+rl+oW!6>)[#Kb-2bKJ,Rc2Puhcd;[=!RfHre,e+Nrmq2'g&B\,gYCT`h#cHjhu;R6i;hm8j8\3?
+jne-<kPXQ)l1aK?lhKiGmJZJMn,DhUnbhtWoDeI\p&=[ap\Xabq>U6equ$BirUBf;s+13&s*t~>
+JcC<$JcC<$`W+lqqYg?iq>:-erqZKerqHHdr:U*^s7?3[s7--YrU9dS!:BaOs6K^MrTX@Gs6'@C
+roO1@r8[e9ro*b4rSRS1pYGc&r7h&$rn78&r7Cu"rmgtss3q"rrmCbms3L\i!mSs5rlb>a!6P5]
+!lr=#rl"rW_o)Jjs1n]NrP/BH!58?Ds1A9Ar42j;rO;O0dC&eWpp9q)riu=(ric=(qlTgurN#Xl
+oVqPari?%"r2ot$s0)C*s0;U0r3QF1s0_g6s0r!;r42g<rO_d9dCoIlqS3$Frk\QMs24lTrl+oW
+s2Y,[!QiL`bQ#cic-FV\cd;[=!RfHre,e+Nrmq2'g&B\+gYDeas5!b5ro!h8s5O";s5a4Aqr[n@
+rTN_7n*9]6p?_bFrU0ROrp]pWqssdYrq--]rq??cqtU0drqcHfrVZTlnG\"=JcC?%J,~>
+JcC<$JcC<$`W+lqqYg?iq>:-erqZKerqHHdr:U*^s7?3[s7--YrU9dS!:BaOs6K^MrTX@Gs6'@C
+roO1@r8[e9ro*b4rSRS1pYGc&r7h&$rn78&r7Cu"rmgtss3q"rrmCbms3L\i!mSs5rlb>a!6P5]
+!lr=#rl"rW_o)Jjs1n]NrP/BH!58?Ds1A9Ar42j;rO;O0dC&eWpp9q)riu=(ric=(qlTgurN#Xl
+oVqPari?%"r2ot$s0)C*s0;U0r3QF1s0_g6s0r!;r42g<rO_d9dCoIlqS3$Frk\QMs24lTrl+oW
+s2Y,[!QiL`bQ#cic-FV\cd;[=!RfHre,e+Nrmq2'g&B\+gYDeas5!b5ro!h8s5O";s5a4Aqr[n@
+rTN_7n*9]6p?_bFrU0ROrp]pWqssdYrq--]rq??cqtU0drqcHfrVZTlnG\"=JcC?%J,~>
+JcC<$JcC<$`W+lqqYg?iq>:-erqZKerqHHdr:U*^s7?3[s7--YrU9dS!:BaOs6K^MrTX@Gs6'@C
+roO1@r8[e9ro*b4rSRS1pYGc&r7h&$rn78&r7Cu"rmgtss3q"rrmCbms3L\i!mSs5rlb>a!6P5]
+!lr=#rl"rW_o)Jjs1n]NrP/BH!58?Ds1A9Ar42j;rO;O0dC&eWpp9q)riu=(ric=(qlTgurN#Xl
+oVqPari?%"r2ot$s0)C*s0;U0r3QF1s0_g6s0r!;r42g<rO_d9dCoIlqS3$Frk\QMs24lTrl+oW
+s2Y,[!QiL`bQ#cic-FV\cd;[=!RfHre,e+Nrmq2'g&B\+gYDeas5!b5ro!h8s5O";s5a4Aqr[n@
+rTN_7n*9]6p?_bFrU0ROrp]pWqssdYrq--]rq??cqtU0drqcHfrVZTlnG\"=JcC?%J,~>
+JcC<$JcC<$^Am<oqYg?iqYU6frqZKerqHHdr:U*^s7?3[s7--YrU9dSs6]dOs6K^MrTX@Gs6'@C
+roO1@qr@\8ro*_3r87J0p>,Z%rS.2&rn7;'r7Cu"s4.(ts3q"rrmCbms3L\i!mSs5rlYAcaiXP'
+!lr=#rl"rW_o)Jjs2"`NrkJKIs1SBDs1A9Aqml^9r3sbUqmHC0q6U(+riu@)ric:'qlTdtr2].`
+rN#muqlTn$ric:)s0;U0rNlL1s0_g6s0r$<r42g<rk&$>r4Vm>o"XD&p:pRArk\NLs24lTrl+oW
+s2Y,[s2b8`rlZ)$c-=PZcd0tcdF-IleC<%!f%8O+f\-8X!ScE/h#cHjhu;R6i;hm9j8\3?jo"9?
+kPj]=l1=30lgsK@mJZJLn,DhUnb_nVoD\C[p&=[ap\agbq>U6equ$BirUBf;s+13$s*t~>
+JcC<$JcC<$^Am<oqYg?iqYU6frqZKerqHHdr:U*^s7?3[s7--YrU9dSs6]dOs6K^MrTX@Gs6'@C
+roO1@qr@\8ro*_3r87J0p>,Z%rS.2&rn7;'r7Cu"s4.(ts3q"rrmCbms3L\i!mSs5rlYAcaiXP'
+!lr=#rl"rW_o)Jjs2"`NrkJKIs1SBDs1A9Aqml^9r3sbUqmHC0q6U(+riu@)ric:'qlTdtr2].`
+rN#muqlTn$ric:)s0;U0rNlL1s0_g6s0r$<r42g<rk&$>r4Vm>o"XD&p:pRArk\NLs24lTrl+oW
+s2Y,[s2b8`rlZ)$c-=PZcd0tcdF-IleC<%!f%8O+f\-8X!ScE/h#cHjhu;R6i;hm9j8\3?jo"9?
+kPj]=l1=30lgsK@mJZJLn,DhUnb_nVoD\C[p&=[ap\agbq>U6equ$BirUBf;s+13$s*t~>
+JcC<$JcC<$^Am<oqYg?iqYU6frqZKerqHHdr:U*^s7?3[s7--YrU9dSs6]dOs6K^MrTX@Gs6'@C
+roO1@qr@\8ro*_3r87J0p>,Z%rS.2&rn7;'r7Cu"s4.(ts3q"rrmCbms3L\i!mSs5rlYAcaiXP'
+!lr=#rl"rW_o)Jjs2"`NrkJKIs1SBDs1A9Aqml^9r3sbUqmHC0q6U(+riu@)ric:'qlTdtr2].`
+rN#muqlTn$ric:)s0;U0rNlL1s0_g6s0r$<r42g<rk&$>r4Vm>o"XD&p:pRArk\NLs24lTrl+oW
+s2Y,[s2b8`rlZ)$c-=PZcd0tcdF-IleC<%!f%8O+f\-8X!ScE/h#cHjhu;R6i;hm9j8\3?jo"9?
+kPj]=l1=30lgsK@mJZJLn,DhUnb_nVoD\C[p&=[ap\agbq>U6equ$BirUBf;s+13$s*t~>
+JcC<$JcC<$]`7-nqu-Hjq>:-erqZKerqHHdrUp0^s7?3[s7--YrU9dSs6]dOs6K^MrTX=Fs6'=B
+s5j7@qr@\8rSdS1r87D.pYGf'rS.5'rn7;'rR_)#s4.(ts3gtrrQt\ncd2U9!mSs5rlYAcaiXP'
+!lr=#rl+oU!5nfQs2"`NrP/BHs1SBDrk&0@qRQL5caWSUr3cO2qQp1,riu@)rNH4'q5sLpo;hbi
+qQ9b"ric7(s0;U0r3QF1s0_g6s0r$<r42j=rk&'?rk86DahRbhrPABJs24lTrPefVs2Y,[s2b8`
+rlb>c!6tMg(=1@SdF$Cke'umtf%/I)f\"m2g=tB;rnRY4hr"Fk!o`.uro=%>s5j1@s6'CFq<@b@
+na#H+qsF@Mq="=PrUKdUs7?6^qt9s^rqH<brqZQiq>:-gqu-'aJcC<$Jc>`MJ,~>
+JcC<$JcC<$]`7-nqu-Hjq>:-erqZKerqHHdrUp0^s7?3[s7--YrU9dSs6]dOs6K^MrTX=Fs6'=B
+s5j7@qr@\8rSdS1r87D.pYGf'rS.5'rn7;'rR_)#s4.(ts3gtrrQt\ncd2U9!mSs5rlYAcaiXP'
+!lr=#rl+oU!5nfQs2"`NrP/BHs1SBDrk&0@qRQL5caWSUr3cO2qQp1,riu@)rNH4'q5sLpo;hbi
+qQ9b"ric7(s0;U0r3QF1s0_g6s0r$<r42j=rk&'?rk86DahRbhrPABJs24lTrPefVs2Y,[s2b8`
+rlb>c!6tMg(=1@SdF$Cke'umtf%/I)f\"m2g=tB;rnRY4hr"Fk!o`.uro=%>s5j1@s6'CFq<@b@
+na#H+qsF@Mq="=PrUKdUs7?6^qt9s^rqH<brqZQiq>:-gqu-'aJcC<$Jc>`MJ,~>
+JcC<$JcC<$]`7-nqu-Hjq>:-erqZKerqHHdrUp0^s7?3[s7--YrU9dSs6]dOs6K^MrTX=Fs6'=B
+s5j7@qr@\8rSdS1r87D.pYGf'rS.5'rn7;'rR_)#s4.(ts3gtrrQt\ncd2U9!mSs5rlYAcaiXP'
+!lr=#rl+oU!5nfQs2"`NrP/BHs1SBDrk&0@qRQL5caWSUr3cO2qQp1,riu@)rNH4'q5sLpo;hbi
+qQ9b"ric7(s0;U0r3QF1s0_g6s0r$<r42j=rk&'?rk86DahRbhrPABJs24lTrPefVs2Y,[s2b8`
+rlb>c!6tMg(=1@SdF$Cke'umtf%/I)f\"m2g=tB;rnRY4hr"Fk!o`.uro=%>s5j1@s6'CFq<@b@
+na#H+qsF@Mq="=PrUKdUs7?6^qt9s^rqH<brqZQiq>:-gqu-'aJcC<$Jc>`MJ,~>
+JcC<$JcC<$]Dq$mqu-Hjq>:-erqZKerqHHdr:U*^s7?3[s7--YrU9dSs6]dOrp0ULrTX@Groa4A
+roO1@qW%P6rSdM/r87D.ptbo(rnI>(s4RG)r7Cu"s4.+us3q"rrm:eocd2U9s31Pfrlb>a!6P5]
+s2P,Zrl+oU!5ncPs2"`NrkJHHs1S?Crk&-?ossCumCE#%r3uI0rjDa4qQp1,riu@)rNH1&o<%ql
+oWA(pric7(s0;U0r3QF1s0_g6s0r$<rOMp=s1A3Ark89EpqQU>otf\(qn`-Grkn`RrPefVs2Y,[
+s2k;`rlYPjc-=PZcd0u;d/h\ErmUu!f)F8+f\+s3g=tE<rnRV3hu;R6i;hm9ir\<'jo"9@kPj]B
+l29iCleq.*mJQDIn,DhTnb_nVoD\CZp&=[ap\Xabq>U6dqu$BirUBf;s+13$rrE(L~>
+JcC<$JcC<$]Dq$mqu-Hjq>:-erqZKerqHHdr:U*^s7?3[s7--YrU9dSs6]dOrp0ULrTX@Groa4A
+roO1@qW%P6rSdM/r87D.ptbo(rnI>(s4RG)r7Cu"s4.+us3q"rrm:eocd2U9s31Pfrlb>a!6P5]
+s2P,Zrl+oU!5ncPs2"`NrkJHHs1S?Crk&-?ossCumCE#%r3uI0rjDa4qQp1,riu@)rNH1&o<%ql
+oWA(pric7(s0;U0r3QF1s0_g6s0r$<rOMp=s1A3Ark89EpqQU>otf\(qn`-Grkn`RrPefVs2Y,[
+s2k;`rlYPjc-=PZcd0u;d/h\ErmUu!f)F8+f\+s3g=tE<rnRV3hu;R6i;hm9ir\<'jo"9@kPj]B
+l29iCleq.*mJQDIn,DhTnb_nVoD\CZp&=[ap\Xabq>U6dqu$BirUBf;s+13$rrE(L~>
+JcC<$JcC<$]Dq$mqu-Hjq>:-erqZKerqHHdr:U*^s7?3[s7--YrU9dSs6]dOrp0ULrTX@Groa4A
+roO1@qW%P6rSdM/r87D.ptbo(rnI>(s4RG)r7Cu"s4.+us3q"rrm:eocd2U9s31Pfrlb>a!6P5]
+s2P,Zrl+oU!5ncPs2"`NrkJHHs1S?Crk&-?ossCumCE#%r3uI0rjDa4qQp1,riu@)rNH1&o<%ql
+oWA(pric7(s0;U0r3QF1s0_g6s0r$<rOMp=s1A3Ark89EpqQU>otf\(qn`-Grkn`RrPefVs2Y,[
+s2k;`rlYPjc-=PZcd0u;d/h\ErmUu!f)F8+f\+s3g=tE<rnRV3hu;R6i;hm9ir\<'jo"9@kPj]B
+l29iCleq.*mJQDIn,DhTnb_nVoD\CZp&=[ap\Xabq>U6dqu$BirUBf;s+13$rrE(L~>
+JcC<$JcC<$])UsmqYg?iq>:0frqZHds7cNdrUp0^s7?3[s7--Yr9s[Rs6]dOs6K^Mr9=7Froa4A
+roO+>qW%P6r8IA-qqq>.q;)&*rnIA)s4RG)rR_)#s4.+us3q"rrm:eocd2U9!mSs5rlYAcaiXP'
+s2P,Zrl+oUs24iQs2"`NrP/?Gs1S<BrO_s<`OYrWrO;X3rjD^3qm6:-riu=(r3-"#nu_elrNH+&
+s0;R/rNlL1s0_g6s0r$<rOMs>rk&-Ark8<FqnN'Eqn_C2n\Ok7rPSWQr5J]Us2Y)Z!m/U-rlb>c
+!6tMg!mf6?rm:bpe,Ihte^j`O!SH*)g'?BfgtgfChV\=j!o`.uro=%>s5j4As6'FGqs"(Er9NJ2
+o^2MCp[A(MrUKdUrq$-]qt9s^rqH9arqZQiq>:*fr;H-aJcC<$JcGcMJ,~>
+JcC<$JcC<$])UsmqYg?iq>:0frqZHds7cNdrUp0^s7?3[s7--Yr9s[Rs6]dOs6K^Mr9=7Froa4A
+roO+>qW%P6r8IA-qqq>.q;)&*rnIA)s4RG)rR_)#s4.+us3q"rrm:eocd2U9!mSs5rlYAcaiXP'
+s2P,Zrl+oUs24iQs2"`NrP/?Gs1S<BrO_s<`OYrWrO;X3rjD^3qm6:-riu=(r3-"#nu_elrNH+&
+s0;R/rNlL1s0_g6s0r$<rOMs>rk&-Ark8<FqnN'Eqn_C2n\Ok7rPSWQr5J]Us2Y)Z!m/U-rlb>c
+!6tMg!mf6?rm:bpe,Ihte^j`O!SH*)g'?BfgtgfChV\=j!o`.uro=%>s5j4As6'FGqs"(Er9NJ2
+o^2MCp[A(MrUKdUrq$-]qt9s^rqH9arqZQiq>:*fr;H-aJcC<$JcGcMJ,~>
+JcC<$JcC<$])UsmqYg?iq>:0frqZHds7cNdrUp0^s7?3[s7--Yr9s[Rs6]dOs6K^Mr9=7Froa4A
+roO+>qW%P6r8IA-qqq>.q;)&*rnIA)s4RG)rR_)#s4.+us3q"rrm:eocd2U9!mSs5rlYAcaiXP'
+s2P,Zrl+oUs24iQs2"`NrP/?Gs1S<BrO_s<`OYrWrO;X3rjD^3qm6:-riu=(r3-"#nu_elrNH+&
+s0;R/rNlL1s0_g6s0r$<rOMs>rk&-Ark8<FqnN'Eqn_C2n\Ok7rPSWQr5J]Us2Y)Z!m/U-rlb>c
+!6tMg!mf6?rm:bpe,Ihte^j`O!SH*)g'?BfgtgfChV\=j!o`.uro=%>s5j4As6'FGqs"(Er9NJ2
+o^2MCp[A(MrUKdUrq$-]qt9s^rqH9arqZQiq>:*fr;H-aJcC<$JcGcMJ,~>
+JcC<$JcC<$\Gtakqu-Hjq>:0frqZHds7cNdr:U*^s7?3[rpg$XrU9dSs6]aNs6K^Mr9=4Es6':A
+roO+>q;_D4qr.8,r87J0qVD/+rnID*rn7>(rn%2$s4.+us3q"rrm:eocd2U9!mSs5rlYAcaiXP'
+s2P,ZrP\iV_o)Gis2"`Nr4i9Grk8*>qRc%(lauu(ppp@5rO;[4rjDa4qm6:-rNZ.%pojUupojLt
+riuI.rNlL1s0_g6s0r$<rOMs>rk&-As1SEGr4i3GrPA'ApVYq+qnrBNqo/TTs2Y)Zs2k;`rQ>8d
+c-?75#LCcDdF$Cje,Ihte^j`O!SH*)g'?BfgtgfChV\=j!o`.uro=%>!9O1As6'CFr9=4GrTj%@
+m-XN7p$_kKrUKaTrU^$\qt9s^rqH9arqZNhqYU3gr;H*`JcC<$JcGcMJ,~>
+JcC<$JcC<$\Gtakqu-Hjq>:0frqZHds7cNdr:U*^s7?3[rpg$XrU9dSs6]aNs6K^Mr9=4Es6':A
+roO+>q;_D4qr.8,r87J0qVD/+rnID*rn7>(rn%2$s4.+us3q"rrm:eocd2U9!mSs5rlYAcaiXP'
+s2P,ZrP\iV_o)Gis2"`Nr4i9Grk8*>qRc%(lauu(ppp@5rO;[4rjDa4qm6:-rNZ.%pojUupojLt
+riuI.rNlL1s0_g6s0r$<rOMs>rk&-As1SEGr4i3GrPA'ApVYq+qnrBNqo/TTs2Y)Zs2k;`rQ>8d
+c-?75#LCcDdF$Cje,Ihte^j`O!SH*)g'?BfgtgfChV\=j!o`.uro=%>!9O1As6'CFr9=4GrTj%@
+m-XN7p$_kKrUKaTrU^$\qt9s^rqH9arqZNhqYU3gr;H*`JcC<$JcGcMJ,~>
+JcC<$JcC<$\Gtakqu-Hjq>:0frqZHds7cNdr:U*^s7?3[rpg$XrU9dSs6]aNs6K^Mr9=4Es6':A
+roO+>q;_D4qr.8,r87J0qVD/+rnID*rn7>(rn%2$s4.+us3q"rrm:eocd2U9!mSs5rlYAcaiXP'
+s2P,ZrP\iV_o)Gis2"`Nr4i9Grk8*>qRc%(lauu(ppp@5rO;[4rjDa4qm6:-rNZ.%pojUupojLt
+riuI.rNlL1s0_g6s0r$<rOMs>rk&-As1SEGr4i3GrPA'ApVYq+qnrBNqo/TTs2Y)Zs2k;`rQ>8d
+c-?75#LCcDdF$Cje,Ihte^j`O!SH*)g'?BfgtgfChV\=j!o`.uro=%>!9O1As6'CFr9=4GrTj%@
+m-XN7p$_kKrUKaTrU^$\qt9s^rqH9arqZNhqYU3gr;H*`JcC<$JcGcMJ,~>
+JcC<$JcC<$[K#Ljqu-Hjq>:0frqZHds7cNdr:U*^s7?0Zs7--YrU9dSrpB[Nrp0ULr9=4Eroa1@
+rT4"=pZ)22qVh2,rSRS1qq_;-rnID*s4RG)rR_)#!7h(us3q"rrm:eocd2U9!mSs5rlYAcaiXP'
+s2P,ZrPefT!5n`Os2"`Nr4i3Erk67_qn)d;qRQR7rjVd5rjDa4qm67,rNYFfriuF-r3QF1rjD^5
+s0r$<rOMs>rk&-As1SHHr4i6Hrk\EIqSVU:l,3A9qSiHRrl=uYs2k;`rQG5b!6tMgs3C\lrm:u!
+e'lgre^`7Mf)aOWrn7D-h#?+2hV[5ihu_lsir7s>jQ5M%joFTDkl'cFlMg,Dm.]o4md]cDnGMhQ
+o)81Zo_S7[pAXg`q#1$fqYC$dr;?N^rdk*#s+14Ls*t~>
+JcC<$JcC<$[K#Ljqu-Hjq>:0frqZHds7cNdr:U*^s7?0Zs7--YrU9dSrpB[Nrp0ULr9=4Eroa1@
+rT4"=pZ)22qVh2,rSRS1qq_;-rnID*s4RG)rR_)#!7h(us3q"rrm:eocd2U9!mSs5rlYAcaiXP'
+s2P,ZrPefT!5n`Os2"`Nr4i3Erk67_qn)d;qRQR7rjVd5rjDa4qm67,rNYFfriuF-r3QF1rjD^5
+s0r$<rOMs>rk&-As1SHHr4i6Hrk\EIqSVU:l,3A9qSiHRrl=uYs2k;`rQG5b!6tMgs3C\lrm:u!
+e'lgre^`7Mf)aOWrn7D-h#?+2hV[5ihu_lsir7s>jQ5M%joFTDkl'cFlMg,Dm.]o4md]cDnGMhQ
+o)81Zo_S7[pAXg`q#1$fqYC$dr;?N^rdk*#s+14Ls*t~>
+JcC<$JcC<$[K#Ljqu-Hjq>:0frqZHds7cNdr:U*^s7?0Zs7--YrU9dSrpB[Nrp0ULr9=4Eroa1@
+rT4"=pZ)22qVh2,rSRS1qq_;-rnID*s4RG)rR_)#!7h(us3q"rrm:eocd2U9!mSs5rlYAcaiXP'
+s2P,ZrPefT!5n`Os2"`Nr4i3Erk67_qn)d;qRQR7rjVd5rjDa4qm67,rNYFfriuF-r3QF1rjD^5
+s0r$<rOMs>rk&-As1SHHr4i6Hrk\EIqSVU:l,3A9qSiHRrl=uYs2k;`rQG5b!6tMgs3C\lrm:u!
+e'lgre^`7Mf)aOWrn7D-h#?+2hV[5ihu_lsir7s>jQ5M%joFTDkl'cFlMg,Dm.]o4md]cDnGMhQ
+o)81Zo_S7[pAXg`q#1$fqYC$dr;?N^rdk*#s+14Ls*t~>
+JcC<$JcC<$ZN'7iqu-Hjq>:0frqZHds7cNdr:U*^s7?0Zs7--Yr9s[Rs6]aNs6K[Lr9=4ErTF%>
+rT3t<p#Gr/r8IG/rSRV2r8%D.rnID*s4RG)rn%2$!7h%t!n5TGrm:eocd2U9!mSs5rlYAcaiXP'
+s2Y/Zrl+oUs24cOs2"]MqnN*DqRu.+l+Q`%rO`$>qml^9rjVd5rjD^3qQp+*q6Bb"q6Bn(qm6:/
+rjD^5s0r$<r42j=s1A6Bs1SHHr4i9Irk\KKrPSQOho53*oYpdKrl=rXs2k;`rQG5bs3:Pg!mf6?
+rm:bpe,IkseH"2"f)aOWrn7D-h#?+7hV[5Ki8NYSro=%>s5j7Bs6'FGrTX=Hrp0CHqsF(EipZd6
+r:0URrU^$\qXsj]rV-3arV?Hhq"t$fqu-$`JcC<$JcG]KJ,~>
+JcC<$JcC<$ZN'7iqu-Hjq>:0frqZHds7cNdr:U*^s7?0Zs7--Yr9s[Rs6]aNs6K[Lr9=4ErTF%>
+rT3t<p#Gr/r8IG/rSRV2r8%D.rnID*s4RG)rn%2$!7h%t!n5TGrm:eocd2U9!mSs5rlYAcaiXP'
+s2Y/Zrl+oUs24cOs2"]MqnN*DqRu.+l+Q`%rO`$>qml^9rjVd5rjD^3qQp+*q6Bb"q6Bn(qm6:/
+rjD^5s0r$<r42j=s1A6Bs1SHHr4i9Irk\KKrPSQOho53*oYpdKrl=rXs2k;`rQG5bs3:Pg!mf6?
+rm:bpe,IkseH"2"f)aOWrn7D-h#?+7hV[5Ki8NYSro=%>s5j7Bs6'FGrTX=Hrp0CHqsF(EipZd6
+r:0URrU^$\qXsj]rV-3arV?Hhq"t$fqu-$`JcC<$JcG]KJ,~>
+JcC<$JcC<$ZN'7iqu-Hjq>:0frqZHds7cNdr:U*^s7?0Zs7--Yr9s[Rs6]aNs6K[Lr9=4ErTF%>
+rT3t<p#Gr/r8IG/rSRV2r8%D.rnID*s4RG)rn%2$!7h%t!n5TGrm:eocd2U9!mSs5rlYAcaiXP'
+s2Y/Zrl+oUs24cOs2"]MqnN*DqRu.+l+Q`%rO`$>qml^9rjVd5rjD^3qQp+*q6Bb"q6Bn(qm6:/
+rjD^5s0r$<r42j=s1A6Bs1SHHr4i9Irk\KKrPSQOho53*oYpdKrl=rXs2k;`rQG5bs3:Pg!mf6?
+rm:bpe,IkseH"2"f)aOWrn7D-h#?+7hV[5Ki8NYSro=%>s5j7Bs6'FGrTX=Hrp0CHqsF(EipZd6
+r:0URrU^$\qXsj]rV-3arV?Hhq"t$fqu-$`JcC<$JcG]KJ,~>
+JcC<$JcC<$Y5dngr;HQkq>:0frqZHds7cNdr:U*^s7?0Zs7-*XrU9aRs6]aNs6K[Lqs"+DrTF"=
+r8mh:p#Gr/r8IM1rnm_3r8%D.s4dM+s4RG)rn%2$!7h%t!n5TGrm:eocd2U9!mSs5rlb>a!6P2\
+!lr=#rPefTs24cOrk\TLpqPUupqQO:qn;g<rO`'?qml^9rjVd5rjD^3pp9Copp9t,rjD[4s0r$<
+r42j=s1A6Bs1SHHrP/?Is2"TLrkn`Rou6=<j2Lr9rQ"fVrlP2_rQG5bs3:Pgs3C\lrmCbo!7Uqs
+#M%DVf@S[-g&B\+gYDea#N"@qi8ESQir8!<j8e<?joX`0kks]FlMg,Hm/68Imb[F.nGDbNo)81Y
+o_S7[pAXg_q#1$fqY9sdr;6H]rdk*#s+14Ks*t~>
+JcC<$JcC<$Y5dngr;HQkq>:0frqZHds7cNdr:U*^s7?0Zs7-*XrU9aRs6]aNs6K[Lqs"+DrTF"=
+r8mh:p#Gr/r8IM1rnm_3r8%D.s4dM+s4RG)rn%2$!7h%t!n5TGrm:eocd2U9!mSs5rlb>a!6P2\
+!lr=#rPefTs24cOrk\TLpqPUupqQO:qn;g<rO`'?qml^9rjVd5rjD^3pp9Copp9t,rjD[4s0r$<
+r42j=s1A6Bs1SHHrP/?Is2"TLrkn`Rou6=<j2Lr9rQ"fVrlP2_rQG5bs3:Pgs3C\lrmCbo!7Uqs
+#M%DVf@S[-g&B\+gYDea#N"@qi8ESQir8!<j8e<?joX`0kks]FlMg,Hm/68Imb[F.nGDbNo)81Y
+o_S7[pAXg_q#1$fqY9sdr;6H]rdk*#s+14Ks*t~>
+JcC<$JcC<$Y5dngr;HQkq>:0frqZHds7cNdr:U*^s7?0Zs7-*XrU9aRs6]aNs6K[Lqs"+DrTF"=
+r8mh:p#Gr/r8IM1rnm_3r8%D.s4dM+s4RG)rn%2$!7h%t!n5TGrm:eocd2U9!mSs5rlb>a!6P2\
+!lr=#rPefTs24cOrk\TLpqPUupqQO:qn;g<rO`'?qml^9rjVd5rjD^3pp9Copp9t,rjD[4s0r$<
+r42j=s1A6Bs1SHHrP/?Is2"TLrkn`Rou6=<j2Lr9rQ"fVrlP2_rQG5bs3:Pgs3C\lrmCbo!7Uqs
+#M%DVf@S[-g&B\+gYDea#N"@qi8ESQir8!<j8e<?joX`0kks]FlMg,Hm/68Imb[F.nGDbNo)81Y
+o_S7[pAXg_q#1$fqY9sdr;6H]rdk*#s+14Ks*t~>
+JcC<$JcC<$WrMPer;HTlq>:0frqZHdrqHHdr:U*^rq$*Zrpg$Xr9s[RrpBXMrp0ULqW\"CrTEq;
+qrR_9p#Gu0rSdY3rnm_3rS@M/s4dM+s4RG)rn%2$!7h(us3gtrrmCbm!71Vh!mSs5rlYAcaiXM&
+!lr=#rPecSs24`Nrk\QK_8#o^rOr'?rk&0@qml^9rjVa4rO)U2kHk,orjDX3s0r!;rOMs>s1A6B
+s1SHHr4i9Is2"WMrkn`RqSi?OjN$T+qoANRrlP2_r6,,as3:Pgs3L_lrm:eqe'n<G!S,d#f*Bs]
+g"P07gYDea!T)`5i;_a9ir8!<j8e<@k5XWEkl'cGlMg,Hm/HDMmc*^-nG;\Lo)/+Xo_S7[pAOa^
+q#:*fqY9sdr;6H]rdk*#s+14Js*t~>
+JcC<$JcC<$WrMPer;HTlq>:0frqZHdrqHHdr:U*^rq$*Zrpg$Xr9s[RrpBXMrp0ULqW\"CrTEq;
+qrR_9p#Gu0rSdY3rnm_3rS@M/s4dM+s4RG)rn%2$!7h(us3gtrrmCbm!71Vh!mSs5rlYAcaiXM&
+!lr=#rPecSs24`Nrk\QK_8#o^rOr'?rk&0@qml^9rjVa4rO)U2kHk,orjDX3s0r!;rOMs>s1A6B
+s1SHHr4i9Is2"WMrkn`RqSi?OjN$T+qoANRrlP2_r6,,as3:Pgs3L_lrm:eqe'n<G!S,d#f*Bs]
+g"P07gYDea!T)`5i;_a9ir8!<j8e<@k5XWEkl'cGlMg,Hm/HDMmc*^-nG;\Lo)/+Xo_S7[pAOa^
+q#:*fqY9sdr;6H]rdk*#s+14Js*t~>
+JcC<$JcC<$WrMPer;HTlq>:0frqZHdrqHHdr:U*^rq$*Zrpg$Xr9s[RrpBXMrp0ULqW\"CrTEq;
+qrR_9p#Gu0rSdY3rnm_3rS@M/s4dM+s4RG)rn%2$!7h(us3gtrrmCbm!71Vh!mSs5rlYAcaiXM&
+!lr=#rPecSs24`Nrk\QK_8#o^rOr'?rk&0@qml^9rjVa4rO)U2kHk,orjDX3s0r!;rOMs>s1A6B
+s1SHHr4i9Is2"WMrkn`RqSi?OjN$T+qoANRrlP2_r6,,as3:Pgs3L_lrm:eqe'n<G!S,d#f*Bs]
+g"P07gYDea!T)`5i;_a9ir8!<j8e<@k5XWEkl'cGlMg,Hm/HDMmc*^-nG;\Lo)/+Xo_S7[pAOa^
+q#:*fqY9sdr;6H]rdk*#s+14Js*t~>
+JcC<$JcC<$W;lAdr;HTlq>:0frqZHdrqHHdr:U']s7?0Zs7--Yr9sXQs6]^Mrp0RKqs"(Cr9*e9
+qW7S7pZ)53rSdY3s53k5r8%D.s4dP,s4RG)rmq5&e^aZKs3gtrrmCbm!71Yis3:Sfrlb>a!6P2\
+s2Y/ZrPecSrknWMr5&0DotTt2pVHR=pV6[@rk83Ark&0@qml^9rjV^3r3bmurO)L1rjVp;r42j=
+s1A6Bs1SHHr4i9Is2"ZNrkncSqo/NRr5[O4p;cgHrQ5&]r6,)`s3:Pgs3L_lrmCbo!7Uqss4%,#
+rmqD-g"G*5gY:N_h#ZBirnmk:io9st!p&J)roX7D!9jCGs6BULr9XFMrU07Fl1"E:o^_tPr:KjY
+rV$3aqY:$brqcEer;?Kkn,@n<JcC<$qu;0~>
+JcC<$JcC<$W;lAdr;HTlq>:0frqZHdrqHHdr:U']s7?0Zs7--Yr9sXQs6]^Mrp0RKqs"(Cr9*e9
+qW7S7pZ)53rSdY3s53k5r8%D.s4dP,s4RG)rmq5&e^aZKs3gtrrmCbm!71Yis3:Sfrlb>a!6P2\
+s2Y/ZrPecSrknWMr5&0DotTt2pVHR=pV6[@rk83Ark&0@qml^9rjV^3r3bmurO)L1rjVp;r42j=
+s1A6Bs1SHHr4i9Is2"ZNrkncSqo/NRr5[O4p;cgHrQ5&]r6,)`s3:Pgs3L_lrmCbo!7Uqss4%,#
+rmqD-g"G*5gY:N_h#ZBirnmk:io9st!p&J)roX7D!9jCGs6BULr9XFMrU07Fl1"E:o^_tPr:KjY
+rV$3aqY:$brqcEer;?Kkn,@n<JcC<$qu;0~>
+JcC<$JcC<$W;lAdr;HTlq>:0frqZHdrqHHdr:U']s7?0Zs7--Yr9sXQs6]^Mrp0RKqs"(Cr9*e9
+qW7S7pZ)53rSdY3s53k5r8%D.s4dP,s4RG)rmq5&e^aZKs3gtrrmCbm!71Yis3:Sfrlb>a!6P2\
+s2Y/ZrPecSrknWMr5&0DotTt2pVHR=pV6[@rk83Ark&0@qml^9rjV^3r3bmurO)L1rjVp;r42j=
+s1A6Bs1SHHr4i9Is2"ZNrkncSqo/NRr5[O4p;cgHrQ5&]r6,)`s3:Pgs3L_lrmCbo!7Uqss4%,#
+rmqD-g"G*5gY:N_h#ZBirnmk:io9st!p&J)roX7D!9jCGs6BULr9XFMrU07Fl1"E:o^_tPr:KjY
+rV$3aqY:$brqcEer;?Kkn,@n<JcC<$qu;0~>
+JcC<$JcC<$W;lAdqu-Kkq>:0frqZHdrqHHdr:U']s7?0Zrpg$Xr9sXQs6]^Mrp0OJqW[qAr9*\6
+qW7Y9puDA5ro*b4s53k5rS@M/s4dP,s4RG)rn%2$!7h(us3gtrrmCbm!71Vh!mSs5rlb>as2k5\
+s2Y/Zr5JZRrknKIjMC)tqSE*FqS3$DrOr-Ark&0@qml[8rjVU0o!S5#rjVm:r42j=s1A3As1SHH
+rP/BJs2"ZNs24iSr5JZTrQ"ZRkfMo,r5no[qof#`s3:Je!mf6?rQt\pe'n<G!nGlQrmq2'g&B\,
+gYCT`h#ZBirnmk:io9st!p&J)roO:Fkii!0s6BXMr9XFMrpKOLo^M,8o()\LrUfpYrV$3aqY:$b
+rVH?er;?Hjn,@n<JcC<$qYu'~>
+JcC<$JcC<$W;lAdqu-Kkq>:0frqZHdrqHHdr:U']s7?0Zrpg$Xr9sXQs6]^Mrp0OJqW[qAr9*\6
+qW7Y9puDA5ro*b4s53k5rS@M/s4dP,s4RG)rn%2$!7h(us3gtrrmCbm!71Vh!mSs5rlb>as2k5\
+s2Y/Zr5JZRrknKIjMC)tqSE*FqS3$DrOr-Ark&0@qml[8rjVU0o!S5#rjVm:r42j=s1A3As1SHH
+rP/BJs2"ZNs24iSr5JZTrQ"ZRkfMo,r5no[qof#`s3:Je!mf6?rQt\pe'n<G!nGlQrmq2'g&B\,
+gYCT`h#ZBirnmk:io9st!p&J)roO:Fkii!0s6BXMr9XFMrpKOLo^M,8o()\LrUfpYrV$3aqY:$b
+rVH?er;?Hjn,@n<JcC<$qYu'~>
+JcC<$JcC<$W;lAdqu-Kkq>:0frqZHdrqHHdr:U']s7?0Zrpg$Xr9sXQs6]^Mrp0OJqW[qAr9*\6
+qW7Y9puDA5ro*b4s53k5rS@M/s4dP,s4RG)rn%2$!7h(us3gtrrmCbm!71Vh!mSs5rlb>as2k5\
+s2Y/Zr5JZRrknKIjMC)tqSE*FqS3$DrOr-Ark&0@qml[8rjVU0o!S5#rjVm:r42j=s1A3As1SHH
+rP/BJs2"ZNs24iSr5JZTrQ"ZRkfMo,r5no[qof#`s3:Je!mf6?rQt\pe'n<G!nGlQrmq2'g&B\,
+gYCT`h#ZBirnmk:io9st!p&J)roO:Fkii!0s6BXMr9XFMrpKOLo^M,8o()\LrUfpYrV$3aqY:$b
+rVH?er;?Hjn,@n<JcC<$qYu'~>
+JcC<$JcC<$VuQ8cr;HQkq>:0frqZHdrqHHdr:U']s7?0Zrpg!Wr9sXQs6][Lrp0OJq<@e?qrdP4
+qrRe;q;_J6s5En6s53k5rS@M/s4dP,s4RG)rmq5&e^aZKs3gtrrmCbm!71Vh!mSs5rlb>as2k5\
+rl>&Yqo/QQr571(pVZO<rPAHJqnN-Erk83Ark&0@qml[8r3tt"rO;a8qmla<s1A3As1SHHrP/BJ
+s2"ZNs24iSrPecUrl=lVr5n]Uq9/?OlcK%Hq9/f^rltDerm(SkrR(Yn!7Unr#M%DVf@S[-g&B\1
+gYCT?h;7#Grnmk:io9st!p&J)roO:Fkii!0s6BXMrTsONrpKUNqXEnBkOSNAr:KdWrV$6bq=spa
+rVH<dr;?Kkn,@n<JcC<$q>Ys~>
+JcC<$JcC<$VuQ8cr;HQkq>:0frqZHdrqHHdr:U']s7?0Zrpg!Wr9sXQs6][Lrp0OJq<@e?qrdP4
+qrRe;q;_J6s5En6s53k5rS@M/s4dP,s4RG)rmq5&e^aZKs3gtrrmCbm!71Vh!mSs5rlb>as2k5\
+rl>&Yqo/QQr571(pVZO<rPAHJqnN-Erk83Ark&0@qml[8r3tt"rO;a8qmla<s1A3As1SHHrP/BJ
+s2"ZNs24iSrPecUrl=lVr5n]Uq9/?OlcK%Hq9/f^rltDerm(SkrR(Yn!7Unr#M%DVf@S[-g&B\1
+gYCT?h;7#Grnmk:io9st!p&J)roO:Fkii!0s6BXMrTsONrpKUNqXEnBkOSNAr:KdWrV$6bq=spa
+rVH<dr;?Kkn,@n<JcC<$q>Ys~>
+JcC<$JcC<$VuQ8cr;HQkq>:0frqZHdrqHHdr:U']s7?0Zrpg!Wr9sXQs6][Lrp0OJq<@e?qrdP4
+qrRe;q;_J6s5En6s53k5rS@M/s4dP,s4RG)rmq5&e^aZKs3gtrrmCbm!71Vh!mSs5rlb>as2k5\
+rl>&Yqo/QQr571(pVZO<rPAHJqnN-Erk83Ark&0@qml[8r3tt"rO;a8qmla<s1A3As1SHHrP/BJ
+s2"ZNs24iSrPecUrl=lVr5n]Uq9/?OlcK%Hq9/f^rltDerm(SkrR(Yn!7Unr#M%DVf@S[-g&B\1
+gYCT?h;7#Grnmk:io9st!p&J)roO:Fkii!0s6BXMrTsONrpKUNqXEnBkOSNAr:KdWrV$6bq=spa
+rVH<dr;?Kkn,@n<JcC<$q>Ys~>
+JcC<$JcC<$VuQ5br;HQkqYU6frqZHdrqHHdqt:!]rq$'Yrpg$XqsXOPrpBULrTjFIpZ_P<q<.D4
+r8mn<qr@\8s5En6s53k5rS7P1gY;_]s4RG)rmq5&e^aZK!n5TGrmCbm!71Vh!mSs5rQG5`s2k5\
+rl>#XqSiBNikt$!qSW*Frk\QKqnN0Frk83Ark&0@q76F5m^N,(qRQU:s1A3As1SHHrP/BJs2"ZN
+s24iSrPefVrl=oWrlP)\fus!0oZR6XrltAds3L_lrR(Yns3ptss4%,#rn%2&!87A*#M\%hh;-rE
+hu;O=iSrkWj5f:_roX7Ds60IHs6BXMrTsONrpKXOr:'OPg[b44qt0[Vr:^*`q=ssbr;-6dr;?Hj
+n,@n<JcC<$q#>j~>
+JcC<$JcC<$VuQ5br;HQkqYU6frqZHdrqHHdqt:!]rq$'Yrpg$XqsXOPrpBULrTjFIpZ_P<q<.D4
+r8mn<qr@\8s5En6s53k5rS7P1gY;_]s4RG)rmq5&e^aZK!n5TGrmCbm!71Vh!mSs5rQG5`s2k5\
+rl>#XqSiBNikt$!qSW*Frk\QKqnN0Frk83Ark&0@q76F5m^N,(qRQU:s1A3As1SHHrP/BJs2"ZN
+s24iSrPefVrl=oWrlP)\fus!0oZR6XrltAds3L_lrR(Yns3ptss4%,#rn%2&!87A*#M\%hh;-rE
+hu;O=iSrkWj5f:_roX7Ds60IHs6BXMrTsONrpKXOr:'OPg[b44qt0[Vr:^*`q=ssbr;-6dr;?Hj
+n,@n<JcC<$q#>j~>
+JcC<$JcC<$VuQ5br;HQkqYU6frqZHdrqHHdqt:!]rq$'Yrpg$XqsXOPrpBULrTjFIpZ_P<q<.D4
+r8mn<qr@\8s5En6s53k5rS7P1gY;_]s4RG)rmq5&e^aZK!n5TGrmCbm!71Vh!mSs5rQG5`s2k5\
+rl>#XqSiBNikt$!qSW*Frk\QKqnN0Frk83Ark&0@q76F5m^N,(qRQU:s1A3As1SHHrP/BJs2"ZN
+s24iSrPefVrl=oWrlP)\fus!0oZR6XrltAds3L_lrR(Yns3ptss4%,#rn%2&!87A*#M\%hh;-rE
+hu;O=iSrkWj5f:_roX7Ds60IHs6BXMrTsONrpKXOr:'OPg[b44qt0[Vr:^*`q=ssbr;-6dr;?Hj
+n,@n<JcC<$q#>j~>
+JcC<$JcC<$VZ6/bqu-Kkq>:-erqZHdrqHHdqt:!]rq$'Yrpg!WqsXOPrpBRKrTjCHo]c28qWIS7
+rT4%>qr@_9ro*h6s53k5rn[V0s4dP,s4ID)rn%2$s4.+u!n5TGrmCbm!71Vh!mSs5rQG5`rlP)Z
+s2Y)XpVlF9hSoE2rPSKKrk\TLqnN-Erk83Ark&-?ossh,p::.5rk&*@s1SHHr4i9Is2"ZNs24lT
+rPefVrl=rXrlP/^pWM^Cj3.AErQY5bs3L_lrR(Yns3ptss4./#rmq5(g"HAY!ScE/h>c=3hu;O7
+iSsjss5X1AroX7Ds60IHs6BXMrTsROrpK[PrUB^Sh=C:2qXjOTr:^*`q=sparVH<dqu$?in,@n<
+JcC<$q#>j~>
+JcC<$JcC<$VZ6/bqu-Kkq>:-erqZHdrqHHdqt:!]rq$'Yrpg!WqsXOPrpBRKrTjCHo]c28qWIS7
+rT4%>qr@_9ro*h6s53k5rn[V0s4dP,s4ID)rn%2$s4.+u!n5TGrmCbm!71Vh!mSs5rQG5`rlP)Z
+s2Y)XpVlF9hSoE2rPSKKrk\TLqnN-Erk83Ark&-?ossh,p::.5rk&*@s1SHHr4i9Is2"ZNs24lT
+rPefVrl=rXrlP/^pWM^Cj3.AErQY5bs3L_lrR(Yns3ptss4./#rmq5(g"HAY!ScE/h>c=3hu;O7
+iSsjss5X1AroX7Ds60IHs6BXMrTsROrpK[PrUB^Sh=C:2qXjOTr:^*`q=sparVH<dqu$?in,@n<
+JcC<$q#>j~>
+JcC<$JcC<$VZ6/bqu-Kkq>:-erqZHdrqHHdqt:!]rq$'Yrpg!WqsXOPrpBRKrTjCHo]c28qWIS7
+rT4%>qr@_9ro*h6s53k5rn[V0s4dP,s4ID)rn%2$s4.+u!n5TGrmCbm!71Vh!mSs5rQG5`rlP)Z
+s2Y)XpVlF9hSoE2rPSKKrk\TLqnN-Erk83Ark&-?ossh,p::.5rk&*@s1SHHr4i9Is2"ZNs24lT
+rPefVrl=rXrlP/^pWM^Cj3.AErQY5bs3L_lrR(Yns3ptss4./#rmq5(g"HAY!ScE/h>c=3hu;O7
+iSsjss5X1AroX7Ds60IHs6BXMrTsROrpK[PrUB^Sh=C:2qXjOTr:^*`q=sparVH<dqu$?in,@n<
+JcC<$q#>j~>
+JcC<$JcC<$V>p&aqu-Kkq>:-erqZHdrqHEcr:U']rq$'Yrpg!WqsXOPrU'FIr9O:Gn`fo6qrdb:
+roO.?qr@_9s5Eq7s53k5rn[V0s4dP,s4ID)rn%2$!7h%t!n5TGrmCbm!71Vhs3:SfrQG5`rlP)Z
+rQ"iUhSng#ou6mJrknTLrk\WMqnN-Erk80@rO`!=mCE/+rO`!?rk8?Gr4i9Is2"ZNs24lTrPefV
+rl=uYrlP/^qoeo]qT\QUp!)dGqp"u_rm1SjrR(Yns3pqr!nGlQrn%2&!87A*s4[P/rnRY4hr"Fk
+!TE&;j8\0?jo4EBk5a`EklU/9li$2LmJlVOn,DhSn`o]2oD%tNp&+O^p\=O^q>L0aqu$BhrU9`:
+s+13$s7cPD~>
+JcC<$JcC<$V>p&aqu-Kkq>:-erqZHdrqHEcr:U']rq$'Yrpg!WqsXOPrU'FIr9O:Gn`fo6qrdb:
+roO.?qr@_9s5Eq7s53k5rn[V0s4dP,s4ID)rn%2$!7h%t!n5TGrmCbm!71Vhs3:SfrQG5`rlP)Z
+rQ"iUhSng#ou6mJrknTLrk\WMqnN-Erk80@rO`!=mCE/+rO`!?rk8?Gr4i9Is2"ZNs24lTrPefV
+rl=uYrlP/^qoeo]qT\QUp!)dGqp"u_rm1SjrR(Yns3pqr!nGlQrn%2&!87A*s4[P/rnRY4hr"Fk
+!TE&;j8\0?jo4EBk5a`EklU/9li$2LmJlVOn,DhSn`o]2oD%tNp&+O^p\=O^q>L0aqu$BhrU9`:
+s+13$s7cPD~>
+JcC<$JcC<$V>p&aqu-Kkq>:-erqZHdrqHEcr:U']rq$'Yrpg!WqsXOPrU'FIr9O:Gn`fo6qrdb:
+roO.?qr@_9s5Eq7s53k5rn[V0s4dP,s4ID)rn%2$!7h%t!n5TGrmCbm!71Vhs3:SfrQG5`rlP)Z
+rQ"iUhSng#ou6mJrknTLrk\WMqnN-Erk80@rO`!=mCE/+rO`!?rk8?Gr4i9Is2"ZNs24lTrPefV
+rl=uYrlP/^qoeo]qT\QUp!)dGqp"u_rm1SjrR(Yns3pqr!nGlQrn%2&!87A*s4[P/rnRY4hr"Fk
+!TE&;j8\0?jo4EBk5a`EklU/9li$2LmJlVOn,DhSn`o]2oD%tNp&+O^p\=O^q>L0aqu$BhrU9`:
+s+13$s7cPD~>
+JcC<$JcC<$V#Tr`qu-Kkq>:-erqZHdrqHEcqt9s\s7?-Yrpg!WqsXLOrU'CHqs4+Dn`fr7r9*n<
+roO1@r8[h:s5Eq7s53k5rn[V0s4dP,!nl5Yrn%2$!7h(us3q"rrmCbms3L\is3:Sfr6,,_rlOuW
+r5[s>o#LUJp;d*Nq8N?OrknWMrk\TLqnN-Erk8-?qn)F1r4Dd;rk8?Gr4i9Is2"ZNs24lTr5J]U
+s2Y)Zs2k8_qoeu_rQX$@n'1ROrQkJir6bPms3pqrs4%,#rRV,'g"HAY!o)McrnRV3hu;R6i;hm:
+ir\<'jo4BDkNM./l2U&Kli$2MmJlVPn,;bSnauD8oCV\Hp&+O]p\=O^q>C*aqtp<grU0Z9s+13$
+s7cPD~>
+JcC<$JcC<$V#Tr`qu-Kkq>:-erqZHdrqHEcqt9s\s7?-Yrpg!WqsXLOrU'CHqs4+Dn`fr7r9*n<
+roO1@r8[h:s5Eq7s53k5rn[V0s4dP,!nl5Yrn%2$!7h(us3q"rrmCbms3L\is3:Sfr6,,_rlOuW
+r5[s>o#LUJp;d*Nq8N?OrknWMrk\TLqnN-Erk8-?qn)F1r4Dd;rk8?Gr4i9Is2"ZNs24lTr5J]U
+s2Y)Zs2k8_qoeu_rQX$@n'1ROrQkJir6bPms3pqrs4%,#rRV,'g"HAY!o)McrnRV3hu;R6i;hm:
+ir\<'jo4BDkNM./l2U&Kli$2MmJlVPn,;bSnauD8oCV\Hp&+O]p\=O^q>C*aqtp<grU0Z9s+13$
+s7cPD~>
+JcC<$JcC<$V#Tr`qu-Kkq>:-erqZHdrqHEcqt9s\s7?-Yrpg!WqsXLOrU'CHqs4+Dn`fr7r9*n<
+roO1@r8[h:s5Eq7s53k5rn[V0s4dP,!nl5Yrn%2$!7h(us3q"rrmCbms3L\is3:Sfr6,,_rlOuW
+r5[s>o#LUJp;d*Nq8N?OrknWMrk\TLqnN-Erk8-?qn)F1r4Dd;rk8?Gr4i9Is2"ZNs24lTr5J]U
+s2Y)Zs2k8_qoeu_rQX$@n'1ROrQkJir6bPms3pqrs4%,#rRV,'g"HAY!o)McrnRV3hu;R6i;hm:
+ir\<'jo4BDkNM./l2U&Kli$2MmJlVPn,;bSnauD8oCV\Hp&+O]p\=O^q>C*aqtp<grU0Z9s+13$
+s7cPD~>
+JcC<$JcC<$V#To_r;HQkq>:-erqZHdrqHEcqt9s\rq$$Xrpg!WqX=CNrU'=FqWmqAoBH2:rTF%>
+s5j7@rT!q;s5Eq7s53k5rn[V0!8IJ+!nl5Yrmq5&e^aZKs3q"rrmCbms3LYhs3:Sfr6,)^rlOlT
+m)Ri$r5\cUqSiHPrknZNrk\TLqnN-ErOqj9qRcF5rOr3Er4i9Is2"WMs24lTrPefVs2Y)Zs2k8_
+r6,)`rlt5`jNli2r6PAhqpGDks3pqrs4./#rn%2&!87>)#M\%hh;-rEhu;R6i;hm:ir\<'jo4BD
+kNM./l2U&Kli$2MmJlVPn,DhUnb;VJoB,]6p&+O\p\=O]q>L0aqtp<grU0Z9s+13$s7ZJC~>
+JcC<$JcC<$V#To_r;HQkq>:-erqZHdrqHEcqt9s\rq$$Xrpg!WqX=CNrU'=FqWmqAoBH2:rTF%>
+s5j7@rT!q;s5Eq7s53k5rn[V0!8IJ+!nl5Yrmq5&e^aZKs3q"rrmCbms3LYhs3:Sfr6,)^rlOlT
+m)Ri$r5\cUqSiHPrknZNrk\TLqnN-ErOqj9qRcF5rOr3Er4i9Is2"WMs24lTrPefVs2Y)Zs2k8_
+r6,)`rlt5`jNli2r6PAhqpGDks3pqrs4./#rn%2&!87>)#M\%hh;-rEhu;R6i;hm:ir\<'jo4BD
+kNM./l2U&Kli$2MmJlVPn,DhUnb;VJoB,]6p&+O\p\=O]q>L0aqtp<grU0Z9s+13$s7ZJC~>
+JcC<$JcC<$V#To_r;HQkq>:-erqZHdrqHEcqt9s\rq$$Xrpg!WqX=CNrU'=FqWmqAoBH2:rTF%>
+s5j7@rT!q;s5Eq7s53k5rn[V0!8IJ+!nl5Yrmq5&e^aZKs3q"rrmCbms3LYhs3:Sfr6,)^rlOlT
+m)Ri$r5\cUqSiHPrknZNrk\TLqnN-ErOqj9qRcF5rOr3Er4i9Is2"WMs24lTrPefVs2Y)Zs2k8_
+r6,)`rlt5`jNli2r6PAhqpGDks3pqrs4./#rn%2&!87>)#M\%hh;-rEhu;R6i;hm:ir\<'jo4BD
+kNM./l2U&Kli$2MmJlVPn,DhUnb;VJoB,]6p&+O\p\=O]q>L0aqtp<grU0Z9s+13$s7ZJC~>
+JcC<$JcC<$U]9i_qu-Hjq>:-erqZHdrqHEcqt9s\rq$!Wrpg!Wq=":Mr9a+Bq!7b@p?DP>rTF+@
+roO1@rT!q;s5Eq7s5*h5rS7P1gY;_]s4ID)rRV,%e^aZKs3q"rrmCbms3LYhrltJeqoeu]r5mp=
+j2q&:rQ"oWqo/QQrknZNrk\TLqS3!Cr4VO2r4W*DqnN-Gs2"WMs24lTrPefVs2Y)Zs2k8_rQG2a
+rlt>cr6P5do$R0Xjj3kOqU,;jrmUhqs4./#rRV,'g"HAYs4[P/rn[V2!8me6s5<t;ro4(@jlQL(
+!pAe2rosIJ!:0UMs6]jSr9sXSrpfgTqXa.Ij7W9Br:fs\r;$9ep\Xmdqu,s^JcC<$JcGBBJ,~>
+JcC<$JcC<$U]9i_qu-Hjq>:-erqZHdrqHEcqt9s\rq$!Wrpg!Wq=":Mr9a+Bq!7b@p?DP>rTF+@
+roO1@rT!q;s5Eq7s5*h5rS7P1gY;_]s4ID)rRV,%e^aZKs3q"rrmCbms3LYhrltJeqoeu]r5mp=
+j2q&:rQ"oWqo/QQrknZNrk\TLqS3!Cr4VO2r4W*DqnN-Gs2"WMs24lTrPefVs2Y)Zs2k8_rQG2a
+rlt>cr6P5do$R0Xjj3kOqU,;jrmUhqs4./#rRV,'g"HAYs4[P/rn[V2!8me6s5<t;ro4(@jlQL(
+!pAe2rosIJ!:0UMs6]jSr9sXSrpfgTqXa.Ij7W9Br:fs\r;$9ep\Xmdqu,s^JcC<$JcGBBJ,~>
+JcC<$JcC<$U]9i_qu-Hjq>:-erqZHdrqHEcqt9s\rq$!Wrpg!Wq=":Mr9a+Bq!7b@p?DP>rTF+@
+roO1@rT!q;s5Eq7s5*h5rS7P1gY;_]s4ID)rRV,%e^aZKs3q"rrmCbms3LYhrltJeqoeu]r5mp=
+j2q&:rQ"oWqo/QQrknZNrk\TLqS3!Cr4VO2r4W*DqnN-Gs2"WMs24lTrPefVs2Y)Zs2k8_rQG2a
+rlt>cr6P5do$R0Xjj3kOqU,;jrmUhqs4./#rRV,'g"HAYs4[P/rn[V2!8me6s5<t;ro4(@jlQL(
+!pAe2rosIJ!:0UMs6]jSr9sXSrpfgTqXa.Ij7W9Br:fs\r;$9ep\Xmdqu,s^JcC<$JcGBBJ,~>
+JcC<$JcC<$U]9f^qu-Hjq>:-erqZEcrqHEcqt9s\rq$!WrpfsVq="7LqsEn>q!7hBq!%b@roa4A
+s5j:Ar8Rk<iSjans5*h5rS7P1gY;_]s4ID)rRV,%e^aZKs3q"rrR(Yls3LYhrltGdqTJfZkK3D>
+nB:XMr5nfVrl>#Xqo/QQrknZNrk\QKq7lg@oY(.9q7lpEs2"WMs24lTr5J]Us2Y)Zs2k;`rQG2a
+s3:Gdrm1PigX594pX/ugrmUeps4./#rR_)%!87>)!o)Mcrn[V2!8me6!o`.uro4(@jlQL(!pAe2
+rosIJ!:0UMs6]jSr9s[TrpfjUqt'UTg%G48qY0aZr;$9ep\Xjcqu,s^JcC<$JcG?AJ,~>
+JcC<$JcC<$U]9f^qu-Hjq>:-erqZEcrqHEcqt9s\rq$!WrpfsVq="7LqsEn>q!7hBq!%b@roa4A
+s5j:Ar8Rk<iSjans5*h5rS7P1gY;_]s4ID)rRV,%e^aZKs3q"rrR(Yls3LYhrltGdqTJfZkK3D>
+nB:XMr5nfVrl>#Xqo/QQrknZNrk\QKq7lg@oY(.9q7lpEs2"WMs24lTr5J]Us2Y)Zs2k;`rQG2a
+s3:Gdrm1PigX594pX/ugrmUeps4./#rR_)%!87>)!o)Mcrn[V2!8me6!o`.uro4(@jlQL(!pAe2
+rosIJ!:0UMs6]jSr9s[TrpfjUqt'UTg%G48qY0aZr;$9ep\Xjcqu,s^JcC<$JcG?AJ,~>
+JcC<$JcC<$U]9f^qu-Hjq>:-erqZEcrqHEcqt9s\rq$!WrpfsVq="7LqsEn>q!7hBq!%b@roa4A
+s5j:Ar8Rk<iSjans5*h5rS7P1gY;_]s4ID)rRV,%e^aZKs3q"rrR(Yls3LYhrltGdqTJfZkK3D>
+nB:XMr5nfVrl>#Xqo/QQrknZNrk\QKq7lg@oY(.9q7lpEs2"WMs24lTr5J]Us2Y)Zs2k;`rQG2a
+s3:Gdrm1PigX594pX/ugrmUeps4./#rR_)%!87>)!o)Mcrn[V2!8me6!o`.uro4(@jlQL(!pAe2
+rosIJ!:0UMs6]jSr9s[TrpfjUqt'UTg%G48qY0aZr;$9ep\Xjcqu,s^JcC<$JcG?AJ,~>
+JcC<$JcC<$UAs]]qu-Hjq>:-erqZEcrqHEcqXsj[rq$!WrUKjUq!\+Jq<dY;qWn(Eq<@nBs6'=B
+roO1@rSmt=iSjan!oMkkrn[V0s4dP,!nl5Yrn%2$s4.+us3q"rrR(Yls3LVgrltDcp<2pIeB@g5
+rQ4rXrl>#Xr5JZRrknWMrk\QKikPH-rk\NLs24iSrPefVs2Y)Zs2k;`rQG2as3:Jerm1SjpsJ6P
+h9l2LrR:\ormh&"rR_)%s4RD*s4dS/rnRY4hr"Fk!o`.uro4(@jlQL(!pAe2rojLLlg+N9s6]jS
+rU9dUrpfjUrU]pYg%G+5qY0[Xr;$9epA=dcqYfj]JcC<$JcG<@J,~>
+JcC<$JcC<$UAs]]qu-Hjq>:-erqZEcrqHEcqXsj[rq$!WrUKjUq!\+Jq<dY;qWn(Eq<@nBs6'=B
+roO1@rSmt=iSjan!oMkkrn[V0s4dP,!nl5Yrn%2$s4.+us3q"rrR(Yls3LVgrltDcp<2pIeB@g5
+rQ4rXrl>#Xr5JZRrknWMrk\QKikPH-rk\NLs24iSrPefVs2Y)Zs2k;`rQG2as3:Jerm1SjpsJ6P
+h9l2LrR:\ormh&"rR_)%s4RD*s4dS/rnRY4hr"Fk!o`.uro4(@jlQL(!pAe2rojLLlg+N9s6]jS
+rU9dUrpfjUrU]pYg%G+5qY0[Xr;$9epA=dcqYfj]JcC<$JcG<@J,~>
+JcC<$JcC<$UAs]]qu-Hjq>:-erqZEcrqHEcqXsj[rq$!WrUKjUq!\+Jq<dY;qWn(Eq<@nBs6'=B
+roO1@rSmt=iSjan!oMkkrn[V0s4dP,!nl5Yrn%2$s4.+us3q"rrR(Yls3LVgrltDcp<2pIeB@g5
+rQ4rXrl>#Xr5JZRrknWMrk\QKikPH-rk\NLs24iSrPefVs2Y)Zs2k;`rQG2as3:Jerm1SjpsJ6P
+h9l2LrR:\ormh&"rR_)%s4RD*s4dS/rnRY4hr"Fk!o`.uro4(@jlQL(!pAe2rojLLlg+N9s6]jS
+rU9dUrpfjUrU]pYg%G+5qY0[Xr;$9epA=dcqYfj]JcC<$JcG<@J,~>
+JcC<$JcC<$U&XT\qu-Hjq>:-erqZEcrqHBbqt9p[rq$!WrUKgTp@%kGq!IS;qs44Gqs"+Droa7B
+roO1@ro=%<s5Et8s53k5rn[V0!8IJ+!nl5Yrn%2$s4.+us3q"rrR(Vks3LSfrQY;biQLo<p!*9U
+priWYrlP&Yrl>&Yqo/QQrknWMrPABHn%\e9rPABJs24iSrPefVs2Y)Zs2k;`r6,,as3:Jes3L\k
+qpG>iqU>#bp=&cao?mE_r6tMls4.,"rR_)%s4RA)!o)Mcrn[V2!8me6s5<t;ro=%>!9O4Bs6'FG
+rojLLlg+N9!q#FDr9s[Ts7,sVrq$'[i:ZU5q=jOVqt^0dpA=dcqYfj]JcC<$JcG9?J,~>
+JcC<$JcC<$U&XT\qu-Hjq>:-erqZEcrqHBbqt9p[rq$!WrUKgTp@%kGq!IS;qs44Gqs"+Droa7B
+roO1@ro=%<s5Et8s53k5rn[V0!8IJ+!nl5Yrn%2$s4.+us3q"rrR(Vks3LSfrQY;biQLo<p!*9U
+priWYrlP&Yrl>&Yqo/QQrknWMrPABHn%\e9rPABJs24iSrPefVs2Y)Zs2k;`r6,,as3:Jes3L\k
+qpG>iqU>#bp=&cao?mE_r6tMls4.,"rR_)%s4RA)!o)Mcrn[V2!8me6s5<t;ro=%>!9O4Bs6'FG
+rojLLlg+N9!q#FDr9s[Ts7,sVrq$'[i:ZU5q=jOVqt^0dpA=dcqYfj]JcC<$JcG9?J,~>
+JcC<$JcC<$U&XT\qu-Hjq>:-erqZEcrqHBbqt9p[rq$!WrUKgTp@%kGq!IS;qs44Gqs"+Droa7B
+roO1@ro=%<s5Et8s53k5rn[V0!8IJ+!nl5Yrn%2$s4.+us3q"rrR(Vks3LSfrQY;biQLo<p!*9U
+priWYrlP&Yrl>&Yqo/QQrknWMrPABHn%\e9rPABJs24iSrPefVs2Y)Zs2k;`r6,,as3:Jes3L\k
+qpG>iqU>#bp=&cao?mE_r6tMls4.,"rR_)%s4RA)!o)Mcrn[V2!8me6s5<t;ro=%>!9O4Bs6'FG
+rojLLlg+N9!q#FDr9s[Ts7,sVrq$'[i:ZU5q=jOVqt^0dpA=dcqYfj]JcC<$JcG9?J,~>
+JcC<$JcC<$U&XQ[qu-Hjq>:-erV?<brqHEcqXsj[rU]jUrUKgTo^DPBp[.V>r9O@Iqs"+Ds6'=B
+s5j:Aro=%<s5Et8s53k5rnRY2gY;_]s4RG)rn%2$s4.(ts3q"rrR(Vkrm1Gdr6=EKpW_sJqp#)`
+qTJi[rlP)Zrl>#Xr5JZRrPSHJqSDm@qn`*FrkncSr5J]Url=uYs2k;`rQG5bs3:Mfrm1VkqpGDk
+rR9QOo[E]cpXArfrRLr!r7Cu$s4RA)s4dS/rn[V2!8me6s5<t;ro=%>!9O4Bs5sCGrTOCKlg+Q:
+s6]jSrU9dUrpfpWrU^![nFbl9p%S(Qqt^0dpA=abqYfg\JcC<$JcG9?J,~>
+JcC<$JcC<$U&XQ[qu-Hjq>:-erV?<brqHEcqXsj[rU]jUrUKgTo^DPBp[.V>r9O@Iqs"+Ds6'=B
+s5j:Aro=%<s5Et8s53k5rnRY2gY;_]s4RG)rn%2$s4.(ts3q"rrR(Vkrm1Gdr6=EKpW_sJqp#)`
+qTJi[rlP)Zrl>#Xr5JZRrPSHJqSDm@qn`*FrkncSr5J]Url=uYs2k;`rQG5bs3:Mfrm1VkqpGDk
+rR9QOo[E]cpXArfrRLr!r7Cu$s4RA)s4dS/rn[V2!8me6s5<t;ro=%>!9O4Bs5sCGrTOCKlg+Q:
+s6]jSrU9dUrpfpWrU^![nFbl9p%S(Qqt^0dpA=abqYfg\JcC<$JcG9?J,~>
+JcC<$JcC<$U&XQ[qu-Hjq>:-erV?<brqHEcqXsj[rU]jUrUKgTo^DPBp[.V>r9O@Iqs"+Ds6'=B
+s5j:Aro=%<s5Et8s53k5rnRY2gY;_]s4RG)rn%2$s4.(ts3q"rrR(Vkrm1Gdr6=EKpW_sJqp#)`
+qTJi[rlP)Zrl>#Xr5JZRrPSHJqSDm@qn`*FrkncSr5J]Url=uYs2k;`rQG5bs3:Mfrm1VkqpGDk
+rR9QOo[E]cpXArfrRLr!r7Cu$s4RA)s4dS/rn[V2!8me6s5<t;ro=%>!9O4Bs5sCGrTOCKlg+Q:
+s6]jSrU9dUrpfpWrU^![nFbl9p%S(Qqt^0dpA=abqYfg\JcC<$JcG9?J,~>
+JcC<$JcC<$T`=HZqu-Hjq>:-erV?<brV-<bqXsgZrU]jUr:0[RnF-)=qX+%DrTjIJqs".Es6'=B
+s5a7ArT!q;s5Et8s5*h5rS7P1gY;_]s4RG)rn%2$s4.(ts3q"rr6bMjrQk5`mEOtBps8NVrQY>c
+qTJl\s2k/Zrl>&Yqo/NPrPRX3rkn`Rr5JZTs2Y)Zs2k;`rQG2as3:Mfs3L_lr6bMlrmUYlkLJ88
+rRLnuqq(l#s4RA)s4dS/rS7P3hr"Fks5<t;ro=%>!9O4Bs5sCGrTOCKlg+Q:s6]jSrU9dUrpfpW
+rq$*\p%@YEmJ$,Fqt^-cp&"XaqYfg\JcC<$JcG6>J,~>
+JcC<$JcC<$T`=HZqu-Hjq>:-erV?<brV-<bqXsgZrU]jUr:0[RnF-)=qX+%DrTjIJqs".Es6'=B
+s5a7ArT!q;s5Et8s5*h5rS7P1gY;_]s4RG)rn%2$s4.(ts3q"rr6bMjrQk5`mEOtBps8NVrQY>c
+qTJl\s2k/Zrl>&Yqo/NPrPRX3rkn`Rr5JZTs2Y)Zs2k;`rQG2as3:Mfs3L_lr6bMlrmUYlkLJ88
+rRLnuqq(l#s4RA)s4dS/rS7P3hr"Fks5<t;ro=%>!9O4Bs5sCGrTOCKlg+Q:s6]jSrU9dUrpfpW
+rq$*\p%@YEmJ$,Fqt^-cp&"XaqYfg\JcC<$JcG6>J,~>
+JcC<$JcC<$T`=HZqu-Hjq>:-erV?<brV-<bqXsgZrU]jUr:0[RnF-)=qX+%DrTjIJqs".Es6'=B
+s5a7ArT!q;s5Et8s5*h5rS7P1gY;_]s4RG)rn%2$s4.(ts3q"rr6bMjrQk5`mEOtBps8NVrQY>c
+qTJl\s2k/Zrl>&Yqo/NPrPRX3rkn`Rr5JZTs2Y)Zs2k;`rQG2as3:Mfs3L_lr6bMlrmUYlkLJ88
+rRLnuqq(l#s4RA)s4dS/rS7P3hr"Fks5<t;ro=%>!9O4Bs5sCGrTOCKlg+Q:s6]jSrU9dUrpfpW
+rq$*\p%@YEmJ$,Fqt^-cp&"XaqYfg\JcC<$JcG6>J,~>
+JcC<$JcC<$TE"BZqu-Eiq>:-erV?<brV-9aqXsgZrU]dSqsjOPm-jc<qsF4Grp0RKr9=7Froa7B
+!p/M(rT!q;!9*n7!oMkkrn[V0s4dP,s4RG)rn%2$s4.(trmUnqqpGAhrQjHJpWr9SqTnr^rltGd
+qoeu]s2k/Zrl>#Xqo/NPqnqp?r58KOqo/QSs2Y&Ys2k;`rQG5bs3:Mfs3L_lr6bMls3phor71Vo
+pXf,ipXSTZqpkYrqq(i"s4RA)s4dS/rS@M1!8mb5!o`.uro=%>!9O4Bs5sCGrosIJs6K[Ns6]jS
+rU9dUs7-$Xrq$*\q"=CTj7hp8qYC$bp&"U`qYfg\JcC<$JcG3=J,~>
+JcC<$JcC<$TE"BZqu-Eiq>:-erV?<brV-9aqXsgZrU]dSqsjOPm-jc<qsF4Grp0RKr9=7Froa7B
+!p/M(rT!q;!9*n7!oMkkrn[V0s4dP,s4RG)rn%2$s4.(trmUnqqpGAhrQjHJpWr9SqTnr^rltGd
+qoeu]s2k/Zrl>#Xqo/NPqnqp?r58KOqo/QSs2Y&Ys2k;`rQG5bs3:Mfs3L_lr6bMls3phor71Vo
+pXf,ipXSTZqpkYrqq(i"s4RA)s4dS/rS@M1!8mb5!o`.uro=%>!9O4Bs5sCGrosIJs6K[Ns6]jS
+rU9dUs7-$Xrq$*\q"=CTj7hp8qYC$bp&"U`qYfg\JcC<$JcG3=J,~>
+JcC<$JcC<$TE"BZqu-Eiq>:-erV?<brV-9aqXsgZrU]dSqsjOPm-jc<qsF4Grp0RKr9=7Froa7B
+!p/M(rT!q;!9*n7!oMkkrn[V0s4dP,s4RG)rn%2$s4.(trmUnqqpGAhrQjHJpWr9SqTnr^rltGd
+qoeu]s2k/Zrl>#Xqo/NPqnqp?r58KOqo/QSs2Y&Ys2k;`rQG5bs3:Mfs3L_lr6bMls3phor71Vo
+pXf,ipXSTZqpkYrqq(i"s4RA)s4dS/rS@M1!8mb5!o`.uro=%>!9O4Bs5sCGrosIJs6K[Ns6]jS
+rU9dUs7-$Xrq$*\q"=CTj7hp8qYC$bp&"U`qYfg\JcC<$JcG3=J,~>
+JcC<$JcC<$T)\9Yqu-Eiq>:*drqZBbrV-<bq=X^Yr:B[RqXO@Mm-jf=rU'FIrp0ULr9=7Fs6'@C
+s5j:ArSmt=iSjdos53k5rn[V0!8IJ+s4RG)rn%2$rmgtsrmUnqqU,5fjj3_Kk0a+RrQk>crltGd
+qof#^rlP&Yrl>#Xq8N3Kp;?aFqSiHRrl=rXs2k;`rQG5bs3:Jes3L_lrR(YnrmUbormgtuhq.YS
+ma_3cq:GVurn78(rnIJ.rn[V2s53h6s5F";ro4(@jlQL(s5sCGrosIJs6K[Ns6]jSrU9dUs7-$X
+rq$-]q"=LWmJ#T7q>'m`p&"U`qYfd[JcC<$JcG0<J,~>
+JcC<$JcC<$T)\9Yqu-Eiq>:*drqZBbrV-<bq=X^Yr:B[RqXO@Mm-jf=rU'FIrp0ULr9=7Fs6'@C
+s5j:ArSmt=iSjdos53k5rn[V0!8IJ+s4RG)rn%2$rmgtsrmUnqqU,5fjj3_Kk0a+RrQk>crltGd
+qof#^rlP&Yrl>#Xq8N3Kp;?aFqSiHRrl=rXs2k;`rQG5bs3:Jes3L_lrR(YnrmUbormgtuhq.YS
+ma_3cq:GVurn78(rnIJ.rn[V2s53h6s5F";ro4(@jlQL(s5sCGrosIJs6K[Ns6]jSrU9dUs7-$X
+rq$-]q"=LWmJ#T7q>'m`p&"U`qYfd[JcC<$JcG0<J,~>
+JcC<$JcC<$T)\9Yqu-Eiq>:*drqZBbrV-<bq=X^Yr:B[RqXO@Mm-jf=rU'FIrp0ULr9=7Fs6'@C
+s5j:ArSmt=iSjdos53k5rn[V0!8IJ+s4RG)rn%2$rmgtsrmUnqqU,5fjj3_Kk0a+RrQk>crltGd
+qof#^rlP&Yrl>#Xq8N3Kp;?aFqSiHRrl=rXs2k;`rQG5bs3:Jes3L_lrR(YnrmUbormgtuhq.YS
+ma_3cq:GVurn78(rnIJ.rn[V2s53h6s5F";ro4(@jlQL(s5sCGrosIJs6K[Ns6]jSrU9dUs7-$X
+rq$-]q"=LWmJ#T7q>'m`p&"U`qYfd[JcC<$JcG0<J,~>
+JcC<$JcC<$ScA-Wqu-Hjq"t$drV?9arqHBbq=X[Xr:BUPq!n%HnF-;CrU'LKrp0ULr9=7Fs6'@C
+s5j:Aro=%<s5Et8s5*h5rS@M/!8IJ+s4RG)rR_)#s4.%srmUkppX/9QmEtUTo?mN`rm1JerltGd
+r6,)^rlP&Yrl=uWoYpaHoYpdKrl=rXs2k8_rQG5bs3:Mfs3L_lrR(Vms3pnqrmh#!pXecamaq![
+p"02qrn75'rnIJ.rS@M1!8mb5s5<t;rSmt?jlQL(!pAe2rosIJs6K[Ns6TgSrU9dUs7-$Xrq$-]
+qXsaZq"N;5q>'j_o_\L_qYfd[JcC<$JcG-;J,~>
+JcC<$JcC<$ScA-Wqu-Hjq"t$drV?9arqHBbq=X[Xr:BUPq!n%HnF-;CrU'LKrp0ULr9=7Fs6'@C
+s5j:Aro=%<s5Et8s5*h5rS@M/!8IJ+s4RG)rR_)#s4.%srmUkppX/9QmEtUTo?mN`rm1JerltGd
+r6,)^rlP&Yrl=uWoYpaHoYpdKrl=rXs2k8_rQG5bs3:Mfs3L_lrR(Vms3pnqrmh#!pXecamaq![
+p"02qrn75'rnIJ.rS@M1!8mb5s5<t;rSmt?jlQL(!pAe2rosIJs6K[Ns6TgSrU9dUs7-$Xrq$-]
+qXsaZq"N;5q>'j_o_\L_qYfd[JcC<$JcG-;J,~>
+JcC<$JcC<$ScA-Wqu-Hjq"t$drV?9arqHBbq=X[Xr:BUPq!n%HnF-;CrU'LKrp0ULr9=7Fs6'@C
+s5j:Aro=%<s5Et8s5*h5rS@M/!8IJ+s4RG)rR_)#s4.%srmUkppX/9QmEtUTo?mN`rm1JerltGd
+r6,)^rlP&Yrl=uWoYpaHoYpdKrl=rXs2k8_rQG5bs3:Mfs3L_lrR(Vms3pnqrmh#!pXecamaq![
+p"02qrn75'rnIJ.rS@M1!8mb5s5<t;rSmt?jlQL(!pAe2rosIJs6K[Ns6TgSrU9dUs7-$Xrq$-]
+qXsaZq"N;5q>'j_o_\L_qYfd[JcC<$JcG-;J,~>
+JcC<$JcC<$SH&$Vqu-Hjq"t$drV?9arV-9aq"=RWr:BLMp$qbFo^DbHrU'LKs6K[LrTX@Gs6'@C
+s5a7ArT!q;!9*n7!oMkkrS7P1gY;\\s4RG)rR_)#rmgqrrR:_nhpM5Im*kgZq9f2grQkDerltGd
+r6,)^rlP&YrQ"fTn&>4ErQ"fVs2k8_rQG5bs3:Jes3L_lrR(Yns3pnqs4.,"qUbYtkLoX_jOa=^
+rRq)%s4dP.rS@M1s53h6s5F";ro=%>s5j7B!pAe2rosIJ!:0UMs6TgSrU9dUs7-$Xs7?6^qXsd[
+qY/M7p\FX]oDAC^q>K[ZJcC<$JcG*:J,~>
+JcC<$JcC<$SH&$Vqu-Hjq"t$drV?9arV-9aq"=RWr:BLMp$qbFo^DbHrU'LKs6K[LrTX@Gs6'@C
+s5a7ArT!q;!9*n7!oMkkrS7P1gY;\\s4RG)rR_)#rmgqrrR:_nhpM5Im*kgZq9f2grQkDerltGd
+r6,)^rlP&YrQ"fTn&>4ErQ"fVs2k8_rQG5bs3:Jes3L_lrR(Yns3pnqs4.,"qUbYtkLoX_jOa=^
+rRq)%s4dP.rS@M1s53h6s5F";ro=%>s5j7B!pAe2rosIJ!:0UMs6TgSrU9dUs7-$Xs7?6^qXsd[
+qY/M7p\FX]oDAC^q>K[ZJcC<$JcG*:J,~>
+JcC<$JcC<$SH&$Vqu-Hjq"t$drV?9arV-9aq"=RWr:BLMp$qbFo^DbHrU'LKs6K[LrTX@Gs6'@C
+s5a7ArT!q;!9*n7!oMkkrS7P1gY;\\s4RG)rR_)#rmgqrrR:_nhpM5Im*kgZq9f2grQkDerltGd
+r6,)^rlP&YrQ"fTn&>4ErQ"fVs2k8_rQG5bs3:Jes3L_lrR(Yns3pnqs4.,"qUbYtkLoX_jOa=^
+rRq)%s4dP.rS@M1s53h6s5F";ro=%>s5j7B!pAe2rosIJ!:0UMs6TgSrU9dUs7-$Xs7?6^qXsd[
+qY/M7p\FX]oDAC^q>K[ZJcC<$JcG*:J,~>
+JcC<$JcC<$S,_pUqu-Hjq"t!crV?9arV-6`q"=OVqt'4Gp$qkIp[A+LrU'OLs6K[LrTX@Gs6'@C
+!p/M(rSmt=iSjan!oMkkrS7P1gY;\\s4RG)r7Cu"rmgkprR:Sjo[3E]q:"KUqpYMlqU,;hs3LSf
+rltJeqoeu]rlOuWqoA<JqoAQSrlP/^rQG2as3:Mfs3L_lrR(Yns3pnqs4.,"qq(i"r7U/bq:YAl
+rn$krr7Ur#rnIJ.r8%D0s53e5s5<t;rT!q=!9O4Bs6'FGrosIJ!:0UM!q#FDrU9dUs7-'Yrq$-]
+qt9m\r:ek=oD/1Xo)&:]q>K[ZJcC<$JcG$8J,~>
+JcC<$JcC<$S,_pUqu-Hjq"t!crV?9arV-6`q"=OVqt'4Gp$qkIp[A+LrU'OLs6K[LrTX@Gs6'@C
+!p/M(rSmt=iSjan!oMkkrS7P1gY;\\s4RG)r7Cu"rmgkprR:Sjo[3E]q:"KUqpYMlqU,;hs3LSf
+rltJeqoeu]rlOuWqoA<JqoAQSrlP/^rQG2as3:Mfs3L_lrR(Yns3pnqs4.,"qq(i"r7U/bq:YAl
+rn$krr7Ur#rnIJ.r8%D0s53e5s5<t;rT!q=!9O4Bs6'FGrosIJ!:0UM!q#FDrU9dUs7-'Yrq$-]
+qt9m\r:ek=oD/1Xo)&:]q>K[ZJcC<$JcG$8J,~>
+JcC<$JcC<$S,_pUqu-Hjq"t!crV?9arV-6`q"=OVqt'4Gp$qkIp[A+LrU'OLs6K[LrTX@Gs6'@C
+!p/M(rSmt=iSjan!oMkkrS7P1gY;\\s4RG)r7Cu"rmgkprR:Sjo[3E]q:"KUqpYMlqU,;hs3LSf
+rltJeqoeu]rlOuWqoA<JqoAQSrlP/^rQG2as3:Mfs3L_lrR(Yns3pnqs4.,"qq(i"r7U/bq:YAl
+rn$krr7Ur#rnIJ.r8%D0s53e5s5<t;rT!q=!9O4Bs6'FGrosIJ!:0UM!q#FDrU9dUs7-'Yrq$-]
+qt9m\r:ek=oD/1Xo)&:]q>K[ZJcC<$JcG$8J,~>
+JcC<$JcC<$S,_pUqYg?ip\XpcrV?6`rV-6`p\"FUqX`qAq!n7Nq!\4MrpBXMs6K[LrTX@Gs6'CD
+s5j:Aro=%<s5Et8s53k5rn[V0s4dM+s4RD(r7Cu"rRL_np!`rho@*0Xo[WT`rR:_nqpGGjrm1Je
+s3:Peqoeu]rQ4ZPr5\HNrlP/^qof#`s3:Jes3L_lrR(Yns3pqrrmh&"r7Cr#rRpnuo@r`fk1TO`
+rnIG-r8%D0s53e5s5F";rSmt?jlQL(s6'FGrosIJ!:0UM!q#FDrU9dUs7-'Yrq$0^qt9p]r:f=J
+kkXrKnb`.[q>K[ZJcC<$JcG!7J,~>
+JcC<$JcC<$S,_pUqYg?ip\XpcrV?6`rV-6`p\"FUqX`qAq!n7Nq!\4MrpBXMs6K[LrTX@Gs6'CD
+s5j:Aro=%<s5Et8s53k5rn[V0s4dM+s4RD(r7Cu"rRL_np!`rho@*0Xo[WT`rR:_nqpGGjrm1Je
+s3:Peqoeu]rQ4ZPr5\HNrlP/^qof#`s3:Jes3L_lrR(Yns3pqrrmh&"r7Cr#rRpnuo@r`fk1TO`
+rnIG-r8%D0s53e5s5F";rSmt?jlQL(s6'FGrosIJ!:0UM!q#FDrU9dUs7-'Yrq$0^qt9p]r:f=J
+kkXrKnb`.[q>K[ZJcC<$JcG!7J,~>
+JcC<$JcC<$S,_pUqYg?ip\XpcrV?6`rV-6`p\"FUqX`qAq!n7Nq!\4MrpBXMs6K[LrTX@Gs6'CD
+s5j:Aro=%<s5Et8s53k5rn[V0s4dM+s4RD(r7Cu"rRL_np!`rho@*0Xo[WT`rR:_nqpGGjrm1Je
+s3:Peqoeu]rQ4ZPr5\HNrlP/^qof#`s3:Jes3L_lrR(Yns3pqrrmh&"r7Cr#rRpnuo@r`fk1TO`
+rnIG-r8%D0s53e5s5F";rSmt?jlQL(s6'FGrosIJ!:0UM!q#FDrU9dUs7-'Yrq$0^qt9p]r:f=J
+kkXrKnb`.[q>K[ZJcC<$JcG!7J,~>
+JcC<$JcC<$RK)^Squ-Eiq"t!crV?6`rV-6`p%A1Rp[dV>qsjURq="=Ns6]aNs6K[LrTOCIkNDg+
+s5j:Aro=%<s5Et8s53k5rn[V0s4dJ*s4RG)qq(hurRK]Qq:4f^qpkJkrmUkpr6bMjrm1MfrltGd
+qoer\qoS9Ir5no[qof#`rltDes3L_lrR(Yns3pnqs4./#r7Cr#rn7/%qqLPoq:jWWrS.>,qq_;/
+rnm\4s5F";ro=%>s5j7Bs6'FGrosIJ!:0UM!q#FDrU9dUs7-'Ys7?6^qt9p]rV,jWiVE*An,)qY
+q>KXYJcC<$JcFs6J,~>
+JcC<$JcC<$RK)^Squ-Eiq"t!crV?6`rV-6`p%A1Rp[dV>qsjURq="=Ns6]aNs6K[LrTOCIkNDg+
+s5j:Aro=%<s5Et8s53k5rn[V0s4dJ*s4RG)qq(hurRK]Qq:4f^qpkJkrmUkpr6bMjrm1MfrltGd
+qoer\qoS9Ir5no[qof#`rltDes3L_lrR(Yns3pnqs4./#r7Cr#rn7/%qqLPoq:jWWrS.>,qq_;/
+rnm\4s5F";ro=%>s5j7Bs6'FGrosIJ!:0UM!q#FDrU9dUs7-'Ys7?6^qt9p]rV,jWiVE*An,)qY
+q>KXYJcC<$JcFs6J,~>
+JcC<$JcC<$RK)^Squ-Eiq"t!crV?6`rV-6`p%A1Rp[dV>qsjURq="=Ns6]aNs6K[LrTOCIkNDg+
+s5j:Aro=%<s5Et8s53k5rn[V0s4dJ*s4RG)qq(hurRK]Qq:4f^qpkJkrmUkpr6bMjrm1MfrltGd
+qoer\qoS9Ir5no[qof#`rltDes3L_lrR(Yns3pnqs4./#r7Cr#rn7/%qqLPoq:jWWrS.>,qq_;/
+rnm\4s5F";ro=%>s5j7Bs6'FGrosIJ!:0UM!q#FDrU9dUs7-'Ys7?6^qt9p]rV,jWiVE*An,)qY
+q>KXYJcC<$JcFs6J,~>
+JcC<$JcC<$RK)[Rqu-Eip\Xpcr;$-_r:g-_o_%tNo^hJ@r:0aTqX=FOs6]aNs6K^MrTX@Gs6'@C
+!p/M(rSmt=iSjans5*h5rS@M/rnID*rn7>(qUb\sqpk)`q:5;lkL]U^rRLbormUkpr6bMjs3LSf
+rltGdq9/ZXo#^dOqTJl^rltDerm1VkrR(Yns3pqrs4./#r7Cu$rn72&rS.8*lJ;9kptP,gqqM))
+qq_8.s53b4s5F";rT!q=!9O1As5sCGrTOCKlg+Q:s6]jSrU9dUs7-'Ys7?6^r:U$^rV,sZkkXQ@
+mJH_Wq#0OXJcC<$JcFp5J,~>
+JcC<$JcC<$RK)[Rqu-Eip\Xpcr;$-_r:g-_o_%tNo^hJ@r:0aTqX=FOs6]aNs6K^MrTX@Gs6'@C
+!p/M(rSmt=iSjans5*h5rS@M/rnID*rn7>(qUb\sqpk)`q:5;lkL]U^rRLbormUkpr6bMjs3LSf
+rltGdq9/ZXo#^dOqTJl^rltDerm1VkrR(Yns3pqrs4./#r7Cu$rn72&rS.8*lJ;9kptP,gqqM))
+qq_8.s53b4s5F";rT!q=!9O1As5sCGrTOCKlg+Q:s6]jSrU9dUs7-'Ys7?6^r:U$^rV,sZkkXQ@
+mJH_Wq#0OXJcC<$JcFp5J,~>
+JcC<$JcC<$RK)[Rqu-Eip\Xpcr;$-_r:g-_o_%tNo^hJ@r:0aTqX=FOs6]aNs6K^MrTX@Gs6'@C
+!p/M(rSmt=iSjans5*h5rS@M/rnID*rn7>(qUb\sqpk)`q:5;lkL]U^rRLbormUkpr6bMjs3LSf
+rltGdq9/ZXo#^dOqTJl^rltDerm1VkrR(Yns3pqrs4./#r7Cu$rn72&rS.8*lJ;9kptP,gqqM))
+qq_8.s53b4s5F";rT!q=!9O1As5sCGrTOCKlg+Q:s6]jSrU9dUs7-'Ys7?6^r:U$^rV,sZkkXQ@
+mJH_Wq#0OXJcC<$JcFp5J,~>
+JcC<$JcC<$R/cRQqu-Eip\Xmbr;$-_qtL$^nb)SIoCMPDrUKjUqsXOPs6]aNs6K^MrTX@Gs6'CD
+s5j:Aro=%<s5Eq7s5*h5r8%D.s4dJ*rn7;'q:GJoo%!Ndmaq0bo[j&mrmgkps3ptqr6bMjrm1Je
+rltDcp<30Pp<3HZrlt>cs3L_lrR(Vms3pqrs4./#rR_)%rn75'rnID,g>2PZmb@Woq;)&,rnmY3
+s5F";rT!q=s5j7Bs6'FGrosIJs6K[Ns6]jSrU0gWnaZPJs7?9_qt9s^rV-$\p%dPBl21;Sq#0LW
+JcC<$JcFm4J,~>
+JcC<$JcC<$R/cRQqu-Eip\Xmbr;$-_qtL$^nb)SIoCMPDrUKjUqsXOPs6]aNs6K^MrTX@Gs6'CD
+s5j:Aro=%<s5Eq7s5*h5r8%D.s4dJ*rn7;'q:GJoo%!Ndmaq0bo[j&mrmgkps3ptqr6bMjrm1Je
+rltDcp<30Pp<3HZrlt>cs3L_lrR(Vms3pqrs4./#rR_)%rn75'rnID,g>2PZmb@Woq;)&,rnmY3
+s5F";rT!q=s5j7Bs6'FGrosIJs6K[Ns6]jSrU0gWnaZPJs7?9_qt9s^rV-$\p%dPBl21;Sq#0LW
+JcC<$JcFm4J,~>
+JcC<$JcC<$R/cRQqu-Eip\Xmbr;$-_qtL$^nb)SIoCMPDrUKjUqsXOPs6]aNs6K^MrTX@Gs6'CD
+s5j:Aro=%<s5Eq7s5*h5r8%D.s4dJ*rn7;'q:GJoo%!Ndmaq0bo[j&mrmgkps3ptqr6bMjrm1Je
+rltDcp<30Pp<3HZrlt>cs3L_lrR(Vms3pqrs4./#rR_)%rn75'rnID,g>2PZmb@Woq;)&,rnmY3
+s5F";rT!q=s5j7Bs6'FGrosIJs6K[Ns6]jSrU0gWnaZPJs7?9_qt9s^rV-$\p%dPBl21;Sq#0LW
+JcC<$JcFm4J,~>
+JcC<$JcC<$R/cRQqYg<hp\Xmbr;$']r:g']me-,Bp[e+LrUKmVqsXOPs6]aNs6K^MrosIHs6'@C
+s5a7ArT!q;s5Eq7!oMkkr8%D.s4dG)rn78&o[iign(7?en(IQiq:GSrrmgqrrmUkpr6bMjrm1Je
+rQY8alc]7NrQY5bs3L_lr6bPms3pqrs4./#r7Cu$s4R>(rnIG-q;(i&q;:o&nD3Thp"fW(rnmV2
+s5F";rT!q=s5j4As6'FGrosIJs6K[Ns6]jSrpTmVs7-$Xs7?9_r:U$^rqH0^q>'(Ij88TKq#0IV
+JcC<$JcFj3J,~>
+JcC<$JcC<$R/cRQqYg<hp\Xmbr;$']r:g']me-,Bp[e+LrUKmVqsXOPs6]aNs6K^MrosIHs6'@C
+s5a7ArT!q;s5Eq7!oMkkr8%D.s4dG)rn78&o[iign(7?en(IQiq:GSrrmgqrrmUkpr6bMjrm1Je
+rQY8alc]7NrQY5bs3L_lr6bPms3pqrs4./#r7Cu$s4R>(rnIG-q;(i&q;:o&nD3Thp"fW(rnmV2
+s5F";rT!q=s5j4As6'FGrosIJs6K[Ns6]jSrpTmVs7-$Xs7?9_r:U$^rqH0^q>'(Ij88TKq#0IV
+JcC<$JcFj3J,~>
+JcC<$JcC<$R/cRQqYg<hp\Xmbr;$']r:g']me-,Bp[e+LrUKmVqsXOPs6]aNs6K^MrosIHs6'@C
+s5a7ArT!q;s5Eq7!oMkkr8%D.s4dG)rn78&o[iign(7?en(IQiq:GSrrmgqrrmUkpr6bMjrm1Je
+rQY8alc]7NrQY5bs3L_lr6bPms3pqrs4./#r7Cu$s4R>(rnIG-q;(i&q;:o&nD3Thp"fW(rnmV2
+s5F";rT!q=s5j4As6'FGrosIJs6K[Ns6]jSrpTmVs7-$Xs7?9_r:U$^rqH0^q>'(Ij88TKq#0IV
+JcC<$JcFj3J,~>
+JcC<$JcC<$QN-@Oqu-EipA=dar;$']qY0j[kk4T?q=FCPrUKmVr9sXQs6]dOs6K^MrTX@Gs6'CD
+s5j:ArT!q;s5Et8s53h4rS@J.s4dG)rRq,$kL]O^q:Y&eqq:r#qUb_trmgnqs3ptqqpGGjrQk>c
+r6=ZRr6>)`rm1SjrR(Vms3pqrs4./#rR_)%rn78(rnIG-qq_2,q;:o(pYYi(i8+=frnmV2ro*n:
+r8[h<s5j4As5sCGrTX@Is6K[Ns6]jSrpTmVs7-'Yrq$0^r:U'_rV--_qYB^Ye,/n;p\j@UJcC<$
+JcFd1J,~>
+JcC<$JcC<$QN-@Oqu-EipA=dar;$']qY0j[kk4T?q=FCPrUKmVr9sXQs6]dOs6K^MrTX@Gs6'CD
+s5j:ArT!q;s5Et8s53h4rS@J.s4dG)rRq,$kL]O^q:Y&eqq:r#qUb_trmgnqs3ptqqpGGjrQk>c
+r6=ZRr6>)`rm1SjrR(Vms3pqrs4./#rR_)%rn78(rnIG-qq_2,q;:o(pYYi(i8+=frnmV2ro*n:
+r8[h<s5j4As5sCGrTX@Is6K[Ns6]jSrpTmVs7-'Yrq$0^r:U'_rV--_qYB^Ye,/n;p\j@UJcC<$
+JcFd1J,~>
+JcC<$JcC<$QN-@Oqu-EipA=dar;$']qY0j[kk4T?q=FCPrUKmVr9sXQs6]dOs6K^MrTX@Gs6'CD
+s5j:ArT!q;s5Et8s53h4rS@J.s4dG)rRq,$kL]O^q:Y&eqq:r#qUb_trmgnqs3ptqqpGGjrQk>c
+r6=ZRr6>)`rm1SjrR(Vms3pqrs4./#rR_)%rn78(rnIG-qq_2,q;:o(pYYi(i8+=frnmV2ro*n:
+r8[h<s5j4As5sCGrTX@Is6K[Ns6]jSrpTmVs7-'Yrq$0^r:U'_rV--_qYB^Ye,/n;p\j@UJcC<$
+JcFd1J,~>
+JcC<$JcC<$Q2g7NqYg<hpA=dar;$$\qY0dYj7W3>r:B^Srpg!Wr9s[RrpB[Ns6K^MrTOCIkNDg+
+s5j:ArSmt=iSj^ms53k5r8%D.rnI8&r7U>eq:XHTrRq2&qq(hurmgqrrmUkpr6bJirm1>ao$-pS
+rm1SjqpGGls3pqrrmh&"rR_)%s4R>(s4dS/qq_5-rSQVmqVV))n_O&ur87A/ro*n:r8[h<s5j4A
+s6'FGrTX@I!:0UMs6]jSrpTmVs7-'Yrq$0^r:U'_rqH6`qYBj]d/3P7p\j=TJcC<$JcFa0J,~>
+JcC<$JcC<$Q2g7NqYg<hpA=dar;$$\qY0dYj7W3>r:B^Srpg!Wr9s[RrpB[Ns6K^MrTOCIkNDg+
+s5j:ArSmt=iSj^ms53k5r8%D.rnI8&r7U>eq:XHTrRq2&qq(hurmgqrrmUkpr6bJirm1>ao$-pS
+rm1SjqpGGls3pqrrmh&"rR_)%s4R>(s4dS/qq_5-rSQVmqVV))n_O&ur87A/ro*n:r8[h<s5j4A
+s6'FGrTX@I!:0UMs6]jSrpTmVs7-'Yrq$0^r:U'_rqH6`qYBj]d/3P7p\j=TJcC<$JcFa0J,~>
+JcC<$JcC<$Q2g7NqYg<hpA=dar;$$\qY0dYj7W3>r:B^Srpg!Wr9s[RrpB[Ns6K^MrTOCIkNDg+
+s5j:ArSmt=iSj^ms53k5r8%D.rnI8&r7U>eq:XHTrRq2&qq(hurmgqrrmUkpr6bJirm1>ao$-pS
+rm1SjqpGGls3pqrrmh&"rR_)%s4R>(s4dS/qq_5-rSQVmqVV))n_O&ur87A/ro*n:r8[h<s5j4A
+s6'FGrTX@I!:0UMs6]jSrpTmVs7-'Yrq$0^r:U'_rqH6`qYBj]d/3P7p\j=TJcC<$JcFa0J,~>
+JcC<$JcC<$Q2g4MqYg<hpA=a`qt]mZq=jRUjn8KBr:BdUrpg!Wr9s[Rs6]dOs6K^MrTX@Gs6'@C
+s5j:Aro=%<s5En6s53k5qq_8,rnI2$mFh$`ptPDqq:k\urn7;'qq(l!rmgqrrmUkpqpGAhrQj]Q
+r6PAhqpGGlrmUhqs4./#r7Cu$s4RA)s4dP.r8%A/rnmG-nDWoqpYYT!qVV)+ro*k9r8[h<s5j1@
+s6'FGrosIJs6KXMs6TgSrU9dUs7-'Ys7?6^r:U*`rV-0`qt^*bc27/2p\j:SJcC<$JcF^/J,~>
+JcC<$JcC<$Q2g4MqYg<hpA=a`qt]mZq=jRUjn8KBr:BdUrpg!Wr9s[Rs6]dOs6K^MrTX@Gs6'@C
+s5j:Aro=%<s5En6s53k5qq_8,rnI2$mFh$`ptPDqq:k\urn7;'qq(l!rmgqrrmUkpqpGAhrQj]Q
+r6PAhqpGGlrmUhqs4./#r7Cu$s4RA)s4dP.r8%A/rnmG-nDWoqpYYT!qVV)+ro*k9r8[h<s5j1@
+s6'FGrosIJs6KXMs6TgSrU9dUs7-'Ys7?6^r:U*`rV-0`qt^*bc27/2p\j:SJcC<$JcF^/J,~>
+JcC<$JcC<$Q2g4MqYg<hpA=a`qt]mZq=jRUjn8KBr:BdUrpg!Wr9s[Rs6]dOs6K^MrTX@Gs6'@C
+s5j:Aro=%<s5En6s53k5qq_8,rnI2$mFh$`ptPDqq:k\urn7;'qq(l!rmgqrrmUkpqpGAhrQj]Q
+r6PAhqpGGlrmUhqs4./#r7Cu$s4RA)s4dP.r8%A/rnmG-nDWoqpYYT!qVV)+ro*k9r8[h<s5j1@
+s6'FGrosIJs6KXMs6TgSrU9dUs7-'Ys7?6^r:U*`rV-0`qt^*bc27/2p\j:SJcC<$JcF^/J,~>
+JcC<$JcC<$PlL+LqYg9gpA=a`qt]gXp\44OlLk)IrU]mVrpg!Wr9s[Rs6]dOs6K^MrTX@Gs6'@C
+!p/M(rT!q;ro*h6s53h4qq_8,r7g/`qV1i$n(miqr7h)%rn7;'r7Cr!rmgqrrmUkpqU,5fps8l`
+ps8ocqU,>krmUeps4./#rR_)%s4R>(s4dS/r8%A/rnmS1qr-u&q;Lf#o\]?"rSdb8qr@_;roO+@
+s6'FGrTX@Is6KXM!q#FDrU9dUs7-'Ys7?6^r:U*`rqH6`r;$3cd/3D3pAO.QJcC<$JcF[.J,~>
+JcC<$JcC<$PlL+LqYg9gpA=a`qt]gXp\44OlLk)IrU]mVrpg!Wr9s[Rs6]dOs6K^MrTX@Gs6'@C
+!p/M(rT!q;ro*h6s53h4qq_8,r7g/`qV1i$n(miqr7h)%rn7;'r7Cr!rmgqrrmUkpqU,5fps8l`
+ps8ocqU,>krmUeps4./#rR_)%s4R>(s4dS/r8%A/rnmS1qr-u&q;Lf#o\]?"rSdb8qr@_;roO+@
+s6'FGrTX@Is6KXM!q#FDrU9dUs7-'Ys7?6^r:U*`rqH6`r;$3cd/3D3pAO.QJcC<$JcF[.J,~>
+JcC<$JcC<$PlL+LqYg9gpA=a`qt]gXp\44OlLk)IrU]mVrpg!Wr9s[Rs6]dOs6K^MrTX@Gs6'@C
+!p/M(rT!q;ro*h6s53h4qq_8,r7g/`qV1i$n(miqr7h)%rn7;'r7Cr!rmgqrrmUkpqU,5fps8l`
+ps8ocqU,>krmUeps4./#rR_)%s4R>(s4dS/r8%A/rnmS1qr-u&q;Lf#o\]?"rSdb8qr@_;roO+@
+s6'FGrTX@Is6KXM!q#FDrU9dUs7-'Ys7?6^r:U*`rqH6`r;$3cd/3D3pAO.QJcC<$JcF[.J,~>
+JcC<$JcC<$P5jnJqYg<hp&"U^qt]aVoCq_Io(DqQrU]pWrpg$Xr9s[RrpB[Ns6K^MrosIHs6'@C
+s5j:ArT!q;ro*h6rnm_3qVD,*qV1PoptPZ#hVJ.crS.5'rn7;'r7Cr!rmgnqrmUkppsJHTq9f2i
+rmUeps4.,"rR_)%s4RA)s4dP.rS@J0s53\2ro*b6m,Rp$q;LAlr8IY7qW%V:roO+@roa=FrTX@I
+s6K[Ns6]jSrU9dUs7-'Ys7?6^rUp0`rqH9ar;$6de,/Y4o_mqOJcC<$JcFU,J,~>
+JcC<$JcC<$P5jnJqYg<hp&"U^qt]aVoCq_Io(DqQrU]pWrpg$Xr9s[RrpB[Ns6K^MrosIHs6'@C
+s5j:ArT!q;ro*h6rnm_3qVD,*qV1PoptPZ#hVJ.crS.5'rn7;'r7Cr!rmgnqrmUkppsJHTq9f2i
+rmUeps4.,"rR_)%s4RA)s4dP.rS@J0s53\2ro*b6m,Rp$q;LAlr8IY7qW%V:roO+@roa=FrTX@I
+s6K[Ns6]jSrU9dUs7-'Ys7?6^rUp0`rqH9ar;$6de,/Y4o_mqOJcC<$JcFU,J,~>
+JcC<$JcC<$P5jnJqYg<hp&"U^qt]aVoCq_Io(DqQrU]pWrpg$Xr9s[RrpB[Ns6K^MrosIHs6'@C
+s5j:ArT!q;ro*h6rnm_3qVD,*qV1PoptPZ#hVJ.crS.5'rn7;'r7Cr!rmgnqrmUkppsJHTq9f2i
+rmUeps4.,"rR_)%s4RA)s4dP.rS@J0s53\2ro*b6m,Rp$q;LAlr8IY7qW%V:roO+@roa=FrTX@I
+s6K[Ns6]jSrU9dUs7-'Ys7?6^rUp0`rqH9ar;$6de,/Y4o_mqOJcC<$JcFU,J,~>
+JcC<$JcC<$OoOeIqYg9go_\O^qYBLQn+ZJJp%A:UrU]pWrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'@C
+s5j:ArT!q;ro*e5rnm_3ptbc$p=o>so%iNdptbo(rnI>(rn7>(qq(hus4."rrR:_njjF%TrR:\o
+rmh&"rR_&$s4RA)s4dS/r8%D0s53_3ro*h8h;e@kp>Pc(pu2/1qW%S9roO+@roa=FrTX@Is6KXM
+s6]jSrU9dUs7-'Ys7?9_r:U'_rqH9arV?BfiVV[5oDRbLJcC<$JcFR+J,~>
+JcC<$JcC<$OoOeIqYg9go_\O^qYBLQn+ZJJp%A:UrU]pWrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'@C
+s5j:ArT!q;ro*e5rnm_3ptbc$p=o>so%iNdptbo(rnI>(rn7>(qq(hus4."rrR:_njjF%TrR:\o
+rmh&"rR_&$s4RA)s4dS/r8%D0s53_3ro*h8h;e@kp>Pc(pu2/1qW%S9roO+@roa=FrTX@Is6KXM
+s6]jSrU9dUs7-'Ys7?9_r:U'_rqH9arV?BfiVV[5oDRbLJcC<$JcFR+J,~>
+JcC<$JcC<$OoOeIqYg9go_\O^qYBLQn+ZJJp%A:UrU]pWrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'@C
+s5j:ArT!q;ro*e5rnm_3ptbc$p=o>so%iNdptbo(rnI>(rn7>(qq(hus4."rrR:_njjF%TrR:\o
+rmh&"rR_&$s4RA)s4dS/r8%D0s53_3ro*h8h;e@kp>Pc(pu2/1qW%S9roO+@roa=FrTX@Is6KXM
+s6]jSrU9dUs7-'Ys7?9_r:U'_rqH9arV?BfiVV[5oDRbLJcC<$JcFR+J,~>
+JcC<$JcC<$OT4\Hq>L0fo_\L]q>'4Kn+ZVNp\"LWrq$$Xs7-*XrU9aRs6]dOs6K^MrTX@Gs6'@C
+s5j:ArT!n:s5Ek5rnm\2oA05tn(misp##Z)pYYo*q;)&*rnIA)rn7;'r7Cr!rmgkprR:Ylo$R?_
+rR:Ynrmh&"r7Cu$s4R>(s4dS/rS@J0s53b4ro*k9puCZ#o&KH'pYko,puDA7roO%>s6'FGr9=7H
+s6KXMs6]jSrU9dUs7-'Ys7?9_r:U'_s7cBbrV?BflhfH7nbqPJJcC<$JcFL)J,~>
+JcC<$JcC<$OT4\Hq>L0fo_\L]q>'4Kn+ZVNp\"LWrq$$Xs7-*XrU9aRs6]dOs6K^MrTX@Gs6'@C
+s5j:ArT!n:s5Ek5rnm\2oA05tn(misp##Z)pYYo*q;)&*rnIA)rn7;'r7Cr!rmgkprR:Ylo$R?_
+rR:Ynrmh&"r7Cu$s4R>(s4dS/rS@J0s53b4ro*k9puCZ#o&KH'pYko,puDA7roO%>s6'FGr9=7H
+s6KXMs6]jSrU9dUs7-'Ys7?9_r:U'_s7cBbrV?BflhfH7nbqPJJcC<$JcFL)J,~>
+JcC<$JcC<$OT4\Hq>L0fo_\L]q>'4Kn+ZVNp\"LWrq$$Xs7-*XrU9aRs6]dOs6K^MrTX@Gs6'@C
+s5j:ArT!n:s5Ek5rnm\2oA05tn(misp##Z)pYYo*q;)&*rnIA)rn7;'r7Cr!rmgkprR:Ylo$R?_
+rR:Ynrmh&"r7Cu$s4R>(s4dS/rS@J0s53b4ro*k9puCZ#o&KH'pYko,puDA7roO%>s6'FGr9=7H
+s6KXMs6]jSrU9dUs7-'Ys7?9_r:U'_s7cBbrV?BflhfH7nbqPJJcC<$JcFL)J,~>
+JcC<$JcC<$O8nSGq>L0foDA@[q"`nDo_84Uq"=UXrq$'Yrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'=B
+s5j:Ar8[h:ro*b4rSRP0k2#mjqVU>kr87J0qq_8,rnIA)rn7;'r7Cr!rRL_nqU>,cqpYAjrmh#!
+r7Cu$s4RA)rnIJ.rS@M1s53b4ro*k9qW%M7lK.j&n)O-$o],o2rT3q=s6'CFrTX@Is6KXMs6]gR
+rU9dUs7-'Ys7?9_r:U'_rqH<brV?BfnGCu<meu/EJcC<$JcFI(J,~>
+JcC<$JcC<$O8nSGq>L0foDA@[q"`nDo_84Uq"=UXrq$'Yrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'=B
+s5j:Ar8[h:ro*b4rSRP0k2#mjqVU>kr87J0qq_8,rnIA)rn7;'r7Cr!rRL_nqU>,cqpYAjrmh#!
+r7Cu$s4RA)rnIJ.rS@M1s53b4ro*k9qW%M7lK.j&n)O-$o],o2rT3q=s6'CFrTX@Is6KXMs6]gR
+rU9dUs7-'Ys7?9_r:U'_rqH<brV?BfnGCu<meu/EJcC<$JcFI(J,~>
+JcC<$JcC<$O8nSGq>L0foDA@[q"`nDo_84Uq"=UXrq$'Yrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'=B
+s5j:Ar8[h:ro*b4rSRP0k2#mjqVU>kr87J0qq_8,rnIA)rn7;'r7Cr!rRL_nqU>,cqpYAjrmh#!
+r7Cu$s4RA)rnIJ.rS@M1s53b4ro*k9qW%M7lK.j&n)O-$o],o2rT3q=s6'CFrTX@Is6KXMs6]gR
+rU9dUs7-'Ys7?9_r:U'_rqH<brV?BfnGCu<meu/EJcC<$JcFI(J,~>
+JcC<$JcC<$O8nMEq>L0fo)&4YpA*S?q"O^[q"=XYrq$'Yrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'=B
+s5j:Ar8[e9ro*\2r86bqq;:`#n_s0!rSRV2qq_8,s4dG)rn7>(qq(etrmgViqpY2erRLnur7Cu$
+rn78(s4dS/r8%D0s53b4s5Et:qr@Y9r8m2*qW7P6jQ$-urT3q=roa=Fr9=7Hrp0OLs6]jSrU9dU
+s7-$Xs7?9_r:U*`rqH9arqZKgo)%GEkPa<;JcC<$JcFF'J,~>
+JcC<$JcC<$O8nMEq>L0fo)&4YpA*S?q"O^[q"=XYrq$'Yrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'=B
+s5j:Ar8[e9ro*\2r86bqq;:`#n_s0!rSRV2qq_8,s4dG)rn7>(qq(etrmgViqpY2erRLnur7Cu$
+rn78(s4dS/r8%D0s53b4s5Et:qr@Y9r8m2*qW7P6jQ$-urT3q=roa=Fr9=7Hrp0OLs6]jSrU9dU
+s7-$Xs7?9_r:U*`rqH9arqZKgo)%GEkPa<;JcC<$JcFF'J,~>
+JcC<$JcC<$O8nMEq>L0fo)&4YpA*S?q"O^[q"=XYrq$'Yrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'=B
+s5j:Ar8[e9ro*\2r86bqq;:`#n_s0!rSRV2qq_8,s4dG)rn7>(qq(etrmgViqpY2erRLnur7Cu$
+rn78(s4dS/r8%D0s53b4s5Et:qr@Y9r8m2*qW7P6jQ$-urT3q=roa=Fr9=7Hrp0OLs6]jSrU9dU
+s7-$Xs7?9_r:U*`rqH9arqZKgo)%GEkPa<;JcC<$JcFF'J,~>
+JcC<$JcC<$NW8>Dq>L-enb`+XoD.;=qY0p]qXsgZs7?-Ys7--Yr9s[Rs6]dOs6K^Mr9=7Fs6'@C
+roO1@qr@\8ro*V0l/2*jq;Lc$qVh8.rnm_3qq_8,rnIA)rn7;'qq(etqpk)`r71bsqq(i"s4R>(
+s4dS/rS@J0s53e5ro*n:qr@\:rT2ktq;qA3p#Gl/r8mb:roa:Er9=7Hs6KULs6]jSrU9dUs7-'Y
+rq$0^r:U*`rqH<brV?Ego_\(Sg\p".JcC<$JcF=$J,~>
+JcC<$JcC<$NW8>Dq>L-enb`+XoD.;=qY0p]qXsgZs7?-Ys7--Yr9s[Rs6]dOs6K^Mr9=7Fs6'@C
+roO1@qr@\8ro*V0l/2*jq;Lc$qVh8.rnm_3qq_8,rnIA)rn7;'qq(etqpk)`r71bsqq(i"s4R>(
+s4dS/rS@J0s53e5ro*n:qr@\:rT2ktq;qA3p#Gl/r8mb:roa:Er9=7Hs6KULs6]jSrU9dUs7-'Y
+rq$0^r:U*`rqH<brV?Ego_\(Sg\p".JcC<$JcF=$J,~>
+JcC<$JcC<$NW8>Dq>L-enb`+XoD.;=qY0p]qXsgZs7?-Ys7--Yr9s[Rs6]dOs6K^Mr9=7Fs6'@C
+roO1@qr@\8ro*V0l/2*jq;Lc$qVh8.rnm_3qq_8,rnIA)rn7;'qq(etqpk)`r71bsqq(i"s4R>(
+s4dS/rS@J0s53e5ro*n:qr@\:rT2ktq;qA3p#Gl/r8mb:roa:Er9=7Hs6KULs6]jSrU9dUs7-'Y
+rq$0^r:U*`rqH<brV?Ego_\(Sg\p".JcC<$JcF=$J,~>
+JcC<$JcC<$N;r2Bq>L-en,)hTmeQ#?qtL'_qXsj[rq$'Yrpg$XrU9aRs6]dOs6K^MrTX=Fs6'=B
+s5j7@qr@\8r8HJiqr.A1m,S!&r8IM1rnm_3r8%A-s4dG)rn7;'q:GPqmFD-cqUb`!s4R>(rnIJ.
+rS@M1rnm\4s5Et:r8[e;roNq;lK@^"pZ;)/puV;5roa:Eqs".Grp0OLs6]jSr9s[Ts7-'Yrq$0^
+r:U*`rqH<brqZKgp&"CZg&9Y(JcC<$JcF7"J,~>
+JcC<$JcC<$N;r2Bq>L-en,)hTmeQ#?qtL'_qXsj[rq$'Yrpg$XrU9aRs6]dOs6K^MrTX=Fs6'=B
+s5j7@qr@\8r8HJiqr.A1m,S!&r8IM1rnm_3r8%A-s4dG)rn7;'q:GPqmFD-cqUb`!s4R>(rnIJ.
+rS@M1rnm\4s5Et:r8[e;roNq;lK@^"pZ;)/puV;5roa:Eqs".Grp0OLs6]jSr9s[Ts7-'Yrq$0^
+r:U*`rqH<brqZKgp&"CZg&9Y(JcC<$JcF7"J,~>
+JcC<$JcC<$N;r2Bq>L-en,)hTmeQ#?qtL'_qXsj[rq$'Yrpg$XrU9aRs6]dOs6K^MrTX=Fs6'=B
+s5j7@qr@\8r8HJiqr.A1m,S!&r8IM1rnm_3r8%A-s4dG)rn7;'q:GPqmFD-cqUb`!s4R>(rnIJ.
+rS@M1rnm\4s5Et:r8[e;roNq;lK@^"pZ;)/puV;5roa:Eqs".Grp0OLs6]jSr9s[Ts7-'Yrq$0^
+r:U*`rqH<brqZKgp&"CZg&9Y(JcC<$JcF7"J,~>
+JcC<$JcC<$MuW)Aq#1!cn,)_QlM9iBr:g0`qXsj[rq$'Ys7-*XrU9dSs6]aNs6K^MrTX=Fs6'=B
+roO.?qr@V6qr-o"q;M20h;eInrSdY3rnm_3r8%A-rnIA)rRq2&pXelbpt,Jsrn75's4dS/r8%D0
+s53b4s5F";r8[e;roO"=r9*A/q<.5/o]>`-rTF.Cqs".Grp0LKs6]jSrU9aTs7-'Ys7?6^r:U*`
+rqH<brqZNhp&"L]g\o\%JcC<$JcF0uJ,~>
+JcC<$JcC<$MuW)Aq#1!cn,)_QlM9iBr:g0`qXsj[rq$'Ys7-*XrU9dSs6]aNs6K^MrTX=Fs6'=B
+roO.?qr@V6qr-o"q;M20h;eInrSdY3rnm_3r8%A-rnIA)rRq2&pXelbpt,Jsrn75's4dS/r8%D0
+s53b4s5F";r8[e;roO"=r9*A/q<.5/o]>`-rTF.Cqs".Grp0LKs6]jSrU9aTs7-'Ys7?6^r:U*`
+rqH<brqZNhp&"L]g\o\%JcC<$JcF0uJ,~>
+JcC<$JcC<$MuW)Aq#1!cn,)_QlM9iBr:g0`qXsj[rq$'Ys7-*XrU9dSs6]aNs6K^MrTX=Fs6'=B
+roO.?qr@V6qr-o"q;M20h;eInrSdY3rnm_3r8%A-rnIA)rRq2&pXelbpt,Jsrn75's4dS/r8%D0
+s53b4s5F";r8[e;roO"=r9*A/q<.5/o]>`-rTF.Cqs".Grp0LKs6]jSrU9aTs7-'Ys7?6^r:U*`
+rqH<brqZNhp&"L]g\o\%JcC<$JcF0uJ,~>
+JcC<$JcC<$M>ul?q#1!cm/-2HmJ6>Jr:g0`qt9s\rq$'Ys7--Yr9s[Rs6]dOrp0ULrTX=Fs6'=B
+roO+>q;_A3m,@d"o&K&spZ)53ro*b4rnm_3r8%A-rnI>(rRq/%jk'I`rn72&s4dP.r8%D0s53e5
+ro*n:r8[h<roO%>rTF+BlKS-.q<-`!r9+%Bqs"+Frp0LKs6]gRrU9dUrpfsXs7?6^r:U*`rqH<b
+rqZNhpA=X_i;Lt#JcC<$JcF-tJ,~>
+JcC<$JcC<$M>ul?q#1!cm/-2HmJ6>Jr:g0`qt9s\rq$'Ys7--Yr9s[Rs6]dOrp0ULrTX=Fs6'=B
+roO+>q;_A3m,@d"o&K&spZ)53ro*b4rnm_3r8%A-rnI>(rRq/%jk'I`rn72&s4dP.r8%D0s53e5
+ro*n:r8[h<roO%>rTF+BlKS-.q<-`!r9+%Bqs"+Frp0LKs6]gRrU9dUrpfsXs7?6^r:U*`rqH<b
+rqZNhpA=X_i;Lt#JcC<$JcF-tJ,~>
+JcC<$JcC<$M>ul?q#1!cm/-2HmJ6>Jr:g0`qt9s\rq$'Ys7--Yr9s[Rs6]dOrp0ULrTX=Fs6'=B
+roO+>q;_A3m,@d"o&K&spZ)53ro*b4rnm_3r8%A-rnI>(rRq/%jk'I`rn72&s4dP.r8%D0s53e5
+ro*n:r8[h<roO%>rTF+BlKS-.q<-`!r9+%Bqs"+Frp0LKs6]gRrU9dUrpfsXs7?6^r:U*`rqH<b
+rqZNhpA=X_i;Lt#JcC<$JcF-tJ,~>
+JcC<$JcC<$M#Z`=q#0sbl20`AoD/%Rr:g3aqXsm\rq$'Ys7-*XrU9dSrpB[Ns6K^Mr9=4Es6':A
+roO+>p>bQ"o&KQ,l/hg'q;_J6ro*e5rnm_3qq_;-rS.2&rRq&"p"0&mrRq&$rnIJ.r8%D0rnm\4
+s5Et:rT!n<s5j.?roa7Dh<Fe"pZM)/qWIe?q<@nDrp0LKrpBaRr9s[Ts7-$Xs7?9_r:U'_s7cEc
+rV?Hhp\Xdam/=a!JcC<$JcF'rJ,~>
+JcC<$JcC<$M#Z`=q#0sbl20`AoD/%Rr:g3aqXsm\rq$'Ys7-*XrU9dSrpB[Ns6K^Mr9=4Es6':A
+roO+>p>bQ"o&KQ,l/hg'q;_J6ro*e5rnm_3qq_;-rS.2&rRq&"p"0&mrRq&$rnIJ.r8%D0rnm\4
+s5Et:rT!n<s5j.?roa7Dh<Fe"pZM)/qWIe?q<@nDrp0LKrpBaRr9s[Ts7-$Xs7?9_r:U'_s7cEc
+rV?Hhp\Xdam/=a!JcC<$JcF'rJ,~>
+JcC<$JcC<$M#Z`=q#0sbl20`AoD/%Rr:g3aqXsm\rq$'Ys7-*XrU9dSrpB[Ns6K^Mr9=4Es6':A
+roO+>p>bQ"o&KQ,l/hg'q;_J6ro*e5rnm_3qq_;-rS.2&rRq&"p"0&mrRq&$rnIJ.r8%D0rnm\4
+s5Et:rT!n<s5j.?roa7Dh<Fe"pZM)/qWIe?q<@nDrp0LKrpBaRr9s[Ts7-$Xs7?9_r:U'_s7cEc
+rV?Hhp\Xdam/=a!JcC<$JcF'rJ,~>
+JcC<$JcC<$L]?T;p\jjaj88*;q"aXYrV-9aqt9s\s7?0Zrpg$Xr9s[Rs6]aNs6K^Mr9=4Eroa1@
+rT4"=hW+InqW6r'qrRe;qW%S7ro*b4s53h4qq_8,rnI5%q:YPqq:YStrnIG-r8%D0s53b4s5F";
+r8[h<roO(?roa:EpZ_&0n`fi4n)sQ2q!%eCrTjCJrpBaRr9sXSs7-$Xs7?9_r:U'_s7cEcrV?Eg
+q"smbo)63"JcC<$JcF!pJ,~>
+JcC<$JcC<$L]?T;p\jjaj88*;q"aXYrV-9aqt9s\s7?0Zrpg$Xr9s[Rs6]aNs6K^Mr9=4Eroa1@
+rT4"=hW+InqW6r'qrRe;qW%S7ro*b4s53h4qq_8,rnI5%q:YPqq:YStrnIG-r8%D0s53b4s5F";
+r8[h<roO(?roa:EpZ_&0n`fi4n)sQ2q!%eCrTjCJrpBaRr9sXSs7-$Xs7?9_r:U'_s7cEcrV?Eg
+q"smbo)63"JcC<$JcF!pJ,~>
+JcC<$JcC<$L]?T;p\jjaj88*;q"aXYrV-9aqt9s\s7?0Zrpg$Xr9s[Rs6]aNs6K^Mr9=4Eroa1@
+rT4"=hW+InqW6r'qrRe;qW%S7ro*b4s53h4qq_8,rnI5%q:YPqq:YStrnIG-r8%D0s53b4s5F";
+r8[h<roO(?roa:EpZ_&0n`fi4n)sQ2q!%eCrTjCJrpBaRr9sXSs7-$Xs7?9_r:U'_s7cEcrV?Eg
+q"smbo)63"JcC<$JcF!pJ,~>
+JcC<$JcC<$LB$K:p\jg`gACC9q>'d[rV-9aqt:!]rq$'Ys7-*XrU9aRs6]aNs6K^Mqs"+Droa.?
+rT3n:mc4-(qW6GnrT4"=qr@\8ro*b4s53h4qq_5+rS-tuqq:SprnID,r8%A/s53b4s5F";r8[h<
+s5j1@roa:Eq<@eAmHaT5nEKB)p$)G?rp0IJrpB^Qr9s[Ts7-$Xrq$0^r:U'_s7cEcrV?Hhp\Xgb
+p&2H#JcC<$JcEmmJ,~>
+JcC<$JcC<$LB$K:p\jg`gACC9q>'d[rV-9aqt:!]rq$'Ys7-*XrU9aRs6]aNs6K^Mqs"+Droa.?
+rT3n:mc4-(qW6GnrT4"=qr@\8ro*b4s53h4qq_5+rS-tuqq:SprnID,r8%A/s53b4s5F";r8[h<
+s5j1@roa:Eq<@eAmHaT5nEKB)p$)G?rp0IJrpB^Qr9s[Ts7-$Xrq$0^r:U'_s7cEcrV?Hhp\Xgb
+p&2H#JcC<$JcEmmJ,~>
+JcC<$JcC<$LB$K:p\jg`gACC9q>'d[rV-9aqt:!]rq$'Ys7-*XrU9aRs6]aNs6K^Mqs"+Droa.?
+rT3n:mc4-(qW6GnrT4"=qr@\8ro*b4s53h4qq_5+rS-tuqq:SprnID,r8%A/s53b4s5F";r8[h<
+s5j1@roa:Eq<@eAmHaT5nEKB)p$)G?rp0IJrpB^Qr9s[Ts7-$Xrq$0^r:U'_s7cEcrV?Hhp\Xgb
+p&2H#JcC<$JcEmmJ,~>
+JcC<$JcC<$K`C67pAO[^ebf%9qt^$^rV-<bqt9s\rq$'Ys7--Yr9s[RrpB[Nrp0RKr9=4ErTF"=
+qW7/+q;q20kNDU%roO.?qr@\8ro*b4s53h4qVD,*r7gPkr7h2*qq_8.rnm\4ro*n:r8[h<s5j1@
+roa:Eqs"%Dqs3b<q!7b@h!+b%rp0FIrpB^Qr9sXSs7-$Xs7?6^r:U*`rqH<brqZNhq"ssdpAMN#
+JcC<$JcEdjJ,~>
+JcC<$JcC<$K`C67pAO[^ebf%9qt^$^rV-<bqt9s\rq$'Ys7--Yr9s[RrpB[Nrp0RKr9=4ErTF"=
+qW7/+q;q20kNDU%roO.?qr@\8ro*b4s53h4qVD,*r7gPkr7h2*qq_8.rnm\4ro*n:r8[h<s5j1@
+roa:Eqs"%Dqs3b<q!7b@h!+b%rp0FIrpB^Qr9sXSs7-$Xs7?6^r:U*`rqH<brqZNhq"ssdpAMN#
+JcC<$JcEdjJ,~>
+JcC<$JcC<$K`C67pAO[^ebf%9qt^$^rV-<bqt9s\rq$'Ys7--Yr9s[RrpB[Nrp0RKr9=4ErTF"=
+qW7/+q;q20kNDU%roO.?qr@\8ro*b4s53h4qVD,*r7gPkr7h2*qq_8.rnm\4ro*n:r8[h<s5j1@
+roa:Eqs"%Dqs3b<q!7b@h!+b%rp0FIrpB^Qr9sXSs7-$Xs7?6^r:U*`rqH<brqZNhq"ssdpAMN#
+JcC<$JcEdjJ,~>
+JcC<$JcC<$KE(*5p&4L[eGK(<qt^$^rV-<bqt:!]rq$'Ys7-*XrU9aRs6]aNrp0RKqs"+DrTEn:
+mH*p$qWI#)qrdh<rT4%>r8[e9ro*b4rnm_3qVD&(m+_HnqVD/-rnmY3ro*n:rT!n<s5j1@s6'CF
+qs"(ErTiJ0q<RkAl08'0rTj:GrpB^Qr9sXSrpfpWs7?6^r:U*`rqH<brqZNhq"ssdp\hW$JcC<$
+JcE^hJ,~>
+JcC<$JcC<$KE(*5p&4L[eGK(<qt^$^rV-<bqt:!]rq$'Ys7-*XrU9aRs6]aNrp0RKqs"+DrTEn:
+mH*p$qWI#)qrdh<rT4%>r8[e9ro*b4rnm_3qVD&(m+_HnqVD/-rnmY3ro*n:rT!n<s5j1@s6'CF
+qs"(ErTiJ0q<RkAl08'0rTj:GrpB^Qr9sXSrpfpWs7?6^r:U*`rqH<brqZNhq"ssdp\hW$JcC<$
+JcE^hJ,~>
+JcC<$JcC<$KE(*5p&4L[eGK(<qt^$^rV-<bqt:!]rq$'Ys7-*XrU9aRs6]aNrp0RKqs"+DrTEn:
+mH*p$qWI#)qrdh<rT4%>r8[e9ro*b4rnm_3qVD&(m+_HnqVD/-rnmY3ro*n:rT!n<s5j1@s6'CF
+qs"(ErTiJ0q<RkAl08'0rTj:GrpB^Qr9sXSrpfpWs7?6^r:U*`rqH<brqZNhq"ssdp\hW$JcC<$
+JcE^hJ,~>
+JcC<$JcC<$KE('4o_n:Webf4>r;$-_rqHEcqt9s\s7?0Zrpg$Xr9sXQs6]aNrp0RKqs"(Cr9)r!
+qWI\<kNVp.r9*q=roO.?r8[e9ro*b4rnm\2ptb;lptbr+rnmV2s5F";r8[h<roO+@roa=Fqs"+F
+rTj+Bp?h>8q<R5/qWmtDrU'UPqsXRSrpfpWrq$0^r:U'_rqH<brqZNhq>:'eq#.c&JcC<$JcERd
+J,~>
+JcC<$JcC<$KE('4o_n:Webf4>r;$-_rqHEcqt9s\s7?0Zrpg$Xr9sXQs6]aNrp0RKqs"(Cr9)r!
+qWI\<kNVp.r9*q=roO.?r8[e9ro*b4rnm\2ptb;lptbr+rnmV2s5F";r8[h<roO+@roa=Fqs"+F
+rTj+Bp?h>8q<R5/qWmtDrU'UPqsXRSrpfpWrq$0^r:U'_rqH<brqZNhq>:'eq#.c&JcC<$JcERd
+J,~>
+JcC<$JcC<$KE('4o_n:Webf4>r;$-_rqHEcqt9s\s7?0Zrpg$Xr9sXQs6]aNrp0RKqs"(Cr9)r!
+qWI\<kNVp.r9*q=roO.?r8[e9ro*b4rnm\2ptb;lptbr+rnmV2s5F";r8[h<roO+@roa=Fqs"+F
+rTj+Bp?h>8q<R5/qWmtDrU'UPqsXRSrpfpWrq$0^r:U'_rqH<brqZNhq>:'eq#.c&JcC<$JcERd
+J,~>
+JcC<$JcC<$JcFj2oDS(Sf_bOAr;$0`rqHEcqt9s\s7?0Zrpg$Xr9sXQs6]^Mrp0RKqW[qAqWI8.
+q<.V<g?JP!roa.?roO1@qr@\8ro*b4rSRS1inaRirnmV2ro*n:r8[h<s5j1@roa=Fr9=4GrTj7F
+p[.nHp$M;9jQlR,rU'ROqsXRSrpfmVs7?6^r:U'_rqH<brqZQiq"ssdqYe#)JcC<$JcEF`J,~>
+JcC<$JcC<$JcFj2oDS(Sf_bOAr;$0`rqHEcqt9s\s7?0Zrpg$Xr9sXQs6]^Mrp0RKqW[qAqWI8.
+q<.V<g?JP!roa.?roO1@qr@\8ro*b4rSRS1inaRirnmV2ro*n:r8[h<s5j1@roa=Fr9=4GrTj7F
+p[.nHp$M;9jQlR,rU'ROqsXRSrpfmVs7?6^r:U'_rqH<brqZQiq"ssdqYe#)JcC<$JcEF`J,~>
+JcC<$JcC<$JcFj2oDS(Sf_bOAr;$0`rqHEcqt9s\s7?0Zrpg$Xr9sXQs6]^Mrp0RKqW[qAqWI8.
+q<.V<g?JP!roa.?roO1@qr@\8ro*b4rSRS1inaRirnmV2ro*n:r8[h<s5j1@roa=Fr9=4GrTj7F
+p[.nHp$M;9jQlR,rU'ROqsXRSrpfmVs7?6^r:U'_rqH<brqZQiq"ssdqYe#)JcC<$JcEF`J,~>
+JcC<$JcC<$JcGcMir8NIjo"3:qYL0dq=ss`rq?6^rq-6^qssdWrp]jSs6fmRqs==JrTa4CqWR8.
+q<7G7kN_j,rTO7DqW@h>roEt:ro3q9qV_>0qqgbsqqh;/qr%J4ro3k9s5a4Ar9"%Broj:Erp'LK
+qX".IkO/05mHjW6na-5ArU0ONrp]pWr:9jYrq--]rq??cqtU0drVH?equ$<h]DdB]JcC<$]DmB~>
+JcC<$JcC<$JcGcMir8NIjo"3:qYL0dq=ss`rq?6^rq-6^qssdWrp]jSs6fmRqs==JrTa4CqWR8.
+q<7G7kN_j,rTO7DqW@h>roEt:ro3q9qV_>0qqgbsqqh;/qr%J4ro3k9s5a4Ar9"%Broj:Erp'LK
+qX".IkO/05mHjW6na-5ArU0ONrp]pWr:9jYrq--]rq??cqtU0drVH?equ$<h]DdB]JcC<$]DmB~>
+JcC<$JcC<$JcGcMir8NIjo"3:qYL0dq=ss`rq?6^rq-6^qssdWrp]jSs6fmRqs==JrTa4CqWR8.
+q<7G7kN_j,rTO7DqW@h>roEt:ro3q9qV_>0qqgbsqqh;/qr%J4ro3k9s5a4Ar9"%Broj:Erp'LK
+qX".IkO/05mHjW6na-5ArU0ONrp]pWr:9jYrq--]rq??cqtU0drVH?equ$<h]DdB]JcC<$]DmB~>
+JcC<$JcC<$JcG]KiVr<EiV`$=qtg9eq=ss`rq?6^s7H<^r:9jWs7#pSs6fmRqs=:IrTa+@lKIg'
+qWd;1qs+"Aroj=Dqr[q?roEt:ro3n8q;D/-nD='"q;D82ro3k9roF+@r9"%Broj:Es6BULqX"1J
+qsNe=q<n(GhX(1-r9jFMrp]pWqssdYrq-*\s7ZHdqtU-crqcEer;?Ei^&ET_JcC<$\,Us~>
+JcC<$JcC<$JcG]KiVr<EiV`$=qtg9eq=ss`rq?6^s7H<^r:9jWs7#pSs6fmRqs=:IrTa+@lKIg'
+qWd;1qs+"Aroj=Dqr[q?roEt:ro3n8q;D/-nD='"q;D82ro3k9roF+@r9"%Broj:Es6BULqX"1J
+qsNe=q<n(GhX(1-r9jFMrp]pWqssdYrq-*\s7ZHdqtU-crqcEer;?Ei^&ET_JcC<$\,Us~>
+JcC<$JcC<$JcG]KiVr<EiV`$=qtg9eq=ss`rq?6^s7H<^r:9jWs7#pSs6fmRqs=:IrTa+@lKIg'
+qWd;1qs+"Aroj=Dqr[q?roEt:ro3n8q;D/-nD='"q;D82ro3k9roF+@r9"%Broj:Es6BULqX"1J
+qsNe=q<n(GhX(1-r9jFMrp]pWqssdYrq-*\s7ZHdqtU-crqcEer;?Ei^&ET_JcC<$\,Us~>
+JcC<$JcC<$JcGZJi;W*Ai;E'@r;-?eqY:'arq?6^rq-6^qssdWrp]jSrpKdQqX"1Hr9E&$qWdnB
+l0S<5rTa7Droj@Eqr[n>roEt:rSme7pYbPup>Gr/ro3h8s5a1@r9"%Broj:Es6BULqs=:KrU/S3
+q<n%Fm-OT9r9jCLrUBgVqssaXrq--]rq??cqtU0drVH?equ$<h`;Y>fJcC<$YQ'+~>
+JcC<$JcC<$JcGZJi;W*Ai;E'@r;-?eqY:'arq?6^rq-6^qssdWrp]jSrpKdQqX"1Hr9E&$qWdnB
+l0S<5rTa7Droj@Eqr[n>roEt:rSme7pYbPup>Gr/ro3h8s5a1@r9"%Broj:Es6BULqs=:KrU/S3
+q<n%Fm-OT9r9jCLrUBgVqssaXrq--]rq??cqtU0drVH?equ$<h`;Y>fJcC<$YQ'+~>
+JcC<$JcC<$JcGZJi;W*Ai;E'@r;-?eqY:'arq?6^rq-6^qssdWrp]jSrpKdQqX"1Hr9E&$qWdnB
+l0S<5rTa7Droj@Eqr[n>roEt:rSme7pYbPup>Gr/ro3h8s5a1@r9"%Broj:Es6BULqs=:KrU/S3
+q<n%Fm-OT9r9jCLrUBgVqssaXrq--]rq??cqtU0drVH?equ$<h`;Y>fJcC<$YQ'+~>
+JcC<$JcC<$JcGWIh>ZL6kPXoJr;-Bfq=ss`rq?9_rq-3]r:9jWrp]gRrpKdQqX".Gqs*A/q<IhB
+h<b(*rTa:Eroj@Eqr[n>roEq9rSme7jP]spro3h8roF(?r9"%Broj=Frp'LKr9XCLrU0@Io^M><
+q!RA5qX4.IrUBgVqXXXWrq--]rq??cqY:'crVH?er;?EibPm(mJcC<$VuM8~>
+JcC<$JcC<$JcGWIh>ZL6kPXoJr;-Bfq=ss`rq?9_rq-3]r:9jWrp]gRrpKdQqX".Gqs*A/q<IhB
+h<b(*rTa:Eroj@Eqr[n>roEq9rSme7jP]spro3h8roF(?r9"%Broj=Frp'LKr9XCLrU0@Io^M><
+q!RA5qX4.IrUBgVqXXXWrq--]rq??cqY:'crVH?er;?EibPm(mJcC<$VuM8~>
+JcC<$JcC<$JcGWIh>ZL6kPXoJr;-Bfq=ss`rq?9_rq-3]r:9jWrp]gRrpKdQqX".Gqs*A/q<IhB
+h<b(*rTa:Eroj@Eqr[n>roEq9rSme7jP]spro3h8roF(?r9"%Broj=Frp'LKr9XCLrU0@Io^M><
+q!RA5qX4.IrUBgVqXXXWrq--]rq??cqY:'crVH?er;?EibPm(mJcC<$VuM8~>
+JcC<$JcC<$JcGQGgA]q,nGMnTr;-BfqY:'arq?6^rq-3]r:9jWrp]gRrpKaPq<\"Ejm)^.na,Z1
+p?_bDrTa:Eroj@Eqr[n>roEn8rSm\4n_j<'r8RV6roF(?r9""As60CFrp'OLqs==LrpKOLk4%m/
+jmMg1rUBdUqssaXrUg![rq??cqtU-crqcEer;?EifD^@$JcC<$Rf@m~>
+JcC<$JcC<$JcGQGgA]q,nGMnTr;-BfqY:'arq?6^rq-3]r:9jWrp]gRrpKaPq<\"Ejm)^.na,Z1
+p?_bDrTa:Eroj@Eqr[n>roEn8rSm\4n_j<'r8RV6roF(?r9""As60CFrp'OLqs==LrpKOLk4%m/
+jmMg1rUBdUqssaXrUg![rq??cqtU-crqcEer;?EifD^@$JcC<$Rf@m~>
+JcC<$JcC<$JcGQGgA]q,nGMnTr;-BfqY:'arq?6^rq-3]r:9jWrp]gRrpKaPq<\"Ejm)^.na,Z1
+p?_bDrTa:Eroj@Eqr[n>roEn8rSm\4n_j<'r8RV6roF(?r9""As60CFrp'OLqs==LrpKOLk4%m/
+jmMg1rUBdUqssaXrUg![rq??cqtU-crqcEer;?EifD^@$JcC<$Rf@m~>
+JcC<$JcC<$JcGKEfDaP'o_e@YrVHKgqY:$`rq?9_rq-3]qssaVrp]gRrU0XOp[%P<rp'.Ao'H/=
+n*^&>q!@tFrp'CFroj@Eqr[n>rT*e7qVq&(qr7G3rT*t>r9""As60CFrp'OLqs=@MrU0LMr:&t@
+q!dY=q!RY?rUBdUq==OVrq-*\rq??cqY:'crVH?er;?Eih>W!*JcC<$P5g%~>
+JcC<$JcC<$JcGKEfDaP'o_e@YrVHKgqY:$`rq?9_rq-3]qssaVrp]gRrU0XOp[%P<rp'.Ao'H/=
+n*^&>q!@tFrp'CFroj@Eqr[n>rT*e7qVq&(qr7G3rT*t>r9""As60CFrp'OLqs=@MrU0LMr:&t@
+q!dY=q!RY?rUBdUq==OVrq-*\rq??cqY:'crVH?er;?Eih>W!*JcC<$P5g%~>
+JcC<$JcC<$JcGKEfDaP'o_e@YrVHKgqY:$`rq?9_rq-3]qssaVrp]gRrU0XOp[%P<rp'.Ao'H/=
+n*^&>q!@tFrp'CFroj@Eqr[n>rT*e7qVq&(qr7G3rT*t>r9""As60CFrp'OLqs=@MrU0LMr:&t@
+q!dY=q!RY?rUBdUq==OVrq-*\rq??cqY:'crVH?er;?Eih>W!*JcC<$P5g%~>
+JcC<$JcC<$JcGHDd/Mo#p\a[\rVHKgqY:'arq?6^rq-3]qssaVrp]dQrU0XOna-#9md0f;p[7YA
+q<n.IqX"1Hrp'CFroj@Eqr[k=rT*\4n`'9&roF%>qr[qAroj:Es6BULr9XFMrpKXOr:'URmIL&B
+q=*5/qsaORqXXUVrq-'[rq??cqtU-crqcEer;?Hjhu83,JcC<$NrOV~>
+JcC<$JcC<$JcGHDd/Mo#p\a[\rVHKgqY:'arq?6^rq-3]qssaVrp]dQrU0XOna-#9md0f;p[7YA
+q<n.IqX"1Hrp'CFroj@Eqr[k=rT*\4n`'9&roF%>qr[qAroj:Es6BULr9XFMrpKXOr:'URmIL&B
+q=*5/qsaORqXXUVrq-'[rq??cqtU-crqcEer;?Hjhu83,JcC<$NrOV~>
+JcC<$JcC<$JcGHDd/Mo#p\a[\rVHKgqY:'arq?6^rq-3]qssaVrp]dQrU0XOna-#9md0f;p[7YA
+q<n.IqX"1Hrp'CFroj@Eqr[k=rT*\4n`'9&roF%>qr[qAroj:Es6BULr9XFMrpKXOr:'URmIL&B
+q=*5/qsaORqXXUVrq-'[rq??cqtU-crqcEer;?Hjhu83,JcC<$NrOV~>
+JcC<$JcC<$JcG?A`r>3#q#'g^rVHKgqY:'arV$-]rq-3]qssaVrp]aPrU0RMi9^:,qX3A3r9jON
+qX"4IrTa:Eroj@EqW@b<rT*&"r8dh<qr[n@s60@Es6BULr9XFMrpK[PrUBaTiUZg7p[IM;q=+=P
+q""CTrq-'[rq??cqY:'crVH<dr;?HjjSj`1JcC<$M#Vu~>
+JcC<$JcC<$JcG?A`r>3#q#'g^rVHKgqY:'arV$-]rq-3]qssaVrp]aPrU0RMi9^:,qX3A3r9jON
+qX"4IrTa:Eroj@EqW@b<rT*&"r8dh<qr[n@s60@Es6BULr9XFMrpK[PrUBaTiUZg7p[IM;q=+=P
+q""CTrq-'[rq??cqY:'crVH<dr;?HjjSj`1JcC<$M#Vu~>
+JcC<$JcC<$JcG?A`r>3#q#'g^rVHKgqY:'arV$-]rq-3]qssaVrp]aPrU0RMi9^:,qX3A3r9jON
+qX"4IrTa:Eroj@EqW@b<rT*&"r8dh<qr[n@s60@Es6BULr9XFMrpK[PrUBaTiUZg7p[IM;q=+=P
+q""CTrq-'[rq??cqY:'crVH<dr;?HjjSj`1JcC<$M#Vu~>
+JcC<$JcC<$JcG<@^AdR!q>Bp_rVHKgqY:'arq?6^rq-3]qXXXUrUBXOqsO:In*Ki:q<lo(rU0XO
+qX"4Irp'CFroj=DqW@_;qW.2,qW.V:qW@e?roj7Ds6BULr9XFMrpK[PrUBdUf^eh-jm`-:p[\:S
+rq-'[rV$6bqY:'crVH<dr;?Hjkl-/5JcC<$KE$H~>
+JcC<$JcC<$JcG<@^AdR!q>Bp_rVHKgqY:'arq?6^rq-3]qXXXUrUBXOqsO:In*Ki:q<lo(rU0XO
+qX"4Irp'CFroj=DqW@_;qW.2,qW.V:qW@e?roj7Ds6BULr9XFMrpK[PrUBdUf^eh-jm`-:p[\:S
+rq-'[rV$6bqY:'crVH<dr;?Hjkl-/5JcC<$KE$H~>
+JcC<$JcC<$JcG<@^AdR!q>Bp_rVHKgqY:'arq?6^rq-3]qXXXUrUBXOqsO:In*Ki:q<lo(rU0XO
+qX"4Irp'CFroj=DqW@_;qW.2,qW.V:qW@e?roj7Ds6BULr9XFMrpK[PrUBdUf^eh-jm`-:p[\:S
+rq-'[rV$6bqY:'crVH<dr;?Hjkl-/5JcC<$KE$H~>
+JcC<$JcC<$JcG6>\c24!q>Bs`rVHKgqY:'arV$-]rq-3]qXXXUrUBRMqX3\:q!R\@l1"E8rU0XO
+qX"4Irp'CFrTO7Dpu_G7n`9Q.q<%Y=roj:Erp'LKr9XFMrpK[Prp]mVp@@SAn+-#=rUBILp%&(Q
+rUfpYrq?<bqY:'crVH?er;?Eili)J8JcC<$JcGcMJ,~>
+JcC<$JcC<$JcG6>\c24!q>Bs`rVHKgqY:'arV$-]rq-3]qXXXUrUBRMqX3\:q!R\@l1"E8rU0XO
+qX"4Irp'CFrTO7Dpu_G7n`9Q.q<%Y=roj:Erp'LKr9XFMrpK[Prp]mVp@@SAn+-#=rUBILp%&(Q
+rUfpYrq?<bqY:'crVH?er;?Eili)J8JcC<$JcGcMJ,~>
+JcC<$JcC<$JcG6>\c24!q>Bs`rVHKgqY:'arV$-]rq-3]qXXXUrUBRMqX3\:q!R\@l1"E8rU0XO
+qX"4Irp'CFrTO7Dpu_G7n`9Q.q<%Y=roj:Erp'LKr9XFMrpK[Prp]mVp@@SAn+-#=rUBILp%&(Q
+rUfpYrq?<bqY:'crVH?er;?Eili)J8JcC<$JcGcMJ,~>
+JcC<$JcC<$JcG-;\Gl.!qY^'arVHKgqY:'arq?3]rq-3]qXXUTr:'CJkjJ!0q!dY?qXF:KrU0[P
+qs==JrTa:ErTO4Cp?(i*p?)>:roj7Drp'LKr9XFMs6fdQrp]mVq""7PoCVbJmIK`9o()_MrUfpY
+rV$6bqY:$brVH?er;?Hjm/DS9JcC<$JcGZJJ,~>
+JcC<$JcC<$JcG-;\Gl.!qY^'arVHKgqY:'arq?3]rq-3]qXXUTr:'CJkjJ!0q!dY?qXF:KrU0[P
+qs==JrTa:ErTO4Cp?(i*p?)>:roj7Drp'LKr9XFMs6fdQrp]mVq""7PoCVbJmIK`9o()_MrUfpY
+rV$6bqY:$brVH?er;?Hjm/DS9JcC<$JcGZJJ,~>
+JcC<$JcC<$JcG-;\Gl.!qY^'arVHKgqY:'arq?3]rq-3]qXXUTr:'CJkjJ!0q!dY?qXF:KrU0[P
+qs==JrTa:ErTO4Cp?(i*p?)>:roj7Drp'LKr9XFMs6fdQrp]mVq""7PoCVbJmIK`9o()_MrUfpY
+rV$6bqY:$brVH?er;?Hjm/DS9JcC<$JcGZJJ,~>
+JcC<$JcC<$JcG!7\Gl4#qY^*brVHKgqY:'arV$-]rUg*\q==LSr:&8*q=+.KnacMGr:'ONrpKaP
+qs==JrTa7DrTO4CiTC+%rTO.Crp'LKqs=@MrpK[Prp]pWq==FSk4JH?eaiV/rUfmXrq?<bq=ssb
+rVH<dr;?HjmJ_\:JcC<$JcGTHJ,~>
+JcC<$JcC<$JcG!7\Gl4#qY^*brVHKgqY:'arV$-]rUg*\q==LSr:&8*q=+.KnacMGr:'ONrpKaP
+qs==JrTa7DrTO4CiTC+%rTO.Crp'LKqs=@MrpK[Prp]pWq==FSk4JH?eaiV/rUfmXrq?<bq=ssb
+rVH<dr;?HjmJ_\:JcC<$JcGTHJ,~>
+JcC<$JcC<$JcG!7\Gl4#qY^*brVHKgqY:'arV$-]rUg*\q==LSr:&8*q=+.KnacMGr:'ONrpKaP
+qs==JrTa7DrTO4CiTC+%rTO.Crp'LKqs=@MrpK[Prp]pWq==FSk4JH?eaiV/rUfmXrq?<bq=ssb
+rVH<dr;?HjmJ_\:JcC<$JcGTHJ,~>
+JcC<$JcC<$JcFm4\,Q1$qY^-cr;-Egq=ss`rV$-]rUg'[q==IRqs`M3q=+4MjRW6=r:'ONrpKdQ
+qX"4Irp'=Dr94%@mH4</r94"Arp'LKqs=@MrpK[Prp]pWqXXRUqXj.Ip[n4Oipus;qt0[VrV$3a
+qY:$brVH<dr;?Hjn,@n<JcC<$JcGKEJ,~>
+JcC<$JcC<$JcFm4\,Q1$qY^-cr;-Egq=ss`rV$-]rUg'[q==IRqs`M3q=+4MjRW6=r:'ONrpKdQ
+qX"4Irp'=Dr94%@mH4</r94"Arp'LKqs=@MrpK[Prp]pWqXXRUqXj.Ip[n4Oipus;qt0[VrV$3a
+qY:$brVH<dr;?Hjn,@n<JcC<$JcGKEJ,~>
+JcC<$JcC<$JcFm4\,Q1$qY^-cr;-Egq=ss`rV$-]rUg'[q==IRqs`M3q=+4MjRW6=r:'ONrpKdQ
+qX"4Irp'=Dr94%@mH4</r94"Arp'LKqs=@MrpK[Prp]pWqXXRUqXj.Ip[n4Oipus;qt0[VrV$3a
+qY:$brVH<dr;?Hjn,@n<JcC<$JcGKEJ,~>
+JcC<$JcC<$JcFd1\Gl=&qY^*brVHKgqY:$`rq?3]rUg'[q""=Pq!db@p[J"Kg%,(2rUB[PrU0[P
+qX"4IrTa4CqrmA/qrmk?rp'LKqs==LrpK[Prp]pWqXXUVr:Jq?q"44MoCDVHqt0XUr:^*`q=spa
+rVH<dr;?Hjn,@n<JcC<$JcGHDJ,~>
+JcC<$JcC<$JcFd1\Gl=&qY^*brVHKgqY:$`rq?3]rUg'[q""=Pq!db@p[J"Kg%,(2rUB[PrU0[P
+qX"4IrTa4CqrmA/qrmk?rp'LKqs==LrpK[Prp]pWqXXUVr:Jq?q"44MoCDVHqt0XUr:^*`q=spa
+rVH<dr;?Hjn,@n<JcC<$JcGHDJ,~>
+JcC<$JcC<$JcFd1\Gl=&qY^*brVHKgqY:$`rq?3]rUg'[q""=Pq!db@p[J"Kg%,(2rUB[PrU0[P
+qX"4IrTa4CqrmA/qrmk?rp'LKqs==LrpK[Prp]pWqXXUVr:Jq?q"44MoCDVHqt0XUr:^*`q=spa
+rVH<dr;?Hjn,@n<JcC<$JcGHDJ,~>
+JcC<$JcC<$JcF^/\Gl=&qu$3crVHKgq=ss`rV$*\rUg$Zp[\.Ml1"K<n+,o<o^_tNrUB[PrpKaP
+qs=:IrTa+@lfe',rp'IJqs==LrpK[Ps7$!Wqss^Wr:JY7p[mV>q=OCRr:^*`q=spar;-3cr;?Hj
+n,@n<JcC<$JcGECJ,~>
+JcC<$JcC<$JcF^/\Gl=&qu$3crVHKgq=ss`rV$*\rUg$Zp[\.Ml1"K<n+,o<o^_tNrUB[PrpKaP
+qs=:IrTa+@lfe',rp'IJqs==LrpK[Ps7$!Wqss^Wr:JY7p[mV>q=OCRr:^*`q=spar;-3cr;?Hj
+n,@n<JcC<$JcGECJ,~>
+JcC<$JcC<$JcF^/\Gl=&qu$3crVHKgq=ss`rV$*\rUg$Zp[\.Ml1"K<n+,o<o^_tNrUB[PrpKaP
+qs=:IrTa+@lfe',rp'IJqs==LrpK[Ps7$!Wqss^Wr:JY7p[mV>q=OCRr:^*`q=spar;-3cr;?Hj
+n,@n<JcC<$JcGECJ,~>
+JcC<$JcC<$JcFL)^&Ij+qu$3crVHKgq=sp_rV$*\r:KsZo^_)5n+-/Cp[n4Op[\:QrUB[PrpKaP
+qX"1HrT`5'rTa@IqX"4KrpK^Qrp]pWqXXUVrUfaTnFl5Ai:Q[7r:^'_q=sm`rVH<dr;?Hjmf%e;
+JcC<$JcGBBJ,~>
+JcC<$JcC<$JcFL)^&Ij+qu$3crVHKgq=sp_rV$*\r:KsZo^_)5n+-/Cp[n4Op[\:QrUB[PrpKaP
+qX"1HrT`5'rTa@IqX"4KrpK^Qrp]pWqXXUVrUfaTnFl5Ai:Q[7r:^'_q=sm`rVH<dr;?Hjmf%e;
+JcC<$JcGBBJ,~>
+JcC<$JcC<$JcFL)^&Ij+qu$3crVHKgq=sp_rV$*\r:KsZo^_)5n+-/Cp[n4Op[\:QrUB[PrpKaP
+qX"1HrT`5'rTa@IqX"4KrpK^Qrp]pWqXXUVrUfaTnFl5Ai:Q[7r:^'_q=sm`rVH<dr;?Hjmf%e;
+JcC<$JcGBBJ,~>
+JcC<$JcC<$JcF=$_#F0.qu$3crVHKgq=sp_rV$'[r:KpYlLFrFkjnN?jn/HAq""CRrp]dQrU0[P
+q<\%Fqs*D0r9F4GqX"4KrpK[Prp]pWqXXXWrUfgVjn@s3nFZ2Br:^'_q"Xg`r;-3cr;?Ein,@n<
+JcC<$JcG?AJ,~>
+JcC<$JcC<$JcF=$_#F0.qu$3crVHKgq=sp_rV$'[r:KpYlLFrFkjnN?jn/HAq""CRrp]dQrU0[P
+q<\%Fqs*D0r9F4GqX"4KrpK[Prp]pWqXXXWrUfgVjn@s3nFZ2Br:^'_q"Xg`r;-3cr;?Ein,@n<
+JcC<$JcG?AJ,~>
+JcC<$JcC<$JcF=$_#F0.qu$3crVHKgq=sp_rV$'[r:KpYlLFrFkjnN?jn/HAq""CRrp]dQrU0[P
+q<\%Fqs*D0r9F4GqX"4KrpK[Prp]pWqXXXWrUfgVjn@s3nFZ2Br:^'_q"Xg`r;-3cr;?Ein,@n<
+JcC<$JcG?AJ,~>
+JcC<$JcC<$JcEmmb5V89qu$3crVHKgq=sp_r:]sZqt0dWg@G%1q"3nFqXj^Wq""FSrUB[PrpKaP
+q!@qEpZhS=pZh\Bq<\(IrpK[Prp]pWqXXXWrUfmXq=a7Np%Hi,qY'j]p\=^_r;-3cqu$?in,@n<
+JcC<$JcG9?J,~>
+JcC<$JcC<$JcEmmb5V89qu$3crVHKgq=sp_r:]sZqt0dWg@G%1q"3nFqXj^Wq""FSrUB[PrpKaP
+q!@qEpZhS=pZh\Bq<\(IrpK[Prp]pWqXXXWrUfmXq=a7Np%Hi,qY'j]p\=^_r;-3cqu$?in,@n<
+JcC<$JcG9?J,~>
+JcC<$JcC<$JcEmmb5V89qu$3crVHKgq=sp_r:]sZqt0dWg@G%1q"3nFqXj^Wq""FSrUB[PrpKaP
+q!@qEpZhS=pZh\Bq<\(IrpK[Prp]pWqXXXWrUfmXq=a7Np%Hi,qY'j]p\=^_r;-3cqu$?in,@n<
+JcC<$JcG9?J,~>
+JcC<$JcC<$JcELbe,K1Ar;?<drVHHfq=sp_rV$!Yqt0aVjmr0;q=NV<qt0jYq==LSrp]aPrpKaP
+p[%\@p$2><q!@tHrpKXOrp]pWqss^Wrq-!YqtB%Dp@d;7q=a^[p\=[^rVH9cqu$?imf%e;JcC<$
+JcG9?J,~>
+JcC<$JcC<$JcELbe,K1Ar;?<drVHHfq=sp_rV$!Yqt0aVjmr0;q=NV<qt0jYq==LSrp]aPrpKaP
+p[%\@p$2><q!@tHrpKXOrp]pWqss^Wrq-!YqtB%Dp@d;7q=a^[p\=[^rVH9cqu$?imf%e;JcC<$
+JcG9?J,~>
+JcC<$JcC<$JcELbe,K1Ar;?<drVHHfq=sp_rV$!Yqt0aVjmr0;q=NV<qt0jYq==LSrp]aPrpKaP
+p[%\@p$2><q!@tHrpKXOrp]pWqss^Wrq-!YqtB%Dp@d;7q=a^[p\=[^rVH9cqu$?imf%e;JcC<$
+JcG9?J,~>
+JcC<$JcC<$JcE.Xh#@-Jr;?<dr;-Bfq=sm^rV#sXqXi\:q"3/1r:KsZq==LSrp]aPrU0XOoBc)7
+oBcGCrU0ROrUBgVqss^Wrq-$ZqtBm\m.g8Jo_.SCp\+IXpA"R]r;-0br;?Eimf%e;JcC<$JcG6>
+J,~>
+JcC<$JcC<$JcE.Xh#@-Jr;?<dr;-Bfq=sm^rV#sXqXi\:q"3/1r:KsZq==LSrp]aPrU0XOoBc)7
+oBcGCrU0ROrUBgVqss^Wrq-$ZqtBm\m.g8Jo_.SCp\+IXpA"R]r;-0br;?Eimf%e;JcC<$JcG6>
+J,~>
+JcC<$JcC<$JcE.Xh#@-Jr;?<dr;-Bfq=sm^rV#sXqXi\:q"3/1r:KsZq==LSrp]aPrU0XOoBc)7
+oBcGCrU0ROrUBgVqss^Wrq-$ZqtBm\m.g8Jo_.SCp\+IXpA"R]r;-0br;?Eimf%e;JcC<$JcG6>
+J,~>
+JcC<$JcC<$JcDtShu<KNqu$3crVHHfq=sm^r:]gVp[mqGp%7YEn+QAGr:KsZq==OTrUBXOrU0RM
+i9^C/rU0ONrUBgVqss^Wrq-$Zr:^$^iV<-@hY-a=p%\I\r;--ar;?Eimf%e;JcC<$JcG3=J,~>
+JcC<$JcC<$JcDtShu<KNqu$3crVHHfq=sm^r:]gVp[mqGp%7YEn+QAGr:KsZq==OTrUBXOrU0RM
+i9^C/rU0ONrUBgVqss^Wrq-$Zr:^$^iV<-@hY-a=p%\I\r;--ar;?Eimf%e;JcC<$JcG3=J,~>
+JcC<$JcC<$JcDtShu<KNqu$3crVHHfq=sm^r:]gVp[mqGp%7YEn+QAGr:KsZq==OTrUBXOrU0RM
+i9^C/rU0ONrUBgVqss^Wrq-$Zr:^$^iV<-@hY-a=p%\I\r;--ar;?Eimf%e;JcC<$JcG3=J,~>
+JcC<$JcC<$JcDeNj8SoRqu$3cr;-Bfp\=[\r:]^Sk4J'6j7`0=rUg'[q==LSrUBXOr9jFKlg4K8
+r9jCLrp]mVqss^Wrq-$ZrV$-_f_G+5m.U/IoD&7Zr;--aqu$<hmf%e;JcC<$JcG0<J,~>
+JcC<$JcC<$JcDeNj8SoRqu$3cr;-Bfp\=[\r:]^Sk4J'6j7`0=rUg'[q==LSrUBXOr9jFKlg4K8
+r9jCLrp]mVqss^Wrq-$ZrV$-_f_G+5m.U/IoD&7Zr;--aqu$<hmf%e;JcC<$JcG0<J,~>
+JcC<$JcC<$JcDeNj8SoRqu$3cr;-Bfp\=[\r:]^Sk4J'6j7`0=rUg'[q==LSrUBXOr9jFKlg4K8
+r9jCLrp]mVqss^Wrq-$ZrV$-_f_G+5m.U/IoD&7Zr;--aqu$<hmf%e;JcC<$JcG0<J,~>
+JcC<$JcC<$JcDYJjo5,Tqu$3cr;-Bfp\=[\qtA8,p@dhHq=aRUrUg'[q==LSrUBUNqsNY7qsO7J
+rUBgVqXXXWrUfsZr:^*`cM6;ko(`(Wr;-*`qu$?imJ_\:JcC<$JcG-;J,~>
+JcC<$JcC<$JcDYJjo5,Tqu$3cr;-Bfp\=[\qtA8,p@dhHq=aRUrUg'[q==LSrUBUNqsNY7qsO7J
+rUBgVqXXXWrUfsZr:^*`cM6;ko(`(Wr;-*`qu$?imJ_\:JcC<$JcG-;J,~>
+JcC<$JcC<$JcDYJjo5,Tqu$3cr;-Bfp\=[\qtA8,p@dhHq=aRUrUg'[q==LSrUBUNqsNY7qsO7J
+rUBgVqXXXWrUfsZr:^*`cM6;ko(`(Wr;-*`qu$?imJ_\:JcC<$JcG-;J,~>
+JcC<$JcC<$JcDPGkPk>Vqu$0brVHHfpA"R[qY&J4q"EY?qY'^WrUg'[q==LSr:'FKp?qeEp?q\D
+rUBdUqXXXWrUfsZrV$0`oD%bLjS83<mJ-PRqtg$`qY^6hmJ_\:JcC<$JcG*:J,~>
+JcC<$JcC<$JcDPGkPk>Vqu$0brVHHfpA"R[qY&J4q"EY?qY'^WrUg'[q==LSr:'FKp?qeEp?q\D
+rUBdUqXXXWrUfsZrV$0`oD%bLjS83<mJ-PRqtg$`qY^6hmJ_\:JcC<$JcG*:J,~>
+JcC<$JcC<$JcDPGkPk>Vqu$0brVHHfpA"R[qY&J4q"EY?qY'^WrUg'[q==LSr:'FKp?qeEp?q\D
+rUBdUqXXXWrUfsZrV$0`oD%bLjS83<mJ-PRqtg$`qY^6hmJ_\:JcC<$JcG*:J,~>
+JcC<$JcC<$JcDDCl2LPXr;?9cr;-?epA"LYq"Eb@p@e4Sl1k)KqtBgXrUg'[q==IRr:':Go^;>>
+r:'[Tq==OVrUfsZrV$3ao_@JBanY]-qtfs^qu$<hmJ_\:JcC<$JcG'9J,~>
+JcC<$JcC<$JcDDCl2LPXr;?9cr;-?epA"LYq"Eb@p@e4Sl1k)KqtBgXrUg'[q==IRr:':Go^;>>
+r:'[Tq==OVrUfsZrV$3ao_@JBanY]-qtfs^qu$<hmJ_\:JcC<$JcG'9J,~>
+JcC<$JcC<$JcDDCl2LPXr;?9cr;-?epA"LYq"Eb@p@e4Sl1k)KqtBgXrUg'[q==IRr:':Go^;>>
+r:'[Tq==OVrUfsZrV$3ao_@JBanY]-qtfs^qu$<hmJ_\:JcC<$JcG'9J,~>
+JcC<$JcC<$JcD;@li-bZqu$0br;-?ep%\@Wo_.tNo(MhPh>$mAqtBjYr:KsZq==IRqs`M3r:'XS
+q==LUrq-$ZrV$3apA"@Wo_S+RdeNY6qYKj]qu$<hm/DS9JcC<$JcG$8J,~>
+JcC<$JcC<$JcD;@li-bZqu$0br;-?ep%\@Wo_.tNo(MhPh>$mAqtBjYr:KsZq==IRqs`M3r:'XS
+q==LUrq-$ZrV$3apA"@Wo_S+RdeNY6qYKj]qu$<hm/DS9JcC<$JcG$8J,~>
+JcC<$JcC<$JcD;@li-bZqu$0br;-?ep%\@Wo_.tNo(MhPh>$mAqtBjYr:KsZq==IRqs`M3r:'XS
+q==LUrq-$ZrV$3apA"@Wo_S+RdeNY6qYKj]qu$<hm/DS9JcC<$JcG$8J,~>
+JcC<$JcC<$JcD5>m/Hk[qu$0bqtg3co_A4UjS&9@f(f.:r:]pYrUg'[p[\7Pq=*_=q=+=Pq""CT
+rq-$ZrV$3ap\=R[jneTEhtZp@qYKg\qu$9gmJ_\:JcC<$JcFs6J,~>
+JcC<$JcC<$JcD5>m/Hk[qu$0bqtg3co_A4UjS&9@f(f.:r:]pYrUg'[p[\7Pq=*_=q=+=Pq""CT
+rq-$ZrV$3ap\=R[jneTEhtZp@qYKg\qu$9gmJ_\:JcC<$JcFs6J,~>
+JcC<$JcC<$JcD5>m/Hk[qu$0bqtg3co_A4UjS&9@f(f.:r:]pYrUg'[p[\7Pq=*_=q=+=Pq""CT
+rq-$ZrV$3ap\=R[jneTEhtZp@qYKg\qu$9gmJ_\:JcC<$JcFs6J,~>
+JcC<$JcC<$JcD/<m/Hk[qu$0bqtg3co(_\Js7YmTbkV)0r:]sZr:KsZp[\1Njm`0;p[\:SrUfpY
+rV$3ap\=X]g\UF8n+cMMq"jUZqY^3gm/DS9JcC<$JcFp5J,~>
+JcC<$JcC<$JcD/<m/Hk[qu$0bqtg3co(_\Js7YmTbkV)0r:]sZr:KsZp[\1Njm`0;p[\:SrUfpY
+rV$3ap\=X]g\UF8n+cMMq"jUZqY^3gm/DS9JcC<$JcFp5J,~>
+JcC<$JcC<$JcD/<m/Hk[qu$0bqtg3co(_\Js7YmTbkV)0r:]sZr:KsZp[\1Njm`0;p[\:SrUfpY
+rV$3ap\=X]g\UF8n+cMMq"jUZqY^3gm/DS9JcC<$JcFp5J,~>
+JcC<$JcC<$JcD):m/Hk[qu$-aqtg0bn+c/AkkOB;o(`.WrV$$Zr:KsZp%%kIp$h_Gp@A1Rr:KjY
+rV$0`q"Xa^q"j:Qo(q)9p\OIXq>C*fli)J8JcC<$JcFp5J,~>
+JcC<$JcC<$JcD):m/Hk[qu$-aqtg0bn+c/AkkOB;o(`.WrV$$Zr:KsZp%%kIp$h_Gp@A1Rr:KjY
+rV$0`q"Xa^q"j:Qo(q)9p\OIXq>C*fli)J8JcC<$JcFp5J,~>
+JcC<$JcC<$JcD):m/Hk[qu$-aqtg0bn+c/AkkOB;o(`.WrV$$Zr:KsZp%%kIp$h_Gp@A1Rr:KjY
+rV$0`q"Xa^q"j:Qo(q)9p\OIXq>C*fli)J8JcC<$JcFp5J,~>
+JcC<$JcC<$JcD&9mJct\qY^$`qYL'a`q\Edo_A@Yr:]pYrUg!YoCD;=oCDhNrUfpYrV$0`q"Xd_
+q>0%HnbVJFo_S(SqY^0fli)J8JcC<$JcFj3J,~>
+JcC<$JcC<$JcD&9mJct\qY^$`qYL'a`q\Edo_A@Yr:]pYrUg!YoCD;=oCDhNrUfpYrV$0`q"Xd_
+q>0%HnbVJFo_S(SqY^0fli)J8JcC<$JcFj3J,~>
+JcC<$JcC<$JcD&9mJct\qY^$`qYL'a`q\Edo_A@Yr:]pYrUg!YoCD;=oCDhNrUfpYrV$0`q"Xd_
+q>0%HnbVJFo_S(SqY^0fli)J8JcC<$JcFj3J,~>
+JcC<$JcC<$JcD#8m/Hk[qY^!_qYL$`chR/.m/$JPp%\IZrV$!Yr:KpYf^eq2rUfmXrV$3ap\=[^
+qYJh@eb\_2q>C'eli)J8JcC<$JcFg2J,~>
+JcC<$JcC<$JcD#8m/Hk[qY^!_qYL$`chR/.m/$JPp%\IZrV$!Yr:KpYf^eq2rUfmXrV$3ap\=[^
+qYJh@eb\_2q>C'eli)J8JcC<$JcFg2J,~>
+JcC<$JcC<$JcD#8m/Hk[qY^!_qYL$`chR/.m/$JPp%\IZrV$!Yr:KpYf^eq2rUfmXrV$3ap\=[^
+qYJh@eb\_2q>C'eli)J8JcC<$JcFg2J,~>
+JcC<$JcC<$JcCu7m/HhZqY^!_q>0m^gA(=9htm3FpA"R[r:]mXqt0aViq!!<qt0[VrV$0`q"Xd_
+qteS7iqi!<q#'sdlMcA7JcC<$JcFd1J,~>
+JcC<$JcC<$JcCu7m/HhZqY^!_q>0m^gA(=9htm3FpA"R[r:]mXqt0aViq!!<qt0[VrV$0`q"Xd_
+qteS7iqi!<q#'sdlMcA7JcC<$JcFd1J,~>
+JcC<$JcC<$JcCu7m/HhZqY^!_q>0m^gA(=9htm3FpA"R[r:]mXqt0aViq!!<qt0[VrV$0`q"Xd_
+qteS7iqi!<q#'sdlMcA7JcC<$JcFd1J,~>
+JcC<$JcC<$JcCr6m/HhZqY]p]q>0d[k4nQDo(qnRpA4X]pA"R[rV#sXqt0XSn+-8Fqt0XUr:^*`
+q"Xd_qte,*p%mbHq#'pclMcA7JcC<$JcFa0J,~>
+JcC<$JcC<$JcCr6m/HhZqY]p]q>0d[k4nQDo(qnRpA4X]pA"R[rV#sXqt0XSn+-8Fqt0XUr:^*`
+q"Xd_qte,*p%mbHq#'pclMcA7JcC<$JcFa0J,~>
+JcC<$JcC<$JcCr6m/HhZqY]p]q>0d[k4nQDo(qnRpA4X]pA"R[rV#sXqt0XSn+-8Fqt0XUr:^*`
+q"Xd_qte,*p%mbHq#'pclMcA7JcC<$JcFa0J,~>
+JcC<$JcC<$JcCo5li-_YqY]m\p\NP<oD7PFq"jm`pA"R[r:]jWq=Nh@q=OCRr:^*`q"Xd_qtfUT
+qY[f!p\agbl2H86JcC<$JcF^/J,~>
+JcC<$JcC<$JcCo5li-_YqY]m\p\NP<oD7PFq"jm`pA"R[r:]jWq=Nh@q=OCRr:^*`q"Xd_qtfUT
+qY[f!p\agbl2H86JcC<$JcF^/J,~>
+JcC<$JcC<$JcCo5li-_YqY]m\p\NP<oD7PFq"jm`pA"R[r:]jWq=Nh@q=OCRr:^*`q"Xd_qtfUT
+qY[f!p\agbl2H86JcC<$JcF^/J,~>
+JcC<$JcC<$JcCl4li-\XqY]j[p%m_Eo(q,<q>1!apA"R[r:]aTiUld8r:^*`p\=[^qtfgZl28Hr
+pAF[`l2H86JcC<$JcFX-J,~>
+JcC<$JcC<$JcCl4li-\XqY]j[p%m_Eo(q,<q>1!apA"R[r:]aTiUld8r:^*`p\=[^qtfgZl28Hr
+pAF[`l2H86JcC<$JcFX-J,~>
+JcC<$JcC<$JcCl4li-\XqY]j[p%m_Eo(q,<q>1!apA"R[r:]aTiUld8r:^*`p\=[^qtfgZl28Hr
+pAF[`l2H86JcC<$JcFX-J,~>
+JcC<$JcC<$JcCi3lMgSWq>B[XeG@SiqYL*bpA"R[qtBOPme$&BqtBs^p\=[^qtfm\i;CdqpAFX_
+kl-/5JcC<$JcFU,J,~>
+JcC<$JcC<$JcCi3lMgSWq>B[XeG@SiqYL*bpA"R[qtBOPme$&BqtBs^p\=[^qtfm\i;CdqpAFX_
+kl-/5JcC<$JcFU,J,~>
+JcC<$JcC<$JcCi3lMgSWq>B[XeG@SiqYL*bpA"R[qtBOPme$&BqtBs^p\=[^qtfm\i;CdqpAFX_
+kl-/5JcC<$JcFU,J,~>
+JcC<$JcC<$JcCc1lMgVXq#'LUh>57jqYL*bpA"R[qY&G3qtBp]p\=[^r;-!]ebn%ro_eF]kPg&4
+JcC<$JcFR+J,~>
+JcC<$JcC<$JcCc1lMgVXq#'LUh>57jqYL*bpA"R[qY&G3qtBp]p\=[^r;-!]ebn%ro_eF]kPg&4
+JcC<$JcFR+J,~>
+JcC<$JcC<$JcCc1lMgVXq#'LUh>57jqYL*bpA"R[qY&G3qtBp]p\=[^r;-!]ebn%ro_eF]kPg&4
+JcC<$JcFR+J,~>
+JcC<$JcC<$JcC`0l2LJVq#'=Pn+s]oqtg3cp%\FYq=`Y;qY'g\pA"R]qtfs^oDJ.Wk5=NAn,2hV
+kPg&4JcC<$JcFL)J,~>
+JcC<$JcC<$JcC`0l2LJVq#'=Pn+s]oqtg3cp%\FYq=`Y;qY'g\pA"R]qtfs^oDJ.Wk5=NAn,2hV
+kPg&4JcC<$JcFL)J,~>
+JcC<$JcC<$JcC`0l2LJVq#'=Pn+s]oqtg3cp%\FYq=`Y;qY'g\pA"R]qtfs^oDJ.Wk5=NAn,2hV
+kPg&4JcC<$JcFL)J,~>
+JcC<$JcC<$JcCZ.lMgPVq#%Z!m/6;KqYL*bp%\CXq"EqEq"FRYpA"R]qtfs^p\a%LaSbZ.jo0i2
+JcC<$JcFL)J,~>
+JcC<$JcC<$JcCZ.lMgPVq#%Z!m/6;KqYL*bp%\CXq"EqEq"FRYpA"R]qtfs^p\a%LaSbZ.jo0i2
+JcC<$JcFL)J,~>
+JcC<$JcC<$JcCZ.lMgPVq#%Z!m/6;KqYL*bp%\CXq"EqEq"FRYpA"R]qtfs^p\a%LaSbZ.jo0i2
+JcC<$JcFL)J,~>
+JcC<$JcC<$JcCZ.kl1AUpADf)i;E*Aqtg3co_A4Ui:d!@p%\F[qtfs^q#&hDe,8e8jo0i2JcC<$
+JcF@%J,~>
+JcC<$JcC<$JcCZ.kl1AUpADf)i;E*Aqtg3co_A4Ui:d!@p%\F[qtfs^q#&hDe,8e8jo0i2JcC<$
+JcF@%J,~>
+JcC<$JcC<$JcCZ.kl1AUpADf)i;E*Aqtg3co_A4Ui:d!@p%\F[qtfs^q#&hDe,8e8jo0i2JcC<$
+JcF@%J,~>
+JcC<$JcC<$JcCT,kl1;Sp&*)3fDP19qtg0bo_A.SlLsuHo_A=Zqtfs^q#&J:i;E'Bj8OW0JcC<$
+JcF@%J,~>
+JcC<$JcC<$JcCT,kl1;Sp&*)3fDP19qtg0bo_A.SlLsuHo_A=Zqtfs^q#&J:i;E'Bj8OW0JcC<$
+JcF@%J,~>
+JcC<$JcC<$JcCT,kl1;Sp&*)3fDP19qtg0bo_A.SlLsuHo_A=Zqtfs^q#&J:i;E'Bj8OW0JcC<$
+JcF@%J,~>
+JcC<$JcC<$JcCQ+kPk2RoDI2:m/6GQoDJ.Uqtg0bnbD&:o(`+Xqtfp]q>Ba\pAX"KnGMVNiVnE.
+JcC<$JcF:#J,~>
+JcC<$JcC<$JcCQ+kPk2RoDI2:m/6GQoDJ.Uqtg0bnbD&:o(`+Xqtfp]q>Ba\pAX"KnGMVNiVnE.
+JcC<$JcF:#J,~>
+JcC<$JcC<$JcCQ+kPk2RoDI2:m/6GQoDJ.Uqtg0bnbD&:o(`+Xqtfp]q>Ba\pAX"KnGMVNiVnE.
+JcC<$JcF:#J,~>
+JcC<$JcC<$JcCK)kPk/QnbhACm/6&Fp&+CXqYL'amJ-,DmeHYSqtfp]q>Bm`kl/O!i;S<-JcC<$
+JcF4!J,~>
+JcC<$JcC<$JcCK)kPk/QnbhACm/6&Fp&+CXqYL'amJ-,DmeHYSqtfp]q>Bm`kl/O!i;S<-JcC<$
+JcF4!J,~>
+JcC<$JcC<$JcCK)kPk/QnbhACm/6&Fp&+CXqYL'amJ-,DmeHYSqtfp]q>Bm`kl/O!i;S<-JcC<$
+JcF4!J,~>
+JcC<$JcC<$JcCH(k5OuNl2:DTjo!s5p\aRYqYL'ac1q/2qYKj]q#'jag]#Y"h#;m)JcC<$JcF0u
+J,~>
+JcC<$JcC<$JcCH(k5OuNl2:DTjo!s5p\aRYqYL'ac1q/2qYKj]q#'jag]#Y"h#;m)JcC<$JcF0u
+J,~>
+JcC<$JcC<$JcCH(k5OuNl2:DTjo!s5p\aRYqYL'ac1q/2qYKj]q#'jag]#Y"h#;m)JcC<$JcF0u
+J,~>
+JcC<$JcC<$JcCE'jSn`KdJVJlp\aUZq>0m^f(f(:qYKg\q>Bsbdf/,%f`$I%JcC<$JcF*sJ,~>
+JcC<$JcC<$JcCE'jSn`KdJVJlp\aUZq>0m^f(f(:qYKg\q>Bsbdf/,%f`$I%JcC<$JcF*sJ,~>
+JcC<$JcC<$JcCE'jSn`KdJVJlp\aUZq>0m^f(f(:qYKg\q>Bsbdf/,%f`$I%JcC<$JcF*sJ,~>
+JcC<$JcC<$JcCB&j8SQHg\g=7nc&(Wq#'^[q>0j]hY?mAq>0^[q>C!c`W#B*e,FpuJcC<$JcF!p
+J,~>
+JcC<$JcC<$JcCB&j8SQHg\g=7nc&(Wq#'^[q>0j]hY?mAq>0^[q>C!c`W#B*e,FpuJcC<$JcF!p
+J,~>
+JcC<$JcC<$JcCB&j8SQHg\g=7nc&(Wq#'^[q>0j]hY?mAq>0^[q>C!c`W#B*e,FpuJcC<$JcF!p
+J,~>
+JcC<$JcC<$JcC?%i;Vs=o_dhLiVrNKq#'^[q"jUXmeHGMq>0[Zq>C!cL&QZ'JcC<$JcEpnJ,~>
+JcC<$JcC<$JcC?%i;Vs=o_dhLiVrNKq#'^[q"jUXmeHGMq>0[Zq>C!cL&QZ'JcC<$JcEpnJ,~>
+JcC<$JcC<$JcC?%i;Vs=o_dhLiVrNKq#'^[q"jUXmeHGMq>0[Zq>C!cL&QZ'JcC<$JcEpnJ,~>
+JcC<$JcC<$JcC<$!<:sU`r4Zkp&4[`nb`(Wg\LU?o)&7\p\fgFJcC<$JcC<$ao?k~>
+JcC<$JcC<$JcC<$!<:sU`r4Zkp&4[`nb`(Wg\LU?o)&7\p\fgFJcC<$JcC<$ao?k~>
+JcC<$JcC<$JcC<$!<:sU`r4Zkp&4[`nb`(Wg\LU?o)&7\p\fgFJcC<$JcC<$ao?k~>
+JcC<$JcC<$JcC<$rr:gRci)Amp&4[`n,)bRl1suJnGE%Zq#,mFJcC<$JcC<$a8^Y~>
+JcC<$JcC<$JcC<$rr:gRci)Amp&4[`n,)bRl1suJnGE%Zq#,mFJcC<$JcC<$a8^Y~>
+JcC<$JcC<$JcC<$rr:gRci)Amp&4[`n,)bRl1suJnGE%Zq#,mFJcC<$JcC<$a8^Y~>
+JcC<$JcC<$JcC<$r;YCJi;LarpAOdamebT3n,)nXq#,mFJcC<$JcC<$`W(G~>
+JcC<$JcC<$JcC<$r;YCJi;LarpAOdamebT3n,)nXq#,mFJcC<$JcC<$`W(G~>
+JcC<$JcC<$JcC<$r;YCJi;LarpAOdamebT3n,)nXq#,mFJcC<$JcC<$`W(G~>
+JcC<$JcC<$JcC<$qu=t@p&2N%pAOa`lMKW<lhgJTq#,pGJcC<$JcC<$_Z,,~>
+JcC<$JcC<$JcC<$qu=t@p&2N%pAOa`lMKW<lhgJTq#,pGJcC<$JcC<$_Z,,~>
+JcC<$JcC<$JcC<$qu=t@p&2N%pAOa`lMKW<lhgJTq#,pGJcC<$JcC<$_Z,,~>
+JcC<$JcC<$JcC<$q#>pEr;QEgp\a.Mp%meIp\agbLAlc(JcC<$JcEIaJ,~>
+JcC<$JcC<$JcC<$q#>pEr;QEgp\a.Mp%meIp\agbLAlc(JcC<$JcEIaJ,~>
+JcC<$JcC<$JcC<$q#>pEr;QEgp\a.Mp%meIp\agbLAlc(JcC<$JcEIaJ,~>
+JcC<$JcC<$JcC<$p]#gDqu6<fpADf)p\adaM#Mu*JcC<$JcE@^J,~>
+JcC<$JcC<$JcC<$p]#gDqu6<fpADf)p\adaM#Mu*JcC<$JcE@^J,~>
+JcC<$JcC<$JcC<$p]#gDqu6<fpADf)p\adaM#Mu*JcC<$JcE@^J,~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/doc/img/evas_big.png b/doc/img/evas_big.png
new file mode 100644 (file)
index 0000000..cd818f7
Binary files /dev/null and b/doc/img/evas_big.png differ
diff --git a/doc/img/evas_mini.png b/doc/img/evas_mini.png
new file mode 100644 (file)
index 0000000..f4f99f0
Binary files /dev/null and b/doc/img/evas_mini.png differ
diff --git a/doc/img/evas_small.png b/doc/img/evas_small.png
new file mode 100644 (file)
index 0000000..8bea367
Binary files /dev/null and b/doc/img/evas_small.png differ
diff --git a/doc/img/foot_bg.png b/doc/img/foot_bg.png
new file mode 100755 (executable)
index 0000000..b24f3a4
Binary files /dev/null and b/doc/img/foot_bg.png differ
diff --git a/doc/img/head_bg.png b/doc/img/head_bg.png
new file mode 100755 (executable)
index 0000000..081dc13
Binary files /dev/null and b/doc/img/head_bg.png differ
diff --git a/doc/img/hilite.png b/doc/img/hilite.png
new file mode 100644 (file)
index 0000000..88a4381
Binary files /dev/null and b/doc/img/hilite.png differ
diff --git a/doc/img/menu_bg.png b/doc/img/menu_bg.png
new file mode 100755 (executable)
index 0000000..e978743
Binary files /dev/null and b/doc/img/menu_bg.png differ
diff --git a/doc/img/menu_bg_current.png b/doc/img/menu_bg_current.png
new file mode 100755 (executable)
index 0000000..de97c92
Binary files /dev/null and b/doc/img/menu_bg_current.png differ
diff --git a/doc/img/menu_bg_hover.png b/doc/img/menu_bg_hover.png
new file mode 100755 (executable)
index 0000000..3fd851d
Binary files /dev/null and b/doc/img/menu_bg_hover.png differ
diff --git a/doc/img/menu_bg_last.png b/doc/img/menu_bg_last.png
new file mode 100755 (executable)
index 0000000..88c116c
Binary files /dev/null and b/doc/img/menu_bg_last.png differ
diff --git a/doc/img/menu_bg_unsel.png b/doc/img/menu_bg_unsel.png
new file mode 100755 (executable)
index 0000000..50e5fd8
Binary files /dev/null and b/doc/img/menu_bg_unsel.png differ
diff --git a/doc/img/n.gif b/doc/img/n.gif
new file mode 100644 (file)
index 0000000..8c3148f
Binary files /dev/null and b/doc/img/n.gif differ
diff --git a/doc/img/n.png b/doc/img/n.png
new file mode 100644 (file)
index 0000000..6d80004
Binary files /dev/null and b/doc/img/n.png differ
diff --git a/doc/img/t.gif b/doc/img/t.gif
new file mode 100644 (file)
index 0000000..cff3068
Binary files /dev/null and b/doc/img/t.gif differ
diff --git a/doc/img/t.png b/doc/img/t.png
new file mode 100644 (file)
index 0000000..5a40479
Binary files /dev/null and b/doc/img/t.png differ
diff --git a/doc/img/tl.gif b/doc/img/tl.gif
new file mode 100644 (file)
index 0000000..c5e973a
Binary files /dev/null and b/doc/img/tl.gif differ
diff --git a/doc/img/tl.png b/doc/img/tl.png
new file mode 100644 (file)
index 0000000..b14a7f1
Binary files /dev/null and b/doc/img/tl.png differ
diff --git a/evas-cairo-x11.pc.in b/evas-cairo-x11.pc.in
new file mode 100644 (file)
index 0000000..4f5c9cf
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-cairo-x11
+Description: Evas Cairo X11 engine
+Version: @VERSION@
diff --git a/evas-direct3d.pc.in b/evas-direct3d.pc.in
new file mode 100644 (file)
index 0000000..493f8cc
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-direct3d
+Description: Evas Direct3D engine
+Version: @VERSION@
diff --git a/evas-directfb.pc.in b/evas-directfb.pc.in
new file mode 100644 (file)
index 0000000..9a1bc3a
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-directfb
+Description: Evas DirectFB engine
+Version: @VERSION@
diff --git a/evas-fb.pc.in b/evas-fb.pc.in
new file mode 100644 (file)
index 0000000..0e1f0a0
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-fb
+Description: Evas framebuffer engine
+Version: @VERSION@
diff --git a/evas-opengl-glew.pc.in b/evas-opengl-glew.pc.in
new file mode 100644 (file)
index 0000000..c5ee7ab
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-opengl-glew
+Description: Evas OpenGL Glew engine
+Version: @VERSION@
diff --git a/evas-opengl-sdl.pc.in b/evas-opengl-sdl.pc.in
new file mode 100644 (file)
index 0000000..64c17b3
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-opengl-sdl
+Description: Evas OpenGL SDL engine
+Version: @VERSION@
diff --git a/evas-opengl-x11.pc.in b/evas-opengl-x11.pc.in
new file mode 100644 (file)
index 0000000..29b9338
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-opengl-x11
+Description: Evas OpenGL X11 engine
+Version: @VERSION@
diff --git a/evas-quartz.pc.in b/evas-quartz.pc.in
new file mode 100644 (file)
index 0000000..dccd393
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-quartz
+Description: Evas Quartz engine
+Version: @VERSION@
diff --git a/evas-software-16-ddraw.pc.in b/evas-software-16-ddraw.pc.in
new file mode 100644 (file)
index 0000000..8c00f61
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-software-16-ddraw
+Description: Evas 16bit software DirectDaw engine
+Version: @VERSION@
diff --git a/evas-software-16-wince.pc.in b/evas-software-16-wince.pc.in
new file mode 100644 (file)
index 0000000..01fad48
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-software-16-wince
+Description: Evas 16bit software WinCE engine
+Version: @VERSION@
diff --git a/evas-software-16-x11.pc.in b/evas-software-16-x11.pc.in
new file mode 100644 (file)
index 0000000..75040a0
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-software-16-x11
+Description: Evas software X11 16bpp engine
+Version: @VERSION@
diff --git a/evas-software-buffer.pc.in b/evas-software-buffer.pc.in
new file mode 100644 (file)
index 0000000..da5d798
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-software-buffer
+Description: Evas software buffer engine
+Version: @VERSION@
diff --git a/evas-software-ddraw.pc.in b/evas-software-ddraw.pc.in
new file mode 100644 (file)
index 0000000..de4b6d2
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-software-ddraw
+Description: Evas software DirectDaw engine
+Version: @VERSION@
diff --git a/evas-software-gdi.pc.in b/evas-software-gdi.pc.in
new file mode 100644 (file)
index 0000000..097c4e1
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-software-gdi
+Description: Evas software GDI engine
+Version: @VERSION@
diff --git a/evas-software-qtopia.pc.in b/evas-software-qtopia.pc.in
new file mode 100644 (file)
index 0000000..4edb41c
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-software-qtopia
+Description: Evas software Qtopia engine
+Version: @VERSION@
diff --git a/evas-software-sdl.pc.in b/evas-software-sdl.pc.in
new file mode 100644 (file)
index 0000000..fb19724
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-software-sdl
+Description: Evas software SDL engine
+Version: @VERSION@
diff --git a/evas-software-x11.pc.in b/evas-software-x11.pc.in
new file mode 100644 (file)
index 0000000..b32556c
--- /dev/null
@@ -0,0 +1,6 @@
+Name: evas-software-x11
+Description: Evas software X11 engine
+Version: @VERSION@
+
+Xlib=@have_evas_engine_software_xlib@
+XCB=@have_evas_engine_software_xcb@
diff --git a/evas-xrender-x11.pc.in b/evas-xrender-x11.pc.in
new file mode 100644 (file)
index 0000000..9d28d13
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-xrender-x11
+Description: Evas XRender X11 engine
+Version: @VERSION@
diff --git a/evas-xrender-xcb.pc.in b/evas-xrender-xcb.pc.in
new file mode 100644 (file)
index 0000000..ba30c43
--- /dev/null
@@ -0,0 +1,3 @@
+Name: evas-xrender-xcb
+Description: Evas XRender XCB engine
+Version: @VERSION@
diff --git a/evas.pc.in b/evas.pc.in
new file mode 100644 (file)
index 0000000..f443bae
--- /dev/null
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: evas
+Description: Evas canvas display library
+@pkgconfig_requires_private@: @requirement_evas@
+Version: @VERSION@
+Libs: -L${libdir} -levas
+Libs.private: @EFL_FNMATCH_LIBS@ @pthread_libs@
+Cflags: -I${includedir}
diff --git a/evas.spec.in b/evas.spec.in
new file mode 100644 (file)
index 0000000..65fd1b9
--- /dev/null
@@ -0,0 +1,594 @@
+# Conditional build stuff; from rpm 4.4 /usr/lib/rpm/macros.
+# bcond_without defaults to WITH, and vice versa.  Yes, it's
+# ass-backward.  Blame PLD.
+%if %{!?with:1}0
+%define with() %{expand:%%{?with_%{1}:1}%%{!?with_%{1}:0}}
+%endif
+%if %{!?without:1}0
+%define without() %{expand:%%{?with_%{1}:0}%%{!?with_%{1}:1}}
+%endif
+%if %{!?bcond_with:1}0
+%define bcond_with() %{expand:%%{?_with_%{1}:%%global with_%{1} 1}}
+%endif
+%if %{!?bcond_without:1}0
+%define bcond_without() %{expand:%%{!?_without_%{1}:%%global with_%{1} 1}}
+%endif
+
+## disabled features
+%bcond_with    module_loader_edb
+%bcond_with    module_saver_edb
+%bcond_with    module_engine_directfb
+%bcond_with    module_engine_gl_x11
+%bcond_with    module_engine_quartz
+%bcond_with    module_engine_software_qtopia
+%bcond_with    module_engine_software_16_x11
+%bcond_with    module_engine_software_sdl
+%bcond_with    module_engine_software_xcb
+%bcond_with    module_engine_xrender_x11
+%bcond_with    module_engine_xrender_xcb
+%bcond_with    module_loader_svg
+
+## enabled features
+%bcond_without module_engine_software_x11
+%bcond_without module_engine_buffer
+%bcond_without module_engine_fb
+%bcond_without module_loader_pmaps
+%bcond_without module_loader_png
+%bcond_without module_saver_png
+%bcond_without module_loader_jpeg
+%bcond_without module_saver_jpeg
+%bcond_without module_loader_gif
+%bcond_without module_loader_tiff
+%bcond_without module_saver_tiff
+%bcond_without module_loader_eet
+%bcond_without module_saver_eet
+%bcond_without module_loader_xpm
+
+# This just keeps a missing doxygen from killing the build.
+%define _missing_doc_files_terminate_build 0
+
+# Macros for ./configure use
+%define ac_with_module_loader_eet --%{?with_module_loader_eet:en}%{!?with_module_loader_eet:dis}able-image-loader-eet
+%define ac_with_module_loader_jpeg --%{?with_module_loader_jpeg:en}%{!?with_module_loader_jpeg:dis}able-image-loader-jpeg
+%define ac_with_module_loader_pmaps --%{?with_module_loader_pmaps:en}%{!?with_module_loader_pmaps:dis}able-image-loader-pmaps
+%define ac_with_module_loader_png --%{?with_module_loader_png:en}%{!?with_module_loader_png:dis}able-image-loader-png
+%define ac_with_module_loader_tiff --%{?with_module_loader_tiff:en}%{!?with_module_loader_tiff:dis}able-image-loader-tiff
+%define ac_with_module_loader_gif --%{?with_module_loader_gif:en}%{!?with_module_loader_gif:dis}able-image-loader-gif
+%define ac_with_module_loader_edb --%{?with_module_loader_edb:en}%{!?with_module_loader_edb:dis}able-image-loader-edb
+%define ac_with_module_loader_xpm --%{?with_module_loader_xpm:en}%{!?with_module_loader_xpm:dis}able-image-loader-xpm
+%define ac_with_module_loader_svg --%{?with_module_loader_svg:en}%{!?with_module_loader_svg:dis}able-image-loader-svg
+%define ac_with_module_saver_eet --%{?with_module_saver_eet:en}%{!?with_module_saver_eet:dis}able-image-saver-eet
+%define ac_with_module_saver_jpeg --%{?with_module_saver_jpeg:en}%{!?with_module_saver_jpeg:dis}able-image-saver-jpeg
+%define ac_with_module_saver_png --%{?with_module_saver_png:en}%{!?with_module_saver_png:dis}able-image-saver-png
+%define ac_with_module_saver_tiff --%{?with_module_saver_tiff:en}%{!?with_module_saver_tiff:dis}able-image-saver-tiff
+%define ac_with_module_saver_gif --%{?with_module_saver_gif:en}%{!?with_module_saver_gif:dis}able-image-saver-gif
+%define ac_with_module_saver_edb --%{?with_module_saver_edb:en}%{!?with_module_saver_edb:dis}able-image-saver-edb
+%define ac_with_module_saver_xpm --%{?with_module_saver_xpm:en}%{!?with_module_saver_xpm:dis}able-image-saver-xpm
+%define ac_with_module_engine_software-x11 --%{?with_module_engine_software_x11:en}%{!?with_module_engine_software_x11:dis}able-software-x11
+%define ac_with_module_engine_buffer --%{?with_module_engine_buffer:en}%{!?with_module_engine_buffer:dis}able-buffer
+%define ac_with_module_engine_fb --%{?with_module_engine_fb:en}%{!?with_module_engine_fb:dis}able-fb
+%define ac_with_module_engine_xrender_x11 --%{?with_module_engine_xrender_x11:en}%{!?with_module_engine_xrender_x11:dis}able-xrender-x11
+%define ac_with_module_engine_gl_x11 --%{?with_module_engine_gl_x11:en}%{!?with_module_engine_gl_x11:dis}able-gl-x11
+%define ac_with_module_engine_quartz --%{?with_module_engine_quartz:en}%{!?with_module_engine_quartz:dis}able-quartz
+%define ac_with_module_engine_directfb --%{?with_module_engine_directfb:en}%{!?with_module_engine_directfb:dis}able-directfb
+%define ac_with_module_engine_software_16_x11 --%{?with_module_engine_software_16_x11:en}%{!?with_module_engine_software_16_x11:dis}able-software-16-x11
+%define ac_with_module_engine_software_qtopia --%{?with_module_engine_software_qtopia:en}%{!?with_module_engine_software_qtopia:dis}able-software-qtopia
+%define ac_with_module_engine_software_sdl --%{?with_module_engine_software_sdl:en}%{!?with_module_engine_software_sdl:dis}able-sdl
+%define ac_with_module_engine_software_xcb --%{?with_module_engine_software_xcb:en}%{!?with_module_engine_software_xcb:dis}able-software-xcb
+%define ac_with_module_engine_xrender_xcb --%{?with_module_engine_xrender_xcb:en}%{!?with_module_engine_xrender_xcb:dis}able-xrender-xcb
+
+%{!?_rel:%{expand:%%global _rel 0.r%(svnversion | sed 's/[^0-9].*$//' || echo 0000)}}
+
+Summary: Multi-platform Canvas Library
+Name: @PACKAGE@
+Version: @VERSION@
+Release: %{_rel}
+License: BSD
+Group: System Environment/Libraries
+URL: http://www.enlightenment.org/
+Source: http://download.enlightenment.org/releases/%{name}-%{version}.tar.gz
+Packager: %{?_packager:%{_packager}}%{!?_packager:Michael Jennings <mej@eterm.org>}
+Vendor: %{?_vendorinfo:%{_vendorinfo}}%{!?_vendorinfo:The Enlightenment Project (http://www.enlightenment.org/)}
+Distribution: %{?_distribution:%{_distribution}}%{!?_distribution:%{_vendor}}
+BuildRequires: /usr/bin/freetype-config
+Provides: evas
+BuildRoot: %{_tmppath}/%{name}-%{version}-root
+
+%description
+Evas is a clean display canvas API for several target display systems
+that can draw anti-aliased text, smooth super and sub-sampled scaled
+images, alpha-blend objects much and more.
+
+%package devel
+Summary: Evas headers, static libraries, documentation and test programs
+Group: System Environment/Libraries
+Requires: %{name} = %{version}
+
+%description devel
+Headers, static libraries, test programs and documentation for Evas.
+
+%if %{with module_loader_eet}
+%package module_loader_eet
+Summary: EET Image loader module for Evas
+Group: System Environment/Libraries
+BuildRequires: eet-devel
+%description module_loader_eet
+EET Image loader module for Evas
+%endif
+
+%if %{with module_saver_eet}
+%package module_saver_eet
+Summary: EET Image saver module for Evas
+Group: System Environment/Libraries
+BuildRequires: eet-devel
+%description module_saver_eet
+EET Image saver module for Evas
+%endif
+
+%if %{with module_loader_jpeg}
+%package module_loader_jpeg
+Summary: JPEG Image loader module for Evas
+Group: System Environment/Libraries
+BuildRequires: libjpeg-devel
+%description module_loader_jpeg
+JPEG Image loader module for Evas
+%endif
+
+%if %{with module_saver_jpeg}
+%package module_saver_jpeg
+Summary: JPEG Image saver module for Evas
+Group: System Environment/Libraries
+BuildRequires: libjpeg-devel
+%description module_saver_jpeg
+JPEG Image saver module for Evas
+%endif
+
+%if %{with module_loader_pmaps}
+%package module_loader_pmaps
+Summary: Pixmap Image loader module for Evas
+Group: System Environment/Libraries
+BuildRequires: libXpm-devel
+%description module_loader_pmaps
+Pixmap Image loader module for Evas
+%endif
+
+%if %{with module_loader_png}
+%package module_loader_png
+Summary: PNG Image loader module for Evas
+Group: System Environment/Libraries
+BuildRequires: libpng-devel
+%description module_loader_png
+PNG Image loader module for Evas
+%endif
+
+%if %{with module_saver_png}
+%package module_saver_png
+Summary: PNG Image saver module for Evas
+Group: System Environment/Libraries
+BuildRequires: libpng-devel
+%description module_saver_png
+PNG Image saver module for Evas
+%endif
+
+%if %{with module_loader_tiff}
+%package module_loader_tiff
+Summary: TIFF Image loader module for Evas
+Group: System Environment/Libraries
+BuildRequires: libtiff-devel
+%description module_loader_tiff
+TIFF Image loader module for Evas
+%endif
+
+%if %{with module_saver_tiff}
+%package module_saver_tiff
+Summary: TIFF Image saver module for Evas
+Group: System Environment/Libraries
+BuildRequires: libtiff-devel
+%description module_saver_tiff
+TIFF Image saver module for Evas
+%endif
+
+%if %{with module_loader_gif}
+%package module_loader_gif
+Summary: GIF Image loader module for Evas
+Group: System Environment/Libraries
+#BuildSuggests: libungif-devel, giflib-devel
+BuildRequires: /usr/include/gif_lib.h
+%description module_loader_gif
+GIF Image loader module for Evas
+%endif
+
+%if %{with module_loader_edb}
+%package module_loader_edb
+Summary: EDB Image loader module for Evas
+Group: System Environment/Libraries
+BuildRequires: edb-devel
+%description module_loader_edb
+EDB Image loader module for Evas
+%endif
+
+%if %{with module_saver_edb}
+%package module_saver_edb
+Summary: EDB Image saver module for Evas
+Group: System Environment/Libraries
+BuildRequires: edb-devel
+%description module_saver_edb
+EDB Image saver module for Evas
+%endif
+
+%if %{with module_loader_xpm}
+%package module_loader_xpm
+Summary: XPM Image loader module for Evas
+Group: System Environment/Libraries
+##BuildRequires: (none, X?)
+%description module_loader_xpm
+XPM Image loader module for Evas
+%endif
+
+%if %{with module_loader_svg}
+%package module_loader_svg
+Summary: SVG Image loader module for Evas
+Group: System Environment/Libraries
+BuildRequires: librsvg-devel >= 2.14
+%description module_loader_svg
+svg Image loader module for Evas
+%endif
+
+%package module_engine_software_generic
+Summary: Software X11 rendering engine module for Evas
+Group: System Environment/Libraries
+Requires: evas
+%description module_engine_software_generic
+Software X11 rendering engine module for Evas
+
+%if %{with module_engine_software_x11}
+%package module_engine_software_x11
+Summary: Software X11 rendering engine module for Evas
+Group: System Environment/Libraries
+Requires: evas-module_engine_software_generic
+Requires: evas
+%description module_engine_software_x11
+Software X11 rendering engine module for Evas
+%endif
+
+%if %{with module_engine_buffer}
+%package module_engine_buffer
+Summary: Buffer rendering engine module for Evas
+Group: System Environment/Libraries
+Requires: evas-module_engine_software_generic
+Requires: evas
+%description module_engine_buffer
+Memory Buffer rendering engine module for Evas
+%endif
+
+%if %{with module_engine_fb}
+%package module_engine_fb
+Summary: Framebuffer rendering engine module for Evas
+Group: System Environment/Libraries
+Requires: evas-module_engine_software_generic
+Requires: evas
+%description module_engine_fb
+Framebuffer rendering engine module for Evas
+%endif
+
+%if %{with module_engine_xrender_x11}
+%package module_engine_xrender_x11
+Summary: XRender rendering engine module for Evas
+Group: System Environment/Libraries
+#BuildSuggests: xorg-x11-devel, XFree86-devel
+BuildRequires: xrender-devel
+Requires: evas-module_engine_software_generic
+Requires: evas
+%description module_engine_xrender_x11
+XRender rendering engine module for Evas
+%endif
+
+%if %{with module_engine_gl_x11}
+%package module_engine_gl_x11
+Summary: OpenGL under X11 rendering engine module for Evas
+Group: System Environment/Libraries
+#BuildSuggests: xorg-x11-devel, xorg-x11-Mesa-libGL, XFree86-devel
+Requires: evas
+%description module_engine_gl_x11
+OpenGL under X11 rendering engine module for Evas
+%endif
+
+%if %{with module_engine_quartz}
+%package module_engine_quartz
+Summary: Quartz rendering engine module for Evas
+Group: System Environment/Libraries
+#BuildSuggests: 
+Requires: evas
+%description module_engine_quartz
+Quartz rendering engine module for Evas
+%endif
+
+%if %{with module_engine_directfb}
+%package module_engine_directfb
+Summary: Directfb rendering engine module for Evas
+Group: System Environment/Libraries
+#BuildSuggests: DirectFB, libdirectfb-devel, directfb-devel
+BuildRequires: /usr/include/directfb/dfb_types.h
+Requires: evas
+%description module_engine_directfb
+Directfb rendering engine module for Evas
+%endif
+
+%if %{with module_engine_software_qtopia}
+%package module_engine_software_qtopia
+Summary: Qtopia rendering engine module for Evas
+Group: System Environment/Libraries
+BuildRequires: qtopia-devel
+Requires: evas-module_engine_software_generic
+Requires: evas
+%description module_engine_software_qtopia
+Qtopia rendering engine module for Evas
+%endif
+
+%if %{with module_engine_software_16_x11}
+%package module_engine_software_16_x11
+Summary: Software 16-bit X11 rendering engine module for Evas
+Group: System Environment/Libraries
+Requires: evas-module_engine_software_generic
+Requires: evas
+%description module_engine_software_16_x11
+Software 16-bit X11 rendering engine module for Evas
+%endif
+
+%if %{with module_engine_software_sdl}
+%package module_engine_software_sdl
+Summary: Software SDL X11 rendering engine module for Evas
+Group: System Environment/Libraries
+BuildRequires: SDL-devel
+Requires: evas-module_engine_software_generic
+Requires: evas
+%description module_engine_software_sdl
+Software SDL X11 rendering engine module for Evas
+%endif
+
+%if %{with module_engine_software_xcb}
+%package module_engine_software_xcb
+Summary: Software XCB X11 rendering engine module for Evas
+Group: System Environment/Libraries
+BuildRequires: xcb-devel
+Requires: evas-module_engine_software_generic
+Requires: evas
+%description module_engine_software_xcb
+Software XCB X11 rendering engine module for Evas
+%endif
+
+%if %{with module_engine_xrender_xcb}
+%package module_engine_xrender_xcb
+Summary: Xrender XCB X11 rendering engine module for Evas
+Group: System Environment/Libraries
+BuildRequires: xcb-devel
+Requires: evas-module_engine_xrender_x11
+Requires: evas
+%description module_engine_xrender_xcb
+Xrender XCB X11 rendering engine module for Evas
+%endif
+
+%prep
+%setup -q -n %{name}-%{version}
+
+%build
+%{configure} --prefix=%{_prefix} --x-libraries=%{_prefix}/X11R6/%{_lib} \
+    %{?ac_with_module_loader_eet} \
+    %{?ac_with_module_saver_eet} \
+    %{?ac_with_module_loader_jpeg} \
+    %{?ac_with_module_saver_jpeg} \
+    %{?ac_with_module_loader_pmaps} \
+    %{?ac_with_module_loader_png} \
+    %{?ac_with_module_saver_png} \
+    %{?ac_with_module_loader_tiff} \
+    %{?ac_with_module_saver_tiff} \
+    %{?ac_with_module_loader_gif} \
+    %{?ac_with_module_loader_edb} \
+    %{?ac_with_module_saver_edb} \
+    %{?ac_with_module_loader_xpm} \
+    %{?ac_with_module_loader_svg} \
+    %{?ac_with_module_engine_software_x11} \
+    %{?ac_with_module_engine_buffer} \
+    %{?ac_with_module_engine_fb} \
+    %{?ac_with_module_engine_xrender_x11} \
+    %{?ac_with_module_engine_gl_x11} \
+    %{?ac_with_module_engine_quartz} \
+    %{?ac_with_module_engine_directfb} \
+    %{?ac_with_module_engine_software_qtopia} \
+    %{?ac_with_module_engine_software_16_x11} \
+    %{?ac_with_module_engine_software_sdl} \
+    %{?ac_with_module_engine_software_xcb} \
+    %{?ac_with_module_engine_xrender_xcb} \
+    $RPM_CONFIGURE_OPTS
+%{__make} %{?_smp_mflags} %{?mflags}
+test -x `which doxygen` && /bin/sh gendoc || :
+
+%install
+%{__make} %{?mflags_install} DESTDIR=$RPM_BUILD_ROOT install
+%{__rm} -f $RPM_BUILD_ROOT%{_libdir}/%{name}/modules/*/*/*/*a
+
+%clean
+test "x$RPM_BUILD_ROOT" != "x/" && rm -rf $RPM_BUILD_ROOT
+
+%post
+/sbin/ldconfig
+
+%postun
+/sbin/ldconfig
+
+%files
+%defattr(-, root, root)
+%doc AUTHORS COPYING COPYING-PLAIN README
+%{_bindir}/%{name}*
+%{_libdir}/*.so.*
+
+%files devel
+%defattr(-, root, root)
+%{_libdir}/*.so
+%{_libdir}/*.la
+%{_libdir}/*.a
+%{_libdir}/pkgconfig/*
+%{_includedir}/*.h
+%{_datadir}/evas/examples/*.c
+%files module_engine_software_generic
+%defattr(-, root, root)
+%{_libdir}/evas/modules/engines/software_generic/*/module.so
+
+%if %{with module_loader_eet}
+%files module_loader_eet
+%defattr(-, root, root)
+%{_libdir}/evas/modules/loaders/eet/*/module.so
+%endif
+
+%if %{with module_saver_eet}
+%files module_saver_eet
+%defattr(-, root, root)
+%{_libdir}/evas/modules/savers/eet/*/module.so
+%endif
+
+%if %{with module_loader_pmaps}
+%files module_loader_pmaps
+%defattr(-, root, root)
+%{_libdir}/evas/modules/loaders/pmaps/*/module.so
+%endif
+
+%if %{with module_loader_png}
+%files module_loader_png
+%defattr(-, root, root)
+%{_libdir}/evas/modules/loaders/png/*/module.so
+%endif
+
+%if %{with module_saver_png}
+%files module_saver_png
+%defattr(-, root, root)
+%{_libdir}/evas/modules/savers/png/*/module.so
+%endif
+
+%if %{with module_loader_jpeg}
+%files module_loader_jpeg
+%defattr(-, root, root)
+%{_libdir}/evas/modules/loaders/jpeg/*/module.so
+%endif
+
+%if %{with module_saver_jpeg}
+%files module_saver_jpeg
+%defattr(-, root, root)
+%{_libdir}/evas/modules/savers/jpeg/*/module.so
+%endif
+
+%if %{with module_loader_tiff}
+%files module_loader_tiff
+%defattr(-, root, root)
+%{_libdir}/evas/modules/loaders/tiff/*/module.so
+%endif
+
+%if %{with module_saver_tiff}
+%files module_saver_tiff
+%defattr(-, root, root)
+%{_libdir}/evas/modules/savers/tiff/*/module.so
+%endif
+
+%if %{with module_loader_gif}
+%files module_loader_gif
+%defattr(-, root, root)
+%{_libdir}/evas/modules/loaders/gif/*/module.so
+%endif
+
+%if %{with module_loader_edb}
+%files module_loader_edb
+%defattr(-, root, root)
+%{_libdir}/evas/modules/loaders/edb/*/module.so
+%endif
+
+%if %{with module_saver_edb}
+%files module_saver_edb
+%defattr(-, root, root)
+%{_libdir}/evas/modules/savers/edb/*/module.so
+%endif
+
+%if %{with module_loader_xpm}
+%files module_loader_xpm
+%defattr(-, root, root)
+%{_libdir}/evas/modules/loaders/xpm/*/module.so
+%endif
+
+%if %{with module_loader_svg}
+%files module_loader_svg
+%defattr(-, root, root)
+%{_libdir}/evas/modules/loaders/svg/*/module.so
+%endif
+
+%if %{with module_engine_software_x11}
+%files module_engine_software_x11
+%defattr(-, root, root)
+%{_libdir}/evas/modules/engines/software_x11/*/module.so
+%endif
+
+%if %{with module_engine_buffer}
+%files module_engine_buffer
+%defattr(-, root, root)
+%{_libdir}/evas/modules/engines/buffer/*/module.so
+%endif
+
+%if %{with module_engine_fb}
+%files module_engine_fb
+%defattr(-, root, root)
+%{_libdir}/evas/modules/engines/fb/*/module.so
+%endif
+
+%if %{with module_engine_xrender_x11}
+%files module_engine_xrender_x11
+%defattr(-, root, root)
+%{_libdir}/evas/modules/engines/xrender_x11/*/module.so
+%endif
+
+%if %{with module_engine_gl_x11}
+%files module_engine_gl_x11
+%defattr(-, root, root)
+%{_libdir}/evas/modules/engines/gl_x11/*/module.so
+%endif
+
+%if %{with module_engine_quartz}
+%files module_engine_quartz
+%defattr(-, root, root)
+%{_libdir}/evas/modules/engines/quartz/*/module.so
+%endif
+
+%if %{with module_engine_directfb}
+%files module_engine_directfb
+%defattr(-, root, root)
+%{_libdir}/evas/modules/engines/directfb/*/module.so
+%endif
+
+%if %{with module_engine_software_qtopia}
+%files module_engine_software_qtopia
+%defattr(-, root, root)
+%{_libdir}/evas/modules/engines/software_qtopia/*/module.so
+%endif
+
+%if %{with module_engine_software_16_x11}
+%files module_engine_software_16_x11
+%defattr(-, root, root)
+%{_libdir}/evas/modules/engines/software_16/*/module.so
+%{_libdir}/evas/modules/engines/software_16_x11/*/module.so
+%endif
+
+%if %{with module_engine_software_sdl}
+%files module_engine_software_sdl
+%defattr(-, root, root)
+%{_libdir}/evas/modules/engines/software_sdl/*/module.so
+%endif
+
+%if %{with module_engine_software_xcb}
+%files module_engine_software_xcb
+%defattr(-, root, root)
+%{_libdir}/evas/modules/engines/software_xcb/*/module.so
+%endif
+
+%if %{with module_engine_xrender_xcb}
+%files module_engine_xrender_xcb
+%defattr(-, root, root)
+%{_libdir}/evas/modules/engines/xrender_xcb/*/module.so
+%endif
+
+%changelog
diff --git a/m4/ac_attribute.m4 b/m4/ac_attribute.m4
new file mode 100644 (file)
index 0000000..23479a9
--- /dev/null
@@ -0,0 +1,47 @@
+dnl Copyright (C) 2004-2008 Kim Woelders
+dnl Copyright (C) 2008 Vincent Torri <vtorri at univ-evry dot fr>
+dnl That code is public domain and can be freely used or copied.
+dnl Originally snatched from somewhere...
+
+dnl Macro for checking if the compiler supports __attribute__
+
+dnl Usage: AC_C___ATTRIBUTE__
+dnl call AC_DEFINE for HAVE___ATTRIBUTE__ and __UNUSED__
+dnl if the compiler supports __attribute__, HAVE___ATTRIBUTE__ is
+dnl defined to 1 and __UNUSED__ is defined to __attribute__((unused))
+dnl otherwise, HAVE___ATTRIBUTE__ is not defined and __UNUSED__ is
+dnl defined to nothing.
+
+AC_DEFUN([AC_C___ATTRIBUTE__],
+[
+
+AC_MSG_CHECKING([for __attribute__])
+
+AC_CACHE_VAL([ac_cv___attribute__],
+   [AC_TRY_COMPILE(
+       [
+#include <stdlib.h>
+
+int func(int x);
+int foo(int x __attribute__ ((unused)))
+{
+   exit(1);
+}
+       ],
+       [],
+       [ac_cv___attribute__="yes"],
+       [ac_cv___attribute__="no"]
+    )])
+
+AC_MSG_RESULT($ac_cv___attribute__)
+
+if test "x${ac_cv___attribute__}" = "xyes" ; then
+   AC_DEFINE([HAVE___ATTRIBUTE__], [1], [Define to 1 if your compiler has __attribute__])
+   AC_DEFINE([__UNUSED__], [__attribute__((unused))], [Macro declaring a function argument to be unused])
+  else
+    AC_DEFINE([__UNUSED__], [], [Macro declaring a function argument to be unused])
+fi
+
+])
+
+dnl End of ac_attribute.m4
diff --git a/m4/efl_doxygen.m4 b/m4/efl_doxygen.m4
new file mode 100644 (file)
index 0000000..d83ed68
--- /dev/null
@@ -0,0 +1,97 @@
+dnl Copyright (C) 2008 Vincent Torri <vtorri at univ-evry dot fr>
+dnl That code is public domain and can be freely used or copied.
+
+dnl Macro that check if doxygen is available or not.
+
+dnl EFL_CHECK_DOXYGEN([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Test for the doxygen program
+dnl Defines efl_doxygen
+dnl Defines the automake conditionnal EFL_BUILD_DOC
+dnl
+AC_DEFUN([EFL_CHECK_DOXYGEN],
+[
+
+dnl
+dnl Disable the build of the documentation
+dnl
+AC_ARG_ENABLE([doc],
+   [AC_HELP_STRING(
+       [--disable-doc],
+       [Disable documentation build @<:@default=enabled@:>@])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       efl_enable_doc="yes"
+    else
+       efl_enable_doc="no"
+    fi
+   ],
+   [efl_enable_doc="yes"])
+
+AC_MSG_CHECKING([whether to build documentation])
+AC_MSG_RESULT([${efl_enable_doc}])
+
+if test "x${efl_enable_doc}" = "xyes" ; then
+
+dnl Specify the file name, without path
+
+   efl_doxygen="doxygen"
+
+   AC_ARG_WITH([doxygen],
+      [AC_HELP_STRING(
+          [--with-doxygen=FILE],
+          [doxygen program to use @<:@default=doxygen@:>@])],
+
+dnl Check the given doxygen program.
+
+      [efl_doxygen=${withval}
+       AC_CHECK_PROG([efl_have_doxygen],
+          [${efl_doxygen}],
+          [yes],
+          [no])
+       if test "x${efl_have_doxygen}" = "xno" ; then
+          echo "WARNING:"
+          echo "The doxygen program you specified:"
+          echo "${efl_doxygen}"
+          echo "was not found.  Please check the path and make sure "
+          echo "the program exists and is executable."
+          AC_MSG_WARN([no doxygen detected. Documentation will not be built])
+       fi
+      ],
+      [AC_CHECK_PROG([efl_have_doxygen],
+          [${efl_doxygen}],
+          [yes],
+          [no])
+       if test "x${efl_have_doxygen}" = "xno" ; then
+          echo "WARNING:"
+          echo "The doxygen program was not found in your execute path."
+          echo "You may have doxygen installed somewhere not covered by your path."
+          echo ""
+          echo "If this is the case make sure you have the packages installed, AND"
+          echo "that the doxygen program is in your execute path (see your"
+          echo "shell manual page on setting the \$PATH environment variable), OR"
+          echo "alternatively, specify the program to use with --with-doxygen."
+          AC_MSG_WARN([no doxygen detected. Documentation will not be built])
+       fi
+      ])
+fi
+
+dnl
+dnl Substitution
+dnl
+AC_SUBST([efl_doxygen])
+
+if ! test "x${efl_have_doxygen}" = "xyes" ; then
+   efl_enable_doc="no"
+fi
+
+AM_CONDITIONAL(EFL_BUILD_DOC, test "x${efl_enable_doc}" = "xyes")
+
+if test "x${efl_enable_doc}" = "xyes" ; then
+  m4_default([$1], [:])
+else
+  m4_default([$2], [:])
+fi
+
+])
+
+dnl End of efl_doxygen.m4
diff --git a/m4/efl_fnmatch.m4 b/m4/efl_fnmatch.m4
new file mode 100644 (file)
index 0000000..a92ac6b
--- /dev/null
@@ -0,0 +1,31 @@
+dnl Copyright (C) 2010 Vincent Torri <vtorri at univ-evry dot fr>
+dnl That code is public domain and can be freely used or copied.
+
+dnl Macro that check if fnmatch functions are available or not.
+
+dnl Usage: EFL_CHECK_FNMATCH([, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Call AC_SUBST(EFL_FNMATCH_LIBS)
+
+AC_DEFUN([EFL_CHECK_FNMATCH],
+[
+
+AC_CHECK_HEADER([fnmatch.h], [_efl_have_fnmatch="yes"], [_efl_have_fnmatch="no"])
+
+if test "x${_efl_have_fnmatch}" = "xyes" ; then
+   AC_SEARCH_LIBS([fnmatch],
+      [fnmatch evil iberty],
+      [_efl_have_fnmatch="yes"],
+      [_efl_have_fnmatch="no"])
+fi
+
+EFL_FNMATCH_LIBS=""
+
+if (! test "x${ac_cv_search_fnmatch}" = "xnone required") && (! test "x${ac_cv_search_fnmatch}" = "xno") && (! test "x${ac_cv_search_fnmatch}" = "x-levil") ; then
+   EFL_FNMATCH_LIBS=${ac_cv_search_fnmatch}
+fi
+
+AC_SUBST(EFL_FNMATCH_LIBS)
+
+AS_IF([test "x$_efl_have_fnmatch" = "xyes"], [$1], [$2])
+
+])
diff --git a/m4/efl_path_max.m4 b/m4/efl_path_max.m4
new file mode 100644 (file)
index 0000000..f57bfd2
--- /dev/null
@@ -0,0 +1,36 @@
+dnl Check for PATH_MAX in limits.h, and define a default value if not found
+dnl This is a workaround for systems not providing PATH_MAX, like GNU/Hurd
+
+dnl EFL_CHECK_PATH_MAX([DEFAULT_VALUE_IF_NOT_FOUND])
+dnl
+dnl If PATH_MAX is not defined in <limits.h>, defines it
+dnl to DEFAULT_VALUE_IF_NOT_FOUND if it exists, or fallback
+dnl to using 4096
+
+AC_DEFUN([EFL_CHECK_PATH_MAX],
+[
+
+default_max=m4_default([$1], "4096")
+AC_LANG_PUSH([C])
+
+AC_MSG_CHECKING([for PATH_MAX in limits.h])
+AC_COMPILE_IFELSE(
+   [AC_LANG_PROGRAM(
+       [[
+#include <limits.h>
+       ]],
+       [[
+int i = PATH_MAX;
+       ]])],
+   [AC_MSG_RESULT([yes])],
+   [
+    AC_DEFINE_UNQUOTED([PATH_MAX],
+       [${default_max}],
+       [default value since PATH_MAX is not defined])
+    AC_MSG_RESULT([no: using ${default_max}])
+   ])
+
+AC_LANG_POP([C])
+
+])
+dnl end of efl_path_max.m4
diff --git a/m4/efl_pthread.m4 b/m4/efl_pthread.m4
new file mode 100644 (file)
index 0000000..1894ad7
--- /dev/null
@@ -0,0 +1,130 @@
+dnl Copyright (C) 2010 Vincent Torri <vtorri at univ-evry dot fr>
+dnl That code is public domain and can be freely used or copied.
+
+dnl Macro that check if several pthread library is available or not.
+
+dnl Usage: EFL_CHECK_PTHREAD(want_pthread_spin[, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Call AC_SUBST(EFL_PTHREAD_CFLAGS)
+dnl Call AC_SUBST(EFL_PTHREAD_LIBS)
+dnl Define EFL_HAVE_PTHREAD
+dnl Define EFL_HAVE_PTHREAD_SPINLOCK
+
+AC_DEFUN([EFL_CHECK_PTHREAD],
+[
+
+dnl configure option
+
+AC_ARG_ENABLE([pthread],
+   [AC_HELP_STRING([--disable-pthread], [enable POSIX threads code @<:@default=auto@:>@])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       _efl_enable_pthread="yes"
+    else
+       _efl_enable_pthread="no"
+    fi
+   ],
+   [_efl_enable_pthread="auto"])
+
+AC_MSG_CHECKING([whether to build POSIX threads code])
+AC_MSG_RESULT([${_efl_enable_pthread}])
+
+dnl check if the compiler supports pthreads
+
+case "$host_os" in
+   mingw*)
+      _efl_pthread_cflags=""
+      _efl_pthread_libs="-lpthreadGC2"
+      ;;
+   solaris*)
+      _efl_pthread_cflags="-mt"
+      _efl_pthread_libs="-mt"
+      ;;
+   *)
+      _efl_pthread_cflags="-pthread"
+      _efl_pthread_libs="-pthread"
+      ;;
+esac
+
+_efl_have_pthread="no"
+
+if test "x${_efl_enable_pthread}" = "xyes" || test "x${_efl_enable_pthread}" = "xauto" ; then
+
+   SAVE_CFLAGS=${CFLAGS}
+   CFLAGS="${CFLAGS} ${_efl_pthread_cflags}"
+   SAVE_LDFLAGS=${LDFLAGS}
+   LDFLAGS="${LDFLAGS} ${_efl_pthread_libs}"
+   AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM([[
+#include <pthread.h>
+                       ]],
+                       [[
+pthread_t id;
+id = pthread_self();
+                       ]])],
+      [_efl_have_pthread="yes"],
+      [_efl_have_pthread="no"])
+   CFLAGS=${SAVE_CFLAGS}
+   LDFLAGS=${SAVE_LDFLAGS}
+
+fi
+
+AC_MSG_CHECKING([whether system support POSIX threads])
+AC_MSG_RESULT([${_efl_have_pthread}])
+if test "$x{_efl_enable_pthread}" = "xyes" && test "x${_efl_have_pthread}" = "xno"; then
+   AC_MSG_ERROR([pthread support requested but not found.])
+fi
+
+EFL_PTHREAD_CFLAGS=""
+EFL_PTHREAD_LIBS=""
+if test "x${_efl_have_pthread}" = "xyes" ; then
+   EFL_PTHREAD_CFLAGS=${_efl_pthread_cflags}
+   EFL_PTHREAD_LIBS=${_efl_pthread_libs}
+fi
+
+AC_SUBST(EFL_PTHREAD_CFLAGS)
+AC_SUBST(EFL_PTHREAD_LIBS)
+
+if test "x${_efl_have_pthread}" = "xyes" ; then
+   AC_DEFINE(EFL_HAVE_PTHREAD, 1, [Define to mention that POSIX threads are supported])
+fi
+
+dnl check if the compiler supports pthreads spinlock
+
+_efl_have_pthread_spinlock="no"
+
+if test "x${_efl_have_pthread}" = "xyes" && test "x$1" = "xyes" ; then
+
+   SAVE_CFLAGS=${CFLAGS}
+   CFLAGS="${CFLAGS} ${EFL_PTHREAD_CFLAGS}"
+   SAVE_LDFLAGS=${LDFLAGS}
+   LDFLAGS="${LDFLAGS} ${EFL_PTHREAD_LIBS}"
+   AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM([[
+#include <pthread.h>
+                       ]],
+                       [[
+pthread_spinlock_t lock;
+int res;
+res = pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE);
+                       ]])],
+      [_efl_have_pthread_spinlock="yes"],
+      [_efl_have_pthread_spinlock="no"])
+   CFLAGS=${SAVE_CFLAGS}
+   LDFLAGS=${SAVE_LDFLAGS}
+
+fi
+
+AC_MSG_CHECKING([whether to build POSIX threads spinlock code])
+AC_MSG_RESULT([${_efl_have_pthread_spinlock}])
+if test "x${_efl_enable_pthread}" = "xyes" && test "x${_efl_have_pthread_spinlock}" = "xno" && test "x$1" = "xyes" ; then
+   AC_MSG_WARN([pthread support requested but spinlocks are not supported])
+fi
+
+if test "x${_efl_have_pthread_spinlock}" = "xyes" ; then
+   AC_DEFINE(EFL_HAVE_PTHREAD_SPINLOCK, 1, [Define to mention that POSIX threads spinlocks are supported])
+fi
+
+AS_IF([test "x$_efl_have_pthread" = "xyes"], [$2], [$3])
+AS_IF([test "x$_efl_have_pthread_spinlock" = "xyes"], [$4], [$5])
+
+])
diff --git a/m4/evas_check_engine.m4 b/m4/evas_check_engine.m4
new file mode 100644 (file)
index 0000000..0454951
--- /dev/null
@@ -0,0 +1,816 @@
+
+dnl use: EVAS_CHECK_ENGINE_DEP_BUFFER(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_BUFFER],
+[
+
+have_dep="yes"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_SOFTWARE_XLIB(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_SOFTWARE_XLIB],
+[
+
+have_dep="no"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+AC_PATH_X
+AC_PATH_XTRA
+
+AC_CHECK_HEADER([X11/X.h], [have_dep="yes"])
+
+if test "x${have_dep}" = "xyes" ; then
+   AC_CHECK_LIB([X11], [XCreateImage], [have_dep="yes"], [have_dep="no"])
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+   AC_CHECK_LIB([Xext], [XShmCreateImage], [have_dep="yes"], [have_dep="no"])
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+   if test "x$2" = "xyes" ; then
+      x_libs="${x_libs} -lX11 -lXext"
+   else
+      x_dir=${x_dir:-/usr/X11R6}
+      x_cflags=${x_cflags:--I${x_includes:-$x_dir/include}}
+      x_libs="${x_libs:--L${x_libraries:-$x_dir/lib}} -lX11 -lXext"
+   fi
+   evas_engine_[]$1[]_cflags="${x_cflags}"
+   evas_engine_[]$1[]_libs="${x_libs}"
+fi
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_XRENDER_X11(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_XRENDER_X11],
+[
+
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+AC_PATH_X
+AC_PATH_XTRA
+
+AC_CHECK_HEADERS([X11/X.h X11/extensions/Xrender.h],
+   [have_dep="yes"],
+   [have_dep="no"])
+
+if test "x${have_dep}" = "xyes" ; then
+   AC_CHECK_LIB([X11], [XCreateImage], [have_dep="yes"], [have_dep="no"])
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+   AC_CHECK_LIB([Xext], [XShmCreateImage], [have_dep="yes"], [have_dep="no"])
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+   AC_CHECK_LIB([Xrender], [XRenderCreatePicture], [have_dep="yes"], [have_dep="no"])
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+   if test "x$2" = "xyes" ; then
+      x_libs="${x_libs} -lX11 -lXext"
+   else
+      x_dir=${x_dir:-/usr/X11R6}
+      x_cflags=${x_cflags:--I${x_includes:-$x_dir/include}}
+      x_libs="${x_libs:--L${x_libraries:-$x_dir/lib}} -lX11 -lXext"
+   fi
+   evas_engine_[]$1[]_cflags="${x_cflags}"
+   evas_engine_[]$1[]_libs="${x_libs} -lXrender"
+fi
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_GL_X11(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_GL_X11],
+[
+
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+AC_PATH_X
+AC_PATH_XTRA
+
+AC_CHECK_HEADERS([GL/gl.h GL/glx.h X11/X.h],
+   [have_dep="yes"],
+   [have_dep="no"])
+
+if test "x${have_dep}" = "xyes" ; then
+   AC_CHECK_LIB([X11], [XCreateColormap], [have_dep="yes"], [have_dep="no"])
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+   AC_CHECK_LIB([GL], [glXCreateContext], [have_dep="yes"], [have_dep="no"])
+fi
+
+if test "x$gl_flavor_gles" = "xyes" ; then
+  have_dep=no
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+   if test "x$2" = "xyes" ; then
+      x_libs="${x_libs} -lX11 -lXext -lXrender"
+   else
+      x_dir=${x_dir:-/usr/X11R6}
+      x_cflags=${x_cflags:--I${x_includes:-$x_dir/include}}
+      x_libs="${x_libs:--L${x_libraries:-$x_dir/lib}} -lX11 -lXext -lXrender"
+   fi
+   evas_engine_[]$1[]_cflags="-I/usr/include ${x_cflags}"
+   evas_engine_[]$1[]_libs="${x_libs} -lGL -lpthread"
+   evas_engine_gl_common_libs="-lGL -lpthread"
+else
+   if test "x$2" = "xyes" ; then
+      x_libs="${x_libs} -lX11 -lXext -lXrender"
+   else
+      x_dir=${x_dir:-/usr/X11R6}
+      x_cflags=${x_cflags:--I${x_includes:-$x_dir/include}}
+      x_libs="${x_libs:--L${x_libraries:-$x_dir/lib}} -lX11 -lXext -lXrender"
+   fi
+   AC_CHECK_HEADERS([EGL/egl.h X11/X.h X11/Xlib.h X11/extensions/Xrender.h], [have_egl="yes"])
+   if test "x${have_egl}" = "xyes" ; then
+      AC_CHECK_LIB(GLESv2, glTexImage2D, [have_glesv2="yes"], , -lEGL ${x_libs} -lpthread -lm)
+      if test "x${have_glesv2}" = "xyes" ; then
+         evas_engine_[]$1[]_cflags="${x_cflags}"
+         evas_engine_[]$1[]_libs="${x_libs} -lGLESv2 -lpthread -lm -lEGL"
+         evas_engine_gl_common_libs="-lGLESv2 -lpthread -lm"
+         have_dep="yes"
+      fi
+   fi
+fi
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_CAIRO_X11(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_CAIRO_X11],
+[
+
+requirement=""
+have_dep="no"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+AC_PATH_X
+AC_PATH_XTRA
+
+AC_CHECK_HEADER([X11/X.h],
+   [PKG_CHECK_MODULES([CAIRO],
+       [cairo >= 1.0.0],
+       [have_dep="yes" requirement="cairo"]
+    )]
+)
+
+if test "x${have_dep}" = "xyes" ; then
+   if test "x$2" = "xyes" ; then
+      x_libs="${x_libs} -lX11 -lXext"
+   else
+      x_dir=${x_dir:-/usr/X11R6}
+      x_cflags=${x_cflags:--I${x_includes:-$x_dir/include}}
+      x_libs="${x_libs:--L${x_libraries:-$x_dir/lib}} -lX11 -lXext"
+   fi
+   evas_engine_[]$1[]_cflags="${CAIRO_CFLAGS} ${x_cflags}"
+   evas_engine_[]$1[]_libs="${CAIRO_LIBS} ${x_libs}"
+fi
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x$3" = "xstatic" ; then
+   requirement_evas="${requirement} ${requirement_evas}"
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_SOFTWARE_XCB(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_SOFTWARE_XCB],
+[
+
+requirement=""
+have_dep="no"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+PKG_CHECK_MODULES([XCB],
+   [xcb xcb-shm xcb-image >= 0.2.1 pixman-1],
+   [
+    have_dep="yes"
+    requirement="xcb xcb-shm xcb-image pixman-1"
+    evas_engine_[]$1[]_cflags="${XCB_CFLAGS}"
+    evas_engine_[]$1[]_libs="${XCB_LIBS}"
+   ]
+)
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x$3" = "xstatic" ; then
+   requirement_evas="${requirement} ${requirement_evas}"
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_XRENDER_XCB(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_XRENDER_XCB],
+[
+
+requirement=""
+have_dep="no"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+PKG_CHECK_MODULES([XCBRENDER],
+   [xcb xcb-shm xcb-render xcb-image >= 0.2.1 pixman-1],
+   [
+    have_dep="yes"
+    requirement="xcb xcb-shm xcb-render xcb-image pixman-1"
+    evas_engine_[]$1[]_cflags="${XCBRENDER_CFLAGS}"
+    evas_engine_[]$1[]_libs="${XCBRENDER_LIBS}"
+   ]
+)
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x$3" = "xstatic" ; then
+   requirement_evas="${requirement} ${requirement_evas}"
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_SOFTWARE_GDI(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_SOFTWARE_GDI],
+[
+
+have_dep="no"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+AC_CHECK_HEADER([windows.h],
+   [
+    have_dep="yes"
+    evas_engine_[]$1[]_libs="-lgdi32"
+   ]
+)
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_SOFTWARE_DDRAW(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_SOFTWARE_DDRAW],
+[
+
+have_dep="no"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+AC_CHECK_HEADER([ddraw.h],
+   [
+    have_dep="yes"
+    evas_engine_[]$1[]_libs="-lddraw"
+   ]
+)
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_DIRECT3D(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_DIRECT3D],
+[
+
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+AC_CHECK_HEADERS([d3d9.h d3dx9.h],
+   [
+    have_dep="yes"
+    evas_engine_[]$1[]_libs="-ld3d9 -ld3dx9 -lgdi32"
+   ],
+   [have_dep="no"]
+)
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_QUARTZ(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_QUARTZ],
+[
+
+have_dep="no"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+AC_REQUIRE([EVAS_MAYBE_GET_OBJCPP])
+
+AS_IF([test "x${rw_cv_prog_objc_works}" = "xyes"],
+[
+   AC_LANG_PUSH([Objective C]) 
+   AC_CHECK_HEADERS([/System/Library/Frameworks/Cocoa.framework/Headers/Cocoa.h],
+      [
+       have_dep="yes"
+       evas_engine_[]$1[]_libs="-framework Cocoa"
+      ],
+      [have_dep="no"])
+   AC_LANG_POP([Objective C]) 
+
+])
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl Helper macro for EVAS_CHECK_ENGINE_DEP_QUARTZ
+
+AC_DEFUN([EVAS_MAYBE_GET_OBJCPP],
+[AS_IF([test "x${rw_cv_prog_objc_works}" = "xyes"],
+       [AC_PROG_OBJCPP])
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_GL_GLEW(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_GL_GLEW],
+[
+
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+AC_CHECK_HEADERS([GL/gl.h GL/glew.h],
+   [
+    have_dep="yes"
+    evas_engine_[]$1[]_libs="-lglew32 -lopengl32 -lgdi32"
+   ],
+   [have_dep="no"]
+)
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_SOFTWARE_SDL(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_SOFTWARE_SDL],
+[
+
+requirement=""
+have_dep="no"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+PKG_CHECK_MODULES([SDL],
+   [sdl >= 1.2.0],
+   [
+    have_dep="yes"
+    requirement="sdl"
+    evas_engine_[]$1[]_cflags="${SDL_CFLAGS}"
+    evas_engine_[]$1[]_libs="${SDL_LIBS}"
+   ]
+)
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x$3" = "xstatic" ; then
+   requirement_evas="${requirement} ${requirement_evas}"
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_GL_SDL(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_GL_SDL],
+[
+
+requirement=""
+have_dep="no"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+PKG_CHECK_MODULES([SDL],
+   [sdl >= 1.2.0],
+   [
+    have_dep="yes"
+    requirement="sdl"
+    evas_engine_[]$1[]_cflags="${SDL_CFLAGS}"
+    evas_engine_[]$1[]_libs="${SDL_LIBS}"
+   ]
+)
+
+AC_CHECK_HEADERS([GL/gl.h],
+   [have_dep="yes"],
+   [have_dep="no"])
+
+if test "x$gl_flavor_gles" = "xyes" ; then
+  have_dep=no
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+   evas_engine_[]$1[]_cflags="${SDL_CFLAGS}"
+   evas_engine_[]$1[]_libs="${SDL_LIBS} -lGL -lpthread"
+   evas_engine_gl_common_libs="-lGL -lpthread"
+else
+   AC_CHECK_HEADERS([SDL/SDL_opengles.h EGL/egl.h], [have_egl="yes"])
+   if test "x${have_egl}" = "xyes" ; then
+      AC_CHECK_LIB(GLESv2, glTexImage2D, [have_glesv2="yes"], , -lEGL -lpthread -lm)
+      if test "x${have_glesv2}" = "xyes" ; then
+         evas_engine_[]$1[]_cflags="${SDL_CFLAGS}"
+         evas_engine_[]$1[]_libs="${SDL_LIBS} -lGLESv2 -lpthread -lm -lEGL"
+         evas_engine_gl_common_libs="-lGLESv2 -lpthread -lm"
+         have_dep="yes"
+      fi
+   fi
+fi
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x$3" = "xstatic" ; then
+   requirement_evas="${requirement} ${requirement_evas}"
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_FB(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_FB],
+[
+
+have_dep="no"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+AC_CHECK_HEADER([linux/fb.h], [have_dep="yes"])
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_DIRECTFB(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_DIRECTFB],
+[
+
+requirement=""
+have_dep="no"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+PKG_CHECK_MODULES([DIRECTFB],
+   [directfb >= 0.9.16],
+   [
+    have_dep="yes"
+    requirement="directfb"
+    evas_engine_[]$1[]_cflags="${DIRECTFB_CFLAGS}"
+    evas_engine_[]$1[]_libs="${DIRECTFB_LIBS}"
+   ]
+)
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x$3" = "xstatic" ; then
+   requirement_evas="${requirement} ${requirement_evas}"
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_SOFTWARE_QTOPIA(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_SOFTWARE_QTOPIA],
+[
+
+have_dep="no"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+evas_engine_[]$1[]_moc=""
+
+AC_ARG_WITH([qtdir],
+   [AC_HELP_STRING([--with-qtdir=QT_DIR], [use qt directory specified])],
+   [
+    qt_dir=$withval;
+    echo "using "$qt_dir" for qt directory.";
+   ],
+   [qt_dir="/opt/Qtopia"]
+)
+
+AC_LANG_PUSH(C++)
+
+AC_CHECK_HEADER([qdirectpainter_qws.h],
+   [have_dep="yes"],
+   [have_dep="no"],
+   [
+#include <qwidget.h>
+#include <qnamespace.h>
+#include <qbrush.h>
+#include <qpainter.h>
+   ]
+)
+
+AC_LANG_POP(C++)
+
+if test "x${have_dep}" = "xyes" ; then
+   evas_engine_[]$1[]_cflags="-fno-exceptions -fno-rtti -I${qt_dir}/include"
+   evas_engine_[]$1[]_libs="-L${qt_dir}/lib -lqte -lqpe"
+   evas_engine_[]$1[]_moc="${qt_dir}/bin/moc"
+fi
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+AC_SUBST([evas_engine_$1_moc])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_SOFTWARE_16_X11(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_SOFTWARE_16_X11],
+[
+
+have_dep="no"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+AC_PATH_X
+AC_PATH_XTRA
+
+AC_CHECK_HEADER([X11/X.h], [have_dep="yes"])
+
+if test "x${have_dep}" = "xyes" ; then
+   AC_CHECK_LIB([X11], [XCreateImage], [have_dep="yes"], [have_dep="no"])
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+   AC_CHECK_LIB([Xext], [XShmCreateImage], [have_dep="yes"], [have_dep="no"])
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+   if test "x$2" = "xyes" ; then
+      x_libs="${x_libs} -lX11 -lXext"
+   else
+      x_dir=${x_dir:-/usr/X11R6}
+      x_cflags=${x_cflags:--I${x_includes:-$x_dir/include}}
+      x_libs="${x_libs:--L${x_libraries:-$x_dir/lib}} -lX11 -lXext"
+   fi
+   evas_engine_[]$1[]_cflags="${x_cflags}"
+   evas_engine_[]$1[]_libs="${x_libs}"
+fi
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_SOFTWARE_16_DDRAW(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_SOFTWARE_16_DDRAW],
+[
+
+have_dep="no"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+AC_CHECK_HEADER([ddraw.h],
+   [
+    have_dep="yes"
+    evas_engine_[]$1[]_libs="-lddraw -lgdi32"
+   ]
+)
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE_DEP_SOFTWARE_16_WINCE(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_SOFTWARE_16_WINCE],
+[
+
+have_dep="yes"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$4], [:])
+else
+  m4_default([$5], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_ENGINE(engine, want_engine, simple, description)
+
+
+AC_DEFUN([EVAS_CHECK_ENGINE],
+[
+
+m4_pushdef([UP], m4_translit([$1], [-a-z], [_A-Z]))dnl
+m4_pushdef([DOWN], m4_translit([$1], [-A-Z], [_a-z]))dnl
+
+want_engine="$2"
+want_static_engine="no"
+have_engine="no"
+have_evas_engine_[]DOWN="no"
+
+AC_ARG_ENABLE([$1],
+   [AC_HELP_STRING([--enable-$1], [enable $4 rendering backend])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       want_engine="yes"
+    else
+       if test "x${enableval}" = "xstatic" ; then
+          want_engine="static"
+       else
+          want_engine="no"
+       fi
+    fi
+   ])
+
+AC_MSG_CHECKING([whether to enable $4 rendering backend])
+AC_MSG_RESULT([${want_engine}])
+
+if test "x${want_engine}" = "xyes" -o "x${want_engine}" = "xstatic" -o "x${want_engine}" = "xauto" ; then
+   m4_default([EVAS_CHECK_ENGINE_DEP_]m4_defn([UP]))(DOWN, $3, ${want_engine}, [have_engine="yes"], [have_engine="no"])
+fi
+
+if test "x${have_engine}" = "xno" -a "x${want_engine}" = "xyes" -a "x${use_strict}" = "xyes" ; then
+   AC_MSG_ERROR([$4 dependencies not found (strict dependencies checking)])
+fi
+
+AC_MSG_CHECKING([whether $4 rendering backend will be built])
+AC_MSG_RESULT([${have_engine}])
+
+if test "x${have_engine}" = "xyes" ; then
+   if test "x${want_engine}" = "xstatic" ; then
+      have_evas_engine_[]DOWN="static"
+      want_static_engine="yes"
+   else
+      have_evas_engine_[]DOWN="yes"
+   fi
+fi
+
+if test "x${have_engine}" = "xyes" ; then
+   AC_DEFINE(BUILD_ENGINE_[]UP, [1], [$4 rendering backend])
+fi
+
+AM_CONDITIONAL(BUILD_ENGINE_[]UP, [test "x${have_engine}" = "xyes"])
+
+if test "x${want_static_engine}" = "xyes" ; then
+   AC_DEFINE(EVAS_STATIC_BUILD_[]UP, [1], [Build $1 engine inside libevas])
+   have_static_module="yes"
+fi
+
+AM_CONDITIONAL(EVAS_STATIC_BUILD_[]UP, [test "x${want_static_engine}" = "xyes"])
+
+m4_popdef([UP])
+m4_popdef([DOWN])
+
+])
diff --git a/m4/evas_check_loader.m4 b/m4/evas_check_loader.m4
new file mode 100644 (file)
index 0000000..7b95465
--- /dev/null
@@ -0,0 +1,417 @@
+dnl use: EVAS_CHECK_LOADER_DEP_EDB(loader, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_LOADER_DEP_EDB],
+[
+
+requirement=""
+have_dep="no"
+evas_image_loader_[]$1[]_cflags=""
+evas_image_loader_[]$1[]_libs=""
+
+PKG_CHECK_MODULES([EDB], [edb], [have_dep="yes" requirement="edb"], [have_dep="no"])
+evas_image_loader_[]$1[]_cflags="${EDB_CFLAGS}"
+evas_image_loader_[]$1[]_libs="${EDB_LIBS}"
+
+AC_SUBST([evas_image_loader_$1_cflags])
+AC_SUBST([evas_image_loader_$1_libs])
+
+if test "x$2" = "xstatic" ; then
+   requirement_evas="${requirement} ${requirement_evas}"
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$3], [:])
+else
+  m4_default([$4], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_LOADER_DEP_EET(loader, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_LOADER_DEP_EET],
+[
+
+requirement=""
+have_dep="no"
+evas_image_loader_[]$1[]_cflags=""
+evas_image_loader_[]$1[]_libs=""
+
+PKG_CHECK_MODULES([EET], [eet >= 1.0.1], [have_dep="yes" requirement="eet"], [have_dep="no"])
+evas_image_loader_[]$1[]_cflags="${EET_CFLAGS}"
+evas_image_loader_[]$1[]_libs="${EET_LIBS}"
+
+AC_SUBST([evas_image_loader_$1_cflags])
+AC_SUBST([evas_image_loader_$1_libs])
+
+if test "x$2" = "xstatic" ; then
+   requirement_evas="${requirement} ${requirement_evas}"
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$3], [:])
+else
+  m4_default([$4], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_LOADER_DEP_GIF(loader, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_LOADER_DEP_GIF],
+[
+
+have_dep="no"
+evas_image_loader_[]$1[]_cflags=""
+evas_image_loader_[]$1[]_libs=""
+
+AC_CHECK_HEADER([gif_lib.h], [have_dep="yes"])
+
+if test "x${have_dep}"  = "xyes" ; then
+   AC_CHECK_LIB([gif],
+      [DGifOpenFileName],
+      [
+       evas_image_loader_[]$1[]_libs="-lgif"
+      ],
+      [have_dep="no"]
+   )
+
+   if test "x${have_dep}"  = "xno" ; then
+      AC_CHECK_LIB([ungif],
+         [DGifOpenFileName],
+         [
+          have_dep="yes"
+          evas_image_loader_[]$1[]_libs="-lungif"
+         ]
+      )
+   fi
+fi
+
+AC_SUBST([evas_image_loader_$1_cflags])
+AC_SUBST([evas_image_loader_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$3], [:])
+else
+  m4_default([$4], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_LOADER_DEP_JPEG(loader, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_LOADER_DEP_JPEG],
+[
+
+have_dep="no"
+evas_image_loader_[]$1[]_cflags=""
+evas_image_loader_[]$1[]_libs=""
+
+AC_CHECK_HEADER([jpeglib.h], [have_dep="yes"])
+
+if test "x${have_dep}"  = "xyes" ; then
+   AC_CHECK_LIB([jpeg],
+      [jpeg_CreateDecompress],
+      [
+        evas_image_loader_[]$1[]_libs="-ljpeg"
+        AC_COMPILE_IFELSE([[
+                          #include <stdio.h>
+                          #include <jpeglib.h>
+                          #include <setjmp.h>
+                          int main(int argc, char **argv) {
+                          struct jpeg_decompress_struct decomp;
+                          decomp.region_x = 0;
+                          }
+                        ]],
+                        [have_jpeg_region="yes"],
+                        [have_jpeg_region="no"])
+      ],
+      [have_dep="no"]
+   )
+   if test "x${have_jpeg_region}" = "xyes" ; then
+     AC_DEFINE(BUILD_LOADER_JPEG_REGION, [1], [JPEG Region Decode Support])
+   fi
+fi
+
+AC_SUBST([evas_image_loader_$1_cflags])
+AC_SUBST([evas_image_loader_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$3], [:])
+else
+  m4_default([$4], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_LOADER_DEP_PMAPS(loader, want_static[[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_LOADER_DEP_PMAPS],
+[
+
+have_dep="yes"
+evas_image_loader_[]$1[]_cflags=""
+evas_image_loader_[]$1[]_libs=""
+
+AC_SUBST([evas_image_loader_$1_cflags])
+AC_SUBST([evas_image_loader_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$3], [:])
+else
+  m4_default([$4], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_LOADER_DEP_PNG(loader, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_LOADER_DEP_PNG],
+[
+
+requirement=""
+have_dep="no"
+evas_image_loader_[]$1[]_cflags=""
+evas_image_loader_[]$1[]_libs=""
+
+PKG_CHECK_EXISTS([libpng14], [PKG_CHECK_MODULES([PNG], [libpng14], [have_dep="yes" requirement="libpng14"], [have_dep="no"])],
+  [PKG_CHECK_EXISTS([libpng12], [PKG_CHECK_MODULES([PNG], [libpng12], [have_dep="yes" requirement="libpng12"], [have_dep="no"])],
+    [PKG_CHECK_EXISTS([libpng10], [PKG_CHECK_MODULES([PNG], [libpng10], [have_dep="yes" requirement="libpng10"], [have_dep="no"])],
+      [PKG_CHECK_MODULES([PNG], [libpng], [have_dep="yes" requirement="libpng"], [have_dep="no"])
+    ])
+  ])
+])
+
+evas_image_loader_[]$1[]_cflags="${PNG_CFLAGS}"
+evas_image_loader_[]$1[]_libs="${PNG_LIBS}"
+
+AC_SUBST([evas_image_loader_$1_cflags])
+AC_SUBST([evas_image_loader_$1_libs])
+
+if test "x$2" = "xstatic" ; then
+   requirement_evas="${requirement} ${requirement_evas}"
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$3], [:])
+else
+  m4_default([$4], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_LOADER_DEP_SVG(loader, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_LOADER_DEP_SVG],
+[
+
+requirement=""
+have_dep="no"
+evas_image_loader_[]$1[]_cflags=""
+evas_image_loader_[]$1[]_libs=""
+
+PKG_CHECK_MODULES([SVG], [librsvg-2.0 >= 2.14.0],
+   [have_dep="yes" requirement="librsvg-2.0"],
+   [have_svg="no"]
+)
+
+if test "x${have_dep}" = "xyes" ; then
+   evas_image_loader_[]$1[]_cflags="${SVG_CFLAGS}"
+   evas_image_loader_[]$1[]_libs="${SVG_LIBS}"
+fi
+
+AC_SUBST([evas_image_loader_$1_cflags])
+AC_SUBST([evas_image_loader_$1_libs])
+
+if test "x$2" = "xstatic" ; then
+   requirement_evas="${requirement} ${requirement_evas}"
+fi
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$3], [:])
+else
+  m4_default([$4], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_LOADER_DEP_TIFF(loader, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_LOADER_DEP_TIFF],
+[
+
+have_dep="no"
+evas_image_loader_[]$1[]_cflags=""
+evas_image_loader_[]$1[]_libs=""
+
+AC_CHECK_HEADER([tiffio.h], [have_dep="yes"])
+
+if test "x${have_dep}"  = "xyes" ; then
+   AC_CHECK_LIB([tiff],
+      [TIFFReadScanline],
+      [
+       evas_image_loader_[]$1[]_libs="-ltiff"
+      ],
+      [have_dep="no"]
+   )
+
+   if test "x${have_dep}"  = "xno" ; then
+      AC_CHECK_LIB([tiff],
+         [TIFFReadScanline],
+         [
+          have_dep="yes"
+          evas_image_loader_[]$1[]_libs="-ltiff -ljpeg -lz -lm"
+         ]
+      )
+   fi
+
+   if test "x${have_dep}"  = "xno" ; then
+      AC_CHECK_LIB([tiff34],
+         [TIFFReadScanline],
+         [
+          have_dep="yes"
+          evas_image_loader_[]$1[]_libs="-ltiff34 -ljpeg -lz -lm"
+         ]
+      )
+   fi
+fi
+
+AC_SUBST([evas_image_loader_$1_cflags])
+AC_SUBST([evas_image_loader_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$3], [:])
+else
+  m4_default([$4], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_LOADER_DEP_XPM(loader, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_LOADER_DEP_XPM],
+[
+
+have_dep="yes"
+evas_image_loader_[]$1[]_cflags=""
+evas_image_loader_[]$1[]_libs=""
+
+AC_SUBST([evas_image_loader_$1_cflags])
+AC_SUBST([evas_image_loader_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$3], [:])
+else
+  m4_default([$4], [:])
+fi
+
+])
+
+dnl use: EVAS_CHECK_IMAGE_LOADER(loader, want_loader, macro)
+
+
+AC_DEFUN([EVAS_CHECK_IMAGE_LOADER],
+[
+
+m4_pushdef([UP], m4_toupper([$1]))
+m4_pushdef([DOWN], m4_tolower([$1]))
+
+want_loader="$2"
+want_static_loader="no"
+have_loader="no"
+have_evas_image_loader_[]DOWN="no"
+
+AC_ARG_ENABLE([image-loader-[]DOWN],
+   [AC_HELP_STRING([--enable-image-loader-[]DOWN], [enable $1 image loader])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       want_loader="yes"
+    else
+       if test "x${enableval}" = "xstatic" ; then
+          want_loader="static"
+       else
+          want_loader="no"
+       fi
+    fi
+   ]
+)
+
+AC_MSG_CHECKING([whether to enable $1 image loader])
+AC_MSG_RESULT([${want_loader}])
+
+if test "x${want_loader}" = "xyes" -o "x${want_loader}" = "xstatic" -o "x${want_loader}" = "xauto"; then
+   m4_default([EVAS_CHECK_LOADER_DEP_]m4_defn([UP]))(DOWN, ${want_loader}, [have_loader="yes"], [have_loader="no"])
+fi
+
+if test "x${have_loader}" = "xno" -a "x${want_loader}" = "xyes" -a "x${use_strict}" = "xyes" ; then
+   AC_MSG_ERROR([$1 dependencies not found (strict dependencies checking)])
+fi
+
+AC_MSG_CHECKING([whether $1 image loader will be built])
+AC_MSG_RESULT([${have_loader}])
+
+if test "x${have_loader}" = "xyes" ; then
+   if test "x${want_loader}" = "xstatic" ; then
+      have_evas_image_loader_[]DOWN="static"
+      want_static_loader="yes"
+   else
+      have_evas_image_loader_[]DOWN="yes"
+   fi
+fi
+
+if test "x${have_loader}" = "xyes" ; then
+   AC_DEFINE(BUILD_LOADER_[]UP, [1], [UP Image Loader Support])
+fi
+
+AM_CONDITIONAL(BUILD_LOADER_[]UP, [test "x${have_loader}" = "xyes"])
+
+if test "x${want_static_loader}" = "xyes" ; then
+   AC_DEFINE(EVAS_STATIC_BUILD_[]UP, [1], [Build $1 image loader inside libevas])
+   have_static_module="yes"
+fi
+
+AM_CONDITIONAL(EVAS_STATIC_BUILD_[]UP, [test "x${want_static_loader}" = "xyes"])
+
+m4_popdef([UP])
+m4_popdef([DOWN])
+
+])
+
+dnl use: EVAS_CHECK_FONT_LOADER(want)
+
+
+AC_DEFUN([EVAS_CHECK_FONT_LOADER],
+[
+
+pushdef([UP], translit([$1], [a-z], [A-Z]))dnl
+pushdef([DOWN], translit([$1], [A-Z], [a-z]))dnl
+
+want_loader="$1"
+have_evas_font_loader_eet="no"
+
+AC_ARG_ENABLE([font-loader-eet],
+   [AC_HELP_STRING([--disable-font-loader-eet],
+       [disable EET font loader. [[default=enabled]]])],
+   [want_loader=${enableval}]
+)
+
+AC_MSG_CHECKING([whether to enable Eet font loader])
+AC_MSG_RESULT([${want_loader}])
+
+if test "x$want_loader" = "xyes" -o "x$want_loader" = "xauto"; then
+    PKG_CHECK_MODULES([EET], [eet >= 1.0.1], [have_evas_font_loader_eet="yes"], [have_evas_font_loader_eet="no"])
+fi
+
+if test "x${have_evas_font_loader_eet}" = "xno" -a "x$want_loader" = "xyes" -a "x$use_strict" = "xyes" ; then
+   AC_MSG_ERROR([Eet dependencies not found (strict dependencies checking)])
+fi
+
+if test "x$have_evas_font_loader_eet" = "xyes" ; then
+   AC_DEFINE([BUILD_FONT_LOADER_EET], [1], [EET Font Loader Support])
+   requirement_evas="eet ${requirement_evas}"
+fi
+
+popdef([UP])
+popdef([DOWN])
+
+])
diff --git a/m4/evas_converter.m4 b/m4/evas_converter.m4
new file mode 100644 (file)
index 0000000..4a5a390
--- /dev/null
@@ -0,0 +1,83 @@
+dnl use: EVAS_CONVERT_COLOR(bpp, colorspace, components[, default-enabled])
+AC_DEFUN([EVAS_CONVERT_COLOR],
+[
+pushdef([UP], translit([$1_$2_$3], [a-z], [A-Z]))dnl
+pushdef([DOWN_D], translit([$1-$2-$3], [A-Z], [a-z]))dnl
+pushdef([DOWN_U], translit([$1_$2_$3], [A-Z], [a-z]))dnl
+
+conv_[]DOWN_U="no"
+
+ifelse("x$4", "xno",
+[
+  AC_ARG_ENABLE(convert-[]DOWN_D,
+    AC_HELP_STRING(
+      [--enable-convert-[]DOWN_D],
+      [enable the $1bpp $2 $3 converter code]
+    ),
+    [ conv_[]DOWN_U=$enableval ],
+    [ conv_[]DOWN_U=no ]
+  )
+], [
+  AC_ARG_ENABLE(convert-[]DOWN_D,
+    AC_HELP_STRING(
+      [--disable-convert-[]DOWN_D],
+      [disable the $1bpp $2 $3 converter code]
+    ),
+    [ conv_[]DOWN_U=$enableval ],
+    [ conv_[]DOWN_U=yes ]
+  )
+])
+
+AC_MSG_CHECKING(whether to build $1bpp $2 $3 converter code)
+AC_MSG_RESULT($conv_[]DOWN_U)
+
+if test "x$conv_[]DOWN_U" = "xyes" ; then
+  AC_DEFINE(BUILD_CONVERT_[]UP, 1, [$1bpp $2 $3 Converter Support])
+fi
+
+popdef([UP])
+popdef([DOWN_D])
+popdef([DOWN_U])
+])
+
+dnl use: EVAS_CONVERT_ROT(bpp, colorspace, rot[, default-enabled])
+AC_DEFUN([EVAS_CONVERT_ROT],
+[
+pushdef([UP], translit([$1_$2_ROT$3], [a-z], [A-Z]))dnl
+pushdef([DOWN_D], translit([$1-$2-rot-$3], [A-Z], [a-z]))dnl
+pushdef([DOWN_U], translit([$1_$2_rot_$3], [A-Z], [a-z]))dnl
+
+conv_[]DOWN_U="no"
+
+ifelse("x$4", "xno",
+[
+  AC_ARG_ENABLE(convert-[]DOWN_D,
+    AC_HELP_STRING(
+      [--enable-convert-[]DOWN_D],
+      [enable the $1bpp $2 rotation $3 converter code]
+    ),
+    [ conv_[]DOWN_U=$enableval ],
+    [ conv_[]DOWN_U=no ]
+  )
+], [
+  AC_ARG_ENABLE(convert-[]DOWN_D,
+    AC_HELP_STRING(
+      [--disable-convert-[]DOWN_D],
+      [disable the $1bpp $2 rotation $3 converter code]
+    ),
+    [ conv_[]DOWN_U=$enableval ],
+    [ conv_[]DOWN_U=yes ]
+  )
+])
+
+AC_MSG_CHECKING(whether to build $1bpp $2 rotation $3 converter code)
+AC_MSG_RESULT($conv_[]DOWN_U)
+
+if test "x$conv_[]DOWN_U" = "xyes" ; then
+  AC_DEFINE(BUILD_CONVERT_[]UP, 1, [$1bpp $2 Rotation $3 Converter Support])
+fi
+
+popdef([UP])
+popdef([DOWN_D])
+popdef([DOWN_U])
+])
diff --git a/m4/evas_dither.m4 b/m4/evas_dither.m4
new file mode 100644 (file)
index 0000000..f8dcca3
--- /dev/null
@@ -0,0 +1,44 @@
+dnl Copyright (C) 2009 Vincent Torri <vtorri at univ-evry dot fr>
+dnl That code is public domain and can be freely used or copied.
+
+dnl Macro that enables dithering support is wanted.
+
+dnl Usage: EVAS_CHECK_DITHER(dither, description [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl The parameter 'dither' is the type of dithering.
+dnl The parameter 'description' is the description of the dithering.
+dnl Defines BUILD_[TYPEOFDITHERING]
+
+AC_DEFUN([EVAS_CHECK_DITHER],
+[
+m4_pushdef([UP], m4_translit([$1], [-a-z], [_A-Z]))dnl
+m4_pushdef([DOWN], m4_translit([$1], [-A-Z], [_a-z]))dnl
+
+AC_ARG_ENABLE([$1],
+   AC_HELP_STRING([--enable-$1], [enable $2 @<:@default=disabled@:>@]),
+   [
+    if test "x${enableval}" = "xyes" ; then
+       _efl_enable_dither_option_[]DOWN="yes"
+    else
+       _efl_enable_dither_option_[]DOWN="no"
+    fi
+   ],
+   [_efl_enable_dither_option_[]DOWN="no"])
+
+AC_MSG_CHECKING(whether to build $2)
+AC_MSG_RESULT([${_efl_enable_dither_option_[]DOWN}])
+
+if test "x${_efl_enable_dither_option_[]DOWN}" = "xyes" ; then
+   AC_DEFINE([BUILD_]UP[], [1], [define to 1 if you have the $2 support])
+fi
+
+if test "x${_efl_enable_dither_option_[]DOWN}" = "xyes" ; then
+   m4_default([$3], [:])
+else
+   m4_default([$4], [:])
+fi
+
+m4_popdef([UP])
+m4_popdef([DOWN])
+])
+
+dnl End of evas_dither.m4
diff --git a/m4/evas_scaler.m4 b/m4/evas_scaler.m4
new file mode 100644 (file)
index 0000000..c78dcc6
--- /dev/null
@@ -0,0 +1,44 @@
+dnl Copyright (C) 2009 Vincent Torri <vtorri at univ-evry dot fr>
+dnl That code is public domain and can be freely used or copied.
+
+dnl Macro that enables scaler support is wanted.
+
+dnl Usage: EVAS_CHECK_SCALER(scaler, description [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl The parameter 'scaler' is the type of scaler.
+dnl The parameter 'description' is the description of the scaler.
+dnl Defines BUILD_[TYPEOFSCALER]
+
+AC_DEFUN([EVAS_CHECK_SCALER],
+[
+m4_pushdef([UP], m4_translit([$1], [-a-z], [_A-Z]))dnl
+m4_pushdef([DOWN], m4_translit([$1], [-A-Z], [_a-z]))dnl
+
+AC_ARG_ENABLE([$1],
+   AC_HELP_STRING([--disable-$1], [disable $2 code @<:@default=enabled@:>@]),
+   [
+    if test "x${enableval}" = "xyes" ; then
+       _efl_enable_scaler_option_[]DOWN="yes"
+    else
+       _efl_enable_scaler_option_[]DOWN="no"
+    fi
+   ],
+   [_efl_enable_scaler_option_[]DOWN="yes"])
+
+AC_MSG_CHECKING(whether to build $2)
+AC_MSG_RESULT([${_efl_enable_scaler_option_[]DOWN}])
+
+if test "x${_efl_enable_scaler_option_[]DOWN}" = "xyes" ; then
+   AC_DEFINE([BUILD_]UP[], [1], [define to 1 if you have the $2 support])
+fi
+
+if test "x${_efl_enable_scaler_option_[]DOWN}" = "xyes" ; then
+   m4_default([$3], [:])
+else
+   m4_default([$4], [:])
+fi
+
+m4_popdef([UP])
+m4_popdef([DOWN])
+])
+
+dnl End of evas_scaler.m4
diff --git a/src/.cvsignore b/src/.cvsignore
new file mode 100644 (file)
index 0000000..3dda729
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile.in
+Makefile
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644 (file)
index 0000000..8828c78
--- /dev/null
@@ -0,0 +1,3 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS = lib bin modules examples
diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am
new file mode 100644 (file)
index 0000000..7325c14
--- /dev/null
@@ -0,0 +1,38 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+if EVAS_CSERVE
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/lib/cserve \
+-DPACKAGE_BIN_DIR=\"$(bindir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+@EINA_CFLAGS@ \
+@FREETYPE_CFLAGS@ \
+@FRIBIDI_CFLAGS@ \
+@EET_CFLAGS@ \
+@FONTCONFIG_CFLAGS@ \
+@pthread_cflags@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+bin_PROGRAMS = evas_cserve evas_cserve_tool
+
+evas_cserve_SOURCES = \
+evas_cserve_main.c
+
+evas_cserve_LDADD = \
+$(top_builddir)/src/lib/libevas.la
+
+evas_cserve_tool_LDFLAGS =
+
+evas_cserve_tool_SOURCES = \
+evas_cserve_tool.c
+
+evas_cserve_tool_LDADD = \
+$(top_builddir)/src/lib/libevas.la
+
+endif
diff --git a/src/bin/evas_cserve_main.c b/src/bin/evas_cserve_main.c
new file mode 100644 (file)
index 0000000..4a6745f
--- /dev/null
@@ -0,0 +1,1682 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <signal.h>
+#include <sys/time.h>
+#include <time.h>
+#ifdef _WIN32
+# include <windows.h>
+#endif
+
+#ifdef BUILD_PTHREAD
+#include <pthread.h>
+#endif
+
+#include "Evas.h"
+#include "evas_cs.h"
+
+#define D(...) EINA_LOG_DOM_DBG(_evas_cserve_bin_log_dom, __VA_ARGS__)
+#ifdef ERR
+#undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_cserve_bin_log_dom, __VA_ARGS__)
+#ifdef DBG
+#undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_cserve_bin_log_dom, __VA_ARGS__)
+#ifdef WRN
+#undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_cserve_bin_log_dom, __VA_ARGS__)
+  
+#ifdef CSERVE_BIN_DEFAULT_COLOR
+#undef CSERVE_BIN_DEFAULT_COLOR
+#endif
+#define CSERVE_BIN_DEFAULT_COLOR EINA_COLOR_BLUE
+// fixme:'s
+// 
+// preload - make it work (both)
+
+// 
+// pants!
+
+typedef struct _Img Img;
+typedef struct _Lopt Lopt;
+typedef struct _Load_Inf Load_Inf;
+
+struct _Lopt
+{
+   int    scale_down_by; // if > 1 then use this
+   double dpi; // if > 0.0 use this
+   int    w, h; // if > 0 use this
+   struct {
+      int x, y, w, h;
+   } region;
+};
+
+struct _Img
+{
+   Image_Entry ie;
+   int ref;
+   int dref;
+   int usage;
+   Mem *mem;
+   const char *key;
+   time_t cached;
+   struct {
+      const char *file;
+      const char *key;
+      time_t modtime;
+      time_t last_stat;
+   } file;
+   struct {
+      int load1saved, load2saved;
+      double load1, load2;
+   } stats;
+   Lopt load_opts;
+   struct {
+      int w, h;
+      void *data;
+      Eina_Bool alpha : 1;
+   } image;
+   int incache;
+   LK(lock);
+   Eina_Bool dead : 1;
+   Eina_Bool active : 1;
+   Eina_Bool useless : 1;
+   Eina_Bool killme : 1;
+};
+
+struct _Load_Inf
+{
+   Img *img;
+   Client *c;
+};
+
+// config
+static int stat_res_interval = 2;
+
+static time_t t_now = 0;
+
+static int server_id = 0;
+
+LK(strshr_freeme_lock);
+static int strshr_freeme_count = 0;
+static int strshr_freeme_alloc = 0;
+static const char **strshr_freeme = NULL;
+
+static int cache_cleanme = 0;
+static Evas_Cache_Image *cache = NULL;
+
+static Eina_Hash *active_images = NULL;
+LK(cache_lock);
+static Eina_List *cache_images = NULL;
+static int cache_usage = 0;
+static int cache_max_usage = 1 * 1024;
+static int cache_max_adjust = 0;
+static int cache_item_timeout = -1;
+static int cache_item_timeout_check = -1;
+static Mem *stat_mem = NULL;
+static int _evas_cserve_bin_log_dom = -1;
+static Eina_List *stat_mems = NULL;
+
+static void cache_clean(void);
+
+#ifndef _WIN32
+static double
+get_time(void)
+{
+   struct timeval      timev;
+   
+   gettimeofday(&timev, NULL);
+   return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000);
+}
+#else
+static double
+get_time(void)
+{
+   return (double)GetTickCount()/1000.0;
+}
+#endif
+
+static int mem_total = 0;
+static int mem_free = 0;
+static int mem_buffers = 0;
+static int mem_cached = 0;
+
+static void
+meminfo_check(void)
+{
+   FILE *f;
+   char buf[1024];
+   int v;
+   
+   f = fopen("/proc/meminfo", "r");
+   if (!f) return;
+   if (!fgets(buf, sizeof(buf), f)) goto done;
+   v = 0; if (sscanf(buf, "%*s %i %*s", &v) != 1) goto done;
+   mem_total = v;
+   if (!fgets(buf, sizeof(buf), f)) goto done;
+   v = 0; if (sscanf(buf, "%*s %i %*s", &v) != 1) goto done;
+   mem_free = v;
+   if (!fgets(buf, sizeof(buf), f)) goto done;
+   v = 0; if (sscanf(buf, "%*s %i %*s", &v) != 1) goto done;
+   mem_buffers = v;
+   if (!fgets(buf, sizeof(buf), f)) goto done;
+   v = 0; if (sscanf(buf, "%*s %i %*s", &v) != 1) goto done;
+   mem_cached = v;
+   done:
+   fclose(f);
+}
+
+static int stats_dirty = 0;
+static int saved_loads = 0;
+static double saved_load_time = 0;
+static double saved_load_lifetime = 0;
+
+static int saved_loaddatas = 0;
+static double saved_loaddata_time = 0;
+static double saved_loaddata_lifetime = 0;
+
+static int saved_memory = 0;
+static int saved_memory_peak = 0;
+static int alloced_memory = 0;
+static int alloced_memory_peak = 0;
+static int real_memory = 0;
+static int real_memory_peak = 0;
+
+static Eina_Bool
+stats_hash_image_cb(const Eina_Hash *hash __UNUSED__, 
+                   const void *key __UNUSED__,
+                   void *data, void *fdata __UNUSED__)
+{
+   Img *img = data;
+   
+
+   saved_load_time += img->stats.load1 * img->stats.load1saved;
+   saved_loaddata_time += img->stats.load2 * img->stats.load2saved;
+   if (img->ref > 1)
+     saved_memory += img->image.w * img->image.h * sizeof(DATA32) * (img->ref - 1);
+   if (img->mem)
+     {
+        alloced_memory += img->image.w * img->image.h * sizeof(DATA32);
+        real_memory += (((img->image.w * img->image.h * sizeof(DATA32)) + 4095) >> 12) << 12;
+     }
+   return 1;
+}
+
+static void
+stats_calc(void)
+{
+   Img *img;
+   Eina_List *l;
+   
+   if (!stats_dirty) return;
+   stats_dirty = 0;
+   saved_loads = 0;
+   saved_load_time = 0;
+   saved_loaddatas = 0;
+   saved_loaddata_time = 0;
+   saved_memory = 0;
+   alloced_memory = 0;
+   real_memory = 0;
+   
+   if (active_images)
+     eina_hash_foreach(active_images, stats_hash_image_cb, NULL);
+   LKL(cache_lock);
+   EINA_LIST_FOREACH(cache_images, l, img)
+     {
+        saved_loads += img->stats.load1saved;
+        saved_load_time += img->stats.load1 * img->stats.load1saved;
+        saved_loaddatas += img->stats.load2saved;
+        saved_loaddata_time += img->stats.load2 * img->stats.load2saved;
+        if (img->mem)
+          {
+             alloced_memory += img->image.w * img->image.h * sizeof(DATA32);
+             real_memory += (((img->image.w * img->image.h * sizeof(DATA32)) + 4095) >> 12) << 12;
+          }
+     }
+   LKU(cache_lock);
+   if (saved_memory > saved_memory_peak)
+     saved_memory_peak = saved_memory;
+   if (real_memory > real_memory_peak)
+     real_memory_peak = real_memory;
+   if (alloced_memory > alloced_memory_peak)
+     alloced_memory_peak = alloced_memory;
+}
+
+static void
+stats_update(void)
+{
+   stats_dirty = 1;
+}
+
+static void
+stats_lifetime_update(Img *img)
+{
+   saved_load_lifetime += img->stats.load1 * img->stats.load1saved;
+   saved_loaddata_lifetime += img->stats.load2 * img->stats.load2saved;
+}
+
+static void
+stat_clean(Mem *m)
+{
+   int *ints;
+   int size, pid, *ids, count, i;
+   
+   ints = (int *)m->data;
+   size = ints[0];
+   if (!evas_cserve_mem_resize(m, size)) return;
+   ints = (int *)m->data;
+   pid =  ints[1];
+   count =  (size - (2 * sizeof(int))) / sizeof(int);
+   ids = ints + 2;
+   for (i = 0; i < count; i++)
+     evas_cserve_mem_del(pid, ids[i]);
+}
+
+static int
+stat_init(Mem *m)
+{
+   int *ints;
+
+   ints = (int *)m->data;
+   
+   if (!evas_cserve_mem_resize(m, 2 * sizeof(int))) return 0;
+   ints[0] = 2 * sizeof(int);
+   ints[1] = getpid();
+   msync(m->data, 2 * sizeof(int), MS_SYNC | MS_INVALIDATE);
+   return 1;
+}
+
+static int
+stat_update(Mem *m)
+{
+   Eina_List *l;
+   Mem *m2;
+   int *ints, *ids, i;
+   
+   ints = (int *)m->data;
+   ints[0] = (2 * sizeof(int)) + (eina_list_count(stat_mems) * sizeof(int));
+   if (!evas_cserve_mem_resize(m, ints[0])) return 0;
+   ints = (int *)m->data;
+   ids = ints + 2;
+   i = 0;
+   EINA_LIST_FOREACH(stat_mems, l, m2)
+     {
+        ids[i] = m2->id;
+        i++;
+     }
+   msync(m->data, ints[0], MS_SYNC | MS_INVALIDATE);
+   return 1;
+}
+
+static Image_Entry *
+_img_alloc(void)
+{
+   Img *img;
+   
+   img = calloc(1, sizeof(Img));
+   LKI(img->lock);
+   return (Image_Entry *)img;
+}
+
+static void
+_img_dealloc(Image_Entry *ie)
+{
+   Img *img = (Img *)ie;
+   LKD(img->lock);
+   free(img);
+}
+
+static int
+_img_surface_alloc(Image_Entry *ie, int w, int h)
+{
+   Img *img = (Img *)ie;
+
+   img->mem = evas_cserve_mem_new(w * h * sizeof(DATA32), NULL);
+   if (!img->mem) return -1;
+   img->image.data = img->mem->data + img->mem->offset;
+   
+   stat_mems = eina_list_append(stat_mems, img->mem);
+   stat_update(stat_mem);
+   return 0;
+}
+
+static void
+_img_surface_delete(Image_Entry *ie)
+{
+   Img *img = (Img *)ie;
+
+   if (!img->mem) return;
+   
+   stat_mems = eina_list_remove(stat_mems, img->mem);
+   stat_update(stat_mem);
+   
+   evas_cserve_mem_free(img->mem);
+   img->mem = NULL;
+   img->image.data = NULL;
+}
+
+static DATA32 *
+_img_surface_pixels(Image_Entry *ie)
+{
+   Img *img = (Img *)ie;
+   
+   return img->image.data;
+}
+
+static int
+_img_load(Image_Entry *ie)
+{
+   return evas_common_load_rgba_image_module_from_file(ie);
+}
+
+static void
+_img_unload(Image_Entry *ie)
+{
+}
+
+static void
+_img_dirty_region(Image_Entry *ie, int x, int y, int w, int h)
+{
+}
+
+static int
+_img_dirty(Image_Entry *dst, const Image_Entry *src)
+{
+   return 0;
+}
+
+static int
+_img_size_set(Image_Entry *dst, const Image_Entry *src, int w, int h)
+{
+   return 0;
+}
+
+static int
+_img_copied_data(Image_Entry *ie, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   return 0;
+}
+
+static int
+_img_data(Image_Entry *ie, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   return 0;
+}
+
+static int
+_img_color_space(Image_Entry *ie, int cspace)
+{
+   return 0;
+}
+
+static int
+_img_load_data(Image_Entry *ie)
+{
+   return evas_common_load_rgba_image_data_from_file(ie);
+}
+
+static int
+_img_mem_size_get(Image_Entry *ie)
+{
+   return 1;
+}
+
+static void
+img_init(void)
+{
+   const Evas_Cache_Image_Func cache_funcs = 
+     {
+        _img_alloc,//Image_Entry *(*alloc)(void);
+          _img_dealloc,//void         (*dealloc)(Image_Entry *im);
+        /* The cache provide some helpers for surface manipulation. */
+          _img_surface_alloc,//int          (*surface_alloc)(Image_Entry *im, int w, int h);
+          _img_surface_delete,//void         (*surface_delete)(Image_Entry *im);
+          _img_surface_pixels,//DATA32      *(*surface_pixels)(Image_Entry *im);
+        /* The cache is doing the allocation and deallocation, you must just do the rest. */
+          _img_load,//int          (*constructor)(Image_Entry *im);
+          _img_unload,//void         (*destructor)(Image_Entry *im);
+          _img_dirty_region,//void         (*dirty_region)(Image_Entry *im, int x, int y, int w, int h);
+        /* Only called when references > 0. Need to provide a fresh copie of im. */
+        /* The destination surface does have a surface, but no allocated pixel data. */
+          _img_dirty,//int          (*dirty)(Image_Entry *dst, const Image_Entry *src);
+        /* Only called when references == 1. We will call drop on im'. */
+        /* The destination surface does not have any surface. */
+          _img_size_set,//int          (*size_set)(Image_Entry *dst, const Image_Entry *src, int w, int h);
+        /* The destination surface does not have any surface. */
+          _img_copied_data,//int          (*copied_data)(Image_Entry *dst, int w, int h, DATA32 *image_data, int alpha, int cspace);
+        /* The destination surface does not have any surface. */
+          _img_data,//int          (*data)(Image_Entry *dst, int w, int h, DATA32 *image_data, int alpha, int cspace);
+          _img_color_space,//int          (*color_space)(Image_Entry *dst, int cspace);
+        /* This function need to update im->w and im->h. */
+          _img_load_data,//int          (*load)(Image_Entry *im);
+          _img_mem_size_get,//int          (*mem_size_get)(Image_Entry *im);
+          NULL,//void         (*debug)(const char *context, Image_Entry *im);
+     };
+   
+   active_images = eina_hash_string_superfast_new(NULL);
+   cache = evas_cache_image_init(&cache_funcs);
+   LKI(cache_lock);
+   LKI(strshr_freeme_lock);
+}
+
+static void
+img_shutdown(void)
+{
+   evas_cache_image_shutdown(cache);
+   cache = NULL;
+   // FIXME: shutdown properly
+   LKD(strshr_freeme_lock);
+   LKI(cache_lock);
+}
+
+static Img *
+img_new(const char *file, const char *key, RGBA_Image_Loadopts *load_opts, const char *bufkey)
+{
+   Img *img;
+   struct stat st;
+   int ret;
+   Image_Entry *ie;
+   int err = 0;
+   double t;
+   
+   DBG("... stat %s", file);
+   ret = stat(file, &st);
+   if (ret < 0) return NULL;
+   DBG("... load header");
+   t = get_time();
+   ie = evas_cache_image_request(cache, file, key, load_opts, &err);
+   t = get_time() - t;
+   DBG("... header done");
+   if (!ie) return NULL;
+   DBG("... ie->cache = %p", ie->cache);
+   img = (Img *)ie;
+   img->stats.load1 = t;
+   img->key = eina_stringshare_add(bufkey);
+   img->file.modtime = st.st_mtime;
+   img->file.last_stat = t_now;
+   img->file.file = eina_stringshare_add(file);
+   if (key) img->file.key = eina_stringshare_add(key);
+   img->load_opts.scale_down_by = load_opts->scale_down_by;
+   img->load_opts.dpi = load_opts->dpi;
+   img->load_opts.w = load_opts->w;
+   img->load_opts.h = load_opts->h;
+   img->image.w = ie->w;
+   img->image.h = ie->h;
+   img->image.alpha = ie->flags.alpha;
+   img->ref = 1;
+   img->active = 1;
+   img->usage = sizeof(Img) + strlen(img->key) + 1 + 
+     strlen(img->file.file) + 1;
+   if (img->file.key) img->usage += strlen(img->file.key) + 1;
+   eina_hash_direct_add(active_images, img->key, img);
+   return img;
+}
+
+static void
+img_loaddata(Img *img)
+{
+   double t;
+   
+   if (img->mem) return;
+   t = get_time();
+   LKL(cache_lock);
+   evas_cache_image_load_data((Image_Entry *)img);
+   t = get_time() - t;
+   img->stats.load2 = t;
+   if (img->image.data)
+     msync(img->image.data, img->image.w * img->image.h * sizeof(DATA32), MS_SYNC | MS_INVALIDATE);
+   if (!img->active) cache_usage -= img->usage;
+   img->usage += 
+     (4096 * (((img->image.w * img->image.h * sizeof(DATA32)) + 4095) / 4096)) +
+     sizeof(Mem);
+   if (!img->active) cache_usage += img->usage;
+   LKU(cache_lock);
+   cache_clean();
+}
+
+static void
+img_free(Img *img)
+{
+   if (img->incache > 0)
+     {
+        ERR("EEEEEEEEEEEEEEEEK!");
+        ERR("EEEEEEEEEEEEEEEEK! %p '%s' still in cache",
+               img, img->file.file);
+        ERR("EEEEEEEEEEEEEEEEK!");
+        return;
+     }
+   stats_lifetime_update(img);
+   stats_update();
+   
+   LKL(strshr_freeme_lock);
+   strshr_freeme_count +=  3;
+   if (strshr_freeme_count > strshr_freeme_alloc)
+     {
+        const char **tmp;
+        
+        strshr_freeme_alloc += 32;
+        tmp = realloc(strshr_freeme, strshr_freeme_alloc * sizeof(const char **));
+        if (tmp) strshr_freeme = tmp;
+        else
+          {
+             printf("realloc of strshr_freeme failed for %i items\n", strshr_freeme_alloc);
+             strshr_freeme_alloc -= 32;
+             strshr_freeme_count -= 3;
+             return;
+          }
+     }
+   strshr_freeme[strshr_freeme_count - 3] = img->key;
+   strshr_freeme[strshr_freeme_count - 2] = img->file.file;
+   strshr_freeme[strshr_freeme_count - 1] = img->file.key;
+   LKU(strshr_freeme_lock);
+   
+   evas_cache_image_drop((Image_Entry *)img);
+}
+
+static void
+cache_clean(void)
+{
+   DBG("... cache clean!!! do");
+   LKL(cache_lock);
+   while ((cache_usage > ((cache_max_usage + cache_max_adjust) * 1024)) && 
+          (cache_images))
+     {
+        Img *img;
+        Eina_List *l;
+
+        DBG("... clean loop %i > %i", cache_usage, (cache_max_usage + cache_max_adjust) * 1024);
+        l = eina_list_last(cache_images); // THREAD: called from thread. happens to be safe as it uses no unlocked shared resources
+        if (!l) break;
+        img = l->data;
+        if (!img) break;
+        LKL(img->lock);
+        DBG("...   REMOVE %p '%s'", img, img->file.file);
+#ifdef BUILD_PTHREAD
+        img->killme = 1;
+        img->useless = 1;
+        img->dead = 1;
+        cache_cleanme++;
+        LKU(img->lock);
+#else        
+        cache_images = eina_list_remove_list(cache_images, l); // FIXME: called from thread
+        img->incache--;
+        cache_usage -= img->usage;
+        DBG("...   IMG FREE %p", img);
+        img_free(img);
+#endif        
+     }
+   LKU(cache_lock);
+}
+
+static void
+cache_timeout(time_t t)
+{
+   Eina_List *l, *l_next;
+   Img *img;
+   
+   if (cache_item_timeout < 0) return;
+   LKL(cache_lock);
+   EINA_LIST_FOREACH_SAFE(cache_images, l, l_next, img)
+     {
+        LKL(img->lock);
+        if ((t - img->cached) > cache_item_timeout)
+          {
+             cache_images = eina_list_remove_list(cache_images, l);
+             img->incache--;
+             cache_usage -= img->usage;
+             img_free(img);
+          }
+        else
+          LKU(img->lock);
+     }
+   LKU(cache_lock);
+}
+
+static void
+mem_cache_adjust(void)
+{
+   int pval = cache_max_adjust;
+   int max = 0;
+   int mem_used;
+
+   if (mem_total <= 0) return;
+   mem_used = mem_total - mem_free - mem_cached - mem_buffers;
+#if 0 // this lets the image cache to grow to fill all real free ram, if
+      // there is any (ie ram unused by disk cache)
+   if (mem_free < mem_total)
+     {
+        cache_max_adjust = mem_free;
+        return;
+     }
+#endif
+
+   max = ((mem_free + mem_cached + mem_buffers) / 8) - cache_max_usage;
+   if (max < 0) max = 0;
+   if (max > cache_max_usage) max = cache_max_usage;
+   cache_max_adjust = max - cache_max_usage;
+   
+   if (cache_max_adjust < -cache_max_usage) 
+     cache_max_adjust = -cache_max_usage;
+   DBG("... cache_max_adjust = %i", cache_max_adjust);
+   if (pval != cache_max_adjust)
+     {
+        DBG("... cache clean");
+        // FIXME lock problem
+        cache_clean();
+     }
+}
+
+static void
+img_cache(Img *img)
+{
+   eina_hash_del(active_images, img->key, img);
+   if (img->dead)
+     {
+        DBG("... img %p '%s' dead", img , img->file.file);
+        img_free(img);
+        return;
+     }
+   if ((cache_usage + img->usage) > ((cache_max_usage + cache_max_adjust) * 1024))
+     {
+        DBG("... img %p '%s' too big for cache", img , img->file.file);
+        img_free(img);
+        return;
+     }
+   DBG("... img %p '%s' cached += %i", img , img->file.file, img->usage);
+   if (img->incache > 0)
+     {
+        ERR("EEEEEEEEEEEEEEEEK!");
+        ERR("EEEEEEEEEEEEEEEEK! %p '%s' already in cache",
+               img, img->file.file);
+        ERR("EEEEEEEEEEEEEEEEK!");
+        return;
+     }
+   LKL(cache_lock);
+   cache_images = eina_list_prepend(cache_images, img);
+   LKU(cache_lock);
+   img->incache++;
+   cache_usage += img->usage;
+   img->active = 0;
+   img->cached = t_now;
+   // FIXME: lock problem
+   if (cache_usage > ((cache_max_usage + cache_max_adjust) * 1024))
+     cache_clean();
+}
+
+static void
+img_dead(Img *img)
+{
+   if (img->active) return;
+   LKL(cache_lock);
+   cache_images = eina_list_remove(cache_images, img);
+   LKU(cache_lock);
+   img->incache--;
+   cache_usage -= img->usage;
+   img_free(img);
+}
+
+static Eina_Bool
+img_ok(Img *img)
+{
+   struct stat st;
+   int ret;
+   
+   if (img->dead) return 0;
+   if ((t_now > img->file.last_stat) &&
+       ((t_now - img->file.last_stat) < stat_res_interval)) return 1;
+   img->file.last_stat = t_now;
+   ret = stat(img->file.file, &st);
+   img->file.last_stat = t_now;
+   if (ret < 0)
+     {
+        img->dead = 1;
+        img_dead(img);
+        return 0;
+     }
+   if (st.st_mtime != img->file.modtime)
+     {
+        img->dead = 1;
+        img_dead(img);
+        return 0;
+     }
+   return 1;
+}
+
+static Img *
+img_load(const char *file, const char *key, RGBA_Image_Loadopts *load_opts)
+{
+   Img *img;
+   char buf[8192];
+   Eina_List *l, *l_next;
+   
+   if (!file) return NULL;
+   DBG("... img_load '%s'", file);
+   if (key) DBG("... ... key '%s'", key);
+   if (key)
+     snprintf(buf, sizeof(buf), "%s///::/%s/\001/%i/%1.8f/%ix%i",
+              file, key, 
+              load_opts->scale_down_by, 
+              load_opts->dpi,
+              load_opts->w, load_opts->h);
+   else
+     snprintf(buf, sizeof(buf), "%s///\001/%i/%1.8f/%ix%i",
+              file, 
+              load_opts->scale_down_by, 
+              load_opts->dpi,
+              load_opts->w, load_opts->h);
+   DBG("... find '%s'", buf);
+   img = eina_hash_find(active_images, buf);
+   if ((img) && (img_ok(img)))
+     {
+        DBG("... found!");
+        img->stats.load1saved++;
+        img->ref++;
+        DBG("... stats update");
+        stats_update();
+        DBG("... return %p", img);
+        return img;
+     }
+   
+   // FIXME: keep hash of cached images too 
+   LKL(cache_lock);
+   EINA_LIST_FOREACH_SAFE(cache_images, l, l_next, img)
+    {
+        if (!strcmp(img->key, buf))
+          {
+             LKL(img->lock);
+             if (img_ok(img))
+               {
+                  DBG("... found cached");
+                  cache_images = eina_list_remove_list(cache_images, l);
+                  img->incache--;
+                  cache_usage -= img->usage;
+                  img->active = 1;
+                  img->stats.load1saved++;
+                  img->ref++;
+                  eina_hash_direct_add(active_images, img->key, img);
+                  DBG("... sats update");
+                  stats_update();
+                  DBG("... return %p", img);
+                  LKU(img->lock);
+                  LKU(cache_lock);
+                  return img;
+               }
+             LKU(img->lock);
+          }
+     }
+   LKU(cache_lock);
+   DBG("... ned new img");
+   return img_new(file, key, load_opts, buf);
+}
+
+static void
+img_unload(Img *img)
+{
+   if (img->ref == 0)
+     {
+        ERR("EEEEEEEEEEEEEEEEK!");
+        ERR("EEEEEEEEEEEEEEEEK! %p '%s' already @ ref 0",
+               img, img->file.file);
+        ERR("EEEEEEEEEEEEEEEEK!");
+        return;
+     }
+   img->ref--;
+   DBG("... img ref-- = %i", img->ref);
+   if (img->ref == 0)
+     {
+        DBG("... img cache %p '%s'", img, img->file.file);
+        img_cache(img);
+     }
+}
+
+static void
+img_unloaddata(Img *img)
+{
+   DBG("img_unloaddata() %p '%s'", img, img->file.file);
+   if ((img->dref <= 0) && (img->useless) && (img->mem))
+     {
+        Image_Entry *ie = (Image_Entry *)img;
+        
+        DBG("... really do forced unload");
+        if (!img->active) cache_usage -= img->usage;
+        img->usage -= 
+          (4096 * (((img->image.w * img->image.h * sizeof(DATA32)) + 4095) / 4096)) +
+          sizeof(Mem);
+        if (!img->active) cache_usage += img->usage;
+        evas_cserve_mem_free(img->mem);
+        stat_mems = eina_list_remove(stat_mems, img->mem);
+        img->mem = NULL;
+        img->image.data = NULL;
+        img->dref = 0;
+        DBG("... done");
+        
+        ie->flags.loaded = 0;
+        ie->allocated.w = 0;
+        ie->allocated.h = 0;
+     }
+}
+
+static void
+img_useless(Img *img)
+{
+   DBG("img_useless() %p", img);
+   img->useless = 1;
+   if (img->dref <= 0) img_unloaddata(img);
+}
+
+static void
+img_forcedunload(Img *img)
+{
+   DBG("img_forcedunload() %p", img);
+   img->dead = 1;
+   img_unload(img);
+}
+
+static void
+img_preload(Img *img)
+{
+   DBG("img_preload() %p", img);
+}
+
+static void
+client_del(void *data, Client *c)
+{
+   Eina_List *images;
+   Img *img;
+   
+   images = data;
+   DBG("... CLIENT DEL %i", c->pid);
+   EINA_LIST_FREE(images, img)
+     {
+        DBG("... unloaddata img %p", img);
+        img_unloaddata(img);
+        DBG("... unload img %p", img);
+        img_unload(img);
+     }
+}
+
+static Eina_Bool
+getinfo_hash_image_cb(const Eina_Hash *hash __UNUSED__, 
+                      const void *key __UNUSED__,
+                      void *data, void *fdata __UNUSED__)
+{
+   Img *img = data;
+   Eina_List **list = fdata;
+
+   *list = eina_list_append(*list, img);
+   return 1;
+}
+
+#ifdef BUILD_PTHREAD
+static void *
+load_data_thread(void *data)
+{
+   Load_Inf *li = data;
+   Img *img = li->img;
+   Client *c = li->c;
+   Op_Loaddata_Reply msg;
+
+   free(li);
+   LKL(img->lock);
+   if (img->mem)
+     {
+        memset(&msg, 0, sizeof(msg));
+        msg.mem.id = img->mem->id;
+        msg.mem.offset = img->mem->offset;
+        msg.mem.size = img->mem->size;
+        DBG("... reply");
+        evas_cserve_client_send(c, OP_LOADDATA, sizeof(msg), (unsigned char *)(&msg));
+        LKU(c->lock);
+        return NULL;
+     }
+   img_loaddata(img);
+   memset(&msg, 0, sizeof(msg));
+   if (img->mem)
+     {
+        msg.mem.id = img->mem->id;
+        msg.mem.offset = img->mem->offset;
+        msg.mem.size = img->mem->size;
+     }
+   else
+     msg.mem.id = msg.mem.offset = msg.mem.size = 0;
+   LKU(img->lock);
+   DBG("... reply");
+   evas_cserve_client_send(c, OP_LOADDATA, sizeof(msg), (unsigned char *)(&msg));
+   LKU(c->lock);
+   return NULL;
+}
+#endif
+
+static int
+message(void *fdata, Server *s, Client *c, int opcode, int size, unsigned char *data)
+{
+   // copy data into  local aligned buffer... in case.
+   unsigned char *tdata = alloca(size + 16);
+   memcpy(tdata, data, size);
+   
+   t_now = time(NULL);
+   DBG("message @ %i...", (int)t_now);
+   switch (opcode)
+     {
+     case OP_INIT:
+          {
+             Op_Init *rep;
+             Op_Init msg;
+             
+             memset(&msg, 0, sizeof(msg));
+             msg.pid = getpid();
+             msg.server_id = server_id;
+             msg.handle = c;
+             rep = (Op_Init *)tdata;
+             c->pid = rep->pid;
+             if (rep->server_id == 1) // 2nd channel conn
+               {
+                  c->client_main = rep->handle;
+               }
+             c->func = client_del;
+             c->data = NULL;
+             DBG("OP_INIT %i", c->pid);
+             DBG("... reply");
+             evas_cserve_client_send(c, OP_INIT, sizeof(msg), (unsigned char *)(&msg));
+          }
+        break;
+     case OP_LOAD:
+          {
+             Op_Load *rep;
+             Op_Load_Reply msg;
+             Img *img;
+             RGBA_Image_Loadopts lopt = {0, 0.0, 0, 0, {0, 0, 0, 0}};
+             char *file = NULL, *key = NULL;
+             
+             DBG("OP_LOAD %i", c->pid);
+             rep = (Op_Load *)tdata;
+             file = (char*) (data + sizeof(Op_Load));
+             key = file + strlen(file) + 1;
+             if (key[0] == 0) key = NULL;
+             lopt.scale_down_by = rep->lopt.scale_down_by;
+             lopt.dpi = rep->lopt.dpi;
+             lopt.w = rep->lopt.w;
+             lopt.h = rep->lopt.h;
+             lopt.region.x = rep->lopt.region.x;
+             lopt.region.y = rep->lopt.region.y;
+             lopt.region.w = rep->lopt.region.w;
+             lopt.region.h = rep->lopt.region.h;
+             DBG("... img_load '%s'", file);
+             if (key) DBG("'%s'", (char *)key);
+             else DBG("   '%s'", "");
+             DBG("   lopt { %i %1.1f %i %i { %i %i %i %i}}",
+               lopt.scale_down_by, lopt.dpi, lopt.w, lopt.h, 
+               lopt.region.x, lopt.region.y, lopt.region.w, lopt.region.h);
+             img = img_load(file, key, &lopt);
+             DBG("... img_load = %p", img);
+             if (img)
+               {
+                  DBG("... add image to client list");
+                  if (c->client_main)
+                    c->client_main->data = eina_list_append(c->client_main->data, img);
+                  else
+                    c->data = eina_list_append(c->data, img);
+               }
+             memset(&msg, 0, sizeof(msg));
+             msg.handle = img;
+             if ((img) && (img->mem))
+               {
+                  msg.mem.id = img->mem->id;
+                  msg.mem.offset = img->mem->offset;
+                  msg.mem.size = img->mem->size;
+                  img->stats.load2saved++;
+                  stats_update();
+               }
+             else
+               msg.mem.id = msg.mem.offset = msg.mem.size = 0;
+             if (img)
+               {
+                  msg.image.w = img->image.w;
+                  msg.image.h = img->image.h;
+                  msg.image.alpha = img->image.alpha;
+               }
+             DBG("... reply");
+             evas_cserve_client_send(c, OP_LOAD, sizeof(msg), (unsigned char *)(&msg)); 
+         } 
+        break;
+     case OP_UNLOAD:
+          {
+             Op_Unload *rep;
+             Img *img;
+             
+             DBG("OP_UNLOAD %i", c->pid);
+             rep = (Op_Unload *)tdata;
+             img = rep->handle;
+             if ((img) && (rep->server_id == server_id))
+               {
+                  Eina_Bool doflush = 0;
+                  
+                  DBG("... remove %p from list", img);
+                  if (c->client_main)
+                    c->client_main->data = eina_list_remove(c->client_main->data, img);
+                  else
+                    c->data = eina_list_remove(c->data, img);
+                  DBG("... unload %p", img);
+                  LKL(img->lock);
+                  img->ref++;
+                  img_unload(img);
+                  img->ref--;
+                  if (img->ref == 0) doflush = 1;
+                  LKU(img->lock);
+                  if (doflush)
+                    img_cache(img);
+                  cache_clean();
+               }
+          } 
+        break;
+     case OP_LOADDATA:
+          {
+             Op_Loaddata *rep;
+             Op_Loaddata_Reply msg;
+             Img *img;
+             
+             DBG("OP_LOADDATA %i", c->pid);
+             rep = (Op_Loaddata *)tdata;
+             img = rep->handle;
+             if ((img) && (rep->server_id == server_id))
+               {
+                  if (img->mem)
+                    {
+                       DBG("... load saved - cached %p", img);
+                       img->stats.load2saved++;
+                       stats_update();
+                       memset(&msg, 0, sizeof(msg));
+                       if (img->mem)
+                         {
+                            msg.mem.id = img->mem->id;
+                            msg.mem.offset = img->mem->offset;
+                            msg.mem.size = img->mem->size;
+                         }
+                       else
+                         msg.mem.id = msg.mem.offset = msg.mem.size = 0;
+                       DBG("... reply");
+                       evas_cserve_client_send(c, OP_LOADDATA, sizeof(msg), (unsigned char *)(&msg));
+                    }
+                  else
+                    {
+#ifdef BUILD_PTHREAD
+                       pthread_t tid;
+                       pthread_attr_t attr;
+                       Load_Inf *li;
+                       
+                       DBG("... load data %p", img);
+                       pthread_attr_init(&attr);
+                       li = calloc(1, sizeof(Load_Inf));
+                       if (li)
+                         {
+                            li->img= img;
+                            li->c = c;
+                            LKL(c->lock);
+                            if (pthread_create(&tid, &attr, load_data_thread, li))
+                              {
+                                 perror("pthread_create()");
+                              }
+                            else
+                              pthread_detach(tid);
+                         }
+                       pthread_attr_destroy(&attr);
+#else
+                       img_loaddata(img);
+                       memset(&msg, 0, sizeof(msg));
+                       if (img->mem)
+                         {
+                            msg.mem.id = img->mem->id;
+                            msg.mem.offset = img->mem->offset;
+                            msg.mem.size = img->mem->size;
+                         }
+                       else
+                         msg.mem.id = msg.mem.offset = msg.mem.size = 0;
+                       DBG("... reply");
+                       evas_cserve_client_send(c, OP_LOADDATA, sizeof(msg), (unsigned char *)(&msg));
+#endif
+                    }
+               }
+             else
+               {
+                  msg.mem.id = msg.mem.offset = msg.mem.size = 0;
+                  evas_cserve_client_send(c, OP_LOADDATA, sizeof(msg), (unsigned char *)(&msg));
+               }
+          }
+        break;
+     case OP_UNLOADDATA:
+          {
+             Op_Unloaddata *rep;
+             Img *img;
+             
+             DBG("OP_UNLOADDATA %i", c->pid);
+             rep = (Op_Unloaddata *)tdata;
+             img = rep->handle;
+             if ((img) && (rep->server_id == server_id))
+               {
+                  DBG("... dref--");
+                  LKL(img->lock);
+                  img->dref--;
+                  if (img->dref < 0) img->dref = 0;
+                  DBG("... unload data %p '%s'", img, img->file.file);
+                  img_unloaddata(img);
+                  LKU(img->lock);
+               }
+          } 
+        break;
+     case OP_USELESSDATA:
+          {
+             Op_Unloaddata *rep;
+             Img *img;
+             
+             DBG("OP_USELESSDATA %i", c->pid);
+             rep = (Op_Unloaddata *)tdata;
+             img = rep->handle;
+             if ((img) && (rep->server_id == server_id))
+               {
+                  DBG("... dref--");
+                  LKL(img->lock);
+                  img->dref--;
+                  if (img->dref < 0) img->dref = 0;
+                  DBG("... useless %p", img);
+                  img_useless(img);
+                  LKU(img->lock);
+               }
+          } 
+        break;
+     case OP_PRELOAD:
+          {
+             Op_Preload *rep;
+             Img *img;
+             
+             DBG("OP_PRELOAD %i", c->pid);
+             rep = (Op_Preload *)tdata;
+             img = rep->handle;
+             if ((img) && (rep->server_id == server_id))
+               {
+                  LKL(img->lock);
+                  if (c->client_main)
+                    c->client_main->data = eina_list_remove(c->client_main->data, img);
+                  else
+                    c->data = eina_list_remove(c->data, img);
+                  // FIXME: preload doesnt work async
+                  img_preload(img);
+                  LKU(img->lock);
+               }
+          }
+     case OP_FORCEDUNLOAD:
+          {
+             Op_Forcedunload *rep;
+             Img *img;
+             
+             DBG("OP_FORCEDUNLOAD %i", c->pid);
+             rep = (Op_Forcedunload *)tdata;
+             img = rep->handle;
+             if ((img) && (rep->server_id == server_id))
+               {
+                  Eina_Bool doflush = 0;
+                  
+                  LKL(img->lock);
+                  DBG("remove %p from list", img);
+                  if (c->client_main)
+                    c->client_main->data = eina_list_remove(c->client_main->data, img);
+                  else
+                    c->data = eina_list_remove(c->data, img);
+                  DBG("... forced unload now");
+                  img->ref++;
+                  img_forcedunload(img);
+                  img->ref--;
+                  if (img->ref == 0) doflush = 1;
+                  LKU(img->lock);
+                  if (doflush)
+                    img_cache(img);
+                  cache_clean();
+               }
+          } 
+        break;
+     case OP_GETCONFIG:
+          {
+             Op_Getconfig_Reply msg;
+             
+             DBG("OP_GETCONFIG %i", c->pid);
+             msg.cache_max_usage = cache_max_usage;
+             msg.cache_item_timeout = cache_item_timeout;
+             msg.cache_item_timeout_check = cache_item_timeout_check;
+             DBG("... reply");
+             evas_cserve_client_send(c, OP_GETCONFIG, sizeof(msg), (unsigned char *)(&msg));
+          } 
+        break;
+     case OP_SETCONFIG:
+          {
+             Op_Setconfig *rep;
+             
+             DBG("OP_SETCONFIG %i", c->pid);
+             rep = (Op_Setconfig *)tdata;
+             cache_max_usage = rep->cache_max_usage;
+             cache_item_timeout = rep->cache_item_timeout;
+             cache_item_timeout_check = rep->cache_item_timeout_check;
+             DBG("... cache timeout");
+             cache_timeout(t_now);
+             DBG("... cache clean");
+             cache_clean();
+          } 
+        break;
+     case OP_GETSTATS:
+          {
+             Op_Getstats_Reply msg;
+
+             DBG("OP_GETSTATS %i", c->pid);
+             stats_calc();
+             msg.saved_memory = saved_memory;
+             msg.wasted_memory = (real_memory - alloced_memory);
+             msg.saved_memory_peak = saved_memory_peak;
+             msg.wasted_memory_peak = (real_memory_peak - alloced_memory_peak);
+             msg.saved_time_image_header_load = saved_load_lifetime + saved_load_time;
+             msg.saved_time_image_data_load = saved_loaddata_lifetime + saved_loaddata_time;
+             DBG("... reply");
+             evas_cserve_client_send(c, OP_GETSTATS, sizeof(msg), (unsigned char *)(&msg));
+          } 
+        break;
+     case OP_GETINFO:
+          {
+             Op_Getinfo_Reply *msg;
+             int len;
+             Eina_List *imgs = NULL, *l;
+             Img *img;
+             
+             DBG("OP_GETINFO %i", c->pid);
+             len = sizeof(Op_Getinfo_Reply);
+             DBG("... foreach");
+             if (active_images)
+               eina_hash_foreach(active_images, getinfo_hash_image_cb, &imgs);
+             DBG("... walk foreach list output");
+             LKL(cache_lock);
+             EINA_LIST_FOREACH(cache_images, l, img)
+               {
+                  imgs = eina_list_append(imgs, img);
+               }
+             LKU(cache_lock);
+             DBG("... walk image cache");
+             EINA_LIST_FOREACH(imgs, l, img)
+               {
+                  len += sizeof(Op_Getinfo_Item);
+                  if (img->file.file) len += strlen(img->file.file);
+                  len++;
+                  if (img->file.key) len += strlen(img->file.key);
+                  len++;
+               }
+             DBG("... malloc msg");
+             msg = malloc(len);
+             if (msg)
+               {
+                  unsigned char *p;
+                  
+                  DBG("...   init msg");
+                  memset(msg, 0, len);
+                  p = (unsigned char *)msg;
+                  msg->active.mem_total = 0;
+                  msg->active.count = 0;
+                  msg->cached.mem_total = 0;
+                  msg->cached.count = 0;
+                  p += sizeof(Op_Getinfo_Reply);
+                  DBG("...   walk all imgs");
+                  EINA_LIST_FOREACH(imgs, l, img)
+                    {
+                       Op_Getinfo_Item it;
+
+                       LKL(img->lock); 
+                       DBG("...   img %p", img);
+                       memset(&it, 0, sizeof(Op_Getinfo_Item));
+                       it.file_key_size = 0;
+                       if (img->file.file)
+                         {
+                           strcpy((char *)p + sizeof(Op_Getinfo_Item) + it.file_key_size, img->file.file);
+                            it.file_key_size += strlen(img->file.file);
+                         }
+                       p[sizeof(Op_Getinfo_Item) + it.file_key_size] = 0;
+                       it.file_key_size += 1;
+                       if (img->file.key)
+                         {
+                           strcpy((char *)p + sizeof(Op_Getinfo_Item) + it.file_key_size, img->file.key);
+                            it.file_key_size += strlen(img->file.key);
+                         }
+                       p[sizeof(Op_Getinfo_Item) + it.file_key_size] = 0;
+                       it.file_key_size += 1;
+                       
+                       it.w = img->image.w;
+                       it.h = img->image.h;
+                       it.file_mod_time = img->file.modtime;
+                       it.file_checked_time = img->file.last_stat;
+                       if (!img->active)
+                         it.cached_time = img->cached;
+                       else
+                         it.cached_time = 0;
+                       it.refcount = img->ref;
+                       it.data_refcount = img->dref;
+                       it.memory_footprint = img->usage;
+                       it.head_load_time = img->stats.load1;
+                       it.data_load_time = img->stats.load2;
+                       it.alpha = img->image.alpha;
+                       if (img->image.data)
+                         it.data_loaded = 1;
+                       else
+                         it.data_loaded = 0;
+                       it.active = img->active;
+                       if (it.active)
+                         {
+                            msg->active.count++;
+                            msg->active.mem_total += img->usage;
+                         }
+                       else
+                         {
+                            msg->cached.count++;
+                            msg->cached.mem_total += img->usage;
+                         }
+                       it.dead = img->dead;
+                       it.useless = img->useless;
+                       DBG("...   memcpy %p %p %zu ", 
+                         p, &it, sizeof(Op_Getinfo_Item));
+                       memcpy(p, &it, sizeof(Op_Getinfo_Item));
+                       DBG("...   memcpy done %p", img);
+                       p += sizeof(Op_Getinfo_Item) + it.file_key_size;
+                       LKU(img->lock); 
+                    }
+                  DBG("...   walk all imgs done");
+                  msg->active.mem_total = 
+                    (msg->active.mem_total + 1023) / 1024;
+                  msg->cached.mem_total = 
+                    (msg->cached.mem_total + 1023) / 1024;
+                  DBG("... reply");
+                  evas_cserve_client_send(c, OP_GETINFO, len, (unsigned char *)msg);
+                  free(msg);
+               }
+             else
+               {
+                  DBG("... reply empty");
+                  evas_cserve_client_send(c, OP_GETINFO, 0, NULL);
+               }
+               DBG("... free imgs list");
+           if (imgs) eina_list_free(imgs);
+          } 
+        break;
+     default:
+        DBG("OP_... UNKNOWN??? %i opcode: %i", c->pid, opcode);
+        break;
+     }
+   return 0;
+}
+
+static void
+parse_args(int argc, char **argv)
+{
+   int i;
+   
+   for (i = 1; i < argc; i++)
+     {
+        if ((!strcmp(argv[i], "-h")) ||
+            (!strcmp(argv[i], "-help")) ||
+            (!strcmp(argv[i], "--help")))
+          {
+             printf("Options:\n"
+                    "\t-h          This help\n"
+                    "\t-csize      Size of speculative cache (Kb)\n"
+                    "\t-ctime      Maximum life of a cached image (seconds)\n"
+                    "\t-ctimecheck Time between checking the cache for timeouts (seconds)\n"
+                    "\t-debug      Enable debug logging\n"
+                    "\n");
+             exit(0);
+          }
+        else if ((!strcmp(argv[i], "-csize")) && (i < (argc - 1)))
+          {
+             i++;
+             cache_max_usage = atoi(argv[i]);
+          }
+        else if ((!strcmp(argv[i], "-ctime")) && (i < (argc - 1)))
+          {
+             i++;
+             cache_item_timeout = atoi(argv[i]);
+          }
+        else if ((!strcmp(argv[i], "-ctimecheck")) && (i < (argc - 1)))
+          {
+             i++;
+             cache_item_timeout_check = atoi(argv[i]);
+          }
+        else if (!strcmp(argv[i], "-debug"))
+          {
+            eina_log_level_set(EINA_LOG_LEVEL_DBG);
+          }
+     }
+}
+
+static int exit_flag = 0;
+
+static void
+exit_handler(int x, siginfo_t *info, void *data)
+{
+   exit_flag = 1;
+}
+
+static void
+pipe_handler(int x, siginfo_t *info, void *data)
+{
+}
+
+static void
+signal_init(void)
+{
+   struct sigaction action, old_action;
+   
+   action.sa_handler = NULL;
+   action.sa_sigaction = exit_handler;
+   action.sa_flags = SA_RESTART | SA_SIGINFO;
+   sigemptyset(&action.sa_mask);
+   sigaction(SIGINT, &action, &old_action);
+
+   action.sa_handler = NULL;
+   action.sa_sigaction = exit_handler;
+   action.sa_flags = SA_RESTART | SA_SIGINFO;
+   sigemptyset(&action.sa_mask);
+   sigaction(SIGTERM, &action, &old_action);
+
+   action.sa_handler = NULL;
+   action.sa_sigaction = exit_handler;
+   action.sa_flags = SA_RESTART | SA_SIGINFO;
+   sigemptyset(&action.sa_mask);
+   sigaction(SIGQUIT, &action, &old_action);
+
+   action.sa_handler = NULL;
+   action.sa_sigaction = pipe_handler;
+   action.sa_flags = SA_RESTART | SA_SIGINFO;
+   sigemptyset(&action.sa_mask);
+   sigaction(SIGPIPE, &action, &old_action);
+
+   // SIGUSR1
+   // SIGUSR2
+   // SIGHUP
+
+   // SIGCHLD
+   
+   // SIGSEGV
+   // SIGILL
+   // SIGBUS
+   // SIGFPE
+   // SIGABRT
+}
+
+static void
+signal_shutdown(void)
+{
+}
+
+int
+main(int argc, char **argv)
+{
+   Server *s;
+   time_t last_check, t, t_next;
+   pid_t pid;
+   
+   t = time(NULL);
+   pid = getpid();
+   t ^= (pid << 24) | (pid << 16) | (pid << 8) | (pid);
+   srand(t);
+   server_id = rand();
+   
+   parse_args(argc, argv);
+   
+   unsetenv("EVAS_CSERVE");
+
+   DBG("eina init...");
+   eina_init();
+   _evas_cserve_bin_log_dom = eina_log_domain_register("Evas_cserve_bin", CSERVE_BIN_DEFAULT_COLOR);
+   if(_evas_cserve_bin_log_dom < 0) {
+     DBG("Problem with eina_log : impossible to create a log domain");
+     eina_shutdown();
+     exit(1);
+   }
+
+   DBG("evas init...");
+   evas_init();
+   DBG("img init...");
+   img_init();
+   DBG("signal init...");
+   signal_init();
+   DBG("cserve add...");
+   s = evas_cserve_server_add();
+   if (!s)
+     {
+        ERR("ERROR: server socket init fail. abort.");
+        goto error;
+     }
+   DBG("mem open (status)...");
+   stat_mem = evas_cserve_mem_open(0, 0, "status", sizeof(int), 0);
+   if (stat_mem)
+     {
+        WRN("WARNING: previous evas_cserve left garbage. cleaning up.");
+        stat_clean(stat_mem);
+        evas_cserve_mem_close(stat_mem);
+        stat_mem = NULL;
+     }
+   DBG("mem new (status)...");
+   stat_mem = evas_cserve_mem_new(sizeof(int), "status");
+   if (!stat_mem)
+     {
+        ERR("ERROR: cannot create status shmseg. abort.");
+        goto error;
+     }
+   DBG("init status...");
+   if (!stat_init(stat_mem))
+     {
+        ERR("cannot init status shmseg. abort.");
+        evas_cserve_mem_free(stat_mem);
+        stat_mem = NULL;
+        goto error;
+     }
+   
+   DBG("cset server message handler...");
+   evas_cserve_server_message_handler_set(s, message, NULL);
+   last_check = time(NULL);
+   t_next = 0; 
+   if (cache_item_timeout_check > 0) t_next = cache_item_timeout_check;
+   DBG("LOOP!!! ...");
+   for (;;)
+     {
+        /* fixme: timeout 0 only her - future use timeouts for timed
+         * housekeping */
+        if (exit_flag) break;
+        DBG("wait for messages...");
+        evas_cserve_server_wait(s, t_next * 1000000);
+        if (exit_flag) break;
+        t = time(NULL);
+        t_next = t - last_check;
+        if ((cache_item_timeout_check > 0) &&
+            ((t_next) >= cache_item_timeout_check))
+          {
+             DBG("check timeout of items...");
+             t_next = cache_item_timeout_check;
+             
+             last_check = t;
+             DBG("cache timeout...");
+             cache_timeout(t);
+             DBG("meminfo check...");
+             meminfo_check();
+             DBG("mem cache adjust...");
+             mem_cache_adjust();
+          }
+        if ((t_next <= 0) && (cache_item_timeout_check > 0))
+          t_next = 1;
+        DBG("sleep for %isec...", (int)t_next);
+        
+        LKL(strshr_freeme_lock);
+        if (strshr_freeme_count > 0)
+          {
+             int i;
+             
+             for (i = 0; i < strshr_freeme_count; i++)
+               eina_stringshare_del(strshr_freeme[i]);
+             strshr_freeme_count = 0;
+          }
+        LKU(strshr_freeme_lock);
+        
+        LKL(cache_lock);
+        if (cache_cleanme)
+          {
+             Eina_List *l;
+             Img *img;
+             Eina_List *kills = NULL;
+            
+             EINA_LIST_FOREACH(cache_images, l, img)
+               {
+                  LKL(img->lock);
+                  if (img->killme)
+                    kills = eina_list_append(kills, img);
+                  LKU(img->lock);
+               }
+             while (kills)
+               {
+                  img = kills->data;
+                  kills = eina_list_remove_list(kills, kills);
+                  LKL(img->lock);
+                  cache_images = eina_list_remove(cache_images, img);
+                  img->incache--;
+                  cache_usage -= img->usage;
+                  DBG("...   IMG FREE %p", img);
+                  img_free(img);
+               }
+             cache_cleanme = 0;
+          }
+        LKU(cache_lock);
+     }
+   DBG("end loop...");
+   error:
+   DBG("cleanup...");
+   if (stat_mem)
+     {
+        DBG("clean mem stat...");
+        stat_clean(stat_mem);
+     }
+   DBG("signal shutdown...");
+   signal_shutdown();
+   DBG("img shutdown...");
+   img_shutdown();
+   if (stat_mem)
+     {
+        DBG("free stat mem...");
+        evas_cserve_mem_free(stat_mem);
+        stat_mem = NULL;
+     }
+   if (s)
+     {
+        DBG("del server...");
+        evas_cserve_server_del(s);
+     }
+   DBG("evas shutdown...");
+   evas_shutdown();
+   eina_log_domain_unregister(_evas_cserve_bin_log_dom);
+   DBG("eina shutdown...");
+   eina_shutdown();
+   DBG("exit..");
+   return 0;
+}
diff --git a/src/bin/evas_cserve_tool.c b/src/bin/evas_cserve_tool.c
new file mode 100644 (file)
index 0000000..8cdc079
--- /dev/null
@@ -0,0 +1,160 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "evas_cs.h"
+
+int _cserve_tool_log_dom = -1;
+
+int
+main(int argc, char **argv)
+{
+   int i;
+   
+   evas_init();
+   if (!evas_cserve_init())
+     {
+        printf("ERROR: Cannot connect to cserve. abort\n");
+        exit(-1);
+     }
+
+   for (i = 1; i < argc; i++)
+     {
+        if ((!strcmp(argv[i], "-h")) ||
+            (!strcmp(argv[i], "-help")) ||
+            (!strcmp(argv[i], "--help")))
+          {
+             printf("Options:\n"
+                    "\t-h                               This help\n"
+                    "\tgetconfig                        Get configuration values\n"
+                    "\tsetconfig CSIZE CTIME CTIMECHECK Set the config values\n"
+                    "\tgetstats                         Get current cache statistics\n"
+                    "\tgetinfo                          Get current cache content info\n"
+                    );
+             exit(0);
+          }
+        else if ((!strcmp(argv[i], "getconfig")))
+          {
+             Op_Getconfig_Reply config;
+             
+             if (!evas_cserve_raw_config_get(&config))
+               {
+                  printf("ERROR: cannot fetch config.\n");
+                  exit(-1);
+               }
+             printf("-REPLY-\n");
+             printf("csize: %i\n", config.cache_max_usage);
+             printf("ctime: %i\n", config.cache_item_timeout);
+             printf("ctimecheck: %i\n", config.cache_item_timeout_check);
+             printf("-OK-\n");
+          }
+        else if ((!strcmp(argv[i], "setconfig")) && (i < (argc - 3)))
+          {
+             Op_Setconfig config;
+             
+             i++;
+             config.cache_max_usage = atoi(argv[i]);
+             i++;
+             config.cache_item_timeout = atoi(argv[i]);
+             i++;
+             config.cache_item_timeout_check = atoi(argv[i]);
+             if (!evas_cserve_raw_config_set(&config))
+               {
+                  printf("ERROR: cannot set config.\n");
+                  exit(-1);
+               }
+          }
+        else if ((!strcmp(argv[i], "getstats")))
+          {
+             Op_Getstats_Reply stats;
+             
+             if (!evas_cserve_raw_stats_get(&stats))
+               {
+                  printf("ERROR: cannot fetch stats.\n");
+                  exit(-1);
+               }
+             printf("-REPLY-\n");
+             printf("saved_memory: %i Kb\n", stats.saved_memory / 1024);
+             printf("wasted_memory: %i Kb\n", stats.wasted_memory / 1024);
+             printf("saved_memory_peak: %i Kb\n", stats.saved_memory_peak / 1024);
+             printf("wasted_memory_peak: %i Kb\n", stats.wasted_memory_peak / 1024);
+             printf("saved_time_image_header_load: %1.3f sec\n", stats.saved_time_image_header_load);
+             printf("saved_time_image_data_load: %1.3f sec\n", stats.saved_time_image_data_load);
+             printf("-OK-\n");
+          }
+        else if ((!strcmp(argv[i], "getinfo")))
+          {
+             Op_Getinfo_Reply *info;
+             unsigned char *p;
+             int i, j;
+             
+             info = evas_cserve_raw_info_get();
+             if (!info)
+               {
+                  printf("ERROR: cannot fetch info.\n");
+                  exit(-1);
+               }
+             j = info->active.count + info->cached.count;
+             printf("-REPLY-\n");
+             printf("active_count: %i\n", info->active.count);
+             printf("active_memory: %i Kb\n", info->active.mem_total);
+             printf("cache_count: %i\n", info->cached.count);
+             printf("cache_memory: %i Kb\n", info->cached.mem_total);
+             p = (unsigned char *)info;
+             p += sizeof(Op_Getinfo_Reply);
+             for (i = 0; i < j; i++)
+               {
+                  Op_Getinfo_Item it;
+                  char *file, *key, buf[512];
+                  struct tm *ltm;
+                  
+                  memcpy(&it, p, sizeof(Op_Getinfo_Item));
+                  file = (char*) (p + sizeof(Op_Getinfo_Item));
+                  key = file + strlen(file) + 1;
+                  printf("-IMAGE- [#%i]\n", i);
+                  printf("  file       : %s\n", file);
+                  printf("  key        : %s\n", key);
+                  printf("  size       : %i x %i\n", it.w, it.h);
+                  printf("  active     : %i\n", (int)it.active);
+                  printf("  memory used: %i bytes (%i Kb)\n", it.memory_footprint, (it.memory_footprint + 1023) / 1024);
+                  printf("  has alpha  : %i\n", (int)it.alpha);
+                  printf("  data loaded: %i\n", (int)it.data_loaded);
+                  printf("  dead       : %i\n", (int)it.dead);
+                  printf("  useless    : %i\n", (int)it.useless);
+                  printf("  image refs : %i\n", it.refcount);
+                  printf("  data  refs : %i\n", it.data_refcount);
+                  printf("  header load: %1.5f sec\n", it.head_load_time);
+                  printf("  data load  : %1.5f sec\n", it.data_load_time);
+                  if (it.cached_time == 0)
+                    printf("  cached at  : N/A\n");
+                  else
+                    {
+                       ltm = localtime(&(it.cached_time));
+                       if (ltm)
+                         {
+                            strftime(buf, sizeof(buf), "%Y.%m.%d %T", ltm);
+                            printf("  cached at  : %s\n", buf);
+                         }
+                    }
+                  ltm = localtime(&(it.file_mod_time));
+                  if (ltm)
+                    {
+                       strftime(buf, sizeof(buf), "%Y.%m.%d %T", ltm);
+                       printf("  file mod at: %s\n", buf);
+                    }
+                  ltm = localtime(&(it.file_checked_time));
+                  if (ltm)
+                    {
+                       strftime(buf, sizeof(buf), "%Y.%m.%d %T", ltm);
+                       printf("  file check : %s\n", buf);
+                    }
+                  p += sizeof(Op_Getinfo_Item) + it.file_key_size;
+               }
+             free(info);
+             printf("-OK-\n");
+          }
+     }
+   evas_cserve_shutdown();
+   evas_shutdown();
+   return 0;
+}
diff --git a/src/examples/Makefile.am b/src/examples/Makefile.am
new file mode 100644 (file)
index 0000000..746146d
--- /dev/null
@@ -0,0 +1,43 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+pkglibdir = $(datadir)/$(PACKAGE)/examples
+
+if BUILD_EXAMPLES
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-DPACKAGE_BIN_DIR=\"$(bindir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+@EINA_CFLAGS@ \
+@FREETYPE_CFLAGS@ \
+@FRIBIDI_CFLAGS@ \
+@EET_CFLAGS@ \
+@FONTCONFIG_CFLAGS@ \
+@pthread_cflags@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+pkglib_PROGRAMS =
+
+if BUILD_ENGINE_BUFFER
+AM_CPPFLAGS += -I$(top_srcdir)/src/modules/engines/buffer
+
+pkglib_PROGRAMS += evas_buffer_simple
+evas_buffer_simple_SOURCES = evas-buffer-simple.c
+evas_buffer_simple_LDADD = $(top_builddir)/src/lib/libevas.la
+endif
+
+endif
+
+
+
+filesdir = $(datadir)/$(PACKAGE)/examples
+files_DATA =
+
+if INSTALL_EXAMPLES
+files_DATA += \
+       evas-buffer-simple.c
+endif
diff --git a/src/examples/evas-buffer-simple.c b/src/examples/evas-buffer-simple.c
new file mode 100644 (file)
index 0000000..6676ef1
--- /dev/null
@@ -0,0 +1,228 @@
+/**
+ * Simple Evas example using the Buffer engine.
+ *
+ * You must have Evas compiled with the buffer engine, and have the
+ * evas-software-buffer pkg-config files installed.
+ *
+ * Compile with:
+ *
+ * @verbatim
+ * gcc -o evas-buffer-simple evas-buffer-simple.c `pkg-config --libs --cflags evas evas-software-buffer`
+ * @endverbatim
+ *
+ */
+#include <Evas.h>
+#include <Evas_Engine_Buffer.h>
+#include <stdio.h>
+#include <errno.h>
+
+#define WIDTH (320)
+#define HEIGHT (240)
+
+/*
+ * create_canvas(), destroy_canvas() and draw_scene() are support functions.
+ *
+ * They are only required to use raw Evas, but for real world usage,
+ * it is recommended to use ecore and its ecore-evas submodule, that
+ * provide convenience canvas creators, integration with main loop and
+ * automatic render of updates (draw_scene()) when system goes back to
+ * main loop.
+ */
+static Evas *create_canvas(int width, int height);
+static void destroy_canvas(Evas *canvas);
+static void draw_scene(Evas *canvas);
+
+// support function to save scene as PPM image
+static void save_scene(Evas *canvas, const char *dest);
+
+int main(void)
+{
+   Evas *canvas;
+   Evas_Object *bg, *r1, *r2, *r3;
+
+   evas_init();
+
+   // create your canvas
+   // NOTE: consider using ecore_evas_buffer_new() instead!
+   canvas = create_canvas(WIDTH, HEIGHT);
+   if (!canvas)
+     return -1;
+
+   bg = evas_object_rectangle_add(canvas);
+   evas_object_color_set(bg, 255, 255, 255, 255); // white bg
+   evas_object_move(bg, 0, 0);                    // at origin
+   evas_object_resize(bg, WIDTH, HEIGHT);         // covers full canvas
+   evas_object_show(bg);
+
+   puts("initial scene, with just background:");
+   draw_scene(canvas);
+
+   r1 = evas_object_rectangle_add(canvas);
+   evas_object_color_set(r1, 255, 0, 0, 255); // 100% opaque red
+   evas_object_move(r1, 10, 10);
+   evas_object_resize(r1, 100, 100);
+   evas_object_show(r1);
+
+   // pay attention to transparency! Evas color values are pre-multiplied by
+   // alpha, so 50% opaque green is:
+   // non-premul: r=0, g=255, b=0    a=128 (50% alpha)
+   // premul:
+   //         r_premul = r * a / 255 =      0 * 128 / 255 =      0
+   //         g_premul = g * a / 255 =    255 * 128 / 255 =    128
+   //         b_premul = b * a / 255 =      0 * 128 / 255 =      0
+   //
+   // this 50% green is over a red background, so it will show in the
+   // final output as yellow (green + red = yellow)
+   r2 = evas_object_rectangle_add(canvas);
+   evas_object_color_set(r2, 0, 128, 0, 128); // 50% opaque green
+   evas_object_move(r2, 10, 10);
+   evas_object_resize(r2, 50, 50);
+   evas_object_show(r2);
+
+   r3 = evas_object_rectangle_add(canvas);
+   evas_object_color_set(r3, 0, 128, 0, 255); // 100% opaque dark green
+   evas_object_move(r3, 60, 60);
+   evas_object_resize(r3, 50, 50);
+   evas_object_show(r3);
+
+   puts("final scene (note updates):");
+   draw_scene(canvas);
+   save_scene(canvas, "/tmp/evas-buffer-simple-render.ppm");
+
+   // NOTE: use ecore_evas_buffer_new() and here ecore_evas_free()
+   destroy_canvas(canvas);
+
+   evas_shutdown();
+
+   return 0;
+}
+
+static Evas *create_canvas(int width, int height)
+{
+   Evas *canvas;
+   Evas_Engine_Info_Buffer *einfo;
+   int method;
+   void *pixels;
+
+   method = evas_render_method_lookup("buffer");
+   if (method <= 0)
+     {
+       fputs("ERROR: evas was not compiled with 'buffer' engine!\n", stderr);
+       return NULL;
+     }
+
+   canvas = evas_new();
+   if (!canvas)
+     {
+       fputs("ERROR: could not instantiate new evas canvas.\n", stderr);
+       return NULL;
+     }
+
+   evas_output_method_set(canvas, method);
+   evas_output_size_set(canvas, width, height);
+   evas_output_viewport_set(canvas, 0, 0, width, height);
+
+   einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(canvas);
+   if (!einfo)
+     {
+       fputs("ERROR: could not get evas engine info!\n", stderr);
+       evas_free(canvas);
+       return NULL;
+     }
+
+   // ARGB32 is sizeof(int), that is 4 bytes, per pixel
+   pixels = malloc(width * height * sizeof(int));
+   if (!pixels)
+     {
+       fputs("ERROR: could not allocate canvas pixels!\n", stderr);
+       evas_free(canvas);
+       return NULL;
+     }
+
+   einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
+   einfo->info.dest_buffer = pixels;
+   einfo->info.dest_buffer_row_bytes = width * sizeof(int);
+   einfo->info.use_color_key = 0;
+   einfo->info.alpha_threshold = 0;
+   einfo->info.func.new_update_region = NULL;
+   einfo->info.func.free_update_region = NULL;
+   evas_engine_info_set(canvas, (Evas_Engine_Info *)einfo);
+
+   return canvas;
+}
+
+static void destroy_canvas(Evas *canvas)
+{
+   Evas_Engine_Info_Buffer *einfo;
+
+   einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(canvas);
+   if (!einfo)
+     {
+       fputs("ERROR: could not get evas engine info!\n", stderr);
+       evas_free(canvas);
+       return;
+     }
+
+   free(einfo->info.dest_buffer);
+   evas_free(canvas);
+}
+
+static void draw_scene(Evas *canvas)
+{
+   Eina_List *updates, *n;
+   Eina_Rectangle *update;
+
+   // render and get the updated rectangles:
+   updates = evas_render_updates(canvas);
+
+   // informative only here, just print the updated areas:
+   EINA_LIST_FOREACH(updates, n, update)
+     printf("UPDATED REGION: pos: %3d, %3d    size: %3dx%3d\n",
+           update->x, update->y, update->w, update->h);
+
+   // free list of updates
+   evas_render_updates_free(updates);
+}
+
+static void save_scene(Evas *canvas, const char *dest)
+{
+   Evas_Engine_Info_Buffer *einfo;
+   const unsigned int *pixels, *pixels_end;
+   int width, height;
+   FILE *f;
+
+   einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(canvas);
+   if (!einfo)
+     {
+       fputs("ERROR: could not get evas engine info!\n", stderr);
+       return;
+     }
+   evas_output_size_get(canvas, &width, &height);
+
+   f = fopen(dest, "wb+");
+   if (!f)
+     {
+       fprintf(stderr, "ERROR: could not open for writing '%s': %s\n",
+               dest, strerror(errno));
+       return;
+     }
+
+   pixels = einfo->info.dest_buffer;
+   pixels_end = pixels + (width * height);
+
+   // PPM P6 format is dead simple to write:
+   fprintf(f, "P6\n%d %d\n255\n",  width, height);
+   for (; pixels < pixels_end; pixels++)
+     {
+       int r, g, b;
+
+       r = ((*pixels) & 0xff0000) >> 16;
+       g = ((*pixels) & 0x00ff00) >> 8;
+       b = (*pixels) & 0x0000ff;
+
+       fprintf(f, "%c%c%c", r, g, b);
+     }
+
+   fclose(f);
+   printf("saved scene as '%s'\n", dest);
+}
diff --git a/src/lib/.cvsignore b/src/lib/.cvsignore
new file mode 100644 (file)
index 0000000..84c11b0
--- /dev/null
@@ -0,0 +1,6 @@
+Makefile.in
+Makefile
+.deps
+.libs
+libevas.la
+main.lo
diff --git a/src/lib/Evas.h b/src/lib/Evas.h
new file mode 100644 (file)
index 0000000..0590049
--- /dev/null
@@ -0,0 +1,2265 @@
+#ifndef _EVAS_H
+#define _EVAS_H
+
+#include <time.h>
+
+#include <Eina.h>
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EVAS_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif /* ! DLL_EXPORT */
+# else
+#  define EAPI __declspec(dllimport)
+# endif /* ! EFL_EVAS_BUILD */
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+
+/**
+ * @file
+ * @brief These routines are used for Evas library interaction.
+ *
+ * @todo check boolean return values and convert to Eina_Bool
+ * @todo change all api to use EINA_SAFETY_*
+ * @todo finish api documentation
+ */
+
+
+/**
+ * Identifier of callbacks to be used with object or canvas.
+ *
+ * @see evas_object_event_callback_add()
+ * @see evas_event_callback_add()
+ */
+typedef enum _Evas_Callback_Type
+{
+   /*
+    * The following events are only for use with objects
+    * evas_object_event_callback_add():
+    */
+   EVAS_CALLBACK_MOUSE_IN, /**< Mouse In Event */
+   EVAS_CALLBACK_MOUSE_OUT, /**< Mouse Out Event */
+   EVAS_CALLBACK_MOUSE_DOWN, /**< Mouse Button Down Event */
+   EVAS_CALLBACK_MOUSE_UP, /**< Mouse Button Up Event */
+   EVAS_CALLBACK_MOUSE_MOVE, /**< Mouse Move Event */
+   EVAS_CALLBACK_MOUSE_WHEEL, /**< Mouse Wheel Event */
+   EVAS_CALLBACK_MULTI_DOWN, /**< Multi-touch Down Event */
+   EVAS_CALLBACK_MULTI_UP, /**< Multi-touch Up Event */
+   EVAS_CALLBACK_MULTI_MOVE, /**< Multi-touch Move Event */
+   EVAS_CALLBACK_FREE, /**< Object Being Freed (Called after Del) */
+   EVAS_CALLBACK_KEY_DOWN, /**< Key Press Event */
+   EVAS_CALLBACK_KEY_UP, /**< Key Release Event */
+   EVAS_CALLBACK_FOCUS_IN, /**< Focus In Event */
+   EVAS_CALLBACK_FOCUS_OUT, /**< Focus Out Event */
+   EVAS_CALLBACK_SHOW, /**< Show Event */
+   EVAS_CALLBACK_HIDE, /**< Hide Event */
+   EVAS_CALLBACK_MOVE, /**< Move Event */
+   EVAS_CALLBACK_RESIZE, /**< Resize Event */
+   EVAS_CALLBACK_RESTACK, /**< Restack Event */
+   EVAS_CALLBACK_DEL, /**< Object Being Deleted (called before Free) */
+   EVAS_CALLBACK_HOLD, /**< Events go on/off hold */
+   EVAS_CALLBACK_CHANGED_SIZE_HINTS, /**< Size hints changed event */
+   EVAS_CALLBACK_IMAGE_PRELOADED, /**< Image as been preloaded */
+
+
+   /*
+    * The following events are only for use with canvas
+    * evas_event_callback_add():
+    */
+
+   EVAS_CALLBACK_CANVAS_FOCUS_IN, /**< Canvas got focus as a whole */
+   EVAS_CALLBACK_CANVAS_FOCUS_OUT, /**< Canvas lost focus as a whole */
+   EVAS_CALLBACK_RENDER_FLUSH_PRE, /**< Called just before rendering is updated on the canvas target */
+   EVAS_CALLBACK_RENDER_FLUSH_POST, /**< Called just after rendering is updated on the canvas target */
+
+
+
+   /* the following id no event number, but a sentinel: */
+   EVAS_CALLBACK_LAST /**< keep as last element/sentinel -- not really an event */
+} Evas_Callback_Type; /**< The type of event to trigger the callback */
+
+/**
+ * Flags for Mouse Button events
+ */
+typedef enum _Evas_Button_Flags
+{
+   EVAS_BUTTON_NONE = 0, /**< No extra mouse button data */
+   EVAS_BUTTON_DOUBLE_CLICK = (1 << 0), /**< This mouse button press was the 2nd press of a double click */
+   EVAS_BUTTON_TRIPLE_CLICK = (1 << 1) /**< This mouse button press was the 3rd press of a triple click */
+} Evas_Button_Flags; /**< Flags for Mouse Button events */
+
+/**
+ * Flags for Events
+ */
+typedef enum _Evas_Event_Flags
+{
+   EVAS_EVENT_FLAG_NONE = 0, /**< No fancy flags set */
+   EVAS_EVENT_FLAG_ON_HOLD = (1 << 0) /**< This event is being delivered but should be put "on hold" until the on hold flag is unset. the event should be used for informational purposes and maybe some indications visually, but not actually perform anything */
+} Evas_Event_Flags; /**< Flags for Events */
+
+/**
+ * Flags for Font Hinting
+ * @ingroup Evas_Font_Group
+ */
+typedef enum _Evas_Font_Hinting_Flags
+{
+   EVAS_FONT_HINTING_NONE, /**< No font hinting */
+   EVAS_FONT_HINTING_AUTO, /**< Automatic font hinting */
+   EVAS_FONT_HINTING_BYTECODE /**< Bytecode font hinting */
+} Evas_Font_Hinting_Flags; /**< Flags for Font Hinting */
+
+/**
+ * Colorspaces for pixel data supported by Evas
+ * @ingroup Evas_Object_Image
+ */
+typedef enum _Evas_Colorspace
+{
+   EVAS_COLORSPACE_ARGB8888, /**< ARGB 32 bits per pixel, high-byte is Alpha, accessed 1 32bit word at a time */
+     /* these are not currently supported - but planned for the future */
+   EVAS_COLORSPACE_YCBCR422P601_PL, /**< YCbCr 4:2:2 Planar, ITU.BT-601 specifications. The data poitned to is just an array of row pointer, pointing to the Y rows, then the Cb, then Cr rows */
+   EVAS_COLORSPACE_YCBCR422P709_PL,/**< YCbCr 4:2:2 Planar, ITU.BT-709 specifications. The data poitned to is just an array of row pointer, pointing to the Y rows, then the Cb, then Cr rows */
+   EVAS_COLORSPACE_RGB565_A5P /**< 16bit rgb565 + Alpha plane at end - 5 bits of the 8 being used per alpha byte */
+} Evas_Colorspace; /**< Colorspaces for pixel data supported by Evas */
+
+/**
+ * How to pack items into cells in a table.
+ * @ingroup Evas_Object_Table
+ */
+typedef enum _Evas_Object_Table_Homogeneous_Mode
+{
+  EVAS_OBJECT_TABLE_HOMOGENEOUS_NONE = 0,
+  EVAS_OBJECT_TABLE_HOMOGENEOUS_TABLE = 1,
+  EVAS_OBJECT_TABLE_HOMOGENEOUS_ITEM = 2
+} Evas_Object_Table_Homogeneous_Mode; /**< Table cell pack mode. */
+
+typedef struct _Evas_Transform Evas_Transform; /**< An Evas projective or affine transform */
+typedef struct _Evas_Coord_Rectangle  Evas_Coord_Rectangle; /**< A generic rectangle handle */
+typedef struct _Evas_Point                   Evas_Point; /**< integer point */
+
+typedef struct _Evas_Coord_Point             Evas_Coord_Point;  /**< Evas_Coord point */
+typedef struct _Evas_Coord_Precision_Point   Evas_Coord_Precision_Point; /**< Evas_Coord point with sub-pixel precision */
+
+typedef struct _Evas_Position                Evas_Position; /**< associates given point in Canvas and Output */
+typedef struct _Evas_Precision_Position      Evas_Precision_Position; /**< associates given point in Canvas and Output, with sub-pixel precision */
+
+/**
+ * @typedef Evas_Smart_Class
+ * A smart object base class
+ * @ingroup Evas_Smart_Group
+ */
+typedef struct _Evas_Smart_Class             Evas_Smart_Class;
+
+/**
+ * @typedef Evas_Smart_Cb_Description
+ * A smart object callback description, used to provide introspection
+ * @ingroup Evas_Smart_Group
+ */
+typedef struct _Evas_Smart_Cb_Description    Evas_Smart_Cb_Description;
+
+/**
+ * @typedef Evas_Map
+ * An opaque handle to map points
+ * @see evas_map_new()
+ * @see evas_map_free()
+ * @see evas_map_dup()
+ * @ingroup Evas_Object_Group_Map
+ */
+typedef struct _Evas_Map              Evas_Map;
+
+/**
+ * @typedef Evas
+ * An Evas canvas handle.
+ * @see evas_new()
+ * @see evas_free()
+ * @ingroup Evas_Canvas
+ */
+typedef struct _Evas Evas;
+
+/**
+ * @typedef Evas_Object
+ * An Evas Object handle.
+ * @ingroup Evas_Object_Group
+ */
+typedef struct _Evas_Object Evas_Object;
+
+typedef void Evas_Performance; /**< An Evas Performance handle */
+typedef struct _Evas_Modifier Evas_Modifier; /**< An Evas Modifier */
+typedef struct _Evas_Lock Evas_Lock; /**< An Evas Lock */
+typedef struct _Evas_Smart Evas_Smart; /**< An Evas Smart Object handle */
+typedef struct _Evas_Native_Surface Evas_Native_Surface; /**< A generic datatype for engine specific native surface information */
+typedef unsigned long long Evas_Modifier_Mask; /**< An Evas modifier mask type */
+
+typedef int           Evas_Coord;
+typedef int           Evas_Font_Size;
+typedef int           Evas_Angle;
+
+struct _Evas_Transform /** An affine or projective coordinate transformation matrix */
+{
+   float mxx, mxy, mxz;
+   float myx, myy, myz;
+   float mzx, mzy, mzz;
+};
+
+struct _Evas_Coord_Rectangle /**< A rectangle in Evas_Coord */
+{
+   Evas_Coord x; /**< top-left x co-ordinate of rectangle */
+   Evas_Coord y; /**< top-left y co-ordinate of rectangle */
+   Evas_Coord w; /**< width of rectangle */
+   Evas_Coord h; /**< height of rectangle */
+};
+
+struct _Evas_Point
+{
+   int x, y;
+};
+
+struct _Evas_Coord_Point
+{
+   Evas_Coord x, y;
+};
+
+struct _Evas_Coord_Precision_Point
+{
+   Evas_Coord x, y;
+   double xsub, ysub;
+};
+
+struct _Evas_Position
+{
+    Evas_Point output;
+    Evas_Coord_Point canvas;
+};
+
+struct _Evas_Precision_Position
+{
+    Evas_Point output;
+    Evas_Coord_Precision_Point canvas;
+};
+
+typedef enum _Evas_Aspect_Control
+{
+   EVAS_ASPECT_CONTROL_NONE = 0,
+   EVAS_ASPECT_CONTROL_NEITHER = 1,
+   EVAS_ASPECT_CONTROL_HORIZONTAL = 2,
+   EVAS_ASPECT_CONTROL_VERTICAL = 3,
+   EVAS_ASPECT_CONTROL_BOTH = 4
+} Evas_Aspect_Control;
+
+
+typedef struct _Evas_Pixel_Import_Source Evas_Pixel_Import_Source; /**< A source description of pixels for importing pixels */
+typedef struct _Evas_Engine_Info      Evas_Engine_Info; /**< A generic Evas Engine information structure */
+typedef struct _Evas_Device           Evas_Device; /**< A source device handle - where the event came from */
+typedef struct _Evas_Event_Mouse_Down Evas_Event_Mouse_Down; /**< Event structure for #EVAS_CALLBACK_MOUSE_DOWN event callbacks */
+typedef struct _Evas_Event_Mouse_Up   Evas_Event_Mouse_Up; /**< Event structure for #EVAS_CALLBACK_MOUSE_UP event callbacks */
+typedef struct _Evas_Event_Mouse_In   Evas_Event_Mouse_In; /**< Event structure for #EVAS_CALLBACK_MOUSE_IN event callbacks */
+typedef struct _Evas_Event_Mouse_Out  Evas_Event_Mouse_Out; /**< Event structure for #EVAS_CALLBACK_MOUSE_OUT event callbacks */
+typedef struct _Evas_Event_Mouse_Move Evas_Event_Mouse_Move; /**< Event structure for #EVAS_CALLBACK_MOUSE_MOVE event callbacks */
+typedef struct _Evas_Event_Mouse_Wheel Evas_Event_Mouse_Wheel; /**< Event structure for #EVAS_CALLBACK_MOUSE_WHEEL event callbacks */
+typedef struct _Evas_Event_Multi_Down Evas_Event_Multi_Down; /**< Event structure for #EVAS_CALLBACK_MULTI_DOWN event callbacks */
+typedef struct _Evas_Event_Multi_Up   Evas_Event_Multi_Up; /**< Event structure for #EVAS_CALLBACK_MULTI_UP event callbacks */
+typedef struct _Evas_Event_Multi_Move Evas_Event_Multi_Move; /**< Event structure for #EVAS_CALLBACK_MULTI_MOVE event callbacks */
+typedef struct _Evas_Event_Key_Down   Evas_Event_Key_Down; /**< Event structure for #EVAS_CALLBACK_KEY_DOWN event callbacks */
+typedef struct _Evas_Event_Key_Up     Evas_Event_Key_Up; /**< Event structure for #EVAS_CALLBACK_KEY_UP event callbacks */
+typedef struct _Evas_Event_Hold       Evas_Event_Hold; /**< Event structure for #EVAS_CALLBACK_HOLD event callbacks */
+
+/* load error identifiers, see evas_load_error_str() */
+#define EVAS_LOAD_ERROR_NONE                       0 /**< No error on load */
+#define EVAS_LOAD_ERROR_GENERIC                    1 /**< A non-specific error occured */
+#define EVAS_LOAD_ERROR_DOES_NOT_EXIST             2 /**< File (or file path) does not exist */
+#define EVAS_LOAD_ERROR_PERMISSION_DENIED          3 /**< Permission deinied to an existing file (or path) */
+#define EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED 4 /**< Allocation of resources failure prevented load */
+#define EVAS_LOAD_ERROR_CORRUPT_FILE               5 /**< File corrupt (but was detected as a known format) */
+#define EVAS_LOAD_ERROR_UNKNOWN_FORMAT             6 /**< File is not a known format */
+
+#define EVAS_ALLOC_ERROR_NONE                      0 /**< No allocation error */
+#define EVAS_ALLOC_ERROR_FATAL                     1 /**< Allocation failed despite attempts to free up memory */
+#define EVAS_ALLOC_ERROR_RECOVERED                 2 /**< Allocation succeeded, but extra memory had to be found by freeing up speculative resources */
+
+#define EVAS_TEXT_INVALID -1
+#define EVAS_TEXT_SPECIAL -2
+
+struct _Evas_Pixel_Import_Source
+{
+   int format; /**< pixel format type ie ARGB32, YUV420P_601 etc. */
+   int w, h; /**< width and height of source in pixels */
+   void **rows; /**< an array of pointers (size depends on format) pointing to left edge of each scanline */
+};
+
+struct _Evas_Native_Surface
+{
+   union {
+      struct {
+         void *visual;
+         long  pixmap;
+      } x11;
+      struct { /* padding data for future use - have space for 8 pointers */
+         void *d[8];
+      } padding;
+   } data;
+};
+
+#define EVAS_LAYER_MIN -32768 /**< bottom-most layer number */
+#define EVAS_LAYER_MAX 32767  /**< top-most layer number */
+
+#define EVAS_PIXEL_FORMAT_NONE                     0 /**< No pixel format */
+#define EVAS_PIXEL_FORMAT_ARGB32                   1 /**< ARGB 32bit pixel format with A in the high byte per 32bit pixel word */
+#define EVAS_PIXEL_FORMAT_YUV420P_601              2 /**< YUV 420 Planar format with CCIR 601 color encoding wuth contiguous planes in the order Y, U and V */
+
+#define EVAS_COLOR_SPACE_ARGB                      0 /**< ARGB color space */
+#define EVAS_COLOR_SPACE_AHSV                      1 /**< AHSV color space */
+
+#define EVAS_TEXTURE_REFLECT            0 /**< Gradient and image fill tiling mode - tiling reflects */
+#define EVAS_TEXTURE_REPEAT             1 /**< tiling repeats */
+#define EVAS_TEXTURE_RESTRICT           2 /**< tiling clamps - range offset ignored */
+#define EVAS_TEXTURE_RESTRICT_REFLECT   3 /**< tiling clamps and any range offset reflects */
+#define EVAS_TEXTURE_RESTRICT_REPEAT    4 /**< tiling clamps and any range offset repeats */
+#define EVAS_TEXTURE_PAD                5 /**< tiling extends with end values */
+
+#define EVAS_HINT_EXPAND  1.0 /**< Use with evas_object_size_hint_weight_set(), evas_object_size_hint_weight_get(), evas_object_size_hint_expand_set(), evas_object_size_hint_expand_get() */
+#define EVAS_HINT_FILL   -1.0 /**< Use with evas_object_size_hint_align_set(), evas_object_size_hint_align_get(), evas_object_size_hint_fill_set(), evas_object_size_hint_fill_get() */
+#define evas_object_size_hint_fill_set evas_object_size_hint_align_set /**< Convenience macro to make it easier to understand that align is also used for fill properties (as fill is mutually exclusive to align) */
+#define evas_object_size_hint_fill_get evas_object_size_hint_align_get /**< Convenience macro to make it easier to understand that align is also used for fill properties (as fill is mutually exclusive to align) */
+#define evas_object_size_hint_expand_set evas_object_size_hint_weight_set /**< Convenience macro to make it easier to understand that weight is also used for expand properties */
+#define evas_object_size_hint_expand_get evas_object_size_hint_weight_get /**< Convenience macro to make it easier to understand that weight is also used for expand properties */
+
+/**
+ * How the object should be rendered to output.
+ * @ingroup Evas_Object_Group_Extras
+ */
+typedef enum _Evas_Render_Op
+{
+   EVAS_RENDER_BLEND = 0, /**< default op: d = d*(1-sa) + s */
+   EVAS_RENDER_BLEND_REL = 1, /**< d = d*(1 - sa) + s*da */
+   EVAS_RENDER_COPY = 2, /**< d = s */
+   EVAS_RENDER_COPY_REL = 3, /**< d = s*da */
+   EVAS_RENDER_ADD = 4, /**< d = d + s */
+   EVAS_RENDER_ADD_REL = 5, /**< d = d + s*da */
+   EVAS_RENDER_SUB = 6, /**< d = d - s */
+   EVAS_RENDER_SUB_REL = 7, /**< d = d - s*da */
+   EVAS_RENDER_TINT = 8, /**< d = d*s + d*(1 - sa) + s*(1 - da) */
+   EVAS_RENDER_TINT_REL = 9, /**< d = d*(1 - sa + s) */
+   EVAS_RENDER_MASK = 10, /**< d = d*sa */
+   EVAS_RENDER_MUL = 11 /**< d = d*s */
+} Evas_Render_Op; /**< How the object should be rendered to output. */
+
+typedef enum _Evas_Border_Fill_Mode
+{
+   EVAS_BORDER_FILL_NONE = 0,
+   EVAS_BORDER_FILL_DEFAULT = 1,
+   EVAS_BORDER_FILL_SOLID = 2
+} Evas_Border_Fill_Mode;
+
+typedef enum _Evas_Image_Scale_Hint
+{
+   EVAS_IMAGE_SCALE_HINT_NONE = 0,
+   EVAS_IMAGE_SCALE_HINT_DYNAMIC = 1,
+   EVAS_IMAGE_SCALE_HINT_STATIC = 2
+} Evas_Image_Scale_Hint;
+
+typedef enum _Evas_Image_Content_Hint
+{
+   EVAS_IMAGE_CONTENT_HINT_NONE = 0,
+   EVAS_IMAGE_CONTENT_HINT_DYNAMIC = 1,
+   EVAS_IMAGE_CONTENT_HINT_STATIC = 2
+} Evas_Image_Content_Hint;
+
+struct _Evas_Engine_Info /** Generic engine information. Generic info is useless */
+{
+   int magic; /**< Magic number */
+};
+
+struct _Evas_Event_Mouse_Down /** Mouse button press event */
+{
+   int button; /**< Mouse button number that went down (1 - 32) */
+
+   Evas_Point output;
+   Evas_Coord_Point canvas;
+
+   void          *data;
+   Evas_Modifier *modifiers;
+   Evas_Lock     *locks;
+
+   Evas_Button_Flags flags;
+   unsigned int      timestamp;
+   Evas_Event_Flags  event_flags;
+   Evas_Device      *dev;
+};
+
+struct _Evas_Event_Mouse_Up /** Mouse button release event */
+{
+   int button; /**< Mouse button number that was raised (1 - 32) */
+
+   Evas_Point output;
+   Evas_Coord_Point canvas;
+
+   void          *data;
+   Evas_Modifier *modifiers;
+   Evas_Lock     *locks;
+
+   Evas_Button_Flags flags;
+   unsigned int      timestamp;
+   Evas_Event_Flags  event_flags;
+   Evas_Device      *dev;
+};
+
+struct _Evas_Event_Mouse_In /** Mouse enter event */
+{
+   int buttons; /**< Button pressed mask, Bits set to 1 are buttons currently pressed (bit 0 = mouse button 1, bit 1 = mouse button 2 etc.) */
+
+   Evas_Point output;
+   Evas_Coord_Point canvas;
+
+   void          *data;
+   Evas_Modifier *modifiers;
+   Evas_Lock     *locks;
+   unsigned int   timestamp;
+   Evas_Event_Flags  event_flags;
+   Evas_Device      *dev;
+};
+
+struct _Evas_Event_Mouse_Out /** Mouse leave event */
+{
+   int buttons; /**< Button pressed mask, Bits set to 1 are buttons currently pressed (bit 0 = mouse button 1, bit 1 = mouse button 2 etc.) */
+
+
+   Evas_Point output;
+   Evas_Coord_Point canvas;
+
+   void          *data;
+   Evas_Modifier *modifiers;
+   Evas_Lock     *locks;
+   unsigned int   timestamp;
+   Evas_Event_Flags  event_flags;
+   Evas_Device      *dev;
+};
+
+struct _Evas_Event_Mouse_Move /** Mouse button down event */
+{
+   int buttons; /**< Button pressed mask, Bits set to 1 are buttons currently pressed (bit 0 = mouse button 1, bit 1 = mouse button 2 etc.) */
+
+   Evas_Position cur, prev;
+
+   void          *data;
+   Evas_Modifier *modifiers;
+   Evas_Lock     *locks;
+   unsigned int   timestamp;
+   Evas_Event_Flags  event_flags;
+   Evas_Device      *dev;
+};
+
+struct _Evas_Event_Mouse_Wheel /** Wheel event */
+{
+   int direction; /* 0 = default up/down wheel FIXME: more wheel types */
+   int z; /* ...,-2,-1 = down, 1,2,... = up */
+
+   Evas_Point output;
+   Evas_Coord_Point canvas;
+
+   void          *data;
+   Evas_Modifier *modifiers;
+   Evas_Lock     *locks;
+   unsigned int   timestamp;
+   Evas_Event_Flags  event_flags;
+   Evas_Device      *dev;
+};
+
+struct _Evas_Event_Multi_Down /** Multi button press event */
+{
+   int device; /**< Multi device number that went down (1 or more for extra touches) */
+   double radius, radius_x, radius_y;
+   double pressure, angle;
+
+   Evas_Point output;
+   Evas_Coord_Precision_Point canvas;
+
+   void          *data;
+   Evas_Modifier *modifiers;
+   Evas_Lock     *locks;
+
+   Evas_Button_Flags flags;
+   unsigned int      timestamp;
+   Evas_Event_Flags  event_flags;
+   Evas_Device      *dev;
+};
+
+struct _Evas_Event_Multi_Up /** Multi button release event */
+{
+   int device; /**< Multi device number that went up (1 or more for extra touches) */
+   double radius, radius_x, radius_y;
+   double pressure, angle;
+
+   Evas_Point output;
+   Evas_Coord_Precision_Point canvas;
+
+   void          *data;
+   Evas_Modifier *modifiers;
+   Evas_Lock     *locks;
+
+   Evas_Button_Flags flags;
+   unsigned int      timestamp;
+   Evas_Event_Flags  event_flags;
+   Evas_Device      *dev;
+};
+
+struct _Evas_Event_Multi_Move /** Multi button down event */
+{
+   int device; /**< Multi device number that moved (1 or more for extra touches) */
+   double radius, radius_x, radius_y;
+   double pressure, angle;
+
+   Evas_Precision_Position cur;
+
+   void          *data;
+   Evas_Modifier *modifiers;
+   Evas_Lock     *locks;
+   unsigned int   timestamp;
+   Evas_Event_Flags  event_flags;
+   Evas_Device      *dev;
+};
+
+struct _Evas_Event_Key_Down /** Key press event */
+{
+   char          *keyname; /**< The string name of the key pressed */
+   void          *data;
+   Evas_Modifier *modifiers;
+   Evas_Lock     *locks;
+
+   const char    *key; /**< The logical key : (eg shift+1 == exclamation) */
+   const char    *string; /**< A UTF8 string if this keystroke has produced a visible string to be ADDED */
+   const char    *compose; /**< A UTF8 string if this keystroke has modified a string in the middle of being composed - this string replaces the previous one */
+   unsigned int   timestamp;
+   Evas_Event_Flags  event_flags;
+   Evas_Device      *dev;
+};
+
+struct _Evas_Event_Key_Up /** Key release event */
+{
+   char          *keyname; /**< The string name of the key released */
+   void          *data;
+   Evas_Modifier *modifiers;
+   Evas_Lock     *locks;
+
+   const char    *key; /**< The logical key : (eg shift+1 == exclamation) */
+   const char    *string; /**< A UTF8 string if this keystroke has produced a visible string to be ADDED */
+   const char    *compose; /**< A UTF8 string if this keystroke has modified a string in the middle of being composed - this string replaces the previous one */
+   unsigned int   timestamp;
+   Evas_Event_Flags  event_flags;
+   Evas_Device      *dev;
+};
+
+struct _Evas_Event_Hold /** Hold change event */
+{
+   int            hold; /**< The hold flag */
+   void          *data;
+
+   unsigned int   timestamp;
+   Evas_Event_Flags  event_flags;
+   Evas_Device      *dev;
+};
+
+/**
+ * How mouse pointer should be handled by Evas.
+ *
+ * If #EVAS_OBJECT_POINTER_MODE_AUTOGRAB, then when mouse is down an
+ * object, then moves outside of it, the pointer still behaves as
+ * being bound to the object, albeit out of its drawing region. On
+ * mouse up, the event will be feed to the object, that may check if
+ * the final position is over or not and do something about it.
+ *
+ * @ingroup Evas_Object_Group_Extras
+ */
+typedef enum _Evas_Object_Pointer_Mode
+{
+   EVAS_OBJECT_POINTER_MODE_AUTOGRAB, /**< default, X11-like */
+   EVAS_OBJECT_POINTER_MODE_NOGRAB
+} Evas_Object_Pointer_Mode; /**< How mouse pointer should be handled by Evas. */
+
+typedef void      (*Evas_Smart_Cb) (void *data, Evas_Object *obj, void *event_info);
+typedef void      (*Evas_Event_Cb) (void *data, Evas *e, void *event_info);
+typedef Eina_Bool (*Evas_Object_Event_Post_Cb) (void *data, Evas *e);
+typedef void      (*Evas_Object_Event_Cb) (void *data, Evas *e, Evas_Object *obj, void *event_info);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup Evas_Group Top Level Functions
+ *
+ * Functions that affect Evas as a whole.
+ */
+   EAPI int               evas_init                         (void);
+   EAPI int               evas_shutdown                     (void);
+
+   EAPI int               evas_alloc_error                  (void);
+
+   EAPI int               evas_async_events_fd_get          (void) EINA_WARN_UNUSED_RESULT EINA_PURE;
+   EAPI int               evas_async_events_process         (void);
+   EAPI Eina_Bool         evas_async_events_put             (const void *target, Evas_Callback_Type type, void *event_info, void (*func)(void *target, Evas_Callback_Type type, void *event_info)) EINA_ARG_NONNULL(1, 4);
+
+/**
+ * @defgroup Evas_Canvas Canvas Functions
+ *
+ * Functions that deal with the basic evas object.  They are the
+ * functions you need to use at a minimum to get a working evas, and
+ * to destroy it.
+ *
+ */
+
+   EAPI Evas             *evas_new                          (void) EINA_WARN_UNUSED_RESULT EINA_MALLOC;
+   EAPI void              evas_free                         (Evas *e)  EINA_ARG_NONNULL(1);
+
+   EAPI void              evas_focus_in                     (Evas *e);
+   EAPI void              evas_focus_out                    (Evas *e);
+   EAPI Eina_Bool         evas_focus_state_get              (const Evas *e) EINA_PURE;
+
+   EAPI void              evas_data_attach_set              (Evas *e, void *data) EINA_ARG_NONNULL(1);
+   EAPI void             *evas_data_attach_get              (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void              evas_damage_rectangle_add         (Evas *e, int x, int y, int w, int h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_obscured_rectangle_add       (Evas *e, int x, int y, int w, int h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_obscured_clear               (Evas *e) EINA_ARG_NONNULL(1);
+   EAPI Eina_List        *evas_render_updates               (Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
+   EAPI void              evas_render_updates_free          (Eina_List *updates);
+   EAPI void              evas_render                       (Evas *e) EINA_ARG_NONNULL(1);
+   EAPI void              evas_norender                     (Evas *e) EINA_ARG_NONNULL(1);
+   EAPI void              evas_render_idle_flush            (Evas *e) EINA_ARG_NONNULL(1);
+   EAPI void              evas_render_dump                  (Evas *e) EINA_ARG_NONNULL(1);
+
+/**
+ * @defgroup Evas_Output_Method Render Engine Functions
+ *
+ * Functions that are used to set the render engine for a given
+ * function, and then get that engine working.
+ *
+ * The following code snippet shows how they can be used to
+ * initialise an evas that uses the X11 software engine:
+ * @code
+ * Evas *evas;
+ * Evas_Engine_Info_Software_X11 *einfo;
+ * extern Display *display;
+ * extern Window win;
+ *
+ * evas_init();
+ *
+ * evas = evas_new();
+ * evas_output_method_set(evas, evas_render_method_lookup("software_x11"));
+ * evas_output_size_set(evas, 640, 480);
+ * evas_output_viewport_set(evas, 0, 0, 640, 480);
+ * einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(evas);
+ * einfo->info.display = display;
+ * einfo->info.visual = DefaultVisual(display, DefaultScreen(display));
+ * einfo->info.colormap = DefaultColormap(display, DefaultScreen(display));
+ * einfo->info.drawable = win;
+ * einfo->info.depth = DefaultDepth(display, DefaultScreen(display));
+ * evas_engine_info_set(evas, (Evas_Engine_Info *)einfo);
+ * @endcode
+ *
+ * @ingroup Evas_Canvas
+ */
+   EAPI int               evas_render_method_lookup         (const char *name) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
+   EAPI Eina_List        *evas_render_method_list           (void) EINA_WARN_UNUSED_RESULT;
+   EAPI void              evas_render_method_list_free      (Eina_List *list);
+
+   EAPI void              evas_output_method_set            (Evas *e, int render_method) EINA_ARG_NONNULL(1);
+   EAPI int               evas_output_method_get            (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI Evas_Engine_Info *evas_engine_info_get              (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI int               evas_engine_info_set              (Evas *e, Evas_Engine_Info *info) EINA_ARG_NONNULL(1);
+
+/**
+ * @defgroup Evas_Output_Size Output and Viewport Resizing Functions
+ *
+ * Functions that set and retrieve the output and viewport size of an
+ * evas.
+ *
+ * @ingroup Evas_Canvas
+ */
+   EAPI void              evas_output_size_set              (Evas *e, int w, int h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_output_size_get              (const Evas *e, int *w, int *h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_output_viewport_set          (Evas *e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_output_viewport_get          (const Evas *e, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) EINA_ARG_NONNULL(1);
+
+/**
+ * @defgroup Evas_Coord_Mapping_Group Coordinate Mapping Functions
+ *
+ * Functions that are used to map coordinates from the canvas to the
+ * screen or the screen to the canvas.
+ *
+ * @ingroup Evas_Canvas
+ */
+   EAPI Evas_Coord        evas_coord_screen_x_to_world      (const Evas *e, int x) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
+   EAPI Evas_Coord        evas_coord_screen_y_to_world      (const Evas *e, int y) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
+   EAPI int               evas_coord_world_x_to_screen      (const Evas *e, Evas_Coord x) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
+   EAPI int               evas_coord_world_y_to_screen      (const Evas *e, Evas_Coord y) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
+
+/**
+ * @defgroup Evas_Pointer_Group Pointer (Mouse) Functions
+ *
+ * Functions that deal with the status of the pointer (mouse cursor).
+ *
+ * @ingroup Evas_Canvas
+ */
+   EAPI void              evas_pointer_output_xy_get        (const Evas *e, int *x, int *y) EINA_ARG_NONNULL(1);
+   EAPI void              evas_pointer_canvas_xy_get        (const Evas *e, Evas_Coord *x, Evas_Coord *y) EINA_ARG_NONNULL(1);
+   EAPI int               evas_pointer_button_down_mask_get (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool         evas_pointer_inside_get           (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
+
+
+/**
+ * @defgroup Evas_Event_Freezing_Group Event Freezing Functions
+ *
+ * Functions that deal with the freezing of event processing of an
+ * evas.
+ *
+ * @ingroup Evas_Canvas
+ */
+   EAPI void              evas_event_freeze                 (Evas *e) EINA_ARG_NONNULL(1);
+   EAPI void              evas_event_thaw                   (Evas *e) EINA_ARG_NONNULL(1);
+   EAPI int               evas_event_freeze_get             (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+/**
+ * @defgroup Evas_Event_Feeding_Group Event Feeding Functions
+ *
+ * Functions to tell Evas that events happened and should be
+ * processed.
+ *
+ * As explained in @ref intro_not_evas, Evas does not know how to poll
+ * for events, so the developer should do it and then feed such events
+ * to the canvas to be processed. This is only required if operating
+ * Evas directly as modules such as Ecore_Evas does that for you.
+ *
+ * @ingroup Evas_Canvas
+ */
+   EAPI void              evas_event_feed_mouse_down        (Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data) EINA_ARG_NONNULL(1);
+   EAPI void              evas_event_feed_mouse_up          (Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data) EINA_ARG_NONNULL(1);
+   EAPI void              evas_event_feed_mouse_move        (Evas *e, int x, int y, unsigned int timestamp, const void *data) EINA_ARG_NONNULL(1);
+   EAPI void              evas_event_feed_mouse_in          (Evas *e, unsigned int timestamp, const void *data) EINA_ARG_NONNULL(1);
+   EAPI void              evas_event_feed_mouse_out         (Evas *e, unsigned int timestamp, const void *data) EINA_ARG_NONNULL(1);
+   EAPI void              evas_event_feed_multi_down        (Evas *e, int d, int x, int y, double rad, double radx, double rady, double pres, double ang, double fx, double fy, Evas_Button_Flags flags, unsigned int timestamp, const void *data);
+   EAPI void              evas_event_feed_multi_up          (Evas *e, int d, int x, int y, double rad, double radx, double rady, double pres, double ang, double fx, double fy, Evas_Button_Flags flags, unsigned int timestamp, const void *data);
+   EAPI void              evas_event_feed_multi_move        (Evas *e, int d, int x, int y, double rad, double radx, double rady, double pres, double ang, double fx, double fy, unsigned int timestamp, const void *data);
+   EAPI void              evas_event_feed_mouse_cancel      (Evas *e, unsigned int timestamp, const void *data) EINA_ARG_NONNULL(1);
+   EAPI void              evas_event_feed_mouse_wheel       (Evas *e, int direction, int z, unsigned int timestamp, const void *data) EINA_ARG_NONNULL(1);
+   EAPI void              evas_event_feed_key_down          (Evas *e, const char *keyname, const char *key, const char *string, const char *compose, unsigned int timestamp, const void *data) EINA_ARG_NONNULL(1);
+   EAPI void              evas_event_feed_key_up            (Evas *e, const char *keyname, const char *key, const char *string, const char *compose, unsigned int timestamp, const void *data) EINA_ARG_NONNULL(1);
+   EAPI void              evas_event_feed_hold              (Evas *e, int hold, unsigned int timestamp, const void *data) EINA_ARG_NONNULL(1);
+
+/**
+ * @defgroup Evas_Canvas_Events Canvas Events
+ *
+ * Canvas generates some events
+ *
+ * @ingroup Evas_Canvas
+ */
+
+   EAPI void              evas_event_callback_add              (Evas *e, Evas_Callback_Type type, Evas_Event_Cb func, const void *data) EINA_ARG_NONNULL(1, 3);
+   EAPI void             *evas_event_callback_del              (Evas *e, Evas_Callback_Type type, Evas_Event_Cb func) EINA_ARG_NONNULL(1, 3);
+   EAPI void             *evas_event_callback_del_full         (Evas *e, Evas_Callback_Type type, Evas_Event_Cb func, const void *data) EINA_ARG_NONNULL(1, 3);
+   EAPI void              evas_post_event_callback_push        (Evas *e, Evas_Object_Event_Post_Cb func, const void *data);
+   EAPI void              evas_post_event_callback_remove      (Evas *e, Evas_Object_Event_Post_Cb func);
+   EAPI void              evas_post_event_callback_remove_full (Evas *e, Evas_Object_Event_Post_Cb func, const void *data);
+       
+/**
+ * @defgroup Evas_Image_Group Image Functions
+ *
+ * Functions that deals with images at canvas level.
+ *
+ * @ingroup Evas_Canvas
+ */
+   EAPI void              evas_image_cache_flush            (Evas *e) EINA_ARG_NONNULL(1);
+   EAPI void              evas_image_cache_reload           (Evas *e) EINA_ARG_NONNULL(1);
+   EAPI void              evas_image_cache_set              (Evas *e, int size) EINA_ARG_NONNULL(1);
+   EAPI int               evas_image_cache_get              (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+
+/**
+ * @defgroup Evas_Font_Group Font Functions
+ *
+ * Functions that deals with fonts.
+ *
+ * @ingroup Evas_Canvas
+ */
+   EAPI void              evas_font_hinting_set             (Evas *e, Evas_Font_Hinting_Flags hinting) EINA_ARG_NONNULL(1);
+   EAPI Evas_Font_Hinting_Flags evas_font_hinting_get       (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Eina_Bool         evas_font_hinting_can_hint        (const Evas *e, Evas_Font_Hinting_Flags hinting) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void              evas_font_cache_flush             (Evas *e) EINA_ARG_NONNULL(1);
+   EAPI void              evas_font_cache_set               (Evas *e, int size) EINA_ARG_NONNULL(1);
+   EAPI int               evas_font_cache_get               (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI Eina_List        *evas_font_available_list          (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_font_available_list_free     (Evas *e, Eina_List *available) EINA_ARG_NONNULL(1);
+
+/**
+ * @defgroup Evas_Font_Path_Group Font Path Functions
+ *
+ * Functions that edit the paths being used to load fonts.
+ *
+ * @ingroup Evas_Font_Group
+ */
+   EAPI void              evas_font_path_clear              (Evas *e) EINA_ARG_NONNULL(1);
+   EAPI void              evas_font_path_append             (Evas *e, const char *path) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_font_path_prepend            (Evas *e, const char *path) EINA_ARG_NONNULL(1, 2);
+   EAPI const Eina_List  *evas_font_path_list               (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+/**
+ * @defgroup Evas_Object_Group Generic Object Functions
+ *
+ * Functions that manipulate generic evas objects.
+ */
+
+/**
+ * @defgroup Evas_Object_Group_Basic Basic Object Manipulation
+ *
+ * Methods that are often used, like those that change the color,
+ * clippers and geometry of the object.
+ *
+ * @ingroup Evas_Object_Group
+ */
+   EAPI void              evas_object_clip_set              (Evas_Object *obj, Evas_Object *clip) EINA_ARG_NONNULL(1, 2);
+   EAPI Evas_Object      *evas_object_clip_get              (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_clip_unset            (Evas_Object *obj);
+   EAPI const Eina_List  *evas_object_clipees_get           (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void              evas_object_focus_set             (Evas_Object *obj, Eina_Bool focus) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool         evas_object_focus_get             (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void              evas_object_layer_set             (Evas_Object *obj, short l) EINA_ARG_NONNULL(1);
+   EAPI short             evas_object_layer_get             (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void              evas_object_name_set              (Evas_Object *obj, const char *name) EINA_ARG_NONNULL(1);
+   EAPI const char       *evas_object_name_get              (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void              evas_object_del                   (Evas_Object *obj) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_move                  (Evas_Object *obj, Evas_Coord x, Evas_Coord y) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_resize                (Evas_Object *obj, Evas_Coord w, Evas_Coord h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_geometry_get          (const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) EINA_ARG_NONNULL(1);
+
+   EAPI void              evas_object_show                  (Evas_Object *obj) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_hide                  (Evas_Object *obj) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool         evas_object_visible_get           (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void              evas_object_color_set             (Evas_Object *obj, int r, int g, int b, int a) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_color_get             (const Evas_Object *obj, int *r, int *g, int *b, int *a) EINA_ARG_NONNULL(1);
+
+   EAPI Evas             *evas_object_evas_get              (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI const char       *evas_object_type_get              (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void              evas_object_raise                 (Evas_Object *obj) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_lower                 (Evas_Object *obj) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_stack_above           (Evas_Object *obj, Evas_Object *above) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_stack_below           (Evas_Object *obj, Evas_Object *below) EINA_ARG_NONNULL(1, 2);
+   EAPI Evas_Object      *evas_object_above_get             (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Evas_Object      *evas_object_below_get             (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+
+/**
+ * @defgroup Evas_Object_Group_Events Object Events
+ *
+ * Objects generates events when they are moved, resized, when their
+ * visibility change, when they are deleted and so on. These methods
+ * will allow one to handle such events.
+ *
+ * The events can be those from keyboard and mouse, if the object
+ * accepts these events.
+ *
+ * @ingroup Evas_Object_Group
+ */
+   EAPI void              evas_object_event_callback_add    (Evas_Object *obj, Evas_Callback_Type type, Evas_Object_Event_Cb func, const void *data) EINA_ARG_NONNULL(1, 3);
+  EAPI void             *evas_object_event_callback_del    (Evas_Object *obj, Evas_Callback_Type type, Evas_Object_Event_Cb func) EINA_ARG_NONNULL(1, 3);
+   EAPI void             *evas_object_event_callback_del_full(Evas_Object *obj, Evas_Callback_Type type, Evas_Object_Event_Cb func, const void *data) EINA_ARG_NONNULL(1, 3);
+
+   EAPI void              evas_object_pass_events_set       (Evas_Object *obj, Eina_Bool pass) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool         evas_object_pass_events_get       (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_repeat_events_set     (Evas_Object *obj, Eina_Bool repeat) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool         evas_object_repeat_events_get     (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_propagate_events_set  (Evas_Object *obj, Eina_Bool prop) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool         evas_object_propagate_events_get  (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+/**
+ * @defgroup Evas_Object_Group_Map UV Mapping (Rotation, Perspecitve, 3D...)
+ *
+ * Evas allows different transformations to be applied to all kinds of
+ * objects. These are applied by means of UV mapping.
+ *
+ * With UV mapping, one maps points in the source object to a 3D space
+ * positioning at target. This allows rotation, perspective, scale and
+ * lots of other effects, depending on the map that is used.
+ *
+ * Each map point may carry a multiplier color. If properly
+ * calculated, these can do shading effects on the object, producing
+ * 3D effects.
+ *
+ * As usual, Evas provides both the raw and easy to use methods. The
+ * raw methods allow developer to create its maps somewhere else,
+ * maybe load them from some file format. The easy to use methods,
+ * calculate the points given some high-level parameters, such as
+ * rotation angle, ambient light and so on.
+ *
+ * @note applying mapping will reduce performance, so use with
+ *       care. The impact on performance depends on engine in
+ *       use. Software is quite optimized, but not as fast as OpenGL.
+ *
+ * @ingroup Evas_Object_Group
+ */
+   EAPI void              evas_object_map_enable_set        (Evas_Object *obj, Eina_Bool enabled);
+   EAPI Eina_Bool         evas_object_map_enable_get        (const Evas_Object *obj);
+   EAPI void              evas_object_map_source_set        (Evas_Object *obj, Evas_Object *src);
+   EAPI Evas_Object      *evas_object_map_source_get        (const Evas_Object *obj);
+   EAPI void              evas_object_map_set               (Evas_Object *obj, const Evas_Map *map);
+   EAPI const Evas_Map   *evas_object_map_get               (const Evas_Object *obj);
+
+   EAPI void              evas_map_util_points_populate_from_object_full   (Evas_Map *m, const Evas_Object *obj, Evas_Coord z);
+   EAPI void              evas_map_util_points_populate_from_object        (Evas_Map *m, const Evas_Object *obj);
+   EAPI void              evas_map_util_points_populate_from_geometry      (Evas_Map *m, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Evas_Coord z);
+
+   EAPI void              evas_map_util_points_color_set                   (Evas_Map *m, int r, int g, int b, int a);
+
+   EAPI void              evas_map_util_rotate              (Evas_Map *m, double degrees, Evas_Coord cx, Evas_Coord cy);
+   EAPI void              evas_map_util_zoom                (Evas_Map *m, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy);
+   EAPI void              evas_map_util_3d_rotate           (Evas_Map *m, double dx, double dy, double dz, Evas_Coord cx, Evas_Coord cy, Evas_Coord cz);
+   EAPI void              evas_map_util_3d_lighting         (Evas_Map *m, Evas_Coord lx, Evas_Coord ly, Evas_Coord lz, int lr, int lg, int lb, int ar, int ag, int ab);
+   EAPI void              evas_map_util_3d_perspective      (Evas_Map *m, Evas_Coord px, Evas_Coord py, Evas_Coord z0, Evas_Coord foc);
+   EAPI Eina_Bool         evas_map_util_clockwise_get       (Evas_Map *m);
+
+   EAPI Evas_Map         *evas_map_new                      (int count);
+   EAPI void              evas_map_smooth_set               (Evas_Map *m, Eina_Bool enabled);
+   EAPI Eina_Bool         evas_map_smooth_get               (const Evas_Map *m);
+   EAPI void              evas_map_alpha_set                (Evas_Map *m, Eina_Bool enabled);
+   EAPI Eina_Bool         evas_map_alpha_get                (const Evas_Map *m);
+   EAPI Evas_Map         *evas_map_dup                      (const Evas_Map *m);
+   EAPI void              evas_map_free                     (Evas_Map *m);
+   EAPI void              evas_map_point_coord_set          (Evas_Map *m, int idx, Evas_Coord x, Evas_Coord y, Evas_Coord z);
+   EAPI void              evas_map_point_coord_get          (const Evas_Map *m, int idx, Evas_Coord *x, Evas_Coord *y, Evas_Coord *z);
+   EAPI void              evas_map_point_image_uv_set       (Evas_Map *m, int idx, double u, double v);
+   EAPI void              evas_map_point_image_uv_get       (const Evas_Map *m, int idx, double *u, double *v);
+   EAPI void              evas_map_point_color_set          (Evas_Map *m, int idx, int r, int g, int b, int a);
+   EAPI void              evas_map_point_color_get          (const Evas_Map *m, int idx, int *r, int *g, int *b, int *a);
+
+/**
+ * @defgroup Evas_Object_Group_Size_Hints Size Hints
+ *
+ * Objects may carry hints so another object that acts as a manager
+ * (see @ref Evas_Smart_Object_Group) may know how to proper position
+ * and resize the object. The Size Hints provide a common interface
+ * that is recommended as the protocol for such information.
+ *
+ * @ingroup Evas_Object_Group
+ */
+   EAPI void              evas_object_size_hint_min_get     (const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_size_hint_min_set     (Evas_Object *obj, Evas_Coord w, Evas_Coord h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_size_hint_max_get     (const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_size_hint_max_set     (Evas_Object *obj, Evas_Coord w, Evas_Coord h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_size_hint_request_get (const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_size_hint_request_set (Evas_Object *obj, Evas_Coord w, Evas_Coord h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_size_hint_aspect_get  (const Evas_Object *obj, Evas_Aspect_Control *aspect, Evas_Coord *w, Evas_Coord *h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_size_hint_aspect_set  (Evas_Object *obj, Evas_Aspect_Control aspect, Evas_Coord w, Evas_Coord h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_size_hint_align_get   (const Evas_Object *obj, double *x, double *y) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_size_hint_align_set   (Evas_Object *obj, double x, double y) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_size_hint_weight_get  (const Evas_Object *obj, double *x, double *y) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_size_hint_weight_set  (Evas_Object *obj, double x, double y) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_size_hint_padding_get (const Evas_Object *obj, Evas_Coord *l, Evas_Coord *r, Evas_Coord *t, Evas_Coord *b) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_size_hint_padding_set (Evas_Object *obj, Evas_Coord l, Evas_Coord r, Evas_Coord t, Evas_Coord b) EINA_ARG_NONNULL(1);
+
+/**
+ * @defgroup Evas_Object_Group_Extras Extra Object Manipulation
+ *
+ * Miscellaneous functions that also apply to any object, but are less
+ * used or not implemented by all objects.
+ *
+ * @ingroup Evas_Object_Group
+ */
+   EAPI void              evas_object_data_set              (Evas_Object *obj, const char *key, const void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void             *evas_object_data_get              (const Evas_Object *obj, const char *key) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_PURE;
+   EAPI void             *evas_object_data_del              (Evas_Object *obj, const char *key) EINA_ARG_NONNULL(1, 2);
+
+   EAPI void              evas_object_pointer_mode_set      (Evas_Object *obj, Evas_Object_Pointer_Mode setting) EINA_ARG_NONNULL(1);
+   EAPI Evas_Object_Pointer_Mode evas_object_pointer_mode_get(const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void              evas_object_anti_alias_set        (Evas_Object *obj, Eina_Bool antialias) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool         evas_object_anti_alias_get        (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void              evas_object_scale_set             (Evas_Object *obj, double scale) EINA_ARG_NONNULL(1);
+   EAPI double            evas_object_scale_get             (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void              evas_object_color_interpolation_set  (Evas_Object *obj, int color_space) EINA_ARG_NONNULL(1);
+   EAPI int               evas_object_color_interpolation_get  (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void              evas_object_render_op_set         (Evas_Object *obj, Evas_Render_Op op) EINA_ARG_NONNULL(1);
+   EAPI Evas_Render_Op    evas_object_render_op_get         (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void              evas_object_precise_is_inside_set (Evas_Object *obj, Eina_Bool precise) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool         evas_object_precise_is_inside_get (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+/**
+ * @defgroup Evas_Object_Group_Find Finding Objects
+ *
+ * Functions that allows finding objects by their position, name or
+ * other properties.
+ *
+ * @ingroup Evas_Object_Group
+ */
+   EAPI Evas_Object      *evas_focus_get                    (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI Evas_Object      *evas_object_name_find             (const Evas *e, const char *name) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI Evas_Object      *evas_object_top_at_xy_get         (const Evas *e, Evas_Coord x, Evas_Coord y, Eina_Bool include_pass_events_objects, Eina_Bool include_hidden_objects) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Evas_Object      *evas_object_top_at_pointer_get    (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Evas_Object      *evas_object_top_in_rectangle_get  (const Evas *e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Eina_Bool include_pass_events_objects, Eina_Bool include_hidden_objects) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI Eina_List        *evas_objects_at_xy_get            (const Evas *e, Evas_Coord x, Evas_Coord y, Eina_Bool include_pass_events_objects, Eina_Bool include_hidden_objects) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Eina_List        *evas_objects_in_rectangle_get     (const Evas *e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Eina_Bool include_pass_events_objects, Eina_Bool include_hidden_objects) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI Evas_Object      *evas_object_bottom_get            (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Evas_Object      *evas_object_top_get               (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+/**
+ * @defgroup Evas_Object_Group_Interceptors Object Method Interceptors
+ *
+ * Evas provides a way to intercept method calls. The interceptor
+ * callback may opt to completely deny the call, or may check and
+ * change the parameters before continuing. The continuation of an
+ * intercepted call is done by calling the intercepted call again,
+ * from inside the interceptor callback.
+ *
+ * @ingroup Evas_Object_Group
+ */
+   EAPI void              evas_object_intercept_show_callback_add        (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void             *evas_object_intercept_show_callback_del        (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_intercept_hide_callback_add        (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void             *evas_object_intercept_hide_callback_del        (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_intercept_move_callback_add        (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y), const void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void             *evas_object_intercept_move_callback_del        (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y)) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_intercept_resize_callback_add      (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord w, Evas_Coord h), const void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void             *evas_object_intercept_resize_callback_del      (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord w, Evas_Coord h)) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_intercept_raise_callback_add       (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void             *evas_object_intercept_raise_callback_del       (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_intercept_lower_callback_add       (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void             *evas_object_intercept_lower_callback_del       (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_intercept_stack_above_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above), const void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void             *evas_object_intercept_stack_above_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above)) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_intercept_stack_below_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below), const void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void             *evas_object_intercept_stack_below_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below)) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_intercept_layer_set_callback_add   (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l), const void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void             *evas_object_intercept_layer_set_callback_del   (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l)) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_intercept_color_set_callback_add   (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int r, int g, int b, int a), const void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void             *evas_object_intercept_color_set_callback_del   (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int r, int g, int b, int a)) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_intercept_clip_set_callback_add    (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *clip), const void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void             *evas_object_intercept_clip_set_callback_del    (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *clip)) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_intercept_clip_unset_callback_add  (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void             *evas_object_intercept_clip_unset_callback_del  (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)) EINA_ARG_NONNULL(1, 2);
+
+
+
+/**
+ * @defgroup Evas_Object_Specific Specific Object Functions
+ *
+ * Functions that work on specific objects.
+ *
+ */
+
+/**
+ * @defgroup Evas_Object_Rectangle Rectangle Object Functions
+ *
+ * Functions that operate on evas rectangle objects.
+ *
+ * @ingroup Evas_Object_Specific
+ */
+   EAPI Evas_Object      *evas_object_rectangle_add         (Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+
+/**
+ * @defgroup Evas_Object_Image Image Object Functions
+ *
+ * Functions used to create and manipulate image objects.
+ *
+ * Note - Image objects may return or accept "image data" in multiple
+ * formats.  This is based on the colorspace of an object. Here is a
+ * rundown on formats:
+ *
+ * EVAS_COLORSPACE_ARGB8888:
+ *
+ * This pixel format is a linear block of pixels, starting at the
+ * top-left row by row until the bottom right of the image or pixel
+ * region. All pixels are 32-bit unsigned int's with the high-byte
+ * being alpha and the low byte being blue in the format ARGB. Alpha
+ * may or may not be used by evas depending on the alpha flag of the
+ * image, but if not used, should be set to 0xff anyway.
+ *
+ * This colorspace uses premultiplied alpha. That means that R, G and
+ * B cannot exceed A in value. The conversion from non-premultiplied
+ * colorspace is:
+ *
+ * R = (r * a) / 255; G = (g * a) / 255; B = (b * a) / 255;
+ *
+ * So 50% transparent blue will be: 0x80000080. This will not be
+ * "dark" - just 50% transparent. Values are 0 == black, 255 == solid
+ * or full red, green or blue.
+ *
+ * EVAS_COLORSPACE_YCBCR422P601_PL:
+ *
+ * This is a pointer-list indirected set of YUV (YCbCr) pixel
+ * data. This means that the data returned or set is not actual pixel
+ * data, but pointers TO lines of pixel data. The list of pointers
+ * will first be N rows of pointers to the Y plane - pointing to the
+ * first pixel at the start of each row in the Y plane. N is the
+ * height of the image data in pixels. Each pixel in the Y, U and V
+ * planes is 1 byte exactly, packed. The next N / 2 pointers will
+ * point to rows in the U plane, and the next N / 2 pointers will
+ * point to the V plane rows. U and V planes are half the horizontal
+ * and vertical resolution of the Y plane.
+ *
+ * Row order is top to bottom and row pixels are stored left to right.
+ *
+ * There is a limitation that these images MUST be a multiple of 2
+ * pixels in size horizontally or vertically. This is due to the U and
+ * V planes being half resolution. Also note that this assumes the
+ * itu601 YUV colorspace specification. This is defined for standard
+ * television and mpeg streams.  HDTV may use the itu709
+ * specification.
+ *
+ * Values are 0 to 255, indicating full or no signal in that plane
+ * respectively.
+ *
+ * EVAS_COLORSPACE_YCBCR422P709_PL:
+ *
+ * Not implemented yet.
+ *
+ * EVAS_COLORSPACE_RGB565_A5P:
+ *
+ * In the process of being implemented in 1 engine only. This may change.
+ *
+ * This is a pointer to image data for 16-bit half-word pixel data in
+ * 16bpp RGB 565 format (5 bits red, 6 bits green, 5 bits blue), with
+ * the high-byte containing red and the low byte containing blue, per
+ * pixel. This data is packed row by row from the top-left to the
+ * bottom right.
+ *
+ * If the image has an alpha channel enabled there will be an extra
+ * alpha plane after the color pixel plane. If not, then this data
+ * will not exist and should not be accessed in any way. This plane is
+ * a set of pixels with 1 byte per pixel defining the alpha values of
+ * all pixels in the image from the top-left to the bottom right of
+ * the image, row by row. Even though the values of the alpha pixels
+ * can be 0 to 255, only values 0 through to 32 are used, 32 being
+ * solid and 0 being transparent.
+ *
+ * RGB values can be 0 to 31 for red and blue and 0 to 63 for green,
+ * with 0 being black and 31 or 63 being full red, green or blue
+ * respectively. This colorspace is also pre-multiplied like
+ * EVAS_COLORSPACE_ARGB8888 so:
+ *
+ * R = (r * a) / 32; G = (g * a) / 32; B = (b * a) / 32;
+ *
+ * @ingroup Evas_Object_Specific
+ */
+   EAPI Evas_Object      *evas_object_image_add             (Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI Evas_Object      *evas_object_image_filled_add      (Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+
+   EAPI void              evas_object_image_file_set        (Evas_Object *obj, const char *file, const char *key) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_image_file_get        (const Evas_Object *obj, const char **file, const char **key) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_image_border_set      (Evas_Object *obj, int l, int r, int t, int b) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_image_border_get      (const Evas_Object *obj, int *l, int *r, int *t, int *b) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_image_border_center_fill_set(Evas_Object *obj, Evas_Border_Fill_Mode fill) EINA_ARG_NONNULL(1);
+   EAPI Evas_Border_Fill_Mode evas_object_image_border_center_fill_get(const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_image_filled_set      (Evas_Object *obj, Eina_Bool setting) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool         evas_object_image_filled_get      (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_image_border_scale_set(Evas_Object *obj, double scale);
+   EAPI double            evas_object_image_border_scale_get(const Evas_Object *obj);
+   EAPI void              evas_object_image_fill_set        (Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_image_fill_get        (const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_image_fill_spread_set   (Evas_Object *obj, int tile_mode) EINA_ARG_NONNULL(1);
+   EAPI int               evas_object_image_fill_spread_get   (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_image_fill_transform_set (Evas_Object *obj, Evas_Transform *t) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_image_fill_transform_get (const Evas_Object *obj, Evas_Transform *t) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_image_size_set        (Evas_Object *obj, int w, int h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_image_size_get        (const Evas_Object *obj, int *w, int *h) EINA_ARG_NONNULL(1);
+   EAPI int               evas_object_image_stride_get      (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI int               evas_object_image_load_error_get  (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_image_data_set        (Evas_Object *obj, void *data) EINA_ARG_NONNULL(1);
+   EAPI void             *evas_object_image_data_convert    (Evas_Object *obj, Evas_Colorspace to_cspace) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void             *evas_object_image_data_get        (const Evas_Object *obj, Eina_Bool for_writing) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_image_data_copy_set   (Evas_Object *obj, void *data) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_image_data_update_add (Evas_Object *obj, int x, int y, int w, int h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_image_alpha_set       (Evas_Object *obj, Eina_Bool has_alpha) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool         evas_object_image_alpha_get       (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_image_smooth_scale_set(Evas_Object *obj, Eina_Bool smooth_scale) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool         evas_object_image_smooth_scale_get(const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_image_preload         (Evas_Object *obj, Eina_Bool cancel) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_image_reload          (Evas_Object *obj) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool         evas_object_image_save            (const Evas_Object *obj, const char *file, const char *key, const char *flags)  EINA_ARG_NONNULL(1, 2);
+   EAPI Eina_Bool         evas_object_image_pixels_import          (Evas_Object *obj, Evas_Pixel_Import_Source *pixels) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_image_pixels_get_callback_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *o), void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_image_pixels_dirty_set       (Evas_Object *obj, Eina_Bool dirty) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool         evas_object_image_pixels_dirty_get       (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_image_load_dpi_set           (Evas_Object *obj, double dpi) EINA_ARG_NONNULL(1);
+   EAPI double            evas_object_image_load_dpi_get           (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_image_load_size_set          (Evas_Object *obj, int w, int h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_image_load_size_get          (const Evas_Object *obj, int *w, int *h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_image_load_scale_down_set    (Evas_Object *obj, int scale_down) EINA_ARG_NONNULL(1);
+   EAPI int               evas_object_image_load_scale_down_get    (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_image_load_region_set        (Evas_Object *obj, int x, int y, int w, int h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_image_load_region_get        (const Evas_Object *obj, int *x, int *y, int *w, int *h) EINA_ARG_NONNULL(1);
+
+   EAPI void              evas_object_image_colorspace_set         (Evas_Object *obj, Evas_Colorspace cspace) EINA_ARG_NONNULL(1);
+   EAPI Evas_Colorspace   evas_object_image_colorspace_get         (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void                 evas_object_image_native_surface_set  (Evas_Object *obj, Evas_Native_Surface *surf) EINA_ARG_NONNULL(1, 2);
+   EAPI Evas_Native_Surface *evas_object_image_native_surface_get  (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void                  evas_object_image_scale_hint_set     (Evas_Object *obj, Evas_Image_Scale_Hint hint) EINA_ARG_NONNULL(1);
+   EAPI Evas_Image_Scale_Hint evas_object_image_scale_hint_get     (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void                    evas_object_image_content_hint_set (Evas_Object *obj, Evas_Image_Content_Hint hint) EINA_ARG_NONNULL(1);
+   EAPI Evas_Image_Content_Hint evas_object_image_content_hint_get (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+/**
+ * @defgroup Evas_Object_Text Text Object Functions
+ *
+ * Functions that operate on single line, single style text objects.
+ *
+ * For multiline and multiple style text, see @ref Evas_Object_Textblock.
+ *
+ * @ingroup Evas_Object_Specific
+ */
+   typedef enum _Evas_Text_Style_Type
+     {
+       EVAS_TEXT_STYLE_PLAIN,
+       EVAS_TEXT_STYLE_SHADOW,
+       EVAS_TEXT_STYLE_OUTLINE,
+       EVAS_TEXT_STYLE_SOFT_OUTLINE,
+       EVAS_TEXT_STYLE_GLOW,
+       EVAS_TEXT_STYLE_OUTLINE_SHADOW,
+       EVAS_TEXT_STYLE_FAR_SHADOW,
+       EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW,
+       EVAS_TEXT_STYLE_SOFT_SHADOW,
+       EVAS_TEXT_STYLE_FAR_SOFT_SHADOW
+     } Evas_Text_Style_Type;
+
+   EAPI Evas_Object      *evas_object_text_add              (Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI void              evas_object_text_font_source_set  (Evas_Object *obj, const char *font) EINA_ARG_NONNULL(1);
+   EAPI const char       *evas_object_text_font_source_get  (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_text_font_set         (Evas_Object *obj, const char *font, Evas_Font_Size size) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_text_font_get         (const Evas_Object *obj, const char **font, Evas_Font_Size *size) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_text_text_set         (Evas_Object *obj, const char *text) EINA_ARG_NONNULL(1);
+   EAPI const char       *evas_object_text_text_get         (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Evas_Coord        evas_object_text_ascent_get       (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Evas_Coord        evas_object_text_descent_get      (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Evas_Coord        evas_object_text_max_ascent_get   (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Evas_Coord        evas_object_text_max_descent_get  (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Evas_Coord        evas_object_text_horiz_advance_get(const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Evas_Coord        evas_object_text_vert_advance_get (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Evas_Coord        evas_object_text_inset_get        (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Eina_Bool         evas_object_text_char_pos_get     (const Evas_Object *obj, int pos, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) EINA_ARG_NONNULL(1);
+   EAPI int               evas_object_text_char_coords_get  (const Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) EINA_ARG_NONNULL(1);
+   EAPI int               evas_object_text_last_up_to_pos(const Evas_Object *obj, Evas_Coord x, Evas_Coord y) EINA_ARG_NONNULL(1);
+   EAPI Evas_Text_Style_Type evas_object_text_style_get     (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_text_style_set        (Evas_Object *obj, Evas_Text_Style_Type type) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_text_shadow_color_set (Evas_Object *obj, int r, int g, int b, int a) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_text_shadow_color_get (const Evas_Object *obj, int *r, int *g, int *b, int *a) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_text_glow_color_set   (Evas_Object *obj, int r, int g, int b, int a) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_text_glow_color_get   (const Evas_Object *obj, int *r, int *g, int *b, int *a) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_text_glow2_color_set  (Evas_Object *obj, int r, int g, int b, int a) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_text_glow2_color_get  (const Evas_Object *obj, int *r, int *g, int *b, int *a) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_text_outline_color_set(Evas_Object *obj, int r, int g, int b, int a) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_text_outline_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_text_style_pad_get    (const Evas_Object *obj, int *l, int *r, int *t, int *b) EINA_ARG_NONNULL(1);
+
+
+/**
+ * @defgroup Evas_Object_Textblock Textblock Object Functions
+ *
+ * Functions used to create and manipulate textblock objects. Unlike
+ * @ref Evas_Object_Text, these handle complex text, doing multiple
+ * styles and multiline text based on HTML-like tags. Of these extra
+ * features will be heavier on memory and processing cost.
+ *
+ * @todo put here some usage examples
+ *
+ * @ingroup Evas_Object_Specific
+ */
+   typedef struct _Evas_Textblock_Style     Evas_Textblock_Style;
+   typedef struct _Evas_Textblock_Cursor    Evas_Textblock_Cursor;
+   typedef struct _Evas_Textblock_Rectangle Evas_Textblock_Rectangle;
+
+   struct _Evas_Textblock_Rectangle
+     {
+       Evas_Coord x, y, w, h;
+     };
+
+   typedef enum _Evas_Textblock_Text_Type
+     {
+       EVAS_TEXTBLOCK_TEXT_RAW,
+       EVAS_TEXTBLOCK_TEXT_PLAIN,
+       EVAS_TEXTBLOCK_TEXT_MARKUP
+     } Evas_Textblock_Text_Type;
+
+   EAPI Evas_Object                 *evas_object_textblock_add(Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+
+   EAPI const char                  *evas_textblock_escape_string_get(const char *escape) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI const char                  *evas_textblock_string_escape_get(const char *string, int *len_ret) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI const char                  *evas_textblock_escape_string_range_get(const char *escape_start, const char *escape_end) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_PURE;
+
+   EAPI Evas_Textblock_Style        *evas_textblock_style_new(void) EINA_WARN_UNUSED_RESULT EINA_MALLOC;
+   EAPI void                         evas_textblock_style_free(Evas_Textblock_Style *ts) EINA_ARG_NONNULL(1);
+   EAPI void                         evas_textblock_style_set(Evas_Textblock_Style *ts, const char *text) EINA_ARG_NONNULL(1);
+   EAPI const char                  *evas_textblock_style_get(const Evas_Textblock_Style *ts) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void                         evas_object_textblock_style_set(Evas_Object *obj, Evas_Textblock_Style *ts) EINA_ARG_NONNULL(1);
+   EAPI const Evas_Textblock_Style  *evas_object_textblock_style_get(const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void                         evas_object_textblock_replace_char_set(Evas_Object *obj, const char *ch) EINA_ARG_NONNULL(1);
+   EAPI const char                  *evas_object_textblock_replace_char_get(Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void                         evas_object_textblock_text_markup_set(Evas_Object *obj, const char *text) EINA_ARG_NONNULL(1);
+   EAPI void                         evas_object_textblock_text_markup_prepend(Evas_Textblock_Cursor *cur, const char *text) EINA_ARG_NONNULL(1, 2);
+   EAPI const char                  *evas_object_textblock_text_markup_get(const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI const Evas_Textblock_Cursor *evas_object_textblock_cursor_get(const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Evas_Textblock_Cursor       *evas_object_textblock_cursor_new(Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+
+   EAPI void                         evas_textblock_cursor_free(Evas_Textblock_Cursor *cur) EINA_ARG_NONNULL(1);
+
+   EAPI void                         evas_textblock_cursor_node_first(Evas_Textblock_Cursor *cur) EINA_ARG_NONNULL(1);
+   EAPI void                         evas_textblock_cursor_node_last(Evas_Textblock_Cursor *cur) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool                    evas_textblock_cursor_node_next(Evas_Textblock_Cursor *cur) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool                    evas_textblock_cursor_node_prev(Evas_Textblock_Cursor *cur) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool                    evas_textblock_cursor_char_next(Evas_Textblock_Cursor *cur) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool                    evas_textblock_cursor_char_prev(Evas_Textblock_Cursor *cur) EINA_ARG_NONNULL(1);
+   EAPI void                         evas_textblock_cursor_char_first(Evas_Textblock_Cursor *cur) EINA_ARG_NONNULL(1);
+   EAPI void                         evas_textblock_cursor_char_last(Evas_Textblock_Cursor *cur) EINA_ARG_NONNULL(1);
+   EAPI void                         evas_textblock_cursor_line_first(Evas_Textblock_Cursor *cur) EINA_ARG_NONNULL(1);
+   EAPI void                         evas_textblock_cursor_line_last(Evas_Textblock_Cursor *cur) EINA_ARG_NONNULL(1);
+   EAPI int                          evas_textblock_cursor_pos_get(const Evas_Textblock_Cursor *cur) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void                         evas_textblock_cursor_pos_set(Evas_Textblock_Cursor *cur, int pos) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool                    evas_textblock_cursor_line_set(Evas_Textblock_Cursor *cur, int line) EINA_ARG_NONNULL(1);
+   EAPI int                          evas_textblock_cursor_compare(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_PURE;
+   EAPI void                         evas_textblock_cursor_copy(const Evas_Textblock_Cursor *cur, Evas_Textblock_Cursor *cur_dest) EINA_ARG_NONNULL(1, 2);
+
+   EAPI void                         evas_textblock_cursor_text_append(Evas_Textblock_Cursor *cur, const char *text) EINA_ARG_NONNULL(1, 2);
+   EAPI void                         evas_textblock_cursor_text_prepend(Evas_Textblock_Cursor *cur, const char *text) EINA_ARG_NONNULL(1, 2);
+
+   EAPI void                         evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur, const char *format) EINA_ARG_NONNULL(1, 2);
+   EAPI void                         evas_textblock_cursor_format_prepend(Evas_Textblock_Cursor *cur, const char *format) EINA_ARG_NONNULL(1, 2);
+   EAPI void                         evas_textblock_cursor_node_delete(Evas_Textblock_Cursor *cur) EINA_ARG_NONNULL(1);
+   EAPI void                         evas_textblock_cursor_char_delete(Evas_Textblock_Cursor *cur) EINA_ARG_NONNULL(1);
+   EAPI void                         evas_textblock_cursor_range_delete(Evas_Textblock_Cursor *cur1, Evas_Textblock_Cursor *cur2) EINA_ARG_NONNULL(1, 2);
+
+   EAPI const char                  *evas_textblock_cursor_node_text_get(const Evas_Textblock_Cursor *cur) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI int                          evas_textblock_cursor_node_text_length_get(const Evas_Textblock_Cursor *cur) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI const char                  *evas_textblock_cursor_node_format_get(const Evas_Textblock_Cursor *cur) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Eina_Bool                    evas_textblock_cursor_node_format_is_visible_get(const Evas_Textblock_Cursor *cur) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI char                        *evas_textblock_cursor_range_text_get(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2, Evas_Textblock_Text_Type format) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_PURE;
+
+   EAPI int                          evas_textblock_cursor_char_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) EINA_ARG_NONNULL(1);
+   EAPI int                          evas_textblock_cursor_line_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool                    evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, Evas_Coord y) EINA_ARG_NONNULL(1);
+   EAPI int                          evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord y) EINA_ARG_NONNULL(1);
+   EAPI Eina_List                   *evas_textblock_cursor_range_geometry_get(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_PURE;
+   EAPI Eina_Bool                    evas_textblock_cursor_format_item_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) EINA_ARG_NONNULL(1);
+
+   EAPI Eina_Bool                    evas_textblock_cursor_eol_get(const Evas_Textblock_Cursor *cur) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void                         evas_textblock_cursor_eol_set(Evas_Textblock_Cursor *cur, Eina_Bool eol) EINA_ARG_NONNULL(1);
+
+   EAPI Eina_Bool                    evas_object_textblock_line_number_geometry_get(const Evas_Object *obj, int line, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) EINA_ARG_NONNULL(1);
+   EAPI void                         evas_object_textblock_clear(Evas_Object *obj) EINA_ARG_NONNULL(1);
+   EAPI void                         evas_object_textblock_size_formatted_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) EINA_ARG_NONNULL(1);
+   EAPI void                         evas_object_textblock_size_native_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) EINA_ARG_NONNULL(1);
+   EAPI void                         evas_object_textblock_style_insets_get(const Evas_Object *obj, Evas_Coord *l, Evas_Coord *r, Evas_Coord *t, Evas_Coord *b) EINA_ARG_NONNULL(1);
+
+/**
+ * @defgroup Evas_Line_Group Line Object Functions
+ *
+ * Functions used to deal with evas line objects.
+ *
+ * @ingroup Evas_Object_Specific
+ */
+   EAPI Evas_Object      *evas_object_line_add              (Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI void              evas_object_line_xy_set           (Evas_Object *obj, Evas_Coord x1, Evas_Coord y1, Evas_Coord x2, Evas_Coord y2);
+   EAPI void              evas_object_line_xy_get           (const Evas_Object *obj, Evas_Coord *x1, Evas_Coord *y1, Evas_Coord *x2, Evas_Coord *y2);
+
+/**
+ * @defgroup Evas_Object_Polygon Polygon Object Functions
+ *
+ * Functions that operate on evas polygon objects.
+ *
+ * Hint: as evas does not provide ellipse, smooth paths or circle, one
+ * can calculate points and convert these to a polygon.
+ *
+ * @ingroup Evas_Object_Specific
+ */
+   EAPI Evas_Object      *evas_object_polygon_add           (Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI void              evas_object_polygon_point_add     (Evas_Object *obj, Evas_Coord x, Evas_Coord y) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_polygon_points_clear  (Evas_Object *obj) EINA_ARG_NONNULL(1);
+
+/**
+ * @defgroup Evas_Object_Gradient_Group Gradient Object Functions
+ *
+ * Functions that work on evas gradient objects.
+ *
+ * @ingroup Evas_Object_Specific
+ */
+   EAPI Evas_Object      *evas_object_gradient_add            (Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI void              evas_object_gradient_color_stop_add (Evas_Object *obj, int r, int g, int b, int a, int delta) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_gradient_alpha_stop_add (Evas_Object *obj, int a, int delta) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_gradient_color_data_set (Evas_Object *obj, void *color_data, int len, Eina_Bool has_alpha) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_gradient_alpha_data_set (Evas_Object *obj, void *alpha_data, int len) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_gradient_clear          (Evas_Object *obj) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_gradient_type_set       (Evas_Object *obj, const char *type, const char *instance_params) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_gradient_type_get       (const Evas_Object *obj, char **type, char **instance_params) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_gradient_fill_set       (Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_gradient_fill_get       (const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_gradient_fill_angle_set (Evas_Object *obj, Evas_Angle angle) EINA_ARG_NONNULL(1);
+   EAPI Evas_Angle        evas_object_gradient_fill_angle_get (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_gradient_fill_spread_set(Evas_Object *obj, int tile_mode) EINA_ARG_NONNULL(1);
+   EAPI int               evas_object_gradient_fill_spread_get(const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_gradient_angle_set      (Evas_Object *obj, Evas_Angle angle) EINA_ARG_NONNULL(1);
+   EAPI Evas_Angle        evas_object_gradient_angle_get      (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_gradient_direction_set  (Evas_Object *obj, int direction) EINA_ARG_NONNULL(1);
+   EAPI int               evas_object_gradient_direction_get  (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_gradient_offset_set     (Evas_Object *obj, float offset) EINA_ARG_NONNULL(1);
+   EAPI float             evas_object_gradient_offset_get     (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+/**
+ * @defgroup Evas_Object_Gradient2_Group Gradient2 Object Functions
+ *
+ * Functions that work on evas gradient2 objects.
+ *
+ * @ingroup Evas_Object_Specific
+ */
+   EAPI void              evas_object_gradient2_color_np_stop_insert (Evas_Object *obj, int r, int g, int b, int a, float pos) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_gradient2_fill_spread_set      (Evas_Object *obj, int tile_mode) EINA_ARG_NONNULL(1);
+   EAPI int               evas_object_gradient2_fill_spread_get      (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_gradient2_fill_transform_set   (Evas_Object *obj, Evas_Transform *t) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_gradient2_fill_transform_get   (const Evas_Object *obj, Evas_Transform *t) EINA_ARG_NONNULL(1);
+
+/* linear gradient2 objects */
+   EAPI Evas_Object      *evas_object_gradient2_linear_add      (Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI void              evas_object_gradient2_linear_fill_set (Evas_Object *obj, float x0, float y0, float x1, float y1) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_gradient2_linear_fill_get (const Evas_Object *obj, float *x0, float *y0, float *x1, float *y1) EINA_ARG_NONNULL(1);
+
+/* radial gradient2 objects */
+   EAPI Evas_Object      *evas_object_gradient2_radial_add      (Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI void              evas_object_gradient2_radial_fill_set (Evas_Object *obj, float cx, float cy, float rx, float ry) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_gradient2_radial_fill_get (const Evas_Object *obj, float *cx, float *cy, float *rx, float *ry) EINA_ARG_NONNULL(1);
+
+
+/**
+ * @defgroup Evas_Smart_Group Smart Functions
+ *
+ * Functions that deal with Evas_Smart's, creating definition
+ * (classes) of objects that will have customized behavior for methods
+ * like evas_object_move(), evas_object_resize(),
+ * evas_object_clip_set() and others.
+ *
+ * These objects will accept the generic methods defined in @ref
+ * Evas_Object_Group and the extensions defined in @ref
+ * Evas_Smart_Object_Group. There are couple of existent smart objects
+ * in Evas itself, see @ref Evas_Object_Box, @ref Evas_Object_Table
+ * and @ref Evas_Smart_Object_Clipped.
+ */
+
+/**
+ * @def EVAS_SMART_CLASS_VERSION
+ * The version you have to put into the version field in the smart
+ * class struct
+ * @ingroup Evas_Smart_Group
+ */
+#define EVAS_SMART_CLASS_VERSION 4
+/**
+ * @struct _Evas_Smart_Class
+ * a smart object class
+ * @ingroup Evas_Smart_Group
+ */
+struct _Evas_Smart_Class
+{
+   const char *name; /**< the string name of the class */
+
+   int version;
+
+   void  (*add)         (Evas_Object *o);
+   void  (*del)         (Evas_Object *o);
+   void  (*move)        (Evas_Object *o, Evas_Coord x, Evas_Coord y);
+   void  (*resize)      (Evas_Object *o, Evas_Coord w, Evas_Coord h);
+   void  (*show)        (Evas_Object *o);
+   void  (*hide)        (Evas_Object *o);
+   void  (*color_set)   (Evas_Object *o, int r, int g, int b, int a);
+   void  (*clip_set)    (Evas_Object *o, Evas_Object *clip);
+   void  (*clip_unset)  (Evas_Object *o);
+   void  (*calculate)   (Evas_Object *o);
+   void  (*member_add)  (Evas_Object *o, Evas_Object *child);
+   void  (*member_del)  (Evas_Object *o, Evas_Object *child);
+
+   const Evas_Smart_Class *parent; /**< this class inherits from this parent */
+   const Evas_Smart_Cb_Description *callbacks; /**< callbacks at this level, NULL terminated */
+
+   void *interfaces; /**< to be used in a future near you */
+
+   const void *data;
+};
+
+/**
+ * @struct _Evas_Smart_Cb_Description
+ *
+ * Describes a callback used by a smart class
+ * evas_object_smart_callback_call(), particularly useful to explain
+ * to user and its code (ie: introspection) what the parameter @c
+ * event_info will contain.
+ *
+ * @ingroup Evas_Smart_Group
+ */
+struct _Evas_Smart_Cb_Description
+{
+   const char *name; /**< callback name, ie: "changed" */
+
+   /**
+    * @brief Hint type of @c event_info parameter of Evas_Smart_Cb.
+    *
+    * The type string uses the pattern similar to
+    *
+    * http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-signatures
+    *
+    * but extended to optionally include variable names within
+    * brackets preceding types. Example:
+    *
+    * @li Structure with two integers:
+    *     @c "(ii)"
+    *
+    * @li Structure called 'x' with two integers named 'a' and 'b':
+    *     @c "[x]([a]i[b]i)"
+    *
+    * @li Array of integers:
+    *     @c "ai"
+    *
+    * @li Array called 'x' of struct with two integers:
+    *     @c "[x]a(ii)"
+    *
+    * @note This type string is used as a hint and is @b not validated
+    *       or enforced anyhow. Implementors should make the best use
+    *       of it to help bindings, documentation and other users of
+    *       introspection features.
+    */
+   const char *type;
+};
+
+/**
+ * @def EVAS_SMART_CLASS_INIT_NULL
+ * Initializer to zero a whole Evas_Smart_Class structure.
+ *
+ * @see EVAS_SMART_CLASS_INIT_VERSION
+ * @see EVAS_SMART_CLASS_INIT_NAME_VERSION
+ * @see EVAS_SMART_CLASS_INIT_NAME_VERSION_PARENT
+ * @see EVAS_SMART_CLASS_INIT_NAME_VERSION_PARENT_CALLBACKS
+ * @ingroup Evas_Smart_Group
+ */
+#define EVAS_SMART_CLASS_INIT_NULL {NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
+
+/**
+ * @def EVAS_SMART_CLASS_INIT_VERSION
+ * Initializer to zero a whole Evas_Smart_Class structure and set version.
+ *
+ * Similar to EVAS_SMART_CLASS_INIT_NULL, but will set version field to
+ * latest EVAS_SMART_CLASS_VERSION.
+ *
+ * @see EVAS_SMART_CLASS_INIT_NULL
+ * @see EVAS_SMART_CLASS_INIT_NAME_VERSION
+ * @see EVAS_SMART_CLASS_INIT_NAME_VERSION_PARENT
+ * @see EVAS_SMART_CLASS_INIT_NAME_VERSION_PARENT_CALLBACKS
+ * @ingroup Evas_Smart_Group
+ */
+#define EVAS_SMART_CLASS_INIT_VERSION {NULL, EVAS_SMART_CLASS_VERSION, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
+
+/**
+ * @def EVAS_SMART_CLASS_INIT_NAME_VERSION
+ * Initializer to zero a whole Evas_Smart_Class structure and set name
+ * and version.
+ *
+ * Similar to EVAS_SMART_CLASS_INIT_NULL, but will set version field to
+ * latest EVAS_SMART_CLASS_VERSION and name to the specified value.
+ *
+ * It will keep a reference to name field as a "const char *", that is,
+ * name must be available while the structure is used (hint: static or global!)
+ * and will not be modified.
+ *
+ * @see EVAS_SMART_CLASS_INIT_NULL
+ * @see EVAS_SMART_CLASS_INIT_VERSION
+ * @see EVAS_SMART_CLASS_INIT_NAME_VERSION_PARENT
+ * @see EVAS_SMART_CLASS_INIT_NAME_VERSION_PARENT_CALLBACKS
+ * @ingroup Evas_Smart_Group
+ */
+#define EVAS_SMART_CLASS_INIT_NAME_VERSION(name) {name, EVAS_SMART_CLASS_VERSION, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
+
+/**
+ * @def EVAS_SMART_CLASS_INIT_NAME_VERSION_PARENT
+ * Initializer to zero a whole Evas_Smart_Class structure and set name,
+ * version and parent class.
+ *
+ * Similar to EVAS_SMART_CLASS_INIT_NULL, but will set version field to
+ * latest EVAS_SMART_CLASS_VERSION, name to the specified value and
+ * parent class.
+ *
+ * It will keep a reference to name field as a "const char *", that is,
+ * name must be available while the structure is used (hint: static or global!)
+ * and will not be modified. Similarly, parent reference will be kept.
+ *
+ * @see EVAS_SMART_CLASS_INIT_NULL
+ * @see EVAS_SMART_CLASS_INIT_VERSION
+ * @see EVAS_SMART_CLASS_INIT_NAME_VERSION
+ * @see EVAS_SMART_CLASS_INIT_NAME_VERSION_PARENT_CALLBACKS
+ * @ingroup Evas_Smart_Group
+ */
+#define EVAS_SMART_CLASS_INIT_NAME_VERSION_PARENT(name, parent) {name, EVAS_SMART_CLASS_VERSION, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, parent, NULL, NULL}
+
+/**
+ * @def EVAS_SMART_CLASS_INIT_NAME_VERSION_PARENT_CALLBACKS
+ * Initializer to zero a whole Evas_Smart_Class structure and set name,
+ * version, parent class and callbacks definition.
+ *
+ * Similar to EVAS_SMART_CLASS_INIT_NULL, but will set version field to
+ * latest EVAS_SMART_CLASS_VERSION, name to the specified value, parent
+ * class and callbacks at this level.
+ *
+ * It will keep a reference to name field as a "const char *", that is,
+ * name must be available while the structure is used (hint: static or global!)
+ * and will not be modified. Similarly, parent and callbacks reference
+ * will be kept.
+ *
+ * @see EVAS_SMART_CLASS_INIT_NULL
+ * @see EVAS_SMART_CLASS_INIT_VERSION
+ * @see EVAS_SMART_CLASS_INIT_NAME_VERSION
+ * @see EVAS_SMART_CLASS_INIT_NAME_VERSION_PARENT
+ * @ingroup Evas_Smart_Group
+ */
+#define EVAS_SMART_CLASS_INIT_NAME_VERSION_PARENT_CALLBACKS(name, parent, callbacks) {name, EVAS_SMART_CLASS_VERSION, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, parent, callbacks, NULL}
+
+/**
+ * @def EVAS_SMART_SUBCLASS_NEW
+ *
+ * Convenience macro to subclass a Smart Class.
+ *
+ * This macro saves some typing when writing a Smart Class derived from
+ * another one. In order to work, the user needs to provide some functions
+ * adhering to the following guidelines.
+ *  - @<prefix@>_smart_set_user(): the internal _smart_set function will call
+ *    this one provided by the user after inheriting everything from the
+ *    parent, which should take care of setting the right member functions
+ *    for the class.
+ *  - @<prefix@>_parent_sc: pointer to the smart class of the parent. When calling
+ *    parent functions from overloaded ones, use this global variable.
+ *  - @<prefix@>_smart_class_new(): this function returns the Evas_Smart needed
+ *    to create smart objects with this class, should be called by the public
+ *    _add() function.
+ *  - If this new class should be subclassable as well, a public _smart_set()
+ *    function is desirable to fill the class used as parent by the children.
+ *    It's up to the user to provide this interface, which will most likely
+ *    call @<prefix@>_smart_set() to get the job done.
+ *
+ * @param smart_name The name used for the Smart Class. e.g: "Evas_Object_Box".
+ * @param prefix Prefix used for all variables and functions defined.
+ * @param api_type Type of the structure used as API for the Smart Class. Either Evas_Smart_Class or something derived from it.
+ * @param parent_type Type of the parent class API.
+ * @param parent_func Function that gets the parent class. e.g: evas_object_box_smart_class_get().
+ * @param cb_desc Array of callback descriptions for this Smart Class.
+ *
+ * @ingroup Evas_Smart_Group
+ */
+#define EVAS_SMART_SUBCLASS_NEW(smart_name, prefix, api_type, parent_type, parent_func, cb_desc) \
+  static const parent_type * prefix##_parent_sc = NULL;                        \
+  static void prefix##_smart_set_user(api_type *api);                  \
+  static void prefix##_smart_set(api_type *api)                                \
+  {                                                                    \
+     Evas_Smart_Class *sc;                                             \
+     if (!(sc = (Evas_Smart_Class *)api))                              \
+       return;                                                         \
+     if (!prefix##_parent_sc)                                          \
+       prefix##_parent_sc = parent_func();                             \
+     evas_smart_class_inherit(sc, (const Evas_Smart_Class *)prefix##_parent_sc); \
+     prefix##_smart_set_user(api);                                     \
+  }                                                                    \
+  static Evas_Smart * prefix##_smart_class_new(void)                   \
+  {                                                                    \
+     static Evas_Smart *smart = NULL;                                  \
+     static api_type api;                                              \
+     if (!smart)                                                       \
+       {                                                               \
+         Evas_Smart_Class *sc = (Evas_Smart_Class *)&api;              \
+         memset(&api, 0, sizeof(api_type));                            \
+         sc->version = EVAS_SMART_CLASS_VERSION;                       \
+         sc->name = smart_name;                                        \
+         sc->callbacks = cb_desc;                                      \
+         prefix##_smart_set(&api);                                     \
+         smart = evas_smart_class_new(sc);                             \
+       }                                                               \
+     return smart;                                                     \
+  }
+
+/**
+ * @def EVAS_SMART_DATA_ALLOC
+ * Convenience macro to allocate smart data only if needed.
+ *
+ * When writing a subclassable smart object, the .add function will need
+ * to check if the smart private data was already allocated by some child
+ * object or not. This macro makes it easier to do it.
+ *
+ * @param o Evas object passed to the .add function
+ * @param priv_type The type of the data to allocate
+ * @ingroup Evas_Smart_Group
+ */
+#define EVAS_SMART_DATA_ALLOC(o, priv_type)                    \
+  priv_type *priv;                                             \
+  priv = evas_object_smart_data_get(o);                        \
+  if (!priv)                                                   \
+    {                                                          \
+       priv = (priv_type *)calloc(1, sizeof(priv_type));       \
+       if (!priv)                                              \
+        return;                                                \
+       evas_object_smart_data_set(o, priv);                    \
+    }
+
+   EINA_DEPRECATED EAPI Evas_Smart *evas_smart_new          (const char *name, void (*func_add) (Evas_Object *obj), void (*func_del) (Evas_Object *obj), void (*func_layer_set) (Evas_Object *obj, int l), void (*func_raise) (Evas_Object *obj), void (*func_lower) (Evas_Object *obj), void (*func_stack_above) (Evas_Object *obj, Evas_Object *above), void (*func_stack_below) (Evas_Object *obj, Evas_Object *below), void (*func_move) (Evas_Object *obj, Evas_Coord x, Evas_Coord y), void (*func_resize) (Evas_Object *obj, Evas_Coord w, Evas_Coord h), void (*func_show) (Evas_Object *obj), void (*func_hide) (Evas_Object *obj), void (*func_color_set) (Evas_Object *obj, int r, int g, int b, int a), void (*func_clip_set) (Evas_Object *obj, Evas_Object *clip), void (*func_clip_unset) (Evas_Object *obj), const void *data) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI void              evas_smart_free                   (Evas_Smart *s) EINA_ARG_NONNULL(1);
+   EAPI Evas_Smart       *evas_smart_class_new              (const Evas_Smart_Class *sc) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI const Evas_Smart_Class *evas_smart_class_get        (const Evas_Smart *s) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI void             *evas_smart_data_get               (const Evas_Smart *s) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI const Evas_Smart_Cb_Description *evas_smart_callback_description_find(const Evas_Smart *s, const char *name) EINA_ARG_NONNULL(1, 2) EINA_PURE;
+
+  EAPI Eina_Bool         evas_smart_class_inherit_full      (Evas_Smart_Class *sc, const Evas_Smart_Class *parent_sc, unsigned int parent_sc_size) EINA_ARG_NONNULL(1, 2);
+  /**
+   * @def evas_smart_class_inherit
+   * Easy to use version of evas_smart_class_inherit_full().
+   *
+   * This version will use sizeof(parent_sc), copying everything.
+   *
+   * @param sc child class, will have methods copied from @a parent_sc
+   * @param parent_sc parent class, will provide contents to be copied.
+   * @return 1 on success, 0 on failure.
+   * @ingroup Evas_Smart_Group
+   */
+#define evas_smart_class_inherit(sc, parent_sc) evas_smart_class_inherit_full(sc, parent_sc, sizeof(*parent_sc))
+
+/**
+ * @defgroup Evas_Smart_Object_Group Smart Object Functions
+ *
+ * Functions dealing with evas smart objects (instances).
+ *
+ * Smart objects are groupings of primitive evas objects that behave as a
+ * cohesive group. For instance, a file manager icon may be a smart object
+ * composed of an image object, a text label and two rectangles that appear
+ * behind the image and text when the icon is selected. As a smart object,
+ * the normal evas api could be used on the icon object.
+ *
+ * @see @ref Evas_Smart_Group for class definitions.
+ */
+   EAPI Evas_Object      *evas_object_smart_add             (Evas *e, Evas_Smart *s) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_MALLOC;
+   EAPI void              evas_object_smart_member_add      (Evas_Object *obj, Evas_Object *smart_obj) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_smart_member_del      (Evas_Object *obj) EINA_ARG_NONNULL(1);
+   EAPI Evas_Object      *evas_object_smart_parent_get      (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Eina_Bool         evas_object_smart_type_check      (const Evas_Object *obj, const char *type) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_PURE;
+   EAPI Eina_Bool         evas_object_smart_type_check_ptr  (const Evas_Object *obj, const char *type) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_PURE;
+   EAPI Eina_List        *evas_object_smart_members_get     (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI Evas_Smart       *evas_object_smart_smart_get       (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void             *evas_object_smart_data_get        (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_smart_data_set        (Evas_Object *obj, void *data) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_smart_callback_add    (Evas_Object *obj, const char *event, Evas_Smart_Cb func, const void *data) EINA_ARG_NONNULL(1, 2, 3);
+   EAPI void             *evas_object_smart_callback_del    (Evas_Object *obj, const char *event, Evas_Smart_Cb func) EINA_ARG_NONNULL(1, 2, 3);
+   EAPI void              evas_object_smart_callback_call   (Evas_Object *obj, const char *event, void *event_info) EINA_ARG_NONNULL(1, 2);
+
+   EAPI Eina_Bool         evas_object_smart_callbacks_descriptions_set(Evas_Object *obj, const Evas_Smart_Cb_Description *descriptions) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_smart_callbacks_descriptions_get(const Evas_Object *obj, const Evas_Smart_Cb_Description ***class_descriptions, unsigned int *class_count, const Evas_Smart_Cb_Description ***instance_descriptions, unsigned int *instance_count) EINA_ARG_NONNULL(1);
+   EAPI void             evas_object_smart_callback_description_find(const Evas_Object *obj, const char *name, const Evas_Smart_Cb_Description **class_description, const Evas_Smart_Cb_Description **instance_description) EINA_ARG_NONNULL(1, 2);
+
+   EAPI void              evas_object_smart_changed         (Evas_Object *obj) EINA_ARG_NONNULL(1);
+   EAPI void              evas_object_smart_need_recalculate_set(Evas_Object *obj, Eina_Bool value) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool         evas_object_smart_need_recalculate_get(const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void              evas_object_smart_calculate       (Evas_Object *obj) EINA_ARG_NONNULL(1);
+
+   EAPI void              evas_smart_objects_calculate      (Evas *e);
+
+
+/**
+ * @defgroup Evas_Smart_Object_Clipped Clipped Smart Object
+ *
+ * Clipped smart object is a base to construct other smart objects
+ * that based on the concept of having an internal clipper that is
+ * applied to all its other children. This clipper will control the
+ * visibility, clipping and color of sibling objects (remember that
+ * the clipping is recursive, and clipper color modulates the color of
+ * its clippees). By default, this base will also move children
+ * relatively to the parent, and delete them when parent is
+ * deleted. In other words, it is the base for simple object grouping.
+ *
+ * @see evas_object_smart_clipped_smart_set()
+ *
+ * @ingroup Evas_Smart_Object_Group
+ */
+
+/**
+ * Every subclass should provide this at the beginning of their own
+ * data set with evas_object_smart_data_set().
+ */
+  typedef struct _Evas_Object_Smart_Clipped_Data Evas_Object_Smart_Clipped_Data;
+  struct _Evas_Object_Smart_Clipped_Data
+  {
+     Evas_Object *clipper;
+     Evas *evas;
+  };
+
+   EAPI Evas_Object *evas_object_smart_clipped_clipper_get(Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void evas_object_smart_clipped_smart_set(Evas_Smart_Class *sc) EINA_ARG_NONNULL(1);
+   EAPI const Evas_Smart_Class *evas_object_smart_clipped_class_get(void) EINA_CONST;
+
+   EAPI void evas_object_smart_move_children_relative(Evas_Object *obj, Evas_Coord dx, Evas_Coord dy) EINA_ARG_NONNULL(1);
+
+/**
+ * @defgroup Evas_Object_Box Box (Sequence) Smart Object.
+ *
+ * Convenience smart object that packs children as a sequence using
+ * a layout function specified by user. There are a couple of helper
+ * layout functions, all of them using children size hints to define
+ * their size and alignment inside their cell space.
+ *
+ * @see @ref Evas_Object_Group_Size_Hints
+ *
+ * @ingroup Evas_Smart_Object_Group
+ */
+/**
+ * @typedef Evas_Object_Box_Api
+ * Smart Class extension providing extra box requirements.
+ * @ingroup Evas_Object_Box
+ */
+   typedef struct _Evas_Object_Box_Api        Evas_Object_Box_Api;
+/**
+ * @typedef Evas_Object_Box_Data
+ * Smart instance data providing box requirements.
+ * @ingroup Evas_Object_Box
+ */
+   typedef struct _Evas_Object_Box_Data       Evas_Object_Box_Data;
+/**
+ * @typedef Evas_Object_Box_Option
+ * The base structure for a box option.
+ * @ingroup Evas_Object_Box
+ */
+   typedef struct _Evas_Object_Box_Option     Evas_Object_Box_Option;
+   typedef void (*Evas_Object_Box_Layout)(Evas_Object *o, Evas_Object_Box_Data *priv, void *user_data);
+
+/**
+ * @def EVAS_OBJECT_BOX_API_VERSION
+ * @ingroup Evas_Object_Box
+ */
+#define EVAS_OBJECT_BOX_API_VERSION 1
+/**
+ * @struct _Evas_Object_Box_Api
+ *
+ * This structure should be used by any class that wants to inherit
+ * from box to provide custom behavior not allowed only by providing a
+ * layout function with evas_object_box_layout_set().
+ *
+ * @extends Evas_Smart_Class
+ * @ingroup Evas_Object_Box
+ */
+   struct _Evas_Object_Box_Api
+   {
+      Evas_Smart_Class base;
+      int version;
+      Evas_Object_Box_Option *(*append)(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child);
+      Evas_Object_Box_Option *(*prepend)(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child);
+      Evas_Object_Box_Option *(*insert_before)(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child, const Evas_Object *reference);
+      Evas_Object_Box_Option *(*insert_after)(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child, const Evas_Object *reference);
+      Evas_Object_Box_Option *(*insert_at)(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child, unsigned int pos);
+      Evas_Object            *(*remove)(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child);
+      Evas_Object            *(*remove_at)(Evas_Object *o, Evas_Object_Box_Data *priv, unsigned int pos);
+      Eina_Bool               (*property_set)(Evas_Object *o, Evas_Object_Box_Option *opt, int property, va_list args);
+      Eina_Bool               (*property_get)(Evas_Object *o, Evas_Object_Box_Option *opt, int property, va_list args);
+      const char             *(*property_name_get)(Evas_Object *o, int property);
+      int                     (*property_id_get)(Evas_Object *o, const char *name);
+      Evas_Object_Box_Option *(*option_new)(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child);
+      void                    (*option_free)(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object_Box_Option *opt);
+   };
+
+/**
+ * @def EVAS_OBJECT_BOX_API_INIT
+ * Initializer for whole Evas_Object_Box_Api structure.
+ *
+ * @param smart_class_init initializer to use for the "base" field
+ * (Evas_Smart_Class).
+ *
+ * @see EVAS_SMART_CLASS_INIT_NULL
+ * @see EVAS_SMART_CLASS_INIT_VERSION
+ * @see EVAS_SMART_CLASS_INIT_NAME_VERSION
+ * @see EVAS_OBJECT_BOX_API_INIT_NULL
+ * @see EVAS_OBJECT_BOX_API_INIT_VERSION
+ * @see EVAS_OBJECT_BOX_API_INIT_NAME_VERSION
+ * @ingroup Evas_Object_Box
+ */
+#define EVAS_OBJECT_BOX_API_INIT(smart_class_init) {smart_class_init, EVAS_OBJECT_BOX_API_VERSION, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
+
+/**
+ * @def EVAS_OBJECT_BOX_API_INIT_NULL
+ * Initializer to zero a whole Evas_Object_Box_Api structure.
+ *
+ * @see EVAS_OBJECT_BOX_API_INIT_VERSION
+ * @see EVAS_OBJECT_BOX_API_INIT_NAME_VERSION
+ * @see EVAS_OBJECT_BOX_API_INIT
+ * @ingroup Evas_Object_Box
+ */
+#define EVAS_OBJECT_BOX_API_INIT_NULL EVAS_OBJECT_BOX_API_INIT(EVAS_SMART_CLASS_INIT_NULL)
+
+/**
+ * @def EVAS_OBJECT_BOX_API_INIT_VERSION
+ * Initializer to zero a whole Evas_Object_Box_Api structure and set version.
+ *
+ * Similar to EVAS_OBJECT_BOX_API_INIT_NULL, but will set version field of
+ * Evas_Smart_Class (base field) to latest EVAS_SMART_CLASS_VERSION
+ *
+ * @see EVAS_OBJECT_BOX_API_INIT_NULL
+ * @see EVAS_OBJECT_BOX_API_INIT_NAME_VERSION
+ * @see EVAS_OBJECT_BOX_API_INIT
+ * @ingroup Evas_Object_Box
+ */
+#define EVAS_OBJECT_BOX_API_INIT_VERSION EVAS_OBJECT_BOX_API_INIT(EVAS_SMART_CLASS_INIT_VERSION)
+
+/**
+ * @def EVAS_OBJECT_BOX_API_INIT_NAME_VERSION
+ * Initializer to zero a whole Evas_Object_Box_Api structure and set
+ * name and version.
+ *
+ * Similar to EVAS_OBJECT_BOX_API_INIT_NULL, but will set version field of
+ * Evas_Smart_Class (base field) to latest EVAS_SMART_CLASS_VERSION and name
+ * to the specific value.
+ *
+ * It will keep a reference to name field as a "const char *", that is,
+ * name must be available while the structure is used (hint: static or global!)
+ * and will not be modified.
+ *
+ * @see EVAS_OBJECT_BOX_API_INIT_NULL
+ * @see EVAS_OBJECT_BOX_API_INIT_VERSION
+ * @see EVAS_OBJECT_BOX_API_INIT
+ * @ingroup Evas_Object_Box
+ */
+#define EVAS_OBJECT_BOX_API_INIT_NAME_VERSION(name) EVAS_OBJECT_BOX_API_INIT(EVAS_SMART_CLASS_INIT_NAME_VERSION(name))
+
+/**
+ * @struct _Evas_Object_Box_Data
+ *
+ * This structure augments clipped smart object's instance data,
+ * providing extra members required by generic box implementation. If
+ * a subclass inherits from #Evas_Object_Box_Api then it may augment
+ * #Evas_Object_Box_Data to fit its own needs.
+ *
+ * @extends Evas_Object_Smart_Clipped_Data
+ * @ingroup Evas_Object_Box
+ */
+   struct _Evas_Object_Box_Data
+   {
+      Evas_Object_Smart_Clipped_Data base;
+      const Evas_Object_Box_Api *api;
+      struct {
+        double h, v;
+      } align;
+      struct {
+        Evas_Coord h, v;
+      } pad;
+      Eina_List *children;
+      struct {
+        Evas_Object_Box_Layout cb;
+        void *data;
+        void (*free_data)(void *data);
+      } layout;
+      Eina_Bool layouting : 1;
+   };
+
+   struct _Evas_Object_Box_Option
+   {
+      Evas_Object *obj;
+   };
+
+   EAPI void evas_object_box_smart_set(Evas_Object_Box_Api *api) EINA_ARG_NONNULL(1);
+   EAPI const Evas_Object_Box_Api *evas_object_box_smart_class_get(void) EINA_CONST;
+   EAPI void evas_object_box_layout_set(Evas_Object *o, Evas_Object_Box_Layout cb, const void *data, void (*free_data)(void *data)) EINA_ARG_NONNULL(1, 2);
+
+   EAPI Evas_Object *evas_object_box_add(Evas *evas) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI Evas_Object *evas_object_box_add_to(Evas_Object *parent) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+
+   EAPI void evas_object_box_layout_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void evas_object_box_layout_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void evas_object_box_layout_homogeneous_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void evas_object_box_layout_homogeneous_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void evas_object_box_layout_homogeneous_max_size_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void evas_object_box_layout_homogeneous_max_size_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void evas_object_box_layout_flow_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void evas_object_box_layout_flow_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data) EINA_ARG_NONNULL(1, 2);
+   EAPI void evas_object_box_layout_stack(Evas_Object *o, Evas_Object_Box_Data *priv, void *data) EINA_ARG_NONNULL(1, 2);
+
+   EAPI void   evas_object_box_align_set(Evas_Object *o, double horizontal, double vertical) EINA_ARG_NONNULL(1);
+   EAPI void   evas_object_box_align_get(const Evas_Object *o, double *horizontal, double *vertical) EINA_ARG_NONNULL(1);
+   EAPI void   evas_object_box_padding_set(Evas_Object *o, Evas_Coord horizontal, Evas_Coord vertical) EINA_ARG_NONNULL(1);
+   EAPI void   evas_object_box_padding_get(const Evas_Object *o, Evas_Coord *horizontal, Evas_Coord *vertical) EINA_ARG_NONNULL(1);
+
+   EAPI Evas_Object_Box_Option *evas_object_box_append(Evas_Object *o, Evas_Object *child) EINA_ARG_NONNULL(1, 2);
+   EAPI Evas_Object_Box_Option *evas_object_box_prepend(Evas_Object *o, Evas_Object *child) EINA_ARG_NONNULL(1, 2);
+   EAPI Evas_Object_Box_Option *evas_object_box_insert_before(Evas_Object *o, Evas_Object *child, const Evas_Object *reference) EINA_ARG_NONNULL(1, 2, 3);
+   EAPI Evas_Object_Box_Option *evas_object_box_insert_after(Evas_Object *o, Evas_Object *child, const Evas_Object *referente) EINA_ARG_NONNULL(1, 2, 3);
+   EAPI Evas_Object_Box_Option *evas_object_box_insert_at(Evas_Object *o, Evas_Object *child, unsigned int pos) EINA_ARG_NONNULL(1, 2);
+   EAPI Eina_Bool               evas_object_box_remove(Evas_Object *o, Evas_Object *child) EINA_ARG_NONNULL(1, 2);
+   EAPI Eina_Bool               evas_object_box_remove_at(Evas_Object *o, unsigned int pos) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool               evas_object_box_remove_all(Evas_Object *o, Eina_Bool clear) EINA_ARG_NONNULL(1);
+   EAPI Eina_Iterator          *evas_object_box_iterator_new(const Evas_Object *o) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI Eina_Accessor          *evas_object_box_accessor_new(const Evas_Object *o) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI Eina_List              *evas_object_box_children_get(const Evas_Object *o) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+
+   EAPI const char *evas_object_box_option_property_name_get(Evas_Object *o, int property) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI int         evas_object_box_option_property_id_get(Evas_Object *o, const char *name) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_PURE;
+   EAPI Eina_Bool   evas_object_box_option_property_set(Evas_Object *o, Evas_Object_Box_Option *opt, int property, ...) EINA_ARG_NONNULL(1, 2);
+   EAPI Eina_Bool   evas_object_box_option_property_vset(Evas_Object *o, Evas_Object_Box_Option *opt, int property, va_list args) EINA_ARG_NONNULL(1, 2);
+   EAPI Eina_Bool   evas_object_box_option_property_get(Evas_Object *o, Evas_Object_Box_Option *opt, int property, ...) EINA_ARG_NONNULL(1, 2);
+   EAPI Eina_Bool   evas_object_box_option_property_vget(Evas_Object *o, Evas_Object_Box_Option *opt, int property, va_list args) EINA_ARG_NONNULL(1, 2);
+
+
+/**
+ * @defgroup Evas_Object_Table Table Smart Object.
+ *
+ * Convenience smart object that packs children using a tabular
+ * layout using children size hints to define their size and
+ * alignment inside their cell space.
+ *
+ * @see @ref Evas_Object_Group_Size_Hints
+ *
+ * @ingroup Evas_Smart_Object_Group
+ */
+   EAPI Evas_Object *evas_object_table_add(Evas *evas) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI Evas_Object *evas_object_table_add_to(Evas_Object *parent) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI void         evas_object_table_homogeneous_set(Evas_Object *o, Evas_Object_Table_Homogeneous_Mode homogeneous) EINA_ARG_NONNULL(1);
+   EAPI Evas_Object_Table_Homogeneous_Mode evas_object_table_homogeneous_get(const Evas_Object *o) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void         evas_object_table_padding_set(Evas_Object *o, Evas_Coord horizontal, Evas_Coord vertical) EINA_ARG_NONNULL(1);
+   EAPI void         evas_object_table_padding_get(const Evas_Object *o, Evas_Coord *horizontal, Evas_Coord *vertical) EINA_ARG_NONNULL(1);
+   EAPI void         evas_object_table_align_set(Evas_Object *o, double horizontal, double vertical) EINA_ARG_NONNULL(1);
+   EAPI void         evas_object_table_align_get(const Evas_Object *o, double *horizontal, double *vertical) EINA_ARG_NONNULL(1);
+
+   EAPI Eina_Bool    evas_object_table_pack(Evas_Object *o, Evas_Object *child, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan) EINA_ARG_NONNULL(1, 2);
+   EAPI Eina_Bool    evas_object_table_unpack(Evas_Object *o, Evas_Object *child) EINA_ARG_NONNULL(1, 2);
+   EAPI void         evas_object_table_clear(Evas_Object *o, Eina_Bool clear) EINA_ARG_NONNULL(1);
+
+   EAPI void         evas_object_table_col_row_size_get(const Evas_Object *o, int *cols, int *rows) EINA_ARG_NONNULL(1);
+   EAPI Eina_Iterator *evas_object_table_iterator_new(const Evas_Object *o) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI Eina_Accessor *evas_object_table_accessor_new(const Evas_Object *o) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI Eina_List     *evas_object_table_children_get(const Evas_Object *o) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI Evas_Object   *evas_object_table_child_get(const Evas_Object *o, unsigned short col, unsigned short row) EINA_ARG_NONNULL(1);
+
+
+/**
+ * @defgroup Evas_Cserve Shared Image Cache Server
+ *
+ * Provides client-server infrastructure to share bitmaps across
+ * multiple processes, saving data and processing power.
+ */
+   typedef struct _Evas_Cserve_Stats Evas_Cserve_Stats;
+   typedef struct _Evas_Cserve_Image_Cache Evas_Cserve_Image_Cache;
+   typedef struct _Evas_Cserve_Image Evas_Cserve_Image;
+   typedef struct _Evas_Cserve_Config Evas_Cserve_Config;
+
+/**
+ * Statistics about server that shares cached bitmaps.
+ * @ingroup Evas_Cserve
+ */
+   struct _Evas_Cserve_Stats
+     {
+        int saved_memory; /**< current saved memory, in bytes */
+        int wasted_memory; /**< current wasted memory, in bytes */
+        int saved_memory_peak; /**< peak of saved memory, in bytes */
+        int wasted_memory_peak; /**< peak of wasted memory, in bytes */
+        double saved_time_image_header_load;
+        double saved_time_image_data_load;
+     };
+
+/**
+ * Cache of images shared by server.
+ * @ingroup Evas_Cserve
+ */
+   struct _Evas_Cserve_Image_Cache
+     {
+        struct {
+           int mem_total;
+           int count;
+        } active, cached;
+        Eina_List *images;
+     };
+
+/**
+ * An image shared by the server.
+ * @ingroup Evas_Cserve
+ */
+   struct _Evas_Cserve_Image
+     {
+        const char *file, *key;
+        int w, h;
+        time_t file_mod_time;
+        time_t file_checked_time;
+        time_t cached_time;
+        int refcount;
+        int data_refcount;
+        int memory_footprint;
+        double head_load_time;
+        double data_load_time;
+        Eina_Bool alpha : 1;
+        Eina_Bool data_loaded : 1;
+        Eina_Bool active : 1;
+        Eina_Bool dead : 1;
+        Eina_Bool useless : 1;
+     };
+
+/**
+ * Configuration that controls the server that shares cached bitmaps.
+ * @ingroup Evas_Cserve
+ */
+    struct _Evas_Cserve_Config
+     {
+        int cache_max_usage;
+        int cache_item_timeout;
+        int cache_item_timeout_check;
+     };
+
+   EAPI Eina_Bool         evas_cserve_want_get                   (void) EINA_WARN_UNUSED_RESULT EINA_PURE;
+   EAPI Eina_Bool         evas_cserve_connected_get              (void) EINA_WARN_UNUSED_RESULT;
+   EAPI Eina_Bool         evas_cserve_stats_get                  (Evas_Cserve_Stats *stats) EINA_WARN_UNUSED_RESULT;
+   EAPI void              evas_cserve_image_cache_contents_clean (Evas_Cserve_Image_Cache *cache) EINA_PURE;
+   EAPI Eina_Bool         evas_cserve_config_get                 (Evas_Cserve_Config *config) EINA_WARN_UNUSED_RESULT EINA_PURE;
+   EAPI Eina_Bool         evas_cserve_config_set                 (const Evas_Cserve_Config *config) EINA_WARN_UNUSED_RESULT EINA_PURE;
+   EAPI void              evas_cserve_disconnect                 (void);
+
+
+/**
+ * @defgroup Evas_Utils General Utilities
+ *
+ * Some functions that are handy but are not specific of canvas or
+ * objects.
+ */
+   EAPI const char *evas_load_error_str(int error);
+
+/* Evas utility routines for color space conversions */
+/* hsv color space has h in the range 0.0 to 360.0, and s,v in the range 0.0 to 1.0 */
+/* rgb color space has r,g,b in the range 0 to 255 */
+   EAPI void              evas_color_hsv_to_rgb             (float h, float s, float v, int *r, int *g, int *b);
+   EAPI void              evas_color_rgb_to_hsv             (int r, int g, int b, float *h, float *s, float *v);
+
+/* argb color space has a,r,g,b in the range 0 to 255 */
+   EAPI void              evas_color_argb_premul            (int a, int *r, int *g, int *b);
+   EAPI void              evas_color_argb_unpremul          (int a, int *r, int *g, int *b);
+
+   EAPI void              evas_data_argb_premul             (unsigned int *data, unsigned int len);
+   EAPI void              evas_data_argb_unpremul           (unsigned int *data, unsigned int len);
+
+/* Evas utility routines for working with transforms */
+   /* Set t to the identity */
+   EAPI void              evas_transform_identity_set       (Evas_Transform *t);
+   /* Left-multiply t by an xy rotation defined by the given angle (in degrees) */
+   EAPI void              evas_transform_rotate             (double angle, Evas_Transform *t);
+   /* Left-multiply t by an xy translation defined by the given dx, dy values */
+   EAPI void              evas_transform_translate          (float dx, float dy, Evas_Transform *t);
+   /* Left-multiply t by an xy scaling defined by the given sx, sy factors */
+   EAPI void              evas_transform_scale              (float sx, float sy, Evas_Transform *t);
+   /* Left-multiply t by an xy shearing defined by the given sh, sv values */
+   EAPI void              evas_transform_shear              (float sh, float sv, Evas_Transform *t);
+   /* Left-multiply t by the given transform l */
+   EAPI void              evas_transform_compose            (Evas_Transform *l, Evas_Transform *t);
+
+/* string and font handling */
+   EAPI int               evas_string_char_next_get         (const char *str, int pos, int *decoded) EINA_ARG_NONNULL(1);
+   EAPI int               evas_string_char_prev_get         (const char *str, int pos, int *decoded) EINA_ARG_NONNULL(1);
+   EAPI int               evas_string_char_len_get          (const char *str) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+/**
+ * @defgroup Evas_Imaging Imaging and Commong GFX
+ *
+ * Evas imaging api - exports some of the comon gfx engine routines
+ * this is not complete and should be considered experimental. use at your
+ * own risk
+ */
+
+   typedef struct _Evas_Imaging_Image Evas_Imaging_Image;
+   typedef struct _Evas_Imaging_Font Evas_Imaging_Font;
+
+   /**
+    * Error identifier or EVAS_LOAD_ERROR_NONE. see evas_load_error_str().
+    * @ingroup Evas_Imaging
+    */
+   EAPI extern int          evas_imaging_image_load_error;
+
+   EAPI Evas_Imaging_Image *evas_imaging_image_load      (const char *file, const char *key) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_MALLOC;
+   EAPI void                evas_imaging_image_free      (Evas_Imaging_Image *im) EINA_ARG_NONNULL(1);
+   EAPI void                evas_imaging_image_size_get  (const Evas_Imaging_Image *im, int *w, int *h) EINA_ARG_NONNULL(1);
+   EAPI Eina_Bool           evas_imaging_image_alpha_get (const Evas_Imaging_Image *im) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void                evas_imaging_image_cache_set (int bytes);
+   EAPI int                 evas_imaging_image_cache_get (void) EINA_WARN_UNUSED_RESULT;
+
+   EAPI void                    evas_imaging_font_hinting_set      (Evas_Font_Hinting_Flags hinting);
+   EAPI Evas_Font_Hinting_Flags evas_imaging_font_hinting_get      (void) EINA_WARN_UNUSED_RESULT;
+   EAPI Eina_Bool               evas_imaging_font_hinting_can_hint (Evas_Font_Hinting_Flags hinting) EINA_WARN_UNUSED_RESULT;
+
+   EAPI Evas_Imaging_Font  *evas_imaging_font_load                      (const char *file, const char *key, int size) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   EAPI void                evas_imaging_font_free                      (Evas_Imaging_Font *fn) EINA_ARG_NONNULL(1);
+   EAPI int                 evas_imaging_font_ascent_get                (const Evas_Imaging_Font *fn) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI int                 evas_imaging_font_descent_get               (const Evas_Imaging_Font *fn) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI int                 evas_imaging_font_max_ascent_get            (const Evas_Imaging_Font *fn) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI int                 evas_imaging_font_max_descent_get           (const Evas_Imaging_Font *fn) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI int                 evas_imaging_font_line_advance_get          (const Evas_Imaging_Font *fn) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void                evas_imaging_font_string_advance_get        (const Evas_Imaging_Font *fn, const char *str, int *x, int *y) EINA_ARG_NONNULL(1, 2);
+   EAPI void                evas_imaging_font_string_size_query         (const Evas_Imaging_Font *fn, const char *str, int *w, int *h) EINA_ARG_NONNULL(1, 2);
+   EAPI int                 evas_imaging_font_string_inset_get          (const Evas_Imaging_Font *fn, const char *str) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_PURE;
+   EAPI int                 evas_imaging_font_string_char_coords_get    (const Evas_Imaging_Font *fn, const char *str, int pos, int *cx, int *cy, int *cw, int *ch) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_PURE;
+   EAPI int                 evas_imaging_font_string_char_at_coords_get (const Evas_Imaging_Font *fn, const char *str, int x, int y, int *cx, int *cy, int *cw, int *ch) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_PURE;
+
+   EAPI void                evas_imaging_font_cache_set  (int bytes);
+   EAPI int                 evas_imaging_font_cache_get  (void) EINA_WARN_UNUSED_RESULT;
+
+
+
+
+
+/**
+ * TO BE DOCUMENTED:
+ * @todo document key modifiers.
+ */
+   EAPI const Evas_Modifier *evas_key_modifier_get             (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI const Evas_Lock     *evas_key_lock_get                 (const Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+
+   EAPI Eina_Bool         evas_key_modifier_is_set          (const Evas_Modifier *m, const char *keyname) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_PURE;
+
+   EAPI Eina_Bool         evas_key_lock_is_set              (const Evas_Lock *l, const char *keyname) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_PURE;
+
+   EAPI void              evas_key_modifier_add             (Evas *e, const char *keyname) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_key_modifier_del             (Evas *e, const char *keyname) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_key_lock_add                 (Evas *e, const char *keyname) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_key_lock_del                 (Evas *e, const char *keyname) EINA_ARG_NONNULL(1, 2);
+
+   EAPI void              evas_key_modifier_on              (Evas *e, const char *keyname) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_key_modifier_off             (Evas *e, const char *keyname) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_key_lock_on                  (Evas *e, const char *keyname) EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_key_lock_off                 (Evas *e, const char *keyname) EINA_ARG_NONNULL(1, 2);
+
+   EAPI Evas_Modifier_Mask evas_key_modifier_mask_get       (const Evas *e, const char *keyname) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_PURE;
+
+   EAPI Eina_Bool         evas_object_key_grab              (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, Eina_Bool exclusive) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2);
+   EAPI void              evas_object_key_ungrab            (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers) EINA_ARG_NONNULL(1, 2);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
new file mode 100644 (file)
index 0000000..d357f4e
--- /dev/null
@@ -0,0 +1,224 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS = canvas cache cserve file engines imaging include
+EVAS_STATIC_MODULE =
+EVAS_STATIC_LIBADD =
+
+if EVAS_STATIC_BUILD_SOFTWARE_GENERIC
+SUBDIRS += ../modules/engines/software_generic/
+EVAS_STATIC_MODULE += ../modules/engines/software_generic/libevas_engine_software_generic.la
+endif
+if EVAS_STATIC_BUILD_BUFFER
+SUBDIRS += ../modules/engines/buffer/
+EVAS_STATIC_MODULE += ../modules/engines/buffer/libevas_engine_buffer.la
+endif
+if EVAS_STATIC_BUILD_DIRECT3D
+SUBDIRS += ../modules/engines/direct3d/
+EVAS_STATIC_MODULE += ../modules/engines/direct3d/libevas_engine_direct3d.la
+EVAS_STATIC_LIBADD += @evas_engine_direct3d_libs@
+endif
+if EVAS_STATIC_BUILD_DIRECTFB
+SUBDIRS += ../modules/engines/directfb/
+EVAS_STATIC_MODULE += ../modules/engines/directfb/libevas_engine_directfb.la
+EVAS_STATIC_LIBADD += @evas_engine_directfb_libs@
+endif
+if EVAS_STATIC_BUILD_FB
+SUBDIRS += ../modules/engines/fb/
+EVAS_STATIC_MODULE += ../modules/engines/fb/libevas_engine_fb.la
+EVAS_STATIC_LIBADD += @evas_engine_fb_libs@
+endif
+if EVAS_STATIC_BUILD_GL_GLEW
+SUBDIRS += \
+       ../modules/engines/gl_common \
+       ../modules/engines/gl_glew
+EVAS_STATIC_MODULE += \
+       ../modules/engines/gl_glew/libevas_engine_gl_glew.la
+EVAS_STATIC_LIBADD += @evas_engine_gl_common_libs@ @evas_engine_gl_glew_libs@
+endif
+if EVAS_STATIC_BUILD_GL_X11
+SUBDIRS += \
+       ../modules/engines/gl_common \
+       ../modules/engines/gl_x11
+EVAS_STATIC_MODULE += \
+       ../modules/engines/gl_x11/libevas_engine_gl_x11.la
+EVAS_STATIC_LIBADD += @evas_engine_gl_common_libs@ @evas_engine_gl_x11_libs@
+endif
+if EVAS_STATIC_BUILD_QUARTZ
+SUBDIRS += ../modules/engines/quartz/
+EVAS_STATIC_MODULE += ../modules/engines/quartz/libevas_engine_quartz.la
+EVAS_STATIC_LIBADD += @evas_engine_quartz_libs@
+endif
+if EVAS_STATIC_BUILD_SOFTWARE_16
+SUBDIRS += ../modules/engines/software_16/
+EVAS_STATIC_MODULE += ../modules/engines/software_16/libevas_engine_software_16.la
+endif
+if EVAS_STATIC_BUILD_SOFTWARE_16_DDRAW
+SUBDIRS += ../modules/engines/software_16_ddraw/
+EVAS_STATIC_MODULE += ../modules/engines/software_16_ddraw/libevas_engine_software_16_ddraw.la
+EVAS_STATIC_LIBADD += @evas_engine_software_16_ddraw_libs@
+endif
+if EVAS_STATIC_BUILD_SOFTWARE_16_WINCE
+SUBDIRS += ../modules/engines/software_16_wince/
+EVAS_STATIC_MODULE += ../modules/engines/software_16_wince/libevas_engine_software_16_wince.la
+EVAS_STATIC_LIBADD += @evas_engine_software_16_wince_libs@
+endif
+if EVAS_STATIC_BUILD_SOFTWARE_16_X11
+SUBDIRS += ../modules/engines/software_16_x11/
+EVAS_STATIC_MODULE += ../modules/engines/software_16_x11/libevas_engine_software_16_x11.la
+EVAS_STATIC_LIBADD += @evas_engine_software_16_x11_libs@
+endif
+if EVAS_STATIC_BUILD_SOFTWARE_SDL
+SUBDIRS += \
+       ../modules/engines/software_16_sdl/ \
+       ../modules/engines/software_sdl/
+EVAS_STATIC_MODULE += \
+       ../modules/engines/software_16_sdl/libevas_engine_software_16_sdl.la \
+       ../modules/engines/software_sdl/libevas_engine_software_sdl.la
+EVAS_STATIC_LIBADD += @SDL_LIBS@
+endif
+if EVAS_STATIC_BUILD_SOFTWARE_DDRAW
+SUBDIRS += ../modules/engines/software_ddraw/
+EVAS_STATIC_MODULE += ../modules/engines/software_ddraw/libevas_engine_software_ddraw.la
+EVAS_STATIC_LIBADD += @evas_engine_software_ddraw_libs@
+endif
+if EVAS_STATIC_BUILD_SOFTWARE_GDI
+SUBDIRS += ../modules/engines/software_gdi/
+EVAS_STATIC_MODULE += ../modules/engines/software_gdi/libevas_engine_software_gdi.la
+EVAS_STATIC_LIBADD += @evas_engine_software_gdi_libs@
+endif
+if EVAS_STATIC_BUILD_SOFTWARE_X11
+SUBDIRS += ../modules/engines/software_x11/
+EVAS_STATIC_MODULE += ../modules/engines/software_x11/libevas_engine_software_x11.la
+EVAS_STATIC_LIBADD += @evas_engine_software_xlib_libs@ @evas_engine_software_xcb_libs@
+endif
+if EVAS_STATIC_BUILD_XRENDER_X11
+SUBDIRS += ../modules/engines/xrender_x11/
+EVAS_STATIC_MODULE += ../modules/engines/xrender_x11/libevas_engine_xrender_x11.la
+EVAS_STATIC_LIBADD += @evas_engine_xrender_x11_libs@ @evas_engine_xrender_xcb_libs@
+endif
+if EVAS_STATIC_BUILD_EDB
+SUBDIRS += ../modules/savers/edb ../modules/loaders/edb
+EVAS_STATIC_MODULE += ../modules/savers/edb/libevas_saver_edb.la ../modules/loaders/edb/libevas_loader_edb.la
+EVAS_STATIC_LIBADD += @evas_image_loader_edb_libs@
+endif
+if EVAS_STATIC_BUILD_EET
+SUBDIRS += ../modules/savers/eet ../modules/loaders/eet
+EVAS_STATIC_MODULE += ../modules/savers/eet/libevas_saver_eet.la ../modules/loaders/eet/libevas_loader_eet.la
+EVAS_STATIC_LIBADD += @evas_image_loader_eet_libs@
+endif
+if EVAS_STATIC_BUILD_GIF
+SUBDIRS += ../modules/loaders/gif
+EVAS_STATIC_MODULE += ../modules/loaders/gif/libevas_loader_gif.la
+EVAS_STATIC_LIBADD += @evas_image_loader_gif_libs@
+endif
+if EVAS_STATIC_BUILD_JPEG
+SUBDIRS += ../modules/savers/jpeg ../modules/loaders/jpeg
+EVAS_STATIC_MODULE += ../modules/savers/jpeg/libevas_saver_jpeg.la ../modules/loaders/jpeg/libevas_loader_jpeg.la
+EVAS_STATIC_LIBADD += @evas_image_loader_jpeg_libs@
+endif
+if EVAS_STATIC_BUILD_PMAPS
+SUBDIRS += ../modules/loaders/pmaps
+EVAS_STATIC_MODULE += ../modules/loaders/pmaps/libevas_loader_pmaps.la
+EVAS_STATIC_LIBADD += @evas_image_loader_pmaps_libs@
+endif
+if EVAS_STATIC_BUILD_PNG
+SUBDIRS += ../modules/savers/png ../modules/loaders/png
+EVAS_STATIC_MODULE += ../modules/savers/png/libevas_saver_png.la ../modules/loaders/png/libevas_loader_png.la
+EVAS_STATIC_LIBADD += @evas_image_loader_png_libs@
+endif
+if EVAS_STATIC_BUILD_SVG
+SUBDIRS += ../modules/loaders/svg
+EVAS_STATIC_MODULE += ../modules/loaders/svg/libevas_loader_svg.la
+EVAS_STATIC_LIBADD += @evas_image_loader_svg_libs@
+endif
+if EVAS_STATIC_BUILD_TIFF
+SUBDIRS += ../modules/savers/tiff ../modules/loaders/tiff
+EVAS_STATIC_MODULE += ../modules/savers/tiff/libevas_saver_tiff.la ../modules/loaders/tiff/libevas_loader_tiff.la
+EVAS_STATIC_LIBADD += @evas_image_loader_tiff_libs@
+endif
+if EVAS_STATIC_BUILD_XPM
+SUBDIRS += ../modules/loaders/xpm
+EVAS_STATIC_MODULE += ../modules/loaders/xpm/libevas_loader_xpm.la
+EVAS_STATIC_LIBADD += @evas_image_loader_xpm_libs@
+endif
+
+
+#if EVAS_STATIC_BUILD_CAIRO_X11
+#SUBDIRS += \
+#      ../modules/engines/cairo_common \
+#      ../modules/engines/cairo_x11
+#EVAS_STATIC_MODULE += \
+#      ../modules/engines/cairo_common/libevas_engine_cairo_common.la \
+#      ../modules/engines/cairo_x11/libevas_engine_cairo_x11.la
+#EVAS_STATIC_LIBADD += @CAIRO_CFLAGS@
+#endif
+#if EVAS_STATIC_BUILD_SOFTWARE_QTOPIA
+#SUBDIRS += ../modules/engines/software_qtopia/
+#EVAS_STATIC_MODULE += ../modules/engines/software_qtopia/libevas_engine_software_qtopia.la
+#EVAS_STATIC_LIBADD += @evas_engine_software_qtopia_libs@
+#endif
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-DPACKAGE_BIN_DIR=\"$(bindir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+@EINA_CFLAGS@ \
+@FREETYPE_CFLAGS@ \
+@FRIBIDI_CFLAGS@ \
+@EET_CFLAGS@ \
+@FONTCONFIG_CFLAGS@ \
+@pthread_cflags@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+lib_LTLIBRARIES = libevas.la
+
+include_HEADERS = Evas.h
+
+libevas_la_SOURCES = main.c
+
+if EVAS_CSERVE
+
+libevas_cserve_la = cserve/libevas_cserve.la
+
+endif
+
+libevas_la_LIBADD = \
+canvas/libevas_canvas.la \
+file/libevas_file.la \
+cache/libevas_cache.la \
+imaging/libevas_imaging.la \
+$(libevas_cserve_la) \
+engines/common/libevas_engine_common.la \
+@FREETYPE_LIBS@ \
+@FRIBIDI_LIBS@ \
+@EET_LIBS@ \
+@FONTCONFIG_LIBS@ \
+@pthread_libs@ \
+@EINA_LIBS@ \
+$(EVAS_STATIC_MODULE) \
+$(EVAS_STATIC_LIBADD) \
+-lm
+
+libevas_la_DEPENDENCIES = \
+canvas/libevas_canvas.la \
+file/libevas_file.la \
+cache/libevas_cache.la \
+imaging/libevas_imaging.la \
+$(libevas_cserve_la) \
+engines/common/libevas_engine_common.la \
+$(EVAS_STATIC_MODULE)
+
+if BUILD_ENGINE_SOFTWARE_16
+
+libevas_la_LIBADD += engines/common_16/libevas_engine_common_16.la
+libevas_la_DEPENDENCIES += engines/common_16/libevas_engine_common_16.la
+
+endif
+
+libevas_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
+
+DIST_SUBDIRS = canvas cache cserve file engines imaging include
diff --git a/src/lib/cache/.cvsignore b/src/lib/cache/.cvsignore
new file mode 100644 (file)
index 0000000..b477e9c
--- /dev/null
@@ -0,0 +1,6 @@
+Makefile.in
+Makefile
+.deps
+.libs
+*.la
+*.lo
diff --git a/src/lib/cache/Makefile.am b/src/lib/cache/Makefile.am
new file mode 100644 (file)
index 0000000..b172b4a
--- /dev/null
@@ -0,0 +1,25 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS         = -I. \
+                      -I$(top_srcdir)/src/lib \
+                      -I$(top_srcdir)/src/lib/include \
+                      -DPACKAGE_BIN_DIR=\"$(bindir)\" \
+                      -DPACKAGE_LIB_DIR=\"$(libdir)\" \
+                      -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+                       @WIN32_CPPFLAGS@ \
+                       @EVIL_CFLAGS@ \
+                      @FREETYPE_CFLAGS@ \
+                      @EINA_CFLAGS@
+
+noinst_LTLIBRARIES      = libevas_cache.la
+libevas_cache_la_SOURCES  = \
+evas_cache_image.c \
+evas_cache_engine_image.c \
+evas_preload.c
+
+libevas_cache_la_LIBAD = @EVIL_LIBS@
+
+libevas_cache_la_DEPENDENCIES = $(top_builddir)/config.h
+
+EXTRA_DIST = evas_cache.h
diff --git a/src/lib/cache/evas_cache.h b/src/lib/cache/evas_cache.h
new file mode 100644 (file)
index 0000000..462d35a
--- /dev/null
@@ -0,0 +1,172 @@
+#ifndef _EVAS_CACHE_H
+#define _EVAS_CACHE_H
+
+
+typedef struct _Evas_Cache_Image                Evas_Cache_Image;
+typedef struct _Evas_Cache_Image_Func           Evas_Cache_Image_Func;
+typedef struct _Evas_Cache_Engine_Image         Evas_Cache_Engine_Image;
+typedef struct _Evas_Cache_Engine_Image_Func    Evas_Cache_Engine_Image_Func;
+
+
+struct _Evas_Cache_Image_Func
+{
+   Image_Entry *(*alloc)(void);
+   void         (*dealloc)(Image_Entry *im);
+
+   /* The cache provide some helpers for surface manipulation. */
+   int          (*surface_alloc)(Image_Entry *im, int w, int h);
+   void         (*surface_delete)(Image_Entry *im);
+   DATA32      *(*surface_pixels)(Image_Entry *im);
+
+   /* The cache is doing the allocation and deallocation, you must just do the rest. */
+   int          (*constructor)(Image_Entry *im); /**< return is EVAS_LOAD_ERROR_* or EVAS_LOAD_ERROR_NONE! */
+   void         (*destructor)(Image_Entry *im);
+
+   void         (*dirty_region)(Image_Entry *im, int x, int y, int w, int h);
+   /* Only called when references > 0. Need to provide a fresh copie of im. */
+   /* The destination surface does have a surface, but no allocated pixel data. */
+   int          (*dirty)(Image_Entry *dst, const Image_Entry *src);
+   /* Only called when references == 1. We will call drop on `im'. */
+   /* The destination surface does not have any surface. */
+   int          (*size_set)(Image_Entry *dst, const Image_Entry *src, int w, int h);
+
+   /* The destination surface does not have any surface. */
+   int          (*copied_data)(Image_Entry *dst, int w, int h, DATA32 *image_data, int alpha, int cspace);
+   /* The destination surface does not have any surface. */
+   int          (*data)(Image_Entry *dst, int w, int h, DATA32 *image_data, int alpha, int cspace);
+   int          (*color_space)(Image_Entry *dst, int cspace);
+
+   /* This function need to update im->w and im->h. */
+   int          (*load)(Image_Entry *im); /**< return is EVAS_LOAD_ERROR_* or EVAS_LOAD_ERROR_NONE! */
+   int          (*mem_size_get)(Image_Entry *im);
+   void         (*debug)(const char *context, Image_Entry *im);
+};
+
+struct _Evas_Cache_Image
+{
+   Evas_Cache_Image_Func         func;
+
+   Eina_List                   *preload;
+   Eina_List                   *pending;
+
+   Eina_Inlist                  *dirty;
+
+   Eina_Inlist                  *lru;
+   Eina_Inlist                  *lru_nodata;
+   Eina_Hash                    *inactiv;
+   Eina_Hash                    *activ;
+   void                         *data;
+
+   int                           usage;
+   int                           limit;
+   int                           references;
+};
+
+struct _Evas_Cache_Engine_Image_Func
+{
+   /* Must return a char* allocated with eina_stringshare_add. */
+   char*                (*key)(Image_Entry *im, const char *file, const char *key, RGBA_Image_Loadopts *lo, int *error);
+
+   Engine_Image_Entry*  (*alloc)(void);
+   void                 (*dealloc)(Engine_Image_Entry *eim);
+
+   int                  (*constructor)(Engine_Image_Entry *eim, void* data);
+   void                 (*destructor)(Engine_Image_Entry *eim);
+
+   void                 (*dirty_region)(Engine_Image_Entry *eim, int x, int y, int w, int h);
+   /* Only called when references > 0. Need to provide a fresh copie of im. */
+   int                  (*dirty)(Engine_Image_Entry *dst, const Engine_Image_Entry *src);
+   /* Only called when references == 1. We will call drop on `im'. */
+   int                  (*size_set)(Engine_Image_Entry *dst, const Engine_Image_Entry *src);
+
+   int                  (*update_data)(Engine_Image_Entry* dst, void* data);
+
+   void                 (*load)(Engine_Image_Entry *eim, const Image_Entry* im);
+   int                  (*mem_size_get)(Engine_Image_Entry *eim);
+   void                 (*debug)(const char* context, Engine_Image_Entry *eim);
+};
+
+struct _Evas_Cache_Engine_Image
+{
+   Evas_Cache_Engine_Image_Func func;
+
+   Eina_Inlist*                        dirty;
+
+   Eina_Hash*                   activ;
+   Eina_Hash*                   inactiv;
+   Eina_Inlist*                        lru;
+
+   Evas_Cache_Image*            parent;
+   Evas_Cache_Engine_Image*     brother;
+
+   int                          usage;
+   int                          limit;
+
+   int                          references;
+};
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+EAPI Evas_Cache_Image*        evas_cache_image_init(const Evas_Cache_Image_Func *cb);
+EAPI void                     evas_cache_image_shutdown(Evas_Cache_Image *cache);
+EAPI Image_Entry*             evas_cache_image_request(Evas_Cache_Image *cache, const char *file, const char *key, RGBA_Image_Loadopts *lo, int *error);
+EAPI void                     evas_cache_image_drop(Image_Entry *im);
+EAPI void                     evas_cache_image_data_not_needed(Image_Entry *im);
+EAPI int                      evas_cache_image_flush(Evas_Cache_Image *cache);
+EAPI void                     evas_cache_private_set(Evas_Cache_Image *cache, const void *data);
+EAPI void*                    evas_cache_private_get(Evas_Cache_Image *cache);
+EAPI void*                    evas_cache_private_from_image_entry_get(Image_Entry *im);
+
+EAPI int                      evas_cache_image_usage_get(Evas_Cache_Image *cache);
+EAPI int                      evas_cache_image_get(Evas_Cache_Image *cache);
+EAPI void                     evas_cache_image_set(Evas_Cache_Image *cache, int size);
+
+EAPI Image_Entry*             evas_cache_image_alone(Image_Entry *im);
+EAPI Image_Entry*             evas_cache_image_dirty(Image_Entry *im, int x, int y, int w, int h);
+EAPI void                     evas_cache_image_load_data(Image_Entry *im);
+EAPI void                     evas_cache_image_unload_data(Image_Entry *im);
+EAPI Eina_Bool                evas_cache_image_is_loaded(Image_Entry *im);
+EAPI void                     evas_cache_image_unload_all(Evas_Cache_Image *cache);
+EAPI void                     evas_cache_image_surface_alloc(Image_Entry *im, int w, int h);
+EAPI DATA32*                  evas_cache_image_pixels(Image_Entry *im);
+EAPI Image_Entry*             evas_cache_image_copied_data(Evas_Cache_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace);
+EAPI Image_Entry*             evas_cache_image_data(Evas_Cache_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace);
+EAPI void                     evas_cache_image_colorspace(Image_Entry *im, int cspace);
+EAPI Image_Entry*             evas_cache_image_empty(Evas_Cache_Image *cache);
+EAPI Image_Entry*             evas_cache_image_size_set(Image_Entry *im, int w, int h);
+
+EAPI Evas_Cache_Engine_Image* evas_cache_engine_image_init(const Evas_Cache_Engine_Image_Func *cb, Evas_Cache_Image *parent);
+EAPI void                     evas_cache_engine_image_shutdown(Evas_Cache_Engine_Image *cache);
+
+EAPI int                      evas_cache_engine_image_usage_get(Evas_Cache_Engine_Image *cache);
+EAPI int                      evas_cache_engine_image_get(Evas_Cache_Engine_Image *cache);
+EAPI void                     evas_cache_engine_image_set(Evas_Cache_Engine_Image *cache, int limit);
+
+EAPI Engine_Image_Entry*      evas_cache_engine_image_request(Evas_Cache_Engine_Image *cache, const char *file, const char *key, RGBA_Image_Loadopts *lo, void *engine_data, int *error);
+EAPI void                     evas_cache_engine_parent_not_needed(Engine_Image_Entry *eim);
+EAPI Engine_Image_Entry*      evas_cache_engine_image_engine(Evas_Cache_Engine_Image *cache, void *engine_data);
+EAPI void                     evas_cache_engine_image_drop(Engine_Image_Entry *eim);
+EAPI Engine_Image_Entry*      evas_cache_engine_image_alone(Engine_Image_Entry *eim, void *data);
+EAPI Engine_Image_Entry*      evas_cache_engine_image_dirty(Engine_Image_Entry *eim, int x, int y, int w, int h);
+EAPI Engine_Image_Entry*      evas_cache_engine_image_copied_data(Evas_Cache_Engine_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace, void *engine_data);
+EAPI Engine_Image_Entry*      evas_cache_engine_image_data(Evas_Cache_Engine_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace, void *engine_data);
+EAPI void                     evas_cache_engine_image_colorspace(Engine_Image_Entry *eim, int cspace, void *engine_data);
+EAPI Engine_Image_Entry*      evas_cache_engine_image_size_set(Engine_Image_Entry *eim, int w, int h);
+
+EAPI void                     evas_cache_engine_image_load_data(Engine_Image_Entry *eim);
+
+EAPI void                     evas_cache_image_preload_data(Image_Entry *im, const void *target);
+EAPI void                     evas_cache_image_preload_cancel(Image_Entry *im, const void *target);
+
+EAPI void                     evas_cache_image_wakeup(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _EVAS_CACHE_H */
diff --git a/src/lib/cache/evas_cache_engine_image.c b/src/lib/cache/evas_cache_engine_image.c
new file mode 100644 (file)
index 0000000..ca9f9aa
--- /dev/null
@@ -0,0 +1,707 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include <assert.h>
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+static void
+_evas_cache_engine_image_make_dirty(Evas_Cache_Engine_Image *cache,
+                                    Engine_Image_Entry *eim)
+{
+   eim->flags.cached = 1;
+   eim->flags.dirty = 1;
+   eim->flags.loaded = 1;
+   eim->flags.activ = 0;
+   cache->dirty = eina_inlist_prepend(cache->dirty, EINA_INLIST_GET(eim));
+}
+
+static void
+_evas_cache_engine_image_make_active(Evas_Cache_Engine_Image *cache,
+                                     Engine_Image_Entry *eim,
+                                     const char *key)
+{
+   eim->flags.cached = 1;
+   eim->flags.activ = 1;
+   eim->flags.dirty = 0;
+   eina_hash_add(cache->activ, key, eim);
+}
+
+static void
+_evas_cache_engine_image_make_inactive(Evas_Cache_Engine_Image *cache,
+                                       Engine_Image_Entry *eim,
+                                       const char *key)
+{
+   eim->flags.cached = 1;
+   eim->flags.dirty = 0;
+   eim->flags.activ = 0;
+   eina_hash_add(cache->inactiv, key, eim);
+   cache->lru = eina_inlist_prepend(cache->lru, EINA_INLIST_GET(eim));
+   cache->usage += cache->func.mem_size_get(eim);
+}
+
+static void
+_evas_cache_engine_image_remove_activ(Evas_Cache_Engine_Image *cache,
+                                      Engine_Image_Entry *eim)
+{
+   if (eim->flags.cached)
+     {
+        if (eim->flags.dirty)
+          {
+            cache->dirty = eina_inlist_remove(cache->dirty, EINA_INLIST_GET(eim));
+          }
+        else
+          if (eim->flags.activ)
+            {
+              eina_hash_del(cache->activ, eim->cache_key, eim);
+            }
+          else
+            {
+               cache->usage -= cache->func.mem_size_get(eim);
+              eina_hash_del(cache->inactiv, eim->cache_key, eim);
+               cache->lru = eina_inlist_remove(cache->lru, EINA_INLIST_GET(eim));
+            }
+        eim->flags.cached = 0;
+        eim->flags.dirty = 0;
+        eim->flags.activ = 0;
+     }
+}
+
+static Engine_Image_Entry *
+_evas_cache_engine_image_alloc(Evas_Cache_Engine_Image *cache,
+                               Image_Entry *ie,
+                               const char *hkey)
+{
+   Engine_Image_Entry   *eim;
+
+   assert(cache);
+
+   if (cache->func.alloc)
+     eim = cache->func.alloc();
+   else
+     eim = malloc(sizeof (Engine_Image_Entry));
+
+   if (!eim) goto on_error;
+   memset(eim, 0, sizeof (Engine_Image_Entry));
+
+   eim->cache = cache;
+   if (ie)
+     {
+        eim->w = ie->w;
+        eim->h = ie->h;
+        eim->src = ie;
+        eim->flags.need_parent = 1;
+     }
+   else
+     {
+        eim->w = -1;
+        eim->h = -1;
+        eim->flags.need_parent = 0;
+        eim->src = NULL;
+     }
+
+   eim->flags.cached = 0;
+   eim->references = 0;
+   eim->cache_key = hkey;
+
+   if (hkey)
+     _evas_cache_engine_image_make_active(cache, eim, hkey);
+   else
+     _evas_cache_engine_image_make_dirty(cache, eim);
+
+   return eim;
+
+ on_error:
+   if (eim)
+     evas_cache_engine_image_drop(eim);
+   eina_stringshare_del(hkey);
+   evas_cache_image_drop(ie);
+   return NULL;
+}
+
+static void
+_evas_cache_engine_image_dealloc(Evas_Cache_Engine_Image *cache, Engine_Image_Entry *eim)
+{
+   Image_Entry   *im;
+
+   if (cache->func.debug) cache->func.debug("delete", eim);
+
+   _evas_cache_engine_image_remove_activ(cache, eim);
+
+   im = eim->src;
+   cache->func.destructor(eim);
+   if (im) evas_cache_image_drop(im);
+
+   if (cache->func.dealloc)
+     {
+        cache->func.dealloc(eim);
+     }
+   else
+     {
+        memset(eim, 0, sizeof (Engine_Image_Entry));
+        free(eim);
+     }
+}
+
+EAPI int
+evas_cache_engine_image_usage_get(Evas_Cache_Engine_Image *cache)
+{
+   assert(cache != NULL);
+
+   return cache->usage;
+}
+
+EAPI int
+evas_cache_engine_image_get(Evas_Cache_Engine_Image *cache)
+{
+   assert(cache != NULL);
+
+   return cache->limit;
+}
+
+EAPI void
+evas_cache_engine_image_set(Evas_Cache_Engine_Image *cache, int limit)
+{
+   assert(cache != NULL);
+
+   cache->limit = limit;
+}
+
+EAPI Evas_Cache_Engine_Image *
+evas_cache_engine_image_init(const Evas_Cache_Engine_Image_Func *cb, Evas_Cache_Image *parent)
+{
+   Evas_Cache_Engine_Image     *new;
+
+   new = malloc(sizeof (Evas_Cache_Engine_Image));
+   if (!new)
+     return NULL;
+
+   new->func = *cb;
+
+   new->limit = 0;
+   new->usage = 0;
+
+   new->dirty = NULL;
+   new->lru = NULL;
+   new->activ = eina_hash_string_superfast_new(NULL);
+   new->inactiv = eina_hash_string_superfast_new(NULL);
+
+   new->parent = parent;
+   parent->references++;
+
+   new->brother = NULL;
+
+   return new;
+}
+
+EAPI Evas_Cache_Engine_Image *
+evas_cache_engine_image_dup(const Evas_Cache_Engine_Image_Func *cb, Evas_Cache_Engine_Image *brother)
+{
+   Evas_Cache_Engine_Image     *new;
+
+   new = malloc(sizeof (Evas_Cache_Engine_Image));
+   if (!new)
+     return NULL;
+
+   new->func = brother->func;
+
+#define ORD(Func) if (cb->Func) new->func.Func = cb->Func;
+
+   ORD(key);
+   ORD(constructor);
+   ORD(destructor);
+   ORD(dirty_region);
+   ORD(dirty);
+   ORD(size_set);
+   ORD(update_data);
+   ORD(load);
+   ORD(mem_size_get);
+   ORD(debug);
+
+#undef ORD
+
+   new->limit = -1;
+   new->usage = 0;
+   new->references = 1;
+
+   new->dirty = NULL;
+   new->activ = NULL;
+
+   new->parent = brother->parent;
+   new->parent->references++;
+
+   new->brother = brother;
+   brother->references++;
+
+   return new;
+}
+
+static Eina_Bool
+_evas_cache_engine_image_free_cb(__UNUSED__ const Eina_Hash *hash, __UNUSED__ const void *key, void *data, void *fdata)
+{
+   Eina_List **delete_list = fdata;
+
+   *delete_list = eina_list_prepend(*delete_list, data);
+
+   return EINA_TRUE;
+}
+
+EAPI void
+evas_cache_engine_image_flush(Evas_Cache_Engine_Image *cache)
+{
+   assert(cache != NULL);
+
+   while ((cache->lru) && (cache->limit < cache->usage))
+     {
+        Engine_Image_Entry      *eim;
+
+        eim = (Engine_Image_Entry *) cache->lru->last;
+        _evas_cache_engine_image_dealloc(cache, eim);
+     }
+}
+
+EAPI void
+evas_cache_engine_image_shutdown(Evas_Cache_Engine_Image *cache)
+{
+   Engine_Image_Entry   *eim;
+   Eina_List *delete_list = NULL;
+
+   assert(cache != NULL);
+
+   if (cache->func.debug) cache->func.debug("shutdown-engine", NULL);
+
+   eina_hash_foreach(cache->inactiv, _evas_cache_engine_image_free_cb, &delete_list);
+   eina_hash_foreach(cache->activ, _evas_cache_engine_image_free_cb, &delete_list);
+
+   while (delete_list)
+     {
+       _evas_cache_engine_image_dealloc(cache, eina_list_data_get(delete_list));
+       delete_list = eina_list_remove_list(delete_list, delete_list);
+     }
+
+   eina_hash_free(cache->inactiv);
+   eina_hash_free(cache->activ);
+
+   /* This is mad, I am about to destroy image still alive, but we need to prevent leak. */
+   while (cache->dirty)
+     {
+        eim = (Engine_Image_Entry *) cache->dirty;
+        _evas_cache_engine_image_dealloc(cache, eim);
+     }
+
+
+   evas_cache_image_shutdown(cache->parent);
+   if (cache->brother)
+     evas_cache_engine_image_shutdown(cache->brother);
+   free(cache);
+}
+
+EAPI Engine_Image_Entry *
+evas_cache_engine_image_request(Evas_Cache_Engine_Image *cache,
+                                const char *file, const char *key,
+                                RGBA_Image_Loadopts *lo, void *data, int *error)
+{
+   Engine_Image_Entry   *eim;
+   Image_Entry          *im;
+   const char          *ekey;
+
+   assert(cache != NULL);
+
+   *error = EVAS_LOAD_ERROR_NONE;
+
+   ekey = NULL;
+   eim = NULL;
+
+   im = evas_cache_image_request(cache->parent, file, key, lo, error);
+   if (!im)
+     goto on_error;
+
+   if (cache->func.key)
+     ekey = cache->func.key(im, file, key, lo, data);
+   else
+     ekey = eina_stringshare_add(im->cache_key);
+   if (!ekey)
+     {
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       goto on_error;
+     }
+
+   eim = eina_hash_find(cache->activ, ekey);
+   if (eim)
+     {
+        evas_cache_image_drop(im);
+        goto on_ok;
+     }
+
+   eim = eina_hash_find(cache->inactiv, ekey);
+   if (eim)
+     {
+        _evas_cache_engine_image_remove_activ(cache, eim);
+        _evas_cache_engine_image_make_active(cache, eim, ekey);
+        evas_cache_image_drop(im);
+        goto on_ok;
+     }
+
+   eim = _evas_cache_engine_image_alloc(cache, im, ekey);
+   if (!eim)
+     {
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       return NULL;
+     }
+
+   *error = cache->func.constructor(eim, data);
+   if (*error != EVAS_LOAD_ERROR_NONE) goto on_error;
+   if (cache->func.debug)
+     cache->func.debug("constructor-engine", eim);
+
+  on_ok:
+   eim->references++;
+   return eim;
+
+  on_error:
+   if (!eim)
+     {
+        if (im) evas_cache_image_drop(im);
+        if (ekey) eina_stringshare_del(ekey);
+     }
+   else
+     {
+        _evas_cache_engine_image_dealloc(cache, eim);
+     }
+
+   return NULL;
+}
+
+EAPI void
+evas_cache_engine_image_drop(Engine_Image_Entry *eim)
+{
+   Evas_Cache_Engine_Image     *cache;
+
+   assert(eim);
+   assert(eim->cache);
+
+   eim->references--;
+   cache = eim->cache;
+
+   if (eim->flags.dirty)
+     {
+        _evas_cache_engine_image_dealloc(cache, eim);
+        return ;
+     }
+
+   if (eim->references == 0)
+     {
+        _evas_cache_engine_image_remove_activ(cache, eim);
+        _evas_cache_engine_image_make_inactive(cache, eim, eim->cache_key);
+        evas_cache_engine_image_flush(cache);
+        return ;
+     }
+}
+
+EAPI Engine_Image_Entry *
+evas_cache_engine_image_dirty(Engine_Image_Entry *eim, int x, int y, int w, int h)
+{
+   Engine_Image_Entry           *eim_dirty = eim;
+   Image_Entry                  *im_dirty = NULL;
+   Image_Entry                  *im;
+   Evas_Cache_Engine_Image      *cache;
+   unsigned char                 alloc_eim;
+
+   assert(eim);
+   assert(eim->cache);
+
+   cache = eim->cache;
+   if (!(eim->flags.dirty))
+     {
+        alloc_eim = 0;
+
+        if (eim->flags.need_parent == 1)
+          {
+             im = eim->src;
+             im_dirty = evas_cache_image_dirty(im, x, y, w, h);
+
+             /* If im == im_dirty, this meens that we have only one reference to the eim. */
+             if (im != im_dirty)
+               {
+                  if (eim->references == 1)
+                    {
+                       _evas_cache_engine_image_remove_activ(cache, eim);
+                       _evas_cache_engine_image_make_dirty(cache, eim);
+
+                       eim->src = im_dirty;
+                    }
+                  else
+                    alloc_eim = 1;
+               }
+          }
+        else
+          if (eim->references > 1)
+            {
+               alloc_eim = 1;
+            }
+          else
+            {
+               _evas_cache_engine_image_remove_activ(cache, eim_dirty);
+               _evas_cache_engine_image_make_dirty(cache, eim_dirty);
+            }
+
+        if (alloc_eim == 1)
+          {
+             int           error;
+
+             eim_dirty = _evas_cache_engine_image_alloc(cache, im_dirty, NULL);
+             if (!eim_dirty) goto on_error;
+
+             eim_dirty->w = eim->w;
+             eim_dirty->h = eim->h;
+             eim_dirty->references = 1;
+
+             error = cache->func.dirty(eim_dirty, eim);
+             if (cache->func.debug)
+               cache->func.debug("dirty-engine", eim_dirty);
+
+             if (error != 0) goto on_error;
+
+             evas_cache_engine_image_drop(eim);
+          }
+     }
+
+   if (cache->func.dirty_region)
+     cache->func.dirty_region(eim_dirty, x, y, w, h);
+   if (cache->func.debug)
+     cache->func.debug("dirty-region-engine", eim_dirty);
+
+   return eim_dirty;
+
+  on_error:
+   if (eim) evas_cache_engine_image_drop(eim);
+   if (eim_dirty && eim_dirty != eim)
+     evas_cache_engine_image_drop(eim_dirty);
+   else
+     if (im_dirty) evas_cache_image_drop(im_dirty);
+
+   return NULL;
+}
+
+EAPI Engine_Image_Entry *
+evas_cache_engine_image_alone(Engine_Image_Entry *eim, void *data)
+{
+   Evas_Cache_Engine_Image      *cache;
+   Image_Entry                  *im;
+
+
+   assert(eim);
+   assert(eim->cache);
+
+   cache = eim->cache;
+   im = evas_cache_image_alone(eim->src);
+   if (im != eim->src)
+     {
+        eim = _evas_cache_engine_image_alloc(cache, im, NULL);
+        if (!eim) goto on_error;
+
+        eim->references = 1;
+
+        if (cache->func.constructor(eim, data) != EVAS_LOAD_ERROR_NONE)
+         goto on_error;
+     }
+   /* FIXME */
+   return eim;
+
+ on_error:
+   evas_cache_image_drop(im);
+   return NULL;
+}
+
+static Engine_Image_Entry *
+_evas_cache_engine_image_push_dirty(Evas_Cache_Engine_Image *cache, Image_Entry *im, void *engine_data)
+{
+   Engine_Image_Entry    *eim;
+   int                  error;
+
+   eim = _evas_cache_engine_image_alloc(cache, im, NULL);
+   if (!eim) goto on_error;
+   eim->references = 1;
+
+   error = cache->func.update_data(eim, engine_data);
+   if (cache->func.debug)
+     cache->func.debug("dirty-update_data-engine", eim);
+   if (error != 0) goto on_error;
+
+   return eim;
+
+  on_error:
+   if (eim)
+     evas_cache_engine_image_drop(eim);
+   return NULL;
+}
+
+EAPI Engine_Image_Entry *
+evas_cache_engine_image_copied_data(Evas_Cache_Engine_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace, void *engine_data)
+{
+   Image_Entry           *im;
+
+   assert(cache);
+
+   im = evas_cache_image_copied_data(cache->parent, w, h, image_data, alpha, cspace);
+
+   return _evas_cache_engine_image_push_dirty(cache, im, engine_data);
+}
+
+EAPI Engine_Image_Entry *
+evas_cache_engine_image_data(Evas_Cache_Engine_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace, void *engine_data)
+{
+   Image_Entry           *im;
+
+   assert(cache);
+
+   im = evas_cache_image_data(cache->parent, w, h, image_data, alpha, cspace);
+
+   return _evas_cache_engine_image_push_dirty(cache, im, engine_data);
+}
+
+EAPI Engine_Image_Entry *
+evas_cache_engine_image_size_set(Engine_Image_Entry *eim, int w, int h)
+{
+   Evas_Cache_Engine_Image      *cache;
+   Engine_Image_Entry           *new;
+   Image_Entry                  *im;
+   const char                   *hkey;
+   int                           error;
+
+   assert(eim);
+   assert(eim->cache);
+   assert(eim->references > 0);
+
+   im = NULL;
+   cache = eim->cache;
+
+   if (eim->flags.need_parent == 1)
+     {
+        assert(eim->src);
+
+        if (eim->src->w == w
+            && eim->src->h == h)
+          return eim;
+
+        im = evas_cache_image_size_set(eim->src, w, h);
+        /* FIXME: Good idea to call update_data ? */
+        if (im == eim->src) return eim;
+        eim->src = NULL;
+     }
+
+   hkey = (eim->references > 1 ) ? eina_stringshare_add(eim->cache_key) : NULL;
+
+   new = _evas_cache_engine_image_alloc(cache, im, hkey);
+   if (!new) goto on_error;
+
+   new->w = w;
+   new->h = h;
+   new->references = 1;
+
+   error = cache->func.size_set(new, eim);
+   if (error) goto on_error;
+
+   evas_cache_engine_image_drop(eim);
+   return new;
+
+  on_error:
+   if (new)
+     evas_cache_engine_image_drop(new);
+   else
+     if (im)
+       evas_cache_image_drop(im);
+   evas_cache_engine_image_drop(eim);
+
+   return NULL;
+}
+
+EAPI void
+evas_cache_engine_image_load_data(Engine_Image_Entry *eim)
+{
+   Evas_Cache_Engine_Image     *cache;
+   int                          size = 0;
+
+   assert(eim);
+   assert(eim->src);
+   assert(eim->cache);
+
+   if (eim->flags.loaded) return;
+
+   if (eim->src)
+     evas_cache_image_load_data(eim->src);
+
+   cache = eim->cache;
+   if (cache->func.debug)
+     cache->func.debug("load-engine", eim);
+
+   if (eim->flags.dirty)
+     size = cache->func.mem_size_get(eim);
+   cache = eim->cache;
+   cache->func.load(eim, eim->src);
+   if (eim->flags.dirty)
+     cache->usage += cache->func.mem_size_get(eim) - size;
+
+   eim->flags.loaded = 1;
+}
+
+EAPI Engine_Image_Entry *
+evas_cache_engine_image_engine(Evas_Cache_Engine_Image *cache, void *engine_data)
+{
+   Engine_Image_Entry   *eim;
+   Image_Entry          *ie;
+   int                   error;
+
+   ie = evas_cache_image_empty(cache->parent);
+   if (!ie) return NULL;
+
+   eim = _evas_cache_engine_image_alloc(cache, ie, NULL);
+   if (!eim) goto on_error;
+   eim->references = 1;
+
+   error = cache->func.update_data(eim, engine_data);
+   if (cache->func.debug)
+     cache->func.debug("update_data-engine", eim);
+
+   if (error != 0) goto on_error;
+
+   return eim;
+
+  on_error:
+   if (!eim)
+     {
+        if (ie)
+          evas_cache_image_drop(ie);
+     }
+   else
+     {
+        evas_cache_engine_image_drop(eim);
+     }
+   return NULL;
+}
+
+EAPI void
+evas_cache_engine_image_colorspace(Engine_Image_Entry *eim, int cspace, void *engine_data)
+{
+   Evas_Cache_Engine_Image     *cache = eim->cache;
+
+   assert(cache);
+
+   cache->func.destructor(eim);
+   evas_cache_image_colorspace(eim->src, cspace);
+   cache->func.constructor(eim, engine_data);
+   if (cache->func.debug)
+     cache->func.debug("cosntructor-colorspace-engine", eim);
+}
+
+EAPI void
+evas_cache_engine_parent_not_needed(Engine_Image_Entry *eim)
+{
+   assert(eim);
+   assert(eim->cache);
+
+   eim->flags.need_parent = 0;
+   evas_cache_image_data_not_needed(eim->src);
+}
diff --git a/src/lib/cache/evas_cache_image.c b/src/lib/cache/evas_cache_image.c
new file mode 100644 (file)
index 0000000..68a1d60
--- /dev/null
@@ -0,0 +1,1385 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <assert.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+#ifdef EVAS_CSERVE
+// FIXME: cache server and threaded preload clash badly atm - disable
+//#undef BUILD_ASYNC_PRELOAD
+#endif
+
+#ifdef BUILD_ASYNC_PRELOAD
+typedef struct _Evas_Cache_Preload Evas_Cache_Preload;
+
+struct _Evas_Cache_Preload
+{
+   EINA_INLIST;
+   Image_Entry *ie;
+};
+
+static LK(engine_lock) = PTHREAD_MUTEX_INITIALIZER;
+static LK(wakeup) = PTHREAD_MUTEX_INITIALIZER;
+
+static pthread_cond_t cond_wakeup = PTHREAD_COND_INITIALIZER;
+
+static void _evas_cache_image_entry_preload_remove(Image_Entry *ie, const void *target);
+#endif
+
+#define FREESTRC(Var)              \
+  if (Var)                         \
+    {                              \
+       eina_stringshare_del(Var);  \
+       Var = NULL;                 \
+    }
+
+static void _evas_cache_image_entry_delete(Evas_Cache_Image *cache, Image_Entry *ie);
+
+static void
+_evas_cache_image_make_dirty(Evas_Cache_Image *cache,
+                             Image_Entry *im)
+{
+   im->flags.cached = 1;
+   im->flags.dirty = 1;
+   im->flags.activ = 0;
+   im->flags.lru_nodata = 0;
+   cache->dirty = eina_inlist_prepend(cache->dirty, EINA_INLIST_GET(im));
+
+   if (im->cache_key)
+     {
+        eina_stringshare_del(im->cache_key);
+        im->cache_key = NULL;
+     }
+}
+
+static void
+_evas_cache_image_make_activ(Evas_Cache_Image *cache,
+                             Image_Entry *im,
+                             const char *key)
+{
+   /* FIXME: Handle case when image is being processed anyway and don't do a double decode. */
+   im->cache_key = key;
+   if (key != NULL)
+     {
+        im->flags.cached = 1;
+        im->flags.activ = 1;
+        im->flags.lru_nodata = 0;
+        im->flags.dirty = 0;
+       eina_hash_direct_add(cache->activ, key, im);
+     }
+   else
+     {
+        _evas_cache_image_make_dirty(cache, im);
+     }
+}
+
+static void
+_evas_cache_image_make_inactiv(Evas_Cache_Image *cache,
+                               Image_Entry *im,
+                               const char *key)
+{
+   if (im->cache_key)
+     {
+       im->flags.activ = 0;
+       im->flags.dirty = 0;
+       im->flags.cached = 1;
+       eina_hash_direct_add(cache->inactiv, key, im);
+       cache->lru = eina_inlist_prepend(cache->lru, EINA_INLIST_GET(im));
+       cache->usage += cache->func.mem_size_get(im);
+     }
+   else
+     {
+       _evas_cache_image_entry_delete(cache, im);
+     }
+ }
+
+static void
+_evas_cache_image_remove_lru_nodata(Evas_Cache_Image *cache,
+                                    Image_Entry *im)
+{
+   if (im->flags.lru_nodata)
+     {
+        im->flags.lru_nodata = 0;
+        cache->lru_nodata = eina_inlist_remove(cache->lru_nodata, EINA_INLIST_GET(im));
+        cache->usage -= cache->func.mem_size_get(im);
+     }
+}
+
+static void
+_evas_cache_image_activ_lru_nodata(Evas_Cache_Image *cache,
+                                   Image_Entry *im)
+{
+   im->flags.need_data = 0;
+   im->flags.lru_nodata = 1;
+   cache->lru_nodata = eina_inlist_prepend(cache->lru_nodata, EINA_INLIST_GET(im));
+   cache->usage += cache->func.mem_size_get(im);
+}
+
+static void
+_evas_cache_image_remove_activ(Evas_Cache_Image *cache,
+                               Image_Entry *ie)
+{
+   if (ie->flags.cached)
+     {
+        if (ie->flags.activ)
+          {
+            eina_hash_del(cache->activ, ie->cache_key, ie);
+             _evas_cache_image_remove_lru_nodata(cache, ie);
+          }
+        else
+          {
+             if (ie->flags.dirty)
+               {
+                 cache->dirty = eina_inlist_remove(cache->dirty, EINA_INLIST_GET(ie));
+               }
+             else
+               {
+                 eina_hash_del(cache->inactiv, ie->cache_key, ie);
+                  cache->lru = eina_inlist_remove(cache->lru, EINA_INLIST_GET(ie));
+                  cache->usage -= cache->func.mem_size_get(ie);
+               }
+          }
+        ie->flags.cached = 0;
+        ie->flags.dirty = 0;
+        ie->flags.activ = 0;
+     }
+}
+
+static void
+_evas_cache_image_entry_delete(Evas_Cache_Image *cache, Image_Entry *ie)
+{
+   if (!ie) return ;
+
+   if (cache->func.debug)
+     cache->func.debug("deleting", ie);
+
+#ifdef BUILD_ASYNC_PRELOAD
+   if (ie->flags.delete_me == 1)
+     return ;
+
+   if (ie->preload)
+     {
+       ie->flags.delete_me = 1;
+
+       _evas_cache_image_entry_preload_remove(ie, NULL);
+       return ;
+     }
+#endif
+
+   cache->func.destructor(ie);
+
+   _evas_cache_image_remove_activ(cache, ie);
+
+   if (ie->cache_key)
+     {
+        eina_stringshare_del(ie->cache_key);
+        ie->cache_key = NULL;
+     }
+
+   FREESTRC(ie->file);
+   FREESTRC(ie->key);
+
+   ie->cache = NULL;
+
+   cache->func.surface_delete(ie);
+
+#ifdef BUILD_ASYNC_PRELOAD
+   LKD(ie->lock);
+#endif
+
+   cache->func.dealloc(ie);
+}
+
+static Image_Entry *
+_evas_cache_image_entry_new(Evas_Cache_Image *cache,
+                            const char *hkey,
+                            time_t timestamp,
+                            const char *file,
+                            const char *key,
+                            RGBA_Image_Loadopts *lo,
+                            int *error)
+{
+   Image_Entry  *ie;
+   const char   *cache_key;
+
+   ie = cache->func.alloc();
+   if (!ie)
+     {
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       return NULL;
+     }
+
+   cache_key = hkey ? eina_stringshare_add(hkey) : NULL;
+
+   ie->flags.loaded = 0;
+   ie->flags.need_data = 1;
+
+   _evas_cache_image_make_activ(cache, ie, cache_key);
+
+   ie->space = EVAS_COLORSPACE_ARGB8888;
+   ie->w = -1;
+   ie->h = -1;
+   ie->allocated.w = 0;
+   ie->allocated.h = 0;
+
+   ie->references = 0;
+   ie->cache = cache;
+
+   ie->file = file ? eina_stringshare_add(file) : NULL;
+   ie->key = key ? eina_stringshare_add(key) : NULL;
+
+   ie->timestamp = timestamp;
+   ie->laststat = time(NULL);
+
+   ie->load_opts.scale_down_by = 0;
+   ie->load_opts.dpi = 0;
+   ie->load_opts.w = 0;
+   ie->load_opts.h = 0;
+   ie->load_opts.region.x = 0;
+   ie->load_opts.region.y = 0;
+   ie->load_opts.region.w = 0;
+   ie->load_opts.region.h = 0;
+   ie->scale = 1;
+
+#ifdef BUILD_ASYNC_PRELOAD
+   LKI(ie->lock);
+   ie->targets = NULL;
+   ie->preload = NULL;
+   ie->flags.delete_me = 0;
+#endif
+
+   if (lo)
+     ie->load_opts = *lo;
+
+   if (file)
+     {
+        *error = cache->func.constructor(ie);
+        if (*error != EVAS_LOAD_ERROR_NONE)
+          {
+             _evas_cache_image_entry_delete(cache, ie);
+             return NULL;
+          }
+     }
+   if (cache->func.debug)
+     cache->func.debug("build", ie);
+
+   return ie;
+}
+
+static void
+_evas_cache_image_entry_surface_alloc__locked(Evas_Cache_Image *cache,
+                                             Image_Entry *ie,
+                                             int wmin,
+                                             int hmin)
+{
+   if (ie->allocated.w == wmin && ie->allocated.h == hmin)
+     return ;
+
+   if (cache->func.surface_alloc(ie, wmin, hmin))
+     {
+        wmin = 0;
+        hmin = 0;
+     }
+
+   ie->w = wmin;
+   ie->h = hmin;
+   ie->allocated.w = wmin;
+   ie->allocated.h = hmin;
+}
+
+static void
+_evas_cache_image_entry_surface_alloc(Evas_Cache_Image *cache,
+                                      Image_Entry *ie,
+                                      int w,
+                                      int h)
+{
+   int  wmin;
+   int  hmin;
+
+   wmin = w > 0 ? w : 1;
+   hmin = h > 0 ? h : 1;
+
+#ifdef BUILD_ASYNC_PRELOAD
+   LKL(engine_lock);
+#endif
+   _evas_cache_image_entry_surface_alloc__locked(cache, ie, wmin, hmin);
+#ifdef BUILD_ASYNC_PRELOAD
+   LKU(engine_lock);
+#endif
+}
+
+#ifdef BUILD_ASYNC_PRELOAD
+static void
+_evas_cache_image_async_heavy(void *data)
+{
+   Evas_Cache_Image *cache;
+   Image_Entry *current;
+   int error;
+   int pchannel;
+
+   current = data;
+
+   LKL(current->lock);
+   pchannel = current->channel;
+   current->channel++;
+   cache = current->cache;
+
+   if (!current->flags.loaded && ((Evas_Image_Load_Func*) current->info.module)->threadable)
+     {
+       error = cache->func.load(current);
+       if (cache->func.debug)
+         cache->func.debug("load", current);
+       if (error != EVAS_LOAD_ERROR_NONE)
+         {
+            current->flags.loaded = 0;
+            _evas_cache_image_entry_surface_alloc(cache, current,
+                                                  current->w, current->h);
+         }
+       else
+         current->flags.loaded = 1;
+     }
+
+   current->channel = pchannel;
+   LKU(current->lock);
+}
+
+static void
+_evas_cache_image_async_end(void *data)
+{
+   Image_Entry *ie = (Image_Entry *) data;
+   Evas_Cache_Target *tmp;
+
+   ie->cache->preload = eina_list_remove(ie->cache->preload, ie);
+   ie->cache->pending = eina_list_remove(ie->cache->pending, ie);
+
+   ie->preload = NULL;
+   ie->flags.preload_done = ie->flags.loaded;
+   while (ie->targets)
+     {
+       tmp = ie->targets;
+
+       evas_object_inform_call_image_preloaded((Evas_Object*) tmp->target);
+       ie->targets = (Evas_Cache_Target*) eina_inlist_remove(EINA_INLIST_GET(ie->targets), EINA_INLIST_GET(ie->targets));
+       free(tmp);
+     }
+}
+
+static void
+_evas_cache_image_async_cancel(void *data)
+{
+   Image_Entry *ie = (Image_Entry *) data;
+
+   ie->preload = NULL;
+   ie->cache->pending = eina_list_remove(ie->cache->pending, ie);
+
+   if (ie->flags.delete_me || ie->flags.dirty)
+     {
+       ie->flags.delete_me = 0;
+       _evas_cache_image_entry_delete(ie->cache, ie);
+
+       return ;
+     }
+
+   if (ie->flags.loaded)
+     {
+       _evas_cache_image_async_end(ie);
+     }
+
+   if (ie->references == 0)
+     {
+       _evas_cache_image_remove_activ(ie->cache, ie);
+       _evas_cache_image_make_inactiv(ie->cache, ie, ie->cache_key);
+       evas_cache_image_flush(ie->cache);
+     }
+}
+
+static int
+_evas_cache_image_entry_preload_add(Image_Entry *ie,
+                                   const void *target)
+{
+   Evas_Cache_Target *tg;
+
+   if (ie->flags.preload_done) return 0;
+
+   tg = malloc(sizeof (Evas_Cache_Target));
+   if (!tg) return 0;
+
+   tg->target = target;
+
+   ie->targets = (Evas_Cache_Target*) eina_inlist_append(EINA_INLIST_GET(ie->targets), EINA_INLIST_GET(tg));
+
+   if (!ie->preload)
+     {
+        ie->cache->preload = eina_list_append(ie->cache->preload, ie);
+        ie->flags.pending = 0;
+
+        ie->preload = evas_preload_thread_run(_evas_cache_image_async_heavy,
+                                              _evas_cache_image_async_end,
+                                              _evas_cache_image_async_cancel,
+                                              ie);
+     }
+
+   return 1;
+}
+
+static void
+_evas_cache_image_entry_preload_remove(Image_Entry *ie, const void *target)
+{
+   if (target)
+     {
+       Evas_Cache_Target *tg;
+
+       EINA_INLIST_FOREACH(ie->targets, tg)
+         {
+            if (tg->target == target)
+              {
+                 // FIXME: No callback when we cancel only for one target ?
+                 ie->targets = (Evas_Cache_Target*) eina_inlist_remove(EINA_INLIST_GET(ie->targets), EINA_INLIST_GET(tg));
+                 free(tg);
+                 break;
+              }
+         }
+     }
+   else
+     {
+       Evas_Cache_Target *tg;
+
+       while (ie->targets)
+         {
+            tg = ie->targets;
+
+            ie->targets = (Evas_Cache_Target*) eina_inlist_remove(EINA_INLIST_GET(ie->targets), EINA_INLIST_GET(tg));
+            free(tg);
+         }
+     }
+
+   if (ie->targets == NULL && ie->preload && !ie->flags.pending)
+     {
+       ie->cache->preload = eina_list_remove(ie->cache->preload, ie);
+       ie->cache->pending = eina_list_append(ie->cache->pending, ie);
+
+       ie->flags.pending = 1;
+
+       evas_preload_thread_cancel(ie->preload);
+     }
+}
+#endif
+
+EAPI int
+evas_cache_image_usage_get(Evas_Cache_Image *cache)
+{
+   assert(cache != NULL);
+
+   return cache->usage;
+}
+
+EAPI int
+evas_cache_image_get(Evas_Cache_Image *cache)
+{
+   assert(cache != NULL);
+
+   return cache->limit;
+}
+
+EAPI void
+evas_cache_image_set(Evas_Cache_Image *cache, int limit)
+{
+   assert(cache != NULL);
+   if (cache->limit == limit) return;
+   cache->limit = limit;
+   evas_cache_image_flush(cache);
+}
+
+EAPI Evas_Cache_Image *
+evas_cache_image_init(const Evas_Cache_Image_Func *cb)
+{
+   Evas_Cache_Image    *new;
+
+   new = malloc(sizeof (Evas_Cache_Image));
+   if (!new)
+     return NULL;
+
+   new->func = *cb;
+
+   new->limit = 0;
+   new->usage = 0;
+
+   new->dirty = NULL;
+   new->lru = NULL;
+   new->lru_nodata = NULL;
+   new->inactiv = eina_hash_string_superfast_new(NULL);
+   new->activ = eina_hash_string_superfast_new(NULL);
+
+   new->references = 1;
+
+   new->preload = NULL;
+   new->pending = NULL;
+
+   return new;
+}
+
+static Eina_Bool
+_evas_cache_image_free_cb(__UNUSED__ const Eina_Hash *hash, __UNUSED__ const void *key, void *data, void *fdata)
+{
+   Eina_List **delete_list = fdata;
+
+   *delete_list = eina_list_prepend(*delete_list, data);
+
+   return EINA_TRUE;
+}
+
+EAPI void
+evas_cache_image_shutdown(Evas_Cache_Image *cache)
+{
+   Eina_List *delete_list;
+   Image_Entry  *im;
+
+   assert(cache != NULL);
+   cache->references--;
+
+   if (cache->references > 0)
+     return ;
+
+#ifdef BUILD_ASYNC_PRELOAD
+   EINA_LIST_FREE(cache->preload, im)
+     {
+       /* By doing that we are protecting us from destroying image when the cache is no longuer available. */
+       im->flags.delete_me = 1;
+       _evas_cache_image_entry_preload_remove(im, NULL);
+     }
+
+   evas_async_events_process();
+#endif
+
+   while (cache->lru)
+     {
+        im = (Image_Entry *) cache->lru;
+        _evas_cache_image_entry_delete(cache, im);
+     }
+
+   while (cache->lru_nodata)
+     {
+        im = (Image_Entry *) cache->lru_nodata;
+        _evas_cache_image_entry_delete(cache, im);
+     }
+
+   /* This is mad, I am about to destroy image still alive, but we need to prevent leak. */
+   while (cache->dirty)
+     {
+        im = (Image_Entry *) cache->dirty;
+        _evas_cache_image_entry_delete(cache, im);
+     }
+
+   delete_list = NULL;
+   eina_hash_foreach(cache->activ, _evas_cache_image_free_cb, &delete_list);
+
+   while (delete_list)
+     {
+       _evas_cache_image_entry_delete(cache, eina_list_data_get(delete_list));
+       delete_list = eina_list_remove_list(delete_list, delete_list);
+     }
+
+#ifdef BUILD_ASYNC_PRELOAD
+   /* Now wait for all pending image to die */
+   while (cache->pending)
+     {
+       evas_async_events_process();
+
+       LKL(wakeup);
+       if (cache->pending)
+         pthread_cond_wait(&cond_wakeup, &wakeup);
+       LKU(wakeup);
+     }
+#endif
+
+   eina_hash_free(cache->activ);
+   eina_hash_free(cache->inactiv);
+
+   free(cache);
+}
+
+#define STAT_GAP 2
+
+EAPI Image_Entry *
+evas_cache_image_request(Evas_Cache_Image *cache, const char *file, const char *key, RGBA_Image_Loadopts *lo, int *error)
+{
+   const char           *ckey = "(null)";
+   char                 *hkey;
+   Image_Entry          *im;
+   Evas_Image_Load_Opts  prevent = { 0, 0, 0, 0, { 0, 0, 0, 0 } };
+   size_t                size;
+   int                   stat_done = 0;
+   size_t                file_length;
+   size_t                key_length;
+   struct stat           st;
+
+   assert(cache != NULL);
+
+   if ((!file) || ((!file) && (!key)))
+     {
+       *error = EVAS_LOAD_ERROR_GENERIC;
+       return NULL;
+     }
+
+   file_length = strlen(file);
+   key_length = key ? strlen(key) : 6;
+
+   size = file_length + key_length + 128;
+   hkey = alloca(sizeof (char) * size);
+
+   memcpy(hkey, file, file_length);
+   size = file_length;
+
+   memcpy(hkey + size, "//://", 5);
+   size += 5;
+
+   if (key) ckey = key;
+   memcpy(hkey + size, ckey, key_length);
+   size += key_length;
+
+   if ((!lo) ||
+       (lo &&
+        (lo->scale_down_by == 0) &&
+        (lo->dpi == 0.0) &&
+        ((lo->w == 0) || (lo->h == 0)) &&
+        ((lo->region.w == 0) || (lo->region.w == 0))
+        ))
+     {
+        lo = &prevent;
+//        if (key)
+//          format = "%s//://%s";
+//        else
+//          format = "%s//://%p";
+     }
+   else
+     {
+       memcpy(hkey + size, "//@/", 4);
+       size += 4;
+
+       size += eina_convert_xtoa(lo->scale_down_by, hkey + size);
+
+       hkey[size] = '/';
+       size += 1;
+
+       size += eina_convert_dtoa(lo->dpi, hkey + size);
+
+       hkey[size] = '/';
+       size += 1;
+
+       size += eina_convert_xtoa(lo->w, hkey + size);
+
+       hkey[size] = 'x';
+       size += 1;
+
+       size += eina_convert_xtoa(lo->h, hkey + size);
+        
+       hkey[size] = '/';
+       size += 1;
+
+       size += eina_convert_xtoa(lo->region.x, hkey + size);
+        
+       hkey[size] = '+';
+       size += 1;
+        
+       size += eina_convert_xtoa(lo->region.y, hkey + size);
+        
+       hkey[size] = '.';
+       size += 1;
+        
+       size += eina_convert_xtoa(lo->region.w, hkey + size);
+        
+       hkey[size] = 'x';
+       size += 1;
+        
+       size += eina_convert_xtoa(lo->region.h, hkey + size);
+     }
+
+   hkey[size] = '\0';
+
+   im = eina_hash_find(cache->activ, hkey);
+   if (im)
+     {
+        time_t  t;
+        int     ok;
+
+        ok = 1;
+        t = time(NULL);
+        if ((t - im->laststat) > STAT_GAP)
+          {
+             stat_done = 1;
+             if (stat(file, &st) < 0) goto on_stat_error;
+
+             im->laststat = t;
+             if (st.st_mtime != im->timestamp) ok = 0;
+          }
+        if (ok) goto on_ok;
+
+        _evas_cache_image_remove_activ(cache, im);
+       _evas_cache_image_make_dirty(cache, im);
+     }
+
+   im = eina_hash_find(cache->inactiv, hkey);
+   if (im)
+     {
+        int     ok;
+
+        ok = 1;
+        if (!stat_done)
+          {
+             time_t  t;
+
+             t = time(NULL);
+             if ((t - im->laststat) > STAT_GAP)
+               {
+                  stat_done = 1;
+                  if (stat(file, &st) < 0) goto on_stat_error;
+
+                  im->laststat = t;
+                  if (st.st_mtime != im->timestamp) ok = 0;
+               }
+          }
+        else
+          if (st.st_mtime != im->timestamp) ok = 0;
+
+        if (ok)
+          {
+             _evas_cache_image_remove_activ(cache, im);
+             _evas_cache_image_make_activ(cache, im, im->cache_key);
+             goto on_ok;
+          }
+
+        _evas_cache_image_entry_delete(cache, im);
+     }
+
+   if (!stat_done)
+     {
+        if (stat(file, &st) < 0) goto on_stat_error;
+     }
+
+   im = _evas_cache_image_entry_new(cache, hkey, st.st_mtime, file, key, lo, error);
+   if (!im) return NULL;
+
+   if (cache->func.debug)
+     cache->func.debug("request", im);
+
+ on_ok:
+   *error = EVAS_LOAD_ERROR_NONE;
+   im->references++;
+   if (im->references > 1 && im->flags.lru_nodata)
+     _evas_cache_image_remove_lru_nodata(cache, im);
+
+   return im;
+
+ on_stat_error:
+#ifndef _WIN32
+   if ((errno == ENOENT) || (errno == ENOTDIR) ||
+       (errno == ENAMETOOLONG) || (errno == ELOOP))
+#else
+   if (errno == ENOENT)
+#endif
+     *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+#ifndef _WIN32
+   else if ((errno == ENOMEM) || (errno == EOVERFLOW))
+#else
+   else if (errno == ENOMEM)
+#endif
+     *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+   else if (errno == EACCES)
+     *error = EVAS_LOAD_ERROR_PERMISSION_DENIED;
+   else
+     *error = EVAS_LOAD_ERROR_GENERIC;
+
+   if (im) _evas_cache_image_entry_delete(cache, im);
+   return NULL;
+}
+
+EAPI void
+evas_cache_image_drop(Image_Entry *im)
+{
+   Evas_Cache_Image    *cache;
+
+   assert(im);
+   assert(im->cache);
+
+   im->references--;
+   cache = im->cache;
+
+   if (im->references == 0)
+     {
+#ifdef BUILD_ASYNC_PRELOAD
+       if (im->preload)
+         {
+            _evas_cache_image_entry_preload_remove(im, NULL);
+            return ;
+         }
+#endif
+
+       if (im->flags.dirty)
+         {
+            _evas_cache_image_entry_delete(cache, im);
+            return;
+         }
+
+        _evas_cache_image_remove_activ(cache, im);
+       _evas_cache_image_make_inactiv(cache, im, im->cache_key);
+       evas_cache_image_flush(cache);
+     }
+}
+
+EAPI void
+evas_cache_image_data_not_needed(Image_Entry *im)
+{
+   Evas_Cache_Image    *cache;
+
+   assert(im);
+   assert(im->cache);
+
+   cache = im->cache;
+
+   if (im->references > 1) return ;
+   if (im->flags.dirty || !im->flags.need_data) return ;
+
+   _evas_cache_image_activ_lru_nodata(cache, im);
+}
+
+EAPI Image_Entry *
+evas_cache_image_dirty(Image_Entry *im, int x, int y, int w, int h)
+{
+   Image_Entry          *im_dirty = im;
+   Evas_Cache_Image     *cache;
+
+   assert(im);
+   assert(im->cache);
+
+   cache = im->cache;
+   if (!(im->flags.dirty))
+     {
+#ifndef EVAS_CSERVE
+// if ref 1 also copy if using shared cache as its read-only
+        if (im->references == 1) im_dirty = im;
+        else
+#endif
+          {
+             int        error;
+
+             im_dirty = evas_cache_image_copied_data
+               (cache, im->w, im->h, 
+                evas_cache_image_pixels(im), 
+                im->flags.alpha, 
+                im->space);
+             if (!im_dirty) goto on_error;
+             if (cache->func.debug)
+               cache->func.debug("dirty-src", im);
+             error = cache->func.dirty(im_dirty, im);
+             if (cache->func.debug)
+               cache->func.debug("dirty-out", im_dirty);
+/*             
+             im_dirty = _evas_cache_image_entry_new(cache, NULL, im->timestamp, im->file, im->key, &im->load_opts, &error);
+             if (!im_dirty) goto on_error;
+
+             if (cache->func.debug)
+               cache->func.debug("dirty-src", im);
+             error = cache->func.dirty(im_dirty, im);
+             if (cache->func.debug)
+               cache->func.debug("dirty-out", im_dirty);
+
+             if (error != 0) goto on_error;
+ */
+             im_dirty->references = 1;
+
+             evas_cache_image_drop(im);
+          }
+
+       _evas_cache_image_remove_activ(cache, im_dirty);
+        _evas_cache_image_make_dirty(cache, im_dirty);
+     }
+
+   if (cache->func.debug)
+     cache->func.debug("dirty-region", im_dirty);
+   if (cache->func.dirty_region)
+     cache->func.dirty_region(im_dirty, x, y, w, h);
+
+   return im_dirty;
+
+ on_error:
+   if (im_dirty) _evas_cache_image_entry_delete(cache, im_dirty);
+   evas_cache_image_drop(im);
+   return NULL;
+}
+
+EAPI Image_Entry *
+evas_cache_image_alone(Image_Entry *im)
+{
+   Evas_Cache_Image     *cache;
+   Image_Entry          *im_dirty = im;
+
+   assert(im);
+   assert(im->cache);
+
+   cache = im->cache;
+   if (im->references == 1)
+     {
+        if (!(im->flags.dirty))
+          {
+             _evas_cache_image_remove_activ(cache, im);
+             _evas_cache_image_make_dirty(cache, im);
+          }
+     }
+   else
+     {
+        int     error;
+
+        im_dirty = evas_cache_image_copied_data
+          (cache, im->w, im->h, 
+           evas_cache_image_pixels(im), 
+           im->flags.alpha, 
+           im->space);
+        if (!im_dirty) goto on_error;
+        if (cache->func.debug)
+          cache->func.debug("dirty-src", im);
+        error = cache->func.dirty(im_dirty, im);
+        if (cache->func.debug)
+          cache->func.debug("dirty-out", im_dirty);
+/*        
+        im_dirty = _evas_cache_image_entry_new(cache, NULL, im->timestamp, im->file, im->key, &im->load_opts, &error);
+        if (!im_dirty) goto on_error;
+
+        if (cache->func.debug)
+          cache->func.debug("dirty-src", im);
+        error = cache->func.dirty(im_dirty, im);
+        if (cache->func.debug)
+          cache->func.debug("dirty-out", im_dirty);
+
+        if (error != 0) goto on_error;
+ */
+        im_dirty->references = 1;
+
+        evas_cache_image_drop(im);
+     }
+
+   return im_dirty;
+   
+   on_error:
+   if (im_dirty) _evas_cache_image_entry_delete(cache, im_dirty);
+   evas_cache_image_drop(im);
+   return NULL;
+}
+
+EAPI Image_Entry *
+evas_cache_image_copied_data(Evas_Cache_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Image_Entry  *im;
+
+   assert(cache);
+
+   if ((cspace == EVAS_COLORSPACE_YCBCR422P601_PL) ||
+       (cspace == EVAS_COLORSPACE_YCBCR422P709_PL))
+     w &= ~0x1;
+
+   im = _evas_cache_image_entry_new(cache, NULL, 0, NULL, NULL, NULL, NULL);
+   if (!im) return NULL;
+
+   im->space = cspace;
+   im->flags.alpha = alpha;
+
+   _evas_cache_image_entry_surface_alloc(cache, im, w, h);
+
+   if (cache->func.copied_data(im, w, h, image_data, alpha, cspace) != 0)
+     {
+        _evas_cache_image_entry_delete(cache, im);
+        return NULL;
+     }
+   im->references = 1;
+
+   if (cache->func.debug)
+     cache->func.debug("copied-data", im);
+   return im;
+}
+
+EAPI Image_Entry *
+evas_cache_image_data(Evas_Cache_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Image_Entry  *im;
+
+   assert(cache);
+
+   if ((cspace == EVAS_COLORSPACE_YCBCR422P601_PL) ||
+       (cspace == EVAS_COLORSPACE_YCBCR422P709_PL))
+     w &= ~0x1;
+
+   im = _evas_cache_image_entry_new(cache, NULL, 0, NULL, NULL, NULL, NULL);
+   im->w = w;
+   im->h = h;
+   im->flags.alpha = alpha;
+
+   if (cache->func.data(im, w, h, image_data, alpha, cspace) != 0)
+     {
+        _evas_cache_image_entry_delete(cache, im);
+        return NULL;
+     }
+   im->references = 1;
+
+   if (cache->func.debug)
+     cache->func.debug("data", im);
+   return im;
+}
+
+EAPI void
+evas_cache_image_surface_alloc(Image_Entry *im, int w, int h)
+{
+   Evas_Cache_Image     *cache;
+
+   assert(im);
+   assert(im->cache);
+
+   cache = im->cache;
+
+   if ((im->space == EVAS_COLORSPACE_YCBCR422P601_PL) ||
+       (im->space == EVAS_COLORSPACE_YCBCR422P709_PL))
+     w &= ~0x1;
+
+   _evas_cache_image_entry_surface_alloc(cache, im, w, h);
+
+   if (cache->func.debug)
+     cache->func.debug("surface-alloc", im);
+}
+
+EAPI Image_Entry *
+evas_cache_image_size_set(Image_Entry *im, int w, int h)
+{
+   Evas_Cache_Image    *cache;
+   Image_Entry         *new;
+   int                  error;
+
+   assert(im);
+   assert(im->cache);
+   assert(im->references > 0);
+
+   if ((im->space == EVAS_COLORSPACE_YCBCR422P601_PL) ||
+       (im->space == EVAS_COLORSPACE_YCBCR422P709_PL))
+     w &= ~0x1;
+
+   if ((im->w == w) && (im->h == h))
+     return im;
+
+   cache = im->cache;
+
+   new = _evas_cache_image_entry_new(cache, NULL, 0, NULL, NULL, NULL, &error);
+   if (!new) goto on_error;
+
+   new->flags.alpha = im->flags.alpha;
+   new->space = im->space;
+   new->load_opts = im->load_opts;
+
+   _evas_cache_image_entry_surface_alloc(cache, new, w, h);
+
+   error = cache->func.size_set(new, im, w, h);
+   if (error != 0) goto on_error;
+
+   new->references = 1;
+
+   evas_cache_image_drop(im);
+
+   if (cache->func.debug)
+     cache->func.debug("size_set", new);
+
+   return new;
+
+ on_error:
+   if (new) _evas_cache_image_entry_delete(cache, new);
+   evas_cache_image_drop(im);
+   return NULL;
+}
+
+EAPI void
+evas_cache_image_load_data(Image_Entry *im)
+{
+#ifdef BUILD_ASYNC_PRELOAD
+   Eina_Bool preload = EINA_FALSE;
+#endif
+   Evas_Cache_Image *cache;
+   int error;
+
+   assert(im);
+   assert(im->cache);
+   cache = im->cache;
+
+   if (im->flags.loaded)
+     {
+       return;
+     }
+
+#ifdef BUILD_ASYNC_PRELOAD
+   if (im->preload)
+     {
+       preload = EINA_TRUE;
+
+       if (!im->flags.pending)
+         {
+            im->cache->preload = eina_list_remove(im->cache->preload, im);
+            im->cache->pending = eina_list_append(im->cache->pending, im);
+            im->flags.pending = 1;
+
+            evas_preload_thread_cancel(im->preload);
+         }
+
+       evas_async_events_process();
+
+       LKL(wakeup);
+       while (im->preload)
+         {
+            pthread_cond_wait(&cond_wakeup, &wakeup);
+            LKU(wakeup);
+
+            evas_async_events_process();
+
+            LKL(wakeup);
+         }
+       LKU(wakeup);
+     }
+
+   if (im->flags.loaded) return ;
+   LKL(im->lock);
+#endif
+
+   error = cache->func.load(im);
+#ifdef BUILD_ASYNC_PRELOAD
+   LKU(im->lock);
+#endif
+
+   im->flags.loaded = 1;
+
+   if (cache->func.debug)
+     cache->func.debug("load", im);
+
+   if (error != EVAS_LOAD_ERROR_NONE)
+     {
+        _evas_cache_image_entry_surface_alloc(cache, im, im->w, im->h);
+        im->flags.loaded = 0;
+     }
+
+#ifdef BUILD_ASYNC_PRELOAD
+   if (preload)
+     _evas_cache_image_async_end(im);
+#endif
+}
+
+EAPI void
+evas_cache_image_unload_data(Image_Entry *im)
+{
+   Evas_Cache_Image *cache;
+
+   assert(im);
+   assert(im->cache);
+   cache = im->cache;
+
+#ifdef BUILD_ASYNC_PRELOAD
+   LKL(im->lock);
+#endif
+   if ((!im->flags.loaded) || (!im->file) || 
+       (!im->info.module) || (im->flags.dirty))
+     {
+#ifdef BUILD_ASYNC_PRELOAD
+        LKU(im->lock);
+#endif
+       return;
+     }
+   evas_common_rgba_image_scalecache_dirty(im);
+   cache->func.destructor(im);
+   
+#ifdef BUILD_ASYNC_PRELOAD
+   LKU(im->lock);
+#endif
+}
+
+static Eina_Bool
+_evas_cache_image_unload_cb(__UNUSED__ const Eina_Hash *hash, __UNUSED__ const void *key, void *data, __UNUSED__ void *fdata)
+{
+   evas_cache_image_unload_data(data);
+   return EINA_TRUE;
+}
+
+EAPI void
+evas_cache_image_unload_all(Evas_Cache_Image *cache)
+{
+   Image_Entry *im;
+
+   EINA_INLIST_FOREACH(cache->lru, im) evas_cache_image_unload_data(im);
+   EINA_INLIST_FOREACH(cache->lru_nodata, im) evas_cache_image_unload_data(im);
+   eina_hash_foreach(cache->activ, _evas_cache_image_unload_cb, NULL);
+   eina_hash_foreach(cache->inactiv, _evas_cache_image_unload_cb, NULL);
+}
+
+EAPI Eina_Bool
+evas_cache_image_is_loaded(Image_Entry *im)
+{
+  assert(im); 
+  if (im->flags.loaded) return EINA_TRUE;
+  return EINA_FALSE;
+}
+
+EAPI void
+evas_cache_image_preload_data(Image_Entry *im, const void *target)
+{
+#ifdef BUILD_ASYNC_PRELOAD
+   Evas_Cache_Image    *cache;
+
+   assert(im);
+   assert(im->cache);
+
+   if (im->flags.loaded)
+     {
+       evas_object_inform_call_image_preloaded((Evas_Object *)target);
+       return;
+     }
+
+   cache = im->cache;
+
+   if (!_evas_cache_image_entry_preload_add(im, target))
+     evas_object_inform_call_image_preloaded((Evas_Object *)target);
+#else
+   evas_cache_image_load_data(im);
+   evas_object_inform_call_image_preloaded((Evas_Object *)target);
+#endif
+}
+
+EAPI void
+evas_cache_image_preload_cancel(Image_Entry *im, const void *target)
+{
+#ifdef BUILD_ASYNC_PRELOAD
+   Evas_Cache_Image *cache;
+
+   assert(im);
+   assert(im->cache);
+   cache = im->cache;
+
+   if (target == NULL) return ;
+
+   _evas_cache_image_entry_preload_remove(im, target);
+#else
+   (void)im;
+#endif
+}
+
+EAPI int
+evas_cache_image_flush(Evas_Cache_Image *cache)
+{
+   assert(cache);
+
+   if (cache->limit == -1) return -1;
+
+   while ((cache->lru) && (cache->limit < cache->usage))
+     {
+        Image_Entry *im;
+
+        im = (Image_Entry *)cache->lru->last;
+        _evas_cache_image_entry_delete(cache, im);
+     }
+
+   while ((cache->lru_nodata) && (cache->limit < cache->usage))
+     {
+        Image_Entry *im;
+
+        im = (Image_Entry *) cache->lru_nodata->last;
+        _evas_cache_image_remove_lru_nodata(cache, im);
+
+        cache->func.surface_delete(im);
+
+        im->flags.loaded = 0;
+     }
+
+   return cache->usage;
+}
+
+EAPI Image_Entry *
+evas_cache_image_empty(Evas_Cache_Image *cache)
+{
+   Image_Entry *im;
+
+   im = _evas_cache_image_entry_new(cache, NULL, 0, NULL, NULL, NULL, NULL);
+   if (!im) return NULL;
+
+   im->references = 1;
+   return im;
+}
+
+EAPI void
+evas_cache_image_colorspace(Image_Entry *im, int cspace)
+{
+   Evas_Cache_Image    *cache;
+
+   assert(im);
+   assert(im->cache);
+
+   cache = im->cache;
+
+   if (im->space == cspace) return;
+
+   im->space = cspace;
+   cache->func.color_space(im, cspace);
+}
+
+EAPI void *
+evas_cache_private_from_image_entry_get(Image_Entry *im)
+{
+   Evas_Cache_Image    *cache;
+
+   assert(im);
+   assert(im->cache);
+
+   cache = im->cache;
+
+   return (void*) cache->data;
+}
+
+EAPI void *
+evas_cache_private_get(Evas_Cache_Image *cache)
+{
+   assert(cache);
+
+   return cache->data;
+}
+
+EAPI void
+evas_cache_private_set(Evas_Cache_Image *cache, const void *data)
+{
+   assert(cache);
+
+   cache->data = (void *)data;
+}
+
+EAPI DATA32 *
+evas_cache_image_pixels(Image_Entry *im)
+{
+   Evas_Cache_Image    *cache;
+
+   assert(im);
+   assert(im->cache);
+
+   cache = im->cache;
+
+   return cache->func.surface_pixels(im);
+}
+
+EAPI void
+evas_cache_image_wakeup(void)
+{
+#ifdef BUILD_ASYNC_PRELOAD
+   pthread_cond_broadcast(&cond_wakeup);
+#endif
+}
diff --git a/src/lib/cache/evas_preload.c b/src/lib/cache/evas_preload.c
new file mode 100644 (file)
index 0000000..acab76f
--- /dev/null
@@ -0,0 +1,272 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#ifdef BUILD_ASYNC_PRELOAD
+# include <pthread.h>
+#endif
+
+#include "evas_common.h"
+#include "evas_private.h"
+#include "Evas.h"
+
+#ifdef BUILD_ASYNC_PRELOAD
+typedef struct _Evas_Preload_Pthread_Worker Evas_Preload_Pthread_Worker;
+typedef struct _Evas_Preload_Pthread_Data Evas_Preload_Pthread_Data;
+
+struct _Evas_Preload_Pthread_Worker
+{
+   void (*func_heavy)(void *data);
+   void (*func_end)(void *data);
+   void (*func_cancel)(void *data);
+
+   const void *data;
+
+   Eina_Bool cancel : 1;
+};
+
+struct _Evas_Preload_Pthread_Data
+{
+   pthread_t thread;
+};
+#endif
+
+static int _evas_preload_thread_count_max = 0;
+
+#ifdef BUILD_ASYNC_PRELOAD
+static int _evas_preload_thread_count = 0;
+static Eina_List *_evas_preload_thread_data = NULL;
+static Eina_List *_evas_preload_thread = NULL;
+
+static LK(_mutex) = PTHREAD_MUTEX_INITIALIZER;
+
+static void
+_evas_preload_thread_end(Evas_Preload_Pthread_Data *pth)
+{
+   Evas_Preload_Pthread_Data *p;
+
+   if (pthread_join(pth->thread, (void **) &p) != 0)
+     return ;
+
+   _evas_preload_thread = eina_list_remove(_evas_preload_thread, pth);
+}
+
+static void
+_evas_preload_thread_done(void *target, Evas_Callback_Type type, void *event_info)
+{
+   Evas_Preload_Pthread_Worker *work;
+
+   work = event_info;
+
+   if (work->cancel)
+     {
+       if (work->func_cancel)
+         work->func_cancel((void *) work->data);
+     }
+   else
+     {
+       work->func_end((void *) work->data);
+     }
+
+   free(work);
+}
+
+static void *
+_evas_preload_thread_worker(Evas_Preload_Pthread_Data *pth)
+{
+   Evas_Preload_Pthread_Worker *work;
+
+   pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+   pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
+
+ on_error:
+
+   while (_evas_preload_thread_data)
+     {
+       LKL(_mutex);
+
+       if (!_evas_preload_thread_data)
+         {
+            LKU(_mutex);
+            break;
+         }
+
+       work = eina_list_data_get(_evas_preload_thread_data);
+       _evas_preload_thread_data = eina_list_remove_list(_evas_preload_thread_data, _evas_preload_thread_data);
+
+       LKU(_mutex);
+
+       work->func_heavy((void *) work->data);
+
+       evas_async_events_put(pth, 0, work, _evas_preload_thread_done);
+     }
+
+   LKL(_mutex);
+   if (_evas_preload_thread_data)
+     {
+       LKU(_mutex);
+       goto on_error;
+     }
+   _evas_preload_thread_count--;
+
+   LKU(_mutex);
+
+   work = malloc(sizeof (Evas_Preload_Pthread_Worker));
+   if (!work) return NULL;
+
+   work->data = pth;
+   work->func_heavy = NULL;
+   work->func_end = (void *) _evas_preload_thread_end;
+   work->func_cancel = NULL;
+   work->cancel = EINA_FALSE;
+
+   evas_async_events_put(pth, 0, work, _evas_preload_thread_done);
+
+   return pth;
+}
+#endif
+
+void
+_evas_preload_thread_init(void)
+{
+   _evas_preload_thread_count_max = eina_cpu_count();
+   if (_evas_preload_thread_count_max <= 0)
+     _evas_preload_thread_count_max = 1;
+}
+
+void
+_evas_preload_thread_shutdown(void)
+{
+   /* FIXME: If function are still running in the background, should we kill them ? */
+#ifdef BUILD_ASYNC_PRELOAD
+   Evas_Preload_Pthread_Worker *work;
+   Evas_Preload_Pthread_Data *pth;
+
+   /* Force processing of async events. */
+   evas_async_events_process();
+
+   LKL(_mutex);
+
+   EINA_LIST_FREE(_evas_preload_thread_data, work)
+     {
+       if (work->func_cancel)
+         work->func_cancel((void *)work->data);
+       free(work);
+     }
+
+   LKU(_mutex);
+
+   EINA_LIST_FREE(_evas_preload_thread, pth)
+     {
+       Evas_Preload_Pthread_Data *p;
+
+       pthread_cancel(pth->thread);
+       pthread_join(pth->thread, (void **) &p);
+     }
+#endif
+}
+
+Evas_Preload_Pthread *
+evas_preload_thread_run(void (*func_heavy)(void *data),
+                       void (*func_end)(void *data),
+                       void (*func_cancel)(void *data),
+                       const void *data)
+{
+#ifdef BUILD_ASYNC_PRELOAD
+   Evas_Preload_Pthread_Worker *work;
+   Evas_Preload_Pthread_Data *pth;
+
+   work = malloc(sizeof (Evas_Preload_Pthread_Worker));
+   if (!work)
+     {
+       func_cancel((void *)data);
+       return NULL;
+     }
+
+   work->func_heavy = func_heavy;
+   work->func_end = func_end;
+   work->func_cancel = func_cancel;
+   work->cancel = EINA_FALSE;
+   work->data = data;
+
+   LKL(_mutex);
+   _evas_preload_thread_data = eina_list_append(_evas_preload_thread_data, work);
+
+   if (_evas_preload_thread_count == _evas_preload_thread_count_max)
+     {
+       pthread_mutex_unlock(&_mutex);
+       return (Evas_Preload_Pthread*) work;
+     }
+
+   LKU(_mutex);
+
+   /* One more thread could be created. */
+   pth = malloc(sizeof (Evas_Preload_Pthread_Data));
+   if (!pth)
+     goto on_error;
+
+   if (pthread_create(&pth->thread, NULL, (void *) _evas_preload_thread_worker, pth) == 0)
+     {
+       LKL(_mutex);
+       _evas_preload_thread_count++;
+       LKU(_mutex);
+       return (Evas_Preload_Pthread*) work;
+     }
+
+ on_error:
+   if (_evas_preload_thread_count == 0)
+     {
+       if (work->func_cancel)
+         work->func_cancel((void *) work->data);
+       free(work);
+     }
+   return NULL;
+#else
+   /*
+     If no thread and as we don't want to break app that rely on this
+     facility, we will lock the interface until we are done.
+    */
+   func_heavy((void *) data);
+   func_end((void *) data);
+
+   return EINA_TRUE;
+#endif
+}
+
+Eina_Bool
+evas_preload_thread_cancel(Evas_Preload_Pthread *thread)
+{
+#ifdef BUILD_ASYNC_PRELOAD
+   Evas_Preload_Pthread_Worker *work;
+   Eina_List *l;
+
+   LKL(_mutex);
+
+   EINA_LIST_FOREACH(_evas_preload_thread_data, l, work)
+     if ((void *) work == (void *) thread)
+       {
+         _evas_preload_thread_data = eina_list_remove_list(_evas_preload_thread_data, l);
+
+         LKU(_mutex);
+
+         if (work->func_cancel)
+           work->func_cancel((void *) work->data);
+         free(work);
+
+         return EINA_TRUE;
+       }
+
+   LKU(_mutex);
+
+   /* Delay the destruction */
+   work = (Evas_Preload_Pthread_Worker *) thread;
+   work->cancel = EINA_TRUE;
+   return EINA_FALSE;
+#else
+   return EINA_TRUE;
+#endif
+}
diff --git a/src/lib/canvas/.cvsignore b/src/lib/canvas/.cvsignore
new file mode 100644 (file)
index 0000000..3923fb5
--- /dev/null
@@ -0,0 +1,6 @@
+Makefile.in
+Makefile
+.deps
+.libs
+libevas_canvas.la
+*.lo
diff --git a/src/lib/canvas/Makefile.am b/src/lib/canvas/Makefile.am
new file mode 100644 (file)
index 0000000..1bb051d
--- /dev/null
@@ -0,0 +1,59 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/lib/cserve \
+-DPACKAGE_BIN_DIR=\"$(bindir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+@WIN32_CPPFLAGS@ \
+@FREETYPE_CFLAGS@ \
+@EET_CFLAGS@ \
+@FONTCONFIG_CFLAGS@ \
+@EINA_CFLAGS@ \
+@EVIL_CFLAGS@
+
+noinst_LTLIBRARIES   = libevas_canvas.la
+libevas_canvas_la_SOURCES  = \
+evas_callbacks.c \
+evas_clip.c \
+evas_data.c \
+evas_events.c \
+evas_focus.c \
+evas_key.c \
+evas_key_grab.c \
+evas_layer.c \
+evas_main.c \
+evas_name.c \
+evas_object_gradient.c \
+evas_object_gradient2.c \
+evas_object_image.c \
+evas_object_main.c \
+evas_object_inform.c \
+evas_object_intercept.c \
+evas_object_line.c \
+evas_object_polygon.c \
+evas_object_rectangle.c \
+evas_object_smart.c \
+evas_object_smart_clipped.c \
+evas_object_box.c \
+evas_object_table.c \
+evas_object_text.c \
+evas_object_textblock.c \
+evas_font_dir.c \
+evas_rectangle.c \
+evas_render.c \
+evas_smart.c \
+evas_stack.c \
+evas_async_events.c \
+evas_transform.c \
+evas_stats.c \
+evas_map.c
+
+libevas_canvas_la_LIBADD = @EVIL_LIBS@
+
+EXTRA_DIST = \
+evas_object_gradient2_linear.c \
+evas_object_gradient2_radial.c
diff --git a/src/lib/canvas/evas_async_events.c b/src/lib/canvas/evas_async_events.c
new file mode 100644 (file)
index 0000000..76a3787
--- /dev/null
@@ -0,0 +1,205 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+#ifdef BUILD_ASYNC_EVENTS
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+
+static int _fd_write = -1;
+static int _fd_read = -1;
+
+static int _init_evas_event = 0;
+
+typedef struct _Evas_Event_Async       Evas_Event_Async;
+
+struct _Evas_Event_Async
+{
+   const void           *target;
+   void                         *event_info;
+   void                        (*func)(void *target, Evas_Callback_Type type, void *event_info);
+   Evas_Callback_Type    type;
+};
+
+int
+evas_async_events_init(void)
+{
+   int filedes[2];
+
+   _init_evas_event++;
+   if (_init_evas_event > 1) return _init_evas_event;
+
+   if (pipe(filedes) == -1)
+     {
+       _init_evas_event = 0;
+       return 0;
+     }
+
+   _fd_read = filedes[0];
+   _fd_write = filedes[1];
+
+   fcntl(_fd_read, F_SETFL, O_NONBLOCK);
+
+   return _init_evas_event;
+}
+
+int
+evas_async_events_shutdown(void)
+{
+   _init_evas_event--;
+   if (_init_evas_event > 0) return _init_evas_event;
+
+   close(_fd_read);
+   close(_fd_write);
+   _fd_read = -1;
+   _fd_write = -1;
+
+   return _init_evas_event;
+}
+
+#endif
+
+/**
+ * @brief Get evas' internal asynchronous events read file descriptor.
+ *
+ * @return The canvas' asynchronous events read file descriptor.
+ *
+ * Evas' asynchronous events are meant to be dealt with internally,
+ * i. e., when building stuff to be glued together into the EFL
+ * infrastructure -- a module, for example. The context which demands
+ * its use is when calculations need to be done out of the main
+ * thread, asynchronously, and some action must be performed after
+ * that.
+ *
+ * An example of actual use of this API is for image asynchronous
+ * preload inside evas. If the canvas was instantiated throught
+ * ecore-evas usage, ecore itself will take care of calling those
+ * events' processing.
+ *
+ * This function returns the read file descriptor where to get the
+ * asynchronous events of the canvas. Naturally, other mainloops,
+ * apart from ecore, may make use of it.
+ *
+ * @ingroup Evas_Group
+ */
+EAPI int
+evas_async_events_fd_get(void)
+{
+#ifdef BUILD_ASYNC_EVENTS
+   return _fd_read;
+#else
+   return -1;
+#endif
+}
+
+/**
+ * @brief Trigger the processing of all events waiting on the file
+ * descriptor returned by evas_async_events_fd_get().
+ *
+ * @return The number of events processed.
+ *
+ * All asynchronous events queued up by evas_async_events_put() are
+ * processed here. More precisely, the callback functions, informed
+ * together with other event parameters, when queued, get called (with
+ * those parameters), in that order.
+ *
+ * @ingroup Evas_Group
+ */
+EAPI int
+evas_async_events_process(void)
+{
+#ifdef BUILD_ASYNC_EVENTS
+   Evas_Event_Async *ev;
+   int check;
+   int count = 0;
+
+   if (_fd_read == -1) return 0;
+
+   do {
+       check = read(_fd_read, &ev, sizeof (Evas_Event_Async *));
+
+       if (check == sizeof (Evas_Event_Async *))
+         {
+             if (ev->func) ev->func((void *)ev->target, ev->type, ev->event_info);
+            free(ev);
+            count++;
+         }
+   } while (check > 0);
+
+   evas_cache_image_wakeup();
+
+   if (check < 0)
+     switch (errno)
+       {
+       case EBADF:
+       case EINVAL:
+       case EIO:
+       case EISDIR:
+          _fd_read = -1;
+       }
+
+   return count;
+#else
+   return 0;
+#endif
+}
+
+/**
+* Insert asynchronous events on the canvas.
+ *
+ * @param target The target to be affected by the events.
+ * @param type The type of callback function.
+ * @param event_info Information about the event.
+ * @param func The callback function pointer.
+ *
+ * This is the way, for a routine running outside evas' main thread,
+ * to report an asynchronous event. A callback function is informed,
+ * whose call is to happen after evas_async_events_process() is
+ * called.
+ *
+ * @ingroup Evas_Group
+ */
+EAPI Eina_Bool
+evas_async_events_put(const void *target, Evas_Callback_Type type, void *event_info, void (*func)(void *target, Evas_Callback_Type type, void *event_info))
+{
+#ifdef BUILD_ASYNC_EVENTS
+   Evas_Event_Async *ev;
+   ssize_t check;
+   Eina_Bool result = EINA_FALSE;
+
+   if (!func) return 0;
+   if (_fd_write == -1) return 0;
+
+   ev = calloc(1, sizeof (Evas_Event_Async));
+   if (!ev) return 0;
+
+   ev->func = func;
+   ev->target = target;
+   ev->type = type;
+   ev->event_info = event_info;
+
+   do {
+      check = write(_fd_write, &ev, sizeof (Evas_Event_Async*));
+   } while ((check != sizeof (Evas_Event_Async*)) && ((errno == EINTR) || (errno == EAGAIN)));
+
+   evas_cache_image_wakeup();
+
+   if (check == sizeof (Evas_Event_Async*))
+     result = EINA_TRUE;
+   else
+     switch (errno)
+       {
+       case EBADF:
+       case EINVAL:
+       case EIO:
+       case EPIPE:
+          _fd_write = -1;
+       }
+
+   return result;
+#else
+   func(target, type, event_info);
+   return EINA_TRUE;
+#endif
+}
diff --git a/src/lib/canvas/evas_callbacks.c b/src/lib/canvas/evas_callbacks.c
new file mode 100644 (file)
index 0000000..565440d
--- /dev/null
@@ -0,0 +1,887 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+static void evas_object_event_callback_clear(Evas_Object *obj);
+static void evas_event_callback_clear(Evas *e);
+int _evas_event_counter = 0;
+
+void
+_evas_post_event_callback_call(Evas *e)
+{
+   Evas_Post_Callback *pc;
+   int skip = 0;
+
+   if (e->delete_me) return;
+   _evas_walk(e);
+   EINA_LIST_FREE(e->post_events, pc)
+     {
+        if ((!skip) && (!e->delete_me) && (!pc->delete_me))
+          {
+             if (!pc->func(pc->data, e)) skip = 1;
+          }
+        free(pc);
+     }
+   _evas_unwalk(e);
+}
+
+void
+_evas_post_event_callback_free(Evas *e)
+{
+   Evas_Post_Callback *pc;
+   
+   EINA_LIST_FREE(e->post_events, pc)
+     {
+        free(pc);
+     }
+   _evas_unwalk(e);
+}
+
+void
+evas_event_callback_list_post_free(Eina_Inlist **list)
+{
+   Eina_Inlist *l;
+
+   /* MEM OK */
+   for (l = *list; l;)
+     {
+       Evas_Func_Node *fn;
+
+       fn = (Evas_Func_Node *)l;
+       l = l->next;
+       if (fn->delete_me)
+         {
+             *list = eina_inlist_remove(*list, EINA_INLIST_GET(fn));
+            free(fn);
+         }
+     }
+}
+
+static void
+evas_object_event_callback_clear(Evas_Object *obj)
+{
+   if (!obj->callbacks) return;
+   if (!obj->callbacks->deletions_waiting) return;
+   obj->callbacks->deletions_waiting = 0;
+   evas_event_callback_list_post_free(&obj->callbacks->callbacks);
+   if (!obj->callbacks->callbacks)
+     {
+        free(obj->callbacks);
+       obj->callbacks = NULL;
+     }
+}
+
+static void
+evas_event_callback_clear(Evas *e)
+{
+   if (!e->callbacks) return;
+   if (!e->callbacks->deletions_waiting) return;
+   e->callbacks->deletions_waiting = 0;
+   evas_event_callback_list_post_free(&e->callbacks->callbacks);
+   if (!e->callbacks->callbacks)
+     {
+        free(e->callbacks);
+       e->callbacks = NULL;
+     }
+}
+
+void
+evas_object_event_callback_all_del(Evas_Object *obj)
+{
+   Evas_Func_Node *fn;
+
+   if (!obj->callbacks) return;
+   EINA_INLIST_FOREACH(obj->callbacks->callbacks, fn)
+     fn->delete_me = 1;
+}
+
+void
+evas_object_event_callback_cleanup(Evas_Object *obj)
+{
+   /* MEM OK */
+   if (!obj->callbacks) return;
+   evas_event_callback_list_post_free(&obj->callbacks->callbacks);
+   free(obj->callbacks);
+   obj->callbacks = NULL;
+}
+
+void
+evas_event_callback_all_del(Evas *e)
+{
+   Evas_Func_Node *fn;
+
+   if (!e->callbacks) return;
+   EINA_INLIST_FOREACH(e->callbacks->callbacks, fn)
+     fn->delete_me = 1;
+}
+
+void
+evas_event_callback_cleanup(Evas *e)
+{
+   /* MEM OK */
+   if (!e->callbacks) return;
+   evas_event_callback_list_post_free(&e->callbacks->callbacks);
+   free(e->callbacks);
+   e->callbacks = NULL;
+}
+
+void
+evas_event_callback_call(Evas *e, Evas_Callback_Type type, void *event_info)
+{
+   Eina_Inlist **l_mod = NULL, *l;
+
+   _evas_walk(e);
+   if (e->callbacks)
+     {
+       l_mod = &e->callbacks->callbacks;
+        e->callbacks->walking_list++;
+        for (l = *l_mod; l; l = l->next)
+          {
+            Evas_Func_Node *fn;
+
+            fn = (Evas_Func_Node *)l;
+            if ((fn->type == type) && (!fn->delete_me))
+              {
+                 Evas_Event_Cb func = fn->func;
+                 if (func)
+                   func(fn->data, e, event_info);
+              }
+            if (e->delete_me) break;
+          }
+        e->callbacks->walking_list--;
+        if (!e->callbacks->walking_list)
+          {
+            evas_event_callback_clear(e);
+             l_mod = NULL;
+          }
+     }
+   _evas_unwalk(e);
+}
+
+void
+evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void *event_info)
+{
+   /* MEM OK */
+   Eina_Inlist **l_mod = NULL, *l;
+   Evas_Button_Flags flags = EVAS_BUTTON_NONE;
+   Evas *e;
+
+   if (obj->last_event == _evas_event_counter) return;
+
+   obj->last_event = _evas_event_counter;
+
+   if (obj->delete_me) return;
+   e = evas_object_evas_get(obj);
+
+   _evas_walk(e);
+   if (obj->callbacks)
+     {
+       l_mod = &obj->callbacks->callbacks;
+        switch (type)
+          {
+             case EVAS_CALLBACK_MOUSE_DOWN:
+               {
+                  Evas_Event_Mouse_Down *ev = event_info;
+
+                  flags = ev->flags;
+                 if (ev->flags & (EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK))
+                   {
+                      if (obj->last_mouse_down_counter < (e->last_mouse_down_counter - 1))
+                        ev->flags &= ~(EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK);
+                   }
+                  obj->last_mouse_down_counter = e->last_mouse_down_counter;
+                 break;
+               }
+             case EVAS_CALLBACK_MOUSE_UP:
+               {
+                  Evas_Event_Mouse_Up *ev = event_info;
+
+                  flags = ev->flags;
+                 if (ev->flags & (EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK))
+                   {
+                      if (obj->last_mouse_up_counter < (e->last_mouse_up_counter - 1))
+                        ev->flags &= ~(EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK);
+                   }
+                  obj->last_mouse_up_counter = e->last_mouse_up_counter;
+                 break;
+               }
+             default:
+               break;
+          }
+        obj->callbacks->walking_list++;
+        for (l = *l_mod; l; l = l->next)
+          {
+            Evas_Func_Node *fn;
+
+            fn = (Evas_Func_Node *)l;
+            if ((fn->type == type) && (!fn->delete_me))
+              {
+                 Evas_Object_Event_Cb func = fn->func;
+                 if (func)
+                   func(fn->data, obj->layer->evas, obj, event_info);
+              }
+            if (obj->delete_me) break;
+          }
+        obj->callbacks->walking_list--;
+        if (!obj->callbacks->walking_list)
+         {
+            evas_object_event_callback_clear(obj);
+            l_mod = NULL;
+         }
+
+        if (type == EVAS_CALLBACK_MOUSE_DOWN)
+          {
+             Evas_Event_Mouse_Down *ev = event_info;
+             ev->flags = flags;
+          }
+        else if (type == EVAS_CALLBACK_MOUSE_UP)
+          {
+             Evas_Event_Mouse_Up *ev = event_info;
+             ev->flags = flags;
+          }
+     }
+
+   if (!((obj->no_propagate) && (l_mod) && (*l_mod)))
+     {
+       if (!obj->no_propagate)
+         {
+            if ((obj->smart.parent) && (type != EVAS_CALLBACK_FREE) &&
+                (type <= EVAS_CALLBACK_KEY_UP))
+              evas_object_event_callback_call(obj->smart.parent, type, event_info);
+         }
+     }
+   _evas_unwalk(e);
+}
+
+
+/**
+ * @addtogroup Evas_Object_Group_Events
+ * @{
+ */
+
+/**
+ * Add a callback function to an object
+ *
+ * @param obj Object to attach a callback to
+ * @param type The type of event that will trigger the callback
+ * @param func The function to be called when the event is triggered
+ * @param data The data pointer to be passed to @p func
+ *
+ * This function adds a function callback to an object when the event
+ * of type @p type occurs on object @p obj. The function is @p func.
+ *
+ * In the event of a memory allocation error during addition of the
+ * callback to the object, evas_alloc_error() should be used to
+ * determine the nature of the error, if any, and the program should
+ * sensibly try and recover.
+ *
+ * The function will be passed the pointer @p data when it is
+ * called. A callback function must look like this:
+ *
+ * @code
+ * void callback (void *data, Evas *e, Evas_Object *obj, void *event_info);
+ * @endcode
+ *
+ * The first parameter @p data in this function will be the same value
+ * passed to evas_object_event_callback_add() as the @p data
+ * parameter. The second parameter is a convenience for the programmer
+ * to know what evas canvas the event occured on. The third parameter
+ * @p obj is the Object handle on which the event occured. The foruth
+ * parameter @p event_info is a pointer to a data structure that may
+ * or may not be passed to the callback, depending on the event type
+ * that triggered the callback.
+ *
+ * The event type @p type to trigger the function may be one of
+ * #EVAS_CALLBACK_MOUSE_IN, #EVAS_CALLBACK_MOUSE_OUT,
+ * #EVAS_CALLBACK_MOUSE_DOWN, #EVAS_CALLBACK_MOUSE_UP,
+ * #EVAS_CALLBACK_MOUSE_MOVE, #EVAS_CALLBACK_MOUSE_WHEEL,
+ * #EVAS_CALLBACK_FREE, #EVAS_CALLBACK_KEY_DOWN, #EVAS_CALLBACK_KEY_UP,
+ * #EVAS_CALLBACK_FOCUS_IN, #EVAS_CALLBACK_FOCUS_OUT,
+ * #EVAS_CALLBACK_SHOW, #EVAS_CALLBACK_HIDE, #EVAS_CALLBACK_MOVE,
+ * #EVAS_CALLBACK_RESIZE or #EVAS_CALLBACK_RESTACK.
+ * This determines the kind of event that will trigger the callback to
+ * be called.  The @p event_info pointer passed to the callback will
+ * be one of the following, depending on the event triggering it:
+ *
+ * #EVAS_CALLBACK_MOUSE_IN: event_info = pointer to Evas_Event_Mouse_In
+ *
+ * This event is triggered when the mouse pointer enters the region of
+ * the object @p obj. This may occur by the mouse pointer being moved
+ * by evas_event_feed_mouse_move() or
+ * evas_event_feed_mouse_move_data() calls, or by the object being
+ * shown, raised, moved, resized, or other objects being moved out of
+ * the way, hidden, lowered or moved out of the way.
+ *
+ * #EVAS_CALLBACK_MOUSE_OUT: event_info = pointer to Evas_Event_Mouse_Out
+ *
+ * This event is triggered exactly like #EVAS_CALLBACK_MOUSE_IN is, but
+ * occurs when the mouse pointer exits an object. Note that no out
+ * events will be reported if the mouse pointer is implicitly grabbed
+ * to an object (the mouse buttons are down at all and any were
+ * pressed on that object). An out event will be reported as soon as
+ * the mouse is no longer grabbed (no mouse buttons are
+ * depressed). Out events will be reported once all buttons are
+ * released, if the mouse has left the object.
+ *
+ * #EVAS_CALLBACK_MOUSE_DOWN: event_info = pointer to
+ * Evas_Event_Mouse_Down
+ *
+ * This event is triggered by a mouse button being depressed while
+ * over an object. If pointermode is EVAS_OBJECT_POINTER_MODE_AUTOGRAB
+ * (default) this causes this object to passively grab the mouse until
+ * all mouse buttons have been released.  That means if this mouse
+ * button is the first to be pressed, all future mouse events will be
+ * reported to only this object until no buttons are down. That
+ * includes mouse move events, in and out events, and further button
+ * presses. When all buttons are released, event propagation occurs as
+ * normal.
+ *
+ * #EVAS_CALLBACK_MOUSE_UP: event_info = pointer to Evas_Event_Mouse_Up
+ *
+ * This event is triggered by a mouse button being released while over
+ * an object or when passively grabbed to an object. If this is the
+ * last mouse button to be raised on an object then the passive grab
+ * is released and event processing will continue as normal.
+ *
+ * #EVAS_CALLBACK_MOUSE_MOVE: event_info = pointer to Evas_Event_Mouse_Move
+ *
+ * This event is triggered by the mouse pointer moving while over an
+ * object or passively grabbed to an object.
+ *
+ * #EVAS_CALLBACK_MOUSE_WHEEL: event_info = pointer to
+ * Evas_Event_Mouse_Wheel
+ *
+ * This event is triggered by the mouse wheel being rolled while over
+ * an object or passively grabbed to an object.
+ *
+ * #EVAS_CALLBACK_FREE: event_info = NULL
+ *
+ * This event is triggered just before Evas is about to free all
+ * memory used by an object and remove all references to it. This is
+ * useful for programs to use if they attached data to an object and
+ * want to free it when the object is deleted. The object is still
+ * valid when this callback is called, but after this callback
+ * returns, there is no guarantee on the object's validity.
+ *
+ * #EVAS_CALLBACK_KEY_DOWN: event_info = pointer to Evas_Event_Key_Down
+ *
+ * This callback is called when a key is pressed and the focus is on
+ * the object, or a key has been grabbed to a particular object which
+ * wants to intercept the key press regardless of what object has the
+ * focus.
+ *
+ * #EVAS_CALLBACK_KEY_UP: event_info = pointer to Evas_Event_Key_Up
+ *
+ * This callback is called when a key is released and the focus is on
+ * the object, or a key has been grabbed to a particular object which
+ * wants to intercept the key release regardless of what object has
+ * the focus.
+ *
+ * #EVAS_CALLBACK_FOCUS_IN: event_info = NULL
+ *
+ * This event is called when an object gains the focus. When the
+ * callback is called the object has already gained the focus.
+ *
+ * #EVAS_CALLBACK_FOCUS_OUT: event_info = NULL
+ *
+ * This event is triggered by an object losing the focus. When the
+ * callback is called the object has already lost the focus.
+ *
+ * #EVAS_CALLBACK_SHOW: event_info = NULL
+ *
+ * This event is triggered by the object being shown by
+ * evas_object_show().
+ *
+ * #EVAS_CALLBACK_HIDE: event_info = NULL
+ *
+ * This event is triggered by an object being hidden by
+ * evas_object_hide().
+ *
+ * #EVAS_CALLBACK_MOVE: event_info = NULL
+ *
+ * This event is triggered by an object being
+ * moved. evas_object_move() can trigger this, as can any
+ * object-specific manipulations that would mean the object's origin
+ * could move.
+ *
+ * #EVAS_CALLBACK_RESIZE: event_info = NULL
+ *
+ * This event is triggered by an object being resized. Resizes can be
+ * triggered by evas_object_resize() or by any object-specific calls
+ * that may cause the object to resize.
+ *
+ * Example:
+ * @code
+ * extern Evas_Object *object;
+ * extern void *my_data;
+ * void down_callback(void *data, Evas *e, Evas_Object *obj, void *event_info);
+ * void up_callback(void *data, Evas *e, Evas_Object *obj, void *event_info);
+ *
+ * evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_UP, up_callback, my_data);
+ * if (evas_alloc_error() != EVAS_ALLOC_ERROR_NONE)
+ *   {
+ *     fprintf(stderr, "ERROR: Callback registering failed! Abort!\n");
+ *     exit(-1);
+ *   }
+ * evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_DOWN, down_callback, my_data);
+ * if (evas_alloc_error() != EVAS_ALLOC_ERROR_NONE)
+ *   {
+ *     fprintf(stderr, "ERROR: Callback registering failed! Abort!\n");
+ *     exit(-1);
+ *   }
+ * @endcode
+ */
+EAPI void
+evas_object_event_callback_add(Evas_Object *obj, Evas_Callback_Type type, Evas_Object_Event_Cb func, const void *data)
+{
+   /* MEM OK */
+   Evas_Func_Node *fn;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+
+   if (!func) return;
+
+   fn = evas_mem_calloc(sizeof(Evas_Func_Node));
+   if (!fn) return;
+   fn->func = func;
+   fn->data = (void *)data;
+   fn->type = type;
+
+   if (!obj->callbacks)
+     obj->callbacks = evas_mem_calloc(sizeof(Evas_Callbacks));
+   if (!obj->callbacks)
+     {
+       free(fn);
+       return;
+     }
+   obj->callbacks->callbacks =
+     eina_inlist_prepend(obj->callbacks->callbacks, EINA_INLIST_GET(fn));
+}
+
+/**
+ * Delete a callback function from an object
+ *
+ * @param obj Object to remove a callback from
+ * @param type The type of event that was triggering the callback
+ * @param func The function that was to be called when the event was triggered
+ * @return The data pointer that was to be passed to the callback
+ *
+ * This function removes the most recently added callback from the
+ * object @p obj which was triggered by the event type @p type and was
+ * calling the function @p func when triggered. If the removal is
+ * successful it will also return the data pointer that was passed to
+ * evas_object_event_callback_add() when the callback was added to the
+ * object. If not successful NULL will be returned.
+ *
+ * Example:
+ * @code
+ * extern Evas_Object *object;
+ * void *my_data;
+ * void up_callback(void *data, Evas *e, Evas_Object *obj, void *event_info);
+ *
+ * my_data = evas_object_event_callback_del(object, EVAS_CALLBACK_MOUSE_UP, up_callback);
+ * @endcode
+ */
+EAPI void *
+evas_object_event_callback_del(Evas_Object *obj, Evas_Callback_Type type, Evas_Object_Event_Cb func)
+{
+   /* MEM OK */
+   Evas_Func_Node *fn;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+
+   if (!func) return NULL;
+
+   if (!obj->callbacks) return NULL;
+
+   EINA_INLIST_FOREACH(obj->callbacks->callbacks, fn)
+     {
+       if ((fn->func == func) && (fn->type == type) && (!fn->delete_me))
+         {
+            void *data;
+
+            data = fn->data;
+            fn->delete_me = 1;
+            obj->callbacks->deletions_waiting = 1;
+            if (!obj->callbacks->walking_list)
+              evas_object_event_callback_clear(obj);
+            return data;
+         }
+     }
+   return NULL;
+}
+
+/**
+ * Delete a callback function from an object
+ *
+ * @param obj Object to remove a callback from
+ * @param type The type of event that was triggering the callback
+ * @param func The function that was to be called when the event was triggered
+ * @param data The data pointer that was to be passed to the callback
+ * @return The data pointer that was to be passed to the callback
+ *
+ * This function removes the most recently added callback from the
+ * object @p obj which was triggered by the event type @p type and was
+ * calling the function @p func with data @p data when triggered. If
+ * the removal is successful it will also return the data pointer that
+ * was passed to evas_object_event_callback_add() (that will be the
+ * same as the parameter) when the callback was added to the
+ * object. If not successful NULL will be returned.
+ *
+ * Example:
+ * @code
+ * extern Evas_Object *object;
+ * void *my_data;
+ * void up_callback(void *data, Evas *e, Evas_Object *obj, void *event_info);
+ *
+ * my_data = evas_object_event_callback_del_full(object, EVAS_CALLBACK_MOUSE_UP, up_callback, data);
+ * @endcode
+ */
+EAPI void *
+evas_object_event_callback_del_full(Evas_Object *obj, Evas_Callback_Type type, Evas_Object_Event_Cb func, const void *data)
+{
+   /* MEM OK */
+   Evas_Func_Node *fn;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+
+   if (!func) return NULL;
+
+   if (!obj->callbacks) return NULL;
+
+   EINA_INLIST_FOREACH(obj->callbacks->callbacks, fn)
+     {
+       if ((fn->func == func) && (fn->type == type) && (fn->data == data) && (!fn->delete_me))
+         {
+            void *data;
+
+            data = fn->data;
+            fn->delete_me = 1;
+            obj->callbacks->deletions_waiting = 1;
+            if (!obj->callbacks->walking_list)
+              evas_object_event_callback_clear(obj);
+            return data;
+         }
+     }
+   return NULL;
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup Evas_Canvas_Events
+ * @{
+ */
+
+/**
+ * Add a callback function to the canvas.
+ *
+ * @param e Canvas to attach a callback to
+ * @param type The type of event that will trigger the callback
+ * @param func The function to be called when the event is triggered
+ * @param data The data pointer to be passed to @p func
+ *
+ * This function adds a function callback to the canvas when the event
+ * of type @p type occurs on canvas @p e. The function is @p func.
+ *
+ * In the event of a memory allocation error during addition of the
+ * callback to the canvas, evas_alloc_error() should be used to
+ * determine the nature of the error, if any, and the program should
+ * sensibly try and recover.
+ *
+ * The function will be passed the pointer @p data when it is
+ * called. A callback function must look like this:
+ *
+ * @code
+ * void callback (void *data, Evas *e, void *event_info);
+ * @endcode
+ *
+ * The first parameter @p data in this function will be the same value
+ * passed to evas_event_callback_add() as the @p data parameter. The
+ * second parameter @p e is the canvas handle on which the event
+ * occured. The third parameter @p event_info is a pointer to a data
+ * structure that may or may not be passed to the callback, depending
+ * on the event type that triggered the callback.
+ *
+ * The event type @p type to trigger the function may be one of
+ * #EVAS_CALLBACK_RENDER_FLUSH_PRE, #EVAS_CALLBACK_RENDER_FLUSH_POST,
+ * #EVAS_CALLBACK_CANVAS_FOCUS_IN, #EVAS_CALLBACK_CANVAS_FOCUS_OUT.
+ * This determines the kind of event that will trigger the callback to
+ * be called.  So far none of the event types provide useful data, so
+ * in all of them @p event_info pointer is @c NULL.
+ *
+ * Example:
+ * @code
+ * extern Evas *e;
+ * extern void *my_data;
+ * void focus_in_callback(void *data, Evas *e, void *event_info);
+ * void focus_out_callback(void *data, Evas *e, void *event_info);
+ *
+ * evas_event_callback_add(e, EVAS_CALLBACK_CANVAS_FOCUS_IN, focus_in_callback, my_data);
+ * if (evas_alloc_error() != EVAS_ALLOC_ERROR_NONE)
+ *   {
+ *     fprintf(stderr, "ERROR: Callback registering failed! Abort!\n");
+ *     exit(-1);
+ *   }
+ * evas_event_callback_add(e, EVAS_CALLBACK_CANVAS_FOCUS_OUT, focus_out_callback, my_data);
+ * if (evas_alloc_error() != EVAS_ALLOC_ERROR_NONE)
+ *   {
+ *     fprintf(stderr, "ERROR: Callback registering failed! Abort!\n");
+ *     exit(-1);
+ *   }
+ * @endcode
+ */
+EAPI void
+evas_event_callback_add(Evas *e, Evas_Callback_Type type, Evas_Event_Cb func, const void *data)
+{
+   /* MEM OK */
+   Evas_Func_Node *fn;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if (!func) return;
+
+   fn = evas_mem_calloc(sizeof(Evas_Func_Node));
+   if (!fn) return;
+   fn->func = func;
+   fn->data = (void *)data;
+   fn->type = type;
+
+   if (!e->callbacks)
+     e->callbacks = evas_mem_calloc(sizeof(Evas_Callbacks));
+   if (!e->callbacks)
+     {
+       free(fn);
+       return;
+     }
+   e->callbacks->callbacks =
+     eina_inlist_prepend(e->callbacks->callbacks, EINA_INLIST_GET(fn));
+}
+
+/**
+ * Delete a callback function from the canvas.
+ *
+ * @param e Canvas to remove a callback from
+ * @param type The type of event that was triggering the callback
+ * @param func The function that was to be called when the event was triggered
+ * @return The data pointer that was to be passed to the callback
+ *
+ * This function removes the most recently added callback from the
+ * canvas @p e which was triggered by the event type @p type and was
+ * calling the function @p func when triggered. If the removal is
+ * successful it will also return the data pointer that was passed to
+ * evas_event_callback_add() when the callback was added to the
+ * canvas. If not successful NULL will be returned.
+ *
+ * Example:
+ * @code
+ * extern Evas *e;
+ * void *my_data;
+ * void focus_in_callback(void *data, Evas *e, void *event_info);
+ *
+ * my_data = evas_event_callback_del(ebject, EVAS_CALLBACK_CANVAS_FOCUS_IN, focus_in_callback);
+ * @endcode
+ */
+EAPI void *
+evas_event_callback_del(Evas *e, Evas_Callback_Type type, Evas_Event_Cb func)
+{
+   /* MEM OK */
+   Evas_Func_Node *fn;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+
+   if (!func) return NULL;
+
+   if (!e->callbacks) return NULL;
+
+   EINA_INLIST_FOREACH(e->callbacks->callbacks, fn)
+     {
+       if ((fn->func == func) && (fn->type == type) && (!fn->delete_me))
+         {
+            void *data;
+
+            data = fn->data;
+            fn->delete_me = 1;
+            e->callbacks->deletions_waiting = 1;
+            if (!e->callbacks->walking_list)
+              evas_event_callback_clear(e);
+            return data;
+         }
+     }
+   return NULL;
+}
+
+/**
+ * Delete a callback function from the canvas.
+ *
+ * @param e Canvas to remove a callback from
+ * @param type The type of event that was triggering the callback
+ * @param func The function that was to be called when the event was triggered
+ * @param data The data pointer that was to be passed to the callback
+ * @return The data pointer that was to be passed to the callback
+ *
+ * This function removes the most recently added callback from the
+ * canvas @p e which was triggered by the event type @p type and was
+ * calling the function @p func with data @p data when triggered. If
+ * the removal is successful it will also return the data pointer that
+ * was passed to evas_event_callback_add() (that will be the same as
+ * the parameter) when the callback was added to the canvas. If not
+ * successful NULL will be returned.
+ *
+ * Example:
+ * @code
+ * extern Evas *e;
+ * void *my_data;
+ * void focus_in_callback(void *data, Evas *e, void *event_info);
+ *
+ * my_data = evas_event_callback_del_full(ebject, EVAS_CALLBACK_CANVAS_FOCUS_IN, focus_in_callback, my_data);
+ * @endcode
+ */
+EAPI void *
+evas_event_callback_del_full(Evas *e, Evas_Callback_Type type, Evas_Event_Cb func, const void *data)
+{
+   /* MEM OK */
+   Evas_Func_Node *fn;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+
+   if (!func) return NULL;
+
+   if (!e->callbacks) return NULL;
+
+   EINA_INLIST_FOREACH(e->callbacks->callbacks, fn)
+     {
+       if ((fn->func == func) && (fn->type == type) && (fn->data == data) && (!fn->delete_me))
+         {
+            void *data;
+
+            data = fn->data;
+            fn->delete_me = 1;
+            e->callbacks->deletions_waiting = 1;
+            if (!e->callbacks->walking_list)
+              evas_event_callback_clear(e);
+            return data;
+         }
+     }
+   return NULL;
+}
+
+/**
+ * Push a callback on the post-event callback stack
+ *
+ * @param e Canvas to push the callback on
+ * @param func The function that to be called when the stack is unwound
+ * @param data The data pointer to be passed to the callback
+ *
+ * Evas has a stack of callbacks that get called after all the callbacks for
+ * an event have triggered (all the objects it triggers on and al the callbacks
+ * in each object triggered). When all these have been called, the stack is
+ * unwond from most recently to least recently pushed item and removed from the
+ * stack calling the callback set for it.
+ * 
+ * This is intended for doing reverse logic-like processing, example - when a
+ * child object that happens to get the event later is meant to be able to
+ * "steal" functions from a parent and thus on unwind of this stack hav its
+ * function called first, thus being able to set flags, or return 0 from the
+ * post-callback that stops all other post-callbacks in the current stack from
+ * being called (thus basically allowing a child to take control, if the event
+ * callback prepares information ready for taking action, but the post callback
+ * actually does the action).
+ *
+ */
+EAPI void
+evas_post_event_callback_push(Evas *e, Evas_Object_Event_Post_Cb func, const void *data)
+{
+   Evas_Post_Callback *pc;
+   
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   
+   pc = evas_mem_calloc(sizeof(Evas_Post_Callback));
+   if (!pc) return;
+   if (e->delete_me) return;
+   
+   pc->func = func;
+   pc->data = data;
+   e->post_events = eina_list_prepend(e->post_events, pc);
+}
+
+/**
+ * Remove a callback from the post-event callback stack
+ * 
+ * @param e Canvas to push the callback on
+ * @param func The function that to be called when the stack is unwound
+ * 
+ * This removes a callback from the stack added with
+ * evas_post_event_callback_push(). The first instance of the function in
+ * the callback stack is removed from being executed when the stack is
+ * unwound. Further instances may still be run on unwind.
+ */
+EAPI void
+evas_post_event_callback_remove(Evas *e, Evas_Object_Event_Post_Cb func)
+{
+   Evas_Post_Callback *pc;
+   Eina_List *l;
+   
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   
+   EINA_LIST_FOREACH(e->post_events, l, pc)
+     {
+        if (pc->func == func)
+          {
+             pc->delete_me = 1;
+             return;
+          }
+     }
+}
+
+/**
+ * Remove a callback from the post-event callback stack
+ * 
+ * @param e Canvas to push the callback on
+ * @param func The function that to be called when the stack is unwound
+ * @param data The data pointer to be passed to the callback
+ * 
+ * This removes a callback from the stack added with
+ * evas_post_event_callback_push(). The first instance of the function and data
+ * in the callback stack is removed from being executed when the stack is
+ * unwound. Further instances may still be run on unwind.
+ */
+EAPI void
+evas_post_event_callback_remove_full(Evas *e, Evas_Object_Event_Post_Cb func, const void *data)
+{
+   Evas_Post_Callback *pc;
+   Eina_List *l;
+   
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   
+   EINA_LIST_FOREACH(e->post_events, l, pc)
+     {
+        if ((pc->func == func) && (pc->data == data))
+          {
+             pc->delete_me = 1;
+             return;
+          }
+     }
+}
+/**
+ * @}
+ */
diff --git a/src/lib/canvas/evas_clip.c b/src/lib/canvas/evas_clip.c
new file mode 100644 (file)
index 0000000..1f9ce4d
--- /dev/null
@@ -0,0 +1,314 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+void
+evas_object_clip_dirty(Evas_Object *obj)
+{
+   Eina_List *l;
+   Evas_Object *data;
+
+   obj->cur.cache.clip.dirty = 1;
+   EINA_LIST_FOREACH(obj->clip.clipees, l, data)
+     evas_object_clip_dirty(data);
+}
+
+void
+evas_object_recalc_clippees(Evas_Object *obj)
+{
+   Eina_List *l;
+   Evas_Object *data;
+
+   if (obj->cur.cache.clip.dirty)
+     {
+       evas_object_clip_recalc(obj);
+       EINA_LIST_FOREACH(obj->clip.clipees, l, data)
+         evas_object_recalc_clippees(data);
+     }
+}
+
+int
+evas_object_clippers_was_visible(Evas_Object *obj)
+{
+   if (obj->prev.visible)
+     {
+       if (obj->prev.clipper)
+         return evas_object_clippers_is_visible(obj->prev.clipper);
+       return 1;
+     }
+   return 0;
+}
+
+/* public functions */
+
+/**
+ * @addtogroup Evas_Object_Group_Basic
+ * @{
+ */
+
+/**
+ * Clip one object to another.
+ * @param obj The object to be clipped
+ * @param clip The object to clip @p obj by
+ *
+ * This function will clip the object @p obj to the area occupied by the
+ * object @p clipper. This means the object @p obj will only be visible within
+ * the area occupied by the clipping object (@p clip). The color of the object
+ * being clipped will be multiplied by the color of the clipping object, so
+ * the resulting color for the clipped object is
+ * RESULT = (OBJ * CLIP) / (255 * 255) per color element (red, green, blue and
+ * alpha). Clipping is recursive, so clip objects may be clipped by other
+ * objects, and their color will in tern be multiplied. You may NOT set up
+ * circular clipping lists (i.e. object 1 clips object 2 which clips object 1).
+ * The behavior of Evas is undefined in this case. Objects which do not clip
+ * others are visible as normal, those that clip 1 or more objects become
+ * invisible themselves, only affecting what they clip. If an object ceases to
+ * have other objects being clipped by it, it will become visible again. The
+ * visibility of an object affects the objects that are clipped by it, so if
+ * the object clipping others is not shown, the objects clipped will not be
+ * shown either. If the object was being clipped by another object when this
+ * function is called, it is implicitly removed from the clipper it is being
+ * clipped to, and now is made to clip its new clipper.
+ *
+ * At the moment the only objects that can validly be used to clip other
+ * objects are rectangle objects. All other object types are invalid and the
+ * result of using them is undefined.
+ *
+ * The clip object @p clip must be a valid object, but may also be NULL in
+ * which case the effect of this function is the same as calling
+ * evas_object_clip_unset() on the @p obj object.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ * extern Evas_Object *obj;
+ * Evas_Object *clipper;
+ *
+ * clipper = evas_object_rectangle_add(evas);
+ * evas_object_color_set(clipper, 255, 255, 255, 255);
+ * evas_object_move(clipper, 10, 10);
+ * evas_object_resize(clipper, 20, 50);
+ * evas_object_clip_set(obj, clipper);
+ * evas_object_show(clipper);
+ * @endcode
+ *
+ */
+EAPI void
+evas_object_clip_set(Evas_Object *obj, Evas_Object *clip)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!clip)
+     {
+       evas_object_clip_unset(obj);
+       return;
+     }
+   MAGIC_CHECK(clip, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->cur.clipper == clip) return;
+   if (obj == clip) return;
+   if (evas_object_intercept_call_clip_set(obj, clip)) return;
+   if (obj->smart.smart)
+     {
+       if (obj->smart.smart->smart_class->clip_set)
+         obj->smart.smart->smart_class->clip_set(obj, clip);
+     }
+   if (obj->cur.clipper)
+     {
+       /* unclip */
+       obj->cur.clipper->clip.clipees = eina_list_remove(obj->cur.clipper->clip.clipees, obj);
+       if (!obj->cur.clipper->clip.clipees)
+         {
+            obj->cur.clipper->cur.have_clipees = 0;
+            if (obj->cur.clipper->cur.visible)
+              evas_damage_rectangle_add(obj->cur.clipper->layer->evas,
+                                        obj->cur.clipper->cur.geometry.x,
+                                        obj->cur.clipper->cur.geometry.y,
+                                        obj->cur.clipper->cur.geometry.w,
+                                        obj->cur.clipper->cur.geometry.h);
+         }
+       evas_object_change(obj->cur.clipper);
+       evas_object_change(obj);
+       obj->cur.clipper = NULL;
+     }
+   /* clip me */
+   if ((clip->clip.clipees == NULL) && (clip->cur.visible))
+     {
+       /* Basically it just went invisible */
+       clip->changed = 1;
+       clip->layer->evas->changed = 1;
+       evas_damage_rectangle_add(clip->layer->evas,
+                                 clip->cur.geometry.x, clip->cur.geometry.y,
+                                 clip->cur.geometry.w, clip->cur.geometry.h);
+     }
+   obj->cur.clipper = clip;
+   clip->clip.clipees = eina_list_append(clip->clip.clipees, obj);
+   if (clip->clip.clipees) clip->cur.have_clipees = 1;
+   evas_object_change(clip);
+   evas_object_change(obj);
+   evas_object_clip_dirty(obj);
+   evas_object_recalc_clippees(obj);
+   if (!obj->smart.smart)
+     {
+       if (evas_object_is_in_output_rect(obj,
+                                         obj->layer->evas->pointer.x,
+                                         obj->layer->evas->pointer.y, 1, 1))
+         evas_event_feed_mouse_move(obj->layer->evas,
+                                    obj->layer->evas->pointer.x,
+                                    obj->layer->evas->pointer.y,
+                                    obj->layer->evas->last_timestamp,
+                                    NULL);
+     }
+}
+
+/**
+ * Get the object clipping this one (if any).
+ * @param obj The object to get the clipper from
+ *
+ * This function returns the the object clipping @p obj. If @p obj not being
+ * clipped, NULL is returned. The object @p obj must be a valid object.
+ *
+ * See also evas_object_clip_set(), evas_object_clip_unset() and
+ * evas_object_clipees_get().
+ *
+ * Example:
+ * @code
+ * extern Evas_Object *obj;
+ * Evas_Object *clipper;
+ *
+ * clipper = evas_object_clip_get(obj);
+ * if (clipper) evas_object_show(clipper);
+ * @endcode
+ *
+ */
+EAPI Evas_Object *
+evas_object_clip_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   return obj->cur.clipper;
+}
+
+/**
+ * Disable clipping for an object.
+ *
+ * @param obj The object to cease clipping on
+ *
+ * This function disables clipping for the object @p obj, if it was already
+ * clipped. If it wasn't, this has no effect. The object @p obj must be a
+ * valid object.
+ *
+ * See also evas_object_clip_set(), evas_object_clipees_get() and
+ * evas_object_clip_get().
+ *
+ * Example:
+ * @code
+ * extern Evas_Object *obj;
+ * Evas_Object *clipper;
+ *
+ * clipper = evas_object_clip_get(obj);
+ * if (clipper)
+ *   {
+ *     evas_object_clip_unset(obj);
+ *     evas_object_hide(obj);
+ *   }
+ * @endcode
+ *
+ */
+EAPI void
+evas_object_clip_unset(Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!obj->cur.clipper) return;
+   /* unclip */
+   if (evas_object_intercept_call_clip_unset(obj)) return;
+   if (obj->smart.smart)
+     {
+       if (obj->smart.smart->smart_class->clip_unset)
+         obj->smart.smart->smart_class->clip_unset(obj);
+     }
+   if (obj->cur.clipper)
+     {
+        obj->cur.clipper->clip.clipees = eina_list_remove(obj->cur.clipper->clip.clipees, obj);
+       if (!obj->cur.clipper->clip.clipees)
+         {
+            obj->cur.clipper->cur.have_clipees = 0;
+            if (obj->cur.clipper->cur.visible)
+              evas_damage_rectangle_add(obj->cur.clipper->layer->evas,
+                                        obj->cur.clipper->cur.geometry.x,
+                                        obj->cur.clipper->cur.geometry.y,
+                                        obj->cur.clipper->cur.geometry.w,
+                                        obj->cur.clipper->cur.geometry.h);
+         }
+       evas_object_change(obj->cur.clipper);
+     }
+   obj->cur.clipper = NULL;
+   evas_object_change(obj);
+   evas_object_clip_dirty(obj);
+   evas_object_recalc_clippees(obj);
+   if (!obj->smart.smart)
+     {
+       if (evas_object_is_in_output_rect(obj,
+                                         obj->layer->evas->pointer.x,
+                                         obj->layer->evas->pointer.y, 1, 1))
+         evas_event_feed_mouse_move(obj->layer->evas,
+                                    obj->layer->evas->pointer.x,
+                                    obj->layer->evas->pointer.y,
+                                     obj->layer->evas->last_timestamp,
+                                    NULL);
+     }
+}
+
+/**
+ * Return a list of objects currently clipped by a specific object.
+ *
+ * @param obj The object to get a list of clippees from
+ *
+ * This returns the inernal list handle that contains all objects clipped by
+ * the object @p obj. If none are clipped, it returns NULL. This list is only
+ * valid until the clip list is changed and should be fetched again with another
+ * call to evas_object_clipees_get() if any objects being clipped by this object
+ * are unclipped, clipped by a new object, are deleted or the clipper is
+ * deleted.  These operations will invalidate the list returned so it should
+ * not be used anymore after that point. Any use of the list after this may have
+ * undefined results, not limited just to strange behavior but possible
+ * segfaults and other strange memory errors. The object @p obj must be a valid
+ * object.
+ *
+ * See also evas_object_clip_set(), evas_object_clip_unset() and
+ * evas_object_clip_get().
+ *
+ * Example:
+ * @code
+ * extern Evas_Object *obj;
+ * Evas_Object *clipper;
+ *
+ * clipper = evas_object_clip_get(obj);
+ * if (clipper)
+ *   {
+ *     Eina_List *clippees, *l;
+ *     Evas_Object *obj_tmp;
+ *
+ *     clippees = evas_object_clipees_get(clipper);
+ *     printf("Clipper clips %i objects\n", eina_list_count(clippees));
+ *     EINA_LIST_FOREACH(clippees, l, obj_tmp)
+ *         evas_object_show(obj_tmp);
+ *   }
+ * @endcode
+ */
+EAPI const Eina_List *
+evas_object_clipees_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   return obj->clip.clipees;
+}
+
+/**
+ * @}
+ */
diff --git a/src/lib/canvas/evas_data.c b/src/lib/canvas/evas_data.c
new file mode 100644 (file)
index 0000000..a3ddc7f
--- /dev/null
@@ -0,0 +1,156 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/**
+ * @addtogroup Evas_Object_Group_Extras
+ * @{
+ */
+
+/**
+ * Set an attached data pointer to an object with a given string key.
+ * @param obj The object to attach the data pointer to
+ * @param key The string key for the data to access it
+ * @param data The ponter to the data to be attached
+ *
+ * This attaches the pointer @p data to the object @p obj given the string
+ * @p key. This pointer will stay "hooked" to the object until a new pointer
+ * with the same string key is attached with evas_object_data_set() or it is
+ * deleted with evas_object_data_del(). On deletion of the object @p obj, the
+ * pointers will not be accessible from the object anymore.
+ *
+ * You can find the pointer attached under a string key using
+ * evas_object_data_get(). It is the job of the calling application to free
+ * any data pointed to by @p data when it is no longer required.
+ *
+ * If @p data is NULL, the old value stored at @p key will be removed but no
+ * new value will be stored. This is synonymous with calling
+ * evas_object_data_del() with @p obj and @p key.
+ *
+ * Example:
+ *
+ * @code
+ * int *my_data;
+ * extern Evas_Object *obj;
+ *
+ * my_data = malloc(500);
+ * evas_object_data_set(obj, "name_of_data", my_data);
+ * printf("The data that was attached was %p\n", evas_object_data_get(obj, "name_of_data"));
+ * @endcode
+ */
+EAPI void
+evas_object_data_set(Evas_Object *obj, const char *key, const void *data)
+{
+   Evas_Data_Node *node;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!key) return;
+
+   evas_object_data_del(obj, key);
+   if (data == NULL) return;
+   node = malloc(sizeof(Evas_Data_Node) + strlen(key) + 1);
+   node->key = (char *)node + sizeof(Evas_Data_Node);
+   strcpy(node->key, key);
+   node->data = (void *)data;
+   obj->data.elements = eina_list_prepend(obj->data.elements, node);
+}
+
+/**
+ * Return an attached data pointer by its given string key.
+ * @param obj The object to which the data was attached
+ * @param key The string key the data was stored under
+ * @return The data pointer stored, or NULL if none was stored
+ *
+ * This function will return the data pointer attached to the object @p obj
+ * stored using the string key @p key. If the object is valid and data was
+ * stored under the given key, the pointer that was stored will be reuturned.
+ * If this is not the case, NULL will be returned, signifying an invalid object
+ * or non-existent key. It is possible a NULL pointer was stored given that
+ * key, but this situation is non-sensical and thus can be considered an error
+ * as well. NULL pointers are never stored as this is the return value if an
+ * error occurs.
+ *
+ * Example:
+ *
+ * @code
+ * int *my_data;
+ * extern Evas_Object *obj;
+ *
+ * my_data = evas_object_data_get(obj, "name_of_my_data");
+ * if (my_data) printf("Data stored was %p\n", my_data);
+ * else printf("No data was stored on the object\n");
+ * @endcode
+ */
+EAPI void *
+evas_object_data_get(const Evas_Object *obj, const char *key)
+{
+   Eina_List *l;
+   Evas_Data_Node *node;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!key) return NULL;
+
+   EINA_LIST_FOREACH(obj->data.elements, l, node)
+     {
+       if (!strcmp(node->key, key))
+         {
+            Eina_List *lst;
+            lst = obj->data.elements;
+            lst = eina_list_promote_list(lst, l);
+            ((Evas_Object *)obj)->data.elements = lst;
+            return node->data;
+         }
+     }
+   return NULL;
+}
+
+/**
+ * Delete at attached data pointer from an object.
+ * @param obj The object to delete the data pointer from
+ * @param key The string key the data was stored under
+ * @return The original data pointer stored at @p key on @p obj
+ *
+ * This will remove thee stored data pointer from @p obj stored under @p key,
+ * and return the original pointer stored under @p key, if any, nor NULL if
+ * nothing was stored under that key.
+ *
+ * Example:
+ *
+ * @code
+ * int *my_data;
+ * extern Evas_Object *obj;
+ *
+ * my_data = evas_object_data_del(obj, "name_of_my_data");
+ * @endcode
+ */
+EAPI void *
+evas_object_data_del(Evas_Object *obj, const char *key)
+{
+   Eina_List *l;
+   Evas_Data_Node *node;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!key) return NULL;
+   EINA_LIST_FOREACH(obj->data.elements, l, node)
+     {
+       if (!strcmp(node->key, key))
+         {
+            void *data;
+
+            data = node->data;
+            obj->data.elements = eina_list_remove_list(obj->data.elements, l);
+            free(node);
+            return data;
+         }
+     }
+   return NULL;
+}
+
+/**
+ * @}
+ */
diff --git a/src/lib/canvas/evas_events.c b/src/lib/canvas/evas_events.c
new file mode 100644 (file)
index 0000000..76ce007
--- /dev/null
@@ -0,0 +1,1688 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+static void
+_evas_event_havemap_adjust(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)
+{
+   Evas_Object *pmap;
+   
+   if (!obj->havemap_parent) return;
+   pmap = obj->smart.parent;
+   if (!pmap) return;
+   while (pmap)
+     {
+        if ((pmap->cur.map) && (pmap->cur.map->count == 4) && (pmap->cur.usemap))
+          break;
+        pmap = pmap->smart.parent;
+     }
+   if (!pmap) return;
+   evas_map_coords_get(pmap->cur.map, *x, *y, x, y, obj->mouse_grabbed);
+   if (pmap->cur.map)
+     {
+        *x += pmap->cur.map->normal_geometry.x;
+        *y += pmap->cur.map->normal_geometry.y;
+     }
+}
+
+static Eina_List *
+_evas_event_object_list_in_get(Evas *e, Eina_List *in,
+                               const Eina_Inlist *list, Evas_Object *stop, 
+                               int x, int y, int *no_rep, int parmap)
+{
+   Evas_Object *obj;
+   if (!list) return in;
+   EINA_INLIST_REVERSE_FOREACH(list, obj)
+     {
+        if (parmap) obj->havemap_parent = 1;
+        else obj->havemap_parent = 0;
+        
+       if (obj == stop)
+         {
+            *no_rep = 1;
+            return in;
+         }
+       if (evas_event_passes_through(obj)) continue;
+        if ((obj->cur.visible) && (obj->delete_me == 0) &&
+            (!obj->clip.clipees) &&
+            (evas_object_clippers_is_visible(obj)))
+          {
+             if (obj->smart.smart)
+               {
+                  int norep;
+                  int inside;
+                  
+                  norep = 0;
+                  if (((obj->cur.map) && (obj->cur.map->count == 4) && (obj->cur.usemap)))
+                    {
+                       inside = evas_object_is_in_output_rect(obj, x, y, 1, 1);
+                       if (inside)
+                         {
+                            if (!evas_map_coords_get(obj->cur.map, x, y,
+                                                     &(obj->cur.map->mx),
+                                                     &(obj->cur.map->my), 0))
+                              {
+                                 inside = 0;
+                              }
+                            else
+                              {
+                                 parmap = 1;
+                              }
+                         }
+                       else
+                         inside = 0;
+                       if (inside)
+                         {
+                            in = _evas_event_object_list_in_get
+                              (e, in,
+                               evas_object_smart_members_get_direct(obj),
+                               stop, 
+                               obj->cur.geometry.x + obj->cur.map->mx, 
+                               obj->cur.geometry.y + obj->cur.map->my, 
+                               &norep, parmap);
+                         }
+                    }
+                  else
+                    {
+                       in = _evas_event_object_list_in_get
+                         (e, in, evas_object_smart_members_get_direct(obj),
+                          stop, x, y, &norep, parmap);
+                    }
+                  if (norep)
+                    {
+                       *no_rep = 1;
+                       return in;
+                    }
+               }
+             else
+               {
+                  int inside = 1;
+                  
+                  if (((obj->cur.map) && (obj->cur.map->count == 4) && (obj->cur.usemap)))
+                    {
+                       inside = evas_object_is_in_output_rect(obj, x, y, 1, 1);
+                       if (inside)
+                         {
+                            if (!evas_map_coords_get(obj->cur.map, x, y,
+                                                     &(obj->cur.map->mx),
+                                                     &(obj->cur.map->my), 0))
+                              inside = 0;
+                         }
+                       else
+                         inside = 0;
+                    }
+                  else
+                    inside = evas_object_is_in_output_rect(obj, x, y, 1, 1);
+                  if (inside && ((!obj->precise_is_inside) ||
+                                 (evas_object_is_inside(obj, x, y))))
+                    {
+                       in = eina_list_append(in, obj);
+                       if (!obj->repeat_events)
+                         {
+                            *no_rep = 1;
+                            return in;
+                         }
+                    }
+               }
+         }
+     }
+   *no_rep = 0;
+   return in;
+}
+
+Eina_List *
+evas_event_objects_event_list(Evas *e, Evas_Object *stop, int x, int y)
+{
+   Evas_Layer *lay;
+   Eina_List *in = NULL;
+
+   if (!e->layers) return NULL;
+   EINA_INLIST_REVERSE_FOREACH((EINA_INLIST_GET(e->layers)), lay)
+     {
+       int norep;
+
+       norep = 0;
+       in = _evas_event_object_list_in_get(e, in, 
+                                            EINA_INLIST_GET(lay->objects), 
+                                            stop, x, y, &norep, 0);
+       if (norep) return in;
+     }
+   return in;
+}
+
+static Eina_List *evas_event_list_copy(Eina_List *list);
+static Eina_List *
+evas_event_list_copy(Eina_List *list)
+{
+   Eina_List *l, *new_l = NULL;
+   const void *data;
+
+   EINA_LIST_FOREACH(list, l, data)
+     new_l = eina_list_append(new_l, data);
+   return new_l;
+}
+/* public functions */
+
+/**
+ * @addtogroup Evas_Event_Freezing_Group
+ * @{
+ */
+
+/**
+ * Freeze all event processing.
+ * @param e The canvas to freeze event processing on.
+ *
+ * This function will indicate to evas that the canvas @p e is to have
+ * all event processing frozen until a matching evas_event_thaw()
+ * function is called on the same canvas. Every freeze call must be
+ * matched by a thaw call in order to completely thaw out a canvas.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ * extern Evas_Object *object;
+ *
+ * evas_event_freeze(evas);
+ * evas_object_move(object, 50, 100);
+ * evas_object_resize(object, 200, 200);
+ * evas_event_thaw(evas);
+ * @endcode
+ */
+EAPI void
+evas_event_freeze(Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   e->events_frozen++;
+}
+
+/**
+ * Thaw a canvas out after freezing.
+ *
+ * @param e The canvas to thaw out.
+ *
+ * This will thaw out a canvas after a matching evas_event_freeze()
+ * call. If this call completely thaws out a canvas, events will start
+ * being processed again after this call, but this call will not
+ * invole any "missed" events to be evaluated.
+ *
+ * See evas_event_freeze() for an example.
+ */
+EAPI void
+evas_event_thaw(Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   e->events_frozen--;
+   if (e->events_frozen == 0)
+     {
+       Evas_Layer *lay;
+
+       EINA_INLIST_FOREACH((EINA_INLIST_GET(e->layers)), lay)
+         {
+            Evas_Object *obj;
+
+            EINA_INLIST_FOREACH(lay->objects, obj)
+              {
+                 evas_object_clip_recalc(obj);
+                 evas_object_recalc_clippees(obj);
+              }
+         }
+     }
+   if (e->events_frozen < 0)
+     evas_debug_generic("  Thaw of events when already thawed!!!\n");
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup Evas_Event_Feeding_Group
+ * @{
+ */
+
+/**
+ * Return the freeze count of a given canvas.
+ * @param e The canvas to fetch the freeze count from.
+ *
+ * This returns the number of times the canvas has been told to freeze
+ * events.  It is possible to call evas_event_freeze() multiple times,
+ * and these must be matched by evas_event_thaw() calls. This call
+ * allows the program to discover just how many times things have been
+ * frozen in case it may want to break out of a deep freeze state
+ * where the count is high.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ *
+ * while (evas_event_freeze_get(evas) > 0) evas_event_thaw(evas);
+ * @endcode
+ *
+ */
+EAPI int
+evas_event_freeze_get(const Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return 0;
+   MAGIC_CHECK_END();
+   return e->events_frozen;
+}
+
+
+/**
+ * Mouse down event feed.
+ *
+ * @param e The given canvas pointer.
+ * @param b The button number.
+ * @param flags The evas button flags.
+ * @param timestamp The timestamp of the mouse down event.
+ * @param data The data for canvas.
+ *
+ * This function will set some evas properties that is necessary when
+ * the mouse button is pressed. It prepares information to be treated
+ * by the callback function.
+ *
+ */
+EAPI void
+evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
+{
+   Eina_List *l, *copy;
+   Eina_List *ins;
+   Evas_Event_Mouse_Down ev;
+   Evas_Object *obj;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if ((b < 1) || (b > 32)) return;
+
+   e->pointer.button |= (1 << (b - 1));
+
+   if (e->events_frozen > 0) return;
+   e->last_timestamp = timestamp;
+
+   _evas_object_event_new();
+
+   ev.button = b;
+   ev.output.x = e->pointer.x;
+   ev.output.y = e->pointer.y;
+   ev.canvas.x = e->pointer.x;
+   ev.canvas.y = e->pointer.y;
+   ev.data = (void *)data;
+   ev.modifiers = &(e->modifiers);
+   ev.locks = &(e->locks);
+   ev.flags = flags;
+   ev.timestamp = timestamp;
+   ev.event_flags = EVAS_EVENT_FLAG_NONE;
+
+   _evas_walk(e);
+   ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
+   /* free our old list of ins */
+   e->pointer.object.in = eina_list_free(e->pointer.object.in);
+   /* and set up the new one */
+   e->pointer.object.in = ins;
+   copy = evas_event_list_copy(e->pointer.object.in);
+   EINA_LIST_FOREACH(copy, l, obj)
+     {
+        ev.canvas.x = e->pointer.x;
+        ev.canvas.y = e->pointer.y;
+        _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y);
+       if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
+         {
+            obj->mouse_grabbed++;
+            e->pointer.mouse_grabbed++;
+         }
+
+       if (e->events_frozen <= 0)
+         evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_DOWN, &ev);
+       if (e->delete_me) break;
+     }
+   if (copy) eina_list_free(copy);
+   e->last_mouse_down_counter++;
+   _evas_post_event_callback_call(e);
+   _evas_unwalk(e);
+}
+
+/**
+ * Mouse up event feed.
+ *
+ * @param e The given canvas pointer.
+ * @param b The button number.
+ * @param flags evas button flags.
+ * @param timestamp The timestamp of the mouse up event.
+ * @param data The data for canvas.
+ *
+ * This function will set some evas properties that is necessary when
+ * the mouse button is released. It prepares information to be treated
+ * by the callback function.
+ *
+ */
+EAPI void
+evas_event_feed_mouse_up(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
+{
+   Eina_List *l, *copy;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if ((b < 1) || (b > 32)) return;
+
+   e->pointer.button &= ~(1 << (b - 1));
+
+   if (e->events_frozen > 0) return;
+   e->last_timestamp = timestamp;
+
+     {
+       Evas_Event_Mouse_Up ev;
+       Evas_Object *obj;
+
+       _evas_object_event_new();
+
+       ev.button = b;
+       ev.output.x = e->pointer.x;
+       ev.output.y = e->pointer.y;
+       ev.canvas.x = e->pointer.x;
+       ev.canvas.y = e->pointer.y;
+       ev.data = (void *)data;
+       ev.modifiers = &(e->modifiers);
+       ev.locks = &(e->locks);
+       ev.flags = flags;
+       ev.timestamp = timestamp;
+       ev.event_flags = EVAS_EVENT_FLAG_NONE;
+
+       _evas_walk(e);
+       copy = evas_event_list_copy(e->pointer.object.in);
+       EINA_LIST_FOREACH(copy, l, obj)
+         {
+             ev.canvas.x = e->pointer.x;
+             ev.canvas.y = e->pointer.y;
+             _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y);
+            if ((obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB) &&
+                (obj->mouse_in) && (obj->mouse_grabbed > 0))
+              {
+                 obj->mouse_grabbed--;
+                 e->pointer.mouse_grabbed--;
+              }
+            if (e->events_frozen <= 0)
+              evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_UP, &ev);
+            if (e->delete_me) break;
+         }
+       if (copy) copy = eina_list_free(copy);
+       e->last_mouse_up_counter++;
+        _evas_post_event_callback_call(e);
+     }
+
+   if (!e->pointer.button)
+     {
+       Eina_List *ins;
+       Eina_List *l;
+         {
+            Evas_Event_Mouse_Out ev;
+            Evas_Object *obj;
+
+            _evas_object_event_new();
+
+            ev.buttons = e->pointer.button;
+            ev.output.x = e->pointer.x;
+            ev.output.y = e->pointer.y;
+            ev.canvas.x = e->pointer.x;
+            ev.canvas.y = e->pointer.y;
+            ev.data = (void *)data;
+            ev.modifiers = &(e->modifiers);
+            ev.locks = &(e->locks);
+            ev.timestamp = timestamp;
+            ev.event_flags = EVAS_EVENT_FLAG_NONE;
+
+            /* get new list of ins */
+            ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
+            /* go thru old list of in objects */
+            copy = evas_event_list_copy(e->pointer.object.in);
+            EINA_LIST_FOREACH(copy, l, obj)
+              {
+                  ev.canvas.x = e->pointer.x;
+                  ev.canvas.y = e->pointer.y;
+                  _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y);
+                 if ((!eina_list_data_find(ins, obj)) ||
+                     (!e->pointer.inside))
+                   {
+
+                      obj->mouse_in = 0;
+                      if (e->events_frozen <= 0)
+                        evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
+                   }
+                 if (e->delete_me) break;
+              }
+             _evas_post_event_callback_call(e);
+         }
+       if (copy) copy = eina_list_free(copy);
+       if (e->pointer.inside)
+         {
+            Evas_Event_Mouse_In ev;
+            Evas_Object *obj;
+
+            _evas_object_event_new();
+
+            ev.buttons = e->pointer.button;
+            ev.output.x = e->pointer.x;
+            ev.output.y = e->pointer.y;
+            ev.canvas.x = e->pointer.x;
+            ev.canvas.y = e->pointer.y;
+            ev.data = (void *)data;
+            ev.modifiers = &(e->modifiers);
+            ev.locks = &(e->locks);
+            ev.timestamp = timestamp;
+            ev.event_flags = EVAS_EVENT_FLAG_NONE;
+
+            EINA_LIST_FOREACH(ins, l, obj)
+              {
+                  ev.canvas.x = e->pointer.x;
+                  ev.canvas.y = e->pointer.y;
+                  _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y);
+                 if (!eina_list_data_find(e->pointer.object.in, obj))
+                   {
+
+                      obj->mouse_in = 1;
+                      if (e->events_frozen <= 0)
+                        evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev);
+                   }
+                 if (e->delete_me) break;
+              }
+             _evas_post_event_callback_call(e);
+         }
+       else
+         {
+            ins = eina_list_free(ins);
+         }
+       /* free our old list of ins */
+       e->pointer.object.in = eina_list_free(e->pointer.object.in);
+       /* and set up the new one */
+       e->pointer.object.in = ins;
+       if (e->pointer.inside)
+         evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
+     }
+
+   if (e->pointer.mouse_grabbed < 0)
+     {
+        ERR("BUG? e->pointer.mouse_grabbed (=%d) < 0!",
+             e->pointer.mouse_grabbed);
+     }
+
+   if ((e->pointer.button == 0) && (e->pointer.mouse_grabbed != 0))
+     {
+        INF("restore to 0 grabs (from %i)", e->pointer.mouse_grabbed);
+       e->pointer.mouse_grabbed = 0;
+     }
+   _evas_unwalk(e);
+}
+
+
+/**
+ * Mouse cancel event feed.
+ *
+ * @param e The given canvas pointer.
+ * @param timestamp The timestamp of the mouse up event.
+ * @param data The data for canvas.
+ *
+ * This function will call evas_event_feed_mouse_up() when a
+ * mouse cancel event happens.
+ *
+ */
+EAPI void
+evas_event_feed_mouse_cancel(Evas *e, unsigned int timestamp, const void *data)
+{
+   int i;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if (e->events_frozen > 0) return;
+
+   _evas_walk(e);
+   for (i = 0; i < 32; i++)
+     {
+       if ((e->pointer.button & (1 << i)))
+         evas_event_feed_mouse_up(e, i + 1, 0, timestamp, data);
+     }
+   _evas_unwalk(e);
+}
+
+/**
+ * Mouse wheel event feed.
+ *
+ * @param e The given canvas pointer.
+ * @param direction The wheel mouse direction.
+ * @param z How much mouse wheel was scrolled up or down.
+ * @param timestamp The timestamp of the mouse up event.
+ * @param data The data for canvas.
+ *
+ * This function will set some evas properties that is necessary when
+ * the mouse wheel is scrolled up or down. It prepares information to
+ * be treated by the callback function.
+ *
+ */
+EAPI void
+evas_event_feed_mouse_wheel(Evas *e, int direction, int z, unsigned int timestamp, const void *data)
+{
+   Eina_List *l, *copy;
+   Evas_Event_Mouse_Wheel ev;
+   Evas_Object *obj;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if (e->events_frozen > 0) return;
+   e->last_timestamp = timestamp;
+
+   _evas_object_event_new();
+
+   ev.direction = direction;
+   ev.z = z;
+   ev.output.x = e->pointer.x;
+   ev.output.y = e->pointer.y;
+   ev.canvas.x = e->pointer.x;
+   ev.canvas.y = e->pointer.y;
+   ev.data = (void *) data;
+   ev.modifiers = &(e->modifiers);
+   ev.locks = &(e->locks);
+   ev.timestamp = timestamp;
+   ev.event_flags = EVAS_EVENT_FLAG_NONE;
+
+   _evas_walk(e);
+   copy = evas_event_list_copy(e->pointer.object.in);
+
+   EINA_LIST_FOREACH(copy, l, obj)
+     {
+        ev.canvas.x = e->pointer.x;
+        ev.canvas.y = e->pointer.y;
+        _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y);
+       if (e->events_frozen <= 0)
+         evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_WHEEL, &ev);
+       if (e->delete_me) break;
+     }
+   if (copy) copy = eina_list_free(copy);
+   _evas_post_event_callback_call(e);
+
+   _evas_unwalk(e);
+}
+
+/**
+ * Mouse move event feed.
+ *
+ * @param e The given canvas pointer.
+ * @param x The horizontal position of the mouse pointer.
+ * @param y The vertical position of the mouse pointer.
+ * @param timestamp The timestamp of the mouse up event.
+ * @param data The data for canvas.
+ *
+ * This function will set some evas properties that is necessary when
+ * the mouse is moved from its last position. It prepares information
+ * to be treated by the callback function.
+ *
+ */
+EAPI void
+evas_event_feed_mouse_move(Evas *e, int x, int y, unsigned int timestamp, const void *data)
+{
+   int px, py;
+////   Evas_Coord pcx, pcy;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   px = e->pointer.x;
+   py = e->pointer.y;
+////   pcx = e->pointer.canvas_x;
+////   pcy = e->pointer.canvas_y;
+
+   if (e->events_frozen > 0) return;
+   e->last_timestamp = timestamp;
+
+   e->pointer.x = x;
+   e->pointer.y = y;
+////   e->pointer.canvas_x = x;
+////   e->pointer.canvas_y = y;
+////   e->pointer.canvas_x = evas_coord_screen_x_to_world(e, x);
+////   e->pointer.canvas_y = evas_coord_screen_y_to_world(e, y);
+   if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return;
+   _evas_walk(e);
+   /* if our mouse button is grabbed to any objects */
+   if (e->pointer.mouse_grabbed > 0)
+     {
+       /* go thru old list of in objects */
+       Eina_List *outs = NULL;
+       Eina_List *l, *copy;
+
+         {
+            Evas_Event_Mouse_Move ev;
+            Evas_Object *obj;
+
+            _evas_object_event_new();
+
+            ev.buttons = e->pointer.button;
+            ev.cur.output.x = e->pointer.x;
+            ev.cur.output.y = e->pointer.y;
+            ev.cur.canvas.x = e->pointer.x;
+            ev.cur.canvas.y = e->pointer.y;
+            ev.prev.output.x = px;
+            ev.prev.output.y = py;
+            ev.prev.canvas.x = px;
+            ev.prev.canvas.y = py;
+            ev.data = (void *)data;
+            ev.modifiers = &(e->modifiers);
+            ev.locks = &(e->locks);
+            ev.timestamp = timestamp;
+            ev.event_flags = EVAS_EVENT_FLAG_NONE;
+            copy = evas_event_list_copy(e->pointer.object.in);
+            EINA_LIST_FOREACH(copy, l, obj)
+              {
+                  ev.cur.canvas.x = e->pointer.x;
+                  ev.cur.canvas.y = e->pointer.y;
+                  _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y);
+                 if ((obj->cur.visible) &&
+                     (evas_object_clippers_is_visible(obj)) &&
+                     (!evas_event_passes_through(obj)) &&
+                     (!obj->clip.clipees))
+                   {
+                      if ((px != x) || (py != y))
+                        {
+                           if (e->events_frozen <= 0)
+                             evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev);
+                        }
+                   }
+                 else
+                   outs = eina_list_append(outs, obj);
+                 if (e->delete_me) break;
+              }
+             _evas_post_event_callback_call(e);
+         }
+         {
+            Evas_Event_Mouse_Out ev;
+
+            _evas_object_event_new();
+
+            ev.buttons = e->pointer.button;
+            ev.output.x = e->pointer.x;
+            ev.output.y = e->pointer.y;
+            ev.canvas.x = e->pointer.x;
+            ev.canvas.y = e->pointer.y;
+            ev.data = (void *)data;
+            ev.modifiers = &(e->modifiers);
+            ev.locks = &(e->locks);
+            ev.timestamp = timestamp;
+            ev.event_flags = EVAS_EVENT_FLAG_NONE;
+
+            if (copy) copy = eina_list_free(copy);
+            while (outs)
+              {
+                 Evas_Object *obj;
+
+                 obj = outs->data;
+                 outs = eina_list_remove(outs, obj);
+                 if ((obj->mouse_grabbed == 0) && (!e->delete_me))
+                   {
+                       ev.canvas.x = e->pointer.x;
+                       ev.canvas.y = e->pointer.y;
+                       _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y);
+                      e->pointer.object.in = eina_list_remove(e->pointer.object.in, obj);
+                       obj->mouse_in = 0;
+                       if (e->events_frozen <= 0)
+                         evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
+                   }
+              }
+             _evas_post_event_callback_call(e);
+         }
+     }
+   else
+     {
+       Eina_List *ins;
+       Eina_List *l, *copy;
+       Evas_Event_Mouse_Move ev;
+       Evas_Event_Mouse_Out ev2;
+       Evas_Event_Mouse_In ev3;
+       Evas_Object *obj;
+
+       _evas_object_event_new();
+
+       ev.buttons = e->pointer.button;
+       ev.cur.output.x = e->pointer.x;
+       ev.cur.output.y = e->pointer.y;
+       ev.cur.canvas.x = e->pointer.x;
+       ev.cur.canvas.y = e->pointer.y;
+       ev.prev.output.x = px;
+       ev.prev.output.y = py;
+       ev.prev.canvas.x = px;
+       ev.prev.canvas.y = py;
+       ev.data = (void *)data;
+       ev.modifiers = &(e->modifiers);
+       ev.locks = &(e->locks);
+       ev.timestamp = timestamp;
+       ev.event_flags = EVAS_EVENT_FLAG_NONE;
+
+       ev2.buttons = e->pointer.button;
+       ev2.output.x = e->pointer.x;
+       ev2.output.y = e->pointer.y;
+       ev2.canvas.x = e->pointer.x;
+       ev2.canvas.y = e->pointer.y;
+       ev2.data = (void *)data;
+       ev2.modifiers = &(e->modifiers);
+       ev2.locks = &(e->locks);
+       ev2.timestamp = timestamp;
+       ev2.event_flags = EVAS_EVENT_FLAG_NONE;
+
+       ev3.buttons = e->pointer.button;
+       ev3.output.x = e->pointer.x;
+       ev3.output.y = e->pointer.y;
+       ev3.canvas.x = e->pointer.x;
+       ev3.canvas.y = e->pointer.y;
+       ev3.data = (void *)data;
+       ev3.modifiers = &(e->modifiers);
+       ev3.locks = &(e->locks);
+       ev3.timestamp = timestamp;
+       ev3.event_flags = EVAS_EVENT_FLAG_NONE;
+
+       /* get all new in objects */
+       ins = evas_event_objects_event_list(e, NULL, x, y);
+       /* go thru old list of in objects */
+       copy = evas_event_list_copy(e->pointer.object.in);
+       EINA_LIST_FOREACH(copy, l, obj)
+         {
+            /* if its under the pointer and its visible and its in the new */
+            /* in list */
+// FIXME: i don't think we need this
+//          evas_object_clip_recalc(obj);
+            if (evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
+                (obj->cur.visible) &&
+                (evas_object_clippers_is_visible(obj)) &&
+                (eina_list_data_find(ins, obj)) &&
+                (!evas_event_passes_through(obj)) &&
+                (!obj->clip.clipees) &&
+                ((!obj->precise_is_inside) ||
+                 (evas_object_is_inside(obj, x, y))))
+              {
+                 if ((px != x) || (py != y))
+                   {
+                       ev.cur.canvas.x = e->pointer.x;
+                       ev.cur.canvas.y = e->pointer.y;
+                       _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y);
+                      if (e->events_frozen <= 0)
+                        evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev);
+                   }
+              }
+            /* otherwise it has left the object */
+            else
+              {
+                 obj->mouse_in = 0;
+                  ev2.canvas.x = e->pointer.x;
+                  ev2.canvas.y = e->pointer.y;
+                  _evas_event_havemap_adjust(obj, &ev2.canvas.x, &ev2.canvas.y);
+                 if (e->events_frozen <= 0)
+                   evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev2);
+              }
+            if (e->delete_me) break;
+         }
+        _evas_post_event_callback_call(e);
+
+       _evas_object_event_new();
+
+       if (copy) copy = eina_list_free(copy);
+       /* go thru our current list of ins */
+       EINA_LIST_FOREACH(ins, l, obj)
+         {
+             ev3.canvas.x = e->pointer.x;
+             ev3.canvas.y = e->pointer.y;
+             _evas_event_havemap_adjust(obj, &ev3.canvas.x, &ev3.canvas.y);
+            /* if its not in the old list of ins send an enter event */
+            if (!eina_list_data_find(e->pointer.object.in, obj))
+              {
+                 obj->mouse_in = 1;
+
+                 if (e->events_frozen <= 0)
+                   evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev3);
+              }
+            if (e->delete_me) break;
+         }
+       /* free our old list of ins */
+       eina_list_free(e->pointer.object.in);
+       /* and set up the new one */
+       e->pointer.object.in = ins;
+        _evas_post_event_callback_call(e);
+     }
+   _evas_unwalk(e);
+}
+
+/**
+ * Mouse in event feed.
+ *
+ * @param e The given canvas pointer.
+ * @param timestamp The timestamp of the mouse up event.
+ * @param data The data for canvas.
+ *
+ * This function will set some evas properties that is necessary when
+ * the mouse in event happens. It prepares information to be treated
+ * by the callback function.
+ *
+ */
+EAPI void
+evas_event_feed_mouse_in(Evas *e, unsigned int timestamp, const void *data)
+{
+   Eina_List *ins;
+   Eina_List *l;
+   Evas_Event_Mouse_In ev;
+   Evas_Object *obj;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   e->pointer.inside = 1;
+
+   if (e->events_frozen > 0) return;
+   e->last_timestamp = timestamp;
+
+   if (e->pointer.mouse_grabbed != 0) return;
+
+   _evas_object_event_new();
+
+   ev.buttons = e->pointer.button;
+   ev.output.x = e->pointer.x;
+   ev.output.y = e->pointer.y;
+   ev.canvas.x = e->pointer.x;
+   ev.canvas.y = e->pointer.y;
+   ev.data = (void *)data;
+   ev.modifiers = &(e->modifiers);
+   ev.locks = &(e->locks);
+   ev.timestamp = timestamp;
+   ev.event_flags = EVAS_EVENT_FLAG_NONE;
+
+   _evas_walk(e);
+   /* get new list of ins */
+   ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
+   EINA_LIST_FOREACH(ins, l, obj)
+     {
+        ev.canvas.x = e->pointer.x;
+        ev.canvas.y = e->pointer.y;
+        _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y);
+       if (!eina_list_data_find(e->pointer.object.in, obj))
+         {
+
+            obj->mouse_in = 1;
+            if (e->events_frozen <= 0)
+              evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev);
+         }
+       if (e->delete_me) break;
+     }
+   /* free our old list of ins */
+   e->pointer.object.in = eina_list_free(e->pointer.object.in);
+   /* and set up the new one */
+   e->pointer.object.in = ins;
+   _evas_post_event_callback_call(e);
+   evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
+   _evas_unwalk(e);
+}
+
+/**
+ * Mouse out event feed.
+ *
+ * @param e The given canvas pointer.
+ * @param timestamp Timestamp of the mouse up event.
+ * @param data The data for canvas.
+ *
+ * This function will set some evas properties that is necessary when
+ * the mouse out event happens. It prepares information to be treated
+ * by the callback function.
+ *
+ */
+EAPI void
+evas_event_feed_mouse_out(Evas *e, unsigned int timestamp, const void *data)
+{
+   Evas_Event_Mouse_Out ev;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   e->pointer.inside = 0;
+
+   if (e->events_frozen > 0) return;
+   e->last_timestamp = timestamp;
+
+   _evas_object_event_new();
+
+   ev.buttons = e->pointer.button;
+   ev.output.x = e->pointer.x;
+   ev.output.y = e->pointer.y;
+   ev.canvas.x = e->pointer.x;
+   ev.canvas.y = e->pointer.y;
+   ev.data = (void *)data;
+   ev.modifiers = &(e->modifiers);
+   ev.locks = &(e->locks);
+   ev.timestamp = timestamp;
+   ev.event_flags = EVAS_EVENT_FLAG_NONE;
+
+   _evas_walk(e);
+   /* if our mouse button is grabbed to any objects */
+   if (e->pointer.mouse_grabbed == 0)
+     {
+       /* go thru old list of in objects */
+       Eina_List *l, *copy;
+       Evas_Object *obj;
+
+       copy = evas_event_list_copy(e->pointer.object.in);
+       EINA_LIST_FOREACH(copy, l, obj)
+         {
+             ev.canvas.x = e->pointer.x;
+             ev.canvas.y = e->pointer.y;
+             _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y);
+             obj->mouse_in = 0;
+           if (e->events_frozen <= 0)
+             evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
+
+           if (e->delete_me) break;
+         }
+       if (copy) copy = eina_list_free(copy);
+       /* free our old list of ins */
+       e->pointer.object.in =  eina_list_free(e->pointer.object.in);
+        _evas_post_event_callback_call(e);
+     }
+   _evas_unwalk(e);
+}
+
+EAPI void
+evas_event_feed_multi_down(Evas *e, 
+                           int d, int x, int y, 
+                           double rad, double radx, double rady,
+                           double pres, double ang,
+                           double fx, double fy,
+                           Evas_Button_Flags flags, unsigned int timestamp, 
+                           const void *data)
+{
+   Eina_List *l, *copy;
+   Evas_Event_Multi_Down ev;
+   Evas_Object *obj;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if (e->events_frozen > 0) return;
+   e->last_timestamp = timestamp;
+
+   _evas_object_event_new();
+
+   ev.device = d;
+   ev.output.x = x;
+   ev.output.y = y;
+   ev.canvas.x = x;
+   ev.canvas.y = y;
+   ev.radius = rad;
+   ev.radius_x = radx;
+   ev.radius_y = rady;
+   ev.pressure = pres;
+   ev.angle = ang;
+   ev.canvas.xsub = fx;
+   ev.canvas.ysub = fy;
+   ev.data = (void *)data;
+   ev.modifiers = &(e->modifiers);
+   ev.locks = &(e->locks);
+   ev.flags = flags;
+   ev.timestamp = timestamp;
+   ev.event_flags = EVAS_EVENT_FLAG_NONE;
+
+   _evas_walk(e);
+   copy = evas_event_list_copy(e->pointer.object.in);
+   EINA_LIST_FOREACH(copy, l, obj)
+     {
+        ev.canvas.x = x;
+        ev.canvas.y = y;
+        ev.canvas.xsub = fx;
+        ev.canvas.ysub = fy;
+        _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y);
+        if (x != ev.canvas.x) 
+          ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
+        if (y != ev.canvas.y)
+          ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
+       if (e->events_frozen <= 0)
+         evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_DOWN, &ev);
+       if (e->delete_me) break;
+     }
+   if (copy) eina_list_free(copy);
+   _evas_post_event_callback_call(e);
+   _evas_unwalk(e);
+}
+
+EAPI void
+evas_event_feed_multi_up(Evas *e, 
+                         int d, int x, int y, 
+                         double rad, double radx, double rady,
+                         double pres, double ang,
+                         double fx, double fy,
+                         Evas_Button_Flags flags, unsigned int timestamp, 
+                         const void *data)
+{
+   Eina_List *l, *copy;
+   Evas_Event_Multi_Up ev;
+   Evas_Object *obj;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if (e->events_frozen > 0) return;
+   e->last_timestamp = timestamp;
+
+   _evas_object_event_new();
+
+   ev.device = d;
+   ev.output.x = x;
+   ev.output.y = y;
+   ev.canvas.x = x;
+   ev.canvas.y = y;
+   ev.radius = rad;
+   ev.radius_x = radx;
+   ev.radius_y = rady;
+   ev.pressure = pres;
+   ev.angle = ang;
+   ev.canvas.xsub = fx;
+   ev.canvas.ysub = fy;
+   ev.data = (void *)data;
+   ev.modifiers = &(e->modifiers);
+   ev.locks = &(e->locks);
+   ev.flags = flags;
+   ev.timestamp = timestamp;
+   ev.event_flags = EVAS_EVENT_FLAG_NONE;
+   
+   _evas_walk(e);
+   copy = evas_event_list_copy(e->pointer.object.in);
+   EINA_LIST_FOREACH(copy, l, obj)
+     {
+        ev.canvas.x = x;
+        ev.canvas.y = y;
+        ev.canvas.xsub = fx;
+        ev.canvas.ysub = fy;
+        _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y);
+        if (x != ev.canvas.x) 
+          ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
+        if (y != ev.canvas.y)
+          ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
+        if (e->events_frozen <= 0)
+          evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_UP, &ev);
+        if (e->delete_me) break;
+     }
+   if (copy) copy = eina_list_free(copy);
+   _evas_post_event_callback_call(e);
+   _evas_unwalk(e);
+}
+
+EAPI void
+evas_event_feed_multi_move(Evas *e, 
+                           int d, int x, int y, 
+                           double rad, double radx, double rady,
+                           double pres, double ang,
+                           double fx, double fy,
+                           unsigned int timestamp, const void *data)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if (e->events_frozen > 0) return;
+   e->last_timestamp = timestamp;
+
+   if (!e->pointer.inside) return;
+   
+   _evas_walk(e);
+   /* if our mouse button is grabbed to any objects */
+   if (e->pointer.mouse_grabbed > 0)
+     {
+       /* go thru old list of in objects */
+       Eina_List *l, *copy;
+        Evas_Event_Multi_Move ev;
+        Evas_Object *obj;
+
+       _evas_object_event_new();
+
+        ev.device = d;
+        ev.cur.output.x = x;
+        ev.cur.output.y = y;
+        ev.cur.canvas.x = x;
+        ev.cur.canvas.y = y;
+        ev.radius = rad;
+        ev.radius_x = radx;
+        ev.radius_y = rady;
+        ev.pressure = pres;
+        ev.angle = ang;
+        ev.cur.canvas.xsub = fx;
+        ev.cur.canvas.ysub = fy;
+        ev.data = (void *)data;
+        ev.modifiers = &(e->modifiers);
+        ev.locks = &(e->locks);
+        ev.timestamp = timestamp;
+        ev.event_flags = EVAS_EVENT_FLAG_NONE;
+
+        copy = evas_event_list_copy(e->pointer.object.in);
+        EINA_LIST_FOREACH(copy, l, obj)
+          {
+             if ((obj->cur.visible) &&
+                 (evas_object_clippers_is_visible(obj)) &&
+                 (!evas_event_passes_through(obj)) &&
+                 (!obj->clip.clipees))
+               {
+                  ev.cur.canvas.x = x;
+                  ev.cur.canvas.y = y;
+                  ev.cur.canvas.xsub = fx;
+                  ev.cur.canvas.ysub = fy;
+                  _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y);
+                  if (x != ev.cur.canvas.x) 
+                    ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
+                  if (y != ev.cur.canvas.y)
+                    ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
+                  if (e->events_frozen <= 0)
+                    evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_MOVE, &ev);
+              }
+             if (e->delete_me) break;
+         }
+        _evas_post_event_callback_call(e);
+     }
+   else
+     {
+       Eina_List *ins;
+       Eina_List *l, *copy;
+       Evas_Event_Multi_Move ev;
+       Evas_Object *obj;
+
+       _evas_object_event_new();
+
+       ev.device = d;
+       ev.cur.output.x = x;
+       ev.cur.output.y = y;
+       ev.cur.canvas.x = x;
+       ev.cur.canvas.y = y;
+        ev.radius = rad;
+        ev.radius_x = radx;
+        ev.radius_y = rady;
+        ev.pressure = pres;
+        ev.angle = ang;
+        ev.cur.canvas.xsub = fx;
+        ev.cur.canvas.ysub = fy;
+       ev.data = (void *)data;
+       ev.modifiers = &(e->modifiers);
+       ev.locks = &(e->locks);
+       ev.timestamp = timestamp;
+       ev.event_flags = EVAS_EVENT_FLAG_NONE;
+        
+       /* get all new in objects */
+       ins = evas_event_objects_event_list(e, NULL, x, y);
+       /* go thru old list of in objects */
+       copy = evas_event_list_copy(e->pointer.object.in);
+       EINA_LIST_FOREACH(copy, l, obj)
+         {
+            /* if its under the pointer and its visible and its in the new */
+            /* in list */
+// FIXME: i don't think we need this
+//          evas_object_clip_recalc(obj);
+            if (evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
+                (obj->cur.visible) &&
+                (evas_object_clippers_is_visible(obj)) &&
+                (eina_list_data_find(ins, obj)) &&
+                (!evas_event_passes_through(obj)) &&
+                (!obj->clip.clipees) &&
+                ((!obj->precise_is_inside) ||
+                 (evas_object_is_inside(obj, x, y))))
+              {
+                  ev.cur.canvas.x = x;
+                  ev.cur.canvas.y = y;
+                  ev.cur.canvas.xsub = fx;
+                  ev.cur.canvas.ysub = fy;
+                  _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y);
+                  if (x != ev.cur.canvas.x) 
+                    ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
+                  if (y != ev.cur.canvas.y)
+                    ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
+                  if (e->events_frozen <= 0)
+                    evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_MOVE, &ev);
+              }
+            if (e->delete_me) break;
+         }
+       if (copy) copy = eina_list_free(copy);
+       /* free our old list of ins */
+       eina_list_free(e->pointer.object.in);
+       /* and set up the new one */
+       e->pointer.object.in = ins;
+        _evas_post_event_callback_call(e);
+     }
+   _evas_unwalk(e);
+}
+
+/**
+ * Key down event feed
+ *
+ * @param e The canvas to thaw out
+ * @param keyname  Name of the key
+ * @param key The key pressed.
+ * @param string A String
+ * @param compose The compose string
+ * @param timestamp Timestamp of the mouse up event
+ * @param data Data for canvas.
+ *
+ * This function will set some evas properties that is necessary when
+ * a key is pressed. It prepares information to be treated by the
+ * callback function.
+ *
+ */
+EAPI void
+evas_event_feed_key_down(Evas *e, const char *keyname, const char *key, const char *string, const char *compose, unsigned int timestamp, const void *data)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   if (!keyname) return;
+   if (e->events_frozen > 0) return;
+   e->last_timestamp = timestamp;
+   _evas_walk(e);
+     {
+       Evas_Event_Key_Down ev;
+       int exclusive;
+
+       _evas_object_event_new();
+
+       exclusive = 0;
+       ev.keyname = (char *)keyname;
+       ev.data = (void *)data;
+       ev.modifiers = &(e->modifiers);
+       ev.locks = &(e->locks);
+       ev.key = key;
+       ev.string = string;
+       ev.compose = compose;
+       ev.timestamp = timestamp;
+       ev.event_flags = EVAS_EVENT_FLAG_NONE;
+       if (e->grabs)
+         {
+            Eina_List *l;
+            Evas_Key_Grab *g;
+
+            e->walking_grabs++;
+            EINA_LIST_FOREACH(e->grabs, l, g)
+              {
+                 if (g->just_added)
+                   {
+                      g->just_added = 0;
+                      continue;
+                   }
+                 if (g->delete_me) continue;
+                 if (((e->modifiers.mask & g->modifiers) ||
+                      (g->modifiers == e->modifiers.mask)) &&
+                     (!strcmp(keyname, g->keyname)))
+                   {
+                      if (!(e->modifiers.mask & g->not_modifiers))
+                        {
+                           if (e->events_frozen <= 0)
+                             evas_object_event_callback_call(g->object, EVAS_CALLBACK_KEY_DOWN, &ev);
+                           if (g->exclusive) exclusive = 1;
+                        }
+                   }
+                 if (e->delete_me) break;
+              }
+            e->walking_grabs--;
+            if (e->walking_grabs <= 0)
+              {
+                 while (e->delete_grabs > 0)
+                   {
+                      e->delete_grabs--;
+                      for (l = e->grabs; l;)
+                        {
+                           g = eina_list_data_get(l);
+                           l = eina_list_next(l);
+                           if (g->delete_me)
+                             evas_key_grab_free(g->object, g->keyname, g->modifiers, g->not_modifiers);
+                        }
+                   }
+              }
+         }
+       if ((e->focused) && (!exclusive))
+         {
+            if (e->events_frozen <= 0)
+               evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_DOWN, &ev);
+         }
+        _evas_post_event_callback_call(e);
+     }
+   _evas_unwalk(e);
+}
+
+/**
+ * Key up event feed
+ *
+ * @param e The canvas to thaw out
+ * @param keyname  Name of the key
+ * @param key The key released.
+ * @param string string
+ * @param compose compose
+ * @param timestamp Timestamp of the mouse up event
+ * @param data Data for canvas.
+ *
+ * This function will set some evas properties that is necessary when
+ * a key is released. It prepares information to be treated by the
+ * callback function.
+ *
+ */
+EAPI void
+evas_event_feed_key_up(Evas *e, const char *keyname, const char *key, const char *string, const char *compose, unsigned int timestamp, const void *data)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   if (!keyname) return;
+   if (e->events_frozen > 0) return;
+   e->last_timestamp = timestamp;
+   _evas_walk(e);
+     {
+       Evas_Event_Key_Up ev;
+       int exclusive;
+
+       _evas_object_event_new();
+
+       exclusive = 0;
+       ev.keyname = (char *)keyname;
+       ev.data = (void *)data;
+       ev.modifiers = &(e->modifiers);
+       ev.locks = &(e->locks);
+       ev.key = key;
+       ev.string = string;
+       ev.compose = compose;
+       ev.timestamp = timestamp;
+       ev.event_flags = EVAS_EVENT_FLAG_NONE;
+       if (e->grabs)
+         {
+            Eina_List *l;
+            Evas_Key_Grab *g;
+
+            e->walking_grabs++;
+            EINA_LIST_FOREACH(e->grabs, l, g)
+              {
+                 if (g->just_added)
+                   {
+                      g->just_added = 0;
+                      continue;
+                   }
+                 if (g->delete_me) continue;
+                 if (((e->modifiers.mask & g->modifiers) ||
+                      (g->modifiers == e->modifiers.mask)) &&
+                     (!((e->modifiers.mask & g->not_modifiers) ||
+                        (g->not_modifiers == ~e->modifiers.mask))) &&
+                     (!strcmp(keyname, g->keyname)))
+                   {
+                      if (e->events_frozen <= 0)
+                        evas_object_event_callback_call(g->object, EVAS_CALLBACK_KEY_UP, &ev);
+                      if (g->exclusive) exclusive = 1;
+                   }
+                 if (e->delete_me) break;
+              }
+            e->walking_grabs--;
+            if (e->walking_grabs <= 0)
+              {
+                 while (e->delete_grabs > 0)
+                   {
+                      Eina_List *l, *l_next;
+                      Evas_Key_Grab *g;
+
+                      e->delete_grabs--;
+                      EINA_LIST_FOREACH_SAFE(e->grabs, l, l_next, g)
+                        {
+                           if (g->delete_me)
+                             evas_key_grab_free(g->object, g->keyname, g->modifiers, g->not_modifiers);
+                        }
+                   }
+              }
+         }
+       if ((e->focused) && (!exclusive))
+         {
+            if (e->events_frozen <= 0)
+               evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_UP, &ev);
+         }
+        _evas_post_event_callback_call(e);
+     }
+   _evas_unwalk(e);
+}
+
+/**
+ * Hold event feed
+ *
+ * @param e The given canvas pointer.
+ * @param hold The hold.
+ * @param timestamp The timestamp of the mouse up event.
+ * @param data The data for canvas.
+ *
+ * This function makes the object to stop sending events.
+ *
+ */
+EAPI void
+evas_event_feed_hold(Evas *e, int hold, unsigned int timestamp, const void *data)
+{
+   Eina_List *l, *copy;
+   Evas_Event_Hold ev;
+   Evas_Object *obj;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if (e->events_frozen > 0) return;
+   e->last_timestamp = timestamp;
+
+   _evas_object_event_new();
+
+   ev.hold = hold;
+   ev.data = (void *)data;
+   ev.timestamp = timestamp;
+   ev.event_flags = EVAS_EVENT_FLAG_NONE;
+
+   _evas_walk(e);
+   copy = evas_event_list_copy(e->pointer.object.in);
+   EINA_LIST_FOREACH(copy, l, obj)
+     {
+       if (e->events_frozen <= 0)
+         evas_object_event_callback_call(obj, EVAS_CALLBACK_HOLD, &ev);
+       if (e->delete_me) break;
+     }
+   if (copy) copy = eina_list_free(copy);
+   _evas_post_event_callback_call(e);
+   _evas_unwalk(e);
+   _evas_object_event_new();
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup Evas_Object_Group_Events
+ * @{
+ */
+
+/**
+ * Set an object's pass events state.
+ * @param obj the evas object
+ * @param pass whether to pass events or not
+ *
+ * If @p pass is true, this will cause events on @p obj to be ignored.
+ * They will be triggered on the next lower object (that is not set to
+ * pass events) instead.
+ *
+ * If @p pass is false, events will be processed as normal.
+ */
+EAPI void
+evas_object_pass_events_set(Evas_Object *obj, Eina_Bool pass)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   obj->pass_events = pass;
+   evas_object_smart_member_cache_invalidate(obj);
+   if (evas_object_is_in_output_rect(obj,
+                                    obj->layer->evas->pointer.x,
+                                    obj->layer->evas->pointer.y, 1, 1) &&
+       ((!obj->precise_is_inside) ||
+       (evas_object_is_inside(obj,
+                               obj->layer->evas->pointer.x,
+                               obj->layer->evas->pointer.y))))
+     evas_event_feed_mouse_move(obj->layer->evas,
+                               obj->layer->evas->pointer.x,
+                               obj->layer->evas->pointer.y,
+                               obj->layer->evas->last_timestamp,
+                               NULL);
+}
+
+/**
+ * Determine whether an object is set to pass events.
+ * @param obj
+ * @return pass events state
+ */
+EAPI Eina_Bool
+evas_object_pass_events_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   return obj->pass_events;
+}
+
+/**
+ * Set an object's repeat events state.
+ * @param obj the object
+ * @param repeat wheter to repeat events or not
+ *
+ * If @p repeat is true, this will cause events on @p obj to trigger
+ * callbacks, but also to be repeated on the next lower object in the
+ * stack.
+ *
+ * If @p repeat is false, events occuring on @p obj will be processed
+ * normally.
+ */
+EAPI void
+evas_object_repeat_events_set(Evas_Object *obj, Eina_Bool repeat)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   obj->repeat_events = repeat;
+   if (evas_object_is_in_output_rect(obj,
+                                    obj->layer->evas->pointer.x,
+                                    obj->layer->evas->pointer.y, 1, 1) &&
+       ((!obj->precise_is_inside) ||
+       (evas_object_is_inside(obj,
+                               obj->layer->evas->pointer.x,
+                               obj->layer->evas->pointer.y))))
+     evas_event_feed_mouse_move(obj->layer->evas,
+                               obj->layer->evas->pointer.x,
+                               obj->layer->evas->pointer.y,
+                               obj->layer->evas->last_timestamp,
+                               NULL);
+}
+
+/**
+ * Determine whether an object is set to repeat events.
+ * @param obj
+ * @return repeat events state
+ */
+EAPI Eina_Bool
+evas_object_repeat_events_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   return obj->repeat_events;
+}
+
+/**
+ * Set whether events on a smart member object should propagate to its
+ * parent.
+ *
+ * @param obj the smart member object
+ * @param prop wheter to propagate events or not
+ *
+ * This function has no effect if @p obj is not a member of a smart
+ * object.
+ *
+ * If @p prop is true, events occuring on this object will propagate on
+ * to the smart object of which @p obj is a member.
+ *
+ * If @p prop is false, events for which callbacks are set on the member
+ * object, @p obj, will not be passed on to the parent smart object.
+ *
+ * The default value is true.
+ */
+EAPI void
+evas_object_propagate_events_set(Evas_Object *obj, Eina_Bool prop)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   obj->no_propagate = !prop;
+}
+
+/**
+ * Determine whether an object is set to propagate events.
+ * @param obj
+ * @return propogate events state
+ */
+EAPI Eina_Bool
+evas_object_propagate_events_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   return !(obj->no_propagate);
+}
+
+/**
+ * @}
+ */
+
+/**
+ * Set pointer behavior.
+ *
+ * @param obj
+ * @param setting desired behavior.
+ *
+ * This function has direct effect on event callbacks related to
+ * mouse.
+ *
+ * If @p setting is EVAS_OBJECT_POINTER_MODE_AUTOGRAB, then when mouse
+ * is down at this object, events will be restricted to it as source,
+ * mouse moves, for example, will be emitted even if outside this
+ * object area.
+ *
+ * If @p setting is EVAS_OBJECT_POINTER_MODE_NOGRAB, then events will
+ * be emitted just when inside this object area.
+ *
+ * The default value is EVAS_OBJECT_POINTER_MODE_AUTOGRAB.
+ *
+ * @ingroup Evas_Object_Group_Extras
+ */
+EAPI void
+evas_object_pointer_mode_set(Evas_Object *obj, Evas_Object_Pointer_Mode setting)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   obj->pointer_mode = setting;
+}
+
+/**
+ * Determine how pointer will behave.
+ * @param obj
+ * @return pointer behavior.
+ * @ingroup Evas_Object_Group_Extras
+ */
+EAPI Evas_Object_Pointer_Mode
+evas_object_pointer_mode_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   return obj->pointer_mode;
+}
diff --git a/src/lib/canvas/evas_focus.c b/src/lib/canvas/evas_focus.c
new file mode 100644 (file)
index 0000000..d63219a
--- /dev/null
@@ -0,0 +1,111 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/* private calls */
+
+/* local calls */
+
+/* public calls */
+
+/**
+ * @addtogroup Evas_Object_Group_Basic
+ * @{
+ */
+/**
+ * Sets focus to the given object.
+ *
+ * @param obj The object to be focused or unfocused.
+ * @param focus set or remove focus to the object.
+ *
+ * Changing focus only affects where key events go.  There can be only
+ * one object focused at any time.  <p> If the parameter (@p focus) is
+ * set, the passed object will be set as the currently focused object.
+ * It will receive all keyboard events that are not exclusive key
+ * grabs on other objects.
+ *
+ * @see evas_object_focus_get
+ * @see evas_focus_get
+ * @see evas_object_key_grab
+ * @see evas_object_key_ungrab
+ */
+EAPI void
+evas_object_focus_set(Evas_Object *obj, Eina_Bool focus)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+
+   _evas_object_event_new();
+
+   if (focus)
+     {
+       if (obj->focused) goto end;
+       if (obj->layer->evas->focused)
+         evas_object_focus_set(obj->layer->evas->focused, 0);
+       obj->focused = 1;
+       obj->layer->evas->focused = obj;
+       evas_object_event_callback_call(obj, EVAS_CALLBACK_FOCUS_IN, NULL);
+     }
+   else
+     {
+       if (!obj->focused) goto end;
+       obj->focused = 0;
+       obj->layer->evas->focused = NULL;
+       evas_object_event_callback_call(obj, EVAS_CALLBACK_FOCUS_OUT, NULL);
+     }
+   end:
+   _evas_post_event_callback_call(obj->layer->evas);
+}
+
+/**
+ * Test if the object has focus.
+ *
+ * @param obj The object to be tested.
+ *
+ * If the passed object is the currently focused object 1 is returned,
+ * 0 otherwise.
+ *
+ * @see evas_object_focus_set
+ * @see evas_focus_get
+ * @see evas_object_key_grab
+ * @see evas_object_key_ungrab
+ *
+ * @return 1 if the object has the focus, 0 otherwise.
+ */
+EAPI Eina_Bool
+evas_object_focus_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   return obj->focused;
+}
+
+/**
+ * @}
+ */
+
+/**
+ * Retrieve the object that currently has focus.
+ *
+ * @param e The @c Evas canvas to query focus on.
+ *
+ * Returns the object that currently has focus, NULL otherwise.
+ *
+ * @see evas_object_focus_set
+ * @see evas_object_focus_get
+ * @see evas_object_key_grab
+ * @see evas_object_key_ungrab
+ *
+ * @return The object that has focus or NULL is there is not one.
+ *
+ * @ingroup Evas_Object_Group_Find
+ */
+EAPI Evas_Object *
+evas_focus_get(const Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   return e->focused;
+}
diff --git a/src/lib/canvas/evas_font_dir.c b/src/lib/canvas/evas_font_dir.c
new file mode 100644 (file)
index 0000000..43854bf
--- /dev/null
@@ -0,0 +1,913 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#ifdef BUILD_FONT_LOADER_EET
+#include <Eet.h>
+#endif
+
+#ifdef HAVE_FONTCONFIG
+#include <fontconfig/fontconfig.h>
+#endif
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+/* font dir cache */
+static Eina_Hash *font_dirs = NULL;
+static Eina_List *fonts_cache = NULL;
+static Eina_List *fonts_zero = NULL;
+
+typedef struct _Fndat Fndat;
+
+struct _Fndat
+{
+   const char *name;
+   const char *source;
+   int         size;
+   void       *font;
+   int         ref;
+
+#ifdef HAVE_FONTCONFIG
+   FcFontSet *set;
+   FcPattern *p_nm;
+#endif
+};
+
+/* private methods for font dir cache */
+static Eina_Bool font_cache_dir_free(const Eina_Hash *hash, const void *key, void *data, void *fdata);
+static Evas_Font_Dir *object_text_font_cache_dir_update(char *dir, Evas_Font_Dir *fd);
+static Evas_Font *object_text_font_cache_font_find_x(Evas_Font_Dir *fd, char *font);
+static Evas_Font *object_text_font_cache_font_find_file(Evas_Font_Dir *fd, char *font);
+static Evas_Font *object_text_font_cache_font_find_alias(Evas_Font_Dir *fd, char *font);
+static Evas_Font *object_text_font_cache_font_find(Evas_Font_Dir *fd, char *font);
+static Evas_Font_Dir *object_text_font_cache_dir_add(char *dir);
+static void object_text_font_cache_dir_del(char *dir, Evas_Font_Dir *fd);
+static int evas_object_text_font_string_parse(char *buffer, char dest[14][256]);
+
+#ifdef HAVE_FONTCONFIG
+static int fc_init = 0;
+#endif
+
+void
+evas_font_dir_cache_free(void)
+{
+   if (!font_dirs) return;
+
+   eina_hash_foreach(font_dirs, font_cache_dir_free, NULL);
+   eina_hash_free(font_dirs);
+   font_dirs = NULL;
+
+#ifdef HAVE_FONTCONFIG
+/* this is bad i got a:
+ * fccache.c:512: FcCacheFini: Assertion fcCacheChains[i] == ((void *)0)' failed.   
+ * 
+ * all i can do for now is shut this puppy down. butthat breaks, so disable
+ * it as in reality - there is little reason to care about the memory not
+ * being freed etc.
+ * 
+ *   fc_init--;
+ *   if (fc_init == 0) FcFini();
+ */
+#endif
+}
+
+const char *
+evas_font_dir_cache_find(char *dir, char *font)
+{
+   Evas_Font_Dir *fd = NULL;
+
+   if (!font_dirs) font_dirs = eina_hash_string_superfast_new(NULL);
+   else fd = eina_hash_find(font_dirs, dir);
+   fd = object_text_font_cache_dir_update(dir, fd);
+   if (fd)
+     {
+       Evas_Font *fn;
+
+       fn = object_text_font_cache_font_find(fd, font);
+       if (fn)
+         {
+            return fn->path;
+         }
+     }
+   return NULL;
+}
+
+static Eina_List *
+evas_font_set_get(const char *name)
+{
+   Eina_List *fonts = NULL;
+   char *p;
+
+   p = strchr(name, ',');
+   if (!p)
+     {
+       fonts = eina_list_append(fonts, eina_stringshare_add(name));
+     }
+   else
+     {
+       const char *pp;
+       char *nm;
+
+       pp = name;
+       while (p)
+         {
+            nm = alloca(p - pp + 1);
+            strncpy(nm, pp, p - pp);
+            nm[p - pp] = 0;
+            fonts = eina_list_append(fonts, eina_stringshare_add(nm));
+            pp = p + 1;
+            p = strchr(pp, ',');
+            if (!p) fonts = eina_list_append(fonts, eina_stringshare_add(pp));
+         }
+     }
+   return fonts;
+}
+
+void
+evas_fonts_zero_free(Evas *evas)
+{
+   Fndat *fd;
+
+   EINA_LIST_FREE(fonts_zero, fd)
+     {
+       if (fd->name) eina_stringshare_del(fd->name);
+       if (fd->source) eina_stringshare_del(fd->source);
+       evas->engine.func->font_free(evas->engine.data.output, fd->font);
+#ifdef HAVE_FONTCONFIG
+       if (fd->set) FcFontSetDestroy(fd->set);
+       if (fd->p_nm) FcPatternDestroy(fd->p_nm);
+#endif
+       free(fd);
+     }
+}
+
+void
+evas_fonts_zero_presure(Evas *evas)
+{
+   Fndat *fd;
+
+   while (fonts_zero
+         && eina_list_count(fonts_zero) > 4) /* 4 is arbitrary */
+     {
+       fd = eina_list_data_get(fonts_zero);
+
+       if (fd->ref != 0) break;
+       fonts_zero = eina_list_remove_list(fonts_zero, fonts_zero);
+
+       if (fd->name) eina_stringshare_del(fd->name);
+       if (fd->source) eina_stringshare_del(fd->source);
+       evas->engine.func->font_free(evas->engine.data.output, fd->font);
+#ifdef HAVE_FONTCONFIG
+       if (fd->set) FcFontSetDestroy(fd->set);
+       if (fd->p_nm) FcPatternDestroy(fd->p_nm);
+#endif
+       free(fd);
+
+       if (eina_list_count(fonts_zero) < 5) break;
+     }
+}
+
+void
+evas_font_free(Evas *evas, void *font)
+{
+   Eina_List *l;
+   Fndat *fd;
+
+   EINA_LIST_FOREACH(fonts_cache, l, fd)
+     {
+       if (fd->font == font)
+         {
+            fd->ref--;
+            if (fd->ref == 0)
+              {
+                 fonts_cache = eina_list_remove_list(fonts_cache, l);
+                 fonts_zero = eina_list_append(fonts_zero, fd);
+              }
+            break;
+         }
+     }
+   while (fonts_zero
+         && eina_list_count(fonts_zero) > 42) /* 42 is arbitrary */
+     {
+       fd = eina_list_data_get(fonts_zero);
+
+       if (fd->ref != 0) break;
+       fonts_zero = eina_list_remove_list(fonts_zero, fonts_zero);
+
+       if (fd->name) eina_stringshare_del(fd->name);
+       if (fd->source) eina_stringshare_del(fd->source);
+       evas->engine.func->font_free(evas->engine.data.output, fd->font);
+#ifdef HAVE_FONTCONFIG
+       if (fd->set) FcFontSetDestroy(fd->set);
+       if (fd->p_nm) FcPatternDestroy(fd->p_nm);
+#endif
+       free(fd);
+
+       if (eina_list_count(fonts_zero) < 43) break;
+     }
+}
+
+static void
+evas_font_init(void)
+{
+   static int done = 0;
+   if (done) return;
+   done = 1;
+#ifdef HAVE_FONTCONFIG
+   fc_init++;
+   if (fc_init == 1)
+     {
+        FcInit();
+        FcConfigEnableHome(1);
+     }
+#endif
+}
+
+#ifdef HAVE_FONTCONFIG
+static void *
+evas_load_fontconfig(Evas *evas, FcFontSet *set, int size)
+{
+   void *font = NULL;
+   int i;
+
+   /* Do loading for all in family */
+   for (i = 0; i < set->nfont; i++)
+     {
+       FcValue filename;
+
+       FcPatternGet(set->fonts[i], FC_FILE, 0, &filename);
+
+       if (font)
+         evas->engine.func->font_add(evas->engine.data.output, font, (char *)filename.u.s, size);
+       else
+         font = evas->engine.func->font_load(evas->engine.data.output, (char *)filename.u.s, size);
+     }
+
+   return font;
+}
+#endif
+
+void *
+evas_font_load(Evas *evas, const char *name, const char *source, int size)
+{
+#ifdef HAVE_FONTCONFIG
+   FcPattern *p_nm = NULL;
+   FcFontSet *set = NULL;
+#endif
+
+   void *font = NULL;
+   Eina_List *fonts, *l;
+   Fndat *fd;
+   char *nm;
+
+   if (!name) return NULL;
+   if (name[0] == 0) return NULL;
+
+   evas_font_init();
+
+   EINA_LIST_FOREACH(fonts_cache, l, fd)
+     {
+       if (!strcmp(name, fd->name))
+         {
+            if (((!source) && (!fd->source)) ||
+                ((source) && (fd->source) && (!strcmp(source, fd->source))))
+              {
+                 if (size == fd->size)
+                   {
+                      fonts_cache = eina_list_promote_list(fonts_cache, l);
+                      fd->ref++;
+                      return fd->font;
+                   }
+#ifdef HAVE_FONTCONFIG
+                 else if (fd->set && fd->p_nm)
+                   {
+                      font = evas_load_fontconfig(evas, fd->set, size);
+                      goto on_find;
+                   }
+#endif
+              }
+         }
+     }
+
+   EINA_LIST_FOREACH(fonts_zero, l, fd)
+     {
+       if (!strcmp(name, fd->name))
+         {
+            if (((!source) && (!fd->source)) ||
+                ((source) && (fd->source) && (!strcmp(source, fd->source))))
+              {
+                 if (size == fd->size)
+                   {
+                      fonts_zero = eina_list_remove_list(fonts_zero, l);
+                      fonts_cache = eina_list_prepend(fonts_cache, fd);
+                      fd->ref++;
+                      return fd->font;
+                   }
+#ifdef HAVE_FONTCONFIG
+                 else if (fd->set && fd->p_nm)
+                   {
+                      font = evas_load_fontconfig(evas, fd->set, size);
+                      goto on_find;
+                   }
+#endif
+              }
+         }
+     }
+   fonts = evas_font_set_get(name);
+   EINA_LIST_FOREACH(fonts, l, nm) /* Load each font in append */
+     {
+       if (l == fonts || !font) /* First iteration OR no font */
+         {
+#ifdef BUILD_FONT_LOADER_EET
+            if (source) /* Load Font from "eet" source */
+              {
+                 Eet_File *ef;
+                 char *fake_name;
+
+                 fake_name = evas_file_path_join(source, nm);
+                 if (fake_name)
+                   {
+                      font = evas->engine.func->font_load(evas->engine.data.output, fake_name, size);
+                      if (!font) /* Load from fake name failed, probably not cached */
+                        {
+                           /* read original!!! */
+                           ef = eet_open(source, EET_FILE_MODE_READ);
+                           if (ef)
+                             {
+                                void *fdata;
+                                int fsize = 0;
+
+                                fdata = eet_read(ef, nm, &fsize);
+                                if ((fdata) && (fsize > 0))
+                                  {
+                                     font = evas->engine.func->font_memory_load(evas->engine.data.output, fake_name, size, fdata, fsize);
+                                     free(fdata);
+                                  }
+                                eet_close(ef);
+                             }
+                        }
+                      free(fake_name);
+                   }
+              }
+            if (!font) /* Source load failed */
+              {
+#endif
+                 if (evas_file_path_is_full_path((char *)nm)) /* Try filename */
+                   font = evas->engine.func->font_load(evas->engine.data.output, (char *)nm, size);
+                 else /* search font path */
+                   {
+                      Eina_List *l;
+                      char *dir;
+
+                      EINA_LIST_FOREACH(evas->font_path, l, dir)
+                        {
+                           const char *f_file;
+
+                           f_file = evas_font_dir_cache_find(dir, (char *)nm);
+                           if (f_file)
+                             {
+                                font = evas->engine.func->font_load(evas->engine.data.output, f_file, size);
+                                if (font) break;
+                             }
+                        }
+                   }
+#ifdef BUILD_FONT_LOADER_EET
+              }
+#endif
+         }
+       else /* Base font loaded, append others */
+         {
+#ifdef BUILD_FONT_LOADER_EET
+            void *ok = NULL;
+
+            if (source)
+              {
+                 Eet_File *ef;
+                 char *fake_name;
+
+                 fake_name = evas_file_path_join(source, nm);
+                 if (fake_name)
+                   {
+                      /* FIXME: make an engine func */
+                      if (!evas->engine.func->font_add(evas->engine.data.output, font, fake_name, size))
+                        {
+                           /* read original!!! */
+                           ef = eet_open(source, EET_FILE_MODE_READ);
+                           if (ef)
+                             {
+                                void *fdata;
+                                int fsize = 0;
+
+                                fdata = eet_read(ef, nm, &fsize);
+                                if ((fdata) && (fsize > 0))
+                                  {
+                                     ok = evas->engine.func->font_memory_add(evas->engine.data.output, font, fake_name, size, fdata, fsize);
+                                     free(fdata);
+                                  }
+                                eet_close(ef);
+                             }
+                        }
+                      else
+                        ok = (void *)1;
+                      free(fake_name);
+                   }
+              }
+            if (!ok)
+              {
+#endif
+                 if (evas_file_path_is_full_path((char *)nm))
+                   evas->engine.func->font_add(evas->engine.data.output, font, (char *)nm, size);
+                 else
+                   {
+                      Eina_List *l;
+                      char *dir;
+
+                      EINA_LIST_FOREACH(evas->font_path, l, dir)
+                        {
+                           const char *f_file;
+
+                           f_file = evas_font_dir_cache_find(dir, (char *)nm);
+                           if (f_file)
+                             {
+                                if (evas->engine.func->font_add(evas->engine.data.output, font, f_file, size))
+                                  break;
+                             }
+                        }
+                   }
+#ifdef BUILD_FONT_LOADER_EET
+              }
+#endif
+         }
+       eina_stringshare_del(nm);
+     }
+   fonts = eina_list_free(fonts);
+
+#ifdef HAVE_FONTCONFIG
+   if (!font) /* Search using fontconfig */
+     {
+       FcResult res;
+
+       p_nm = FcNameParse((FcChar8 *)name);
+       FcConfigSubstitute(NULL, p_nm, FcMatchPattern);
+       FcDefaultSubstitute(p_nm);
+
+       /* do matching */
+       set = FcFontSort(NULL, p_nm, FcTrue, NULL, &res);
+       if (!set)
+         {
+            ERR("No fontconfig font matches '%s'. It was the last resource, no font found!", name);
+            FcPatternDestroy(p_nm);
+            p_nm = NULL;
+         }
+       else
+         font = evas_load_fontconfig(evas, set, size);
+     }
+#endif
+
+ on_find:
+   fd = calloc(1, sizeof(Fndat));
+   if (fd)
+     {
+       fd->name = eina_stringshare_add(name);
+       if (source) fd->source = eina_stringshare_add(source);
+       fd->size = size;
+       fd->font = font;
+       fd->ref = 1;
+       fonts_cache = eina_list_prepend(fonts_cache, fd);
+#ifdef HAVE_FONTCONFIG
+       fd->set = set;
+       fd->p_nm = p_nm;
+#endif
+     }
+
+   if (font)
+     evas->engine.func->font_hinting_set(evas->engine.data.output, font,
+                                        evas->hinting);
+   return font;
+}
+
+void
+evas_font_load_hinting_set(Evas *evas, void *font, int hinting)
+{
+   evas->engine.func->font_hinting_set(evas->engine.data.output, font,
+                                      hinting);
+}
+
+Eina_List *
+evas_font_dir_available_list(const Evas *evas)
+{
+   Eina_List *l;
+   Eina_List *ll;
+   Eina_List *available = NULL;
+   char *dir;
+
+#ifdef HAVE_FONTCONFIG
+   /* Add font config fonts */
+   FcPattern *p;
+   FcFontSet *set = NULL;
+   FcObjectSet *os;
+   int i;
+
+   evas_font_init();
+
+   p = FcPatternCreate();
+   os = FcObjectSetBuild(FC_FAMILY, FC_STYLE, NULL);
+
+   if (p && os) set = FcFontList(NULL, p, os);
+
+   if (p) FcPatternDestroy(p);
+   if (os) FcObjectSetDestroy(os);
+
+   if (set)
+     {
+       for (i = 0; i < set->nfont; i++)
+         {
+            char *font;
+
+            font = (char *)FcNameUnparse(set->fonts[i]);
+            available = eina_list_append(available, eina_stringshare_add(font));
+            free(font);
+         }
+
+       FcFontSetDestroy(set);
+     }
+#endif
+
+   /* Add fonts in evas font_path*/
+   if (!evas->font_path)
+     return available;
+
+   if (!font_dirs) font_dirs = eina_hash_string_superfast_new(NULL);
+
+   EINA_LIST_FOREACH(evas->font_path, l, dir)
+     {
+       Evas_Font_Dir *fd;
+
+       fd = eina_hash_find(font_dirs, dir);
+       fd = object_text_font_cache_dir_update(dir, fd);
+       if (fd && fd->aliases)
+         {
+            Evas_Font_Alias *fa;
+
+            EINA_LIST_FOREACH(fd->aliases, ll, fa)
+              available = eina_list_append(available, eina_stringshare_add((char *)fa->alias));
+         }
+     }
+
+   return available;
+}
+
+void
+evas_font_dir_available_list_free(Eina_List *available)
+{
+   while (available)
+     {
+       eina_stringshare_del(available->data);
+       available = eina_list_remove(available, available->data);
+     }
+}
+
+/* private stuff */
+static Eina_Bool
+font_cache_dir_free(const Eina_Hash *hash __UNUSED__, const void *key, void *data, void *fdata __UNUSED__)
+{
+   object_text_font_cache_dir_del((char *) key, data);
+   return 1;
+}
+
+static Evas_Font_Dir *
+object_text_font_cache_dir_update(char *dir, Evas_Font_Dir *fd)
+{
+   DATA64 mt;
+   char *tmp;
+
+   if (fd)
+     {
+       mt = evas_file_modified_time(dir);
+       if (mt != fd->dir_mod_time)
+         {
+            object_text_font_cache_dir_del(dir, fd);
+            eina_hash_del(font_dirs, dir, fd);
+         }
+       else
+         {
+            tmp = evas_file_path_join(dir, "fonts.dir");
+            if (tmp)
+              {
+                 mt = evas_file_modified_time(tmp);
+                 free(tmp);
+                 if (mt != fd->fonts_dir_mod_time)
+                   {
+                      object_text_font_cache_dir_del(dir, fd);
+                      eina_hash_del(font_dirs, dir, fd);
+                   }
+                 else
+                   {
+                      tmp = evas_file_path_join(dir, "fonts.alias");
+                      if (tmp)
+                        {
+                           mt = evas_file_modified_time(tmp);
+                           free(tmp);
+                        }
+                      if (mt != fd->fonts_alias_mod_time)
+                        {
+                           object_text_font_cache_dir_del(dir, fd);
+                           eina_hash_del(font_dirs, dir, fd);
+                        }
+                      else
+                        return fd;
+                   }
+              }
+         }
+     }
+   return object_text_font_cache_dir_add(dir);
+}
+
+static Evas_Font *
+object_text_font_cache_font_find_x(Evas_Font_Dir *fd, char *font)
+{
+   Eina_List *l;
+   char font_prop[14][256];
+   int num;
+   Evas_Font *fn;
+
+   num = evas_object_text_font_string_parse(font, font_prop);
+   if (num != 14) return NULL;
+   EINA_LIST_FOREACH(fd->fonts, l, fn)
+     {
+       if (fn->type == 1)
+         {
+            int i;
+            int match = 0;
+
+            for (i = 0; i < 14; i++)
+              {
+                 if ((font_prop[i][0] == '*') && (font_prop[i][1] == 0))
+                   match++;
+                 else
+                   {
+                      if (!strcasecmp(font_prop[i], fn->x.prop[i])) match++;
+                      else break;
+                   }
+              }
+            if (match == 14) return fn;
+         }
+     }
+   return NULL;
+}
+
+static Evas_Font *
+object_text_font_cache_font_find_file(Evas_Font_Dir *fd, char *font)
+{
+   Eina_List *l;
+   Evas_Font *fn;
+
+   EINA_LIST_FOREACH(fd->fonts, l, fn)
+     {
+       if (fn->type == 0)
+         {
+            if (!strcasecmp(font, fn->simple.name)) return fn;
+         }
+     }
+   return NULL;
+}
+
+static Evas_Font *
+object_text_font_cache_font_find_alias(Evas_Font_Dir *fd, char *font)
+{
+   Eina_List *l;
+   Evas_Font_Alias *fa;
+
+   EINA_LIST_FOREACH(fd->aliases, l, fa)
+     if (!strcasecmp(fa->alias, font)) return fa->fn;
+   return NULL;
+}
+
+static Evas_Font *
+object_text_font_cache_font_find(Evas_Font_Dir *fd, char *font)
+{
+   Evas_Font *fn;
+
+   fn = eina_hash_find(fd->lookup, font);
+   if (fn) return fn;
+   fn = object_text_font_cache_font_find_alias(fd, font);
+   if (!fn) fn = object_text_font_cache_font_find_x(fd, font);
+   if (!fn) fn = object_text_font_cache_font_find_file(fd, font);
+   if (!fn) return NULL;
+   eina_hash_add(fd->lookup, font, fn);
+   return fn;
+}
+
+static Evas_Font_Dir *
+object_text_font_cache_dir_add(char *dir)
+{
+   Evas_Font_Dir *fd;
+   char *tmp, *tmp2;
+   Eina_List *fdir;
+   Evas_Font *fn;
+
+   fd = calloc(1, sizeof(Evas_Font_Dir));
+   if (!fd) return NULL;
+   fd->lookup = eina_hash_string_superfast_new(NULL);
+
+   eina_hash_add(font_dirs, dir, fd);
+
+   /* READ fonts.alias, fonts.dir and directory listing */
+
+   /* fonts.dir */
+   tmp = evas_file_path_join(dir, "fonts.dir");
+   if (tmp)
+     {
+       FILE *f;
+
+       f = fopen(tmp, "rb");
+       if (f)
+         {
+            int num;
+            char fname[4096], fdef[4096];
+
+            if (fscanf(f, "%i\n", &num) != 1) goto cant_read;
+            /* read font lines */
+            while (fscanf(f, "%4090s %[^\n]\n", fname, fdef) == 2)
+              {
+                 char font_prop[14][256];
+                 int i;
+
+                 /* skip comments */
+                 if ((fdef[0] == '!') || (fdef[0] == '#')) continue;
+                 /* parse font def */
+                 num = evas_object_text_font_string_parse((char *)fdef, font_prop);
+                 if (num == 14)
+                   {
+                      fn = calloc(1, sizeof(Evas_Font));
+                      if (fn)
+                        {
+                           fn->type = 1;
+                           for (i = 0; i < 14; i++)
+                             fn->x.prop[i] = eina_stringshare_add(font_prop[i]);
+                           tmp2 = evas_file_path_join(dir, fname);
+                           if (tmp2)
+                             {
+                                fn->path = eina_stringshare_add(tmp2);
+                                free(tmp2);
+                             }
+                           fd->fonts = eina_list_append(fd->fonts, fn);
+                        }
+                   }
+              }
+            cant_read: ;
+            fclose(f);
+         }
+       free(tmp);
+     }
+
+   /* directoy listing */
+   fdir = evas_file_path_list(dir, "*.ttf", 0);
+   while (fdir)
+     {
+       tmp = evas_file_path_join(dir, fdir->data);
+       if (tmp)
+         {
+            fn = calloc(1, sizeof(Evas_Font));
+            if (fn)
+              {
+                 char *p;
+
+                 fn->type = 0;
+                 tmp2 = alloca(strlen(fdir->data) + 1);
+                 strcpy(tmp2, fdir->data);
+                 p = strrchr(tmp2, '.');
+                 if (p) *p = 0;
+                 fn->simple.name = eina_stringshare_add(tmp2);
+                 tmp2 = evas_file_path_join(dir, fdir->data);
+                 if (tmp2)
+                   {
+                      fn->path = eina_stringshare_add(tmp2);
+                      free(tmp2);
+                   }
+                 fd->fonts = eina_list_append(fd->fonts, fn);
+              }
+            free(tmp);
+         }
+       free(fdir->data);
+       fdir = eina_list_remove(fdir, fdir->data);
+     }
+
+   /* fonts.alias */
+   tmp = evas_file_path_join(dir, "fonts.alias");
+   if (tmp)
+     {
+       FILE *f;
+
+       f = fopen(tmp, "rb");
+       if (f)
+         {
+            char fname[4096], fdef[4096];
+
+            /* read font alias lines */
+            while (fscanf(f, "%4090s %[^\n]\n", fname, fdef) == 2)
+              {
+                 Evas_Font_Alias *fa;
+
+                 /* skip comments */
+                 if ((fname[0] == '!') || (fname[0] == '#')) continue;
+                 fa = calloc(1, sizeof(Evas_Font_Alias));
+                 if (fa)
+                   {
+                      fa->alias = eina_stringshare_add(fname);
+                      fa->fn = object_text_font_cache_font_find_x(fd, fdef);
+                      if ((!fa->alias) || (!fa->fn))
+                        {
+                           if (fa->alias) eina_stringshare_del(fa->alias);
+                           free(fa);
+                        }
+                      else
+                        fd->aliases = eina_list_append(fd->aliases, fa);
+                   }
+              }
+            fclose(f);
+         }
+       free(tmp);
+     }
+
+   fd->dir_mod_time = evas_file_modified_time(dir);
+   tmp = evas_file_path_join(dir, "fonts.dir");
+   if (tmp)
+     {
+       fd->fonts_dir_mod_time = evas_file_modified_time(tmp);
+       free(tmp);
+     }
+   tmp = evas_file_path_join(dir, "fonts.alias");
+   if (tmp)
+     {
+       fd->fonts_alias_mod_time = evas_file_modified_time(tmp);
+       free(tmp);
+     }
+
+   return fd;
+}
+
+static void
+object_text_font_cache_dir_del(char *dir __UNUSED__, Evas_Font_Dir *fd)
+{
+   if (fd->lookup) eina_hash_free(fd->lookup);
+   while (fd->fonts)
+     {
+       Evas_Font *fn;
+       int i;
+
+       fn = fd->fonts->data;
+       fd->fonts = eina_list_remove(fd->fonts, fn);
+       for (i = 0; i < 14; i++)
+         {
+            if (fn->x.prop[i]) eina_stringshare_del(fn->x.prop[i]);
+         }
+       if (fn->simple.name) eina_stringshare_del(fn->simple.name);
+       if (fn->path) eina_stringshare_del(fn->path);
+       free(fn);
+     }
+   while (fd->aliases)
+     {
+       Evas_Font_Alias *fa;
+
+       fa = fd->aliases->data;
+       fd->aliases = eina_list_remove(fd->aliases, fa);
+       if (fa->alias) eina_stringshare_del(fa->alias);
+       free(fa);
+     }
+   free(fd);
+}
+
+static int
+evas_object_text_font_string_parse(char *buffer, char dest[14][256])
+{
+   char *p;
+   int n, m, i;
+
+   n = 0;
+   m = 0;
+   p = buffer;
+   if (p[0] != '-') return 0;
+   i = 1;
+   while (p[i])
+     {
+       dest[n][m] = p[i];
+       if ((p[i] == '-') || (m == 256))
+         {
+            dest[n][m] = 0;
+            n++;
+            m = -1;
+         }
+       i++;
+       m++;
+       if (n == 14) return n;
+     }
+   dest[n][m] = 0;
+   n++;
+   return n;
+}
diff --git a/src/lib/canvas/evas_key.c b/src/lib/canvas/evas_key.c
new file mode 100644 (file)
index 0000000..7723960
--- /dev/null
@@ -0,0 +1,418 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/* private calls */
+
+static int
+evas_key_modifier_number(const Evas_Modifier *m, const char *keyname)
+{
+   int i;
+
+   for (i = 0; i < m->mod.count; i++)
+     {
+       if (!strcmp(m->mod.list[i], keyname)) return i;
+     }
+   return -1;
+}
+
+static int
+evas_key_lock_number(const Evas_Lock *l, const char *keyname)
+{
+   int i;
+
+   for (i = 0; i < l->lock.count; i++)
+     {
+       if (!strcmp(l->lock.list[i], keyname)) return i;
+     }
+   return -1;
+}
+
+/* local calls */
+
+/* public calls */
+
+/**
+ * Returns a handle to the modifiers available in the system.  This is required to check
+ * for modifiers with the evas_key_modifier_is_set function.
+ *
+ *
+ * @see evas_key_modifier_add
+ * @see evas_key_modifier_del
+ * @see evas_key_modifier_on
+ * @see evas_key_modifier_off
+ * @see evas_key_modifier_is_set
+ *
+ * @param e The pointer to the Evas Canvas
+ *
+ * @return An Evas_Modifier handle to query the modifier subsystem with
+ *     evas_key_modifier_is_set, or NULL on error.
+ */
+EAPI const Evas_Modifier *
+evas_key_modifier_get(const Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   return &(e->modifiers);
+}
+
+/**
+ * Returns a handle to the locks available in the system.  This is required to check for
+ * locks with the evas_key_lock_is_set function.
+ *
+ * @see evas_key_lock_add
+ * @see evas_key_lock_del
+ * @see evas_key_lock_on
+ * @see evas_key_lock_off
+ *
+ * @see evas_key_lock_is_set
+ * @param e The pointer to the Evas Canvas
+ *
+ * @return An Evas_Lock handle to query the lock subsystem with
+ *     evas_key_lock_is_set, or NULL on error.
+ */
+EAPI const Evas_Lock *
+evas_key_lock_get(const Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   return &(e->locks);
+}
+
+/**
+ * Checks the state of a given modifier.  If the modifier is set, such as shift being pressed
+ * this function returns true.
+ *
+ * @see evas_key_modifier_add
+ * @see evas_key_modifier_del
+ * @see evas_key_modifier_get
+ * @see evas_key_modifier_on
+ * @see evas_key_modifier_off
+ *
+ * @param m The current modifier set as returned by evas_key_modifier_get.
+ * @param keyname The name of the key to check its status.
+ *
+ * @return 1 if the @p keyname is on, 0 otherwise.
+ */
+EAPI Eina_Bool
+evas_key_modifier_is_set(const Evas_Modifier *m, const char *keyname)
+{
+   Evas_Modifier_Mask num;
+   int n;
+
+   if (!m) return 0;
+   if (!keyname) return 0;
+   n = evas_key_modifier_number(m, keyname);
+   if (n < 0) return 0;
+   num = (Evas_Modifier_Mask)n;
+   num = 1 << num;
+   if (m->mask & num) return 1;
+   return 0;
+}
+
+/**
+ * Checks the state of a given lock.  If the lock is set, such as caps lock, this function
+ * returns true.
+ *
+ * @see evas_key_lock_get
+ * @see evas_key_lock_add
+ * @see evas_key_lock_del
+ * @see evas_key_lock_on
+ * @see evas_key_lock_off
+ *
+ * @param l The current lock set as returned by evas_key_lock_get.
+ * @param keyname The name of the lock to add the the list.
+ *
+ * @param 1 if the @p keyname kock is set, 0 otherwise.
+ */
+EAPI Eina_Bool
+evas_key_lock_is_set(const Evas_Lock *l, const char *keyname)
+{
+   Evas_Modifier_Mask num;
+   int n;
+
+   if (!l) return 0;
+   if (!keyname) return 0;
+   n = evas_key_lock_number(l, keyname);
+   if (n < 0) return 0;
+   num = (Evas_Modifier_Mask)n;
+   num = 1 << num;
+   if (l->mask & num) return 1;
+   return 0;
+}
+
+/**
+ * Adds the @p keyname to the current list of modifiers.
+ *
+ * Modifiers can be keys like shift, alt and ctrl, as well as user defined.  This allows
+ * custom modifiers to be added to the evas system as run time.  It is then possible to set
+ * and unset the modifier for other parts of the program to check and act on.
+ *
+ * @see evas_key_modifier_del
+ * @see evas_key_modifier_get
+ * @see evas_key_modifier_on
+ * @see evas_key_modifier_off
+ * @see evas_key_modifier_is_set
+ *
+ * @param e The pointer to the Evas Canvas
+ * @param keyname The name of the modifier to add to the list.
+ */
+EAPI void
+evas_key_modifier_add(Evas *e, const char *keyname)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   if (!keyname) return;
+   if (e->modifiers.mod.count >= 64) return;
+   evas_key_modifier_del(e, keyname);
+   e->modifiers.mod.count++;
+   e->modifiers.mod.list = realloc(e->modifiers.mod.list, e->modifiers.mod.count * sizeof(char *));
+   e->modifiers.mod.list[e->modifiers.mod.count - 1] = strdup(keyname);
+   e->modifiers.mask = 0;
+}
+
+/**
+ * Removes the @p keyname from the current list of modifiers.
+ *
+ * @see evas_key_modifier_add
+ * @see evas_key_modifier_get
+ * @see evas_key_modifier_on
+ * @see evas_key_modifier_off
+ * @see evas_key_modifier_is_set
+ *
+ * @param e The pointer to the Evas Canvas
+ * @param keyname The name of the key to remove from the modifiers list.
+ */
+EAPI void
+evas_key_modifier_del(Evas *e, const char *keyname)
+{
+   int i;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   if (!keyname) return;
+   for (i = 0; i < e->modifiers.mod.count; i++)
+     {
+       if (!strcmp(e->modifiers.mod.list[i], keyname))
+         {
+            int j;
+
+            free(e->modifiers.mod.list[i]);
+            e->modifiers.mod.count--;
+            for (j = i; j < e->modifiers.mod.count; j++)
+              e->modifiers.mod.list[j] = e->modifiers.mod.list[j + 1];
+            e->modifiers.mask = 0;
+            return;
+         }
+     }
+}
+
+/**
+ * Adds the @p keyname to the current list of locks.
+ *
+ * Locks can be keys like caps lock, num lock or scroll lock, as well as user defined.  This
+ * allows custom locks to be added to the evas system at run time.  It is then possible to
+ * set and unset the lock for other parts of the program to check and act on.
+ *
+ * @see evas_key_lock_get
+ * @see evas_key_lock_del
+ * @see evas_key_lock_on
+ * @see evas_key_lock_off
+ *
+ * @param e The pointer to the Evas Canvas
+ * @param keyname The name of the key to remove from the modifier list.
+ */
+EAPI void
+evas_key_lock_add(Evas *e, const char *keyname)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   if (!keyname) return;
+   if (e->locks.lock.count >= 64) return;
+   evas_key_lock_del(e, keyname);
+   e->locks.lock.count++;
+   e->locks.lock.list = realloc(e->locks.lock.list, e->locks.lock.count * sizeof(char *));
+   e->locks.lock.list[e->locks.lock.count - 1] = strdup(keyname);
+   e->locks.mask = 0;
+}
+
+/**
+ * Removes The @p keyname from the current list of locks.
+ *
+ * @see evas_key_lock_get
+ * @see evas_key_lock_add
+ * @see evas_key_lock_on
+ * @see evas_key_lock_off
+ *
+ * @param e The pointer to the Evas Canvas
+ * @param keyname The name of the key to remove from the lock list.
+ */
+EAPI void
+evas_key_lock_del(Evas *e, const char *keyname)
+{
+   int i;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   if (!keyname) return;
+   e->locks.mask = 0;
+   for (i = 0; i < e->locks.lock.count; i++)
+     {
+       if (!strcmp(e->locks.lock.list[i], keyname))
+         {
+            int j;
+
+            free(e->locks.lock.list[i]);
+            e->locks.lock.count--;
+            for (j = i; j < e->locks.lock.count; j++)
+              e->locks.lock.list[j] = e->locks.lock.list[j + 1];
+            e->locks.mask = 0;
+            return;
+         }
+     }
+}
+
+/**
+ * Enables or turns on the modifier with name @p keyname.
+ *
+ * @see evas_key_modifier_add
+ * @see evas_key_modifier_get
+ * @see evas_key_modifier_off
+ * @see evas_key_modifier_is_set
+ *
+ * @param e The pointer to the Evas Canvas
+ * @param keyname The name of the modifier to set.
+ */
+EAPI void
+evas_key_modifier_on(Evas *e, const char *keyname)
+{
+   Evas_Modifier_Mask num;
+   int n;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   n = (Evas_Modifier_Mask)evas_key_modifier_number(&(e->modifiers), keyname);
+   if (n < 0) return;
+   num = (Evas_Modifier_Mask)n;
+   num = 1 << num;
+   e->modifiers.mask |= num;
+}
+
+/**
+ * Disables or turns off the modifier with name @p keyname.
+ *
+ * @see evas_key_modifier_add
+ * @see evas_key_modifier_get
+ * @see evas_key_modifier_on
+ * @see evas_key_modifier_is_set
+ *
+ * @param e The pointer to the Evas Canvas
+ * @param keyname The name of the modifier to un-set.
+ */
+EAPI void
+evas_key_modifier_off(Evas *e, const char *keyname)
+{
+   Evas_Modifier_Mask num;
+   int n;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   n = evas_key_modifier_number(&(e->modifiers), keyname);
+   if (n < 0) return;
+   num = (Evas_Modifier_Mask)n;
+   num = 1 << num;
+   e->modifiers.mask &= ~num;
+}
+
+/**
+ * Enables or turns on the lock with name @p keyname.
+ *
+ * @see evas_key_lock_get
+ * @see evas_key_lock_add
+ * @see evas_key_lock_del
+ * @see evas_key_lock_off
+ *
+ * @param e The pointer to the Evas Canvas
+ * @param keyname The name of the lock to set.
+ */
+EAPI void
+evas_key_lock_on(Evas *e, const char *keyname)
+{
+   Evas_Modifier_Mask num;
+   int n;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   n = evas_key_lock_number(&(e->locks), keyname);
+   if (n < 0) return;
+   num = (Evas_Modifier_Mask)n;
+   num = 1 << num;
+   e->locks.mask |= num;
+}
+
+/**
+ * Disables or turns off the lock with name @p keyname.
+ *
+ * @see evas_key_lock_get
+ * @see evas_key_lock_add
+ * @see evas_key_lock_del
+ * @see evas_key_lock_on
+ *
+ * @param e The pointer to the Evas Canvas
+ * @param keyname The name of the lock to un-set.
+ */
+EAPI void
+evas_key_lock_off(Evas *e, const char *keyname)
+{
+   Evas_Modifier_Mask num;
+   int n;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   n = evas_key_lock_number(&(e->locks), keyname);
+   if (n < 0) return;
+   num = (Evas_Modifier_Mask)n;
+   num = 1 << num;
+   e->locks.mask &= ~num;
+}
+
+/* errr need to add key grabbing/ungrabbing calls - missing modifier stuff. */
+
+/**
+ * Creates a bit mask from the @p keyname for use with events to check for the presence
+ * of the @p keyname modifier.
+ *
+ * @see evas_key_modifier_add
+ * @see evas_key_modifier_get
+ * @see evas_key_modifier_on
+ * @see evas_key_modifier_off
+ * @see evas_key_modifier_is_set
+ *
+ * @param keyname The name of the modifier to create the mask for.
+ *
+ * @returns the bit mask or 0 if the @p keyname wasn't registered as a modifier.
+ */
+EAPI Evas_Modifier_Mask
+evas_key_modifier_mask_get(const Evas *e, const char *keyname)
+{
+   Evas_Modifier_Mask num;
+   int n;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return 0;
+   MAGIC_CHECK_END();
+   if (!keyname) return 0;
+   n = evas_key_modifier_number(&(e->modifiers), keyname);
+   if (n < 0) return 0;
+   num = (Evas_Modifier_Mask)n;
+   return 1 << num;
+}
diff --git a/src/lib/canvas/evas_key_grab.c b/src/lib/canvas/evas_key_grab.c
new file mode 100644 (file)
index 0000000..a8e8979
--- /dev/null
@@ -0,0 +1,238 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/* private calls */
+
+/* FIXME: this is not optimal, but works. i should have a hash of keys per */
+/* Evas and then a linked lists of grabs for that key and what */
+/* modifiers/not_modifers they use */
+
+static Evas_Key_Grab *evas_key_grab_new  (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive);
+static Evas_Key_Grab *evas_key_grab_find (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive);
+
+static Evas_Key_Grab *
+evas_key_grab_new(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive)
+{
+   /* MEM OK */
+   Evas_Key_Grab *g;
+
+   g = evas_mem_calloc(sizeof(Evas_Key_Grab));
+   if (!g) return NULL;
+   g->object = obj;
+   g->modifiers = modifiers;
+   g->not_modifiers = not_modifiers;
+   g->exclusive = exclusive;
+   g->keyname = strdup(keyname);
+   if (obj->layer->evas->walking_grabs)
+     g->just_added = 1;
+   if (!g->keyname)
+     {
+       if (!evas_mem_free(strlen(keyname) + 1))
+         {
+            free(g);
+            return NULL;
+         }
+       g->keyname = strdup(keyname);
+       if (!g->keyname)
+         {
+            free(g);
+            return NULL;
+         }
+     }
+   g->object->grabs = eina_list_append(g->object->grabs, g);
+   if (eina_error_get())
+     {
+       MERR_BAD();
+       evas_mem_free(sizeof(Eina_List));
+       g->object->grabs = eina_list_append(g->object->grabs, g);
+       if (eina_error_get())
+         {
+            MERR_FATAL();
+            free(g);
+            free(g->keyname);
+            return NULL;
+         }
+     }
+   obj->layer->evas->grabs = eina_list_append(obj->layer->evas->grabs, g);
+   if (eina_error_get())
+     {
+       MERR_BAD();
+       evas_mem_free(sizeof(Eina_List));
+       obj->layer->evas->grabs = eina_list_append(obj->layer->evas->grabs, g);
+       if (eina_error_get())
+         {
+            MERR_FATAL();
+            g->object->grabs = eina_list_remove(g->object->grabs, g);
+            free(g);
+            free(g->keyname);
+            return NULL;
+         }
+     }
+   return g;
+}
+
+static Evas_Key_Grab *
+evas_key_grab_find(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive)
+{
+   /* MEM OK */
+   Eina_List *l;
+   Evas_Key_Grab *g;
+
+   EINA_LIST_FOREACH(obj->layer->evas->grabs, l, g)
+     {
+       if ((g->modifiers == modifiers) &&
+           (g->not_modifiers == not_modifiers) &&
+           (!strcmp(g->keyname, keyname)))
+         {
+            if ((exclusive) ||  (obj == g->object)) return g;
+         }
+     }
+   return NULL;
+}
+
+/* local calls */
+
+void
+evas_object_grabs_cleanup(Evas_Object *obj)
+{
+   if (obj->layer->evas->walking_grabs)
+     {
+       Eina_List *l;
+       Evas_Key_Grab *g;
+
+       EINA_LIST_FOREACH(obj->grabs, l, g)
+         g->delete_me = 1;
+     }
+   else
+     {
+       while (obj->grabs)
+         {
+            Evas_Key_Grab *g;
+
+            g = obj->grabs->data;
+            if (g->keyname) free(g->keyname);
+            free(g);
+            obj->layer->evas->grabs = eina_list_remove(obj->layer->evas->grabs, g);
+            obj->grabs = eina_list_remove(obj->grabs, g);
+         }
+     }
+}
+
+void
+evas_key_grab_free(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers)
+{
+   /* MEM OK */
+   Evas_Key_Grab *g;
+
+   g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers, 0);
+   if (!g) return;
+   g->object->grabs = eina_list_remove(g->object->grabs, g);
+   obj->layer->evas->grabs = eina_list_remove(obj->layer->evas->grabs, g);
+   if (g->keyname) free(g->keyname);
+   free(g);
+}
+
+/* public calls */
+
+/**
+ * Requests @p keyname key events be directed to @p obj.
+ *
+ * Key grabs allow an object to receive key events for specific key
+ * strokes even if another object has focus.  If the grab is
+ * non-exclusive then all objects that have grabs on the key will get
+ * the event, however if the grab is exclusive, no other object can
+ * get a grab on the key and only that object will get the event.
+ *
+ * @p keyname is a platform dependent symbolic name for the key
+ * pressed.  It is sometimes possible to convert the string to an
+ * ASCII value of the key, but not always for example the enter key
+ * may be returned as the string 'Enter'.
+ *
+ * Typical platforms are Linux frame buffer (Ecore_FB) and X server
+ * (Ecore_X) when using Evas with Ecore and Ecore_Evas.
+ *
+ * For a list of keynames for the Linux frame buffer, please refer to
+ * the Ecore_FB documentation.
+ *
+ * @p modifiers and @p not_modifiers are bit masks of all the
+ * modifiers that are required and not required respectively for the
+ * new grab.  Modifiers can be things such as shift and ctrl as well
+ * as user defigned types via evas_key_modifier_add.
+ *
+ * @see evas_object_key_ungrab
+ * @see evas_object_focus_set
+ * @see evas_object_focus_get
+ * @see evas_focus_get
+ * @see evas_key_modifier_add
+ *
+ * @param obj the object to direct @p keyname events to.
+ * @param keyname the key to request events for.
+ * @param modifiers a mask of modifiers that should be present to
+ * trigger the event.
+ * @param not_modifiers a mask of modifiers that should not be present
+ * to trigger the event.
+ * @param exclusive request that the @p obj is the only object
+ * receiving the @p keyname events.
+ * @return Boolean indicating whether the grab succeeded
+ */
+EAPI Eina_Bool
+evas_object_key_grab(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, Eina_Bool exclusive)
+{
+   /* MEM OK */
+   Evas_Key_Grab *g;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   if (!keyname) return 0;
+   if (exclusive)
+     {
+       g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers, exclusive);
+       if (g) return 0;
+     }
+   g = evas_key_grab_new(obj, keyname, modifiers, not_modifiers, exclusive);
+   if (!g) return 0;
+   return 1;
+}
+
+/**
+ * Request that the grab on @p obj be removed.
+ *
+ * Removes the grab on @p obj if @p keyname, @p modifiers, and @p not_modifiers
+ * match.
+ *
+ * @see evas_object_key_grab
+ * @see evas_object_focus_set
+ * @see evas_object_focus_get
+ * @see evas_focus_get
+ *
+ * @param obj the object that has an existing grab.
+ * @param keyname the key the grab is for.
+ * @param modifiers a mask of modifiers that should be present to
+ * trigger the event.
+ * @param not_modifiers a mask of modifiers that should not be present
+ * to trigger the event.
+ */
+EAPI void
+evas_object_key_ungrab(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers)
+{
+   /* MEM OK */
+   Evas_Key_Grab *g;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!keyname) return;
+   g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers, 0);
+   if (!g) return;
+   if (g->object->layer->evas->walking_grabs)
+     {
+       if (!g->delete_me)
+         {
+            g->object->layer->evas->delete_grabs++;
+            g->delete_me = 1;
+         }
+     }
+   else
+     evas_key_grab_free(g->object, keyname, modifiers, not_modifiers);
+}
diff --git a/src/lib/canvas/evas_layer.c b/src/lib/canvas/evas_layer.c
new file mode 100644 (file)
index 0000000..a3e5f5b
--- /dev/null
@@ -0,0 +1,220 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+static void _evas_layer_free(Evas_Layer *lay);
+
+void
+evas_object_inject(Evas_Object *obj, Evas *e)
+{
+   Evas_Layer *lay;
+
+   if (obj->in_layer) return;
+   lay = evas_layer_find(e, obj->cur.layer);
+   if (!lay)
+     {
+       lay = evas_layer_new(e);
+       lay->layer = obj->cur.layer;
+       evas_layer_add(lay);
+     }
+   lay->objects = (Evas_Object *)eina_inlist_append(EINA_INLIST_GET(lay->objects), EINA_INLIST_GET(obj));
+   lay->usage++;
+   obj->layer = lay;
+   obj->in_layer = 1;
+}
+
+void
+evas_object_release(Evas_Object *obj, int clean_layer)
+{
+   if (!obj->in_layer) return;
+   obj->layer->objects = (Evas_Object *)eina_inlist_remove(EINA_INLIST_GET(obj->layer->objects), EINA_INLIST_GET(obj));
+   obj->layer->usage--;
+   if (clean_layer)
+     {
+       if (obj->layer->usage <= 0)
+         {
+            evas_layer_del(obj->layer);
+            _evas_layer_free(obj->layer);
+         }
+     }
+   obj->layer = NULL;
+   obj->in_layer = 0;
+}
+
+Evas_Layer *
+evas_layer_new(Evas *e)
+{
+   Evas_Layer *lay;
+
+   lay = calloc(1, sizeof(Evas_Layer));
+   if (!lay) return NULL;
+   lay->evas = e;
+   return lay;
+}
+
+static void
+_evas_layer_free(Evas_Layer *lay)
+{
+   free(lay);
+}
+
+void
+evas_layer_pre_free(Evas_Layer *lay)
+{
+   Evas_Object *obj;
+
+   EINA_INLIST_FOREACH(lay->objects, obj)
+     {
+       if ((!obj->smart.parent) && (!obj->delete_me))
+         evas_object_del(obj);
+     }
+}
+
+void
+evas_layer_free_objects(Evas_Layer *lay)
+{
+   while (lay->objects)
+     {
+       Evas_Object *obj;
+
+       obj = (Evas_Object *)lay->objects;
+       evas_object_free(obj, 0);
+     }
+}
+
+void
+evas_layer_clean(Evas *e)
+{
+   Evas_Layer *tmp;
+
+   while (e->layers)
+     {
+       tmp = e->layers;
+       evas_layer_del(tmp);
+       _evas_layer_free(tmp);
+     }
+}
+
+Evas_Layer *
+evas_layer_find(Evas *e, short layer_num)
+{
+   Evas_Layer *layer;
+
+   EINA_INLIST_FOREACH(e->layers, layer)
+     {
+       if (layer->layer == layer_num) return layer;
+     }
+   return NULL;
+}
+
+void
+evas_layer_add(Evas_Layer *lay)
+{
+   Evas_Layer *layer;
+
+   EINA_INLIST_FOREACH(lay->evas->layers, layer)
+     {
+       if (layer->layer > lay->layer)
+         {
+            lay->evas->layers = (Evas_Layer *)eina_inlist_prepend_relative(EINA_INLIST_GET(lay->evas->layers),
+                                                                           EINA_INLIST_GET(lay),
+                                                                           EINA_INLIST_GET(layer));
+            return;
+         }
+     }
+   lay->evas->layers = (Evas_Layer *)eina_inlist_append(EINA_INLIST_GET(lay->evas->layers), EINA_INLIST_GET(lay));
+}
+
+void
+evas_layer_del(Evas_Layer *lay)
+{
+   Evas *e;
+
+   e = lay->evas;
+   e->layers = (Evas_Layer *)eina_inlist_remove(EINA_INLIST_GET(e->layers), EINA_INLIST_GET(lay));
+}
+
+/* public functions */
+
+/**
+ * @addtogroup Evas_Object_Group_Basic
+ * @{
+ */
+
+/**
+ * Sets the layer of the evas that the given object will be part of.
+ *
+ * It is not possible to change the layer of a smart object's child.
+ *
+ * @param   obj The given evas object.
+ * @param   l   The number of the layer to place the object on.
+ *          Between #EVAS_LAYER_MIN and #EVAS_LAYER_MAX.
+ */
+EAPI void
+evas_object_layer_set(Evas_Object *obj, short l)
+{
+   Evas *e;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (evas_object_intercept_call_layer_set(obj, l)) return;
+   if (obj->smart.parent) return;
+   if (obj->cur.layer == l)
+     {
+       evas_object_raise(obj);
+       return;
+     }
+   e = obj->layer->evas;
+   evas_object_release(obj, 1);
+   obj->cur.layer = l;
+   evas_object_inject(obj, e);
+   obj->restack = 1;
+   evas_object_change(obj);
+   if (obj->clip.clipees)
+     {
+       evas_object_inform_call_restack(obj);
+       return;
+     }
+   evas_object_change(obj);
+   if (!obj->smart.smart)
+     {
+       if (evas_object_is_in_output_rect(obj,
+                                         obj->layer->evas->pointer.x,
+                                         obj->layer->evas->pointer.y, 1, 1) &&
+           obj->cur.visible)
+         if (eina_list_data_find(obj->layer->evas->pointer.object.in, obj))
+           evas_event_feed_mouse_move(obj->layer->evas,
+                                      obj->layer->evas->pointer.x,
+                                      obj->layer->evas->pointer.y,
+                                      obj->layer->evas->last_timestamp,
+                                      NULL);
+     }
+   evas_object_inform_call_restack(obj);
+}
+
+/**
+ * Retrieves the layer of the evas that the given object is part of.
+ *
+ * Be carefull, it doesn't make sense to change the layer of smart object's
+ * child. So the returned value could be wrong in some case. Don't rely on
+ * it's accuracy.
+ *
+ * @param   obj The given evas object.
+ * @return  Number of the layer.
+ */
+EAPI short
+evas_object_layer_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   if (obj->smart.parent)
+     {
+        return obj->smart.parent->cur.layer;
+     }
+   return obj->cur.layer;
+}
+
+/**
+ * @}
+ */
diff --git a/src/lib/canvas/evas_main.c b/src/lib/canvas/evas_main.c
new file mode 100644 (file)
index 0000000..c60cb21
--- /dev/null
@@ -0,0 +1,1135 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_cs.h"
+
+static int _evas_init_count = 0;
+int _evas_log_dom_global = -1;
+/**
+ * Initialize Evas
+ *
+ * @return The init counter value.
+ *
+ * This function initialize evas, increments a counter of the number
+ * of calls to this function and returns this value.
+ *
+ * @see evas_shutdown().
+ *
+ * @ingroup Evas_Group
+ */
+EAPI int
+evas_init(void)
+{
+   if (++_evas_init_count != 1)
+     return _evas_init_count;
+
+#ifdef HAVE_EVIL
+   if (!evil_init())
+     return --_evas_init_count;
+#endif
+
+   if (!eina_init())
+     goto shutdown_evil;
+
+   _evas_log_dom_global = eina_log_domain_register("evas_main",EVAS_DEFAULT_LOG_COLOR);
+   if (_evas_log_dom_global < 0)
+     {
+       EINA_LOG_ERR("Evas could not create a default log domain\n");
+       goto shutdown_eina;
+     }
+
+   evas_module_init();
+#ifdef BUILD_ASYNC_EVENTS
+   if (!evas_async_events_init())
+     goto shutdown_module;
+#endif
+#ifdef EVAS_CSERVE
+   if (getenv("EVAS_CSERVE")) evas_cserve_init();
+#endif
+#ifdef BUILD_ASYNC_PRELOAD
+   _evas_preload_thread_init();
+#endif
+
+   return _evas_init_count;
+
+#ifdef BUILD_ASYNC_EVENTS
+ shutdown_module:
+   evas_module_shutdown();
+   eina_log_domain_unregister(_evas_log_dom_global);
+#endif
+ shutdown_eina:
+   eina_shutdown();
+ shutdown_evil:
+#ifdef HAVE_EVIL
+   evil_shutdown();
+#endif
+
+   return --_evas_init_count;
+}
+
+/**
+ * Shutdown Evas
+ *
+ * @return The init counter value.
+ *
+ * This function finalize evas, decrements the counter of the number
+ * of calls to the function evas_init() and returns this value.
+ *
+ * @see evas_init().
+ *
+ * @ingroup Evas_Group
+ */
+EAPI int
+evas_shutdown(void)
+{
+   if (--_evas_init_count != 0)
+     return _evas_init_count;
+
+#ifdef BUILD_ASYNC_EVENTS
+   _evas_preload_thread_shutdown();
+#endif
+#ifdef EVAS_CSERVE
+   if (getenv("EVAS_CSERVE")) evas_cserve_shutdown();
+#endif
+#ifdef BUILD_ASYNC_EVENTS
+   evas_async_events_shutdown();
+#endif
+   evas_font_dir_cache_free();
+   evas_common_shutdown();
+   evas_module_shutdown();
+   eina_log_domain_unregister(_evas_log_dom_global);
+   eina_shutdown();
+#ifdef HAVE_EVIL
+   evil_shutdown();
+#endif
+
+   return _evas_init_count;
+}
+
+
+/**
+ * Creates a new empty evas.
+ *
+ * Note that before you can use the evas, you will to at a minimum:
+ * @li Set its render method with @ref evas_output_method_set .
+ * @li Set its viewport size with @ref evas_output_viewport_set .
+ * @li Set its size of the canvas with @ref evas_output_size_set .
+ * @li Ensure that the render engine is given the correct settings
+ *     with @ref evas_engine_info_set .
+ *
+ * This function should only fail if the memory allocation fails
+ *
+ * @note this function is very low level. Instead of using it
+ *       directly, consider using the high level functions in
+ *       Ecore_Evas such as @c ecore_evas_new(). See
+ *       http://docs.enlightenment.org/auto/ecore/.
+ *
+ * @attention it is recommended that one calls evas_init() before
+ *       creating new canvas.
+ *
+ * @return A new uninitialised Evas canvas on success.  Otherwise, @c
+ * NULL.
+ * @ingroup Evas_Canvas
+ */
+EAPI Evas *
+evas_new(void)
+{
+   Evas *e;
+
+   e = calloc(1, sizeof(Evas));
+   if (!e) return NULL;
+
+   e->magic = MAGIC_EVAS;
+   e->output.render_method = RENDER_METHOD_INVALID;
+   e->viewport.w = 1;
+   e->viewport.h = 1;
+   e->hinting = EVAS_FONT_HINTING_BYTECODE;
+   e->name_hash = eina_hash_string_superfast_new(NULL);
+
+   eina_array_step_set(&e->delete_objects, 256);
+   eina_array_step_set(&e->active_objects, 256);
+   eina_array_step_set(&e->restack_objects, 256);
+   eina_array_step_set(&e->render_objects, 256);
+   eina_array_step_set(&e->pending_objects, 256);
+   eina_array_step_set(&e->obscuring_objects, 256);
+   eina_array_step_set(&e->temporary_objects, 256);
+   eina_array_step_set(&e->calculate_objects, 256);
+   eina_array_step_set(&e->clip_changes, 256);
+
+   return e;
+}
+
+/**
+ * Frees the given evas and any objects created on it.
+ *
+ * Any objects with 'free' callbacks will have those callbacks called
+ * in this function.
+ *
+ * @param   e The given evas.
+ *
+ * @ingroup Evas_Canvas
+ */
+EAPI void
+evas_free(Evas *e)
+{
+   Eina_Rectangle *r;
+   Evas_Layer *lay;
+   int i;
+   int del;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if (e->walking_list == 0) evas_render_idle_flush(e);
+   
+   if (e->walking_list > 0) return;
+   if (!e->callbacks) return;
+   if (e->callbacks->deletions_waiting) return;
+   
+   e->callbacks->deletions_waiting = 0;
+   evas_event_callback_list_post_free(&e->callbacks->callbacks);
+   if (!e->callbacks->callbacks)
+     {
+        free(e->callbacks);
+       e->callbacks = NULL;
+     }
+   
+   _evas_post_event_callback_free(e);
+   
+   del = 1;
+   e->walking_list++;
+   e->cleanup = 1;
+   while (del)
+     {
+       del = 0;
+       EINA_INLIST_FOREACH(e->layers, lay)
+         {
+            Evas_Object *o;
+
+            evas_layer_pre_free(lay);
+
+            EINA_INLIST_FOREACH(lay->objects, o)
+              {
+                 if ((o->callbacks) && (o->callbacks->walking_list))
+                   {
+                      /* Defer free */
+                      e->delete_me = 1;
+                      e->walking_list--;
+                      return;
+                   }
+                 if (!o->delete_me)
+                   del = 1;
+              }
+         }
+     }
+   EINA_INLIST_FOREACH(e->layers, lay)
+     evas_layer_free_objects(lay);
+   evas_layer_clean(e);
+
+   e->walking_list--;
+
+   evas_font_path_clear(e);
+   e->pointer.object.in = eina_list_free(e->pointer.object.in);
+
+   if (e->name_hash) eina_hash_free(e->name_hash);
+   e->name_hash = NULL;
+
+   EINA_LIST_FREE(e->damages, r)
+     eina_rectangle_free(r);
+   EINA_LIST_FREE(e->obscures, r)
+     eina_rectangle_free(r);
+
+   evas_fonts_zero_free(e);
+   
+   evas_event_callback_all_del(e);
+   evas_event_callback_cleanup(e);
+
+   if (e->engine.func)
+     {
+       e->engine.func->context_free(e->engine.data.output, e->engine.data.context);
+       e->engine.func->output_free(e->engine.data.output);
+       e->engine.func->info_free(e, e->engine.info);
+     }
+
+   for (i = 0; i < e->modifiers.mod.count; i++)
+     free(e->modifiers.mod.list[i]);
+   if (e->modifiers.mod.list) free(e->modifiers.mod.list);
+
+   for (i = 0; i < e->locks.lock.count; i++)
+     free(e->locks.lock.list[i]);
+   if (e->locks.lock.list) free(e->locks.lock.list);
+
+   if (e->engine.module) evas_module_unref(e->engine.module);
+
+   eina_array_flush(&e->delete_objects);
+   eina_array_flush(&e->active_objects);
+   eina_array_flush(&e->restack_objects);
+   eina_array_flush(&e->render_objects);
+   eina_array_flush(&e->pending_objects);
+   eina_array_flush(&e->obscuring_objects);
+   eina_array_flush(&e->temporary_objects);
+   eina_array_flush(&e->calculate_objects);
+   eina_array_flush(&e->clip_changes);
+
+   e->magic = 0;
+   free(e);
+}
+
+/**
+ * Sets the output engine for the given evas.
+ *
+ * Once the output engine for an evas is set, any attempt to change it
+ * will be ignored.  The value for @p render_method can be found using
+ * @ref evas_render_method_lookup .
+ *
+ * @attention it is mandatory that one calls evas_init() before
+ *       setting the output method.
+ *
+ * @param   e             The given evas.
+ * @param   render_method The numeric engine value to use.
+ * @ingroup Evas_Output_Method
+ */
+EAPI void
+evas_output_method_set(Evas *e, int render_method)
+{
+   Evas_Module *em;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   /* if our engine to set it to is invalid - abort */
+   if (render_method == RENDER_METHOD_INVALID) return;
+   /* if the engine is already set up - abort */
+   if (e->output.render_method != RENDER_METHOD_INVALID) return;
+   /* Request the right engine. */
+   em = evas_module_engine_get(render_method);
+   if (!em) return ;
+   if (em->id_engine != render_method) return;
+   if (!evas_module_load(em)) return;
+
+   /* set the correct render */
+   e->output.render_method = render_method;
+   e->engine.func = (em->functions);
+   evas_module_use(em);
+   if (e->engine.module) evas_module_unref(e->engine.module);
+   e->engine.module = em;
+   evas_module_ref(em);
+   /* get the engine info struct */
+   if (e->engine.func->info) e->engine.info = e->engine.func->info(e);
+   return;
+}
+
+/**
+ * Retrieves the number of the output engine used for the given evas.
+ * @param   e The given evas.
+ * @return  The ID number of the output engine being used.  @c 0 is
+ *          returned if there is an error.
+ * @ingroup Evas_Output_Method
+ */
+EAPI int
+evas_output_method_get(const Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return RENDER_METHOD_INVALID;
+   MAGIC_CHECK_END();
+
+   return e->output.render_method;
+}
+
+/**
+ * Retrieves the current render engine info struct from the given evas.
+ *
+ * The returned structure is publicly modifiable.  The contents are
+ * valid until either @ref evas_engine_info_set or @ref evas_render
+ * are called.
+ *
+ * This structure does not need to be freed by the caller.
+ *
+ * @param   e The given evas.
+ * @return  A pointer to the Engine Info structure.  @c NULL is returned if
+ *          an engine has not yet been assigned.
+ * @ingroup Evas_Output_Method
+ */
+EAPI Evas_Engine_Info *
+evas_engine_info_get(const Evas *e)
+{
+   Evas_Engine_Info *info;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+
+   if (!e->engine.info) return NULL;
+
+   info = e->engine.info;
+   ((Evas *)e)->engine.info_magic = info->magic;
+
+   return info;
+}
+
+/**
+ * Applies the engine settings for the given evas from the given @c
+ * Evas_Engine_Info structure.
+ *
+ * To get the Evas_Engine_Info structure to use, call @ref
+ * evas_engine_info_get .  Do not try to obtain a pointer to an
+ * @c Evas_Engine_Info structure in any other way.
+ *
+ * You will need to call this function at least once before you can
+ * create objects on an evas or render that evas.  Some engines allow
+ * their settings to be changed more than once.
+ *
+ * Once called, the @p info pointer should be considered invalid.
+ *
+ * @param   e    The pointer to the Evas Canvas
+ * @param   info The pointer to the Engine Info to use
+ * @return  1 if no error occured, 0 otherwise
+ * @ingroup Evas_Output_Method
+ */
+EAPI int
+evas_engine_info_set(Evas *e, Evas_Engine_Info *info)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return 0;
+   MAGIC_CHECK_END();
+   if (!info) return 0;
+   if (info != e->engine.info) return 0;
+   if (info->magic != e->engine.info_magic) return 0;
+   return e->engine.func->setup(e, info);
+}
+
+/**
+ * Sets the output size of the render engine of the given evas.
+ *
+ * The evas will render to a rectangle of the given size once this
+ * function is called.  The output size is independent of the viewport
+ * size.  The viewport will be stretched to fill the given rectangle.
+ *
+ * The units used for @p w and @p h depend on the engine used by the
+ * evas.
+ *
+ * @param   e The given evas.
+ * @param   w The width in output units, usually pixels.
+ * @param   h The height in output units, usually pixels.
+ * @ingroup Evas_Output_Size
+ */
+EAPI void
+evas_output_size_set(Evas *e, int w, int h)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if ((w == e->output.w) && (h == e->output.h)) return;
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+   e->output.w = w;
+   e->output.h = h;
+   e->output.changed = 1;
+   e->output_validity++;
+   e->changed = 1;
+   evas_render_invalidate(e);
+}
+
+/**
+ * Retrieve the output size of the render engine of the given evas.
+ *
+ * The output size is given in whatever the output units are for the
+ * engine.
+ *
+ * If either @p w or @p h is @c NULL, then it is ignored.  If @p e is
+ * invalid, the returned results are undefined.
+ *
+ * @param   e The given evas.
+ * @param   w The pointer to an integer to store the width in.
+ * @param   h The pointer to an integer to store the height in.
+ * @ingroup Evas_Output_Size
+ */
+EAPI void
+evas_output_size_get(const Evas *e, int *w, int *h)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   if (w) *w = 0;
+   if (h) *h = 0;
+   return;
+   MAGIC_CHECK_END();
+
+   if (w) *w = e->output.w;
+   if (h) *h = e->output.h;
+}
+
+/**
+ * Sets the output viewport of the given evas in evas units.
+ *
+ * The output viewport is the area of the evas that will be visible to
+ * the viewer.  The viewport will be stretched to fit the output
+ * target of the evas when rendering is performed.
+ *
+ * @note The coordinate values do not have to map 1-to-1 with the output
+ *       target.  However, it is generally advised that it is done for ease
+ *       of use.
+ *
+ * @param   e The given evas.
+ * @param   x The top-left corner x value of the viewport.
+ * @param   y The top-left corner y value of the viewport.
+ * @param   w The width of the viewport.  Must be greater than 0.
+ * @param   h The height of the viewport.  Must be greater than 0.
+ * @ingroup Evas_Output_Size
+ */
+EAPI void
+evas_output_viewport_set(Evas *e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if ((x == e->viewport.x) && (y == e->viewport.y) &&
+       (w == e->viewport.w) && (h == e->viewport.h)) return;
+   if (w <= 0) return;
+   if (h <= 0) return;
+   if ((x != 0) || (y != 0))
+     {
+       ERR("Compat error. viewport x,y != 0,0 not supported");
+       x = 0;
+       y = 0;
+     }
+   e->viewport.x = x;
+   e->viewport.y = y;
+   e->viewport.w = w;
+   e->viewport.h = h;
+   e->viewport.changed = 1;
+   e->output_validity++;
+   e->changed = 1;
+}
+
+/**
+ * Get the render engine's output viewport co-ordinates in canvas units.
+ * @param e The pointer to the Evas Canvas
+ * @param x The pointer to a x variable to be filled in
+ * @param y The pointer to a y variable to be filled in
+ * @param w The pointer to a width variable to be filled in
+ * @param h The pointer to a height variable to be filled in
+ * @ingroup Evas_Output_Size
+ *
+ * Calling this function writes the current canvas output viewport
+ * size and location values into the variables pointed to by @p x, @p
+ * y, @p w and @p h.  On success the variables have the output
+ * location and size values written to them in canvas units. Any of @p
+ * x, @p y, @p w or @p h that are NULL will not be written to. If @p e
+ * is invalid, the results are undefined.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ * Evas_Coord x, y, width, height;
+ *
+ * evas_output_viewport_get(evas, &x, &y, &w, &h);
+ * @endcode
+ */
+EAPI void
+evas_output_viewport_get(const Evas *e, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = 0;
+   if (h) *h = 0;
+   return;
+   MAGIC_CHECK_END();
+
+   if (x) *x = e->viewport.x;
+   if (y) *y = e->viewport.y;
+   if (w) *w = e->viewport.w;
+   if (h) *h = e->viewport.h;
+}
+
+/**
+ * Convert/scale an ouput screen co-ordinate into canvas co-ordinates
+ *
+ * @param e The pointer to the Evas Canvas
+ * @param x The screen/output x co-ordinate
+ * @return The screen co-ordinate translated to canvas unit co-ordinates
+ * @ingroup Evas_Coord_Mapping_Group
+ *
+ * This function takes in a horizontal co-ordinate as the @p x
+ * parameter and converts it into canvas units, accounting for output
+ * size, viewport size and location, returning it as the function
+ * return value. If @p e is invalid, the results are undefined.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ * extern int screen_x;
+ * Evas_Coord canvas_x;
+ *
+ * canvas_x = evas_coord_screen_x_to_world(evas, screen_x);
+ * @endcode
+ */
+EAPI Evas_Coord
+evas_coord_screen_x_to_world(const Evas *e, int x)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return 0;
+   MAGIC_CHECK_END();
+   if (e->output.w == e->viewport.w) return e->viewport.x + x;
+   return (long long)e->viewport.x + (((long long)x * (long long)e->viewport.w) / (long long)e->output.w);
+}
+
+/**
+ * Convert/scale an ouput screen co-ordinate into canvas co-ordinates
+ *
+ * @param e The pointer to the Evas Canvas
+ * @param y The screen/output y co-ordinate
+ * @return The screen co-ordinate translated to canvas unit co-ordinates
+ * @ingroup Evas_Coord_Mapping_Group
+ *
+ * This function takes in a vertical co-ordinate as the @p y parameter
+ * and converts it into canvas units, accounting for output size,
+ * viewport size and location, returning it as the function return
+ * value. If @p e is invalid, the results are undefined.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ * extern int screen_y;
+ * Evas_Coord canvas_y;
+ *
+ * canvas_y = evas_coord_screen_y_to_world(evas, screen_y);
+ * @endcode
+ */
+EAPI Evas_Coord
+evas_coord_screen_y_to_world(const Evas *e, int y)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return 0;
+   MAGIC_CHECK_END();
+   if (e->output.h == e->viewport.h) return e->viewport.y + y;
+   return (long long)e->viewport.y + (((long long)y * (long long)e->viewport.h) / (long long)e->output.h);
+}
+
+/**
+ * Convert/scale a canvas co-ordinate into output screen co-ordinates
+ *
+ * @param e The pointer to the Evas Canvas
+ * @param x The canvas x co-ordinate
+ * @return The output/screen co-ordinate translated to output co-ordinates
+ * @ingroup Evas_Coord_Mapping_Group
+ *
+ * This function takes in a horizontal co-ordinate as the @p x
+ * parameter and converts it into output units, accounting for output
+ * size, viewport size and location, returning it as the function
+ * return value. If @p e is invalid, the results are undefined.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ * int screen_x;
+ * extern Evas_Coord canvas_x;
+ *
+ * screen_x = evas_coord_world_x_to_screen(evas, canvas_x);
+ * @endcode
+ */
+EAPI int
+evas_coord_world_x_to_screen(const Evas *e, Evas_Coord x)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return 0;
+   MAGIC_CHECK_END();
+   if (e->output.w == e->viewport.w) return x - e->viewport.x;
+   return (int)((((long long)x - (long long)e->viewport.x) * (long long)e->output.w) /  (long long)e->viewport.w);
+}
+
+/**
+ * Convert/scale a canvas co-ordinate into output screen co-ordinates
+ *
+ * @param e The pointer to the Evas Canvas
+ * @param y The canvas y co-ordinate
+ * @return The output/screen co-ordinate translated to output co-ordinates
+ * @ingroup Evas_Coord_Mapping_Group
+ *
+ * This function takes in a vertical co-ordinate as the @p x parameter
+ * and converts it into output units, accounting for output size,
+ * viewport size and location, returning it as the function return
+ * value. If @p e is invalid, the results are undefined.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ * int screen_y;
+ * extern Evas_Coord canvas_y;
+ *
+ * screen_y = evas_coord_world_y_to_screen(evas, canvas_y);
+ * @endcode
+ */
+EAPI int
+evas_coord_world_y_to_screen(const Evas *e, Evas_Coord y)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return 0;
+   MAGIC_CHECK_END();
+   if (e->output.h == e->viewport.h) return y - e->viewport.y;
+   return (int)((((long long)y - (long long)e->viewport.y) * (long long)e->output.h) /  (long long)e->viewport.h);
+}
+
+/**
+ * Look up a numeric ID from a string name of a rendering engine.
+ *
+ * @param name The string name of an engine
+ * @return A numeric (opaque) ID for the rendering engine
+ * @ingroup Evas_Output_Method
+ *
+ * This function looks up a numeric return value for the named engine
+ * in the string @p name. This is a normal C string, NUL byte
+ * terminated. The name is case sensitive. If the rendering engine is
+ * available, a numeric ID for that engine is returned that is not
+ * 0. If the engine is not available, 0 is returned, indicating an
+ * invalid engine.
+ *
+ * The programmer should NEVER rely on the numeric ID of an engine
+ * unless it is returned by this function. Programs should NOT be
+ * written accessing render method ID's directly, without first
+ * obtaining it from this function.
+ *
+ * @attention it is mandatory that one calls evas_init() before
+ *       looking up the render method.
+ *
+ * Example:
+ * @code
+ * int engine_id;
+ * Evas *evas;
+ *
+ * evas_init();
+ *
+ * evas = evas_new();
+ * if (!evas)
+ *   {
+ *     fprintf(stderr, "ERROR: Canvas creation failed. Fatal error.\n");
+ *     exit(-1);
+ *   }
+ * engine_id = evas_render_method_lookup("software_x11");
+ * if (!engine_id)
+ *   {
+ *     fprintf(stderr, "ERROR: Requested rendering engine is absent.\n");
+ *     exit(-1);
+ *   }
+ * evas_output_method_set(evas, engine_id);
+ * @endcode
+ */
+EAPI int
+evas_render_method_lookup(const char *name)
+{
+   Evas_Module *em;
+
+   if (!name) return RENDER_METHOD_INVALID;
+   /* search on the engines list for the name */
+   em = evas_module_find_type(EVAS_MODULE_TYPE_ENGINE, name);
+   if (!em) return RENDER_METHOD_INVALID;
+
+   return em->id_engine;
+}
+
+/**
+ * List all the rendering engines compiled into the copy of the Evas library
+ *
+ * @return A linked list whose data members are C strings of engine names
+ * @ingroup Evas_Output_Method
+ *
+ * Calling this will return a handle (pointer) to an Evas linked
+ * list. Each node in the linked list will have the data pointer be a
+ * (char *) pointer to the string name of the rendering engine
+ * available. The strings should never be modified, neither should the
+ * list be modified. This list should be cleaned up as soon as the
+ * program no longer needs it using evas_render_method_list_free(). If
+ * no engines are available from Evas, NULL will be returned.
+ *
+ * Example:
+ * @code
+ * Eina_List *engine_list, *l;
+ * char *engine_name;
+ *
+ * engine_list = evas_render_method_list();
+ * if (!engine_list)
+ *   {
+ *     fprintf(stderr, "ERROR: Evas supports no engines! Exit.\n");
+ *     exit(-1);
+ *   }
+ * printf("Availible Evas Engines:\n");
+ * EINA_LIST_FOREACH(engine_list, l, engine_name)
+ *     printf("%s\n", engine_name);
+ * evas_render_method_list_free(engine_list);
+ * @endcode
+ */
+EAPI Eina_List *
+evas_render_method_list(void)
+{
+   Eina_List *methods = NULL;
+
+   /* FIXME: get from modules - this is currently coded-in */
+#ifdef BUILD_ENGINE_SOFTWARE_GDI
+   methods = eina_list_append(methods, "software_gdi");
+#endif
+#ifdef BUILD_ENGINE_SOFTWARE_DDRAW
+   methods = eina_list_append(methods, "software_ddraw");
+#endif
+#ifdef BUILD_ENGINE_SOFTWARE_16_DDRAW
+   methods = eina_list_append(methods, "software_16_ddraw");
+#endif
+#ifdef BUILD_ENGINE_DIRECT3D
+   methods = eina_list_append(methods, "direct3d");
+#endif
+#ifdef BUILD_ENGINE_SOFTWARE_16_WINCE
+   methods = eina_list_append(methods, "software_16_wince");
+#endif
+#ifdef BUILD_ENGINE_SOFTWARE_X11
+   methods = eina_list_append(methods, "software_x11");
+#endif
+#ifdef BUILD_ENGINE_XRENDER_X11
+   methods = eina_list_append(methods, "xrender_x11");
+#endif
+#ifdef BUILD_ENGINE_XRENDER_XCB
+   methods = eina_list_append(methods, "xrender_xcb");
+#endif
+#ifdef BUILD_ENGINE_SOFTWARE_16_X11
+   methods = eina_list_append(methods, "software_16_x11");
+#endif
+#ifdef BUILD_ENGINE_GL_X11
+   methods = eina_list_append(methods, "gl_x11");
+#endif
+#ifdef BUILD_ENGINE_GL_GLEW
+   methods = eina_list_append(methods, "gl_glew");
+#endif
+#ifdef BUILD_ENGINE_CAIRO_X11
+   methods = eina_list_append(methods, "cairo_x11");
+#endif
+#ifdef BUILD_ENGINE_DIRECTFB
+   methods = eina_list_append(methods, "directfb");
+#endif
+#ifdef BUILD_ENGINE_FB
+   methods = eina_list_append(methods, "fb");
+#endif
+#ifdef BUILD_ENGINE_BUFFER
+   methods = eina_list_append(methods, "buffer");
+#endif
+#ifdef BUILD_ENGINE_SOFTWARE_WIN32_GDI
+   methods = eina_list_append(methods, "software_win32_gdi");
+#endif
+#ifdef BUILD_ENGINE_SOFTWARE_QTOPIA
+   methods = eina_list_append(methods, "software_qtopia");
+#endif
+#ifdef BUILD_ENGINE_SOFTWARE_SDL
+   methods = eina_list_append(methods, "software_sdl");
+#endif
+
+   return methods;
+}
+
+/**
+ * This function should be called to free a list of engine names
+ *
+ * @param list The Eina_List base pointer for the engine list to be freed
+ * @ingroup Evas_Output_Method
+ *
+ * When this function is called it will free the engine list passed in
+ * as @p list. The list should only be a list of engines generated by
+ * calling evas_render_method_list(). If @p list is NULL, nothing will
+ * happen.
+ *
+ * Example:
+ * @code
+ * Eina_List *engine_list, *l;
+ * char *engine_name;
+ *
+ * engine_list = evas_render_method_list();
+ * if (!engine_list)
+ *   {
+ *     fprintf(stderr, "ERROR: Evas supports no engines! Exit.\n");
+ *     exit(-1);
+ *   }
+ * printf("Availible Evas Engines:\n");
+ * EINA_LIST_FOREACH(engine_list, l, engine_name)
+ *     printf("%s\n", engine_name);
+ * evas_render_method_list_free(engine_list);
+ * @endcode
+ */
+EAPI void
+evas_render_method_list_free(Eina_List *list)
+{
+   eina_list_free(list);
+}
+
+/**
+ * This function returns the current known pointer co-ordinates
+ *
+ * @param e The pointer to the Evas Canvas
+ * @param x The pointer to an integer to be filled in
+ * @param y The pointer to an integer to be filled in
+ * @ingroup Evas_Pointer_Group
+ *
+ * This function returns the current known screen/output co-ordinates
+ * of the mouse pointer and sets the contents of the integers pointed
+ * to by @p x and @p y to contain these co-ordinates. If @p e is not a
+ * valid canvas the results of this function are undefined.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ * int mouse_x, mouse_y;
+ *
+ * evas_pointer_output_xy_get(evas, &mouse_x, &mouse_y);
+ * printf("Mouse is at screen position %i, %i\n", mouse_x, mouse_y);
+ * @endcode
+ */
+EAPI void
+evas_pointer_output_xy_get(const Evas *e, int *x, int *y)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   if (x) *x = 0;
+   if (y) *y = 0;
+   return;
+   MAGIC_CHECK_END();
+   if (x) *x = e->pointer.x;
+   if (y) *y = e->pointer.y;
+}
+
+/**
+ * This function returns the current known pointer co-ordinates
+ *
+ * @param e The pointer to the Evas Canvas
+ * @param x The pointer to a Evas_Coord to be filled in
+ * @param y The pointer to a Evas_Coord to be filled in
+ * @ingroup Evas_Pointer_Group
+ *
+ * This function returns the current known canvas unit co-ordinates of
+ * the mouse pointer and sets the contents of the Evas_Coords pointed
+ * to by @p x and @p y to contain these co-ordinates. If @p e is not a
+ * valid canvas the results of this function are undefined.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ * Evas_Coord mouse_x, mouse_y;
+ *
+ * evas_pointer_output_xy_get(evas, &mouse_x, &mouse_y);
+ * printf("Mouse is at canvas position %f, %f\n", mouse_x, mouse_y);
+ * @endcode
+ */
+EAPI void
+evas_pointer_canvas_xy_get(const Evas *e, Evas_Coord *x, Evas_Coord *y)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   if (x) *x = 0;
+   if (y) *y = 0;
+   return;
+   MAGIC_CHECK_END();
+   if (x) *x = e->pointer.x;
+   if (y) *y = e->pointer.y;
+}
+
+/**
+ * Returns a bitmask with the mouse buttons currently pressed, set to 1
+ *
+ * @param e The pointer to the Evas Canvas
+ * @return A bitmask of the currently depressed buttons on the cavas
+ * @ingroup Evas_Pointer_Group
+ *
+ * Calling this function will return a 32-bit integer with the
+ * appropriate bits set to 1 that correspond to a mouse button being
+ * depressed. This limits Evas to a mouse devices with a maximum of 32
+ * buttons, but that is generally in excess of any host system's
+ * pointing device abilities.
+ *
+ * A canvas by default begins with no mouse buttons being pressed and
+ * only calls to evas_event_feed_mouse_down(),
+ * evas_event_feed_mouse_down_data(), evas_event_feed_mouse_up() and
+ * evas_event_feed_mouse_up_data() will alter that.
+ *
+ * The least significant bit corresponds to the first mouse button
+ * (button 1) and the most significant bit corresponds to the last
+ * mouse button (button 32).
+ *
+ * If @p e is not a valid canvas, the return value is undefined.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ * int button_mask, i;
+ *
+ * button_mask = evas_pointer_button_down_mask_get(evas);
+ * printf("Buttons currently pressed:\n");
+ * for (i = 0; i < 32; i++)
+ *   {
+ *     if ((button_mask & (1 << i)) != 0) printf("Button %i\n", i + 1);
+ *   }
+ * @endcode
+ */
+EAPI int
+evas_pointer_button_down_mask_get(const Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return 0;
+   MAGIC_CHECK_END();
+   return (int)e->pointer.button;
+}
+
+/**
+ * Returns whether the mouse pointer is logically inside the canvas
+ *
+ * @param e The pointer to the Evas Canvas
+ * @return An integer that is 1 if the mouse is inside the canvas, 0 otherwise
+ * @ingroup Evas_Pointer_Group
+ *
+ * When this function is called it will return a value of either 0 or
+ * 1, depending on if evas_event_feed_mouse_in(),
+ * evas_event_feed_mouse_in_data(), or evas_event_feed_mouse_out(),
+ * evas_event_feed_mouse_out_data() have been called to feed in a
+ * mouse enter event into the canvas.
+ *
+ * A return value of 1 indicates the mouse is logically inside the
+ * canvas, and 0 implies it is logically outside the canvas.
+ *
+ * A canvas begins with the mouse being assumed outside (0).
+ *
+ * If @p e is not a valid canvas, the return value is undefined.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ *
+ * if (evas_pointer_inside_get(evas)) printf("Mouse is in!\n");
+ * else printf("Mouse is out!\n");
+ * @endcode
+ */
+EAPI Eina_Bool
+evas_pointer_inside_get(const Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return 0;
+   MAGIC_CHECK_END();
+   return (int)e->pointer.inside;
+}
+
+/**
+ * Attaches a specific pointer to the evas for fetching later
+ *
+ * @param e The canvas to attach the pointer to
+ * @param data The pointer to attach
+ * @ingroup Evas_Canvas
+ */
+EAPI void
+evas_data_attach_set(Evas *e, void *data)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   e->attach_data = data;
+}
+
+/**
+ * Returns the pointer attached by evas_data_attach_set()
+ *
+ * @param e The canvas to attach the pointer to
+ * @return The pointer attached
+ * @ingroup Evas_Canvas
+ */
+EAPI void *
+evas_data_attach_get(const Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   return e->attach_data;
+}
+
+/**
+ * Inform to the evas that it got the focus.
+ *
+ * @param e The evas to change information.
+ * @ingroup Evas_Canvas
+ */
+EAPI void
+evas_focus_in(Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   if (e->focus) return;
+   e->focus = 1;
+   evas_event_callback_call(e, EVAS_CALLBACK_CANVAS_FOCUS_IN, NULL);
+}
+
+/**
+ * Inform to the evas that it lost the focus.
+ *
+ * @param e The evas to change information.
+ * @ingroup Evas_Canvas
+ */
+EAPI void
+evas_focus_out(Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   if (!e->focus) return;
+   e->focus = 0;
+   evas_event_callback_call(e, EVAS_CALLBACK_CANVAS_FOCUS_OUT, NULL);
+}
+
+/**
+ * Get the focus state known by the given evas
+ *
+ * @param e The evas to query information.
+ * @ingroup Evas_Canvas
+ */
+EAPI Eina_Bool
+evas_focus_state_get(const Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return 0;
+   MAGIC_CHECK_END();
+   return e->focus;
+}
+
+void
+_evas_walk(Evas *e)
+{
+   e->walking_list++;
+}
+
+void
+_evas_unwalk(Evas *e)
+{
+   e->walking_list--;
+   if ((e->walking_list == 0) && (e->delete_me)) evas_free(e);
+}
+
+/**
+ * Converts the given error code into a string describing it in english.
+ * @param error the error code.
+ * @return Always return a valid string. If given @p error is not
+ *         supported "Unknown error" is returned.
+ * @ingroup Evas_Utils
+ */
+EAPI const char *
+evas_load_error_str(int error)
+{
+   switch (error)
+     {
+      case EVAS_LOAD_ERROR_NONE:
+        return "No error on load";
+      case EVAS_LOAD_ERROR_GENERIC:
+        return "A non-specific error occured";
+      case EVAS_LOAD_ERROR_DOES_NOT_EXIST:
+        return "File (or file path) does not exist";
+      case EVAS_LOAD_ERROR_PERMISSION_DENIED:
+        return "Permission deinied to an existing file (or path)";
+      case EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED:
+        return "Allocation of resources failure prevented load";
+      case EVAS_LOAD_ERROR_CORRUPT_FILE:
+        return "File corrupt (but was detected as a known format)";
+      case EVAS_LOAD_ERROR_UNKNOWN_FORMAT:
+        return "File is not a known format";
+      default:
+        return "Unknown error";
+     }
+}
diff --git a/src/lib/canvas/evas_map.c b/src/lib/canvas/evas_map.c
new file mode 100644 (file)
index 0000000..666b2a5
--- /dev/null
@@ -0,0 +1,1325 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include <math.h>
+
+static void
+_evas_map_calc_geom_change(Evas_Object *obj)
+{
+   int is, was = 0, pass = 0;
+
+   evas_object_change(obj);
+   evas_object_clip_dirty(obj);
+   if (obj->layer->evas->events_frozen <= 0)
+     {
+       evas_object_recalc_clippees(obj);
+       if (!pass)
+         {
+            if (!obj->smart.smart)
+              {
+                 is = evas_object_is_in_output_rect(obj,
+                                                    obj->layer->evas->pointer.x,
+                                                    obj->layer->evas->pointer.y, 1, 1);
+                 if ((is ^ was) && obj->cur.visible)
+                   evas_event_feed_mouse_move(obj->layer->evas,
+                                              obj->layer->evas->pointer.x,
+                                              obj->layer->evas->pointer.y,
+                                              obj->layer->evas->last_timestamp,
+                                              NULL);
+              }
+         }
+     }
+   evas_object_inform_call_move(obj);
+   evas_object_inform_call_resize(obj);
+}
+
+static void
+_evas_map_calc_map_geometry(Evas_Object *obj)
+{
+   Evas_Coord x1, x2, y1, y2;
+   const Evas_Map_Point *p, *p_end;
+   int ch;
+
+   if (!obj->cur.map) return;
+   p = obj->cur.map->points;
+   p_end = p + obj->cur.map->count;
+   x1 = p->x;
+   x2 = p->x;
+   y1 = p->y;
+   y2 = p->y;
+   p++;
+   for (; p < p_end; p++)
+     {
+        if (p->x < x1) x1 = p->x;
+        if (p->x > x2) x2 = p->x;
+        if (p->y < y1) y1 = p->y;
+        if (p->y > y2) y2 = p->y;
+     }
+   ch = 0;
+   if (obj->cur.map->normal_geometry.x != x1) ch = 1;
+   if (obj->cur.map->normal_geometry.y != y1) ch = 1;
+   if (obj->cur.map->normal_geometry.w != (x2 - x1)) ch = 1;
+   if (obj->cur.map->normal_geometry.h != (y2 - y1)) ch = 1;
+   obj->cur.map->normal_geometry.x = x1;
+   obj->cur.map->normal_geometry.y = y1;
+   obj->cur.map->normal_geometry.w = (x2 - x1);
+   obj->cur.map->normal_geometry.h = (y2 - y1);
+   if (ch) _evas_map_calc_geom_change(obj);
+}
+
+static inline Evas_Map *
+_evas_map_new(int count)
+{
+   int i;
+   Evas_Map *m = calloc(1, sizeof(Evas_Map) + count * sizeof(Evas_Map_Point));
+   if (!m) return NULL;
+   m->count = count;
+   m->alpha = 1;
+   m->smooth = 1;
+   for (i = 0; i < count; i++)
+     {
+        m->points[i].r = 255;
+        m->points[i].g = 255;
+        m->points[i].b = 255;
+        m->points[i].a = 255;
+     }
+   return m;
+}
+
+static inline Eina_Bool
+_evas_map_copy(Evas_Map *dst, const Evas_Map *src)
+{
+   if (dst->count != src->count)
+     {
+       ERR("cannot copy map of different sizes: dst=%i, src=%i", dst->count, src->count);
+       return EINA_FALSE;
+     }
+   memcpy(dst->points, src->points, src->count * sizeof(Evas_Map_Point));
+   dst->smooth = src->smooth;
+   dst->alpha = src->alpha;
+   return EINA_TRUE;
+}
+
+static inline Evas_Map *
+_evas_map_dup(const Evas_Map *orig)
+{
+   Evas_Map *copy = _evas_map_new(orig->count);
+   if (!copy) return NULL;
+   memcpy(copy->points, orig->points, orig->count * sizeof(Evas_Map_Point));
+   copy->smooth = orig->smooth;
+   copy->alpha = orig->alpha;
+   return copy;
+}
+
+static inline void
+_evas_map_free(Evas_Object *obj, Evas_Map *m)
+{
+   if (obj)
+     {
+        if (m->surface)
+          obj->layer->evas->engine.func->image_map_surface_free
+          (obj->layer->evas->engine.data.output, m->surface);
+     }
+   free(m);
+}
+
+Eina_Bool
+evas_map_coords_get(const Evas_Map *m, Evas_Coord x, Evas_Coord y,
+                    Evas_Coord *mx, Evas_Coord *my, int grab)
+{
+   int i, j, edges, edge[4][2], douv;
+   Evas_Coord xe[2];
+   double u[2] = { 0.0, 0.0 };
+   double v[2] = { 0.0, 0.0 };
+
+   if (m->count != 4) return 0;
+   // FIXME need to handle grab mode and extrapolte coords outside
+   // map
+   if (grab)
+     {
+        Evas_Coord ymin, ymax;
+        
+        ymin = m->points[0].y;
+        ymax = m->points[0].y;
+        for (i = 1; i < m->count; i++)
+          {
+             if (m->points[i].y < ymin) ymin = m->points[i].y; 
+             else if (m->points[i].y > ymax) ymax = m->points[i].y; 
+          }
+        if (y <= ymin) y = ymin + 1;
+        if (y >= ymax) y = ymax - 1;
+     }
+   edges = 0;
+   for (i = 0; i < m->count; i++)
+     {
+        j = (i + 1) % m->count;
+        if ((m->points[i].y <= y) && (m->points[j].y > y))
+          {
+             edge[edges][0] = i;
+             edge[edges][1] = j;
+             edges++;
+          }
+        else if ((m->points[j].y <= y) && (m->points[i].y > y))
+          {
+             edge[edges][0] = j;
+             edge[edges][1] = i;
+             edges++;
+          }
+     }
+   douv = 0;
+   if ((mx) || (my)) douv = 1;
+   for (i = 0; i < (edges - 1); i+= 2)
+     {
+        Evas_Coord yp, yd;
+
+        j = i + 1;
+        yd = m->points[edge[i][1]].y - m->points[edge[i][0]].y;
+        if (yd > 0)
+          {
+             yp = y - m->points[edge[i][0]].y;
+             xe[0] = m->points[edge[i][1]].x - m->points[edge[i][0]].x;
+             xe[0] = m->points[edge[i][0]].x + ((xe[0] * yp) / yd);
+             if (douv)
+               {
+                  u[0] = m->points[edge[i][1]].u - m->points[edge[i][0]].u;
+                  u[0] = m->points[edge[i][0]].u + ((u[0] * yp) / yd);
+                  v[0] = m->points[edge[i][1]].v - m->points[edge[i][0]].v;
+                  v[0] = m->points[edge[i][0]].v + ((v[0] * yp) / yd);
+               }
+          }
+        else
+          {
+             xe[0] = m->points[edge[i][0]].x;
+             if (douv)
+               {
+                  u[0] = m->points[edge[i][0]].u;
+                  v[0] = m->points[edge[i][0]].v;
+               }
+          }
+        yd = m->points[edge[j][1]].y - m->points[edge[j][0]].y;
+        if (yd > 0)
+          {
+             yp = y - m->points[edge[j][0]].y;
+             xe[1] = m->points[edge[j][1]].x - m->points[edge[j][0]].x;
+             xe[1] = m->points[edge[j][0]].x + ((xe[1] * yp) / yd);
+             if (douv)
+               {
+                  u[1] = m->points[edge[j][1]].u - m->points[edge[j][0]].u;
+                  u[1] = m->points[edge[j][0]].u + ((u[1] * yp) / yd);
+                  v[1] = m->points[edge[j][1]].v - m->points[edge[j][0]].v;
+                  v[1] = m->points[edge[j][0]].v + ((v[1] * yp) / yd);
+               }
+          }
+        else
+          {
+             xe[1] = m->points[edge[j][0]].x;
+             if (douv)
+               {
+                  u[1] = m->points[edge[j][0]].u;
+                  v[1] = m->points[edge[j][0]].v;
+               }
+          }
+        if (xe[0] > xe[1])
+          {
+             int ti;
+             
+             ti = xe[0]; xe[0] = xe[1]; xe[1] = ti;
+             if (douv)
+               {
+                  double td;
+                  
+                  td = u[0]; u[0] = u[1]; u[1] = td;
+                  td = v[0]; v[0] = v[1]; v[1] = td;
+               }
+          }
+        if ((x >= xe[0]) && (x < xe[1]))
+          {
+             if (douv)
+               {
+                  if (mx) 
+                    *mx = u[0] + (((x - xe[0]) * (u[1] - u[0])) / 
+                                  (xe[1] - xe[0]));
+                 if (my)
+                    *my = v[0] + (((x - xe[0]) * (v[1] - v[0])) / 
+                                  (xe[1] - xe[0]));
+               }
+             return 1;
+          }
+        if (grab)
+          {
+             if (douv)
+               {
+                  if (mx) 
+                    *mx = u[0] + (((x - xe[0]) * (u[1] - u[0])) / 
+                                  (xe[1] - xe[0]));
+                  if (my)
+                    *my = v[0] + (((x - xe[0]) * (v[1] - v[0])) / 
+                                  (xe[1] - xe[0]));
+               }
+             return 1;
+          }
+     }
+   return 0;
+}
+
+Eina_Bool
+evas_map_inside_get(const Evas_Map *m, Evas_Coord x, Evas_Coord y)
+{
+   return evas_map_coords_get(m, x, y, NULL, NULL, 0);
+}
+
+
+/**
+ * Enable or disable the map that is set.
+ * 
+ * This enables the map that is set or disables it. On enable, the object
+ * geometry will be saved, and the new geometry will change (position and
+ * size) to reflect the map geometry set. If none is set yet, this may be
+ * an undefined geometry, unless you have already set the map with
+ * evas_object_map_set(). It is suggested you first set a map with
+ * evas_object_map_set() with valid useful coordinates then enable and
+ * disable the map with evas_object_map_enable_set() as needed.
+ * 
+ * @param obj object to enable the map on
+ * @param enabled enabled state
+ */
+EAPI void
+evas_object_map_enable_set(Evas_Object *obj, Eina_Bool enabled)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->cur.usemap == !!enabled) return;
+   obj->cur.usemap = !!enabled;
+   if (enabled)
+     {
+        if (!obj->cur.map)
+          obj->cur.map = _evas_map_new(4);
+//        obj->cur.map->normal_geometry = obj->cur.geometry;
+     }
+   else
+     {
+        if (obj->cur.map)
+          {
+             _evas_map_calc_geom_change(obj);
+          }
+     }
+   _evas_map_calc_map_geometry(obj);
+   /* This is a bit heavy handed, but it fixes the case of same geometry, but
+    * changed colour or UV settings. */
+   evas_object_change(obj);
+}
+
+/**
+ * Get the map enabled state
+ * 
+ * This returns the currently enabled state of the map on the object indicated.
+ * The default map enable state is off. You can enable and disable it with
+ * evas_object_map_enable_set().
+ * 
+ * @param obj object to get the map enabled state from
+ * @return the map enabled state
+ */
+EAPI Eina_Bool
+evas_object_map_enable_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   return obj->cur.usemap;
+}
+
+
+/**
+ * Set the map sourc eobject
+ * 
+ * This sets the object from which the map is taken - can be any object that
+ * has map enabled on it.
+ * 
+ * Currently not implemented. for future use.
+ * 
+ * @param obj object to set the map source of
+ * @param src the source object from which the map is taken
+ */
+EAPI void
+evas_object_map_source_set(Evas_Object *obj, Evas_Object *src)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+}
+
+/**
+ * get the map source object
+ * 
+ * See evas_object_map_source_set()
+ * 
+ * @param obj object to set the map source of
+ * @return the object set as the source
+ */
+EAPI Evas_Object *
+evas_object_map_source_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   return NULL;
+}
+
+/**
+ * Set current object transformation map.
+ * 
+ * This sets the map on a given object. It is copied from the @p map pointer,
+ * so there is no need to keep the @p map object if you don't need it anymore.
+ * 
+ * A map is a set of 4 points which have canvas x, y coordinates per point,
+ * with an optional z point value as a hint for perspective correction, if it
+ * is available. As well each point has u and v coordinates. These are like
+ * "texture coordinates" in OpenGL in that they define a point in the source
+ * image that is mapped to that map vertex/point. The u corresponds to the x
+ * coordinate of this mapped point and v, the y coordinate. Note that these
+ * coordinates describe a bounding region to sample. If you have a 200x100
+ * source image and wannt to display it at 200x100 with proper pixel
+ * precision, then do:
+ * 
+ * @code
+ * Evas_Map *m = evas_map_new(4);
+ * evas_map_point_coord_set(m, 0,   0,   0, 0);
+ * evas_map_point_coord_set(m, 1, 200,   0, 0);
+ * evas_map_point_coord_set(m, 2, 200, 100, 0);
+ * evas_map_point_coord_set(m, 3,   0, 100, 0);
+ * evas_map_point_image_uv_set(m, 0,   0,   0);
+ * evas_map_point_image_uv_set(m, 1, 200,   0);
+ * evas_map_point_image_uv_set(m, 2, 200, 100);
+ * evas_map_point_image_uv_set(m, 3,   0, 100);
+ * evas_object_map_set(obj, m);
+ * evas_map_free(m);
+ * @endcode
+ * 
+ * Note that the map points a uv coordinates match the image geometry. If
+ * the @p map parameter is NULL, the sotred map will be freed and geometry
+ * prior to enabling/setting a map will be restored.
+ *
+ * @param obj object to change transformation map
+ * @param map new map to use
+ *
+ * @see evas_map_new()
+ */
+EAPI void
+evas_object_map_set(Evas_Object *obj, const Evas_Map *map)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!map)
+     {
+        if (obj->cur.map)
+          {
+             if (obj->cur.map->surface)
+               {
+                  obj->layer->evas->engine.func->image_map_surface_free
+                    (obj->layer->evas->engine.data.output,
+                     obj->cur.map->surface);
+                  obj->cur.map->surface = NULL;
+               }
+             obj->prev.geometry = obj->cur.map->normal_geometry;
+             if (!obj->prev.map)
+               {
+                 _evas_map_free(obj, obj->cur.map);
+                  obj->cur.map = NULL;
+                  return;
+               }
+             _evas_map_free(obj, obj->cur.map);
+             obj->cur.map = NULL;
+             if (!obj->cur.usemap) _evas_map_calc_geom_change(obj);
+             else _evas_map_calc_map_geometry(obj);
+          }
+        return;
+     }
+   if (!obj->cur.map)
+     {
+        obj->cur.map = _evas_map_dup(map);
+        obj->prev.map = NULL;
+     }
+   else
+     {
+       _evas_map_copy(obj->cur.map, map);
+        obj->prev.map = NULL;
+     }
+   _evas_map_calc_map_geometry(obj);
+}
+
+/**
+ * Get current object transformation map.
+ * 
+ * This returns the current internal map set on the indicated object. It is
+ * intended for read-only acces and is only valid as long as the object is
+ * not deleted or the map on the object is not changed. If you wish to modify
+ * the map and set it back do the following:
+ * 
+ * @code
+ * const Evas_Map *m = evas_object_map_get(obj);
+ * Evas_Map *m2 = evas_map_dup(m);
+ * evas_map_util_rotate(m2, 30.0, 0, 0);
+ * evas_object_map_set(obj);
+ * evas_map_free(m2);
+ * @endcode
+ *
+ * @param obj object to query transformation map.
+ * @return map reference to map in use. This is an internal data structure, so
+ * do not modify it.
+ *
+ * @see evas_object_map_set()
+ */
+EAPI const Evas_Map *
+evas_object_map_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (obj->cur.map) return obj->cur.map;
+   return NULL;
+}
+
+/**
+ * Create map of transformation points to be later used with an evas object.
+ *
+ * This creates a set of points (currently only 4 is supported. no other
+ * number for @p count will work). That is empty and ready to be modified
+ * with evas_map calls.
+ * 
+ * @param count number of points in the map. *
+ * @return a newly allocated map or NULL on errors.
+ *
+ * @see evas_map_free()
+ * @see evas_map_dup()
+ * @see evas_map_point_coord_set()
+ * @see evas_map_point_image_uv_set()
+ * @see evas_map_util_points_populate_from_object_full()
+ * @see evas_map_util_points_populate_from_object()
+ *
+ * @see evas_object_map_set()
+ */
+EAPI Evas_Map *
+evas_map_new(int count)
+{
+   if (count != 4)
+     {
+       ERR("num (%i) != 4 is unsupported!", count);
+       return NULL;
+     }
+   return _evas_map_new(count);
+}
+
+/**
+ * Set the smoothing for map rendering
+ * 
+ * This sets smoothing for map rendering. If the object is a type that has
+ * its own smoothing settings, then both the smooth settings for this object
+ * and the map must be turned off. By default smooth maps are enabled.
+ * 
+ * @param m map to modify. Must not be NULL.
+ * @param enabled enable or disable smooth map rendering
+ */
+EAPI void
+evas_map_smooth_set(Evas_Map *m, Eina_Bool enabled)
+{
+   if (!m) return;
+   m->smooth = enabled;
+}
+
+/**
+ * get the smoothing for map rendering
+ * 
+ * This gets smoothing for map rendering.
+ * 
+ * @param m map to get the smooth from. Must not be NULL.
+ */
+EAPI Eina_Bool
+evas_map_smooth_get(const Evas_Map *m)
+{
+   if (!m) return 0;
+   return m->smooth;
+}
+
+/**
+ * Set the alpha flag for map rendering
+ * 
+ * This sets alpha flag for map rendering. If the object is a type that has
+ * its own alpha settings, then this will take precedence. Only image objects
+ * have this currently. Fits stops alpha blending of the map area, and is
+ * useful if you know the object and/or all sub-objects is 100% solid.
+ * 
+ * @param m map to modify. Must not be NULL.
+ * @param enabled enable or disable alpha map rendering
+ */
+EAPI void
+evas_map_alpha_set(Evas_Map *m, Eina_Bool enabled)
+{
+   if (!m) return;
+   m->alpha = enabled;
+}
+
+/**
+ * get the alpha flag for map rendering
+ * 
+ * This gets the alph flag for map rendering.
+ * 
+ * @param m map to get the alpha from. Must not be NULL.
+ */
+EAPI Eina_Bool
+evas_map_alpha_get(const Evas_Map *m)
+{
+   if (!m) return 0;
+   return m->alpha;
+}
+
+/**
+ * Copy a previously allocated map.
+ * 
+ * This makes a duplicate of the @p m object and returns it.
+ *
+ * @param m map to copy. Must not be NULL.
+ * @return newly allocated map with the same count and contents as @p m.
+ */
+EAPI Evas_Map *
+evas_map_dup(const Evas_Map *m)
+{
+   if (!m) return NULL;
+   return _evas_map_dup(m);
+}
+
+/**
+ * Free a previously allocated map.
+ *
+ * This frees a givem map @p m and all memory associated with it. You must NOT
+ * free a map returned by evas_object_map_get() as this is internal.
+ * 
+ * @param m map to free.
+ */
+EAPI void
+evas_map_free(Evas_Map *m)
+{
+   if (!m) return;
+   _evas_map_free(NULL, m);
+}
+
+/**
+ * Change the map point's coordinate.
+ * 
+ * This sets the fixen point's coordinate in the map. Note that points
+ * describe the outline of a quadrangle and are ordered either clockwise
+ * or anit-clock-wise. It is suggested to keep your quadrangles concave and
+ * non-complex, though these polygon modes may work, they may not render
+ * a desired set of output. The quadrangle will use points 0 and 1 , 1 and 2,
+ * 2 and 3, and 3 and 0 to describe the edges of the quandrangle.
+ * 
+ * The X and Y and Z coordinates are in canvas units. Z is optional and may
+ * or may not be honored in drawing. Z is a hint and does not affect the
+ * X and Y rendered coordinates. It may be used for calculating fills with
+ * perspective correct rendering.
+ * 
+ * Remember all coordinates are canvas global ones like with move and reize
+ * in evas.
+ *
+ * @param m map to change point. Must not be @c NULL.
+ * @param idx index of point to change. Must be smaller than map size.
+ * @param x Point X Coordinate
+ * @param y Point Y Coordinate
+ * @param z Point Z Coordinate hint (pre-perspective transform)
+ *
+ * @see evas_map_util_rotate()
+ * @see evas_map_util_zoom()
+ * @see evas_map_util_points_populate_from_object_full()
+ * @see evas_map_util_points_populate_from_object()
+ */
+EAPI void
+evas_map_point_coord_set(Evas_Map *m, int idx, Evas_Coord x, Evas_Coord y, Evas_Coord z)
+{
+   Evas_Map_Point *p;
+   if (!m) return;
+   if (idx >= m->count) return;
+   p = m->points + idx;
+   p->x = x;
+   p->y = y;
+   p->z = z;
+}
+
+/**
+ * Get the map point's coordinate.
+ * 
+ * This returns the coordinates of the given point in the map.
+ *
+ * @param m map to query point.
+ * @param idx index of point to query. Must be smaller than map size.
+ * @param x where to return the X coordinate.
+ * @param y where to return the Y coordinate.
+ * @param z where to return the Z coordinate.
+ */
+EAPI void
+evas_map_point_coord_get(const Evas_Map *m, int idx, Evas_Coord *x, Evas_Coord *y, Evas_Coord *z)
+{
+   const Evas_Map_Point *p;
+   
+   if (!m) goto error;
+   if (idx >= m->count) goto error;
+   p = m->points + idx;
+   if (x) *x = p->x;
+   if (y) *y = p->y;
+   if (z) *z = p->z;
+   return;
+
+ error:
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (z) *z = 0;
+}
+
+/**
+ * Change the map point's U and V texture source point
+ *
+ * This sets the U and V coordinates for the point. This determines which
+ * coordinate in the source image is mapped to the given point, much like
+ * OpenGL and textures. Notes that these points do select the pixel, but
+ * are double floating point values to allow for accuracy and sub-pixel
+ * selection.
+ * 
+ * @param m map to change the point of.
+ * @param idx index of point to change. Must be smaller than map size.
+ * @param u the X coordinate within the image/texture source
+ * @param v the Y coordinate within the image/texture source
+ * 
+ * @see evas_map_point_coord_set()
+ * @see evas_object_map_set()
+ * @see evas_map_util_points_populate_from_object_full()
+ * @see evas_map_util_points_populate_from_object()
+ */
+EAPI void
+evas_map_point_image_uv_set(Evas_Map *m, int idx, double u, double v)
+{
+   Evas_Map_Point *p;
+   if (!m) return;
+   if (idx >= m->count) return;
+   p = m->points + idx;
+   p->u = u;
+   p->v = v;
+}
+
+/**
+ * Get the map point's U and V texture source points
+ *
+ * This returns the texture points set by evas_map_point_image_uv_set().
+ * 
+ * @param m map to query point.
+ * @param idx index of point to query. Must be smaller than map size.
+ * @param u where to write the X coordinate within the image/texture source
+ * @param v where to write the Y coordinate within the image/texture source
+ */
+EAPI void
+evas_map_point_image_uv_get(const Evas_Map *m, int idx, double *u, double *v)
+{
+   const Evas_Map_Point *p;
+   if (!m) goto error;
+   if (idx >= m->count) goto error;
+   p = m->points + idx;
+   if (u) *u = p->u;
+   if (v) *v = p->v;
+   return;
+
+ error:
+   if (u) *u = 0.0;
+   if (v) *v = 0.0;
+}
+
+/**
+ * Set the color of a vertex in the map
+ *
+ * This sets the color of the vertex in the map. Colors will be linearly
+ * interpolated between vertex points through the map. Color will multiply
+ * the "texture" pixels (like GL_MODULATE in OpenGL). The default color of
+ * a vertex in a map is white solid (255, 255, 255, 255) which means it will
+ * have no affect on modifying the texture pixels.
+ * 
+ * @param m map to change the color of.
+ * @param idx index of point to change. Must be smaller than map size.
+ * @param r red (0 - 255)
+ * @param g green (0 - 255)
+ * @param b blue (0 - 255)
+ * @param a alpha (0 - 255)
+ *
+ * @see evas_map_util_points_color_set()
+ * @see evas_map_point_coord_set()
+ * @see evas_object_map_set()
+ */
+EAPI void
+evas_map_point_color_set(Evas_Map *m, int idx, int r, int g, int b, int a)
+{
+   Evas_Map_Point *p;
+   if (!m) return;
+   if (idx >= m->count) return;
+   p = m->points + idx;
+   p->r = r;
+   p->g = g;
+   p->b = b;
+   p->a = a;
+}
+
+/**
+ * Get the color set on a vertex in the map
+ *
+ * This gets the color set by evas_map_point_color_set() on the given vertex
+ * of the map.
+ * 
+ * @param m map to get the color of the vertex from.
+ * @param idx index of point get. Must be smaller than map size.
+ * @param r pointer to red return
+ * @param g pointer to green return
+ * @param b pointer to blue return
+ * @param a pointer to alpha return (0 - 255)
+ * 
+ * @see evas_map_point_coord_set()
+ * @see evas_object_map_set()
+ */
+EAPI void
+evas_map_point_color_get(const Evas_Map *m, int idx, int *r, int *g, int *b, int *a)
+{
+   const Evas_Map_Point *p;
+   if (!m) return;
+   if (idx >= m->count) return;
+   p = m->points + idx;
+   if (r) *r = p->r;
+   if (g) *g = p->g;
+   if (b) *b = p->b;
+   if (a) *a = p->a;
+}
+
+/****************************************************************************/
+/* util functions for manipulating maps, so you don't need to know the math */
+/****************************************************************************/
+static inline void
+_evas_map_util_points_populate(Evas_Map *m, const Evas_Coord x, const Evas_Coord y, const Evas_Coord w, const Evas_Coord h, const Evas_Coord z)
+{
+   Evas_Map_Point *p = m->points;
+
+   p[0].x = x;
+   p[0].y = y;
+   p[0].z = z;
+   p[0].u = 0.0;
+   p[0].v = 0.0;
+
+   p[1].x = x + w;
+   p[1].y = y;
+   p[1].z = z;
+   p[1].u = w;
+   p[1].v = 0.0;
+
+   p[2].x = x + w;
+   p[2].y = y + h;
+   p[2].z = z;
+   p[2].u = w;
+   p[2].v = h;
+
+   p[3].x = x;
+   p[3].y = y + h;
+   p[3].z = z;
+   p[3].u = 0.0;
+   p[3].v = h;
+}
+
+/**
+ * Populate source and destination map points to match exactly object.
+ *
+ * Usually one initialize map of an object to match it's original
+ * position and size, then transform these with evas_map_util_*
+ * functions, such as evas_map_util_rotate() or
+ * evas_map_util_3d_rotate(). The original set is done by this
+ * function, avoiding code duplication all around.
+ *
+ * @param m map to change all 4 points (must be of size 4).
+ * @param obj object to use unmapped geometry to populate map coordinates.
+ * @param z Point Z Coordinate hint (pre-perspective transform). This value
+ *        will be used for all four points.
+ *
+ * @see evas_map_util_points_populate_from_object()
+ * @see evas_map_point_coord_set()
+ * @see evas_map_point_image_uv_set()
+ */
+EAPI void
+evas_map_util_points_populate_from_object_full(Evas_Map *m, const Evas_Object *obj, Evas_Coord z)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!m)
+     {
+       ERR("map == NULL");
+       return;
+     }
+   if (m->count != 4)
+     {
+       ERR("map has count=%d where 4 was expected.", m->count);
+       return;
+     }
+   _evas_map_util_points_populate(m, obj->cur.geometry.x, obj->cur.geometry.y,
+                                 obj->cur.geometry.w, obj->cur.geometry.h, z);
+}
+
+/**
+ * Populate source and destination map points to match exactly object.
+ *
+ * Usually one initialize map of an object to match it's original
+ * position and size, then transform these with evas_map_util_*
+ * functions, such as evas_map_util_rotate() or
+ * evas_map_util_3d_rotate(). The original set is done by this
+ * function, avoiding code duplication all around.
+ *
+ * Z Point coordinate is assumed as 0 (zero).
+ *
+ * @param m map to change all 4 points (must be of size 4).
+ * @param obj object to use unmapped geometry to populate map coordinates.
+ *
+ * @see evas_map_util_points_populate_from_object_full()
+ * @see evas_map_util_points_populate_from_geometry()
+ * @see evas_map_point_coord_set()
+ * @see evas_map_point_image_uv_set()
+ */
+EAPI void
+evas_map_util_points_populate_from_object(Evas_Map *m, const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!m)
+     {
+       ERR("map == NULL");
+       return;
+     }
+   if (m->count != 4)
+     {
+       ERR("map has count=%d where 4 was expected.", m->count);
+       return;
+     }
+   _evas_map_util_points_populate(m, obj->cur.geometry.x, obj->cur.geometry.y,
+                                 obj->cur.geometry.w, obj->cur.geometry.h, 0);
+}
+
+/**
+ * Populate source and destination map points to match given geometry.
+ *
+ * Similar to evas_map_util_points_populate_from_object_full(), this
+ * call takes raw values instead of querying object's unmapped
+ * geometry. The given width will be used to calculate destination
+ * points (evas_map_point_coord_set()) and set the image uv
+ * (evas_map_point_image_uv_set()).
+ *
+ * @param m map to change all 4 points (must be of size 4).
+ * @param x Point X Coordinate
+ * @param y Point Y Coordinate
+ * @param w width to use to calculate second and third points.
+ * @param h height to use to calculate third and fourth points.
+ * @param z Point Z Coordinate hint (pre-perspective transform). This value
+ *        will be used for all four points.
+ *
+ * @see evas_map_util_points_populate_from_object()
+ * @see evas_map_point_coord_set()
+ * @see evas_map_point_image_uv_set()
+ */
+EAPI void
+evas_map_util_points_populate_from_geometry(Evas_Map *m, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Evas_Coord z)
+{
+   if (!m)
+     {
+       ERR("map == NULL");
+       return;
+     }
+   if (m->count != 4)
+     {
+       ERR("map has count=%d where 4 was expected.", m->count);
+       return;
+     }
+   _evas_map_util_points_populate(m, x, y, w, h, z);
+}
+
+/**
+ * Set color of all points to given color.
+ *
+ * This call is useful to reuse maps after they had 3d lightning or
+ * any other colorization applied before.
+ *
+ * @param m map to change the color of.
+ * @param r red (0 - 255)
+ * @param g green (0 - 255)
+ * @param b blue (0 - 255)
+ * @param a alpha (0 - 255)
+ *
+ * @see evas_map_point_color_set()
+ */
+EAPI void
+evas_map_util_points_color_set(Evas_Map *m, int r, int g, int b, int a)
+{
+   Evas_Map_Point *p, *p_end;
+   if (!m)
+     {
+       ERR("map == NULL");
+       return;
+     }
+   p = m->points;
+   p_end = p + m->count;
+   for (; p < p_end; p++)
+     {
+       p->r = r;
+       p->g = g;
+       p->b = b;
+       p->a = a;
+     }
+}
+
+/**
+ * Change the map to apply the given rotation.
+ * 
+ * This rotates the indicated map's coordinates around the center coordinate
+ * given by @p cx and @p cy as the rotation center. The points will have their
+ * X and Y coordinates rotated clockwise by @p degrees degress (360.0 is a
+ * full rotation). Negative values for degrees will rotate counter-clockwise
+ * by that amount. All coordinates are canvas global coordinates.
+ *
+ * @param m map to change.
+ * @param degrees amount of degrees from 0.0 to 360.0 to rotate.
+ * @param cx rotation's center horizontal positon.
+ * @param cy rotation's center vertical positon.
+ *
+ * @see evas_map_point_coord_set()
+ * @see evas_map_util_zoom()
+ */
+EAPI void
+evas_map_util_rotate(Evas_Map *m, double degrees, Evas_Coord cx, Evas_Coord cy)
+{
+   double r = (degrees * M_PI) / 180.0;
+   Evas_Map_Point *p, *p_end;
+
+   if (!m) return;
+   p = m->points;
+   p_end = p + m->count;
+
+   for (; p < p_end; p++)
+     {
+        Evas_Coord x, y, xx, yy;
+
+        xx = x = p->x - cx;
+        yy = y = p->y - cy;
+
+        xx = (x * cos(r));
+        yy = (x * sin(r));
+        x = xx + (y * cos(r + (M_PI / 2.0)));
+        y = yy + (y * sin(r + (M_PI / 2.0)));
+
+        p->x = x + cx;
+        p->y = y + cy;
+     }
+}
+
+/**
+ * Change the map to apply the given zooming.
+ *
+ * Like evas_map_util_rotate(), this zooms the points of the map from a center
+ * point. That center is defined by @p cx and @p cy. The @p zoomx and @p zoomy
+ * parameters specific how much to zoom in the X and Y direction respectively.
+ * A value of 1.0 means "don't zoom". 2.0 means "dobule the size". 0.5 is
+ * "half the size" etc. All coordinates are canvas global coordinates.
+ * 
+ * @param m map to change.
+ * @param zoomx horizontal zoom to use.
+ * @param zoomy vertical zoom to use.
+ * @param cx zooming center horizontal positon.
+ * @param cy zooming center vertical positon.
+ *
+ * @see evas_map_point_coord_set()
+ * @see evas_map_util_rotate()
+ */
+EAPI void
+evas_map_util_zoom(Evas_Map *m, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
+{
+   Evas_Map_Point *p, *p_end;
+
+   if (!m) return;
+   p = m->points;
+   p_end = p + m->count;
+
+   for (; p < p_end; p++)
+     {
+        Evas_Coord x, y;
+
+        x = p->x - cx;
+        y = p->y - cy;
+
+        x = (((double)x) * zoomx);
+        y = (((double)y) * zoomy);
+
+        p->x = x + cx;
+        p->y = y + cy;
+     }
+}
+
+/**
+ * Rotate the map around 3 axes in 3D
+ * 
+ * This will rotate not just around the "Z" axis as in evas_map_util_rotate()
+ * (which is a convenience call for those only wanting 2D). This will rotate
+ * around the X, Y and Z axes. The Z axis points "into" the screen with low
+ * values at the screen and higher values further away. The X axis runs from
+ * left to right on the screen and the Y axis from top to bottom. Like with
+ * evas_map_util_rotate(0 you provide a center point to rotate around (in 3D).
+ *
+ * @param m map to change.
+ * @param dx amount of degrees from 0.0 to 360.0 to rotate arount X axis.
+ * @param dy amount of degrees from 0.0 to 360.0 to rotate arount Y axis.
+ * @param dz amount of degrees from 0.0 to 360.0 to rotate arount Z axis.
+ * @param cx rotation's center horizontal positon.
+ * @param cy rotation's center vertical positon.
+ * @param cz rotation's center vertical positon.
+ */
+EAPI void
+evas_map_util_3d_rotate(Evas_Map *m, double dx, double dy, double dz, 
+                        Evas_Coord cx, Evas_Coord cy, Evas_Coord cz)
+{
+   double rz = (dz * M_PI) / 180.0;
+   double rx = (dx * M_PI) / 180.0;
+   double ry = (dy * M_PI) / 180.0;
+   Evas_Map_Point *p, *p_end;
+
+   if (!m) return;
+   p = m->points;
+   p_end = p + m->count;
+
+   for (; p < p_end; p++)
+     {
+        double x, y, z, xx, yy, zz;
+
+        x = p->x - cx;
+        y = p->y - cy;
+        z = p->z - cz;
+        
+        if (rz != 0.0)
+          {
+             xx = x * cos(rz);
+             yy = x * sin(rz);
+             x = xx + (y * cos(rz + M_PI_2));
+             y = yy + (y * sin(rz + M_PI_2));
+          }
+
+        if (ry != 0.0)
+          {
+             xx = x * cos(ry);
+             zz = x * sin(ry);
+             x = xx + (z * cos(ry + M_PI_2));
+             z = zz + (z * sin(ry + M_PI_2));
+          }
+        
+        if (rx != 0.0)
+          {
+             zz = z * cos(rx);
+             yy = z * sin(rx);
+             z = zz + (y * cos(rx + M_PI_2));
+             y = yy + (y * sin(rx + M_PI_2));
+          }
+        
+        p->x = x + cx;
+        p->y = y + cy;
+        p->z = z + cz;
+     }
+}
+
+/**
+ * Perform lighting calculations on the given Map
+ * 
+ * This is used to apply lighting calculations (from a single light source)
+ * to a given map. The R, G and B values of each vertex will be modified to
+ * reflect the lighting based on the lixth point coordinates, the light
+ * color and the ambient color, and at what angle the map is facing the
+ * light source. A surface should have its points be declared in a
+ * clockwise fashion if the face is "facing" towards you (as opposed to
+ * away from you) as faces have a "logical" side for lighting.
+ *
+ * @param m map to change.
+ * @param lx X coordinate in space of light point
+ * @param ly Y coordinate in space of light point
+ * @param lz Z coordinate in space of light point
+ * @param lr light red value (0 - 255)
+ * @param lg light green value (0 - 255)
+ * @param lb light blue value (0 - 255)
+ * @param ar ambient color red value (0 - 255)
+ * @param ag ambient color green value (0 - 255)
+ * @param ab ambient color blue value (0 - 255)
+ */
+EAPI void
+evas_map_util_3d_lighting(Evas_Map *m, 
+                          Evas_Coord lx, Evas_Coord ly, Evas_Coord lz,
+                          int lr, int lg, int lb, int ar, int ag, int ab)
+{
+   int i;
+   
+   if (!m) return;
+   
+   for (i = 0; i < m->count; i++)
+     {
+        double x, y, z;
+        double nx, ny, nz, x1, y1, z1, x2, y2, z2, ln, br;
+        int h, j, mr, mg, mb;
+        
+        x = m->points[i].x;
+        y = m->points[i].y;
+        z = m->points[i].z;
+        
+        // calc normal
+        h = (i + m->count - 1) % m->count; // prev point
+        j = (i + 1) % m->count; // next point
+
+        x1 = m->points[h].x - x;
+        y1 = m->points[h].y - y;
+        z1 = m->points[h].z - z;
+        
+        x2 = m->points[j].x - x;
+        y2 = m->points[j].y - y;
+        z2 = m->points[j].z - z;
+        
+        nx = (y1 * z2) - (z1 * y2);
+        ny = (z1 * x2) - (x1 * z2);
+        nz = (x1 * y2) - (y1 * x2);
+        
+        ln = (nx * nx) + (ny * ny) + (nz * nz);
+        ln = sqrt(ln);
+        
+        if (ln != 0.0)
+          {
+             nx /= ln;
+             ny /= ln;
+             nz /= ln;
+          }
+        
+        // calc point -> light vector
+        x = lx - x;
+        y = ly - y;
+        z = lz - z;
+        
+        ln = (x * x) + (y * y) + (z * z);
+        ln = sqrt(ln);
+        
+        if (ln != 0.0)
+          {
+             x /= ln;
+             y /= ln;
+             z /= ln;
+          }
+        
+        // brightness - tan (0.0 -> 1.0 brightness really)
+        br = (nx * x) + (ny * y) + (nz * z);
+        if (br < 0.0) br = 0.0;
+        
+        mr = ar + ((lr - ar) * br);
+        mg = ag + ((lg - ag) * br);
+        mb = ab + ((lb - ab) * br);
+        mr = (mr * m->points[i].a) / 255;
+        mg = (mg * m->points[i].a) / 255;
+        mb = (mb * m->points[i].a) / 255;
+        m->points[i].r = (m->points[i].r * mr) / 255;
+        m->points[i].g = (m->points[i].g * mg) / 255;
+        m->points[i].b = (m->points[i].b * mb) / 255;
+     }
+}
+
+/**
+ * Apply a perspective transform to the map
+ * 
+ * This applies a given perspective (3D) to the map coordinates. X, Y and Z
+ * values are used. The px and py points specify the "infinite distance" point
+ * in the 3D conversion (where all lines converge to like when artists draw
+ * 3D by hand). The @p z0 value specifis the z value at which there is a 1:1
+ * mapping between spatial coorinates and screen coordinates. Any points
+ * on this z value will not have their X and Y values modified in the transform.
+ * Those further away (Z value higher) will shrink into the distance, and
+ * those less than this value will expand and become bigger. The @p foc value
+ * determines the "focal length" of the camera. This is in reality the distance
+ * between the camera lens plane itself (at or closer than this rendering
+ * results are undefined) and the "z0" z value. This allows for some "depth"
+ * control and @p foc must be greater than 0.
+ *
+ * @param m map to change.
+ * @param px The pespective distance X coordinate
+ * @param py The pespective distance Y coordinate
+ * @param z0 The "0" z plane value
+ * @param foc The focal distance
+ */
+EAPI void
+evas_map_util_3d_perspective(Evas_Map *m,
+                             Evas_Coord px, Evas_Coord py,
+                             Evas_Coord z0, Evas_Coord foc)
+{
+   Evas_Map_Point *p, *p_end;
+
+   if (!m) return;
+   p = m->points;
+   p_end = p + m->count;
+
+   for (; p < p_end; p++)
+     {
+        Evas_Coord x, y, zz;
+
+        if (foc > 0)
+          {
+             x = p->x - px;
+             y = p->y - py;
+             
+             zz = ((p->z - z0) + foc);
+             
+             if (zz > 0)
+               {
+                  x = (x * foc) / zz;
+                  y = (y * foc) / zz;
+               }
+             
+             p->x = px + x;
+             p->y = py + y;
+          }
+     }
+}
+
+/**
+ * Get the clockwise state of a map
+ * 
+ * This determines if the output points (X and Y. Z is not used) are
+ * clockwise or anti-clockwise. This can be used for "back-face culling". This
+ * is where you hide objects that "face away" from you. In this case objects
+ * that are not clockwise.
+ *
+ * @param m map to query.
+ * @return 1 if clockwise, 0 otherwise
+ */
+EAPI Eina_Bool
+evas_map_util_clockwise_get(Evas_Map *m)
+{
+   int i, j, k, count;
+   long long c;
+   
+   if (!m) return 0;
+   if (m->count < 3) return 0;
+   
+   count = 0;
+   for (i = 0; i < m->count; i++)
+     {
+        j = (i + 1) % m->count; 
+        k = (i + 2) % m->count;
+        c = 
+          ((m->points[j].x - m->points[i].x) *
+           (m->points[k].y - m->points[j].y))
+          -
+          ((m->points[j].y - m->points[i].y) *
+           (m->points[k].x - m->points[j].x));
+        if (c < 0) count--;
+        else if (c > 0) count++;
+     }
+   if (count > 0) return 1;
+   return 0;
+}
+
+/**
+ * @}
+ */
diff --git a/src/lib/canvas/evas_name.c b/src/lib/canvas/evas_name.c
new file mode 100644 (file)
index 0000000..f5e204b
--- /dev/null
@@ -0,0 +1,68 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/**
+ * @addtogroup Evas_Object_Group_Basic
+ * @{
+ */
+
+/**
+ * Sets the name of the given evas object to the given name.
+ * @param   obj  The given object.
+ * @param   name The given name.
+ */
+EAPI void
+evas_object_name_set(Evas_Object *obj, const char *name)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->name)
+     {
+       eina_hash_del(obj->layer->evas->name_hash, obj->name, obj);
+       free(obj->name);
+     }
+   if (!name) obj->name = NULL;
+   else
+     {
+       obj->name = strdup(name);
+       eina_hash_add(obj->layer->evas->name_hash, obj->name, obj);
+     }
+}
+
+/**
+ * Retrieves the name of the given evas object.
+ * @param   obj The given object.
+ * @return  The name of the object.  @c NULL if no name has been given
+ *          to the object.
+ */
+EAPI const char *
+evas_object_name_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   return obj->name;
+}
+
+/**
+ * @}
+ */
+
+/**
+ * Retrieves the object on the given evas with the given name.
+ * @param   e    The given evas.
+ * @param   name The given name.
+ * @return  If successful, the evas object with the given name.  Otherwise,
+ *          @c NULL.
+ * @ingroup Evas_Object_Group_Find
+ */
+EAPI Evas_Object *
+evas_object_name_find(const Evas *e, const char *name)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!name) return NULL;
+   return (Evas_Object *)eina_hash_find(e->name_hash, name);
+}
diff --git a/src/lib/canvas/evas_object_box.c b/src/lib/canvas/evas_object_box.c
new file mode 100644 (file)
index 0000000..c2fa14b
--- /dev/null
@@ -0,0 +1,2429 @@
+#include "evas_common.h"
+
+typedef struct _Evas_Object_Box_Iterator Evas_Object_Box_Iterator;
+typedef struct _Evas_Object_Box_Accessor Evas_Object_Box_Accessor;
+
+struct _Evas_Object_Box_Iterator
+{
+   Eina_Iterator iterator;
+
+   Eina_Iterator *real_iterator;
+   const Evas_Object *box;
+};
+
+struct _Evas_Object_Box_Accessor
+{
+   Eina_Accessor accessor;
+
+   Eina_Accessor *real_accessor;
+   const Evas_Object *box;
+};
+
+/**
+ * @addtogroup Evas_Object_Box
+ * @{
+ */
+
+static const char _evas_object_box_type[] = "Evas_Object_Box";
+
+#define EVAS_OBJECT_BOX_DATA_GET(o, ptr)                       \
+  Evas_Object_Box_Data *ptr = evas_object_smart_data_get(o)
+
+#define EVAS_OBJECT_BOX_DATA_GET_OR_RETURN(o, ptr)                     \
+  EVAS_OBJECT_BOX_DATA_GET(o, ptr);                                    \
+  if (!ptr)                                                            \
+    {                                                                  \
+       CRIT("no widget data for object %p (%s)",       \
+               o, evas_object_type_get(o));                            \
+       fflush(stderr);                                                 \
+       abort();                                                                \
+       return;                                                         \
+}
+
+#define EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, ptr, val)            \
+  EVAS_OBJECT_BOX_DATA_GET(o, ptr);                                    \
+  if (!ptr)                                                            \
+    {                                                                  \
+       CRIT("no widget data for object %p (%s)",       \
+              o, evas_object_type_get(o));                             \
+       fflush(stderr);                                                 \
+       abort();                                                                \
+       return val;                                                     \
+    }
+
+EVAS_SMART_SUBCLASS_NEW(_evas_object_box_type, _evas_object_box,
+                       Evas_Object_Box_Api, Evas_Smart_Class,
+                       evas_object_smart_clipped_class_get, NULL)
+
+static Eina_Bool
+_evas_object_box_iterator_next(Evas_Object_Box_Iterator *it, void **data)
+{
+   Evas_Object_Box_Option *opt;
+
+   if (!eina_iterator_next(it->real_iterator, (void **)&opt))
+     return EINA_FALSE;
+   if (data) *data = opt->obj;
+   return EINA_TRUE;
+}
+
+static Evas_Object *
+_evas_object_box_iterator_get_container(Evas_Object_Box_Iterator *it)
+{
+   return (Evas_Object *)it->box;
+}
+
+static void
+_evas_object_box_iterator_free(Evas_Object_Box_Iterator *it)
+{
+   eina_iterator_free(it->real_iterator);
+   free(it);
+}
+
+static Eina_Bool
+_evas_object_box_accessor_get_at(Evas_Object_Box_Accessor *it, unsigned int index, void **data)
+{
+   Evas_Object_Box_Option *opt = NULL;
+
+   if (!eina_accessor_data_get(it->real_accessor, index, (void *)&opt))
+     return EINA_FALSE;
+   if (data) *data = opt->obj;
+   return EINA_TRUE;
+}
+
+static Evas_Object *
+_evas_object_box_accessor_get_container(Evas_Object_Box_Accessor *it)
+{
+   return (Evas_Object *)it->box;
+}
+
+static void
+_evas_object_box_accessor_free(Evas_Object_Box_Accessor *it)
+{
+   eina_accessor_free(it->real_accessor);
+   free(it);
+}
+
+static void
+_on_child_resize(void *data, Evas *evas __UNUSED__, Evas_Object *o __UNUSED__, void *einfo __UNUSED__)
+{
+   Evas_Object *box = data;
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN(box, priv);
+   if (!priv->layouting) evas_object_smart_changed(box);
+}
+
+static void
+_on_child_del(void *data, Evas *evas __UNUSED__, Evas_Object *o, void *einfo __UNUSED__)
+{
+   const Evas_Object_Box_Api *api;
+   Evas_Object *box = data;
+
+   EVAS_OBJECT_BOX_DATA_GET(box, priv);
+   api = priv->api;
+
+   if ((!api) || (!api->remove))
+     {
+       fputs("no api->remove\n", stderr);
+       return;
+     }
+
+   if (!api->remove(box, priv, o))
+     fputs("child removal failed\n", stderr);
+   evas_object_smart_changed(box);
+}
+
+static void
+_on_child_hints_changed(void *data, Evas *evas __UNUSED__, Evas_Object *o __UNUSED__, void *einfo __UNUSED__)
+{
+   Evas_Object *box = data;
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN(box, priv);
+   if (!priv->layouting) evas_object_smart_changed(box);
+}
+
+static Evas_Object_Box_Option *
+_evas_object_box_option_new(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child)
+{
+   Evas_Object_Box_Option *opt;
+   const Evas_Object_Box_Api *api;
+
+   api = priv->api;
+   if ((!api) || (!api->option_new))
+     {
+       fputs("no api->option_new\n", stderr);
+       return NULL;
+     }
+
+   opt = api->option_new(o, priv, child);
+   if (!opt)
+     {
+       fputs("option_new failed\n", stderr);
+       return NULL;
+     }
+
+   return opt;
+}
+
+static void
+_evas_object_box_child_callbacks_unregister(Evas_Object *obj)
+{
+   evas_object_event_callback_del
+     (obj, EVAS_CALLBACK_RESIZE, _on_child_resize);
+   evas_object_event_callback_del
+     (obj, EVAS_CALLBACK_FREE, _on_child_del);
+   evas_object_event_callback_del
+     (obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _on_child_hints_changed);
+}
+
+static Evas_Object_Box_Option *
+_evas_object_box_option_callbacks_register(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object_Box_Option *opt)
+{
+   const Evas_Object_Box_Api *api;
+   Evas_Object *obj = opt->obj;
+
+   api = priv->api;
+
+   if ((!api) || (!api->option_free))
+     {
+       fputs("WARNING: api->option_free not set (may cause memory leaks,"
+             " segfaults)\n", stderr);
+        return NULL;
+     }
+
+   evas_object_event_callback_add
+     (obj, EVAS_CALLBACK_RESIZE, _on_child_resize, o);
+   evas_object_event_callback_add
+     (obj, EVAS_CALLBACK_FREE, _on_child_del, o);
+   evas_object_event_callback_add
+     (obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _on_child_hints_changed, o);
+
+   return opt;
+}
+
+static Evas_Object_Box_Option *
+_evas_object_box_option_new_default(Evas_Object *o __UNUSED__, Evas_Object_Box_Data *priv __UNUSED__, Evas_Object *child)
+{
+   Evas_Object_Box_Option *opt;
+
+   opt = (Evas_Object_Box_Option *)malloc(sizeof(*opt));
+   if (!opt)
+     return NULL;
+
+   opt->obj = child;
+
+   return opt;
+}
+
+static void
+_evas_object_box_option_free_default(Evas_Object *o __UNUSED__, Evas_Object_Box_Data *priv __UNUSED__, Evas_Object_Box_Option *opt)
+{
+   free(opt);
+}
+
+static Evas_Object_Box_Option *
+_evas_object_box_append_default(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child)
+{
+   Evas_Object_Box_Option *opt;
+
+   opt = _evas_object_box_option_new(o, priv, child);
+   if (!opt)
+     return NULL;
+
+   priv->children = eina_list_append(priv->children, opt);
+
+   return opt;
+}
+
+static Evas_Object_Box_Option *
+_evas_object_box_prepend_default(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child)
+{
+   Evas_Object_Box_Option *opt;
+
+   opt = _evas_object_box_option_new(o, priv, child);
+   if (!opt)
+     return NULL;
+
+   priv->children = eina_list_prepend(priv->children, opt);
+
+   return opt;
+}
+
+static Evas_Object_Box_Option *
+_evas_object_box_insert_before_default(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child, const Evas_Object *reference)
+{
+   Eina_List *l;
+   Evas_Object_Box_Option *opt;
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+        if (opt->obj == reference)
+         {
+            Evas_Object_Box_Option *new_opt;
+
+            new_opt = _evas_object_box_option_new(o, priv, child);
+            if (!new_opt)
+              return NULL;
+
+            priv->children = eina_list_prepend_relative
+              (priv->children, new_opt, opt);
+            return new_opt;
+         }
+     }
+
+   return NULL;
+}
+
+static Evas_Object_Box_Option *
+_evas_object_box_insert_after_default(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child, const Evas_Object *reference)
+{
+   Eina_List *l;
+   Evas_Object_Box_Option *opt;
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+       if (opt->obj == reference)
+         {
+            Evas_Object_Box_Option *new_opt;
+
+            new_opt = _evas_object_box_option_new(o, priv, child);
+            if (!new_opt)
+              return NULL;
+
+            priv->children = eina_list_append_relative
+               (priv->children, new_opt, opt);
+            return new_opt;
+         }
+     }
+
+   return NULL;
+}
+
+static Evas_Object_Box_Option *
+_evas_object_box_insert_at_default(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child, unsigned int pos)
+{
+   Eina_List *l;
+   unsigned int i;
+
+   if ((pos == 0) && (eina_list_count(priv->children) == 0))
+     {
+        Evas_Object_Box_Option *new_opt;
+
+        new_opt = _evas_object_box_option_new(o, priv, child);
+        if (!new_opt)
+         return NULL;
+
+        priv->children = eina_list_prepend(priv->children, new_opt);
+        return new_opt;
+     }
+
+   for (l = priv->children, i = 0; l != NULL; l = l->next, i++)
+     {
+       Evas_Object_Box_Option *opt = l->data;
+
+        if (i == pos)
+         {
+            Evas_Object_Box_Option *new_opt;
+
+            new_opt = _evas_object_box_option_new(o, priv, child);
+            if (!new_opt)
+              return NULL;
+
+            priv->children = eina_list_prepend_relative
+              (priv->children, new_opt, opt);
+            return new_opt;
+         }
+     }
+
+   return NULL;
+}
+
+static Evas_Object *
+_evas_object_box_remove_default(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child)
+{
+   const Evas_Object_Box_Api *api;
+   Evas_Object_Box_Option *opt;
+   Eina_List *l;
+
+   api = priv->api;
+
+   if ((!api) || (!api->option_free))
+     {
+       fputs("WARNING: api->option_free not set (may cause memory leaks,"
+             " segfaults)\n", stderr);
+       return NULL;
+     }
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+        Evas_Object *obj = opt->obj;
+
+        if (obj == child)
+         {
+            priv->children = eina_list_remove(priv->children, opt);
+            api->option_free(o, priv, opt);
+
+            return obj;
+         }
+     }
+
+   return NULL;
+}
+
+static Evas_Object *
+_evas_object_box_remove_at_default(Evas_Object *o, Evas_Object_Box_Data *priv, unsigned int pos)
+{
+   const Evas_Object_Box_Api *api;
+   Eina_List *node;
+   Evas_Object_Box_Option *opt;
+   Evas_Object *obj;
+
+   api = priv->api;
+
+   if ((!api) || (!api->option_free))
+     {
+       WRN("api->option_free not set (may cause memory leaks,"
+             " segfaults)\n");
+        return NULL;
+     }
+
+   node = eina_list_nth_list(priv->children, pos);
+   if (!node)
+     {
+       ERR("No item to be removed at position %d\n", pos);
+       return NULL;
+     }
+
+   opt = node->data;
+   obj = opt->obj;
+
+   priv->children = eina_list_remove_list(priv->children, node);
+   api->option_free(o, priv, opt);
+   return obj;
+}
+
+static void
+_evas_object_box_smart_add(Evas_Object *o)
+{
+   Evas_Object_Box_Data *priv;
+
+   priv = evas_object_smart_data_get(o);
+   if (!priv)
+     {
+        const Evas_Smart *smart;
+        const Evas_Smart_Class *sc;
+
+       priv = (Evas_Object_Box_Data *)calloc(1, sizeof(*priv));
+       if (!priv)
+         {
+            ERR("Could not allocate object private data.\n");
+            return;
+         }
+
+        smart = evas_object_smart_smart_get(o);
+        sc = evas_smart_class_get(smart);
+        priv->api = (const Evas_Object_Box_Api *)sc;
+
+       evas_object_smart_data_set(o, priv);
+     }
+   _evas_object_box_parent_sc->add(o);
+
+   priv->children = NULL;
+   priv->align.h = 0.5;
+   priv->align.v = 0.5;
+   priv->pad.h = 0;
+   priv->pad.v = 0;
+   priv->layout.cb = evas_object_box_layout_horizontal;
+   priv->layout.data = NULL;
+   priv->layout.free_data = NULL;
+}
+
+static void
+_evas_object_box_smart_del(Evas_Object *o)
+{
+   const Evas_Object_Box_Api *api;
+   Eina_List *l;
+
+   EVAS_OBJECT_BOX_DATA_GET(o, priv);
+
+   api = priv->api;
+   if ((!api) || (!api->option_free))
+     {
+       WRN("api->option_free not set (may cause memory leaks,"
+             " segfaults)\n");
+        return;
+     }
+
+   l = priv->children;
+   while (l)
+     {
+       Evas_Object_Box_Option *opt = l->data;
+
+       _evas_object_box_child_callbacks_unregister(opt->obj);
+       api->option_free(o, priv, opt);
+       l = eina_list_remove_list(l, l);
+     }
+
+   if (priv->layout.data && priv->layout.free_data)
+     priv->layout.free_data(priv->layout.data);
+
+   _evas_object_box_parent_sc->del(o);
+}
+
+static void
+_evas_object_box_smart_resize(Evas_Object *o, Evas_Coord w, Evas_Coord h)
+{
+   Evas_Coord ow, oh;
+   evas_object_geometry_get(o, NULL, NULL, &ow, &oh);
+   if ((ow == w) && (oh == h)) return;
+   evas_object_smart_changed(o);
+}
+
+static void
+_evas_object_box_smart_calculate(Evas_Object *o)
+{
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN(o, priv);
+   if (priv->layout.cb)
+       {
+           priv->layouting = 1;
+           priv->layout.cb(o, priv, priv->layout.data);
+           priv->layouting = 0;
+       }
+   else
+     ERR("No layout function set for %p box.", o);
+}
+
+static void
+_evas_object_box_smart_set_user(Evas_Object_Box_Api *api)
+{
+   api->base.add = _evas_object_box_smart_add;
+   api->base.del = _evas_object_box_smart_del;
+   api->base.resize = _evas_object_box_smart_resize;
+   api->base.calculate = _evas_object_box_smart_calculate;
+
+   api->append = _evas_object_box_append_default;
+   api->prepend = _evas_object_box_prepend_default;
+   api->insert_before = _evas_object_box_insert_before_default;
+   api->insert_after = _evas_object_box_insert_after_default;
+   api->insert_at = _evas_object_box_insert_at_default;
+   api->remove = _evas_object_box_remove_default;
+   api->remove_at = _evas_object_box_remove_at_default;
+   api->option_new = _evas_object_box_option_new_default;
+   api->option_free = _evas_object_box_option_free_default;
+}
+
+/**
+ * Create a new box.
+ *
+ * Its layout function must be set via evas_object_box_layout_set()
+ * (defaults to evas_object_box_layout_horizontal()).  The other
+ * properties of the box must be set/retrieved via
+ * evas_object_box_{h,v}_{align,padding}_{get,set)().
+ */
+EAPI Evas_Object *
+evas_object_box_add(Evas *evas)
+{
+   return evas_object_smart_add(evas, _evas_object_box_smart_class_new());
+}
+
+/**
+ * Create a box that is child of a given element @a parent.
+ *
+ * @see evas_object_box_add()
+ */
+EAPI Evas_Object *
+evas_object_box_add_to(Evas_Object *parent)
+{
+   Evas *evas;
+   Evas_Object *o;
+
+   evas = evas_object_evas_get(parent);
+   o = evas_object_box_add(evas);
+   evas_object_smart_member_add(o, parent);
+   return o;
+}
+
+/**
+ * Set the default box @a api struct (Evas_Object_Box_Api)
+ * with the default values. May be used to extend that API.
+ */
+EAPI void
+evas_object_box_smart_set(Evas_Object_Box_Api *api)
+{
+   if (!api)
+     return;
+   _evas_object_box_smart_set(api);
+}
+
+/**
+ * Get Box Smart Class for inheritance purposes
+ */
+EAPI const Evas_Object_Box_Api *
+evas_object_box_smart_class_get(void)
+{
+   static Evas_Object_Box_Api _sc = EVAS_OBJECT_BOX_API_INIT_NAME_VERSION(_evas_object_box_type);
+   static const Evas_Object_Box_Api *class = NULL;
+
+   if (class)
+     return class;
+
+   evas_object_box_smart_set(&_sc);
+   class = &_sc;
+
+   return class;
+}
+
+/**
+ * Set a 'calculate' callback (@a cb) to the @a o box's smart class,
+ * which here defines its genre (horizontal, vertical, homogeneous,
+ * etc.).
+ */
+EAPI void
+evas_object_box_layout_set(Evas_Object *o, Evas_Object_Box_Layout cb, const void *data, void (*free_data)(void *data))
+{
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN(o, priv);
+
+   if ((priv->layout.cb == cb) && (priv->layout.data == data) && (priv->layout.free_data == free_data))
+     return;
+
+   if (priv->layout.data && priv->layout.free_data)
+     priv->layout.free_data(priv->layout.data);
+
+   priv->layout.cb = cb;
+   priv->layout.data = (void *)data;
+   priv->layout.free_data = free_data;
+   evas_object_smart_changed(o);
+}
+
+static void
+_fixed_point_divide_and_decompose_integer(int dividend, int divisor, int *int_part, int *frac_part)
+{
+   int quotient = (long long)(dividend << 16) / divisor;
+   *frac_part = quotient & 0xffff;
+   *int_part = quotient >> 16;
+}
+
+static void
+_layout_dimension_change_min_max_cell_bound(int dim, int *new_dim, int min_d, int max_d, int cell_sz)
+{
+   if (dim > cell_sz)
+     {
+       if ((min_d != 0) && (cell_sz < min_d))
+         *new_dim = min_d;
+       else
+         *new_dim = cell_sz;
+     }
+   else
+     {
+       if ((max_d != -1) && (cell_sz > max_d))
+         *new_dim = max_d;
+       else
+         *new_dim = cell_sz;
+     }
+}
+
+static void
+_layout_set_offset_and_expand_dimension_space_max_bounded(int dim, int *new_dim, int space_sz, int max_dim, int *offset, double align, int pad_before, int pad_after)
+{
+   if (align >= 0.0)
+     {
+       *new_dim = dim;
+       *offset = (space_sz - (dim + pad_before + pad_after)) * align
+         + pad_before;
+     }
+   else
+     {
+       if ((max_dim != -1) && (space_sz > max_dim))
+         {
+            *new_dim = max_dim;
+            *offset = (space_sz - (max_dim + pad_before + pad_after)) * 0.5
+              + pad_before;
+         }
+       else
+         {
+            *new_dim = space_sz;
+            *offset = 0;
+         }
+     }
+}
+
+static void
+_layout_set_offset_and_change_dimension_min_max_cell_bounded(int dim, int *new_dim, int min_dim, int max_dim, int cell_sz, int *offset, double align, int pad_before, int pad_after)
+{
+   if (align >= 0.0)
+     {
+       *new_dim = dim;
+       *offset =
+         (cell_sz - (dim + pad_before + pad_after)) * align + pad_before;
+     }
+   else
+     {
+        *offset = pad_before;
+        _layout_dimension_change_min_max_cell_bound
+         (dim, new_dim, min_dim, max_dim, cell_sz - pad_before - pad_after);
+     }
+}
+
+static void
+_sizing_eval(Evas_Object *obj)
+{
+   Evas_Coord minw, minh, maxw, maxh;
+   Evas_Coord w, h;
+
+   evas_object_size_hint_min_get(obj, &minw, &minh);
+   evas_object_size_hint_max_get(obj, &maxw, &maxh);
+   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+
+   if (w < minw) w = minw;
+   if (h < minh) h = minh;
+   if ((maxw >= 0) && (w > maxw)) w = maxw;
+   if ((maxh >= 0) && (h > maxh)) h = maxh;
+
+   evas_object_resize(obj, w, h);
+}
+
+static int
+_evas_object_box_layout_horizontal_weight_apply(Evas_Object_Box_Data *priv, Evas_Object_Box_Option **objects, int n_objects, int remaining, int weight_total)
+{
+   int rem_diff = 0;
+   int i;
+
+   for (i = 0; i < n_objects; i++)
+     {
+        Evas_Object_Box_Option *opt = objects[i];
+        Evas_Object *o = opt->obj;
+        int h;
+
+        evas_object_geometry_get(o, NULL, NULL, NULL, &h);
+
+        if (remaining <= 0)
+         {
+            int min_w;
+
+            evas_object_size_hint_min_get(o, &min_w, NULL);
+            evas_object_resize(o, min_w, h);
+         }
+       else
+         {
+            double normal_weight, weight_x;
+            int target_size;
+            int max_w;
+
+            evas_object_size_hint_weight_get(o, &weight_x, NULL);
+            normal_weight = weight_x / weight_total;
+            target_size = (int)((double)remaining * normal_weight);
+
+            evas_object_size_hint_max_get(o, &max_w, NULL);
+            if ((max_w != -1) && (target_size > max_w))
+              {
+                 evas_object_resize(o, max_w, h);
+                 rem_diff += max_w;
+                 objects[i] = objects[n_objects - 1];
+                 weight_total -= weight_x;
+                 n_objects--;
+                 return _evas_object_box_layout_horizontal_weight_apply
+                   (priv, objects, n_objects, remaining - rem_diff,
+                    weight_total);
+              }
+            else
+              {
+                 evas_object_resize(o, target_size, h);
+                 rem_diff += target_size;
+              }
+         }
+     }
+
+   return remaining - rem_diff;
+}
+
+/**
+ * Layout function which sets the box @a o to a (basic) horizontal
+ * box.  @a priv must be the smart data of the box.
+ *
+ * The object's overall behavior is controlled by its properties,
+ * which are set by the evas_object_box_{h,v}_{align,padding}_set()
+ * family of functions.  The properties of the elements in the box --
+ * set by evas_object_size_hint_{align,padding,weight}_set() functions
+ * -- also control the way this function works.
+ *
+ * \par box's properties:
+ * @c align_h controls the horizontal alignment of the child objects
+ * relative to the containing box. When set to 0, children are aligned
+ * to the left. A value of 1 lets them aligned to the right border.
+ * Values in between align them proportionally.  Note that if the size
+ * required by the children, which is given by their widths and the @c
+ * padding_h property of the box, is bigger than the container width,
+ * the children will be displayed out of its bounds.  A negative value
+ * of @c align_h makes the box to *justify* its children. The padding
+ * between them, in this case, is corrected so that the leftmost one
+ * touches the left border and the rightmost one touches the right
+ * border (even if they must overlap).  The @c align_v and @c
+ * padding_v properties of the box don't contribute to its behaviour
+ * when this layout is chosen.
+ *
+ * \par Child element's properties:
+ * @c align_x does not influence the box's behavior.  @c padding_l and
+ * @c padding_r sum up to the container's horizontal padding between
+ * elements.  The child's @c padding_t, @c padding_b and @c align_y
+ * properties apply for padding/positioning relative to the overall
+ * height of the box. Finally, there is the @c weight_x property,
+ * which, if set to a non-zero value, tells the container that the
+ * child width is not pre-defined.  If the container can't accomodate
+ * all its children, it sets the widths of the children *with weights*
+ * to sizes as small as they can all fit into it.  If the size
+ * required by the children is less than the available, the box
+ * increases its children's (which have weights) widths as to fit the
+ * remaining space.  The @c weight_x property, besides telling the
+ * element is resizable, gives a *weight* for the resizing process.
+ * The parent box will try to distribute (or take off) widths
+ * accordingly to the *normalized* list of weigths: most weighted
+ * children remain/get larger in this process than the the least ones.
+ * @c weight_y does not influence the layout.
+ *
+ * If one desires that, besides having weights, child elements must be
+ * resized bounded to a minimum or maximum size, their size hint
+ * properties must be set (by the
+ * evas_object_size_hint_{min,max}_set() functions.
+ */
+EAPI void
+evas_object_box_layout_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data __UNUSED__)
+{
+   int pad_inc = 0, sub_pixel = 0;
+   int req_w, global_pad, remaining, top_h = 0;
+   double weight_total = 0.0;
+   int weight_use = 0;
+   int x, y, w, h;
+   int n_children;
+   Evas_Object_Box_Option *opt;
+   Evas_Object_Box_Option **objects;
+   Eina_List *l;
+
+   n_children = eina_list_count(priv->children);
+   if (!n_children)
+     return;
+
+   objects = (Evas_Object_Box_Option **)alloca(sizeof(Evas_Object_Box_Option *) * n_children);
+   if (!objects)
+     return;
+
+   evas_object_geometry_get(o, &x, &y, &w, &h);
+   global_pad = priv->pad.h;
+   req_w = global_pad * (n_children - 1);
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+        int padding_l, padding_r;
+        double weight_x;
+
+       _sizing_eval(opt->obj);
+        evas_object_size_hint_weight_get(opt->obj, &weight_x, NULL);
+        evas_object_size_hint_padding_get
+         (opt->obj, &padding_l, &padding_r, NULL, NULL);
+        req_w += padding_l + padding_r;
+
+        if (!weight_x)
+         {
+            int child_w;
+
+            evas_object_geometry_get(opt->obj, NULL, NULL, &child_w, NULL);
+            req_w += child_w;
+         }
+       else
+         {
+            objects[weight_use] = opt;
+            weight_use++;
+            weight_total += weight_x;
+         }
+     }
+
+   remaining = w - req_w;
+
+   if (weight_use)
+     remaining = _evas_object_box_layout_horizontal_weight_apply
+       (priv, objects, weight_use, remaining, weight_total);
+
+   if (priv->align.h >= 0.0)
+     x += remaining * priv->align.h;
+   else if (n_children == 1)
+     x += remaining / 2;
+   else
+     { /* justified */
+        _fixed_point_divide_and_decompose_integer
+            (remaining, n_children - 1, &global_pad, &pad_inc);
+        global_pad += priv->pad.h;
+     }
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+        int child_w, child_h, max_h, new_h, off_x, off_y;
+        int padding_l, padding_r, padding_t, padding_b;
+        double align_y;
+
+        evas_object_size_hint_align_get(opt->obj, NULL, &align_y);
+        evas_object_size_hint_padding_get
+         (opt->obj, &padding_l, &padding_r, &padding_t, &padding_b);
+        evas_object_size_hint_max_get(opt->obj, NULL, &max_h);
+
+        evas_object_geometry_get(opt->obj, NULL, NULL, &child_w, &child_h);
+
+        off_x = padding_l;
+        new_h = child_h;
+        if (new_h > top_h) top_h = new_h;
+
+        _layout_set_offset_and_expand_dimension_space_max_bounded
+         (child_h, &new_h, h, max_h, &off_y, align_y, padding_t, padding_b);
+
+       if (new_h != child_h)
+         evas_object_resize(opt->obj, child_w, new_h);
+        evas_object_move(opt->obj, x + off_x, y + off_y);
+
+        x += child_w + padding_l + padding_r + global_pad;
+        sub_pixel += pad_inc;
+        if (sub_pixel >= 1 << 16)
+         {
+            x++;
+            sub_pixel -= 1 << 16;
+         }
+     }
+
+   evas_object_size_hint_min_set(o, req_w, top_h);
+}
+
+static int
+_evas_object_box_layout_vertical_weight_apply(Evas_Object_Box_Data *priv, Evas_Object_Box_Option **objects, int n_objects, int remaining, int weight_total)
+{
+   int rem_diff = 0;
+   int i;
+
+   for (i = 0; i < n_objects; i++)
+     {
+        Evas_Object_Box_Option *opt = objects[i];
+        Evas_Object *o = opt->obj;
+        int w;
+
+        evas_object_geometry_get(o, NULL, NULL, &w, NULL);
+
+        if (remaining <= 0)
+         {
+            int min_h;
+
+            evas_object_size_hint_min_get(o, NULL, &min_h);
+            evas_object_resize(o, w, min_h);
+         }
+       else
+         {
+            double normal_weight, weight_y;
+            int target_size;
+            int max_h;
+
+            evas_object_size_hint_weight_get(o, NULL, &weight_y);
+            normal_weight = weight_y / weight_total;
+            target_size = (int)((double)remaining * normal_weight);
+
+            evas_object_size_hint_max_get(o, NULL, &max_h);
+            if ((max_h != -1) && (target_size > max_h))
+              {
+                 evas_object_resize(o, w, max_h);
+                 rem_diff += max_h;
+                 objects[i] = objects[n_objects - 1];
+                 weight_total -= weight_y;
+                 n_objects--;
+                 return _evas_object_box_layout_vertical_weight_apply
+                   (priv, objects, n_objects, remaining - rem_diff,
+                    weight_total);
+              }
+            else
+              {
+                 evas_object_resize(o, w, target_size);
+                 rem_diff += target_size;
+              }
+         }
+     }
+
+   return remaining - rem_diff;
+}
+
+/**
+ * Layout function which sets the box @a o to a (basic) vertical box.
+ * @a priv must be the smart data of the box.
+ *
+ * This function behaves analogously to
+ * evas_object_box_layout_horizontal().  The description of its
+ * behaviour can be derived from that function's documentation.
+ */
+EAPI void
+evas_object_box_layout_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data __UNUSED__)
+{
+   int pad_inc = 0, sub_pixel = 0;
+   int req_h, global_pad, remaining, top_w = 0;
+   double weight_total = 0.0;
+   int weight_use = 0;
+   int x, y, w, h;
+   int n_children;
+   Evas_Object_Box_Option *opt;
+   Evas_Object_Box_Option **objects;
+   Eina_List *l;
+
+   n_children = eina_list_count(priv->children);
+   if (!n_children)
+     return;
+
+   objects = (Evas_Object_Box_Option **)alloca(sizeof(Evas_Object_Box_Option *) * n_children);
+   if (!objects)
+     return;
+
+   evas_object_geometry_get(o, &x, &y, &w, &h);
+   global_pad = priv->pad.v;
+   req_h = global_pad * (n_children - 1);
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+        int padding_t, padding_b;
+        double weight_y;
+
+       _sizing_eval(opt->obj);
+        evas_object_size_hint_weight_get(opt->obj, NULL, &weight_y);
+        evas_object_size_hint_padding_get
+         (opt->obj, NULL, NULL, &padding_t, &padding_b);
+        req_h += padding_t + padding_b;
+
+        if (!weight_y)
+         {
+            int child_h;
+
+            evas_object_geometry_get(opt->obj, NULL, NULL, NULL, &child_h);
+            req_h += child_h;
+         }
+       else
+         {
+            objects[weight_use] = opt;
+            weight_use++;
+            weight_total += weight_y;
+         }
+     }
+
+   remaining = h - req_h;
+
+   if (weight_use)
+     remaining = _evas_object_box_layout_vertical_weight_apply
+       (priv, objects, weight_use, remaining, weight_total);
+
+   if (priv->align.v >= 0.0)
+     y += remaining * priv->align.v;
+   else if (n_children == 1)
+     y += remaining / 2;
+   else
+     { /* justified */
+       _fixed_point_divide_and_decompose_integer
+         (remaining, n_children - 1, &global_pad, &pad_inc);
+       global_pad += priv->pad.v;
+     }
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+        int child_w, child_h, max_w, new_w, off_x, off_y;
+        int padding_l, padding_r, padding_t, padding_b;
+        double align_x;
+
+        evas_object_size_hint_align_get(opt->obj, &align_x, NULL);
+        evas_object_size_hint_padding_get
+         (opt->obj, &padding_l, &padding_r, &padding_t, &padding_b);
+        evas_object_size_hint_max_get(opt->obj, &max_w, NULL);
+
+        evas_object_geometry_get(opt->obj, NULL, NULL, &child_w, &child_h);
+
+        off_y = padding_t;
+        new_w = child_w;
+        if (new_w > top_w) top_w = new_w;
+
+        _layout_set_offset_and_expand_dimension_space_max_bounded
+         (child_w, &new_w, w, max_w, &off_x, align_x, padding_l, padding_r);
+
+       if (new_w != child_w)
+         evas_object_resize(opt->obj, new_w, child_h);
+        evas_object_move(opt->obj, x + off_x, y + off_y);
+
+        y += child_h + padding_t + padding_b + global_pad;
+        sub_pixel += pad_inc;
+        if (sub_pixel >= 1 << 16)
+         {
+            y++;
+            sub_pixel -= 1 << 16;
+         }
+     }
+
+   evas_object_size_hint_min_set(o, top_w, req_h);
+}
+
+/**
+ * Layout function which sets the box @a o to a *homogeneous*
+ * horizontal box.  @a priv must be the smart data of the box.
+ *
+ * In a homogeneous horizontal box, its width is divided equally
+ * between the contained objects.  The box's overall behavior is
+ * controlled by its properties, which are set by the
+ * evas_object_box_{h,v}_{align,padding}_set() family of functions.
+ * The properties of the elements in the box -- set by
+ * evas_object_size_hint_{align,padding,weight}_set() functions --
+ * also control the way this function works.
+ *
+ * \par box's properties:
+ * @c align_h has no influence on the box for this layout.  @c
+ * padding_h tells the box to draw empty spaces of that size, in
+ * pixels, between the (still equal) child objects's cells.  The @c
+ * align_v and @c padding_v properties of the box don't contribute to
+ * its behaviour when this layout is chosen.
+ *
+ * \par Child element's properties:
+ * @c padding_l and @c padding_r sum up to the required width of the
+ * child element.  The @c align_x property tells the relative position
+ * of this overall child width in its allocated cell (0 to extreme
+ * left, 1 to extreme right).  A value of -1.0 to @c align_x makes the
+ * box try to resize this child element to the exact width of its cell
+ * (respecting the min and max hints on the child's width *and*
+ * accounting its horizontal padding properties).  The child's @c
+ * padding_t, @c padding_b and @c align_y properties apply for
+ * padding/positioning relative to the overall height of the box. A
+ * value of -1.0 to @c align_y makes the box try to resize this child
+ * element to the exact height of its parent (respecting the max hint
+ * on the child's height).
+ */
+EAPI void
+evas_object_box_layout_homogeneous_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data __UNUSED__)
+{
+   int cell_sz, share, inc;
+   int sub_pixel = 0;
+   int x, y, w, h;
+   int n_children;
+   Evas_Object_Box_Option *opt;
+   Eina_List *l;
+
+   n_children = eina_list_count(priv->children);
+   if (!n_children)
+     return;
+
+   evas_object_geometry_get(o, &x, &y, &w, &h);
+
+   share = w - priv->pad.h * (n_children - 1);
+   _fixed_point_divide_and_decompose_integer
+     (share, n_children, &cell_sz, &inc);
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+        int child_w, child_h, max_h, min_w, max_w, new_w, new_h, off_x, off_y;
+        int padding_l, padding_r, padding_t, padding_b;
+        double align_x, align_y;
+
+        evas_object_size_hint_align_get(opt->obj, &align_x, &align_y);
+        evas_object_size_hint_padding_get
+         (opt->obj, &padding_l, &padding_r, &padding_t, &padding_b);
+        evas_object_size_hint_max_get(opt->obj, &max_w, &max_h);
+        evas_object_size_hint_min_get(opt->obj, &min_w, NULL);
+
+       _sizing_eval(opt->obj);
+        evas_object_geometry_get(opt->obj, NULL, NULL, &child_w, &child_h);
+
+        new_w = child_w;
+        new_h = child_h;
+
+        _layout_set_offset_and_expand_dimension_space_max_bounded
+         (child_h, &new_h, h, max_h, &off_y, align_y, padding_t, padding_b);
+
+        _layout_set_offset_and_change_dimension_min_max_cell_bounded
+         (child_w, &new_w, min_w, max_w, cell_sz, &off_x, align_x,
+          padding_l, padding_r);
+
+       if ((new_w != child_w) || (new_h != child_h))
+         evas_object_resize(opt->obj, new_w, new_h);
+        evas_object_move(opt->obj, x + off_x, y + off_y);
+
+        x += cell_sz + priv->pad.h;
+        sub_pixel += inc;
+        if (sub_pixel >= 1 << 16)
+         {
+            x++;
+            sub_pixel -= 1 << 16;
+         }
+     }
+
+   evas_object_size_hint_min_set(o, w, h);
+}
+
+/**
+ * Layout function which sets the box @a o to a *homogeneous* vertical
+ * box.  @a priv must be the smart data of the box.
+ *
+ * This function behaves analogously to
+ * evas_object_box_layout_homogeneous_horizontal().  The description
+ * of its behaviour can be derived from that function's documentation.
+ */
+EAPI void
+evas_object_box_layout_homogeneous_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data __UNUSED__)
+{
+   int cell_sz, share, inc;
+   int sub_pixel = 0;
+   int x, y, w, h;
+   int n_children;
+   Evas_Object_Box_Option *opt;
+   Eina_List *l;
+
+   n_children = eina_list_count(priv->children);
+   if (!n_children)
+     return;
+
+   evas_object_geometry_get(o, &x, &y, &w, &h);
+
+   share = h - priv->pad.v * (n_children - 1);
+   _fixed_point_divide_and_decompose_integer
+     (share, n_children, &cell_sz, &inc);
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+        int child_w, child_h, max_w, min_h, max_h, new_w, new_h, off_x, off_y;
+        int padding_l, padding_r, padding_t, padding_b;
+        double align_x, align_y;
+
+        evas_object_size_hint_align_get(opt->obj, &align_x, &align_y);
+        evas_object_size_hint_padding_get
+         (opt->obj, &padding_l, &padding_r, &padding_t, &padding_b);
+        evas_object_size_hint_max_get(opt->obj, &max_w, &max_h);
+        evas_object_size_hint_min_get(opt->obj, NULL, &min_h);
+
+       _sizing_eval(opt->obj);
+        evas_object_geometry_get(opt->obj, NULL, NULL, &child_w, &child_h);
+        new_w = child_w;
+        new_h = child_h;
+
+        _layout_set_offset_and_expand_dimension_space_max_bounded
+         (child_w, &new_w, w, max_w, &off_x, align_x, padding_l, padding_r);
+
+        _layout_set_offset_and_change_dimension_min_max_cell_bounded
+         (child_h, &new_h, min_h, max_h, cell_sz, &off_y, align_y,
+          padding_t, padding_b);
+
+       if ((new_w != child_w) || (new_h != child_h))
+         evas_object_resize(opt->obj, new_w, new_h);
+        evas_object_move(opt->obj, x + off_x, y + off_y);
+
+        y += cell_sz + priv->pad.v;
+        sub_pixel += inc;
+        if (sub_pixel >= 1 << 16)
+         {
+            y++;
+            sub_pixel -= 1 << 16;
+         }
+     }
+
+   evas_object_size_hint_min_set(o, w, h);
+}
+
+/**
+ * Layout function which sets the box @a o to a *max size-homogeneous*
+ * horizontal box.  @a priv must be the smart data of the box.
+ *
+ * In a max size-homogeneous horizontal box, the equal sized cells
+ * reserved for the child objects have the width of the space required
+ * by the largest child (in width). The box's overall behavior is
+ * controlled by its properties, which are set by the
+ * evas_object_box_{h,v}_{align,padding}_set() family of functions.
+ * The properties of the elements in the box -- set by
+ * evas_object_size_hint_{align,padding,weight}_set() functions --
+ * also control the way this function works.
+ *
+ * \par box's properties:
+ * @c padding_h tells the box to draw empty spaces of that size, in
+ * pixels, between the child objects's cells.  @c align_h controls the
+ * horizontal alignment of the child objects relative to the
+ * containing box. When set to 0, children are aligned to the left. A
+ * value of 1 lets them aligned to the right border.  Values in
+ * between align them proportionally. A negative value of @c align_h
+ * makes the box to *justify* its children cells. The padding between
+ * them, in this case, is corrected so that the leftmost one touches
+ * the left border and the rightmost one touches the right border
+ * (even if they must overlap).  The @c align_v and @c padding_v
+ * properties of the box don't contribute to its behaviour when this
+ * layout is chosen.
+ *
+ * \par Child element's properties:
+ * @c padding_l and @c padding_r sum up to the required width of the
+ * child element. The @c align_x property tells the relative position
+ * of this overall child width in its allocated cell (0 to extreme
+ * left, 1 to extreme right).  A value of -1.0 to @c align_x makes the
+ * box try to resize this child element to the exact width of its cell
+ * (respecting the min and max hints on the child's width *and*
+ * accounting its horizontal padding properties).  The child's @c
+ * padding_t, @c padding_b and @c align_y properties apply for
+ * padding/positioning relative to the overall height of the box. A
+ * value of -1.0 to @c align_y makes the box try to resize this child
+ * element to the exact height of its parent (respecting the max hint
+ * on the child's height).
+ */
+EAPI void
+evas_object_box_layout_homogeneous_max_size_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data __UNUSED__)
+{
+   int remaining, global_pad, pad_inc = 0, sub_pixel = 0;
+   int cell_sz = 0;
+   int x, y, w, h;
+   int top_h = 0;
+   int n_children;
+   Evas_Object_Box_Option *opt;
+   Eina_List *l;
+
+   n_children = eina_list_count(priv->children);
+   if (!n_children)
+     return;
+
+   evas_object_geometry_get(o, &x, &y, &w, &h);
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+        int child_w, padding_l, padding_r;
+
+       _sizing_eval(opt->obj);
+        evas_object_size_hint_padding_get
+         (opt->obj, &padding_l, &padding_r, NULL, NULL);
+        evas_object_geometry_get(opt->obj, NULL, NULL, &child_w, NULL);
+        if (child_w + padding_l + padding_r > cell_sz)
+         cell_sz = child_w + padding_l + padding_r;
+     }
+
+   global_pad = priv->pad.h;
+   remaining = w - n_children * cell_sz - global_pad * (n_children - 1);
+
+   if (priv->align.h >= 0.0)
+     x += remaining * priv->align.h;
+   else if (n_children == 1)
+     x += remaining / 2;
+   else
+     { /* justified */
+        _fixed_point_divide_and_decompose_integer
+         (remaining, n_children - 1, &global_pad, &pad_inc);
+        global_pad += priv->pad.h;
+     }
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+        int child_w, child_h, min_w, max_w, max_h, new_w, new_h, off_x, off_y;
+        int padding_l, padding_r, padding_t, padding_b;
+        double align_x, align_y;
+
+        evas_object_size_hint_align_get(opt->obj, &align_x, &align_y);
+        evas_object_size_hint_padding_get
+         (opt->obj, &padding_l, &padding_r, &padding_t, &padding_b);
+        evas_object_size_hint_max_get(opt->obj, &max_w, &max_h);
+        evas_object_size_hint_min_get(opt->obj, &min_w, NULL);
+
+        evas_object_geometry_get(opt->obj, NULL, NULL, &child_w, &child_h);
+
+        new_w = child_w;
+        new_h = child_h;
+        if (new_h > top_h) top_h = new_h;
+
+        _layout_set_offset_and_expand_dimension_space_max_bounded
+         (child_h, &new_h, h, max_h, &off_y, align_y, padding_t, padding_b);
+
+        _layout_set_offset_and_change_dimension_min_max_cell_bounded
+         (child_w, &new_w, min_w, max_w, cell_sz, &off_x, align_x,
+          padding_l, padding_r);
+
+       if ((new_w != child_w) || (new_h != child_h))
+         evas_object_resize(opt->obj, new_w, new_h);
+        evas_object_move(opt->obj, x + off_x, y + off_y);
+
+        x += cell_sz + global_pad;
+        sub_pixel += pad_inc;
+        if (sub_pixel >= 1 << 16)
+         {
+            x++;
+            sub_pixel -= 1 << 16;
+         }
+     }
+
+   evas_object_size_hint_min_set(o, x, top_h);
+}
+
+/**
+ * Layout function which sets the box @a o to a *max size-homogeneous*
+ * vertical box.  @a priv must be the smart data of the box.
+ *
+ * This function behaves analogously to
+ * evas_object_box_layout_homogeneous_max_size_horizontal().  The
+ * description of its behaviour can be derived from that function's
+ * documentation.
+ */
+EAPI void
+evas_object_box_layout_homogeneous_max_size_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data __UNUSED__)
+{
+   int remaining, global_pad, pad_inc = 0, sub_pixel = 0;
+   int cell_sz = 0;
+   int x, y, w, h;
+   int top_w = 0;
+   int n_children;
+   Evas_Object_Box_Option *opt;
+   Eina_List *l;
+
+   n_children = eina_list_count(priv->children);
+   if (!n_children)
+     return;
+
+   evas_object_geometry_get(o, &x, &y, &w, &h);
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+        int child_h, padding_t, padding_b;
+
+       _sizing_eval(opt->obj);
+        evas_object_size_hint_padding_get
+         (opt->obj, NULL, NULL, &padding_t, &padding_b);
+        evas_object_geometry_get(opt->obj, NULL, NULL, NULL, &child_h);
+        if (child_h + padding_t + padding_b > cell_sz)
+         cell_sz = child_h + padding_t + padding_b;
+     }
+
+   global_pad = priv->pad.v;
+   remaining = h - n_children * cell_sz - global_pad * (n_children - 1);
+
+   if (priv->align.v >= 0.0)
+     y += remaining * priv->align.v;
+   else if (n_children == 1)
+     y += remaining / 2;
+   else
+     { /* justified */
+       _fixed_point_divide_and_decompose_integer
+         (remaining, n_children - 1, &global_pad, &pad_inc);
+       global_pad += priv->pad.v;
+     }
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+        int child_w, child_h, max_h, min_h, max_w, new_w, new_h, off_x, off_y;
+        int padding_l, padding_r, padding_t, padding_b;
+        double align_x, align_y;
+
+        evas_object_size_hint_align_get(opt->obj, &align_x, &align_y);
+        evas_object_size_hint_padding_get
+         (opt->obj, &padding_l, &padding_r, &padding_t, &padding_b);
+        evas_object_size_hint_max_get(opt->obj, &max_w, &max_h);
+        evas_object_size_hint_min_get(opt->obj, NULL, &min_h);
+
+        evas_object_geometry_get(opt->obj, NULL, NULL, &child_w, &child_h);
+
+        new_w = child_w;
+        new_h = child_h;
+        if (new_w > top_w) top_w = new_w;
+
+        _layout_set_offset_and_expand_dimension_space_max_bounded
+         (child_w, &new_w, w, max_w, &off_x, align_x, padding_l, padding_r);
+
+        _layout_set_offset_and_change_dimension_min_max_cell_bounded
+         (child_h, &new_h, min_h, max_h, cell_sz, &off_y, align_y,
+          padding_t, padding_b);
+
+       if ((new_w != child_w) || (new_h != child_h))
+         evas_object_resize(opt->obj, new_w, new_h);
+        evas_object_move(opt->obj, x + off_x, y + off_y);
+
+        y += cell_sz + global_pad;
+        sub_pixel += pad_inc;
+        if (sub_pixel >= 1 << 16)
+         {
+            y++;
+            sub_pixel -= 1 << 16;
+         }
+     }
+
+   evas_object_size_hint_min_set(o, top_w, y);
+}
+
+static void
+_evas_object_box_layout_flow_horizontal_row_info_collect(Evas_Object_Box_Data *priv, int box_w, int *row_count, int *row_max_h, int *row_break, int *row_width, int *off_y_ret, int *max_h_ret)
+{
+   int i, remain_w = box_w, start_i = 0;
+   int off_y = 0, max_h = 0, n_rows = 0;
+   Eina_List *l;
+
+   for (i = 0, l = priv->children; l != NULL; i++, l = l->next)
+     {
+        Evas_Object_Box_Option *opt = l->data;
+        int padding_l, padding_r, padding_t, padding_b;
+        int child_w, child_h, off_x = 0;
+
+        evas_object_size_hint_padding_get
+         (opt->obj, &padding_l, &padding_r, &padding_t, &padding_b);
+
+       _sizing_eval(opt->obj);
+       evas_object_geometry_get(opt->obj, NULL, NULL, &child_w, &child_h);
+
+        child_w += padding_l + padding_r + priv->pad.h;
+        child_h += padding_t + padding_b;
+
+        remain_w -= child_w;
+        if (remain_w + priv->pad.h >= 0)
+         { /* continue "line" */
+            if (child_h > max_h)
+              max_h = child_h;
+
+            off_x += child_w;
+            row_width[n_rows] += child_w;
+         }
+       else
+         { /* break line */
+            if (i == start_i)
+              { /* obj goes to actual line */
+                 max_h = child_h;
+                 row_width[n_rows] = child_w;
+              }
+            else
+              { /* obj goes to next line */
+                 row_max_h[n_rows] = max_h;
+                 row_break[n_rows] = i - 1;
+                 n_rows++;
+
+                 off_x = child_w;
+                 off_y += max_h;
+                 max_h = child_h;
+
+                 row_width[n_rows] = child_w;
+                 start_i = i;
+
+                 remain_w = box_w - off_x;
+              }
+         }
+     }
+
+   row_break[n_rows] = i - 1;
+   row_max_h[n_rows] = max_h;
+
+   *row_count = n_rows;
+   *off_y_ret = off_y;
+   *max_h_ret = max_h;
+}
+
+/**
+ * Layout function which sets the box @a o to a *flow* horizontal box.
+ * @a priv must be the smart data of the box.
+ *
+ * In a flow horizontal box, the box's child elements are placed in
+ * rows (think of text as an analogy). A row has as much elements as
+ * can fit into the box's width.  The box's overall behavior is
+ * controlled by its properties, which are set by the
+ * evas_object_box_{h,v}_{align,padding}_set() family of functions.
+ * The properties of the elements in the box -- set by
+ * evas_object_size_hint_{align,padding,weight}_set() functions --
+ * also control the way this function works.
+ *
+ * \par box's properties:
+ * @c padding_h tells the box to draw empty spaces of that size, in
+ * pixels, between the child objects's cells.  @c align_h dictates the
+ * horizontal alignment of the rows (0 to left align them, 1 to right
+ * align).  A value of -1.0 to @c align_h lets the rows *justified*
+ * horizontally.  @c align_v controls the vertical alignment of the
+ * entire set of rows (0 to top, 1 to bottom).  A value of -1.0 to @c
+ * align_v makes the box to *justify* the rows vertically. The padding
+ * between them, in this case, is corrected so that the first row
+ * touches the top border and the last one touches the bottom border
+ * (even if they must overlap). @c padding_v has no influence on the
+ * layout.
+ *
+ * \par Child element's properties:
+ * @c padding_l and @c padding_r sum up to the required width of the
+ * child element.  The @c align_x property has no influence on the
+ * layout. The child's @c padding_t and @c padding_b sum up to the
+ * required height of the child element and is the only means (besides
+ * row justifying) of setting space between rows.  Note, however, that
+ * @c align_y dictates positioning relative to the *largest height*
+ * required by a child object in the actual row.
+ */
+EAPI void
+evas_object_box_layout_flow_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data __UNUSED__)
+{
+   int n_children, v_justify;
+   int r, row_count = 0;
+   int min_w = 0, min_h = 0;
+   int max_h, inc_y;
+   int remain_y, i;
+   int x, y, w, h;
+   Eina_List *l;
+   int *row_max_h;
+   int *row_break;
+   int *row_width;
+   int off_y;
+
+   n_children = eina_list_count(priv->children);
+   if (!n_children)
+     return;
+
+   /* *per row* arrays */
+   row_max_h = (int *)alloca(sizeof(int) * n_children);
+   if (!row_max_h)
+     return;
+   row_break = (int *)alloca(sizeof(int) * n_children);
+   if (!row_break)
+     return;
+   row_width = (int *)alloca(sizeof(int) * n_children);
+   if (!row_width)
+     return;
+
+   memset(row_width, 0, sizeof(row_width));
+
+   evas_object_geometry_get(o, &x, &y, &w, &h);
+
+   _evas_object_box_layout_flow_horizontal_row_info_collect
+     (priv, w, &row_count, row_max_h, row_break, row_width, &off_y, &max_h);
+
+   inc_y = 0;
+   v_justify = 0;
+   remain_y = h - (off_y + max_h);
+
+   if (remain_y > 0)
+     {
+       if (priv->align.v >= 0.0)
+         inc_y = priv->align.v * remain_y;
+       else if (row_count == 0)
+         y += remain_y / 2;
+       else /* y-justified */
+         inc_y = remain_y / row_count;
+     }
+
+   inc_y += priv->pad.v;
+
+   for (i = 0, r = 0, l = priv->children; r <= row_count; r++)
+     {
+        int row_justify = 0, just_inc = 0, sub_pixel = 0;
+        int row_size, remain_x;
+
+        row_size = row_break[r] - i;
+        remain_x = (w - row_width[r]);
+
+        if (priv->align.h < 0.0)
+         {
+            if (row_size == 0)
+              x += remain_x / 2;
+            else
+              _fixed_point_divide_and_decompose_integer
+                (remain_x, row_size, &row_justify, &just_inc);
+         }
+
+        row_justify += priv->pad.h;
+
+        for (; i <= row_break[r]; i++, l = l->next)
+         {
+            Evas_Object_Box_Option *opt = l->data;
+            int off_x, off_y, y_remain;
+            int padding_l, padding_r;
+            int child_w, child_h;
+            double align_y;
+
+            evas_object_size_hint_align_get(opt->obj, NULL, &align_y);
+            evas_object_size_hint_padding_get
+              (opt->obj, &padding_l, &padding_r, NULL, NULL);
+
+            evas_object_geometry_get
+              (opt->obj, NULL, NULL, &child_w, &child_h);
+
+            y_remain = row_max_h[r] - child_h;
+
+            off_x = padding_l;
+            if (priv->align.h >= 0.0)
+              off_x += remain_x * priv->align.h;
+            off_y = y_remain * align_y;
+
+            evas_object_move(opt->obj, x + off_x, y + off_y);
+
+            x += child_w + padding_l + padding_r + row_justify;
+
+            sub_pixel += just_inc;
+            if (sub_pixel >= 1 << 16)
+              {
+                 x++;
+                 sub_pixel -= 1 << 16;
+              }
+         }
+
+        evas_object_geometry_get(o, &x, NULL, NULL, NULL);
+        if (min_w < row_width[r])
+            min_w = row_width[r];
+        min_h += row_max_h[r];
+        y += row_max_h[r] + inc_y;
+     }
+
+   evas_object_size_hint_min_set(o, min_w, min_h);
+}
+
+static void
+_evas_object_box_layout_flow_vertical_col_info_collect(Evas_Object_Box_Data *priv, int box_h, int *col_count, int *col_max_w, int *col_break, int *col_height, int *off_x_ret, int *max_w_ret)
+{
+   int i, remain_h = box_h, start_i = 0;
+   int off_x = 0, max_w = 0, n_cols = 0;
+   Eina_List *l;
+
+   for (i = 0, l = priv->children; l != NULL; i++, l = l->next)
+     {
+        Evas_Object_Box_Option *opt = l->data;
+        int padding_l, padding_r, padding_t, padding_b;
+        int child_w, child_h, off_y = 0;
+
+        evas_object_size_hint_padding_get
+         (opt->obj, &padding_l, &padding_r, &padding_t, &padding_b);
+
+       _sizing_eval(opt->obj);
+        evas_object_geometry_get(opt->obj, NULL, NULL, &child_w, &child_h);
+
+        child_w += padding_l + padding_r;
+        child_h += padding_t + padding_b + priv->pad.v;
+
+        remain_h -= child_h;
+        if (remain_h + priv->pad.v >= 0)
+         { /* continue "col" */
+            if (child_w > max_w)
+              max_w = child_w;
+
+            off_y += child_h;
+            col_height[n_cols] += child_h;
+         }
+       else
+         {
+            /* break col */
+            if (i == start_i)
+              { /* obj goes to actual col */
+                 max_w = child_w;
+                 col_height[n_cols] = child_h;
+              }
+            else
+              { /* obj goes to next col */
+                 col_max_w[n_cols] = max_w;
+                 col_break[n_cols] = i - 1;
+                 n_cols++;
+
+                 off_x += max_w;
+                 off_y = child_h;
+                 max_w = child_w;
+
+                 col_height[n_cols] = child_h;
+                 start_i = i;
+
+                 remain_h = box_h - off_y;
+              }
+         }
+     }
+
+   col_break[n_cols] = i - 1;
+   col_max_w[n_cols] = max_w;
+
+   *col_count = n_cols;
+   *off_x_ret = off_x;
+   *max_w_ret = max_w;
+}
+
+/**
+ * Layout function which sets the box @a o to a *flow* vertical box.
+ * @a priv must be the smart data of the box.
+ *
+ * This function behaves analogously to
+ * evas_object_box_layout_flow_horizontal().  The description of its
+ * behaviour can be derived from that function's documentation.
+ */
+EAPI void
+evas_object_box_layout_flow_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data __UNUSED__)
+{
+   int n_children;
+   int c, col_count;
+   int min_w = 0, min_h = 0;
+   int max_w, inc_x;
+   int remain_x, i;
+   int x, y, w, h;
+   Eina_List *l;
+   int *col_max_w;
+   int *col_break;
+   int *col_height;
+   int off_x;
+
+   n_children = eina_list_count(priv->children);
+   if (!n_children)
+     return;
+
+   /* *per col* arrays */
+   col_max_w = (int *)alloca(sizeof(int) * n_children);
+   if (!col_max_w)
+     return;
+   col_break = (int *)alloca(sizeof(int) * n_children);
+   if (!col_break)
+     return;
+   col_height = (int *)alloca(sizeof(int) * n_children);
+   if (!col_height)
+     return;
+
+   memset(col_height, 0, sizeof(col_height));
+
+   evas_object_geometry_get(o, &x, &y, &w, &h);
+
+   _evas_object_box_layout_flow_vertical_col_info_collect
+     (priv, h, &col_count, col_max_w, col_break, col_height, &off_x, &max_w);
+
+   inc_x = 0;
+   remain_x = w - (off_x + max_w);
+
+   if (remain_x > 0)
+     {
+       if (priv->align.h >= 0)
+         inc_x = priv->align.h * remain_x;
+       else if (col_count == 0)
+         x += remain_x / 2;
+       else /* x-justified */
+         inc_x = remain_x / col_count;
+     }
+
+   inc_x += priv->pad.h;
+
+   for (i = 0, c = 0, l = priv->children; c <= col_count; c++)
+     {
+        int col_justify = 0, just_inc = 0, sub_pixel = 0;
+        int col_size, remain_y;
+
+        col_size = col_break[c] - i;
+        remain_y = (h - col_height[c]);
+
+        if (priv->align.v < 0.0)
+         {
+            if (col_size == 0)
+              y += remain_y / 2;
+            else
+              _fixed_point_divide_and_decompose_integer
+                (remain_y, col_size, &col_justify, &just_inc);
+         }
+
+        col_justify += priv->pad.v;
+
+        for (; i <= col_break[c]; i++, l = l->next)
+         {
+            Evas_Object_Box_Option *opt = l->data;
+            int off_x, off_y, x_remain;
+            int padding_t, padding_b;
+            int child_w, child_h;
+            double align_x;
+
+            evas_object_size_hint_align_get(opt->obj, &align_x, NULL);
+            evas_object_size_hint_padding_get
+              (opt->obj, NULL, NULL, &padding_t, &padding_b);
+
+            evas_object_geometry_get
+              (opt->obj, NULL, NULL, &child_w, &child_h);
+
+            x_remain = col_max_w[c] - child_w;
+
+            off_x = x_remain * align_x;
+            off_y = padding_t;
+            if (priv->align.v >= 0.0)
+              off_y += remain_y * priv->align.v;
+
+            evas_object_move(opt->obj, x + off_x, y + off_y);
+
+            y += child_h + padding_t + padding_b + col_justify;
+
+            sub_pixel += just_inc;
+            if (sub_pixel >= 1 << 16)
+              {
+                 y++;
+                 sub_pixel -= 1 << 16;
+              }
+         }
+
+        evas_object_geometry_get(o, NULL, &y, NULL, NULL);
+        min_w += col_max_w[c];
+        if (min_h < col_height[c])
+            min_h = col_height[c];
+        x += col_max_w[c] + inc_x;
+     }
+
+   evas_object_size_hint_min_set(o, min_w, min_h);
+}
+
+/**
+ * Layout function which sets the box @a o to set all children to the
+ * size of the object.  @a priv must be the smart data of the box.
+ *
+ * In a stack box, all children will be given the same size and they
+ * will be stacked on above the other, so the first object will be the
+ * bottom most.
+ *
+ * \par box's properties:
+ * No box option is used.
+ *
+ * \par Child  element's   properties:
+ * @c padding_l and @c padding_r sum up to the required width of the
+ * child element.  The @c align_x property tells the relative position
+ * of this overall child width in its allocated cell (0 to extreme
+ * left, 1 to extreme right).  A value of -1.0 to @c align_x makes the
+ * box try to resize this child element to the exact width of its cell
+ * (respecting the min and max hints on the child's width *and*
+ * accounting its horizontal padding properties).  Same applies to
+ * vertical axis.
+ */
+EAPI void
+evas_object_box_layout_stack(Evas_Object *o, Evas_Object_Box_Data *priv, void *data __UNUSED__)
+{
+   Eina_List *l;
+   Evas_Coord ox, oy, ow, oh;
+   Evas_Coord top_w = 0, top_h = 0;
+   Evas_Object_Box_Option *opt;
+   Evas_Object *old_child = NULL;
+
+   evas_object_geometry_get(o, &ox, &oy, &ow, &oh);
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+        Evas_Object *child = opt->obj;
+        Evas_Coord max_w, max_h, min_w, min_h, pad_l, pad_r, pad_t, pad_b,
+         child_w, child_h, new_w, new_h, off_x, off_y;
+        double align_x, align_y;
+
+        evas_object_size_hint_align_get(child, &align_x, &align_y);
+        evas_object_size_hint_padding_get
+         (child, &pad_l, &pad_r, &pad_t, &pad_b);
+        evas_object_size_hint_max_get(child, &max_w, &max_h);
+        evas_object_size_hint_min_get(child, &min_w, &min_h);
+
+       _sizing_eval(opt->obj);
+       evas_object_geometry_get(child, NULL, NULL, &child_w, &child_h);
+        new_w = child_w;
+        new_h = child_h;
+        if (new_w > top_w) top_w = new_w;
+        if (new_h > top_h) top_h = new_h;
+
+        _layout_set_offset_and_change_dimension_min_max_cell_bounded
+         (child_w, &new_w, min_w, max_w, ow, &off_x, align_x, pad_l, pad_r);
+        _layout_set_offset_and_change_dimension_min_max_cell_bounded
+         (child_h, &new_h, min_h, max_h, oh, &off_y, align_y, pad_t, pad_b);
+
+       if ((new_w != child_w) || (new_h != child_h))
+         evas_object_resize(child, new_w, new_h);
+        evas_object_move(child, ox + off_x, oy + off_y);
+
+        if (old_child)
+         evas_object_stack_above(child, old_child);
+        old_child = child;
+     }
+
+   evas_object_size_hint_min_set(o, top_w, top_h);
+}
+
+/**
+ * Set the alignment of the whole bounding box of contents.
+ */
+EAPI void
+evas_object_box_align_set(Evas_Object *o, double horizontal, double vertical)
+{
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN(o, priv);
+   if (priv->align.h == horizontal && priv->align.v == vertical)
+     return;
+   priv->align.h = horizontal;
+   priv->align.v = vertical;
+   evas_object_smart_changed(o);
+}
+
+/**
+ * Get alignment of the whole bounding box of contents.
+ */
+EAPI void
+evas_object_box_align_get(const Evas_Object *o, double *horizontal, double *vertical)
+{
+   EVAS_OBJECT_BOX_DATA_GET(o, priv);
+   if (priv)
+     {
+       if (horizontal) *horizontal = priv->align.h;
+       if (vertical) *vertical = priv->align.v;
+     }
+   else
+     {
+       if (horizontal) *horizontal = 0.5;
+       if (vertical) *vertical = 0.5;
+     }
+}
+
+/**
+ * Set the space (padding) between cells.
+ */
+EAPI void
+evas_object_box_padding_set(Evas_Object *o, Evas_Coord horizontal, Evas_Coord vertical)
+{
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN(o, priv);
+   if (priv->pad.h == horizontal && priv->pad.v == vertical)
+     return;
+   priv->pad.h = horizontal;
+   priv->pad.v = vertical;
+   evas_object_smart_changed(o);
+}
+
+/**
+ * Get the (space) padding between cells.
+ */
+EAPI void
+evas_object_box_padding_get(const Evas_Object *o, Evas_Coord *horizontal, Evas_Coord *vertical)
+{
+   EVAS_OBJECT_BOX_DATA_GET(o, priv);
+   if (priv)
+     {
+       if (horizontal) *horizontal = priv->pad.h;
+       if (vertical) *vertical = priv->pad.v;
+     }
+   else
+     {
+       if (horizontal) *horizontal = 0;
+       if (vertical) *vertical = 0;
+     }
+}
+
+/**
+ * Append a new object @a child to the box @a o. On error, @c NULL is
+ * returned.
+ */
+EAPI Evas_Object_Box_Option *
+evas_object_box_append(Evas_Object *o, Evas_Object *child)
+{
+   Evas_Object_Box_Option *opt;
+   const Evas_Object_Box_Api *api;
+
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, 0);
+   if (!child)
+     return NULL;
+
+   api = priv->api;
+   if ((!api) || (!api->append))
+     return NULL;
+
+   opt = api->append(o, priv, child);
+
+   if (opt)
+     {
+        evas_object_smart_member_add(child, o);
+        evas_object_smart_changed(o);
+        return _evas_object_box_option_callbacks_register(o, priv, opt);
+     }
+
+   return NULL;
+}
+
+/**
+ * Prepend a new object @a child to the box @a o. On error, @c NULL is
+ * returned.
+ */
+EAPI Evas_Object_Box_Option *
+evas_object_box_prepend(Evas_Object *o, Evas_Object *child)
+{
+   Evas_Object_Box_Option *opt;
+   const Evas_Object_Box_Api *api;
+
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, 0);
+   if (!child)
+     return NULL;
+
+   api = priv->api;
+   if ((!api) || (!api->prepend))
+     return NULL;
+
+   opt = api->prepend(o, priv, child);
+
+   if (opt)
+     {
+        evas_object_smart_member_add(child, o);
+        evas_object_smart_changed(o);
+        return _evas_object_box_option_callbacks_register(o, priv, opt);
+     }
+
+   return NULL;
+}
+
+/**
+ * Prepend a new object @a child to the box @c o relative to element @a
+ * reference. If @a reference is not contained in the box or any other
+ * error occurs, @c NULL is returned.
+ */
+EAPI Evas_Object_Box_Option *
+evas_object_box_insert_before(Evas_Object *o, Evas_Object *child, const Evas_Object *reference)
+{
+   Evas_Object_Box_Option *opt;
+   const Evas_Object_Box_Api *api;
+
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, 0);
+   if (!child)
+     return NULL;
+
+   api = priv->api;
+   if ((!api) || (!api->insert_before))
+     return NULL;
+
+   opt = api->insert_before(o, priv, child, reference);
+
+   if (opt)
+     {
+        evas_object_smart_member_add(child, o);
+        evas_object_smart_changed(o);
+        return _evas_object_box_option_callbacks_register(o, priv, opt);
+     }
+
+   return NULL;
+}
+
+/**
+ * Append a new object @a child to the box @c o relative to element @a
+ * reference. If @a reference is not contained in the box or any other
+ * error occurs, @c NULL is returend.
+ */
+EAPI Evas_Object_Box_Option *
+evas_object_box_insert_after(Evas_Object *o, Evas_Object *child, const Evas_Object *reference)
+{
+   Evas_Object_Box_Option *opt;
+   const Evas_Object_Box_Api *api;
+
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, NULL);
+   if (!child)
+     return NULL;
+
+   api = priv->api;
+   if ((!api) || (!api->insert_after))
+     return NULL;
+
+   opt = api->insert_after(o, priv, child, reference);
+
+   if (opt)
+     {
+       evas_object_smart_member_add(child, o);
+       evas_object_smart_changed(o);
+       return _evas_object_box_option_callbacks_register(o, priv, opt);
+     }
+
+   return NULL;
+}
+
+/**
+ * Insert a new object @a child to the box @a o at position @a pos. On
+ * error, @c NULL is returned.
+ */
+EAPI Evas_Object_Box_Option *
+evas_object_box_insert_at(Evas_Object *o, Evas_Object *child, unsigned int pos)
+{
+   Evas_Object_Box_Option *opt;
+   const Evas_Object_Box_Api *api;
+
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, 0);
+   if (!child)
+     return NULL;
+
+   api = priv->api;
+   if ((!api) || (!api->insert_at))
+     return NULL;
+
+   opt = api->insert_at(o, priv, child, pos);
+
+   if (opt)
+     {
+        evas_object_smart_member_add(child, o);
+        evas_object_smart_changed(o);
+        return _evas_object_box_option_callbacks_register(o, priv, opt);
+     }
+
+   return NULL;
+}
+
+/**
+ * Remove an object @a child from the box @a o. On error, @c 0 is
+ * returned.
+ */
+EAPI Eina_Bool
+evas_object_box_remove(Evas_Object *o, Evas_Object *child)
+{
+   const Evas_Object_Box_Api *api;
+   Evas_Object *obj;
+
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, 0);
+   if (!child) return EINA_FALSE;
+
+   api = priv->api;
+   if ((!api) || (!api->remove))
+     return 0;
+
+   obj = api->remove(o, priv, child);
+
+   if (obj)
+     {
+        _evas_object_box_child_callbacks_unregister(obj);
+        evas_object_smart_member_del(obj);
+        evas_object_smart_changed(o);
+        return EINA_TRUE;
+     }
+
+   return EINA_FALSE;
+}
+
+/**
+ * Remove an object from the box @a o which occupies position @a
+ * pos. On error, @c 0 is returned.
+ */
+EAPI Eina_Bool
+evas_object_box_remove_at(Evas_Object *o, unsigned int pos)
+{
+   const Evas_Object_Box_Api *api;
+   Evas_Object *obj;
+
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, 0);
+   api = priv->api;
+   if ((!api) || (!api->remove_at)) return EINA_FALSE;
+
+   obj = api->remove_at(o, priv, pos);
+
+   if (obj)
+     {
+        _evas_object_box_child_callbacks_unregister(obj);
+        evas_object_smart_member_del(obj);
+        evas_object_smart_changed(o);
+        return EINA_TRUE;
+     }
+
+   return EINA_FALSE;
+}
+
+/**
+ * Remove all child objects.
+ * @return 0 on errors
+ */
+EAPI Eina_Bool
+evas_object_box_remove_all(Evas_Object *o, Eina_Bool clear)
+{
+   const Evas_Object_Box_Api *api;
+
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, 0);
+
+   api = priv->api;
+   if ((!api) || (!api->remove)) return EINA_FALSE;
+
+   evas_object_smart_changed(o);
+
+   while (priv->children)
+     {
+        Evas_Object_Box_Option *opt = priv->children->data;
+        Evas_Object *obj;
+
+        obj = api->remove(o, priv, opt->obj);
+        if (obj)
+          {
+             _evas_object_box_child_callbacks_unregister(obj);
+             evas_object_smart_member_del(obj);
+             if (clear)
+               evas_object_del(obj);
+          }
+        else return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+}
+
+/**
+ * Get an iterator to walk the list of children for the box.
+ *
+ * @note Do not remove or delete objects while walking the list.
+ */
+EAPI Eina_Iterator *
+evas_object_box_iterator_new(const Evas_Object *o)
+{
+   Evas_Object_Box_Iterator *it;
+
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, NULL);
+
+   if (!priv->children) return NULL;
+
+   it = calloc(1, sizeof(Evas_Object_Box_Iterator));
+   if (!it) return NULL;
+
+   EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
+
+   it->real_iterator = eina_list_iterator_new(priv->children);
+   it->box = o;
+
+   it->iterator.next = FUNC_ITERATOR_NEXT(_evas_object_box_iterator_next);
+   it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_evas_object_box_iterator_get_container);
+   it->iterator.free = FUNC_ITERATOR_FREE(_evas_object_box_iterator_free);
+
+   return &it->iterator;
+}
+
+/**
+ * Get an accessor to get random access to the list of children for the box.
+ *
+ * @note Do not remove or delete objects while walking the list.
+ */
+EAPI Eina_Accessor *
+evas_object_box_accessor_new(const Evas_Object *o)
+{
+   Evas_Object_Box_Accessor *it;
+
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, NULL);
+
+   if (!priv->children) return NULL;
+
+   it = calloc(1, sizeof(Evas_Object_Box_Accessor));
+   if (!it) return NULL;
+
+   EINA_MAGIC_SET(&it->accessor, EINA_MAGIC_ACCESSOR);
+
+   it->real_accessor = eina_list_accessor_new(priv->children);
+   it->box = o;
+
+   it->accessor.get_at = FUNC_ACCESSOR_GET_AT(_evas_object_box_accessor_get_at);
+   it->accessor.get_container = FUNC_ACCESSOR_GET_CONTAINER(_evas_object_box_accessor_get_container);
+   it->accessor.free = FUNC_ACCESSOR_FREE(_evas_object_box_accessor_free);
+
+   return &it->accessor;
+}
+
+/**
+ * Get the list of children for the box.
+ *
+ * @note This is a duplicate of the list kept by the box internally.
+ *       It's up to the user to destroy it when it no longer needs it.
+ *       It's possible to remove objects from the box when walking this
+ *       list, but these removals won't be reflected on it.
+ */
+EAPI Eina_List *
+evas_object_box_children_get(const Evas_Object *o)
+{
+   Eina_List *new_list = NULL, *l;
+   Evas_Object_Box_Option *opt;
+
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, NULL);
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+      new_list = eina_list_append(new_list, opt->obj);
+
+   return new_list;
+}
+
+/**
+ * Get the name of the property of the child elements of the box @a o
+ * whose id is @a property. On error, @c NULL is returned.
+ */
+EAPI const char *
+evas_object_box_option_property_name_get(Evas_Object *o, int property)
+{
+   const Evas_Object_Box_Api *api;
+
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, NULL);
+
+   if (property < 0)
+     return NULL;
+
+   api = priv->api;
+   if ((!api) || (!api->property_name_get))
+     return NULL;
+
+   return api->property_name_get(o, property);
+}
+
+/**
+ * Get the id of the property of the child elements of the box @a o
+ * whose name is @a name. On error, @c -1 is returned.
+ */
+EAPI int
+evas_object_box_option_property_id_get(Evas_Object *o, const char *name)
+{
+   const Evas_Object_Box_Api *api;
+
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, -1);
+
+   if (!name)
+     return -1;
+
+   api = priv->api;
+   if ((!api) || (!api->property_id_get))
+     return -1;
+
+   return api->property_id_get(o, name);
+}
+
+/**
+ * Set the property (with id @a property) of the child element of the
+ * box @a o whose property struct is @a opt. The property's values
+ * must be the last arguments and their type *must* match that of the
+ * property itself. On error, @c 0 is returned.
+ */
+EAPI Eina_Bool
+evas_object_box_option_property_set(Evas_Object *o, Evas_Object_Box_Option *opt, int property, ...)
+{
+   Eina_Bool ret;
+   va_list args;
+
+   va_start(args, property);
+   ret = evas_object_box_option_property_vset(o, opt, property, args);
+   va_end(args);
+
+   return ret;
+}
+
+/**
+ * Set the property (with id @a property) of the child element of the
+ * box @a o whose property struct is @a opt. The property's values
+ * must be the args which the va_list @a args is initialized with and
+ * their type *must* match that of the property itself. On error, @c 0
+ * is returned.
+ */
+
+EAPI Eina_Bool
+evas_object_box_option_property_vset(Evas_Object *o, Evas_Object_Box_Option *opt, int property, va_list args)
+{
+   const Evas_Object_Box_Api *api;
+
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, 0);
+
+   if (!opt) return EINA_FALSE;
+
+   api = priv->api;
+   if ((!api) || (!api->property_set))
+     return EINA_FALSE;
+
+   if (!api->property_set(o, opt, property, args))
+     return EINA_FALSE;
+
+   evas_object_smart_changed(o);
+   return EINA_TRUE;
+}
+
+/**
+ * Get the property (with id @a property) of the child element of the
+ * box @a o whose property struct is @a opt. The last arguments must
+ * be addresses of variables with the same type of that property. On
+ * error, @c 0 is returned.
+ */
+EAPI Eina_Bool
+evas_object_box_option_property_get(Evas_Object *o, Evas_Object_Box_Option *opt, int property, ...)
+{
+   Eina_Bool ret;
+   va_list args;
+
+   va_start(args, property);
+   ret = evas_object_box_option_property_vget(o, opt, property, args);
+   va_end(args);
+
+   return ret;
+}
+
+/**
+ * Get the property (with id @a property) of the child element of the
+ * box @a o whose property struct is @a opt. The args which the
+ * va_list @a args is initialized with must be addresses of variables
+ * with the same type of that property. On error, @c 0 is returned.
+ */
+EAPI Eina_Bool
+evas_object_box_option_property_vget(Evas_Object *o, Evas_Object_Box_Option *opt, int property, va_list args)
+{
+   const Evas_Object_Box_Api *api;
+
+   EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, 0);
+
+   if (!opt) return EINA_FALSE;
+
+   api = priv->api;
+   if ((!api) || (!api->property_get))
+     return EINA_FALSE;
+
+   return api->property_get(o, opt, property, args);
+}
+
+/**
+ * @}
+ */
diff --git a/src/lib/canvas/evas_object_gradient.c b/src/lib/canvas/evas_object_gradient.c
new file mode 100644 (file)
index 0000000..54b50c9
--- /dev/null
@@ -0,0 +1,1157 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_private.h"
+#include "../engines/common/evas_convert_color.h"
+
+/* private magic number for gradient objects */
+static const char o_type[] = "gradient";
+
+/* private struct for gradient object internal data */
+typedef struct _Evas_Object_Gradient      Evas_Object_Gradient;
+
+struct _Evas_Object_Gradient
+{
+   DATA32            magic;
+
+   struct {
+      struct {
+      Evas_Angle     angle;
+      float          offset;
+      int            direction;
+      } map;
+      struct {
+         Evas_Coord  x, y, w, h;
+         Evas_Angle  angle;
+         int         spread;
+      } fill;
+      struct {
+         char       *name;
+         char       *params;
+      } type;
+      unsigned char    gradient_opaque : 1;
+   } cur, prev;
+
+   void             *engine_data;
+
+   unsigned char     changed : 1;
+   unsigned char     gradient_changed : 1;
+   unsigned char     type_changed : 1;
+};
+
+/* private methods for gradient objects */
+static void evas_object_gradient_init(Evas_Object *obj);
+static void *evas_object_gradient_new(void);
+static void evas_object_gradient_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
+static void evas_object_gradient_free(Evas_Object *obj);
+static void evas_object_gradient_render_pre(Evas_Object *obj);
+static void evas_object_gradient_render_post(Evas_Object *obj);
+
+static unsigned int evas_object_gradient_id_get(Evas_Object *obj);
+static unsigned int evas_object_gradient_visual_id_get(Evas_Object *obj);
+static void *evas_object_gradient_engine_data_get(Evas_Object *obj);
+
+static int evas_object_gradient_is_opaque(Evas_Object *obj);
+static int evas_object_gradient_was_opaque(Evas_Object *obj);
+
+static const Evas_Object_Func object_func =
+{
+   /* methods (compulsory) */
+   evas_object_gradient_free,
+     evas_object_gradient_render,
+     evas_object_gradient_render_pre,
+     evas_object_gradient_render_post,
+     evas_object_gradient_id_get,
+     evas_object_gradient_visual_id_get,
+     evas_object_gradient_engine_data_get,
+   /* these are optional. NULL = nothing */
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     evas_object_gradient_is_opaque,
+     evas_object_gradient_was_opaque,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL
+};
+
+/* the actual api call to add a gradient */
+
+/**
+ * @addtogroup Evas_Object_Gradient_Group
+ * @{
+ */
+
+/**
+ * Adds a gradient object to the given evas.
+ * @param   e The given evas.
+ * @return  A new evas gradient object if successful.  Otherwise, @c NULL.
+ * @ingroup Evas_Object_Gradient_Group
+ */
+EAPI Evas_Object *
+evas_object_gradient_add(Evas *e)
+{
+   Evas_Object *obj;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   obj = evas_object_new(e);
+   evas_object_gradient_init(obj);
+   evas_object_inject(obj, e);
+   if (obj->object_data)
+     {
+       Evas_Object_Gradient *o = (Evas_Object_Gradient *)(obj->object_data);
+
+       o->engine_data = e->engine.func->gradient_new(e->engine.data.output);
+     }
+   evas_object_change(obj);
+   return obj;
+}
+
+/**
+ * Adds a color stop to the given evas gradient object.
+ *
+ * The @p delta parameter determines the proportion of the gradient
+ * object that is to be set to the color.  For instance, if red is
+ * added with @p delta set to 2, and green is added with @p
+ * delta set to 1, two-thirds will be red or reddish and one-third
+ * will be green or greenish.
+ *
+ * Colors are added from the top downwards.
+ *
+ * @param   obj      The given evas gradient object.
+ * @param   r        Red component of the given color.
+ * @param   g        Green component of the given color.
+ * @param   b        Blue component of the given color.
+ * @param   a        Alpha component of the given color.
+ * @param   delta    Proportion of the gradient object that is this color.
+ */
+EAPI void
+evas_object_gradient_color_stop_add(Evas_Object *obj, int r, int g, int b, int a, int delta)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   if (o->engine_data)
+      obj->layer->evas->engine.func->gradient_color_stop_add(obj->layer->evas->engine.data.output,
+                                                            o->engine_data,
+                                                            r, g, b, a, delta);
+   o->gradient_changed = 1;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Adds an alpha stop to the given evas gradient object.
+ *
+ * The @p delta parameter determines the proportion of the gradient
+ * object that is to be set to the alpha value.
+ *
+ * Alphas are added from the top downwards.
+ *
+ * @param   obj      The given evas gradient object.
+ * @param   a        Alpha value.
+ * @param   delta    Proportion of the gradient object that is this alpha.
+ */
+EAPI void
+evas_object_gradient_alpha_stop_add(Evas_Object *obj, int a, int delta)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   if (o->engine_data)
+      obj->layer->evas->engine.func->gradient_alpha_stop_add(obj->layer->evas->engine.data.output,
+                                                            o->engine_data, a, delta);
+   o->gradient_changed = 1;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Deletes all stops set for the given evas gradient object or any set data.
+ * @param   obj The given evas gradient object.
+ */
+EAPI void
+evas_object_gradient_clear(Evas_Object *obj)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   if (o->engine_data)
+      obj->layer->evas->engine.func->gradient_clear(obj->layer->evas->engine.data.output,
+                                                   o->engine_data);
+   o->gradient_changed = 1;
+   o->changed = 1;
+   o->cur.gradient_opaque = 0;
+   evas_object_change(obj);
+}
+
+/**
+ * Sets color data for the given evas gradient object.
+ *
+ * If data is so set, any existing gradient stops will be deleted,
+ * The data is not copied, so if it was allocated, do not free it while it's set.
+ *
+ * @param   obj       The given evas gradient object.
+ * @param   data      The color data to be set. Should be in argb32 pixel format.
+ * @param   len       The length of the data pointer - multiple of the pixel size.
+ * @param   has_alpha A flag indicating if the data has alpha or not.
+ */
+EAPI void
+evas_object_gradient_color_data_set(Evas_Object *obj, void *data, int len, Eina_Bool has_alpha)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   if (o->engine_data)
+       obj->layer->evas->engine.func->gradient_color_data_set(obj->layer->evas->engine.data.output,
+                                                               o->engine_data,
+                                                               data, len, has_alpha);
+   o->gradient_changed = 1;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Sets alpha data for the given evas gradient object.
+ *
+ * If alpha data is so set, any existing gradient stops will be cleared,
+ * The data is not copied, so if it was allocated, do not free it while it's set.
+ *
+ * @param   obj       The given evas gradient object.
+ * @param   data      The alpha data to be set, in a8 format.
+ * @param   len       The length of the data pointer - multiple of the pixel size.
+ */
+EAPI void
+evas_object_gradient_alpha_data_set(Evas_Object *obj, void *data, int len)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   if (o->engine_data)
+       obj->layer->evas->engine.func->gradient_alpha_data_set(obj->layer->evas->engine.data.output,
+                                                               o->engine_data,
+                                                               data, len);
+   o->gradient_changed = 1;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Sets the rectangle on the gradient object that the gradient will be
+ * drawn to.
+ *
+ * Note that the gradient may be tiled around this one rectangle,
+ * according to its spread value - restrict, repeat, or reflect.  To have
+ * only one 'cycle' of the gradient drawn, the spread value must be set
+ * to restrict, or @p x and @p y must be 0 and @p w and @p h need to be
+ * the width and height of the gradient object respectively.
+ *
+ * The default values for the fill parameters is @p x = 0, @p y = 0,
+ * @p w = 32 and @p h = 32.
+ *
+ * @param   obj The given evas gradient object.
+ * @param   x   The X coordinate for the top left corner of the rect.
+ * @param   y   The Y coordinate for the top left corner of the rect.
+ * @param   w   The width of the rect.
+ * @param   h   The height of the rect.
+ */
+EAPI void
+evas_object_gradient_fill_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
+{
+   Evas_Object_Gradient *o;
+
+   if (w < 0) w = -w;
+   if (h < 0) h = -h;
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   if ((o->cur.fill.x == x) &&
+       (o->cur.fill.y == y) &&
+       (o->cur.fill.w == w) &&
+       (o->cur.fill.h == h)) return;
+   o->cur.fill.x = x;
+   o->cur.fill.y = y;
+   o->cur.fill.w = w;
+   o->cur.fill.h = h;
+   o->gradient_changed = 1;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves the dimensions of the rectangle on the gradient object that
+ * the gradient will use as its fill rect.
+ *
+ * See @ref evas_object_gradient_fill_set for more details.
+ *
+ * @param   obj The given evas gradient object.
+ * @param   x   Pointer to an Evas_Coord to store the X coordinate in.
+ * @param   y   Pointer to an Evas_Coord to store the Y coordinate in.
+ * @param   w   Pointer to an Evas_Coord to store the width in.
+ * @param   h   Pointer to an Evas_Coord to store the height in.
+ */
+EAPI void
+evas_object_gradient_fill_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = 0;
+   if (h) *h = 0;
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = 0;
+   if (h) *h = 0;
+   return;
+   MAGIC_CHECK_END();
+   if (x) *x = o->cur.fill.x;
+   if (y) *y = o->cur.fill.y;
+   if (w) *w = o->cur.fill.w;
+   if (h) *h = o->cur.fill.h;
+   return;
+}
+
+/**
+ * Sets the angle at which the given evas gradient object's fill sits clockwise
+ * from vertical.
+ * @param   obj   The given evas gradient object.
+ * @param   angle Angle in degrees.  Can be negative.
+ */
+EAPI void
+evas_object_gradient_fill_angle_set(Evas_Object *obj, Evas_Angle angle)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   if (angle == o->cur.fill.angle) return;
+   o->cur.fill.angle = angle;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves the angle at which the given evas gradient object's fill sits
+ * clockwise from the vertical.
+ * @param   obj The given evas gradient object.
+ * @return  The current angle if successful. @c 0.0 otherwise.
+ */
+EAPI Evas_Angle
+evas_object_gradient_fill_angle_get(const Evas_Object *obj)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return 0;
+   MAGIC_CHECK_END();
+   return o->cur.fill.angle;
+}
+
+/**
+ * Sets the tiling mode for the given evas gradient object's fill.
+ * @param   obj   The given evas gradient object.
+ * @param   spread One of EVAS_TEXTURE_REFLECT, EVAS_TEXTURE_REPEAT,
+ * EVAS_TEXTURE_RESTRICT, EVAS_TEXTURE_RESTRICT_REFLECT, EVAS_TEXTURE_RESTRICT_REPEAT,
+ * or EVAS_TEXTURE_PAD.
+ */
+EAPI void
+evas_object_gradient_fill_spread_set(Evas_Object *obj, int spread)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   if (spread == o->cur.fill.spread) return;
+   o->cur.fill.spread = spread;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves the spread (tiling mode) for the given gradient object's fill.
+ * @param   obj The given evas gradient object.
+ * @return  The current spread mode of the gradient object.
+ */
+EAPI int
+evas_object_gradient_fill_spread_get(const Evas_Object *obj)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return EVAS_TEXTURE_REFLECT;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return EVAS_TEXTURE_REFLECT;
+   MAGIC_CHECK_END();
+   return o->cur.fill.spread;
+}
+
+/**
+ * Sets the angle at which the given evas gradient sits,
+ * relative to whatever intrinsic orientation of the grad type.
+ * Used mostly by 'linear' kinds of gradients.
+ * @param   obj   The given evas gradient object.
+ * @param   angle Angle in degrees.  Can be negative.
+ */
+EAPI void
+evas_object_gradient_angle_set(Evas_Object *obj, Evas_Angle angle)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   if (angle == o->cur.map.angle) return;
+   o->cur.map.angle = angle;
+   o->gradient_changed = 1;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves the angle at which the given evas gradient object sits
+ * rel to its intrinsic orientation.
+ * @param   obj The given evas gradient object.
+ * @return  The current angle if successful. @c 0.0 otherwise.
+ */
+EAPI Evas_Angle
+evas_object_gradient_angle_get(const Evas_Object *obj)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return 0;
+   MAGIC_CHECK_END();
+   return o->cur.map.angle;
+}
+
+/**
+ * Sets the offset of the given evas gradient object's spectrum.
+ * @param   obj   The given evas gradient object.
+ * @param   offset Values can be negative.
+ */
+EAPI void
+evas_object_gradient_offset_set(Evas_Object *obj, float offset)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   if (offset == o->cur.map.offset) return;
+   o->cur.map.offset = offset;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves the spectrum's offset
+ * @param   obj The given evas gradient object.
+ * @return  The current gradient offset if successful. @c 0.0 otherwise.
+ */
+EAPI float
+evas_object_gradient_offset_get(const Evas_Object *obj)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0.0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return 0.0;
+   MAGIC_CHECK_END();
+   return o->cur.map.offset;
+}
+
+/**
+ * Sets the direction of the given evas gradient object's spectrum.
+ * @param   obj   The given evas gradient object.
+ * @param   direction Values are either 1 (the default) or -1.
+ */
+EAPI void
+evas_object_gradient_direction_set(Evas_Object *obj, int direction)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   if (direction == o->cur.map.direction) return;
+   o->cur.map.direction = direction;
+   o->changed = 1;
+   o->gradient_changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves the evas gradient object's spectrum direction
+ * @param   obj The given evas gradient object.
+ * @return  The current gradient direction if successful. @c 1 otherwise.
+ */
+EAPI int
+evas_object_gradient_direction_get(const Evas_Object *obj)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return 0;
+   MAGIC_CHECK_END();
+   return o->cur.map.direction;
+}
+
+/**
+ * Sets the geometric type displayed by the given gradient object.
+ * @param   obj  The given gradient object.
+ * @param   name Name of the geometric type that the gradient is to be drawn as.
+ * @param   params List of allowable params that the given gradient type allows.
+ * Can be NULL.
+ */
+EAPI void
+evas_object_gradient_type_set(Evas_Object *obj, const char *name, const char *params)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   if (!name || !*name)
+     {
+       name = "linear";
+       params = NULL;
+     }
+   if (params && !*params)
+       params = NULL;
+   if ((o->cur.type.name) && (!strcmp(o->cur.type.name, name)))
+     {
+       if ((!o->cur.type.params) && (!params))
+         return;
+       if ((o->cur.type.params) && (params) && (!strcmp(o->cur.type.params, params)))
+         return;
+       if (o->cur.type.params)
+         {
+           if (o->prev.type.params == o->cur.type.params)
+               o->prev.type.params = strdup(o->cur.type.params);
+           free(o->cur.type.params);
+           o->cur.type.params = NULL;
+         }
+       if (params)
+         o->cur.type.params = strdup(params);
+       o->changed = 1;
+       o->gradient_changed = 1;
+       o->type_changed = 1;
+       evas_object_change(obj);
+       return;
+     }
+
+   if (o->cur.type.name)
+     {
+       if (o->prev.type.name == o->cur.type.name)
+         o->prev.type.name = strdup(o->cur.type.name);
+       free(o->cur.type.name);
+       o->cur.type.name = NULL;
+     }
+   o->cur.type.name = strdup(name);
+
+   if (o->cur.type.params)
+     {
+       if (o->prev.type.params == o->cur.type.params)
+         o->prev.type.params = strdup(o->cur.type.params);
+       free(o->cur.type.params);
+       o->cur.type.params = NULL;
+     }
+   if (params)
+       o->cur.type.params = strdup(params);
+   o->changed = 1;
+   o->gradient_changed = 1;
+   o->type_changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves the type name and params of the given gradient object.
+ * @param   obj  The given gradient object.
+ * @param   name Pointer to a character pointer to store the pointer to the type
+ *               name in.
+ * @param   params  Pointer to a character pointer to store the pointer to the type
+ *               params string in.
+ */
+EAPI void
+evas_object_gradient_type_get(const Evas_Object *obj, char **name, char **params)
+{
+   Evas_Object_Gradient *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (name) *name = NULL;
+   if (params) *params = NULL;
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   if (name) *name = NULL;
+   if (params) *params = NULL;
+   return;
+   MAGIC_CHECK_END();
+   if (name) *name = o->cur.type.name;
+   if (params) *params = o->cur.type.params;
+}
+
+
+
+/**
+ * @}
+ */
+
+/*
+  these two functions don't really belong here as they can apply to other
+  objs as well, but for now..
+*/
+
+/**
+ * Convert a given color from HSV to RGB format.
+ *
+ * @param h The Hue component of the color.
+ * @param s The Saturation component of the color.
+ * @param v The Value component of the color.
+ * @param r The Red component of the color.
+ * @param g The Green component of the color.
+ * @param b The Blue component of the color.
+ *
+ * This function converts a given color in HSV color format to RGB
+ * color format.
+ *
+ * @ingroup Evas_Utils
+ **/
+EAPI void
+evas_color_hsv_to_rgb(float h, float s, float v, int *r, int *g, int *b)
+{
+   evas_common_convert_color_hsv_to_rgb(h, s, v, r, g, b);
+}
+
+/**
+ * Convert a given color from RGB to HSV format.
+ *
+ * @param r The Red component of the color.
+ * @param g The Green component of the color.
+ * @param b The Blue component of the color.
+ * @param h The Hue component of the color.
+ * @param s The Saturation component of the color.
+ * @param v The Value component of the color.
+ *
+ * This function converts a given color in RGB color format to HSV
+ * color format.
+ *
+ * @ingroup Evas_Utils
+ **/
+EAPI void
+evas_color_rgb_to_hsv(int r, int g, int b, float *h, float *s, float *v)
+{
+   evas_common_convert_color_rgb_to_hsv(r, g, b, h, s, v);
+}
+
+/**
+ * Pre-multiplies a rgb triplet by an alpha factor.
+ *
+ * @param a The alpha factor.
+ * @param r The Red component of the color.
+ * @param g The Green component of the color.
+ * @param b The Blue component of the color.
+ *
+ * This function pre-multiplies a given rbg triplet by an alpha
+ * factor. Alpha factor is used to define transparency.
+ *
+ * @ingroup Evas_Utils
+ **/
+EAPI void
+evas_color_argb_premul(int a, int *r, int *g, int *b)
+{
+   evas_common_convert_color_argb_premul(a, r, g, b);
+}
+
+/**
+ * Undo pre-multiplication of a rgb triplet by an alpha factor.
+ *
+ * @param a The alpha factor.
+ * @param r The Red component of the color.
+ * @param g The Green component of the color.
+ * @param b The Blue component of the color.
+ *
+ * This function undoes pre-multiplication a given rbg triplet by an
+ * alpha factor. Alpha factor is used to define transparency.
+ *
+ * @see evas_color_argb_premul().
+ *
+ * @ingroup Evas_Utils
+ **/
+EAPI void
+evas_color_argb_unpremul(int a, int *r, int *g, int *b)
+{
+   evas_common_convert_color_argb_unpremul(a, r, g, b);
+}
+
+/**
+ * Pre-multiplies data by an alpha factor.
+ *
+ * @param data The data value.
+ * @param len  The lenght value.
+ *
+ * This function pre-multiplies a given data by an alpha
+ * factor. Alpha factor is used to define transparency.
+ *
+ * @ingroup Evas_Utils
+ **/
+EAPI void
+evas_data_argb_premul(unsigned int *data, unsigned int len)
+{
+   if (!data || (len < 1)) return;
+   evas_common_convert_argb_premul(data, len);
+}
+
+/**
+ * Undo pre-multiplication data by an alpha factor.
+ *
+ * @param data The data value.
+ * @param len  The lenght value.
+ *
+ * This function undoes pre-multiplication of a given data by an alpha
+ * factor. Alpha factor is used to define transparency.
+ *
+ * @ingroup Evas_Utils
+ **/
+EAPI void
+evas_data_argb_unpremul(unsigned int *data, unsigned int len)
+{
+   if (!data || (len < 1)) return;
+   evas_common_convert_argb_unpremul(data, len);
+}
+
+
+
+/* all nice and private */
+static void
+evas_object_gradient_init(Evas_Object *obj)
+{
+   /* alloc grad ob, setup methods and default values */
+   obj->object_data = evas_object_gradient_new();
+   /* set up default settings for this kind of object */
+   obj->cur.color.r = 255;
+   obj->cur.color.g = 255;
+   obj->cur.color.b = 255;
+   obj->cur.color.a = 255;
+   obj->cur.geometry.x = 0;
+   obj->cur.geometry.y = 0;
+   obj->cur.geometry.w = 0;
+   obj->cur.geometry.h = 0;
+   obj->cur.layer = 0;
+   obj->cur.anti_alias = 1;
+   obj->cur.interpolation_color_space = EVAS_COLOR_SPACE_ARGB;
+   obj->cur.render_op = EVAS_RENDER_BLEND;
+   /* set up object-specific settings */
+   obj->prev = obj->cur;
+   /* set up methods (compulsory) */
+   obj->func = &object_func;
+   obj->type = o_type;
+}
+
+static void *
+evas_object_gradient_new(void)
+{
+   Evas_Object_Gradient *o;
+
+   /* alloc obj private data */
+   o = calloc(1, sizeof(Evas_Object_Gradient));
+   if (!o) return NULL;
+   o->magic = MAGIC_OBJ_GRADIENT;
+   o->cur.map.angle = 0;
+   o->cur.map.offset = 0.0;
+   o->cur.map.direction = 1;
+   o->cur.fill.x = 0;
+   o->cur.fill.y = 0;
+   o->cur.fill.w = 1;
+   o->cur.fill.h = 1;
+   o->cur.fill.angle = 0;
+   o->cur.fill.spread = EVAS_TEXTURE_REFLECT;
+   o->cur.type.name = strdup("linear");
+   o->cur.type.params = NULL;
+   o->cur.gradient_opaque = 0;
+   o->prev = o->cur;
+   o->changed = 1;
+   o->gradient_changed = 1;
+   o->type_changed = 1;
+   return o;
+}
+
+static void
+evas_object_gradient_free(Evas_Object *obj)
+{
+   Evas_Object_Gradient *o;
+
+   /* frees private object data. very simple here */
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   /* free obj */
+   if (o->prev.type.name && (o->prev.type.name != o->cur.type.name))
+       free(o->prev.type.name);
+   if (o->prev.type.params && (o->prev.type.params != o->cur.type.params))
+       free(o->prev.type.params);
+   if (o->cur.type.name)
+       free(o->cur.type.name);
+   if (o->cur.type.params)
+       free(o->cur.type.params);
+   if (o->engine_data)
+      obj->layer->evas->engine.func->gradient_free(obj->layer->evas->engine.data.output,
+                                                  o->engine_data);
+   free(o);
+   obj->object_data = NULL;
+}
+
+
+static void
+evas_object_grad_get_fill_coords(Evas_Object *obj, Evas_Coord fx, Evas_Coord fy, Evas_Coord fw, Evas_Coord fh, Evas_Coord *fx_ret, Evas_Coord *fy_ret, Evas_Coord *fw_ret,
+Evas_Coord *fh_ret)
+{
+   Evas_Coord  x, y, w, h;
+
+   x = ((fx * obj->layer->evas->output.w) /
+           (Evas_Coord)obj->layer->evas->viewport.w);
+   w = ((fw * obj->layer->evas->output.w) /
+       (Evas_Coord)obj->layer->evas->viewport.w);
+   y = ((fy * obj->layer->evas->output.h) /
+           (Evas_Coord)obj->layer->evas->viewport.h);
+   h = ((fh * obj->layer->evas->output.h) /
+       (Evas_Coord)obj->layer->evas->viewport.h);
+
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+
+   *fx_ret = x;  *fw_ret = w;
+   *fy_ret = y;  *fh_ret = h;
+}
+
+
+
+static void
+evas_object_gradient_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
+{
+   Evas_Object_Gradient *o;
+
+   /* render object to surface with context, and offxet by x,y */
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   obj->layer->evas->engine.func->context_multiplier_unset(output, context);
+   obj->layer->evas->engine.func->context_anti_alias_set(output, context, obj->cur.anti_alias);
+   obj->layer->evas->engine.func->context_render_op_set(output, context, obj->cur.render_op);
+   if (o->engine_data)
+     {
+       obj->layer->evas->engine.func->gradient_draw(output, context, surface,
+                                                    o->engine_data,
+                                                    obj->cur.geometry.x + x,
+                                                    obj->cur.geometry.y + y,
+                                                    obj->cur.geometry.w,
+                                                    obj->cur.geometry.h);
+////                                                obj->cur.cache.geometry.x + x,
+////                                                obj->cur.cache.geometry.y + y,
+////                                                obj->cur.cache.geometry.w,
+////                                                obj->cur.cache.geometry.h);
+     }
+}
+
+static void
+evas_object_gradient_render_pre(Evas_Object *obj)
+{
+   Evas_Object_Gradient *o;
+   int is_v, was_v;
+
+   /* dont pre-render the obj twice! */
+   if (obj->pre_render_done) return;
+   obj->pre_render_done = 1;
+   /* pre-render phase. this does anything an object needs to do just before */
+   /* rendering. this could mean loading the image data, retrieving it from */
+   /* elsewhere, decoding video etc. */
+   /* then when this is done the object needs to figure if it changed and */
+   /* if so what and where and add the appropriate redraw rectangles */
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   /* if someone is clipping this obj - go calculate the clipper */
+   if (obj->cur.clipper)
+     {
+       if (obj->cur.cache.clip.dirty)
+         evas_object_clip_recalc(obj->cur.clipper);
+       obj->cur.clipper->func->render_pre(obj->cur.clipper);
+     }
+   /* if it changed color */
+   if ((obj->cur.color.r != obj->prev.color.r) ||
+       (obj->cur.color.g != obj->prev.color.g) ||
+       (obj->cur.color.b != obj->prev.color.b) ||
+       (obj->cur.color.a != obj->prev.color.a))
+     { o->gradient_changed = 1;  o->changed = 1; }
+   if ((!o->gradient_changed) && ((obj->cur.cache.clip.r != obj->prev.cache.clip.r) ||
+       (obj->cur.cache.clip.g != obj->prev.cache.clip.g) ||
+       (obj->cur.cache.clip.b != obj->prev.cache.clip.b) ||
+       (obj->cur.cache.clip.a != obj->prev.cache.clip.a)))
+     { o->gradient_changed = 1;  o->changed = 1; }
+   if (!o->gradient_changed && (obj->cur.interpolation_color_space != obj->prev.interpolation_color_space))
+     { o->gradient_changed = 1;  o->changed = 1; }
+   if (!o->changed && (obj->cur.render_op != obj->prev.render_op))
+       o->changed = 1;
+   if (!o->changed && (obj->cur.anti_alias != obj->prev.anti_alias))
+       o->changed = 1;
+   if (o->changed && o->engine_data)
+     {
+       Evas_Coord  fx, fy, fw, fh;
+
+       evas_object_grad_get_fill_coords(obj, o->cur.fill.x, o->cur.fill.y,
+                                        o->cur.fill.w, o->cur.fill.h,
+                                        &fx, &fy, &fw, &fh);
+       obj->layer->evas->engine.func->gradient_fill_set(obj->layer->evas->engine.data.output, o->engine_data,
+                                                        fx, fy, fw, fh);
+       obj->layer->evas->engine.func->gradient_fill_angle_set(obj->layer->evas->engine.data.output, o->engine_data,
+                                                               o->cur.fill.angle);
+       obj->layer->evas->engine.func->gradient_fill_spread_set(obj->layer->evas->engine.data.output, o->engine_data,
+                                                               o->cur.fill.spread);
+       obj->layer->evas->engine.func->gradient_angle_set(obj->layer->evas->engine.data.output, o->engine_data,
+                                                         o->cur.map.angle);
+       obj->layer->evas->engine.func->gradient_direction_set(obj->layer->evas->engine.data.output, o->engine_data,
+                                                             o->cur.map.direction);
+       obj->layer->evas->engine.func->gradient_offset_set(obj->layer->evas->engine.data.output, o->engine_data,
+                                                          o->cur.map.offset);
+       if (o->type_changed)
+           obj->layer->evas->engine.func->gradient_type_set(obj->layer->evas->engine.data.output, o->engine_data,
+                                                             o->cur.type.name, o->cur.type.params);
+
+       obj->layer->evas->engine.func->context_anti_alias_set(obj->layer->evas->engine.data.output,
+                                                               obj->layer->evas->engine.data.context,
+                                                               obj->cur.anti_alias);
+       obj->layer->evas->engine.func->context_render_op_set(obj->layer->evas->engine.data.output,
+                                                            obj->layer->evas->engine.data.context, obj->cur.render_op);
+       obj->layer->evas->engine.func->context_multiplier_set(obj->layer->evas->engine.data.output,
+                                                               obj->layer->evas->engine.data.context,
+                                                               obj->cur.cache.clip.r, obj->cur.cache.clip.g,
+                                                               obj->cur.cache.clip.b, obj->cur.cache.clip.a);
+       obj->layer->evas->engine.func->context_color_interpolation_set(obj->layer->evas->engine.data.output,
+                                                                       obj->layer->evas->engine.data.context,
+                                                                       obj->cur.interpolation_color_space);
+       if (o->gradient_changed)
+           obj->layer->evas->engine.func->gradient_render_pre(obj->layer->evas->engine.data.output,
+                                                               obj->layer->evas->engine.data.context,
+                                                               o->engine_data);
+       o->cur.gradient_opaque = obj->layer->evas->engine.func->gradient_is_opaque(obj->layer->evas->engine.data.output,
+                                                                                  obj->layer->evas->engine.data.context,
+                                                                                  o->engine_data,
+                                                                                  obj->cur.cache.clip.x, obj->cur.cache.clip.y,
+                                                                                  obj->cur.cache.clip.w, obj->cur.cache.clip.h);
+
+       if (obj->cur.cache.clip.a != 255)
+           o->cur.gradient_opaque = 0;
+    }
+   /* now figure what changed and add draw rects */
+   /* if it just became visible or invisible */
+   is_v = evas_object_is_visible(obj);
+   was_v = evas_object_was_visible(obj);
+   if (is_v != was_v)
+     {
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+       goto done;
+     }
+   if (obj->cur.map != obj->prev.map)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+        goto done;
+     }
+   /* its not visible - we accounted for it appearing or not so just abort */
+   if (!is_v) goto done;
+   /* clipper changed this is in addition to anything else for obj */
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
+   /* gradient changed */
+   if (o->changed || obj->restack)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed geometry */
+   if ((obj->cur.geometry.x != obj->prev.geometry.x) ||
+       (obj->cur.geometry.y != obj->prev.geometry.y) ||
+       (obj->cur.geometry.w != obj->prev.geometry.w) ||
+       (obj->cur.geometry.h != obj->prev.geometry.h))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* it obviously didn't change - add a NO obscure - this "unupdates"  this */
+   /* area so if there were updates for it they get wiped. don't do it if we */
+   /* arent fully opaque and we are visible */
+
+   if (evas_object_is_visible(obj) &&
+       evas_object_is_opaque(obj))
+     obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output,
+                                                           obj->cur.cache.clip.x,
+                                                           obj->cur.cache.clip.y,
+                                                           obj->cur.cache.clip.w,
+                                                           obj->cur.cache.clip.h);
+
+   done:
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+}
+
+static void
+evas_object_gradient_render_post(Evas_Object *obj)
+{
+   Evas_Object_Gradient *o;
+
+   /* this moves the current data to the previous state parts of the object */
+   /* in whatever way is safest for the object. also if we don't need object */
+   /* data anymore we can free it if the object deems this is a good idea */
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   /* remove those pesky changes */
+   evas_object_clip_changes_clean(obj);
+   /* move cur to prev safely for object data */
+   obj->prev = obj->cur;
+   if (o->prev.type.name && (o->prev.type.name != o->cur.type.name))
+       free(o->prev.type.name);
+   if (o->prev.type.params && (o->prev.type.params != o->cur.type.params))
+       free(o->prev.type.params);
+   o->prev = o->cur;
+   o->changed = 0;
+   o->gradient_changed = 0;
+   o->type_changed = 0;
+}
+
+static unsigned int evas_object_gradient_id_get(Evas_Object *obj)
+{
+   Evas_Object_Gradient *o;
+
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_GRADIENT;
+}
+
+static unsigned int evas_object_gradient_visual_id_get(Evas_Object *obj)
+{
+   Evas_Object_Gradient *o;
+
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_GRADIENT;
+}
+
+static void *evas_object_gradient_engine_data_get(Evas_Object *obj)
+{
+   Evas_Object_Gradient *o;
+
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   if (!o) return NULL;
+   return o->engine_data;
+}
+
+static int
+evas_object_gradient_is_opaque(Evas_Object *obj)
+{
+   Evas_Object_Gradient *o;
+
+   /* this returns 1 if the internal object data implies that the object is */
+   /* currently fully opaque over the entire region it occupies */
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   if (!o->engine_data) return 0;
+   if ((obj->cur.map) && (obj->cur.usemap)) return 0;
+   return o->cur.gradient_opaque;
+}
+
+static int
+evas_object_gradient_was_opaque(Evas_Object *obj)
+{
+   Evas_Object_Gradient *o;
+
+   /* this returns 1 if the internal object data implies that the object was */
+   /* currently fully opaque over the entire region it occupies */
+   o = (Evas_Object_Gradient *)(obj->object_data);
+   if (!o->engine_data) return 0;
+   return o->prev.gradient_opaque;
+}
diff --git a/src/lib/canvas/evas_object_gradient2.c b/src/lib/canvas/evas_object_gradient2.c
new file mode 100644 (file)
index 0000000..ab003ce
--- /dev/null
@@ -0,0 +1,222 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+typedef struct _Evas_Object_Gradient2      Evas_Object_Gradient2;
+
+struct _Evas_Object_Gradient2
+{
+   DATA32            magic;
+
+   struct {
+      struct {
+         Evas_Common_Transform  transform;
+         int         spread;
+      } fill;
+      unsigned char    gradient_opaque : 1;
+   } cur, prev;
+
+   unsigned char     gradient_changed : 1;
+};
+
+
+/**
+ * @addtogroup Evas_Object_Gradient2_Group
+ * @{
+ */
+
+/**
+ * Inserts a color stop to the given evas gradient object.
+ *
+ * The @p pos parameter determines where along the unit interval
+ * [0,1] the color is to be inserted. The r,g,b,a data are assumed
+ * input as being NON-PREMULTIPLIED.
+ *
+ * @param   obj      The given evas gradient object.
+ * @param   r        Red component of the given color.
+ * @param   g        Green component of the given color.
+ * @param   b        Blue component of the given color.
+ * @param   a        Alpha component of the given color.
+ * @param   pos      The pos in [0,1] of this stop.
+ */
+EAPI void
+evas_object_gradient2_color_np_stop_insert(Evas_Object *obj, int r, int g, int b, int a, float pos)
+{
+   Evas_Object_Gradient2 *og;
+   void *engine_data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   og = (Evas_Object_Gradient2 *)(obj->object_data);
+   MAGIC_CHECK(og, Evas_Object_Gradient2, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   engine_data = obj->func->engine_data_get(obj);
+   if (engine_data)
+      obj->layer->evas->engine.func->gradient2_color_np_stop_insert(obj->layer->evas->engine.data.output,
+                                                            engine_data,
+                                                            r, g, b, a, pos);
+   og->gradient_changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Deletes all stops set for the given evas gradient object or any set data.
+ * @param   obj The given evas gradient object.
+ */
+EAPI void
+evas_object_gradient2_clear(Evas_Object *obj)
+{
+   Evas_Object_Gradient2 *og;
+   void *engine_data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   og = (Evas_Object_Gradient2 *)(obj->object_data);
+   MAGIC_CHECK(og, Evas_Object_Gradient2, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   engine_data = obj->func->engine_data_get(obj);
+   if (engine_data)
+      obj->layer->evas->engine.func->gradient2_clear(obj->layer->evas->engine.data.output,
+                                                    engine_data);
+   og->gradient_changed = 1;
+   og->cur.gradient_opaque = 0;
+   evas_object_change(obj);
+}
+
+
+/**
+ * Sets the tiling mode for the given evas gradient object's fill.
+ * @param   obj   The given evas gradient object.
+ * @param   spread One of EVAS_TEXTURE_REFLECT, EVAS_TEXTURE_REPEAT,
+ * EVAS_TEXTURE_RESTRICT, or EVAS_TEXTURE_PAD.
+ */
+EAPI void
+evas_object_gradient2_fill_spread_set(Evas_Object *obj, int spread)
+{
+   Evas_Object_Gradient2 *og;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   og = (Evas_Object_Gradient2 *)(obj->object_data);
+   MAGIC_CHECK(og, Evas_Object_Gradient2, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   if (spread == og->cur.fill.spread) return;
+   og->cur.fill.spread = spread;
+   og->gradient_changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves the spread (tiling mode) for the given gradient object's fill.
+ * @param   obj The given evas gradient object.
+ * @return  The current spread mode of the gradient object.
+ */
+EAPI int
+evas_object_gradient2_fill_spread_get(const Evas_Object *obj)
+{
+   Evas_Object_Gradient2 *og;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return EVAS_TEXTURE_REPEAT;
+   MAGIC_CHECK_END();
+   og = (Evas_Object_Gradient2 *)(obj->object_data);
+   MAGIC_CHECK(og, Evas_Object_Gradient2, MAGIC_OBJ_GRADIENT);
+   return EVAS_TEXTURE_REPEAT;
+   MAGIC_CHECK_END();
+   return og->cur.fill.spread;
+}
+
+/* FIXME: To be documented*/
+EAPI void
+evas_object_gradient2_fill_transform_set (Evas_Object *obj, Evas_Transform *t)
+{
+   Evas_Object_Gradient2 *og;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   og = (Evas_Object_Gradient2 *)(obj->object_data);
+   MAGIC_CHECK(og, Evas_Object_Gradient2, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   if (!t)
+     {
+       og->cur.fill.transform.mxx = 1;
+       og->cur.fill.transform.mxy = 0;
+       og->cur.fill.transform.mxz = 0;
+       og->cur.fill.transform.myx = 0;
+       og->cur.fill.transform.myy = 1;
+       og->cur.fill.transform.myz = 0;
+       og->cur.fill.transform.mzx = 0;
+       og->cur.fill.transform.mzy = 0;
+       og->cur.fill.transform.mzz = 1;
+
+       og->gradient_changed = 1;
+       evas_object_change(obj);
+       return;
+     }
+   if ( (og->cur.fill.transform.mxx == t->mxx) ||
+        (og->cur.fill.transform.mxy == t->mxy) ||
+        (og->cur.fill.transform.mxy == t->mxy) ||
+        (og->cur.fill.transform.mxy == t->mxy) ||
+        (og->cur.fill.transform.mxy == t->mxy) ||
+        (og->cur.fill.transform.mxy == t->mxy) ||
+        (og->cur.fill.transform.mxy == t->mxy) ||
+        (og->cur.fill.transform.mxy == t->mxy) ||
+        (og->cur.fill.transform.mxy == t->mxy) )
+           return;
+
+   og->cur.fill.transform.mxx = t->mxx;
+   og->cur.fill.transform.mxy = t->mxy;
+   og->cur.fill.transform.mxz = t->mxz;
+   og->cur.fill.transform.myx = t->myx;
+   og->cur.fill.transform.myy = t->myy;
+   og->cur.fill.transform.myz = t->myz;
+   og->cur.fill.transform.mzx = t->mzx;
+   og->cur.fill.transform.mzy = t->mzy;
+   og->cur.fill.transform.mzz = t->mzz;
+
+   og->gradient_changed = 1;
+   evas_object_change(obj);
+}
+
+/* FIXME: To be documented*/
+EAPI void
+evas_object_gradient2_fill_transform_get (const Evas_Object *obj, Evas_Transform *t)
+{
+   Evas_Object_Gradient2 *og;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   og = (Evas_Object_Gradient2 *)(obj->object_data);
+   MAGIC_CHECK(og, Evas_Object_Gradient2, MAGIC_OBJ_GRADIENT);
+   return;
+   MAGIC_CHECK_END();
+   if (t)
+     {
+        t->mxx = og->cur.fill.transform.mxx;
+        t->mxy = og->cur.fill.transform.mxy;
+        t->mxz = og->cur.fill.transform.mxz;
+        t->myx = og->cur.fill.transform.myx;
+        t->myy = og->cur.fill.transform.myy;
+        t->myz = og->cur.fill.transform.myz;
+        t->mzx = og->cur.fill.transform.mzx;
+        t->mzy = og->cur.fill.transform.mzy;
+        t->mzz = og->cur.fill.transform.mzz;
+     }
+}
+
+
+
+/**
+ * @}
+ */
+
+#include "evas_object_gradient2_linear.c"
+#include "evas_object_gradient2_radial.c"
diff --git a/src/lib/canvas/evas_object_gradient2_linear.c b/src/lib/canvas/evas_object_gradient2_linear.c
new file mode 100644 (file)
index 0000000..4358463
--- /dev/null
@@ -0,0 +1,474 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/* private magic number for linear gradient objects */
+static const char lg_type[] = "linear_gradient";
+
+/* private struct for gradient object internal data */
+typedef struct _Evas_Object_Gradient2_Linear      Evas_Object_Gradient2_Linear;
+
+struct _Evas_Object_Gradient2_Linear
+{
+   Evas_Object_Gradient2 base;
+
+   DATA32            magic;
+
+   struct {
+      struct {
+          float  x0, y0, x1, y1;
+      } fill;
+   } cur, prev;
+
+   void             *engine_data;
+
+   unsigned char     gradient_changed : 1;
+   unsigned char     changed : 1;
+};
+
+/* private methods for linear gradient objects */
+static void evas_object_gradient2_linear_init(Evas_Object *obj);
+static void *evas_object_gradient2_linear_new(void);
+
+static void evas_object_gradient2_linear_free(Evas_Object *obj);
+static void evas_object_gradient2_linear_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
+static void evas_object_gradient2_linear_render_pre(Evas_Object *obj);
+static void evas_object_gradient2_linear_render_post(Evas_Object *obj);
+
+static unsigned int evas_object_gradient2_linear_id_get(Evas_Object *obj);
+static unsigned int evas_object_gradient2_linear_visual_id_get(Evas_Object *obj);
+static void *evas_object_gradient2_linear_engine_data_get(Evas_Object *obj);
+
+static int evas_object_gradient2_linear_is_opaque(Evas_Object *obj);
+static int evas_object_gradient2_linear_was_opaque(Evas_Object *obj);
+
+static const Evas_Object_Func object_func =
+{
+   /* methods (compulsory) */
+   evas_object_gradient2_linear_free,
+     evas_object_gradient2_linear_render,
+     evas_object_gradient2_linear_render_pre,
+     evas_object_gradient2_linear_render_post,
+     evas_object_gradient2_linear_id_get,
+     evas_object_gradient2_linear_visual_id_get,
+     evas_object_gradient2_linear_engine_data_get,
+   /* these are optional. NULL = nothing */
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     evas_object_gradient2_linear_is_opaque,
+     evas_object_gradient2_linear_was_opaque,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL
+};
+
+/* the actual api call to add a gradient */
+
+/**
+ * @addtogroup Evas_Object_Gradient2_Group
+ * @{
+ * @ingroup Evas_Object_Specific
+ */
+
+/**
+ * Adds a gradient object to the given evas.
+ * @param   e The given evas.
+ * @return  A new evas gradient object if successful.  Otherwise, @c NULL.
+ */
+EAPI Evas_Object *
+evas_object_gradient2_linear_add(Evas *e)
+{
+   Evas_Object *obj;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   obj = evas_object_new(e);
+   evas_object_gradient2_linear_init(obj);
+   evas_object_inject(obj, e);
+   if (obj->object_data)
+     {
+       Evas_Object_Gradient2_Linear *o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
+
+       o->engine_data = e->engine.func->gradient2_linear_new(e->engine.data.output);
+     }
+   return obj;
+}
+
+
+/**
+ * Sets the start and end points of the linear gradient geometry for the object.
+ *
+ * Note that the gradient may extend beyond these,
+ * according to its spread value - restrict, repeat, or reflect.  To have
+ * only one 'cycle' of the gradient drawn, the spread value must be set
+ * to restrict.
+ * The default values for the fill parameters is @p x0 = 0, @p y0 = 0,
+ * @p x1 = 0 and @p y1 = 0.
+ *
+ * @param   obj The given evas linear gradient object.
+ * @param   x0   The X coordinate of the start point.
+ * @param   y0   The Y coordinate of the start point.
+ * @param   x1   The X coordinate of the end point.
+ * @param   y1   The Y coordinate of the end point
+ */
+EAPI void
+evas_object_gradient2_linear_fill_set(Evas_Object *obj, float x0, float y0, float x1, float y1)
+{
+   Evas_Object_Gradient2_Linear *o;
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient2_Linear, MAGIC_OBJ_GRADIENT_LINEAR);
+   return;
+   MAGIC_CHECK_END();
+   if ((o->cur.fill.x0 == x0) &&
+       (o->cur.fill.y0 == y0) &&
+       (o->cur.fill.x1 == x1) &&
+       (o->cur.fill.y1 == y1)) return;
+   o->cur.fill.x0 = x0;
+   o->cur.fill.y0 = y0;
+   o->cur.fill.x1 = x1;
+   o->cur.fill.y1 = y1;
+   o->gradient_changed = 1;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/*FIXME: To be documented*/
+EAPI void
+evas_object_gradient2_linear_fill_get(const Evas_Object *obj, float *x0, float *y0, float *x1, float *y1)
+{
+   Evas_Object_Gradient2_Linear *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (x0) *x0 = 0;
+   if (y0) *y0 = 0;
+   if (x1) *x1 = 0;
+   if (y1) *y1 = 0;
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient2_Linear, MAGIC_OBJ_GRADIENT_LINEAR);
+   if (x0) *x0 = 0;
+   if (y0) *y0 = 0;
+   if (x1) *x1 = 0;
+   if (y1) *y1 = 0;
+   return;
+   MAGIC_CHECK_END();
+   if (x0) *x0 = o->cur.fill.x0;
+   if (y0) *y0 = o->cur.fill.y0;
+   if (x1) *x1 = o->cur.fill.x1;
+   if (y1) *y1 = o->cur.fill.y1;
+   return;
+}
+
+/**
+ * @}
+ */
+
+/* all nice and private */
+static void
+evas_object_gradient2_linear_init(Evas_Object *obj)
+{
+   /* alloc grad ob, setup methods and default values */
+   obj->object_data = evas_object_gradient2_linear_new();
+   /* set up default settings for this kind of object */
+   obj->cur.color.r = 255;
+   obj->cur.color.g = 255;
+   obj->cur.color.b = 255;
+   obj->cur.color.a = 255;
+   obj->cur.geometry.x = 0;
+   obj->cur.geometry.y = 0;
+   obj->cur.geometry.w = 0;
+   obj->cur.geometry.h = 0;
+   obj->cur.layer = 0;
+   obj->cur.anti_alias = 1;
+   obj->cur.interpolation_color_space = EVAS_COLOR_SPACE_ARGB;
+   obj->cur.render_op = EVAS_RENDER_BLEND;
+   /* set up object-specific settings */
+   obj->prev = obj->cur;
+   /* set up methods (compulsory) */
+   obj->func = &object_func;
+   obj->type = lg_type;
+   obj->changed = 1;
+}
+
+static void *
+evas_object_gradient2_linear_new(void)
+{
+   Evas_Object_Gradient2_Linear *o;
+   Evas_Object_Gradient2 *og;
+
+   /* alloc obj private data */
+   o = calloc(1, sizeof(Evas_Object_Gradient2_Linear));
+   if (!o) return NULL;
+   o->magic = MAGIC_OBJ_GRADIENT_LINEAR;
+   o->cur.fill.x0 = 0;
+   o->cur.fill.y0 = 0;
+   o->cur.fill.x1 = 1;
+   o->cur.fill.y1 = 1;
+   og = (Evas_Object_Gradient2 *)o;
+   og->magic = MAGIC_OBJ_GRADIENT;
+   og->cur.fill.transform.mxx = og->cur.fill.transform.myy = og->cur.fill.transform.mzz = 1;
+   og->cur.fill.spread = EVAS_TEXTURE_REPEAT;
+   og->cur.gradient_opaque = 0;
+   og->prev = og->cur;
+   og->gradient_changed = 1;
+   o->prev = o->cur;
+   o->changed = 1;
+   o->gradient_changed = 1;
+   return o;
+}
+
+static void
+evas_object_gradient2_linear_free(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Linear *o;
+
+   /* frees private object data. very simple here */
+   o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient2_Linear, MAGIC_OBJ_GRADIENT_LINEAR);
+   return;
+   MAGIC_CHECK_END();
+   /* free obj */
+   if (o->engine_data)
+      obj->layer->evas->engine.func->gradient2_linear_free(obj->layer->evas->engine.data.output,
+                                                         o->engine_data);
+   free(o);
+   obj->object_data = NULL;
+}
+
+
+
+static void
+evas_object_gradient2_linear_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
+{
+   Evas_Object_Gradient2_Linear *o;
+
+   /* render object to surface with context, and offxet by x,y */
+   o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
+   obj->layer->evas->engine.func->context_multiplier_unset(output, context);
+   obj->layer->evas->engine.func->context_anti_alias_set(output, context, obj->cur.anti_alias);
+   obj->layer->evas->engine.func->context_render_op_set(output, context, obj->cur.render_op);
+   if (o->engine_data)
+     {
+       obj->layer->evas->engine.func->gradient2_linear_draw(output, context, surface,
+                                                    o->engine_data,
+                                                    obj->cur.geometry.x + x,
+                                                    obj->cur.geometry.y + y,
+                                                    obj->cur.geometry.w,
+                                                    obj->cur.geometry.h);
+     }
+}
+
+static void
+evas_object_gradient2_linear_render_pre(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Linear *o;
+   Evas_Object_Gradient2 *og;
+   int is_v, was_v;
+
+   /* dont pre-render the obj twice! */
+   if (obj->pre_render_done) return;
+   obj->pre_render_done = 1;
+   /* pre-render phase. this does anything an object needs to do just before */
+   /* rendering. this could mean loading the image data, retrieving it from */
+   /* elsewhere, decoding video etc. */
+   /* then when this is done the object needs to figure if it changed and */
+   /* if so what and where and add the appropriate redraw rectangles */
+   o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
+   og = (Evas_Object_Gradient2 *)(o);
+   /* if someone is clipping this obj - go calculate the clipper */
+   if (obj->cur.clipper)
+     {
+       if (obj->cur.cache.clip.dirty)
+         evas_object_clip_recalc(obj->cur.clipper);
+       obj->cur.clipper->func->render_pre(obj->cur.clipper);
+     }
+   /* if it changed color */
+   if ((obj->cur.color.r != obj->prev.color.r) ||
+       (obj->cur.color.g != obj->prev.color.g) ||
+       (obj->cur.color.b != obj->prev.color.b) ||
+       (obj->cur.color.a != obj->prev.color.a))
+     { o->gradient_changed = 1;  o->changed = 1; }
+   if ((!o->gradient_changed) && ((obj->cur.cache.clip.r != obj->prev.cache.clip.r) ||
+       (obj->cur.cache.clip.g != obj->prev.cache.clip.g) ||
+       (obj->cur.cache.clip.b != obj->prev.cache.clip.b) ||
+       (obj->cur.cache.clip.a != obj->prev.cache.clip.a)))
+     { o->gradient_changed = 1;  o->changed = 1; }
+   if (!o->gradient_changed && (obj->cur.interpolation_color_space != obj->prev.interpolation_color_space))
+     { o->gradient_changed = 1;  o->changed = 1; }
+   if (!o->changed && (obj->cur.render_op != obj->prev.render_op))
+       o->changed = 1;
+//   if (!o->changed && (obj->cur.anti_alias != obj->prev.anti_alias))
+//     o->changed = 1;
+   if (og->gradient_changed)
+     { o->gradient_changed = 1;  o->changed = 1; }
+   if (o->changed && o->engine_data)
+     {
+       obj->layer->evas->engine.func->context_render_op_set(obj->layer->evas->engine.data.output,
+                                                            obj->layer->evas->engine.data.context, obj->cur.render_op);
+       obj->layer->evas->engine.func->context_multiplier_set(obj->layer->evas->engine.data.output,
+                                                               obj->layer->evas->engine.data.context,
+                                                               obj->cur.cache.clip.r, obj->cur.cache.clip.g,
+                                                               obj->cur.cache.clip.b, obj->cur.cache.clip.a);
+       obj->layer->evas->engine.func->context_color_interpolation_set(obj->layer->evas->engine.data.output,
+                                                                       obj->layer->evas->engine.data.context,
+                                                                       obj->cur.interpolation_color_space);
+       if (o->gradient_changed)
+         {
+           obj->layer->evas->engine.func->gradient2_linear_fill_set(obj->layer->evas->engine.data.output, o->engine_data, o->cur.fill.x0, o->cur.fill.y0, o->cur.fill.x1, o->cur.fill.y1);
+           obj->layer->evas->engine.func->gradient2_fill_transform_set(obj->layer->evas->engine.data.output, o->engine_data,
+                                                               &og->cur.fill.transform);
+           obj->layer->evas->engine.func->gradient2_fill_spread_set(obj->layer->evas->engine.data.output, o->engine_data,
+                                                               og->cur.fill.spread);
+           obj->layer->evas->engine.func->gradient2_linear_render_pre(obj->layer->evas->engine.data.output,
+                                                               obj->layer->evas->engine.data.context,
+                                                               o->engine_data);
+         }
+       og->cur.gradient_opaque = obj->layer->evas->engine.func->gradient2_linear_is_opaque(obj->layer->evas->engine.data.output,
+                                                                                  obj->layer->evas->engine.data.context,
+                                                                                  o->engine_data,
+                                                                                  obj->cur.cache.clip.x, obj->cur.cache.clip.y,
+                                                                                  obj->cur.cache.clip.w, obj->cur.cache.clip.h);
+
+       if (obj->cur.cache.clip.a != 255)
+           og->cur.gradient_opaque = 0;
+    }
+
+   /* now figure what changed and add draw rects */
+   /* if it just became visible or invisible */
+   is_v = evas_object_is_visible(obj);
+   was_v = evas_object_was_visible(obj);
+   if (is_v != was_v)
+     {
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+       goto done;
+     }
+   if ((obj->cur.map != obj->prev.map) ||
+       (obj->cur.usemap != obj->prev.usemap))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+        goto done;
+     }
+   /* its not visible - we accounted for it appearing or not so just abort */
+   if (!is_v) goto done;
+   /* clipper changed this is in addition to anything else for obj */
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
+   /* gradient changed */
+   if (o->changed || obj->restack)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed geometry */
+   if ((obj->cur.geometry.x != obj->prev.geometry.x) ||
+       (obj->cur.geometry.y != obj->prev.geometry.y) ||
+       (obj->cur.geometry.w != obj->prev.geometry.w) ||
+       (obj->cur.geometry.h != obj->prev.geometry.h))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* it obviously didn't change - add a NO obscure - this "unupdates"  this */
+   /* area so if there were updates for it they get wiped. don't do it if we */
+   /* arent fully opaque and we are visible */
+
+   if (evas_object_is_visible(obj) &&
+       evas_object_is_opaque(obj))
+     obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output,
+                                                           obj->cur.cache.clip.x,
+                                                           obj->cur.cache.clip.y,
+                                                           obj->cur.cache.clip.w,
+                                                           obj->cur.cache.clip.h);
+
+   done:
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+}
+
+static void
+evas_object_gradient2_linear_render_post(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Linear *o;
+   Evas_Object_Gradient2 *og;
+
+   /* this moves the current data to the previous state parts of the object */
+   /* in whatever way is safest for the object. also if we don't need object */
+   /* data anymore we can free it if the object deems this is a good idea */
+   o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
+   og = (Evas_Object_Gradient2 *)(o);
+   /* remove those pesky changes */
+   evas_object_clip_changes_clean(obj);
+   /* move cur to prev safely for object data */
+   obj->prev = obj->cur;
+   obj->changed = 0;
+   o->prev = o->cur;
+   o->changed = 0;
+   o->gradient_changed = 0;
+   og->prev = og->cur;
+   og->gradient_changed = 0;
+}
+
+static unsigned int evas_object_gradient2_linear_id_get(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Linear *o;
+
+   o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_GRADIENT_LINEAR;
+}
+
+static unsigned int evas_object_gradient2_linear_visual_id_get(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Linear *o;
+
+   o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_GRADIENT;
+}
+
+static void *evas_object_gradient2_linear_engine_data_get(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Linear *o;
+
+   o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
+   if (!o) return NULL;
+   return o->engine_data;
+}
+
+
+static int
+evas_object_gradient2_linear_is_opaque(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Linear *o;
+   Evas_Object_Gradient2 *og;
+
+   /* this returns 1 if the internal object data implies that the object is */
+   /* currently fully opaque over the entire region it occupies */
+   if ((obj->cur.map) && (obj->cur.usemap)) return 0;
+   o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
+   if (!o->engine_data) return 0;
+   og = (Evas_Object_Gradient2 *)(o);
+   return og->cur.gradient_opaque;
+ }
+
+static int
+evas_object_gradient2_linear_was_opaque(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Linear *o;
+   Evas_Object_Gradient2 *og;
+
+   /* this returns 1 if the internal object data implies that the object was */
+   /* currently fully opaque over the entire region it occupies */
+   o = (Evas_Object_Gradient2_Linear *)(obj->object_data);
+   if (!o->engine_data) return 0;
+   og = (Evas_Object_Gradient2 *)(o);
+   return og->prev.gradient_opaque;
+}
diff --git a/src/lib/canvas/evas_object_gradient2_radial.c b/src/lib/canvas/evas_object_gradient2_radial.c
new file mode 100644 (file)
index 0000000..a0048be
--- /dev/null
@@ -0,0 +1,471 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/* private magic number for radial gradient objects */
+static const char rg_type[] = "radial_gradient";
+
+/* private struct for gradient object internal data */
+typedef struct _Evas_Object_Gradient2_Radial      Evas_Object_Gradient2_Radial;
+
+struct _Evas_Object_Gradient2_Radial
+{
+   Evas_Object_Gradient2 base;
+
+   DATA32            magic;
+
+   struct {
+      struct {
+         float  cx, cy, rx, ry;
+      } fill;
+   } cur, prev;
+
+   void             *engine_data;
+
+   unsigned char     gradient_changed : 1;
+   unsigned char     changed : 1;
+};
+
+/* private methods for radial gradient objects */
+static void evas_object_gradient2_radial_init(Evas_Object *obj);
+static void *evas_object_gradient2_radial_new(void);
+
+static void evas_object_gradient2_radial_free(Evas_Object *obj);
+static void evas_object_gradient2_radial_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
+static void evas_object_gradient2_radial_render_pre(Evas_Object *obj);
+static void evas_object_gradient2_radial_render_post(Evas_Object *obj);
+
+static unsigned int evas_object_gradient2_radial_id_get(Evas_Object *obj);
+static unsigned int evas_object_gradient2_radial_visual_id_get(Evas_Object *obj);
+static void *evas_object_gradient2_radial_engine_data_get(Evas_Object *obj);
+
+static int evas_object_gradient2_radial_is_opaque(Evas_Object *obj);
+static int evas_object_gradient2_radial_was_opaque(Evas_Object *obj);
+
+static const Evas_Object_Func rg_object_func =
+{
+   /* methods (compulsory) */
+   evas_object_gradient2_radial_free,
+     evas_object_gradient2_radial_render,
+     evas_object_gradient2_radial_render_pre,
+     evas_object_gradient2_radial_render_post,
+     evas_object_gradient2_radial_id_get,
+     evas_object_gradient2_radial_visual_id_get,
+     evas_object_gradient2_radial_engine_data_get,
+   /* these are optional. NULL = nothing */
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     evas_object_gradient2_radial_is_opaque,
+     evas_object_gradient2_radial_was_opaque,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL
+};
+
+/* the actual api call to add a gradient */
+
+/**
+ * @addtogroup Evas_Object_Gradient2_Group
+ * @{
+ * @ingroup Evas_Object_Specific
+ */
+
+/**
+ * Adds a gradient object to the given evas.
+ * @param   e The given evas.
+ * @return  A new evas gradient object if successful.  Otherwise, @c NULL.
+ */
+EAPI Evas_Object *
+evas_object_gradient2_radial_add(Evas *e)
+{
+   Evas_Object *obj;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   obj = evas_object_new(e);
+   evas_object_gradient2_radial_init(obj);
+   evas_object_inject(obj, e);
+   if (obj->object_data)
+     {
+       Evas_Object_Gradient2_Radial *o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
+
+       o->engine_data = e->engine.func->gradient2_radial_new(e->engine.data.output);
+     }
+   return obj;
+}
+
+/**
+ * Sets the center and radii of the radial gradient geometry for the object.
+ *
+ * Note that the gradient may extend beyond these,
+ * according to its spread value - restrict, repeat, or reflect.  To have
+ * only one 'cycle' of the gradient drawn, the spread value must be set
+ * to restrict.
+ * The default values for the fill parameters is @p cx = 0, @p cy = 0,
+ * @p rx = 0 and @p ry = 0.
+ *
+ * @param   obj The given evas radial gradient object.
+ * @param   cx   The X coordinate of the start point.
+ * @param   cy   The Y coordinate of the start point.
+ * @param   rx   The length of the x-cordinate radius.
+ * @param   ry   The length of the y-coordinate radius.
+ */
+EAPI void
+evas_object_gradient2_radial_fill_set(Evas_Object *obj, float cx, float cy, float rx, float ry)
+{
+   Evas_Object_Gradient2_Radial *o;
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient2_Radial, MAGIC_OBJ_GRADIENT_RADIAL);
+   return;
+   MAGIC_CHECK_END();
+   if ((o->cur.fill.cx == cx) &&
+       (o->cur.fill.cy == cy) &&
+       (o->cur.fill.rx == rx) &&
+       (o->cur.fill.ry == ry)) return;
+   o->cur.fill.cx = cx;
+   o->cur.fill.cy = cy;
+   o->cur.fill.rx = rx;
+   o->cur.fill.ry = ry;
+   o->gradient_changed = 1;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+EAPI void
+evas_object_gradient2_radial_fill_get(const Evas_Object *obj, float *cx, float *cy, float *rx, float *ry)
+{
+   Evas_Object_Gradient2_Radial *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (cx) *cx = 0;
+   if (cy) *cy = 0;
+   if (rx) *rx = 0;
+   if (ry) *ry = 0;
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient2_Radial, MAGIC_OBJ_GRADIENT_RADIAL);
+   if (cx) *cx = 0;
+   if (cy) *cy = 0;
+   if (rx) *rx = 0;
+   if (ry) *ry = 0;
+   return;
+   MAGIC_CHECK_END();
+   if (cx) *cx = o->cur.fill.cx;
+   if (cy) *cy = o->cur.fill.cy;
+   if (rx) *rx = o->cur.fill.rx;
+   if (ry) *ry = o->cur.fill.ry;
+   return;
+}
+
+/**
+ * @}
+ */
+
+/* all nice and private */
+static void
+evas_object_gradient2_radial_init(Evas_Object *obj)
+{
+   /* alloc grad ob, setup methods and default values */
+   obj->object_data = evas_object_gradient2_radial_new();
+   /* set up default settings for this kind of object */
+   obj->cur.color.r = 255;
+   obj->cur.color.g = 255;
+   obj->cur.color.b = 255;
+   obj->cur.color.a = 255;
+   obj->cur.geometry.x = 0;
+   obj->cur.geometry.y = 0;
+   obj->cur.geometry.w = 0;
+   obj->cur.geometry.h = 0;
+   obj->cur.layer = 0;
+   obj->cur.anti_alias = 1;
+   obj->cur.interpolation_color_space = EVAS_COLOR_SPACE_ARGB;
+   obj->cur.render_op = EVAS_RENDER_BLEND;
+   /* set up object-specific settings */
+   obj->prev = obj->cur;
+   /* set up methods (compulsory) */
+   obj->func = &rg_object_func;
+   obj->type = rg_type;
+   obj->changed = 1;
+}
+
+static void *
+evas_object_gradient2_radial_new(void)
+{
+   Evas_Object_Gradient2_Radial *o;
+   Evas_Object_Gradient2 *og;
+
+   /* alloc obj private data */
+   o = calloc(1, sizeof(Evas_Object_Gradient2_Radial));
+   if (!o) return NULL;
+   o->magic = MAGIC_OBJ_GRADIENT_RADIAL;
+   o->cur.fill.cx = 0;
+   o->cur.fill.cy = 0;
+   o->cur.fill.rx = 1;
+   o->cur.fill.ry = 1;
+   og = (Evas_Object_Gradient2 *)o;
+   og->magic = MAGIC_OBJ_GRADIENT;
+   og->cur.fill.transform.mxx = og->cur.fill.transform.myy = og->cur.fill.transform.mzz = 1;
+   og->cur.fill.spread = EVAS_TEXTURE_REPEAT;
+   og->cur.gradient_opaque = 0;
+   og->prev = og->cur;
+   og->gradient_changed = 1;
+   o->prev = o->cur;
+   o->changed = 1;
+   o->gradient_changed = 1;
+   return o;
+}
+
+static void
+evas_object_gradient2_radial_free(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Radial *o;
+
+   /* frees private object data. very simple here */
+   o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Gradient2_Radial, MAGIC_OBJ_GRADIENT_RADIAL);
+   return;
+   MAGIC_CHECK_END();
+   /* free obj */
+   if (o->engine_data)
+      obj->layer->evas->engine.func->gradient2_radial_free(obj->layer->evas->engine.data.output,
+                                                         o->engine_data);
+   free(o);
+   obj->object_data = NULL;
+}
+
+
+
+static void
+evas_object_gradient2_radial_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
+{
+   Evas_Object_Gradient2_Radial *o;
+
+   /* render object to surface with context, and offxet by x,y */
+   o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
+   obj->layer->evas->engine.func->context_multiplier_unset(output, context);
+   obj->layer->evas->engine.func->context_anti_alias_set(output, context, obj->cur.anti_alias);
+   obj->layer->evas->engine.func->context_render_op_set(output, context, obj->cur.render_op);
+   if (o->engine_data)
+     {
+       obj->layer->evas->engine.func->gradient2_radial_draw(output, context, surface,
+                                                    o->engine_data,
+                                                    obj->cur.geometry.x + x,
+                                                    obj->cur.geometry.y + y,
+                                                    obj->cur.geometry.w,
+                                                    obj->cur.geometry.h);
+     }
+}
+
+static void
+evas_object_gradient2_radial_render_pre(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Radial *o;
+   Evas_Object_Gradient2 *og;
+   int is_v, was_v;
+
+   /* dont pre-render the obj twice! */
+   if (obj->pre_render_done) return;
+   obj->pre_render_done = 1;
+   /* pre-render phase. this does anything an object needs to do just before */
+   /* rendering. this could mean loading the image data, retrieving it from */
+   /* elsewhere, decoding video etc. */
+   /* then when this is done the object needs to figure if it changed and */
+   /* if so what and where and add the appropriate redraw rectangles */
+   o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
+   og = (Evas_Object_Gradient2 *)(o);
+   /* if someone is clipping this obj - go calculate the clipper */
+   if (obj->cur.clipper)
+     {
+       if (obj->cur.cache.clip.dirty)
+         evas_object_clip_recalc(obj->cur.clipper);
+       obj->cur.clipper->func->render_pre(obj->cur.clipper);
+     }
+   /* if it changed color */
+   if ((obj->cur.color.r != obj->prev.color.r) ||
+       (obj->cur.color.g != obj->prev.color.g) ||
+       (obj->cur.color.b != obj->prev.color.b) ||
+       (obj->cur.color.a != obj->prev.color.a))
+     { o->gradient_changed = 1;  o->changed = 1; }
+   if ((!o->gradient_changed) && ((obj->cur.cache.clip.r != obj->prev.cache.clip.r) ||
+       (obj->cur.cache.clip.g != obj->prev.cache.clip.g) ||
+       (obj->cur.cache.clip.b != obj->prev.cache.clip.b) ||
+       (obj->cur.cache.clip.a != obj->prev.cache.clip.a)))
+     { o->gradient_changed = 1;  o->changed = 1; }
+   if (!o->gradient_changed && (obj->cur.interpolation_color_space != obj->prev.interpolation_color_space))
+     { o->gradient_changed = 1;  o->changed = 1; }
+   if (!o->changed && (obj->cur.render_op != obj->prev.render_op))
+       o->changed = 1;
+//   if (!o->changed && (obj->cur.anti_alias != obj->prev.anti_alias))
+//     o->changed = 1;
+   if (og->gradient_changed)
+     { o->gradient_changed = 1;  o->changed = 1; }
+   if (o->changed && o->engine_data)
+     {
+       obj->layer->evas->engine.func->context_render_op_set(obj->layer->evas->engine.data.output,
+                                                            obj->layer->evas->engine.data.context, obj->cur.render_op);
+       obj->layer->evas->engine.func->context_multiplier_set(obj->layer->evas->engine.data.output,
+                                                               obj->layer->evas->engine.data.context,
+                                                               obj->cur.cache.clip.r, obj->cur.cache.clip.g,
+                                                               obj->cur.cache.clip.b, obj->cur.cache.clip.a);
+       obj->layer->evas->engine.func->context_color_interpolation_set(obj->layer->evas->engine.data.output,
+                                                                       obj->layer->evas->engine.data.context,
+                                                                       obj->cur.interpolation_color_space);
+       if (o->gradient_changed)
+         {
+           obj->layer->evas->engine.func->gradient2_radial_fill_set(obj->layer->evas->engine.data.output, o->engine_data, o->cur.fill.cx, o->cur.fill.cy, o->cur.fill.rx, o->cur.fill.ry);
+           obj->layer->evas->engine.func->gradient2_fill_transform_set(obj->layer->evas->engine.data.output, o->engine_data,
+                                                               &og->cur.fill.transform);
+           obj->layer->evas->engine.func->gradient2_fill_spread_set(obj->layer->evas->engine.data.output, o->engine_data,
+                                                               og->cur.fill.spread);
+           obj->layer->evas->engine.func->gradient2_radial_render_pre(obj->layer->evas->engine.data.output,
+                                                               obj->layer->evas->engine.data.context,
+                                                               o->engine_data);
+         }
+       og->cur.gradient_opaque = obj->layer->evas->engine.func->gradient2_radial_is_opaque(obj->layer->evas->engine.data.output,
+                                                                                  obj->layer->evas->engine.data.context,
+                                                                                  o->engine_data,
+                                                                                  obj->cur.cache.clip.x, obj->cur.cache.clip.y,
+                                                                                  obj->cur.cache.clip.w, obj->cur.cache.clip.h);
+
+       if (obj->cur.cache.clip.a != 255)
+           og->cur.gradient_opaque = 0;
+    }
+   /* now figure what changed and add draw rects */
+   /* if it just became visible or invisible */
+   is_v = evas_object_is_visible(obj);
+   was_v = evas_object_was_visible(obj);
+   if (is_v != was_v)
+     {
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+       goto done;
+     }
+   if ((obj->cur.map != obj->prev.map) ||
+       (obj->cur.usemap != obj->prev.usemap))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+        goto done;
+     }
+   /* its not visible - we accounted for it appearing or not so just abort */
+   if (!is_v) goto done;
+   /* clipper changed this is in addition to anything else for obj */
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
+   /* gradient changed */
+   if (o->changed || obj->restack)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed geometry */
+   if ((obj->cur.geometry.x != obj->prev.geometry.x) ||
+       (obj->cur.geometry.y != obj->prev.geometry.y) ||
+       (obj->cur.geometry.w != obj->prev.geometry.w) ||
+       (obj->cur.geometry.h != obj->prev.geometry.h))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* it obviously didn't change - add a NO obscure - this "unupdates"  this */
+   /* area so if there were updates for it they get wiped. don't do it if we */
+   /* arent fully opaque and we are visible */
+
+   if (evas_object_is_visible(obj) &&
+       evas_object_is_opaque(obj))
+     obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output,
+                                                           obj->cur.cache.clip.x,
+                                                           obj->cur.cache.clip.y,
+                                                           obj->cur.cache.clip.w,
+                                                           obj->cur.cache.clip.h);
+
+   done:
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+}
+
+static void
+evas_object_gradient2_radial_render_post(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Radial *o;
+   Evas_Object_Gradient2 *og;
+
+   /* this moves the current data to the previous state parts of the object */
+   /* in whatever way is safest for the object. also if we don't need object */
+   /* data anymore we can free it if the object deems this is a good idea */
+   o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
+   og = (Evas_Object_Gradient2 *)(o);
+   /* remove those pesky changes */
+   evas_object_clip_changes_clean(obj);
+   /* move cur to prev safely for object data */
+   obj->prev = obj->cur;
+   obj->changed = 0;
+   o->prev = o->cur;
+   o->changed = 0;
+   o->gradient_changed = 0;
+   og->prev = og->cur;
+   og->gradient_changed = 0;
+}
+
+static unsigned int evas_object_gradient2_radial_id_get(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Radial *o;
+
+   o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_GRADIENT_RADIAL;
+}
+
+static unsigned int evas_object_gradient2_radial_visual_id_get(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Radial *o;
+
+   o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_GRADIENT;
+}
+
+static void *evas_object_gradient2_radial_engine_data_get(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Radial *o;
+
+   o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
+   if (!o) return NULL;
+   return o->engine_data;
+}
+
+
+static int
+evas_object_gradient2_radial_is_opaque(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Radial *o;
+   Evas_Object_Gradient2 *og;
+
+   /* this returns 1 if the internal object data implies that the object is */
+   /* currently fully opaque over the entire region it occupies */
+   if ((obj->cur.map) && (obj->cur.usemap)) return 0;
+   o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
+   if (!o->engine_data) return 0;
+   og = (Evas_Object_Gradient2 *)(o);
+   return og->cur.gradient_opaque;
+ }
+
+static int
+evas_object_gradient2_radial_was_opaque(Evas_Object *obj)
+{
+   Evas_Object_Gradient2_Radial *o;
+   Evas_Object_Gradient2 *og;
+
+   /* this returns 1 if the internal object data implies that the object was */
+   /* currently fully opaque over the entire region it occupies */
+   o = (Evas_Object_Gradient2_Radial *)(obj->object_data);
+   if (!o->engine_data) return 0;
+   og = (Evas_Object_Gradient2 *)(o);
+   return og->prev.gradient_opaque;
+}
diff --git a/src/lib/canvas/evas_object_image.c b/src/lib/canvas/evas_object_image.c
new file mode 100644 (file)
index 0000000..233c5d8
--- /dev/null
@@ -0,0 +1,3125 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_private.h"
+#include "../engines/common/evas_convert_color.h"
+#include "../engines/common/evas_convert_colorspace.h"
+#include "../engines/common/evas_convert_yuv.h"
+
+/* private magic number for image objects */
+static const char o_type[] = "image";
+
+/* private struct for rectangle object internal data */
+typedef struct _Evas_Object_Image      Evas_Object_Image;
+
+struct _Evas_Object_Image
+{
+   DATA32            magic;
+
+   struct {
+      Evas_Common_Transform  transform;
+      int         spread;
+      Evas_Coord_Rectangle fill;
+      struct {
+        short         w, h, stride;
+      } image;
+      struct {
+        short         l, r, t, b;
+        unsigned char fill;
+         double        scale;
+      } border;
+
+      const char    *file;
+      const char    *key;
+      int            cspace;
+
+      unsigned char  smooth_scale : 1;
+      unsigned char  has_alpha :1;
+   } cur, prev;
+
+   int               pixels_checked_out;
+   int               load_error;
+   Eina_List        *pixel_updates;
+
+   struct {
+      unsigned char  scale_down_by;
+      double         dpi;
+      short          w, h;
+      struct {
+         short       x, y, w, h;
+      } region;
+   } load_opts;
+
+   struct {
+      void            (*get_pixels) (void *data, Evas_Object *o);
+      void             *get_pixels_data;
+   } func;
+
+   Evas_Image_Scale_Hint   scale_hint;
+   Evas_Image_Content_Hint content_hint;
+
+   void             *engine_data;
+
+   unsigned char     changed : 1;
+   unsigned char     dirty_pixels : 1;
+   unsigned char     filled : 1;
+};
+
+/* private methods for image objects */
+static void evas_object_image_unload(Evas_Object *obj, Eina_Bool dirty);
+static void evas_object_image_load(Evas_Object *obj);
+static Evas_Coord evas_object_image_figure_x_fill(Evas_Object *obj, Evas_Coord start, Evas_Coord size, Evas_Coord *size_ret);
+static Evas_Coord evas_object_image_figure_y_fill(Evas_Object *obj, Evas_Coord start, Evas_Coord size, Evas_Coord *size_ret);
+
+static void evas_object_image_init(Evas_Object *obj);
+static void *evas_object_image_new(void);
+static void evas_object_image_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
+static void evas_object_image_free(Evas_Object *obj);
+static void evas_object_image_render_pre(Evas_Object *obj);
+static void evas_object_image_render_post(Evas_Object *obj);
+
+static unsigned int evas_object_image_id_get(Evas_Object *obj);
+static unsigned int evas_object_image_visual_id_get(Evas_Object *obj);
+static void *evas_object_image_engine_data_get(Evas_Object *obj);
+
+static int evas_object_image_is_opaque(Evas_Object *obj);
+static int evas_object_image_was_opaque(Evas_Object *obj);
+static int evas_object_image_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
+static int evas_object_image_has_opaque_rect(Evas_Object *obj);
+static int evas_object_image_get_opaque_rect(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
+static int evas_object_image_can_map(Evas_Object *obj);
+
+static void *evas_object_image_data_convert_internal(Evas_Object_Image *o, void *data, Evas_Colorspace to_cspace);
+static void evas_object_image_filled_resize_listener(void *data, Evas *e, Evas_Object *obj, void *einfo);
+
+static const Evas_Object_Func object_func =
+{
+   /* methods (compulsory) */
+   evas_object_image_free,
+     evas_object_image_render,
+     evas_object_image_render_pre,
+     evas_object_image_render_post,
+     evas_object_image_id_get,
+     evas_object_image_visual_id_get,
+     evas_object_image_engine_data_get,
+     /* these are optional. NULL = nothing */
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     evas_object_image_is_opaque,
+     evas_object_image_was_opaque,
+     evas_object_image_is_inside,
+     NULL,
+     NULL,
+     NULL,
+     evas_object_image_has_opaque_rect,
+     evas_object_image_get_opaque_rect,
+     evas_object_image_can_map
+};
+
+
+/**
+ * @addtogroup Evas_Object_Image
+ * @{
+ */
+
+/**
+ * Creates a new image object on the given evas.
+ *
+ * @param e The given evas.
+ * @return The created image object.
+ */
+EAPI Evas_Object *
+evas_object_image_add(Evas *e)
+{
+   Evas_Object *obj;
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   obj = evas_object_new(e);
+   evas_object_image_init(obj);
+   evas_object_inject(obj, e);
+   o = (Evas_Object_Image *)(obj->object_data);
+   o->cur.cspace = obj->layer->evas->engine.func->image_colorspace_get(obj->layer->evas->engine.data.output,
+                                                                      o->engine_data);
+   return obj;
+}
+
+/**
+ * Creates a new image object that automatically scales on the given evas.
+ *
+ * This is a helper around evas_object_image_add() and
+ * evas_object_image_filled_set(), it will track object resizes and apply
+ * evas_object_image_fill_set() with the new geometry.
+ *
+ * @see evas_object_image_add()
+ * @see evas_object_image_filled_set()
+ * @see evas_object_image_fill_set()
+ */
+EAPI Evas_Object *
+evas_object_image_filled_add(Evas *e)
+{
+   Evas_Object *obj;
+   obj = evas_object_image_add(e);
+   evas_object_image_filled_set(obj, 1);
+   return obj;
+}
+
+/**
+ * Sets the filename and key of the given image object.
+ *
+ * If the file supports multiple data stored in it as eet, you can
+ * specify the key to be used as the index of the image in this file.
+ *
+ * @param obj The given image object.
+ * @param file The image filename.
+ * @param key The image key in file, or NULL.
+ */
+EAPI void
+evas_object_image_file_set(Evas_Object *obj, const char *file, const char *key)
+{
+   Evas_Object_Image *o;
+   Evas_Image_Load_Opts lo;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if ((o->cur.file) && (file) && (!strcmp(o->cur.file, file)))
+     {
+       if ((!o->cur.key) && (!key))
+         return;
+       if ((o->cur.key) && (key) && (!strcmp(o->cur.key, key)))
+         return;
+     }
+/*
+ * WTF? why cancel a null image preload? this is just silly (tm)
+   if (!o->engine_data)
+     obj->layer->evas->engine.func->image_data_preload_cancel(obj->layer->evas->engine.data.output,
+                                                             o->engine_data,
+                                                             obj);
+ */
+   
+   if (o->cur.file) eina_stringshare_del(o->cur.file);
+   if (o->cur.key) eina_stringshare_del(o->cur.key);
+   if (file) o->cur.file = eina_stringshare_add(file);
+   else o->cur.file = NULL;
+   if (key) o->cur.key = eina_stringshare_add(key);
+   else o->cur.key = NULL;
+   o->prev.file = NULL;
+   o->prev.key = NULL;
+   if (o->engine_data)
+     {
+        obj->layer->evas->engine.func->image_data_preload_cancel(obj->layer->evas->engine.data.output,
+                                                                 o->engine_data,
+                                                                 obj);
+        obj->layer->evas->engine.func->image_free(obj->layer->evas->engine.data.output,
+                                                  o->engine_data);
+     }
+   o->load_error = EVAS_LOAD_ERROR_NONE;
+   lo.scale_down_by = o->load_opts.scale_down_by;
+   lo.dpi = o->load_opts.dpi;
+   lo.w = o->load_opts.w;
+   lo.h = o->load_opts.h;
+   lo.region.x = o->load_opts.region.x;
+   lo.region.y = o->load_opts.region.y;
+   lo.region.w = o->load_opts.region.w;
+   lo.region.h = o->load_opts.region.h;
+   o->engine_data = obj->layer->evas->engine.func->image_load(obj->layer->evas->engine.data.output,
+                                                             o->cur.file,
+                                                             o->cur.key,
+                                                             &o->load_error,
+                                                             &lo);
+   if (o->engine_data)
+     {
+       int w, h;
+       int stride;
+
+       obj->layer->evas->engine.func->image_size_get(obj->layer->evas->engine.data.output,
+                                                     o->engine_data, &w, &h);
+       if (obj->layer->evas->engine.func->image_stride_get)
+         obj->layer->evas->engine.func->image_stride_get(obj->layer->evas->engine.data.output,
+                                                         o->engine_data, &stride);
+       else
+         stride = w;
+       o->cur.has_alpha = obj->layer->evas->engine.func->image_alpha_get(obj->layer->evas->engine.data.output,
+                                                                         o->engine_data);
+       o->cur.cspace = obj->layer->evas->engine.func->image_colorspace_get(obj->layer->evas->engine.data.output,
+                                                                           o->engine_data);
+       o->cur.image.w = w;
+       o->cur.image.h = h;
+       o->cur.image.stride = stride;
+     }
+   else
+     {
+       if (o->load_error == EVAS_LOAD_ERROR_NONE)
+         o->load_error = EVAS_LOAD_ERROR_GENERIC;
+       o->cur.has_alpha = 1;
+       o->cur.cspace = EVAS_COLORSPACE_ARGB8888;
+       o->cur.image.w = 0;
+       o->cur.image.h = 0;
+       o->cur.image.stride = 0;
+     }
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves the filename and key of the given image object.
+ *
+ * @param obj The given image object.
+ * @param file Location to store the image filename, or NULL.
+ * @param key Location to store the image key, or NULL.
+ */
+EAPI void
+evas_object_image_file_get(const Evas_Object *obj, const char **file, const char **key)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (file) *file = NULL;
+   if (key) *key = NULL;
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   if (file) *file = NULL;
+   if (key) *key = NULL;
+   return;
+   MAGIC_CHECK_END();
+   if (file) *file = o->cur.file;
+   if (key) *key = o->cur.key;
+}
+
+/**
+ * Sets how much of each border of the given image object is not
+ * to be scaled.
+ *
+ * When rendering, the image may be scaled to fit the size of the
+ * image object. This function sets what area around the border of the
+ * image is not to be scaled. This sort of function is useful for
+ * widget theming, where, for example, buttons may be of varying
+ * sizes, but the border size must remain constant.
+ *
+ * The units used for @p l, @p r, @p t and @p b are output units.
+ *
+ * @param obj The given image object.
+ * @param l Distance of the left border that is not to be stretched.
+ * @param r Distance of the right border that is not to be stretched.
+ * @param t Distance of the top border that is not to be stretched.
+ * @param b Distance of the bottom border that is not to be stretched.
+ */
+EAPI void
+evas_object_image_border_set(Evas_Object *obj, int l, int r, int t, int b)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if (l < 0) l = 0;
+   if (r < 0) r = 0;
+   if (t < 0) t = 0;
+   if (b < 0) b = 0;
+   if ((o->cur.border.l == l) &&
+       (o->cur.border.r == r) &&
+       (o->cur.border.t == t) &&
+       (o->cur.border.b == b)) return;
+   o->cur.border.l = l;
+   o->cur.border.r = r;
+   o->cur.border.t = t;
+   o->cur.border.b = b;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves how much of each border of the given image object is not
+ * to be scaled.
+ *
+ * See @ref evas_object_image_border_set for more details.
+ *
+ * @param obj The given image object.
+ * @param l Location to store the left border width in, or NULL.
+ * @param r Location to store the right border width in, or NULL.
+ * @param t Location to store the top border width in, or NULL.
+ * @param b Location to store the bottom border width in, or NULL.
+ */
+EAPI void
+evas_object_image_border_get(const Evas_Object *obj, int *l, int *r, int *t, int *b)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (l) *l = 0;
+   if (r) *r = 0;
+   if (t) *t = 0;
+   if (b) *b = 0;
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   if (l) *l = 0;
+   if (r) *r = 0;
+   if (t) *t = 0;
+   if (b) *b = 0;
+   return;
+   MAGIC_CHECK_END();
+   if (l) *l = o->cur.border.l;
+   if (r) *r = o->cur.border.r;
+   if (t) *t = o->cur.border.t;
+   if (b) *b = o->cur.border.b;
+}
+
+/**
+ * Sets if the center part of the given image object (not the border)
+ * should be drawn.
+ *
+ * When rendering, the image may be scaled to fit the size of the
+ * image object. This function sets if the center part of the scaled
+ * image is to be drawn or left completely blank, or forced to be
+ * solid. Very useful for frames and decorations.
+ *
+ * @param obj The given image object.
+ * @param fill Fill mode of the middle.
+ */
+EAPI void
+evas_object_image_border_center_fill_set(Evas_Object *obj, Evas_Border_Fill_Mode fill)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if (fill == o->cur.border.fill) return;
+   o->cur.border.fill = fill;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves if the center of the given image object is to be drawn or
+ * not.
+ *
+ * See @ref evas_object_image_fill_set for more details.
+ *
+ * @param obj The given image object.
+ * @return Fill mode of the  center.
+ */
+EAPI Evas_Border_Fill_Mode
+evas_object_image_border_center_fill_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return 0;
+   MAGIC_CHECK_END();
+   return o->cur.border.fill;
+}
+
+/**
+ * Sets if image fill property should track object size.
+ *
+ * If set to true, then every evas_object_resize() will automatically
+ * trigger call to evas_object_image_fill_set() with the new size so
+ * image will fill the whole object area.
+ *
+ * @param obj The given image object.
+ * @param setting whether to follow object size.
+ *
+ * @see evas_object_image_filled_add()
+ * @see evas_object_image_fill_set()
+ */
+EAPI void
+evas_object_image_filled_set(Evas_Object *obj, Eina_Bool setting)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+
+   setting = !!setting;
+   if (o->filled == setting) return;
+
+   o->filled = setting;
+   if (!o->filled)
+     evas_object_event_callback_del(obj, EVAS_CALLBACK_RESIZE, evas_object_image_filled_resize_listener);
+   else
+     {
+       Evas_Coord w, h;
+
+       evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+       evas_object_image_fill_set(obj, 0, 0, w, h);
+
+       evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, evas_object_image_filled_resize_listener, NULL);
+     }
+}
+
+/**
+ * Retrieves if image fill property is tracking object size.
+ *
+ * @param obj The given image object.
+ * @return 1 if it is tracking, 0 if not and evas_object_fill_set()
+ * must be called manually.
+ */
+EAPI Eina_Bool
+evas_object_image_filled_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return 0;
+   MAGIC_CHECK_END();
+
+   return o->filled;
+}
+
+/**
+ * Sets a scale factor (multiplier) for the borders of an image
+ *
+ * @param obj The given image object.
+ * @param scale The scale factor (default is 1.0 - i.e. no scale)
+ */
+EAPI void
+evas_object_image_border_scale_set(Evas_Object *obj, double scale)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if (scale == o->cur.border.scale) return;
+   o->cur.border.scale = scale;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves the border scale factor
+ *
+ * See evas_object_image_border_scale_set()
+ * 
+ * @param obj The given image object.
+ * @return The scale factor
+ */
+EAPI double
+evas_object_image_border_scale_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 1.0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return 1.0;
+   MAGIC_CHECK_END();
+   return o->cur.border.scale;
+}
+
+/**
+ * Sets the rectangle of the given image object that the image will be
+ * drawn to.
+ *
+ * Note that the image will be tiled around this one rectangle. To
+ * have only one copy of the image drawn, @p x and @p y must be 0 and
+ * @p w and @p h need to be the width and height of the image object
+ * respectively.
+ *
+ * The default values for the fill parameters is @p x = 0, @p y = 0,
+ * @p w = 32 and @p h = 32.
+ *
+ * @param obj The given image object.
+ * @param x The X coordinate for the top left corner of the image.
+ * @param y The Y coordinate for the top left corner of the image.
+ * @param w The width of the image.
+ * @param h The height of the image.
+ */
+EAPI void
+evas_object_image_fill_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
+{
+   Evas_Object_Image *o;
+
+   if (w < 0) w = -w;
+   if (h < 0) h = -h;
+   if (w == 0) return;
+   if (h == 0) return;
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if ((o->cur.fill.x == x) &&
+       (o->cur.fill.y == y) &&
+       (o->cur.fill.w == w) &&
+       (o->cur.fill.h == h)) return;
+   o->cur.fill.x = x;
+   o->cur.fill.y = y;
+   o->cur.fill.w = w;
+   o->cur.fill.h = h;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves the dimensions of the rectangle of the given image object
+ * that the image will be drawn to.
+ *
+ * See @ref evas_object_image_fill_set for more details.
+ *
+ * @param obj The given image object.
+ * @param x Location to store the X coordinate for the top left corner of the image in, or NULL.
+ * @param y Location to store the Y coordinate for the top left corner of the image in, or NULL.
+ * @param w Location to store the width of the image in, or NULL.
+ * @param h Location to store the height of the image in, or NULL.
+ */
+EAPI void
+evas_object_image_fill_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = 0;
+   if (h) *h = 0;
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = 0;
+   if (h) *h = 0;
+   return;
+   MAGIC_CHECK_END();
+   if (x) *x = o->cur.fill.x;
+   if (y) *y = o->cur.fill.y;
+   if (w) *w = o->cur.fill.w;
+   if (h) *h = o->cur.fill.h;
+}
+
+
+/**
+ * Sets the tiling mode for the given evas image object's fill.
+ * @param   obj   The given evas image object.
+ * @param   spread One of EVAS_TEXTURE_REFLECT, EVAS_TEXTURE_REPEAT,
+ * EVAS_TEXTURE_RESTRICT, or EVAS_TEXTURE_PAD.
+ */
+EAPI void
+evas_object_image_fill_spread_set(Evas_Object *obj, int spread)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if (spread == o->cur.spread) return;
+   o->cur.spread = spread;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves the spread (tiling mode) for the given image object's
+ * fill.
+ *
+ * @param   obj The given evas image object.
+ * @return  The current spread mode of the image object.
+ */
+EAPI int
+evas_object_image_fill_spread_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return EVAS_TEXTURE_REPEAT;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return EVAS_TEXTURE_REPEAT;
+   MAGIC_CHECK_END();
+   return o->cur.spread;
+}
+
+EAPI void
+evas_object_image_fill_transform_set(Evas_Object *obj, Evas_Transform *t)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if (!t)
+     {
+       o->cur.transform.mxx = 1;
+       o->cur.transform.mxy = 0;
+       o->cur.transform.mxz = 0;
+       o->cur.transform.myx = 0;
+       o->cur.transform.myy = 1;
+       o->cur.transform.myz = 0;
+       o->cur.transform.mzx = 0;
+       o->cur.transform.mzy = 0;
+       o->cur.transform.mzz = 1;
+
+       o->changed = 1;
+       evas_object_change(obj);
+       return;
+     }
+   if ( (o->cur.transform.mxx == t->mxx) ||
+        (o->cur.transform.mxy == t->mxy) ||
+        (o->cur.transform.mxy == t->mxy) ||
+        (o->cur.transform.mxy == t->mxy) ||
+        (o->cur.transform.mxy == t->mxy) ||
+        (o->cur.transform.mxy == t->mxy) ||
+        (o->cur.transform.mxy == t->mxy) ||
+        (o->cur.transform.mxy == t->mxy) ||
+        (o->cur.transform.mxy == t->mxy) )
+           return;
+
+   o->cur.transform.mxx = t->mxx;
+   o->cur.transform.mxy = t->mxy;
+   o->cur.transform.mxz = t->mxz;
+   o->cur.transform.myx = t->myx;
+   o->cur.transform.myy = t->myy;
+   o->cur.transform.myz = t->myz;
+   o->cur.transform.mzx = t->mzx;
+   o->cur.transform.mzy = t->mzy;
+   o->cur.transform.mzz = t->mzz;
+
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/*FIXME: To be documented*/
+EAPI void
+evas_object_image_fill_transform_get(const Evas_Object *obj, Evas_Transform *t)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if (t)
+     {
+        t->mxx = o->cur.transform.mxx;
+        t->mxy = o->cur.transform.mxy;
+        t->mxz = o->cur.transform.mxz;
+        t->myx = o->cur.transform.myx;
+        t->myy = o->cur.transform.myy;
+        t->myz = o->cur.transform.myz;
+        t->mzx = o->cur.transform.mzx;
+        t->mzy = o->cur.transform.mzy;
+        t->mzz = o->cur.transform.mzz;
+     }
+}
+
+/**
+ * Sets the size of the given image object.
+ *
+ * This function will scale down or crop the image so that it is
+ * treated as if it were at the given size. If the size given is
+ * smaller than the image, it will be cropped. If the size given is
+ * larger, then the image will be treated as if it were in the upper
+ * left hand corner of a larger image that is otherwise transparent.
+ *
+ * @param obj The given image object.
+ * @param w The new width of the image.
+ * @param h The new height of the image.
+ */
+EAPI void
+evas_object_image_size_set(Evas_Object *obj, int w, int h)
+{
+   Evas_Object_Image *o;
+   int stride;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+   if (w > 32768) return;
+   if (h > 32768) return;
+   if ((w == o->cur.image.w) &&
+       (h == o->cur.image.h)) return;
+   o->cur.image.w = w;
+   o->cur.image.h = h;
+   if (o->engine_data)
+     o->engine_data = obj->layer->evas->engine.func->image_size_set(obj->layer->evas->engine.data.output,
+                                                                   o->engine_data,
+                                                                   w, h);
+   else
+     o->engine_data = obj->layer->evas->engine.func->image_new_from_copied_data
+     (obj->layer->evas->engine.data.output, w, h, NULL, o->cur.has_alpha,
+      o->cur.cspace);
+
+   if (obj->layer->evas->engine.func->image_stride_get)
+     obj->layer->evas->engine.func->image_stride_get(obj->layer->evas->engine.data.output,
+                                                    o->engine_data, &stride);
+   else
+     stride = w;
+   o->cur.image.stride = stride;
+
+/* FIXME - in engine call above
+   if (o->engine_data)
+     o->engine_data = obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output,
+                                                                    o->engine_data,
+                                                                    o->cur.has_alpha);
+*/
+   EVAS_OBJECT_IMAGE_FREE_FILE_AND_KEY(o);
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves the size of the given image object.
+ *
+ * See @ref evas_object_image_size_set for more details.
+ *
+ * @param obj The given image object.
+ * @param w Location to store the width of the image in, or NULL.
+ * @param h Location to store the height of the image in, or NULL.
+ */
+EAPI void
+evas_object_image_size_get(const Evas_Object *obj, int *w, int *h)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (w) *w = 0;
+   if (h) *h = 0;
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   if (w) *w = 0;
+   if (h) *h = 0;
+   return;
+   MAGIC_CHECK_END();
+   if (w) *w = o->cur.image.w;
+   if (h) *h = o->cur.image.h;
+}
+
+/**
+ * Retrieves the row stride of the given image object,
+ *
+ * The row stride is the number of units between the start of a
+ * row and the start of the next row.
+ *
+ * @param obj The given image object.
+ * @return The stride of the image.
+ */
+EAPI int
+evas_object_image_stride_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return 0;
+   MAGIC_CHECK_END();
+   return o->cur.image.stride;
+}
+
+/**
+ * Retrieves a number representing any error that occurred during the last
+ * load of the given image object.
+ *
+ * @param obj The given image object.
+ * @return A value giving the last error that occurred. It should be one of
+ *         the @c EVAS_LOAD_ERROR_* values.  @c EVAS_LOAD_ERROR_NONE is
+ *         returned if there was no error.
+ */
+EAPI int
+evas_object_image_load_error_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return 0;
+   MAGIC_CHECK_END();
+   return o->load_error;
+}
+
+/**
+ * Converts the raw image data of the given image object to the
+ * specified colorspace.
+ *
+ * Note that this function does not modify the raw image data.  If the
+ * requested colorspace is the same as the image colorspace nothing is
+ * done and NULL is returned. You should use
+ * evas_object_image_colorspace_get() to check the current image
+ * colorspace.
+ *
+ * See @ref evas_object_image_colorspace_get.
+ *
+ * @param obj The given image object.
+ * @param to_cspace The colorspace to which the image raw data will be converted.
+ * @return data A newly allocated data in the format specified by to_cspace.
+ */
+EAPI void *
+evas_object_image_data_convert(Evas_Object *obj, Evas_Colorspace to_cspace)
+{
+   Evas_Object_Image *o;
+   DATA32 *data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!o->engine_data) return NULL;
+   if (!o->cur.cspace == to_cspace) return NULL;
+   data = NULL;
+   o->engine_data = obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output,
+                                                                 o->engine_data,
+                                                                 0,
+                                                                 &data);
+   return evas_object_image_data_convert_internal(o, data, to_cspace);
+}
+
+/**
+ * Sets the raw image data of the given image object.
+ *
+ * Note that the raw data must be of the same size and colorspace of
+ * the image. If data is NULL the current image data will be freed.
+ *
+ * @param obj The given image object.
+ * @param data The raw data, or NULL.
+ */
+EAPI void
+evas_object_image_data_set(Evas_Object *obj, void *data)
+{
+   Evas_Object_Image *o;
+   void *p_data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   p_data = o->engine_data;
+   if (data)
+     {
+       if (o->engine_data)
+         o->engine_data = obj->layer->evas->engine.func->image_data_put(obj->layer->evas->engine.data.output,
+                                                                        o->engine_data,
+                                                                        data);
+       else
+         o->engine_data = obj->layer->evas->engine.func->image_new_from_data(obj->layer->evas->engine.data.output,
+                                                                             o->cur.image.w,
+                                                                             o->cur.image.h,
+                                                                             data,
+                                                                             o->cur.has_alpha,
+                                                                             o->cur.cspace);
+     }
+   else
+     {
+       if (o->engine_data)
+         obj->layer->evas->engine.func->image_free(obj->layer->evas->engine.data.output,
+                                                   o->engine_data);
+       o->load_error = EVAS_LOAD_ERROR_NONE;
+       o->cur.image.w = 0;
+       o->cur.image.h = 0;
+       o->cur.image.stride = 0;
+       o->engine_data = NULL;
+     }
+/* FIXME - in engine call above
+   if (o->engine_data)
+     o->engine_data = obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output,
+                                                                    o->engine_data,
+                                                                    o->cur.has_alpha);
+*/
+   if (o->pixels_checked_out > 0) o->pixels_checked_out--;
+   if (p_data != o->engine_data)
+     {
+       EVAS_OBJECT_IMAGE_FREE_FILE_AND_KEY(o);
+       o->pixels_checked_out = 0;
+     }
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Get a pointer to the raw image data of the given image object.
+ *
+ * This function returns a pointer to an image object's internal pixel
+ * buffer, for reading only or read/write. If you request it for
+ * writing, the image will be marked dirty so that it gets redrawn at
+ * the next update.
+ *
+ * This is best suited when you want to modify an existing image,
+ * without changing its dimensions.
+ *
+ * @param obj The given image object.
+ * @param for_writing Whether the data being retrieved will be modified.
+ * @return The raw image data.
+ */
+EAPI void *
+evas_object_image_data_get(const Evas_Object *obj, Eina_Bool for_writing)
+{
+   Evas_Object_Image *o;
+   DATA32 *data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!o->engine_data) return NULL;
+   data = NULL;
+   o->engine_data = obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output,
+                                                                 o->engine_data,
+                                                                 for_writing,
+                                                                 &data);
+   o->pixels_checked_out++;
+   if (for_writing)
+     {
+       EVAS_OBJECT_IMAGE_FREE_FILE_AND_KEY(o);
+     }
+
+   return data;
+}
+
+/**
+ * Preload image in the background
+ *
+ * This function request the preload of the data image in the
+ * background. The worked is queued before being processed.
+ *
+ * If image data is already loaded, it will callback
+ * EVAS_CALLBACK_IMAGE_PRELOADED immediatelly and do nothing else.
+ *
+ * If cancel is set, it will remove the image from the workqueue.
+ *
+ * @param obj The given image object.
+ * @param cancel 0 means add to the workqueue, 1 remove it.
+ */
+EAPI void
+evas_object_image_preload(Evas_Object *obj, Eina_Bool cancel)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return ;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return ;
+   MAGIC_CHECK_END();
+   if (!o->engine_data)
+     {
+       evas_object_inform_call_image_preloaded(obj);
+       return ;
+     }
+   if (cancel)
+     obj->layer->evas->engine.func->image_data_preload_cancel(obj->layer->evas->engine.data.output,
+                                                             o->engine_data,
+                                                             obj);
+   else
+     obj->layer->evas->engine.func->image_data_preload_request(obj->layer->evas->engine.data.output,
+                                                              o->engine_data,
+                                                              obj);
+}
+
+/**
+ * Replaces the raw image data of the given image object.
+ *
+ * This function lets the application replace an image object's
+ * internal pixel buffer with a user-allocated one. For best results,
+ * you should generally first call evas_object_image_size_set() with
+ * the width and height for the new buffer.
+ *
+ * This call is best suited for when you will be using image data with
+ * different dimensions than the existing image data, if any. If you
+ * only need to modify the existing image in some fashion, then using
+ * evas_object_image_data_get() is probably what you are after.
+ *
+ * Note that the caller is responsible for freeing the buffer when
+ * finished with it, as user-set image data will not be automatically
+ * freed when the image object is deleted.
+ *
+ * See @ref evas_object_image_data_get for more details.
+ *
+ * @param obj The given image object.
+ * @param data The raw data.
+ */
+EAPI void
+evas_object_image_data_copy_set(Evas_Object *obj, void *data)
+{
+   Evas_Object_Image *o;
+
+   if (!data) return;
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if ((o->cur.image.w <= 0) ||
+       (o->cur.image.h <= 0)) return;
+   if (o->engine_data)
+     obj->layer->evas->engine.func->image_free(obj->layer->evas->engine.data.output,
+                                              o->engine_data);
+   o->engine_data = obj->layer->evas->engine.func->image_new_from_copied_data(obj->layer->evas->engine.data.output,
+                                                                             o->cur.image.w,
+                                                                             o->cur.image.h,
+                                                                             data,
+                                                                             o->cur.has_alpha,
+                                                                             o->cur.cspace);
+   if (o->engine_data)
+     o->engine_data = obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output,
+                                                                    o->engine_data,
+                                                                    o->cur.has_alpha);
+   o->pixels_checked_out = 0;
+   EVAS_OBJECT_IMAGE_FREE_FILE_AND_KEY(o);
+}
+
+/**
+ * Mark a sub-region of the given image object to be redrawn.
+ *
+ * This function schedules a particular rectangular region of an image
+ * object to be updated (redrawn) at the next render.
+ *
+ * @param obj The given image object.
+ * @param x X-offset of the region to be updated.
+ * @param y Y-offset of the region to be updated.
+ * @param w Width of the region to be updated.
+ * @param h Height of the region to be updated.
+ */
+EAPI void
+evas_object_image_data_update_add(Evas_Object *obj, int x, int y, int w, int h)
+{
+   Evas_Object_Image *o;
+   Eina_Rectangle *r;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, o->cur.image.w, o->cur.image.h);
+   if ((w <= 0)  || (h <= 0)) return;
+   NEW_RECT(r, x, y, w, h);
+   if (r) o->pixel_updates = eina_list_append(o->pixel_updates, r);
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Enable or disable alpha channel of the given image object.
+ *
+ * This function sets a flag on an image object indicating whether or
+ * not to use alpha channel data. A value of 1 indicates to use alpha
+ * channel data, and 0 indicates to ignore any alpha channel
+ * data. Note that this has nothing to do with an object's color as
+ * manipulated by evas_object_color_set().
+ *
+ * @param obj The given image object.
+ * @param has_alpha Whether to use alpha channel data or not.
+ */
+EAPI void
+evas_object_image_alpha_set(Evas_Object *obj, Eina_Bool has_alpha)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if (((has_alpha) && (o->cur.has_alpha)) ||
+       ((!has_alpha) && (!o->cur.has_alpha)))
+     return;
+   o->cur.has_alpha = has_alpha;
+   if (o->engine_data)
+     o->engine_data = obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output,
+                                                                    o->engine_data,
+                                                                    o->cur.has_alpha);
+   evas_object_image_data_update_add(obj, 0, 0, o->cur.image.w, o->cur.image.h);
+   EVAS_OBJECT_IMAGE_FREE_FILE_AND_KEY(o);
+}
+
+
+/**
+ * @brief Retrieves the alpha channel setting of the given image object.
+ *
+ * @param obj The given image object.
+ * @return Whether the alpha channel data is being used.
+ *
+ * This function returns 1 if the image object's alpha channel is
+ * being used, or 0 otherwise.
+ *
+ * See @ref evas_object_image_alpha_set for more details.
+ */
+EAPI Eina_Bool
+evas_object_image_alpha_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return 0;
+   MAGIC_CHECK_END();
+   return o->cur.has_alpha;
+}
+
+/**
+ * Sets whether to use of high-quality image scaling algorithm
+ * of the given image object.
+ *
+ * When enabled, a higher quality image scaling algorithm is used when
+ * scaling images to sizes other than the source image. This gives
+ * better results but is more computationally expensive.
+ *
+ * @param obj The given image object.
+ * @param smooth_scale Whether to use smooth scale or not.
+ */
+EAPI void
+evas_object_image_smooth_scale_set(Evas_Object *obj, Eina_Bool smooth_scale)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if (((smooth_scale) && (o->cur.smooth_scale)) ||
+       ((!smooth_scale) && (!o->cur.smooth_scale)))
+     return;
+   o->cur.smooth_scale = smooth_scale;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves whether the given image object is using use a
+ * high-quality image scaling algorithm.
+ *
+ * See @ref evas_object_image_smooth_scale_set for more details.
+ *
+ * @param obj The given image object.
+ * @return Whether smooth scale is being used.
+ */
+EAPI Eina_Bool
+evas_object_image_smooth_scale_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return 0;
+   MAGIC_CHECK_END();
+   return o->cur.smooth_scale;
+}
+
+/**
+ * Reload a image of the canvas.
+ *
+ * @param obj The given image object pointer.
+ *
+ * This function reloads a image of the given canvas.
+ *
+ */
+EAPI void
+evas_object_image_reload(Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if ((!o->cur.file) ||
+       (o->pixels_checked_out > 0)) return;
+   if (o->engine_data)
+     o->engine_data = obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output, o->engine_data, 0, 0, o->cur.image.w, o->cur.image.h);
+   evas_object_image_unload(obj, 1);
+   evas_object_image_load(obj);
+   o->prev.file = NULL;
+   o->prev.key = NULL;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Save the given image object to a file.
+ *
+ * Note that you should pass the filename extension when saving.  If
+ * the file supports multiple data stored in it as eet, you can
+ * specify the key to be used as the index of the image in this file.
+ *
+ * You can specify some flags when saving the image.  Currently
+ * acceptable flags are quality and compress.  Eg.: "quality=100
+ * compress=9"
+ *
+ * @param obj The given image object.
+ * @param file The filename to be used to save the image.
+ * @param key The image key in file, or NULL.
+ * @param flags String containing the flags to be used.
+ */
+EAPI Eina_Bool
+evas_object_image_save(const Evas_Object *obj, const char *file, const char *key, const char *flags)
+{
+   Evas_Object_Image *o;
+   DATA32 *data = NULL;
+   int quality = 80, compress = 9, ok = 0;
+   RGBA_Image *im;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return 0;
+   MAGIC_CHECK_END();
+
+   if (!o->engine_data) return 0;
+   o->engine_data = obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output,
+                                                                 o->engine_data,
+                                                                 0,
+                                                                 &data);
+   if (flags)
+     {
+       char *p, *pp;
+       char *tflags;
+
+       tflags = alloca(strlen(flags) + 1);
+       strcpy(tflags, flags);
+       p = tflags;
+       while (p)
+         {
+            pp = strchr(p, ' ');
+            if (pp) *pp = 0;
+            sscanf(p, "quality=%i", &quality);
+            sscanf(p, "compress=%i", &compress);
+            if (pp) p = pp + 1;
+            else break;
+         }
+     }
+   im = (RGBA_Image*) evas_cache_image_data(evas_common_image_cache_get(),
+                                            o->cur.image.w,
+                                            o->cur.image.h,
+                                            data,
+                                            o->cur.has_alpha,
+                                            EVAS_COLORSPACE_ARGB8888);
+   if (im)
+     {
+       if (o->cur.cspace == EVAS_COLORSPACE_ARGB8888)
+         im->image.data = data;
+       else
+         im->image.data = evas_object_image_data_convert_internal(o,
+                                                                  data,
+                                                                  EVAS_COLORSPACE_ARGB8888);
+       if (im->image.data)
+         {
+            ok = evas_common_save_image_to_file(im, file, key, quality, compress);
+
+            if (o->cur.cspace != EVAS_COLORSPACE_ARGB8888)
+              free(im->image.data);
+         }
+
+       evas_cache_image_drop(&im->cache_entry);
+     }
+   return ok;
+}
+
+/**
+ * Import pixels from given source to a given canvas image object.
+ *
+ * @param obj The given canvas object.
+ * @param pixels The pixel's source to be imported.
+ *
+ * This function imports pixels from a given source to a given canvas image.
+ *
+ */
+EAPI Eina_Bool
+evas_object_image_pixels_import(Evas_Object *obj, Evas_Pixel_Import_Source *pixels)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return 0;
+   MAGIC_CHECK_END();
+
+   if ((pixels->w != o->cur.image.w) || (pixels->h != o->cur.image.h)) return 0;
+   switch (pixels->format)
+     {
+#if 0
+      case EVAS_PIXEL_FORMAT_ARGB32:
+         {
+            if (o->engine_data)
+              {
+                 DATA32 *image_pixels = NULL;
+
+                 o->engine_data =
+                   obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output,
+                                                                 o->engine_data,
+                                                                 1,
+                                                                 &image_pixels);
+/* FIXME: need to actualyl support this */
+/*               memcpy(image_pixels, pixels->rows, o->cur.image.w * o->cur.image.h * 4);*/
+                 if (o->engine_data)
+                   o->engine_data =
+                   obj->layer->evas->engine.func->image_data_put(obj->layer->evas->engine.data.output,
+                                                                 o->engine_data,
+                                                                 image_pixels);
+                 if (o->engine_data)
+                   o->engine_data =
+                   obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output,
+                                                                  o->engine_data,
+                                                                  o->cur.has_alpha);
+                 o->changed = 1;
+                 evas_object_change(obj);
+              }
+         }
+       break;
+#endif
+#ifdef BUILD_CONVERT_YUV
+      case EVAS_PIXEL_FORMAT_YUV420P_601:
+         {
+            if (o->engine_data)
+              {
+                 DATA32 *image_pixels = NULL;
+
+                 o->engine_data =
+                   obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output,
+                                                                 o->engine_data,
+                                                                 1,
+                                                                 &image_pixels);
+                 if (image_pixels)
+                   evas_common_convert_yuv_420p_601_rgba((DATA8 **) pixels->rows,
+                                                         (DATA8 *) image_pixels,
+                                                         o->cur.image.w,
+                                                         o->cur.image.h);
+                 if (o->engine_data)
+                   o->engine_data =
+                   obj->layer->evas->engine.func->image_data_put(obj->layer->evas->engine.data.output,
+                                                                 o->engine_data,
+                                                                 image_pixels);
+                 if (o->engine_data)
+                   o->engine_data =
+                   obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output,
+                                                                  o->engine_data,
+                                                                  o->cur.has_alpha);
+                 o->changed = 1;
+                 evas_object_change(obj);
+              }
+         }
+       break;
+#endif
+      default:
+       return 0;
+       break;
+     }
+   return 1;
+}
+
+/**
+ * Set the callback function to get pixels from a canva's image.
+ *
+ * @param obj The given canvas pointer.
+ * @param func The callback function.
+ * @param data The data pointer to be passed to @a func.
+ *
+ * This functions sets a function to be the callback function that get
+ * pixes from a image of the canvas.
+ *
+ */
+EAPI void
+evas_object_image_pixels_get_callback_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *o), void *data)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   o->func.get_pixels = func;
+   o->func.get_pixels_data = data;
+}
+
+/**
+ * Mark whether the given image object is dirty (needs to be redrawn).
+ *
+ * @param obj The given image object.
+ * @param dirty Whether the image is dirty.
+ */
+EAPI void
+evas_object_image_pixels_dirty_set(Evas_Object *obj, Eina_Bool dirty)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if (dirty) o->dirty_pixels = 1;
+   else o->dirty_pixels = 0;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves whether the given image object is dirty (needs to be redrawn).
+ *
+ * @param obj The given image object.
+ * @return Whether the image is dirty.
+ */
+EAPI Eina_Bool
+evas_object_image_pixels_dirty_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return 0;
+   MAGIC_CHECK_END();
+   if (o->dirty_pixels) return 1;
+   return 0;
+}
+
+/**
+ * Set the dpi resolution of a loaded image of the  canvas.
+ *
+ * @param obj The given canvas pointer.
+ * @param dpi The new dpi resolution.
+ *
+ * This function set the dpi resolution of a given loaded canvas image.
+ *
+ */
+EAPI void
+evas_object_image_load_dpi_set(Evas_Object *obj, double dpi)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if (dpi == o->load_opts.dpi) return;
+   o->load_opts.dpi = dpi;
+   if (o->cur.file)
+     {
+       evas_object_image_unload(obj, 0);
+       evas_object_image_load(obj);
+       o->changed = 1;
+       evas_object_change(obj);
+     }
+}
+
+/**
+ * Get the dpi resolution of a loaded image of the canvas.
+ *
+ * @param obj The given canvas pointer.
+ * @return The dpi resolution of the given canvas image.
+ *
+ * This function returns the dpi resolution of given canvas image.
+ *
+ */
+EAPI double
+evas_object_image_load_dpi_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0.0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return 0.0;
+   MAGIC_CHECK_END();
+   return o->load_opts.dpi;
+}
+
+/**
+ * Set the size of a loaded image of the canvas.
+ *
+ * @param obj The given canvas object.
+ * @param w The new width of the canvas image given.
+ * @param h Th new height of the canvas image given.
+ *
+ * This function sets a new size for the given canvas image.
+ *
+ */
+EAPI void
+evas_object_image_load_size_set(Evas_Object *obj, int w, int h)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if ((o->load_opts.w == w) && (o->load_opts.h == h)) return;
+   o->load_opts.w = w;
+   o->load_opts.h = h;
+   if (o->cur.file)
+     {
+       evas_object_image_unload(obj, 0);
+       evas_object_image_load(obj);
+       o->changed = 1;
+       evas_object_change(obj);
+     }
+}
+
+/**
+ * Get the size of a loaded image of the canvas.
+ *
+ * @param obj The given canvas object.
+ * @param w The width of the canvas image given.
+ * @param h The height of the canvas image given.
+ *
+ * This function get the size of the given canvas image.
+ *
+ */
+EAPI void
+evas_object_image_load_size_get(const Evas_Object *obj, int *w, int *h)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if (w) *w = o->load_opts.w;
+   if (h) *h = o->load_opts.h;
+}
+
+/**
+ * Set the scale down of a loaded image of the canvas.
+ *
+ * @param obj The given canvas pointer.
+ * @param scale_down The scale to down value.
+ *
+ * This function sets the scale down of a given canvas image.
+ *
+ */
+EAPI void
+evas_object_image_load_scale_down_set(Evas_Object *obj, int scale_down)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if (o->load_opts.scale_down_by == scale_down) return;
+   o->load_opts.scale_down_by = scale_down;
+   if (o->cur.file)
+     {
+       evas_object_image_unload(obj, 0);
+       evas_object_image_load(obj);
+       o->changed = 1;
+       evas_object_change(obj);
+     }
+}
+
+/**
+ * Get the scale down value of given image of the canvas.
+ *
+ * @param obj The given image object pointer.
+ *
+ * This function returns the scale down value of a given canvas image.
+ *
+ */
+EAPI int
+evas_object_image_load_scale_down_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return 0;
+   MAGIC_CHECK_END();
+   return o->load_opts.scale_down_by;
+}
+
+EAPI void
+evas_object_image_load_region_set(Evas_Object *obj, int x, int y, int w, int h)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if ((o->load_opts.region.x == x) && (o->load_opts.region.y == y) &&
+       (o->load_opts.region.w == w) && (o->load_opts.region.h == h)) return;
+   o->load_opts.region.x = x;
+   o->load_opts.region.y = y;
+   o->load_opts.region.w = w;
+   o->load_opts.region.h = h;
+   if (o->cur.file)
+     {
+       evas_object_image_unload(obj, 0);
+       evas_object_image_load(obj);
+       o->changed = 1;
+       evas_object_change(obj);
+     }
+}
+
+EAPI void
+evas_object_image_load_region_get(const Evas_Object *obj, int *x, int *y, int *w, int *h)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   if (x) *x = o->load_opts.region.x;
+   if (y) *y = o->load_opts.region.y;
+   if (w) *w = o->load_opts.region.w;
+   if (h) *h = o->load_opts.region.h;
+}
+
+/**
+ * Set the colorspace of a given image of the canvas.
+ *
+ * @param obj The given image object pointer.
+ * @param cspace The new color space.
+ *
+ * This function sets the colorspace of given canvas image.
+ *
+ */
+EAPI void
+evas_object_image_colorspace_set(Evas_Object *obj, Evas_Colorspace cspace)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   o->cur.cspace = cspace;
+   if (o->engine_data)
+     obj->layer->evas->engine.func->image_colorspace_set(obj->layer->evas->engine.data.output,
+                                                        o->engine_data,
+                                                        cspace);
+}
+
+/**
+ * Get the colorspace of a given image of the canvas.
+ *
+ * @param obj The given image object pointer.
+ * @return The colorspace of the image.
+ *
+ * This function returns the colorspace of given canvas image.
+ *
+ */
+EAPI Evas_Colorspace
+evas_object_image_colorspace_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return EVAS_COLORSPACE_ARGB8888;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return EVAS_COLORSPACE_ARGB8888;
+   MAGIC_CHECK_END();
+   return o->cur.cspace;
+}
+
+/**
+ * Set the native surface of a given image of the canvas
+ *
+ * @param obj The given canvas pointer.
+ * @param surf The new native surface.
+ *
+ * This function sets a native surface of a given canvas image.
+ *
+ */
+EAPI void
+evas_object_image_native_surface_set(Evas_Object *obj, Evas_Native_Surface *surf)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   obj->layer->evas->engine.func->image_native_set(obj->layer->evas->engine.data.output,
+                                                  o->engine_data,
+                                                  surf);
+}
+
+/**
+ * Get the native surface of a given image of the canvas
+ *
+ * @param obj The given canvas pointer.
+ * @return The native surface of the given canvas image.
+ *
+ * This function returns the native surface of a given canvas image.
+ *
+ */
+EAPI Evas_Native_Surface *
+evas_object_image_native_surface_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return NULL;
+   MAGIC_CHECK_END();
+   return obj->layer->evas->engine.func->image_native_get(obj->layer->evas->engine.data.output,
+                                                         o->engine_data);
+}
+
+/**
+ * Set the scale hint of a given image of the canvas.
+ *
+ * @param obj The given canvas pointer.
+ * @param hint The scale hint value.
+ *
+ * This function sets the scale hint value of the given image of the canvas.
+ *
+ */
+EAPI void
+evas_object_image_scale_hint_set(Evas_Object *obj, Evas_Image_Scale_Hint hint)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   o->scale_hint = hint;
+}
+
+/**
+ * Get the scale hint of a given image of the canvas.
+ *
+ * @param obj The given canvas pointer.
+ *
+ * This function returns the scale hint value of the given image of the canvas.
+ *
+ */
+EAPI Evas_Image_Scale_Hint
+evas_object_image_scale_hint_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+   MAGIC_CHECK_END();
+   return o->scale_hint;
+}
+
+/**
+ * Set the content hint of a given image of the canvas.
+ *
+ * @param obj The given canvas pointer.
+ * @param hint The content hint value.
+ *
+ * This function sets the content hint value of the given image of the canvas.
+ *
+ */
+EAPI void
+evas_object_image_content_hint_set(Evas_Object *obj, Evas_Image_Content_Hint hint)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   o->content_hint = hint;
+}
+
+/**
+ * Get the content hint of a given image of the canvas.
+ *
+ * @param obj The given canvas pointer.
+ *
+ * This function returns the content hint value of the given image of the canvas.
+ *
+ */
+EAPI Evas_Image_Content_Hint
+evas_object_image_content_hint_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return EVAS_IMAGE_CONTENT_HINT_NONE;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return EVAS_IMAGE_CONTENT_HINT_NONE;
+   MAGIC_CHECK_END();
+   return o->content_hint;
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup Evas_Image_Group
+ * @{
+ */
+
+/**
+ * Flush the image cache of the canvas.
+ *
+ * @param e The given evas pointer.
+ *
+ * This function flushes image cache of canvas.
+ *
+ */
+EAPI void
+evas_image_cache_flush(Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   e->engine.func->image_cache_flush(e->engine.data.output);
+}
+
+/**
+ * Reload the image cache
+ *
+ * @param e The given evas pointer.
+ *
+ * This function reloads the image cache of canvas.
+ *
+ */
+EAPI void
+evas_image_cache_reload(Evas *e)
+{
+   Evas_Layer *layer;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   evas_image_cache_flush(e);
+   EINA_INLIST_FOREACH(e->layers, layer)
+     {
+       Evas_Object *obj;
+
+       EINA_INLIST_FOREACH(layer->objects, obj)
+         {
+            Evas_Object_Image *o;
+
+            o = (Evas_Object_Image *)(obj->object_data);
+            if (o->magic == MAGIC_OBJ_IMAGE)
+              {
+                 evas_object_image_unload(obj, 1);
+              }
+         }
+     }
+   evas_image_cache_flush(e);
+   EINA_INLIST_FOREACH(e->layers, layer)
+     {
+       Evas_Object *obj;
+
+       EINA_INLIST_FOREACH(layer->objects, obj)
+         {
+            Evas_Object_Image *o;
+
+            o = (Evas_Object_Image *)(obj->object_data);
+            if (o->magic == MAGIC_OBJ_IMAGE)
+              {
+                 evas_object_image_load(obj);
+                 o->changed = 1;
+                 evas_object_change(obj);
+              }
+         }
+     }
+   evas_image_cache_flush(e);
+}
+
+/**
+ * Set the image cache.
+ *
+ * @param e The given evas pointer.
+ * @param size The cache size.
+ *
+ * This function sets the image cache of canvas.
+ *
+ */
+EAPI void
+evas_image_cache_set(Evas *e, int size)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if (size < 0) size = 0;
+   e->engine.func->image_cache_set(e->engine.data.output, size);
+}
+
+/**
+ * Set the image cache
+ *
+ * @param e The given evas pointer.
+ *
+ * This function returns the image cache of canvas.
+ *
+ */
+EAPI int
+evas_image_cache_get(const Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return 0;
+   MAGIC_CHECK_END();
+
+   return e->engine.func->image_cache_get(e->engine.data.output);
+}
+
+/**
+ * @}
+ */
+
+/* all nice and private */
+
+static void
+evas_object_image_unload(Evas_Object *obj, Eina_Bool dirty)
+{
+   Evas_Object_Image *o;
+
+   o = (Evas_Object_Image *)(obj->object_data);
+
+   if ((!o->cur.file) ||
+       (o->pixels_checked_out > 0)) return;
+   if (dirty)
+     {
+        if (o->engine_data)
+          o->engine_data = obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output,
+                                                                             o->engine_data,
+                                                                             0, 0,
+                                                                             o->cur.image.w, o->cur.image.h);
+     }
+   if (o->engine_data)
+     obj->layer->evas->engine.func->image_free(obj->layer->evas->engine.data.output,
+                                              o->engine_data);
+   o->engine_data = NULL;
+   o->load_error = EVAS_LOAD_ERROR_NONE;
+   o->cur.has_alpha = 1;
+   o->cur.cspace = EVAS_COLORSPACE_ARGB8888;
+   o->cur.image.w = 0;
+   o->cur.image.h = 0;
+   o->cur.image.stride = 0;
+}
+
+static void
+evas_object_image_load(Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+   Evas_Image_Load_Opts lo;
+
+   o = (Evas_Object_Image *)(obj->object_data);
+   if (o->engine_data) return;
+
+   lo.scale_down_by = o->load_opts.scale_down_by;
+   lo.dpi = o->load_opts.dpi;
+   lo.w = o->load_opts.w;
+   lo.h = o->load_opts.h;
+   lo.region.x = o->load_opts.region.x;
+   lo.region.y = o->load_opts.region.y;
+   lo.region.w = o->load_opts.region.w;
+   lo.region.h = o->load_opts.region.h;
+   o->engine_data = obj->layer->evas->engine.func->image_load(obj->layer->evas->engine.data.output,
+                                                             o->cur.file,
+                                                             o->cur.key,
+                                                             &o->load_error,
+                                                             &lo);
+   if (o->engine_data)
+     {
+       int w, h;
+       int stride;
+
+       obj->layer->evas->engine.func->image_size_get(obj->layer->evas->engine.data.output,
+                                                     o->engine_data, &w, &h);
+       if (obj->layer->evas->engine.func->image_stride_get)
+         obj->layer->evas->engine.func->image_stride_get(obj->layer->evas->engine.data.output,
+                                                         o->engine_data, &stride);
+       else
+         stride = w;
+       o->cur.has_alpha = obj->layer->evas->engine.func->image_alpha_get(obj->layer->evas->engine.data.output,
+                                                                         o->engine_data);
+       o->cur.cspace = obj->layer->evas->engine.func->image_colorspace_get(obj->layer->evas->engine.data.output,
+                                                                           o->engine_data);
+       o->cur.image.w = w;
+       o->cur.image.h = h;
+       o->cur.image.stride = stride;
+     }
+   else
+     {
+       o->load_error = EVAS_LOAD_ERROR_GENERIC;
+     }
+}
+
+static Evas_Coord
+evas_object_image_figure_x_fill(Evas_Object *obj, Evas_Coord start, Evas_Coord size, Evas_Coord *size_ret)
+{
+   Evas_Coord w;
+
+   w = ((size * obj->layer->evas->output.w) /
+       (Evas_Coord)obj->layer->evas->viewport.w);
+   if (size <= 0) size = 1;
+   if (start > 0)
+     {
+       while (start - size > 0) start -= size;
+     }
+   else if (start < 0)
+     {
+       while (start < 0) start += size;
+     }
+   start = ((start * obj->layer->evas->output.w) /
+           (Evas_Coord)obj->layer->evas->viewport.w);
+   *size_ret = w;
+   return start;
+}
+
+static Evas_Coord
+evas_object_image_figure_y_fill(Evas_Object *obj, Evas_Coord start, Evas_Coord size, Evas_Coord *size_ret)
+{
+   Evas_Coord h;
+
+   h = ((size * obj->layer->evas->output.h) /
+       (Evas_Coord)obj->layer->evas->viewport.h);
+   if (size <= 0) size = 1;
+   if (start > 0)
+     {
+       while (start - size > 0) start -= size;
+     }
+   else if (start < 0)
+     {
+       while (start < 0) start += size;
+     }
+   start = ((start * obj->layer->evas->output.h) /
+           (Evas_Coord)obj->layer->evas->viewport.h);
+   *size_ret = h;
+   return start;
+}
+
+static void
+evas_object_image_init(Evas_Object *obj)
+{
+   /* alloc image ob, setup methods and default values */
+   obj->object_data = evas_object_image_new();
+   /* set up default settings for this kind of object */
+   obj->cur.color.r = 255;
+   obj->cur.color.g = 255;
+   obj->cur.color.b = 255;
+   obj->cur.color.a = 255;
+   obj->cur.geometry.x = 0;
+   obj->cur.geometry.y = 0;
+   obj->cur.geometry.w = 0;
+   obj->cur.geometry.h = 0;
+   obj->cur.layer = 0;
+   obj->cur.anti_alias = 0;
+   obj->cur.render_op = EVAS_RENDER_BLEND;
+   /* set up object-specific settings */
+   obj->prev = obj->cur;
+   /* set up methods (compulsory) */
+   obj->func = &object_func;
+   obj->type = o_type;
+}
+
+static void *
+evas_object_image_new(void)
+{
+   Evas_Object_Image *o;
+
+   /* alloc obj private data */
+   o = calloc(1, sizeof(Evas_Object_Image));
+   o->magic = MAGIC_OBJ_IMAGE;
+   o->cur.fill.w = 0;
+   o->cur.fill.h = 0;
+   o->cur.smooth_scale = 1;
+   o->cur.border.fill = 1;
+   o->cur.border.scale = 1.0;
+   o->cur.cspace = EVAS_COLORSPACE_ARGB8888;
+   o->cur.transform.mxx = o->cur.transform.myy = o->cur.transform.mzz = 1;
+   o->cur.spread = EVAS_TEXTURE_REPEAT;
+   o->prev = o->cur;
+   return o;
+}
+
+static void
+evas_object_image_free(Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+   Eina_Rectangle *r;
+
+   /* frees private object data. very simple here */
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   /* free obj */
+   if (o->cur.file) eina_stringshare_del(o->cur.file);
+   if (o->cur.key) eina_stringshare_del(o->cur.key);
+   if (o->engine_data)
+     {
+        obj->layer->evas->engine.func->image_data_preload_cancel(obj->layer->evas->engine.data.output,
+                                                                 o->engine_data,
+                                                                 obj);
+        obj->layer->evas->engine.func->image_free(obj->layer->evas->engine.data.output,
+                                                  o->engine_data);
+     }
+   o->engine_data = NULL;
+   o->magic = 0;
+   EINA_LIST_FREE(o->pixel_updates, r)
+     eina_rectangle_free(r);
+   free(o);
+}
+
+static void
+evas_object_image_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
+{
+   Evas_Object_Image *o;
+
+   /* render object to surface with context, and offset by x,y */
+   o = (Evas_Object_Image *)(obj->object_data);
+
+   if ((o->cur.fill.w < 1) || (o->cur.fill.h < 1))
+     return; /* no error message, already printed in pre_render */
+
+   obj->layer->evas->engine.func->context_color_set(output,
+                                                   context,
+                                                   255, 255, 255, 255);
+
+   if ((obj->cur.cache.clip.r == 255) &&
+       (obj->cur.cache.clip.g == 255) &&
+       (obj->cur.cache.clip.b == 255) &&
+       (obj->cur.cache.clip.a == 255))
+     {
+       obj->layer->evas->engine.func->context_multiplier_unset(output,
+                                                               context);
+     }
+   else
+     obj->layer->evas->engine.func->context_multiplier_set(output,
+                                                          context,
+                                                          obj->cur.cache.clip.r,
+                                                          obj->cur.cache.clip.g,
+                                                          obj->cur.cache.clip.b,
+                                                          obj->cur.cache.clip.a);
+
+   obj->layer->evas->engine.func->context_render_op_set(output, context,
+                                                       obj->cur.render_op);
+   if (o->engine_data)
+     {
+       Evas_Coord idw, idh, idx, idy;
+       int ix, iy, iw, ih;
+
+       if (o->dirty_pixels)
+         {
+            if (o->func.get_pixels)
+              {
+                 o->func.get_pixels(o->func.get_pixels_data, obj);
+                 o->engine_data = obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output, o->engine_data, 0, 0, o->cur.image.w, o->cur.image.h);
+              }
+            o->dirty_pixels = 0;
+         }
+        if ((obj->cur.map) && (obj->cur.map->count == 4) && (obj->cur.usemap))
+          {
+            const Evas_Map_Point *p, *p_end;
+             RGBA_Map_Point pts[4], *pt;
+
+            p = obj->cur.map->points;
+            p_end = p + 4;
+            pt = pts;
+
+             // draw geom +x +y
+             for (; p < p_end; p++, pt++)
+               {
+                  pt->x = (p->x + x) << FP;
+                  pt->y = (p->y + y) << FP;
+                  pt->z = (p->z)     << FP;
+                  pt->u = p->u * FP1;
+                  pt->v = p->v * FP1;
+                  pt->col = ARGB_JOIN(p->a, p->r, p->g, p->b);
+              }
+             obj->layer->evas->engine.func->image_map4_draw
+               (output, context, surface, o->engine_data, pts,
+                o->cur.smooth_scale | obj->cur.map->smooth, 0);
+          }
+        else
+          {
+             obj->layer->evas->engine.func->image_scale_hint_set(output,
+                                                                 o->engine_data,
+                                                                 o->scale_hint);
+             o->engine_data = obj->layer->evas->engine.func->image_border_set(output, o->engine_data,
+                                                                              o->cur.border.l, o->cur.border.r,
+                                                                              o->cur.border.t, o->cur.border.b);
+             idx = evas_object_image_figure_x_fill(obj, o->cur.fill.x, o->cur.fill.w, &idw);
+             idy = evas_object_image_figure_y_fill(obj, o->cur.fill.y, o->cur.fill.h, &idh);
+             if (idw < 1) idw = 1;
+             if (idh < 1) idh = 1;
+             if (idx > 0) idx -= idw;
+             if (idy > 0) idy -= idh;
+             while ((int)idx < obj->cur.geometry.w)
+               {
+                  Evas_Coord ydy;
+                  int dobreak_w = 0;
+                  
+                  ydy = idy;
+                  ix = idx;
+                  if ((o->cur.fill.w == obj->cur.geometry.w) &&
+                      (o->cur.fill.x == 0))
+                    {
+                       dobreak_w = 1;
+                       iw = obj->cur.geometry.w;
+                    }
+                  else
+                    iw = ((int)(idx + idw)) - ix;
+                  while ((int)idy < obj->cur.geometry.h)
+                    {
+                       int dobreak_h = 0;
+                       
+                       iy = idy;
+                       if ((o->cur.fill.h == obj->cur.geometry.h) &&
+                           (o->cur.fill.y == 0))
+                         {
+                            ih = obj->cur.geometry.h;
+                            dobreak_h = 1;
+                         }
+                       else
+                         ih = ((int)(idy + idh)) - iy;
+                       if ((o->cur.border.l == 0) &&
+                           (o->cur.border.r == 0) &&
+                           (o->cur.border.t == 0) &&
+                           (o->cur.border.b == 0) &&
+                           (o->cur.border.fill != 0))
+                         obj->layer->evas->engine.func->image_draw(output,
+                                                                   context,
+                                                                   surface,
+                                                                   o->engine_data,
+                                                                   0, 0,
+                                                                   o->cur.image.w,
+                                                                   o->cur.image.h,
+                                                                   obj->cur.geometry.x + ix + x,
+                                                                   obj->cur.geometry.y + iy + y,
+                                                                   iw, ih,
+                                                                   o->cur.smooth_scale);
+                       else
+                         {
+                            int inx, iny, inw, inh, outx, outy, outw, outh;
+                            int bl, br, bt, bb, bsl, bsr, bst, bsb;
+                            int imw, imh, ox, oy;
+                            
+                            ox = obj->cur.geometry.x + ix + x;
+                            oy = obj->cur.geometry.y + iy + y;
+                            imw = o->cur.image.w;
+                            imh = o->cur.image.h;
+                            bl = o->cur.border.l;
+                            br = o->cur.border.r;
+                            bt = o->cur.border.t;
+                            bb = o->cur.border.b;
+                            if ((bl + br) > iw)
+                              {
+                                 bl = iw / 2;
+                                 br = iw - bl;
+                              }
+                            if ((bl + br) > imw)
+                              {
+                                 bl = imw / 2;
+                                 br = imw - bl;
+                              }
+                            if ((bt + bb) > ih)
+                              {
+                                 bt = ih / 2;
+                                 bb = ih - bt;
+                              }
+                            if ((bt + bb) > imh)
+                              {
+                                 bt = imh / 2;
+                                 bb = imh - bt;
+                              }
+                            if (o->cur.border.scale != 1.0)
+                              {
+                                 bsl = ((double)bl * o->cur.border.scale);
+                                 bsr = ((double)br * o->cur.border.scale);
+                                 bst = ((double)bt * o->cur.border.scale);
+                                 bsb = ((double)bb * o->cur.border.scale);
+                              }
+                            else
+                              {
+                                  bsl = bl; bsr = br; bst = bt; bsb = bb;
+                              }
+                            // #--
+                            // |
+                            inx = 0; iny = 0;
+                            inw = bl; inh = bt;
+                            outx = ox; outy = oy;
+                            outw = bsl; outh = bst;
+                            obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+                            // .##
+                            // |
+                            inx = bl; iny = 0;
+                            inw = imw - bl - br; inh = bt;
+                            outx = ox + bsl; outy = oy;
+                            outw = iw - bsl - bsr; outh = bst;
+                            obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+                            // --#
+                            //   |
+                            inx = imw - br; iny = 0;
+                            inw = br; inh = bt;
+                            outx = ox + iw - bsr; outy = oy;
+                            outw = bsr; outh = bst;
+                            obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+                            // .--
+                            // #  
+                            inx = 0; iny = bt;
+                            inw = bl; inh = imh - bt - bb;
+                            outx = ox; outy = oy + bst;
+                            outw = bsl; outh = ih - bst - bsb;
+                            obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+                            // .--.
+                            // |##|
+                            if (o->cur.border.fill > EVAS_BORDER_FILL_NONE)
+                              {
+                                 inx = bl; iny = bt;
+                                 inw = imw - bl - br; inh = imh - bt - bb;
+                                 outx = ox + bsl; outy = oy + bst;
+                                 outw = iw - bsl - bsr; outh = ih - bst - bsb;
+                                 if ((o->cur.border.fill == EVAS_BORDER_FILL_SOLID) &&
+                                     (obj->cur.cache.clip.a == 255) &&
+                                     (obj->cur.render_op == EVAS_RENDER_BLEND))
+                                   {
+                                      obj->layer->evas->engine.func->context_render_op_set(output, context,
+                                                                                           EVAS_RENDER_COPY);
+                                      obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+                                      obj->layer->evas->engine.func->context_render_op_set(output, context,
+                                                                                           obj->cur.render_op);
+                                   }
+                                 else
+                                   obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+                              }
+                            // --.
+                            //   #
+                            inx = imw - br; iny = bt;
+                            inw = br; inh = imh - bt - bb;
+                            outx = ox + iw - bsr; outy = oy + bst;
+                            outw = bsr; outh = ih - bst - bsb;
+                            obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+                            // |
+                            // #--
+                            inx = 0; iny = imh - bb;
+                            inw = bl; inh = bb;
+                            outx = ox; outy = oy + ih - bsb;
+                            outw = bsl; outh = bsb;
+                            obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+                            // |
+                            // .## 
+                            inx = bl; iny = imh - bb;
+                            inw = imw - bl - br; inh = bb;
+                            outx = ox + bsl; outy = oy + ih - bsb;
+                            outw = iw - bsl - bsr; outh = bsb;
+                            obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+                            //   |
+                            // --#
+                            inx = imw - br; iny = imh - bb;
+                            inw = br; inh = bb;
+                            outx = ox + iw - bsr; outy = oy + ih - bsb;
+                            outw = bsr; outh = bsb;
+                            obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale);
+                         }
+                       idy += idh;
+                       if (dobreak_h) break;
+                    }
+                  idx += idw;
+                  idy = ydy;
+                  if (dobreak_w) break;
+               }
+         }
+     }
+}
+
+static void
+evas_object_image_render_pre(Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+   int is_v, was_v;
+
+   /* dont pre-render the obj twice! */
+   if (obj->pre_render_done) return;
+   obj->pre_render_done = 1;
+   /* pre-render phase. this does anything an object needs to do just before */
+   /* rendering. this could mean loading the image data, retrieving it from */
+   /* elsewhere, decoding video etc. */
+   /* then when this is done the object needs to figure if it changed and */
+   /* if so what and where and add the appropriate redraw rectangles */
+   o = (Evas_Object_Image *)(obj->object_data);
+
+   if ((o->cur.fill.w < 1) || (o->cur.fill.h < 1))
+     {
+       ERR("%p has invalid fill size: %dx%d. Ignored",
+            obj, o->cur.fill.w, o->cur.fill.h);
+       return;
+     }
+
+   /* if someone is clipping this obj - go calculate the clipper */
+   if (obj->cur.clipper)
+     {
+       if (obj->cur.cache.clip.dirty)
+         evas_object_clip_recalc(obj->cur.clipper);
+       obj->cur.clipper->func->render_pre(obj->cur.clipper);
+     }
+   /* now figure what changed and add draw rects */
+   /* if it just became visible or invisible */
+   is_v = evas_object_is_visible(obj);
+   was_v = evas_object_was_visible(obj);
+   if (is_v != was_v)
+     {
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+       if (!o->pixel_updates) goto done;
+     }
+   if ((obj->cur.map != obj->prev.map) ||
+       (obj->cur.usemap != obj->prev.usemap))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+        goto done;
+     }
+   /* it's not visible - we accounted for it appearing or not so just abort */
+   if (!is_v) goto done;
+   /* clipper changed this is in addition to anything else for obj */
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
+   /* if we restacked (layer or just within a layer) and don't clip anyone */
+   if (obj->restack)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       if (!o->pixel_updates) goto done;
+     }
+   /* if it changed color */
+   if ((obj->cur.color.r != obj->prev.color.r) ||
+       (obj->cur.color.g != obj->prev.color.g) ||
+       (obj->cur.color.b != obj->prev.color.b) ||
+       (obj->cur.color.a != obj->prev.color.a))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       if (!o->pixel_updates) goto done;
+     }
+   /* if it changed render op */
+   if (obj->cur.render_op != obj->prev.render_op)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       if (!o->pixel_updates) goto done;
+     }
+   /* if it changed anti_alias */
+   if (obj->cur.anti_alias != obj->prev.anti_alias)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       if (!o->pixel_updates) goto done;
+     }
+   if (o->changed)
+     {
+       if (((o->cur.file) && (!o->prev.file)) ||
+           ((!o->cur.file) && (o->prev.file)) ||
+           ((o->cur.key) && (!o->prev.key)) ||
+           ((!o->cur.key) && (o->prev.key))
+           )
+         {
+            evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+            if (!o->pixel_updates) goto done;
+         }
+       if ((o->cur.image.w != o->prev.image.w) ||
+           (o->cur.image.h != o->prev.image.h) ||
+           (o->cur.has_alpha != o->prev.has_alpha) ||
+           (o->cur.cspace != o->prev.cspace) ||
+           (o->cur.smooth_scale != o->prev.smooth_scale))
+         {
+            evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+            if (!o->pixel_updates) goto done;
+         }
+       if ((o->cur.border.l != o->prev.border.l) ||
+           (o->cur.border.r != o->prev.border.r) ||
+           (o->cur.border.t != o->prev.border.t) ||
+           (o->cur.border.b != o->prev.border.b) ||
+            (o->cur.border.fill != o->prev.border.fill) ||
+            (o->cur.border.scale != o->prev.border.scale))
+         {
+            evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+            if (!o->pixel_updates) goto done;
+         }
+       if (o->dirty_pixels)
+         {
+            evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+            if (!o->pixel_updates) goto done;
+         }
+     }
+   /* if it changed geometry - and obviously not visibility or color */
+   /* caluclate differences since we have a constant color fill */
+   /* we really only need to update the differences */
+#if 0 // XXX: maybe buggy?
+   if (((obj->cur.geometry.x != obj->prev.geometry.x) ||
+       (obj->cur.geometry.y != obj->prev.geometry.y) ||
+       (obj->cur.geometry.w != obj->prev.geometry.w) ||
+       (obj->cur.geometry.h != obj->prev.geometry.h)) &&
+       (o->cur.fill.w == o->prev.fill.w) &&
+       (o->cur.fill.h == o->prev.fill.h) &&
+       ((o->cur.fill.x + obj->cur.geometry.x) == (o->prev.fill.x + obj->prev.geometry.x)) &&
+       ((o->cur.fill.y + obj->cur.geometry.y) == (o->prev.fill.y + obj->prev.geometry.y)) &&
+       (!o->pixel_updates)
+       )
+     {
+       evas_rects_return_difference_rects(&obj->layer->evas->clip_changes,
+                                          obj->cur.geometry.x,
+                                          obj->cur.geometry.y,
+                                          obj->cur.geometry.w,
+                                          obj->cur.geometry.h,
+                                          obj->prev.geometry.x,
+                                          obj->prev.geometry.y,
+                                          obj->prev.geometry.w,
+                                          obj->prev.geometry.h);
+       if (!o->pixel_updates) goto done;
+     }
+#endif   
+   if (((obj->cur.geometry.x != obj->prev.geometry.x) ||
+       (obj->cur.geometry.y != obj->prev.geometry.y) ||
+       (obj->cur.geometry.w != obj->prev.geometry.w) ||
+       (obj->cur.geometry.h != obj->prev.geometry.h))
+       )
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       if (!o->pixel_updates) goto done;
+     }
+   if (o->changed)
+     {
+       if ((o->cur.fill.x != o->prev.fill.x) ||
+           (o->cur.fill.y != o->prev.fill.y) ||
+           (o->cur.fill.w != o->prev.fill.w) ||
+           (o->cur.fill.h != o->prev.fill.h))
+         {
+            evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+            if (!o->pixel_updates) goto done;
+         }
+       if ((o->cur.border.l == 0) &&
+           (o->cur.border.r == 0) &&
+           (o->cur.border.t == 0) &&
+           (o->cur.border.b == 0) &&
+            (o->cur.image.w > 0) &&
+            (o->cur.image.h > 0))
+         {
+            Eina_Rectangle *rr;
+
+            EINA_LIST_FREE(o->pixel_updates, rr)
+              {
+                 Evas_Coord idw, idh, idx, idy;
+                 int x, y, w, h;
+
+                 obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output, o->engine_data, rr->x, rr->y, rr->w, rr->h);
+
+                 idx = evas_object_image_figure_x_fill(obj, o->cur.fill.x, o->cur.fill.w, &idw);
+                 idy = evas_object_image_figure_y_fill(obj, o->cur.fill.y, o->cur.fill.h, &idh);
+
+                 if (idw < 1) idw = 1;
+                 if (idh < 1) idh = 1;
+                 if (idx > 0) idx -= idw;
+                 if (idy > 0) idy -= idh;
+                 while (idx < obj->cur.geometry.w)
+                   {
+                      Evas_Coord ydy;
+
+                      ydy = idy;
+                      x = idx;
+                      w = ((int)(idx + idw)) - x;
+                      while (idy < obj->cur.geometry.h)
+                        {
+                           Eina_Rectangle r;
+
+                           y = idy;
+                           h = ((int)(idy + idh)) - y;
+
+                           r.x = ((rr->x - 1) * w) / o->cur.image.w;
+                           r.y = ((rr->y - 1) * h) / o->cur.image.h;
+                           r.w = ((rr->w + 2) * w) / o->cur.image.w;
+                           r.h = ((rr->h + 2) * h) / o->cur.image.h;
+                           r.x += obj->cur.geometry.x + x;
+                           r.y += obj->cur.geometry.y + y;
+                           evas_add_rect(&obj->layer->evas->clip_changes, r.x, r.y, r.w, r.h);
+                           idy += h;
+                        }
+                      idx += idw;
+                      idy = ydy;
+                   }
+                 eina_rectangle_free(rr);
+              }
+            goto done;
+         }
+       else
+         {
+            if (o->pixel_updates)
+              {
+                 Eina_Rectangle *r;
+
+                 EINA_LIST_FREE(o->pixel_updates, r)
+                   eina_rectangle_free(r);
+                 obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output, o->engine_data, 0, 0, o->cur.image.w, o->cur.image.h);
+                 evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+                 goto done;
+              }
+         }
+     }
+   /* it obviously didn't change - add a NO obscure - this "unupdates"  this */
+   /* area so if there were updates for it they get wiped. don't do it if we */
+   /* aren't fully opaque and we are visible */
+   if (evas_object_is_visible(obj) &&
+       evas_object_is_opaque(obj))
+     {
+         obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output,
+                                                               obj->cur.cache.clip.x,
+                                                               obj->cur.cache.clip.y,
+                                                               obj->cur.cache.clip.w,
+                                                               obj->cur.cache.clip.h);
+     }
+   done:
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+}
+
+static void
+evas_object_image_render_post(Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+   Eina_Rectangle *r;
+
+   /* this moves the current data to the previous state parts of the object */
+   /* in whatever way is safest for the object. also if we don't need object */
+   /* data anymore we can free it if the object deems this is a good idea */
+   o = (Evas_Object_Image *)(obj->object_data);
+   /* remove those pesky changes */
+   evas_object_clip_changes_clean(obj);
+   EINA_LIST_FREE(o->pixel_updates, r)
+     eina_rectangle_free(r);
+   /* move cur to prev safely for object data */
+   obj->prev = obj->cur;
+   o->prev = o->cur;
+   o->changed = 0;
+   /* FIXME: copy strings across */
+}
+
+static unsigned int evas_object_image_id_get(Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   o = (Evas_Object_Image *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_IMAGE;
+}
+
+static unsigned int evas_object_image_visual_id_get(Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   o = (Evas_Object_Image *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_IMAGE;
+}
+
+static void *evas_object_image_engine_data_get(Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   o = (Evas_Object_Image *)(obj->object_data);
+   if (!o) return NULL;
+   return o->engine_data;
+}
+
+static int
+evas_object_image_is_opaque(Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   /* this returns 1 if the internal object data implies that the object is */
+   /* currently fully opaque over the entire rectangle it occupies */
+   o = (Evas_Object_Image *)(obj->object_data);
+   if ((o->cur.fill.w < 1) || (o->cur.fill.h < 1))
+     return 0;
+   if (((o->cur.border.l != 0) ||
+       (o->cur.border.r != 0) ||
+       (o->cur.border.t != 0) ||
+       (o->cur.border.b != 0)) &&
+       (!o->cur.border.fill)) return 0;
+   if (!o->engine_data) return 0;
+   if ((obj->cur.map) && (obj->cur.usemap)) return 0;
+   if (obj->cur.render_op == EVAS_RENDER_COPY) return 1;
+   if (o->cur.has_alpha) return 0;
+   return 1;
+}
+
+static int
+evas_object_image_was_opaque(Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   /* this returns 1 if the internal object data implies that the object was */
+   /* previously fully opaque over the entire rectangle it occupies */
+   o = (Evas_Object_Image *)(obj->object_data);
+   if ((o->prev.fill.w < 1) || (o->prev.fill.h < 1))
+     return 0;
+   if (((o->prev.border.l != 0) ||
+       (o->prev.border.r != 0) ||
+       (o->prev.border.t != 0) ||
+       (o->prev.border.b != 0)) &&
+       (!o->prev.border.fill)) return 0;
+   if (!o->engine_data) return 0;
+   if (obj->prev.usemap) return 0;
+   if (obj->prev.render_op == EVAS_RENDER_COPY) return 1;
+   if (o->prev.has_alpha) return 0;
+   if (obj->prev.render_op != EVAS_RENDER_BLEND) return 0;
+   return 1;
+}
+
+static int
+evas_object_image_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
+{
+   Evas_Object_Image *o;
+   DATA32 *data;
+   int w, h, stride, iw, ih;
+   int a;
+
+   o = (Evas_Object_Image *)(obj->object_data);
+
+   x -= obj->cur.cache.clip.x;
+   y -= obj->cur.cache.clip.y;
+   w = obj->cur.cache.clip.w;
+   h = obj->cur.cache.clip.h;
+   iw = o->cur.image.w;
+   ih = o->cur.image.h;
+
+   if ((x < 0) || (y < 0) || (x >= w) || (y >= h)) return 0;
+   if (!o->cur.has_alpha) return 1;
+
+   if (obj->cur.map)
+     {
+        x = obj->cur.map->mx;
+        y = obj->cur.map->my;
+     }
+   else
+     {
+        int bl, br, bt, bb, bsl, bsr, bst, bsb;
+        
+        bl = o->cur.border.l;
+        br = o->cur.border.r;
+        bt = o->cur.border.t;
+        bb = o->cur.border.b;
+        if ((bl + br) > iw)
+          {
+             bl = iw / 2;
+             br = iw - bl;
+          }
+        if ((bl + br) > iw)
+          {
+             bl = iw / 2;
+             br = iw - bl;
+          }
+        if ((bt + bb) > ih)
+          {
+             bt = ih / 2;
+             bb = ih - bt;
+          }
+        if ((bt + bb) > ih)
+          {
+             bt = ih / 2;
+             bb = ih - bt;
+          }
+        if (o->cur.border.scale != 1.0)
+          {
+             bsl = ((double)bl * o->cur.border.scale);
+             bsr = ((double)br * o->cur.border.scale);
+             bst = ((double)bt * o->cur.border.scale);
+             bsb = ((double)bb * o->cur.border.scale);
+          }
+        else
+          {
+             bsl = bl; bsr = br; bst = bt; bsb = bb;
+          }
+        
+        w = o->cur.fill.w;
+        h = o->cur.fill.h;
+        x -= o->cur.fill.x;
+        y -= o->cur.fill.y;
+        x %= w;
+        y %= h;
+        
+        if (x < 0) x += w;
+        if (y < 0) y += h;
+        
+        if (o->cur.border.fill != EVAS_BORDER_FILL_DEFAULT)
+          {
+             if ((x > bsl) && (x < (w - bsr)) &&
+                 (y > bst) && (y < (h - bsb)))
+               {
+                  if (o->cur.border.fill == EVAS_BORDER_FILL_SOLID) return 1;
+                  return 0;
+               }
+          }
+        
+        if (x < bsl) x = (x * bl) / bsl;
+        else if (x > (w - bsr)) x = iw - (((w - x) * br) / bsr);
+        else if ((bsl + bsr) < w) x = bl + (((x - bsl) * (iw - bl - br)) / (w - bsl - bsr));
+        else return 1;
+        
+        if (y < bst) y = (y * bt) / bst;
+        else if (y > (h - bsb)) y = ih - (((h - y) * bb) / bsb);
+        else if ((bst + bsb) < h) y = bt + (((y - bst) * (ih - bt - bb)) / (h - bst - bsb));
+        else return 1;
+     }
+   
+   if (x < 0) x = 0;
+   if (y < 0) y = 0;
+   if (x >= iw) x = iw - 1;
+   if (y >= ih) y = ih - 1;
+   
+   stride = o->cur.image.stride;
+   
+   o->engine_data = obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output,
+                                                                 o->engine_data,
+                                                                 0,
+                                                                 &data);
+   if (!data)
+     return 0;
+
+   switch (o->cur.cspace)
+     {
+       case EVAS_COLORSPACE_ARGB8888:
+         data = ((DATA32*)(data) + ((y * stride) + x));
+         a = (*((DATA32*)(data)) >> 24) & 0xff;
+         break;
+       case EVAS_COLORSPACE_RGB565_A5P:
+           data = (void*) ((DATA16*)(data) + (h * stride));
+         data = (void*) ((DATA8*)(data) + ((y * stride) + x));
+         a = (*((DATA8*)(data))) & 0x1f;
+         break;
+       default:
+         return 1;
+         break;
+     }
+
+   return (a != 0);
+}
+
+static int
+evas_object_image_has_opaque_rect(Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   o = (Evas_Object_Image *)(obj->object_data);
+   if ((obj->cur.map) && (obj->cur.usemap)) return 0;
+   if (((o->cur.border.l | o->cur.border.r | o->cur.border.t | o->cur.border.b) != 0) &&
+       (o->cur.border.fill == EVAS_BORDER_FILL_SOLID) &&
+       (obj->cur.render_op == EVAS_RENDER_BLEND) &&
+       (obj->cur.cache.clip.a == 255) &&
+       (o->cur.fill.x == 0) &&
+       (o->cur.fill.y == 0) &&
+       (o->cur.fill.w == obj->cur.geometry.w) &&
+       (o->cur.fill.h == obj->cur.geometry.h)
+       ) return 1;
+   return 0;
+}
+
+static int
+evas_object_image_get_opaque_rect(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+{
+   Evas_Object_Image *o;
+
+   o = (Evas_Object_Image *)(obj->object_data);
+   if (o->cur.border.scale == 1.0)
+     {
+        *x = obj->cur.geometry.x + o->cur.border.l;
+        *y = obj->cur.geometry.y + o->cur.border.t;
+        *w = obj->cur.geometry.w - (o->cur.border.l + o->cur.border.r);
+        if (*w < 0) *w = 0;
+        *h = obj->cur.geometry.h - (o->cur.border.t + o->cur.border.b);
+        if (*h < 0) *h = 0;
+     }
+   else
+     {
+        *x = obj->cur.geometry.x + (o->cur.border.l * o->cur.border.scale);
+        *y = obj->cur.geometry.y + (o->cur.border.t * o->cur.border.scale);
+        *w = obj->cur.geometry.w - ((o->cur.border.l * o->cur.border.scale) + (o->cur.border.r * o->cur.border.scale));
+        if (*w < 0) *w = 0;
+        *h = obj->cur.geometry.h - ((o->cur.border.t * o->cur.border.scale) + (o->cur.border.b * o->cur.border.scale));
+        if (*h < 0) *h = 0;
+     }
+   return 1;
+}
+
+static int
+evas_object_image_can_map(Evas_Object *obj)
+{
+   return 1;
+}
+
+static void *
+evas_object_image_data_convert_internal(Evas_Object_Image *o, void *data, Evas_Colorspace to_cspace)
+{
+   void *out = NULL;
+
+   if (!data)
+     return NULL;
+
+   switch (o->cur.cspace)
+     {
+       case EVAS_COLORSPACE_ARGB8888:
+         out = evas_common_convert_argb8888_to(data,
+                                               o->cur.image.w,
+                                               o->cur.image.h,
+                                               o->cur.image.stride,
+                                               o->cur.has_alpha,
+                                               to_cspace);
+         break;
+       case EVAS_COLORSPACE_RGB565_A5P:
+         out = evas_common_convert_rgb565_a5p_to(data,
+                                                 o->cur.image.w,
+                                                 o->cur.image.h,
+                                                 o->cur.image.stride,
+                                                 o->cur.has_alpha,
+                                                 to_cspace);
+         break;
+       default:
+         break;
+     }
+
+   return out;
+}
+
+static void
+evas_object_image_filled_resize_listener(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *einfo __UNUSED__)
+{
+   Evas_Coord w, h;
+
+   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+   evas_object_image_fill_set(obj, 0, 0, w, h);
+}
diff --git a/src/lib/canvas/evas_object_inform.c b/src/lib/canvas/evas_object_inform.c
new file mode 100644 (file)
index 0000000..90ead99
--- /dev/null
@@ -0,0 +1,67 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/* local calls */
+
+void
+evas_object_inform_call_show(Evas_Object *obj)
+{
+   _evas_object_event_new();
+
+   evas_object_event_callback_call(obj, EVAS_CALLBACK_SHOW, NULL);
+   _evas_post_event_callback_call(obj->layer->evas);
+}
+
+void
+evas_object_inform_call_hide(Evas_Object *obj)
+{
+   _evas_object_event_new();
+
+   evas_object_event_callback_call(obj, EVAS_CALLBACK_HIDE, NULL);
+   _evas_post_event_callback_call(obj->layer->evas);
+}
+
+void
+evas_object_inform_call_move(Evas_Object *obj)
+{
+   _evas_object_event_new();
+
+   evas_object_event_callback_call(obj, EVAS_CALLBACK_MOVE, NULL);
+   _evas_post_event_callback_call(obj->layer->evas);
+}
+
+void
+evas_object_inform_call_resize(Evas_Object *obj)
+{
+   _evas_object_event_new();
+
+   evas_object_event_callback_call(obj, EVAS_CALLBACK_RESIZE, NULL);
+   _evas_post_event_callback_call(obj->layer->evas);
+}
+
+void
+evas_object_inform_call_restack(Evas_Object *obj)
+{
+   _evas_object_event_new();
+
+   evas_object_event_callback_call(obj, EVAS_CALLBACK_RESTACK, NULL);
+   _evas_post_event_callback_call(obj->layer->evas);
+}
+
+void
+evas_object_inform_call_changed_size_hints(Evas_Object *obj)
+{
+   _evas_object_event_new();
+
+   evas_object_event_callback_call(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, NULL);
+   _evas_post_event_callback_call(obj->layer->evas);
+}
+
+void
+evas_object_inform_call_image_preloaded(Evas_Object *obj)
+{
+   _evas_object_event_new();
+
+   evas_object_event_callback_call(obj, EVAS_CALLBACK_IMAGE_PRELOADED, NULL);
+   _evas_post_event_callback_call(obj->layer->evas);
+}
diff --git a/src/lib/canvas/evas_object_intercept.c b/src/lib/canvas/evas_object_intercept.c
new file mode 100644 (file)
index 0000000..3387685
--- /dev/null
@@ -0,0 +1,820 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/* local calls */
+
+static void evas_object_intercept_init(Evas_Object *obj);
+static void evas_object_intercept_deinit(Evas_Object *obj);
+
+static void
+evas_object_intercept_init(Evas_Object *obj)
+{
+   /* MEM OK */
+   if (!obj->interceptors)
+     obj->interceptors = evas_mem_calloc(sizeof(Evas_Intercept_Func));
+}
+
+static void
+evas_object_intercept_deinit(Evas_Object *obj)
+{
+   /* MEM OK */
+   if (!obj->interceptors) return;
+   if ((obj->interceptors->show.func) ||
+       (obj->interceptors->hide.func) ||
+       (obj->interceptors->move.func) ||
+       (obj->interceptors->resize.func) ||
+       (obj->interceptors->raise.func) ||
+       (obj->interceptors->lower.func) ||
+       (obj->interceptors->stack_above.func) ||
+       (obj->interceptors->stack_below.func) ||
+       (obj->interceptors->layer_set.func) ||
+       (obj->interceptors->color_set.func) ||
+       (obj->interceptors->clip_set.func) ||
+       (obj->interceptors->clip_unset.func))
+     return;
+   free(obj->interceptors);
+   obj->interceptors = NULL;
+}
+
+/* private calls */
+
+void
+evas_object_intercept_cleanup(Evas_Object *obj)
+{
+   /* MEM OK */
+   if (obj->interceptors) free(obj->interceptors);
+}
+
+int
+evas_object_intercept_call_show(Evas_Object *obj)
+{
+   /* MEM OK */
+   int ret;
+
+   if (!obj->interceptors) return 0;
+   if (obj->intercepted) return 0;
+   obj->intercepted = 1;
+   ret = ((obj->interceptors->show.func) != NULL);
+   if (obj->interceptors->show.func)
+     obj->interceptors->show.func(obj->interceptors->show.data, obj);
+   obj->intercepted = 0;
+   return ret;
+}
+
+int
+evas_object_intercept_call_hide(Evas_Object *obj)
+{
+   /* MEM OK */
+   int ret;
+
+   if (!obj->interceptors) return 0;
+   if (obj->intercepted) return 0;
+   obj->intercepted = 1;
+   ret = ((obj->interceptors->hide.func) != NULL);
+   if (obj->interceptors->hide.func)
+     obj->interceptors->hide.func(obj->interceptors->hide.data, obj);
+   obj->intercepted = 0;
+   return ret;
+}
+
+int
+evas_object_intercept_call_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
+{
+   /* MEM OK */
+   int ret;
+
+   if (!obj->interceptors) return 0;
+   if (obj->intercepted) return 0;
+   obj->intercepted = 1;
+   ret = ((obj->interceptors->move.func) != NULL);
+   if (obj->interceptors->move.func)
+     obj->interceptors->move.func(obj->interceptors->move.data, obj, x, y);
+   obj->intercepted = 0;
+   return ret;
+}
+
+int
+evas_object_intercept_call_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
+{
+   /* MEM OK */
+   int ret;
+
+   if (!obj->interceptors) return 0;
+   if (obj->intercepted) return 0;
+   obj->intercepted = 1;
+   ret = ((obj->interceptors->resize.func) != NULL);
+   if (obj->interceptors->resize.func)
+     obj->interceptors->resize.func(obj->interceptors->resize.data, obj, w, h);
+   obj->intercepted = 0;
+   return ret;
+}
+
+int
+evas_object_intercept_call_raise(Evas_Object *obj)
+{
+   /* MEM OK */
+   int ret;
+
+   if (!obj->interceptors) return 0;
+   if (obj->intercepted) return 0;
+   obj->intercepted = 1;
+   ret = ((obj->interceptors->raise.func) != NULL);
+   if (obj->interceptors->raise.func)
+     obj->interceptors->raise.func(obj->interceptors->raise.data, obj);
+   obj->intercepted = 0;
+   return ret;
+}
+
+int
+evas_object_intercept_call_lower(Evas_Object *obj)
+{
+   /* MEM OK */
+   int ret;
+
+   if (!obj->interceptors) return 0;
+   if (obj->intercepted) return 0;
+   obj->intercepted = 1;
+   ret = ((obj->interceptors->lower.func) != NULL);
+   if (obj->interceptors->lower.func)
+     obj->interceptors->lower.func(obj->interceptors->lower.data, obj);
+   obj->intercepted = 0;
+   return ret;
+}
+
+int
+evas_object_intercept_call_stack_above(Evas_Object *obj, Evas_Object *above)
+{
+   /* MEM OK */
+   int ret;
+
+   if (!obj->interceptors) return 0;
+   if (obj->intercepted) return 0;
+   obj->intercepted = 1;
+   ret = ((obj->interceptors->stack_above.func) != NULL);
+   if (obj->interceptors->stack_above.func)
+     obj->interceptors->stack_above.func(obj->interceptors->stack_above.data, obj, above);
+   obj->intercepted = 0;
+   return ret;
+}
+
+int
+evas_object_intercept_call_stack_below(Evas_Object *obj, Evas_Object *below)
+{
+   /* MEM OK */
+   int ret;
+
+   if (!obj->interceptors) return 0;
+   if (obj->intercepted) return 0;
+   obj->intercepted = 1;
+   ret = ((obj->interceptors->stack_below.func) != NULL);
+   if (obj->interceptors->stack_below.func)
+     obj->interceptors->stack_below.func(obj->interceptors->stack_below.data, obj, below);
+   obj->intercepted = 0;
+   return ret;
+}
+
+int
+evas_object_intercept_call_layer_set(Evas_Object *obj, int l)
+{
+   /* MEM OK */
+   int ret;
+
+   if (!obj->interceptors) return 0;
+   if (obj->intercepted) return 0;
+   obj->intercepted = 1;
+   ret = ((obj->interceptors->layer_set.func) != NULL);
+   if (obj->interceptors->layer_set.func)
+     obj->interceptors->layer_set.func(obj->interceptors->layer_set.data, obj, l);
+   obj->intercepted = 0;
+   return ret;
+}
+
+int
+evas_object_intercept_call_color_set(Evas_Object *obj, int r, int g, int b, int a)
+{
+   /* MEM OK */
+   int ret;
+
+   if (!obj->interceptors) return 0;
+   if (obj->intercepted) return 0;
+   obj->intercepted = 1;
+   ret = ((obj->interceptors->color_set.func) != NULL);
+   if (obj->interceptors->color_set.func)
+     obj->interceptors->color_set.func(obj->interceptors->color_set.data, obj, r, g, b, a);
+   obj->intercepted = 0;
+   return ret;
+}
+
+int
+evas_object_intercept_call_clip_set(Evas_Object *obj, Evas_Object *clip)
+{
+   /* MEM OK */
+   int ret;
+
+   if (!obj->interceptors) return 0;
+   if (obj->intercepted) return 0;
+   obj->intercepted = 1;
+   ret = ((obj->interceptors->clip_set.func) != NULL);
+   if (obj->interceptors->clip_set.func)
+     obj->interceptors->clip_set.func(obj->interceptors->clip_set.data, obj, clip);
+   obj->intercepted = 0;
+   return ret;
+}
+
+int
+evas_object_intercept_call_clip_unset(Evas_Object *obj)
+{
+   /* MEM OK */
+   int ret;
+
+   if (!obj->interceptors) return 0;
+   if (obj->intercepted) return 0;
+   obj->intercepted = 1;
+   ret = ((obj->interceptors->clip_unset.func) != NULL);
+   if (obj->interceptors->clip_unset.func)
+     obj->interceptors->clip_unset.func(obj->interceptors->clip_unset.data, obj);
+   obj->intercepted = 0;
+   return ret;
+}
+
+/* public calls */
+
+/**
+ * @addtogroup Evas_Object_Group_Interceptors
+ * @{
+ */
+
+/**
+ * Set the callback function that intercepts a show event of a object.
+ *
+ * @param obj The given canvas object pointer.
+ * @param func The given function to be the callback function.
+ * @param data The data passed to the callback fucntion.
+ *
+ * This function sets a callback function to intercepts a show event
+ * of a canvas object.
+ *
+ * @see evas_object_intercept_show_callback_del().
+ *
+ */
+EAPI void
+evas_object_intercept_show_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data)
+{
+   /* MEM OK */
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!func) return;
+   evas_object_intercept_init(obj);
+   if (!obj->interceptors) return;
+   obj->interceptors->show.func = func;
+   obj->interceptors->show.data = (void *)data;
+}
+
+/**
+ * Unset the callback function that intercepts a show event of a
+ * object.
+ *
+ * @param obj The given canvas object pointer.
+ * @param func The given callback function.
+ *
+ * This function sets a callback function to intercepts a show event
+ * of a canvas object.
+ *
+ * @see evas_object_intercept_show_callback_add().
+ *
+ */
+EAPI void *
+evas_object_intercept_show_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
+{
+   /* MEM OK */
+   void *data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!func) return NULL;
+   if (!obj->interceptors) return NULL;
+   obj->interceptors->show.func = NULL;
+   data = obj->interceptors->show.data;
+   obj->interceptors->show.data = NULL;
+   evas_object_intercept_deinit(obj);
+   return data;
+}
+
+/**
+ * Set the callback function that intercepts a hide event of a object.
+ *
+ * @param obj The given canvas object pointer.
+ * @param func The given function to be the callback function.
+ * @param data The data passed to the callback fucntion.
+ *
+ * This function sets a callback function to intercepts a hide event
+ * of a canvas object.
+ *
+ * @see evas_object_intercept_hide_callback_del().
+ *
+ */
+EAPI void
+evas_object_intercept_hide_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data)
+{
+   /* MEM OK */
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!func) return;
+   evas_object_intercept_init(obj);
+   if (!obj->interceptors) return;
+   obj->interceptors->hide.func = func;
+   obj->interceptors->hide.data = (void *)data;
+}
+
+/**
+ * Unset the callback function that intercepts a hide event of a
+ * object.
+ *
+ * @param obj The given canvas object pointer.
+ * @param func The given callback function.
+ *
+ * This function sets a callback function to intercepts a hide event
+ * of a canvas object.
+ *
+ * @see evas_object_intercept_hide_callback_add().
+ *
+ */
+EAPI void *
+evas_object_intercept_hide_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
+{
+   /* MEM OK */
+   void *data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!func) return NULL;
+   if (!obj->interceptors) return NULL;
+   obj->interceptors->hide.func = NULL;
+   data = obj->interceptors->hide.data;
+   obj->interceptors->hide.data = NULL;
+   evas_object_intercept_deinit(obj);
+   return data;
+}
+
+/**
+ * Set the callback function that intercepts a move event of a object.
+ *
+ * @param obj The given canvas object pointer.
+ * @param func The given function to be the callback function.
+ * @param data The data passed to the callback fucntion.
+ *
+ * This function sets a callback function to intercepts a move event
+ * of a canvas object.
+ *
+ * @see evas_object_intercept_move_callback_del().
+ *
+ */
+EAPI void
+evas_object_intercept_move_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y), const void *data)
+{
+   /* MEM OK */
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!func) return;
+   evas_object_intercept_init(obj);
+   if (!obj->interceptors) return;
+   obj->interceptors->move.func = func;
+   obj->interceptors->move.data = (void *)data;
+}
+
+/**
+ * Unset the callback function that intercepts a move event of a
+ * object.
+ *
+ * @param obj The given canvas object pointer.
+ * @param func The given callback function.
+ *
+ * This function sets a callback function to intercepts a move event
+ * of a canvas object.
+ *
+ * @see evas_object_intercept_move_callback_add().
+ *
+ */
+EAPI void *
+evas_object_intercept_move_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y))
+{
+   /* MEM OK */
+   void *data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!func) return NULL;
+   if (!obj->interceptors) return NULL;
+   obj->interceptors->move.func = NULL;
+   data = obj->interceptors->move.data;
+   obj->interceptors->move.data = NULL;
+   evas_object_intercept_deinit(obj);
+   return data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_intercept_resize_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord w, Evas_Coord h), const void *data)
+{
+   /* MEM OK */
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!func) return;
+   evas_object_intercept_init(obj);
+   if (!obj->interceptors) return;
+   obj->interceptors->resize.func = func;
+   obj->interceptors->resize.data = (void *)data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void *
+evas_object_intercept_resize_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord w, Evas_Coord h))
+{
+   /* MEM OK */
+   void *data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!func) return NULL;
+   if (!obj->interceptors) return NULL;
+   obj->interceptors->resize.func = NULL;
+   data = obj->interceptors->resize.data;
+   obj->interceptors->resize.data = NULL;
+   evas_object_intercept_deinit(obj);
+   return data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_intercept_raise_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data)
+{
+   /* MEM OK */
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!func) return;
+   evas_object_intercept_init(obj);
+   if (!obj->interceptors) return;
+   obj->interceptors->raise.func = func;
+   obj->interceptors->raise.data = (void *)data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void *
+evas_object_intercept_raise_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
+{
+   /* MEM OK */
+   void *data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!func) return NULL;
+   if (!obj->interceptors) return NULL;
+   obj->interceptors->raise.func = NULL;
+   data = obj->interceptors->raise.data;
+   obj->interceptors->raise.data = NULL;
+   evas_object_intercept_deinit(obj);
+   return data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_intercept_lower_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data)
+{
+   /* MEM OK */
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!func) return;
+   evas_object_intercept_init(obj);
+   if (!obj->interceptors) return;
+   obj->interceptors->lower.func = func;
+   obj->interceptors->lower.data = (void *)data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void *
+evas_object_intercept_lower_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
+{
+   /* MEM OK */
+   void *data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!func) return NULL;
+   if (!obj->interceptors) return NULL;
+   obj->interceptors->lower.func = NULL;
+   data = obj->interceptors->lower.data;
+   obj->interceptors->lower.data = NULL;
+   evas_object_intercept_deinit(obj);
+   return data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_intercept_stack_above_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above), const void *data)
+{
+   /* MEM OK */
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!func) return;
+   evas_object_intercept_init(obj);
+   if (!obj->interceptors) return;
+   obj->interceptors->stack_above.func = func;
+   obj->interceptors->stack_above.data = (void *)data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void *
+evas_object_intercept_stack_above_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above))
+{
+   /* MEM OK */
+   void *data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!func) return NULL;
+   if (!obj->interceptors) return NULL;
+   obj->interceptors->stack_above.func = NULL;
+   data = obj->interceptors->stack_above.data;
+   obj->interceptors->stack_above.data = NULL;
+   evas_object_intercept_deinit(obj);
+   return data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_intercept_stack_below_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below), const void *data)
+{
+   /* MEM OK */
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!func) return;
+   evas_object_intercept_init(obj);
+   if (!obj->interceptors) return;
+   obj->interceptors->stack_below.func = func;
+   obj->interceptors->stack_below.data = (void *)data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void *
+evas_object_intercept_stack_below_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below))
+{
+   /* MEM OK */
+   void *data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!func) return NULL;
+   if (!obj->interceptors) return NULL;
+   obj->interceptors->stack_below.func = NULL;
+   data = obj->interceptors->stack_below.data;
+   obj->interceptors->stack_below.data = NULL;
+   evas_object_intercept_deinit(obj);
+   return data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_intercept_layer_set_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l), const void *data)
+{
+   /* MEM OK */
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!func) return;
+   evas_object_intercept_init(obj);
+   if (!obj->interceptors) return;
+   obj->interceptors->layer_set.func = func;
+   obj->interceptors->layer_set.data = (void *)data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void *
+evas_object_intercept_layer_set_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l))
+{
+   /* MEM OK */
+   void *data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!func) return NULL;
+   if (!obj->interceptors) return NULL;
+   obj->interceptors->layer_set.func = NULL;
+   data = obj->interceptors->layer_set.data;
+   obj->interceptors->layer_set.data = NULL;
+   evas_object_intercept_deinit(obj);
+   return data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_intercept_color_set_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int r, int g, int b, int a), const void *data)
+{
+   /* MEM OK */
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!func) return;
+   evas_object_intercept_init(obj);
+   if (!obj->interceptors) return;
+   obj->interceptors->color_set.func = func;
+   obj->interceptors->color_set.data = (void *)data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void *
+evas_object_intercept_color_set_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int r, int g, int b, int a))
+{
+   /* MEM OK */
+   void *data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!func) return NULL;
+   if (!obj->interceptors) return NULL;
+   obj->interceptors->color_set.func = NULL;
+   data = obj->interceptors->color_set.data;
+   obj->interceptors->color_set.data = NULL;
+   evas_object_intercept_deinit(obj);
+   return data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_intercept_clip_set_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *clip), const void *data)
+{
+   /* MEM OK */
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!func) return;
+   evas_object_intercept_init(obj);
+   if (!obj->interceptors) return;
+   obj->interceptors->clip_set.func = func;
+   obj->interceptors->clip_set.data = (void *)data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void *
+evas_object_intercept_clip_set_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *clip))
+{
+   /* MEM OK */
+   void *data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!func) return NULL;
+   if (!obj->interceptors) return NULL;
+   obj->interceptors->clip_set.func = NULL;
+   data = obj->interceptors->clip_set.data;
+   obj->interceptors->clip_set.data = NULL;
+   evas_object_intercept_deinit(obj);
+   return data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_intercept_clip_unset_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data)
+{
+   /* MEM OK */
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (!func) return;
+   evas_object_intercept_init(obj);
+   if (!obj->interceptors) return;
+   obj->interceptors->clip_unset.func = func;
+   obj->interceptors->clip_unset.data = (void *)data;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void *
+evas_object_intercept_clip_unset_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
+{
+   /* MEM OK */
+   void *data;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!func) return NULL;
+   if (!obj->interceptors) return NULL;
+   obj->interceptors->clip_unset.func = NULL;
+   data = obj->interceptors->clip_unset.data;
+   obj->interceptors->clip_unset.data = NULL;
+   evas_object_intercept_deinit(obj);
+   return data;
+}
+
+/**
+ * @}
+ */
diff --git a/src/lib/canvas/evas_object_line.c b/src/lib/canvas/evas_object_line.c
new file mode 100644 (file)
index 0000000..39f0acf
--- /dev/null
@@ -0,0 +1,488 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/* private magic number for line objects */
+static const char o_type[] = "line";
+
+/* private struct for line object internal data */
+typedef struct _Evas_Object_Line      Evas_Object_Line;
+
+struct _Evas_Object_Line
+{
+   DATA32            magic;
+   struct {
+      struct {
+        int         x1, y1, x2, y2;
+        struct {
+           Evas_Coord w, h;
+        } object;
+      } cache;
+      Evas_Coord         x1, y1, x2, y2;
+   } cur, prev;
+
+   void             *engine_data;
+
+   char              changed : 1;
+};
+
+/* private methods for line objects */
+static void evas_object_line_init(Evas_Object *obj);
+static void *evas_object_line_new(void);
+static void evas_object_line_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
+static void evas_object_line_free(Evas_Object *obj);
+static void evas_object_line_render_pre(Evas_Object *obj);
+static void evas_object_line_render_post(Evas_Object *obj);
+
+static unsigned int evas_object_line_id_get(Evas_Object *obj);
+static unsigned int evas_object_line_visual_id_get(Evas_Object *obj);
+static void *evas_object_line_engine_data_get(Evas_Object *obj);
+
+static int evas_object_line_is_opaque(Evas_Object *obj);
+static int evas_object_line_was_opaque(Evas_Object *obj);
+static int evas_object_line_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
+static int evas_object_line_was_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
+static void evas_object_line_coords_recalc(Evas_Object *obj);
+
+static const Evas_Object_Func object_func =
+{
+   /* methods (compulsory) */
+   evas_object_line_free,
+     evas_object_line_render,
+     evas_object_line_render_pre,
+     evas_object_line_render_post,
+     evas_object_line_id_get,
+     evas_object_line_visual_id_get,
+     evas_object_line_engine_data_get,
+   /* these are optional. NULL = nothing */
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     evas_object_line_is_opaque,
+     evas_object_line_was_opaque,
+     evas_object_line_is_inside,
+     evas_object_line_was_inside,
+     evas_object_line_coords_recalc,
+     NULL,
+     NULL,
+     NULL,
+     NULL
+};
+
+/* the actual api call to add a rect */
+/* it has no other api calls as all properties are standard */
+
+
+/**
+ * @addtogroup Evas_Line_Group
+ * @{
+ */
+
+/**
+ * Adds a new evas line object to the given evas.
+ * @param   e The given evas.
+ * @return  The new evas line object.
+ */
+EAPI Evas_Object *
+evas_object_line_add(Evas *e)
+{
+   Evas_Object *obj;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   obj = evas_object_new(e);
+   evas_object_line_init(obj);
+   evas_object_inject(obj, e);
+   return obj;
+}
+
+/**
+ * Sets the coordinates of the end points of the given evas line object.
+ * @param   obj The given evas line object.
+ * @param   x1  The X coordinate of the first point.
+ * @param   y1  The Y coordinate of the first point.
+ * @param   x2  The X coordinate of the second point.
+ * @param   y2  The Y coordinate of the second point.
+ */
+EAPI void
+evas_object_line_xy_set(Evas_Object *obj, Evas_Coord x1, Evas_Coord y1, Evas_Coord x2, Evas_Coord y2)
+{
+   Evas_Object_Line *o;
+   Evas_Coord min_x, max_x, min_y, max_y;
+   int is, was = 0;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Line *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Line, MAGIC_OBJ_LINE);
+   return;
+   MAGIC_CHECK_END();
+   if ((x1 == o->cur.x1) && (y1 == o->cur.y1) &&
+       (x2 == o->cur.x2) && (y2 == o->cur.y2)) return;
+   if (obj->layer->evas->events_frozen <= 0)
+     {
+       if (!evas_event_passes_through(obj))
+         was = evas_object_is_in_output_rect(obj,
+                                             obj->layer->evas->pointer.x,
+                                             obj->layer->evas->pointer.y, 1, 1);
+     }
+   if (x1 < x2)
+     {
+       min_x = x1;
+       max_x = x2;
+     }
+   else
+     {
+       min_x = x2;
+       max_x = x1;
+     }
+   if (y1 < y2)
+     {
+       min_y = y1;
+       max_y = y2;
+     }
+   else
+     {
+       min_y = y2;
+       max_y = y1;
+     }
+   obj->cur.geometry.x = min_x;
+   obj->cur.geometry.y = min_y;
+   obj->cur.geometry.w = max_x - min_x + 2;
+   obj->cur.geometry.h = max_y - min_y + 2;
+////   obj->cur.cache.geometry.validity = 0;
+   o->cur.x1 = x1 - min_x;
+   o->cur.y1 = y1 - min_y;
+   o->cur.x2 = x2 - min_x;
+   o->cur.y2 = y2 - min_y;
+   o->changed = 1;
+   evas_object_change(obj);
+   evas_object_coords_recalc(obj);
+   evas_object_clip_dirty(obj);
+   if (obj->layer->evas->events_frozen <= 0)
+     {
+       is = evas_object_is_in_output_rect(obj,
+                                          obj->layer->evas->pointer.x,
+                                          obj->layer->evas->pointer.y, 1, 1);
+       if (!evas_event_passes_through(obj))
+         {
+            if ((is ^ was) && obj->cur.visible)
+              evas_event_feed_mouse_move(obj->layer->evas,
+                                         obj->layer->evas->pointer.x,
+                                         obj->layer->evas->pointer.y,
+                                         obj->layer->evas->last_timestamp,
+                                         NULL);
+         }
+     }
+   evas_object_inform_call_move(obj);
+   evas_object_inform_call_resize(obj);
+}
+
+/**
+ * Retrieves the coordinates of the end points of the given evas line object.
+ * @param obj The given line object.
+ * @param x1  Pointer to an integer in which to store the X coordinate of the
+ *            first end point.
+ * @param y1  Pointer to an integer in which to store the Y coordinate of the
+ *            first end point.
+ * @param x2  Pointer to an integer in which to store the X coordinate of the
+ *            second end point.
+ * @param y2  Pointer to an integer in which to store the Y coordinate of the
+ *            second end point.
+ */
+EAPI void
+evas_object_line_xy_get(const Evas_Object *obj, Evas_Coord *x1, Evas_Coord *y1, Evas_Coord *x2, Evas_Coord *y2)
+{
+   Evas_Object_Line *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (x1) *x1 = 0;
+   if (y1) *y1 = 0;
+   if (x2) *x2 = 0;
+   if (y2) *y2 = 0;
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Line *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Line, MAGIC_OBJ_LINE);
+   if (x1) *x1 = 0;
+   if (y1) *y1 = 0;
+   if (x2) *x2 = 0;
+   if (y2) *y2 = 0;
+   return;
+   MAGIC_CHECK_END();
+   if (x1) *x1 = obj->cur.geometry.x + o->cur.x1;
+   if (y1) *y1 = obj->cur.geometry.y + o->cur.y1;
+   if (x2) *x2 = obj->cur.geometry.x + o->cur.x2;
+   if (y2) *y2 = obj->cur.geometry.y + o->cur.y2;
+}
+
+/**
+ * @}
+ */
+
+/* all nice and private */
+static void
+evas_object_line_init(Evas_Object *obj)
+{
+   /* alloc image ob, setup methods and default values */
+   obj->object_data = evas_object_line_new();
+   /* set up default settings for this kind of object */
+   obj->cur.color.r = 255;
+   obj->cur.color.g = 255;
+   obj->cur.color.b = 255;
+   obj->cur.color.a = 255;
+   obj->cur.geometry.x = 0;
+   obj->cur.geometry.y = 0;
+   obj->cur.geometry.w = 0;
+   obj->cur.geometry.h = 0;
+   obj->cur.layer = 0;
+   obj->cur.anti_alias = 1;
+   obj->cur.render_op = EVAS_RENDER_BLEND;
+   /* set up object-specific settings */
+   obj->prev = obj->cur;
+   /* set up methods (compulsory) */
+   obj->func = &object_func;
+   obj->type = o_type;
+}
+
+static void *
+evas_object_line_new(void)
+{
+   Evas_Object_Line *o;
+
+   /* alloc obj private data */
+   o = calloc(1, sizeof(Evas_Object_Line));
+   o->magic = MAGIC_OBJ_LINE;
+   o->cur.x1 = 0;
+   o->cur.y1 = 0;
+   o->cur.x2 = 31;
+   o->cur.y2 = 31;
+   o->prev = o->cur;
+   return o;
+}
+
+static void
+evas_object_line_free(Evas_Object *obj)
+{
+   Evas_Object_Line *o;
+
+   /* frees private object data. very simple here */
+   o = (Evas_Object_Line *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Line, MAGIC_OBJ_LINE);
+   return;
+   MAGIC_CHECK_END();
+   /* free obj */
+   o->magic = 0;
+   free(o);
+}
+
+static void
+evas_object_line_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
+{
+   Evas_Object_Line *o;
+
+   /* render object to surface with context, and offxet by x,y */
+   o = (Evas_Object_Line *)(obj->object_data);
+   obj->layer->evas->engine.func->context_color_set(output,
+                                                   context,
+                                                   obj->cur.cache.clip.r,
+                                                   obj->cur.cache.clip.g,
+                                                   obj->cur.cache.clip.b,
+                                                   obj->cur.cache.clip.a);
+   obj->layer->evas->engine.func->context_multiplier_unset(output,
+                                                          context);
+   obj->layer->evas->engine.func->context_anti_alias_set(output, context,
+                                                        obj->cur.anti_alias);
+   obj->layer->evas->engine.func->context_render_op_set(output, context,
+                                                       obj->cur.render_op);
+   obj->layer->evas->engine.func->line_draw(output,
+                                           context,
+                                           surface,
+                                           o->cur.cache.x1 + x,
+                                           o->cur.cache.y1 + y,
+                                           o->cur.cache.x2 + x,
+                                           o->cur.cache.y2 + y);
+}
+
+static void
+evas_object_line_render_pre(Evas_Object *obj)
+{
+   Evas_Object_Line *o;
+   int is_v, was_v;
+
+   /* dont pre-render the obj twice! */
+   if (obj->pre_render_done) return;
+   obj->pre_render_done = 1;
+   /* pre-render phase. this does anything an object needs to do just before */
+   /* rendering. this could mean loading the image data, retrieving it from */
+   /* elsewhere, decoding video etc. */
+   /* then when this is done the object needs to figure if it changed and */
+   /* if so what and where and add the appropriate redraw lines */
+   o = (Evas_Object_Line *)(obj->object_data);
+   /* if someone is clipping this obj - go calculate the clipper */
+   if (obj->cur.clipper)
+     {
+       if (obj->cur.cache.clip.dirty)
+         evas_object_clip_recalc(obj->cur.clipper);
+       obj->cur.clipper->func->render_pre(obj->cur.clipper);
+     }
+   /* now figure what changed and add draw rects */
+   /* if it just became visible or invisible */
+   is_v = evas_object_is_visible(obj);
+   was_v = evas_object_was_visible(obj);
+   if (is_v != was_v)
+     {
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+       goto done;
+     }
+   if ((obj->cur.map != obj->prev.map) ||
+       (obj->cur.usemap != obj->prev.usemap))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+        goto done;
+     }
+   /* it's not visible - we accounted for it appearing or not so just abort */
+   if (!is_v) goto done;
+   /* clipper changed this is in addition to anything else for obj */
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
+   /* if we restacked (layer or just within a layer) */
+   if (obj->restack)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed anti_alias */
+   if (obj->cur.anti_alias != obj->prev.anti_alias)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed render op */
+   if (obj->cur.render_op != obj->prev.render_op)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed color */
+   if ((obj->cur.color.r != obj->prev.color.r) ||
+       (obj->cur.color.g != obj->prev.color.g) ||
+       (obj->cur.color.b != obj->prev.color.b) ||
+       (obj->cur.color.a != obj->prev.color.a))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed geometry - and obviously not visibility or color */
+   /* caluclate differences since we have a constant color fill */
+   /* we really only need to update the differences */
+   if ((obj->cur.geometry.x != obj->prev.geometry.x) ||
+       (obj->cur.geometry.y != obj->prev.geometry.y) ||
+       (obj->cur.geometry.w != obj->prev.geometry.w) ||
+       (obj->cur.geometry.h != obj->prev.geometry.h) ||
+       ((o->changed) &&
+       ((o->cur.x1 != o->prev.x1) ||
+        (o->cur.y1 != o->prev.y1) ||
+        (o->cur.x2 != o->prev.x2) ||
+        (o->cur.y2 != o->prev.y2)))
+       )
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   done:
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+}
+
+static void
+evas_object_line_render_post(Evas_Object *obj)
+{
+   Evas_Object_Line *o;
+
+   /* this moves the current data to the previous state parts of the object */
+   /* in whatever way is safest for the object. also if we don't need object */
+   /* data anymore we can free it if the object deems this is a good idea */
+   o = (Evas_Object_Line *)(obj->object_data);
+   /* remove those pesky changes */
+   evas_object_clip_changes_clean(obj);
+   /* move cur to prev safely for object data */
+   obj->prev = obj->cur;
+   o->prev = o->cur;
+   o->changed = 0;
+}
+
+static unsigned int evas_object_line_id_get(Evas_Object *obj)
+{
+   Evas_Object_Line *o;
+
+   o = (Evas_Object_Line *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_LINE;
+}
+
+static unsigned int evas_object_line_visual_id_get(Evas_Object *obj)
+{
+   Evas_Object_Line *o;
+
+   o = (Evas_Object_Line *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_SHAPE;
+}
+
+static void *evas_object_line_engine_data_get(Evas_Object *obj)
+{
+   Evas_Object_Line *o;
+
+   o = (Evas_Object_Line *)(obj->object_data);
+   if (!o) return NULL;
+   return o->engine_data;
+}
+
+static int
+evas_object_line_is_opaque(Evas_Object *obj)
+{
+   /* this returns 1 if the internal object data implies that the object is */
+   /* currently fully opaque over the entire line it occupies */
+   return 0;
+}
+
+static int
+evas_object_line_was_opaque(Evas_Object *obj)
+{
+   /* this returns 1 if the internal object data implies that the object was */
+   /* previously fully opaque over the entire line it occupies */
+   return 0;
+}
+
+static int
+evas_object_line_is_inside(Evas_Object *obj, Evas_Coord x __UNUSED__, Evas_Coord y __UNUSED__)
+{
+   /* this returns 1 if the canvas co-ordinates are inside the object based */
+   /* on object private data. not much use for rects, but for polys, images */
+   /* and other complex objects it might be */
+   return 1;
+}
+
+static int
+evas_object_line_was_inside(Evas_Object *obj, Evas_Coord x __UNUSED__, Evas_Coord y __UNUSED__)
+{
+   /* this returns 1 if the canvas co-ordinates were inside the object based */
+   /* on object private data. not much use for rects, but for polys, images */
+   /* and other complex objects it might be */
+   return 1;
+}
+
+static void
+evas_object_line_coords_recalc(Evas_Object *obj)
+{
+   Evas_Object_Line *o;
+
+   o = (Evas_Object_Line *)(obj->object_data);
+   o->cur.cache.x1 = obj->cur.geometry.x + o->cur.x1;
+   o->cur.cache.y1 = obj->cur.geometry.y + o->cur.y1;
+   o->cur.cache.x2 = obj->cur.geometry.x + o->cur.x2;
+   o->cur.cache.y2 = obj->cur.geometry.y + o->cur.y2;
+   o->cur.cache.object.w = obj->cur.geometry.w;
+   o->cur.cache.object.h = obj->cur.geometry.h;
+}
diff --git a/src/lib/canvas/evas_object_main.c b/src/lib/canvas/evas_object_main.c
new file mode 100644 (file)
index 0000000..8173d4a
--- /dev/null
@@ -0,0 +1,1706 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/* FIXME: this broken e17's mouse cursor - need to figure out why */
+
+/* uncomment the next line if smart objects should be informed
+ * if they are moved to the position they are already in
+ * (e.g. if they are in 0,0 and you call evas_object_move(o, 0, 0)
+ */
+//#define FORWARD_NOOP_MOVES_TO_SMART_OBJS
+
+/* likewise, for resizes
+ */
+//#define FORWARD_NOOP_RESIZES_TO_SMART_OBJS
+
+/* Similar to FORWARD_NOOP_*, this will allow no-operations (those calls that
+ * have values exactly like current state) to call EVAS_CALLBACK_*.
+ *
+ * For some unknown reason this was the default behavior so it is left as
+ * a compile-time option, but will be deprecated and removed soon as it can
+ * potentially lead to execution of unnecessary code.
+ * by Gustavo, February 5th, 2009.
+ * XXX: remove-me before e17 release!
+ */
+//#define CALLBACK_NOOP
+
+
+static Eina_Inlist *
+get_layer_objects(Evas_Layer *l)
+{
+   if( !l || !l->objects ) return NULL;
+
+   return (EINA_INLIST_GET(l->objects));
+}
+
+/* evas internal stuff */
+Evas_Object *
+evas_object_new(Evas *e)
+{
+   Evas_Object *obj;
+
+   obj = calloc(1, sizeof(Evas_Object));
+   if (!obj) return NULL;
+
+   obj->magic = MAGIC_OBJ;
+   obj->cur.scale = 1.0;
+   obj->prev.scale = 1.0;
+
+   return obj;
+}
+
+void
+evas_object_free(Evas_Object *obj, int clean_layer)
+{
+   int was_smart_child = 0;
+
+   evas_object_map_set(obj, NULL);
+   evas_object_grabs_cleanup(obj);
+   evas_object_intercept_cleanup(obj);
+   if (obj->smart.parent) was_smart_child = 1;
+   evas_object_smart_cleanup(obj);
+   obj->func->free(obj);
+   if (!was_smart_child) evas_object_release(obj, clean_layer);
+   if (obj->clip.clipees)
+     eina_list_free(obj->clip.clipees);
+   evas_object_clip_changes_clean(obj);
+   evas_object_event_callback_all_del(obj);
+   evas_object_event_callback_cleanup(obj);
+   while (obj->data.elements)
+     {
+       Evas_Data_Node *node;
+
+       node = obj->data.elements->data;
+       obj->data.elements = eina_list_remove(obj->data.elements, node);
+       free(node);
+     }
+   obj->magic = 0;
+   if (obj->size_hints) free(obj->size_hints);
+   free(obj);
+}
+
+void
+evas_object_change(Evas_Object *obj)
+{
+   Eina_List *l;
+   Evas_Object *obj2;
+
+   obj->layer->evas->changed = 1;
+   if (obj->changed) return;
+//   obj->changed = 1;
+   evas_render_object_recalc(obj);
+   /* set changed flag on all objects this one clips too */
+   EINA_LIST_FOREACH(obj->clip.clipees, l, obj2) evas_object_change(obj2);
+   if (obj->smart.parent) evas_object_change(obj->smart.parent);
+}
+
+void
+evas_object_render_pre_visible_change(Eina_Array *rects, Evas_Object *obj, int is_v, int was_v)
+{
+   if (obj->smart.smart) return ;
+   if (is_v == was_v) return ;
+   if (is_v)
+     {
+       evas_add_rect(rects,
+                     obj->cur.cache.clip.x,
+                     obj->cur.cache.clip.y,
+                     obj->cur.cache.clip.w,
+                     obj->cur.cache.clip.h);
+     }
+   else
+     {
+       evas_add_rect(rects,
+                     obj->prev.cache.clip.x,
+                     obj->prev.cache.clip.y,
+                     obj->prev.cache.clip.w,
+                     obj->prev.cache.clip.h);
+     }
+}
+
+void
+evas_object_render_pre_clipper_change(Eina_Array *rects, Evas_Object *obj)
+{
+   if (obj->smart.smart) return ;
+   if (obj->cur.clipper == obj->prev.clipper) return ;
+   if ((obj->cur.clipper) && (obj->prev.clipper))
+     {
+       /* get difference rects between clippers */
+       evas_rects_return_difference_rects(rects,
+                                          obj->cur.clipper->cur.cache.clip.x,
+                                          obj->cur.clipper->cur.cache.clip.y,
+                                          obj->cur.clipper->cur.cache.clip.w,
+                                          obj->cur.clipper->cur.cache.clip.h,
+                                          obj->prev.clipper->prev.cache.clip.x,
+                                          obj->prev.clipper->prev.cache.clip.y,
+                                          obj->prev.clipper->prev.cache.clip.w,
+                                          obj->prev.clipper->prev.cache.clip.h);
+     }
+   else if (obj->cur.clipper)
+     {
+       evas_rects_return_difference_rects(rects,
+                                          obj->cur.geometry.x,
+                                          obj->cur.geometry.y,
+                                          obj->cur.geometry.w,
+                                          obj->cur.geometry.h,
+////   rl = evas_rects_return_difference_rects(obj->cur.cache.geometry.x,
+////                                           obj->cur.cache.geometry.y,
+////                                           obj->cur.cache.geometry.w,
+////                                           obj->cur.cache.geometry.h,
+                                          obj->cur.clipper->cur.cache.clip.x,
+                                          obj->cur.clipper->cur.cache.clip.y,
+                                          obj->cur.clipper->cur.cache.clip.w,
+                                          obj->cur.clipper->cur.cache.clip.h);
+     }
+   else if (obj->prev.clipper)
+     {
+       evas_rects_return_difference_rects(rects,
+                                          obj->prev.geometry.x,
+                                          obj->prev.geometry.y,
+                                          obj->prev.geometry.w,
+                                          obj->prev.geometry.h,
+////   rl = evas_rects_return_difference_rects(obj->prev.cache.geometry.x,
+////                                           obj->prev.cache.geometry.y,
+////                                           obj->prev.cache.geometry.w,
+////                                           obj->prev.cache.geometry.h,
+                                          obj->prev.clipper->prev.cache.clip.x,
+                                          obj->prev.clipper->prev.cache.clip.y,
+                                          obj->prev.clipper->prev.cache.clip.w,
+                                          obj->prev.clipper->prev.cache.clip.h);
+     }
+}
+
+void
+evas_object_render_pre_prev_cur_add(Eina_Array *rects, Evas_Object *obj)
+{
+   evas_add_rect(rects,
+                 obj->cur.cache.clip.x,
+                 obj->cur.cache.clip.y,
+                 obj->cur.cache.clip.w,
+                 obj->cur.cache.clip.h);
+   evas_add_rect(rects,
+                 obj->prev.cache.clip.x,
+                 obj->prev.cache.clip.y,
+                 obj->prev.cache.clip.w,
+                 obj->prev.cache.clip.h);
+/*        
+        evas_add_rect(rects,
+                      obj->cur.geometry.x,
+                      obj->cur.geometry.y,
+                      obj->cur.geometry.w,
+                      obj->cur.geometry.h);
+////       obj->cur.cache.geometry.x,
+////       obj->cur.cache.geometry.y,
+////       obj->cur.cache.geometry.w,
+////       obj->cur.cache.geometry.h);
+        evas_add_rect(rects,
+                      obj->prev.geometry.x,
+                      obj->prev.geometry.y,
+                      obj->prev.geometry.w,
+                      obj->prev.geometry.h);
+////       obj->prev.cache.geometry.x,
+////       obj->prev.cache.geometry.y,
+////       obj->prev.cache.geometry.w,
+////       obj->prev.cache.geometry.h);
+*/
+}
+
+void
+evas_object_clip_changes_clean(Evas_Object *obj)
+{
+   Eina_Rectangle *r;
+
+   EINA_LIST_FREE(obj->clip.changes, r) eina_rectangle_free(r);
+}
+
+void
+evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *obj, int is_v, int was_v)
+{
+   Eina_Rectangle *r;
+   Evas_Object *clipper;
+   Eina_List *l;
+   unsigned int i;
+   Eina_Array_Iterator it;
+   int x, y, w, h;
+
+   if (obj->smart.smart) goto end;
+   /* FIXME: was_v isn't used... why? */
+   was_v = 0;
+   if (!obj->clip.clipees)
+     {
+       EINA_ARRAY_ITER_NEXT(rects, i, r, it)
+         {
+            /* get updates and clip to current clip */
+            x = r->x;
+            y = r->y;
+            w = r->w;
+            h = r->h;
+            RECTS_CLIP_TO_RECT(x, y, w, h,
+                               obj->cur.cache.clip.x,
+                               obj->cur.cache.clip.y,
+                               obj->cur.cache.clip.w,
+                               obj->cur.cache.clip.h);
+            if ((w > 0) && (h > 0))
+              obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output,
+                                                                     x, y, w, h);
+            /* get updates and clip to previous clip */
+            x = r->x;
+            y = r->y;
+            w = r->w;
+            h = r->h;
+            RECTS_CLIP_TO_RECT(x, y, w, h,
+                               obj->prev.cache.clip.x,
+                               obj->prev.cache.clip.y,
+                               obj->prev.cache.clip.w,
+                               obj->prev.cache.clip.h);
+            if ((w > 0) && (h > 0))
+              obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output,
+                                                                     x, y, w, h);
+         }
+       /* if the object is actually visible, take any parent clip changes */
+       if (is_v)
+         {
+            clipper = obj->cur.clipper;
+            while (clipper)
+              {
+                 EINA_LIST_FOREACH(clipper->clip.changes, l, r)
+                   {
+                      /* get updates and clip to current clip */
+                      x = r->x; y = r->y; w = r->w; h = r->h;
+                      RECTS_CLIP_TO_RECT(x, y, w, h,
+                                         obj->cur.cache.clip.x,
+                                         obj->cur.cache.clip.y,
+                                         obj->cur.cache.clip.w,
+                                         obj->cur.cache.clip.h);
+                      if ((w > 0) && (h > 0))
+                        obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output,
+                                                                               x, y, w, h);
+                      /* get updates and clip to previous clip */
+                      x = r->x; y = r->y; w = r->w; h = r->h;
+                      RECTS_CLIP_TO_RECT(x, y, w, h,
+                                         obj->prev.cache.clip.x,
+                                         obj->prev.cache.clip.y,
+                                         obj->prev.cache.clip.w,
+                                         obj->prev.cache.clip.h);
+                      if ((w > 0) && (h > 0))
+                        obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output,
+                                                                               x, y, w, h);
+                   }
+                 clipper = clipper->cur.clipper;
+              }
+         }
+     }
+   else
+     {
+       evas_object_clip_changes_clean(obj);
+       EINA_ARRAY_ITER_NEXT(rects, i, r, it)
+         obj->clip.changes = eina_list_append(obj->clip.changes, r);
+       eina_array_clean(rects);
+     }
+
+ end:
+   EINA_ARRAY_ITER_NEXT(rects, i, r, it)
+     eina_rectangle_free(r);
+   eina_array_clean(rects);
+}
+
+int
+evas_object_was_in_output_rect(Evas_Object *obj, int x, int y, int w, int h)
+{
+   if (obj->smart.smart) return 0;
+   /* assumes coords have been recalced */
+   if ((RECTS_INTERSECT(x, y, w, h,
+                       obj->prev.cache.clip.x,
+                       obj->prev.cache.clip.y,
+                       obj->prev.cache.clip.w,
+                       obj->prev.cache.clip.h)))
+     return 1;
+   return 0;
+}
+
+int
+evas_object_was_opaque(Evas_Object *obj)
+{
+   if (obj->smart.smart) return 0;
+   if (obj->prev.cache.clip.a == 255)
+     {
+       if (obj->func->was_opaque)
+         return obj->func->was_opaque(obj);
+       return 1;
+     }
+   return 0;
+}
+
+int
+evas_object_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
+{
+   if (obj->smart.smart) return 0;
+   if (obj->func->is_inside)
+     return obj->func->is_inside(obj, x, y);
+   return 0;
+}
+
+int
+evas_object_was_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
+{
+   if (obj->smart.smart) return 0;
+   if (obj->func->was_inside)
+     return obj->func->was_inside(obj, x, y);
+   return 0;
+}
+/* routines apps will call */
+
+/**
+ * Deletes the given evas object and frees its memory.
+ *
+ * The object's 'free' callback is called when this function is called.
+ * If the object currently has the focus, its 'focus out' callback is
+ * also called.
+ *
+ * @param   obj The given evas object.
+ * @ingroup Evas_Object_Group_Basic
+ */
+EAPI void
+evas_object_del(Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+
+   if (obj->delete_me) return;
+
+   _evas_object_event_new();
+
+   evas_object_event_callback_call(obj, EVAS_CALLBACK_DEL, NULL);
+   _evas_post_event_callback_call(obj->layer->evas);
+   if (obj->name) evas_object_name_set(obj, NULL);
+   if (!obj->layer)
+     {
+       evas_object_free(obj, 1);
+       return;
+     }
+   if (obj->focused)
+     {
+       obj->focused = 0;
+       obj->layer->evas->focused = NULL;
+       _evas_object_event_new();
+       evas_object_event_callback_call(obj, EVAS_CALLBACK_FOCUS_OUT, NULL);
+        _evas_post_event_callback_call(obj->layer->evas);
+     }
+   obj->layer->evas->pointer.mouse_grabbed -= obj->mouse_grabbed;
+   obj->mouse_grabbed = 0;
+   evas_object_hide(obj);
+   evas_object_grabs_cleanup(obj);
+   while (obj->clip.clipees) evas_object_clip_unset(obj->clip.clipees->data);
+   if (obj->cur.clipper) evas_object_clip_unset(obj);
+   if (obj->smart.smart) evas_object_smart_del(obj);
+   evas_object_map_set(obj, NULL);
+   _evas_object_event_new();
+   evas_object_event_callback_call(obj, EVAS_CALLBACK_FREE, NULL);
+   _evas_post_event_callback_call(obj->layer->evas);
+   evas_object_smart_cleanup(obj);
+   obj->delete_me = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Moves the given evas object to the given location.
+ * @param   obj The given evas object.
+ * @param   x   X position to move the object to, in canvas units.
+ * @param   y   Y position to move the object to, in canvas units.
+ * @ingroup Evas_Object_Group_Basic
+ */
+EAPI void
+evas_object_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
+{
+   int is, was = 0, pass = 0;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return;
+   if (evas_object_intercept_call_move(obj, x, y)) return;
+#ifdef FORWARD_NOOP_MOVES_TO_SMART_OBJS
+   if (obj->smart.smart)
+     {
+       if (obj->smart.smart->smart_class->move)
+         obj->smart.smart->smart_class->move(obj, x, y);
+     }
+#endif
+   if ((obj->cur.geometry.x == x) &&
+       (obj->cur.geometry.y == y))
+     {
+#ifdef CALLBACK_NOOP
+       evas_object_inform_call_move(obj);
+#endif
+       return;
+     }
+#ifndef FORWARD_NOOP_MOVES_TO_SMART_OBJS
+   if (obj->smart.smart)
+     {
+       if (obj->smart.smart->smart_class->move)
+         obj->smart.smart->smart_class->move(obj, x, y);
+     }
+#endif
+   if (obj->layer->evas->events_frozen <= 0)
+     {
+       pass = evas_event_passes_through(obj);
+       if (!pass)
+         was = evas_object_is_in_output_rect(obj,
+                                             obj->layer->evas->pointer.x,
+                                             obj->layer->evas->pointer.y, 1, 1);
+     }
+   obj->cur.geometry.x = x;
+   obj->cur.geometry.y = y;
+////   obj->cur.cache.geometry.validity = 0;
+   evas_object_change(obj);
+   evas_object_clip_dirty(obj);
+   if (obj->layer->evas->events_frozen <= 0)
+     {
+       evas_object_recalc_clippees(obj);
+       if (!pass)
+         {
+            if (!obj->smart.smart)
+              {
+                 is = evas_object_is_in_output_rect(obj,
+                                                    obj->layer->evas->pointer.x,
+                                                    obj->layer->evas->pointer.y, 1, 1);
+                 if ((is ^ was) && obj->cur.visible)
+                   evas_event_feed_mouse_move(obj->layer->evas,
+                                              obj->layer->evas->pointer.x,
+                                              obj->layer->evas->pointer.y,
+                                              obj->layer->evas->last_timestamp,
+                                              NULL);
+              }
+         }
+     }
+   evas_object_inform_call_move(obj);
+}
+
+/**
+ * Changes the size of the given evas object.
+ * @param   obj The given evas object.
+ * @param   w   The new width of the evas object.
+ * @param   h   The new height of the evas object.
+ *
+ * @note Be aware that resizing an object changes its drawing area,
+ *       but that does imply the object is rescaled! For instance,
+ *       images are filled inside their drawing area using the
+ *       specifications of evas_object_image_fill_set(), thus to scale
+ *       the image to match exactly your drawing area, you need to
+ *       change the evas_object_image_fill_set() as well. Consider the
+ *       following example:
+ *       @code
+ *       // rescale image to fill exactly its area without tiling:
+ *       evas_object_resize(img, w, h);
+ *       evas_object_image_fill_set(img, 0, 0, w, h);
+ *       @endcode
+ *       This is more evident in images, but text, textblock, lines
+ *       and polygons will behave similarly. Check their specific APIs
+ *       to know how to achive your desired behavior.
+ *
+ * @ingroup Evas_Object_Group_Basic
+ */
+EAPI void
+evas_object_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
+{
+   int is, was = 0, pass = 0;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return;
+   if (w < 0) w = 0; if (h < 0) h = 0;
+   if (evas_object_intercept_call_resize(obj, w, h)) return;
+#ifdef FORWARD_NOOP_RESIZES_TO_SMART_OBJS
+   if (obj->smart.smart)
+     {
+       if (obj->smart.smart->smart_class->resize)
+         obj->smart.smart->smart_class->resize(obj, w, h);
+     }
+#endif
+   if ((obj->cur.geometry.w == w) &&
+       (obj->cur.geometry.h == h))
+     {
+#ifdef CALLBACK_NOOP
+       evas_object_inform_call_resize(obj);
+#endif
+       return;
+     }
+#ifndef FORWARD_NOOP_RESIZES_TO_SMART_OBJS
+   if (obj->smart.smart)
+     {
+       if (obj->smart.smart->smart_class->resize)
+         obj->smart.smart->smart_class->resize(obj, w, h);
+     }
+#endif
+   if (obj->layer->evas->events_frozen <= 0)
+     {
+       pass = evas_event_passes_through(obj);
+       if (!pass)
+         was = evas_object_is_in_output_rect(obj,
+                                             obj->layer->evas->pointer.x,
+                                             obj->layer->evas->pointer.y, 1, 1);
+     }
+
+   obj->cur.geometry.w = w;
+   obj->cur.geometry.h = h;
+////   obj->cur.cache.geometry.validity = 0;
+   evas_object_change(obj);
+   evas_object_clip_dirty(obj);
+   /* NB: evas_object_recalc_clippees was here previously ( < 08/07/2009) */
+   if (obj->layer->evas->events_frozen <= 0)
+     {
+        /* NB: If this creates glitches on screen then move to above position */
+        evas_object_recalc_clippees(obj);
+
+       //   if (obj->func->coords_recalc) obj->func->coords_recalc(obj);
+       if (!pass)
+         {
+            if (!obj->smart.smart)
+              {
+                 is = evas_object_is_in_output_rect(obj,
+                                                    obj->layer->evas->pointer.x,
+                                                    obj->layer->evas->pointer.y, 1, 1);
+                 if ((is ^ was) && (obj->cur.visible))
+                   evas_event_feed_mouse_move(obj->layer->evas,
+                                              obj->layer->evas->pointer.x,
+                                              obj->layer->evas->pointer.y,
+                                              obj->layer->evas->last_timestamp,
+                                              NULL);
+              }
+         }
+     }
+   evas_object_inform_call_resize(obj);
+}
+
+/**
+ * Retrieves the position and rectangular size of the given evas object.
+ *
+ * Note that if any of @p x, @p y, @p w or @p h are @c NULL, the @c NULL
+ * parameters are ignored.
+ *
+ * @param obj The given evas object.
+ * @param   x   Pointer to an integer in which to store the X coordinate of
+ *              the object.
+ * @param   y   Pointer to an integer in which to store the Y coordinate of
+ *              the object.
+ * @param   w   Pointer to an integer in which to store the width of the
+ *              object.
+ * @param   h   Pointer to an integer in which to store the height of the
+ *              object.
+ * @ingroup Evas_Object_Group_Basic
+ */
+EAPI void
+evas_object_geometry_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (x) *x = 0; if (y) *y = 0; if (w) *w = 0; if (h) *h = 0;
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me)
+     {
+       if (x) *x = 0; if (y) *y = 0; if (w) *w = 0; if (h) *h = 0;
+       return;
+     }
+   if (x) *x = obj->cur.geometry.x;
+   if (y) *y = obj->cur.geometry.y;
+   if (w) *w = obj->cur.geometry.w;
+   if (h) *h = obj->cur.geometry.h;
+}
+
+/**
+ * @addtogroup Evas_Object_Group_Size_Hints
+ * @{
+ */
+
+static void
+_evas_object_size_hint_alloc(Evas_Object *obj)
+{
+   if (obj->size_hints) return;
+
+   obj->size_hints = calloc(1, sizeof(Evas_Size_Hints));
+   obj->size_hints->max.w = -1;
+   obj->size_hints->max.h = -1;
+   obj->size_hints->align.x = 0.5;
+   obj->size_hints->align.y = 0.5;
+}
+
+/**
+ * Retrieves the size hint for the minimum size.
+ *
+ * This is not a size enforcement in any way, it's just a hint that should
+ * be used whenever appropriate.
+ *
+ * Note that if any of @p w or @p h are @c NULL, the @c NULL
+ * parameters are ignored.
+ *
+ * @param obj The given evas object.
+ * @param   w Pointer to an integer in which to store the minimum width.
+ * @param   h Pointer to an integer in which to store the minimum height.
+ */
+EAPI void
+evas_object_size_hint_min_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (w) *w = 0; if (h) *h = 0;
+   return;
+   MAGIC_CHECK_END();
+   if ((!obj->size_hints) || obj->delete_me)
+     {
+       if (w) *w = 0; if (h) *h = 0;
+       return;
+     }
+   if (w) *w = obj->size_hints->min.w;
+   if (h) *h = obj->size_hints->min.h;
+}
+
+/**
+ * Sets the size hint for the minimum size.
+ *
+ * This is not a size enforcement in any way, it's just a hint that should
+ * be used whenever appropriate.
+ *
+ * Value 0 is considered unset.
+ *
+ * @param obj The given evas object.
+ * @param   w Integer to use as the minimum width hint.
+ * @param   h Integer to use as the minimum height hint.
+ */
+EAPI void
+evas_object_size_hint_min_set(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me)
+     return;
+   _evas_object_size_hint_alloc(obj);
+   if ((obj->size_hints->min.w == w) && (obj->size_hints->min.h == h)) return;
+   obj->size_hints->min.w = w;
+   obj->size_hints->min.h = h;
+
+   evas_object_inform_call_changed_size_hints(obj);
+}
+
+/**
+ * Retrieves the size hint for the maximum size.
+ *
+ * This is not a size enforcement in any way, it's just a hint that should
+ * be used whenever appropriate.
+ *
+ * Note that if any of @p w or @p h are @c NULL, the @c NULL
+ * parameters are ignored.
+ *
+ * @param obj The given evas object.
+ * @param   w Pointer to an integer in which to store the maximum width.
+ * @param   h Pointer to an integer in which to store the maximum height.
+ */
+EAPI void
+evas_object_size_hint_max_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (w) *w = -1; if (h) *h = -1;
+   return;
+   MAGIC_CHECK_END();
+   if ((!obj->size_hints) || obj->delete_me)
+     {
+       if (w) *w = -1; if (h) *h = -1;
+       return;
+     }
+   if (w) *w = obj->size_hints->max.w;
+   if (h) *h = obj->size_hints->max.h;
+}
+
+/**
+ * Sets the size hint for the maximum size.
+ *
+ * This is not a size enforcement in any way, it's just a hint that should
+ * be used whenever appropriate.
+ *
+ * Value -1 is considered unset.
+ *
+ * @param obj The given evas object.
+ * @param   w Integer to use as the maximum width hint.
+ * @param   h Integer to use as the maximum height hint.
+ */
+EAPI void
+evas_object_size_hint_max_set(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me)
+     return;
+   _evas_object_size_hint_alloc(obj);
+   if ((obj->size_hints->max.w == w) && (obj->size_hints->max.h == h)) return;
+   obj->size_hints->max.w = w;
+   obj->size_hints->max.h = h;
+
+   evas_object_inform_call_changed_size_hints(obj);
+}
+
+/**
+ * Retrieves the size request hint.
+ *
+ * This is not a size enforcement in any way, it's just a hint that should
+ * be used whenever appropriate.
+ *
+ * Note that if any of @p w or @p h are @c NULL, the @c NULL
+ * parameters are ignored.
+ *
+ * @param obj The given evas object.
+ * @param   w Pointer to an integer in which to store the requested width.
+ * @param   h Pointer to an integer in which to store the requested height.
+ */
+EAPI void
+evas_object_size_hint_request_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (w) *w = 0; if (h) *h = 0;
+   return;
+   MAGIC_CHECK_END();
+   if ((!obj->size_hints) || obj->delete_me)
+     {
+       if (w) *w = 0; if (h) *h = 0;
+       return;
+     }
+   if (w) *w = obj->size_hints->request.w;
+   if (h) *h = obj->size_hints->request.h;
+}
+
+/**
+ * Sets the requested size hint.
+ *
+ * This is not a size enforcement in any way, it's just a hint that should
+ * be used whenever appropriate.
+ *
+ * Value 0 is considered unset.
+ *
+ * @param obj The given evas object.
+ * @param   w Integer to use as the preferred width hint.
+ * @param   h Integer to use as the preferred height hint.
+ */
+EAPI void
+evas_object_size_hint_request_set(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me)
+     return;
+   _evas_object_size_hint_alloc(obj);
+   if ((obj->size_hints->request.w == w) && (obj->size_hints->request.h == h)) return;
+   obj->size_hints->request.w = w;
+   obj->size_hints->request.h = h;
+
+   evas_object_inform_call_changed_size_hints(obj);
+}
+
+/**
+ * Retrieves the size aspect control hint.
+ *
+ * This is not a size enforcement in any way, it's just a hint that should
+ * be used whenever appropriate.
+ *
+ * Note that if any of @p aspect, @p w or @p h are @c NULL, the @c NULL
+ * parameters are ignored.
+ *
+ * @param    obj The given evas object.
+ * @param aspect Returns the hint on how size should be calculated.
+ * @param      w Pointer to an integer in which to store the aspect width.
+ * @param      h Pointer to an integer in which to store the aspect height.
+ */
+EAPI void
+evas_object_size_hint_aspect_get(const Evas_Object *obj, Evas_Aspect_Control *aspect, Evas_Coord *w, Evas_Coord *h)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (aspect) *aspect = EVAS_ASPECT_CONTROL_NONE;
+   if (w) *w = 0; if (h) *h = 0;
+   return;
+   MAGIC_CHECK_END();
+   if ((!obj->size_hints) || obj->delete_me)
+     {
+       if (aspect) *aspect = EVAS_ASPECT_CONTROL_NONE;
+       if (w) *w = 0; if (h) *h = 0;
+       return;
+     }
+   if (aspect) *aspect = obj->size_hints->aspect.mode;
+   if (w) *w = obj->size_hints->aspect.size.w;
+   if (h) *h = obj->size_hints->aspect.size.h;
+}
+
+/**
+ * Sets the size aspect control hint.
+ *
+ * This is not a size enforcement in any way, it's just a hint that should
+ * be used whenever appropriate.
+ *
+ * @param    obj The given evas object.
+ * @param aspect Hint on how to calculate size.
+ * @param      w Integer to use as aspect width hint.
+ * @param      h Integer to use as aspect height hint.
+ */
+EAPI void
+evas_object_size_hint_aspect_set(Evas_Object *obj, Evas_Aspect_Control aspect, Evas_Coord w, Evas_Coord h)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me)
+     return;
+   _evas_object_size_hint_alloc(obj);
+   if ((obj->size_hints->aspect.mode == aspect) && (obj->size_hints->aspect.size.w == w) && (obj->size_hints->aspect.size.h == h)) return;
+   obj->size_hints->aspect.mode = aspect;
+   obj->size_hints->aspect.size.w = w;
+   obj->size_hints->aspect.size.h = h;
+
+   evas_object_inform_call_changed_size_hints(obj);
+}
+
+/**
+ * Retrieves the size align control hint.
+ *
+ * This is not a size enforcement in any way, it's just a hint that should
+ * be used whenever appropriate.
+ *
+ * Note that if any of @p x or @p y are @c NULL, the @c NULL
+ * parameters are ignored.
+ *
+ * @param    obj The given evas object.
+ * @param      x Pointer to a double in which to store the align x.
+ * @param      y Pointer to a double in which to store the align y.
+ */
+EAPI void
+evas_object_size_hint_align_get(const Evas_Object *obj, double *x, double *y)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (x) *x = 0.5; if (y) *y = 0.5;
+   return;
+   MAGIC_CHECK_END();
+   if ((!obj->size_hints) || obj->delete_me)
+     {
+       if (x) *x = 0.5; if (y) *y = 0.5;
+       return;
+     }
+   if (x) *x = obj->size_hints->align.x;
+   if (y) *y = obj->size_hints->align.y;
+}
+
+/**
+ * Sets the size align control hint.
+ *
+ * This is not a size enforcement in any way, it's just a hint that should
+ * be used whenever appropriate.
+ *
+ * Accepted values are in the 0.0 to 1.0 range, with the special value
+ * -1.0 used to specify "justify" or "fill" by some users. See
+ * documentation of possible users.
+ *
+ * @param    obj The given evas object.
+ * @param      x Double (0.0..1.0 or -1.0) to use as align x hint.
+ * @param      y Double (0.0..1.0 or -1.0) to use as align y hint.
+ */
+EAPI void
+evas_object_size_hint_align_set(Evas_Object *obj, double x, double y)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me)
+     return;
+   _evas_object_size_hint_alloc(obj);
+   if ((obj->size_hints->align.x == x) && (obj->size_hints->align.y == y)) return;
+   obj->size_hints->align.x = x;
+   obj->size_hints->align.y = y;
+
+   evas_object_inform_call_changed_size_hints(obj);
+}
+
+/**
+ * Retrieves the size weight control hint.
+ *
+ * This is not a size enforcement in any way, it's just a hint that should
+ * be used whenever appropriate.
+ *
+ * Note that if any of @p x or @p y are @c NULL, the @c NULL
+ * parameters are ignored.
+ *
+ * Accepted values are zero or positive values. Some users might use
+ * this hint as a boolean, but some might consider it as a proportion,
+ * see documentation of possible users.
+ *
+ * @param    obj The given evas object.
+ * @param      x Pointer to a double in which to store the weight x.
+ * @param      y Pointer to a double in which to store the weight y.
+ */
+EAPI void
+evas_object_size_hint_weight_get(const Evas_Object *obj, double *x, double *y)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (x) *x = 0.0; if (y) *y = 0.0;
+   return;
+   MAGIC_CHECK_END();
+   if ((!obj->size_hints) || obj->delete_me)
+     {
+       if (x) *x = 0.0; if (y) *y = 0.0;
+       return;
+     }
+   if (x) *x = obj->size_hints->weight.x;
+   if (y) *y = obj->size_hints->weight.y;
+}
+
+/**
+ * Sets the size weight control hint.
+ *
+ * This is not a size enforcement in any way, it's just a hint that should
+ * be used whenever appropriate.
+ *
+ * @param    obj The given evas object.
+ * @param      x Double (0.0-1.0) to use as weight x hint.
+ * @param      y Double (0.0-1.0) to use as weight y hint.
+ */
+EAPI void
+evas_object_size_hint_weight_set(Evas_Object *obj, double x, double y)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me)
+     return;
+   _evas_object_size_hint_alloc(obj);
+   if ((obj->size_hints->weight.x == x) && (obj->size_hints->weight.y == y)) return;
+   obj->size_hints->weight.x = x;
+   obj->size_hints->weight.y = y;
+
+   evas_object_inform_call_changed_size_hints(obj);
+}
+
+/**
+ * Retrieves the size padding control hint.
+ *
+ * This is not a size enforcement in any way, it's just a hint that should
+ * be used whenever appropriate.
+ *
+ * Note that if any of @p l, @p r, @p t or @p b are @c NULL, the @c
+ * NULL parameters are ignored.
+ *
+ * @param    obj The given evas object.
+ * @param      l Pointer to an integer in which to store left padding.
+ * @param      r Pointer to an integer in which to store right padding.
+ * @param      t Pointer to an integer in which to store top padding.
+ * @param      b Pointer to an integer in which to store bottom padding.
+ */
+EAPI void
+evas_object_size_hint_padding_get(const Evas_Object *obj, Evas_Coord *l, Evas_Coord *r, Evas_Coord *t, Evas_Coord *b)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (l) *l = 0; if (r) *r = 0;
+   if (t) *t = 0; if (b) *b = 0;
+   return;
+   MAGIC_CHECK_END();
+   if ((!obj->size_hints) || obj->delete_me)
+     {
+       if (l) *l = 0; if (r) *r = 0;
+       if (t) *t = 0; if (b) *b = 0;
+       return;
+     }
+   if (l) *l = obj->size_hints->padding.l;
+   if (r) *r = obj->size_hints->padding.r;
+   if (t) *t = obj->size_hints->padding.t;
+   if (b) *b = obj->size_hints->padding.b;
+}
+
+/**
+ * Sets the size padding control hint.
+ *
+ * This is not a size enforcement in any way, it's just a hint that should
+ * be used whenever appropriate.
+ *
+ * @param    obj The given evas object.
+ * @param      l Integer to specify left padding.
+ * @param      r Integer to specify right padding.
+ * @param      t Integer to specify top padding.
+ * @param      b Integer to specify bottom padding.
+ */
+EAPI void
+evas_object_size_hint_padding_set(Evas_Object *obj, Evas_Coord l, Evas_Coord r, Evas_Coord t, Evas_Coord b)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me)
+     return;
+   _evas_object_size_hint_alloc(obj);
+   if ((obj->size_hints->padding.l == l) && (obj->size_hints->padding.r == r) && (obj->size_hints->padding.t == t) && (obj->size_hints->padding.b == b)) return;
+   obj->size_hints->padding.l = l;
+   obj->size_hints->padding.r = r;
+   obj->size_hints->padding.t = t;
+   obj->size_hints->padding.b = b;
+
+   evas_object_inform_call_changed_size_hints(obj);
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * Makes the given evas object visible.
+ * @param   obj The given evas object.
+ * @ingroup Evas_Object_Group_Basic
+ */
+EAPI void
+evas_object_show(Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return;
+   if (evas_object_intercept_call_show(obj)) return;
+   if (obj->smart.smart)
+     {
+       if (obj->smart.smart->smart_class->show)
+         obj->smart.smart->smart_class->show(obj);
+     }
+   if (obj->cur.visible)
+     {
+#ifdef CALLBACK_NOOP
+       evas_object_inform_call_show(obj);
+#endif
+       return;
+     }
+   obj->cur.visible = 1;
+   evas_object_change(obj);
+   evas_object_clip_dirty(obj);
+   if (obj->layer->evas->events_frozen <= 0)
+     {
+       evas_object_recalc_clippees(obj);
+       if (!evas_event_passes_through(obj))
+         {
+            if (!obj->smart.smart)
+              {
+                 if (evas_object_is_in_output_rect(obj,
+                                                   obj->layer->evas->pointer.x,
+                                                   obj->layer->evas->pointer.y, 1, 1))
+                   evas_event_feed_mouse_move(obj->layer->evas,
+                                              obj->layer->evas->pointer.x,
+                                              obj->layer->evas->pointer.y,
+                                              obj->layer->evas->last_timestamp,
+                                              NULL);
+              }
+         }
+     }
+   evas_object_inform_call_show(obj);
+}
+
+/**
+ * Makes the given evas object invisible.
+ * @param   obj The given evas object.
+ *
+ * @note the hidden objects will not be checked for changes and will
+ *       not catch events. That is, they are much ligher than an
+ *       object that is invisible due indirect effects, such as
+ *       clipped or out-of-viewport.
+ *
+ * @ingroup Evas_Object_Group_Basic
+ */
+EAPI void
+evas_object_hide(Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return;
+   if (evas_object_intercept_call_hide(obj)) return;
+   if (obj->smart.smart)
+     {
+       if (obj->smart.smart->smart_class->hide)
+         obj->smart.smart->smart_class->hide(obj);
+     }
+   if (!obj->cur.visible)
+     {
+#ifdef CALLBACK_NOOP
+       evas_object_inform_call_hide(obj);
+#endif
+       return;
+     }
+   obj->cur.visible = 0;
+   evas_object_change(obj);
+   evas_object_clip_dirty(obj);
+   if (obj->layer->evas->events_frozen <= 0)
+     {
+       evas_object_recalc_clippees(obj);
+       if (!evas_event_passes_through(obj))
+         {
+            if (!obj->smart.smart)
+              {
+                 if (evas_object_is_in_output_rect(obj,
+                                                   obj->layer->evas->pointer.x,
+                                                   obj->layer->evas->pointer.y, 1, 1))
+                   evas_event_feed_mouse_move(obj->layer->evas,
+                                              obj->layer->evas->pointer.x,
+                                              obj->layer->evas->pointer.y,
+                                              obj->layer->evas->last_timestamp,
+                                              NULL);
+                 if (obj->delete_me) return;
+                 if (obj->mouse_grabbed > 0)
+                   {
+//                    if (obj->layer->evas->pointer.mouse_grabbed >= obj->mouse_grabbed)
+                        obj->layer->evas->pointer.mouse_grabbed -= obj->mouse_grabbed;
+                   }
+                  if ((obj->mouse_in) || (obj->mouse_grabbed > 0))
+                    {
+                       obj->layer->evas->pointer.object.in = eina_list_remove(obj->layer->evas->pointer.object.in, obj);
+                    }
+                  obj->mouse_grabbed = 0;
+                  if (obj->layer->evas->events_frozen > 0)
+                    {
+                       obj->mouse_in = 0;
+                       return;
+                    }
+                  if (obj->mouse_in)
+                    {
+                       Evas_Event_Mouse_Out ev;
+
+                      _evas_object_event_new();
+
+                       obj->mouse_in = 0;
+                       ev.buttons = obj->layer->evas->pointer.button;
+                       ev.output.x = obj->layer->evas->pointer.x;
+                       ev.output.y = obj->layer->evas->pointer.y;
+                       ev.canvas.x = obj->layer->evas->pointer.x;
+                       ev.canvas.y = obj->layer->evas->pointer.y;
+                       ev.data = NULL;
+                       ev.modifiers = &(obj->layer->evas->modifiers);
+                       ev.locks = &(obj->layer->evas->locks);
+                      ev.timestamp = obj->layer->evas->last_timestamp;
+                      ev.event_flags = EVAS_EVENT_FLAG_NONE;
+                       evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
+                       _evas_post_event_callback_call(obj->layer->evas);
+                   }
+              }
+         }
+     }
+   else
+     {
+       if ((obj->mouse_in) || (obj->mouse_grabbed > 0))
+         obj->layer->evas->pointer.object.in = eina_list_remove(obj->layer->evas->pointer.object.in, obj);
+       obj->mouse_grabbed = 0;
+       obj->mouse_in = 0;
+     }
+   evas_object_inform_call_hide(obj);
+}
+
+/**
+ * Retrieves whether or not the given evas object is visible.
+ * @param   obj The given evas object.
+ * @return  @c 1 if the object is visible.  @c 0 otherwise.
+ * @ingroup Evas_Object_Group_Basic
+ */
+EAPI Eina_Bool
+evas_object_visible_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return 0;
+   return obj->cur.visible;
+}
+
+/**
+ * Sets the general colour of the given evas object to the given colour.
+ * @param obj The given evas object.
+ * @param r   The red component of the given colour.
+ * @param g   The green component of the given colour.
+ * @param b   The blue component of the given colour.
+ * @param a   The alpha component of the given colour.
+ * @ingroup Evas_Object_Group_Basic
+ */
+EAPI void
+evas_object_color_set(Evas_Object *obj, int r, int g, int b, int a)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return;
+   if (r > 255) r = 255; if (r < 0) r = 0;
+   if (g > 255) g = 255; if (g < 0) g = 0;
+   if (b > 255) b = 255; if (b < 0) b = 0;
+   if (a > 255) a = 255; if (a < 0) a = 0;
+   if (evas_object_intercept_call_color_set(obj, r, g, b, a)) return;
+   if (obj->smart.smart)
+     {
+       if (obj->smart.smart->smart_class->color_set)
+         obj->smart.smart->smart_class->color_set(obj, r, g, b, a);
+     }
+   if ((obj->cur.color.r == r) &&
+       (obj->cur.color.g == g) &&
+       (obj->cur.color.b == b) &&
+       (obj->cur.color.a == a)) return;
+   obj->cur.color.r = r;
+   obj->cur.color.g = g;
+   obj->cur.color.b = b;
+   evas_object_clip_dirty(obj);
+   if ((obj->cur.color.a == 0) && (a == 0)) return;
+   obj->cur.color.a = a;
+   evas_object_change(obj);
+}
+
+/**
+ * Retrieves the general colour of the given evas object.
+ *
+ * Note that if any of @p r, @p g, @p b or @p a are @c NULL, then the
+ * @c NULL parameters are ignored.
+ *
+ * @param   obj The given evas object.
+ * @param   r   Pointer to an integer in which to store the red component of
+ *              the colour.
+ * @param   g   Pointer to an integer in which to store the green component of
+ *              the colour.
+ * @param   b   Pointer to an integer in which to store the blue component of
+ *              the colour.
+ * @param   a   Pointer to an integer in which to store the alpha component of
+ *              the colour.
+ * @ingroup Evas_Object_Group_Basic
+ */
+EAPI void
+evas_object_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (r) *r = 0; if (g) *g = 0; if (b) *b = 0; if (a) *a = 0;
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me)
+     {
+       if (r) *r = 0; if (g) *g = 0; if (b) *b = 0; if (a) *a = 0;
+       return;
+     }
+   if (r) *r = obj->cur.color.r;
+   if (g) *g = obj->cur.color.g;
+   if (b) *b = obj->cur.color.b;
+   if (a) *a = obj->cur.color.a;
+}
+
+/**
+ * Sets whether or not the given evas object is to be drawn anti-aliased.
+ *
+ * @param   obj The given evas object.
+ * @param   anti_alias 1 if the object is to be anti_aliased, 0 otherwise.
+ * @ingroup Evas_Object_Group_Extras
+ */
+EAPI void
+evas_object_anti_alias_set(Evas_Object *obj, Eina_Bool anti_alias)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return;
+   if (obj->cur.anti_alias == !!anti_alias)
+     return;
+   obj->cur.anti_alias = !!anti_alias;
+   evas_object_change(obj);
+}
+
+
+/**
+ * Retrieves whether or not the given evas object is to be drawn anti_aliased.
+ * @param   obj The given evas object.
+ * @return  @c 1 if the object is to be anti_aliased.  @c 0 otherwise.
+ * @ingroup Evas_Object_Group_Extras
+ */
+EAPI Eina_Bool
+evas_object_anti_alias_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return 0;
+   return obj->cur.anti_alias;
+}
+
+/**
+ * Sets the scaling factor for an evas object. Does not affect all objects.
+ *
+ * @param   obj The given evas object.
+ * @param   scale The scaling factor. 1.0 == none.
+ * @ingroup Evas_Object_Group_Extras
+ */
+EAPI void
+evas_object_scale_set(Evas_Object *obj, double scale)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return;
+   if (obj->cur.scale == scale)
+     return;
+   obj->cur.scale = scale;
+   evas_object_change(obj);
+   if (obj->func->scale_update) obj->func->scale_update(obj);
+}
+
+
+/**
+ * Retrieves the scaling factor for the given evas object.
+ * @param   obj The given evas object.
+ * @return  The scaling factor.
+ *
+ * @ingroup Evas_Object_Group_Extras
+ */
+EAPI double
+evas_object_scale_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return 1.0;
+   return obj->cur.scale;
+}
+
+/**
+ * Sets the color_space to be used for linear interpolation of colors.
+ *
+ * @param   obj The given evas object.
+ * @param   color_space one of EVAS_COLOR_SPACE_ARGB or EVAS_COLOR_SPACE_AHSV.
+ *
+ * @ingroup Evas_Object_Group_Extras
+ */
+EAPI void
+evas_object_color_interpolation_set(Evas_Object *obj, int color_space)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return;
+   if (obj->cur.interpolation_color_space == color_space)
+       return;
+   obj->cur.interpolation_color_space = color_space;
+   evas_object_change(obj);
+}
+
+
+/**
+ * Retrieves the current value of the color space used for linear interpolation.
+ * @param   obj The given evas object.
+ * @return  @c EVAS_COLOR_SPACE_ARGB or EVAS_COLOR_SPACE_AHSV.
+ * @ingroup Evas_Object_Group_Extras
+ */
+EAPI int
+evas_object_color_interpolation_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return 0;
+   return obj->cur.interpolation_color_space;
+}
+
+/**
+ * Sets the render_op to be used for rendering the evas object.
+ * @param   obj The given evas object.
+ * @param   render_op one of the Evas_Render_Op values.
+ * @ingroup Evas_Object_Group_Extras
+ */
+EAPI void
+evas_object_render_op_set(Evas_Object *obj, Evas_Render_Op render_op)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return;
+   if ((Evas_Render_Op)obj->cur.render_op == render_op)
+       return;
+   obj->cur.render_op = render_op;
+   evas_object_change(obj);
+}
+
+
+/**
+ * Retrieves the current value of the operation used for rendering the evas object.
+ * @param   obj The given evas object.
+ * @return  one of the enumerated values in Evas_Render_Op.
+ * @ingroup Evas_Object_Group_Extras
+ */
+EAPI Evas_Render_Op
+evas_object_render_op_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return EVAS_RENDER_BLEND;
+   return obj->cur.render_op;
+}
+
+/**
+ * Retrieves the evas that the given evas object is on.
+ * @param   obj The given evas object.
+ * @return  The evas that the object is on.
+ * @ingroup Evas_Object_Group_Basic
+ */
+EAPI Evas *
+evas_object_evas_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return NULL;
+   return obj->layer->evas;
+}
+
+/**
+ * @addtogroup Evas_Object_Group_Find
+ * @{
+ */
+
+/**
+ * Retrieves the top object at the given position (x,y)
+ * @param   e The given evas object.
+ * @param   x The horizontal coordinate
+ * @param   y The vertical coordinate
+ * @param   include_pass_events_objects Boolean Flag to include or not
+ * pass events objects
+ * @param   include_hidden_objects Boolean Flag to include or not hidden objects
+ * @return  The evas object that is over all others objects at the given position.
+ */
+EAPI Evas_Object *
+evas_object_top_at_xy_get(const Evas *e, Evas_Coord x, Evas_Coord y, Eina_Bool include_pass_events_objects, Eina_Bool include_hidden_objects)
+{
+   Evas_Layer *lay;
+   int xx, yy;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   xx = x;
+   yy = y;
+////   xx = evas_coord_world_x_to_screen(e, x);
+////   yy = evas_coord_world_y_to_screen(e, y);
+   EINA_INLIST_REVERSE_FOREACH((EINA_INLIST_GET(e->layers)), lay)
+     {
+       Evas_Object *obj;
+
+       EINA_INLIST_REVERSE_FOREACH(get_layer_objects(lay), obj)
+         {
+            if (obj->delete_me) continue;
+            if ((!include_pass_events_objects) && (evas_event_passes_through(obj))) continue;
+            if ((!include_hidden_objects) && (!obj->cur.visible)) continue;
+            evas_object_clip_recalc(obj);
+            if ((evas_object_is_in_output_rect(obj, xx, yy, 1, 1)) &&
+                (!obj->clip.clipees))
+              return obj;
+         }
+     }
+   return NULL;
+}
+
+/**
+ * Retrieves the top object at mouse pointer position
+ * @param   e The given evas object.
+ * @return The evas object that is over all others objects at the
+ * pointer position.
+ */
+EAPI Evas_Object *
+evas_object_top_at_pointer_get(const Evas *e)
+{
+////   return evas_object_top_at_xy_get(e, e->pointer.canvas_x, e->pointer.canvas_y, 0, 0);
+   return evas_object_top_at_xy_get(e, e->pointer.x, e->pointer.y, 1, 1);
+}
+
+/**
+ * Retrieves the top object in the given rectangle region
+ * @param   e The given evas object.
+ * @param   x The horizontal coordinate.
+ * @param   y The vertical coordinate.
+ * @param   w The width size.
+ * @param   h The height size.
+ * @param   include_pass_events_objects Boolean Flag to include or not pass events objects
+ * @param   include_hidden_objects Boolean Flag to include or not hidden objects
+ * @return  The evas object that is over all others objects at the pointer position.
+ *
+ */
+EAPI Evas_Object *
+evas_object_top_in_rectangle_get(const Evas *e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Eina_Bool include_pass_events_objects, Eina_Bool include_hidden_objects)
+{
+   Evas_Layer *lay;
+   int xx, yy, ww, hh;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   xx = x;
+   yy = y;
+   ww = w;
+   hh = h;
+////   xx = evas_coord_world_x_to_screen(e, x);
+////   yy = evas_coord_world_y_to_screen(e, y);
+////   ww = evas_coord_world_x_to_screen(e, w);
+////   hh = evas_coord_world_y_to_screen(e, h);
+   if (ww < 1) ww = 1;
+   if (hh < 1) hh = 1;
+   EINA_INLIST_REVERSE_FOREACH((EINA_INLIST_GET(e->layers)), lay)
+     {
+       Evas_Object *obj;
+
+       EINA_INLIST_REVERSE_FOREACH(get_layer_objects(lay), obj)
+         {
+            if (obj->delete_me) continue;
+            if ((!include_pass_events_objects) && (evas_event_passes_through(obj))) continue;
+            if ((!include_hidden_objects) && (!obj->cur.visible)) continue;
+            evas_object_clip_recalc(obj);
+            if ((evas_object_is_in_output_rect(obj, xx, yy, ww, hh)) &&
+                (!obj->clip.clipees))
+              return obj;
+         }
+     }
+   return NULL;
+}
+
+/**
+ * Retrieves the objects at the given position
+ * @param   e The given evas object.
+ * @param   x The horizontal coordinate.
+ * @param   y The vertical coordinate.
+ * @param include_pass_events_objects Boolean Flag to include or not
+ * pass events objects
+ * @param   include_hidden_objects Boolean Flag to include or not hidden objects
+ * @return  The list of evas objects at the pointer position.
+ *
+ */
+EAPI Eina_List *
+evas_objects_at_xy_get(const Evas *e, Evas_Coord x, Evas_Coord y, Eina_Bool include_pass_events_objects, Eina_Bool include_hidden_objects)
+{
+   Eina_List *in = NULL;
+   Evas_Layer *lay;
+   int xx, yy;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   xx = x;
+   yy = y;
+////   xx = evas_coord_world_x_to_screen(e, x);
+////   yy = evas_coord_world_y_to_screen(e, y);
+   EINA_INLIST_REVERSE_FOREACH((EINA_INLIST_GET(e->layers)), lay)
+     {
+       Evas_Object *obj;
+
+       EINA_INLIST_REVERSE_FOREACH(get_layer_objects(lay), obj)
+         {
+            if (obj->delete_me) continue;
+            if ((!include_pass_events_objects) && (evas_event_passes_through(obj))) continue;
+            if ((!include_hidden_objects) && (!obj->cur.visible)) continue;
+            evas_object_clip_recalc(obj);
+            if ((evas_object_is_in_output_rect(obj, xx, yy, 1, 1)) &&
+                (!obj->clip.clipees))
+              in = eina_list_prepend(in, obj);
+         }
+     }
+   return in;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ */
+/**
+ * Retrieves the objects in the given rectangle region
+ * @param   e The given evas object.
+ * @param   x The horizontal coordinate.
+ * @param   y The vertical coordinate.
+ * @param   w The width size.
+ * @param   h The height size.
+ * @param   include_pass_events_objects Boolean Flag to include or not pass events objects
+ * @param   include_hidden_objects Boolean Flag to include or not hidden objects
+ * @return  The list of evas object in the rectangle region.
+ *
+ */
+EAPI Eina_List *
+evas_objects_in_rectangle_get(const Evas *e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Eina_Bool include_pass_events_objects, Eina_Bool include_hidden_objects)
+{
+   Eina_List *in = NULL;
+   Evas_Layer *lay;
+   int xx, yy, ww, hh;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   xx = x;
+   yy = y;
+   ww = w;
+   hh = h;
+////   xx = evas_coord_world_x_to_screen(e, x);
+////   yy = evas_coord_world_y_to_screen(e, y);
+////   ww = evas_coord_world_x_to_screen(e, w);
+////   hh = evas_coord_world_y_to_screen(e, h);
+   if (ww < 1) ww = 1;
+   if (hh < 1) hh = 1;
+   EINA_INLIST_REVERSE_FOREACH((EINA_INLIST_GET(e->layers)), lay)
+     {
+       Evas_Object *obj;
+
+       EINA_INLIST_REVERSE_FOREACH(get_layer_objects(lay), obj)
+         {
+            if (obj->delete_me) continue;
+            if ((!include_pass_events_objects) && (evas_event_passes_through(obj))) continue;
+            if ((!include_hidden_objects) && (!obj->cur.visible)) continue;
+            evas_object_clip_recalc(obj);
+            if ((evas_object_is_in_output_rect(obj, xx, yy, ww, hh)) &&
+                (!obj->clip.clipees))
+              in = eina_list_prepend(in, obj);
+         }
+     }
+   return in;
+}
+
+/**
+ * @}
+ */
+
+/**
+ * Retrieves the name of the type of the given evas object.
+ * @param   obj The given object.
+ * @return  The name.
+ * @ingroup Evas_Object_Group_Basic
+ */
+EAPI const char *
+evas_object_type_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (obj->delete_me) return "";
+   return obj->type;
+}
+
+/**
+ * Set whether to use a precise (usually expensive) point collision detection.
+ * @param obj The given object.
+ * @param precise wheter to use a precise point collision detection or not
+ * The default value is false.
+ * @ingroup Evas_Object_Group_Extras
+ */
+EAPI void
+evas_object_precise_is_inside_set(Evas_Object *obj, Eina_Bool precise)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   obj->precise_is_inside = precise;
+}
+
+/**
+ * Determine whether an object is set to use a precise point collision
+ * detection.
+ * @param obj The given object.
+ * @ingroup Evas_Object_Group_Extras
+ */
+EAPI Eina_Bool
+evas_object_precise_is_inside_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   return obj->precise_is_inside;
+}
diff --git a/src/lib/canvas/evas_object_polygon.c b/src/lib/canvas/evas_object_polygon.c
new file mode 100644 (file)
index 0000000..43a85f8
--- /dev/null
@@ -0,0 +1,514 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/* private magic number for polygon objects */
+static const char o_type[] = "polygon";
+
+/* private struct for line object internal data */
+typedef struct _Evas_Object_Polygon      Evas_Object_Polygon;
+typedef struct _Evas_Polygon_Point       Evas_Polygon_Point;
+
+struct _Evas_Object_Polygon
+{
+   DATA32               magic;
+   Eina_List           *points;
+
+   void                *engine_data;
+
+   struct {
+      int x, y;
+   } offset;
+
+   Evas_Coord_Rectangle        geometry;
+
+   char                 changed : 1;
+};
+
+struct _Evas_Polygon_Point
+{
+   Evas_Coord x, y;
+};
+
+/* private methods for polygon objects */
+static void evas_object_polygon_init(Evas_Object *obj);
+static void *evas_object_polygon_new(void);
+static void evas_object_polygon_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
+static void evas_object_polygon_free(Evas_Object *obj);
+static void evas_object_polygon_render_pre(Evas_Object *obj);
+static void evas_object_polygon_render_post(Evas_Object *obj);
+
+static unsigned int evas_object_polygon_id_get(Evas_Object *obj);
+static unsigned int evas_object_polygon_visual_id_get(Evas_Object *obj);
+static void *evas_object_polygon_engine_data_get(Evas_Object *obj);
+
+static int evas_object_polygon_is_opaque(Evas_Object *obj);
+static int evas_object_polygon_was_opaque(Evas_Object *obj);
+static int evas_object_polygon_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
+static int evas_object_polygon_was_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
+
+static const Evas_Object_Func object_func =
+{
+   /* methods (compulsory) */
+   evas_object_polygon_free,
+     evas_object_polygon_render,
+     evas_object_polygon_render_pre,
+     evas_object_polygon_render_post,
+     evas_object_polygon_id_get,
+     evas_object_polygon_visual_id_get,
+     evas_object_polygon_engine_data_get,
+   /* these are optional. NULL = nothing */
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     evas_object_polygon_is_opaque,
+     evas_object_polygon_was_opaque,
+     evas_object_polygon_is_inside,
+     evas_object_polygon_was_inside,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL
+};
+
+/* the actual api call to add a rect */
+/* it has no other api calls as all properties are standard */
+
+/**
+ * @addtogroup Evas_Object_Polygon
+ * @{
+ */
+
+/**
+ * Adds a new evas polygon object to the given evas.
+ * @param   e The given evas.
+ * @return  A new evas polygon object.
+ */
+EAPI Evas_Object *
+evas_object_polygon_add(Evas *e)
+{
+   Evas_Object *obj;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   obj = evas_object_new(e);
+   evas_object_polygon_init(obj);
+   evas_object_inject(obj, e);
+   return obj;
+}
+
+/**
+ * Adds the given point to the given evas polygon object.
+ * @param obj The given evas polygon object.
+ * @param x   The X coordinate of the given point.
+ * @param y   The Y coordinate of the given point.
+ * @ingroup Evas_Polygon_Group
+ */
+EAPI void
+evas_object_polygon_point_add(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
+{
+   Evas_Object_Polygon *o;
+   Evas_Polygon_Point *p;
+   Evas_Coord min_x, max_x, min_y, max_y;
+   int is, was = 0;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Polygon *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Polygon, MAGIC_OBJ_POLYGON);
+   return;
+   MAGIC_CHECK_END();
+   if (obj->layer->evas->events_frozen != 0)
+     {
+       if (!evas_event_passes_through(obj))
+         was = evas_object_is_in_output_rect(obj,
+                                             obj->layer->evas->pointer.x,
+                                             obj->layer->evas->pointer.y, 1, 1);
+     }
+
+   if (!o->points)
+     {
+       o->offset.x = obj->cur.geometry.x - obj->prev.geometry.x;
+       o->offset.y = obj->cur.geometry.y - obj->prev.geometry.y;
+     }
+   else
+     {
+       /* Update all points and take offset into account. */
+       Eina_List *over;
+
+       EINA_LIST_FOREACH(o->points, over, p)
+         {
+            p->x += o->offset.x;
+            p->y += o->offset.y;
+         }
+     }
+
+   p = malloc(sizeof(Evas_Polygon_Point));
+   if (!p) return;
+   p->x = x + o->offset.x;
+   p->y = y + o->offset.y;
+
+   if (!o->points)
+     {
+       obj->cur.geometry.x = p->x;
+       obj->cur.geometry.y = p->y;
+       obj->cur.geometry.w = 2;
+       obj->cur.geometry.h = 2;
+     }
+   else
+     {
+       if (x < obj->cur.geometry.x) min_x = x;
+       else min_x = obj->cur.geometry.x;
+       if (x > (obj->cur.geometry.x + obj->cur.geometry.w - 2)) max_x = x;
+       else max_x = obj->cur.geometry.x + obj->cur.geometry.w - 2;
+       if (y < obj->cur.geometry.y) min_y = y;
+       else min_y = obj->cur.geometry.y;
+       if (y > (obj->cur.geometry.y + obj->cur.geometry.h - 2)) max_y = y;
+       else max_y = obj->cur.geometry.y + obj->cur.geometry.h - 2;
+       obj->cur.geometry.x = min_x;
+       obj->cur.geometry.y = min_y;
+       obj->cur.geometry.w = max_x - min_x + 2;
+       obj->cur.geometry.h = max_y - min_y + 2;
+     }
+   o->points = eina_list_append(o->points, p);
+
+   o->geometry = obj->cur.geometry;
+   o->offset.x = 0;
+   o->offset.y = 0;
+
+////   obj->cur.cache.geometry.validity = 0;
+   o->changed = 1;
+   evas_object_change(obj);
+   evas_object_clip_dirty(obj);
+   evas_object_coords_recalc(obj);
+   if (obj->layer->evas->events_frozen != 0)
+     {
+       is = evas_object_is_in_output_rect(obj,
+                                          obj->layer->evas->pointer.x,
+                                          obj->layer->evas->pointer.y, 1, 1);
+       if (!evas_event_passes_through(obj))
+         {
+            if ((is ^ was) && obj->cur.visible)
+              evas_event_feed_mouse_move(obj->layer->evas,
+                                         obj->layer->evas->pointer.x,
+                                         obj->layer->evas->pointer.y,
+                                         obj->layer->evas->last_timestamp,
+                                         NULL);
+         }
+     }
+   evas_object_inform_call_move(obj);
+   evas_object_inform_call_resize(obj);
+}
+
+/**
+ * Removes all of the points from the given evas polygon object.
+ * @param   obj The given polygon object.
+ */
+EAPI void
+evas_object_polygon_points_clear(Evas_Object *obj)
+{
+   Evas_Object_Polygon *o;
+   int is, was;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Polygon *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Polygon, MAGIC_OBJ_POLYGON);
+   return;
+   MAGIC_CHECK_END();
+   was = evas_object_is_in_output_rect(obj,
+                                      obj->layer->evas->pointer.x,
+                                      obj->layer->evas->pointer.y, 1, 1);
+   while (o->points)
+     {
+       free(o->points->data);
+       o->points = eina_list_remove(o->points, o->points->data);
+     }
+   obj->cur.geometry.w = 0;
+   obj->cur.geometry.h = 0;
+////   obj->cur.cache.geometry.validity = 0;
+   o->changed = 1;
+   evas_object_change(obj);
+   evas_object_clip_dirty(obj);
+   evas_object_coords_recalc(obj);
+   is = evas_object_is_in_output_rect(obj,
+                                     obj->layer->evas->pointer.x,
+                                     obj->layer->evas->pointer.y, 1, 1);
+   if ((is || was) && obj->cur.visible)
+     evas_event_feed_mouse_move(obj->layer->evas,
+                               obj->layer->evas->pointer.x,
+                               obj->layer->evas->pointer.y,
+                               obj->layer->evas->last_timestamp,
+                               NULL);
+   evas_object_inform_call_move(obj);
+   evas_object_inform_call_resize(obj);
+}
+
+/**
+ * @}
+ */
+
+/* all nice and private */
+static void
+evas_object_polygon_init(Evas_Object *obj)
+{
+   /* alloc image ob, setup methods and default values */
+   obj->object_data = evas_object_polygon_new();
+   /* set up default settings for this kind of object */
+   obj->cur.color.r = 255;
+   obj->cur.color.g = 255;
+   obj->cur.color.b = 255;
+   obj->cur.color.a = 255;
+   obj->cur.geometry.x = 0;
+   obj->cur.geometry.y = 0;
+   obj->cur.geometry.w = 0;
+   obj->cur.geometry.h = 0;
+   obj->cur.layer = 0;
+   /* set up object-specific settings */
+   obj->prev = obj->cur;
+   /* set up methods (compulsory) */
+   obj->func = &object_func;
+   obj->type = o_type;
+}
+
+static void *
+evas_object_polygon_new(void)
+{
+   Evas_Object_Polygon *o;
+
+   /* alloc obj private data */
+   o = calloc(1, sizeof(Evas_Object_Polygon));
+   o->magic = MAGIC_OBJ_POLYGON;
+   return o;
+}
+
+static void
+evas_object_polygon_free(Evas_Object *obj)
+{
+   Evas_Object_Polygon *o;
+
+   /* frees private object data. very simple here */
+   o = (Evas_Object_Polygon *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Polygon, MAGIC_OBJ_POLYGON);
+   return;
+   MAGIC_CHECK_END();
+   /* free obj */
+   while (o->points)
+     {
+       free(o->points->data);
+       o->points = eina_list_remove(o->points, o->points->data);
+     }
+   o->engine_data = obj->layer->evas->engine.func->polygon_points_clear(obj->layer->evas->engine.data.output,
+                                                                       obj->layer->evas->engine.data.context,
+                                                                       o->engine_data);
+   o->magic = 0;
+   free(o);
+}
+
+static void
+evas_object_polygon_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
+{
+   Evas_Object_Polygon *o;
+   Eina_List *l;
+   Evas_Polygon_Point *p;
+
+   /* render object to surface with context, and offxet by x,y */
+   o = (Evas_Object_Polygon *)(obj->object_data);
+   obj->layer->evas->engine.func->context_color_set(output,
+                                                   context,
+                                                   obj->cur.cache.clip.r,
+                                                   obj->cur.cache.clip.g,
+                                                   obj->cur.cache.clip.b,
+                                                   obj->cur.cache.clip.a);
+   obj->layer->evas->engine.func->context_multiplier_unset(output,
+                                                          context);
+   obj->layer->evas->engine.func->context_render_op_set(output, context,
+                                                       obj->cur.render_op);
+   if (o->changed)
+     {
+       o->engine_data = obj->layer->evas->engine.func->polygon_points_clear(obj->layer->evas->engine.data.output,
+                                                                            obj->layer->evas->engine.data.context,
+                                                                            o->engine_data);
+       EINA_LIST_FOREACH(o->points, l, p)
+         {
+            //px = evas_coord_world_x_to_screen(obj->layer->evas, p->x);
+            //py = evas_coord_world_y_to_screen(obj->layer->evas, p->y);
+            o->engine_data = obj->layer->evas->engine.func->polygon_point_add(obj->layer->evas->engine.data.output,
+                                                                              obj->layer->evas->engine.data.context,
+                                                                              o->engine_data,
+                                                                              p->x, p->y);
+         }
+     }
+
+   if (o->engine_data)
+     obj->layer->evas->engine.func->polygon_draw(output,
+                                                context,
+                                                surface,
+                                                o->engine_data,
+                                                o->offset.x + x, o->offset.y + y);
+}
+
+static void
+evas_object_polygon_render_pre(Evas_Object *obj)
+{
+   Evas_Object_Polygon *o;
+   int is_v, was_v;
+
+   /* dont pre-render the obj twice! */
+   if (obj->pre_render_done) return;
+   obj->pre_render_done = 1;
+   /* pre-render phase. this does anything an object needs to do just before */
+   /* rendering. this could mean loading the image data, retrieving it from */
+   /* elsewhere, decoding video etc. */
+   /* then when this is done the object needs to figure if it changed and */
+   /* if so what and where and add the appropriate redraw lines */
+   o = (Evas_Object_Polygon *)(obj->object_data);
+   /* if someone is clipping this obj - go calculate the clipper */
+   if (obj->cur.clipper)
+     {
+       if (obj->cur.cache.clip.dirty)
+         evas_object_clip_recalc(obj->cur.clipper);
+       obj->cur.clipper->func->render_pre(obj->cur.clipper);
+     }
+   /* now figure what changed and add draw rects */
+   /* if it just became visible or invisible */
+   is_v = evas_object_is_visible(obj);
+   was_v = evas_object_was_visible(obj);
+   if (is_v != was_v)
+     {
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+       goto done;
+     }
+   if ((obj->cur.map != obj->prev.map) ||
+       (obj->cur.usemap != obj->prev.usemap))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+        goto done;
+     }
+   /* it's not visible - we accounted for it appearing or not so just abort */
+   if (!is_v) goto done;
+   /* clipper changed this is in addition to anything else for obj */
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
+   /* if we restacked (layer or just within a layer) */
+   if (obj->restack)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed render op */
+   if (obj->cur.render_op != obj->prev.render_op)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed color */
+   if ((obj->cur.color.r != obj->prev.color.r) ||
+       (obj->cur.color.g != obj->prev.color.g) ||
+       (obj->cur.color.b != obj->prev.color.b) ||
+       (obj->cur.color.a != obj->prev.color.a))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed geometry - and obviously not visibility or color */
+   /* caluclate differences since we have a constant color fill */
+   /* we really only need to update the differences */
+   if ((obj->cur.geometry.x != obj->prev.geometry.x) ||
+       (obj->cur.geometry.y != obj->prev.geometry.y) ||
+       (obj->cur.geometry.w != obj->prev.geometry.w) ||
+       (obj->cur.geometry.h != obj->prev.geometry.h) ||
+       (o->changed))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   done:
+   if ((obj->cur.geometry.x != obj->prev.geometry.x) ||
+       (obj->cur.geometry.y != obj->prev.geometry.y))
+     {
+       o->offset.x += obj->cur.geometry.x - obj->prev.geometry.x;
+       o->offset.y += obj->cur.geometry.y - obj->prev.geometry.y;
+     }
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+}
+
+static void
+evas_object_polygon_render_post(Evas_Object *obj)
+{
+   Evas_Object_Polygon *o;
+
+   /* this moves the current data to the previous state parts of the object */
+   /* in whatever way is safest for the object. also if we don't need object */
+   /* data anymore we can free it if the object deems this is a good idea */
+   o = (Evas_Object_Polygon *)(obj->object_data);
+   /* remove those pesky changes */
+   evas_object_clip_changes_clean(obj);
+   /* move cur to prev safely for object data */
+   obj->prev = obj->cur;
+   o->changed = 0;
+}
+
+static unsigned int evas_object_polygon_id_get(Evas_Object *obj)
+{
+   Evas_Object_Polygon *o;
+
+   o = (Evas_Object_Polygon *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_POLYGON;
+}
+
+static unsigned int evas_object_polygon_visual_id_get(Evas_Object *obj)
+{
+   Evas_Object_Polygon *o;
+
+   o = (Evas_Object_Polygon *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_SHAPE;
+}
+
+static void *evas_object_polygon_engine_data_get(Evas_Object *obj)
+{
+   Evas_Object_Polygon *o;
+
+   o = (Evas_Object_Polygon *)(obj->object_data);
+   if (!o) return NULL;
+   return o->engine_data;
+}
+
+static int
+evas_object_polygon_is_opaque(Evas_Object *obj)
+{
+   /* this returns 1 if the internal object data implies that the object is */
+   /* currently fully opaque over the entire line it occupies */
+   return 0;
+}
+
+static int
+evas_object_polygon_was_opaque(Evas_Object *obj)
+{
+   /* this returns 1 if the internal object data implies that the object was */
+   /* previously fully opaque over the entire line it occupies */
+   return 0;
+}
+
+static int
+evas_object_polygon_is_inside(Evas_Object *obj, Evas_Coord x __UNUSED__, Evas_Coord y __UNUSED__)
+{
+   /* this returns 1 if the canvas co-ordinates are inside the object based */
+   /* on object private data. not much use for rects, but for polys, images */
+   /* and other complex objects it might be */
+   return 1;
+}
+
+static int
+evas_object_polygon_was_inside(Evas_Object *obj, Evas_Coord x __UNUSED__, Evas_Coord y __UNUSED__)
+{
+   /* this returns 1 if the canvas co-ordinates were inside the object based */
+   /* on object private data. not much use for rects, but for polys, images */
+   /* and other complex objects it might be */
+   return 1;
+}
diff --git a/src/lib/canvas/evas_object_rectangle.c b/src/lib/canvas/evas_object_rectangle.c
new file mode 100644 (file)
index 0000000..16893bd
--- /dev/null
@@ -0,0 +1,394 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/* private magic number for rectangle objects */
+static const char o_type[] = "rectangle";
+
+/* private struct for rectangle object internal data */
+typedef struct _Evas_Object_Rectangle      Evas_Object_Rectangle;
+
+struct _Evas_Object_Rectangle
+{
+   DATA32            magic;
+   void             *engine_data;
+};
+
+/* private methods for rectangle objects */
+static void evas_object_rectangle_init(Evas_Object *obj);
+static void *evas_object_rectangle_new(void);
+static void evas_object_rectangle_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
+static void evas_object_rectangle_free(Evas_Object *obj);
+static void evas_object_rectangle_render_pre(Evas_Object *obj);
+static void evas_object_rectangle_render_post(Evas_Object *obj);
+
+static unsigned int evas_object_rectangle_id_get(Evas_Object *obj);
+static unsigned int evas_object_rectangle_visual_id_get(Evas_Object *obj);
+static void *evas_object_rectangle_engine_data_get(Evas_Object *obj);
+
+static int evas_object_rectangle_is_opaque(Evas_Object *obj);
+static int evas_object_rectangle_was_opaque(Evas_Object *obj);
+
+#if 0 /* usless calls for a rect object. much more useful for images etc. */
+static void evas_object_rectangle_store(Evas_Object *obj);
+static void evas_object_rectangle_unstore(Evas_Object *obj);
+static int evas_object_rectangle_is_visible(Evas_Object *obj);
+static int evas_object_rectangle_was_visible(Evas_Object *obj);
+static int evas_object_rectangle_is_inside(Evas_Object *obj, double x, double y);
+static int evas_object_rectangle_was_inside(Evas_Object *obj, double x, double y);
+#endif
+
+static const Evas_Object_Func object_func =
+{
+   /* methods (compulsory) */
+   evas_object_rectangle_free,
+     evas_object_rectangle_render,
+     evas_object_rectangle_render_pre,
+     evas_object_rectangle_render_post,
+     evas_object_rectangle_id_get,
+     evas_object_rectangle_visual_id_get,
+     evas_object_rectangle_engine_data_get,
+   /* these are optional. NULL = nothing */
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     evas_object_rectangle_is_opaque,
+     evas_object_rectangle_was_opaque,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL
+};
+
+/* the actual api call to add a rect */
+/* it has no other api calls as all properties are standard */
+
+
+/**
+ * @addtogroup Evas_Object_Rectangle
+ * @{
+ */
+
+/**
+ * Adds a rectangle to the given evas.
+ * @param   e The given evas.
+ * @return  The new rectangle object.
+ */
+EAPI Evas_Object *
+evas_object_rectangle_add(Evas *e)
+{
+   Evas_Object *obj;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   obj = evas_object_new(e);
+   evas_object_rectangle_init(obj);
+   evas_object_inject(obj, e);
+   return obj;
+}
+
+/**
+ * @}
+ */
+
+/* all nice and private */
+static void
+evas_object_rectangle_init(Evas_Object *obj)
+{
+   /* alloc image ob, setup methods and default values */
+   obj->object_data = evas_object_rectangle_new();
+   /* set up default settings for this kind of object */
+   obj->cur.color.r = 255;
+   obj->cur.color.g = 255;
+   obj->cur.color.b = 255;
+   obj->cur.color.a = 255;
+   obj->cur.geometry.x = 0;
+   obj->cur.geometry.y = 0;
+   obj->cur.geometry.w = 0;
+   obj->cur.geometry.h = 0;
+   obj->cur.layer = 0;
+   obj->cur.render_op = EVAS_RENDER_BLEND;
+   /* set up object-specific settings */
+   obj->prev = obj->cur;
+   /* set up methods (compulsory) */
+   obj->func = &object_func;
+   obj->type = o_type;
+}
+
+static void *
+evas_object_rectangle_new(void)
+{
+   Evas_Object_Rectangle *o;
+
+   /* alloc obj private data */
+   o = calloc(1, sizeof(Evas_Object_Rectangle));
+   o->magic = MAGIC_OBJ_RECTANGLE;
+   return o;
+}
+
+static void
+evas_object_rectangle_free(Evas_Object *obj)
+{
+   Evas_Object_Rectangle *o;
+
+   /* frees private object data. very simple here */
+   o = (Evas_Object_Rectangle *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Rectangle, MAGIC_OBJ_RECTANGLE);
+   return;
+   MAGIC_CHECK_END();
+   /* free obj */
+   o->magic = 0;
+   free(o);
+}
+
+static void
+evas_object_rectangle_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
+{
+   /* render object to surface with context, and offxet by x,y */
+   obj->layer->evas->engine.func->context_color_set(output,
+                                                   context,
+                                                   obj->cur.cache.clip.r,
+                                                   obj->cur.cache.clip.g,
+                                                   obj->cur.cache.clip.b,
+                                                   obj->cur.cache.clip.a);
+   obj->layer->evas->engine.func->context_multiplier_unset(output,
+                                                          context);
+   obj->layer->evas->engine.func->context_render_op_set(output, context,
+                                                       obj->cur.render_op);
+   obj->layer->evas->engine.func->rectangle_draw(output,
+                                                context,
+                                                surface,
+                                                obj->cur.geometry.x + x,
+                                                obj->cur.geometry.y + y,
+                                                obj->cur.geometry.w,
+                                                obj->cur.geometry.h);
+////                                            obj->cur.cache.geometry.x + x,
+////                                            obj->cur.cache.geometry.y + y,
+////                                            obj->cur.cache.geometry.w,
+////                                            obj->cur.cache.geometry.h);
+}
+
+static void
+evas_object_rectangle_render_pre(Evas_Object *obj)
+{
+   int is_v, was_v;
+
+   /* dont pre-render the obj twice! */
+   if (obj->pre_render_done) return;
+   obj->pre_render_done = 1;
+   /* pre-render phase. this does anything an object needs to do just before */
+   /* rendering. this could mean loading the image data, retrieving it from */
+   /* elsewhere, decoding video etc. */
+   /* then when this is done the object needs to figure if it changed and */
+   /* if so what and where and add the appropriate redraw rectangles */
+   /* if someone is clipping this obj - go calculate the clipper */
+   if (obj->cur.clipper)
+     {
+       if (obj->cur.cache.clip.dirty)
+         evas_object_clip_recalc(obj->cur.clipper);
+       obj->cur.clipper->func->render_pre(obj->cur.clipper);
+     }
+   /* now figure what changed and add draw rects */
+   /* if it just became visible or invisible */
+   is_v = evas_object_is_visible(obj);
+   was_v = evas_object_was_visible(obj);
+   if (is_v != was_v)
+     {
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+       goto done;
+     }
+   if ((obj->cur.map != obj->prev.map) ||
+       (obj->cur.usemap != obj->prev.usemap))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+        goto done;
+     }
+   /* it's not visible - we accounted for it appearing or not so just abort */
+   if (!is_v) goto done;
+   /* clipper changed this is in addition to anything else for obj */
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
+   /* if we restacked (layer or just within a layer) and don't clip anyone */
+   if ((obj->restack) && (!obj->clip.clipees))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed render op */
+   if (obj->cur.render_op != obj->prev.render_op)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed color */
+   if ((obj->cur.color.r != obj->prev.color.r) ||
+       (obj->cur.color.g != obj->prev.color.g) ||
+       (obj->cur.color.b != obj->prev.color.b) ||
+       (obj->cur.color.a != obj->prev.color.a))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed geometry - and obviously not visibility or color */
+   /* caluclate differences since we have a constant color fill */
+   /* we really only need to update the differences */
+   if ((obj->cur.geometry.x != obj->prev.geometry.x) ||
+       (obj->cur.geometry.y != obj->prev.geometry.y) ||
+       (obj->cur.geometry.w != obj->prev.geometry.w) ||
+       (obj->cur.geometry.h != obj->prev.geometry.h))
+     {
+       evas_rects_return_difference_rects(&obj->layer->evas->clip_changes,
+                                          obj->cur.geometry.x,
+                                          obj->cur.geometry.y,
+                                          obj->cur.geometry.w,
+                                          obj->cur.geometry.h,
+                                          obj->prev.geometry.x,
+                                          obj->prev.geometry.y,
+                                          obj->prev.geometry.w,
+                                          obj->prev.geometry.h);
+////   rl = evas_rects_return_difference_rects(obj->cur.cache.geometry.x,
+////                                           obj->cur.cache.geometry.y,
+////                                           obj->cur.cache.geometry.w,
+////                                           obj->cur.cache.geometry.h,
+////                                           obj->prev.cache.geometry.x,
+////                                           obj->prev.cache.geometry.y,
+////                                           obj->prev.cache.geometry.w,
+////                                           obj->prev.cache.geometry.h);
+       goto done;
+     }
+   /* it obviously didn't change - add a NO obscure - this "unupdates"  this */
+   /* area so if there were updates for it they get wiped. don't do it if we */
+   /* arent fully opaque and we are visible */
+ /*
+   if (evas_object_is_visible(obj) &&
+       evas_object_is_opaque(obj) &&
+       (!obj->clip.clipees))
+     obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output,
+                                                           obj->cur.cache.clip.x,
+                                                           obj->cur.cache.clip.y,
+                                                           obj->cur.cache.clip.w,
+                                                           obj->cur.cache.clip.h);
+  */
+   done:
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+}
+
+static void
+evas_object_rectangle_render_post(Evas_Object *obj)
+{
+
+   /* this moves the current data to the previous state parts of the object */
+   /* in whatever way is safest for the object. also if we don't need object */
+   /* data anymore we can free it if the object deems this is a good idea */
+   /* remove those pesky changes */
+   evas_object_clip_changes_clean(obj);
+   /* move cur to prev safely for object data */
+   obj->prev = obj->cur;
+}
+
+static int
+evas_object_rectangle_is_opaque(Evas_Object *obj)
+{
+   /* this returns 1 if the internal object data implies that the object is */
+   /* currently fully opaque over the entire rectangle it occupies */
+   if ((obj->cur.map) && (obj->cur.usemap)) return 0;
+   if (obj->cur.render_op == EVAS_RENDER_COPY)
+       return 1;
+   if (obj->cur.render_op != EVAS_RENDER_BLEND)
+       return 0;
+   return 1;
+}
+
+static int
+evas_object_rectangle_was_opaque(Evas_Object *obj)
+{
+   /* this returns 1 if the internal object data implies that the object was */
+   /* previously fully opaque over the entire rectangle it occupies */
+   if (obj->prev.render_op == EVAS_RENDER_COPY)
+       return 1;
+   if (obj->prev.render_op != EVAS_RENDER_BLEND)
+       return 0;
+   return 1;
+}
+
+static unsigned int evas_object_rectangle_id_get(Evas_Object *obj)
+{
+   Evas_Object_Rectangle *o;
+
+   o = (Evas_Object_Rectangle *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_RECTANGLE;
+}
+
+static unsigned int evas_object_rectangle_visual_id_get(Evas_Object *obj)
+{
+   Evas_Object_Rectangle *o;
+
+   o = (Evas_Object_Rectangle *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_SHAPE;
+}
+
+static void *evas_object_rectangle_engine_data_get(Evas_Object *obj)
+{
+   Evas_Object_Rectangle *o;
+
+   o = (Evas_Object_Rectangle *)(obj->object_data);
+   if (!o) return NULL;
+   return o->engine_data;
+}
+
+
+#if 0 /* usless calls for a rect object. much more useful for images etc. */
+static void
+evas_object_rectangle_store(Evas_Object *obj)
+{
+   /* store... nothing for rectangle objects... it's a bit silly */
+   /* but for others that may have expensive caluclations to do to */
+   /* generate the object data, hint that they might want to be pre-calced */
+   /* once and stored */
+}
+
+static void
+evas_object_rectangle_unstore(Evas_Object *obj)
+{
+   /* store... nothing for rectangle objects... it's a bit silly */
+}
+
+static int
+evas_object_rectangle_is_visible(Evas_Object *obj)
+{
+   /* this returns 1 if the internal object data would imply that it is */
+   /* visible (ie drawing it draws something. this is not to do with events */
+   return 1;
+}
+
+static int
+evas_object_rectangle_was_visible(Evas_Object *obj)
+{
+   /* this returns 1 if the internal object data would imply that it was */
+   /* visible (ie drawing it draws something. this is not to do with events */
+   return 1;
+}
+
+static int
+evas_object_rectangle_is_inside(Evas_Object *obj, double x, double y)
+{
+   /* this returns 1 if the canvas co-ordinates are inside the object based */
+   /* on object private data. not much use for rects, but for polys, images */
+   /* and other complex objects it might be */
+   return 1;
+}
+
+static int
+evas_object_rectangle_was_inside(Evas_Object *obj, double x, double y)
+{
+   /* this returns 1 if the canvas co-ordinates were inside the object based */
+   /* on object private data. not much use for rects, but for polys, images */
+   /* and other complex objects it might be */
+   return 1;
+}
+#endif
diff --git a/src/lib/canvas/evas_object_smart.c b/src/lib/canvas/evas_object_smart.c
new file mode 100644 (file)
index 0000000..f695394
--- /dev/null
@@ -0,0 +1,1085 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+typedef struct _Evas_Object_Smart      Evas_Object_Smart;
+typedef struct _Evas_Smart_Callback    Evas_Smart_Callback;
+
+struct _Evas_Object_Smart
+{
+   DATA32            magic;
+   void             *engine_data;
+   void             *data;
+   Eina_List        *callbacks;
+   Eina_Inlist *contained;
+   Evas_Smart_Cb_Description_Array callbacks_descriptions;
+   int               walking_list;
+   Eina_Bool         deletions_waiting : 1;
+   Eina_Bool         need_recalculate : 1;
+};
+
+struct _Evas_Smart_Callback
+{
+   const char *event;
+   void (*func) (void *data, Evas_Object *obj, void *event_info);
+   void *func_data;
+   char  delete_me : 1;
+};
+
+/* private methods for smart objects */
+static void evas_object_smart_callbacks_clear(Evas_Object *obj);
+static void evas_object_smart_init(Evas_Object *obj);
+static void *evas_object_smart_new(void);
+static void evas_object_smart_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
+static void evas_object_smart_free(Evas_Object *obj);
+static void evas_object_smart_render_pre(Evas_Object *obj);
+static void evas_object_smart_render_post(Evas_Object *obj);
+
+static unsigned int evas_object_smart_id_get(Evas_Object *obj);
+static unsigned int evas_object_smart_visual_id_get(Evas_Object *obj);
+static void *evas_object_smart_engine_data_get(Evas_Object *obj);
+
+static const Evas_Object_Func object_func =
+{
+   /* methods (compulsory) */
+   evas_object_smart_free,
+     evas_object_smart_render,
+     evas_object_smart_render_pre,
+     evas_object_smart_render_post,
+     evas_object_smart_id_get,
+     evas_object_smart_visual_id_get,
+     evas_object_smart_engine_data_get,
+     /* these are optional. NULL = nothing */
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL
+};
+
+/* public funcs */
+/**
+ * Store a pointer to user data for a smart object.
+ *
+ * @param obj The smart object
+ * @param data A pointer to user data
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI void
+evas_object_smart_data_set(Evas_Object *obj, void *data)
+{
+   Evas_Object_Smart *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Smart *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   return;
+   MAGIC_CHECK_END();
+   o->data = data;
+}
+
+/**
+ * Retrieve user data stored on a smart object.
+ *
+ * @param obj The smart object
+ * @return A pointer to data stored using evas_object_smart_data_set(), or
+ *         NULL if none has been set.
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI void *
+evas_object_smart_data_get(const Evas_Object *obj)
+{
+   Evas_Object_Smart *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Smart *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   return NULL;
+   MAGIC_CHECK_END();
+   return o->data;
+}
+
+/**
+ * Get the Evas_Smart from which @p obj was created.
+ *
+ * @param obj a smart object
+ * @return the Evas_Smart
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI Evas_Smart *
+evas_object_smart_smart_get(const Evas_Object *obj)
+{
+   Evas_Object_Smart *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Smart *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   return NULL;
+   MAGIC_CHECK_END();
+   return obj->smart.smart;
+}
+
+/**
+ * Set an evas object as a member of a smart object.
+ *
+ * @param obj The member object
+ * @param smart_obj The smart object
+ *
+ * Members will automatically be stacked and layered with the smart object.
+ * The various stacking function will operate on members relative to the
+ * other members instead of the entire canvas.
+ *
+ * Non-member objects can not interleave a smart object's members.
+ *
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI void
+evas_object_smart_member_add(Evas_Object *obj, Evas_Object *smart_obj)
+{
+   Evas_Object_Smart *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   MAGIC_CHECK(smart_obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Smart *)(smart_obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   return;
+   MAGIC_CHECK_END();
+
+   if (obj->delete_me)
+     {
+        CRIT("Adding deleted object %p to smart obj %p", obj, smart_obj);
+       abort();
+       return;
+     }
+   if (smart_obj->delete_me)
+     {
+       CRIT("Adding object %p to deleted smart obj %p", obj, smart_obj);
+       abort();
+       return;
+     }
+   if (!smart_obj->layer)
+     {
+       CRIT("No evas surface associated with smart object (%p)", smart_obj);
+       abort();
+       return;
+     }
+   if (obj->layer && smart_obj->layer
+       && obj->layer->evas != smart_obj->layer->evas)
+     {
+       CRIT("Adding object %p from Evas (%p) from another Evas (%p)", obj, obj->layer->evas, smart_obj->layer->evas);
+       abort();
+       return;
+     }
+
+   if (obj->smart.parent == smart_obj) return;
+
+   if (obj->smart.parent) evas_object_smart_member_del(obj);
+
+   evas_object_release(obj, 1);
+   obj->layer = smart_obj->layer;
+   obj->cur.layer = obj->layer->layer;
+   obj->layer->usage++;
+   obj->smart.parent = smart_obj;
+   o->contained = eina_inlist_append(o->contained, EINA_INLIST_GET(obj));
+   evas_object_smart_member_cache_invalidate(obj);
+   obj->restack = 1;
+   evas_object_change(obj);
+   if (smart_obj->smart.smart->smart_class->member_add)
+     smart_obj->smart.smart->smart_class->member_add(smart_obj, obj);
+}
+
+/**
+ * Removes a member object from a smart object.
+ *
+ * @param obj the member object
+ * @ingroup Evas_Smart_Object_Group
+ *
+ * This removes a member object from a smart object. The object will still
+ * be on the canvas, but no longer associated with whichever smart object
+ * it was associated with.
+ *
+ */
+EAPI void
+evas_object_smart_member_del(Evas_Object *obj)
+{
+   Evas_Object_Smart *o;
+   Evas_Object *smart_obj;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+
+   if (!obj->smart.parent) return;
+
+   smart_obj = obj->smart.parent;
+   if (smart_obj->smart.smart->smart_class->member_del)
+     smart_obj->smart.smart->smart_class->member_del(smart_obj, obj);
+
+   o = (Evas_Object_Smart *)(obj->smart.parent->object_data);
+   o->contained = eina_inlist_remove(o->contained, EINA_INLIST_GET(obj));
+   obj->smart.parent = NULL;
+   evas_object_smart_member_cache_invalidate(obj);
+   obj->layer->usage--;
+   obj->cur.layer = obj->layer->layer;
+   evas_object_inject(obj, obj->layer->evas);
+   obj->restack = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * Gets the smart parent of an Evas_Object
+ * @param obj the Evas_Object you want to get the parent
+ * @return Returns the smart parent of @a obj, or NULL if @a obj is not a smart member of another Evas_Object
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI Evas_Object *
+evas_object_smart_parent_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+
+   return obj->smart.parent;
+}
+
+/**
+ * Checks the Smart type of the object and its parents
+ * @param obj the Evas_Object to check the type of
+ * @param type the type to check for
+ * @return EINA_TRUE if @a obj or any of its parents if of type @a type, EINA_FALSE otherwise
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI Eina_Bool
+evas_object_smart_type_check(const Evas_Object *obj, const char *type)
+{
+   const Evas_Smart_Class *sc;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return EINA_FALSE;
+   MAGIC_CHECK_END();
+
+   if (!obj->smart.smart)
+     return EINA_FALSE;
+   sc = obj->smart.smart->smart_class;
+   while (sc)
+     {
+       if (!strcmp(sc->name, type))
+         return EINA_TRUE;
+       sc = sc->parent;
+     }
+
+   return EINA_FALSE;
+}
+
+/**
+ * Checks the Smart type of the object and its parents using pointer comparison
+ * @param obj the Evas_Object to check the type of
+ * @param type the type to check for. Must be the name pointer in the smart class used to create the object
+ * @return EINA_TRUE if @a obj or any of its parents if of type @a type, EINA_FALSE otherwise
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI Eina_Bool
+evas_object_smart_type_check_ptr(const Evas_Object *obj, const char *type)
+{
+   const Evas_Smart_Class *sc;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return EINA_FALSE;
+   MAGIC_CHECK_END();
+
+   if (!obj->smart.smart)
+     return EINA_FALSE;
+   sc = obj->smart.smart->smart_class;
+   while (sc)
+     {
+       if (sc->name == type)
+         return EINA_TRUE;
+       sc = sc->parent;
+     }
+
+   return EINA_FALSE;
+}
+
+/**
+ * Gets the list of the member objects of an Evas_Object
+ * @param obj the Evas_Object you want to get the list of member objects
+ * @return Returns the list of the member objects of @a obj.
+ * The returned list should be freed with eina_list_free() when you no longer need it
+ */
+EAPI Eina_List *
+evas_object_smart_members_get(const Evas_Object *obj)
+{
+   Evas_Object_Smart *o;
+   Eina_List *members;
+   Eina_Inlist *member;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Smart *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   return NULL;
+   MAGIC_CHECK_END();
+
+   members = NULL;
+   for (member = o->contained; member; member = member->next)
+      members = eina_list_append(members, member);
+
+   return members;
+}
+
+const Eina_Inlist *
+evas_object_smart_members_get_direct(const Evas_Object *obj)
+{
+   Evas_Object_Smart *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Smart *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   return NULL;
+   MAGIC_CHECK_END();
+   return o->contained;
+}
+
+/**
+ * Instantiates a new smart object described by @p s.
+ *
+ * @param e the evas on which to add the object
+ * @param s the Evas_Smart describing the smart object
+ * @return a new Evas_Object
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI Evas_Object *
+evas_object_smart_add(Evas *e, Evas_Smart *s)
+{
+   Evas_Object *obj;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   MAGIC_CHECK(s, Evas_Smart, MAGIC_SMART);
+   return NULL;
+   MAGIC_CHECK_END();
+
+   obj = evas_object_new(e);
+   if (!obj) return NULL;
+   obj->smart.smart = s;
+   obj->type = s->smart_class->name;
+   evas_object_smart_init(obj);
+   evas_object_inject(obj, e);
+
+   evas_object_smart_use(s);
+
+   if (s->smart_class->add) s->smart_class->add(obj);
+
+   return obj;
+}
+
+/**
+ * Add a callback for the smart event specified by @p event.
+ *
+ * @param obj a smart object
+ * @param event the event name
+ * @param func the callback function
+ * @param data user data to be passed to the callback function
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI void
+evas_object_smart_callback_add(Evas_Object *obj, const char *event, void (*func) (void *data, Evas_Object *obj, void *event_info), const void *data)
+{
+   Evas_Object_Smart *o;
+   Evas_Smart_Callback *cb;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Smart *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   return;
+   MAGIC_CHECK_END();
+   if (!event) return;
+   if (!func) return;
+   cb = calloc(1, sizeof(Evas_Smart_Callback));
+   cb->event = eina_stringshare_add(event);
+   cb->func = func;
+   cb->func_data = (void *)data;
+   o->callbacks = eina_list_prepend(o->callbacks, cb);
+}
+
+/**
+ * Remove a smart callback
+ *
+ * Removes a callback that was added by evas_object_smart_callback_add()
+ *
+ * @param obj a smart object
+ * @param event the event name
+ * @param func the callback function
+ * @return the data pointer
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI void *
+evas_object_smart_callback_del(Evas_Object *obj, const char *event, void (*func) (void *data, Evas_Object *obj, void *event_info))
+{
+   Evas_Object_Smart *o;
+   Eina_List *l;
+   Evas_Smart_Callback *cb;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Smart *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!event) return NULL;
+   EINA_LIST_FOREACH(o->callbacks, l, cb)
+     {
+       if ((!strcmp(cb->event, event)) && (cb->func == func))
+         {
+            void *data;
+
+            data = cb->func_data;
+            cb->delete_me = 1;
+            o->deletions_waiting = 1;
+            evas_object_smart_callbacks_clear(obj);
+            return data;
+         }
+     }
+   return NULL;
+}
+
+/**
+ * Call any smart callbacks on @p obj for @p event.
+ *
+ * @param obj the smart object
+ * @param event the event name
+ * @param event_info an event specific struct of info to pass to the callback
+ *
+ * This should be called internally in the smart object when some specific
+ * event has occured. The documentation for the smart object should include
+ * a list of possible events and what type of @p event_info to expect.
+ *
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI void
+evas_object_smart_callback_call(Evas_Object *obj, const char *event, void *event_info)
+{
+   Evas_Object_Smart *o;
+   Eina_List *l;
+   Evas_Smart_Callback *cb;
+   const char *strshare;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Smart *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   return;
+   MAGIC_CHECK_END();
+   if (!event) return;
+   if (obj->delete_me) return;
+   o->walking_list++;
+   strshare = eina_stringshare_add(event);
+   EINA_LIST_FOREACH(o->callbacks, l, cb)
+     {
+       if (!cb->delete_me)
+         {
+            if (cb->event == strshare)
+              cb->func(cb->func_data, obj, event_info);
+         }
+       if (obj->delete_me)
+         break;
+     }
+   eina_stringshare_del(strshare);
+   o->walking_list--;
+   evas_object_smart_callbacks_clear(obj);
+}
+
+/**
+ * Set smart object instance callbacks descriptions.
+ *
+ * These descriptions are hints to be used by introspection and are
+ * not enforced in any way.
+ *
+ * It will not be checked if instance callbacks descriptions have the
+ * same name as another in class. Both are kept in different arrays
+ * and users of evas_object_smart_callbacks_descriptions_get() should
+ * handle this case as they wish.
+ *
+ * @param obj The smart object
+ * @param descriptions NULL terminated (name != NULL) array with
+ *        descriptions.  Array elements will not be modified, but
+ *        reference to them and their contents will be made, so this
+ *        array should be kept alive during object lifetime.
+ * @return 1 on success, 0 on failure.
+ * @ingroup Evas_Smart_Object_Group
+ *
+ * @note while instance callbacks descriptions are possible, they are
+ *       not recommended. Use class callbacks descriptions instead as they
+ *       make user's life simpler and will use less memory as descriptions
+ *       and arrays will be shared among all instances.
+ */
+EAPI Eina_Bool
+evas_object_smart_callbacks_descriptions_set(Evas_Object *obj, const Evas_Smart_Cb_Description *descriptions)
+{
+   const Evas_Smart_Cb_Description *d;
+   Evas_Object_Smart *o;
+   unsigned int i, count = 0;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Smart *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   return 0;
+   MAGIC_CHECK_END();
+
+   if ((!descriptions) || (!descriptions->name))
+     {
+       evas_smart_cb_descriptions_resize(&o->callbacks_descriptions, 0);
+       return 1;
+     }
+
+   for (count = 0, d = descriptions; d->name != NULL; d++)
+     count++;
+
+   evas_smart_cb_descriptions_resize(&o->callbacks_descriptions, count);
+   if (count == 0) return 1;
+
+   for (i = 0, d = descriptions; i < count; d++, i++)
+     o->callbacks_descriptions.array[i] = d;
+
+   evas_smart_cb_descriptions_fix(&o->callbacks_descriptions);
+
+   return 1;
+}
+
+/**
+ * Get the callbacks descriptions known by this smart object.
+ *
+ * This call retrieves processed callbacks descriptions for both
+ * instance and class. These arrays are sorted by description's name
+ * and are @c NULL terminated, so both @a class_count and
+ * @a instance_count can be ignored, the terminator @c NULL is not
+ * counted in these values.
+ *
+ * @param obj the smart object.
+ * @param class_descriptions where to store class callbacks
+ *        descriptions array, if any is known. If no descriptions are
+ *        known, @c NULL is returned. This parameter may be @c NULL if
+ *        it is not of interest.
+ * @param class_count returns how many class callbacks descriptions
+ *        are known.
+ * @param instance_descriptions where to store instance callbacks
+ *        descriptions array, if any is known. If no descriptions are
+ *        known, @c NULL is returned. This parameter may be @c NULL if
+ *        it is not of interest.
+ * @param instance_count returns how many instance callbacks
+ *        descriptions are known.
+ *
+ * @note if just class descriptions are of interest, try
+ *       evas_smart_callbacks_descriptions_get() instead.
+ *
+ * @see evas_smart_callbacks_descriptions_get()
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI void
+evas_object_smart_callbacks_descriptions_get(const Evas_Object *obj, const Evas_Smart_Cb_Description ***class_descriptions, unsigned int *class_count, const Evas_Smart_Cb_Description ***instance_descriptions, unsigned int *instance_count)
+{
+   Evas_Object_Smart *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (class_descriptions) *class_descriptions = NULL;
+   if (class_count) *class_count = 0;
+   if (instance_descriptions) *instance_descriptions = NULL;
+   if (instance_count) *instance_count = 0;
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Smart *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   if (class_descriptions) *class_descriptions = NULL;
+   if (class_count) *class_count = 0;
+   if (instance_descriptions) *instance_descriptions = NULL;
+   if (instance_count) *instance_count = 0;
+   return;
+   MAGIC_CHECK_END();
+
+   if (class_descriptions)
+     *class_descriptions = obj->smart.smart->callbacks.array;
+   if (class_count)
+     *class_count = obj->smart.smart->callbacks.size;
+
+   if (instance_descriptions)
+     *instance_descriptions = o->callbacks_descriptions.array;
+   if (instance_count)
+     *instance_count = o->callbacks_descriptions.size;
+}
+
+/**
+ * Find callback description for callback called @a name.
+ *
+ * @param obj the smart object.
+ * @param name name of desired callback, must @b not be @c NULL.  The
+ *        search have a special case for @a name being the same
+ *        pointer as registered with Evas_Smart_Cb_Description, one
+ *        can use it to avoid excessive use of strcmp().
+ * @param class_description pointer to return class description or @c
+ *        NULL if not found. If parameter is @c NULL, no search will
+ *        be done on class descriptions.
+ * @param instance_description pointer to return instance description
+ *        or @c NULL if not found. If parameter is @c NULL, no search
+ *        will be done on instance descriptions.
+ * @return reference to description if found, @c NULL if not found.
+ */
+EAPI void
+evas_object_smart_callback_description_find(const Evas_Object *obj, const char *name, const Evas_Smart_Cb_Description **class_description, const Evas_Smart_Cb_Description **instance_description)
+{
+   Evas_Object_Smart *o;
+
+   if (!name)
+     {
+       if (class_description) *class_description = NULL;
+       if (instance_description) *instance_description = NULL;
+       return;
+     }
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (class_description) *class_description = NULL;
+   if (instance_description) *instance_description = NULL;
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Smart *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   if (class_description) *class_description = NULL;
+   if (instance_description) *instance_description = NULL;
+   return;
+   MAGIC_CHECK_END();
+
+   if (class_description)
+     *class_description = evas_smart_cb_description_find
+       (&obj->smart.smart->callbacks, name);
+
+   if (instance_description)
+     *instance_description = evas_smart_cb_description_find
+       (&o->callbacks_descriptions, name);
+}
+
+/**
+ * Set the need_recalculate flag of given smart object.
+ *
+ * If this flag is set then calculate() callback (method) of the given
+ * smart object will be called, if one is provided, during render phase
+ * usually evas_render(). After this step, this flag will be automatically
+ * unset.
+ *
+ * If no calculate() is provided, this flag will be left unchanged.
+ *
+ * @note just setting this flag will not make scene dirty and evas_render()
+ *       will have no effect. To do that, use evas_object_smart_changed(),
+ *       that will automatically call this function with 1 as parameter.
+ *
+ * @param obj the smart object
+ * @param value if one want to set or unset the need_recalculate flag.
+ *
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI void
+evas_object_smart_need_recalculate_set(Evas_Object *obj, Eina_Bool value)
+{
+   Evas_Object_Smart *o;
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = obj->object_data;
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   return;
+   MAGIC_CHECK_END();
+
+   value = !!value;
+   if (o->need_recalculate == value)
+     return;
+   o->need_recalculate = value;
+
+   if (!obj->smart.smart->smart_class->calculate)
+     return;
+
+   /* XXX: objects can be present multiple times in calculate_objects()
+    * XXX: after a set-unset-set cycle, but it's not a problem since
+    * XXX: on _evas_render_call_smart_calculate() will check for the flag
+    * XXX: and it will be unset after the first.
+    */
+   if (o->need_recalculate)
+     {
+       Evas *e;
+       e = obj->layer->evas;
+       eina_array_push(&e->calculate_objects, obj);
+     }
+   /* TODO: else, remove from array */
+}
+
+/**
+ * Get the current value of need_recalculate flag.
+ *
+ * @note this flag will be unset during the render phase, after calculate()
+ *       is called if one is provided.  If no calculate() is provided, then
+ *       the flag will be left unchanged after render phase.
+ *
+ * @param obj the smart object
+ * @return if flag is set or not.
+ *
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI Eina_Bool
+evas_object_smart_need_recalculate_get(const Evas_Object *obj)
+{
+   Evas_Object_Smart *o;
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = obj->object_data;
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   return 0;
+   MAGIC_CHECK_END();
+
+   return o->need_recalculate;
+}
+
+/**
+ * Call user provided calculate() and unset need_calculate.
+ *
+ * @param obj the smart object
+ *
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI void
+evas_object_smart_calculate(Evas_Object *obj)
+{
+   Evas_Object_Smart *o;
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = obj->object_data;
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   return;
+   MAGIC_CHECK_END();
+
+   if (!obj->smart.smart->smart_class->calculate)
+     return;
+
+   o->need_recalculate = 0;
+   obj->smart.smart->smart_class->calculate(obj);
+}
+
+/**
+ * Call user provided calculate() and unset need_calculate on all objects.
+ *
+ * @param e The canvas to calculate all objects in
+ *
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI void
+evas_smart_objects_calculate(Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   evas_call_smarts_calculate(e);
+}
+
+/**
+ * Call calculate() on all smart objects that need_recalculate.
+ *
+ * @internal
+ */
+void
+evas_call_smarts_calculate(Evas *e)
+{
+   Eina_Array *calculate;
+   unsigned int i;
+
+   calculate = &e->calculate_objects;
+   for (i = 0; i < calculate->count; ++i)
+     {
+       Evas_Object *obj;
+       Evas_Object_Smart *o;
+
+       obj = eina_array_data_get(calculate, i);
+       if (obj->delete_me)
+         continue;
+
+       o = obj->object_data;
+       if (o->need_recalculate)
+         {
+            o->need_recalculate = 0;
+            obj->smart.smart->smart_class->calculate(obj);
+         }
+     }
+
+   eina_array_flush(calculate);
+}
+
+/**
+ * Mark smart object as changed, dirty.
+ *
+ * This will inform the scene that it changed and needs to be redraw, also
+ * setting need_recalculate on the given object.
+ *
+ * @see evas_object_smart_need_recalculate_set().
+ *
+ * @ingroup Evas_Smart_Object_Group
+ */
+EAPI void
+evas_object_smart_changed(Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   evas_object_change(obj);
+   evas_object_smart_need_recalculate_set(obj, 1);
+}
+
+/* internal calls */
+static void
+evas_object_smart_callbacks_clear(Evas_Object *obj)
+{
+   Evas_Object_Smart *o;
+   Eina_List *l;
+   Evas_Smart_Callback *cb;
+
+   o = (Evas_Object_Smart *)(obj->object_data);
+
+   if (o->walking_list) return;
+   if (!o->deletions_waiting) return;
+   for (l = o->callbacks; l;)
+     {
+       cb = eina_list_data_get(l);
+       l = eina_list_next(l);
+       if (cb->delete_me)
+         {
+            o->callbacks = eina_list_remove(o->callbacks, cb);
+            if (cb->event) eina_stringshare_del(cb->event);
+            free(cb);
+         }
+     }
+}
+
+void
+evas_object_smart_del(Evas_Object *obj)
+{
+   Evas_Smart *s;
+
+   s = obj->smart.smart;
+   if (obj->delete_me) return;
+   if ((s) && (s->smart_class->del)) s->smart_class->del(obj);
+   if (obj->smart.parent) evas_object_smart_member_del(obj);
+   if (s) evas_object_smart_unuse(s);
+}
+
+void
+evas_object_smart_cleanup(Evas_Object *obj)
+{
+   Evas_Object_Smart *o;
+
+   if (obj->smart.parent)
+     evas_object_smart_member_del(obj);
+
+   o = (Evas_Object_Smart *)(obj->object_data);
+   if (o->magic == MAGIC_OBJ_SMART)
+     {
+       while (o->contained)
+         evas_object_smart_member_del((Evas_Object *)o->contained);
+
+       while (o->callbacks)
+         {
+            Evas_Smart_Callback *cb;
+
+            cb = o->callbacks->data;
+            o->callbacks = eina_list_remove(o->callbacks, cb);
+            if (cb->event) eina_stringshare_del(cb->event);
+            free(cb);
+         }
+
+       o->data = NULL;
+     }
+
+   obj->smart.parent = NULL;
+   obj->smart.smart = NULL;
+}
+
+void
+evas_object_smart_member_cache_invalidate(Evas_Object *obj)
+{
+   Evas_Object_Smart *o;
+   Eina_Inlist *l;
+
+   o = (Evas_Object_Smart *)(obj->object_data);
+   if (o->magic != MAGIC_OBJ_SMART)
+     return;
+
+   obj->parent_cache_valid = 0;
+   for (l = o->contained; l; l = l->next)
+     {
+       Evas_Object *obj2;
+
+       obj2 = (Evas_Object *)l;
+       evas_object_smart_member_cache_invalidate(obj2);
+     }
+}
+
+void
+evas_object_smart_member_raise(Evas_Object *member)
+{
+   Evas_Object_Smart *o;
+
+   o = (Evas_Object_Smart *)(member->smart.parent->object_data);
+   o->contained = eina_inlist_demote(o->contained, EINA_INLIST_GET(member));
+}
+
+void
+evas_object_smart_member_lower(Evas_Object *member)
+{
+   Evas_Object_Smart *o;
+
+   o = (Evas_Object_Smart *)(member->smart.parent->object_data);
+   o->contained = eina_inlist_promote(o->contained, EINA_INLIST_GET(member));
+}
+
+void
+evas_object_smart_member_stack_above(Evas_Object *member, Evas_Object *other)
+{
+   Evas_Object_Smart *o;
+
+   o = (Evas_Object_Smart *)(member->smart.parent->object_data);
+   o->contained = eina_inlist_remove(o->contained, EINA_INLIST_GET(member));
+   o->contained = eina_inlist_append_relative(o->contained, EINA_INLIST_GET(member), EINA_INLIST_GET(other));
+}
+
+void
+evas_object_smart_member_stack_below(Evas_Object *member, Evas_Object *other)
+{
+   Evas_Object_Smart *o;
+
+   o = (Evas_Object_Smart *)(member->smart.parent->object_data);
+   o->contained = eina_inlist_remove(o->contained, EINA_INLIST_GET(member));
+   o->contained = eina_inlist_prepend_relative(o->contained, EINA_INLIST_GET(member), EINA_INLIST_GET(other));
+}
+
+/* all nice and private */
+static void
+evas_object_smart_init(Evas_Object *obj)
+{
+   /* alloc smart obj, setup methods and default values */
+   obj->object_data = evas_object_smart_new();
+   /* set up default settings for this kind of object */
+   obj->cur.color.r = 255;
+   obj->cur.color.g = 255;
+   obj->cur.color.b = 255;
+   obj->cur.color.a = 255;
+   obj->cur.geometry.x = 0;
+   obj->cur.geometry.y = 0;
+   obj->cur.geometry.w = 0;
+   obj->cur.geometry.h = 0;
+   obj->cur.layer = 0;
+   /* set up object-specific settings */
+   obj->prev = obj->cur;
+   /* set up methods (compulsory) */
+   obj->func = &object_func;
+}
+
+static void *
+evas_object_smart_new(void)
+{
+   Evas_Object_Smart *o;
+
+   /* alloc obj private data */
+   o = calloc(1, sizeof(Evas_Object_Smart));
+   o->magic = MAGIC_OBJ_SMART;
+   return o;
+}
+
+static void
+evas_object_smart_free(Evas_Object *obj)
+{
+   Evas_Object_Smart *o;
+
+   /* frees private object data. very simple here */
+   o = (Evas_Object_Smart *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
+   return;
+   MAGIC_CHECK_END();
+   /* free obj */
+   o->magic = 0;
+   free(o);
+}
+
+static void
+evas_object_smart_render(Evas_Object *obj __UNUSED__, void *output __UNUSED__, void *context __UNUSED__, void *surface __UNUSED__, int x __UNUSED__, int y __UNUSED__)
+{
+   return;
+}
+
+static void
+evas_object_smart_render_pre(Evas_Object *obj)
+{
+   if (obj->pre_render_done) return;
+   if ((obj->cur.map != obj->prev.map) ||
+       (obj->cur.usemap != obj->prev.usemap))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+        goto done;
+     }
+   done:
+   obj->pre_render_done = 1;
+}
+
+static void
+evas_object_smart_render_post(Evas_Object *obj)
+{
+   obj->prev = obj->cur;
+}
+
+static unsigned int evas_object_smart_id_get(Evas_Object *obj)
+{
+   Evas_Object_Smart *o;
+
+   o = (Evas_Object_Smart *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_SMART;
+}
+
+static unsigned int evas_object_smart_visual_id_get(Evas_Object *obj)
+{
+   Evas_Object_Smart *o;
+
+   o = (Evas_Object_Smart *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_CONTAINER;
+}
+
+static void *evas_object_smart_engine_data_get(Evas_Object *obj)
+{
+   Evas_Object_Smart *o;
+
+   o = (Evas_Object_Smart *)(obj->object_data);
+   if (!o) return NULL;
+   return o->engine_data;
+}
diff --git a/src/lib/canvas/evas_object_smart_clipped.c b/src/lib/canvas/evas_object_smart_clipped.c
new file mode 100644 (file)
index 0000000..77909f5
--- /dev/null
@@ -0,0 +1,254 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/**
+ * @addtogroup Evas_Smart_Object_Clipped Clipped Smart Object
+ * @{
+ */
+
+#define CSO_DATA_GET_OR_RETURN(obj, ptr)                                \
+  Evas_Object_Smart_Clipped_Data *ptr = evas_object_smart_data_get(obj); \
+  if (!ptr) return;
+
+/**
+ * Moves all children objects relative to given offset.
+ *
+ * @param obj the smart evas object to use.
+ * @param dx horizontal offset.
+ * @param dy vertical offset.
+ */
+EAPI void
+evas_object_smart_move_children_relative(Evas_Object *obj, Evas_Coord dx, Evas_Coord dy)
+{
+   Eina_List *lst, *itr;
+   Evas_Object *child;
+
+   if ((dx == 0) && (dy == 0))
+     return;
+
+   lst = evas_object_smart_members_get(obj);
+   EINA_LIST_FOREACH(lst, itr, child)
+     {
+       Evas_Coord orig_x, orig_y;
+
+       evas_object_geometry_get(child, &orig_x, &orig_y, NULL, NULL);
+       evas_object_move(child, orig_x + dx, orig_y + dy);
+     }
+
+   eina_list_free(lst);
+}
+
+/**
+ * Get the clipper object for the given clipped smart object.
+ *
+ * @param obj the clipped smart object to retrieve the associated clipper.
+ * @return the clipper object.
+ *
+ * @see evas_object_smart_clipped_smart_add()
+ */
+EAPI Evas_Object *
+evas_object_smart_clipped_clipper_get(Evas_Object *obj)
+{
+   Evas_Object_Smart_Clipped_Data *cso = evas_object_smart_data_get(obj);
+   if (!cso)
+     return NULL;
+
+   return cso->clipper;
+}
+
+static void
+evas_object_smart_clipped_smart_add(Evas_Object *obj)
+{
+   Evas_Object_Smart_Clipped_Data *cso;
+   Evas_Object *clipper;
+
+   cso = evas_object_smart_data_get(obj);
+   if (!cso)
+     cso = malloc(sizeof(*cso)); /* users can provide it or realloc() later */
+
+   cso->evas = evas_object_evas_get(obj);
+   clipper = evas_object_rectangle_add(cso->evas);
+   cso->clipper = NULL;
+   evas_object_smart_member_add(clipper, obj);
+   cso->clipper = clipper;
+   evas_object_color_set(cso->clipper, 255, 255, 255, 255);
+   evas_object_move(cso->clipper, -100000, -100000);
+   evas_object_resize(cso->clipper, 200000, 200000);
+   evas_object_pass_events_set(cso->clipper, 1);
+   evas_object_hide(cso->clipper); /* show when have something clipped to it */
+
+   evas_object_smart_data_set(obj, cso);
+}
+
+static void
+evas_object_smart_clipped_smart_del(Evas_Object *obj)
+{
+   Eina_List *lst, *itr;
+   Evas_Object *data;
+
+   CSO_DATA_GET_OR_RETURN(obj, cso);
+
+   if (cso->clipper)
+     {
+       Evas_Object *clipper = cso->clipper;
+       cso->clipper = NULL;
+       evas_object_del(clipper);
+     }
+
+   lst = evas_object_smart_members_get(obj);
+   EINA_LIST_FOREACH(lst, itr, data)
+     evas_object_del(data);
+   eina_list_free(lst);
+
+   free(cso);
+   evas_object_smart_data_set(obj, NULL);
+}
+
+static void
+evas_object_smart_clipped_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
+{
+   Evas_Coord orig_x, orig_y;
+
+   evas_object_geometry_get(obj, &orig_x, &orig_y, NULL, NULL);
+   evas_object_smart_move_children_relative(obj, x - orig_x, y - orig_y);
+}
+
+static void
+evas_object_smart_clipped_smart_show(Evas_Object *obj)
+{
+   CSO_DATA_GET_OR_RETURN(obj, cso);
+   if (evas_object_clipees_get(cso->clipper))
+     evas_object_show(cso->clipper); /* just show if clipper being used */
+}
+
+static void
+evas_object_smart_clipped_smart_hide(Evas_Object *obj)
+{
+   CSO_DATA_GET_OR_RETURN(obj, cso);
+   evas_object_hide(cso->clipper);
+}
+
+static void
+evas_object_smart_clipped_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
+{
+   CSO_DATA_GET_OR_RETURN(obj, cso);
+   evas_object_color_set(cso->clipper, r, g, b, a);
+}
+
+static void
+evas_object_smart_clipped_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
+{
+   CSO_DATA_GET_OR_RETURN(obj, cso);
+   evas_object_clip_set(cso->clipper, clip);
+}
+
+static void
+evas_object_smart_clipped_smart_clip_unset(Evas_Object *obj)
+{
+   CSO_DATA_GET_OR_RETURN(obj, cso);
+   evas_object_clip_unset(cso->clipper);
+}
+
+static void
+evas_object_smart_clipped_smart_member_add(Evas_Object *obj, Evas_Object *member)
+{
+   CSO_DATA_GET_OR_RETURN(obj, cso);
+   if (!cso->clipper)
+     return;
+   evas_object_clip_set(member, cso->clipper);
+   if (evas_object_visible_get(obj))
+     evas_object_show(cso->clipper);
+}
+
+static void
+evas_object_smart_clipped_smart_member_del(Evas_Object *obj, Evas_Object *member)
+{
+   CSO_DATA_GET_OR_RETURN(obj, cso);
+   if (!cso->clipper)
+     return;
+   evas_object_clip_unset(member);
+   if (!evas_object_clipees_get(cso->clipper))
+     evas_object_hide(cso->clipper);
+}
+
+/**
+ * Set smart class callbacks so it implements the "Clipped Smart Object".
+ *
+ * This call will assign all the required methods of Evas_Smart_Class,
+ * if one wants to "subclass" it, call this function and later
+ * override values, if one wants to call the original method, save it
+ * somewhere, example:
+ *
+ * @code
+ * static Evas_Smart_Class parent_sc = EVAS_SMART_CLASS_INIT_NULL;
+ *
+ * static void my_class_smart_add(Evas_Object *o)
+ * {
+ *    parent_sc.add(o);
+ *    evas_object_color_set(evas_object_smart_clipped_clipper_get(o),
+ *                          255, 0, 0, 255);
+ * }
+ *
+ * Evas_Smart_Class *my_class_new(void)
+ * {
+ *    static Evas_Smart_Class sc = EVAS_SMART_CLASS_INIT_NAME_VERSION("MyClass");
+ *    if (!parent_sc.name)
+ *      {
+ *         evas_object_smart_clipped_smart_set(&sc);
+ *         parent_sc = sc;
+ *         sc.add = my_class_smart_add;
+ *      }
+ *    return &sc;
+ * }
+ * @endcode
+ *
+ * Default behavior is:
+ *  - add: creates a hidden clipper with "infinite" size;
+ *  - del: delete all children objects;
+ *  - move: move all objects relative relatively;
+ *  - resize: not defined;
+ *  - show: if there are children objects, show clipper;
+ *  - hide: hides clipper;
+ *  - color_set: set the color of clipper;
+ *  - clip_set: set clipper of clipper;
+ *  - clip_unset: unset the clipper of clipper;
+ */
+EAPI void
+evas_object_smart_clipped_smart_set(Evas_Smart_Class *sc)
+{
+   if (!sc)
+     return;
+
+   sc->add = evas_object_smart_clipped_smart_add;
+   sc->del = evas_object_smart_clipped_smart_del;
+   sc->move = evas_object_smart_clipped_smart_move;
+   sc->show = evas_object_smart_clipped_smart_show;
+   sc->hide = evas_object_smart_clipped_smart_hide;
+   sc->color_set = evas_object_smart_clipped_smart_color_set;
+   sc->clip_set = evas_object_smart_clipped_smart_clip_set;
+   sc->clip_unset = evas_object_smart_clipped_smart_clip_unset;
+   sc->calculate = NULL;
+   sc->member_add = evas_object_smart_clipped_smart_member_add;
+   sc->member_del = evas_object_smart_clipped_smart_member_del;
+}
+
+/**
+ * Get a pointer to the Clipped Smart Class to use for proper inheritance
+ */
+EAPI const Evas_Smart_Class *
+evas_object_smart_clipped_class_get(void)
+{
+   static Evas_Smart_Class _sc = EVAS_SMART_CLASS_INIT_NAME_VERSION("EvasObjectSmartClipped");
+   static const Evas_Smart_Class *class = NULL;
+
+   if (class)
+     return class;
+
+   evas_object_smart_clipped_smart_set(&_sc);
+   class = &_sc;
+   return class;
+}
+
+/**
+ * @}
+ */
diff --git a/src/lib/canvas/evas_object_table.c b/src/lib/canvas/evas_object_table.c
new file mode 100644 (file)
index 0000000..90393f7
--- /dev/null
@@ -0,0 +1,1379 @@
+#include <errno.h>
+#include "evas_common.h"
+
+typedef struct _Evas_Object_Table_Data       Evas_Object_Table_Data;
+typedef struct _Evas_Object_Table_Option     Evas_Object_Table_Option;
+typedef struct _Evas_Object_Table_Cache      Evas_Object_Table_Cache;
+typedef struct _Evas_Object_Table_Iterator   Evas_Object_Table_Iterator;
+typedef struct _Evas_Object_Table_Accessor   Evas_Object_Table_Accessor;
+
+struct _Evas_Object_Table_Option
+{
+   Evas_Object *obj;
+   unsigned short col, row, colspan, rowspan, end_col, end_row;
+   struct {
+      Evas_Coord w, h;
+   } min, max;
+   struct {
+      double h, v;
+   } align;
+   struct {
+      Evas_Coord l, r, t, b;
+   } pad;
+   Eina_Bool expand_h : 1; /* XXX required? */
+   Eina_Bool expand_v : 1; /* XXX required? */
+   Eina_Bool fill_h : 1;
+   Eina_Bool fill_v : 1;
+};
+
+struct _Evas_Object_Table_Cache
+{
+   struct {
+      struct {
+        int h, v;
+      } expands;
+      struct {
+        Evas_Coord w, h;
+      } min;
+   } total;
+   struct {
+      Evas_Coord *h, *v;
+   } sizes;
+   struct {
+      Eina_Bool *h, *v;
+   } expands;
+};
+
+struct _Evas_Object_Table_Data
+{
+   Evas_Object_Smart_Clipped_Data base;
+   Eina_List *children;
+   struct {
+      Evas_Coord h, v;
+   } pad;
+   struct {
+      double h, v;
+   } align;
+   struct {
+      int cols, rows;
+   } size;
+   Evas_Object_Table_Cache *cache;
+   Evas_Object_Table_Homogeneous_Mode homogeneous;
+   Eina_Bool hints_changed : 1;
+   Eina_Bool expand_h : 1;
+   Eina_Bool expand_v : 1;
+};
+
+struct _Evas_Object_Table_Iterator
+{
+   Eina_Iterator iterator;
+
+   Eina_Iterator *real_iterator;
+   const Evas_Object *table;
+};
+
+struct _Evas_Object_Table_Accessor
+{
+   Eina_Accessor accessor;
+
+   Eina_Accessor *real_accessor;
+   const Evas_Object *table;
+};
+
+/**
+ * @addtogroup Evas_Object_Table
+ * @{
+ */
+
+#define EVAS_OBJECT_TABLE_DATA_GET(o, ptr)                     \
+  Evas_Object_Table_Data *ptr = evas_object_smart_data_get(o)
+
+#define EVAS_OBJECT_TABLE_DATA_GET_OR_RETURN(o, ptr)                   \
+  EVAS_OBJECT_TABLE_DATA_GET(o, ptr);                                  \
+  if (!ptr)                                                            \
+    {                                                                  \
+      CRIT("no widget data for object %p (%s)",                \
+          o, evas_object_type_get(o));                                 \
+       abort();                                                                \
+       return;                                                         \
+}
+
+#define EVAS_OBJECT_TABLE_DATA_GET_OR_RETURN_VAL(o, ptr, val)          \
+  EVAS_OBJECT_TABLE_DATA_GET(o, ptr);                                  \
+  if (!ptr)                                                            \
+    {                                                                  \
+       CRIT("No widget data for object %p (%s)",                       \
+              o, evas_object_type_get(o));                             \
+       abort();                                                                \
+       return val;                                                     \
+    }
+
+static const char EVAS_OBJECT_TABLE_OPTION_KEY[] = "Evas_Object_Table_Option";
+
+static Eina_Bool
+_evas_object_table_iterator_next(Evas_Object_Table_Iterator *it, void **data)
+{
+   Evas_Object_Table_Option *opt;
+
+   if (!eina_iterator_next(it->real_iterator, (void **)&opt))
+     return EINA_FALSE;
+   if (data) *data = opt->obj;
+   return EINA_TRUE;
+}
+
+static Evas_Object *
+_evas_object_table_iterator_get_container(Evas_Object_Table_Iterator *it)
+{
+   return (Evas_Object *)it->table;
+}
+
+static void
+_evas_object_table_iterator_free(Evas_Object_Table_Iterator *it)
+{
+   eina_iterator_free(it->real_iterator);
+   free(it);
+}
+
+static Eina_Bool
+_evas_object_table_accessor_get_at(Evas_Object_Table_Accessor *it, unsigned int index, void **data)
+{
+   Evas_Object_Table_Option *opt = NULL;
+
+   if (!eina_accessor_data_get(it->real_accessor, index, (void **)&opt))
+     return EINA_FALSE;
+   if (data) *data = opt->obj;
+   return EINA_TRUE;
+}
+
+static Evas_Object *
+_evas_object_table_accessor_get_container(Evas_Object_Table_Accessor *it)
+{
+   return (Evas_Object *)it->table;
+}
+
+static void
+_evas_object_table_accessor_free(Evas_Object_Table_Accessor *it)
+{
+   eina_accessor_free(it->real_accessor);
+   free(it);
+}
+
+static Evas_Object_Table_Cache *
+_evas_object_table_cache_alloc(int cols, int rows)
+{
+   Evas_Object_Table_Cache *cache;
+   int size;
+
+   size = (sizeof(Evas_Object_Table_Cache) +
+          (cols + rows) * (sizeof(Eina_Bool) + sizeof(Evas_Coord)));
+   cache = malloc(size);
+   if (!cache)
+     {
+       ERR("Could not allocate table cache %dx%d (%d bytes): %s",
+             cols, rows, size, strerror(errno));
+       return NULL;
+     }
+
+   cache->sizes.h = (Evas_Coord *)(cache + 1);
+   cache->sizes.v = (Evas_Coord *)(cache->sizes.h + cols);
+   cache->expands.h = (Eina_Bool *)(cache->sizes.v + rows);
+   cache->expands.v = (Eina_Bool *)(cache->expands.h + cols);
+
+   return cache;
+}
+
+static void
+_evas_object_table_cache_free(Evas_Object_Table_Cache *cache)
+{
+   free(cache);
+}
+
+static void
+_evas_object_table_cache_reset(Evas_Object_Table_Data *priv)
+{
+   Evas_Object_Table_Cache *c = priv->cache;
+   int size;
+
+   c->total.expands.v = 0;
+   c->total.expands.h = 0;
+   c->total.min.w = 0;
+   c->total.min.h = 0;
+
+   size = ((priv->size.rows + priv->size.cols) *
+          (sizeof(Eina_Bool) + sizeof(Evas_Coord)));
+   memset(c + 1, 0, size);
+}
+
+static void
+_evas_object_table_cache_invalidate(Evas_Object_Table_Data *priv)
+{
+   priv->hints_changed = 1;
+   if (priv->cache)
+     {
+       _evas_object_table_cache_free(priv->cache);
+       priv->cache = NULL;
+     }
+}
+
+static Evas_Object_Table_Option *
+_evas_object_table_option_get(Evas_Object *o)
+{
+   return evas_object_data_get(o, EVAS_OBJECT_TABLE_OPTION_KEY);
+}
+
+static void
+_evas_object_table_option_set(Evas_Object *o, const Evas_Object_Table_Option *opt)
+{
+   evas_object_data_set(o, EVAS_OBJECT_TABLE_OPTION_KEY, opt);
+}
+
+static Evas_Object_Table_Option *
+_evas_object_table_option_del(Evas_Object *o)
+{
+   return evas_object_data_del(o, EVAS_OBJECT_TABLE_OPTION_KEY);
+}
+
+static void
+_on_child_del(void *data, Evas *evas __UNUSED__, Evas_Object *child, void *einfo __UNUSED__)
+{
+   Evas_Object *table = data;
+   evas_object_table_unpack(table, child);
+}
+
+static void
+_on_child_hints_changed(void *data, Evas *evas __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__)
+{
+   Evas_Object *table = data;
+   EVAS_OBJECT_TABLE_DATA_GET_OR_RETURN(table, priv);
+   _evas_object_table_cache_invalidate(priv);
+   evas_object_smart_changed(table);
+}
+
+static void
+_evas_object_table_child_connect(Evas_Object *o, Evas_Object *child)
+{
+   evas_object_event_callback_add
+     (child, EVAS_CALLBACK_DEL, _on_child_del, o);
+   evas_object_event_callback_add
+     (child, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _on_child_hints_changed, o);
+}
+
+static void
+_evas_object_table_child_disconnect(Evas_Object *o, Evas_Object *child)
+{
+   evas_object_event_callback_del_full
+     (child, EVAS_CALLBACK_DEL, _on_child_del, o);
+   evas_object_event_callback_del_full
+     (child, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _on_child_hints_changed, o);
+}
+
+static void
+_evas_object_table_calculate_cell(const Evas_Object_Table_Option *opt, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+{
+   Evas_Coord cw, ch;
+
+   *w -= opt->pad.l + opt->pad.r;
+   if (*w < opt->min.w)
+     cw = opt->min.w;
+   else if ((opt->max.w > -1) && (*w > opt->max.w))
+     cw = opt->max.w;
+   else if (opt->fill_h)
+     cw = *w;
+   else
+     cw = opt->min.w;
+
+   *h -= opt->pad.t + opt->pad.b;
+   if (*h < opt->min.h)
+     ch = opt->min.h;
+   else if ((opt->max.h > -1) && (*h > opt->max.h))
+     ch = opt->max.h;
+   else if (opt->fill_v)
+     ch = *h;
+   else
+     ch = opt->min.h;
+
+   *x += opt->pad.l;
+   if (cw != *w)
+     {
+       *x += (*w - cw) * opt->align.h;
+       *w = cw;
+     }
+
+   *y += opt->pad.t;
+   if (ch != *h)
+     {
+       *y += (*h - ch) * opt->align.v;
+       *h = ch;
+     }
+}
+
+/* static Eina_Bool */
+/* _evas_object_table_check_hints_homogeneous_table(Evas_Object *child, double *align, Evas_Coord min, const char *axis_name) */
+/* { */
+/*    if (*align < 0.0) */
+/*      { */
+/*     /\* assume expand and align to the center. */
+/*      * this is compatible with evas_object_box behavior and is the */
+/*      * same as weight > 0.0. */
+/*      *\/ */
+/*     *align = 0.5; */
+/*     return 0; */
+/*      } */
+/*    else if (min < 1) */
+/*      { */
+/*     WRN("Child %p [%s, %s] has no minimum width " */
+/*             "and no %s expand (weight is not > 0.0). " */
+/*             "Assuming weight > 0.0\n", */
+/*             child, evas_object_type_get(child), evas_object_name_get(child), */
+/*             axis_name); */
+/*     return 0; */
+/*      } */
+
+/*    return 1; */
+/* } */
+
+static void
+_evas_object_table_calculate_hints_homogeneous(Evas_Object *o, Evas_Object_Table_Data *priv)
+{
+   Eina_List *l;
+   Evas_Object_Table_Option *opt;
+   Evas_Coord minw, minh, o_minw, o_minh;
+   Eina_Bool expand_h, expand_v;
+
+   o_minw = 0;
+   o_minh = 0;
+   minw = 0;
+   minh = 0;
+   expand_h = 0;
+   expand_v = 0;
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+       Evas_Object *child = opt->obj;
+       Evas_Coord child_minw, child_minh, cell_minw, cell_minh;
+       double weightw, weighth;
+
+       evas_object_size_hint_min_get(child, &opt->min.w, &opt->min.h);
+       evas_object_size_hint_max_get(child, &opt->max.w, &opt->max.h);
+       evas_object_size_hint_padding_get
+         (child, &opt->pad.l, &opt->pad.r, &opt->pad.t, &opt->pad.b);
+       evas_object_size_hint_align_get(child, &opt->align.h, &opt->align.v);
+       evas_object_size_hint_weight_get(child, &weightw, &weighth);
+
+       child_minw = opt->min.w + opt->pad.l + opt->pad.r;
+       child_minh = opt->min.h + opt->pad.t + opt->pad.b;
+
+       cell_minw = (child_minw + opt->colspan - 1) / opt->colspan;
+       cell_minh = (child_minh + opt->rowspan - 1) / opt->rowspan;
+
+       opt->expand_h = 0;
+       if ((weightw > 0.0) &&
+           ((opt->max.w < 0) ||
+            ((opt->max.w > -1) && (opt->min.w < opt->max.w))))
+         {
+            opt->expand_h = 1;
+            expand_h = 1;
+         }
+/*     else if ((priv->homogeneous == EVAS_OBJECT_TABLE_HOMOGENEOUS_TABLE) && */
+/*              (!_evas_object_table_check_hints_homogeneous_table */
+/*               (child, &opt->align.h, opt->min.w, "horizontal"))) */
+/*       { */
+/*          opt->expand_h = 1; */
+/*          expand_h = 1; */
+/*       } */
+
+
+       opt->expand_v = 0;
+       if ((weighth > 0.0) &&
+           ((opt->max.h < 0) ||
+            ((opt->max.h > -1) && (opt->min.h < opt->max.h))))
+         {
+            opt->expand_v = 1;
+            expand_v = 1;
+         }
+/*     else if ((priv->homogeneous == EVAS_OBJECT_TABLE_HOMOGENEOUS_TABLE) && */
+/*              (!_evas_object_table_check_hints_homogeneous_table */
+/*               (child, &opt->align.v, opt->min.h, "vertical"))) */
+/*       { */
+/*          opt->expand_v = 1; */
+/*          expand_v = 1; */
+/*       } */
+
+       opt->fill_h = 0;
+       if (opt->align.h < 0.0)
+         {
+            opt->align.h = 0.5;
+            opt->fill_h = 1;
+         }
+       opt->fill_v = 0;
+       if (opt->align.v < 0.0)
+         {
+            opt->align.v = 0.5;
+            opt->fill_v = 1;
+         }
+
+       /* greatest mininum values, with paddings */
+       if (minw < cell_minw)
+         minw = cell_minw;
+       if (minh < cell_minh)
+         minh = cell_minh;
+       /* greatest mininum values, without paddings */
+       if (o_minw < opt->min.w)
+         o_minw = opt->min.w;
+       if (o_minh < opt->min.h)
+         o_minh = opt->min.h;
+     }
+
+   if (priv->homogeneous == EVAS_OBJECT_TABLE_HOMOGENEOUS_ITEM)
+     {
+       if (o_minw < 1)
+         {
+            ERR("homogeneous table based on item size but no "
+                  "horizontal mininum size specified! Using expand.");
+            expand_h = 1;
+         }
+       if (o_minh < 1)
+         {
+            ERR("homogeneous table based on item size but no "
+                  "vertical mininum size specified! Using expand.");
+            expand_v = 1;
+         }
+     }
+
+   minw = priv->size.cols * (minw + priv->pad.h) - priv->pad.h;
+   minh = priv->size.rows * (minh + priv->pad.v) - priv->pad.v;
+
+   priv->hints_changed = 0;
+   priv->expand_h = expand_h;
+   priv->expand_v = expand_v;
+
+   if ((minw > 0 ) || (minh > 0))
+     evas_object_size_hint_min_set(o, minw, minh);
+
+   // XXX hint max?
+}
+
+static void
+_evas_object_table_calculate_layout_homogeneous_sizes_item(const Evas_Object *o, const Evas_Object_Table_Data *priv, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+{
+   Evas_Coord minw, minh;
+   Eina_Bool expand_h, expand_v;
+
+   evas_object_size_hint_min_get(o, &minw, &minh);
+   expand_h = priv->expand_h;
+   expand_v = priv->expand_v;
+
+   if (*w < minw)
+     expand_h = 0;
+   if (!expand_h)
+     {
+       *x += (*w - minw) * priv->align.h;
+       *w = minw;
+     }
+
+   if (*h < minh)
+     expand_v = 0;
+   if (!expand_v)
+     {
+       *y += (*h - minh) * priv->align.v;
+       *h = minh;
+     }
+}
+
+static void
+_evas_object_table_calculate_layout_homogeneous_sizes(const Evas_Object *o, const Evas_Object_Table_Data *priv, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h, Evas_Coord *cellw, Evas_Coord *cellh)
+{
+   evas_object_geometry_get(o, x, y, w, h);
+   if (priv->homogeneous == EVAS_OBJECT_TABLE_HOMOGENEOUS_ITEM)
+     _evas_object_table_calculate_layout_homogeneous_sizes_item
+       (o, priv, x, y, w, h);
+
+   *cellw = (*w + priv->size.cols - 1) / priv->size.cols;
+   *cellh = (*h + priv->size.rows - 1) / priv->size.rows;
+}
+
+static void
+_evas_object_table_calculate_layout_homogeneous(Evas_Object *o, Evas_Object_Table_Data *priv)
+{
+   Evas_Coord x, y, w, h, cellw, cellh;
+   Eina_List *l;
+   Evas_Object_Table_Option *opt;
+
+   _evas_object_table_calculate_layout_homogeneous_sizes
+     (o, priv, &x, &y, &w, &h, &cellw, &cellh);
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+       Evas_Object *child = opt->obj;
+       Evas_Coord cx, cy, cw, ch;
+
+       cx = x + opt->col * (cellw + priv->pad.h);
+       cy = y + opt->row * (cellh + priv->pad.v);
+
+       cw = opt->colspan * cellw - priv->pad.h;
+       ch = opt->rowspan * cellh - priv->pad.v;
+
+       _evas_object_table_calculate_cell(opt, &cx, &cy, &cw, &ch);
+
+       evas_object_move(child, cx, cy);
+       evas_object_resize(child, cw, ch);
+     }
+}
+
+static void
+_evas_object_table_smart_calculate_homogeneous(Evas_Object *o, Evas_Object_Table_Data *priv)
+{
+   if (priv->hints_changed)
+     _evas_object_table_calculate_hints_homogeneous(o, priv);
+   _evas_object_table_calculate_layout_homogeneous(o, priv);
+}
+
+static int
+_evas_object_table_count_expands(const Eina_Bool *expands, int start, int end)
+{
+   const Eina_Bool *itr = expands + start, *itr_end = expands + end;
+   int count = 0;
+
+   for (; itr < itr_end; itr++)
+     if (*itr)
+       count++;
+
+   return count;
+}
+
+static Evas_Coord
+_evas_object_table_sum_sizes(const Evas_Coord *sizes, int start, int end)
+{
+   const Evas_Coord *itr = sizes + start, *itr_end = sizes + end;
+   Evas_Coord sum = 0;
+
+   for (; itr < itr_end; itr++)
+     sum += *itr;
+
+   return sum;
+}
+
+static void
+_evas_object_table_sizes_calc_noexpand(Evas_Coord *sizes, int start, int end, Evas_Coord space)
+{
+   Evas_Coord *itr = sizes + start, *itr_end = sizes + end - 1;
+   Evas_Coord step;
+   int units;
+
+   /* XXX move to fixed point math and spread errors among cells */
+   units = end - start;
+   step = space / units;
+   for (; itr < itr_end; itr++)
+     *itr += step;
+
+   *itr += space - step * (units - 1);
+}
+
+static void
+_evas_object_table_sizes_calc_expand(Evas_Coord *sizes, int start, int end, Evas_Coord space, const Eina_Bool *expands, int expand_count)
+{
+   Evas_Coord *itr = sizes + start, *itr_end = sizes + end;
+   const Eina_Bool *itr_expand = expands + start;
+   Evas_Coord step, last_space;
+
+   /* XXX move to fixed point math and spread errors among cells */
+   step = space / expand_count;
+   last_space = space - step * (expand_count - 1);
+
+   for (; itr < itr_end; itr++, itr_expand++)
+     if (*itr_expand)
+       {
+         expand_count--;
+         if (expand_count > 0)
+           *itr += step;
+         else
+           {
+              *itr += last_space;
+              break;
+           }
+       }
+}
+
+static void
+_evas_object_table_calculate_hints_regular(Evas_Object *o, Evas_Object_Table_Data *priv)
+{
+   Evas_Object_Table_Option *opt;
+   Evas_Object_Table_Cache *c;
+   Eina_List *l;
+
+   if (!priv->cache)
+     {
+       priv->cache = _evas_object_table_cache_alloc
+         (priv->size.cols, priv->size.rows);
+       if (!priv->cache)
+         return;
+     }
+   c = priv->cache;
+   _evas_object_table_cache_reset(priv);
+
+   /* cache interesting data */
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+       Evas_Object *child = opt->obj;
+       double weightw, weighth;
+
+       evas_object_size_hint_min_get(child, &opt->min.w, &opt->min.h);
+       evas_object_size_hint_max_get(child, &opt->max.w, &opt->max.h);
+       evas_object_size_hint_padding_get
+         (child, &opt->pad.l, &opt->pad.r, &opt->pad.t, &opt->pad.b);
+       evas_object_size_hint_align_get(child, &opt->align.h, &opt->align.v);
+       evas_object_size_hint_weight_get(child, &weightw, &weighth);
+
+       opt->expand_h = 0;
+       if ((weightw > 0.0) &&
+           ((opt->max.w < 0) ||
+            ((opt->max.w > -1) && (opt->min.w < opt->max.w))))
+         opt->expand_h = 1;
+
+       opt->expand_v = 0;
+       if ((weighth > 0.0) &&
+           ((opt->max.h < 0) ||
+            ((opt->max.h > -1) && (opt->min.h < opt->max.h))))
+         opt->expand_v = 1;
+
+       opt->fill_h = 0;
+       if (opt->align.h < 0.0)
+         {
+            opt->align.h = 0.5;
+            opt->fill_h = 1;
+         }
+       opt->fill_v = 0;
+       if (opt->align.v < 0.0)
+         {
+            opt->align.v = 0.5;
+            opt->fill_v = 1;
+         }
+
+       if (opt->expand_h)
+         memset(c->expands.h + opt->col, 1, opt->colspan);
+       if (opt->expand_v)
+         memset(c->expands.v + opt->row, 1, opt->rowspan);
+     }
+
+   /* calculate sizes for each row and column */
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+       Evas_Coord tot, need;
+
+       /* handle horizontal */
+       tot = _evas_object_table_sum_sizes(c->sizes.h, opt->col, opt->end_col);
+       need = opt->min.w + opt->pad.l + opt->pad.r;
+       if (tot < need)
+         {
+            Evas_Coord space = need - tot;
+            int count;
+
+            count = _evas_object_table_count_expands
+              (c->expands.h, opt->col, opt->end_col);
+
+            if (count > 0)
+              _evas_object_table_sizes_calc_expand
+                (c->sizes.h, opt->col, opt->end_col, space,
+                 c->expands.h, count);
+            else
+              _evas_object_table_sizes_calc_noexpand
+                (c->sizes.h, opt->col, opt->end_col, space);
+         }
+
+       /* handle vertical */
+       tot = _evas_object_table_sum_sizes(c->sizes.v, opt->row, opt->end_row);
+       need = opt->min.h + opt->pad.t + opt->pad.b;
+       if (tot < opt->min.h)
+         {
+            Evas_Coord space = need - tot;
+            int count;
+
+            count = _evas_object_table_count_expands
+              (c->expands.v, opt->row, opt->end_row);
+
+            if (count > 0)
+              _evas_object_table_sizes_calc_expand
+                (c->sizes.v, opt->row, opt->end_row, space,
+                 c->expands.v, count);
+            else
+              _evas_object_table_sizes_calc_noexpand
+                (c->sizes.v, opt->row, opt->end_row, space);
+         }
+     }
+
+   c->total.expands.h = _evas_object_table_count_expands
+     (c->expands.h, 0, priv->size.cols);
+   c->total.expands.v = _evas_object_table_count_expands
+     (c->expands.v, 0, priv->size.rows);
+
+   c->total.min.w = _evas_object_table_sum_sizes
+     (c->sizes.h, 0, priv->size.cols);
+   c->total.min.h = _evas_object_table_sum_sizes
+     (c->sizes.v, 0, priv->size.rows);
+
+   c->total.min.w += priv->pad.h * (priv->size.cols - 1);
+   c->total.min.h += priv->pad.v * (priv->size.rows - 1);
+
+   if ((c->total.min.w > 0) || (c->total.min.h > 0))
+     evas_object_size_hint_min_set(o, c->total.min.w, c->total.min.h);
+
+   // XXX hint max?
+}
+
+static void
+_evas_object_table_calculate_layout_regular(Evas_Object *o, Evas_Object_Table_Data *priv)
+{
+   Evas_Object_Table_Option *opt;
+   Evas_Object_Table_Cache *c;
+   Eina_List *l;
+   Evas_Coord *cols = NULL, *rows = NULL;
+   Evas_Coord x, y, w, h;
+
+   evas_object_geometry_get(o, &x, &y, &w, &h);
+   c = priv->cache;
+
+   /* handle horizontal */
+   if ((c->total.expands.h <= 0) || (c->total.min.w >= w))
+     {
+       x += (w - c->total.min.w) * priv->align.h;
+       w = c->total.min.w;
+       cols = c->sizes.h;
+     }
+   else
+     {
+       int size = priv->size.cols * sizeof(Evas_Coord);
+       cols = malloc(size);
+       if (!cols)
+         {
+            ERR("Could not allocate temp columns (%d bytes): %s",
+                 size, strerror(errno));
+             goto end;
+         }
+       memcpy(cols, c->sizes.h, size);
+       _evas_object_table_sizes_calc_expand
+         (cols, 0, priv->size.cols, w - c->total.min.w,
+          c->expands.h, c->total.expands.h);
+     }
+
+   /* handle vertical */
+   if ((c->total.expands.v <= 0) || (c->total.min.h >= h))
+     {
+       y += (h - c->total.min.h) * priv->align.v;
+       h = c->total.min.h;
+       rows = c->sizes.v;
+     }
+   else
+     {
+       int size = priv->size.rows * sizeof(Evas_Coord);
+       rows = malloc(size);
+       if (!rows)
+         {
+            ERR("could not allocate temp rows (%d bytes): %s",
+                 size, strerror(errno));
+            goto end;
+         }
+       memcpy(rows, c->sizes.v, size);
+       _evas_object_table_sizes_calc_expand
+         (rows, 0, priv->size.rows, h - c->total.min.h,
+          c->expands.v, c->total.expands.v);
+     }
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+     {
+       Evas_Object *child = opt->obj;
+       Evas_Coord cx, cy, cw, ch;
+        
+       cx = x + opt->col * (priv->pad.h);
+       cx += _evas_object_table_sum_sizes(cols, 0, opt->col);
+       cw = _evas_object_table_sum_sizes(cols, opt->col, opt->end_col);
+        
+       cy = y + opt->row * (priv->pad.v);
+       cy += _evas_object_table_sum_sizes(rows, 0, opt->row);
+       ch = _evas_object_table_sum_sizes(rows, opt->row, opt->end_row);
+        
+       _evas_object_table_calculate_cell(opt, &cx, &cy, &cw, &ch);
+        
+       evas_object_move(child, cx, cy);
+       evas_object_resize(child, cw, ch);
+     }
+
+ end:
+   if (cols != c->sizes.h)
+     {
+        if (cols) free(cols);
+     }
+   if (rows != c->sizes.v)
+     {
+        if (rows) free(rows);
+     }
+}
+
+static void
+_evas_object_table_smart_calculate_regular(Evas_Object *o, Evas_Object_Table_Data *priv)
+{
+   if (priv->hints_changed)
+     _evas_object_table_calculate_hints_regular(o, priv);
+   _evas_object_table_calculate_layout_regular(o, priv);
+}
+
+EVAS_SMART_SUBCLASS_NEW("Evas_Object_Table", _evas_object_table,
+                       Evas_Smart_Class, Evas_Smart_Class,
+                       evas_object_smart_clipped_class_get, NULL)
+
+static void
+_evas_object_table_smart_add(Evas_Object *o)
+{
+   EVAS_SMART_DATA_ALLOC(o, Evas_Object_Table_Data)
+
+   priv->pad.h = 0;
+   priv->pad.v = 0;
+   priv->align.h = 0.5;
+   priv->align.v = 0.5;
+   priv->size.cols = 0;
+   priv->size.rows = 0;
+   priv->cache = NULL;
+   priv->homogeneous = EVAS_OBJECT_TABLE_HOMOGENEOUS_NONE;
+   priv->hints_changed = 1;
+   priv->expand_h = 0;
+   priv->expand_v = 0;
+
+   _evas_object_table_parent_sc->add(o);
+}
+
+static void
+_evas_object_table_smart_del(Evas_Object *o)
+{
+   EVAS_OBJECT_TABLE_DATA_GET(o, priv);
+   Eina_List *l;
+
+   l = priv->children;
+   while (l)
+     {
+       Evas_Object_Table_Option *opt = l->data;
+       _evas_object_table_child_disconnect(o, opt->obj);
+       _evas_object_table_option_del(opt->obj);
+       free(opt);
+       l = eina_list_remove_list(l, l);
+     }
+
+   if (priv->cache)
+     {
+        _evas_object_table_cache_free(priv->cache);
+        priv->cache = NULL;
+     }
+
+   _evas_object_table_parent_sc->del(o);
+}
+
+static void
+_evas_object_table_smart_resize(Evas_Object *o, Evas_Coord w, Evas_Coord h)
+{
+   Evas_Coord ow, oh;
+   evas_object_geometry_get(o, NULL, NULL, &ow, &oh);
+   if ((ow == w) && (oh == h)) return;
+   evas_object_smart_changed(o);
+}
+
+static void
+_evas_object_table_smart_calculate(Evas_Object *o)
+{
+   EVAS_OBJECT_TABLE_DATA_GET_OR_RETURN(o, priv);
+
+   if ((priv->size.cols < 1) || (priv->size.rows < 1))
+     {
+       DBG("Nothing to do: cols=%d, rows=%d",
+             priv->size.cols, priv->size.rows);
+       return;
+     }
+
+   if (priv->homogeneous)
+     _evas_object_table_smart_calculate_homogeneous(o, priv);
+   else
+     _evas_object_table_smart_calculate_regular(o, priv);
+}
+
+static void
+_evas_object_table_smart_set_user(Evas_Smart_Class *sc)
+{
+   sc->add = _evas_object_table_smart_add;
+   sc->del = _evas_object_table_smart_del;
+   sc->resize = _evas_object_table_smart_resize;
+   sc->calculate = _evas_object_table_smart_calculate;
+}
+
+/**
+ * Create a new table.
+ *
+ * It's set to non-homogeneous by default, add children with
+ * evas_object_table_pack().
+ */
+EAPI Evas_Object *
+evas_object_table_add(Evas *evas)
+{
+   return evas_object_smart_add(evas, _evas_object_table_smart_class_new());
+}
+
+/**
+ * Create a table that is child of a given element @a parent.
+ *
+ * @see evas_object_table_add()
+ */
+EAPI Evas_Object *
+evas_object_table_add_to(Evas_Object *parent)
+{
+   Evas *evas;
+   Evas_Object *o;
+
+   evas = evas_object_evas_get(parent);
+   o = evas_object_table_add(evas);
+   evas_object_smart_member_add(o, parent);
+   return o;
+}
+
+/**
+ * Set how this table should layout children.
+ *
+ * @todo consider aspect hint and respect it.
+ *
+ * @par EVAS_OBJECT_TABLE_HOMOGENEOUS_NONE
+ * If table does not use homogeneous mode then columns and rows will
+ * be calculated based on hints of individual cells. This operation
+ * mode is more flexible, but more complex and heavy to calculate as
+ * well. @b Weight properties are handled as a boolean
+ * expand. Negative alignment will be considered as 0.5.
+ *
+ * @todo @c EVAS_OBJECT_TABLE_HOMOGENEOUS_NONE should balance weight.
+ *
+ * @par EVAS_OBJECT_TABLE_HOMOGENEOUS_TABLE
+ * When homogeneous is relative to table the own table size is divided
+ * equally among children, filling the whole table area. That is, if
+ * table has @c WIDTH and @c COLUMNS, each cell will get <tt>WIDTH /
+ * COLUMNS</tt> pixels. If children have minimum size that is larger
+ * than this amount (including padding), then it will overflow and be
+ * aligned respecting the alignment hint, possible overlapping sibling
+ * cells. @b Weight hint is used as a boolean, if greater than zero it
+ * will make the child expand in that axis, taking as much space as
+ * possible (bounded to maximum size hint). Negative alignment will be
+ * considered as 0.5.
+ *
+ * @par EVAS_OBJECT_TABLE_HOMOGENEOUS_ITEM
+ * When homogeneous is relative to item it means the greatest minimum
+ * cell size will be used. That is, if no element is set to expand,
+ * the table will have its contents to a minimum size, the bounding
+ * box of all these children will be aligned relatively to the table
+ * object using evas_object_table_align_get(). If the table area is
+ * too small to hold this minimum bounding box, then the objects will
+ * keep their size and the bounding box will overflow the box area,
+ * still respecting the alignment. @b Weight hint is used as a
+ * boolean, if greater than zero it will make that cell expand in that
+ * axis, toggling the <b>expand mode</b>, which makes the table behave
+ * much like @b EVAS_OBJECT_TABLE_HOMOGENEOUS_TABLE, except that the
+ * bounding box will overflow and items will not overlap siblings. If
+ * no minimum size is provided at all then the table will fallback to
+ * expand mode as well.
+ */
+EAPI void
+evas_object_table_homogeneous_set(Evas_Object *o, Evas_Object_Table_Homogeneous_Mode homogeneous)
+{
+   EVAS_OBJECT_TABLE_DATA_GET_OR_RETURN(o, priv);
+   if (priv->homogeneous == homogeneous)
+     return;
+   priv->homogeneous = homogeneous;
+   _evas_object_table_cache_invalidate(priv);
+   evas_object_smart_changed(o);
+}
+
+/**
+ * Get the current layout homogeneous mode.
+ *
+ * @see evas_object_table_homogeneous_set()
+ */
+EAPI Evas_Object_Table_Homogeneous_Mode
+evas_object_table_homogeneous_get(const Evas_Object *o)
+{
+   EVAS_OBJECT_TABLE_DATA_GET_OR_RETURN_VAL(o, priv, 0);
+   return priv->homogeneous;
+}
+
+/**
+ * Set the alignment of the whole bounding box of contents.
+ */
+EAPI void
+evas_object_table_align_set(Evas_Object *o, double horizontal, double vertical)
+{
+   EVAS_OBJECT_TABLE_DATA_GET_OR_RETURN(o, priv);
+   if (priv->align.h == horizontal && priv->align.v == vertical)
+     return;
+   priv->align.h = horizontal;
+   priv->align.v = vertical;
+   evas_object_smart_changed(o);
+}
+
+/**
+ * Get alignment of the whole bounding box of contents.
+ */
+EAPI void
+evas_object_table_align_get(const Evas_Object *o, double *horizontal, double *vertical)
+{
+   EVAS_OBJECT_TABLE_DATA_GET(o, priv);
+   if (priv)
+     {
+       if (horizontal) *horizontal = priv->align.h;
+       if (vertical) *vertical = priv->align.v;
+     }
+   else
+     {
+       if (horizontal) *horizontal = 0.5;
+       if (vertical) *vertical = 0.5;
+     }
+}
+
+/**
+ * Set padding between cells.
+ */
+EAPI void
+evas_object_table_padding_set(Evas_Object *o, Evas_Coord horizontal, Evas_Coord vertical)
+{
+   EVAS_OBJECT_TABLE_DATA_GET_OR_RETURN(o, priv);
+   if (priv->pad.h == horizontal && priv->pad.v == vertical)
+     return;
+   priv->pad.h = horizontal;
+   priv->pad.v = vertical;
+   _evas_object_table_cache_invalidate(priv);
+   evas_object_smart_changed(o);
+}
+
+/**
+ * Get padding between cells.
+ */
+EAPI void
+evas_object_table_padding_get(const Evas_Object *o, Evas_Coord *horizontal, Evas_Coord *vertical)
+{
+   EVAS_OBJECT_TABLE_DATA_GET(o, priv);
+   if (priv)
+     {
+       if (horizontal) *horizontal = priv->pad.h;
+       if (vertical) *vertical = priv->pad.v;
+     }
+   else
+     {
+       if (horizontal) *horizontal = 0;
+       if (vertical) *vertical = 0;
+     }
+}
+
+/**
+ * Add a new child to a table object.
+ *
+ * @param o The given table object.
+ * @param child The child object to add.
+ * @param col relative-horizontal position to place child.
+ * @param row relative-vertical position to place child.
+ * @param colspan how many relative-horizontal position to use for this child.
+ * @param rowspan how many relative-vertical position to use for this child.
+ *
+ * @return 1 on success, 0 on failure.
+ */
+EAPI Eina_Bool
+evas_object_table_pack(Evas_Object *o, Evas_Object *child, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan)
+{
+   Evas_Object_Table_Option *opt;
+
+   EVAS_OBJECT_TABLE_DATA_GET_OR_RETURN_VAL(o, priv, 0);
+
+   if (rowspan < 1)
+     {
+       ERR("rowspan < 1");
+       return EINA_FALSE;
+     }
+   if (colspan < 1)
+     {
+       ERR("colspan < 1");
+       return EINA_FALSE;
+     }
+
+   opt = _evas_object_table_option_get(child);
+   if (opt)
+     {
+       ERR("cannot add object that is already part of a table!");
+       return EINA_FALSE;
+     }
+
+   opt = malloc(sizeof(*opt));
+   if (!opt)
+     {
+       ERR("could not allocate table option data.");
+       return EINA_FALSE;
+     }
+
+   opt->obj = child;
+   opt->col = col;
+   opt->row = row;
+   opt->colspan = colspan;
+   opt->rowspan = rowspan;
+   opt->end_col = col + colspan;
+   opt->end_row = row + rowspan;
+   opt->min.w = 0;
+   opt->min.h = 0;
+   opt->max.w = 0;
+   opt->max.h = 0;
+   opt->align.h = 0.5;
+   opt->align.v = 0.5;
+   opt->pad.l = 0;
+   opt->pad.r = 0;
+   opt->pad.t = 0;
+   opt->pad.b = 0;
+   opt->expand_h = 0;
+   opt->expand_v = 0;
+
+   priv->children = eina_list_append(priv->children, opt);
+
+   if (priv->size.cols < opt->end_col)
+     priv->size.cols = opt->end_col;
+   if (priv->size.rows < opt->end_row)
+     priv->size.rows = opt->end_row;
+
+   _evas_object_table_option_set(child, opt);
+   evas_object_smart_member_add(child, o);
+   _evas_object_table_child_connect(o, child);
+   _evas_object_table_cache_invalidate(priv);
+   evas_object_smart_changed(o);
+
+   return EINA_TRUE;
+}
+
+static void
+_evas_object_table_remove_opt(Evas_Object_Table_Data *priv, Evas_Object_Table_Option *opt)
+{
+   Eina_List *l;
+   int max_row, max_col, was_greatest;
+
+   max_row = 0;
+   max_col = 0;
+   was_greatest = 0;
+   l = priv->children;
+   while (l)
+     {
+       Evas_Object_Table_Option *cur_opt = l->data;
+
+       if (cur_opt != opt)
+         {
+            if (max_col < cur_opt->end_col)
+              max_col = cur_opt->end_col;
+            if (max_row < cur_opt->end_row)
+              max_row = cur_opt->end_row;
+
+            l = l->next;
+         }
+       else
+         {
+            Eina_List *tmp = l->next;
+            priv->children = eina_list_remove_list(priv->children, l);
+
+            if ((priv->size.cols > opt->end_col) &&
+                (priv->size.rows > opt->end_row))
+              break;
+            else
+              {
+                 was_greatest = 1;
+                 l = tmp;
+              }
+         }
+     }
+
+   if (was_greatest)
+     {
+       priv->size.cols = max_col;
+       priv->size.rows = max_row;
+     }
+}
+
+/**
+ * Remove child from table.
+ *
+ * @note removing a child will immediately call a walk over children in order
+ *       to recalculate numbers of columns and rows. If you plan to remove
+ *       all children, use evas_object_table_clear() instead.
+ *
+ * @return 1 on success, 0 on failure.
+ */
+EAPI Eina_Bool
+evas_object_table_unpack(Evas_Object *o, Evas_Object *child)
+{
+   Evas_Object_Table_Option *opt;
+
+   EVAS_OBJECT_TABLE_DATA_GET_OR_RETURN_VAL(o, priv, 0);
+
+   if (o != evas_object_smart_parent_get(child))
+     {
+       ERR("cannot unpack child from incorrect table!");
+       return EINA_FALSE;
+     }
+
+   opt = _evas_object_table_option_del(child);
+   if (!opt)
+     {
+       ERR("cannot unpack child with no packing option!");
+       return EINA_FALSE;
+     }
+
+   _evas_object_table_child_disconnect(o, child);
+   _evas_object_table_remove_opt(priv, opt);
+   evas_object_smart_member_del(child);
+   free(opt);
+   _evas_object_table_cache_invalidate(priv);
+   evas_object_smart_changed(o);
+
+   return EINA_TRUE;
+}
+
+/**
+ * Faster way to remove all child objects from a table object.
+ *
+ * @param o The given table object.
+ * @param clear if true, it will delete just removed children.
+ */
+EAPI void
+evas_object_table_clear(Evas_Object *o, Eina_Bool clear)
+{
+   Evas_Object_Table_Option *opt;
+
+   EVAS_OBJECT_TABLE_DATA_GET_OR_RETURN(o, priv);
+
+   EINA_LIST_FREE(priv->children, opt)
+     {
+       _evas_object_table_child_disconnect(o, opt->obj);
+       _evas_object_table_option_del(opt->obj);
+       evas_object_smart_member_del(opt->obj);
+       if (clear)
+         evas_object_del(opt->obj);
+       free(opt);
+     }
+   priv->size.cols = 0;
+   priv->size.rows = 0;
+   _evas_object_table_cache_invalidate(priv);
+   evas_object_smart_changed(o);
+}
+
+/**
+ * Get the number of columns and rows this table takes.
+ *
+ * @note columns and rows are virtual entities, one can specify a table
+ *       with a single object that takes 4 columns and 5 rows. The only
+ *       difference for a single cell table is that paddings will be
+ *       accounted proportionally.
+ */
+EAPI void
+evas_object_table_col_row_size_get(const Evas_Object *o, int *cols, int *rows)
+{
+   EVAS_OBJECT_TABLE_DATA_GET(o, priv);
+   if (priv)
+     {
+       if (cols) *cols = priv->size.cols;
+       if (rows) *rows = priv->size.rows;
+     }
+   else
+     {
+       if (cols) *cols = -1;
+       if (rows) *rows = -1;
+     }
+}
+
+/**
+ * Get an iterator to walk the list of children for the table.
+ *
+ * @note Do not remove or delete objects while walking the list.
+ */
+EAPI Eina_Iterator *
+evas_object_table_iterator_new(const Evas_Object *o)
+{
+   Evas_Object_Table_Iterator *it;
+
+   EVAS_OBJECT_TABLE_DATA_GET_OR_RETURN_VAL(o, priv, NULL);
+
+   if (!priv->children) return NULL;
+
+   it = calloc(1, sizeof(Evas_Object_Table_Iterator));
+   if (!it) return NULL;
+
+   EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
+
+   it->real_iterator = eina_list_iterator_new(priv->children);
+   it->table = o;
+
+   it->iterator.next = FUNC_ITERATOR_NEXT(_evas_object_table_iterator_next);
+   it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_evas_object_table_iterator_get_container);
+   it->iterator.free = FUNC_ITERATOR_FREE(_evas_object_table_iterator_free);
+
+   return &it->iterator;
+}
+
+/**
+ * Get an accessor to get random access to the list of children for the table.
+ *
+ * @note Do not remove or delete objects while walking the list.
+ */
+EAPI Eina_Accessor *
+evas_object_table_accessor_new(const Evas_Object *o)
+{
+   Evas_Object_Table_Accessor *it;
+
+   EVAS_OBJECT_TABLE_DATA_GET_OR_RETURN_VAL(o, priv, NULL);
+
+   if (!priv->children) return NULL;
+
+   it = calloc(1, sizeof(Evas_Object_Table_Accessor));
+   if (!it) return NULL;
+
+   EINA_MAGIC_SET(&it->accessor, EINA_MAGIC_ACCESSOR);
+
+   it->real_accessor = eina_list_accessor_new(priv->children);
+   it->table = o;
+
+   it->accessor.get_at = FUNC_ACCESSOR_GET_AT(_evas_object_table_accessor_get_at);
+   it->accessor.get_container = FUNC_ACCESSOR_GET_CONTAINER(_evas_object_table_accessor_get_container);
+   it->accessor.free = FUNC_ACCESSOR_FREE(_evas_object_table_accessor_free);
+
+   return &it->accessor;
+}
+
+/**
+ * Get the list of children for the table.
+ *
+ * @note This is a duplicate of the list kept by the table internally.
+ *       It's up to the user to destroy it when it no longer needs it.
+ *       It's possible to remove objects from the table when walking this
+ *       list, but these removals won't be reflected on it.
+ */
+EAPI Eina_List *
+evas_object_table_children_get(const Evas_Object *o)
+{
+   Eina_List *new_list = NULL, *l;
+   Evas_Object_Table_Option *opt;
+
+   EVAS_OBJECT_TABLE_DATA_GET_OR_RETURN_VAL(o, priv, NULL);
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+      new_list = eina_list_append(new_list, opt->obj);
+
+   return new_list;
+}
+
+/**
+ * Get a child from the table using its coordinates
+ *
+ * @note This does not take into account col/row spanning
+ */
+Evas_Object *
+evas_object_table_child_get(const Evas_Object *o, unsigned short col, unsigned short row)
+{
+   Eina_List *l;
+   Evas_Object_Table_Option *opt;
+
+   EVAS_OBJECT_TABLE_DATA_GET_OR_RETURN_VAL(o, priv, NULL);
+
+   EINA_LIST_FOREACH(priv->children, l, opt)
+      if (opt->col == col && opt->row == row)
+         return opt->obj;
+   return NULL;
+}
diff --git a/src/lib/canvas/evas_object_text.c b/src/lib/canvas/evas_object_text.c
new file mode 100644 (file)
index 0000000..575b449
--- /dev/null
@@ -0,0 +1,1881 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/* save typing */
+#define ENFN obj->layer->evas->engine.func
+#define ENDT obj->layer->evas->engine.data.output
+
+/* private magic number for text objects */
+static const char o_type[] = "text";
+
+/* private struct for text object internal data */
+typedef struct _Evas_Object_Text      Evas_Object_Text;
+
+struct _Evas_Object_Text
+{
+   DATA32               magic;
+
+   struct {
+      const char       *text;
+      const char       *font;
+      const char       *source;
+      Evas_Font_Size    size;
+      struct {
+        unsigned char  r, g, b, a;
+      } outline, shadow, glow, glow2;
+
+      unsigned char     style;
+   } cur, prev;
+
+   float                ascent, descent;
+   float                max_ascent, max_descent;
+
+   void                *engine_data;
+
+   char                 changed : 1;
+};
+
+/* private methods for text objects */
+static void evas_object_text_init(Evas_Object *obj);
+static void *evas_object_text_new(void);
+static void evas_object_text_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
+static void evas_object_text_free(Evas_Object *obj);
+static void evas_object_text_render_pre(Evas_Object *obj);
+static void evas_object_text_render_post(Evas_Object *obj);
+
+static unsigned int evas_object_text_id_get(Evas_Object *obj);
+static unsigned int evas_object_text_visual_id_get(Evas_Object *obj);
+static void *evas_object_text_engine_data_get(Evas_Object *obj);
+
+static int evas_object_text_is_opaque(Evas_Object *obj);
+static int evas_object_text_was_opaque(Evas_Object *obj);
+
+static void evas_object_text_scale_update(Evas_Object *obj);
+
+static const Evas_Object_Func object_func =
+{
+   /* methods (compulsory) */
+   evas_object_text_free,
+     evas_object_text_render,
+     evas_object_text_render_pre,
+     evas_object_text_render_post,
+     evas_object_text_id_get,
+     evas_object_text_visual_id_get,
+     evas_object_text_engine_data_get,
+   /* these are optional. NULL = nothing */
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     evas_object_text_is_opaque,
+     evas_object_text_was_opaque,
+     NULL,
+     NULL,
+     NULL,
+     evas_object_text_scale_update,
+     NULL,
+     NULL
+};
+
+/* the actual api call to add a rect */
+/* it has no other api calls as all properties are standard */
+
+/**
+ * @addtogroup Evas_Object_Text
+ * @{
+ */
+
+/**
+ * Creates a new text @c Evas_Object on the provided @c Evas canvas.
+ *
+ * @param e The @c Evas canvas to create the text object upon.
+ *
+ * @see evas_object_text_font_source_set
+ * @see evas_object_text_font_set
+ * @see evas_object_text_text_set
+ *
+ * @returns NULL on error, A pointer to a new @c Evas_Object on success.
+ */
+EAPI Evas_Object *
+evas_object_text_add(Evas *e)
+{
+   Evas_Object *obj;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   obj = evas_object_new(e);
+   evas_object_text_init(obj);
+   evas_object_inject(obj, e);
+   return obj;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_text_font_source_set(Evas_Object *obj, const char *font_source)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return;
+   MAGIC_CHECK_END();
+
+   if ((o->cur.source) && (font_source) &&
+       (!strcmp(o->cur.source, font_source)))
+     return;
+   if (o->cur.source) eina_stringshare_del(o->cur.source);
+   if (font_source) o->cur.source = eina_stringshare_add(font_source);
+   else o->cur.source = NULL;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI const char *
+evas_object_text_font_source_get(const Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return NULL;
+   MAGIC_CHECK_END();
+   return o->cur.source;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_text_font_set(Evas_Object *obj, const char *font, Evas_Font_Size size)
+{
+   Evas_Object_Text *o;
+   int l = 0, r = 0, t = 0, b = 0;
+   int is, was = 0, pass = 0;
+   int same_font = 0;
+
+   if (!font) return;
+   if (size <= 0) return;
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return;
+   MAGIC_CHECK_END();
+
+   if ((o->cur.font) && (font) && (!strcmp(o->cur.font, font)))
+     {
+       same_font = 1;
+       if (size == o->cur.size) return;
+     }
+   if (obj->layer->evas->events_frozen <= 0)
+     {
+       pass = evas_event_passes_through(obj);
+       if (!pass)
+         was = evas_object_is_in_output_rect(obj,
+                                             obj->layer->evas->pointer.x,
+                                             obj->layer->evas->pointer.y, 1, 1);
+     }
+   /* DO IT */
+   if (o->engine_data)
+     {
+       evas_font_free(obj->layer->evas, o->engine_data);
+       o->engine_data = NULL;
+     }
+   if (!same_font)
+     {
+       if (o->cur.font) eina_stringshare_del(o->cur.font);
+       if (font) o->cur.font = eina_stringshare_add(font);
+       else o->cur.font = NULL;
+       o->prev.font = NULL;
+     }
+   o->cur.size = size;
+   o->engine_data = evas_font_load(obj->layer->evas, o->cur.font, o->cur.source,
+                                  (int)(((double)o->cur.size) * obj->cur.scale));
+   evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b);
+   if ((o->engine_data) && (o->cur.text))
+     {
+       int w, h;
+
+       ENFN->font_string_size_get(ENDT,
+                                  o->engine_data,
+                                  o->cur.text,
+                                  &w, &h);
+       o->ascent = ENFN->font_ascent_get(ENDT, o->engine_data);
+       o->descent = ENFN->font_descent_get(ENDT, o->engine_data);
+       o->max_ascent = ENFN->font_max_ascent_get(ENDT, o->engine_data);
+       o->max_descent = ENFN->font_max_descent_get(ENDT, o->engine_data);
+       obj->cur.geometry.w = w + l + r;
+       obj->cur.geometry.h = o->max_ascent + o->max_descent + t + b;
+////        obj->cur.cache.geometry.validity = 0;
+     }
+   else
+     {
+       if (o->engine_data)
+         {
+            o->ascent = ENFN->font_ascent_get(ENDT, o->engine_data);
+            o->descent = ENFN->font_descent_get(ENDT, o->engine_data);
+            o->max_ascent = ENFN->font_max_ascent_get(ENDT, o->engine_data);
+            o->max_descent = ENFN->font_max_descent_get(ENDT, o->engine_data);
+         }
+       else
+         {
+            o->ascent = 0;
+            o->descent = 0;
+            o->max_ascent = 0;
+            o->max_descent = 0;
+         }
+       obj->cur.geometry.w = 0;
+       obj->cur.geometry.h = o->max_ascent + o->max_descent + t + b;
+////   obj->cur.cache.geometry.validity = 0;
+     }
+   o->changed = 1;
+   evas_object_change(obj);
+   evas_object_clip_dirty(obj);
+   evas_object_coords_recalc(obj);
+   if (obj->layer->evas->events_frozen <= 0)
+     {
+       if (!pass)
+         {
+            is = evas_object_is_in_output_rect(obj,
+                                               obj->layer->evas->pointer.x,
+                                               obj->layer->evas->pointer.y, 1, 1);
+            if ((is ^ was) && obj->cur.visible)
+              evas_event_feed_mouse_move(obj->layer->evas,
+                                         obj->layer->evas->pointer.x,
+                                         obj->layer->evas->pointer.y,
+                                         obj->layer->evas->last_timestamp,
+                                         NULL);
+         }
+     }
+   evas_object_inform_call_resize(obj);
+}
+
+/**
+ * Query evas for font information of a text @c Evas_Object.
+ *
+ * This function allows the font name and size of a text @c Evas_Object as
+ * created with evas_object_text_add() to be queried. Be aware that the font
+ * name string is still owned by Evas and should NOT have free() called on
+ * it by the caller of the function.
+ *
+ * @param obj  The evas text object to query for font information.
+ * @param font A pointer to the location to store the font name in (may be NULL).
+ * @param size A pointer to the location to store the font size in (may be NULL).
+ */
+EAPI void
+evas_object_text_font_get(const Evas_Object *obj, const char **font, Evas_Font_Size *size)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   if (font) *font = "";
+   if (size) *size = 0;
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   if (font) *font = "";
+   if (size) *size = 0;
+   return;
+   MAGIC_CHECK_END();
+   if (font) *font = o->cur.font;
+   if (size) *size = o->cur.size;
+}
+
+/**
+ * Sets the text to be displayed by the given evas text object.
+ * @param obj  Evas text object.
+ * @param text Text to display.
+ */
+EAPI void
+evas_object_text_text_set(Evas_Object *obj, const char *text)
+{
+   Evas_Object_Text *o;
+   int is, was;
+
+   if (!text) text = "";
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return;
+   MAGIC_CHECK_END();
+   if ((o->cur.text) && (text) && (!strcmp(o->cur.text, text))) return;
+   was = evas_object_is_in_output_rect(obj,
+                                      obj->layer->evas->pointer.x,
+                                      obj->layer->evas->pointer.y, 1, 1);
+   /* DO II */
+   if (o->cur.text) eina_stringshare_del(o->cur.text);
+   if ((text) && (*text)) o->cur.text = eina_stringshare_add(text);
+   else o->cur.text = NULL;
+   o->prev.text = NULL;
+   if ((o->engine_data) && (o->cur.text))
+     {
+       int w, h;
+       int l = 0, r = 0, t = 0, b = 0;
+
+       ENFN->font_string_size_get(ENDT,
+                                  o->engine_data,
+                                  o->cur.text,
+                                  &w, &h);
+       evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b);
+       obj->cur.geometry.w = w + l + r;
+        obj->cur.geometry.h = h + t + b;
+////        obj->cur.cache.geometry.validity = 0;
+     }
+   else
+     {
+       int t = 0, b = 0;
+
+       evas_text_style_pad_get(o->cur.style, NULL, NULL, &t, &b);
+       obj->cur.geometry.w = 0;
+        obj->cur.geometry.h = o->max_ascent + o->max_descent + t + b;
+////        obj->cur.cache.geometry.validity = 0;
+     }
+   o->changed = 1;
+   evas_object_change(obj);
+   evas_object_clip_dirty(obj);
+   evas_object_coords_recalc(obj);
+   is = evas_object_is_in_output_rect(obj,
+                                     obj->layer->evas->pointer.x,
+                                     obj->layer->evas->pointer.y, 1, 1);
+   if ((is || was) && obj->cur.visible)
+     evas_event_feed_mouse_move(obj->layer->evas,
+                               obj->layer->evas->pointer.x,
+                               obj->layer->evas->pointer.y,
+                               obj->layer->evas->last_timestamp,
+                               NULL);
+   evas_object_inform_call_resize(obj);
+}
+
+/**
+ * Retrieves the text currently being displayed by the given evas text object.
+ * @param  obj The given evas text object.
+ * @return The text currently being displayed.  Do not free it.
+ */
+EAPI const char *
+evas_object_text_text_get(const Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return NULL;
+   MAGIC_CHECK_END();
+   return o->cur.text;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI Evas_Coord
+evas_object_text_ascent_get(const Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return 0;
+   MAGIC_CHECK_END();
+   return o->ascent;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI Evas_Coord
+evas_object_text_descent_get(const Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return 0;
+   MAGIC_CHECK_END();
+   return o->descent;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI Evas_Coord
+evas_object_text_max_ascent_get(const Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return 0;
+   MAGIC_CHECK_END();
+   return o->max_ascent;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI Evas_Coord
+evas_object_text_max_descent_get(const Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return 0;
+   MAGIC_CHECK_END();
+   return o->max_descent;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI Evas_Coord
+evas_object_text_inset_get(const Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return 0;
+   MAGIC_CHECK_END();
+   if (!o->engine_data) return 0;
+   if (!o->cur.text) return 0;
+   return ENFN->font_inset_get(ENDT, o->engine_data, o->cur.text);
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI Evas_Coord
+evas_object_text_horiz_advance_get(const Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return 0;
+   MAGIC_CHECK_END();
+   if (!o->engine_data) return 0;
+   if (!o->cur.text) return 0;
+   return ENFN->font_h_advance_get(ENDT, o->engine_data, o->cur.text);
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI Evas_Coord
+evas_object_text_vert_advance_get(const Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return 0;
+   MAGIC_CHECK_END();
+   if (!o->engine_data) return 0;
+   if (!o->cur.text) return o->ascent + o->descent;
+   return ENFN->font_v_advance_get(ENDT, o->engine_data, o->cur.text);
+}
+
+/**
+ * Retrieve position and dimension information of a character within a text @c Evas_Object.
+ *
+ * This function is used to obtain the X, Y, width and height of a the character
+ * located at @p pos within the @c Evas_Object @p obj. @p obj must be a text object
+ * as created with evas_object_text_add(). Any of the @c Evas_Coord parameters (@p cx,
+ * @p cy, @p cw, @p ch) may be NULL in which case no value will be assigned to that
+ * parameter.
+ *
+ * @param obj  The text object to retrieve position information for.
+ * @param pos  The character position to request co-ordinates for.
+ * @param cx   A pointer to an @c Evas_Coord to store the X value in (can be NULL).
+ * @param cy   A pointer to an @c Evas_Coord to store the Y value in (can be NULL).
+ * @param cw   A pointer to an @c Evas_Coord to store the Width value in (can be NULL).
+ * @param ch   A pointer to an @c Evas_Coord to store the Height value in (can be NULL).
+ *
+ * @returns EINA_FALSE on error, EINA_TRUE on success.
+ */
+EAPI Eina_Bool
+evas_object_text_char_pos_get(const Evas_Object *obj, int pos, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch)
+{
+   Evas_Object_Text *o;
+   int l = 0, r = 0, t = 0, b = 0;
+   int ret, x = 0, y = 0, w = 0, h = 0;
+   int inset;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return EINA_FALSE;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return EINA_FALSE;
+   MAGIC_CHECK_END();
+   if (!o->engine_data) return EINA_FALSE;
+   if (!o->cur.text) return EINA_FALSE;
+   inset =
+     ENFN->font_inset_get(ENDT, o->engine_data, o->cur.text);
+   ret = ENFN->font_char_coords_get(ENDT, o->engine_data, o->cur.text,
+                                                            pos,
+                                                            &x, &y,
+                                                            &w, &h);
+   evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b);
+   y += o->max_ascent - t;
+   x -= inset + l;
+   if (x < 0)
+     {
+       w += x;
+       x = 0;
+     }
+   if (x + w > obj->cur.geometry.w) w = obj->cur.geometry.w - x;
+   if (w < 0) w = 0;
+   if (y < 0)
+     {
+       h += y;
+       y = 0;
+     }
+   if (y + h > obj->cur.geometry.h) h = obj->cur.geometry.h - y;
+   if (h < 0) h = 0;
+   if (cx) *cx = x;
+   if (cy) *cy = y;
+   if (cw) *cw = w + l + r;
+   if (ch) *ch = h + t + b;
+   return ret;
+}
+
+
+/**
+ * Returns the logical position of the last char in the text
+ * up to the pos given. this is NOT the position of the last char
+ * because of the possibilty of RTL in the text.
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI int
+evas_object_text_last_up_to_pos(const Evas_Object *obj, Evas_Coord x, Evas_Coord y)
+{
+   Evas_Object_Text *o;
+   int inset;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return -1;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return -1;
+   MAGIC_CHECK_END();
+   if (!o->engine_data) return -1;
+   if (!o->cur.text) return -1;
+   inset =
+     ENFN->font_inset_get(ENDT, o->engine_data, o->cur.text);
+   return ENFN->font_last_up_to_pos(ENDT,
+                                      o->engine_data,
+                                      o->cur.text,
+                                      x + inset,
+                                      y - o->max_ascent);      
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI int
+evas_object_text_char_coords_get(const Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch)
+{
+   Evas_Object_Text *o;
+   int l = 0, r = 0, t = 0, b = 0;
+   int ret, rx = 0, ry = 0, rw = 0, rh = 0;
+   int inset;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return -1;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return -1;
+   MAGIC_CHECK_END();
+   if (!o->engine_data) return -1;
+   if (!o->cur.text) return -1;
+   inset =
+     ENFN->font_inset_get(ENDT, o->engine_data, o->cur.text);
+   ret = ENFN->font_char_at_coords_get(ENDT,
+                                      o->engine_data,
+                                      o->cur.text,
+                                      x + inset,
+                                      y - o->max_ascent,
+                                      &rx, &ry,
+                                      &rw, &rh);
+   evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b);
+   ry += o->max_ascent - t;
+   rx -= inset + l;
+   if (rx < 0)
+     {
+       rw += rx;
+       rx = 0;
+     }
+   if (rx + rw > obj->cur.geometry.w) rw = obj->cur.geometry.w - rx;
+   if (rw < 0) rw = 0;
+   if (ry < 0)
+     {
+       rh += ry;
+       ry = 0;
+     }
+   if (ry + rh > obj->cur.geometry.h) rh = obj->cur.geometry.h - ry;
+   if (rh < 0) rh = 0;
+   if (cx) *cx = rx;
+   if (cy) *cy = ry;
+   if (cw) *cw = rw + l + r;
+   if (ch) *ch = rh + t + b;
+   return ret;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_text_style_set(Evas_Object *obj, Evas_Text_Style_Type style)
+{
+   Evas_Object_Text *o;
+   int pl = 0, pr = 0, pt = 0, pb = 0, l = 0, r = 0, t = 0, b = 0;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return;
+   MAGIC_CHECK_END();
+   if (o->cur.style == style)
+     return;
+   evas_text_style_pad_get(o->cur.style, &pl, &pr, &pt, &pb);
+   o->cur.style = style;
+   evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b);
+   if (o->cur.text)
+     obj->cur.geometry.w += (l - pl) + (r - pr);
+   else
+     obj->cur.geometry.w = 0;
+   obj->cur.geometry.h += (t - pt) + (b - pb);
+   evas_object_change(obj);
+   evas_object_clip_dirty(obj);
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI Evas_Text_Style_Type
+evas_object_text_style_get(const Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return EVAS_TEXT_STYLE_PLAIN;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return EVAS_TEXT_STYLE_PLAIN;
+   MAGIC_CHECK_END();
+   return o->cur.style;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_text_shadow_color_set(Evas_Object *obj, int r, int g, int b, int a)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return;
+   MAGIC_CHECK_END();
+   if ((o->cur.shadow.r == r) && (o->cur.shadow.g == g) &&
+       (o->cur.shadow.b == b) && (o->cur.shadow.a == a))
+     return;
+   o->cur.shadow.r = r;
+   o->cur.shadow.g = g;
+   o->cur.shadow.b = b;
+   o->cur.shadow.a = a;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_text_shadow_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return;
+   MAGIC_CHECK_END();
+   if (r) *r = o->cur.shadow.r;
+   if (g) *g = o->cur.shadow.g;
+   if (b) *b = o->cur.shadow.b;
+   if (a) *a = o->cur.shadow.a;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_text_glow_color_set(Evas_Object *obj, int r, int g, int b, int a)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return;
+   MAGIC_CHECK_END();
+   if ((o->cur.glow.r == r) && (o->cur.glow.g == g) &&
+       (o->cur.glow.b == b) && (o->cur.glow.a == a))
+     return;
+   o->cur.glow.r = r;
+   o->cur.glow.g = g;
+   o->cur.glow.b = b;
+   o->cur.glow.a = a;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_text_glow_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return;
+   MAGIC_CHECK_END();
+   if (r) *r = o->cur.glow.r;
+   if (g) *g = o->cur.glow.g;
+   if (b) *b = o->cur.glow.b;
+   if (a) *a = o->cur.glow.a;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_text_glow2_color_set(Evas_Object *obj, int r, int g, int b, int a)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return;
+   MAGIC_CHECK_END();
+   if ((o->cur.glow2.r == r) && (o->cur.glow2.g == g) &&
+       (o->cur.glow2.b == b) && (o->cur.glow2.a == a))
+     return;
+   o->cur.glow2.r = r;
+   o->cur.glow2.g = g;
+   o->cur.glow2.b = b;
+   o->cur.glow2.a = a;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_text_glow2_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return;
+   MAGIC_CHECK_END();
+   if (r) *r = o->cur.glow2.r;
+   if (g) *g = o->cur.glow2.g;
+   if (b) *b = o->cur.glow2.b;
+   if (a) *a = o->cur.glow2.a;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_text_outline_color_set(Evas_Object *obj, int r, int g, int b, int a)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return;
+   MAGIC_CHECK_END();
+   if ((o->cur.outline.r == r) && (o->cur.outline.g == g) &&
+       (o->cur.outline.b == b) && (o->cur.outline.a == a))
+     return;
+   o->cur.outline.r = r;
+   o->cur.outline.g = g;
+   o->cur.outline.b = b;
+   o->cur.outline.a = a;
+   o->changed = 1;
+   evas_object_change(obj);
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_object_text_outline_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a)
+{
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return;
+   MAGIC_CHECK_END();
+   if (r) *r = o->cur.outline.r;
+   if (g) *g = o->cur.outline.g;
+   if (b) *b = o->cur.outline.b;
+   if (a) *a = o->cur.outline.a;
+}
+
+/**
+ * Gets the text style pad of a text object.
+ *
+ * @param obj The given text object.
+ * @param l The left pad (or NULL).
+ * @param r The right pad (or NULL).
+ * @param t The top pad (or NULL).
+ * @param b The bottom pad (or NULL).
+ *
+ */
+EAPI void
+evas_object_text_style_pad_get(const Evas_Object *obj, int *l, int *r, int *t, int *b)
+{
+   int sl = 0, sr = 0, st = 0, sb = 0;
+   Evas_Object_Text *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return;
+   MAGIC_CHECK_END();
+   /* use temps to be certain we have initialized values */
+   evas_text_style_pad_get(o->cur.style, &sl, &sr, &st, &sb);
+   if (l) *l = sl;
+   if (r) *r = sr;
+   if (t) *t = st;
+   if (b) *b = sb;
+}
+
+
+/**
+ * @}
+ */
+
+
+/**
+ * Removes all font paths loaded into memory for the given evas.
+ * @param   e The given evas.
+ * @ingroup Evas_Font_Path_Group
+ */
+EAPI void
+evas_font_path_clear(Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   while (e->font_path)
+     {
+       eina_stringshare_del(e->font_path->data);
+       e->font_path = eina_list_remove(e->font_path, e->font_path->data);
+     }
+}
+
+/**
+ * Appends a font path to the list of font paths used by the given evas.
+ * @param   e    The given evas.
+ * @param   path The new font path.
+ * @ingroup Evas_Font_Path_Group
+ */
+EAPI void
+evas_font_path_append(Evas *e, const char *path)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   if (!path) return;
+
+   e->font_path = eina_list_append(e->font_path, eina_stringshare_add(path));
+}
+
+/**
+ * Prepends a font path to the list of font paths used by the given evas.
+ * @param   e The given evas.
+ * @param   path The new font path.
+ * @ingroup Evas_Font_Path_Group
+ */
+EAPI void
+evas_font_path_prepend(Evas *e, const char *path)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if (!path) return;
+   e->font_path = eina_list_prepend(e->font_path, eina_stringshare_add(path));
+}
+
+/**
+ * Retrieves the list of font paths used by the given evas.
+ * @param   e The given evas.
+ * @return  The list of font paths used.
+ * @ingroup Evas_Font_Path_Group
+ */
+EAPI const Eina_List *
+evas_font_path_list(const Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   return e->font_path;
+}
+
+static void
+evas_font_object_rehint(Evas_Object *obj)
+{
+   if (obj->smart.smart)
+     {
+       EINA_INLIST_FOREACH(evas_object_smart_members_get_direct(obj), obj)
+         evas_font_object_rehint(obj);
+     }
+   else
+     {
+       if (!strcmp(obj->type, "text"))
+         _evas_object_text_rehint(obj);
+       if (!strcmp(obj->type, "textblock"))
+         _evas_object_textblock_rehint(obj);
+     }
+}
+
+/**
+ * Changes the font hinting for the given evas.
+ *
+ * @param e The given evas.
+ * @param hinting The hinting to use, one of #EVAS_FONT_HINTING_NONE,
+ *        #EVAS_FONT_HINTING_AUTO, #EVAS_FONT_HINTING_BYTECODE.
+ * @ingroup Evas_Font_Group
+ */
+EAPI void
+evas_font_hinting_set(Evas *e, Evas_Font_Hinting_Flags hinting)
+{
+   Evas_Layer *lay;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   if (e->hinting == hinting) return;
+   e->hinting = hinting;
+   EINA_INLIST_FOREACH(e->layers, lay)
+     {
+       Evas_Object *obj;
+
+       EINA_INLIST_FOREACH(lay->objects, obj)
+         evas_font_object_rehint(obj);
+     }
+}
+
+/**
+ * Retrieves the font hinting used by the given evas.
+ *
+ * @param e The given evas to query.
+ * @return The hinting in use, one of #EVAS_FONT_HINTING_NONE,
+ *         #EVAS_FONT_HINTING_AUTO, #EVAS_FONT_HINTING_BYTECODE.
+ * @ingroup Evas_Font_Group
+ */
+EAPI Evas_Font_Hinting_Flags
+evas_font_hinting_get(const Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return EVAS_FONT_HINTING_BYTECODE;
+   MAGIC_CHECK_END();
+   return e->hinting;
+}
+
+/**
+ * Checks if the font hinting is supported by the given evas.
+ *
+ * @param e The given evas to query.
+ * @param hinting The hinting to use, one of #EVAS_FONT_HINTING_NONE,
+ *        #EVAS_FONT_HINTING_AUTO, #EVAS_FONT_HINTING_BYTECODE.
+ * @return @c EINA_TRUE if it is supported, @c EINA_FALSE otherwise.
+ * @ingroup Evas_Font_Group
+ */
+EAPI Eina_Bool
+evas_font_hinting_can_hint(const Evas *e, Evas_Font_Hinting_Flags hinting)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return 0;
+   MAGIC_CHECK_END();
+   if (e->engine.func->font_hinting_can_hint)
+     return e->engine.func->font_hinting_can_hint(e->engine.data.output,
+                                                 hinting);
+   return EINA_FALSE;
+}
+
+/**
+ * Force the given evas and associated engine to flush its font cache.
+ *
+ * @param e The given evas to flush font cache.
+ * @ingroup Evas_Font_Group
+ */
+EAPI void
+evas_font_cache_flush(Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   e->engine.func->font_cache_flush(e->engine.data.output);
+}
+
+/**
+ * Changes the size of font cache of the given evas.
+ *
+ * @param e The given evas to flush font cache.
+ * @param size The size, in bytes.
+ *
+ * @ingroup Evas_Font_Group
+ */
+EAPI void
+evas_font_cache_set(Evas *e, int size)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if (size < 0) size = 0;
+   e->engine.func->font_cache_set(e->engine.data.output, size);
+}
+
+/**
+ * Changes the size of font cache of the given evas.
+ *
+ * @param e The given evas to flush font cache.
+ * @return The size, in bytes.
+ *
+ * @ingroup Evas_Font_Group
+ */
+EAPI int
+evas_font_cache_get(const Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return 0;
+   MAGIC_CHECK_END();
+
+   return e->engine.func->font_cache_get(e->engine.data.output);
+}
+
+/**
+ * List of available font descriptions known or found by this evas.
+ *
+ * The list depends on Evas compile time configuration, such as
+ * fontconfig support, and the paths provided at runtime as explained
+ * in @ref Evas_Font_Path_Group.
+ *
+ * @param e The evas instance to query.
+ * @return a newly allocated list of strings. Do not change the
+ *         strings.  Be sure to call evas_font_available_list_free()
+ *         after you're done.
+ *
+ * @ingroup Evas_Font_Group
+ */
+EAPI Eina_List *
+evas_font_available_list(const Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+
+   return evas_font_dir_available_list(e);
+}
+
+/**
+ * Free list of font descriptions returned by evas_font_dir_available_list().
+ *
+ * @param e The evas instance that returned such list.
+ * @param available the list returned by evas_font_dir_available_list().
+ *
+ * @ingroup Evas_Font_Group
+ */
+EAPI void
+evas_font_available_list_free(Evas *e, Eina_List *available)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   evas_font_dir_available_list_free(available);
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ * @ingroup Evas_Utils
+ */
+EAPI int
+evas_string_char_next_get(const char *str, int pos, int *decoded)
+{
+   int p, d;
+
+   if (decoded) *decoded = 0;
+   if (!str) return 0;
+   if (pos < 0) return 0;
+   p = pos;
+   d = evas_common_font_utf8_get_next((unsigned char *)str, &p);
+   if (decoded) *decoded = d;
+   return p;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ * @ingroup Evas_Utils
+ */
+EAPI int
+evas_string_char_prev_get(const char *str, int pos, int *decoded)
+{
+   int p, d;
+
+   if (decoded) *decoded = 0;
+   if (!str) return 0;
+   if (pos < 1) return 0;
+   p = pos;
+   d = evas_common_font_utf8_get_prev((unsigned char *)str, &p);
+   if (decoded) *decoded = d;
+   return p;
+}
+
+/**
+ * Get the length in characters of the string.
+ * @param  str The string to get the length of.
+ * @return The length in characters (not bytes)
+ * @ingroup Evas_Utils
+ */
+EAPI int
+evas_string_char_len_get(const char *str)
+{
+       if (!str) return 0;
+       return evas_common_font_utf8_get_len((const unsigned char *) str);
+}
+
+/**
+ * Get the minimum padding a style adds to the text.
+ * @param style The style to determine padding.
+ * @param     l Pointer to the current left padding value
+ * @param     r Pointer to the current right padding value
+ * @param     t Pointer to the current top padding value
+ * @param     b Pointer to the current bottom padding value
+ */
+void
+evas_text_style_pad_get(Evas_Text_Style_Type style, int *l, int *r, int *t, int *b)
+{
+   int sl, sr, st, sb;
+
+   if (l) sl = *l;
+   else sl = 0;
+
+   if (r) sr = *r;
+   else sr = 0;
+
+   if (t) st = *t;
+   else st = 0;
+
+   if (b) sb = *b;
+   else sb = 0;
+
+   if (style == EVAS_TEXT_STYLE_SHADOW)
+     {
+       if (sr < 1) sr = 1;
+       if (sb < 1) sb = 1;
+     }
+   else if (style == EVAS_TEXT_STYLE_OUTLINE)
+     {
+       if (sl < 1) sl = 1;
+       if (sr < 1) sr = 1;
+       if (st < 1) st = 1;
+       if (sb < 1) sb = 1;
+     }
+   else if (style == EVAS_TEXT_STYLE_SOFT_OUTLINE)
+     {
+       if (sl < 2) sl = 2;
+       if (sr < 2) sr = 2;
+       if (st < 2) st = 2;
+       if (sb < 2) sb = 2;
+     }
+   else if (style == EVAS_TEXT_STYLE_GLOW)
+     {
+       if (sl < 2) sl = 2;
+       if (sr < 2) sr = 2;
+       if (st < 2) st = 2;
+       if (sb < 2) sb = 2;
+     }
+   else if (style == EVAS_TEXT_STYLE_OUTLINE_SHADOW)
+     {
+       if (sl < 1) sl = 1;
+       if (sr < 2) sr = 2;
+       if (st < 1) st = 1;
+       if (sb < 2) sb = 2;
+     }
+   else if (style == EVAS_TEXT_STYLE_FAR_SHADOW)
+     {
+       if (sr < 2) sr = 2;
+       if (sb < 2) sb = 2;
+     }
+   else if (style == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW)
+     {
+       if (sl < 1) sl = 1;
+       if (sr < 3) sr = 3;
+       if (st < 1) st = 1;
+       if (sb < 3) sb = 3;
+     }
+   else if (style == EVAS_TEXT_STYLE_SOFT_SHADOW)
+     {
+       if (sl < 1) sl = 1;
+       if (sr < 3) sr = 3;
+       if (st < 1) st = 1;
+       if (sb < 3) sb = 3;
+     }
+   else if (style == EVAS_TEXT_STYLE_FAR_SOFT_SHADOW)
+     {
+       if (sr < 4) sr = 4;
+       if (sb < 4) sb = 4;
+     }
+
+   if (l) *l = sl;
+   if (r) *r = sr;
+   if (t) *t = st;
+   if (b) *b = sb;
+}
+
+/* all nice and private */
+static void
+evas_object_text_init(Evas_Object *obj)
+{
+   /* alloc text ob, setup methods and default values */
+   obj->object_data = evas_object_text_new();
+   /* set up default settings for this kind of object */
+   obj->cur.color.r = 255;
+   obj->cur.color.g = 255;
+   obj->cur.color.b = 255;
+   obj->cur.color.a = 255;
+   obj->cur.geometry.x = 0;
+   obj->cur.geometry.y = 0;
+   obj->cur.geometry.w = 0;
+   obj->cur.geometry.h = 0;
+   obj->cur.layer = 0;
+   /* set up object-specific settings */
+   obj->prev = obj->cur;
+   /* set up methods (compulsory) */
+   obj->func = &object_func;
+   obj->type = o_type;
+}
+
+static void *
+evas_object_text_new(void)
+{
+   Evas_Object_Text *o;
+
+   /* alloc obj private data */
+   o = calloc(1, sizeof(Evas_Object_Text));
+   o->magic = MAGIC_OBJ_TEXT;
+   o->prev = o->cur;
+   return o;
+}
+
+static void
+evas_object_text_free(Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+
+   /* frees private object data. very simple here */
+   o = (Evas_Object_Text *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
+   return;
+   MAGIC_CHECK_END();
+   /* free obj */
+   if (o->cur.text) eina_stringshare_del(o->cur.text);
+   if (o->cur.font) eina_stringshare_del(o->cur.font);
+   if (o->cur.source) eina_stringshare_del(o->cur.source);
+   if (o->engine_data) evas_font_free(obj->layer->evas, o->engine_data);
+   o->magic = 0;
+   free(o);
+}
+
+static void
+evas_object_text_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
+{
+   int i, j;
+   Evas_Object_Text *o;
+   const char vals[5][5] =
+     {
+         {0, 1, 2, 1, 0},
+         {1, 3, 4, 3, 1},
+         {2, 4, 5, 4, 2},
+         {1, 3, 4, 3, 1},
+         {0, 1, 2, 1, 0}
+     };
+   int sl = 0, st = 0;
+
+   /* render object to surface with context, and offxet by x,y */
+   o = (Evas_Object_Text *)(obj->object_data);
+   evas_text_style_pad_get(o->cur.style, &sl, NULL, &st, NULL);
+   ENFN->context_multiplier_unset(output, context);
+   ENFN->context_render_op_set(output, context, obj->cur.render_op);
+/*
+   ENFN->context_color_set(output,
+                           context,
+                           230, 160, 30, 100);
+   ENFN->rectangle_draw(output,
+                        context,
+                        surface,
+                        obj->cur.geometry.x + x,
+                        obj->cur.geometry.y + y,
+                        obj->cur.geometry.w,
+                        obj->cur.geometry.h);
+ */
+#define COLOR_ONLY_SET(object, sub, col) \
+       ENFN->context_color_set(output, context, \
+                               object->sub.col.r, \
+                               object->sub.col.g, \
+                               object->sub.col.b, \
+                               object->sub.col.a);
+
+#define COLOR_SET(object, sub, col) \
+        if (obj->cur.clipper)\
+          ENFN->context_color_set(output, context, \
+                               ((int)object->sub.col.r * ((int)obj->cur.clipper->cur.cache.clip.r + 1)) >> 8, \
+                               ((int)object->sub.col.g * ((int)obj->cur.clipper->cur.cache.clip.g + 1)) >> 8, \
+                               ((int)object->sub.col.b * ((int)obj->cur.clipper->cur.cache.clip.b + 1)) >> 8, \
+                               ((int)object->sub.col.a * ((int)obj->cur.clipper->cur.cache.clip.a + 1)) >> 8); \
+        else\
+          ENFN->context_color_set(output, context, \
+                               object->sub.col.r, \
+                               object->sub.col.g, \
+                               object->sub.col.b, \
+                               object->sub.col.a);
+
+#define COLOR_SET_AMUL(object, sub, col, amul) \
+        if (obj->cur.clipper) \
+           ENFN->context_color_set(output, context, \
+                               (((int)object->sub.col.r) * ((int)obj->cur.clipper->cur.cache.clip.r) * (amul)) / 65025, \
+                               (((int)object->sub.col.g) * ((int)obj->cur.clipper->cur.cache.clip.g) * (amul)) / 65025, \
+                               (((int)object->sub.col.b) * ((int)obj->cur.clipper->cur.cache.clip.b) * (amul)) / 65025, \
+                               (((int)object->sub.col.a) * ((int)obj->cur.clipper->cur.cache.clip.a) * (amul)) / 65025); \
+        else \
+           ENFN->context_color_set(output, context, \
+                               (((int)object->sub.col.r) * (amul)) / 255, \
+                               (((int)object->sub.col.g) * (amul)) / 255, \
+                               (((int)object->sub.col.b) * (amul)) / 255, \
+                               (((int)object->sub.col.a) * (amul)) / 255);
+
+#define DRAW_TEXT(ox, oy) \
+   if ((o->engine_data) && (o->cur.text)) \
+     ENFN->font_draw(output, \
+                    context, \
+                    surface, \
+                    o->engine_data, \
+                    obj->cur.geometry.x + x + sl + ox, \
+                    obj->cur.geometry.y + y + st + oy + \
+                    (int) \
+                    (((o->max_ascent * obj->cur.geometry.h) / obj->cur.geometry.h) - 0.5), \
+                    obj->cur.geometry.w, \
+                    obj->cur.geometry.h, \
+                    obj->cur.geometry.w, \
+                    obj->cur.geometry.h, \
+                    o->cur.text);
+#if 0
+#define DRAW_TEXT(ox, oy) \
+   if ((o->engine_data) && (o->cur.text)) \
+     ENFN->font_draw(output, \
+                    context, \
+                    surface, \
+                    o->engine_data, \
+                    obj->cur.cache.geometry.x + x + sl + ox - \
+                    ENFN->font_inset_get(ENDT, o->engine_data, o->cur.text), \
+                    obj->cur.cache.geometry.y + y + st + oy + \
+                    (int) \
+                    (((o->max_ascent * obj->cur.cache.geometry.h) / obj->cur.geometry.h) - 0.5), \
+                    obj->cur.cache.geometry.w, \
+                    obj->cur.cache.geometry.h, \
+                    obj->cur.geometry.w, \
+                    obj->cur.geometry.h, \
+                    o->cur.text);
+#endif
+   /* shadows */
+   if (o->cur.style == EVAS_TEXT_STYLE_SHADOW)
+     {
+       COLOR_SET(o, cur, shadow);
+        DRAW_TEXT(1, 1);
+     }
+   else if ((o->cur.style == EVAS_TEXT_STYLE_OUTLINE_SHADOW) ||
+           (o->cur.style == EVAS_TEXT_STYLE_FAR_SHADOW))
+     {
+       COLOR_SET(o, cur, shadow);
+        DRAW_TEXT(2, 2);
+     }
+   else if ((o->cur.style == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW) ||
+           (o->cur.style == EVAS_TEXT_STYLE_FAR_SOFT_SHADOW))
+     {
+       for (j = 0; j < 5; j++)
+         {
+            for (i = 0; i < 5; i++)
+              {
+                 if (vals[i][j] != 0)
+                   {
+                      COLOR_SET_AMUL(o, cur, shadow, vals[i][j] * 50);
+                      DRAW_TEXT(i, j);
+                   }
+              }
+         }
+     }
+   else if (o->cur.style == EVAS_TEXT_STYLE_SOFT_SHADOW)
+     {
+       for (j = 0; j < 5; j++)
+         {
+            for (i = 0; i < 5; i++)
+              {
+                 if (vals[i][j] != 0)
+                   {
+                      COLOR_SET_AMUL(o, cur, shadow, vals[i][j] * 50);
+                      DRAW_TEXT(i - 1, j - 1);
+                   }
+              }
+         }
+     }
+
+   /* glows */
+   if (o->cur.style == EVAS_TEXT_STYLE_GLOW)
+     {
+       for (j = 0; j < 5; j++)
+         {
+            for (i = 0; i < 5; i++)
+              {
+                 if (vals[i][j] != 0)
+                   {
+                      COLOR_SET_AMUL(o, cur, glow, vals[i][j] * 50);
+                      DRAW_TEXT(i - 2, j - 2);
+                   }
+              }
+         }
+       COLOR_SET(o, cur, glow2);
+       DRAW_TEXT(-1, 0);
+       DRAW_TEXT(1, 0);
+       DRAW_TEXT(0, -1);
+       DRAW_TEXT(0, 1);
+     }
+
+   /* outlines */
+   if ((o->cur.style == EVAS_TEXT_STYLE_OUTLINE) ||
+       (o->cur.style == EVAS_TEXT_STYLE_OUTLINE_SHADOW) ||
+       (o->cur.style == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW))
+     {
+       COLOR_SET(o, cur, outline);
+       DRAW_TEXT(-1, 0);
+       DRAW_TEXT(1, 0);
+       DRAW_TEXT(0, -1);
+       DRAW_TEXT(0, 1);
+     }
+   else if (o->cur.style == EVAS_TEXT_STYLE_SOFT_OUTLINE)
+     {
+       for (j = 0; j < 5; j++)
+         {
+            for (i = 0; i < 5; i++)
+              {
+                 if (((i != 2) || (j != 2)) && (vals[i][j] != 0))
+                   {
+                      COLOR_SET_AMUL(o, cur, outline, vals[i][j] * 50);
+                      DRAW_TEXT(i - 2, j - 2);
+                   }
+              }
+         }
+     }
+
+   /* normal text */
+   COLOR_ONLY_SET(obj, cur.cache, clip);
+   DRAW_TEXT(0, 0);
+}
+
+static void
+evas_object_text_render_pre(Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+   int is_v, was_v;
+
+   /* dont pre-render the obj twice! */
+   if (obj->pre_render_done) return;
+   obj->pre_render_done = 1;
+   /* pre-render phase. this does anything an object needs to do just before */
+   /* rendering. this could mean loading the image data, retrieving it from */
+   /* elsewhere, decoding video etc. */
+   /* then when this is done the object needs to figure if it changed and */
+   /* if so what and where and add thr appropriate redraw rectangles */
+   o = (Evas_Object_Text *)(obj->object_data);
+   /* if someone is clipping this obj - go calculate the clipper */
+   if (obj->cur.clipper)
+     {
+       if (obj->cur.cache.clip.dirty)
+         evas_object_clip_recalc(obj->cur.clipper);
+       obj->cur.clipper->func->render_pre(obj->cur.clipper);
+     }
+   /* now figure what changed and add draw rects */
+   /* if it just became visible or invisible */
+   is_v = evas_object_is_visible(obj);
+   was_v = evas_object_was_visible(obj);
+   if (is_v != was_v)
+     {
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+       goto done;
+     }
+   if ((obj->cur.map != obj->prev.map) ||
+       (obj->cur.usemap != obj->prev.usemap))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+        goto done;
+     }
+   /* its not visible - we accounted for it appearing or not so just abort */
+   if (!is_v) goto done;
+   /* clipper changed this is in addition to anything else for obj */
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
+   /* if we restacked (layer or just within a layer) and dont clip anyone */
+   if (obj->restack)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed color */
+   if ((obj->cur.color.r != obj->prev.color.r) ||
+       (obj->cur.color.g != obj->prev.color.g) ||
+       (obj->cur.color.b != obj->prev.color.b) ||
+       (obj->cur.color.a != obj->prev.color.a))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed geometry - and obviously not visibility or color */
+   /* caluclate differences since we have a constant color fill */
+   /* we really only need to update the differences */
+   if ((obj->cur.geometry.x != obj->prev.geometry.x) ||
+       (obj->cur.geometry.y != obj->prev.geometry.y) ||
+       (obj->cur.geometry.w != obj->prev.geometry.w) ||
+       (obj->cur.geometry.h != obj->prev.geometry.h))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   if (obj->cur.render_op != obj->prev.render_op)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   if (obj->cur.scale != obj->prev.scale)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   if (o->changed)
+     {
+       if ((o->cur.size != o->prev.size) ||
+           ((o->cur.font) && (o->prev.font) && (strcmp(o->cur.font, o->prev.font))) ||
+           ((o->cur.font) && (!o->prev.font)) ||
+           ((!o->cur.font) && (o->prev.font)) ||
+           ((o->cur.text) && (o->prev.text) && (strcmp(o->cur.text, o->prev.text))) ||
+           ((o->cur.text) && (!o->prev.text)) ||
+           ((!o->cur.text) && (o->prev.text)) ||
+           ((o->cur.style != o->prev.style)) ||
+           ((o->cur.shadow.r != o->prev.shadow.r)) ||
+           ((o->cur.shadow.g != o->prev.shadow.g)) ||
+           ((o->cur.shadow.b != o->prev.shadow.b)) ||
+           ((o->cur.shadow.a != o->prev.shadow.a)) ||
+           ((o->cur.outline.r != o->prev.outline.r)) ||
+           ((o->cur.outline.g != o->prev.outline.g)) ||
+           ((o->cur.outline.b != o->prev.outline.b)) ||
+           ((o->cur.outline.a != o->prev.outline.a)) ||
+           ((o->cur.glow.r != o->prev.glow.r)) ||
+           ((o->cur.glow.g != o->prev.glow.g)) ||
+           ((o->cur.glow.b != o->prev.glow.b)) ||
+           ((o->cur.glow.a != o->prev.glow.a)) ||
+           ((o->cur.glow2.r != o->prev.glow2.r)) ||
+           ((o->cur.glow2.g != o->prev.glow2.g)) ||
+           ((o->cur.glow2.b != o->prev.glow2.b)) ||
+           ((o->cur.glow2.a != o->prev.glow2.a)))
+         {
+            evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+            goto done;
+         }
+     }
+   done:
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+}
+
+static void
+evas_object_text_render_post(Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+
+   /* this moves the current data to the previous state parts of the object */
+   /* in whatever way is safest for the object. also if we don't need object */
+   /* data anymore we can free it if the object deems this is a good idea */
+   o = (Evas_Object_Text *)(obj->object_data);
+   /* remove those pesky changes */
+   evas_object_clip_changes_clean(obj);
+   /* move cur to prev safely for object data */
+   obj->prev = obj->cur;
+   o->prev = o->cur;
+   o->changed = 0;
+}
+
+static unsigned int evas_object_text_id_get(Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+
+   o = (Evas_Object_Text *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_TEXT;
+}
+
+static unsigned int evas_object_text_visual_id_get(Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+
+   o = (Evas_Object_Text *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_SHAPE;
+}
+
+static void *evas_object_text_engine_data_get(Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+
+   o = (Evas_Object_Text *)(obj->object_data);
+   if (!o) return NULL;
+   return o->engine_data;
+}
+
+static int
+evas_object_text_is_opaque(Evas_Object *obj)
+{
+   /* this returns 1 if the internal object data implies that the object is */
+   /* currently fulyl opque over the entire gradient it occupies */
+   return 0;
+}
+
+static int
+evas_object_text_was_opaque(Evas_Object *obj)
+{
+   /* this returns 1 if the internal object data implies that the object was */
+   /* currently fulyl opque over the entire gradient it occupies */
+   return 0;
+}
+
+static void
+evas_object_text_scale_update(Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+   int size;
+   const char *font;
+
+   o = (Evas_Object_Text *)(obj->object_data);
+   font = eina_stringshare_add(o->cur.font);
+   size = o->cur.size;
+   if (o->cur.font) eina_stringshare_del(o->cur.font);
+   o->cur.font = NULL;
+   o->prev.font = NULL;
+   o->cur.size = 0;
+   o->prev.size = 0;
+   evas_object_text_font_set(obj, font, size);
+}
+
+void
+_evas_object_text_rehint(Evas_Object *obj)
+{
+   Evas_Object_Text *o;
+   int is, was;
+
+   o = (Evas_Object_Text *)(obj->object_data);
+   if (!o->engine_data) return;
+   evas_font_load_hinting_set(obj->layer->evas, o->engine_data,
+                             obj->layer->evas->hinting);
+   was = evas_object_is_in_output_rect(obj,
+                                      obj->layer->evas->pointer.x,
+                                      obj->layer->evas->pointer.y, 1, 1);
+   /* DO II */
+   o->prev.text = NULL;
+   if ((o->engine_data) && (o->cur.text))
+     {
+       int w, h;
+       int l = 0, r = 0, t = 0, b = 0;
+
+       ENFN->font_string_size_get(ENDT,
+                                  o->engine_data,
+                                  o->cur.text,
+                                  &w, &h);
+       evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b);
+       obj->cur.geometry.w = w + l + r;
+       obj->cur.geometry.h = h + t + b;
+////   obj->cur.cache.geometry.validity = 0;
+     }
+   else
+     {
+       int t = 0, b = 0;
+
+       evas_text_style_pad_get(o->cur.style, NULL, NULL, &t, &b);
+       obj->cur.geometry.w = 0;
+       obj->cur.geometry.h = o->max_ascent + o->max_descent + t + b;
+////   obj->cur.cache.geometry.validity = 0;
+     }
+   o->changed = 1;
+   evas_object_change(obj);
+   evas_object_clip_dirty(obj);
+   evas_object_coords_recalc(obj);
+   is = evas_object_is_in_output_rect(obj,
+                                     obj->layer->evas->pointer.x,
+                                     obj->layer->evas->pointer.y, 1, 1);
+   if ((is || was) && obj->cur.visible)
+     evas_event_feed_mouse_move(obj->layer->evas,
+                               obj->layer->evas->pointer.x,
+                               obj->layer->evas->pointer.y,
+                               obj->layer->evas->last_timestamp,
+                               NULL);
+   evas_object_inform_call_resize(obj);
+}
diff --git a/src/lib/canvas/evas_object_textblock.c b/src/lib/canvas/evas_object_textblock.c
new file mode 100644 (file)
index 0000000..50f5295
--- /dev/null
@@ -0,0 +1,6039 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+/* save typing */
+#define ENFN obj->layer->evas->engine.func
+#define ENDT obj->layer->evas->engine.data.output
+
+/* private magic number for textblock objects */
+static const char o_type[] = "textblock";
+
+/* private struct for textblock object internal data */
+typedef struct _Evas_Object_Textblock             Evas_Object_Textblock;
+typedef struct _Evas_Object_Style_Tag             Evas_Object_Style_Tag;
+typedef struct _Evas_Object_Textblock_Node        Evas_Object_Textblock_Node;
+typedef struct _Evas_Object_Textblock_Line        Evas_Object_Textblock_Line;
+typedef struct _Evas_Object_Textblock_Item        Evas_Object_Textblock_Item;
+typedef struct _Evas_Object_Textblock_Format_Item Evas_Object_Textblock_Format_Item;
+typedef struct _Evas_Object_Textblock_Format      Evas_Object_Textblock_Format;
+
+/* the current state of the formatting */
+
+#define  NODE_TEXT   0
+#define  NODE_FORMAT 1
+
+struct _Evas_Object_Style_Tag
+{
+   EINA_INLIST;
+   char *tag;
+   char *replace;
+   size_t tag_len;
+   size_t replace_len;
+};
+
+struct _Evas_Object_Textblock_Node
+{
+   EINA_INLIST;
+   Eina_Strbuf *text;
+   int          type;
+};
+
+struct _Evas_Object_Textblock_Line
+{
+   EINA_INLIST;
+   Evas_Object_Textblock_Item        *items;
+   Evas_Object_Textblock_Format_Item *format_items;
+   int                                x, y, w, h;
+   int                                baseline;
+   int                                line_no;
+};
+
+struct _Evas_Object_Textblock_Item
+{
+   EINA_INLIST;
+   char                         *text;
+   Evas_Object_Textblock_Format *format;
+   Evas_Object_Textblock_Node   *source_node;
+   int                           x, w, h;
+   int                           inset, baseline;
+   int                           source_pos;
+   unsigned char                 type;
+};
+
+struct _Evas_Object_Textblock_Format_Item
+{
+   EINA_INLIST;
+   const char                   *item;
+   Evas_Object_Textblock_Node   *source_node;
+   int                           x, w, h, y, ascent, descent;
+   unsigned char                 vsize : 2;
+   unsigned char                 size : 2;
+   unsigned char                 formatme : 1;
+   unsigned char                 ___padding___ : 3;
+};
+
+struct _Evas_Object_Textblock_Format
+{
+   int                  ref;
+   double               halign;
+   double               valign;
+   struct {
+      const char       *name;
+      const char       *source;
+      const char       *fallbacks;
+      int               size;
+      void             *font;
+   } font;
+   struct {
+      struct {
+        unsigned char  r, g, b, a;
+      } normal, underline, underline2, outline, shadow, glow, glow2, backing,
+       strikethrough;
+   } color;
+   struct {
+      int               l, r;
+   } margin;
+   int                  tabstops;
+   int                  linesize;
+   double               linerelsize;
+   int                  linegap;
+   double               linerelgap;
+   unsigned char        style;
+   unsigned char        wrap_word : 1;
+   unsigned char        wrap_char : 1;
+   unsigned char        underline : 1;
+   unsigned char        underline2 : 1;
+   unsigned char        strikethrough : 1;
+   unsigned char        backing : 1;
+};
+
+struct _Evas_Textblock_Style
+{
+   char                  *style_text;
+   char                  *default_tag;
+   Evas_Object_Style_Tag *tags;
+   Eina_List             *objects;
+   unsigned char          delete_me : 1;
+};
+
+struct _Evas_Textblock_Cursor
+{
+   Evas_Object                *obj;
+   int                         pos;
+   Evas_Object_Textblock_Node *node;
+   Eina_Bool                   eol : 1;
+};
+
+struct _Evas_Object_Textblock
+{
+   DATA32                       magic;
+   Evas_Textblock_Style        *style;
+   Evas_Textblock_Cursor       *cursor;
+   Eina_List                   *cursors;
+   Evas_Object_Textblock_Node  *nodes;
+   Evas_Object_Textblock_Line  *lines;
+   int                          last_w;
+   struct {
+      int                       l, r, t, b;
+   } style_pad;
+   char                        *markup_text;
+   void                        *engine_data;
+   const char                  *repch;
+   struct {
+      int                       w, h;
+      unsigned char             valid : 1;
+   } formatted, native;
+   unsigned char                redraw : 1;
+   unsigned char                changed : 1;
+};
+
+/* private methods for textblock objects */
+static void evas_object_textblock_init(Evas_Object *obj);
+static void *evas_object_textblock_new(void);
+static void evas_object_textblock_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
+static void evas_object_textblock_free(Evas_Object *obj);
+static void evas_object_textblock_render_pre(Evas_Object *obj);
+static void evas_object_textblock_render_post(Evas_Object *obj);
+
+static unsigned int evas_object_textblock_id_get(Evas_Object *obj);
+static unsigned int evas_object_textblock_visual_id_get(Evas_Object *obj);
+static void *evas_object_textblock_engine_data_get(Evas_Object *obj);
+
+static int evas_object_textblock_is_opaque(Evas_Object *obj);
+static int evas_object_textblock_was_opaque(Evas_Object *obj);
+
+static void evas_object_textblock_coords_recalc(Evas_Object *obj);
+
+static void evas_object_textblock_scale_update(Evas_Object *obj);
+
+static const Evas_Object_Func object_func =
+{
+   /* methods (compulsory) */
+   evas_object_textblock_free,
+     evas_object_textblock_render,
+     evas_object_textblock_render_pre,
+     evas_object_textblock_render_post,
+     evas_object_textblock_id_get,
+     evas_object_textblock_visual_id_get,
+     evas_object_textblock_engine_data_get,
+   /* these are optional. NULL = nothing */
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     evas_object_textblock_is_opaque,
+     evas_object_textblock_was_opaque,
+     NULL,
+     NULL,
+     evas_object_textblock_coords_recalc,
+     evas_object_textblock_scale_update,
+     NULL,
+     NULL,
+     NULL
+};
+
+/* the actual api call to add a textblock */
+
+#define TB_HEAD() \
+   Evas_Object_Textblock *o; \
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); \
+   return; \
+   MAGIC_CHECK_END(); \
+   o = (Evas_Object_Textblock *)(obj->object_data); \
+   MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK); \
+   return; \
+   MAGIC_CHECK_END();
+
+#define TB_HEAD_RETURN(x) \
+   Evas_Object_Textblock *o; \
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); \
+   return (x); \
+   MAGIC_CHECK_END(); \
+   o = (Evas_Object_Textblock *)(obj->object_data); \
+   MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK); \
+   return (x); \
+   MAGIC_CHECK_END();
+
+
+/**
+ * @addtogroup Evas_Object_Textblock
+ * @{
+ */
+
+/* styles */
+static void
+_style_clear(Evas_Textblock_Style *ts)
+{
+   if (ts->style_text) free(ts->style_text);
+   if (ts->default_tag) free(ts->default_tag);
+   while (ts->tags)
+     {
+       Evas_Object_Style_Tag *tag;
+
+       tag = (Evas_Object_Style_Tag *)ts->tags;
+       ts->tags = (Evas_Object_Style_Tag *)eina_inlist_remove(EINA_INLIST_GET(ts->tags), EINA_INLIST_GET(tag));
+       free(tag->tag);
+       free(tag->replace);
+       free(tag);
+     }
+   ts->style_text = NULL;
+   ts->default_tag = NULL;
+   ts->tags = NULL;
+}
+
+static inline const char *
+_style_match_replace(Evas_Textblock_Style *ts, const char *s, size_t replace_len, size_t *tag_len)
+{
+   Evas_Object_Style_Tag *tag;
+
+   EINA_INLIST_FOREACH(ts->tags, tag)
+     {
+       if (tag->replace_len != replace_len) continue;
+       if (!strcmp(tag->replace, s))
+         {
+            *tag_len = tag->tag_len;
+            return tag->tag;
+         }
+     }
+   *tag_len = 0;
+   return NULL;
+}
+
+static inline const char *
+_style_match_tag(Evas_Textblock_Style *ts, const char *s, size_t tag_len, size_t *replace_len)
+{
+   Evas_Object_Style_Tag *tag;
+
+   EINA_INLIST_FOREACH(ts->tags, tag)
+     {
+       if (tag->tag_len != tag_len) continue;
+       if (!strcmp(tag->tag, s))
+         {
+            *replace_len = tag->replace_len;
+            return tag->replace;
+         }
+     }
+   *replace_len = 0;
+   return NULL;
+}
+
+static void
+_nodes_clear(const Evas_Object *obj)
+{
+   Evas_Object_Textblock *o;
+
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   while (o->nodes)
+     {
+       Evas_Object_Textblock_Node *n;
+
+       n = (Evas_Object_Textblock_Node *)o->nodes;
+       o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_remove(EINA_INLIST_GET(o->nodes), EINA_INLIST_GET(n));
+       if (n->text) eina_strbuf_free(n->text);
+       free(n);
+     }
+}
+
+static void
+_format_free(const Evas_Object *obj, Evas_Object_Textblock_Format *fmt)
+{
+   fmt->ref--;
+   if (fmt->ref > 0) return;
+   if (fmt->font.name) eina_stringshare_del(fmt->font.name);
+   if (fmt->font.fallbacks) eina_stringshare_del(fmt->font.fallbacks);
+   if (fmt->font.source) eina_stringshare_del(fmt->font.source);
+   evas_font_free(obj->layer->evas, fmt->font.font);
+   free(fmt);
+}
+
+static void
+_line_free(const Evas_Object *obj, Evas_Object_Textblock_Line *ln)
+{
+   while (ln->items)
+     {
+       Evas_Object_Textblock_Item *it;
+
+       it = (Evas_Object_Textblock_Item *)ln->items;
+       ln->items = (Evas_Object_Textblock_Item *)eina_inlist_remove(EINA_INLIST_GET(ln->items), EINA_INLIST_GET(ln->items));
+       if (it->text) free(it->text);
+       _format_free(obj, it->format);
+       free(it);
+     }
+   while (ln->format_items)
+     {
+       Evas_Object_Textblock_Format_Item *fi;
+
+       fi = (Evas_Object_Textblock_Format_Item *)ln->format_items;
+       ln->format_items = (Evas_Object_Textblock_Format_Item *)eina_inlist_remove(EINA_INLIST_GET(ln->format_items),
+                                                                                  EINA_INLIST_GET(ln->format_items));
+       if (fi->item) eina_stringshare_del(fi->item);
+       free(fi);
+     }
+   if (ln) free(ln);
+}
+
+static void
+_lines_clear(const Evas_Object *obj, Evas_Object_Textblock_Line *lines)
+{
+   while (lines)
+     {
+       Evas_Object_Textblock_Line *ln;
+
+       ln = (Evas_Object_Textblock_Line *)lines;
+       lines = (Evas_Object_Textblock_Line *)eina_inlist_remove(EINA_INLIST_GET(lines), EINA_INLIST_GET(ln));
+       _line_free(obj, ln);
+     }
+}
+
+static void
+_nodes_adjacent_merge(const Evas_Object *obj, Evas_Object_Textblock_Node *n1)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Node *n0, *n2;
+   Eina_List *l;
+   Evas_Textblock_Cursor *data;
+   int plen;
+
+   if (n1->type != NODE_TEXT) return;
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   n0 = (Evas_Object_Textblock_Node *)(EINA_INLIST_GET(n1))->prev;
+   n2 = (Evas_Object_Textblock_Node *)(EINA_INLIST_GET(n1))->next;
+   if ((n0) && (n0->type == NODE_TEXT))
+     {
+       plen = eina_strbuf_length_get(n0->text);
+       eina_strbuf_append_length(n0->text, eina_strbuf_string_get(n1->text),
+                                 eina_strbuf_length_get(n1->text));
+        o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_remove
+          (EINA_INLIST_GET(o->nodes), EINA_INLIST_GET(n1));
+//     (EINA_INLIST_GET(n0))->next = EINA_INLIST_GET(n2);
+//     if (n2) (EINA_INLIST_GET(n2))->prev = EINA_INLIST_GET(n0);
+       // fix any cursors in n1
+       if (n1 == o->cursor->node)
+         {
+            o->cursor->node = n0;
+            o->cursor->pos += plen;
+         }
+       EINA_LIST_FOREACH(o->cursors, l, data)
+         {
+            if (n1 == data->node)
+              {
+                 data->node = n0;
+                 data->pos += plen;
+              }
+         }
+       if (n1->text) eina_strbuf_free(n1->text);
+       free(n1);
+       n1 = n0;
+        n2 = (Evas_Object_Textblock_Node *)(EINA_INLIST_GET(n1))->next;
+     }
+   if ((n2) && (n2->type == NODE_TEXT))
+     {
+       n0 = n1;
+       n1 = n2;
+       n2 = (Evas_Object_Textblock_Node *)(EINA_INLIST_GET(n1))->next;
+       plen = eina_strbuf_length_get(n0->text);
+       eina_strbuf_append_length(n0->text, eina_strbuf_string_get(n1->text),
+                                 eina_strbuf_length_get(n1->text));
+        o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_remove
+          (EINA_INLIST_GET(o->nodes), EINA_INLIST_GET(n1));
+//     (EINA_INLIST_GET(n0))->next = EINA_INLIST_GET(n2);
+//     if (n2) (EINA_INLIST_GET(n2))->prev = EINA_INLIST_GET(n0);
+       // fix any cursors in n1
+       if (n1 == o->cursor->node)
+         {
+            o->cursor->node = n0;
+            o->cursor->pos += plen;
+         }
+       EINA_LIST_FOREACH(o->cursors, l, data)
+         {
+            if (n1 == data->node)
+              {
+                 data->node = n0;
+                 data->pos += plen;
+              }
+         }
+       if (n1->text) eina_strbuf_free(n1->text);
+       free(n1);
+     }
+}
+
+/* table of html escapes (that i can find) this should be ordered with the
+ * most common first as it's a linear search to match - no hash for this.
+ *
+ * these are stored as one large string and one additional array that
+ * contains the offsets to the tokens for space efficiency.
+ */
+static const char escape_strings[] =
+       /* most common escaped stuff */
+       " \0"          "\x20\0" /* NOTE: this here to avoid escaping to &nbsp */
+       "&nbsp;\0"     "\x20\0" /* NOTE: we allow nsbp's to break as we map early - maybe map to ascii 0x01 and then make the rendering code think 0x01 -> 0x20 */
+       "&quot;\0"     "\x22\0"
+       "&amp;\0"      "\x26\0"
+       "&lt;\0"       "\x3c\0"
+       "&gt;\0"       "\x3e\0"
+       /* all the rest */
+       "&iexcl;\0"    "\xc2\xa1\0"
+       "&cent;\0"     "\xc2\xa2\0"
+       "&pound;\0"    "\xc2\xa3\0"
+       "&curren;\0"   "\xc2\xa4\0"
+       "&yen;\0"      "\xc2\xa5\0"
+       "&brvbar;\0"   "\xc2\xa6\0"
+       "&sect;\0"     "\xc2\xa7\0"
+       "&uml;\0"      "\xc2\xa8\0"
+       "&copy;\0"     "\xc2\xa9\0"
+       "&ordf;\0"     "\xc2\xaa\0"
+       "&laquo;\0"    "\xc2\xab\0"
+       "&not;\0"      "\xc2\xac\0"
+       "&reg;\0"      "\xc2\xae\0"
+       "&macr;\0"     "\xc2\xaf\0"
+       "&deg;\0"      "\xc2\xb0\0"
+       "&plusmn;\0"   "\xc2\xb1\0"
+       "&sup2;\0"     "\xc2\xb2\0"
+       "&sup3;\0"     "\xc2\xb3\0"
+       "&acute;\0"    "\xc2\xb4\0"
+       "&micro;\0"    "\xc2\xb5\0"
+       "&para;\0"     "\xc2\xb6\0"
+       "&middot;\0"   "\xc2\xb7\0"
+       "&cedil;\0"    "\xc2\xb8\0"
+       "&sup1;\0"     "\xc2\xb9\0"
+       "&ordm;\0"     "\xc2\xba\0"
+       "&raquo;\0"    "\xc2\xbb\0"
+       "&frac14;\0"   "\xc2\xbc\0"
+       "&frac12;\0"   "\xc2\xbd\0"
+       "&frac34;\0"   "\xc2\xbe\0"
+       "&iquest;\0"   "\xc2\xbf\0"
+       "&Agrave;\0"   "\xc3\x80\0"
+       "&Aacute;\0"   "\xc3\x81\0"
+       "&Acirc;\0"    "\xc3\x82\0"
+       "&Atilde;\0"   "\xc3\x83\0"
+       "&Auml;\0"     "\xc3\x84\0"
+       "&Aring;\0"    "\xc3\x85\0"
+       "&Aelig;\0"    "\xc3\x86\0"
+       "&Ccedil;\0"   "\xc3\x87\0"
+       "&Egrave;\0"   "\xc3\x88\0"
+       "&Eacute;\0"   "\xc3\x89\0"
+       "&Ecirc;\0"    "\xc3\x8a\0"
+       "&Euml;\0"     "\xc3\x8b\0"
+       "&Egrave;\0"   "\xc3\x8c\0"
+       "&Eacute;\0"   "\xc3\x8d\0"
+       "&Icirc;\0"    "\xc3\x8e\0"
+       "&Iuml;\0"     "\xc3\x8f\0"
+       "&Eth;\0"      "\xc3\x90\0"
+       "&Ntilde;\0"   "\xc3\x91\0"
+       "&Ograve;\0"   "\xc3\x92\0"
+       "&Oacute;\0"   "\xc3\x93\0"
+       "&Ocirc;\0"    "\xc3\x94\0"
+       "&Otilde;\0"   "\xc3\x95\0"
+       "&Ouml;\0"     "\xc3\x96\0"
+       "&times;\0"    "\xc3\x97\0"
+       "&Oslash;\0"   "\xc3\x98\0"
+       "&Ugrave;\0"   "\xc3\x99\0"
+       "&Uacute;\0"   "\xc3\x9a\0"
+       "&Ucirc;\0"    "\xc3\x9b\0"
+       "&Yacute;\0"   "\xc3\x9d\0"
+       "&Thorn;\0"    "\xc3\x9e\0"
+       "&szlig;\0"    "\xc3\x9f\0"
+       "&agrave;\0"   "\xc3\xa0\0"
+       "&aacute;\0"   "\xc3\xa1\0"
+       "&acirc;\0"    "\xc3\xa2\0"
+       "&atilde;\0"   "\xc3\xa3\0"
+       "&auml;\0"     "\xc3\xa4\0"
+       "&aring;\0"    "\xc3\xa5\0"
+       "&aelig;\0"    "\xc3\xa6\0"
+       "&ccedil;\0"   "\xc3\xa7\0"
+       "&egrave;\0"   "\xc3\xa8\0"
+       "&eacute;\0"   "\xc3\xa9\0"
+       "&ecirc;\0"    "\xc3\xaa\0"
+       "&euml;\0"     "\xc3\xab\0"
+       "&igrave;\0"   "\xc3\xac\0"
+       "&iacute;\0"   "\xc3\xad\0"
+       "&icirc;\0"    "\xc3\xae\0"
+       "&iuml;\0"     "\xc3\xaf\0"
+       "&eth;\0"      "\xc3\xb0\0"
+       "&ntilde;\0"   "\xc3\xb1\0"
+       "&ograve;\0"   "\xc3\xb2\0"
+       "&oacute;\0"   "\xc3\xb3\0"
+       "&ocirc;\0"    "\xc3\xb4\0"
+       "&otilde;\0"   "\xc3\xb5\0"
+       "&ouml;\0"     "\xc3\xb6\0"
+       "&divide;\0"   "\xc3\xb7\0"
+       "&oslash;\0"   "\xc3\xb8\0"
+       "&ugrave;\0"   "\xc3\xb9\0"
+       "&uacute;\0"   "\xc3\xba\0"
+       "&ucirc;\0"    "\xc3\xbb\0"
+       "&uuml;\0"     "\xc3\xbc\0"
+       "&yacute;\0"   "\xc3\xbd\0"
+       "&thorn;\0"    "\xc3\xbe\0"
+       "&yuml;\0"     "\xc3\xbf\0"
+       "&alpha;\0"    "\xce\x91\0"
+       "&beta;\0"     "\xce\x92\0"
+       "&gamma;\0"    "\xce\x93\0"
+       "&delta;\0"    "\xce\x94\0"
+       "&epsilon;\0"  "\xce\x95\0"
+       "&zeta;\0"     "\xce\x96\0"
+       "&eta;\0"      "\xce\x97\0"
+       "&theta;\0"    "\xce\x98\0"
+       "&iota;\0"     "\xce\x99\0"
+       "&kappa;\0"    "\xce\x9a\0"
+       "&lambda;\0"   "\xce\x9b\0"
+       "&mu;\0"       "\xce\x9c\0"
+       "&nu;\0"       "\xce\x9d\0"
+       "&xi;\0"       "\xce\x9e\0"
+       "&omicron;\0"  "\xce\x9f\0"
+       "&pi;\0"       "\xce\xa0\0"
+       "&rho;\0"      "\xce\xa1\0"
+       "&sigma;\0"    "\xce\xa3\0"
+       "&tau;\0"      "\xce\xa4\0"
+       "&upsilon;\0"  "\xce\xa5\0"
+       "&phi;\0"      "\xce\xa6\0"
+       "&chi;\0"      "\xce\xa7\0"
+       "&psi;\0"      "\xce\xa8\0"
+       "&omega;\0"    "\xce\xa9\0"
+       "&hellip;\0"   "\xe2\x80\xa6\0"
+       "&euro;\0"     "\xe2\x82\xac\0"
+       "&larr;\0"     "\xe2\x86\x90\0"
+       "&uarr;\0"     "\xe2\x86\x91\0"
+       "&rarr;\0"     "\xe2\x86\x92\0"
+       "&darr;\0"     "\xe2\x86\x93\0"
+       "&harr;\0"     "\xe2\x86\x94\0"
+       "&larr;\0"     "\xe2\x87\x90\0"
+       "&rarr;\0"     "\xe2\x87\x92\0"
+       "&forall;\0"   "\xe2\x88\x80\0"
+       "&exist;\0"    "\xe2\x88\x83\0"
+       "&nabla;\0"    "\xe2\x88\x87\0"
+       "&prod;\0"     "\xe2\x88\x8f\0"
+       "&sum;\0"      "\xe2\x88\x91\0"
+       "&and;\0"      "\xe2\x88\xa7\0"
+       "&or;\0"       "\xe2\x88\xa8\0"
+       "&int;\0"      "\xe2\x88\xab\0"
+       "&ne;\0"       "\xe2\x89\xa0\0"
+       "&equiv;\0"    "\xe2\x89\xa1\0"
+       "&oplus;\0"    "\xe2\x8a\x95\0"
+       "&perp;\0"     "\xe2\x8a\xa5\0"
+;
+
+
+static int
+_is_white(int c)
+{
+   /*
+    * unicode list of whitespace chars
+    *
+    * 0009..000D <control-0009>..<control-000D>
+    * 0020 SPACE
+    * 0085 <control-0085>
+    * 00A0 NO-BREAK SPACE
+    * 1680 OGHAM SPACE MARK
+    * 180E MONGOLIAN VOWEL SEPARATOR
+    * 2000..200A EN QUAD..HAIR SPACE
+    * 2028 LINE SEPARATOR
+    * 2029 PARAGRAPH SEPARATOR
+    * 202F NARROW NO-BREAK SPACE
+    * 205F MEDIUM MATHEMATICAL SPACE
+    * 3000 IDEOGRAPHIC SPACE
+    */
+   if (
+       (c == 0x20) ||
+       ((c >= 0x9) && (c <= 0xd)) ||
+       (c == 0x85) ||
+       (c == 0xa0) ||
+       (c == 0x1680) ||
+       (c == 0x180e) ||
+       ((c >= 0x2000) && (c <= 0x200a)) ||
+       (c == 0x2028) ||
+       (c == 0x2029) ||
+       (c == 0x202f) ||
+       (c == 0x205f) ||
+       (c == 0x3000)
+       )
+     return 1;
+   return 0;
+}
+
+static char *
+_clean_white(int clean_start, int clean_end, char *str)
+{
+   char *p, *p2, *str2 = NULL;
+   int white, pwhite, start, ok;
+
+   return str;
+   str2 = malloc(strlen(str) + 2);
+   p = str;
+   p2 = str2;
+   white = 0;
+   start = 1;
+   ok = 1;
+   while (*p != 0)
+     {
+       pwhite = white;
+       if (isspace(*p) || _is_white(*p)) white = 1;
+       else white = 0;
+       if ((pwhite) && (white)) ok = 0;
+       else
+         {
+            if (!clean_start)
+              {
+                 if ((start) && (pwhite) && (!white))
+                   {
+//                    *p2 = ' ';
+//                    p2++;
+                   }
+              }
+            ok = 1;
+            if (!white) start = 0;
+         }
+       if (clean_start)
+         {
+            if ((start) && (ok)) ok = 0;
+         }
+       if (ok)
+         {
+            *p2 = *p;
+            p2++;
+         }
+       p++;
+     }
+   *p2 = 0;
+   if (clean_end)
+     {
+       while (p2 > str2)
+         {
+            p2--;
+            if (!(isspace(*p2) || _is_white(*p2))) break;
+            *p2 = 0;
+         }
+     }
+   free(str);
+   return str2;
+}
+
+static void
+_append_text_run(Evas_Object_Textblock *o, char *s, char *p)
+{
+   if ((s) && (p > s))
+     {
+       char *ts;
+
+       ts = alloca(p - s + 1);
+       strncpy(ts, s, p - s);
+       ts[p - s] = 0;
+       ts = _clean_white(0, 0, ts);
+       evas_textblock_cursor_text_append(o->cursor, ts);
+     }
+}
+
+static void
+_prepend_text_run(Evas_Object_Textblock *o, char *s, char *p)
+{
+   if ((s) && (p > s))
+     {
+       char *ts;
+
+       ts = alloca(p - s + 1);
+       strncpy(ts, s, p - s);
+       ts[p - s] = 0;
+       ts = _clean_white(0, 0, ts);
+       evas_textblock_cursor_text_prepend(o->cursor, ts);
+     }
+}
+
+
+static int
+_hex_string_get(char ch)
+{
+   if ((ch >= '0') && (ch <= '9')) return (ch - '0');
+   else if ((ch >= 'A') && (ch <= 'F')) return (ch - 'A' + 10);
+   else if ((ch >= 'a') && (ch <= 'f')) return (ch - 'a' + 10);
+   return 0;
+}
+
+static void
+_format_color_parse(const char *str, unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a)
+{
+   int slen;
+
+   slen = strlen(str);
+   *r = *g = *b = *a = 0;
+
+   if (slen == 7) /* #RRGGBB */
+     {
+       *r = (_hex_string_get(str[1]) << 4) | (_hex_string_get(str[2]));
+       *g = (_hex_string_get(str[3]) << 4) | (_hex_string_get(str[4]));
+       *b = (_hex_string_get(str[5]) << 4) | (_hex_string_get(str[6]));
+       *a = 0xff;
+     }
+   else if (slen == 9) /* #RRGGBBAA */
+     {
+       *r = (_hex_string_get(str[1]) << 4) | (_hex_string_get(str[2]));
+       *g = (_hex_string_get(str[3]) << 4) | (_hex_string_get(str[4]));
+       *b = (_hex_string_get(str[5]) << 4) | (_hex_string_get(str[6]));
+       *a = (_hex_string_get(str[7]) << 4) | (_hex_string_get(str[8]));
+     }
+   else if (slen == 4) /* #RGB */
+     {
+       *r = _hex_string_get(str[1]);
+       *r = (*r << 4) | *r;
+       *g = _hex_string_get(str[2]);
+       *g = (*g << 4) | *g;
+       *b = _hex_string_get(str[3]);
+       *b = (*b << 4) | *b;
+       *a = 0xff;
+     }
+   else if (slen == 5) /* #RGBA */
+     {
+       *r = _hex_string_get(str[1]);
+       *r = (*r << 4) | *r;
+       *g = _hex_string_get(str[2]);
+       *g = (*g << 4) | *g;
+       *b = _hex_string_get(str[3]);
+       *b = (*b << 4) | *b;
+       *a = _hex_string_get(str[4]);
+       *a = (*a << 4) | *a;
+     }
+   *r = (*r * *a) / 255;
+   *g = (*g * *a) / 255;
+   *b = (*b * *a) / 255;
+}
+
+static const char *fontstr = NULL;
+static const char *font_fallbacksstr = NULL;
+static const char *font_sizestr = NULL;
+static const char *font_sourcestr = NULL;
+static const char *colorstr = NULL;
+static const char *underline_colorstr = NULL;
+static const char *underline2_colorstr = NULL;
+static const char *outline_colorstr = NULL;
+static const char *shadow_colorstr = NULL;
+static const char *glow_colorstr = NULL;
+static const char *glow2_colorstr = NULL;
+static const char *backing_colorstr = NULL;
+static const char *strikethrough_colorstr = NULL;
+static const char *alignstr = NULL;
+static const char *valignstr = NULL;
+static const char *wrapstr = NULL;
+static const char *left_marginstr = NULL;
+static const char *right_marginstr = NULL;
+static const char *underlinestr = NULL;
+static const char *strikethroughstr = NULL;
+static const char *backingstr = NULL;
+static const char *stylestr = NULL;
+static const char *tabstopsstr = NULL;
+static const char *linesizestr = NULL;
+static const char *linerelsizestr = NULL;
+static const char *linegapstr = NULL;
+static const char *linerelgapstr = NULL;
+static const char *itemstr = NULL;
+
+static void
+_format_command_init(void)
+{
+   if (fontstr) return;
+   fontstr = eina_stringshare_add("font");
+   font_fallbacksstr = eina_stringshare_add("font_fallbacks");
+   font_sizestr = eina_stringshare_add("font_size");
+   font_sourcestr = eina_stringshare_add("font_source");
+   colorstr = eina_stringshare_add("color");
+   underline_colorstr = eina_stringshare_add("underline_color");
+   underline2_colorstr = eina_stringshare_add("underline2_color");
+   outline_colorstr = eina_stringshare_add("outline_color");
+   shadow_colorstr = eina_stringshare_add("shadow_color");
+   glow_colorstr = eina_stringshare_add("glow_color");
+   glow2_colorstr = eina_stringshare_add("glow2_color");
+   backing_colorstr = eina_stringshare_add("backing_color");
+   strikethrough_colorstr = eina_stringshare_add("strikethrough_color");
+   alignstr = eina_stringshare_add("align");
+   valignstr = eina_stringshare_add("valign");
+   wrapstr = eina_stringshare_add("wrap");
+   left_marginstr = eina_stringshare_add("left_margin");
+   right_marginstr = eina_stringshare_add("right_margin");
+   underlinestr = eina_stringshare_add("underline");
+   strikethroughstr = eina_stringshare_add("strikethrough");
+   backingstr = eina_stringshare_add("backing");
+   stylestr = eina_stringshare_add("style");
+   tabstopsstr = eina_stringshare_add("tabstops");
+   linesizestr = eina_stringshare_add("linesize");
+   linerelsizestr = eina_stringshare_add("linerelsize");
+   linegapstr = eina_stringshare_add("linegap");
+   linerelgapstr = eina_stringshare_add("linerelgap");
+   itemstr = eina_stringshare_add("item");
+}
+
+static void
+_format_command_shutdown(void)
+{
+   return;
+   eina_stringshare_del(fontstr);
+   eina_stringshare_del(font_fallbacksstr);
+   eina_stringshare_del(font_sizestr);
+   eina_stringshare_del(font_sourcestr);
+   eina_stringshare_del(colorstr);
+   eina_stringshare_del(underline_colorstr);
+   eina_stringshare_del(underline2_colorstr);
+   eina_stringshare_del(outline_colorstr);
+   eina_stringshare_del(shadow_colorstr);
+   eina_stringshare_del(glow_colorstr);
+   eina_stringshare_del(glow2_colorstr);
+   eina_stringshare_del(backing_colorstr);
+   eina_stringshare_del(strikethrough_colorstr);
+   eina_stringshare_del(alignstr);
+   eina_stringshare_del(valignstr);
+   eina_stringshare_del(wrapstr);
+   eina_stringshare_del(left_marginstr);
+   eina_stringshare_del(right_marginstr);
+   eina_stringshare_del(underlinestr);
+   eina_stringshare_del(strikethroughstr);
+   eina_stringshare_del(backingstr);
+   eina_stringshare_del(stylestr);
+   eina_stringshare_del(tabstopsstr);
+   eina_stringshare_del(linesizestr);
+   eina_stringshare_del(linerelsizestr);
+   eina_stringshare_del(linegapstr);
+   eina_stringshare_del(linerelgapstr);
+   eina_stringshare_del(itemstr);
+}
+
+static void
+_format_clean_param(char *dst, const char *src)
+{
+   const char *ss;
+   char *ds;
+
+   ds = dst;
+   for (ss = src; *ss; ss++, ds++)
+     {
+        if ((*ss == '\\') && *(ss + 1)) ss++;
+        *ds = *ss;
+     }
+   *ds = 0;
+}
+
+static void
+_format_command(Evas_Object *obj, Evas_Object_Textblock_Format *fmt, const char *cmd, const char *param)
+{
+   int new_font = 0;
+   char *tmp_param;
+
+   tmp_param = alloca(strlen(param) + 1);
+
+   _format_clean_param(tmp_param, param);
+   if (cmd == fontstr)
+     {
+       if ((!fmt->font.name) ||
+           ((fmt->font.name) && (strcmp(fmt->font.name, tmp_param))))
+         {
+            if (fmt->font.name) eina_stringshare_del(fmt->font.name);
+            fmt->font.name = eina_stringshare_add(tmp_param);
+            new_font = 1;
+         }
+     }
+   else if (cmd == font_fallbacksstr)
+     {
+       if ((!fmt->font.fallbacks) ||
+           ((fmt->font.fallbacks) && (strcmp(fmt->font.fallbacks, tmp_param))))
+         {
+            /* policy - when we say "fallbacks" do we prepend and use prior
+             * fallbacks... or should we replace. for now we replace
+             */
+            if (fmt->font.fallbacks) eina_stringshare_del(fmt->font.fallbacks);
+            fmt->font.fallbacks = eina_stringshare_add(tmp_param);
+            new_font = 1;
+         }
+     }
+   else if (cmd == font_sizestr)
+     {
+       int v;
+
+       v = atoi(tmp_param);
+       if (v != fmt->font.size)
+         {
+            fmt->font.size = v;
+            new_font = 1;
+         }
+     }
+   else if (cmd == font_sourcestr)
+     {
+       if ((!fmt->font.source) ||
+           ((fmt->font.source) && (strcmp(fmt->font.source, tmp_param))))
+         {
+            if (fmt->font.source) eina_stringshare_del(fmt->font.source);
+            fmt->font.source = eina_stringshare_add(tmp_param);
+            new_font = 1;
+         }
+     }
+   else if (cmd == colorstr)
+     _format_color_parse(tmp_param,
+                        &(fmt->color.normal.r), &(fmt->color.normal.g),
+                        &(fmt->color.normal.b), &(fmt->color.normal.a));
+   else if (cmd == underline_colorstr)
+     _format_color_parse(tmp_param,
+                        &(fmt->color.underline.r), &(fmt->color.underline.g),
+                        &(fmt->color.underline.b), &(fmt->color.underline.a));
+   else if (cmd == underline2_colorstr)
+     _format_color_parse(tmp_param,
+                        &(fmt->color.underline2.r), &(fmt->color.underline2.g),
+                        &(fmt->color.underline2.b), &(fmt->color.underline2.a));
+   else if (cmd == outline_colorstr)
+     _format_color_parse(tmp_param,
+                        &(fmt->color.outline.r), &(fmt->color.outline.g),
+                        &(fmt->color.outline.b), &(fmt->color.outline.a));
+   else if (cmd == shadow_colorstr)
+     _format_color_parse(tmp_param,
+                        &(fmt->color.shadow.r), &(fmt->color.shadow.g),
+                        &(fmt->color.shadow.b), &(fmt->color.shadow.a));
+   else if (cmd == glow_colorstr)
+     _format_color_parse(tmp_param,
+                        &(fmt->color.glow.r), &(fmt->color.glow.g),
+                        &(fmt->color.glow.b), &(fmt->color.glow.a));
+   else if (cmd == glow2_colorstr)
+     _format_color_parse(tmp_param,
+                        &(fmt->color.glow2.r), &(fmt->color.glow2.g),
+                        &(fmt->color.glow2.b), &(fmt->color.glow2.a));
+   else if (cmd == backing_colorstr)
+     _format_color_parse(tmp_param,
+                        &(fmt->color.backing.r), &(fmt->color.backing.g),
+                        &(fmt->color.backing.b), &(fmt->color.backing.a));
+   else if (cmd == strikethrough_colorstr)
+     _format_color_parse(tmp_param,
+                        &(fmt->color.strikethrough.r), &(fmt->color.strikethrough.g),
+                        &(fmt->color.strikethrough.b), &(fmt->color.strikethrough.a));
+   else if (cmd == alignstr)
+     {
+       if (!strcmp(tmp_param, "middle")) fmt->halign = 0.5;
+       else if (!strcmp(tmp_param, "center")) fmt->halign = 0.5;
+       else if (!strcmp(tmp_param, "left")) fmt->halign = 0.0;
+       else if (!strcmp(tmp_param, "right")) fmt->halign = 1.0;
+       else
+         {
+            char *endptr = NULL;
+            double val = strtod(tmp_param, &endptr);
+            if (endptr)
+              {
+                 while (*endptr && _is_white(*endptr))
+                   endptr++;
+                 if (*endptr == '%')
+                   val /= 100.0;
+              }
+            fmt->halign = val;;
+            if (fmt->halign < 0.0) fmt->halign = 0.0;
+            else if (fmt->halign > 1.0) fmt->halign = 1.0;
+         }
+     }
+   else if (cmd == valignstr)
+     {
+        if (!strcmp(tmp_param, "top")) fmt->valign = 0.0;
+       else if (!strcmp(tmp_param, "middle")) fmt->valign = 0.5;
+       else if (!strcmp(tmp_param, "center")) fmt->valign = 0.5;
+       else if (!strcmp(tmp_param, "bottom")) fmt->valign = 1.0;
+       else if (!strcmp(tmp_param, "baseline")) fmt->valign = -1.0;
+       else if (!strcmp(tmp_param, "base")) fmt->valign = -1.0;
+       else
+         {
+            char *endptr = NULL;
+            double val = strtod(tmp_param, &endptr);
+            if (endptr)
+              {
+                 while (*endptr && _is_white(*endptr))
+                   endptr++;
+                 if (*endptr == '%')
+                   val /= 100.0;
+              }
+            fmt->valign = val;
+            if (fmt->valign < 0.0) fmt->valign = 0.0;
+            else if (fmt->valign > 1.0) fmt->valign = 1.0;
+         }
+     }
+   else if (cmd == wrapstr)
+     {
+       if (!strcmp(tmp_param, "word"))
+         {
+            fmt->wrap_word = 1;
+            fmt->wrap_char = 0;
+         }
+       else if (!strcmp(tmp_param, "char"))
+         {
+            fmt->wrap_word = 0;
+            fmt->wrap_char = 1;
+         }
+       else
+         {
+            fmt->wrap_word = 0;
+            fmt->wrap_char = 0;
+         }
+     }
+   else if (cmd == left_marginstr)
+     {
+       if (!strcmp(tmp_param, "reset"))
+         fmt->margin.l = 0;
+       else
+         {
+            if (tmp_param[0] == '+')
+              fmt->margin.l += atoi(&(tmp_param[1]));
+            else if (tmp_param[0] == '-')
+              fmt->margin.l -= atoi(&(tmp_param[1]));
+            else
+              fmt->margin.l = atoi(tmp_param);
+            if (fmt->margin.l < 0) fmt->margin.l = 0;
+         }
+     }
+   else if (cmd == right_marginstr)
+     {
+       if (!strcmp(tmp_param, "reset"))
+         fmt->margin.r = 0;
+       else
+         {
+            if (tmp_param[0] == '+')
+              fmt->margin.r += atoi(&(tmp_param[1]));
+            else if (tmp_param[0] == '-')
+              fmt->margin.r -= atoi(&(tmp_param[1]));
+            else
+              fmt->margin.r = atoi(tmp_param);
+            if (fmt->margin.r < 0) fmt->margin.r = 0;
+         }
+     }
+   else if (cmd == underlinestr)
+     {
+       if (!strcmp(tmp_param, "off"))
+         {
+            fmt->underline = 0;
+            fmt->underline2 = 0;
+         }
+       else if ((!strcmp(tmp_param, "on")) ||
+                (!strcmp(tmp_param, "single")))
+         {
+            fmt->underline = 1;
+            fmt->underline2 = 0;
+         }
+       else if (!strcmp(tmp_param, "double"))
+         {
+            fmt->underline = 1;
+            fmt->underline2 = 1;
+         }
+     }
+   else if (cmd == strikethroughstr)
+     {
+       if (!strcmp(tmp_param, "off"))
+         fmt->strikethrough = 0;
+       else if (!strcmp(tmp_param, "on"))
+         fmt->strikethrough = 1;
+     }
+   else if (cmd == backingstr)
+     {
+       if (!strcmp(tmp_param, "off"))
+         fmt->backing = 0;
+       else if (!strcmp(tmp_param, "on"))
+         fmt->backing = 1;
+     }
+   else if (cmd == stylestr)
+     {
+       if (!strcmp(tmp_param, "off")) fmt->style = EVAS_TEXT_STYLE_PLAIN;
+       else if (!strcmp(tmp_param, "none")) fmt->style = EVAS_TEXT_STYLE_PLAIN;
+       else if (!strcmp(tmp_param, "plain")) fmt->style = EVAS_TEXT_STYLE_PLAIN;
+       else if (!strcmp(tmp_param, "shadow")) fmt->style = EVAS_TEXT_STYLE_SHADOW;
+       else if (!strcmp(tmp_param, "outline")) fmt->style = EVAS_TEXT_STYLE_OUTLINE;
+       else if (!strcmp(tmp_param, "soft_outline")) fmt->style = EVAS_TEXT_STYLE_SOFT_OUTLINE;
+       else if (!strcmp(tmp_param, "outline_shadow")) fmt->style = EVAS_TEXT_STYLE_OUTLINE_SHADOW;
+       else if (!strcmp(tmp_param, "outline_soft_shadow")) fmt->style = EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW;
+       else if (!strcmp(tmp_param, "glow")) fmt->style = EVAS_TEXT_STYLE_GLOW;
+       else if (!strcmp(tmp_param, "far_shadow")) fmt->style = EVAS_TEXT_STYLE_FAR_SHADOW;
+       else if (!strcmp(tmp_param, "soft_shadow")) fmt->style = EVAS_TEXT_STYLE_SOFT_SHADOW;
+       else if (!strcmp(tmp_param, "far_soft_shadow")) fmt->style = EVAS_TEXT_STYLE_FAR_SOFT_SHADOW;
+       else fmt->style = EVAS_TEXT_STYLE_PLAIN;
+     }
+   else if (cmd == tabstopsstr)
+     {
+       fmt->tabstops = atoi(tmp_param);
+       if (fmt->tabstops < 1) fmt->tabstops = 1;
+     }
+   else if (cmd == linesizestr)
+     {
+        fmt->linesize = atoi(tmp_param);
+        fmt->linerelsize = 0.0;
+     }
+   else if (cmd == linerelsizestr)
+     {
+       char *endptr = NULL;
+       double val = strtod(tmp_param, &endptr);
+       if (endptr)
+         {
+            while (*endptr && _is_white(*endptr))
+              endptr++;
+            if (*endptr == '%')
+              {
+                 fmt->linerelsize = val / 100.0;
+                 fmt->linesize = 0;
+                 if (fmt->linerelsize < 0.0) fmt->linerelsize = 0.0;
+              }
+          }
+     }
+   else if (cmd == linegapstr)
+     {
+        fmt->linegap = atoi(tmp_param);
+        fmt->linerelgap = 0.0;
+     }
+   else if (cmd == linerelgapstr)
+     {
+       char *endptr = NULL;
+       double val = strtod(tmp_param, &endptr);
+       if (endptr)
+         {
+            while (*endptr && _is_white(*endptr))
+              endptr++;
+            if (*endptr == '%')
+              {
+                 fmt->linerelgap = val / 100.0;
+                 fmt->linegap = 0;
+                 if (fmt->linerelgap < 0.0) fmt->linerelgap = 0.0;
+              }
+          }
+     }
+
+   if (new_font)
+     {
+       void *of;
+       char *buf = NULL;
+
+       of = fmt->font.font;
+       if ((fmt->font.name) && (fmt->font.fallbacks))
+         {
+            buf = malloc(strlen(fmt->font.name) + 1 + strlen(fmt->font.fallbacks) + 1);
+            strcpy(buf, fmt->font.name);
+            strcat(buf, ",");
+            strcat(buf, fmt->font.fallbacks);
+         }
+       else if (fmt->font.name)
+         buf = strdup(fmt->font.name);
+
+       fmt->font.font = evas_font_load(obj->layer->evas,
+                                       buf, fmt->font.source,
+                                       (int)(((double)fmt->font.size) * obj->cur.scale));
+       if (buf) free(buf);
+       if (of) evas_font_free(obj->layer->evas, of);
+     }
+}
+
+static int
+_format_is_param(char *item)
+{
+   if (strchr(item, '=')) return 1;
+   return 0;
+}
+
+static void
+_format_param_parse(char *item, const char **key, const char **val)
+{
+   char *p;
+   const char *k, *v;
+
+   p = strchr(item, '=');
+   *p = '\0';
+   k = eina_stringshare_add(item);
+   *key = k;
+   *p = '=';
+   p++;
+   v = eina_stringshare_add(p);
+   *val = v;
+}
+
+static char *
+_format_parse(char **s)
+{
+   char *p, *item;
+   char *s1 = NULL, *s2 = NULL;
+
+   p = *s;
+   if (*p == 0) return NULL;
+   for (;;)
+     {
+       if (!s1)
+         {
+            if (*p != ' ') s1 = p;
+            if (*p == 0) break;
+         }
+       else if (!s2)
+         {
+            if ((p > *s) && (p[-1] != '\\'))
+              {
+                 if (*p == ' ') s2 = p;
+              }
+            if (*p == 0) s2 = p;
+         }
+       p++;
+       if (s1 && s2)
+         {
+            item = s1;
+
+            *s = s2;
+            return item;
+         }
+     }
+   *s = p;
+   return NULL;
+}
+
+static void
+_format_fill(Evas_Object *obj, Evas_Object_Textblock_Format *fmt, char *str)
+{
+   char *s;
+   char *item;
+
+   s = str;
+
+   /* get rid of anything +s or -s off the start of the string */
+   while ((*s == ' ') || (*s == '+') || (*s == '-')) s++;
+
+   while ((item = _format_parse(&s)))
+     {
+       char tmp_delim = *s;
+       *s = '\0';
+       if (_format_is_param(item))
+         {
+            const char *key = NULL, *val = NULL;
+
+            _format_param_parse(item, &key, &val);
+            _format_command(obj, fmt, key, val);
+            eina_stringshare_del(key);
+            eina_stringshare_del(val);
+         }
+       else
+         {
+            /* immediate - not handled here */
+         }
+       *s = tmp_delim;
+     }
+}
+
+static Evas_Object_Textblock_Format *
+_format_dup(Evas_Object *obj, Evas_Object_Textblock_Format *fmt)
+{
+   Evas_Object_Textblock_Format *fmt2;
+   char *buf = NULL;
+
+   fmt2 = calloc(1, sizeof(Evas_Object_Textblock_Format));
+   memcpy(fmt2, fmt, sizeof(Evas_Object_Textblock_Format));
+   fmt2->ref = 1;
+   if (fmt->font.name) fmt2->font.name = eina_stringshare_add(fmt->font.name);
+   if (fmt->font.fallbacks) fmt2->font.fallbacks = eina_stringshare_add(fmt->font.fallbacks);
+   if (fmt->font.source) fmt2->font.source = eina_stringshare_add(fmt->font.source);
+
+   if ((fmt2->font.name) && (fmt2->font.fallbacks))
+     {
+       buf = malloc(strlen(fmt2->font.name) + 1 + strlen(fmt2->font.fallbacks) + 1);
+       strcpy(buf, fmt2->font.name);
+       strcat(buf, ",");
+       strcat(buf, fmt2->font.fallbacks);
+     }
+   else if (fmt2->font.name)
+     buf = strdup(fmt2->font.name);
+   fmt2->font.font = evas_font_load(obj->layer->evas,
+                                   buf, fmt2->font.source,
+                                   (int)(((double)fmt2->font.size) * obj->cur.scale));
+   if (buf) free(buf);
+   return fmt2;
+}
+
+
+
+
+
+
+
+
+
+
+typedef struct _Ctxt Ctxt;
+
+struct _Ctxt
+{
+   Evas_Object *obj;
+   Evas_Object_Textblock *o;
+
+   Evas_Object_Textblock_Line *lines;
+   Evas_Object_Textblock_Line *ln;
+
+   Eina_List *format_stack;
+
+   int x, y;
+   int w, h;
+   int wmax, hmax;
+   int maxascent, maxdescent;
+   int marginl, marginr;
+   int line_no;
+   int underline_extend;
+   int have_underline, have_underline2;
+   double align;
+};
+
+static void
+_layout_format_ascent_descent_adjust(Ctxt *c, Evas_Object_Textblock_Format *fmt)
+{
+   int ascent, descent;
+
+   if (fmt->font.font)
+     {
+//     ascent = c->ENFN->font_max_ascent_get(c->ENDT, fmt->font.font);
+//     descent = c->ENFN->font_max_descent_get(c->ENDT, fmt->font.font);
+        ascent = c->ENFN->font_ascent_get(c->ENDT, fmt->font.font);
+       descent = c->ENFN->font_descent_get(c->ENDT, fmt->font.font);
+        if (fmt->linesize > 0)
+          {
+             if ((ascent + descent) < fmt->linesize)
+               {
+                  ascent = ((fmt->linesize * ascent) / (ascent + descent));
+                  descent = fmt->linesize - ascent;
+               }
+          }
+        else if (fmt->linerelsize > 0.0)
+          {
+             descent = ((ascent + descent) * fmt->linerelsize) - (ascent * fmt->linerelsize);
+             ascent = ascent * fmt->linerelsize;
+          }
+        c->maxdescent += fmt->linegap;
+        c->maxdescent += ((ascent + descent) * fmt->linerelgap);
+       if (c->maxascent < ascent) c->maxascent = ascent;
+       if (c->maxdescent < descent) c->maxdescent = descent;
+     }
+}
+
+static void
+_layout_line_new(Ctxt *c, Evas_Object_Textblock_Format *fmt)
+{
+   c->ln = calloc(1, sizeof(Evas_Object_Textblock_Line));
+   c->align = fmt->halign;
+   c->marginl = fmt->margin.l;
+   c->marginr = fmt->margin.r;
+   c->lines = (Evas_Object_Textblock_Line *)eina_inlist_append(EINA_INLIST_GET(c->lines), EINA_INLIST_GET(c->ln));
+   c->x = 0;
+   c->maxascent = c->maxdescent = 0;
+   c->ln->line_no = -1;
+   _layout_format_ascent_descent_adjust(c, fmt);
+}
+
+static Evas_Object_Textblock_Format *
+_layout_format_push(Ctxt *c, Evas_Object_Textblock_Format *fmt)
+{
+   if (fmt)
+     {
+       fmt = _format_dup(c->obj, fmt);
+       c->format_stack  = eina_list_prepend(c->format_stack, fmt);
+     }
+   else
+     {
+       fmt = calloc(1, sizeof(Evas_Object_Textblock_Format));
+       c->format_stack  = eina_list_prepend(c->format_stack, fmt);
+       fmt->ref = 1;
+       fmt->halign = 0.0;
+       fmt->valign = -1.0;
+       fmt->style = EVAS_TEXT_STYLE_PLAIN;
+       fmt->tabstops = 32;
+        fmt->linesize = 0;
+        fmt->linerelsize = 0.0;
+        fmt->linegap = 0;
+        fmt->linerelgap = 0.0;
+     }
+   return fmt;
+}
+
+static Evas_Object_Textblock_Format *
+_layout_format_pop(Ctxt *c, Evas_Object_Textblock_Format *fmt)
+{
+   if ((c->format_stack) && (c->format_stack->next))
+     {
+       _format_free(c->obj, fmt);
+       c->format_stack = eina_list_remove_list(c->format_stack, c->format_stack);
+       fmt = c->format_stack->data;
+     }
+   return fmt;
+}
+
+static void
+_layout_format_value_handle(Ctxt *c, Evas_Object_Textblock_Format *fmt, char *item)
+{
+   const char *key = NULL, *val = NULL;
+
+   _format_param_parse(item, &key, &val);
+   if ((key) && (val)) _format_command(c->obj, fmt, key, val);
+   if (key) eina_stringshare_del(key);
+   if (val) eina_stringshare_del(val);
+   c->align = fmt->halign;
+   c->marginl = fmt->margin.l;
+   c->marginr = fmt->margin.r;
+}
+
+#define VSIZE_FULL 0
+#define VSIZE_ASCENT 1
+
+#define SIZE 0
+#define SIZE_ABS 1
+#define SIZE_REL 2
+
+static void
+_layout_line_advance(Ctxt *c, Evas_Object_Textblock_Format *fmt)
+{
+   Evas_Object_Textblock_Item *it;
+   Evas_Object_Textblock_Format_Item *fi;
+
+   c->maxascent = c->maxdescent = 0;
+   if (!c->ln->items)
+     _layout_format_ascent_descent_adjust(c, fmt);
+   EINA_INLIST_FOREACH(c->ln->items, it)
+     {
+       int endx;
+
+       if (it->format->font.font)
+         it->baseline = c->ENFN->font_max_ascent_get(c->ENDT, it->format->font.font);
+       _layout_format_ascent_descent_adjust(c, it->format);
+       endx = it->x + it->w;
+       if (endx > c->ln->w) c->ln->w = endx;
+     }
+   EINA_INLIST_FOREACH(c->ln->format_items, fi)
+     {
+       int endx;
+
+        if (!fi->formatme) continue;
+       endx = fi->x + fi->w;
+       if (endx > c->ln->w) c->ln->w = endx;
+        switch (fi->size)
+          {
+          case SIZE:
+          case SIZE_ABS:
+             switch (fi->vsize)
+               {
+               case VSIZE_FULL:
+                  if (fi->h > (c->maxdescent + c->maxascent))
+                    {
+                       c->maxascent += fi->h - (c->maxdescent + c->maxascent);
+                       fi->y = -c->maxascent;
+                    }
+                  else
+                    fi->y = -(fi->h - c->maxdescent);
+                  break;
+               case VSIZE_ASCENT:
+                  if (fi->h > c->maxascent)
+                    {
+                       c->maxascent = fi->h;
+                       fi->y = -fi->h;
+                    }
+                  else
+                    fi->y = -fi->h;
+                  break;
+               default:
+                  break;
+               }
+             break;
+          case SIZE_REL:
+             switch (fi->vsize)
+               {
+               case VSIZE_FULL:
+               case VSIZE_ASCENT:
+                  fi->y = -fi->ascent;
+                  break;
+               default:
+                  break;
+               }
+             break;
+          default:
+             break;
+          }
+     }
+   c->ln->y = c->y + c->o->style_pad.t;
+   c->ln->h = c->maxascent + c->maxdescent;
+   c->ln->baseline = c->maxascent;
+   if (c->have_underline2)
+     {
+       if (c->maxdescent < 4) c->underline_extend = 4 - c->maxdescent;
+     }
+   else if (c->have_underline)
+     {
+       if (c->maxdescent < 2) c->underline_extend = 2 - c->maxdescent;
+     }
+   c->ln->line_no = c->line_no;
+   c->line_no++;
+   c->y += c->maxascent + c->maxdescent;
+   if (c->w >= 0)
+     {
+       c->ln->x = c->marginl + c->o->style_pad.l +
+         ((c->w - c->ln->w -
+           c->o->style_pad.l - c->o->style_pad.r -
+           c->marginl - c->marginr) * c->align);
+       if ((c->ln->x + c->ln->w + c->marginr - c->o->style_pad.l) > c->wmax)
+         c->wmax = c->ln->x + c->ln->w + c->marginl + c->marginr - c->o->style_pad.l;
+     }
+   else
+     {
+       c->ln->x = c->marginl + c->o->style_pad.l;
+       if ((c->ln->x + c->ln->w + c->marginr - c->o->style_pad.l) > c->wmax)
+         c->wmax = c->ln->x + c->ln->w + c->marginl + c->marginr - c->o->style_pad.l;
+     }
+   _layout_line_new(c, fmt);
+}
+
+static Evas_Object_Textblock_Item *
+_layout_item_new(Ctxt *c __UNUSED__, Evas_Object_Textblock_Format *fmt, char *str)
+{
+   Evas_Object_Textblock_Item *it;
+
+   it = calloc(1, sizeof(Evas_Object_Textblock_Item));
+   it->format = fmt;
+   it->format->ref++;
+   it->text = strdup(str);
+   return it;
+}
+
+static int
+_layout_text_cutoff_get(Ctxt *c, Evas_Object_Textblock_Format *fmt, Evas_Object_Textblock_Item *it)
+{
+
+   if (fmt->font.font)
+     return c->ENFN->font_last_up_to_pos(c->ENDT, fmt->font.font, it->text,
+                                            c->w -
+                                            c->o->style_pad.l -
+                                            c->o->style_pad.r -
+                                            c->marginl -
+                                            c->marginr -
+                                            c->x,
+                                            0);
+   return -1;
+}
+
+static void
+_layout_item_text_cutoff(Ctxt *c __UNUSED__, Evas_Object_Textblock_Item *it, int cut)
+{
+   char *ts;
+
+   ts = it->text;
+   ts[cut] = 0;
+   it->text = strdup(ts);
+   free(ts);
+}
+
+static int
+_layout_word_start(char *str, int start)
+{
+   int p, tp, chr = 0;
+
+   p = start;
+   chr = evas_common_font_utf8_get_next((unsigned char *)(str), &p);
+   if (_is_white(chr))
+     {
+       tp = p;
+       while (_is_white(chr) && (p >= 0))
+         {
+            tp = p;
+            chr = evas_common_font_utf8_get_next((unsigned char *)(str), &p);
+         }
+       return tp;
+     }
+   p = start;
+   tp = p;
+   while (p > 0)
+     {
+       chr = evas_common_font_utf8_get_prev((unsigned char *)(str), &p);
+       if (_is_white(chr)) break;
+       tp = p;
+     }
+   if (p < 0) p = 0;
+   if ((p >= 0) && (_is_white(chr)))
+     evas_common_font_utf8_get_next((unsigned char *)(str), &p);
+   return p;
+}
+
+static int
+_layout_ends_with_space(char *str)
+{
+   int p, chr;
+
+   p = evas_common_font_utf8_get_last((unsigned char *)(str), strlen(str));
+   if (p < 0) return 0;
+   chr = evas_common_font_utf8_get_next((unsigned char *)(str), &p);
+   return _is_white(chr);
+}
+
+static int
+_layout_strip_trailing_whitespace(Ctxt *c, Evas_Object_Textblock_Format *fmt __UNUSED__, Evas_Object_Textblock_Item *it)
+{
+   int p, tp, chr, adv, tw, th;
+
+   p = evas_common_font_utf8_get_last((unsigned char *)(it->text), strlen(it->text));
+   tp = p;
+   if (p >= 0)
+     {
+       chr = evas_common_font_utf8_get_prev((unsigned char *)(it->text), &p);
+       if (_is_white(chr))
+         {
+            _layout_item_text_cutoff(c, it, tp);
+            adv = 0;
+            if (it->format->font.font)
+              adv = c->ENFN->font_h_advance_get(c->ENDT, it->format->font.font, it->text);
+            tw = th = 0;
+            if (it->format->font.font)
+              c->ENFN->font_string_size_get(c->ENDT, it->format->font.font, it->text, &tw, &th);
+            it->w = tw;
+            it->h = th;
+            c->x = it->x + adv;
+            return 1;
+         }
+     }
+   return 0;
+}
+
+static int
+_layout_item_abort(Ctxt *c, Evas_Object_Textblock_Format *fmt, Evas_Object_Textblock_Item *it)
+{
+   if (it->text) free(it->text);
+   _format_free(c->obj, it->format);
+   free(it);
+   if (c->ln->items)
+     {
+       it = (Evas_Object_Textblock_Item *)(EINA_INLIST_GET(c->ln->items))->last;
+       return _layout_strip_trailing_whitespace(c, fmt, it);
+     }
+   return 0;
+}
+
+#if 0
+static char *
+_layout_next_char_jump(Ctxt *c, Evas_Object_Textblock_Item *it, char *str)
+{
+   int index;
+
+   index = 0;
+   evas_common_font_utf8_get_next((unsigned char *)str, &index);
+   if (index >= 0)
+     {
+       str = str + index;
+       _layout_item_text_cutoff(c, it, index);
+     }
+   else
+     str = NULL;
+   return str;
+}
+#endif
+
+static int
+_layout_last_item_ends_in_whitespace(Ctxt *c)
+{
+   Evas_Object_Textblock_Item *it;
+
+   if (!c->ln->items) return 1;
+   it = (Evas_Object_Textblock_Item *)(EINA_INLIST_GET(c->ln->items))->last;
+   return _layout_ends_with_space(it->text);
+}
+
+static int
+_layout_word_end(char *str, int p)
+{
+   int ch, tp;
+
+   tp = p;
+   ch = evas_common_font_utf8_get_next((unsigned char *)str, &tp);
+   while ((!_is_white(ch)) && (tp >= 0) && (ch != 0))
+     {
+       p = tp;
+       ch = evas_common_font_utf8_get_next((unsigned char *)str, &tp);
+     }
+   if (ch == 0) return -1;
+   return p;
+}
+
+static int
+_layout_word_next(char *str, int p)
+{
+   int ch, tp;
+
+   tp = p;
+   ch = evas_common_font_utf8_get_next((unsigned char *)str, &tp);
+   while ((!_is_white(ch)) && (tp >= 0) && (ch != 0))
+     {
+       p = tp;
+       ch = evas_common_font_utf8_get_next((unsigned char *)str, &tp);
+     }
+   if (ch == 0) return -1;
+   while ((_is_white(ch)) && (tp >= 0) && (ch != 0))
+     {
+       p = tp;
+       ch = evas_common_font_utf8_get_next((unsigned char *)str, &tp);
+     }
+   if (ch == 0) return -1;
+   return p;
+}
+
+static void
+_layout_walk_back_to_item_word_redo(Ctxt *c, Evas_Object_Textblock_Item *it)
+{
+   Evas_Object_Textblock_Item *pit, *new_it = NULL;
+   Eina_List *remove_items = NULL, *l;
+   Eina_Inlist *data;
+   int index, tw, th, inset, adv;
+
+   /* it is not appended yet */
+   EINA_INLIST_REVERSE_FOREACH((EINA_INLIST_GET(c->ln->items)), pit)
+     {
+       if (_layout_ends_with_space(pit->text))
+         {
+            break;
+         }
+       index = evas_common_font_utf8_get_last((unsigned char *)(pit->text), strlen(pit->text));
+       index = _layout_word_start(pit->text, index);
+       if (index == 0)
+         remove_items = eina_list_prepend(remove_items, pit);
+       else
+         {
+            new_it = _layout_item_new(c, pit->format, pit->text + index);
+            new_it->source_node = pit->source_node;
+            new_it->source_pos = pit->source_pos + index;
+            _layout_item_text_cutoff(c, pit, index);
+            _layout_strip_trailing_whitespace(c, pit->format, pit);
+            break;
+         }
+     }
+   EINA_LIST_FOREACH(remove_items, l, data)
+     c->ln->items = (Evas_Object_Textblock_Item *)eina_inlist_remove(EINA_INLIST_GET(c->ln->items), data);
+   /* new line now */
+   if (remove_items)
+     {
+       pit = remove_items->data;
+       _layout_line_advance(c, pit->format);
+     }
+   else
+     {
+       _layout_line_advance(c, it->format);
+     }
+   if (new_it)
+     {
+       /* append new_it */
+       tw = th = 0;
+       if (new_it->format->font.font)
+         c->ENFN->font_string_size_get(c->ENDT, new_it->format->font.font, new_it->text, &tw, &th);
+       new_it->w = tw;
+       new_it->h = th;
+       inset = 0;
+       if (new_it->format->font.font)
+         inset = c->ENFN->font_inset_get(c->ENDT, new_it->format->font.font, new_it->text);
+       new_it->inset = inset;
+       new_it->x = c->x;
+       adv = 0;
+       if (new_it->format->font.font)
+         adv = c->ENFN->font_h_advance_get(c->ENDT, new_it->format->font.font, new_it->text);
+       c->x += adv;
+       c->ln->items = (Evas_Object_Textblock_Item *)eina_inlist_append(EINA_INLIST_GET(c->ln->items), EINA_INLIST_GET(new_it));
+     }
+   while (remove_items)
+     {
+       pit = remove_items->data;
+       remove_items = eina_list_remove_list(remove_items, remove_items);
+       /* append pit */
+       pit->x = c->x;
+       adv = c->ENFN->font_h_advance_get(c->ENDT, pit->format->font.font, pit->text);
+       c->x += adv;
+       c->ln->items = (Evas_Object_Textblock_Item *)eina_inlist_append(EINA_INLIST_GET(c->ln->items), EINA_INLIST_GET(pit));
+     }
+   if (it)
+     {
+       /* append it */
+       it->x = c->x;
+       adv = 0;
+       if (it->format->font.font)
+         adv = c->ENFN->font_h_advance_get(c->ENDT, it->format->font.font, it->text);
+       c->x += adv;
+       c->ln->items = (Evas_Object_Textblock_Item *)eina_inlist_append(EINA_INLIST_GET(c->ln->items), EINA_INLIST_GET(it));
+     }
+}
+
+static void
+_layout_text_append(Ctxt *c, Evas_Object_Textblock_Format *fmt, Evas_Object_Textblock_Node *n, const char *repch)
+{
+   int adv, inset, tw, th, new_line, empty_item;
+   int wrap, twrap, ch, index, white_stripped;
+   char *str;
+   const char *tbase;
+   Evas_Object_Textblock_Item *it;
+
+   if (n)
+     {
+        if ((repch) && (eina_strbuf_length_get(n->text)))
+          {
+             int i, len, chlen;
+             char *ptr;
+             
+             len = evas_common_font_utf8_get_len((unsigned char *) eina_strbuf_string_get(n->text));
+             chlen = strlen(repch);
+             str = alloca((len * chlen) + 1);
+             tbase = str;
+             for (i = 0, ptr = str; i < len; ptr += chlen, i++)
+               memcpy(ptr, repch, chlen);
+             *ptr = 0;
+          }
+        else
+          {
+             str = (char *)eina_strbuf_string_get(n->text);
+             tbase = str;
+          }
+     }
+   else
+     {
+        str = "";
+        tbase = str;
+     }
+//   printf("add: wrap: %i|%i, width: %i '%s'\n", fmt->wrap_word, fmt->wrap_char, c->w, str);
+   new_line = 0;
+   empty_item = 0;
+   while (str)
+     {
+       /* if this is the first line item and it starts with spaces - remove them */
+       wrap = 0;
+       white_stripped = 0;
+/*
+       if (!c->ln->items)
+         {
+            twrap = wrap;
+            ch = evas_common_font_utf8_get_next((unsigned char *)str, &wrap);
+            while (_is_white(ch))
+              {
+                 twrap = wrap;
+                 ch = evas_common_font_utf8_get_next((unsigned char *)str, &wrap);
+              }
+            str = str + twrap;
+         }
+ */
+       it = _layout_item_new(c, fmt, str);
+       it->source_node = n;
+       it->source_pos = str - tbase;
+       tw = th = 0;
+       if (fmt->font.font)
+         c->ENFN->font_string_size_get(c->ENDT, fmt->font.font, it->text, &tw, &th);
+       if ((c->w >= 0) &&
+           ((fmt->wrap_word) || (fmt->wrap_char)) &&
+           ((c->x + tw) >
+            (c->w - c->o->style_pad.l - c->o->style_pad.r -
+             c->marginl - c->marginr)))
+         {
+            wrap = _layout_text_cutoff_get(c, fmt, it);
+             if (wrap == 0)
+               evas_common_font_utf8_get_next((unsigned char *)str, &wrap);
+            if (wrap > 0)
+              {
+                 if (fmt->wrap_word)
+                   {
+                      index = wrap;
+                      ch = evas_common_font_utf8_get_next((unsigned char *)str, &index);
+                      if (!_is_white(ch))
+                        wrap = _layout_word_start(str, wrap);
+                      if (wrap > 0)
+                        {
+                           twrap = wrap;
+                           ch = evas_common_font_utf8_get_prev((unsigned char *)str, &twrap);
+                           /* the text intersects the wrap point on a whitespace char */
+                           if (_is_white(ch))
+                             {
+                                _layout_item_text_cutoff(c, it, wrap);
+                                twrap = wrap;
+                                /*we don't want to move next, that's why it's
+                                 * commented out.
+                                 * ch = evas_common_font_utf8_get_next((unsigned char *)str, &twrap);
+                                 */
+                                str = str + twrap;
+                             }
+                           /* intersects a word */
+                           else
+                             {
+                                /* walk back to start of word */
+                                twrap = _layout_word_start(str, wrap);
+                                if (twrap != 0)
+                                  {
+                                     wrap = twrap;
+                                     ch = evas_common_font_utf8_get_prev((unsigned char *)str, &twrap);
+                                     _layout_item_text_cutoff(c, it, twrap);
+                                     str = str + wrap;
+                                  }
+                                else
+                                  {
+                                     empty_item = 1;
+                                     if (it->text) free(it->text);
+                                     _format_free(c->obj, it->format);
+                                     free(it);
+                                      if (c->ln->items)
+                                        {
+                                           it = (Evas_Object_Textblock_Item *)(EINA_INLIST_GET(c->ln->items))->last;
+                                           _layout_strip_trailing_whitespace(c, fmt, it);
+                                           twrap = _layout_word_end(str, wrap);
+                                          if (twrap >= 0)
+                                            {
+                                               ch = evas_common_font_utf8_get_next((unsigned char *)str, &twrap);
+                                               str = str + twrap;
+                                            }
+                                          else
+                                            str = NULL;
+                                        }
+                                  }
+                             }
+                        }
+                      else
+                        {
+                           /* wrap now is the index of the word START */
+                           index = wrap;
+                           ch = evas_common_font_utf8_get_next((unsigned char *)str, &index);
+                           if (!_is_white(ch) &&
+                               (!_layout_last_item_ends_in_whitespace(c)))
+                             {
+                                _layout_walk_back_to_item_word_redo(c, it);
+                                return;
+                             }
+                           if (c->ln->items != NULL)
+                             {
+                                white_stripped = _layout_item_abort(c, fmt, it);
+                                empty_item = 1;
+                             }
+                           else
+                             {
+                                if (wrap <= 0)
+                                  {
+                                     wrap = 0;
+                                     twrap = _layout_word_end(it->text, wrap);
+                                     wrap = twrap;
+                                     if (twrap >= 0)
+                                       {
+                                          ch = evas_common_font_utf8_get_next((unsigned char *)str, &wrap);
+                                          _layout_item_text_cutoff(c, it, twrap);
+                                       }
+                                     if (wrap > 0)
+                                       str = str + wrap;
+                                     else
+                                       str = NULL;
+                                  }
+                                else
+                                  str = NULL;
+                             }
+                        }
+                   }
+                 else if (fmt->wrap_char)
+                   {
+                      _layout_item_text_cutoff(c, it, wrap);
+                      str = str + wrap;
+                   }
+                 new_line = 1;
+              }
+            else
+              {
+                 /* wrap now is the index of the word START */
+                 if (wrap <= 0)
+                   {
+                      if (wrap < 0) wrap = 0;
+                      index = wrap;
+                      ch = evas_common_font_utf8_get_next((unsigned char *)str, &index);
+                      if (!_is_white(ch) &&
+                          (!_layout_last_item_ends_in_whitespace(c)))
+                        {
+                           _layout_walk_back_to_item_word_redo(c, it);
+                           return;
+                        }
+                   }
+                 if (c->ln->items != NULL)
+                   {
+                      white_stripped = _layout_item_abort(c, fmt, it);
+                      empty_item = 1;
+                      new_line = 1;
+                   }
+                 else
+                   {
+                      if (wrap <= 0)
+                        {
+                           wrap = 0;
+                           twrap = _layout_word_end(it->text, wrap);
+                           wrap = _layout_word_next(it->text, wrap);
+                           if (twrap >= 0)
+                             _layout_item_text_cutoff(c, it, twrap);
+                           if (wrap >= 0)
+                             str = str + wrap;
+                           else
+                             str = NULL;
+                        }
+                      else
+                        str = NULL;
+                      new_line = 1;
+                   }
+              }
+            if (!empty_item)
+              {
+                 tw = th = 0;
+                 if (fmt->font.font)
+                   c->ENFN->font_string_size_get(c->ENDT, fmt->font.font, it->text, &tw, &th);
+              }
+         }
+       else
+         str = NULL;
+       if (empty_item) empty_item = 0;
+       else
+         {
+            it->w = tw;
+            it->h = th;
+            inset = 0;
+            if (fmt->font.font)
+              inset = c->ENFN->font_inset_get(c->ENDT, fmt->font.font, it->text);
+            it->inset = inset;
+            it->x = c->x;
+            adv = 0;
+            if (fmt->font.font)
+              adv = c->ENFN->font_h_advance_get(c->ENDT, fmt->font.font, it->text);
+            c->x += adv;
+            c->ln->items = (Evas_Object_Textblock_Item *)eina_inlist_append(EINA_INLIST_GET(c->ln->items), EINA_INLIST_GET(it));
+         }
+       if (new_line)
+         {
+            if (str)
+              {
+                 if (!white_stripped)
+                   {
+                      index = 0;
+                      ch = evas_common_font_utf8_get_next((unsigned char *)str, &index);
+                      if (_is_white(ch)) str += index;
+                   }
+              }
+            new_line = 0;
+            _layout_line_advance(c, fmt);
+         }
+     }
+}
+
+static Evas_Object_Textblock_Format_Item *
+_layout_format_item_add(Ctxt *c, Evas_Object_Textblock_Node *n, char *item)
+{
+   Evas_Object_Textblock_Format_Item *fi;
+
+   fi = calloc(1, sizeof(Evas_Object_Textblock_Format_Item));
+   fi->item = eina_stringshare_add(item);
+   fi->source_node = n;
+   c->ln->format_items = (Evas_Object_Textblock_Format_Item *)eina_inlist_append(EINA_INLIST_GET(c->ln->format_items),
+                                                                                EINA_INLIST_GET(fi));
+   return fi;
+}
+
+static void
+_layout(const Evas_Object *obj, int calc_only, int w, int h, int *w_ret, int *h_ret)
+{
+   Evas_Object_Textblock *o;
+   Ctxt ctxt, *c;
+   Evas_Object_Textblock_Line *ln;
+   Evas_Object_Textblock_Node *n;
+   Eina_List *removes = NULL;
+   Evas_Object_Textblock_Format *fmt = NULL;
+   int style_pad_l = 0, style_pad_r = 0, style_pad_t = 0, style_pad_b = 0;
+
+   /* setup context */
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   c = &ctxt;
+   c->obj = (Evas_Object *)obj;
+   c->o = o;
+   c->lines = c->ln = NULL;
+   c->format_stack = NULL;
+   c->x = c->y = 0;
+   c->w = w;
+   c->h = h;
+   c->wmax = c->hmax = 0;
+   c->maxascent = c->maxdescent = 0;
+   c->marginl = c->marginr = 0;
+   c->have_underline = 0;
+   c->have_underline2 = 0;
+   c->underline_extend = 0;
+   c->line_no = 0;
+   c->align = 0.0;
+
+   _format_command_init();
+   /* setup default base style */
+   if ((c->o->style) && (c->o->style->default_tag))
+     {
+       fmt = _layout_format_push(c, NULL);
+       _format_fill(c->obj, fmt, c->o->style->default_tag);
+     }
+   if (!fmt)
+     {
+       _format_command_shutdown();
+       if (w_ret) *w_ret = 0;
+       if (h_ret) *h_ret = 0;
+       return;
+     }
+   /* run through all text and format nodes generating lines */
+   if (!c->o->nodes)
+     {
+        if (!c->ln)
+          {
+             _layout_line_new(c, fmt);
+             _layout_text_append(c, fmt, NULL, NULL);
+             _layout_line_advance(c, fmt);
+//             printf("bl:%i | %ix%i\n", c->ln->baseline, c->ln->w, c->ln->h);
+             /*
+             tw = th = 0;
+             if (fmt->font.font)
+               {
+                  c->ENFN->font_string_size_get(c->ENDT, fmt->font.font, "", &tw, &th);
+                  c->ln->x = 0;
+                  c->ln->y = 0;
+                  c->ln->w = tw;
+                  c->ln->h = th;
+                  c->wmax = tw;
+                  c->hmax = th;
+                  _layout_format_ascent_descent_adjust(c, fmt);
+               }
+              */
+          }
+     }
+   EINA_INLIST_FOREACH(c->o->nodes, n)
+     {
+       if (!c->ln) _layout_line_new(c, fmt);
+       if ((n->type == NODE_FORMAT) && eina_strbuf_length_get(n->text))
+         {
+            char *s;
+            char *item;
+             int handled = 0;
+
+            s = (char *)eina_strbuf_string_get(n->text);
+             if (!strncmp(s, "+ item ", 7))
+               {
+                  // one of:
+                  //   item size=20x10 href=name
+                  //   item relsize=20x10 href=name
+                  //   item abssize=20x10 href=name
+                  // 
+                  // optional arguments:
+                  //   vsize=full
+                  //   vsize=ascent
+                  // 
+                  // size == item size (modifies line size) - can be multiplied by
+                  //   scale factor
+                  // relsize == relative size (height is current font height, width
+                  //   modified accordingly keeping aspect)
+                  // abssize == absolute size (modifies line size) - never mulitplied by
+                  //   scale factor
+                  // href == name of item - to be found and matched later and used for
+                  //   positioning
+                  Evas_Object_Textblock_Format_Item *fi;
+                  int x2, w = 1, h = 1;
+                  int vsize = 0, size = 0;
+                  char *p;
+                  
+                  // don't care
+                  //href = strstr(s, " href=");
+                  p = strstr(s, " vsize=");
+                  if (p)
+                    {
+                       p += 7;
+                       if (!strncmp(p, "full", 4)) vsize = VSIZE_FULL;
+                       else if (!strncmp(p, "ascent", 6)) vsize = VSIZE_ASCENT;
+                    }
+                  p = strstr(s, " size=");
+                  if (p)
+                    {
+                       p += 6;
+                       if (sscanf(p, "%ix%i", &w, &h) == 2)
+                         {
+                            w = w * obj->cur.scale;
+                            h = h * obj->cur.scale;
+                            size = SIZE;
+                         }
+                    }
+                  else
+                    {
+                       p = strstr(s, " absize=");
+                       if (p)
+                         {
+                            p += 8;
+                            if (sscanf(p, "%ix%i", &w, &h) == 2)
+                              {
+                                 size = SIZE_ABS;
+                              }
+                         }
+                       else
+                         {
+                            p = strstr(s, " relsize=");
+                            if (p)
+                              {
+                                 p += 9;
+                                 if (sscanf(p, "%ix%i", &w, &h) == 2)
+                                   {
+                                      int sz = 1;
+                                      size = SIZE_REL;
+                                      if (vsize == VSIZE_FULL)
+                                        {
+                                           sz = c->maxdescent + c->maxascent;
+                                        }
+                                      else if (vsize == VSIZE_ASCENT)
+                                        {
+                                           sz = c->maxascent;
+                                        }
+                                      w = (w * sz) / h;
+                                      h = sz;
+                                   }
+                              }
+                         }
+                    }
+
+                  x2 = c->x + w;
+                  
+                  if (x2 >
+                      (c->w - c->o->style_pad.l -
+                       c->o->style_pad.r -
+                       c->marginl - c->marginr))
+                    {
+                       _layout_line_advance(c, fmt);
+                       x2 = w;
+                    }
+                  fi = _layout_format_item_add(c, n, item);
+                  fi->x = c->x;
+                  fi->vsize = vsize;
+                  fi->size = size;
+                  fi->formatme = 1;
+                  fi->w = w;
+                  fi->h = h;
+                  fi->ascent = c->maxascent;
+                  fi->descent = c->maxdescent;
+                  c->x = x2;
+                  handled = 1;
+               }
+             if (!handled)
+               {
+                  if (s[0] == '+')
+                    {
+                       fmt = _layout_format_push(c, fmt);
+                       s++;
+                    }
+                  else if (s[0] == '-')
+                    {
+                       fmt = _layout_format_pop(c, fmt);
+                       s++;
+                    }
+                  while ((item = _format_parse(&s)))
+                    {
+                       char tmp_delim = *s;
+                       *s = '\0';
+                       if (_format_is_param(item))
+                         {
+                            _layout_format_value_handle(c, fmt, item);
+                         }
+                       else
+                         {
+                            if ((!strcmp(item, "\n")) || (!strcmp(item, "\\n")))
+                              {
+                                 Evas_Object_Textblock_Format_Item *fi;
+                                 
+                                 fi = _layout_format_item_add(c, n, item);
+                                 fi->x = c->x;
+                                 fi->w = 0;
+                                 _layout_line_advance(c, fmt);
+                              }
+                            else if ((!strcmp(item, "\t")) || (!strcmp(item, "\\t")))
+                              {
+                                 Evas_Object_Textblock_Format_Item *fi;
+                                 int x2;
+                                 
+                                 x2 = (fmt->tabstops * ((c->x + fmt->tabstops) / fmt->tabstops));
+                                 if (x2 >
+                                     (c->w - c->o->style_pad.l -
+                                      c->o->style_pad.r -
+                                      c->marginl - c->marginr))
+                                   {
+                                      _layout_line_advance(c, fmt);
+                                      x2 = (fmt->tabstops * ((c->x + fmt->tabstops) / fmt->tabstops));
+                                   }
+                                 if (c->ln->items)
+                                   {
+                                      Evas_Object_Textblock_Item *it;
+                                      
+                                      it = (Evas_Object_Textblock_Item *)(EINA_INLIST_GET(c->ln->items))->last;
+                                      _layout_strip_trailing_whitespace(c, fmt, it);
+                                   }
+                                 fi = _layout_format_item_add(c, n, item);
+                                 fi->x = c->x;
+                                 fi->w = x2 - c->x;
+                                 c->x = x2;
+                              }
+                         }
+                       *s = tmp_delim;
+                    }
+               }
+             
+            evas_text_style_pad_get(fmt->style, &style_pad_l, &style_pad_r, &style_pad_t, &style_pad_b);
+
+            if (fmt->underline2)
+              c->have_underline2 = 1;
+            else if (fmt->underline)
+              c->have_underline = 1;
+         }
+       else if ((n->type == NODE_TEXT) && eina_strbuf_length_get(n->text))
+         {
+            _layout_text_append(c, fmt, n, o->repch);
+            if ((c->have_underline2) || (c->have_underline))
+              {
+                 if (style_pad_b < c->underline_extend)
+                   style_pad_b = c->underline_extend;
+                 c->have_underline = 0;
+                 c->have_underline2 = 0;
+                 c->underline_extend = 0;
+              }
+         }
+     }
+   if ((c->ln) && (c->ln->items) && (fmt))
+     _layout_line_advance(c, fmt);
+   while (c->format_stack)
+     {
+       fmt = c->format_stack->data;
+       c->format_stack = eina_list_remove_list(c->format_stack, c->format_stack);
+       _format_free(c->obj, fmt);
+     }
+   EINA_INLIST_FOREACH(c->lines, ln)
+     {
+       if (ln->line_no == -1)
+         {
+            removes = eina_list_append(removes, ln);
+         }
+       else
+         {
+            if ((ln->y + ln->h) > c->hmax) c->hmax = ln->y + ln->h;
+         }
+     }
+   while (removes)
+     {
+       ln = removes->data;
+       c->lines = (Evas_Object_Textblock_Line *)eina_inlist_remove(EINA_INLIST_GET(c->lines), EINA_INLIST_GET(ln));
+       removes = eina_list_remove_list(removes, removes);
+       _line_free(obj, ln);
+     }
+
+   if (w_ret) *w_ret = c->wmax;
+   if (h_ret) *h_ret = c->hmax;
+   if ((o->style_pad.l != style_pad_l) || (o->style_pad.r != style_pad_r) ||
+       (o->style_pad.t != style_pad_t) || (o->style_pad.b != style_pad_b))
+     {
+       Evas_Object_Textblock_Line *lines;
+
+       lines = c->lines;
+       c->lines = NULL;
+       o->style_pad.l = style_pad_l;
+       o->style_pad.r = style_pad_r;
+       o->style_pad.t = style_pad_t;
+       o->style_pad.b = style_pad_b;
+       _layout(obj, calc_only, w, h, w_ret, h_ret);
+        _lines_clear(obj, lines);
+       _format_command_shutdown();
+       return;
+     }
+   if (!calc_only)
+     {
+       o->lines = c->lines;
+       _format_command_shutdown();
+       return;
+     }
+   if (c->lines) _lines_clear(obj, c->lines);
+   _format_command_shutdown();
+}
+
+static void
+_relayout(const Evas_Object *obj)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Line *lines;
+
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   lines = o->lines;
+   o->lines = NULL;
+   o->formatted.valid = 0;
+   o->native.valid = 0;
+   _layout(obj,
+          0,
+          obj->cur.geometry.w, obj->cur.geometry.h,
+          &o->formatted.w, &o->formatted.h);
+   o->formatted.valid = 1;
+   if (lines) _lines_clear(obj, lines);
+   o->last_w = obj->cur.geometry.w;
+   o->changed = 0;
+   o->redraw = 1;
+}
+
+static void
+_find_layout_item_line_match(Evas_Object *obj, Evas_Object_Textblock_Node *n, int pos, int eol, Evas_Object_Textblock_Line **lnr, Evas_Object_Textblock_Item **itr)
+{
+   Evas_Object_Textblock_Line *ln;
+/*    Evas_Object_Textblock_Node *nn; */
+   Evas_Object_Textblock *o;
+
+   o = (Evas_Object_Textblock *)(obj->object_data);
+/*    EINA_INLIST_FOREACH(o->nodes, nn) */
+/*      ; */
+   if ((eol) && (n->type == NODE_TEXT))
+     {
+        int pos2 = pos;
+
+        evas_common_font_utf8_get_prev((unsigned char *) eina_strbuf_string_get(n->text), &pos2);
+        if (pos2 < pos) pos = pos2;
+     }
+   EINA_INLIST_FOREACH(o->lines, ln)
+     {
+       Evas_Object_Textblock_Format_Item *fit;
+       Evas_Object_Textblock_Item *it;
+        Evas_Object_Textblock_Line *lnn;
+
+        lnn = (Evas_Object_Textblock_Line *)(((Eina_Inlist *)ln)->next);
+       EINA_INLIST_FOREACH(ln->items, it)
+         {
+            if (it->source_node == n)
+              {
+                  Evas_Object_Textblock_Item *itn;
+                  int p;
+
+                  itn = (Evas_Object_Textblock_Item *)(((Eina_Inlist *)it)->next);
+                  p = (int)(it->source_pos + strlen(it->text));
+                 if ((p >= pos) ||
+                      ((p == pos) && (!lnn) &&
+                       ((!itn)  |
+                        ((itn) && (itn->source_node != n)))))
+                   {
+                      *lnr = ln;
+                      *itr = it;
+                      return;
+                   }
+              }
+         }
+       EINA_INLIST_FOREACH(ln->format_items, fit)
+         {
+            if (fit->source_node == n)
+              {
+                 *lnr = ln;
+                 /* FIXME: Is that really what we want ? */
+                 *itr = (Evas_Object_Textblock_Item *)fit;
+                 return;
+              }
+         }
+     }
+}
+
+static void
+_find_layout_format_item_line_match(Evas_Object *obj, Evas_Object_Textblock_Node *n, Evas_Object_Textblock_Line **lnr, Evas_Object_Textblock_Format_Item **fir)
+{
+   Evas_Object_Textblock_Line *ln;
+   Evas_Object_Textblock *o;
+
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   EINA_INLIST_FOREACH(o->lines, ln)
+     {
+       Evas_Object_Textblock_Format_Item *fi;
+
+       EINA_INLIST_FOREACH(ln->format_items, fi)
+         {
+            if (fi->source_node == n)
+              {
+                 *lnr = ln;
+                 *fir = fi;
+                 return;
+              }
+         }
+     }
+}
+
+static Evas_Object_Textblock_Line *
+_find_layout_line_num(const Evas_Object *obj, int line)
+{
+   Evas_Object_Textblock_Line *ln;
+   Evas_Object_Textblock *o;
+
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   EINA_INLIST_FOREACH(o->lines, ln)
+     {
+       if (ln->line_no == line) return ln;
+     }
+   return NULL;
+}
+
+/**
+ * Adds a textblock to the given evas.
+ * @param   e The given evas.
+ * @return  The new textblock object.
+ */
+EAPI Evas_Object *
+evas_object_textblock_add(Evas *e)
+{
+   Evas_Object *obj;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   obj = evas_object_new(e);
+   evas_object_textblock_init(obj);
+   evas_object_inject(obj, e);
+   return obj;
+}
+
+/**
+ * Creates a new textblock style.
+ * @return  The new textblock style.
+ */
+EAPI Evas_Textblock_Style *
+evas_textblock_style_new(void)
+{
+   Evas_Textblock_Style *ts;
+
+   ts = calloc(1, sizeof(Evas_Textblock_Style));
+   return ts;
+}
+
+/**
+ * Destroys a textblock style.
+ * @param ts The textblock style to free.
+ */
+EAPI void
+evas_textblock_style_free(Evas_Textblock_Style *ts)
+{
+   if (!ts) return;
+   if (ts->objects)
+     {
+       ts->delete_me = 1;
+       return;
+     }
+   _style_clear(ts);
+   free(ts);
+}
+
+/**
+ * to be documented.
+ * @param ts  to be documented.
+ * @param text  to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_style_set(Evas_Textblock_Style *ts, const char *text)
+{
+   Eina_List *l;
+   Evas_Object *obj;
+
+   if (!ts) return;
+
+   EINA_LIST_FOREACH(ts->objects, l, obj)
+     {
+       Evas_Object_Textblock *o;
+
+       o = (Evas_Object_Textblock *)(obj->object_data);
+       if (o->markup_text)
+         {
+            free(o->markup_text);
+            o->markup_text = NULL;
+            evas_object_textblock_text_markup_get(obj);
+         }
+     }
+
+   _style_clear(ts);
+   if (text) ts->style_text = strdup(text);
+
+   if (ts->style_text)
+     {
+       // format MUST be KEY='VALUE'[KEY='VALUE']...
+       char *p;
+       char *key_start, *key_stop, *val_start, *val_stop;
+
+       key_start = key_stop = val_start = val_stop = NULL;
+       p = ts->style_text;
+       while (*p)
+         {
+            if (!key_start)
+              {
+                 if (!isspace(*p))
+                   key_start = p;
+              }
+            else if (!key_stop)
+              {
+                 if ((*p == '=') || (isspace(*p)))
+                   key_stop = p;
+              }
+            else if (!val_start)
+              {
+                 if (((*p) == '\'') && (*(p + 1)))
+                   val_start = p + 1;
+              }
+            else if (!val_stop)
+              {
+                 if (((*p) == '\'') && (p > ts->style_text) && (p[-1] != '\\'))
+                   val_stop = p;
+              }
+            if ((key_start) && (key_stop) && (val_start) && (val_stop))
+              {
+                 char *tags, *replaces;
+                 Evas_Object_Style_Tag *tag;
+                 size_t tag_len = key_stop - key_start;
+                 size_t replace_len = val_stop - val_start;
+
+                 tags = malloc(tag_len + 1);
+                 if (tags)
+                   {
+                      memcpy(tags, key_start, tag_len);
+                      tags[tag_len] = 0;
+                   }
+
+                 replaces = malloc(replace_len + 1);
+                 if (replaces)
+                   {
+                      memcpy(replaces, val_start, replace_len);
+                      replaces[replace_len] = 0;
+                   }
+                 if ((tags) && (replaces))
+                   {
+                      if (!strcmp(tags, "DEFAULT"))
+                        {
+                           ts->default_tag = replaces;
+                           free(tags);
+                        }
+                      else
+                        {
+                           tag = calloc(1, sizeof(Evas_Object_Style_Tag));
+                           if (tag)
+                             {
+                                tag->tag = tags;
+                                tag->replace = replaces;
+                                tag->tag_len = tag_len;
+                                tag->replace_len = replace_len;
+                                ts->tags = (Evas_Object_Style_Tag *)eina_inlist_append(EINA_INLIST_GET(ts->tags), EINA_INLIST_GET(tag));
+                             }
+                           else
+                             {
+                                free(tags);
+                                free(replaces);
+                             }
+                        }
+                   }
+                 else
+                   {
+                      if (tags) free(tags);
+                      if (replaces) free(replaces);
+                   }
+                 key_start = key_stop = val_start = val_stop = NULL;
+              }
+            p++;
+         }
+     }
+
+   EINA_LIST_FOREACH(ts->objects, l, obj)
+     {
+       Evas_Object_Textblock *o;
+
+       o = (Evas_Object_Textblock *)(obj->object_data);
+       if (o->markup_text)
+         {
+            char *m;
+
+            m = strdup(o->markup_text);
+            if (m)
+              {
+                 evas_object_textblock_text_markup_set(obj, m);
+                 free(m);
+              }
+         }
+     }
+}
+
+/**
+ * to be documented.
+ * @param ts  to be documented.
+ * @return to be documented.
+ */
+EAPI const char *
+evas_textblock_style_get(const Evas_Textblock_Style *ts)
+{
+   if (!ts) return NULL;
+   return ts->style_text;
+}
+
+/* textblock styles */
+/**
+ * to be documented.
+ * @param obj to be documented.
+ * @param ts  to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_object_textblock_style_set(Evas_Object *obj, Evas_Textblock_Style *ts)
+{
+   TB_HEAD();
+   if (ts == o->style) return;
+   if ((ts) && (ts->delete_me)) return;
+   if (o->markup_text)
+     {
+        if (o->style)
+          {
+             free(o->markup_text);
+             o->markup_text = NULL;
+             evas_object_textblock_text_markup_get(obj);
+          }
+     }
+   if (o->style)
+     {
+       Evas_Textblock_Style *old_ts;
+
+       old_ts = o->style;
+       old_ts->objects = eina_list_remove(old_ts->objects, obj);
+       if ((old_ts->delete_me) && (!old_ts->objects))
+         evas_textblock_style_free(old_ts);
+     }
+   if (ts)
+     {
+       ts->objects = eina_list_append(ts->objects, obj);
+       o->style = ts;
+     }
+   else
+     {
+       o->style = NULL;
+     }
+
+   o->formatted.valid = 0;
+   o->native.valid = 0;
+   o->changed = 1;
+   if (o->markup_text)
+     {
+       free(o->markup_text);
+       o->markup_text = NULL;
+     }
+   evas_object_change(obj);
+}
+
+/**
+ * to be documented.
+ * @param obj  to be documented.
+ * @return to be documented.
+ */
+EAPI const Evas_Textblock_Style *
+evas_object_textblock_style_get(const Evas_Object *obj)
+{
+   TB_HEAD_RETURN(NULL);
+   return o->style;
+}
+
+/**
+ * @brief Set the "replacement character" to use for the given textblock object.
+ *
+ * @param obj The given textblock object.
+ * @param ch The charset name.
+ */
+EAPI void
+evas_object_textblock_replace_char_set(Evas_Object *obj, const char *ch)
+{
+   TB_HEAD();
+   if (o->repch) eina_stringshare_del(o->repch);
+   if (ch) o->repch = eina_stringshare_add(ch);
+   else o->repch = NULL;
+   o->formatted.valid = 0;
+   o->native.valid = 0;
+   o->changed = 1;
+   if (o->markup_text)
+     {
+       free(o->markup_text);
+       o->markup_text = NULL;
+     }
+   evas_object_change(obj);
+}
+
+/**
+ * @brief Get the "replacement character" for given textblock object. Returns
+ * NULL if no replacement character is in use.
+ *
+ * @param obj The given textblock object
+ * @return replacement character or NULL
+ */
+EAPI const char *
+evas_object_textblock_replace_char_get(Evas_Object *obj)
+{
+   TB_HEAD_RETURN(NULL);
+   return o->repch;
+}
+
+
+static inline void
+_advance_after_end_of_string(const char **p_buf)
+{
+   while (**p_buf != 0) (*p_buf)++;
+   (*p_buf)++;
+}
+
+static inline int
+_is_eq_and_advance(const char *s, const char *s_end,
+                  const char **p_m, const char *m_end)
+{
+   for (;((s < s_end) && (*p_m < m_end)); s++, (*p_m)++)
+     {
+       if (*s != **p_m)
+         {
+            _advance_after_end_of_string(p_m);
+            return 0;
+         }
+     }
+
+   if (*p_m < m_end)
+     _advance_after_end_of_string(p_m);
+
+   return s == s_end;
+}
+
+static inline const char *
+_escaped_char_match(const char *s, int *adv)
+{
+   const char *map_itr, *map_end, *mc, *sc;
+
+   map_itr = escape_strings;
+   map_end = map_itr + sizeof(escape_strings);
+
+   while (map_itr < map_end)
+     {
+       const char *escape;
+       int match;
+
+       escape = map_itr;
+       _advance_after_end_of_string(&map_itr);
+       if (map_itr >= map_end) break;
+
+       mc = map_itr;
+       sc = s;
+       match = 1;
+       while ((*mc) && (*sc))
+         {
+            if ((unsigned char)*sc < (unsigned char)*mc) return NULL;
+            if (*sc != *mc) match = 0;
+            mc++;
+            sc++;
+         }
+       if (match)
+         {
+            *adv = mc - map_itr;
+            return escape;
+         }
+       _advance_after_end_of_string(&map_itr);
+     }
+   return NULL;
+}
+
+static inline const char *
+_escaped_char_get(const char *s, const char *s_end)
+{
+   const char *map_itr, *map_end;
+
+   map_itr = escape_strings;
+   map_end = map_itr + sizeof(escape_strings);
+
+   while (map_itr < map_end)
+     {
+       if (_is_eq_and_advance(s, s_end, &map_itr, map_end))
+         return map_itr;
+       if (map_itr < map_end)
+         _advance_after_end_of_string(&map_itr);
+     }
+   return NULL;
+}
+
+/**
+ * to be documented.
+ * @param escape to be documented.
+ * @return to be documented.
+ */
+EAPI const char *
+evas_textblock_escape_string_get(const char *escape)
+{
+   /* &amp; -> & */
+   return _escaped_char_get(escape, escape + strlen(escape));
+}
+
+/**
+ * to be documented.
+ * @param escape_start to be documented.
+ * @param escape_end to be documented.
+ * @return to be documented.
+ */
+EAPI const char *
+evas_textblock_escape_string_range_get(const char *escape_start, const char *escape_end)
+{
+   return _escaped_char_get(escape_start, escape_end);
+}
+
+/**
+ * to be documented.
+ * @param string to be documented.
+ * @param len_ret to be documented.
+ * @return to be documented.
+ */
+EAPI const char *
+evas_textblock_string_escape_get(const char *string, int *len_ret)
+{
+   /* & -> &amp; */
+   return _escaped_char_match(string, len_ret);
+}
+
+static inline void
+_append_escaped_char(Evas_Textblock_Cursor *cur, const char *s,
+                    const char *s_end)
+{
+   const char *escape;
+
+   escape = _escaped_char_get(s, s_end);
+   if (escape)
+     evas_textblock_cursor_text_append(cur, escape);
+}
+
+static inline void
+_prepend_escaped_char(Evas_Textblock_Cursor *cur, const char *s,
+                    const char *s_end)
+{
+   const char *escape;
+
+   escape = _escaped_char_get(s, s_end);
+   if (escape)
+     evas_textblock_cursor_text_prepend(cur, escape);
+}
+
+/**
+ * to be documented.
+ * @param obj  to be documented.
+ * @param text to be documented.
+ * @return Return no value.
+ */
+EAPI void
+evas_object_textblock_text_markup_set(Evas_Object *obj, const char *text)
+{
+   TB_HEAD();
+   if ((text != o->markup_text) && (o->markup_text))
+     {
+       free(o->markup_text);
+       o->markup_text = NULL;
+     }
+   _nodes_clear(obj);
+   o->formatted.valid = 0;
+   o->native.valid = 0;
+   o->changed = 1;
+   evas_object_change(obj);
+   if (!o->style)
+     {
+       if (text != o->markup_text)
+         {
+            if (text) o->markup_text = strdup(text);
+         }
+       return;
+     }
+   evas_textblock_cursor_node_first(o->cursor);
+   if (text)
+     {
+       char *s, *p;
+       char *tag_start, *tag_end, *esc_start, *esc_end;
+
+       tag_start = tag_end = esc_start = esc_end = NULL;
+       p = (char *)text;
+       s = p;
+       for (;;)
+         {
+            if ((*p == 0) ||
+                (tag_end) || (esc_end) ||
+                (tag_start) || (esc_start))
+              {
+                 if (tag_end)
+                   {
+                      char *ttag;
+                      size_t ttag_len = tag_end - tag_start -1;
+
+                      ttag = malloc(ttag_len + 1);
+                      if (ttag)
+                        {
+                           const char *match;
+                           size_t replace_len;
+
+                           memcpy(ttag, tag_start + 1, ttag_len);
+                           ttag[ttag_len] = 0;
+                           match = _style_match_tag(o->style, ttag, ttag_len, &replace_len);
+                           if (match)
+                             evas_textblock_cursor_format_append(o->cursor, match);
+                           else
+                             {
+                                char *ttag2;
+
+                                ttag2 = malloc(ttag_len + 2 + 1);
+                                if (ttag2)
+                                  {
+                                     if (ttag[0] == '/')
+                                       {
+                                          strcpy(ttag2, "- ");
+                                          strcat(ttag2, ttag + 1);
+                                       }
+                                     else
+                                       {
+                                          strcpy(ttag2, "+ ");
+                                          strcat(ttag2, ttag);
+                                       }
+                                     evas_textblock_cursor_format_append(o->cursor, ttag2);
+                                     free(ttag2);
+                                  }
+                             }
+                           free(ttag);
+                        }
+                      tag_start = tag_end = NULL;
+                   }
+                 else if (esc_end)
+                   {
+                      _append_escaped_char(o->cursor, esc_start, esc_end);
+                      esc_start = esc_end = NULL;
+                   }
+                 else if (*p == 0)
+                   {
+                      _append_text_run(o, s, p);
+                      s = NULL;
+                   }
+                 if (*p == 0)
+                   break;
+              }
+            if (*p == '<')
+              {
+                 if (!esc_start)
+                   {
+                      tag_start = p;
+                      tag_end = NULL;
+                      _append_text_run(o, s, p);
+                      s = NULL;
+                   }
+              }
+            else if (*p == '>')
+              {
+                 if (tag_start)
+                   {
+                      tag_end = p;
+                      s = p + 1;
+                   }
+              }
+            else if (*p == '&')
+              {
+                 if (!tag_start)
+                   {
+                      esc_start = p;
+                      esc_end = NULL;
+                      _append_text_run(o, s, p);
+                      s = NULL;
+                   }
+              }
+            else if (*p == ';')
+              {
+                 if (esc_start)
+                   {
+                      esc_end = p;
+                      s = p + 1;
+                   }
+              }
+            p++;
+         }
+     }
+     {
+       Eina_List *l;
+       Evas_Textblock_Cursor *data;
+
+       evas_textblock_cursor_node_first(o->cursor);
+       EINA_LIST_FOREACH(o->cursors, l, data)
+         evas_textblock_cursor_node_first(data);
+     }
+}
+
+/**
+ * to be documented.
+ * @param cur  to be documented.
+ * @param text to be documented.
+ * @return Return no value.
+ */
+EAPI void
+evas_object_textblock_text_markup_prepend(Evas_Textblock_Cursor *cur, const char *text)
+{
+   Evas_Object_Textblock *o;
+
+   if (!cur) return;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   if (o->markup_text)
+     {
+       free(o->markup_text);
+       o->markup_text = NULL;
+     }
+   o->formatted.valid = 0;
+   o->native.valid = 0;
+   o->changed = 1;
+   evas_object_change(cur->obj);
+   if (!o->style) return;
+   if (text)
+     {
+       char *s, *p;
+       char *tag_start, *tag_end, *esc_start, *esc_end;
+
+       tag_start = tag_end = esc_start = esc_end = NULL;
+       p = (char *)text;
+       s = p;
+       for (;;)
+         {
+            if ((*p == 0) ||
+                (tag_end) || (esc_end) ||
+                (tag_start) || (esc_start))
+              {
+                 if (tag_end)
+                   {
+                      char *ttag;
+                      size_t ttag_len = tag_end - tag_start - 1;
+
+                      ttag = malloc(ttag_len + 1);
+                      if (ttag)
+                        {
+                           const char *match;
+                           size_t replace_len;
+
+                           strncpy(ttag, tag_start + 1, ttag_len);
+                           ttag[ttag_len] = 0;
+                           match = _style_match_tag(o->style, ttag, ttag_len, &replace_len);
+                           if (match)
+                             evas_textblock_cursor_format_prepend(cur, match);
+                           else
+                             {
+                                char *ttag2;
+
+                                ttag2 = malloc(ttag_len + 2 + 1);
+                                if (ttag2)
+                                  {
+                                     if (ttag[0] == '/')
+                                       {
+                                          strcpy(ttag2, "- ");
+                                          strcat(ttag2, ttag + 1);
+                                       }
+                                     else
+                                       {
+                                          strcpy(ttag2, "+ ");
+                                          strcat(ttag2, ttag);
+                                       }
+                                     evas_textblock_cursor_format_prepend(o->cursor, ttag2);
+                                     free(ttag2);
+                                  }
+                             }
+                           free(ttag);
+                        }
+                      tag_start = tag_end = NULL;
+                   }
+                 else if (esc_end)
+                   {
+                      _prepend_escaped_char(cur, esc_start, esc_end);
+                      esc_start = esc_end = NULL;
+                   }
+                 else if (*p == 0)
+                   {
+                      _prepend_text_run(o, s, p);
+                      s = NULL;
+                   }
+                 if (*p == 0)
+                   break;
+              }
+            if (*p == '<')
+              {
+                 if (!esc_start)
+                   {
+                      tag_start = p;
+                      tag_end = NULL;
+                      _prepend_text_run(o, s, p);
+                      s = NULL;
+                   }
+              }
+            else if (*p == '>')
+              {
+                 if (tag_start)
+                   {
+                      tag_end = p;
+                      s = p + 1;
+                   }
+              }
+            else if (*p == '&')
+              {
+                 if (!tag_start)
+                   {
+                      esc_start = p;
+                      esc_end = NULL;
+                      _prepend_text_run(o, s, p);
+                      s = NULL;
+                   }
+              }
+            else if (*p == ';')
+              {
+                 if (esc_start)
+                   {
+                      esc_end = p;
+                      s = p + 1;
+                   }
+              }
+            p++;
+         }
+     }
+}
+
+/**
+ * to be documented.
+ * @param obj  to be documented.
+ * @return to be documented.
+ */
+EAPI const char *
+evas_object_textblock_text_markup_get(const Evas_Object *obj)
+{
+   Evas_Object_Textblock_Node *n;
+   Eina_Strbuf *txt = NULL;
+
+   TB_HEAD_RETURN(NULL);
+   if (o->markup_text) return(o->markup_text);
+   txt = eina_strbuf_new();
+   EINA_INLIST_FOREACH(o->nodes, n)
+     {
+       size_t replace_len = eina_strbuf_length_get(n->text);
+        if ((n->type == NODE_FORMAT) && replace_len)
+         {
+            size_t tag_len;
+            const char *tag = _style_match_replace(o->style, eina_strbuf_string_get(n->text), replace_len, &tag_len);
+            eina_strbuf_append_char(txt, '<');
+            if (tag)
+              {
+                 // FIXME: need to escape
+                 eina_strbuf_append_length(txt, tag, tag_len);
+              }
+            else
+              {
+                 const char *s;
+                 int push = 0;
+                 int pop = 0;
+
+                 // FIXME: need to escape
+                 s = eina_strbuf_string_get(n->text);
+                 if (*s == '+') push = 1;
+                 if (*s == '-') pop = 1;
+                 while ((*s == ' ') || (*s == '+') || (*s == '-')) s++;
+                 if (pop) eina_strbuf_append_char(txt, '/');
+                 if (push) eina_strbuf_append(txt, "+ ");
+                 eina_strbuf_append(txt, s);
+              }
+            eina_strbuf_append_char(txt, '>');
+         }
+       else if ((n->type == NODE_TEXT) && eina_strbuf_length_get(n->text))
+         {
+            const char *p = eina_strbuf_string_get(n->text);
+
+            while (*p)
+              {
+                 const char *escape;
+                 int adv;
+
+                 escape = _escaped_char_match(p, &adv);
+                 if (escape)
+                   {
+                      p += adv;
+                      eina_strbuf_append(txt, escape);
+                   }
+                 else
+                   {
+                      eina_strbuf_append_char(txt, *p);
+                      p++;
+                   }
+              }
+         }
+     }
+   o->markup_text = eina_strbuf_string_steal(txt);
+   eina_strbuf_free(txt);
+   return o->markup_text;
+}
+
+/* cursors */
+/**
+ * to be documented.
+ * @param obj  to be documented.
+ * @return to be documented.
+ */
+EAPI const Evas_Textblock_Cursor *
+evas_object_textblock_cursor_get(const Evas_Object *obj)
+{
+   TB_HEAD_RETURN(NULL);
+   return o->cursor;
+}
+
+/**
+ * to be documented.
+ * @param obj  to be documented.
+ * @return to be documented.
+ */
+EAPI Evas_Textblock_Cursor *
+evas_object_textblock_cursor_new(Evas_Object *obj)
+{
+   Evas_Textblock_Cursor *cur;
+
+   TB_HEAD_RETURN(NULL);
+   cur = calloc(1, sizeof(Evas_Textblock_Cursor));
+   cur->obj = obj;
+   cur->node = o->nodes;
+   cur->pos = 0;
+   cur->eol = 0;
+   o->cursors = eina_list_append(o->cursors, cur);
+   return cur;
+}
+
+/**
+ * to be documented.
+ * @param cur  to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_cursor_free(Evas_Textblock_Cursor *cur)
+{
+   Evas_Object_Textblock *o;
+
+   if (!cur) return;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   if (cur == o->cursor) return;
+   o->cursors = eina_list_remove(o->cursors, cur);
+   free(cur);
+}
+
+/**
+ * to be documented.
+ * @param cur  to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_cursor_node_first(Evas_Textblock_Cursor *cur)
+{
+   Evas_Object_Textblock *o;
+
+   if (!cur) return;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   cur->node = o->nodes;
+   cur->pos = 0;
+   cur->eol = 0;
+}
+
+/**
+ * to be documented.
+ * @param cur  to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_cursor_node_last(Evas_Textblock_Cursor *cur)
+{
+   Evas_Object_Textblock *o;
+
+   if (!cur) return;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   if (o->nodes)
+     {
+       cur->node = (Evas_Object_Textblock_Node *)((EINA_INLIST_GET(o->nodes))->last);
+       cur->pos = 0;
+        cur->eol = 0;  // 1
+       evas_textblock_cursor_char_last(cur);
+     }
+   else
+     {
+       cur->node = NULL;
+       cur->pos = 0;
+        cur->eol = 0; // 1
+     }
+}
+
+/**
+ * to be documented.
+ * @param cur  to be documented.
+ * @return to be documented.
+ */
+EAPI Eina_Bool
+evas_textblock_cursor_node_next(Evas_Textblock_Cursor *cur)
+{
+   if (!cur) return EINA_FALSE;
+   if (!cur->node) return EINA_FALSE;
+   if ((EINA_INLIST_GET(cur->node))->next)
+     {
+       cur->node = (Evas_Object_Textblock_Node *)((EINA_INLIST_GET(cur->node))->next);
+       cur->pos = 0;
+        cur->eol = 0;
+       return EINA_TRUE;
+     }
+   return EINA_FALSE;
+}
+
+/**
+ * to be documented.
+ * @param cur  to be documented.
+ * @return to be documented.
+ */
+EAPI Eina_Bool
+evas_textblock_cursor_node_prev(Evas_Textblock_Cursor *cur)
+{
+   if (!cur) return EINA_FALSE;
+   if (!cur->node) return EINA_FALSE;
+   if ((EINA_INLIST_GET(cur->node))->prev)
+     {
+       cur->node = (Evas_Object_Textblock_Node *)((EINA_INLIST_GET(cur->node))->prev);
+       evas_textblock_cursor_char_last(cur);
+       return EINA_TRUE;
+     }
+   return EINA_FALSE;
+}
+
+/**
+ * to be documented.
+ * @param cur  to be documented.
+ * @return to be documented.
+ */
+EAPI Eina_Bool
+evas_textblock_cursor_char_next(Evas_Textblock_Cursor *cur)
+{
+   int index, ch;
+
+   if (!cur) return EINA_FALSE;
+   if (!cur->node) return EINA_FALSE;
+   if (cur->node->type == NODE_FORMAT) return EINA_FALSE;
+   if (!eina_strbuf_length_get(cur->node->text)) return EINA_FALSE;
+   index = cur->pos;
+
+   if (cur->node->type == NODE_TEXT)
+     {
+        Evas_Object_Textblock_Line *ln = NULL;
+        Evas_Object_Textblock_Item *it = NULL;
+        int pos;
+
+       _find_layout_item_line_match(cur->obj, cur->node, cur->pos, cur->eol, &ln, &it);
+        if (it)
+          {
+             pos = cur->pos - it->source_pos;
+             if (pos <= 0) index -= pos;
+          }
+        else
+          printf("TB: 'it' not found\n");
+     }
+
+   ch = evas_common_font_utf8_get_next((unsigned char *)eina_strbuf_string_get(cur->node->text), &index);
+   if ((ch == 0) || (index < 0)) return EINA_FALSE;
+   if (eina_strbuf_string_get(cur->node->text)[index] == 0) return EINA_FALSE;
+   cur->pos = index;
+   cur->eol = 0; // 1
+   return EINA_TRUE;
+}
+
+/**
+ * to be documented.
+ * @param cur  to be documented.
+ * @return to be documented.
+ */
+EAPI Eina_Bool
+evas_textblock_cursor_char_prev(Evas_Textblock_Cursor *cur)
+{
+   int index;
+   int at_end_of_line = 0;
+   int at_start_of_line = 0;
+
+   if (!cur) return EINA_FALSE;
+   if (!cur->node) return EINA_FALSE;
+   if (cur->node->type == NODE_FORMAT) return EINA_FALSE;
+   if (!eina_strbuf_length_get(cur->node->text)) return EINA_FALSE;
+   index = cur->pos;
+   if (index == 0) return EINA_FALSE;
+
+   // XXX: FIXME: determine at_end_of_line and at_start_of_line
+
+   if (cur->node->type == NODE_TEXT)
+     {
+        Evas_Object_Textblock_Line *ln = NULL;
+        Evas_Object_Textblock_Item *it = NULL;
+        int pos;
+
+       _find_layout_item_line_match(cur->obj, cur->node, cur->pos, cur->eol, &ln, &it);
+        if (it)
+          {
+             pos = cur->pos - it->source_pos;
+             if (pos <= 0) at_start_of_line = 1;
+             if (it->text)
+               {
+                  int plast;
+
+                  plast = evas_common_font_utf8_get_last((unsigned char *) it->text, strlen(it->text));
+                  if ((index - it->source_pos) == plast) at_end_of_line = 1;
+               }
+          }
+     }
+
+   if ((cur->eol) && (at_end_of_line))
+     {
+        cur->eol = 0;
+        return EINA_TRUE;
+     }
+   evas_common_font_utf8_get_prev((unsigned char *)eina_strbuf_string_get(cur->node->text), &index);
+   if (/*(ch == 0) || */(index < 0)) return EINA_FALSE;
+   cur->pos = index;
+   if (at_start_of_line)
+     cur->eol =1;
+   else
+     cur->eol = 0;
+   return EINA_TRUE;
+}
+
+/**
+ * to be documented.
+ * @param cur  to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_cursor_char_first(Evas_Textblock_Cursor *cur)
+{
+   if (!cur) return;
+   cur->pos = 0;
+   cur->eol = 0;
+}
+
+/**
+ * to be documented.
+ * @param cur  to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_cursor_char_last(Evas_Textblock_Cursor *cur)
+{
+   int index;
+
+   if (!cur) return;
+   if (!cur->node) return;
+   if (cur->node->type == NODE_FORMAT)
+     {
+       cur->pos = 0;
+       return;
+     }
+   index = evas_common_font_utf8_get_last((unsigned char *)eina_strbuf_string_get(cur->node->text), eina_strbuf_length_get(cur->node->text));
+   if (index < 0) cur->pos = 0;
+   cur->pos = index;
+   cur->eol = 0; // 1
+}
+
+/**
+ * to be documented.
+ * @param cur  to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_cursor_line_first(Evas_Textblock_Cursor *cur)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Line *ln = NULL;
+   Evas_Object_Textblock_Item *it = NULL;
+   Evas_Object_Textblock_Format_Item *fi = NULL;
+
+   if (!cur) return;
+   if (!cur->node) return;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   if (!o->formatted.valid) _relayout(cur->obj);
+   if (cur->node->type == NODE_FORMAT)
+     _find_layout_format_item_line_match(cur->obj, cur->node, &ln, &fi);
+   else
+     _find_layout_item_line_match(cur->obj, cur->node, cur->pos, cur->eol, &ln, &it);
+   if (!ln) return;
+   cur->eol = 0;
+   it = (Evas_Object_Textblock_Item *)ln->items;
+   fi = (Evas_Object_Textblock_Format_Item *)ln->format_items;
+   if ((it) && (fi))
+     {
+       if (it->x < fi->x) fi = NULL;
+       else it = NULL;
+     }
+   if (it)
+     {
+       cur->pos = it->source_pos;
+       cur->node = it->source_node;
+     }
+   else if (fi)
+     {
+       cur->pos = 0;
+       cur->node = fi->source_node;
+     }
+}
+
+/**
+ * to be documented.
+ * @param cur  to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_cursor_line_last(Evas_Textblock_Cursor *cur)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Line *ln = NULL;
+   Evas_Object_Textblock_Item *it = NULL;
+   Evas_Object_Textblock_Format_Item *fi = NULL;
+
+   if (!cur) return;
+   if (!cur->node) return;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   if (!o->formatted.valid) _relayout(cur->obj);
+// kills "click below text" and up/downm arrow. disable   
+//   cur->eol = 1;
+   if (cur->node->type == NODE_FORMAT)
+     _find_layout_format_item_line_match(cur->obj, cur->node, &ln, &fi);
+   else
+     _find_layout_item_line_match(cur->obj, cur->node, cur->pos, cur->eol, &ln, &it);
+   if (!ln) return;
+   if (ln->items)
+     it = (Evas_Object_Textblock_Item *)((EINA_INLIST_GET(ln->items))->last);
+   else
+     it = NULL;
+   if (ln->format_items)
+     fi = (Evas_Object_Textblock_Format_Item *)((EINA_INLIST_GET(ln->format_items))->last);
+   else
+     fi = NULL;
+   if ((it) && (fi))
+     {
+       if ((it->x + it->w) > (fi->x + fi->w)) fi = NULL;
+       else it = NULL;
+     }
+   if (it)
+     {
+       int index;
+
+       cur->pos = it->source_pos;
+       cur->node = it->source_node;
+       index = evas_common_font_utf8_get_last((unsigned char *)it->text, strlen(it->text));
+        if ((index >= 0) && (it->text[0] != 0))
+          evas_common_font_utf8_get_next((unsigned char *)(it->text), &index);
+       if (index >= 0) cur->pos += index;
+     }
+   else if (fi)
+     {
+       cur->pos = 0;
+        cur->eol = 0;
+       cur->node = fi->source_node;
+     }
+}
+
+/**
+ * to be documented.
+ * @param cur  to be documented.
+ * @return to be documented.
+ */
+EAPI int
+evas_textblock_cursor_pos_get(const Evas_Textblock_Cursor *cur)
+{
+   if (!cur) return -1;
+   return cur->pos;
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @param pos to be documented.
+ */
+EAPI void
+evas_textblock_cursor_pos_set(Evas_Textblock_Cursor *cur, int pos)
+{
+   unsigned int len;
+
+   if (!cur) return;
+   if (!cur->node) return;
+   if (cur->node->type == NODE_FORMAT) pos = 0;
+   len = eina_strbuf_length_get(cur->node->text);
+   if (pos < 0) pos = 0;
+   else if (pos > len) pos = len;
+   cur->pos = pos;
+   cur->eol = 0;
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @param line to be documented.
+ * @return to be documented.
+ */
+EAPI Eina_Bool
+evas_textblock_cursor_line_set(Evas_Textblock_Cursor *cur, int line)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Line *ln;
+   Evas_Object_Textblock_Item *it;
+   Evas_Object_Textblock_Format_Item *fi;
+
+   if (!cur) return EINA_FALSE;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   if (!o->formatted.valid) _relayout(cur->obj);
+
+   ln = _find_layout_line_num(cur->obj, line);
+   if (!ln) return EINA_FALSE;
+   it = (Evas_Object_Textblock_Item *)ln->items;
+   fi = (Evas_Object_Textblock_Format_Item *)ln->format_items;
+   if ((it) && (fi))
+     {
+       if (it->x < fi->x) fi = NULL;
+       else it = NULL;
+     }
+   if (it)
+     {
+       cur->pos = it->source_pos;
+        cur->eol = 0;
+       cur->node = it->source_node;
+     }
+   else if (fi)
+     {
+       cur->pos = 0;
+        cur->eol = 0;
+       cur->node = fi->source_node;
+     }
+   else
+     {
+        cur->pos = 0;
+        cur->eol = 0;
+        cur->node = o->nodes;
+     }
+   return EINA_TRUE;
+}
+
+/**
+ * to be documented.
+ * @param cur1 to be documented.
+ * @param cur2 to be documented.
+ * @return to be documented.
+ */
+EAPI int
+evas_textblock_cursor_compare(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2)
+{
+   Eina_Inlist *l1, *l2;
+
+   if (!cur1) return 0;
+   if (!cur2) return 0;
+   if (cur1->obj != cur2->obj) return 0;
+   if ((!cur1->node) || (!cur2->node)) return 0;
+   if (cur1->node == cur2->node)
+     {
+       if (cur1->pos < cur2->pos) return -1; /* cur1 < cur2 */
+       else if (cur1->pos > cur2->pos) return 1; /* cur2 < cur1 */
+        if ((cur1->eol) == (cur1->eol)) return 0; /* cur1 == cur2 */
+        if (cur1->eol) return 1; /* cur2 < cur1 */
+       return -1; /* cur1 < cur2 */
+     }
+   for (l1 = EINA_INLIST_GET(cur1->node),
+        l2 = EINA_INLIST_GET(cur1->node); (l1) || (l2);)
+     {
+       if (l1 == EINA_INLIST_GET(cur2->node)) return 1; /* cur2 < cur 1 */
+       else if (l2 == EINA_INLIST_GET(cur2->node)) return -1; /* cur1 < cur 2 */
+       else if (!l1) return -1; /* cur1 < cur 2 */
+       else if (!l2) return 1; /* cur2 < cur 1 */
+       if (l1) l1 = l1->prev;
+       if (l2) l2 = l2->next;
+     }
+   return 0;
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @param cur_dest to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_cursor_copy(const Evas_Textblock_Cursor *cur, Evas_Textblock_Cursor *cur_dest)
+{
+   if (!cur) return;
+   if (!cur_dest) return;
+   if (cur->obj != cur_dest->obj) return;
+   cur_dest->pos = cur->pos;
+   cur_dest->node = cur->node;
+   cur_dest->eol = cur->eol;
+}
+
+
+/* text controls */
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @param text to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_cursor_text_append(Evas_Textblock_Cursor *cur, const char *text)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Node *n, *nrel;
+   int index, ch;
+
+   if (!cur) return;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   if (text)
+     {
+       Eina_List *l;
+       Evas_Textblock_Cursor *data;
+
+       if (cur != o->cursor)
+         {
+            if (cur->node == o->cursor->node)
+              {
+                 if (o->cursor->pos > cur->pos)
+                    {
+                       o->cursor->pos += strlen(text);
+                    }
+              }
+         }
+       EINA_LIST_FOREACH(o->cursors, l, data)
+         {
+            if (data != cur)
+              {
+                 if (cur->node == data->node)
+                   {
+                      if (data->pos > cur->pos)
+                         {
+                            data->pos += strlen(text);
+                         }
+                   }
+              }
+         }
+     }
+   n = cur->node;
+   if ((!n) || (n->type == NODE_FORMAT))
+     {
+       nrel = n;
+       n = calloc(1, sizeof(Evas_Object_Textblock_Node));
+       n->type = NODE_TEXT;
+       n->text = eina_strbuf_new();
+       if (nrel)
+         o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_append_relative(EINA_INLIST_GET(o->nodes),
+                                                                              EINA_INLIST_GET(n),
+                                                                              EINA_INLIST_GET(nrel));
+       else
+         o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_append(EINA_INLIST_GET(o->nodes), EINA_INLIST_GET(n));
+     }
+   cur->node = n;
+   index = cur->pos;
+   if (eina_strbuf_length_get(n->text))
+     {
+       ch = evas_common_font_utf8_get_next((unsigned char *)eina_strbuf_string_get(n->text), &index);
+       if (ch != 0)
+          {
+             cur->pos = index;
+          }
+     }
+   if (cur->pos >= (eina_strbuf_length_get(n->text) - 1))
+     eina_strbuf_append(n->text, (char *)text);
+   else
+     eina_strbuf_insert(n->text, (char *)text, cur->pos);
+// XXX: This makes no sense?
+   if (text)
+     {
+        cur->pos += strlen(text);
+     }
+   o->formatted.valid = 0;
+   o->native.valid = 0;
+   o->changed = 1;
+   if (o->markup_text)
+     {
+       free(o->markup_text);
+       o->markup_text = NULL;
+     }
+   _nodes_adjacent_merge(cur->obj, n);
+   evas_object_change(cur->obj);
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @param text to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_cursor_text_prepend(Evas_Textblock_Cursor *cur, const char *text)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Node *n, *nrel;
+
+   if (!cur) return;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+     {
+       Eina_List *l;
+       Evas_Textblock_Cursor *data;
+
+       if (cur != o->cursor)
+         {
+            if (cur->node == o->cursor->node)
+              {
+                 if ((o->cursor->node) &&
+                     (o->cursor->node->type == NODE_TEXT) &&
+                     (o->cursor->pos >= cur->pos))
+                    {
+                       o->cursor->pos += strlen(text);
+                    }
+              }
+         }
+       EINA_LIST_FOREACH(o->cursors, l, data)
+         {
+            if (data != cur)
+              {
+                 if (cur->node == data->node)
+                   {
+                      if (data->node &&
+                          (data->node->type == NODE_TEXT) &&
+                          (data->pos >= cur->pos))
+                         {
+                            data->pos += strlen(text);
+                         }
+                   }
+              }
+         }
+     }
+   n = cur->node;
+   if ((!n) || (n->type == NODE_FORMAT))
+     {
+       nrel = n;
+       n = calloc(1, sizeof(Evas_Object_Textblock_Node));
+       n->type = NODE_TEXT;
+       n->text = eina_strbuf_new();
+       if (nrel)
+         o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_prepend_relative(EINA_INLIST_GET(o->nodes),
+                                                                               EINA_INLIST_GET(n),
+                                                                               EINA_INLIST_GET(nrel));
+       else
+         o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_prepend(EINA_INLIST_GET(o->nodes), EINA_INLIST_GET(n));
+     }
+   if (!n->text) n->text = eina_strbuf_new();
+   cur->node = n;
+   
+   if (text)
+     {
+        if (cur->pos > (eina_strbuf_length_get(n->text) - 1))
+          {
+             eina_strbuf_append(n->text, (char *)text);
+          }
+        else
+          {
+             eina_strbuf_insert(n->text, (char *)text, cur->pos);
+          }
+        cur->pos += strlen(text);
+     }
+   o->formatted.valid = 0;
+   o->native.valid = 0;
+   o->changed = 1;
+   if (o->markup_text)
+     {
+       free(o->markup_text);
+       o->markup_text = NULL;
+     }
+   _nodes_adjacent_merge(cur->obj, n);
+   evas_object_change(cur->obj);
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @param format to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur, const char *format)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Node *n, *nc, *n2;
+
+   if (!cur) return;
+   if ((!format) || (format[0] == 0)) return;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   nc = cur->node;
+   n = calloc(1, sizeof(Evas_Object_Textblock_Node));
+   n->type = NODE_FORMAT;
+   n->text = eina_strbuf_new();
+   eina_strbuf_append(n->text, format);
+   if (!nc)
+     {
+        o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_append(EINA_INLIST_GET(o->nodes), EINA_INLIST_GET(n));
+     }
+   else if (nc->type == NODE_FORMAT)
+     {
+        o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_append_relative(EINA_INLIST_GET(o->nodes),
+                                                                            EINA_INLIST_GET(n),
+                                                                            EINA_INLIST_GET(nc));
+     }
+   else if (nc->type == NODE_TEXT)
+     {
+       int index, ch = 0;
+
+       index = cur->pos;
+       if (eina_strbuf_length_get(nc->text))
+         {
+            ch = evas_common_font_utf8_get_next((unsigned char *)eina_strbuf_string_get(nc->text), &index);
+            if (ch != 0)
+              cur->pos = index;
+         }
+       o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_append_relative(EINA_INLIST_GET(o->nodes),
+                                                                            EINA_INLIST_GET(n),
+                                                                            EINA_INLIST_GET(nc));
+       if ((ch != 0) && (cur->pos < eina_strbuf_length_get(nc->text)))
+         {
+            n2 = calloc(1, sizeof(Evas_Object_Textblock_Node));
+            n2->type = NODE_TEXT;
+            n2->text = eina_strbuf_new();
+            eina_strbuf_append(n2->text, (eina_strbuf_string_get(nc->text) + cur->pos));
+            o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_append_relative(EINA_INLIST_GET(o->nodes),
+                                                                                 EINA_INLIST_GET(n2),
+                                                                                 EINA_INLIST_GET(n));
+
+            eina_strbuf_remove(nc->text, cur->pos, eina_strbuf_length_get(nc->text));
+         }
+     }
+   cur->node = n;
+// XXX: This makes no sense
+   cur->pos = 0;
+   o->formatted.valid = 0;
+   o->native.valid = 0;
+   o->changed = 1;
+   if (o->markup_text)
+     {
+       free(o->markup_text);
+       o->markup_text = NULL;
+     }
+   evas_object_change(cur->obj);
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @param format to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_cursor_format_prepend(Evas_Textblock_Cursor *cur, const char *format)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Node *n, *nc, *n2;
+
+   if (!cur) return;
+   if ((!format) || (format[0] == 0)) return;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   nc = cur->node;
+   n = calloc(1, sizeof(Evas_Object_Textblock_Node));
+   n->type = NODE_FORMAT;
+   n->text = eina_strbuf_new();
+   eina_strbuf_append(n->text, format);
+   if (!nc)
+     {
+       o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_prepend(EINA_INLIST_GET(o->nodes), EINA_INLIST_GET(n));
+       cur->node = n;
+       cur->pos = 0;
+     }
+   else if (nc->type == NODE_FORMAT)
+     {
+        o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_prepend_relative(EINA_INLIST_GET(o->nodes),
+                                                                             EINA_INLIST_GET(n),
+                                                                             EINA_INLIST_GET(nc));
+       cur->node = nc;
+       cur->pos = 0;
+     }
+   else if (nc->type == NODE_TEXT)
+     {
+        int len;
+
+        len = eina_strbuf_length_get(nc->text);
+       if (cur->pos == 0)
+         o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_prepend_relative(EINA_INLIST_GET(o->nodes),
+                                                                               EINA_INLIST_GET(n),
+                                                                               EINA_INLIST_GET(nc));
+       else
+         o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_append_relative(EINA_INLIST_GET(o->nodes),
+                                                                              EINA_INLIST_GET(n),
+                                                                              EINA_INLIST_GET(nc));
+       if ((cur->pos < len) && (cur->pos != 0))
+         {
+            n2 = calloc(1, sizeof(Evas_Object_Textblock_Node));
+            n2->type = NODE_TEXT;
+            n2->text = eina_strbuf_new();
+            eina_strbuf_append(n2->text, 
+                                (eina_strbuf_string_get(nc->text) + cur->pos));
+            o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_append_relative(EINA_INLIST_GET(o->nodes),
+                                                                                 EINA_INLIST_GET(n2),
+                                                                                 EINA_INLIST_GET(n));
+            eina_strbuf_remove(nc->text, cur->pos, eina_strbuf_length_get(nc->text));
+            cur->node = n2;
+            cur->pos = 0;
+//             cur->eol = 0;
+         }
+       else if (cur->pos == len)
+         {
+             if (EINA_INLIST_GET(n)->next)
+               cur->node = EINA_INLIST_GET(n)->next;
+             else
+               cur->node = n;
+             cur->pos = 0;
+//             cur->eol = 0;
+         }
+       else
+         {
+            cur->node = nc;
+            cur->pos = 0;
+//             cur->eol = 0;
+         }
+     }
+   o->formatted.valid = 0;
+   o->native.valid = 0;
+   o->changed = 1;
+   if (o->markup_text)
+     {
+       free(o->markup_text);
+       o->markup_text = NULL;
+     }
+   evas_object_change(cur->obj);
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_cursor_node_delete(Evas_Textblock_Cursor *cur)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Node *n, *n2;
+
+   if (!cur) return;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   n = cur->node;
+   if (eina_strbuf_length_get(n->text) && (!strcmp(eina_strbuf_string_get(n->text), "\n")) &&
+       (!(EINA_INLIST_GET(n))->next)) return;
+   n2 = (Evas_Object_Textblock_Node *)((EINA_INLIST_GET(n))->next);
+   if (n2)
+     {
+       cur->node = n2;
+       cur->pos = 0;
+     }
+   else
+     {
+       n2 = (Evas_Object_Textblock_Node *)((EINA_INLIST_GET(n))->prev);
+       cur->node = n2;
+       cur->pos = 0;
+       evas_textblock_cursor_char_last(cur);
+     }
+
+     {
+       Eina_List *l;
+       Evas_Textblock_Cursor *data;
+
+       if (cur != o->cursor)
+         {
+            if (n == o->cursor->node)
+              {
+                 o->cursor->node = cur->node;
+                 o->cursor->pos = cur->pos;
+                  o->cursor->eol = cur->eol;
+              }
+         }
+       EINA_LIST_FOREACH(o->cursors, l, data)
+         {
+            if (data != cur)
+              {
+                 if (n == data->node)
+                   {
+                      data->node = cur->node;
+                      data->pos = cur->pos;
+                       data->eol = cur->eol;
+                   }
+              }
+         }
+     }
+
+   o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_remove(EINA_INLIST_GET(o->nodes), EINA_INLIST_GET(n));
+   if (n->text) eina_strbuf_free(n->text);
+   free(n);
+
+   if (n2) _nodes_adjacent_merge(cur->obj, n2);
+
+   o->formatted.valid = 0;
+   o->native.valid = 0;
+   o->changed = 1;
+   if (o->markup_text)
+     {
+       free(o->markup_text);
+       o->markup_text = NULL;
+     }
+   evas_object_change(cur->obj);
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_cursor_char_delete(Evas_Textblock_Cursor *cur)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Node *n, *n2;
+   int chr, index, ppos;
+
+   if (!cur) return;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   n = cur->node;
+   if (n->type == NODE_FORMAT)
+     {
+       evas_textblock_cursor_node_delete(cur);
+       return;
+     }
+   index = cur->pos;
+   chr = evas_common_font_utf8_get_next((unsigned char *)eina_strbuf_string_get(n->text), &index);
+   if (chr == 0) return;
+   ppos = cur->pos;
+   eina_strbuf_remove(n->text, cur->pos, index);
+   if (!eina_strbuf_length_get(n->text))
+     {
+       evas_textblock_cursor_node_delete(cur);
+       return;
+     }
+   if (cur->pos == eina_strbuf_length_get(n->text))
+     {
+       n2 = (Evas_Object_Textblock_Node *)((EINA_INLIST_GET(n))->next);
+       if (n2)
+         {
+            cur->node = n2;
+            cur->pos = 0;
+         }
+       else
+         {
+            cur->pos = 0;
+            evas_textblock_cursor_char_last(cur);
+         }
+     }
+
+     {
+       Eina_List *l;
+       Evas_Textblock_Cursor *data;
+
+       if (cur != o->cursor)
+         {
+            if ((n == o->cursor->node) &&
+                (o->cursor->pos > ppos))
+              {
+                 o->cursor->pos -= (index - ppos);
+              }
+         }
+       EINA_LIST_FOREACH(o->cursors, l, data)
+         {
+            if (data != cur)
+              {
+                 if ((n == data->node) &&
+                     (data->pos > ppos))
+                   {
+                      data->pos -= (index - ppos);
+                   }
+              }
+         }
+     }
+
+   o->formatted.valid = 0;
+   o->native.valid = 0;
+   o->changed = 1;
+   if (o->markup_text)
+     {
+       free(o->markup_text);
+       o->markup_text = NULL;
+     }
+   evas_object_change(cur->obj);
+}
+
+/**
+ * to be documented.
+ * @param cur1 to be documented.
+ * @param cur2 to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_textblock_cursor_range_delete(Evas_Textblock_Cursor *cur1, Evas_Textblock_Cursor *cur2)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Node *n1, *n2, *n, *tn;
+   int chr, index;
+
+   if (!cur1) return;
+   if (!cur2) return;
+   if (cur1->obj != cur2->obj) return;
+   o = (Evas_Object_Textblock *)(cur1->obj->object_data);
+   if (evas_textblock_cursor_compare(cur1, cur2) > 0)
+     {
+       Evas_Textblock_Cursor *tc;
+
+       tc = cur1;
+       cur1 = cur2;
+       cur2 = tc;
+     }
+   n1 = cur1->node;
+   n2 = cur2->node;
+   if ((!n1) || (!n2)) return;
+   index = cur2->pos;
+   chr = evas_common_font_utf8_get_next((unsigned char *)eina_strbuf_string_get(n2->text), &index);
+// XXX: why was this added? this stops sel to end and 
+//   if (chr == 0) return;
+   if (n1 == n2)
+     {
+        if (n1->type == NODE_TEXT)
+         {
+           if (cur1->pos == cur2->pos)
+              {
+                 evas_textblock_cursor_char_delete(cur1);
+                 evas_textblock_cursor_copy(cur1, cur2);
+                 return;
+              }
+            eina_strbuf_remove(n1->text, cur1->pos, index);
+            if (!eina_strbuf_length_get(n1->text))
+              {
+                 evas_textblock_cursor_node_delete(cur1);
+                 evas_textblock_cursor_copy(cur1, cur2);
+                 return;
+              }
+            if (cur1->pos >= eina_strbuf_length_get(n1->text))
+              {
+                 n2 = (Evas_Object_Textblock_Node *)((EINA_INLIST_GET(n1))->next);
+                 if (n2)
+                   {
+                      cur1->node = n2;
+                      cur1->pos = 0;
+                   }
+                 else
+                   {
+                      cur1->pos = 0;
+                      evas_textblock_cursor_char_last(cur1);
+                   }
+              }
+         }
+       else
+         evas_textblock_cursor_node_delete(cur1);
+       evas_textblock_cursor_copy(cur1, cur2);
+     }
+   else
+     {
+       Eina_List *removes, *format_hump = NULL;
+       Evas_Textblock_Cursor tcur;
+       Eina_Inlist *l;
+
+       tcur.node = n2;
+       tcur.pos = 0;
+       index = cur2->pos;
+       chr = evas_common_font_utf8_get_next((unsigned char *)eina_strbuf_string_get(n2->text), &index);
+       if ((chr == 0) || (index >= eina_strbuf_length_get(n2->text)))
+         {
+            tcur.node = (Evas_Object_Textblock_Node *)(EINA_INLIST_GET(n2))->next;
+            tcur.pos = 0;
+            if (!tcur.node)
+              {
+                 if (cur1->pos != 0)
+                   {
+                      tcur.node = n1;
+                      index = cur1->pos;
+                      chr = evas_common_font_utf8_get_prev((unsigned char *)eina_strbuf_string_get(n2->text), &index);
+                      tcur.pos = index;
+                   }
+                 else
+                   {
+                      tcur.node = (Evas_Object_Textblock_Node *)(EINA_INLIST_GET(n1))->prev;
+                      if ((tcur.node) && (tcur.node->type == NODE_TEXT))
+                        tcur.pos = evas_common_font_utf8_get_last((unsigned char *)eina_strbuf_string_get(tcur.node->text), eina_strbuf_length_get(tcur.node->text));
+                      else
+                        tcur.pos = 0;
+                   }
+              }
+         }
+       eina_strbuf_remove(n1->text, cur1->pos, eina_strbuf_length_get(n1->text));
+       removes = NULL;
+       for (l = (EINA_INLIST_GET(n1))->next; l != EINA_INLIST_GET(n2); l = l->next)
+         removes = eina_list_append(removes, l);
+       format_hump = NULL;
+       if (n1->type == NODE_TEXT)
+         {
+            if (!eina_strbuf_length_get(n1->text))
+              evas_textblock_cursor_node_delete(cur1);
+         }
+       else
+         {
+            if (eina_strbuf_length_get(n1->text) && (eina_strbuf_string_get(n1->text)[0] == '+'))
+              format_hump = eina_list_append(format_hump, n1);
+            else
+              {
+                  o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_remove(EINA_INLIST_GET(o->nodes), EINA_INLIST_GET(n1));
+                 if (n1->text) eina_strbuf_free(n1->text);
+                 free(n1);
+              }
+         }
+       while (removes)
+         {
+            n = removes->data;
+            if (n->type == NODE_TEXT)
+              {
+                 o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_remove(EINA_INLIST_GET(o->nodes), EINA_INLIST_GET(n));
+                 if (n->text) eina_strbuf_free(n->text);
+                 free(n);
+              }
+            else
+              {
+                 if (eina_strbuf_string_get(n->text)[0] == '+')
+                   {
+                      format_hump = eina_list_append(format_hump, n);
+                   }
+                 else if (eina_strbuf_string_get(n->text)[0] == '-')
+                   {
+                      tn = eina_list_data_get(eina_list_last(format_hump));
+                      if (tn)
+                        {
+                           format_hump = eina_list_remove_list(format_hump, eina_list_last(format_hump));
+                           o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_remove(EINA_INLIST_GET(o->nodes),
+                                                                                       EINA_INLIST_GET(tn));
+                           if (tn->text) eina_strbuf_free(tn->text);
+                           free(tn);
+                           o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_remove(EINA_INLIST_GET(o->nodes),
+                                                                                       EINA_INLIST_GET(n));
+                           if (n->text) eina_strbuf_free(n->text);
+                           free(n);
+                        }
+                   }
+                 else
+                   {
+                      o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_remove(EINA_INLIST_GET(o->nodes),
+                                                                                  EINA_INLIST_GET(n));
+                      if (n->text) eina_strbuf_free(n->text);
+                      free(n);
+                   }
+              }
+            removes = eina_list_remove_list(removes, removes);
+         }
+        if (n2->type == NODE_TEXT)
+         {
+            eina_strbuf_remove(n2->text, 0, index);
+            if (!eina_strbuf_length_get(n2->text))
+              evas_textblock_cursor_node_delete(cur2);
+         }
+       else
+         {
+            if (tcur.node == n2)
+              {
+                 if ((EINA_INLIST_GET(n2))->next)
+                   {
+                      tcur.node = (Evas_Object_Textblock_Node *) (EINA_INLIST_GET(n2))->next;
+                      tcur.pos = 0;
+                   }
+                 else
+                   {
+                      tcur.node = (Evas_Object_Textblock_Node *) (EINA_INLIST_GET(n2))->next;
+                      if (tcur.node)
+                        {
+                           if (tcur.node->type == NODE_TEXT)
+                             tcur.pos = evas_common_font_utf8_get_last((unsigned char *)eina_strbuf_string_get(tcur.node->text), eina_strbuf_length_get(tcur.node->text));
+                           else
+                             tcur.pos = 0;
+                        }
+                   }
+              }
+            if (eina_strbuf_string_get(n2->text)[0] == '-')
+              {
+                 o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_remove(EINA_INLIST_GET(o->nodes),
+                                                                             EINA_INLIST_GET(n2));
+                 if (n2->text) eina_strbuf_free(n2->text);
+                 free(n2);
+                 n = eina_list_data_get(eina_list_last(format_hump));
+                 if (n)
+                   {
+                      if (tcur.node == n)
+                        {
+                           if ((EINA_INLIST_GET(n))->next)
+                             {
+                                tcur.node = (Evas_Object_Textblock_Node *) (EINA_INLIST_GET(n))->next;
+                                tcur.pos = 0;
+                             }
+                           else
+                             {
+                                tcur.node = (Evas_Object_Textblock_Node *) (EINA_INLIST_GET(n))->next;
+                                if (tcur.node)
+                                  {
+                                     if (tcur.node->type == NODE_TEXT)
+                                       tcur.pos = evas_common_font_utf8_get_last((unsigned char *)eina_strbuf_string_get(tcur.node->text), eina_strbuf_length_get(tcur.node->text));
+                                     else
+                                       tcur.pos = 0;
+                                  }
+                             }
+                        }
+                      o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_remove(EINA_INLIST_GET(o->nodes),
+                                                                                  EINA_INLIST_GET(n));
+                      if (n->text) eina_strbuf_free(n->text);
+                      free(n);
+                   }
+              }
+            else
+              {
+                 o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_remove(EINA_INLIST_GET(o->nodes),
+                                                                             EINA_INLIST_GET(n2));
+                 if (n2->text) eina_strbuf_free(n2->text);
+                 free(n2);
+              }
+         }
+       if (format_hump) eina_list_free(format_hump);
+       cur1->node = tcur.node;
+       cur1->pos = tcur.pos;
+       cur2->node = tcur.node;
+       cur2->pos = tcur.pos;
+     }
+
+   /* FIXME: adjust cursors that are affected by the change */
+   /* this is temporary just avoiding segv's - it sets all other cursors to
+    * the same pos as cur1 and cur2
+    */
+     {
+       Eina_List *l;
+       Evas_Textblock_Cursor *data;
+
+       if ((cur1 != o->cursor) && (cur2 != o->cursor))
+         {
+            evas_textblock_cursor_copy(cur1, o->cursor);
+         }
+       EINA_LIST_FOREACH(o->cursors, l, data)
+         {
+            if ((data != cur1) && (data != cur2))
+              {
+                 evas_textblock_cursor_copy(cur1, data);
+              }
+         }
+     }
+   if (cur1->node) _nodes_adjacent_merge(cur1->obj, cur1->node);
+   if (cur2->node) _nodes_adjacent_merge(cur2->obj, cur2->node);
+
+   o->formatted.valid = 0;
+   o->native.valid = 0;
+   o->changed = 1;
+   if (o->markup_text)
+     {
+       free(o->markup_text);
+       o->markup_text = NULL;
+     }
+   evas_object_change(cur1->obj);
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @return to be documented.
+ */
+EAPI const char *
+evas_textblock_cursor_node_text_get(const Evas_Textblock_Cursor *cur)
+{
+   if (!cur) return NULL;
+   if (!cur->node) return NULL;
+   if (cur->node->type == NODE_TEXT)
+     {
+       return eina_strbuf_string_get(cur->node->text);
+     }
+   return NULL;
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @return to be documented.
+ */
+EAPI int
+evas_textblock_cursor_node_text_length_get(const Evas_Textblock_Cursor *cur)
+{
+   if (!cur) return 0;
+   if (!cur->node) return 0;
+   if (cur->node->type == NODE_TEXT)
+     {
+       return eina_strbuf_length_get(cur->node->text);
+     }
+   return 0;
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @return to be documented.
+ */
+EAPI const char *
+evas_textblock_cursor_node_format_get(const Evas_Textblock_Cursor *cur)
+{
+   if (!cur) return NULL;
+   if (!cur->node) return NULL;
+   if (cur->node->type == NODE_FORMAT)
+     {
+       return eina_strbuf_string_get(cur->node->text);
+     }
+   return NULL;
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @return to be documented.
+ */
+EAPI Eina_Bool
+evas_textblock_cursor_node_format_is_visible_get(const Evas_Textblock_Cursor *cur)
+{
+   Evas_Object_Textblock_Node *n;
+
+   if (!cur) return EINA_FALSE;
+   n = cur->node;
+   if (!n) return EINA_FALSE;
+   if (n->type != NODE_FORMAT) return EINA_FALSE;
+   if (!eina_strbuf_length_get(n->text)) return EINA_FALSE;
+     {
+       char *s;
+       char *item;
+       int visible = 0;
+
+       s = (char *)eina_strbuf_string_get(n->text);
+       if (s[0] == '+' || s[0] == '-')
+         {
+            s++;
+         }
+       while ((item = _format_parse(&s)))
+         {
+            char tmp_delim = *s;
+            *s = '\0';
+            if ((!strcmp(item, "\n")) || (!strcmp(item, "\\n")))
+              visible = 1;
+            else if ((!strcmp(item, "\t")) || (!strcmp(item, "\\t")))
+              visible = 1;
+            *s = tmp_delim;
+            if (visible) return EINA_TRUE;
+         }
+     }
+   return EINA_FALSE;
+}
+
+/**
+ * to be documented.
+ * @param cur1 to be documented.
+ * @param cur2 to be documented.
+ * @param format to be documented.
+ * @return to be documented.
+ */
+EAPI char *
+evas_textblock_cursor_range_text_get(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2, Evas_Textblock_Text_Type format)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Node *n1, *n2, *n;
+   Eina_Strbuf *txt;
+   char *s, *ret;
+   int index;
+
+   if (!cur1) return NULL;
+   if (!cur2) return NULL;
+   if (cur1->obj != cur2->obj) return NULL;
+   o = (Evas_Object_Textblock *)(cur1->obj->object_data);
+   if (evas_textblock_cursor_compare(cur1, cur2) > 0)
+     {
+       const Evas_Textblock_Cursor *tc;
+
+       tc = cur1;
+       cur1 = cur2;
+       cur2 = tc;
+     }
+   n1 = cur1->node;
+   n2 = cur2->node;
+   index = cur2->pos;
+   if ((!n1) || (!n2)) return NULL;
+   if (n2->text)
+     evas_common_font_utf8_get_next((unsigned char *)eina_strbuf_string_get(n2->text), &index);
+   txt = eina_strbuf_new();
+   EINA_INLIST_FOREACH(n1, n)
+     {
+       if ((n->type == NODE_TEXT) && (n->text))
+         {
+            s = (char *)eina_strbuf_string_get(n->text);
+            if (format == EVAS_TEXTBLOCK_TEXT_MARKUP)
+              {
+                 const char *p, *ps, *pe;
+
+                 if (eina_strbuf_length_get(n->text))
+                   {
+                      if ((n == n1) && (n == n2))
+                        {
+                           ps = eina_strbuf_string_get(n->text) + cur1->pos;
+                           pe = ps + index - cur1->pos;
+                        }
+                      else if (n == n1)
+                        {
+                           ps = eina_strbuf_string_get(n->text) + cur1->pos;
+                           pe = ps + strlen(ps);
+                        }
+                      else if (n == n2)
+                        {
+                           ps = eina_strbuf_string_get(n->text);
+                           pe = ps + cur2->pos + 1;
+                        }
+                      else
+                        {
+                           ps = eina_strbuf_string_get(n->text);
+                           pe = ps + strlen(ps);
+                        }
+                      p = ps;
+                      while (p < pe)
+                        {
+                           const char *escape;
+                           int adv;
+
+                            if (!*p) break;
+                           escape = _escaped_char_match(p, &adv);
+                           if (escape)
+                             {
+                                p += adv;
+                                eina_strbuf_append(txt, escape);
+                             }
+                           else
+                             {
+                                eina_strbuf_append_char(txt, *p);
+                                p++;
+                             }
+                        }
+                   }
+              }
+            else
+              {
+                 if ((n == n1) && (n == n2))
+                   {
+                      s += cur1->pos;
+                      eina_strbuf_append_n(txt, s, index - cur1->pos);
+                   }
+                 else if (n == n1)
+                   {
+                      s += cur1->pos;
+                      eina_strbuf_append(txt, s);
+                   }
+                 else if (n == n2)
+                   {
+                      eina_strbuf_append_n(txt, s, index);
+                   }
+                 else
+                   {
+                      eina_strbuf_append(txt, s);
+                   }
+              }
+         }
+       else if (n->text)
+         {
+            if (format == EVAS_TEXTBLOCK_TEXT_PLAIN)
+              {
+                 s = (char *)eina_strbuf_string_get(n->text);
+                 while (*s)
+                   {
+                      if (*s == '\n')
+                        eina_strbuf_append_char(txt, '\n');
+                      else if (*s == '\t')
+                        eina_strbuf_append_char(txt, '\t');
+                      s++;
+                   }
+              }
+            else if (format == EVAS_TEXTBLOCK_TEXT_MARKUP)
+              {
+                 size_t tag_len, replace_len = eina_strbuf_length_get(n->text);
+                 const char *tag = _style_match_replace(o->style, eina_strbuf_string_get(n->text), replace_len, &tag_len);
+                 eina_strbuf_append_char(txt, '<');
+                 if (tag)
+                   {
+                      // FIXME: need to escape
+                      eina_strbuf_append_length(txt, tag, tag_len);
+                   }
+                 else
+                   {
+                      int push = 0;
+                      int pop = 0;
+
+                      // FIXME: need to escape
+                      s = (char *)eina_strbuf_string_get(n->text);
+                      if (*s == '+') push = 1;
+                      if (*s == '-') pop = 1;
+                      while ((*s == ' ') || (*s == '+') || (*s == '-')) s++;
+                      if (pop) eina_strbuf_append_char(txt, '/');
+                      if (push) eina_strbuf_append(txt, "+ ");
+                      eina_strbuf_append(txt, s);
+                   }
+                 eina_strbuf_append_char(txt, '>');
+              }
+         }
+       if (n == n2) break;
+     }
+   ret = eina_strbuf_string_steal(txt);
+   eina_strbuf_free(txt);
+   return ret;
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @param cx to be documented.
+ * @param cy to be documented.
+ * @param cw to be documented.
+ * @param ch to be documented.
+ * @return to be documented.
+ */
+EAPI int
+evas_textblock_cursor_char_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Line *ln = NULL;
+   Evas_Object_Textblock_Item *it = NULL;
+   Evas_Object_Textblock_Format_Item *fi = NULL;
+   int x = 0, y = 0, w = 0, h = 0;
+   int pos, ret;
+
+   if (!cur) return -1;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   if (!cur->node)
+     {
+        if (!o->nodes)
+          {
+             ln = o->lines;
+             if (!ln) return -1;
+             if (cx) *cx = ln->x;
+             if (cy) *cy = ln->y;
+             if (cw) *cw = ln->w;
+             if (ch) *ch = ln->h;
+             return ln->line_no;
+          }
+        else
+          return -1;
+     }
+   if (!o->formatted.valid) _relayout(cur->obj);
+   if (cur->node->type == NODE_FORMAT)
+     {
+       _find_layout_format_item_line_match(cur->obj, cur->node, &ln, &fi);
+     }
+   else
+     {
+       _find_layout_item_line_match(cur->obj, cur->node, cur->pos, cur->eol, &ln, &it);
+     }
+   if (!ln)
+     {
+       return -1;
+     }
+   if (it)
+     {
+       pos = cur->pos - it->source_pos;
+       ret = -1;
+        if (cur->eol)
+          {
+             int pos2;
+
+             pos2 = pos;
+             evas_common_font_utf8_get_next((unsigned char *)(it->text), &pos2);
+             if (pos2 > pos) pos = pos2;
+          }
+        if (pos < 0) pos = 0;
+       if (it->format->font.font)
+         ret = cur->ENFN->font_char_coords_get(cur->ENDT, it->format->font.font,
+                                               it->text,
+                                               pos,
+                                               &x, &y, &w, &h);
+       if (ret <= 0)
+         {
+            if (it->format->font.font)
+               cur->ENFN->font_string_size_get(cur->ENDT, it->format->font.font,
+                                               it->text, &w, &h);
+            x = w;
+            y = 0;
+            w = 0;
+         }
+       x = ln->x + it->x - it->inset + x;
+       if (x < ln->x)
+         {
+            x = ln->x;
+            w -= (ln->x - x);
+         }
+       y = ln->y;
+       h = ln->h;
+     }
+   else if (fi)
+     {
+       x = ln->x + fi->x;
+       y = ln->y;
+       w = fi->w;
+       h = ln->h;
+     }
+   else
+     {
+       return -1;
+     }
+   if (cx) *cx = x;
+   if (cy) *cy = y;
+   if (cw) *cw = w;
+   if (ch) *ch = h;
+   return ln->line_no;
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @param cx to be documented.
+ * @param cy to be documented.
+ * @param cw to be documented.
+ * @param ch to be documented.
+ * @return to be documented.
+ */
+EAPI int
+evas_textblock_cursor_line_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Line *ln = NULL;
+   Evas_Object_Textblock_Item *it = NULL;
+   Evas_Object_Textblock_Format_Item *fi = NULL;
+   int x, y, w, h;
+
+   if (!cur) return -1;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   if (!o->formatted.valid) _relayout(cur->obj);
+   if (!cur->node)
+     {
+        ln = o->lines;
+     }
+   else
+     {
+        if (cur->node->type == NODE_FORMAT)
+          _find_layout_format_item_line_match(cur->obj, cur->node, &ln, &fi);
+        else
+          _find_layout_item_line_match(cur->obj, cur->node, cur->pos, cur->eol, &ln, &it);
+     }
+   if (!ln) return -1;
+   x = ln->x;
+   y = ln->y;
+   w = ln->w;
+   h = ln->h;
+   if (cx) *cx = x;
+   if (cy) *cy = y;
+   if (cw) *cw = w;
+   if (ch) *ch = h;
+   return ln->line_no;
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @param x to be documented.
+ * @param y to be documented.
+ * @return to be documented.
+ */
+EAPI Eina_Bool
+evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, Evas_Coord y)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Line *ln;
+   Evas_Object_Textblock_Item *it = NULL, *it_break = NULL;
+   Evas_Object_Textblock_Format_Item *fi = NULL;
+
+   if (!cur) return EINA_FALSE;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   if (!o->formatted.valid) _relayout(cur->obj);
+   x += o->style_pad.l;
+   y += o->style_pad.t;
+   EINA_INLIST_FOREACH(o->lines, ln)
+     {
+       if (ln->y > y) break;
+       if ((ln->y <= y) && ((ln->y + ln->h) > y))
+         {
+            EINA_INLIST_FOREACH(ln->items, it)
+              {
+                 if ((it->x + ln->x) > x)
+                   {
+                      it_break = it;
+                      break;
+                   }
+                 if (((it->x + ln->x) <= x) && (((it->x + ln->x) + it->w) > x))
+                   {
+                      int pos;
+                      int cx, cy, cw, ch;
+
+                      pos = -1;
+                      if (it->format->font.font)
+                        pos = cur->ENFN->font_char_at_coords_get(cur->ENDT,
+                                                                 it->format->font.font,
+                                                                 it->text,
+                                                                 x - it->x - ln->x, 0,
+                                                                 &cx, &cy, &cw, &ch);
+                      if (pos < 0)
+                        return EINA_FALSE;
+                      cur->pos = pos + it->source_pos;
+                      cur->node = it->source_node;
+                      return 1;
+                   }
+              }
+            EINA_INLIST_FOREACH(ln->format_items, fi)
+              {
+                 if ((fi->x + ln->x) > x) break;
+                 if (((fi->x + ln->x) <= x) && (((fi->x + ln->x) + fi->w) > x))
+                   {
+                      cur->pos = 0;
+                       cur->eol = 0;
+                      cur->node = fi->source_node;
+                      return EINA_TRUE;
+                   }
+              }
+            if (it_break)
+              {
+                 it = it_break;
+                 cur->pos = it->source_pos;
+                  cur->eol = 0;
+                 cur->node = it->source_node;
+                 return EINA_TRUE;
+              }
+         }
+     }
+   return EINA_FALSE;
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @param y to be documented.
+ * @return to be documented.
+ */
+EAPI int
+evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord y)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Line *ln;
+
+   if (!cur) return -1;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   if (!o->formatted.valid) _relayout(cur->obj);
+   y += o->style_pad.t;
+   EINA_INLIST_FOREACH(o->lines, ln)
+     {
+       if (ln->y > y) break;
+       if ((ln->y <= y) && ((ln->y + ln->h) > y))
+         {
+            evas_textblock_cursor_line_set(cur, ln->line_no);
+            return ln->line_no;
+         }
+     }
+   return -1;
+}
+
+/**
+ * to be documented.
+ * @param cur1 to be documented.
+ * @param cur2 to be documented.
+ * @return to be documented.
+ */
+EAPI Eina_List *
+evas_textblock_cursor_range_geometry_get(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2)
+{
+   Eina_List *rects = NULL;
+   Evas_Coord cx, cy, cw, ch, lx, ly, lw, lh;
+   Evas_Textblock_Rectangle *tr;
+   int i, line, line2;
+
+   if (!cur1) return NULL;
+   if (!cur2) return NULL;
+   if (cur1->obj != cur2->obj) return NULL;
+   if (evas_textblock_cursor_compare(cur1, cur2) > 0)
+     {
+       const Evas_Textblock_Cursor *tc;
+
+       tc = cur1;
+       cur1 = cur2;
+       cur2 = tc;
+     }
+   line = evas_textblock_cursor_char_geometry_get(cur1, &cx, &cy, &cw, &ch);
+   if (line < 0) return NULL;
+   line = evas_textblock_cursor_line_geometry_get(cur1, &lx, &ly, &lw, &lh);
+   if (line < 0) return NULL;
+   line2 = evas_textblock_cursor_line_geometry_get(cur2, NULL, NULL, NULL, NULL);
+   if (line2 < 0) return NULL;
+   if (line == line2)
+     {
+       tr = calloc(1, sizeof(Evas_Textblock_Rectangle));
+       rects = eina_list_append(rects, tr);
+       tr->x = cx;
+       tr->y = ly;
+       tr->h = lh;
+       line = evas_textblock_cursor_char_geometry_get(cur2, &cx, &cy, &cw, &ch);
+       if (line < 0)
+         {
+            while (rects)
+              {
+                 free(rects->data);
+                 rects = eina_list_remove_list(rects, rects);
+              }
+            return NULL;
+         }
+       tr->w = cx + cw - tr->x;
+     }
+   else
+     {
+       tr = calloc(1, sizeof(Evas_Textblock_Rectangle));
+       rects = eina_list_append(rects, tr);
+       tr->x = cx;
+       tr->y = ly;
+       tr->h = lh;
+       tr->w = lx + lw - cx;
+       for (i = line +1; i < line2; i++)
+         {
+            evas_object_textblock_line_number_geometry_get(cur1->obj, i, &lx, &ly, &lw, &lh);
+            tr = calloc(1, sizeof(Evas_Textblock_Rectangle));
+            rects = eina_list_append(rects, tr);
+            tr->x = lx;
+            tr->y = ly;
+            tr->h = lh;
+            tr->w = lw;
+         }
+       line = evas_textblock_cursor_char_geometry_get(cur2, &cx, &cy, &cw, &ch);
+       if (line < 0)
+         {
+            while (rects)
+              {
+                 free(rects->data);
+                 rects = eina_list_remove_list(rects, rects);
+              }
+            return NULL;
+         }
+       line = evas_textblock_cursor_line_geometry_get(cur2, &lx, &ly, &lw, &lh);
+       if (line < 0)
+         {
+            while (rects)
+              {
+                 free(rects->data);
+                 rects = eina_list_remove_list(rects, rects);
+              }
+            return NULL;
+         }
+       tr = calloc(1, sizeof(Evas_Textblock_Rectangle));
+       rects = eina_list_append(rects, tr);
+       tr->x = lx;
+       tr->y = ly;
+       tr->h = lh;
+       tr->w = cx + cw - lx;
+     }
+   return rects;
+}
+
+/**
+ * to be documented.
+ * @param cur to be documented.
+ * @param cx to be documented.
+ * @param cy to be documented.
+ * @param cw to be documented.
+ * @param ch to be documented.
+ * @return to be documented.
+ */
+EAPI Eina_Bool
+evas_textblock_cursor_format_item_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Line *ln = NULL;
+   Evas_Object_Textblock_Format_Item *fi = NULL;
+   Evas_Coord x, y, w, h;
+
+   if (!cur) return 0;
+   o = (Evas_Object_Textblock *)(cur->obj->object_data);
+   if (!o->formatted.valid) _relayout(cur->obj);
+   _find_layout_format_item_line_match(cur->obj, cur->node, &ln, &fi);
+   if ((!ln) || (!fi)) return 0;
+   x = ln->x + fi->x;
+   y = ln->y + ln->baseline + fi->y;
+   w = fi->w;
+   h = fi->h;
+   if (cx) *cx = x;
+   if (cy) *cy = y;
+   if (cw) *cw = w;
+   if (ch) *ch = h;
+   return 1;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI Eina_Bool
+evas_textblock_cursor_eol_get(const Evas_Textblock_Cursor *cur)
+{
+   if (!cur) return EINA_FALSE;
+   return cur->eol;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_textblock_cursor_eol_set(Evas_Textblock_Cursor *cur, Eina_Bool eol)
+{
+   if (!cur) return;
+   cur->eol = eol;
+}
+
+
+/* general controls */
+/**
+ * to be documented.
+ * @param obj to be documented.
+ * @param line to be documented.
+ * @param cx to be documented.
+ * @param cy to be documented.
+ * @param cw to be documented.
+ * @param ch to be documented.
+ * @return to be documented.
+ */
+EAPI Eina_Bool
+evas_object_textblock_line_number_geometry_get(const Evas_Object *obj, int line, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch)
+{
+   Evas_Object_Textblock_Line *ln;
+
+   TB_HEAD_RETURN(0);
+   ln = _find_layout_line_num(obj, line);
+   if (!ln) return EINA_FALSE;
+   if (cx) *cx = ln->x;
+   if (cy) *cy = ln->y;
+   if (cw) *cw = ln->w;
+   if (ch) *ch = ln->h;
+   return EINA_TRUE;
+}
+
+/**
+ * to be documented.
+ * @param obj to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_object_textblock_clear(Evas_Object *obj)
+{
+   Eina_List *l;
+   Evas_Textblock_Cursor *cur;
+
+   TB_HEAD();
+   _nodes_clear(obj);
+   o->cursor->node = NULL;
+   o->cursor->pos = 0;
+   o->cursor->eol = 0;
+   EINA_LIST_FOREACH(o->cursors, l, cur)
+     {
+       cur->node = NULL;
+       cur->pos = 0;
+        cur->eol = 0;
+     }
+   if (o->lines)
+     {
+       _lines_clear(obj, o->lines);
+       o->lines = NULL;
+     }
+   o->formatted.valid = 0;
+   o->native.valid = 0;
+   o->changed = 1;
+   if (o->markup_text)
+     {
+       free(o->markup_text);
+       o->markup_text = NULL;
+     }
+   evas_object_change(obj);
+   /* FIXME: adjust cursors that are affected by the change */
+}
+
+/**
+ * to be documented.
+ * @param obj to be documented.
+ * @param w to be documented.
+ * @param h to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_object_textblock_size_formatted_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
+{
+   TB_HEAD();
+   if (!o->formatted.valid) _relayout(obj);
+   if (w) *w = o->formatted.w;
+   if (h) *h = o->formatted.h;
+}
+
+/**
+ * to be documented.
+ * @param obj to be documented.
+ * @param w to be documented.
+ * @param h to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_object_textblock_size_native_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
+{
+   TB_HEAD();
+   if (!o->native.valid)
+     {
+       _layout(obj,
+               1,
+               -1, -1,
+               &o->native.w, &o->native.h);
+       o->native.valid = 1;
+     }
+   if (w) *w = o->native.w;
+   if (h) *h = o->native.h;
+}
+
+/**
+ * to be documented.
+ * @param obj to be documented.
+ * @param l to be documented.
+ * @param r to be documented.
+ * @param t to be documented.
+ * @param b to be documented.
+ * @return Returns no value.
+ */
+EAPI void
+evas_object_textblock_style_insets_get(const Evas_Object *obj, Evas_Coord *l, Evas_Coord *r, Evas_Coord *t, Evas_Coord *b)
+{
+   TB_HEAD();
+   if (!o->formatted.valid) _relayout(obj);
+   if (l) *l = o->style_pad.l;
+   if (r) *r = o->style_pad.r;
+   if (t) *t = o->style_pad.t;
+   if (b) *b = o->style_pad.b;
+}
+
+/**
+ * @}
+ */
+
+/* all nice and private */
+static void
+evas_object_textblock_init(Evas_Object *obj)
+{
+   Evas_Object_Textblock *o;
+
+   /* alloc image ob, setup methods and default values */
+   obj->object_data = evas_object_textblock_new();
+   /* set up default settings for this kind of object */
+   obj->cur.color.r = 255;
+   obj->cur.color.g = 255;
+   obj->cur.color.b = 255;
+   obj->cur.color.a = 255;
+   obj->cur.geometry.x = 0.0;
+   obj->cur.geometry.y = 0.0;
+   obj->cur.geometry.w = 0.0;
+   obj->cur.geometry.h = 0.0;
+   obj->cur.layer = 0;
+   /* set up object-specific settings */
+   obj->prev = obj->cur;
+   /* set up methods (compulsory) */
+   obj->func = &object_func;
+   obj->type = o_type;
+
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   o->cursor->obj = obj;
+}
+
+static void *
+evas_object_textblock_new(void)
+{
+   Evas_Object_Textblock *o;
+
+   /* alloc obj private data */
+   o = calloc(1, sizeof(Evas_Object_Textblock));
+   o->magic = MAGIC_OBJ_TEXTBLOCK;
+   o->cursor = calloc(1, sizeof(Evas_Textblock_Cursor));
+   return o;
+}
+
+static void
+evas_object_textblock_free(Evas_Object *obj)
+{
+   Evas_Object_Textblock *o;
+
+   evas_object_textblock_clear(obj);
+   evas_object_textblock_style_set(obj, NULL);
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   free(o->cursor);
+   while (o->cursors)
+     {
+       Evas_Textblock_Cursor *cur;
+
+       cur = (Evas_Textblock_Cursor *)o->cursors->data;
+       o->cursors = eina_list_remove_list(o->cursors, o->cursors);
+       free(cur);
+     }
+   if (o->repch) eina_stringshare_del(o->repch);
+   o->magic = 0;
+   free(o);
+}
+
+static void
+evas_object_textblock_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
+{
+   Evas_Object_Textblock_Line *ln;
+   Evas_Object_Textblock *o;
+   int i, j;
+   int pback = 0, backx = 0;
+   int pline = 0, linex = 0;
+   int pline2 = 0, line2x = 0;
+   int pstrike = 0, strikex = 0;
+   int x2;
+   unsigned char r = 0, g = 0, b = 0, a = 0;
+   unsigned char r2 = 0, g2 = 0, b2 = 0, a2 = 0;
+   unsigned char r3 = 0, g3 = 0, b3 = 0, a3 = 0;
+   int cx, cy, cw, ch, clip;
+   const char vals[5][5] =
+     {
+         {0, 1, 2, 1, 0},
+         {1, 3, 4, 3, 1},
+         {2, 4, 5, 4, 2},
+         {1, 3, 4, 3, 1},
+         {0, 1, 2, 1, 0}
+     };
+
+   /* render object to surface with context, and offxet by x,y */
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   obj->layer->evas->engine.func->context_multiplier_unset(output,
+                                                          context);
+   clip = ENFN->context_clip_get(output, context, &cx, &cy, &cw, &ch);
+#define ITEM_WALK() \
+   EINA_INLIST_FOREACH(o->lines, ln) \
+     { \
+       Evas_Object_Textblock_Item *it; \
+       \
+        pback = 0; \
+        pline = 0; \
+        pline2 = 0; \
+       pstrike = 0; \
+        if (clip) \
+          { \
+             if ((obj->cur.geometry.y + y + ln->y + ln->h) < (cy - 20)) \
+               continue; \
+             if ((obj->cur.geometry.y + y + ln->y) > (cy + ch + 20)) \
+               break; \
+          } \
+       EINA_INLIST_FOREACH(ln->items, it) \
+         { \
+            int yoff; \
+            \
+            yoff = ln->baseline; \
+            if (it->format->valign != -1.0) \
+              yoff = (it->format->valign * (double)(ln->h - it->h)) + it->baseline; \
+             if (clip) \
+               { \
+                  if ((obj->cur.geometry.x + x + ln->x + it->x - it->inset + it->w) < (cx - 20)) \
+                    continue; \
+                  if ((obj->cur.geometry.x + x + ln->x + it->x - it->inset) > (cx + cw + 20)) \
+                    break; \
+               }
+             
+#define ITEM_WALK_END() \
+         } \
+     }
+#define COLOR_SET(col) \
+       ENFN->context_color_set(output, context, \
+                               (obj->cur.cache.clip.r * it->format->color.col.r) / 255, \
+                               (obj->cur.cache.clip.g * it->format->color.col.g) / 255, \
+                               (obj->cur.cache.clip.b * it->format->color.col.b) / 255, \
+                               (obj->cur.cache.clip.a * it->format->color.col.a) / 255);
+#define COLOR_SET_AMUL(col, amul) \
+       ENFN->context_color_set(output, context, \
+                               (obj->cur.cache.clip.r * it->format->color.col.r * (amul)) / 65025, \
+                               (obj->cur.cache.clip.g * it->format->color.col.g * (amul)) / 65025, \
+                               (obj->cur.cache.clip.b * it->format->color.col.b * (amul)) / 65025, \
+                               (obj->cur.cache.clip.a * it->format->color.col.a * (amul)) / 65025);
+#define DRAW_TEXT(ox, oy) \
+   if (it->format->font.font) ENFN->font_draw(output, context, surface, it->format->font.font, \
+                                                obj->cur.geometry.x + ln->x + it->x - it->inset + x + (ox), \
+                                                obj->cur.geometry.y + ln->y + yoff + y + (oy), \
+                                                it->w, it->h, it->w, it->h, it->text);
+#if 0
+//#define DRAW_TEXT(ox, oy) \
+//   if (it->format->font.font) ENFN->font_draw(output, context, surface, it->format->font.font, \
+//                                              obj->cur.geometry.x + ln->x + it->x - it->inset + x + (ox), \
+//                                              obj->cur.geometry.y + ln->y + yoff + y + (oy), \
+//                                              obj->cur.cache.geometry.x + ln->x + it->x - it->inset + x + (ox), \
+//                                              obj->cur.cache.geometry.y + ln->y + yoff + y + (oy), \
+//                                              it->w, it->h, it->w, it->h, it->text);
+#endif
+#define ITEM_WALK_LINE_SKIP_DROP() \
+   if ((ln->y + ln->h) <= 0) continue; \
+   if (ln->y > obj->cur.geometry.h) break
+
+   pback = 0;
+   /* backing */
+   ITEM_WALK();
+   ITEM_WALK_LINE_SKIP_DROP();
+   if ((it->format->backing) && (!pback) && ((EINA_INLIST_GET(it))->next))
+     {
+       pback = 1;
+       backx = it->x;
+       r = it->format->color.backing.r;
+       g = it->format->color.backing.g;
+       b = it->format->color.backing.b;
+       a = it->format->color.backing.a;
+     }
+   else if (((pback) && (!it->format->backing)) ||
+           (!(EINA_INLIST_GET(it))->next) ||
+           (it->format->color.backing.r != r) ||
+           (it->format->color.backing.g != g) ||
+           (it->format->color.backing.b != b) ||
+           (it->format->color.backing.a != a))
+     {
+        if ((it->format->backing) && (!pback) && (!(EINA_INLIST_GET(it))->next))
+          {
+             r = it->format->color.backing.r;
+             g = it->format->color.backing.g;
+             b = it->format->color.backing.b;
+             a = it->format->color.backing.a;
+             pback = 1;
+             backx = it->x;
+          }
+        if (!it->format->backing) x2 = it->x;
+        else x2 = it->x + it->w;
+       if ((pback) && (x2 > backx))
+         {
+            ENFN->context_color_set(output,
+                                    context,
+                                    (obj->cur.cache.clip.r * r) / 255,
+                                    (obj->cur.cache.clip.g * g) / 255,
+                                    (obj->cur.cache.clip.b * b) / 255,
+                                    (obj->cur.cache.clip.a * a) / 255);
+            ENFN->rectangle_draw(output,
+                                 context,
+                                 surface,
+                                 obj->cur.geometry.x + ln->x + backx + x,
+                                 obj->cur.geometry.y + ln->y + y,
+////                             obj->cur.cache.geometry.x + ln->x + backx + x,
+////                             obj->cur.cache.geometry.y + ln->y + y,
+                                 x2 - backx,
+                                 ln->h);
+         }
+        pback = it->format->backing;
+       backx = it->x;
+       r = it->format->color.backing.r;
+       g = it->format->color.backing.g;
+       b = it->format->color.backing.b;
+       a = it->format->color.backing.a;
+     }
+   ITEM_WALK_END();
+
+   /* shadows */
+   ITEM_WALK();
+   ITEM_WALK_LINE_SKIP_DROP();
+   if (it->format->style == EVAS_TEXT_STYLE_SHADOW)
+     {
+       COLOR_SET(shadow);
+       DRAW_TEXT(1, 1);
+     }
+   else if ((it->format->style == EVAS_TEXT_STYLE_OUTLINE_SHADOW) ||
+           (it->format->style == EVAS_TEXT_STYLE_FAR_SHADOW))
+     {
+       COLOR_SET(shadow);
+       DRAW_TEXT(2, 2);
+     }
+   else if ((it->format->style == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW) ||
+           (it->format->style == EVAS_TEXT_STYLE_FAR_SOFT_SHADOW))
+     {
+       for (j = 0; j < 5; j++)
+         {
+            for (i = 0; i < 5; i++)
+              {
+                 if (vals[i][j] != 0)
+                   {
+                      COLOR_SET_AMUL(shadow, vals[i][j] * 50);
+                      DRAW_TEXT(i, j);
+                   }
+              }
+         }
+     }
+   else if (it->format->style == EVAS_TEXT_STYLE_SOFT_SHADOW)
+     {
+       for (j = 0; j < 5; j++)
+         {
+            for (i = 0; i < 5; i++)
+              {
+                 if (vals[i][j] != 0)
+                   {
+                      COLOR_SET_AMUL(shadow, vals[i][j] * 50);
+                      DRAW_TEXT(i - 1, j - 1);
+                   }
+              }
+         }
+     }
+   ITEM_WALK_END();
+
+   /* glows */
+   ITEM_WALK();
+   ITEM_WALK_LINE_SKIP_DROP();
+   if (it->format->style == EVAS_TEXT_STYLE_GLOW)
+     {
+       for (j = 0; j < 5; j++)
+         {
+            for (i = 0; i < 5; i++)
+              {
+                 if (vals[i][j] != 0)
+                   {
+                      COLOR_SET_AMUL(glow, vals[i][j] * 50);
+                      DRAW_TEXT(i - 2, j - 2);
+                   }
+              }
+         }
+       COLOR_SET(glow2);
+       DRAW_TEXT(-1, 0);
+       DRAW_TEXT(1, 0);
+       DRAW_TEXT(0, -1);
+       DRAW_TEXT(0, 1);
+     }
+   ITEM_WALK_END();
+
+   /* outlines */
+   ITEM_WALK();
+   ITEM_WALK_LINE_SKIP_DROP();
+   if ((it->format->style == EVAS_TEXT_STYLE_OUTLINE) ||
+       (it->format->style == EVAS_TEXT_STYLE_OUTLINE_SHADOW) ||
+       (it->format->style == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW))
+     {
+       COLOR_SET(outline);
+       DRAW_TEXT(-1, 0);
+       DRAW_TEXT(1, 0);
+       DRAW_TEXT(0, -1);
+       DRAW_TEXT(0, 1);
+     }
+   else if (it->format->style == EVAS_TEXT_STYLE_SOFT_OUTLINE)
+     {
+       for (j = 0; j < 5; j++)
+         {
+            for (i = 0; i < 5; i++)
+              {
+                 if (((i != 2) || (j != 2)) && (vals[i][j] != 0))
+                   {
+                      COLOR_SET_AMUL(outline, vals[i][j] * 50);
+                      DRAW_TEXT(i - 2, j - 2);
+                   }
+              }
+         }
+     }
+   ITEM_WALK_END();
+
+   /* normal text */
+   ITEM_WALK();
+   ITEM_WALK_LINE_SKIP_DROP();
+   COLOR_SET(normal);
+   DRAW_TEXT(0, 0);
+   if ((it->format->strikethrough) && (!pstrike) && ((EINA_INLIST_GET(it))->next))
+     {
+       pstrike = 1;
+       strikex = it->x;
+       r3 = it->format->color.strikethrough.r;
+       g3 = it->format->color.strikethrough.g;
+       b3 = it->format->color.strikethrough.b;
+       a3 = it->format->color.strikethrough.a;
+     }
+   else if (((pstrike) && (!it->format->strikethrough)) ||
+           (!(EINA_INLIST_GET(it))->next) ||
+           (it->format->color.strikethrough.r != r3) ||
+           (it->format->color.strikethrough.g != g3) ||
+           (it->format->color.strikethrough.b != b3) ||
+           (it->format->color.strikethrough.a != a3))
+     {
+       if ((it->format->strikethrough) && (!pstrike))
+         {
+            strikex = it->x;
+            r3 = it->format->color.strikethrough.r;
+            g3 = it->format->color.strikethrough.g;
+            b3 = it->format->color.strikethrough.b;
+            a3 = it->format->color.strikethrough.a;
+         }
+       x2 = it->x + it->w;
+       if (!it->format->strikethrough)
+         {
+            x2 = it->x;
+            pstrike = 0;
+         }
+       if (x2 > strikex)
+         {
+            ENFN->context_color_set(output,
+                                    context,
+                                    (obj->cur.cache.clip.r * r3) / 255,
+                                    (obj->cur.cache.clip.g * g3) / 255,
+                                    (obj->cur.cache.clip.b * b3) / 255,
+                                    (obj->cur.cache.clip.a * a3) / 255);
+            ENFN->rectangle_draw(output,
+                                 context,
+                                 surface,
+                                 obj->cur.geometry.x + ln->x + strikex + x,
+                                 obj->cur.geometry.y + ln->y + y + (ln->h / 2),
+////                             obj->cur.cache.geometry.x + ln->x + strikex + x,
+////                             obj->cur.cache.geometry.y + ln->y + y + (ln->h / 2),
+                                 x2 - strikex,
+                                 1);
+         }
+       if (it->format->strikethrough) pstrike = 1;
+       strikex = it->x;
+       r3 = it->format->color.strikethrough.r;
+       g3 = it->format->color.strikethrough.g;
+       b3 = it->format->color.strikethrough.b;
+       a3 = it->format->color.strikethrough.a;
+     }
+   if ((it->format->underline) && (!pline) && ((EINA_INLIST_GET(it))->next))
+     {
+       pline = 1;
+       linex = it->x;
+       r = it->format->color.underline.r;
+       g = it->format->color.underline.g;
+       b = it->format->color.underline.b;
+       a = it->format->color.underline.a;
+     }
+   else if (((pline) && (!it->format->underline)) ||
+           (!(EINA_INLIST_GET(it))->next) ||
+           (it->format->color.underline.r != r) ||
+           (it->format->color.underline.g != g) ||
+           (it->format->color.underline.b != b) ||
+           (it->format->color.underline.a != a))
+     {
+       if ((it->format->underline) && (!pline))
+         {
+            linex = it->x;
+            r = it->format->color.underline.r;
+            g = it->format->color.underline.g;
+            b = it->format->color.underline.b;
+            a = it->format->color.underline.a;
+         }
+       x2 = it->x + it->w;
+       if (!it->format->underline)
+         {
+            x2 = it->x;
+            pline = 0;
+         }
+       if (x2 > linex)
+         {
+            ENFN->context_color_set(output,
+                                    context,
+                                    (obj->cur.cache.clip.r * r) / 255,
+                                    (obj->cur.cache.clip.g * g) / 255,
+                                    (obj->cur.cache.clip.b * b) / 255,
+                                    (obj->cur.cache.clip.a * a) / 255);
+            ENFN->rectangle_draw(output,
+                                 context,
+                                 surface,
+                                 obj->cur.geometry.x + ln->x + linex + x,
+                                 obj->cur.geometry.y + ln->y + y + ln->baseline + 1,
+////                             obj->cur.cache.geometry.x + ln->x + linex + x,
+////                             obj->cur.cache.geometry.y + ln->y + y + ln->baseline + 1,
+                                 x2 - linex,
+                                 1);
+         }
+       if (it->format->underline) pline = 1;
+       linex = it->x;
+       r = it->format->color.underline.r;
+       g = it->format->color.underline.g;
+       b = it->format->color.underline.b;
+       a = it->format->color.underline.a;
+     }
+   if ((it->format->underline2) && (!pline2) && ((EINA_INLIST_GET(it))->next))
+     {
+       pline2 = 1;
+       line2x = it->x;
+       r2 = it->format->color.underline2.r;
+       g2 = it->format->color.underline2.g;
+       b2 = it->format->color.underline2.b;
+       a2 = it->format->color.underline2.a;
+     }
+   else if (((pline2) && (!it->format->underline2)) ||
+           (!(EINA_INLIST_GET(it))->next) ||
+           (it->format->color.underline2.r != r2) ||
+           (it->format->color.underline2.g != g2) ||
+           (it->format->color.underline2.b != b2) ||
+           (it->format->color.underline2.a != a2))
+     {
+       if ((it->format->underline2) && (!pline2))
+         {
+            line2x = it->x;
+            r2 = it->format->color.underline2.r;
+            g2 = it->format->color.underline2.g;
+            b2 = it->format->color.underline2.b;
+            a2 = it->format->color.underline2.a;
+         }
+       x2 = it->x + it->w;
+       if (!it->format->underline2)
+         {
+            x2 = it->x;
+            pline2 = 0;
+         }
+       if (x2 > line2x)
+         {
+            ENFN->context_color_set(output,
+                                    context,
+                                    (obj->cur.cache.clip.r * r2) / 255,
+                                    (obj->cur.cache.clip.g * g2) / 255,
+                                    (obj->cur.cache.clip.b * b2) / 255,
+                                    (obj->cur.cache.clip.a * a2) / 255);
+            ENFN->rectangle_draw(output,
+                                 context,
+                                 surface,
+                                 obj->cur.geometry.x + ln->x + line2x + x,
+                                 obj->cur.geometry.y + ln->y + y + ln->baseline + 3,
+////                             obj->cur.cache.geometry.x + ln->x + line2x + x,
+////                             obj->cur.cache.geometry.y + ln->y + y + ln->baseline + 3,
+                                 x2 - line2x,
+                                 1);
+         }
+       if (it->format->underline2) pline2 = 1;
+       line2x = it->x;
+       r2 = it->format->color.underline2.r;
+       g2 = it->format->color.underline2.g;
+       b2 = it->format->color.underline2.b;
+       a2 = it->format->color.underline2.a;
+     }
+   ITEM_WALK_END();
+}
+
+static void
+evas_object_textblock_render_pre(Evas_Object *obj)
+{
+   Evas_Object_Textblock *o;
+   int is_v, was_v;
+
+   /* dont pre-render the obj twice! */
+   if (obj->pre_render_done) return;
+   obj->pre_render_done = 1;
+   /* pre-render phase. this does anything an object needs to do just before */
+   /* rendering. this could mean loading the image data, retrieving it from */
+   /* elsewhere, decoding video etc. */
+   /* then when this is done the object needs to figure if it changed and */
+   /* if so what and where and add the appropriate redraw textblocks */
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   if ((o->changed) ||
+       (o->last_w != obj->cur.geometry.w))
+     {
+       Evas_Object_Textblock_Line *lines;
+
+       lines = o->lines;
+       o->lines = NULL;
+       o->formatted.valid = 0;
+       o->native.valid = 0;
+       _layout(obj,
+               0,
+               obj->cur.geometry.w, obj->cur.geometry.h,
+               &o->formatted.w, &o->formatted.h);
+       o->formatted.valid = 1;
+       if (lines) _lines_clear(obj, lines);
+       o->last_w = obj->cur.geometry.w;
+       o->redraw = 0;
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       o->changed = 0;
+       is_v = evas_object_is_visible(obj);
+       was_v = evas_object_was_visible(obj);
+       goto done;
+     }
+   if (o->redraw)
+     {
+       o->redraw = 0;
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       o->changed = 0;
+       is_v = evas_object_is_visible(obj);
+       was_v = evas_object_was_visible(obj);
+       goto done;
+     }
+   /* if someone is clipping this obj - go calculate the clipper */
+   if (obj->cur.clipper)
+     {
+       if (obj->cur.cache.clip.dirty)
+         evas_object_clip_recalc(obj->cur.clipper);
+       obj->cur.clipper->func->render_pre(obj->cur.clipper);
+     }
+   /* now figure what changed and add draw rects */
+   /* if it just became visible or invisible */
+   is_v = evas_object_is_visible(obj);
+   was_v = evas_object_was_visible(obj);
+   if (is_v != was_v)
+     {
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+       goto done;
+     }
+   if ((obj->cur.map != obj->prev.map) ||
+       (obj->cur.usemap != obj->prev.usemap))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+        goto done;
+     }
+   /* it's not visible - we accounted for it appearing or not so just abort */
+   if (!is_v) goto done;
+   /* clipper changed this is in addition to anything else for obj */
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
+   /* if we restacked (layer or just within a layer) and don't clip anyone */
+   if (obj->restack)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed color */
+   if ((obj->cur.color.r != obj->prev.color.r) ||
+       (obj->cur.color.g != obj->prev.color.g) ||
+       (obj->cur.color.b != obj->prev.color.b) ||
+       (obj->cur.color.a != obj->prev.color.a))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   /* if it changed geometry - and obviously not visibility or color */
+   /* caluclate differences since we have a constant color fill */
+   /* we really only need to update the differences */
+   if ((obj->cur.geometry.x != obj->prev.geometry.x) ||
+       (obj->cur.geometry.y != obj->prev.geometry.y) ||
+       (obj->cur.geometry.w != obj->prev.geometry.w) ||
+       (obj->cur.geometry.h != obj->prev.geometry.h))
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       goto done;
+     }
+   if (o->changed)
+     {
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
+       o->changed = 0;
+     }
+   done:
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
+}
+
+static void
+evas_object_textblock_render_post(Evas_Object *obj)
+{
+/*   Evas_Object_Textblock *o; */
+
+   /* this moves the current data to the previous state parts of the object */
+   /* in whatever way is safest for the object. also if we don't need object */
+   /* data anymore we can free it if the object deems this is a good idea */
+/*   o = (Evas_Object_Textblock *)(obj->object_data); */
+   /* remove those pesky changes */
+   evas_object_clip_changes_clean(obj);
+   /* move cur to prev safely for object data */
+   obj->prev = obj->cur;
+/*   o->prev = o->cur; */
+/*   o->changed = 0; */
+}
+
+static unsigned int evas_object_textblock_id_get(Evas_Object *obj)
+{
+   Evas_Object_Textblock *o;
+
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_TEXTBLOCK;
+}
+
+static unsigned int evas_object_textblock_visual_id_get(Evas_Object *obj)
+{
+   Evas_Object_Textblock *o;
+
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   if (!o) return 0;
+   return MAGIC_OBJ_CUSTOM;
+}
+
+static void *evas_object_textblock_engine_data_get(Evas_Object *obj)
+{
+   Evas_Object_Textblock *o;
+
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   if (!o) return NULL;
+   return o->engine_data;
+}
+
+static int
+evas_object_textblock_is_opaque(Evas_Object *obj)
+{
+   /* this returns 1 if the internal object data implies that the object is */
+   /* currently fulyl opque over the entire gradient it occupies */
+   return 0;
+}
+
+static int
+evas_object_textblock_was_opaque(Evas_Object *obj)
+{
+   /* this returns 1 if the internal object data implies that the object was */
+   /* currently fulyl opque over the entire gradient it occupies */
+   return 0;
+}
+
+static void
+evas_object_textblock_coords_recalc(Evas_Object *obj)
+{
+   Evas_Object_Textblock *o;
+
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   if (obj->cur.geometry.w != o->last_w)
+     {
+       o->formatted.valid = 0;
+       o->native.valid = 0;
+       o->changed = 1;
+     }
+}
+
+static void
+evas_object_textblock_scale_update(Evas_Object *obj)
+{
+   _relayout(obj);
+}
+
+void
+_evas_object_textblock_rehint(Evas_Object *obj)
+{
+   Evas_Object_Textblock *o;
+   Evas_Object_Textblock_Line *ln;
+
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   EINA_INLIST_FOREACH(o->lines, ln)
+     {
+       Evas_Object_Textblock_Item *it;
+
+       EINA_INLIST_FOREACH(ln->items, it)
+         {
+            if (it->format->font.font)
+              evas_font_load_hinting_set(obj->layer->evas,
+                                         it->format->font.font,
+                                         obj->layer->evas->hinting);
+         }
+     }
+   o->formatted.valid = 0;
+   o->native.valid = 0;
+   o->changed = 1;
+   evas_object_change(obj);
+}
diff --git a/src/lib/canvas/evas_rectangle.c b/src/lib/canvas/evas_rectangle.c
new file mode 100644 (file)
index 0000000..217acc5
--- /dev/null
@@ -0,0 +1,98 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+void
+evas_rects_return_difference_rects(Eina_Array *rects, int x, int y, int w, int h, int xx, int yy, int ww, int hh)
+{
+   if (!RECTS_INTERSECT(x, y, w, h, xx, yy, ww, hh))
+     {
+       evas_add_rect(rects, x, y, w, h);
+       evas_add_rect(rects, xx, yy, ww, hh);
+     }
+   else
+     {
+       int x1[4], y1[4], i, j;
+
+       if (x < xx)
+         {
+            x1[0] = x;
+            x1[1] = xx;
+         }
+       else
+         {
+            x1[0] = xx;
+            x1[1] = x;
+         }
+       if ((x + w) < (xx + ww))
+         {
+            x1[2] = x + w;
+            x1[3] = xx + ww;
+         }
+       else
+         {
+            x1[2] = xx + ww;
+            x1[3] = x + w;
+         }
+       if (y < yy)
+         {
+            y1[0] = y;
+            y1[1] = yy;
+         }
+       else
+         {
+            y1[0] = yy;
+            y1[1] = y;
+         }
+       if ((y + h) < (yy + hh))
+         {
+            y1[2] = y + h;
+            y1[3] = yy + hh;
+         }
+       else
+         {
+            y1[2] = yy + hh;
+            y1[3] = y + h;
+         }
+       for (j = 0; j < 3; j++)
+         {
+            for (i = 0; i < 3; i++)
+              {
+                 int intsec1, intsec2;
+                 int tx, ty, tw, th;
+
+                 tx = x1[i];
+                 ty = y1[j];
+                 tw = x1[i + 1] - x1[i];
+                 th = y1[j + 1] - y1[j];
+
+                 intsec1 = (RECTS_INTERSECT(tx, ty, tw, th, x, y, w, h));
+                 intsec2 = (RECTS_INTERSECT(tx, ty, tw, th, xx, yy, ww, hh));
+                 if (intsec1 ^ intsec2)
+                   {
+                      evas_add_rect(rects, tx, ty, tw, th);
+                   }
+              }
+         }
+/*     if (tmp.count > 0) */
+/*       { */
+/*          unsigned int i; */
+
+/*          for (i = 0; i < tmp.count; ++i) */
+/*            { */
+/*               if ((tmp.array[i].w > 0) && (tmp.array[i].h > 0)) */
+/*                 { */
+/*                    int intsec1, intsec2; */
+
+/*                    intsec1 = (RECTS_INTERSECT(tmp.array[i].x, tmp.array[i].y, tmp.array[i].w, tmp.array[i].h, x, y, w, h)); */
+/*                    intsec2 = (RECTS_INTERSECT(tmp.array[i].x, tmp.array[i].y, tmp.array[i].w, tmp.array[i].h, xx, yy, ww, hh)); */
+/*                    if (intsec1 ^ intsec2) */
+/*                      { */
+/*                         evas_add_rect(rects, tmp.array[i].x, tmp.array[i].y, tmp.array[i].w, tmp.array[i].h); */
+/*                      } */
+/*                 } */
+/*            } */
+/*          free(tmp.array); */
+/*       } */
+
+     }
+}
diff --git a/src/lib/canvas/evas_render.c b/src/lib/canvas/evas_render.c
new file mode 100644 (file)
index 0000000..e871e9e
--- /dev/null
@@ -0,0 +1,1405 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+// debug rendering
+//#define REND_DGB 1
+
+#ifdef REND_DGB
+static FILE *dbf = NULL;
+
+static void
+rend_dbg(const char *txt)
+{
+   if (!dbf)
+     {
+        dbf = fopen("EVAS-RENDER-DEBUG.log", "w");
+        if (!dbf) return;
+     }
+   fputs(txt, dbf);
+   fflush(dbf);
+}
+#define RD(args...) \
+   { \
+      char __tmpbuf[4096]; \
+      \
+      snprintf(__tmpbuf, sizeof(__tmpbuf), ##args); \
+      rend_dbg(__tmpbuf); \
+   }
+#define RDI(xxxx) \
+   { \
+      char __tmpbuf[4096]; int __tmpi; \
+      for (__tmpi = 0; __tmpi < xxxx; __tmpi++) \
+        __tmpbuf[__tmpi] = ' '; \
+      __tmpbuf[__tmpi] = 0; \
+      rend_dbg(__tmpbuf); \
+   }
+#else
+#define RD(args...)
+#define RDI(x)
+#endif
+
+static Eina_List *
+evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char do_draw);
+
+/**
+ * Add a damage rectangle.
+ *
+ * @param e The given canvas pointer.
+ * @param x The rectangle's left position.
+ * @param y The rectangle's top position.
+ * @param w The rectangle's width.
+ * @param h The rectangle's height.
+ *
+ * This is the function by which one tells evas that a part of the
+ * canvas has to be repainted.
+ *
+ * @ingroup Evas_Canvas
+ */
+EAPI void
+evas_damage_rectangle_add(Evas *e, int x, int y, int w, int h)
+{
+   Eina_Rectangle *r;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   NEW_RECT(r, x, y, w, h);
+   if (!r) return;
+   e->damages = eina_list_append(e->damages, r);
+   e->changed = 1;
+}
+
+/**
+ * Add an obscured region.
+ *
+ * @param e The given canvas pointer.
+ * @param x The rectangle's left position.
+ * @param y The rectangle's top position
+ * @param w The rectangle's width.
+ * @param h The rectangle's height.
+ *
+ * This is the function by which one tells evas that a part of the
+ * canvas has not to be repainted. To make this region one that have
+ * to be repainted, call the function evas_obscured_clear().
+ *
+ * @see evas_obscured_clear().
+ *
+ * @ingroup Evas_Canvas
+ */
+EAPI void
+evas_obscured_rectangle_add(Evas *e, int x, int y, int w, int h)
+{
+   Eina_Rectangle *r;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   NEW_RECT(r, x, y, w, h);
+   if (!r) return;
+   e->obscures = eina_list_append(e->obscures, r);
+}
+
+/**
+ * Remove all obscured region rectangles from the canvas.
+ *
+ * @param e The given canvas pointer.
+ *
+ * This function removes all the rectangles from the obscured list of
+ * the canvas. It takes obscured areas added with
+ * evas_obscured_rectangle_add() and makes it a region that have to be
+ * repainted.
+ *
+ * @ingroup Evas_Canvas
+ */
+EAPI void
+evas_obscured_clear(Evas *e)
+{
+   Eina_Rectangle *r;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+   EINA_LIST_FREE(e->obscures, r)
+     {
+        eina_rectangle_free(r);
+     }
+}
+
+static Eina_Bool
+_evas_render_has_map(Evas_Object *obj)
+{
+   return ((!((obj->func->can_map) && (obj->func->can_map(obj)))) &&
+           ((obj->cur.map) && (obj->cur.usemap)));
+}
+
+static Eina_Bool
+_evas_render_had_map(Evas_Object *obj)
+{
+   return ((!obj->cur.map) && (obj->prev.usemap));
+}
+
+static Eina_Bool
+_evas_render_is_relevant(Evas_Object *obj)
+{
+   return ((evas_object_is_visible(obj) && (!obj->cur.have_clipees)) ||
+           (evas_object_was_visible(obj) && (!obj->prev.have_clipees)));
+}
+
+static Eina_Bool
+_evas_render_can_render(Evas_Object *obj)
+{
+   return (evas_object_is_visible(obj) && (!obj->cur.have_clipees));
+}
+
+static void
+_evas_render_prev_cur_clip_cache_add(Evas *e, Evas_Object *obj)
+{
+   e->engine.func->output_redraws_rect_add(e->engine.data.output,
+                                           obj->prev.cache.clip.x,
+                                           obj->prev.cache.clip.y,
+                                           obj->prev.cache.clip.w,
+                                           obj->prev.cache.clip.h);
+   e->engine.func->output_redraws_rect_add(e->engine.data.output,
+                                           obj->cur.cache.clip.x,
+                                           obj->cur.cache.clip.y,
+                                           obj->cur.cache.clip.w,
+                                           obj->cur.cache.clip.h);
+}
+
+static void
+_evas_render_cur_clip_cache_del(Evas *e, Evas_Object *obj)
+{
+   e->engine.func->output_redraws_rect_del(e->engine.data.output,
+                                           obj->cur.cache.clip.x,
+                                           obj->cur.cache.clip.y,
+                                           obj->cur.cache.clip.w,
+                                           obj->cur.cache.clip.h);
+}
+
+static void
+_evas_render_phase1_direct(Evas *e, 
+                           Eina_Array *active_objects, 
+                           Eina_Array *restack_objects, 
+                           Eina_Array *delete_objects, 
+                           Eina_Array *render_objects)
+{
+   unsigned int i;
+
+   RD("  [--- PHASE 1 DIRECT\n");
+   for (i = 0; i < render_objects->count; i++)
+     {
+       Evas_Object *obj;
+
+       obj = eina_array_data_get(render_objects, i);
+        RD("    OBJ [%p] changed %i\n", obj, obj->changed);
+       if (obj->changed)
+          {
+             evas_object_clip_recalc(obj);
+             obj->func->render_pre(obj);
+             if (obj->pre_render_done)
+               {
+                  if ((obj->smart.smart) && _evas_render_has_map(obj))
+                    {
+                       RD("    has map + smart\n");
+                       _evas_render_prev_cur_clip_cache_add(e, obj);
+                    }
+               }
+             else if (_evas_render_had_map(obj))
+               {
+                  RD("    no pre-render done\n");
+                  _evas_render_prev_cur_clip_cache_add(e, obj);
+               }
+          }
+       else
+         {
+            if (obj->smart.smart)
+               {
+//                  obj->func->render_pre(obj);
+               }
+            else if (obj->rect_del)
+               {
+                  RD("    rect del\n");
+                  _evas_render_cur_clip_cache_del(e, obj);
+               }
+         }
+     }
+   RD("  ---]\n");
+}
+
+static Eina_Bool
+_evas_render_phase1_object_process(Evas *e, Evas_Object *obj,
+                                   Eina_Array *active_objects,
+                                   Eina_Array *restack_objects,
+                                   Eina_Array *delete_objects,
+                                   Eina_Array *render_objects,
+                                   int restack, int map
+#ifdef REND_DGB
+                                   , int level
+#endif
+                                   )
+{
+   Eina_Bool clean_them = EINA_FALSE;
+   Evas_Object *obj2;
+   int is_active;
+
+   obj->rect_del = 0;
+   obj->render_pre = 0;
+
+   /* because of clip objects - delete 2 cycles later */
+   if (obj->delete_me == 2) eina_array_push(delete_objects, obj);
+   else if (obj->delete_me != 0) obj->delete_me++;
+   /* If the object will be removed, we should not cache anything during this run. */
+   if (obj->delete_me != 0) clean_them = EINA_TRUE;
+
+   /* build active object list */
+   evas_object_clip_recalc(obj);
+   is_active = evas_object_is_active(obj);
+   obj->is_active = is_active;
+
+   RDI(level);
+   RD("    [--- PROCESS [%p] '%s' active = %i, del = %i | %i %i %ix%i\n", obj, obj->type, is_active, obj->delete_me, obj->cur.geometry.x, obj->cur.geometry.y, obj->cur.geometry.w, obj->cur.geometry.h);
+   if ((is_active) || (obj->delete_me != 0))
+     eina_array_push(active_objects, obj);
+
+#ifdef REND_DGB
+   if (!is_active)
+     {
+        RDI(level);
+        RD("     [%p] vis: %i, cache.clip.vis: %i cache.clip.a: %i [%p]\n", obj, obj->cur.visible, obj->cur.cache.clip.visible, obj->cur.cache.clip.a, obj->func->is_visible);
+     }
+#endif
+
+   if (_evas_render_has_map(obj)) map = 1;
+
+   if ((restack) && (!map))
+     {
+       if (!obj->changed)
+          {
+             eina_array_push(&e->pending_objects, obj);
+             obj->changed = 1;
+          }
+       obj->restack = 1;
+       clean_them = EINA_TRUE;
+     }
+
+   if (map)
+     {
+        RDI(level);
+        RD("      obj mapped\n");
+        if (obj->changed)
+          {
+             evas_object_clip_recalc(obj);
+             if ((obj->restack) &&
+                 (is_active) && (!obj->clip.clipees) &&
+                 ((evas_object_is_visible(obj) && (!obj->cur.have_clipees)) ||
+                  (evas_object_was_visible(obj) && (!obj->prev.have_clipees))))
+               {
+                  eina_array_push(render_objects, obj);
+                  _evas_render_prev_cur_clip_cache_add(e, obj);
+                  obj->render_pre = 1;
+               }
+             else if ((is_active) && (!obj->clip.clipees) &&
+                      ((evas_object_is_visible(obj) && (!obj->cur.have_clipees)) ||
+                       (evas_object_was_visible(obj) && (!obj->prev.have_clipees))))
+               {
+                  eina_array_push(render_objects, obj);
+                  _evas_render_prev_cur_clip_cache_add(e, obj);
+                  obj->render_pre = 1;
+               }
+          }
+        return clean_them;
+     }
+   else if (_evas_render_had_map(obj))
+     {
+        RDI(level);
+        RD("      had map - restack objs\n");
+//        eina_array_push(restack_objects, obj);
+        _evas_render_prev_cur_clip_cache_add(e, obj);
+     }
+
+   /* handle normal rendering. this object knows how to handle maps */
+
+   if (obj->changed)
+     {
+       if (obj->smart.smart)
+         {
+             RDI(level);
+             RD("      changed + smart - render ok\n");
+            eina_array_push(render_objects, obj);
+            obj->render_pre = 1;
+            EINA_INLIST_FOREACH(evas_object_smart_members_get_direct(obj), obj2)
+              {
+                 _evas_render_phase1_object_process(e, obj2,
+                                                    active_objects,
+                                                    restack_objects,
+                                                    delete_objects,
+                                                    render_objects,
+                                                    obj->restack,
+                                                     map
+#ifdef REND_DGB
+                                                     , level + 1
+#endif
+                                                     );
+              }
+         }
+       else
+         {
+            if ((is_active) && (!obj->clip.clipees) &&
+                 _evas_render_is_relevant(obj))
+               {
+                  RDI(level);
+                  RD("      relevant + active\n");
+                  if (obj->restack)
+                    eina_array_push(restack_objects, obj);
+                  else
+                    {
+                       eina_array_push(render_objects, obj);
+                       obj->render_pre = 1;
+                    }
+               }
+             else
+               {
+                  RDI(level);
+                  RD("      skip - not smart, not active or clippees or not relevant\n");
+               }
+         }
+     }
+   else
+     {
+        RD("      not changed... [%i] -> (%i %i %p %i) [%i]\n",
+           evas_object_is_visible(obj),
+           obj->cur.visible, obj->cur.cache.clip.visible, obj->smart.smart, obj->cur.cache.clip.a,
+           evas_object_was_visible(obj));
+       if ((!obj->clip.clipees) && (obj->delete_me == 0) &&
+           (_evas_render_can_render(obj) ||
+            (evas_object_was_visible(obj) && (!obj->prev.have_clipees))))
+         {
+            if (obj->smart.smart)
+              {
+                  RDI(level);
+                  RD("      smart + visible/was visible + not clip\n");
+                 eina_array_push(render_objects, obj);
+                 obj->render_pre = 1;
+                 EINA_INLIST_FOREACH
+                    (evas_object_smart_members_get_direct(obj), obj2)
+                   {
+                      _evas_render_phase1_object_process(e, obj2,
+                                                         active_objects,
+                                                         restack_objects,
+                                                         delete_objects,
+                                                         render_objects,
+                                                         restack, map
+#ifdef REND_DGB
+                                                          , level + 1
+#endif
+                                                          );
+                   }
+              }
+            else
+              {
+                 if (evas_object_is_opaque(obj) &&
+                      evas_object_is_visible(obj))
+                   {
+                       RDI(level);
+                       RD("      opaque + visible\n");
+                      eina_array_push(render_objects, obj);
+                      obj->rect_del = 1;
+                   }
+                  else if (evas_object_is_visible(obj))
+                    {
+                       RDI(level);
+                       RD("      visible\n");
+                       eina_array_push(render_objects, obj);
+                       obj->render_pre = 1;
+                    }
+                  else
+                    {
+                       RDI(level);
+                       RD("      skip\n");
+                    }
+              }
+         }
+/*
+        else if (obj->smart.smart)
+          {
+             RDI(level);
+             RD("      smart + mot visible/was visible\n");
+             eina_array_push(render_objects, obj);
+             obj->render_pre = 1;
+             EINA_INLIST_FOREACH
+               (evas_object_smart_members_get_direct(obj), obj2)
+               {
+                  _evas_render_phase1_object_process(e, obj2,
+                                                     active_objects,
+                                                     restack_objects,
+                                                     delete_objects,
+                                                     render_objects,
+                                                     restack, map
+#ifdef REND_DGB
+                                                     , level + 1
+#endif
+                                                     );
+               }
+          }
+ */
+     }
+   if (!is_active) obj->restack = 0;
+   RDI(level);
+   RD("    ---]\n");
+   return clean_them;
+}
+
+static Eina_Bool
+_evas_render_phase1_process(Evas *e,
+                            Eina_Array *active_objects,
+                            Eina_Array *restack_objects,
+                            Eina_Array *delete_objects,
+                            Eina_Array *render_objects)
+{
+   Evas_Layer *lay;
+   Eina_Bool clean_them = EINA_FALSE;
+
+   RD("  [--- PHASE 1\n");
+   EINA_INLIST_FOREACH(e->layers, lay)
+     {
+       Evas_Object *obj;
+
+       EINA_INLIST_FOREACH(lay->objects, obj)
+         {
+            clean_them |= _evas_render_phase1_object_process
+               (e, obj, active_objects, restack_objects, delete_objects,
+                render_objects, 0, 0
+#ifdef REND_DGB
+                , 1
+#endif
+                );
+         }
+     }
+   RD("  ---]\n");
+
+   return clean_them;
+}
+
+static void
+_evas_render_check_pending_objects(Eina_Array *pending_objects, Evas *e)
+{
+   unsigned int i;
+
+   for (i = 0; i < pending_objects->count; ++i)
+     {
+       Evas_Object *obj;
+       int is_active, ok = 0;
+
+       obj = eina_array_data_get(pending_objects, i);
+
+       if (!obj->layer) goto clean_stuff;
+
+       evas_object_clip_recalc(obj);
+       is_active = evas_object_is_active(obj);
+
+       if ((!is_active) && (!obj->is_active) && (!obj->render_pre) &&
+            (!obj->rect_del))
+         {
+            ok = 1;
+            goto clean_stuff;
+         }
+
+       if (obj->is_active == is_active)
+         {
+            if (obj->changed)
+              {
+                 if (obj->smart.smart)
+                   {
+                      if (obj->render_pre || obj->rect_del) ok = 1;
+                   }
+                 else
+                   if ((is_active) && (obj->restack) && (!obj->clip.clipees) &&
+                       (_evas_render_can_render(obj) ||
+                        (evas_object_was_visible(obj) && (!obj->prev.have_clipees))))
+                     {
+                        if (!(obj->render_pre || obj->rect_del)) ok = 1;
+                     }
+                  else
+                    if (is_active && (!obj->clip.clipees) &&
+                        (_evas_render_can_render(obj) ||
+                         (evas_object_was_visible(obj) && (!obj->prev.have_clipees))))
+                      {
+                         if (obj->render_pre || obj->rect_del) ok = 1;
+                      }
+              }
+            else
+              {
+                 if ((!obj->clip.clipees) && (obj->delete_me == 0) &&
+                     (!obj->cur.have_clipees || (evas_object_was_visible(obj) && (!obj->prev.have_clipees)))
+                     && evas_object_is_opaque(obj) && evas_object_is_visible(obj))
+                    {
+                       if (obj->rect_del || obj->smart.smart) ok = 1;
+                    }
+              }
+         }
+
+     clean_stuff:
+       if (!ok)
+         {
+            eina_array_clean(&e->active_objects);
+            eina_array_clean(&e->render_objects);
+            eina_array_clean(&e->restack_objects);
+            eina_array_clean(&e->delete_objects);
+            e->invalidate = 1;
+            return ;
+         }
+     }
+}
+
+Eina_Bool
+pending_change(void *data, void *gdata __UNUSED__)
+{
+   Evas_Object *obj;
+
+   obj = data;
+   if (obj->delete_me) return EINA_FALSE;
+   if (obj->pre_render_done)
+     {
+   RD("  OBJ [%p] pending change %i -> 0, pre %i\n", obj, obj->changed, obj->pre_render_done);
+   obj->pre_render_done = 0;
+//// FIXME: this wipes out changes
+   obj->changed = 0;
+     }
+   return obj->changed ? EINA_TRUE : EINA_FALSE;
+}
+
+static Eina_Bool
+evas_render_mapped(Evas *e, Evas_Object *obj, void *context, void *surface,
+                   int off_x, int off_y, int mapped
+#ifdef REND_DGB
+                   , int level
+#endif
+                   )
+{
+   void *ctx;
+   Evas_Object *obj2;
+   Eina_Bool clean_them = EINA_FALSE;
+
+   evas_object_clip_recalc(obj);
+   RDI(level);
+   RD("      { evas_render_mapped(%p, %p,   %p, %p,   %i, %i,   %i,   %i)\n", e, obj, context, surface, off_x, off_y, mapped, level);
+   if (mapped)
+     {
+        if ((!evas_object_is_visible(obj)) || (obj->clip.clipees) ||
+            (obj->cur.have_clipees))
+          {
+             RDI(level);
+             RD("      }\n");
+             return clean_them;
+          }
+     }
+   else if (!(((evas_object_is_active(obj) && (!obj->clip.clipees) &&
+                (_evas_render_can_render(obj))))
+              ))
+     {
+        RDI(level);
+        RD("      }\n");
+        return clean_them;
+     }
+
+   // set render_pre - for child objs that may not have gotten it.
+   obj->pre_render_done = 1;
+
+   if (_evas_render_has_map(obj))
+     {
+        const Evas_Map_Point *p, *p_end;
+        RGBA_Map_Point pts[4], *pt;
+        int sw, sh;
+        int changed = 0, rendered = 0;
+
+       clean_them = EINA_TRUE;
+
+        sw = obj->cur.geometry.w;
+        sh = obj->cur.geometry.h;
+        RDI(level);
+        RD("        mapped obj: %ix%i\n", sw, sh);
+        if ((sw <= 0) || (sh <= 0))
+          {
+             RDI(level);
+             RD("      }\n");
+             return clean_them;
+          }
+
+        p = obj->cur.map->points;
+        p_end = p + 4;
+        pt = pts;
+        for (; p < p_end; p++, pt++)
+          {
+             pt->x = (p->x + off_x) << FP;
+             pt->y = (p->y + off_y) << FP;
+             pt->z = (p->z)         << FP;
+             pt->u = p->u * FP1;
+             pt->v = p->v * FP1;
+             pt->col = ARGB_JOIN(p->a, p->r, p->g, p->b);
+          }
+
+        if (obj->cur.map->surface)
+          {
+             if ((obj->cur.map->surface_w != sw) ||
+                 (obj->cur.map->surface_h != sh))
+               {
+                  RDI(level);
+                  RD("        new surf: %ix%i\n", sw, sh);
+                  obj->layer->evas->engine.func->image_map_surface_free
+                    (e->engine.data.output, obj->cur.map->surface);
+                  obj->cur.map->surface = NULL;
+               }
+          }
+        if (!obj->cur.map->surface)
+          {
+             obj->cur.map->surface_w = sw;
+             obj->cur.map->surface_h = sh;
+
+             obj->cur.map->surface =
+               obj->layer->evas->engine.func->image_map_surface_new
+               (e->engine.data.output, obj->cur.map->surface_w,
+                obj->cur.map->surface_h,
+                obj->cur.map->alpha);
+             RDI(level);
+             RD("        fisrt surf: %ix%i\n", sw, sh);
+             changed = 1;
+          }
+        if (obj->smart.smart)
+          {
+             Evas_Object *obj2;
+
+             EINA_INLIST_FOREACH(evas_object_smart_members_get_direct(obj), obj2)
+               {
+                  if (obj2->changed)
+                    {
+                       obj2->changed  = 0;
+                       changed = 1;
+                       break;
+                    }
+               }
+             obj->changed = 0;
+          }
+        else
+          {
+             if (obj->changed)
+               {
+                  changed = 1;
+                  obj->changed = 0;
+               }
+          }
+
+        // clear surface before re-render
+        if ((changed) && (obj->cur.map->surface))
+          {
+             RDI(level);
+             RD("        children redraw\n");
+             // FIXME: calculate "changes" within map surface and only clear
+             // and re-render those
+             if (obj->cur.map->alpha)
+               {
+                  ctx = e->engine.func->context_new(e->engine.data.output);
+                  e->engine.func->context_color_set
+                    (e->engine.data.output, ctx, 0, 0, 0, 0);
+                  e->engine.func->context_render_op_set
+                    (e->engine.data.output, ctx, EVAS_RENDER_COPY);
+                  e->engine.func->rectangle_draw(e->engine.data.output,
+                                                 ctx,
+                                                 obj->cur.map->surface,
+                                                 0, 0,
+                                                 obj->cur.map->surface_w,
+                                                 obj->cur.map->surface_h);
+                  e->engine.func->context_free(e->engine.data.output, ctx);
+               }
+             ctx = e->engine.func->context_new(e->engine.data.output);
+             off_x = -obj->cur.geometry.x;
+             off_y = -obj->cur.geometry.y;
+             if (obj->smart.smart)
+               {
+                  EINA_INLIST_FOREACH
+                    (evas_object_smart_members_get_direct(obj), obj2)
+                    {
+                       clean_them |= evas_render_mapped(e, obj2, ctx,
+                                                       obj->cur.map->surface,
+                                                       off_x, off_y, 1
+#ifdef REND_DGB
+                                                       , level + 1
+#endif
+                                                       );
+                    }
+               }
+             else
+               {
+                  int x = 0, y = 0, w = 0, h = 0;
+
+                  w = obj->cur.map->surface_w;
+                  h = obj->cur.map->surface_h;
+                  RECTS_CLIP_TO_RECT(x, y, w, h,
+                                     obj->cur.geometry.x + off_x,
+                                     obj->cur.geometry.y + off_y,
+                                     obj->cur.geometry.w,
+                                     obj->cur.geometry.h);
+                  e->engine.func->context_clip_set(e->engine.data.output,
+                                                   ctx, x, y, w, h);
+                  obj->func->render(obj, e->engine.data.output, ctx,
+                                    obj->cur.map->surface, off_x, off_y);
+               }
+             e->engine.func->context_free(e->engine.data.output, ctx);
+             rendered = 1;
+          }
+
+        RDI(level);
+        RD("        draw map4\n");
+
+        if (rendered)
+          {
+             obj->cur.map->surface = e->engine.func->image_dirty_region
+               (e->engine.data.output, obj->cur.map->surface,
+                0, 0, obj->cur.map->surface_w, obj->cur.map->surface_h);
+          }
+        obj->layer->evas->engine.func->image_map4_draw
+          (e->engine.data.output, e->engine.data.context, surface,
+           obj->cur.map->surface, pts, obj->cur.map->smooth, 0);
+        // FIXME: needs to cache these maps and
+        // keep them only rendering updates
+//        obj->layer->evas->engine.func->image_map_surface_free
+//          (e->engine.data.output, obj->cur.map->surface);
+//        obj->cur.map->surface = NULL;
+     }
+   else
+     {
+        if (mapped)
+          {
+             RDI(level);
+             RD("        draw child of mapped obj\n");
+             ctx = e->engine.func->context_new(e->engine.data.output);
+             if (obj->smart.smart)
+               {
+                  EINA_INLIST_FOREACH
+                    (evas_object_smart_members_get_direct(obj), obj2)
+                    {
+                       clean_them |= evas_render_mapped(e, obj2, ctx,
+                                                       surface,
+                                                       off_x, off_y, 1
+#ifdef REND_DGB
+                                                       , level + 1
+#endif
+                                                       );
+                    }
+               }
+             else
+               obj->func->render(obj, e->engine.data.output, ctx,
+                                 surface, off_x, off_y);
+             e->engine.func->context_free(e->engine.data.output, ctx);
+          }
+        else
+          {
+             RDI(level);
+             RD("        draw normal obj\n");
+             obj->func->render(obj, e->engine.data.output, context, surface,
+                               off_x, off_y);
+          }
+     }
+   RDI(level);
+   RD("      }\n");
+
+   return clean_them;
+}
+
+static Eina_List *
+evas_render_updates_internal(Evas *e,
+                             unsigned char make_updates,
+                             unsigned char do_draw)
+{
+   Eina_List *updates = NULL;
+   Eina_List *ll;
+   void *surface;
+   Eina_Bool clean_them = EINA_FALSE;
+   Eina_Bool alpha;
+   Eina_Rectangle *r;
+   int ux, uy, uw, uh;
+   int cx, cy, cw, ch;
+   unsigned int i, j;
+   int haveup = 0;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (!e->changed) return NULL;
+
+   evas_call_smarts_calculate(e);
+
+   RD("[--- RENDER EVAS (size: %ix%i)\n", e->viewport.w, e->viewport.h);
+
+   /* Check if the modified object mean recalculating every thing */
+   if (!e->invalidate)
+     _evas_render_check_pending_objects(&e->pending_objects, e);
+
+   /* phase 1. add extra updates for changed objects */
+   if (e->invalidate || e->render_objects.count <= 0)
+     clean_them = _evas_render_phase1_process(e, &e->active_objects, &e->restack_objects, &e->delete_objects, &e->render_objects);
+
+   _evas_render_phase1_direct(e, &e->active_objects, &e->restack_objects, &e->delete_objects, &e->render_objects);
+
+   /* phase 2. force updates for restacks */
+   for (i = 0; i < e->restack_objects.count; ++i)
+     {
+       Evas_Object *obj;
+
+       obj = eina_array_data_get(&e->restack_objects, i);
+       obj->func->render_pre(obj);
+        _evas_render_prev_cur_clip_cache_add(e, obj);
+     }
+   eina_array_clean(&e->restack_objects);
+   /* phase 3. add exposes */
+   EINA_LIST_FREE(e->damages, r)
+     {
+       e->engine.func->output_redraws_rect_add(e->engine.data.output,
+                                              r->x, r->y, r->w, r->h);
+       eina_rectangle_free(r);
+     }
+   /* phase 4. output & viewport changes */
+   if (e->viewport.changed)
+     {
+       e->engine.func->output_redraws_rect_add(e->engine.data.output,
+                                               0, 0,
+                                               e->output.w, e->output.h);
+     }
+   if (e->output.changed)
+     {
+       e->engine.func->output_resize(e->engine.data.output,
+                                     e->output.w, e->output.h);
+       e->engine.func->output_redraws_rect_add(e->engine.data.output,
+                                               0, 0,
+                                               e->output.w, e->output.h);
+     }
+   if ((e->output.w != e->viewport.w) || (e->output.h != e->viewport.h))
+     {
+       ERR("viewport size != output size!");
+     }
+   /* phase 5. add obscures */
+   EINA_LIST_FOREACH(e->obscures, ll, r)
+     {
+        e->engine.func->output_redraws_rect_del(e->engine.data.output,
+                                              r->x, r->y, r->w, r->h);
+     }
+   /* build obscure objects list of active objects that obscure */
+   for (i = 0; i < e->active_objects.count; ++i)
+     {
+       Evas_Object *obj;
+
+       obj = eina_array_data_get(&e->active_objects, i);
+       if (UNLIKELY((evas_object_is_opaque(obj) ||
+                      ((obj->func->has_opaque_rect) &&
+                       (obj->func->has_opaque_rect(obj)))) &&
+                     evas_object_is_visible(obj) &&
+                     (!obj->clip.clipees) &&
+                     (obj->cur.visible) &&
+                     (!obj->delete_me) &&
+                     (obj->cur.cache.clip.visible) &&
+                     (!obj->smart.smart)))
+/*       obscuring_objects = eina_list_append(obscuring_objects, obj); */
+         eina_array_push(&e->obscuring_objects, obj);
+     }
+   /* save this list */
+/*    obscuring_objects_orig = obscuring_objects; */
+/*    obscuring_objects = NULL; */
+   /* phase 6. go thru each update rect and render objects in it*/
+   if (do_draw)
+     {
+       unsigned int offset = 0;
+
+       alpha = e->engine.func->canvas_alpha_get(e->engine.data.output, e->engine.data.context);
+
+       while ((surface =
+               e->engine.func->output_redraws_next_update_get(e->engine.data.output,
+                                                              &ux, &uy, &uw, &uh,
+                                                              &cx, &cy, &cw, &ch)))
+         {
+            int off_x, off_y;
+
+             RD("  [--- UPDATE %i %i %ix%i\n", ux, uy, uw, uh);
+            if (make_updates)
+              {
+                 Eina_Rectangle *rect;
+
+                 NEW_RECT(rect, ux, uy, uw, uh);
+                 if (rect)
+                   updates = eina_list_append(updates, rect);
+              }
+             haveup = 1;
+            off_x = cx - ux;
+            off_y = cy - uy;
+            /* build obscuring objects list (in order from bottom to top) */
+            for (i = 0; i < e->obscuring_objects.count; ++i)
+              {
+                 Evas_Object *obj;
+
+                 obj = (Evas_Object *) eina_array_data_get(&e->obscuring_objects, i);
+                 if (evas_object_is_in_output_rect(obj, ux, uy, uw, uh))
+                   {
+                      eina_array_push(&e->temporary_objects, obj);
+
+                      /* reset the background of the area if needed (using cutout and engine alpha flag to help) */
+                      if (alpha)
+                        {
+                           if (evas_object_is_opaque(obj))
+                             e->engine.func->context_cutout_add(e->engine.data.output,
+                                                                e->engine.data.context,
+                                                                obj->cur.cache.clip.x + off_x,
+                                                                obj->cur.cache.clip.y + off_y,
+                                                                obj->cur.cache.clip.w,
+                                                                obj->cur.cache.clip.h);
+                           else
+                             {
+                                if (obj->func->get_opaque_rect)
+                                  {
+                                     Evas_Coord obx, oby, obw, obh;
+
+                                     obj->func->get_opaque_rect(obj, &obx, &oby, &obw, &obh);
+                                     if ((obw > 0) && (obh > 0))
+                                       {
+                                          obx += off_x;
+                                          oby += off_y;
+                                          RECTS_CLIP_TO_RECT(obx, oby, obw, obh,
+                                                             obj->cur.cache.clip.x + off_x,
+                                                             obj->cur.cache.clip.y + off_y,
+                                                             obj->cur.cache.clip.w,
+                                                             obj->cur.cache.clip.h);
+                                          e->engine.func->context_cutout_add(e->engine.data.output,
+                                                                             e->engine.data.context,
+                                                                             obx, oby,
+                                                                             obw, obh);
+                                       }
+                                  }
+                             }
+                        }
+                   }
+              }
+            if (alpha)
+              {
+                 e->engine.func->context_clip_set(e->engine.data.output,
+                                                  e->engine.data.context,
+                                                  ux, uy, uw, uh);
+                 e->engine.func->context_color_set(e->engine.data.output, e->engine.data.context, 0, 0, 0, 0);
+                 e->engine.func->context_multiplier_unset(e->engine.data.output, e->engine.data.context);
+                 e->engine.func->context_render_op_set(e->engine.data.output, e->engine.data.context, EVAS_RENDER_COPY);
+                 e->engine.func->rectangle_draw(e->engine.data.output,
+                                                e->engine.data.context,
+                                                surface,
+                                                cx, cy, cw, ch);
+                 e->engine.func->context_cutout_clear(e->engine.data.output,
+                                                      e->engine.data.context);
+                 e->engine.func->context_clip_unset(e->engine.data.output,
+                                                     e->engine.data.context);
+              }
+            /* render all object that intersect with rect */
+             for (i = 0; i < e->active_objects.count; ++i)
+              {
+                 Evas_Object *obj;
+
+                 obj = eina_array_data_get(&e->active_objects, i);
+
+                 /* if it's in our outpout rect and it doesn't clip anything */
+                  RD("    OBJ: [%p] '%s' %i %i %ix%i\n", obj, obj->type, obj->cur.geometry.x, obj->cur.geometry.y, obj->cur.geometry.w, obj->cur.geometry.h);
+                 if ((evas_object_is_in_output_rect(obj, ux, uy, uw, uh) ||
+                       (obj->smart.smart)) &&
+                     (!obj->clip.clipees) &&
+                     (obj->cur.visible) &&
+                     (!obj->delete_me) &&
+                     (obj->cur.cache.clip.visible) &&
+//                   (!obj->smart.smart) &&
+                     (obj->cur.color.a > 0))
+                   {
+                      int x, y, w, h;
+
+                       RD("      DRAW (vis: %i, a: %i, clipees: %p\n", obj->cur.visible, obj->cur.color.a, obj->clip.clipees);
+                      if ((e->temporary_objects.count > offset) &&
+                          (eina_array_data_get(&e->temporary_objects, offset) == obj))
+                        offset++;
+                      x = cx; y = cy; w = cw; h = ch;
+                       if (obj->cur.clipper)
+                         {
+                            if (_evas_render_has_map(obj))
+                              {
+                                 evas_object_clip_recalc(obj);
+                              }
+/* hmmmm clip seems to kill eweather in elm-test
+                            printf("clip: %4i %4i %4ix%4i to %4i %4i %4ix%4i\n",
+                                   x, y, w, h,
+                                   obj->cur.cache.clip.x + off_x,
+                                   obj->cur.cache.clip.y + off_y,
+                                   obj->cur.cache.clip.w,
+                                   obj->cur.cache.clip.h);
+ */
+                            RECTS_CLIP_TO_RECT(x, y, w, h,
+                                               obj->cur.cache.clip.x + off_x,
+                                               obj->cur.cache.clip.y + off_y,
+                                               obj->cur.cache.clip.w,
+                                               obj->cur.cache.clip.h);
+                         }
+                      if (((w > 0) && (h > 0)) || (obj->smart.smart))
+                        {
+                            if (!obj->smart.smart)
+                              {
+                                 RECTS_CLIP_TO_RECT(x, y, w, h,
+                                                    obj->cur.cache.clip.x + off_x,
+                                                    obj->cur.cache.clip.y + off_y,
+                                                    obj->cur.cache.clip.w,
+                                                    obj->cur.cache.clip.h);
+                              }
+                           e->engine.func->context_clip_set(e->engine.data.output,
+                                                            e->engine.data.context,
+                                                            x, y, w, h);
+#if 1 /* FIXME: this can slow things down... figure out optimum... coverage */
+                           for (j = offset; j < e->temporary_objects.count; ++j)
+                             {
+                                Evas_Object *obj2;
+
+                                obj2 = (Evas_Object *) eina_array_data_get(&e->temporary_objects, j);
+                                 if (evas_object_is_opaque(obj2))
+                                   e->engine.func->context_cutout_add(e->engine.data.output,
+                                                                      e->engine.data.context,
+                                                                      obj2->cur.cache.clip.x + off_x,
+                                                                      obj2->cur.cache.clip.y + off_y,
+                                                                      obj2->cur.cache.clip.w,
+                                                                      obj2->cur.cache.clip.h);
+                                 else
+                                   {
+                                      if (obj2->func->get_opaque_rect)
+                                        {
+                                           Evas_Coord obx, oby, obw, obh;
+
+                                           obj2->func->get_opaque_rect
+                                             (obj2, &obx, &oby, &obw, &obh);
+                                           if ((obw > 0) && (obh > 0))
+                                             {
+                                                obx += off_x;
+                                                oby += off_y;
+                                                RECTS_CLIP_TO_RECT(obx, oby, obw, obh,
+                                                                   obj2->cur.cache.clip.x + off_x,
+                                                                   obj2->cur.cache.clip.y + off_y,
+                                                                   obj2->cur.cache.clip.w,
+                                                                   obj2->cur.cache.clip.h);
+                                                e->engine.func->context_cutout_add(e->engine.data.output,
+                                                                                   e->engine.data.context,
+                                                                                   obx, oby,
+                                                                                   obw, obh);
+                                             }
+                                        }
+                                   }
+                             }
+#endif
+                            clean_them |= evas_render_mapped(e, obj, e->engine.data.context,
+                                                            surface, off_x, off_y, 0
+#ifdef REND_DGB
+                                                            , 1
+#endif
+                                                            );
+                           e->engine.func->context_cutout_clear(e->engine.data.output,
+                                                                e->engine.data.context);
+                        }
+                   }
+              }
+            /* punch rect out */
+            e->engine.func->output_redraws_next_update_push(e->engine.data.output,
+                                                            surface,
+                                                            ux, uy, uw, uh);
+            /* free obscuring objects list */
+            eina_array_clean(&e->temporary_objects);
+             RD("  ---]\n");
+         }
+       /* flush redraws */
+        if (haveup)
+          {
+             evas_event_callback_call(e, EVAS_CALLBACK_RENDER_FLUSH_PRE, NULL);
+             e->engine.func->output_flush(e->engine.data.output);
+             evas_event_callback_call(e, EVAS_CALLBACK_RENDER_FLUSH_POST, NULL);
+          }
+     }
+   /* clear redraws */
+   e->engine.func->output_redraws_clear(e->engine.data.output);
+   /* and do a post render pass */
+   for (i = 0; i < e->active_objects.count; ++i)
+     {
+       Evas_Object *obj;
+
+       obj = eina_array_data_get(&e->active_objects, i);
+       obj->pre_render_done = 0;
+        RD("    OBJ [%p] post... %i %i\n", obj, obj->changed, do_draw);
+       if ((obj->changed) && (do_draw))
+         {
+             RD("    OBJ [%p] post... func1\n", obj);
+            obj->func->render_post(obj);
+            obj->restack = 0;
+            obj->changed = 0;
+         }
+        else if ((obj->cur.map != obj->prev.map) ||
+                 (obj->cur.usemap != obj->prev.usemap))
+          {
+             RD("    OBJ [%p] post... func2\n", obj);
+            obj->func->render_post(obj);
+            obj->restack = 0;
+            obj->changed = 0;
+          }
+/* moved to other pre-process phase 1
+       if (obj->delete_me == 2)
+         {
+            delete_objects = eina_list_append(delete_objects, obj);
+         }
+       else if (obj->delete_me != 0) obj->delete_me++;
+ */
+     }
+   /* free our obscuring object list */
+   eina_array_clean(&e->obscuring_objects);
+
+   /* If some object are still marked as changed, do not remove
+      them from the pending list. */
+   eina_array_remove(&e->pending_objects, pending_change, NULL);
+
+   /* delete all objects flagged for deletion now */
+   for (i = 0; i < e->delete_objects.count; ++i)
+     {
+       Evas_Object *obj;
+
+       obj = eina_array_data_get(&e->delete_objects, i);
+       evas_object_free(obj, 1);
+     }
+   eina_array_clean(&e->delete_objects);
+
+   e->changed = 0;
+   e->viewport.changed = 0;
+   e->output.changed = 0;
+   e->invalidate = 0;
+
+   for (i = 0; i < e->render_objects.count; ++i)
+     {
+        Evas_Object *obj;
+
+        obj = eina_array_data_get(&e->render_objects, i);
+        obj->pre_render_done = 0;
+     }
+
+   /* If their are some object to restack or some object to delete,
+    * it's useless to keep the render object list around. */
+   if (clean_them)
+     {
+       eina_array_clean(&e->active_objects);
+       eina_array_clean(&e->render_objects);
+       eina_array_clean(&e->restack_objects);
+       eina_array_clean(&e->delete_objects);
+        eina_array_clean(&e->obscuring_objects);
+       e->invalidate = 1;
+     }
+
+   evas_module_clean();
+
+   RD("---]\n");
+
+   return updates;
+}
+
+/**
+ * Free the rectangles returned by evas_render_updates().
+ *
+ * @param updates The list of updated rectangles of the canvas.
+ *
+ * This function removes the region from the render updates list. It
+ * makes the region doesn't be render updated anymore.
+ *
+ * @ingroup Evas_Canvas
+ */
+EAPI void
+evas_render_updates_free(Eina_List *updates)
+{
+   Eina_Rectangle *r;
+
+   EINA_LIST_FREE(updates, r)
+     eina_rectangle_free(r);
+}
+
+/**
+ * Force immediate renderization of the given canvas.
+ *
+ * @param e The given canvas pointer.
+ * @return A newly allocated list of updated rectangles of the canvas.
+ *         Free this list with evas_render_updates_free().
+ *
+ * This function forces an immediate renderization update of the given
+ * given canvas.
+ *
+ * @ingroup Evas_Canvas
+ */
+EAPI Eina_List *
+evas_render_updates(Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+
+   if (!e->changed) return NULL;
+   return evas_render_updates_internal(e, 1, 1);
+}
+
+/**
+ * Force renderization of the given canvas.
+ *
+ * @param e The given canvas pointer.
+ *
+ * @ingroup Evas_Canvas
+ */
+EAPI void
+evas_render(Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   if (!e->changed) return;
+   evas_render_updates_internal(e, 0, 1);
+}
+
+/**
+ * Update the canvas internal objects but not triggering immediate
+ * renderization.
+ *
+ * @param e The given canvas pointer.
+ *
+ * This function updates the canvas internal objects not triggering
+ * renderization. To force renderization function evas_render() should
+ * be used.
+ *
+ * @see evas_render.
+ *
+ * @ingroup Evas_Canvas
+ */
+EAPI void
+evas_norender(Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+//   if (!e->changed) return;
+   evas_render_updates_internal(e, 0, 0);
+}
+
+/**
+ * Make the canvas discard internally cached data used for rendering.
+ *
+ * @param e The given canvas pointer.
+ *
+ * This function flushes the arrays of delete, active and render objects.
+ * Other things it may also discard are: shared memory segments,
+ * temporary scratch buffers, cached data to avoid re-compute of that data etc.
+ *
+ * @ingroup Evas_Canvas
+ */
+EAPI void
+evas_render_idle_flush(Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   evas_fonts_zero_presure(e);
+
+   if ((e->engine.func) && (e->engine.func->output_idle_flush) &&
+       (e->engine.data.output))
+     e->engine.func->output_idle_flush(e->engine.data.output);
+
+   eina_array_flush(&e->delete_objects);
+   eina_array_flush(&e->active_objects);
+   eina_array_flush(&e->restack_objects);
+   eina_array_flush(&e->render_objects);
+   eina_array_flush(&e->clip_changes);
+
+   e->invalidate = 1;
+}
+
+/**
+ * Make the canvas discard as much data as possible used by the engine at
+ * runtime.
+ *
+ * @param e The given canvas pointer.
+ *
+ * This function will unload images, delete textures and much more, where
+ * possible. You may also want to call evas_render_idle_flush() immediately
+ * prior to this to perhaps discard a little more, though evas_render_dump()
+ * should implicitly delete most of what evas_render_idle_flush() might
+ * discard too.
+ *
+ * @ingroup Evas_Canvas
+ */
+static void
+_evas_render_dump_map_surfaces(Evas_Object *obj)
+{
+   if ((obj->cur.map) && obj->cur.map->surface)
+     {
+        obj->layer->evas->engine.func->image_map_surface_free
+          (obj->layer->evas->engine.data.output, obj->cur.map->surface);
+        obj->cur.map->surface = NULL;
+     }
+
+   if (obj->smart.smart)
+     {
+        Evas_Object *obj2;
+
+        EINA_INLIST_FOREACH(evas_object_smart_members_get_direct(obj), obj2)
+          _evas_render_dump_map_surfaces(obj2);
+     }
+}
+
+EAPI void
+evas_render_dump(Evas *e)
+{
+   Evas_Layer *lay;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   EINA_INLIST_FOREACH(e->layers, lay)
+     {
+        Evas_Object *obj;
+
+        EINA_INLIST_FOREACH(lay->objects, obj)
+          _evas_render_dump_map_surfaces(obj);
+     }
+   if ((e->engine.func) && (e->engine.func->output_dump) &&
+       (e->engine.data.output))
+     e->engine.func->output_dump(e->engine.data.output);
+}
+
+void
+evas_render_invalidate(Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   eina_array_clean(&e->active_objects);
+   eina_array_clean(&e->render_objects);
+
+   eina_array_flush(&e->restack_objects);
+   eina_array_flush(&e->delete_objects);
+
+   e->invalidate = 1;
+}
+
+void
+evas_render_object_recalc(Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+
+   if ((!obj->changed) && (obj->delete_me < 2))
+     {
+       Evas *e;
+
+       e = obj->layer->evas;
+       if ((!e) || (e->cleanup)) return;
+        eina_array_push(&e->pending_objects, obj);
+       obj->changed = 1;
+     }
+}
diff --git a/src/lib/canvas/evas_smart.c b/src/lib/canvas/evas_smart.c
new file mode 100644 (file)
index 0000000..8aefc21
--- /dev/null
@@ -0,0 +1,437 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+
+static void _evas_smart_class_callbacks_create(Evas_Smart *s);
+
+/* all public */
+
+/**
+ * @addtogroup Evas_Smart_Group
+ * @{
+ */
+
+/**
+ * Create an Evas_Smart, which can be used to instantiate new smart objects.
+ *
+ * This function internally creates an Evas_Smart_Class and sets the
+ * provided callbacks. Callbacks that are unneeded (or marked DEPRECATED
+ * below) should be set to NULL.
+ *
+ * Alternatively you can create an Evas_Smart_Class yourself and use
+ * evas_smart_class_new().
+ *
+ * @param name a unique name for the smart
+ * @param func_add callback called when smart object is added
+ * @param func_del callback called when smart object is deleted
+ * @param func_layer_set DEPRECATED
+ * @param func_raise DEPRECATED
+ * @param func_lower DEPRECATED
+ * @param func_stack_above DEPRECATED
+ * @param func_stack_below DEPRECATED
+ * @param func_move callback called when smart object is moved
+ * @param func_resize callback called when smart object is resized
+ * @param func_show callback called when smart object is shown
+ * @param func_hide callback called when smart object is hidden
+ * @param func_color_set callback called when smart object has its color set
+ * @param func_clip_set callback called when smart object has its clip set
+ * @param func_clip_unset callback called when smart object has its clip unset
+ * @param data a pointer to user data for the smart
+ * @return an Evas_Smart
+ *
+ */
+EAPI Evas_Smart *
+evas_smart_new(const char *name,
+              void      (*func_add) (Evas_Object *o),
+              void      (*func_del) (Evas_Object *o),
+              void      (*func_layer_set) (Evas_Object *o, int l) __UNUSED__,
+              void      (*func_raise) (Evas_Object *o) __UNUSED__,
+              void      (*func_lower) (Evas_Object *o) __UNUSED__,
+              void      (*func_stack_above) (Evas_Object *o, Evas_Object *above) __UNUSED__,
+              void      (*func_stack_below) (Evas_Object *o, Evas_Object *below) __UNUSED__,
+              void      (*func_move) (Evas_Object *o, Evas_Coord x, Evas_Coord y),
+              void      (*func_resize) (Evas_Object *o, Evas_Coord w, Evas_Coord h),
+              void      (*func_show) (Evas_Object *o),
+              void      (*func_hide) (Evas_Object *o),
+              void      (*func_color_set) (Evas_Object *o, int r, int g, int b, int a),
+              void      (*func_clip_set) (Evas_Object *o, Evas_Object *clip),
+              void      (*func_clip_unset) (Evas_Object *o),
+              const void *data)
+{
+   Evas_Smart *s;
+   Evas_Smart_Class *sc;
+
+   WRN("----- WARNING. evas_smart_new() will be deprecated and removed soon"
+         "----- Please use evas_smart_class_new() instead");
+
+   if (!name) return NULL;
+
+   s = evas_mem_calloc(sizeof(Evas_Smart));
+   if (!s) return NULL;
+
+   s->magic = MAGIC_SMART;
+
+   s->class_allocated = 1;
+
+   sc = evas_mem_calloc(sizeof(Evas_Smart_Class));
+   if (!sc)
+     {
+       free(s);
+       return NULL;
+     }
+   sc->name = name;
+   sc->add = func_add;
+   sc->del = func_del;
+   sc->move = func_move;
+   sc->resize = func_resize;
+   sc->show = func_show;
+   sc->hide = func_hide;
+   sc->color_set = func_color_set;
+   sc->clip_set = func_clip_set;
+   sc->clip_unset = func_clip_unset;
+   sc->data = (void *)data;
+   s->smart_class = sc;
+
+   return s;
+}
+
+/**
+ * Free an Evas_Smart
+ *
+ * If this smart was created using evas_smart_class_new(), the associated
+ * Evas_Smart_Class will not be freed.
+ *
+ * @param s the Evas_Smart to free
+ *
+ */
+EAPI void
+evas_smart_free(Evas_Smart *s)
+{
+   MAGIC_CHECK(s, Evas_Smart, MAGIC_SMART);
+   return;
+   MAGIC_CHECK_END();
+   s->delete_me = 1;
+   if (s->usage > 0) return;
+   if (s->class_allocated) free((void *)s->smart_class);
+   free(s->callbacks.array);
+   free(s);
+}
+
+/**
+ * Creates an Evas_Smart from an Evas_Smart_Class.
+ *
+ * @param sc the smart class definition
+ * @return an Evas_Smart
+ */
+EAPI Evas_Smart *
+evas_smart_class_new(const Evas_Smart_Class *sc)
+{
+   Evas_Smart *s;
+
+   if (!sc) return NULL;
+
+   /* api does not match abi! for now refuse as we only have 1 version */
+   if (sc->version != EVAS_SMART_CLASS_VERSION) return NULL;
+
+   s = evas_mem_calloc(sizeof(Evas_Smart));
+   if (!s) return NULL;
+
+   s->magic = MAGIC_SMART;
+
+   s->smart_class = sc;
+   _evas_smart_class_callbacks_create(s);
+
+   return s;
+}
+
+/**
+ * Get the Evas_Smart_Class of an Evas_Smart
+ *
+ * @param s the Evas_Smart
+ * @return the Evas_Smart_Class
+ */
+EAPI const Evas_Smart_Class *
+evas_smart_class_get(const Evas_Smart *s)
+{
+   MAGIC_CHECK(s, Evas_Smart, MAGIC_SMART);
+   return NULL;
+   MAGIC_CHECK_END();
+   return s->smart_class;
+}
+
+/**
+ * @brief Get the data pointer set on an Evas_Smart.
+ *
+ * @param s Evas_Smart
+ *
+ * This data pointer is set either as the final parameter to
+ * evas_smart_new or as the data field in the Evas_Smart_Class passed
+ * in to evas_smart_class_new
+ */
+EAPI void *
+evas_smart_data_get(const Evas_Smart *s)
+{
+   MAGIC_CHECK(s, Evas_Smart, MAGIC_SMART);
+   return NULL;
+   MAGIC_CHECK_END();
+   return (void *)s->smart_class->data;
+}
+
+/**
+ * Get the callbacks known by this Evas_Smart.
+ *
+ * This is likely different from Evas_Smart_Class::callbacks as it
+ * will contain the callbacks of all class hierarchy sorted, while the
+ * direct smart class member refers only to that specific class and
+ * should not include parent's.
+ *
+ * If no callbacks are known, this function returns @c NULL.
+ *
+ * The array elements and thus their contents will be reference to
+ * original values given to evas_smart_new() as
+ * Evas_Smart_Class::callbacks.
+ *
+ * The array is sorted by name. The last array element is the @c NULL
+ * pointer and is not counted in @a count. Loop iterations can check
+ * any of these cases.
+ *
+ * @param s the Evas_Smart.
+ * @param count returns the number of elements in returned array.
+ * @return the array with callback descriptions known by this class,
+ *         its size is returned in @a count parameter. It should not
+ *         be modified anyhow. If no callbacks are known, @c NULL is
+ *         returned. The array is sorted by name and elements refer to
+ *         the original value given to evas_smart_new().
+ *
+ * @note objects may provide per-instance callbacks, use
+ *       evas_object_smart_callbacks_descriptions_get() to get those
+ *       as well.
+ * @see evas_object_smart_callbacks_descriptions_get()
+ */
+EAPI const Evas_Smart_Cb_Description **
+evas_smart_callbacks_descriptions_get(const Evas_Smart *s, unsigned int *count)
+{
+   MAGIC_CHECK(s, Evas_Smart, MAGIC_SMART);
+   if (count) *count = 0;
+   return NULL;
+   MAGIC_CHECK_END();
+
+   if (count) *count = s->callbacks.size;
+   return s->callbacks.array;
+}
+
+/**
+ * Find callback description for callback called @a name.
+ *
+ * @param s the Evas_Smart.
+ * @param name name of desired callback, must @b not be @c NULL.  The
+ *        search have a special case for @a name being the same
+ *        pointer as registered with Evas_Smart_Cb_Description, one
+ *        can use it to avoid excessive use of strcmp().
+ * @return reference to description if found, @c NULL if not found.
+ */
+EAPI const Evas_Smart_Cb_Description *
+evas_smart_callback_description_find(const Evas_Smart *s, const char *name)
+{
+   if (!name) return NULL;
+   MAGIC_CHECK(s, Evas_Smart, MAGIC_SMART);
+   return NULL;
+   MAGIC_CHECK_END();
+   return evas_smart_cb_description_find(&s->callbacks, name);
+}
+
+/**
+ * Sets one class to inherit from the other.
+ *
+ * Copy all function pointers, set @c parent to @a parent_sc and copy
+ * everything after sizeof(Evas_Smart_Class) present in @a parent_sc,
+ * using @a parent_sc_size as reference.
+ *
+ * This is recommended instead of a single memcpy() since it will take
+ * care to not modify @a sc name, version, callbacks and possible
+ * other members.
+ *
+ * @param sc child class.
+ * @param parent_sc parent class, will provide attributes.
+ * @param parent_sc_size size of parent_sc structure, child should be at least
+ *        this size. Everything after @c Evas_Smart_Class size is copied
+ *        using regular memcpy().
+ */
+EAPI Eina_Bool
+evas_smart_class_inherit_full(Evas_Smart_Class *sc, const Evas_Smart_Class *parent_sc, unsigned int parent_sc_size)
+{
+   unsigned int off;
+
+   /* api does not match abi! for now refuse as we only have 1 version */
+   if (parent_sc->version != EVAS_SMART_CLASS_VERSION) return 0;
+
+#define _CP(m) sc->m = parent_sc->m
+   _CP(add);
+   _CP(del);
+   _CP(move);
+   _CP(resize);
+   _CP(show);
+   _CP(hide);
+   _CP(color_set);
+   _CP(clip_set);
+   _CP(clip_unset);
+   _CP(calculate);
+   _CP(member_add);
+   _CP(member_del);
+#undef _CP
+
+   sc->parent = parent_sc;
+
+   off = sizeof(Evas_Smart_Class);
+   if (parent_sc_size == off) return 1;
+
+   memcpy(((char *)sc) + off, ((char *)parent_sc) + off, parent_sc_size - off);
+   return 1;
+}
+
+/**
+ * @}
+ */
+
+/* internal funcs */
+void
+evas_object_smart_use(Evas_Smart *s)
+{
+   s->usage++;
+}
+
+void
+evas_object_smart_unuse(Evas_Smart *s)
+{
+   s->usage--;
+   if ((s->usage <= 0) && (s->delete_me)) evas_smart_free(s);
+}
+
+Eina_Bool
+evas_smart_cb_descriptions_resize(Evas_Smart_Cb_Description_Array *a, unsigned int size)
+{
+   void *tmp;
+
+   if (size == a->size)
+     return 1;
+
+   if (size == 0)
+     {
+       free(a->array);
+       a->array = NULL;
+       a->size = 0;
+       return 1;
+     }
+
+   tmp = realloc(a->array, (size + 1) * sizeof(Evas_Smart_Cb_Description *));
+   if (tmp)
+     {
+       a->array = tmp;
+       a->size = size;
+       a->array[size] = NULL;
+       return 1;
+     }
+   else
+     {
+       fprintf(stderr, "ERROR: realloc failed!\n");
+       return 0;
+     }
+}
+
+static int
+_evas_smart_cb_description_cmp_sort(const void *p1, const void *p2)
+{
+   const Evas_Smart_Cb_Description **a = (const Evas_Smart_Cb_Description **)p1;
+   const Evas_Smart_Cb_Description **b = (const Evas_Smart_Cb_Description **)p2;
+   return strcmp((*a)->name, (*b)->name);
+}
+
+void
+evas_smart_cb_descriptions_fix(Evas_Smart_Cb_Description_Array *a)
+{
+   unsigned int i, j;
+
+   if (!a)
+     {
+       ERR("no array to fix!");
+       return;
+     }
+
+   qsort(a->array, a->size, sizeof(Evas_Smart_Cb_Description *),
+        _evas_smart_cb_description_cmp_sort);
+
+   DBG("%u callbacks", a->size);
+   if (a->size)
+     DBG("%s [type=%s]", a->array[0]->name, a->array[0]->type);
+
+   for (i = 0, j = 1; j < a->size; j++)
+     {
+       const Evas_Smart_Cb_Description *cur, *prev;
+
+       cur = a->array[j];
+       prev = a->array[i];
+
+       DBG("%s [type=%s]", cur->name, cur->type);
+
+       if (strcmp(cur->name, prev->name) != 0)
+         {
+            i++;
+            if (i != j)
+              a->array[i] = a->array[j];
+         }
+       else
+         {
+            if (strcmp(cur->type, prev->type) == 0)
+              WRN("duplicated smart callback description"
+                  " with name '%s' and type '%s'", cur->name, cur->type);
+            else
+              ERR("callback descriptions named '%s' differ"
+                  " in type, keeping '%s', ignoring '%s'",
+                  cur->name, prev->type, cur->type);
+         }
+     }
+
+   evas_smart_cb_descriptions_resize(a, a->size - (j - i));
+}
+
+static void
+_evas_smart_class_callbacks_create(Evas_Smart *s)
+{
+   const Evas_Smart_Class *sc;
+   unsigned int n = 0;
+
+   for (sc = s->smart_class; sc != NULL; sc = sc->parent)
+     {
+       const Evas_Smart_Cb_Description *d;
+       for (d = sc->callbacks; d && d->name != NULL; d++)
+         n++;
+     }
+
+   if (n == 0) return;
+   if (!evas_smart_cb_descriptions_resize(&s->callbacks, n)) return;
+   for (n = 0, sc = s->smart_class; sc != NULL; sc = sc->parent)
+     {
+       const Evas_Smart_Cb_Description *d;
+       for (d = sc->callbacks; d->name != NULL; d++)
+         s->callbacks.array[n++] = d;
+     }
+   evas_smart_cb_descriptions_fix(&s->callbacks);
+}
+
+static int
+_evas_smart_cb_description_cmp_search(const void *p1, const void *p2)
+{
+   const char *name = p1;
+   const Evas_Smart_Cb_Description **v = (const Evas_Smart_Cb_Description **)p2;
+   /* speed up string shares searches (same pointers) */
+   if (name == (*v)->name) return 0;
+   return strcmp(name, (*v)->name);
+}
+
+const Evas_Smart_Cb_Description *
+evas_smart_cb_description_find(const Evas_Smart_Cb_Description_Array *a, const char *name)
+{
+   if (!a->array) return NULL;
+   return bsearch(name, a->array, a->size, sizeof(Evas_Smart_Cb_Description *),
+                 _evas_smart_cb_description_cmp_search);
+}
diff --git a/src/lib/canvas/evas_stack.c b/src/lib/canvas/evas_stack.c
new file mode 100644 (file)
index 0000000..1ca1b66
--- /dev/null
@@ -0,0 +1,474 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+static Evas_Object *
+evas_object_above_get_internal(const Evas_Object *obj)
+{
+   if ((EINA_INLIST_GET(obj))->next)
+     return (Evas_Object *)((EINA_INLIST_GET(obj))->next);
+   else
+     {
+       if ((EINA_INLIST_GET(((Evas_Object*)(obj))->layer))->next)
+         {
+            Evas_Layer *l;
+
+            l = (Evas_Layer *)((EINA_INLIST_GET((((Evas_Object *)obj)->layer)))->next);
+            return l->objects;
+         }
+     }
+   return NULL;
+}
+
+static Evas_Object *
+evas_object_below_get_internal(const Evas_Object *obj)
+{
+   if ((EINA_INLIST_GET(obj))->prev)
+     return (Evas_Object *)((EINA_INLIST_GET(obj))->prev);
+   else
+     {
+        if ((EINA_INLIST_GET((((Evas_Object *)obj)->layer)))->prev)
+         {
+            Evas_Layer *l;
+
+            l = (Evas_Layer *)((EINA_INLIST_GET((((Evas_Object *)obj)->layer)))->prev);
+            return (Evas_Object *)((EINA_INLIST_GET((l->objects)))->last);
+         }
+     }
+   return NULL;
+}
+
+/**
+ * @addtogroup Evas_Object_Group_Basic
+ * @{
+ */
+
+/**
+ * Raise @p obj to the top of its layer.
+ *
+ * @param obj the object to raise
+ */
+EAPI void
+evas_object_raise(Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (evas_object_intercept_call_raise(obj)) return;
+   if (!((EINA_INLIST_GET(obj))->next))
+     {
+       evas_object_inform_call_restack(obj);
+       return;
+     }
+   if (obj->smart.parent)
+     evas_object_smart_member_raise(obj);
+   else
+     {
+       if (obj->in_layer)
+         obj->layer->objects = (Evas_Object *)eina_inlist_demote(EINA_INLIST_GET(obj->layer->objects),
+                                                                 EINA_INLIST_GET(obj));
+     }
+   if (obj->clip.clipees)
+     {
+       evas_object_inform_call_restack(obj);
+       return;
+     }
+   if (obj->layer) evas_render_invalidate(obj->layer->evas);
+   obj->restack = 1;
+   evas_object_change(obj);
+   evas_object_inform_call_restack(obj);
+   if (obj->layer->evas->events_frozen <= 0)
+     {
+       if (!evas_event_passes_through(obj))
+         {
+            if (!obj->smart.smart)
+              {
+                 if (evas_object_is_in_output_rect(obj,
+                                                   obj->layer->evas->pointer.x,
+                                                   obj->layer->evas->pointer.y, 1, 1) &&
+                     obj->cur.visible)
+                   evas_event_feed_mouse_move(obj->layer->evas,
+                                              obj->layer->evas->pointer.x,
+                                              obj->layer->evas->pointer.y,
+                                              obj->layer->evas->last_timestamp,
+                                              NULL);
+              }
+         }
+     }
+}
+
+/**
+ * Lower @p obj to the bottom of its layer.
+ *
+ * @param obj the object to lower
+ */
+EAPI void
+evas_object_lower(Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (evas_object_intercept_call_lower(obj)) return;
+   if (!((EINA_INLIST_GET(obj))->prev))
+     {
+       evas_object_inform_call_restack(obj);
+       return;
+     }
+   if (obj->smart.parent)
+     evas_object_smart_member_lower(obj);
+   else
+     {
+       if (obj->in_layer)
+         obj->layer->objects = (Evas_Object *)eina_inlist_promote(EINA_INLIST_GET(obj->layer->objects),
+                                                                  EINA_INLIST_GET(obj));
+     }
+   if (obj->clip.clipees)
+     {
+       evas_object_inform_call_restack(obj);
+       return;
+     }
+   if (obj->layer) evas_render_invalidate(obj->layer->evas);
+   obj->restack = 1;
+   evas_object_change(obj);
+   evas_object_inform_call_restack(obj);
+   if (obj->layer->evas->events_frozen <= 0)
+     {
+       if (!evas_event_passes_through(obj))
+         {
+            if (!obj->smart.smart)
+              {
+                 if (evas_object_is_in_output_rect(obj,
+                                                   obj->layer->evas->pointer.x,
+                                                   obj->layer->evas->pointer.y, 1, 1) &&
+                     obj->cur.visible)
+                   evas_event_feed_mouse_move(obj->layer->evas,
+                                              obj->layer->evas->pointer.x,
+                                              obj->layer->evas->pointer.y,
+                                              obj->layer->evas->last_timestamp,
+                                              NULL);
+              }
+         }
+     }
+}
+
+/**
+ * Stack @p obj immediately above @p above
+ *
+ * If @p obj is a member of a smart object, then @p above must also be
+ * a member of the same smart object.
+ *
+ * Similarly, if @p obj is not a member of smart object, @p above may
+ * not either.
+ *
+ * @param obj the object to stack
+ * @param above the object above which to stack
+ */
+EAPI void
+evas_object_stack_above(Evas_Object *obj, Evas_Object *above)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   MAGIC_CHECK(above, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj == above) return;
+   if (evas_object_intercept_call_stack_above(obj, above)) return;
+   if (!above)
+     {
+       evas_object_raise(obj);
+       return;
+     }
+   if ((EINA_INLIST_GET(obj))->prev == EINA_INLIST_GET(above))
+     {
+       evas_object_inform_call_restack(obj);
+       return;
+     }
+   if (obj->smart.parent)
+     {
+       if (obj->smart.parent != above->smart.parent)
+         {
+            ERR("BITCH! evas_object_stack_above(), %p not inside same smart as %p!", obj, above);
+            return;
+         }
+       evas_object_smart_member_stack_above(obj, above);
+     }
+   else
+     {
+       if (above->smart.parent)
+          {
+             ERR("BITCH! evas_object_stack_above(), %p stack above %p, but above has smart parent, obj does not\n", obj, above);
+             return;
+          }
+       if (obj->layer != above->layer)
+         {
+             ERR("BITCH! evas_object_stack_above(), %p stack above %p, not matching layers\n", obj, above);
+            return;
+         }
+       if (obj->in_layer)
+         {
+            obj->layer->objects = (Evas_Object *)eina_inlist_remove(EINA_INLIST_GET(obj->layer->objects),
+                                                                    EINA_INLIST_GET(obj));
+            obj->layer->objects = (Evas_Object *)eina_inlist_append_relative(EINA_INLIST_GET(obj->layer->objects),
+                                                                             EINA_INLIST_GET(obj),
+                                                                             EINA_INLIST_GET(above));
+         }
+     }
+   if (obj->clip.clipees)
+     {
+       evas_object_inform_call_restack(obj);
+       return;
+     }
+   if (obj->layer) evas_render_invalidate(obj->layer->evas);
+   obj->restack = 1;
+   evas_object_change(obj);
+   evas_object_inform_call_restack(obj);
+   if (obj->layer->evas->events_frozen <= 0)
+     {
+       if (!evas_event_passes_through(obj))
+         {
+            if (!obj->smart.smart)
+              {
+                 if (evas_object_is_in_output_rect(obj,
+                                                   obj->layer->evas->pointer.x,
+                                                   obj->layer->evas->pointer.y, 1, 1) &&
+                     obj->cur.visible)
+                   evas_event_feed_mouse_move(obj->layer->evas,
+                                              obj->layer->evas->pointer.x,
+                                              obj->layer->evas->pointer.y,
+                                              obj->layer->evas->last_timestamp,
+                                              NULL);
+              }
+         }
+     }
+}
+
+/**
+ * Stack @p obj immediately below @p below
+ *
+ * If @p obj is a member of a smart object, then @p below must also be
+ * a member of the same smart object.
+ *
+ * Similarly, if @p obj is not a member of smart object, @p below may
+ * not either.
+ *
+ * @param obj the object to stack
+ * @param below the object below which to stack
+ */
+EAPI void
+evas_object_stack_below(Evas_Object *obj, Evas_Object *below)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   MAGIC_CHECK(below, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   if (obj == below) return;
+   if (evas_object_intercept_call_stack_below(obj, below)) return;
+   if (!below)
+     {
+       evas_object_lower(obj);
+       return;
+     }
+   if ((EINA_INLIST_GET(obj))->next == EINA_INLIST_GET(below))
+     {
+       evas_object_inform_call_restack(obj);
+       return;
+     }
+   if (obj->smart.parent)
+     {
+       if (obj->smart.parent != below->smart.parent)
+         {
+            ERR("BITCH! evas_object_stack_below(), %p not inside same smart as %p!", obj, below);
+            return;
+         }
+       evas_object_smart_member_stack_below(obj, below);
+     }
+   else
+     {
+       if (below->smart.parent)
+          {
+             ERR("BITCH! evas_object_stack_below(), %p stack below %p, but below has smart parent, obj does not\n", obj, below);
+             return;
+          }
+       if (obj->layer != below->layer)
+         {
+             ERR("BITCH! evas_object_stack_below(), %p stack below %p, not matching layers\n", obj, below);
+            return;
+         }
+       if (obj->in_layer)
+         {
+            obj->layer->objects = (Evas_Object *)eina_inlist_remove(EINA_INLIST_GET(obj->layer->objects),
+                                                                    EINA_INLIST_GET(obj));
+            obj->layer->objects = (Evas_Object *)eina_inlist_prepend_relative(EINA_INLIST_GET(obj->layer->objects),
+                                                                              EINA_INLIST_GET(obj),
+                                                                              EINA_INLIST_GET(below));
+         }
+     }
+   if (obj->clip.clipees)
+     {
+       evas_object_inform_call_restack(obj);
+       return;
+     }
+   if (obj->layer) evas_render_invalidate(obj->layer->evas);
+   obj->restack = 1;
+   evas_object_change(obj);
+   evas_object_inform_call_restack(obj);
+   if (obj->layer->evas->events_frozen <= 0)
+     {
+       if (!evas_event_passes_through(obj))
+         {
+            if (!obj->smart.smart)
+              {
+                 if (evas_object_is_in_output_rect(obj,
+                                                   obj->layer->evas->pointer.x,
+                                                   obj->layer->evas->pointer.y, 1, 1) &&
+                     obj->cur.visible)
+                   evas_event_feed_mouse_move(obj->layer->evas,
+                                              obj->layer->evas->pointer.x,
+                                              obj->layer->evas->pointer.y,
+                                              obj->layer->evas->last_timestamp,
+                                              NULL);
+              }
+         }
+     }
+}
+
+/**
+ * Get the evas object above @p obj
+ *
+ * @param obj an Evas_Object
+ * @return the Evas_Object directly above
+ */
+EAPI Evas_Object *
+evas_object_above_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (obj->smart.parent)
+     {
+       do
+         {
+            obj = (Evas_Object *)((EINA_INLIST_GET(obj))->next);
+            if ((obj) && (!obj->delete_me)) return (Evas_Object *)obj;
+         }
+       while (obj);
+       return NULL;
+     }
+   obj = evas_object_above_get_internal(obj);
+   while (obj)
+     {
+       if (!obj->delete_me) return (Evas_Object *)obj;
+       obj = evas_object_above_get_internal(obj);
+     }
+   return NULL;
+}
+
+/**
+ * Get the evas object below @p obj
+ *
+ * @param obj an Evas_Object
+ * @return the Evas_Object directly below
+ */
+EAPI Evas_Object *
+evas_object_below_get(const Evas_Object *obj)
+{
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (obj->smart.parent)
+     {
+       do
+         {
+            obj = (Evas_Object *)((EINA_INLIST_GET(obj))->prev);
+            if ((obj) && (!obj->delete_me)) return (Evas_Object *)obj;
+         }
+       while (obj);
+       return NULL;
+     }
+   obj = evas_object_below_get_internal(obj);
+   while (obj)
+     {
+       if (!obj->delete_me) return (Evas_Object *)obj;
+       obj = evas_object_below_get_internal(obj);
+     }
+   return NULL;
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup Evas_Object_Group_Find
+ * @{
+ */
+
+/**
+ * Get the lowest evas object on the Evas @p e
+ *
+ * @param e an Evas
+ * @return the lowest object
+ */
+EAPI Evas_Object *
+evas_object_bottom_get(const Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (e->layers)
+     {
+       Evas_Object *obj;
+
+       obj = e->layers->objects;
+       while (obj)
+         {
+            if (!obj->delete_me) return obj;
+            obj = evas_object_above_get_internal(obj);
+         }
+     }
+   return NULL;
+}
+
+/**
+ * Get the highest evas object on the Evas @p e
+ *
+ * @param e an Evas
+ * @return the highest object
+ */
+EAPI Evas_Object *
+evas_object_top_get(const Evas *e)
+{
+   Evas_Object *obj = NULL;
+   Eina_Inlist *list;
+   Evas_Layer *layer;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+
+   list = EINA_INLIST_GET(e->layers);
+   if (!list) return NULL;
+
+   layer = (Evas_Layer *) list->last;
+   if (!layer) return NULL;
+
+   list = EINA_INLIST_GET(layer->objects);
+   if (!list) return NULL;
+
+   obj = (Evas_Object *) list->last;
+   if (!obj) return NULL;
+
+   while (obj)
+     {
+       if (!obj->delete_me) return obj;
+       obj = evas_object_below_get_internal(obj);
+     }
+
+   return obj;
+}
+
+/**
+ * @}
+ */
diff --git a/src/lib/canvas/evas_stats.c b/src/lib/canvas/evas_stats.c
new file mode 100644 (file)
index 0000000..94cb27b
--- /dev/null
@@ -0,0 +1,215 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_cs.h"
+
+/**
+ * Retrieves if the system wants to share bitmaps using the server.
+ * @return @c EINA_TRUE if wants, @c EINA_FALSE otherwise.
+ * @ingroup Evas_Cserve
+ */
+EAPI Eina_Bool
+evas_cserve_want_get(void)
+{
+#ifdef EVAS_CSERVE
+   return evas_cserve_use_get();
+#endif
+   return 0;
+}
+
+/**
+ * Retrieves if the system is connected to the server used to shae bitmaps.
+ * @return @c EINA_TRUE if connected, @c EINA_FALSE otherwise.
+ * @ingroup Evas_Cserve
+ */
+EAPI Eina_Bool
+evas_cserve_connected_get(void)
+{
+#ifdef EVAS_CSERVE
+   return evas_cserve_have_get();
+#endif
+   return 0;
+}
+
+/**
+ * Retrieves if the system wants to share bitmaps using the server.
+ * @param stats pointer to structure to fill with statistics about
+ *        cache server.
+ * @return @c EINA_TRUE if @p stats were filled with data,
+ *         @c EINA_FALSE otherwise and @p stats is untouched.
+ * @ingroup Evas_Cserve
+ */
+EAPI Eina_Bool
+evas_cserve_stats_get(Evas_Cserve_Stats *stats)
+{
+#ifdef EVAS_CSERVE
+   Op_Getstats_Reply st;
+
+   if (!evas_cserve_raw_stats_get(&st)) return 0;
+   if (!stats) return 1;
+   stats->saved_memory = st.saved_memory;
+   stats->wasted_memory = st.wasted_memory;
+   stats->saved_memory_peak = st.saved_memory_peak;
+   stats->wasted_memory_peak = st.wasted_memory_peak;
+   stats->saved_time_image_header_load = st.saved_time_image_header_load;
+   stats->saved_time_image_data_load = st.saved_time_image_data_load;
+   // may expand this in future
+   return 1;
+#else
+   return 0;
+#endif
+}
+
+EAPI Eina_Bool
+evas_cserve_image_cache_contents_get(Evas_Cserve_Image_Cache *cache)
+{
+#ifdef EVAS_CSERVE
+   Op_Getinfo_Reply *info;
+   unsigned char *p;
+   int i, j;
+
+   if (!(info = evas_cserve_raw_info_get())) return 0;
+   if (!cache)
+     {
+        free(info);
+        return 1;
+     }
+   cache->active.mem_total = info->active.mem_total;
+   cache->active.count = info->active.count;
+   cache->cached.mem_total = info->cached.mem_total;
+   cache->cached.count = info->cached.count;
+   cache->images = NULL;
+   j = info->active.count + info->cached.count;
+   p = (unsigned char *)info;
+   p += sizeof(Op_Getinfo_Reply);
+   for (i = 0; i < j; i++)
+     {
+        Evas_Cserve_Image *im;
+        Op_Getinfo_Item it;
+        char *file, *key;
+
+        memcpy(&it, p, sizeof(Op_Getinfo_Item));
+        file = (char*) (p + sizeof(Op_Getinfo_Item));
+        key = file + strlen(file) + 1;
+        im = calloc(1, sizeof(Evas_Cserve_Image));
+        if (!im) continue;
+        if (file[0] != 0)
+          {
+             file = (char *)eina_stringshare_add(file);
+             if (!file)
+               {
+                  free(im);
+                  continue;
+               }
+          }
+        else
+          file = NULL;
+        if (key[0] != 0)
+          {
+             key = (char *)eina_stringshare_add(key);
+             if (!key)
+               {
+                  if (file) eina_stringshare_del(file);
+                  free(im);
+                  continue;
+               }
+          }
+        else key = NULL;
+        cache->images = eina_list_append(cache->images, im);
+        im->file = file;
+        im->key = key;
+        im->w = it.w;
+        im->h = it.h;
+        im->cached_time = it.cached_time;
+        im->file_mod_time = it.file_mod_time;
+        im->file_checked_time = it.file_checked_time;
+        im->refcount = it.refcount;
+        im->data_refcount = it.data_refcount;
+        im->memory_footprint = it.memory_footprint;
+        im->head_load_time = it.head_load_time;
+        im->data_load_time = it.data_load_time;
+        im->active = it.active;
+        im->alpha = it.alpha;
+        im->data_loaded = it.data_loaded;
+        im->dead = it.dead;
+        im->useless = it.useless;
+     }
+   free(info);
+   return 1;
+#else
+   return 0;
+#endif
+}
+
+EAPI void
+evas_cserve_image_cache_contents_clean(Evas_Cserve_Image_Cache *cache)
+{
+#ifdef EVAS_CSERVE
+   Evas_Cserve_Image *im;
+
+   EINA_LIST_FREE(cache->images, im)
+     {
+        if (im->file) eina_stringshare_del(im->file);
+        if (im->key) eina_stringshare_del(im->key);
+        free(im);
+     }
+#endif
+}
+
+/**
+ * Retrieves the current configuration of the server.
+ * @param config where to store current server configuration.
+ * @return @c EINA_TRUE if @p config were filled with data,
+ *         @c EINA_FALSE otherwise and @p config is untouched.
+ * @ingroup Evas_Cserve
+ */
+EAPI Eina_Bool
+evas_cserve_config_get(Evas_Cserve_Config *config)
+{
+#ifdef EVAS_CSERVE
+   Op_Getconfig_Reply conf;
+
+   if (!evas_cserve_raw_config_get(&conf)) return 0;
+   if (!config) return 1;
+   config->cache_max_usage = conf.cache_max_usage;
+   config->cache_item_timeout = conf.cache_item_timeout;
+   config->cache_item_timeout_check = conf.cache_item_timeout_check;
+   return 1;
+#else
+   return 0;
+#endif
+}
+
+/**
+ * Changes the configuration of the server.
+ * @param config where to store current server configuration.
+ * @return @c EINA_TRUE if @p config were successfully applied,
+ *         @c EINA_FALSE otherwise.
+ * @ingroup Evas_Cserve
+ */
+EAPI Eina_Bool
+evas_cserve_config_set(const Evas_Cserve_Config *config)
+{
+#ifdef EVAS_CSERVE
+   Op_Setconfig conf;
+
+   if (!config) return 1;
+   conf.cache_max_usage = config->cache_max_usage;
+   conf.cache_item_timeout = config->cache_item_timeout;
+   conf.cache_item_timeout_check = config->cache_item_timeout_check;
+   return evas_cserve_raw_config_set(&conf);
+#else
+   return 0;
+#endif
+}
+
+/**
+ * Force system to disconnect from cache server.
+ * @ingroup Evas_Cserve
+ */
+EAPI void
+evas_cserve_disconnect(void)
+{
+#ifdef EVAS_CSERVE
+   evas_cserve_discon();
+#endif
+}
diff --git a/src/lib/canvas/evas_transform.c b/src/lib/canvas/evas_transform.c
new file mode 100644 (file)
index 0000000..024e173
--- /dev/null
@@ -0,0 +1,162 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include <math.h>
+
+/**
+ * @addtogroup Evas_Utils
+ * @{
+ */
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_transform_identity_set(Evas_Transform *t)
+{
+   if (t)
+     {
+       t->mxx = t->myy = t->mzz = 1;
+       t->mxy = t->mxz = 0;
+       t->myx = t->myz = 0;
+       t->mzx = t->mzy = 0;
+     }
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_transform_rotate(double angle, Evas_Transform *t)
+{
+   double ca, sa;
+   float mxx, mxy, mxz;
+   float myx, myy, myz;
+
+   if (!t) return;
+
+   angle = (angle * M_PI) / 180.0;
+   ca = cos(angle);  sa = sin(angle);
+   if ((ca == 1) && (sa == 0)) return;
+
+   mxx = t->mxx;  mxy = t->mxy;  mxz = t->mxz;
+   myx = t->myx;  myy = t->myy;  myz = t->myz;
+
+   t->mxx = (ca * mxx) + (sa * myx);
+   t->mxy = (ca * mxy) + (sa * myy);
+   t->mxz = (ca * mxz) + (sa * myz);
+
+   t->myx = (-sa * mxx) + (ca * myx);
+   t->myy = (-sa * mxy) + (ca * myy);
+   t->myz = (-sa * mxz) + (ca * myz);
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_transform_translate(float dx, float dy, Evas_Transform *t)
+{
+   if (!t) return;
+   if (!dx && !dy) return;
+
+   t->mxx = dx * t->mzx;
+   t->mxy = dx * t->mzy;
+   t->mxz = dx * t->mzz;
+
+   t->myx = dy * t->mzx;
+   t->myy = dy * t->mzy;
+   t->myz = dy * t->mzz;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_transform_scale(float sx, float sy, Evas_Transform *t)
+{
+   if (!t) return;
+   if ((sx == 1) && (sy == 1)) return;
+
+   t->mxx = sx * t->mxx;
+   t->mxy = sx * t->mxy;
+   t->mxz = sx * t->mxz;
+
+   t->myx = sy * t->myx;
+   t->myy = sy * t->myy;
+   t->myz = sy * t->myz;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_transform_shear(float sh, float sv, Evas_Transform *t)
+{
+   float mxx, mxy, mxz;
+   float myx, myy, myz;
+
+   if (!t) return;
+   if ((sh == 1) && (sv == 1)) return;
+
+   mxx = t->mxx;  mxy = t->mxy;  mxz = t->mxz;
+   myx = t->myx;  myy = t->myy;  myz = t->myz;
+
+   t->mxx = mxx + (sh * myx);
+   t->mxy = mxy + (sh * myy);
+   t->mxz = mxz + (sh * myz);
+
+   t->myx = (sv * mxx) + myx;
+   t->myy = (sv * mxy) + myy;
+   t->myz = (sv * mxz) + myz;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
+evas_transform_compose(Evas_Transform *l, Evas_Transform *t)
+{
+   float mxx, mxy, mxz;
+   float myx, myy, myz;
+   float mzx, mzy, mzz;
+
+   if (!t || !l) return;
+
+   mxx = t->mxx;  mxy = t->mxy;  mxz = t->mxz;
+   myx = t->myx;  myy = t->myy;  myz = t->myz;
+   mzx = t->mzx;  mzy = t->mzy;  mzz = t->mzz;
+
+   t->mxx = (l->mxx * mxx) + (l->mxy * myx) + (l->mxz * mzx);
+   t->mxy = (l->mxx * mxy) + (l->mxy * myy) + (l->mxz * mzy);
+   t->mxz = (l->mxx * mxz) + (l->mxy * myz) + (l->mxz * mzz);
+
+   t->myx = (l->myx * mxx) + (l->myy * myx) + (l->myz * mzx);
+   t->myy = (l->myx * mxy) + (l->myy * myy) + (l->myz * mzy);
+   t->myz = (l->myx * mxz) + (l->myy * myz) + (l->myz * mzz);
+
+   t->mzx = (l->mzx * mxx) + (l->mzy * myx) + (l->mzz * mzx);
+   t->mzy = (l->mzx * mxy) + (l->mzy * myy) + (l->mzz * mzy);
+   t->mzz = (l->mzx * mxz) + (l->mzy * myz) + (l->mzz * mzz);
+}
+
+/**
+ * @}
+ */
diff --git a/src/lib/cserve/Makefile.am b/src/lib/cserve/Makefile.am
new file mode 100644 (file)
index 0000000..5d33c81
--- /dev/null
@@ -0,0 +1,31 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/lib/cserve \
+-DPACKAGE_BIN_DIR=\"$(bindir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+@EINA_CFLAGS@ \
+@FREETYPE_CFLAGS@ \
+@FRIBIDI_CFLAGS@ \
+@EET_CFLAGS@ \
+@FONTCONFIG_CFLAGS@ \
+@pthread_cflags@
+
+if EVAS_CSERVE
+
+noinst_LTLIBRARIES = libevas_cserve.la
+
+endif
+
+libevas_cserve_la_SOURCES = \
+evas_cs.h \
+evas_cs_main.c \
+evas_cs_server.c \
+evas_cs_client.c \
+evas_cs_mem.c
+
+libevas_cserve_la_LIBADD = @EINA_LIBS@ -lrt
diff --git a/src/lib/cserve/evas_cs.h b/src/lib/cserve/evas_cs.h
new file mode 100644 (file)
index 0000000..ffbefd3
--- /dev/null
@@ -0,0 +1,284 @@
+#ifndef EVAS_CS_H
+#define EVAS_CS_H 1
+
+#ifdef EVAS_CSERVE
+
+#include <sys/select.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/param.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <netinet/in.h>
+#include <sys/un.h>
+#include <arpa/inet.h>
+#include <errno.h>
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EVAS_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif /* ! DLL_EXPORT */
+# else
+#  define EAPI __declspec(dllimport)
+# endif /* ! EFL_EVAS_BUILD */
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+#define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + (size_t)(((struct sockaddr_un *)NULL)->sun_path))
+
+typedef struct _Server Server;
+typedef struct _Client Client;
+typedef struct _Mem Mem;
+
+struct _Server
+{
+   char *socket_path;
+   Eina_List *clients;
+   int (*func) (void *fdata, Server *s, Client *c, int opcode, int size, unsigned char *data);
+   void *data;
+   pid_t pid;
+   int server_id;
+   // for channel 2;
+   struct {
+      int fd;
+      int req_from, req_to;
+   } ch[2];
+   void *main_handle;
+};
+
+struct _Client
+{
+   Server *server;
+   unsigned char *buf;
+   Client *client_main;
+   int bufsize, bufalloc;
+   int fd;
+   unsigned char *inbuf;
+   int inbufsize, inbufalloc;
+   unsigned char dead : 1;
+   void (*func) (void *fdata, Client *c);
+   void *data;
+   pid_t pid;
+   int req_from, req_to;
+   LK(lock);
+};
+
+struct _Mem
+{
+   unsigned char *data;
+   char *name;
+   int fd;
+   int id;
+   int offset;
+   int size;
+   int ref;
+   Eina_Bool write : 1;
+};
+
+//// for comms
+enum
+{
+   OP_NOP, // 0
+     
+     OP_INIT, // 1
+     OP_LOAD, // 2
+     OP_UNLOAD, // 3
+     OP_LOADDATA, // 4
+     OP_UNLOADDATA, // 5
+     OP_USELESSDATA, // 6
+     OP_PRELOAD, // 7
+     OP_FORCEDUNLOAD, // 8
+     
+     OP_GETCONFIG, // 9
+     OP_SETCONFIG, // 10
+     OP_GETSTATS, // 11
+     OP_GETINFO, // 12
+     
+   OP_INVALID // 13
+};
+
+typedef struct
+{
+   pid_t pid;
+   int server_id;
+   void *handle;
+} Op_Init;
+typedef struct
+{
+   struct {
+      int    scale_down_by;
+      double dpi;
+      int    w, h;
+      struct {
+         int x, y, w, h;
+      } region;
+   } lopt;
+} Op_Load; // +"file""key"
+typedef struct
+{
+   void *handle;
+   int server_id;
+   struct {
+      int id;
+      int offset;
+      int size;
+   } mem;
+   struct {
+      int w, h;
+      Eina_Bool alpha : 1;
+   } image;
+} Op_Load_Reply;
+typedef struct
+{
+   void *handle;
+   int server_id;
+} Op_Unload;
+typedef struct
+{
+   void *handle;
+   int server_id;
+} Op_Unloaddata;
+typedef struct
+{
+   void *handle;
+   int server_id;
+} Op_Loaddata;
+typedef struct
+{
+   struct {
+      int id;
+      int offset;
+      int size;
+   } mem;
+} Op_Loaddata_Reply;
+typedef struct
+{
+   void *handle;
+   int server_id;
+} Op_Preload;
+typedef struct
+{
+   void *handle;
+   struct {
+      int id;
+      int offset;
+      int size;
+   } mem;
+} Op_Preload_Reply;
+typedef struct
+{
+   void *handle;
+   int server_id;
+} Op_Forcedunload;
+typedef struct
+{
+   int cache_max_usage;
+   int cache_item_timeout;
+   int cache_item_timeout_check;
+} Op_Getconfig_Reply;
+typedef struct
+{
+   int cache_max_usage;
+   int cache_item_timeout;
+   int cache_item_timeout_check;
+} Op_Setconfig;
+typedef struct
+{
+   int saved_memory;
+   int wasted_memory;
+   int saved_memory_peak;
+   int wasted_memory_peak;
+   double saved_time_image_header_load;
+   double saved_time_image_data_load;
+} Op_Getstats_Reply;
+typedef struct
+{
+   struct {
+      int mem_total;
+      int count;
+   } active, cached;
+} Op_Getinfo_Reply; // + N active Info Items + N cached items
+typedef struct
+{
+   int file_key_size;
+   int w, h;
+   time_t file_mod_time;
+   time_t file_checked_time;
+   time_t cached_time;
+   int refcount;
+   int data_refcount;
+   int memory_footprint;
+   double head_load_time;
+   double data_load_time;
+   Eina_Bool alpha : 1;
+   Eina_Bool data_loaded : 1;
+   Eina_Bool active : 1;
+   Eina_Bool dead : 1;
+   Eina_Bool useless : 1;
+} Op_Getinfo_Item; // + "file""key"
+
+
+// for clients to connect to cserve
+EAPI Eina_Bool evas_cserve_init(void);
+EAPI int       evas_cserve_use_get(void);
+EAPI Eina_Bool evas_cserve_have_get(void);
+EAPI void      evas_cserve_shutdown(void);
+EAPI void      evas_cserve_discon(void);
+EAPI Eina_Bool evas_cserve_image_load(Image_Entry *ie, const char *file, const char *key, RGBA_Image_Loadopts *lopt);
+EAPI Eina_Bool evas_cserve_image_data_load(Image_Entry *ie);
+EAPI void      evas_cserve_image_unload(Image_Entry *ie);
+EAPI void      evas_cserve_image_useless(Image_Entry *ie);
+EAPI void      evas_cserve_image_free(Image_Entry *ie);
+EAPI Eina_Bool evas_cserve_raw_config_get(Op_Getconfig_Reply *config);
+EAPI Eina_Bool evas_cserve_raw_config_set(Op_Setconfig *config);
+EAPI Eina_Bool evas_cserve_raw_stats_get(Op_Getstats_Reply *stats);
+EAPI Op_Getinfo_Reply *evas_cserve_raw_info_get(void);
+    
+// for the server
+EAPI Server *evas_cserve_server_add(void);
+EAPI void evas_cserve_server_del(Server *s);
+EAPI void evas_cserve_client_send(Client *c, int opcode, int size, unsigned char *data);
+EAPI void evas_cserve_server_message_handler_set(Server *s, int (*func) (void *fdata, Server *s, Client *c, int opcode, int size, unsigned char *data), void *data);
+EAPI void evas_cserve_server_wait(Server *s, int timeout);
+    
+//// for memory
+// for server
+EAPI Mem *evas_cserve_mem_new(int size, const char *name);
+EAPI void evas_cserve_mem_free(Mem *m);
+    
+// for client
+EAPI Mem *evas_cserve_mem_open(int pid, int id, const char *name, int size, int write);
+EAPI void evas_cserve_mem_close(Mem *m);
+
+// for both
+EAPI Eina_Bool evas_cserve_mem_resize(Mem *m, int size);
+EAPI void      evas_cserve_mem_del(int pid, int id);
+
+#endif
+
+#endif
diff --git a/src/lib/cserve/evas_cs_client.c b/src/lib/cserve/evas_cs_client.c
new file mode 100644 (file)
index 0000000..cb42e8b
--- /dev/null
@@ -0,0 +1,526 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <signal.h>
+
+#include "evas_cs.h"
+
+#ifdef EVAS_CSERVE
+
+static Server *cserve = NULL;
+static int csrve_init = 0;
+static int connect_num = 0;
+static int cserve_discon = 0;
+
+static void
+pipe_handler(int x __UNUSED__, siginfo_t *info __UNUSED__, void *data __UNUSED__)
+{
+}
+
+static void
+pipe_handle(int push)
+{
+   static struct sigaction old_action;
+   struct sigaction action;
+
+   if (push)
+     {
+        action.sa_handler = NULL;
+        action.sa_sigaction = pipe_handler;
+        action.sa_flags = SA_RESTART | SA_SIGINFO;
+        sigemptyset(&action.sa_mask);
+        sigaction(SIGPIPE, &action, &old_action);
+     }
+   else
+     {
+        sigaction(SIGPIPE, &old_action, &action);
+     }
+}
+
+static Server *
+server_connect(void)
+{
+   Server *s;
+   char buf[PATH_MAX];
+   int curstate = 0;
+   struct sockaddr_un socket_unix;
+   int socket_unix_len;
+   
+   s = calloc(1, sizeof(Server));
+   if (!s) return NULL;
+   s->ch[0].fd = -1;
+   s->ch[1].fd = -1;
+   snprintf(buf, sizeof(buf), "/tmp/.evas-cserve-%x", getuid());
+   s->socket_path = strdup(buf);
+   if (!s->socket_path)
+     {
+        free(s);
+        return NULL;
+     }
+   s->ch[0].fd = socket(AF_UNIX, SOCK_STREAM, 0);
+   if (s->ch[0].fd < 0) goto error;
+   if (fcntl(s->ch[0].fd, F_SETFD, FD_CLOEXEC) < 0) goto error;
+   if (setsockopt(s->ch[0].fd, SOL_SOCKET, SO_REUSEADDR, &curstate, sizeof(curstate)) < 0)
+     goto error;
+   socket_unix.sun_family = AF_UNIX;
+   strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path));
+   socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix);
+   if (connect(s->ch[0].fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0) goto error;
+
+   s->ch[1].fd = socket(AF_UNIX, SOCK_STREAM, 0);
+   if (s->ch[1].fd < 0) goto error;
+   if (fcntl(s->ch[1].fd, F_SETFD, FD_CLOEXEC) < 0) goto error;
+   if (setsockopt(s->ch[1].fd, SOL_SOCKET, SO_REUSEADDR, &curstate, sizeof(curstate)) < 0)
+     goto error;
+   socket_unix.sun_family = AF_UNIX;
+   strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path));
+   socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix);
+   if (connect(s->ch[1].fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0) goto error;
+   
+   return s;
+   error:
+   if (s->ch[0].fd >= 0) close(s->ch[0].fd);
+   if (s->ch[1].fd >= 0) close(s->ch[1].fd);
+   free(s->socket_path);
+   free(s);
+   return NULL;
+}
+
+static void
+server_disconnect(Server *s)
+{
+   close(s->ch[0].fd);
+   close(s->ch[1].fd);
+   free(s->socket_path);
+   free(s);
+}
+
+static int
+server_send(Server *s, int channel, int opcode, int size, unsigned char *data)
+{
+   int ints[3];
+   int num;
+   
+   pipe_handle(1);
+   ints[0] = size;
+   ints[1] = opcode;
+   s->ch[channel].req_to++;
+   ints[2] = s->ch[channel].req_to;
+   num = write(s->ch[channel].fd, ints, (sizeof(int) * 3));
+   if (num < 0)
+     {
+        pipe_handle(0);
+        if (cserve) server_disconnect(cserve);
+        cserve = NULL;
+        return 0;
+     }
+   num = write(s->ch[channel].fd, data, size);
+   if (num < 0)
+     {
+        pipe_handle(0);
+        if (cserve) server_disconnect(cserve);
+        cserve = NULL;
+        return 0;
+     }
+   pipe_handle(0);
+   return 1;
+}
+
+static unsigned char *
+server_read(Server *s, int channel, int *opcode, int *size)
+{
+   int ints[3], num, left;
+   unsigned char *data;
+   
+   num = read(s->ch[channel].fd, ints, sizeof(int) * 3);
+   if (num != (sizeof(int) * 3))
+     {
+        if (cserve) server_disconnect(cserve);
+        cserve = NULL;
+        return NULL;
+     }
+   *size = ints[0];
+   *opcode = ints[1];
+   if ((*size < 0) || (*size > (1024 * 1024))) return NULL;
+   if (ints[2] != (s->ch[channel].req_from + 1))
+     {
+        ERR("EEK! sequence number mismatch from serer with pid: %i\n"
+               "---- num %i is not 1 more than %i"
+               ,
+               s->pid, ints[2], s->ch[channel].req_from);
+        return NULL;
+     }
+   s->ch[channel].req_from++;
+   data = malloc(*size);
+   if (!data) return NULL;
+   num = read(s->ch[channel].fd, data, *size);
+   if (num < 0)
+     {
+        free(data);
+        return NULL;
+     }
+   left = *size - num;
+   while (left > 0)
+     {
+        num = read(s->ch[channel].fd, data + (*size - left), left);
+        if (num < 0)
+          {
+             free(data);
+             return NULL;
+          }
+        left -= num;
+     }
+   return data;
+}
+
+static int
+server_init(Server *s)
+{
+   Op_Init msg, *rep;
+   int opcode;
+   int size;
+   
+   msg.pid = getpid();
+   msg.server_id = 0;
+   msg.handle = NULL;
+   if (!server_send(s, 0, OP_INIT, sizeof(msg), (unsigned char *)(&msg)))
+     return 0;
+   rep = (Op_Init *)server_read(s, 0, &opcode, &size);
+   if ((rep) && (opcode == OP_INIT) && (size == sizeof(Op_Init)))
+     {
+        s->pid = rep->pid;
+        s->server_id = rep->server_id;
+        s->main_handle = rep->handle;
+        connect_num++;
+        msg.pid = getpid();
+        msg.server_id = 1;
+        msg.handle = rep->handle;
+        free(rep);
+        if (!server_send(s, 1, OP_INIT, sizeof(msg), (unsigned char *)(&msg)))
+          return 0;
+        rep = (Op_Init *)server_read(s, 1, &opcode, &size);
+        if ((rep) && (opcode == OP_INIT) && (size == sizeof(Op_Init)))
+          {
+             free(rep);
+             return 1;
+          }
+        if (rep) free(rep);
+        return 0;
+     }
+   if (rep) free(rep);
+   return 0;
+}
+
+EAPI Eina_Bool
+evas_cserve_init(void)
+{
+   csrve_init++;
+   if (cserve) return 1;
+   cserve = server_connect();
+   if (!cserve) return 0;
+   if (!server_init(cserve))
+     {
+        if (cserve) server_disconnect(cserve);
+        cserve = NULL;
+        return 0;
+     }
+   return 1;
+}
+
+EAPI int
+evas_cserve_use_get(void)
+{
+   return csrve_init;
+}
+
+EAPI Eina_Bool
+evas_cserve_have_get(void)
+{
+   if (cserve) return 1;
+   return 0;
+}
+
+EAPI void
+evas_cserve_shutdown(void)
+{
+   csrve_init--;
+   if (csrve_init > 0) return;
+   if (!cserve) return;
+   server_disconnect(cserve);
+   cserve = NULL;
+}
+
+EAPI void
+evas_cserve_discon(void)
+{
+   if (cserve)
+     {
+        server_disconnect(cserve);
+        cserve = NULL;
+        cserve_discon = 1;
+     }
+}
+
+static void
+server_reinit(void)
+{
+   if (cserve) return;
+   if (cserve_discon) return;
+   cserve = server_connect();
+   if (cserve)
+     {
+        if (!server_init(cserve))
+          {
+             if (cserve) server_disconnect(cserve);
+             cserve = NULL;
+          }
+     }
+}
+
+EAPI Eina_Bool
+evas_cserve_image_load(Image_Entry *ie, const char *file, const char *key, RGBA_Image_Loadopts *lopt)
+{
+   Op_Load msg;
+   Op_Load_Reply *rep;
+   unsigned char *buf;
+   char fbuf[PATH_MAX], wdb[PATH_MAX];
+   int flen, klen;
+   int opcode;
+   int size;
+   
+   if (csrve_init > 0) server_reinit();
+   else return 0;
+   if (!cserve) return 0;
+   if (!key) key = "";
+   memset(&msg, 0, sizeof(msg));
+   msg.lopt.scale_down_by = lopt->scale_down_by;
+   msg.lopt.dpi = lopt->dpi;
+   msg.lopt.w = lopt->w;
+   msg.lopt.h = lopt->h;
+   msg.lopt.region.x = lopt->region.x;
+   msg.lopt.region.y = lopt->region.y;
+   msg.lopt.region.w = lopt->region.w;
+   msg.lopt.region.h = lopt->region.h;
+   if (file[0] != '/')
+     {
+        if (getcwd(wdb, sizeof(wdb)))
+          {
+             snprintf(fbuf, sizeof(buf), "%s/%s", wdb, file);
+             file = fbuf;
+          }
+     }
+   if (!realpath(file, wdb)) file = wdb;
+   flen = strlen(file) + 1;
+   klen = strlen(key) + 1;
+   buf = malloc(sizeof(msg) + flen + klen);
+   memcpy(buf, &msg, sizeof(msg));
+   memcpy(buf + sizeof(msg), file, flen);
+   memcpy(buf + sizeof(msg) + flen, key, klen);
+   if (!buf) return 0;
+   if (!server_send(cserve, ie->channel, OP_LOAD, 
+                    sizeof(msg) + flen + klen,
+                    buf))
+     {
+        free(buf);
+        return 0;
+     }
+   free(buf);
+   if (!cserve) return 0;
+   rep = (Op_Load_Reply *)server_read(cserve, ie->channel, &opcode, &size);
+   if ((rep) && (opcode == OP_LOAD) && (size == sizeof(Op_Load_Reply)))
+     {
+        ie->w = rep->image.w;
+        ie->h = rep->image.h;
+        ie->flags.alpha = rep->image.alpha;
+        ie->data1 = rep->handle;
+     }
+   if (rep) free(rep);
+   if (ie->data1 == NULL) return 0;
+   ie->connect_num = connect_num;
+   if (cserve)
+     ie->server_id = cserve->server_id;
+   return 1;
+}
+
+EAPI Eina_Bool
+evas_cserve_image_data_load(Image_Entry *ie)
+{
+   Op_Loaddata msg;
+   Op_Loaddata_Reply *rep;
+   int opcode;
+   int size;
+   if (csrve_init > 0) server_reinit();
+   else return 0;
+   if (!cserve) return 0;
+   if (ie->data1 == NULL) return 0;
+   if (cserve->server_id != ie->server_id)
+     {
+        ie->data1 = NULL;
+        if (!evas_cserve_image_load(ie, ie->file, ie->key, &(ie->load_opts)))
+          return 0;
+     }
+   if (ie->connect_num != connect_num) return 0;
+   memset(&msg, 0, sizeof(msg));
+   msg.handle = ie->data1;
+   msg.server_id = cserve->server_id;
+   if (!server_send(cserve, ie->channel, OP_LOADDATA, sizeof(msg), (unsigned char *)(&msg)))
+     return 0;
+   if (!cserve) return 0;
+   rep = (Op_Loaddata_Reply *)server_read(cserve, ie->channel, &opcode, &size);
+   if ((rep) && (opcode == OP_LOADDATA) && (size == sizeof(Op_Loaddata_Reply)))
+     {
+        if (rep->mem.size <= 0)
+          {
+             free(rep);
+             return 0;
+          }
+        ie->data2 = evas_cserve_mem_open(cserve->pid, rep->mem.id, NULL, rep->mem.size, 0);
+        free(rep);
+        return 1;
+     }
+   if (rep) free(rep);
+   return 0;
+}
+
+EAPI void
+evas_cserve_image_free(Image_Entry *ie)
+{
+   Op_Unload msg;
+   
+   if (csrve_init > 0) server_reinit();
+   else return;
+   if (!cserve) return;
+   if (ie->data1 == NULL) return;
+   memset(&msg, 0, sizeof(msg));
+   msg.handle = ie->data1;
+   msg.server_id = cserve->server_id;
+   if (ie->data2) evas_cserve_image_unload(ie);
+   if (cserve)
+     {
+        if (ie->connect_num == connect_num)
+          {
+             if (ie->server_id == cserve->server_id)
+               server_send(cserve, ie->channel, OP_UNLOAD, sizeof(msg), (unsigned char *)(&msg));
+          }
+     }
+   ie->data1 = NULL;
+   ie->data2 = NULL;
+}
+
+EAPI void
+evas_cserve_image_unload(Image_Entry *ie)
+{
+   Op_Unloaddata msg;
+   
+   if (csrve_init > 0) server_reinit();
+   else return;
+   if (!cserve) return;
+   if (ie->data1 == NULL) return;
+   if (ie->connect_num != connect_num) return;
+   memset(&msg, 0, sizeof(msg));
+   msg.handle = ie->data1;
+   msg.server_id = cserve->server_id;
+   if (ie->data2) evas_cserve_mem_close(ie->data2);
+   ie->data2 = NULL;
+   if (ie->connect_num == connect_num)
+     {
+        if (ie->server_id == cserve->server_id)
+          server_send(cserve, ie->channel, OP_UNLOADDATA, sizeof(msg), (unsigned char *)(&msg));
+     }
+}
+
+EAPI void
+evas_cserve_image_useless(Image_Entry *ie)
+{
+   Op_Unloaddata msg;
+   
+   if (csrve_init > 0) server_reinit();
+   else return;
+   if (!cserve) return;
+   if (ie->data1 == NULL) return;
+   if (ie->connect_num != connect_num) return;
+   memset(&msg, 0, sizeof(msg));
+   msg.handle = ie->data1;
+   msg.server_id = cserve->server_id;
+   if (ie->data2) evas_cserve_mem_close(ie->data2);
+   ie->data2 = NULL;
+   if (ie->connect_num == connect_num)
+     {
+        if (ie->server_id == cserve->server_id)
+          server_send(cserve, ie->channel, OP_USELESSDATA, sizeof(msg), (unsigned char *)(&msg));
+     }
+}
+
+EAPI Eina_Bool
+evas_cserve_raw_config_get(Op_Getconfig_Reply *config)
+{
+   Op_Getconfig_Reply *rep;
+   int opcode;
+   int size;
+   if (csrve_init > 0) server_reinit();
+   else return 0;
+   if (!cserve) return 0;
+   if (!server_send(cserve, 0, OP_GETCONFIG, 0, NULL)) return 0;
+   rep = (Op_Getconfig_Reply *)server_read(cserve, 0, &opcode, &size);
+   if ((rep) && (opcode == OP_GETCONFIG) && (size == sizeof(Op_Getconfig_Reply)))
+     {
+        memcpy(config, rep, sizeof(Op_Getconfig_Reply));
+        free(rep);
+        return 1;
+     }
+   if (rep) free(rep);
+   return 0;
+}
+
+EAPI Eina_Bool
+evas_cserve_raw_config_set(Op_Setconfig *config)
+{
+   if (csrve_init > 0) server_reinit();
+   else return 0;
+   if (!cserve) return 0;
+   if (!server_send(cserve, 0, OP_SETCONFIG, sizeof(Op_Setconfig), (unsigned char *)config)) return 0;
+   return 1;
+}
+
+EAPI Eina_Bool
+evas_cserve_raw_stats_get(Op_Getstats_Reply *stats)
+{
+   Op_Getstats_Reply *rep;
+   int opcode;
+   int size;
+   if (csrve_init > 0) server_reinit();
+   else return 0;
+   if (!cserve) return 0;
+   if (!server_send(cserve, 0, OP_GETSTATS, 0, NULL)) return 0;
+   rep = (Op_Getstats_Reply *)server_read(cserve, 0, &opcode, &size);
+   if ((rep) && (opcode == OP_GETSTATS) && (size == sizeof(Op_Getstats_Reply)))
+     {
+        memcpy(stats, rep, sizeof(Op_Getstats_Reply));
+        free(rep);
+        return 1;
+     }
+   if (rep) free(rep);
+   return 0;
+}
+
+EAPI Op_Getinfo_Reply *
+evas_cserve_raw_info_get(void)
+{
+   Op_Getinfo_Reply *rep;
+   int opcode;
+   int size;
+   if (csrve_init > 0) server_reinit();
+   else return NULL;
+   if (!cserve) return NULL;
+   if (!server_send(cserve, 0, OP_GETINFO, 0, NULL)) return NULL;
+   rep = (Op_Getinfo_Reply *)server_read(cserve, 0, &opcode, &size);
+   if ((rep) && (opcode == OP_GETINFO) && (size >= sizeof(Op_Getinfo_Reply)))
+     {
+        return rep;
+     }
+   if (rep) free(rep);
+   return NULL;
+}
+
+#endif
diff --git a/src/lib/cserve/evas_cs_main.c b/src/lib/cserve/evas_cs_main.c
new file mode 100644 (file)
index 0000000..e8282aa
--- /dev/null
@@ -0,0 +1,9 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "evas_cs.h"
+
+#ifdef EVAS_CSERVE
+
+#endif
diff --git a/src/lib/cserve/evas_cs_mem.c b/src/lib/cserve/evas_cs_mem.c
new file mode 100644 (file)
index 0000000..1fff9ba
--- /dev/null
@@ -0,0 +1,160 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "evas_cs.h"
+
+#ifdef EVAS_CSERVE
+
+EAPI Mem *
+evas_cserve_mem_new(int size, const char *name)
+{
+   Mem *m;
+   static int id = 0;
+   char buf[PATH_MAX];
+   
+   m = calloc(1, sizeof(Mem));
+   if (!m) return NULL;
+   if (name)
+     snprintf(buf, sizeof(buf), "/evas-shm-%x.%s", getuid(), name);
+   else
+     {
+        id++;
+        snprintf(buf, sizeof(buf), "/evas-shm-%x.%x.%x", getuid(), getpid(), id);
+     }
+   m->id = id;
+   m->offset = 0;
+   m->name = strdup(buf);
+   if (!m->name)
+     {
+        free(m);
+        return NULL;
+     }
+   m->size = size;
+   m->fd = shm_open(m->name, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
+   if (m->fd < 0)
+     {
+        free(m->name);
+        free(m);
+        return NULL;
+     }
+   if (ftruncate(m->fd, m->size) < 0)
+     {
+        shm_unlink(m->name);
+        close(m->fd);
+        free(m->name);
+        free(m);
+        return NULL;
+     }
+   m->data = mmap(NULL, m->size, PROT_READ | PROT_WRITE, MAP_SHARED, m->fd, 0);
+   if (m->data == MAP_FAILED)
+     {
+        shm_unlink(m->name);
+        close(m->fd);
+        free(m->name);
+        free(m);
+        return NULL;
+     }
+   m->ref = 1;
+   m->write = 1;
+   return m;
+}
+
+EAPI void
+evas_cserve_mem_free(Mem *m)
+{
+   shm_unlink(m->name);
+   munmap(m->data, m->size);
+   close(m->fd);
+   free(m->name);
+   free(m);
+}
+
+EAPI Mem *
+evas_cserve_mem_open(int pid, int id, const char *name, int size, int write)
+{
+   Mem *m;
+   char buf[PATH_MAX];
+   
+   m = calloc(1, sizeof(Mem));
+   if (!m) return NULL;
+   if (name)
+     snprintf(buf, sizeof(buf), "/evas-shm-%x.%s", getuid(), name);
+   else
+     snprintf(buf, sizeof(buf), "/evas-shm-%x.%x.%x", getuid(), pid, id);
+   m->name = strdup(buf);
+   if (!m->name)
+     {
+        free(m);
+        return NULL;
+     }
+   m->size = size;
+   if (write)
+     m->fd = shm_open(m->name, O_RDWR, S_IRUSR | S_IWUSR);
+   else
+     m->fd = shm_open(m->name, O_RDONLY, S_IRUSR);
+   if (m->fd < 0)
+     {
+        free(m->name);
+        free(m);
+        return NULL;
+     }
+   m->write = write;
+   if (write)
+     m->data = mmap(NULL, m->size, PROT_READ | PROT_WRITE, MAP_SHARED, m->fd, 0);
+   else
+     m->data = mmap(NULL, m->size, PROT_READ, MAP_SHARED, m->fd, 0);
+   if (m->data == MAP_FAILED)
+     {
+        close(m->fd);
+        free(m->name);
+        free(m);
+        return NULL;
+     }
+   m->ref = 1;
+   return m;
+}
+
+EAPI void
+evas_cserve_mem_close(Mem *m)
+{
+   munmap(m->data, m->size);
+   close(m->fd);
+   free(m->name);
+   free(m);
+}
+
+EAPI Eina_Bool
+evas_cserve_mem_resize(Mem *m, int size)
+{
+   if (m->size == size) return 1;
+   if (m->write)
+     {
+        if (ftruncate(m->fd, size) < 0) return 0;
+        munmap(m->data, m->size);
+        m->data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, m->fd, 0);
+     }
+   else
+     {
+        munmap(m->data, m->size);
+        m->data = mmap(NULL, size, PROT_READ, MAP_SHARED, m->fd, 0);
+     }
+   if (m->data == MAP_FAILED)
+     {
+        m->data = NULL;
+        return 0;
+     }
+   m->size = size;
+   return 1;
+}
+
+EAPI void
+evas_cserve_mem_del(int pid, int id)
+{
+   char buf[PATH_MAX];
+   
+   snprintf(buf, sizeof(buf), "/evas-shm-%x.%x.%x", getuid(), pid, id);
+   shm_unlink(buf);
+}
+
+#endif
diff --git a/src/lib/cserve/evas_cs_server.c b/src/lib/cserve/evas_cs_server.c
new file mode 100644 (file)
index 0000000..dc2f2b7
--- /dev/null
@@ -0,0 +1,380 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "evas_cs.h"
+
+#ifdef EVAS_CSERVE
+
+EAPI Server *
+evas_cserve_server_add(void)
+{
+   Server *s;
+   char buf[PATH_MAX];
+   struct sockaddr_un socket_unix;
+   struct linger lin;
+   mode_t pmode;
+   int socket_unix_len;
+   
+   s = calloc(1, sizeof(Server));
+   if (!s) return NULL;
+   s->ch[0].fd = -1;
+   snprintf(buf, sizeof(buf), "/tmp/.evas-cserve-%x", getuid());
+   s->socket_path = strdup(buf);
+   if (!s->socket_path)
+     {
+        free(s);
+        return NULL;
+     }
+   pmode = umask(~(S_IRUSR | S_IWUSR));
+   start:
+   s->ch[0].fd = socket(AF_UNIX, SOCK_STREAM, 0);
+   if (s->ch[0].fd < 0) goto error;
+   if (fcntl(s->ch[0].fd, F_SETFL, O_NONBLOCK) < 0) goto error;
+   if (fcntl(s->ch[0].fd, F_SETFD, FD_CLOEXEC) < 0) goto error;
+   lin.l_onoff = 1;
+   lin.l_linger = 0;
+   if (setsockopt(s->ch[0].fd, SOL_SOCKET, SO_LINGER, &lin, sizeof(struct linger)) < 0)
+     goto error;
+   socket_unix.sun_family = AF_UNIX;
+   strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path));
+   socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix);
+   if (bind(s->ch[0].fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0)
+     {
+        if ((connect(s->ch[0].fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0) &&
+            (unlink(s->socket_path) >= 0))
+          {
+             close(s->ch[0].fd);
+             goto start;
+          }
+        else
+          goto error;
+     }
+   if (listen(s->ch[0].fd, 4096) < 0) goto error;
+   umask(pmode);
+   return s;
+   error:
+   umask(pmode);
+   if (s->ch[0].fd >= 0) close(s->ch[0].fd);
+   free(s->socket_path);
+   free(s);
+   return NULL;
+}
+
+EAPI void
+evas_cserve_server_del(Server *s)
+{
+   Client *c;
+   
+   EINA_LIST_FREE(s->clients, c)
+     {
+        LKL(c->lock);
+        close(c->fd);
+        if (c->buf) free(c->buf);
+        if (c->inbuf) free(c->inbuf);
+        LKD(c->lock);
+        free(c);
+     }
+   close(s->ch[0].fd);
+   unlink(s->socket_path);
+   free(s->socket_path);
+   free(s);
+}
+
+static void
+server_accept(Server *s)
+{
+   Client *c;
+   int new_fd;
+   struct sockaddr_in incoming;
+   size_t size_in;
+   
+   size_in = sizeof(struct sockaddr_in);
+   new_fd = accept(s->ch[0].fd, (struct sockaddr *)&incoming, (socklen_t *)&size_in);
+   if (new_fd < 0) return;
+   fcntl(new_fd, F_SETFL, O_NONBLOCK);
+   fcntl(new_fd, F_SETFD, FD_CLOEXEC);
+   c = calloc(1, sizeof(Client));
+   if (!c)
+     {
+        close(new_fd);
+        return;
+     }
+   c->server = s;
+   c->fd = new_fd;
+   LKI(c->lock);
+   s->clients = eina_list_append(s->clients, c);
+}
+
+static void
+client_flush(Client *c)
+{
+   int num;
+   
+   num = write(c->fd, c->buf, c->bufsize);
+   if (num < 0)
+     {
+        c->dead = 1;
+        return;
+     }
+   if (num < c->bufsize)
+     {
+        unsigned char *buf;
+        
+        buf = malloc(c->bufsize - num);
+        if (buf)
+          {
+             memcpy(buf, c->buf + num, c->bufsize - num);
+             free(c->buf);
+             c->bufsize = c->bufsize - num;
+             c->bufalloc = c->bufsize;
+             c->buf = buf;
+          }
+     }
+   else
+     {
+        free(c->buf);
+        c->buf = NULL;
+        c->bufsize = 0;
+        c->bufalloc = 0;
+     }
+}
+
+static void
+client_buf_add(Client *c, unsigned char *data, int size)
+{
+   int newsize;
+   unsigned char *buf;
+
+   newsize = c->bufsize + size;
+   if (newsize > c->bufalloc)
+     {
+        c->bufalloc = newsize + 16384;
+        buf = realloc(c->buf, c->bufalloc);
+        if (buf) c->buf = buf;
+        else return;
+     }
+   memcpy(c->buf + c->bufsize, data, size);
+   c->bufsize += size;
+}
+
+static void
+client_write(Client *c, unsigned char *data, int size)
+{
+   int num;
+   
+   if (!c->buf)
+     {
+        num = write(c->fd, data, size);
+        if (num != size)
+          client_buf_add(c, data + num, size - num);
+     }
+   else
+     {
+        client_buf_add(c, data, size);
+     }
+}
+
+EAPI void
+evas_cserve_client_send(Client *c, int opcode, int size, unsigned char *data)
+{
+   unsigned char *data2;
+   int *ints;
+   
+   data2 = malloc(size + (sizeof(int) * 3));
+   if (!data2) return;
+   ints = (int *)data2;
+   ints[0] = size;
+   ints[1] = opcode;
+//   LKL(c->lock);
+   c->req_to++;
+   ints[2] = c->req_to;
+   memcpy(data2 + (sizeof(int) * 3), data, size);
+   client_write(c, data2, size + (sizeof(int) * 3));
+//   LKU(c->lock);
+   free(data2);
+}
+
+static void
+server_message_handle(Server *s, Client *c, int opcode, int size, unsigned char *data)
+{
+   if (s->func) s->func(s->data, s, c, opcode, size, data);
+}
+
+EAPI void
+evas_cserve_server_message_handler_set(Server *s, int (*func) (void *fdata, Server *s, Client *c, int opcode, int size, unsigned char *data), void *data)
+{
+   s->func = func;
+   s->data = data;
+}
+
+static int
+server_parse(Server *s, Client *c)
+{
+   int *ints;
+   unsigned char *data, *newbuf;
+   
+   if (c->inbufsize < sizeof(int)) return 0;
+   ints = (int *)((c->inbuf));
+   if ((ints[0] < 0) || (ints[0] > (1024 * 1024)))
+     return 0;
+   if (c->inbufsize < (ints[0] + (sizeof(int) * 3)))
+     {
+        return 0;
+     }
+   data = c->inbuf + (sizeof(int) * 3);
+   if (ints[2] != (c->req_from + 1))
+     {
+        ERR("EEK! sequence number mismatch from client with pid: %i\n"
+               "---- num %i is not 1 more than %i"
+               ,
+               c->pid, ints[2], c->req_from);
+        return 0;
+     }
+   c->req_from++;
+   server_message_handle(s, c, ints[1], ints[0], data);
+   c->inbufalloc -= ints[0] + (sizeof(int) * 3);
+   if (c->inbufalloc == 0)
+     {
+        free(c->inbuf);
+        c->inbuf = NULL;
+        c->inbufsize = 0;
+        return 0;
+     }
+   newbuf = malloc(c->inbufalloc);
+   if (!newbuf)
+     {
+        c->inbufalloc += ints[0] + (sizeof(int) * 3);
+        /* fixme - bad situation */
+        return 0;
+     }
+   memcpy(newbuf, c->inbuf + ints[0] + (sizeof(int) * 3), c->inbufalloc);
+   c->inbufsize -= ints[0] + (sizeof(int) * 3);
+   free(c->inbuf);
+   c->inbuf = newbuf;
+   return 1;
+}
+
+static void
+server_data(Server *s, Client *c, unsigned char *data, int size)
+{
+   if (!c->inbuf)
+     {
+        c->inbuf = malloc(size);
+        if (c->inbuf)
+          {
+             memcpy(c->inbuf, data, size);
+             c->inbufalloc = size;
+             c->inbufsize = size;
+          }
+        else
+          {
+             /* fixme - bad situation */
+             return;
+          }
+     }
+   else
+     {
+        int size2;
+        
+        size2 = c->inbufsize + size;
+        if (size2 > c->inbufalloc)
+          {
+             unsigned char *newbuf;
+             
+             c->inbufalloc = size2;
+             newbuf = realloc(c->inbuf, c->inbufalloc);
+             if (newbuf) c->inbuf = newbuf;
+             else size2 = 0;
+          }
+        if (size2 > 0)
+          {
+             memcpy(c->inbuf + c->inbufsize, data, size);
+             c->inbufsize = size2;
+          }
+        else
+          {
+             /* fixme - bad situation */
+             return;
+          }
+     }
+   while (server_parse(s, c));
+}
+
+EAPI void
+evas_cserve_server_wait(Server *s, int timeout)
+{
+   fd_set rset, wset, xset;
+   int maxfd;
+   int ret;
+   struct timeval to;
+   Eina_List *l, *dead = NULL;
+   Client *c;
+   
+   maxfd = 0;
+   FD_ZERO(&rset);
+   FD_ZERO(&wset);
+   FD_ZERO(&xset);
+   FD_SET(s->ch[0].fd, &rset);
+   if (s->ch[0].fd > maxfd) maxfd = s->ch[0].fd;
+   EINA_LIST_FOREACH(s->clients, l, c)
+     {
+        FD_SET(c->fd, &rset);
+        if (c->buf)
+          FD_SET(c->fd, &wset);
+        if (c->fd > maxfd) maxfd = c->fd;
+     }
+   if (timeout > 0)
+     {
+        to.tv_sec = timeout / 1000000;
+        to.tv_usec = timeout % 1000000;
+        ret = select(maxfd + 1, &rset, &wset, &xset, &to);
+     }
+   else
+     ret = select(maxfd + 1, &rset, &wset, &xset, NULL);
+   if (ret < 1) return;
+   
+   EINA_LIST_FOREACH(s->clients, l, c)
+     {
+        if (c->dead) continue;
+        if (FD_ISSET(c->fd, &rset))
+          {
+            unsigned char buf[16384];
+             int num;
+             
+             errno = 0;
+             num = read(c->fd, buf, sizeof(buf));
+             if (num <= 0)
+               {
+                  c->dead = 1;
+                  dead = eina_list_append(dead, c);
+               }
+             else if (num > 0)
+               {
+                  server_data(s, c, buf, num);
+               }
+          }
+        else if (FD_ISSET(c->fd, &wset))
+          {
+             client_flush(c);
+             if (c->dead) dead = eina_list_append(dead, c);
+          }
+     }
+   if (FD_ISSET(s->ch[0].fd, &rset))
+     {
+        server_accept(s);
+     }
+   EINA_LIST_FREE(dead, c)
+     {
+        LKL(c->lock);
+        if (c->func) c->func(c->data, c);
+        s->clients = eina_list_remove(s->clients, c);
+        close(c->fd);
+        if (c->buf) free(c->buf);
+        if (c->inbuf) free(c->inbuf);
+        LKD(c->lock);
+        free(c);
+     }
+}
+
+#endif
diff --git a/src/lib/engines/.cvsignore b/src/lib/engines/.cvsignore
new file mode 100644 (file)
index 0000000..3dda729
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile.in
+Makefile
diff --git a/src/lib/engines/Makefile.am b/src/lib/engines/Makefile.am
new file mode 100644 (file)
index 0000000..9d68875
--- /dev/null
@@ -0,0 +1,10 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS = common
+
+if BUILD_ENGINE_SOFTWARE_16
+
+SUBDIRS += common_16
+
+endif
diff --git a/src/lib/engines/common/.cvsignore b/src/lib/engines/common/.cvsignore
new file mode 100644 (file)
index 0000000..306efda
--- /dev/null
@@ -0,0 +1,6 @@
+Makefile.in
+Makefile
+.deps
+.libs
+libevas_engine_common.la
+*.lo
diff --git a/src/lib/engines/common/Makefile.am b/src/lib/engines/common/Makefile.am
new file mode 100644 (file)
index 0000000..f8669ae
--- /dev/null
@@ -0,0 +1,117 @@
+
+SUBDIRS = evas_op_add evas_op_blend evas_op_copy evas_op_mask evas_op_mul evas_op_sub
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS         = -I. \
+                      -I$(top_srcdir)/src/lib \
+                      -I$(top_srcdir)/src/lib/cserve \
+                      -I$(top_srcdir)/src/lib/include \
+                      -DPACKAGE_BIN_DIR=\"$(bindir)\" \
+                      -DPACKAGE_LIB_DIR=\"$(libdir)\" \
+                      -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+                      @FREETYPE_CFLAGS@ @VALGRIND_CFLAGS@ \
+                      @EET_CFLAGS@ @pthread_cflags@ \
+                      @WIN32_CFLAGS@ @EINA_CFLAGS@ \
+                       @FRIBIDI_CFLAGS@
+
+noinst_LTLIBRARIES      = libevas_engine_common.la
+libevas_engine_common_la_SOURCES  = \
+evas_op_copy_main_.c \
+evas_op_blend_main_.c \
+evas_op_add_main_.c \
+evas_op_sub_main_.c \
+evas_op_mask_main_.c \
+evas_op_mul_main_.c \
+evas_blend_main.c \
+evas_blit_main.c \
+evas_convert_color.c \
+evas_convert_colorspace.c \
+evas_convert_gry_1.c \
+evas_convert_gry_4.c \
+evas_convert_gry_8.c \
+evas_convert_main.c \
+evas_convert_rgb_16.c \
+evas_convert_rgb_24.c \
+evas_convert_rgb_32.c \
+evas_convert_rgb_8.c \
+evas_convert_grypal_6.c \
+evas_convert_yuv.c \
+evas_cpu.c \
+evas_draw_main.c \
+evas_font_draw.c \
+evas_font_load.c \
+evas_font_main.c \
+evas_font_query.c \
+evas_gradient_main.c \
+evas_gradient_linear.c \
+evas_gradient_radial.c \
+evas_gradient_angular.c \
+evas_gradient_rectangular.c \
+evas_gradient_sinusoidal.c \
+evas_gradient2_main.c \
+evas_gradient2_linear.c \
+evas_gradient2_radial.c \
+evas_image_load.c \
+evas_image_save.c \
+evas_image_main.c \
+evas_image_data.c \
+evas_image_scalecache.c \
+evas_line_main.c \
+evas_polygon_main.c \
+evas_rectangle_main.c \
+evas_scale_main.c \
+evas_scale_sample.c \
+evas_scale_smooth.c \
+evas_scale_span.c \
+evas_tiler.c \
+evas_regionbuf.c \
+evas_pipe.c \
+evas_intl_utils.c \
+evas_intl/evas_intl_arabic.c \
+evas_intl/evas_intl_arabic.h \
+evas_map_image.c \
+evas_map_image.h
+
+EXTRA_DIST = \
+evas_blend.h \
+evas_blend_private.h \
+evas_convert_color.h \
+evas_convert_colorspace.h \
+evas_convert_gry_1.h \
+evas_convert_gry_4.h \
+evas_convert_gry_8.h \
+evas_convert_grypal_6.h \
+evas_convert_main.h \
+evas_convert_rgb_16.h \
+evas_convert_rgb_24.h \
+evas_convert_rgb_32.h \
+evas_convert_rgb_8.h \
+evas_convert_yuv.h \
+evas_draw.h \
+evas_font.h \
+evas_gradient.h \
+evas_gradient_private.h \
+evas_image.h \
+evas_image_private.h \
+evas_line.h \
+evas_polygon.h \
+evas_rectangle.h \
+evas_scale_main.h \
+evas_scale_smooth.h \
+evas_scale_smooth_scaler.c \
+evas_scale_smooth_scaler_down.c \
+evas_scale_smooth_scaler_downx.c \
+evas_scale_smooth_scaler_downx_downy.c \
+evas_scale_smooth_scaler_downy.c \
+evas_scale_smooth_scaler_noscale.c \
+evas_scale_smooth_scaler_up.c \
+evas_scale_span.h \
+evas_pipe.h \
+evas_intl_utils.h \
+evas_map_image_internal.c \
+evas_map_image_core.c \
+evas_map_image_loop.c
+
+libevas_engine_common_la_DEPENDENCIES = \
+$(top_builddir)/config.h
diff --git a/src/lib/engines/common/evas_blend.h b/src/lib/engines/common/evas_blend.h
new file mode 100644 (file)
index 0000000..65ed493
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_BLEND_H
+#define _EVAS_BLEND_H
+
+
+EAPI void evas_common_blend_init (void);
+
+
+#endif /* _EVAS_BLEND_H */
diff --git a/src/lib/engines/common/evas_blend_main.c b/src/lib/engines/common/evas_blend_main.c
new file mode 100644 (file)
index 0000000..6ab7cb8
--- /dev/null
@@ -0,0 +1,329 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_blend_private.h"
+
+#if defined BUILD_MMX || defined BUILD_SSE
+#include "evas_mmx.h"
+#endif
+
+const DATA32 ALPHA_255 = 255;
+const DATA32 ALPHA_256 = 256;
+
+static void
+_composite_span_nothing(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d __UNUSED__, int l __UNUSED__)
+{
+}
+
+static void
+_composite_pt_nothing(DATA32 s __UNUSED__, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d __UNUSED__)
+{
+}
+
+static RGBA_Gfx_Compositor  *
+evas_gfx_compositor_get(unsigned char op)
+{
+   RGBA_Gfx_Compositor  *comp;
+
+   switch (op)
+      {
+       case _EVAS_RENDER_BLEND:
+          comp = evas_common_gfx_compositor_blend_get();
+          break;
+       case _EVAS_RENDER_BLEND_REL:
+          comp = evas_common_gfx_compositor_blend_rel_get();
+          break;
+       case _EVAS_RENDER_COPY:
+          comp = evas_common_gfx_compositor_copy_get();
+          break;
+       case _EVAS_RENDER_COPY_REL:
+          comp = evas_common_gfx_compositor_copy_rel_get();
+          break;
+/*
+       case _EVAS_RENDER_ADD:
+          comp = evas_common_gfx_compositor_add_get();
+          break;
+       case _EVAS_RENDER_ADD_REL:
+          comp = evas_common_gfx_compositor_add_rel_get();
+          break;
+       case _EVAS_RENDER_SUB:
+          comp = evas_common_gfx_compositor_sub_get();
+          break;
+       case _EVAS_RENDER_SUB_REL:
+          comp = evas_common_gfx_compositor_sub_rel_get();
+          break;
+*/
+       case _EVAS_RENDER_MASK:
+          comp = evas_common_gfx_compositor_mask_get();
+          break;
+       case _EVAS_RENDER_MUL:
+          comp = evas_common_gfx_compositor_mul_get();
+          break;
+       default:
+          comp = evas_common_gfx_compositor_blend_get();
+          break;
+      }
+   return comp;
+}
+
+EAPI void
+evas_common_blend_init(void)
+{
+   static int gfx_initialised = 0;
+   static int mmx = 0;
+   static int sse = 0;
+   static int sse2 = 0;
+   RGBA_Gfx_Compositor  *comp;
+
+   if (gfx_initialised) return;
+   gfx_initialised = 1;
+
+   evas_common_cpu_can_do(&mmx, &sse, &sse2);
+
+   comp = evas_common_gfx_compositor_copy_get();
+   if (comp) comp->init();
+   comp = evas_common_gfx_compositor_copy_rel_get();
+   if (comp) comp->init();
+
+   comp = evas_common_gfx_compositor_blend_get();
+   if (comp) comp->init();
+   comp = evas_common_gfx_compositor_blend_rel_get();
+   if (comp) comp->init();
+
+/*
+   comp = evas_common_gfx_compositor_add_get();
+   if (comp) comp->init();
+   comp = evas_common_gfx_compositor_add_rel_get();
+   if (comp) comp->init();
+   comp = evas_common_gfx_compositor_sub_get();
+   if (comp) comp->init();
+   comp = evas_common_gfx_compositor_sub_rel_get();
+   if (comp) comp->init();
+*/
+   comp = evas_common_gfx_compositor_mask_get();
+   if (comp) comp->init();
+
+   comp = evas_common_gfx_compositor_mul_get();
+   if (comp) comp->init();
+}
+
+void
+evas_common_blend_shutdown(void)
+{
+   RGBA_Gfx_Compositor  *comp;
+
+   comp = evas_common_gfx_compositor_copy_get();
+   if (comp) comp->shutdown();
+   comp = evas_common_gfx_compositor_copy_rel_get();
+   if (comp) comp->shutdown();
+
+   comp = evas_common_gfx_compositor_blend_get();
+   if (comp) comp->shutdown();
+   comp = evas_common_gfx_compositor_blend_rel_get();
+   if (comp) comp->shutdown();
+
+/*
+   comp = evas_common_gfx_compositor_add_get();
+   if (comp) comp->shutdown();
+   comp = evas_common_gfx_compositor_add_rel_get();
+   if (comp) comp->shutdown();
+   comp = evas_common_gfx_compositor_sub_get();
+   if (comp) comp->shutdown();
+   comp = evas_common_gfx_compositor_sub_rel_get();
+   if (comp) comp->shutdown();
+*/
+   comp = evas_common_gfx_compositor_mask_get();
+   if (comp) comp->shutdown();
+
+   comp = evas_common_gfx_compositor_mul_get();
+   if (comp) comp->shutdown();
+}
+
+
+RGBA_Gfx_Func
+evas_common_gfx_func_composite_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels, int op)
+{
+   RGBA_Gfx_Compositor  *comp;
+   RGBA_Gfx_Func        func = NULL;
+
+   if (src && (!src->cache_entry.flags.alpha))
+     {
+       if (op == _EVAS_RENDER_BLEND)
+          op = _EVAS_RENDER_COPY;
+       if (op == _EVAS_RENDER_BLEND_REL)
+          op = _EVAS_RENDER_COPY_REL;
+     }
+   comp = evas_gfx_compositor_get(op);
+   if (comp)
+       func = comp->composite_pixel_span_get(src, dst, pixels);
+   if (func)
+       return func;
+   return _composite_span_nothing;
+}
+
+RGBA_Gfx_Func
+evas_common_gfx_func_composite_color_span_get(DATA32 col, RGBA_Image *dst, int pixels, int op)
+{
+   RGBA_Gfx_Compositor  *comp;
+   RGBA_Gfx_Func        func = NULL;
+
+   if ((col & 0xff000000) == 0xff000000)
+     {
+       if (op == _EVAS_RENDER_BLEND)
+          op = _EVAS_RENDER_COPY;
+       if (op == EVAS_RENDER_BLEND_REL)
+          op = _EVAS_RENDER_COPY_REL;
+     }
+
+   comp = evas_gfx_compositor_get(op);
+   if (comp)
+       func = comp->composite_color_span_get(col, dst, pixels);
+   if (func)
+       return func;
+   return _composite_span_nothing;
+}
+
+RGBA_Gfx_Func
+evas_common_gfx_func_composite_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels, int op)
+{
+   RGBA_Gfx_Compositor  *comp;
+   RGBA_Gfx_Func        func = NULL;
+
+   if ((src && (!src->cache_entry.flags.alpha)) && ((col & 0xff000000) == 0xff000000))
+     {
+       if (op == _EVAS_RENDER_BLEND)
+          op = _EVAS_RENDER_COPY;
+       if (op == _EVAS_RENDER_BLEND_REL)
+          op = _EVAS_RENDER_COPY_REL;
+     }
+
+   comp = evas_gfx_compositor_get(op);
+   if (comp)
+       func = comp->composite_pixel_color_span_get(src, col, dst, pixels);
+   if (func)
+       return func;
+   return _composite_span_nothing;
+}
+
+RGBA_Gfx_Func
+evas_common_gfx_func_composite_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels, int op)
+{
+   RGBA_Gfx_Compositor  *comp;
+   RGBA_Gfx_Func        func = NULL;
+
+   comp = evas_gfx_compositor_get(op);
+   if (comp)
+       func = comp->composite_mask_color_span_get(col, dst, pixels);
+   if (func)
+       return func;
+   return _composite_span_nothing;
+}
+
+RGBA_Gfx_Func
+evas_common_gfx_func_composite_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels, int op)
+{
+   RGBA_Gfx_Compositor  *comp;
+   RGBA_Gfx_Func        func = NULL;
+
+   comp = evas_gfx_compositor_get(op);
+   if (comp)
+       func = comp->composite_pixel_mask_span_get(src, dst, pixels);
+   if (func)
+       return func;
+   return _composite_span_nothing;
+}
+
+RGBA_Gfx_Pt_Func
+evas_common_gfx_func_composite_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst, int op)
+{
+   RGBA_Gfx_Compositor  *comp;
+   RGBA_Gfx_Pt_Func     func = NULL;
+
+   if (!src_flags.alpha)
+     {
+       if (op == _EVAS_RENDER_BLEND)
+          op = _EVAS_RENDER_COPY;
+       if (op == _EVAS_RENDER_BLEND_REL)
+          op = _EVAS_RENDER_COPY_REL;
+     }
+   comp = evas_gfx_compositor_get(op);
+   if (comp)
+       func = comp->composite_pixel_pt_get(src_flags, dst);
+   if (func)
+       return func;
+   return _composite_pt_nothing;
+}
+
+RGBA_Gfx_Pt_Func
+evas_common_gfx_func_composite_color_pt_get(DATA32 col, RGBA_Image *dst, int op)
+{
+   RGBA_Gfx_Compositor  *comp;
+   RGBA_Gfx_Pt_Func     func = NULL;
+
+   if ((col & 0xff000000) == 0xff000000)
+     {
+       if (op == _EVAS_RENDER_BLEND)
+          op = _EVAS_RENDER_COPY;
+       if (op == EVAS_RENDER_BLEND_REL)
+          op = _EVAS_RENDER_COPY_REL;
+     }
+
+   comp = evas_gfx_compositor_get(op);
+   if (comp)
+       func = comp->composite_color_pt_get(col, dst);
+   if (func)
+       return func;
+   return _composite_pt_nothing;
+}
+
+RGBA_Gfx_Pt_Func
+evas_common_gfx_func_composite_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst, int op)
+{
+   RGBA_Gfx_Compositor  *comp;
+   RGBA_Gfx_Pt_Func     func = NULL;
+
+   if ((!src_flags.alpha) && ((col & 0xff000000) == 0xff000000))
+     {
+       if (op == _EVAS_RENDER_BLEND)
+          op = _EVAS_RENDER_COPY;
+       if (op == _EVAS_RENDER_BLEND_REL)
+          op = _EVAS_RENDER_COPY_REL;
+     }
+
+   comp = evas_gfx_compositor_get(op);
+   if (comp)
+       func = comp->composite_pixel_color_pt_get(src_flags, col, dst);
+   if (func)
+       return func;
+   return _composite_pt_nothing;
+}
+
+RGBA_Gfx_Pt_Func
+evas_common_gfx_func_composite_mask_color_pt_get(DATA32 col, RGBA_Image *dst, int op)
+{
+   RGBA_Gfx_Compositor  *comp;
+   RGBA_Gfx_Pt_Func     func = NULL;
+
+   comp = evas_gfx_compositor_get(op);
+   if (comp)
+       func = comp->composite_mask_color_pt_get(col, dst);
+   if (func)
+       return func;
+   return _composite_pt_nothing;
+}
+
+RGBA_Gfx_Pt_Func
+evas_common_gfx_func_composite_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst, int op)
+{
+   RGBA_Gfx_Compositor  *comp;
+   RGBA_Gfx_Pt_Func     func = NULL;
+
+   comp = evas_gfx_compositor_get(op);
+   if (comp)
+       func = comp->composite_pixel_mask_pt_get(src_flags, dst);
+   if (func)
+       return func;
+   return _composite_pt_nothing;
+}
diff --git a/src/lib/engines/common/evas_blend_private.h b/src/lib/engines/common/evas_blend_private.h
new file mode 100644 (file)
index 0000000..84513d1
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_BLEND_PRIVATE_H
+#define _EVAS_BLEND_PRIVATE_H
+
+
+RGBA_Gfx_Compositor *evas_common_gfx_compositor_blend_get                (void);
+RGBA_Gfx_Compositor *evas_common_gfx_compositor_blend_rel_get            (void);
+RGBA_Gfx_Compositor *evas_common_gfx_compositor_copy_get                 (void);
+RGBA_Gfx_Compositor *evas_common_gfx_compositor_copy_rel_get             (void);
+RGBA_Gfx_Compositor *evas_common_gfx_compositor_add_get                  (void);
+RGBA_Gfx_Compositor *evas_common_gfx_compositor_add_rel_get              (void);
+/*
+RGBA_Gfx_Compositor *evas_common_gfx_compositor_sub_get(void);
+RGBA_Gfx_Compositor *evas_common_gfx_compositor_sub_rel_get(void);
+*/
+RGBA_Gfx_Compositor *evas_common_gfx_compositor_mask_get                 (void);
+RGBA_Gfx_Compositor *evas_common_gfx_compositor_mul_get                  (void);
+
+RGBA_Gfx_Func        evas_common_gfx_func_composite_pixel_span_get       (RGBA_Image *src, RGBA_Image *dst, int pixels, int op);
+RGBA_Gfx_Func        evas_common_gfx_func_composite_color_span_get       (DATA32 col, RGBA_Image *dst, int pixels, int op);
+RGBA_Gfx_Func        evas_common_gfx_func_composite_pixel_color_span_get (RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels, int op);
+RGBA_Gfx_Func        evas_common_gfx_func_composite_mask_color_span_get  (DATA32 col, RGBA_Image *dst, int pixels, int op);
+RGBA_Gfx_Func        evas_common_gfx_func_composite_pixel_mask_span_get  (RGBA_Image *src, RGBA_Image *dst, int pixels, int op);
+
+RGBA_Gfx_Pt_Func     evas_common_gfx_func_composite_pixel_pt_get         (Image_Entry_Flags src_flags, RGBA_Image *dst, int op);
+RGBA_Gfx_Pt_Func     evas_common_gfx_func_composite_color_pt_get         (DATA32 col, RGBA_Image *dst, int op);
+RGBA_Gfx_Pt_Func     evas_common_gfx_func_composite_pixel_color_pt_get   (Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst, int op);
+RGBA_Gfx_Pt_Func     evas_common_gfx_func_composite_mask_color_pt_get    (DATA32 col, RGBA_Image *dst, int op);
+RGBA_Gfx_Pt_Func     evas_common_gfx_func_composite_pixel_mask_pt_get    (Image_Entry_Flags src_flags, RGBA_Image *dst, int op);
+
+
+#endif /* _EVAS_BLEND_PRIVATE_H */
diff --git a/src/lib/engines/common/evas_blit_main.c b/src/lib/engines/common/evas_blit_main.c
new file mode 100644 (file)
index 0000000..4630df2
--- /dev/null
@@ -0,0 +1,490 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+
+#if defined BUILD_MMX || defined BUILD_SSE
+#include "evas_mmx.h"
+#endif
+
+#define ALIGN_FIX
+
+static void evas_common_copy_pixels_c        (DATA32 *src, DATA32 *dst, int len);
+static void evas_common_copy_pixels_mmx      (DATA32 *src, DATA32 *dst, int len);
+static void evas_common_copy_pixels_mmx2     (DATA32 *src, DATA32 *dst, int len);
+static void evas_common_copy_pixels_sse/*NB*/ (DATA32 *src, DATA32 *dst, int len);
+
+static void evas_common_copy_pixels_rev_c           (DATA32 *src, DATA32 *dst, int len);
+static void evas_common_copy_pixels_rev_mmx         (DATA32 *src, DATA32 *dst, int len);
+static void evas_common_copy_pixels_rev_sse/*NB*/ (DATA32 *src, DATA32 *dst, int len);
+
+static void evas_common_copy_rev_pixels_c           (DATA32 *src, DATA32 *dst, int len);
+
+
+EAPI void
+evas_common_blit_init(void)
+{
+}
+
+EAPI void
+evas_common_blit_rectangle(const RGBA_Image *src, RGBA_Image *dst, int src_x, int src_y, int w, int h, int dst_x, int dst_y)
+{
+   int y;
+   Gfx_Func_Copy func;
+   DATA32 *src_ptr, *dst_ptr;
+
+   /* clip clip clip */
+   if (w <= 0) return;
+   if (src_x + w > src->cache_entry.w) w = src->cache_entry.w - src_x;
+   if (w <= 0) return;
+   if (src_x < 0)
+     {
+       dst_x -= src_x;
+       w += src_x;
+       src_x = 0;
+     }
+   if (w <= 0) return;
+
+   if (h <= 0) return;
+   if (src_y + h > src->cache_entry.h) h = src->cache_entry.h - src_y;
+   if (h <= 0) return;
+   if (src_y < 0)
+     {
+       dst_y -= src_y;
+       h += src_y;
+       src_y = 0;
+     }
+   if (h <= 0) return;
+
+   if (w <= 0) return;
+   if (dst_x + w > dst->cache_entry.w) w = dst->cache_entry.w - dst_x;
+   if (w <= 0) return;
+   if (dst_x < 0)
+     {
+       src_x -= dst_x;
+       w += dst_x;
+       dst_x = 0;
+     }
+   if (w <= 0) return;
+
+   if (h <= 0) return;
+   if (dst_y + h > dst->cache_entry.h) h = dst->cache_entry.h - dst_y;
+   if (h <= 0) return;
+   if (dst_y < 0)
+     {
+       src_y -= dst_y;
+       h += dst_y;
+       dst_y = 0;
+     }
+   if (h <= 0) return;
+
+   if (dst == src)
+     {
+       /* src after dst - go forward */
+       if (((src_y * src->cache_entry.w) + src_x) > ((dst_y * dst->cache_entry.w) + dst_x))
+         {
+            func = evas_common_draw_func_copy_get(w, 0);
+            for (y = 0; y < h; y++)
+              {
+                 src_ptr = src->image.data + ((y + src_y) * src->cache_entry.w) + src_x;
+                 dst_ptr = dst->image.data + ((y + dst_y) * dst->cache_entry.w) + dst_x;
+                 func(src_ptr, dst_ptr, w);
+              }
+         }
+       /* reverse */
+       else
+         {
+            func = evas_common_draw_func_copy_get(w, 1);
+            for (y = h - 1; y >= 0; y--)
+              {
+                 src_ptr = src->image.data + ((y + src_y) * src->cache_entry.w) + src_x;
+                 dst_ptr = dst->image.data + ((y + dst_y) * dst->cache_entry.w) + dst_x;
+                 func(src_ptr, dst_ptr, w);
+              }
+         }
+     }
+   else
+     {
+       func = evas_common_draw_func_copy_get(w, 0);
+       for (y = 0; y < h; y++)
+         {
+            src_ptr = src->image.data + ((y + src_y) * src->cache_entry.w) + src_x;
+            dst_ptr = dst->image.data + ((y + dst_y) * dst->cache_entry.w) + dst_x;
+            func(src_ptr, dst_ptr, w);
+         }
+     }
+}
+
+
+/****************************************************************************/
+
+static void
+evas_common_copy_rev_pixels_c(DATA32 *src, DATA32 *dst, int len)
+{
+   DATA32 *dst_end = dst + len;
+
+   src += len - 1;
+   while (dst < dst_end)
+       *dst++ = *src--;
+}
+
+#ifdef BUILD_C
+static void
+evas_common_copy_pixels_c(DATA32 *src, DATA32 *dst, int len)
+{
+   DATA32 *dst_end = dst + len;
+
+   while (dst < dst_end)
+       *dst++ = *src++;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+evas_common_copy_pixels_mmx(DATA32 *src, DATA32 *dst, int len)
+{
+   DATA32 *dst_end, *dst_end_pre;
+#ifdef ALIGN_FIX
+   intptr_t src_align;
+   intptr_t dst_align;
+
+   src_align = (intptr_t)src & 0x3f; /* 64 byte alignment */
+   dst_align = (intptr_t)dst & 0x3f; /* 64 byte alignment */
+
+   if ((src_align != dst_align) ||
+       ((src_align & 0x3) != 0))
+     {
+#ifdef BUILD_C
+       evas_common_copy_pixels_c(src, dst, len);
+       return;
+     }
+#endif
+
+   while ((src_align > 0) && (len > 0))
+     {
+       *dst++ = *src++;
+       len--;
+       src_align -= sizeof(DATA32);
+     }
+#endif /* ALIGN_FIX */
+
+   dst_end = dst + len;
+   dst_end_pre = dst + ((len / 16) * 16);
+
+   while (dst < dst_end_pre)
+     {
+       MOVE_16DWORDS_MMX(src, dst);
+       src += 16;
+       dst += 16;
+     }
+   while (dst < dst_end)
+       *dst++ = *src++;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+evas_common_copy_pixels_mmx2(DATA32 *src, DATA32 *dst, int len)
+{
+   DATA32 *dst_end, *dst_end_pre;
+#ifdef ALIGN_FIX
+   intptr_t src_align;
+   intptr_t dst_align;
+
+   src_align = (intptr_t)src & 0x3f; /* 64 byte alignment */
+   dst_align = (intptr_t)dst & 0x3f; /* 64 byte alignment */
+
+   if ((src_align != dst_align) ||
+       ((src_align & 0x3) != 0))
+     {
+#ifdef BUILD_C
+       evas_common_copy_pixels_c(src, dst, len);
+#endif
+       return;
+     }
+
+   while ((src_align > 0) && (len > 0))
+     {
+       *dst++ = *src++;
+       len--;
+       src_align -= sizeof(DATA32);
+     }
+#endif
+
+   dst_end = dst + len;
+   dst_end_pre = dst + ((len / 16) * 16);
+
+   while (dst < dst_end_pre)
+     {
+       MOVE_16DWORDS_MMX(src, dst);
+       src += 16;
+       dst += 16;
+     }
+   while (dst < dst_end)
+       *dst++ = *src++;
+}
+#endif
+
+#ifdef BUILD_SSE
+static void
+evas_common_copy_pixels_sse(DATA32 *src, DATA32 *dst, int len)
+{
+   DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
+
+   dst_end_ptr = dst + len;
+   dst_end_ptr -= 15;
+   src_ptr = src;
+   dst_ptr = dst;
+   while (dst_ptr < dst_end_ptr)
+     {
+       MOVE_16DWORDS_MMX2(src_ptr, dst_ptr);
+       src_ptr+=16;
+       dst_ptr+=16;
+     }
+   dst_end_ptr = dst + len;
+   while (dst_ptr < dst_end_ptr)
+     {
+       *dst_ptr = *src_ptr;
+       src_ptr++;
+       dst_ptr++;
+     }
+#if 0
+#ifdef ALIGN_FIX
+   int src_align;
+   int dst_align;
+
+   src_align = (int)src & 0x3f; /* 64 byte alignment */
+   dst_align = (int)dst & 0x3f; /* 64 byte alignment */
+
+   if ((src_align != dst_align) ||
+       ((src_align & 0x3) != 0))
+     {
+#ifdef BUILD_C
+       evas_common_copy_pixels_c(src, dst, len);
+#endif
+       return;
+     }
+
+   while ((src_align > 0) && (len > 0))
+     {
+       *dst = *src;
+       dst++;
+       src++;
+       len--;
+       src_align -= sizeof(DATA32);
+     }
+#endif /* ALIGN_FIX */
+
+   src_ptr = src;
+   dst_ptr = dst;
+   dst_end_ptr = dst + len;
+   dst_end_ptr_pre = dst + ((len / 16) * 16);
+
+   while (dst_ptr < dst_end_ptr_pre)
+     {
+       prefetch(&src_ptr[16]);
+       MOVE_16DWORDS_MMX(src_ptr, dst_ptr);
+       src_ptr+=16;
+       dst_ptr+=16;
+     }
+   while (dst_ptr < dst_end_ptr)
+     {
+       *dst_ptr = *src_ptr;
+       src_ptr++;
+       dst_ptr++;
+     }
+#endif
+}
+#endif
+
+/****************************************************************************/
+
+#ifdef BUILD_C
+static void
+evas_common_copy_pixels_rev_c(DATA32 *src, DATA32 *dst, int len)
+{
+   DATA32 *dst_end;
+
+   src = src + len - 1;
+   dst_end = dst - 1;
+   dst = dst + len - 1;
+
+   while (dst > dst_end)
+       *dst-- = *src--;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+evas_common_copy_pixels_rev_mmx(DATA32 *src, DATA32 *dst, int len)
+{
+   DATA32 *dst_end, *dst_end_pre;
+
+   if (len >= 16)
+     {
+       src = src + len - 16;
+       dst_end = dst;
+       dst_end_pre = dst + len - ((len / 16) * 16);
+       dst = dst + len - 16;
+
+       while (dst >= dst_end_pre)
+         {
+            MOVE_16DWORDS_MMX(src, dst);
+            src -= 16;
+            dst -= 16;
+         }
+       src += 15;
+       dst += 15;
+       while (dst >= dst_end)
+            *dst-- = *src--;
+     }
+   else
+     {
+       src = src + len - 1;
+       dst_end = dst - 1;
+       dst = dst + len - 1;
+       while (dst > dst_end)
+            *dst-- = *src--;
+     }
+}
+#endif
+
+#ifdef BUILD_SSE
+static void
+evas_common_copy_pixels_rev_sse(DATA32 *src, DATA32 *dst, int len)
+{
+   DATA32 *src_ptr, *dst_ptr, *dst_end_ptr, *dst_end_ptr_pre;
+
+   src_ptr = src + len - 16;
+   dst_ptr = dst + len - 16;
+   dst_end_ptr = dst;
+   dst_end_ptr_pre = dst + len - ((len / 16) * 16);
+
+   if (len >= 16)
+     {
+       while (dst_ptr >= dst_end_ptr_pre)
+         {
+            prefetch(&src_ptr[-16]);
+            MOVE_10DWORDS_MMX(src_ptr, dst_ptr);
+            src_ptr -= 16;
+            dst_ptr -= 16;
+         }
+       src_ptr += 15;
+       dst_ptr += 15;
+       while (dst_ptr >= dst_end_ptr)
+         {
+            *dst_ptr = *src_ptr;
+            src_ptr--;
+            dst_ptr--;
+         }
+     }
+   else
+     {
+       src_ptr = src + len - 1;
+       dst_ptr = dst + len - 1;
+       while (dst_ptr >= dst_end_ptr)
+         {
+            *dst_ptr = *src_ptr;
+            src_ptr--;
+            dst_ptr--;
+         }
+     }
+}
+#endif
+
+
+Gfx_Func_Copy
+evas_common_draw_func_copy_get(int pixels, int reverse)
+{
+   if (reverse == -1)
+       return evas_common_copy_rev_pixels_c;
+   if (reverse)
+     {
+#ifdef  BUILD_SSE
+       if (evas_common_cpu_has_feature(CPU_FEATURE_SSE) && (pixels > 256 * 256))
+         return evas_common_copy_pixels_rev_sse;
+#endif
+#ifdef BUILD_MMX
+# ifdef BUILD_SSE
+       else
+# endif
+         if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+           return evas_common_copy_pixels_rev_mmx;
+#endif
+#ifdef BUILD_C
+# ifdef BUILD_MMX
+       else
+# endif
+         return evas_common_copy_pixels_rev_c;
+#endif
+     }
+   else
+     {
+#if 1
+
+# ifdef BUILD_MMX
+# ifdef BUILD_C
+            if (evas_common_cpu_has_feature(CPU_FEATURE_MMX2))
+# endif
+              return evas_common_copy_pixels_mmx2;
+# ifdef BUILD_SSE
+            else
+# endif
+#endif
+#ifdef BUILD_SSE
+# ifdef BUILD_C
+              if (evas_common_cpu_has_feature(CPU_FEATURE_SSE) && (pixels > 64 * 64))
+# endif
+                return evas_common_copy_pixels_sse;
+# ifdef BUILD_MMX
+            else
+# endif
+#endif
+#ifdef BUILD_MMX
+# ifdef BUILD_C
+              if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+# endif
+                return evas_common_copy_pixels_mmx;
+# ifdef BUILD_C
+            else
+# endif
+#endif
+#ifdef BUILD_C
+              return evas_common_copy_pixels_c;
+#endif
+
+#else
+
+# ifdef BUILD_SSE
+            if (evas_common_cpu_has_feature(CPU_FEATURE_SSE) && (pixels > 256 * 256))
+              return evas_common_copy_pixels_sse;
+# ifdef BUILD_MMX
+            else
+# endif
+#endif
+#ifdef BUILD_MMX
+# ifdef BUILD_C
+              if (evas_common_cpu_has_feature(CPU_FEATURE_MMX2))
+# endif
+                return evas_common_copy_pixels_mmx2;
+# ifdef BUILD_C
+              else if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+# endif
+                return evas_common_copy_pixels_mmx;
+# ifdef BUILD_C
+            else
+# endif
+#endif
+#ifdef BUILD_C
+              return evas_common_copy_pixels_c;
+#endif
+
+#endif
+     }
+#ifdef BUILD_C
+   return evas_common_copy_pixels_c;
+#else
+   return NULL;
+#endif
+}
diff --git a/src/lib/engines/common/evas_convert_color.c b/src/lib/engines/common/evas_convert_color.c
new file mode 100644 (file)
index 0000000..5b16eac
--- /dev/null
@@ -0,0 +1,250 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_convert_color.h"
+
+
+EAPI DATA32
+evas_common_convert_argb_premul(DATA32 *data, unsigned int len)
+{
+   DATA32 *de = data + len;
+   DATA32 nas = 0;
+
+   while (data < de)
+     {
+       DATA32  a = 1 + (*data >> 24);
+
+       *data = (*data & 0xff000000) +
+         (((((*data) >> 8) & 0xff) * a) & 0xff00) +
+         (((((*data) & 0x00ff00ff) * a) >> 8) & 0x00ff00ff);
+       data++;
+
+       if ((a == 1) || (a == 256))
+         nas++;
+     }
+
+   return nas;
+}
+
+EAPI void
+evas_common_convert_argb_unpremul(DATA32 *data, unsigned int len)
+{
+   DATA32  *de = data + len;
+
+   while (data < de)
+     {
+       DATA32  a = (*data >> 24);
+
+       if ((a > 0) && (a < 255))
+          *data = ARGB_JOIN(a,
+                            (R_VAL(data) * 255) / a,
+                            (G_VAL(data) * 255) / a,
+                            (B_VAL(data) * 255) / a);
+       data++;
+     }
+
+}
+
+EAPI void
+evas_common_convert_color_argb_premul(int a, int *r, int *g, int *b)
+{
+   a++;
+   if (r) { *r = (a * *r) >> 8; }
+   if (g) { *g = (a * *g) >> 8; }
+   if (b) { *b = (a * *b) >> 8; }
+}
+
+EAPI void
+evas_common_convert_color_argb_unpremul(int a, int *r, int *g, int *b)
+{
+   if (!a) return;
+   if (r) { *r = (255 * *r) / a; }
+   if (g) { *g = (255 * *g) / a; }
+   if (b) { *b = (255 * *b) / a; }
+}
+
+EAPI void
+evas_common_convert_color_hsv_to_rgb(float h, float s, float v, int *r, int *g, int *b)
+{
+   int i;
+   float f;
+
+   v *= 255;
+   if (s == 0)
+     {
+       if (r) *r = v;
+       if (g) *g = v;
+       if (b) *b = v;
+       return;
+     }
+
+   h /= 60;
+   i = h;
+   f = h - i;
+
+   s *= v;
+   f *= s;
+   s = v - s;
+
+   switch (i)
+     {
+       case 1:
+         if (r) *r = v - f;  if (g) *g = v;  if (b) *b = s;
+         return;
+       case 2:
+         if (r) *r = s;  if (g) *g = v;  if (b) *b = s + f;
+         return;
+       case 3:
+         if (r) *r = s;  if (g) *g = v - f;  if (b) *b = v;
+         return;
+       case 4:
+         if (r) *r = s + f;  if (g) *g = s;  if (b) *b = v;
+         return;
+       case 5:
+         if (r) *r = v;  if (g) *g = s;  if (b) *b = v - f;
+         return;
+       default:
+         if (r) *r = v;  if (g) *g = s + f;  if (b) *b = s;
+         break;
+     }
+}
+
+EAPI void
+evas_common_convert_color_rgb_to_hsv(int r, int g, int b, float *h, float *s, float *v)
+{
+   int max, min, d = r - g;
+
+   //set min to MIN(g,r)
+   d = (d & (~(d >> 8)));
+   min = r - d;
+   //set max to MAX(g,r)
+   max = g + d;
+
+   //set min to MIN(b,min)
+   d = min - b;
+   min -= (d & (~(d >> 8)));
+
+   //set max to MAX(max,b)
+   d = b - max;
+   max += (d & (~(d >> 8)));
+
+   d = max - min;
+
+   if (v) *v = (max / 255.0);
+   if (!max || !d)
+     {
+       if (s) *s = 0;
+        if (h) *h = 0;
+       return;
+     }
+
+   if (s) *s = (d / (float)max);
+   if (r == max)
+     {
+       if (h)
+         {
+           *h = 60 * ((g - b) / (float)d);
+           if (*h < 0) *h += 360;
+         }
+       return;
+     }
+   if (g == max)
+     {
+       if (h)
+         {
+           *h = 120 + (60 * ((b - r) / (float)d));
+           if (*h < 0) *h += 360;
+         }
+       return;
+     }
+   if (h)
+     {
+       *h = 240 + (60 * ((r - g) / (float)d));
+       if (*h < 0) *h += 360;
+     }
+}
+
+EAPI void
+evas_common_convert_color_hsv_to_rgb_int(int h, int s, int v, int *r, int *g, int *b)
+{
+   int   i, f;
+
+   if (!s)
+     {
+       *r = *g = *b = v;
+       return;
+     }
+
+   i = h / 255;
+   f = h - (i * 255);
+   s = (v * s) / 255;
+   f = (s * f) / 255;
+   s = v - s;
+
+   switch (i)
+     {
+       case 1:
+         *r = v - f; *g = v; *b = s;
+         return;
+       case 2:
+         *r = s; *g = v; *b = s + f;
+         return;
+       case 3:
+         *r = s; *g = v - f; *b = v;
+         return;
+       case 4:
+         *r = s + f; *g = s; *b = v;
+         return;
+       case 5:
+         *r = v; *g = s; *b = v - f;
+         return;
+       default:
+         *r = v; *g = s + f; *b = s;
+         break;
+     }
+}
+
+EAPI void
+evas_common_convert_color_rgb_to_hsv_int(int r, int g, int b, int *h, int *s, int *v)
+{
+   int  min, max, d = r - g;
+
+   d = (d & (~(d >> 8)));
+   min = r - d;
+   max = g + d;
+
+   d = min - b;
+   min -= (d & (~(d >> 8)));
+
+   d = b - max;
+   max += (d & (~(d >> 8)));
+
+   d = max - min;
+
+   *v = max;
+   if (!max)
+     {
+       *s = *h = 0;
+       return;
+     }
+
+   *s = ((d * 255) / max);
+
+   if (r == max)
+     {
+       *h = (((g - b) * 255) / d);
+       if (*h < 0) *h += 1530;
+       return;
+     }
+   if (g == max)
+     {
+       *h = 510 + (((b - r) * 255) / d);
+       if (*h < 0) *h += 1530;
+       return;
+     }
+   *h = 1020 + (((r - g) * 255) / d);
+   if (*h < 0) *h += 1530;
+
+}
diff --git a/src/lib/engines/common/evas_convert_color.h b/src/lib/engines/common/evas_convert_color.h
new file mode 100644 (file)
index 0000000..a95bef8
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_CONVERT_COLOR_H
+#define _EVAS_CONVERT_COLOR_H
+
+
+EAPI DATA32 evas_common_convert_argb_premul                        (DATA32 *src, unsigned int len);
+EAPI void evas_common_convert_argb_unpremul                        (DATA32 *src, unsigned int len);
+EAPI void evas_common_convert_color_argb_premul                    (int a, int *r, int *g, int *b);
+EAPI void evas_common_convert_color_argb_unpremul                  (int a, int *r, int *g, int *b);
+
+EAPI void evas_common_convert_color_hsv_to_rgb                     (float h, float s, float v, int *r, int *g, int *b);
+EAPI void evas_common_convert_color_rgb_to_hsv                     (int r, int g, int b, float *h, float *s, float *v);
+EAPI void evas_common_convert_color_hsv_to_rgb_int                 (int h, int s, int v, int *r, int *g, int *b);
+EAPI void evas_common_convert_color_rgb_to_hsv_int                 (int r, int g, int b, int *h, int *s, int *v);
+
+
+#endif /* _EVAS_CONVERT_COLOR_H */
diff --git a/src/lib/engines/common/evas_convert_colorspace.c b/src/lib/engines/common/evas_convert_colorspace.c
new file mode 100644 (file)
index 0000000..1ad9ad7
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_convert_colorspace.h"
+
+#define CONVERT_RGB_565_TO_RGB_888(s) \
+       (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \
+        ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \
+        ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000)))
+
+#define CONVERT_A5P_TO_A8(s) \
+       ((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7))
+
+static inline void *
+evas_common_convert_argb8888_to_rgb565_a5p(void *data __UNUSED__, int w __UNUSED__, int h __UNUSED__, int stride __UNUSED__, Eina_Bool has_alpha __UNUSED__)
+{
+   return NULL;
+}
+
+static inline void *
+evas_common_convert_rgb565_a5p_to_argb8888(void *data, int w, int h, int stride, Eina_Bool has_alpha)
+{
+   DATA16 *src, *end;
+   DATA32 *ret, *dst;
+
+   src = data;
+   end = src + (stride * h);
+   ret = malloc(w * h * sizeof(DATA32));
+
+   dst = ret;
+   if (has_alpha)
+     {
+       DATA8 *alpha;
+
+       alpha = (DATA8 *)end;
+       for (; src < end; src++, alpha++, dst++)
+         *dst = (CONVERT_A5P_TO_A8(*alpha) << 24) |
+                 CONVERT_RGB_565_TO_RGB_888(*src);
+     }
+   else
+     {
+       for (; src < end; src++, dst++)
+         *dst = CONVERT_RGB_565_TO_RGB_888(*src);
+     }
+   return ret;
+}
+
+EAPI void *
+evas_common_convert_argb8888_to(void *data, int w, int h, int stride, Eina_Bool has_alpha, Evas_Colorspace cspace)
+{
+   switch (cspace)
+     {
+       case EVAS_COLORSPACE_RGB565_A5P:
+         return evas_common_convert_argb8888_to_rgb565_a5p(data, w, h, stride, has_alpha);
+       default:
+         break;
+     }
+   return NULL;
+}
+
+EAPI void *
+evas_common_convert_rgb565_a5p_to(void *data, int w, int h, int stride, Eina_Bool has_alpha, Evas_Colorspace cspace)
+{
+   switch (cspace)
+     {
+       case EVAS_COLORSPACE_ARGB8888:
+         return evas_common_convert_rgb565_a5p_to_argb8888(data, w, h, stride, has_alpha);
+       default:
+         break;
+     }
+   return NULL;
+}
diff --git a/src/lib/engines/common/evas_convert_colorspace.h b/src/lib/engines/common/evas_convert_colorspace.h
new file mode 100644 (file)
index 0000000..d82a5d9
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_CONVERT_COLORSPACE_H
+#define _EVAS_CONVERT_COLORSPACE_H
+
+
+EAPI void *evas_common_convert_argb8888_to                         (void *data, int w, int h, int stride, Eina_Bool has_alpha, Evas_Colorspace cspace);
+EAPI void *evas_common_convert_rgb565_a5p_to                       (void *data, int w, int h, int stride, Eina_Bool has_alpha, Evas_Colorspace cspace);
+
+
+#endif /* _EVAS_CONVERT_COLORSPACE_H */
diff --git a/src/lib/engines/common/evas_convert_gry_1.c b/src/lib/engines/common/evas_convert_gry_1.c
new file mode 100644 (file)
index 0000000..3f9b5f2
--- /dev/null
@@ -0,0 +1,10 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_convert_gry_1.h"
+
+#ifdef BUILD_CONVERT_1_GRY_1
+void evas_common_convert_rgba_to_1bpp_gry_1_dith       (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal){}
+#endif
diff --git a/src/lib/engines/common/evas_convert_gry_1.h b/src/lib/engines/common/evas_convert_gry_1.h
new file mode 100644 (file)
index 0000000..81c99f6
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_CONVERT_GRY_1_H
+#define _EVAS_CONVERT_GRY_1_H
+
+
+void evas_common_convert_rgba_to_1bpp_gry_1_dith               (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+
+
+
+#endif /* _EVAS_CONVERT_GRY_1_H */
diff --git a/src/lib/engines/common/evas_convert_gry_4.c b/src/lib/engines/common/evas_convert_gry_4.c
new file mode 100644 (file)
index 0000000..a633f28
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_convert_gry_4.h"
+
+#ifdef BUILD_CONVERT_4_GRY_4
+void evas_common_convert_rgba_to_4bpp_gry_4_dith       (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal){}
+#endif
+
+#ifdef BUILD_CONVERT_4_GRY_1
+void evas_common_convert_rgba_to_4bpp_gry_1_dith       (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal){}
+#endif
diff --git a/src/lib/engines/common/evas_convert_gry_4.h b/src/lib/engines/common/evas_convert_gry_4.h
new file mode 100644 (file)
index 0000000..fc7b0a7
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_CONVERT_GRY_4_H
+#define _EVAS_CONVERT_GRY_4_H
+
+
+void evas_common_convert_rgba_to_4bpp_gry_4_dith               (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_4bpp_gry_1_dith               (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+
+
+#endif /* _EVAS_CONVERT_GRY_4_H */
diff --git a/src/lib/engines/common/evas_convert_gry_8.c b/src/lib/engines/common/evas_convert_gry_8.c
new file mode 100644 (file)
index 0000000..0824351
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_convert_gry_8.h"
+
+#ifdef USE_DITHER_44
+extern const DATA8 _evas_dither_44[4][4];
+#endif
+#ifdef USE_DITHER_128128
+extern const DATA8 _evas_dither_128128[128][128];
+#endif
+
+#ifdef BUILD_CONVERT_8_GRY_1
+void evas_common_convert_rgba_to_8bpp_gry_256_dith     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+   DATA32 gry8;
+
+   dst_ptr = (DATA8 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   r = (R_VAL(src_ptr));
+   g = (G_VAL(src_ptr));
+   b = (B_VAL(src_ptr));
+
+   // Y = 0.299 * R + 0.587 * G + 0.114 * B;
+   gry8 = ((r * 19595) + (g * 38469) + (b * 7471)) >> 16;
+
+   *dst_ptr = gry8;
+
+   CONVERT_LOOP_END_ROT_0();
+}
+#endif
+
+#ifdef BUILD_CONVERT_8_GRY_4
+void evas_common_convert_rgba_to_8bpp_gry_64_dith      (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal){}
+#endif
+
+#ifdef BUILD_CONVERT_8_GRY_16
+void evas_common_convert_rgba_to_8bpp_gry_16_dith      (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+   DATA32 gry8;
+   DATA8 dith;
+
+   dst_ptr = (DATA8 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+
+   r = (R_VAL(src_ptr));
+   g = (G_VAL(src_ptr));
+   b = (B_VAL(src_ptr));
+
+   // Y = 0.299 * R + 0.587 * G + 0.114 * B;
+   gry8 = ((r * 19595) + (g * 38469) + (b * 7471)) >> 16;
+
+   if (((gry8 - gry8 * 255 / 4) >= dith) && (gry8 < 0x07)) gry8++;
+
+   *dst_ptr = gry8;
+
+   CONVERT_LOOP_END_ROT_0();
+}
+#endif
+
+#ifdef BUILD_CONVERT_8_GRY_64
+void evas_common_convert_rgba_to_8bpp_gry_4_dith       (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal){}
+#endif
+
+#ifdef BUILD_CONVERT_8_GRY_256
+void evas_common_convert_rgba_to_8bpp_gry_1_dith       (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal){}
+#endif
diff --git a/src/lib/engines/common/evas_convert_gry_8.h b/src/lib/engines/common/evas_convert_gry_8.h
new file mode 100644 (file)
index 0000000..9e393cb
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_CONVERT_GRY_8_H
+#define _EVAS_CONVERT_GRY_8_H
+
+
+void evas_common_convert_rgba_to_8bpp_gry_256_dith             (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_8bpp_gry_64_dith              (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_8bpp_gry_16_dith              (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_8bpp_gry_4_dith               (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_8bpp_gry_1_dith               (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+
+
+#endif /* _EVAS_CONVERT_GRY_8_H */
diff --git a/src/lib/engines/common/evas_convert_grypal_6.c b/src/lib/engines/common/evas_convert_grypal_6.c
new file mode 100644 (file)
index 0000000..8f8bb46
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_convert_grypal_6.h"
+
+#ifdef BUILD_CONVERT_8_GRAYSCALE_64
+void evas_common_convert_rgba_to_8bpp_pal_gray64(DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal)
+{
+    DATA32 *src_ptr;
+    DATA8 *dst_ptr;
+    int x, y;
+    DATA8 Y;
+
+    dst_ptr = dst;
+    CONVERT_LOOP_START_ROT_0();
+
+    /* RGB -> YUV conversion */
+    Y = ((R_VAL(src_ptr) * 76) + 
+         (G_VAL(src_ptr) * 151) + 
+         (B_VAL(src_ptr) * 29)) >> 10;
+    *dst_ptr = pal[Y];
+
+    CONVERT_LOOP_END_ROT_0();
+}
+#endif
diff --git a/src/lib/engines/common/evas_convert_grypal_6.h b/src/lib/engines/common/evas_convert_grypal_6.h
new file mode 100644 (file)
index 0000000..38ccda8
--- /dev/null
@@ -0,0 +1,10 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_CONVERT_GRY_4_H
+#define _EVAS_CONVERT_GRY_4_H
+
+void evas_common_convert_rgba_to_8bpp_pal_gray64               (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+
+#endif /* _EVAS_CONVERT_GRY_4_H */
diff --git a/src/lib/engines/common/evas_convert_main.c b/src/lib/engines/common/evas_convert_main.c
new file mode 100644 (file)
index 0000000..b364651
--- /dev/null
@@ -0,0 +1,650 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_convert_rgb_8.h"
+#include "evas_convert_rgb_16.h"
+#include "evas_convert_rgb_24.h"
+#include "evas_convert_rgb_32.h"
+#include "evas_convert_grypal_6.h"
+#include "evas_convert_gry_8.h"
+#include "evas_convert_yuv.h"
+
+#ifdef USE_DITHER_44
+
+const DATA8 _evas_dither_44[4][4] =
+{
+     { 0,  8,  2, 10},
+     {12,  4, 14,  6},
+     { 3, 11,  1,  9},
+     {15,  7, 13,  5}
+};
+
+#endif
+
+#ifdef USE_DITHER_128128
+
+const DATA8 _evas_dither_128128[128][128] =
+{
+     { 0, 41, 23, 5, 17, 39, 7, 15, 62, 23, 40, 51, 31, 47, 9, 32, 52, 27, 57, 25, 6, 61, 27, 52, 37, 7, 40, 63, 18, 36, 10, 42, 25, 62, 45, 34, 20, 42, 37, 14, 35, 29, 50, 10, 61, 2, 40, 8, 37, 12, 58, 22, 5, 41, 10, 39, 0, 60, 11, 46, 2, 55, 38, 17, 36, 59, 13, 54, 37, 56, 8, 29, 16, 13, 63, 22, 41, 55, 7, 20, 49, 14, 23, 55, 37, 23, 19, 36, 15, 49, 23, 63, 30, 14, 38, 27, 53, 13, 22, 41, 19, 31, 7, 19, 50, 30, 49, 16, 3, 32, 56, 40, 29, 34, 8, 48, 19, 45, 4, 51, 12, 46, 35, 49, 16, 42, 12, 62 },
+     { 30, 57, 36, 54, 47, 34, 52, 27, 43, 4, 28, 7, 17, 36, 62, 13, 44, 7, 18, 48, 33, 21, 44, 14, 30, 47, 12, 33, 5, 55, 31, 58, 13, 30, 4, 17, 52, 10, 60, 26, 46, 0, 39, 27, 42, 22, 47, 25, 60, 32, 9, 38, 48, 17, 59, 30, 49, 18, 34, 25, 51, 19, 5, 48, 21, 8, 28, 46, 1, 32, 41, 19, 54, 47, 37, 18, 28, 11, 44, 30, 39, 56, 2, 33, 8, 42, 61, 28, 58, 8, 46, 9, 41, 4, 58, 7, 21, 48, 59, 10, 52, 14, 42, 57, 12, 25, 7, 53, 42, 24, 11, 50, 17, 59, 42, 2, 36, 60, 32, 17, 63, 29, 21, 7, 59, 32, 24, 39 },
+     { 22, 8, 16, 32, 3, 25, 13, 57, 18, 45, 58, 39, 55, 20, 5, 42, 23, 34, 63, 1, 51, 10, 58, 4, 60, 23, 53, 27, 44, 21, 3, 48, 8, 50, 43, 54, 27, 32, 5, 55, 21, 58, 12, 53, 6, 36, 14, 50, 17, 29, 53, 15, 24, 52, 7, 36, 13, 42, 4, 53, 9, 35, 61, 26, 56, 32, 49, 15, 62, 23, 6, 60, 2, 31, 4, 48, 58, 38, 15, 61, 5, 25, 47, 28, 50, 15, 7, 40, 3, 32, 33, 52, 25, 50, 35, 42, 61, 3, 28, 36, 23, 63, 4, 33, 46, 62, 36, 23, 60, 6, 54, 28, 4, 37, 23, 55, 25, 8, 42, 54, 14, 6, 56, 38, 19, 52, 4, 46 },
+     { 48, 53, 43, 12, 45, 63, 30, 37, 9, 34, 21, 1, 25, 47, 29, 58, 3, 54, 15, 39, 29, 17, 38, 35, 20, 43, 1, 49, 15, 59, 29, 39, 22, 35, 16, 23, 1, 47, 39, 18, 8, 44, 25, 31, 57, 19, 63, 4, 45, 3, 42, 61, 1, 31, 45, 20, 57, 29, 62, 21, 32, 41, 14, 44, 3, 39, 5, 34, 10, 43, 51, 35, 23, 52, 40, 10, 21, 1, 53, 18, 51, 43, 12, 62, 18, 54, 26, 51, 20, 57, 14, 1, 62, 16, 11, 18, 32, 39, 17, 44, 1, 48, 26, 37, 18, 2, 51, 14, 28, 45, 35, 18, 57, 13, 47, 11, 51, 20, 2, 39, 31, 47, 25, 1, 50, 11, 60, 7 },
+     { 18, 28, 1, 56, 21, 10, 51, 2, 46, 54, 14, 61, 11, 50, 13, 38, 19, 31, 45, 9, 55, 24, 47, 5, 54, 9, 62, 11, 35, 8, 51, 14, 57, 6, 63, 40, 58, 14, 51, 28, 62, 34, 15, 48, 1, 41, 30, 35, 55, 21, 34, 11, 49, 37, 8, 52, 4, 23, 15, 43, 1, 58, 11, 23, 53, 16, 55, 26, 58, 18, 27, 12, 45, 14, 25, 63, 42, 33, 27, 35, 9, 31, 21, 38, 1, 44, 34, 12, 48, 38, 21, 44, 29, 47, 26, 53, 1, 46, 54, 8, 59, 29, 11, 55, 22, 41, 33, 20, 39, 1, 48, 9, 44, 32, 5, 62, 29, 44, 57, 23, 10, 58, 34, 43, 15, 37, 26, 33 },
+     { 51, 38, 59, 24, 35, 42, 19, 60, 5, 32, 41, 26, 43, 33, 7, 53, 48, 11, 59, 23, 42, 2, 61, 30, 16, 40, 32, 24, 56, 41, 19, 33, 37, 26, 47, 9, 31, 22, 2, 45, 9, 54, 4, 37, 21, 52, 11, 23, 7, 57, 16, 25, 55, 18, 63, 27, 46, 39, 56, 10, 50, 37, 29, 47, 19, 63, 24, 9, 46, 2, 39, 60, 9, 57, 30, 7, 49, 11, 59, 3, 45, 57, 5, 60, 29, 22, 5, 60, 30, 9, 59, 18, 40, 6, 57, 36, 30, 12, 24, 34, 15, 40, 52, 6, 49, 9, 58, 4, 63, 12, 26, 61, 22, 53, 38, 16, 35, 14, 28, 50, 42, 17, 5, 28, 62, 20, 54, 12 },
+     { 26, 6, 31, 15, 49, 6, 38, 27, 22, 49, 16, 56, 2, 62, 30, 21, 0, 36, 28, 6, 49, 32, 13, 52, 26, 50, 19, 46, 3, 26, 62, 0, 53, 12, 29, 3, 53, 41, 60, 24, 38, 13, 58, 16, 43, 9, 59, 39, 46, 28, 44, 40, 2, 33, 13, 41, 16, 6, 47, 31, 26, 17, 57, 6, 38, 0, 42, 36, 29, 52, 20, 31, 48, 0, 34, 56, 20, 36, 23, 54, 14, 41, 24, 37, 10, 55, 46, 25, 16, 45, 36, 4, 55, 23, 15, 8, 50, 62, 5, 56, 44, 20, 13, 28, 59, 31, 24, 47, 31, 52, 37, 17, 40, 0, 26, 49, 3, 60, 7, 33, 0, 61, 53, 40, 8, 45, 2, 41 },
+     { 16, 63, 43, 4, 61, 24, 56, 13, 53, 8, 36, 12, 24, 41, 16, 46, 60, 26, 52, 39, 14, 57, 21, 37, 0, 45, 7, 59, 38, 17, 43, 10, 45, 20, 61, 43, 19, 11, 33, 17, 50, 32, 23, 61, 28, 49, 26, 0, 18, 51, 5, 60, 22, 58, 29, 0, 59, 34, 19, 62, 3, 52, 7, 44, 30, 59, 13, 50, 15, 62, 7, 17, 38, 22, 44, 15, 40, 4, 47, 28, 33, 17, 49, 16, 51, 40, 10, 56, 0, 53, 13, 49, 28, 38, 60, 21, 43, 19, 37, 27, 3, 51, 34, 39, 0, 45, 15, 43, 10, 21, 3, 55, 8, 33, 59, 10, 41, 18, 52, 24, 46, 20, 30, 13, 58, 22, 36, 57 },
+     { 50, 34, 11, 47, 29, 17, 44, 0, 33, 63, 28, 46, 52, 5, 57, 10, 42, 18, 4, 63, 20, 8, 44, 10, 56, 34, 14, 29, 5, 54, 23, 59, 32, 49, 7, 34, 49, 27, 56, 0, 42, 7, 46, 3, 40, 6, 54, 32, 62, 13, 36, 10, 47, 8, 35, 49, 24, 51, 12, 40, 22, 35, 60, 12, 22, 51, 33, 4, 40, 25, 43, 55, 5, 54, 12, 61, 26, 51, 8, 62, 0, 53, 7, 63, 2, 32, 19, 34, 42, 24, 31, 63, 2, 10, 45, 33, 0, 48, 9, 61, 22, 47, 8, 62, 18, 56, 7, 54, 27, 57, 46, 30, 50, 19, 45, 30, 56, 36, 22, 47, 11, 38, 3, 51, 32, 48, 18, 9 },
+     { 0, 21, 40, 19, 52, 9, 37, 48, 20, 40, 3, 18, 27, 38, 35, 22, 31, 56, 13, 35, 46, 28, 60, 40, 27, 18, 61, 50, 41, 30, 7, 36, 2, 25, 16, 57, 5, 15, 47, 29, 55, 19, 30, 52, 15, 34, 20, 12, 43, 30, 20, 54, 25, 44, 53, 12, 38, 5, 55, 27, 48, 15, 33, 27, 45, 8, 19, 28, 56, 11, 33, 49, 18, 36, 29, 2, 45, 16, 39, 19, 31, 43, 27, 35, 20, 52, 26, 6, 61, 11, 41, 17, 29, 51, 20, 56, 25, 32, 41, 17, 53, 31, 25, 14, 42, 23, 35, 16, 38, 6, 34, 12, 15, 62, 6, 21, 13, 1, 63, 9, 55, 27, 43, 25, 14, 4, 31, 55 },
+     { 44, 29, 61, 2, 35, 58, 26, 15, 60, 10, 51, 59, 14, 55, 8, 50, 2, 44, 25, 51, 1, 33, 16, 4, 48, 36, 2, 21, 12, 57, 48, 13, 51, 55, 40, 28, 37, 62, 8, 39, 12, 63, 36, 10, 59, 24, 56, 47, 9, 50, 41, 1, 32, 17, 6, 21, 61, 30, 9, 43, 1, 54, 41, 2, 54, 37, 48, 61, 1, 46, 21, 3, 58, 24, 50, 32, 60, 10, 57, 25, 46, 12, 59, 4, 45, 13, 57, 47, 27, 39, 5, 58, 47, 14, 35, 4, 52, 13, 60, 6, 36, 10, 45, 55, 4, 50, 29, 2, 61, 50, 25, 58, 44, 24, 36, 42, 54, 28, 40, 32, 16, 56, 6, 62, 46, 39, 60, 23 },
+     { 7, 48, 14, 54, 23, 40, 4, 45, 30, 22, 42, 32, 1, 44, 20, 29, 58, 8, 37, 19, 41, 54, 24, 58, 9, 53, 25, 46, 34, 16, 23, 38, 27, 11, 18, 1, 52, 21, 35, 22, 48, 5, 25, 45, 18, 38, 2, 27, 35, 4, 57, 15, 62, 39, 57, 28, 42, 16, 36, 60, 24, 18, 10, 63, 20, 5, 16, 23, 37, 14, 59, 27, 41, 8, 13, 42, 21, 35, 6, 50, 3, 38, 15, 48, 30, 39, 17, 3, 49, 14, 53, 33, 24, 7, 61, 44, 11, 39, 23, 49, 19, 58, 1, 32, 36, 12, 60, 41, 20, 13, 41, 4, 39, 1, 48, 8, 18, 51, 14, 44, 5, 37, 21, 34, 1, 26, 10, 37 },
+     { 53, 36, 27, 9, 50, 12, 32, 55, 2, 57, 7, 17, 48, 34, 63, 15, 40, 26, 62, 11, 49, 6, 31, 39, 22, 42, 6, 63, 1, 39, 60, 4, 42, 61, 32, 45, 24, 44, 2, 60, 16, 41, 53, 1, 33, 61, 49, 17, 63, 23, 45, 26, 33, 3, 23, 46, 2, 50, 20, 4, 45, 34, 49, 30, 39, 58, 44, 31, 53, 34, 6, 52, 30, 47, 63, 1, 53, 22, 42, 31, 58, 23, 54, 22, 61, 8, 36, 59, 22, 35, 21, 1, 55, 40, 27, 16, 30, 54, 2, 29, 43, 16, 39, 63, 21, 46, 26, 10, 48, 32, 19, 53, 30, 56, 26, 60, 33, 4, 61, 23, 49, 59, 15, 53, 19, 58, 42, 16 },
+     { 20, 5, 59, 46, 25, 62, 7, 19, 43, 25, 37, 61, 11, 24, 4, 54, 12, 52, 3, 32, 17, 61, 12, 47, 15, 55, 18, 31, 53, 28, 9, 50, 21, 6, 55, 9, 58, 14, 54, 26, 33, 7, 31, 58, 13, 21, 8, 42, 29, 6, 37, 11, 48, 52, 14, 60, 11, 39, 56, 32, 14, 58, 7, 26, 17, 4, 42, 8, 11, 47, 19, 38, 10, 17, 26, 37, 9, 55, 28, 13, 18, 40, 6, 33, 1, 43, 25, 11, 51, 7, 62, 43, 18, 37, 3, 57, 45, 9, 38, 58, 5, 52, 27, 7, 17, 53, 5, 57, 37, 2, 63, 9, 22, 15, 11, 38, 25, 45, 35, 0, 28, 10, 41, 30, 50, 8, 31, 57 },
+     { 49, 33, 16, 38, 1, 42, 51, 34, 53, 14, 28, 49, 30, 56, 36, 23, 43, 20, 38, 56, 22, 45, 28, 0, 62, 35, 26, 44, 11, 19, 52, 35, 44, 15, 30, 38, 10, 31, 40, 4, 46, 50, 20, 40, 27, 44, 51, 14, 56, 53, 19, 59, 7, 29, 41, 19, 35, 25, 8, 52, 22, 44, 13, 53, 50, 32, 61, 24, 56, 25, 63, 0, 45, 57, 33, 59, 16, 46, 4, 62, 50, 11, 60, 37, 52, 19, 55, 29, 37, 46, 13, 26, 48, 10, 50, 34, 21, 63, 26, 13, 42, 33, 22, 55, 35, 28, 43, 15, 24, 51, 27, 34, 46, 49, 58, 3, 52, 9, 57, 19, 48, 55, 3, 35, 12, 45, 24, 3 },
+     { 41, 11, 56, 28, 18, 31, 22, 10, 37, 6, 47, 13, 3, 41, 9, 46, 0, 48, 29, 6, 34, 10, 55, 37, 20, 8, 49, 3, 41, 59, 14, 25, 0, 63, 19, 47, 27, 51, 17, 57, 23, 10, 61, 6, 54, 3, 38, 31, 0, 22, 34, 43, 20, 55, 31, 0, 49, 63, 29, 38, 3, 62, 28, 40, 0, 22, 14, 35, 2, 48, 15, 43, 23, 14, 3, 29, 49, 20, 39, 34, 0, 44, 29, 9, 15, 47, 5, 42, 0, 31, 58, 5, 31, 61, 23, 15, 0, 47, 19, 50, 24, 3, 59, 11, 44, 0, 31, 59, 6, 42, 17, 60, 0, 39, 20, 31, 43, 17, 29, 40, 12, 25, 60, 22, 52, 15, 63, 29 },
+     { 20, 52, 8, 44, 62, 4, 59, 49, 17, 63, 21, 39, 60, 18, 52, 27, 33, 59, 14, 51, 59, 43, 24, 5, 51, 30, 57, 17, 32, 5, 37, 56, 48, 34, 42, 3, 60, 5, 36, 13, 43, 37, 18, 34, 25, 12, 59, 24, 47, 36, 11, 50, 3, 38, 9, 58, 16, 5, 43, 18, 47, 10, 37, 18, 59, 46, 29, 52, 40, 12, 34, 28, 56, 36, 53, 7, 43, 8, 24, 52, 26, 17, 56, 43, 24, 32, 63, 20, 57, 16, 22, 52, 36, 8, 41, 56, 29, 32, 54, 7, 35, 57, 14, 48, 20, 62, 13, 39, 53, 29, 8, 45, 13, 29, 7, 61, 14, 54, 6, 63, 38, 32, 18, 43, 2, 39, 6, 47 },
+     { 0, 58, 23, 35, 13, 46, 12, 39, 0, 31, 55, 24, 5, 35, 15, 61, 17, 5, 39, 25, 18, 2, 50, 33, 41, 13, 39, 23, 62, 46, 29, 12, 22, 8, 56, 25, 20, 49, 32, 62, 0, 56, 11, 46, 63, 42, 9, 16, 55, 5, 60, 15, 62, 26, 45, 21, 36, 51, 13, 57, 31, 24, 55, 6, 35, 9, 57, 5, 20, 60, 7, 51, 5, 19, 40, 25, 61, 32, 56, 12, 36, 48, 21, 2, 58, 12, 39, 28, 9, 50, 40, 12, 44, 18, 25, 49, 6, 38, 11, 62, 18, 46, 30, 9, 40, 25, 49, 19, 10, 36, 55, 22, 33, 52, 41, 18, 37, 27, 49, 21, 2, 46, 7, 53, 33, 61, 27, 35 },
+     { 41, 31, 5, 39, 51, 26, 33, 57, 27, 41, 9, 44, 54, 29, 48, 7, 44, 36, 57, 10, 31, 63, 16, 45, 11, 60, 1, 47, 7, 20, 43, 3, 58, 36, 13, 52, 39, 7, 15, 28, 22, 48, 30, 21, 1, 29, 49, 44, 27, 17, 40, 30, 24, 42, 12, 53, 33, 7, 47, 20, 1, 42, 11, 49, 25, 43, 17, 32, 45, 27, 41, 21, 31, 62, 11, 49, 2, 15, 42, 5, 63, 7, 41, 27, 49, 6, 54, 23, 46, 34, 2, 28, 54, 3, 59, 12, 46, 17, 42, 28, 40, 1, 37, 51, 5, 55, 2, 34, 47, 16, 3, 62, 47, 5, 23, 56, 1, 44, 12, 34, 51, 16, 57, 11, 25, 17, 54, 13 },
+     { 60, 26, 55, 18, 3, 60, 20, 6, 52, 15, 50, 19, 32, 11, 23, 53, 26, 21, 1, 47, 42, 27, 8, 58, 21, 27, 53, 36, 26, 54, 31, 50, 17, 30, 45, 1, 29, 59, 44, 53, 41, 4, 35, 58, 51, 19, 32, 4, 52, 34, 48, 8, 51, 5, 56, 2, 25, 61, 27, 38, 54, 27, 62, 21, 51, 1, 39, 62, 10, 50, 1, 58, 13, 47, 38, 18, 35, 54, 22, 51, 30, 19, 59, 34, 14, 32, 44, 4, 60, 15, 52, 62, 20, 43, 30, 35, 21, 60, 4, 52, 12, 24, 61, 18, 30, 42, 23, 61, 25, 50, 27, 38, 11, 59, 12, 35, 50, 30, 59, 24, 8, 42, 28, 37, 48, 9, 44, 21 },
+     { 10, 47, 15, 50, 30, 43, 8, 45, 29, 2, 36, 59, 1, 58, 41, 3, 63, 31, 54, 20, 13, 55, 35, 38, 4, 44, 15, 9, 61, 2, 14, 38, 61, 10, 23, 54, 18, 12, 24, 2, 14, 55, 16, 8, 38, 14, 41, 60, 10, 23, 1, 58, 32, 17, 28, 37, 41, 15, 3, 60, 15, 33, 4, 36, 16, 59, 28, 14, 23, 55, 37, 18, 44, 28, 2, 57, 30, 10, 27, 46, 14, 38, 3, 53, 21, 61, 17, 35, 10, 41, 26, 7, 33, 9, 57, 1, 53, 37, 26, 20, 56, 48, 9, 33, 58, 16, 37, 7, 45, 1, 57, 15, 32, 26, 42, 23, 7, 20, 4, 54, 31, 62, 22, 1, 59, 30, 4, 51 },
+     { 36, 2, 38, 11, 24, 36, 54, 22, 62, 47, 25, 8, 28, 45, 16, 38, 12, 43, 9, 37, 49, 3, 23, 52, 18, 30, 50, 33, 19, 42, 49, 26, 6, 40, 47, 35, 63, 38, 50, 33, 60, 26, 36, 47, 24, 57, 6, 26, 39, 63, 19, 44, 14, 46, 61, 9, 50, 30, 45, 23, 10, 50, 44, 8, 31, 54, 6, 46, 36, 4, 30, 54, 8, 52, 22, 41, 4, 60, 40, 0, 58, 24, 45, 10, 37, 1, 48, 30, 56, 17, 38, 48, 24, 47, 19, 39, 14, 8, 45, 32, 2, 34, 27, 44, 4, 52, 11, 56, 31, 21, 40, 19, 44, 51, 2, 63, 46, 58, 36, 43, 14, 5, 50, 38, 14, 56, 40, 23 },
+     { 61, 46, 32, 63, 54, 1, 14, 34, 12, 40, 18, 49, 37, 10, 61, 30, 51, 24, 60, 7, 29, 40, 62, 11, 46, 58, 6, 56, 24, 10, 34, 52, 21, 59, 16, 3, 27, 5, 20, 46, 9, 40, 7, 62, 2, 30, 53, 15, 48, 10, 28, 35, 54, 6, 21, 34, 18, 55, 7, 40, 57, 19, 26, 60, 41, 13, 24, 51, 19, 61, 9, 25, 34, 15, 63, 11, 45, 17, 20, 47, 33, 8, 31, 62, 43, 26, 53, 7, 24, 59, 0, 13, 55, 4, 62, 27, 51, 31, 63, 15, 58, 7, 54, 14, 46, 22, 28, 43, 12, 63, 8, 54, 5, 17, 39, 33, 15, 10, 27, 17, 47, 34, 19, 45, 27, 12, 33, 17 },
+     { 5, 28, 21, 7, 17, 48, 42, 58, 23, 4, 63, 14, 55, 21, 34, 5, 19, 0, 45, 17, 52, 15, 25, 32, 0, 22, 40, 13, 45, 62, 18, 0, 43, 11, 33, 55, 30, 42, 57, 19, 51, 31, 22, 43, 18, 45, 34, 0, 43, 31, 56, 3, 23, 40, 59, 0, 44, 13, 48, 35, 2, 32, 46, 0, 21, 48, 35, 3, 40, 32, 43, 59, 0, 48, 33, 26, 53, 36, 55, 12, 51, 16, 55, 5, 18, 29, 11, 39, 51, 19, 45, 31, 42, 21, 35, 6, 22, 47, 10, 38, 23, 50, 20, 36, 0, 60, 38, 4, 50, 35, 48, 34, 24, 57, 9, 53, 28, 48, 61, 0, 56, 24, 53, 3, 63, 6, 42, 57 },
+     { 13, 53, 45, 40, 58, 27, 6, 16, 38, 51, 33, 30, 43, 2, 47, 56, 40, 50, 33, 57, 27, 5, 47, 42, 60, 36, 16, 54, 28, 4, 37, 57, 28, 51, 22, 8, 45, 14, 6, 39, 0, 54, 11, 59, 28, 12, 50, 21, 61, 13, 19, 38, 49, 11, 25, 37, 58, 29, 22, 63, 14, 56, 12, 53, 30, 63, 9, 57, 26, 12, 47, 16, 23, 39, 50, 6, 31, 2, 25, 6, 28, 41, 36, 22, 50, 57, 42, 3, 34, 8, 28, 61, 11, 50, 16, 54, 41, 0, 55, 43, 5, 29, 41, 63, 25, 16, 53, 18, 26, 10, 21, 0, 61, 30, 41, 22, 3, 38, 20, 39, 29, 8, 41, 16, 36, 52, 22, 19 },
+     { 55, 34, 0, 25, 10, 32, 56, 44, 28, 0, 57, 7, 26, 53, 23, 8, 13, 35, 22, 12, 36, 60, 20, 8, 14, 29, 48, 2, 41, 49, 23, 13, 39, 7, 48, 58, 25, 53, 34, 62, 28, 16, 48, 4, 37, 56, 27, 5, 36, 52, 46, 7, 62, 33, 52, 11, 17, 53, 5, 28, 41, 24, 38, 17, 5, 39, 20, 45, 15, 56, 5, 38, 60, 8, 14, 57, 21, 48, 62, 39, 59, 13, 1, 60, 9, 32, 16, 63, 44, 25, 52, 15, 36, 2, 60, 29, 12, 33, 25, 17, 59, 45, 13, 8, 49, 32, 6, 40, 59, 29, 45, 37, 13, 47, 6, 55, 30, 45, 9, 52, 13, 59, 25, 47, 32, 1, 49, 30 },
+     { 9, 39, 14, 61, 49, 37, 3, 20, 50, 13, 41, 19, 46, 17, 38, 59, 28, 62, 4, 44, 54, 1, 34, 51, 55, 7, 63, 32, 21, 8, 56, 31, 62, 19, 36, 1, 41, 17, 24, 12, 42, 35, 25, 52, 20, 8, 44, 59, 25, 2, 22, 42, 16, 29, 4, 46, 20, 36, 43, 9, 51, 8, 49, 26, 58, 33, 54, 1, 37, 29, 52, 20, 27, 45, 19, 35, 42, 16, 10, 32, 20, 49, 46, 27, 40, 4, 47, 22, 13, 55, 4, 47, 26, 44, 23, 40, 58, 19, 48, 13, 31, 2, 57, 34, 42, 19, 61, 32, 14, 55, 5, 51, 26, 19, 58, 16, 49, 14, 62, 5, 33, 44, 21, 7, 60, 26, 11, 41 },
+     { 62, 24, 47, 29, 8, 19, 53, 11, 60, 24, 32, 61, 4, 55, 31, 2, 49, 16, 39, 9, 31, 24, 43, 17, 26, 38, 11, 25, 58, 43, 12, 35, 3, 46, 15, 32, 63, 4, 49, 56, 2, 60, 10, 32, 63, 17, 39, 12, 55, 30, 57, 9, 48, 55, 39, 24, 60, 2, 58, 31, 19, 61, 34, 3, 42, 11, 22, 46, 7, 61, 10, 42, 3, 55, 32, 1, 58, 28, 44, 54, 4, 34, 23, 15, 56, 20, 37, 58, 6, 30, 38, 18, 63, 9, 32, 5, 51, 3, 62, 37, 52, 18, 39, 23, 3, 51, 9, 47, 1, 23, 43, 15, 60, 35, 11, 40, 1, 36, 31, 26, 57, 2, 37, 54, 18, 44, 58, 16 },
+     { 5, 51, 3, 33, 43, 62, 21, 42, 35, 9, 48, 15, 36, 10, 22, 42, 20, 46, 26, 56, 50, 12, 59, 3, 48, 19, 45, 53, 1, 27, 47, 17, 52, 24, 56, 11, 51, 21, 37, 30, 20, 46, 14, 41, 1, 47, 33, 7, 41, 17, 35, 27, 20, 1, 14, 54, 26, 33, 18, 47, 1, 44, 14, 59, 16, 52, 28, 18, 49, 31, 25, 34, 63, 13, 51, 24, 9, 50, 3, 23, 38, 63, 7, 52, 29, 46, 11, 33, 50, 22, 57, 36, 1, 57, 49, 17, 39, 28, 9, 35, 6, 27, 53, 15, 55, 30, 24, 58, 36, 41, 11, 52, 32, 3, 44, 25, 62, 23, 51, 15, 42, 22, 50, 10, 39, 4, 31, 35 },
+     { 46, 22, 57, 17, 12, 39, 26, 5, 31, 59, 1, 45, 27, 62, 52, 7, 58, 33, 6, 18, 39, 22, 33, 41, 57, 5, 35, 18, 40, 16, 60, 5, 29, 42, 7, 39, 27, 44, 9, 47, 8, 26, 54, 22, 51, 29, 24, 49, 15, 61, 4, 51, 31, 63, 43, 6, 50, 8, 39, 12, 53, 37, 23, 30, 40, 6, 62, 43, 14, 53, 2, 49, 7, 36, 17, 41, 61, 37, 18, 56, 11, 18, 44, 35, 2, 19, 61, 0, 41, 14, 8, 30, 43, 12, 24, 46, 14, 54, 42, 21, 44, 61, 10, 46, 37, 11, 44, 7, 18, 63, 20, 29, 7, 49, 28, 54, 8, 43, 4, 48, 18, 63, 12, 29, 48, 24, 59, 20 },
+     { 13, 36, 28, 54, 35, 2, 56, 46, 16, 49, 22, 40, 11, 34, 14, 43, 29, 12, 63, 48, 2, 61, 7, 15, 28, 30, 50, 9, 61, 33, 38, 23, 54, 13, 61, 33, 3, 59, 16, 35, 58, 40, 5, 38, 13, 57, 3, 58, 37, 21, 45, 12, 39, 7, 35, 30, 13, 56, 22, 62, 27, 6, 55, 10, 48, 21, 33, 2, 38, 23, 40, 20, 44, 29, 59, 4, 26, 12, 33, 47, 28, 53, 31, 13, 59, 41, 27, 49, 26, 54, 45, 16, 53, 21, 35, 7, 59, 26, 11, 56, 1, 24, 33, 4, 28, 62, 21, 49, 31, 2, 56, 39, 24, 58, 13, 17, 37, 21, 56, 10, 38, 0, 34, 55, 15, 43, 1, 52 },
+     { 42, 9, 50, 6, 25, 60, 14, 38, 10, 29, 53, 18, 57, 3, 25, 51, 0, 53, 25, 17, 29, 37, 52, 46, 0, 62, 14, 37, 4, 50, 10, 44, 0, 46, 20, 25, 50, 19, 55, 0, 23, 31, 62, 34, 11, 45, 19, 32, 0, 53, 10, 59, 23, 47, 18, 60, 42, 28, 37, 3, 50, 15, 35, 44, 0, 51, 27, 60, 9, 57, 16, 58, 11, 22, 46, 15, 53, 48, 7, 42, 0, 60, 5, 49, 24, 54, 9, 17, 39, 5, 34, 62, 3, 40, 60, 31, 0, 47, 29, 16, 49, 39, 59, 17, 50, 0, 40, 13, 53, 38, 16, 46, 0, 42, 34, 60, 2, 53, 29, 31, 58, 46, 27, 6, 61, 8, 37, 28 },
+     { 0, 63, 21, 40, 45, 18, 51, 23, 63, 34, 6, 43, 28, 38, 55, 19, 40, 35, 8, 41, 54, 10, 21, 32, 39, 23, 53, 26, 55, 28, 22, 63, 30, 34, 9, 48, 6, 38, 29, 43, 49, 6, 18, 52, 27, 61, 9, 43, 28, 42, 33, 26, 56, 3, 51, 23, 0, 48, 16, 45, 32, 25, 63, 20, 57, 17, 42, 12, 35, 47, 5, 31, 39, 56, 6, 30, 34, 21, 61, 25, 14, 40, 22, 38, 15, 6, 36, 56, 20, 60, 25, 12, 51, 27, 10, 56, 42, 20, 36, 63, 32, 6, 21, 41, 12, 34, 60, 26, 5, 48, 27, 10, 62, 19, 6, 47, 39, 14, 45, 7, 24, 17, 41, 32, 23, 51, 19, 56 },
+     { 45, 31, 15, 59, 4, 33, 7, 47, 0, 41, 13, 61, 4, 47, 9, 23, 60, 14, 57, 31, 4, 45, 59, 6, 58, 10, 44, 20, 8, 42, 15, 6, 55, 17, 58, 31, 53, 12, 61, 10, 15, 57, 43, 2, 23, 35, 48, 14, 54, 6, 18, 49, 15, 38, 11, 34, 62, 9, 21, 58, 11, 41, 4, 31, 38, 8, 29, 55, 19, 36, 27, 52, 0, 25, 50, 43, 1, 39, 8, 55, 35, 51, 10, 30, 45, 62, 29, 2, 46, 10, 32, 48, 18, 38, 5, 22, 33, 8, 51, 3, 14, 44, 54, 25, 57, 30, 18, 52, 33, 22, 59, 28, 36, 52, 32, 21, 26, 50, 5, 55, 35, 60, 14, 54, 4, 40, 16, 33 },
+     { 27, 3, 49, 10, 30, 40, 55, 27, 57, 24, 52, 21, 32, 17, 60, 30, 5, 44, 27, 49, 19, 34, 13, 24, 43, 36, 3, 49, 31, 59, 37, 48, 26, 41, 2, 41, 14, 36, 21, 32, 40, 26, 13, 49, 55, 5, 16, 40, 25, 60, 36, 1, 63, 29, 17, 44, 25, 40, 52, 5, 29, 47, 54, 13, 46, 24, 60, 4, 51, 22, 63, 14, 45, 18, 12, 62, 17, 57, 19, 42, 3, 26, 58, 48, 1, 21, 40, 52, 23, 37, 44, 1, 29, 58, 43, 50, 15, 61, 19, 45, 58, 28, 7, 48, 2, 46, 8, 42, 3, 55, 8, 50, 12, 4, 55, 10, 63, 33, 20, 40, 11, 3, 46, 20, 48, 26, 61, 11 },
+     { 44, 56, 24, 36, 53, 19, 12, 37, 16, 44, 7, 36, 49, 54, 11, 37, 48, 21, 15, 1, 62, 25, 47, 56, 16, 18, 51, 12, 40, 1, 24, 11, 52, 16, 23, 59, 28, 1, 45, 53, 4, 60, 37, 21, 39, 30, 63, 20, 52, 10, 30, 45, 8, 41, 54, 4, 57, 7, 34, 55, 36, 18, 23, 59, 2, 48, 11, 32, 44, 1, 41, 8, 33, 54, 38, 23, 30, 46, 6, 29, 62, 18, 32, 16, 55, 34, 14, 11, 61, 7, 55, 16, 53, 13, 23, 2, 55, 37, 26, 10, 33, 23, 36, 16, 38, 22, 56, 15, 24, 43, 35, 17, 44, 40, 25, 46, 16, 1, 57, 25, 49, 36, 28, 62, 9, 35, 7, 53 },
+     { 17, 38, 8, 61, 1, 50, 26, 62, 3, 31, 56, 15, 1, 26, 40, 2, 34, 51, 56, 36, 42, 9, 38, 2, 29, 60, 32, 57, 19, 62, 34, 47, 4, 57, 39, 7, 44, 63, 24, 18, 46, 28, 8, 54, 1, 34, 7, 46, 3, 37, 50, 23, 57, 21, 13, 46, 31, 20, 43, 15, 1, 61, 8, 33, 37, 17, 56, 26, 15, 49, 24, 59, 28, 3, 56, 9, 52, 32, 13, 49, 10, 43, 5, 45, 8, 25, 59, 42, 28, 33, 19, 40, 8, 63, 35, 47, 25, 4, 40, 52, 1, 60, 12, 53, 63, 9, 29, 60, 37, 19, 1, 62, 31, 20, 58, 12, 41, 30, 43, 9, 18, 52, 22, 1, 39, 30, 58, 21 },
+     { 13, 47, 29, 18, 43, 34, 5, 48, 20, 42, 10, 45, 30, 58, 20, 63, 24, 11, 6, 28, 54, 14, 22, 52, 41, 7, 26, 5, 45, 15, 53, 13, 35, 27, 18, 50, 12, 33, 5, 56, 10, 17, 45, 24, 59, 15, 50, 26, 56, 13, 19, 5, 32, 52, 27, 36, 2, 61, 12, 26, 49, 40, 27, 52, 13, 50, 6, 39, 61, 34, 10, 37, 48, 20, 41, 27, 2, 36, 59, 24, 54, 33, 63, 20, 38, 50, 3, 17, 52, 4, 58, 27, 45, 21, 32, 11, 48, 17, 57, 20, 46, 38, 25, 43, 4, 34, 51, 6, 13, 45, 57, 26, 6, 48, 2, 35, 53, 23, 61, 34, 59, 6, 42, 56, 13, 51, 2, 41 },
+     { 32, 5, 55, 23, 58, 14, 22, 52, 29, 15, 61, 25, 51, 8, 43, 13, 53, 41, 46, 20, 3, 33, 63, 11, 48, 21, 54, 38, 28, 3, 30, 43, 21, 62, 9, 31, 55, 22, 51, 29, 37, 62, 32, 12, 42, 29, 41, 9, 33, 44, 62, 28, 43, 1, 59, 19, 48, 30, 51, 39, 24, 4, 58, 19, 42, 29, 22, 43, 3, 18, 53, 5, 13, 50, 16, 60, 45, 21, 7, 40, 15, 0, 26, 53, 13, 31, 43, 24, 47, 31, 15, 49, 2, 41, 6, 59, 29, 42, 9, 30, 14, 7, 49, 18, 31, 47, 20, 39, 49, 32, 11, 41, 54, 15, 61, 18, 7, 38, 4, 13, 44, 28, 15, 32, 45, 19, 27, 49 },
+     { 63, 34, 11, 39, 2, 45, 37, 8, 59, 39, 33, 4, 36, 17, 48, 5, 29, 18, 32, 61, 39, 50, 5, 27, 35, 0, 46, 12, 22, 49, 60, 6, 54, 0, 38, 49, 2, 42, 15, 40, 0, 47, 20, 51, 3, 57, 18, 61, 22, 0, 39, 16, 55, 12, 35, 8, 41, 22, 6, 59, 16, 45, 10, 36, 0, 62, 9, 54, 30, 58, 21, 43, 63, 31, 7, 35, 12, 48, 58, 28, 47, 37, 41, 9, 57, 20, 61, 0, 36, 11, 57, 35, 23, 52, 37, 18, 0, 62, 22, 55, 35, 62, 27, 54, 0, 15, 61, 28, 2, 59, 22, 9, 37, 27, 33, 51, 29, 48, 19, 50, 25, 37, 10, 57, 5, 37, 60, 8 },
+     { 20, 25, 46, 52, 31, 60, 12, 55, 0, 19, 11, 46, 62, 35, 23, 38, 57, 0, 55, 10, 16, 30, 58, 44, 17, 59, 29, 63, 42, 8, 36, 20, 33, 46, 16, 61, 25, 35, 8, 54, 26, 7, 58, 22, 34, 6, 47, 14, 53, 31, 48, 9, 37, 25, 49, 63, 16, 55, 45, 14, 34, 63, 21, 53, 25, 33, 46, 16, 35, 7, 46, 29, 0, 39, 25, 55, 22, 34, 18, 4, 56, 11, 23, 51, 28, 6, 39, 14, 62, 44, 19, 8, 60, 12, 56, 28, 50, 34, 39, 5, 51, 3, 41, 12, 57, 35, 10, 53, 25, 17, 52, 30, 47, 0, 43, 14, 5, 57, 31, 55, 0, 63, 47, 23, 54, 24, 14, 43 },
+     { 0, 57, 16, 6, 26, 19, 35, 28, 49, 42, 54, 26, 21, 1, 59, 27, 9, 47, 26, 44, 50, 22, 13, 40, 8, 37, 10, 34, 17, 56, 25, 58, 13, 27, 44, 9, 20, 58, 31, 17, 60, 36, 10, 41, 53, 25, 36, 39, 4, 24, 58, 17, 60, 4, 22, 38, 10, 32, 0, 50, 31, 7, 28, 47, 12, 57, 5, 26, 52, 23, 14, 40, 57, 17, 47, 5, 53, 1, 44, 31, 19, 60, 46, 2, 35, 48, 30, 54, 22, 5, 51, 39, 25, 31, 4, 43, 14, 9, 45, 16, 24, 44, 19, 29, 40, 23, 44, 7, 38, 42, 4, 63, 12, 54, 23, 59, 22, 42, 8, 15, 40, 21, 8, 34, 3, 41, 30, 50 },
+     { 39, 10, 48, 33, 41, 54, 5, 47, 23, 13, 32, 7, 52, 44, 14, 39, 58, 18, 35, 6, 37, 2, 60, 24, 55, 19, 53, 2, 51, 32, 1, 41, 51, 4, 40, 29, 47, 3, 52, 44, 13, 49, 28, 16, 1, 62, 11, 27, 52, 35, 5, 42, 29, 47, 14, 56, 28, 53, 26, 38, 9, 56, 40, 3, 38, 15, 41, 60, 1, 37, 50, 25, 11, 28, 61, 19, 42, 62, 10, 52, 39, 6, 32, 14, 58, 17, 7, 26, 42, 34, 27, 10, 54, 40, 20, 63, 26, 53, 21, 61, 32, 7, 59, 48, 3, 56, 18, 31, 58, 14, 49, 21, 36, 16, 45, 9, 36, 24, 62, 45, 27, 31, 53, 17, 49, 12, 62, 18 },
+     { 28, 59, 21, 58, 2, 16, 38, 9, 62, 3, 56, 41, 10, 31, 50, 4, 32, 52, 12, 63, 23, 46, 33, 31, 4, 48, 25, 43, 14, 23, 47, 11, 22, 55, 14, 60, 23, 37, 11, 39, 23, 2, 45, 56, 31, 43, 19, 55, 16, 46, 21, 51, 11, 33, 44, 2, 41, 18, 5, 52, 23, 44, 17, 60, 27, 49, 11, 32, 44, 10, 54, 2, 56, 33, 8, 38, 13, 29, 36, 16, 24, 63, 27, 51, 21, 43, 56, 12, 49, 3, 59, 48, 1, 15, 46, 7, 36, 2, 47, 11, 50, 27, 37, 13, 33, 8, 51, 46, 1, 34, 28, 40, 3, 33, 60, 29, 47, 1, 35, 11, 59, 42, 2, 60, 26, 46, 6, 35 },
+     { 4, 43, 9, 29, 36, 63, 24, 44, 20, 50, 30, 17, 60, 22, 16, 43, 25, 3, 42, 19, 51, 15, 8, 54, 42, 15, 61, 5, 39, 57, 18, 61, 31, 48, 34, 2, 50, 19, 57, 5, 63, 33, 19, 38, 13, 27, 48, 7, 32, 61, 2, 26, 58, 6, 24, 50, 13, 61, 42, 20, 62, 2, 35, 20, 51, 4, 62, 18, 23, 58, 20, 31, 43, 15, 51, 45, 26, 50, 4, 55, 45, 3, 35, 9, 38, 1, 32, 61, 20, 45, 17, 33, 24, 57, 29, 51, 22, 58, 38, 30, 15, 1, 54, 21, 63, 43, 26, 12, 24, 56, 8, 60, 50, 19, 5, 52, 13, 54, 17, 50, 4, 16, 36, 12, 32, 56, 22, 54 },
+     { 51, 25, 40, 53, 12, 49, 15, 57, 34, 7, 38, 47, 2, 36, 55, 8, 61, 30, 56, 7, 28, 59, 48, 11, 27, 35, 21, 45, 28, 36, 9, 38, 6, 16, 24, 63, 10, 32, 28, 43, 21, 53, 5, 60, 8, 57, 3, 45, 11, 37, 15, 54, 40, 20, 62, 36, 27, 34, 11, 48, 30, 15, 54, 8, 30, 42, 22, 34, 48, 13, 35, 63, 4, 37, 22, 2, 59, 9, 41, 23, 13, 41, 49, 18, 59, 24, 40, 5, 37, 30, 9, 61, 44, 6, 37, 11, 33, 17, 5, 55, 41, 60, 23, 39, 17, 5, 30, 62, 41, 16, 46, 25, 11, 56, 39, 26, 20, 38, 29, 39, 22, 52, 44, 20, 48, 1, 38, 14 },
+     { 15, 33, 2, 18, 44, 6, 27, 0, 32, 61, 25, 12, 58, 28, 40, 20, 47, 13, 34, 43, 38, 1, 23, 62, 40, 0, 51, 10, 63, 3, 52, 26, 44, 30, 45, 6, 41, 54, 0, 51, 12, 30, 46, 24, 49, 22, 40, 33, 63, 23, 43, 30, 9, 47, 0, 17, 54, 7, 57, 3, 37, 47, 24, 46, 13, 55, 7, 52, 2, 42, 6, 26, 49, 18, 60, 34, 16, 57, 33, 20, 61, 30, 8, 54, 14, 46, 12, 53, 16, 55, 38, 13, 22, 53, 18, 59, 46, 27, 43, 19, 32, 10, 45, 6, 49, 36, 52, 2, 20, 55, 6, 39, 32, 15, 44, 3, 58, 10, 63, 6, 56, 30, 7, 58, 9, 40, 19, 63 },
+     { 10, 47, 61, 23, 55, 31, 52, 42, 17, 45, 4, 51, 27, 6, 15, 53, 0, 49, 26, 10, 56, 18, 36, 6, 20, 58, 32, 30, 13, 49, 19, 56, 0, 59, 12, 53, 27, 17, 38, 25, 48, 9, 15, 36, 14, 30, 59, 17, 0, 50, 8, 58, 18, 56, 31, 45, 21, 41, 29, 19, 60, 6, 32, 59, 0, 36, 29, 39, 19, 59, 46, 12, 55, 30, 10, 47, 24, 3, 28, 48, 0, 55, 44, 27, 33, 4, 63, 29, 49, 0, 26, 50, 34, 2, 42, 14, 0, 62, 9, 56, 3, 52, 28, 34, 58, 9, 20, 48, 37, 32, 22, 53, 0, 62, 27, 49, 34, 46, 21, 33, 41, 14, 25, 37, 53, 29, 31, 45 },
+     { 56, 28, 7, 37, 11, 36, 20, 9, 54, 14, 39, 19, 34, 63, 45, 37, 24, 17, 60, 31, 21, 45, 53, 29, 47, 15, 7, 55, 40, 23, 34, 14, 42, 20, 37, 35, 15, 59, 7, 62, 34, 40, 59, 1, 51, 42, 10, 28, 54, 21, 35, 5, 38, 13, 36, 4, 59, 12, 39, 53, 15, 43, 9, 21, 39, 62, 16, 56, 25, 9, 32, 38, 0, 41, 14, 51, 40, 53, 43, 11, 37, 17, 5, 22, 57, 39, 19, 7, 42, 21, 60, 10, 31, 63, 25, 52, 30, 49, 36, 25, 48, 17, 61, 14, 22, 42, 29, 13, 60, 11, 47, 18, 35, 41, 7, 23, 4, 16, 51, 11, 0, 48, 61, 3, 17, 50, 5, 24 },
+     { 0, 42, 21, 49, 60, 3, 57, 40, 29, 48, 23, 56, 42, 11, 22, 5, 59, 39, 4, 50, 3, 41, 12, 57, 25, 50, 44, 18, 4, 46, 7, 62, 33, 50, 4, 56, 21, 32, 43, 18, 3, 23, 55, 34, 20, 4, 53, 38, 12, 46, 29, 52, 25, 61, 23, 51, 26, 46, 1, 34, 25, 57, 28, 51, 26, 11, 50, 3, 44, 28, 53, 21, 57, 27, 62, 6, 31, 19, 8, 63, 26, 59, 36, 47, 15, 29, 50, 25, 35, 47, 18, 41, 4, 48, 8, 40, 12, 23, 6, 44, 13, 40, 1, 31, 55, 0, 61, 43, 4, 50, 26, 58, 9, 53, 24, 61, 42, 55, 31, 43, 57, 20, 34, 27, 43, 8, 59, 39 },
+     { 18, 51, 30, 13, 26, 16, 46, 22, 2, 59, 8, 30, 1, 48, 33, 51, 29, 9, 46, 16, 62, 14, 33, 2, 38, 9, 27, 60, 37, 26, 53, 17, 28, 10, 24, 46, 2, 49, 8, 57, 29, 45, 6, 26, 62, 44, 18, 25, 61, 3, 42, 14, 49, 10, 43, 6, 17, 32, 63, 10, 49, 4, 40, 14, 45, 33, 22, 37, 12, 61, 5, 17, 43, 7, 23, 37, 15, 58, 49, 13, 39, 21, 10, 52, 1, 62, 9, 56, 12, 2, 58, 28, 36, 16, 56, 28, 56, 35, 20, 63, 24, 37, 51, 8, 45, 25, 16, 33, 27, 38, 2, 44, 13, 30, 17, 36, 12, 26, 5, 18, 28, 47, 13, 60, 23, 45, 13, 33 },
+     { 55, 4, 62, 34, 52, 38, 7, 63, 32, 37, 13, 53, 25, 62, 18, 12, 55, 41, 27, 35, 24, 49, 31, 52, 17, 63, 34, 1, 56, 12, 41, 2, 48, 58, 39, 16, 61, 27, 41, 52, 13, 19, 50, 39, 11, 31, 57, 6, 32, 40, 20, 55, 1, 28, 33, 57, 48, 8, 37, 22, 44, 18, 53, 1, 61, 5, 54, 16, 47, 36, 50, 24, 55, 34, 48, 45, 1, 30, 33, 46, 2, 50, 32, 42, 25, 34, 43, 21, 38, 52, 23, 45, 14, 54, 21, 4, 44, 16, 53, 29, 10, 47, 19, 57, 12, 54, 39, 10, 51, 15, 63, 21, 57, 40, 51, 1, 48, 57, 37, 62, 2, 38, 9, 52, 1, 35, 58, 22 },
+     { 36, 46, 10, 42, 1, 27, 43, 15, 50, 21, 45, 16, 41, 3, 35, 44, 20, 1, 57, 11, 55, 7, 43, 8, 22, 42, 13, 46, 21, 39, 31, 60, 22, 5, 29, 44, 11, 35, 20, 4, 36, 58, 32, 15, 47, 2, 36, 48, 16, 60, 8, 35, 44, 63, 16, 2, 40, 26, 55, 14, 58, 35, 24, 31, 19, 42, 31, 58, 1, 29, 10, 40, 2, 19, 12, 54, 22, 61, 7, 24, 56, 5, 28, 16, 54, 3, 15, 58, 6, 30, 8, 62, 1, 43, 31, 47, 7, 59, 1, 38, 58, 4, 34, 27, 38, 5, 31, 59, 7, 46, 30, 3, 34, 6, 28, 59, 20, 8, 32, 15, 53, 24, 55, 31, 19, 49, 11, 26 },
+     { 2, 24, 16, 58, 19, 55, 5, 35, 10, 61, 4, 28, 57, 24, 58, 7, 31, 47, 22, 38, 19, 28, 61, 36, 54, 5, 59, 29, 6, 52, 15, 11, 43, 36, 8, 54, 52, 1, 62, 25, 47, 9, 1, 60, 28, 53, 24, 14, 46, 27, 51, 22, 12, 24, 38, 53, 20, 11, 51, 3, 29, 7, 48, 63, 8, 49, 9, 21, 52, 14, 63, 32, 46, 60, 35, 4, 41, 16, 52, 35, 18, 42, 59, 7, 36, 61, 45, 27, 33, 51, 19, 39, 34, 11, 61, 18, 33, 41, 28, 15, 54, 22, 42, 3, 49, 21, 47, 18, 36, 23, 55, 19, 48, 24, 45, 10, 33, 44, 50, 40, 7, 35, 15, 41, 63, 6, 40, 54 },
+     { 62, 41, 32, 8, 47, 28, 60, 24, 44, 30, 38, 49, 9, 33, 14, 40, 50, 14, 60, 2, 54, 40, 0, 20, 25, 39, 16, 49, 24, 35, 57, 47, 19, 61, 33, 18, 23, 37, 13, 55, 31, 43, 22, 41, 17, 8, 42, 58, 0, 37, 5, 56, 31, 54, 7, 30, 60, 33, 42, 17, 59, 39, 12, 27, 38, 17, 35, 41, 27, 45, 20, 7, 25, 15, 29, 58, 27, 47, 11, 40, 14, 54, 23, 46, 19, 31, 11, 40, 13, 49, 5, 58, 24, 51, 26, 6, 50, 20, 49, 9, 32, 46, 17, 60, 14, 63, 24, 1, 57, 41, 9, 43, 14, 62, 16, 52, 3, 27, 14, 22, 61, 45, 4, 28, 9, 47, 29, 17 },
+     { 5, 50, 12, 53, 38, 18, 11, 51, 0, 55, 17, 6, 47, 54, 19, 63, 5, 26, 34, 45, 13, 30, 47, 58, 10, 48, 32, 3, 62, 9, 26, 0, 25, 14, 50, 3, 47, 30, 42, 16, 6, 63, 12, 49, 33, 55, 21, 10, 34, 63, 18, 41, 3, 47, 19, 43, 0, 49, 8, 28, 46, 20, 52, 0, 56, 24, 60, 3, 59, 5, 39, 57, 48, 52, 9, 38, 3, 21, 26, 60, 0, 32, 12, 38, 4, 48, 53, 0, 60, 15, 29, 44, 18, 10, 38, 57, 13, 60, 2, 26, 62, 7, 50, 29, 35, 8, 40, 53, 28, 12, 60, 33, 38, 5, 37, 29, 60, 39, 56, 0, 30, 18, 50, 34, 59, 25, 14, 44 },
+     { 20, 31, 60, 22, 3, 49, 33, 25, 40, 13, 34, 59, 22, 36, 0, 28, 37, 56, 8, 18, 51, 16, 4, 45, 27, 12, 53, 42, 18, 44, 51, 31, 55, 40, 28, 58, 7, 60, 10, 51, 27, 37, 24, 56, 5, 26, 44, 29, 50, 23, 45, 11, 34, 15, 59, 27, 13, 23, 62, 37, 4, 57, 15, 32, 42, 6, 47, 11, 30, 43, 23, 13, 0, 36, 18, 44, 63, 51, 37, 29, 49, 20, 57, 27, 62, 9, 24, 35, 23, 53, 37, 3, 42, 55, 0, 36, 23, 39, 31, 43, 17, 37, 24, 11, 52, 43, 19, 32, 5, 50, 26, 0, 56, 21, 54, 11, 19, 6, 47, 25, 59, 42, 12, 54, 21, 3, 38, 57 },
+     { 48, 0, 35, 27, 44, 14, 59, 7, 57, 46, 26, 2, 42, 12, 52, 43, 10, 27, 53, 42, 32, 62, 37, 21, 34, 61, 7, 23, 36, 4, 38, 12, 41, 5, 17, 45, 22, 27, 39, 21, 59, 0, 45, 18, 39, 62, 3, 38, 14, 7, 54, 26, 61, 39, 9, 52, 45, 36, 18, 50, 10, 34, 44, 22, 50, 14, 36, 55, 17, 34, 53, 62, 33, 26, 56, 6, 31, 12, 6, 53, 9, 44, 2, 50, 20, 40, 55, 17, 47, 7, 26, 63, 22, 32, 48, 16, 46, 8, 52, 12, 57, 41, 0, 56, 25, 3, 61, 14, 45, 35, 18, 44, 12, 46, 23, 42, 32, 51, 35, 10, 17, 36, 23, 1, 45, 52, 32, 10 },
+     { 37, 15, 43, 8, 63, 39, 21, 31, 16, 37, 19, 62, 30, 46, 17, 60, 21, 48, 1, 23, 6, 25, 11, 56, 1, 40, 30, 58, 15, 54, 21, 59, 9, 63, 35, 56, 11, 51, 2, 46, 34, 14, 53, 7, 30, 11, 51, 19, 60, 40, 30, 1, 24, 50, 20, 32, 3, 56, 5, 25, 31, 13, 61, 2, 29, 60, 25, 20, 51, 2, 27, 8, 18, 42, 10, 45, 21, 34, 43, 17, 62, 29, 41, 14, 34, 6, 30, 43, 2, 57, 33, 13, 45, 12, 27, 62, 4, 55, 21, 35, 5, 27, 45, 33, 16, 47, 30, 54, 22, 10, 51, 27, 63, 7, 49, 1, 58, 22, 15, 43, 53, 7, 57, 39, 27, 12, 61, 24 },
+     { 56, 51, 26, 56, 19, 2, 41, 54, 5, 52, 9, 48, 6, 23, 39, 4, 32, 15, 63, 35, 59, 49, 43, 15, 52, 19, 50, 9, 46, 33, 1, 29, 48, 20, 32, 1, 38, 33, 19, 54, 9, 32, 24, 48, 58, 35, 16, 48, 4, 52, 13, 57, 33, 5, 45, 59, 15, 29, 41, 55, 47, 39, 23, 53, 9, 40, 4, 57, 10, 44, 48, 40, 50, 14, 61, 24, 55, 1, 59, 22, 33, 8, 51, 25, 58, 46, 11, 59, 20, 41, 17, 51, 6, 56, 35, 25, 42, 30, 15, 58, 48, 18, 61, 9, 58, 39, 13, 2, 37, 59, 40, 2, 31, 16, 34, 41, 8, 30, 62, 3, 29, 48, 33, 5, 63, 16, 41, 7 },
+     { 22, 4, 46, 11, 33, 51, 29, 10, 62, 24, 43, 27, 15, 58, 50, 25, 54, 44, 9, 38, 18, 3, 29, 57, 32, 5, 26, 43, 17, 61, 24, 52, 8, 42, 23, 53, 15, 61, 7, 28, 57, 43, 4, 40, 20, 2, 43, 25, 32, 35, 21, 43, 17, 48, 10, 22, 38, 54, 11, 21, 1, 58, 16, 30, 48, 18, 46, 32, 38, 13, 22, 4, 59, 35, 2, 51, 30, 39, 15, 47, 4, 56, 13, 37, 1, 28, 16, 52, 32, 9, 61, 29, 38, 19, 3, 52, 10, 48, 1, 32, 11, 40, 20, 36, 6, 22, 49, 29, 55, 6, 20, 56, 36, 52, 19, 60, 26, 46, 18, 54, 40, 13, 20, 46, 35, 19, 49, 29 },
+     { 61, 17, 34, 53, 23, 6, 48, 35, 20, 40, 1, 56, 36, 29, 11, 34, 7, 41, 14, 30, 55, 20, 46, 8, 24, 38, 63, 2, 37, 10, 45, 14, 34, 49, 6, 13, 44, 25, 49, 41, 21, 12, 61, 15, 54, 29, 63, 12, 56, 8, 49, 2, 62, 36, 28, 61, 0, 25, 41, 63, 35, 8, 44, 6, 37, 62, 7, 21, 63, 28, 55, 31, 16, 24, 41, 19, 9, 57, 27, 36, 18, 42, 31, 62, 22, 55, 38, 4, 27, 47, 1, 40, 14, 54, 43, 20, 60, 23, 38, 63, 25, 51, 2, 53, 26, 63, 10, 42, 17, 34, 47, 25, 13, 5, 44, 11, 55, 2, 38, 27, 6, 60, 52, 25, 9, 55, 1, 40 },
+     { 8, 30, 58, 3, 42, 61, 17, 38, 13, 59, 32, 10, 54, 3, 51, 20, 61, 26, 57, 2, 46, 33, 12, 60, 41, 13, 48, 29, 55, 20, 39, 27, 57, 18, 62, 29, 55, 2, 31, 16, 37, 50, 26, 36, 6, 46, 9, 41, 27, 57, 23, 39, 26, 6, 51, 12, 31, 46, 7, 16, 27, 52, 19, 56, 26, 12, 33, 53, 1, 41, 8, 57, 46, 7, 54, 32, 47, 5, 49, 11, 60, 23, 5, 48, 10, 43, 19, 63, 35, 24, 49, 21, 59, 5, 31, 37, 14, 44, 7, 42, 6, 30, 46, 13, 44, 32, 19, 50, 4, 58, 8, 30, 62, 38, 28, 53, 21, 36, 13, 50, 21, 33, 15, 2, 44, 31, 14, 47 },
+     { 37, 13, 39, 16, 28, 9, 57, 0, 25, 49, 21, 45, 18, 47, 12, 42, 0, 49, 22, 39, 16, 53, 25, 36, 0, 52, 22, 16, 6, 60, 4, 51, 0, 26, 37, 47, 10, 36, 63, 5, 57, 0, 18, 59, 23, 33, 51, 19, 0, 44, 15, 11, 54, 17, 42, 35, 53, 18, 58, 33, 49, 4, 34, 42, 0, 50, 43, 25, 16, 49, 34, 20, 37, 28, 12, 63, 16, 38, 25, 44, 0, 40, 52, 17, 35, 3, 50, 14, 8, 53, 11, 36, 25, 45, 9, 62, 0, 54, 28, 17, 50, 55, 15, 24, 57, 0, 53, 34, 23, 41, 15, 45, 0, 49, 16, 4, 48, 9, 63, 45, 0, 42, 58, 37, 61, 22, 54, 26 },
+     { 0, 50, 21, 47, 54, 36, 27, 45, 52, 4, 34, 15, 63, 29, 37, 59, 17, 31, 6, 61, 28, 5, 48, 18, 59, 27, 34, 56, 44, 31, 35, 12, 41, 59, 16, 3, 40, 20, 50, 22, 30, 40, 52, 10, 45, 3, 59, 22, 37, 61, 29, 46, 31, 58, 2, 22, 9, 43, 3, 39, 14, 61, 24, 54, 15, 29, 11, 60, 39, 17, 5, 61, 0, 44, 50, 3, 31, 14, 58, 21, 54, 28, 15, 45, 60, 26, 33, 58, 44, 22, 60, 2, 57, 34, 49, 27, 18, 34, 21, 59, 29, 4, 36, 41, 8, 39, 28, 11, 62, 26, 53, 20, 35, 24, 59, 32, 29, 39, 24, 31, 57, 23, 11, 28, 5, 36, 11, 59 },
+     { 44, 32, 63, 5, 20, 12, 41, 7, 30, 61, 42, 8, 39, 5, 33, 8, 24, 53, 45, 11, 37, 58, 7, 44, 10, 50, 3, 40, 8, 22, 53, 19, 46, 9, 33, 52, 24, 58, 8, 44, 13, 47, 8, 34, 38, 30, 14, 47, 7, 34, 4, 55, 9, 19, 40, 49, 56, 26, 60, 21, 30, 45, 10, 19, 40, 58, 23, 36, 3, 52, 45, 23, 54, 13, 22, 42, 53, 45, 7, 33, 10, 36, 57, 6, 29, 12, 41, 0, 30, 15, 41, 30, 17, 7, 16, 53, 40, 56, 2, 39, 12, 61, 10, 52, 31, 60, 16, 45, 1, 37, 7, 61, 40, 10, 43, 17, 58, 7, 54, 14, 4, 51, 39, 49, 18, 56, 42, 20 },
+     { 14, 6, 24, 36, 56, 49, 22, 60, 18, 14, 23, 51, 26, 57, 21, 52, 41, 14, 35, 50, 19, 31, 40, 23, 33, 14, 63, 17, 32, 47, 7, 62, 23, 30, 56, 11, 42, 27, 14, 60, 35, 19, 28, 61, 17, 55, 25, 39, 53, 17, 42, 21, 38, 63, 25, 5, 14, 36, 12, 50, 1, 37, 59, 32, 2, 51, 6, 56, 27, 32, 11, 30, 38, 26, 60, 8, 26, 19, 62, 39, 50, 2, 21, 39, 53, 23, 56, 19, 49, 39, 5, 46, 55, 23, 42, 4, 31, 11, 47, 26, 45, 22, 48, 18, 21, 5, 48, 25, 57, 14, 47, 30, 3, 56, 12, 50, 1, 42, 19, 47, 35, 17, 8, 30, 45, 25, 4, 51 },
+     { 28, 58, 43, 1, 31, 8, 33, 2, 44, 55, 32, 1, 60, 12, 46, 27, 4, 62, 23, 1, 56, 13, 62, 2, 54, 36, 25, 51, 1, 57, 26, 42, 3, 49, 17, 38, 1, 48, 31, 4, 54, 3, 50, 24, 1, 49, 5, 63, 13, 27, 52, 1, 48, 13, 45, 33, 52, 30, 46, 20, 55, 28, 6, 48, 24, 38, 20, 47, 14, 62, 48, 9, 58, 4, 36, 30, 56, 1, 34, 12, 18, 63, 25, 48, 4, 16, 37, 7, 62, 10, 52, 28, 13, 50, 36, 63, 24, 51, 15, 58, 8, 33, 1, 38, 56, 35, 42, 9, 33, 51, 22, 18, 48, 32, 27, 37, 23, 61, 33, 11, 59, 29, 62, 1, 53, 10, 60, 33 },
+     { 12, 39, 17, 52, 26, 46, 53, 38, 25, 11, 48, 36, 16, 43, 2, 35, 55, 17, 39, 29, 43, 9, 28, 45, 20, 5, 46, 12, 42, 28, 13, 52, 36, 6, 60, 22, 54, 17, 62, 39, 25, 42, 15, 55, 44, 20, 31, 10, 35, 57, 24, 32, 29, 6, 59, 18, 7, 62, 3, 41, 10, 44, 16, 54, 13, 62, 31, 9, 41, 1, 21, 43, 18, 47, 15, 40, 11, 49, 28, 55, 46, 30, 8, 43, 32, 61, 28, 47, 25, 34, 21, 61, 32, 1, 20, 9, 46, 6, 35, 19, 41, 54, 27, 63, 14, 3, 51, 20, 62, 2, 38, 55, 8, 21, 63, 6, 46, 9, 26, 51, 3, 24, 43, 34, 16, 41, 18, 48 },
+     { 62, 23, 55, 9, 15, 62, 19, 13, 58, 40, 6, 30, 54, 19, 50, 31, 10, 44, 6, 59, 21, 47, 51, 15, 60, 39, 30, 54, 21, 61, 19, 33, 14, 29, 43, 11, 34, 45, 7, 21, 10, 56, 36, 6, 38, 11, 58, 42, 2, 47, 11, 60, 50, 16, 41, 28, 38, 23, 47, 17, 35, 63, 22, 33, 42, 5, 45, 17, 53, 35, 25, 56, 33, 6, 51, 19, 60, 23, 43, 15, 5, 40, 58, 13, 51, 1, 45, 11, 54, 3, 43, 8, 37, 48, 59, 29, 39, 21, 61, 43, 3, 31, 10, 44, 24, 29, 60, 12, 28, 40, 11, 25, 43, 52, 14, 41, 16, 57, 44, 20, 40, 55, 12, 21, 57, 27, 35, 2 },
+     { 37, 6, 31, 42, 40, 4, 29, 50, 0, 20, 63, 28, 9, 58, 14, 24, 63, 26, 48, 16, 34, 4, 32, 38, 23, 11, 58, 4, 37, 9, 45, 5, 63, 48, 26, 57, 2, 28, 32, 51, 46, 29, 13, 62, 27, 46, 28, 18, 50, 15, 40, 4, 19, 34, 54, 0, 53, 9, 26, 58, 28, 5, 49, 0, 57, 27, 19, 60, 29, 8, 59, 12, 37, 63, 24, 46, 3, 37, 6, 52, 26, 32, 20, 36, 9, 22, 59, 18, 35, 51, 14, 57, 17, 24, 12, 44, 56, 0, 30, 13, 59, 20, 49, 17, 54, 43, 6, 34, 46, 17, 58, 36, 0, 34, 29, 54, 25, 2, 36, 15, 60, 6, 37, 46, 4, 50, 9, 45 },
+     { 19, 59, 48, 3, 24, 60, 44, 22, 34, 51, 15, 45, 41, 5, 33, 47, 0, 37, 12, 55, 25, 54, 8, 57, 0, 47, 18, 34, 49, 15, 55, 24, 40, 20, 8, 35, 53, 13, 41, 18, 0, 59, 22, 33, 4, 52, 8, 60, 24, 36, 31, 56, 45, 26, 10, 43, 15, 56, 36, 4, 51, 14, 39, 30, 12, 55, 36, 2, 39, 49, 4, 44, 17, 0, 32, 13, 53, 35, 59, 17, 62, 0, 55, 24, 52, 38, 31, 6, 42, 19, 29, 40, 4, 54, 33, 5, 16, 27, 52, 37, 23, 55, 7, 37, 0, 39, 23, 49, 4, 53, 31, 15, 59, 10, 50, 4, 60, 34, 48, 7, 31, 49, 27, 14, 62, 22, 53, 29 },
+     { 46, 21, 14, 51, 36, 17, 7, 57, 10, 32, 3, 37, 22, 60, 39, 18, 56, 20, 42, 3, 36, 10, 44, 26, 41, 29, 53, 27, 2, 39, 30, 52, 0, 59, 15, 48, 23, 61, 6, 58, 37, 12, 40, 49, 16, 39, 20, 44, 0, 62, 8, 21, 3, 59, 23, 32, 49, 31, 12, 44, 22, 59, 18, 50, 24, 7, 43, 52, 15, 23, 41, 26, 51, 28, 55, 39, 21, 27, 10, 42, 12, 45, 27, 47, 3, 15, 63, 26, 55, 0, 60, 26, 45, 18, 62, 38, 58, 49, 8, 47, 4, 33, 46, 29, 57, 13, 56, 16, 59, 21, 5, 47, 23, 39, 18, 44, 13, 22, 28, 53, 19, 0, 58, 32, 41, 7, 26, 13 },
+     { 0, 56, 34, 28, 11, 55, 31, 47, 26, 41, 56, 13, 53, 28, 11, 49, 7, 52, 32, 61, 50, 22, 63, 17, 13, 56, 7, 19, 43, 62, 10, 21, 37, 32, 43, 4, 38, 19, 44, 25, 31, 54, 5, 23, 61, 30, 53, 12, 35, 22, 43, 53, 37, 48, 7, 62, 20, 2, 61, 41, 8, 34, 47, 9, 63, 34, 28, 10, 55, 33, 14, 57, 7, 47, 9, 61, 4, 49, 31, 50, 21, 38, 8, 16, 57, 44, 33, 5, 49, 36, 12, 50, 7, 34, 10, 25, 2, 22, 36, 15, 26, 61, 18, 9, 22, 46, 32, 8, 27, 37, 44, 30, 55, 3, 62, 24, 38, 56, 5, 45, 38, 24, 43, 10, 19, 54, 39, 61 },
+     { 41, 30, 8, 63, 43, 23, 38, 3, 62, 19, 8, 49, 25, 1, 58, 30, 23, 40, 9, 28, 18, 40, 6, 38, 49, 22, 35, 59, 8, 27, 50, 5, 56, 17, 11, 50, 30, 9, 55, 2, 51, 19, 34, 47, 9, 41, 6, 26, 48, 57, 14, 28, 17, 12, 39, 13, 37, 46, 25, 19, 54, 27, 1, 37, 16, 45, 20, 60, 1, 48, 20, 38, 31, 22, 42, 15, 19, 44, 1, 61, 6, 34, 56, 40, 29, 10, 20, 46, 13, 22, 41, 23, 59, 42, 30, 51, 45, 13, 63, 53, 42, 12, 51, 38, 62, 2, 26, 41, 50, 1, 61, 10, 19, 42, 31, 8, 49, 32, 12, 63, 9, 52, 16, 56, 36, 2, 31, 16 },
+     { 52, 5, 47, 20, 1, 53, 12, 50, 16, 35, 43, 21, 33, 43, 16, 44, 3, 59, 14, 46, 1, 30, 60, 33, 2, 45, 12, 42, 31, 47, 14, 33, 46, 25, 55, 27, 60, 36, 16, 42, 14, 46, 26, 1, 55, 15, 63, 32, 2, 38, 5, 47, 33, 61, 30, 52, 4, 57, 6, 38, 11, 43, 61, 24, 52, 3, 31, 22, 42, 10, 62, 3, 59, 11, 35, 57, 33, 54, 24, 14, 29, 48, 18, 2, 60, 41, 53, 24, 32, 62, 3, 53, 15, 1, 55, 17, 32, 40, 6, 31, 1, 40, 28, 5, 35, 52, 19, 63, 13, 33, 17, 41, 52, 26, 15, 57, 1, 20, 42, 17, 35, 27, 48, 5, 25, 50, 44, 11 },
+     { 35, 25, 38, 57, 33, 17, 40, 6, 59, 27, 54, 5, 61, 10, 52, 26, 36, 19, 51, 35, 57, 48, 11, 20, 54, 25, 61, 16, 1, 58, 24, 61, 3, 39, 7, 47, 1, 22, 49, 28, 63, 10, 58, 32, 17, 36, 45, 19, 51, 29, 59, 10, 50, 1, 23, 42, 18, 29, 51, 21, 56, 32, 14, 5, 40, 58, 47, 13, 54, 35, 29, 45, 18, 52, 26, 2, 38, 8, 46, 36, 58, 11, 52, 35, 17, 28, 1, 58, 9, 39, 17, 28, 37, 48, 20, 9, 57, 24, 50, 19, 58, 16, 48, 25, 43, 11, 35, 6, 45, 24, 56, 4, 36, 7, 47, 35, 52, 28, 59, 30, 2, 61, 21, 33, 63, 12, 18, 59 },
+     { 3, 49, 15, 10, 27, 61, 25, 45, 30, 0, 14, 47, 31, 38, 17, 62, 7, 55, 27, 4, 15, 24, 42, 52, 10, 34, 5, 51, 36, 18, 41, 11, 35, 21, 62, 13, 33, 57, 8, 35, 5, 40, 21, 43, 52, 3, 24, 56, 11, 16, 33, 25, 41, 20, 55, 8, 60, 35, 15, 48, 2, 57, 30, 49, 18, 25, 6, 39, 17, 57, 7, 25, 43, 5, 49, 16, 62, 22, 55, 4, 25, 43, 23, 7, 50, 11, 37, 48, 14, 51, 33, 57, 7, 27, 39, 46, 4, 29, 11, 43, 34, 56, 7, 60, 20, 54, 30, 57, 22, 49, 9, 33, 54, 14, 63, 23, 6, 43, 10, 40, 50, 13, 44, 8, 38, 33, 46, 23 },
+     { 55, 39, 22, 50, 44, 4, 36, 9, 52, 23, 37, 59, 21, 2, 46, 13, 31, 41, 11, 45, 62, 29, 6, 37, 19, 48, 30, 23, 44, 7, 53, 28, 54, 16, 41, 29, 44, 18, 52, 24, 60, 15, 48, 7, 27, 59, 9, 34, 42, 54, 7, 63, 4, 46, 31, 27, 45, 0, 40, 26, 34, 17, 37, 10, 53, 29, 36, 50, 2, 27, 51, 11, 61, 37, 23, 41, 30, 7, 18, 50, 39, 14, 63, 32, 45, 61, 19, 30, 25, 44, 2, 47, 23, 63, 11, 34, 59, 37, 60, 3, 22, 14, 44, 30, 15, 0, 47, 15, 3, 38, 61, 20, 27, 45, 11, 39, 51, 16, 55, 3, 22, 54, 29, 58, 1, 57, 6, 29 },
+     { 9, 17, 60, 2, 34, 56, 20, 62, 39, 12, 49, 6, 29, 56, 34, 48, 0, 58, 22, 38, 18, 43, 56, 0, 63, 14, 55, 3, 59, 31, 15, 45, 0, 49, 6, 58, 3, 38, 12, 45, 0, 37, 29, 57, 13, 39, 30, 49, 0, 23, 44, 36, 16, 57, 13, 54, 11, 24, 63, 9, 53, 7, 62, 42, 0, 59, 15, 23, 63, 34, 40, 16, 32, 0, 53, 12, 48, 28, 59, 33, 0, 53, 9, 27, 3, 22, 54, 5, 56, 9, 61, 13, 42, 14, 52, 19, 0, 21, 47, 27, 53, 36, 3, 50, 39, 58, 25, 40, 53, 28, 12, 50, 0, 59, 32, 2, 21, 34, 26, 46, 37, 7, 18, 47, 24, 14, 53, 42 },
+     { 61, 32, 13, 54, 29, 7, 46, 13, 28, 57, 18, 41, 53, 15, 9, 39, 24, 49, 33, 3, 53, 9, 26, 32, 40, 28, 46, 39, 25, 9, 56, 21, 63, 37, 26, 22, 51, 27, 17, 56, 31, 53, 4, 43, 22, 46, 12, 18, 60, 40, 20, 26, 50, 21, 39, 5, 49, 33, 16, 44, 22, 46, 20, 32, 24, 45, 8, 43, 12, 46, 4, 48, 56, 20, 29, 58, 3, 40, 10, 42, 31, 21, 47, 41, 56, 38, 15, 42, 36, 27, 20, 33, 55, 3, 26, 44, 31, 54, 12, 35, 9, 63, 28, 10, 21, 32, 9, 60, 17, 8, 43, 29, 40, 16, 36, 48, 60, 7, 57, 14, 62, 31, 42, 15, 36, 40, 20, 26 },
+     { 0, 37, 47, 23, 41, 18, 32, 48, 1, 35, 8, 25, 4, 26, 63, 20, 54, 8, 16, 61, 35, 23, 51, 15, 58, 7, 12, 20, 50, 34, 42, 4, 38, 10, 32, 47, 8, 60, 41, 20, 9, 25, 50, 19, 62, 1, 37, 56, 28, 8, 53, 11, 3, 58, 34, 43, 19, 60, 38, 4, 58, 31, 3, 51, 11, 55, 38, 30, 21, 58, 19, 26, 9, 44, 36, 13, 46, 20, 62, 24, 13, 60, 5, 28, 12, 34, 7, 59, 0, 53, 45, 6, 38, 30, 50, 7, 62, 16, 41, 5, 46, 18, 55, 42, 51, 5, 45, 23, 34, 48, 19, 58, 5, 25, 54, 19, 13, 41, 28, 21, 0, 49, 10, 60, 4, 51, 9, 45 },
+     { 19, 28, 6, 58, 10, 51, 4, 22, 55, 42, 60, 45, 34, 51, 42, 5, 30, 45, 27, 40, 13, 47, 4, 49, 21, 38, 60, 29, 2, 57, 17, 27, 52, 19, 61, 14, 30, 34, 2, 44, 63, 33, 11, 35, 16, 51, 25, 6, 14, 47, 31, 61, 37, 29, 18, 8, 52, 2, 28, 54, 13, 41, 15, 62, 35, 18, 2, 60, 6, 33, 41, 61, 31, 6, 56, 17, 34, 50, 6, 52, 44, 35, 16, 51, 59, 24, 48, 18, 31, 40, 16, 49, 21, 60, 17, 39, 10, 49, 32, 57, 24, 39, 1, 25, 18, 62, 37, 12, 56, 1, 37, 11, 52, 44, 9, 30, 47, 4, 51, 40, 55, 25, 34, 27, 56, 30, 32, 54 },
+     { 63, 40, 49, 15, 43, 26, 63, 38, 16, 20, 30, 12, 57, 14, 19, 60, 36, 12, 59, 2, 57, 17, 42, 31, 1, 44, 16, 35, 47, 11, 32, 48, 13, 43, 1, 39, 51, 12, 57, 23, 6, 40, 53, 3, 55, 31, 39, 60, 35, 44, 5, 15, 45, 1, 62, 41, 26, 14, 47, 22, 36, 27, 50, 9, 26, 47, 52, 28, 54, 16, 1, 13, 51, 39, 23, 63, 1, 30, 15, 26, 2, 57, 19, 37, 1, 44, 21, 50, 13, 63, 8, 24, 56, 1, 35, 25, 58, 20, 2, 28, 14, 51, 33, 59, 13, 30, 4, 49, 31, 24, 63, 26, 33, 3, 58, 38, 62, 24, 32, 8, 17, 45, 5, 48, 18, 3, 43, 11 },
+     { 21, 4, 24, 34, 59, 1, 37, 11, 53, 5, 47, 2, 22, 40, 32, 1, 24, 50, 21, 29, 38, 25, 63, 8, 55, 24, 53, 6, 62, 23, 59, 3, 54, 20, 58, 24, 5, 46, 15, 38, 48, 14, 27, 42, 23, 7, 46, 10, 17, 58, 25, 52, 23, 32, 49, 12, 55, 30, 40, 7, 59, 1, 56, 21, 39, 4, 23, 15, 37, 46, 55, 42, 21, 4, 48, 8, 45, 54, 37, 55, 32, 8, 46, 10, 30, 54, 4, 41, 25, 29, 36, 48, 11, 43, 14, 47, 5, 43, 53, 36, 61, 10, 45, 6, 41, 54, 27, 43, 16, 55, 6, 46, 18, 42, 23, 15, 1, 45, 12, 60, 37, 22, 62, 12, 39, 59, 16, 52 },
+     { 47, 35, 56, 7, 19, 46, 31, 50, 33, 24, 61, 35, 50, 7, 53, 44, 55, 6, 46, 10, 52, 5, 21, 43, 36, 10, 18, 41, 26, 37, 8, 29, 40, 36, 9, 49, 34, 26, 61, 21, 7, 59, 18, 62, 29, 54, 20, 32, 51, 0, 40, 10, 55, 6, 20, 36, 9, 61, 5, 51, 44, 19, 33, 43, 13, 57, 40, 63, 8, 24, 29, 10, 60, 34, 27, 40, 25, 18, 10, 42, 21, 49, 26, 62, 38, 12, 33, 61, 5, 57, 2, 19, 54, 28, 62, 22, 38, 31, 16, 7, 22, 47, 29, 17, 35, 8, 20, 51, 2, 40, 22, 50, 13, 61, 28, 53, 35, 20, 56, 30, 2, 53, 14, 41, 23, 34, 8, 31 },
+     { 12, 2, 42, 29, 52, 13, 21, 8, 55, 14, 41, 17, 28, 58, 23, 11, 17, 36, 31, 62, 17, 34, 50, 14, 28, 61, 33, 52, 2, 51, 17, 45, 7, 25, 62, 30, 18, 55, 0, 42, 30, 35, 45, 1, 12, 48, 3, 63, 21, 36, 30, 48, 19, 59, 43, 27, 46, 17, 34, 25, 12, 29, 53, 6, 48, 31, 11, 34, 49, 3, 36, 50, 19, 47, 14, 61, 11, 36, 58, 4, 60, 14, 39, 22, 6, 52, 15, 35, 17, 46, 31, 42, 9, 34, 3, 52, 12, 60, 26, 56, 40, 2, 53, 23, 57, 38, 62, 14, 36, 59, 10, 31, 39, 6, 49, 9, 41, 26, 5, 48, 43, 27, 33, 58, 1, 50, 25, 57 },
+     { 61, 37, 15, 61, 3, 39, 58, 43, 26, 0, 44, 10, 47, 3, 37, 63, 28, 43, 13, 39, 3, 57, 30, 59, 0, 48, 5, 43, 13, 22, 60, 33, 55, 15, 42, 4, 52, 10, 45, 13, 54, 4, 24, 49, 37, 26, 41, 14, 42, 9, 61, 13, 38, 23, 3, 53, 0, 58, 21, 42, 63, 10, 17, 61, 25, 0, 58, 28, 17, 44, 57, 12, 27, 0, 55, 5, 52, 28, 23, 47, 29, 0, 43, 17, 58, 28, 47, 23, 55, 10, 58, 23, 51, 40, 18, 33, 45, 0, 49, 8, 32, 61, 19, 48, 0, 26, 7, 47, 29, 18, 44, 0, 56, 34, 20, 59, 15, 51, 37, 18, 10, 52, 7, 20, 46, 9, 38, 17 },
+     { 6, 27, 48, 23, 45, 29, 5, 18, 38, 62, 27, 56, 20, 32, 15, 9, 48, 0, 54, 22, 45, 20, 7, 41, 23, 39, 19, 27, 58, 31, 44, 0, 12, 50, 23, 56, 20, 39, 32, 59, 16, 52, 33, 9, 57, 22, 6, 58, 28, 50, 24, 2, 56, 35, 16, 45, 32, 38, 15, 54, 2, 38, 46, 22, 35, 45, 20, 5, 52, 25, 7, 35, 59, 32, 22, 43, 38, 3, 51, 16, 34, 53, 32, 50, 3, 40, 8, 43, 0, 39, 27, 4, 14, 61, 8, 55, 15, 41, 20, 44, 27, 13, 39, 11, 46, 42, 54, 33, 4, 52, 23, 61, 14, 25, 43, 2, 33, 11, 63, 29, 61, 17, 40, 55, 22, 62, 28, 44 },
+     { 20, 54, 8, 56, 35, 10, 63, 31, 52, 12, 48, 6, 59, 41, 52, 33, 19, 58, 25, 49, 11, 37, 47, 12, 54, 15, 56, 35, 7, 47, 16, 53, 28, 34, 5, 37, 28, 8, 48, 3, 28, 38, 18, 61, 16, 43, 53, 32, 4, 17, 47, 27, 44, 8, 63, 10, 25, 49, 6, 37, 24, 52, 32, 3, 50, 12, 41, 56, 38, 14, 62, 20, 40, 16, 53, 31, 18, 63, 41, 9, 59, 7, 13, 25, 57, 20, 63, 26, 53, 18, 48, 62, 30, 46, 21, 25, 58, 29, 36, 4, 55, 34, 6, 60, 31, 16, 21, 12, 58, 38, 9, 29, 47, 7, 52, 30, 57, 44, 22, 0, 35, 45, 3, 31, 14, 36, 0, 51 },
+     { 42, 14, 33, 24, 16, 49, 40, 2, 22, 33, 16, 36, 25, 1, 21, 61, 38, 8, 33, 4, 62, 26, 29, 60, 6, 46, 30, 11, 63, 4, 36, 40, 19, 57, 46, 11, 41, 63, 22, 25, 58, 10, 46, 2, 34, 27, 11, 38, 56, 34, 12, 53, 18, 33, 41, 51, 13, 28, 60, 20, 47, 14, 29, 59, 16, 62, 8, 22, 32, 47, 9, 49, 2, 44, 7, 12, 45, 6, 20, 27, 45, 24, 62, 42, 36, 11, 33, 15, 37, 7, 32, 10, 37, 1, 35, 50, 6, 11, 63, 24, 52, 15, 50, 24, 3, 37, 56, 27, 34, 22, 49, 16, 36, 62, 17, 39, 4, 15, 54, 24, 50, 8, 58, 26, 49, 54, 11, 30 },
+     { 4, 59, 41, 1, 53, 12, 25, 45, 59, 7, 51, 39, 54, 14, 46, 4, 27, 53, 16, 44, 18, 51, 1, 32, 25, 2, 50, 40, 20, 54, 24, 9, 62, 2, 27, 60, 1, 17, 36, 50, 6, 40, 30, 55, 41, 19, 49, 1, 21, 60, 40, 5, 62, 1, 22, 30, 57, 4, 43, 31, 1, 55, 40, 7, 27, 37, 30, 54, 1, 19, 42, 30, 56, 26, 62, 49, 24, 57, 37, 56, 2, 39, 16, 5, 30, 55, 3, 49, 60, 23, 56, 44, 17, 52, 13, 42, 28, 48, 18, 45, 9, 37, 21, 41, 58, 10, 48, 1, 63, 5, 41, 57, 2, 24, 12, 48, 27, 42, 32, 46, 13, 38, 19, 34, 5, 41, 25, 60 },
+     { 39, 28, 21, 46, 32, 57, 36, 9, 19, 42, 4, 29, 11, 43, 30, 49, 13, 42, 35, 56, 9, 39, 15, 52, 36, 61, 18, 26, 45, 14, 31, 48, 21, 43, 14, 33, 49, 54, 14, 44, 21, 62, 13, 23, 8, 62, 15, 51, 44, 7, 30, 37, 20, 42, 56, 7, 39, 18, 50, 11, 61, 9, 19, 43, 57, 2, 48, 11, 39, 60, 28, 4, 37, 17, 35, 1, 33, 11, 31, 14, 48, 19, 35, 51, 46, 21, 44, 29, 12, 41, 2, 22, 58, 26, 54, 4, 59, 38, 2, 33, 57, 1, 63, 13, 28, 51, 15, 40, 18, 45, 8, 30, 43, 37, 54, 19, 8, 59, 21, 6, 60, 29, 55, 10, 63, 15, 47, 17 },
+     { 3, 50, 10, 62, 18, 5, 27, 49, 60, 23, 55, 18, 62, 24, 56, 10, 59, 28, 2, 23, 34, 59, 43, 20, 10, 42, 8, 49, 1, 37, 57, 6, 51, 29, 53, 7, 23, 31, 5, 32, 51, 0, 35, 54, 45, 31, 5, 26, 36, 24, 55, 15, 48, 29, 14, 48, 26, 60, 21, 41, 36, 26, 50, 33, 14, 44, 17, 24, 52, 15, 46, 23, 54, 6, 47, 21, 60, 50, 4, 53, 29, 61, 8, 23, 1, 60, 19, 6, 53, 16, 47, 34, 6, 39, 16, 31, 12, 20, 53, 22, 30, 43, 25, 46, 35, 6, 44, 32, 53, 26, 55, 19, 11, 59, 5, 33, 51, 1, 35, 53, 25, 3, 42, 23, 44, 32, 7, 53 },
+     { 22, 44, 37, 6, 26, 51, 38, 0, 34, 13, 31, 46, 3, 37, 6, 19, 40, 21, 47, 63, 12, 5, 29, 55, 22, 58, 34, 28, 60, 22, 11, 41, 17, 38, 9, 44, 59, 39, 56, 19, 11, 47, 25, 15, 3, 39, 57, 17, 61, 11, 46, 3, 58, 9, 54, 35, 2, 34, 8, 45, 15, 56, 5, 23, 53, 33, 63, 35, 4, 59, 10, 51, 13, 61, 29, 41, 15, 25, 43, 19, 40, 10, 54, 33, 41, 12, 38, 51, 31, 26, 61, 9, 30, 45, 24, 62, 49, 40, 10, 61, 14, 49, 5, 17, 54, 20, 60, 23, 3, 13, 35, 50, 32, 23, 46, 27, 38, 63, 16, 12, 39, 48, 18, 51, 1, 27, 56, 35 },
+     { 63, 15, 30, 55, 43, 14, 57, 17, 53, 44, 7, 48, 26, 50, 32, 60, 0, 53, 14, 31, 50, 24, 46, 0, 38, 13, 4, 52, 16, 45, 30, 59, 0, 25, 55, 35, 16, 10, 26, 42, 58, 29, 60, 38, 50, 22, 28, 47, 0, 50, 28, 19, 33, 39, 11, 44, 16, 52, 24, 59, 3, 38, 27, 51, 0, 21, 7, 42, 26, 34, 21, 40, 33, 18, 39, 3, 54, 38, 8, 59, 0, 44, 27, 15, 58, 28, 57, 9, 43, 0, 36, 50, 20, 59, 8, 34, 0, 27, 47, 7, 36, 19, 56, 32, 0, 38, 11, 29, 62, 47, 6, 61, 0, 41, 14, 56, 10, 23, 45, 31, 57, 8, 36, 13, 58, 38, 11, 19 },
+     { 0, 34, 12, 47, 21, 2, 40, 30, 11, 25, 61, 20, 40, 15, 35, 22, 45, 36, 7, 41, 17, 57, 9, 48, 32, 62, 44, 24, 35, 3, 54, 13, 33, 63, 19, 4, 48, 22, 62, 2, 37, 8, 33, 6, 20, 52, 9, 32, 43, 13, 39, 63, 25, 4, 49, 23, 62, 32, 9, 30, 48, 18, 63, 12, 46, 29, 58, 13, 48, 8, 57, 31, 0, 51, 9, 58, 12, 22, 47, 29, 35, 22, 49, 5, 46, 4, 34, 20, 63, 24, 56, 11, 41, 3, 51, 19, 56, 35, 17, 58, 28, 42, 9, 45, 59, 26, 51, 42, 17, 36, 25, 15, 53, 21, 44, 3, 30, 55, 5, 50, 21, 28, 61, 32, 6, 49, 28, 46 },
+     { 58, 42, 60, 4, 31, 59, 22, 63, 35, 38, 9, 54, 1, 57, 8, 51, 16, 58, 27, 53, 3, 38, 30, 15, 27, 6, 19, 56, 10, 50, 21, 36, 47, 5, 43, 28, 51, 32, 13, 46, 18, 54, 16, 43, 63, 12, 36, 59, 22, 34, 5, 52, 17, 59, 27, 41, 0, 19, 55, 37, 13, 43, 6, 34, 41, 10, 36, 55, 19, 44, 3, 16, 58, 27, 49, 25, 32, 62, 17, 55, 13, 63, 18, 52, 25, 37, 17, 48, 13, 32, 5, 46, 28, 37, 14, 43, 25, 5, 51, 39, 3, 52, 33, 22, 8, 40, 12, 4, 57, 9, 46, 39, 28, 58, 13, 62, 17, 42, 19, 36, 0, 47, 16, 43, 24, 21, 54, 13 },
+     { 25, 9, 23, 50, 36, 8, 45, 14, 3, 51, 16, 28, 44, 12, 42, 29, 4, 26, 10, 47, 22, 61, 18, 54, 51, 39, 46, 13, 41, 26, 58, 7, 18, 39, 12, 57, 15, 1, 52, 27, 41, 23, 48, 1, 27, 45, 18, 2, 57, 26, 55, 8, 43, 31, 6, 58, 14, 51, 40, 5, 61, 31, 24, 54, 17, 60, 22, 1, 39, 30, 53, 45, 36, 13, 43, 5, 45, 2, 37, 6, 34, 42, 2, 39, 10, 62, 7, 54, 40, 18, 60, 15, 52, 21, 63, 8, 55, 46, 15, 30, 23, 13, 62, 16, 50, 24, 58, 31, 48, 21, 34, 2, 49, 7, 31, 37, 26, 48, 9, 61, 40, 11, 52, 2, 60, 40, 4, 37 },
+     { 52, 28, 39, 16, 54, 19, 29, 55, 42, 20, 58, 33, 24, 63, 18, 55, 39, 62, 43, 34, 12, 40, 6, 35, 2, 25, 8, 62, 34, 1, 31, 42, 61, 27, 53, 24, 40, 61, 34, 8, 59, 4, 30, 56, 40, 6, 53, 42, 10, 48, 16, 37, 12, 46, 21, 36, 47, 11, 28, 45, 22, 10, 57, 2, 49, 31, 14, 44, 61, 11, 25, 6, 23, 63, 18, 36, 28, 56, 20, 51, 11, 48, 27, 56, 32, 22, 45, 30, 2, 42, 27, 39, 1, 44, 23, 31, 38, 22, 11, 61, 43, 54, 4, 47, 35, 2, 44, 16, 28, 54, 12, 62, 18, 43, 10, 52, 1, 58, 33, 15, 29, 56, 20, 34, 9, 30, 48, 17 },
+     { 46, 2, 56, 11, 41, 1, 49, 6, 27, 47, 2, 48, 5, 32, 37, 3, 13, 19, 32, 1, 55, 28, 60, 17, 43, 59, 32, 20, 49, 16, 55, 23, 14, 46, 2, 36, 6, 30, 20, 49, 12, 47, 35, 14, 21, 60, 29, 14, 35, 24, 46, 1, 56, 29, 53, 8, 33, 23, 56, 1, 35, 46, 20, 39, 26, 4, 53, 28, 17, 38, 60, 34, 48, 9, 55, 15, 46, 7, 41, 31, 60, 24, 16, 36, 1, 59, 19, 52, 35, 6, 55, 11, 59, 33, 7, 57, 4, 29, 48, 1, 19, 26, 37, 30, 18, 63, 37, 6, 59, 1, 40, 24, 56, 33, 46, 22, 35, 7, 24, 53, 39, 5, 26, 45, 55, 18, 62, 7 },
+     { 20, 60, 29, 34, 20, 62, 33, 52, 10, 36, 13, 60, 41, 21, 50, 27, 56, 49, 8, 51, 21, 45, 11, 48, 8, 23, 53, 3, 29, 44, 5, 52, 9, 32, 50, 17, 43, 56, 3, 38, 24, 10, 62, 25, 51, 9, 33, 49, 61, 7, 30, 62, 22, 19, 2, 42, 63, 5, 49, 18, 60, 15, 52, 7, 43, 56, 23, 50, 5, 50, 2, 20, 41, 30, 1, 52, 22, 61, 14, 26, 3, 43, 53, 7, 47, 28, 11, 14, 23, 58, 33, 25, 47, 13, 50, 17, 40, 54, 34, 60, 41, 6, 59, 14, 50, 7, 25, 55, 20, 42, 51, 8, 27, 4, 16, 60, 28, 50, 44, 3, 22, 49, 63, 12, 33, 1, 43, 31 },
+     { 36, 5, 46, 8, 44, 24, 13, 39, 25, 57, 31, 18, 8, 52, 10, 45, 6, 30, 36, 24, 63, 4, 33, 26, 57, 40, 15, 56, 37, 12, 40, 25, 37, 58, 11, 63, 21, 45, 16, 60, 31, 53, 18, 33, 3, 45, 23, 0, 20, 54, 40, 15, 50, 38, 60, 16, 25, 42, 29, 38, 7, 41, 25, 62, 18, 33, 8, 35, 42, 16, 32, 56, 12, 39, 59, 19, 34, 9, 49, 38, 57, 12, 21, 50, 14, 40, 61, 44, 50, 9, 49, 19, 3, 29, 35, 62, 12, 24, 7, 18, 52, 32, 10, 46, 21, 41, 32, 11, 36, 29, 14, 34, 60, 38, 54, 11, 41, 14, 19, 57, 32, 16, 7, 41, 51, 25, 14, 57 },
+     { 53, 18, 26, 50, 15, 58, 4, 63, 17, 43, 7, 40, 61, 35, 15, 41, 23, 60, 16, 38, 14, 42, 19, 50, 0, 31, 10, 46, 27, 63, 18, 60, 0, 20, 29, 39, 8, 26, 37, 5, 42, 0, 44, 39, 57, 17, 58, 41, 28, 37, 4, 32, 9, 44, 12, 31, 54, 10, 59, 14, 27, 53, 12, 36, 0, 47, 13, 63, 21, 58, 10, 24, 50, 27, 4, 26, 44, 53, 31, 0, 18, 42, 29, 33, 57, 4, 32, 26, 0, 38, 16, 61, 41, 53, 20, 0, 42, 44, 49, 27, 10, 56, 39, 0, 57, 15, 53, 49, 3, 61, 22, 47, 17, 5, 49, 26, 2, 63, 39, 10, 47, 27, 37, 23, 4, 59, 38, 10 },
+     { 23, 39, 61, 3, 37, 28, 48, 31, 0, 34, 51, 23, 2, 26, 58, 0, 53, 11, 46, 1, 57, 29, 52, 14, 37, 61, 21, 35, 2, 49, 7, 34, 47, 55, 4, 33, 54, 13, 58, 52, 19, 50, 22, 7, 13, 29, 36, 11, 51, 17, 60, 25, 55, 4, 34, 51, 0, 35, 20, 48, 32, 3, 51, 30, 59, 28, 40, 3, 46, 29, 54, 43, 7, 62, 47, 11, 39, 4, 23, 46, 55, 8, 63, 5, 25, 37, 18, 46, 21, 56, 31, 5, 36, 8, 45, 58, 26, 15, 2, 36, 47, 21, 29, 44, 25, 34, 3, 27, 43, 10, 52, 0, 45, 30, 24, 36, 43, 18, 34, 59, 0, 52, 61, 15, 44, 19, 30, 49 },
+     { 0, 27, 12, 43, 54, 9, 22, 53, 21, 46, 15, 55, 29, 47, 20, 33, 39, 28, 59, 35, 9, 44, 5, 24, 47, 7, 52, 17, 56, 22, 30, 42, 14, 26, 45, 18, 49, 1, 24, 34, 11, 27, 55, 32, 61, 47, 2, 56, 6, 44, 13, 47, 36, 27, 58, 22, 16, 47, 40, 4, 57, 38, 21, 45, 16, 9, 56, 26, 11, 38, 0, 22, 36, 17, 33, 57, 16, 30, 62, 15, 35, 40, 20, 45, 59, 10, 54, 8, 63, 13, 52, 27, 22, 57, 28, 12, 32, 51, 55, 22, 63, 4, 16, 54, 12, 62, 45, 19, 58, 13, 32, 40, 20, 56, 7, 57, 9, 54, 6, 29, 42, 21, 8, 55, 35, 47, 6, 41 },
+     { 56, 33, 58, 32, 19, 35, 42, 6, 59, 11, 38, 5, 49, 12, 62, 7, 52, 17, 5, 25, 54, 20, 61, 31, 54, 27, 41, 11, 44, 5, 59, 12, 36, 51, 10, 61, 28, 41, 48, 9, 43, 63, 5, 40, 20, 8, 49, 26, 34, 21, 58, 1, 18, 45, 7, 39, 61, 26, 8, 50, 23, 10, 63, 5, 55, 37, 19, 49, 52, 15, 59, 47, 13, 54, 1, 25, 42, 58, 10, 48, 3, 27, 50, 1, 17, 48, 34, 41, 16, 40, 2, 45, 10, 39, 17, 61, 5, 38, 19, 9, 41, 31, 60, 38, 5, 23, 36, 8, 30, 55, 24, 63, 12, 48, 14, 51, 31, 20, 45, 25, 12, 50, 32, 2, 28, 11, 62, 14 },
+     { 44, 16, 7, 48, 1, 62, 16, 50, 27, 33, 61, 25, 17, 44, 31, 14, 22, 43, 32, 48, 18, 40, 8, 36, 3, 16, 33, 62, 23, 38, 25, 53, 2, 21, 41, 6, 22, 15, 59, 29, 16, 37, 26, 15, 52, 42, 23, 15, 54, 39, 10, 30, 53, 11, 49, 24, 2, 43, 55, 17, 34, 44, 15, 31, 24, 44, 2, 32, 7, 35, 25, 5, 40, 45, 29, 51, 6, 21, 37, 52, 24, 60, 13, 31, 53, 23, 2, 28, 49, 24, 31, 60, 20, 51, 1, 34, 48, 14, 59, 33, 50, 1, 18, 33, 48, 60, 17, 51, 39, 6, 38, 2, 35, 29, 40, 23, 1, 62, 15, 53, 37, 17, 46, 57, 40, 51, 24, 22 },
+     { 5, 37, 52, 24, 45, 13, 40, 3, 45, 9, 19, 42, 56, 4, 37, 46, 56, 2, 63, 11, 51, 1, 49, 13, 59, 45, 39, 1, 48, 15, 58, 9, 46, 31, 54, 35, 57, 38, 3, 46, 56, 4, 47, 57, 1, 30, 38, 63, 3, 46, 28, 63, 41, 14, 33, 62, 19, 32, 13, 28, 61, 1, 53, 42, 11, 60, 22, 62, 27, 42, 61, 31, 19, 8, 61, 12, 32, 55, 2, 18, 33, 12, 43, 36, 9, 62, 30, 55, 6, 58, 35, 7, 43, 29, 54, 23, 43, 30, 3, 25, 11, 45, 52, 28, 7, 14, 42, 1, 22, 50, 16, 53, 19, 59, 4, 46, 33, 41, 4, 35, 58, 5, 26, 13, 20, 2, 34, 54 },
+     { 30, 63, 21, 10, 26, 55, 29, 59, 23, 39, 53, 1, 36, 24, 59, 27, 10, 34, 23, 38, 30, 60, 22, 42, 28, 19, 9, 57, 30, 19, 43, 33, 13, 63, 3, 19, 11, 50, 31, 20, 14, 34, 10, 35, 17, 59, 7, 31, 19, 25, 50, 5, 20, 57, 29, 6, 52, 41, 4, 46, 20, 37, 26, 17, 49, 6, 39, 18, 53, 14, 3, 49, 57, 23, 34, 48, 14, 41, 28, 38, 56, 6, 58, 25, 39, 19, 43, 15, 37, 11, 47, 18, 53, 4, 37, 9, 62, 21, 53, 40, 57, 24, 13, 40, 56, 26, 47, 31, 59, 25, 45, 27, 10, 43, 21, 61, 13, 27, 48, 9, 23, 43, 31, 62, 38, 59, 9, 47 },
+     { 25, 4, 40, 60, 34, 6, 18, 36, 8, 57, 12, 30, 49, 14, 6, 54, 41, 16, 50, 6, 43, 15, 34, 4, 53, 24, 50, 35, 4, 51, 7, 55, 28, 24, 39, 44, 60, 7, 25, 62, 42, 53, 24, 61, 28, 45, 52, 12, 48, 37, 9, 35, 43, 3, 37, 48, 12, 58, 30, 52, 9, 59, 6, 57, 33, 29, 48, 4, 37, 45, 20, 34, 10, 39, 0, 60, 22, 45, 8, 63, 21, 42, 14, 49, 3, 56, 11, 46, 21, 61, 0, 42, 25, 13, 63, 17, 36, 8, 46, 16, 6, 35, 63, 0, 21, 37, 4, 57, 9, 34, 5, 61, 48, 32, 8, 37, 54, 17, 56, 30, 60, 0, 50, 16, 7, 29, 42, 17 },
+     { 32, 50, 15, 48, 2, 43, 52, 25, 47, 16, 32, 63, 21, 52, 40, 19, 0, 61, 29, 58, 20, 56, 26, 46, 12, 55, 6, 22, 62, 32, 17, 40, 0, 49, 34, 8, 27, 32, 48, 0, 21, 39, 5, 44, 12, 6, 22, 40, 0, 57, 16, 60, 23, 17, 54, 22, 36, 15, 24, 39, 19, 34, 47, 23, 0, 54, 13, 51, 24, 9, 55, 16, 52, 27, 44, 20, 4, 54, 26, 49, 0, 30, 46, 16, 29, 51, 34, 4, 52, 28, 33, 15, 57, 39, 26, 49, 0, 56, 27, 31, 48, 20, 43, 29, 53, 11, 46, 19, 41, 13, 55, 18, 0, 57, 26, 51, 2, 44, 6, 38, 14, 40, 22, 45, 36, 53, 3, 57 },
+     { 44, 12, 37, 28, 22, 57, 11, 38, 0, 51, 9, 41, 4, 29, 11, 47, 33, 45, 12, 26, 3, 36, 9, 63, 31, 16, 38, 44, 14, 47, 25, 61, 20, 58, 15, 47, 17, 57, 13, 36, 9, 51, 18, 29, 50, 36, 54, 20, 61, 27, 32, 13, 53, 44, 9, 27, 0, 63, 45, 2, 56, 10, 14, 43, 41, 28, 58, 11, 35, 60, 30, 41, 6, 63, 11, 51, 37, 32, 15, 10, 35, 53, 5, 61, 22, 7, 26, 59, 23, 9, 44, 48, 21, 3, 51, 32, 24, 41, 12, 61, 2, 55, 9, 15, 35, 58, 28, 15, 62, 30, 37, 23, 42, 29, 11, 17, 35, 24, 63, 20, 52, 28, 8, 55, 11, 23, 47, 19 },
+     { 0, 56, 8, 53, 14, 31, 61, 20, 55, 28, 62, 18, 35, 60, 25, 57, 7, 23, 39, 54, 47, 17, 43, 0, 40, 59, 29, 2, 56, 10, 37, 5, 43, 11, 29, 52, 1, 23, 54, 41, 59, 30, 55, 1, 62, 15, 33, 4, 43, 10, 47, 39, 1, 31, 40, 60, 49, 33, 7, 55, 26, 50, 31, 61, 8, 18, 21, 32, 44, 1, 25, 47, 18, 36, 30, 23, 59, 7, 40, 59, 27, 19, 38, 32, 44, 54, 40, 17, 38, 60, 27, 6, 35, 55, 10, 14, 44, 5, 50, 17, 38, 26, 42, 50, 18, 3, 44, 52, 2, 49, 7, 52, 15, 46, 62, 39, 55, 10, 31, 48, 3, 58, 33, 18, 61, 34, 13, 59 },
+     { 39, 27, 63, 20, 35, 41, 4, 45, 26, 5, 38, 13, 44, 2, 50, 17, 37, 52, 2, 13, 28, 58, 24, 51, 21, 8, 34, 48, 27, 42, 18, 51, 31, 56, 5, 36, 38, 44, 4, 17, 26, 11, 38, 23, 42, 8, 56, 39, 24, 51, 5, 56, 21, 59, 14, 6, 18, 42, 22, 35, 16, 37, 3, 25, 39, 46, 63, 5, 50, 17, 58, 8, 55, 3, 50, 12, 43, 17, 47, 2, 51, 9, 62, 12, 1, 35, 13, 50, 1, 37, 12, 51, 19, 29, 46, 59, 22, 58, 33, 45, 22, 60, 10, 32, 61, 39, 8, 33, 25, 36, 20, 60, 38, 4, 21, 5, 28, 45, 12, 18, 42, 11, 49, 1, 27, 40, 6, 30 },
+     { 24, 16, 42, 1, 50, 10, 48, 17, 33, 43, 24, 48, 21, 55, 31, 42, 10, 21, 63, 35, 49, 6, 33, 13, 41, 53, 10, 20, 60, 6, 53, 26, 12, 41, 22, 60, 14, 28, 63, 33, 49, 3, 45, 16, 48, 26, 14, 46, 18, 30, 35, 26, 8, 50, 29, 51, 25, 57, 12, 47, 53, 9, 62, 20, 54, 2, 36, 15, 40, 28, 33, 13, 38, 24, 46, 1, 29, 56, 33, 20, 44, 24, 41, 26, 57, 20, 63, 8, 30, 55, 5, 41, 62, 8, 34, 2, 37, 10, 19, 6, 37, 1, 53, 23, 5, 27, 58, 22, 43, 12, 50, 26, 9, 34, 54, 32, 49, 1, 59, 37, 22, 46, 25, 36, 51, 15, 54, 46 },
+     { 52, 7, 45, 33, 26, 58, 14, 60, 7, 54, 3, 58, 8, 34, 14, 5, 59, 30, 18, 44, 8, 22, 48, 62, 3, 26, 55, 38, 23, 16, 39, 1, 62, 24, 49, 9, 53, 19, 46, 7, 19, 60, 31, 58, 2, 34, 53, 7, 59, 2, 62, 42, 46, 19, 36, 11, 44, 4, 38, 28, 1, 43, 32, 51, 12, 29, 56, 22, 52, 2, 62, 49, 22, 60, 14, 35, 63, 5, 25, 57, 14, 53, 4, 46, 18, 31, 42, 22, 47, 20, 58, 31, 16, 43, 23, 54, 30, 42, 52, 57, 29, 49, 30, 13, 45, 48, 16, 55, 6, 63, 1, 44, 14, 58, 19, 47, 15, 24, 51, 34, 6, 55, 5, 63, 20, 41, 21, 9 },
+     { 30, 62, 18, 55, 5, 23, 39, 29, 49, 30, 15, 36, 28, 46, 60, 25, 39, 46, 4, 32, 61, 40, 15, 30, 36, 45, 14, 2, 49, 33, 57, 45, 18, 32, 3, 45, 30, 2, 35, 52, 40, 27, 13, 21, 38, 63, 20, 28, 37, 23, 16, 10, 13, 55, 2, 62, 21, 32, 60, 17, 58, 23, 5, 40, 16, 48, 7, 45, 10, 26, 43, 19, 6, 31, 52, 21, 39, 16, 48, 9, 37, 28, 36, 55, 7, 48, 3, 59, 15, 45, 25, 1, 53, 13, 47, 7, 62, 15, 4, 25, 12, 41, 18, 60, 38, 11, 34, 19, 39, 31, 29, 56, 23, 42, 3, 27, 60, 41, 8, 16, 61, 29, 43, 9, 32, 2, 60, 34 },
+     { 3, 38, 13, 37, 52, 44, 2, 19, 12, 42, 63, 19, 40, 1, 20, 50, 12, 55, 15, 56, 27, 1, 54, 11, 57, 18, 32, 63, 44, 4, 29, 13, 37, 61, 35, 16, 42, 57, 12, 22, 6, 55, 43, 10, 50, 5, 44, 11, 48, 52, 34, 58, 28, 41, 38, 30, 7, 52, 11, 49, 30, 14, 45, 27, 59, 34, 21, 38, 32, 58, 11, 36, 56, 42, 9, 41, 3, 54, 31, 42, 0, 60, 16, 11, 39, 24, 52, 33, 6, 36, 10, 40, 32, 60, 26, 20, 39, 28, 47, 34, 63, 8, 54, 3, 24, 56, 0, 51, 13, 47, 16, 40, 7, 35, 52, 11, 36, 4, 57, 30, 39, 13, 18, 50, 58, 28, 12, 48 },
+     { 57, 24, 49, 21, 10, 31, 61, 36, 56, 0, 22, 53, 11, 56, 32, 7, 36, 27, 41, 9, 46, 19, 34, 42, 25, 7, 50, 9, 28, 21, 54, 8, 50, 7, 27, 59, 10, 25, 48, 62, 37, 0, 33, 58, 25, 18, 32, 61, 0, 15, 45, 5, 50, 3, 23, 55, 47, 17, 40, 6, 60, 34, 53, 8, 41, 0, 61, 13, 54, 4, 46, 28, 0, 17, 48, 27, 58, 13, 23, 61, 33, 21, 50, 30, 62, 8, 14, 29, 56, 27, 61, 49, 17, 2, 44, 11, 51, 0, 59, 17, 40, 20, 32, 47, 36, 21, 42, 28, 60, 4, 54, 10, 59, 17, 30, 62, 21, 43, 26, 48, 0, 56, 36, 25, 8, 44, 39, 17 },
+     { 10, 42, 4, 59, 27, 47, 8, 23, 51, 32, 45, 6, 37, 26, 48, 43, 62, 0, 21, 53, 38, 12, 51, 5, 60, 47, 24, 37, 59, 15, 35, 47, 22, 55, 0, 50, 21, 40, 6, 29, 15, 52, 24, 8, 41, 55, 13, 29, 40, 56, 24, 31, 19, 33, 61, 15, 0, 35, 24, 42, 21, 2, 19, 57, 24, 15, 30, 50, 20, 25, 40, 16, 57, 34, 61, 8, 29, 45, 6, 49, 11, 47, 2, 44, 19, 57, 38, 50, 12, 42, 21, 4, 35, 52, 28, 56, 23, 36, 13, 45, 4, 52, 27, 14, 6, 62, 9, 45, 21, 37, 25, 46, 33, 49, 0, 44, 7, 53, 13, 19, 53, 31, 3, 47, 15, 56, 22, 51 },
+     { 35, 28, 53, 32, 1, 16, 54, 40, 9, 17, 25, 58, 14, 59, 3, 22, 16, 51, 31, 5, 23, 58, 28, 17, 35, 20, 0, 42, 11, 52, 3, 31, 41, 17, 43, 13, 32, 54, 18, 60, 32, 45, 17, 49, 2, 36, 51, 22, 7, 36, 9, 63, 48, 12, 46, 26, 43, 28, 63, 13, 48, 37, 51, 33, 5, 47, 55, 9, 42, 63, 7, 51, 24, 12, 37, 19, 55, 34, 18, 38, 15, 28, 54, 34, 5, 43, 22, 0, 48, 14, 54, 24, 58, 9, 38, 5, 32, 55, 21, 30, 49, 9, 59, 43, 30, 51, 35, 26, 7, 53, 2, 22, 14, 27, 57, 18, 38, 24, 33, 45, 10, 41, 20, 60, 37, 5, 32, 0 },
+     { 63, 19, 15, 40, 62, 35, 14, 28, 46, 61, 4, 49, 35, 10, 29, 54, 33, 8, 45, 62, 37, 1, 43, 55, 10, 52, 61, 30, 19, 40, 25, 62, 11, 38, 27, 58, 36, 3, 46, 8, 39, 4, 62, 28, 47, 20, 4, 54, 47, 27, 43, 1, 21, 38, 8, 58, 10, 54, 4, 56, 9, 26, 12, 39, 60, 27, 18, 37, 1, 31, 35, 5, 45, 50, 2, 43, 26, 1, 59, 23, 56, 40, 7, 26, 58, 17, 32, 63, 25, 39, 7, 31, 45, 19, 63, 15, 48, 8, 37, 61, 16, 34, 1, 56, 18, 3, 15, 58, 49, 32, 63, 41, 55, 5, 40, 22, 50, 6, 59, 2, 63, 23, 52, 11, 26, 61, 44, 23 },
+     { 11, 56, 46, 6, 22, 43, 58, 3, 34, 21, 38, 30, 18, 44, 52, 13, 41, 57, 17, 28, 14, 49, 25, 7, 33, 39, 26, 6, 56, 48, 1, 20, 56, 5, 46, 9, 19, 51, 30, 25, 56, 21, 35, 14, 57, 42, 16, 33, 10, 57, 17, 59, 41, 25, 53, 37, 20, 40, 30, 18, 31, 62, 44, 22, 3, 44, 11, 48, 23, 53, 18, 60, 29, 22, 62, 15, 53, 47, 10, 41, 3, 19, 52, 36, 13, 46, 10, 35, 3, 61, 41, 16, 1, 50, 26, 42, 18, 46, 2, 25, 54, 20, 39, 23, 47, 31, 41, 12, 38, 17, 8, 19, 31, 48, 12, 61, 9, 54, 29, 35, 15, 38, 6, 43, 34, 14, 7, 47 },
+     { 39, 2, 33, 26, 53, 8, 18, 50, 41, 12, 53, 1, 63, 24, 19, 39, 2, 24, 47, 10, 60, 38, 19, 63, 48, 4, 15, 45, 32, 14, 60, 36, 29, 53, 23, 63, 34, 12, 61, 1, 43, 11, 53, 30, 1, 26, 60, 45, 23, 39, 3, 29, 12, 50, 4, 16, 51, 3, 45, 36, 50, 1, 16, 54, 35, 14, 57, 30, 58, 9, 46, 14, 41, 10, 32, 38, 4, 30, 21, 51, 32, 63, 25, 1, 60, 27, 53, 18, 51, 22, 28, 55, 34, 12, 40, 3, 60, 29, 57, 41, 6, 44, 11, 53, 8, 61, 24, 57, 1, 28, 44, 59, 36, 3, 34, 25, 41, 31, 16, 44, 22, 47, 28, 58, 1, 49, 54, 29 },
+     { 58, 25, 50, 13, 38, 30, 60, 24, 6, 57, 27, 42, 9, 45, 6, 61, 30, 50, 4, 34, 29, 3, 46, 13, 22, 42, 58, 28, 9, 39, 23, 44, 7, 15, 44, 2, 40, 15, 47, 41, 23, 37, 7, 59, 38, 11, 34, 6, 62, 14, 52, 35, 55, 19, 32, 61, 33, 24, 57, 6, 22, 59, 29, 7, 49, 25, 40, 3, 17, 39, 27, 52, 0, 55, 16, 57, 24, 61, 36, 6, 29, 12, 48, 39, 20, 44, 6, 40, 33, 5, 48, 10, 57, 36, 22, 51, 33, 9, 24, 12, 62, 29, 50, 35, 14, 43, 5, 33, 47, 52, 13, 23, 10, 51, 56, 16, 46, 1, 49, 4, 61, 9, 52, 18, 31, 21, 36, 17 },
+     { 19, 42, 9, 48, 2, 44, 11, 37, 48, 20, 33, 16, 55, 35, 49, 15, 37, 20, 59, 16, 53, 22, 56, 31, 50, 11, 34, 54, 16, 51, 4, 49, 33, 53, 21, 28, 56, 24, 31, 9, 52, 16, 48, 24, 44, 13, 51, 20, 31, 49, 18, 6, 34, 2, 44, 14, 47, 8, 15, 43, 13, 41, 33, 52, 20, 61, 7, 51, 34, 62, 4, 20, 36, 33, 43, 8, 46, 13, 53, 17, 45, 42, 9, 31, 52, 11, 30, 56, 13, 59, 17, 44, 27, 6, 62, 11, 43, 17, 49, 38, 26, 2, 16, 27, 58, 21, 54, 18, 26, 5, 35, 61, 43, 27, 7, 39, 14, 58, 37, 55, 20, 33, 13, 40, 62, 10, 55, 5 },
+     { 51, 14, 61, 29, 59, 20, 55, 31, 0, 49, 11, 60, 3, 26, 22, 56, 0, 40, 12, 43, 41, 8, 36, 0, 17, 57, 24, 2, 46, 26, 61, 18, 0, 38, 12, 59, 6, 49, 3, 57, 19, 63, 5, 33, 18, 54, 28, 56, 0, 43, 26, 46, 63, 27, 56, 22, 27, 54, 38, 28, 63, 24, 10, 45, 0, 31, 42, 21, 12, 25, 44, 49, 59, 6, 26, 50, 3, 34, 27, 59, 0, 35, 62, 16, 4, 58, 47, 0, 43, 24, 37, 2, 54, 20, 46, 31, 0, 56, 34, 5, 55, 45, 60, 37, 0, 40, 10, 38, 63, 46, 15, 20, 0, 53, 21, 62, 30, 11, 24, 27, 40, 0, 57, 26, 3, 45, 27, 35 }
+};
+
+#endif /* USE_DITHER_128128 */
+
+EAPI void
+evas_common_convert_init(void)
+{
+}
+
+EAPI Gfx_Func_Convert
+evas_common_convert_func_get(DATA8 *dest, int w, int h, int depth, DATA32 rmask, DATA32 gmask, DATA32 bmask, Convert_Pal_Mode pal_mode, int rotation)
+{
+   if ((rmask == 0) && (gmask == 0) && (bmask == 0))
+     {
+       if (depth == 8)
+         {
+#ifdef BUILD_CONVERT_8_GRY_1
+            if (pal_mode == PAL_MODE_NONE)
+              return evas_common_convert_rgba_to_8bpp_gry_256_dith;
+#endif
+#ifdef BUILD_CONVERT_8_GRY_16
+            if (pal_mode == PAL_MODE_NONE)
+              return evas_common_convert_rgba_to_8bpp_gry_16_dith;
+#endif
+#ifdef BUILD_CONVERT_8_RGB_332
+            if (pal_mode == PAL_MODE_RGB332)
+              return evas_common_convert_rgba_to_8bpp_rgb_332_dith;
+#endif
+#ifdef BUILD_CONVERT_8_RGB_666
+            if (pal_mode == PAL_MODE_RGB666)
+              return evas_common_convert_rgba_to_8bpp_rgb_666_dith;
+#endif
+#ifdef BUILD_CONVERT_8_RGB_232
+            if (pal_mode == PAL_MODE_RGB232)
+              return evas_common_convert_rgba_to_8bpp_rgb_232_dith;
+#endif
+#ifdef BUILD_CONVERT_8_RGB_222
+            if (pal_mode == PAL_MODE_RGB222)
+              return evas_common_convert_rgba_to_8bpp_rgb_222_dith;
+#endif
+#ifdef BUILD_CONVERT_8_RGB_221
+            if (pal_mode == PAL_MODE_RGB221)
+              return evas_common_convert_rgba_to_8bpp_rgb_221_dith;
+#endif
+#ifdef BUILD_CONVERT_8_RGB_121
+            if (pal_mode == PAL_MODE_RGB121)
+              return evas_common_convert_rgba_to_8bpp_rgb_121_dith;
+#endif
+#ifdef BUILD_CONVERT_8_RGB_111
+            if (pal_mode == PAL_MODE_RGB111)
+              return evas_common_convert_rgba_to_8bpp_rgb_111_dith;
+#endif
+#ifdef BUILD_CONVERT_8_GRAYSCALE_64
+         if (pal_mode == PAL_MODE_GRAY64)
+            return evas_common_convert_rgba_to_8bpp_pal_gray64;
+#endif
+         }
+       if (depth == 1)
+         {
+         }
+       if (depth == 4)
+         {
+         }
+     }
+   else
+     {
+       if (depth == 16)
+         {
+#ifdef BUILD_CONVERT_16_RGB_565
+            if ((rmask == 0x0000f800) && (gmask == 0x000007e0) && (bmask == 0x0000001f))
+              {
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+                 if (rotation == 0)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_565_dith;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_565_dith;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+                 if (rotation == 180)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_180;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_180;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+                 if (rotation == 270)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_270;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_270;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+                 if (rotation == 90)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_90;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_90;
+                   }
+#endif
+              }
+#endif
+#ifdef BUILD_CONVERT_16_BGR_565
+            if ((rmask == 0x0000001f) && (gmask == 0x000007e0) && (bmask == 0x0000f800))
+              {
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+                 if (rotation == 0)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_bgr_565_dith;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_bgr_565_dith;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+                 if (rotation == 180)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_180;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_180;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+                 if (rotation == 270)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_270;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_270;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+                 if (rotation == 90)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_90;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_90;
+                   }
+#endif
+              }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_555
+            if ((rmask == 0x00007c00) && (gmask == 0x000003e0) && (bmask == 0x0000001f))
+              {
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+                 if (rotation == 0)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_555_dith;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_555_dith;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+                 if (rotation == 180)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_180;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_180;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+                 if (rotation == 270)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_270;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_270;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+                 if (rotation == 90)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_90;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_90;
+                   }
+#endif
+              }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_444
+            if ((rmask == 0x00000f00) && (gmask == 0x000000f0) && (bmask == 0x0000000f))
+              {
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+                 if (rotation == 0)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_444_dith;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_444_dith;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+                 if (rotation == 180)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_180;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_180;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+                 if (rotation == 270)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_270;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_270;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+                 if (rotation == 90)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_90;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_90;
+                   }
+#endif
+              }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_454645
+            if ((rmask == 0x0000f000) && (gmask == 0x00000780) && (bmask == 0x0000001e))
+              {
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+                 if (rotation == 0)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_454645_dith;
+
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+                 if (rotation == 180)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_180;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_180;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+                 if (rotation == 270)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_270;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_270;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+                 if (rotation == 270)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_90;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_90;
+                   }
+#endif
+              }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_454645
+            if ((rmask == 0x0000f800) && (gmask == 0x000007e0) && (bmask == 0x0000001f))
+              {
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+                 if (rotation == 0)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_454645_dith;
+
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+                 if (rotation == 180)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_180;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_180;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+                 if (rotation == 270)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_270;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_270;
+                   }
+#endif
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+                 if (rotation == 90)
+                   {
+                      if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3)))
+                        return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_90;
+                      else
+                        return evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_90;
+                   }
+#endif
+              }
+#endif
+         }
+       if (depth == 32)
+         {
+#ifdef BUILD_CONVERT_32_RGB_8888
+            if ((rmask == 0x00ff0000) && (gmask == 0x0000ff00) && (bmask == 0x000000ff))
+              {
+#ifdef BUILD_CONVERT_32_RGB_ROT0
+                 if (rotation == 0)
+                   return evas_common_convert_rgba_to_32bpp_rgb_8888;
+#endif
+#ifdef BUILD_CONVERT_32_RGB_ROT180
+                 if (rotation == 180)
+                   return evas_common_convert_rgba_to_32bpp_rgb_8888_rot_180;
+#endif
+#ifdef BUILD_CONVERT_32_RGB_ROT270
+                 if (rotation == 270)
+                   return evas_common_convert_rgba_to_32bpp_rgb_8888_rot_270;
+#endif
+#ifdef BUILD_CONVERT_32_RGB_ROT90
+                 if (rotation == 90)
+                   return evas_common_convert_rgba_to_32bpp_rgb_8888_rot_90;
+#endif
+              }
+#endif
+#ifdef BUILD_CONVERT_32_RGBX_8888
+            if ((rmask == 0xff000000) && (gmask == 0x00ff0000) && (bmask == 0x0000ff00))
+              {
+#ifdef BUILD_CONVERT_32_RGB_ROT0
+                 if (rotation == 0)
+                   return evas_common_convert_rgba_to_32bpp_rgbx_8888;
+#endif
+#ifdef BUILD_CONVERT_32_RGB_ROT180
+                 if (rotation == 180)
+                   return evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_180;
+#endif
+#ifdef BUILD_CONVERT_32_RGB_ROT270
+                 if (rotation == 270)
+                   return evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_270;
+#endif
+#ifdef BUILD_CONVERT_32_RGB_ROT90
+                 if (rotation == 90)
+                   return evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_90;
+#endif
+              }
+#endif
+#ifdef BUILD_CONVERT_32_BGR_8888
+            if ((rmask == 0x000000ff) && (gmask == 0x0000ff00) && (bmask == 0x00ff0000))
+              {
+#ifdef BUILD_CONVERT_32_RGB_ROT0
+                 if (rotation == 0)
+                   return evas_common_convert_rgba_to_32bpp_bgr_8888;
+#endif
+#ifdef BUILD_CONVERT_32_RGB_ROT180
+                 if (rotation == 180)
+                   return evas_common_convert_rgba_to_32bpp_bgr_8888_rot_180;
+#endif
+#ifdef BUILD_CONVERT_32_RGB_ROT270
+                 if (rotation == 270)
+                   return evas_common_convert_rgba_to_32bpp_bgr_8888_rot_270;
+#endif
+#ifdef BUILD_CONVERT_32_RGB_ROT90
+                 if (rotation == 90)
+                   return evas_common_convert_rgba_to_32bpp_bgr_8888_rot_90;
+#endif
+              }
+#endif
+#ifdef BUILD_CONVERT_32_BGRX_8888
+            if ((rmask == 0x0000ff00) && (gmask == 0x00ff0000) && (bmask == 0xff000000))
+              {
+#ifdef BUILD_CONVERT_32_RGB_ROT0
+                 if (rotation == 0)
+                   return evas_common_convert_rgba_to_32bpp_bgrx_8888;
+#endif
+#ifdef BUILD_CONVERT_32_RGB_ROT180
+                 if (rotation == 180)
+                   return evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_180;
+#endif
+#ifdef BUILD_CONVERT_32_RGB_ROT270
+                 if (rotation == 270)
+                   return evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_270;
+#endif
+#ifdef BUILD_CONVERT_32_RGB_ROT90
+                 if (rotation == 90)
+                   return evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_90;
+#endif
+              }
+#endif
+#ifdef BUILD_CONVERT_32_RGB_666
+            if ((rmask == 0x0003f000) && (gmask == 0x00000fc0) && (bmask == 0x0000003f))
+              {
+#ifdef BUILD_CONVERT_32_RGB_ROT0
+                 if (rotation == 0)
+                   return evas_common_convert_rgba_to_32bpp_rgb_666;
+#endif
+#ifdef BUILD_CONVERT_32_RGB_ROT180
+//               if (rotation == 180)
+//                 return evas_common_convert_rgba_to_32bpp_rgb_8888_rot_180;
+#endif
+#ifdef BUILD_CONVERT_32_RGB_ROT270
+//               if (rotation == 270)
+//                 return evas_common_convert_rgba_to_32bpp_rgb_8888_rot_270;
+#endif
+#ifdef BUILD_CONVERT_32_RGB_ROT90
+//               if (rotation == 90)
+//                 return evas_common_convert_rgba_to_32bpp_rgb_8888_rot_90;
+#endif
+              }
+#endif
+         }
+       if (depth == 24)
+         {
+#ifdef BUILD_CONVERT_24_RGB_888
+            if ((rmask == 0x00ff0000) && (gmask == 0x0000ff00) && (bmask == 0x000000ff))
+              {
+                 if (rotation == 0)
+                   return evas_common_convert_rgba_to_24bpp_rgb_888;
+              }
+#endif
+#ifdef BUILD_CONVERT_24_RGB_666
+            if ((rmask == 0x0003f000) && (gmask == 0x00000fc0) && (bmask == 0x0000003f))
+              {
+                 if (rotation == 0)
+                   return evas_common_convert_rgba_to_24bpp_rgb_666;
+              }
+#endif
+#ifdef BUILD_CONVERT_24_BGR_888
+            if ((rmask == 0x000000ff) && (gmask == 0x0000ff00) && (bmask == 0x00ff0000))
+              {
+                 if (rotation == 0)
+                   return evas_common_convert_rgba_to_24bpp_bgr_888;
+              }
+#endif
+         }
+       INF("depth = %i mode = %i", depth, pal_mode);
+       if (depth == 8)
+         {
+#ifdef BUILD_CONVERT_8_RGB_332
+            if (pal_mode == PAL_MODE_RGB332)
+              return evas_common_convert_rgba_to_8bpp_rgb_332_dith;
+#endif
+#ifdef BUILD_CONVERT_8_RGB_666
+            if (pal_mode == PAL_MODE_RGB666)
+              return evas_common_convert_rgba_to_8bpp_rgb_666_dith;
+#endif
+#ifdef BUILD_CONVERT_8_RGB_232
+            if (pal_mode == PAL_MODE_RGB232)
+              return evas_common_convert_rgba_to_8bpp_rgb_232_dith;
+#endif
+#ifdef BUILD_CONVERT_8_RGB_222
+            if (pal_mode == PAL_MODE_RGB222)
+              return evas_common_convert_rgba_to_8bpp_rgb_222_dith;
+#endif
+#ifdef BUILD_CONVERT_8_RGB_221
+            if (pal_mode == PAL_MODE_RGB221)
+              return evas_common_convert_rgba_to_8bpp_rgb_221_dith;
+#endif
+#ifdef BUILD_CONVERT_8_RGB_121
+            if (pal_mode == PAL_MODE_RGB121)
+              return evas_common_convert_rgba_to_8bpp_rgb_121_dith;
+#endif
+#ifdef BUILD_CONVERT_8_RGB_111
+            if (pal_mode == PAL_MODE_RGB111)
+              return evas_common_convert_rgba_to_8bpp_rgb_111_dith;
+#endif
+         }
+       if (depth == 1)
+         {
+         }
+       if (depth == 4)
+         {
+         }
+    }
+   /* no optimised converter for this... no generic one either. NULL */
+   return NULL;
+   h = 0;
+   pal_mode = 0;
+}
diff --git a/src/lib/engines/common/evas_convert_main.h b/src/lib/engines/common/evas_convert_main.h
new file mode 100644 (file)
index 0000000..fb21203
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_CONVERT_MAIN_H
+#define _EVAS_CONVERT_MAIN_H
+
+
+EAPI void             evas_common_convert_init          (void);
+EAPI Gfx_Func_Convert evas_common_convert_func_get      (DATA8 *dest, int w, int h, int depth, DATA32 rmask, DATA32 gmask, DATA32 bmask, Convert_Pal_Mode pal_mode, int rotation);
+
+
+#endif /* _EVAS_CONVERT_MAIN_H */
diff --git a/src/lib/engines/common/evas_convert_rgb_16.c b/src/lib/engines/common/evas_convert_rgb_16.c
new file mode 100644 (file)
index 0000000..143f150
--- /dev/null
@@ -0,0 +1,2093 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_convert_rgb_16.h"
+
+#ifndef BUILD_NO_DITHER_MASK
+#ifdef USE_DITHER_44
+extern const DATA8 _evas_dither_44[4][4];
+#endif
+#ifdef USE_DITHER_128128
+extern const DATA8 _evas_dither_128128[128][128];
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_565
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+void
+evas_common_convert_rgba2_to_16bpp_rgb_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+#ifndef BUILD_NO_DITHER_MASK
+   DATA16 *d = (DATA16 *)dst;
+   int r1, g1, b1;
+   int r2, g2, b2;
+   int dith, dith2;
+   int x, y;
+
+#ifdef BUILD_LINE_DITHER_MASK
+   for (y = 0; y < h; y++)
+     {
+       if ((y + dith_y) & 0x1)
+         {
+            for (x = 0; x < w; x+=2)
+              {
+                 DATA32  p = *src++,  q = *src++;
+                 r1 = ((p & 0xff0000) + 0x030000) >> 19;
+                 if (r1 > 0x1f) r1 = 0x1f;
+                 g1 = ((p & 0xff00) + 0x000100) >> 10;
+                 if (g1 > 0x3f) g1 = 0x3f;
+                 b1 = ((p & 0xff) + 0x000003) >> 3;
+                 if (b1 > 0x1f) b1 = 0x1f;
+                 r2 = ((q & 0xff0000) + 0x030000) >> 19;
+                 if (r2 > 0x1f) r2 = 0x1f;
+                 g2 = ((q & 0xff00) + 0x000100) >> 10;
+                 if (g2 > 0x3f) g2 = 0x3f;
+                 b2 = ((q & 0xff) + 0x000003) >> 3;
+                 if (b2 > 0x1f) b2 = 0x1f;
+#ifndef WORDS_BIGENDIAN
+                 *((DATA32 *)d) = (r2 << 27) | (g2 << 21) | (b2 << 16) |
+                   (r1 << 11) | (g1 << 5) | (b1);
+#else
+                 *((DATA32 *)d) = (r1 << 27) | (g1 << 21) | (b1 << 16) |
+                   (r2 << 11) | (g2 << 5) | (b2);
+#endif
+                 d += 2;
+              }
+         }
+       else
+         {
+            x = w;
+            while (w > 0)
+              {
+                 DATA32  p = *src++, q = *src++;
+
+#ifndef WORDS_BIGENDIAN
+                 *((DATA32 *)d) =
+                   (((q & 0xff0000) >> 19) << 27) | (((q & 0xff00) >> 10) << 21) | (((q & 0xff) >> 3) << 16) |
+                   (((p & 0xff0000) >> 19) << 11) | (((p & 0xff00) >> 10) << 5) | ((p & 0xff) >> 3);
+#else
+                 *((DATA32 *)d) =
+                   (((p & 0xff0000) >> 19) << 27) | (((p & 0xff00) >> 10) << 21) | (((p & 0xff) >> 3) << 16) |
+                   (((q & 0xff0000) >> 19) << 11) | (((q & 0xff00) >> 10) << 5) | ((q & 0xff) >> 3);
+#endif
+                 d += 2;  w -= 2;
+              }
+            w = x;
+         }
+       src += src_jump;
+       d += dst_jump;
+     }
+#else
+   for (y = 0; y < h; y++)
+     {
+       for (x = 0; x < w; x++)
+         {
+           DATA32  p = *src++,  q = *src++;
+
+           dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK];
+           dith2 = dith >> DM_SHF(6);
+           dith >>= DM_SHF(5);
+           r1 = (p & 0xff0000) >> 19;
+           g1 = (p & 0xff00) >> 10;
+           b1 = (p & 0xff) >> 3;
+           if ((r1 < 0x1f) && ((((p & 0xff0000) >> 16) - (r1 << 3)) >= dith )) r1++;
+           if ((g1 < 0x3f) && ((((p & 0xff00) >> 8) - (g1 << 2)) >= dith2)) g1++;
+           if ((b1 < 0x1f) && (((p & 0xff) - (b1 << 3)) >= dith )) b1++;
+
+           x++;
+           dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK];
+           dith2 = dith >> DM_SHF(6);
+           dith >>= DM_SHF(5);
+           r2 = (q & 0xff0000) >> 19;
+           g2 = (q & 0xff00) >> 10;
+           b2 = (q & 0xff) >> 3;
+           if ((r2 < 0x1f) && ((((q & 0xff0000) >> 16) - (r2 << 3)) >= dith )) r2++;
+           if ((g2 < 0x3f) && ((((q & 0xff00) >> 8) - (g2 << 2)) >= dith2)) g2++;
+           if ((b2 < 0x1f) && (((q & 0xff) - (b2 << 3)) >= dith )) b2++;
+            
+#ifndef WORDS_BIGENDIAN
+           *((DATA32 *)d) = (r2 << 27) | (g2 << 21) | (b2 << 16) |
+                            (r1 << 11) | (g1 << 5) | (b1);
+#else
+           *((DATA32 *)d) = (r1 << 27) | (g1 << 21) | (b1 << 16) |
+                            (r2 << 11) | (g2 << 5) | (b2);
+#endif
+           d += 2;
+         }
+       src += src_jump;
+       d += dst_jump;
+     }
+#endif   
+   return;
+   pal = 0;
+#else
+   DATA16 *d = (DATA16 *)dst;
+   int w0 = w;
+
+   while (h--)
+     {
+       while (w > 0)
+         {
+            DATA32  p = *src++, q = *src++;
+
+#ifndef WORDS_BIGENDIAN
+           *((DATA32 *)d) =
+                 (((q & 0xff0000) >> 19) << 27) | (((q & 0xff00) >> 10) << 21) | (((q & 0xff) >> 3) << 16) |
+                 (((p & 0xff0000) >> 19) << 11) | (((p & 0xff00) >> 10) << 5) | ((p & 0xff) >> 3);
+#else
+           *((DATA32 *)d) =
+                (((p & 0xff0000) >> 19) << 27) | (((p & 0xff00) >> 10) << 21) | (((p & 0xff) >> 3) << 16) |
+                (((q & 0xff0000) >> 19) << 11) | (((q & 0xff00) >> 10) << 5) | ((q & 0xff) >> 3);
+#endif
+            d += 2;  w -= 2;
+          }
+       w = w0;
+       src += src_jump;
+       d += dst_jump;
+     }
+   return;
+   pal = 0;
+#endif
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_565
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+void
+evas_common_convert_rgba_to_16bpp_rgb_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+#ifndef BUILD_NO_DITHER_MASK
+   DATA16 *d = (DATA16 *)dst;
+   int r, g, b;
+   int dith, dith2;
+   int x, y;
+
+#ifdef BUILD_LINE_DITHER_MASK
+   for (y = 0; y < h; y++)
+     {
+       if ((y + dith_y) & 0x1)
+         {
+            for (x = 0; x < w; x++)
+              {
+                 DATA32  p = *src++;
+                 
+                 r = (p & 0xff0000) >> 19;
+                 if (r > 0x1f) r = 0x1f;
+                 g = (p & 0xff00) >> 10;
+                 if (g > 0x3f) g = 0x3f;
+                 b = (p & 0xff) >> 3;
+                 if (b > 0x1f) b = 0x1f;
+                 *d++ = (r << 11) | (g << 5) | b;
+              }
+         }
+       else
+         {
+            x = w;
+            while (w--)
+              {
+                 *d++ = (((*src & 0xff0000) >> 19) << 11) | (((*src & 0xff00) >> 10) << 5) | ((*src & 0xff) >> 3);
+                 src++;
+              }
+            w = x;
+         }
+       src += src_jump;
+       d += dst_jump;
+     }
+#else   
+   for (y = 0; y < h; y++)
+     {
+       for (x = 0; x < w; x++)
+         {
+           DATA32  p = *src++;
+
+           dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK];
+           dith2 = dith >> DM_SHF(6);
+           dith >>= DM_SHF(5);
+           r = (p & 0xff0000) >> 19;
+           g = (p & 0xff00) >> 10;
+           b = (p & 0xff) >> 3;
+           if ((r < 0x1f) && ((((p & 0xff0000) >> 16) - (r << 3)) >= dith )) r++;
+           if ((g < 0x3f) && ((((p & 0xff00) >> 8) - (g << 2)) >= dith2)) g++;
+           if ((b < 0x1f) && (((p & 0xff) - (b << 3)) >= dith )) b++;
+
+           *d++ = (r << 11) | (g << 5) | b;
+         }
+       src += src_jump;
+       d += dst_jump;
+     }
+#endif   
+   return;
+   pal = 0;
+#else
+   DATA16 *d = (DATA16 *)dst;
+   int w0 = w;
+
+   while (h--)
+     {
+       while (w--)
+         {
+           *d++ = (((*src & 0xff0000) >> 19) << 11) | (((*src & 0xff00) >> 10) << 5) | ((*src & 0xff) >> 3);
+            src++;
+          }
+       w = w0;
+       src += src_jump;
+       d += dst_jump;
+     }
+   return;
+   pal = 0;
+#endif
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_565
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+void
+evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith, dith2;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_180();
+
+   r1 = (R_VAL(src_ptr)) >> 3;
+   g1 = (G_VAL(src_ptr)) >> 2;
+   b1 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_180();
+
+   r2 = (R_VAL(src_ptr)) >> 3;
+   g2 = (G_VAL(src_ptr)) >> 2;
+   b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (r2 << 27) | (g2 << 21) | (b2 << 16) |
+     (r1 << 11) | (g1 << 5 ) | (b1      );
+#else
+   *((DATA32 *)dst_ptr) =
+     (r1 << 27) | (g1 << 21) | (b1 << 16) |
+     (r2 << 11) | (g2 << 5 ) | (b2      );
+#endif
+
+   CONVERT_LOOP2_END_ROT_180();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_565
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+void
+evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith, dith2;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_180();
+
+   r = (R_VAL(src_ptr)) >> 3;
+   g = (G_VAL(src_ptr)) >> 2;
+   b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++;
+   if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++;
+   if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++;
+#endif
+
+   *dst_ptr = (r << 11) | (g << 5) | (b);
+
+   CONVERT_LOOP_END_ROT_180();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_565
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+void
+evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith, dith2;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_270();
+
+   r1 = (R_VAL(src_ptr)) >> 3;
+   g1 = (G_VAL(src_ptr)) >> 2;
+   b1 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_270();
+
+   r2 = (R_VAL(src_ptr)) >> 3;
+   g2 = (G_VAL(src_ptr)) >> 2;
+   b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (r2 << 27) | (g2 << 21) | (b2 << 16) |
+     (r1 << 11) | (g1 << 5 ) | (b1      );
+#else
+   *((DATA32 *)dst_ptr) =
+     (r1 << 27) | (g1 << 21) | (b1 << 16) |
+     (r2 << 11) | (g2 << 5 ) | (b2      );
+#endif
+
+   CONVERT_LOOP2_END_ROT_270();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_565
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+void
+evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith, dith2;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_270();
+
+   r = (R_VAL(src_ptr)) >> 3;
+   g = (G_VAL(src_ptr)) >> 2;
+   b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++;
+   if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++;
+   if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++;
+#endif
+
+   *dst_ptr = (r << 11) | (g << 5) | (b);
+
+   CONVERT_LOOP_END_ROT_270();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_565
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+void
+evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith, dith2;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_90();
+
+   r1 = (R_VAL(src_ptr)) >> 3;
+   g1 = (G_VAL(src_ptr)) >> 2;
+   b1 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_90();
+
+   r2 = (R_VAL(src_ptr)) >> 3;
+   g2 = (G_VAL(src_ptr)) >> 2;
+   b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (r2 << 27) | (g2 << 21) | (b2 << 16) |
+     (r1 << 11) | (g1 << 5 ) | (b1      );
+#else
+   *((DATA32 *)dst_ptr) =
+     (r1 << 27) | (g1 << 21) | (b1 << 16) |
+     (r2 << 11) | (g2 << 5 ) | (b2      );
+#endif
+
+   CONVERT_LOOP2_END_ROT_90();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_565
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+void
+evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith, dith2;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_90();
+
+   r = (R_VAL(src_ptr)) >> 3;
+   g = (G_VAL(src_ptr)) >> 2;
+   b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++;
+   if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++;
+   if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++;
+#endif
+
+   *dst_ptr = (r << 11) | (g << 5) | (b);
+
+   CONVERT_LOOP_END_ROT_90();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_BGR_565
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+void
+evas_common_convert_rgba2_to_16bpp_bgr_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith, dith2;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_0();
+
+   r1 = (R_VAL(src_ptr)) >> 3;
+   g1 = (G_VAL(src_ptr)) >> 2;
+   b1 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_0();
+
+   r2 = (R_VAL(src_ptr)) >> 3;
+   g2 = (G_VAL(src_ptr)) >> 2;
+   b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (b2 << 27) | (g2 << 21) | (r2 << 16) |
+     (b1 << 11) | (g1 << 5 ) | (r1      );
+#else
+   *((DATA32 *)dst_ptr) =
+     (b1 << 27) | (g1 << 21) | (r1 << 16) |
+     (b2 << 11) | (g2 << 5 ) | (r2      );
+#endif
+
+   CONVERT_LOOP2_END_ROT_0();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_BGR_565
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+void
+evas_common_convert_rgba_to_16bpp_bgr_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith, dith2;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   r = (R_VAL(src_ptr)) >> 3;
+   g = (G_VAL(src_ptr)) >> 2;
+   b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++;
+   if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++;
+   if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++;
+#endif
+
+   *dst_ptr = (b << 11) | (g << 5) | (r);
+
+   CONVERT_LOOP_END_ROT_0();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_BGR_565
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+void
+evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith, dith2;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_180();
+
+   r1 = (R_VAL(src_ptr)) >> 3;
+   g1 = (G_VAL(src_ptr)) >> 2;
+   b1 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_180();
+
+   r2 = (R_VAL(src_ptr)) >> 3;
+   g2 = (G_VAL(src_ptr)) >> 2;
+   b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (b2 << 27) | (g2 << 21) | (r2 << 16) |
+     (b1 << 11) | (g1 << 5 ) | (r1      );
+#else
+   *((DATA32 *)dst_ptr) =
+     (b1 << 27) | (g1 << 21) | (r1 << 16) |
+     (b2 << 11) | (g2 << 5 ) | (r2      );
+#endif
+
+   CONVERT_LOOP2_END_ROT_180();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_BGR_565
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+void
+evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith, dith2;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   ERR("evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_180");
+
+   CONVERT_LOOP_START_ROT_180();
+
+   r = (R_VAL(src_ptr)) >> 3;
+   g = (G_VAL(src_ptr)) >> 2;
+   b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++;
+   if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++;
+   if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++;
+#endif
+
+   *dst_ptr = (b << 11) | (g << 5) | (r);
+
+   CONVERT_LOOP_END_ROT_180();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_BGR_565
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+void
+evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith, dith2;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_270();
+
+   r1 = (R_VAL(src_ptr)) >> 3;
+   g1 = (G_VAL(src_ptr)) >> 2;
+   b1 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_270();
+
+   r2 = (R_VAL(src_ptr)) >> 3;
+   g2 = (G_VAL(src_ptr)) >> 2;
+   b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (b2 << 27) | (g2 << 21) | (r2 << 16) |
+     (b1 << 11) | (g1 << 5 ) | (r1      );
+#else
+   *((DATA32 *)dst_ptr) =
+     (b1 << 27) | (g1 << 21) | (r1 << 16) |
+     (b2 << 11) | (g2 << 5 ) | (r2      );
+#endif
+
+   CONVERT_LOOP2_END_ROT_270();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_BGR_565
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+void
+evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith, dith2;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_270();
+
+   r = (R_VAL(src_ptr)) >> 3;
+   g = (G_VAL(src_ptr)) >> 2;
+   b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++;
+   if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++;
+   if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++;
+#endif
+
+   *dst_ptr = (b << 11) | (g << 5) | (r);
+
+   CONVERT_LOOP_END_ROT_270();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_BGR_565
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+void
+evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith, dith2;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_90();
+
+   r1 = (R_VAL(src_ptr)) >> 3;
+   g1 = (G_VAL(src_ptr)) >> 2;
+   b1 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_90();
+
+   r2 = (R_VAL(src_ptr)) >> 3;
+   g2 = (G_VAL(src_ptr)) >> 2;
+   b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (b2 << 27) | (g2 << 21) | (r2 << 16) |
+     (b1 << 11) | (g1 << 5 ) | (r1      );
+#else
+   *((DATA32 *)dst_ptr) =
+     (b1 << 27) | (g1 << 21) | (r1 << 16) |
+     (b2 << 11) | (g2 << 5 ) | (r2      );
+#endif
+
+   CONVERT_LOOP2_END_ROT_90();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_BGR_565
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+void
+evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith, dith2;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_90();
+
+   r = (R_VAL(src_ptr)) >> 3;
+   g = (G_VAL(src_ptr)) >> 2;
+   b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6);
+   if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++;
+   if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++;
+   if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++;
+#endif
+
+   *dst_ptr = (b << 11) | (g << 5) | (r);
+
+   CONVERT_LOOP_END_ROT_90();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_444
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+void
+evas_common_convert_rgba2_to_16bpp_rgb_444_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_0();
+
+   r1 = (R_VAL(src_ptr)) >> 4;
+   g1 = (G_VAL(src_ptr)) >> 4;
+   b1 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_0();
+
+   r2 = (R_VAL(src_ptr)) >> 4;
+   g2 = (G_VAL(src_ptr)) >> 4;
+   b2 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (r2 << 24) | (g2 << 20) | (b2 << 16) |
+     (r1 << 8 ) | (g1 << 4 ) | (b1      );
+#else
+   *((DATA32 *)dst_ptr) =
+     (r1 << 24) | (g1 << 20) | (b1 << 16) |
+     (r2 << 8 ) | (g2 << 4 ) | (b2      );
+#endif
+
+   CONVERT_LOOP2_END_ROT_0();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_444
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+void
+evas_common_convert_rgba_to_16bpp_rgb_444_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   r = (R_VAL(src_ptr)) >> 4;
+   g = (G_VAL(src_ptr)) >> 4;
+   b = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++;
+   if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++;
+   if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++;
+#endif
+
+   *dst_ptr = (r << 8) | (g << 4) | (b);
+
+   CONVERT_LOOP_END_ROT_0();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_444
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+void
+evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_180();
+
+   r1 = (R_VAL(src_ptr)) >> 4;
+   g1 = (G_VAL(src_ptr)) >> 4;
+   b1 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_180();
+
+   r2 = (R_VAL(src_ptr)) >> 4;
+   g2 = (G_VAL(src_ptr)) >> 4;
+   b2 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (r2 << 24) | (g2 << 20) | (b2 << 16) |
+     (r1 << 8 ) | (g1 << 4 ) | (b1      );
+#else
+   *((DATA32 *)dst_ptr) =
+     (r1 << 24) | (g1 << 20) | (b1 << 16) |
+     (r2 << 8 ) | (g2 << 4 ) | (b2      );
+#endif
+
+   CONVERT_LOOP2_END_ROT_180();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_444
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+void
+evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_180();
+
+   r = (R_VAL(src_ptr)) >> 4;
+   g = (G_VAL(src_ptr)) >> 4;
+   b = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++;
+   if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++;
+   if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++;
+#endif
+
+   *dst_ptr = (r << 8) | (g << 4) | (b);
+
+   CONVERT_LOOP_END_ROT_180();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_444
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+void
+evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_270();
+
+   r1 = (R_VAL(src_ptr)) >> 4;
+   g1 = (G_VAL(src_ptr)) >> 4;
+   b1 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_270();
+
+   r2 = (R_VAL(src_ptr)) >> 4;
+   g2 = (G_VAL(src_ptr)) >> 4;
+   b2 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (r2 << 24) | (g2 << 20) | (b2 << 16) |
+     (r1 << 8 ) | (g1 << 4 ) | (b1      );
+#else
+   *((DATA32 *)dst_ptr) =
+     (r1 << 24) | (g1 << 20) | (b1 << 16) |
+     (r2 << 8 ) | (g2 << 4 ) | (b2      );
+#endif
+
+   CONVERT_LOOP2_END_ROT_270();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_444
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+void
+evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_270();
+
+   r = (R_VAL(src_ptr)) >> 4;
+   g = (G_VAL(src_ptr)) >> 4;
+   b = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++;
+   if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++;
+   if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++;
+#endif
+
+   *dst_ptr = (r << 8) | (g << 4) | (b);
+
+   CONVERT_LOOP_END_ROT_270();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_444
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+void
+evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_90();
+
+   r1 = (R_VAL(src_ptr)) >> 4;
+   g1 = (G_VAL(src_ptr)) >> 4;
+   b1 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_90();
+
+   r2 = (R_VAL(src_ptr)) >> 4;
+   g2 = (G_VAL(src_ptr)) >> 4;
+   b2 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (r2 << 24) | (g2 << 20) | (b2 << 16) |
+     (r1 << 8 ) | (g1 << 4 ) | (b1      );
+#else
+   *((DATA32 *)dst_ptr) =
+     (r1 << 24) | (g1 << 20) | (b1 << 16) |
+     (r2 << 8 ) | (g2 << 4 ) | (b2      );
+#endif
+
+   CONVERT_LOOP2_END_ROT_90();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_444
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+void
+evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_90();
+
+   r = (R_VAL(src_ptr)) >> 4;
+   g = (G_VAL(src_ptr)) >> 4;
+   b = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++;
+   if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++;
+   if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++;
+#endif
+
+   *dst_ptr = (r << 8) | (g << 4) | (b);
+
+   CONVERT_LOOP_END_ROT_90();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_454645
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+void
+evas_common_convert_rgba2_to_16bpp_rgb_454645_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_0();
+
+   r1 = (R_VAL(src_ptr)) >> 4;
+   g1 = (G_VAL(src_ptr)) >> 4;
+   b1 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_0();
+
+   r2 = (R_VAL(src_ptr)) >> 4;
+   g2 = (G_VAL(src_ptr)) >> 4;
+   b2 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (r2 << 28) | (g2 << 23) | (b2 << 17) |
+     (r1 << 12) | (g1 << 7 ) | (b1 << 1 );
+#else
+   *((DATA32 *)dst_ptr) =
+     (r1 << 28) | (g1 << 23) | (b1 << 17) |
+     (r2 << 12) | (g2 << 7 ) | (b2 << 1 );
+#endif
+
+   CONVERT_LOOP2_END_ROT_0();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_454645
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+void
+evas_common_convert_rgba_to_16bpp_rgb_454645_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   r = (R_VAL(src_ptr)) >> 4;
+   g = (G_VAL(src_ptr)) >> 4;
+   b = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++;
+   if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++;
+   if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++;
+#endif
+
+   *dst_ptr = (r << 12) | (g << 7) | (b << 1);
+
+   CONVERT_LOOP_END_ROT_0();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_454645
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+void
+evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_180();
+
+   r1 = (R_VAL(src_ptr)) >> 4;
+   g1 = (G_VAL(src_ptr)) >> 4;
+   b1 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_180();
+
+   r2 = (R_VAL(src_ptr)) >> 4;
+   g2 = (G_VAL(src_ptr)) >> 4;
+   b2 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (r2 << 28) | (g2 << 23) | (b2 << 17) |
+     (r1 << 12) | (g1 << 7 ) | (b1 << 1 );
+#else
+   *((DATA32 *)dst_ptr) =
+     (r1 << 28) | (g1 << 23) | (b1 << 17) |
+     (r2 << 12) | (g2 << 7 ) | (b2 << 1 );
+#endif
+
+   CONVERT_LOOP2_END_ROT_180();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_454645
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+void
+evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_180();
+
+   r = (R_VAL(src_ptr)) >> 4;
+   g = (G_VAL(src_ptr)) >> 4;
+   b = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++;
+   if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++;
+   if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++;
+#endif
+
+   *dst_ptr = (r << 12) | (g << 7) | (b << 1);
+
+   CONVERT_LOOP_END_ROT_180();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+
+#ifdef BUILD_CONVERT_16_RGB_454645
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+void
+evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_270();
+
+   r1 = (R_VAL(src_ptr)) >> 4;
+   g1 = (G_VAL(src_ptr)) >> 4;
+   b1 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_270();
+
+   r2 = (R_VAL(src_ptr)) >> 4;
+   g2 = (G_VAL(src_ptr)) >> 4;
+   b2 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (r2 << 28) | (g2 << 23) | (b2 << 17) |
+     (r1 << 12) | (g1 << 7 ) | (b1 << 1 );
+#else
+   *((DATA32 *)dst_ptr) =
+     (r1 << 28) | (g1 << 23) | (b1 << 17) |
+     (r2 << 12) | (g2 << 7 ) | (b2 << 1 );
+#endif
+
+   CONVERT_LOOP2_END_ROT_270();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_454645
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+void
+evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_270();
+
+   r = (R_VAL(src_ptr)) >> 4;
+   g = (G_VAL(src_ptr)) >> 4;
+   b = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++;
+   if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++;
+   if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++;
+#endif
+
+   *dst_ptr = (r << 12) | (g << 7) | (b << 1);
+
+   CONVERT_LOOP_END_ROT_270();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_454645
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+void
+evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_90();
+
+   r1 = (R_VAL(src_ptr)) >> 4;
+   g1 = (G_VAL(src_ptr)) >> 4;
+   b1 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_90();
+
+   r2 = (R_VAL(src_ptr)) >> 4;
+   g2 = (G_VAL(src_ptr)) >> 4;
+   b2 = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (r2 << 28) | (g2 << 23) | (b2 << 17) |
+     (r1 << 12) | (g1 << 7 ) | (b1 << 1 );
+#else
+   *((DATA32 *)dst_ptr) =
+     (r1 << 28) | (g1 << 23) | (b1 << 17) |
+     (r2 << 12) | (g2 << 7 ) | (b2 << 1 );
+#endif
+
+   CONVERT_LOOP2_END_ROT_90();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_454645
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+void
+evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_90();
+
+   r = (R_VAL(src_ptr)) >> 4;
+   g = (G_VAL(src_ptr)) >> 4;
+   b = (B_VAL(src_ptr)) >> 4;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4);
+   if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++;
+   if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++;
+   if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++;
+#endif
+
+   *dst_ptr = (r << 12) | (g << 7) | (b << 1);
+
+   CONVERT_LOOP_END_ROT_90();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_555
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+void
+evas_common_convert_rgba2_to_16bpp_rgb_555_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_0();
+
+   r1 = (R_VAL(src_ptr)) >> 3;
+   g1 = (G_VAL(src_ptr)) >> 3;
+   b1 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   if (((R_VAL(src_ptr) - (r1 << 3)) >= dith) && (r1 < 0x1f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 3)) >= dith) && (g1 < 0x1f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 3)) >= dith) && (b1 < 0x1f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_0();
+
+   r2 = (R_VAL(src_ptr)) >> 3;
+   g2 = (G_VAL(src_ptr)) >> 3;
+   b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   if (((R_VAL(src_ptr) - (r2 << 3)) >= dith) && (r2 < 0x1f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 3)) >= dith) && (g2 < 0x1f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 3)) >= dith) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (r2 << 26) | (g2 << 21) | (b2 << 16) |
+     (r1 << 10) | (g1 << 5 ) | (b1      );
+#else
+   *((DATA32 *)dst_ptr) =
+     (r1 << 26) | (g1 << 21) | (b1 << 16) |
+     (r2 << 10) | (g2 << 5 ) | (b2      );
+#endif
+
+   CONVERT_LOOP2_END_ROT_0();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_555
+#ifdef BUILD_CONVERT_16_RGB_ROT0
+void
+evas_common_convert_rgba_to_16bpp_rgb_555_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   r = (R_VAL(src_ptr)) >> 3;
+   g = (G_VAL(src_ptr)) >> 3;
+   b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   if (((R_VAL(src_ptr) - (r << 3)) >= dith) && (r < 0x1f)) r++;
+   if (((G_VAL(src_ptr) - (g << 3)) >= dith) && (g < 0x1f)) g++;
+   if (((B_VAL(src_ptr) - (b << 3)) >= dith) && (b < 0x1f)) b++;
+#endif
+
+   *dst_ptr = (r << 10) | (g << 5) | (b);
+
+   CONVERT_LOOP_END_ROT_0();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_555
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+void
+evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_180();
+
+   r1 = (R_VAL(src_ptr)) >> 3;
+   g1 = (G_VAL(src_ptr)) >> 3;
+   b1 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   if (((R_VAL(src_ptr) - (r1 << 3)) >= dith) && (r1 < 0x1f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 3)) >= dith) && (g1 < 0x1f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 3)) >= dith) && (b1 < 0x1f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_180();
+
+   r2 = (R_VAL(src_ptr)) >> 3;
+   g2 = (G_VAL(src_ptr)) >> 3;
+   b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   if (((R_VAL(src_ptr) - (r2 << 3)) >= dith) && (r2 < 0x1f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 3)) >= dith) && (g2 < 0x1f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 3)) >= dith) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (r2 << 26) | (g2 << 21) | (b2 << 16) |
+     (r1 << 10) | (g1 << 5 ) | (b1      );
+#else
+   *((DATA32 *)dst_ptr) =
+     (r1 << 26) | (g1 << 21) | (b1 << 16) |
+     (r2 << 10) | (g2 << 5 ) | (b2      );
+#endif
+
+   CONVERT_LOOP2_END_ROT_180();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_555
+#ifdef BUILD_CONVERT_16_RGB_ROT180
+void
+evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_180();
+
+   r = (R_VAL(src_ptr)) >> 3;
+   g = (G_VAL(src_ptr)) >> 3;
+   b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   if (((R_VAL(src_ptr) - (r << 3)) >= dith) && (r < 0x1f)) r++;
+   if (((G_VAL(src_ptr) - (g << 3)) >= dith) && (g < 0x1f)) g++;
+   if (((B_VAL(src_ptr) - (b << 3)) >= dith) && (b < 0x1f)) b++;
+#endif
+
+   *dst_ptr = (r << 10) | (g << 5) | (b);
+
+   CONVERT_LOOP_END_ROT_180();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_555
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+void
+evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_270();
+
+   r1 = (R_VAL(src_ptr)) >> 3;
+   g1 = (G_VAL(src_ptr)) >> 3;
+   b1 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   if (((R_VAL(src_ptr) - (r1 << 3)) >= dith) && (r1 < 0x1f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 3)) >= dith) && (g1 < 0x1f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 3)) >= dith) && (b1 < 0x1f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_270();
+
+   r2 = (R_VAL(src_ptr)) >> 3;
+   g2 = (G_VAL(src_ptr)) >> 3;
+   b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   if (((R_VAL(src_ptr) - (r2 << 3)) >= dith) && (r2 < 0x1f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 3)) >= dith) && (g2 < 0x1f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 3)) >= dith) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (r2 << 26) | (g2 << 21) | (b2 << 16) |
+     (r1 << 10) | (g1 << 5 ) | (b1      );
+#else
+   *((DATA32 *)dst_ptr) =
+     (r1 << 26) | (g1 << 21) | (b1 << 16) |
+     (r2 << 10) | (g2 << 5 ) | (b2      );
+#endif
+
+   CONVERT_LOOP2_END_ROT_270();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_555
+#ifdef BUILD_CONVERT_16_RGB_ROT270
+void
+evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_270();
+
+   r = (R_VAL(src_ptr)) >> 3;
+   g = (G_VAL(src_ptr)) >> 3;
+   b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   if (((R_VAL(src_ptr) - (r << 3)) >= dith) && (r < 0x1f)) r++;
+   if (((G_VAL(src_ptr) - (g << 3)) >= dith) && (g < 0x1f)) g++;
+   if (((B_VAL(src_ptr) - (b << 3)) >= dith) && (b < 0x1f)) b++;
+#endif
+
+   *dst_ptr = (r << 10) | (g << 5) | (b);
+
+   CONVERT_LOOP_END_ROT_270();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_555
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+void
+evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r1, g1, b1;
+   DATA8 r2, g2, b2;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP2_START_ROT_90();
+
+   r1 = (R_VAL(src_ptr)) >> 3;
+   g1 = (G_VAL(src_ptr)) >> 3;
+   b1 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   if (((R_VAL(src_ptr) - (r1 << 3)) >= dith) && (r1 < 0x1f)) r1++;
+   if (((G_VAL(src_ptr) - (g1 << 3)) >= dith) && (g1 < 0x1f)) g1++;
+   if (((B_VAL(src_ptr) - (b1 << 3)) >= dith) && (b1 < 0x1f)) b1++;
+#endif
+
+   CONVERT_LOOP2_INC_ROT_90();
+
+   r2 = (R_VAL(src_ptr)) >> 3;
+   g2 = (G_VAL(src_ptr)) >> 3;
+   b2 = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   if (((R_VAL(src_ptr) - (r2 << 3)) >= dith) && (r2 < 0x1f)) r2++;
+   if (((G_VAL(src_ptr) - (g2 << 3)) >= dith) && (g2 < 0x1f)) g2++;
+   if (((B_VAL(src_ptr) - (b2 << 3)) >= dith) && (b2 < 0x1f)) b2++;
+#endif
+
+#ifndef WORDS_BIGENDIAN
+   *((DATA32 *)dst_ptr) =
+     (r2 << 26) | (g2 << 21) | (b2 << 16) |
+     (r1 << 10) | (g1 << 5 ) | (b1      );
+#else
+   *((DATA32 *)dst_ptr) =
+     (r1 << 26) | (g1 << 21) | (b1 << 16) |
+     (r2 << 10) | (g2 << 5 ) | (b2      );
+#endif
+
+   CONVERT_LOOP2_END_ROT_90();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_16_RGB_555
+#ifdef BUILD_CONVERT_16_RGB_ROT90
+void
+evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA16 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+#ifndef BUILD_NO_DITHER_MASK
+   DATA8 dith;
+#endif
+
+   dst_ptr = (DATA16 *)dst;
+
+   CONVERT_LOOP_START_ROT_90();
+
+   r = (R_VAL(src_ptr)) >> 3;
+   g = (G_VAL(src_ptr)) >> 3;
+   b = (B_VAL(src_ptr)) >> 3;
+
+#ifndef BUILD_NO_DITHER_MASK
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5);
+   if (((R_VAL(src_ptr) - (r << 3)) >= dith) && (r < 0x1f)) r++;
+   if (((G_VAL(src_ptr) - (g << 3)) >= dith) && (g < 0x1f)) g++;
+   if (((B_VAL(src_ptr) - (b << 3)) >= dith) && (b < 0x1f)) b++;
+#endif
+
+   *dst_ptr = (r << 10) | (g << 5) | (b);
+
+   CONVERT_LOOP_END_ROT_90();
+   return;
+   pal = 0;
+}
+#endif
+#endif
+
diff --git a/src/lib/engines/common/evas_convert_rgb_16.h b/src/lib/engines/common/evas_convert_rgb_16.h
new file mode 100644 (file)
index 0000000..fd1e570
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_CONVERT_RGB_16_H
+#define _EVAS_CONVERT_RGB_16_H
+
+
+void evas_common_convert_rgba2_to_16bpp_rgb_565_dith            (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_565_dith             (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_bgr_565_dith            (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_bgr_565_dith             (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_rgb_444_dith            (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_444_dith             (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_rgb_454645_dith         (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_454645_dith          (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_rgb_555_dith            (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_555_dith             (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+
+void evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_180    (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_180     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_180    (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_180     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_180    (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_180     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_180  (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_180    (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_180     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+
+void evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_270    (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_270     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_270    (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_270     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_270    (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_270     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_270  (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_270    (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_270     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+
+void evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_90     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_90      (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_90     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_90      (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_90     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_90      (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_90  (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_90   (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_90     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_90      (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+
+
+#endif /* _EVAS_CONVERT_RGB_16_H */
diff --git a/src/lib/engines/common/evas_convert_rgb_24.c b/src/lib/engines/common/evas_convert_rgb_24.c
new file mode 100644 (file)
index 0000000..d5d4f4e
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_convert_rgb_24.h"
+
+#ifdef BUILD_CONVERT_24_RGB_888
+void
+evas_common_convert_rgba_to_24bpp_rgb_888(DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA8 *)dst;
+   src_ptr = (DATA32 *)src;
+
+   for (y = 0; y < h; y++)
+     {
+       for (x = 0; x < w; x++)
+         {
+            dst_ptr[0] = R_VAL(src_ptr);
+            dst_ptr[1] = G_VAL(src_ptr);
+            dst_ptr[2] = B_VAL(src_ptr);
+            src_ptr++;
+            dst_ptr+=3;
+         }
+       src_ptr += src_jump;
+       dst_ptr += (dst_jump * 3);
+     }
+   return;
+}
+#endif
+#ifdef BUILD_CONVERT_24_RGB_666
+void
+evas_common_convert_rgba_to_24bpp_rgb_666(DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr, *scratch_ptr;
+   DATA32 scratch;
+   int x, y;
+
+   dst_ptr = (DATA8 *)dst;
+   src_ptr = (DATA32 *)src;
+
+   scratch_ptr = (DATA8 *)(&scratch);
+   for (y = 0; y < h; y++)
+     {
+       for (x = 0; x < w; x++)
+         {
+             scratch = 
+               (((R_VAL(src_ptr) << 12) | (B_VAL(src_ptr) >> 2)) & 0x03f03f) |
+               ((G_VAL(src_ptr) << 4) & 0x000fc0);
+            dst_ptr[0] = scratch_ptr[1];
+            dst_ptr[1] = scratch_ptr[2];
+            dst_ptr[2] = scratch_ptr[3];
+            src_ptr++;
+            dst_ptr+=3;
+         }
+       src_ptr += src_jump;
+       dst_ptr += (dst_jump * 3);
+     }
+   return;
+}
+#endif
+#ifdef BUILD_CONVERT_24_BGR_888
+void
+evas_common_convert_rgba_to_24bpp_bgr_888(DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA8 *)dst;
+   src_ptr = (DATA32 *)src;
+
+   for (y = 0; y < h; y++)
+     {
+       for (x = 0; x < w; x++)
+         {
+            dst_ptr[2] = R_VAL(src_ptr);
+            dst_ptr[1] = G_VAL(src_ptr);
+            dst_ptr[0] = B_VAL(src_ptr);
+            src_ptr++;
+            dst_ptr+=3;
+         }
+       src_ptr += src_jump;
+       dst_ptr += (dst_jump * 3);
+     }
+   return;
+}
+#endif
diff --git a/src/lib/engines/common/evas_convert_rgb_24.h b/src/lib/engines/common/evas_convert_rgb_24.h
new file mode 100644 (file)
index 0000000..5a67cbc
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_CONVERT_RGB_24_H
+#define _EVAS_CONVERT_RGB_24_H
+
+
+void evas_common_convert_rgba_to_24bpp_rgb_888                 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_24bpp_bgr_888                 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+
+void evas_common_convert_rgba_to_24bpp_rgb_666                 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+    
+#endif /* _EVAS_CONVERT_RGB_24_H */
diff --git a/src/lib/engines/common/evas_convert_rgb_32.c b/src/lib/engines/common/evas_convert_rgb_32.c
new file mode 100644 (file)
index 0000000..05ad414
--- /dev/null
@@ -0,0 +1,375 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_convert_rgb_32.h"
+
+#ifdef BUILD_CONVERT_32_RGB_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT0
+void
+evas_common_convert_rgba_to_32bpp_rgb_8888 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int y;
+   Gfx_Func_Copy func;
+
+   dst_ptr = (DATA32 *)dst;
+   src_ptr = src;
+
+   func = evas_common_draw_func_copy_get(w, 0);
+
+   for (y = 0; y < h; y++)
+     {
+       func(src_ptr, dst_ptr, w);
+       src_ptr += w + src_jump;
+       dst_ptr += w + dst_jump;
+     }
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_RGB_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT180
+void
+evas_common_convert_rgba_to_32bpp_rgb_8888_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_180();
+
+   *dst_ptr = *src_ptr;
+
+   CONVERT_LOOP_END_ROT_180();
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_RGB_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT270
+void
+evas_common_convert_rgba_to_32bpp_rgb_8888_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_270();
+
+   *dst_ptr = *src_ptr;
+
+   CONVERT_LOOP_END_ROT_270();
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_RGB_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT90
+void
+evas_common_convert_rgba_to_32bpp_rgb_8888_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_90();
+
+   *dst_ptr = *src_ptr;
+
+   CONVERT_LOOP_END_ROT_90();
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_RGBX_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT0
+void
+evas_common_convert_rgba_to_32bpp_rgbx_8888 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+//   *dst_ptr = (R_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (B_VAL(src_ptr) << 8);
+   *dst_ptr = (*src_ptr << 8);
+
+   CONVERT_LOOP_END_ROT_0();
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_RGBX_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT180
+void
+evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_180();
+
+//   *dst_ptr = (R_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (B_VAL(src_ptr) << 8);
+   *dst_ptr = (*src_ptr << 8);
+
+   CONVERT_LOOP_END_ROT_180();
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_RGBX_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT270
+void
+evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_270();
+
+//   *dst_ptr = (R_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (B_VAL(src_ptr) << 8);
+   *dst_ptr = (*src_ptr << 8);
+
+   CONVERT_LOOP_END_ROT_270();
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_RGBX_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT90
+void
+evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_90();
+
+//   *dst_ptr = (R_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (B_VAL(src_ptr) << 8);
+   *dst_ptr = (*src_ptr << 8);
+
+   CONVERT_LOOP_END_ROT_90();
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_BGR_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT0
+void
+evas_common_convert_rgba_to_32bpp_bgr_8888 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   *dst_ptr = (B_VAL(src_ptr) << 16) | (G_VAL(src_ptr) << 8) | (R_VAL(src_ptr));
+
+   CONVERT_LOOP_END_ROT_0();
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_BGR_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT180
+void
+evas_common_convert_rgba_to_32bpp_bgr_8888_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_180();
+
+   *dst_ptr = (B_VAL(src_ptr) << 16) | (G_VAL(src_ptr) << 8) | (R_VAL(src_ptr));
+
+   CONVERT_LOOP_END_ROT_180();
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_BGR_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT270
+void
+evas_common_convert_rgba_to_32bpp_bgr_8888_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_270();
+
+   *dst_ptr = (B_VAL(src_ptr) << 16) | (G_VAL(src_ptr) << 8) | (R_VAL(src_ptr));
+
+   CONVERT_LOOP_END_ROT_270();
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_BGR_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT90
+void
+evas_common_convert_rgba_to_32bpp_bgr_8888_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_90();
+
+   *dst_ptr = (B_VAL(src_ptr) << 16) | (G_VAL(src_ptr) << 8) | (R_VAL(src_ptr));
+
+   CONVERT_LOOP_END_ROT_90();
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_BGRX_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT0
+void
+evas_common_convert_rgba_to_32bpp_bgrx_8888 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   *dst_ptr = (B_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (R_VAL(src_ptr) << 8);
+
+   CONVERT_LOOP_END_ROT_0();
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_BGRX_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT180
+void
+evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_180();
+
+   *dst_ptr = (B_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (R_VAL(src_ptr) << 8);
+
+   CONVERT_LOOP_END_ROT_180();
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_BGRX_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT270
+void
+evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_270();
+
+   *dst_ptr = (B_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (R_VAL(src_ptr) << 8);
+
+   CONVERT_LOOP_END_ROT_270();
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_BGRX_8888
+#ifdef BUILD_CONVERT_32_RGB_ROT90
+void
+evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_90();
+
+   *dst_ptr = (B_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (R_VAL(src_ptr) << 8);
+
+   CONVERT_LOOP_END_ROT_90();
+   return;
+}
+#endif
+#endif
+
+#ifdef BUILD_CONVERT_32_RGB_666
+#ifdef BUILD_CONVERT_32_RGB_ROT0
+void
+evas_common_convert_rgba_to_32bpp_rgb_666(DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
+{
+   DATA32 *src_ptr;
+   DATA32 *dst_ptr;
+   int x, y;
+
+   dst_ptr = (DATA32 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   *dst_ptr = 
+     (((R_VAL(src_ptr) << 12) | (B_VAL(src_ptr) >> 2)) & 0x03f03f) |
+     ((G_VAL(src_ptr) << 4) & 0x000fc0);
+
+   CONVERT_LOOP_END_ROT_0();
+   return;
+}
+#endif
+#endif
+
diff --git a/src/lib/engines/common/evas_convert_rgb_32.h b/src/lib/engines/common/evas_convert_rgb_32.h
new file mode 100644 (file)
index 0000000..8f4150f
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_CONVERT_RGB_32_H
+#define _EVAS_CONVERT_RGB_32_H
+
+
+void evas_common_convert_rgba_to_32bpp_rgb_8888                (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_32bpp_rgb_8888_rot_180        (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_32bpp_rgb_8888_rot_270        (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_32bpp_rgb_8888_rot_90         (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_32bpp_rgbx_8888               (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_180       (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_270       (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_90        (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_32bpp_bgr_8888                (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_32bpp_bgr_8888_rot_180        (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_32bpp_bgr_8888_rot_270        (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_32bpp_bgr_8888_rot_90         (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_32bpp_bgrx_8888               (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_180       (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_270       (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_90        (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+
+void evas_common_convert_rgba_to_32bpp_rgb_666                 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+
+#endif /* _EVAS_CONVERT_RGB_32_H */
diff --git a/src/lib/engines/common/evas_convert_rgb_8.c b/src/lib/engines/common/evas_convert_rgb_8.c
new file mode 100644 (file)
index 0000000..c2f08fb
--- /dev/null
@@ -0,0 +1,252 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_convert_rgb_8.h"
+
+#ifdef USE_DITHER_44
+extern const DATA8 _evas_dither_44[4][4];
+#endif
+#ifdef USE_DITHER_128128
+extern const DATA8 _evas_dither_128128[128][128];
+#endif
+
+#ifdef BUILD_CONVERT_8_RGB_332
+void evas_common_convert_rgba_to_8bpp_rgb_332_dith     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+   DATA8 dith, dith2;
+
+   dst_ptr = (DATA8 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(3);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(2);
+/*   r = (R_VAL(src_ptr)) >> (8 - 3);*/
+/*   g = (G_VAL(src_ptr)) >> (8 - 3);*/
+/*   b = (B_VAL(src_ptr)) >> (8 - 2);*/
+/*   if (((R_VAL(src_ptr) - (r << (8 - 3))) >= dith ) && (r < 0x07)) r++;*/
+/*   if (((G_VAL(src_ptr) - (g << (8 - 3))) >= dith ) && (g < 0x07)) g++;*/
+/*   if (((B_VAL(src_ptr) - (b << (8 - 2))) >= dith2) && (b < 0x03)) b++;*/
+   r = (R_VAL(src_ptr)) * 7 / 255;
+   if (((R_VAL(src_ptr) - (r * 255 / 7)) >= dith ) && (r < 0x07)) r++;
+   g = (G_VAL(src_ptr)) * 7 / 255;
+   if (((G_VAL(src_ptr) - (g * 255 / 7)) >= dith ) && (g < 0x07)) g++;
+   b = (B_VAL(src_ptr)) * 3 / 255;
+   if (((B_VAL(src_ptr) - (b * 255 / 3)) >= dith2) && (b < 0x03)) b++;
+
+   *dst_ptr = pal[(r << 5) | (g << 2) | (b)];
+
+   CONVERT_LOOP_END_ROT_0();
+}
+#endif
+#ifdef BUILD_CONVERT_8_RGB_666
+static DATA8 p_to_6[256];
+static DATA8 p_to_6_err[256];
+
+void evas_common_convert_rgba_to_8bpp_rgb_666_dith     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+   DATA8 dith;
+   static int tables_calcualted = 0;
+
+   if (!tables_calcualted)
+     {
+       int i;
+
+       tables_calcualted = 1;
+       for (i = 0; i < 256; i++)
+         p_to_6[i] = (i * 5) / 255;
+       for (i = 0; i < 256; i++)
+         p_to_6_err[i] = ((i * 5) - (p_to_6[i] * 255)) * DM_DIV / 255;
+     }
+   dst_ptr = (DATA8 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   r = p_to_6[(R_VAL(src_ptr))];
+   g = p_to_6[(G_VAL(src_ptr))];
+   b = p_to_6[(B_VAL(src_ptr))];
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK];
+   if ((p_to_6_err[(R_VAL(src_ptr))] >= dith ) && (r < 5)) r++;
+   if ((p_to_6_err[(G_VAL(src_ptr))] >= dith ) && (g < 5)) g++;
+   if ((p_to_6_err[(B_VAL(src_ptr))] >= dith ) && (b < 5)) b++;
+
+   *dst_ptr = pal[(r * 36) + (g * 6) + (b)];
+
+   CONVERT_LOOP_END_ROT_0();
+}
+#endif
+#ifdef BUILD_CONVERT_8_RGB_232
+void evas_common_convert_rgba_to_8bpp_rgb_232_dith     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+   DATA8 dith, dith2;
+
+   dst_ptr = (DATA8 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(3);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(2);
+/*   r = (R_VAL(src_ptr)) >> (8 - 2);*/
+/*   g = (G_VAL(src_ptr)) >> (8 - 3);*/
+/*   b = (B_VAL(src_ptr)) >> (8 - 2);*/
+/*   if (((R_VAL(src_ptr) - (r << (8 - 2))) >= dith2) && (r < 0x03)) r++;*/
+/*   if (((G_VAL(src_ptr) - (g << (8 - 3))) >= dith ) && (g < 0x07)) g++;*/
+/*   if (((B_VAL(src_ptr) - (b << (8 - 2))) >= dith2) && (b < 0x03)) b++;*/
+   r = (R_VAL(src_ptr)) * 3 / 255;
+   if (((R_VAL(src_ptr) - (r * 255 / 3)) >= dith2) && (r < 0x03)) r++;
+   g = (G_VAL(src_ptr)) * 7 / 255;
+   if (((G_VAL(src_ptr) - (g * 255 / 7)) >= dith ) && (g < 0x07)) g++;
+   b = (B_VAL(src_ptr)) * 3 / 255;
+   if (((B_VAL(src_ptr) - (b * 255 / 3)) >= dith2) && (b < 0x03)) b++;
+
+   *dst_ptr = pal[(r << 5) | (g << 2) | (b)];
+
+   CONVERT_LOOP_END_ROT_0();
+}
+#endif
+#ifdef BUILD_CONVERT_8_RGB_222
+void evas_common_convert_rgba_to_8bpp_rgb_222_dith     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+   DATA8 dith;
+
+   dst_ptr = (DATA8 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(2);
+/*   r = (R_VAL(src_ptr)) >> (8 - 2);*/
+/*   g = (G_VAL(src_ptr)) >> (8 - 2);*/
+/*   b = (B_VAL(src_ptr)) >> (8 - 2);*/
+/*   if (((R_VAL(src_ptr) - (r << (8 - 2))) >= dith ) && (r < 0x03)) r++;*/
+/*   if (((G_VAL(src_ptr) - (g << (8 - 2))) >= dith ) && (g < 0x03)) g++;*/
+/*   if (((B_VAL(src_ptr) - (b << (8 - 2))) >= dith ) && (b < 0x03)) b++;*/
+   r = (R_VAL(src_ptr)) * 3 / 255;
+   if (((R_VAL(src_ptr) - (r * 255 / 3)) >= dith ) && (r < 0x03)) r++;
+   g = (G_VAL(src_ptr)) * 3 / 255;
+   if (((G_VAL(src_ptr) - (g * 255 / 3)) >= dith ) && (g < 0x03)) g++;
+   b = (B_VAL(src_ptr)) * 3 / 255;
+   if (((B_VAL(src_ptr) - (b * 255 / 3)) >= dith ) && (b < 0x03)) b++;
+
+   *dst_ptr = pal[(r << 4) | (g << 2) | (b)];
+
+   CONVERT_LOOP_END_ROT_0();
+}
+#endif
+#ifdef BUILD_CONVERT_8_RGB_221
+void evas_common_convert_rgba_to_8bpp_rgb_221_dith     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+   DATA8 dith, dith2;
+
+   dst_ptr = (DATA8 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(2);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(1);
+/*   r = (R_VAL(src_ptr)) >> (8 - 2);*/
+/*   g = (G_VAL(src_ptr)) >> (8 - 2);*/
+/*   b = (B_VAL(src_ptr)) >> (8 - 1);*/
+/*   if (((R_VAL(src_ptr) - (r << (8 - 2))) >= dith ) && (r < 0x03)) r++;*/
+/*   if (((G_VAL(src_ptr) - (g << (8 - 2))) >= dith ) && (g < 0x03)) g++;*/
+/*   if (((B_VAL(src_ptr) - (b << (8 - 1))) >= dith2) && (b < 0x01)) b++;*/
+   r = (R_VAL(src_ptr)) * 3 / 255;
+   if (((R_VAL(src_ptr) - (r * 255 / 3)) >= dith ) && (r < 0x03)) r++;
+   g = (G_VAL(src_ptr)) * 3 / 255;
+   if (((G_VAL(src_ptr) - (g * 255 / 3)) >= dith ) && (g < 0x03)) g++;
+   b = (B_VAL(src_ptr)) * 1 / 255;
+   if (((B_VAL(src_ptr) - (b * 255 / 1)) >= dith2) && (b < 0x01)) b++;
+
+   *dst_ptr = pal[(r << 3) | (g << 1) | (b)];
+
+   CONVERT_LOOP_END_ROT_0();
+}
+#endif
+#ifdef BUILD_CONVERT_8_RGB_121
+void evas_common_convert_rgba_to_8bpp_rgb_121_dith     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+   DATA8 dith, dith2;
+
+   dst_ptr = (DATA8 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(2);
+   dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(1);
+/*   r = (R_VAL(src_ptr)) >> (8 - 1);*/
+/*   g = (G_VAL(src_ptr)) >> (8 - 2);*/
+/*   b = (B_VAL(src_ptr)) >> (8 - 1);*/
+/*   if (((R_VAL(src_ptr) - (r << (8 - 1))) >= dith2) && (r < 0x01)) r++;*/
+/*   if (((G_VAL(src_ptr) - (g << (8 - 2))) >= dith ) && (g < 0x03)) g++;*/
+/*   if (((B_VAL(src_ptr) - (b << (8 - 1))) >= dith2) && (b < 0x01)) b++;*/
+
+   r = (R_VAL(src_ptr)) * 1 / 255;
+   if (((R_VAL(src_ptr) - (r * 255 / 1)) >= dith2) && (r < 0x01)) r++;
+   g = (G_VAL(src_ptr)) * 3 / 255;
+   if (((G_VAL(src_ptr) - (g * 255 / 3)) >= dith ) && (g < 0x03)) g++;
+   b = (B_VAL(src_ptr)) * 1 / 255;
+   if (((B_VAL(src_ptr) - (b * 255 / 1)) >= dith2) && (b < 0x01)) b++;
+
+   *dst_ptr = pal[(r << 3) | (g << 1) | (b)];
+
+   CONVERT_LOOP_END_ROT_0();
+}
+#endif
+#ifdef BUILD_CONVERT_8_RGB_111
+void evas_common_convert_rgba_to_8bpp_rgb_111_dith     (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal)
+{
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int x, y;
+   DATA8 r, g, b;
+   DATA8 dith;
+
+   dst_ptr = (DATA8 *)dst;
+
+   CONVERT_LOOP_START_ROT_0();
+
+   dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(1);
+/*   r = (R_VAL(src_ptr)) >> (8 - 1);*/
+/*   g = (G_VAL(src_ptr)) >> (8 - 1);*/
+/*   b = (B_VAL(src_ptr)) >> (8 - 1);*/
+/*   if (((R_VAL(src_ptr) - (r << (8 - 1))) >= dith ) && (r < 0x01)) r++;*/
+/*   if (((G_VAL(src_ptr) - (g << (8 - 1))) >= dith ) && (g < 0x01)) g++;*/
+/*   if (((B_VAL(src_ptr) - (b << (8 - 1))) >= dith ) && (b < 0x01)) b++;*/
+
+   r = (R_VAL(src_ptr)) * 1 / 255;
+   if (((R_VAL(src_ptr) - (r * 255 / 1)) >= dith ) && (r < 0x01)) r++;
+   g = (G_VAL(src_ptr)) * 1 / 255;
+   if (((G_VAL(src_ptr) - (g * 255 / 1)) >= dith ) && (g < 0x01)) g++;
+   b = (B_VAL(src_ptr)) * 1 / 255;
+   if (((B_VAL(src_ptr) - (b * 255 / 1)) >= dith ) && (b < 0x01)) b++;
+
+   *dst_ptr = pal[(r << 2) | (g << 1) | (b)];
+
+   CONVERT_LOOP_END_ROT_0();
+}
+#endif
diff --git a/src/lib/engines/common/evas_convert_rgb_8.h b/src/lib/engines/common/evas_convert_rgb_8.h
new file mode 100644 (file)
index 0000000..b7f85b0
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_CONVERT_RGB_8_H
+#define _EVAS_CONVERT_RGB_8_H
+
+
+void evas_common_convert_rgba_to_8bpp_rgb_332_dith             (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_8bpp_rgb_666_dith             (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_8bpp_rgb_232_dith             (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_8bpp_rgb_222_dith             (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_8bpp_rgb_221_dith             (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_8bpp_rgb_121_dith             (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+void evas_common_convert_rgba_to_8bpp_rgb_111_dith             (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+
+
+#endif /* _EVAS_CONVERT_RGB_8_H */
diff --git a/src/lib/engines/common/evas_convert_yuv.c b/src/lib/engines/common/evas_convert_yuv.c
new file mode 100644 (file)
index 0000000..4a24732
--- /dev/null
@@ -0,0 +1,895 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_convert_yuv.h"
+
+#if defined BUILD_MMX || defined BUILD_SSE
+# include "evas_mmx.h"
+#endif
+
+#if defined HAVE_ALTIVEC_H
+# include <altivec.h>
+#ifdef CONFIG_DARWIN
+#define AVV(x...) (x)
+#else
+#define AVV(x...) {x}
+#endif
+
+#endif
+
+#ifdef BUILD_CONVERT_YUV
+
+static void _evas_yuv_init         (void);
+static void _evas_yv12torgb_sse    (unsigned char **yuv, unsigned char *rgb, int w, int h);
+static void _evas_yv12torgb_mmx    (unsigned char **yuv, unsigned char *rgb, int w, int h);
+#ifdef BUILD_ALTIVEC
+static void _evas_yv12torgb_altivec(unsigned char **yuv, unsigned char *rgb, int w, int h);
+static void _evas_yv12torgb_diz    (unsigned char **yuv, unsigned char *rgb, int w, int h);
+#endif
+static void _evas_yv12torgb_raster (unsigned char **yuv, unsigned char *rgb, int w, int h);
+
+#define CRV    104595
+#define CBU    132251
+#define CGU    25624
+#define CGV    53280
+#define YMUL   76283
+#define OFF    32768
+#define BITRES 16
+
+/* calculation float resolution in bits */
+/* ie RES = 6 is 10.6 fixed point */
+/*    RES = 8 is 8.8 fixed point */
+/*    RES = 4 is 12.4 fixed point */
+/* NB: going above 6 will lead to overflow... :( */
+#define RES    6
+
+#define RZ(i)  (i >> (BITRES - RES))
+#define FOUR(i) {i, i, i, i}
+
+#if defined BUILD_MMX || defined BUILD_SSE
+__attribute__ ((aligned (8))) const volatile unsigned short _const_crvcrv[4] = FOUR(RZ(CRV));
+__attribute__ ((aligned (8))) const volatile unsigned short _const_cbucbu[4] = FOUR(RZ(CBU));
+__attribute__ ((aligned (8))) const volatile unsigned short _const_cgucgu[4] = FOUR(RZ(CGU));
+__attribute__ ((aligned (8))) const volatile unsigned short _const_cgvcgv[4] = FOUR(RZ(CGV));
+__attribute__ ((aligned (8))) const volatile unsigned short _const_ymul  [4] = FOUR(RZ(YMUL));
+__attribute__ ((aligned (8))) const volatile unsigned short _const_128   [4] = FOUR(128);
+__attribute__ ((aligned (8))) const volatile unsigned short _const_32    [4] = FOUR(RZ(OFF));
+__attribute__ ((aligned (8))) const volatile unsigned short _const_16    [4] = FOUR(16);
+__attribute__ ((aligned (8))) const volatile unsigned short _const_ff    [4] = FOUR(-1);
+
+#define CONST_CRVCRV *_const_crvcrv
+#define CONST_CBUCBU *_const_cbucbu
+#define CONST_CGUCGU *_const_cgucgu
+#define CONST_CGVCGV *_const_cgvcgv
+#define CONST_YMUL   *_const_ymul
+#define CONST_128    *_const_128
+#define CONST_32     *_const_32
+#define CONST_16     *_const_16
+#define CONST_FF     *_const_ff
+
+/* for C non aligned cleanup */
+const int _crv = RZ(CRV);   /* 1.596 */
+const int _cbu = RZ(CBU);   /* 2.018 */
+const int _cgu = RZ(CGU);   /* 0.391 */
+const int _cgv = RZ(CGV);   /* 0.813 */
+
+#endif
+
+#ifdef BUILD_ALTIVEC
+#ifdef __VEC__
+const vector unsigned short res     = AVV(RES);
+const vector signed short crv       = AVV(RZ(CRV));
+const vector signed short cbu       = AVV(RZ(CBU));
+const vector signed short cgu       = AVV(RZ(CGU));
+const vector signed short cgv       = AVV(RZ(CGV));
+const vector signed short ymul      = AVV(RZ(YMUL));
+const vector signed short c128      = AVV(128);
+const vector signed short c32       = AVV(RZ(OFF));
+const vector signed short c16       = AVV(16);
+const vector unsigned char zero     = AVV(0);
+const vector signed short maxchar   = AVV(255);
+const vector unsigned char pickrg1  = AVV(0, 0x1, 0x11, 0,
+                                         0, 0x3, 0x13, 0,
+                                         0, 0x5, 0x15, 0,
+                                         0, 0x7, 0x17, 0);
+const vector unsigned char pickrg2  = AVV(0, 0x9, 0x19, 0,
+                                         0, 0xb, 0x1b, 0,
+                                         0, 0xd, 0x1d, 0,
+                                         0, 0xf, 0x1f, 0);
+const vector unsigned char pickrgb1 = AVV(0x3, 0x1, 0x2, 0x11,
+                                         0x7, 0x5, 0x6, 0x13,
+                                         0xb, 0x9, 0xa, 0x15,
+                                         0xf, 0xd, 0xe, 0x17);
+const vector unsigned char pickrgb2 = AVV(0x3, 0x1, 0x2, 0x19,
+                                         0x7, 0x5, 0x6, 0x1b,
+                                         0xb, 0x9, 0xa, 0x1d,
+                                         0xf, 0xd, 0xe, 0x1f);
+#endif
+#endif
+
+#ifdef BUILD_C
+
+/* shortcut speedup lookup-tables */
+static short _v1164[256];
+static short _v1596[256];
+static short _v813[256];
+static short _v391[256];
+static short _v2018[256];
+
+static unsigned char _clip_lut[1024];
+#define LUT_CLIP(i) ((_clip_lut+384)[(i)])
+
+#define CMP_CLIP(i) ((i&256)? (~(i>>10)) : i);
+
+#endif
+
+void
+evas_common_convert_yuv_420p_601_rgba(DATA8 **src, DATA8 *dst, int w, int h)
+{
+   int mmx, sse, sse2;
+
+#if defined BUILD_MMX || defined BUILD_SSE
+   evas_common_cpu_can_do(&mmx, &sse, &sse2);
+#endif
+#ifndef BUILD_SSE
+   sse = 0;
+   sse2 = 0;
+#endif
+#ifndef BUILD_MMX
+   mmx = 0;
+#endif
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX2))
+     _evas_yv12torgb_sse(src, dst, w, h);
+   else if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+     _evas_yv12torgb_mmx(src, dst, w, h);
+#ifdef BUILD_ALTIVEC
+   if (evas_common_cpu_has_feature(CPU_FEATURE_ALTIVEC))
+     _evas_yv12torgb_altivec(src, dst, w, h);
+#endif
+   else
+     {
+#ifdef BUILD_C
+       static int initted = 0;
+
+       if (!initted) _evas_yuv_init();
+       initted = 1;
+       /* FIXME: diz may be faster sometimes */
+       _evas_yv12torgb_raster(src, dst, w, h);
+#endif
+     }
+}
+
+/* Thanks to Diz for this code. i've munged it a little and turned it into */
+/* inline macros. I tried beating it with a different algorithm using MMX */
+/* but failed. So here we are. This is the fastest YUV->RGB i know of for */
+/* x86. It has an issue that it doesnt convert colours accurately so the */
+/* image looks a little "yellowy". This is a result of only 10.6 fixed point */
+/* resolution as opposed to 16.16 in the C code. This could be fixed by */
+/* processing half the number of pixels per cycle and going up to 32bits */
+/* per element during compute, but it would all but negate the speedup */
+/* from mmx I think :( It might be possible to use SSE and SSE2 here, but */
+/* I haven't tried yet. Let's see. */
+
+/* NB: XviD has almost the same code in it's assembly YV12->RGB code. same */
+/* algorithm, same constants, same all over actually, except it actually */
+/* does a few extra memory accesses that this one doesn't, so in theory */
+/* this code should be faster. In the end it's all just an mmx version of */
+/* the reference implimentation done with fixed point math */
+
+static void
+_evas_yv12torgb_sse(unsigned char **yuv, unsigned char *rgb, int w, int h)
+{
+#ifdef BUILD_SSE
+   int xx, yy;
+   register unsigned char *yp1, *up, *vp;
+   unsigned char *dp1;
+
+   /* destination pointers */
+   dp1 = rgb;
+
+   for (yy = 0; yy < h; yy++)
+     {
+       /* plane pointers */
+       yp1 = yuv[yy];
+       up = yuv[h + (yy / 2)];
+       vp = yuv[h + (h / 2) + (yy / 2)];
+       for (xx = 0; xx < (w - 7); xx += 8)
+         {
+            movd_m2r(*up, mm3);
+            movd_m2r(*vp, mm2);
+            movq_m2r(*yp1, mm0);
+
+            pxor_r2r(mm7, mm7);
+            punpcklbw_r2r(mm7, mm2);
+            punpcklbw_r2r(mm7, mm3);
+
+            movq_r2r(mm0, mm1);
+            psrlw_i2r(8, mm0);
+            psllw_i2r(8, mm1);
+            psrlw_i2r(8, mm1);
+
+            movq_m2r(CONST_16, mm4);
+            psubsw_r2r(mm4, mm0);
+            psubsw_r2r(mm4, mm1);
+
+            movq_m2r(CONST_128, mm5);
+            psubsw_r2r(mm5, mm2);
+            psubsw_r2r(mm5, mm3);
+
+            movq_m2r(CONST_YMUL, mm4);
+            pmullw_r2r(mm4, mm0);
+            pmullw_r2r(mm4, mm1);
+
+            movq_m2r(CONST_CRVCRV, mm7);
+            pmullw_r2r(mm3, mm7);
+            movq_m2r(CONST_CBUCBU, mm6);
+            pmullw_r2r(mm2, mm6);
+            movq_m2r(CONST_CGUCGU, mm5);
+            pmullw_r2r(mm2, mm5);
+            movq_m2r(CONST_CGVCGV, mm4);
+            pmullw_r2r(mm3, mm4);
+
+            movq_r2r(mm0, mm2);
+            paddsw_r2r(mm7, mm2);
+            paddsw_r2r(mm1, mm7);
+
+            psraw_i2r(RES, mm2);
+            psraw_i2r(RES, mm7);
+            packuswb_r2r(mm7, mm2);
+
+            pxor_r2r(mm7, mm7);
+            movq_r2r(mm2, mm3);
+            punpckhbw_r2r(mm7, mm2);
+            punpcklbw_r2r(mm3, mm7);
+            por_r2r(mm7, mm2);
+
+            movq_r2r(mm0, mm3);
+            psubsw_r2r(mm5, mm3);
+            psubsw_r2r(mm4, mm3);
+            paddsw_m2r(CONST_32, mm3);
+
+            movq_r2r(mm1, mm7);
+            psubsw_r2r(mm5, mm7);
+            psubsw_r2r(mm4, mm7);
+            paddsw_m2r(CONST_32, mm7);
+
+            psraw_i2r(RES, mm3);
+            psraw_i2r(RES, mm7);
+            packuswb_r2r(mm7, mm3);
+
+            pxor_r2r(mm7, mm7);
+            movq_r2r(mm3, mm4);
+            punpckhbw_r2r(mm7, mm3);
+            punpcklbw_r2r(mm4, mm7);
+            por_r2r(mm7, mm3);
+
+            movq_m2r(CONST_32, mm4);
+            paddsw_r2r(mm6, mm0);
+            paddsw_r2r(mm6, mm1);
+            paddsw_r2r(mm4, mm0);
+            paddsw_r2r(mm4, mm1);
+            psraw_i2r(RES, mm0);
+            psraw_i2r(RES, mm1);
+            packuswb_r2r(mm1, mm0);
+
+            pxor_r2r(mm7, mm7);
+            movq_r2r(mm0, mm5);
+            punpckhbw_r2r(mm7, mm0);
+            punpcklbw_r2r(mm5, mm7);
+            por_r2r(mm7, mm0);
+
+            movq_m2r(CONST_FF, mm1);
+            movq_r2r(mm0, mm5);
+            movq_r2r(mm3, mm6);
+            movq_r2r(mm2, mm7);
+            punpckhbw_r2r(mm3, mm2);
+            punpcklbw_r2r(mm6, mm7);
+            punpckhbw_r2r(mm1, mm0);
+            punpcklbw_r2r(mm1, mm5);
+
+            movq_r2r(mm7, mm1);
+            punpckhwd_r2r(mm5, mm7);
+            punpcklwd_r2r(mm5, mm1);
+
+            movq_r2r(mm2, mm4);
+            punpckhwd_r2r(mm0, mm2);
+            punpcklwd_r2r(mm0, mm4);
+
+            movntq_r2m(mm1, *(dp1));
+            movntq_r2m(mm7, *(dp1 + 8));
+            movntq_r2m(mm4, *(dp1 + 16));
+            movntq_r2m(mm2, *(dp1 + 24));
+
+            yp1 += 8;
+            up += 4;
+            vp += 4;
+            dp1 += 8 * 4;
+         }
+       /* cleanup pixles that arent a multiple of 8 pixels wide */
+       if (xx < w)
+         {
+            int y, u, v, r, g, b;
+
+            for (; xx < w; xx += 2)
+              {
+                 u = (*up++) - 128;
+                 v = (*vp++) - 128;
+
+                 y = RZ(YMUL) * ((*yp1++) - 16);
+                 r = LUT_CLIP((y + (_crv * v)) >> RES);
+                 g = LUT_CLIP((y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES);
+                 b = LUT_CLIP((y + (_cbu * u) + RZ(OFF)) >> RES);
+                 *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b);
+
+                 dp1 += 4;
+
+                 y = RZ(YMUL) * ((*yp1++) - 16);
+                 r = LUT_CLIP((y + (_crv * v)) >> RES);
+                 g = LUT_CLIP((y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES);
+                 b = LUT_CLIP((y + (_cbu * u) + RZ(OFF)) >> RES);
+                 *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b);
+
+                 dp1 += 4;
+              }
+         }
+     }
+   emms();
+#else
+   _evas_yv12torgb_mmx(yuv, rgb, w, h);
+#endif
+}
+
+static void
+_evas_yv12torgb_mmx(unsigned char **yuv, unsigned char *rgb, int w, int h)
+{
+#ifdef BUILD_MMX
+   int xx, yy;
+   register unsigned char *yp1, *up, *vp;
+   unsigned char *dp1;
+
+   /* destination pointers */
+   dp1 = rgb;
+
+   for (yy = 0; yy < h; yy++)
+     {
+       /* plane pointers */
+       yp1 = yuv[yy];
+       up = yuv[h + (yy / 2)];
+       vp = yuv[h + (h / 2) + (yy / 2)];
+       for (xx = 0; xx < (w - 7); xx += 8)
+         {
+            movd_m2r(*up, mm3);
+            movd_m2r(*vp, mm2);
+            movq_m2r(*yp1, mm0);
+
+            pxor_r2r(mm7, mm7);
+            punpcklbw_r2r(mm7, mm2);
+            punpcklbw_r2r(mm7, mm3);
+
+            movq_r2r(mm0, mm1);
+            psrlw_i2r(8, mm0);
+            psllw_i2r(8, mm1);
+            psrlw_i2r(8, mm1);
+
+            movq_m2r(CONST_16, mm4);
+            psubsw_r2r(mm4, mm0);
+            psubsw_r2r(mm4, mm1);
+
+            movq_m2r(CONST_128, mm5);
+            psubsw_r2r(mm5, mm2);
+            psubsw_r2r(mm5, mm3);
+
+            movq_m2r(CONST_YMUL, mm4);
+            pmullw_r2r(mm4, mm0);
+            pmullw_r2r(mm4, mm1);
+
+            movq_m2r(CONST_CRVCRV, mm7);
+            pmullw_r2r(mm3, mm7);
+            movq_m2r(CONST_CBUCBU, mm6);
+            pmullw_r2r(mm2, mm6);
+            movq_m2r(CONST_CGUCGU, mm5);
+            pmullw_r2r(mm2, mm5);
+            movq_m2r(CONST_CGVCGV, mm4);
+            pmullw_r2r(mm3, mm4);
+
+            movq_r2r(mm0, mm2);
+            paddsw_r2r(mm7, mm2);
+            paddsw_r2r(mm1, mm7);
+
+            psraw_i2r(RES, mm2);
+            psraw_i2r(RES, mm7);
+            packuswb_r2r(mm7, mm2);
+
+            pxor_r2r(mm7, mm7);
+            movq_r2r(mm2, mm3);
+            punpckhbw_r2r(mm7, mm2);
+            punpcklbw_r2r(mm3, mm7);
+            por_r2r(mm7, mm2);
+
+            movq_r2r(mm0, mm3);
+            psubsw_r2r(mm5, mm3);
+            psubsw_r2r(mm4, mm3);
+            paddsw_m2r(CONST_32, mm3);
+
+            movq_r2r(mm1, mm7);
+            psubsw_r2r(mm5, mm7);
+            psubsw_r2r(mm4, mm7);
+            paddsw_m2r(CONST_32, mm7);
+
+            psraw_i2r(RES, mm3);
+            psraw_i2r(RES, mm7);
+            packuswb_r2r(mm7, mm3);
+
+            pxor_r2r(mm7, mm7);
+            movq_r2r(mm3, mm4);
+            punpckhbw_r2r(mm7, mm3);
+            punpcklbw_r2r(mm4, mm7);
+            por_r2r(mm7, mm3);
+
+            movq_m2r(CONST_32, mm4);
+            paddsw_r2r(mm6, mm0);
+            paddsw_r2r(mm6, mm1);
+            paddsw_r2r(mm4, mm0);
+            paddsw_r2r(mm4, mm1);
+            psraw_i2r(RES, mm0);
+            psraw_i2r(RES, mm1);
+            packuswb_r2r(mm1, mm0);
+
+            pxor_r2r(mm7, mm7);
+            movq_r2r(mm0, mm5);
+            punpckhbw_r2r(mm7, mm0);
+            punpcklbw_r2r(mm5, mm7);
+            por_r2r(mm7, mm0);
+
+            movq_m2r(CONST_FF, mm1);
+            movq_r2r(mm0, mm5);
+            movq_r2r(mm3, mm6);
+            movq_r2r(mm2, mm7);
+            punpckhbw_r2r(mm3, mm2);
+            punpcklbw_r2r(mm6, mm7);
+            punpckhbw_r2r(mm1, mm0);
+            punpcklbw_r2r(mm1, mm5);
+
+            movq_r2r(mm7, mm1);
+            punpckhwd_r2r(mm5, mm7);
+            punpcklwd_r2r(mm5, mm1);
+
+            movq_r2r(mm2, mm4);
+            punpckhwd_r2r(mm0, mm2);
+            punpcklwd_r2r(mm0, mm4);
+
+            movq_r2m(mm1, *(dp1));
+            movq_r2m(mm7, *(dp1 + 8));
+            movq_r2m(mm4, *(dp1 + 16));
+            movq_r2m(mm2, *(dp1 + 24));
+
+            yp1 += 8;
+            up += 4;
+            vp += 4;
+            dp1 += 8 * 4;
+         }
+       /* cleanup pixles that arent a multiple of 8 pixels wide */
+       if (xx < w)
+         {
+            int y, u, v, r, g, b;
+
+            for (; xx < w; xx += 2)
+              {
+                 u = (*up++) - 128;
+                 v = (*vp++) - 128;
+
+                 y = RZ(YMUL) * ((*yp1++) - 16);
+                 r = LUT_CLIP((y + (_crv * v)) >> RES);
+                 g = LUT_CLIP((y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES);
+                 b = LUT_CLIP((y + (_cbu * u) + RZ(OFF)) >> RES);
+                 *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b);
+
+                 dp1 += 4;
+
+                 y = RZ(YMUL) * ((*yp1++) - 16);
+                 r = LUT_CLIP((y + (_crv * v)) >> RES);
+                 g = LUT_CLIP((y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES);
+                 b = LUT_CLIP((y + (_cbu * u) + RZ(OFF)) >> RES);
+                 *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b);
+
+                 dp1 += 4;
+              }
+         }
+     }
+   emms();
+#else
+   _evas_yv12torgb_raster(yuv, rgb, w, h);
+#endif
+}
+
+#ifdef BUILD_ALTIVEC
+static void
+_evas_yv12torgb_altivec(unsigned char **yuv, unsigned char *rgb, int w, int h)
+{
+#ifdef __VEC__
+   int xx, yy;
+   int w2, h2;
+   unsigned char *yp1, *yp2, *up, *vp;
+   unsigned char *dp1, *dp2;
+   vector signed short y, u, v;
+   vector signed short r, g, b;
+   vector signed short tmp1, tmp2, tmp3;
+   vector unsigned char yperm, uperm, vperm, rgb1, rgb2;
+   vector unsigned char alpha;
+
+   /* handy halved w & h */
+   w2 = w / 2;
+   h2 = h / 2;
+   /* plane pointers */
+   yp1 = yuv;
+   yp2 = yuv + w;
+   up = yuv + (w * h);
+   vp = up + (w2 * h2);
+   /* destination pointers */
+   dp1 = rgb;
+   dp2 = rgb + (w * 4);
+
+   alpha = vec_mergeh((vector unsigned char)AVV(255), zero);
+   alpha = (vector unsigned char)vec_mergeh((vector unsigned short)alpha,
+                                           (vector unsigned short)zero);
+
+   for (yy = 0; yy < h2; yy++)
+     {
+       for (xx = 0; xx < w2; xx += 4)
+         {
+/* Cycles */
+            /*
+             * Load 4 y and 4 u & v pixels for the 8x2 pixel block.
+             */
+/* 3 */      tmp3 = (vector signed short)vec_lde(0, (unsigned int *)yp1);
+/* 3 */      tmp1 = (vector signed short)vec_lde(0, (unsigned int *)up);
+/* 3 */      tmp2 = (vector signed short)vec_lde(0, (unsigned int *)vp);
+
+            /* Prepare for aligning the data in their vectors */
+/* 3 */      yperm = vec_lvsl(0, yp1);
+/* 3 */      uperm = vec_lvsl(0, up);
+/* 3 */      vperm = vec_lvsl(0, vp);
+            yp1 += 4;
+
+            /* Save y and load the next 4 y pixels for a total of 8 */
+/* 2 */      y = vec_perm(tmp3, tmp3, yperm);
+/* 3 */      tmp3 = (vector signed short)vec_lde(0, (unsigned int *)yp1);
+
+            /* Setup and calculate the 4 u pixels */
+/* 2 */      tmp1 = vec_perm(tmp1, tmp1, uperm);
+/* 2 */      tmp2 = vec_perm(tmp2, tmp2, vperm);
+
+            /* Avoid dependancy stalls on yperm and calculate the 4 u values */
+/* 3 */      yperm = vec_lvsr(12, yp1);
+/* 1 */      tmp1 = (vector signed short)vec_mergeh((vector unsigned char)tmp1,
+                                                   (vector unsigned char)tmp1);
+/* 1 */      u = (vector signed short)vec_mergeh(zero,
+                                                (vector unsigned char)tmp1);
+
+/* 1 */      u = vec_sub(u, c128);
+/* 2 */      tmp3 = vec_perm(tmp3, tmp3, yperm);
+
+            /* Setup and calculate the 4 v values */
+/* 1 */      tmp2 = (vector signed short)vec_mergeh((vector unsigned char)tmp2,
+                                                   (vector unsigned char)tmp2);
+/* 1 */      v = (vector signed short)vec_mergeh(zero,
+                                                (vector unsigned char)tmp2);
+/* 4 */      tmp2 = vec_mladd(cgu, u, (vector signed short)zero);
+/* 1 */      v = vec_sub(v, c128);
+
+            /* Move the data into y and start loading the next 4 pixels */
+/* 1 */      y = (vector signed short)vec_mergeh(zero,
+                                                (vector unsigned char)y);
+/* 1 */      tmp3 = (vector signed short)vec_mergeh(zero,
+                                                   (vector unsigned char)tmp3);
+/* 1 */      y = vec_or(y, tmp3);
+
+            /* Finish calculating y */
+/* 1 */      y = vec_sub(y, c16);
+/* 4 */      y = vec_mladd(ymul, y, (vector signed short)zero);
+
+            /* Perform non-dependant multiplies first. */
+/* 4 */      tmp1 = vec_mladd(crv, v, y);
+/* 4 */      tmp2 = vec_mladd(cgv, v, tmp2);
+/* 4 */      tmp3 = vec_mladd(cbu, u, y);
+
+            /* Calculate rgb values */
+/* 1 */             r = vec_sra(tmp1, res);
+
+/* 1 */             tmp2 = vec_sub(y, tmp2);
+/* 1 */      tmp2 = vec_add(tmp2, c32);
+/* 1 */      g = vec_sra(tmp2, res);
+
+/* 1 */             tmp3 = vec_add(tmp3, c32);
+/* 1 */             b = vec_sra(tmp3, res);
+
+            /* Bound to 0 <= x <= 255 */
+/* 1 */             r = vec_min(r, maxchar);
+/* 1 */             g = vec_min(g, maxchar);
+/* 1 */             b = vec_min(b, maxchar);
+/* 1 */             r = vec_max(r, (vector signed short)zero);
+/* 1 */             g = vec_max(g, (vector signed short)zero);
+/* 1 */             b = vec_max(b, (vector signed short)zero);
+
+            /* Combine r, g and b. */
+/* 2 */             rgb1 = vec_perm((vector unsigned char)r, (vector unsigned char)g,
+                            pickrg1);
+/* 2 */             rgb2 = vec_perm((vector unsigned char)r, (vector unsigned char)g,
+                           pickrg2);
+
+/* 2 */             rgb1 = vec_perm(rgb1, (vector unsigned char)b, pickrgb1);
+/* 2 */             rgb2 = vec_perm(rgb2, (vector unsigned char)b, pickrgb2);
+
+/* 1 */      rgb1 = vec_or(alpha, rgb1);
+/* 1 */      rgb2 = vec_or(alpha, rgb2);
+
+/* 3 */             vec_stl(rgb1, 0, dp1);
+            dp1 += 16;
+/* 3 */             vec_stl(rgb2, 0, dp1);
+
+            /*
+             * Begin the second row calculations
+             */
+
+            /*
+             * Load 4 y pixels for the 8x2 pixel block.
+             */
+/* 3 */      yperm = vec_lvsl(0, yp2);
+/* 3 */      tmp3 = (vector signed short)vec_lde(0, (unsigned int *)yp2);
+            yp2 += 4;
+
+            /* Save y and load the next 4 y pixels for a total of 8 */
+/* 2 */      y = vec_perm(tmp3, tmp3, yperm);
+/* 3 */      yperm = vec_lvsr(12, yp2);
+/* 3 */      tmp3 = (vector signed short)vec_lde(0, (unsigned int *)yp2);
+/* 1 */      y = (vector signed short)vec_mergeh(zero,
+                                                (vector unsigned char)y);
+
+            /* Avoid dependancy stalls on yperm */
+/* 2 */      tmp3 = vec_perm(tmp3, tmp3, yperm);
+/* 1 */      tmp3 = (vector signed short)vec_mergeh(zero,
+                                                   (vector unsigned char)tmp3);
+/* 1 */      y = vec_or(y, tmp3);
+
+            /* Start the calculation for g */
+/* 4 */      tmp2 = vec_mladd(cgu, u, (vector signed short)zero);
+
+            /* Finish calculating y */
+/* 1 */      y = vec_sub(y, c16);
+/* 4 */      y = vec_mladd(ymul, y, (vector signed short)zero);
+
+            /* Perform non-dependant multiplies first. */
+/* 4 */      tmp2 = vec_mladd(cgv, v, tmp2);
+/* 4 */      tmp1 = vec_mladd(crv, v, y);
+/* 4 */      tmp3 = vec_mladd(cbu, u, y);
+
+            /* Calculate rgb values */
+/* 1 */             r = vec_sra(tmp1, res);
+
+/* 1 */             tmp2 = vec_sub(y, tmp2);
+/* 1 */      tmp2 = vec_add(tmp2, c32);
+/* 1 */      g = vec_sra(tmp2, res);
+
+/* 1 */             tmp3 = vec_add(tmp3, c32);
+/* 1 */             b = vec_sra(tmp3, res);
+
+            /* Bound to 0 <= x <= 255 */
+/* 1 */             r = vec_min(r, maxchar);
+/* 1 */             g = vec_min(g, maxchar);
+/* 1 */             b = vec_min(b, maxchar);
+/* 1 */             r = vec_max(r, (vector signed short)zero);
+/* 1 */             g = vec_max(g, (vector signed short)zero);
+/* 1 */             b = vec_max(b, (vector signed short)zero);
+
+            /* Combine r, g and b. */
+/* 2 */             rgb1 = vec_perm((vector unsigned char)r, (vector unsigned char)g,
+                           pickrg1);
+/* 2 */             rgb2 = vec_perm((vector unsigned char)r, (vector unsigned char)g,
+                           pickrg2);
+
+/* 2 */             rgb1 = vec_perm(rgb1, (vector unsigned char)b, pickrgb1);
+/* 2 */             rgb2 = vec_perm(rgb2, (vector unsigned char)b, pickrgb2);
+
+/* 1 */      rgb1 = vec_or(alpha, rgb1);
+/* 1 */      rgb2 = vec_or(alpha, rgb2);
+
+/* 3 */             vec_stl(rgb1, 0, dp2);
+            dp2 += 16;
+/* 3 */             vec_stl(rgb2, 0, dp2);
+
+            /* Increment the YUV data pointers to the next set of pixels. */
+            yp1 += 4;
+            yp2 += 4;
+            up += 4;
+            vp += 4;
+
+            /* Move the destination pointers to the next set of pixels. */
+            dp1 += 16;
+            dp2 += 16;
+         }
+
+       /* jump down one line since we are doing 2 at once */
+       yp1 += w;
+       yp2 += w;
+       dp1 += (w * 4);
+       dp2 += (w * 4);
+     }
+#else
+   _evas_yv12torgb_diz(yuv, rgb, w, h);
+#endif
+}
+#endif
+
+static void
+_evas_yuv_init(void)
+{
+#ifdef BUILD_C
+   int i;
+
+   for (i = 0; i < 256; i++)
+     {
+       _v1164[i] = (int)(((float)(i - 16 )) * 1.164);
+
+       _v1596[i] = (int)(((float)(i - 128)) * 1.596);
+       _v813[i]  = (int)(((float)(i - 128)) * 0.813);
+
+       _v391[i]  = (int)(((float)(i - 128)) * 0.391);
+       _v2018[i] = (int)(((float)(i - 128)) * 2.018);
+     }
+
+   for (i = -384; i < 640; i++)
+     {
+       _clip_lut[i+384] = i < 0 ? 0 : (i > 255) ? 255 : i;
+     }
+#endif
+}
+
+#ifdef BUILD_ALTIVEC
+static void
+_evas_yv12torgb_diz(unsigned char **yuv, unsigned char *rgb, int w, int h)
+{
+#ifdef BUILD_C
+   int xx, yy;
+   int y, u, v, r, g, b;
+   unsigned char *yp1, *yp2, *up, *vp;
+   unsigned char *dp1, *dp2;
+   int crv, cbu, cgu, cgv;
+
+   /* destination pointers */
+   dp1 = rgb;
+   dp2 = rgb + (w * 4);
+
+   crv = CRV;   /* 1.596 */
+   cbu = CBU;   /* 2.018 */
+   cgu = CGU;   /* 0.391 */
+   cgv = CGV;   /* 0.813 */
+
+   for (yy = 0; yy < h; yy += 2)
+     {
+       /* plane pointers */
+       yp1 = yuv[yy];
+       yp2 = yuv[yy + 1];
+       up = yuv[h + (yy / 2)];
+       vp = yuv[h + (h / 2) + (yy / 2)];
+       for (xx = 0; xx < w; xx += 2)
+         {
+            /* collect u & v for 2x2 pixel block */
+            u = (*up++) - 128;
+            v = (*vp++) - 128;
+
+            /* do the top 2 pixels of the 2x2 block whcih shared u & v */
+            /* yuv to rgb */
+            y = YMUL * ((*yp1++) - 16);
+            r = LUT_CLIP((y + (crv * v)) >> 16);
+            g = LUT_CLIP((y - (cgu * u) - (cgv * v) + OFF) >>16);
+            b = LUT_CLIP((y + (cbu * u) + OFF) >> 16);
+            *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b);
+
+            dp1 += 4;
+
+            /* yuv to rgb */
+            y = YMUL * ((*yp1++) - 16);
+            r = LUT_CLIP((y + (crv * v)) >> 16);
+            g = LUT_CLIP((y - (cgu * u) - (cgv * v) + OFF) >>16);
+            b = LUT_CLIP((y + (cbu * u) + OFF) >> 16);
+            *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b);
+
+            dp1 += 4;
+
+            /* do the bottom 2 pixels */
+            /* yuv to rgb */
+            y = YMUL * ((*yp2++) - 16);
+            r = LUT_CLIP((y + (crv * v)) >> 16);
+            g = LUT_CLIP((y - (cgu * u) - (cgv * v) + OFF) >>16);
+            b = LUT_CLIP((y + (cbu * u) + OFF) >> 16);
+            *((DATA32 *) dp2) = 0xff000000 + RGB_JOIN(r,g,b);
+
+            dp2 += 4;
+
+            /* yuv to rgb */
+            y = YMUL * ((*yp2++) - 16);
+            r = LUT_CLIP((y + (crv * v)) >> 16);
+            g = LUT_CLIP((y - (cgu * u) - (cgv * v) + OFF) >>16);
+            b = LUT_CLIP((y + (cbu * u) + OFF) >> 16);
+            *((DATA32 *) dp2) = 0xff000000 + RGB_JOIN(r,g,b);
+
+            dp2 += 4;
+         }
+       /* jump down one line since we are doing 2 at once */
+       dp1 += (w * 4);
+       dp2 += (w * 4);
+     }
+#endif
+}
+#endif
+
+static void
+_evas_yv12torgb_raster(unsigned char **yuv, unsigned char *rgb, int w, int h)
+{
+#ifdef BUILD_C
+   int xx, yy;
+   int y, u, v;
+   unsigned char *yp1, *yp2, *up, *vp;
+   unsigned char *dp1, *dp2;
+
+   /* destination pointers */
+   dp1 = rgb;
+   dp2 = rgb + (w * 4);
+
+   for (yy = 0; yy < h; yy += 2)
+     {
+       /* plane pointers */
+       yp1 = yuv[yy];
+       yp2 = yuv[yy + 1];
+       up = yuv[h + (yy / 2)];
+       vp = yuv[h + (h / 2) + (yy / 2)];
+       for (xx = 0; xx < w; xx += 2)
+         {
+            int vmu;
+
+            /* collect u & v for 2x2 pixel block */
+            u = *up++;
+            v = *vp++;
+
+            /* save lookups */
+            vmu = _v813[v] + _v391[u];
+            u = _v2018[u];
+            v = _v1596[v];
+
+             /* do the top 2 pixels of the 2x2 block whcih shared u & v */
+            /* yuv to rgb */
+            y = _v1164[*yp1++];
+            *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u));
+
+            dp1 += 4;
+
+            /* yuv to rgb */
+            y = _v1164[*yp1++];
+            *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u));
+
+            dp1 += 4;
+
+            /* do the bottom 2 pixels */
+            /* yuv to rgb */
+            y = _v1164[*yp2++];
+            *((DATA32 *) dp2) = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u));
+
+            dp2 += 4;
+
+            /* yuv to rgb */
+            y = _v1164[*yp2++];
+            *((DATA32 *) dp2) = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u));
+            
+            dp2 += 4;
+         }
+       /* jump down one line since we are doing 2 at once */
+       dp1 += (w * 4);
+       dp2 += (w * 4);
+     }
+#endif
+}
+
+#endif
+
diff --git a/src/lib/engines/common/evas_convert_yuv.h b/src/lib/engines/common/evas_convert_yuv.h
new file mode 100644 (file)
index 0000000..e03ff8b
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_CONVERT_YUV_H
+#define _EVAS_CONVERT_YUV_H
+
+
+EAPI void evas_common_convert_yuv_420p_601_rgba                     (DATA8 **src, DATA8 *dst, int w, int h);
+
+
+#endif /* _EVAS_CONVERT_YUV_H */
diff --git a/src/lib/engines/common/evas_cpu.c b/src/lib/engines/common/evas_cpu.c
new file mode 100644 (file)
index 0000000..1d286d6
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#if defined BUILD_MMX || defined BUILD_SSE
+#include "evas_mmx.h"
+#endif
+
+#ifndef _WIN32
+#include <signal.h>
+#include <setjmp.h>
+#include <errno.h>
+
+static sigjmp_buf detect_buf;
+#endif
+
+static int cpu_feature_mask = 0;
+
+#ifndef _WIN32
+static void evas_common_cpu_catch_ill(int sig);
+static void evas_common_cpu_catch_segv(int sig);
+
+static void
+evas_common_cpu_catch_ill(int sig __UNUSED__)
+{
+   siglongjmp(detect_buf, 1);
+}
+
+static void
+evas_common_cpu_catch_segv(int sig __UNUSED__)
+{
+   siglongjmp(detect_buf, 1);
+}
+#endif
+
+void
+evas_common_cpu_mmx_test(void)
+{
+#ifdef BUILD_MMX
+   pxor_r2r(mm4, mm4);
+#endif
+}
+
+void
+evas_common_cpu_mmx2_test(void)
+{
+#ifdef BUILD_MMX
+   char data[16];
+
+   data[0] = 0;
+   mmx_r2m(movntq, mm0, data);
+   data[0] = 0;
+#endif
+}
+
+void
+evas_common_cpu_sse_test(void)
+{
+#ifdef BUILD_SSE
+   int blah[16];
+
+   movntq_r2m(mm0, blah);
+#endif
+}
+
+void
+evas_common_cpu_altivec_test(void)
+{
+#ifdef __POWERPC__
+#ifdef __VEC__
+   vector unsigned int zero;
+
+   zero = vec_splat_u32(0);
+#endif /* __VEC__ */
+#endif /* __POWERPC__ */
+}
+
+void
+evas_common_cpu_neon_test(void)
+{
+//#if defined(__ARM_ARCH__) && (__ARM_ARCH__ >= 70)
+#ifdef BUILD_NEON
+   asm volatile (
+                 "vqadd.u8 d0, d1, d0\n"
+                 );
+#endif
+//#endif
+}
+
+void
+evas_common_cpu_vis_test(void)
+{
+#ifdef __SPARC__
+#endif /* __SPARC__ */
+}
+
+int
+evas_common_cpu_feature_test(void (*feature)(void))
+{
+#ifndef _WIN32
+   int enabled = 1;
+   struct sigaction act, oact, oact2;
+
+   act.sa_handler = evas_common_cpu_catch_ill;
+   act.sa_flags = SA_RESTART;
+   sigemptyset(&act.sa_mask);
+   sigaction(SIGILL, &act, &oact);
+
+   act.sa_handler = evas_common_cpu_catch_segv;
+   act.sa_flags = SA_RESTART;
+   sigemptyset(&act.sa_mask);
+   sigaction(SIGSEGV, &act, &oact2);
+
+   if (sigsetjmp(detect_buf, 1))
+     {
+       sigaction(SIGILL, &oact, NULL);
+       sigaction(SIGSEGV, &oact2, NULL);
+       return 0;
+     }
+
+   feature();
+
+   sigaction(SIGILL, &oact, NULL);
+   sigaction(SIGSEGV, &oact2, NULL);
+   return enabled;
+#else
+   return 0;
+#endif
+}
+
+EAPI void
+evas_common_cpu_init(void)
+{
+   static int called = 0;
+
+   if (called) return;
+   called = 1;
+#ifdef BUILD_MMX
+   cpu_feature_mask |= CPU_FEATURE_MMX *
+     evas_common_cpu_feature_test(evas_common_cpu_mmx_test);
+   evas_common_cpu_end_opt();
+   if (getenv("EVAS_CPU_NO_MMX"))
+     cpu_feature_mask &= ~CPU_FEATURE_MMX;
+   cpu_feature_mask |= CPU_FEATURE_MMX2 *
+     evas_common_cpu_feature_test(evas_common_cpu_mmx2_test);
+   evas_common_cpu_end_opt();
+   if (getenv("EVAS_CPU_NO_MMX2"))
+     cpu_feature_mask &= ~CPU_FEATURE_MMX2;
+#ifdef BUILD_SSE
+   cpu_feature_mask |= CPU_FEATURE_SSE *
+     evas_common_cpu_feature_test(evas_common_cpu_sse_test);
+   evas_common_cpu_end_opt();
+   if (getenv("EVAS_CPU_NO_SSE"))
+     cpu_feature_mask &= ~CPU_FEATURE_SSE;
+#endif /* BUILD_SSE */
+#endif /* BUILD_MMX */
+#ifdef __POWERPC__
+#ifdef __VEC__
+   cpu_feature_mask |= CPU_FEATURE_ALTIVEC *
+     evas_common_cpu_feature_test(evas_common_cpu_altivec_test);
+   evas_common_cpu_end_opt();
+   if (getenv("EVAS_CPU_NO_ALTIVEC"))
+     cpu_feature_mask &= ~CPU_FEATURE_ALTIVEC;
+#endif /* __VEC__ */
+#endif /* __POWERPC__ */
+#ifdef __SPARC__
+   cpu_feature_mask |= CPU_FEATURE_VIS *
+     evas_common_cpu_feature_test(evas_common_cpu_vis_test);
+   evas_common_cpu_end_opt();
+   if (getenv("EVAS_CPU_NO_VIS"))
+     cpu_feature_mask &= ~CPU_FEATURE_VIS;
+#endif /* __SPARC__ */
+#if defined(__ARM_ARCH__) && (__ARM_ARCH__ >= 70)
+#ifdef BUILD_NEON
+   cpu_feature_mask |= CPU_FEATURE_NEON *
+     evas_common_cpu_feature_test(evas_common_cpu_neon_test);
+   evas_common_cpu_end_opt();
+#endif
+#endif
+}
+
+int
+evas_common_cpu_has_feature(unsigned int feature)
+{
+   return (cpu_feature_mask & feature);
+}
+
+int
+evas_common_cpu_have_cpuid(void)
+{
+   return 0;
+/*
+#ifdef BUILD_MMX
+   unsigned int have_cpu_id;
+
+   have_cpu_id = 0;
+   have_cpuid(have_cpu_id);
+   return have_cpu_id;
+#else
+   return 0;
+#endif
+ */
+}
+
+EAPI void
+evas_common_cpu_can_do(int *mmx, int *sse, int *sse2)
+{
+   static int do_mmx = 0, do_sse = 0, do_sse2 = 0, done = 0;
+
+   if (!done)
+     {
+# ifdef HARD_CODED_P3
+       cpu_feature_mask |= CPU_FEATURE_MMX;
+       cpu_feature_mask |= CPU_FEATURE_SSE;
+#endif
+#ifdef HARD_CODED_P2
+       cpu_feature_mask |= CPU_FEATURE_MMX;
+#endif
+       if (cpu_feature_mask & CPU_FEATURE_MMX) do_mmx = 1;
+       if (cpu_feature_mask & CPU_FEATURE_MMX2) do_sse = 1;
+       if (cpu_feature_mask & CPU_FEATURE_SSE) do_sse = 1;
+     }
+//   INF("%i %i %i", do_mmx, do_sse, do_sse2);
+   *mmx = do_mmx;
+   *sse = do_sse;
+   *sse2 = do_sse2;
+   done = 1;
+}
+
+#ifdef BUILD_MMX
+EAPI void
+evas_common_cpu_end_opt(void)
+{
+   if (cpu_feature_mask &
+       (CPU_FEATURE_MMX | CPU_FEATURE_MMX2))
+     {
+       emms();
+     }
+}
+#else
+EAPI void
+evas_common_cpu_end_opt(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_draw.h b/src/lib/engines/common/evas_draw.h
new file mode 100644 (file)
index 0000000..4683bc3
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_DRAW_H
+#define _EVAS_DRAW_H
+
+
+EAPI void               evas_common_draw_init                            (void);
+
+EAPI RGBA_Draw_Context *evas_common_draw_context_new                     (void);
+EAPI void               evas_common_draw_context_free                    (RGBA_Draw_Context *dc);
+EAPI void               evas_common_draw_context_font_ext_set            (RGBA_Draw_Context *dc,
+                                                                          void *data,
+                                                                          void *(*gl_new)  (void *data, RGBA_Font_Glyph *fg),
+                                                                          void  (*gl_free) (void *ext_dat),
+                                                                          void  (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y));
+EAPI void               evas_common_draw_context_clip_clip               (RGBA_Draw_Context *dc, int x, int y, int w, int h);
+EAPI void               evas_common_draw_context_set_clip                (RGBA_Draw_Context *dc, int x, int y, int w, int h);
+EAPI void               evas_common_draw_context_unset_clip              (RGBA_Draw_Context *dc);
+EAPI void               evas_common_draw_context_set_color               (RGBA_Draw_Context *dc, int r, int g, int b, int a);
+EAPI void               evas_common_draw_context_set_multiplier          (RGBA_Draw_Context *dc, int r, int g, int b, int a);
+EAPI void               evas_common_draw_context_unset_multiplier        (RGBA_Draw_Context *dc);
+EAPI Cutout_Rects      *evas_common_draw_context_cutouts_new             (void);
+EAPI void               evas_common_draw_context_cutouts_free            (Cutout_Rects* rects);
+EAPI void               evas_common_draw_context_cutouts_del             (Cutout_Rects* rects, int index);
+EAPI void               evas_common_draw_context_add_cutout              (RGBA_Draw_Context *dc, int x, int y, int w, int h);
+EAPI void               evas_common_draw_context_clear_cutouts           (RGBA_Draw_Context *dc);
+EAPI Cutout_Rects      *evas_common_draw_context_apply_cutouts           (RGBA_Draw_Context *dc);
+EAPI void               evas_common_draw_context_apply_clear_cutouts     (Cutout_Rects* rects);
+EAPI void               evas_common_draw_context_apply_clean_cutouts     (Cutout_Rects* rects);
+EAPI void               evas_common_draw_context_set_anti_alias          (RGBA_Draw_Context *dc, unsigned char aa);
+EAPI void               evas_common_draw_context_set_color_interpolation (RGBA_Draw_Context *dc, int color_space);
+EAPI void               evas_common_draw_context_set_render_op           (RGBA_Draw_Context *dc, int op);
+EAPI void               evas_common_draw_context_set_sli                 (RGBA_Draw_Context *dc, int y, int h);
+
+
+#endif /* _EVAS_DRAW_H */
diff --git a/src/lib/engines/common/evas_draw_main.c b/src/lib/engines/common/evas_draw_main.c
new file mode 100644 (file)
index 0000000..7fe510c
--- /dev/null
@@ -0,0 +1,560 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_convert_main.h"
+#include "evas_private.h"
+
+EAPI Cutout_Rects*
+evas_common_draw_context_cutouts_new(void)
+{
+   Cutout_Rects *rects;
+
+   rects = calloc(1, sizeof(Cutout_Rects));
+   return rects;
+}
+
+EAPI void
+evas_common_draw_context_cutouts_free(Cutout_Rects* rects)
+{
+   rects->active = 0;
+}
+
+EAPI void
+evas_common_draw_context_cutouts_del(Cutout_Rects* rects,
+                                     int index)
+{
+   if ((index >= 0) && (index < rects->active))
+     {
+        Cutout_Rect*    rect;
+
+       rect = rects->rects + index;
+        memmove(rect, rect + 1,
+               sizeof(Cutout_Rect) * (rects->active - index - 1));
+        rects->active--;
+     }
+}
+
+void
+evas_common_init(void)
+{
+   evas_common_cpu_init();
+
+   evas_common_blend_init();
+   evas_common_image_init();
+   evas_common_convert_init();
+   evas_common_scale_init();
+   evas_common_rectangle_init();
+   evas_common_gradient_init();
+   evas_common_polygon_init();
+   evas_common_line_init();
+   evas_common_font_init();
+   evas_common_draw_init();
+   evas_common_tilebuf_init();
+}
+
+void
+evas_common_shutdown(void)
+{
+   evas_font_dir_cache_free();
+   evas_common_image_cache_free();
+}
+
+EAPI void
+evas_common_draw_init(void)
+{
+}
+
+EAPI RGBA_Draw_Context *
+evas_common_draw_context_new(void)
+{
+   RGBA_Draw_Context *dc;
+
+   dc = calloc(1, sizeof(RGBA_Draw_Context));
+   dc->sli.h = 1;
+   return dc;
+}
+
+EAPI void
+evas_common_draw_context_free(RGBA_Draw_Context *dc)
+{
+   if (!dc) return;
+
+   evas_common_draw_context_apply_clean_cutouts(&dc->cutout);
+   free(dc);
+}
+
+EAPI void
+evas_common_draw_context_clear_cutouts(RGBA_Draw_Context *dc)
+{
+   evas_common_draw_context_apply_clean_cutouts(&dc->cutout);
+}
+
+EAPI void
+evas_common_draw_context_font_ext_set(RGBA_Draw_Context *dc,
+                                     void *data,
+                                     void *(*gl_new)  (void *data, RGBA_Font_Glyph *fg),
+                                     void  (*gl_free) (void *ext_dat),
+                                     void  (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y))
+{
+   dc->font_ext.data = data;
+   dc->font_ext.func.gl_new = gl_new;
+   dc->font_ext.func.gl_free = gl_free;
+   dc->font_ext.func.gl_draw = gl_draw;
+}
+
+EAPI void
+evas_common_draw_context_clip_clip(RGBA_Draw_Context *dc, int x, int y, int w, int h)
+{
+   if (dc->clip.use)
+     {
+       RECTS_CLIP_TO_RECT(dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h,
+                          x, y, w, h);
+     }
+   else
+     evas_common_draw_context_set_clip(dc, x, y, w, h);
+}
+
+EAPI void
+evas_common_draw_context_set_clip(RGBA_Draw_Context *dc, int x, int y, int w, int h)
+{
+   dc->clip.use = 1;
+   dc->clip.x = x;
+   dc->clip.y = y;
+   dc->clip.w = w;
+   dc->clip.h = h;
+}
+
+EAPI void
+evas_common_draw_context_unset_clip(RGBA_Draw_Context *dc)
+{
+   dc->clip.use = 0;
+}
+
+EAPI void
+evas_common_draw_context_set_color(RGBA_Draw_Context *dc, int r, int g, int b, int a)
+{
+   R_VAL(&(dc->col.col)) = (DATA8)r;
+   G_VAL(&(dc->col.col)) = (DATA8)g;
+   B_VAL(&(dc->col.col)) = (DATA8)b;
+   A_VAL(&(dc->col.col)) = (DATA8)a;
+}
+
+EAPI void
+evas_common_draw_context_set_multiplier(RGBA_Draw_Context *dc, int r, int g, int b, int a)
+{
+   dc->mul.use = 1;
+   R_VAL(&(dc->mul.col)) = (DATA8)r;
+   G_VAL(&(dc->mul.col)) = (DATA8)g;
+   B_VAL(&(dc->mul.col)) = (DATA8)b;
+   A_VAL(&(dc->mul.col)) = (DATA8)a;
+}
+
+EAPI void
+evas_common_draw_context_unset_multiplier(RGBA_Draw_Context *dc)
+{
+   dc->mul.use = 0;
+}
+
+EAPI void
+evas_common_draw_context_add_cutout(RGBA_Draw_Context *dc, int x, int y, int w, int h)
+{
+   if (dc->clip.use)
+     {
+#if 1 // this is a bit faster
+        int xa1, xa2, xb1, xb2;
+        
+        xa1 = x;
+        xa2 = xa1 + w - 1;
+        xb1 = dc->clip.x;
+        if (xa2 < xb1) return;
+        xb2 = xb1 + dc->clip.w - 1;
+        if (xa1 >= xb2) return;
+        if (xa2 > xb2) xa2 = xb2; 
+        if (xb1 > xa1) xa1 = xb1;
+        x = xa1;
+        w = xa2 - xa1 + 1;
+        
+        xa1 = y;
+        xa2 = xa1 + h - 1;
+        xb1 = dc->clip.y;
+        if (xa2 < xb1) return;
+        xb2 = xb1 + dc->clip.h - 1; 
+        if (xa1 >= xb2) return;
+        if (xa2 > xb2) xa2 = xb2; 
+        if (xb1 > xa1) xa1 = xb1;
+        y = xa1;
+        h = xa2 - xa1 + 1;
+#else        
+        RECTS_CLIP_TO_RECT(x, y, w, h,
+                          dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h);
+#endif        
+       if ((w < 1) || (h < 1)) return;
+     }
+   evas_common_draw_context_cutouts_add(&dc->cutout, x, y, w, h);
+}
+
+int
+evas_common_draw_context_cutout_split(Cutout_Rects* res, int index, Cutout_Rect *split)
+{
+   /* 1 input rect, multiple out */
+   Cutout_Rect  in = res->rects[index];
+
+   /* this is to save me a LOT of typing */
+#define INX1 (in.x)
+#define INX2 (in.x + in.w)
+#define SPX1 (split->x)
+#define SPX2 (split->x + split->w)
+#define INY1 (in.y)
+#define INY2 (in.y + in.h)
+#define SPY1 (split->y)
+#define SPY2 (split->y + split->h)
+#define X1_IN (in.x < split->x)
+#define X2_IN ((in.x + in.w) > (split->x + split->w))
+#define Y1_IN (in.y < split->y)
+#define Y2_IN ((in.y + in.h) > (split->y + split->h))
+#define R_NEW(_r, _x, _y, _w, _h) { evas_common_draw_context_cutouts_add(_r, _x, _y, _w, _h); }
+   if (!RECTS_INTERSECT(in.x, in.y, in.w, in.h,
+                       split->x, split->y, split->w, split->h))
+     {
+        /* No colision => no clipping, don't touch it. */
+       return 1;
+     }
+
+   /* S    = split (ie cut out rect) */
+   /* +--+ = in (rect to be cut) */
+
+   /*
+    *  +---+
+    *  |   |
+    *  | S |
+    *  |   |
+    *  +---+
+    *
+    */
+   if (X1_IN && X2_IN && Y1_IN && Y2_IN)
+     {
+        R_NEW(res, in.x, in.y, in.w, SPY1 - in.y);
+       R_NEW(res, in.x, SPY1, SPX1 - in.x, SPY2 - SPY1);
+       R_NEW(res, SPX2, SPY1, INX2 - SPX2, SPY2 - SPY1);
+        /* out => (in.x, SPY2, in.w, INY2 - SPY2) */
+        res->rects[index].h = INY2 - SPY2;
+        res->rects[index].y = SPY2;
+       return 1;
+     }
+   /* SSSSSSS
+    * S+---+S
+    * S|SSS|S
+    * S|SSS|S
+    * S|SSS|S
+    * S+---+S
+    * SSSSSSS
+    */
+   if (!X1_IN && !X2_IN && !Y1_IN && !Y2_IN)
+     {
+        evas_common_draw_context_cutouts_del(res, index);
+       return 0;
+     }
+   /* SSS
+    * S+---+
+    * S|S  |
+    * S|S  |
+    * S|S  |
+    * S+---+
+    * SSS
+    */
+   if (!X1_IN && X2_IN && !Y1_IN && !Y2_IN)
+     {
+        /* in => (SPX2, in.y, INX2 - SPX2, in.h) */
+        res->rects[index].w = INX2 - SPX2;
+        res->rects[index].x = SPX2;
+       return 1;
+     }
+   /*    S
+    *  +---+
+    *  | S |
+    *  | S |
+    *  | S |
+    *  +---+
+    *    S
+    */
+   if (X1_IN && X2_IN && !Y1_IN && !Y2_IN)
+     {
+        R_NEW(res, in.x, in.y, SPX1 - in.x, in.h);
+        /* in => (SPX2, in.y, INX2 - SPX2, in.h) */
+        res->rects[index].w = INX2 - SPX2;
+        res->rects[index].x = SPX2;
+       return 1;
+     }
+   /*     SSS
+    *  +---+S
+    *  |  S|S
+    *  |  S|S
+    *  |  S|S
+    *  +---+S
+    *     SSS
+    */
+   if (X1_IN && !X2_IN && !Y1_IN && !Y2_IN)
+     {
+        /* in => (in.x, in.y, SPX1 - in.x, in.h) */
+        res->rects[index].w = SPX1 - in.x;
+       return 1;
+     }
+   /* SSSSSSS
+    * S+---+S
+    * S|SSS|S
+    *  |   |
+    *  |   |
+    *  +---+
+    *
+    */
+   if (!X1_IN && !X2_IN && !Y1_IN && Y2_IN)
+     {
+        /* in => (in.x, SPY2, in.w, INY2 - SPY2) */
+        res->rects[index].h = INY2 - SPY2;
+        res->rects[index].y = SPY2;
+       return 1;
+     }
+   /*
+    *  +---+
+    *  |   |
+    * S|SSS|S
+    *  |   |
+    *  +---+
+    *
+    */
+   if (!X1_IN && !X2_IN && Y1_IN && Y2_IN)
+     {
+        R_NEW(res, in.x, SPY2, in.w, INY2 - SPY2);
+        /* in => (in.x, in.y, in.w, SPY1 - in.y) */
+        res->rects[index].h = SPY1 - in.y;
+       return 1;
+     }
+   /*
+    *  +---+
+    *  |   |
+    *  |   |
+    * S|SSS|S
+    * S+---+S
+    * SSSSSSS
+    */
+   if (!X1_IN && !X2_IN && Y1_IN && !Y2_IN)
+     {
+        /* in => (in.x, in.y, in.w, SPY1 - in.y) */
+        res->rects[index].h = SPY1 - in.y;
+       return 1;
+     }
+   /* SSS
+    * S+---+
+    * S|S  |
+    *  |   |
+    *  |   |
+    *  +---+
+    *
+    */
+   if (!X1_IN && X2_IN && !Y1_IN && Y2_IN)
+     {
+       R_NEW(res, SPX2, in.y, INX2 - SPX2, SPY2 - in.y);
+        /* in => (in.x, SPY2, in.w, INY2 - SPY2) */
+        res->rects[index].h = INY2 - SPY2;
+        res->rects[index].y = SPY2;
+       return 1;
+     }
+   /*    S
+    *  +---+
+    *  | S |
+    *  |   |
+    *  |   |
+    *  +---+
+    *
+    */
+   if (X1_IN && X2_IN && !Y1_IN && Y2_IN)
+     {
+       R_NEW(res, in.x, in.y, SPX1 - in.x, SPY2 - in.y);
+       R_NEW(res, SPX2, in.y, INX2 - SPX2, SPY2 - in.y);
+        /* in => (in.x, SPY2, in.w, INY2 - SPY2) */
+        res->rects[index].h = INY2 - SPY2;
+        res->rects[index].y = SPY2;
+       return 1;
+     }
+   /*     SSS
+    *  +---+S
+    *  |  S|S
+    *  |   |
+    *  |   |
+    *  +---+
+    *
+    */
+   if (X1_IN && !X2_IN && !Y1_IN && Y2_IN)
+     {
+       R_NEW(res, in.x, in.y, SPX1 - in.x, SPY2 - in.y);
+        /* in => (in.x, SPY2, in.w, INY2 - SPY2) */
+        res->rects[index].h = INY2 - SPY2;
+        res->rects[index].y = SPY2;
+       return 1;
+     }
+   /*
+    *  +---+
+    *  |   |
+    * S|S  |
+    *  |   |
+    *  +---+
+    *
+    */
+   if (!X1_IN && X2_IN && Y1_IN && Y2_IN)
+     {
+       R_NEW(res, in.x, SPY2, in.w, INY2 - SPY2);
+       R_NEW(res, SPX2, SPY1, INX2 - SPX2, SPY2 - SPY1);
+        /* in => (in.x, SPY2, in.w, INY2 - SPY2) */
+        res->rects[index].h = SPY1 - in.y;
+       return 1;
+     }
+   /*
+    *  +---+
+    *  |   |
+    *  |  S|S
+    *  |   |
+    *  +---+
+    *
+    */
+   if (X1_IN && !X2_IN && Y1_IN && Y2_IN)
+     {
+       R_NEW(res, in.x, SPY2, in.w, INY2 - SPY2);
+       R_NEW(res, in.x, SPY1, SPX1 - in.x, SPY2 - SPY1);
+        /* in => (in.x, in.y, in.w, SPY1 - in.y) */
+        res->rects[index].h = SPY1 - in.y;
+       return 1;
+     }
+   /*
+    *  +---+
+    *  |   |
+    *  |   |
+    * S|S  |
+    * S+---+
+    * SSS
+    */
+   if (!X1_IN && X2_IN && Y1_IN && !Y2_IN)
+     {
+        R_NEW(res, SPX2, SPY1, INX2 - SPX2, INY2 - SPY1);
+        /* in => (in.x, in.y, in.w, SPY1 - in.y) */
+        res->rects[index].h = SPY1 - in.y;
+       return 1;
+     }
+   /*
+    *  +---+
+    *  |   |
+    *  |   |
+    *  | S |
+    *  +---+
+    *    S
+    */
+   if (X1_IN && X2_IN && Y1_IN && !Y2_IN)
+     {
+       R_NEW(res, in.x, SPY1, SPX1 - in.x, INY2 - SPY1);
+        R_NEW(res, SPX2, SPY1, INX2 - SPX2, INY2 - SPY1);
+        /* in => (in.x, in.y, in.w, SPY1 - in.y) */
+        res->rects[index].h = SPY1 - in.y;
+       return 1;
+     }
+   /*
+    *  +---+
+    *  |   |
+    *  |   |
+    *  |  S|S
+    *  +---+S
+    *     SSS
+    */
+   if (X1_IN && !X2_IN && Y1_IN && !Y2_IN)
+     {
+        R_NEW(res, in.x, SPY1, SPX1 - in.x, INY2 - SPY1);
+        /* in => (in.x, in.y, in.w, SPY1 - in.y) */
+        res->rects[index].h = SPY1 - in.y;
+       return 1;
+     }
+   evas_common_draw_context_cutouts_del(res, index);
+   return 0;
+#undef INX1
+#undef INX2
+#undef SPX1
+#undef SPX2
+#undef INY1
+#undef INY2
+#undef SPY1
+#undef SPY2
+#undef X1_IN
+#undef X2_IN
+#undef Y1_IN
+#undef Y2_IN
+#undef R_NEW
+}
+
+EAPI Cutout_Rects*
+evas_common_draw_context_apply_cutouts(RGBA_Draw_Context *dc)
+{
+   Cutout_Rects*        res;
+   int                  i;
+   int                  j;
+
+   if (!dc->clip.use) return NULL;
+   if ((dc->clip.w <= 0) || (dc->clip.h <= 0)) return NULL;
+
+   res = evas_common_draw_context_cutouts_new();
+   evas_common_draw_context_cutouts_add(res, dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h);
+
+   for (i = 0; i < dc->cutout.active; ++i)
+     {
+        /* Don't loop on the element just added to the list as they are already correctly clipped. */
+        int active = res->active;
+
+        for (j = 0; j < active; )
+          {
+             if (evas_common_draw_context_cutout_split(res, j, dc->cutout.rects + i))
+               ++j;
+             else
+               active--;
+          }
+     }
+   return res;
+}
+
+EAPI void
+evas_common_draw_context_apply_clear_cutouts(Cutout_Rects* rects)
+{
+   evas_common_draw_context_apply_clean_cutouts(rects);
+   free(rects);
+}
+
+EAPI void
+evas_common_draw_context_apply_clean_cutouts(Cutout_Rects* rects)
+{
+   free(rects->rects);
+   rects->rects = NULL;
+   rects->active = 0;
+   rects->max = 0;
+}
+
+EAPI void
+evas_common_draw_context_set_anti_alias(RGBA_Draw_Context *dc , unsigned char aa)
+{
+   dc->anti_alias = !!aa;
+}
+
+EAPI void
+evas_common_draw_context_set_color_interpolation(RGBA_Draw_Context *dc, int color_space)
+{
+   dc->interpolation.color_space = color_space;
+}
+
+EAPI void
+evas_common_draw_context_set_render_op(RGBA_Draw_Context *dc , int op)
+{
+   dc->render_op = op;
+}
+
+EAPI void
+evas_common_draw_context_set_sli(RGBA_Draw_Context *dc, int y, int h)
+{
+   dc->sli.y = y;
+   dc->sli.h = h;
+}
diff --git a/src/lib/engines/common/evas_font.h b/src/lib/engines/common/evas_font.h
new file mode 100644 (file)
index 0000000..e776fe4
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_FONT_H
+#define _EVAS_FONT_H
+
+
+/* main */
+
+EAPI void              evas_common_font_init                 (void);
+EAPI void              evas_common_font_shutdown             (void);
+EAPI void              evas_common_font_font_all_unload      (void);
+    
+EAPI int               evas_common_font_ascent_get           (RGBA_Font *fn);
+EAPI int               evas_common_font_descent_get          (RGBA_Font *fn);
+EAPI int               evas_common_font_max_ascent_get       (RGBA_Font *fn);
+EAPI int               evas_common_font_max_descent_get      (RGBA_Font *fn);
+EAPI int               evas_common_font_get_line_advance     (RGBA_Font *fn);
+
+EAPI int               evas_common_font_utf8_get_next        (const unsigned char *buf, int *iindex);
+EAPI int               evas_common_font_utf8_get_prev        (const unsigned char *buf, int *iindex);
+EAPI int               evas_common_font_utf8_get_last        (const unsigned char *buf, int buflen);
+EAPI int               evas_common_font_utf8_get_len         (const unsigned char *buf);
+
+/* draw */
+
+EAPI void              evas_common_font_draw                 (RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int x, int y, const char *text);
+EAPI int               evas_common_font_glyph_search         (RGBA_Font *fn, RGBA_Font_Int **fi_ret, int gl);
+EAPI RGBA_Font_Glyph  *evas_common_font_int_cache_glyph_get  (RGBA_Font_Int *fi, FT_UInt index);
+
+/* load */
+EAPI void              evas_common_font_dpi_set              (int dpi);
+EAPI RGBA_Font_Source *evas_common_font_source_memory_load   (const char *name, const void *data, int data_size);
+EAPI RGBA_Font_Source *evas_common_font_source_load          (const char *name);
+EAPI int               evas_common_font_source_load_complete (RGBA_Font_Source *fs);
+EAPI RGBA_Font_Source *evas_common_font_source_find          (const char *name);
+EAPI void              evas_common_font_source_free          (RGBA_Font_Source *fs);
+EAPI void              evas_common_font_size_use             (RGBA_Font *fn);
+EAPI RGBA_Font        *evas_common_font_memory_load          (const char *name, int size, const void *data, int data_size);
+EAPI RGBA_Font_Int    *evas_common_font_int_load             (const char *name, int size);
+EAPI RGBA_Font_Int    *evas_common_font_int_load_init        (RGBA_Font_Int *fn);
+EAPI RGBA_Font_Int    *evas_common_font_int_load_complete    (RGBA_Font_Int *fi);
+EAPI RGBA_Font        *evas_common_font_memory_load          (const char *name, int size, const void *data, int data_size);
+EAPI RGBA_Font        *evas_common_font_load                 (const char *name, int size);
+EAPI RGBA_Font        *evas_common_font_add                  (RGBA_Font *fn, const char *name, int size);
+EAPI RGBA_Font        *evas_common_font_memory_add           (RGBA_Font *fn, const char *name, int size, const void *data, int data_size);
+EAPI void              evas_common_font_free                 (RGBA_Font *fn);
+EAPI void              evas_common_font_hinting_set          (RGBA_Font *fn, Font_Hint_Flags hinting);
+EAPI Eina_Bool         evas_common_hinting_available         (Font_Hint_Flags hinting);
+EAPI RGBA_Font        *evas_common_font_memory_hinting_load  (const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting);
+EAPI RGBA_Font        *evas_common_font_hinting_load         (const char *name, int size, Font_Hint_Flags hinting);
+EAPI RGBA_Font        *evas_common_font_hinting_add          (RGBA_Font *fn, const char *name, int size, Font_Hint_Flags hinting);
+EAPI RGBA_Font        *evas_common_font_memory_hinting_add   (RGBA_Font *fn, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting);
+EAPI void              evas_common_font_int_modify_cache_by  (RGBA_Font_Int *fi, int dir);
+EAPI int               evas_common_font_cache_get            (void);
+EAPI void              evas_common_font_cache_set            (int size);
+EAPI void              evas_common_font_flush                (void);
+EAPI void              evas_common_font_flush_last           (void);
+EAPI RGBA_Font_Int    *evas_common_font_int_find             (const char *name, int size);
+
+/* query */
+
+EAPI int               evas_common_font_query_kerning        (RGBA_Font_Int* fi, FT_UInt prev, FT_UInt index, int* kerning);
+EAPI void              evas_common_font_query_size           (RGBA_Font *fn, const char *text, int *w, int *h);
+EAPI int               evas_common_font_query_inset          (RGBA_Font *fn, const char *text);
+EAPI void              evas_common_font_query_advance        (RGBA_Font *fn, const char *text, int *h_adv, int *v_adv);
+EAPI int               evas_common_font_query_char_coords    (RGBA_Font *fn, const char *text, int pos, int *cx, int *cy, int *cw, int *ch);
+EAPI int               evas_common_font_query_text_at_pos    (RGBA_Font *fn, const char *text, int x, int y, int *cx, int *cy, int *cw, int *ch);
+EAPI int               evas_common_font_query_last_up_to_pos (RGBA_Font *fn, const char *text, int x, int y);
+
+void evas_common_font_load_init(void);
+void evas_common_font_load_shutdown(void);
+
+#endif /* _EVAS_FONT_H */
diff --git a/src/lib/engines/common/evas_font_draw.c b/src/lib/engines/common/evas_font_draw.c
new file mode 100644 (file)
index 0000000..87372de
--- /dev/null
@@ -0,0 +1,620 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_blend_private.h"
+
+#include "evas_intl_utils.h" /*defines INTERNATIONAL_SUPPORT if possible */
+
+
+static void
+_fash_int_free(Fash_Int *fash)
+{
+   int i;
+   
+   for (i = 0; i < 256; i++) if (fash->bucket[i]) free(fash->bucket[i]);
+   free(fash);
+}
+
+static Fash_Int *
+_fash_int_new(void)
+{
+   Fash_Int *fash = calloc(1, sizeof(Fash_Int));
+   fash->freeme = _fash_int_free;
+   return fash;
+}
+
+static Fash_Item_Index_Map *
+_fash_int_find(Fash_Int *fash, int item)
+{
+   int maj, min;
+
+   item &= 0xffff; // fixme: to do > 65k
+   maj = (item >> 8) & 0xff;
+   min = item & 0xff;
+   if (!fash->bucket[maj]) return NULL;
+   return &(fash->bucket[maj]->item[min]);
+}
+
+static void
+_fash_int_add(Fash_Int *fash, int item, RGBA_Font_Int *fint, int index)
+{
+   int maj, min;
+   
+   item &= 0xffff; // fixme: to do > 65k
+   maj = (item >> 8) & 0xff;
+   min = item & 0xff;
+   if (!fash->bucket[maj])
+     fash->bucket[maj] = calloc(1, sizeof(Fash_Int_Map));
+   fash->bucket[maj]->item[min].fint = fint;
+   fash->bucket[maj]->item[min].index = index;
+}
+
+
+
+
+
+static void
+_fash_gl_free(Fash_Glyph *fash)
+{
+   int i;
+   
+   for (i = 0; i < 256; i++) if (fash->bucket[i]) free(fash->bucket[i]);
+   free(fash);
+}
+
+static Fash_Glyph *
+_fash_gl_new(void)
+{
+   Fash_Glyph *fash = calloc(1, sizeof(Fash_Glyph));
+   fash->freeme = _fash_gl_free;
+   return fash;
+}
+
+static RGBA_Font_Glyph *
+_fash_gl_find(Fash_Glyph *fash, int item)
+{
+   int maj, min;
+
+   item &= 0xffff; // fixme: to do > 65k
+   maj = (item >> 8) & 0xff;
+   min = item & 0xff;
+   if (!fash->bucket[maj]) return NULL;
+   return fash->bucket[maj]->item[min];
+}
+
+static void
+_fash_gl_add(Fash_Glyph *fash, int item, RGBA_Font_Glyph *glyph)
+{
+   int maj, min;
+   
+   item &= 0xffff; // fixme: to do > 65k
+   maj = (item >> 8) & 0xff;
+   min = item & 0xff;
+   if (!fash->bucket[maj])
+     fash->bucket[maj] = calloc(1, sizeof(Fash_Int_Map));
+   fash->bucket[maj]->item[min] = glyph;
+}
+
+
+
+
+
+EAPI RGBA_Font_Glyph *
+evas_common_font_int_cache_glyph_get(RGBA_Font_Int *fi, FT_UInt index)
+{
+   RGBA_Font_Glyph *fg;
+   FT_UInt hindex;
+   FT_Error error;
+   const FT_Int32 hintflags[3] =
+     { FT_LOAD_NO_HINTING, FT_LOAD_FORCE_AUTOHINT, FT_LOAD_NO_AUTOHINT };
+
+   if (fi->fash)
+     {
+        fg = _fash_gl_find(fi->fash, index);
+        if (fg == (void *)(-1)) return NULL;
+        else if (fg) return fg;
+     }
+   
+   hindex = index + (fi->hinting * 500000000);
+   
+//   fg = eina_hash_find(fi->glyphs, &hindex);
+//   if (fg) return fg;
+
+//   error = FT_Load_Glyph(fi->src->ft.face, index, FT_LOAD_NO_BITMAP);
+   error = FT_Load_Glyph(fi->src->ft.face, index,
+                        FT_LOAD_RENDER | hintflags[fi->hinting]);
+   if (error)
+     {
+        if (!fi->fash) fi->fash = _fash_gl_new();
+        if (fi->fash) _fash_gl_add(fi->fash, index, (void *)(-1));
+        return NULL;
+     }
+
+   fg = malloc(sizeof(struct _RGBA_Font_Glyph));
+   if (!fg) return NULL;
+   memset(fg, 0, (sizeof(struct _RGBA_Font_Glyph)));
+
+   error = FT_Get_Glyph(fi->src->ft.face->glyph, &(fg->glyph));
+   if (error)
+     {
+       free(fg);
+        if (!fi->fash) fi->fash = _fash_gl_new();
+        if (fi->fash) _fash_gl_add(fi->fash, index, (void *)(-1));
+       return NULL;
+     }
+   if (fg->glyph->format != FT_GLYPH_FORMAT_BITMAP)
+     {
+       error = FT_Glyph_To_Bitmap(&(fg->glyph), FT_RENDER_MODE_NORMAL, 0, 1);
+       if (error)
+         {
+            FT_Done_Glyph(fg->glyph);
+            free(fg);
+             if (!fi->fash) fi->fash = _fash_gl_new();
+             if (fi->fash) _fash_gl_add(fi->fash, index, (void *)(-1));
+            return NULL;
+         }
+     }
+   fg->glyph_out = (FT_BitmapGlyph)fg->glyph;
+   fg->index = hindex;
+
+   fg->fi = fi;
+  
+   if (!fi->fash) fi->fash = _fash_gl_new();
+   if (fi->fash) _fash_gl_add(fi->fash, index, fg);
+   
+//   eina_hash_direct_add(fi->glyphs, &fg->index, fg);
+   return fg;
+}
+
+typedef struct _Font_Char_Index Font_Char_Index;
+struct _Font_Char_Index
+{
+   FT_UInt index;
+   int gl;
+};
+
+static FT_UInt
+_evas_common_get_char_index(RGBA_Font_Int* fi, int gl)
+{
+   Font_Char_Index result;
+
+#ifdef HAVE_PTHREAD
+///   pthread_mutex_lock(&fi->ft_mutex);
+#endif
+
+//   result = eina_hash_find(fi->indexes, &gl);
+//   if (result) goto on_correct;
+//
+//   result = malloc(sizeof (Font_Char_Index));
+//   if (!result)
+//     {
+//#ifdef HAVE_PTHREAD
+//     pthread_mutex_unlock(&fi->ft_mutex);
+//#endif
+//     return FT_Get_Char_Index(fi->src->ft.face, gl);
+//     }
+
+   result.index = FT_Get_Char_Index(fi->src->ft.face, gl);
+   result.gl = gl;
+
+//   eina_hash_direct_add(fi->indexes, &result->gl, result);
+//
+// on_correct:
+#ifdef HAVE_PTHREAD
+//   pthread_mutex_unlock(&fi->ft_mutex);
+#endif
+   return result.index;
+}
+
+EAPI int
+evas_common_font_glyph_search(RGBA_Font *fn, RGBA_Font_Int **fi_ret, int gl)
+{
+   Eina_List *l;
+
+   if (fn->fash)
+     {
+        Fash_Item_Index_Map *fm = _fash_int_find(fn->fash, gl);
+        if (fm)
+          {
+             if (fm->fint)
+               {
+                  *fi_ret = fm->fint;
+                  return fm->index;
+               }
+             else if (fm->index == -1) return 0;
+          }
+     }
+   
+   for (l = fn->fonts; l; l = l->next)
+     {
+       RGBA_Font_Int *fi;
+       int index;
+
+       fi = l->data;
+
+#if 0 /* FIXME: charmap user is disabled and use a deprecated data type. */
+/*        
+       if (fi->src->charmap) // Charmap loaded, FI/FS blank
+         {
+            index = evas_array_hash_search(fi->src->charmap, gl);
+            if (index != 0)
+              {
+                 evas_common_font_source_load_complete(fi->src);
+                 evas_common_font_int_load_complete(fi);
+
+                 evas_array_hash_free(fi->src->charmap);
+                 fi->src->charmap = NULL;
+
+                 *fi_ret = fi;
+                 return index;
+              }
+         }
+       else
+*/
+#endif
+        if (!fi->src->ft.face) /* Charmap not loaded, FI/FS blank */
+         {
+            if (evas_common_font_source_load_complete(fi->src))
+              return 0;
+#if 0 /* FIXME: disable this. this can eat a LOT of memory and in my tests with expedite at any rate shows no visible improvements */
+/*             
+            index = FT_Get_Char_Index(fi->src->ft.face, gl);
+            if (index == 0)
+              {
+                 // Load Hash
+                 FT_ULong  charcode;
+                 FT_UInt   gindex;
+
+                 fi->src->charmap = evas_array_hash_new();
+                 charcode = FT_Get_First_Char(fi->src->ft.face, &gindex);
+                 while (gindex != 0)
+                   {
+                      evas_array_hash_add(fi->src->charmap, charcode, gindex);
+                      charcode = FT_Get_Next_Char(fi->src->ft.face, charcode, &gindex);
+                   }
+
+                 // Free face
+                 FT_Done_Face(fi->src->ft.face);
+                 fi->src->ft.face = NULL;
+              }
+            else
+              {
+                 evas_common_font_int_load_complete(fi);
+
+                 *fi_ret = fi;
+                 return index;
+              }
+ */
+#endif
+         }
+       else /* Charmap not loaded, FS loaded */
+         {
+            index = _evas_common_get_char_index(fi, gl);
+            if (index != 0)
+              {
+                 if (!fi->ft.size)
+                   evas_common_font_int_load_complete(fi);
+                  if (!fn->fash) fn->fash = _fash_int_new();
+                  if (fn->fash) _fash_int_add(fn->fash, gl, fi, index);
+                 *fi_ret = fi;
+                 return index;
+              }
+             else
+               {
+                  if (!fn->fash) fn->fash = _fash_int_new();
+                  if (fn->fash) _fash_int_add(fn->fash, gl, NULL, -1);
+               }
+         }
+     }
+   return 0;
+}
+
+
+
+static void
+evas_common_font_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int x, int y, const char *in_text,
+                               RGBA_Gfx_Func func, int ext_x, int ext_y, int ext_w, int ext_h, RGBA_Font_Int *fi,
+                               int im_w, int im_h __UNUSED__, int use_kerning
+                               )
+{
+   int pen_x, pen_y;
+   int chr;
+   const char *text = in_text;
+   FT_Face pface = NULL;
+   FT_UInt prev_index;
+   DATA32 *im;
+   int c;
+   int char_index = 0; /* the index of the current char */
+
+#ifdef INTERNATIONAL_SUPPORT
+   int len = 0;
+   /*FIXME: should get the direction by parmater */
+   EvasIntlParType direction = FRIBIDI_TYPE_ON;
+   EvasIntlLevel *level_list;
+
+   /* change the text to visual ordering and update the level list
+    * for as minimum impact on the code as possible just use text as an
+    * holder, will change in the future.*/
+   char *visual_text = evas_intl_utf8_to_visual(in_text, &len, &direction, NULL, NULL, &level_list);
+   text = (visual_text) ? visual_text : in_text;
+   
+#endif
+
+   pen_x = x;
+   pen_y = y;
+   prev_index = 0;
+   im = dst->image.data;
+   for (char_index = 0, c = 0, chr = 0; text[chr]; char_index++)
+     {
+       FT_UInt index;
+       RGBA_Font_Glyph *fg;
+       int chr_x, chr_y;
+       int gl, kern;
+
+       gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr);
+
+       if (gl == 0) break;
+       index = evas_common_font_glyph_search(fn, &fi, gl);
+       LKL(fi->ft_mutex);
+        if (fi->src->current_size != fi->size)
+          {
+             FT_Activate_Size(fi->ft.size);
+             fi->src->current_size = fi->size;
+          }
+       /* hmmm kerning means i can't sanely do my own cached metric tables! */
+       /* grrr - this means font face sharing is kinda... not an option if */
+       /* you want performance */
+         if ((use_kerning) && (prev_index) && (index) &&
+            (pface == fi->src->ft.face))
+           {
+#ifdef INTERNATIONAL_SUPPORT
+              /* if it's rtl, the kerning matching should be reversed, i.e prev
+               * index is now the index and the other way around. */
+              if (evas_intl_is_rtl_char(level_list, char_index))
+                {
+                   if (evas_common_font_query_kerning(fi, index, prev_index, &kern))
+                     pen_x += kern;
+                }
+              else
+#endif
+                {
+
+                   if (evas_common_font_query_kerning(fi, prev_index, index, &kern))
+                     pen_x += kern;
+                }
+           }
+
+         pface = fi->src->ft.face;
+         fg = evas_common_font_int_cache_glyph_get(fi, index);
+         LKU(fi->ft_mutex);
+         if (!fg) continue;
+
+         if (dc->font_ext.func.gl_new)
+           {
+              /* extension calls */
+              fg->ext_dat = dc->font_ext.func.gl_new(dc->font_ext.data, fg);
+              fg->ext_dat_free = dc->font_ext.func.gl_free;
+           }
+
+         chr_x = (pen_x + (fg->glyph_out->left));
+         chr_y = (pen_y + (fg->glyph_out->top));
+
+         if (chr_x < (ext_x + ext_w))
+           {
+              DATA8 *data;
+              int i, j, w, h;
+
+              data = fg->glyph_out->bitmap.buffer;
+              j = fg->glyph_out->bitmap.pitch;
+              w = fg->glyph_out->bitmap.width;
+              if (j < w) j = w;
+              h = fg->glyph_out->bitmap.rows;
+              /*
+                 if ((fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays)
+                 && (fg->glyph_out->bitmap.num_grays == 256)
+                 )
+                 */
+                {
+                   if ((j > 0) && (chr_x + w > ext_x))
+                     {
+                        if ((fg->ext_dat) && (dc->font_ext.func.gl_draw))
+                          {
+                             /* ext glyph draw */
+                             dc->font_ext.func.gl_draw(dc->font_ext.data,
+                                   (void *)dst,
+                                   dc, fg,
+                                   chr_x,
+                                   y - (chr_y - y)
+                                   );
+                          }
+                        else
+                          {
+                             if ((fg->glyph_out->bitmap.num_grays == 256) &&
+                                   (fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays))
+                               {
+                                  for (i = 0; i < h; i++)
+                                    {
+                                       int dx, dy;
+                                       int in_x, in_w;
+
+                                       in_x = 0;
+                                       in_w = 0;
+                                       dx = chr_x;
+                                       dy = y - (chr_y - i - y);
+#ifdef EVAS_SLI
+                                       if (((dy) % dc->sli.h) == dc->sli.y)
+#endif
+                                         {
+                                            if ((dx < (ext_x + ext_w)) &&
+                                                  (dy >= (ext_y)) &&
+                                                  (dy < (ext_y + ext_h)))
+                                              {
+                                                 if (dx + w > (ext_x + ext_w))
+                                                   in_w += (dx + w) - (ext_x + ext_w);
+                                                 if (dx < ext_x)
+                                                   {
+                                                      in_w += ext_x - dx;
+                                                      in_x = ext_x - dx;
+                                                      dx = ext_x;
+                                                   }
+                                                 if (in_w < w)
+                                                   {
+                                                      func(NULL, data + (i * j) + in_x, dc->col.col,
+                                                            im + (dy * im_w) + dx, w - in_w);
+                                                   }
+                                              }
+                                         }
+                                    }
+                               }
+                             else
+                               {
+                                  DATA8 *tmpbuf = NULL, *dp, *tp, bits;
+                                  int bi, bj;
+                                  const DATA8 bitrepl[2] = {0x0, 0xff};
+
+                                  tmpbuf = alloca(w);
+                                  for (i = 0; i < h; i++)
+                                    {
+                                       int dx, dy;
+                                       int in_x, in_w, end;
+
+                                       in_x = 0;
+                                       in_w = 0;
+                                       dx = chr_x;
+                                       dy = y - (chr_y - i - y);
+#ifdef EVAS_SLI
+                                       if (((dy) % dc->sli.h) == dc->sli.y)
+#endif
+                                         {
+                                            tp = tmpbuf;
+                                            dp = data + (i * fg->glyph_out->bitmap.pitch);
+                                            for (bi = 0; bi < w; bi += 8)
+                                              {
+                                                 bits = *dp;
+                                                 if ((w - bi) < 8) end = w - bi;
+                                                 else end = 8;
+                                                 for (bj = 0; bj < end; bj++)
+                                                   {
+                                                      *tp = bitrepl[(bits >> (7 - bj)) & 0x1];
+                                                      tp++;
+                                                   }
+                                                 dp++;
+                                              }
+                                            if ((dx < (ext_x + ext_w)) &&
+                                                  (dy >= (ext_y)) &&
+                                                  (dy < (ext_y + ext_h)))
+                                              {
+                                                 if (dx + w > (ext_x + ext_w))
+                                                   in_w += (dx + w) - (ext_x + ext_w);
+                                                 if (dx < ext_x)
+                                                   {
+                                                      in_w += ext_x - dx;
+                                                      in_x = ext_x - dx;
+                                                      dx = ext_x;
+                                                   }
+                                                 if (in_w < w)
+                                                   {
+                                                      func(NULL, tmpbuf + in_x, dc->col.col,
+                                                            im + (dy * im_w) + dx, w - in_w);
+                                                   }
+                                              }
+                                         }
+                                    }
+                               }
+                          }
+                        c++;
+                     }
+                }
+           }
+         else
+           break;
+         pen_x += fg->glyph->advance.x >> 16;
+         prev_index = index;
+     }
+#ifdef INTERNATIONAL_SUPPORT
+   if (level_list) free(level_list);
+   if (visual_text) free(visual_text);
+#endif
+}
+
+EAPI void
+evas_common_font_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int x, int y, const char *text)
+{
+   int ext_x, ext_y, ext_w, ext_h;
+   int im_w, im_h;
+   int use_kerning;
+   RGBA_Gfx_Func func;
+   RGBA_Font_Int *fi;
+   Cutout_Rects *rects;
+   Cutout_Rect  *r;
+   int          c, cx, cy, cw, ch;
+   int          i;
+
+   fi = fn->fonts->data;
+
+   im_w = dst->cache_entry.w;
+   im_h = dst->cache_entry.h;
+
+   ext_x = 0; ext_y = 0; ext_w = im_w; ext_h = im_h;
+   if (dc->clip.use)
+     {
+       ext_x = dc->clip.x;
+       ext_y = dc->clip.y;
+       ext_w = dc->clip.w;
+       ext_h = dc->clip.h;
+       if (ext_x < 0)
+         {
+            ext_w += ext_x;
+            ext_x = 0;
+         }
+       if (ext_y < 0)
+         {
+            ext_h += ext_y;
+            ext_y = 0;
+         }
+       if ((ext_x + ext_w) > im_w)
+         ext_w = im_w - ext_x;
+       if ((ext_y + ext_h) > im_h)
+         ext_h = im_h - ext_y;
+     }
+   if (ext_w <= 0) return;
+   if (ext_h <= 0) return;
+
+   LKL(fn->lock);
+//   evas_common_font_size_use(fn);
+   use_kerning = FT_HAS_KERNING(fi->src->ft.face);
+   func = evas_common_gfx_func_composite_mask_color_span_get(dc->col.col, dst, 1, dc->render_op);
+
+   if (!dc->cutout.rects)
+     {
+        evas_common_font_draw_internal(dst, dc, fn, x, y, text,
+                                       func, ext_x, ext_y, ext_w, ext_h, fi,
+                                       im_w, im_h, use_kerning
+                                       );
+     }
+   else
+     {
+        c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h;
+        evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
+        /* our clip is 0 size.. abort */
+        if ((dc->clip.w > 0) && (dc->clip.h > 0))
+          {
+             rects = evas_common_draw_context_apply_cutouts(dc);
+             for (i = 0; i < rects->active; ++i)
+               {
+                  r = rects->rects + i;
+                  evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h);
+                  evas_common_font_draw_internal(dst, dc, fn, x, y, text,
+                                                 func, r->x, r->y, r->w, r->h, fi,
+                                                 im_w, im_h, use_kerning
+                                                 );
+               }
+             evas_common_draw_context_apply_clear_cutouts(rects);
+          }
+        dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch;
+     }
+   LKU(fn->lock);
+}
diff --git a/src/lib/engines/common/evas_font_load.c b/src/lib/engines/common/evas_font_load.c
new file mode 100644 (file)
index 0000000..d754cf0
--- /dev/null
@@ -0,0 +1,827 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+#include <assert.h>
+
+extern FT_Library         evas_ft_lib;
+
+static int                font_cache_usage = 0;
+static int                font_cache = 0;
+static int                font_dpi = 75;
+
+static Eina_Hash * fonts_src = NULL;
+static Eina_Hash * fonts = NULL;
+static Eina_List * fonts_lru = NULL;
+
+//static Eina_Bool font_modify_cache_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata);
+//static Eina_Bool font_flush_free_glyph_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata);
+static void _evas_common_font_int_clear(RGBA_Font_Int *fi);
+
+static int
+_evas_font_cache_int_cmp(const RGBA_Font_Int *k1, int k1_length __UNUSED__,
+                        const RGBA_Font_Int *k2, int k2_length __UNUSED__)
+{
+   /* RGBA_Font_Source->name is a stringshare */
+   if (k1->src->name == k2->src->name)
+     return k1->size - k2->size;
+   return strcmp(k1->src->name, k2->src->name);;
+}
+
+static int
+_evas_font_cache_int_hash(const RGBA_Font_Int *key, int key_length __UNUSED__)
+{
+   int hash;
+
+   hash = eina_hash_djb2(key->src->name, eina_stringshare_strlen(key->src->name) + 1);
+   hash ^= eina_hash_int32(&key->size, sizeof (int));
+
+   return hash;
+}
+
+static void
+_evas_common_font_source_free(RGBA_Font_Source *fs)
+{
+   FT_Done_Face(fs->ft.face);
+#if 0 /* FIXME: Disable as it is only used by dead code using deprecated datatype. */
+//   if (fs->charmap) evas_array_hash_free(fs->charmap);
+#endif
+   if (fs->name) eina_stringshare_del(fs->name);
+   free(fs);
+}
+/*
+static Eina_Bool
+font_flush_free_glyph_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+{
+   RGBA_Font_Glyph *fg;
+
+   fg = data;
+   FT_Done_Glyph(fg->glyph);
+   // extension calls
+   if (fg->ext_dat_free) fg->ext_dat_free(fg->ext_dat);
+   free(fg);
+   return 1;
+   hash = 0;
+   key = 0;
+   fdata = 0;
+}
+*/
+static void
+_evas_common_font_int_free(RGBA_Font_Int *fi)
+{
+   FT_Done_Size(fi->ft.size);
+
+   evas_common_font_int_modify_cache_by(fi, -1);
+
+   _evas_common_font_int_clear(fi);
+//   eina_hash_foreach(fi->glyphs, font_flush_free_glyph_cb, NULL);
+//   eina_hash_free(fi->glyphs);
+
+   eina_hash_free(fi->kerning);
+//   eina_hash_free(fi->indexes);
+
+#ifdef HAVE_PTHREAD
+   pthread_mutex_destroy(&fi->ft_mutex);
+#endif
+
+   evas_common_font_source_free(fi->src);
+
+   if (fi->references == 0)
+     fonts_lru = eina_list_remove(fonts_lru, fi);
+   
+   if (fi->fash) fi->fash->freeme(fi->fash);
+   free(fi);
+}
+
+void
+evas_common_font_load_init(void)
+{
+   fonts_src = eina_hash_string_small_new(EINA_FREE_CB(_evas_common_font_source_free));
+   fonts = eina_hash_new(NULL,
+                        EINA_KEY_CMP(_evas_font_cache_int_cmp),
+                        EINA_KEY_HASH(_evas_font_cache_int_hash),
+                        EINA_FREE_CB(_evas_common_font_int_free),
+                        5);
+}
+
+void
+evas_common_font_load_shutdown(void)
+{
+   eina_hash_free(fonts);
+   fonts = NULL;
+
+   eina_hash_free(fonts_src);
+   fonts_src = NULL;
+}
+
+EAPI void
+evas_common_font_dpi_set(int dpi)
+{
+   font_dpi = dpi;
+}
+
+EAPI RGBA_Font_Source *
+evas_common_font_source_memory_load(const char *name, const void *data, int data_size)
+{
+   int error;
+   RGBA_Font_Source *fs;
+
+   assert(name != NULL);
+
+   fs = calloc(1, sizeof(RGBA_Font_Source) + data_size);
+   if (!fs) return NULL;
+   fs->data = ((unsigned char *)fs) + sizeof(RGBA_Font_Source);
+   fs->data_size = data_size;
+   fs->current_size = 0;
+   memcpy(fs->data, data, data_size);
+   error = FT_New_Memory_Face(evas_ft_lib, fs->data, fs->data_size, 0, &(fs->ft.face));
+   if (error)
+     {
+       free(fs);
+       return NULL;
+     }
+   fs->name = eina_stringshare_add(name);
+   fs->file = NULL;
+   error = FT_Select_Charmap(fs->ft.face, ft_encoding_unicode);
+   fs->ft.orig_upem = fs->ft.face->units_per_EM;
+   fs->references = 1;
+
+   eina_hash_direct_add(fonts_src, fs->name, fs);
+   return fs;
+}
+
+EAPI RGBA_Font_Source *
+evas_common_font_source_load(const char *name)
+{
+   RGBA_Font_Source *fs;
+
+   assert(name != NULL);
+
+   fs = calloc(1, sizeof(RGBA_Font_Source));
+   if (!fs) return NULL;
+   fs->data = NULL;
+   fs->data_size = 0;
+   fs->current_size = 0;
+   fs->ft.face = NULL;
+
+   fs->name = eina_stringshare_add(name);
+   fs->file = fs->name;
+
+   fs->ft.orig_upem = 0;
+
+   fs->references = 1;
+
+   eina_hash_direct_add(fonts_src, fs->name, fs);
+   return fs;
+}
+
+EAPI int
+evas_common_font_source_load_complete(RGBA_Font_Source *fs)
+{
+   int error;
+
+   error = FT_New_Face(evas_ft_lib, fs->file, 0, &(fs->ft.face));
+   if (error)
+     {
+       fs->ft.face = NULL;
+       return error;
+     }
+
+   error = FT_Select_Charmap(fs->ft.face, ft_encoding_unicode);
+   if (error)
+     {
+       FT_Done_Face(fs->ft.face);
+       fs->ft.face = NULL;
+       return error;
+     }
+
+   fs->ft.orig_upem = fs->ft.face->units_per_EM;
+   return error;
+}
+
+EAPI RGBA_Font_Source *
+evas_common_font_source_find(const char *name)
+{
+   RGBA_Font_Source *fs;
+
+   if (!name) return NULL;
+   fs = eina_hash_find(fonts_src, name);
+   if (fs)
+     {
+       fs->references++;
+       return fs;
+     }
+   return NULL;
+}
+
+EAPI void
+evas_common_font_source_free(RGBA_Font_Source *fs)
+{
+   fs->references--;
+   if (fs->references > 0) return;
+
+   eina_hash_del(fonts_src, fs->name, fs);
+}
+
+EAPI void
+evas_common_font_size_use(RGBA_Font *fn)
+{
+   RGBA_Font_Int *fi;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(fn->fonts, l, fi)
+     {
+       if (fi->src->current_size != fi->size)
+         {
+            FT_Activate_Size(fi->ft.size);
+            fi->src->current_size = fi->size;
+         }
+     }
+}
+
+static int
+_evas_common_font_int_cmp(const int *key1, __UNUSED__ int key1_length,
+                         const int *key2, __UNUSED__ int key2_length)
+{
+   return *key1 - *key2;
+}
+
+static int
+_evas_common_font_double_int_cmp(const int *key1, __UNUSED__ int key1_length,
+                                const int *key2, __UNUSED__ int key2_length)
+{
+   if (key1[0] - key2[0] == 0)
+     return key1[1] - key2[1];
+   return key1[0] - key2[0];
+}
+
+static int
+_evas_common_font_double_int_hash(const unsigned int key[2], int key_length)
+{
+   int tmp;
+
+   tmp = eina_hash_int32(&key[0], key_length);
+   tmp ^= eina_hash_int32(&key[1], key_length);
+
+   return tmp;
+}
+
+static void
+_evas_common_font_int_cache_init(RGBA_Font_Int *fi)
+{
+   /* Add some font kerning cache. */
+//   fi->indexes = eina_hash_new(NULL,
+//                            EINA_KEY_CMP(_evas_common_font_int_cmp),
+//                            EINA_KEY_HASH(eina_hash_int32),
+//                            free, 3);
+  fi->kerning = eina_hash_new(NULL,
+                              EINA_KEY_CMP(_evas_common_font_double_int_cmp),
+                              EINA_KEY_HASH(_evas_common_font_double_int_hash),
+                              free, 3);
+#ifdef HAVE_PTHREAD
+   pthread_mutex_init(&fi->ft_mutex, NULL);
+#endif
+}
+
+EAPI RGBA_Font_Int *
+evas_common_font_int_memory_load(const char *name, int size, const void *data, int data_size)
+{
+   RGBA_Font_Int *fi;
+
+   fi = evas_common_font_int_find(name, size);
+   if (fi) return fi;
+
+   fi = calloc(1, sizeof(RGBA_Font_Int));
+   if (!fi) return NULL;
+
+   fi->src = evas_common_font_source_find(name);
+   if (!fi->src)
+     fi->src = evas_common_font_source_memory_load(name, data, data_size);
+
+   if (!fi->src)
+     {
+       free(fi);
+       return NULL;
+     }
+
+   fi->size = size;
+
+   _evas_common_font_int_cache_init(fi);
+
+   fi = evas_common_font_int_load_init(fi);
+   evas_common_font_int_load_complete(fi);
+
+   return fi;
+}
+
+EAPI RGBA_Font_Int *
+evas_common_font_int_load(const char *name, int size)
+{
+   RGBA_Font_Int *fi;
+
+   fi = evas_common_font_int_find(name, size);
+   if (fi) return fi;
+
+   fi = calloc(1, sizeof(RGBA_Font_Int));
+   if (!fi) return NULL;
+
+   fi->src = evas_common_font_source_find(name);
+   if (!fi->src && evas_file_path_is_file(name))
+     fi->src = evas_common_font_source_load(name);
+
+   if (!fi->src)
+     {
+       free(fi);
+       return NULL;
+     }
+
+   fi->size = size;
+
+   _evas_common_font_int_cache_init(fi);
+
+   return evas_common_font_int_load_init(fi);
+}
+
+EAPI RGBA_Font_Int *
+evas_common_font_int_load_init(RGBA_Font_Int *fi)
+{
+   fi->ft.size = NULL;
+//   fi->glyphs = eina_hash_new(NULL,
+//                           EINA_KEY_CMP(_evas_common_font_int_cmp),
+//                           EINA_KEY_HASH(eina_hash_int32),
+//                           NULL,
+//                           6);
+   fi->usage = 0;
+   fi->references = 1;
+
+   eina_hash_direct_add(fonts, fi, fi);
+
+   return fi;
+}
+
+EAPI RGBA_Font_Int *
+evas_common_font_int_load_complete(RGBA_Font_Int *fi)
+{
+   int val, dv;
+   int ret;
+   int error;
+
+   error = FT_New_Size(fi->src->ft.face, &(fi->ft.size));
+   if (!error)
+     {
+       FT_Activate_Size(fi->ft.size);
+     }
+   fi->real_size = fi->size * 64;
+   error = FT_Set_Char_Size(fi->src->ft.face, 0, fi->real_size, font_dpi, font_dpi);
+   if (error)
+     {
+       fi->real_size = fi->size;
+       error = FT_Set_Pixel_Sizes(fi->src->ft.face, 0, fi->real_size);
+     }
+   if (error)
+     {
+       int i;
+       int chosen_size = 0;
+       int chosen_width = 0;
+
+       for (i = 0; i < fi->src->ft.face->num_fixed_sizes; i++)
+         {
+            int s;
+            int d, cd;
+
+            s = fi->src->ft.face->available_sizes[i].height;
+            cd = chosen_size - fi->size;
+            if (cd < 0) cd = -cd;
+            d = s - fi->size;
+            if (d < 0) d = -d;
+            if (d < cd)
+              {
+                 chosen_width = fi->src->ft.face->available_sizes[i].width;
+                 chosen_size = s;
+              }
+            if (d == 0) break;
+         }
+       fi->real_size = chosen_size;
+       error = FT_Set_Pixel_Sizes(fi->src->ft.face, chosen_width, fi->real_size);
+       if (error)
+         {
+            /* couldn't choose the size anyway... what now? */
+         }
+     }
+   fi->src->current_size = 0;
+
+   fi->max_h = 0;
+   
+   val = (int)fi->src->ft.face->bbox.yMax;
+   if (fi->src->ft.face->units_per_EM != 0)
+     {
+        dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
+        ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
+     }
+   else
+     ret = val;
+   fi->max_h += ret;
+   
+   val = -(int)fi->src->ft.face->bbox.yMin;
+   if (fi->src->ft.face->units_per_EM != 0)
+     {
+        dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
+        ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
+     }
+   else
+     ret = val;
+   fi->max_h += ret;
+   
+   return fi;
+}
+
+EAPI RGBA_Font *
+evas_common_font_memory_load(const char *name, int size, const void *data, int data_size)
+{
+   RGBA_Font *fn;
+   RGBA_Font_Int *fi;
+
+   fi = evas_common_font_int_memory_load(name, size, data, data_size);
+   if (!fi) return NULL;
+   fn = calloc(1, sizeof(RGBA_Font));
+   if (!fn)
+     {
+       free(fi);
+       return NULL;
+     }
+   fn->fonts = eina_list_append(fn->fonts, fi);
+   fn->hinting = FONT_BYTECODE_HINT;
+   fi->hinting = fn->hinting;
+   fn->references = 1;
+   LKI(fn->lock);
+   return fn;
+}
+
+EAPI RGBA_Font *
+evas_common_font_load(const char *name, int size)
+{
+   RGBA_Font *fn;
+   RGBA_Font_Int *fi;
+
+   fi = evas_common_font_int_load(name, size);
+   if (!fi) return NULL;
+
+   /* First font, complete load */
+   if (!fi->ft.size)
+     {
+       if (!fi->src->ft.face)
+         {
+            if (evas_common_font_source_load_complete(fi->src))
+              {
+                 fi->references--;
+                 if (fi->references == 0)
+                   {
+                      fonts_lru = eina_list_prepend(fonts_lru, fi);
+                      evas_common_font_int_modify_cache_by(fi, 1);
+                      evas_common_font_flush();
+                   }
+                 return NULL;
+              }
+         }
+       evas_common_font_int_load_complete(fi);
+     }
+
+   fn = calloc(1, sizeof(RGBA_Font));
+   if (!fn)
+     {
+       fi->references--;
+       if (fi->references == 0)
+         {
+            fonts_lru = eina_list_prepend(fonts_lru, fi);
+            evas_common_font_int_modify_cache_by(fi, 1);
+            evas_common_font_flush();
+         }
+       return NULL;
+     }
+   fn->fonts = eina_list_append(fn->fonts, fi);
+   fn->hinting = FONT_BYTECODE_HINT;
+   fi->hinting = fn->hinting;
+   fn->references = 1;
+   LKI(fn->lock);
+   return fn;
+}
+
+EAPI RGBA_Font *
+evas_common_font_add(RGBA_Font *fn, const char *name, int size)
+{
+   RGBA_Font_Int *fi;
+
+   if (!fn)
+      return NULL;
+   fi = evas_common_font_int_load(name, size);
+   if (fi)
+     {
+       fn->fonts = eina_list_append(fn->fonts, fi);
+       fi->hinting = fn->hinting;
+       return fn;
+     }
+   return NULL;
+}
+
+EAPI RGBA_Font *
+evas_common_font_memory_add(RGBA_Font *fn, const char *name, int size, const void *data, int data_size)
+{
+   RGBA_Font_Int *fi;
+
+   if (!fn)
+      return NULL;
+   fi = evas_common_font_int_memory_load(name, size, data, data_size);
+   if (fi)
+     {
+       fn->fonts = eina_list_append(fn->fonts, fi);
+       fi->hinting = fn->hinting;
+       return fn;
+     }
+   return NULL;
+}
+
+EAPI void
+evas_common_font_free(RGBA_Font *fn)
+{
+   Eina_List *l;
+   RGBA_Font_Int *fi;
+
+   if (!fn) return;
+   fn->references--;
+   if (fn->references > 0) return;
+   EINA_LIST_FOREACH(fn->fonts, l, fi)
+     {
+       fi->references--;
+       if (fi->references == 0)
+         {
+            fonts_lru = eina_list_append(fonts_lru, fi);
+            evas_common_font_int_modify_cache_by(fi, 1);
+         }
+     }
+   evas_common_font_flush();
+   eina_list_free(fn->fonts);
+   if (fn->fash) fn->fash->freeme(fn->fash);
+   LKD(fn->lock);
+   free(fn);
+}
+
+EAPI void
+evas_common_font_hinting_set(RGBA_Font *fn, Font_Hint_Flags hinting)
+{
+   Eina_List *l;
+   RGBA_Font_Int *fi;
+
+   if (!fn)
+     return;
+   fn->hinting = hinting;
+   EINA_LIST_FOREACH(fn->fonts, l, fi)
+     fi->hinting = fn->hinting;
+}
+
+EAPI Eina_Bool
+evas_common_hinting_available(Font_Hint_Flags hinting)
+{
+   switch (hinting)
+     {
+      case FONT_NO_HINT:
+      case FONT_AUTO_HINT:
+        /* these two hinting modes are always available */
+        return EINA_TRUE;
+      case FONT_BYTECODE_HINT:
+        /* Only use the bytecode interpreter if support for the _patented_
+         * algorithms is available because the free bytecode
+         * interpreter's results are too crappy.
+         *
+         * On freetyp 2.2+, we can ask the library about support for
+         * the patented interpreter. On older versions, we need to use
+         * macros to check for it.
+         */
+#if FREETYPE_MINOR >= 2
+        return FT_Get_TrueType_Engine_Type(evas_ft_lib) >=
+               FT_TRUETYPE_ENGINE_TYPE_PATENTED;
+#else
+        /* we may not rely on TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+         * here to find out whether it's supported.
+         *
+         * so, assume it is. o_O
+         */
+        return EINA_TRUE;
+#endif
+     }
+
+   /* shouldn't get here - need to add another case statement */
+   return EINA_FALSE;
+}
+
+EAPI RGBA_Font *
+evas_common_font_memory_hinting_load(const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting)
+{
+   RGBA_Font *fn;
+
+   fn = evas_common_font_memory_load(name, size, data, data_size);
+   if (fn) evas_common_font_hinting_set(fn, hinting);
+   return fn;
+}
+
+EAPI RGBA_Font *
+evas_common_font_hinting_load(const char *name, int size, Font_Hint_Flags hinting)
+{
+   RGBA_Font *fn;
+
+   fn = evas_common_font_load(name, size);
+   if (fn) evas_common_font_hinting_set(fn, hinting);
+   return fn;
+}
+
+EAPI RGBA_Font *
+evas_common_font_hinting_add(RGBA_Font *fn, const char *name, int size, Font_Hint_Flags hinting)
+{
+   fn = evas_common_font_add(fn, name, size);
+   if (fn) evas_common_font_hinting_set(fn, hinting);
+   return fn;
+}
+
+EAPI RGBA_Font *
+evas_common_font_memory_hinting_add(RGBA_Font *fn, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting)
+{
+   fn = evas_common_font_memory_add(fn, name, size, data, data_size);
+   if (fn) evas_common_font_hinting_set(fn, hinting);
+   return fn;
+}
+
+static void
+_evas_common_font_int_clear(RGBA_Font_Int *fi)
+{
+   int i, j;
+   
+   LKL(fi->ft_mutex);
+   if (!fi->fash)
+     {
+        LKU(fi->ft_mutex);
+        return;
+     }
+   
+   evas_common_font_int_modify_cache_by(fi, -1);
+   
+   for (j = 0; j <= 0xff; j++) // fixme: to do > 65k
+     {
+        Fash_Glyph_Map *fmap = fi->fash->bucket[j];
+        if (fmap)
+          {
+             for (i = 0; i <= 0xff; i++)
+               {
+                  RGBA_Font_Glyph *fg = fmap->item[i];
+                  if ((fg) && (fg != (void *)(-1)))
+                    {
+                       FT_Done_Glyph(fg->glyph);
+                       /* extension calls */
+                       if (fg->ext_dat_free) fg->ext_dat_free(fg->ext_dat);
+                       free(fg);
+                       fmap->item[i] = NULL;
+                    }
+               }
+          }
+     }
+   fi->fash->freeme(fi->fash);
+   fi->fash = NULL;
+   LKU(fi->ft_mutex);
+}
+
+static Eina_Bool
+_evas_common_font_all_clear_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+{
+   RGBA_Font_Int *fi = data;
+   _evas_common_font_int_clear(fi);
+   return 1;
+}
+
+EAPI void
+evas_common_font_all_clear(void)
+{
+   eina_hash_foreach(fonts, _evas_common_font_all_clear_cb, NULL);
+}
+
+/*
+static Eina_Bool
+font_modify_cache_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+{
+   int *dir;
+   RGBA_Font_Glyph *fg;
+
+   fg = data;
+   dir = fdata;
+   font_cache_usage += (*dir) *
+     ((fg->glyph_out->bitmap.width * fg->glyph_out->bitmap.rows) +
+      sizeof(RGBA_Font_Glyph) + sizeof(Eina_List) + 400); // fudge values
+   return 1;
+   hash = 0;
+   key = 0;
+}
+*/
+/* when the fi->references == 0 we increase this instead of really deleting
+ * we then check if the cache_useage size is larger than allowed
+ * !If the cache is NOT too large we dont delete font_int
+ * !If the cache is too large we really delete font_int */
+EAPI void
+evas_common_font_int_modify_cache_by(RGBA_Font_Int *fi, int dir)
+{
+   int sz_hash = 0;
+   int i, j;
+   
+   if (fi->fash)
+     {
+        for (j = 0; j <= 0xff; j++) // fixme: to do > 65k
+          {
+             Fash_Glyph_Map *fmap = fi->fash->bucket[j];
+             if (fmap)
+               {
+                  for (i = 0; i <= 0xff; i++)
+                    {
+                       RGBA_Font_Glyph *fg = fmap->item[i];
+                       if ((fg) && (fg != (void *)(-1)))
+                         sz_hash += 
+                         sizeof(RGBA_Font_Glyph) + sizeof(Eina_List) + 
+                         (fg->glyph_out->bitmap.width * 
+                          fg->glyph_out->bitmap.rows) + 
+                         400;
+                    }
+               }
+          }
+     }
+//   if (fi->glyphs) sz_hash = eina_hash_population(fi->glyphs);
+//   eina_hash_foreach(fi->glyphs, font_modify_cache_cb, &dir);
+   font_cache_usage += dir * (sizeof(RGBA_Font) + sz_hash +
+                             sizeof(FT_FaceRec) + 16384); /* fudge values */
+}
+
+EAPI int
+evas_common_font_cache_get(void)
+{
+   return font_cache;
+}
+
+EAPI void
+evas_common_font_cache_set(int size)
+{
+   font_cache = size;
+   evas_common_font_flush();
+}
+
+EAPI void
+evas_common_font_flush(void)
+{
+   if (font_cache_usage < font_cache) return;
+   while (font_cache_usage > font_cache)
+     {
+        int pfont_cache_usage;
+        
+        pfont_cache_usage = font_cache_usage;
+        evas_common_font_flush_last();
+        if (pfont_cache_usage == font_cache_usage) break;
+     }
+}
+
+/* We run this when the cache gets larger than allowed size
+ * We check cache size each time a fi->references goes to 0
+ * PERFORMS: Find font_int(s) with references == 0 and delete them */
+EAPI void
+evas_common_font_flush_last(void)
+{
+   RGBA_Font_Int *fi = NULL;
+
+   if (!fonts_lru) return ;
+
+   fi = eina_list_data_get(fonts_lru);
+   fonts_lru = eina_list_remove_list(fonts_lru, fonts_lru);
+
+   eina_hash_del(fonts, fi, fi);
+}
+
+EAPI RGBA_Font_Int *
+evas_common_font_int_find(const char *name, int size)
+{
+   RGBA_Font_Int tmp_fi;
+   RGBA_Font_Source tmp_fn;
+   RGBA_Font_Int *fi;
+
+   tmp_fn.name = (char*) eina_stringshare_add(name);
+   tmp_fi.src = &tmp_fn;
+   tmp_fi.size = size;
+
+   fi = eina_hash_find(fonts, &tmp_fi);
+   if (fi)
+     {
+       if (fi->references == 0)
+         {
+            evas_common_font_int_modify_cache_by(fi, -1);
+            fonts_lru = eina_list_remove(fonts_lru, fi);
+         }
+       fi->references++;
+     }
+
+   eina_stringshare_del(tmp_fn.name);
+   return fi;
+}
diff --git a/src/lib/engines/common/evas_font_main.c b/src/lib/engines/common/evas_font_main.c
new file mode 100644 (file)
index 0000000..afe1b11
--- /dev/null
@@ -0,0 +1,319 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_private.h"
+FT_Library      evas_ft_lib = 0;
+static int      initialised = 0;
+
+EAPI void
+evas_common_font_init(void)
+{
+   int error;
+
+   initialised++;
+   if (initialised != 1) return;
+   error = FT_Init_FreeType(&evas_ft_lib);
+   if (error) return;
+   evas_common_font_load_init();
+}
+
+EAPI void
+evas_common_font_shutdown(void)
+{
+   int error;
+
+   if (initialised < 1) return;
+   initialised--;
+   if (initialised != 0) return;
+
+   evas_common_font_load_shutdown();
+   evas_common_font_cache_set(0);
+   evas_common_font_flush();
+
+   error = FT_Done_FreeType(evas_ft_lib);
+   evas_ft_lib = 0;
+}
+
+EAPI void
+evas_common_font_font_all_unload(void)
+{
+   evas_common_font_all_clear();
+}
+
+EAPI int
+evas_common_font_ascent_get(RGBA_Font *fn)
+{
+   int val, dv;
+   int ret;
+   RGBA_Font_Int *fi;
+
+//   evas_common_font_size_use(fn);
+#if 0
+     {
+        Eina_List *l;
+        
+        EINA_LIST_FOREACH(fn->fonts, l, fi)
+          {
+             if (!fi->src->ft.face) continue;
+             if (fi->src->current_size != fi->size)
+               {
+                  FT_Activate_Size(fi->ft.size);
+                  fi->src->current_size = fi->size;
+               }
+             val = (int)fi->src->ft.face->size->metrics.ascender;
+             if (fi->src->ft.face->units_per_EM == 0)
+               return val;
+             dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
+             ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
+             printf(" ==== %p: %i\n", fi, ret);
+          }
+     }
+#endif
+   fi = fn->fonts->data;
+   if (fi->src->current_size != fi->size)
+     {
+        FT_Activate_Size(fi->ft.size);
+        fi->src->current_size = fi->size;
+     }
+   if (!FT_IS_SCALABLE(fi->src->ft.face))
+     {
+        printf("NOT SCALABLE!\n");
+     }
+   val = (int)fi->src->ft.face->size->metrics.ascender;
+   return val >> 6;
+//   printf("%i | %i\n", val, val >> 6);
+//   if (fi->src->ft.face->units_per_EM == 0)
+//     return val;
+//   dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
+//   ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
+//   return ret;
+}
+
+EAPI int
+evas_common_font_descent_get(RGBA_Font *fn)
+{
+   int val, dv;
+   int ret;
+   RGBA_Font_Int *fi;
+
+//   evas_common_font_size_use(fn);
+   fi = fn->fonts->data;
+   if (fi->src->current_size != fi->size)
+     {
+        FT_Activate_Size(fi->ft.size);
+        fi->src->current_size = fi->size;
+     }
+   val = -(int)fi->src->ft.face->size->metrics.descender;
+   return val >> 6;
+//   if (fi->src->ft.face->units_per_EM == 0)
+//     return val;
+//   dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
+//   ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
+//   return ret;
+}
+
+EAPI int
+evas_common_font_max_ascent_get(RGBA_Font *fn)
+{
+   int val, dv;
+   int ret;
+   RGBA_Font_Int *fi;
+
+//   evas_common_font_size_use(fn);
+   fi = fn->fonts->data;
+   if (fi->src->current_size != fi->size)
+     {
+        FT_Activate_Size(fi->ft.size);
+        fi->src->current_size = fi->size;
+     }
+   val = (int)fi->src->ft.face->bbox.yMax;
+   if (fi->src->ft.face->units_per_EM == 0)
+     return val;
+   dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
+   ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
+   return ret;
+}
+
+EAPI int
+evas_common_font_max_descent_get(RGBA_Font *fn)
+{
+   int val, dv;
+   int ret;
+   RGBA_Font_Int *fi;
+
+//   evas_common_font_size_use(fn);
+   fi = fn->fonts->data;
+   if (fi->src->current_size != fi->size)
+     {
+        FT_Activate_Size(fi->ft.size);
+        fi->src->current_size = fi->size;
+     }
+   val = -(int)fi->src->ft.face->bbox.yMin;
+   if (fi->src->ft.face->units_per_EM == 0)
+     return val;
+   dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
+   ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
+   return ret;
+}
+
+EAPI int
+evas_common_font_get_line_advance(RGBA_Font *fn)
+{
+   int val, dv;
+   int ret;
+   RGBA_Font_Int *fi;
+
+//   evas_common_font_size_use(fn);
+   fi = fn->fonts->data;
+   if (fi->src->current_size != fi->size)
+     {
+        FT_Activate_Size(fi->ft.size);
+        fi->src->current_size = fi->size;
+     }
+   val = (int)fi->src->ft.face->size->metrics.height;
+   if (fi->src->ft.face->units_per_EM == 0)
+     return val;
+   return val >> 6;
+//   dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
+//   ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
+//   return ret;
+}
+
+EAPI int
+evas_common_font_utf8_get_next(const unsigned char *buf, int *iindex)
+{
+   /* Reads UTF8 bytes from @buf, starting at *@index and returns
+    * the decoded code point at iindex offset, and advances iindex
+    * to the next code point after this.
+    *
+    * Returns 0 to indicate there is no next char
+    */
+   int index = *iindex, len, r;
+   unsigned char d, d2, d3, d4;
+
+   /* if this char is the null terminator, exit */
+   if (!buf[index])
+     return 0;
+     
+   d = buf[index++];
+
+   while (buf[index] && ((buf[index] & 0xc0) == 0x80))
+     index++;
+   len = index - *iindex;
+
+   if (len == 1)
+      r = d;
+   else if (len == 2)
+     {
+       /* 2 bytes */
+        d2 = buf[*iindex + 1];
+       r = d & 0x1f; /* copy lower 5 */
+       r <<= 6;
+       r |= (d2 & 0x3f); /* copy lower 6 */
+     }
+   else if (len == 3)
+     {
+       /* 3 bytes */
+        d2 = buf[*iindex + 1];
+        d3 = buf[*iindex + 2];
+       r = d & 0x0f; /* copy lower 4 */
+       r <<= 6;
+       r |= (d2 & 0x3f);
+       r <<= 6;
+       r |= (d3 & 0x3f);
+     }
+   else
+     {
+       /* 4 bytes */
+        d2 = buf[*iindex + 1];
+        d3 = buf[*iindex + 2];
+        d4 = buf[*iindex + 3];
+       r = d & 0x0f; /* copy lower 4 */
+       r <<= 6;
+       r |= (d2 & 0x3f);
+       r <<= 6;
+       r |= (d3 & 0x3f);
+       r <<= 6;
+       r |= (d4 & 0x3f);
+     }
+
+   *iindex = index;
+   return r;
+}
+
+EAPI int
+evas_common_font_utf8_get_prev(const unsigned char *buf, int *iindex)
+{
+   /* Reads UTF8 bytes from @buf, starting at *@index and returns
+    * the decoded code point at iindex offset, and advances iindex
+    * to the prev code point after this.
+    *
+    * Returns 0 to indicate there is no prev char
+    */
+
+   int r;
+   int index = *iindex;
+   /* although when index == 0 there's no previous char, we still want to get
+    * the current char */
+   if (index < 0) 
+     return 0;
+
+   /* First obtain the codepoint at iindex */
+   r = evas_common_font_utf8_get_next(buf, &index);
+
+   /* Next advance iindex to previous codepoint */
+   index = *iindex;
+   index--;
+   while ((index > 0) && ((buf[index] & 0xc0) == 0x80))
+     index--;
+
+   *iindex = index;
+   return r;
+}
+
+EAPI int
+evas_common_font_utf8_get_last(const unsigned char *buf, int buflen)
+{
+   /* jumps to the nul byte at the buffer end and decodes backwards and
+    * returns the offset index byte in the buffer where the last character
+    * in the buffer begins.
+    *
+    * Returns -1 to indicate an error
+    */
+   int index;
+   unsigned char d;
+
+   if (buflen < 1) return 0;
+   index = buflen - 1;
+   d = buf[index];
+   if (!(d & 0x80))
+     return index;
+   else
+     {
+       while (index > 0)
+         {
+            index--;
+            d = buf[index];
+            if ((d & 0xc0) != 0x80)
+              return index;
+         }
+     }
+   return 0;
+}
+
+EAPI int
+evas_common_font_utf8_get_len(const unsigned char *buf)
+{
+   /* returns the number of utf8 characters (not bytes) in the string */
+   int index = 0, len = 0;
+
+   while (buf[index])
+     {
+       if ((buf[index] & 0xc0) != 0x80)
+         len++;
+       index++;
+     }
+   return len;
+}
diff --git a/src/lib/engines/common/evas_font_query.c b/src/lib/engines/common/evas_font_query.c
new file mode 100644 (file)
index 0000000..c626612
--- /dev/null
@@ -0,0 +1,599 @@
+#include "evas_common.h"
+#include "evas_intl_utils.h" /*defines INTERNATIONAL_SUPPORT if possible */
+
+EAPI int
+evas_common_font_query_kerning(RGBA_Font_Int* fi,
+                              FT_UInt prev, FT_UInt index,
+                              int* kerning)
+{
+   int *result;
+   FT_Vector delta;
+   int key[2];
+   int error = 1;
+
+//   return 0;
+   key[0] = prev;
+   key[1] = index;
+
+   result = eina_hash_find(fi->kerning, key);
+   if (result)
+     {
+       *kerning = result[2];
+       goto on_correct;
+     }
+
+   /* NOTE: ft2 seems to have a bug. and sometimes returns bizarre
+    * values to kern by - given same font, same size and same
+    * prev_index and index. auto/bytecode or none hinting doesnt
+    * matter */
+   if (FT_Get_Kerning(fi->src->ft.face,
+                     key[0], key[1],
+                     ft_kerning_default, &delta) == 0)
+     {
+       int *push;
+
+       *kerning = delta.x >> 6;
+
+       push = malloc(sizeof (int) * 3);
+       if (!push) return 1;
+
+       push[0] = key[0];
+       push[1] = key[1];
+       push[2] = *kerning;
+
+       eina_hash_direct_add(fi->kerning, push, push);
+
+       goto on_correct;
+     }
+
+   error = 0;
+
+ on_correct:
+   return error;
+}
+
+/* string extents */
+EAPI void
+evas_common_font_query_size(RGBA_Font *fn, const char *text, int *w, int *h)
+{
+   int use_kerning;
+   int pen_x, pen_y;
+   int start_x, end_x;
+   int chr;
+   FT_UInt prev_index;
+   RGBA_Font_Int *fi;
+   FT_Face pface = NULL;
+
+   fi = fn->fonts->data;
+
+   start_x = 0;
+   end_x = 0;
+
+   pen_x = 0;
+   pen_y = 0;
+//   evas_common_font_size_use(fn);
+   use_kerning = FT_HAS_KERNING(fi->src->ft.face);
+   prev_index = 0;
+   for (chr = 0; text[chr];)
+     {
+       FT_UInt index;
+       RGBA_Font_Glyph *fg;
+       int chr_x, chr_y, chr_w;
+        int gl, kern;
+
+       gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr);
+       if (gl == 0) break;
+       index = evas_common_font_glyph_search(fn, &fi, gl);
+       LKL(fi->ft_mutex);
+        if (fi->src->current_size != fi->size)
+          {
+             FT_Activate_Size(fi->ft.size);
+             fi->src->current_size = fi->size;
+          }
+      /* hmmm kerning means i can't sanely do my own cached metric tables! */
+       /* grrr - this means font face sharing is kinda... not an option if */
+       /* you want performance */
+       kern = 0;
+       if ((use_kerning) && (prev_index) && (index) &&
+           (pface == fi->src->ft.face))
+         if (evas_common_font_query_kerning(fi, prev_index, index, &kern))
+           pen_x += kern;
+
+       pface = fi->src->ft.face;
+       fg = evas_common_font_int_cache_glyph_get(fi, index);
+       LKU(fi->ft_mutex);
+       if (!fg) continue;
+
+       if (kern < 0) kern = 0;
+       chr_x = ((pen_x - kern) + (fg->glyph_out->left));
+       chr_y = (pen_y + (fg->glyph_out->top));
+//     chr_w = fg->glyph_out->bitmap.width;
+       chr_w = fg->glyph_out->bitmap.width + kern;
+         {
+            int advw;
+
+            advw = ((fg->glyph->advance.x + (kern << 16)) >> 16);
+            if (chr_w < advw) chr_w = advw;
+         }
+
+       if ((!prev_index) && (chr_x < 0))
+         start_x = chr_x;
+       if ((chr_x + chr_w) > end_x)
+         end_x = chr_x + chr_w;
+
+       pen_x += fg->glyph->advance.x >> 16;
+       prev_index = index;
+     }
+   if (w) *w = end_x - start_x;
+   if (h) *h = evas_common_font_max_ascent_get(fn) + evas_common_font_max_descent_get(fn);
+}
+
+/* text x inset */
+EAPI int
+evas_common_font_query_inset(RGBA_Font *fn, const char *text)
+{
+   FT_UInt index;
+   RGBA_Font_Glyph *fg;
+   int chr;
+   int gl;
+   RGBA_Font_Int *fi;
+
+   fi = fn->fonts->data;
+
+   chr = 0;
+   if (!text[0]) return 0;
+   gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr);
+   if (gl == 0) return 0;
+//   evas_common_font_size_use(fn);
+   index = evas_common_font_glyph_search(fn, &fi, gl);
+   if (fi->src->current_size != fi->size)
+     {
+        FT_Activate_Size(fi->ft.size);
+        fi->src->current_size = fi->size;
+     }
+   fg = evas_common_font_int_cache_glyph_get(fi, index);
+   if (!fg) return 0;
+/*
+   INF("fg->glyph_out->left = %i\n"
+         "fi->src->ft.face->glyph->bitmap_left = %i\n"
+         "fi->src->ft.face->glyph->metrics.horiBearingX = %i\n"
+         "fi->src->ft.face->glyph->metrics.horiBearingY = %i\n"
+         "fi->src->ft.face->glyph->metrics.horiAdvance = %i"
+         ,
+         (int)fg->glyph_out->left,
+         (int)fi->src->ft.face->glyph->bitmap_left,
+         (int)fi->src->ft.face->glyph->metrics.horiBearingX >> 6,
+         (int)fi->src->ft.face->glyph->metrics.horiBearingY >> 6,
+         (int)fi->src->ft.face->glyph->metrics.horiAdvance >> 6
+         );
+ */
+   return fg->glyph_out->left;
+}
+
+/* h & v advance */
+EAPI void
+evas_common_font_query_advance(RGBA_Font *fn, const char *text, int *h_adv, int *v_adv)
+{
+   int use_kerning;
+   int pen_x, pen_y;
+   int start_x;
+   int chr;
+   FT_UInt prev_index;
+   RGBA_Font_Int *fi;
+   FT_Face pface = NULL;
+
+   fi = fn->fonts->data;
+
+   start_x = 0;
+   pen_x = 0;
+   pen_y = 0;
+//   evas_common_font_size_use(fn);
+   use_kerning = FT_HAS_KERNING(fi->src->ft.face);
+   prev_index = 0;
+   for (chr = 0; text[chr];)
+     {
+       FT_UInt index;
+       RGBA_Font_Glyph *fg;
+       int chr_x, chr_y, chr_w;
+        int gl, kern;
+
+       gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr);
+       if (gl == 0) break;
+       index = evas_common_font_glyph_search(fn, &fi, gl);
+       LKL(fi->ft_mutex);
+        if (fi->src->current_size != fi->size)
+          {
+             FT_Activate_Size(fi->ft.size);
+             fi->src->current_size = fi->size;
+          }
+      /* hmmm kerning means i can't sanely do my own cached metric tables! */
+       /* grrr - this means font face sharing is kinda... not an option if */
+       /* you want performance */
+       if ((use_kerning) && (prev_index) && (index) &&
+           (pface == fi->src->ft.face))
+         if (evas_common_font_query_kerning(fi, prev_index, index, &kern))
+           pen_x += kern;
+
+       pface = fi->src->ft.face;
+       fg = evas_common_font_int_cache_glyph_get(fi, index);
+       LKU(fi->ft_mutex);
+       if (!fg) continue;
+
+        chr_x = (pen_x + (fg->glyph_out->left));
+       chr_y = (pen_y + (fg->glyph_out->top));
+       chr_w = fg->glyph_out->bitmap.width;
+
+       pen_x += fg->glyph->advance.x >> 16;
+       prev_index = index;
+     }
+   if (v_adv) *v_adv = evas_common_font_get_line_advance(fn);
+   if (h_adv) *h_adv = pen_x - start_x;
+}
+
+/* x y w h for char at char pos */
+EAPI int
+evas_common_font_query_char_coords(RGBA_Font *fn, const char *in_text, int pos, int *cx, int *cy, int *cw, int *ch)
+{
+   int use_kerning;
+   int pen_x, pen_y;
+   int prev_chr_end;
+   int chr;
+   int asc, desc;
+   int char_index = 0; /* the index of the current char */
+   int position;
+   const char *text = in_text;
+   int ret_val = 0;
+   FT_UInt prev_index;
+   RGBA_Font_Int *fi;
+   FT_Face pface = NULL;
+
+#ifdef INTERNATIONAL_SUPPORT
+   int len = 0;
+   EvasIntlParType direction = FRIBIDI_TYPE_ON;
+   EvasIntlLevel *level_list = NULL;
+   EvasIntlStrIndex *visual_to_logical = NULL;
+   char *visual_text = evas_intl_utf8_to_visual(in_text, &len, &direction, &visual_to_logical, NULL, &level_list);
+   text = (visual_text) ? visual_text : in_text;
+#endif
+
+   fi = fn->fonts->data;
+
+   pen_x = 0;
+   pen_y = 0;
+//   evas_common_font_size_use(fn);
+   if (fi->src->current_size != fi->size)
+     {
+        FT_Activate_Size(fi->ft.size);
+        fi->src->current_size = fi->size;
+     }
+   use_kerning = FT_HAS_KERNING(fi->src->ft.face);
+   prev_index = 0;
+   prev_chr_end = 0;
+   asc = evas_common_font_max_ascent_get(fn);
+   desc = evas_common_font_max_descent_get(fn);
+
+   /* find the actual index, not the byte position */
+   for (position = 0 , chr = 0 ; in_text[chr] && chr < pos ; position++) {
+      evas_common_font_utf8_get_next((unsigned char *)in_text, &chr);
+   }
+   /* if we couldn't reach the correct position for some reason,
+    * return with an error */
+   if (chr != pos) {
+      ret_val = 0;
+      goto end;
+   }
+     
+#ifdef INTERNATIONAL_SUPPORT 
+   /* if it's an in string position (not end), get logical position */
+   if (position < len)
+      position = evas_intl_position_visual_to_logical(visual_to_logical, position);
+#endif
+
+
+   for (char_index = 0, chr = 0; text[chr]; char_index++)
+     {
+       int pchr;
+       FT_UInt index;
+       RGBA_Font_Glyph *fg;
+       int chr_x, chr_y, chr_w;
+        int gl, kern;
+
+       pchr = chr;
+       gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr);
+       if (gl == 0) break;
+       index = evas_common_font_glyph_search(fn, &fi, gl);
+       LKL(fi->ft_mutex);
+       // FIXME: Why no FT_Activate_Size here ?
+       kern = 0;
+        /* hmmm kerning means i can't sanely do my own cached metric tables! */
+       /* grrr - this means font face sharing is kinda... not an option if */
+       /* you want performance */
+       if ((use_kerning) && (prev_index) && (index) &&
+            (pface == fi->src->ft.face))
+          {
+#ifdef INTERNATIONAL_SUPPORT
+             /* if it's rtl, the kerning matching should be reversed, i.e prev
+              * index is now the index and the other way around. */
+             if (evas_intl_is_rtl_char(level_list, char_index))
+               {
+                  if (evas_common_font_query_kerning(fi, index, prev_index, &kern))
+                     pen_x += kern;
+               }
+             else
+#endif
+              {
+
+                  if (evas_common_font_query_kerning(fi, prev_index, index, &kern))
+                     pen_x += kern;
+             }
+           }
+
+       pface = fi->src->ft.face;
+       fg = evas_common_font_int_cache_glyph_get(fi, index);
+       LKU(fi->ft_mutex);
+       if (!fg) continue;
+
+       if (kern < 0) kern = 0;
+        chr_x = ((pen_x - kern) + (fg->glyph_out->left));
+       chr_y = (pen_y + (fg->glyph_out->top));
+       chr_w = fg->glyph_out->bitmap.width + (kern);
+/*     if (text[chr]) */
+         {
+            int advw;
+
+            advw = ((fg->glyph->advance.x + (kern << 16)) >> 16);
+            if (chr_w < advw) chr_w = advw;
+         }
+       if (chr_x > prev_chr_end)
+         {
+            chr_w += (chr_x - prev_chr_end);
+            chr_x = prev_chr_end;
+         }
+       /* we need to see if the char at the visual position is the char wanted */
+       if (char_index == position)
+         {
+            if (cx) *cx = chr_x;
+            if (cy) *cy = -asc;
+            if (cw) *cw = chr_w;
+            if (ch) *ch = asc + desc;
+            ret_val = 1;
+            goto end;
+         }
+       prev_chr_end = chr_x + chr_w;
+       pen_x += fg->glyph->advance.x >> 16;
+       prev_index = index;
+     }
+end:
+
+#ifdef INTERNATIONAL_SUPPORT
+   if (level_list) free(level_list);
+   if (visual_to_logical) free(visual_to_logical);
+   if (visual_text) free(visual_text);
+#endif
+
+   return ret_val;
+}
+
+/* char pos of text at xy pos */
+EAPI int
+evas_common_font_query_text_at_pos(RGBA_Font *fn, const char *in_text, int x, int y, int *cx, int *cy, int *cw, int *ch)
+{
+   int use_kerning;
+   int pen_x, pen_y;
+   int prev_chr_end;
+   int chr;
+   int asc, desc;
+   int char_index = 0; /* the index of the current char */
+   const char *text = in_text;
+   int ret_val = -1;
+   FT_UInt prev_index;
+   RGBA_Font_Int *fi;
+   FT_Face pface = NULL;
+
+#ifdef INTERNATIONAL_SUPPORT
+   int len = 0;
+   EvasIntlParType direction = FRIBIDI_TYPE_ON;
+   EvasIntlLevel *level_list = NULL;
+   EvasIntlStrIndex *visual_to_logical = NULL;
+   char *visual_text = evas_intl_utf8_to_visual(in_text, &len, &direction, NULL, &visual_to_logical, &level_list);
+   text = (visual_text) ? visual_text : in_text;
+#endif
+
+   fi = fn->fonts->data;
+
+   pen_x = 0;
+   pen_y = 0;
+//   evas_common_font_size_use(fn);
+   if (fi->src->current_size != fi->size)
+     {
+        FT_Activate_Size(fi->ft.size);
+        fi->src->current_size = fi->size;
+     }
+   use_kerning = FT_HAS_KERNING(fi->src->ft.face);
+   prev_index = 0;
+   prev_chr_end = 0;
+   asc = evas_common_font_max_ascent_get(fn);
+   desc = evas_common_font_max_descent_get(fn);
+   
+   for (char_index = 0, chr = 0; text[chr]; char_index++)
+     {
+       int pchr;
+       FT_UInt index;
+       RGBA_Font_Glyph *fg;
+       int chr_x, chr_y, chr_w;
+        int gl, kern;
+
+       pchr = chr;
+       gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr);
+       if (gl == 0) break;
+       index = evas_common_font_glyph_search(fn, &fi, gl);
+       LKL(fi->ft_mutex);
+       // FIXME: Why not FT_Activate_Size here ?
+       kern = 0;
+        /* hmmm kerning means i can't sanely do my own cached metric tables! */
+       /* grrr - this means font face sharing is kinda... not an option if */
+       /* you want performance */
+       if ((use_kerning) && (prev_index) && (index) &&
+            (pface == fi->src->ft.face))
+          {
+#ifdef INTERNATIONAL_SUPPORT
+             /* if it's rtl, the kerning matching should be reversed, i.e prev
+              * index is now the index and the other way around. */
+             if (evas_intl_is_rtl_char(level_list, char_index))
+               {
+                  if (evas_common_font_query_kerning(fi, index, prev_index, &kern))
+                     pen_x += kern;
+               }
+             else
+#endif
+                {
+
+                  if (evas_common_font_query_kerning(fi, prev_index, index, &kern))
+                     pen_x += kern;
+               }
+           }
+
+       pface = fi->src->ft.face;
+       fg = evas_common_font_int_cache_glyph_get(fi, index);
+       LKU(fi->ft_mutex);
+       if (!fg) continue;
+
+       if (kern < 0) kern = 0;
+        chr_x = ((pen_x - kern) + (fg->glyph_out->left));
+       chr_y = (pen_y + (fg->glyph_out->top));
+       chr_w = fg->glyph_out->bitmap.width + kern;
+/*     if (text[chr]) */
+         {
+            int advw;
+
+            advw = ((fg->glyph->advance.x + (kern << 16)) >> 16);
+            if (chr_w < advw) chr_w = advw;
+         }
+       if (chr_x > prev_chr_end)
+         {
+            chr_w += (chr_x - prev_chr_end);
+            chr_x = prev_chr_end;
+         }
+       if ((x >= chr_x) && (x <= (chr_x + chr_w)) &&
+           (y >= -asc) && (y <= desc))
+         {
+            if (cx) *cx = chr_x;
+            if (cy) *cy = -asc;
+            if (cw) *cw = chr_w;
+            if (ch) *ch = asc + desc;
+#ifdef INTERNATIONAL_SUPPORT
+             {
+                /* we found the char position of the wanted char in the
+                 * visual string, we now need to translate it to the
+                 * position in the logical string */
+               int i;
+               int position = evas_intl_position_visual_to_logical(visual_to_logical, char_index);
+                
+               /* ensure even if the list won't run */
+                for (pchr = 0, i = 0; i < position; i++)
+                  evas_common_font_utf8_get_next((unsigned char *)in_text, &pchr);
+             }
+#endif
+            ret_val = pchr;
+            goto end;
+         }
+       prev_chr_end = chr_x + chr_w;
+       pen_x += fg->glyph->advance.x >> 16;
+       prev_index = index;
+     }
+     
+end:
+   
+#ifdef INTERNATIONAL_SUPPORT
+   if (level_list) free(level_list);
+   if (visual_to_logical) free(visual_to_logical);
+   if (visual_text) free(visual_text);
+#endif
+
+   return ret_val;
+}
+
+/* last char pos of text at xy pos
+ * Note: no need for special rtl handling
+ * because the string is in logical order, which is correct */
+EAPI int
+evas_common_font_query_last_up_to_pos(RGBA_Font *fn, const char *text, int x, int y)
+{
+   int use_kerning;
+   int pen_x, pen_y;
+   int prev_chr_end;
+   int chr;
+   int asc, desc;
+   FT_UInt prev_index;
+   RGBA_Font_Int *fi;
+   FT_Face pface = NULL;
+
+   fi = fn->fonts->data;
+
+   pen_x = 0;
+   pen_y = 0;
+//   evas_common_font_size_use(fn);
+   use_kerning = FT_HAS_KERNING(fi->src->ft.face);
+   prev_index = 0;
+   prev_chr_end = 0;
+   asc = evas_common_font_max_ascent_get(fn);
+   desc = evas_common_font_max_descent_get(fn);
+   for (chr = 0; text[chr];)
+     {
+       int pchr;
+       FT_UInt index;
+       RGBA_Font_Glyph *fg;
+       int chr_x, chr_y, chr_w;
+        int gl, kern;
+
+       pchr = chr;
+       gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr);
+       if (gl == 0) break;
+       index = evas_common_font_glyph_search(fn, &fi, gl);
+       LKL(fi->ft_mutex);
+        if (fi->src->current_size != fi->size)
+          {
+             FT_Activate_Size(fi->ft.size);
+             fi->src->current_size = fi->size;
+          }
+       kern = 0;
+        /* hmmm kerning means i can't sanely do my own cached metric tables! */
+       /* grrr - this means font face sharing is kinda... not an option if */
+       /* you want performance */
+       if ((use_kerning) && (prev_index) && (index) &&
+           (pface == fi->src->ft.face))
+         if (evas_common_font_query_kerning(fi, prev_index, index, &kern))
+           pen_x += kern;
+
+       pface = fi->src->ft.face;
+       fg = evas_common_font_int_cache_glyph_get(fi, index);
+       LKU(fi->ft_mutex);
+       if (!fg) continue;
+
+       if (kern < 0) kern = 0;
+        chr_x = ((pen_x - kern) + (fg->glyph_out->left));
+       chr_y = (pen_y + (fg->glyph_out->top));
+       chr_w = fg->glyph_out->bitmap.width + kern;
+/*     if (text[chr]) */
+         {
+            int advw;
+
+            advw = ((fg->glyph->advance.x + (kern << 16)) >> 16);
+            if (chr_w < advw) chr_w = advw;
+         }
+       if (chr_x > prev_chr_end)
+         {
+            chr_w += (chr_x - prev_chr_end);
+            chr_x = prev_chr_end;
+         }
+       if ((x >= chr_x) && (x <= (chr_x + chr_w)) &&
+           (y >= -asc) && (y <= desc))
+         {
+            return pchr;
+         }
+       prev_chr_end = chr_x + chr_w;
+       pen_x += fg->glyph->advance.x >> 16;
+       prev_index = index;
+     }
+   return -1;
+}
diff --git a/src/lib/engines/common/evas_gradient.h b/src/lib/engines/common/evas_gradient.h
new file mode 100644 (file)
index 0000000..50e2cb8
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_GRADIENT_H
+#define _EVAS_GRADIENT_H
+
+
+EAPI void           evas_common_gradient_init              (void);
+
+EAPI RGBA_Gradient *evas_common_gradient_new               (void);
+EAPI void           evas_common_gradient_free              (RGBA_Gradient *gr);
+EAPI void           evas_common_gradient_clear             (RGBA_Gradient *gr);
+EAPI void           evas_common_gradient_color_stop_add    (RGBA_Gradient *gr, int r, int g, int b, int a, int dist);
+EAPI void           evas_common_gradient_alpha_stop_add    (RGBA_Gradient *gr, int a, int dist);
+EAPI void           evas_common_gradient_color_data_set    (RGBA_Gradient *gr, DATA32 *data, int len, int alpha_flags);
+EAPI void           evas_common_gradient_alpha_data_set    (RGBA_Gradient *gr, DATA8 *adata, int len);
+EAPI void           evas_common_gradient_type_set          (RGBA_Gradient *gr, const char *name, char *params);
+EAPI void           evas_common_gradient_fill_set          (RGBA_Gradient *gr, int x, int y, int w, int h);
+EAPI void           evas_common_gradient_fill_angle_set    (RGBA_Gradient *gr, float angle);
+EAPI void           evas_common_gradient_fill_spread_set   (RGBA_Gradient *gr, int spread);
+EAPI void           evas_common_gradient_map_angle_set     (RGBA_Gradient *gr, float angle);
+EAPI void           evas_common_gradient_map_offset_set    (RGBA_Gradient *gr, float offset);
+EAPI void           evas_common_gradient_map_direction_set (RGBA_Gradient *gr, int direction);
+EAPI void           evas_common_gradient_map               (RGBA_Draw_Context *dc, RGBA_Gradient *gr, int len);
+EAPI void           evas_common_gradient_draw              (RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h, RGBA_Gradient *gr);
+
+EAPI RGBA_Gradient_Type *evas_common_gradient_geometer_get (const char *name);
+
+
+
+EAPI void           evas_common_gradient2_free             (RGBA_Gradient2 *gr);
+EAPI RGBA_Gradient2 *evas_common_gradient2_linear_new              (void);
+EAPI void           evas_common_gradient2_linear_fill_set (RGBA_Gradient2 *gr, float x0, float y0, float x1, float y1);
+EAPI RGBA_Gradient2 *evas_common_gradient2_radial_new              (void);
+EAPI void           evas_common_gradient2_radial_fill_set (RGBA_Gradient2 *gr, float cx, float cy, float rx, float ry);
+EAPI void           evas_common_gradient2_clear            (RGBA_Gradient2 *gr);
+EAPI void           evas_common_gradient2_color_np_stop_insert   (RGBA_Gradient2 *gr, int r, int g, int b, int a, float pos);
+EAPI void           evas_common_gradient2_fill_spread_set  (RGBA_Gradient2 *gr, int spread);
+EAPI void           evas_common_gradient2_fill_transform_set (RGBA_Gradient2 *gr, Evas_Common_Transform *t);
+EAPI void           evas_common_gradient2_map              (RGBA_Draw_Context *dc, RGBA_Gradient2 *gr, int len);
+EAPI void           evas_common_gradient2_draw             (RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h, RGBA_Gradient2 *gr);
+
+EAPI RGBA_Gradient2_Type *evas_common_gradient2_type_linear_get      (void);
+EAPI RGBA_Gradient2_Type *evas_common_gradient2_type_radial_get      (void);
+//EAPI RGBA_Gradient2_Type *evas_common_gradient2_type_angular_get     (void);
+//EAPI RGBA_Gradient2_Type *evas_common_gradient2_type_rectangular_get (void);
+//EAPI RGBA_Gradient2_Type *evas_common_gradient2_type_sinusoidal_get  (void);
+
+#endif /* _EVAS_GRADIENT_H */
diff --git a/src/lib/engines/common/evas_gradient2_linear.c b/src/lib/engines/common/evas_gradient2_linear.c
new file mode 100644 (file)
index 0000000..7736851
--- /dev/null
@@ -0,0 +1,728 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include <math.h>
+
+#define LINEAR_EPSILON 0.000030517578125
+#define LINEAR_INT_TOLERANCE 0.001953125
+// 1/512 = 0.001953125 <-- will use this one as our subpixel pos tolerance.
+// 1/256 = 0.00390625  <-- though this one would be ok too for our uses.
+
+typedef struct _Linear_Data   Linear_Data;
+
+struct _Linear_Data
+{
+   float    x0, y0, x1, y1;
+   float    fx0, fy0;
+   int      ayx, ayy;
+   int      len;
+   unsigned char int_axis_aligned : 1;
+};
+
+
+static void 
+linear_init(void);
+
+static void 
+linear_shutdown(void);
+
+static void 
+linear_init_geom(RGBA_Gradient2 *gr);
+
+static void
+linear_update_geom(RGBA_Gradient2 *gr);
+
+static void 
+linear_free_geom(void *gdata);
+
+static int
+linear_has_alpha(RGBA_Gradient2 *gr, int op);
+
+static int
+linear_has_mask(RGBA_Gradient2 *gr, int op);
+
+static int
+linear_get_map_len(RGBA_Gradient2 *gr);
+
+static Gfx_Func_Gradient2_Fill
+linear_get_fill_func(RGBA_Gradient2 *gr, int op);
+
+static RGBA_Gradient2_Type  linear = {"linear", linear_init, linear_shutdown,
+                                     linear_init_geom,
+                                     linear_update_geom, linear_free_geom,
+                                     linear_has_alpha, linear_has_mask,
+                                     linear_get_map_len, linear_get_fill_func};
+
+
+EAPI RGBA_Gradient2_Type  *
+evas_common_gradient2_type_linear_get(void)
+{
+    return &linear;
+}
+
+EAPI RGBA_Gradient2 *
+evas_common_gradient2_linear_new(void)
+{
+   RGBA_Gradient2 *gr;
+
+   gr = calloc(1, sizeof(RGBA_Gradient2));
+   if (!gr) return NULL;
+   gr->references = 1;
+   gr->type.id = MAGIC_OBJ_GRADIENT_LINEAR;
+   gr->type.geometer = &linear;
+   linear_init_geom(gr);
+   return gr;
+}
+
+EAPI void
+evas_common_gradient2_linear_fill_set(RGBA_Gradient2 *gr, float x0, float y0, float x1, float y1)
+{
+   Linear_Data *linear_data;
+
+   if (!gr) return;
+   if (gr->type.id != MAGIC_OBJ_GRADIENT_LINEAR) return;
+   if (gr->type.geometer != &linear) return;
+   linear_data = (Linear_Data *)gr->type.gdata;
+   if (!linear_data) return;
+   linear_data->x0 = x0;  linear_data->y0 = y0;
+   linear_data->x1 = x1;  linear_data->y1 = y1;
+}
+
+
+
+/** internal functions **/
+
+static void
+linear_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                  int x, int y, void *params_data);
+
+static void
+linear_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                 int x, int y, void *params_data);
+
+static void
+linear_restrict_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                   int x, int y, void *params_data);
+
+static void
+linear_restrict_masked_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                          int x, int y, void *params_data);
+
+static void
+linear_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+              int x, int y, void *params_data);
+
+
+
+static void 
+linear_init(void)
+{
+}
+
+static void 
+linear_shutdown(void)
+{
+}
+
+static void 
+linear_free_geom(void *gdata)
+{
+   Linear_Data *data = (Linear_Data *)gdata;
+   if (data) free(data);
+}
+
+static void
+linear_init_geom(RGBA_Gradient2 *gr)
+{
+   Linear_Data *linear_data;
+
+   if (!gr || (gr->type.geometer != &linear)) return;
+   linear_data = (Linear_Data *)gr->type.gdata;
+   if (!linear_data)
+     {
+       linear_data = calloc(1, sizeof(Linear_Data));
+       if (!linear_data)  return;
+       linear_data->ayy = 65536;  linear_data->ayx = 0;
+     }
+   gr->type.gdata = linear_data;
+}
+
+
+static void
+linear_update_geom(RGBA_Gradient2 *gr)
+{
+   Linear_Data *linear_data;
+   double f;
+   double fx0, fy0, fx1, fy1;
+   int len;
+
+   if (!gr || (gr->type.geometer != &linear)) return;
+   linear_data = (Linear_Data *)gr->type.gdata;
+   if (!linear_data) return;
+
+   linear_data->int_axis_aligned = 0;
+   linear_data->len = 0;
+   f = (gr->fill.transform.mxx * (double)gr->fill.transform.myy) - (gr->fill.transform.mxy * (double)gr->fill.transform.myx);
+   if (fabs(f) < LINEAR_EPSILON) return;
+
+   f = 1.0 / f;
+   fx0 = (((gr->fill.transform.myy * (double)linear_data->x0) - (gr->fill.transform.mxy * (double)linear_data->y0)) * f) - gr->fill.transform.mxz;
+   fy0 = ((-(gr->fill.transform.myx * (double)linear_data->x0) + (gr->fill.transform.mxx * (double)linear_data->y0)) * f) - gr->fill.transform.myz;
+
+   fx1 = (((gr->fill.transform.myy * (double)linear_data->x1) - (gr->fill.transform.mxy * (double)linear_data->y1)) * f) - gr->fill.transform.mxz;
+   fy1 = ((-(gr->fill.transform.myx * (double)linear_data->x1) + (gr->fill.transform.mxx * (double)linear_data->y1)) * f) - gr->fill.transform.myz;
+
+   f = hypot(fx1 - fx0, fy1 - fy0);
+   linear_data->len = len = f + 0.5;
+   if (!len) return;
+
+   linear_data->ayx = ((fx1 - fx0) / f) * 65536;
+   linear_data->ayy = ((fy1 - fy0) / f) * 65536;
+
+   if (fabs(fy0 - fy1) < LINEAR_INT_TOLERANCE)
+     {
+       if ( (fabs(((int)fy0) - fy0) < LINEAR_INT_TOLERANCE) &&
+           (fabs(((int)fy1) - fy1) < LINEAR_INT_TOLERANCE) )
+          { linear_data->int_axis_aligned = 1;  linear_data->ayy = 0; }
+     }
+   else if (fabs(fx0 - fx1) < LINEAR_INT_TOLERANCE)
+     {
+       if ( (fabs(((int)fx0) - fx0) < LINEAR_INT_TOLERANCE) &&
+           (fabs(((int)fx1) - fx1) < LINEAR_INT_TOLERANCE) )
+          { linear_data->int_axis_aligned = 1;  linear_data->ayx = 0; }
+     }
+   linear_data->fx0 = fx0;
+   linear_data->fy0 = fy0;
+}
+
+static int
+linear_has_alpha(RGBA_Gradient2 *gr, int op)
+{
+   if (!gr || (gr->type.geometer != &linear)) return 0;
+   if (gr->has_alpha | gr->map.has_alpha)
+       return 1;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || 
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+       return 0;
+   if (gr->fill.spread == _EVAS_TEXTURE_RESTRICT)
+       return 1;
+   return 0;
+}
+
+static int
+linear_has_mask(RGBA_Gradient2 *gr, int op)
+{
+   if (!gr || (gr->type.geometer != &linear)) return 0;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || 
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+     {
+       if (gr->fill.spread == _EVAS_TEXTURE_RESTRICT)
+           return 1;
+     }
+   return 0;
+}
+
+static int
+linear_get_map_len(RGBA_Gradient2 *gr)
+{
+   Linear_Data   *linear_data;
+
+   if (!gr || (gr->type.geometer != &linear)) return 0;
+   linear_data = (Linear_Data *)gr->type.gdata;
+   if (!linear_data) return 0;
+   return linear_data->len;
+}
+
+static Gfx_Func_Gradient2_Fill
+linear_get_fill_func(RGBA_Gradient2 *gr, int op)
+{
+   Linear_Data   *linear_data;
+   Gfx_Func_Gradient2_Fill  sfunc = NULL;
+   int masked_op = 0;
+
+   if (!gr || (gr->type.geometer != &linear))
+       return sfunc;
+   linear_data = (Linear_Data *)gr->type.gdata;
+   if (!linear_data) return sfunc;
+
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || 
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+       masked_op = 1;
+
+   switch (gr->fill.spread)
+     {
+      case _EVAS_TEXTURE_REPEAT:
+       sfunc = linear_repeat_aa;
+      break;
+      case _EVAS_TEXTURE_REFLECT:
+       sfunc = linear_reflect_aa;
+      break;
+      case _EVAS_TEXTURE_RESTRICT:
+       if (masked_op)
+          sfunc = linear_restrict_masked_aa;
+       else
+          sfunc = linear_restrict_aa;
+      break;
+      case _EVAS_TEXTURE_PAD:
+       sfunc = linear_pad_aa;
+      break;
+      default:
+       sfunc = linear_repeat_aa;
+      break;
+     }
+   return sfunc;
+}
+
+
+/* the fill functions */
+
+#ifdef BUILD_MMX
+#define INTERP_256_P2R(a, s, mma, mms, mmd, mmz) \
+           MOV_A2R(a, mma) \
+           MOV_P2R(s, mms, mmz) \
+           INTERP_256_R2R(mma, mms, mmd, mm5)
+
+#define MUL_256_A2R(a, mma, mmd, mmz) \
+       MOV_A2R(a, mma) \
+       MUL4_256_R2R(mma, mmd)
+#endif
+
+static void
+linear_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                 int x, int y, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      yy;
+
+   evas_common_cpu_end_opt();
+   yy = (gdata->ayx * (x - gdata->fx0 + 0.5)) + (gdata->ayy * (y - gdata->fy0 + 0.5)) - 32768;
+
+   if (gdata->int_axis_aligned && (gdata->ayx == 0))
+     {
+       DATA32  c;
+
+       y = (yy >> 16);
+       y = y % src_len;
+       if (y < 0)
+          y += src_len;
+       c = src[y];
+       while (dst < dst_end)
+           *dst++ = c;
+       return;
+     }
+
+   if (gdata->int_axis_aligned && (gdata->ayy == 0))
+     {
+       Gfx_Func_Copy  func;
+       int  l;
+
+       x = (yy >> 16);
+       x = x % src_len;
+       if (x < 0)
+          x += src_len;
+       if (gdata->ayx < 0)
+         {
+           l = x + 1;  x = 0;
+         }
+       else
+           l = src_len - x;
+       if (l > dst_len) l = dst_len;
+       func = evas_common_draw_func_copy_get(1, (gdata->ayx < 0 ? -1 : 0));
+       func(src + x, dst, l);
+       if (l == dst_len) return;
+       dst += l;  dst_len -= l;
+       l = dst_len / src_len;
+       while (l--)
+         {
+           func(src, dst, src_len);
+           dst += src_len;
+         }
+       l = dst_len % src_len;
+       if (gdata->ayx < 0)
+          src += src_len - l;
+       func(src, dst, l);
+       return;
+     }
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+       int  a = 1 + ((yy & 0xffff) >> 8);
+
+       if ((l >= src_len) || (l < 0))
+          { l = l % src_len;  if (l < 0) l += src_len; }
+
+#ifdef BUILD_MMX
+       MOV_P2R(src[l], mm1, mm0)
+#else
+       *dst = src[l];
+#endif
+       if (l + 1 < src_len)
+         {
+#ifdef BUILD_MMX
+           INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0)
+#else
+           *dst = INTERP_256(a, src[l + 1], *dst);
+#endif
+         }
+       if (l == (src_len - 1))
+         {
+#ifdef BUILD_MMX
+           INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0)
+#else
+          *dst = INTERP_256(a, src[0], *dst);
+#endif
+         }
+#ifdef BUILD_MMX
+       MOV_R2P(mm1, *dst, mm0)
+#endif
+       dst++;  yy += gdata->ayx;
+     }
+}
+
+
+static void
+linear_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                  int x, int y, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      yy;
+
+   evas_common_cpu_end_opt();
+   yy = (gdata->ayx * (x - gdata->fx0 + 0.5)) + (gdata->ayy * (y - gdata->fy0 + 0.5)) - 32768;
+
+   if (gdata->int_axis_aligned && (gdata->ayx == 0))
+     {
+       DATA32  c;
+
+       y = (yy >> 16);
+       if (y < 0)  y = -y;
+       if (y >= src_len)
+         {
+           int  m = (y % (2 * src_len));
+
+           y = (y % src_len);
+           if (m >= src_len)
+               y = src_len - y - 1;
+         }
+       c = src[y];
+       while (dst < dst_end)
+           *dst++ = c;
+       return;
+     }
+
+   if (gdata->int_axis_aligned && (gdata->ayy == 0))
+     {
+       Gfx_Func_Copy  func, ofunc;
+       int  l, sgn;
+
+       x = (yy >> 16);
+       sgn = (gdata->ayx < 0 ? -1 : 1);
+       if (x < 0)
+         {
+           x = -x;  sgn *= -1;
+         }
+       if (x >= src_len)
+         {
+           int  m = (x % (2 * src_len));
+
+           x = (x % src_len);
+           if (m >= src_len)
+             { x = src_len - x - 1;  sgn *= -1; }
+         }
+
+       if (sgn < 0)
+         {
+           l = x + 1;  x = 0;
+         }
+       else
+           l = src_len - x;
+
+       if (l > dst_len) l = dst_len;
+       func = evas_common_draw_func_copy_get(1, 0);
+       ofunc = evas_common_draw_func_copy_get(1, -1);
+
+       if (sgn > 0)
+          func(src + x, dst, l);
+       else
+          ofunc(src + x, dst, l);
+       if (l == dst_len) return;
+
+       dst += l;  dst_len -= l;
+       l = dst_len / src_len;
+       sgn *= -1;
+       while (l--)
+         {
+           if (sgn > 0)
+              func(src, dst, src_len);
+           else
+              ofunc(src, dst, src_len);
+           sgn *= -1;
+           dst += src_len;
+         }
+       l = dst_len % src_len;
+       if (sgn < 0)
+         {
+           src += src_len - l;
+           ofunc(src, dst, l);
+         }
+       else
+          func(src, dst, l);
+       return;
+     }
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+       int  a = 1 + ((yy & 0xffff) >> 8);
+
+       if (l < 0) { l = -l;  a = 257 - a; }
+       if (l >= src_len)
+         {
+           int  m = (l % (2 * src_len));
+
+           l = (l % src_len);
+           if (m >= src_len)
+             { l = src_len - l - 1;  a = 257 - a; }
+         }
+#ifdef BUILD_MMX
+       MOV_P2R(src[l], mm1, mm0)
+#else
+       *dst = src[l];
+#endif
+       if (l + 1 < src_len)
+         {
+#ifdef BUILD_MMX
+           INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0)
+#else
+           *dst = INTERP_256(a, src[l + 1], *dst);
+#endif
+         }
+#ifdef BUILD_MMX
+       MOV_R2P(mm1, *dst, mm0)
+#endif
+       dst++;  yy += gdata->ayx;
+     }
+}
+
+
+static void
+linear_restrict_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                   int x, int y, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      yy;
+
+   evas_common_cpu_end_opt();
+   yy = (gdata->ayx * (x - gdata->fx0 + 0.5)) + (gdata->ayy * (y - gdata->fy0 + 0.5)) - 32768;
+
+   if (gdata->int_axis_aligned && (gdata->ayx == 0))
+     {
+       DATA32  c;
+
+       y = (yy >> 16);
+       if ((y < 0) || (y >= src_len))
+         {
+           memset(dst, 0, sizeof(DATA32) * dst_len);
+           return;
+         }
+       c = src[y];
+       while (dst < dst_end)
+           *dst++ = c;
+       return;
+     }
+
+   if (gdata->int_axis_aligned && (gdata->ayy == 0))
+     {
+       Gfx_Func_Copy  func;
+       int sgn;
+
+       x = yy >> 16;
+       sgn = (gdata->ayx < 0 ? -1 : 1);
+       if ((unsigned)x < src_len)
+         {
+           if ((sgn > 0) && ((src_len - x) >= dst_len))
+             {
+               func = evas_common_draw_func_copy_get(dst_len, 0);
+               func(src + x, dst, dst_len);
+               return;
+             }
+           if ((sgn < 0) && (x >= (dst_len - 1)))
+             {
+               func = evas_common_draw_func_copy_get(dst_len, -1);
+               func(src + x - (dst_len - 1), dst, dst_len);
+               return;
+             }
+         }
+       while (dst < dst_end)
+         {
+           *dst = 0;
+           if ((unsigned)x < src_len)
+               *dst = src[x];
+           dst++;  x += sgn;
+         }
+       return;
+     }
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       *dst = 0;
+       if ((unsigned)(l + 1) < (src_len + 1))
+         {
+           int  a = 1 + ((yy & 0xffff) >> 8);
+           int  lp = l;
+
+           if (l == -1) lp = 0;
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];
+#endif
+           if (lp + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+             }
+           if (l == -1)
+             {
+#ifdef BUILD_MMX
+               MUL_256_A2R(a, mm3, mm1, mm0)
+#else
+               *dst = MUL_256(a, *dst);
+#endif
+             }
+           if (l == (src_len - 1))
+             {
+#ifdef BUILD_MMX
+               a = 257 - a;
+               MUL_256_A2R(a, mm3, mm1, mm0)
+#else
+               *dst = MUL_256(257 - a, *dst);
+#endif
+             }
+         }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+       dst++;  yy += gdata->ayx;
+     }
+}
+
+
+static void
+linear_restrict_masked_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                          int x, int y, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      yy;
+
+   evas_common_cpu_end_opt();
+   yy = (gdata->ayx * (x - gdata->fx0 + 0.5)) + (gdata->ayy * (y - gdata->fy0 + 0.5)) - 32768;
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       *dst = 0;  *mask = 0;
+       if ((unsigned)(l + 1) < (src_len + 1))
+         {
+           int  a = 1 + ((yy & 0xffff) >> 8);
+           int  lp = l;
+
+           if (l == -1) lp = 0;
+
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];  *mask = 255;
+#endif
+           if (lp + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+           if (l == -1)
+               *mask = a - 1;
+           if (l == (src_len - 1))
+               *mask = 256 - a;
+         }
+       dst++;  mask++;  yy += gdata->ayx;
+     }
+}
+
+
+static void
+linear_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+              int x, int y, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      yy;
+
+   evas_common_cpu_end_opt();
+   yy = (gdata->ayx * (x - gdata->fx0 + 0.5)) + (gdata->ayy * (y - gdata->fy0 + 0.5)) - 32768;
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       if (l < 0) *dst = src[0];
+       if (l >= src_len) *dst = src[src_len - 1];
+       if ((unsigned)l < src_len)
+         {
+           int  a = 1 + ((yy & 0xffff) >> 8);
+
+#ifdef BUILD_MMX
+           MOV_P2R(src[l], mm1, mm0)
+#else
+           *dst = src[l];
+#endif
+           if (l && (l + 1 < src_len))
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[l + 1], *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+         }
+       dst++;  yy += gdata->ayx;
+     }
+}
diff --git a/src/lib/engines/common/evas_gradient2_main.c b/src/lib/engines/common/evas_gradient2_main.c
new file mode 100644 (file)
index 0000000..e2b0d97
--- /dev/null
@@ -0,0 +1,578 @@
+#include "evas_common.h"
+#include "evas_blend_private.h"
+#include "evas_private.h"
+#include <math.h>
+
+static void _evas_common_gradient2_stops_free(RGBA_Gradient2 *gr);
+static void _evas_common_gradient2_stops_scale(RGBA_Gradient2 *gr);
+
+static void _evas_common_gradient2_map_argb(RGBA_Draw_Context *dc, RGBA_Gradient2 *gr, int len);
+static void _evas_common_gradient2_map_ahsv(RGBA_Draw_Context *dc, RGBA_Gradient2 *gr, int len);
+
+static  int grad_initialised = 0;
+
+EAPI void
+evas_common_gradient2_init(void)
+{
+   RGBA_Gradient2_Type  *geom;
+
+   if (grad_initialised)
+       return;
+   geom = evas_common_gradient2_type_linear_get();
+   if (geom)
+       geom->init();
+   geom = evas_common_gradient2_type_radial_get();
+   if (geom)
+       geom->init();
+   grad_initialised = 1;
+}
+
+void
+evas_common_gradient2_shutdown(void)
+{
+   RGBA_Gradient2_Type  *geom;
+
+   if (!grad_initialised)
+       return;
+   geom = evas_common_gradient2_type_linear_get();
+   if (geom)
+       geom->shutdown();
+   geom = evas_common_gradient2_type_radial_get();
+   if (geom)
+       geom->shutdown();
+   grad_initialised = 0;
+}
+
+static void
+_evas_common_gradient2_stops_free(RGBA_Gradient2 *gr)
+{
+   if (!gr) return;
+   if (gr->stops.stops)
+     {
+       Eina_Inlist *l;
+
+       while (gr->stops.stops)
+         {
+          l = gr->stops.stops;
+          gr->stops.stops = eina_inlist_remove(gr->stops.stops, gr->stops.stops);
+          free(l);
+         }
+       gr->stops.stops = NULL;
+       gr->stops.nstops = 0;
+     }
+}
+
+EAPI void
+evas_common_gradient2_free(RGBA_Gradient2 *gr)
+{
+   if (!gr) return;
+   gr->references--;
+   if (gr->references > 0) return;
+   evas_common_gradient2_clear(gr);
+   if (gr->stops.cdata) free(gr->stops.cdata);
+   if (gr->stops.adata) free(gr->stops.adata);
+   if (gr->type.geometer && gr->type.gdata)
+       gr->type.geometer->geom_free(gr->type.gdata);
+   if (gr->map.data) free(gr->map.data);
+   free(gr);
+}
+
+EAPI void
+evas_common_gradient2_clear(RGBA_Gradient2 *gr)
+{
+   if (!gr) return;
+
+   _evas_common_gradient2_stops_free(gr);
+   gr->has_alpha = 0;
+}
+
+EAPI void
+evas_common_gradient2_color_np_stop_insert(RGBA_Gradient2 *gr, int r, int g, int b, int a, float pos)
+{
+   RGBA_Gradient2_Color_Np_Stop *gc;
+   Eina_Inlist *l;
+
+   if (!gr) return;
+   if (!gr->stops.stops)
+     {
+       RGBA_Gradient2_Color_Np_Stop *gc1;
+
+       gc = malloc(sizeof(RGBA_Gradient2_Color_Np_Stop));
+       if (!gc) return;
+       gc1 = malloc(sizeof(RGBA_Gradient2_Color_Np_Stop));
+       if (!gc1) { free(gc);  return; }
+       gc->r = gc->g = gc->b = gc->a = 255;  gc->pos = 0.0;  gc->dist = 0;
+       gc1->r = gc1->g = gc1->b = gc1->a = 255;  gc1->pos = 1.0;  gc1->dist = 0;
+
+       gr->stops.stops = eina_inlist_append(gr->stops.stops, EINA_INLIST_GET(gc));
+       gr->stops.stops = eina_inlist_append(gr->stops.stops, EINA_INLIST_GET(gc1));
+       gr->stops.nstops = 2;
+       gr->stops.len = 0;
+     }
+
+   if (r < 0) r = 0;  if (r > 255) r = 255;
+   if (g < 0) g = 0;  if (g > 255) g = 255;
+   if (b < 0) b = 0;  if (b > 255) b = 255;
+   if (a < 0) a = 0;  if (a > 255) a = 255;
+   if (pos < 0.0) pos = 0.0;
+   if (pos > 1.0) pos = 1.0;
+
+   if (pos == 0.0)
+     {
+       gc = (RGBA_Gradient2_Color_Np_Stop *)gr->stops.stops;
+       gc->r = r;  gc->g = g;  gc->b = b;  gc->a = a;  gc->dist = 0;
+        if (a < 255) gr->has_alpha = 1;
+       return;
+     }
+   if (pos == 1.0)
+     {
+       gc = (RGBA_Gradient2_Color_Np_Stop *)(gr->stops.stops->last);
+       gc->r = r;  gc->g = g;  gc->b = b;  gc->a = a;  gc->dist = 0;
+       if (a < 255) gr->has_alpha = 1;
+       return;
+     }
+
+   l = gr->stops.stops->next;
+   while (l)
+     {
+       gc = (RGBA_Gradient2_Color_Np_Stop *)l;
+       if (pos <= gc->pos)
+         {
+           if (pos == gc->pos)
+             {
+               gc->r = r;  gc->g = g;  gc->b = b;  gc->a = a;  gc->dist = 0;
+               if (a < 255) gr->has_alpha = 1;
+               return;
+             }
+           break;
+         }
+       l = l->next;
+     }
+
+   gc = malloc(sizeof(RGBA_Gradient2_Color_Np_Stop));
+   if (!gc) return;
+   gc->r = r;
+   gc->g = g;
+   gc->b = b;
+   gc->a = a;
+   gc->pos = pos;
+   gc->dist = 0;
+
+   gr->stops.stops = eina_inlist_prepend_relative(gr->stops.stops, EINA_INLIST_GET(gc), l);
+   gr->stops.nstops++;
+   if (a < 255)
+       gr->has_alpha = 1;
+}
+
+EAPI void
+evas_common_gradient2_fill_transform_set(RGBA_Gradient2 *gr, Evas_Common_Transform *t)
+{
+   if (!gr) return;
+   if (!t)
+     {
+       gr->fill.transform.mxx = 1;  gr->fill.transform.mxy = 0;  gr->fill.transform.mxz = 0;
+       gr->fill.transform.myx = 0;  gr->fill.transform.myy = 1;  gr->fill.transform.myz = 0;
+       gr->fill.transform.mzx = 1;  gr->fill.transform.mzy = 0;  gr->fill.transform.mzz = 1;
+       return;
+     }
+   gr->fill.transform.mxx = t->mxx;  gr->fill.transform.mxy = t->mxy;  gr->fill.transform.mxz = t->mxz;
+   gr->fill.transform.myx = t->myx;  gr->fill.transform.myy = t->myy;  gr->fill.transform.myz = t->myz;
+   gr->fill.transform.mzx = t->mzx;  gr->fill.transform.mzy = t->mzy;  gr->fill.transform.mzz = t->mzz;
+}
+
+EAPI void
+evas_common_gradient2_fill_spread_set(RGBA_Gradient2 *gr, int spread)
+{
+   if (!gr) return;
+   gr->fill.spread = spread;
+}
+
+EAPI void
+evas_common_gradient2_draw(RGBA_Image *dst, RGBA_Draw_Context *dc,
+                          int x, int y, int w, int h, RGBA_Gradient2 *gr)
+{
+   Gfx_Func_Gradient2_Fill   gfunc;
+   RGBA_Gfx_Func            bfunc = NULL;
+   int             len;
+   int             xin, yin, xoff, yoff;
+   int             clx, cly, clw, clh;
+   DATA32          *pdst, *dst_end, *buf, *map;
+   RGBA_Image      *argb_buf = NULL, *alpha_buf = NULL;
+   DATA8           *mask = NULL;
+   void            *gdata;
+   int             direct_copy = 0, buf_step = 0;
+
+   if (!dst || !dc || !gr || !dst || !dst->image.data)
+       return;
+   if (!gr->map.data || !gr->type.geometer)
+       return;
+   if ((w < 1) || (h < 1))
+       return;
+   clx = 0;  cly = 0;  clw = dst->cache_entry.w;  clh = dst->cache_entry.h;
+   if ((clw < 1) || (clh < 1))  return;
+
+   if (dc->clip.use)
+     RECTS_CLIP_TO_RECT(clx,cly,clw,clh, dc->clip.x,dc->clip.y,dc->clip.w,dc->clip.h);
+   if ((clw < 1) || (clh < 1))  return;
+
+   xin = x;  yin = y;
+   RECTS_CLIP_TO_RECT(x,y,w,h, clx,cly,clw,clh);
+   if ((w < 1) || (h < 1))  return;
+
+   xoff = (x - xin);
+   yoff = (y - yin);
+
+   if (!gr->type.geometer->has_mask(gr, dc->render_op))
+     {
+       if ((dc->render_op == _EVAS_RENDER_FILL) ||
+             (dc->render_op == _EVAS_RENDER_COPY))
+         {
+            direct_copy = 1;  buf_step = dst->cache_entry.w;
+            if (gr->type.geometer->has_alpha(gr, dc->render_op))
+               dst->cache_entry.flags.alpha = 1;
+         }
+       else if ((dc->render_op == _EVAS_RENDER_BLEND) &&
+                 !gr->type.geometer->has_alpha(gr, dc->render_op))
+         {
+            direct_copy = 1;  buf_step = dst->cache_entry.w;
+         }
+     }
+   if (!direct_copy)
+     {
+       argb_buf = evas_common_image_line_buffer_obtain(w);
+       if (!argb_buf)
+          return;
+       argb_buf->cache_entry.flags.alpha = gr->type.geometer->has_alpha(gr, dc->render_op) ? 1 : 0;
+
+       if (gr->type.geometer->has_mask(gr, dc->render_op))
+         {
+           alpha_buf = evas_common_image_alpha_line_buffer_obtain(w);
+           if (!alpha_buf)
+             {
+               evas_common_image_line_buffer_release(argb_buf);
+               return;
+             }
+           bfunc = evas_common_gfx_func_composite_pixel_mask_span_get(argb_buf, dst, w, dc->render_op);
+         }
+       else
+          bfunc = evas_common_gfx_func_composite_pixel_span_get(argb_buf, dst, w, dc->render_op);
+     }
+
+   gfunc = gr->type.geometer->get_fill_func(gr, dc->render_op);
+   gdata = gr->type.gdata;
+   if (!gdata)
+     {
+       if (!direct_copy)
+         {
+           evas_common_image_line_buffer_release(argb_buf);
+           if (alpha_buf)
+               evas_common_image_alpha_line_buffer_release(alpha_buf);
+         }
+       return;
+     }
+
+   map = gr->map.data;
+   len = gr->map.len;
+   pdst = dst->image.data + (y * dst->cache_entry.w) + x;
+   dst_end = pdst + (h * dst->cache_entry.w);
+   if (!direct_copy)
+     {
+       buf = argb_buf->image.data;
+       if (alpha_buf)
+          mask = (DATA8 *)alpha_buf->image.data;
+     }
+   else
+       buf = pdst;
+
+   while (pdst < dst_end)
+     {
+#ifdef EVAS_SLI
+       if ((y % dc->sli.h) == dc->sli.y)
+#endif
+         {
+            gfunc(map, len, buf, mask, w, xoff, yoff, gdata);
+            if (!direct_copy)
+              bfunc(buf, mask, 0, pdst, w);
+         }
+       buf += buf_step;
+       pdst += dst->cache_entry.w;
+       yoff++;
+#ifdef EVAS_SLI
+       y++;
+#endif
+     }
+
+   if (!direct_copy)
+     {
+       evas_common_image_line_buffer_release(argb_buf);
+       if (alpha_buf)
+          evas_common_image_alpha_line_buffer_release(alpha_buf);
+     }
+   evas_common_cpu_end_opt();
+}
+
+static void
+_evas_common_gradient2_stops_scale(RGBA_Gradient2 *gr)
+{
+   Eina_Inlist  *l;
+   RGBA_Gradient2_Color_Np_Stop  *gc, *gc_next;
+   double  scale;
+   int  len;
+
+   if (!gr || !gr->stops.stops) return;
+
+   scale = 1.0;
+   gc = (RGBA_Gradient2_Color_Np_Stop *)gr->stops.stops;
+   l = gr->stops.stops->next;
+   while (l)
+     {
+       double dp;
+
+       gc_next = (RGBA_Gradient2_Color_Np_Stop *)l;
+       dp = gc_next->pos - gc->pos;
+       if (dp > 0.000030517)
+           scale = MIN(scale, dp);
+       gc = gc_next;
+       l = l->next;
+    }
+
+   scale = 2.0 / scale;
+   len = 1;
+   gc = (RGBA_Gradient2_Color_Np_Stop *)gr->stops.stops;
+   l = gr->stops.stops->next;
+   while (l)
+     {
+       int dist;
+
+       gc_next = (RGBA_Gradient2_Color_Np_Stop *)l;
+       dist = 0.5 + (scale * (gc_next->pos - gc->pos));
+       if (dist < 1)
+          dist = 1;
+       len += dist;
+       gc->dist = dist;
+       gc = gc_next;
+       l = l->next;
+     }
+
+   if (len > 65535)
+       len = 65535;
+   gr->stops.len = len;
+}
+
+static void
+_evas_common_gradient2_map_argb(RGBA_Draw_Context *dc, RGBA_Gradient2 *gr, int len)
+{
+   if (!gr || !dc)
+       return;
+   if ((len < 1) || (len > 65535))
+     {
+       if (gr->map.data)
+          free(gr->map.data);
+       gr->map.data = NULL;
+       gr->map.len = 0;
+       return;
+     }
+   if ((len != gr->map.len) || (!gr->map.data))
+       gr->map.data = realloc(gr->map.data, len * sizeof(DATA32));
+   if (!gr->map.data)
+     { gr->map.len = 0; return; }
+   gr->map.len = len;
+   gr->map.has_alpha = gr->has_alpha;
+
+   if (!gr->stops.stops) return;
+
+   _evas_common_gradient2_stops_scale(gr);
+
+     {
+       Eina_Inlist  *lc;
+       RGBA_Gradient2_Color_Np_Stop  *gc, *gc_next;
+       DATA32  *pmap, *map_end;
+       DATA8   *pamap = NULL;
+       int   i, dii;
+       int   r, g, b, a;
+       int   next_r, next_g, next_b, next_a;
+       int   rr, drr, gg, dgg, bb, dbb, aa, daa;
+
+       gr->stops.cdata = realloc(gr->stops.cdata, gr->stops.len * sizeof(DATA32));
+       if (!gr->stops.cdata)  return;
+       pmap = gr->stops.cdata;  map_end = pmap + gr->stops.len;
+
+       if (gr->has_alpha)
+         {
+           gr->stops.adata = realloc(gr->stops.adata, gr->stops.len * sizeof(DATA8));
+           if (!gr->stops.adata)
+             { free(gr->stops.cdata);  gr->stops.cdata = NULL;  return; }
+           pamap = gr->stops.adata;
+         }
+
+       gc = (RGBA_Gradient2_Color_Np_Stop *)gr->stops.stops;
+       r = gc->r;  g = gc->g;  b = gc->b;  a = gc->a;
+       lc = gr->stops.stops->next;
+
+       while (pmap < map_end)
+         {
+           if (lc)
+             {
+               i = gc->dist;
+               dii = 65536 / i;
+               gc_next = (RGBA_Gradient2_Color_Np_Stop *)lc;
+               next_r = gc_next->r;  next_g = gc_next->g;  next_b = gc_next->b;  next_a = gc_next->a;
+               rr = r << 16;  drr = ((next_r - r) * dii);
+               gg = g << 16;  dgg = ((next_g - g) * dii);
+               bb = b << 16;  dbb = ((next_b - b) * dii);
+               aa = a << 16;  daa = ((next_a - a) * dii);
+               while (i--)
+                 {
+                   r = rr >> 16;  r += (rr - (r << 16)) >> 15;
+                   g = gg >> 16;  g += (gg - (g << 16)) >> 15;
+                   b = bb >> 16;  b += (bb - (b << 16)) >> 15;
+                   *pmap++ = 0xff000000 + RGB_JOIN(r,g,b);
+                   if (pamap)
+                     {
+                       a = aa >> 16;  a += (aa - (a << 16)) >> 15;
+                       *pamap++ = a;
+                       aa += daa;
+                     }
+                   rr += drr;  gg += dgg;  bb += dbb;
+                 }
+               gc = gc_next;
+               r = next_r;  g = next_g;  b = next_b;  a = next_a;
+               lc = lc->next;
+              }
+           else
+             {
+               *pmap++ = 0xff000000 + RGB_JOIN(gc->r,gc->g,gc->b);
+               if (pamap) *pamap++ = gc->a;
+             }
+         }
+     }
+
+   if (gr->stops.cdata && gr->stops.adata)
+     {
+       evas_common_scale_rgba_a8_span(gr->stops.cdata, gr->stops.adata, gr->stops.len,
+                                       dc->mul.col, gr->map.data, gr->map.len, 1);
+       return;
+     }
+
+   evas_common_scale_rgba_span(gr->stops.cdata, NULL, gr->stops.len,
+                               dc->mul.col, gr->map.data, gr->map.len, 1);
+   gr->map.has_alpha |= (!!(255 - (dc->mul.col >> 24)));
+}
+
+static void
+_evas_common_gradient2_map_ahsv(RGBA_Draw_Context *dc, RGBA_Gradient2 *gr, int len)
+{
+   if (!gr || !dc)
+       return;
+   if ((len < 1) || (len > 65535))
+     {
+       if (gr->map.data)
+          free(gr->map.data);
+       gr->map.data = NULL;
+       gr->map.len = 0;
+       return;
+     }
+   if ((len != gr->map.len) || (!gr->map.data))
+       gr->map.data = realloc(gr->map.data, len * sizeof(DATA32));
+   if (!gr->map.data)
+     { gr->map.len = 0; return; }
+   gr->map.len = len;
+   gr->map.has_alpha = gr->has_alpha;
+
+   if (!gr->stops.stops) return;
+
+   _evas_common_gradient2_stops_scale(gr);
+
+     {
+       Eina_Inlist  *lc;
+       RGBA_Gradient2_Color_Np_Stop  *gc, *gc_next;
+       DATA32  *pmap, *map_end;
+       DATA8   *pamap = NULL;
+       int   i, dii;
+       int   h, s, v;
+       int   next_h, next_s, next_v;
+       int   hh, dhh, ss, dss, vv, dvv, aa, daa;
+       int   r, g, b, a;
+       int   next_r, next_g, next_b, next_a;
+
+       gr->stops.cdata = realloc(gr->stops.cdata, gr->stops.len * sizeof(DATA32));
+       if (!gr->stops.cdata)  return;
+       pmap = gr->stops.cdata;  map_end = pmap + gr->stops.len;
+
+       if (gr->has_alpha)
+         {
+           gr->stops.adata = realloc(gr->stops.adata, gr->stops.len * sizeof(DATA8));
+           if (!gr->stops.adata)
+             { free(gr->stops.cdata);  gr->stops.cdata = NULL;  return; }
+           pamap = gr->stops.adata;
+         }
+
+       gc = (RGBA_Gradient2_Color_Np_Stop *)gr->stops.stops;
+       r = gc->r;  g = gc->g;  b = gc->b;  a = gc->a;
+       evas_common_convert_color_rgb_to_hsv_int(r, g, b, &h, &s, &v);
+       lc = gr->stops.stops->next;
+
+       while (pmap < map_end)
+         {
+           if (lc)
+             {
+               i = gc->dist;
+               dii = 65536 / i;
+               gc_next = (RGBA_Gradient2_Color_Np_Stop *)lc;
+
+               next_r = gc_next->r;  next_g = gc_next->g;  next_b = gc_next->b;  next_a = gc_next->a;
+               evas_common_convert_color_rgb_to_hsv_int(next_r, next_g, next_b,
+                                                        &next_h, &next_s, &next_v);
+               hh = h << 16;  dhh = ((next_h - h) * dii);
+               ss = s << 16;  dss = ((next_s - s) * dii);
+               vv = v << 16;  dvv = ((next_v - v) * dii);
+               aa = a << 16;  daa = ((next_a - a) * dii);
+               while (i--)
+                 {
+                   h = hh >> 16;  h += (hh - (h << 16)) >> 15;
+                   s = ss >> 16;  s += (ss - (s << 16)) >> 15;
+                   v = vv >> 16;  v += (vv - (v << 16)) >> 15;
+                   evas_common_convert_color_hsv_to_rgb_int(h, s, v, &r, &g, &b);
+                   *pmap++ = 0xff000000 + RGB_JOIN(r,g,b);
+                   if (pamap)
+                     {
+                       a = aa >> 16;  a += (aa - (a << 16)) >> 15;
+                       *pamap++ = a;
+                       aa += daa;
+                     }
+                   hh += dhh;  ss += dss;  vv += dvv;
+                 }
+               gc = gc_next;
+               h = next_h;  s = next_s;  v = next_v;  a = next_a;
+               lc = lc->next;
+              }
+           else
+             {
+               *pmap++ = 0xff000000 + RGB_JOIN(gc->r,gc->g,gc->b);
+               if (pamap) *pamap++ = gc->a;
+             }
+         }
+     }
+
+   if (gr->stops.cdata && gr->stops.adata)
+     {
+       evas_common_scale_hsva_a8_span(gr->stops.cdata, gr->stops.adata, gr->stops.len,
+                                          dc->mul.col, gr->map.data, gr->map.len, 1);
+       return;
+     }
+   evas_common_scale_hsva_span(gr->stops.cdata, NULL, gr->stops.len,
+                               dc->mul.col, gr->map.data, gr->map.len, 1);
+   gr->map.has_alpha |= (!!(255 - (dc->mul.col >> 24)));
+}
+
+EAPI void
+evas_common_gradient2_map(RGBA_Draw_Context *dc, RGBA_Gradient2 *gr, int len)
+{
+   if (!gr || !dc) return;
+   if (dc->interpolation.color_space == _EVAS_COLOR_SPACE_AHSV)
+     {
+       _evas_common_gradient2_map_ahsv(dc, gr, len);
+       return;
+     }
+   _evas_common_gradient2_map_argb(dc, gr, len);
+}
diff --git a/src/lib/engines/common/evas_gradient2_radial.c b/src/lib/engines/common/evas_gradient2_radial.c
new file mode 100644 (file)
index 0000000..5ea8d6b
--- /dev/null
@@ -0,0 +1,456 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include <math.h>
+
+#define RADIAL_EPSILON 0.000030517578125
+
+typedef struct _Radial_Data   Radial_Data;
+
+struct _Radial_Data
+{
+   int    axx, axy;
+   int    ayx, ayy;
+   float  cx, cy, rx, ry;
+   float  cx0, cy0;
+   int    len;
+};
+
+
+static void 
+radial_init(void);
+
+static void 
+radial_shutdown(void);
+
+static void 
+radial_init_geom(RGBA_Gradient2 *gr);
+
+static void 
+radial_update_geom(RGBA_Gradient2 *gr);
+
+static void 
+radial_free_geom(void *gdata);
+
+static int 
+radial_has_alpha(RGBA_Gradient2 *gr, int op);
+
+static int 
+radial_has_mask(RGBA_Gradient2 *gr, int op);
+
+static int 
+radial_get_map_len(RGBA_Gradient2 *gr);
+
+static Gfx_Func_Gradient2_Fill 
+radial_get_fill_func(RGBA_Gradient2 *gr, int op);
+
+static RGBA_Gradient2_Type  radial = {"radial", radial_init, radial_shutdown,
+                                     radial_init_geom,
+                                     radial_update_geom, radial_free_geom,
+                                     radial_has_alpha, radial_has_mask,
+                                     radial_get_map_len, radial_get_fill_func};
+
+
+EAPI RGBA_Gradient2_Type  *
+evas_common_gradient2_type_radial_get(void)
+{
+    return &radial;
+}
+
+EAPI RGBA_Gradient2 *
+evas_common_gradient2_radial_new(void)
+{
+   RGBA_Gradient2 *gr;
+
+   gr = calloc(1, sizeof(RGBA_Gradient2));
+   if (!gr) return NULL;
+   gr->references = 1;
+   gr->type.id = MAGIC_OBJ_GRADIENT_RADIAL;
+   gr->type.geometer = &radial;
+   radial_init_geom(gr);
+   return gr;
+}
+
+EAPI void
+evas_common_gradient2_radial_fill_set(RGBA_Gradient2 *gr, float cx, float cy, float rx, float ry)
+{
+   Radial_Data *radial_data;
+
+   if (!gr) return;
+   if (gr->type.id != MAGIC_OBJ_GRADIENT_RADIAL) return;
+   if (gr->type.geometer != &radial) return;
+   radial_data = (Radial_Data *)gr->type.gdata;
+   if (!radial_data) return;
+   if (rx < 0) rx = -rx;  if (ry < 0) ry = -ry;
+   radial_data->cx = cx;  radial_data->cy = cy;
+   radial_data->rx = 1 + rx;  radial_data->ry = 1 + ry;
+}
+
+
+/** internal functions **/
+
+static void
+radial_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                  int x, int y, void *params_data);
+
+static void
+radial_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                 int x, int y, void *params_data);
+
+static void
+radial_restrict_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                   int x, int y, void *params_data);
+
+static void
+radial_restrict_masked_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                          int x, int y, void *params_data);
+
+static void
+radial_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+              int x, int y, void *params_data);
+
+
+static void 
+radial_init(void)
+{
+}
+
+static void 
+radial_shutdown(void)
+{
+}
+
+static void 
+radial_free_geom(void *gdata)
+{
+   Radial_Data *data = (Radial_Data *)gdata;
+   if (data) free(data);
+}
+
+static void
+radial_init_geom(RGBA_Gradient2 *gr)
+{
+   Radial_Data   *radial_data;
+
+   if (!gr || (gr->type.geometer != &radial)) return;
+
+   radial_data = (Radial_Data *)gr->type.gdata;
+   if (!radial_data)
+     {
+       radial_data = calloc(1, sizeof(Radial_Data));
+       if (!radial_data)  return;
+       radial_data->cx = radial_data->cy = 0;
+       radial_data->rx = radial_data->ry = 0;
+       radial_data->axx = 65536;  radial_data->axy = 0;
+       radial_data->ayx = 0;  radial_data->ayy = 65536;
+       radial_data->len = 0;
+    }
+   gr->type.gdata = radial_data;
+}
+
+static void 
+radial_update_geom(RGBA_Gradient2 *gr)
+{
+   Radial_Data   *radial_data;
+   double f, flen;
+   double  fx1, fy1;
+   int len;
+
+   if (!gr || (gr->type.geometer != &radial)) return;
+
+   radial_data = (Radial_Data *)gr->type.gdata;
+   if (!radial_data) return;
+
+   if ((radial_data->rx < RADIAL_EPSILON) || (radial_data->ry < RADIAL_EPSILON)) return;
+
+   radial_data->len = 0;
+   f = (gr->fill.transform.mxx * (double)gr->fill.transform.myy) - (gr->fill.transform.mxy * (double)gr->fill.transform.myx);
+   if (fabs(f) < RADIAL_EPSILON) return;
+
+   f = 1.0 / f;
+   radial_data->cx0 = (((gr->fill.transform.myy * (double)radial_data->cx) - (gr->fill.transform.mxy * (double)radial_data->cy)) * f) - gr->fill.transform.mxz;
+   radial_data->cy0 = ((-(gr->fill.transform.myx * (double)radial_data->cx) + (gr->fill.transform.mxx * (double)radial_data->cy)) * f) - gr->fill.transform.myz;
+
+   fx1 = (gr->fill.transform.myy * (double)radial_data->rx) * f;
+   fy1 = (gr->fill.transform.myx * (double)radial_data->rx) * f;
+
+   flen = hypot(fx1, fy1);
+
+   fx1 = (gr->fill.transform.mxy * (double)radial_data->ry) * f;
+   fy1 = (gr->fill.transform.mxx * (double)radial_data->ry) * f;
+
+   flen = sqrt(flen * hypot(fx1, fy1));
+
+   radial_data->len = len = flen + 0.5;
+   if (!len) return;
+
+   radial_data->axx = (((double)gr->fill.transform.mxx * 65536) * flen) / radial_data->rx;
+   radial_data->axy = (((double)gr->fill.transform.mxy * 65536) * flen) / radial_data->rx;
+
+   radial_data->ayx = (((double)gr->fill.transform.myx * 65536) * flen) / radial_data->ry;
+   radial_data->ayy = (((double)gr->fill.transform.myy * 65536) * flen) / radial_data->ry;
+}
+
+static int
+radial_has_alpha(RGBA_Gradient2 *gr, int op)
+{
+   Radial_Data   *radial_data;
+
+   if (!gr || (gr->type.geometer != &radial)) return 0;
+   if (gr->has_alpha | gr->map.has_alpha)
+       return 1;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || 
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+       return 0;
+   radial_data = (Radial_Data *)gr->type.gdata;
+   if (!radial_data) return 0;
+   if (gr->fill.spread == _EVAS_TEXTURE_RESTRICT)
+       return 1;
+   return 0;
+}
+
+static int
+radial_has_mask(RGBA_Gradient2 *gr, int op)
+{
+   Radial_Data   *radial_data;
+
+   if (!gr || (gr->type.geometer != &radial)) return 0;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || 
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+     {
+       radial_data = (Radial_Data *)gr->type.gdata;
+       if (!radial_data) return 0;
+       if (gr->fill.spread == _EVAS_TEXTURE_RESTRICT)
+           return 1;
+     }
+   return 0;
+}
+
+static int
+radial_get_map_len(RGBA_Gradient2 *gr)
+{
+   Radial_Data   *radial_data;
+
+   if (!gr || (gr->type.geometer != &radial)) return 0;
+   radial_data = (Radial_Data *)gr->type.gdata;
+   if (!radial_data) return 0;
+   return radial_data->len;
+}
+
+static Gfx_Func_Gradient2_Fill
+radial_get_fill_func(RGBA_Gradient2 *gr, int op)
+{
+   Radial_Data   *radial_data;
+   Gfx_Func_Gradient2_Fill  sfunc = NULL;
+   int masked_op = 0;
+
+   if (!gr || (gr->type.geometer != &radial)) return sfunc;
+   radial_data = (Radial_Data *)gr->type.gdata;
+   if (!radial_data) return sfunc;
+
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || 
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+       masked_op = 1;
+
+   switch (gr->fill.spread)
+     {
+      case _EVAS_TEXTURE_REPEAT:
+       sfunc = radial_repeat_aa;
+      break;
+      case _EVAS_TEXTURE_REFLECT:
+       sfunc = radial_reflect_aa;
+      break;
+      case _EVAS_TEXTURE_RESTRICT:
+       if (masked_op)
+          sfunc = radial_restrict_masked_aa;
+       else
+          sfunc = radial_restrict_aa;
+      break;
+      case _EVAS_TEXTURE_PAD:
+       sfunc = radial_pad_aa;
+      break;
+      default:
+       sfunc = radial_repeat_aa;
+      break;
+     }
+   return sfunc;
+}
+
+
+static void
+radial_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                 int x, int y, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy;
+
+   evas_common_cpu_end_opt();
+   xx = (gdata->axx * (x - gdata->cx0 + 0.5)) + (gdata->axy * (y - gdata->cy0 + 0.5));
+   yy = (gdata->ayx * (x - gdata->cx0 + 0.5)) + (gdata->ayy * (y - gdata->cy0 + 0.5));
+
+   while (dst < dst_end)
+     {
+       unsigned int  ll = hypot(xx, yy);
+       unsigned int  l = (ll >> 16);
+       int  a = 1 + ((ll & 0xffff) >> 8);
+
+       if (l >= src_len)
+           l = l % src_len;
+       *dst = src[l];
+       if (l + 1 < src_len)
+         {
+           *dst = INTERP_256(a, src[l + 1], *dst);
+         }
+       if (l == (src_len - 1))
+         {
+           *dst = INTERP_256(a, src[0], *dst);
+         }
+       dst++;  xx += gdata->axx;  yy += gdata->ayx;
+     }
+}
+
+
+static void
+radial_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                  int x, int y, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy;
+
+   evas_common_cpu_end_opt();
+   xx = (gdata->axx * (x - gdata->cx0 + 0.5)) + (gdata->axy * (y - gdata->cy0 + 0.5));
+   yy = (gdata->ayx * (x - gdata->cx0 + 0.5)) + (gdata->ayy * (y - gdata->cy0 + 0.5));
+
+   while (dst < dst_end)
+     {
+       unsigned int  ll = hypot(xx, yy);
+       unsigned int  l = (ll >> 16);
+       int  a = 1 + ((ll & 0xffff) >> 8);
+
+       if (l >= src_len)
+         {
+           int  m = (l % (2 * src_len));
+
+           l = (l % src_len);
+           if (m >= src_len)
+             { l = src_len - l - 1;  a = 257 - a; }
+         }
+       *dst = src[l];
+       if (l + 1 < src_len)
+           *dst = INTERP_256(a, src[l + 1], *dst);
+
+       dst++;  xx += gdata->axx;  yy += gdata->ayx;
+     }
+}
+
+
+static void
+radial_restrict_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                   int x, int y, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy;
+
+   evas_common_cpu_end_opt();
+   xx = (gdata->axx * (x - gdata->cx0 + 0.5)) + (gdata->axy * (y - gdata->cy0 + 0.5));
+   yy = (gdata->ayx * (x - gdata->cx0 + 0.5)) + (gdata->ayy * (y - gdata->cy0 + 0.5));
+
+   while (dst < dst_end)
+     {
+       unsigned int  ll = hypot(xx, yy);
+       unsigned int  l = (ll >> 16);
+
+       *dst = 0;
+       if (l < src_len)
+         {
+           int a = 1 + ((ll & 0xffff) >> 8);
+
+           *dst = src[l];
+           if (l + 1 < src_len)
+               *dst = INTERP_256(a, src[l + 1], *dst);
+           if (l == (src_len - 1))
+             {
+               *dst = INTERP_256(a, src[0], *dst);
+               *dst = MUL_256(257 - a, *dst);
+             }
+         }
+       dst++;  xx += gdata->axx;  yy += gdata->ayx;
+     }
+}
+
+
+static void
+radial_restrict_masked_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                          int x, int y, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy;
+
+   evas_common_cpu_end_opt();
+   xx = (gdata->axx * (x - gdata->cx0 + 0.5)) + (gdata->axy * (y - gdata->cy0 + 0.5));
+   yy = (gdata->ayx * (x - gdata->cx0 + 0.5)) + (gdata->ayy * (y - gdata->cy0 + 0.5));
+
+   while (dst < dst_end)
+     {
+       unsigned int  ll = hypot(xx, yy);
+       unsigned int  l = (ll >> 16);
+
+       *dst = 0;  *mask = 0;
+       if (l < src_len)
+         {
+           int a = 1 + ((ll & 0xffff) >> 8);
+
+           *dst = src[l];  *mask = 255;
+           if (l + 1 < src_len)
+               *dst = INTERP_256(a, src[l + 1], *dst);
+           if (l == (src_len - 1))
+             {
+               *dst = INTERP_256(a, src[0], *dst);
+               *mask = 256 - a;
+             }
+         }
+       dst++;  mask++;  xx += gdata->axx;  yy += gdata->ayx;
+     }
+}
+
+
+static void
+radial_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+              int x, int y, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy;
+
+   evas_common_cpu_end_opt();
+   xx = (gdata->axx * (x - gdata->cx0 + 0.5)) + (gdata->axy * (y - gdata->cy0 + 0.5));
+   yy = (gdata->ayx * (x - gdata->cx0 + 0.5)) + (gdata->ayy * (y - gdata->cy0 + 0.5));
+
+   while (dst < dst_end)
+     {
+       unsigned int  ll = hypot(xx, yy);
+       unsigned int  l = (ll >> 16);
+
+       *dst = 0;
+       if (l < src_len)
+         {
+           int a = 1 + ((ll & 0xffff) >> 8);
+
+           *dst = src[l];
+           if (l + 1 < src_len)
+               *dst = INTERP_256(a, src[l + 1], src[l]);
+         }
+        if (l == 0)
+          {
+            *dst = src[0];
+          }
+        if (l >= src_len)
+          {
+            *dst = src[src_len - 1];
+          }
+       dst++;  xx += gdata->axx;  yy += gdata->ayx;
+     }
+}
diff --git a/src/lib/engines/common/evas_gradient_angular.c b/src/lib/engines/common/evas_gradient_angular.c
new file mode 100644 (file)
index 0000000..49a62d8
--- /dev/null
@@ -0,0 +1,1899 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include <math.h>
+
+#include "evas_common.h"
+#include "evas_gradient_private.h"
+
+typedef struct _Angular_Data   Angular_Data;
+struct _Angular_Data
+{
+   float  an, cy;
+
+   int    sx, sy, s;
+   float  off;
+   int    len;
+};
+
+static void
+angular_init(void);
+
+static void
+angular_shutdown(void);
+
+static void
+angular_init_geom(RGBA_Gradient *gr);
+
+static void
+angular_setup_geom(RGBA_Gradient *gr);
+
+static void
+angular_free_geom(void *gdata);
+
+static int
+angular_has_alpha(RGBA_Gradient *gr, int op);
+
+static int
+angular_has_mask(RGBA_Gradient *gr, int op);
+
+static int
+angular_get_map_len(RGBA_Gradient *gr);
+
+static Gfx_Func_Gradient_Fill
+angular_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa);
+
+static RGBA_Gradient_Type  angular = {"angular", angular_init, angular_shutdown,
+                                     angular_init_geom, angular_setup_geom, angular_free_geom,
+                                     angular_has_alpha, angular_has_mask,
+                                     angular_get_map_len, angular_get_fill_func};
+
+
+/** internal functions **/
+
+static void
+angular_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_reflect_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                        int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_reflect_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_reflect_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_reflect_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_repeat_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_repeat_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                          int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_repeat_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_repeat_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                         int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                            int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_reflect_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_reflect_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                    int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_reflect_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                        int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_reflect_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                         int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_repeat_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_repeat_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_repeat_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_restrict_repeat_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                          int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+            int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_pad_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                    int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_pad_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_pad_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+angular_pad_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+
+
+RGBA_Gradient_Type  *
+evas_common_gradient_angular_get(void)
+{
+    return &angular;
+}
+
+static void
+angular_init(void)
+{
+}
+
+static void
+angular_shutdown(void)
+{
+}
+
+static void
+angular_free_geom(void *gdata)
+{
+   Angular_Data *data = (Angular_Data *)gdata;
+   if (data) free(data);
+}
+
+static void
+angular_setup_geom(RGBA_Gradient *gr)
+{
+   Angular_Data   *angular_data;
+
+   if (!gr || (gr->type.geometer != &angular)) return;
+
+   angular_data = (Angular_Data *)gr->type.gdata;
+   if (!angular_data) return;
+   angular_data->sx = gr->fill.w;
+   angular_data->sy = gr->fill.h;
+   angular_data->s = angular_data->sx;
+   if (angular_data->sy > angular_data->sx)
+       angular_data->s = angular_data->sy;
+   angular_data->off = gr->map.offset;
+   angular_data->len = (2 * M_PI) * angular_data->s * angular_data->cy;
+}
+
+static void
+angular_init_geom(RGBA_Gradient *gr)
+{
+   Angular_Data   *angular_data;
+   int    err = 1;
+   char   *s, *p, key[256];
+   float  val, an, cy;
+
+   if (!gr || (gr->type.geometer != &angular)) return;
+
+   angular_data = (Angular_Data *)gr->type.gdata;
+   if (!angular_data)
+     {
+       angular_data = calloc(1, sizeof(Angular_Data));
+       if (!angular_data)  return;
+       angular_data->an = -1.0;
+       angular_data->cy = 1.0;
+       angular_data->sx = 32;
+       angular_data->sy = 32;
+       angular_data->s = 32;
+       angular_data->off = 0.0;
+       angular_data->len = (2 * M_PI) * 32;
+     }
+   gr->type.gdata = angular_data;
+   if (!gr->type.params || !*(gr->type.params))
+       return;
+
+   s = strdup(gr->type.params);
+   if (!s) return;
+
+   an = angular_data->an;
+   cy = angular_data->cy;
+   p = s;
+   while ((p = evas_common_gradient_get_key_fval(p, key, &val)))
+     {
+       if (!strcmp(key, "annulus"))
+         {
+           err = 0;
+           an = val;
+         }
+       else if (!strcmp(key, "wrap"))
+         {
+           err = 0;
+           cy = val;
+         }
+       else
+         {
+           err = 1;
+           break;
+         }
+     }
+   if (!err)
+     {
+       if (an < 0.0) an = 0.0;
+       if (an > 1.0) an = 1.0;
+       angular_data->an = an;
+       if (cy < 0.0) cy = 0.0;
+       if (cy > 1.0) cy = 1.0;
+       angular_data->cy = cy;
+     }
+   free(s);
+}
+
+
+static int
+angular_has_alpha(RGBA_Gradient *gr, int op)
+{
+   Angular_Data   *angular_data;
+
+   if (!gr || (gr->type.geometer != &angular)) return 0;
+
+   if (gr->has_alpha | gr->map.has_alpha)
+       return 1;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+       return 0;
+   angular_data = (Angular_Data *)gr->type.gdata;
+   if (!angular_data)  return 0;
+   if ((int)angular_data->an >= 0)
+       return 1;
+   if ( ((gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
+         (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
+         (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT))
+        && (angular_data->cy < 1.0) )
+       return 1;
+   return 0;
+}
+
+static int
+angular_has_mask(RGBA_Gradient *gr, int op)
+{
+   Angular_Data   *angular_data;
+
+   if (!gr || (gr->type.geometer != &angular)) return 0;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+     {
+       angular_data = (Angular_Data *)gr->type.gdata;
+       if (!angular_data)  return 0;
+       if ((int)angular_data->an >= 0)
+           return 1;
+       if ( ((gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
+             (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
+             (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT))
+             && (angular_data->cy < 1.0) )
+           return 1;
+     }
+   return 0;
+}
+
+static int
+angular_get_map_len(RGBA_Gradient *gr)
+{
+   Angular_Data   *angular_data;
+
+   if (!gr || (gr->type.geometer != &angular)) return 0;
+   angular_data = (Angular_Data *)gr->type.gdata;
+   if (!angular_data)  return 0;
+   return angular_data->len;
+}
+
+static Gfx_Func_Gradient_Fill
+angular_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa)
+{
+   Gfx_Func_Gradient_Fill  sfunc = NULL;
+   int masked_op = 0;
+   Angular_Data   *angular_data;
+
+   if (!gr || (gr->type.geometer != &angular)) return sfunc;
+   angular_data = (Angular_Data *)gr->type.gdata;
+   if (!angular_data)  return sfunc;
+
+   angular_data->off = gr->map.offset;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+       masked_op = 1;
+
+   switch (gr->fill.spread)
+     {
+      case _EVAS_TEXTURE_REFLECT:
+       {
+        if (aa)
+          {
+           if ((int)angular_data->an >= 0)
+             {
+               if (masked_op)
+                  sfunc = angular_reflect_aa_masked_annulus;
+               else
+                  sfunc = angular_reflect_aa_annulus;
+             }
+           else
+              sfunc = angular_reflect_aa;
+          }
+        else
+          {
+           if ((int)angular_data->an >= 0)
+             {
+               if (masked_op)
+                  sfunc = angular_reflect_masked_annulus;
+               else
+                  sfunc = angular_reflect_annulus;
+             }
+           else
+              sfunc = angular_reflect;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_REPEAT:
+       {
+        if (aa)
+          {
+           if ((int)angular_data->an >= 0)
+             {
+               if (masked_op)
+                  sfunc = angular_repeat_aa_masked_annulus;
+               else
+                  sfunc = angular_repeat_aa_annulus;
+             }
+           else
+              sfunc = angular_repeat_aa;
+          }
+        else
+          {
+           if ((int)angular_data->an >= 0)
+             {
+               if (masked_op)
+                  sfunc = angular_repeat_masked_annulus;
+               else
+                  sfunc = angular_repeat_annulus;
+             }
+           else
+              sfunc = angular_repeat;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_RESTRICT:
+        angular_data->off = 0;
+      case _EVAS_TEXTURE_RESTRICT_REFLECT:
+       {
+        if (aa)
+          {
+           if ((int)angular_data->an >= 0)
+             {
+               if (masked_op)
+                  sfunc = angular_restrict_reflect_aa_masked_annulus;
+               else
+                  sfunc = angular_restrict_reflect_aa_annulus;
+             }
+           else if (angular_data->cy < 1.0)
+             {
+               if (masked_op)
+                  sfunc = angular_restrict_reflect_aa_masked;
+               else
+                  sfunc = angular_restrict_reflect_aa;
+             }
+           else
+              sfunc = angular_restrict_reflect_aa;
+          }
+        else
+          {
+           if ((int)angular_data->an >= 0)
+             {
+               if (masked_op)
+                  sfunc = angular_restrict_reflect_masked_annulus;
+               else
+                  sfunc = angular_restrict_reflect_annulus;
+             }
+           else if (angular_data->cy < 1.0)
+             {
+               if (masked_op)
+                  sfunc = angular_restrict_reflect_masked;
+               else
+                  sfunc = angular_restrict_reflect;
+             }
+           else
+              sfunc = angular_restrict_reflect;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_RESTRICT_REPEAT:
+       {
+        if (aa)
+          {
+           if ((int)angular_data->an >= 0)
+             {
+               if (masked_op)
+                  sfunc = angular_restrict_repeat_aa_masked_annulus;
+               else
+                  sfunc = angular_restrict_repeat_aa_annulus;
+             }
+           else if (angular_data->cy < 1.0)
+             {
+               if (masked_op)
+                  sfunc = angular_restrict_repeat_aa_masked;
+               else
+                  sfunc = angular_restrict_repeat_aa;
+             }
+           else
+              sfunc = angular_restrict_repeat_aa;
+          }
+        else
+          {
+           if ((int)angular_data->an >= 0)
+             {
+               if (masked_op)
+                  sfunc = angular_restrict_repeat_masked_annulus;
+               else
+                  sfunc = angular_restrict_repeat_annulus;
+             }
+           else if (angular_data->cy < 1.0)
+             {
+               if (masked_op)
+                  sfunc = angular_restrict_repeat_masked;
+               else
+                  sfunc = angular_restrict_repeat;
+             }
+           else
+              sfunc = angular_restrict_repeat;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_PAD:
+       {
+        if (aa)
+          {
+           if ((int)angular_data->an >= 0)
+             {
+               if (masked_op)
+                  sfunc = angular_pad_aa_masked_annulus;
+               else
+                  sfunc = angular_pad_aa_annulus;
+             }
+           else
+              sfunc = angular_pad_aa;
+          }
+        else
+          {
+           if ((int)angular_data->an >= 0)
+             {
+               if (masked_op)
+                  sfunc = angular_pad_masked_annulus;
+               else
+                  sfunc = angular_pad_annulus;
+             }
+           else
+              sfunc = angular_pad;
+          }
+       }
+      default:
+       sfunc = angular_reflect_aa;
+      break;
+     }
+   return sfunc;
+}
+
+#define SETUP_ANGULAR_FILL \
+   if (gdata->sx != gdata->s) \
+     { \
+       axx = (gdata->s * axx) / gdata->sx; \
+       axy = (gdata->s * axy) / gdata->sx; \
+     } \
+   if (gdata->sy != gdata->s) \
+     { \
+       ayy = (gdata->s * ayy) / gdata->sy; \
+       ayx = (gdata->s * ayx) / gdata->sy; \
+     } \
+   xx = (axx * x) + (axy * y); \
+   yy = (ayx * x) + (ayy * y);
+
+
+static void
+angular_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = ss * (M_PI + atan2(yy, xx));
+       int  l = (ll >> 16);
+
+       l += ((ll - (l << 16)) >> 15) + off;
+       if (l < 0) l = -l;
+       if (l >= src_len)
+         {
+           int  m = (l % (2 * src_len));
+
+           l = (l % src_len);
+           if (m >= src_len)
+               l = src_len - l - 1;
+         }
+       *dst = src[l];
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = ss * (M_PI + atan2(yy, xx));
+       int  l = (ll >> 16), lp;
+       DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+       lp = l + off;
+       if (lp < 0) { lp = -lp;  a = 257 - a; }
+       if (lp >= src_len)
+         {
+           int  m = (lp % (2 * src_len));
+
+           lp = (lp % src_len);
+           if (m >= src_len)
+               { lp = src_len - lp - 1;  a = 257 - a; }
+         }
+       *dst = src[lp];
+       if (lp + 1 < src_len)
+          *dst = INTERP_256(a, src[lp + 1], *dst);
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_reflect_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                        int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;
+       if ((r >= r0) && (r <= r1))
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx));
+           int  l = (ll >> 16);
+
+           l += ((ll - (l << 16)) >> 15) + off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                   l = src_len - l - 1;
+             }
+           *dst = src[l];
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_reflect_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   int     rr0 = r0 << 16, rr1 = r1 << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;
+       if ((r >= r0) && (r <= r1))
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx));
+           int  l = (ll >> 16), lp;
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+           lp = l + off;
+           if (lp < 0) { lp = -lp;  a = 257 - a; }
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                 { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+           *dst = src[lp];
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (r == r0)
+             {
+               a = 1 + ((rr - rr0) >> 8);
+               *dst = MUL_256(a, *dst);
+             }
+           if (r == r1)
+             {
+               a = 256 - ((rr - rr1) >> 8);
+               *dst = MUL_256(a, *dst);
+             }
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_reflect_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;  *mask = 0;
+       if ((r >= r0) && (r <= r1))
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx)), l = ll >> 16;
+
+           l += ((ll - (l << 16)) >> 15) + off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                   l = src_len - l - 1;
+             }
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_reflect_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   int     rr0 = r0 << 16, rr1 = r1 << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;  *mask = 0;
+       if ((r >= r0) && (r <= r1))
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx));
+           int  l = (ll >> 16), lp;
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+           lp = l + off;
+           if (lp < 0) { lp = -lp;  a = 257 - a; }
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                 { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+           *dst = src[lp];  *mask = 255;
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (r == r0)
+               *mask = ((rr - rr0) >> 8);
+           if (r == r1)
+               *mask = 255 - ((rr - rr1) >> 8);
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = ss * (M_PI + atan2(yy, xx));
+       int  l = ll >> 16;
+
+       l += ((ll - (l << 16)) >> 15) + off;
+       l = l % src_len;
+       if (l < 0)
+          l += src_len;
+       *dst = src[l];
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = ss * (M_PI + atan2(yy, xx));
+       int  l = (ll >> 16), lp;
+       DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+       lp = l + off;
+       lp = lp % src_len;
+       if (lp < 0)
+          lp += src_len;
+       *dst = src[lp];
+       if (lp + 1 < src_len)
+          *dst = INTERP_256(a, src[lp + 1], *dst);
+       if (lp == (src_len - 1))
+          *dst = INTERP_256(a, src[0], *dst);
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_repeat_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;
+       if ((r >= r0) && (r <= r1))
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx));
+           int  l = ll >> 16;
+
+           l += ((ll - (l << 16)) >> 15) + off;
+           l = l % src_len;
+           if (l < 0)
+               l += src_len;
+          *dst = src[l];
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_repeat_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                          int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   int     rr0 = r0 << 16, rr1 = r1 << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;
+       if ((r >= r0) && (r <= r1))
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx));
+           int  l = ll >> 16, lp;
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+           lp = l + off;
+           lp = lp % src_len;
+           if (lp < 0)
+               lp += src_len;
+           *dst = src[lp];
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (lp == (src_len - 1))
+               *dst = INTERP_256(a, src[0], *dst);
+           if (r == r0)
+             {
+               a = 1 + ((rr - rr0) >> 8);
+               *dst = MUL_256(a, *dst);
+             }
+           if (r == r1)
+             {
+               a = 256 - ((rr - rr1) >> 8);
+               *dst = MUL_256(a, *dst);
+             }
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_repeat_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;  *mask = 0;
+       if ((r >= r0) && (r <= r1))
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx));
+           int  l = ll >> 16;
+
+           l += ((ll - (l << 16)) >> 15) + off;
+           l = l % src_len;
+           if (l < 0)
+               l += src_len;
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_repeat_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   int     rr0 = r0 << 16, rr1 = r1 << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;  *mask = 0;
+       if ((r >= r0) && (r <= r1))
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx));
+           int  l = ll >> 16, lp;
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+           lp = l + off;
+           lp = lp % src_len;
+           if (lp < 0)
+               lp += src_len;
+           *dst = src[lp];  *mask = 255;
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (lp == (src_len - 1))
+               *dst = INTERP_256(a, src[0], *dst);
+           if (r == r0)
+               *mask = ((rr - rr0) >> 8);
+           if (r == r1)
+               *mask = 255 - ((rr - rr1) >> 8);
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                         int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = ss * (M_PI + atan2(yy, xx));
+       int  l = ll >> 16;
+
+       *dst = 0;
+       l += ((ll - (l << 16)) >> 15);
+       if (l < src_len)
+         {
+           l += off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                  l = src_len - l - 1;
+             }
+           *dst = src[l];
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                            int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = ss * (M_PI + atan2(yy, xx));
+       int  l = ll >> 16, lp;
+
+       *dst = 0;
+       if (l < src_len)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a;
+
+           lp = l + off;
+           if (lp < 0) { lp = -lp;  a = 257 - a; }
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                 { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+           *dst = src[lp];
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (l == (src_len - 1))
+               *dst = MUL_256(257 - a0, *dst);
+           if (l == 0)
+               *dst = MUL_256(a0, *dst);
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = ss * (M_PI + atan2(yy, xx)), l = ll >> 16;
+
+       *dst = 0;  *mask = 0;
+       l += (ll - (l << 16)) >> 15;
+       if (l < src_len)
+         {
+           l += off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                  l = src_len - l - 1;
+             }
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = ss * (M_PI +  atan2(yy, xx));
+       int  l = ll >> 16, lp;
+
+       *dst = 0;  *mask = 0;
+       if (l < src_len)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1;
+
+           lp = l + off;
+           if (lp < 0) { lp = -lp;  a = 257 - a; }
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                 { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+           *dst = src[lp];  *mask = 255;
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (l == (src_len - 1))
+               *mask = 255 - a0;
+           if (l == 0)
+               *mask = a0;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_reflect_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                                 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;
+       if ( (r >= r0) && (r <= r1) )
+         {
+           int  ll = ss * (M_PI +  atan2(yy, xx));
+           int  l = ll >> 16;
+
+           l += (ll - (l << 16)) >> 15;
+           if (l < src_len)
+             {
+               l += off;
+               if (l < 0) l = -l;
+               if (l >= src_len)
+                 {
+                   int  m = (l % (2 * src_len));
+
+                   l = (l % src_len);
+                   if (m >= src_len)
+                       l = src_len - l - 1;
+                 }
+               *dst = src[l];
+             }
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_reflect_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                                    int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   int     rr0 = r0 << 16, rr1 = r1 << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;
+       if ( (r >= r0) && (r <= r1) )
+         {
+          int  ll = ss * (M_PI + atan2(yy, xx));
+          int  l = ll >> 16, lp;
+
+          if (l < src_len)
+            {
+               DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a;
+
+               lp = l + off;
+               if (lp < 0) { lp = -lp;  a = 257 - a; }
+               if (lp >= src_len)
+                 {
+                   int  m = (lp % (2 * src_len));
+
+                   lp = (lp % src_len);
+                   if (m >= src_len)
+                       { lp = src_len - lp - 1;  a = 257 - a; }
+                 }
+              *dst = src[lp];
+              if (lp + 1 < src_len)
+                 *dst = INTERP_256(a, src[lp + 1], *dst);
+              if (l == (src_len - 1))
+                  *dst = MUL_256(257 - a0, *dst);
+              if (l == 0)
+                  *dst = MUL_256(a0, *dst);
+              if (r == r0)
+                {
+                  a = 1 + ((rr - rr0) >> 8);
+                  *dst = MUL_256(a, *dst);
+                }
+              if (r == r1)
+                {
+                  a = 256 - ((rr - rr1) >> 8);
+                  *dst = MUL_256(a, *dst);
+                }
+            }
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_reflect_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                        int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;  *mask = 0;
+       if ( (r >= r0) && (r <= r1) )
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx));
+           int  l = ll >> 16;
+
+           l += (ll - (l << 16)) >> 15;
+           if (l < src_len)
+             {
+               l += off;
+               if (l < 0) l = -l;
+               if (l >= src_len)
+                 {
+                   int  m = (l % (2 * src_len));
+
+                   l = (l % src_len);
+                   if (m >= src_len)
+                       l = src_len - l - 1;
+                 }
+               *dst = src[l];  *mask = 255;
+             }
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_reflect_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   int     rr0 = r0 << 16, rr1 = r1 << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;  *mask = 0;
+       if ( (r >= r0) && (r <= r1) )
+         {
+          int  ll = ss * (M_PI + atan2(yy, xx));
+          int  l = ll >> 16, lp;
+
+          if (l < src_len)
+            {
+               DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1;
+
+               lp = l + off;
+               if (lp < 0) { lp = -lp;  a = 257 - a; }
+               if (lp >= src_len)
+                 {
+                   int  m = (lp % (2 * src_len));
+
+                   lp = (lp % src_len);
+                   if (m >= src_len)
+                       { lp = src_len - lp - 1;  a = 257 - a; }
+                 }
+              *dst = src[lp];  *mask = 255;
+              if (lp + 1 < src_len)
+                 *dst = INTERP_256(a, src[lp + 1], *dst);
+              if (l == (src_len - 1))
+                  *mask = 255 - a0;
+              if (l == 0)
+                  *mask = a0;
+              if (r == r0)
+                  *mask = ((rr - rr0) >> 8);
+              if (r == r1)
+                  *mask = 255 - ((rr - rr1) >> 8);
+            }
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                         int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = ss * (M_PI + atan2(yy, xx));
+       int  l = ll >> 16;
+
+       *dst = 0;
+       l += ((ll - (l << 16)) >> 15);
+       if (l < src_len)
+         {
+           l += off;
+           l = l % src_len;
+           if (l < 0)
+               l += src_len;
+           *dst = src[l];
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                            int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = ss * (M_PI + atan2(yy, xx));
+       int  l = ll >> 16, lp;
+
+       *dst = 0;
+       if (l < src_len)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a;
+
+           lp = l + off;
+           lp = lp % src_len;
+           if (lp < 0)
+               lp += src_len;
+           *dst = src[lp];
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (lp == (src_len - 1))
+               *dst = INTERP_256(a, src[0], *dst);
+           if (l == (src_len - 1))
+               *dst = MUL_256(257 - a0, *dst);
+           if (l == 0)
+               *dst = MUL_256(a0, *dst);
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = ss * (M_PI + atan2(yy, xx)), l = ll >> 16;
+
+       *dst = 0;  *mask = 0;
+       l += (ll - (l << 16)) >> 15;
+       if (l < src_len)
+         {
+           l += off;
+           l = l % src_len;
+           if (l < 0)
+               l += src_len;
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = ss * (M_PI +  atan2(yy, xx));
+       int  l = ll >> 16, lp;
+
+       *dst = 0;  *mask = 0;
+       if (l < src_len)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1;
+
+           lp = l + off;
+           lp = lp % src_len;
+           if (lp < 0)
+               lp += src_len;
+           *dst = src[lp];  *mask = 255;
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (lp == (src_len - 1))
+               *dst = INTERP_256(a, src[0], *dst);
+           if (l == (src_len - 1))
+               *mask = 255 - a0;
+           if (l == 0)
+               *mask = a0;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_repeat_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                                 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;
+       if ( (r >= r0) && (r <= r1) )
+         {
+           int  ll = ss * (M_PI +  atan2(yy, xx));
+           int  l = ll >> 16;
+
+           l += (ll - (l << 16)) >> 15;
+           if (l < src_len)
+             {
+               l += off;
+               l = l % src_len;
+               if (l < 0)
+                  l += src_len;
+               *dst = src[l];
+             }
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_repeat_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                                    int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   int     rr0 = r0 << 16, rr1 = r1 << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;
+       if ( (r >= r0) && (r <= r1) )
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx));
+           int  l = ll >> 16, lp;
+
+           if (l < src_len)
+             {
+               DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a;
+
+               lp = l + off;
+               lp = lp % src_len;
+               if (lp < 0)
+                  lp += src_len;
+               *dst = src[lp];
+               if (lp + 1 < src_len)
+                  *dst = INTERP_256(a, src[lp + 1], *dst);
+               if (lp == (src_len - 1))
+                  *dst = INTERP_256(a, src[0], *dst);
+               if (l == (src_len - 1))
+                  *dst = MUL_256(257 - a0, *dst);
+               if (l == 0)
+                  *dst = MUL_256(a0, *dst);
+               if (r == r0)
+                 {
+                   a = 1 + ((rr - rr0) >> 8);
+                   *dst = MUL_256(a, *dst);
+                 }
+               if (r == r1)
+                 {
+                   a = 256 - ((rr - rr1) >> 8);
+                   *dst = MUL_256(a, *dst);
+                 }
+             }
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_repeat_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                        int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;  *mask = 0;
+       if ( (r >= r0) && (r <= r1) )
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx));
+           int  l = ll >> 16;
+
+           l += (ll - (l << 16)) >> 15;
+           if (l < src_len)
+             {
+               l += off;
+               l = l % src_len;
+               if (l < 0)
+                  l += src_len;
+               *dst = src[l];  *mask = 255;
+             }
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_restrict_repeat_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   int     rr0 = r0 << 16, rr1 = r1 << 16;
+   float   off = gdata->off * (src_len - 1);
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;  *mask = 0;
+       if ( (r >= r0) && (r <= r1) )
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx));
+           int  l = ll >> 16, lp;
+
+           if (l < src_len)
+             {
+               DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1;
+
+               lp = l + off;
+               lp = lp % src_len;
+               if (lp < 0)
+                  lp += src_len;
+               *dst = src[lp];  *mask = 255;
+               if (lp + 1 < src_len)
+                  *dst = INTERP_256(a, src[lp + 1], *dst);
+               if (lp == (src_len - 1))
+                  *dst = INTERP_256(a, src[0], *dst);
+               if (l == (src_len - 1))
+                  *mask = 255 - a0;
+               if (l == 0)
+                  *mask = a0;
+               if (r == r0)
+                  *mask = ((rr - rr0) >> 8);
+               if (r == r1)
+                  *mask = 255 - ((rr - rr1) >> 8);
+             }
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+            int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = ss * (M_PI +  atan2(yy, xx));
+       int  l = ll >> 16;
+
+       l += (ll - (l << 16)) >> 15;
+       if (l >= src_len)
+           l = src_len - 1;
+       *dst++ = src[l];  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = ss * (M_PI +  atan2(yy, xx));
+       int  l = ll >> 16;
+       DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+       if (l + 1 < src_len)
+          *dst = INTERP_256(a, src[l + 1], src[l]);
+       else
+          *dst = src[src_len - 1];
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_pad_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                    int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;
+       if ( (r >= r0) && (r <= r1) )
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx));
+           int  l = ll >> 16;
+
+           l += (ll - (l << 16)) >> 15;
+           if (l >= src_len)
+               l = src_len - 1;
+           *dst = src[l];
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_pad_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   int     rr0 = r0 << 16, rr1 = r1 << 16;
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;
+       if ( (r >= r0) && (r <= r1) )
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx));
+           int  l = ll >> 16;
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+           if (l + 1 < src_len)
+               *dst = INTERP_256(a, src[l + 1], src[l]);
+           else
+               *dst = src[src_len - 1];
+           if (r == r0)
+             {
+               a = 1 + ((rr - rr0) >> 8);
+               *dst = MUL_256(a, *dst);
+             }
+           if (r == r1)
+             {
+               a = 256 - ((rr - rr1) >> 8);
+               *dst = MUL_256(a, *dst);
+             }
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_pad_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;  *mask = 0;
+       if ( (r >= r0) && (r <= r1) )
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx));
+           int  l = ll >> 16;
+
+           l += (ll - (l << 16)) >> 15;
+           if (l >= src_len)
+               l = src_len - 1;
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+angular_pad_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Angular_Data  *gdata = (Angular_Data *)params_data;
+   int     xx, yy;
+   int     ss = (gdata->s) << 16;
+   int     r1 = gdata->s, r0 = gdata->an * r1;
+   int     rr0 = r0 << 16, rr1 = r1 << 16;
+
+   SETUP_ANGULAR_FILL
+
+   while (dst < dst_end)
+     {
+       int rr = hypot(xx, yy), r = (rr >> 16);
+
+       *dst = 0;  *mask = 0;
+       if ( (r >= r0) && (r <= r1) )
+         {
+           int  ll = ss * (M_PI + atan2(yy, xx));
+           int  l = ll >> 16;
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+           if (l + 1 < src_len)
+               *dst = INTERP_256(a, src[l + 1], src[l]);
+           else
+               *dst = src[src_len - 1];
+
+           *mask = 255;
+           if (r == r0)
+               *mask = ((rr - rr0) >> 8);
+           if (r == r1)
+               *mask = 255 - ((rr - rr1) >> 8);
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
diff --git a/src/lib/engines/common/evas_gradient_linear.c b/src/lib/engines/common/evas_gradient_linear.c
new file mode 100644 (file)
index 0000000..9655731
--- /dev/null
@@ -0,0 +1,1510 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include <math.h>
+
+#include "evas_common.h"
+#include "evas_gradient_private.h"
+
+#define GRAD_LINEAR_DIAG 1
+#define GRAD_LINEAR_CODIAG 2
+
+typedef struct _Linear_Data   Linear_Data;
+struct _Linear_Data
+{
+   int    type;
+
+   int    yy0;
+   float  ca, sa;
+   float  off;
+   int    len;
+
+   unsigned char at_angle : 1;
+};
+
+static void
+linear_init(void);
+
+static void
+linear_shutdown(void);
+
+static void
+linear_init_geom(RGBA_Gradient *gr);
+
+static void
+linear_setup_geom(RGBA_Gradient *gr);
+
+static void
+linear_free_geom(void *gdata);
+
+static int
+linear_has_alpha(RGBA_Gradient *gr, int op);
+
+static int
+linear_has_mask(RGBA_Gradient *gr, int op);
+
+static int
+linear_get_map_len(RGBA_Gradient *gr);
+
+static Gfx_Func_Gradient_Fill
+linear_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa);
+
+static RGBA_Gradient_Type  linear = {"linear", linear_init, linear_shutdown,
+                                    linear_init_geom, linear_setup_geom, linear_free_geom,
+                                    linear_has_alpha, linear_has_mask,
+                                    linear_get_map_len, linear_get_fill_func};
+
+
+
+/** internal functions **/
+static void
+linear_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_restrict(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_restrict_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_restrict_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_restrict_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                          int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                        int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                          int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+linear_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+
+
+RGBA_Gradient_Type  *
+evas_common_gradient_linear_get(void)
+{
+    return &linear;
+}
+
+static void
+linear_init(void)
+{
+}
+
+static void
+linear_shutdown(void)
+{
+}
+
+static void
+linear_free_geom(void *gdata)
+{
+   Linear_Data *data = (Linear_Data *)gdata;
+   if (data) free(data);
+}
+
+static void
+linear_init_geom(RGBA_Gradient *gr)
+{
+   Linear_Data *linear_data;
+
+   if (!gr || (gr->type.geometer != &linear)) return;
+   linear_data = (Linear_Data *)gr->type.gdata;
+   if (!linear_data)
+     {
+       linear_data = calloc(1, sizeof(Linear_Data));
+       if (!linear_data)  return;
+       linear_data->type = 0;
+       linear_data->yy0 = 0;
+       linear_data->ca = 1.0;
+       linear_data->sa = 0.0;
+       linear_data->off = 0.0;
+       linear_data->len = 32;
+       linear_data->at_angle = 0;
+       gr->type.gdata = linear_data;
+     }
+
+   linear_data->type = 0;
+   if (gr->type.name && !strcmp(gr->type.name, "linear.diag"))
+       linear_data->type = GRAD_LINEAR_DIAG;
+   else if (gr->type.name && !strcmp(gr->type.name, "linear.codiag"))
+       linear_data->type = GRAD_LINEAR_CODIAG;
+}
+
+static void
+linear_setup_geom(RGBA_Gradient *gr)
+{
+   Linear_Data *linear_data;
+   float  angle, a, ca, sa;
+   int    xoff = 0, yoff = 0;
+
+   if (!gr || (gr->type.geometer != &linear)) return;
+   linear_data = (Linear_Data *)gr->type.gdata;
+   if (!linear_data) return;
+
+   angle = gr->map.angle;
+   if (linear_data->type == GRAD_LINEAR_DIAG)
+       angle += ((atan2(gr->fill.h - 1, gr->fill.w - 1) * 180.0) / M_PI) - 90.0;
+   else if (linear_data->type == GRAD_LINEAR_CODIAG)
+       angle -= ((atan2(gr->fill.h - 1, gr->fill.w - 1) * 180.0) / M_PI) - 90.0;
+   a = ((angle + 90.0) * M_PI) / 180.0;
+   ca = cos(a);
+   sa = sin(a);
+   if ((sa >= 0) && (ca <= 0))
+     {
+       ca = -ca;
+       xoff = -(gr->fill.w - 1);
+     }
+   else if ((sa <= 0) && (ca <= 0))
+     {
+       ca = -ca;  sa = -sa;
+       xoff = -(gr->fill.w - 1);
+       yoff = -(gr->fill.h - 1);
+     }
+   else if ((sa <= 0) && (ca >= 0))
+     {
+       sa = -sa;
+       yoff = -(gr->fill.h - 1);
+     }
+   linear_data->len = 0.9961 + (ca * gr->fill.w) + (sa * gr->fill.h);
+
+   a = (angle * M_PI) / 180.0;
+   linear_data->ca = cos(a);
+   linear_data->sa = sin(a);
+
+   linear_data->yy0 = (linear_data->ca * (yoff << 16)) - (linear_data->sa * (xoff << 16));
+   linear_data->off = gr->map.offset;
+
+   if ((linear_data->ca != 1.0) || (linear_data->sa != 0.0))
+       linear_data->at_angle = 1;
+}
+
+static int
+linear_has_alpha(RGBA_Gradient *gr, int op)
+{
+   if (!gr || (gr->type.geometer != &linear)) return 0;
+   if (gr->has_alpha | gr->map.has_alpha)
+       return 1;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+       return 0;
+   if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
+         (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
+         (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) )
+       return 1;
+   return 0;
+}
+
+static int
+linear_has_mask(RGBA_Gradient *gr, int op)
+{
+   if (!gr || (gr->type.geometer != &linear)) return 0;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+     {
+       if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
+             (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
+             (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) )
+           return 1;
+     }
+   return 0;
+}
+
+static int
+linear_get_map_len(RGBA_Gradient *gr)
+{
+   Linear_Data   *linear_data;
+
+   if (!gr || (gr->type.geometer != &linear)) return 0;
+   linear_data = (Linear_Data *)gr->type.gdata;
+   if (!linear_data) return 0;
+   return linear_data->len;
+}
+
+static Gfx_Func_Gradient_Fill
+linear_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa)
+{
+   Linear_Data   *linear_data;
+   Gfx_Func_Gradient_Fill  sfunc = NULL;
+   int masked_op = 0;
+
+   if (!gr || (gr->type.geometer != &linear))
+       return sfunc;
+   linear_data = (Linear_Data *)gr->type.gdata;
+   if (!linear_data) return sfunc;
+
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+       masked_op = 1;
+
+   switch (gr->fill.spread)
+     {
+      case _EVAS_TEXTURE_REFLECT:
+       {
+        if (aa)
+              sfunc = linear_reflect_aa;
+        else
+              sfunc = linear_reflect;
+       }
+      break;
+      case _EVAS_TEXTURE_REPEAT:
+       {
+        if (aa)
+           sfunc = linear_repeat_aa;
+        else
+           sfunc = linear_repeat;
+       }
+      break;
+      case _EVAS_TEXTURE_RESTRICT:
+       {
+        if (aa)
+          {
+            if (masked_op)
+               sfunc = linear_restrict_aa_masked;
+            else
+               sfunc = linear_restrict_aa;
+          }
+        else
+          {
+            if (masked_op)
+               sfunc = linear_restrict_masked;
+            else
+               sfunc = linear_restrict;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_RESTRICT_REFLECT:
+       {
+        if (aa)
+          {
+            if (masked_op)
+               sfunc = linear_restrict_reflect_aa_masked;
+            else
+               sfunc = linear_restrict_reflect_aa;
+          }
+        else
+          {
+            if (masked_op)
+               sfunc = linear_restrict_reflect_masked;
+            else
+               sfunc = linear_restrict_reflect;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_RESTRICT_REPEAT:
+       {
+        if (aa)
+          {
+            if (masked_op)
+               sfunc = linear_restrict_repeat_aa_masked;
+            else
+               sfunc = linear_restrict_repeat_aa;
+          }
+        else
+          {
+            if (masked_op)
+               sfunc = linear_restrict_repeat_masked;
+            else
+               sfunc = linear_restrict_repeat;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_PAD:
+       {
+        if (aa)
+              sfunc = linear_pad_aa;
+        else
+              sfunc = linear_pad;
+       }
+      break;
+      default:
+       sfunc = linear_reflect_aa;
+      break;
+     }
+   return sfunc;
+}
+
+/* the fill functions */
+
+#ifdef BUILD_MMX
+#define INTERP_256_P2R(a, s, mma, mms, mmd, mmz) \
+           MOV_A2R(a, mma) \
+           MOV_P2R(s, mms, mmz) \
+           INTERP_256_R2R(mma, mms, mmd, mm5)
+
+#define MUL_256_A2R(a, mma, mmd, mmz) \
+       MOV_A2R(a, mma) \
+       MUL4_256_R2R(mma, mmd)
+#endif
+
+#define AXIS_ALIGNED \
+   ( ((ayy == 0) || (ayx == 0)) && ((gdata->ca == 0.0) || (gdata->sa == 0.0)) )
+
+#define SETUP_LINEAR_FILL \
+   if (gdata->at_angle) \
+     { \
+       ayx = (-gdata->sa * axx) + (gdata->ca * ayx); \
+       ayy = (-gdata->sa * axy) + (gdata->ca * ayy); \
+     } \
+   yy = (ayx * x) + (ayy * y) + gdata->yy0;
+
+
+static void
+linear_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      off = gdata->off * (src_len - 1);
+   int      yy;
+
+   SETUP_LINEAR_FILL
+
+   if (ayx == 0)
+     {
+       DATA32  c;
+
+       y = (yy >> 16) + off;
+       if (y < 0)  y = -y;
+       if (y >= src_len)
+         {
+           int  m = (y % (2 * src_len));
+
+           y = (y % src_len);
+           if (m >= src_len)
+               y = src_len - y - 1;
+         }
+       c = src[y];
+       while (dst < dst_end)
+           *dst++ = c;
+       return;
+     }
+
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       l += ((yy - (l << 16)) >> 15) + off;
+       if (l < 0)  l = -l;
+       if (l >= src_len)
+         {
+           int  m = (l % (2 * src_len));
+
+           l = (l % src_len);
+           if (m >= src_len)
+               l = src_len - l - 1;
+         }
+       *dst++ = src[l];  yy += ayx;
+     }
+}
+
+static void
+linear_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      off = gdata->off * (src_len - 1);
+   int      yy;
+
+   if (AXIS_ALIGNED)
+     {
+       linear_reflect(src, src_len, dst, mask, dst_len, x, y,
+                      axx, axy, ayx, ayy, params_data);
+       return;
+     }
+
+   SETUP_LINEAR_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+       int  a = 1 + ((yy - (l << 16)) >> 8);
+
+       l += off;
+       if (l < 0) { l = -l;  a = 257 - a; }
+       if (l >= src_len)
+         {
+           int  m = (l % (2 * src_len));
+
+           l = (l % src_len);
+           if (m >= src_len)
+             { l = src_len - l - 1;  a = 257 - a; }
+         }
+#ifdef BUILD_MMX
+       MOV_P2R(src[l], mm1, mm0)
+#else
+       *dst = src[l];
+#endif
+       if (l + 1 < src_len)
+         {
+#ifdef BUILD_MMX
+           INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0)
+#else
+           *dst = INTERP_256(a, src[l + 1], *dst);
+#endif
+         }
+#ifdef BUILD_MMX
+       MOV_R2P(mm1, *dst, mm0)
+#endif
+       dst++;  yy += ayx;
+     }
+}
+
+static void
+linear_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      off = gdata->off * (src_len - 1);
+   int      yy;
+
+   SETUP_LINEAR_FILL
+
+   if (ayx == 0)
+     {
+       DATA32  c;
+
+       y = (yy >> 16) + off;
+       y = y % src_len;
+       if (y < 0)
+          y += src_len;
+       c = src[y];
+       while (dst < dst_end)
+           *dst++ = c;
+       return;
+     }
+
+   if (ayy == 0)
+     {
+       Gfx_Func_Copy  func;
+       int  l;
+
+       x = (yy >> 16) + off;
+       x = x % src_len;
+       if (x < 0)
+          x += src_len;
+       if (ayx < 0)
+         {
+           l = x + 1;  x = 0;
+         }
+       else
+           l = src_len - x;
+       if (l > dst_len) l = dst_len;
+       func = evas_common_draw_func_copy_get(1, (ayx < 0 ? -1 : 0));
+       func(src + x, dst, l);
+       if (l == dst_len) return;
+       dst += l;  dst_len -= l;
+       l = dst_len / src_len;
+       while (l--)
+         {
+           func(src, dst, src_len);
+           dst += src_len;
+         }
+       l = dst_len % src_len;
+       if (ayx < 0)
+          src += src_len - l;
+       func(src, dst, l);
+       return;
+     }
+
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       l += ((yy - (l << 16)) >> 15) + off;
+       l = l % src_len;
+       if (l < 0)
+          l += src_len;
+       *dst++ = src[l];  yy += ayx;
+     }
+}
+
+static void
+linear_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      off = gdata->off * (src_len - 1);
+   int      yy;
+
+   if (AXIS_ALIGNED)
+     {
+       linear_repeat(src, src_len, dst, mask, dst_len, x, y,
+                     axx, axy, ayx, ayy, params_data);
+       return;
+     }
+
+   SETUP_LINEAR_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+       int  a = 1 + ((yy - (l << 16)) >> 8);
+
+       l += off;
+       l = l % src_len;
+       if (l < 0)
+          l += src_len;
+#ifdef BUILD_MMX
+       MOV_P2R(src[l], mm1, mm0)
+#else
+       *dst = src[l];
+#endif
+       if (l + 1 < src_len)
+         {
+#ifdef BUILD_MMX
+           INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0)
+#else
+           *dst = INTERP_256(a, src[l + 1], *dst);
+#endif
+         }
+       if (l == (src_len - 1))
+         {
+#ifdef BUILD_MMX
+           INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0)
+#else
+          *dst = INTERP_256(a, src[0], *dst);
+#endif
+         }
+#ifdef BUILD_MMX
+       MOV_R2P(mm1, *dst, mm0)
+#endif
+       dst++;  yy += ayx;
+     }
+}
+
+static void
+linear_restrict(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      yy;
+
+   SETUP_LINEAR_FILL
+
+   if (ayx == 0)
+     {
+       DATA32  c;
+
+       y = (yy >> 16);
+       if ((y < 0) || (y >= src_len))
+         {
+           memset(dst, 0, sizeof(DATA32) * dst_len);
+           return;
+         }
+       c = src[y];
+       while (dst < dst_end)
+           *dst++ = c;
+       return;
+     }
+
+   if (ayy == 0)
+     {
+       Gfx_Func_Copy  func;
+
+       x = yy >> 16;
+       ayx = (ayx < 0 ? -1 : 1);
+       if ((unsigned)x < src_len)
+         {
+           if ((ayx > 0) && ((src_len - x) >= dst_len))
+             {
+               func = evas_common_draw_func_copy_get(dst_len, 0);
+               func(src + x, dst, dst_len);
+               return;
+             }
+           if ((ayx < 0) && (x >= (dst_len - 1)))
+             {
+               func = evas_common_draw_func_copy_get(dst_len, -1);
+               func(src + x - (dst_len - 1), dst, dst_len);
+               return;
+             }
+         }
+       while (dst < dst_end)
+         {
+           *dst = 0;
+           if ((unsigned)x < src_len)
+               *dst = src[x];
+           dst++;  x += ayx;
+         }
+       return;
+     }
+
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       l += (yy - (l << 16)) >> 15;
+       *dst = 0;
+       if ((unsigned)l < src_len)
+           *dst = src[l];
+       dst++;  yy += ayx;
+     }
+}
+
+static void
+linear_restrict_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      yy;
+
+   if (AXIS_ALIGNED)
+     {
+       linear_restrict(src, src_len, dst, mask, dst_len, x, y,
+                       axx, axy, ayx, ayy, params_data);
+       return;
+     }
+
+   SETUP_LINEAR_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       *dst = 0;
+       if ((unsigned)(l + 1) < (src_len + 1))
+         {
+           DATA32 a = 1 + ((yy - (l << 16)) >> 8);
+           int    lp = l;
+
+           if (l == -1) lp = 0;
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];
+#endif
+           if (lp + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+             }
+           if (l == -1)
+             {
+#ifdef BUILD_MMX
+               MUL_256_A2R(a, mm3, mm1, mm0)
+#else
+               *dst = MUL_256(a, *dst);
+#endif
+             }
+           if (l == (src_len - 1))
+             {
+#ifdef BUILD_MMX
+               a = 257 - a;
+               MUL_256_A2R(a, mm3, mm1, mm0)
+#else
+               *dst = MUL_256(257 - a, *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+         }
+       dst++;  yy += ayx;
+     }
+}
+
+static void
+linear_restrict_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      yy;
+
+   SETUP_LINEAR_FILL
+
+   if (ayx == 0)
+     {
+       DATA32  c;
+
+       y = (yy >> 16);
+       if ((y < 0) || (y >= src_len))
+         {
+           memset(dst, 0, sizeof(DATA32) * dst_len);
+           memset(mask, 0, sizeof(DATA8) * dst_len);
+           return;
+         }
+       c = src[y];
+       while (dst < dst_end)
+         {
+           *dst++ = c;  *mask++ = 255;
+         }
+       return;
+     }
+
+   if (ayy == 0)
+     {
+       Gfx_Func_Copy  func;
+
+       x = yy >> 16;
+       ayx = (ayx < 0 ? -1 : 1);
+       if ((unsigned)x < src_len)
+         {
+           if ((ayx > 0) && ((src_len - x) >= dst_len))
+             {
+               func = evas_common_draw_func_copy_get(dst_len, 0);
+               func(src + x, dst, dst_len);
+               memset(mask, 255, sizeof(DATA8) * dst_len);
+               return;
+             }
+           if ((ayx < 0) && (x >= (dst_len - 1)))
+             {
+               func = evas_common_draw_func_copy_get(dst_len, -1);
+               func(src + x - (dst_len - 1), dst, dst_len);
+               memset(mask, 255, sizeof(DATA8) * dst_len);
+               return;
+             }
+         }
+       while (dst < dst_end)
+         {
+           *dst = 0;  *mask = 0;
+           if ((unsigned)x < src_len)
+             {
+               *dst = src[x];  *mask = 255;
+             }
+           dst++;  mask++;  x += ayx;
+         }
+       return;
+     }
+
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       l += (yy - (l << 16)) >> 15;
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  yy += ayx;
+     }
+}
+
+static void
+linear_restrict_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                          int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      yy;
+
+   if (AXIS_ALIGNED)
+     {
+       linear_restrict_masked(src, src_len, dst, mask, dst_len, x, y,
+                              axx, axy, ayx, ayy, params_data);
+       return;
+     }
+
+   SETUP_LINEAR_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       *dst = 0;  *mask = 0;
+       if ((unsigned)(l + 1) < (src_len + 1))
+         {
+           DATA32 a = 1 + ((yy - (l << 16)) >> 8);
+           int    lp = l;
+
+           if (l == -1) lp = 0;
+
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];  *mask = 255;
+#endif
+           if (lp + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+             }
+           if (l == -1)
+               *mask = a - 1;
+           if (l == (src_len - 1))
+               *mask = 256 - a;
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+         }
+       dst++;  mask++;  yy += ayx;
+     }
+}
+
+static void
+linear_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                        int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      off = gdata->off * (src_len - 1);
+   int      yy;
+
+   SETUP_LINEAR_FILL
+
+   if (ayx == 0)
+     {
+       DATA32  c;
+
+       y = (yy >> 16);
+       if ((y < 0) || (y >= src_len))
+         {
+           memset(dst, 0, sizeof(DATA32) * dst_len);
+           return;
+         }
+       y += off;
+       if (y < 0) y = -y;
+       if (y >= src_len)
+         {
+           int  m = (y % (2 * src_len));
+
+           y = (y % src_len);
+           if (m >= src_len)
+               y = src_len - y - 1;
+         }
+       c = src[y];
+       while (dst < dst_end)
+           *dst++ = c;
+       return;
+     }
+
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       l += (yy - (l << 16)) >> 15;
+       *dst = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                  l = src_len - l - 1;
+             }
+           *dst = src[l];
+         }
+       dst++;  yy += ayx;
+     }
+}
+
+static void
+linear_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      off = gdata->off * (src_len - 1);
+   int      yy;
+
+   if (AXIS_ALIGNED)
+     {
+       linear_restrict_reflect(src, src_len, dst, mask, dst_len, x, y,
+                               axx, axy, ayx, ayy, params_data);
+       return;
+     }
+
+   SETUP_LINEAR_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       *dst = 0;
+       if ((unsigned)(l + 1) < (src_len + 1))
+         {
+           DATA32 a = 1 + ((yy - (l << 16)) >> 8), a0 = a;
+           int    lp = l + off;
+
+           if (l == -1) lp = off;
+           if (lp < 0) { lp = -lp;  a = 257 - a; }
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                 { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];
+#endif
+           if (lp + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+             }
+           if (l == -1)
+             {
+#ifdef BUILD_MMX
+               MUL_256_A2R(a0, mm3, mm1, mm0)
+#else
+               *dst = MUL_256(a0, *dst);
+#endif
+             }
+           if (l == (src_len - 1))
+             {
+#ifdef BUILD_MMX
+               a0 = 257 - a0;
+               MUL_256_A2R(a0, mm3, mm1, mm0)
+#else
+               *dst = MUL_256(257 - a0, *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+         }
+       dst++;  yy += ayx;
+     }
+}
+
+static void
+linear_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      off = gdata->off * (src_len - 1);
+   int      yy;
+
+   SETUP_LINEAR_FILL
+
+   if (ayx == 0)
+     {
+       DATA32  c;
+
+       y = (yy >> 16);
+       if ((y < 0) || (y >= src_len))
+         {
+           memset(dst, 0, sizeof(DATA32) * dst_len);
+           memset(mask, 0, sizeof(DATA8) * dst_len);
+           return;
+         }
+       y += off;
+       if (y < 0) y = -y;
+       if (y >= src_len)
+         {
+           int  m = (y % (2 * src_len));
+
+           y = (y % src_len);
+           if (m >= src_len)
+               y = src_len - y - 1;
+         }
+       c = src[y];
+       while (dst < dst_end)
+         { *dst++ = c;  *mask++ = 255; }
+       return;
+     }
+
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       l += ((yy - (l << 16)) >> 15);
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                  l = src_len - l - 1;
+             }
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  yy += ayx;
+     }
+}
+
+static void
+linear_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      off = gdata->off * (src_len - 1);
+   int      yy;
+
+   if (AXIS_ALIGNED)
+     {
+       linear_restrict_reflect_masked(src, src_len, dst, mask, dst_len, x, y,
+                                      axx, axy, ayx, ayy, params_data);
+       return;
+     }
+
+   SETUP_LINEAR_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       *dst = 0;  *mask = 0;
+       if ((unsigned)(l + 1) < (src_len + 1))
+         {
+           DATA32 a = 1 + ((yy - (l << 16)) >> 8), a0 = a - 1;
+           int    lp = l + off;
+
+           if (l == -1) lp = off;
+           if (lp < 0) { lp = -lp;  a = 257 - a; }
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                  { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];
+#endif
+           *mask = 255;
+
+           if (lp + 1 < src_len)
+            {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+            }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+           if (l == -1)
+               *mask = a0;
+           if (l == (src_len - 1))
+               *mask = 255 - a0;
+         }
+       dst++;  mask++;  yy += ayx;
+     }
+}
+
+static void
+linear_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      off = gdata->off * (src_len - 1);
+   int      yy;
+
+   SETUP_LINEAR_FILL
+
+   if (ayx == 0)
+     {
+       DATA32  c;
+
+       y = (yy >> 16);
+       if ((y < 0) || (y >= src_len))
+         {
+           memset(dst, 0, sizeof(DATA32) * dst_len);
+           return;
+         }
+       y += off;
+       y = y % src_len;
+       if (y < 0)
+          y += src_len;
+       c = src[y];
+       while (dst < dst_end)
+           *dst++ = c;
+       return;
+     }
+
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       l += (yy - (l << 16)) >> 15;
+       *dst = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           l = l % src_len;
+           if (l < 0)
+               l += src_len;
+           *dst = src[l];
+         }
+       dst++;  yy += ayx;
+     }
+}
+
+static void
+linear_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                          int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      off = gdata->off * (src_len - 1);
+   int      yy;
+
+   if (AXIS_ALIGNED)
+     {
+       linear_restrict_repeat(src, src_len, dst, mask, dst_len, x, y,
+                              axx, axy, ayx, ayy, params_data);
+       return;
+     }
+
+   SETUP_LINEAR_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       *dst = 0;
+       if ((unsigned)(l + 1) < (src_len + 1))
+         {
+           DATA32 a = 1 + ((yy - (l << 16)) >> 8);
+           int    lp = l + off;
+
+           if (l == -1) lp = off;
+           lp = lp % src_len;
+           if (lp < 0)
+               lp += src_len;
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];
+#endif
+           if (lp + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+             }
+           if (lp == (src_len - 1))
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[0], *dst);
+#endif
+             }
+           if (l == -1)
+             {
+#ifdef BUILD_MMX
+               MUL_256_A2R(a, mm3, mm1, mm0)
+#else
+               *dst = MUL_256(a, *dst);
+#endif
+             }
+           if (l == (src_len - 1))
+             {
+#ifdef BUILD_MMX
+               a = 257 - a;
+               MUL_256_A2R(a, mm3, mm1, mm0)
+#else
+               *dst = MUL_256(257 - a, *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+         }
+       dst++;  yy += ayx;
+     }
+}
+
+static void
+linear_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      off = gdata->off * (src_len - 1);
+   int      yy;
+
+   SETUP_LINEAR_FILL
+
+   if (ayx == 0)
+     {
+       DATA32  c;
+
+       y = (yy >> 16);
+       if ((y < 0) || (y >= src_len))
+         {
+           memset(dst, 0, sizeof(DATA32) * dst_len);
+           memset(mask, 0, sizeof(DATA8) * dst_len);
+           return;
+         }
+       y += off;
+       y = y % src_len;
+       if (y < 0)
+          y += src_len;
+       c = src[y];
+       while (dst < dst_end)
+         { *dst++ = c;  *mask++ = 255; }
+       return;
+     }
+
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       l += ((yy - (l << 16)) >> 15);
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           l = l % src_len;
+           if (l < 0)
+               l += src_len;
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  yy += ayx;
+     }
+}
+
+static void
+linear_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      off = gdata->off * (src_len - 1);
+   int      yy;
+
+   if (AXIS_ALIGNED)
+     {
+       linear_restrict_repeat_masked(src, src_len, dst, mask, dst_len, x, y,
+                                     axx, axy, ayx, ayy, params_data);
+       return;
+     }
+
+   SETUP_LINEAR_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       *dst = 0;  *mask = 0;
+       if ((unsigned)(l + 1) < (src_len + 1))
+         {
+           DATA32 a = 1 + ((yy - (l << 16)) >> 8);
+           int    lp = l + off;
+
+           if (l == -1) lp = off;
+           lp = lp % src_len;
+           if (lp < 0)
+               lp += src_len;
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];
+#endif
+           *mask = 255;
+
+           if (lp + 1 < src_len)
+            {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+            }
+           if (lp == (src_len - 1))
+            {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[0], *dst);
+#endif
+            }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+           if (l == -1)
+               *mask = a - 1;
+           if (l == (src_len - 1))
+               *mask = 256 - a;
+         }
+       dst++;  mask++;  yy += ayx;
+     }
+}
+
+static void
+linear_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      yy;
+
+   SETUP_LINEAR_FILL
+
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       l += (yy - (l << 16)) >> 15;
+       if (l < 0) l = 0;
+       if (l >= src_len) l = src_len - 1;
+       *dst = src[l];
+       dst++;  yy += ayx;
+     }
+}
+
+static void
+linear_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Linear_Data  *gdata = (Linear_Data *)params_data;
+   int      yy;
+
+   if (AXIS_ALIGNED)
+     {
+       linear_pad(src, src_len, dst, mask, dst_len, x, y,
+                  axx, axy, ayx, ayy, params_data);
+       return;
+     }
+
+   SETUP_LINEAR_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  l = (yy >> 16);
+
+       if (l < 0) *dst = src[0];
+       if (l >= src_len) *dst = src[src_len - 1];
+       if ((unsigned)l < src_len)
+         {
+           DATA32 a = 1 + ((yy - (l << 16)) >> 8);
+
+#ifdef BUILD_MMX
+           MOV_P2R(src[l], mm1, mm0)
+#else
+           *dst = src[l];
+#endif
+           if (l && (l + 1 < src_len))
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[l + 1], *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+         }
+       dst++;  yy += ayx;
+     }
+}
diff --git a/src/lib/engines/common/evas_gradient_main.c b/src/lib/engines/common/evas_gradient_main.c
new file mode 100644 (file)
index 0000000..3d11fba
--- /dev/null
@@ -0,0 +1,924 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include <math.h>
+
+#include "evas_common.h"
+#include "evas_blend_private.h"
+#include "evas_gradient_private.h"
+
+
+static void _get_word(char *in, char *key);
+static void evas_common_gradient_map_argb(RGBA_Draw_Context *dc, RGBA_Gradient *gr, int len);
+static void evas_common_gradient_map_ahsv(RGBA_Draw_Context *dc, RGBA_Gradient *gr, int len);
+
+static  int grad_initialised = 0;
+
+static void
+_get_word(char *in, char *key)
+{
+   char  *p, *pp;
+   int    l;
+
+   if (!key) return;
+   *key = 0;
+   if (!in || !*in) return;
+
+   p = in;
+   while (*p && isspace(*p))
+       p++;
+   if (!*p) return;
+   pp = p;
+   while (*pp && !isspace(*pp))
+       pp++;
+   l = pp - p;
+   if (l >= 255) return;
+   *(p + l) = 0;
+   strncpy(key, p, l + 1);
+}
+
+static void
+_evas_common_gradient_stops_free(RGBA_Gradient *gr)
+{
+   if (!gr) return;
+   if (gr->color.stops)
+     {
+       Eina_Inlist *l;
+
+       while (gr->color.stops)
+         {
+          l = gr->color.stops;
+          gr->color.stops = eina_inlist_remove(gr->color.stops, gr->color.stops);
+          free(l);
+         }
+       gr->color.stops = NULL;
+       gr->color.nstops = 0;
+     }
+   if (gr->alpha.stops)
+     {
+       Eina_Inlist *l;
+
+       while (gr->alpha.stops)
+         {
+          l = gr->alpha.stops;
+          gr->alpha.stops = eina_inlist_remove(gr->alpha.stops, gr->alpha.stops);
+          free(l);
+         }
+       gr->alpha.stops = NULL;
+       gr->alpha.nstops = 0;
+     }
+}
+
+
+char *
+evas_common_gradient_get_key_fval(char *in, char *key, float *val)
+{
+   char   *p, *pp, sval[256];
+
+   if (!key || !val) return NULL;
+   *key = 0;
+   if (!in || !*in) return NULL;
+   p = strchr(in, '=');
+   if (!p || !*p)  return NULL;
+   *p = 0;  p++;
+   if (!*p)  return NULL;
+   pp = strchr(p, ';');
+   if (!pp || !*pp)  return NULL;
+   _get_word(in, key);
+   if (!*key)  return NULL;
+   *pp = 0;
+   _get_word(p, sval);
+   if (!sval[0])  return NULL;
+   *val = atof(sval);
+   return (pp + 1);
+}
+
+EAPI void
+evas_common_gradient_init(void)
+{
+   RGBA_Gradient_Type  *geom;
+
+   if (grad_initialised)
+       return;
+   geom = evas_common_gradient_geometer_get("linear");
+   if (geom)
+       geom->init();
+   geom = evas_common_gradient_geometer_get("radial");
+   if (geom)
+       geom->init();
+   geom = evas_common_gradient_geometer_get("rectangular");
+   if (geom)
+       geom->init();
+   geom = evas_common_gradient_geometer_get("angular");
+   if (geom)
+       geom->init();
+   geom = evas_common_gradient_geometer_get("sinusoidal");
+   if (geom)
+       geom->init();
+   grad_initialised = 1;
+}
+
+void
+evas_common_gradient_shutdown(void)
+{
+   RGBA_Gradient_Type  *geom;
+
+   if (!grad_initialised)
+       return;
+   geom = evas_common_gradient_geometer_get("linear");
+   if (geom)
+       geom->shutdown();
+   geom = evas_common_gradient_geometer_get("radial");
+   if (geom)
+       geom->shutdown();
+   geom = evas_common_gradient_geometer_get("rectangular");
+   if (geom)
+       geom->shutdown();
+   geom = evas_common_gradient_geometer_get("angular");
+   if (geom)
+       geom->shutdown();
+   geom = evas_common_gradient_geometer_get("sinusoidal");
+   if (geom)
+       geom->shutdown();
+   grad_initialised = 0;
+}
+
+EAPI RGBA_Gradient *
+evas_common_gradient_new(void)
+{
+   RGBA_Gradient *gr;
+
+   gr = calloc(1, sizeof(RGBA_Gradient));
+   gr->references = 1;
+   return gr;
+}
+
+EAPI void
+evas_common_gradient_free(RGBA_Gradient *gr)
+{
+   if (!gr) return;
+   gr->references--;
+   if (gr->references > 0) return;
+   evas_common_gradient_clear(gr);
+   if (gr->type.name) free(gr->type.name);
+   if (gr->type.params) free(gr->type.params);
+   if (gr->type.geometer && gr->type.gdata)
+       gr->type.geometer->geom_free(gr->type.gdata);
+   if (gr->map.data) free(gr->map.data);
+   free(gr);
+}
+
+EAPI void
+evas_common_gradient_clear(RGBA_Gradient *gr)
+{
+   if (!gr) return;
+
+   _evas_common_gradient_stops_free(gr);
+
+   if (gr->color.data && !gr->imported_data)
+       free(gr->color.data);
+   gr->color.data = NULL;
+   gr->color.len = 0;
+   if (gr->alpha.data && !gr->imported_data)
+       free(gr->alpha.data);
+   gr->alpha.data = NULL;
+   gr->alpha.len = 0;
+
+   gr->imported_data = 0;
+   gr->has_alpha = 0;
+}
+
+EAPI void
+evas_common_gradient_color_stop_add(RGBA_Gradient *gr, int r, int g, int b, int a, int dist)
+{
+   RGBA_Gradient_Color_Stop *gc, *gcm, *gc_last;
+
+   if (!gr) return;
+   if (gr->imported_data)
+     {
+       gr->color.data = NULL;
+       gr->color.len = 0;
+       gr->alpha.data = NULL;
+       gr->alpha.len = 0;
+       gr->imported_data = 0;
+       gr->has_alpha = 0;
+     }
+   gc = malloc(sizeof(RGBA_Gradient_Color_Stop));
+   if (!gc) return;
+   if (dist < 1) dist = 1;
+   if (dist > 32768) dist = 32768;
+   if (r < 0) r = 0;  if (r > 255) r = 255;
+   if (g < 0) g = 0;  if (g > 255) g = 255;
+   if (b < 0) b = 0;  if (b > 255) b = 255;
+   if (a < 0) a = 0;  if (a > 255) a = 255;
+   gc->r = r;
+   gc->g = g;
+   gc->b = b;
+   gc->a = a;
+   gc->dist = dist;
+
+   if (!gr->color.stops)
+     {
+       gr->color.stops = eina_inlist_append(gr->color.stops, EINA_INLIST_GET(gc));
+       gr->color.nstops = 1;
+       gr->color.len = 1;
+       if (a < 255)
+          gr->has_alpha = 1;
+       return;
+     }
+   gcm = malloc(sizeof(RGBA_Gradient_Color_Stop));
+   if (!gcm) { free(gc); return; }
+   gc_last = (RGBA_Gradient_Color_Stop *)(gr->color.stops->last);
+   if ((dist + gc_last->dist + gr->color.len) > 65535)
+       { free(gc); free(gcm); return; }
+   gcm->r = (gc_last->r + r) / 2;
+   gcm->g = (gc_last->g + g) / 2;
+   gcm->b = (gc_last->b + b) / 2;
+   gcm->a = (gc_last->a + a) / 2;
+   gcm->dist = dist;
+   gr->color.stops = eina_inlist_append(gr->color.stops, EINA_INLIST_GET(gcm));
+   gr->color.len += gc_last->dist;
+   gr->color.stops = eina_inlist_append(gr->color.stops, EINA_INLIST_GET(gc));
+   gr->color.len += dist;
+   gr->color.nstops += 2;
+   if (a < 255)
+       gr->has_alpha = 1;
+}
+
+EAPI void
+evas_common_gradient_alpha_stop_add(RGBA_Gradient *gr, int a, int dist)
+{
+   RGBA_Gradient_Alpha_Stop *ga, *gam, *ga_last;
+
+   if (!gr) return;
+   if (gr->imported_data)
+     {
+       gr->color.data = NULL;
+       gr->color.len = 0;
+       gr->alpha.data = NULL;
+       gr->alpha.len = 0;
+       gr->imported_data = 0;
+       gr->has_alpha = 0;
+     }
+   ga = malloc(sizeof(RGBA_Gradient_Alpha_Stop));
+   if (!ga) return;
+   if (dist < 1) dist = 1;
+   if (dist > 32768) dist = 32768;
+   if (a < 0) a = 0;  if (a > 255) a = 255;
+   ga->a = a;
+   ga->dist = dist;
+
+   if (!gr->alpha.stops)
+     {
+        gr->alpha.stops = eina_inlist_append(gr->alpha.stops, EINA_INLIST_GET(ga));
+       gr->alpha.nstops = 1;
+       gr->alpha.len = 1;
+       if (a < 255)
+          gr->has_alpha = 1;
+       return;
+     }
+   gam = malloc(sizeof(RGBA_Gradient_Alpha_Stop));
+   if (!gam) { free(ga); return; }
+   ga_last = (RGBA_Gradient_Alpha_Stop *)(gr->alpha.stops->last);
+   if ((dist + ga_last->dist + gr->alpha.len) > 65535)
+       { free(ga); free(gam); return; }
+   gam->a = (ga_last->a + a) / 2;
+   gam->dist = dist;
+   gr->alpha.stops = eina_inlist_append(gr->alpha.stops, EINA_INLIST_GET(gam));
+   gr->alpha.len += ga_last->dist;
+   gr->alpha.stops = eina_inlist_append(gr->alpha.stops, EINA_INLIST_GET(ga));
+   gr->alpha.len += dist;
+   gr->alpha.nstops += 2;
+   if (a < 255)
+       gr->has_alpha = 1;
+}
+
+EAPI void
+evas_common_gradient_color_data_set(RGBA_Gradient *gr, DATA32 *data, int len, int alpha_flags)
+{
+   if (!gr) return;
+   if (!gr->imported_data)
+       evas_common_gradient_clear(gr);
+   if (len < 1) data = NULL;
+   if (!data) len = 0;
+   gr->color.data = data;
+   gr->color.len = len;
+   gr->has_alpha = !!alpha_flags;
+   gr->imported_data = 1;
+}
+
+EAPI void
+evas_common_gradient_alpha_data_set(RGBA_Gradient *gr, DATA8 *data, int len)
+{
+   if (!gr) return;
+   if (!gr->imported_data)
+       evas_common_gradient_clear(gr);
+   if (len < 1) data = NULL;
+   if (!data) len = 0;
+   gr->alpha.data = data;
+   gr->alpha.len = len;
+   gr->has_alpha = 1;
+   gr->imported_data = 1;
+}
+
+EAPI void
+evas_common_gradient_type_set(RGBA_Gradient *gr, const char *name, char *params)
+{
+   RGBA_Gradient_Type   *geometer;
+
+   if (!gr) return;
+   if (!name || !*name)
+       name = "linear";
+
+   geometer = evas_common_gradient_geometer_get(name);
+   if (!geometer) return;
+   if (gr->type.gdata && (geometer != gr->type.geometer))
+     {
+       if (gr->type.geometer)
+          gr->type.geometer->geom_free(gr->type.gdata);
+       gr->type.gdata = NULL;
+     }
+   gr->type.geometer = geometer;
+
+   if (gr->type.name) free(gr->type.name);
+   gr->type.name = strdup(name);
+
+   if (params && !*params) 
+       params = NULL;
+   if (gr->type.params) free(gr->type.params);
+   gr->type.params = NULL;
+   if (params) gr->type.params = strdup(params);
+
+   gr->type.geometer->geom_init(gr);
+}
+
+EAPI void
+evas_common_gradient_fill_set(RGBA_Gradient *gr, int x, int y, int w, int h)
+{
+   if (!gr) return;
+   gr->fill.x = x;
+   gr->fill.y = y;
+   if ((w < 1) && (h < 1))
+     { w = h = 1; }
+   gr->fill.w = w;
+   gr->fill.h = h;
+}
+
+EAPI void
+evas_common_gradient_fill_angle_set(RGBA_Gradient *gr, float angle)
+{
+   if (!gr) return;
+   gr->fill.angle = angle;
+}
+
+EAPI void
+evas_common_gradient_fill_spread_set(RGBA_Gradient *gr, int spread)
+{
+   if (!gr) return;
+   gr->fill.spread = spread;
+}
+
+EAPI void
+evas_common_gradient_map_offset_set(RGBA_Gradient *gr, float offset)
+{
+   if (!gr) return;
+   gr->map.offset = offset;
+}
+
+EAPI void
+evas_common_gradient_map_direction_set(RGBA_Gradient *gr, int direction)
+{
+   if (!gr) return;
+   gr->map.direction = (direction >= 0 ? 1 : -1);
+}
+
+EAPI void
+evas_common_gradient_map_angle_set(RGBA_Gradient *gr, float angle)
+{
+   if (!gr) return;
+   gr->map.angle = angle;
+}
+
+EAPI RGBA_Gradient_Type  *
+evas_common_gradient_geometer_get(const char *name)
+{
+   RGBA_Gradient_Type  *geom = NULL;
+
+   if (!name || !*name)
+       name = "linear";
+   if (!strcmp(name,"linear") || !strcmp(name,"linear.diag") || !strcmp(name,"linear.codiag"))
+       geom = evas_common_gradient_linear_get();
+   else if (!strcmp(name,"radial"))
+       geom = evas_common_gradient_radial_get();
+   else if (!strcmp(name,"angular"))
+       geom = evas_common_gradient_angular_get();
+   else if (!strcmp(name,"sinusoidal"))
+       geom = evas_common_gradient_sinusoidal_get();
+   else if (!strcmp(name,"rectangular"))
+       geom = evas_common_gradient_rectangular_get();
+   if (!geom)
+       geom = evas_common_gradient_linear_get();
+   return geom;
+}
+
+EAPI void
+evas_common_gradient_draw(RGBA_Image *dst, RGBA_Draw_Context *dc,
+                         int x, int y, int w, int h, RGBA_Gradient *gr)
+{
+   Gfx_Func_Gradient_Fill   gfunc;
+   RGBA_Gfx_Func            bfunc = NULL;
+   int             len;
+   int             xin, yin, xoff, yoff;
+   int             clx, cly, clw, clh;
+   int             axx, axy, ayx, ayy;
+   DATA32          *pdst, *dst_end, *buf, *map;
+   RGBA_Image      *argb_buf = NULL, *alpha_buf = NULL;
+   DATA8           *mask = NULL;
+   void            *gdata;
+   float           angle;
+   int             direct_copy = 0, buf_step = 0;
+
+   if (!dst || !dc || !gr || !dst || !dst->image.data)
+     return;
+   if (!gr->map.data || !gr->type.geometer)
+     return;
+   if ((gr->fill.w < 1) || (gr->fill.h < 1))
+     return;
+   if ((w < 1) || (h < 1))
+     return;
+   clx = 0;  cly = 0;  clw = dst->cache_entry.w;  clh = dst->cache_entry.h;
+   if ((clw < 1) || (clh < 1))  return;
+
+   if (dc->clip.use)
+     RECTS_CLIP_TO_RECT(clx,cly,clw,clh, dc->clip.x,dc->clip.y,dc->clip.w,dc->clip.h);
+   if ((clw < 1) || (clh < 1))  return;
+
+   xin = x;  yin = y;
+   RECTS_CLIP_TO_RECT(x,y,w,h, clx,cly,clw,clh);
+   if ((w < 1) || (h < 1))  return;
+
+   xoff = (x - xin) - gr->fill.x;
+   yoff = (y - yin) - gr->fill.y;
+
+   if (!gr->type.geometer->has_mask(gr, dc->render_op))
+     {
+       if ((dc->render_op == _EVAS_RENDER_FILL) ||
+           (dc->render_op == _EVAS_RENDER_COPY))
+         {
+            direct_copy = 1;  buf_step = dst->cache_entry.w;
+            if (gr->type.geometer->has_alpha(gr, dc->render_op))
+               dst->cache_entry.flags.alpha = 1;
+         }
+       else if ((dc->render_op == _EVAS_RENDER_BLEND) &&
+                !gr->type.geometer->has_alpha(gr, dc->render_op))
+         {
+            direct_copy = 1;  buf_step = dst->cache_entry.w;
+         }
+     }
+
+   if (!direct_copy)
+     {
+       argb_buf = evas_common_image_line_buffer_obtain(w);
+       if (!argb_buf)
+          return;
+       argb_buf->cache_entry.flags.alpha = gr->type.geometer->has_alpha(gr, dc->render_op) ? 1 : 0;
+
+       if (gr->type.geometer->has_mask(gr, dc->render_op))
+         {
+            alpha_buf = evas_common_image_alpha_line_buffer_obtain(w);
+            if (!alpha_buf)
+              {
+                 evas_common_image_line_buffer_release(argb_buf);
+                 return;
+              }
+            bfunc = evas_common_gfx_func_composite_pixel_mask_span_get(argb_buf, dst, w, dc->render_op);
+         }
+       else
+         bfunc = evas_common_gfx_func_composite_pixel_span_get(argb_buf, dst, w, dc->render_op);
+     }
+
+   gfunc = gr->type.geometer->get_fill_func(gr, dc->render_op, dc->anti_alias);
+   gdata = gr->type.gdata;
+   if (!gdata)
+     {
+       if (!direct_copy)
+         {
+           evas_common_image_line_buffer_release(argb_buf);
+           if (alpha_buf)
+               evas_common_image_alpha_line_buffer_release(alpha_buf);
+         }
+       return;
+     }
+
+   /* I TOLD YOU! this here STOPS the gradeint bugs. it's a missing
+    * emms() before doing floating point operations! the thread pipe code
+    * just brought it out reliably. i swear i had seen this long before i
+    * ever added the thread/pipe code.
+    * 
+    * now here is why it happens. NO drawing function... EXCEPT
+    * evas_common_polygon_draw() and evas_common_gradient_draw() use floating
+    * point for drawing (the poly stuff should really lose it actually), but
+    * nicely nestled in the poly draw code is a evas_common_cpu_end_opt()
+    * before it does any operations that would use floating point. the fact
+    * is the gradient code was LUCKY before without the thread pipes to almost
+    * all the time have another func do a evas_common_cpu_end_opt() before it
+    * was called. that was no longer the case with the thread renderer and
+    * it suffered. that is why on amd systems it seemed to work as i beileve
+    * on amd cpu's the amms done by evas_common_cpu_end_opt() is not needed
+    * to do floatingpoint ops again.
+    * 
+    * after a lot of futzing about - this was the culprit (well axx and axy
+    * were garbage values eventually i found after much debugging and i traced
+    * their garbageness back to here).
+    */
+   evas_common_cpu_end_opt();
+   
+   angle = (gr->fill.angle * M_PI) / 180.0;
+   axx = (cos(angle) * 65536.0);
+   ayy = axx;
+   axy = (sin(angle) * 65536.0);
+   ayx = -axy;
+
+   map = gr->map.data;
+   len = gr->map.len;
+   pdst = dst->image.data + (y * dst->cache_entry.w) + x;
+   dst_end = pdst + (h * dst->cache_entry.w);
+   if (!direct_copy)
+     {
+       buf = argb_buf->image.data;
+       if (alpha_buf)
+         mask = (DATA8 *)alpha_buf->image.data;
+     }
+   else
+     buf = pdst;
+   while (pdst < dst_end)
+     {
+#ifdef EVAS_SLI
+       if (((yoff + y) % dc->sli.h) == dc->sli.y)
+#endif
+         {
+            gfunc(map, len, buf, mask, w, xoff, yoff, axx, axy, ayx, ayy, gdata);
+            evas_common_cpu_end_opt();
+            if (!direct_copy)
+              bfunc(buf, mask, 0, pdst, w);
+            evas_common_cpu_end_opt();
+         }
+       buf += buf_step;
+       pdst += dst->cache_entry.w;
+       yoff++;
+     }
+   
+   if (!direct_copy)
+     {
+       evas_common_image_line_buffer_release(argb_buf);
+       if (alpha_buf)
+          evas_common_image_alpha_line_buffer_release(alpha_buf);
+     }
+}
+
+static void
+evas_common_gradient_map_argb(RGBA_Draw_Context *dc, RGBA_Gradient *gr, int len)
+{
+   DATA32   color;
+   int      mul_use;
+
+   if (!gr || !dc)
+       return;
+   if (len < 1)
+     {
+       if (gr->map.data)
+          free(gr->map.data);
+       gr->map.data = NULL;
+       gr->map.len = 0;
+       return;
+     }
+   if ((len != gr->map.len) || (!gr->map.data))
+       gr->map.data = realloc(gr->map.data, len * sizeof(DATA32));
+   if (!gr->map.data)
+     { gr->map.len = 0; return; }
+   gr->map.len = len;
+   gr->map.has_alpha = gr->has_alpha;
+
+   color = dc->mul.col;
+   mul_use = dc->mul.use;
+   if (dc->mul.col == 0xffffffff)
+       mul_use = 0;
+
+   if ((!gr->imported_data) && (!gr->color.stops) && (!gr->alpha.stops))
+     {
+       static DATA32  p = 0xffffffff;
+
+       gr->color.data = &p;
+       gr->color.len = 1;
+       gr->imported_data = 1;
+       gr->has_alpha = 0;
+     }
+
+   if (gr->color.stops)
+     {
+       Eina_Inlist  *lc;
+       RGBA_Gradient_Color_Stop  *gc, *gc_next;
+       DATA32  *pmap, *map_end;
+       int   i, dii;
+       int   r, g, b, a;
+       int   next_r, next_g, next_b, next_a;
+       int   rr, drr, gg, dgg, bb, dbb, aa, daa;
+       int   mr = 256, mg = 256, mb = 256, ma = 256;
+
+       gr->color.data = realloc(gr->color.data, gr->color.len * sizeof(DATA32));
+       if (!gr->color.data)  return;
+
+       gc = (RGBA_Gradient_Color_Stop *)gr->color.stops;
+       r = gc->r;  g = gc->g;  b = gc->b;  a = gc->a;
+       if (mul_use)
+         {
+           mr = 1 + ((color >> 16) & 0xff);  mg = 1 + ((color >> 8) & 0xff);
+           mb = 1 + ((color) & 0xff);  ma = 1 + (color >> 24);
+           if (ma < 256)
+              gr->map.has_alpha = 1;
+           r = (r * mr) >> 8;  g = (g * mg) >> 8;
+           b = (b * mb) >> 8;  a = (a * ma) >> 8;
+          }
+       lc = gr->color.stops->next;
+       pmap = gr->color.data;  map_end = pmap + gr->color.len;
+
+       while (pmap < map_end)
+         {
+           if (lc)
+             {
+               i = gc->dist;
+               dii = 65536 / i;
+               gc_next = (RGBA_Gradient_Color_Stop *)lc;
+               next_r = gc_next->r;  next_g = gc_next->g;
+               next_b = gc_next->b;  next_a = gc_next->a;
+               if (mul_use)
+                 {
+                   next_r = (next_r * mr) >> 8;  next_g = (next_g * mg) >> 8;
+                   next_b = (next_b * mb) >> 8;  next_a = (next_a * ma) >> 8;
+                 }
+               rr = r << 16;  drr = ((next_r - r) * dii);
+               gg = g << 16;  dgg = ((next_g - g) * dii);
+               bb = b << 16;  dbb = ((next_b - b) * dii);
+               aa = a << 16;  daa = ((next_a - a) * dii);
+               while (i--)
+                 {
+                   r = rr >> 16;  r += (rr - (r << 16)) >> 15;
+                   g = gg >> 16;  g += (gg - (g << 16)) >> 15;
+                   b = bb >> 16;  b += (bb - (b << 16)) >> 15;
+                   a = aa >> 16;  a += (aa - (a << 16)) >> 15;
+                   *pmap++ = ARGB_JOIN(a,r,g,b);
+                   rr += drr;  gg += dgg;  bb += dbb;  aa += daa;
+                 }
+               gc = gc_next;
+               r = next_r; g = next_g; b = next_b; a = next_a;
+               lc = lc->next;
+              }
+           else
+               *pmap++ = ARGB_JOIN(a,r,g,b);
+         }
+     }
+
+   if (gr->alpha.stops)
+     {
+       Eina_Inlist  *lc;
+       RGBA_Gradient_Alpha_Stop  *ga, *ga_next;
+       DATA8  *pamap, *amap_end;
+       int   i, dii;
+       int   a, next_a;
+       int   aa, daa;
+
+       gr->alpha.data = realloc(gr->alpha.data, gr->alpha.len * sizeof(DATA8));
+       if (!gr->alpha.data)  return;
+
+       ga = (RGBA_Gradient_Alpha_Stop *)gr->alpha.stops;
+       a = ga->a;
+       lc = gr->alpha.stops->next;
+       pamap = gr->alpha.data;  amap_end = pamap + gr->alpha.len;
+
+       while (pamap < amap_end)
+         {
+           if (lc)
+             {
+               i = ga->dist;
+               dii = 65536 / i;
+               ga_next = (RGBA_Gradient_Alpha_Stop *)lc;
+               next_a = ga_next->a;
+               aa = a << 16;  daa = ((next_a - a) * dii);
+               while (i--)
+                 {
+                   a = aa >> 16;  a += (aa - (a << 16)) >> 15;
+                   *pamap++ = a;
+                   aa += daa;
+                 }
+               ga = ga_next;
+               a = next_a;
+               lc = lc->next;
+              }
+           else
+               *pamap++ = a;
+         }
+     }
+
+   if (gr->color.data && gr->alpha.data)
+     {
+       if (!gr->imported_data)
+          color = 0xffffffff;
+       if (gr->color.len == gr->alpha.len)
+         {
+           evas_common_scale_rgba_a8_span(gr->color.data, gr->alpha.data, gr->color.len,
+                                          color, gr->map.data, gr->map.len, gr->map.direction);
+           return;
+         }
+       evas_common_scale_rgba_span(gr->color.data, NULL, gr->color.len,
+                                   color, gr->map.data, gr->map.len, gr->map.direction);
+       evas_common_scale_clip_a8_span(NULL, gr->alpha.data, gr->alpha.len,
+                                       0xffffffff, gr->map.data, gr->map.len, gr->map.direction);
+       return;
+     }
+
+   if (gr->color.data)
+     {
+       if (!gr->imported_data)
+          color = 0xffffffff;
+       evas_common_scale_rgba_span(gr->color.data, NULL, gr->color.len,
+                                   color, gr->map.data, gr->map.len, gr->map.direction);
+       gr->map.has_alpha |= (!!(255 - (color >> 24)));
+       return;
+     }
+       
+   evas_common_scale_a8_span(NULL, gr->alpha.data, gr->alpha.len,
+                            color, gr->map.data, gr->map.len, gr->map.direction);
+}
+
+static void
+evas_common_gradient_map_ahsv(RGBA_Draw_Context *dc, RGBA_Gradient *gr, int len)
+{
+   DATA32   color;
+
+   if (!gr || !dc)
+       return;
+   if (len < 1)
+     {
+       if (gr->map.data)
+          free(gr->map.data);
+       gr->map.data = NULL;
+       gr->map.len = 0;
+       return;
+     }
+   if ((len != gr->map.len) || (!gr->map.data))
+       gr->map.data = realloc(gr->map.data, len * sizeof(DATA32));
+   if (!gr->map.data)
+     { gr->map.len = 0; return; }
+   gr->map.len = len;
+   gr->map.has_alpha = gr->has_alpha;
+
+   color = dc->mul.col;
+   if (!dc->mul.use)
+       color = 0xffffffff;
+
+   if ((!gr->imported_data) && (!gr->color.stops) && (!gr->alpha.stops))
+     {
+       static DATA32  p = 0xffffffff;
+
+       gr->color.data = &p;
+       gr->color.len = 1;
+       gr->imported_data = 1;
+       gr->has_alpha = 0;
+     }
+
+   if (gr->color.stops)
+     {
+       Eina_Inlist  *lc;
+       RGBA_Gradient_Color_Stop  *gc, *gc_next;
+       DATA32  *pmap, *map_end;
+       int   i, dii;
+       int   h, s, v;
+       int   next_h, next_s, next_v;
+       int   hh, dhh, ss, dss, vv, dvv, aa, daa;
+       int   r, g, b, a;
+       int   next_r, next_g, next_b, next_a;
+
+       gr->color.data = realloc(gr->color.data, gr->color.len * sizeof(DATA32));
+       if (!gr->color.data)  return;
+
+       gc = (RGBA_Gradient_Color_Stop *)gr->color.stops;
+       r = gc->r;  g = gc->g;  b = gc->b;  a = gc->a;
+       evas_common_convert_color_rgb_to_hsv_int(r, g, b, &h, &s, &v);
+
+       lc = gr->color.stops->next;
+       pmap = gr->color.data;  map_end = pmap + gr->color.len;
+
+       while (pmap < map_end)
+         {
+           if (lc)
+             {
+               i = gc->dist;
+               dii = 65536 / i;
+               gc_next = (RGBA_Gradient_Color_Stop *)lc;
+
+               next_r = gc_next->r;  next_g = gc_next->g;
+               next_b = gc_next->b;  next_a = gc_next->a;
+               evas_common_convert_color_rgb_to_hsv_int(next_r, next_g, next_b,
+                                                        &next_h, &next_s, &next_v);
+               hh = h << 16;  dhh = ((next_h - h) * dii);
+               ss = s << 16;  dss = ((next_s - s) * dii);
+               vv = v << 16;  dvv = ((next_v - v) * dii);
+               aa = a << 16;  daa = ((next_a - a) * dii);
+               while (i--)
+                 {
+                   h = hh >> 16;  h += (hh - (h << 16)) >> 15;
+                   s = ss >> 16;  s += (ss - (s << 16)) >> 15;
+                   v = vv >> 16;  v += (vv - (v << 16)) >> 15;
+                   a = aa >> 16;  a += (aa - (a << 16)) >> 15;
+                   evas_common_convert_color_hsv_to_rgb_int(h, s, v, &r, &g, &b);
+                   *pmap++ = ARGB_JOIN(a,r,g,b);
+                   hh += dhh;  ss += dss;  vv += dvv;  aa += daa;
+                 }
+               gc = gc_next;
+               h = next_h; s = next_s; v = next_v; a = next_a;
+               lc = lc->next;
+              }
+           else
+               *pmap++ = ARGB_JOIN(gc->a,gc->r,gc->g,gc->b);
+         }
+     }
+
+   if (gr->alpha.stops)
+     {
+       Eina_Inlist  *lc;
+       RGBA_Gradient_Alpha_Stop  *ga, *ga_next;
+       DATA8  *pamap, *amap_end;
+       int   i, dii;
+       int   a, next_a;
+       int   aa, daa;
+
+       gr->alpha.data = realloc(gr->alpha.data, gr->alpha.len * sizeof(DATA8));
+       if (!gr->alpha.data)  return;
+
+       ga = (RGBA_Gradient_Alpha_Stop *)gr->alpha.stops;
+       a = ga->a;
+       lc = gr->alpha.stops->next;
+       pamap = gr->alpha.data;  amap_end = pamap + gr->alpha.len;
+
+       while (pamap < amap_end)
+         {
+           if (lc)
+             {
+               i = ga->dist;
+               dii = 65536 / i;
+               ga_next = (RGBA_Gradient_Alpha_Stop *)lc;
+               next_a = ga_next->a;
+               aa = a << 16;  daa = ((next_a - a) * dii);
+               while (i--)
+                 {
+                   a = aa >> 16;  a += (aa - (a << 16)) >> 15;
+                   *pamap++ = a;
+                   aa += daa;
+                 }
+               ga = ga_next;
+               a = next_a;
+               lc = lc->next;
+              }
+           else
+               *pamap++ = a;
+         }
+     }
+
+   if (gr->color.data && gr->alpha.data)
+     {
+       if (gr->color.len == gr->alpha.len)
+         {
+           evas_common_scale_hsva_a8_span(gr->color.data, gr->alpha.data, gr->color.len,
+                                          color, gr->map.data, gr->map.len, gr->map.direction);
+           return;
+         }
+       evas_common_scale_hsva_span(gr->color.data, NULL, gr->color.len,
+                                   color, gr->map.data, gr->map.len, gr->map.direction);
+       evas_common_scale_clip_a8_span(NULL, gr->alpha.data, gr->alpha.len,
+                                       0xffffffff, gr->map.data, gr->map.len, gr->map.direction);
+       return;
+     }
+   if (gr->color.data)
+     {
+       evas_common_scale_hsva_span(gr->color.data, NULL, gr->color.len,
+                                   color, gr->map.data, gr->map.len, gr->map.direction);
+       gr->map.has_alpha |= (!!(255 - (color >> 24)));
+       return;
+     }
+       
+   evas_common_scale_a8_span(NULL, gr->alpha.data, gr->alpha.len,
+                            color, gr->map.data, gr->map.len, gr->map.direction);
+}
+
+EAPI void
+evas_common_gradient_map(RGBA_Draw_Context *dc, RGBA_Gradient *gr, int len)
+{
+   if (!gr || !dc) return;
+   if (dc->interpolation.color_space == _EVAS_COLOR_SPACE_AHSV)
+     {
+       evas_common_gradient_map_ahsv(dc, gr, len);
+       return;
+     }
+   evas_common_gradient_map_argb(dc, gr, len);
+}
diff --git a/src/lib/engines/common/evas_gradient_private.h b/src/lib/engines/common/evas_gradient_private.h
new file mode 100644 (file)
index 0000000..b4639d2
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_GRADIENT_PRIVATE_H
+#define _EVAS_GRADIENT_PRIVATE_H
+
+
+RGBA_Gradient_Type *evas_common_gradient_linear_get        (void);
+RGBA_Gradient_Type *evas_common_gradient_radial_get        (void);
+RGBA_Gradient_Type *evas_common_gradient_angular_get       (void);
+RGBA_Gradient_Type *evas_common_gradient_rectangular_get   (void);
+RGBA_Gradient_Type *evas_common_gradient_sinusoidal_get    (void);
+char               *evas_common_gradient_get_key_fval      (char *in, char *key, float *val);
+
+
+#endif /* _EVAS_GRADIENT_PRIVATE_H */
diff --git a/src/lib/engines/common/evas_gradient_radial.c b/src/lib/engines/common/evas_gradient_radial.c
new file mode 100644 (file)
index 0000000..f6d6f47
--- /dev/null
@@ -0,0 +1,1147 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include <math.h>
+
+#include "evas_common.h"
+#include "evas_gradient_private.h"
+
+
+typedef struct _Radial_Data   Radial_Data;
+struct _Radial_Data
+{
+   float  r0;
+
+   int    sx, sy, s;
+   float  off;
+   int    len;
+};
+
+static void
+radial_init(void);
+
+static void
+radial_shutdown(void);
+
+static void
+radial_init_geom(RGBA_Gradient *gr);
+
+static void
+radial_setup_geom(RGBA_Gradient *gr);
+
+static void
+radial_free_geom(void *gdata);
+
+static int
+radial_has_alpha(RGBA_Gradient *gr, int op);
+
+static int
+radial_has_mask(RGBA_Gradient *gr, int op);
+
+static int
+radial_get_map_len(RGBA_Gradient *gr);
+
+static Gfx_Func_Gradient_Fill
+radial_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa);
+
+static RGBA_Gradient_Type  radial = {"radial", radial_init, radial_shutdown,
+                                    radial_init_geom, radial_setup_geom, radial_free_geom,
+                                    radial_has_alpha, radial_has_mask,
+                                    radial_get_map_len, radial_get_fill_func};
+
+
+/** internal functions **/
+
+static void
+radial_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                          int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                      int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                         int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                             int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                          int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                      int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                         int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+static void
+radial_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                      int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_pad_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                          int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+radial_pad_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                             int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+
+RGBA_Gradient_Type  *
+evas_common_gradient_radial_get(void)
+{
+    return &radial;
+}
+
+static void
+radial_init(void)
+{
+}
+
+static void
+radial_shutdown(void)
+{
+}
+
+static void
+radial_free_geom(void *gdata)
+{
+   Radial_Data *data = (Radial_Data *)gdata;
+   if (data) free(data);
+}
+
+static void
+radial_setup_geom(RGBA_Gradient *gr)
+{
+   Radial_Data   *radial_data;
+
+   if (!gr || (gr->type.geometer != &radial)) return;
+
+   radial_data = (Radial_Data *)gr->type.gdata;
+   if (!radial_data) return;
+   radial_data->sx = gr->fill.w;
+   radial_data->sy = gr->fill.h;
+   radial_data->s = radial_data->sx;
+   if (radial_data->sy > radial_data->sx)
+       radial_data->s = radial_data->sy;
+   radial_data->off = gr->map.offset;
+   radial_data->len = radial_data->s - (int)(radial_data->s * radial_data->r0);
+}
+
+static void
+radial_init_geom(RGBA_Gradient *gr)
+{
+   Radial_Data   *radial_data;
+   int    err = 1;
+   char   *s, *p, key[256];
+   float  r0;
+
+   if (!gr || (gr->type.geometer != &radial)) return;
+
+   radial_data = (Radial_Data *)gr->type.gdata;
+   if (!radial_data)
+     {
+       radial_data = calloc(1, sizeof(Radial_Data));
+       if (!radial_data)  return;
+       radial_data->r0 = 0.0;
+       radial_data->sx = 32;
+       radial_data->sy = 32;
+       radial_data->s = 32;
+       radial_data->off = 0.0;
+       radial_data->len = 32;
+     }
+   gr->type.gdata = radial_data;
+
+   if (!gr->type.params || !*(gr->type.params))
+       return;
+
+   s = strdup(gr->type.params);
+   if (!s) return;
+
+   r0 = radial_data->r0;
+   p = s;
+   while ((p = evas_common_gradient_get_key_fval(p, key, &r0)))
+     {
+       if (!strcmp(key, "inner_radius"))
+           err = 0;
+       else
+         {
+           err = 1;
+           break;
+         }
+     }
+   if (!err)
+     {
+       if (r0 < 0.0) r0 = 0.0;
+       if (r0 > 1.0) r0 = 1.0;
+       radial_data->r0 = r0;
+     }
+   free(s);
+}
+
+
+static int
+radial_has_alpha(RGBA_Gradient *gr, int op)
+{
+   Radial_Data   *radial_data;
+
+   if (!gr || (gr->type.geometer != &radial)) return 0;
+   if (gr->has_alpha | gr->map.has_alpha)
+       return 1;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+       return 0;
+   radial_data = (Radial_Data *)gr->type.gdata;
+   if (!radial_data) return 0;
+   if (radial_data->r0 > 0)
+       return 1;
+   if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
+         (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
+         (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) )
+       return 1;
+   return 0;
+}
+
+static int
+radial_has_mask(RGBA_Gradient *gr, int op)
+{
+   Radial_Data   *radial_data;
+
+   if (!gr || (gr->type.geometer != &radial)) return 0;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+     {
+       radial_data = (Radial_Data *)gr->type.gdata;
+       if (!radial_data) return 0;
+       if (radial_data->r0 > 0)
+           return 1;
+       if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
+             (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
+             (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) )
+           return 1;
+     }
+   return 0;
+}
+
+static int
+radial_get_map_len(RGBA_Gradient *gr)
+{
+   Radial_Data   *radial_data;
+
+   if (!gr || (gr->type.geometer != &radial)) return 0;
+   radial_data = (Radial_Data *)gr->type.gdata;
+   if (!radial_data) return 0;
+   return radial_data->len;
+}
+
+static Gfx_Func_Gradient_Fill
+radial_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa)
+{
+   Radial_Data   *radial_data;
+   Gfx_Func_Gradient_Fill  sfunc = NULL;
+   int masked_op = 0;
+
+   if (!gr || (gr->type.geometer != &radial)) return sfunc;
+   radial_data = (Radial_Data *)gr->type.gdata;
+   if (!radial_data) return sfunc;
+
+   radial_data->off = gr->map.offset;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+       masked_op = 1;
+
+   switch (gr->fill.spread)
+     {
+      case _EVAS_TEXTURE_REFLECT:
+       {
+        if (aa)
+          {
+            if (radial_data->r0 > 0)
+              {
+               if (masked_op)
+                  sfunc = radial_reflect_aa_masked;
+               else
+                  sfunc = radial_reflect_aa;
+              }
+            else
+               sfunc = radial_reflect_aa;
+          }
+        else
+          {
+            if (radial_data->r0 > 0)
+              {
+               if (masked_op)
+                  sfunc = radial_reflect_masked;
+               else
+                  sfunc = radial_reflect;
+              }
+            else
+               sfunc = radial_reflect;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_REPEAT:
+       {
+        if (aa)
+          {
+            if (radial_data->r0 > 0)
+              {
+               if (masked_op)
+                  sfunc = radial_repeat_aa_masked;
+               else
+                  sfunc = radial_repeat_aa;
+              }
+            else
+               sfunc = radial_repeat_aa;
+          }
+        else
+          {
+            if (radial_data->r0 > 0)
+              {
+               if (masked_op)
+                  sfunc = radial_repeat_masked;
+               else
+                  sfunc = radial_repeat;
+              }
+            else
+               sfunc = radial_repeat;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_RESTRICT:
+        radial_data->off = 0;
+      case _EVAS_TEXTURE_RESTRICT_REFLECT:
+       {
+        if (aa)
+          {
+            if (masked_op)
+               sfunc = radial_restrict_reflect_aa_masked;
+            else
+               sfunc = radial_restrict_reflect_aa;
+          }
+        else
+          {
+            if (masked_op)
+               sfunc = radial_restrict_reflect_masked;
+            else
+               sfunc = radial_restrict_reflect;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_RESTRICT_REPEAT:
+       {
+        if (aa)
+          {
+            if (masked_op)
+               sfunc = radial_restrict_repeat_aa_masked;
+            else
+               sfunc = radial_restrict_repeat_aa;
+          }
+        else
+          {
+            if (masked_op)
+               sfunc = radial_restrict_repeat_masked;
+            else
+               sfunc = radial_restrict_repeat;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_PAD:
+       {
+        if (aa)
+          {
+            if (masked_op)
+               sfunc = radial_pad_aa_masked;
+            else
+               sfunc = radial_pad_aa;
+          }
+        else
+          {
+            if (masked_op)
+               sfunc = radial_pad_masked;
+            else
+               sfunc = radial_pad;
+          }
+       }
+      break;
+      default:
+       sfunc = radial_reflect_aa;
+      break;
+     }
+   return sfunc;
+}
+
+#define SETUP_RADIAL_FILL \
+   if (gdata->sx != gdata->s) \
+     { \
+       axx = (gdata->s * axx) / gdata->sx; \
+       axy = (gdata->s * axy) / gdata->sx; \
+     } \
+   if (gdata->sy != gdata->s) \
+     { \
+       ayy = (gdata->s * ayy) / gdata->sy; \
+       ayx = (gdata->s * ayx) / gdata->sy; \
+     } \
+   xx = (axx * x) + (axy * y); \
+   yy = (ayx * x) + (ayy * y); \
+   rr0 = gdata->r0 * gdata->s; \
+   rr0 <<= 16;
+
+
+static void
+radial_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16);
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;
+       if (l >= 0)
+         {
+           l += off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                   l = src_len - l - 1;
+             }
+           *dst = src[l];
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16), lp;
+
+       *dst = 0;
+       if (l >= 0)
+         {
+           DATA32  a = 1 + ((ll - (l << 16)) >> 8), a0 = a;
+
+           lp = l + off;
+           if (lp < 0) { lp = -lp;  a = 257 - a; }
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                 { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+           *dst = src[lp];
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if ((l == 0) && rr0)
+               *dst = MUL_256(a0, *dst);
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                      int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16);
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;  *mask = 0;
+       if (l >= 0)
+         {
+           l += off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                   l = src_len - l - 1;
+             }
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                         int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16), lp;
+
+       *dst = 0;  *mask = 0;
+       if (l >= 0)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1;
+
+           lp = l + off;
+           if (lp < 0) { lp = -lp;  a = 257 - a; }
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                 { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+           *dst = src[lp];  *mask = 255;
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if ((l == 0) && rr0)
+               *mask = a0;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16);
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;
+       if (l >= 0)
+         {
+           l += off;
+           l = l % src_len;
+           if (l < 0)
+               l += src_len;
+           *dst = src[l];
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16), lp;
+
+       *dst = 0;
+       if (l >= 0)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+           lp = l + off;
+           lp = lp % src_len;
+           if (lp < 0)
+               lp += src_len;
+           *dst = src[lp];
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (lp == src_len - 1)
+               *dst = INTERP_256(a, src[0], *dst);
+           if ((l == 0) && rr0)
+               *dst = MUL_256(a, *dst);
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                     int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16);
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;  *mask = 0;
+       if (l >= 0)
+         {
+           l += off;
+           l = l % src_len;
+           if (l < 0)
+               l += src_len;
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                        int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16), lp;
+
+       *dst = 0;
+       if (l >= 0)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+           lp = l + off;
+           lp = lp % src_len;
+           if (lp < 0)
+               lp += src_len;
+           *dst = src[lp];  *mask = 255;
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (lp == src_len - 1)
+               *dst = INTERP_256(a, src[0], *dst);
+           if ((l == 0) && rr0)
+               *mask = a - 1;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                        int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16);
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                  l = src_len - l - 1;
+             }
+           *dst = src[l];
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16), lp;
+
+       *dst = 0;
+       if ((unsigned)l < src_len)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a;
+
+           lp = l + off;
+           if (lp < 0) { lp = -lp;  a = 257 - a; }
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                 { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+           *dst = src[lp];
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (l == (src_len - 1))
+               *dst = MUL_256(257 - a0, *dst);
+           if ((l == 0) && rr0)
+               *dst = MUL_256(a0, *dst);
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16);
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                  l = src_len - l - 1;
+             }
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16), lp;
+
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1;
+
+           lp = l + off;
+           if (lp < 0) { lp = -lp;  a = 257 - a; }
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                 { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+           *dst = src[lp];  *mask = 255;
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (l == (src_len - 1))
+               *mask = 255 - a0;
+           if ((l == 0) && rr0)
+               *mask = a0;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16);
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           l = (l % src_len);
+           if (l < 0)
+               l += src_len;
+           *dst = src[l];
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                          int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16), lp;
+
+       *dst = 0;
+       if ((unsigned)l < src_len)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+           lp = l + off;
+           lp = (lp % src_len);
+           if (lp < 0)
+               lp += src_len;
+           *dst = src[lp];
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (lp == (src_len - 1))
+               *dst = INTERP_256(a, src[0], *dst);
+           if (l == (src_len - 1))
+               *dst = MUL_256(257 - a, *dst);
+           if ((l == 0) && rr0)
+               *dst = MUL_256(a, *dst);
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16);
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           l = (l % src_len);
+           if (l < 0)
+               l += src_len;
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16), lp;
+
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+           lp = l + off;
+           lp = (lp % src_len);
+           if (lp < 0)
+               lp += src_len;
+           *dst = src[lp];  *mask = 255;
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (lp == (src_len - 1))
+               *dst = INTERP_256(a, src[0], *dst);
+           if (l == (src_len - 1))
+               *mask = 256 - a;
+           if ((l == 0) && rr0)
+               *mask = a - 1;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16);
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;
+       if (l >= 0)
+         {
+           if (l >= src_len)
+               l = src_len - 1;
+           *dst = src[l];
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16);
+       DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+       *dst = 0;
+       if ((unsigned)l < src_len)
+         {
+           *dst = src[l];
+           if (l + 1 < src_len)
+               *dst = INTERP_256(a, src[l + 1], src[l]);
+         }
+        if (l == 0)
+          {
+            *dst = src[0];
+            if (rr0)
+               *dst = MUL_256(a, *dst);
+          }
+        if (l >= src_len)
+          {
+            *dst = src[src_len - 1];
+          }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_pad_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16);
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;  *mask = 0;
+       if (l >= 0)
+         {
+           if (l >= src_len)
+               l = src_len - 1;
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+radial_pad_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                     int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Radial_Data  *gdata = (Radial_Data *)params_data;
+   int  xx, yy, rr0;
+
+   SETUP_RADIAL_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16);
+       DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           *dst = src[l];
+           if (l + 1 < src_len)
+               *dst = INTERP_256(a, src[l + 1], src[l]);
+         }
+       if (l == 0)
+         {
+           *dst = src[0];  *mask = 255;
+           if (rr0)
+               *mask = a - 1;
+         }
+       if (l >= src_len)
+         {
+           *dst = src[src_len - 1];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
diff --git a/src/lib/engines/common/evas_gradient_rectangular.c b/src/lib/engines/common/evas_gradient_rectangular.c
new file mode 100644 (file)
index 0000000..453d622
--- /dev/null
@@ -0,0 +1,1463 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include <math.h>
+
+#include "evas_common.h"
+#include "evas_gradient_private.h"
+
+
+typedef struct _Rectangular_Data   Rectangular_Data;
+struct _Rectangular_Data
+{
+   float  r0;
+
+   int    sx, sy, s;
+   float  off;
+   int    len;
+};
+
+static void
+rectangular_init(void);
+
+static void
+rectangular_shutdown(void);
+
+static void
+rectangular_init_geom(RGBA_Gradient *gr);
+
+static void
+rectangular_setup_geom(RGBA_Gradient *gr);
+
+static void
+rectangular_free_geom(void *gdata);
+
+static int
+rectangular_has_alpha(RGBA_Gradient *gr, int op);
+
+static int
+rectangular_has_mask(RGBA_Gradient *gr, int op);
+
+static int
+rectangular_get_map_len(RGBA_Gradient *gr);
+
+static Gfx_Func_Gradient_Fill
+rectangular_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa);
+
+static RGBA_Gradient_Type  rectangular = {"rectangular", rectangular_init, rectangular_shutdown,
+                                         rectangular_init_geom, rectangular_setup_geom, rectangular_free_geom,
+                                         rectangular_has_alpha, rectangular_has_mask,
+                                         rectangular_get_map_len, rectangular_get_fill_func};
+
+
+/** internal functions **/
+
+static void
+rectangular_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                    int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                      int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                         int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                             int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                             int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                    int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                            int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                      int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_pad_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+rectangular_pad_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                          int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+RGBA_Gradient_Type  *
+evas_common_gradient_rectangular_get(void)
+{
+    return &rectangular;
+}
+
+static void
+rectangular_init(void)
+{
+}
+
+static void
+rectangular_shutdown(void)
+{
+}
+
+static void
+rectangular_free_geom(void *gdata)
+{
+   Rectangular_Data *data = (Rectangular_Data *)gdata;
+   if (data) free(data);
+}
+
+static void
+rectangular_setup_geom(RGBA_Gradient *gr)
+{
+   Rectangular_Data   *rectangular_data;
+
+   if (!gr || (gr->type.geometer != &rectangular)) return;
+
+   rectangular_data = (Rectangular_Data *)gr->type.gdata;
+   if (!rectangular_data) return;
+   rectangular_data->sx = gr->fill.w;
+   rectangular_data->sy = gr->fill.h;
+   rectangular_data->s = rectangular_data->sx;
+   if (rectangular_data->sy > rectangular_data->sx)
+       rectangular_data->s = rectangular_data->sy;
+   rectangular_data->off = gr->map.offset;
+   rectangular_data->len = rectangular_data->s - (int)(rectangular_data->s * rectangular_data->r0);
+}
+
+static void
+rectangular_init_geom(RGBA_Gradient *gr)
+{
+   Rectangular_Data   *rectangular_data;
+   int    err = 1;
+   char   *s, *p, key[256];
+   float  r0;
+
+   if (!gr || (gr->type.geometer != &rectangular)) return;
+
+   rectangular_data = (Rectangular_Data *)gr->type.gdata;
+   if (!rectangular_data)
+     {
+       rectangular_data = calloc(1, sizeof(Rectangular_Data));
+       if (!rectangular_data)  return;
+       rectangular_data->r0 = 0.0;
+       rectangular_data->sx = 32;
+       rectangular_data->sy = 32;
+       rectangular_data->s = 32;
+       rectangular_data->off = 0.0;
+       rectangular_data->len = 32;
+     }
+   gr->type.gdata = rectangular_data;
+
+   if (!gr->type.params || !*(gr->type.params))
+       return;
+
+   s = strdup(gr->type.params);
+   if (!s) return;
+
+   r0 = rectangular_data->r0;
+   p = s;
+   while ((p = evas_common_gradient_get_key_fval(p, key, &r0)))
+     {
+       if (!strcmp(key, "inner_radius"))
+           err = 0;
+       else
+         {
+           err = 1;
+           break;
+         }
+     }
+   if (!err)
+     {
+       if (r0 < 0.0) r0 = 0.0;
+       if (r0 > 1.0) r0 = 1.0;
+       rectangular_data->r0 = r0;
+     }
+   free(s);
+}
+
+
+static int
+rectangular_has_alpha(RGBA_Gradient *gr, int op)
+{
+   Rectangular_Data   *rectangular_data;
+
+   if (!gr || (gr->type.geometer != &rectangular)) return 0;
+   if (gr->has_alpha | gr->map.has_alpha)
+       return 1;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+       return 0;
+   rectangular_data = (Rectangular_Data *)gr->type.gdata;
+   if (!rectangular_data) return 0;
+   if (rectangular_data->r0 > 0)
+       return 1;
+   if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
+         (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
+         (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) )
+       return 1;
+   return 0;
+}
+
+static int
+rectangular_has_mask(RGBA_Gradient *gr, int op)
+{
+   Rectangular_Data   *rectangular_data;
+
+   if (!gr || (gr->type.geometer != &rectangular)) return 0;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+     {
+       rectangular_data = (Rectangular_Data *)gr->type.gdata;
+       if (!rectangular_data) return 0;
+       if (rectangular_data->r0 > 0)
+           return 1;
+       if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
+             (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
+             (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) )
+           return 1;
+     }
+   return 0;
+}
+
+static int
+rectangular_get_map_len(RGBA_Gradient *gr)
+{
+   Rectangular_Data   *rectangular_data;
+
+   if (!gr || (gr->type.geometer != &rectangular)) return 0;
+   rectangular_data = (Rectangular_Data *)gr->type.gdata;
+   if (!rectangular_data) return 0;
+   return rectangular_data->len;
+}
+
+static Gfx_Func_Gradient_Fill
+rectangular_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa)
+{
+   Rectangular_Data   *rectangular_data;
+   Gfx_Func_Gradient_Fill  sfunc = NULL;
+   int masked_op = 0;
+
+   if (!gr || (gr->type.geometer != &rectangular))
+       return sfunc;
+   rectangular_data = (Rectangular_Data *)gr->type.gdata;
+   if (!rectangular_data) return sfunc;
+
+   rectangular_data->off = gr->map.offset;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+       masked_op = 1;
+   switch (gr->fill.spread)
+     {
+      case _EVAS_TEXTURE_REFLECT:
+       {
+        if (aa)
+          {
+           if (rectangular_data->r0 > 0)
+             {
+               if (masked_op)
+                  sfunc = rectangular_reflect_aa_masked;
+               else
+                  sfunc = rectangular_reflect_aa;
+             }
+           else
+               sfunc = rectangular_reflect_aa;
+          }
+        else
+          {
+           if (rectangular_data->r0 > 0)
+             {
+               if (masked_op)
+                  sfunc = rectangular_reflect_masked;
+               else
+                  sfunc = rectangular_reflect;
+             }
+           else
+               sfunc = rectangular_reflect;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_REPEAT:
+       {
+        if (aa)
+          {
+           if (rectangular_data->r0 > 0)
+             {
+               if (masked_op)
+                  sfunc = rectangular_repeat_aa_masked;
+               else
+                  sfunc = rectangular_repeat_aa;
+             }
+           else
+               sfunc = rectangular_repeat_aa;
+          }
+        else
+          {
+           if (rectangular_data->r0 > 0)
+             {
+               if (masked_op)
+                  sfunc = rectangular_repeat_masked;
+               else
+                  sfunc = rectangular_repeat;
+             }
+           else
+               sfunc = rectangular_repeat;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_RESTRICT:
+        rectangular_data->off = 0;
+      case _EVAS_TEXTURE_RESTRICT_REFLECT:
+       {
+        if (aa)
+          {
+           if (masked_op)
+               sfunc = rectangular_restrict_reflect_aa_masked;
+           else
+               sfunc = rectangular_restrict_reflect_aa;
+          }
+        else
+          {
+           if (masked_op)
+               sfunc = rectangular_restrict_reflect_masked;
+           else
+               sfunc = rectangular_restrict_reflect;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_RESTRICT_REPEAT:
+       {
+        if (aa)
+          {
+           if (masked_op)
+               sfunc = rectangular_restrict_repeat_aa_masked;
+           else
+               sfunc = rectangular_restrict_repeat_aa;
+          }
+        else
+          {
+           if (masked_op)
+               sfunc = rectangular_restrict_repeat_masked;
+           else
+               sfunc = rectangular_restrict_repeat;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_PAD:
+       {
+        if (aa)
+          {
+           if (rectangular_data->r0 > 0)
+             {
+               if (masked_op)
+                  sfunc = rectangular_pad_aa_masked;
+               else
+                  sfunc = rectangular_pad_aa;
+             }
+           else
+               sfunc = rectangular_pad_aa;
+          }
+        else
+          {
+           if (rectangular_data->r0 > 0)
+             {
+               if (masked_op)
+                  sfunc = rectangular_pad_masked;
+               else
+                  sfunc = rectangular_pad;
+             }
+           else
+               sfunc = rectangular_pad;
+          }
+       }
+      default:
+       sfunc = rectangular_reflect;
+      break;
+     }
+   return sfunc;
+}
+
+/* the fill functions */
+
+#ifdef BUILD_MMX
+#define INTERP_256_P2R(a, s, mma, mms, mmd, mmz) \
+           MOV_A2R(a, mma) \
+           MOV_P2R(s, mms, mmz) \
+           INTERP_256_R2R(mma, mms, mmd, mm5)
+
+#define MUL_256_A2R(a, mma, mmd, mmz) \
+       MOV_A2R(a, mma) \
+       MUL4_256_R2R(mma, mmd)
+#endif
+
+#define SETUP_RECT_FILL \
+   if (gdata->sx != gdata->s) \
+     { \
+       axx = (gdata->s * axx) / gdata->sx; \
+       axy = (gdata->s * axy) / gdata->sx; \
+     } \
+   if (gdata->sy != gdata->s) \
+     { \
+       ayy = (gdata->s * ayy) / gdata->sy; \
+       ayx = (gdata->s * ayx) / gdata->sy; \
+     } \
+   xx = (axx * x) + (axy * y); \
+   yy = (ayx * x) + (ayy * y); \
+   rr0 = gdata->r0 * gdata->s; \
+   rr0 <<= 16;
+
+static void
+rectangular_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                    int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;
+       if (l >= 0)
+         {
+           l += off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                   l = src_len - l - 1;
+             }
+           *dst = src[l];
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy, lp;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       *dst = 0;
+       if (l >= 0)
+         {
+           DATA32  a = 1 + ((ll - (l << 16)) >> 8), a0 = a;
+
+           lp = l + off;
+           if (lp < 0) { lp = -lp;  a = 257 - a; }
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                 { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];
+#endif
+           if (lp + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+             }
+           if ((l == 0) && rr0)
+             {
+#ifdef BUILD_MMX
+               MUL_256_A2R(a0, mm3, mm1, mm0)
+#else
+               *dst = MUL_256(a0, *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;  *mask = 0;
+       if (l >= 0)
+         {
+           l += off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                   l = src_len - l - 1;
+             }
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy, lp;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       *dst = 0;  *mask = 0;
+       if (l >= 0)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1;
+
+           lp = l + off;
+           if (lp < 0) { lp = -lp;  a = 257 - a; }
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                 { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];
+#endif
+           *mask = 255;
+           if (lp + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+           if ((l == 0) && rr0)
+               *mask = a0;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;
+       if (l >= 0)
+         {
+           l += off;
+           l = l % src_len;
+           if (l < 0)
+               l += src_len;
+          *dst = src[l];
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                      int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy, lp;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       *dst = 0;
+       if (l >= 0)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+           lp = l + off;
+           lp = lp % src_len;
+           if (lp < 0)
+               lp += src_len;
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];
+#endif
+           if (lp + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+             }
+           if (lp == (src_len - 1))
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[0], *dst);
+#endif
+             }
+           if ((l == 0) && rr0)
+             {
+#ifdef BUILD_MMX
+               MUL_256_A2R(a, mm3, mm1, mm0)
+#else
+               *dst = MUL_256(a, *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                          int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;  *mask = 0;
+       if (l >= 0)
+         {
+           l += off;
+           l = l % src_len;
+           if (l < 0)
+               l += src_len;
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                             int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy, lp;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       *dst = 0;  *mask = 0;
+       if (l >= 0)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+           lp = l + off;
+           lp = lp % src_len;
+           if (lp < 0)
+               lp += src_len;
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];
+#endif
+           *mask = 255;
+           if (lp + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+             }
+           if (lp == (src_len - 1))
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[0], *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+           if ((l == 0) && rr0)
+               *mask = a - 1;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                             int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                  l = src_len - l - 1;
+             }
+           *dst = src[l];
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                                int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy, lp;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       *dst = 0;
+       if ((unsigned)l < src_len)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a;
+
+           lp = l + off;
+           if (lp < 0) { lp = -lp;  a = 257 - a; }
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                 { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];
+#endif
+           if (lp + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+             }
+           if (l == (src_len - 1))
+             {
+#ifdef BUILD_MMX
+               a = 257 - a0;
+               MUL_256_A2R(a, mm3, mm1, mm0)
+#else
+               *dst = MUL_256(257 - a0, *dst);
+#endif
+             }
+           if ((l == 0) && rr0)
+             {
+#ifdef BUILD_MMX
+               MUL_256_A2R(a0, mm3, mm1, mm0)
+#else
+               *dst = MUL_256(a0, *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                    int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                  l = src_len - l - 1;
+             }
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy, lp;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1;
+
+           lp = l + off;
+           if (lp < 0) { lp = -lp;  a = 257 - a; }
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                 { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];
+#endif
+           *mask = 255;
+           if (lp + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+           if (l == (src_len - 1))
+               *mask = 255 - a0;
+           if ((l == 0) && rr0)
+               *mask = a0;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                            int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16);
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           l = (l % src_len);
+           if (l < 0)
+               l += src_len;
+           *dst = src[l];
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16), lp;
+
+       *dst = 0;
+       if ((unsigned)l < src_len)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8), a1 = 257 - a;
+
+           lp = l + off;
+           lp = (lp % src_len);
+           if (lp < 0)
+               lp += src_len;
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];
+#endif
+           if (lp + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+             }
+           if (lp == (src_len - 1))
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[0], *dst);
+#endif
+             }
+           if (l == (src_len - 1))
+             {
+#ifdef BUILD_MMX
+               MUL_256_A2R(a1, mm3, mm1, mm0)
+#else
+               *dst = MUL_256(a1, *dst);
+#endif
+             }
+           if ((l == 0) && rr0)
+             {
+#ifdef BUILD_MMX
+               MUL_256_A2R(a, mm3, mm1, mm0)
+#else
+               *dst = MUL_256(a, *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16);
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           l = (l % src_len);
+           if (l < 0)
+               l += src_len;
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                      int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+   int  off = gdata->off * (src_len - 1);
+
+   SETUP_RECT_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  ll = (hypot(xx, yy) - rr0);
+       int  l = (ll >> 16), lp;
+
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+           lp = l + off;
+           lp = (lp % src_len);
+           if (lp < 0)
+               lp += src_len;
+#ifdef BUILD_MMX
+           MOV_P2R(src[lp], mm1, mm0)
+#else
+           *dst = src[lp];
+#endif
+           *mask = 255;
+           if (lp + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+#endif
+             }
+           if (lp == (src_len - 1))
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[0], *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+           if (l == (src_len - 1))
+               *mask = 256 - a;
+           if ((l == 0) && rr0)
+               *mask = a - 1;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+
+static void
+rectangular_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+
+   SETUP_RECT_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;
+       if (l >= 0)
+         {
+          if (l >= src_len)
+              l = src_len - 1;
+          *dst = src[l];
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+
+   SETUP_RECT_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       *dst = 0;
+       if (l >= src_len) *dst = src[src_len - 1];
+       if ((unsigned)l < src_len)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+#ifdef BUILD_MMX
+           MOV_P2R(src[l], mm1, mm0)
+#else
+           *dst = src[l];
+#endif
+           if (l + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[l + 1], *dst);
+#endif
+             }
+           if ((l == 0) && rr0)
+             {
+#ifdef BUILD_MMX
+               MUL_256_A2R(a, mm3, mm1, mm0)
+#else
+               *dst = MUL_256(a, *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+         }
+       dst++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_pad_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                       int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+
+   SETUP_RECT_FILL
+
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       l += (ll - (l << 16)) >> 15;
+       *dst = 0;  *mask = 0;
+       if (l >= 0)
+         {
+          if (l >= src_len)
+              l = src_len - 1;
+          *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
+
+static void
+rectangular_pad_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                          int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Rectangular_Data  *gdata = (Rectangular_Data *)params_data;
+   int  xx, yy, rr0;
+
+   SETUP_RECT_FILL
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+#endif
+   while (dst < dst_end)
+     {
+       int  ll = xx, l = yy;
+
+       if (ll < 0)  ll = -ll;
+       if (l < 0)  l = -l;
+       if (ll < l)  ll = l;
+       ll = ll - rr0;  l = ll >> 16;
+
+       *dst = 0;  *mask = 0;
+       if (l >= src_len) { *dst = src[src_len - 1];  *mask = 255; }
+       if ((unsigned)l < src_len)
+         {
+           DATA32 a = 1 + ((ll - (l << 16)) >> 8);
+
+#ifdef BUILD_MMX
+           MOV_P2R(src[l], mm1, mm0)
+#else
+           *dst = src[l];
+#endif
+           *mask = 255;
+           if (l + 1 < src_len)
+             {
+#ifdef BUILD_MMX
+               INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0)
+#else
+               *dst = INTERP_256(a, src[l + 1], *dst);
+#endif
+             }
+#ifdef BUILD_MMX
+           MOV_R2P(mm1, *dst, mm0)
+#endif
+           if ((l == 0) && rr0)
+               *mask = a - 1;
+         }
+       dst++;  mask++;  xx += axx;  yy += ayx;
+     }
+}
diff --git a/src/lib/engines/common/evas_gradient_sinusoidal.c b/src/lib/engines/common/evas_gradient_sinusoidal.c
new file mode 100644 (file)
index 0000000..4cfc6f1
--- /dev/null
@@ -0,0 +1,838 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include <math.h>
+
+#include "evas_common.h"
+#include "evas_gradient_private.h"
+
+typedef struct _Sinusoidal_Data   Sinusoidal_Data;
+struct _Sinusoidal_Data
+{
+   float  amp, per;
+
+   float  sa, sp;
+   float  off;
+   int    len;
+};
+
+static void
+sinusoidal_init(void);
+
+static void
+sinusoidal_shutdown(void);
+
+static void
+sinusoidal_init_geom(RGBA_Gradient *gr);
+
+static void
+sinusoidal_setup_geom(RGBA_Gradient *gr);
+
+static void
+sinusoidal_free_geom(void *gdata);
+
+static int
+sinusoidal_has_alpha(RGBA_Gradient *gr, int op);
+
+static int
+sinusoidal_has_mask(RGBA_Gradient *gr, int op);
+
+static int
+sinusoidal_get_map_len(RGBA_Gradient *gr);
+
+static Gfx_Func_Gradient_Fill
+sinusoidal_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa);
+
+static RGBA_Gradient_Type  sinusoidal = {"sinusoidal", sinusoidal_init, sinusoidal_shutdown,
+                                        sinusoidal_init_geom, sinusoidal_setup_geom, sinusoidal_free_geom,
+                                        sinusoidal_has_alpha, sinusoidal_has_mask,
+                                        sinusoidal_get_map_len, sinusoidal_get_fill_func};
+
+
+/** internal functions **/
+
+static void
+sinusoidal_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+sinusoidal_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                      int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+sinusoidal_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+sinusoidal_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                     int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+sinusoidal_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                            int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+sinusoidal_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+sinusoidal_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+sinusoidal_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                      int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+sinusoidal_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+sinusoidal_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+sinusoidal_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+sinusoidal_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                     int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+sinusoidal_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+static void
+sinusoidal_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
+
+
+RGBA_Gradient_Type  *
+evas_common_gradient_sinusoidal_get(void)
+{
+    return &sinusoidal;
+}
+
+static void
+sinusoidal_init(void)
+{
+}
+
+static void
+sinusoidal_shutdown(void)
+{
+}
+
+static void
+sinusoidal_free_geom(void *gdata)
+{
+   Sinusoidal_Data *data = (Sinusoidal_Data *)gdata;
+   if (data) free(data);
+}
+
+static void
+sinusoidal_setup_geom(RGBA_Gradient *gr)
+{
+   Sinusoidal_Data   *sinusoidal_data;
+
+   if (!gr || (gr->type.geometer != &sinusoidal)) return;
+
+   sinusoidal_data = (Sinusoidal_Data *)gr->type.gdata;
+   if (!sinusoidal_data) return;
+   sinusoidal_data->sa = sinusoidal_data->amp * gr->fill.h;
+   sinusoidal_data->sp = sinusoidal_data->per * (M_PI / gr->fill.w);
+   sinusoidal_data->off = gr->map.offset;
+   sinusoidal_data->len = gr->fill.h;
+}
+
+static void
+sinusoidal_init_geom(RGBA_Gradient *gr)
+{
+   Sinusoidal_Data   *sinusoidal_data;
+   int    err = 1;
+   char   *s, *p, key[256];
+   float  amp, per, val;
+
+   if (!gr || (gr->type.geometer != &sinusoidal)) return;
+
+   sinusoidal_data = (Sinusoidal_Data *)gr->type.gdata;
+   if (!sinusoidal_data)
+     {
+       sinusoidal_data = calloc(1, sizeof(Sinusoidal_Data));
+       if (!sinusoidal_data)  return;
+       sinusoidal_data->amp = 1.0;
+       sinusoidal_data->per = 1.0;
+       sinusoidal_data->sa = 32;
+       sinusoidal_data->sp = M_PI / 32;
+       sinusoidal_data->off = 0.0;
+       sinusoidal_data->len = 32;
+     }
+   gr->type.gdata = sinusoidal_data;
+
+   if (!gr->type.params || !*(gr->type.params))
+       return;
+
+   s = strdup(gr->type.params);
+   if (!s) return;
+
+   amp = sinusoidal_data->amp;
+   per = sinusoidal_data->per;
+   p = s;
+   while ((p = evas_common_gradient_get_key_fval(p, key, &val)))
+     {
+       if (!strcmp(key, "amplitude"))
+         {
+           err = 0;
+           amp = val;
+         }
+       else if (!strcmp(key, "period"))
+         {
+           err = 0;
+           per = val;
+         }
+       else
+         {
+           err = 1;
+           break;
+         }
+     }
+   if (!err)
+     {
+       sinusoidal_data->amp = amp;
+       if (per < 0.0) per = -per;
+       sinusoidal_data->per = per;
+     }
+   free(s);
+}
+
+
+static int
+sinusoidal_has_alpha(RGBA_Gradient *gr, int op)
+{
+   if (!gr || (gr->type.geometer != &sinusoidal)) return 0;
+
+   if (gr->has_alpha | gr->map.has_alpha)
+       return 1;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+       return 0;
+   if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
+         (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
+         (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) )
+       return 1;
+   return 0;
+}
+
+static int
+sinusoidal_has_mask(RGBA_Gradient *gr, int op)
+{
+   if (!gr || (gr->type.geometer != &sinusoidal)) return 0;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+     {
+       if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
+             (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
+             (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) )
+           return 1;
+     }
+
+   return 0;
+}
+
+static int
+sinusoidal_get_map_len(RGBA_Gradient *gr)
+{
+   Sinusoidal_Data   *sinusoidal_data;
+
+   if (!gr || (gr->type.geometer != &sinusoidal)) return 0;
+   sinusoidal_data = (Sinusoidal_Data *)gr->type.gdata;
+   if (!sinusoidal_data) return 0;
+   return sinusoidal_data->len;
+}
+
+static Gfx_Func_Gradient_Fill
+sinusoidal_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa)
+{
+   Sinusoidal_Data   *sinusoidal_data;
+   Gfx_Func_Gradient_Fill  sfunc = NULL;
+   int masked_op = 0;
+
+   if (!gr || (gr->type.geometer != &sinusoidal))
+       return sfunc;
+   sinusoidal_data = (Sinusoidal_Data *)gr->type.gdata;
+   if (!sinusoidal_data) return sfunc;
+
+   sinusoidal_data->off = gr->map.offset;
+   if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
+         (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
+       masked_op = 1;
+
+   switch (gr->fill.spread)
+     {
+      case _EVAS_TEXTURE_REFLECT:
+       {
+        if (aa)
+           sfunc = sinusoidal_reflect_aa;
+        else
+           sfunc = sinusoidal_reflect;
+       }
+      break;
+      case _EVAS_TEXTURE_REPEAT:
+       {
+        if (aa)
+           sfunc = sinusoidal_repeat_aa;
+        else
+           sfunc = sinusoidal_repeat;
+       }
+      break;
+      case _EVAS_TEXTURE_RESTRICT:
+        sinusoidal_data->off = 0;
+      case _EVAS_TEXTURE_RESTRICT_REFLECT:
+       {
+        if (aa)
+          {
+           if (masked_op)
+               sfunc = sinusoidal_restrict_reflect_aa_masked;
+           else
+               sfunc = sinusoidal_restrict_reflect_aa;
+          }
+        else
+          {
+           if (masked_op)
+               sfunc = sinusoidal_restrict_reflect_masked;
+           else
+               sfunc = sinusoidal_restrict_reflect;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_RESTRICT_REPEAT:
+       {
+        if (aa)
+          {
+           if (masked_op)
+               sfunc = sinusoidal_restrict_repeat_aa_masked;
+           else
+               sfunc = sinusoidal_restrict_repeat_aa;
+          }
+        else
+          {
+           if (masked_op)
+               sfunc = sinusoidal_restrict_repeat_masked;
+           else
+               sfunc = sinusoidal_restrict_repeat;
+          }
+       }
+      break;
+      case _EVAS_TEXTURE_PAD:
+       {
+        if (aa)
+           sfunc = sinusoidal_pad_aa;
+        else
+           sfunc = sinusoidal_pad;
+       }
+      break;
+      default:
+       sfunc = sinusoidal_reflect_aa;
+      break;
+     }
+   return sfunc;
+}
+
+#define SETUP_SINU_FILL \
+   a00 = gdata->sp * (axx / 65536.0f); \
+   a01 = gdata->sp * (axy / 65536.0f); \
+   a10 = ayx / 65536.0f; \
+   a11 = ayy / 65536.0f; \
+   xf = (a00 * x) + (a01 * y); \
+   yf = (a10 * x) + (a11 * y);
+
+static void
+sinusoidal_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Sinusoidal_Data  *gdata = (Sinusoidal_Data *)params_data;
+   float  xf, yf, sa = gdata->sa;
+   float  a00, a01, a10, a11;
+   float  off = gdata->off * (src_len - 1);
+
+   SETUP_SINU_FILL
+
+   while (dst < dst_end)
+     {
+       int  l = (yf - (sa * sin(xf))) + off;
+
+       if (l < 0)  l = -l;
+        if (l >= src_len)
+          {
+           int  m = (l % (2 * src_len));
+
+           l = (l % src_len);
+           if (m >= src_len)
+               l = src_len - l - 1;
+          }
+       *dst++ = src[l];  xf += a00;  yf += a10;
+     }
+}
+
+static void
+sinusoidal_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                      int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Sinusoidal_Data  *gdata = (Sinusoidal_Data *)params_data;
+   float  xf, yf, sa = gdata->sa;
+   float  a00, a01, a10, a11;
+   float  off = gdata->off * (src_len - 1);
+
+   SETUP_SINU_FILL
+
+   while (dst < dst_end)
+     {
+       float  r = (yf - (sa * sin(xf))) + off;
+       int    l = r, a;
+
+       if (r < 0)  r = -r;
+       a = 1 + (int)(255 * (r - (int)r));
+
+       if (l < 0)  l = -l;
+       if (l >= src_len)
+         {
+           int  m = (l % (2 * src_len));
+
+           l = (l % src_len);
+           if (m >= src_len)
+               { l = src_len - l - 1;  a = 257 - a; }
+         }
+       *dst = src[l];
+       if (l + 1 < src_len)
+         *dst = INTERP_256(a, src[l + 1], *dst);
+
+       dst++;  xf += a00;  yf += a10;
+     }
+}
+
+static void
+sinusoidal_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Sinusoidal_Data  *gdata = (Sinusoidal_Data *)params_data;
+   float  xf, yf, sa = gdata->sa;
+   float  a00, a01, a10, a11;
+   float  off = gdata->off * (src_len - 1);
+
+   SETUP_SINU_FILL
+
+   while (dst < dst_end)
+     {
+       int  l = (yf - (sa * sin(xf))) + off;
+
+       l = (l % src_len);
+       if (l < 0)
+           l += src_len;
+       *dst++ = src[l];  xf += a00;  yf += a10;
+     }
+}
+
+static void
+sinusoidal_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                     int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Sinusoidal_Data  *gdata = (Sinusoidal_Data *)params_data;
+   float  xf, yf, sa = gdata->sa;
+   float  a00, a01, a10, a11;
+   float  off = gdata->off * (src_len - 1);
+
+   SETUP_SINU_FILL
+
+   while (dst < dst_end)
+     {
+       float  r = (yf - (sa * sin(xf))) + off;
+       int    l = r, a;
+
+       if (r < 0) r = -r;
+       a = 1 + (int)(255 * (r - (int)r));
+
+       l = l % src_len;
+       if (l < 0)
+         { l += src_len;  a = 257 - a; }
+
+       *dst = src[l];
+       if (l + 1 < src_len)
+          *dst = INTERP_256(a, src[l + 1], *dst);
+       if (l == (src_len - 1))
+          *dst = INTERP_256(a, src[0], *dst);
+       dst++;  xf += a00;  yf += a10;
+     }
+}
+
+static void
+sinusoidal_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                            int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Sinusoidal_Data  *gdata = (Sinusoidal_Data *)params_data;
+   float  xf, yf, sa = gdata->sa;
+   float  a00, a01, a10, a11;
+   float  off = gdata->off * (src_len - 1);
+
+   SETUP_SINU_FILL
+
+   while (dst < dst_end)
+     {
+       int  l = (yf - (sa * sin(xf)));
+
+       *dst = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                  l = src_len - l - 1;
+             }
+           *dst = src[l];
+         }
+       dst++;  xf += a00;  yf += a10;
+     }
+}
+
+static void
+sinusoidal_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Sinusoidal_Data  *gdata = (Sinusoidal_Data *)params_data;
+   float  xf, yf, sa = gdata->sa;
+   float  a00, a01, a10, a11;
+   float  off = gdata->off * (src_len - 1);
+
+   SETUP_SINU_FILL
+
+   while (dst < dst_end)
+     {
+       float  r = (yf - (sa * sin(xf))) + off, s = r - off;
+       int    l = s;
+
+       *dst = 0;
+       if ((unsigned)l < src_len)
+         {
+           int  a, lp = r;
+
+           if (r < 0)  r = -r;
+           a = 1 + (int)(255 * (r - (int)r));
+           if (lp < 0) lp = -lp;
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                 { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+           *dst = src[lp];
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if ((l == 0) && (s < 0))
+             {
+               a = 256 + (255 * s);
+               *dst = MUL_256(a, *dst);
+             }
+           if (l == (src_len - 1))
+             {
+               a = 256 - (255 * (s - l));
+               *dst = MUL_256(a, *dst);
+             }
+         }
+       dst++;  xf += a00;  yf += a10;
+     }
+}
+
+static void
+sinusoidal_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                   int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Sinusoidal_Data  *gdata = (Sinusoidal_Data *)params_data;
+   float  xf, yf, sa = gdata->sa;
+   float  a00, a01, a10, a11;
+   float  off = gdata->off * (src_len - 1);
+
+   SETUP_SINU_FILL
+
+   while (dst < dst_end)
+     {
+       int  l = (yf - (sa * sin(xf)));
+
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           if (l < 0) l = -l;
+           if (l >= src_len)
+             {
+               int  m = (l % (2 * src_len));
+
+               l = (l % src_len);
+               if (m >= src_len)
+                  l = src_len - l - 1;
+             }
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xf += a00;  yf += a10;
+     }
+}
+
+static void
+sinusoidal_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                      int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Sinusoidal_Data  *gdata = (Sinusoidal_Data *)params_data;
+   float  xf, yf, sa = gdata->sa;
+   float  a00, a01, a10, a11;
+   float  off = gdata->off * (src_len - 1);
+
+   SETUP_SINU_FILL
+
+   while (dst < dst_end)
+     {
+       float  r = (yf - (sa * sin(xf))) + off, s = r - off;
+       int    l = s;
+
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           int  a, lp = r;
+
+           if (r < 0)  r = -r;
+           a = 1 + (int)(255 * (r - (int)r));
+           if (lp < 0) lp = -lp;
+           if (lp >= src_len)
+             {
+               int  m = (lp % (2 * src_len));
+
+               lp = (lp % src_len);
+               if (m >= src_len)
+                 { lp = src_len - lp - 1;  a = 257 - a; }
+             }
+           *dst = src[lp];  *mask = 255;
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if ((l == 0) && (s < 0))
+               *mask = 255 + (255 * s);
+           if (l == (src_len - 1))
+               *mask = 255 - (255 * (s - l));
+         }
+       dst++;  mask++;  xf += a00;  yf += a10;
+     }
+}
+
+static void
+sinusoidal_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                           int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Sinusoidal_Data  *gdata = (Sinusoidal_Data *)params_data;
+   float  xf, yf, sa = gdata->sa;
+   float  a00, a01, a10, a11;
+   float  off = gdata->off * (src_len - 1);
+
+   SETUP_SINU_FILL
+
+   while (dst < dst_end)
+     {
+       int  l = (yf - (sa * sin(xf)));
+
+       *dst = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           l = l % src_len;
+           if (l < 0)
+               l += src_len;
+           *dst = src[l];
+         }
+       dst++;  xf += a00;  yf += a10;
+     }
+}
+
+static void
+sinusoidal_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                              int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Sinusoidal_Data  *gdata = (Sinusoidal_Data *)params_data;
+   float  xf, yf, sa = gdata->sa;
+   float  a00, a01, a10, a11;
+   float  off = gdata->off * (src_len - 1);
+
+   SETUP_SINU_FILL
+
+   while (dst < dst_end)
+     {
+       float  r = (yf - (sa * sin(xf))) + off, s = r - off;
+       int    l = s;
+
+       *dst = 0;
+       if ((unsigned)l < src_len)
+         {
+           int  a, lp = r;
+
+           if (r < 0)  r = -r;
+           a = 1 + (int)(255 * (r - (int)r));
+           lp = lp % src_len;
+           if (lp < 0)
+             { lp += src_len;  a = 257 - a; }
+           *dst = src[lp];
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (lp == (src_len - 1))
+               *dst = INTERP_256(a, src[0], *dst);
+           if ((l == 0) && (s < 0))
+             {
+               a = 256 + (255 * s);
+               *dst = MUL_256(a, *dst);
+             }
+           if (l == (src_len - 1))
+             {
+               a = 256 - (255 * (s - l));
+               *dst = MUL_256(a, *dst);
+             }
+         }
+       dst++;  xf += a00;  yf += a10;
+     }
+}
+
+static void
+sinusoidal_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Sinusoidal_Data  *gdata = (Sinusoidal_Data *)params_data;
+   float  xf, yf, sa = gdata->sa;
+   float  a00, a01, a10, a11;
+   float  off = gdata->off * (src_len - 1);
+
+   SETUP_SINU_FILL
+
+   while (dst < dst_end)
+     {
+       int  l = (yf - (sa * sin(xf)));
+
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           l += off;
+           l = l % src_len;
+           if (l < 0)
+               l += src_len;
+           *dst = src[l];  *mask = 255;
+         }
+       dst++;  mask++;  xf += a00;  yf += a10;
+     }
+}
+
+static void
+sinusoidal_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
+                                     int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Sinusoidal_Data  *gdata = (Sinusoidal_Data *)params_data;
+   float  xf, yf, sa = gdata->sa;
+   float  a00, a01, a10, a11;
+   float  off = gdata->off * (src_len - 1);
+
+   SETUP_SINU_FILL
+
+   while (dst < dst_end)
+     {
+       float  r = (yf - (sa * sin(xf))) + off, s = r - off;
+       int    l = s;
+
+       *dst = 0;  *mask = 0;
+       if ((unsigned)l < src_len)
+         {
+           int  a, lp = r;
+
+           if (r < 0)  r = -r;
+           a = 1 + (int)(255 * (r - (int)r));
+           lp = lp % src_len;
+           if (lp < 0)
+             { lp += src_len;  a = 257 - a; }
+           *dst = src[lp];  *mask = 255;
+           if (lp + 1 < src_len)
+               *dst = INTERP_256(a, src[lp + 1], *dst);
+           if (lp == (src_len - 1))
+               *dst = INTERP_256(a, src[0], *dst);
+           if ((l == 0) && (s < 0))
+               *mask = 255 + (255 * s);
+           if (l == (src_len - 1))
+               *mask = 255 - (255 * (s - l));
+         }
+       dst++;  mask++;  xf += a00;  yf += a10;
+     }
+}
+
+static void
+sinusoidal_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+               int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Sinusoidal_Data  *gdata = (Sinusoidal_Data *)params_data;
+   float  xf, yf, sa = gdata->sa;
+   float  a00, a01, a10, a11;
+
+   SETUP_SINU_FILL
+
+   while (dst < dst_end)
+     {
+       int  l = (yf - (sa * sin(xf)));
+
+       if (l < 0)
+           l = 0;
+       if (l >= src_len)
+           l = src_len - 1;
+       *dst = src[l];
+       dst++;  xf += a00;  yf += a10;
+     }
+}
+
+static void
+sinusoidal_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
+                  int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
+{
+   DATA32  *dst_end = dst + dst_len;
+   Sinusoidal_Data  *gdata = (Sinusoidal_Data *)params_data;
+   float  xf, yf, sa = gdata->sa;
+   float  a00, a01, a10, a11;
+
+   SETUP_SINU_FILL
+
+   while (dst < dst_end)
+     {
+       float  r = (yf - (sa * sin(xf)));
+       int    l = r;
+
+       *dst = 0;
+       if ((unsigned)l < (src_len - 1))
+         {
+           int  a;
+
+           if (r < 0) r = -r;
+           a = 1 + (int)(255 * (r - (int)r));
+           *dst = INTERP_256(a, src[l + 1], src[l]);
+         }
+       if (l < 0) *dst = src[0];
+       if (l >= src_len) *dst = src[src_len - 1];
+       dst++;  xf += a00;  yf += a10;
+     }
+}
diff --git a/src/lib/engines/common/evas_image.h b/src/lib/engines/common/evas_image.h
new file mode 100644 (file)
index 0000000..24e52b6
--- /dev/null
@@ -0,0 +1,58 @@
+#ifndef _EVAS_IMAGE_H
+#define _EVAS_IMAGE_H
+
+
+EAPI void              evas_common_image_init                      (void);
+EAPI void              evas_common_image_shutdown                  (void);
+
+EAPI void              evas_common_image_image_all_unload          (void);
+    
+EAPI void              evas_common_rgba_image_free                 (Image_Entry *ie);
+EAPI void              evas_common_rgba_image_unload               (Image_Entry *ie);
+EAPI void              evas_common_image_colorspace_normalize      (RGBA_Image *im);
+EAPI void              evas_common_image_colorspace_dirty          (RGBA_Image *im);
+EAPI void              evas_common_image_cache_free                (void); /*2*/
+EAPI void              evas_common_image_premul                    (Image_Entry *ie); /*2*/
+EAPI void              evas_common_image_set_alpha_sparse          (Image_Entry *ie); /*2*/
+/* EAPI RGBA_Image   *evas_common_image_alpha_create      (int w, int h); */
+/* EAPI RGBA_Image   *evas_common_image_create            (int w, int h); */
+EAPI RGBA_Image       *evas_common_image_new                       (int w, int h, int alpha);
+EAPI Evas_Cache_Image *evas_common_image_cache_get                 (void);
+
+EAPI void              evas_common_image_set_cache                 (int size);
+EAPI int               evas_common_image_get_cache                 (void);
+
+EAPI RGBA_Image       *evas_common_image_line_buffer_obtain        (int len);
+EAPI void              evas_common_image_line_buffer_release       (RGBA_Image *im);
+
+EAPI RGBA_Image       *evas_common_image_alpha_line_buffer_obtain  (int len);
+EAPI void              evas_common_image_alpha_line_buffer_release (RGBA_Image *im);
+EAPI void              evas_common_image_alpha_line_buffer_free    (RGBA_Image *im);
+
+EAPI RGBA_Image       *evas_common_load_image_from_file            (const char *file, const char *key, RGBA_Image_Loadopts *lo, int *error);
+EAPI int               evas_common_save_image_to_file              (RGBA_Image *im, const char *file, const char *key, int quality, int compress);
+
+EAPI void evas_common_rgba_image_scalecache_size_set(int size);
+EAPI int evas_common_rgba_image_scalecache_size_get(void);
+EAPI void evas_common_rgba_image_scalecache_flush(void);
+    
+EAPI void
+  evas_common_rgba_image_scalecache_prepare(Image_Entry *ie, RGBA_Image *dst,
+                                            RGBA_Draw_Context *dc, int smooth,
+                                            int src_region_x, int src_region_y,
+                                            int src_region_w, int src_region_h,
+                                            int dst_region_x, int dst_region_y,
+                                            int dst_region_w, int dst_region_h);
+EAPI void
+  evas_common_rgba_image_scalecache_do(Image_Entry *ie, RGBA_Image *dst,
+                                       RGBA_Draw_Context *dc, int smooth,
+                                       int src_region_x, int src_region_y,
+                                       int src_region_w, int src_region_h,
+                                       int dst_region_x, int dst_region_y,
+                                       int dst_region_w, int dst_region_h);
+
+
+EAPI int evas_common_load_rgba_image_module_from_file (Image_Entry *im);
+EAPI int evas_common_load_rgba_image_data_from_file   (Image_Entry *im);
+
+#endif /* _EVAS_IMAGE_H */
diff --git a/src/lib/engines/common/evas_image_data.c b/src/lib/engines/common/evas_image_data.c
new file mode 100644 (file)
index 0000000..afcf6ff
--- /dev/null
@@ -0,0 +1,128 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include <assert.h>
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+int
+evas_common_rgba_image_from_data(Image_Entry* ie_dst, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   RGBA_Image   *dst = (RGBA_Image *) ie_dst;
+
+   switch (cspace)
+     {
+     case EVAS_COLORSPACE_ARGB8888:
+       dst->cache_entry.w = w;
+       dst->cache_entry.h = h;
+       dst->image.data = image_data;
+       dst->image.no_free = 1;
+       dst->cache_entry.flags.alpha = alpha ? 1 : 0;
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       w &= ~0x1;
+       dst->cache_entry.w = w;
+       dst->cache_entry.h = h;
+       dst->cs.data = image_data;
+       dst->cs.no_free = 1;
+       break;
+      default:
+       abort();
+       break;
+     }
+   dst->cache_entry.space = cspace;
+   evas_common_image_colorspace_dirty(dst);
+   return 0;
+}
+
+int
+evas_common_rgba_image_from_copied_data(Image_Entry* ie_dst, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   RGBA_Image   *dst = (RGBA_Image *) ie_dst;
+
+   /* FIXME: Is dst->image.data valid. */
+   switch (cspace)
+     {
+     case EVAS_COLORSPACE_ARGB8888:
+       dst->cache_entry.flags.alpha = alpha ? 1 : 0;
+        if (image_data)
+          memcpy(dst->image.data, image_data, w * h * sizeof(DATA32));
+        break;
+     case EVAS_COLORSPACE_YCBCR422P601_PL:
+     case EVAS_COLORSPACE_YCBCR422P709_PL:
+        dst->cs.data = calloc(1, dst->cache_entry.h * sizeof(unsigned char*) * 2);
+        if (image_data && (dst->cs.data))
+          memcpy(dst->cs.data,  image_data, dst->cache_entry.h * sizeof(unsigned char*) * 2);
+        break;
+     default:
+        abort();
+        break;
+     }
+
+   dst->cache_entry.space = cspace;
+   evas_common_image_colorspace_dirty(dst);
+   return 0;
+}
+
+int
+evas_common_rgba_image_size_set(Image_Entry *ie_dst, const Image_Entry *ie_im, int w, int h __UNUSED__)
+{
+   RGBA_Image   *dst = (RGBA_Image *) ie_dst;
+   RGBA_Image   *im = (RGBA_Image *) ie_im;
+
+   if ((im->cache_entry.space == EVAS_COLORSPACE_YCBCR422P601_PL) ||
+       (im->cache_entry.space == EVAS_COLORSPACE_YCBCR422P709_PL))
+     w &= ~0x1;
+
+   dst->flags = im->flags;
+   dst->cs.no_free = 0;
+   if ((im->cache_entry.space == EVAS_COLORSPACE_YCBCR422P601_PL) ||
+       (im->cache_entry.space == EVAS_COLORSPACE_YCBCR422P709_PL))
+     dst->cs.data = calloc(1, dst->cache_entry.h * sizeof(unsigned char *) * 2);
+   evas_common_image_colorspace_dirty(dst);
+
+   return 0;
+}
+
+int
+evas_common_rgba_image_colorspace_set(Image_Entry* ie_dst, int cspace)
+{
+   RGBA_Image   *dst = (RGBA_Image *) ie_dst;
+
+   switch (cspace)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (dst->cs.data)
+         {
+            if (!dst->cs.no_free) free(dst->cs.data);
+            dst->cs.data = NULL;
+            dst->cs.no_free = 0;
+         }
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       if (dst->image.no_free)
+         {
+            dst->image.data = NULL;
+            dst->image.no_free = 0;
+             /* FIXME: Must allocate image.data surface cleanly. */
+         }
+       if (dst->cs.data)
+         {
+            if (!dst->cs.no_free) free(dst->cs.data);
+         }
+       dst->cs.data = calloc(1, dst->cache_entry.h * sizeof(unsigned char *) * 2);
+       dst->cs.no_free = 0;
+       break;
+      default:
+       abort();
+       break;
+     }
+   dst->cache_entry.space = cspace;
+   evas_common_image_colorspace_dirty(dst);
+
+   return 0;
+}
diff --git a/src/lib/engines/common/evas_image_fill_main.c b/src/lib/engines/common/evas_image_fill_main.c
new file mode 100644 (file)
index 0000000..f301c91
--- /dev/null
@@ -0,0 +1,213 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_object_image.h"
+#include "./evas_image_private.h"
+#include <math.h>
+
+static Gfx_Func_Image_Fill image_repeat_affine_get(void *pim, int render_op);
+static Gfx_Func_Image_Fill image_reflect_affine_get(void *pim, int render_op);
+static Gfx_Func_Image_Fill image_restrict_affine_get(void *pim, int render_op);
+static Gfx_Func_Image_Fill image_restrict_masked_affine_get(void *pim, int render_op);
+static Gfx_Func_Image_Fill image_pad_affine_get(void *pim, int render_op);
+
+int
+evas_common_image_draw_data_setup(void *pim, Image_Draw_Data *idata)
+{
+   Evas_Object_Image *oim = pim;
+   int fw, fh, sw, sh;
+   int l, r, t, b;
+   int smooth_scale;
+
+   if (!oim || !idata) return 0;
+   sw = oim->cur.image.w;  sh = oim->cur.image.h;
+   if ((sw < 1) || (sh < 1)) return 0;
+
+   fw = oim->cur.fill.w;  fh = oim->cur.fill.h;
+   if ((fw < 1) || (fh < 1)) return 0;
+
+   evas_common_cpu_end_opt();
+
+   if (fabs( (oim->cur.fill.transform.mxx * (double)oim->cur.fill.transform.myy) - 
+             (oim->cur.fill.transform.mxy * (double)oim->cur.fill.transform.myx) ) < 0.000030517578125)
+       return 0;
+
+   idata->has_alpha = oim->cur.has_alpha;
+   idata->border_center_fill = oim->cur.border.center_fill;
+   idata->fw = fw;  idata->fh = fh;
+
+   idata->axx = oim->cur.fill.transform.mxx * 65536;
+   idata->axy = oim->cur.fill.transform.mxy * 65536;
+   idata->axz = (oim->cur.fill.transform.mxz - oim->cur.fill.x) * 65536;
+   idata->ayx = oim->cur.fill.transform.myx * 65536;
+   idata->ayy = oim->cur.fill.transform.myy * 65536;
+   idata->ayz = (oim->cur.fill.transform.myz - oim->cur.fill.y) * 65536;
+
+   l = oim->cur.border.l;  r = oim->cur.border.r;
+   t = oim->cur.border.t;  b = oim->cur.border.b;
+   if (l < 0) l = 0;  if (r < 0) r = 0;
+   if (t < 0) t = 0;  if (b < 0) b = 0;
+
+   if (((sw == fw) && (sh == fh)) && idata->border_center_fill)
+       l = r = t = b = 0;
+
+   if ((l > 0) || (r > 0) || (t > 0) || (b > 0))
+     {
+       int  bw = MIN(sw, fw);
+       int  bh = MIN(sh, fh);
+
+       if ((l + r) > bw)
+         {
+           l = (l + (bw - r) + 1) / 2;
+           r = bw - l;
+         }
+       if ((t + b) > bh)
+         {
+           t = (t + (bh - b) + 1) / 2;
+           b = bh - t;
+         }
+     }
+   idata->l = l;  idata->r = r;
+   idata->t = t;  idata->b = b;
+
+   idata->iaxx = idata->iayy = idata->ibxx = idata->ibyy = 65536;
+   idata->dax = idata->day = 256;
+
+   if ((sw == fw) && (sh == fh))  // no fill scaling
+       return 1;
+
+   if (!oim->cur.smooth_scale || ((sw <= fw) && (sh <= fh)))  // up-x, up-y
+     {
+       if (((sw - (l + r)) > 1) & ((fw - (l + r)) > 1))
+          idata->iaxx = (((sw - (l + r)) - 1) << 16) / ((fw - (l + r)) - 1);
+       else if (((sw - (l + r)) > 0) & ((fw - (l + r)) > 0))
+          idata->iaxx = ((sw - (l + r)) << 16) / (fw - (l + r));
+       else
+          idata->iaxx = 0;
+       if (((sh - (t + b)) > 1) & ((fh - (t + b)) > 1))
+          idata->iayy = (((sh - (t + b)) - 1) << 16) / ((fh - (t + b)) - 1);
+       else if (((sh - (t + b)) > 0) & ((fh - (t + b)) > 0))
+          idata->iayy = ((sh - (t + b)) << 16) / (fh - (t + b));
+       else
+          idata->iayy = 0;
+       return 1;
+     }
+   if ((sw > fw) && (sh <= fh))  // down-x, up-y
+     {
+       if (((sw - (l + r)) > 0) & ((fw - (l + r)) > 0))
+         {
+           idata->iaxx = ((sw - (l + r) + 0.5) * 65536) / (fw - (l + r) + 0.5);
+           idata->ibxx = ((fw - (l + r) + 0.5) * 65536) / (sw - (l + r) + 0.5);
+         }
+       else
+         {
+           idata->iaxx = 0;
+           idata->ibxx = 0;
+         }
+       idata->dax = idata->ibxx >> 8;
+       if (((sh - (t + b)) > 1) & ((fh - (t + b)) > 1))
+          idata->iayy = (((sh - (t + b)) - 1) << 16) / ((fh - (t + b)) - 1);
+       else if (((sh - (t + b)) > 0) & ((fh - (t + b)) > 0))
+          idata->iayy = ((sh - (t + b)) << 16) / (fh - (t + b));
+       else
+          idata->iayy = 0;
+       return 1;
+     }
+   if ((sw <= fw) && (sh > fh))  // up-x, down-y
+     {
+       if (((sw - (l + r)) > 1) & ((fw - (l + r)) > 1))
+          idata->iaxx = (((sw - (l + r)) - 1) << 16) / ((fw - (l + r)) - 1);
+       else if (((sw - (l + r)) > 0) & ((fw - (l + r)) > 0))
+          idata->iaxx = ((sw - (l + r)) << 16) / (fw - (l + r));
+       else
+          idata->iaxx = 0;
+       if (((sh - (t + b)) > 0) & ((fh - (t + b)) > 0))
+         {
+           idata->iayy = ((sh - (t + b) + 0.5) * 65536) / (fh - (t + b) + 0.5);
+           idata->ibyy = ((fh - (t + b) + 0.5) * 65536) / (sh - (t + b) + 0.5);
+         }
+       else
+         {
+           idata->iayy = 0;
+           idata->ibyy = 0;
+         }
+       idata->day = idata->ibyy >> 8;
+       return 1;
+     }
+   if ((sw > fw) && (sh > fh))   // down-x, down-y
+     {
+       if (((sw - (l + r)) > 0) & ((fw - (l + r)) > 0))
+         {
+           idata->iaxx = ((sw - (l + r) + 0.5) * 65536) / (fw - (l + r) + 0.5);
+           idata->ibxx = ((fw - (l + r) + 0.5) *65536) / (sw - (l + r) + 0.5);
+         }
+       else
+         {
+           idata->iaxx = 0;
+           idata->ibxx = 0;
+         }
+       idata->dax = idata->ibxx >> 8;
+       if (((sh - (t + b)) > 0) & ((fh - (t + b)) > 0))
+         {
+           idata->iayy = ((sh - (t + b) + 0.5) * 65536) / (fh - (t + b) + 0.5);
+           idata->ibyy = ((fh - (t + b) + 0.5) * 65536) / (sh - (t + b) + 0.5);
+         }
+       else
+         {
+           idata->iayy = 0;
+           idata->ibyy = 0;
+         }
+       idata->day = idata->ibyy >> 8;
+       return 1;
+     }
+   return 0;
+}
+
+
+EAPI Gfx_Func_Image_Fill
+evas_common_image_fill_func_get(void *pim, int render_op)
+{
+  Evas_Object_Image *oim = pim;
+  RGBA_Image *im;
+  Gfx_Func_Image_Fill  sfunc = NULL;
+  int masked_op = 0;
+  
+  if (!oim) return sfunc;
+  im = oim->engine_data;
+  if (!im) return sfunc;
+  
+  if ( (render_op == _EVAS_RENDER_COPY) || (render_op == _EVAS_RENDER_COPY_REL) || 
+       (render_op == _EVAS_RENDER_MASK) || (render_op == _EVAS_RENDER_MUL) )
+    masked_op = 1;
+  
+  switch (oim->cur.fill.spread)
+    {
+    case _EVAS_TEXTURE_REPEAT:
+      sfunc = image_repeat_affine_get(oim, render_op);
+      break;
+    case _EVAS_TEXTURE_REFLECT:
+      sfunc = image_reflect_affine_get(oim, render_op);
+      break;
+    case _EVAS_TEXTURE_RESTRICT:
+      if (masked_op)
+        sfunc = image_restrict_masked_affine_get(oim, render_op);
+      else
+        sfunc = image_restrict_affine_get(oim, render_op);
+      break;
+    case _EVAS_TEXTURE_PAD:
+      sfunc = image_pad_affine_get(oim, render_op);
+      break;
+    default:
+      sfunc = image_repeat_affine_get(oim, render_op);
+      break;
+    }
+  return sfunc;
+}
+
+
+/* FIXME: optimize identity transform case for all modes */
+/* FIXME: have direct support for 'no-center-fill' for all modes */
+
+#include "./evas_image_fill_restrict.c"
+#include "./evas_image_fill_repeat.c"
+#include "./evas_image_fill_reflect.c"
+#include "./evas_image_fill_pad.c"
diff --git a/src/lib/engines/common/evas_image_load.c b/src/lib/engines/common/evas_image_load.c
new file mode 100644 (file)
index 0000000..410d713
--- /dev/null
@@ -0,0 +1,254 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_cs.h"
+
+struct ext_loader_s {
+   const char* extention;
+   const char* loader;
+};
+
+static struct ext_loader_s     const loaders[] = {
+   { "png", "png" },
+   { "jpg", "jpeg" },
+   { "jpeg", "jpeg" },
+   { "jfif", "jpeg" },
+   { "eet", "eet" },
+   { "edj", "eet" },
+   { "eap", "eet" },
+   { "edb", "edb" },
+   { "xpm", "xpm" },
+   { "tiff", "tiff" },
+   { "tif", "tiff" },
+   { "svg", "svg" },
+   { "svgz", "svg" },
+   { "gif", "gif" },
+   { "pbm", "pmaps" },
+   { "pgm", "pmaps" },
+   { "ppm", "pmaps" },
+   { "pnm", "pmaps" }
+};
+
+static const char *loaders_name[] = {
+  "png", "jpeg", "eet", "xpm", "tiff", "gif", "svg", "pmaps", "edb"
+};
+
+struct evas_image_foreach_loader_data
+{
+   Image_Entry *ie;
+   int *error;
+   Evas_Module *em;
+};
+
+
+static Eina_Bool
+_evas_image_foreach_loader(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata)
+{
+   Evas_Image_Load_Func *evas_image_load_func = NULL;
+   Evas_Module *em = data;
+   struct evas_image_foreach_loader_data *d = fdata;
+   Image_Entry *ie = d->ie;
+
+   if (!evas_module_load(em)) return EINA_TRUE;
+   evas_image_load_func = em->functions;
+   evas_module_use(em);
+   *(d->error) = EVAS_LOAD_ERROR_NONE;
+   if (evas_image_load_func &&
+       evas_image_load_func->file_head(ie, ie->file, ie->key, d->error) &&
+       (*(d->error) == EVAS_LOAD_ERROR_NONE))
+     {
+       d->em = em;
+       return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+}
+
+EAPI int
+evas_common_load_rgba_image_module_from_file(Image_Entry *ie)
+{
+   Evas_Image_Load_Func *evas_image_load_func = NULL;
+   const char           *loader = NULL;
+   Evas_Module          *em;
+   char                 *dot;
+   int                   i;
+   int                   ret = EVAS_LOAD_ERROR_NONE;
+   struct evas_image_foreach_loader_data fdata;
+
+
+#ifdef EVAS_CSERVE
+   if (evas_cserve_use_get())
+     {
+       // TODO: handle errors from server and return them?
+       DBG("try cserve '%s' '%s'", ie->file, ie->key ? ie->key : "");
+        if (evas_cserve_image_load(ie, ie->file, ie->key, &(ie->load_opts)))
+          {
+            DBG("try cserve '%s' '%s' loaded!",
+                ie->file, ie->key ? ie->key : "");
+             return EVAS_LOAD_ERROR_NONE;
+          }
+     }
+#endif   
+   dot = strrchr (ie->file, '.');
+   if (dot)
+     {
+       for (i = 0, ++dot; i < (sizeof (loaders) / sizeof (struct ext_loader_s)); ++i)
+         {
+            if (!strcasecmp(dot, loaders[i].extention))
+              {
+                 loader = loaders[i].loader;
+                 DBG("known loader '%s' handles extension '%s' of file '%s'",
+                     loader, dot, ie->file);
+                 break;
+              }
+         }
+     }
+
+   if (loader)
+     {
+       em = evas_module_find_type(EVAS_MODULE_TYPE_IMAGE_LOADER, loader);
+       if (em)
+         {
+            DBG("found image loader '%s' (%p)", loader, em);
+            if (evas_module_load(em))
+              {
+                 evas_module_use(em);
+                 evas_image_load_func = em->functions;
+                 ret = EVAS_LOAD_ERROR_NONE;
+                 if (evas_image_load_func->file_head(ie, ie->file, ie->key, &ret))
+                   {
+                      DBG("loaded file head using module '%s' (%p): %s",
+                          loader, em, ie->file);
+                      goto end;
+                   }
+                 evas_module_unload(em);
+                 DBG("failed to load file head using module '%s' (%p): "
+                     "%s (%s)",
+                     loader, em, ie->file, evas_load_error_str(ret));
+              }
+            else
+              WRN("failed to load module '%s' (%p)", loader, em);
+         }
+       else
+         DBG("image loader '%s' is not enabled or missing!", loader);
+     }
+
+   fdata.ie = ie;
+   fdata.error = &ret;
+   fdata.em = NULL;
+   ret = EVAS_LOAD_ERROR_NONE;
+   evas_module_foreach_image_loader(_evas_image_foreach_loader, &fdata);
+   em = fdata.em;
+   evas_image_load_func = em ? em->functions : NULL;
+   if (em) goto end;
+
+   /* This is our last chance, try all known image loader. */
+   /* FIXME: We could use eina recursive module search ability. */
+   for (i = 0; i < sizeof (loaders_name) / sizeof (char *); i++)
+     {
+       em = evas_module_find_type(EVAS_MODULE_TYPE_IMAGE_LOADER, loaders_name[i]);
+       if (em)
+         {
+            if (evas_module_load(em))
+              {
+                 evas_module_use(em);
+                 evas_image_load_func = em->functions;
+                 ret = EVAS_LOAD_ERROR_NONE;
+                 if (evas_image_load_func->file_head(ie, ie->file, ie->key, &ret))
+                   {
+                      DBG("brute force loader '%s' (%p) worked on %s",
+                          loaders_name[i], em, ie->file);
+                      goto end;
+                   }
+                 else
+                   DBG("brute force loader '%s' (%p) failed on %s (%s)",
+                       loaders_name[i], em, ie->file,
+                       evas_load_error_str(ret));
+
+                 evas_module_unload(em);
+              }
+            else
+              WRN("failed to load module '%s' (%p)", loaders_name[i], em);
+         }
+       else
+         DBG("could not find module '%s'", loaders_name[i]);
+     }
+
+   DBG("exhausted all means to load image '%s'", ie->file);
+   return EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+
+   end:
+
+   if (ret != EVAS_LOAD_ERROR_NONE)
+     {
+       const char *modname = NULL;
+       int modversion = -1;
+       if (em && em->definition)
+         {
+            modname = em->definition->name;
+            modversion = em->definition->version;
+         }
+       WRN("loader '%s' (version %d) "
+           "handled file '%s', key '%s' with errors: %s",
+           modname ? modname : "<UNKNOWN>", modversion,
+           ie->file, ie->key ? ie->key : "",
+           evas_load_error_str(ret));
+       goto end;
+     }
+
+   DBG("loader '%s' used for file %s",
+       (em && em->definition && em->definition->name) ?
+       em->definition->name : "<UNKNOWN>",
+       ie->file);
+
+   ie->info.module = (void*) em;
+   ie->info.loader = (void*) evas_image_load_func;
+   evas_module_ref((Evas_Module*) ie->info.module);
+   return ret;
+}
+
+EAPI int
+evas_common_load_rgba_image_data_from_file(Image_Entry *ie)
+{
+   Evas_Image_Load_Func *evas_image_load_func = NULL;
+   int ret = EVAS_LOAD_ERROR_NONE;
+
+   if (ie->flags.loaded) return EVAS_LOAD_ERROR_GENERIC;
+
+#ifdef EVAS_CSERVE
+   if (ie->data1)
+     {
+        if (evas_cserve_image_data_load(ie))
+          {
+             RGBA_Image *im = (RGBA_Image *)ie;
+             Mem *mem = ie->data2;
+             if (mem)
+               {
+                 im->image.data = (void*) (mem->data + mem->offset);
+                  im->image.no_free = 1;
+                  return EVAS_LOAD_ERROR_NONE;
+               }
+          }
+       return EVAS_LOAD_ERROR_GENERIC;
+     }
+#endif
+
+   if (!ie->info.module) return EVAS_LOAD_ERROR_GENERIC;
+
+//   printf("load data [%p] %s %s\n", ie, ie->file, ie->key);
+           
+   evas_image_load_func = ie->info.loader;
+   evas_module_use((Evas_Module*) ie->info.module);
+   if (!evas_image_load_func->file_data(ie, ie->file, ie->key, &ret))
+     {
+        return ret;
+     }
+
+//   evas_module_unref((Evas_Module*) ie->info.module);
+//   ie->info.module = NULL;
+
+   return EVAS_LOAD_ERROR_NONE;
+}
diff --git a/src/lib/engines/common/evas_image_main.c b/src/lib/engines/common/evas_image_main.c
new file mode 100644 (file)
index 0000000..899a769
--- /dev/null
@@ -0,0 +1,701 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"  /* so that EAPI in Eet.h is correctly defined */
+#endif
+
+#ifdef BUILD_LOADER_EET
+# include <Eet.h>
+#endif
+
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_image_private.h"
+#include "evas_convert_yuv.h"
+#include "evas_cs.h"
+
+#ifdef HAVE_VALGRIND
+# include <memcheck.h>
+#endif
+
+static Evas_Cache_Image * eci = NULL;
+static int                reference = 0;
+
+/* static RGBA_Image *evas_rgba_line_buffer = NULL; */
+
+#define  EVAS_RGBA_LINE_BUFFER_MIN_LEN  256
+#define  EVAS_RGBA_LINE_BUFFER_MAX_LEN  2048
+
+/* static RGBA_Image *evas_alpha_line_buffer = NULL; */
+
+#define  EVAS_ALPHA_LINE_BUFFER_MIN_LEN  256
+#define  EVAS_ALPHA_LINE_BUFFER_MAX_LEN  2048
+
+
+static Image_Entry      *_evas_common_rgba_image_new(void);
+static void              _evas_common_rgba_image_delete(Image_Entry *ie);
+
+static int               _evas_common_rgba_image_surface_alloc(Image_Entry *ie, int w, int h);
+static void              _evas_common_rgba_image_surface_delete(Image_Entry *ie);
+static DATA32           *_evas_common_rgba_image_surface_pixels(Image_Entry *ie);
+
+static void              _evas_common_rgba_image_unload(Image_Entry *im);
+
+static void              _evas_common_rgba_image_dirty_region(Image_Entry *im, int x, int y, int w, int h);
+
+static int               _evas_common_rgba_image_ram_usage(Image_Entry *ie);
+
+/* Only called when references > 0. Need to provide a fresh copie of im. */
+/* The destination surface does have a surface, but no allocated pixel data. */
+static int               _evas_common_rgba_image_dirty(Image_Entry* dst, const Image_Entry* src);
+
+#if 0
+static void
+_evas_common_rgba_image_debug(const char* context, Image_Entry *eim)
+{
+  DBG("%p = [%s] {%s,%s} %i [%i|%i]", eim, context, eim->file, eim->key, eim->references, eim->w, eim->h);
+}
+#endif
+
+static const Evas_Cache_Image_Func      _evas_common_image_func =
+{
+  _evas_common_rgba_image_new,
+  _evas_common_rgba_image_delete,
+  _evas_common_rgba_image_surface_alloc,
+  _evas_common_rgba_image_surface_delete,
+  _evas_common_rgba_image_surface_pixels,
+  evas_common_load_rgba_image_module_from_file,
+  _evas_common_rgba_image_unload,
+  _evas_common_rgba_image_dirty_region,
+  _evas_common_rgba_image_dirty,
+  evas_common_rgba_image_size_set,
+  evas_common_rgba_image_from_copied_data,
+  evas_common_rgba_image_from_data,
+  evas_common_rgba_image_colorspace_set,
+  evas_common_load_rgba_image_data_from_file,
+  _evas_common_rgba_image_ram_usage,
+/*   _evas_common_rgba_image_debug */
+  NULL
+};
+
+EAPI void
+evas_common_image_init(void)
+{
+   if (!eci)
+     eci = evas_cache_image_init(&_evas_common_image_func);
+   reference++;
+////   ERR("REF++=%i", reference);
+
+#ifdef BUILD_LOADER_EET
+   eet_init();
+#endif
+   evas_common_scalecache_init();
+}
+
+EAPI void
+evas_common_image_shutdown(void)
+{
+   if (--reference == 0)
+     {
+////   printf("REF--=%i\n", reference);
+// DISABLE for now - something wrong with cache shutdown freeing things
+// still in use - rage_thumb segv's now.
+//
+// actually - i think i see it. cache ref goes to 0 (and thus gets freed)
+// because in eng_setup() when a buffer changes size it is FIRST freed
+// THEN allocated again - thus brignhjing ref to 0 then back to 1 immediately
+// where it should stay at 1. - see evas_engine.c in the buffer enigne for
+// example. eng_output_free() is called BEFORE _output_setup(). although this
+// is only a SIGNE of the problem. we can patch this up with either freeing
+// after the setup (so we just pt a ref of 2 then back to 1), or just
+// evas_common_image_init() at the start and evas_common_image_shutdown()
+// after it all. really ref 0 should only be reached when no more canvases
+// with no more objects exist anywhere.
+
+// ENABLE IT AGAIN, hope it is fixed. Gustavo @ January 22nd, 2009.
+       evas_cache_image_shutdown(eci);
+       eci = NULL;
+     }
+
+#ifdef BUILD_LOADER_EET
+   eet_shutdown();
+#endif
+   evas_common_scalecache_shutdown();
+}
+
+EAPI void
+evas_common_image_image_all_unload(void)
+{
+   evas_common_rgba_image_scalecache_flush();
+   evas_cache_image_unload_all(eci);
+}
+
+static Image_Entry *
+_evas_common_rgba_image_new(void)
+{
+   RGBA_Image *im;
+
+   im = calloc(1, sizeof(RGBA_Image));
+   if (!im) return NULL;
+   im->flags = RGBA_IMAGE_NOTHING;
+   im->ref = 1;
+   evas_common_rgba_image_scalecache_init(&im->cache_entry);
+   return &im->cache_entry;
+}
+
+static void
+_evas_common_rgba_image_delete(Image_Entry *ie)
+{
+   RGBA_Image   *im = (RGBA_Image *) ie;
+
+#ifdef BUILD_PIPE_RENDER
+   evas_common_pipe_free(im);
+#endif   
+   evas_common_rgba_image_scalecache_shutdown(&im->cache_entry);
+   if (ie->info.module) evas_module_unref((Evas_Module *)ie->info.module);
+   /* memset the image to 0x99 because i recently saw a segv where an
+    * seemed to be used BUT its contents were wrong - it looks like it was
+    * overwritten by something from efreet - as there was an execute command
+    * for a command there and some other signs - but to make sure, I am
+    * going to empty this struct out in case this happens again so i know
+    * that something else is overwritign this struct - or not */
+//   memset(im, 0x99, sizeof(im));
+#ifdef EVAS_CSERVE
+   if (ie->data1) evas_cserve_image_free(ie);
+#endif   
+   free(im);
+}
+
+EAPI void
+evas_common_rgba_image_free(Image_Entry *ie)
+{
+   _evas_common_rgba_image_surface_delete(ie);
+   _evas_common_rgba_image_delete(ie);
+}
+
+EAPI void
+evas_common_rgba_image_unload(Image_Entry *ie)
+{
+   RGBA_Image   *im = (RGBA_Image *) ie;
+
+   evas_cache_image_preload_cancel(ie, NULL);
+
+   if (!ie->flags.loaded) return;
+   if ((!ie->info.module) && (!ie->data1)) return;
+   if (!ie->file) return;
+
+   ie->flags.loaded = 0;
+
+   if ((im->cs.data) && (im->image.data))
+     {
+       if (im->cs.data != im->image.data)
+         {
+            if (!im->cs.no_free) free(im->cs.data);
+         }
+     }
+   else if (im->cs.data)
+     {
+       if (!im->cs.no_free) free(im->cs.data);
+     }
+   im->cs.data = NULL;
+
+#ifdef EVAS_CSERVE
+   if (ie->data1)
+     {
+        evas_cserve_image_useless(ie);
+        im->image.data = NULL;
+        ie->allocated.w = 0;
+        ie->allocated.h = 0;
+        return;
+     }
+#endif   
+   
+   if (im->image.data && !im->image.no_free)
+     free(im->image.data);
+   im->image.data = NULL;
+   ie->allocated.w = 0;
+   ie->allocated.h = 0;
+}
+
+static int
+_evas_common_rgba_image_surface_alloc(Image_Entry *ie, int w, int h)
+{
+   RGBA_Image   *im = (RGBA_Image *) ie;
+   size_t        siz = 0;
+
+#ifdef EVAS_CSERVE
+   if (ie->data1) return 0;
+#endif   
+   if (im->image.no_free) return 0;
+
+   if (im->flags & RGBA_IMAGE_ALPHA_ONLY)
+     siz = w * h * sizeof(DATA8);
+   else
+     siz = w * h * sizeof(DATA32);
+
+   if (im->image.data) free(im->image.data);
+   im->image.data = malloc(siz);
+   if (im->image.data == NULL) return -1;
+
+#ifdef HAVE_VALGRIND
+# ifdef VALGRIND_MAKE_READABLE
+   VALGRIND_MAKE_READABLE(im->image.data, siz);
+# else
+#  ifdef VALGRIND_MAKE_MEM_DEFINED
+   VALGRIND_MAKE_MEM_DEFINED(im->image.data, siz);
+#  endif
+# endif
+#endif
+
+   return 0;
+}
+
+static void
+_evas_common_rgba_image_surface_delete(Image_Entry *ie)
+{
+   RGBA_Image   *im = (RGBA_Image *) ie;
+
+   if (ie->file)
+     printf("unload: [%p] %s %s\n", ie, ie->file, ie->key);
+   if ((im->cs.data) && (im->image.data))
+     {
+       if (im->cs.data != im->image.data)
+         {
+            if (!im->cs.no_free) free(im->cs.data);
+         }
+     }
+   else if (im->cs.data)
+     {
+       if (!im->cs.no_free) free(im->cs.data);
+     }
+   im->cs.data = NULL;
+
+   if (im->image.data && !im->image.no_free)
+     free(im->image.data);
+#ifdef EVAS_CSERVE
+   else if (ie->data1)
+     evas_cserve_image_free(ie);
+#endif   
+   im->image.data = NULL;
+   evas_common_rgba_image_scalecache_dirty(&im->cache_entry);
+}
+
+static void
+_evas_common_rgba_image_unload(Image_Entry *im)
+{
+//   printf("unload: [%p] %s %s\n", im, im->file, im->key);
+   evas_common_rgba_image_unload(im);
+}
+
+static void
+_evas_common_rgba_image_dirty_region(Image_Entry* ie, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Image   *im = (RGBA_Image *) ie;
+
+#ifdef EVAS_CSERVE
+   if (ie->data1) evas_cserve_image_free(ie);
+#endif   
+   im->flags |= RGBA_IMAGE_IS_DIRTY;
+   evas_common_rgba_image_scalecache_dirty(&im->cache_entry);
+}
+
+/* Only called when references > 0. Need to provide a fresh copie of im. */
+static int
+_evas_common_rgba_image_dirty(Image_Entry *ie_dst, const Image_Entry *ie_src)
+{
+   RGBA_Image   *dst = (RGBA_Image *) ie_dst;
+   RGBA_Image   *src = (RGBA_Image *) ie_src;
+
+   evas_common_rgba_image_scalecache_dirty((Image_Entry *)ie_src);
+   evas_common_rgba_image_scalecache_dirty(ie_dst);
+   evas_cache_image_load_data(&src->cache_entry);
+   if (_evas_common_rgba_image_surface_alloc(&dst->cache_entry,
+                                             src->cache_entry.w, src->cache_entry.h))
+     {
+#ifdef EVAS_CSERVE
+        if (ie_src->data1) evas_cserve_image_free((Image_Entry*) ie_src);
+#endif        
+        return 1;
+     }
+
+#ifdef EVAS_CSERVE
+   if (ie_src->data1) evas_cserve_image_free((Image_Entry*) ie_src);
+#endif   
+   evas_common_image_colorspace_normalize(src);
+   evas_common_image_colorspace_normalize(dst);
+/*    evas_common_blit_rectangle(src, dst, 0, 0, src->cache_entry.w, src->cache_entry.h, 0, 0); */
+/*    evas_common_cpu_end_opt(); */
+
+   return 0;
+}
+
+static int
+_evas_common_rgba_image_ram_usage(Image_Entry *ie)
+{
+   RGBA_Image   *im = (RGBA_Image *) ie;
+   int size = 0;
+
+//   ram += sizeof(struct _RGBA_Image);
+//   if (im->info.real_file) ram += strlen(im->info.real_file);
+//   if (im->info.comment) ram += strlen(im->info.comment);
+   if (im->image.data)
+     {
+#ifdef EVAS_CSERVE
+        if ((!im->image.no_free) || (ie->data1))
+#else
+        if ((!im->image.no_free))
+#endif          
+          size += im->cache_entry.w * im->cache_entry.h * sizeof(DATA32);
+     }
+   size += evas_common_rgba_image_scalecache_usage_get(&im->cache_entry);
+   return size;
+}
+
+static DATA32 *
+_evas_common_rgba_image_surface_pixels(Image_Entry *ie)
+{
+   RGBA_Image *im = (RGBA_Image *) ie;
+
+   return im->image.data;
+}
+
+#if 0
+void
+evas_common_image_surface_alpha_tiles_calc(RGBA_Surface *is, int tsize)
+{
+   int x, y;
+   DATA32 *ptr;
+
+   if (is->spans) return;
+   if (!is->im->cache_entry.flags.alpha) return;
+   /* FIXME: dont handle alpha only images yet */
+   if ((is->im->flags & RGBA_IMAGE_ALPHA_ONLY)) return;
+   if (tsize < 0) tsize = 0;
+   is->spans = calloc(1, sizeof(RGBA_Image_Span *) * is->h);
+   if (!is->spans) return;
+   ptr = is->data;
+   for (y = 0; y < is->h; y++)
+     {
+       RGBA_Image_Span *sp;
+
+       sp = NULL;
+       for (x = 0; x < is->w; x++)
+         {
+            DATA8 a;
+
+            a = A_VAL(ptr);
+            if (sp)
+              {
+                 if (a == 0)
+                   {
+                      is->spans[y] = eina_inlist_append(is->spans[y], sp);
+                      sp = NULL;
+                   }
+                 else
+                   {
+                      sp->w++;
+                      if ((sp->v == 2) && (a != 255)) sp->v = 1;
+                   }
+              }
+            else
+              {
+                 if (a == 255)
+                   {
+                      sp = calloc(1, sizeof(RGBA_Image_Span));
+                      sp->x = x;
+                      sp->w = 1;
+                      sp->v = 2;
+                   }
+                 else if (a > 0)
+                   {
+                      sp = calloc(1, sizeof(RGBA_Image_Span));
+                      sp->x = x;
+                      sp->w = 1;
+                      sp->v = 1;
+                   }
+              }
+            ptr++;
+         }
+       if (sp)
+         {
+            is->spans[y] = eina_inlist_append(is->spans[y], sp);
+            sp = NULL;
+         }
+     }
+}
+#endif
+
+/* EAPI void */
+/* evas_common_image_surface_dealloc(RGBA_Surface *is) */
+/* { */
+/*    if ((is->data) && (!is->no_free)) */
+/*      { */
+/*     free(is->data); */
+/*     is->data = NULL; */
+/*      } */
+/* } */
+
+static RGBA_Image *
+evas_common_image_create(int w, int h)
+{
+   RGBA_Image *im;
+
+   im = (RGBA_Image *) _evas_common_rgba_image_new();
+   if (!im) return NULL;
+   im->cache_entry.w = w;
+   im->cache_entry.h = h;
+   if (_evas_common_rgba_image_surface_alloc(&im->cache_entry, w, h))
+     {
+        _evas_common_rgba_image_delete(&im->cache_entry);
+        return NULL;
+     }
+   im->cache_entry.flags.cached = 0;
+   return im;
+}
+
+EAPI RGBA_Image *
+evas_common_image_alpha_create(int w, int h)
+{
+   RGBA_Image   *im;
+
+   im = (RGBA_Image *) _evas_common_rgba_image_new();
+   if (!im) return NULL;
+   im->cache_entry.w = w;
+   im->cache_entry.h = h;
+   im->cache_entry.flags.alpha = 1;
+   if (_evas_common_rgba_image_surface_alloc(&im->cache_entry, w, h))
+     {
+        _evas_common_rgba_image_delete(&im->cache_entry);
+        return NULL;
+     }
+   im->cache_entry.flags.cached = 0;
+   return im;
+}
+
+EAPI RGBA_Image *
+evas_common_image_new(int w, int h, int alpha)
+{
+   if (alpha)
+     return evas_common_image_alpha_create(w, h);
+   return evas_common_image_create(w, h);
+}
+
+void
+evas_common_image_colorspace_normalize(RGBA_Image *im)
+{
+   if ((!im->cs.data) ||
+       ((!im->cs.dirty) && (!(im->flags & RGBA_IMAGE_IS_DIRTY)))) return;
+   switch (im->cache_entry.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (im->image.data != im->cs.data)
+         {
+#ifdef EVAS_CSERVE
+             if (((Image_Entry *)im)->data1) evas_cserve_image_free(&im->cache_entry);
+#endif             
+            if (!im->image.no_free) free(im->image.data);
+            im->image.data = im->cs.data;
+            im->cs.no_free = im->image.no_free;
+         }
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+#ifdef BUILD_CONVERT_YUV
+       if ((im->image.data) && (*((unsigned char **)im->cs.data)))
+         evas_common_convert_yuv_420p_601_rgba(im->cs.data, (DATA8*) im->image.data,
+                                               im->cache_entry.w, im->cache_entry.h);
+#endif
+       break;
+      default:
+       break;
+     }
+   im->cs.dirty = 0;
+}
+
+EAPI void
+evas_common_image_colorspace_dirty(RGBA_Image *im)
+{
+   im->cs.dirty = 1;
+   evas_common_rgba_image_scalecache_dirty(&im->cache_entry);
+}
+
+EAPI void
+evas_common_image_set_cache(int size)
+{
+   if (eci != NULL)
+     evas_cache_image_set(eci, size);
+}
+
+EAPI int
+evas_common_image_get_cache(void)
+{
+   return evas_cache_image_get(eci);
+}
+
+EAPI RGBA_Image *
+evas_common_load_image_from_file(const char *file, const char *key, RGBA_Image_Loadopts *lo, int *error)
+{
+   if (file == NULL)
+     {
+       *error = EVAS_LOAD_ERROR_GENERIC;
+       return NULL;
+     }
+   return (RGBA_Image *) evas_cache_image_request(eci, file, key, lo, error);
+}
+
+EAPI void
+evas_common_image_cache_free(void)
+{
+   evas_common_image_set_cache(0);
+}
+
+EAPI Evas_Cache_Image*
+evas_common_image_cache_get(void)
+{
+   return eci;
+}
+
+EAPI RGBA_Image *
+evas_common_image_line_buffer_obtain(int len)
+{
+   if (len < 1) return NULL;
+   if (len < EVAS_RGBA_LINE_BUFFER_MIN_LEN)
+       len = EVAS_RGBA_LINE_BUFFER_MIN_LEN;
+   return evas_common_image_create(len, 1);
+/*
+   if (evas_rgba_line_buffer)
+     {
+       if (evas_rgba_line_buffer->image->w >= len)
+          return evas_rgba_line_buffer;
+       evas_rgba_line_buffer->image->data = (DATA32 *)realloc(evas_rgba_line_buffer->image->data, len * sizeof(DATA32));
+       if (!evas_rgba_line_buffer->image->data)
+         {
+          evas_common_image_free(evas_rgba_line_buffer);
+          evas_rgba_line_buffer = NULL;
+          return NULL;
+         }
+       evas_rgba_line_buffer->image->w = len;
+       return evas_rgba_line_buffer;
+     }
+   evas_rgba_line_buffer = evas_common_image_create(len, 1);
+   if (!evas_rgba_line_buffer) return NULL;
+   return evas_rgba_line_buffer;
+ */
+}
+
+EAPI void
+evas_common_image_line_buffer_release(RGBA_Image *im)
+{
+    _evas_common_rgba_image_delete(&im->cache_entry);
+/*
+   if (!evas_rgba_line_buffer) return;
+   if (EVAS_RGBA_LINE_BUFFER_MAX_LEN < evas_rgba_line_buffer->image->w)
+     {
+       evas_rgba_line_buffer->image->w = EVAS_RGBA_LINE_BUFFER_MAX_LEN;
+       evas_rgba_line_buffer->image->data = (DATA32 *)realloc(evas_rgba_line_buffer->image->data,
+                                evas_rgba_line_buffer->image->w * sizeof(DATA32));
+       if (!evas_rgba_line_buffer->image->data)
+         {
+          evas_common_image_free(evas_rgba_line_buffer);
+          evas_rgba_line_buffer = NULL;
+         }
+     }
+ */
+}
+
+EAPI void
+evas_common_image_line_buffer_free(RGBA_Image *im)
+{
+    _evas_common_rgba_image_delete(&im->cache_entry);
+/*
+   if (!evas_rgba_line_buffer) return;
+   evas_common_image_free(evas_rgba_line_buffer);
+   evas_rgba_line_buffer = NULL;
+ */
+}
+
+EAPI RGBA_Image *
+evas_common_image_alpha_line_buffer_obtain(int len)
+{
+   if (len < 1) return NULL;
+   if (len < EVAS_ALPHA_LINE_BUFFER_MIN_LEN)
+       len = EVAS_ALPHA_LINE_BUFFER_MIN_LEN;
+   return evas_common_image_alpha_create(len, 1);
+/*
+   if (evas_alpha_line_buffer)
+     {
+       if (evas_alpha_line_buffer->image->w >= len)
+          return evas_alpha_line_buffer;
+       evas_alpha_line_buffer->image->data = realloc(evas_alpha_line_buffer->image->data, len * sizeof(DATA8));
+       if (!evas_alpha_line_buffer->image->data)
+         {
+          evas_common_image_free(evas_alpha_line_buffer);
+          evas_alpha_line_buffer = NULL;
+          return NULL;
+         }
+       evas_alpha_line_buffer->image->w = len;
+       return evas_alpha_line_buffer;
+     }
+   evas_alpha_line_buffer = evas_common_image_alpha_create(len, 1);
+   return evas_alpha_line_buffer;
+ */
+}
+
+EAPI void
+evas_common_image_alpha_line_buffer_release(RGBA_Image *im)
+{
+    _evas_common_rgba_image_delete(&im->cache_entry);
+/*
+   if (!evas_alpha_line_buffer) return;
+   if (EVAS_ALPHA_LINE_BUFFER_MAX_LEN < evas_alpha_line_buffer->image->w)
+     {
+       evas_alpha_line_buffer->image->w = EVAS_ALPHA_LINE_BUFFER_MAX_LEN;
+       evas_alpha_line_buffer->image->data = realloc(evas_alpha_line_buffer->image->data,
+                                evas_alpha_line_buffer->image->w * sizeof(DATA8));
+       if (!evas_alpha_line_buffer->image->data)
+         {
+          evas_common_image_free(evas_alpha_line_buffer);
+          evas_alpha_line_buffer = NULL;
+         }
+     }
+ */
+}
+
+EAPI void
+evas_common_image_premul(Image_Entry *ie)
+{
+   DATA32  nas = 0;
+
+   if (!ie) return ;
+   if (!evas_cache_image_pixels(ie)) return ;
+   if (!ie->flags.alpha) return;
+
+   nas = evas_common_convert_argb_premul(evas_cache_image_pixels(ie), ie->w * ie->h);
+   if ((ALPHA_SPARSE_INV_FRACTION * nas) >= (ie->w * ie->h))
+     ie->flags.alpha_sparse = 1;
+}
+
+EAPI void
+evas_common_image_set_alpha_sparse(Image_Entry *ie)
+{
+   DATA32  *s, *se;
+   DATA32  nas = 0;
+
+   if (!ie) return;
+   if (!evas_cache_image_pixels(ie)) return ;
+   if (!ie->flags.alpha) return;
+
+   s = evas_cache_image_pixels(ie);
+   se = s + (ie->w * ie->h);
+   while (s < se)
+     {
+       DATA32  p = *s & 0xff000000;
+
+       if (!p || (p == 0xff000000))
+          nas++;
+       s++;
+     }
+   if ((ALPHA_SPARSE_INV_FRACTION * nas) >= (ie->w * ie->h))
+     ie->flags.alpha_sparse = 1;
+}
diff --git a/src/lib/engines/common/evas_image_private.h b/src/lib/engines/common/evas_image_private.h
new file mode 100644 (file)
index 0000000..6ac9742
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef _EVAS_IMAGE_PRIVATE_H
+#define _EVAS_IMAGE_PRIVATE_H
+
+int             evas_common_rgba_image_size_set              (Image_Entry* dst, const Image_Entry* im, int w, int h);
+int             evas_common_rgba_image_from_copied_data      (Image_Entry* dst, int w, int h, DATA32 *image_data, int alpha, int cspace);
+int             evas_common_rgba_image_from_data             (Image_Entry* dst, int w, int h, DATA32 *image_data, int alpha, int cspace);
+int             evas_common_rgba_image_colorspace_set        (Image_Entry* dst, int cspace);
+
+void evas_common_scalecache_init(void);
+void evas_common_scalecache_shutdown(void);
+void evas_common_rgba_image_scalecache_init(Image_Entry *ie);
+void evas_common_rgba_image_scalecache_shutdown(Image_Entry *ie);
+void evas_common_rgba_image_scalecache_dirty(Image_Entry *ie);
+void evas_common_rgba_image_scalecache_orig_use(Image_Entry *ie);
+int evas_common_rgba_image_scalecache_usage_get(Image_Entry *ie);
+    
+#endif /* _EVAS_IMAGE_PRIVATE_H */
diff --git a/src/lib/engines/common/evas_image_save.c b/src/lib/engines/common/evas_image_save.c
new file mode 100644 (file)
index 0000000..a2fa3c8
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "evas_options.h"
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+
+int
+evas_common_save_image_to_file(RGBA_Image *im, const char *file, const char *key, int quality, int compress)
+{
+   Evas_Image_Save_Func *evas_image_save_func = NULL;
+   char *p;
+   char *saver = NULL;
+
+   p = strrchr(file, '.');
+   if (p)
+     {
+       p++;
+
+       if (!strcasecmp(p, "png"))
+          saver = "png";
+       if ((!strcasecmp(p, "jpg")) || (!strcasecmp(p, "jpeg")) ||
+           (!strcasecmp(p, "jfif")))
+          saver = "jpeg";
+       if ((!strcasecmp(p, "eet")) || (!strcasecmp(p, "edj")) ||
+            (!strcasecmp(p, "eap")))
+          saver = "eet";
+       if (!strcasecmp(p, "edb"))
+          saver = "edb";
+     }
+
+   if (saver)
+     {
+        Evas_Module *em;
+
+       em = evas_module_find_type(EVAS_MODULE_TYPE_IMAGE_SAVER, saver);
+       if (em)
+         {
+            evas_module_use(em);
+            if (evas_module_load(em))
+              {
+                 evas_image_save_func = em->functions;
+                 return evas_image_save_func->image_save(im, file, key, quality, compress);
+              }
+         }
+     }
+   return 0;
+}
diff --git a/src/lib/engines/common/evas_image_scalecache.c b/src/lib/engines/common/evas_image_scalecache.c
new file mode 100644 (file)
index 0000000..4391beb
--- /dev/null
@@ -0,0 +1,745 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#include <assert.h>
+
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_image_private.h"
+
+#define SCALECACHE 1
+
+#define MAX_SCALEITEMS 32
+#define MIN_SCALE_USES 3
+//#define MIN_SCALE_AGE_GAP 5000
+#define MAX_SCALECACHE_DIM 3200
+#define FLOP_ADD 4
+#define MAX_FLOP_COUNT 16
+#define FLOP_DEL 1
+#define SCALE_CACHE_SIZE 4 * 1024 * 1024
+//#define SCALE_CACHE_SIZE 0
+
+typedef struct _Scaleitem Scaleitem;
+
+struct _Scaleitem
+{
+   EINA_INLIST;
+   unsigned long long usage;
+   unsigned long long usage_count;
+   RGBA_Image *im, *parent_im;
+   int src_x, src_y, src_w, src_h;
+   int dst_w, dst_h;
+   int flop;
+   int size_adjust;
+   Eina_Bool forced_unload : 1;
+   Eina_Bool smooth : 1;
+   Eina_Bool populate_me : 1;
+};
+
+#ifdef SCALECACHE
+static unsigned long long use_counter = 0;
+
+#ifdef BUILD_PTHREAD
+static LK(cache_lock);
+#endif
+static Eina_Inlist *cache_list = NULL;
+static int cache_size = 0;
+static int init = 0;
+
+static int max_cache_size = SCALE_CACHE_SIZE;
+static int max_dimension = MAX_SCALECACHE_DIM;
+static int max_flop_count = MAX_FLOP_COUNT;
+static int max_scale_items = MAX_SCALEITEMS;
+static int min_scale_uses = MIN_SCALE_USES;
+#endif
+
+void
+evas_common_scalecache_init(void)
+{
+#ifdef SCALECACHE
+   const char *s;
+
+   init++;
+   if (init > 1) return;
+   use_counter = 0;
+   LKI(cache_lock);
+   s = getenv("EVAS_SCALECACHE_SIZE");
+   if (s) max_cache_size = atoi(s) * 1024;
+   s = getenv("EVAS_SCALECACHE_MAX_DIMENSION");
+   if (s) max_dimension = atoi(s);
+   s = getenv("EVAS_SCALECACHE_MAX_FLOP_COUNT");
+   if (s) max_flop_count = atoi(s);
+   s = getenv("EVAS_SCALECACHE_MAX_ITEMS");
+   if (s) max_scale_items = atoi(s);
+   s = getenv("EVAS_SCALECACHE_MIN_USES");
+   if (s) min_scale_uses = atoi(s);
+#endif
+}
+
+void
+evas_common_scalecache_shutdown(void)
+{
+#ifdef SCALECACHE
+   init--;
+   LKD(cache_lock);
+#endif
+}
+
+void
+evas_common_rgba_image_scalecache_init(Image_Entry *ie)
+{
+#ifdef SCALECACHE
+   RGBA_Image *im = (RGBA_Image *)ie;
+   LKI(im->cache.lock);
+#endif
+}
+
+void
+evas_common_rgba_image_scalecache_shutdown(Image_Entry *ie)
+{
+#ifdef SCALECACHE
+   RGBA_Image *im = (RGBA_Image *)ie;
+   evas_common_rgba_image_scalecache_dirty(ie);
+   LKD(im->cache.lock);
+#endif
+}
+
+void
+evas_common_rgba_image_scalecache_dirty(Image_Entry *ie)
+{
+#ifdef SCALECACHE
+   RGBA_Image *im = (RGBA_Image *)ie;
+   LKL(im->cache.lock);
+   while (im->cache.list)
+     {
+        Scaleitem *sci;
+        sci = im->cache.list->data;
+        im->cache.list = eina_list_remove(im->cache.list, sci);
+        if (sci->im)
+          {
+//             INF(" 0- %i", sci->dst_w * sci->dst_h * 4);
+             LKL(cache_lock);
+             evas_common_rgba_image_free(&sci->im->cache_entry);
+             if (!sci->forced_unload)
+               cache_size -= sci->dst_w * sci->dst_h * 4;
+             else
+               cache_size -= sci->size_adjust;
+             cache_list = eina_inlist_remove(cache_list, (Eina_Inlist *)sci);
+             LKU(cache_lock);
+          }
+        free(sci);
+     }
+   LKU(im->cache.lock);
+#endif
+}
+
+void
+evas_common_rgba_image_scalecache_orig_use(Image_Entry *ie)
+{
+#ifdef SCALECACHE
+   RGBA_Image *im = (RGBA_Image *)ie;
+   LKL(im->cache.lock);
+   use_counter++;
+   // FIXME: if orig not loaded, reload
+   // FIXME: mark orig with current used counter
+   im->cache.orig_usage++;
+   im->cache.usage_count = use_counter;
+   LKU(im->cache.lock);
+#endif
+}
+
+int
+evas_common_rgba_image_scalecache_usage_get(Image_Entry *ie)
+{
+#ifdef SCALECACHE
+   RGBA_Image *im = (RGBA_Image *)ie;
+   int size = 0;
+   Eina_List *l;
+   Scaleitem *sci;
+   LKL(im->cache.lock);
+   EINA_LIST_FOREACH(im->cache.list, l, sci)
+     {
+        if (sci->im) size += sci->dst_w * sci->dst_h * 4;
+     }
+   LKU(im->cache.lock);
+   return size;
+#else
+   return 0;
+#endif
+}
+
+#ifdef SCALECACHE
+static void
+_sci_fix_newest(RGBA_Image *im)
+{
+   Eina_List *l;
+   Scaleitem *sci;
+   
+   im->cache.newest_usage = 0;
+   im->cache.newest_usage_count = 0;
+   EINA_LIST_FOREACH(im->cache.list, l, sci)
+     {
+        if (sci->usage > im->cache.newest_usage)
+          im->cache.newest_usage = sci->usage;
+        if (sci->usage_count > im->cache.newest_usage_count)
+          im->cache.newest_usage_count = sci->usage_count;
+     }
+//   INF("_sci_fix_newest! -> %i", im->cache.newest_usage);
+}
+
+static Scaleitem *
+_sci_find(RGBA_Image *im,
+          RGBA_Draw_Context *dc __UNUSED__, int smooth,
+          int src_region_x, int src_region_y,
+          int src_region_w, int src_region_h,
+          int dst_region_w, int dst_region_h)
+{
+   Eina_List *l;
+   Scaleitem *sci;
+
+   EINA_LIST_FOREACH(im->cache.list, l, sci)
+     {
+        if (
+            (sci->src_w == src_region_w) &&
+            (sci->src_h == src_region_h) &&
+            (sci->dst_w == dst_region_w) &&
+            (sci->dst_h == dst_region_h) &&
+            (sci->src_x == src_region_x) &&
+            (sci->src_y == src_region_y) &&
+            (sci->smooth == smooth)
+            )
+          {
+             if (im->cache.list != l)
+               {
+                  im->cache.list = eina_list_remove_list(im->cache.list, l);
+                  im->cache.list = eina_list_prepend(im->cache.list, sci);
+               }
+             return sci;
+          }
+     }
+   if (eina_list_count(im->cache.list) > max_scale_items)
+     {
+        l = eina_list_last(im->cache.list);
+        sci = l->data;
+        im->cache.list = eina_list_remove_list(im->cache.list, l);
+        if ((sci->usage == im->cache.newest_usage) ||
+            (sci->usage_count == im->cache.newest_usage_count))
+          _sci_fix_newest(im);
+        if (sci->im)
+          {
+             evas_common_rgba_image_free(&sci->im->cache_entry);
+             if (!sci->forced_unload)
+               cache_size -= sci->dst_w * sci->dst_h * 4;
+             else
+               cache_size -= sci->size_adjust;
+//             INF(" 1- %i", sci->dst_w * sci->dst_h * 4);
+             cache_list = eina_inlist_remove(cache_list, (Eina_Inlist *)sci);
+          }
+        if (max_scale_items < 1) return NULL;
+     }
+   else
+     {
+        if (max_scale_items < 1) return NULL;
+
+        if (eina_list_count(im->cache.list) > (max_scale_items - 1))
+          return NULL;
+        sci = malloc(sizeof(Scaleitem));
+        memset(sci, 0, sizeof(Eina_Inlist));
+        sci->parent_im = im;
+     }
+   sci->usage = 0;
+   sci->usage_count = 0;
+   sci->populate_me = 0;
+   sci->smooth = smooth;
+   sci->forced_unload = 0;
+   sci->flop = 0;
+   sci->im = NULL;
+   sci->src_x = src_region_x;
+   sci->src_y = src_region_y;
+   sci->src_w = src_region_w;
+   sci->src_h = src_region_h;
+   sci->dst_w = dst_region_w;
+   sci->dst_h = dst_region_h;
+   im->cache.list = eina_list_prepend(im->cache.list, sci);
+   return sci;
+}
+
+static void
+_cache_prune(Scaleitem *notsci, Eina_Bool copies_only)
+{
+   Scaleitem *sci;
+   while (cache_size > max_cache_size)
+     {
+        if (!cache_list) break;
+        sci = (Scaleitem *)(cache_list);
+        if (copies_only)
+          {
+             while ((sci) && (!sci->parent_im->image.data))
+               sci = (Scaleitem *)(((Eina_Inlist *)sci)->next);
+             if (!sci) return;
+          }
+        if (sci == notsci) return;
+        if (sci->im)
+          {
+             evas_common_rgba_image_free(&sci->im->cache_entry);
+             sci->im = NULL;
+             sci->usage = 0;
+             sci->usage_count = 0;
+             sci->flop += FLOP_ADD;
+             if (!sci->forced_unload)
+               cache_size -= sci->dst_w * sci->dst_h * 4;
+             else
+               cache_size -= sci->size_adjust;
+//             INF(" 2- %i", sci->dst_w * sci->dst_h * 4);
+             cache_list = eina_inlist_remove(cache_list, (Eina_Inlist *)sci);
+             memset(sci, 0, sizeof(Eina_Inlist));
+          }
+//        INF("FLUSH %i > %i", cache_size, max_cache_size);
+      }
+}
+#endif
+
+EAPI void
+evas_common_rgba_image_scalecache_size_set(int size)
+{
+#ifdef SCALECACHE
+   LKL(cache_lock);
+   if (size != max_cache_size)
+     {
+        max_cache_size = size;
+        _cache_prune(NULL, 1);
+     }
+   LKU(cache_lock);
+#endif   
+}
+
+EAPI int
+evas_common_rgba_image_scalecache_size_get(void)
+{
+#ifdef SCALECACHE
+   int t;
+   LKL(cache_lock);
+   t = max_cache_size;
+   LKU(cache_lock);
+   return t;
+#else
+   return 0;
+#endif   
+}
+
+EAPI void
+evas_common_rgba_image_scalecache_flush(void)
+{
+#ifdef SCALECACHE
+   int t;
+   LKL(cache_lock);
+   t = max_cache_size;
+   max_cache_size = 0;
+   _cache_prune(NULL, 1);
+   max_cache_size = t;
+   LKU(cache_lock);
+#endif   
+}
+
+EAPI void
+evas_common_rgba_image_scalecache_prepare(Image_Entry *ie, RGBA_Image *dst __UNUSED__,
+                                          RGBA_Draw_Context *dc, int smooth,
+                                          int src_region_x, int src_region_y,
+                                          int src_region_w, int src_region_h,
+                                          int dst_region_x __UNUSED__, int dst_region_y __UNUSED__,
+                                          int dst_region_w, int dst_region_h)
+{
+#ifdef SCALECACHE
+   RGBA_Image *im = (RGBA_Image *)ie;
+   Scaleitem *sci;
+   if (!im->image.data) return;
+   if ((dst_region_w == 0) || (dst_region_h == 0) ||
+       (src_region_w == 0) || (src_region_h == 0)) return;
+   LKL(im->cache.lock);
+   use_counter++;
+   if ((src_region_w == dst_region_w) && (src_region_h == dst_region_h))
+     {
+        // 1:1 scale.
+        im->cache.orig_usage++;
+        im->cache.usage_count = use_counter;
+        LKU(im->cache.lock);
+        return;
+     }
+   if ((!im->cache_entry.flags.alpha) && (!smooth))
+     {
+        // solid nearest scaling - it's actually the same speed cached or not,
+        // or in some cases faster not cached
+        im->cache.orig_usage++;
+        im->cache.usage_count = use_counter;
+        LKU(im->cache.lock);
+        return;
+     }
+   LKL(cache_lock);
+   sci = _sci_find(im, dc, smooth, 
+                   src_region_x, src_region_y, src_region_w, src_region_h, 
+                   dst_region_w, dst_region_h);
+   if (!sci)
+     {
+        LKU(cache_lock);
+        LKU(im->cache.lock);
+        return;
+     }
+//   INF("%10i | %4i %4i %4ix%4i -> %4i %4i %4ix%4i | %i",
+//          (int)use_counter,
+//          src_region_x, src_region_y, src_region_w, src_region_h,
+//          dst_region_x, dst_region_y, dst_region_w, dst_region_h,
+//          smooth);
+   if ((sci->usage >= min_scale_uses)
+       && (ie->scale_hint != EVAS_IMAGE_SCALE_HINT_DYNAMIC)
+//       && (sci->usage_count > (use_counter - MIN_SCALE_AGE_GAP))
+       )
+     {
+        if (!sci->im)
+          {
+             if ((sci->dst_w < max_dimension) && 
+                 (sci->dst_h < max_dimension))
+               {
+                  if (sci->flop <= max_flop_count)
+                    {
+                       sci->populate_me = 1;
+                       im->cache.populate_count++;
+                    }
+               }
+          }
+     }
+   sci->usage++;
+   sci->usage_count = use_counter;
+   LKU(cache_lock);
+   if (sci->usage > im->cache.newest_usage) 
+     im->cache.newest_usage = sci->usage;
+//   INF("newset? %p %i > %i", im, 
+//          (int)sci->usage, 
+//          (int)im->cache.newest_usage);
+   if (sci->usage_count > im->cache.newest_usage_count) 
+     im->cache.newest_usage_count = sci->usage_count;
+//   INF("  -------------- used %8i#, %8i@", (int)sci->usage, (int)sci->usage_count);
+   LKU(im->cache.lock);
+#endif
+}
+
+#ifdef SCALECACHE
+//static int pops = 0;
+//static int hits = 0;
+//static int misses = 0;
+//static int noscales = 0;
+#endif
+
+EAPI void
+evas_common_rgba_image_scalecache_do(Image_Entry *ie, RGBA_Image *dst,
+                                     RGBA_Draw_Context *dc, int smooth,
+                                     int src_region_x, int src_region_y,
+                                     int src_region_w, int src_region_h,
+                                     int dst_region_x, int dst_region_y,
+                                     int dst_region_w, int dst_region_h)
+{
+#ifdef SCALECACHE
+   RGBA_Image *im = (RGBA_Image *)ie;
+   Scaleitem *sci;
+   int didpop = 0;
+   int dounload = 0;
+/*
+   static int i = 0;
+
+   i++;
+   if (i > 2000)
+     {
+        INF("p: %6i, h: %6i, m: %6i, n: %6i",
+               pops, hits, misses, noscales);
+        i = 0;
+     }
+ */
+   if ((dst_region_w == 0) || (dst_region_h == 0) ||
+       (src_region_w == 0) || (src_region_h == 0)) return;
+   LKL(im->cache.lock);
+   if ((src_region_w == dst_region_w) && (src_region_h == dst_region_h))
+     {
+        if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
+          evas_cache_image_load_data(&im->cache_entry);
+        evas_common_image_colorspace_normalize(im);
+//        noscales++;
+        LKU(im->cache.lock);
+        if (im->image.data)
+          {
+             if (smooth)
+               evas_common_scale_rgba_in_to_out_clip_smooth(im, dst, dc,
+                                                            src_region_x, src_region_y, 
+                                                            src_region_w, src_region_h,
+                                                            dst_region_x, dst_region_y, 
+                                                            dst_region_w, dst_region_h);
+             else
+               evas_common_scale_rgba_in_to_out_clip_sample(im, dst, dc,
+                                                            src_region_x, src_region_y, 
+                                                            src_region_w, src_region_h,
+                                                            dst_region_x, dst_region_y, 
+                                                            dst_region_w, dst_region_h);
+          }
+        return;
+     }
+   LKL(cache_lock);
+   sci = _sci_find(im, dc, smooth,
+                   src_region_x, src_region_y, src_region_w, src_region_h,
+                   dst_region_w, dst_region_h);
+   LKU(cache_lock);
+   if (!sci)
+     {
+        if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
+          evas_cache_image_load_data(&im->cache_entry);
+        evas_common_image_colorspace_normalize(im);
+//        misses++;
+        LKU(im->cache.lock);
+        if (im->image.data)
+          {
+             if (smooth)
+               evas_common_scale_rgba_in_to_out_clip_smooth(im, dst, dc,
+                                                            src_region_x, src_region_y, 
+                                                            src_region_w, src_region_h,
+                                                            dst_region_x, dst_region_y, 
+                                                            dst_region_w, dst_region_h);
+             else
+               evas_common_scale_rgba_in_to_out_clip_sample(im, dst, dc,
+                                                            src_region_x, src_region_y, 
+                                                            src_region_w, src_region_h,
+                                                            dst_region_x, dst_region_y, 
+                                                            dst_region_w, dst_region_h);
+          }
+        return;
+     }
+   if (sci->populate_me)
+     {
+        int size, osize, used;
+        
+        size = dst_region_w * dst_region_h;
+        if (((((dst_region_w > 640) || (dst_region_h > 640)) &&
+             (size > (480 * 480))) ||
+             (ie->scale_hint == EVAS_IMAGE_SCALE_HINT_STATIC)) &&
+            (ie->scale_hint != EVAS_IMAGE_SCALE_HINT_DYNAMIC))
+          {
+             Eina_List *l;
+             Scaleitem *sci2;
+             
+             dounload = 1;
+             osize = sci->parent_im->cache_entry.w * sci->parent_im->cache_entry.h;
+             used = 0;
+             EINA_LIST_FOREACH(im->cache.list, l, sci2)
+               {
+                  if (sci2->im) used += sci2->dst_w * sci2->dst_h;
+               }
+             if ((size < osize) && (used == 0))
+               sci->size_adjust = 0;
+             else
+               {
+                  osize -= used;
+                  if (osize < 0) osize = 0;
+                  size -= osize;
+                  sci->size_adjust = size * 4; 
+               }
+          }
+        else
+          {
+             size *= sizeof(DATA32);
+             if ((cache_size + size) > max_cache_size)
+               {
+                  sci->populate_me = 0;
+                  im->cache.populate_count--;
+               }
+          }
+     }
+   if (sci->populate_me)
+     {
+//        INF("##! populate!");
+        sci->im = evas_common_image_new
+          (dst_region_w, dst_region_h, im->cache_entry.flags.alpha);
+        if (sci->im)
+          {
+             static RGBA_Draw_Context *ct = NULL;
+        
+             LKL(cache_lock);
+             im->cache.orig_usage++;
+             im->cache.usage_count = use_counter;
+             im->cache.populate_count--;
+//             pops++;
+             if (!ct)
+               {
+                  // FIXME: static ct - never can free on shutdown? not a leak
+                  // or real harm - just annoying valgrind bitch
+                  ct = evas_common_draw_context_new();
+                  evas_common_draw_context_set_render_op(ct, _EVAS_RENDER_COPY);
+               }
+             if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
+               evas_cache_image_load_data(&im->cache_entry);
+             evas_common_image_colorspace_normalize(im);
+             if (im->image.data)
+               {
+                  if (smooth)
+                    evas_common_scale_rgba_in_to_out_clip_smooth
+                    (im, sci->im, ct,
+                     src_region_x, src_region_y, 
+                     src_region_w, src_region_h,
+                     0, 0,
+                     dst_region_w, dst_region_h);
+                  else
+                    evas_common_scale_rgba_in_to_out_clip_sample
+                    (im, sci->im, ct,
+                     src_region_x, src_region_y, 
+                     src_region_w, src_region_h,
+                     0, 0,
+                     dst_region_w, dst_region_h);
+                  sci->populate_me = 0;
+#if 0 // visual debug of cached images                  
+                    {
+                       int xx, yy;
+                       DATA32 *pp;
+                       
+                       pp = sci->im->image.data;
+                       for (yy = 0; yy < dst_region_h; yy++)
+                         {
+                            
+                            for (xx = 0; xx < dst_region_w; xx++)
+                              {
+                                 if (yy & 0x1)
+                                   {
+                                      if (xx & 0x1) *pp = 0x882288ff;
+                                   }
+                                 else
+                                   { 
+                                      if (!(xx & 0x1)) *pp = 0x882288ff;
+                                  }
+                                 pp++;
+                              }
+                         }
+                    }
+#endif                  
+               }
+             if (dounload)
+               {
+                  sci->forced_unload = 1;
+                  cache_size += sci->size_adjust;
+               }
+             else
+               {
+                  cache_size += sci->dst_w * sci->dst_h * 4;
+               }
+//             INF(" + %i @ flop: %i (%ix%i)", 
+//                    sci->dst_w * sci->dst_h * 4, sci->flop, 
+//                    sci->dst_w, sci->dst_h);
+             cache_list = eina_inlist_append(cache_list, (Eina_Inlist *)sci);
+             _cache_prune(sci, 0);
+             LKU(cache_lock);
+             didpop = 1;
+          }
+     }
+   if (sci->im)
+     {
+        if (!didpop)
+          {
+            LKL(cache_lock);
+             cache_list = eina_inlist_remove(cache_list, (Eina_Inlist *)sci);
+             cache_list = eina_inlist_append(cache_list, (Eina_Inlist *)sci);
+            LKU(cache_lock);
+          }
+        else
+          {
+             if (sci->flop > 0) sci->flop -= FLOP_DEL;
+          }
+//        INF("use cached!");
+        LKU(im->cache.lock);
+        evas_common_scale_rgba_in_to_out_clip_sample
+          (sci->im, dst, dc,
+           0, 0,
+           dst_region_w, dst_region_h,
+           dst_region_x, dst_region_y, 
+           dst_region_w, dst_region_h);
+//        hits++;
+//        INF("check %p %i < %i", 
+//               im,
+//               (int)im->cache.orig_usage, 
+//               (int)im->cache.newest_usage);
+        if ((dounload) || 
+            ((im->cache_entry.flags.loaded) && 
+             ((!im->cs.no_free) 
+#ifdef EVAS_CSERVE             
+             || (ie->data1)
+#endif             
+              )  &&
+             (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)))
+          {
+             if ((dounload) || (im->cache.orig_usage < 
+                                (im->cache.newest_usage / 20)))
+               {
+                  evas_common_rgba_image_unload(&im->cache_entry);
+               }
+          }
+     }
+   else
+     {
+        if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
+          evas_cache_image_load_data(&im->cache_entry);
+        evas_common_image_colorspace_normalize(im);
+//        misses++;
+        LKU(im->cache.lock);
+        if (im->image.data)
+          {
+             if (smooth)
+               evas_common_scale_rgba_in_to_out_clip_smooth(im, dst, dc,
+                                                            src_region_x, src_region_y, 
+                                                            src_region_w, src_region_h,
+                                                            dst_region_x, dst_region_y, 
+                                                            dst_region_w, dst_region_h);
+             else
+               evas_common_scale_rgba_in_to_out_clip_sample(im, dst, dc,
+                                                            src_region_x, src_region_y, 
+                                                            src_region_w, src_region_h,
+                                                            dst_region_x, dst_region_y, 
+                                                            dst_region_w, dst_region_h);
+          }
+     }
+#else   
+   RGBA_Image *im = (RGBA_Image *)ie;
+   if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
+     evas_cache_image_load_data(&im->cache_entry);
+   evas_common_image_colorspace_normalize(im);
+   if (im->image.data)
+     {
+        if (smooth)
+          evas_common_scale_rgba_in_to_out_clip_smooth(im, dst, dc,
+                                                       src_region_x, src_region_y, 
+                                                       src_region_w, src_region_h,
+                                                       dst_region_x, dst_region_y, 
+                                                       dst_region_w, dst_region_h);
+        else
+          evas_common_scale_rgba_in_to_out_clip_sample(im, dst, dc,
+                                                       src_region_x, src_region_y, 
+                                                       src_region_w, src_region_h,
+                                                       dst_region_x, dst_region_y, 
+                                                       dst_region_w, dst_region_h);
+     }
+#endif
+}
+
+#if 0
+// to be done
+void
+evas_common_rgba_image_scalecache_XXX(Image_Entry *ie)
+{
+#ifdef SCALECACHE
+   RGBA_Image *im = (RGBA_Image *)ie;
+   LKL(im->cache.lock);
+   // FIXME: XXX
+   LKU(im->cache.lock);
+#endif
+}
+#endif
diff --git a/src/lib/engines/common/evas_intl/evas_intl_arabic.c b/src/lib/engines/common/evas_intl/evas_intl_arabic.c
new file mode 100644 (file)
index 0000000..b5d1e9d
--- /dev/null
@@ -0,0 +1,316 @@
+#include "../evas_intl_utils.h"
+
+#ifdef ARABIC_SUPPORT
+/* arabic contextualizing */
+
+/* arabic input forms */
+#define ARABIC_ALEPH_MADDA     0x0622
+#define ARABIC_ALEPH           0x0627
+#define ARABIC_BET             0x0628
+#define ARABIC_TA_MARBUTA      0x0629
+#define ARABIC_TAW             0x062A
+#define ARABIC_TA              0x062B
+#define ARABIC_GIMEL           0x062C
+#define ARABIC_HETH            0x062D
+#define ARABIC_HA              0x062E
+#define        ARABIC_DALET            0x062F
+#define ARABIC_DAL             0x0630
+#define ARABIC_RESH            0x0631
+#define ARABIC_ZAYIN           0x0632
+#define ARABIC_SHIN            0x0633
+#define ARABIC_SH              0x0634
+#define ARABIC_TSADE           0x0635
+#define ARABIC_DAD             0x0636
+#define ARABIC_TETH            0x0637
+#define ARABIC_ZA              0x0638
+#define ARABIC_AYIN            0x0639
+#define ARABIC_GHAIN           0x063A
+#define ARABIC_PE              0x0641
+#define ARABIC_QOPH            0x0642
+#define ARABIC_KAPH            0x0643
+#define ARABIC_LAMED           0x0644
+#define ARABIC_MEM             0x0645
+#define ARABIC_NUN             0x0646
+#define ARABIC_HE              0x0647
+#define ARABIC_WAW             0x0648
+#define ARABIC_ALEPH_MAQSURA   0x0649
+#define ARABIC_YODH            0x064A
+/* arabic contextual forms */
+#define ARABIC_ISOLATED_ALEPH_MADDA    0xFE81
+#define ARABIC_ISOLATED_ALEPH          0xFE8D
+#define ARABIC_ISOLATED_TA_MARBUTA     0xFE93
+#define ARABIC_ISOLATED_BET            0xFE8F
+#define ARABIC_ISOLATED_TAW            0xFE95
+#define ARABIC_ISOLATED_TA             0xFE99
+#define ARABIC_ISOLATED_GIMEL          0xFE9D
+#define ARABIC_ISOLATED_HETH           0xFEA1
+#define ARABIC_ISOLATED_HA             0xFEA5
+#define        ARABIC_ISOLATED_DALET           0xFEA9
+#define ARABIC_ISOLATED_DAL            0xFEAB
+#define ARABIC_ISOLATED_RESH           0xFEAD
+#define ARABIC_ISOLATED_ZAYIN          0xFEAF
+#define ARABIC_ISOLATED_SHIN           0xFEB1
+#define ARABIC_ISOLATED_SH             0xFEB5
+#define ARABIC_ISOLATED_TSADE          0xFEB9
+#define ARABIC_ISOLATED_DAD            0xFEBD
+#define ARABIC_ISOLATED_TETH           0xFEC1
+#define ARABIC_ISOLATED_ZA             0xFEC5
+#define ARABIC_ISOLATED_AYIN           0xFEC9
+#define ARABIC_ISOLATED_GHAIN          0xFECD
+#define ARABIC_ISOLATED_PE             0xFED1
+#define ARABIC_ISOLATED_QOPH           0xFED5
+#define ARABIC_ISOLATED_KAPH           0xFED9
+#define ARABIC_ISOLATED_LAMED          0xFEDD
+#define ARABIC_ISOLATED_MEM            0xFEE1
+#define ARABIC_ISOLATED_NUN            0xFEE5
+#define ARABIC_ISOLATED_HE             0xFEE9
+#define ARABIC_ISOLATED_WAW            0xFEED
+#define ARABIC_ISOLATED_ALEPH_MAQSURA  0xFEEF
+#define ARABIC_ISOLATED_YODH           0xFEF1
+
+#define ARABIC_IS_SPECIAL_LETTER(c)    ((c) == ARABIC_ISOLATED_ALEPH ||  \
+      (c) == ARABIC_ISOLATED_DALET || \
+      (c) == ARABIC_ISOLATED_DAL ||   \
+      (c) == ARABIC_ISOLATED_RESH ||  \
+      (c) == ARABIC_ISOLATED_ZAYIN || \
+      (c) == ARABIC_ISOLATED_WAW  || \
+      (c) == ARABIC_ISOLATED_TA_MARBUTA)
+/* from the first to last (including all forms, and special cases
+ * like aleph maqsura in some forms*/
+#define ARABIC_IS_CONTEXT(c)   (((c) >= ARABIC_ISOLATED_ALEPH && (c) <= ARABIC_ISOLATED_YODH + 3) || \
+      ((c) >= ARABIC_ISOLATED_ALEPH_MADDA && (c) <= ARABIC_ISOLATED_ALEPH_MADDA + 3) || \
+      (c) == 0xFBE8 || \
+      (c) == 0xFBE9)
+#define ARABIC_IS_LETTER(c)    ARABIC_IS_CONTEXT(c)
+/* used for arabic context logic */
+/* each value is the offset from the regular char in unicode */
+enum _ArabicContext {
+     ARABIC_CONTEXT_ISOLATED = 0,
+     ARABIC_CONTEXT_FINAL = 1,
+     ARABIC_CONTEXT_INITIAL = 2,
+     ARABIC_CONTEXT_MEDIAL = 3
+};
+typedef enum _ArabicContext ArabicContext;
+
+static FriBidiChar
+_evas_intl_arabic_isolated_to_context(FriBidiChar chr, ArabicContext context);
+
+static int
+_evas_intl_arabic_text_to_isolated(FriBidiChar *text);
+
+static FriBidiChar
+_evas_intl_arabic_general_to_isolated(FriBidiChar chr);
+
+/* FIXME: there are issues with text that's already in context
+ * vowels support is needed (skip them when analysing context)*/
+int
+evas_intl_arabic_to_context(FriBidiChar *text)
+{
+   int i;
+   int len;
+   int start_of_context = 1; /* assume the first is special/non arabic */
+   int last_is_first = 0;
+   int last_letter = 0;
+
+   /* check for empty string */
+   if (!*text)
+     return 0;
+
+   len = _evas_intl_arabic_text_to_isolated(text);
+   /*FIXME: make it skip vowels */
+   for (i = 0; i < len; i++)
+     {
+       if (!ARABIC_IS_LETTER(text[i]))
+         {
+            /* mark so it won't be touched,
+             * though start formating */
+            if (last_letter && !start_of_context)
+              {
+                 ArabicContext tmp = (last_is_first) ?
+                    ARABIC_CONTEXT_ISOLATED : ARABIC_CONTEXT_FINAL;
+                 text[i-1] = _evas_intl_arabic_isolated_to_context(
+                       last_letter,
+                       tmp);
+              }
+            last_is_first = 0;
+            start_of_context = 1;
+            last_letter = 0;
+            continue;
+         }
+       /* adjust the last letter */
+       last_letter = text[i];
+       if (ARABIC_IS_SPECIAL_LETTER(text[i]))
+         {
+            if (!start_of_context)
+              text[i] = _evas_intl_arabic_isolated_to_context(text[i], ARABIC_CONTEXT_FINAL);
+            /* else: leave isolated */
+
+            start_of_context = 1;
+            last_is_first = 0;
+            continue;
+         }
+
+       if (start_of_context)
+         {
+            text[i] = _evas_intl_arabic_isolated_to_context(text[i], ARABIC_CONTEXT_INITIAL);
+            last_is_first = 1;
+         }
+       else
+         {
+            text[i] = _evas_intl_arabic_isolated_to_context(text[i], ARABIC_CONTEXT_MEDIAL);
+            last_is_first = 0;
+         }
+       /* spceial chars don't get here. */
+       start_of_context = 0;
+
+     }
+   /* if it's arabic and not isolated, the last is always final */
+   i--;
+   if (last_letter && !start_of_context)
+     {
+       ArabicContext tmp = (last_is_first) ? ARABIC_CONTEXT_ISOLATED : ARABIC_CONTEXT_FINAL;
+       /* because it's medial atm, and should be isolated */
+       text[i] = _evas_intl_arabic_isolated_to_context(last_letter, tmp);
+     }
+
+   return len;
+}
+
+/* I wish I could think about a simpler way to do it.
+ * Just match every word with it's isolated form */
+static FriBidiChar
+_evas_intl_arabic_general_to_isolated(FriBidiChar chr)
+{
+   switch (chr)
+     {
+      case ARABIC_ALEPH_MADDA:
+        return ARABIC_ISOLATED_ALEPH_MADDA;
+
+      case ARABIC_ALEPH:
+        return ARABIC_ISOLATED_ALEPH;
+
+      case ARABIC_TA_MARBUTA:
+        return ARABIC_ISOLATED_TA_MARBUTA;
+
+      case ARABIC_BET:
+        return ARABIC_ISOLATED_BET;
+
+      case ARABIC_TAW:
+        return ARABIC_ISOLATED_TAW;
+
+      case ARABIC_TA:
+        return ARABIC_ISOLATED_TA;
+
+      case ARABIC_GIMEL:
+        return ARABIC_ISOLATED_GIMEL;
+
+      case ARABIC_HETH:
+        return ARABIC_ISOLATED_HETH;
+
+      case ARABIC_HA:
+        return ARABIC_ISOLATED_HA;
+
+      case ARABIC_DALET:
+        return ARABIC_ISOLATED_DALET;
+
+      case ARABIC_DAL:
+        return ARABIC_ISOLATED_DAL;
+
+      case ARABIC_RESH:
+        return ARABIC_ISOLATED_RESH;
+
+      case ARABIC_ZAYIN:
+        return ARABIC_ISOLATED_ZAYIN;
+
+      case ARABIC_SHIN:
+        return ARABIC_ISOLATED_SHIN;
+
+      case ARABIC_SH:
+        return ARABIC_ISOLATED_SH;
+
+      case ARABIC_TSADE:
+        return ARABIC_ISOLATED_TSADE;
+
+      case ARABIC_DAD:
+        return ARABIC_ISOLATED_DAD;
+
+      case ARABIC_TETH:
+        return ARABIC_ISOLATED_TETH;
+
+      case ARABIC_ZA:
+        return ARABIC_ISOLATED_ZA;
+
+      case ARABIC_AYIN:
+        return ARABIC_ISOLATED_AYIN;
+
+      case ARABIC_GHAIN:
+        return ARABIC_ISOLATED_GHAIN;
+
+      case ARABIC_PE:
+        return ARABIC_ISOLATED_PE;
+
+      case ARABIC_QOPH:
+        return ARABIC_ISOLATED_QOPH;
+
+      case ARABIC_KAPH:
+        return ARABIC_ISOLATED_KAPH;
+
+      case ARABIC_LAMED:
+        return ARABIC_ISOLATED_LAMED;
+
+      case ARABIC_MEM:
+        return ARABIC_ISOLATED_MEM;
+
+      case ARABIC_NUN:
+        return ARABIC_ISOLATED_NUN;
+
+      case ARABIC_HE:
+        return ARABIC_ISOLATED_HE;
+
+      case ARABIC_WAW:
+        return ARABIC_ISOLATED_WAW;
+
+      case ARABIC_ALEPH_MAQSURA:
+        return ARABIC_ISOLATED_ALEPH_MAQSURA;
+
+      case ARABIC_YODH:
+        return ARABIC_ISOLATED_YODH;
+      default:
+        return chr;
+     }
+}
+
+static FriBidiChar
+_evas_intl_arabic_isolated_to_context(FriBidiChar chr, ArabicContext context)
+{
+   if (ARABIC_IS_SPECIAL_LETTER(chr))
+     {
+       if (context == ARABIC_CONTEXT_INITIAL)
+         return chr;
+       else
+         return chr + ARABIC_CONTEXT_FINAL;
+     }
+   /* HACK AROUND ALIF MAQSURA */
+   else if (chr == ARABIC_ISOLATED_ALEPH_MAQSURA && context > 1)
+     {
+       chr = 0xFBE8; /* the initial form */
+       context -= 2;
+     }
+   return chr + context;
+}
+
+static int
+_evas_intl_arabic_text_to_isolated(FriBidiChar *text)
+{
+   int i = 0;
+   while (*text)
+     {
+       /* if it's not arabic/it's already in context
+        * it's just returned the same */
+       *text = _evas_intl_arabic_general_to_isolated(*text);
+       text++;
+       i++;
+     }
+   return i;
+}
+#endif
diff --git a/src/lib/engines/common/evas_intl/evas_intl_arabic.h b/src/lib/engines/common/evas_intl/evas_intl_arabic.h
new file mode 100644 (file)
index 0000000..6e75edc
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef _EVAS_INTL_ARABIC
+#define _EVAS_INTL_ARABIC
+
+#include "evas_intl_utils.h"
+
+int
+evas_intl_arabic_to_context(EvasIntlChar *text);
+
+#endif
diff --git a/src/lib/engines/common/evas_intl_utils.c b/src/lib/engines/common/evas_intl_utils.c
new file mode 100644 (file)
index 0000000..90ccfcb
--- /dev/null
@@ -0,0 +1,143 @@
+#include <string.h>
+#include <stdlib.h>
+
+#include "evas_common.h"
+#include "evas_intl_utils.h"
+
+#ifdef INTERNATIONAL_SUPPORT
+#include <fribidi/fribidi.h>
+
+#define UTF8_BYTES_PER_CHAR 4
+
+#ifdef BUILD_PTHREAD
+static LK(fribidi_lock);
+#endif
+
+/* FIXME: fribidi_utf8_to_unicode should use char len and not byte len!*/
+char *
+evas_intl_utf8_to_visual(const char *text,
+                       int *ret_len,
+                       EvasIntlParType *direction,
+                       EvasIntlStrIndex **position_L_to_V_list,
+                       EvasIntlStrIndex **position_V_to_L_list,
+                       EvasIntlLevel **embedding_level_list)
+{
+   FriBidiChar *unicode_in, *unicode_out;
+   EvasIntlStrIndex *tmp_L_to_V_list = NULL;
+   EvasIntlStrIndex *tmp_V_to_L_list = NULL;
+   EvasIntlLevel *tmp_level_list = NULL;
+   char *text_out;
+   size_t len;
+   size_t byte_len;
+
+   if (!text)
+     return NULL;
+
+   len = evas_string_char_len_get(text);
+
+   byte_len = strlen(text); /* we need the actual number of bytes, not number of chars */
+
+   unicode_in = (FriBidiChar *)alloca(sizeof(FriBidiChar) * (len + 1));
+   if (!unicode_in)
+     {
+       len = -1;
+       goto error1;
+     }
+
+   len = fribidi_utf8_to_unicode(text, byte_len, unicode_in);
+   unicode_in[len] = 0;
+
+   unicode_out = (FriBidiChar *)alloca(sizeof(FriBidiChar) * (len + 1));
+   if (!unicode_out)
+     {
+       len = -1;
+       goto error2;
+     }
+
+    if (embedding_level_list)
+       {
+          *embedding_level_list = (EvasIntlLevel *)malloc(sizeof(EvasIntlLevel) * len);
+          if (!*embedding_level_list)
+            {
+             len = -1;
+             goto error3;
+            }
+        tmp_level_list = *embedding_level_list;
+       }
+     if (position_L_to_V_list)
+       {
+          *position_L_to_V_list = (EvasIntlStrIndex *)malloc(sizeof(EvasIntlStrIndex) * len);
+          if (!*position_L_to_V_list)
+            {
+             len = -1;
+             goto error4;
+            }
+        tmp_L_to_V_list = *position_L_to_V_list;
+       }
+     if (position_V_to_L_list)
+       {
+          *position_V_to_L_list = (EvasIntlStrIndex *)malloc(sizeof(EvasIntlStrIndex) * len);
+          if (!*position_V_to_L_list)
+            {
+             len = -1;
+             goto error5;
+            }
+        tmp_V_to_L_list = *position_V_to_L_list;
+       }
+
+#ifdef ARABIC_SUPPORT
+   /* fix arabic context */
+   evas_intl_arabic_to_context(unicode_in);
+#endif
+   LKL(fribidi_lock);
+   if (!fribidi_log2vis(unicode_in, len, direction,
+         unicode_out, tmp_L_to_V_list, tmp_V_to_L_list, tmp_level_list))
+     {
+        LKU(fribidi_lock);
+       len = -2;
+       goto error5;
+     }
+   LKU(fribidi_lock);
+
+   text_out = malloc(UTF8_BYTES_PER_CHAR * len + 1);
+   if (!text_out)
+     {
+       len = -1;
+       goto error6;
+     }
+
+   fribidi_unicode_to_utf8(unicode_out, len, text_out);
+
+   *ret_len = len;
+   return text_out;
+
+/* ERROR HANDLING */
+error6:
+   free(unicode_out);
+error5:
+   free(*position_V_to_L_list);
+   *position_V_to_L_list = NULL;
+error4:
+   free(*position_L_to_V_list);
+   *position_L_to_V_list = NULL;
+error3:
+   free(*embedding_level_list);
+   *embedding_level_list = NULL;
+error2:
+   free(unicode_in);
+error1:
+
+   *ret_len = len;
+   return NULL;
+}
+
+int
+evas_intl_is_rtl_char(EvasIntlLevel *embedded_level_list, EvasIntlStrIndex i)
+{
+   if(embedded_level_list || i < 0)
+     return 0;
+   return FRIBIDI_IS_RTL(embedded_level_list[i]);
+}
+#endif
diff --git a/src/lib/engines/common/evas_intl_utils.h b/src/lib/engines/common/evas_intl_utils.h
new file mode 100644 (file)
index 0000000..4ee7bff
--- /dev/null
@@ -0,0 +1,49 @@
+#ifndef _EVAS_INTL_UTILS
+#define _EVAS_INTL_UTILS
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_FRIBIDI
+# define USE_FRIBIDI
+# define INTERNATIONAL_SUPPORT
+#endif
+
+#ifdef USE_FRIBIDI
+# include <fribidi/fribidi.h>
+
+/* abstract fribidi */
+typedef FriBidiChar    EvasIntlChar;
+typedef FriBidiCharType        EvasIntlParType;
+typedef FriBidiStrIndex EvasIntlStrIndex;
+typedef FriBidiLevel   EvasIntlLevel;
+
+
+/* whether should fix arabic specifix issues */
+# define ARABIC_SUPPORT
+
+# ifdef ARABIC_SUPPORT
+#  include "evas_intl/evas_intl_arabic.h"
+# endif
+
+# define evas_intl_position_logical_to_visual(list, position) \
+               (list) ? list[position] : position;
+
+# define evas_intl_position_visual_to_logical(list, position) \
+               (list) ? list[position] : position;
+                               
+
+int
+evas_intl_is_rtl_char(EvasIntlLevel *embedded_level_list, EvasIntlStrIndex i);
+
+char *
+evas_intl_utf8_to_visual(const char *text,
+                       int *ret_len,
+                       EvasIntlParType *direction,
+                       EvasIntlStrIndex **position_L_to_V_list,
+                       EvasIntlStrIndex **position_V_to_L_list,
+                       EvasIntlLevel **embedding_level_list);
+#endif
+
+#endif
diff --git a/src/lib/engines/common/evas_line.h b/src/lib/engines/common/evas_line.h
new file mode 100644 (file)
index 0000000..9d45e3d
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _EVAS_LINE_H
+#define _EVAS_LINE_H
+
+
+EAPI void          evas_common_line_init               (void);
+
+EAPI void          evas_common_line_draw               (RGBA_Image *dst, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2);
+
+
+#endif /* _EVAS_LINE_H */
+
diff --git a/src/lib/engines/common/evas_line_main.c b/src/lib/engines/common/evas_line_main.c
new file mode 100644 (file)
index 0000000..a49d8f4
--- /dev/null
@@ -0,0 +1,663 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_blend_private.h"
+
+
+static void
+_evas_draw_point(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y);
+
+static void
+_evas_draw_simple_line(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1);
+
+static void
+_evas_draw_line(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1);
+
+static void
+_evas_draw_line_aa(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1);
+
+
+#define IN_RANGE(x, y, w, h) \
+( ((unsigned)(x) < (w)) && ((unsigned)(y) < (h)) )
+
+#define IN_RECT(x, y, rx, ry, rw, rh) \
+( ((unsigned)((x) - (rx)) < (rw)) && ((unsigned)((y) - (ry)) < (rh)) )
+
+#define EXCHANGE_POINTS(x0, y0, x1, y1) \
+{ \
+       int _tmp = y0; \
+  \
+       y0 = y1;   \
+       y1 = _tmp; \
+  \
+       _tmp = x0; \
+       x0 = x1;   \
+       x1 = _tmp; \
+}
+
+
+EAPI void
+evas_common_line_init(void)
+{
+}
+
+EAPI void
+evas_common_line_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1)
+{
+   int  x, y, w, h;
+   int  clx, cly, clw, clh;
+   int  cuse, cx, cy, cw, ch;
+
+   if ((x0 == x1) && (y0 == y1))
+     {
+       _evas_draw_point(dst, dc, x0, y0);
+       return;
+     }
+
+   clx = cly = 0;
+   clw = dst->cache_entry.w;
+   clh = dst->cache_entry.h;
+
+   /* save out clip info */
+   cuse = dc->clip.use;
+   cx = dc->clip.x;
+   cy = dc->clip.y;
+   cw = dc->clip.w;
+   ch = dc->clip.h;
+
+   if (cuse)
+     {
+       RECTS_CLIP_TO_RECT(clx, cly, clw, clh, cx, cy, cw, ch);
+       if ((clw < 1) || (clh < 1))
+          return;
+     }
+
+   x = MIN(x0, x1);
+   y = MIN(y0, y1);
+   w = MAX(x0, x1) - x + 1;
+   h = MAX(y0, y1) - y + 1;
+
+   RECTS_CLIP_TO_RECT(clx, cly, clw, clh, x, y, w, h);
+   if ((clw < 1) || (clh < 1))
+       return;
+
+   dc->clip.use = 1;
+   dc->clip.x = clx;
+   dc->clip.y = cly;
+   dc->clip.w = clw;
+   dc->clip.h = clh;
+
+   if (dc->anti_alias)
+       _evas_draw_line_aa(dst, dc, x0, y0, x1, y1);
+   else
+       _evas_draw_line(dst, dc, x0, y0, x1, y1);
+
+   /* restore clip info */
+   dc->clip.use = cuse;
+   dc->clip.x = cx;
+   dc->clip.y = cy;
+   dc->clip.w = cw;
+   dc->clip.h = ch;
+}
+
+
+static void
+_evas_draw_point(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y)
+{
+   RGBA_Gfx_Pt_Func pfunc;
+
+   if (!IN_RANGE(x, y, dst->cache_entry.w, dst->cache_entry.h))
+       return;
+   if ((dc->clip.use) && (!IN_RECT(x, y, dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h)))
+       return;
+   pfunc = evas_common_gfx_func_composite_color_pt_get(dc->col.col, dst, dc->render_op);
+   if (pfunc)
+       pfunc(0, 255, dc->col.col, dst->image.data + (dst->cache_entry.w * y) + x);
+}
+
+/*
+   these functions use the dc->clip data as bounding
+   data. they assume that such data has already been cut
+   back to lie in the dst image rect and the object's
+   (line) bounding rect.
+*/
+static void
+_evas_draw_simple_line(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1)
+{
+   int     dx, dy, len, lx, ty, rx, by;
+   int     clx, cly, clw, clh;
+   int     dstw;
+   DATA32  *p, color;
+   RGBA_Gfx_Pt_Func pfunc;
+   RGBA_Gfx_Func    sfunc;
+
+   dstw = dst->cache_entry.w;
+   color = dc->col.col;
+
+   if (y0 > y1)
+      EXCHANGE_POINTS(x0, y0, x1, y1)
+   if (x0 > x1)
+      EXCHANGE_POINTS(x0, y0, x1, y1)
+
+   dx = x1 - x0;
+   dy = y1 - y0;
+
+   clx = dc->clip.x;
+   cly = dc->clip.y;
+   clw = dc->clip.w;
+   clh = dc->clip.h;
+
+   lx = clx;
+   rx = clx + clw - 1;
+   ty = cly;
+   by = cly + clh - 1;
+
+   if (dy == 0)
+     {
+#ifdef EVAS_SLI
+       if (((y0) % dc->sli.h) == dc->sli.y)
+#endif
+         {
+            if ((y0 >= ty) && (y0 <= by))
+              {
+                 if (dx < 0)
+                   {
+                      int  tmp = x1;
+
+                      x1 = x0;
+                      x0 = tmp;
+                   }
+
+                 if (x0 < lx) x0 = lx;
+                 if (x1 > rx) x1 = rx;
+
+                 len = x1 - x0 + 1;
+                 p = dst->image.data + (dstw * y0) + x0;
+                 sfunc = evas_common_gfx_func_composite_color_span_get(color, dst, len, dc->render_op);
+                 if (sfunc)
+                   sfunc(NULL, NULL, color, p, len);
+              }
+         }
+       return;
+     }
+
+   pfunc = evas_common_gfx_func_composite_color_pt_get(color, dst, dc->render_op);
+   if (!pfunc) return;
+
+   if (dx == 0)
+     {
+       if ((x0 >= lx) && (x0 <= rx))
+         {
+            if (y0 < ty) y0 = ty;
+            if (y1 > by) y1 = by;
+
+            len = y1 - y0 + 1;
+            p = dst->image.data + (dstw * y0) + x0;
+            while (len--)
+              {
+#ifdef EVAS_SLI
+                 if (((y1 + 1 - len) % dc->sli.h) == dc->sli.y)
+#endif
+                   {
+                      pfunc(0, 255, color, p);
+                   }
+                 p += dstw;
+              }
+         }
+       return;
+     }
+
+   if ((dy == dx) || (dy == -dx))
+     {
+       int   p0_in, p1_in;
+
+       p0_in = (IN_RECT(x0, y0, clx, cly, clw, clh) ? 1 : 0);
+       p1_in = (IN_RECT(x1, y1, clx, cly, clw, clh) ? 1 : 0);
+
+       if (dy > 0)
+         {
+           if (!p0_in)
+             {
+               x0 = x0 + (ty - y0);
+               y0 = ty;
+               if (x0 > rx) return;
+               if (x0 < lx)
+                 {
+                   y0 = y0 + (lx - x0);
+                   x0 = lx;
+                   if ((y0 < ty) || (y0 > by)) return;
+                 }
+             }
+           if (!p1_in)
+             {
+               x1 = x0 + (by - y0);
+               y1 = by;
+               if (x1 < lx) return;
+               if (x1 > rx)
+                 {
+                   y1 = y0 + (rx - x0);
+                   x1 = rx;
+                   if ((y1 < ty) || (y1 > by)) return;
+                 }
+             }
+         }
+       else
+         {
+           if (!p0_in)
+             {
+               x0 = x0 - (by - y0);
+               y0 = by;
+               if (x0 > rx) return;
+               if (x0 < lx)
+                 {
+                   y0 = y0 - (lx - x0);
+                   x0 = lx;
+                   if ((y0 < ty) || (y0 > by)) return;
+                 }
+             }
+           if (!p1_in)
+             {
+               x1 = x0 - (ty - y0);
+               y1 = ty;
+               if (x1 < lx) return;
+               if (x1 > rx)
+                 {
+                   y1 = y0 - (rx - x0);
+                   x1 = rx;
+                   if ((y1 < ty) || (y1 > by)) return;
+                 }
+             }
+         }
+       if (y1 > y0)
+         {
+            p = dst->image.data + (dstw * y0) + x0;
+            len = y1 - y0 + 1;
+            if (dx > 0)  dstw++;
+            else  dstw--;
+         }
+       else
+         {
+            len = y0 - y1 + 1;
+            p = dst->image.data + (dstw * y1) + x1;
+            if (dx > 0)  dstw--;
+            else  dstw++;
+         }
+
+       while (len--)
+         {
+#ifdef EVAS_SLI
+            if (((y1 + 1 - len) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 pfunc(0, 255, color, p);
+              }
+           p += dstw;
+         }
+     }
+}
+
+
+#define SETUP_LINE_SHALLOW             \
+       if (x0 > x1)                                                    \
+         {                                                                     \
+          EXCHANGE_POINTS(x0, y0, x1, y1)                              \
+          dx = -dx;                                                    \
+          dy = -dy;                                                    \
+         }                                                                     \
+                                                                               \
+       px = x0;                                                                \
+       py = y0;                                                                \
+                                                                               \
+       p0_in = (IN_RANGE(x0 , y0 , clw, clh) ? 1 : 0);         \
+       p1_in = (IN_RANGE(x1 , y1 , clw, clh) ? 1 : 0);         \
+                                                                               \
+       dely = 1;                                                               \
+       dh = dstw;                                                              \
+       if (dy < 0)                                                             \
+         {                                                                     \
+          dely = -1;                                                   \
+          dh = -dstw;                                                  \
+         }                                                                     \
+                                                                               \
+       dyy = ((dy) << 16) / (dx);                                              \
+                                                                               \
+       if (!p0_in)                                                             \
+         {                                                                     \
+          dxx = ((dx) << 16) / (dy);                                   \
+          if (px < 0)                                                  \
+            {                                                          \
+               x = -px;  px = 0;                                               \
+               yy = x * dyy;                                           \
+               y = yy >> 16;                                           \
+               if (!a_a)                                                       \
+                   y += (yy - (y << 16)) >> 15;                        \
+               py += y;                                                        \
+               if ((dely > 0) && (py >= clh))                  \
+                  return;                                                      \
+               else if ((dely < 0) && (py < -1))                       \
+                  return;                                                      \
+            }                                                          \
+                                                                               \
+          y = 0;                                                               \
+          if ((dely > 0) && (py < -1))                         \
+               y = (-1 - py);                                          \
+          else if ((dely < 0) && (py >= clh))                  \
+               y = (clh - 1 - py);                                     \
+                                                                               \
+          xx = y * dxx;                                                        \
+          x = xx >> 16;                                                        \
+          if (!a_a)                                                    \
+              x += (xx - (x << 16)) >> 15;                     \
+          px += x;                                                             \
+          if (px >= clw) return;                                       \
+                                                                               \
+          yy = x * dyy;                                                        \
+          y = yy >> 16;                                                        \
+          if (!a_a)                                                    \
+              y += (yy - (y << 16)) >> 15;                     \
+          py += y;                                                             \
+          if ((dely > 0) && (py >= clh))                               \
+                return;                                                        \
+          else if ((dely < 0) && (py < -1))                    \
+                return;                                                        \
+         }                                                                     \
+                                                                               \
+       p = data + (dstw * py) + px;                                    \
+                                                                               \
+       x = px - x0;                                                    \
+       yy = x * dyy;                                                   \
+       prev_y = (yy >> 16);                                            \
+                                                                               \
+       rx = MIN(x1 + 1, clw);                                          \
+       by = clh - 1;
+
+
+#define SETUP_LINE_STEEP               \
+   if (y0 > y1)                                                                \
+     {                                                                 \
+       EXCHANGE_POINTS(x0, y0, x1, y1)                         \
+       dx = -dx;                                                               \
+       dy = -dy;                                                               \
+     }                                                                 \
+                                                                               \
+   px = x0;                                                                    \
+   py = y0;                                                                    \
+                                                                               \
+   p0_in = (IN_RANGE(x0 , y0 , clw, clh) ? 1 : 0);             \
+   p1_in = (IN_RANGE(x1 , y1 , clw, clh) ? 1 : 0);             \
+                                                                               \
+   delx = 1;                                                           \
+   if (dx < 0)                                                         \
+       delx = -1;                                                              \
+                                                                               \
+   dxx = ((dx) << 16) / (dy);                                          \
+                                                                               \
+   if (!p0_in)                                                         \
+     {                                                                 \
+       dyy = ((dy) << 16) / (dx);                                              \
+                                                                               \
+       if (py < 0)                                                             \
+         {                                                                     \
+          y = -py;  py = 0;                                            \
+          xx = y * dxx;                                                        \
+          x = xx >> 16;                                                        \
+          if (!a_a)                                                    \
+              x += (xx - (x << 16)) >> 15;                     \
+          px += x;                                                             \
+          if ((delx > 0) && (px >= clw))                               \
+               return;                                                 \
+          else if ((delx < 0) && (px < -1))                    \
+               return;                                                 \
+         }                                                                     \
+                                                                               \
+       x = 0;                                                          \
+       if ((delx > 0) && (px < -1))                                    \
+          x = (-1 - px);                                                       \
+       else if ((delx < 0) && (px >= clw))                             \
+          x = (clw - 1 - px);                                          \
+                                                                               \
+       yy = x * dyy;                                                   \
+       y = yy >> 16;                                                   \
+       if (!a_a)                                                               \
+           y += (yy - (y << 16)) >> 15;                                \
+       py += y;                                                                \
+       if (py >= clh) return;                                          \
+                                                                               \
+       xx = y * dxx;                                                   \
+       x = xx >> 16;                                                   \
+        if (!a_a)                                                              \
+           x += (xx - (x << 16)) >> 15;                                \
+       px += x;                                                                \
+       if ((delx > 0) && (px >= clw))                          \
+          return;                                                              \
+       else if ((delx < 0) && (px < -1))                               \
+          return;                                                              \
+     }                                                                 \
+                                                                               \
+   p = data + (dstw * py) + px;                                        \
+                                                                               \
+   y = py - y0;                                                                \
+   xx = y * dxx;                                                               \
+   prev_x = (xx >> 16);                                                        \
+                                                                               \
+   by = MIN(y1 + 1, clh);                                              \
+   rx = clw - 1;
+
+
+
+static void
+_evas_draw_line(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1)
+{
+   int     px, py, x, y, prev_x, prev_y;
+   int     dx, dy, rx, by, p0_in, p1_in, dh, a_a = 0;
+   int     delx, dely, xx, yy, dxx, dyy;
+   int     clx, cly, clw, clh;
+   int     dstw;
+   DATA32  *p, *data, color;
+   RGBA_Gfx_Pt_Func pfunc;
+
+   dx = x1 - x0;
+   dy = y1 - y0;
+
+   if ( (dx == 0) || (dy == 0) || (dx == dy) || (dx == -dy) )
+     {
+       _evas_draw_simple_line(dst, dc, x0, y0, x1, y1);
+       return;
+     }
+
+   color = dc->col.col;
+   pfunc = evas_common_gfx_func_composite_color_pt_get(color, dst, dc->render_op);
+   if (!pfunc) return;
+
+   clx = dc->clip.x;
+   cly = dc->clip.y;
+   clw = dc->clip.w;
+   clh = dc->clip.h;
+
+   data = dst->image.data;
+   dstw = dst->cache_entry.w;
+
+   data += (dstw * cly) + clx;
+   x0 -= clx;
+   y0 -= cly;
+   x1 -= clx;
+   y1 -= cly;
+
+   /* shallow: x-parametric */
+   if ((dy < dx) || (dy < -dx))
+     {
+       SETUP_LINE_SHALLOW
+
+       while (px < rx)
+         {
+           y = (yy >> 16);
+           y += ((yy - (y << 16)) >> 15);
+           if (prev_y != y)
+             {
+               prev_y = y;
+               p += dh;
+               py += dely;
+             }
+           if (!p1_in)
+             {
+               if ((py < 0) && (dely < 0)) return;
+               if ((py > by) && (dely > 0)) return;
+             }
+#ifdef EVAS_SLI
+            if (((py) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 if (IN_RANGE(px, py, clw, clh))
+                   pfunc(0, 255, color, p);
+              }
+           yy += dyy;
+           px++;
+           p++;
+         }
+       return;
+     }
+
+   /* steep: y-parametric */
+
+   SETUP_LINE_STEEP
+
+   while (py < by)
+     {
+       x = (xx >> 16);
+       x += ((xx - (x << 16)) >> 15);
+       if (prev_x != x)
+         {
+           prev_x = x;
+           px += delx;
+           p += delx;
+         }
+       if (!p1_in)
+         {
+           if ((px < 0) && (delx < 0)) return;
+           if ((px > rx) && (delx > 0)) return;
+         }
+#ifdef EVAS_SLI
+       if (((py) % dc->sli.h) == dc->sli.y)
+#endif
+         {
+            if (IN_RANGE(px, py, clw, clh))
+              pfunc(0, 255, color, p);
+         }
+       xx += dxx;
+       py++;
+       p += dstw;
+     }
+}
+
+
+static void
+_evas_draw_line_aa(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1)
+{
+   int     px, py, x, y, prev_x, prev_y;
+   int     dx, dy, rx, by, p0_in, p1_in, dh, a_a = 1;
+   int     delx, dely, xx, yy, dxx, dyy;
+   int     clx, cly, clw, clh;
+   int     dstw;
+   DATA32  *p, *data, color;
+   RGBA_Gfx_Pt_Func pfunc;
+
+   if (y0 > y1)
+      EXCHANGE_POINTS(x0, y0, x1, y1)
+   dx = x1 - x0;
+   dy = y1 - y0;
+
+   if ( (dx == 0) || (dy == 0) || (dx == dy) || (dx == -dy) )
+     {
+       _evas_draw_simple_line(dst, dc, x0, y0, x1, y1);
+       return;
+     }
+
+   color = dc->col.col;
+   pfunc = evas_common_gfx_func_composite_mask_color_pt_get(color, dst, dc->render_op);
+   if (!pfunc) return;
+
+   clx = dc->clip.x;
+   cly = dc->clip.y;
+   clw = dc->clip.w;
+   clh = dc->clip.h;
+
+   data = dst->image.data;
+   dstw = dst->cache_entry.w;
+
+   data += (dstw * cly) + clx;
+   x0 -= clx;
+   y0 -= cly;
+   x1 -= clx;
+   y1 -= cly;
+
+   /* shallow: x-parametric */
+   if ((dy < dx) || (dy < -dx))
+     {
+       SETUP_LINE_SHALLOW
+
+       while (px < rx)
+         {
+           DATA8   aa;
+
+           y = (yy >> 16);
+           if (prev_y != y)
+             {
+               prev_y = y;
+               p += dh;
+               py += dely;
+             }
+           if (!p1_in)
+             {
+               if ((py < -1) && (dely < 0)) return;
+               if ((py > by) && (dely > 0)) return;
+             }
+           if ((unsigned)(px) < clw)
+             {
+               aa = ((yy - (y << 16)) >> 8);
+               if ((unsigned)(py) < clh)
+                  pfunc(0, 255 - aa, color, p);
+               if ((unsigned)(py + 1) < clh)
+                  pfunc(0, aa, color, p + dstw);
+             }
+           yy += dyy;
+           px++;
+           p++;
+         }
+       return;
+     }
+
+   /* steep: y-parametric */
+
+   SETUP_LINE_STEEP
+
+   while (py < by)
+     {
+       DATA8   aa;
+
+       x = (xx >> 16);
+       if (prev_x != x)
+         {
+           prev_x = x;
+           px += delx;
+           p += delx;
+         }
+       if (!p1_in)
+         {
+           if ((px < -1) && (delx < 0)) return;
+           if ((px > rx) && (delx > 0)) return;
+         }
+       if ((unsigned)(py) < clh)
+         {
+           aa = ((xx - (x << 16)) >> 8);
+           if ((unsigned)(px) < clw)
+               pfunc(0, 255 - aa, color, p);
+           if ((unsigned)(px + 1) < clw)
+               pfunc(0, aa, color, p + 1);
+         }
+       xx += dxx;
+       py++;
+       p += dstw;
+     }
+}
diff --git a/src/lib/engines/common/evas_map_image.c b/src/lib/engines/common/evas_map_image.c
new file mode 100644 (file)
index 0000000..3112a83
--- /dev/null
@@ -0,0 +1,403 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_blend_private.h"
+
+#ifdef BUILD_SCALE_SMOOTH
+# ifdef BUILD_MMX
+#  undef SCALE_USING_MMX
+#  define SCALE_USING_MMX
+# endif
+#endif
+
+#define FPI 8
+#define FPI1 (1 << (FPI))
+#define FPIH (1 << (FPI - 1))
+
+#define FPFPI1 (1 << (FP + FPI))
+
+typedef struct _Line Line;
+typedef struct _Span Span;
+
+struct _Span
+{
+   int x1, x2;
+   FPc o1, o2, z1, z2;
+   FPc  u[2], v[2];
+   DATA32 col[2];
+};
+
+struct _Line
+{
+   Span span[2];
+};
+
+static FPc
+_interp(int x1, int x2, int p, FPc u1, FPc u2)
+{
+   FPc u;
+
+   x2 -= x1;
+   p -= x1;
+   u = u2 - u1;
+   u = (u * p) / (x2 + 1);
+   // FIXME: do z persp
+   return u1 + u;
+}
+
+static DATA32
+_interp_col(int x1, int x2, int p, DATA32 col1, DATA32 col2)
+{
+   x2 -= x1;
+   p -= x1;
+   p = (p << 8) / (x2 + 1);
+   // FIXME: do z persp
+   return INTERP_256(p, col2, col1);
+}
+
+static void
+_limit(Span *s, int c1, int c2, int nocol)
+{
+   if (s->x1 < c1)
+     {
+        s->u[0] = _interp(s->x1, s->x2, c1, s->u[0], s->u[1]);
+        s->v[0] = _interp(s->x1, s->x2, c1, s->v[0], s->v[1]);
+        if (!nocol)
+          s->col[0] = _interp_col(s->x1, s->x2, c1, s->col[0], s->col[1]);
+        s->x1 = c1;
+        s->o1 = c1 << FP;
+        // FIXME: do s->z1
+     }
+   if (s->x2 > c2)
+     {
+        s->u[1] = _interp(s->x1, s->x2, c2, s->u[0], s->u[1]);
+        s->v[1] = _interp(s->x1, s->x2, c2, s->v[0], s->v[1]);
+        if (!nocol)
+          s->col[1] = _interp_col(s->x1, s->x2, c2, s->col[0], s->col[1]);
+        s->x2 = c2;
+        s->o2 = c2 << FP;
+        // FIXME: do s->z2
+     }
+}
+
+// 12.63 % of time - this can improve
+static void
+_calc_spans(RGBA_Map_Point *p, Line *spans, int ystart, int yend, int cx, int cy, int cw, int ch)
+{
+   int i, y, yp;
+   int py[4];
+   int edge[4][4], edge_num, swapped, order[4];
+   FPc uv[4][2], u, v, x, h, t;
+   DATA32 col[4];
+   
+#if 1 // maybe faster on x86?
+   for (i = 0; i < 4; i++) py[i] = p[i].y >> FP;
+# define PY(x) (py[x])   
+#else
+# define PY(x) (p[x].y >> FP) 
+#endif
+   
+   if ((PY(0) == PY(1)) && (PY(0) == PY(2)) && (PY(0) == PY(3)))
+     {
+        int leftp, rightp;
+        int nocol = 1;
+        
+        leftp = rightp = 0;
+        for (i = 1; i < 4; i++)
+          {
+             if (p[i].x < p[leftp].x) leftp = i;
+             if (p[i].x > p[rightp].x) rightp = i;
+             if (p[i].col != 0xffffffff) nocol = 0;
+          }
+        for (y = ystart; y <= yend; y++)
+          {
+             yp = y - ystart;
+             if (y == PY(0))
+               {
+                  i = 0;
+                  spans[yp].span[i].x1 = p[leftp].x >> FP;
+                  spans[yp].span[i].o1 = p[leftp].x;
+                  spans[yp].span[i].u[0] = p[leftp].u;
+                  spans[yp].span[i].v[0] = p[leftp].v;
+                  spans[yp].span[i].col[0] = p[leftp].col;
+                  spans[yp].span[i].x2 = p[rightp].x >> FP;
+                  spans[yp].span[i].o2 = p[rightp].x;
+                  spans[yp].span[i].u[1] = p[rightp].u;
+                  spans[yp].span[i].v[1] = p[rightp].v;
+                  spans[yp].span[i].col[1] = p[rightp].col;
+                  if ((spans[yp].span[i].x1 >= (cx + cw)) ||
+                      (spans[yp].span[i].x2 < cx))
+                    spans[yp].span[i].x1 = -1;
+                  else
+                    {
+                       _limit(&(spans[yp].span[i]), cx, cx + cw, nocol);
+                       i++;
+                       spans[yp].span[i].x1 = -1;
+                    }
+               }
+             else
+               spans[yp].span[0].x1 = -1;
+          }
+        return;
+     }
+   for (y = ystart; y <= yend; y++)
+     {
+        int nocol = 1;
+        
+        yp = y - ystart;
+        edge_num = 0;
+        for (i = 0; i < 4; i++)
+          {
+             if ((PY(i) <= y) && (PY((i + 1) % 4) > y))
+               {
+                  edge[edge_num][0] = i;
+                  edge[edge_num][1] = (i + 1) % 4;
+                  edge_num++;
+               }
+             else if ((PY((i + 1) % 4) <= y) && (PY(i) > y))
+               {
+                  edge[edge_num][0] = (i + 1) % 4;
+                  edge[edge_num][1] = i;
+                  edge_num++;
+               }
+             if (p[i].col != 0xffffffff) nocol = 0;
+          }
+        // calculate line x points for each edge
+        for (i = 0; i < edge_num; i++)
+          {
+             int e1 = edge[i][0];
+             int e2 = edge[i][1];
+             FPc t256;
+             
+             h = (p[e2].y - p[e1].y) >> FP; // height of edge
+             t = (((y << FP) + (FP1 - 1)) - p[e1].y) >> FP;
+             x = p[e2].x - p[e1].x;
+             x = p[e1].x + ((x * t) / h);
+
+/*             
+             // FIXME: 3d accuracy here
+             // XXX t needs adjusting. above its a linear interp point
+             // only.
+             // 
+             // // FIXME: do in fixed pt. reduce divides
+             evas_common_cpu_end_opt();
+             // 
+             int foc = 512, z0 = 0, px = 320, py = 240; // FIXME: need from map points
+             //
+             float focf, hf;
+             float z1, z2, y1, y2, dz, dy, zt, dydz, yt;
+             
+             focf = foc;
+             hf = h;
+             
+             // adjust for fixed point and focal length and z0 for map
+             z1 = (p[e1].z >> FP) - z0 + foc;
+             z2 = (p[e2].z >> FP) - z0 + foc;
+             // deltas
+             dz = z1 - z2;
+             
+             if (dz != 0)
+               {
+                  int pt;
+                  
+                  // adjust for perspective point (being 0 0)
+                  y1 = (p[e1].y >> FP) - py;
+                  y2 = (p[e2].y >> FP) - py;
+                  
+                  // correct for x &y not being in world coords - screen coords
+                  y1 = (y1 * z1) / focf;
+                  y2 = (y2 * z2) / focf;
+                  
+                  // deltas
+                  dy = y1 - y2;
+                  
+                  yt = y - py;
+                  dydz = dy / dz;
+
+                  zt = (y2 - (dydz * z2)) / ((yt / focf) - dydz);
+
+                  pt = t;
+                  t = ((z1 - zt) * hf) / dz;
+               }
+ */
+             u = p[e2].u - p[e1].u;
+             u = p[e1].u + ((u * t) / h);
+             
+             v = p[e2].v - p[e1].v;
+             v = p[e1].v + ((v * t) / h);
+
+             // FIXME: 3d accuracy for color too
+             t256 = (t << 8) / h; // maybe * 255?
+             col[i] = INTERP_256(t256, p[e2].col, p[e1].col);
+             
+             // FIXME: store z persp
+             uv[i][1] = v;
+             uv[i][0] = u;
+             edge[i][2] = x >> FP;
+             edge[i][3] = x;
+             // also fill in order
+             order[i] = i;
+          }
+        // sort edges from left to right - bubble. its a small list!
+        do
+          {
+             swapped = 0;
+             for (i = 0; i < (edge_num - 1); i++)
+               {
+                  if (edge[order[i]][2] > edge[order[i + 1]][2])
+                    {
+                       t = order[i];
+                       order[i] = order[i + 1];
+                       order[i + 1] = t;
+                       swapped = 1;
+                    }
+               }
+          }
+        while (swapped);
+        if (edge_num == 2)
+          {
+             i = 0;
+             spans[yp].span[i].x1 = edge[order[0]][2];
+             spans[yp].span[i].o1 = edge[order[0]][3];
+             spans[yp].span[i].u[0] = uv[order[0]][0];
+             spans[yp].span[i].v[0] = uv[order[0]][1];
+             spans[yp].span[i].col[0] = col[order[0]];
+             
+             spans[yp].span[i].x2 = edge[order[1]][2];
+             spans[yp].span[i].o2 = edge[order[1]][3];
+             spans[yp].span[i].u[1] = uv[order[1]][0];
+             spans[yp].span[i].v[1] = uv[order[1]][1];
+             spans[yp].span[i].col[1] = col[order[1]];
+             if ((spans[yp].span[i].x1 >= (cx + cw)) ||
+                 (spans[yp].span[i].x2 < cx))
+               spans[yp].span[i].x1 = -1;
+             else
+               {
+                  _limit(&(spans[yp].span[i]), cx, cx + cw, nocol);
+                  i++;
+                  spans[yp].span[i].x1 = -1;
+               }
+          }
+        else if (edge_num == 4)
+          {
+             i = 0;
+             spans[yp].span[i].x1 = edge[order[0]][2];
+             spans[yp].span[i].u[0] = uv[order[0]][0];
+             spans[yp].span[i].v[0] = uv[order[0]][1];
+             spans[yp].span[i].col[0] = col[order[0]];
+             
+             spans[yp].span[i].x2 = edge[order[1]][2];
+             spans[yp].span[i].u[1] = uv[order[1]][0];
+             spans[yp].span[i].v[1] = uv[order[1]][1];
+             spans[yp].span[i].col[1] = col[order[1]];
+             if ((spans[yp].span[i].x1 >= (cx + cw)) ||
+                 (spans[yp].span[i].x2 < cx))
+               spans[yp].span[i].x1 = -1;
+             else
+               {
+                  _limit(&(spans[yp].span[i]), cx, cx + cw, nocol);
+                  i++;
+               }
+             spans[yp].span[i].x1 = edge[order[2]][2];
+             spans[yp].span[i].u[0] = uv[order[2]][0];
+             spans[yp].span[i].v[0] = uv[order[2]][1];
+             spans[yp].span[i].col[0] = col[order[2]];
+             
+             spans[yp].span[i].x2 = edge[order[3]][2];
+             spans[yp].span[i].u[1] = uv[order[3]][0];
+             spans[yp].span[i].v[1] = uv[order[3]][1];
+             spans[yp].span[i].col[1] = col[order[3]];
+             if ((spans[yp].span[i].x1 >= (cx + cw)) ||
+                 (spans[yp].span[i].x2 < cx))
+               spans[yp].span[i].x1 = -1;
+             else
+               {
+                  int l = cx;
+                  
+                  if (i > 0) l = spans[yp].span[i - 1].x2;
+                  _limit(&(spans[yp].span[i]), l, cx + cw, nocol);
+               }
+          }
+        else
+          spans[yp].span[0].x1 = -1;
+     }
+}
+
+#ifdef BUILD_SCALE_SMOOTH
+# ifdef BUILD_MMX
+#  undef FUNC_NAME
+#  define FUNC_NAME evas_common_map4_rgba_internal_mmx
+#  undef SCALE_USING_MMX
+#  define SCALE_USING_MMX
+#  include "evas_map_image_internal.c"
+# endif
+# ifdef BUILD_C
+#  undef FUNC_NAME
+#  define FUNC_NAME evas_common_map4_rgba_internal
+#  undef SCALE_USING_MMX
+#  include "evas_map_image_internal.c"
+# endif
+#endif
+
+EAPI void
+evas_common_map4_rgba(RGBA_Image *src, RGBA_Image *dst,
+                      RGBA_Draw_Context *dc,
+                      RGBA_Map_Point *p, 
+                      int smooth, int level)
+{
+#ifdef BUILD_MMX
+   int mmx, sse, sse2;
+#endif
+   Cutout_Rects *rects;
+   Cutout_Rect  *r;
+   int          c, cx, cy, cw, ch;
+   int          i;
+   
+   if (src->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
+     evas_cache_image_load_data(&src->cache_entry);
+   evas_common_image_colorspace_normalize(src);
+   if (!src->image.data) return;
+#ifdef BUILD_MMX
+   evas_common_cpu_can_do(&mmx, &sse, &sse2);
+#endif   
+   if ((!dc->cutout.rects) && (!dc->clip.use))
+     {
+#ifdef BUILD_MMX
+        if (mmx)
+          evas_common_map4_rgba_internal_mmx(src, dst, dc, p, smooth, level);
+        else
+#endif
+#ifdef BUILD_C
+          evas_common_map4_rgba_internal(src, dst, dc, p, smooth, level);
+#endif
+        return;
+     }
+   /* save out clip info */
+   c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h;
+   evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
+   /* our clip is 0 size.. abort */
+   if ((dc->clip.w <= 0) || (dc->clip.h <= 0))
+     {
+        dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch;
+        return;
+     }
+   rects = evas_common_draw_context_apply_cutouts(dc);
+   for (i = 0; i < rects->active; ++i)
+     {
+        r = rects->rects + i;
+        evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h);
+#ifdef BUILD_MMX
+        if (mmx)
+          evas_common_map4_rgba_internal_mmx(src, dst, dc, p, smooth, level);
+        else
+#endif
+#ifdef BUILD_C
+          evas_common_map4_rgba_internal(src, dst, dc, p, smooth, level);
+#endif        
+     }
+   evas_common_draw_context_apply_clear_cutouts(rects);
+   /* restore clip info */
+   dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch;
+}
diff --git a/src/lib/engines/common/evas_map_image.h b/src/lib/engines/common/evas_map_image.h
new file mode 100644 (file)
index 0000000..1e33771
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_MAP_H
+#define _EVAS_MAP_H
+
+EAPI void
+evas_common_map4_rgba(RGBA_Image *src, RGBA_Image *dst,
+                      RGBA_Draw_Context *dc,
+                      RGBA_Map_Point *points,
+                      int smooth, int level);
+
+#endif /* _EVAS_MAP_H */
diff --git a/src/lib/engines/common/evas_map_image_core.c b/src/lib/engines/common/evas_map_image_core.c
new file mode 100644 (file)
index 0000000..e18421c
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+  */
+//#undef SCALE_USING_MMX
+{
+   if (smooth)
+     {
+        for (y = ystart; y <= yend; y++)
+          {
+             int x, w, ww;
+             FPc u, v, ud, vd, dv;
+             DATA32 *d, *s;
+#ifdef COLMUL             
+             FPc cv, cd, cc; // col
+             DATA32 c1, c2; // col
+#endif             
+             Line *line;
+             
+#ifdef SCALE_USING_MMX
+             pxor_r2r(mm0, mm0);
+             MOV_A2R(ALPHA_255, mm5)
+#endif
+               
+             line = &(spans[y - ystart]);
+             for (i = 0; i < 2; i++)
+               {
+                  Span *span;
+                  
+                  span = &(line->span[i]);
+                  if (span->x1 >= 0)
+                    {
+                       long long tl;
+                       
+                       x = span->x1;
+                       w = (span->x2 - x);
+                       if (w <= 0) continue;
+                       dv = (span->o2 - span->o1);
+                       if (dv <= 0) continue;
+                       
+                       ww = w;
+                       u = span->u[0] << FPI;
+                       v = span->v[0] << FPI;
+                       ud = ((span->u[1] << FPI) - u) / w;
+                       vd = ((span->v[1] << FPI) - v) / w;
+                       tl = (long long)ud * (w << FP);
+                       tl = tl / dv;
+                       ud = tl;
+                       u -= (ud * (span->o1 - (span->x1 << FP))) / FP1;
+                       
+                       tl = (long long)vd * (w << FP);
+                       tl = tl / dv;
+                       vd = tl;
+                       v -= (vd * (span->o1 - (span->x1 << FP))) / FP1;
+                       
+                       if (ud < 0) u -= 1;
+                       if (vd < 0) v -= 1;
+                       
+                       if (direct)
+                         d = dst->image.data + (y * dst->cache_entry.w) + x;
+                       else
+                         d = buf;
+
+#define SMOOTH 1                       
+#ifdef COLMUL             
+                       c1 = span->col[0]; // col
+                       c2 = span->col[1]; // col
+                       cv = 0; // col
+                       cd = (255 << 16) / w; // col
+                       
+                       if (c1 == c2)
+                         {
+                            if (c1 == 0xffffffff)
+                              {
+#endif                         
+#include "evas_map_image_loop.c"
+#ifdef COLMUL             
+                              }
+                            else if ((c1 == 0x0000ff) && (!src->cache_entry.flags.alpha))
+                              {
+                                 // all black line
+# define COLBLACK 1
+# include "evas_map_image_loop.c"
+# undef COLBLACK                                 
+                              }
+                            else if (c1 == 0x000000)
+                              {
+                                 // skip span
+                              }
+                            else
+                              {
+                                 // generic loop
+# include "evas_map_image_loop.c"
+                              }
+                         }
+                       else
+                         {
+# include "evas_map_image_loop.c"
+                         }
+#endif                         
+                       if (!direct)
+                         {
+                            d = dst->image.data;
+                            d += (y * dst->cache_entry.w) + x;
+                            func(buf, NULL, dc->mul.col, d, w);
+                         }
+                    }
+                  else break;
+               }
+          }
+     }
+   else
+     {
+        for (y = ystart; y <= yend; y++)
+          {
+             int x, w, ww;
+             FPc u, v, ud, vd;
+             DATA32 *d, *s;
+#ifdef COLMUL
+             FPc cv, cd, cc; // col
+             DATA32 c1, c2; // col
+#endif             
+             Line *line;
+             
+             line = &(spans[y - ystart]);
+             for (i = 0; i < 2; i++)
+               {
+                  Span *span;
+                  
+                  span = &(line->span[i]);
+                  if (span->x1 >= 0)
+                    {
+                       x = span->x1;
+                       w = (span->x2 - x);
+                       
+                       if (w <= 0) continue;
+                       ww = w;
+                       u = span->u[0] << FPI;
+                       v = span->v[0] << FPI;
+                       ud = ((span->u[1] << FPI) - u) / w;
+                       vd = ((span->v[1] << FPI) - v) / w;
+                       if (ud < 0) u -= 1;
+                       if (vd < 0) v -= 1;
+                       
+                       if (direct)
+                         d = dst->image.data + (y * dst->cache_entry.w) + x;
+                       else
+                         d = buf;
+                       
+#undef SMOOTH
+#ifdef COLMUL
+                       c1 = span->col[0]; // col
+                       c2 = span->col[1]; // col
+                       cv = 0; // col
+                       cd = (255 << 16) / w; // col
+
+                       if (c1 == c2)
+                         {
+                            if (c1 == 0xffffffff)
+                              {
+#endif                                 
+#include "evas_map_image_loop.c"
+#ifdef COLMUL
+                              }
+                            else if ((c1 == 0x0000ff) && (!src->cache_entry.flags.alpha))
+                              {
+                                 // all black line
+# define COLBLACK 1
+# include "evas_map_image_loop.c"
+# undef COLBLACK                                 
+                              }
+                            else if (c1 == 0x000000)
+                              {
+                                 // skip span
+                              }
+                            else
+                              {
+                                 // generic loop
+# include "evas_map_image_loop.c"
+                              }
+                         }
+                       else
+                         {
+                            // generic loop
+# include "evas_map_image_loop.c"
+                         }
+#endif                       
+                       if (!direct)
+                         {
+                            d = dst->image.data;
+                            d += (y * dst->cache_entry.w) + x;
+                            func(buf, NULL, dc->mul.col, d, w);
+                         }
+                    }
+                  else break;
+               }
+          }
+     }
+}
diff --git a/src/lib/engines/common/evas_map_image_internal.c b/src/lib/engines/common/evas_map_image_internal.c
new file mode 100644 (file)
index 0000000..94f129d
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+// 66.74 % of time
+static void
+FUNC_NAME(RGBA_Image *src, RGBA_Image *dst,
+          RGBA_Draw_Context *dc,
+          RGBA_Map_Point *p, 
+          int smooth, int level)
+{
+   int i;
+   int c, cx, cy, cw, ch;
+   int ytop, ybottom, ystart, yend, y, sw, shp, swp, direct;
+   Line *spans;
+   DATA32 *buf = NULL, *sp;
+   RGBA_Gfx_Func func = NULL;
+   int havea = 0;
+   int havecol = 4;
+
+   // get the clip
+   c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h;
+   if (!c)
+     {
+        cx = 0;
+        cy = 0;
+        cw = dst->cache_entry.w;
+        ch = dst->cache_entry.h;
+     }
+   
+   // find y yop line and y bottom line
+   ytop = p[0].y;
+   if ((p[0].col >> 24) < 0xff) havea = 1;
+   if (p[0].col == 0xffffffff) havecol--;
+   for (i = 1; i < 4; i++)
+     {
+        if (p[i].y < ytop) ytop = p[i].y;
+        if ((p[i].col >> 24) < 0xff) havea = 1;
+        if (p[i].col == 0xffffffff) havecol--;
+     }
+
+   ybottom = p[0].y;
+   for (i = 1; i < 4; i++)
+     {
+        if (p[i].y > ybottom) ybottom = p[i].y;
+     }
+   
+   // convert to screen space from fixed point
+   ytop = ytop >> FP;
+   ybottom = ybottom >> FP;
+   
+   // if its outside the clip vertical bounds - don't bother
+   if ((ytop >= (cy + ch)) || (ybottom < cy)) return;
+   
+   // limit to the clip vertical bounds
+   if (ytop < cy) ystart = cy;
+   else ystart = ytop;
+   if (ybottom >= (cy + ch)) yend = (cy + ch) - 1;
+   else yend = ybottom;
+
+   // get some source image information
+   sp = src->image.data;
+   sw = src->cache_entry.w;
+   swp = sw << (FP + FPI);
+   shp = src->cache_entry.h << (FP + FPI);
+
+   // limit u,v coords of points to be within the source image
+   for (i = 0; i < 4; i++)
+     {
+        if (p[i].u < 0) p[i].u = 0;
+        else if (p[i].u > (src->cache_entry.w << FP))
+          p[i].u = src->cache_entry.w << FP;
+        
+        if (p[i].v < 0) p[i].v = 0;
+        else if (p[i].v > (src->cache_entry.h << FP))
+          p[i].v = src->cache_entry.h << FP;
+     }
+   
+   // allocate some spans to hold out span list
+   spans = alloca((yend - ystart + 1) * sizeof(Line));
+   if (!spans) return;
+   memset(spans, 0, (yend - ystart + 1) * sizeof(Line));
+
+   // calculate the spans list
+   _calc_spans(p, spans, ystart, yend, cx, cy, cw, ch);
+   
+   // walk through spans and render
+   
+   // if operation is solid, bypass buf and draw func and draw direct to dst
+   direct = 0;
+   if ((!src->cache_entry.flags.alpha) && (!dst->cache_entry.flags.alpha) &&
+       (!dc->mul.use) && (!havea))
+     {
+        direct = 1;
+     }
+   else
+     {
+        int pa;
+        
+        buf = alloca(cw * sizeof(DATA32));
+        if (!buf) return;
+        pa = src->cache_entry.flags.alpha;
+        if (havea) src->cache_entry.flags.alpha = 1;
+        if (dc->mul.use)
+          func = evas_common_gfx_func_composite_pixel_color_span_get(src, dc->mul.col, dst, cw, dc->render_op);
+        else
+          func = evas_common_gfx_func_composite_pixel_span_get(src, dst, cw, dc->render_op);
+        src->cache_entry.flags.alpha = pa;
+     }
+   
+   if (!havecol)
+     {
+#undef COLMUL     
+#include "evas_map_image_core.c"
+     }
+   else
+     {
+#define COLMUL 1
+#include "evas_map_image_core.c"
+     }
+}
diff --git a/src/lib/engines/common/evas_map_image_loop.c b/src/lib/engines/common/evas_map_image_loop.c
new file mode 100644 (file)
index 0000000..aa067e0
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+#ifdef SMOOTH
+{
+   while (ww > 0)
+     {
+# ifdef COLBLACK
+        *d = 0xff000000; // col
+# else        
+        FPc u1, v1, u2, v2;
+        FPc rv, ru;
+        DATA32 val1, val2, val3, val4;
+        
+        u1 = u;
+        if (u1 < 0) u1 = 0;
+        else if (u1 >= swp) u1 = swp - 1;
+        
+        v1 = v;
+        if (v1 < 0) v1 = 0;
+        else if (v1 >= shp) v1 = shp - 1;
+        
+        u2 = u1 + FPFPI1;
+        if (u2 >= swp) u2 = swp - 1;
+        
+        v2 = v1 + FPFPI1;
+        if (v2 >= shp) v2 = shp - 1;
+        
+        ru = (u >> (FP + FPI - 8)) & 0xff;
+        rv = (v >> (FP + FPI - 8)) & 0xff;
+        
+        s = sp + ((v1 >> (FP + FPI)) * sw) + 
+          (u1 >> (FP + FPI));
+        val1 = *s;
+        s = sp + ((v1 >> (FP + FPI)) * sw) + 
+          (u2 >> (FP + FPI));
+        val2 = *s;
+        
+        s = sp + ((v2 >> (FP + FPI)) * sw) + 
+          (u1 >> (FP + FPI));
+        val3 = *s;
+        s = sp + ((v2 >> (FP + FPI)) * sw) + 
+          (u2 >> (FP + FPI));
+        val4 = *s;
+#  ifdef SCALE_USING_MMX
+        MOV_A2R(rv, mm4);
+        MOV_A2R(ru, mm6);
+        MOV_P2R(val1, mm1, mm0);
+        if (val1 | val2)
+          {
+             MOV_P2R(val2, mm2, mm0);
+             INTERP_256_R2R(mm6, mm2, mm1, mm5);
+          }
+        MOV_P2R(val3, mm2, mm0);
+        if (val3 | val4)
+          {
+             MOV_P2R(val4, mm3, mm0);
+             INTERP_256_R2R(mm6, mm3, mm2, mm5);
+          }
+        INTERP_256_R2R(mm4, mm2, mm1, mm5);
+#   ifdef COLMUL
+        cc = cv >> 16; // col
+        cv += cd; // col
+        MOV_A2R(cc, mm2); // col
+        MOV_P2R(c1, mm3, mm0); // col
+        MOV_P2R(c2, mm4, mm0); // col
+        INTERP_256_R2R(mm2, mm4, mm3, mm5); // col
+        MUL4_SYM_R2R(mm3, mm1, mm5); // col
+#   endif                            
+        MOV_R2P(mm1, *d, mm0);
+#  else
+        val1 = INTERP_256(ru, val2, val1);
+        val3 = INTERP_256(ru, val4, val3);
+        val1 = INTERP_256(rv, val3, val1); // col
+#   ifdef COLMUL                            
+        val2 = INTERP_256((cv >> 16), c2, c1); // col
+        *d   = MUL4_SYM(val2, val1); // col
+        cv += cd; // col
+#   else                            
+        *d   = INTERP_256(rv, val3, val1);
+#   endif
+#  endif
+        u += ud;
+        v += vd;
+# endif        
+        d++;
+        ww--;
+     }
+}
+#else
+{
+   while (ww > 0)
+     {
+# ifdef COLMUL
+        DATA32 val1, cval; // col
+# endif        
+# ifdef COLBLACK
+        *d = 0xff000000; // col
+# else        
+        s = sp + ((v >> (FP + FPI)) * sw) + 
+          (u >> (FP + FPI));
+#  ifdef COLMUL
+        val1 = *s; // col
+        cval = INTERP_256((cv >> 16), c2, c1); // col
+        *d = MUL4_SYM(cval, val1);
+        cv += cd; // col              
+#  else        
+        *d = *s;
+#  endif        
+        u += ud;
+        v += vd;
+# endif        
+        d++;
+        ww--;
+     }
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_add/.cvsignore b/src/lib/engines/common/evas_op_add/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/src/lib/engines/common/evas_op_add/Makefile.am b/src/lib/engines/common/evas_op_add/Makefile.am
new file mode 100644 (file)
index 0000000..78ce9fa
--- /dev/null
@@ -0,0 +1,13 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+EXTRA_DIST = \
+op_add_color_.c \
+op_add_color_i386.c \
+op_add_mask_color_.c \
+op_add_mask_color_i386.c \
+op_add_pixel_.c \
+op_add_pixel_color_.c \
+op_add_pixel_color_i386.c \
+op_add_pixel_i386.c \
+op_add_pixel_mask_.c \
+op_add_pixel_mask_i386.c
diff --git a/src/lib/engines/common/evas_op_add/op_add_color_.c b/src/lib/engines/common/evas_op_add/op_add_color_.c
new file mode 100644 (file)
index 0000000..214ab67
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* add color -> dst */
+
+#ifdef BUILD_C
+static void
+init_add_color_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_add_color_pt_funcs_c(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* add_rel color -> dst */
+
+#ifdef BUILD_C
+static void
+init_add_rel_color_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_add_rel_color_pt_funcs_c(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_add/op_add_color_i386.c b/src/lib/engines/common/evas_op_add/op_add_color_i386.c
new file mode 100644 (file)
index 0000000..f81d47d
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* add color -> dst */
+
+#ifdef BUILD_MMX
+static void
+init_add_color_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_add_color_pt_funcs_mmx(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* add_rel color -> dst */
+
+#ifdef BUILD_MMX
+static void
+init_add_rel_color_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_add_rel_color_pt_funcs_mmx(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_add/op_add_mask_color_.c b/src/lib/engines/common/evas_op_add/op_add_mask_color_.c
new file mode 100644 (file)
index 0000000..4d903c2
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* add mask x color -> dst */
+
+#ifdef BUILD_C
+static void
+init_add_mask_color_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_add_mask_color_pt_funcs_c(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* add_rel mask x color -> dst */
+
+#ifdef BUILD_C
+static void
+init_add_rel_mask_color_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_add_rel_mask_color_pt_funcs_c(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_add/op_add_mask_color_i386.c b/src/lib/engines/common/evas_op_add/op_add_mask_color_i386.c
new file mode 100644 (file)
index 0000000..bcef9b2
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* add mask x color -> dst */
+
+#ifdef BUILD_MMX
+static void
+init_add_mask_color_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_add_mask_color_pt_funcs_mmx(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* add_rel mask x color -> dst */
+
+#ifdef BUILD_MMX
+static void
+init_add_rel_mask_color_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_add_rel_mask_color_pt_funcs_mmx(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_add/op_add_pixel_.c b/src/lib/engines/common/evas_op_add/op_add_pixel_.c
new file mode 100644 (file)
index 0000000..b2a6cf1
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* add pixel --> dst */
+
+#ifdef BUILD_C
+static void
+init_add_pixel_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_add_pixel_pt_funcs_c(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* add_rel pixel --> dst */
+
+#ifdef BUILD_C
+static void
+init_add_rel_pixel_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_add_rel_pixel_pt_funcs_c(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_add/op_add_pixel_color_.c b/src/lib/engines/common/evas_op_add/op_add_pixel_color_.c
new file mode 100644 (file)
index 0000000..35c8fab
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* add pixel x color --> dst */
+
+#ifdef BUILD_C
+static void
+init_add_pixel_color_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_add_pixel_color_pt_funcs_c(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* add_rel pixel x color --> dst */
+
+#ifdef BUILD_C
+static void
+init_add_rel_pixel_color_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_add_rel_pixel_color_pt_funcs_c(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_add/op_add_pixel_color_i386.c b/src/lib/engines/common/evas_op_add/op_add_pixel_color_i386.c
new file mode 100644 (file)
index 0000000..ce65d45
--- /dev/null
@@ -0,0 +1,30 @@
+
+/* add pixel x color --> dst */
+
+#ifdef BUILD_MMX
+static void
+init_add_pixel_color_span_funcs_mmx(void)
+{ }
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_add_pixel_color_pt_funcs_mmx(void)
+{ }
+#endif
+
+/*-----*/
+
+/* add_rel pixel x color --> dst */
+
+#ifdef BUILD_MMX
+static void
+init_add_rel_pixel_color_span_funcs_mmx(void)
+{ }
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_add_rel_pixel_color_pt_funcs_mmx(void)
+{ }
+#endif
diff --git a/src/lib/engines/common/evas_op_add/op_add_pixel_i386.c b/src/lib/engines/common/evas_op_add/op_add_pixel_i386.c
new file mode 100644 (file)
index 0000000..01497b2
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* add pixel --> dst */
+
+#ifdef BUILD_MMX
+static void
+init_add_pixel_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_add_pixel_pt_funcs_mmx(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* add_rel pixel --> dst */
+
+#ifdef BUILD_MMX
+static void
+init_add_rel_pixel_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_add_rel_pixel_pt_funcs_mmx(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_add/op_add_pixel_mask_.c b/src/lib/engines/common/evas_op_add/op_add_pixel_mask_.c
new file mode 100644 (file)
index 0000000..70c5d9d
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* add pixel x mask --> dst */
+
+#ifdef BUILD_C
+static void
+init_add_pixel_mask_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_add_pixel_mask_pt_funcs_c(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* add_rel pixel x mask --> dst */
+
+#ifdef BUILD_C
+static void
+init_add_rel_pixel_mask_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_add_rel_pixel_mask_pt_funcs_c(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_add/op_add_pixel_mask_i386.c b/src/lib/engines/common/evas_op_add/op_add_pixel_mask_i386.c
new file mode 100644 (file)
index 0000000..746d11d
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* add pixel x mask -> dst */
+
+#ifdef BUILD_MMX
+static void
+init_add_pixel_mask_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_add_pixel_mask_pt_funcs_mmx(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* add_rel pixel x mask -> dst */
+
+#ifdef BUILD_MMX
+static void
+init_add_rel_pixel_mask_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_add_rel_pixel_mask_pt_funcs_mmx(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_add_main_.c b/src/lib/engines/common/evas_op_add_main_.c
new file mode 100644 (file)
index 0000000..538fb29
--- /dev/null
@@ -0,0 +1,545 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+static RGBA_Gfx_Func     op_add_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+static RGBA_Gfx_Pt_Func  op_add_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+
+static void op_add_init(void);
+static void op_add_shutdown(void);
+
+static RGBA_Gfx_Func op_add_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_add_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_add_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_add_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_add_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+
+static RGBA_Gfx_Pt_Func op_add_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_add_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_add_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_add_mask_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_add_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+
+static RGBA_Gfx_Compositor  _composite_add = { "add",
+ op_add_init, op_add_shutdown,
+ op_add_pixel_span_get, op_add_color_span_get,
+ op_add_pixel_color_span_get, op_add_mask_color_span_get,
+ op_add_pixel_mask_span_get,
+ op_add_pixel_pt_get, op_add_color_pt_get,
+ op_add_pixel_color_pt_get, op_add_mask_color_pt_get,
+ op_add_pixel_mask_pt_get
+ };
+
+RGBA_Gfx_Compositor  *
+evas_common_gfx_compositor_add_get(void)
+{
+   return &(_composite_add);
+}
+
+static RGBA_Gfx_Func     op_add_rel_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+static RGBA_Gfx_Pt_Func  op_add_rel_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+
+static void op_add_rel_init(void);
+static void op_add_rel_shutdown(void);
+
+static RGBA_Gfx_Func op_add_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_add_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_add_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_add_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_add_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+
+static RGBA_Gfx_Pt_Func op_add_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_add_rel_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_add_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_add_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_add_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+
+static RGBA_Gfx_Compositor  _composite_add_rel = { "add_rel",
+ op_add_rel_init, op_add_rel_shutdown,
+ op_add_rel_pixel_span_get, op_add_rel_color_span_get,
+ op_add_rel_pixel_color_span_get, op_add_rel_mask_color_span_get,
+ op_add_rel_pixel_mask_span_get,
+ op_add_rel_pixel_pt_get, op_add_rel_color_pt_get,
+ op_add_rel_pixel_color_pt_get, op_add_rel_mask_color_pt_get,
+ op_add_rel_pixel_mask_pt_get
+ };
+
+RGBA_Gfx_Compositor  *
+evas_common_gfx_compositor_add_rel_get(void)
+{
+   return &(_composite_add_rel);
+}
+
+
+# include "./evas_op_add/op_add_pixel_.c"
+# include "./evas_op_add/op_add_color_.c"
+# include "./evas_op_add/op_add_pixel_color_.c"
+# include "./evas_op_add/op_add_pixel_mask_.c"
+# include "./evas_op_add/op_add_mask_color_.c"
+//# include "./evas_op_add/op_add_pixel_mask_color_.c"
+
+# include "./evas_op_add/op_add_pixel_i386.c"
+# include "./evas_op_add/op_add_color_i386.c"
+# include "./evas_op_add/op_add_pixel_color_i386.c"
+# include "./evas_op_add/op_add_pixel_mask_i386.c"
+# include "./evas_op_add/op_add_mask_color_i386.c"
+//# include "op_add_pixel_mask_color_.c"
+
+static void
+op_add_init(void)
+{
+   memset(op_add_span_funcs, 0, sizeof(op_add_span_funcs));
+   memset(op_add_pt_funcs, 0, sizeof(op_add_pt_funcs));
+#ifdef BUILD_MMX
+   init_add_pixel_span_funcs_mmx();
+   init_add_pixel_color_span_funcs_mmx();
+   init_add_pixel_mask_span_funcs_mmx();
+   init_add_color_span_funcs_mmx();
+   init_add_mask_color_span_funcs_mmx();
+
+   init_add_pixel_pt_funcs_mmx();
+   init_add_pixel_color_pt_funcs_mmx();
+   init_add_pixel_mask_pt_funcs_mmx();
+   init_add_color_pt_funcs_mmx();
+   init_add_mask_color_pt_funcs_mmx();
+#endif
+#ifdef BUILD_C
+   init_add_pixel_span_funcs_c();
+   init_add_pixel_color_span_funcs_c();
+   init_add_rel_pixel_mask_span_funcs_c();
+   init_add_color_span_funcs_c();
+   init_add_mask_color_span_funcs_c();
+
+   init_add_pixel_pt_funcs_c();
+   init_add_pixel_color_pt_funcs_c();
+   init_add_rel_pixel_mask_pt_funcs_c();
+   init_add_color_pt_funcs_c();
+   init_add_mask_color_pt_funcs_c();
+#endif
+}
+
+static void
+op_add_shutdown(void)
+{
+}
+
+static RGBA_Gfx_Func
+add_gfx_span_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Func  func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+     {
+       cpu = CPU_MMX;
+       func = op_add_span_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_add_span_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Func
+op_add_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_add_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_add_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_add_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_add_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+add_gfx_pt_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Pt_Func  func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+     {
+       cpu = CPU_MMX;
+       func = op_add_pt_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_add_pt_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Pt_Func
+op_add_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_add_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_add_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_add_mask_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_add_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_gfx_pt_func_cpu(s, m, c, d);
+}
+
+
+
+static void
+op_add_rel_init(void)
+{
+   memset(op_add_rel_span_funcs, 0, sizeof(op_add_rel_span_funcs));
+   memset(op_add_rel_pt_funcs, 0, sizeof(op_add_rel_pt_funcs));
+#ifdef BUILD_MMX
+   init_add_rel_pixel_span_funcs_mmx();
+   init_add_rel_pixel_color_span_funcs_mmx();
+   init_add_rel_pixel_mask_span_funcs_mmx();
+   init_add_rel_color_span_funcs_mmx();
+   init_add_rel_mask_color_span_funcs_mmx();
+
+   init_add_rel_pixel_pt_funcs_mmx();
+   init_add_rel_pixel_color_pt_funcs_mmx();
+   init_add_rel_pixel_mask_pt_funcs_mmx();
+   init_add_rel_color_pt_funcs_mmx();
+   init_add_rel_mask_color_pt_funcs_mmx();
+#endif
+#ifdef BUILD_C
+   init_add_rel_pixel_span_funcs_c();
+   init_add_rel_pixel_color_span_funcs_c();
+   init_add_rel_pixel_mask_span_funcs_c();
+   init_add_rel_color_span_funcs_c();
+   init_add_rel_mask_color_span_funcs_c();
+
+   init_add_rel_pixel_pt_funcs_c();
+   init_add_rel_pixel_color_pt_funcs_c();
+   init_add_rel_pixel_mask_pt_funcs_c();
+   init_add_rel_color_pt_funcs_c();
+   init_add_rel_mask_color_pt_funcs_c();
+#endif
+}
+
+static void
+op_add_rel_shutdown(void)
+{
+}
+
+static RGBA_Gfx_Func
+add_rel_gfx_span_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Func  func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+     {
+       cpu = CPU_MMX;
+       func = op_add_rel_span_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_add_rel_span_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Func
+op_add_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_add_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_add_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_add_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_add_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+add_rel_gfx_pt_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Pt_Func  func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+     {
+       cpu = CPU_MMX;
+       func = op_add_rel_pt_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_add_rel_pt_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Pt_Func
+op_add_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_add_rel_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_add_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_add_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_add_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return add_rel_gfx_pt_func_cpu(s, m, c, d);
+}
diff --git a/src/lib/engines/common/evas_op_blend/.cvsignore b/src/lib/engines/common/evas_op_blend/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/src/lib/engines/common/evas_op_blend/Makefile.am b/src/lib/engines/common/evas_op_blend/Makefile.am
new file mode 100644 (file)
index 0000000..3bd97ce
--- /dev/null
@@ -0,0 +1,18 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+EXTRA_DIST = \
+op_blend_color_.c \
+op_blend_color_i386.c \
+op_blend_color_neon.c \
+op_blend_mask_color_.c \
+op_blend_mask_color_i386.c \
+op_blend_mask_color_neon.c \
+op_blend_pixel_.c \
+op_blend_pixel_color_.c \
+op_blend_pixel_color_i386.c \
+op_blend_pixel_color_neon.c \
+op_blend_pixel_i386.c \
+op_blend_pixel_mask_.c \
+op_blend_pixel_mask_i386.c \
+op_blend_pixel_mask_neon.c \
+op_blend_pixel_neon.c
diff --git a/src/lib/engines/common/evas_op_blend/op_blend_color_.c b/src/lib/engines/common/evas_op_blend/op_blend_color_.c
new file mode 100644 (file)
index 0000000..5c7ecd3
--- /dev/null
@@ -0,0 +1,110 @@
+
+/* blend color -> dst */
+
+#ifdef BUILD_C
+static void
+_op_blend_c_dp(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+    DATA32 *e, a = 256 - (c >> 24);
+    UNROLL8_PLD_WHILE(d, l, e,
+                      {
+                         *d = c + MUL_256(a, *d);
+                         d++;
+                      });
+}
+
+#define _op_blend_caa_dp _op_blend_c_dp
+
+#define _op_blend_c_dpan _op_blend_c_dp
+#define _op_blend_caa_dpan _op_blend_c_dpan
+
+static void
+init_blend_color_span_funcs_c(void)
+{
+   op_blend_span_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_blend_c_dp;
+   op_blend_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_blend_caa_dp;
+
+   op_blend_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_blend_c_dpan;
+   op_blend_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_blend_pt_c_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   s = 256 - (c >> 24);
+   *d = c + MUL_256(s, *d);
+}
+
+#define _op_blend_pt_caa_dp _op_blend_pt_c_dp
+
+#define _op_blend_pt_c_dpan _op_blend_pt_c_dp
+#define _op_blend_pt_caa_dpan _op_blend_pt_c_dpan
+
+#define _op_blend_pt_c_dpas _op_blend_pt_c_dp
+#define _op_blend_pt_caa_dpas _op_blend_pt_c_dp
+
+static void
+init_blend_color_pt_funcs_c(void)
+{
+   op_blend_pt_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_blend_pt_c_dp;
+   op_blend_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_blend_pt_caa_dp;
+
+   op_blend_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_blend_pt_c_dpan;
+   op_blend_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_pt_caa_dpan;
+}
+#endif
+
+/*-----*/
+
+/* blend_rel color -> dst */
+
+#ifdef BUILD_C
+static void
+_op_blend_rel_c_dp(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha = 256 - (c >> 24);
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d = MUL_SYM(*d >> 24, c) + MUL_256(alpha, *d);
+                        d++;
+                     });
+}
+
+#define _op_blend_rel_caa_dp _op_blend_rel_c_dp
+
+#define _op_blend_rel_c_dpan _op_blend_c_dpan
+#define _op_blend_rel_caa_dpan _op_blend_caa_dpan
+
+static void
+init_blend_rel_color_span_funcs_c(void)
+{
+   op_blend_rel_span_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_blend_rel_c_dp;
+   op_blend_rel_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_caa_dp;
+
+   op_blend_rel_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_c_dpan;
+   op_blend_rel_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_blend_rel_pt_c_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   s = *d >> 24;
+   *d = MUL_SYM(s, c) + MUL_256(256 - (c >> 24), *d);
+}
+
+#define _op_blend_rel_pt_caa_dp _op_blend_rel_pt_c_dp
+
+#define _op_blend_rel_pt_c_dpan _op_blend_pt_c_dpan
+#define _op_blend_rel_pt_caa_dpan _op_blend_pt_caa_dpan
+
+static void
+init_blend_rel_color_pt_funcs_c(void)
+{
+   op_blend_rel_pt_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_blend_rel_pt_c_dp;
+   op_blend_rel_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_pt_caa_dp;
+
+   op_blend_rel_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_pt_c_dpan;
+   op_blend_rel_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_pt_caa_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_blend/op_blend_color_i386.c b/src/lib/engines/common/evas_op_blend/op_blend_color_i386.c
new file mode 100644 (file)
index 0000000..c66d118
--- /dev/null
@@ -0,0 +1,139 @@
+
+/* blend color --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_blend_c_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_P2R(c, mm2, mm0)
+   c = 256 - (c >> 24);
+   MOV_A2R(c, mm3)
+   while (d < e) {
+       MOV_P2R(*d, mm1, mm0)
+       MUL4_256_R2R(mm3, mm1)
+       paddw_r2r(mm2, mm1);
+       MOV_R2P(mm1, *d, mm0)
+       d++;
+     }
+}
+
+#define _op_blend_caa_dp_mmx _op_blend_c_dp_mmx
+
+#define _op_blend_c_dpan_mmx _op_blend_c_dp_mmx
+#define _op_blend_caa_dpan_mmx _op_blend_c_dpan_mmx
+
+static void
+init_blend_color_span_funcs_mmx(void)
+{
+   op_blend_span_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_blend_c_dp_mmx;
+   op_blend_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_caa_dp_mmx;
+
+   op_blend_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_c_dpan_mmx;
+   op_blend_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_blend_pt_c_dp_mmx(DATA32 s __UNUSED__, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+       pxor_r2r(mm0, mm0);
+       MOV_P2R(c, mm2, mm0)
+       c = 256 - (c >> 24);
+       MOV_A2R(c, mm3)
+       MOV_P2R(*d, mm1, mm0)
+       MUL4_256_R2R(mm3, mm1)
+       paddw_r2r(mm2, mm1);
+       MOV_R2P(mm1, *d, mm0)
+}
+
+#define _op_blend_pt_caa_dp_mmx _op_blend_pt_c_dp_mmx
+
+#define _op_blend_pt_c_dpan_mmx _op_blend_pt_c_dp_mmx
+#define _op_blend_pt_caa_dpan_mmx _op_blend_pt_c_dpan_mmx
+
+static void
+init_blend_color_pt_funcs_mmx(void)
+{
+   op_blend_pt_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_blend_pt_c_dp_mmx;
+   op_blend_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_pt_caa_dp_mmx;
+
+   op_blend_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_pt_c_dpan_mmx;
+   op_blend_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_pt_caa_dpan_mmx;
+}
+#endif
+/*-----*/
+
+/* blend_rel color -> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_blend_rel_c_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_P2R(c, mm2, mm0)
+   c = 256 - (c >> 24);
+   MOV_A2R(c, mm3)
+   MOV_A2R(ALPHA_255, mm5)
+   while (d < e) {
+       MOV_P2R(*d, mm1, mm0)
+       MOV_RA2R(mm1, mm4)
+       MUL4_256_R2R(mm3, mm1)
+       MUL4_SYM_R2R(mm2, mm4, mm5)
+       paddw_r2r(mm4, mm1);
+       MOV_R2P(mm1, *d, mm0)
+       d++;
+     }
+}
+
+#define _op_blend_rel_caa_dp_mmx _op_blend_rel_c_dp_mmx
+
+#define _op_blend_rel_c_dpan_mmx _op_blend_c_dpan_mmx
+#define _op_blend_rel_caa_dpan_mmx _op_blend_caa_dpan_mmx
+
+static void
+init_blend_rel_color_span_funcs_mmx(void)
+{
+   op_blend_rel_span_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_blend_rel_c_dp_mmx;
+   op_blend_rel_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_rel_caa_dp_mmx;
+
+   op_blend_rel_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_c_dpan_mmx;
+   op_blend_rel_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_blend_rel_pt_c_dp_mmx(DATA32 s __UNUSED__, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+       pxor_r2r(mm0, mm0);
+       MOV_A2R(ALPHA_256, mm6)
+       MOV_A2R(ALPHA_255, mm5)
+
+       MOV_P2R(c, mm2, mm0)
+       MOV_RA2R(mm2, mm1)
+       psubw_r2r(mm1, mm6);
+
+       MOV_P2R(*d, mm1, mm0)
+       MOV_RA2R(mm1, mm4)
+       MUL4_256_R2R(mm6, mm1)
+
+       MUL4_SYM_R2R(mm4, mm2, mm5)
+       paddw_r2r(mm2, mm1);
+       MOV_R2P(mm1, *d, mm0)
+}
+
+#define _op_blend_rel_pt_caa_dp_mmx _op_blend_rel_pt_c_dp_mmx
+
+#define _op_blend_rel_pt_c_dpan_mmx _op_blend_pt_c_dpan_mmx
+#define _op_blend_rel_pt_caa_dpan_mmx _op_blend_pt_caa_dpan_mmx
+
+static void
+init_blend_rel_color_pt_funcs_mmx(void)
+{
+   op_blend_rel_pt_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_blend_rel_pt_c_dp_mmx;
+   op_blend_rel_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_rel_pt_caa_dp_mmx;
+
+   op_blend_rel_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_pt_c_dpan_mmx;
+   op_blend_rel_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_pt_caa_dpan_mmx;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_blend/op_blend_color_neon.c b/src/lib/engines/common/evas_op_blend/op_blend_color_neon.c
new file mode 100644 (file)
index 0000000..52c2083
--- /dev/null
@@ -0,0 +1,223 @@
+
+/* blend color --> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_blend_c_dp_neon(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+       DATA32 *e, *tmp = 0;
+#define AP     "B_C_DP"
+   asm volatile (
+       "vdup.u32       q6, %[c]                        \n\t"
+       "vmov.i8        q5, #1                          \n\t"
+       "vmvn.u8        q7,q6                           \n\t"
+       "vshr.u32       q7, q7, $0x18                   \n\t"
+       "vmul.u32       q7,q5, q7                       \n\t"
+       "bic            %[e], #3                        \n\t"
+       "bic            %[d], #3                        \n\t"
+
+       AP "loopchoose:                                 \n\t"
+               // If aligned already - straight to quads
+               "andS           %[tmp], %[d],$0x1f              \n\t"
+               "beq            "AP"quadloops                   \n\t"
+
+               "andS           %[tmp], %[d],$0x4               \n\t"
+               "beq            "AP"dualloop                    \n\t"
+
+       // Only ever executes once, fall through to dual
+       AP "singleloop:                                 \n\t"
+               // Use 'tmp' not 'd'
+               "vld1.32        d0[0], [%[d]]           \n\t"
+               // Only touch d1
+               "vmull.u8       q0, d0, d14             \n\t"
+               "vshrn.u16      d0, q0, #8              \n\t"
+               "vadd.u8        d0, d12, d0             \n\t"
+               "vst1.32        d0[0], [%[d]]           \n\t"
+
+               "add            %[d], #4                \n\t"
+
+               // Can we go the fast path?
+               "andS           %[tmp], %[d],$0x1f      \n\t"
+               "beq            "AP"quadloops           \n\t"
+
+       AP "dualloop:                                   \n\t"
+               "sub            %[tmp], %[e], %[d]      \n\t"
+               "cmp            %[tmp], #32             \n\t"
+               "blt            "AP"loopout                     \n\t"
+
+
+       AP "dualloopint:                                        \n\t"
+               "vldr.32        d0, [%[d]]              \n\t"
+               "vmull.u8       q1, d0, d14             \n\t"
+               "vshrn.u16      d0, q1, #8              \n\t"
+               "vqadd.u8       d0, d0, d12             \n\t"
+
+               "vstm           %[d]!, {d0}             \n\t"
+
+               "ands           %[tmp], %[d], $0x1f     \n\t"
+               "bne            "AP"dualloopint         \n\t"
+
+       AP "quadloops:                                  \n\t"
+               "sub            %[tmp], %[e], %[d]      \n\t"
+               "cmp            %[tmp], #32             \n\t"
+               "blt            "AP"loopout                     \n\t"
+
+               "sub            %[tmp],%[e],#31 \n\t"
+
+       AP "quadloopint:\n\t"
+               "vldm   %[d],   {d0,d1,d2,d3}           \n\t"
+
+               "vmull.u8       q2, d0, d14             \n\t"
+               "vmull.u8       q3, d1, d15             \n\t"
+               "vmull.u8       q4, d2, d14             \n\t"
+               "vmull.u8       q5, d3, d15             \n\t"
+
+               "vshrn.u16      d0, q2, #8              \n\t"
+               "vshrn.u16      d1, q3, #8              \n\t"
+               "vshrn.u16      d2, q4, #8              \n\t"
+               "vshrn.u16      d3, q5, #8              \n\t"
+
+               "vqadd.u8       q0, q6, q0              \n\t"
+               "vqadd.u8       q1, q6, q1              \n\t"
+
+               "vstm   %[d]!,  {d0,d1,d2,d3}           \n\t"
+
+               "cmp     %[tmp], %[d]\n\t"
+                "bhi "AP"quadloopint\n\t"
+
+       AP "loopout:                                    \n\t"
+               "cmp            %[d], %[e]\n\t"
+                "beq           "AP"done\n\t"
+               "sub            %[tmp],%[e], %[d]       \n\t"
+               "cmp            %[tmp],#8               \n\t"
+               "blt            "AP"singleloop2         \n\t"
+
+       AP "dualloop2:                                  \n\t"
+               "sub            %[tmp],%[e],$0x7        \n\t"
+       AP "dualloop2int:                                       \n\t"
+               "vldr.64        d0, [%[d]]              \n\t"
+               "vmull.u8       q1, d0, d14             \n\t"
+               "vshrn.u16      d0, q1, #8              \n\t"
+               "vqadd.u8       d0, d0, d12             \n\t"
+
+               "vstr.64        d0, [%[d]]              \n\t"
+
+               "add            %[d], #8                \n\t"
+               "cmp            %[tmp], %[d]            \n\t"
+               "bhi            "AP"dualloop2int                \n\t"
+
+               // Single ??
+               "cmp            %[e], %[d]              \n\t"
+               "beq            "AP"done                \n\t"
+
+       AP "singleloop2:                                        \n\t"
+               "vld1.32        d0[0], [%[d]]           \n\t"
+               "vmull.u8       q1, d0, d14             \n\t"
+               "vshrn.u16      d0, q1, #8              \n\t"
+               "vqadd.u8       d0, d0, d12             \n\t"
+
+               "vst1.32        d0[0], [%[d]]           \n\t"
+
+       AP "done:\n\t"
+
+         : // output regs
+         // Input
+          :  [e] "r" (e = d + l), [d] "r" (d), [c] "r" (c), [tmp] "r" (tmp)
+          : "q0", "q1", "q2","q3", "q4","q5","q6", "q7","memory" // clobbered
+
+       );
+#undef AP
+
+}
+
+#define _op_blend_caa_dp_neon _op_blend_c_dp_neon
+
+#define _op_blend_c_dpan_neon _op_blend_c_dp_neon
+#define _op_blend_caa_dpan_neon _op_blend_c_dpan_neon
+
+static void
+init_blend_color_span_funcs_neon(void)
+{
+   op_blend_span_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_blend_c_dp_neon;
+   op_blend_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_caa_dp_neon;
+
+   op_blend_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_c_dpan_neon;
+   op_blend_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_blend_pt_c_dp_neon(DATA32 s __UNUSED__, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   s = 256 - (c >> 24);
+   *d = c + MUL_256(s, *d);
+}
+
+#define _op_blend_pt_caa_dp_neon _op_blend_pt_c_dp_neon
+
+#define _op_blend_pt_c_dpan_neon _op_blend_pt_c_dp_neon
+#define _op_blend_pt_caa_dpan_neon _op_blend_pt_c_dpan_neon
+
+static void
+init_blend_color_pt_funcs_neon(void)
+{
+   op_blend_pt_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_blend_pt_c_dp_neon;
+   op_blend_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_pt_caa_dp_neon;
+
+   op_blend_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_pt_c_dpan_neon;
+   op_blend_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_pt_caa_dpan_neon;
+}
+#endif
+/*-----*/
+
+/* blend_rel color -> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_blend_rel_c_dp_neon(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha = 256 - (c >> 24);
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d = MUL_SYM(*d >> 24, c) + MUL_256(alpha, *d);
+                        d++;
+                     });
+}
+
+#define _op_blend_rel_caa_dp_neon _op_blend_rel_c_dp_neon
+
+#define _op_blend_rel_c_dpan_neon _op_blend_c_dpan_neon
+#define _op_blend_rel_caa_dpan_neon _op_blend_caa_dpan_neon
+
+static void
+init_blend_rel_color_span_funcs_neon(void)
+{
+   op_blend_rel_span_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_blend_rel_c_dp_neon;
+   op_blend_rel_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_rel_caa_dp_neon;
+
+   op_blend_rel_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_c_dpan_neon;
+   op_blend_rel_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_blend_rel_pt_c_dp_neon(DATA32 s __UNUSED__, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   s = *d >> 24;
+   *d = MUL_SYM(s, c) + MUL_256(256 - (c >> 24), *d);
+}
+
+#define _op_blend_rel_pt_caa_dp_neon _op_blend_rel_pt_c_dp_neon
+
+#define _op_blend_rel_pt_c_dpan_neon _op_blend_pt_c_dpan_neon
+#define _op_blend_rel_pt_caa_dpan_neon _op_blend_pt_caa_dpan_neon
+
+static void
+init_blend_rel_color_pt_funcs_neon(void)
+{
+   op_blend_rel_pt_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_blend_rel_pt_c_dp_neon;
+   op_blend_rel_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_rel_pt_caa_dp_neon;
+
+   op_blend_rel_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_pt_c_dpan_neon;
+   op_blend_rel_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_pt_caa_dpan_neon;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_blend/op_blend_mask_color_.c b/src/lib/engines/common/evas_op_blend/op_blend_mask_color_.c
new file mode 100644 (file)
index 0000000..ab5955a
--- /dev/null
@@ -0,0 +1,186 @@
+
+/* blend mask x color -> dst */
+
+#ifdef BUILD_C
+static void
+_op_blend_mas_c_dp(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha = 256 - (c >> 24);
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        DATA32 a = *m;
+                        switch(a)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             *d = c + MUL_256(alpha, *d);
+                             break;
+                          default:
+                               {
+                                  DATA32 mc = MUL_SYM(a, c);
+                                  a = 256 - (mc >> 24);
+                                  *d = mc + MUL_256(a, *d);
+                               }
+                             break;
+                          }
+                        m++;  d++;
+                     });
+}
+
+static void
+_op_blend_mas_can_dp(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        alpha = *m;
+                        switch(alpha)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             *d = c;
+                             break;
+                          default:
+                             alpha++;
+                             *d = INTERP_256(alpha, c, *d);
+                             break;
+                          }
+                        m++;  d++;
+                     });
+}
+
+#define _op_blend_mas_cn_dp _op_blend_mas_can_dp
+#define _op_blend_mas_caa_dp _op_blend_mas_c_dp
+
+#define _op_blend_mas_c_dpan _op_blend_mas_c_dp
+#define _op_blend_mas_cn_dpan _op_blend_mas_cn_dp
+#define _op_blend_mas_can_dpan _op_blend_mas_can_dp
+#define _op_blend_mas_caa_dpan _op_blend_mas_caa_dp
+
+static void
+init_blend_mask_color_span_funcs_c(void)
+{
+   op_blend_span_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_blend_mas_c_dp;
+   op_blend_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_blend_mas_cn_dp;
+   op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_blend_mas_can_dp;
+   op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_blend_mas_caa_dp;
+
+   op_blend_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_blend_mas_c_dpan;
+   op_blend_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_mas_cn_dpan;
+   op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_blend_mas_can_dpan;
+   op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_blend_mas_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_blend_pt_mas_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   s = MUL_SYM(m, c);
+   m = 256 - (s >> 24);
+   *d = s + MUL_256(m, *d);
+}
+
+static void
+_op_blend_pt_mas_can_dp(DATA32 s __UNUSED__, DATA8 m, DATA32 c, DATA32 *d) {
+   *d = INTERP_256(m + 1, c, *d);
+}
+
+#define _op_blend_pt_mas_cn_dp _op_blend_pt_mas_can_dp
+#define _op_blend_pt_mas_caa_dp _op_blend_pt_mas_c_dp
+
+#define _op_blend_pt_mas_c_dpan _op_blend_pt_mas_c_dp
+#define _op_blend_pt_mas_cn_dpan _op_blend_pt_mas_cn_dp
+#define _op_blend_pt_mas_can_dpan _op_blend_pt_mas_can_dp
+#define _op_blend_pt_mas_caa_dpan _op_blend_pt_mas_caa_dp
+
+static void
+init_blend_mask_color_pt_funcs_c(void)
+{
+   op_blend_pt_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_blend_pt_mas_c_dp;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_blend_pt_mas_cn_dp;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_blend_pt_mas_can_dp;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_blend_pt_mas_caa_dp;
+
+   op_blend_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_blend_pt_mas_c_dpan;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_pt_mas_cn_dpan;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_blend_pt_mas_can_dpan;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_blend_pt_mas_caa_dpan;
+}
+#endif
+
+/*-----*/
+
+/* blend_rel mask x color --> dst */
+
+#ifdef BUILD_C
+static void
+_op_blend_rel_mas_c_dp(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        DATA32 mc = MUL_SYM(*m, c);
+                        alpha = 256 - (mc >> 24);
+                        *d = MUL_SYM(*d >> 24, mc) + MUL_256(alpha, *d);
+                        d++;
+                        m++;
+                     });
+}
+
+#define _op_blend_rel_mas_cn_dp _op_blend_rel_mas_c_dp
+#define _op_blend_rel_mas_can_dp _op_blend_rel_mas_c_dp
+#define _op_blend_rel_mas_caa_dp _op_blend_rel_mas_c_dp
+
+#define _op_blend_rel_mas_c_dpan _op_blend_mas_c_dpan
+#define _op_blend_rel_mas_cn_dpan _op_blend_mas_cn_dpan
+#define _op_blend_rel_mas_can_dpan _op_blend_mas_can_dpan
+#define _op_blend_rel_mas_caa_dpan _op_blend_mas_caa_dpan
+
+static void
+init_blend_rel_mask_color_span_funcs_c(void)
+{
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_blend_rel_mas_c_dp;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_mas_can_dp;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_blend_rel_mas_can_dp;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_blend_rel_mas_caa_dp;
+
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_blend_rel_mas_c_dpan;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_mas_cn_dpan;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_blend_rel_mas_can_dpan;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_blend_rel_mas_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_blend_rel_pt_mas_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   s = MUL_SYM(m, c);
+   c = 256 - (s >> 24);
+   *d = MUL_SYM(*d >> 24, s) + MUL_256(c, *d);
+}
+
+#define _op_blend_rel_pt_mas_cn_dp _op_blend_rel_pt_mas_c_dp
+#define _op_blend_rel_pt_mas_can_dp _op_blend_rel_pt_mas_c_dp
+#define _op_blend_rel_pt_mas_caa_dp _op_blend_rel_pt_mas_c_dp
+
+#define _op_blend_rel_pt_mas_c_dpan _op_blend_pt_mas_c_dpan
+#define _op_blend_rel_pt_mas_cn_dpan _op_blend_pt_mas_cn_dpan
+#define _op_blend_rel_pt_mas_can_dpan _op_blend_pt_mas_can_dpan
+#define _op_blend_rel_pt_mas_caa_dpan _op_blend_pt_mas_caa_dpan
+
+static void
+init_blend_rel_mask_color_pt_funcs_c(void)
+{
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_blend_rel_pt_mas_c_dp;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_pt_mas_cn_dp;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_blend_rel_pt_mas_can_dp;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_blend_rel_pt_mas_caa_dp;
+
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_blend_rel_pt_mas_c_dpan;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_pt_mas_cn_dpan;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_blend_rel_pt_mas_can_dpan;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_blend_rel_pt_mas_caa_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_blend/op_blend_mask_color_i386.c b/src/lib/engines/common/evas_op_blend/op_blend_mask_color_i386.c
new file mode 100644 (file)
index 0000000..b091afd
--- /dev/null
@@ -0,0 +1,252 @@
+
+/* blend mask x color -> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_blend_mas_c_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_256, mm6)
+   MOV_P2R(c, mm2, mm0)
+   c = 256 - (c >> 24);
+   MOV_A2R(c, mm4)
+   while (d < e) {
+       l = *m;
+       switch(l)
+         {
+           case 0:
+               break;
+           case 255:
+               MOV_P2R(*d, mm1, mm0)
+               MUL4_256_R2R(mm4, mm1)
+               paddw_r2r(mm2, mm1);
+               MOV_R2P(mm1, *d, mm0)
+               break;
+           default:
+               l++;
+               MOV_A2R(l, mm3)
+               MUL4_256_R2R(mm2, mm3)
+
+               MOV_RA2R(mm3, mm1)
+               movq_r2r(mm6, mm7);
+               psubw_r2r(mm1, mm7);
+
+               MOV_P2R(*d, mm1, mm0)
+               MUL4_256_R2R(mm7, mm1)
+
+               paddw_r2r(mm3, mm1);
+               MOV_R2P(mm1, *d, mm0)
+               break;
+         }
+       m++;  d++;
+     }
+}
+
+static void
+_op_blend_mas_can_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_P2R(c, mm2, mm0)
+   MOV_A2R(ALPHA_255, mm5)
+   while (d < e) {
+       l = *m;
+       switch(l)
+         {
+           case 0:
+               break;
+           case 255:
+               *d = c;
+               break;
+           default:
+               l++;
+               MOV_A2R(l, mm3)
+               MOV_P2R(*d, mm1, mm0)
+               movq_r2r(mm2, mm4);
+               INTERP_256_R2R(mm3, mm4, mm1, mm5)
+               MOV_R2P(mm1, *d, mm0)
+               break;
+         }
+       m++;  d++;
+     }
+}
+
+#define _op_blend_mas_cn_dp_mmx _op_blend_mas_can_dp_mmx
+#define _op_blend_mas_caa_dp_mmx _op_blend_mas_c_dp_mmx
+
+#define _op_blend_mas_c_dpan_mmx _op_blend_mas_c_dp_mmx
+#define _op_blend_mas_cn_dpan_mmx _op_blend_mas_cn_dp_mmx
+#define _op_blend_mas_can_dpan_mmx _op_blend_mas_can_dp_mmx
+#define _op_blend_mas_caa_dpan_mmx _op_blend_mas_caa_dp_mmx
+
+static void
+init_blend_mask_color_span_funcs_mmx(void)
+{
+   op_blend_span_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_blend_mas_c_dp_mmx;
+   op_blend_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_mas_cn_dp_mmx;
+   op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_blend_mas_can_dp_mmx;
+   op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_blend_mas_caa_dp_mmx;
+
+   op_blend_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_blend_mas_c_dpan_mmx;
+   op_blend_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_mas_cn_dpan_mmx;
+   op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_blend_mas_can_dpan_mmx;
+   op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_blend_mas_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_blend_pt_mas_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+       s = m + 1;
+       MOV_A2R(s, mm3)
+       MOV_A2R(ALPHA_256, mm6)
+       pxor_r2r(mm0, mm0);
+       MOV_P2R(c, mm2, mm0)
+       MUL4_256_R2R(mm2, mm3)
+
+       MOV_RA2R(mm3, mm1)
+       psubw_r2r(mm1, mm6);
+
+       MOV_P2R(*d, mm1, mm0)
+       MUL4_256_R2R(mm6, mm1)
+
+       paddw_r2r(mm3, mm1);
+       MOV_R2P(mm1, *d, mm0)
+}
+
+
+#define _op_blend_pt_mas_cn_dp_mmx _op_blend_pt_mas_c_dp_mmx
+#define _op_blend_pt_mas_can_dp_mmx _op_blend_pt_mas_c_dp_mmx
+#define _op_blend_pt_mas_caa_dp_mmx _op_blend_pt_mas_c_dp_mmx
+
+#define _op_blend_pt_mas_c_dpan_mmx _op_blend_pt_mas_c_dp_mmx
+#define _op_blend_pt_mas_cn_dpan_mmx _op_blend_pt_mas_cn_dp_mmx
+#define _op_blend_pt_mas_can_dpan_mmx _op_blend_pt_mas_can_dp_mmx
+#define _op_blend_pt_mas_caa_dpan_mmx _op_blend_pt_mas_caa_dp_mmx
+
+static void
+init_blend_mask_color_pt_funcs_mmx(void)
+{
+   op_blend_pt_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_blend_pt_mas_c_dp_mmx;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pt_mas_cn_dp_mmx;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_blend_pt_mas_can_dp_mmx;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_blend_pt_mas_caa_dp_mmx;
+
+   op_blend_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_blend_pt_mas_c_dpan_mmx;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_mas_cn_dpan_mmx;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_blend_pt_mas_can_dpan_mmx;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_blend_pt_mas_caa_dpan_mmx;
+}
+#endif
+
+/*-----*/
+
+/* blend_rel mask x color -> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_blend_rel_mas_c_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_256, mm6)
+   MOV_A2R(ALPHA_255, mm5)
+   MOV_P2R(c, mm2, mm0)
+   while (d < e) {
+       l = *m;
+       switch(l)
+         {
+           case 0:
+               break;
+           default:
+               l++;
+               MOV_A2R(l, mm3)
+               MUL4_256_R2R(mm2, mm3)
+
+               MOV_RA2R(mm3, mm1)
+               movq_r2r(mm6, mm7);
+               psubw_r2r(mm1, mm7);
+
+               MOV_P2R(*d, mm1, mm0)
+               MOV_RA2R(mm1, mm4)
+               MUL4_256_R2R(mm7, mm1)
+
+               MUL4_SYM_R2R(mm4, mm3, mm5)
+
+               paddw_r2r(mm3, mm1);
+               MOV_R2P(mm1, *d, mm0)
+               break;
+         }
+       m++;  d++;
+     }
+}
+
+#define _op_blend_rel_mas_cn_dp_mmx _op_blend_rel_mas_c_dp_mmx
+#define _op_blend_rel_mas_can_dp_mmx _op_blend_rel_mas_c_dp_mmx
+#define _op_blend_rel_mas_caa_dp_mmx _op_blend_rel_mas_c_dp_mmx
+
+#define _op_blend_rel_mas_c_dpan_mmx _op_blend_mas_c_dpan_mmx
+#define _op_blend_rel_mas_cn_dpan_mmx _op_blend_mas_cn_dpan_mmx
+#define _op_blend_rel_mas_can_dpan_mmx _op_blend_mas_can_dpan_mmx
+#define _op_blend_rel_mas_caa_dpan_mmx _op_blend_mas_caa_dpan_mmx
+
+static void
+init_blend_rel_mask_color_span_funcs_mmx(void)
+{
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_blend_rel_mas_c_dp_mmx;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_rel_mas_cn_dp_mmx;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_blend_rel_mas_can_dp_mmx;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_blend_rel_mas_caa_dp_mmx;
+
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_blend_rel_mas_c_dpan_mmx;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_mas_cn_dpan_mmx;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_mas_can_dpan_mmx;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_mas_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_blend_rel_pt_mas_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+       pxor_r2r(mm0, mm0);
+       MOV_A2R(ALPHA_256, mm6)
+       MOV_A2R(ALPHA_255, mm5)
+       s = m + 1;
+       MOV_A2R(s, mm3)
+       MOV_P2R(c, mm2, mm0)
+       MUL4_256_R2R(mm2, mm3)
+
+       MOV_RA2R(mm3, mm1)
+       psubw_r2r(mm1, mm6);
+
+       MOV_P2R(*d, mm1, mm0)
+       MOV_RA2R(mm1, mm4)
+       MUL4_256_R2R(mm6, mm1)
+
+       MUL4_SYM_R2R(mm4, mm3, mm5)
+
+       paddw_r2r(mm3, mm1);
+       MOV_R2P(mm1, *d, mm0)
+}
+
+#define _op_blend_rel_pt_mas_cn_dp_mmx _op_blend_rel_pt_mas_c_dp_mmx
+#define _op_blend_rel_pt_mas_can_dp_mmx _op_blend_rel_pt_mas_c_dp_mmx
+#define _op_blend_rel_pt_mas_caa_dp_mmx _op_blend_rel_pt_mas_c_dp_mmx
+
+#define _op_blend_rel_pt_mas_c_dpan_mmx _op_blend_pt_mas_c_dpan_mmx
+#define _op_blend_rel_pt_mas_cn_dpan_mmx _op_blend_pt_mas_cn_dpan_mmx
+#define _op_blend_rel_pt_mas_can_dpan_mmx _op_blend_pt_mas_can_dpan_mmx
+#define _op_blend_rel_pt_mas_caa_dpan_mmx _op_blend_pt_mas_caa_dpan_mmx
+
+static void
+init_blend_rel_mask_color_pt_funcs_mmx(void)
+{
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_blend_rel_pt_mas_c_dp_mmx;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_rel_pt_mas_cn_dp_mmx;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_blend_rel_pt_mas_can_dp_mmx;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_blend_rel_pt_mas_caa_dp_mmx;
+
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_blend_rel_pt_mas_c_dpan_mmx;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_mas_cn_dpan_mmx;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_pt_mas_can_dpan_mmx;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_pt_mas_caa_dpan_mmx;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_blend/op_blend_mask_color_neon.c b/src/lib/engines/common/evas_op_blend/op_blend_mask_color_neon.c
new file mode 100644 (file)
index 0000000..7664248
--- /dev/null
@@ -0,0 +1,499 @@
+
+/* blend mask x color -> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_blend_mas_c_dp_neon(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha = 256 - (c >> 24);
+#define AP "blend_mas_c_dp_"
+     asm volatile (
+       "       vdup.i32        q15, %[c]                       \n\t"
+       "       vmov.i8         q14,    #1                      \n\t"
+
+               // If aligned already - straight to quads
+       "       andS            %[tmp], %[d],$0xf               \n\t"
+       "       beq             "AP"quadloops                   \n\t"
+
+       "       andS            %[tmp], %[d],$0x4               \n\t"
+       "       beq             "AP"dualloop                    \n\t"
+
+       AP"singleloop:                                          \n\t"
+       "       vld1.8          d0[0],  [%[m]]!                 \n\t"
+       "       vld1.32         d4[0],  [%[d]]                  \n\t"
+       "       vdup.u8         d0,     d0[0]                   \n\t"
+       "       vmull.u8        q4,     d0, d30                 \n\t"
+       "       vshrn.u16       d12,    q4, #8                  \n\t"
+       "       vmvn.u16        d14,    d12                     \n\t"
+       "       vshr.u32        d16,    d14, #24                \n\t"
+       "       vmul.u32        d16,    d16, d28                \n\t"
+       "       vmull.u8        q7,     d16, d4                 \n\t"
+       "       vshrn.u16       d0,     q7, #8                  \n\t"
+       "       vqadd.u8        d0,     d0, d12                 \n\t"
+       "       vst1.32         d0[0],  [%[d]]!                 \n\t"
+
+               // Can we go the fast path?
+       "       andS            %[tmp], %[d],$0xf               \n\t"
+       "       beq             "AP"quadloops                   \n\t"
+
+       AP"dualloop:                                            \n\t"
+       "       sub             %[tmp], %[e], %[d]              \n\t"
+       "       cmp             %[tmp], #16                     \n\t"
+       "       blt             "AP"loopout                     \n\t"
+
+       "       vld1.16         d0[0],  [%[m]]!                 \n\t"
+       "       vldm            %[d],   {d4}                    \n\t"
+       "       vmovl.u8        q0,     d0                      \n\t"
+       "       vmovl.u8        q0,     d0                      \n\t"
+       "       vmul.u32        q0,     q14                     \n\t"
+       "       vmull.u8        q4,     d0, d30                 \n\t"
+       "       vshrn.u16       d12,    q4, #8                  \n\t"
+       "       vmvn.u16        d14,    d12                     \n\t"
+       "       vshr.u32        d16,    d14, #24                \n\t"
+       "       vmul.u32        d16,    d16, d28                \n\t"
+       "       vmull.u8        q7,     d16, d4                 \n\t"
+       "       vshrn.u16       d0,     q7, #8                  \n\t"
+       "       vqadd.u8        q0,     q0, q6                  \n\t"
+       "       vstm            %[d]!,  {d0}                    \n\t"
+
+       AP"quadloops:                                           \n\t"
+       "       sub             %[tmp], %[e], %[d]              \n\t"
+       "       cmp             %[tmp], #16                     \n\t"
+       "       blt             "AP"loopout                     \n\t"
+       "       sub             %[tmp], %[e], #15               \n\t"
+
+       "       sub             %[d],   #16                     \n\t"
+       AP"fastloop:"
+       "       add             %[d],   #16                     \n\t"
+       "       cmp             %[tmp], %[d]                    \n\t"
+       "       ble             "AP"loopout                     \n\t"
+       AP"quadloopint:                                         \n\t"
+//     "       vld1.32         d0[0],  [%[m]]!                 \n\t"
+       "       ldr.32          %[x],   [%[m]]                  \n\t"
+       "       add %[m], #4                                    \n\t"
+       "       cmp             %[x],   #0                      \n\t"
+       "       beq             "AP"fastloop                    \n\t"
+       "       vmov.32         d0[0],  %[x]                    \n\t"
+       "       vldm            %[d], {d4,d5}                   \n\t"
+
+       // Expand M: Fixme: Can we do this quicker?
+       "       vmovl.u8        q0,     d0                      \n\t"
+       "       vmovl.u8        q0,     d0                      \n\t"
+       "       vmul.u32        q0,     q14                     \n\t"
+
+       // Multiply     a * c
+       "       vmull.u8        q4,     d0, d30                 \n\t"
+       "       vmull.u8        q5,     d1, d31                 \n\t"
+
+       // Shorten
+       "       vshrn.u16       d12,    q4, #8                  \n\t"
+       "       vshrn.u16       d13,    q5, #8                  \n\t"
+
+       // extract negated alpha
+       "       vmvn.u16        q7,     q6                      \n\t"
+       "       vshr.u32        q8,     q7, #24                 \n\t"
+       "       vmul.u32        q8,     q8, q14                 \n\t"
+
+       // Multiply
+       "       vmull.u8        q7,     d16, d4                 \n\t"
+       "       vmull.u8        q8,     d17, d5                 \n\t"
+
+       "       vshrn.u16       d0,     q7, #8                  \n\t"
+       "       vshrn.u16       d1,     q8, #8                  \n\t"
+
+       // Add
+       "       vqadd.u8        q0,     q0, q6                  \n\t"
+
+       "       vstm            %[d]!,  {d0,d1}                 \n\t"
+
+       "       cmp             %[tmp], %[d]                    \n\t"
+       "       bhi             "AP"quadloopint                 \n\t"
+
+       AP"loopout:                                             \n\t"
+       "       cmp             %[d], %[e]                      \n\t"
+       "       beq             "AP"done                        \n\t"
+       "       sub             %[tmp],%[e], %[d]               \n\t"
+       "       cmp             %[tmp],#4                       \n\t"
+       "       beq             "AP"singleout                   \n\t"
+
+       AP "dualloop2:                                  \n\t"
+               "sub            %[tmp],%[e],$0x7        \n\t"
+       "       vld1.16         d0[0],  [%[m]]!                 \n\t"
+       "       vldm            %[d],   {d4}                    \n\t"
+       "       vmovl.u8        q0,     d0                      \n\t"
+       "       vmovl.u8        q0,     d0                      \n\t"
+       "       vmul.u32        q0,     q14                     \n\t"
+       "       vmull.u8        q4,     d0, d30                 \n\t"
+       "       vshrn.u16       d12,    q4, #8                  \n\t"
+       "       vmvn.u16        d14,    d12                     \n\t"
+       "       vshr.u32        d16,    d14, #24                \n\t"
+       "       vmul.u32        d16,    d16, d28                \n\t"
+       "       vmull.u8        q7,     d16, d4                 \n\t"
+       "       vshrn.u16       d0,     q7, #8                  \n\t"
+       "       vqadd.u8        q0,     q0, q6                  \n\t"
+       "       vstm            %[d]!,  {d0}                    \n\t"
+
+       "       cmp             %[e], %[d]              \n\t"
+       "       beq             "AP"done                \n\t"
+
+       AP"singleout:                                           \n\t"
+       "       vld1.8          d0[0],  [%[m]]!                 \n\t"
+       "       vld1.32         d4[0],  [%[d]]                  \n\t"
+       "       vdup.u8         d0,     d0[0]                   \n\t"
+       "       vmull.u8        q4,     d0, d30                 \n\t"
+       "       vshrn.u16       d12,    q4, #8                  \n\t"
+       "       vmvn.u16        d14,    d12                     \n\t"
+       "       vshr.u32        d16,    d14, #24                \n\t"
+       "       vmul.u32        d16,    d16, d28                \n\t"
+       "       vmull.u8        q7,     d16, d4                 \n\t"
+       "       vshrn.u16       d0,     q7, #8                  \n\t"
+       "       vqadd.u8        q0,     q0, q6                  \n\t"
+       "       vst1.32         d0[0],  [%[d]]!                 \n\t"
+
+       AP"done:                                                \n\t"
+
+       : // Out
+       :  [e] "r" (d + l), [d] "r" (d), [c] "r" (c),
+               [tmp] "r" (7), [m] "r" (m), [x] "r" (0)
+          : "q0", "q1", "q2","q3", "q4","q5","q6", "q7","q8","q14","q15",
+                       "memory" // clobbered
+       );
+#undef AP
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_blend_mas_can_dp_neon(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e,*tmp;
+   int alpha;
+#define AP     "_blend_mas_can_dp_neon_"
+     asm volatile (
+               "vdup.u32       q9,     %[c]            \n\t"
+               "vmov.i8        q15,    #1              \n\t"
+               "vmov.i8        q14,    #0              \n\t"
+
+               // Make C 16 bit (C in q3/q2)
+               "vmovl.u8       q3,     d19             \n\t"
+               "vmovl.u8       q2,     d18             \n\t"
+
+               // Which loop to start
+       "       andS            %[tmp], %[d],$0xf       \n\t"
+       "       beq             "AP"quadloop            \n\t"
+
+       "       andS            %[tmp], %[d], #4        \n\t"
+       "       beq             "AP"dualloop            \n\t"
+
+
+       AP"singleloop:                                  \n\t"
+       "       vld1.8          d0[0],  [%[m]]!         \n\t"
+       "       vld1.32         d8[0],  [%[d]]          \n\t"
+       "       vdup.u8         d0,     d0[0]           \n\t"
+       "       vshr.u8         d0,     d0,     #1      \n\t"
+       "       vmovl.u8        q0,     d0              \n\t"
+       "       vmovl.u8        q4,     d8              \n\t"
+       "       vsub.s16        q6,     q2,     q4      \n\t"
+       "       vmul.s16        q6,     q0              \n\t"
+       "       vshr.s16        q6,     #7              \n\t"
+       "       vadd.s16        q6,     q4              \n\t"
+       "       vqmovun.s16     d2,     q6              \n\t"
+       "       vst1.32         d2[0],  [%[d]]!         \n\t"
+
+       "       andS            %[tmp], %[d],   #15     \n\t"
+       "       beq             "AP"quadloop            \n\t"
+
+       AP"dualloop:                                    \n\t"
+       "       vld1.16 d0[0],  [%[m]]!         \n\t"
+       "       vldm            %[d],           {d8}    \n\t"
+       "       vmovl.u8        q0,     d0              \n\t"
+       "       vmovl.u8        q0,     d0              \n\t"
+       "       vmul.u32        d0,     d0,     d30     \n\t"
+       "       vshr.u8 d0,     d0, #1          \n\t"
+       "       vmovl.u8        q0,     d0              \n\t"
+       "       vmovl.u8        q4,     d8              \n\t"
+       "       vsub.s16        q6,     q2, q4          \n\t"
+       "       vmul.s16        q6,     q0              \n\t"
+       "       vshr.s16        q6,  #7                 \n\t"
+       "       vadd.s16        q6,  q4                 \n\t"
+       "       vqmovun.s16     d2,  q6                 \n\t"
+       "       vstm            %[d]!,  {d2}    \n\t"
+
+       AP"quadloop:                                    \n\t"
+       "       sub             %[tmp], %[e], %[d]      \n\t"
+       "       cmp             %[tmp], #16             \n\t"
+       "       blt             "AP"loopout             \n\t"
+       "       sub             %[tmp], %[e], #15       \n\t"
+
+       "       sub             %[d],   #16             \n\t"
+       AP"fastloop:                                    \n\t"
+       "       add             %[d],   #16             \n\t"
+       "       cmp             %[tmp], %[d]            \n\t"
+       "       ble             "AP"loopout             \n\t"
+
+       AP"quadloopint:                                 \n\t"
+               // Load the mask: 4 bytes: It has d0/d1
+       "       ldr.32          %[x],   [%[m]]          \n\t"
+       "       add             %[m], #4                \n\t"
+       "       cmp             %[x],   #0              \n\t"
+       "       beq             "AP"fastloop            \n\t"
+       "       vmov.32         d0[0],  %[x]            \n\t"
+
+               // Load d into d8/d9 q4
+       "       vldm            %[d],   {d8,d9}         \n\t"
+       "       cmp             %[x],   $0xffffffff     \n\t"
+       "       beq             "AP"quadstore           \n\t"
+
+
+               // Get the alpha channel ready (m)
+       "       vmovl.u8        q0,     d0              \n\t"
+       "       vmovl.u8        q0,     d0              \n\t"
+       "       vmul.u32        q0,     q0,q15          \n\t"
+               // Lop a bit off to prevent overflow
+       "       vshr.u8 q0,     q0, #1          \n\t"
+
+               // Now make it 16 bit
+       "       vmovl.u8        q1,     d1              \n\t"
+       "       vmovl.u8        q0,     d0              \n\t"
+
+               // 16 bit 'd'
+       "       vmovl.u8        q5,     d9              \n\t"
+       "       vmovl.u8        q4,     d8              \n\t"
+
+               // Diff 'd' & 'c'
+       "       vsub.s16        q7,     q3, q5          \n\t"
+       "       vsub.s16        q6,     q2, q4          \n\t"
+
+       "       vmul.s16        q7,     q1              \n\t"
+       "       vmul.s16        q6,     q0              \n\t"
+
+               // Shift results a bit
+       "       vshr.s16        q7,  #7                 \n\t"
+       "       vshr.s16        q6,  #7                 \n\t"
+
+               // Add 'd'
+       "       vadd.s16        q7,  q5                 \n\t"
+       "       vadd.s16        q6,  q4                 \n\t"
+
+               // Make sure none are negative
+       "       vqmovun.s16     d9,  q7                 \n\t"
+       "       vqmovun.s16     d8,  q6                 \n\t"
+
+       "       vstm            %[d]!,  {d8,d9} \n\t"
+
+       "       cmp             %[tmp], %[d]            \n\t"
+       "       bhi             "AP"quadloopint         \n\t"
+       "       b               "AP"loopout             \n\t"
+
+       AP"quadstore:                                   \n\t"
+       "       vstm            %[d]!,  {d18,d19}       \n\t"
+       "       cmp             %[tmp], %[d]            \n\t"
+       "       bhi             "AP"quadloopint         \n\t"
+
+
+       AP"loopout:                                     \n\t"
+
+       "       cmp             %[e], %[d]              \n\t"
+       "       beq             "AP"done                \n\t"
+
+       "       sub             %[tmp],%[e], %[d]       \n\t"
+       "       cmp             %[tmp],#8               \n\t"
+
+       "       blt             "AP"onebyte             \n\t"
+
+               // Load the mask: 2 bytes: It has d0
+       "       vld1.16 d0[0],  [%[m]]!         \n\t"
+
+               // Load d into d8/d9 q4
+       "       vldm            %[d],           {d8}    \n\t"
+
+               // Get the alpha channel ready (m)
+       "       vmovl.u8        q0,     d0              \n\t"
+       "       vmovl.u8        q0,     d0              \n\t"
+       "       vmul.u32        d0,     d0,     d30     \n\t"
+               // Lop a bit off to prevent overflow
+       "       vshr.u8 d0,     d0, #1          \n\t"
+
+               // Now make it 16 bit
+       "       vmovl.u8        q0,     d0              \n\t"
+
+               // 16 bit 'd'
+       "       vmovl.u8        q4,     d8              \n\t"
+
+               // Diff 'd' & 'c'
+       "       vsub.s16        q6,     q2, q4          \n\t"
+
+       "       vmul.s16        q6,     q0              \n\t"
+
+               // Shift results a bit
+       "       vshr.s16        q6,  #7                 \n\t"
+
+               // Add 'd'
+               "vadd.s16       q6,  q4                 \n\t"
+
+               // Make sure none are negative
+               "vqmovun.s16    d2,  q6                 \n\t"
+
+               "vstm           %[d]!,  {d2}    \n\t"
+
+               "cmp            %[e], %[d]              \n\t"
+               "beq            "AP"done                \n\t"
+
+       AP"onebyte:                                     \n\t"
+               "vld1.8 d0[0],  [%[m]]!                 \n\t"
+               "vld1.32        d8[0],  [%[d]]          \n\t"
+               "vdup.u8        d0,     d0[0]           \n\t"
+               "vshr.u8        d0,     d0, #1          \n\t"
+               "vmovl.u8       q0,     d0              \n\t"
+               "vmovl.u8       q4,     d8              \n\t"
+               "vsub.s16       q6,     q2, q4          \n\t"
+               "vmul.s16       q6,     q0              \n\t"
+               "vshr.s16       q6,  #7                 \n\t"
+               "vadd.s16       q6,  q4                 \n\t"
+               "vqmovun.s16    d2,  q6                 \n\t"
+               "vst1.32        d2[0], [%[d]]!          \n\t"
+
+       AP"done:                                        \n\t"
+
+         : // output regs
+         // Input
+          :  [e] "r" (e = d + l), [d] "r" (d), [c] "r" (c),
+               [m] "r" (m), [tmp] "r" (7), [x] "r" (33)
+          : "q0", "q1", "q2","q3", "q4","q5","q6", "q7","q14","q15",
+                       "memory" // clobbered
+
+     );
+#undef AP
+}
+#endif
+
+#ifdef BUILD_NEON
+#define _op_blend_mas_cn_dp_neon _op_blend_mas_can_dp_neon
+#define _op_blend_mas_caa_dp_neon _op_blend_mas_c_dp_neon
+
+#define _op_blend_mas_c_dpan_neon _op_blend_mas_c_dp_neon
+#define _op_blend_mas_cn_dpan_neon _op_blend_mas_cn_dp_neon
+#define _op_blend_mas_can_dpan_neon _op_blend_mas_can_dp_neon
+#define _op_blend_mas_caa_dpan_neon _op_blend_mas_caa_dp_neon
+
+static void
+init_blend_mask_color_span_funcs_neon(void)
+{
+   op_blend_span_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_blend_mas_c_dp_neon;
+   op_blend_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_mas_cn_dp_neon;
+   op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_blend_mas_can_dp_neon;
+   op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_blend_mas_caa_dp_neon;
+
+   op_blend_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_blend_mas_c_dpan_neon;
+   op_blend_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_mas_cn_dpan_neon;
+   op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_blend_mas_can_dpan_neon;
+   op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_blend_mas_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_blend_pt_mas_c_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   s = MUL_SYM(m, c);
+   c = 256 - (s >> 24);
+   *d = MUL_SYM(*d >> 24, s) + MUL_256(c, *d);
+}
+
+
+#define _op_blend_pt_mas_cn_dp_neon _op_blend_pt_mas_c_dp_neon
+#define _op_blend_pt_mas_can_dp_neon _op_blend_pt_mas_c_dp_neon
+#define _op_blend_pt_mas_caa_dp_neon _op_blend_pt_mas_c_dp_neon
+
+#define _op_blend_pt_mas_c_dpan_neon _op_blend_pt_mas_c_dp_neon
+#define _op_blend_pt_mas_cn_dpan_neon _op_blend_pt_mas_cn_dp_neon
+#define _op_blend_pt_mas_can_dpan_neon _op_blend_pt_mas_can_dp_neon
+#define _op_blend_pt_mas_caa_dpan_neon _op_blend_pt_mas_caa_dp_neon
+
+static void
+init_blend_mask_color_pt_funcs_neon(void)
+{
+   op_blend_pt_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_blend_pt_mas_c_dp_neon;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_pt_mas_cn_dp_neon;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_blend_pt_mas_can_dp_neon;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_blend_pt_mas_caa_dp_neon;
+
+   op_blend_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_blend_pt_mas_c_dpan_neon;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_mas_cn_dpan_neon;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_blend_pt_mas_can_dpan_neon;
+   op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_blend_pt_mas_caa_dpan_neon;
+}
+#endif
+
+/*-----*/
+
+/* blend_rel mask x color -> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_blend_rel_mas_c_dp_neon(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        DATA32 mc = MUL_SYM(*m, c);
+                        alpha = 256 - (mc >> 24);
+                        *d = MUL_SYM(*d >> 24, mc) + MUL_256(alpha, *d);
+                        d++;
+                        m++;
+                     });
+}
+
+#define _op_blend_rel_mas_cn_dp_neon _op_blend_rel_mas_c_dp_neon
+#define _op_blend_rel_mas_can_dp_neon _op_blend_rel_mas_c_dp_neon
+#define _op_blend_rel_mas_caa_dp_neon _op_blend_rel_mas_c_dp_neon
+
+#define _op_blend_rel_mas_c_dpan_neon _op_blend_mas_c_dpan_neon
+#define _op_blend_rel_mas_cn_dpan_neon _op_blend_mas_cn_dpan_neon
+#define _op_blend_rel_mas_can_dpan_neon _op_blend_mas_can_dpan_neon
+#define _op_blend_rel_mas_caa_dpan_neon _op_blend_mas_caa_dpan_neon
+
+static void
+init_blend_rel_mask_color_span_funcs_neon(void)
+{
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_blend_rel_mas_c_dp_neon;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_rel_mas_cn_dp_neon;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_blend_rel_mas_can_dp_neon;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_blend_rel_mas_caa_dp_neon;
+
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_blend_rel_mas_c_dpan_neon;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_mas_cn_dpan_neon;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_mas_can_dpan_neon;
+   op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_mas_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_blend_rel_pt_mas_c_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   s = MUL_SYM(m, c);
+   c = 256 - (s >> 24);
+   *d = MUL_SYM(*d >> 24, s) + MUL_256(c, *d);
+}
+
+#define _op_blend_rel_pt_mas_cn_dp_neon _op_blend_rel_pt_mas_c_dp_neon
+#define _op_blend_rel_pt_mas_can_dp_neon _op_blend_rel_pt_mas_c_dp_neon
+#define _op_blend_rel_pt_mas_caa_dp_neon _op_blend_rel_pt_mas_c_dp_neon
+
+#define _op_blend_rel_pt_mas_c_dpan_neon _op_blend_pt_mas_c_dpan_neon
+#define _op_blend_rel_pt_mas_cn_dpan_neon _op_blend_pt_mas_cn_dpan_neon
+#define _op_blend_rel_pt_mas_can_dpan_neon _op_blend_pt_mas_can_dpan_neon
+#define _op_blend_rel_pt_mas_caa_dpan_neon _op_blend_pt_mas_caa_dpan_neon
+
+static void
+init_blend_rel_mask_color_pt_funcs_neon(void)
+{
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_blend_rel_pt_mas_c_dp_neon;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_rel_pt_mas_cn_dp_neon;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_blend_rel_pt_mas_can_dp_neon;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_blend_rel_pt_mas_caa_dp_neon;
+
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_blend_rel_pt_mas_c_dpan_neon;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_mas_cn_dpan_neon;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_pt_mas_can_dpan_neon;
+   op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_pt_mas_caa_dpan_neon;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_blend/op_blend_pixel_.c b/src/lib/engines/common/evas_op_blend/op_blend_pixel_.c
new file mode 100644 (file)
index 0000000..761c3a6
--- /dev/null
@@ -0,0 +1,163 @@
+
+/* blend pixel --> dst */
+
+#ifdef BUILD_C
+static void
+_op_blend_p_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        alpha = 256 - (*s >> 24);
+                        *d = *s++ + MUL_256(alpha, *d);
+                        d++;
+                     });
+}
+
+static void
+_op_blend_pas_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        switch (*s & 0xff000000)
+                          {
+                          case 0:
+                             break;
+                          case 0xff000000:
+                             *d = *s;
+                             break;
+                          default:
+                             alpha = 256 - (*s >> 24);
+                             *d = *s + MUL_256(alpha, *d);
+                             break;
+                          }
+                        s++;  d++;
+                     });
+}
+
+#define _op_blend_pan_dp NULL
+
+#define _op_blend_p_dpan _op_blend_p_dp
+#define _op_blend_pas_dpan _op_blend_pas_dp
+#define _op_blend_pan_dpan _op_blend_pan_dp
+
+static void
+init_blend_pixel_span_funcs_c(void)
+{
+   op_blend_span_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_blend_p_dp;
+   op_blend_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_blend_pas_dp;
+   op_blend_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_blend_pan_dp;
+
+   op_blend_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_p_dpan;
+   op_blend_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_pas_dpan;
+   op_blend_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_pan_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_blend_pt_p_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   c = 256 - (s >> 24);
+   *d = s + MUL_256(c, *d);
+}
+
+#define _op_blend_pt_pas_dp _op_blend_pt_p_dp
+#define _op_blend_pt_pan_dp NULL
+
+#define _op_blend_pt_p_dpan _op_blend_pt_p_dp
+#define _op_blend_pt_pan_dpan _op_blend_pt_pan_dp
+#define _op_blend_pt_pas_dpan _op_blend_pt_pas_dp
+
+static void
+init_blend_pixel_pt_funcs_c(void)
+{
+   op_blend_pt_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_blend_pt_p_dp;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_blend_pt_pas_dp;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_blend_pt_pan_dp;
+
+   op_blend_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_pt_p_dpan;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_pt_pas_dpan;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_pt_pan_dpan;
+}
+#endif
+
+/*-----*/
+
+/* blend_rel pixel -> dst */
+
+#ifdef BUILD_C
+static void
+_op_blend_rel_p_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        alpha = 256 - (*s >> 24);
+                        c = 1 + (*d >> 24);
+                        *d = MUL_256(c, *s) + MUL_256(alpha, *d);
+                        d++;
+                        s++;
+                     });
+}
+
+static void
+_op_blend_rel_pan_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        c = 1 + (*d >> 24);
+                        *d++ = MUL_256(c, *s);
+                        s++;
+                     });
+}
+
+#define _op_blend_rel_pas_dp _op_blend_rel_p_dp
+
+#define _op_blend_rel_p_dpan _op_blend_p_dpan
+#define _op_blend_rel_pan_dpan _op_blend_pan_dpan
+#define _op_blend_rel_pas_dpan _op_blend_pas_dpan
+
+static void
+init_blend_rel_pixel_span_funcs_c(void)
+{
+   op_blend_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_blend_rel_p_dp;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_blend_rel_pas_dp;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_blend_rel_pan_dp;
+
+   op_blend_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_rel_p_dpan;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_rel_pas_dpan;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_rel_pan_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_blend_rel_pt_p_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   c = 256 - (s >> 24);
+   *d = MUL_SYM(*d >> 24, s) + MUL_256(c, *d);
+}
+
+static void
+_op_blend_rel_pt_pan_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d) {
+   *d = MUL_SYM(*d >> 24, s);
+}
+
+#define _op_blend_rel_pt_pas_dp _op_blend_rel_pt_p_dp
+
+#define _op_blend_rel_pt_p_dpan _op_blend_pt_p_dpan
+#define _op_blend_rel_pt_pan_dpan _op_blend_pt_pan_dpan
+#define _op_blend_rel_pt_pas_dpan _op_blend_pt_pas_dpan
+
+static void
+init_blend_rel_pixel_pt_funcs_c(void)
+{
+   op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_blend_rel_pt_p_dp;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_blend_rel_pt_pas_dp;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_blend_rel_pt_pan_dp;
+
+   op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_rel_pt_p_dpan;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_rel_pt_pas_dpan;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_rel_pt_pan_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_.c b/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_.c
new file mode 100644 (file)
index 0000000..ee30321
--- /dev/null
@@ -0,0 +1,285 @@
+
+/* blend pixel x color --> dst */
+
+#ifdef BUILD_C
+static void
+_op_blend_p_c_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        DATA32 sc = MUL4_SYM(c, *s);
+                        alpha = 256 - (sc >> 24);
+                        *d = sc + MUL_256(alpha, *d);
+                        d++;
+                        s++;
+                     });
+}
+
+static void
+_op_blend_pan_c_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha = 256 - (c >> 24);
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d = ((c & 0xff000000) + MUL3_SYM(c, *s)) + MUL_256(alpha, *d);
+                        d++;
+                        s++;
+                     });
+}
+
+static void
+_op_blend_p_can_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        alpha = 256 - (*s >> 24);
+                        *d = ((*s & 0xff000000) + MUL3_SYM(c, *s)) + MUL_256(alpha, *d);
+                        d++;
+                        s++;
+                     });
+}
+
+static void
+_op_blend_pan_can_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d++ = 0xff000000 + MUL3_SYM(c, *s);
+                        s++;
+                     });
+}
+
+static void
+_op_blend_p_caa_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   c = 1 + (c & 0xff);
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        DATA32 sc = MUL_256(c, *s);
+                        alpha = 256 - (sc >> 24);
+                        *d = sc + MUL_256(alpha, *d);
+                        d++;
+                        s++;
+                     });
+}
+
+static void
+_op_blend_pan_caa_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   c = 1 + (c & 0xff);
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d = INTERP_256(c, *s, *d);
+                        d++;
+                        s++;
+                     });
+}
+
+#define _op_blend_pas_c_dp _op_blend_p_c_dp
+#define _op_blend_pas_can_dp _op_blend_p_can_dp
+#define _op_blend_pas_caa_dp _op_blend_p_caa_dp
+
+#define _op_blend_p_c_dpan _op_blend_p_c_dp
+#define _op_blend_pas_c_dpan _op_blend_pas_c_dp
+#define _op_blend_pan_c_dpan _op_blend_pan_c_dp
+#define _op_blend_p_can_dpan _op_blend_p_can_dp
+#define _op_blend_pas_can_dpan _op_blend_pas_can_dp
+#define _op_blend_pan_can_dpan _op_blend_pan_can_dp
+#define _op_blend_p_caa_dpan _op_blend_p_caa_dp
+#define _op_blend_pas_caa_dpan _op_blend_pas_caa_dp
+#define _op_blend_pan_caa_dpan _op_blend_pan_caa_dp
+
+static void
+init_blend_pixel_color_span_funcs_c(void)
+{
+   op_blend_span_funcs[SP][SM_N][SC][DP][CPU_C] = _op_blend_p_c_dp;
+   op_blend_span_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_blend_pas_c_dp;
+   op_blend_span_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_blend_pan_c_dp;
+   op_blend_span_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_blend_p_can_dp;
+   op_blend_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_blend_pas_can_dp;
+   op_blend_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_blend_pan_can_dp;
+   op_blend_span_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_blend_p_caa_dp;
+   op_blend_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_blend_pas_caa_dp;
+   op_blend_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_blend_pan_caa_dp;
+
+   op_blend_span_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_blend_p_c_dpan;
+   op_blend_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_blend_pas_c_dpan;
+   op_blend_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_blend_pan_c_dpan;
+   op_blend_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_p_can_dpan;
+   op_blend_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_pas_can_dpan;
+   op_blend_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_pan_can_dpan;
+   op_blend_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_p_caa_dpan;
+   op_blend_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_pas_caa_dpan;
+   op_blend_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_pan_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_blend_pt_p_c_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   s = MUL4_SYM(c, s);
+   c = 256 - (s >> 24);
+   *d = s + MUL_256(c, *d);
+}
+
+#define _op_blend_pt_pas_c_dp _op_blend_pt_p_c_dp
+#define _op_blend_pt_pan_c_dp _op_blend_pt_p_c_dp
+#define _op_blend_pt_p_can_dp _op_blend_pt_p_c_dp
+#define _op_blend_pt_pas_can_dp _op_blend_pt_p_c_dp
+#define _op_blend_pt_pan_can_dp _op_blend_pt_p_c_dp
+#define _op_blend_pt_p_caa_dp _op_blend_pt_p_c_dp
+#define _op_blend_pt_pas_caa_dp _op_blend_pt_p_c_dp
+#define _op_blend_pt_pan_caa_dp _op_blend_pt_p_c_dp
+
+#define _op_blend_pt_p_c_dpan _op_blend_pt_p_c_dp
+#define _op_blend_pt_pas_c_dpan _op_blend_pt_pas_c_dp
+#define _op_blend_pt_pan_c_dpan _op_blend_pt_pan_c_dp
+#define _op_blend_pt_p_can_dpan _op_blend_pt_p_can_dp
+#define _op_blend_pt_pas_can_dpan _op_blend_pt_pas_can_dp
+#define _op_blend_pt_pan_can_dpan _op_blend_pt_pan_can_dp
+#define _op_blend_pt_p_caa_dpan _op_blend_pt_p_caa_dp
+#define _op_blend_pt_pas_caa_dpan _op_blend_pt_pas_caa_dp
+#define _op_blend_pt_pan_caa_dpan _op_blend_pt_pan_caa_dp
+
+static void
+init_blend_pixel_color_pt_funcs_c(void)
+{
+   op_blend_pt_funcs[SP][SM_N][SC][DP][CPU_C] = _op_blend_pt_p_c_dp;
+   op_blend_pt_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_blend_pt_pas_c_dp;
+   op_blend_pt_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_blend_pt_pan_c_dp;
+   op_blend_pt_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_blend_pt_p_can_dp;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_blend_pt_pas_can_dp;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_blend_pt_pan_can_dp;
+   op_blend_pt_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_blend_pt_p_caa_dp;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_blend_pt_pas_caa_dp;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_blend_pt_pan_caa_dp;
+
+   op_blend_pt_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_blend_pt_p_c_dpan;
+   op_blend_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_blend_pt_pas_c_dpan;
+   op_blend_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_blend_pt_pan_c_dpan;
+   op_blend_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_pt_p_can_dpan;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_pt_pas_can_dpan;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_pt_pan_can_dpan;
+   op_blend_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_pt_p_caa_dpan;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_pt_pas_caa_dpan;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_pt_pan_caa_dpan;
+}
+#endif
+
+/*-----*/
+
+/* blend_rel pixel x color -> dst */
+
+#ifdef BUILD_C
+static void
+_op_blend_rel_p_c_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        DATA32 sc = MUL4_SYM(c, *s);
+                        alpha = 256 - (sc >> 24);
+                        *d = MUL_SYM(*d >> 24, sc) + MUL_256(alpha, *d);
+                        d++;
+                        s++;
+                     });
+}
+
+#define _op_blend_rel_pas_c_dp _op_blend_rel_p_c_dp
+#define _op_blend_rel_pan_c_dp _op_blend_rel_p_c_dp
+#define _op_blend_rel_p_can_dp _op_blend_rel_p_c_dp
+#define _op_blend_rel_pas_can_dp _op_blend_rel_p_c_dp
+#define _op_blend_rel_pan_can_dp _op_blend_rel_p_c_dp
+#define _op_blend_rel_p_caa_dp _op_blend_rel_p_c_dp
+#define _op_blend_rel_pas_caa_dp _op_blend_rel_p_c_dp
+#define _op_blend_rel_pan_caa_dp _op_blend_rel_p_c_dp
+
+#define _op_blend_rel_p_c_dpan _op_blend_p_c_dpan
+#define _op_blend_rel_pas_c_dpan _op_blend_pas_c_dpan
+#define _op_blend_rel_pan_c_dpan _op_blend_pan_c_dpan
+#define _op_blend_rel_p_can_dpan _op_blend_p_can_dpan
+#define _op_blend_rel_pas_can_dpan _op_blend_pas_can_dpan
+#define _op_blend_rel_pan_can_dpan _op_blend_pan_can_dpan
+#define _op_blend_rel_p_caa_dpan _op_blend_p_caa_dpan
+#define _op_blend_rel_pas_caa_dpan _op_blend_pas_caa_dpan
+#define _op_blend_rel_pan_caa_dpan _op_blend_pan_caa_dpan
+
+static void
+init_blend_rel_pixel_color_span_funcs_c(void)
+{
+   op_blend_rel_span_funcs[SP][SM_N][SC][DP][CPU_C] = _op_blend_rel_p_c_dp;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_blend_rel_pas_c_dp;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_blend_rel_pan_c_dp;
+   op_blend_rel_span_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_blend_rel_p_can_dp;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_blend_rel_pas_can_dp;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_blend_rel_pan_can_dp;
+   op_blend_rel_span_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_p_caa_dp;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_pas_caa_dp;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_pan_caa_dp;
+
+   op_blend_rel_span_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_p_c_dpan;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_pas_c_dpan;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_pan_c_dpan;
+   op_blend_rel_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_rel_p_can_dpan;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_rel_pas_can_dpan;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_rel_pan_can_dpan;
+   op_blend_rel_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_p_caa_dpan;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_pas_caa_dpan;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_pan_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_blend_rel_pt_p_c_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   s = MUL4_SYM(c, s);
+   c = 256 - (s >> 24);
+   *d = MUL_SYM(*d >> 24, s) + MUL_256(c, *d);
+}
+
+#define _op_blend_rel_pt_pas_c_dp _op_blend_rel_pt_p_c_dp
+#define _op_blend_rel_pt_pan_c_dp _op_blend_rel_pt_p_c_dp
+#define _op_blend_rel_pt_p_can_dp _op_blend_rel_pt_p_c_dp
+#define _op_blend_rel_pt_pas_can_dp _op_blend_rel_pt_p_c_dp
+#define _op_blend_rel_pt_pan_can_dp _op_blend_rel_pt_p_c_dp
+#define _op_blend_rel_pt_p_caa_dp _op_blend_rel_pt_p_c_dp
+#define _op_blend_rel_pt_pas_caa_dp _op_blend_rel_pt_p_c_dp
+#define _op_blend_rel_pt_pan_caa_dp _op_blend_rel_pt_p_c_dp
+
+#define _op_blend_rel_pt_p_c_dpan _op_blend_pt_p_c_dpan
+#define _op_blend_rel_pt_pas_c_dpan _op_blend_pt_pas_c_dpan
+#define _op_blend_rel_pt_pan_c_dpan _op_blend_pt_pan_c_dpan
+#define _op_blend_rel_pt_p_can_dpan _op_blend_pt_p_can_dpan
+#define _op_blend_rel_pt_pas_can_dpan _op_blend_pt_pas_can_dpan
+#define _op_blend_rel_pt_pan_can_dpan _op_blend_pt_pan_can_dpan
+#define _op_blend_rel_pt_p_caa_dpan _op_blend_pt_p_caa_dpan
+#define _op_blend_rel_pt_pas_caa_dpan _op_blend_pt_pas_caa_dpan
+#define _op_blend_rel_pt_pan_caa_dpan _op_blend_pt_pan_caa_dpan
+
+static void
+init_blend_rel_pixel_color_pt_funcs_c(void)
+{
+   op_blend_rel_pt_funcs[SP][SM_N][SC][DP][CPU_C] = _op_blend_rel_pt_p_c_dp;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_blend_rel_pt_pas_c_dp;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_blend_rel_pt_pan_c_dp;
+   op_blend_rel_pt_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_blend_rel_pt_p_can_dp;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_blend_rel_pt_pas_can_dp;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_blend_rel_pt_pan_can_dp;
+   op_blend_rel_pt_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_pt_p_caa_dp;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_pt_pas_caa_dp;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_pt_pan_caa_dp;
+
+   op_blend_rel_pt_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_pt_p_c_dpan;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_pt_pas_c_dpan;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_pt_pan_c_dpan;
+   op_blend_rel_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_rel_pt_p_can_dpan;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_rel_pt_pas_can_dpan;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_rel_pt_pan_can_dpan;
+   op_blend_rel_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_pt_p_caa_dpan;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_pt_pas_caa_dpan;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_pt_pan_caa_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_i386.c b/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_i386.c
new file mode 100644 (file)
index 0000000..92ad392
--- /dev/null
@@ -0,0 +1,222 @@
+
+/* blend pixel x color --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_blend_p_c_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   MOV_A2R(ALPHA_256, mm6)
+   MOV_A2R(ALPHA_255, mm5)
+   pxor_r2r(mm0, mm0);
+   MOV_P2R(c, mm2, mm0)
+   while (d < e) {
+       MOV_P2R(*s, mm3, mm0)
+       MUL4_SYM_R2R(mm2, mm3, mm5)
+
+       MOV_RA2R(mm3, mm1)
+       movq_r2r(mm6, mm4);
+       psubw_r2r(mm1, mm4);
+
+       MOV_P2R(*d, mm1, mm0)
+       MUL4_256_R2R(mm4, mm1)
+
+       paddw_r2r(mm3, mm1);
+       MOV_R2P(mm1, *d, mm0)
+       s++;  d++;
+     }
+}
+
+static void
+_op_blend_pan_can_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_P2R(c, mm2, mm0)
+   MOV_A2R(ALPHA_255, mm5)
+   while (d < e) {
+       MOV_P2R(*s, mm1, mm0)
+       MUL4_SYM_R2R(mm2, mm1, mm5)
+       MOV_R2P(mm1, *d, mm0)
+       s++;  d++;
+     }
+}
+
+static void
+_op_blend_pan_caa_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   c = 1 + (c & 0xff);
+   MOV_A2R(c, mm2)
+   MOV_A2R(ALPHA_255, mm5)
+   pxor_r2r(mm0, mm0);
+   while (d < e) {
+       MOV_P2R(*s, mm3, mm0)
+       MOV_P2R(*d, mm1, mm0)
+       INTERP_256_R2R(mm2, mm3, mm1, mm5)
+       MOV_R2P(mm1, *d, mm0)
+       s++;  d++;
+     }
+}
+
+#define _op_blend_pas_c_dp_mmx _op_blend_p_c_dp_mmx
+#define _op_blend_pan_c_dp_mmx _op_blend_p_c_dp_mmx
+#define _op_blend_p_can_dp_mmx _op_blend_p_c_dp_mmx
+#define _op_blend_pas_can_dp_mmx _op_blend_p_c_dp_mmx
+#define _op_blend_p_caa_dp_mmx _op_blend_p_c_dp_mmx
+#define _op_blend_pas_caa_dp_mmx _op_blend_p_c_dp_mmx
+
+#define _op_blend_p_c_dpan_mmx _op_blend_p_c_dp_mmx
+#define _op_blend_pas_c_dpan_mmx _op_blend_pas_c_dp_mmx
+#define _op_blend_pan_c_dpan_mmx _op_blend_pan_c_dp_mmx
+#define _op_blend_p_can_dpan_mmx _op_blend_p_can_dp_mmx
+#define _op_blend_pas_can_dpan_mmx _op_blend_pas_can_dp_mmx
+#define _op_blend_pan_can_dpan_mmx _op_blend_pan_can_dp_mmx
+#define _op_blend_p_caa_dpan_mmx _op_blend_p_caa_dp_mmx
+#define _op_blend_pas_caa_dpan_mmx _op_blend_pas_caa_dp_mmx
+#define _op_blend_pan_caa_dpan_mmx _op_blend_pan_caa_dp_mmx
+
+
+static void
+init_blend_pixel_color_span_funcs_mmx(void)
+{
+   op_blend_span_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_blend_p_c_dp_mmx;
+   op_blend_span_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_blend_pas_c_dp_mmx;
+   op_blend_span_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_blend_pan_c_dp_mmx;
+   op_blend_span_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_blend_p_can_dp_mmx;
+   op_blend_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_blend_pas_can_dp_mmx;
+   op_blend_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_blend_pan_can_dp_mmx;
+   op_blend_span_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_p_caa_dp_mmx;
+   op_blend_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_pas_caa_dp_mmx;
+   op_blend_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_pan_caa_dp_mmx;
+
+   op_blend_span_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_p_c_dpan_mmx;
+   op_blend_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_pas_c_dpan_mmx;
+   op_blend_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_pan_c_dpan_mmx;
+   op_blend_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_p_can_dpan_mmx;
+   op_blend_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_pas_can_dpan_mmx;
+   op_blend_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_pan_can_dpan_mmx;
+   op_blend_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_p_caa_dpan_mmx;
+   op_blend_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_pas_caa_dpan_mmx;
+   op_blend_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_pan_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_blend_pt_p_c_dp_mmx(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+       MOV_A2R(ALPHA_256, mm4)
+       MOV_A2R(ALPHA_255, mm5)
+       pxor_r2r(mm0, mm0);
+       MOV_P2R(c, mm2, mm0)
+       MOV_P2R(s, mm3, mm0)
+       MUL4_SYM_R2R(mm2, mm3, mm5)
+
+       MOV_RA2R(mm3, mm1)
+       psubw_r2r(mm1, mm4);
+
+       MOV_P2R(*d, mm1, mm0)
+       MUL4_256_R2R(mm4, mm1)
+
+       paddw_r2r(mm3, mm1);
+       MOV_R2P(mm1, *d, mm0)
+}
+
+#define _op_blend_pt_pas_c_dp_mmx _op_blend_pt_p_c_dp_mmx
+#define _op_blend_pt_pan_c_dp_mmx _op_blend_pt_p_c_dp_mmx
+#define _op_blend_pt_p_can_dp_mmx _op_blend_pt_p_c_dp_mmx
+#define _op_blend_pt_pas_can_dp_mmx _op_blend_pt_p_c_dp_mmx
+#define _op_blend_pt_pan_can_dp_mmx _op_blend_pt_p_c_dp_mmx
+#define _op_blend_pt_p_caa_dp_mmx _op_blend_pt_p_c_dp_mmx
+#define _op_blend_pt_pas_caa_dp_mmx _op_blend_pt_p_c_dp_mmx
+#define _op_blend_pt_pan_caa_dp_mmx _op_blend_pt_p_c_dp_mmx
+
+#define _op_blend_pt_p_c_dpan_mmx _op_blend_pt_p_c_dp_mmx
+#define _op_blend_pt_pas_c_dpan_mmx _op_blend_pt_p_c_dp_mmx
+#define _op_blend_pt_pan_c_dpan_mmx _op_blend_pt_p_c_dp_mmx
+#define _op_blend_pt_p_can_dpan_mmx _op_blend_pt_p_c_dp_mmx
+#define _op_blend_pt_pas_can_dpan_mmx _op_blend_pt_p_c_dp_mmx
+#define _op_blend_pt_pan_can_dpan_mmx _op_blend_pt_p_c_dp_mmx
+#define _op_blend_pt_p_caa_dpan_mmx _op_blend_pt_p_c_dp_mmx
+#define _op_blend_pt_pas_caa_dpan_mmx _op_blend_pt_p_c_dp_mmx
+#define _op_blend_pt_pan_caa_dpan_mmx _op_blend_pt_p_c_dp_mmx
+
+static void
+init_blend_pixel_color_pt_funcs_mmx(void)
+{
+   op_blend_pt_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_blend_pt_p_c_dp_mmx;
+   op_blend_pt_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_blend_pt_pas_c_dp_mmx;
+   op_blend_pt_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_blend_pt_pan_c_dp_mmx;
+   op_blend_pt_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_blend_pt_p_can_dp_mmx;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_blend_pt_pas_can_dp_mmx;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_blend_pt_pan_can_dp_mmx;
+   op_blend_pt_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_pt_p_caa_dp_mmx;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_pt_pas_caa_dp_mmx;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_pt_pan_caa_dp_mmx;
+
+   op_blend_pt_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_pt_p_c_dpan_mmx;
+   op_blend_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_pt_pas_c_dpan_mmx;
+   op_blend_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_pt_pan_c_dpan_mmx;
+   op_blend_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_pt_p_can_dpan_mmx;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_pt_pas_can_dpan_mmx;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_pt_pan_can_dpan_mmx;
+   op_blend_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_pt_p_caa_dpan_mmx;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_pt_pas_caa_dpan_mmx;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_pt_pan_caa_dpan_mmx;
+}
+#endif
+
+/*-----*/
+
+/* blend_rel pixel x color -> dst */
+
+#ifdef BUILD_MMX
+
+#define _op_blend_rel_p_c_dpan_mmx _op_blend_p_c_dpan_mmx
+#define _op_blend_rel_pas_c_dpan_mmx _op_blend_pas_c_dpan_mmx
+#define _op_blend_rel_pan_c_dpan_mmx _op_blend_pan_c_dpan_mmx
+#define _op_blend_rel_p_can_dpan_mmx _op_blend_p_can_dpan_mmx
+#define _op_blend_rel_pas_can_dpan_mmx _op_blend_pas_can_dpan_mmx
+#define _op_blend_rel_pan_can_dpan_mmx _op_blend_pan_can_dpan_mmx
+#define _op_blend_rel_p_caa_dpan_mmx _op_blend_p_caa_dpan_mmx
+#define _op_blend_rel_pas_caa_dpan_mmx _op_blend_pas_caa_dpan_mmx
+#define _op_blend_rel_pan_caa_dpan_mmx _op_blend_pan_caa_dpan_mmx
+
+static void
+init_blend_rel_pixel_color_span_funcs_mmx(void)
+{
+   op_blend_rel_span_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_p_c_dpan_mmx;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_pas_c_dpan_mmx;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_pan_c_dpan_mmx;
+   op_blend_rel_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_p_can_dpan_mmx;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_pas_can_dpan_mmx;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_pan_can_dpan_mmx;
+   op_blend_rel_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_p_caa_dpan_mmx;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_pas_caa_dpan_mmx;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_pan_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+
+#define _op_blend_rel_pt_p_c_dpan_mmx _op_blend_pt_p_c_dpan_mmx
+#define _op_blend_rel_pt_pas_c_dpan_mmx _op_blend_pt_pas_c_dpan_mmx
+#define _op_blend_rel_pt_pan_c_dpan_mmx _op_blend_pt_pan_c_dpan_mmx
+#define _op_blend_rel_pt_p_can_dpan_mmx _op_blend_pt_p_can_dpan_mmx
+#define _op_blend_rel_pt_pas_can_dpan_mmx _op_blend_pt_pas_can_dpan_mmx
+#define _op_blend_rel_pt_pan_can_dpan_mmx _op_blend_pt_pan_can_dpan_mmx
+#define _op_blend_rel_pt_p_caa_dpan_mmx _op_blend_pt_p_caa_dpan_mmx
+#define _op_blend_rel_pt_pas_caa_dpan_mmx _op_blend_pt_pas_caa_dpan_mmx
+#define _op_blend_rel_pt_pan_caa_dpan_mmx _op_blend_pt_pan_caa_dpan_mmx
+
+static void
+init_blend_rel_pixel_color_pt_funcs_mmx(void)
+{
+   op_blend_rel_pt_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_pt_p_c_dpan_mmx;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_pt_pas_c_dpan_mmx;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_pt_pan_c_dpan_mmx;
+   op_blend_rel_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_pt_p_can_dpan_mmx;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_pt_pas_can_dpan_mmx;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_pt_pan_can_dpan_mmx;
+   op_blend_rel_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_pt_p_caa_dpan_mmx;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_pt_pas_caa_dpan_mmx;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_pt_pan_caa_dpan_mmx;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_neon.c b/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_neon.c
new file mode 100644 (file)
index 0000000..6442d5e
--- /dev/null
@@ -0,0 +1,555 @@
+
+/* blend pixel x color --> dst */
+#ifdef BUILD_NEON
+/* Note: Optimisation is based on keeping _dest_ aligned: else it's a pair of
+ * reads, then two writes, a miss on read is 'just' two reads */
+static void
+_op_blend_p_c_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+#define AP     "blend_p_c_dp_"
+   asm volatile (
+               // Load 'c'
+               "vdup.u32       q7, %[c]                        \n\t"
+               "vmov.i8        q6, #1                          \n\t"
+
+               // Choose a loop
+               "andS           %[tmp], %[d], $0xf      \n\t"
+               "beq            "AP"quadstart           \n\t"
+
+               "andS           %[tmp],%[d], $0x4       \n\t"
+               "beq            "AP"dualloop            \n\t"
+
+       AP"singleloop:"
+               "vld1.32        d0[0],  [%[s]]!         \n\t"
+               "vld1.32        d2[0],  [%[d]]          \n\t"
+               //  Mulitply s * c (= sc)
+               "vmull.u8       q4,     d0,d14          \n\t"
+               // sc in d8
+               "vshrn.u16      d4,     q4, #8          \n\t"
+
+               // sca in d9
+               "vmvn.u32       d6,     d4              \n\t"
+               "vshr.u32       d6,     d6, #24         \n\t"
+
+               "vmul.u32       d6,     d12, d6         \n\t"
+
+               /* d * alpha */
+               "vmull.u8       q4,     d6, d2          \n\t"
+               "vshrn.u16      d0,     q4, #8          \n\t"
+
+               "vqadd.u8       d2,     d0, d4          \n\t"
+
+               // Save dsc + sc
+               "vst1.32        d2[0],  [%[d]]!         \n\t"
+
+               // Now where?
+               // Can we go the fast path?
+               "andS           %[tmp], %[d],$0xf       \n\t"
+               "beq            "AP"quadstart           \n\t"
+
+       AP"dualloop:                                    \n\t"
+               // Check we have enough to bother with!
+               "sub            %[tmp], %[e], %[d]      \n\t"
+               "cmp            %[tmp], #16             \n\t"
+               "blt            "AP"loopout             \n\t"
+
+               //  load 's' -> q0, 'd' -> q1
+               "vldm           %[s]!,  {d0}            \n\t"
+               "vldm           %[d],   {d2}            \n\t"
+               //  Mulitply s * c (= sc)
+               "vmull.u8       q4,     d0,d14          \n\t"
+               // sc in d8
+               "vshrn.u16      d4,     q4, #8          \n\t"
+
+               // sca in d9
+               "vmvn.u32       d6,     d4              \n\t"
+               "vshr.u32       d6,     d6, #24         \n\t"
+
+               "vmul.u32       d6,     d12, d6         \n\t"
+
+               /* d * alpha */
+               "vmull.u8       q4,     d6, d2          \n\t"
+               "vshrn.u16      d0,     q4, #8          \n\t"
+
+               "vqadd.u8       d2,     d0, d4          \n\t"
+
+               // Save dsc + sc
+               "vst1.32        d2,     [%[d]]!         \n\t"
+
+       AP"quadstart:                                   \n\t"
+               "sub            %[tmp], %[e], %[d]      \n\t"
+               "cmp            %[tmp], #16             \n\t"
+               "blt            "AP"loopout             \n\t"
+
+               "sub            %[tmp], %[e], #15       \n\t"
+
+       AP"quadloop:\n\t"
+               //  load 's' -> q0, 'd' -> q1
+               "vldm   %[s]!, {d0,d1}          \n\t"
+               "vldm   %[d], {d2,d3}           \n\t"
+               //  Mulitply s * c (= sc)
+               "vmull.u8       q4,     d0,d14  \n\t"
+               "vmull.u8       q5,     d1,d14  \n\t"
+
+               // Get sc & sc alpha
+               "vshrn.u16      d4,     q4, #8          \n\t"
+               "vshrn.u16      d5,     q5, #8          \n\t"
+                       // sc is now in q2, 8bpp
+               // Shift out, then spread alpha for q2
+               "vmvn.u32       q3,     q2              \n\t"
+               "vshr.u32       q3,     q3, $0x18       \n\t"
+               "vmul.u32       q3,     q6,q3           \n\t"
+
+               //  Multiply 'd' by sc.alpha (dsca)
+               "vmull.u8       q4,     d6,d2           \n\t"
+               "vmull.u8       q5,     d7,d3           \n\t"
+
+               "vshrn.u16      d0,     q4, #8          \n\t"
+               "vshrn.u16      d1,     q5, #8          \n\t"
+
+               "vqadd.u8       q1,     q0, q2          \n\t"
+
+               // Save dsc + sc
+               "vstm           %[d]!,  {d2,d3}         \n\t"
+
+               "cmp            %[tmp], %[d]            \n\t"
+
+               "bhi            "AP"quadloop            \n\t"
+
+       /* Trailing stuff */
+       AP"loopout:                                     \n\t"
+
+               "cmp            %[d], %[e]              \n\t"
+                "beq           "AP"done\n\t"
+               "sub            %[tmp],%[e], %[d]       \n\t"
+               "cmp            %[tmp],$0x04            \n\t"
+               "beq            "AP"singleloop2         \n\t"
+
+               "sub            %[tmp], %[e], #7        \n\t"
+       /* Dual loop */
+       AP"dualloop2:                                   \n\t"
+               "vldm           %[s]!, {d0}             \n\t"
+               "vldm           %[d], {d2}              \n\t"
+               //  Mulitply s * c (= sc)
+               "vmull.u8       q4,     d0,d14          \n\t"
+               // sc in d8
+               "vshrn.u16      d4,     q4, #8          \n\t"
+
+               // sca in d9
+               // XXX: I can probably squash one of these 3
+               "vmvn.u32       d6,     d4              \n\t"
+               "vshr.u32       d6,     d6, #24         \n\t"
+               "vmul.u32       d6,     d6, d12         \n\t"
+
+               /* d * alpha */
+               "vmull.u8       q4,     d6, d2          \n\t"
+               "vshrn.u16      d0,     q4, #8          \n\t"
+
+               "vqadd.u8       d2,     d0, d4          \n\t"
+
+               // Save dsc + sc
+               "vstm           %[d]!,  {d2}            \n\t"
+
+               "cmp            %[tmp], %[d]            \n\t"
+               "bhi            "AP"dualloop2           \n\t"
+
+               "cmp            %[d], %[e]              \n\t"
+                "beq           "AP"done                \n\t"
+
+       AP"singleloop2:                                 \n\t"
+               "vld1.32        d0[0],  [%[s]]!         \n\t"
+               "vld1.32        d2[0],  [%[d]]          \n\t"
+               //  Mulitply s * c (= sc)
+               "vmull.u8       q4,     d0,d14          \n\t"
+               // sc in d8
+               "vshrn.u16      d4,     q4, #8          \n\t"
+
+               // sca in d6
+               "vmvn.u32       d6,     d4              \n\t"
+               "vshr.u32       d6,     d6, #24         \n\t"
+               "vmul.u32       d6,     d12,d6          \n\t"
+
+               /* d * alpha */
+               "vmull.u8       q4,     d6, d2          \n\t"
+               "vshrn.u16      d0,     q4, #8          \n\t"
+
+               "vqadd.u8       d2,     d0, d4          \n\t"
+
+               // Save dsc + sc
+               "vst1.32        d2[0],  [%[d]]!         \n\t"
+
+
+       AP"done:"
+               : // No output
+               //
+               : [s] "r" (s), [e] "r" (d + l), [d] "r" (d), [c] "r" (c),
+                       [tmp] "r" (12)
+               : "q0","q1","q2","q3","q4","q5","q6","q7","memory"
+       );
+#undef AP
+}
+
+static void
+_op_blend_pan_can_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d++ = 0xff000000 + MUL3_SYM(c, *s);
+                        s++;
+                     });
+}
+
+static void
+_op_blend_pan_caa_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+#define AP     "_op_blend_pan_caa_dp_"
+   DATA32 *e = d + l, *tmp = (void*)73;
+      asm volatile (
+               /* Set up 'c' */
+               "vdup.u8     d14, %[c]          \n\t"
+               "vmov.i8     d15, #1            \n\t"
+               "vaddl.u8   q15, d14, d15       \n\t"
+               "vshr.u8        q15,#1          \n\t"
+
+               // Pick a loop
+               "andS           %[tmp], %[d], $0xf      \n\t"
+               "beq            "AP"quadstart           \n\t"
+
+               "andS           %[tmp], %[d], $0x4      \n\t"
+               "beq            "AP"dualstart           \n\t"
+
+       AP"singleloop:                                  \n\t"
+               "vld1.32        d4[0],  [%[d]]          \n\t"
+               "vld1.32        d0[0],  [%[s]]!         \n\t"
+
+               // Long version of 'd'
+               "vmovl.u8       q8, d4                  \n\t"
+
+               // Long version of 's'
+               "vmovl.u8       q6, d0                  \n\t"
+
+               // d8 = s -d
+               "vsub.s16       d8, d12, d16            \n\t"
+
+               // Multiply
+               "vmul.s16       d8, d8, d30             \n\t"
+
+               // Shift down
+               "vshr.s16       d8, #7                  \n\t"
+
+               // Add 'd'
+               "vqadd.s16      d8, d8, d16             \n\t"
+
+               // Shrink to save
+               "vqmovun.s16    d0,  q4                 \n\t"
+               "vst1.32        d0[0], [%[d]]!          \n\t"
+
+               // Now where?
+               "andS           %[tmp], %[d], $0xf      \n\t"
+               "beq            "AP"quadstart           \n\t"
+
+       AP"dualstart:                                   \n\t"
+               // Check we have enough
+               "sub            %[tmp], %[e], %[d]      \n\t"
+               "cmp            %[tmp], #16             \n\t"
+               "blt            "AP"loopout             \n\t"
+
+       AP"dualloop:"
+               "vldm           %[d],   {d4}            \n\t"
+               "vldm           %[s]!,  {d0}            \n\t"
+
+               // Long version of d
+               "vmovl.u8       q8, d4          \n\t"
+
+               // Long version of s
+               "vmovl.u8       q6, d0          \n\t"
+
+               // q4/q5 = s-d
+               "vsub.s16       q4, q6, q8      \n\t"
+
+               // Multiply
+               "vmul.s16       q4,  q4,q15     \n\t"
+
+               // Shift down
+               "vshr.s16       q4, #7          \n\t"
+
+               // Add d
+               "vqadd.s16      q4, q4, q8      \n\t"
+
+               // Shrink to save
+               "vqmovun.s16    d0,  q4         \n\t"
+
+               "vstm           %[d]!,  {d0}    \n\t"
+       AP"quadstart:                                   \n\t"
+               "sub            %[tmp], %[e], %[d]      \n\t"
+               "cmp            %[tmp], #16             \n\t"
+               "blt            "AP"loopout             \n\t"
+
+               "sub            %[tmp], %[e], #15       \n\t"
+
+       AP"quadloop:                            \n\t"
+               //  load 's' -> q0, 'd' -> q2
+               "vldm   %[d],  {d4,d5}          \n\t"
+               "vldm   %[s]!, {d0,d1}          \n\t"
+
+               // Long version of d
+               "vmovl.u8       q8, d4          \n\t"
+               "vmovl.u8       q9, d5          \n\t"
+
+               // Long version of s
+               "vmovl.u8       q6, d0          \n\t"
+               "vmovl.u8       q7, d1          \n\t"
+
+               // q4/q5 = s-d
+               "vsub.s16       q4, q6, q8      \n\t"
+               "vsub.s16       q5, q7, q9      \n\t"
+
+               // Multiply
+               "vmul.s16       q4,  q4,q15     \n\t"
+               "vmul.s16       q5,  q5,q15     \n\t"
+
+               // Shift down
+               "vshr.s16       q4, #7          \n\t"
+               "vshr.s16       q5, #7          \n\t"
+
+               // Add d
+               "vqadd.s16      q4, q4, q8      \n\t"
+               "vqadd.s16      q5, q5, q9      \n\t"
+
+               // Shrink to save
+               "vqmovun.s16    d0,  q4         \n\t"
+               "vqmovun.s16    d1,  q5         \n\t"
+               "vstm           %[d]!,  {d0,d1} \n\t"
+               "cmp            %[tmp], %[d]            \n\t"
+
+               "bhi "AP"quadloop\n\t"
+
+
+               "b "AP"done\n\t"
+       AP"loopout:                                     \n\t"
+               "cmp            %[d], %[e]              \n\t"
+                "beq           "AP"done\n\t"
+               "sub            %[tmp],%[e], %[d]       \n\t"
+               "cmp            %[tmp],$0x04            \n\t"
+               "beq            "AP"singleloop2         \n\t"
+
+       AP"dualloop2:                                   \n\t"
+               "vldm           %[d],   {d4}            \n\t"
+               "vldm           %[s]!,  {d0}            \n\t"
+
+               // Long version of d
+               "vmovl.u8       q8, d4          \n\t"
+
+               // Long version of s
+               "vmovl.u8       q6, d0          \n\t"
+
+               // q4/q5 = s-d
+               "vsub.s16       q4, q6, q8      \n\t"
+
+               // Multiply
+               "vmul.s16       q4,  q4,q15     \n\t"
+
+               // Shift down
+               "vshr.s16       q4, #7          \n\t"
+
+               // Add d
+               "vqadd.s16      q4, q4, q8      \n\t"
+
+               // Shrink to save
+               "vqmovun.s16    d0,  q4         \n\t"
+
+               "vstm           %[d]!,  {d0}    \n\t"
+
+               "cmp            %[d], %[e]              \n\t"
+                "beq           "AP"done                \n\t"
+
+       AP"singleloop2:                                 \n\t"
+               "vld1.32        d4[0],  [%[d]]          \n\t"
+               "vld1.32        d0[0],  [%[s]]!         \n\t"
+
+               // Long version of 'd'
+               "vmovl.u8       q8, d4                  \n\t"
+
+               // Long version of 's'
+               "vmovl.u8       q6, d0                  \n\t"
+
+               // d8 = s -d
+               "vsub.s16       d8, d12, d16            \n\t"
+
+               // Multiply
+               "vmul.s16       d8, d8, d30             \n\t"
+
+               // Shift down
+               "vshr.s16       d8, #7                  \n\t"
+
+               // Add 'd'
+               "vqadd.s16      d8, d8, d16             \n\t"
+
+               // Shrink to save
+               "vqmovun.s16    d0,  q4                 \n\t"
+
+               "vst1.32        d0[0], [%[d]]           \n\t"
+
+
+       AP"done:                                        \n\t"
+
+       // No output
+       :
+       // Input
+       : [s] "r" (s), [d] "r" (d), [e] "r" (e), [c] "r" (c), [tmp] "r" (tmp)
+       // Clobbered
+       : "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "memory"
+      );
+#undef AP
+}
+
+#define _op_blend_pas_c_dp_neon _op_blend_p_c_dp_neon
+#define _op_blend_pan_c_dp_neon _op_blend_p_c_dp_neon
+#define _op_blend_p_can_dp_neon _op_blend_p_c_dp_neon
+#define _op_blend_pas_can_dp_neon _op_blend_p_c_dp_neon
+#define _op_blend_p_caa_dp_neon _op_blend_p_c_dp_neon
+#define _op_blend_pas_caa_dp_neon _op_blend_p_c_dp_neon
+
+#define _op_blend_p_c_dpan_neon _op_blend_p_c_dp_neon
+#define _op_blend_pas_c_dpan_neon _op_blend_pas_c_dp_neon
+#define _op_blend_pan_c_dpan_neon _op_blend_pan_c_dp_neon
+#define _op_blend_p_can_dpan_neon _op_blend_p_can_dp_neon
+#define _op_blend_pas_can_dpan_neon _op_blend_pas_can_dp_neon
+#define _op_blend_pan_can_dpan_neon _op_blend_pan_can_dp_neon
+#define _op_blend_p_caa_dpan_neon _op_blend_p_caa_dp_neon
+#define _op_blend_pas_caa_dpan_neon _op_blend_pas_caa_dp_neon
+#define _op_blend_pan_caa_dpan_neon _op_blend_pan_caa_dp_neon
+
+
+static void
+init_blend_pixel_color_span_funcs_neon(void)
+{
+   op_blend_span_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_blend_p_c_dp_neon;
+   op_blend_span_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_blend_pas_c_dp_neon;
+   op_blend_span_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_blend_pan_c_dp_neon;
+   op_blend_span_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_blend_p_can_dp_neon;
+   op_blend_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_blend_pas_can_dp_neon;
+   op_blend_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_blend_pan_can_dp_neon;
+   op_blend_span_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_p_caa_dp_neon;
+   op_blend_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_pas_caa_dp_neon;
+   op_blend_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_pan_caa_dp_neon;
+
+   op_blend_span_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_p_c_dpan_neon;
+   op_blend_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_pas_c_dpan_neon;
+   op_blend_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_pan_c_dpan_neon;
+   op_blend_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_p_can_dpan_neon;
+   op_blend_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_pas_can_dpan_neon;
+   op_blend_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_pan_can_dpan_neon;
+   op_blend_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_p_caa_dpan_neon;
+   op_blend_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_pas_caa_dpan_neon;
+   op_blend_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_pan_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_blend_pt_p_c_dp_neon(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   s = MUL4_SYM(c, s);
+   c = 256 - (s >> 24);
+   *d = s + MUL_256(c, *d);
+}
+
+#define _op_blend_pt_pas_c_dp_neon _op_blend_pt_p_c_dp_neon
+#define _op_blend_pt_pan_c_dp_neon _op_blend_pt_p_c_dp_neon
+#define _op_blend_pt_p_can_dp_neon _op_blend_pt_p_c_dp_neon
+#define _op_blend_pt_pas_can_dp_neon _op_blend_pt_p_c_dp_neon
+#define _op_blend_pt_pan_can_dp_neon _op_blend_pt_p_c_dp_neon
+#define _op_blend_pt_p_caa_dp_neon _op_blend_pt_p_c_dp_neon
+#define _op_blend_pt_pas_caa_dp_neon _op_blend_pt_p_c_dp_neon
+#define _op_blend_pt_pan_caa_dp_neon _op_blend_pt_p_c_dp_neon
+
+#define _op_blend_pt_p_c_dpan_neon _op_blend_pt_p_c_dp_neon
+#define _op_blend_pt_pas_c_dpan_neon _op_blend_pt_p_c_dp_neon
+#define _op_blend_pt_pan_c_dpan_neon _op_blend_pt_p_c_dp_neon
+#define _op_blend_pt_p_can_dpan_neon _op_blend_pt_p_c_dp_neon
+#define _op_blend_pt_pas_can_dpan_neon _op_blend_pt_p_c_dp_neon
+#define _op_blend_pt_pan_can_dpan_neon _op_blend_pt_p_c_dp_neon
+#define _op_blend_pt_p_caa_dpan_neon _op_blend_pt_p_c_dp_neon
+#define _op_blend_pt_pas_caa_dpan_neon _op_blend_pt_p_c_dp_neon
+#define _op_blend_pt_pan_caa_dpan_neon _op_blend_pt_p_c_dp_neon
+
+static void
+init_blend_pixel_color_pt_funcs_neon(void)
+{
+   op_blend_pt_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_blend_pt_p_c_dp_neon;
+   op_blend_pt_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_blend_pt_pas_c_dp_neon;
+   op_blend_pt_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_blend_pt_pan_c_dp_neon;
+   op_blend_pt_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_blend_pt_p_can_dp_neon;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_blend_pt_pas_can_dp_neon;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_blend_pt_pan_can_dp_neon;
+   op_blend_pt_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_pt_p_caa_dp_neon;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_pt_pas_caa_dp_neon;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_pt_pan_caa_dp_neon;
+
+   op_blend_pt_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_pt_p_c_dpan_neon;
+   op_blend_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_pt_pas_c_dpan_neon;
+   op_blend_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_pt_pan_c_dpan_neon;
+   op_blend_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_pt_p_can_dpan_neon;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_pt_pas_can_dpan_neon;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_pt_pan_can_dpan_neon;
+   op_blend_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_pt_p_caa_dpan_neon;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_pt_pas_caa_dpan_neon;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_pt_pan_caa_dpan_neon;
+}
+#endif
+
+/*-----*/
+
+/* blend_rel pixel x color -> dst */
+
+#ifdef BUILD_NEON
+
+#define _op_blend_rel_p_c_dpan_neon _op_blend_p_c_dpan_neon
+#define _op_blend_rel_pas_c_dpan_neon _op_blend_pas_c_dpan_neon
+#define _op_blend_rel_pan_c_dpan_neon _op_blend_pan_c_dpan_neon
+#define _op_blend_rel_p_can_dpan_neon _op_blend_p_can_dpan_neon
+#define _op_blend_rel_pas_can_dpan_neon _op_blend_pas_can_dpan_neon
+#define _op_blend_rel_pan_can_dpan_neon _op_blend_pan_can_dpan_neon
+#define _op_blend_rel_p_caa_dpan_neon _op_blend_p_caa_dpan_neon
+#define _op_blend_rel_pas_caa_dpan_neon _op_blend_pas_caa_dpan_neon
+#define _op_blend_rel_pan_caa_dpan_neon _op_blend_pan_caa_dpan_neon
+
+static void
+init_blend_rel_pixel_color_span_funcs_neon(void)
+{
+   op_blend_rel_span_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_p_c_dpan_neon;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_pas_c_dpan_neon;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_pan_c_dpan_neon;
+   op_blend_rel_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_p_can_dpan_neon;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_pas_can_dpan_neon;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_pan_can_dpan_neon;
+   op_blend_rel_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_p_caa_dpan_neon;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_pas_caa_dpan_neon;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_pan_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+
+#define _op_blend_rel_pt_p_c_dpan_neon _op_blend_pt_p_c_dpan_neon
+#define _op_blend_rel_pt_pas_c_dpan_neon _op_blend_pt_pas_c_dpan_neon
+#define _op_blend_rel_pt_pan_c_dpan_neon _op_blend_pt_pan_c_dpan_neon
+#define _op_blend_rel_pt_p_can_dpan_neon _op_blend_pt_p_can_dpan_neon
+#define _op_blend_rel_pt_pas_can_dpan_neon _op_blend_pt_pas_can_dpan_neon
+#define _op_blend_rel_pt_pan_can_dpan_neon _op_blend_pt_pan_can_dpan_neon
+#define _op_blend_rel_pt_p_caa_dpan_neon _op_blend_pt_p_caa_dpan_neon
+#define _op_blend_rel_pt_pas_caa_dpan_neon _op_blend_pt_pas_caa_dpan_neon
+#define _op_blend_rel_pt_pan_caa_dpan_neon _op_blend_pt_pan_caa_dpan_neon
+
+static void
+init_blend_rel_pixel_color_pt_funcs_neon(void)
+{
+   op_blend_rel_pt_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_pt_p_c_dpan_neon;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_pt_pas_c_dpan_neon;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_pt_pan_c_dpan_neon;
+   op_blend_rel_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_pt_p_can_dpan_neon;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_pt_pas_can_dpan_neon;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_pt_pan_can_dpan_neon;
+   op_blend_rel_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_pt_p_caa_dpan_neon;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_pt_pas_caa_dpan_neon;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_pt_pan_caa_dpan_neon;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c b/src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c
new file mode 100644 (file)
index 0000000..38d937d
--- /dev/null
@@ -0,0 +1,216 @@
+
+/* blend pixel --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_blend_p_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_256, mm6)
+   while (d < e)
+     {
+       MOV_P2R(*s, mm2, mm0)
+       MOV_RA2R(mm2, mm1)
+       movq_r2r(mm6, mm3);
+       psubw_r2r(mm1, mm3);
+
+       MOV_P2R(*d, mm1, mm0)
+       MUL4_256_R2R(mm3, mm1)
+
+       paddw_r2r(mm2, mm1);
+       MOV_R2P(mm1, *d, mm0)
+       s++;  d++;
+     }
+}
+
+static void
+_op_blend_pas_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_256, mm6)
+   while (d < e)
+     {
+       switch (*s & 0xff000000)
+         {
+           case 0:
+             break;
+           case 0xff000000:
+               *d = *s;
+             break;
+           default :
+               MOV_P2R(*s, mm2, mm0)
+               MOV_RA2R(mm2, mm1)
+               movq_r2r(mm6, mm3);
+               psubw_r2r(mm1, mm3);
+
+               MOV_P2R(*d, mm1, mm0)
+               MUL4_256_R2R(mm3, mm1)
+
+               paddw_r2r(mm2, mm1);
+               MOV_R2P(mm1, *d, mm0)
+             break;
+         }
+       s++;  d++;
+     }
+}
+
+#define _op_blend_pan_dp_mmx NULL
+
+#define _op_blend_p_dpan_mmx _op_blend_p_dp_mmx
+#define _op_blend_pas_dpan_mmx _op_blend_pas_dp_mmx
+#define _op_blend_pan_dpan_mmx _op_blend_pan_dp_mmx
+
+static void
+init_blend_pixel_span_funcs_mmx(void)
+{
+   op_blend_span_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_blend_p_dp_mmx;
+   op_blend_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_blend_pas_dp_mmx;
+   op_blend_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_blend_pan_dp_mmx;
+
+   op_blend_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_p_dpan_mmx;
+   op_blend_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_pas_dpan_mmx;
+   op_blend_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_pan_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_blend_pt_p_dp_mmx(DATA32 s, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d) {
+       pxor_r2r(mm0, mm0);
+       MOV_A2R(ALPHA_256, mm6)
+       MOV_P2R(s, mm2, mm0)
+       MOV_RA2R(mm2, mm1)
+       movq_r2r(mm6, mm3);
+       psubw_r2r(mm1, mm3);
+
+       MOV_P2R(*d, mm1, mm0)
+       MUL4_256_R2R(mm3, mm1)
+
+       paddw_r2r(mm2, mm1);
+       MOV_R2P(mm1, *d, mm0)
+}
+
+
+#define _op_blend_pt_pan_dp_mmx NULL
+#define _op_blend_pt_pas_dp_mmx _op_blend_pt_p_dp_mmx
+
+#define _op_blend_pt_p_dpan_mmx _op_blend_pt_p_dp_mmx
+#define _op_blend_pt_pan_dpan_mmx _op_blend_pt_pan_dp_mmx
+#define _op_blend_pt_pas_dpan_mmx _op_blend_pt_pas_dp_mmx
+
+static void
+init_blend_pixel_pt_funcs_mmx(void)
+{
+   op_blend_pt_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_blend_pt_p_dp_mmx;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_blend_pt_pas_dp_mmx;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_blend_pt_pan_dp_mmx;
+
+   op_blend_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_p_dpan_mmx;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_pas_dpan_mmx;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_pan_dpan_mmx;
+}
+#endif
+
+/*-----*/
+
+/* blend_rel pixel -> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_blend_rel_p_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_256, mm6)
+   MOV_A2R(ALPHA_255, mm5)
+   while (d < e)
+     {
+       MOV_P2R(*s, mm2, mm0)
+       MOV_RA2R(mm2, mm1)
+       movq_r2r(mm6, mm3);
+       psubw_r2r(mm1, mm3);
+
+       MOV_P2R(*d, mm1, mm0)
+       MOV_RA2R(mm1, mm4)
+       MUL4_256_R2R(mm3, mm1)
+
+       MUL4_SYM_R2R(mm4, mm2, mm5)
+       paddw_r2r(mm2, mm1);
+       MOV_R2P(mm1, *d, mm0)
+       s++;  d++;
+     }
+}
+
+static void
+_op_blend_rel_pan_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_256, mm6)
+   MOV_A2R(ALPHA_255, mm5)
+   while (d < e)
+     {
+       MOV_P2R(*s, mm2, mm0)
+       MOV_PA2R(*d, mm1)
+       MUL4_SYM_R2R(mm2, mm1, mm5)
+       MOV_R2P(mm1, *d, mm0)
+       s++;  d++;
+     }
+}
+
+#define _op_blend_rel_pas_dp_mmx _op_blend_rel_p_dp_mmx
+
+#define _op_blend_rel_p_dpan_mmx _op_blend_p_dpan_mmx
+#define _op_blend_rel_pan_dpan_mmx _op_blend_pan_dpan_mmx
+#define _op_blend_rel_pas_dpan_mmx _op_blend_pas_dpan_mmx
+
+static void
+init_blend_rel_pixel_span_funcs_mmx(void)
+{
+   op_blend_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_p_dp_mmx;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_pas_dp_mmx;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_pan_dp_mmx;
+
+   op_blend_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_p_dpan_mmx;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pas_dpan_mmx;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pan_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_blend_rel_pt_p_dp_mmx(DATA32 s, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d) {
+       pxor_r2r(mm0, mm0);
+       MOV_A2R(ALPHA_256, mm6)
+       MOV_A2R(ALPHA_255, mm5)
+
+       MOV_P2R(s, mm2, mm0)
+       MOV_RA2R(mm2, mm1)
+       psubw_r2r(mm1, mm6);
+
+       MOV_P2R(*d, mm1, mm0)
+       MOV_RA2R(mm1, mm4)
+       MUL4_256_R2R(mm6, mm1)
+
+       MUL4_SYM_R2R(mm4, mm2, mm5)
+       paddw_r2r(mm2, mm1);
+       MOV_R2P(mm1, *d, mm0)
+}
+
+#define _op_blend_rel_pt_pas_dp_mmx _op_blend_rel_pt_p_dp_mmx
+#define _op_blend_rel_pt_pan_dp_mmx _op_blend_rel_pt_p_dp_mmx
+
+#define _op_blend_rel_pt_p_dpan_mmx _op_blend_pt_p_dpan_mmx
+#define _op_blend_rel_pt_pas_dpan_mmx _op_blend_pt_pas_dpan_mmx
+#define _op_blend_rel_pt_pan_dpan_mmx _op_blend_pt_pan_dpan_mmx
+
+static void
+init_blend_rel_pixel_pt_funcs_mmx(void)
+{
+   op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_pt_p_dp_mmx;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_pt_pas_dp_mmx;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_pt_pan_dp_mmx;
+
+   op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_p_dpan_mmx;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_pas_dpan_mmx;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_pan_dpan_mmx;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_.c b/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_.c
new file mode 100644 (file)
index 0000000..8893462
--- /dev/null
@@ -0,0 +1,190 @@
+
+/* blend pixel x mask --> dst */
+
+#ifdef BUILD_C
+static void
+_op_blend_p_mas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        alpha = *m;
+                        switch(alpha)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             alpha = 256 - (*s >> 24);
+                             *d = *s + MUL_256(alpha, *d);
+                             break;
+                          default:
+                             c = MUL_SYM(alpha, *s);
+                             alpha = 256 - (c >> 24);
+                             *d = c + MUL_256(alpha, *d);
+                             break;
+                          }
+                        m++;  s++;  d++;
+                     });
+}
+
+static void
+_op_blend_pas_mas_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        alpha = (*s >> 24);
+                        switch(alpha)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             *d = *s;
+                             break;
+                          default:
+                             c = MUL_SYM(alpha, *s);
+                             alpha = 256 - (c >> 24);
+                             *d = c + MUL_256(alpha, *d);
+                             break;
+                          }
+                     });
+}
+
+static void
+_op_blend_pan_mas_dp(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        alpha = *m;
+                        switch(alpha)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             *d = *s;
+                             break;
+                          default:
+                             alpha++;
+                             *d = INTERP_256(alpha, *s, *d);
+                             break;
+                          }
+                        m++;  s++;  d++;
+                     });
+}
+
+
+#define _op_blend_p_mas_dpan _op_blend_p_mas_dp
+#define _op_blend_pas_mas_dpan _op_blend_pas_mas_dp
+#define _op_blend_pan_mas_dpan _op_blend_pan_mas_dp
+
+static void
+init_blend_pixel_mask_span_funcs_c(void)
+{
+   op_blend_span_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_blend_p_mas_dp;
+   op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_blend_pas_mas_dp;
+   op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_blend_pan_mas_dp;
+
+   op_blend_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_p_mas_dpan;
+   op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_pas_mas_dpan;
+   op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_pan_mas_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_blend_pt_p_mas_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   s = MUL_SYM(m, s);
+   c = 256 - (s >> 24);
+   *d = s + MUL_256(c, *d);
+}
+
+static void
+_op_blend_pt_pan_mas_dp(DATA32 s, DATA8 m, DATA32 c __UNUSED__, DATA32 *d) {
+   *d = INTERP_256(m + 1, s, *d);
+}
+
+#define _op_blend_pt_pas_mas_dp _op_blend_pt_p_mas_dp
+
+#define _op_blend_pt_p_mas_dpan _op_blend_pt_p_mas_dp
+#define _op_blend_pt_pas_mas_dpan _op_blend_pt_pas_mas_dp
+#define _op_blend_pt_pan_mas_dpan _op_blend_pt_pan_mas_dp
+
+static void
+init_blend_pixel_mask_pt_funcs_c(void)
+{
+   op_blend_pt_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_blend_pt_p_mas_dp;
+   op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_blend_pt_pas_mas_dp;
+   op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_blend_pt_pan_mas_dp;
+
+   op_blend_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_pt_p_mas_dpan;
+   op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_pt_pas_mas_dpan;
+   op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_pt_pan_mas_dpan;
+}
+#endif
+
+/*-----*/
+
+/* blend_rel pixel x mask -> dst */
+
+#ifdef BUILD_C
+static void
+_op_blend_rel_p_mas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   UNROLL8_PLD_WHILE(d, l, e,
+           {
+            c = MUL_SYM(*m, *s);
+            alpha = 256 - (c >> 24);
+            *d = MUL_SYM(*d >> 24, c) + MUL_256(alpha, *d);
+            d++; m++; s++;
+           });
+}
+
+#define _op_blend_rel_pas_mas_dp _op_blend_rel_p_mas_dp
+#define _op_blend_rel_pan_mas_dp _op_blend_rel_p_mas_dp
+
+#define _op_blend_rel_p_mas_dpan _op_blend_p_mas_dpan
+#define _op_blend_rel_pas_mas_dpan _op_blend_pas_mas_dpan
+#define _op_blend_rel_pan_mas_dpan _op_blend_pan_mas_dpan
+
+static void
+init_blend_rel_pixel_mask_span_funcs_c(void)
+{
+   op_blend_rel_span_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_p_mas_dp;
+   op_blend_rel_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_pas_mas_dp;
+   op_blend_rel_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_pan_mas_dp;
+
+   op_blend_rel_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_p_mas_dpan;
+   op_blend_rel_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_pas_mas_dpan;
+   op_blend_rel_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_pan_mas_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_blend_rel_pt_p_mas_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   s = MUL_SYM(m, s);
+   c = 256 - (s >> 24);
+   *d = MUL_SYM(*d >> 24, s) + MUL_256(c, *d);
+}
+
+#define _op_blend_rel_pt_pas_mas_dp _op_blend_rel_pt_p_mas_dp
+#define _op_blend_rel_pt_pan_mas_dp _op_blend_rel_pt_p_mas_dp
+
+#define _op_blend_rel_pt_p_mas_dpan _op_blend_pt_p_mas_dpan
+#define _op_blend_rel_pt_pas_mas_dpan _op_blend_pt_pas_mas_dpan
+#define _op_blend_rel_pt_pan_mas_dpan _op_blend_pt_pan_mas_dpan
+
+static void
+init_blend_rel_pixel_mask_pt_funcs_c(void)
+{
+   op_blend_rel_pt_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_pt_p_mas_dp;
+   op_blend_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_pt_pas_mas_dp;
+   op_blend_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_pt_pan_mas_dp;
+
+   op_blend_rel_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_pt_p_mas_dpan;
+   op_blend_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_pt_pas_mas_dpan;
+   op_blend_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_pt_pan_mas_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_i386.c b/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_i386.c
new file mode 100644 (file)
index 0000000..6538c70
--- /dev/null
@@ -0,0 +1,158 @@
+
+/* blend pixel x mask --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_blend_pas_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_256, mm6)
+   while (d < e) {
+       l = (*s >> 24);
+       switch(*m & l)
+         {
+           case 0:
+               break;
+           case 255:
+               *d = *s;
+               break;
+           default:
+               l = 1 + *m;
+               MOV_A2R(l, mm3)
+               MOV_P2R(*s, mm2, mm0)
+               MUL4_256_R2R(mm3, mm2)
+
+               MOV_RA2R(mm2, mm1)
+               movq_r2r(mm6, mm3);
+               psubw_r2r(mm1, mm3);
+
+               MOV_P2R(*d, mm1, mm0)
+               MUL4_256_R2R(mm3, mm1)
+
+               paddw_r2r(mm2, mm1);
+               MOV_R2P(mm1, *d, mm0)
+               break;
+         }
+       m++;  s++;  d++;
+     }
+}
+
+static void
+_op_blend_pan_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   MOV_A2R(ALPHA_255, mm5)
+   pxor_r2r(mm0, mm0);
+   while (d < e) {
+       l = *m;
+       switch(l)
+         {
+           case 0:
+               break;
+           case 255:
+               *d = *s;
+               break;
+           default:
+               l++;
+               MOV_A2R(l, mm3)
+               MOV_P2R(*s, mm2, mm0)
+               MOV_P2R(*d, mm1, mm0)
+               INTERP_256_R2R(mm3, mm2, mm1, mm5)
+               MOV_R2P(mm1, *d, mm0)
+               break;
+         }
+       m++;  s++;  d++;
+     }
+}
+
+#define _op_blend_p_mas_dp_mmx _op_blend_pas_mas_dp_mmx
+
+#define _op_blend_p_mas_dpan_mmx _op_blend_p_mas_dp_mmx
+#define _op_blend_pan_mas_dpan_mmx _op_blend_pan_mas_dp_mmx
+#define _op_blend_pas_mas_dpan_mmx _op_blend_pas_mas_dp_mmx
+
+static void
+init_blend_pixel_mask_span_funcs_mmx(void)
+{
+   op_blend_span_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_p_mas_dp_mmx;
+   op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pas_mas_dp_mmx;
+   op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pan_mas_dp_mmx;
+
+   op_blend_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_p_mas_dpan_mmx;
+   op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pas_mas_dpan_mmx;
+   op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pan_mas_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_blend_pt_p_mas_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+       c = m + 1;
+       MOV_A2R(c, mm3)
+       pxor_r2r(mm0, mm0);
+       MOV_A2R(ALPHA_256, mm6)
+       MOV_P2R(s, mm2, mm0)
+       MUL4_256_R2R(mm3, mm2)
+
+       MOV_RA2R(mm2, mm1)
+       psubw_r2r(mm1, mm6);
+
+       MOV_P2R(*d, mm1, mm0)
+       MUL4_256_R2R(mm6, mm1)
+
+       paddw_r2r(mm2, mm1);
+       MOV_R2P(mm1, *d, mm0)
+}
+
+#define _op_blend_pt_pan_mas_dp_mmx _op_blend_pt_p_mas_dp_mmx
+#define _op_blend_pt_pas_mas_dp_mmx _op_blend_pt_p_mas_dp_mmx
+
+#define _op_blend_pt_p_mas_dpan_mmx _op_blend_pt_p_mas_dp_mmx
+#define _op_blend_pt_pas_mas_dpan_mmx _op_blend_pt_pas_mas_dp_mmx
+#define _op_blend_pt_pan_mas_dpan_mmx _op_blend_pt_pan_mas_dp_mmx
+
+static void
+init_blend_pixel_mask_pt_funcs_mmx(void)
+{
+   op_blend_pt_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pt_p_mas_dp_mmx;
+   op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pt_pas_mas_dp_mmx;
+   op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pt_pan_mas_dp_mmx;
+
+   op_blend_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_p_mas_dpan_mmx;
+   op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_pas_mas_dpan_mmx;
+   op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_pan_mas_dpan_mmx;
+}
+#endif
+
+/*-----*/
+
+/* blend_rel pixel x mask -> dst */
+
+#ifdef BUILD_MMX
+
+#define _op_blend_rel_p_mas_dpan_mmx _op_blend_p_mas_dpan_mmx
+#define _op_blend_rel_pas_mas_dpan_mmx _op_blend_pas_mas_dpan_mmx
+#define _op_blend_rel_pan_mas_dpan_mmx _op_blend_pan_mas_dpan_mmx
+
+static void
+init_blend_rel_pixel_mask_span_funcs_mmx(void)
+{
+   op_blend_rel_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_p_mas_dpan_mmx;
+   op_blend_rel_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pas_mas_dpan_mmx;
+   op_blend_rel_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pan_mas_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+
+#define _op_blend_rel_pt_p_mas_dpan_mmx _op_blend_pt_p_mas_dpan_mmx
+#define _op_blend_rel_pt_pas_mas_dpan_mmx _op_blend_pt_pas_mas_dpan_mmx
+#define _op_blend_rel_pt_pan_mas_dpan_mmx _op_blend_pt_pan_mas_dpan_mmx
+
+static void
+init_blend_rel_pixel_mask_pt_funcs_mmx(void)
+{
+   op_blend_rel_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_p_mas_dpan_mmx;
+   op_blend_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_pas_mas_dpan_mmx;
+   op_blend_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_pan_mas_dpan_mmx;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_neon.c b/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_neon.c
new file mode 100644 (file)
index 0000000..7f3334a
--- /dev/null
@@ -0,0 +1,130 @@
+
+/* blend pixel x mask --> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_blend_pas_mas_dp_neon(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        alpha = (*s >> 24);
+                        switch(alpha)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             *d = *s;
+                             break;
+                          default:
+                             c = MUL_SYM(alpha, *s);
+                             alpha = 256 - (c >> 24);
+                             *d = c + MUL_256(alpha, *d);
+                             break;
+                          }
+                     });
+}
+
+static void
+_op_blend_pan_mas_dp_neon(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e;
+   int alpha;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        alpha = *m;
+                        switch(alpha)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             *d = *s;
+                             break;
+                          default:
+                             alpha++;
+                             *d = INTERP_256(alpha, *s, *d);
+                             break;
+                          }
+                        m++;  s++;  d++;
+                     });
+}
+
+#define _op_blend_p_mas_dp_neon _op_blend_pas_mas_dp_neon
+
+#define _op_blend_p_mas_dpan_neon _op_blend_p_mas_dp_neon
+#define _op_blend_pan_mas_dpan_neon _op_blend_pan_mas_dp_neon
+#define _op_blend_pas_mas_dpan_neon _op_blend_pas_mas_dp_neon
+
+static void
+init_blend_pixel_mask_span_funcs_neon(void)
+{
+   op_blend_span_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_p_mas_dp_neon;
+   op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_pas_mas_dp_neon;
+   op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_pan_mas_dp_neon;
+
+   op_blend_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_p_mas_dpan_neon;
+   op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_pas_mas_dpan_neon;
+   op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_pan_mas_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_blend_pt_p_mas_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   s = MUL_SYM(m, s);
+   c = 256 - (s >> 24);
+   *d = s + MUL_256(c, *d);
+}
+
+#define _op_blend_pt_pan_mas_dp_neon _op_blend_pt_p_mas_dp_neon
+#define _op_blend_pt_pas_mas_dp_neon _op_blend_pt_p_mas_dp_neon
+
+#define _op_blend_pt_p_mas_dpan_neon _op_blend_pt_p_mas_dp_neon
+#define _op_blend_pt_pas_mas_dpan_neon _op_blend_pt_pas_mas_dp_neon
+#define _op_blend_pt_pan_mas_dpan_neon _op_blend_pt_pan_mas_dp_neon
+
+static void
+init_blend_pixel_mask_pt_funcs_neon(void)
+{
+   op_blend_pt_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_pt_p_mas_dp_neon;
+   op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_pt_pas_mas_dp_neon;
+   op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_pt_pan_mas_dp_neon;
+
+   op_blend_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_p_mas_dpan_neon;
+   op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_pas_mas_dpan_neon;
+   op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_pan_mas_dpan_neon;
+}
+#endif
+
+/*-----*/
+
+/* blend_rel pixel x mask -> dst */
+
+#ifdef BUILD_NEON
+
+#define _op_blend_rel_p_mas_dpan_neon _op_blend_p_mas_dpan_neon
+#define _op_blend_rel_pas_mas_dpan_neon _op_blend_pas_mas_dpan_neon
+#define _op_blend_rel_pan_mas_dpan_neon _op_blend_pan_mas_dpan_neon
+
+static void
+init_blend_rel_pixel_mask_span_funcs_neon(void)
+{
+   op_blend_rel_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_p_mas_dpan_neon;
+   op_blend_rel_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pas_mas_dpan_neon;
+   op_blend_rel_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pan_mas_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+
+#define _op_blend_rel_pt_p_mas_dpan_neon _op_blend_pt_p_mas_dpan_neon
+#define _op_blend_rel_pt_pas_mas_dpan_neon _op_blend_pt_pas_mas_dpan_neon
+#define _op_blend_rel_pt_pan_mas_dpan_neon _op_blend_pt_pan_mas_dpan_neon
+
+static void
+init_blend_rel_pixel_mask_pt_funcs_neon(void)
+{
+   op_blend_rel_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_p_mas_dpan_neon;
+   op_blend_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_pas_mas_dpan_neon;
+   op_blend_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_pan_mas_dpan_neon;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_blend/op_blend_pixel_neon.c b/src/lib/engines/common/evas_op_blend/op_blend_pixel_neon.c
new file mode 100644 (file)
index 0000000..1bdfa6a
--- /dev/null
@@ -0,0 +1,532 @@
+
+/* blend pixel --> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_blend_p_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+#define AP "blend_p_dp_"
+  asm volatile (
+       //** init
+       "vmov.i8        q8,     $0x1            \n\t"
+
+       AP "loopchoose:                                 \n\t"
+               // If aligned already - straight to octs
+               "andS           %[tmp], %[d],$0x1f              \n\t"
+               "beq            "AP"octloops                    \n\t"
+
+               "andS           %[tmp], %[d],$0xf               \n\t"
+               "beq            "AP"quadloops                   \n\t"
+
+               "andS           %[tmp], %[d],$0x4               \n\t"
+               "beq            "AP"dualloop                    \n\t"
+
+       // Only ever executes once, fall through to dual
+       AP "singleloop:                                 \n\t"
+               "vld1.32        d0[0],  [%[s]]!         \n\t"
+               "vld1.32        d4[0],  [%[d]]          \n\t"
+
+               "vmvn.u8        d8,     d0              \n\t"
+               "vshr.u32       d8,     d8, #24         \n\t"
+
+               "vmul.u32       d8,     d16, d8         \n\t"
+
+               "vmull.u8       q6,     d4,d8           \n\t"
+               "vshrn.u16      d8,     q6, #8          \n\t"
+               // Add to 's'
+               "vqadd.u8       q2,     q4,q0           \n\t"
+
+               "vst1.32        d4[0],  [%[d]]          \n\t"
+               "add            %[d],   #4              \n\t"
+
+               // Can we go the fast path?
+               "andS           %[tmp], %[d],$0x1f      \n\t"
+               "beq            "AP"octloops            \n\t"
+
+               "andS           %[tmp], %[d],$0x0f      \n\t"
+               "beq            "AP"quadloops           \n\t"
+
+
+       AP "dualloop:                                   \n\t"
+               "sub            %[tmp], %[e], %[d]      \n\t"
+               "cmp            %[tmp], #32             \n\t"
+               "blt            "AP"loopout             \n\t"
+
+       AP "dualloopint:                                \n\t"
+               //** Dual Loop
+               "vldm           %[s]!, {d0}             \n\t"
+               "vldr           d4,     [%[d]]          \n\t"
+
+               "vmvn.u8        d8,     d0              \n\t"
+               "vshr.u32       d8,     d8, #24         \n\t"
+
+               "vmul.u32       d8,     d16, d8         \n\t"
+
+               "vmull.u8       q6,     d4,d8           \n\t"
+               "vshrn.u16      d8,     q6, #8          \n\t"
+               // Add to 's'
+               "vqadd.u8       d4,     d8,d0           \n\t"
+               "vstr           d4,     [%[d]]          \n\t"
+               "add            %[d],   #8              \n\t"
+
+               "ands           %[tmp], %[d], $0x1f     \n\t"
+               "beq            "AP"octloops            \n\t"
+
+       AP"quadloops:                                   \n\t"
+               "sub            %[tmp], %[e], %[d]      \n\t"
+               "cmp            %[tmp], #32             \n\t"
+               "blt            "AP"loopout             \n\t"
+
+               "vldm           %[s]!,  {d0,d1)         \n\t"
+               "vldm           %[d],   {d4,d5}         \n\t"
+
+
+               // Copy s.a into q2 (>> 24) & subtract from 255
+               "vmvn.u8        q4,     q0              \n\t"
+               "vshr.u32       q4,     q4,$0x18        \n\t"
+
+               // Multiply into all fields
+               "vmul.u32       q4,     q8,q4           \n\t"
+
+               // a * d  (clobbering 'd'/q7)
+               "vmull.u8       q6,     d4,d8           \n\t"
+               "vmull.u8       q2,     d5,d9           \n\t"
+
+               // Shift & narrow it
+               "vshrn.u16      d8,     q6, #8          \n\t"
+               "vshrn.u16      d9,     q2, #8          \n\t"
+
+               // Add to s
+               "vqadd.u8       q2,     q4,q0           \n\t"
+
+               // Write it
+               "vstm           %[d]!,  {d4,d5}         \n\t"
+
+       AP "octloops:                                   \n\t"
+               "sub            %[tmp], %[e], %[d]      \n\t"
+               "cmp            %[tmp], #32             \n\t"
+               "ble            "AP"loopout             \n\t"
+
+               "sub            %[tmp],%[e],#64 \n\t"
+
+
+       AP "octloopint:\n\t"
+               //** Oct loop
+               "vldm   %[s]!,  {d0,d1,d2,d3)           \n\t"
+               "vldm   %[d],   {d4,d5,d6,d7}           \n\t"
+
+
+               // Copy s.a into q2 (>> 24) & subtract from 255
+               "vmvn.u8        q4,     q0              \n\t"
+                       "vmvn.u8        q5,     q1      \n\t"
+               "vshr.u32       q4,     q4,$0x18        \n\t"
+                       "vshr.u32       q5,     q5,$0x18\n\t"
+
+               // Multiply into all fields
+               "vmul.u32       q4,     q8,q4           \n\t"
+                       "vmul.u32       q5,     q8,q5   \n\t"
+
+
+               // a * d  (clobbering 'd'/q7)
+               "vmull.u8       q6,     d4,d8           \n\t"
+               "vmull.u8       q2,     d5,d9           \n\t"
+                       "vmull.u8       q7,     d6,d10  \n\t"
+                       "vmull.u8       q3,     d7,d11  \n\t"
+
+               "cmp     %[tmp], %[d]\n\t"
+
+               // Shift & narrow it
+               "vshrn.u16      d8,     q6, #8          \n\t"
+               "vshrn.u16      d9,     q2, #8          \n\t"
+                       "vshrn.u16      d10,    q7, #8  \n\t"
+                       "vshrn.u16      d11,    q3, #8  \n\t"
+
+
+               // Add to s
+               "vqadd.u8       q2,     q4,q0           \n\t"
+                       "vqadd.u8       q3,     q5,q1   \n\t"
+
+               // Write it
+               "vstm           %[d]!,  {d4,d5,d6,d7}   \n\t"
+
+                "bhi    "AP"octloopint\n\t"
+
+       AP "loopout:                                    \n\t"
+//"sub %[tmp], %[d], #4\n\t"
+//"vmov.i16    d0, $0xff00 \n\t"
+//"vst1.32     d0[0],  [%[tmp]]                \n\t"
+
+               "cmp            %[d], %[e]\n\t"
+                "beq           "AP"done\n\t"
+               "sub            %[tmp],%[e], %[d]       \n\t"
+               "cmp            %[tmp],$0x04            \n\t"
+               "ble            "AP"singleloop2         \n\t"
+
+       AP "dualloop2:                                  \n\t"
+               "sub            %[tmp],%[e],$0x7        \n\t"
+       AP "dualloop2int:                               \n\t"
+               //** Trailing double
+       
+               "vldm           %[s]!,  {d0}            \n\t"
+               "vldm           %[d],   {d4}            \n\t"
+
+               "vmvn.u8        d8,     d0              \n\t"
+               "vshr.u32       d8,     d8, #24         \n\t"
+
+               "vmul.u32       d8,     d16, d8         \n\t"
+
+               "vmull.u8       q6,     d4,d8           \n\t"
+               "vshrn.u16      d8,     q6, #8          \n\t"
+               // Add to 's'
+               "vqadd.u8       d4,     d8,d0           \n\t"
+
+               "vstr.32        d4,     [%[d]]          \n\t"
+               "add            %[d],   #8              \n\t"
+
+               "cmp            %[tmp], %[d]            \n\t"
+               "bhi            "AP"dualloop2int                \n\t"
+
+               // Single ??
+               "cmp            %[e], %[d]              \n\t"
+               "beq            "AP"done                \n\t"
+
+       AP"singleloop2:                                 \n\t"
+               "vld1.32        d0[0],  [%[s]]          \n\t"
+               "vld1.32        d4[0],  [%[d]]          \n\t"
+
+               "vmvn.u8        d8,     d0              \n\t"
+               "vshr.u32       d8,     d8, #24         \n\t"
+
+               "vmul.u32       d8,     d8, d16         \n\t"
+
+               "vmull.u8       q6,     d8,d4           \n\t"
+               "vshrn.u16      d8,     q6, #8          \n\t"
+               // Add to 's'
+               "vqadd.u8       d0,     d0,d8           \n\t"
+               "vst1.32        d0[0],  [%[d]]          \n\t"
+
+               //** Trailing single
+
+       AP"done:\n\t"
+//"sub %[tmp], %[e], #4 \n\t"
+//"vmov.i32    d0, $0xffff0000 \n\t"
+//"vst1.32     d0[0],  [%[tmp]]                \n\t"
+
+
+         : // output regs
+         // Input
+          :  [e] "r" (d + l), [d] "r" (d), [s] "r" (s), [c] "r" (c),
+                       [tmp] "r" (7)
+          : "q0", "q1", "q2","q3", "q4","q5","q6", "q7","q8","memory" // clobbered
+   );
+#undef AP
+
+}
+
+static void
+_op_blend_pas_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+#define AP "blend_pas_dp_"
+   DATA32 *e = d + l,*tmp  = e + 32,*pl=(void*)912;
+      asm volatile (
+               "vmov.i8        q8,     #1                      \n\t"
+       AP"loopchoose:                                          \n\t"
+               // If aliged - go as fast we can
+               "andS   %[tmp], %[d],   #31             \n\t"
+               "beq    "AP"quadstart                           \n\t"
+
+               // See if we can at least do our double loop
+               "andS   %[tmp], %[d], $0x7                      \n\t"
+               "beq    "AP"dualstart                           \n\t"
+
+       // Ugly single word version
+       AP "singleloop:                                         \n\t"
+               "vld1.32        d0[0], [%[s]]!                  \n\t"
+               "vld1.32        d4[0], [%[d]]                   \n\t"
+
+               "vmvn.u8        d8,     d0                      \n\t"
+
+               "vshr.u32       d8,     d8,$0x18                \n\t"
+
+               // Mulitply into all fields
+               "vmul.u32       d8,     d8, d16                 \n\t"
+
+               // Multiply out
+               "vmull.u8       q6,     d8, d4                  \n\t"
+
+               "vshrn.u16      d8,     q6, #8                  \n\t"
+
+               // Add to s
+               "vqadd.u8       d0,     d0,d8                   \n\t"
+               "vst1.32        d0[0], [%[d]]!                  \n\t"
+
+       AP"dualstart:                                           \n\t"
+               "sub            %[tmp], %[e], %[d]              \n\t"
+               "cmp            %[tmp], #32                     \n\t"
+               "blt            "AP"loopout                     \n\t"
+
+               // If aligned - go as fast we can
+               "andS           %[tmp], %[d], #31               \n\t"
+               "beq            "AP"quadstart                   \n\t"
+
+
+       AP"dualloop:                                            \n\t"
+
+               "vldm   %[s]!,  {d0)                            \n\t"
+               "vldm   %[d],   {d4}                            \n\t"
+
+               // Subtract from 255 (ie negate) and extract alpha channel
+               "vmvn.u8        d8,     d0                      \n\t"
+               "vshr.u32       d8,     d8,$0x18                \n\t"
+
+               // Mulitply into all fields
+               "vmul.u32       d8,     d8, d16                 \n\t"
+
+               // Multiply out
+               "vmull.u8       q6,     d8, d4                  \n\t"
+
+               "vshrn.u16      d8,     q6, #8                  \n\t"
+
+               // Add to s
+               "vqadd.u8       d0,     d0,d8                   \n\t"
+               "vstm           %[d]!,  {d0}                    \n\t"
+
+               "andS           %[tmp], %[d], $0x1f             \n\t"
+               "bne            "AP"dualloop                    \n\t"
+
+
+        AP"quadstart:                                          \n\t"
+               "sub            %[tmp], %[e], %[d]              \n\t"
+               "cmp            %[tmp], #32                     \n\t"
+               "blt            "AP"loopout                     \n\t"
+
+               "sub            %[tmp], %[e],  #31              \n\t"
+
+        AP"quadloop:\n\t"
+               "vldm   %[s]!,  {d0,d1,d2,d3)                   \n\t"
+               "vldm   %[d],   {d4,d5,d6,d7}                   \n\t"
+
+               // Subtract from 255 (ie negate) and extract alpha channel
+               "vmvn.u8        q4,     q0                      \n\t"
+                       "vmvn.u8        q5,     q1              \n\t"
+               "vshr.u32       q4,     q4,$0x18                \n\t"
+                       "vshr.u32       q5,     q5,$0x18        \n\t"
+
+               // Prepare to preload
+               "add    %[pl], %[s], #32\n\t"
+
+               // Mulitply into all fields
+               "vmul.u32       q4,     q4, q8                  \n\t"
+                       "vmul.u32       q5,     q5, q8          \n\t"
+               "pld    [%[pl]]\n\t"
+
+               // Multiply out
+               "vmull.u8       q6,     d8, d4                  \n\t"
+                       "vmull.u8       q7,     d10, d6         \n\t"
+               "vmull.u8       q2,     d9, d5                  \n\t"
+                       "vmull.u8       q3,     d11, d7         \n\t"
+
+               "add    %[pl], %[d], #32\n\t"
+
+               "vshrn.u16      d8,     q6, #8                  \n\t"
+                       "vshrn.u16      d10,    q7, #8          \n\t"
+               "vshrn.u16      d9,     q2, #8                  \n\t"
+                       "vshrn.u16      d11,    q3, #8          \n\t"
+               "pld    [%[pl]]\n\t"
+
+               "cmp            %[tmp], %[pl]                   \n\t"
+               // Add to s
+               "vqadd.u8       q0,     q0,q4                   \n\t"
+                       "vqadd.u8       q1,     q1,q5           \n\t"
+
+               "vstm           %[d]!,  {d0,d1,d2,d3}           \n\t"
+
+               "bhi            "AP"quadloop                    \n\t"
+
+       AP "loopout:                                            \n\t"
+               "cmp            %[d], %[e]                      \n\t"
+                "beq           "AP"done                        \n\t"
+
+               "sub            %[tmp],%[e], %[d]               \n\t"
+               "cmp            %[tmp],$0x04                    \n\t"
+               "beq            "AP"singleloop2                 \n\t"
+
+               "sub            %[tmp],%[e],$0x7        \n\t"
+
+       AP"dualloop2:                                           \n\t"
+               "vldm   %[s]!,  {d0)                            \n\t"
+               "vldm   %[d],   {d4}                            \n\t"
+
+               // Subtract from 255 (ie negate) and extract alpha channel
+               "vmvn.u8        d8,     d0                      \n\t"
+               "vshr.u32       d8,     d8,$0x18                \n\t"
+
+               // Mulitply into all fields
+               "vmul.u32       d8,     d8, d16                 \n\t"
+
+               // Multiply out
+               "vmull.u8       q6,     d8, d4                  \n\t"
+
+               "vshrn.u16      d8,     q6, #8                  \n\t"
+
+               // Add to s
+               "vqadd.u8       d0,     d0,d8                   \n\t"
+
+               "vstm           %[d]!,  {d0}                    \n\t"
+               "cmp            %[tmp], %[d]                    \n\t"
+
+               "bhi            "AP"dualloop2                   \n\t"
+
+               // Single ??
+               "cmp            %[e], %[d]              \n\t"
+               "beq            "AP"done                \n\t"
+
+       AP "singleloop2:                                        \n\t"
+               "vld1.32        d0[0], [%[s]]                   \n\t"
+               "vld1.32        d4[0], [%[d]]                   \n\t"
+
+               "vmvn.u8        d8,     d0                      \n\t"
+
+               "vshr.u32       d8,     d8,$0x18                \n\t"
+
+               // Mulitply into all fields
+               "vmul.u32       d8,     d8, d16                 \n\t"
+
+               // Multiply out
+               "vmull.u8       q6,     d8, d4                  \n\t"
+
+               "vshrn.u16      d8,     q6, #8                  \n\t"
+
+               // Add to s
+               "vqadd.u8       d0,     d0,d8                   \n\t"
+
+               "vst1.32        d0[0], [%[d]]                   \n\t"
+       AP "done:\n\t"
+
+
+         : /* Out */
+         : /* In */  [s] "r" (s), [e] "r" (e), [d] "r" (d), [tmp] "r" (tmp),
+               [pl] "r" (pl)
+         : /* Clobbered */
+                "q0","q1","q2","q3","q4","q5","q6","q7","q8","memory"
+      );
+#undef AP
+}
+
+#define _op_blend_pan_dp_neon NULL
+
+#define _op_blend_p_dpan_neon _op_blend_p_dp_neon
+#define _op_blend_pas_dpan_neon _op_blend_pas_dp_neon
+#define _op_blend_pan_dpan_neon _op_blend_pan_dp_neon
+
+static void
+init_blend_pixel_span_funcs_neon(void)
+{
+   op_blend_span_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_blend_p_dp_neon;
+   op_blend_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_blend_pas_dp_neon;
+   op_blend_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_blend_pan_dp_neon;
+
+   op_blend_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_p_dpan_neon;
+   op_blend_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_pas_dpan_neon;
+   op_blend_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_pan_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_blend_pt_p_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   c = 256 - (s >> 24);
+   *d = s + MUL_256(c, *d);
+}
+
+
+#define _op_blend_pt_pan_dp_neon NULL
+#define _op_blend_pt_pas_dp_neon _op_blend_pt_p_dp_neon
+
+#define _op_blend_pt_p_dpan_neon _op_blend_pt_p_dp_neon
+#define _op_blend_pt_pan_dpan_neon _op_blend_pt_pan_dp_neon
+#define _op_blend_pt_pas_dpan_neon _op_blend_pt_pas_dp_neon
+
+static void
+init_blend_pixel_pt_funcs_neon(void)
+{
+   op_blend_pt_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_blend_pt_p_dp_neon;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_blend_pt_pas_dp_neon;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_blend_pt_pan_dp_neon;
+
+   op_blend_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_p_dpan_neon;
+   op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_pas_dpan_neon;
+   op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_pan_dpan_neon;
+}
+#endif
+
+/*-----*/
+
+/* blend_rel pixel -> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_blend_rel_p_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   while (d < e) {
+      l = 256 - (*s >> 24);
+      c = 1 + (*d >> 24);
+      *d = MUL_256(c, *s) + MUL_256(l, *d);
+      d++;
+      s++;
+   }
+}
+
+static void
+_op_blend_rel_pan_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   while (d < e) {
+      c = 1 + (*d >> 24);
+      *d++ = MUL_256(c, *s);
+      s++;
+   }
+}
+
+#define _op_blend_rel_pas_dp_neon _op_blend_rel_p_dp_neon
+
+#define _op_blend_rel_p_dpan_neon _op_blend_p_dpan_neon
+#define _op_blend_rel_pan_dpan_neon _op_blend_pan_dpan_neon
+#define _op_blend_rel_pas_dpan_neon _op_blend_pas_dpan_neon
+
+static void
+init_blend_rel_pixel_span_funcs_neon(void)
+{
+   op_blend_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_p_dp_neon;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_pas_dp_neon;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_pan_dp_neon;
+
+   op_blend_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_p_dpan_neon;
+   op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pas_dpan_neon;
+   op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pan_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_blend_rel_pt_p_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   c = 256 - (s >> 24);
+   *d = MUL_SYM(*d >> 24, s) + MUL_256(c, *d);
+}
+
+#define _op_blend_rel_pt_pas_dp_neon _op_blend_rel_pt_p_dp_neon
+#define _op_blend_rel_pt_pan_dp_neon _op_blend_rel_pt_p_dp_neon
+
+#define _op_blend_rel_pt_p_dpan_neon _op_blend_pt_p_dpan_neon
+#define _op_blend_rel_pt_pas_dpan_neon _op_blend_pt_pas_dpan_neon
+#define _op_blend_rel_pt_pan_dpan_neon _op_blend_pt_pan_dpan_neon
+
+static void
+init_blend_rel_pixel_pt_funcs_neon(void)
+{
+   op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_pt_p_dp_neon;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_pt_pas_dp_neon;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_pt_pan_dp_neon;
+
+   op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_p_dpan_neon;
+   op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_pas_dpan_neon;
+   op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_pan_dpan_neon;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_blend_main_.c b/src/lib/engines/common/evas_op_blend_main_.c
new file mode 100644 (file)
index 0000000..7160751
--- /dev/null
@@ -0,0 +1,628 @@
+#include "evas_common.h"
+
+static RGBA_Gfx_Func     op_blend_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+static RGBA_Gfx_Pt_Func  op_blend_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+
+static void op_blend_init(void);
+static void op_blend_shutdown(void);
+
+static RGBA_Gfx_Func op_blend_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_blend_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_blend_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_blend_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_blend_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+
+static RGBA_Gfx_Pt_Func op_blend_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_blend_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_blend_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_blend_mask_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_blend_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+
+static RGBA_Gfx_Compositor  _composite_blend = { "blend",
+ op_blend_init, op_blend_shutdown,
+ op_blend_pixel_span_get, op_blend_color_span_get,
+ op_blend_pixel_color_span_get, op_blend_mask_color_span_get,
+ op_blend_pixel_mask_span_get,
+ op_blend_pixel_pt_get, op_blend_color_pt_get,
+ op_blend_pixel_color_pt_get, op_blend_mask_color_pt_get,
+ op_blend_pixel_mask_pt_get
+ };
+
+RGBA_Gfx_Compositor  *
+evas_common_gfx_compositor_blend_get(void)
+{
+   return &(_composite_blend);
+}
+
+
+static RGBA_Gfx_Func     op_blend_rel_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+static RGBA_Gfx_Pt_Func  op_blend_rel_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+
+static void op_blend_rel_init(void);
+static void op_blend_rel_shutdown(void);
+
+static RGBA_Gfx_Func op_blend_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_blend_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_blend_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_blend_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_blend_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+
+static RGBA_Gfx_Pt_Func op_blend_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_blend_rel_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_blend_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_blend_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_blend_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+
+static RGBA_Gfx_Compositor  _composite_blend_rel = { "blend_rel",
+ op_blend_rel_init, op_blend_rel_shutdown,
+ op_blend_rel_pixel_span_get, op_blend_rel_color_span_get,
+ op_blend_rel_pixel_color_span_get, op_blend_rel_mask_color_span_get,
+ op_blend_rel_pixel_mask_span_get,
+ op_blend_rel_pixel_pt_get, op_blend_rel_color_pt_get,
+ op_blend_rel_pixel_color_pt_get, op_blend_rel_mask_color_pt_get,
+ op_blend_rel_pixel_mask_pt_get
+ };
+
+RGBA_Gfx_Compositor  *
+evas_common_gfx_compositor_blend_rel_get(void)
+{
+   return &(_composite_blend_rel);
+}
+
+
+# include "./evas_op_blend/op_blend_pixel_.c"
+# include "./evas_op_blend/op_blend_color_.c"
+# include "./evas_op_blend/op_blend_pixel_color_.c"
+# include "./evas_op_blend/op_blend_pixel_mask_.c"
+# include "./evas_op_blend/op_blend_mask_color_.c"
+//# include "./evas_op_blend/op_blend_pixel_mask_color_.c"
+
+# include "./evas_op_blend/op_blend_pixel_i386.c"
+# include "./evas_op_blend/op_blend_color_i386.c"
+# include "./evas_op_blend/op_blend_pixel_color_i386.c"
+# include "./evas_op_blend/op_blend_pixel_mask_i386.c"
+# include "./evas_op_blend/op_blend_mask_color_i386.c"
+//# include "./evas_op_blend/op_blend_pixel_mask_color_i386.c"
+
+# include "./evas_op_blend/op_blend_pixel_neon.c"
+# include "./evas_op_blend/op_blend_color_neon.c"
+# include "./evas_op_blend/op_blend_pixel_color_neon.c"
+# include "./evas_op_blend/op_blend_pixel_mask_neon.c"
+# include "./evas_op_blend/op_blend_mask_color_neon.c"
+//# include "./evas_op_blend/op_blend_pixel_mask_color_neon.c"
+
+static void
+op_blend_init(void)
+{
+   memset(op_blend_span_funcs, 0, sizeof(op_blend_span_funcs));
+   memset(op_blend_pt_funcs, 0, sizeof(op_blend_pt_funcs));
+#ifdef BUILD_MMX
+   init_blend_pixel_span_funcs_mmx();
+   init_blend_pixel_color_span_funcs_mmx();
+   init_blend_pixel_mask_span_funcs_mmx();
+   init_blend_color_span_funcs_mmx();
+   init_blend_mask_color_span_funcs_mmx();
+
+   init_blend_pixel_pt_funcs_mmx();
+   init_blend_pixel_color_pt_funcs_mmx();
+   init_blend_pixel_mask_pt_funcs_mmx();
+   init_blend_color_pt_funcs_mmx();
+   init_blend_mask_color_pt_funcs_mmx();
+#endif
+#ifdef BUILD_NEON
+   init_blend_pixel_span_funcs_neon();
+   init_blend_pixel_color_span_funcs_neon();
+   init_blend_pixel_mask_span_funcs_neon();
+   init_blend_color_span_funcs_neon();
+   init_blend_mask_color_span_funcs_neon();
+
+   init_blend_pixel_pt_funcs_neon();
+   init_blend_pixel_color_pt_funcs_neon();
+   init_blend_pixel_mask_pt_funcs_neon();
+   init_blend_color_pt_funcs_neon();
+   init_blend_mask_color_pt_funcs_neon();
+#endif   
+#ifdef BUILD_C
+   init_blend_pixel_span_funcs_c();
+   init_blend_pixel_color_span_funcs_c();
+   init_blend_pixel_mask_span_funcs_c();
+   init_blend_color_span_funcs_c();
+   init_blend_mask_color_span_funcs_c();
+
+   init_blend_pixel_pt_funcs_c();
+   init_blend_pixel_color_pt_funcs_c();
+   init_blend_pixel_mask_pt_funcs_c();
+   init_blend_color_pt_funcs_c();
+   init_blend_mask_color_pt_funcs_c();
+#endif
+}
+
+static void
+op_blend_shutdown(void)
+{
+}
+
+static RGBA_Gfx_Func
+blend_gfx_span_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Func func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+     {
+       cpu = CPU_MMX;
+       func = op_blend_span_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_NEON
+   if (evas_common_cpu_has_feature(CPU_FEATURE_NEON))
+     {
+       cpu = CPU_NEON;
+       func = op_blend_span_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_blend_span_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Func
+op_blend_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+     {
+       s = SP;
+       if (src->cache_entry.flags.alpha_sparse)
+           s = SP_AS;
+     }
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_blend_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_blend_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+     {
+       s = SP;
+       if (src->cache_entry.flags.alpha_sparse)
+           s = SP_AS;
+     }
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_blend_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_blend_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+     {
+       s = SP;
+       if (src->cache_entry.flags.alpha_sparse)
+           s = SP_AS;
+     }
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_gfx_span_func_cpu(s, m, c, d);
+}
+
+
+static RGBA_Gfx_Pt_Func
+blend_gfx_pt_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Pt_Func func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+     {
+       cpu = CPU_MMX;
+       func = op_blend_pt_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_NEON
+   if (evas_common_cpu_has_feature(CPU_FEATURE_NEON))
+     {
+       cpu = CPU_NEON;
+       func = op_blend_pt_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_blend_pt_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Pt_Func
+op_blend_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_blend_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_blend_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_blend_mask_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_blend_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_gfx_pt_func_cpu(s, m, c, d);
+}
+
+
+static void
+op_blend_rel_init(void)
+{
+   memset(op_blend_rel_span_funcs, 0, sizeof(op_blend_rel_span_funcs));
+   memset(op_blend_rel_pt_funcs, 0, sizeof(op_blend_rel_pt_funcs));
+#ifdef BUILD_MMX
+   init_blend_rel_pixel_span_funcs_mmx();
+   init_blend_rel_pixel_color_span_funcs_mmx();
+   init_blend_rel_pixel_mask_span_funcs_mmx();
+   init_blend_rel_color_span_funcs_mmx();
+   init_blend_rel_mask_color_span_funcs_mmx();
+
+   init_blend_rel_pixel_pt_funcs_mmx();
+   init_blend_rel_pixel_color_pt_funcs_mmx();
+   init_blend_rel_pixel_mask_pt_funcs_mmx();
+   init_blend_rel_color_pt_funcs_mmx();
+   init_blend_rel_mask_color_pt_funcs_mmx();
+#endif
+#ifdef BUILD_NEON
+   init_blend_rel_pixel_span_funcs_neon();
+   init_blend_rel_pixel_color_span_funcs_neon();
+   init_blend_rel_pixel_mask_span_funcs_neon();
+   init_blend_rel_color_span_funcs_neon();
+   init_blend_rel_mask_color_span_funcs_neon();
+
+   init_blend_rel_pixel_pt_funcs_neon();
+   init_blend_rel_pixel_color_pt_funcs_neon();
+   init_blend_rel_pixel_mask_pt_funcs_neon();
+   init_blend_rel_color_pt_funcs_neon();
+   init_blend_rel_mask_color_pt_funcs_neon();
+#endif
+#ifdef BUILD_C
+   init_blend_rel_pixel_span_funcs_c();
+   init_blend_rel_pixel_color_span_funcs_c();
+   init_blend_rel_pixel_mask_span_funcs_c();
+   init_blend_rel_color_span_funcs_c();
+   init_blend_rel_mask_color_span_funcs_c();
+
+   init_blend_rel_pixel_pt_funcs_c();
+   init_blend_rel_pixel_color_pt_funcs_c();
+   init_blend_rel_pixel_mask_pt_funcs_c();
+   init_blend_rel_color_pt_funcs_c();
+   init_blend_rel_mask_color_pt_funcs_c();
+#endif
+}
+
+static void
+op_blend_rel_shutdown(void)
+{
+}
+
+static RGBA_Gfx_Func
+blend_rel_gfx_span_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Func func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+     {
+       cpu = CPU_MMX;
+       func = op_blend_rel_span_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_NEON
+   if (evas_common_cpu_has_feature(CPU_FEATURE_NEON))
+     {
+       cpu = CPU_NEON;
+       func = op_blend_rel_span_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_blend_rel_span_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Func
+op_blend_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+     {
+       s = SP;
+       if (src->cache_entry.flags.alpha_sparse)
+           s = SP_AS;
+     }
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_blend_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_blend_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_blend_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_blend_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+     {
+       s = SP;
+       if (src->cache_entry.flags.alpha_sparse)
+           s = SP_AS;
+     }
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+blend_rel_gfx_pt_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Pt_Func func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+     {
+       cpu = CPU_MMX;
+       func = op_blend_rel_pt_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_NEON
+   if (evas_common_cpu_has_feature(CPU_FEATURE_NEON))
+     {
+       cpu = CPU_NEON;
+       func = op_blend_rel_pt_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_blend_rel_pt_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Pt_Func
+op_blend_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_blend_rel_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_blend_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_blend_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_blend_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return blend_rel_gfx_pt_func_cpu(s, m, c, d);
+}
diff --git a/src/lib/engines/common/evas_op_copy/.cvsignore b/src/lib/engines/common/evas_op_copy/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/src/lib/engines/common/evas_op_copy/Makefile.am b/src/lib/engines/common/evas_op_copy/Makefile.am
new file mode 100644 (file)
index 0000000..599e98d
--- /dev/null
@@ -0,0 +1,18 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+EXTRA_DIST = \
+op_copy_color_.c \
+op_copy_color_i386.c \
+op_copy_color_neon.c \
+op_copy_mask_color_.c \
+op_copy_mask_color_i386.c \
+op_copy_mask_color_neon.c \
+op_copy_pixel_.c \
+op_copy_pixel_neon.c \
+op_copy_pixel_color_.c \
+op_copy_pixel_color_i386.c \
+op_copy_pixel_color_neon.c \
+op_copy_pixel_i386.c \
+op_copy_pixel_mask_.c \
+op_copy_pixel_mask_i386.c \
+op_copy_pixel_mask_neon.c
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_color_.c b/src/lib/engines/common/evas_op_copy/op_copy_color_.c
new file mode 100644 (file)
index 0000000..771232d
--- /dev/null
@@ -0,0 +1,139 @@
+
+/* copy color --> dst */
+
+#ifdef BUILD_C
+static void
+_op_copy_c_dp(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d = c;
+                        d++;
+                     });
+}
+
+#define _op_copy_cn_dp _op_copy_c_dp
+#define _op_copy_can_dp _op_copy_c_dp
+#define _op_copy_caa_dp _op_copy_c_dp
+
+#define _op_copy_c_dpan _op_copy_c_dp
+#define _op_copy_cn_dpan _op_copy_c_dp
+#define _op_copy_can_dpan _op_copy_c_dp
+#define _op_copy_caa_dpan _op_copy_c_dp
+
+static void
+init_copy_color_span_funcs_c(void)
+{
+   op_copy_span_funcs[SP_N][SM_N][SC_N][DP][CPU_C] = _op_copy_cn_dp;
+   op_copy_span_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_copy_c_dp;
+   op_copy_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_C] = _op_copy_can_dp;
+   op_copy_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_copy_caa_dp;
+
+   op_copy_span_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_cn_dpan;
+   op_copy_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_copy_c_dpan;
+   op_copy_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_can_dpan;
+   op_copy_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_copy_pt_c_dp(DATA32 s __UNUSED__, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   *d = c;
+}
+
+#define _op_copy_pt_cn_dp _op_copy_pt_c_dp
+#define _op_copy_pt_can_dp _op_copy_pt_c_dp
+#define _op_copy_pt_caa_dp _op_copy_pt_c_dp
+
+#define _op_copy_pt_c_dpan _op_copy_pt_c_dp
+#define _op_copy_pt_cn_dpan _op_copy_pt_c_dp
+#define _op_copy_pt_can_dpan _op_copy_pt_c_dp
+#define _op_copy_pt_caa_dpan _op_copy_pt_c_dp
+
+static void
+init_copy_color_pt_funcs_c(void)
+{
+   op_copy_pt_funcs[SP_N][SM_N][SC_N][DP][CPU_C] = _op_copy_pt_cn_dp;
+   op_copy_pt_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_copy_pt_c_dp;
+   op_copy_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_C] = _op_copy_pt_can_dp;
+   op_copy_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_copy_pt_caa_dp;
+
+   op_copy_pt_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_pt_cn_dpan;
+   op_copy_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_copy_pt_c_dpan;
+   op_copy_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_pt_can_dpan;
+   op_copy_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_pt_caa_dpan;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel color --> dst */
+
+#ifdef BUILD_C
+static void
+_op_copy_rel_c_dp(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d = MUL_SYM(*d >> 24, c);
+                        d++;
+                     });
+}
+
+
+#define _op_copy_rel_cn_dp _op_copy_rel_c_dp
+#define _op_copy_rel_can_dp _op_copy_rel_c_dp
+#define _op_copy_rel_caa_dp _op_copy_rel_c_dp
+
+#define _op_copy_rel_c_dpan _op_copy_c_dp
+#define _op_copy_rel_cn_dpan _op_copy_cn_dp
+#define _op_copy_rel_can_dpan _op_copy_can_dp
+#define _op_copy_rel_caa_dpan _op_copy_caa_dp
+
+static void
+init_copy_rel_color_span_funcs_c(void)
+{
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_cn_dp;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_copy_rel_c_dp;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_can_dp;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_caa_dp;
+
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_cn_dpan;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_c_dpan;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_can_dpan;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_copy_rel_pt_c_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   s = 1 + (*d >> 24);
+   *d = MUL_256(s, c);
+}
+
+
+#define _op_copy_rel_pt_cn_dp _op_copy_rel_pt_c_dp
+#define _op_copy_rel_pt_can_dp _op_copy_rel_pt_c_dp
+#define _op_copy_rel_pt_caa_dp _op_copy_rel_pt_c_dp
+
+#define _op_copy_rel_pt_c_dpan _op_copy_pt_c_dp
+#define _op_copy_rel_pt_cn_dpan _op_copy_pt_cn_dp
+#define _op_copy_rel_pt_can_dpan _op_copy_pt_can_dp
+#define _op_copy_rel_pt_caa_dpan _op_copy_pt_caa_dp
+
+static void
+init_copy_rel_color_pt_funcs_c(void)
+{
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_pt_cn_dp;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_copy_rel_pt_c_dp;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_pt_can_dp;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_pt_caa_dp;
+
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_cn_dpan;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_pt_c_dpan;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_pt_can_dpan;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_pt_caa_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_color_i386.c b/src/lib/engines/common/evas_op_copy/op_copy_color_i386.c
new file mode 100644 (file)
index 0000000..c7ebff9
--- /dev/null
@@ -0,0 +1,151 @@
+
+/* copy color --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_copy_c_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l - 1;
+   movd_m2r(c, mm1);
+   movq_r2r(mm1, mm2);
+   psllq_i2r(32, mm1);
+   por_r2r(mm2, mm1);
+   for (; d < e; d+=2) {
+      movq_r2m(mm1, d[0]);
+   }
+   e+=1;
+   for (; d < e; d++) {
+      *d = c;
+   }
+}
+
+#define _op_copy_cn_dp_mmx _op_copy_c_dp_mmx
+#define _op_copy_can_dp_mmx _op_copy_c_dp_mmx
+#define _op_copy_caa_dp_mmx _op_copy_c_dp_mmx
+
+#define _op_copy_cn_dpan_mmx _op_copy_c_dp_mmx
+#define _op_copy_c_dpan_mmx _op_copy_c_dp_mmx
+#define _op_copy_can_dpan_mmx _op_copy_c_dp_mmx
+#define _op_copy_caa_dpan_mmx _op_copy_c_dp_mmx
+
+static void
+init_copy_color_span_funcs_mmx(void)
+{
+   op_copy_span_funcs[SP_N][SM_N][SC_N][DP][CPU_MMX] = _op_copy_cn_dp_mmx;
+   op_copy_span_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_copy_c_dp_mmx;
+   op_copy_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_can_dp_mmx;
+   op_copy_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_caa_dp_mmx;
+
+   op_copy_span_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_cn_dpan_mmx;
+   op_copy_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_c_dpan_mmx;
+   op_copy_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_can_dpan_mmx;
+   op_copy_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_copy_pt_c_dp_mmx(DATA32 s __UNUSED__, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+     *d = c;
+}
+
+#define _op_copy_pt_cn_dp_mmx _op_copy_pt_c_dp_mmx
+#define _op_copy_pt_can_dp_mmx _op_copy_pt_c_dp_mmx
+#define _op_copy_pt_caa_dp_mmx _op_copy_pt_c_dp_mmx
+
+#define _op_copy_pt_cn_dpan_mmx _op_copy_pt_c_dp_mmx
+#define _op_copy_pt_c_dpan_mmx _op_copy_pt_c_dp_mmx
+#define _op_copy_pt_can_dpan_mmx _op_copy_pt_c_dp_mmx
+#define _op_copy_pt_caa_dpan_mmx _op_copy_pt_c_dp_mmx
+
+static void
+init_copy_color_pt_funcs_mmx(void)
+{
+   op_copy_pt_funcs[SP_N][SM_N][SC_N][DP][CPU_MMX] = _op_copy_pt_cn_dp_mmx;
+   op_copy_pt_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_copy_pt_c_dp_mmx;
+   op_copy_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_pt_can_dp_mmx;
+   op_copy_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_pt_caa_dp_mmx;
+
+   op_copy_pt_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_cn_dpan_mmx;
+   op_copy_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_pt_c_dpan_mmx;
+   op_copy_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_pt_can_dpan_mmx;
+   op_copy_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_pt_caa_dpan_mmx;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel color --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_copy_rel_c_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_P2R(c, mm2, mm0)
+   for (; d < e; d++) {
+       DATA32  da = 1 + (*d >> 24);
+       MOV_A2R(da, mm1)
+       MUL4_256_R2R(mm2, mm1)
+       MOV_R2P(mm1, *d, mm0)
+   }
+}
+
+#define _op_copy_rel_cn_dp_mmx _op_copy_rel_c_dp_mmx
+#define _op_copy_rel_can_dp_mmx _op_copy_rel_c_dp_mmx
+#define _op_copy_rel_caa_dp_mmx _op_copy_rel_c_dp_mmx
+
+#define _op_copy_rel_cn_dpan_mmx _op_copy_cn_dpan_mmx
+#define _op_copy_rel_c_dpan_mmx _op_copy_c_dpan_mmx
+#define _op_copy_rel_can_dpan_mmx _op_copy_can_dpan_mmx
+#define _op_copy_rel_caa_dpan_mmx _op_copy_caa_dpan_mmx
+
+static void
+init_copy_rel_color_span_funcs_mmx(void)
+{
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_cn_dp_mmx;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_c_dp_mmx;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_can_dp_mmx;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_caa_dp_mmx;
+
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_cn_dpan_mmx;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_c_dpan_mmx;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_can_dpan_mmx;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_copy_rel_pt_c_dp_mmx(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+       s = 1 + (*d >> 24);
+       pxor_r2r(mm0, mm0);
+       MOV_P2R(c, mm2, mm0)
+       MOV_A2R(s, mm1)
+       MUL4_256_R2R(mm2, mm1)
+       MOV_R2P(mm1, *d, mm0)
+}
+
+
+#define _op_copy_rel_pt_cn_dp_mmx _op_copy_rel_pt_c_dp_mmx
+#define _op_copy_rel_pt_can_dp_mmx _op_copy_rel_pt_c_dp_mmx
+#define _op_copy_rel_pt_caa_dp_mmx _op_copy_rel_pt_c_dp_mmx
+
+#define _op_copy_rel_pt_cn_dpan_mmx _op_copy_pt_cn_dpan_mmx
+#define _op_copy_rel_pt_c_dpan_mmx _op_copy_pt_c_dpan_mmx
+#define _op_copy_rel_pt_can_dpan_mmx _op_copy_pt_can_dpan_mmx
+#define _op_copy_rel_pt_caa_dpan_mmx _op_copy_pt_caa_dpan_mmx
+
+static void
+init_copy_rel_color_pt_funcs_mmx(void)
+{
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_cn_dp_mmx;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_pt_c_dp_mmx;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_pt_can_dp_mmx;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_pt_caa_dp_mmx;
+
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_cn_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_pt_c_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_pt_can_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_pt_caa_dpan_mmx;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_color_neon.c b/src/lib/engines/common/evas_op_copy/op_copy_color_neon.c
new file mode 100644 (file)
index 0000000..8ec17cc
--- /dev/null
@@ -0,0 +1,212 @@
+
+/* copy color --> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_c_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+#define AP "COPY_C_DP_"
+   uint32_t *e = d + l,*tmp;
+   asm volatile (
+
+               "vdup.i32       q0,     %[c]            \n\t"
+
+               // Can we do 32 byte?
+               "andS           %[tmp], %[d], $0x1f     \n\t"
+               "beq            "AP"quadstart           \n\t"
+
+               // Can we do at least 16 byte?
+               "andS           %[tmp], %[d], $0x4      \n\t"
+               "beq            "AP"dualstart           \n\t"
+
+       // Only once
+       AP"singleloop:                                  \n\t"
+               "vst1.32        d0[0],  [%[d]]          \n\t"
+               "add            %[d], #4                \n\t"
+
+       // Up to 3 times
+       AP"dualstart:                                   \n\t"
+               "sub            %[tmp], %[e], %[d]      \n\t"
+               "cmp            %[tmp], #32             \n\t"
+               "blt            "AP"loopout             \n\t"
+
+       AP"dualloop:                                    \n\t"
+               "vstr.32        d0, [%[d]]              \n\t"
+
+               "add            %[d], #8                \n\t"
+               "andS           %[tmp], %[d], $0x1f     \n\t"
+               "bne            "AP"dualloop            \n\t"
+
+
+       AP"quadstart:                                   \n\t"
+               "sub            %[tmp], %[e], %[d]      \n\t"
+               "cmp            %[tmp], #32             \n\t"
+               "blt            "AP"loopout             \n\t"
+
+               "vmov           q1, q0                  \n\t"
+               "sub            %[tmp],%[e],#31         \n\t"
+
+       AP "quadloop:                                   \n\t"
+               "vstm           %[d]!,  {d0,d1,d2,d3}   \n\t"
+
+               "cmp            %[tmp], %[d]            \n\t"
+                "bhi           "AP"quadloop            \n\t"
+
+
+       AP "loopout:                                    \n\t"
+               "cmp            %[d], %[e]              \n\t"
+                "beq           "AP"done                \n\t"
+               "sub            %[tmp],%[e], %[d]       \n\t"
+               "cmp            %[tmp],$0x04            \n\t"
+               "beq            "AP"singleloop2         \n\t"
+
+       AP "dualloop2:                                  \n\t"
+               "sub            %[tmp],%[e],#7          \n\t"
+       AP "dualloop2int:                               \n\t"
+               "vstr.64        d0, [%[d]]              \n\t"
+
+               "add            %[d], #8                \n\t"
+               "cmp            %[tmp], %[d]            \n\t"
+               "bhi            "AP"dualloop2int        \n\t"
+
+               // Single ??
+               "cmp            %[e], %[d]              \n\t"
+               "beq            "AP"done                \n\t"
+
+       AP "singleloop2:                                \n\t"
+               "vst1.32        d0[0], [%[d]]           \n\t"
+
+       AP "done:\n\t"
+
+               : // No output regs
+               // Input
+               : [c] "r" (c), [e] "r" (e), [d] "r" (d),[tmp] "r" (tmp)
+               // Clobbered
+               : "q0","q1","memory"
+
+
+   );
+}
+
+#define _op_copy_cn_dp_neon _op_copy_c_dp_neon
+#define _op_copy_can_dp_neon _op_copy_c_dp_neon
+#define _op_copy_caa_dp_neon _op_copy_c_dp_neon
+
+#define _op_copy_cn_dpan_neon _op_copy_c_dp_neon
+#define _op_copy_c_dpan_neon _op_copy_c_dp_neon
+#define _op_copy_can_dpan_neon _op_copy_c_dp_neon
+#define _op_copy_caa_dpan_neon _op_copy_c_dp_neon
+
+static void
+init_copy_color_span_funcs_neon(void)
+{
+   op_copy_span_funcs[SP_N][SM_N][SC_N][DP][CPU_NEON] = _op_copy_cn_dp_neon;
+   op_copy_span_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_copy_c_dp_neon;
+   op_copy_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_can_dp_neon;
+   op_copy_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_caa_dp_neon;
+
+   op_copy_span_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_cn_dpan_neon;
+   op_copy_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_c_dpan_neon;
+   op_copy_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_can_dpan_neon;
+   op_copy_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_pt_c_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   *d = c;
+}
+
+#define _op_copy_pt_cn_dp_neon _op_copy_pt_c_dp_neon
+#define _op_copy_pt_can_dp_neon _op_copy_pt_c_dp_neon
+#define _op_copy_pt_caa_dp_neon _op_copy_pt_c_dp_neon
+
+#define _op_copy_pt_cn_dpan_neon _op_copy_pt_c_dp_neon
+#define _op_copy_pt_c_dpan_neon _op_copy_pt_c_dp_neon
+#define _op_copy_pt_can_dpan_neon _op_copy_pt_c_dp_neon
+#define _op_copy_pt_caa_dpan_neon _op_copy_pt_c_dp_neon
+
+static void
+init_copy_color_pt_funcs_neon(void)
+{
+   op_copy_pt_funcs[SP_N][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pt_cn_dp_neon;
+   op_copy_pt_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_copy_pt_c_dp_neon;
+   op_copy_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pt_can_dp_neon;
+   op_copy_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pt_caa_dp_neon;
+
+   op_copy_pt_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_cn_dpan_neon;
+   op_copy_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pt_c_dpan_neon;
+   op_copy_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pt_can_dpan_neon;
+   op_copy_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pt_caa_dpan_neon;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel color --> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_rel_c_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   // FIXME: neon-it
+   DATA32 *e = d + l;
+   for (; d < e; d++) {
+       *d = MUL_SYM(*d >> 24, c);
+   }
+}
+
+#define _op_copy_rel_cn_dp_neon _op_copy_rel_c_dp_neon
+#define _op_copy_rel_can_dp_neon _op_copy_rel_c_dp_neon
+#define _op_copy_rel_caa_dp_neon _op_copy_rel_c_dp_neon
+
+#define _op_copy_rel_cn_dpan_neon _op_copy_cn_dpan_neon
+#define _op_copy_rel_c_dpan_neon _op_copy_c_dpan_neon
+#define _op_copy_rel_can_dpan_neon _op_copy_can_dpan_neon
+#define _op_copy_rel_caa_dpan_neon _op_copy_caa_dpan_neon
+
+static void
+init_copy_rel_color_span_funcs_neon(void)
+{
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_cn_dp_neon;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_c_dp_neon;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_can_dp_neon;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_caa_dp_neon;
+
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_cn_dpan_neon;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_c_dpan_neon;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_can_dpan_neon;
+   op_copy_rel_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_rel_pt_c_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   s = 1 + (*d >> 24);
+   *d = MUL_256(s, c);
+}
+
+
+#define _op_copy_rel_pt_cn_dp_neon _op_copy_rel_pt_c_dp_neon
+#define _op_copy_rel_pt_can_dp_neon _op_copy_rel_pt_c_dp_neon
+#define _op_copy_rel_pt_caa_dp_neon _op_copy_rel_pt_c_dp_neon
+
+#define _op_copy_rel_pt_cn_dpan_neon _op_copy_pt_cn_dpan_neon
+#define _op_copy_rel_pt_c_dpan_neon _op_copy_pt_c_dpan_neon
+#define _op_copy_rel_pt_can_dpan_neon _op_copy_pt_can_dpan_neon
+#define _op_copy_rel_pt_caa_dpan_neon _op_copy_pt_caa_dpan_neon
+
+static void
+init_copy_rel_color_pt_funcs_neon(void)
+{
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_cn_dp_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pt_c_dp_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pt_can_dp_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pt_caa_dp_neon;
+
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_cn_dpan_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pt_c_dpan_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pt_can_dpan_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pt_caa_dpan_neon;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_mask_color_.c b/src/lib/engines/common/evas_op_copy/op_copy_mask_color_.c
new file mode 100644 (file)
index 0000000..c623322
--- /dev/null
@@ -0,0 +1,171 @@
+
+/* copy mask x color -> dst */
+
+#ifdef BUILD_C
+static void
+_op_copy_mas_c_dp(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int color;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        color = *m;
+                        switch(color)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             *d = c;
+                             break;
+                          default:
+                             color++;
+                             *d = INTERP_256(color, c, *d);
+                             break;
+                          }
+                        m++;  d++;
+                     });
+}
+
+#define _op_copy_mas_cn_dp _op_copy_mas_c_dp
+#define _op_copy_mas_can_dp _op_copy_mas_c_dp
+#define _op_copy_mas_caa_dp _op_copy_mas_c_dp
+
+#define _op_copy_mas_c_dpan _op_copy_mas_c_dp
+#define _op_copy_mas_cn_dpan _op_copy_mas_c_dpan
+#define _op_copy_mas_can_dpan _op_copy_mas_c_dpan
+#define _op_copy_mas_caa_dpan _op_copy_mas_c_dpan
+
+static void
+init_copy_mask_color_span_funcs_c(void)
+{
+   op_copy_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_copy_mas_cn_dp;
+   op_copy_span_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_copy_mas_c_dp;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_copy_mas_can_dp;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_copy_mas_caa_dp;
+
+   op_copy_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_mas_cn_dpan;
+   op_copy_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_copy_mas_c_dpan;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_copy_mas_can_dpan;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_copy_mas_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_copy_pt_mas_c_dp(DATA32 s __UNUSED__, DATA8 m, DATA32 c, DATA32 *d) {
+   *d = INTERP_256(m + 1, c, *d);
+}
+
+
+#define _op_copy_pt_mas_cn_dp _op_copy_pt_mas_c_dp
+#define _op_copy_pt_mas_can_dp _op_copy_pt_mas_c_dp
+#define _op_copy_pt_mas_caa_dp _op_copy_pt_mas_c_dp
+
+#define _op_copy_pt_mas_c_dpan _op_copy_pt_mas_c_dp
+#define _op_copy_pt_mas_cn_dpan _op_copy_pt_mas_c_dpan
+#define _op_copy_pt_mas_can_dpan _op_copy_pt_mas_c_dpan
+#define _op_copy_pt_mas_caa_dpan _op_copy_pt_mas_c_dpan
+
+static void
+init_copy_mask_color_pt_funcs_c(void)
+{
+   op_copy_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_copy_pt_mas_cn_dp;
+   op_copy_pt_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_copy_pt_mas_c_dp;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_copy_pt_mas_can_dp;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_copy_pt_mas_caa_dp;
+
+   op_copy_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_pt_mas_cn_dpan;
+   op_copy_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_copy_pt_mas_c_dpan;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_copy_pt_mas_can_dpan;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_copy_pt_mas_caa_dpan;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel mask x color -> dst */
+
+#ifdef BUILD_C
+static void
+_op_copy_rel_mas_c_dp(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int color;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        color = *m;
+                        switch(color)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             color = 1 + (*d >> 24);
+                             *d = MUL_256(color, c);
+                             break;
+                          default:
+                               {
+                                  DATA32 da = 1 + (*d >> 24);
+                                  da = MUL_256(da, c);
+                                  color++;
+                                  *d = INTERP_256(color, da, *d);
+                               }
+                             break;
+                          }
+                        m++;  d++;
+                     });
+}
+
+
+#define _op_copy_rel_mas_cn_dp _op_copy_rel_mas_c_dp
+#define _op_copy_rel_mas_can_dp _op_copy_rel_mas_c_dp
+#define _op_copy_rel_mas_caa_dp _op_copy_rel_mas_c_dp
+
+#define _op_copy_rel_mas_c_dpan _op_copy_mas_c_dpan
+#define _op_copy_rel_mas_cn_dpan _op_copy_mas_cn_dpan
+#define _op_copy_rel_mas_can_dpan _op_copy_mas_can_dpan
+#define _op_copy_rel_mas_caa_dpan _op_copy_mas_caa_dpan
+
+static void
+init_copy_rel_mask_color_span_funcs_c(void)
+{
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_mas_cn_dp;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_copy_rel_mas_c_dp;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_copy_rel_mas_can_dp;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_copy_rel_mas_caa_dp;
+
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_mas_cn_dpan;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_copy_rel_mas_c_dpan;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_copy_rel_mas_can_dpan;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_copy_rel_mas_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_copy_rel_pt_mas_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   s = 1 + (*d >> 24);
+   s = MUL_256(s, c);
+   *d = INTERP_256(m + 1, s, *d);
+}
+
+#define _op_copy_rel_pt_mas_cn_dp _op_copy_rel_pt_mas_c_dp
+#define _op_copy_rel_pt_mas_can_dp _op_copy_rel_pt_mas_c_dp
+#define _op_copy_rel_pt_mas_caa_dp _op_copy_rel_pt_mas_c_dp
+
+#define _op_copy_rel_pt_mas_c_dpan _op_copy_pt_mas_c_dpan
+#define _op_copy_rel_pt_mas_cn_dpan _op_copy_pt_mas_cn_dpan
+#define _op_copy_rel_pt_mas_can_dpan _op_copy_pt_mas_can_dpan
+#define _op_copy_rel_pt_mas_caa_dpan _op_copy_pt_mas_caa_dpan
+
+static void
+init_copy_rel_mask_color_pt_funcs_c(void)
+{
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_pt_mas_cn_dp;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_copy_rel_pt_mas_c_dp;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_copy_rel_pt_mas_can_dp;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_copy_rel_pt_mas_caa_dp;
+
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_mas_cn_dpan;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_copy_rel_pt_mas_c_dpan;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_copy_rel_pt_mas_can_dpan;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_copy_rel_pt_mas_caa_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_mask_color_i386.c b/src/lib/engines/common/evas_op_copy/op_copy_mask_color_i386.c
new file mode 100644 (file)
index 0000000..324b6b2
--- /dev/null
@@ -0,0 +1,194 @@
+
+/* copy mask x color -> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_copy_mas_c_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_P2R(c, mm2, mm0)
+   MOV_A2R(ALPHA_255, mm5)
+   while (d < e) {
+       l = *m;
+       switch(l)
+         {
+           case 0:
+               break;
+           case 255:
+               *d = c;
+               break;
+           default:
+             {
+               l++;
+               MOV_A2R(l, mm3)
+               MOV_P2R(*d, mm1, mm0)
+               movq_r2r(mm2, mm4);
+               INTERP_256_R2R(mm3, mm4, mm1, mm5);
+               MOV_R2P(mm1, *d, mm0)
+             }
+               break;
+         }
+       m++;  d++;
+     }
+}
+
+#define _op_copy_mas_cn_dp_mmx _op_copy_mas_c_dp_mmx
+#define _op_copy_mas_can_dp_mmx _op_copy_mas_c_dp_mmx
+#define _op_copy_mas_caa_dp_mmx _op_copy_mas_c_dp_mmx
+
+#define _op_copy_mas_c_dpan_mmx _op_copy_mas_c_dp_mmx
+#define _op_copy_mas_cn_dpan_mmx _op_copy_mas_c_dpan_mmx
+#define _op_copy_mas_can_dpan_mmx _op_copy_mas_c_dpan_mmx
+#define _op_copy_mas_caa_dpan_mmx _op_copy_mas_c_dpan_mmx
+
+static void
+init_copy_mask_color_span_funcs_mmx(void)
+{
+   op_copy_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_mas_cn_dp_mmx;
+   op_copy_span_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_copy_mas_c_dp_mmx;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_copy_mas_can_dp_mmx;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_copy_mas_caa_dp_mmx;
+
+   op_copy_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_mas_cn_dpan_mmx;
+   op_copy_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_copy_mas_c_dpan_mmx;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_copy_mas_can_dpan_mmx;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_copy_mas_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_copy_pt_mas_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+       s = m + 1;
+       MOV_A2R(ALPHA_255, mm5)
+       pxor_r2r(mm0, mm0);
+       MOV_P2R(c, mm2, mm0)
+       MOV_A2R(s, mm3)
+       MOV_P2R(*d, mm1, mm0)
+       INTERP_256_R2R(mm3, mm2, mm1, mm5);
+       MOV_R2P(mm1, *d, mm0)
+}
+
+#define _op_copy_pt_mas_cn_dp_mmx _op_copy_pt_mas_c_dp_mmx
+#define _op_copy_pt_mas_can_dp_mmx _op_copy_pt_mas_c_dp_mmx
+#define _op_copy_pt_mas_caa_dp_mmx _op_copy_pt_mas_c_dp_mmx
+
+#define _op_copy_pt_mas_c_dpan_mmx _op_copy_pt_mas_c_dp_mmx
+#define _op_copy_pt_mas_cn_dpan_mmx _op_copy_pt_mas_c_dpan_mmx
+#define _op_copy_pt_mas_can_dpan_mmx _op_copy_pt_mas_c_dpan_mmx
+#define _op_copy_pt_mas_caa_dpan_mmx _op_copy_pt_mas_c_dpan_mmx
+
+static void
+init_copy_mask_color_pt_funcs_mmx(void)
+{
+   op_copy_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_pt_mas_cn_dp_mmx;
+   op_copy_pt_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_copy_pt_mas_c_dp_mmx;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_copy_pt_mas_can_dp_mmx;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_copy_pt_mas_caa_dp_mmx;
+
+   op_copy_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_mas_cn_dpan_mmx;
+   op_copy_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_copy_pt_mas_c_dpan_mmx;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_copy_pt_mas_can_dpan_mmx;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_copy_pt_mas_caa_dpan_mmx;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel mask x color -> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_copy_rel_mas_c_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_P2R(c, mm2, mm0)
+   MOV_A2R(ALPHA_255, mm5)
+   while (d < e) {
+       l = *m;
+       switch(l)
+         {
+           case 0:
+               break;
+           case 255:
+               l = 1 + (*d >> 24);
+               MOV_A2R(l, mm1)
+               MUL4_256_R2R(mm2, mm1)
+               MOV_R2P(mm1, *d, mm0)
+               break;
+           default:
+               l++;
+               MOV_A2R(l, mm3)
+               MOV_P2R(*d, mm1, mm0)
+               MOV_RA2R(mm1, mm4)
+               MUL4_256_R2R(mm2, mm4)
+               INTERP_256_R2R(mm3, mm4, mm1, mm5)
+               MOV_R2P(mm1, *d, mm0)
+               break;
+         }
+       m++;  d++;
+     }
+}
+
+#define _op_copy_rel_mas_cn_dp_mmx _op_copy_rel_mas_c_dp_mmx
+#define _op_copy_rel_mas_can_dp_mmx _op_copy_rel_mas_c_dp_mmx
+#define _op_copy_rel_mas_caa_dp_mmx _op_copy_rel_mas_c_dp_mmx
+
+#define _op_copy_rel_mas_c_dpan_mmx _op_copy_mas_c_dpan_mmx
+#define _op_copy_rel_mas_cn_dpan_mmx _op_copy_mas_cn_dpan_mmx
+#define _op_copy_rel_mas_can_dpan_mmx _op_copy_mas_can_dpan_mmx
+#define _op_copy_rel_mas_caa_dpan_mmx _op_copy_mas_caa_dpan_mmx
+
+static void
+init_copy_rel_mask_color_span_funcs_mmx(void)
+{
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_mas_cn_dp_mmx;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_copy_rel_mas_c_dp_mmx;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_copy_rel_mas_can_dp_mmx;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_copy_rel_mas_caa_dp_mmx;
+
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_mas_cn_dpan_mmx;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_copy_rel_mas_c_dpan_mmx;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_mas_can_dpan_mmx;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_mas_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_copy_rel_pt_mas_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+       s = m + 1;
+       MOV_A2R(ALPHA_255, mm5)
+       pxor_r2r(mm0, mm0);
+       MOV_A2R(s, mm3)
+       MOV_P2R(*d, mm1, mm0)
+       MOV_RA2R(mm1, mm4)
+       MOV_P2R(c, mm2, mm0)
+       MUL4_256_R2R(mm2, mm4)
+       INTERP_256_R2R(mm3, mm4, mm1, mm5)
+       MOV_R2P(mm1, *d, mm0)
+}
+
+#define _op_copy_rel_pt_mas_cn_dp_mmx _op_copy_rel_pt_mas_c_dp_mmx
+#define _op_copy_rel_pt_mas_can_dp_mmx _op_copy_rel_pt_mas_c_dp_mmx
+#define _op_copy_rel_pt_mas_caa_dp_mmx _op_copy_rel_pt_mas_c_dp_mmx
+
+#define _op_copy_rel_pt_mas_c_dpan_mmx _op_copy_pt_mas_c_dpan_mmx
+#define _op_copy_rel_pt_mas_cn_dpan_mmx _op_copy_pt_mas_cn_dpan_mmx
+#define _op_copy_rel_pt_mas_can_dpan_mmx _op_copy_pt_mas_can_dpan_mmx
+#define _op_copy_rel_pt_mas_caa_dpan_mmx _op_copy_pt_mas_caa_dpan_mmx
+
+static void
+init_copy_rel_mask_color_pt_funcs_mmx(void)
+{
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_mas_cn_dp_mmx;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_copy_rel_pt_mas_c_dp_mmx;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_copy_rel_pt_mas_can_dp_mmx;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_copy_rel_pt_mas_caa_dp_mmx;
+
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_mas_cn_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_copy_rel_pt_mas_c_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_pt_mas_can_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_pt_mas_caa_dpan_mmx;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_mask_color_neon.c b/src/lib/engines/common/evas_op_copy/op_copy_mask_color_neon.c
new file mode 100644 (file)
index 0000000..e2f3bdb
--- /dev/null
@@ -0,0 +1,171 @@
+
+/* copy mask x color -> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_mas_c_dp_neon(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   // FIXME: neon-it
+   DATA32 *e;
+   int color;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        color = *m;
+                        switch(color)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             *d = c;
+                             break;
+                          default:
+                             color++;
+                             *d = INTERP_256(color, c, *d);
+                             break;
+                          }
+                        m++;  d++;
+                     });
+}
+
+#define _op_copy_mas_cn_dp_neon _op_copy_mas_c_dp_neon
+#define _op_copy_mas_can_dp_neon _op_copy_mas_c_dp_neon
+#define _op_copy_mas_caa_dp_neon _op_copy_mas_c_dp_neon
+
+#define _op_copy_mas_c_dpan_neon _op_copy_mas_c_dp_neon
+#define _op_copy_mas_cn_dpan_neon _op_copy_mas_c_dpan_neon
+#define _op_copy_mas_can_dpan_neon _op_copy_mas_c_dpan_neon
+#define _op_copy_mas_caa_dpan_neon _op_copy_mas_c_dpan_neon
+
+static void
+init_copy_mask_color_span_funcs_neon(void)
+{
+   op_copy_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_mas_cn_dp_neon;
+   op_copy_span_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_copy_mas_c_dp_neon;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_copy_mas_can_dp_neon;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_copy_mas_caa_dp_neon;
+
+   op_copy_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_mas_cn_dpan_neon;
+   op_copy_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_copy_mas_c_dpan_neon;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_copy_mas_can_dpan_neon;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_copy_mas_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_pt_mas_c_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   *d = INTERP_256(m + 1, c, *d);
+}
+
+#define _op_copy_pt_mas_cn_dp_neon _op_copy_pt_mas_c_dp_neon
+#define _op_copy_pt_mas_can_dp_neon _op_copy_pt_mas_c_dp_neon
+#define _op_copy_pt_mas_caa_dp_neon _op_copy_pt_mas_c_dp_neon
+
+#define _op_copy_pt_mas_c_dpan_neon _op_copy_pt_mas_c_dp_neon
+#define _op_copy_pt_mas_cn_dpan_neon _op_copy_pt_mas_c_dpan_neon
+#define _op_copy_pt_mas_can_dpan_neon _op_copy_pt_mas_c_dpan_neon
+#define _op_copy_pt_mas_caa_dpan_neon _op_copy_pt_mas_c_dpan_neon
+
+static void
+init_copy_mask_color_pt_funcs_neon(void)
+{
+   op_copy_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pt_mas_cn_dp_neon;
+   op_copy_pt_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_copy_pt_mas_c_dp_neon;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_copy_pt_mas_can_dp_neon;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_copy_pt_mas_caa_dp_neon;
+
+   op_copy_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_mas_cn_dpan_neon;
+   op_copy_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_copy_pt_mas_c_dpan_neon;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_copy_pt_mas_can_dpan_neon;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_copy_pt_mas_caa_dpan_neon;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel mask x color -> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_rel_mas_c_dp_neon(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   // FIXME: neon-it
+   DATA32 *e;
+   int color;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        color = *m;
+                        switch(color)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             color = 1 + (*d >> 24);
+                             *d = MUL_256(color, c);
+                             break;
+                          default:
+                               {
+                                  DATA32 da = 1 + (*d >> 24);
+                                  da = MUL_256(da, c);
+                                  color++;
+                                  *d = INTERP_256(color, da, *d);
+                               }
+                             break;
+                          }
+                        m++;  d++;
+                     });
+}
+
+#define _op_copy_rel_mas_cn_dp_neon _op_copy_rel_mas_c_dp_neon
+#define _op_copy_rel_mas_can_dp_neon _op_copy_rel_mas_c_dp_neon
+#define _op_copy_rel_mas_caa_dp_neon _op_copy_rel_mas_c_dp_neon
+
+#define _op_copy_rel_mas_c_dpan_neon _op_copy_mas_c_dpan_neon
+#define _op_copy_rel_mas_cn_dpan_neon _op_copy_mas_cn_dpan_neon
+#define _op_copy_rel_mas_can_dpan_neon _op_copy_mas_can_dpan_neon
+#define _op_copy_rel_mas_caa_dpan_neon _op_copy_mas_caa_dpan_neon
+
+static void
+init_copy_rel_mask_color_span_funcs_neon(void)
+{
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_mas_cn_dp_neon;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_copy_rel_mas_c_dp_neon;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_copy_rel_mas_can_dp_neon;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_copy_rel_mas_caa_dp_neon;
+
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_mas_cn_dpan_neon;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_copy_rel_mas_c_dpan_neon;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_mas_can_dpan_neon;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_mas_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_rel_pt_mas_c_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   s = 1 + (*d >> 24);
+   s = MUL_256(s, c);
+   *d = INTERP_256(m + 1, s, *d);
+}
+
+#define _op_copy_rel_pt_mas_cn_dp_neon _op_copy_rel_pt_mas_c_dp_neon
+#define _op_copy_rel_pt_mas_can_dp_neon _op_copy_rel_pt_mas_c_dp_neon
+#define _op_copy_rel_pt_mas_caa_dp_neon _op_copy_rel_pt_mas_c_dp_neon
+
+#define _op_copy_rel_pt_mas_c_dpan_neon _op_copy_pt_mas_c_dpan_neon
+#define _op_copy_rel_pt_mas_cn_dpan_neon _op_copy_pt_mas_cn_dpan_neon
+#define _op_copy_rel_pt_mas_can_dpan_neon _op_copy_pt_mas_can_dpan_neon
+#define _op_copy_rel_pt_mas_caa_dpan_neon _op_copy_pt_mas_caa_dpan_neon
+
+static void
+init_copy_rel_mask_color_pt_funcs_neon(void)
+{
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_mas_cn_dp_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_copy_rel_pt_mas_c_dp_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_copy_rel_pt_mas_can_dp_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_copy_rel_pt_mas_caa_dp_neon;
+
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_mas_cn_dpan_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_copy_rel_pt_mas_c_dpan_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pt_mas_can_dpan_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pt_mas_caa_dpan_neon;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_.c
new file mode 100644 (file)
index 0000000..51cbafc
--- /dev/null
@@ -0,0 +1,118 @@
+
+/* copy pixel --> dst */
+
+#ifdef BUILD_C
+static void
+_op_copy_p_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   memcpy(d, s, l * sizeof(DATA32));
+}
+
+#define _op_copy_pan_dp _op_copy_p_dp
+#define _op_copy_pas_dp _op_copy_p_dp
+
+#define _op_copy_p_dpan _op_copy_p_dp
+#define _op_copy_pan_dpan _op_copy_pan_dp
+#define _op_copy_pas_dpan _op_copy_pas_dp
+
+static void
+init_copy_pixel_span_funcs_c(void)
+{
+   op_copy_span_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_copy_p_dp;
+   op_copy_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_copy_pan_dp;
+   op_copy_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_copy_pas_dp;
+
+   op_copy_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_p_dpan;
+   op_copy_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_pan_dpan;
+   op_copy_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_pas_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_copy_pt_p_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d) {
+   *d = s;
+}
+
+#define _op_copy_pt_pan_dp _op_copy_pt_p_dp
+#define _op_copy_pt_pas_dp _op_copy_pt_p_dp
+
+#define _op_copy_pt_p_dpan _op_copy_pt_p_dp
+#define _op_copy_pt_pan_dpan _op_copy_pt_pan_dp
+#define _op_copy_pt_pas_dpan _op_copy_pt_pas_dp
+
+static void
+init_copy_pixel_pt_funcs_c(void)
+{
+   op_copy_pt_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_copy_pt_p_dp;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_copy_pt_pan_dp;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_copy_pt_pas_dp;
+
+   op_copy_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_pt_p_dpan;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_pt_pan_dpan;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_pt_pas_dpan;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel pixel --> dst */
+
+#ifdef BUILD_C
+static void
+_op_copy_rel_p_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d = MUL_SYM(*d >> 24, *s);
+                        d++; s++;
+                     });
+}
+
+
+#define _op_copy_rel_pas_dp _op_copy_rel_p_dp
+#define _op_copy_rel_pan_dp _op_copy_rel_p_dp
+
+#define _op_copy_rel_p_dpan _op_copy_p_dpan
+#define _op_copy_rel_pan_dpan _op_copy_pan_dpan
+#define _op_copy_rel_pas_dpan _op_copy_pas_dpan
+
+static void
+init_copy_rel_pixel_span_funcs_c(void)
+{
+   op_copy_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_p_dp;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_pan_dp;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_pas_dp;
+
+   op_copy_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_p_dpan;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_pan_dpan;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_pas_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_copy_rel_pt_p_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   c = 1 + (*d >> 24);
+   *d = MUL_256(c, s);
+}
+
+
+#define _op_copy_rel_pt_pan_dp _op_copy_rel_pt_p_dp
+#define _op_copy_rel_pt_pas_dp _op_copy_rel_pt_p_dp
+
+#define _op_copy_rel_pt_p_dpan _op_copy_pt_p_dpan
+#define _op_copy_rel_pt_pan_dpan _op_copy_pt_pan_dpan
+#define _op_copy_rel_pt_pas_dpan _op_copy_pt_pas_dpan
+
+static void
+init_copy_rel_pixel_pt_funcs_c(void)
+{
+   op_copy_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_pt_p_dp;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_pt_pan_dp;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_pt_pas_dp;
+
+   op_copy_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_p_dpan;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_pan_dpan;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_pas_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_.c
new file mode 100644 (file)
index 0000000..7925fdd
--- /dev/null
@@ -0,0 +1,237 @@
+
+/* copy pixel x color --> dst */
+
+#ifdef BUILD_C
+static void
+_op_copy_p_c_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d = MUL4_SYM(c, *s);
+                        d++;
+                        s++;
+                     });
+}
+
+static void
+_op_copy_p_caa_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   c = 1 + (c >> 24);
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d = MUL_256(c, *s);
+                        d++;
+                        s++;
+                     });
+}
+
+
+#define _op_copy_pas_c_dp _op_copy_p_c_dp
+#define _op_copy_pan_c_dp _op_copy_p_c_dp
+#define _op_copy_p_can_dp _op_copy_p_c_dp
+#define _op_copy_pas_can_dp _op_copy_p_can_dp
+#define _op_copy_pan_can_dp _op_copy_p_c_dp
+#define _op_copy_pas_caa_dp _op_copy_p_caa_dp
+#define _op_copy_pan_caa_dp _op_copy_p_caa_dp
+
+#define _op_copy_p_c_dpan _op_copy_p_c_dp
+#define _op_copy_pas_c_dpan _op_copy_pas_c_dp
+#define _op_copy_pan_c_dpan _op_copy_pan_c_dp
+#define _op_copy_p_can_dpan _op_copy_p_can_dp
+#define _op_copy_pas_can_dpan _op_copy_pas_can_dp
+#define _op_copy_pan_can_dpan _op_copy_pan_can_dp
+#define _op_copy_p_caa_dpan _op_copy_p_caa_dp
+#define _op_copy_pas_caa_dpan _op_copy_pas_caa_dp
+#define _op_copy_pan_caa_dpan _op_copy_pan_caa_dp
+
+static void
+init_copy_pixel_color_span_funcs_c(void)
+{
+   op_copy_span_funcs[SP][SM_N][SC][DP][CPU_C] = _op_copy_p_c_dp;
+   op_copy_span_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_copy_pas_c_dp;
+   op_copy_span_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_copy_pan_c_dp;
+   op_copy_span_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_copy_p_can_dp;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_copy_pas_can_dp;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_copy_pan_can_dp;
+   op_copy_span_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_copy_p_caa_dp;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_copy_pas_caa_dp;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_copy_pan_caa_dp;
+
+   op_copy_span_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_copy_p_c_dpan;
+   op_copy_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_copy_pas_c_dpan;
+   op_copy_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_copy_pan_c_dpan;
+   op_copy_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_p_can_dpan;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_pas_can_dpan;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_pan_can_dpan;
+   op_copy_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_p_caa_dpan;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_pas_caa_dpan;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_pan_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_copy_pt_p_c_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   *d = MUL4_SYM(c, s);
+}
+
+static void
+_op_copy_pt_p_caa_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   *d = MUL_SYM(c >> 24, s);
+}
+
+
+#define _op_copy_pt_p_can_dp _op_copy_pt_p_c_dp
+#define _op_copy_pt_pan_c_dp _op_copy_pt_p_c_dp
+#define _op_copy_pt_pan_can_dp _op_copy_pt_p_c_dp
+#define _op_copy_pt_pan_caa_dp _op_copy_pt_p_caa_dp
+#define _op_copy_pt_pas_c_dp _op_copy_pt_p_c_dp
+#define _op_copy_pt_pas_can_dp _op_copy_pt_p_can_dp
+#define _op_copy_pt_pas_caa_dp _op_copy_pt_p_caa_dp
+
+#define _op_copy_pt_p_c_dpan _op_copy_pt_p_c_dp
+#define _op_copy_pt_pas_c_dpan _op_copy_pt_pas_c_dp
+#define _op_copy_pt_pan_c_dpan _op_copy_pt_pan_c_dp
+#define _op_copy_pt_p_can_dpan _op_copy_pt_p_can_dp
+#define _op_copy_pt_pas_can_dpan _op_copy_pt_pas_can_dp
+#define _op_copy_pt_pan_can_dpan _op_copy_pt_pan_can_dp
+#define _op_copy_pt_p_caa_dpan _op_copy_pt_p_caa_dp
+#define _op_copy_pt_pas_caa_dpan _op_copy_pt_pas_caa_dp
+#define _op_copy_pt_pan_caa_dpan _op_copy_pt_pan_caa_dp
+
+static void
+init_copy_pixel_color_pt_funcs_c(void)
+{
+   op_copy_pt_funcs[SP][SM_N][SC][DP][CPU_C] = _op_copy_pt_p_c_dp;
+   op_copy_pt_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_copy_pt_pas_c_dp;
+   op_copy_pt_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_copy_pt_pan_c_dp;
+   op_copy_pt_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_copy_pt_p_can_dp;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_copy_pt_pas_can_dp;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_copy_pt_pan_can_dp;
+   op_copy_pt_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_copy_pt_p_caa_dp;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_copy_pt_pas_caa_dp;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_copy_pt_pan_caa_dp;
+
+   op_copy_pt_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_copy_pt_p_c_dpan;
+   op_copy_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_copy_pt_pas_c_dpan;
+   op_copy_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_copy_pt_pan_c_dpan;
+   op_copy_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_pt_p_can_dpan;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_pt_pas_can_dpan;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_pt_pan_can_dpan;
+   op_copy_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_pt_p_caa_dpan;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_pt_pas_caa_dpan;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_pt_pan_caa_dpan;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel pixel x color --> dst */
+
+#ifdef BUILD_C
+static void
+_op_copy_rel_p_c_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        DATA32 cs = MUL4_SYM(c, *s);
+                        *d = MUL_SYM(*d >> 24, cs);
+                        d++;
+                        s++;
+                     });
+}
+
+#define _op_copy_rel_pas_c_dp _op_copy_rel_p_c_dp
+#define _op_copy_rel_pan_c_dp _op_copy_rel_p_c_dp
+#define _op_copy_rel_p_can_dp _op_copy_rel_p_c_dp
+#define _op_copy_rel_pas_can_dp _op_copy_rel_pas_c_dp
+#define _op_copy_rel_pan_can_dp _op_copy_rel_p_c_dp
+#define _op_copy_rel_p_caa_dp _op_copy_rel_p_c_dp
+#define _op_copy_rel_pas_caa_dp _op_copy_rel_p_c_dp
+#define _op_copy_rel_pan_caa_dp _op_copy_rel_p_c_dp
+
+#define _op_copy_rel_p_c_dpan _op_copy_p_c_dpan
+#define _op_copy_rel_pas_c_dpan _op_copy_pas_c_dpan
+#define _op_copy_rel_pan_c_dpan _op_copy_pan_c_dpan
+#define _op_copy_rel_p_can_dpan _op_copy_p_can_dpan
+#define _op_copy_rel_pas_can_dpan _op_copy_pas_can_dpan
+#define _op_copy_rel_pan_can_dpan _op_copy_pan_can_dpan
+#define _op_copy_rel_p_caa_dpan _op_copy_p_caa_dpan
+#define _op_copy_rel_pas_caa_dpan _op_copy_pas_caa_dpan
+#define _op_copy_rel_pan_caa_dpan _op_copy_pan_caa_dpan
+
+static void
+init_copy_rel_pixel_color_span_funcs_c(void)
+{
+   op_copy_rel_span_funcs[SP][SM_N][SC][DP][CPU_C] = _op_copy_rel_p_c_dp;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_copy_rel_pas_c_dp;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_copy_rel_pan_c_dp;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_p_can_dp;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_pas_can_dp;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_pan_can_dp;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_p_caa_dp;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_pas_caa_dp;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_pan_caa_dp;
+
+   op_copy_rel_span_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_p_c_dpan;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_pas_c_dpan;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_pan_c_dpan;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_p_can_dpan;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_pas_can_dpan;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_pan_can_dpan;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_p_caa_dpan;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_pas_caa_dpan;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_pan_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_copy_rel_pt_p_c_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   s = MUL4_SYM(c, s);
+   *d = MUL_SYM(*d >> 24, s);
+}
+
+#define _op_copy_rel_pt_pas_c_dp _op_copy_rel_pt_p_c_dp
+#define _op_copy_rel_pt_pan_c_dp _op_copy_rel_pt_p_c_dp
+#define _op_copy_rel_pt_p_can_dp _op_copy_rel_pt_p_c_dp
+#define _op_copy_rel_pt_pas_can_dp _op_copy_rel_pt_p_can_dp
+#define _op_copy_rel_pt_pan_can_dp _op_copy_rel_pt_p_c_dp
+#define _op_copy_rel_pt_p_caa_dp _op_copy_rel_pt_p_c_dp
+#define _op_copy_rel_pt_pas_caa_dp _op_copy_rel_pt_p_caa_dp
+#define _op_copy_rel_pt_pan_caa_dp _op_copy_rel_pt_p_caa_dp
+
+#define _op_copy_rel_pt_p_c_dpan _op_copy_pt_p_c_dpan
+#define _op_copy_rel_pt_pas_c_dpan _op_copy_pt_pas_c_dpan
+#define _op_copy_rel_pt_pan_c_dpan _op_copy_pt_pan_c_dpan
+#define _op_copy_rel_pt_p_can_dpan _op_copy_pt_p_can_dpan
+#define _op_copy_rel_pt_pas_can_dpan _op_copy_pt_pas_can_dpan
+#define _op_copy_rel_pt_pan_can_dpan _op_copy_pt_pan_can_dpan
+#define _op_copy_rel_pt_p_caa_dpan _op_copy_pt_p_caa_dpan
+#define _op_copy_rel_pt_pas_caa_dpan _op_copy_pt_pas_caa_dpan
+#define _op_copy_rel_pt_pan_caa_dpan _op_copy_pt_pan_caa_dpan
+
+static void
+init_copy_rel_pixel_color_pt_funcs_c(void)
+{
+   op_copy_rel_pt_funcs[SP][SM_N][SC][DP][CPU_C] = _op_copy_rel_pt_p_c_dp;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_copy_rel_pt_pas_c_dp;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_copy_rel_pt_pan_c_dp;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_pt_p_can_dp;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_pt_pas_can_dp;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_pt_pan_can_dp;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_pt_p_caa_dp;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_pt_pas_caa_dp;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_pt_pan_caa_dp;
+
+   op_copy_rel_pt_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_pt_p_c_dpan;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_pt_pas_c_dpan;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_pt_pan_c_dpan;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_pt_p_can_dpan;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_pt_pas_can_dpan;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_pt_pan_can_dpan;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_pt_p_caa_dpan;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_pt_pas_caa_dpan;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_pt_pan_caa_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_i386.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_i386.c
new file mode 100644 (file)
index 0000000..c5c5e91
--- /dev/null
@@ -0,0 +1,256 @@
+
+/* copy pixel x color --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_copy_p_c_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_P2R(c, mm3, mm0)
+   MOV_A2R(ALPHA_255, mm5)
+   while (d < e) {
+       MOV_P2R(*s, mm2, mm0)
+       MUL4_SYM_R2R(mm3, mm2, mm5);
+       MOV_R2P(mm2, *d, mm0)
+       s++;  d++;
+     }
+}
+
+
+static void
+_op_copy_p_caa_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   c = 1 + (c >> 24);
+   MOV_A2R(c, mm3)
+   pxor_r2r(mm0, mm0);
+   while (d < e) {
+       MOV_P2R(*s, mm2, mm0)
+       MUL4_256_R2R(mm3, mm2);
+       MOV_R2P(mm2, *d, mm0)
+       s++;  d++;
+     }
+}
+
+
+#define _op_copy_pas_c_dp_mmx _op_copy_p_c_dp_mmx
+#define _op_copy_pan_c_dp_mmx _op_copy_p_c_dp_mmx
+#define _op_copy_p_can_dp_mmx _op_copy_p_c_dp_mmx
+#define _op_copy_pas_can_dp_mmx _op_copy_pas_c_dp_mmx
+#define _op_copy_pan_can_dp_mmx _op_copy_pan_c_dp_mmx
+#define _op_copy_pas_caa_dp_mmx _op_copy_p_caa_dp_mmx
+#define _op_copy_pan_caa_dp_mmx _op_copy_p_caa_dp_mmx
+
+#define _op_copy_p_c_dpan_mmx _op_copy_p_c_dp_mmx
+#define _op_copy_pas_c_dpan_mmx _op_copy_pas_c_dp_mmx
+#define _op_copy_pan_c_dpan_mmx _op_copy_pan_c_dp_mmx
+#define _op_copy_p_can_dpan_mmx _op_copy_p_can_dp_mmx
+#define _op_copy_pas_can_dpan_mmx _op_copy_pas_can_dp_mmx
+#define _op_copy_pan_can_dpan_mmx _op_copy_pan_can_dp_mmx
+#define _op_copy_p_caa_dpan_mmx _op_copy_p_caa_dp_mmx
+#define _op_copy_pas_caa_dpan_mmx _op_copy_pas_caa_dp_mmx
+#define _op_copy_pan_caa_dpan_mmx _op_copy_pan_caa_dp_mmx
+
+static void
+init_copy_pixel_color_span_funcs_mmx(void)
+{
+   op_copy_span_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_copy_p_c_dp_mmx;
+   op_copy_span_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_copy_pas_c_dp_mmx;
+   op_copy_span_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_copy_pan_c_dp_mmx;
+   op_copy_span_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_p_can_dp_mmx;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_pas_can_dp_mmx;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_pan_can_dp_mmx;
+   op_copy_span_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_p_caa_dp_mmx;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_pas_caa_dp_mmx;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_pan_caa_dp_mmx;
+
+   op_copy_span_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_p_c_dpan_mmx;
+   op_copy_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_pas_c_dpan_mmx;
+   op_copy_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_pan_c_dpan_mmx;
+   op_copy_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_p_can_dpan_mmx;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_pas_can_dpan_mmx;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_pan_can_dpan_mmx;
+   op_copy_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_p_caa_dpan_mmx;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_pas_caa_dpan_mmx;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_pan_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_copy_pt_p_c_dp_mmx(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+       pxor_r2r(mm0, mm0);
+       MOV_A2R(ALPHA_255, mm5)
+       MOV_P2R(c, mm2, mm0)
+       MOV_P2R(s, mm2, mm0)
+       MUL4_SYM_R2R(mm3, mm2, mm5);
+       MOV_R2P(mm2, *d, mm0)
+}
+
+#define _op_copy_pt_pas_c_dp_mmx _op_copy_pt_p_c_dp_mmx
+#define _op_copy_pt_pan_c_dp_mmx _op_copy_pt_p_c_dp_mmx
+#define _op_copy_pt_p_can_dp_mmx _op_copy_pt_p_c_dp_mmx
+#define _op_copy_pt_pas_can_dp_mmx _op_copy_pt_p_c_dp_mmx
+#define _op_copy_pt_pan_can_dp_mmx _op_copy_pt_p_c_dp_mmx
+#define _op_copy_pt_p_caa_dp_mmx _op_copy_pt_p_c_dp_mmx
+#define _op_copy_pt_pas_caa_dp_mmx _op_copy_pt_p_c_dp_mmx
+#define _op_copy_pt_pan_caa_dp_mmx _op_copy_pt_p_c_dp_mmx
+
+#define _op_copy_pt_p_c_dpan_mmx _op_copy_pt_p_c_dp_mmx
+#define _op_copy_pt_pas_c_dpan_mmx _op_copy_pt_pas_c_dp_mmx
+#define _op_copy_pt_pan_c_dpan_mmx _op_copy_pt_pan_c_dp_mmx
+#define _op_copy_pt_p_can_dpan_mmx _op_copy_pt_p_can_dp_mmx
+#define _op_copy_pt_pas_can_dpan_mmx _op_copy_pt_pas_can_dp_mmx
+#define _op_copy_pt_pan_can_dpan_mmx _op_copy_pt_pan_can_dp_mmx
+#define _op_copy_pt_p_caa_dpan_mmx _op_copy_pt_p_caa_dp_mmx
+#define _op_copy_pt_pas_caa_dpan_mmx _op_copy_pt_pas_caa_dp_mmx
+#define _op_copy_pt_pan_caa_dpan_mmx _op_copy_pt_pan_caa_dp_mmx
+
+static void
+init_copy_pixel_color_pt_funcs_mmx(void)
+{
+   op_copy_pt_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_copy_pt_p_c_dp_mmx;
+   op_copy_pt_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_copy_pt_pas_c_dp_mmx;
+   op_copy_pt_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_copy_pt_pan_c_dp_mmx;
+   op_copy_pt_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_pt_p_can_dp_mmx;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_pt_pas_can_dp_mmx;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_pt_pan_can_dp_mmx;
+   op_copy_pt_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_pt_p_caa_dp_mmx;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_pt_pas_caa_dp_mmx;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_pt_pan_caa_dp_mmx;
+
+   op_copy_pt_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_pt_p_c_dpan_mmx;
+   op_copy_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_pt_pas_c_dpan_mmx;
+   op_copy_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_pt_pan_c_dpan_mmx;
+   op_copy_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_pt_p_can_dpan_mmx;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_pt_pas_can_dpan_mmx;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_pt_pan_can_dpan_mmx;
+   op_copy_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_pt_p_caa_dpan_mmx;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_pt_pas_caa_dpan_mmx;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_pt_pan_caa_dpan_mmx;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel pixel x color --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_copy_rel_p_c_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_P2R(c, mm3, mm0)
+   MOV_A2R(ALPHA_255, mm5)
+   while (d < e) {
+       MOV_PA2R(*d, mm1)
+       MOV_P2R(*s, mm2, mm0)
+       MUL4_SYM_R2R(mm3, mm2, mm5);
+       MUL4_SYM_R2R(mm2, mm1, mm5);
+       MOV_R2P(mm1, *d, mm0)
+       s++;  d++;
+     }
+}
+
+
+#define _op_copy_rel_pas_c_dp_mmx _op_copy_rel_p_c_dp_mmx
+#define _op_copy_rel_pan_c_dp_mmx _op_copy_rel_p_c_dp_mmx
+#define _op_copy_rel_p_can_dp_mmx _op_copy_rel_p_c_dp_mmx
+#define _op_copy_rel_pas_can_dp_mmx _op_copy_rel_p_c_dp_mmx
+#define _op_copy_rel_pan_can_dp_mmx _op_copy_rel_p_c_dp_mmx
+#define _op_copy_rel_p_caa_dp_mmx _op_copy_rel_p_c_dp_mmx
+#define _op_copy_rel_pas_caa_dp_mmx _op_copy_rel_p_c_dp_mmx
+#define _op_copy_rel_pan_caa_dp_mmx _op_copy_rel_p_c_dp_mmx
+
+#define _op_copy_rel_p_c_dpan_mmx _op_copy_p_c_dpan_mmx
+#define _op_copy_rel_pas_c_dpan_mmx _op_copy_pas_c_dpan_mmx
+#define _op_copy_rel_pan_c_dpan_mmx _op_copy_pan_c_dpan_mmx
+#define _op_copy_rel_p_can_dpan_mmx _op_copy_p_can_dpan_mmx
+#define _op_copy_rel_pas_can_dpan_mmx _op_copy_pas_can_dpan_mmx
+#define _op_copy_rel_pan_can_dpan_mmx _op_copy_pan_can_dpan_mmx
+#define _op_copy_rel_p_caa_dpan_mmx _op_copy_p_caa_dpan_mmx
+#define _op_copy_rel_pas_caa_dpan_mmx _op_copy_pas_caa_dpan_mmx
+#define _op_copy_rel_pan_caa_dpan_mmx _op_copy_pan_caa_dpan_mmx
+
+static void
+init_copy_rel_pixel_color_span_funcs_mmx(void)
+{
+   op_copy_rel_span_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_p_c_dp_mmx;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_pas_c_dp_mmx;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_pan_c_dp_mmx;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_p_can_dp_mmx;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_pas_can_dp_mmx;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_pan_can_dp_mmx;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_p_caa_dp_mmx;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_pas_caa_dp_mmx;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_pan_caa_dp_mmx;
+
+   op_copy_rel_span_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_p_c_dpan_mmx;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_pas_c_dpan_mmx;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_pan_c_dpan_mmx;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_p_can_dpan_mmx;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_pas_can_dpan_mmx;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_pan_can_dpan_mmx;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_p_caa_dpan_mmx;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_pas_caa_dpan_mmx;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_pan_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_copy_rel_pt_p_c_dp_mmx(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+       pxor_r2r(mm0, mm0);
+       MOV_P2R(c, mm3, mm0)
+       MOV_A2R(ALPHA_255, mm5)
+       MOV_PA2R(*d, mm1)
+       MOV_P2R(s, mm2, mm0)
+       MUL4_SYM_R2R(mm3, mm2, mm5);
+       MUL4_SYM_R2R(mm2, mm1, mm5);
+       MOV_R2P(mm1, *d, mm0)
+}
+
+
+#define _op_copy_rel_pt_pas_c_dp_mmx _op_copy_rel_pt_p_c_dp_mmx
+#define _op_copy_rel_pt_pan_c_dp_mmx _op_copy_rel_pt_p_c_dp_mmx
+#define _op_copy_rel_pt_p_can_dp_mmx _op_copy_rel_pt_p_c_dp_mmx
+#define _op_copy_rel_pt_pas_can_dp_mmx _op_copy_rel_pt_p_c_dp_mmx
+#define _op_copy_rel_pt_pan_can_dp_mmx _op_copy_rel_pt_p_c_dp_mmx
+#define _op_copy_rel_pt_p_caa_dp_mmx _op_copy_rel_pt_p_c_dp_mmx
+#define _op_copy_rel_pt_pas_caa_dp_mmx _op_copy_rel_pt_p_c_dp_mmx
+#define _op_copy_rel_pt_pan_caa_dp_mmx _op_copy_rel_pt_p_c_dp_mmx
+
+#define _op_copy_rel_pt_p_c_dpan_mmx _op_copy_pt_p_c_dpan_mmx
+#define _op_copy_rel_pt_pas_c_dpan_mmx _op_copy_pt_pas_c_dpan_mmx
+#define _op_copy_rel_pt_pan_c_dpan_mmx _op_copy_pt_pan_c_dpan_mmx
+#define _op_copy_rel_pt_p_can_dpan_mmx _op_copy_pt_p_can_dpan_mmx
+#define _op_copy_rel_pt_pas_can_dpan_mmx _op_copy_pt_pas_can_dpan_mmx
+#define _op_copy_rel_pt_pan_can_dpan_mmx _op_copy_pt_pan_can_dpan_mmx
+#define _op_copy_rel_pt_p_caa_dpan_mmx _op_copy_pt_p_caa_dpan_mmx
+#define _op_copy_rel_pt_pas_caa_dpan_mmx _op_copy_pt_pas_caa_dpan_mmx
+#define _op_copy_rel_pt_pan_caa_dpan_mmx _op_copy_pt_pan_caa_dpan_mmx
+
+
+static void
+init_copy_rel_pixel_color_pt_funcs_mmx(void)
+{
+   op_copy_rel_pt_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_pt_p_c_dp_mmx;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_pt_pas_c_dp_mmx;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_pt_pan_c_dp_mmx;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_pt_p_can_dp_mmx;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_pt_pas_can_dp_mmx;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_pt_pan_can_dp_mmx;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_pt_p_caa_dp_mmx;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_pt_pas_caa_dp_mmx;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_pt_pan_caa_dp_mmx;
+
+   op_copy_rel_pt_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_pt_p_c_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_pt_pas_c_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_pt_pan_c_dpan_mmx;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_pt_p_can_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_pt_pas_can_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_pt_pan_can_dpan_mmx;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_pt_p_caa_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_pt_pas_caa_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_pt_pan_caa_dpan_mmx;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_neon.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_neon.c
new file mode 100644 (file)
index 0000000..af8e9e0
--- /dev/null
@@ -0,0 +1,239 @@
+
+/* copy pixel x color --> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_p_c_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   // FIXME: neon-it
+   DATA32 *e;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d = MUL4_SYM(c, *s);
+                        d++;
+                        s++;
+                     });
+}
+
+
+static void
+_op_copy_p_caa_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {   // FIXME: neon-it
+   // FIXME: neon-it
+   DATA32 *e;
+   c = 1 + (c >> 24);
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d = MUL_256(c, *s);
+                        d++;
+                        s++;
+                     });
+}
+
+
+#define _op_copy_pas_c_dp_neon _op_copy_p_c_dp_neon
+#define _op_copy_pan_c_dp_neon _op_copy_p_c_dp_neon
+#define _op_copy_p_can_dp_neon _op_copy_p_c_dp_neon
+#define _op_copy_pas_can_dp_neon _op_copy_pas_c_dp_neon
+#define _op_copy_pan_can_dp_neon _op_copy_pan_c_dp_neon
+#define _op_copy_pas_caa_dp_neon _op_copy_p_caa_dp_neon
+#define _op_copy_pan_caa_dp_neon _op_copy_p_caa_dp_neon
+
+#define _op_copy_p_c_dpan_neon _op_copy_p_c_dp_neon
+#define _op_copy_pas_c_dpan_neon _op_copy_pas_c_dp_neon
+#define _op_copy_pan_c_dpan_neon _op_copy_pan_c_dp_neon
+#define _op_copy_p_can_dpan_neon _op_copy_p_can_dp_neon
+#define _op_copy_pas_can_dpan_neon _op_copy_pas_can_dp_neon
+#define _op_copy_pan_can_dpan_neon _op_copy_pan_can_dp_neon
+#define _op_copy_p_caa_dpan_neon _op_copy_p_caa_dp_neon
+#define _op_copy_pas_caa_dpan_neon _op_copy_pas_caa_dp_neon
+#define _op_copy_pan_caa_dpan_neon _op_copy_pan_caa_dp_neon
+
+static void
+init_copy_pixel_color_span_funcs_neon(void)
+{
+   op_copy_span_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_copy_p_c_dp_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_copy_pas_c_dp_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_copy_pan_c_dp_neon;
+   op_copy_span_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_p_can_dp_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pas_can_dp_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pan_can_dp_neon;
+   op_copy_span_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_p_caa_dp_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pas_caa_dp_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pan_caa_dp_neon;
+
+   op_copy_span_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_p_c_dpan_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pas_c_dpan_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pan_c_dpan_neon;
+   op_copy_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_p_can_dpan_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pas_can_dpan_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pan_can_dpan_neon;
+   op_copy_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_p_caa_dpan_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pas_caa_dpan_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pan_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_pt_p_c_dp_neon(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   *d = MUL4_SYM(c, s);
+}
+
+#define _op_copy_pt_pas_c_dp_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_pan_c_dp_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_p_can_dp_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_pas_can_dp_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_pan_can_dp_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_p_caa_dp_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_pas_caa_dp_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_pan_caa_dp_neon _op_copy_pt_p_c_dp_neon
+
+#define _op_copy_pt_p_c_dpan_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_pas_c_dpan_neon _op_copy_pt_pas_c_dp_neon
+#define _op_copy_pt_pan_c_dpan_neon _op_copy_pt_pan_c_dp_neon
+#define _op_copy_pt_p_can_dpan_neon _op_copy_pt_p_can_dp_neon
+#define _op_copy_pt_pas_can_dpan_neon _op_copy_pt_pas_can_dp_neon
+#define _op_copy_pt_pan_can_dpan_neon _op_copy_pt_pan_can_dp_neon
+#define _op_copy_pt_p_caa_dpan_neon _op_copy_pt_p_caa_dp_neon
+#define _op_copy_pt_pas_caa_dpan_neon _op_copy_pt_pas_caa_dp_neon
+#define _op_copy_pt_pan_caa_dpan_neon _op_copy_pt_pan_caa_dp_neon
+
+static void
+init_copy_pixel_color_pt_funcs_neon(void)
+{
+   op_copy_pt_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_copy_pt_p_c_dp_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_copy_pt_pas_c_dp_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_copy_pt_pan_c_dp_neon;
+   op_copy_pt_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pt_p_can_dp_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pt_pas_can_dp_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pt_pan_can_dp_neon;
+   op_copy_pt_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pt_p_caa_dp_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pt_pas_caa_dp_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pt_pan_caa_dp_neon;
+
+   op_copy_pt_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pt_p_c_dpan_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pt_pas_c_dpan_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pt_pan_c_dpan_neon;
+   op_copy_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pt_p_can_dpan_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pt_pas_can_dpan_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pt_pan_can_dpan_neon;
+   op_copy_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pt_p_caa_dpan_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pt_pas_caa_dpan_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pt_pan_caa_dpan_neon;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel pixel x color --> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_rel_p_c_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   // FIXME: neon-it
+   DATA32 *e;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        DATA32 cs = MUL4_SYM(c, *s);
+                        *d = MUL_SYM(*d >> 24, cs);
+                        d++;
+                        s++;
+                     });
+}
+
+
+#define _op_copy_rel_pas_c_dp_neon _op_copy_rel_p_c_dp_neon
+#define _op_copy_rel_pan_c_dp_neon _op_copy_rel_p_c_dp_neon
+#define _op_copy_rel_p_can_dp_neon _op_copy_rel_p_c_dp_neon
+#define _op_copy_rel_pas_can_dp_neon _op_copy_rel_p_c_dp_neon
+#define _op_copy_rel_pan_can_dp_neon _op_copy_rel_p_c_dp_neon
+#define _op_copy_rel_p_caa_dp_neon _op_copy_rel_p_c_dp_neon
+#define _op_copy_rel_pas_caa_dp_neon _op_copy_rel_p_c_dp_neon
+#define _op_copy_rel_pan_caa_dp_neon _op_copy_rel_p_c_dp_neon
+
+#define _op_copy_rel_p_c_dpan_neon _op_copy_p_c_dpan_neon
+#define _op_copy_rel_pas_c_dpan_neon _op_copy_pas_c_dpan_neon
+#define _op_copy_rel_pan_c_dpan_neon _op_copy_pan_c_dpan_neon
+#define _op_copy_rel_p_can_dpan_neon _op_copy_p_can_dpan_neon
+#define _op_copy_rel_pas_can_dpan_neon _op_copy_pas_can_dpan_neon
+#define _op_copy_rel_pan_can_dpan_neon _op_copy_pan_can_dpan_neon
+#define _op_copy_rel_p_caa_dpan_neon _op_copy_p_caa_dpan_neon
+#define _op_copy_rel_pas_caa_dpan_neon _op_copy_pas_caa_dpan_neon
+#define _op_copy_rel_pan_caa_dpan_neon _op_copy_pan_caa_dpan_neon
+
+static void
+init_copy_rel_pixel_color_span_funcs_neon(void)
+{
+   op_copy_rel_span_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_p_c_dp_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pas_c_dp_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pan_c_dp_neon;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_p_can_dp_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pas_can_dp_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pan_can_dp_neon;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_p_caa_dp_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pas_caa_dp_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pan_caa_dp_neon;
+
+   op_copy_rel_span_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_p_c_dpan_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pas_c_dpan_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pan_c_dpan_neon;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_p_can_dpan_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pas_can_dpan_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pan_can_dpan_neon;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_p_caa_dpan_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pas_caa_dpan_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pan_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_rel_pt_p_c_dp_neon(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   s = MUL4_SYM(c, s);
+   *d = MUL_SYM(*d >> 24, s);
+}
+
+
+#define _op_copy_rel_pt_pas_c_dp_neon _op_copy_rel_pt_p_c_dp_neon
+#define _op_copy_rel_pt_pan_c_dp_neon _op_copy_rel_pt_p_c_dp_neon
+#define _op_copy_rel_pt_p_can_dp_neon _op_copy_rel_pt_p_c_dp_neon
+#define _op_copy_rel_pt_pas_can_dp_neon _op_copy_rel_pt_p_c_dp_neon
+#define _op_copy_rel_pt_pan_can_dp_neon _op_copy_rel_pt_p_c_dp_neon
+#define _op_copy_rel_pt_p_caa_dp_neon _op_copy_rel_pt_p_c_dp_neon
+#define _op_copy_rel_pt_pas_caa_dp_neon _op_copy_rel_pt_p_c_dp_neon
+#define _op_copy_rel_pt_pan_caa_dp_neon _op_copy_rel_pt_p_c_dp_neon
+
+#define _op_copy_rel_pt_p_c_dpan_neon _op_copy_pt_p_c_dpan_neon
+#define _op_copy_rel_pt_pas_c_dpan_neon _op_copy_pt_pas_c_dpan_neon
+#define _op_copy_rel_pt_pan_c_dpan_neon _op_copy_pt_pan_c_dpan_neon
+#define _op_copy_rel_pt_p_can_dpan_neon _op_copy_pt_p_can_dpan_neon
+#define _op_copy_rel_pt_pas_can_dpan_neon _op_copy_pt_pas_can_dpan_neon
+#define _op_copy_rel_pt_pan_can_dpan_neon _op_copy_pt_pan_can_dpan_neon
+#define _op_copy_rel_pt_p_caa_dpan_neon _op_copy_pt_p_caa_dpan_neon
+#define _op_copy_rel_pt_pas_caa_dpan_neon _op_copy_pt_pas_caa_dpan_neon
+#define _op_copy_rel_pt_pan_caa_dpan_neon _op_copy_pt_pan_caa_dpan_neon
+
+
+static void
+init_copy_rel_pixel_color_pt_funcs_neon(void)
+{
+   op_copy_rel_pt_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pt_p_c_dp_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pt_pas_c_dp_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pt_pan_c_dp_neon;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pt_p_can_dp_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pt_pas_can_dp_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pt_pan_can_dp_neon;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pt_p_caa_dp_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pt_pas_caa_dp_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pt_pan_caa_dp_neon;
+
+   op_copy_rel_pt_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pt_p_c_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pt_pas_c_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pt_pan_c_dpan_neon;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pt_p_can_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pt_pas_can_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pt_pan_can_dpan_neon;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pt_p_caa_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pt_pas_caa_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pt_pan_caa_dpan_neon;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_i386.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_i386.c
new file mode 100644 (file)
index 0000000..2161781
--- /dev/null
@@ -0,0 +1,132 @@
+
+/* copy pixel --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_copy_p_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e = d + l - 15;
+   for (; d < e; d+=16, s+=16) {
+      MOVE_16DWORDS_MMX(s, d);
+   }
+   e+=15;
+   for (; d < e; d++, s++) {
+      *d = *s;
+   }
+}
+
+#define _op_copy_pan_dp_mmx _op_copy_p_dp_mmx
+#define _op_copy_pas_dp_mmx _op_copy_p_dp_mmx
+
+#define _op_copy_p_dpan_mmx _op_copy_p_dp_mmx
+#define _op_copy_pan_dpan_mmx _op_copy_pan_dp_mmx
+#define _op_copy_pas_dpan_mmx _op_copy_pas_dp_mmx
+
+static void
+init_copy_pixel_span_funcs_mmx(void)
+{
+   op_copy_span_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_copy_p_dp_mmx;
+   op_copy_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_copy_pan_dp_mmx;
+   op_copy_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_copy_pas_dp_mmx;
+
+   op_copy_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_p_dpan_mmx;
+   op_copy_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_pan_dpan_mmx;
+   op_copy_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_pas_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_copy_pt_p_dp_mmx(DATA32 s, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d) {
+      *d = s;
+}
+
+#define _op_copy_pt_pan_dp_mmx _op_copy_pt_p_dp_mmx
+#define _op_copy_pt_pas_dp_mmx _op_copy_pt_p_dp_mmx
+
+#define _op_copy_pt_p_dpan_mmx _op_copy_pt_p_dp_mmx
+#define _op_copy_pt_pan_dpan_mmx _op_copy_pt_pan_dp_mmx
+#define _op_copy_pt_pas_dpan_mmx _op_copy_pt_pas_dp_mmx
+
+static void
+init_copy_pixel_pt_funcs_mmx(void)
+{
+   op_copy_pt_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_copy_pt_p_dp_mmx;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_copy_pt_pan_dp_mmx;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_copy_pt_pas_dp_mmx;
+
+   op_copy_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_p_dpan_mmx;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_pan_dpan_mmx;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_pas_dpan_mmx;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel pixel --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_copy_rel_p_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+   for (; d < e; d++, s++) {
+       MOV_PA2R(*d, mm1)
+       MOV_P2R(*s, mm2, mm0)
+       MUL4_SYM_R2R(mm2, mm1, mm5)
+       MOV_R2P(mm1, *d, mm0)
+   }
+}
+
+
+#define _op_copy_rel_pas_dp_mmx _op_copy_rel_p_dp_mmx
+#define _op_copy_rel_pan_dp_mmx _op_copy_rel_p_dp_mmx
+
+#define _op_copy_rel_p_dpan_mmx _op_copy_p_dpan_mmx
+#define _op_copy_rel_pan_dpan_mmx _op_copy_pan_dpan_mmx
+#define _op_copy_rel_pas_dpan_mmx _op_copy_pas_dpan_mmx
+
+static void
+init_copy_rel_pixel_span_funcs_mmx(void)
+{
+   op_copy_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_p_dp_mmx;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_pan_dp_mmx;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_pas_dp_mmx;
+
+   op_copy_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_p_dpan_mmx;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pan_dpan_mmx;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pas_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_copy_rel_pt_p_dp_mmx(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+       c = 1 + (*d >> 24);
+       MOV_A2R(c, mm1)
+       pxor_r2r(mm0, mm0);
+       MOV_P2R(s, mm2, mm0)
+       MUL4_256_R2R(mm2, mm1)
+       MOV_R2P(mm1, *d, mm0)
+}
+
+
+#define _op_copy_rel_pt_pan_dp_mmx _op_copy_rel_pt_p_dp_mmx
+#define _op_copy_rel_pt_pas_dp_mmx _op_copy_rel_pt_p_dp_mmx
+
+#define _op_copy_rel_pt_p_dpan_mmx _op_copy_pt_p_dpan_mmx
+#define _op_copy_rel_pt_pan_dpan_mmx _op_copy_pt_pan_dpan_mmx
+#define _op_copy_rel_pt_pas_dpan_mmx _op_copy_pt_pas_dpan_mmx
+
+static void
+init_copy_rel_pixel_pt_funcs_mmx(void)
+{
+   op_copy_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_p_dp_mmx;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_pan_dp_mmx;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_pas_dp_mmx;
+
+   op_copy_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_p_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_pan_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_pas_dpan_mmx;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_.c
new file mode 100644 (file)
index 0000000..5d90118
--- /dev/null
@@ -0,0 +1,151 @@
+
+/* copy pixel x mask --> dst */
+
+#ifdef BUILD_C
+static void 
+_op_copy_p_mas_dp(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e;
+   int color;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        color = *m;
+                        switch(color)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             *d = *s;
+                             break;
+                          default:
+                             color++;
+                             *d = INTERP_256(color, *s, *d);
+                             break;
+                          }
+                        m++;  s++;  d++;
+                     });
+}
+
+
+#define _op_copy_pan_mas_dp _op_copy_p_mas_dp
+#define _op_copy_pas_mas_dp _op_copy_p_mas_dp
+
+#define _op_copy_p_mas_dpan _op_copy_p_mas_dp
+#define _op_copy_pan_mas_dpan _op_copy_p_mas_dpan
+#define _op_copy_pas_mas_dpan _op_copy_p_mas_dpan
+
+static void
+init_copy_pixel_mask_span_funcs_c(void)
+{
+   op_copy_span_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_copy_p_mas_dp;
+   op_copy_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_copy_pan_mas_dp;
+   op_copy_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_copy_pas_mas_dp;
+
+   op_copy_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_p_mas_dpan;
+   op_copy_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_pan_mas_dpan;
+   op_copy_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_pas_mas_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_copy_pt_p_mas_dp(DATA32 s, DATA8 m, DATA32 c __UNUSED__, DATA32 *d) {
+   *d = INTERP_256(m + 1, s, *d);
+}
+
+#define _op_copy_pt_pan_mas_dp _op_copy_pt_p_mas_dp
+#define _op_copy_pt_pas_mas_dp _op_copy_pt_p_mas_dp
+
+#define _op_copy_pt_p_mas_dpan _op_copy_pt_p_mas_dp
+#define _op_copy_pt_pan_mas_dpan _op_copy_pt_p_mas_dpan
+#define _op_copy_pt_pas_mas_dpan _op_copy_pt_p_mas_dpan
+
+static void
+init_copy_pixel_mask_pt_funcs_c(void)
+{
+   op_copy_pt_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_copy_pt_p_mas_dp;
+   op_copy_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_copy_pt_pan_mas_dp;
+   op_copy_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_copy_pt_pas_mas_dp;
+
+   op_copy_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_pt_p_mas_dpan;
+   op_copy_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_pt_pan_mas_dpan;
+   op_copy_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_pt_pas_mas_dpan;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel pixel x mask --> dst */
+
+#ifdef BUILD_C
+static void
+_op_copy_rel_p_mas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e;
+   int color;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        color = *m;
+                        switch(color)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             *d = MUL_SYM(*d >> 24, *s);
+                             break;
+                          default:
+                             c = MUL_SYM(*d >> 24, *s);
+                             l++;
+                             *d = INTERP_256(l, c, *d);
+                             break;
+                          }
+                        m++;  s++;  d++;
+                     });
+}
+
+
+#define _op_copy_rel_pan_mas_dp _op_copy_rel_p_mas_dp
+#define _op_copy_rel_pas_mas_dp _op_copy_rel_p_mas_dp
+
+#define _op_copy_rel_p_mas_dpan _op_copy_p_mas_dpan
+#define _op_copy_rel_pan_mas_dpan _op_copy_pan_mas_dpan
+#define _op_copy_rel_pas_mas_dpan _op_copy_pas_mas_dpan
+
+static void
+init_copy_rel_pixel_mask_span_funcs_c(void)
+{
+   op_copy_rel_span_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_p_mas_dp;
+   op_copy_rel_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_pan_mas_dp;
+   op_copy_rel_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_pas_mas_dp;
+
+   op_copy_rel_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_p_mas_dpan;
+   op_copy_rel_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_pan_mas_dpan;
+   op_copy_rel_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_pas_mas_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_copy_rel_pt_p_mas_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   c = MUL_SYM(*d >> 24, s);
+   *d = INTERP_256(m + 1, c, *d);
+}
+
+
+#define _op_copy_rel_pt_pan_mas_dp _op_copy_rel_pt_p_mas_dp
+#define _op_copy_rel_pt_pas_mas_dp _op_copy_rel_pt_p_mas_dp
+
+#define _op_copy_rel_pt_p_mas_dpan _op_copy_pt_p_mas_dpan
+#define _op_copy_rel_pt_pan_mas_dpan _op_copy_pt_pan_mas_dpan
+#define _op_copy_rel_pt_pas_mas_dpan _op_copy_pt_pas_mas_dpan
+
+static void
+init_copy_rel_pixel_mask_pt_funcs_c(void)
+{
+   op_copy_rel_pt_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_pt_p_mas_dp;
+   op_copy_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_pt_pan_mas_dp;
+   op_copy_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_pt_pas_mas_dp;
+
+   op_copy_rel_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_p_mas_dpan;
+   op_copy_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_pan_mas_dpan;
+   op_copy_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_pas_mas_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_i386.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_i386.c
new file mode 100644 (file)
index 0000000..957c6a2
--- /dev/null
@@ -0,0 +1,177 @@
+
+/* copy pixel x mask --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_copy_p_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+   while (d < e) {
+       l = *m;
+       switch(l)
+         {
+           case 0:
+               break;
+           case 255:
+               *d = *s;
+               break;
+           default:
+               l++;
+               MOV_A2R(l, mm3)
+               MOV_P2R(*s, mm2, mm0)
+               MOV_P2R(*d, mm1, mm0)
+               INTERP_256_R2R(mm3, mm2, mm1, mm5);
+               MOV_R2P(mm1, *d, mm0)
+               break;
+         }
+       m++;  d++;
+     }
+}
+
+#define _op_copy_pan_mas_dp_mmx _op_copy_p_mas_dp_mmx
+#define _op_copy_pas_mas_dp_mmx _op_copy_p_mas_dp_mmx
+
+#define _op_copy_p_mas_dpan_mmx _op_copy_p_mas_dp_mmx
+#define _op_copy_pan_mas_dpan_mmx _op_copy_p_mas_dpan_mmx
+#define _op_copy_pas_mas_dpan_mmx _op_copy_p_mas_dpan_mmx
+
+static void
+init_copy_pixel_mask_span_funcs_mmx(void)
+{
+   op_copy_span_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_p_mas_dp_mmx;
+   op_copy_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_pan_mas_dp_mmx;
+   op_copy_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_pas_mas_dp_mmx;
+
+   op_copy_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_p_mas_dpan_mmx;
+   op_copy_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_pan_mas_dpan_mmx;
+   op_copy_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_pas_mas_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_copy_pt_p_mas_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+       c = m + 1;
+       MOV_A2R(ALPHA_255, mm5)
+       MOV_A2R(c, mm3)
+       pxor_r2r(mm0, mm0);
+       MOV_P2R(s, mm2, mm0)
+       MOV_P2R(*d, mm1, mm0)
+       INTERP_256_R2R(mm3, mm2, mm1, mm5);
+       MOV_R2P(mm1, *d, mm0)
+}
+
+#define _op_copy_pt_pan_mas_dp_mmx _op_copy_pt_p_mas_dp_mmx
+#define _op_copy_pt_pas_mas_dp_mmx _op_copy_pt_p_mas_dp_mmx
+
+#define _op_copy_pt_p_mas_dpan_mmx _op_copy_pt_p_mas_dp_mmx
+#define _op_copy_pt_pan_mas_dpan_mmx _op_copy_pt_p_mas_dpan_mmx
+#define _op_copy_pt_pas_mas_dpan_mmx _op_copy_pt_p_mas_dpan_mmx
+
+static void
+init_copy_pixel_mask_pt_funcs_mmx(void)
+{
+   op_copy_pt_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_pt_p_mas_dp_mmx;
+   op_copy_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_pt_pan_mas_dp_mmx;
+   op_copy_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_pt_pas_mas_dp_mmx;
+
+   op_copy_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_p_mas_dpan_mmx;
+   op_copy_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_pan_mas_dpan_mmx;
+   op_copy_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_pas_mas_dpan_mmx;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel pixel x mask --> dst */
+
+#ifdef BUILD_MMX
+static void 
+_op_copy_rel_p_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+   while (d < e) {
+       l = *m;
+       switch(l)
+         {
+           case 0:
+               break;
+           case 255:
+               MOV_P2R(*s, mm2, mm0)
+               MOV_PA2R(*d, mm1)
+               MUL4_SYM_R2R(mm2, mm1, mm5)
+               MOV_R2P(mm1, *d, mm0)
+               break;
+           default:
+               l++;
+               MOV_P2R(*s, mm3, mm0)
+               MOV_P2R(*d, mm1, mm0)
+               MOV_RA2R(mm1, mm2)
+               MUL4_SYM_R2R(mm3, mm2, mm5)
+               MOV_A2R(l, mm3)
+               INTERP_256_R2R(mm3, mm2, mm1, mm5)
+               MOV_R2P(mm1, *d, mm0)
+               break;
+         }
+       m++;  s++;  d++;
+     }
+}
+
+#define _op_copy_rel_pan_mas_dp_mmx _op_copy_rel_p_mas_dp_mmx
+#define _op_copy_rel_pas_mas_dp_mmx _op_copy_rel_p_mas_dp_mmx
+
+#define _op_copy_rel_p_mas_dpan_mmx _op_copy_p_mas_dpan_mmx
+#define _op_copy_rel_pan_mas_dpan_mmx _op_copy_pan_mas_dpan_mmx
+#define _op_copy_rel_pas_mas_dpan_mmx _op_copy_pas_mas_dpan_mmx
+
+static void
+init_copy_rel_pixel_mask_span_funcs_mmx(void)
+{
+   op_copy_rel_span_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_p_mas_dp_mmx;
+   op_copy_rel_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_pan_mas_dp_mmx;
+   op_copy_rel_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_pas_mas_dp_mmx;
+
+   op_copy_rel_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_p_mas_dpan_mmx;
+   op_copy_rel_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pan_mas_dpan_mmx;
+   op_copy_rel_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pas_mas_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void 
+_op_copy_rel_pt_p_mas_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+       c = m + 1;
+       pxor_r2r(mm0, mm0);
+       MOV_A2R(ALPHA_255, mm5)
+       MOV_P2R(s, mm3, mm0)
+       MOV_P2R(*d, mm1, mm0)
+       MOV_RA2R(mm1, mm2)
+       MUL4_SYM_R2R(mm3, mm2, mm5)
+       MOV_A2R(c, mm3)
+       INTERP_256_R2R(mm3, mm2, mm1, mm5)
+       MOV_R2P(mm1, *d, mm0)
+}
+
+
+#define _op_copy_rel_pt_pan_mas_dp_mmx _op_copy_rel_pt_p_mas_dp_mmx
+#define _op_copy_rel_pt_pas_mas_dp_mmx _op_copy_rel_pt_p_mas_dp_mmx
+
+#define _op_copy_rel_pt_p_mas_dpan_mmx _op_copy_pt_p_mas_dpan_mmx
+#define _op_copy_rel_pt_pan_mas_dpan_mmx _op_copy_pt_pan_mas_dpan_mmx
+#define _op_copy_rel_pt_pas_mas_dpan_mmx _op_copy_pt_pas_mas_dpan_mmx
+
+static void
+init_copy_rel_pixel_mask_pt_funcs_mmx(void)
+{
+   op_copy_rel_pt_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_p_mas_dp_mmx;
+   op_copy_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_pan_mas_dp_mmx;
+   op_copy_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_pas_mas_dp_mmx;
+
+   op_copy_rel_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_p_mas_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_pan_mas_dpan_mmx;
+   op_copy_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_pas_mas_dpan_mmx;
+}
+#endif
+
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_neon.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_neon.c
new file mode 100644 (file)
index 0000000..3d89ff8
--- /dev/null
@@ -0,0 +1,152 @@
+
+/* copy pixel x mask --> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_p_mas_dp_neon(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   // FIXME: neon-it
+   DATA32 *e;
+   int color;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        color = *m;
+                        switch(color)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             *d = *s;
+                             break;
+                          default:
+                             color++;
+                             *d = INTERP_256(color, *s, *d);
+                             break;
+                          }
+                        m++;  s++;  d++;
+                     });
+}
+
+#define _op_copy_pan_mas_dp_neon _op_copy_p_mas_dp_neon
+#define _op_copy_pas_mas_dp_neon _op_copy_p_mas_dp_neon
+
+#define _op_copy_p_mas_dpan_neon _op_copy_p_mas_dp_neon
+#define _op_copy_pan_mas_dpan_neon _op_copy_p_mas_dpan_neon
+#define _op_copy_pas_mas_dpan_neon _op_copy_p_mas_dpan_neon
+
+static void
+init_copy_pixel_mask_span_funcs_neon(void)
+{
+   op_copy_span_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_p_mas_dp_neon;
+   op_copy_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pan_mas_dp_neon;
+   op_copy_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pas_mas_dp_neon;
+
+   op_copy_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_p_mas_dpan_neon;
+   op_copy_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pan_mas_dpan_neon;
+   op_copy_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pas_mas_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_pt_p_mas_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   *d = INTERP_256(m + 1, s, *d);
+}
+
+#define _op_copy_pt_pan_mas_dp_neon _op_copy_pt_p_mas_dp_neon
+#define _op_copy_pt_pas_mas_dp_neon _op_copy_pt_p_mas_dp_neon
+
+#define _op_copy_pt_p_mas_dpan_neon _op_copy_pt_p_mas_dp_neon
+#define _op_copy_pt_pan_mas_dpan_neon _op_copy_pt_p_mas_dpan_neon
+#define _op_copy_pt_pas_mas_dpan_neon _op_copy_pt_p_mas_dpan_neon
+
+static void
+init_copy_pixel_mask_pt_funcs_neon(void)
+{
+   op_copy_pt_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pt_p_mas_dp_neon;
+   op_copy_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pt_pan_mas_dp_neon;
+   op_copy_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pt_pas_mas_dp_neon;
+
+   op_copy_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_p_mas_dpan_neon;
+   op_copy_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_pan_mas_dpan_neon;
+   op_copy_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_pas_mas_dpan_neon;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel pixel x mask --> dst */
+
+#ifdef BUILD_NEON
+static void 
+_op_copy_rel_p_mas_dp_neon(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   // FIXME: neon-it
+   DATA32 *e;
+   int color;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        color = *m;
+                        switch(color)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             *d = MUL_SYM(*d >> 24, *s);
+                             break;
+                          default:
+                             c = MUL_SYM(*d >> 24, *s);
+                             l++;
+                             *d = INTERP_256(l, c, *d);
+                             break;
+                          }
+                        m++;  s++;  d++;
+                     });
+}
+
+#define _op_copy_rel_pan_mas_dp_neon _op_copy_rel_p_mas_dp_neon
+#define _op_copy_rel_pas_mas_dp_neon _op_copy_rel_p_mas_dp_neon
+
+#define _op_copy_rel_p_mas_dpan_neon _op_copy_p_mas_dpan_neon
+#define _op_copy_rel_pan_mas_dpan_neon _op_copy_pan_mas_dpan_neon
+#define _op_copy_rel_pas_mas_dpan_neon _op_copy_pas_mas_dpan_neon
+
+static void
+init_copy_rel_pixel_mask_span_funcs_neon(void)
+{
+   op_copy_rel_span_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_p_mas_dp_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pan_mas_dp_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pas_mas_dp_neon;
+
+   op_copy_rel_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_p_mas_dpan_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pan_mas_dpan_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pas_mas_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void 
+_op_copy_rel_pt_p_mas_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   c = MUL_SYM(*d >> 24, s);
+   *d = INTERP_256(m + 1, c, *d);
+}
+
+
+#define _op_copy_rel_pt_pan_mas_dp_neon _op_copy_rel_pt_p_mas_dp_neon
+#define _op_copy_rel_pt_pas_mas_dp_neon _op_copy_rel_pt_p_mas_dp_neon
+
+#define _op_copy_rel_pt_p_mas_dpan_neon _op_copy_pt_p_mas_dpan_neon
+#define _op_copy_rel_pt_pan_mas_dpan_neon _op_copy_pt_pan_mas_dpan_neon
+#define _op_copy_rel_pt_pas_mas_dpan_neon _op_copy_pt_pas_mas_dpan_neon
+
+static void
+init_copy_rel_pixel_mask_pt_funcs_neon(void)
+{
+   op_copy_rel_pt_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_p_mas_dp_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_pan_mas_dp_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_pas_mas_dp_neon;
+
+   op_copy_rel_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_p_mas_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_pan_mas_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_pas_mas_dpan_neon;
+}
+#endif
+
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_neon.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_neon.c
new file mode 100644 (file)
index 0000000..45887d3
--- /dev/null
@@ -0,0 +1,172 @@
+
+/* copy pixel --> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_p_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   uint32_t *e;
+   e = d + l;
+//#ifdef NEON_INSTRINSICS_OK
+#if 1
+   // odd this is faster than the below asm... :(
+   e -= 15;
+   uint32x4_t col1, col2, col3, col4; 
+   // fill a run of 4x4 (16) pixels with the color
+   for (; d < e; d += 16, s += 16) {
+      col1 = vld1q_u32(s+0); // OP
+      col2 = vld1q_u32(s+4); // OP
+      col3 = vld1q_u32(s+8); // OP
+      col4 = vld1q_u32(s+12); // OP
+      vst1q_u32(d+0, col1); // OP
+      vst1q_u32(d+4, col2); // OP
+      vst1q_u32(d+8, col3); // OP
+      vst1q_u32(d+12, col4); // OP
+   }
+   e += 15;
+#else
+   if ((e - d) >= 16)
+     {
+        DATA32 *d2, *d3, *d4;
+        DATA32 *s2, *s3, *s4;
+        e -= 31;
+        d2 = d + 4;
+        d3 = d + 8;
+        d4 = d + 12;
+        s2 = s + 4;
+        s3 = s + 8;
+        s4 = s + 12;
+        asm volatile (
+                      "asmloop2:\n\t"
+                      "cmp %[e], %[d]\n\t"
+                      "vld1.32 {d16-d17}, [%[s]]!\n\t"
+                      "vld1.32 {d18-d19}, [%[s2]]!\n\t"
+                      "vld1.32 {d20-d21}, [%[s3]]!\n\t"
+                      "vld1.32 {d22-d23}, [%[s4]]!\n\t"
+                      "vst1.32 {d16-d17}, [%[d]]!\n\t"
+                      "vst1.32 {d18-d19}, [%[d2]]!\n\t"
+                      "vst1.32 {d20-d21}, [%[d3]]!\n\t"
+                      "vst1.32 {d22-d23}, [%[d4]]!\n\t"
+                      "bhi asmloop2\n\t"
+                      : // output regs
+                      : [s] "r" (s), [s2] "r" (s2), [s3] "r" (s3), [s4] "r" (s4), [e] "r" (e), [d] "r" (d), [d2] "r" (d2), [d3] "r" (d3), [d4] "r" (d4) // input
+                      : "q8", "q9", "q10", "q11", "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", "memory" // clobbered
+                      );
+                e += 31;
+     }
+#endif   
+   // fixup any leftover pixels in the run
+   for (; d < e; d++, s++) {
+      *d = *s; // OP
+   }
+}
+
+#define _op_copy_pan_dp_neon _op_copy_p_dp_neon
+#define _op_copy_pas_dp_neon _op_copy_p_dp_neon
+
+#define _op_copy_p_dpan_neon _op_copy_p_dp_neon
+#define _op_copy_pan_dpan_neon _op_copy_pan_dp_neon
+#define _op_copy_pas_dpan_neon _op_copy_pas_dp_neon
+
+static void
+init_copy_pixel_span_funcs_neon(void)
+{
+   op_copy_span_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_copy_p_dp_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pan_dp_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pas_dp_neon;
+
+   op_copy_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_p_dpan_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pan_dpan_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pas_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_pt_p_dp_neon(DATA32 s, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d) {
+   *d = s;
+}
+
+#define _op_copy_pt_pan_dp_neon _op_copy_pt_p_dp_neon
+#define _op_copy_pt_pas_dp_neon _op_copy_pt_p_dp_neon
+
+#define _op_copy_pt_p_dpan_neon _op_copy_pt_p_dp_neon
+#define _op_copy_pt_pan_dpan_neon _op_copy_pt_pan_dp_neon
+#define _op_copy_pt_pas_dpan_neon _op_copy_pt_pas_dp_neon
+
+static void
+init_copy_pixel_pt_funcs_neon(void)
+{
+   op_copy_pt_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pt_p_dp_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pt_pan_dp_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pt_pas_dp_neon;
+
+   op_copy_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_p_dpan_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_pan_dpan_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_pas_dpan_neon;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel pixel --> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_rel_p_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   // FIXME: neon-it
+   DATA32 *e;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d = MUL_SYM(*d >> 24, c);
+                        d++;
+                     });
+}
+
+
+#define _op_copy_rel_pas_dp_neon _op_copy_rel_p_dp_neon
+#define _op_copy_rel_pan_dp_neon _op_copy_rel_p_dp_neon
+
+#define _op_copy_rel_p_dpan_neon _op_copy_p_dpan_neon
+#define _op_copy_rel_pan_dpan_neon _op_copy_pan_dpan_neon
+#define _op_copy_rel_pas_dpan_neon _op_copy_pas_dpan_neon
+
+static void
+init_copy_rel_pixel_span_funcs_neon(void)
+{
+   op_copy_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_p_dp_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pan_dp_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pas_dp_neon;
+
+   op_copy_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_p_dpan_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pan_dpan_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pas_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_rel_pt_p_dp_neon(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   s = 1 + (*d >> 24);
+   *d = MUL_256(s, c);
+}
+
+
+#define _op_copy_rel_pt_pan_dp_neon _op_copy_rel_pt_p_dp_neon
+#define _op_copy_rel_pt_pas_dp_neon _op_copy_rel_pt_p_dp_neon
+
+#define _op_copy_rel_pt_p_dpan_neon _op_copy_pt_p_dpan_neon
+#define _op_copy_rel_pt_pan_dpan_neon _op_copy_pt_pan_dpan_neon
+#define _op_copy_rel_pt_pas_dpan_neon _op_copy_pt_pas_dpan_neon
+
+static void
+init_copy_rel_pixel_pt_funcs_neon(void)
+{
+   op_copy_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_p_dp_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_pan_dp_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_pas_dp_neon;
+
+   op_copy_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_p_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_pan_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_pas_dpan_neon;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_copy_main_.c b/src/lib/engines/common/evas_op_copy_main_.c
new file mode 100644 (file)
index 0000000..51238e7
--- /dev/null
@@ -0,0 +1,675 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_blend_private.h"
+
+static RGBA_Gfx_Func     op_copy_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+static RGBA_Gfx_Pt_Func  op_copy_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+
+static void op_copy_init(void);
+static void op_copy_shutdown(void);
+
+static RGBA_Gfx_Func op_copy_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_copy_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_copy_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_copy_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_copy_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+
+static RGBA_Gfx_Pt_Func op_copy_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_copy_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_copy_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_copy_mask_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_copy_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+
+static RGBA_Gfx_Compositor  _composite_copy = { "copy",
+ op_copy_init, op_copy_shutdown,
+ op_copy_pixel_span_get, op_copy_color_span_get,
+ op_copy_pixel_color_span_get, op_copy_mask_color_span_get,
+ op_copy_pixel_mask_span_get,
+ op_copy_pixel_pt_get, op_copy_color_pt_get,
+ op_copy_pixel_color_pt_get, op_copy_mask_color_pt_get,
+ op_copy_pixel_mask_pt_get
+ };
+
+RGBA_Gfx_Compositor  *
+evas_common_gfx_compositor_copy_get(void)
+{
+   return &(_composite_copy);
+}
+
+
+static RGBA_Gfx_Func     op_copy_rel_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+static RGBA_Gfx_Pt_Func  op_copy_rel_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+
+static void op_copy_rel_init(void);
+static void op_copy_rel_shutdown(void);
+
+static RGBA_Gfx_Func op_copy_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_copy_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_copy_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_copy_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_copy_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+
+static RGBA_Gfx_Pt_Func op_copy_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_copy_rel_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_copy_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_copy_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_copy_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+
+static RGBA_Gfx_Compositor  _composite_copy_rel = { "copy_rel",
+ op_copy_rel_init, op_copy_rel_shutdown,
+ op_copy_rel_pixel_span_get, op_copy_rel_color_span_get,
+ op_copy_rel_pixel_color_span_get, op_copy_rel_mask_color_span_get,
+ op_copy_rel_pixel_mask_span_get,
+ op_copy_rel_pixel_pt_get, op_copy_color_pt_get,
+ op_copy_rel_pixel_color_pt_get, op_copy_rel_mask_color_pt_get,
+ op_copy_rel_pixel_mask_pt_get
+ };
+
+RGBA_Gfx_Compositor  *
+evas_common_gfx_compositor_copy_rel_get(void)
+{
+   return &(_composite_copy_rel);
+}
+
+
+# include "./evas_op_copy/op_copy_pixel_.c"
+# include "./evas_op_copy/op_copy_color_.c"
+# include "./evas_op_copy/op_copy_pixel_color_.c"
+# include "./evas_op_copy/op_copy_pixel_mask_.c"
+# include "./evas_op_copy/op_copy_mask_color_.c"
+//# include "./evas_op_copy/op_copy_pixel_mask_color_.c"
+
+# include "./evas_op_copy/op_copy_pixel_i386.c"
+# include "./evas_op_copy/op_copy_color_i386.c"
+# include "./evas_op_copy/op_copy_pixel_color_i386.c"
+# include "./evas_op_copy/op_copy_pixel_mask_i386.c"
+# include "./evas_op_copy/op_copy_mask_color_i386.c"
+//# include "./evas_op_copy/op_copy_pixel_mask_color_i386.c"
+
+# include "./evas_op_copy/op_copy_pixel_neon.c"
+# include "./evas_op_copy/op_copy_color_neon.c"
+# include "./evas_op_copy/op_copy_pixel_color_neon.c"
+# include "./evas_op_copy/op_copy_pixel_mask_neon.c"
+# include "./evas_op_copy/op_copy_mask_color_neon.c"
+//# include "./evas_op_copy/op_copy_pixel_mask_color_neon.c"
+
+
+static void
+op_copy_init(void)
+{
+   memset(op_copy_span_funcs, 0, sizeof(op_copy_span_funcs));
+   memset(op_copy_pt_funcs, 0, sizeof(op_copy_pt_funcs));
+#ifdef BUILD_MMX
+   init_copy_pixel_span_funcs_mmx();
+   init_copy_pixel_color_span_funcs_mmx();
+   init_copy_pixel_mask_span_funcs_mmx();
+   init_copy_color_span_funcs_mmx();
+   init_copy_mask_color_span_funcs_mmx();
+
+   init_copy_pixel_pt_funcs_mmx();
+   init_copy_pixel_color_pt_funcs_mmx();
+   init_copy_pixel_mask_pt_funcs_mmx();
+   init_copy_color_pt_funcs_mmx();
+   init_copy_mask_color_pt_funcs_mmx();
+#endif
+#ifdef BUILD_NEON
+   init_copy_pixel_span_funcs_neon();
+   init_copy_pixel_color_span_funcs_neon();
+   init_copy_pixel_mask_span_funcs_neon();
+   init_copy_color_span_funcs_neon();
+   init_copy_mask_color_span_funcs_neon();
+
+   init_copy_pixel_pt_funcs_neon();
+   init_copy_pixel_color_pt_funcs_neon();
+   init_copy_pixel_mask_pt_funcs_neon();
+   init_copy_color_pt_funcs_neon();
+   init_copy_mask_color_pt_funcs_neon();
+#endif
+#ifdef BUILD_C
+   init_copy_pixel_span_funcs_c();
+   init_copy_pixel_color_span_funcs_c();
+   init_copy_pixel_mask_span_funcs_c();
+   init_copy_color_span_funcs_c();
+   init_copy_mask_color_span_funcs_c();
+
+   init_copy_pixel_pt_funcs_c();
+   init_copy_pixel_color_pt_funcs_c();
+   init_copy_pixel_mask_pt_funcs_c();
+   init_copy_color_pt_funcs_c();
+   init_copy_mask_color_pt_funcs_c();
+#endif
+}
+
+static void
+op_copy_shutdown(void)
+{
+}
+
+static RGBA_Gfx_Func
+copy_gfx_span_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Func  func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+    {
+      cpu = CPU_MMX;
+      func = op_copy_span_funcs[s][m][c][d][cpu];
+      if (func) return func;
+    }
+#endif
+#ifdef BUILD_NEON
+   if (evas_common_cpu_has_feature(CPU_FEATURE_NEON))
+    {
+      cpu = CPU_NEON;
+      func = op_copy_span_funcs[s][m][c][d][cpu];
+      if (func) return func;
+    }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_copy_span_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Func
+op_copy_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+     {
+       dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return copy_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_copy_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return copy_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_copy_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return copy_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_copy_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   return copy_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_copy_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   return copy_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+copy_gfx_pt_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Pt_Func  func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+    {
+      cpu = CPU_MMX;
+      func = op_copy_pt_funcs[s][m][c][d][cpu];
+      if (func) return func;
+    }
+#endif
+#ifdef BUILD_NEON
+   if (evas_common_cpu_has_feature(CPU_FEATURE_NEON))
+    {
+      cpu = CPU_NEON;
+      func = op_copy_pt_funcs[s][m][c][d][cpu];
+      if (func) return func;
+    }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_copy_pt_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Pt_Func
+op_copy_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+     {
+       dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return copy_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_copy_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return copy_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_copy_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src_flags.alpha)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return copy_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_copy_mask_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   return copy_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_copy_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if (src_flags.alpha)
+       s = SP;
+   return copy_gfx_pt_func_cpu(s, m, c, d);
+}
+
+
+static void
+op_copy_rel_init(void)
+{
+   memset(op_copy_rel_span_funcs, 0, sizeof(op_copy_rel_span_funcs));
+   memset(op_copy_rel_pt_funcs, 0, sizeof(op_copy_rel_pt_funcs));
+#ifdef BUILD_MMX
+   init_copy_rel_pixel_span_funcs_mmx();
+   init_copy_rel_pixel_color_span_funcs_mmx();
+   init_copy_rel_pixel_mask_span_funcs_mmx();
+   init_copy_rel_color_span_funcs_mmx();
+   init_copy_rel_mask_color_span_funcs_mmx();
+
+   init_copy_rel_pixel_pt_funcs_mmx();
+   init_copy_rel_pixel_color_pt_funcs_mmx();
+   init_copy_rel_pixel_mask_pt_funcs_mmx();
+   init_copy_rel_color_pt_funcs_mmx();
+   init_copy_rel_mask_color_pt_funcs_mmx();
+#endif
+#ifdef BUILD_NEON
+   init_copy_rel_pixel_span_funcs_neon();
+   init_copy_rel_pixel_color_span_funcs_neon();
+   init_copy_rel_pixel_mask_span_funcs_neon();
+   init_copy_rel_color_span_funcs_neon();
+   init_copy_rel_mask_color_span_funcs_neon();
+
+   init_copy_rel_pixel_pt_funcs_neon();
+   init_copy_rel_pixel_color_pt_funcs_neon();
+   init_copy_rel_pixel_mask_pt_funcs_neon();
+   init_copy_rel_color_pt_funcs_neon();
+   init_copy_rel_mask_color_pt_funcs_neon();
+#endif
+#ifdef BUILD_C
+   init_copy_rel_pixel_span_funcs_c();
+   init_copy_rel_pixel_color_span_funcs_c();
+   init_copy_rel_pixel_mask_span_funcs_c();
+   init_copy_rel_color_span_funcs_c();
+   init_copy_rel_mask_color_span_funcs_c();
+
+   init_copy_rel_pixel_pt_funcs_c();
+   init_copy_rel_pixel_color_pt_funcs_c();
+   init_copy_rel_pixel_mask_pt_funcs_c();
+   init_copy_rel_color_pt_funcs_c();
+   init_copy_rel_mask_color_pt_funcs_c();
+#endif
+}
+
+static void
+op_copy_rel_shutdown(void)
+{
+}
+
+static RGBA_Gfx_Func
+copy_rel_gfx_span_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Func func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+    {
+      cpu = CPU_MMX;
+      func = op_copy_rel_span_funcs[s][m][c][d][cpu];
+      if (func) return func;
+    }
+#endif
+#ifdef BUILD_NEON
+   if (evas_common_cpu_has_feature(CPU_FEATURE_NEON))
+    {
+      cpu = CPU_NEON;
+      func = op_copy_rel_span_funcs[s][m][c][d][cpu];
+      if (func) return func;
+    }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_copy_rel_span_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Func
+op_copy_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return copy_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_copy_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return copy_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_copy_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return copy_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_copy_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   return copy_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_copy_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   return copy_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+copy_rel_gfx_pt_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Pt_Func func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+    {
+      cpu = CPU_MMX;
+      func = op_copy_rel_pt_funcs[s][m][c][d][cpu];
+      if (func) return func;
+    }
+#endif
+#ifdef BUILD_NEON
+   if (evas_common_cpu_has_feature(CPU_FEATURE_NEON))
+    {
+      cpu = CPU_NEON;
+      func = op_copy_rel_pt_funcs[s][m][c][d][cpu];
+      if (func) return func;
+    }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_copy_rel_pt_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Pt_Func
+op_copy_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return copy_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_copy_rel_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return copy_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_copy_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src_flags.alpha)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return copy_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_copy_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == ((col >> 24) * 0x01010101))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   return copy_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_copy_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if (src_flags.alpha)
+       s = SP;
+   return copy_rel_gfx_pt_func_cpu(s, m, c, d);
+}
diff --git a/src/lib/engines/common/evas_op_mask/.cvsignore b/src/lib/engines/common/evas_op_mask/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/src/lib/engines/common/evas_op_mask/Makefile.am b/src/lib/engines/common/evas_op_mask/Makefile.am
new file mode 100644 (file)
index 0000000..47eefd2
--- /dev/null
@@ -0,0 +1,13 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+EXTRA_DIST = \
+op_mask_color_.c \
+op_mask_color_i386.c \
+op_mask_mask_color_.c \
+op_mask_mask_color_i386.c \
+op_mask_pixel_.c \
+op_mask_pixel_color_.c \
+op_mask_pixel_color_i386.c \
+op_mask_pixel_i386.c \
+op_mask_pixel_mask_.c \
+op_mask_pixel_mask_i386.c
diff --git a/src/lib/engines/common/evas_op_mask/op_mask_color_.c b/src/lib/engines/common/evas_op_mask/op_mask_color_.c
new file mode 100644 (file)
index 0000000..5417f32
--- /dev/null
@@ -0,0 +1,51 @@
+
+
+/* mask color --> dst */
+
+#ifdef BUILD_C
+static void
+_op_mask_c_dp(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   c = 1 + (c >> 24);
+   for (; d < e; d++) {
+       *d = MUL_256(c, *d);
+   }
+}
+
+#define _op_mask_caa_dp _op_mask_c_dp
+
+#define _op_mask_c_dpan _op_mask_c_dp
+#define _op_mask_caa_dpan _op_mask_caa_dp
+
+static void
+init_mask_color_span_funcs_c(void)
+{
+   op_mask_span_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_mask_c_dp;
+   op_mask_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_mask_caa_dp;
+
+   op_mask_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_mask_c_dpan;
+   op_mask_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_mask_pt_c_dp(DATA32 s __UNUSED__, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+       *d = MUL_SYM(c >> 24, *d);
+}
+
+#define _op_mask_pt_caa_dp _op_mask_pt_c_dp
+
+#define _op_mask_pt_c_dpan _op_mask_pt_c_dp
+#define _op_mask_pt_caa_dpan _op_mask_pt_caa_dp
+
+static void
+init_mask_color_pt_funcs_c(void)
+{
+   op_mask_pt_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_mask_pt_c_dp;
+   op_mask_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_mask_pt_caa_dp;
+
+   op_mask_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_mask_pt_c_dpan;
+   op_mask_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_pt_caa_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mask/op_mask_color_i386.c b/src/lib/engines/common/evas_op_mask/op_mask_color_i386.c
new file mode 100644 (file)
index 0000000..fb4c0e1
--- /dev/null
@@ -0,0 +1,59 @@
+
+/* mask color --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_mask_c_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   c = 1 + (c >> 24);
+   MOV_A2R(c, mm2)
+   pxor_r2r(mm0, mm0);
+   for (; d < e; d++) {
+       MOV_P2R(*d, mm1, mm0)
+       MUL4_256_R2R(mm2, mm1)
+       MOV_R2P(mm1, *d, mm0)
+   }
+}
+
+#define _op_mask_caa_dp_mmx _op_mask_c_dp_mmx
+
+#define _op_mask_c_dpan_mmx _op_mask_c_dp_mmx
+#define _op_mask_caa_dpan_mmx _op_mask_caa_dp_mmx
+
+static void
+init_mask_color_span_funcs_mmx(void)
+{
+   op_mask_span_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_mask_c_dp_mmx;
+   op_mask_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_mask_caa_dp_mmx;
+
+   op_mask_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_mask_c_dpan_mmx;
+   op_mask_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mask_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_mask_pt_c_dp_mmx(DATA32 s __UNUSED__, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+       c = 1 + (c >> 24);
+       MOV_A2R(c, mm2)
+       pxor_r2r(mm0, mm0);
+       MOV_P2R(*d, mm1, mm0)
+       MUL4_256_R2R(mm2, mm1)
+       MOV_R2P(mm1, *d, mm0)
+}
+
+#define _op_mask_pt_caa_dp_mmx _op_mask_pt_c_dp_mmx
+
+#define _op_mask_pt_c_dpan_mmx _op_mask_pt_c_dp_mmx
+#define _op_mask_pt_caa_dpan_mmx _op_mask_pt_caa_dp_mmx
+
+static void
+init_mask_color_pt_funcs_mmx(void)
+{
+   op_mask_pt_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_mask_pt_c_dp_mmx;
+   op_mask_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_mask_pt_caa_dp_mmx;
+
+   op_mask_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_mask_pt_c_dpan_mmx;
+   op_mask_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mask_pt_caa_dpan_mmx;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mask/op_mask_mask_color_.c b/src/lib/engines/common/evas_op_mask/op_mask_mask_color_.c
new file mode 100644 (file)
index 0000000..208ce19
--- /dev/null
@@ -0,0 +1,64 @@
+
+/* mask mask x color -> dst */
+
+#ifdef BUILD_C
+static void
+_op_mask_mas_c_dp(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   c = 1 + (c >> 24);
+   while (d < e) {
+       l = *m;
+       switch(l)
+         {
+           case 0:
+               break;
+           case 255:
+               *d = MUL_256(c, *d);
+               break;
+           default:
+               l = 256 - (((257 - c) * l) >> 8);
+               *d = MUL_256(l, *d);
+               break;
+         }
+       m++;  d++;
+     }
+}
+
+#define _op_mask_mas_caa_dp _op_mask_mas_c_dp
+
+#define _op_mask_mas_c_dpan _op_mask_mas_c_dp
+#define _op_mask_mas_caa_dpan _op_mask_mas_caa_dp
+
+static void
+init_mask_mask_color_span_funcs_c(void)
+{
+   op_mask_span_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_mask_mas_c_dp;
+   op_mask_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_mask_mas_caa_dp;
+
+   op_mask_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_mask_mas_c_dpan;
+   op_mask_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_mask_mas_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_mask_pt_mas_c_dp(DATA32 s __UNUSED__, DATA8 m, DATA32 c, DATA32 *d) {
+       c = 256 - (((256 - (c >> 24)) * m) >> 8);
+       *d = MUL_256(c, *d);
+}
+
+#define _op_mask_pt_mas_caa_dp _op_mask_pt_mas_c_dp
+
+#define _op_mask_pt_mas_c_dpan _op_mask_pt_mas_c_dp
+#define _op_mask_pt_mas_caa_dpan _op_mask_pt_mas_caa_dp
+
+static void
+init_mask_mask_color_pt_funcs_c(void)
+{
+   op_mask_pt_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_mask_pt_mas_c_dp;
+   op_mask_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_mask_pt_mas_caa_dp;
+
+   op_mask_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_mask_pt_mas_c_dpan;
+   op_mask_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_mask_pt_mas_caa_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mask/op_mask_mask_color_i386.c b/src/lib/engines/common/evas_op_mask/op_mask_mask_color_i386.c
new file mode 100644 (file)
index 0000000..b1cc043
--- /dev/null
@@ -0,0 +1,14 @@
+
+/* mask mask x color -> dst */
+
+#ifdef BUILD_MMX
+static void
+init_mask_mask_color_span_funcs_mmx(void)
+{}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_mask_mask_color_pt_funcs_mmx(void)
+{}
+#endif
diff --git a/src/lib/engines/common/evas_op_mask/op_mask_pixel_.c b/src/lib/engines/common/evas_op_mask/op_mask_pixel_.c
new file mode 100644 (file)
index 0000000..0e91a6d
--- /dev/null
@@ -0,0 +1,49 @@
+
+/* mask pixel --> dst */
+
+#ifdef BUILD_C
+static void
+_op_mask_p_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   for (; d < e; d++, s++) {
+       *d = MUL_SYM(*s >> 24, *d);
+   }
+}
+
+#define _op_mask_pas_dp _op_mask_p_dp
+
+#define _op_mask_p_dpan _op_mask_p_dp
+#define _op_mask_pas_dpan _op_mask_pas_dp
+
+static void
+init_mask_pixel_span_funcs_c(void)
+{
+   op_mask_span_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_mask_p_dp;
+   op_mask_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_mask_pas_dp;
+
+   op_mask_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_mask_p_dpan;
+   op_mask_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_mask_pas_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_mask_pt_p_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d) {
+       *d = MUL_SYM(s >> 24, *d);
+}
+
+#define _op_mask_pt_pas_dp _op_mask_pt_p_dp
+
+#define _op_mask_pt_p_dpan _op_mask_pt_p_dp
+#define _op_mask_pt_pas_dpan _op_mask_pt_pas_dp
+
+static void
+init_mask_pixel_pt_funcs_c(void)
+{
+   op_mask_pt_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_mask_pt_p_dp;
+   op_mask_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_mask_pt_pas_dp;
+
+   op_mask_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_mask_pt_p_dpan;
+   op_mask_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_mask_pt_pas_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_.c b/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_.c
new file mode 100644 (file)
index 0000000..d8df685
--- /dev/null
@@ -0,0 +1,101 @@
+
+/* mask pixel x color --> dst */
+
+#ifdef BUILD_C
+static void
+_op_mask_p_c_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   l = 1 + (c >> 24);
+   while (d < e) {
+       c = 1 + ((l * (*s >> 24)) >> 8);
+       *d = MUL_256(c, *d);
+       s++;  d++;
+     }
+}
+
+#define _op_mask_pas_c_dp _op_mask_p_c_dp
+#define _op_mask_pan_c_dp _op_mask_p_c_dp
+#define _op_mask_p_can_dp _op_mask_p_c_dp
+#define _op_mask_pas_can_dp _op_mask_p_c_dp
+#define _op_mask_p_caa_dp _op_mask_p_c_dp
+#define _op_mask_pas_caa_dp _op_mask_p_c_dp
+#define _op_mask_pan_caa_dp _op_mask_p_c_dp
+
+#define _op_mask_p_c_dpan _op_mask_p_c_dp
+#define _op_mask_pas_c_dpan _op_mask_p_c_dp
+#define _op_mask_pan_c_dpan _op_mask_p_c_dp
+#define _op_mask_p_can_dpan _op_mask_p_c_dp
+#define _op_mask_pas_can_dpan _op_mask_p_c_dp
+#define _op_mask_p_caa_dpan _op_mask_p_c_dp
+#define _op_mask_pas_caa_dpan _op_mask_p_c_dp
+#define _op_mask_pan_caa_dpan _op_mask_p_c_dp
+
+static void
+init_mask_pixel_color_span_funcs_c(void)
+{
+   op_mask_span_funcs[SP][SM_N][SC][DP][CPU_C] = _op_mask_p_c_dp;
+   op_mask_span_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_mask_pas_c_dp;
+   op_mask_span_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_mask_pan_c_dp;
+   op_mask_span_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_mask_p_can_dp;
+   op_mask_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_mask_pas_can_dp;
+   op_mask_span_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_mask_p_caa_dp;
+   op_mask_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_mask_pas_caa_dp;
+   op_mask_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_mask_pan_caa_dp;
+
+   op_mask_span_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_mask_p_c_dpan;
+   op_mask_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_mask_pas_c_dpan;
+   op_mask_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_mask_pan_c_dpan;
+   op_mask_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_mask_p_can_dpan;
+   op_mask_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_mask_pas_can_dpan;
+   op_mask_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_p_caa_dpan;
+   op_mask_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_pas_caa_dpan;
+   op_mask_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_pan_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_mask_pt_p_c_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+       c = 1 + ((((c >> 24) * (s >> 24)) + 255) >> 8);
+       *d = MUL_256(c, *d);
+}
+
+#define _op_mask_pt_pas_c_dp _op_mask_pt_p_c_dp
+#define _op_mask_pt_pan_c_dp _op_mask_pt_p_c_dp
+#define _op_mask_pt_p_can_dp _op_mask_pt_p_c_dp
+#define _op_mask_pt_pas_can_dp _op_mask_pt_p_c_dp
+#define _op_mask_pt_p_caa_dp _op_mask_pt_p_c_dp
+#define _op_mask_pt_pas_caa_dp _op_mask_pt_p_c_dp
+#define _op_mask_pt_pan_caa_dp _op_mask_pt_p_c_dp
+
+#define _op_mask_pt_p_c_dpan _op_mask_pt_p_c_dp
+#define _op_mask_pt_pas_c_dpan _op_mask_pt_p_c_dp
+#define _op_mask_pt_pan_c_dpan _op_mask_pt_p_c_dp
+#define _op_mask_pt_p_can_dpan _op_mask_pt_p_c_dp
+#define _op_mask_pt_pas_can_dpan _op_mask_pt_p_c_dp
+#define _op_mask_pt_p_caa_dpan _op_mask_pt_p_c_dp
+#define _op_mask_pt_pas_caa_dpan _op_mask_pt_p_c_dp
+#define _op_mask_pt_pan_caa_dpan _op_mask_pt_p_c_dp
+
+static void
+init_mask_pixel_color_pt_funcs_c(void)
+{
+   op_mask_pt_funcs[SP][SM_N][SC][DP][CPU_C] = _op_mask_pt_p_c_dp;
+   op_mask_pt_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_mask_pt_pas_c_dp;
+   op_mask_pt_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_mask_pt_pan_c_dp;
+   op_mask_pt_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_mask_pt_p_can_dp;
+   op_mask_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_mask_pt_pas_can_dp;
+   op_mask_pt_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_mask_pt_p_caa_dp;
+   op_mask_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_mask_pt_pas_caa_dp;
+   op_mask_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_mask_pt_pan_caa_dp;
+
+   op_mask_pt_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_mask_pt_p_c_dpan;
+   op_mask_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_mask_pt_pas_c_dpan;
+   op_mask_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_mask_pt_pan_c_dpan;
+   op_mask_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_mask_pt_p_can_dpan;
+   op_mask_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_mask_pt_pas_can_dpan;
+   op_mask_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_pt_p_caa_dpan;
+   op_mask_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_pt_pas_caa_dpan;
+   op_mask_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_pt_pan_caa_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_i386.c b/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_i386.c
new file mode 100644 (file)
index 0000000..8f6c89d
--- /dev/null
@@ -0,0 +1,14 @@
+
+/* mask pixel x color --> dst */
+
+#ifdef BUILD_MMX
+static void
+init_mask_pixel_color_span_funcs_mmx(void)
+{ }
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_mask_pixel_color_pt_funcs_mmx(void)
+{ }
+#endif
diff --git a/src/lib/engines/common/evas_op_mask/op_mask_pixel_i386.c b/src/lib/engines/common/evas_op_mask/op_mask_pixel_i386.c
new file mode 100644 (file)
index 0000000..ef98f17
--- /dev/null
@@ -0,0 +1,59 @@
+
+/* mask pixel --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_mask_p_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   MOV_A2R(ALPHA_255, mm5)
+   pxor_r2r(mm0, mm0);
+   for (; d < e; d++) {
+       MOV_P2R(*d, mm1, mm0)
+       MOV_PA2R(*s, mm2)
+       MUL4_SYM_R2R(mm2, mm1, mm5)
+       MOV_R2P(mm1, *d, mm0)
+   }
+}
+
+#define _op_mask_pas_dp_mmx _op_mask_p_dp_mmx
+
+#define _op_mask_p_dpan_mmx _op_mask_p_dp_mmx
+#define _op_mask_pas_dpan_mmx _op_mask_pas_dp_mmx
+
+static void
+init_mask_pixel_span_funcs_mmx(void)
+{
+   op_mask_span_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_mask_p_dp_mmx;
+   op_mask_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_mask_pas_dp_mmx;
+
+   op_mask_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mask_p_dpan_mmx;
+   op_mask_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mask_pas_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_mask_pt_p_dp_mmx(DATA32 s, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d) {
+       MOV_A2R(ALPHA_255, mm5)
+       pxor_r2r(mm0, mm0);
+       MOV_P2R(*d, mm1, mm0)
+       MOV_PA2R(s, mm2)
+       MUL4_SYM_R2R(mm2, mm1, mm5)
+       MOV_R2P(mm1, *d, mm0)
+}
+
+#define _op_mask_pt_pas_dp_mmx _op_mask_pt_p_dp_mmx
+
+#define _op_mask_pt_p_dpan_mmx _op_mask_pt_p_dp_mmx
+#define _op_mask_pt_pas_dpan_mmx _op_mask_pt_pas_dp_mmx
+
+static void
+init_mask_pixel_pt_funcs_mmx(void)
+{
+   op_mask_pt_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_mask_pt_p_dp_mmx;
+   op_mask_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_mask_pt_pas_dp_mmx;
+
+   op_mask_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mask_pt_p_dpan_mmx;
+   op_mask_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mask_pt_pas_dpan_mmx;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_.c b/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_.c
new file mode 100644 (file)
index 0000000..46282eb
--- /dev/null
@@ -0,0 +1,63 @@
+
+/* mask pixel x mask --> dst */
+
+#ifdef BUILD_C
+static void 
+_op_mask_p_mas_dp(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   while (d < e) {
+       l = *m;
+       switch(l)
+         {
+           case 0:
+               break;
+           case 255:
+               *d = MUL_SYM(*s >> 24, *d);
+               break;
+           default:
+               l = 256 - (((256 - (*s >> 24)) * l) >> 8);
+               *d = MUL_256(l, *d);
+               break;
+         }
+       m++;  s++;  d++;
+     }
+}
+
+#define _op_mask_pas_mas_dp _op_mask_p_mas_dp
+
+#define _op_mask_p_mas_dpan _op_mask_p_mas_dp
+#define _op_mask_pas_mas_dpan _op_mask_pas_mas_dp
+
+static void
+init_mask_pixel_mask_span_funcs_c(void)
+{
+   op_mask_span_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_mask_p_mas_dp;
+   op_mask_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_mask_pas_mas_dp;
+
+   op_mask_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_mask_p_mas_dpan;
+   op_mask_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_mask_pas_mas_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void 
+_op_mask_pt_p_mas_dp(DATA32 s, DATA8 m, DATA32 c __UNUSED__, DATA32 *d) {
+       s = 256 - (((256 - (s >> 24)) * m) >> 8);
+       *d = MUL_256(s, *d);
+}
+
+#define _op_mask_pt_pas_mas_dp _op_mask_pt_p_mas_dp
+
+#define _op_mask_pt_p_mas_dpan _op_mask_pt_p_mas_dp
+#define _op_mask_pt_pas_mas_dpan _op_mask_pt_pas_mas_dp
+
+static void
+init_mask_pixel_mask_pt_funcs_c(void)
+{
+   op_mask_pt_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_mask_pt_p_mas_dp;
+   op_mask_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_mask_pt_pas_mas_dp;
+
+   op_mask_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_mask_pt_p_mas_dpan;
+   op_mask_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_mask_pt_pas_mas_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_i386.c b/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_i386.c
new file mode 100644 (file)
index 0000000..285ebbc
--- /dev/null
@@ -0,0 +1,14 @@
+
+/* mask pixel x mask --> dst */
+
+#ifdef BUILD_MMX
+static void
+init_mask_pixel_mask_span_funcs_mmx(void)
+{ }
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_mask_pixel_mask_pt_funcs_mmx(void)
+{ }
+#endif
diff --git a/src/lib/engines/common/evas_op_mask_main_.c b/src/lib/engines/common/evas_op_mask_main_.c
new file mode 100644 (file)
index 0000000..bbe497a
--- /dev/null
@@ -0,0 +1,309 @@
+#include "evas_common.h"
+
+static RGBA_Gfx_Func     op_mask_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+static RGBA_Gfx_Pt_Func  op_mask_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+
+static void op_mask_init(void);
+static void op_mask_shutdown(void);
+
+static RGBA_Gfx_Func op_mask_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_mask_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_mask_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_mask_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+
+static RGBA_Gfx_Pt_Func op_mask_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_mask_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_mask_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_mask_mask_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_mask_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+
+static RGBA_Gfx_Compositor  _composite_mask = { "mask",
+ op_mask_init, op_mask_shutdown,
+ op_mask_pixel_span_get, op_mask_color_span_get,
+ op_mask_pixel_color_span_get, op_mask_mask_color_span_get,
+ op_mask_pixel_mask_span_get,
+ op_mask_pixel_pt_get, op_mask_color_pt_get,
+ op_mask_pixel_color_pt_get, op_mask_mask_color_pt_get,
+ op_mask_pixel_mask_pt_get
+ };
+
+RGBA_Gfx_Compositor  *
+evas_common_gfx_compositor_mask_get(void)
+{
+   return &(_composite_mask);
+}
+
+
+# include "./evas_op_mask/op_mask_pixel_.c"
+# include "./evas_op_mask/op_mask_color_.c"
+# include "./evas_op_mask/op_mask_pixel_color_.c"
+# include "./evas_op_mask/op_mask_pixel_mask_.c"
+# include "./evas_op_mask/op_mask_mask_color_.c"
+//# include "./evas_op_mask/op_mask_pixel_mask_color_.c"
+
+# include "./evas_op_mask/op_mask_pixel_i386.c"
+# include "./evas_op_mask/op_mask_color_i386.c"
+# include "./evas_op_mask/op_mask_pixel_color_i386.c"
+# include "./evas_op_mask/op_mask_pixel_mask_i386.c"
+# include "./evas_op_mask/op_mask_mask_color_i386.c"
+//# include "./evas_op_mask/op_mask_pixel_mask_color_i386.c"
+
+
+static void
+op_mask_init(void)
+{
+   memset(op_mask_span_funcs, 0, sizeof(op_mask_span_funcs));
+   memset(op_mask_pt_funcs, 0, sizeof(op_mask_pt_funcs));
+#ifdef BUILD_MMX
+   init_mask_pixel_span_funcs_mmx();
+   init_mask_pixel_color_span_funcs_mmx();
+   init_mask_pixel_mask_span_funcs_mmx();
+   init_mask_color_span_funcs_mmx();
+   init_mask_mask_color_span_funcs_mmx();
+
+   init_mask_pixel_pt_funcs_mmx();
+   init_mask_pixel_color_pt_funcs_mmx();
+   init_mask_pixel_mask_pt_funcs_mmx();
+   init_mask_color_pt_funcs_mmx();
+   init_mask_mask_color_pt_funcs_mmx();
+#endif
+#ifdef BUILD_C
+   init_mask_pixel_span_funcs_c();
+   init_mask_pixel_color_span_funcs_c();
+   init_mask_pixel_mask_span_funcs_c();
+   init_mask_color_span_funcs_c();
+   init_mask_mask_color_span_funcs_c();
+
+   init_mask_pixel_pt_funcs_c();
+   init_mask_pixel_color_pt_funcs_c();
+   init_mask_pixel_mask_pt_funcs_c();
+   init_mask_color_pt_funcs_c();
+   init_mask_mask_color_pt_funcs_c();
+#endif
+}
+
+static void
+op_mask_shutdown(void)
+{
+}
+
+static RGBA_Gfx_Func
+mask_gfx_span_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Func func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+    {
+      cpu = CPU_MMX;
+      func = op_mask_span_funcs[s][m][c][d][cpu];
+      if (func) return func;
+    }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_mask_span_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Func
+op_mask_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+     {
+       dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return mask_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return mask_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_mask_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return mask_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_mask_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   return mask_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_mask_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   return mask_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+mask_gfx_pt_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Pt_Func func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+    {
+      cpu = CPU_MMX;
+      func = op_mask_pt_funcs[s][m][c][d][cpu];
+      if (func) return func;
+    }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_mask_pt_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Pt_Func
+op_mask_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+     {
+       dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return mask_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_mask_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return mask_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_mask_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src_flags.alpha)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return mask_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_mask_mask_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   return mask_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_mask_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if (src_flags.alpha)
+       s = SP;
+   return mask_gfx_pt_func_cpu(s, m, c, d);
+}
diff --git a/src/lib/engines/common/evas_op_mul/.cvsignore b/src/lib/engines/common/evas_op_mul/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/src/lib/engines/common/evas_op_mul/Makefile.am b/src/lib/engines/common/evas_op_mul/Makefile.am
new file mode 100644 (file)
index 0000000..e3d0b82
--- /dev/null
@@ -0,0 +1,13 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+EXTRA_DIST = \
+op_mul_color_.c \
+op_mul_color_i386.c \
+op_mul_mask_color_.c \
+op_mul_mask_color_i386.c \
+op_mul_pixel_.c \
+op_mul_pixel_color_.c \
+op_mul_pixel_color_i386.c \
+op_mul_pixel_i386.c \
+op_mul_pixel_mask_.c \
+op_mul_pixel_mask_i386.c
diff --git a/src/lib/engines/common/evas_op_mul/op_mul_color_.c b/src/lib/engines/common/evas_op_mul/op_mul_color_.c
new file mode 100644 (file)
index 0000000..4267a49
--- /dev/null
@@ -0,0 +1,66 @@
+
+/* mul color --> dst */
+
+#ifdef BUILD_C
+static void
+_op_mul_c_dp(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   for (; d < e; d++) {
+      *d = MUL4_SYM(c, *d);
+   }
+}
+
+static void
+_op_mul_caa_dp(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   c = 1 + (c >> 24);
+   for (; d < e; d++) {
+      *d = MUL_256(c, *d);
+   }
+}
+
+#define _op_mul_can_dp _op_mul_c_dp
+
+#define _op_mul_c_dpan _op_mul_c_dp
+#define _op_mul_can_dpan _op_mul_can_dp
+#define _op_mul_caa_dpan _op_mul_caa_dp
+
+static void
+init_mul_color_span_funcs_c(void)
+{
+   op_mul_span_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_mul_c_dp;
+   op_mul_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_C] = _op_mul_can_dp;
+   op_mul_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_mul_caa_dp;
+
+   op_mul_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_mul_c_dpan;
+   op_mul_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_can_dpan;
+   op_mul_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_mul_pt_c_dp(DATA32 s __UNUSED__, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+       *d = MUL4_SYM(c, *d);
+}
+
+#define _op_mul_pt_can_dp _op_mul_pt_c_dp
+#define _op_mul_pt_caa_dp _op_mul_pt_c_dp
+
+#define _op_mul_pt_c_dpan _op_mul_pt_c_dp
+#define _op_mul_pt_can_dpan _op_mul_pt_can_dp
+#define _op_mul_pt_caa_dpan _op_mul_pt_caa_dp
+
+static void
+init_mul_color_pt_funcs_c(void)
+{
+   op_mul_pt_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_mul_pt_c_dp;
+   op_mul_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_C] = _op_mul_pt_can_dp;
+   op_mul_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_mul_pt_caa_dp;
+
+   op_mul_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_mul_pt_c_dpan;
+   op_mul_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_pt_can_dpan;
+   op_mul_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_pt_caa_dpan;
+}
+#endif
+
diff --git a/src/lib/engines/common/evas_op_mul/op_mul_color_i386.c b/src/lib/engines/common/evas_op_mul/op_mul_color_i386.c
new file mode 100644 (file)
index 0000000..f2780e8
--- /dev/null
@@ -0,0 +1,67 @@
+
+/* mul color --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_mul_c_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+   MOV_P2R(c, mm2, mm0)
+   for (; d < e; d++) {
+       MOV_P2R(*d, mm1, mm0)
+       MUL4_SYM_R2R(mm2, mm1, mm5)
+       MOV_R2P(mm1, *d, mm0)
+   }
+}
+
+#define _op_mul_can_dp_mmx _op_mul_c_dp_mmx
+#define _op_mul_caa_dp_mmx _op_mul_c_dp_mmx
+
+#define _op_mul_c_dpan_mmx _op_mul_c_dp_mmx
+#define _op_mul_can_dpan_mmx _op_mul_can_dp_mmx
+#define _op_mul_caa_dpan_mmx _op_mul_caa_dp_mmx
+
+static void
+init_mul_color_span_funcs_mmx(void)
+{
+   op_mul_span_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_mul_c_dp_mmx;
+   op_mul_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_can_dp_mmx;
+   op_mul_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_caa_dp_mmx;
+
+   op_mul_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_c_dpan_mmx;
+   op_mul_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_can_dpan_mmx;
+   op_mul_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_mul_pt_c_dp_mmx(DATA32 s __UNUSED__, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+       pxor_r2r(mm0, mm0);
+       MOV_A2R(ALPHA_255, mm5)
+       MOV_P2R(c, mm2, mm0)
+       MOV_P2R(*d, mm1, mm0)
+       MUL4_SYM_R2R(mm2, mm1, mm5)
+       MOV_R2P(mm1, *d, mm0)
+}
+
+#define _op_mul_pt_caa_dp_mmx _op_mul_pt_c_dp_mmx
+#define _op_mul_pt_can_dp_mmx _op_mul_pt_c_dp_mmx
+
+#define _op_mul_pt_c_dpan_mmx _op_mul_pt_c_dp_mmx
+#define _op_mul_pt_can_dpan_mmx _op_mul_pt_can_dp_mmx
+#define _op_mul_pt_caa_dpan_mmx _op_mul_pt_caa_dp_mmx
+
+static void
+init_mul_color_pt_funcs_mmx(void)
+{
+   op_mul_pt_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_mul_pt_c_dp_mmx;
+   op_mul_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_pt_can_dp_mmx;
+   op_mul_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_pt_caa_dp_mmx;
+
+   op_mul_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_pt_c_dpan_mmx;
+   op_mul_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_pt_can_dpan_mmx;
+   op_mul_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_pt_caa_dpan_mmx;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mul/op_mul_mask_color_.c b/src/lib/engines/common/evas_op_mul/op_mul_mask_color_.c
new file mode 100644 (file)
index 0000000..5c2b5be
--- /dev/null
@@ -0,0 +1,73 @@
+
+/* mul mask x color -> dst */
+
+#ifdef BUILD_C
+static void
+_op_mul_mas_c_dp(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l, nc = ~c;
+   while (d < e)
+     {
+       DATA32 a = *m;
+       switch(a)
+         {
+           case 0:
+               break;
+           case 255:
+               *d = MUL4_SYM(c, *d);
+               break;
+           default:
+               a = ~MUL_SYM(a, nc);
+               *d = MUL4_SYM(a, *d);
+               break;
+         }
+       m++;  d++;
+     }
+}
+
+#define _op_mul_mas_can_dp _op_mul_mas_c_dp
+#define _op_mul_mas_caa_dp _op_mul_mas_c_dp
+
+#define _op_mul_mas_c_dpan _op_mul_mas_c_dp
+#define _op_mul_mas_can_dpan _op_mul_mas_can_dp
+#define _op_mul_mas_caa_dpan _op_mul_mas_caa_dp
+
+static void
+init_mul_mask_color_span_funcs_c(void)
+{
+   op_mul_span_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_mul_mas_c_dp;
+   op_mul_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_mul_mas_can_dp;
+   op_mul_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_mul_mas_caa_dp;
+
+   op_mul_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_mul_mas_c_dpan;
+   op_mul_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_mul_mas_can_dpan;
+   op_mul_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_mul_mas_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_mul_pt_mas_c_dp(DATA32 s __UNUSED__, DATA8 m, DATA32 c, DATA32 *d) {
+       c = ~c;
+       c = ~MUL_SYM(m, c);
+       *d = MUL4_SYM(c, *d);
+}
+
+#define _op_mul_pt_mas_can_dp _op_mul_pt_mas_c_dp
+#define _op_mul_pt_mas_caa_dp _op_mul_pt_mas_c_dp
+
+#define _op_mul_pt_mas_c_dpan _op_mul_pt_mas_c_dp
+#define _op_mul_pt_mas_can_dpan _op_mul_pt_mas_can_dp
+#define _op_mul_pt_mas_caa_dpan _op_mul_pt_mas_caa_dp
+
+static void
+init_mul_mask_color_pt_funcs_c(void)
+{
+   op_mul_pt_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_mul_pt_mas_c_dp;
+   op_mul_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_mul_pt_mas_can_dp;
+   op_mul_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_mul_pt_mas_caa_dp;
+
+   op_mul_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_mul_pt_mas_c_dpan;
+   op_mul_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_mul_pt_mas_can_dpan;
+   op_mul_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_mul_pt_mas_caa_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mul/op_mul_mask_color_i386.c b/src/lib/engines/common/evas_op_mul/op_mul_mask_color_i386.c
new file mode 100644 (file)
index 0000000..0573e70
--- /dev/null
@@ -0,0 +1,93 @@
+
+/* mul mask x color -> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_mul_mas_c_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   MOV_P2R(c, mm2, mm0)
+   c = ~c;
+   MOV_P2R(c, mm3, mm0)
+   MOV_A2R(ALPHA_255, mm5)
+   pxor_r2r(mm0, mm0);
+   while (d < e) {
+       DATA32 a = *m;
+       switch(a)
+         {
+           case 0:
+               break;
+           case 255:
+               MOV_P2R(*d, mm1, mm0)
+               MUL4_SYM_R2R(mm2, mm1, mm5)
+               MOV_R2P(mm1, *d, mm0)
+               break;
+           default:
+               a++;
+               MOV_A2R(a, mm1)
+               MUL4_256_R2R(mm3, mm1)
+               movq_r2r(mm5, mm4);
+               psubw_r2r(mm1, mm4);
+               MOV_P2R(*d, mm1, mm0)
+               MUL4_SYM_R2R(mm4, mm1, mm5)
+               MOV_R2P(mm1, *d, mm0)
+               break;
+         }
+       m++;  d++;
+     }
+}
+
+#define _op_mul_mas_can_dp_mmx _op_mul_mas_c_dp_mmx
+#define _op_mul_mas_caa_dp_mmx _op_mul_mas_c_dp_mmx
+
+#define _op_mul_mas_c_dpan_mmx _op_mul_mas_c_dp_mmx
+#define _op_mul_mas_can_dpan_mmx _op_mul_mas_can_dp_mmx
+#define _op_mul_mas_caa_dpan_mmx _op_mul_mas_caa_dp_mmx
+
+static void
+init_mul_mask_color_span_funcs_mmx(void)
+{
+   op_mul_span_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_mul_mas_c_dp_mmx;
+   op_mul_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_mul_mas_can_dp_mmx;
+   op_mul_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_mul_mas_caa_dp_mmx;
+
+   op_mul_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_mul_mas_c_dpan_mmx;
+   op_mul_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_mul_mas_can_dpan_mmx;
+   op_mul_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_mul_mas_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_mul_pt_mas_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+       s = m + 1;
+       c = ~c;
+       MOV_P2R(c, mm3, mm0)
+       MOV_A2R(ALPHA_255, mm4)
+       pxor_r2r(mm0, mm0);
+       MOV_A2R(s, mm1)
+       MUL4_256_R2R(mm3, mm1)
+       psubw_r2r(mm1, mm4);
+       MOV_P2R(*d, mm1, mm0)
+       MUL4_SYM_R2R(mm4, mm1, mm5)
+       MOV_R2P(mm1, *d, mm0)
+}
+
+#define _op_mul_pt_mas_can_dp_mmx _op_mul_pt_mas_c_dp_mmx
+#define _op_mul_pt_mas_caa_dp_mmx _op_mul_pt_mas_c_dp_mmx
+
+#define _op_mul_pt_mas_c_dpan_mmx _op_mul_pt_mas_c_dp_mmx
+#define _op_mul_pt_mas_can_dpan_mmx _op_mul_pt_mas_can_dp_mmx
+#define _op_mul_pt_mas_caa_dpan_mmx _op_mul_pt_mas_caa_dp_mmx
+
+static void
+init_mul_mask_color_pt_funcs_mmx(void)
+{
+   op_mul_pt_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_mul_pt_mas_c_dp_mmx;
+   op_mul_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_mul_pt_mas_can_dp_mmx;
+   op_mul_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_mul_pt_mas_caa_dp_mmx;
+
+   op_mul_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_mul_pt_mas_c_dpan_mmx;
+   op_mul_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_mul_pt_mas_can_dpan_mmx;
+   op_mul_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_mul_pt_mas_caa_dpan_mmx;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mul/op_mul_pixel_.c b/src/lib/engines/common/evas_op_mul/op_mul_pixel_.c
new file mode 100644 (file)
index 0000000..2a04ab2
--- /dev/null
@@ -0,0 +1,57 @@
+
+/* mul pixel --> dst */
+
+#ifdef BUILD_C
+static void
+_op_mul_p_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   for (; d < e; d++, s++) {
+      *d = MUL4_SYM(*s, *d);
+   }
+}
+
+#define _op_mul_pas_dp _op_mul_p_dp
+#define _op_mul_pan_dp _op_mul_p_dp
+
+#define _op_mul_p_dpan _op_mul_p_dp
+#define _op_mul_pas_dpan _op_mul_pas_dp
+#define _op_mul_pan_dpan _op_mul_pan_dp
+
+static void
+init_mul_pixel_span_funcs_c(void)
+{
+   op_mul_span_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_mul_p_dp;
+   op_mul_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_mul_pas_dp;
+   op_mul_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_mul_pan_dp;
+
+   op_mul_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_mul_p_dpan;
+   op_mul_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_mul_pas_dpan;
+   op_mul_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_mul_pan_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_mul_pt_p_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d) {
+      *d = MUL4_SYM(s, *d);
+}
+
+#define _op_mul_pt_pas_dp _op_mul_pt_p_dp
+#define _op_mul_pt_pan_dp _op_mul_pt_p_dp
+
+#define _op_mul_pt_p_dpan _op_mul_pt_p_dp
+#define _op_mul_pt_pan_dpan _op_mul_pt_pan_dp
+#define _op_mul_pt_pas_dpan _op_mul_pt_pas_dp
+
+static void
+init_mul_pixel_pt_funcs_c(void)
+{
+   op_mul_pt_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_mul_pt_p_dp;
+   op_mul_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_mul_pt_pas_dp;
+   op_mul_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_mul_pt_pan_dp;
+
+   op_mul_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_mul_pt_p_dpan;
+   op_mul_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_mul_pt_pas_dpan;
+   op_mul_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_mul_pt_pan_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_.c b/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_.c
new file mode 100644 (file)
index 0000000..0246a0d
--- /dev/null
@@ -0,0 +1,123 @@
+
+/* mul pixel x color --> dst */
+
+#ifdef BUILD_C
+static void
+_op_mul_p_c_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   while (d < e) {
+       DATA32 cs = MUL4_SYM(c, *s);
+       *d = MUL4_SYM(cs, *d);
+       s++;  d++;
+     }
+}
+
+static void
+_op_mul_p_caa_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   c = 1 + (c >> 24);
+   while (d < e)
+     {
+       DATA32 cs = MUL_256(c, *s);
+       *d = MUL4_SYM(cs, *d);
+       s++;  d++;
+     }
+}
+
+#define _op_mul_pas_c_dp _op_mul_p_c_dp
+#define _op_mul_pan_c_dp _op_mul_p_c_dp
+#define _op_mul_p_can_dp _op_mul_p_c_dp
+#define _op_mul_pas_can_dp _op_mul_p_c_dp
+#define _op_mul_pan_can_dp _op_mul_p_c_dp
+#define _op_mul_pas_caa_dp _op_mul_p_caa_dp
+#define _op_mul_pan_caa_dp _op_mul_p_caa_dp
+
+#define _op_mul_p_c_dpan _op_mul_p_c_dp
+#define _op_mul_pas_c_dpan _op_mul_pas_c_dp
+#define _op_mul_pan_c_dpan _op_mul_pan_c_dp
+#define _op_mul_p_can_dpan _op_mul_p_can_dp
+#define _op_mul_pas_can_dpan _op_mul_pas_can_dp
+#define _op_mul_pan_can_dpan _op_mul_pan_can_dp
+#define _op_mul_p_caa_dpan _op_mul_p_caa_dp
+#define _op_mul_pas_caa_dpan _op_mul_pas_caa_dp
+#define _op_mul_pan_caa_dpan _op_mul_pan_caa_dp
+
+static void
+init_mul_pixel_color_span_funcs_c(void)
+{
+   op_mul_span_funcs[SP][SM_N][SC][DP][CPU_C] = _op_mul_p_c_dp;
+   op_mul_span_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_mul_pas_c_dp;
+   op_mul_span_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_mul_pan_c_dp;
+   op_mul_span_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_mul_p_can_dp;
+   op_mul_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_mul_pas_can_dp;
+   op_mul_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_mul_pan_can_dp;
+   op_mul_span_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_mul_p_caa_dp;
+   op_mul_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_mul_pas_caa_dp;
+   op_mul_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_mul_pan_caa_dp;
+
+   op_mul_span_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_mul_p_c_dpan;
+   op_mul_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_mul_pas_c_dpan;
+   op_mul_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_mul_pan_c_dpan;
+   op_mul_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_p_can_dpan;
+   op_mul_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_pas_can_dpan;
+   op_mul_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_pan_can_dpan;
+   op_mul_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_p_caa_dpan;
+   op_mul_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_pas_caa_dpan;
+   op_mul_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_pan_caa_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_mul_pt_p_c_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+       s = MUL4_SYM(c, s);
+       *d = MUL4_SYM(s, *d);
+}
+
+static void
+_op_mul_pt_p_caa_dp(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+       s = MUL_SYM(c >> 24, s);
+       *d = MUL4_SYM(s, *d);
+}
+
+#define _op_mul_pt_pas_c_dp _op_mul_pt_p_c_dp
+#define _op_mul_pt_pan_c_dp _op_mul_pt_p_c_dp
+#define _op_mul_pt_p_can_dp _op_mul_pt_p_c_dp
+#define _op_mul_pt_pas_can_dp _op_mul_pt_p_c_dp
+#define _op_mul_pt_pan_can_dp _op_mul_pt_p_c_dp
+#define _op_mul_pt_pas_caa_dp _op_mul_pt_p_caa_dp
+#define _op_mul_pt_pan_caa_dp _op_mul_pt_p_caa_dp
+
+#define _op_mul_pt_p_c_dpan _op_mul_pt_p_c_dp
+#define _op_mul_pt_pan_c_dpan _op_mul_pt_pan_c_dp
+#define _op_mul_pt_pas_c_dpan _op_mul_pt_pas_c_dp
+#define _op_mul_pt_p_can_dpan _op_mul_pt_p_can_dp
+#define _op_mul_pt_pan_can_dpan _op_mul_pt_pan_can_dp
+#define _op_mul_pt_pas_can_dpan _op_mul_pt_pas_can_dp
+#define _op_mul_pt_p_caa_dpan _op_mul_pt_p_caa_dp
+#define _op_mul_pt_pan_caa_dpan _op_mul_pt_pan_caa_dp
+#define _op_mul_pt_pas_caa_dpan _op_mul_pt_pas_caa_dp
+static void
+init_mul_pixel_color_pt_funcs_c(void)
+{
+   op_mul_pt_funcs[SP][SM_N][SC][DP][CPU_C] = _op_mul_pt_p_c_dp;
+   op_mul_pt_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_mul_pt_pas_c_dp;
+   op_mul_pt_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_mul_pt_pan_c_dp;
+   op_mul_pt_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_mul_pt_p_can_dp;
+   op_mul_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_mul_pt_pas_can_dp;
+   op_mul_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_mul_pt_pan_can_dp;
+   op_mul_pt_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_mul_pt_p_caa_dp;
+   op_mul_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_mul_pt_pas_caa_dp;
+   op_mul_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_mul_pt_pan_caa_dp;
+
+   op_mul_pt_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_mul_pt_p_c_dpan;
+   op_mul_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_mul_pt_pas_c_dpan;
+   op_mul_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_mul_pt_pan_c_dpan;
+   op_mul_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_pt_p_can_dpan;
+   op_mul_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_pt_pas_can_dpan;
+   op_mul_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_pt_pan_can_dpan;
+   op_mul_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_pt_p_caa_dpan;
+   op_mul_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_pt_pas_caa_dpan;
+   op_mul_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_pt_pan_caa_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_i386.c b/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_i386.c
new file mode 100644 (file)
index 0000000..1c5d755
--- /dev/null
@@ -0,0 +1,121 @@
+
+/* mul pixel x color --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_mul_p_c_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   MOV_A2R(ALPHA_255, mm5)
+   pxor_r2r(mm0, mm0);
+   MOV_P2R(c, mm2, mm0)
+   while (d < e)
+     {
+       MOV_P2R(*s, mm3, mm0)
+       MUL4_SYM_R2R(mm2, mm3, mm5)
+       MOV_P2R(*d, mm1, mm0)
+       MUL4_SYM_R2R(mm3, mm1, mm5)
+       MOV_R2P(mm1, *d, mm0)
+       s++;  d++;
+     }
+}
+
+#define _op_mul_pas_c_dp_mmx _op_mul_p_c_dp_mmx
+#define _op_mul_pan_c_dp_mmx _op_mul_p_c_dp_mmx
+#define _op_mul_p_can_dp_mmx _op_mul_p_c_dp_mmx
+#define _op_mul_pas_can_dp_mmx _op_mul_p_c_dp_mmx
+#define _op_mul_pan_can_dp_mmx _op_mul_p_c_dp_mmx
+#define _op_mul_p_caa_dp_mmx _op_mul_p_c_dp_mmx
+#define _op_mul_pas_caa_dp_mmx _op_mul_p_c_dp_mmx
+#define _op_mul_pan_caa_dp_mmx _op_mul_p_c_dp_mmx
+
+#define _op_mul_p_c_dpan_mmx _op_mul_p_c_dp_mmx
+#define _op_mul_pan_c_dpan_mmx _op_mul_pan_c_dp_mmx
+#define _op_mul_pas_c_dpan_mmx _op_mul_pas_c_dp_mmx
+#define _op_mul_p_can_dpan_mmx _op_mul_p_can_dp_mmx
+#define _op_mul_pan_can_dpan_mmx _op_mul_pan_can_dp_mmx
+#define _op_mul_pas_can_dpan_mmx _op_mul_pas_can_dp_mmx
+#define _op_mul_p_caa_dpan_mmx _op_mul_p_caa_dp_mmx
+#define _op_mul_pan_caa_dpan_mmx _op_mul_pan_caa_dp_mmx
+#define _op_mul_pas_caa_dpan_mmx _op_mul_pas_caa_dp_mmx
+
+static void
+init_mul_pixel_color_span_funcs_mmx(void)
+{
+   op_mul_span_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_mul_p_c_dp_mmx;
+   op_mul_span_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_mul_pas_c_dp_mmx;
+   op_mul_span_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_mul_pan_c_dp_mmx;
+   op_mul_span_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_p_can_dp_mmx;
+   op_mul_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_pas_can_dp_mmx;
+   op_mul_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_pan_can_dp_mmx;
+   op_mul_span_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_p_caa_dp_mmx;
+   op_mul_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_pas_caa_dp_mmx;
+   op_mul_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_pan_caa_dp_mmx;
+
+   op_mul_span_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_p_c_dpan_mmx;
+   op_mul_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_pas_c_dpan_mmx;
+   op_mul_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_pan_c_dpan_mmx;
+   op_mul_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_p_can_dpan_mmx;
+   op_mul_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_pas_can_dpan_mmx;
+   op_mul_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_pan_can_dpan_mmx;
+   op_mul_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_p_caa_dpan_mmx;
+   op_mul_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_pas_caa_dpan_mmx;
+   op_mul_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_pan_caa_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_mul_pt_p_c_dp_mmx(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+       MOV_A2R(ALPHA_255, mm5)
+       pxor_r2r(mm0, mm0);
+       MOV_P2R(c, mm2, mm0)
+       MOV_P2R(s, mm3, mm0)
+       MUL4_SYM_R2R(mm2, mm3, mm5)
+       MOV_P2R(*d, mm1, mm0)
+       MUL4_SYM_R2R(mm3, mm1, mm5)
+       MOV_R2P(mm1, *d, mm0)
+}
+
+#define _op_mul_pt_pas_c_dp_mmx _op_mul_pt_p_c_dp_mmx
+#define _op_mul_pt_pan_c_dp_mmx _op_mul_pt_p_c_dp_mmx
+#define _op_mul_pt_p_can_dp_mmx _op_mul_pt_p_c_dp_mmx
+#define _op_mul_pt_pas_can_dp_mmx _op_mul_pt_p_c_dp_mmx
+#define _op_mul_pt_pan_can_dp_mmx _op_mul_pt_p_c_dp_mmx
+#define _op_mul_pt_p_caa_dp_mmx _op_mul_pt_p_c_dp_mmx
+#define _op_mul_pt_pas_caa_dp_mmx _op_mul_pt_p_c_dp_mmx
+#define _op_mul_pt_pan_caa_dp_mmx _op_mul_pt_p_c_dp_mmx
+
+#define _op_mul_pt_p_c_dpan_mmx _op_mul_pt_p_c_dp_mmx
+#define _op_mul_pt_pan_c_dpan_mmx _op_mul_pt_pan_c_dp_mmx
+#define _op_mul_pt_pas_c_dpan_mmx _op_mul_pt_pas_c_dp_mmx
+#define _op_mul_pt_p_can_dpan_mmx _op_mul_pt_p_can_dp_mmx
+#define _op_mul_pt_pan_can_dpan_mmx _op_mul_pt_pan_can_dp_mmx
+#define _op_mul_pt_pas_can_dpan_mmx _op_mul_pt_pas_can_dp_mmx
+#define _op_mul_pt_p_caa_dpan_mmx _op_mul_pt_p_caa_dp_mmx
+#define _op_mul_pt_pan_caa_dpan_mmx _op_mul_pt_pan_caa_dp_mmx
+#define _op_mul_pt_pas_caa_dpan_mmx _op_mul_pt_pas_caa_dp_mmx
+
+static void
+init_mul_pixel_color_pt_funcs_mmx(void)
+{
+   op_mul_pt_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_mul_pt_p_c_dp_mmx;
+   op_mul_pt_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_mul_pt_pas_c_dp_mmx;
+   op_mul_pt_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_mul_pt_pan_c_dp_mmx;
+   op_mul_pt_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_pt_p_can_dp_mmx;
+   op_mul_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_pt_pas_can_dp_mmx;
+   op_mul_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_pt_pan_can_dp_mmx;
+   op_mul_pt_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_pt_p_caa_dp_mmx;
+   op_mul_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_pt_pas_caa_dp_mmx;
+   op_mul_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_pt_pan_caa_dp_mmx;
+
+   op_mul_pt_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_pt_p_c_dpan_mmx;
+   op_mul_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_pt_pas_c_dpan_mmx;
+   op_mul_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_pt_pan_c_dpan_mmx;
+   op_mul_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_pt_p_can_dpan_mmx;
+   op_mul_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_pt_pas_can_dpan_mmx;
+   op_mul_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_pt_pan_can_dpan_mmx;
+   op_mul_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_pt_p_caa_dpan_mmx;
+   op_mul_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_pt_pas_caa_dpan_mmx;
+   op_mul_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_pt_pan_caa_dpan_mmx;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mul/op_mul_pixel_i386.c b/src/lib/engines/common/evas_op_mul/op_mul_pixel_i386.c
new file mode 100644 (file)
index 0000000..7d832b1
--- /dev/null
@@ -0,0 +1,67 @@
+
+/* mul pixel --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_mul_p_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e = s + l;
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+   for (; s < e; s++, d++) {
+       MOV_P2R(*d, mm1, mm0)
+       MOV_P2R(*s, mm2, mm0)
+       MUL4_SYM_R2R(mm2, mm1, mm5)
+       MOV_R2P(mm1, *d, mm0)
+   }
+}
+
+#define _op_mul_pas_dp_mmx _op_mul_p_dp_mmx
+#define _op_mul_pan_dp_mmx _op_mul_p_dp_mmx
+
+#define _op_mul_p_dpan_mmx _op_mul_p_dp_mmx
+#define _op_mul_pan_dpan_mmx _op_mul_pan_dp_mmx
+#define _op_mul_pas_dpan_mmx _op_mul_pas_dp_mmx
+
+static void
+init_mul_pixel_span_funcs_mmx(void)
+{
+   op_mul_span_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_mul_p_dp_mmx;
+   op_mul_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_mul_pan_dp_mmx;
+   op_mul_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_mul_pas_dp_mmx;
+
+   op_mul_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mul_p_dpan_mmx;
+   op_mul_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mul_pan_dpan_mmx;
+   op_mul_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mul_pas_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+_op_mul_pt_p_dp_mmx(DATA32 s, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d) {
+       pxor_r2r(mm0, mm0);
+       MOV_A2R(ALPHA_255, mm5)
+       MOV_P2R(*d, mm1, mm0)
+       MOV_P2R(s, mm2, mm0)
+       MUL4_SYM_R2R(mm2, mm1, mm5)
+       MOV_R2P(mm1, *d, mm0)
+}
+
+#define _op_mul_pt_pan_dp_mmx _op_mul_pt_p_dp_mmx
+#define _op_mul_pt_pas_dp_mmx _op_mul_pt_p_dp_mmx
+
+#define _op_mul_pt_p_dpan_mmx _op_mul_pt_p_dp_mmx
+#define _op_mul_pt_pan_dpan_mmx _op_mul_pt_pan_dp_mmx
+#define _op_mul_pt_pas_dpan_mmx _op_mul_pt_pas_dp_mmx
+
+static void
+init_mul_pixel_pt_funcs_mmx(void)
+{
+   op_mul_pt_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_mul_pt_p_dp_mmx;
+   op_mul_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_mul_pt_pan_dp_mmx;
+   op_mul_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_mul_pt_pas_dp_mmx;
+
+   op_mul_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mul_pt_p_dpan_mmx;
+   op_mul_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mul_pt_pan_dpan_mmx;
+   op_mul_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mul_pt_pas_dpan_mmx;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_.c b/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_.c
new file mode 100644 (file)
index 0000000..fdc3792
--- /dev/null
@@ -0,0 +1,118 @@
+
+/* mul pixel x mask --> dst */
+
+#ifdef BUILD_C
+static void
+_op_mul_p_mas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   while (d < e)
+     {
+       c = *m;
+       switch(c)
+         {
+           case 0:
+               break;
+           case 255:
+               *d = MUL4_SYM(*s, *d);
+               break;
+           default:
+               c = ~(*s);
+               c = ~MUL_SYM(*m, c);
+               *d = MUL4_SYM(c, *d);
+               break;
+         }
+       m++;  s++;  d++;
+     }
+}
+
+static void
+_op_mul_pan_mas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   while (d < e)
+     {
+       c = *m;
+       switch(c)
+         {
+           case 0:
+               break;
+           case 255:
+               *d = (*d & 0xff000000) + MUL3_SYM(*s, *d);
+               break;
+           default:
+               c = ~(*s);
+               c = ~MUL_SYM(*m, c);
+               *d = (*d & 0xff000000) + MUL3_SYM(c, *d);
+               break;
+         }
+       m++;  s++;  d++;
+     }
+}
+
+static void
+_op_mul_p_mas_dpan(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   while (d < e)
+     {
+       c = *m;
+       switch(c)
+         {
+           case 0:
+               break;
+           case 255:
+               *d = (*s & 0xff000000) + MUL3_SYM(*s, *d);
+               break;
+           default:
+               c = ~(*s);
+               c = ~MUL_SYM(*m, c);
+               *d = (c & 0xff000000) + MUL3_SYM(c, *d);
+               break;
+         }
+       m++;  d++;
+     }
+}
+
+#define _op_mul_pas_mas_dp _op_mul_p_mas_dp
+
+#define _op_mul_pan_mas_dpan _op_mul_p_mas_dpan
+#define _op_mul_pas_mas_dpan _op_mul_p_mas_dpan
+
+static void
+init_mul_pixel_mask_span_funcs_c(void)
+{
+   op_mul_span_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_mul_p_mas_dp;
+   op_mul_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_mul_pas_mas_dp;
+   op_mul_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_mul_pan_mas_dp;
+
+   op_mul_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_mul_p_mas_dpan;
+   op_mul_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_mul_pas_mas_dpan;
+   op_mul_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_mul_pan_mas_dpan;
+}
+#endif
+
+#ifdef BUILD_C
+static void
+_op_mul_pt_p_mas_dp(DATA32 s, DATA8 m, DATA32 c __UNUSED__, DATA32 *d) {
+       s = ~s;
+       s = ~MUL_SYM(m, s);
+       *d = MUL4_SYM(s, *d);
+}
+
+#define _op_mul_pt_pas_mas_dp _op_mul_pt_p_mas_dp
+#define _op_mul_pt_pan_mas_dp _op_mul_pt_p_mas_dp
+
+#define _op_mul_pt_p_mas_dpan _op_mul_pt_p_mas_dp
+#define _op_mul_pt_pas_mas_dpan _op_mul_pt_p_mas_dp
+#define _op_mul_pt_pan_mas_dpan _op_mul_pt_p_mas_dp
+
+static void
+init_mul_pixel_mask_pt_funcs_c(void)
+{
+   op_mul_pt_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_mul_pt_p_mas_dp;
+   op_mul_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_mul_pt_pas_mas_dp;
+   op_mul_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_mul_pt_pan_mas_dp;
+
+   op_mul_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_mul_pt_p_mas_dpan;
+   op_mul_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_mul_pt_pas_mas_dpan;
+   op_mul_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_mul_pt_pan_mas_dpan;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_i386.c b/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_i386.c
new file mode 100644 (file)
index 0000000..b2c00ce
--- /dev/null
@@ -0,0 +1,64 @@
+
+/* mul pixel x mask --> dst */
+
+#ifdef BUILD_MMX
+static void
+_op_mul_p_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   DATA32 *e = d + l;
+   MOV_A2R(ALPHA_255, mm5)
+   pxor_r2r(mm0, mm0);
+   while (d < e) {
+       c = *m;
+       switch(c)
+         {
+           case 0:
+               break;
+           case 255:
+               MOV_P2R(*d, mm1, mm0)
+               MOV_P2R(*s, mm2, mm0)
+               MUL4_SYM_R2R(mm2, mm1, mm5)
+               MOV_R2P(mm1, *d, mm0)
+               break;
+           default:
+               c++;
+               MOV_A2R(c, mm1)
+               c = ~(*s);
+               MOV_P2R(c, mm3, mm0)
+               MUL4_256_R2R(mm3, mm1)
+               movq_r2r(mm5, mm4);
+               psubw_r2r(mm1, mm4);
+               MOV_P2R(*d, mm1, mm0)
+               MUL4_SYM_R2R(mm4, mm1, mm5)
+               MOV_R2P(mm1, *d, mm0)
+               break;
+         }
+       s++;  m++;  d++;
+     }
+}
+
+#define _op_mul_pas_mas_dp_mmx _op_mul_p_mas_dp_mmx
+#define _op_mul_pan_mas_dp_mmx _op_mul_p_mas_dp_mmx
+
+#define _op_mul_p_mas_dpan_mmx _op_mul_p_mas_dp_mmx
+#define _op_mul_pas_mas_dpan_mmx _op_mul_pas_mas_dp_mmx
+#define _op_mul_pan_mas_dpan_mmx _op_mul_pan_mas_dp_mmx
+
+static void
+init_mul_pixel_mask_span_funcs_mmx(void)
+{
+   op_mul_span_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_mul_p_mas_dp_mmx;
+   op_mul_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_mul_pas_mas_dp_mmx;
+   op_mul_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_mul_pan_mas_dp_mmx;
+
+   op_mul_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_mul_p_mas_dpan_mmx;
+   op_mul_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_mul_pas_mas_dpan_mmx;
+   op_mul_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_mul_pan_mas_dpan_mmx;
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_mul_pixel_mask_pt_funcs_mmx(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_mul_main_.c b/src/lib/engines/common/evas_op_mul_main_.c
new file mode 100644 (file)
index 0000000..25fa932
--- /dev/null
@@ -0,0 +1,308 @@
+#include "evas_common.h"
+
+static RGBA_Gfx_Func     op_mul_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+static RGBA_Gfx_Pt_Func  op_mul_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+
+static void op_mul_init(void);
+static void op_mul_shutdown(void);
+
+static RGBA_Gfx_Func op_mul_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_mul_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_mul_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_mul_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_mul_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+
+static RGBA_Gfx_Pt_Func op_mul_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_mul_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_mul_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_mul_mask_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_mul_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+
+static RGBA_Gfx_Compositor  _composite_mul = { "mul",
+ op_mul_init, op_mul_shutdown,
+ op_mul_pixel_span_get, op_mul_color_span_get,
+ op_mul_pixel_color_span_get, op_mul_mask_color_span_get,
+ op_mul_pixel_mask_span_get,
+ op_mul_pixel_pt_get, op_mul_color_pt_get,
+ op_mul_pixel_color_pt_get, op_mul_mask_color_pt_get,
+ op_mul_pixel_mask_pt_get
+ };
+
+RGBA_Gfx_Compositor  *
+evas_common_gfx_compositor_mul_get(void)
+{
+   return &(_composite_mul);
+}
+
+
+# include "./evas_op_mul/op_mul_pixel_.c"
+# include "./evas_op_mul/op_mul_color_.c"
+# include "./evas_op_mul/op_mul_pixel_color_.c"
+# include "./evas_op_mul/op_mul_pixel_mask_.c"
+# include "./evas_op_mul/op_mul_mask_color_.c"
+//# include "./evas_op_mul/op_mul_pixel_mask_color_.c"
+
+# include "./evas_op_mul/op_mul_pixel_i386.c"
+# include "./evas_op_mul/op_mul_color_i386.c"
+# include "./evas_op_mul/op_mul_pixel_color_i386.c"
+# include "./evas_op_mul/op_mul_pixel_mask_i386.c"
+# include "./evas_op_mul/op_mul_mask_color_i386.c"
+// # include "./evas_op_mul/op_mul_pixel_mask_color_i386.c"
+
+static void
+op_mul_init(void)
+{
+   memset(op_mul_span_funcs, 0, sizeof(op_mul_span_funcs));
+   memset(op_mul_pt_funcs, 0, sizeof(op_mul_pt_funcs));
+#ifdef BUILD_MMX
+   init_mul_pixel_span_funcs_mmx();
+   init_mul_pixel_color_span_funcs_mmx();
+   init_mul_pixel_mask_span_funcs_mmx();
+   init_mul_color_span_funcs_mmx();
+   init_mul_mask_color_span_funcs_mmx();
+
+   init_mul_pixel_pt_funcs_mmx();
+   init_mul_pixel_color_pt_funcs_mmx();
+   init_mul_pixel_mask_pt_funcs_mmx();
+   init_mul_color_pt_funcs_mmx();
+   init_mul_mask_color_pt_funcs_mmx();
+#endif
+#ifdef BUILD_C
+   init_mul_pixel_span_funcs_c();
+   init_mul_pixel_color_span_funcs_c();
+   init_mul_pixel_mask_span_funcs_c();
+   init_mul_color_span_funcs_c();
+   init_mul_mask_color_span_funcs_c();
+
+   init_mul_pixel_pt_funcs_c();
+   init_mul_pixel_color_pt_funcs_c();
+   init_mul_pixel_mask_pt_funcs_c();
+   init_mul_color_pt_funcs_c();
+   init_mul_mask_color_pt_funcs_c();
+#endif
+}
+
+static void
+op_mul_shutdown(void)
+{
+}
+
+static RGBA_Gfx_Func
+mul_gfx_span_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Func func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+     {
+       cpu = CPU_MMX;
+       func = op_mul_span_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_mul_span_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Func
+op_mul_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+     {
+       dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return mul_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_mul_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return mul_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_mul_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return mul_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_mul_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   return mul_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_mul_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   return mul_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+mul_gfx_pt_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Pt_Func func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+    {
+      cpu = CPU_MMX;
+      func = op_mul_pt_funcs[s][m][c][d][cpu];
+      if (func) return func;
+    }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_mul_pt_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Pt_Func
+op_mul_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+     {
+       dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return mul_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_mul_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return mul_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_mul_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src_flags.alpha)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       s = SP;
+     }
+   if ((col >> 24) < 255)
+     {
+       if (dst)
+          dst->cache_entry.flags.alpha = 1;
+       c = SC;
+     }
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return mul_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_mul_mask_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   return mul_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_mul_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP;
+
+   if (dst)
+       dst->cache_entry.flags.alpha = 1;
+   if (src_flags.alpha)
+       s = SP;
+   return mul_gfx_pt_func_cpu(s, m, c, d);
+}
diff --git a/src/lib/engines/common/evas_op_sub/.cvsignore b/src/lib/engines/common/evas_op_sub/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/src/lib/engines/common/evas_op_sub/Makefile.am b/src/lib/engines/common/evas_op_sub/Makefile.am
new file mode 100644 (file)
index 0000000..a8eca14
--- /dev/null
@@ -0,0 +1,14 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+EXTRA_DIST = \
+op_sub_color_.c \
+op_sub_color_i386.c \
+op_sub_mask_color_.c \
+op_sub_mask_color_i386.c \
+op_sub_pixel_.c \
+op_sub_pixel_color_.c \
+op_sub_pixel_color_i386.c \
+op_sub_pixel_i386.c \
+op_sub_pixel_mask_.c \
+op_sub_pixel_mask_i386.c
+
diff --git a/src/lib/engines/common/evas_op_sub/op_sub_color_.c b/src/lib/engines/common/evas_op_sub/op_sub_color_.c
new file mode 100644 (file)
index 0000000..82d6db4
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* sub color -> dst */
+
+#ifdef BUILD_C
+static void
+init_sub_color_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_sub_color_pt_funcs_c(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* sub_rel color -> dst */
+
+#ifdef BUILD_C
+static void
+init_sub_rel_color_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_sub_rel_color_pt_funcs_c(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_sub/op_sub_color_i386.c b/src/lib/engines/common/evas_op_sub/op_sub_color_i386.c
new file mode 100644 (file)
index 0000000..0b3d5e5
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* sub color -> dst */
+
+#ifdef BUILD_MMX
+static void
+init_sub_color_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_sub_color_pt_funcs_mmx(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* sub_rel color -> dst */
+
+#ifdef BUILD_MMX
+static void
+init_sub_rel_color_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_sub_rel_color_pt_funcs_mmx(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_sub/op_sub_mask_color_.c b/src/lib/engines/common/evas_op_sub/op_sub_mask_color_.c
new file mode 100644 (file)
index 0000000..8457a0b
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* sub mask x color -> dst */
+
+#ifdef BUILD_C
+static void
+init_sub_mask_color_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_sub_mask_color_pt_funcs_c(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* sub_rel mask x color -> dst */
+
+#ifdef BUILD_C
+static void
+init_sub_rel_mask_color_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_sub_rel_mask_color_pt_funcs_c(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_sub/op_sub_mask_color_i386.c b/src/lib/engines/common/evas_op_sub/op_sub_mask_color_i386.c
new file mode 100644 (file)
index 0000000..1304121
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* sub mask x color -> dst */
+
+#ifdef BUILD_MMX
+static void
+init_sub_mask_color_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_sub_mask_color_pt_funcs_mmx(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* sub_rel mask x color -> dst */
+
+#ifdef BUILD_MMX
+static void
+init_sub_rel_mask_color_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_sub_rel_mask_color_pt_funcs_mmx(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_sub/op_sub_pixel_.c b/src/lib/engines/common/evas_op_sub/op_sub_pixel_.c
new file mode 100644 (file)
index 0000000..2ae74e3
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* sub pixel --> dst */
+
+#ifdef BUILD_C
+static void
+init_sub_pixel_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_sub_pixel_pt_funcs_c(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* sub_rel pixel --> dst */
+
+#ifdef BUILD_C
+static void
+init_sub_rel_pixel_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_sub_rel_pixel_pt_funcs_c(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_.c b/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_.c
new file mode 100644 (file)
index 0000000..14d6b39
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* sub pixel x color --> dst */
+
+#ifdef BUILD_C
+static void
+init_sub_pixel_color_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_sub_pixel_color_pt_funcs_c(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* sub_rel pixel x color --> dst */
+
+#ifdef BUILD_C
+static void
+init_sub_rel_pixel_color_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_sub_rel_pixel_color_pt_funcs_c(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_i386.c b/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_i386.c
new file mode 100644 (file)
index 0000000..ebf0b2e
--- /dev/null
@@ -0,0 +1,30 @@
+
+/* sub pixel x color --> dst */
+
+#ifdef BUILD_MMX
+static void
+init_sub_pixel_color_span_funcs_mmx(void)
+{ }
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_sub_pixel_color_pt_funcs_mmx(void)
+{ }
+#endif
+
+/*-----*/
+
+/* sub_rel pixel x color --> dst */
+
+#ifdef BUILD_MMX
+static void
+init_sub_rel_pixel_color_span_funcs_mmx(void)
+{ }
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_sub_rel_pixel_color_pt_funcs_mmx(void)
+{ }
+#endif
diff --git a/src/lib/engines/common/evas_op_sub/op_sub_pixel_i386.c b/src/lib/engines/common/evas_op_sub/op_sub_pixel_i386.c
new file mode 100644 (file)
index 0000000..93ddeaa
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* sub pixel --> dst */
+
+#ifdef BUILD_MMX
+static void
+init_sub_pixel_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_sub_pixel_pt_funcs_mmx(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* sub_rel pixel --> dst */
+
+#ifdef BUILD_MMX
+static void
+init_sub_rel_pixel_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_sub_rel_pixel_pt_funcs_mmx(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_.c b/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_.c
new file mode 100644 (file)
index 0000000..041a736
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* sub pixel x mask --> dst */
+
+#ifdef BUILD_C
+static void
+init_sub_pixel_mask_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_sub_pixel_mask_pt_funcs_c(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* sub_rel pixel x mask --> dst */
+
+#ifdef BUILD_C
+static void
+init_sub_rel_pixel_mask_span_funcs_c(void)
+{
+}
+#endif
+
+#ifdef BUILD_C
+static void
+init_sub_rel_pixel_mask_pt_funcs_c(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_i386.c b/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_i386.c
new file mode 100644 (file)
index 0000000..4875229
--- /dev/null
@@ -0,0 +1,34 @@
+
+/* sub pixel x mask -> dst */
+
+#ifdef BUILD_MMX
+static void
+init_sub_pixel_mask_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_sub_pixel_mask_pt_funcs_mmx(void)
+{
+}
+#endif
+
+/*-----*/
+
+/* sub_rel pixel x mask -> dst */
+
+#ifdef BUILD_MMX
+static void
+init_sub_rel_pixel_mask_span_funcs_mmx(void)
+{
+}
+#endif
+
+#ifdef BUILD_MMX
+static void
+init_sub_rel_pixel_mask_pt_funcs_mmx(void)
+{
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_sub_main_.c b/src/lib/engines/common/evas_op_sub_main_.c
new file mode 100644 (file)
index 0000000..329c2e4
--- /dev/null
@@ -0,0 +1,542 @@
+#include "evas_common.h"
+
+static RGBA_Gfx_Func     op_sub_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+static RGBA_Gfx_Pt_Func  op_sub_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+
+static void op_sub_init(void);
+static void op_sub_shutdown(void);
+
+static RGBA_Gfx_Func op_sub_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_sub_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_sub_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_sub_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_sub_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+
+static RGBA_Gfx_Pt_Func op_sub_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_sub_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_sub_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_sub_mask_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_sub_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+
+static RGBA_Gfx_Compositor  _composite_sub = { "sub",
+ op_sub_init, op_sub_shutdown,
+ op_sub_pixel_span_get, op_sub_color_span_get,
+ op_sub_pixel_color_span_get, op_sub_mask_color_span_get,
+ op_sub_pixel_mask_span_get,
+ op_sub_pixel_pt_get, op_sub_color_pt_get,
+ op_sub_pixel_color_pt_get, op_sub_mask_color_pt_get,
+ op_sub_pixel_mask_pt_get
+ };
+
+RGBA_Gfx_Compositor  *
+evas_common_gfx_compositor_sub_get(void)
+{
+   return &(_composite_sub);
+}
+
+static RGBA_Gfx_Func     op_sub_rel_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+static RGBA_Gfx_Pt_Func  op_sub_rel_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST];
+
+static void op_sub_rel_init(void);
+static void op_sub_rel_shutdown(void);
+
+static RGBA_Gfx_Func op_sub_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_sub_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_sub_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_sub_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels);
+static RGBA_Gfx_Func op_sub_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels);
+
+static RGBA_Gfx_Pt_Func op_sub_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_sub_rel_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_sub_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_sub_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst);
+static RGBA_Gfx_Pt_Func op_sub_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst);
+
+static RGBA_Gfx_Compositor  _composite_sub_rel = { "sub_rel",
+ op_sub_rel_init, op_sub_rel_shutdown,
+ op_sub_rel_pixel_span_get, op_sub_rel_color_span_get,
+ op_sub_rel_pixel_color_span_get, op_sub_rel_mask_color_span_get,
+ op_sub_rel_pixel_mask_span_get,
+ op_sub_rel_pixel_pt_get, op_sub_rel_color_pt_get,
+ op_sub_rel_pixel_color_pt_get, op_sub_rel_mask_color_pt_get,
+ op_sub_rel_pixel_mask_pt_get
+ };
+
+RGBA_Gfx_Compositor  *
+evas_common_gfx_compositor_sub_rel_get(void)
+{
+   return &(_composite_sub_rel);
+}
+
+
+# include "./evas_op_sub/op_sub_pixel_.c"
+# include "./evas_op_sub/op_sub_color_.c"
+# include "./evas_op_sub/op_sub_pixel_color_.c"
+# include "./evas_op_sub/op_sub_pixel_mask_.c"
+# include "./evas_op_sub/op_sub_mask_color_.c"
+//# include "./evas_op_sub/op_sub_pixel_mask_color_.c"
+
+# include "./evas_op_sub/op_sub_pixel_i386.c"
+# include "./evas_op_sub/op_sub_color_i386.c"
+# include "./evas_op_sub/op_sub_pixel_color_i386.c"
+# include "./evas_op_sub/op_sub_pixel_mask_i386.c"
+# include "./evas_op_sub/op_sub_mask_color_i386.c"
+//# include "./evas_op_sub/op_sub_pixel_mask_color_i386.c"
+
+static void
+op_sub_init(void)
+{
+   memset(op_sub_span_funcs, 0, sizeof(op_sub_span_funcs));
+   memset(op_sub_pt_funcs, 0, sizeof(op_sub_pt_funcs));
+#ifdef BUILD_MMX
+   init_sub_pixel_span_funcs_mmx();
+   init_sub_pixel_color_span_funcs_mmx();
+   init_sub_pixel_mask_span_funcs_mmx();
+   init_sub_color_span_funcs_mmx();
+   init_sub_mask_color_span_funcs_mmx();
+
+   init_sub_pixel_pt_funcs_mmx();
+   init_sub_pixel_color_pt_funcs_mmx();
+   init_sub_pixel_mask_pt_funcs_mmx();
+   init_sub_color_pt_funcs_mmx();
+   init_sub_mask_color_pt_funcs_mmx();
+#endif
+#ifdef BUILD_C
+   init_sub_pixel_span_funcs_c();
+   init_sub_pixel_color_span_funcs_c();
+   init_sub_rel_pixel_mask_span_funcs_c();
+   init_sub_color_span_funcs_c();
+   init_sub_mask_color_span_funcs_c();
+
+   init_sub_pixel_pt_funcs_c();
+   init_sub_pixel_color_pt_funcs_c();
+   init_sub_rel_pixel_mask_pt_funcs_c();
+   init_sub_color_pt_funcs_c();
+   init_sub_mask_color_pt_funcs_c();
+#endif
+}
+
+static void
+op_sub_shutdown(void)
+{
+}
+
+static RGBA_Gfx_Func
+sub_gfx_span_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Func  func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+     {
+       cpu = CPU_MMX;
+       func = op_sub_span_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_sub_span_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Func
+op_sub_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_sub_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_sub_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_sub_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_sub_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+sub_gfx_pt_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Pt_Func  func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+     {
+       cpu = CPU_MMX;
+       func = op_sub_pt_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_sub_pt_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Pt_Func
+op_sub_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_sub_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_sub_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_sub_mask_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_sub_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_gfx_pt_func_cpu(s, m, c, d);
+}
+
+
+
+static void
+op_sub_rel_init(void)
+{
+   memset(op_sub_rel_span_funcs, 0, sizeof(op_sub_rel_span_funcs));
+   memset(op_sub_rel_pt_funcs, 0, sizeof(op_sub_rel_pt_funcs));
+#ifdef BUILD_MMX
+   init_sub_rel_pixel_span_funcs_mmx();
+   init_sub_rel_pixel_color_span_funcs_mmx();
+   init_sub_rel_pixel_mask_span_funcs_mmx();
+   init_sub_rel_color_span_funcs_mmx();
+   init_sub_rel_mask_color_span_funcs_mmx();
+
+   init_sub_rel_pixel_pt_funcs_mmx();
+   init_sub_rel_pixel_color_pt_funcs_mmx();
+   init_sub_rel_pixel_mask_pt_funcs_mmx();
+   init_sub_rel_color_pt_funcs_mmx();
+   init_sub_rel_mask_color_pt_funcs_mmx();
+#endif
+#ifdef BUILD_C
+   init_sub_rel_pixel_span_funcs_c();
+   init_sub_rel_pixel_color_span_funcs_c();
+   init_sub_rel_pixel_mask_span_funcs_c();
+   init_sub_rel_color_span_funcs_c();
+   init_sub_rel_mask_color_span_funcs_c();
+
+   init_sub_rel_pixel_pt_funcs_c();
+   init_sub_rel_pixel_color_pt_funcs_c();
+   init_sub_rel_pixel_mask_pt_funcs_c();
+   init_sub_rel_color_pt_funcs_c();
+   init_sub_rel_mask_color_pt_funcs_c();
+#endif
+}
+
+static void
+op_sub_rel_shutdown(void)
+{
+}
+
+static RGBA_Gfx_Func
+sub_rel_gfx_span_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Func  func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+     {
+       cpu = CPU_MMX;
+       func = op_sub_rel_span_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_sub_rel_span_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Func
+op_sub_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_sub_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_sub_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_sub_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Func
+op_sub_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels __UNUSED__)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN;
+
+   if (src && src->cache_entry.flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_rel_gfx_span_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+sub_rel_gfx_pt_func_cpu(int s, int m, int c, int d)
+{
+   RGBA_Gfx_Pt_Func  func = NULL;
+   int cpu = CPU_N;
+#ifdef BUILD_MMX
+   if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
+     {
+       cpu = CPU_MMX;
+       func = op_sub_rel_pt_funcs[s][m][c][d][cpu];
+       if (func) return func;
+     }
+#endif
+#ifdef BUILD_C
+   cpu = CPU_C;
+   func = op_sub_rel_pt_funcs[s][m][c][d][cpu];
+   if (func) return func;
+#endif
+   return func;
+}
+
+static RGBA_Gfx_Pt_Func
+op_sub_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_sub_rel_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_sub_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_sub_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst)
+{
+   int  s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN;
+
+   if ((col >> 24) < 255)
+       c = SC;
+   if (col == (col | 0x00ffffff))
+       c = SC_AA;
+   if (col == 0xffffffff)
+       c = SC_N;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_rel_gfx_pt_func_cpu(s, m, c, d);
+}
+
+static RGBA_Gfx_Pt_Func
+op_sub_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst)
+{
+   int  s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN;
+
+   if (src_flags.alpha)
+       s = SP;
+   if (dst && dst->cache_entry.flags.alpha)
+       d = DP;
+   return sub_rel_gfx_pt_func_cpu(s, m, c, d);
+}
diff --git a/src/lib/engines/common/evas_pipe.c b/src/lib/engines/common/evas_pipe.c
new file mode 100644 (file)
index 0000000..bafb95a
--- /dev/null
@@ -0,0 +1,911 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+// THIS IS DEPRECATED. WILL GO EVENTUALLTY. NO NEED TO SUPPORT ANYMORE
+
+#include "evas_common.h"
+
+#ifdef BUILD_PIPE_RENDER
+static RGBA_Pipe *evas_common_pipe_add(RGBA_Pipe *pipe, RGBA_Pipe_Op **op);
+static void evas_common_pipe_draw_context_copy(RGBA_Draw_Context *dc, RGBA_Pipe_Op *op);
+static void evas_common_pipe_op_free(RGBA_Pipe_Op *op);
+
+/* utils */
+static RGBA_Pipe *
+evas_common_pipe_add(RGBA_Pipe *pipe, RGBA_Pipe_Op **op)
+{
+   RGBA_Pipe *p;
+   int first_pipe = 0;
+
+   if (!pipe)
+     {
+       first_pipe = 1;
+       p = calloc(1, sizeof(RGBA_Pipe));
+       if (!p) return NULL;
+       pipe = (RGBA_Pipe *)eina_inlist_append(EINA_INLIST_GET(pipe), EINA_INLIST_GET(p));
+     }
+   p = (RGBA_Pipe *)(EINA_INLIST_GET(pipe))->last;
+   if (p->op_num == PIPE_LEN)
+     {
+       p = calloc(1, sizeof(RGBA_Pipe));
+       if (!p) return NULL;
+       pipe = (RGBA_Pipe *)eina_inlist_append(EINA_INLIST_GET(pipe), EINA_INLIST_GET(p));
+     }
+   p->op_num++;
+   *op = &(p->op[p->op_num - 1]);
+   if (first_pipe)
+     {
+       /* FIXME: PTHREAD init any thread locks etc */
+     }
+   return pipe;
+}
+
+static void
+evas_common_pipe_draw_context_copy(RGBA_Draw_Context *dc, RGBA_Pipe_Op *op)
+{
+   memcpy(&(op->context), dc, sizeof(RGBA_Draw_Context));
+   if (op->context.cutout.active > 0)
+     {
+       op->context.cutout.rects = malloc(sizeof(Cutout_Rect) * op->context.cutout.active);
+       memcpy(op->context.cutout.rects, dc->cutout.rects, sizeof(Cutout_Rect) * op->context.cutout.active);
+     }
+   else
+     op->context.cutout.rects = NULL;
+}
+
+static void
+evas_common_pipe_op_free(RGBA_Pipe_Op *op)
+{
+   evas_common_draw_context_apply_clean_cutouts(&op->context.cutout);
+}
+
+/* main api calls */
+#ifdef BUILD_PTHREAD
+typedef struct _Thinfo
+{
+   int                    thread_num;
+   pthread_t              thread_id;
+   pthread_barrier_t     *barrier;
+   RGBA_Pipe_Thread_Info *info;
+} Thinfo;
+
+static void *
+evas_common_pipe_thread(void *data)
+{
+   Thinfo *thinfo;
+
+//   INF("TH [...........");
+   thinfo = data;
+   for (;;)
+     {
+       RGBA_Pipe_Thread_Info *info;
+       RGBA_Pipe *p;
+
+       /* wait for start signal */
+//     INF(" TH %i START...", thinfo->thread_num);
+       pthread_barrier_wait(&(thinfo->barrier[0]));
+       info = thinfo->info;
+//     if (info)
+//       {
+//          thinfo->info = NULL;
+//          INF(" TH %i GO", thinfo->thread_num);
+       EINA_INLIST_FOREACH(EINA_INLIST_GET(info->im->pipe), p)
+              {
+                 int i;
+
+                 for (i = 0; i < p->op_num; i++)
+                   {
+                      if (p->op[i].op_func)
+                        p->op[i].op_func(info->im, &(p->op[i]), info);
+                   }
+              }
+            free(info);
+//       }
+//     INF(" TH %i DONE", thinfo->thread_num);
+       /* send finished signal */
+       pthread_barrier_wait(&(thinfo->barrier[1]));
+     }
+   return NULL;
+}
+#endif
+
+#ifdef BUILD_PTHREAD
+static int               thread_num = 0;
+static Thinfo            thinfo[TH_MAX];
+static pthread_barrier_t thbarrier[2];
+#endif
+
+static void
+evas_common_pipe_begin(RGBA_Image *im)
+{
+#ifdef BUILD_PTHREAD
+   int i, y, h;
+
+   if (!im->pipe) return;
+   if (thread_num == 1) return;
+   y = 0;
+   h = im->cache_entry.h / thread_num;
+   if (h < 1) h = 1;
+   for (i = 0; i < thread_num; i++)
+     {
+       RGBA_Pipe_Thread_Info *info;
+
+//          if (y >= im->cache_entry.h) break;
+       info = calloc(1, sizeof(RGBA_Pipe_Thread_Info));
+       info->im = im;
+#ifdef EVAS_SLI
+       info->x = 0;
+       info->w = im->cache_entry.w;
+       info->y = i;
+       info->h = thread_num;
+#else
+       info->x = 0;
+       info->y = y;
+       info->w = im->cache_entry.w;
+       if (i == (thread_num - 1))
+         info->h = im->cache_entry.h - y;
+       else
+         info->h = h;
+       y += info->h;
+#endif
+       thinfo[i].info = info;
+     }
+   /* tell worker threads to start */
+   pthread_barrier_wait(&(thbarrier[0]));
+#endif
+}
+
+static void
+evas_common_pipe_flush(RGBA_Image *im)
+{
+
+   RGBA_Pipe *p;
+   int i;
+
+   if (!im->pipe) return;
+#ifdef BUILD_PTHREAD
+   if (thread_num > 1)
+     {
+       /* sync worker threads */
+       pthread_barrier_wait(&(thbarrier[1]));
+     }
+   else
+#endif
+     {
+       /* process pipe - 1 thead */
+       for (p = im->pipe; p; p = (RGBA_Pipe *)(EINA_INLIST_GET(p))->next)
+         {
+            for (i = 0; i < p->op_num; i++)
+              {
+                 if (p->op[i].op_func)
+                   p->op[i].op_func(im, &(p->op[i]), NULL);
+              }
+         }
+     }
+   evas_common_cpu_end_opt();
+   evas_common_pipe_free(im);
+}
+
+EAPI void
+evas_common_pipe_free(RGBA_Image *im)
+{
+
+   RGBA_Pipe *p;
+   int i;
+
+   if (!im->pipe) return;
+   /* FIXME: PTHREAD join all threads here (if not finished) */
+
+   /* free pipe */
+   while (im->pipe)
+     {
+       p = im->pipe;
+       for (i = 0; i < p->op_num; i++)
+         {
+            if (p->op[i].free_func)
+              p->op[i].free_func(&(p->op[i]));
+         }
+       im->pipe = (RGBA_Pipe *)eina_inlist_remove(EINA_INLIST_GET(im->pipe), EINA_INLIST_GET(p));
+       free(p);
+     }
+}
+
+
+
+/* draw ops */
+/**************** RECT ******************/
+static void
+evas_common_pipe_rectangle_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info)
+{
+   if (info)
+     {
+       RGBA_Draw_Context context;
+
+       memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context));
+#ifdef EVAS_SLI
+       evas_common_draw_context_set_sli(&(context), info->y, info->h);
+#else
+       evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
+#endif
+       evas_common_rectangle_draw(dst, &(context),
+                                  op->op.rect.x, op->op.rect.y,
+                                  op->op.rect.w, op->op.rect.h);
+     }
+   else
+     evas_common_rectangle_draw(dst, &(op->context),
+                               op->op.rect.x, op->op.rect.y,
+                               op->op.rect.w, op->op.rect.h);
+}
+
+EAPI void
+evas_common_pipe_rectangle_draw(RGBA_Image *dst, RGBA_Draw_Context *dc,
+                               int x, int y, int w, int h)
+{
+   RGBA_Pipe_Op *op;
+
+   if ((w < 1) || (h < 1)) return;
+   dst->pipe = evas_common_pipe_add(dst->pipe, &op);
+   if (!dst->pipe) return;
+   op->op.rect.x = x;
+   op->op.rect.y = y;
+   op->op.rect.w = w;
+   op->op.rect.h = h;
+   op->op_func = evas_common_pipe_rectangle_draw_do;
+   op->free_func = evas_common_pipe_op_free;
+   evas_common_pipe_draw_context_copy(dc, op);
+}
+
+/**************** LINE ******************/
+static void
+evas_common_pipe_line_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info)
+{
+   if (info)
+     {
+       RGBA_Draw_Context context;
+
+       memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context));
+#ifdef EVAS_SLI
+       evas_common_draw_context_set_sli(&(context), info->y, info->h);
+#else
+       evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
+#endif
+       evas_common_line_draw(dst, &(context),
+                             op->op.line.x0, op->op.line.y0,
+                             op->op.line.x1, op->op.line.y1);
+     }
+   else
+     evas_common_line_draw(dst, &(op->context),
+                          op->op.line.x0, op->op.line.y0,
+                          op->op.line.x1, op->op.line.y1);
+}
+
+EAPI void
+evas_common_pipe_line_draw(RGBA_Image *dst, RGBA_Draw_Context *dc,
+                          int x0, int y0, int x1, int y1)
+{
+   RGBA_Pipe_Op *op;
+
+   dst->pipe = evas_common_pipe_add(dst->pipe, &op);
+   if (!dst->pipe) return;
+   op->op.line.x0 = x0;
+   op->op.line.y0 = y0;
+   op->op.line.x1 = x1;
+   op->op.line.y1 = y1;
+   op->op_func = evas_common_pipe_line_draw_do;
+   op->free_func = evas_common_pipe_op_free;
+   evas_common_pipe_draw_context_copy(dc, op);
+}
+
+/**************** POLY ******************/
+static void
+evas_common_pipe_op_poly_free(RGBA_Pipe_Op *op)
+{
+   RGBA_Polygon_Point *p;
+
+   while (op->op.poly.points)
+     {
+       p = op->op.poly.points;
+       op->op.poly.points = (RGBA_Polygon_Point *)eina_inlist_remove(EINA_INLIST_GET(op->op.poly.points),
+                                                                     EINA_INLIST_GET(p));
+       free(p);
+     }
+   evas_common_pipe_op_free(op);
+}
+
+static void
+evas_common_pipe_poly_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info)
+{
+   if (info)
+     {
+       RGBA_Draw_Context context;
+
+       memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context));
+#ifdef EVAS_SLI
+       evas_common_draw_context_set_sli(&(context), info->y, info->h);
+#else
+       evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
+#endif
+       evas_common_polygon_draw(dst, &(context),
+                                op->op.poly.points, 0, 0);
+     }
+   else
+     evas_common_polygon_draw(dst, &(op->context),
+                             op->op.poly.points, 0, 0);
+}
+
+EAPI void
+evas_common_pipe_poly_draw(RGBA_Image *dst, RGBA_Draw_Context *dc,
+                          RGBA_Polygon_Point *points, int x, int y)
+{
+   RGBA_Pipe_Op *op;
+   RGBA_Polygon_Point *pts = NULL, *p, *pp;
+
+   if (!points) return;
+   dst->pipe = evas_common_pipe_add(dst->pipe, &op);
+   if (!dst->pipe) return;
+   /* FIXME: copy points - maybe we should refcount? */
+   for (p = points; p; p = (RGBA_Polygon_Point *)(EINA_INLIST_GET(p))->next)
+     {
+       pp = calloc(1, sizeof(RGBA_Polygon_Point));
+       if (pp)
+         {
+            pp->x = p->x + x;
+            pp->y = p->y + y;
+            pts = (RGBA_Polygon_Point *)eina_inlist_append(EINA_INLIST_GET(pts), EINA_INLIST_GET(pp));
+         }
+     }
+   op->op.poly.points = pts;
+   op->op_func = evas_common_pipe_poly_draw_do;
+   op->free_func = evas_common_pipe_op_poly_free;
+   evas_common_pipe_draw_context_copy(dc, op);
+}
+
+/**************** GRAD ******************/
+static void
+evas_common_pipe_op_grad_free(RGBA_Pipe_Op *op)
+{
+   evas_common_gradient_free(op->op.grad.grad);
+   evas_common_pipe_op_free(op);
+}
+
+static void
+evas_common_pipe_grad_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info)
+{
+   if (info)
+     {
+       RGBA_Draw_Context context;
+
+       memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context));
+#ifdef EVAS_SLI
+       evas_common_draw_context_set_sli(&(context), info->y, info->h);
+#else
+       evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
+#endif
+       evas_common_gradient_draw(dst, &(context),
+                                 op->op.grad.x, op->op.grad.y,
+                                 op->op.grad.w, op->op.grad.h,
+                                 op->op.grad.grad);
+     }
+   else
+     evas_common_gradient_draw(dst, &(op->context),
+                              op->op.grad.x, op->op.grad.y,
+                              op->op.grad.w, op->op.grad.h,
+                              op->op.grad.grad);
+}
+
+EAPI void
+evas_common_pipe_grad_draw(RGBA_Image *dst, RGBA_Draw_Context *dc,
+                          int x, int y, int w, int h, RGBA_Gradient *gr)
+{
+   RGBA_Pipe_Op *op;
+
+   if (!gr) return;
+   dst->pipe = evas_common_pipe_add(dst->pipe, &op);
+   if (!dst->pipe) return;
+   op->op.grad.x = x;
+   op->op.grad.y = y;
+   op->op.grad.w = w;
+   op->op.grad.h = h;
+   gr->references++;
+   op->op.grad.grad = gr;
+   op->op_func = evas_common_pipe_grad_draw_do;
+   op->free_func = evas_common_pipe_op_grad_free;
+   evas_common_pipe_draw_context_copy(dc, op);
+}
+
+/**************** GRAD2 ******************/
+static void
+evas_common_pipe_op_grad2_free(RGBA_Pipe_Op *op)
+{
+   evas_common_gradient2_free(op->op.grad2.grad);
+   evas_common_pipe_op_free(op);
+}
+
+static void
+evas_common_pipe_grad2_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info)
+{
+   if (info)
+     {
+       RGBA_Draw_Context context;
+       
+       memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context));
+#ifdef EVAS_SLI
+       evas_common_draw_context_set_sli(&(context), info->y, info->h);
+#else  
+       evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
+#endif 
+       evas_common_gradient2_draw(dst, &(context),
+                                 op->op.grad2.x, op->op.grad2.y,
+                                 op->op.grad2.w, op->op.grad2.h,
+                                 op->op.grad2.grad);
+     }
+   else
+     evas_common_gradient2_draw(dst, &(op->context),
+                              op->op.grad2.x, op->op.grad2.y,
+                              op->op.grad2.w, op->op.grad2.h,
+                              op->op.grad2.grad);
+}
+
+EAPI void
+evas_common_pipe_grad2_draw(RGBA_Image *dst, RGBA_Draw_Context *dc,
+                          int x, int y, int w, int h, RGBA_Gradient2 *gr)
+{
+   RGBA_Pipe_Op *op;
+
+   if (!gr) return;
+   dst->pipe = evas_common_pipe_add(dst->pipe, &op);
+   if (!dst->pipe) return;
+   op->op.grad2.x = x;
+   op->op.grad2.y = y;
+   op->op.grad2.w = w;
+   op->op.grad2.h = h;
+   gr->references++;
+   op->op.grad2.grad = gr;
+   op->op_func = evas_common_pipe_grad2_draw_do;
+   op->free_func = evas_common_pipe_op_grad2_free;
+   evas_common_pipe_draw_context_copy(dc, op);
+}
+
+/**************** TEXT ******************/
+static void
+evas_common_pipe_op_text_free(RGBA_Pipe_Op *op)
+{
+   evas_common_font_free(op->op.text.font);
+   free(op->op.text.text);
+   evas_common_pipe_op_free(op);
+}
+
+static void
+evas_common_pipe_text_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info)
+{
+   if (info)
+     {
+       RGBA_Draw_Context context;
+
+       memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context));
+#ifdef EVAS_SLI
+       evas_common_draw_context_set_sli(&(context), info->y, info->h);
+#else
+       evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
+#endif
+       evas_common_font_draw(dst, &(context),
+                             op->op.text.font, op->op.text.x, op->op.text.y,
+                             op->op.text.text);
+     }
+   else
+     evas_common_font_draw(dst, &(op->context),
+                          op->op.text.font, op->op.text.x, op->op.text.y,
+                          op->op.text.text);
+}
+
+EAPI void
+evas_common_pipe_text_draw(RGBA_Image *dst, RGBA_Draw_Context *dc,
+                          RGBA_Font *fn, int x, int y, const char *text)
+{
+   RGBA_Pipe_Op *op;
+
+   if ((!fn) || (!text)) return;
+   dst->pipe = evas_common_pipe_add(dst->pipe, &op);
+   if (!dst->pipe) return;
+   op->op.text.x = x;
+   op->op.text.y = y;
+   op->op.text.text = strdup(text);
+   fn->references++;
+   op->op.text.font = fn;
+   op->op_func = evas_common_pipe_text_draw_do;
+   op->free_func = evas_common_pipe_op_text_free;
+   evas_common_pipe_draw_context_copy(dc, op);
+}
+
+/**************** IMAGE *****************/
+static void
+evas_common_pipe_op_image_free(RGBA_Pipe_Op *op)
+{
+   op->op.image.src->ref--;
+   if (op->op.image.src->ref == 0)
+     evas_cache_image_drop(&op->op.image.src->cache_entry);
+   evas_common_pipe_op_free(op);
+}
+
+static void
+evas_common_pipe_image_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info)
+{
+   if (info)
+     {
+       RGBA_Draw_Context context;
+
+       memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context));
+#ifdef EVAS_SLI
+       evas_common_draw_context_set_sli(&(context), info->y, info->h);
+#else
+       evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
+#endif
+
+#ifdef SCALECACHE
+        evas_common_rgba_image_scalecache_do(op->op.image.src,
+                                             dst, &(context),
+                                             op->op.image.smooth,
+                                             op->op.image.sx,
+                                             op->op.image.sy,
+                                             op->op.image.sw,
+                                             op->op.image.sh,
+                                             op->op.image.dx,
+                                             op->op.image.dy,
+                                             op->op.image.dw,
+                                             op->op.image.dh);
+#else
+       if (op->op.image.smooth)
+         evas_common_scale_rgba_in_to_out_clip_smooth(op->op.image.src,
+                                                      dst, &(context),
+                                                      op->op.image.sx,
+                                                      op->op.image.sy,
+                                                      op->op.image.sw,
+                                                      op->op.image.sh,
+                                                      op->op.image.dx,
+                                                      op->op.image.dy,
+                                                      op->op.image.dw,
+                                                      op->op.image.dh);
+       else
+         evas_common_scale_rgba_in_to_out_clip_sample(op->op.image.src,
+                                                      dst, &(context),
+                                                      op->op.image.sx,
+                                                      op->op.image.sy,
+                                                      op->op.image.sw,
+                                                      op->op.image.sh,
+                                                      op->op.image.dx,
+                                                      op->op.image.dy,
+                                                      op->op.image.dw,
+                                                      op->op.image.dh);
+#endif
+     }
+   else
+     {
+#ifdef SCALECACHE
+        evas_common_rgba_image_scalecache_do(op->op.image.src,
+                                             dst, &(op->context),
+                                             op->op.image.smooth,
+                                             op->op.image.sx,
+                                             op->op.image.sy,
+                                             op->op.image.sw,
+                                             op->op.image.sh,
+                                             op->op.image.dx,
+                                             op->op.image.dy,
+                                             op->op.image.dw,
+                                             op->op.image.dh);
+#else
+       if (op->op.image.smooth)
+         evas_common_scale_rgba_in_to_out_clip_smooth(op->op.image.src,
+                                                      dst, &(op->context),
+                                                      op->op.image.sx,
+                                                      op->op.image.sy,
+                                                      op->op.image.sw,
+                                                      op->op.image.sh,
+                                                      op->op.image.dx,
+                                                      op->op.image.dy,
+                                                      op->op.image.dw,
+                                                      op->op.image.dh);
+       else
+         evas_common_scale_rgba_in_to_out_clip_sample(op->op.image.src,
+                                                      dst, &(op->context),
+                                                      op->op.image.sx,
+                                                      op->op.image.sy,
+                                                      op->op.image.sw,
+                                                      op->op.image.sh,
+                                                      op->op.image.dx,
+                                                      op->op.image.dy,
+                                                      op->op.image.dw,
+                                                      op->op.image.dh);
+#endif
+     }
+}
+
+EAPI void
+evas_common_pipe_image_draw(RGBA_Image *src, RGBA_Image *dst,
+                          RGBA_Draw_Context *dc, int smooth,
+                          int src_region_x, int src_region_y,
+                          int src_region_w, int src_region_h,
+                          int dst_region_x, int dst_region_y,
+                          int dst_region_w, int dst_region_h)
+{
+   RGBA_Pipe_Op *op;
+
+   if (!src) return;
+//   evas_common_pipe_flush(src);
+   dst->pipe = evas_common_pipe_add(dst->pipe, &op);
+   if (!dst->pipe) return;
+   op->op.image.smooth = smooth;
+   op->op.image.sx = src_region_x;
+   op->op.image.sy = src_region_y;
+   op->op.image.sw = src_region_w;
+   op->op.image.sh = src_region_h;
+   op->op.image.dx = dst_region_x;
+   op->op.image.dy = dst_region_y;
+   op->op.image.dw = dst_region_w;
+   op->op.image.dh = dst_region_h;
+   src->ref++;
+   op->op.image.src = src;
+   op->op_func = evas_common_pipe_image_draw_do;
+   op->free_func = evas_common_pipe_op_image_free;
+   evas_common_pipe_draw_context_copy(dc, op);
+
+   evas_common_pipe_image_load(src);
+}
+
+static void
+evas_common_pipe_op_map4_free(RGBA_Pipe_Op *op)
+{
+   op->op.map4.src->ref--;
+   if (op->op.map4.src->ref == 0)
+     evas_cache_image_drop(&op->op.map4.src->cache_entry);
+   free(op->op.map4.p);
+   evas_common_pipe_op_free(op);
+}
+
+static void
+evas_common_pipe_map4_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info)
+{
+   if (info)
+     {
+       RGBA_Draw_Context context;
+
+       memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context));
+#ifdef EVAS_SLI
+       evas_common_draw_context_set_sli(&(context), info->y, info->h);
+#else
+       evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
+#endif
+
+       evas_common_map4_rgba(op->op.map4.src, dst,
+                             &context, op->op.map4.p,
+                             op->op.map4.smooth, op->op.map4.level);
+     }
+   else
+     {
+       evas_common_map4_rgba(op->op.map4.src, dst,
+                             &(op->context), op->op.map4.p,
+                             op->op.map4.smooth, op->op.map4.level);
+     }
+}
+
+EAPI void
+evas_common_pipe_map4_draw(RGBA_Image *src, RGBA_Image *dst,
+                          RGBA_Draw_Context *dc, RGBA_Map_Point *p,
+                          int smooth, int level)
+{
+   RGBA_Pipe_Op *op;
+   RGBA_Map_Point *pts_copy;
+   int i;
+
+   if (!src) return;
+   pts_copy = malloc(sizeof (RGBA_Map_Point) * 4);
+   if (!pts_copy) return;
+   dst->pipe = evas_common_pipe_add(dst->pipe, &op);
+   if (!dst->pipe) 
+     {
+       free(pts_copy);
+       return; 
+     }
+
+   for (i = 0; i < 4; ++i)
+     pts_copy[i] = p[i];
+
+   op->op.map4.smooth = smooth;
+   op->op.map4.level = level;
+   src->ref++;
+   op->op.map4.src = src;
+   op->op.map4.p = pts_copy;
+   op->op_func = evas_common_pipe_map4_draw_do;
+   op->free_func = evas_common_pipe_op_map4_free;
+   evas_common_pipe_draw_context_copy(dc, op);
+
+   evas_common_pipe_image_load(src);
+}
+
+static void
+evas_common_pipe_map4_render(RGBA_Image *root)
+{
+  RGBA_Pipe *p;
+  int i;
+
+  /* Map imply that we need to process them recursively first. */
+  for (p = root->pipe; p; p = (RGBA_Pipe *)(EINA_INLIST_GET(p))->next)
+    {
+      for (i = 0; i < p->op_num; i++) 
+       {
+         if (p->op[i].op_func == evas_common_pipe_map4_draw_do)
+           {
+             if (p->op[i].op.map4.src->pipe)
+               evas_common_pipe_map4_render(p->op[i].op.map4.src);
+           }
+         else if (p->op[i].op_func == evas_common_pipe_image_draw_do)
+           {
+             if (p->op[i].op.image.src->pipe)
+               evas_common_pipe_map4_render(p->op[i].op.image.src);
+           }
+       }
+    }
+
+  evas_common_pipe_begin(root);
+  evas_common_pipe_flush(root);
+}
+
+#ifdef BUILD_PTHREAD
+static Eina_List *task = NULL;
+static Thinfo task_thinfo[TH_MAX];
+static pthread_barrier_t task_thbarrier[2];
+static LK(task_mutext) = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
+#ifdef BUILD_PTHREAD
+static void*
+evas_common_pipe_load(void *data)
+{
+  Thinfo *thinfo;
+
+  thinfo = data;
+  for (;;)
+    {
+      /* wait for start signal */
+      pthread_barrier_wait(&(thinfo->barrier[0]));
+
+      while (task)
+       {
+         RGBA_Image *im = NULL;
+
+         LKL(task_mutext);
+         im = eina_list_data_get(task);
+         task = eina_list_remove_list(task, task);
+         LKU(task_mutext);
+
+         if (im)
+           {
+             if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
+               evas_cache_image_load_data(&im->cache_entry);
+             evas_common_image_colorspace_normalize(im);
+
+             im->flags &= ~RGBA_IMAGE_TODO_LOAD;
+           }
+       }
+
+      /* send finished signal */    
+      pthread_barrier_wait(&(thinfo->barrier[1]));
+    }
+
+  return NULL;
+}
+#endif
+
+static void
+evas_common_pipe_image_load_do(void)
+{
+#ifdef BUILD_PTHREAD
+  /* Notify worker thread. */
+  pthread_barrier_wait(&(task_thbarrier[0]));
+
+  /* sync worker threads */
+  pthread_barrier_wait(&(task_thbarrier[1]));
+#endif
+}
+
+static Eina_Bool
+evas_common_pipe_init(void)
+{
+#ifdef BUILD_PTHREAD
+   if (thread_num == 0)
+     {
+       int cpunum;
+       int i;
+
+       cpunum = eina_cpu_count();
+       thread_num = cpunum;
+       if (thread_num == 1) return EINA_FALSE;
+
+       pthread_barrier_init(&(thbarrier[0]), NULL, thread_num + 1);
+       pthread_barrier_init(&(thbarrier[1]), NULL, thread_num + 1);
+       for (i = 0; i < thread_num; i++)
+         {
+            pthread_attr_t attr;
+            cpu_set_t cpu;
+
+            pthread_attr_init(&attr);
+            CPU_ZERO(&cpu);
+            CPU_SET(i % cpunum, &cpu);
+            pthread_attr_setaffinity_np(&attr, sizeof(cpu), &cpu);
+            thinfo[i].thread_num = i;
+            thinfo[i].info = NULL;
+            thinfo[i].barrier = thbarrier;
+            /* setup initial locks */
+            pthread_create(&(thinfo[i].thread_id), &attr,
+                           evas_common_pipe_thread, &(thinfo[i]));
+            pthread_attr_destroy(&attr);
+         }
+
+       pthread_barrier_init(&(task_thbarrier[0]), NULL, thread_num + 1);
+       pthread_barrier_init(&(task_thbarrier[1]), NULL, thread_num + 1);
+       for (i = 0; i < thread_num; i++)
+         {
+            pthread_attr_t attr;
+            cpu_set_t cpu;
+
+            pthread_attr_init(&attr);
+            CPU_ZERO(&cpu);
+            CPU_SET(i % cpunum, &cpu);
+            pthread_attr_setaffinity_np(&attr, sizeof(cpu), &cpu);
+            task_thinfo[i].thread_num = i;
+            task_thinfo[i].info = NULL;
+            task_thinfo[i].barrier = task_thbarrier;
+            /* setup initial locks */
+            pthread_create(&(task_thinfo[i].thread_id), &attr,
+                           evas_common_pipe_load, &(task_thinfo[i]));
+            pthread_attr_destroy(&attr);
+         }
+     }
+   if (thread_num == 1) return EINA_FALSE;
+   return EINA_TRUE;
+#endif
+   return EINA_FALSE;
+}
+
+EAPI void
+evas_common_pipe_image_load(RGBA_Image *im)
+{
+  if (im->flags & RGBA_IMAGE_TODO_LOAD)
+    return ;
+
+  if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888
+      && !evas_cache_image_is_loaded(&(im->cache_entry)))
+    goto add_task;
+
+  if ((!im->cs.data) || ((!im->cs.dirty) && (!(im->flags & RGBA_IMAGE_IS_DIRTY))))
+    goto add_task;
+
+  return ;
+
+ add_task:
+  task = eina_list_append(task, im);
+  im->flags |= RGBA_IMAGE_TODO_LOAD;
+}
+
+EAPI void
+evas_common_pipe_map4_begin(RGBA_Image *root)
+{
+  if (!evas_common_pipe_init())
+    {
+      RGBA_Image *im;
+
+      EINA_LIST_FREE(task, im)
+       {
+         if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
+           evas_cache_image_load_data(&im->cache_entry);
+         evas_common_image_colorspace_normalize(im);
+         
+         im->flags &= ~RGBA_IMAGE_TODO_LOAD;
+       }
+    }
+
+  evas_common_pipe_image_load_do();
+
+  evas_common_pipe_map4_render(root);
+}
+#endif
diff --git a/src/lib/engines/common/evas_pipe.h b/src/lib/engines/common/evas_pipe.h
new file mode 100644 (file)
index 0000000..77c5dd3
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef _EVAS_PIPE_H
+#define _EVAS_PIPE_H
+
+
+/* image rendering pipelines... new optional system - non-immediate and
+ * threadable
+ */
+
+EAPI void evas_common_pipe_free(RGBA_Image *im);
+EAPI void evas_common_pipe_rectangle_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h);
+EAPI void evas_common_pipe_line_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1);
+EAPI void evas_common_pipe_poly_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y);
+EAPI void evas_common_pipe_grad_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h, RGBA_Gradient *gr);
+EAPI void evas_common_pipe_grad2_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h, RGBA_Gradient2 *gr);
+EAPI void evas_common_pipe_text_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int x, int y, const char *text);
+EAPI void evas_common_pipe_image_load(RGBA_Image *im);
+EAPI void evas_common_pipe_image_draw(RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int smooth, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h);
+EAPI void evas_common_pipe_map4_draw(RGBA_Image *src, RGBA_Image *dst,
+                                    RGBA_Draw_Context *dc, RGBA_Map_Point *p,
+                                    int smooth, int level);
+
+#endif /* _EVAS_PIPE_H */
diff --git a/src/lib/engines/common/evas_polygon.h b/src/lib/engines/common/evas_polygon.h
new file mode 100644 (file)
index 0000000..0695f54
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef _EVAS_POLYGON_H
+#define _EVAS_POLYGON_H
+
+
+EAPI void                evas_common_polygon_init         (void);
+
+EAPI RGBA_Polygon_Point *evas_common_polygon_point_add    (RGBA_Polygon_Point *points, int x, int y);
+EAPI RGBA_Polygon_Point *evas_common_polygon_points_clear (RGBA_Polygon_Point *points);
+EAPI void                evas_common_polygon_draw         (RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y);
+
+
+#endif /* _EVAS_POLYGON_H */
+
diff --git a/src/lib/engines/common/evas_polygon_main.c b/src/lib/engines/common/evas_polygon_main.c
new file mode 100644 (file)
index 0000000..cd8410a
--- /dev/null
@@ -0,0 +1,297 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include <math.h>
+
+#include "evas_common.h"
+#include "evas_blend_private.h"
+
+typedef struct _RGBA_Span RGBA_Span;
+typedef struct _RGBA_Edge RGBA_Edge;
+typedef struct _RGBA_Vertex RGBA_Vertex;
+
+struct _RGBA_Span
+{
+   EINA_INLIST;
+   int x, y, w;
+};
+
+struct _RGBA_Edge
+{
+   double x, dx;
+   int i;
+};
+
+struct _RGBA_Vertex
+{
+   double x, y;
+   int i;
+};
+
+#define POLY_EDGE_DEL(_i)                                               \
+{                                                                       \
+   int _j;                                                              \
+                                                                        \
+   for (_j = 0; (_j < num_active_edges) && (edges[_j].i != _i); _j++);  \
+   if (_j < num_active_edges)                                           \
+     {                                                                  \
+       num_active_edges--;                                             \
+       memmove(&(edges[_j]), &(edges[_j + 1]),                         \
+               (num_active_edges - _j) * sizeof(RGBA_Edge));           \
+     }                                                                  \
+}
+
+#define POLY_EDGE_ADD(_i, _y)                                           \
+{                                                                       \
+   int _j;                                                              \
+   float _dx;                                                           \
+   RGBA_Vertex *_p, *_q;                                                \
+   if (_i < (n - 1)) _j = _i + 1;                                       \
+   else _j = 0;                                                         \
+   if (point[_i].y < point[_j].y)                                       \
+     {                                                                  \
+       _p = &(point[_i]);                                              \
+       _q = &(point[_j]);                                              \
+     }                                                                  \
+   else                                                                 \
+     {                                                                  \
+       _p = &(point[_j]);                                              \
+       _q = &(point[_i]);                                              \
+     }                                                                  \
+   edges[num_active_edges].dx = _dx = (_q->x - _p->x) / (_q->y - _p->y); \
+   edges[num_active_edges].x = (_dx * ((float)_y + 0.5 - _p->y)) + _p->x; \
+   edges[num_active_edges].i = _i;                                      \
+   num_active_edges++;                                                  \
+}
+
+EAPI void
+evas_common_polygon_init(void)
+{
+}
+
+EAPI RGBA_Polygon_Point *
+evas_common_polygon_point_add(RGBA_Polygon_Point *points, int x, int y)
+{
+   RGBA_Polygon_Point *pt;
+
+   pt = malloc(sizeof(RGBA_Polygon_Point));
+   if (!pt) return points;
+   pt->x = x;
+   pt->y = y;
+   points = (RGBA_Polygon_Point *)eina_inlist_append(EINA_INLIST_GET(points), EINA_INLIST_GET(pt));
+   return points;
+}
+
+EAPI RGBA_Polygon_Point *
+evas_common_polygon_points_clear(RGBA_Polygon_Point *points)
+{
+   if (points)
+     {
+       while (points)
+         {
+            RGBA_Polygon_Point *old_p;
+
+            old_p = points;
+            points = (RGBA_Polygon_Point *)eina_inlist_remove(EINA_INLIST_GET(points), EINA_INLIST_GET(points));
+            free(old_p);
+         }
+     }
+   return NULL;
+}
+
+static int
+polygon_point_sorter(const void *a, const void *b)
+{
+   RGBA_Vertex *p, *q;
+
+   p = (RGBA_Vertex *)a;
+   q = (RGBA_Vertex *)b;
+   if (p->y <= q->y) return -1;
+   return 1;
+}
+
+static int
+polygon_edge_sorter(const void *a, const void *b)
+{
+   RGBA_Edge *p, *q;
+
+   p = (RGBA_Edge *)a;
+   q = (RGBA_Edge *)b;
+   if (p->x <= q->x) return -1;
+   return 1;
+}
+
+EAPI void
+evas_common_polygon_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y)
+{
+   RGBA_Gfx_Func      func;
+   RGBA_Polygon_Point *pt;
+   RGBA_Vertex       *point;
+   RGBA_Edge         *edges;
+   Eina_Inlist  *spans;
+   int                num_active_edges;
+   int                n;
+   int                i, j, k;
+   int                y0, y1, yi;
+   int                ext_x, ext_y, ext_w, ext_h;
+   int               *sorted_index;
+
+   ext_x = 0;
+   ext_y = 0;
+   ext_w = dst->cache_entry.w;
+   ext_h = dst->cache_entry.h;
+   if (dc->clip.use)
+     {
+       if (dc->clip.x > ext_x)
+         {
+            ext_w += ext_x - dc->clip.x;
+            ext_x = dc->clip.x;
+         }
+       if ((ext_x + ext_w) > (dc->clip.x + dc->clip.w))
+         {
+            ext_w = (dc->clip.x + dc->clip.w) - ext_x;
+         }
+       if (dc->clip.y > ext_y)
+         {
+            ext_h += ext_y - dc->clip.y;
+            ext_y = dc->clip.y;
+         }
+       if ((ext_y + ext_h) > (dc->clip.y + dc->clip.h))
+         {
+            ext_h = (dc->clip.y + dc->clip.h) - ext_y;
+         }
+     }
+   if ((ext_w <= 0) || (ext_h <= 0)) return;
+
+   evas_common_cpu_end_opt();
+
+   n = 0; EINA_INLIST_FOREACH(points, pt) n++;
+   if (n < 3) return;
+   edges = malloc(sizeof(RGBA_Edge) * n);
+   if (!edges) return;
+   point = malloc(sizeof(RGBA_Vertex) * n);
+   if (!point)
+     {
+       free(edges);
+       return;
+     }
+   sorted_index = malloc(sizeof(int) * n);
+   if (!sorted_index)
+     {
+       free(edges);
+       free(point);
+       return;
+     }
+
+   k = 0;
+   EINA_INLIST_FOREACH(points, pt)
+     {
+       point[k].x = pt->x + x;
+       point[k].y = pt->y + y;
+       point[k].i = k;
+       k++;
+     }
+   qsort(point, n, sizeof(RGBA_Vertex), polygon_point_sorter);
+   for (k = 0; k < n; k++) sorted_index[k] = point[k].i;
+   k = 0;
+   EINA_INLIST_FOREACH(points, pt)
+     {
+       point[k].x = pt->x + x;
+       point[k].y = pt->y + y;
+       point[k].i = k;
+       k++;
+     }
+
+   y0 = MAX(ext_y, ceil(point[sorted_index[0]].y - 0.5));
+   y1 = MIN(ext_y + ext_h - 1, floor(point[sorted_index[n - 1]].y - 0.5));
+
+   k = 0;
+   num_active_edges = 0;
+   spans = NULL;
+
+   for (yi = y0; yi <= y1; yi++)
+     {
+       for (; (k < n) && (point[sorted_index[k]].y <= ((double)yi + 0.5)); k++)
+         {
+            i = sorted_index[k];
+
+            if (i > 0) j = i - 1;
+            else j = n - 1;
+            if (point[j].y <= ((double)yi - 0.5))
+              {
+                 POLY_EDGE_DEL(j)
+              }
+            else if (point[j].y > ((double)yi + 0.5))
+              {
+                 POLY_EDGE_ADD(j, yi)
+              }
+            if (i < (n - 1)) j = i + 1;
+            else j = 0;
+            if (point[j].y <= ((double)yi - 0.5))
+              {
+                 POLY_EDGE_DEL(i)
+              }
+            else if (point[j].y > ((double)yi + 0.5))
+              {
+                 POLY_EDGE_ADD(i, yi)
+              }
+         }
+
+       qsort(edges, num_active_edges, sizeof(RGBA_Edge), polygon_edge_sorter);
+
+       for (j = 0; j < num_active_edges; j += 2)
+         {
+            int x0, x1;
+
+            x0 = ceil(edges[j].x - 0.5);
+            if (j < (num_active_edges - 1))
+              x1 = floor(edges[j + 1].x - 0.5);
+            else
+              x1 = x0;
+            if ((x1 >= ext_x) && (x0 < (ext_x + ext_w)) && (x0 <= x1))
+              {
+                 RGBA_Span *span;
+
+                 if (x0 < ext_x) x0 = ext_x;
+                 if (x1 >= (ext_x + ext_w)) x1 = ext_x + ext_w - 1;
+                 span = malloc(sizeof(RGBA_Span));
+                 spans = eina_inlist_append(spans, EINA_INLIST_GET(span));
+                 span->y = yi;
+                 span->x = x0;
+                 span->w = (x1 - x0) + 1;
+              }
+            edges[j].x += edges[j].dx;
+            edges[j + 1].x += edges[j + 1].dx;
+         }
+     }
+
+   free(edges);
+   free(point);
+   free(sorted_index);
+
+   func = evas_common_gfx_func_composite_color_span_get(dc->col.col, dst, 1, dc->render_op);
+   if (spans)
+     {
+       RGBA_Span *span;
+
+       EINA_INLIST_FOREACH(spans, span)
+         {
+            DATA32 *ptr;
+
+#ifdef EVAS_SLI
+            if (((span->y) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 ptr = dst->image.data + (span->y * (dst->cache_entry.w)) + span->x;
+                 func(NULL, NULL, dc->col.col, ptr, span->w);
+              }
+         }
+       while (spans)
+         {
+            span = (RGBA_Span *)spans;
+            spans = eina_inlist_remove(spans, spans);
+            free(span);
+         }
+     }
+}
diff --git a/src/lib/engines/common/evas_rectangle.h b/src/lib/engines/common/evas_rectangle.h
new file mode 100644 (file)
index 0000000..a653b04
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _EVAS_RECTANGLE_H
+#define _EVAS_RECTANGLE_H
+
+
+EAPI void           evas_common_rectangle_init          (void);
+
+EAPI void           evas_common_rectangle_draw          (RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h);
+
+
+#endif /* _EVAS_RECTANGLE_H */
+
diff --git a/src/lib/engines/common/evas_rectangle_main.c b/src/lib/engines/common/evas_rectangle_main.c
new file mode 100644 (file)
index 0000000..c457848
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_blend_private.h"
+
+static void rectangle_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h);
+
+EAPI void
+evas_common_rectangle_init(void)
+{
+}
+
+EAPI void
+evas_common_rectangle_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h)
+{
+   Cutout_Rects *rects;
+   Cutout_Rect  *r;
+   int          c, cx, cy, cw, ch;
+   int          i;
+   /* handle cutouts here! */
+
+   if ((w <= 0) || (h <= 0)) return;
+   if (!(RECTS_INTERSECT(x, y, w, h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
+     return;
+   /* save out clip info */
+   c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h;
+   evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
+   /* no cutouts - cut right to the chase */
+   if (!dc->cutout.rects)
+     {
+       rectangle_draw_internal(dst, dc, x, y, w, h);
+     }
+   else
+     {
+       evas_common_draw_context_clip_clip(dc, x, y, w, h);
+       /* our clip is 0 size.. abort */
+       if ((dc->clip.w > 0) && (dc->clip.h > 0))
+         {
+            rects = evas_common_draw_context_apply_cutouts(dc);
+            for (i = 0; i < rects->active; ++i)
+              {
+                 r = rects->rects + i;
+                 evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h);
+                 rectangle_draw_internal(dst, dc, x, y, w, h);
+              }
+            evas_common_draw_context_apply_clear_cutouts(rects);
+         }
+     }
+   /* restore clip info */
+   dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch;
+}
+
+static void
+rectangle_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h)
+{
+   RGBA_Gfx_Func func;
+   int yy;
+   DATA32 *ptr;
+
+   RECTS_CLIP_TO_RECT(x, y, w, h, dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h);
+   if ((w <= 0) || (h <= 0)) return;
+
+   func = evas_common_gfx_func_composite_color_span_get(dc->col.col, dst, w, dc->render_op);
+   ptr = dst->image.data + (y * dst->cache_entry.w) + x;
+   for (yy = 0; yy < h; yy++)
+     {
+#ifdef EVAS_SLI
+       if (((yy + y) % dc->sli.h) == dc->sli.y)
+#endif
+         {
+            func(NULL, NULL, dc->col.col, ptr, w);
+         }
+       ptr += dst->cache_entry.w;
+     }
+}
diff --git a/src/lib/engines/common/evas_regionbuf.c b/src/lib/engines/common/evas_regionbuf.c
new file mode 100644 (file)
index 0000000..711882e
--- /dev/null
@@ -0,0 +1,357 @@
+#include "evas_common.h"
+
+#if 0
+Regionbuf *
+evas_common_regionbuf_new(int w, int h)
+{
+   Regionbuf *rb;
+
+   rb = calloc(1, sizeof(Regionbuf) + (h * sizeof(Regionspan)));
+   if (!rb) return NULL;
+   rb->spans = (Regionspan **)(rb + sizeof(Regionbuf));
+   rb->w = w;
+   rb->h = h;
+   return rb;
+}
+
+void
+evas_common_regionbuf_free(Regionbuf *rb)
+{
+   evas_common_regionbuf_clear(rb);
+   free(rb);
+}
+
+void
+evas_common_regionbuf_clear(Regionbuf *rb)
+{
+   int y;
+
+   for (y = 0; y < rb->h; y++)
+     {
+       while (rb->spans[y])
+         {
+            Regionspan *span;
+
+            span = rb->spans[y];
+            rb->spans[y] = eina_inlist_remove(rb->spans[y], rb->spans[y]);
+            free(span);
+         }
+     }
+}
+
+void
+evas_common_regionbuf_span_add(Regionbuf *rb, int x1, int x2, int y)
+{
+   Regionspan *span, *span2, *nspan, *sp_start, *sp_stop;
+
+   /* abort if outside */
+   if ((y < 0) ||
+       (y >= rb->h) ||
+       (x2 < 0) ||
+       (x1 >= rb->w)) return;
+   /* clip to horiz bounds */
+   if (x1 < 0) x1 = 0;
+   if (x2 < (rb->w - 1)) x2 = rb->w - 1;
+   sp_start = NULL;
+   sp_stop = NULL;
+   EINA_INLIST_FOREACH(rb->spans[y], span)
+     {
+       nspan = (Regionspan *)(EINA_INLIST_GET(span))->next;
+       /* we dont know what t do with the span yet */
+       if (!sp_start)
+         {
+            /* if new span starts before or on this span or just after
+             * with no gap */
+            if (x1 <= (span->x2 + 1))
+              sp_start = span;
+            /* if there is no next span */
+            if (!nspan)
+              {
+                 sp_stop = span;
+                 break;
+              }
+            /* if new span ends before the next span starts with a gap of
+             * 1 pixel (or more) */
+            else if (x2 < (nspan->x1 - 1))
+              {
+                 sp_stop = span;
+                 break;
+              }
+         }
+       /* we already know it already starts before or in sp_start */
+       else
+         {
+            /* there is no span after this one, so this has to be the stop */
+            if (!nspan)
+              {
+                 sp_stop = span;
+                 break;
+              }
+            /* if new span ends before the next span starts with a gap of
+             * 1 pixel (or more) */
+            else if (x2 < (nspan->x1 - 1))
+              {
+                 sp_stop = span;
+                 break;
+              }
+         }
+     }
+   /* sp_start is where the new span starts in or before */
+   /* sp_stop is where the new span stops in or after */
+   if ((sp_start) && (sp_stop))
+     {
+       /* same start and stop */
+       if (sp_start == sp_stop)
+         {
+            if (x2 < (sp_start->x1 - 1))
+              {
+                 span2 = calloc(1, sizeof(Regionspan));
+                 span2->x1 = x1;
+                 span2->x2 = x2;
+                 rb->spans[y] = eina_inlist_prepend_relative(rb->spans[y], span2, sp_start);
+                 return;
+              }
+            if (x1 < sp_start->x1)
+              sp_start->x1 = x1;
+            if (x2 > sp_start->x2)
+              sp_start->x2 = x2;
+            return;
+         }
+       else
+         {
+            Eina_Inlist *l;
+
+            /* remove all nodes after sp_start and before_sp_stop because
+             * the new  */
+            for (l = (EINA_INLIST_GET(sp_start))->next; l != EINA_INLIST_GET(sp_stop);)
+              {
+                 span = (Regionspan *)l;
+                 l = l->next;
+                 rb->spans[y] = eina_inlist_remove(rb->spans[y], span);
+                 free(span);
+              }
+            /* remove the end span */
+            rb->spans[y] = eina_inlist_remove(rb->spans[y], sp_stop);
+            /* if the new span is before the start span - extend */
+            if (x1 < sp_start->x1)
+              sp_start->x1 = x1;
+            /* if it goes beyond the stop span - extend stop span */
+            if (x2 > sp_stop->x2)
+              sp_stop->x2 = x2;
+            /* extend start span to stop span */
+            sp_start->x2 = sp_stop->x2;
+            /* don't need stop span anymore */
+            free(sp_stop);
+            return;
+         }
+     }
+   /* no start AND stop... just append */
+   span2 = calloc(1, sizeof(Regionspan));
+   span2->x1 = x1;
+   span2->x2 = x2;
+   rb->spans[y] = eina_inlist_append(rb->spans[y], span2);
+}
+
+void
+evas_common_regionbuf_span_del(Regionbuf *rb, int x1, int x2, int y)
+{
+   /* FIXME: del span */
+   Regionspan *span, *span2, *nspan, *sp_start, *sp_stop;
+
+   /* abort if outside */
+   if ((y < 0) ||
+       (y >= rb->h) ||
+       (x2 < 0) ||
+       (x1 >= rb->w)) return;
+   /* clip to horiz bounds */
+   if (x1 < 0) x1 = 0;
+   if (x2 < (rb->w - 1)) x2 = rb->w - 1;
+   sp_start = NULL;
+   sp_stop = NULL;
+   EINA_INLIST_FOREACH(rb->spans[y], span)
+     {
+       nspan = (Regionspan *)(EINA_INLIST_GET(l))->next;
+       /* we dont know what t do with the span yet */
+       if (!sp_start)
+         {
+            /* if new span starts before or on this span or just after
+             * with no gap */
+            if (x1 <= (span->x2))
+              sp_start = span;
+            /* if there is no next span */
+            if (!nspan)
+              {
+                 sp_stop = span;
+                 break;
+              }
+            /* if new span ends before the next span starts with a gap of
+             * 1 pixel (or more) */
+            else if (x2 < nspan->x1)
+              {
+                 sp_stop = span;
+                 break;
+              }
+         }
+       /* we already know it already starts before or in sp_start */
+       else
+         {
+            /* there is no span after this one, so this has to be the stop */
+            if (!nspan)
+              {
+                 sp_stop = span;
+                 break;
+              }
+            /* if new span ends before the next span starts with a gap of
+             * 1 pixel (or more) */
+            else if (x2 < nspan->x1)
+              {
+                 sp_stop = span;
+                 break;
+              }
+         }
+     }
+   /* sp_start is where the new span starts in or before */
+   /* sp_stop is where the new span stops in or after */
+   if ((sp_start) && (sp_stop))
+     {
+       /* same start and stop */
+       if (sp_start == sp_stop)
+         {
+            /* if it ends before this the span start starts... return */
+            if (x2 < sp_start->x1)
+              return;
+            /* it starts on or before this span */
+            else if (x1 <= sp_start->x1)
+              {
+                 /* right edge is within the span */
+                 if (x2 < sp_start->x2)
+                   {
+                      sp_start->x2 = x2;
+                      return;
+                   }
+                 else
+                   {
+                      rb->spans[y] = eina_inlist_remove(rb->spans[y], sp_start);
+                      return;
+                   }
+              }
+            /* it ends on or after the end of thsi span */
+            else if (x2 >= sp_start->x2)
+              {
+                 /* it starts after the start */
+                 if (x1 > sp_start->x1)
+                   {
+                      sp_start->x1 = x1;
+                      return;
+                   }
+                 /* remove it all */
+                 else
+                   {
+                      rb->spans[y] = eina_inlist_remove(rb->spans[y], sp_start);
+                      return;
+                   }
+                 return;
+              }
+            /* this breaks the span into 2 */
+            else
+              {
+                 span2 = calloc(1, sizeof(Regionspan));
+                 span2->x1 = sp_start->x1;
+                 span2->x2 = x1 - 1;
+                 rb->spans[y] = eina_inlist_prepend_relative(rb->spans[y], span2, sp_start);
+                 sp_start->x1 = x2 + 1;
+                 return;
+              }
+         }
+       else
+         {
+            Eina_Inlist *l;
+
+            /* remove all nodes after sp_start and before_sp_stop because
+             * the new  */
+            for (l = (EINA_INLIST_GET(sp_start))->next; l != EINA_INLIST_GET(sp_stop);)
+              {
+                 span = (Regionspan *)l;
+                 l = l->next;
+                 rb->spans[y] = eina_inlist_remove(rb->spans[y], span);
+                 free(span);
+              }
+            /* all of the start span is cut out */
+            if (x1 <= sp_start->x1)
+              {
+                 rb->spans[y] = eina_inlist_remove(rb->spans[y], sp_start);
+                 free(sp_start);
+              }
+            /* chup it off at the new span start */
+            else
+              sp_start->x2 = x1 - 1;
+            /* all of the end span is cut out */
+            if (x2 >= sp_stop->x2)
+              {
+                 rb->spans[y] = eina_inlist_remove(rb->spans[y], sp_stop);
+                 free(sp_stop);
+              }
+            /* chop it up at the end */
+            else
+              sp_stop->x1 = x2 + 1;
+            return;
+         }
+     }
+}
+
+Tilebuf_Rect *
+evas_common_regionbuf_rects_get(Regionbuf *rb)
+{
+   Tilebuf_Rect *rects = NULL, *r;
+   int y;
+
+   /* FIXME: take spans, make rects */
+   for (y = 0; y < rb->h; y++)
+     {
+       Regionspan *sp_start;
+       Eina_Inlist *l, *ll;
+
+       for (l = EINA_INLIST_GET(rb->spans[y]); l;)
+         {
+            Regionspan *span;
+            int yy;
+
+            sp_start = (Regionspan *)l;
+            l = l->next;
+            rb->spans[y] = eina_inlist_remove(rb->spans[y], sp_start);
+            for (yy = y + 1; yy < rb->h; yy++)
+              {
+                 int match = 0;
+
+                 for (ll = EINA_INLIST_GET(rb->spans[yy]); ll;)
+                   {
+                      span = (Regionspan *)ll;
+                      ll = ll->next;
+                      if (span->x1 == sp_start->x1)
+                        {
+                           if ((span->x1 != sp_start->x1) ||
+                               (span->x2 != sp_start->x2))
+                             {
+                                goto coallate;
+                             }
+                           match = 1;
+                           rb->spans[yy] = eina_inlist_remove(rb->spans[yy], span);
+                           free(span);
+                        }
+                   }
+                 if (!match) goto coallate;
+              }
+            coallate:
+            r = calloc(1, sizeof(Tilebuf_Rect));
+            r->x = sp_start->x1;
+            r->y = y;
+            r->w = sp_start->x2 - sp_start->x1 + 1;
+            r->h = yy - y;
+            rects = eina_inlist_append(rects, r);
+            free(sp_start);
+         }
+     }
+   evas_common_regionbuf_clear(rb);
+   return rects;
+}
+#endif
diff --git a/src/lib/engines/common/evas_scale_main.c b/src/lib/engines/common/evas_scale_main.c
new file mode 100644 (file)
index 0000000..8f0f535
--- /dev/null
@@ -0,0 +1,10 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+
+EAPI void
+evas_common_scale_init(void)
+{
+}
diff --git a/src/lib/engines/common/evas_scale_main.h b/src/lib/engines/common/evas_scale_main.h
new file mode 100644 (file)
index 0000000..5da6bdc
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_SCALE_MAIN_H
+#define _EVAS_SCALE_MAIN_H
+
+
+EAPI void evas_common_scale_init                            (void);
+
+EAPI void evas_common_scale_rgba_in_to_out_clip_smooth      (RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h);
+
+EAPI void evas_common_scale_rgba_in_to_out_clip_sample      (RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h);
+
+
+#endif /* _EVAS_SCALE_MAIN_H */
diff --git a/src/lib/engines/common/evas_scale_sample.c b/src/lib/engines/common/evas_scale_sample.c
new file mode 100644 (file)
index 0000000..0d57717
--- /dev/null
@@ -0,0 +1,338 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_blend_private.h"
+
+void scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h);
+
+#ifndef BUILD_SCALE_SMOOTH
+#ifdef BUILD_SCALE_SAMPLE
+EAPI void
+evas_common_scale_rgba_in_to_out_clip_smooth(RGBA_Image *src, RGBA_Image *dst,
+                                RGBA_Draw_Context *dc,
+                                int src_region_x, int src_region_y,
+                                int src_region_w, int src_region_h,
+                                int dst_region_x, int dst_region_y,
+                                int dst_region_w, int dst_region_h)
+{
+   evas_common_scale_rgba_in_to_out_clip_sample(src, dst, dc,
+                                   src_region_x, src_region_y,
+                                   src_region_w, src_region_h,
+                                   dst_region_x, dst_region_y,
+                                   dst_region_w, dst_region_h);
+}
+#endif
+#endif
+
+#ifdef BUILD_SCALE_SAMPLE
+EAPI void
+evas_common_scale_rgba_in_to_out_clip_sample(RGBA_Image *src, RGBA_Image *dst,
+                                RGBA_Draw_Context *dc,
+                                int src_region_x, int src_region_y,
+                                int src_region_w, int src_region_h,
+                                int dst_region_x, int dst_region_y,
+                                int dst_region_w, int dst_region_h)
+{
+   Cutout_Rects *rects;
+   Cutout_Rect  *r;
+   int          c, cx, cy, cw, ch;
+   int          i;
+   /* handle cutouts here! */
+
+   if ((dst_region_w <= 0) || (dst_region_h <= 0)) return;
+   if (!(RECTS_INTERSECT(dst_region_x, dst_region_y, dst_region_w, dst_region_h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
+     return;
+   /* no cutouts - cut right to the chase */
+   if (!dc->cutout.rects)
+     {
+       scale_rgba_in_to_out_clip_sample_internal(src, dst, dc,
+                                                 src_region_x, src_region_y,
+                                                 src_region_w, src_region_h,
+                                                 dst_region_x, dst_region_y,
+                                                 dst_region_w, dst_region_h);
+       return;
+     }
+   /* save out clip info */
+   c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h;
+   evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
+   evas_common_draw_context_clip_clip(dc, dst_region_x, dst_region_y, dst_region_w, dst_region_h);
+   /* our clip is 0 size.. abort */
+   if ((dc->clip.w <= 0) || (dc->clip.h <= 0))
+     {
+       dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch;
+       return;
+     }
+   rects = evas_common_draw_context_apply_cutouts(dc);
+   for (i = 0; i < rects->active; ++i)
+     {
+       r = rects->rects + i;
+       evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h);
+       scale_rgba_in_to_out_clip_sample_internal(src, dst, dc,
+                                                 src_region_x, src_region_y,
+                                                 src_region_w, src_region_h,
+                                                 dst_region_x, dst_region_y,
+                                                 dst_region_w, dst_region_h);
+
+     }
+   evas_common_draw_context_apply_clear_cutouts(rects);
+   /* restore clip info */
+   dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch;
+}
+
+void
+scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst,
+                                         RGBA_Draw_Context *dc,
+                                         int src_region_x, int src_region_y,
+                                         int src_region_w, int src_region_h,
+                                         int dst_region_x, int dst_region_y,
+                                         int dst_region_w, int dst_region_h)
+{
+   int      x, y;
+   int     *lin_ptr;
+   DATA32  *buf, *dptr;
+   DATA32 **row_ptr;
+   DATA32  *ptr, *dst_ptr, *src_data, *dst_data;
+   int      dst_jump;
+   int      dst_clip_x, dst_clip_y, dst_clip_w, dst_clip_h;
+   int      src_w, src_h, dst_w, dst_h;
+   RGBA_Gfx_Func func;
+
+   if (!(RECTS_INTERSECT(dst_region_x, dst_region_y, dst_region_w, dst_region_h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
+     return;
+   if (!(RECTS_INTERSECT(src_region_x, src_region_y, src_region_w, src_region_h, 0, 0, src->cache_entry.w, src->cache_entry.h)))
+     return;
+
+   src_w = src->cache_entry.w;
+   src_h = src->cache_entry.h;
+   dst_w = dst->cache_entry.w;
+   dst_h = dst->cache_entry.h;
+
+   src_data = src->image.data;
+   dst_data = dst->image.data;
+
+   if (dc->clip.use)
+     {
+       dst_clip_x = dc->clip.x;
+       dst_clip_y = dc->clip.y;
+       dst_clip_w = dc->clip.w;
+       dst_clip_h = dc->clip.h;
+       if (dst_clip_x < 0)
+         {
+            dst_clip_w += dst_clip_x;
+            dst_clip_x = 0;
+         }
+       if (dst_clip_y < 0)
+         {
+            dst_clip_h += dst_clip_y;
+            dst_clip_y = 0;
+         }
+       if ((dst_clip_x + dst_clip_w) > dst_w)
+         dst_clip_w = dst_w - dst_clip_x;
+       if ((dst_clip_y + dst_clip_h) > dst_h)
+         dst_clip_h = dst_h - dst_clip_y;
+     }
+   else
+     {
+       dst_clip_x = 0;
+       dst_clip_y = 0;
+       dst_clip_w = dst_w;
+       dst_clip_h = dst_h;
+     }
+
+   if (dst_clip_x < dst_region_x)
+     {
+       dst_clip_w += dst_clip_x - dst_region_x;
+       dst_clip_x = dst_region_x;
+     }
+   if ((dst_clip_x + dst_clip_w) > (dst_region_x + dst_region_w))
+     dst_clip_w = dst_region_x + dst_region_w - dst_clip_x;
+   if (dst_clip_y < dst_region_y)
+     {
+       dst_clip_h += dst_clip_y - dst_region_y;
+       dst_clip_y = dst_region_y;
+     }
+   if ((dst_clip_y + dst_clip_h) > (dst_region_y + dst_region_h))
+     dst_clip_h = dst_region_y + dst_region_h - dst_clip_y;
+
+   if ((src_region_w <= 0) || (src_region_h <= 0) ||
+       (dst_region_w <= 0) || (dst_region_h <= 0) ||
+       (dst_clip_w <= 0) || (dst_clip_h <= 0))
+     return;
+
+   /* sanitise x */
+   if (src_region_x < 0)
+     {
+       dst_region_x -= (src_region_x * dst_region_w) / src_region_w;
+       dst_region_w += (src_region_x * dst_region_w) / src_region_w;
+       src_region_w += src_region_x;
+       src_region_x = 0;
+     }
+   if (src_region_x >= src_w) return;
+   if ((src_region_x + src_region_w) > src_w)
+     {
+       dst_region_w = (dst_region_w * (src_w - src_region_x)) / (src_region_w);
+       src_region_w = src_w - src_region_x;
+     }
+   if (dst_region_w <= 0) return;
+   if (src_region_w <= 0) return;
+   if (dst_clip_x < 0)
+     {
+       dst_clip_w += dst_clip_x;
+       dst_clip_x = 0;
+     }
+   if (dst_clip_w <= 0) return;
+   if (dst_clip_x >= dst_w) return;
+   if (dst_clip_x < dst_region_x)
+     {
+       dst_clip_w += (dst_clip_x - dst_region_x);
+       dst_clip_x = dst_region_x;
+     }
+   if ((dst_clip_x + dst_clip_w) > dst_w)
+     {
+       dst_clip_w = dst_w - dst_clip_x;
+     }
+   if (dst_clip_w <= 0) return;
+
+   /* sanitise y */
+   if (src_region_y < 0)
+     {
+       dst_region_y -= (src_region_y * dst_region_h) / src_region_h;
+       dst_region_h += (src_region_y * dst_region_h) / src_region_h;
+       src_region_h += src_region_y;
+       src_region_y = 0;
+     }
+   if (src_region_y >= src_h) return;
+   if ((src_region_y + src_region_h) > src_h)
+     {
+       dst_region_h = (dst_region_h * (src_h - src_region_y)) / (src_region_h);
+       src_region_h = src_h - src_region_y;
+     }
+   if (dst_region_h <= 0) return;
+   if (src_region_h <= 0) return;
+   if (dst_clip_y < 0)
+     {
+       dst_clip_h += dst_clip_y;
+       dst_clip_y = 0;
+     }
+   if (dst_clip_h <= 0) return;
+   if (dst_clip_y >= dst_h) return;
+   if (dst_clip_y < dst_region_y)
+     {
+       dst_clip_h += (dst_clip_y - dst_region_y);
+       dst_clip_y = dst_region_y;
+     }
+   if ((dst_clip_y + dst_clip_h) > dst_h)
+     {
+       dst_clip_h = dst_h - dst_clip_y;
+     }
+   if (dst_clip_h <= 0) return;
+
+   /* allocate scale lookup tables */
+   lin_ptr = alloca(dst_clip_w * sizeof(int));
+   row_ptr = alloca(dst_clip_h * sizeof(DATA32 *));
+
+   /* figure out dst jump */
+   dst_jump = dst_w - dst_clip_w;
+
+   /* figure out dest start ptr */
+   dst_ptr = dst_data + dst_clip_x + (dst_clip_y * dst_w);
+
+   if (dc->mul.use)
+     func = evas_common_gfx_func_composite_pixel_color_span_get(src, dc->mul.col, dst, dst_clip_w, dc->render_op);
+   else
+     func = evas_common_gfx_func_composite_pixel_span_get(src, dst, dst_clip_w, dc->render_op);
+
+   if ((dst_region_w == src_region_w) && (dst_region_h == src_region_h))
+     {
+       ptr = src_data + ((dst_clip_y - dst_region_y + src_region_y) * src_w) + (dst_clip_x - dst_region_x) + src_region_x;
+       for (y = 0; y < dst_clip_h; y++)
+         {
+           /* * blend here [clip_w *] ptr -> dst_ptr * */
+#ifdef EVAS_SLI
+            if (((y + dst_clip_y) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 func(ptr, NULL, dc->mul.col, dst_ptr, dst_clip_w);
+              }
+           ptr += src_w;
+           dst_ptr += dst_w;
+         }
+     }
+   else
+     {
+       /* fill scale tables */
+       for (x = 0; x < dst_clip_w; x++)
+           lin_ptr[x] = (((x + dst_clip_x - dst_region_x) * src_region_w) / dst_region_w) + src_region_x;
+       for (y = 0; y < dst_clip_h; y++)
+           row_ptr[y] = src_data + (((((y + dst_clip_y - dst_region_y) * src_region_h) / dst_region_h)
+                       + src_region_y) * src_w);
+       /* scale to dst */
+       dptr = dst_ptr;
+#ifdef DIRECT_SCALE
+       if ((!src->cache_entry.flags.alpha) &&
+            (!dst->cache_entry.flags.alpha) &&
+            (!dc->mul.use))
+         {
+            for (y = 0; y < dst_clip_h; y++)
+              {
+#ifdef EVAS_SLI
+                if (((y + dst_clip_y) % dc->sli.h) == dc->sli.y)
+#endif
+                  {
+                     dst_ptr = dptr;
+                     for (x = 0; x < dst_clip_w; x++)
+                       {
+                          ptr = row_ptr[y] + lin_ptr[x];
+                          *dst_ptr = *ptr;
+                          dst_ptr++;
+                       }
+                  }
+                dptr += dst_w;
+             }
+         }
+       else
+#endif
+         {
+           /* a scanline buffer */
+           buf = alloca(dst_clip_w * sizeof(DATA32));
+           for (y = 0; y < dst_clip_h; y++)
+             {
+#ifdef EVAS_SLI
+                if (((y + dst_clip_y) % dc->sli.h) == dc->sli.y)
+#endif
+                  {
+                     dst_ptr = buf;
+                     for (x = 0; x < dst_clip_w; x++)
+                       {
+                          ptr = row_ptr[y] + lin_ptr[x];
+                          *dst_ptr = *ptr;
+                          dst_ptr++;
+                       }
+                     /* * blend here [clip_w *] buf -> dptr * */
+                     func(buf, NULL, dc->mul.col, dptr, dst_clip_w);
+                  }
+               dptr += dst_w;
+             }
+         }
+     }
+}
+#else
+#ifdef BUILD_SCALE_SMOOTH
+EAPI void
+evas_common_scale_rgba_in_to_out_clip_sample(RGBA_Image *src, RGBA_Image *dst,
+                                RGBA_Draw_Context *dc,
+                                int src_region_x, int src_region_y,
+                                int src_region_w, int src_region_h,
+                                int dst_region_x, int dst_region_y,
+                                int dst_region_w, int dst_region_h)
+{
+   evas_common_scale_rgba_in_to_out_clip_smooth(src, dst, dc,
+                                   src_region_x, src_region_y,
+                                   src_region_w, src_region_h,
+                                   dst_region_x, dst_region_y,
+                                   dst_region_w, dst_region_h);
+}
+#endif
+#endif
diff --git a/src/lib/engines/common/evas_scale_smooth.c b/src/lib/engines/common/evas_scale_smooth.c
new file mode 100644 (file)
index 0000000..cd6c5d6
--- /dev/null
@@ -0,0 +1,524 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_scale_smooth.h"
+#include "evas_blend_private.h"
+
+#define SCALE_CALC_X_POINTS(P, SW, DW)         \
+  P = alloca((DW + 1) * sizeof (int));         \
+  scale_calc_x_points(P, SW, DW);
+
+#define SCALE_CALC_Y_POINTS(P, SRC, SW, SH, DH)        \
+  P = alloca((DH + 1) * sizeof (DATA32 *));    \
+  scale_calc_y_points(P, SRC, SW, SH, DH);
+
+#define SCALE_CALC_A_POINTS(P, S, D)           \
+  P = alloca(D * sizeof (int));                        \
+  scale_calc_a_points(P, S, D);
+
+static void scale_calc_y_points(DATA32** p, DATA32 *src, int sw, int sh, int dh);
+static void scale_calc_x_points(int *p, int sw, int dw);
+static void scale_calc_a_points(int *p, int s, int d);
+
+static void
+scale_calc_y_points(DATA32** p, DATA32 *src, int sw, int sh, int dh)
+{
+   int i, val, inc;
+
+   val = 0;
+   inc = (sh << 16) / dh;
+   for (i = 0; i < dh; i++)
+     {
+       p[i] = src + ((val >> 16) * sw);
+       val += inc;
+     }
+   p[i] = p[i - 1];
+}
+
+static void
+scale_calc_x_points(int *p, int sw, int dw)
+{
+   int i, val, inc;
+
+   val = 0;
+   inc = (sw << 16) / dw;
+   for (i = 0; i < dw; i++)
+     {
+       p[i] = val >> 16;
+       val += inc;
+     }
+   p[i] = p[i - 1];
+}
+
+static void
+scale_calc_a_points(int *p, int s, int d)
+{
+   int i, val, inc;
+
+   if (d >= s)
+     {
+       val = 0;
+       inc = (s << 16) / d;
+       for (i = 0; i < d; i++)
+         {
+            p[i] = (val >> 8) - ((val >> 8) & 0xffffff00);
+            if ((val >> 16) >= (s - 1)) p[i] = 0;
+            val += inc;
+         }
+     }
+   else
+     {
+       int ap, Cp;
+
+       val = 0;
+       inc = (s << 16) / d;
+       Cp = ((d << 14) / s) + 1;
+       for (i = 0; i < d; i++)
+         {
+            ap = ((0x100 - ((val >> 8) & 0xff)) * Cp) >> 8;
+            p[i] = ap | (Cp << 16);
+            val += inc;
+         }
+     }
+//   sleep(1);
+}
+
+#ifdef BUILD_SCALE_SMOOTH
+#ifdef BUILD_C
+EAPI void
+evas_common_scale_rgba_mipmap_down_2x2_c(DATA32 *src, DATA32 *dst, int src_w, int src_h)
+{
+   int x, y, dst_w, dst_h;
+   DATA32 *src_ptr, *src_ptr2, *dst_ptr;
+
+   dst_w = src_w >> 1;
+   dst_h = src_h >> 1;
+
+   if (dst_w < 1) dst_w = 1;
+   if (dst_h < 1) dst_h = 1;
+
+   src_ptr = src;
+   src_ptr2 = src + src_w;
+   dst_ptr = dst;
+   for (y = 0; y < dst_h; y++)
+     {
+       src_ptr = src + (y * src_w * 2);
+       src_ptr2 = src_ptr + src_w;
+       for (x = 0; x < dst_w; x++)
+         {
+            R_VAL(dst_ptr) = (R_VAL(src_ptr) + R_VAL(src_ptr + 1) + R_VAL(src_ptr2) + R_VAL(src_ptr2 + 1)) >> 2;
+            G_VAL(dst_ptr) = (G_VAL(src_ptr) + G_VAL(src_ptr + 1) + G_VAL(src_ptr2) + G_VAL(src_ptr2 + 1)) >> 2;
+            B_VAL(dst_ptr) = (B_VAL(src_ptr) + B_VAL(src_ptr + 1) + B_VAL(src_ptr2) + B_VAL(src_ptr2 + 1)) >> 2;
+            A_VAL(dst_ptr) = (A_VAL(src_ptr) + A_VAL(src_ptr + 1) + A_VAL(src_ptr2) + A_VAL(src_ptr2 + 1)) >> 2;
+
+            src_ptr+=2;
+            src_ptr2+=2;
+            dst_ptr++;
+         }
+     }
+}
+#endif
+#endif
+
+#ifdef BUILD_SCALE_SMOOTH
+#ifdef BUILD_C
+EAPI void
+evas_common_scale_rgba_mipmap_down_2x1_c(DATA32 *src, DATA32 *dst, int src_w, int src_h)
+{
+   int x, y, dst_w, dst_h;
+   DATA32 *src_ptr, *dst_ptr;
+
+   dst_w = src_w >> 1;
+   dst_h = src_h >> 1;
+
+   if (dst_w < 1) dst_w = 1;
+   if (dst_h < 1) dst_h = 1;
+
+   src_ptr = src;
+   dst_ptr = dst;
+   for (y = 0; y < dst_h; y++)
+     {
+       src_ptr = src + (y * src_w * 2);
+       for (x = 0; x < dst_w; x++)
+         {
+            R_VAL(dst_ptr) = (R_VAL(src_ptr) + R_VAL(src_ptr + 1)) >> 1;
+            G_VAL(dst_ptr) = (G_VAL(src_ptr) + G_VAL(src_ptr + 1)) >> 1;
+            B_VAL(dst_ptr) = (B_VAL(src_ptr) + B_VAL(src_ptr + 1)) >> 1;
+            A_VAL(dst_ptr) = (A_VAL(src_ptr) + A_VAL(src_ptr + 1)) >> 1;
+
+            src_ptr+=2;
+            dst_ptr++;
+         }
+     }
+}
+#endif
+#endif
+
+#ifdef BUILD_SCALE_SMOOTH
+#ifdef BUILD_C
+EAPI void
+evas_common_scale_rgba_mipmap_down_1x2_c(DATA32 *src, DATA32 *dst, int src_w, int src_h)
+{
+   int x, y, dst_w, dst_h;
+   DATA32 *src_ptr, *src_ptr2, *dst_ptr;
+
+   dst_w = src_w >> 1;
+   dst_h = src_h >> 1;
+
+   if (dst_w < 1) dst_w = 1;
+   if (dst_h < 1) dst_h = 1;
+
+   src_ptr = src;
+   src_ptr2 = src + src_w;
+   dst_ptr = dst;
+   for (y = 0; y < dst_h; y++)
+     {
+       src_ptr = src + (y * src_w * 2);
+       src_ptr2 = src_ptr + src_w;
+       for (x = 0; x < dst_w; x++)
+         {
+            R_VAL(dst_ptr) = (R_VAL(src_ptr) + R_VAL(src_ptr2)) >> 1;
+            G_VAL(dst_ptr) = (G_VAL(src_ptr) + G_VAL(src_ptr2)) >> 1;
+            B_VAL(dst_ptr) = (B_VAL(src_ptr) + B_VAL(src_ptr2)) >> 1;
+            A_VAL(dst_ptr) = (A_VAL(src_ptr) + A_VAL(src_ptr2)) >> 1;
+
+            src_ptr+=2;
+            src_ptr2+=2;
+            dst_ptr++;
+         }
+     }
+}
+#endif
+#endif
+
+#ifdef BUILD_SCALE_SMOOTH
+#ifdef BUILD_C
+EAPI void
+evas_common_scale_rgb_mipmap_down_2x2_c(DATA32 *src, DATA32 *dst, int src_w, int src_h)
+{
+   int x, y, dst_w, dst_h;
+   DATA32 *src_ptr, *src_ptr2, *dst_ptr;
+
+   dst_w = src_w >> 1;
+   dst_h = src_h >> 1;
+
+   if (dst_w < 1) dst_w = 1;
+   if (dst_h < 1) dst_h = 1;
+
+   src_ptr = src;
+   src_ptr2 = src + src_w;
+   dst_ptr = dst;
+   for (y = 0; y < dst_h; y++)
+     {
+       for (x = 0; x < dst_w; x++)
+         {
+            R_VAL(dst_ptr) = (R_VAL(src_ptr) + R_VAL(src_ptr + 1) + R_VAL(src_ptr2) + R_VAL(src_ptr2 + 1)) >> 2;
+            G_VAL(dst_ptr) = (G_VAL(src_ptr) + G_VAL(src_ptr + 1) + G_VAL(src_ptr2) + G_VAL(src_ptr2 + 1)) >> 2;
+            B_VAL(dst_ptr) = (B_VAL(src_ptr) + B_VAL(src_ptr + 1) + B_VAL(src_ptr2) + B_VAL(src_ptr2 + 1)) >> 2;
+            A_VAL(dst_ptr) = 0xff;
+
+            src_ptr+=2;
+            src_ptr2+=2;
+            dst_ptr++;
+         }
+       src_ptr += src_w;
+       src_ptr2 += src_w;
+     }
+}
+#endif
+#endif
+
+#ifdef BUILD_SCALE_SMOOTH
+#ifdef BUILD_C
+EAPI void
+evas_common_scale_rgb_mipmap_down_2x1_c(DATA32 *src, DATA32 *dst, int src_w, int src_h)
+{
+   int x, y, dst_w, dst_h;
+   DATA32 *src_ptr, *dst_ptr;
+
+   dst_w = src_w >> 1;
+   dst_h = src_h >> 1;
+
+   if (dst_w < 1) dst_w = 1;
+   if (dst_h < 1) dst_h = 1;
+
+   src_ptr = src;
+   dst_ptr = dst;
+   for (y = 0; y < dst_h; y++)
+     {
+       for (x = 0; x < dst_w; x++)
+         {
+            R_VAL(dst_ptr) = (R_VAL(src_ptr) + R_VAL(src_ptr + 1)) >> 1;
+            G_VAL(dst_ptr) = (G_VAL(src_ptr) + G_VAL(src_ptr + 1)) >> 1;
+            B_VAL(dst_ptr) = (B_VAL(src_ptr) + B_VAL(src_ptr + 1)) >> 1;
+            A_VAL(dst_ptr) = 0xff;
+
+            src_ptr+=2;
+            dst_ptr++;
+         }
+       src_ptr += src_w;
+     }
+}
+#endif
+#endif
+
+#ifdef BUILD_SCALE_SMOOTH
+#ifdef BUILD_C
+EAPI void
+evas_common_scale_rgb_mipmap_down_1x2_c(DATA32 *src, DATA32 *dst, int src_w, int src_h)
+{
+   int x, y, dst_w, dst_h;
+   DATA32 *src_ptr, *src_ptr2, *dst_ptr;
+
+   dst_w = src_w >> 1;
+   dst_h = src_h >> 1;
+
+   if (dst_w < 1) dst_w = 1;
+   if (dst_h < 1) dst_h = 1;
+
+   src_ptr = src;
+   src_ptr2 = src + src_w;
+   dst_ptr = dst;
+   for (y = 0; y < dst_h; y++)
+     {
+       for (x = 0; x < dst_w; x++)
+         {
+            R_VAL(dst_ptr) = (R_VAL(src_ptr) + R_VAL(src_ptr2)) >> 1;
+            G_VAL(dst_ptr) = (G_VAL(src_ptr) + G_VAL(src_ptr2)) >> 1;
+            B_VAL(dst_ptr) = (B_VAL(src_ptr) + B_VAL(src_ptr2)) >> 1;
+            A_VAL(dst_ptr) = 0xff;
+
+            src_ptr+=2;
+            src_ptr2+=2;
+            dst_ptr++;
+         }
+       src_ptr += src_w;
+       src_ptr2 += src_w;
+     }
+}
+#endif
+#endif
+
+#ifdef BUILD_SCALE_SMOOTH
+#ifdef BUILD_MMX
+EAPI void
+evas_common_scale_rgba_mipmap_down_2x2_mmx(DATA32 *src, DATA32 *dst, int src_w, int src_h)
+{
+   int x, y, dst_w, dst_h;
+   DATA32 *src_ptr, *src_ptr2, *dst_ptr;
+
+   dst_w = src_w >> 1;
+   dst_h = src_h >> 1;
+
+   if (dst_w < 1) dst_w = 1;
+   if (dst_h < 1) dst_h = 1;
+
+   src_ptr = src;
+   src_ptr2 = src + src_w;
+   dst_ptr = dst;
+   for (y = 0; y < dst_h; y++)
+     {
+       src_ptr = src + (y * src_w * 2);
+       src_ptr2 = src_ptr + src_w;
+       for (x = 0; x < dst_w; x++)
+         {
+            punpcklbw_m2r(src_ptr[0], mm0);
+            punpcklbw_m2r(src_ptr[1], mm1);
+            punpcklbw_m2r(src_ptr2[0], mm2);
+            punpcklbw_m2r(src_ptr2[1], mm3);
+            psrlw_i2r(8, mm0);
+            psrlw_i2r(8, mm1);
+            psrlw_i2r(8, mm2);
+            psrlw_i2r(8, mm3);
+            paddw_r2r(mm1, mm0);
+            paddw_r2r(mm2, mm0);
+            paddw_r2r(mm3, mm0);
+            psrlw_i2r(2, mm0);
+            packuswb_r2r(mm0, mm0);
+            movd_r2m(mm0, dst_ptr[0]);
+
+            src_ptr+=2;
+            src_ptr2+=2;
+            dst_ptr++;
+         }
+     }
+}
+#endif
+#endif
+
+#ifdef BUILD_SCALE_SMOOTH
+#ifdef BUILD_MMX
+EAPI void
+evas_common_scale_rgba_mipmap_down_2x1_mmx(DATA32 *src, DATA32 *dst, int src_w, int src_h)
+{
+   int x, y, dst_w, dst_h;
+   DATA32 *src_ptr, *dst_ptr;
+
+   dst_w = src_w >> 1;
+   dst_h = src_h >> 1;
+
+   if (dst_w < 1) dst_w = 1;
+   if (dst_h < 1) dst_h = 1;
+
+   src_ptr = src;
+   dst_ptr = dst;
+   for (y = 0; y < dst_h; y++)
+     {
+       src_ptr = src + (y * src_w * 2);
+       for (x = 0; x < dst_w; x++)
+         {
+            punpcklbw_m2r(src_ptr[0], mm0);
+            punpcklbw_m2r(src_ptr[1], mm1);
+            psrlw_i2r(8, mm0);
+            psrlw_i2r(8, mm1);
+            paddw_r2r(mm1, mm0);
+            psrlw_i2r(1, mm0);
+            packuswb_r2r(mm0, mm0);
+            movd_r2m(mm0, dst_ptr[0]);
+
+            src_ptr+=2;
+            dst_ptr++;
+         }
+     }
+}
+#endif
+#endif
+
+#ifdef BUILD_SCALE_SMOOTH
+#ifdef BUILD_MMX
+EAPI void
+evas_common_scale_rgba_mipmap_down_1x2_mmx(DATA32 *src, DATA32 *dst, int src_w, int src_h)
+{
+   int x, y, dst_w, dst_h;
+   DATA32 *src_ptr, *src_ptr2, *dst_ptr;
+
+   dst_w = src_w >> 1;
+   dst_h = src_h >> 1;
+
+   if (dst_w < 1) dst_w = 1;
+   if (dst_h < 1) dst_h = 1;
+
+   src_ptr = src;
+   src_ptr2 = src + src_w;
+   dst_ptr = dst;
+   for (y = 0; y < dst_h; y++)
+     {
+       src_ptr = src + (y * src_w * 2);
+       src_ptr2 = src_ptr + src_w;
+       for (x = 0; x < dst_w; x++)
+         {
+            punpcklbw_m2r(src_ptr[0], mm0);
+            punpcklbw_m2r(src_ptr2[0], mm1);
+            psrlw_i2r(8, mm0);
+            psrlw_i2r(8, mm1);
+            paddw_r2r(mm1, mm0);
+            psrlw_i2r(1, mm0);
+            packuswb_r2r(mm0, mm0);
+            movd_r2m(mm0, dst_ptr[0]);
+
+            src_ptr+=2;
+            src_ptr2+=2;
+            dst_ptr++;
+         }
+     }
+}
+#endif
+#endif
+
+#ifdef BUILD_SCALE_SMOOTH
+# ifdef BUILD_MMX
+#  undef SCALE_FUNC
+#  define SCALE_FUNC evas_common_scale_rgba_in_to_out_clip_smooth_mmx
+#  undef SCALE_USING_MMX
+#  define SCALE_USING_MMX
+#  include "evas_scale_smooth_scaler.c"
+# endif
+# ifdef BUILD_C
+#  undef SCALE_FUNC
+#  define SCALE_FUNC evas_common_scale_rgba_in_to_out_clip_smooth_c
+#  undef SCALE_USING_MMX
+#  include "evas_scale_smooth_scaler.c"
+# endif
+EAPI void
+evas_common_scale_rgba_in_to_out_clip_smooth(RGBA_Image *src, RGBA_Image *dst,
+                                RGBA_Draw_Context *dc,
+                                int src_region_x, int src_region_y,
+                                int src_region_w, int src_region_h,
+                                int dst_region_x, int dst_region_y,
+                                int dst_region_w, int dst_region_h)
+{
+# ifdef BUILD_MMX
+   int mmx, sse, sse2;
+# endif
+   Cutout_Rects *rects;
+   Cutout_Rect  *r;
+   int          c, cx, cy, cw, ch;
+   int          i;
+   /* handle cutouts here! */
+
+   if ((dst_region_w <= 0) || (dst_region_h <= 0)) return;
+   if (!(RECTS_INTERSECT(dst_region_x, dst_region_y, dst_region_w, dst_region_h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
+     return;
+# ifdef BUILD_MMX
+   evas_common_cpu_can_do(&mmx, &sse, &sse2);
+# endif
+   /* no cutouts - cut right to the chase */
+   if (!dc->cutout.rects)
+     {
+# ifdef BUILD_MMX
+       if (mmx)
+         evas_common_scale_rgba_in_to_out_clip_smooth_mmx(src, dst, dc,
+                                              src_region_x, src_region_y,
+                                              src_region_w, src_region_h,
+                                              dst_region_x, dst_region_y,
+                                              dst_region_w, dst_region_h);
+       else
+# endif
+# ifdef BUILD_C
+         evas_common_scale_rgba_in_to_out_clip_smooth_c(src, dst, dc,
+                                            src_region_x, src_region_y,
+                                            src_region_w, src_region_h,
+                                            dst_region_x, dst_region_y,
+                                            dst_region_w, dst_region_h);
+# endif
+       return;
+     }
+   /* save out clip info */
+   c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h;
+   evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
+   evas_common_draw_context_clip_clip(dc, dst_region_x, dst_region_y, dst_region_w, dst_region_h);
+   /* our clip is 0 size.. abort */
+   if ((dc->clip.w <= 0) || (dc->clip.h <= 0))
+     {
+       dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch;
+       return;
+     }
+   rects = evas_common_draw_context_apply_cutouts(dc);
+   for (i = 0; i < rects->active; ++i)
+     {
+       r = rects->rects + i;
+       evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h);
+# ifdef BUILD_MMX
+       if (mmx)
+         evas_common_scale_rgba_in_to_out_clip_smooth_mmx(src, dst, dc,
+                                              src_region_x, src_region_y,
+                                              src_region_w, src_region_h,
+                                              dst_region_x, dst_region_y,
+                                              dst_region_w, dst_region_h);
+       else
+# endif
+# ifdef BUILD_C
+         evas_common_scale_rgba_in_to_out_clip_smooth_c(src, dst, dc,
+                                            src_region_x, src_region_y,
+                                            src_region_w, src_region_h,
+                                            dst_region_x, dst_region_y,
+                                            dst_region_w, dst_region_h);
+# endif
+     }
+   evas_common_draw_context_apply_clear_cutouts(rects);
+   /* restore clip info */
+   dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch;
+}
+#endif
diff --git a/src/lib/engines/common/evas_scale_smooth.h b/src/lib/engines/common/evas_scale_smooth.h
new file mode 100644 (file)
index 0000000..d4bfb46
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_SCALE_SMOOTH_H
+#define _EVAS_SCALE_SMOOTH_H
+
+EAPI void evas_common_scale_rgba_mipmap_down_2x2_c          (DATA32 *src, DATA32 *dst, int src_w, int src_h);
+EAPI void evas_common_scale_rgba_mipmap_down_2x1_c          (DATA32 *src, DATA32 *dst, int src_w, int src_h);
+EAPI void evas_common_scale_rgba_mipmap_down_1x2_c          (DATA32 *src, DATA32 *dst, int src_w, int src_h);
+EAPI void evas_common_scale_rgb_mipmap_down_2x2_c           (DATA32 *src, DATA32 *dst, int src_w, int src_h);
+EAPI void evas_common_scale_rgb_mipmap_down_2x1_c           (DATA32 *src, DATA32 *dst, int src_w, int src_h);
+EAPI void evas_common_scale_rgb_mipmap_down_1x2_c           (DATA32 *src, DATA32 *dst, int src_w, int src_h);
+
+EAPI void evas_common_scale_rgba_mipmap_down_2x2_mmx        (DATA32 *src, DATA32 *dst, int src_w, int src_h);
+EAPI void evas_common_scale_rgba_mipmap_down_2x1_mmx        (DATA32 *src, DATA32 *dst, int src_w, int src_h);
+EAPI void evas_common_scale_rgba_mipmap_down_1x2_mmx        (DATA32 *src, DATA32 *dst, int src_w, int src_h);
+
+EAPI void evas_common_scale_rgba_in_to_out_clip_smooth_mmx  (RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h);
+EAPI void evas_common_scale_rgba_in_to_out_clip_smooth_c    (RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h);
+
+
+#endif /* _EVAS_SCALE_SMOOTH_H */
diff --git a/src/lib/engines/common/evas_scale_smooth_scaler.c b/src/lib/engines/common/evas_scale_smooth_scaler.c
new file mode 100644 (file)
index 0000000..6cf7cc6
--- /dev/null
@@ -0,0 +1,205 @@
+void
+SCALE_FUNC(RGBA_Image *src, RGBA_Image *dst,
+          RGBA_Draw_Context *dc,
+          int src_region_x, int src_region_y,
+          int src_region_w, int src_region_h,
+          int dst_region_x, int dst_region_y,
+          int dst_region_w, int dst_region_h)
+{
+   DATA32  *dst_ptr;
+   int      dst_jump;
+   int      dst_clip_x, dst_clip_y, dst_clip_w, dst_clip_h;
+   int      src_w, src_h, dst_w, dst_h;
+
+   if (!(RECTS_INTERSECT(dst_region_x, dst_region_y, dst_region_w, dst_region_h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
+     return;
+   if (!(RECTS_INTERSECT(src_region_x, src_region_y, src_region_w, src_region_h, 0, 0, src->cache_entry.w, src->cache_entry.h)))
+     return;
+
+   src_w = src->cache_entry.w;
+   src_h = src->cache_entry.h;
+   dst_w = dst->cache_entry.w;
+   dst_h = dst->cache_entry.h;
+
+   if (dc->clip.use)
+     {
+       dst_clip_x = dc->clip.x;
+       dst_clip_y = dc->clip.y;
+       dst_clip_w = dc->clip.w;
+       dst_clip_h = dc->clip.h;
+       if (dst_clip_x < 0)
+         {
+            dst_clip_w += dst_clip_x;
+            dst_clip_x = 0;
+         }
+       if (dst_clip_y < 0)
+         {
+            dst_clip_h += dst_clip_y;
+            dst_clip_y = 0;
+         }
+       if ((dst_clip_w <= 0) || (dst_clip_h <= 0)) return;
+       if ((dst_clip_x + dst_clip_w) > dst_w) dst_clip_w = dst_w - dst_clip_x;
+       if ((dst_clip_y + dst_clip_h) > dst_h) dst_clip_h = dst_h - dst_clip_y;
+     }
+   else
+     {
+       dst_clip_x = 0;
+       dst_clip_y = 0;
+       dst_clip_w = dst_w;
+       dst_clip_h = dst_h;
+     }
+
+   if (dst_clip_x < dst_region_x)
+     {
+       dst_clip_w += dst_clip_x - dst_region_x;
+       dst_clip_x = dst_region_x;
+     }
+   if ((dst_clip_x + dst_clip_w) > (dst_region_x + dst_region_w))
+     dst_clip_w = dst_region_x + dst_region_w - dst_clip_x;
+   if (dst_clip_y < dst_region_y)
+     {
+       dst_clip_h += dst_clip_y - dst_region_y;
+       dst_clip_y = dst_region_y;
+     }
+   if ((dst_clip_y + dst_clip_h) > (dst_region_y + dst_region_h))
+     dst_clip_h = dst_region_y + dst_region_h - dst_clip_y;
+
+   if ((src_region_w <= 0) || (src_region_h <= 0) ||
+       (dst_region_w <= 0) || (dst_region_h <= 0) ||
+       (dst_clip_w <= 0) || (dst_clip_h <= 0))
+     return;
+
+   /* sanitise x */
+   if (src_region_x < 0)
+     {
+       dst_region_x -= (src_region_x * dst_region_w) / src_region_w;
+       dst_region_w += (src_region_x * dst_region_w) / src_region_w;
+       src_region_w += src_region_x;
+       src_region_x = 0;
+     }
+   if (src_region_x >= src_w) return;
+   if ((src_region_x + src_region_w) > src_w)
+     {
+       dst_region_w = (dst_region_w * (src_w - src_region_x)) / (src_region_w);
+       src_region_w = src_w - src_region_x;
+     }
+   if (dst_region_w <= 0) return;
+   if (src_region_w <= 0) return;
+   if (dst_clip_x < 0)
+     {
+       dst_clip_w += dst_clip_x;
+       dst_clip_x = 0;
+     }
+   if (dst_clip_w <= 0) return;
+   if (dst_clip_x >= dst_w) return;
+   if (dst_clip_x < dst_region_x)
+     {
+       dst_clip_w += (dst_clip_x - dst_region_x);
+       dst_clip_x = dst_region_x;
+     }
+   if ((dst_clip_x + dst_clip_w) > dst_w)
+     {
+       dst_clip_w = dst_w - dst_clip_x;
+     }
+   if (dst_clip_w <= 0) return;
+
+   /* sanitise y */
+   if (src_region_y < 0)
+     {
+       dst_region_y -= (src_region_y * dst_region_h) / src_region_h;
+       dst_region_h += (src_region_y * dst_region_h) / src_region_h;
+       src_region_h += src_region_y;
+       src_region_y = 0;
+     }
+   if (src_region_y >= src_h) return;
+   if ((src_region_y + src_region_h) > src_h)
+     {
+       dst_region_h = (dst_region_h * (src_h - src_region_y)) / (src_region_h);
+       src_region_h = src_h - src_region_y;
+     }
+   if (dst_region_h <= 0) return;
+   if (src_region_h <= 0) return;
+   if (dst_clip_y < 0)
+     {
+       dst_clip_h += dst_clip_y;
+       dst_clip_y = 0;
+     }
+   if (dst_clip_h <= 0) return;
+   if (dst_clip_y >= dst_h) return;
+   if (dst_clip_y < dst_region_y)
+     {
+       dst_clip_h += (dst_clip_y - dst_region_y);
+       dst_clip_y = dst_region_y;
+     }
+   if ((dst_clip_y + dst_clip_h) > dst_h)
+     {
+       dst_clip_h = dst_h - dst_clip_y;
+     }
+   if (dst_clip_h <= 0) return;
+
+   /* figure out dst jump */
+   dst_jump = dst_w - dst_clip_w;
+
+   /* figure out dest start ptr */
+   dst_ptr = dst->image.data + dst_clip_x + (dst_clip_y * dst_w);
+
+/* FIXME:
+ *
+ * things to do later for speedups:
+ *
+ * break upscale into 3 cases (as listed below - up:up, 1:up, up:1)
+ *
+ * break downscale into more cases (as listed below)
+ *
+ * roll func (blend/copy/cultiply/cmod) code into inner loop of scaler.
+ * (578 fps vs 550 in mmx upscale in evas demo - this means probably
+ *  a good 10-15% speedup over the func call, but means massively larger
+ *  code)
+ *
+ * anything involving downscaling has no mmx equivalent code and maybe the
+ * C could do with a little work.
+ *
+ * ---------------------------------------------------------------------------
+ *
+ * (1 = no scaling (1:1 ratio), + = scale up, - = scale down)
+ * (* == fully optimised mmx, # = fully optimised C)
+ *
+ * h:v mmx C
+ *
+ * 1:1 *   #
+ *
+ * +:+ *   #
+ * 1:+ *   #
+ * +:1 *   #
+ *
+ * 1:-
+ * -:1
+ * +:-
+ * -:+
+ * -:-
+ *
+ */
+
+   /* if 1:1 scale */
+   if ((dst_region_w == src_region_w) &&
+       (dst_region_h == src_region_h))
+     {
+#include "evas_scale_smooth_scaler_noscale.c"
+     }
+   else
+     {
+       /* scaling up only - dont need anything except original */
+//     if ((!dc->anti_alias) || ((dst_region_w >= src_region_w) && (dst_region_h >= src_region_h)))
+       if (((dst_region_w >= src_region_w) && (dst_region_h >= src_region_h)))
+         {
+#include "evas_scale_smooth_scaler_up.c"
+            return;
+         }
+       else
+         /* scaling down... funkiness */
+         {
+#include "evas_scale_smooth_scaler_down.c"
+            return;
+         }
+     }
+}
diff --git a/src/lib/engines/common/evas_scale_smooth_scaler_down.c b/src/lib/engines/common/evas_scale_smooth_scaler_down.c
new file mode 100644 (file)
index 0000000..859f2f3
--- /dev/null
@@ -0,0 +1,42 @@
+{
+   DATA32  **ypoints;
+   int     *xpoints;
+   int     *xapoints, *xapp;
+   int     *yapoints, *yapp;
+   DATA32  *buf, *src_data;
+
+   RGBA_Gfx_Func      func;
+
+   src_data = src->image.data;
+
+   SCALE_CALC_X_POINTS(xpoints, src_region_w, dst_region_w);
+   SCALE_CALC_Y_POINTS(ypoints, src_data, src_w, src_region_h, dst_region_h);
+   SCALE_CALC_A_POINTS(xapoints, src_region_w, dst_region_w);
+   SCALE_CALC_A_POINTS(yapoints, src_region_h, dst_region_h);
+
+   /* a scanline buffer */
+   buf = alloca(dst_clip_w * sizeof(DATA32));
+
+   if (dc->mul.use)
+       func = evas_common_gfx_func_composite_pixel_color_span_get(src, dc->mul.col, dst, dst_clip_w, dc->render_op);
+   else
+       func = evas_common_gfx_func_composite_pixel_span_get(src, dst, dst_clip_w, dc->render_op);
+  /* scaling down vertically */
+   if ((dst_region_w >= src_region_w) &&
+       (dst_region_h <  src_region_h))
+     {
+#include "evas_scale_smooth_scaler_downy.c"
+     }
+   /* scaling down horizontally */
+   else if ((dst_region_w < src_region_w) &&
+           (dst_region_h >=  src_region_h))
+     {
+#include "evas_scale_smooth_scaler_downx.c"
+     }
+   /* scaling down both vertically & horizontally */
+   else if ((dst_region_w < src_region_w) &&
+           (dst_region_h <  src_region_h))
+     {
+#include "evas_scale_smooth_scaler_downx_downy.c"
+     }
+}
diff --git a/src/lib/engines/common/evas_scale_smooth_scaler_downx.c b/src/lib/engines/common/evas_scale_smooth_scaler_downx.c
new file mode 100644 (file)
index 0000000..f413b22
--- /dev/null
@@ -0,0 +1,250 @@
+{
+   int Cx, j;
+   DATA32 *pix, *dptr, *pbuf, **yp;
+   int r, g, b, a, rr, gg, bb, aa;
+   int *xp, xap, yap, pos;
+   int dyy, dxx;
+   int w = dst_clip_w;
+#ifdef EVAS_SLI
+   int ysli = dst_clip_y;
+#endif
+
+   dptr = dst_ptr;
+   pos = (src_region_y * src_w) + src_region_x;
+   dyy = dst_clip_y - dst_region_y;
+   dxx = dst_clip_x - dst_region_x;
+
+   xp = xpoints + dxx;
+   yp = ypoints + dyy;
+   xapp = xapoints + dxx;
+   yapp = yapoints + dyy;
+   pbuf = buf;
+
+   if (src->cache_entry.flags.alpha)
+     {
+       while (dst_clip_h--)
+         {
+#ifdef EVAS_SLI
+            if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 while (dst_clip_w--)
+                   {
+                      Cx = *xapp >> 16;
+                      xap = *xapp & 0xffff;
+                      pix = *yp + *xp + pos;
+
+                      a = (A_VAL(pix) * xap) >> 10;
+                      r = (R_VAL(pix) * xap) >> 10;
+                      g = (G_VAL(pix) * xap) >> 10;
+                      b = (B_VAL(pix) * xap) >> 10;
+                      for (j = (1 << 14) - xap; j > Cx; j -= Cx)
+                        {
+                           pix++;
+                           a += (A_VAL(pix) * Cx) >> 10;
+                           r += (R_VAL(pix) * Cx) >> 10;
+                           g += (G_VAL(pix) * Cx) >> 10;
+                           b += (B_VAL(pix) * Cx) >> 10;
+                        }
+                      if (j > 0)
+                        {
+                           pix++;
+                           a += (A_VAL(pix) * j) >> 10;
+                           r += (R_VAL(pix) * j) >> 10;
+                           g += (G_VAL(pix) * j) >> 10;
+                           b += (B_VAL(pix) * j) >> 10;
+                        }
+                      if ((yap = *yapp) > 0)
+                        {
+                           pix = *yp + *xp + src_w + pos;
+                           aa = (A_VAL(pix) * xap) >> 10;
+                           rr = (R_VAL(pix) * xap) >> 10;
+                           gg = (G_VAL(pix) * xap) >> 10;
+                           bb = (B_VAL(pix) * xap) >> 10;
+                           for (j = (1 << 14) - xap; j > Cx; j -= Cx)
+                             {
+                                pix++;
+                                aa += (A_VAL(pix) * Cx) >> 10;
+                                rr += (R_VAL(pix) * Cx) >> 10;
+                                gg += (G_VAL(pix) * Cx) >> 10;
+                                bb += (B_VAL(pix) * Cx) >> 10;
+                             }
+                           if (j > 0)
+                             {
+                                pix++;
+                                aa += (A_VAL(pix) * j) >> 10;
+                                rr += (R_VAL(pix) * j) >> 10;
+                                gg += (G_VAL(pix) * j) >> 10;
+                                bb += (B_VAL(pix) * j) >> 10;
+                             }
+                           a += ((aa - a) * yap) >> 8;
+                           r += ((rr - r) * yap) >> 8;
+                           g += ((gg - g) * yap) >> 8;
+                           b += ((bb - b) * yap) >> 8;
+                        }
+                      *pbuf++ = ARGB_JOIN(a >> 4, r >> 4, g >> 4, b >> 4);
+                      xp++;  xapp++;
+                   }
+
+                 func(buf, NULL, dc->mul.col, dptr, w);
+              }
+#ifdef EVAS_SLI
+            ysli++;
+#endif
+            pbuf = buf;
+            dptr += dst_w;  dst_clip_w = w;
+            yp++;  yapp++;
+            xp = xpoints + dxx;
+            xapp = xapoints + dxx;
+         }
+     }
+   else
+     {
+#ifdef DIRECT_SCALE
+        if ((!src->cache_entry.flags.alpha) &&
+           (!dst->cache_entry.flags.alpha) &&
+           (!dc->mul.use))
+         {
+            while (dst_clip_h--)
+              {
+                  pbuf = dptr;
+#ifdef EVAS_SLI
+                 if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+                   {
+                      while (dst_clip_w--)
+                        {
+                           Cx = *xapp >> 16;
+                           xap = *xapp & 0xffff;
+                           pix = *yp + *xp + pos;
+
+                           r = (R_VAL(pix) * xap) >> 10;
+                           g = (G_VAL(pix) * xap) >> 10;
+                           b = (B_VAL(pix) * xap) >> 10;
+                           for (j = (1 << 14) - xap; j > Cx; j -= Cx)
+                             {
+                                pix++;
+                                r += (R_VAL(pix) * Cx) >> 10;
+                                g += (G_VAL(pix) * Cx) >> 10;
+                                b += (B_VAL(pix) * Cx) >> 10;
+                             }
+                           if (j > 0)
+                             {
+                                pix++;
+                                r += (R_VAL(pix) * j) >> 10;
+                                g += (G_VAL(pix) * j) >> 10;
+                                b += (B_VAL(pix) * j) >> 10;
+                             }
+                           if ((yap = *yapp) > 0)
+                             {
+                                pix = *yp + *xp + src_w + pos;
+                                rr = (R_VAL(pix) * xap) >> 10;
+                                gg = (G_VAL(pix) * xap) >> 10;
+                                bb = (B_VAL(pix) * xap) >> 10;
+                                for (j = (1 << 14) - xap; j > Cx; j -= Cx)
+                                  {
+                                     pix++;
+                                     rr += (R_VAL(pix) * Cx) >> 10;
+                                     gg += (G_VAL(pix) * Cx) >> 10;
+                                     bb += (B_VAL(pix) * Cx) >> 10;
+                                  }
+                                if (j > 0)
+                                  {
+                                     pix++;
+                                     rr += (R_VAL(pix) * j) >> 10;
+                                     gg += (G_VAL(pix) * j) >> 10;
+                                     bb += (B_VAL(pix) * j) >> 10;
+                                  }
+                                r += ((rr - r) * yap) >> 8;
+                                g += ((gg - g) * yap) >> 8;
+                                b += ((bb - b) * yap) >> 8;
+                             }
+                           *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4);
+                           xp++;  xapp++;
+                        }
+                   }
+#ifdef EVAS_SLI
+                 ysli++;
+#endif
+
+                 dptr += dst_w;  dst_clip_w = w;
+                 yp++;  yapp++;
+                 xp = xpoints + dxx;
+                 xapp = xapoints + dxx;
+              }
+         }
+       else
+#endif
+         {
+            while (dst_clip_h--)
+              {
+#ifdef EVAS_SLI
+                 if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+                   {
+                      while (dst_clip_w--)
+                        {
+                           Cx = *xapp >> 16;
+                           xap = *xapp & 0xffff;
+                           pix = *yp + *xp + pos;
+
+                           r = (R_VAL(pix) * xap) >> 10;
+                           g = (G_VAL(pix) * xap) >> 10;
+                           b = (B_VAL(pix) * xap) >> 10;
+                           for (j = (1 << 14) - xap; j > Cx; j -= Cx)
+                             {
+                                pix++;
+                                r += (R_VAL(pix) * Cx) >> 10;
+                                g += (G_VAL(pix) * Cx) >> 10;
+                                b += (B_VAL(pix) * Cx) >> 10;
+                             }
+                           if (j > 0)
+                             {
+                                pix++;
+                                r += (R_VAL(pix) * j) >> 10;
+                                g += (G_VAL(pix) * j) >> 10;
+                                b += (B_VAL(pix) * j) >> 10;
+                             }
+                           if ((yap = *yapp) > 0)
+                             {
+                                pix = *yp + *xp + src_w + pos;
+                                rr = (R_VAL(pix) * xap) >> 10;
+                                gg = (G_VAL(pix) * xap) >> 10;
+                                bb = (B_VAL(pix) * xap) >> 10;
+                                for (j = (1 << 14) - xap; j > Cx; j -= Cx)
+                                  {
+                                     pix++;
+                                     rr += (R_VAL(pix) * Cx) >> 10;
+                                     gg += (G_VAL(pix) * Cx) >> 10;
+                                     bb += (B_VAL(pix) * Cx) >> 10;
+                                  }
+                                if (j > 0)
+                                  {
+                                     pix++;
+                                     rr += (R_VAL(pix) * j) >> 10;
+                                     gg += (G_VAL(pix) * j) >> 10;
+                                     bb += (B_VAL(pix) * j) >> 10;
+                                  }
+                                r += ((rr - r) * yap) >> 8;
+                                g += ((gg - g) * yap) >> 8;
+                                b += ((bb - b) * yap) >> 8;
+                             }
+                           *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4);
+                           xp++;  xapp++;
+                        }
+
+                      func(buf, NULL, dc->mul.col, dptr, w);
+                   }
+#ifdef EVAS_SLI
+                 ysli++;
+#endif
+
+                 pbuf = buf;
+                 dptr += dst_w;  dst_clip_w = w;
+                 yp++;  yapp++;
+                 xp = xpoints + dxx;
+                 xapp = xapoints + dxx;
+              }
+         }
+     }
+}
diff --git a/src/lib/engines/common/evas_scale_smooth_scaler_downx_downy.c b/src/lib/engines/common/evas_scale_smooth_scaler_downx_downy.c
new file mode 100644 (file)
index 0000000..f830187
--- /dev/null
@@ -0,0 +1,378 @@
+{
+   int Cx, Cy, i, j;
+   DATA32 *dptr, *sptr, *pix, *pbuf;
+   int a, r, g, b, rx, gx, bx, ax;
+   int xap, yap, pos;
+   int dyy, dxx;
+#ifdef EVAS_SLI
+   int ysli = dst_clip_y;
+#endif
+   
+   DATA32  **yp; 
+   int *xp;
+   int w = dst_clip_w;
+
+   dptr = dst_ptr;
+   pos = (src_region_y * src_w) + src_region_x;
+   dyy = dst_clip_y - dst_region_y;
+   dxx = dst_clip_x - dst_region_x;
+
+   xp = xpoints + dxx;
+   yp = ypoints + dyy;
+   xapp = xapoints + dxx;
+   yapp = yapoints + dyy;
+   pbuf = buf;
+/*#ifndef SCALE_USING_MMX */
+/* for now there's no mmx down scaling - so C only */
+#if 1
+   if (src->cache_entry.flags.alpha)
+     {
+       while (dst_clip_h--)
+         {
+#ifdef EVAS_SLI
+            if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 Cy = *yapp >> 16;
+                 yap = *yapp & 0xffff;
+                 
+                 while (dst_clip_w--)
+                   {
+                      Cx = *xapp >> 16;
+                      xap = *xapp & 0xffff;
+                      
+                      sptr = *yp + *xp + pos;
+                      pix = sptr;
+                      sptr += src_w;
+                      
+                      ax = (A_VAL(pix) * xap) >> 9;
+                      rx = (R_VAL(pix) * xap) >> 9;
+                      gx = (G_VAL(pix) * xap) >> 9;
+                      bx = (B_VAL(pix) * xap) >> 9;
+                      pix++;
+                      for (i = (1 << 14) - xap; i > Cx; i -= Cx)
+                        {
+                           ax += (A_VAL(pix) * Cx) >> 9;
+                           rx += (R_VAL(pix) * Cx) >> 9;
+                           gx += (G_VAL(pix) * Cx) >> 9;
+                           bx += (B_VAL(pix) * Cx) >> 9;
+                           pix++;
+                        }
+                      if (i > 0)
+                        {
+                           ax += (A_VAL(pix) * i) >> 9;
+                           rx += (R_VAL(pix) * i) >> 9;
+                           gx += (G_VAL(pix) * i) >> 9;
+                           bx += (B_VAL(pix) * i) >> 9;
+                        }
+                      
+                      a = (ax * yap) >> 14;
+                      r = (rx * yap) >> 14;
+                      g = (gx * yap) >> 14;
+                      b = (bx * yap) >> 14;
+                      
+                      for (j = (1 << 14) - yap; j > Cy; j -= Cy)
+                        {
+                           pix = sptr;
+                           sptr += src_w;
+                           ax = (A_VAL(pix) * xap) >> 9;
+                           rx = (R_VAL(pix) * xap) >> 9;
+                           gx = (G_VAL(pix) * xap) >> 9;
+                           bx = (B_VAL(pix) * xap) >> 9;
+                           pix++;
+                           for (i = (1 << 14) - xap; i > Cx; i -= Cx)
+                             {
+                                ax += (A_VAL(pix) * Cx) >> 9;
+                                rx += (R_VAL(pix) * Cx) >> 9;
+                                gx += (G_VAL(pix) * Cx) >> 9;
+                                bx += (B_VAL(pix) * Cx) >> 9;
+                                pix++;
+                             }
+                           if (i > 0)
+                             {
+                                ax += (A_VAL(pix) * i) >> 9;
+                                rx += (R_VAL(pix) * i) >> 9;
+                                gx += (G_VAL(pix) * i) >> 9;
+                                bx += (B_VAL(pix) * i) >> 9;
+                             }
+                           
+                           a += (ax * Cy) >> 14;
+                           r += (rx * Cy) >> 14;
+                           g += (gx * Cy) >> 14;
+                           b += (bx * Cy) >> 14;
+                        }
+                      if (j > 0)
+                        {
+                           pix = sptr;
+                           sptr += src_w;
+                           ax = (A_VAL(pix) * xap) >> 9;
+                           rx = (R_VAL(pix) * xap) >> 9;
+                           gx = (G_VAL(pix) * xap) >> 9;
+                           bx = (B_VAL(pix) * xap) >> 9;
+                           pix++;
+                           for (i = (1 << 14) - xap; i > Cx; i -= Cx)
+                             {
+                                ax += (A_VAL(pix) * Cx) >> 9;
+                                rx += (R_VAL(pix) * Cx) >> 9;
+                                gx += (G_VAL(pix) * Cx) >> 9;
+                                bx += (B_VAL(pix) * Cx) >> 9;
+                                pix++;
+                             }
+                           if (i > 0)
+                             {
+                                ax += (A_VAL(pix) * i) >> 9;
+                                rx += (R_VAL(pix) * i) >> 9;
+                                gx += (G_VAL(pix) * i) >> 9;
+                                bx += (B_VAL(pix) * i) >> 9;
+                             }
+                           
+                           a += (ax * j) >> 14;
+                           r += (rx * j) >> 14;
+                           g += (gx * j) >> 14;
+                           b += (bx * j) >> 14;
+                        }
+                      *pbuf++ = ARGB_JOIN(a >> 5, r >> 5, g >> 5, b >> 5);
+                      xp++;  xapp++;
+                   }
+                 
+                 func(buf, NULL, dc->mul.col, dptr, w);
+              }
+#ifdef EVAS_SLI
+            ysli++;
+#endif
+            pbuf = buf;
+            dptr += dst_w;   dst_clip_w = w;
+            xp = xpoints + dxx;
+            xapp = xapoints + dxx;
+            yp++;  yapp++;
+         }
+     }
+   else
+     {
+#ifdef DIRECT_SCALE
+        if ((!src->cache_entry.flags.alpha) &&
+           (!dst->cache_entry.flags.alpha) &&
+           (!dc->mul.use))
+         {
+            while (dst_clip_h--)
+              {
+#ifdef EVAS_SLI
+                 if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+                   {
+                      Cy = *yapp >> 16;
+                      yap = *yapp & 0xffff;
+                      
+                      pbuf = dptr;
+                      while (dst_clip_w--)
+                        {
+                           Cx = *xapp >> 16;
+                           xap = *xapp & 0xffff;
+                           
+                           sptr = *yp + *xp + pos;
+                           pix = sptr;
+                           sptr += src_w;
+                           
+                           rx = (R_VAL(pix) * xap) >> 9;
+                           gx = (G_VAL(pix) * xap) >> 9;
+                           bx = (B_VAL(pix) * xap) >> 9;
+                           pix++;
+                           for (i = (1 << 14) - xap; i > Cx; i -= Cx)
+                             {
+                                rx += (R_VAL(pix) * Cx) >> 9;
+                                gx += (G_VAL(pix) * Cx) >> 9;
+                                bx += (B_VAL(pix) * Cx) >> 9;
+                                pix++;
+                             }
+                           if (i > 0)
+                             {
+                                rx += (R_VAL(pix) * i) >> 9;
+                                gx += (G_VAL(pix) * i) >> 9;
+                                bx += (B_VAL(pix) * i) >> 9;
+                             }
+                           
+                           r = (rx * yap) >> 14;
+                           g = (gx * yap) >> 14;
+                           b = (bx * yap) >> 14;
+                           
+                           for (j = (1 << 14) - yap; j > Cy; j -= Cy)
+                             {
+                                pix = sptr;
+                                sptr += src_w;
+                                rx = (R_VAL(pix) * xap) >> 9;
+                                gx = (G_VAL(pix) * xap) >> 9;
+                                bx = (B_VAL(pix) * xap) >> 9;
+                                pix++;
+                                for (i = (1 << 14) - xap; i > Cx; i -= Cx)
+                                  {
+                                     rx += (R_VAL(pix) * Cx) >> 9;
+                                     gx += (G_VAL(pix) * Cx) >> 9;
+                                     bx += (B_VAL(pix) * Cx) >> 9;
+                                     pix++;
+                                  }
+                                if (i > 0)
+                                  {
+                                     rx += (R_VAL(pix) * i) >> 9;
+                                     gx += (G_VAL(pix) * i) >> 9;
+                                     bx += (B_VAL(pix) * i) >> 9;
+                                  }
+                                
+                                r += (rx * Cy) >> 14;
+                                g += (gx * Cy) >> 14;
+                                b += (bx * Cy) >> 14;
+                             }
+                           if (j > 0)
+                             {
+                                pix = sptr;
+                                sptr += src_w;
+                                rx = (R_VAL(pix) * xap) >> 9;
+                                gx = (G_VAL(pix) * xap) >> 9;
+                                bx = (B_VAL(pix) * xap) >> 9;
+                                pix++;
+                                for (i = (1 << 14) - xap; i > Cx; i -= Cx)
+                                  {
+                                     rx += (R_VAL(pix) * Cx) >> 9;
+                                     gx += (G_VAL(pix) * Cx) >> 9;
+                                     bx += (B_VAL(pix) * Cx) >> 9;
+                                     pix++;
+                                  }
+                                if (i > 0)
+                                  {
+                                     rx += (R_VAL(pix) * i) >> 9;
+                                     gx += (G_VAL(pix) * i) >> 9;
+                                     bx += (B_VAL(pix) * i) >> 9;
+                                  }
+                                
+                                r += (rx * j) >> 14;
+                                g += (gx * j) >> 14;
+                                b += (bx * j) >> 14;
+                             }
+                           *pbuf++ = ARGB_JOIN(0xff, r >> 5, g >> 5, b >> 5);
+                           xp++;  xapp++;
+                        }
+                   }
+#ifdef EVAS_SLI
+                 ysli++;
+#endif
+                 dptr += dst_w;   dst_clip_w = w;
+                 xp = xpoints + dxx;
+                 xapp = xapoints + dxx;
+                 yp++;  yapp++;
+              }
+         }
+       else
+#endif   
+         {
+            while (dst_clip_h--)
+              {
+#ifdef EVAS_SLI
+                 if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+                   {
+                      Cy = *yapp >> 16;
+                      yap = *yapp & 0xffff;
+                      
+                      while (dst_clip_w--)
+                        {
+                           Cx = *xapp >> 16;
+                           xap = *xapp & 0xffff;
+                           
+                           sptr = *yp + *xp + pos;
+                           pix = sptr;
+                           sptr += src_w;
+                           
+                           rx = (R_VAL(pix) * xap) >> 9;
+                           gx = (G_VAL(pix) * xap) >> 9;
+                           bx = (B_VAL(pix) * xap) >> 9;
+                           pix++;
+                           for (i = (1 << 14) - xap; i > Cx; i -= Cx)
+                             {
+                                rx += (R_VAL(pix) * Cx) >> 9;
+                                gx += (G_VAL(pix) * Cx) >> 9;
+                                bx += (B_VAL(pix) * Cx) >> 9;
+                                pix++;
+                             }
+                           if (i > 0)
+                             {
+                                rx += (R_VAL(pix) * i) >> 9;
+                                gx += (G_VAL(pix) * i) >> 9;
+                                bx += (B_VAL(pix) * i) >> 9;
+                             }
+                           
+                           r = (rx * yap) >> 14;
+                           g = (gx * yap) >> 14;
+                           b = (bx * yap) >> 14;
+                           
+                           for (j = (1 << 14) - yap; j > Cy; j -= Cy)
+                             {
+                                pix = sptr;
+                                sptr += src_w;
+                                rx = (R_VAL(pix) * xap) >> 9;
+                                gx = (G_VAL(pix) * xap) >> 9;
+                                bx = (B_VAL(pix) * xap) >> 9;
+                                pix++;
+                                for (i = (1 << 14) - xap; i > Cx; i -= Cx)
+                                  {
+                                     rx += (R_VAL(pix) * Cx) >> 9;
+                                     gx += (G_VAL(pix) * Cx) >> 9;
+                                     bx += (B_VAL(pix) * Cx) >> 9;
+                                     pix++;
+                                  }
+                                if (i > 0)
+                                  {
+                                     rx += (R_VAL(pix) * i) >> 9;
+                                     gx += (G_VAL(pix) * i) >> 9;
+                                     bx += (B_VAL(pix) * i) >> 9;
+                                  }
+                                
+                                r += (rx * Cy) >> 14;
+                                g += (gx * Cy) >> 14;
+                                b += (bx * Cy) >> 14;
+                             }
+                           if (j > 0)
+                             {
+                                pix = sptr;
+                                sptr += src_w;
+                                rx = (R_VAL(pix) * xap) >> 9;
+                                gx = (G_VAL(pix) * xap) >> 9;
+                                bx = (B_VAL(pix) * xap) >> 9;
+                                pix++;
+                                for (i = (1 << 14) - xap; i > Cx; i -= Cx)
+                                  {
+                                     rx += (R_VAL(pix) * Cx) >> 9;
+                                     gx += (G_VAL(pix) * Cx) >> 9;
+                                     bx += (B_VAL(pix) * Cx) >> 9;
+                                     pix++;
+                                  }
+                                if (i > 0)
+                                  {
+                                     rx += (R_VAL(pix) * i) >> 9;
+                                     gx += (G_VAL(pix) * i) >> 9;
+                                     bx += (B_VAL(pix) * i) >> 9;
+                                  }
+                                
+                                r += (rx * j) >> 14;
+                                g += (gx * j) >> 14;
+                                b += (bx * j) >> 14;
+                             }
+                           *pbuf++ = ARGB_JOIN(0xff, r >> 5, g >> 5, b >> 5);
+                           xp++;  xapp++;
+                        }
+                      
+                      func(buf, NULL, dc->mul.col, dptr, w);
+                   }
+#ifdef EVAS_SLI
+                 ysli++;
+#endif
+                 pbuf = buf;
+                 dptr += dst_w;   dst_clip_w = w;
+                 xp = xpoints + dxx;
+                 xapp = xapoints + dxx;
+                 yp++;  yapp++;
+              }
+         }
+     }
+#else
+   /* MMX scaling down would go here */
+#endif
+}
diff --git a/src/lib/engines/common/evas_scale_smooth_scaler_downy.c b/src/lib/engines/common/evas_scale_smooth_scaler_downy.c
new file mode 100644 (file)
index 0000000..89cc883
--- /dev/null
@@ -0,0 +1,251 @@
+{
+   int Cy, j;
+   DATA32 *dptr, *pix, *pbuf, **yp;
+   int r, g, b, a, rr, gg, bb, aa;
+   int *xp, xap, yap, pos;
+   int dyy, dxx;
+   int w = dst_clip_w;
+#ifdef EVAS_SLI
+   int ysli = dst_clip_y;
+#endif
+
+   dptr = dst_ptr;
+   pos = (src_region_y * src_w) + src_region_x;
+   dyy = dst_clip_y - dst_region_y;
+   dxx = dst_clip_x - dst_region_x;
+
+   xp = xpoints + dxx;
+   yp = ypoints + dyy;
+   xapp = xapoints + dxx;
+   yapp = yapoints + dyy;
+   pbuf = buf;
+
+   if (src->cache_entry.flags.alpha)
+     {
+       while (dst_clip_h--)
+         {
+#ifdef EVAS_SLI
+            if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 Cy = *yapp >> 16;
+                 yap = *yapp & 0xffff;
+
+                 while (dst_clip_w--)
+                   {
+                      pix = *yp + *xp + pos;
+
+                      a = (A_VAL(pix) * yap) >> 10;
+                      r = (R_VAL(pix) * yap) >> 10;
+                      g = (G_VAL(pix) * yap) >> 10;
+                      b = (B_VAL(pix) * yap) >> 10;
+                      for (j = (1 << 14) - yap; j > Cy; j -= Cy)
+                        {
+                           pix += src_w;
+                           a += (A_VAL(pix) * Cy) >> 10;
+                           r += (R_VAL(pix) * Cy) >> 10;
+                           g += (G_VAL(pix) * Cy) >> 10;
+                           b += (B_VAL(pix) * Cy) >> 10;
+                        }
+                      if (j > 0)
+                        {
+                           pix += src_w;
+                           a += (A_VAL(pix) * j) >> 10;
+                           r += (R_VAL(pix) * j) >> 10;
+                           g += (G_VAL(pix) * j) >> 10;
+                           b += (B_VAL(pix) * j) >> 10;
+                        }
+                      if ((xap = *xapp) > 0)
+                        {
+                           pix = *yp + *xp + 1 + pos;
+                           aa = (A_VAL(pix) * yap) >> 10;
+                           rr = (R_VAL(pix) * yap) >> 10;
+                           gg = (G_VAL(pix) * yap) >> 10;
+                           bb = (B_VAL(pix) * yap) >> 10;
+                           for (j = (1 << 14) - yap; j > Cy; j -= Cy)
+                             {
+                                pix += src_w;
+                                aa += (A_VAL(pix) * Cy) >> 10;
+                                rr += (R_VAL(pix) * Cy) >> 10;
+                                gg += (G_VAL(pix) * Cy) >> 10;
+                                bb += (B_VAL(pix) * Cy) >> 10;
+                             }
+                           if (j > 0)
+                             {
+                                pix += src_w;
+                                aa += (A_VAL(pix) * j) >> 10;
+                                rr += (R_VAL(pix) * j) >> 10;
+                                gg += (G_VAL(pix) * j) >> 10;
+                                bb += (B_VAL(pix) * j) >> 10;
+                             }
+                           a += ((aa - a) * xap) >> 8;
+                           r += ((rr - r) * xap) >> 8;
+                           g += ((gg - g) * xap) >> 8;
+                           b += ((bb - b) * xap) >> 8;
+                        }
+                      *pbuf++ = ARGB_JOIN(a >> 4, r >> 4, g >> 4, b >> 4);
+                      xp++;  xapp++;
+                   }
+
+                 func(buf, NULL, dc->mul.col, dptr, w);
+               }
+#ifdef EVAS_SLI
+            ysli++;
+#endif
+            pbuf = buf;
+            dptr += dst_w;  dst_clip_w = w;
+            yp++;  yapp++;
+            xp = xpoints + dxx;
+            xapp = xapoints + dxx;
+         }
+     }
+   else
+     {
+#ifdef DIRECT_SCALE
+        if ((!src->cache_entry.flags.alpha) &&
+           (!dst->cache_entry.flags.alpha) &&
+           (!dc->mul.use))
+         {
+            while (dst_clip_h--)
+              {
+#ifdef EVAS_SLI
+                 if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+                   {
+                      Cy = *yapp >> 16;
+                      yap = *yapp & 0xffff;
+
+                      pbuf = dptr;
+                      while (dst_clip_w--)
+                        {
+                           pix = *yp + *xp + pos;
+
+                           r = (R_VAL(pix) * yap) >> 10;
+                           g = (G_VAL(pix) * yap) >> 10;
+                           b = (B_VAL(pix) * yap) >> 10;
+                           for (j = (1 << 14) - yap; j > Cy; j -= Cy)
+                             {
+                                pix += src_w;
+                                r += (R_VAL(pix) * Cy) >> 10;
+                                g += (G_VAL(pix) * Cy) >> 10;
+                                b += (B_VAL(pix) * Cy) >> 10;
+                             }
+                           if (j > 0)
+                             {
+                                pix += src_w;
+                                r += (R_VAL(pix) * j) >> 10;
+                                g += (G_VAL(pix) * j) >> 10;
+                                b += (B_VAL(pix) * j) >> 10;
+                             }
+                           if ((xap = *xapp) > 0)
+                             {
+                                pix = *yp + *xp + 1 + pos;
+                                rr = (R_VAL(pix) * yap) >> 10;
+                                gg = (G_VAL(pix) * yap) >> 10;
+                                bb = (B_VAL(pix) * yap) >> 10;
+                                for (j = (1 << 14) - yap; j > Cy; j -= Cy)
+                                  {
+                                     pix += src_w;
+                                     rr += (R_VAL(pix) * Cy) >> 10;
+                                     gg += (G_VAL(pix) * Cy) >> 10;
+                                     bb += (B_VAL(pix) * Cy) >> 10;
+                                  }
+                                if (j > 0)
+                                  {
+                                     pix += src_w;
+                                     rr += (R_VAL(pix) * j) >> 10;
+                                     gg += (G_VAL(pix) * j) >> 10;
+                                     bb += (B_VAL(pix) * j) >> 10;
+                                  }
+                                r += ((rr - r) * xap) >> 8;
+                                g += ((gg - g) * xap) >> 8;
+                                b += ((bb - b) * xap) >> 8;
+                             }
+                           *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4);
+                           xp++;  xapp++;
+                        }
+                   }
+#ifdef EVAS_SLI
+                 ysli++;
+#endif
+                 dptr += dst_w;  dst_clip_w = w;
+                 yp++;  yapp++;
+                 xp = xpoints + dxx;
+                 xapp = xapoints + dxx;
+              }
+         }
+       else
+#endif
+         {
+            while (dst_clip_h--)
+              {
+#ifdef EVAS_SLI
+                 if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+                   {
+                      Cy = *yapp >> 16;
+                      yap = *yapp & 0xffff;
+
+                      while (dst_clip_w--)
+                        {
+                           pix = *yp + *xp + pos;
+
+                           r = (R_VAL(pix) * yap) >> 10;
+                           g = (G_VAL(pix) * yap) >> 10;
+                           b = (B_VAL(pix) * yap) >> 10;
+                           for (j = (1 << 14) - yap; j > Cy; j -= Cy)
+                             {
+                                pix += src_w;
+                                r += (R_VAL(pix) * Cy) >> 10;
+                                g += (G_VAL(pix) * Cy) >> 10;
+                                b += (B_VAL(pix) * Cy) >> 10;
+                             }
+                           if (j > 0)
+                             {
+                                pix += src_w;
+                                r += (R_VAL(pix) * j) >> 10;
+                                g += (G_VAL(pix) * j) >> 10;
+                                b += (B_VAL(pix) * j) >> 10;
+                             }
+                           if ((xap = *xapp) > 0)
+                             {
+                                pix = *yp + *xp + 1 + pos;
+                                rr = (R_VAL(pix) * yap) >> 10;
+                                gg = (G_VAL(pix) * yap) >> 10;
+                                bb = (B_VAL(pix) * yap) >> 10;
+                                for (j = (1 << 14) - yap; j > Cy; j -= Cy)
+                                  {
+                                     pix += src_w;
+                                     rr += (R_VAL(pix) * Cy) >> 10;
+                                     gg += (G_VAL(pix) * Cy) >> 10;
+                                     bb += (B_VAL(pix) * Cy) >> 10;
+                                  }
+                                if (j > 0)
+                                  {
+                                     pix += src_w;
+                                     rr += (R_VAL(pix) * j) >> 10;
+                                     gg += (G_VAL(pix) * j) >> 10;
+                                     bb += (B_VAL(pix) * j) >> 10;
+                                  }
+                                r += ((rr - r) * xap) >> 8;
+                                g += ((gg - g) * xap) >> 8;
+                                b += ((bb - b) * xap) >> 8;
+                             }
+                           *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4);
+                           xp++;  xapp++;
+                        }
+
+                      func(buf, NULL, dc->mul.col, dptr, w);
+                   }
+#ifdef EVAS_SLI
+                 ysli++;
+#endif
+                 pbuf = buf;
+                 dptr += dst_w;  dst_clip_w = w;
+                 yp++;  yapp++;
+                 xp = xpoints + dxx;
+                 xapp = xapoints + dxx;
+              }
+         }
+     }
+}
diff --git a/src/lib/engines/common/evas_scale_smooth_scaler_noscale.c b/src/lib/engines/common/evas_scale_smooth_scaler_noscale.c
new file mode 100644 (file)
index 0000000..957b6a3
--- /dev/null
@@ -0,0 +1,27 @@
+{
+   DATA32 *ptr;
+   RGBA_Gfx_Func func;
+#ifdef EVAS_SLI
+   int ysli = dst_clip_y;
+#endif
+
+   ptr = src->image.data + ((dst_clip_y - dst_region_y + src_region_y) * src_w) + (dst_clip_x - dst_region_x) + src_region_x;
+   if (dc->mul.use)
+       func = evas_common_gfx_func_composite_pixel_color_span_get(src, dc->mul.col, dst, dst_clip_w, dc->render_op);
+   else
+       func = evas_common_gfx_func_composite_pixel_span_get(src, dst, dst_clip_w, dc->render_op);
+   while (dst_clip_h--)
+     {
+#ifdef EVAS_SLI
+       if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+         {
+            func(ptr, NULL, dc->mul.col, dst_ptr, dst_clip_w);
+         }
+#ifdef EVAS_SLI
+       ysli++;
+#endif
+       ptr += src_w;
+       dst_ptr += dst_w;
+     }
+}
diff --git a/src/lib/engines/common/evas_scale_smooth_scaler_up.c b/src/lib/engines/common/evas_scale_smooth_scaler_up.c
new file mode 100644 (file)
index 0000000..df17f03
--- /dev/null
@@ -0,0 +1,263 @@
+{
+   int         srx = src_region_x, sry = src_region_y;
+   int         srw = src_region_w, srh = src_region_h;
+   int         drx = dst_region_x, dry = dst_region_y;
+   int         drw = dst_region_w, drh = dst_region_h;
+
+   int         dsxx, dsyy, sxx, syy, sx, sy;
+   int         cx, cy;
+   int         direct_scale = 0, buf_step = 0;
+
+   DATA32      *psrc, *pdst, *pdst_end;
+   DATA32      *buf, *pbuf, *pbuf_end;
+   RGBA_Gfx_Func  func = NULL;
+
+   /* a scanline buffer */
+   pdst = dst_ptr;  // it's been set at (dst_clip_x, dst_clip_y)
+   pdst_end = pdst + (dst_clip_h * dst_w);
+   if (!dc->mul.use)
+     {
+       if ((dc->render_op == _EVAS_RENDER_BLEND) && !src->cache_entry.flags.alpha)
+         { direct_scale = 1;  buf_step = dst->cache_entry.w; }
+       else if (dc->render_op == _EVAS_RENDER_COPY)
+         {
+           direct_scale = 1;  buf_step = dst->cache_entry.w;
+           if (src->cache_entry.flags.alpha)
+               dst->cache_entry.flags.alpha = 1;
+         }
+     }
+   if (!direct_scale)
+     {
+       buf = alloca(dst_clip_w * sizeof(DATA32));
+       if (dc->mul.use)
+          func = evas_common_gfx_func_composite_pixel_color_span_get(src, dc->mul.col, dst, dst_clip_w, dc->render_op);
+       else
+          func  = evas_common_gfx_func_composite_pixel_span_get(src, dst, dst_clip_w, dc->render_op);
+     }
+   else
+       buf = pdst;
+
+   if ((srw > 1) && (drw > 1))
+       dsxx = ((srw - 1) << 16) / (drw - 1);
+   else
+       dsxx = (srw << 16) / drw;
+   if ((srh > 1) && (drh > 1))
+       dsyy = ((srh - 1) << 16) / (drh - 1);
+   else
+       dsyy = (srh << 16) / drh;
+
+   cx = dst_clip_x - drx;
+   cy = dst_clip_y - dry;
+
+   sxx = (dsxx * cx);
+   syy = (dsyy * cy);
+
+   sx = sxx >> 16;
+   sy = syy >> 16;
+
+   if (drh == srh)
+     {
+       int  sxx0 = sxx;
+#ifdef EVAS_SLI
+       int ysli = dst_clip_y;
+#endif
+       psrc = src->image.data + (src_w * (sry + cy)) + srx;
+       while (pdst < pdst_end)
+         {
+#ifdef EVAS_SLI
+            if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 pbuf = buf;  pbuf_end = buf + dst_clip_w;
+                 sxx = sxx0;
+#ifdef SCALE_USING_MMX
+                 pxor_r2r(mm0, mm0);
+                 MOV_A2R(ALPHA_255, mm5)
+#endif
+                   while (pbuf < pbuf_end)
+                     {
+                        DATA32   p0, p1;
+                        int      ax;
+
+                        sx = (sxx >> 16);
+                        ax = 1 + ((sxx - (sx << 16)) >> 8);
+                        p0 = p1 = *(psrc + sx);
+                        if ((sx + 1) < srw)
+                          p1 = *(psrc + sx + 1);
+#ifdef SCALE_USING_MMX
+                        MOV_P2R(p0, mm1, mm0)
+                          if (p0 | p1)
+                            {
+                               MOV_A2R(ax, mm3)
+                                 MOV_P2R(p1, mm2, mm0)
+                                   INTERP_256_R2R(mm3, mm2, mm1, mm5)
+                            }
+                        MOV_R2P(mm1, *pbuf, mm0)
+                          pbuf++;
+#else
+                        if (p0 | p1)
+                          p0 = INTERP_256(ax, p1, p0);
+                        *pbuf++ = p0;
+#endif
+                        sxx += dsxx;
+                     }
+                 /* * blend here [clip_w *] buf -> dptr * */
+                 if (!direct_scale)
+                   func(buf, NULL, dc->mul.col, pdst, dst_clip_w);
+              }
+#ifdef EVAS_SLI
+            ysli++;
+#endif
+            pdst += dst_w;
+            psrc += src_w;
+            buf += buf_step;
+         }
+
+       goto done_scale_up;
+     }
+   else if (drw == srw)
+     {
+       DATA32  *ps = src->image.data + (src_w * sry) + srx + cx;
+#ifdef EVAS_SLI
+       int ysli = dst_clip_y;
+#endif
+
+       while (pdst < pdst_end)
+         {
+#ifdef EVAS_SLI
+            if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 int        ay;
+
+                 sy = syy >> 16;
+                 psrc = ps + (sy * src_w);
+                 ay = 1 + ((syy - (sy << 16)) >> 8);
+#ifdef SCALE_USING_MMX
+                 pxor_r2r(mm0, mm0);
+                 MOV_A2R(ALPHA_255, mm5)
+                   MOV_A2R(ay, mm4)
+#endif
+                     pbuf = buf;  pbuf_end = buf + dst_clip_w;
+                 while (pbuf < pbuf_end)
+                   {
+                      DATA32  p0 = *psrc, p2 = p0;
+
+                      if ((sy + 1) < srh)
+                        p2 = *(psrc + src_w);
+#ifdef SCALE_USING_MMX
+                      MOV_P2R(p0, mm1, mm0)
+                        if (p0 | p2)
+                          {
+                             MOV_P2R(p2, mm2, mm0)
+                               INTERP_256_R2R(mm4, mm2, mm1, mm5)
+                          }
+                      MOV_R2P(mm1, *pbuf, mm0)
+                        pbuf++;
+#else
+                      if (p0 | p2)
+                        p0 = INTERP_256(ay, p2, p0);
+                      *pbuf++ = p0;
+#endif
+                      psrc++;
+                   }
+                 /* * blend here [clip_w *] buf -> dptr * */
+                 if (!direct_scale)
+                   func(buf, NULL, dc->mul.col, pdst, dst_clip_w);
+              }
+#ifdef EVAS_SLI
+            ysli++;
+#endif
+           pdst += dst_w;
+           syy += dsyy;
+           buf += buf_step;
+         }
+       goto done_scale_up;
+     }
+
+     {
+       DATA32  *ps = src->image.data + (src_w * sry) + srx;
+       int     sxx0 = sxx;
+#ifdef EVAS_SLI
+       int ysli = dst_clip_y;
+#endif
+
+       while (pdst < pdst_end)
+         {
+#ifdef EVAS_SLI
+            if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 int   ay;
+
+                 sy = syy >> 16;
+                 psrc = ps + (sy * src_w);
+                 ay = 1 + ((syy - (sy << 16)) >> 8);
+#ifdef SCALE_USING_MMX
+                 MOV_A2R(ay, mm4)
+                   pxor_r2r(mm0, mm0);
+                 MOV_A2R(ALPHA_255, mm5)
+#endif
+                   pbuf = buf;  pbuf_end = buf + dst_clip_w;
+                 sxx = sxx0;
+                 while (pbuf < pbuf_end)
+                   {
+                      int     ax;
+                      DATA32  *p, *q;
+                      DATA32  p0, p1, p2, p3;
+
+                      sx = sxx >> 16;
+                      ax = 1 + ((sxx - (sx << 16)) >> 8);
+                      p = psrc + sx;  q = p + src_w;
+                      p0 = p1 = p2 = p3 = *p;
+                      if ((sx + 1) < srw)
+                        p1 = *(p + 1);
+                      if ((sy + 1) < srh)
+                        {
+                           p2 = *q;  p3 = p2;
+                           if ((sx + 1) < srw)
+                             p3 = *(q + 1);
+                        }
+#ifdef SCALE_USING_MMX
+                      MOV_A2R(ax, mm6)
+                        MOV_P2R(p0, mm1, mm0)
+                          if (p0 | p1)
+                            {
+                               MOV_P2R(p1, mm2, mm0)
+                                 INTERP_256_R2R(mm6, mm2, mm1, mm5)
+                            }
+                      MOV_P2R(p2, mm2, mm0)
+                        if (p2 | p3)
+                          {
+                             MOV_P2R(p3, mm3, mm0)
+                               INTERP_256_R2R(mm6, mm3, mm2, mm5)
+                          }
+                      INTERP_256_R2R(mm4, mm2, mm1, mm5)
+                        MOV_R2P(mm1, *pbuf, mm0)
+                          pbuf++;
+#else
+                      if (p0 | p1)
+                        p0 = INTERP_256(ax, p1, p0);
+                      if (p2 | p3)
+                        p2 = INTERP_256(ax, p3, p2);
+                      if (p0 | p2)
+                        p0 = INTERP_256(ay, p2, p0);
+                      *pbuf++ = p0;
+#endif
+                      sxx += dsxx;
+                   }
+                 /* * blend here [clip_w *] buf -> dptr * */
+                 if (!direct_scale)
+                   func(buf, NULL, dc->mul.col, pdst, dst_clip_w);
+              }
+#ifdef EVAS_SLI
+            ysli++;
+#endif
+            pdst += dst_w;
+            syy += dsyy;
+            buf += buf_step;
+         }
+     }
+   done_scale_up:
+   return;
+}
diff --git a/src/lib/engines/common/evas_scale_span.c b/src/lib/engines/common/evas_scale_span.c
new file mode 100644 (file)
index 0000000..3ccaec4
--- /dev/null
@@ -0,0 +1,657 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "evas_common.h"
+#include "evas_convert_color.h"
+#include "evas_scale_span.h"
+
+static void
+evas_common_scale_rgba_span_(DATA32 *src, DATA8 *mask __UNUSED__, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
+{
+   int  mul = 0, step = 1;
+   DATA32 *pdst = dst;
+
+   if (!src || !dst) return;
+   if ((src_len < 1) || (dst_len < 1)) return;
+   if ((src_len > 65535) || (dst_len > 65535)) return;
+   if (mul_col != 0xffffffff)
+       mul = 1;
+   if (dir < 0)
+     {
+       pdst += dst_len - 1;
+       step = -1;
+     }
+
+   if ((src_len == 1) || (dst_len == 1))
+     {
+       DATA32 c = *src;
+
+       if (mul) c = MUL4_SYM(mul_col, c);
+       while (dst_len--)
+          *dst++ = c;
+       return;
+     }
+
+   if (src_len == dst_len)
+     {
+       if (mul)
+         {
+#ifdef BUILD_MMX
+           pxor_r2r(mm0, mm0);
+           MOV_A2R(ALPHA_255, mm5)
+           MOV_P2R(mul_col, mm7, mm0)
+#endif
+           while (dst_len--)
+             {
+#ifdef BUILD_MMX
+               MOV_P2R(*src, mm1, mm0)
+               MUL4_SYM_R2R(mm7, mm1, mm5)
+               MOV_R2P(mm1, *pdst, mm0)
+#else
+               *pdst = MUL4_SYM(mul_col, *src);
+#endif
+               src++;  pdst += step;
+             }
+           return;
+         }
+       while (dst_len--)
+         {
+           *pdst = *src;
+           src++;  pdst += step;
+         }
+       return;
+     }
+
+     {
+       DATA32  dsxx = (((src_len - 1) << 16) / (dst_len - 1));
+       DATA32  sxx = 0;
+       int     sx = sxx >> 16;
+
+#ifdef BUILD_MMX
+       pxor_r2r(mm0, mm0);
+       MOV_A2R(ALPHA_255, mm5)
+       if (mul)
+         {
+           MOV_P2R(mul_col, mm7, mm0)
+         }
+#endif
+       while (dst_len--)
+         {
+           DATA32   p2, p1 = 0;
+           int      a;
+
+           sx = (sxx >> 16);
+           if (sx < src_len)
+               p1 = *(src + sx);
+           p2 = p1;
+           if ((sx + 1) < src_len)
+               p2 = *(src + sx + 1);
+           a = 1 + ((sxx - (sx << 16)) >> 8);
+#ifdef BUILD_MMX
+           MOV_A2R(a, mm3)
+           MOV_P2R(p1, mm1, mm0)
+           MOV_P2R(p2, mm2, mm0)
+           INTERP_256_R2R(mm3, mm2, mm1, mm5)
+           if (mul)
+             {
+               MUL4_SYM_R2R(mm7, mm1, mm5)
+             }
+           MOV_R2P(mm1, *pdst, mm0)
+#else
+           p1 = INTERP_256(a, p2, p1);
+           if (mul)
+               p1 = MUL4_SYM(mul_col, p1);
+           *pdst = p1;
+#endif
+           pdst += step;  sxx += dsxx;
+         }
+       return;
+     }
+}
+
+static void
+evas_common_scale_rgba_a8_span_(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
+{
+   int  mul = 0, step = 1;
+   DATA32 *pdst = dst;
+
+   if (!src || !mask || !dst) return;
+   if ((src_len < 1) || (dst_len < 1)) return;
+   if ((src_len > 65535) || (dst_len > 65535)) return;
+   if (mul_col != 0xffffffff)
+       mul = 1;
+   if (dir < 0)
+     {
+       pdst += dst_len - 1;
+       step = -1;
+     }
+
+   if ((src_len == 1) || (dst_len == 1))
+     {
+       DATA32 c = MUL_SYM(*mask, *src);
+
+       if (mul) c = MUL4_SYM(mul_col, c);
+       while (dst_len--)
+          *dst++ = c;
+       return;
+     }
+
+   if (src_len == dst_len)
+     {
+#ifdef BUILD_MMX
+       pxor_r2r(mm0, mm0);
+       MOV_A2R(ALPHA_255, mm5)
+#endif
+       if (mul)
+         {
+#ifdef BUILD_MMX
+           MOV_P2R(mul_col, mm7, mm0)
+#endif
+           while (dst_len--)
+             {
+#ifdef BUILD_MMX
+               MOV_P2R(*src, mm1, mm0)
+               MOV_A2R(*mask, mm3)
+               MUL4_SYM_R2R(mm3, mm1, mm5)
+               MUL4_SYM_R2R(mm7, mm1, mm5)
+               MOV_R2P(mm1, *pdst, mm0)
+#else
+               DATA32  c = MUL_SYM(*mask, *src);
+               *pdst = MUL4_SYM(mul_col, c);
+#endif
+               src++;  mask++;  pdst += step;
+             }
+           return;
+         }
+       while (dst_len--)
+         {
+#ifdef BUILD_MMX
+           MOV_P2R(*src, mm1, mm0)
+           MOV_A2R(*mask, mm3)
+           MUL4_SYM_R2R(mm3, mm1, mm5)
+           MOV_R2P(mm1, *pdst, mm0)
+#else
+           *pdst = MUL_SYM(*mask, *src);
+#endif
+           src++;  mask++;  pdst += step;
+         }
+       return;
+     }
+
+     {
+       DATA32  dsxx = (((src_len - 1) << 16) / (dst_len - 1));
+       DATA32  sxx = 0;
+       int     sx = sxx >> 16;
+
+#ifdef BUILD_MMX
+       pxor_r2r(mm0, mm0);
+       MOV_A2R(ALPHA_255, mm5)
+       if (mul)
+         {
+           MOV_P2R(mul_col, mm7, mm0)
+         }
+#endif
+       while (dst_len--)
+         {
+           DATA32   p2, p1 = 0;
+           int      a, a2, a1 = 0;
+
+           sx = (sxx >> 16);
+           if (sx < src_len)
+             {
+               p1 = *(src + sx);
+               a1 = *(mask + sx);
+             }
+           p2 = p1;  a2 = a1;
+           if ((sx + 1) < src_len)
+             {
+               p2 = *(src + sx + 1);
+               a2 = *(mask + sx + 1);
+             }
+           a = 1 + ((sxx - (sx << 16)) >> 8);
+#ifdef BUILD_MMX
+           MOV_A2R(a, mm3)
+           MOV_P2R(p1, mm1, mm0)
+           MOV_P2R(p2, mm2, mm0)
+           INTERP_256_R2R(mm3, mm2, mm1, mm5)
+           a1 += 1 + ((a * (a2 - a1)) >> 8);
+           MOV_A2R(a1, mm3)
+           MUL4_256_R2R(mm3, mm1)
+           if (mul)
+             {
+               MUL4_SYM_R2R(mm7, mm1, mm5)
+             }
+           MOV_R2P(mm1, *pdst, mm0)
+#else
+           p1 = INTERP_256(a, p2, p1);
+           a1 += 1 + ((a * (a2 - a1)) >> 8);
+           p1 = MUL_256(a1, p1);
+           if (mul)
+               p1 = MUL4_SYM(mul_col, p1);
+           *pdst = p1;
+#endif
+           pdst += step;  sxx += dsxx;
+         }
+       return;
+     }
+}
+
+static void
+evas_common_scale_a8_span_(DATA32 *src __UNUSED__, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
+{
+   int    step = 1;
+   DATA32 *pdst = dst;
+
+   if (!mask || !dst) return;
+   if ((src_len < 1) || (dst_len < 1)) return;
+   if ((src_len > 65535) || (dst_len > 65535)) return;
+   if (dir < 0)
+     {
+       pdst += dst_len - 1;
+       step = -1;
+     }
+
+   if ((src_len == 1) || (dst_len == 1))
+     {
+       DATA32 c = MUL_SYM(*mask, mul_col);
+
+       while (dst_len--)
+          *dst++ = c;
+       return;
+     }
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+   MOV_P2R(mul_col, mm7, mm0)
+#endif
+   if (src_len == dst_len)
+     {
+       while (dst_len--)
+         {
+#ifdef BUILD_MMX
+           MOV_A2R(*mask, mm3)
+           MUL4_SYM_R2R(mm7, mm3, mm5)
+           MOV_R2P(mm3, *pdst, mm0)
+#else
+           *pdst = MUL_SYM(*mask, mul_col);
+#endif
+           mask++;  pdst += step;
+         }
+       return;
+     }
+
+     {
+       DATA32  dsxx = (((src_len - 1) << 16) / (dst_len - 1));
+       DATA32  sxx = 0;
+       int     sx = sxx >> 16;
+
+       while (dst_len--)
+         {
+           int   a, a2, a1 = 0;
+
+           sx = (sxx >> 16);
+           if (sx < src_len)
+               a1 = *(mask + sx);
+           a2 = a1;
+           if ((sx + 1) < src_len)
+               a2 = *(mask + sx + 1);
+           a = 1 + ((sxx - (sx << 16)) >> 8);
+           a1 += 1 + ((a * (a2 - a1)) >> 8);
+#ifdef BUILD_MMX
+           MOV_A2R(a1, mm3)
+           MUL4_256_R2R(mm7, mm3)
+           MOV_R2P(mm3, *pdst, mm0)
+#else
+           *pdst = MUL_256(a1, mul_col);
+#endif
+           pdst += step;  sxx += dsxx;
+         }
+       return;
+     }
+}
+
+static void
+evas_common_scale_clip_a8_span_(DATA32 *src __UNUSED__, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
+{
+   int   mul = 0, step = 1;
+   DATA32 *pdst = dst;
+
+   if (!mask || !dst) return;
+   if ((src_len < 1) || (dst_len < 1)) return;
+   if ((src_len > 65535) || (dst_len > 65535)) return;
+   if (mul_col != 0xffffffff)
+       mul = 1;
+   if (dir < 0)
+     {
+       pdst += dst_len - 1;
+       step = -1;
+     }
+
+#ifdef BUILD_MMX
+   pxor_r2r(mm0, mm0);
+   MOV_A2R(ALPHA_255, mm5)
+   if (mul)
+     {
+       MOV_P2R(mul_col, mm7, mm0)
+     }
+#endif
+   if ((src_len == 1) || (dst_len == 1))
+     {
+#ifdef BUILD_MMX
+       MOV_A2R(*mask, mm3)
+#else
+       DATA32 c = *mask;
+#endif
+       if (mul)
+         {
+#ifdef BUILD_MMX
+           MUL4_SYM_R2R(mm7, mm3, mm5)
+#else
+           c = MUL_SYM(c, mul_col);
+#endif
+           while (dst_len--)
+             {
+#ifdef BUILD_MMX
+               MOV_P2R(*dst, mm1, mm0)
+               MUL4_SYM_R2R(mm3, mm1, mm5)
+               MOV_R2P(mm1, *dst, mm0)
+#else
+               *dst = MUL4_SYM(c, *dst);
+#endif
+               dst++;
+             }
+           return;
+         }
+       while (dst_len--)
+         {
+#ifdef BUILD_MMX
+           MOV_P2R(*dst, mm1, mm0)
+           MUL4_SYM_R2R(mm3, mm1, mm5)
+           MOV_R2P(mm1, *dst, mm0)
+#else
+           *dst = MUL_SYM(c, *dst);
+#endif
+           dst++;
+         }
+       return;
+     }
+
+   if (src_len == dst_len)
+     {
+       if (mul)
+         {
+           while (dst_len--)
+             {
+#ifdef BUILD_MMX
+               MOV_A2R(*mask, mm3)
+               MUL4_SYM_R2R(mm7, mm3, mm5)
+               MOV_P2R(*pdst, mm1, mm0)
+               MUL4_SYM_R2R(mm3, mm1, mm5)
+               MOV_R2P(mm1, *pdst, mm0)
+#else
+               DATA32 c = MUL_SYM(*mask, mul_col);
+
+               *pdst = MUL4_SYM(c, *pdst);
+#endif
+               mask++;  pdst += step;
+             }
+           return;
+         }
+       while (dst_len--)
+         {
+#ifdef BUILD_MMX
+           MOV_A2R(*mask, mm3)
+           MOV_P2R(*pdst, mm1, mm0)
+           MUL4_SYM_R2R(mm3, mm1, mm5)
+           MOV_R2P(mm1, *pdst, mm0)
+#else
+           *pdst = MUL_SYM(*mask, *pdst);
+#endif
+           mask++;  pdst += step;
+         }
+       return;
+     }
+
+     {
+       DATA32  dsxx = (((src_len - 1) << 16) / (dst_len - 1));
+       DATA32  sxx = 0;
+       int     sx = sxx >> 16;
+
+       while (dst_len--)
+         {
+           int   a, a2, a1 = 0;
+
+           sx = (sxx >> 16);
+           if (sx < src_len)
+               a1 = *(mask + sx);
+           a2 = a1;
+           if ((sx + 1) < src_len)
+               a2 = *(mask + sx + 1);
+           a = 1 + ((sxx - (sx << 16)) >> 8);
+           a1 += 1 + ((a * (a2 - a1)) >> 8);
+#ifdef BUILD_MMX
+           MOV_A2R(a1, mm3)
+           MOV_P2R(*pdst, mm1, mm0)
+           MUL4_256_R2R(mm3, mm1)
+           if (mul)
+             {
+               MUL4_SYM_R2R(mm7, mm1, mm5)
+             }
+           MOV_R2P(mm1, *pdst, mm0)
+#else
+           *pdst = MUL_256(a1, *pdst);
+           if (mul)
+               *pdst = MUL4_SYM(mul_col, *pdst);
+#endif
+           pdst += step;  sxx += dsxx;
+         }
+       return;
+     }
+}
+
+EAPI void
+evas_common_scale_rgba_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
+{
+   evas_common_scale_rgba_span_(src, mask, src_len, mul_col, dst, dst_len, dir);
+   evas_common_cpu_end_opt();
+}
+
+EAPI void
+evas_common_scale_rgba_a8_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
+{
+   evas_common_scale_rgba_a8_span_(src, mask, src_len, mul_col, dst, dst_len, dir);
+   evas_common_cpu_end_opt();
+}
+
+EAPI void
+evas_common_scale_a8_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
+{
+   evas_common_scale_a8_span_(src, mask, src_len, mul_col, dst, dst_len, dir);
+   evas_common_cpu_end_opt();
+}
+
+EAPI void
+evas_common_scale_clip_a8_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
+{
+   evas_common_scale_clip_a8_span_(src, mask, src_len, mul_col, dst, dst_len, dir);
+   evas_common_cpu_end_opt();
+}
+
+EAPI void
+evas_common_scale_hsva_span(DATA32 *src, DATA8 *mask __UNUSED__, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
+{
+   int  mul = 0, step = 1;
+   DATA32 *pdst = dst;
+
+   if (!src || !dst) return;
+   if ((src_len < 1) || (dst_len < 1)) return;
+   if ((src_len > 65535) || (dst_len > 65535)) return;
+   if (mul_col != 0xffffffff)
+       mul = 1;
+   if (dir < 0)
+     {
+       pdst += dst_len - 1;
+       step = -1;
+     }
+
+   if ((src_len == 1) || (dst_len == 1))
+     {
+       DATA32 c = *src;
+
+       if (mul) c = MUL4_SYM(mul_col, c);
+       while (dst_len--)
+          *dst++ = c;
+       return;
+     }
+
+   if (src_len == dst_len)
+     {
+       if (mul)
+         {
+           while (dst_len--)
+             {
+               *pdst = MUL4_SYM(mul_col, *src);
+               src++;  pdst += step;
+             }
+           return;
+         }
+       while (dst_len--)
+         {
+           *pdst = *src;
+           src++;  pdst += step;
+         }
+       return;
+     }
+
+     {
+       DATA32  dsxx = (((src_len - 1) << 16) / (dst_len - 1));
+       DATA32  sxx = 0;
+       int     sx = sxx >> 16;
+
+       while (dst_len--)
+         {
+           DATA32   p2, p1 = 0;
+           int      a, h1, s1, v1, h2, s2, v2;
+
+           sx = (sxx >> 16);
+           if (sx < src_len)
+               p1 = *(src + sx);
+           evas_common_convert_color_rgb_to_hsv_int((p1 >> 16) & 0xff, (p1 >> 8) & 0xff, p1 & 0xff,
+                                                    &h1, &s1, &v1);
+           p2 = p1;
+           if ((sx + 1) < src_len)
+               p2 = *(src + sx + 1);
+           evas_common_convert_color_rgb_to_hsv_int((p2 >> 16) & 0xff, (p2 >> 8) & 0xff, p2 & 0xff,
+                                                    &h2, &s2, &v2);
+           a = 1 + ((sxx - (sx << 16)) >> 8);
+           h1 += (a * (h2 - h1)) >> 8;
+           s1 += (a * (s2 - s1)) >> 8;
+           v1 += (a * (v2 - v1)) >> 8;
+           a = (((((p2 >> 8) & 0xff0000) - ((p1 >> 8) & 0xff0000)) * a) +
+                (p1 & 0xff000000)) & 0xff000000;
+           evas_common_convert_color_hsv_to_rgb_int(h1, s1, v1, &h2, &s2, &v2);
+           p1 = a + RGB_JOIN(h2,s2,v2);
+           if (mul)
+               p1 = MUL4_SYM(mul_col, p1);
+           *pdst = p1;
+           pdst += step;  sxx += dsxx;
+         }
+       return;
+     }
+}
+
+EAPI void
+evas_common_scale_hsva_a8_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
+{
+   int  mul = 0, step = 1;
+   DATA32 *pdst = dst;
+
+   if (!src || !mask || !dst) return;
+   if ((src_len < 1) || (dst_len < 1)) return;
+   if ((src_len > 65535) || (dst_len > 65535)) return;
+   if (mul_col != 0xffffffff)
+       mul = 1;
+   if (dir < 0)
+     {
+       pdst += dst_len - 1;
+       step = -1;
+     }
+
+   if ((src_len == 1) || (dst_len == 1))
+     {
+       DATA32 c = MUL_SYM(*mask, *src);
+
+       if (mul) c = MUL4_SYM(mul_col, c);
+       while (dst_len--)
+          *dst++ = c;
+       return;
+     }
+
+   if (src_len == dst_len)
+     {
+       if (mul)
+         {
+           while (dst_len--)
+             {
+               DATA32  c = MUL_SYM(*mask, *src);
+               *pdst = MUL4_SYM(mul_col, c);
+               src++;  mask++;  pdst += step;
+             }
+           return;
+         }
+       while (dst_len--)
+         {
+           *pdst = MUL_SYM(*mask, *src);
+           src++;  mask++;  pdst += step;
+         }
+       return;
+     }
+
+     {
+       DATA32  dsxx = (((src_len - 1) << 16) / (dst_len - 1));
+       DATA32  sxx = 0;
+       int     sx = sxx >> 16;
+
+       while (dst_len--)
+         {
+           DATA32   p2, p1 = 0;
+           int      a, a2, a1 = 0;
+           int      h1, s1, v1, h2, s2, v2;
+
+           sx = (sxx >> 16);
+           if (sx < src_len)
+             {
+               p1 = *(src + sx);
+               a1 = *(mask + sx);
+             }
+           p2 = p1;  a2 = a1;
+           if ((sx + 1) < src_len)
+             {
+               p2 = *(src + sx + 1);
+               a2 = *(mask + sx + 1);
+             }
+           evas_common_convert_color_rgb_to_hsv_int((p1 >> 16) & 0xff, (p1 >> 8) & 0xff, p1 & 0xff,
+                                                     &h1, &s1, &v1);
+           evas_common_convert_color_rgb_to_hsv_int((p2 >> 16) & 0xff, (p2 >> 8) & 0xff, p2 & 0xff,
+                                                     &h2, &s2, &v2);
+           a = 1 + ((sxx - (sx << 16)) >> 8);
+           a1 += (a * (a2 - a1)) >> 8;
+           h1 += (a * (h2 - h1)) >> 8;
+           s1 += (a * (s2 - s1)) >> 8;
+           v1 += (a * (v2 - v1)) >> 8;
+           a = (((((p2 >> 8) & 0xff0000) - ((p1 >> 8) & 0xff0000)) * a) +
+                (p1 & 0xff000000)) & 0xff000000;
+
+           evas_common_convert_color_hsv_to_rgb_int(h1, s1, v1, &h2, &s2, &v2);
+           p1 = a + RGB_JOIN(h2,s2,v2);
+           p1 = MUL_SYM(a1, p1);
+           if (mul)
+               p1 = MUL4_SYM(mul_col, p1);
+           *pdst = p1;
+           pdst += step;  sxx += dsxx;
+         }
+       return;
+     }
+}
diff --git a/src/lib/engines/common/evas_scale_span.h b/src/lib/engines/common/evas_scale_span.h
new file mode 100644 (file)
index 0000000..6c51619
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef _EVAS_SCALE_SPAN_H
+#define _EVAS_SCALE_SPAN_H
+
+
+EAPI void evas_common_scale_rgba_span                       (DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir);
+EAPI void evas_common_scale_rgba_a8_span                    (DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir);
+EAPI void evas_common_scale_a8_span                         (DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir);
+EAPI void evas_common_scale_clip_a8_span                    (DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir);
+
+EAPI void evas_common_scale_hsva_span                       (DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir);
+EAPI void evas_common_scale_hsva_a8_span                    (DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir);
+
+
+#endif /* _EVAS_SCALE_SPAN_H */
diff --git a/src/lib/engines/common/evas_tiler.c b/src/lib/engines/common/evas_tiler.c
new file mode 100644 (file)
index 0000000..c29359f
--- /dev/null
@@ -0,0 +1,1323 @@
+#include "evas_common.h"
+#ifdef EVAS_RECT_SPLIT
+
+static const list_node_t list_node_zeroed = { NULL };
+static const list_t list_zeroed = { NULL, NULL };
+
+typedef struct list_node_pool
+{
+   list_node_t *node;
+   int len;
+   int max;
+} list_node_pool_t;
+
+static list_node_pool_t list_node_pool = { NULL, 0, 1024 };
+
+void
+rect_list_node_pool_set_max(int max)
+{
+   int diff;
+
+   diff = list_node_pool.len - max;
+   for (; diff > 0 && list_node_pool.node != NULL; diff--)
+     {
+        list_node_t *node;
+
+        node = list_node_pool.node;
+        list_node_pool.node = node->next;
+        list_node_pool.len--;
+
+        free(node);
+     }
+
+   list_node_pool.max = max;
+}
+
+void
+rect_list_node_pool_flush(void)
+{
+   while (list_node_pool.node)
+     {
+        list_node_t *node;
+
+        node = list_node_pool.node;
+        list_node_pool.node = node->next;
+        list_node_pool.len--;
+
+        free(node);
+     }
+}
+
+inline list_node_t *
+rect_list_node_pool_get(void)
+{
+   if (list_node_pool.node)
+     {
+        list_node_t *node;
+
+        node = list_node_pool.node;
+        list_node_pool.node = node->next;
+        list_node_pool.len--;
+
+        return node;
+     }
+   else return malloc(sizeof(rect_node_t));
+}
+
+inline void
+rect_list_node_pool_put(list_node_t *node)
+{
+   if (list_node_pool.len < list_node_pool.max)
+     {
+        node->next = list_node_pool.node;
+        list_node_pool.node = node;
+        list_node_pool.len++;
+     }
+   else free(node);
+}
+
+inline void
+rect_init(rect_t *r, int x, int y, int w, int h)
+{
+   r->area = w * h;
+
+   r->left = x;
+   r->top = y;
+
+   r->right = x + w;
+   r->bottom = y + h;
+
+   r->width = w;
+   r->height = h;
+}
+
+void
+rect_print(const rect_t r)
+{
+   INF("<rect(%d, %d, %d, %d)>", r.left, r.top, r.width, r.height);
+}
+
+void
+rect_list_print(const list_t rects)
+{
+   list_node_t *node;
+   int len;
+
+   len = 0;
+   for (node = rects.head; node != NULL; node = node->next) len++;
+
+   putchar('[');
+   for (node = rects.head; node != NULL; node = node->next)
+     {
+       rect_print(((rect_node_t *)node)->rect);
+       if (node->next)
+         {
+            putchar(',');
+            if (len < 4) putchar(' ');
+            else
+              {
+                 putchar('\n');
+                 putchar(' ');
+              }
+         }
+     }
+   putchar(']');
+}
+
+inline void
+rect_list_append_node(list_t *rects, list_node_t *node)
+{
+   if (rects->tail)
+     {
+       rects->tail->next = node;
+       rects->tail = node;
+     }
+   else
+     {
+       rects->head = node;
+       rects->tail = node;
+     }
+}
+
+inline void
+rect_list_append(list_t *rects, const rect_t r)
+{
+   rect_node_t *rect_node;
+
+   rect_node = (rect_node_t *)rect_list_node_pool_get();
+   rect_node->rect = r;
+   rect_node->_lst = list_node_zeroed;
+
+   rect_list_append_node(rects, (list_node_t *)rect_node);
+}
+
+inline void
+rect_list_append_xywh(list_t *rects, int x, int y, int w, int h)
+{
+   rect_t r;
+
+   rect_init(&r, x, y, w, h);
+   rect_list_append(rects, r);
+}
+
+inline void
+rect_list_concat(list_t *rects, list_t *other)
+{
+   if (!other->head)
+     return;
+
+   if (rects->tail)
+     {
+       rects->tail->next = other->head;
+       rects->tail = other->tail;
+     }
+   else
+     {
+       rects->head = other->head;
+       rects->tail = other->tail;
+     }
+   *other = list_zeroed;
+}
+
+inline list_node_t *
+rect_list_unlink_next(list_t *rects, list_node_t *parent_node)
+{
+    list_node_t *node;
+
+    if (parent_node)
+     {
+        node = parent_node->next;
+        parent_node->next = node->next;
+     }
+   else
+     {
+        node = rects->head;
+        rects->head = node->next;
+     }
+
+   if (rects->tail == node) rects->tail = parent_node;
+   *node = list_node_zeroed;
+   return node;
+}
+
+inline void
+rect_list_del_next(list_t *rects, list_node_t *parent_node)
+{
+    list_node_t *node;
+
+    node = rect_list_unlink_next(rects, parent_node);
+    rect_list_node_pool_put(node);
+}
+
+void
+rect_list_clear(list_t *rects)
+{
+   list_node_t *node;
+
+   node = rects->head;
+   while (node)
+     {
+        list_node_t *aux;
+
+        aux = node->next;
+        rect_list_node_pool_put(node);
+        node = aux;
+     }
+   *rects = list_zeroed;
+}
+
+static inline void
+_calc_intra_rect_area(const rect_t a, const rect_t b, int *width, int *height)
+{
+   int max_left, min_right, max_top, min_bottom;
+
+   if (a.left < b.left) max_left = b.left;
+   else max_left = a.left;
+
+   if (a.right < b.right) min_right = a.right;
+   else min_right = b.right;
+
+   *width = min_right - max_left;
+
+   if (a.top < b.top) max_top = b.top;
+   else max_top = a.top;
+
+   if (a.bottom < b.bottom) min_bottom = a.bottom;
+   else min_bottom = b.bottom;
+
+   *height = min_bottom - max_top;
+}
+
+static inline void
+_split_strict(list_t *dirty, const rect_t current, rect_t r)
+{
+   int h_1, h_2, w_1, w_2;
+
+   h_1 = current.top - r.top;
+   h_2 = r.bottom - current.bottom;
+   w_1 = current.left - r.left;
+   w_2 = r.right - current.right;
+
+   if (h_1 > 0)
+     {
+       /*    .--.r (b)                .---.r2
+         *    |  |                     |   |
+         *  .-------.cur (a) .---.r    '---'
+         *  | |  |  |     -> |   |   +
+         *  | `--'  |        `---'
+         *  `-------'
+         */
+        rect_list_append_xywh(dirty, r.left, r.top, r.width, h_1);
+        r.height -= h_1;
+        r.top = current.top;
+     }
+
+   if (h_2 > 0)
+     {
+        /*  .-------.cur (a)
+         *  | .---. |        .---.r
+         *  | |   | |    ->  |   |
+         *  `-------'        `---'   +  .---.r2
+         *    |   |                     |   |
+         *    `---'r (b)                `---'
+         */
+        rect_list_append_xywh(dirty, r.left, current.bottom, r.width, h_2);
+        r.height -= h_2;
+     }
+
+   if (w_1 > 0)
+     {
+        /* (b) r  .----.cur (a)
+         *     .--|-.  |      .--.r2   .-.r
+         *     |  | |  |  ->  |  |   + | |
+         *     `--|-'  |      `--'     `-'
+         *        `----'
+         */
+        rect_list_append_xywh(dirty, r.left, r.top, w_1, r.height);
+        /* not necessary to keep these, r (b) will be destroyed */
+        /* r.width -= w_1; */
+        /* r.left = current.left; */
+     }
+
+   if (w_2 > 0)
+     {
+        /*  .----.cur (a)
+         *  |    |
+         *  |  .-|--.r (b)  .-.r   .--.r2
+         *  |  | |  |    -> | |  + |  |
+         *  |  `-|--'       `-'    `--'
+         *  `----'
+         */
+        rect_list_append_xywh(dirty, current.right, r.top, w_2, r.height);
+        /* not necessary to keep this, r (b) will be destroyed */
+        /* r.width -= w_2; */
+     }
+}
+
+void
+rect_list_del_split_strict(list_t *rects, const rect_t del_r)
+{
+   list_t modified = list_zeroed;
+   list_node_t *cur_node, *prev_node;
+
+   prev_node = NULL;
+   cur_node = rects->head;
+   while (cur_node)
+     {
+        int intra_width, intra_height;
+        rect_t current;
+
+        current = ((rect_node_t*)cur_node)->rect;
+
+        _calc_intra_rect_area(del_r, current, &intra_width, &intra_height);
+        if ((intra_width <= 0) || (intra_height <= 0))
+          {
+             /*  .---.current      .---.del_r
+              *  |   |             |   |
+              *  `---+---.del_r    `---+---.current
+              *      |   |             |   |
+              *      `---'             `---'
+              * no interception, nothing to do
+              */
+              prev_node = cur_node;
+              cur_node = cur_node->next;
+          }
+        else if ((intra_width == current.width) &&
+                 (intra_height == current.height))
+          {
+             /*  .-------.del_r
+              *  | .---. |
+              *  | |   | |
+              *  | `---'current
+              *  `-------'
+              * current is contained, remove from rects
+              */
+              cur_node = cur_node->next;
+              rect_list_del_next(rects, prev_node);
+          }
+        else
+          {
+              _split_strict(&modified, del_r, current);
+              cur_node = cur_node->next;
+              rect_list_del_next(rects, prev_node);
+          }
+     }
+
+   rect_list_concat(rects, &modified);
+}
+
+void
+rect_list_add_split_strict(list_t *rects, list_node_t *node)
+{
+   list_t dirty = list_zeroed;
+   list_t new_dirty = list_zeroed;
+   list_node_t *cur_node;
+
+   if (!rects->head)
+     {
+        rect_list_append_node(rects, node);
+        return;
+     }
+
+   rect_list_append_node(&dirty, node);
+
+   cur_node = rects->head;
+   while (dirty.head)
+     {
+        rect_t current;
+
+        if (!cur_node)
+         {
+            rect_list_concat(rects, &dirty);
+            break;
+         }
+
+        current = ((rect_node_t*)cur_node)->rect;
+
+        while (dirty.head)
+         {
+            int intra_width, intra_height;
+            rect_t r;
+
+            r = ((rect_node_t *)dirty.head)->rect;
+            _calc_intra_rect_area(r, current, &intra_width, &intra_height);
+            if ((intra_width == r.width) && (intra_height == r.height))
+              /*  .-------.cur
+               *  | .---.r|
+               *  | |   | |
+               *  | `---' |
+               *  `-------'
+               */
+              rect_list_del_next(&dirty, NULL);
+            else if ((intra_width <= 0) || (intra_height <= 0))
+              {
+                 /*  .---.cur     .---.r
+                  *  |   |        |   |
+                  *  `---+---.r   `---+---.cur
+                  *      |   |        |   |
+                  *      `---'        `---'
+                  */
+                 list_node_t *tmp;
+                 tmp = rect_list_unlink_next(&dirty, NULL);
+                 rect_list_append_node(&new_dirty, tmp);
+              }
+            else
+              {
+                 _split_strict(&new_dirty, current, r);
+                 rect_list_del_next(&dirty, NULL);
+              }
+         }
+        dirty = new_dirty;
+        new_dirty = list_zeroed;
+
+        cur_node = cur_node->next;
+    }
+}
+
+static inline void
+_calc_intra_outer_rect_area(const rect_t a, const rect_t b,
+                            rect_t *intra, rect_t *outer)
+{
+    int min_left, max_left, min_right, max_right;
+    int min_top, max_top, min_bottom, max_bottom;
+
+    if (a.left < b.left)
+     {
+        max_left = b.left;
+        min_left = a.left;
+     }
+   else
+     {
+        max_left = a.left;
+        min_left = b.left;
+     }
+
+   if (a.right < b.right)
+     {
+        min_right = a.right;
+        max_right = b.right;
+     }
+   else
+     {
+        min_right = b.right;
+        max_right = a.right;
+     }
+
+   intra->left = max_left;
+   intra->right = min_right;
+   intra->width = min_right - max_left;
+
+   outer->left = min_left;
+   outer->right = max_right;
+   outer->width = max_right - min_left;
+
+   if (a.top < b.top)
+     {
+       max_top = b.top;
+        min_top = a.top;
+     }
+   else
+     {
+        max_top = a.top;
+        min_top = b.top;
+     }
+
+   if (a.bottom < b.bottom)
+     {
+        min_bottom = a.bottom;
+        max_bottom = b.bottom;
+     }
+   else
+     {
+        min_bottom = b.bottom;
+        max_bottom = a.bottom;
+     }
+
+   intra->top = max_top;
+   intra->bottom = min_bottom;
+   intra->height = min_bottom - max_top;
+   if ((intra->width > 0) && (intra->height > 0))
+     intra->area = intra->width * intra->height;
+   else
+     intra->area = 0;
+
+   outer->top = min_top;
+   outer->bottom = max_bottom;
+   outer->height = max_bottom - min_top;
+   outer->area = outer->width * outer->height;
+}
+
+enum
+{
+   SPLIT_FUZZY_ACTION_NONE,
+     SPLIT_FUZZY_ACTION_SPLIT,
+     SPLIT_FUZZY_ACTION_MERGE
+};
+
+static inline int
+_split_fuzzy(list_t *dirty, const rect_t a, rect_t *b)
+{
+   int h_1, h_2, w_1, w_2, action;
+
+   h_1 = a.top - b->top;
+   h_2 = b->bottom - a.bottom;
+   w_1 = a.left - b->left;
+   w_2 = b->right - a.right;
+
+   action = SPLIT_FUZZY_ACTION_NONE;
+
+   if (h_1 > 0)
+     {
+        /*    .--.r (b)                .---.r2
+         *    |  |                     |   |
+         *  .-------.cur (a) .---.r    '---'
+         *  | |  |  |     -> |   |   +
+         *  | `--'  |        `---'
+         *  `-------'
+         */
+        rect_list_append_xywh(dirty, b->left, b->top, b->width, h_1);
+        b->height -= h_1;
+        b->top = a.top;
+        action = SPLIT_FUZZY_ACTION_SPLIT;
+     }
+
+   if (h_2 > 0)
+     {
+        /*  .-------.cur (a)
+         *  | .---. |        .---.r
+         *  | |   | |    ->  |   |
+         *  `-------'        `---'   +  .---.r2
+         *    |   |                     |   |
+         *    `---'r (b)                `---'
+         */
+        rect_list_append_xywh(dirty, b->left, a.bottom, b->width, h_2);
+        b->height -= h_2;
+        action = SPLIT_FUZZY_ACTION_SPLIT;
+     }
+
+   if (((w_1 > 0) || (w_2 > 0)) && (a.height == b->height))
+     return SPLIT_FUZZY_ACTION_MERGE;
+
+   if (w_1 > 0)
+     {
+        /* (b)  r  .----.cur (a)
+         *      .--|-.  |      .--.r2   .-.r
+         *      |  | |  |  ->  |  |   + | |
+         *      `--|-'  |      `--'     `-'
+         *         `----'
+         */
+        rect_list_append_xywh(dirty, b->left, b->top, w_1, b->height);
+        /* not necessary to keep these, r (b) will be destroyed */
+        /* b->width -= w_1; */
+        /* b->left = a.left; */
+        action = SPLIT_FUZZY_ACTION_SPLIT;
+     }
+
+   if (w_2 > 0)
+     {
+        /* .----.cur (a)
+         * |    |
+         * |  .-|--.r (b)  .-.r   .--.r2
+         * |  | |  |    -> | |  + |  |
+         * |  `-|--'       `-'    `--'
+         * `----'
+         */
+        rect_list_append_xywh(dirty, a.right, b->top, w_2, b->height);
+        /* not necessary to keep these, r (b) will be destroyed */
+        /* b->width -= w_2; */
+        action = SPLIT_FUZZY_ACTION_SPLIT;
+     }
+
+   return action;
+}
+
+list_node_t *
+rect_list_add_split_fuzzy(list_t *rects, list_node_t *node, int accepted_error)
+{
+   list_t dirty = list_zeroed;
+   list_node_t *old_last;
+
+   old_last = rects->tail;
+
+   if (!rects->head)
+     {
+        rect_list_append_node(rects, node);
+        return old_last;
+     }
+
+   rect_list_append_node(&dirty, node);
+   while (dirty.head)
+     {
+       list_node_t *d_node, *cur_node, *prev_cur_node;
+        int keep_dirty;
+        rect_t r;
+
+        d_node = rect_list_unlink_next(&dirty, NULL);
+        r = ((rect_node_t *)d_node)->rect;
+
+        prev_cur_node = NULL;
+        cur_node = rects->head;
+        keep_dirty = 1;
+        while (cur_node)
+         {
+            int area, action;
+            rect_t current, intra, outer;
+
+            current = ((rect_node_t *)cur_node)->rect;
+
+            _calc_intra_outer_rect_area(r, current, &intra, &outer);
+            area = current.area + r.area - intra.area;
+
+            if ((intra.width == r.width) && (intra.height == r.height))
+              {
+                 /*  .-------.cur
+                  *  | .---.r|
+                  *  | |   | |
+                  *  | `---' |
+                  *  `-------'
+                  */
+                 keep_dirty = 0;
+                 break;
+              }
+            else if ((intra.width == current.width) &&
+                     (intra.height == current.height))
+              {
+                 /* .-------.r
+                  * | .---.cur
+                  * | |   | |
+                  * | `---' |
+                  * `-------'
+                  */
+                 if (old_last == cur_node)
+                    old_last = prev_cur_node;
+                 cur_node = cur_node->next;
+                 rect_list_del_next(rects, prev_cur_node);
+              }
+            else if ((outer.area - area) <= accepted_error)
+              {
+                 /* .-----------. bounding box (outer)
+                  * |.---. .---.|
+                  * ||cur| |r  ||
+                  * ||   | |   ||
+                  * |`---' `---'|
+                  * `-----------'
+                  * merge them, remove both and add merged
+                  */
+                 rect_node_t *n;
+
+                 if (old_last == cur_node)
+                    old_last = prev_cur_node;
+
+                 n = (rect_node_t *)rect_list_unlink_next(rects, prev_cur_node);
+                 n->rect = outer;
+                 rect_list_append_node(&dirty, (list_node_t *)n);
+
+                 keep_dirty = 0;
+                 break;
+              }
+            else if (intra.area <= accepted_error)
+              {
+                 /*  .---.cur     .---.r
+                  *  |   |        |   |
+                  *  `---+---.r   `---+---.cur
+                  *      |   |        |   |
+                  *      `---'        `---'
+                  *  no split, no merge
+                  */
+                 prev_cur_node = cur_node;
+                 cur_node = cur_node->next;
+              }
+            else
+              {
+                 /* split is required */
+                 action = _split_fuzzy(&dirty, current, &r);
+                 if (action == SPLIT_FUZZY_ACTION_MERGE)
+                   {
+                      /* horizontal merge is possible: remove both, add merged */
+                      rect_node_t *n;
+
+                      if (old_last == cur_node)
+                        old_last = prev_cur_node;
+
+                      n = (rect_node_t *)
+                        rect_list_unlink_next(rects, prev_cur_node);
+
+                      n->rect.left = outer.left;
+                      n->rect.width = outer.width;
+                      n->rect.right = outer.right;
+                      n->rect.area = outer.width * r.height;
+                      rect_list_append_node(&dirty, (list_node_t *)n);
+                   }
+                 else if (action == SPLIT_FUZZY_ACTION_NONE)
+                   {
+                      /*
+                       * this rect check was totally useless,
+                       * should never happen
+                       */
+                      /* prev_cur_node = cur_node; */
+                      /* cur_node = cur_node->next; */
+                      WRN("Should not get here!");
+                      abort();
+                   }
+
+                 keep_dirty = 0;
+                 break;
+              }
+         }
+
+        if (UNLIKELY(keep_dirty)) rect_list_append_node(rects, d_node);
+        else rect_list_node_pool_put(d_node);
+    }
+
+    return old_last;
+}
+
+static inline void
+_calc_outer_rect_area(const rect_t a, const rect_t b, rect_t *outer)
+{
+   int min_left, max_right;
+   int min_top, max_bottom;
+
+   if (a.left < b.left) min_left = a.left;
+   else min_left = b.left;
+
+   if (a.right < b.right) max_right = b.right;
+   else max_right = a.right;
+
+   outer->left = min_left;
+   outer->right = max_right;
+   outer->width = max_right - min_left;
+
+   if (a.top < b.top) min_top = a.top;
+   else min_top = b.top;
+
+   if (a.bottom < b.bottom) max_bottom = b.bottom;
+   else max_bottom = a.bottom;
+
+   outer->top = min_top;
+   outer->bottom = max_bottom;
+   outer->height = max_bottom - min_top;
+
+   outer->area = outer->width * outer->height;
+}
+
+void
+rect_list_merge_rects(list_t *rects, list_t *to_merge, int accepted_error)
+{
+   while (to_merge->head)
+     {
+        list_node_t *node, *parent_node;
+        rect_t r1;
+        int merged;
+
+        r1 = ((rect_node_t *)to_merge->head)->rect;
+
+        merged = 0;
+        parent_node = NULL;
+        node = rects->head;
+        while (node != NULL)
+         {
+            rect_t r2, outer;
+            int area;
+
+            r2 = ((rect_node_t *)node)->rect;
+
+            _calc_outer_rect_area(r1, r2, &outer);
+            area = r1.area + r2.area; /* intra area is taken as 0 */
+            if (outer.area - area <= accepted_error)
+              {
+                 /*
+                  * remove both r1 and r2, create r3
+                  * actually r3 uses r2 instance, saves memory
+                  */
+                 rect_node_t *n;
+
+                 n = (rect_node_t *)rect_list_unlink_next(rects, parent_node);
+                 n->rect = outer;
+                 rect_list_append_node(to_merge, (list_node_t *)n);
+                 merged = 1;
+                 break;
+              }
+
+            parent_node = node;
+            node = node->next;
+         }
+
+        if (!merged)
+         {
+            list_node_t *n;
+            n = rect_list_unlink_next(to_merge, NULL);
+            rect_list_append_node(rects, n);
+         }
+       else
+         rect_list_del_next(to_merge, NULL);
+    }
+}
+
+void
+rect_list_add_split_fuzzy_and_merge(list_t *rects,
+                                    list_node_t *node,
+                                    int split_accepted_error,
+                                    int merge_accepted_error)
+{
+   list_node_t *n;
+
+   n = rect_list_add_split_fuzzy(rects, node, split_accepted_error);
+   if (n && n->next)
+     {
+        list_t to_merge;
+
+        /* split list into 2 segments, already merged and to merge */
+        to_merge.head = n->next;
+        to_merge.tail = rects->tail;
+        rects->tail = n;
+        n->next = NULL;
+
+        rect_list_merge_rects(rects, &to_merge, merge_accepted_error);
+     }
+}
+#endif /* EVAS_RECT_SPLIT */
+
+#define TILE(tb, x, y) ((tb)->tiles.tiles[((y) * (tb)->tiles.w) + (x)])
+
+#ifdef RECTUPDATE
+#elif defined(EVAS_RECT_SPLIT)
+#else
+static int  tilebuf_x_intersect(Tilebuf *tb, int x, int w, int *x1, int *x2, int *x1_fill, int *x2_fill);
+static int  tilebuf_y_intersect(Tilebuf *tb, int y, int h, int *y1, int *y2, int *y1_fill, int *y2_fill);
+static int  tilebuf_intersect(int tsize, int tlen, int tnum, int x, int w, int *x1, int *x2, int *x1_fill, int *x2_fill);
+#endif
+static void tilebuf_setup(Tilebuf *tb);
+
+EAPI void
+evas_common_tilebuf_init(void)
+{
+}
+
+EAPI Tilebuf *
+evas_common_tilebuf_new(int w, int h)
+{
+   Tilebuf *tb;
+
+   tb = calloc(1, sizeof(Tilebuf));
+   if (!tb) return NULL;
+
+   tb->tile_size.w = 8;
+   tb->tile_size.h = 8;
+   tb->outbuf_w = w;
+   tb->outbuf_h = h;
+
+   return tb;
+}
+
+EAPI void
+evas_common_tilebuf_free(Tilebuf *tb)
+{
+#ifdef RECTUPDATE
+   evas_common_regionbuf_free(tb->rb);
+#elif defined(EVAS_RECT_SPLIT)
+   rect_list_clear(&tb->rects);
+   rect_list_node_pool_flush();
+#else
+   if (tb->tiles.tiles) free(tb->tiles.tiles);
+#endif
+   free(tb);
+}
+
+EAPI void
+evas_common_tilebuf_set_tile_size(Tilebuf *tb, int tw, int th)
+{
+   tb->tile_size.w = tw;
+   tb->tile_size.h = th;
+   tilebuf_setup(tb);
+}
+
+EAPI void
+evas_common_tilebuf_get_tile_size(Tilebuf *tb, int *tw, int *th)
+{
+   if (tw) *tw = tb->tile_size.w;
+   if (th) *th = tb->tile_size.h;
+}
+
+#ifdef EVAS_RECT_SPLIT
+static inline int
+_add_redraw(list_t *rects, int max_w, int max_h, int x, int y, int w, int h)
+{
+   rect_node_t *rn;
+
+   if ((w <= 0) || (h <= 0)) return 0;
+   RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, max_w, max_h);
+   if ((w <= 0) || (h <= 0)) return 0;
+
+   x >>= 1;
+   y >>= 1;
+   w += 2;
+   w >>= 1;
+   h += 2;
+   h >>= 1;
+
+   rn = (rect_node_t *)rect_list_node_pool_get();
+   rn->_lst = list_node_zeroed;
+   rect_init(&rn->rect, x, y, w, h);
+   //INF("ACCOUNTING: add_redraw: %4d,%4d %3dx%3d", x, y, w, h);
+   //testing on my core2 duo desktop - fuzz of 32 or 48 is best.
+#define FUZZ 32
+   rect_list_add_split_fuzzy_and_merge(rects, (list_node_t *)rn,
+                                       FUZZ * FUZZ, FUZZ * FUZZ);
+   return 1;
+}
+#endif
+
+EAPI int
+evas_common_tilebuf_add_redraw(Tilebuf *tb, int x, int y, int w, int h)
+{
+#ifdef RECTUPDATE
+   int i;
+
+   if ((w <= 0) || (h <= 0)) return 0;
+   RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, tb->outbuf_w, tb->outbuf_h);
+   if ((w <= 0) || (h <= 0)) return 0;
+   for (i = 0; i < h; i++)
+     evas_common_regionbuf_span_add(tb->rb, x, x + w - 1, y + i);
+   return 1;
+#elif defined(EVAS_RECT_SPLIT)
+   return _add_redraw(&tb->rects, tb->outbuf_w, tb->outbuf_h, x, y, w, h);
+#else
+   int tx1, tx2, ty1, ty2, tfx1, tfx2, tfy1, tfy2, xx, yy;
+   int num;
+
+   if ((w <= 0) || (h <= 0)) return 0;
+   RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, tb->outbuf_w, tb->outbuf_h);
+   if ((w <= 0) || (h <= 0)) return 0;
+   num = 0;
+   /* wipes out any motion vectors in tiles it touches into redraws */
+   if (tilebuf_x_intersect(tb, x, w, &tx1, &tx2, &tfx1, &tfx2) &&
+       tilebuf_y_intersect(tb, y, h, &ty1, &ty2, &tfy1, &tfy2))
+     {
+        Tilebuf_Tile    *tbt;
+        int             delta_x;
+        int             delta_y;
+
+        tbt = &(TILE(tb, tx1, ty1));
+        delta_x = tx2 - tx1 + 1;
+        delta_y = ty2 - ty1 + 1;
+       for (yy = delta_y; yy > 0; yy--)
+         {
+            Tilebuf_Tile *tbti;
+
+            tbti = tbt;
+            for (xx = delta_x; xx > 0; xx--)
+              {
+                 tbti->redraw = 1;
+                 tbti++;
+              }
+             tbt += tb->tiles.w;
+         }
+       num = (tx2 - tx1 + 1) * (ty2 - ty1 + 1);
+     }
+   return num;
+#endif
+}
+
+EAPI int
+evas_common_tilebuf_del_redraw(Tilebuf *tb, int x, int y, int w, int h)
+{
+#ifdef RECTUPDATE
+   int i;
+
+   for (i = 0; i < h; i++)
+     evas_common_regionbuf_span_del(tb->rb, x, x + w - 1, y + i);
+#elif defined(EVAS_RECT_SPLIT)
+   rect_t r;
+
+   if (!tb->rects.head) return 0;
+   if ((w <= 0) || (h <= 0)) return 0;
+   RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, tb->outbuf_w, tb->outbuf_h);
+   if ((w <= 0) || (h <= 0)) return 0;
+
+   x += 1;
+   y += 1;
+   x >>= 1;
+   y >>= 1;
+   w -= 1;
+   w >>= 1;
+   h -= 1;
+   h >>= 1;
+
+   if ((w <= 0) || (h <= 0)) return 0;
+
+   rect_init(&r, x, y, w, h);
+   //ERR("ACCOUNTING: del_redraw: %4d,%4d %3dx%3d", x, y, w, h);
+
+   rect_list_del_split_strict(&tb->rects, r);
+   tb->need_merge = 1;
+   return 0;
+#else
+   int tx1, tx2, ty1, ty2, tfx1, tfx2, tfy1, tfy2, xx, yy;
+   int num;
+
+   num = 0;
+   /* wipes out any motion vectors in tiles it touches into redraws */
+   if (tilebuf_x_intersect(tb, x, w, &tx1, &tx2, &tfx1, &tfx2) &&
+       tilebuf_y_intersect(tb, y, h, &ty1, &ty2, &tfy1, &tfy2))
+     {
+        Tilebuf_Tile    *tbt;
+        int             delta_y;
+        int             delta_x;
+
+        if (!tfx1) tx1++;
+       if (!tfx2) tx2--;
+       if (!tfy1) ty1++;
+       if (!tfy2) ty2--;
+
+        tbt = &(TILE(tb, tx1, ty1));
+        delta_x = tx2 - tx1 + 1;
+        delta_y = ty2 - ty1 + 1;
+       for (yy = delta_y; yy > 0; yy--)
+         {
+            Tilebuf_Tile       *tbti;
+
+            tbti = tbt;
+            for (xx = delta_x; xx > 0; xx--)
+              {
+                 tbti->redraw = 0;
+                 tbti++;
+              }
+             tbt += tb->tiles.w;
+         }
+       num = (tx2 - tx1 + 1) * (ty2 - ty1 + 1);
+     }
+   return num;
+#endif
+}
+
+EAPI int
+evas_common_tilebuf_add_motion_vector(Tilebuf *tb, int x, int y, int w, int h, int dx, int dy, int alpha __UNUSED__)
+{
+#ifdef EVAS_RECT_SPLIT
+   list_t lr = list_zeroed;
+   int num;
+
+   num = _add_redraw(&lr, tb->outbuf_w, tb->outbuf_h, x, y, w, h);
+   num += _add_redraw(&lr, tb->outbuf_w, tb->outbuf_h, x + dx, y + dy, w, h);
+   while (lr.head != NULL)
+     {
+        list_node_t *node = rect_list_unlink_next(&lr, NULL);
+        rect_list_add_split_fuzzy_and_merge(&tb->rects, node,
+                                            FUZZ * FUZZ, FUZZ * FUZZ);
+     }
+   return num;
+#else
+   /* FIXME: need to actually impliment motion vectors. for now it just */
+   /*        implements redraws */
+   int num;
+
+   num = evas_common_tilebuf_add_redraw(tb, x, y, w, h);
+   num += evas_common_tilebuf_add_redraw(tb, x + dx, y + dy, w, h);
+   return num;
+#endif
+}
+
+EAPI void
+evas_common_tilebuf_clear(Tilebuf *tb)
+{
+#ifdef RECTUPDATE
+   evas_common_regionbuf_clear(tb->rb);
+#elif defined(EVAS_RECT_SPLIT)
+   rect_list_clear(&tb->rects);
+   tb->need_merge = 0;
+#else
+   if (!tb->tiles.tiles) return;
+   memset(tb->tiles.tiles, 0, tb->tiles.w * tb->tiles.h * sizeof(Tilebuf_Tile));
+#endif
+}
+
+EAPI Tilebuf_Rect *
+evas_common_tilebuf_get_render_rects(Tilebuf *tb)
+{
+#ifdef RECTUPDATE
+   return evas_common_regionbuf_rects_get(tb->rb);
+#elif defined(EVAS_RECT_SPLIT)
+   list_node_t *n;
+   Tilebuf_Rect *rects = NULL;
+
+   if (tb->need_merge) {
+       list_t to_merge;
+       to_merge = tb->rects;
+       tb->rects = list_zeroed;
+       rect_list_merge_rects(&tb->rects, &to_merge, FUZZ * FUZZ);
+       tb->need_merge = 0;
+   }
+
+   for (n = tb->rects.head; n != NULL; n = n->next) {
+       rect_t cur;
+
+       cur = ((rect_node_t *)n)->rect;
+
+       cur.left <<= 1;
+       cur.top <<= 1;
+       cur.width <<= 1;
+       cur.height <<= 1;
+
+       RECTS_CLIP_TO_RECT(cur.left, cur.top, cur.width, cur.height,
+                         0, 0, tb->outbuf_w, tb->outbuf_h);
+       if ((cur.width > 0) && (cur.height > 0))
+        {
+           Tilebuf_Rect *r;
+
+           r = malloc(sizeof(Tilebuf_Rect));
+           r->x = cur.left;
+           r->y = cur.top;
+           r->w = cur.width;
+           r->h = cur.height;
+
+           rects = (Tilebuf_Rect *)eina_inlist_append(EINA_INLIST_GET(rects), EINA_INLIST_GET(r));
+        }
+   }
+   return rects;
+
+#else
+   Tilebuf_Rect *rects = NULL;
+   Tilebuf_Tile *tbt;
+   int x, y;
+
+   tbt = &(TILE(tb, 0, 0));
+   for (y = 0; y < tb->tiles.h; y++)
+     {
+       for (x = 0; x < tb->tiles.w; x++, tbt++)
+         {
+            if (tbt->redraw)
+              {
+                  Tilebuf_Tile *tbti;
+                 int can_expand_x = 1, can_expand_y = 1;
+                 Tilebuf_Rect *r = NULL;
+                 int xx = 0, yy = 0;
+                 r = malloc(sizeof(Tilebuf_Rect));
+                  r->_list_data.next = NULL;
+                  r->_list_data.prev = NULL;
+                  r->_list_data.last = NULL;
+
+/* amalgamate tiles */
+#if 1
+                  tbti = tbt;
+                 while (can_expand_x)
+                   {
+                       tbti++;
+                      xx++;
+                      if ((x + xx) >= tb->tiles.w)
+                        can_expand_x = 0;
+                      else if (!(tbti->redraw))
+                        can_expand_x = 0;
+                      if (can_expand_x)
+                        tbti->redraw = 0;
+                   }
+                  tbti = tbt;
+                 while (can_expand_y)
+                   {
+                      int i;
+
+                       tbti += tb->tiles.w;
+                      yy++;
+                      if ((y + yy) >= tb->tiles.h)
+                        can_expand_y = 0;
+                      if (can_expand_y)
+                        {
+                            Tilebuf_Tile *tbtj;
+
+                            tbtj = tbti;
+                           for (i = x; i < x + xx; i++, tbtj++)
+                             {
+                                if (!(tbtj->redraw))
+                                  {
+                                     can_expand_y = 0;
+                                     break;
+                                  }
+                             }
+                        }
+                      if (can_expand_y)
+                        {
+                            Tilebuf_Tile *tbtj;
+
+                            tbtj = tbti;
+                           for (i = x; i < x + xx; i++, tbtj++)
+                             tbtj->redraw = 0;
+                        }
+                   }
+                 tbt->redraw = 0;
+#else
+                 xx = 1;
+                 yy = 1;
+#endif
+                 r->x = x * tb->tile_size.w;
+                 r->y = y * tb->tile_size.h;
+                 r->w = (xx) * tb->tile_size.w;
+                 r->h = (yy) * tb->tile_size.h;
+                 rects = eina_inlist_append(rects, r);
+                 x = x + (xx - 1);
+                  tbt += xx - 1;
+              }
+         }
+     }
+   return rects;
+#endif
+}
+
+EAPI void
+evas_common_tilebuf_free_render_rects(Tilebuf_Rect *rects)
+{
+   while (rects)
+     {
+       Tilebuf_Rect *r;
+
+       r = rects;
+       rects = (Tilebuf_Rect *)eina_inlist_remove(EINA_INLIST_GET(rects), EINA_INLIST_GET(r));
+       free(r);
+     }
+}
+
+/* need a way of getting rectangles to: blit, re-render */
+
+
+
+
+
+/* internal usage */
+
+static void
+tilebuf_setup(Tilebuf *tb)
+{
+   if ((tb->outbuf_w <= 0) || (tb->outbuf_h <= 0)) return;
+#ifdef RECTUPDATE
+   tb->rb = evas_common_regionbuf_new(tb->outbuf_w, tb->outbuf_h);
+#elif defined(EVAS_RECT_SPLIT)
+   tb->rects = list_zeroed;
+#else
+   if (tb->tiles.tiles) free(tb->tiles.tiles);
+   tb->tiles.tiles = NULL;
+
+   tb->tiles.w = (tb->outbuf_w + (tb->tile_size.w - 1)) / tb->tile_size.w;
+   tb->tiles.h = (tb->outbuf_h + (tb->tile_size.h - 1)) / tb->tile_size.h;
+
+   tb->tiles.tiles = malloc(tb->tiles.w * tb->tiles.h * sizeof(Tilebuf_Tile));
+
+   if (!tb->tiles.tiles)
+     {
+       tb->tiles.w = 0;
+       tb->tiles.h = 0;
+       return;
+     }
+   memset(tb->tiles.tiles, 0, tb->tiles.w * tb->tiles.h * sizeof(Tilebuf_Tile));
+#endif
+}
+
+#ifdef RECTUPDATE
+#elif defined(EVAS_RECT_SPLIT)
+#else
+static int
+tilebuf_x_intersect(Tilebuf *tb, int x, int w, int *x1, int *x2, int *x1_fill, int *x2_fill)
+{
+   return tilebuf_intersect(tb->tile_size.w, tb->outbuf_w, tb->tiles.w,
+                           x, w, x1, x2, x1_fill, x2_fill);
+}
+
+static int
+tilebuf_y_intersect(Tilebuf *tb, int y, int h, int *y1, int *y2, int *y1_fill, int *y2_fill)
+{
+   return tilebuf_intersect(tb->tile_size.h, tb->outbuf_h, tb->tiles.h,
+                           y, h, y1, y2, y1_fill, y2_fill);
+}
+
+static int
+tilebuf_intersect(int tsize, int tlen, int tnum, int x, int w, int *x1, int *x2, int *x1_fill, int *x2_fill)
+{
+   int p1, p2;
+
+   /* initial clip out of region */
+   if ((x + w) <= 0) return 0;
+   if (x >= tlen) return 0;
+
+   /* adjust x & w so it all fits in region */
+   if (x < 0)
+     {
+       w += x;
+       x = 0;
+     }
+   if (w < 0) return 0;
+   if ((x + w) > tlen) w = tlen - x;
+
+   /* now figure if the first edge is fully filling its tile */
+   p1 = (x) / tsize;
+   if ((p1 * tsize) == (x)) *x1_fill = 1;
+   else                     *x1_fill = 0;
+   *x1 = p1;
+
+   /* now figure if the last edge is fully filling its tile */
+   p2 = (x + w - 1) / tsize;
+   if (((p2 + 1) * tsize) == (x + w)) *x2_fill = 1;
+   else                               *x2_fill = 0;
+   *x2 = p2;
+
+   return 1;
+   tnum = 0;
+}
+#endif
diff --git a/src/lib/engines/common_16/.cvsignore b/src/lib/engines/common_16/.cvsignore
new file mode 100644 (file)
index 0000000..093d74e
--- /dev/null
@@ -0,0 +1,6 @@
+Makefile.in
+Makefile
+.deps
+.libs
+libevas_engine_common_16.la
+*.lo
diff --git a/src/lib/engines/common_16/Makefile.am b/src/lib/engines/common_16/Makefile.am
new file mode 100644 (file)
index 0000000..c7579fc
--- /dev/null
@@ -0,0 +1,31 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@VALGRIND_CFLAGS@ \
+@EINA_CFLAGS@ \
+@EET_CFLAGS@ \
+@pthread_cflags@
+
+noinst_LTLIBRARIES = libevas_engine_common_16.la
+
+libevas_engine_common_16_la_SOURCES = \
+evas_soft16_dither_mask.c \
+evas_soft16_font.c \
+evas_soft16_image_scaled_sampled.c \
+evas_soft16_image_unscaled.c \
+evas_soft16_main.c \
+evas_soft16_rectangle.c \
+evas_soft16_line.c \
+evas_soft16_polygon.c
+
+libevas_engine_common_16_la_DEPENDENCIES = $(top_builddir)/config.h
+
+EXTRA_DIST = \
+evas_soft16_point_blend.c \
+evas_soft16_scanline_blend.c \
+evas_soft16_scanline_fill.c
diff --git a/src/lib/engines/common_16/evas_soft16_dither_mask.c b/src/lib/engines/common_16/evas_soft16_dither_mask.c
new file mode 100644 (file)
index 0000000..48ed574
--- /dev/null
@@ -0,0 +1,293 @@
+#include "evas_common_soft16.h"
+
+#define S16_DM_SIZE      128
+#define S16_DM_BITS      6
+#define S16_DM_DIV       64
+#define S16_DM_MSK       (S16_DM_SIZE - 1)
+#define S16_DM_SHF(_b)   (S16_DM_BITS - (8 - _b))
+
+static const DATA8 dither_table[S16_DM_SIZE][S16_DM_SIZE] =
+{
+     { 0, 41, 23, 5, 17, 39, 7, 15, 62, 23, 40, 51, 31, 47, 9, 32, 52, 27, 57, 25, 6, 61, 27, 52, 37, 7, 40, 63, 18, 36, 10, 42, 25, 62, 45, 34, 20, 42, 37, 14, 35, 29, 50, 10, 61, 2, 40, 8, 37, 12, 58, 22, 5, 41, 10, 39, 0, 60, 11, 46, 2, 55, 38, 17, 36, 59, 13, 54, 37, 56, 8, 29, 16, 13, 63, 22, 41, 55, 7, 20, 49, 14, 23, 55, 37, 23, 19, 36, 15, 49, 23, 63, 30, 14, 38, 27, 53, 13, 22, 41, 19, 31, 7, 19, 50, 30, 49, 16, 3, 32, 56, 40, 29, 34, 8, 48, 19, 45, 4, 51, 12, 46, 35, 49, 16, 42, 12, 62 },
+     { 30, 57, 36, 54, 47, 34, 52, 27, 43, 4, 28, 7, 17, 36, 62, 13, 44, 7, 18, 48, 33, 21, 44, 14, 30, 47, 12, 33, 5, 55, 31, 58, 13, 30, 4, 17, 52, 10, 60, 26, 46, 0, 39, 27, 42, 22, 47, 25, 60, 32, 9, 38, 48, 17, 59, 30, 49, 18, 34, 25, 51, 19, 5, 48, 21, 8, 28, 46, 1, 32, 41, 19, 54, 47, 37, 18, 28, 11, 44, 30, 39, 56, 2, 33, 8, 42, 61, 28, 58, 8, 46, 9, 41, 4, 58, 7, 21, 48, 59, 10, 52, 14, 42, 57, 12, 25, 7, 53, 42, 24, 11, 50, 17, 59, 42, 2, 36, 60, 32, 17, 63, 29, 21, 7, 59, 32, 24, 39 },
+     { 22, 8, 16, 32, 3, 25, 13, 57, 18, 45, 58, 39, 55, 20, 5, 42, 23, 34, 63, 1, 51, 10, 58, 4, 60, 23, 53, 27, 44, 21, 3, 48, 8, 50, 43, 54, 27, 32, 5, 55, 21, 58, 12, 53, 6, 36, 14, 50, 17, 29, 53, 15, 24, 52, 7, 36, 13, 42, 4, 53, 9, 35, 61, 26, 56, 32, 49, 15, 62, 23, 6, 60, 2, 31, 4, 48, 58, 38, 15, 61, 5, 25, 47, 28, 50, 15, 7, 40, 3, 32, 33, 52, 25, 50, 35, 42, 61, 3, 28, 36, 23, 63, 4, 33, 46, 62, 36, 23, 60, 6, 54, 28, 4, 37, 23, 55, 25, 8, 42, 54, 14, 6, 56, 38, 19, 52, 4, 46 },
+     { 48, 53, 43, 12, 45, 63, 30, 37, 9, 34, 21, 1, 25, 47, 29, 58, 3, 54, 15, 39, 29, 17, 38, 35, 20, 43, 1, 49, 15, 59, 29, 39, 22, 35, 16, 23, 1, 47, 39, 18, 8, 44, 25, 31, 57, 19, 63, 4, 45, 3, 42, 61, 1, 31, 45, 20, 57, 29, 62, 21, 32, 41, 14, 44, 3, 39, 5, 34, 10, 43, 51, 35, 23, 52, 40, 10, 21, 1, 53, 18, 51, 43, 12, 62, 18, 54, 26, 51, 20, 57, 14, 1, 62, 16, 11, 18, 32, 39, 17, 44, 1, 48, 26, 37, 18, 2, 51, 14, 28, 45, 35, 18, 57, 13, 47, 11, 51, 20, 2, 39, 31, 47, 25, 1, 50, 11, 60, 7 },
+     { 18, 28, 1, 56, 21, 10, 51, 2, 46, 54, 14, 61, 11, 50, 13, 38, 19, 31, 45, 9, 55, 24, 47, 5, 54, 9, 62, 11, 35, 8, 51, 14, 57, 6, 63, 40, 58, 14, 51, 28, 62, 34, 15, 48, 1, 41, 30, 35, 55, 21, 34, 11, 49, 37, 8, 52, 4, 23, 15, 43, 1, 58, 11, 23, 53, 16, 55, 26, 58, 18, 27, 12, 45, 14, 25, 63, 42, 33, 27, 35, 9, 31, 21, 38, 1, 44, 34, 12, 48, 38, 21, 44, 29, 47, 26, 53, 1, 46, 54, 8, 59, 29, 11, 55, 22, 41, 33, 20, 39, 1, 48, 9, 44, 32, 5, 62, 29, 44, 57, 23, 10, 58, 34, 43, 15, 37, 26, 33 },
+     { 51, 38, 59, 24, 35, 42, 19, 60, 5, 32, 41, 26, 43, 33, 7, 53, 48, 11, 59, 23, 42, 2, 61, 30, 16, 40, 32, 24, 56, 41, 19, 33, 37, 26, 47, 9, 31, 22, 2, 45, 9, 54, 4, 37, 21, 52, 11, 23, 7, 57, 16, 25, 55, 18, 63, 27, 46, 39, 56, 10, 50, 37, 29, 47, 19, 63, 24, 9, 46, 2, 39, 60, 9, 57, 30, 7, 49, 11, 59, 3, 45, 57, 5, 60, 29, 22, 5, 60, 30, 9, 59, 18, 40, 6, 57, 36, 30, 12, 24, 34, 15, 40, 52, 6, 49, 9, 58, 4, 63, 12, 26, 61, 22, 53, 38, 16, 35, 14, 28, 50, 42, 17, 5, 28, 62, 20, 54, 12 },
+     { 26, 6, 31, 15, 49, 6, 38, 27, 22, 49, 16, 56, 2, 62, 30, 21, 0, 36, 28, 6, 49, 32, 13, 52, 26, 50, 19, 46, 3, 26, 62, 0, 53, 12, 29, 3, 53, 41, 60, 24, 38, 13, 58, 16, 43, 9, 59, 39, 46, 28, 44, 40, 2, 33, 13, 41, 16, 6, 47, 31, 26, 17, 57, 6, 38, 0, 42, 36, 29, 52, 20, 31, 48, 0, 34, 56, 20, 36, 23, 54, 14, 41, 24, 37, 10, 55, 46, 25, 16, 45, 36, 4, 55, 23, 15, 8, 50, 62, 5, 56, 44, 20, 13, 28, 59, 31, 24, 47, 31, 52, 37, 17, 40, 0, 26, 49, 3, 60, 7, 33, 0, 61, 53, 40, 8, 45, 2, 41 },
+     { 16, 63, 43, 4, 61, 24, 56, 13, 53, 8, 36, 12, 24, 41, 16, 46, 60, 26, 52, 39, 14, 57, 21, 37, 0, 45, 7, 59, 38, 17, 43, 10, 45, 20, 61, 43, 19, 11, 33, 17, 50, 32, 23, 61, 28, 49, 26, 0, 18, 51, 5, 60, 22, 58, 29, 0, 59, 34, 19, 62, 3, 52, 7, 44, 30, 59, 13, 50, 15, 62, 7, 17, 38, 22, 44, 15, 40, 4, 47, 28, 33, 17, 49, 16, 51, 40, 10, 56, 0, 53, 13, 49, 28, 38, 60, 21, 43, 19, 37, 27, 3, 51, 34, 39, 0, 45, 15, 43, 10, 21, 3, 55, 8, 33, 59, 10, 41, 18, 52, 24, 46, 20, 30, 13, 58, 22, 36, 57 },
+     { 50, 34, 11, 47, 29, 17, 44, 0, 33, 63, 28, 46, 52, 5, 57, 10, 42, 18, 4, 63, 20, 8, 44, 10, 56, 34, 14, 29, 5, 54, 23, 59, 32, 49, 7, 34, 49, 27, 56, 0, 42, 7, 46, 3, 40, 6, 54, 32, 62, 13, 36, 10, 47, 8, 35, 49, 24, 51, 12, 40, 22, 35, 60, 12, 22, 51, 33, 4, 40, 25, 43, 55, 5, 54, 12, 61, 26, 51, 8, 62, 0, 53, 7, 63, 2, 32, 19, 34, 42, 24, 31, 63, 2, 10, 45, 33, 0, 48, 9, 61, 22, 47, 8, 62, 18, 56, 7, 54, 27, 57, 46, 30, 50, 19, 45, 30, 56, 36, 22, 47, 11, 38, 3, 51, 32, 48, 18, 9 },
+     { 0, 21, 40, 19, 52, 9, 37, 48, 20, 40, 3, 18, 27, 38, 35, 22, 31, 56, 13, 35, 46, 28, 60, 40, 27, 18, 61, 50, 41, 30, 7, 36, 2, 25, 16, 57, 5, 15, 47, 29, 55, 19, 30, 52, 15, 34, 20, 12, 43, 30, 20, 54, 25, 44, 53, 12, 38, 5, 55, 27, 48, 15, 33, 27, 45, 8, 19, 28, 56, 11, 33, 49, 18, 36, 29, 2, 45, 16, 39, 19, 31, 43, 27, 35, 20, 52, 26, 6, 61, 11, 41, 17, 29, 51, 20, 56, 25, 32, 41, 17, 53, 31, 25, 14, 42, 23, 35, 16, 38, 6, 34, 12, 15, 62, 6, 21, 13, 1, 63, 9, 55, 27, 43, 25, 14, 4, 31, 55 },
+     { 44, 29, 61, 2, 35, 58, 26, 15, 60, 10, 51, 59, 14, 55, 8, 50, 2, 44, 25, 51, 1, 33, 16, 4, 48, 36, 2, 21, 12, 57, 48, 13, 51, 55, 40, 28, 37, 62, 8, 39, 12, 63, 36, 10, 59, 24, 56, 47, 9, 50, 41, 1, 32, 17, 6, 21, 61, 30, 9, 43, 1, 54, 41, 2, 54, 37, 48, 61, 1, 46, 21, 3, 58, 24, 50, 32, 60, 10, 57, 25, 46, 12, 59, 4, 45, 13, 57, 47, 27, 39, 5, 58, 47, 14, 35, 4, 52, 13, 60, 6, 36, 10, 45, 55, 4, 50, 29, 2, 61, 50, 25, 58, 44, 24, 36, 42, 54, 28, 40, 32, 16, 56, 6, 62, 46, 39, 60, 23 },
+     { 7, 48, 14, 54, 23, 40, 4, 45, 30, 22, 42, 32, 1, 44, 20, 29, 58, 8, 37, 19, 41, 54, 24, 58, 9, 53, 25, 46, 34, 16, 23, 38, 27, 11, 18, 1, 52, 21, 35, 22, 48, 5, 25, 45, 18, 38, 2, 27, 35, 4, 57, 15, 62, 39, 57, 28, 42, 16, 36, 60, 24, 18, 10, 63, 20, 5, 16, 23, 37, 14, 59, 27, 41, 8, 13, 42, 21, 35, 6, 50, 3, 38, 15, 48, 30, 39, 17, 3, 49, 14, 53, 33, 24, 7, 61, 44, 11, 39, 23, 49, 19, 58, 1, 32, 36, 12, 60, 41, 20, 13, 41, 4, 39, 1, 48, 8, 18, 51, 14, 44, 5, 37, 21, 34, 1, 26, 10, 37 },
+     { 53, 36, 27, 9, 50, 12, 32, 55, 2, 57, 7, 17, 48, 34, 63, 15, 40, 26, 62, 11, 49, 6, 31, 39, 22, 42, 6, 63, 1, 39, 60, 4, 42, 61, 32, 45, 24, 44, 2, 60, 16, 41, 53, 1, 33, 61, 49, 17, 63, 23, 45, 26, 33, 3, 23, 46, 2, 50, 20, 4, 45, 34, 49, 30, 39, 58, 44, 31, 53, 34, 6, 52, 30, 47, 63, 1, 53, 22, 42, 31, 58, 23, 54, 22, 61, 8, 36, 59, 22, 35, 21, 1, 55, 40, 27, 16, 30, 54, 2, 29, 43, 16, 39, 63, 21, 46, 26, 10, 48, 32, 19, 53, 30, 56, 26, 60, 33, 4, 61, 23, 49, 59, 15, 53, 19, 58, 42, 16 },
+     { 20, 5, 59, 46, 25, 62, 7, 19, 43, 25, 37, 61, 11, 24, 4, 54, 12, 52, 3, 32, 17, 61, 12, 47, 15, 55, 18, 31, 53, 28, 9, 50, 21, 6, 55, 9, 58, 14, 54, 26, 33, 7, 31, 58, 13, 21, 8, 42, 29, 6, 37, 11, 48, 52, 14, 60, 11, 39, 56, 32, 14, 58, 7, 26, 17, 4, 42, 8, 11, 47, 19, 38, 10, 17, 26, 37, 9, 55, 28, 13, 18, 40, 6, 33, 1, 43, 25, 11, 51, 7, 62, 43, 18, 37, 3, 57, 45, 9, 38, 58, 5, 52, 27, 7, 17, 53, 5, 57, 37, 2, 63, 9, 22, 15, 11, 38, 25, 45, 35, 0, 28, 10, 41, 30, 50, 8, 31, 57 },
+     { 49, 33, 16, 38, 1, 42, 51, 34, 53, 14, 28, 49, 30, 56, 36, 23, 43, 20, 38, 56, 22, 45, 28, 0, 62, 35, 26, 44, 11, 19, 52, 35, 44, 15, 30, 38, 10, 31, 40, 4, 46, 50, 20, 40, 27, 44, 51, 14, 56, 53, 19, 59, 7, 29, 41, 19, 35, 25, 8, 52, 22, 44, 13, 53, 50, 32, 61, 24, 56, 25, 63, 0, 45, 57, 33, 59, 16, 46, 4, 62, 50, 11, 60, 37, 52, 19, 55, 29, 37, 46, 13, 26, 48, 10, 50, 34, 21, 63, 26, 13, 42, 33, 22, 55, 35, 28, 43, 15, 24, 51, 27, 34, 46, 49, 58, 3, 52, 9, 57, 19, 48, 55, 3, 35, 12, 45, 24, 3 },
+     { 41, 11, 56, 28, 18, 31, 22, 10, 37, 6, 47, 13, 3, 41, 9, 46, 0, 48, 29, 6, 34, 10, 55, 37, 20, 8, 49, 3, 41, 59, 14, 25, 0, 63, 19, 47, 27, 51, 17, 57, 23, 10, 61, 6, 54, 3, 38, 31, 0, 22, 34, 43, 20, 55, 31, 0, 49, 63, 29, 38, 3, 62, 28, 40, 0, 22, 14, 35, 2, 48, 15, 43, 23, 14, 3, 29, 49, 20, 39, 34, 0, 44, 29, 9, 15, 47, 5, 42, 0, 31, 58, 5, 31, 61, 23, 15, 0, 47, 19, 50, 24, 3, 59, 11, 44, 0, 31, 59, 6, 42, 17, 60, 0, 39, 20, 31, 43, 17, 29, 40, 12, 25, 60, 22, 52, 15, 63, 29 },
+     { 20, 52, 8, 44, 62, 4, 59, 49, 17, 63, 21, 39, 60, 18, 52, 27, 33, 59, 14, 51, 59, 43, 24, 5, 51, 30, 57, 17, 32, 5, 37, 56, 48, 34, 42, 3, 60, 5, 36, 13, 43, 37, 18, 34, 25, 12, 59, 24, 47, 36, 11, 50, 3, 38, 9, 58, 16, 5, 43, 18, 47, 10, 37, 18, 59, 46, 29, 52, 40, 12, 34, 28, 56, 36, 53, 7, 43, 8, 24, 52, 26, 17, 56, 43, 24, 32, 63, 20, 57, 16, 22, 52, 36, 8, 41, 56, 29, 32, 54, 7, 35, 57, 14, 48, 20, 62, 13, 39, 53, 29, 8, 45, 13, 29, 7, 61, 14, 54, 6, 63, 38, 32, 18, 43, 2, 39, 6, 47 },
+     { 0, 58, 23, 35, 13, 46, 12, 39, 0, 31, 55, 24, 5, 35, 15, 61, 17, 5, 39, 25, 18, 2, 50, 33, 41, 13, 39, 23, 62, 46, 29, 12, 22, 8, 56, 25, 20, 49, 32, 62, 0, 56, 11, 46, 63, 42, 9, 16, 55, 5, 60, 15, 62, 26, 45, 21, 36, 51, 13, 57, 31, 24, 55, 6, 35, 9, 57, 5, 20, 60, 7, 51, 5, 19, 40, 25, 61, 32, 56, 12, 36, 48, 21, 2, 58, 12, 39, 28, 9, 50, 40, 12, 44, 18, 25, 49, 6, 38, 11, 62, 18, 46, 30, 9, 40, 25, 49, 19, 10, 36, 55, 22, 33, 52, 41, 18, 37, 27, 49, 21, 2, 46, 7, 53, 33, 61, 27, 35 },
+     { 41, 31, 5, 39, 51, 26, 33, 57, 27, 41, 9, 44, 54, 29, 48, 7, 44, 36, 57, 10, 31, 63, 16, 45, 11, 60, 1, 47, 7, 20, 43, 3, 58, 36, 13, 52, 39, 7, 15, 28, 22, 48, 30, 21, 1, 29, 49, 44, 27, 17, 40, 30, 24, 42, 12, 53, 33, 7, 47, 20, 1, 42, 11, 49, 25, 43, 17, 32, 45, 27, 41, 21, 31, 62, 11, 49, 2, 15, 42, 5, 63, 7, 41, 27, 49, 6, 54, 23, 46, 34, 2, 28, 54, 3, 59, 12, 46, 17, 42, 28, 40, 1, 37, 51, 5, 55, 2, 34, 47, 16, 3, 62, 47, 5, 23, 56, 1, 44, 12, 34, 51, 16, 57, 11, 25, 17, 54, 13 },
+     { 60, 26, 55, 18, 3, 60, 20, 6, 52, 15, 50, 19, 32, 11, 23, 53, 26, 21, 1, 47, 42, 27, 8, 58, 21, 27, 53, 36, 26, 54, 31, 50, 17, 30, 45, 1, 29, 59, 44, 53, 41, 4, 35, 58, 51, 19, 32, 4, 52, 34, 48, 8, 51, 5, 56, 2, 25, 61, 27, 38, 54, 27, 62, 21, 51, 1, 39, 62, 10, 50, 1, 58, 13, 47, 38, 18, 35, 54, 22, 51, 30, 19, 59, 34, 14, 32, 44, 4, 60, 15, 52, 62, 20, 43, 30, 35, 21, 60, 4, 52, 12, 24, 61, 18, 30, 42, 23, 61, 25, 50, 27, 38, 11, 59, 12, 35, 50, 30, 59, 24, 8, 42, 28, 37, 48, 9, 44, 21 },
+     { 10, 47, 15, 50, 30, 43, 8, 45, 29, 2, 36, 59, 1, 58, 41, 3, 63, 31, 54, 20, 13, 55, 35, 38, 4, 44, 15, 9, 61, 2, 14, 38, 61, 10, 23, 54, 18, 12, 24, 2, 14, 55, 16, 8, 38, 14, 41, 60, 10, 23, 1, 58, 32, 17, 28, 37, 41, 15, 3, 60, 15, 33, 4, 36, 16, 59, 28, 14, 23, 55, 37, 18, 44, 28, 2, 57, 30, 10, 27, 46, 14, 38, 3, 53, 21, 61, 17, 35, 10, 41, 26, 7, 33, 9, 57, 1, 53, 37, 26, 20, 56, 48, 9, 33, 58, 16, 37, 7, 45, 1, 57, 15, 32, 26, 42, 23, 7, 20, 4, 54, 31, 62, 22, 1, 59, 30, 4, 51 },
+     { 36, 2, 38, 11, 24, 36, 54, 22, 62, 47, 25, 8, 28, 45, 16, 38, 12, 43, 9, 37, 49, 3, 23, 52, 18, 30, 50, 33, 19, 42, 49, 26, 6, 40, 47, 35, 63, 38, 50, 33, 60, 26, 36, 47, 24, 57, 6, 26, 39, 63, 19, 44, 14, 46, 61, 9, 50, 30, 45, 23, 10, 50, 44, 8, 31, 54, 6, 46, 36, 4, 30, 54, 8, 52, 22, 41, 4, 60, 40, 0, 58, 24, 45, 10, 37, 1, 48, 30, 56, 17, 38, 48, 24, 47, 19, 39, 14, 8, 45, 32, 2, 34, 27, 44, 4, 52, 11, 56, 31, 21, 40, 19, 44, 51, 2, 63, 46, 58, 36, 43, 14, 5, 50, 38, 14, 56, 40, 23 },
+     { 61, 46, 32, 63, 54, 1, 14, 34, 12, 40, 18, 49, 37, 10, 61, 30, 51, 24, 60, 7, 29, 40, 62, 11, 46, 58, 6, 56, 24, 10, 34, 52, 21, 59, 16, 3, 27, 5, 20, 46, 9, 40, 7, 62, 2, 30, 53, 15, 48, 10, 28, 35, 54, 6, 21, 34, 18, 55, 7, 40, 57, 19, 26, 60, 41, 13, 24, 51, 19, 61, 9, 25, 34, 15, 63, 11, 45, 17, 20, 47, 33, 8, 31, 62, 43, 26, 53, 7, 24, 59, 0, 13, 55, 4, 62, 27, 51, 31, 63, 15, 58, 7, 54, 14, 46, 22, 28, 43, 12, 63, 8, 54, 5, 17, 39, 33, 15, 10, 27, 17, 47, 34, 19, 45, 27, 12, 33, 17 },
+     { 5, 28, 21, 7, 17, 48, 42, 58, 23, 4, 63, 14, 55, 21, 34, 5, 19, 0, 45, 17, 52, 15, 25, 32, 0, 22, 40, 13, 45, 62, 18, 0, 43, 11, 33, 55, 30, 42, 57, 19, 51, 31, 22, 43, 18, 45, 34, 0, 43, 31, 56, 3, 23, 40, 59, 0, 44, 13, 48, 35, 2, 32, 46, 0, 21, 48, 35, 3, 40, 32, 43, 59, 0, 48, 33, 26, 53, 36, 55, 12, 51, 16, 55, 5, 18, 29, 11, 39, 51, 19, 45, 31, 42, 21, 35, 6, 22, 47, 10, 38, 23, 50, 20, 36, 0, 60, 38, 4, 50, 35, 48, 34, 24, 57, 9, 53, 28, 48, 61, 0, 56, 24, 53, 3, 63, 6, 42, 57 },
+     { 13, 53, 45, 40, 58, 27, 6, 16, 38, 51, 33, 30, 43, 2, 47, 56, 40, 50, 33, 57, 27, 5, 47, 42, 60, 36, 16, 54, 28, 4, 37, 57, 28, 51, 22, 8, 45, 14, 6, 39, 0, 54, 11, 59, 28, 12, 50, 21, 61, 13, 19, 38, 49, 11, 25, 37, 58, 29, 22, 63, 14, 56, 12, 53, 30, 63, 9, 57, 26, 12, 47, 16, 23, 39, 50, 6, 31, 2, 25, 6, 28, 41, 36, 22, 50, 57, 42, 3, 34, 8, 28, 61, 11, 50, 16, 54, 41, 0, 55, 43, 5, 29, 41, 63, 25, 16, 53, 18, 26, 10, 21, 0, 61, 30, 41, 22, 3, 38, 20, 39, 29, 8, 41, 16, 36, 52, 22, 19 },
+     { 55, 34, 0, 25, 10, 32, 56, 44, 28, 0, 57, 7, 26, 53, 23, 8, 13, 35, 22, 12, 36, 60, 20, 8, 14, 29, 48, 2, 41, 49, 23, 13, 39, 7, 48, 58, 25, 53, 34, 62, 28, 16, 48, 4, 37, 56, 27, 5, 36, 52, 46, 7, 62, 33, 52, 11, 17, 53, 5, 28, 41, 24, 38, 17, 5, 39, 20, 45, 15, 56, 5, 38, 60, 8, 14, 57, 21, 48, 62, 39, 59, 13, 1, 60, 9, 32, 16, 63, 44, 25, 52, 15, 36, 2, 60, 29, 12, 33, 25, 17, 59, 45, 13, 8, 49, 32, 6, 40, 59, 29, 45, 37, 13, 47, 6, 55, 30, 45, 9, 52, 13, 59, 25, 47, 32, 1, 49, 30 },
+     { 9, 39, 14, 61, 49, 37, 3, 20, 50, 13, 41, 19, 46, 17, 38, 59, 28, 62, 4, 44, 54, 1, 34, 51, 55, 7, 63, 32, 21, 8, 56, 31, 62, 19, 36, 1, 41, 17, 24, 12, 42, 35, 25, 52, 20, 8, 44, 59, 25, 2, 22, 42, 16, 29, 4, 46, 20, 36, 43, 9, 51, 8, 49, 26, 58, 33, 54, 1, 37, 29, 52, 20, 27, 45, 19, 35, 42, 16, 10, 32, 20, 49, 46, 27, 40, 4, 47, 22, 13, 55, 4, 47, 26, 44, 23, 40, 58, 19, 48, 13, 31, 2, 57, 34, 42, 19, 61, 32, 14, 55, 5, 51, 26, 19, 58, 16, 49, 14, 62, 5, 33, 44, 21, 7, 60, 26, 11, 41 },
+     { 62, 24, 47, 29, 8, 19, 53, 11, 60, 24, 32, 61, 4, 55, 31, 2, 49, 16, 39, 9, 31, 24, 43, 17, 26, 38, 11, 25, 58, 43, 12, 35, 3, 46, 15, 32, 63, 4, 49, 56, 2, 60, 10, 32, 63, 17, 39, 12, 55, 30, 57, 9, 48, 55, 39, 24, 60, 2, 58, 31, 19, 61, 34, 3, 42, 11, 22, 46, 7, 61, 10, 42, 3, 55, 32, 1, 58, 28, 44, 54, 4, 34, 23, 15, 56, 20, 37, 58, 6, 30, 38, 18, 63, 9, 32, 5, 51, 3, 62, 37, 52, 18, 39, 23, 3, 51, 9, 47, 1, 23, 43, 15, 60, 35, 11, 40, 1, 36, 31, 26, 57, 2, 37, 54, 18, 44, 58, 16 },
+     { 5, 51, 3, 33, 43, 62, 21, 42, 35, 9, 48, 15, 36, 10, 22, 42, 20, 46, 26, 56, 50, 12, 59, 3, 48, 19, 45, 53, 1, 27, 47, 17, 52, 24, 56, 11, 51, 21, 37, 30, 20, 46, 14, 41, 1, 47, 33, 7, 41, 17, 35, 27, 20, 1, 14, 54, 26, 33, 18, 47, 1, 44, 14, 59, 16, 52, 28, 18, 49, 31, 25, 34, 63, 13, 51, 24, 9, 50, 3, 23, 38, 63, 7, 52, 29, 46, 11, 33, 50, 22, 57, 36, 1, 57, 49, 17, 39, 28, 9, 35, 6, 27, 53, 15, 55, 30, 24, 58, 36, 41, 11, 52, 32, 3, 44, 25, 62, 23, 51, 15, 42, 22, 50, 10, 39, 4, 31, 35 },
+     { 46, 22, 57, 17, 12, 39, 26, 5, 31, 59, 1, 45, 27, 62, 52, 7, 58, 33, 6, 18, 39, 22, 33, 41, 57, 5, 35, 18, 40, 16, 60, 5, 29, 42, 7, 39, 27, 44, 9, 47, 8, 26, 54, 22, 51, 29, 24, 49, 15, 61, 4, 51, 31, 63, 43, 6, 50, 8, 39, 12, 53, 37, 23, 30, 40, 6, 62, 43, 14, 53, 2, 49, 7, 36, 17, 41, 61, 37, 18, 56, 11, 18, 44, 35, 2, 19, 61, 0, 41, 14, 8, 30, 43, 12, 24, 46, 14, 54, 42, 21, 44, 61, 10, 46, 37, 11, 44, 7, 18, 63, 20, 29, 7, 49, 28, 54, 8, 43, 4, 48, 18, 63, 12, 29, 48, 24, 59, 20 },
+     { 13, 36, 28, 54, 35, 2, 56, 46, 16, 49, 22, 40, 11, 34, 14, 43, 29, 12, 63, 48, 2, 61, 7, 15, 28, 30, 50, 9, 61, 33, 38, 23, 54, 13, 61, 33, 3, 59, 16, 35, 58, 40, 5, 38, 13, 57, 3, 58, 37, 21, 45, 12, 39, 7, 35, 30, 13, 56, 22, 62, 27, 6, 55, 10, 48, 21, 33, 2, 38, 23, 40, 20, 44, 29, 59, 4, 26, 12, 33, 47, 28, 53, 31, 13, 59, 41, 27, 49, 26, 54, 45, 16, 53, 21, 35, 7, 59, 26, 11, 56, 1, 24, 33, 4, 28, 62, 21, 49, 31, 2, 56, 39, 24, 58, 13, 17, 37, 21, 56, 10, 38, 0, 34, 55, 15, 43, 1, 52 },
+     { 42, 9, 50, 6, 25, 60, 14, 38, 10, 29, 53, 18, 57, 3, 25, 51, 0, 53, 25, 17, 29, 37, 52, 46, 0, 62, 14, 37, 4, 50, 10, 44, 0, 46, 20, 25, 50, 19, 55, 0, 23, 31, 62, 34, 11, 45, 19, 32, 0, 53, 10, 59, 23, 47, 18, 60, 42, 28, 37, 3, 50, 15, 35, 44, 0, 51, 27, 60, 9, 57, 16, 58, 11, 22, 46, 15, 53, 48, 7, 42, 0, 60, 5, 49, 24, 54, 9, 17, 39, 5, 34, 62, 3, 40, 60, 31, 0, 47, 29, 16, 49, 39, 59, 17, 50, 0, 40, 13, 53, 38, 16, 46, 0, 42, 34, 60, 2, 53, 29, 31, 58, 46, 27, 6, 61, 8, 37, 28 },
+     { 0, 63, 21, 40, 45, 18, 51, 23, 63, 34, 6, 43, 28, 38, 55, 19, 40, 35, 8, 41, 54, 10, 21, 32, 39, 23, 53, 26, 55, 28, 22, 63, 30, 34, 9, 48, 6, 38, 29, 43, 49, 6, 18, 52, 27, 61, 9, 43, 28, 42, 33, 26, 56, 3, 51, 23, 0, 48, 16, 45, 32, 25, 63, 20, 57, 17, 42, 12, 35, 47, 5, 31, 39, 56, 6, 30, 34, 21, 61, 25, 14, 40, 22, 38, 15, 6, 36, 56, 20, 60, 25, 12, 51, 27, 10, 56, 42, 20, 36, 63, 32, 6, 21, 41, 12, 34, 60, 26, 5, 48, 27, 10, 62, 19, 6, 47, 39, 14, 45, 7, 24, 17, 41, 32, 23, 51, 19, 56 },
+     { 45, 31, 15, 59, 4, 33, 7, 47, 0, 41, 13, 61, 4, 47, 9, 23, 60, 14, 57, 31, 4, 45, 59, 6, 58, 10, 44, 20, 8, 42, 15, 6, 55, 17, 58, 31, 53, 12, 61, 10, 15, 57, 43, 2, 23, 35, 48, 14, 54, 6, 18, 49, 15, 38, 11, 34, 62, 9, 21, 58, 11, 41, 4, 31, 38, 8, 29, 55, 19, 36, 27, 52, 0, 25, 50, 43, 1, 39, 8, 55, 35, 51, 10, 30, 45, 62, 29, 2, 46, 10, 32, 48, 18, 38, 5, 22, 33, 8, 51, 3, 14, 44, 54, 25, 57, 30, 18, 52, 33, 22, 59, 28, 36, 52, 32, 21, 26, 50, 5, 55, 35, 60, 14, 54, 4, 40, 16, 33 },
+     { 27, 3, 49, 10, 30, 40, 55, 27, 57, 24, 52, 21, 32, 17, 60, 30, 5, 44, 27, 49, 19, 34, 13, 24, 43, 36, 3, 49, 31, 59, 37, 48, 26, 41, 2, 41, 14, 36, 21, 32, 40, 26, 13, 49, 55, 5, 16, 40, 25, 60, 36, 1, 63, 29, 17, 44, 25, 40, 52, 5, 29, 47, 54, 13, 46, 24, 60, 4, 51, 22, 63, 14, 45, 18, 12, 62, 17, 57, 19, 42, 3, 26, 58, 48, 1, 21, 40, 52, 23, 37, 44, 1, 29, 58, 43, 50, 15, 61, 19, 45, 58, 28, 7, 48, 2, 46, 8, 42, 3, 55, 8, 50, 12, 4, 55, 10, 63, 33, 20, 40, 11, 3, 46, 20, 48, 26, 61, 11 },
+     { 44, 56, 24, 36, 53, 19, 12, 37, 16, 44, 7, 36, 49, 54, 11, 37, 48, 21, 15, 1, 62, 25, 47, 56, 16, 18, 51, 12, 40, 1, 24, 11, 52, 16, 23, 59, 28, 1, 45, 53, 4, 60, 37, 21, 39, 30, 63, 20, 52, 10, 30, 45, 8, 41, 54, 4, 57, 7, 34, 55, 36, 18, 23, 59, 2, 48, 11, 32, 44, 1, 41, 8, 33, 54, 38, 23, 30, 46, 6, 29, 62, 18, 32, 16, 55, 34, 14, 11, 61, 7, 55, 16, 53, 13, 23, 2, 55, 37, 26, 10, 33, 23, 36, 16, 38, 22, 56, 15, 24, 43, 35, 17, 44, 40, 25, 46, 16, 1, 57, 25, 49, 36, 28, 62, 9, 35, 7, 53 },
+     { 17, 38, 8, 61, 1, 50, 26, 62, 3, 31, 56, 15, 1, 26, 40, 2, 34, 51, 56, 36, 42, 9, 38, 2, 29, 60, 32, 57, 19, 62, 34, 47, 4, 57, 39, 7, 44, 63, 24, 18, 46, 28, 8, 54, 1, 34, 7, 46, 3, 37, 50, 23, 57, 21, 13, 46, 31, 20, 43, 15, 1, 61, 8, 33, 37, 17, 56, 26, 15, 49, 24, 59, 28, 3, 56, 9, 52, 32, 13, 49, 10, 43, 5, 45, 8, 25, 59, 42, 28, 33, 19, 40, 8, 63, 35, 47, 25, 4, 40, 52, 1, 60, 12, 53, 63, 9, 29, 60, 37, 19, 1, 62, 31, 20, 58, 12, 41, 30, 43, 9, 18, 52, 22, 1, 39, 30, 58, 21 },
+     { 13, 47, 29, 18, 43, 34, 5, 48, 20, 42, 10, 45, 30, 58, 20, 63, 24, 11, 6, 28, 54, 14, 22, 52, 41, 7, 26, 5, 45, 15, 53, 13, 35, 27, 18, 50, 12, 33, 5, 56, 10, 17, 45, 24, 59, 15, 50, 26, 56, 13, 19, 5, 32, 52, 27, 36, 2, 61, 12, 26, 49, 40, 27, 52, 13, 50, 6, 39, 61, 34, 10, 37, 48, 20, 41, 27, 2, 36, 59, 24, 54, 33, 63, 20, 38, 50, 3, 17, 52, 4, 58, 27, 45, 21, 32, 11, 48, 17, 57, 20, 46, 38, 25, 43, 4, 34, 51, 6, 13, 45, 57, 26, 6, 48, 2, 35, 53, 23, 61, 34, 59, 6, 42, 56, 13, 51, 2, 41 },
+     { 32, 5, 55, 23, 58, 14, 22, 52, 29, 15, 61, 25, 51, 8, 43, 13, 53, 41, 46, 20, 3, 33, 63, 11, 48, 21, 54, 38, 28, 3, 30, 43, 21, 62, 9, 31, 55, 22, 51, 29, 37, 62, 32, 12, 42, 29, 41, 9, 33, 44, 62, 28, 43, 1, 59, 19, 48, 30, 51, 39, 24, 4, 58, 19, 42, 29, 22, 43, 3, 18, 53, 5, 13, 50, 16, 60, 45, 21, 7, 40, 15, 0, 26, 53, 13, 31, 43, 24, 47, 31, 15, 49, 2, 41, 6, 59, 29, 42, 9, 30, 14, 7, 49, 18, 31, 47, 20, 39, 49, 32, 11, 41, 54, 15, 61, 18, 7, 38, 4, 13, 44, 28, 15, 32, 45, 19, 27, 49 },
+     { 63, 34, 11, 39, 2, 45, 37, 8, 59, 39, 33, 4, 36, 17, 48, 5, 29, 18, 32, 61, 39, 50, 5, 27, 35, 0, 46, 12, 22, 49, 60, 6, 54, 0, 38, 49, 2, 42, 15, 40, 0, 47, 20, 51, 3, 57, 18, 61, 22, 0, 39, 16, 55, 12, 35, 8, 41, 22, 6, 59, 16, 45, 10, 36, 0, 62, 9, 54, 30, 58, 21, 43, 63, 31, 7, 35, 12, 48, 58, 28, 47, 37, 41, 9, 57, 20, 61, 0, 36, 11, 57, 35, 23, 52, 37, 18, 0, 62, 22, 55, 35, 62, 27, 54, 0, 15, 61, 28, 2, 59, 22, 9, 37, 27, 33, 51, 29, 48, 19, 50, 25, 37, 10, 57, 5, 37, 60, 8 },
+     { 20, 25, 46, 52, 31, 60, 12, 55, 0, 19, 11, 46, 62, 35, 23, 38, 57, 0, 55, 10, 16, 30, 58, 44, 17, 59, 29, 63, 42, 8, 36, 20, 33, 46, 16, 61, 25, 35, 8, 54, 26, 7, 58, 22, 34, 6, 47, 14, 53, 31, 48, 9, 37, 25, 49, 63, 16, 55, 45, 14, 34, 63, 21, 53, 25, 33, 46, 16, 35, 7, 46, 29, 0, 39, 25, 55, 22, 34, 18, 4, 56, 11, 23, 51, 28, 6, 39, 14, 62, 44, 19, 8, 60, 12, 56, 28, 50, 34, 39, 5, 51, 3, 41, 12, 57, 35, 10, 53, 25, 17, 52, 30, 47, 0, 43, 14, 5, 57, 31, 55, 0, 63, 47, 23, 54, 24, 14, 43 },
+     { 0, 57, 16, 6, 26, 19, 35, 28, 49, 42, 54, 26, 21, 1, 59, 27, 9, 47, 26, 44, 50, 22, 13, 40, 8, 37, 10, 34, 17, 56, 25, 58, 13, 27, 44, 9, 20, 58, 31, 17, 60, 36, 10, 41, 53, 25, 36, 39, 4, 24, 58, 17, 60, 4, 22, 38, 10, 32, 0, 50, 31, 7, 28, 47, 12, 57, 5, 26, 52, 23, 14, 40, 57, 17, 47, 5, 53, 1, 44, 31, 19, 60, 46, 2, 35, 48, 30, 54, 22, 5, 51, 39, 25, 31, 4, 43, 14, 9, 45, 16, 24, 44, 19, 29, 40, 23, 44, 7, 38, 42, 4, 63, 12, 54, 23, 59, 22, 42, 8, 15, 40, 21, 8, 34, 3, 41, 30, 50 },
+     { 39, 10, 48, 33, 41, 54, 5, 47, 23, 13, 32, 7, 52, 44, 14, 39, 58, 18, 35, 6, 37, 2, 60, 24, 55, 19, 53, 2, 51, 32, 1, 41, 51, 4, 40, 29, 47, 3, 52, 44, 13, 49, 28, 16, 1, 62, 11, 27, 52, 35, 5, 42, 29, 47, 14, 56, 28, 53, 26, 38, 9, 56, 40, 3, 38, 15, 41, 60, 1, 37, 50, 25, 11, 28, 61, 19, 42, 62, 10, 52, 39, 6, 32, 14, 58, 17, 7, 26, 42, 34, 27, 10, 54, 40, 20, 63, 26, 53, 21, 61, 32, 7, 59, 48, 3, 56, 18, 31, 58, 14, 49, 21, 36, 16, 45, 9, 36, 24, 62, 45, 27, 31, 53, 17, 49, 12, 62, 18 },
+     { 28, 59, 21, 58, 2, 16, 38, 9, 62, 3, 56, 41, 10, 31, 50, 4, 32, 52, 12, 63, 23, 46, 33, 31, 4, 48, 25, 43, 14, 23, 47, 11, 22, 55, 14, 60, 23, 37, 11, 39, 23, 2, 45, 56, 31, 43, 19, 55, 16, 46, 21, 51, 11, 33, 44, 2, 41, 18, 5, 52, 23, 44, 17, 60, 27, 49, 11, 32, 44, 10, 54, 2, 56, 33, 8, 38, 13, 29, 36, 16, 24, 63, 27, 51, 21, 43, 56, 12, 49, 3, 59, 48, 1, 15, 46, 7, 36, 2, 47, 11, 50, 27, 37, 13, 33, 8, 51, 46, 1, 34, 28, 40, 3, 33, 60, 29, 47, 1, 35, 11, 59, 42, 2, 60, 26, 46, 6, 35 },
+     { 4, 43, 9, 29, 36, 63, 24, 44, 20, 50, 30, 17, 60, 22, 16, 43, 25, 3, 42, 19, 51, 15, 8, 54, 42, 15, 61, 5, 39, 57, 18, 61, 31, 48, 34, 2, 50, 19, 57, 5, 63, 33, 19, 38, 13, 27, 48, 7, 32, 61, 2, 26, 58, 6, 24, 50, 13, 61, 42, 20, 62, 2, 35, 20, 51, 4, 62, 18, 23, 58, 20, 31, 43, 15, 51, 45, 26, 50, 4, 55, 45, 3, 35, 9, 38, 1, 32, 61, 20, 45, 17, 33, 24, 57, 29, 51, 22, 58, 38, 30, 15, 1, 54, 21, 63, 43, 26, 12, 24, 56, 8, 60, 50, 19, 5, 52, 13, 54, 17, 50, 4, 16, 36, 12, 32, 56, 22, 54 },
+     { 51, 25, 40, 53, 12, 49, 15, 57, 34, 7, 38, 47, 2, 36, 55, 8, 61, 30, 56, 7, 28, 59, 48, 11, 27, 35, 21, 45, 28, 36, 9, 38, 6, 16, 24, 63, 10, 32, 28, 43, 21, 53, 5, 60, 8, 57, 3, 45, 11, 37, 15, 54, 40, 20, 62, 36, 27, 34, 11, 48, 30, 15, 54, 8, 30, 42, 22, 34, 48, 13, 35, 63, 4, 37, 22, 2, 59, 9, 41, 23, 13, 41, 49, 18, 59, 24, 40, 5, 37, 30, 9, 61, 44, 6, 37, 11, 33, 17, 5, 55, 41, 60, 23, 39, 17, 5, 30, 62, 41, 16, 46, 25, 11, 56, 39, 26, 20, 38, 29, 39, 22, 52, 44, 20, 48, 1, 38, 14 },
+     { 15, 33, 2, 18, 44, 6, 27, 0, 32, 61, 25, 12, 58, 28, 40, 20, 47, 13, 34, 43, 38, 1, 23, 62, 40, 0, 51, 10, 63, 3, 52, 26, 44, 30, 45, 6, 41, 54, 0, 51, 12, 30, 46, 24, 49, 22, 40, 33, 63, 23, 43, 30, 9, 47, 0, 17, 54, 7, 57, 3, 37, 47, 24, 46, 13, 55, 7, 52, 2, 42, 6, 26, 49, 18, 60, 34, 16, 57, 33, 20, 61, 30, 8, 54, 14, 46, 12, 53, 16, 55, 38, 13, 22, 53, 18, 59, 46, 27, 43, 19, 32, 10, 45, 6, 49, 36, 52, 2, 20, 55, 6, 39, 32, 15, 44, 3, 58, 10, 63, 6, 56, 30, 7, 58, 9, 40, 19, 63 },
+     { 10, 47, 61, 23, 55, 31, 52, 42, 17, 45, 4, 51, 27, 6, 15, 53, 0, 49, 26, 10, 56, 18, 36, 6, 20, 58, 32, 30, 13, 49, 19, 56, 0, 59, 12, 53, 27, 17, 38, 25, 48, 9, 15, 36, 14, 30, 59, 17, 0, 50, 8, 58, 18, 56, 31, 45, 21, 41, 29, 19, 60, 6, 32, 59, 0, 36, 29, 39, 19, 59, 46, 12, 55, 30, 10, 47, 24, 3, 28, 48, 0, 55, 44, 27, 33, 4, 63, 29, 49, 0, 26, 50, 34, 2, 42, 14, 0, 62, 9, 56, 3, 52, 28, 34, 58, 9, 20, 48, 37, 32, 22, 53, 0, 62, 27, 49, 34, 46, 21, 33, 41, 14, 25, 37, 53, 29, 31, 45 },
+     { 56, 28, 7, 37, 11, 36, 20, 9, 54, 14, 39, 19, 34, 63, 45, 37, 24, 17, 60, 31, 21, 45, 53, 29, 47, 15, 7, 55, 40, 23, 34, 14, 42, 20, 37, 35, 15, 59, 7, 62, 34, 40, 59, 1, 51, 42, 10, 28, 54, 21, 35, 5, 38, 13, 36, 4, 59, 12, 39, 53, 15, 43, 9, 21, 39, 62, 16, 56, 25, 9, 32, 38, 0, 41, 14, 51, 40, 53, 43, 11, 37, 17, 5, 22, 57, 39, 19, 7, 42, 21, 60, 10, 31, 63, 25, 52, 30, 49, 36, 25, 48, 17, 61, 14, 22, 42, 29, 13, 60, 11, 47, 18, 35, 41, 7, 23, 4, 16, 51, 11, 0, 48, 61, 3, 17, 50, 5, 24 },
+     { 0, 42, 21, 49, 60, 3, 57, 40, 29, 48, 23, 56, 42, 11, 22, 5, 59, 39, 4, 50, 3, 41, 12, 57, 25, 50, 44, 18, 4, 46, 7, 62, 33, 50, 4, 56, 21, 32, 43, 18, 3, 23, 55, 34, 20, 4, 53, 38, 12, 46, 29, 52, 25, 61, 23, 51, 26, 46, 1, 34, 25, 57, 28, 51, 26, 11, 50, 3, 44, 28, 53, 21, 57, 27, 62, 6, 31, 19, 8, 63, 26, 59, 36, 47, 15, 29, 50, 25, 35, 47, 18, 41, 4, 48, 8, 40, 12, 23, 6, 44, 13, 40, 1, 31, 55, 0, 61, 43, 4, 50, 26, 58, 9, 53, 24, 61, 42, 55, 31, 43, 57, 20, 34, 27, 43, 8, 59, 39 },
+     { 18, 51, 30, 13, 26, 16, 46, 22, 2, 59, 8, 30, 1, 48, 33, 51, 29, 9, 46, 16, 62, 14, 33, 2, 38, 9, 27, 60, 37, 26, 53, 17, 28, 10, 24, 46, 2, 49, 8, 57, 29, 45, 6, 26, 62, 44, 18, 25, 61, 3, 42, 14, 49, 10, 43, 6, 17, 32, 63, 10, 49, 4, 40, 14, 45, 33, 22, 37, 12, 61, 5, 17, 43, 7, 23, 37, 15, 58, 49, 13, 39, 21, 10, 52, 1, 62, 9, 56, 12, 2, 58, 28, 36, 16, 56, 28, 56, 35, 20, 63, 24, 37, 51, 8, 45, 25, 16, 33, 27, 38, 2, 44, 13, 30, 17, 36, 12, 26, 5, 18, 28, 47, 13, 60, 23, 45, 13, 33 },
+     { 55, 4, 62, 34, 52, 38, 7, 63, 32, 37, 13, 53, 25, 62, 18, 12, 55, 41, 27, 35, 24, 49, 31, 52, 17, 63, 34, 1, 56, 12, 41, 2, 48, 58, 39, 16, 61, 27, 41, 52, 13, 19, 50, 39, 11, 31, 57, 6, 32, 40, 20, 55, 1, 28, 33, 57, 48, 8, 37, 22, 44, 18, 53, 1, 61, 5, 54, 16, 47, 36, 50, 24, 55, 34, 48, 45, 1, 30, 33, 46, 2, 50, 32, 42, 25, 34, 43, 21, 38, 52, 23, 45, 14, 54, 21, 4, 44, 16, 53, 29, 10, 47, 19, 57, 12, 54, 39, 10, 51, 15, 63, 21, 57, 40, 51, 1, 48, 57, 37, 62, 2, 38, 9, 52, 1, 35, 58, 22 },
+     { 36, 46, 10, 42, 1, 27, 43, 15, 50, 21, 45, 16, 41, 3, 35, 44, 20, 1, 57, 11, 55, 7, 43, 8, 22, 42, 13, 46, 21, 39, 31, 60, 22, 5, 29, 44, 11, 35, 20, 4, 36, 58, 32, 15, 47, 2, 36, 48, 16, 60, 8, 35, 44, 63, 16, 2, 40, 26, 55, 14, 58, 35, 24, 31, 19, 42, 31, 58, 1, 29, 10, 40, 2, 19, 12, 54, 22, 61, 7, 24, 56, 5, 28, 16, 54, 3, 15, 58, 6, 30, 8, 62, 1, 43, 31, 47, 7, 59, 1, 38, 58, 4, 34, 27, 38, 5, 31, 59, 7, 46, 30, 3, 34, 6, 28, 59, 20, 8, 32, 15, 53, 24, 55, 31, 19, 49, 11, 26 },
+     { 2, 24, 16, 58, 19, 55, 5, 35, 10, 61, 4, 28, 57, 24, 58, 7, 31, 47, 22, 38, 19, 28, 61, 36, 54, 5, 59, 29, 6, 52, 15, 11, 43, 36, 8, 54, 52, 1, 62, 25, 47, 9, 1, 60, 28, 53, 24, 14, 46, 27, 51, 22, 12, 24, 38, 53, 20, 11, 51, 3, 29, 7, 48, 63, 8, 49, 9, 21, 52, 14, 63, 32, 46, 60, 35, 4, 41, 16, 52, 35, 18, 42, 59, 7, 36, 61, 45, 27, 33, 51, 19, 39, 34, 11, 61, 18, 33, 41, 28, 15, 54, 22, 42, 3, 49, 21, 47, 18, 36, 23, 55, 19, 48, 24, 45, 10, 33, 44, 50, 40, 7, 35, 15, 41, 63, 6, 40, 54 },
+     { 62, 41, 32, 8, 47, 28, 60, 24, 44, 30, 38, 49, 9, 33, 14, 40, 50, 14, 60, 2, 54, 40, 0, 20, 25, 39, 16, 49, 24, 35, 57, 47, 19, 61, 33, 18, 23, 37, 13, 55, 31, 43, 22, 41, 17, 8, 42, 58, 0, 37, 5, 56, 31, 54, 7, 30, 60, 33, 42, 17, 59, 39, 12, 27, 38, 17, 35, 41, 27, 45, 20, 7, 25, 15, 29, 58, 27, 47, 11, 40, 14, 54, 23, 46, 19, 31, 11, 40, 13, 49, 5, 58, 24, 51, 26, 6, 50, 20, 49, 9, 32, 46, 17, 60, 14, 63, 24, 1, 57, 41, 9, 43, 14, 62, 16, 52, 3, 27, 14, 22, 61, 45, 4, 28, 9, 47, 29, 17 },
+     { 5, 50, 12, 53, 38, 18, 11, 51, 0, 55, 17, 6, 47, 54, 19, 63, 5, 26, 34, 45, 13, 30, 47, 58, 10, 48, 32, 3, 62, 9, 26, 0, 25, 14, 50, 3, 47, 30, 42, 16, 6, 63, 12, 49, 33, 55, 21, 10, 34, 63, 18, 41, 3, 47, 19, 43, 0, 49, 8, 28, 46, 20, 52, 0, 56, 24, 60, 3, 59, 5, 39, 57, 48, 52, 9, 38, 3, 21, 26, 60, 0, 32, 12, 38, 4, 48, 53, 0, 60, 15, 29, 44, 18, 10, 38, 57, 13, 60, 2, 26, 62, 7, 50, 29, 35, 8, 40, 53, 28, 12, 60, 33, 38, 5, 37, 29, 60, 39, 56, 0, 30, 18, 50, 34, 59, 25, 14, 44 },
+     { 20, 31, 60, 22, 3, 49, 33, 25, 40, 13, 34, 59, 22, 36, 0, 28, 37, 56, 8, 18, 51, 16, 4, 45, 27, 12, 53, 42, 18, 44, 51, 31, 55, 40, 28, 58, 7, 60, 10, 51, 27, 37, 24, 56, 5, 26, 44, 29, 50, 23, 45, 11, 34, 15, 59, 27, 13, 23, 62, 37, 4, 57, 15, 32, 42, 6, 47, 11, 30, 43, 23, 13, 0, 36, 18, 44, 63, 51, 37, 29, 49, 20, 57, 27, 62, 9, 24, 35, 23, 53, 37, 3, 42, 55, 0, 36, 23, 39, 31, 43, 17, 37, 24, 11, 52, 43, 19, 32, 5, 50, 26, 0, 56, 21, 54, 11, 19, 6, 47, 25, 59, 42, 12, 54, 21, 3, 38, 57 },
+     { 48, 0, 35, 27, 44, 14, 59, 7, 57, 46, 26, 2, 42, 12, 52, 43, 10, 27, 53, 42, 32, 62, 37, 21, 34, 61, 7, 23, 36, 4, 38, 12, 41, 5, 17, 45, 22, 27, 39, 21, 59, 0, 45, 18, 39, 62, 3, 38, 14, 7, 54, 26, 61, 39, 9, 52, 45, 36, 18, 50, 10, 34, 44, 22, 50, 14, 36, 55, 17, 34, 53, 62, 33, 26, 56, 6, 31, 12, 6, 53, 9, 44, 2, 50, 20, 40, 55, 17, 47, 7, 26, 63, 22, 32, 48, 16, 46, 8, 52, 12, 57, 41, 0, 56, 25, 3, 61, 14, 45, 35, 18, 44, 12, 46, 23, 42, 32, 51, 35, 10, 17, 36, 23, 1, 45, 52, 32, 10 },
+     { 37, 15, 43, 8, 63, 39, 21, 31, 16, 37, 19, 62, 30, 46, 17, 60, 21, 48, 1, 23, 6, 25, 11, 56, 1, 40, 30, 58, 15, 54, 21, 59, 9, 63, 35, 56, 11, 51, 2, 46, 34, 14, 53, 7, 30, 11, 51, 19, 60, 40, 30, 1, 24, 50, 20, 32, 3, 56, 5, 25, 31, 13, 61, 2, 29, 60, 25, 20, 51, 2, 27, 8, 18, 42, 10, 45, 21, 34, 43, 17, 62, 29, 41, 14, 34, 6, 30, 43, 2, 57, 33, 13, 45, 12, 27, 62, 4, 55, 21, 35, 5, 27, 45, 33, 16, 47, 30, 54, 22, 10, 51, 27, 63, 7, 49, 1, 58, 22, 15, 43, 53, 7, 57, 39, 27, 12, 61, 24 },
+     { 56, 51, 26, 56, 19, 2, 41, 54, 5, 52, 9, 48, 6, 23, 39, 4, 32, 15, 63, 35, 59, 49, 43, 15, 52, 19, 50, 9, 46, 33, 1, 29, 48, 20, 32, 1, 38, 33, 19, 54, 9, 32, 24, 48, 58, 35, 16, 48, 4, 52, 13, 57, 33, 5, 45, 59, 15, 29, 41, 55, 47, 39, 23, 53, 9, 40, 4, 57, 10, 44, 48, 40, 50, 14, 61, 24, 55, 1, 59, 22, 33, 8, 51, 25, 58, 46, 11, 59, 20, 41, 17, 51, 6, 56, 35, 25, 42, 30, 15, 58, 48, 18, 61, 9, 58, 39, 13, 2, 37, 59, 40, 2, 31, 16, 34, 41, 8, 30, 62, 3, 29, 48, 33, 5, 63, 16, 41, 7 },
+     { 22, 4, 46, 11, 33, 51, 29, 10, 62, 24, 43, 27, 15, 58, 50, 25, 54, 44, 9, 38, 18, 3, 29, 57, 32, 5, 26, 43, 17, 61, 24, 52, 8, 42, 23, 53, 15, 61, 7, 28, 57, 43, 4, 40, 20, 2, 43, 25, 32, 35, 21, 43, 17, 48, 10, 22, 38, 54, 11, 21, 1, 58, 16, 30, 48, 18, 46, 32, 38, 13, 22, 4, 59, 35, 2, 51, 30, 39, 15, 47, 4, 56, 13, 37, 1, 28, 16, 52, 32, 9, 61, 29, 38, 19, 3, 52, 10, 48, 1, 32, 11, 40, 20, 36, 6, 22, 49, 29, 55, 6, 20, 56, 36, 52, 19, 60, 26, 46, 18, 54, 40, 13, 20, 46, 35, 19, 49, 29 },
+     { 61, 17, 34, 53, 23, 6, 48, 35, 20, 40, 1, 56, 36, 29, 11, 34, 7, 41, 14, 30, 55, 20, 46, 8, 24, 38, 63, 2, 37, 10, 45, 14, 34, 49, 6, 13, 44, 25, 49, 41, 21, 12, 61, 15, 54, 29, 63, 12, 56, 8, 49, 2, 62, 36, 28, 61, 0, 25, 41, 63, 35, 8, 44, 6, 37, 62, 7, 21, 63, 28, 55, 31, 16, 24, 41, 19, 9, 57, 27, 36, 18, 42, 31, 62, 22, 55, 38, 4, 27, 47, 1, 40, 14, 54, 43, 20, 60, 23, 38, 63, 25, 51, 2, 53, 26, 63, 10, 42, 17, 34, 47, 25, 13, 5, 44, 11, 55, 2, 38, 27, 6, 60, 52, 25, 9, 55, 1, 40 },
+     { 8, 30, 58, 3, 42, 61, 17, 38, 13, 59, 32, 10, 54, 3, 51, 20, 61, 26, 57, 2, 46, 33, 12, 60, 41, 13, 48, 29, 55, 20, 39, 27, 57, 18, 62, 29, 55, 2, 31, 16, 37, 50, 26, 36, 6, 46, 9, 41, 27, 57, 23, 39, 26, 6, 51, 12, 31, 46, 7, 16, 27, 52, 19, 56, 26, 12, 33, 53, 1, 41, 8, 57, 46, 7, 54, 32, 47, 5, 49, 11, 60, 23, 5, 48, 10, 43, 19, 63, 35, 24, 49, 21, 59, 5, 31, 37, 14, 44, 7, 42, 6, 30, 46, 13, 44, 32, 19, 50, 4, 58, 8, 30, 62, 38, 28, 53, 21, 36, 13, 50, 21, 33, 15, 2, 44, 31, 14, 47 },
+     { 37, 13, 39, 16, 28, 9, 57, 0, 25, 49, 21, 45, 18, 47, 12, 42, 0, 49, 22, 39, 16, 53, 25, 36, 0, 52, 22, 16, 6, 60, 4, 51, 0, 26, 37, 47, 10, 36, 63, 5, 57, 0, 18, 59, 23, 33, 51, 19, 0, 44, 15, 11, 54, 17, 42, 35, 53, 18, 58, 33, 49, 4, 34, 42, 0, 50, 43, 25, 16, 49, 34, 20, 37, 28, 12, 63, 16, 38, 25, 44, 0, 40, 52, 17, 35, 3, 50, 14, 8, 53, 11, 36, 25, 45, 9, 62, 0, 54, 28, 17, 50, 55, 15, 24, 57, 0, 53, 34, 23, 41, 15, 45, 0, 49, 16, 4, 48, 9, 63, 45, 0, 42, 58, 37, 61, 22, 54, 26 },
+     { 0, 50, 21, 47, 54, 36, 27, 45, 52, 4, 34, 15, 63, 29, 37, 59, 17, 31, 6, 61, 28, 5, 48, 18, 59, 27, 34, 56, 44, 31, 35, 12, 41, 59, 16, 3, 40, 20, 50, 22, 30, 40, 52, 10, 45, 3, 59, 22, 37, 61, 29, 46, 31, 58, 2, 22, 9, 43, 3, 39, 14, 61, 24, 54, 15, 29, 11, 60, 39, 17, 5, 61, 0, 44, 50, 3, 31, 14, 58, 21, 54, 28, 15, 45, 60, 26, 33, 58, 44, 22, 60, 2, 57, 34, 49, 27, 18, 34, 21, 59, 29, 4, 36, 41, 8, 39, 28, 11, 62, 26, 53, 20, 35, 24, 59, 32, 29, 39, 24, 31, 57, 23, 11, 28, 5, 36, 11, 59 },
+     { 44, 32, 63, 5, 20, 12, 41, 7, 30, 61, 42, 8, 39, 5, 33, 8, 24, 53, 45, 11, 37, 58, 7, 44, 10, 50, 3, 40, 8, 22, 53, 19, 46, 9, 33, 52, 24, 58, 8, 44, 13, 47, 8, 34, 38, 30, 14, 47, 7, 34, 4, 55, 9, 19, 40, 49, 56, 26, 60, 21, 30, 45, 10, 19, 40, 58, 23, 36, 3, 52, 45, 23, 54, 13, 22, 42, 53, 45, 7, 33, 10, 36, 57, 6, 29, 12, 41, 0, 30, 15, 41, 30, 17, 7, 16, 53, 40, 56, 2, 39, 12, 61, 10, 52, 31, 60, 16, 45, 1, 37, 7, 61, 40, 10, 43, 17, 58, 7, 54, 14, 4, 51, 39, 49, 18, 56, 42, 20 },
+     { 14, 6, 24, 36, 56, 49, 22, 60, 18, 14, 23, 51, 26, 57, 21, 52, 41, 14, 35, 50, 19, 31, 40, 23, 33, 14, 63, 17, 32, 47, 7, 62, 23, 30, 56, 11, 42, 27, 14, 60, 35, 19, 28, 61, 17, 55, 25, 39, 53, 17, 42, 21, 38, 63, 25, 5, 14, 36, 12, 50, 1, 37, 59, 32, 2, 51, 6, 56, 27, 32, 11, 30, 38, 26, 60, 8, 26, 19, 62, 39, 50, 2, 21, 39, 53, 23, 56, 19, 49, 39, 5, 46, 55, 23, 42, 4, 31, 11, 47, 26, 45, 22, 48, 18, 21, 5, 48, 25, 57, 14, 47, 30, 3, 56, 12, 50, 1, 42, 19, 47, 35, 17, 8, 30, 45, 25, 4, 51 },
+     { 28, 58, 43, 1, 31, 8, 33, 2, 44, 55, 32, 1, 60, 12, 46, 27, 4, 62, 23, 1, 56, 13, 62, 2, 54, 36, 25, 51, 1, 57, 26, 42, 3, 49, 17, 38, 1, 48, 31, 4, 54, 3, 50, 24, 1, 49, 5, 63, 13, 27, 52, 1, 48, 13, 45, 33, 52, 30, 46, 20, 55, 28, 6, 48, 24, 38, 20, 47, 14, 62, 48, 9, 58, 4, 36, 30, 56, 1, 34, 12, 18, 63, 25, 48, 4, 16, 37, 7, 62, 10, 52, 28, 13, 50, 36, 63, 24, 51, 15, 58, 8, 33, 1, 38, 56, 35, 42, 9, 33, 51, 22, 18, 48, 32, 27, 37, 23, 61, 33, 11, 59, 29, 62, 1, 53, 10, 60, 33 },
+     { 12, 39, 17, 52, 26, 46, 53, 38, 25, 11, 48, 36, 16, 43, 2, 35, 55, 17, 39, 29, 43, 9, 28, 45, 20, 5, 46, 12, 42, 28, 13, 52, 36, 6, 60, 22, 54, 17, 62, 39, 25, 42, 15, 55, 44, 20, 31, 10, 35, 57, 24, 32, 29, 6, 59, 18, 7, 62, 3, 41, 10, 44, 16, 54, 13, 62, 31, 9, 41, 1, 21, 43, 18, 47, 15, 40, 11, 49, 28, 55, 46, 30, 8, 43, 32, 61, 28, 47, 25, 34, 21, 61, 32, 1, 20, 9, 46, 6, 35, 19, 41, 54, 27, 63, 14, 3, 51, 20, 62, 2, 38, 55, 8, 21, 63, 6, 46, 9, 26, 51, 3, 24, 43, 34, 16, 41, 18, 48 },
+     { 62, 23, 55, 9, 15, 62, 19, 13, 58, 40, 6, 30, 54, 19, 50, 31, 10, 44, 6, 59, 21, 47, 51, 15, 60, 39, 30, 54, 21, 61, 19, 33, 14, 29, 43, 11, 34, 45, 7, 21, 10, 56, 36, 6, 38, 11, 58, 42, 2, 47, 11, 60, 50, 16, 41, 28, 38, 23, 47, 17, 35, 63, 22, 33, 42, 5, 45, 17, 53, 35, 25, 56, 33, 6, 51, 19, 60, 23, 43, 15, 5, 40, 58, 13, 51, 1, 45, 11, 54, 3, 43, 8, 37, 48, 59, 29, 39, 21, 61, 43, 3, 31, 10, 44, 24, 29, 60, 12, 28, 40, 11, 25, 43, 52, 14, 41, 16, 57, 44, 20, 40, 55, 12, 21, 57, 27, 35, 2 },
+     { 37, 6, 31, 42, 40, 4, 29, 50, 0, 20, 63, 28, 9, 58, 14, 24, 63, 26, 48, 16, 34, 4, 32, 38, 23, 11, 58, 4, 37, 9, 45, 5, 63, 48, 26, 57, 2, 28, 32, 51, 46, 29, 13, 62, 27, 46, 28, 18, 50, 15, 40, 4, 19, 34, 54, 0, 53, 9, 26, 58, 28, 5, 49, 0, 57, 27, 19, 60, 29, 8, 59, 12, 37, 63, 24, 46, 3, 37, 6, 52, 26, 32, 20, 36, 9, 22, 59, 18, 35, 51, 14, 57, 17, 24, 12, 44, 56, 0, 30, 13, 59, 20, 49, 17, 54, 43, 6, 34, 46, 17, 58, 36, 0, 34, 29, 54, 25, 2, 36, 15, 60, 6, 37, 46, 4, 50, 9, 45 },
+     { 19, 59, 48, 3, 24, 60, 44, 22, 34, 51, 15, 45, 41, 5, 33, 47, 0, 37, 12, 55, 25, 54, 8, 57, 0, 47, 18, 34, 49, 15, 55, 24, 40, 20, 8, 35, 53, 13, 41, 18, 0, 59, 22, 33, 4, 52, 8, 60, 24, 36, 31, 56, 45, 26, 10, 43, 15, 56, 36, 4, 51, 14, 39, 30, 12, 55, 36, 2, 39, 49, 4, 44, 17, 0, 32, 13, 53, 35, 59, 17, 62, 0, 55, 24, 52, 38, 31, 6, 42, 19, 29, 40, 4, 54, 33, 5, 16, 27, 52, 37, 23, 55, 7, 37, 0, 39, 23, 49, 4, 53, 31, 15, 59, 10, 50, 4, 60, 34, 48, 7, 31, 49, 27, 14, 62, 22, 53, 29 },
+     { 46, 21, 14, 51, 36, 17, 7, 57, 10, 32, 3, 37, 22, 60, 39, 18, 56, 20, 42, 3, 36, 10, 44, 26, 41, 29, 53, 27, 2, 39, 30, 52, 0, 59, 15, 48, 23, 61, 6, 58, 37, 12, 40, 49, 16, 39, 20, 44, 0, 62, 8, 21, 3, 59, 23, 32, 49, 31, 12, 44, 22, 59, 18, 50, 24, 7, 43, 52, 15, 23, 41, 26, 51, 28, 55, 39, 21, 27, 10, 42, 12, 45, 27, 47, 3, 15, 63, 26, 55, 0, 60, 26, 45, 18, 62, 38, 58, 49, 8, 47, 4, 33, 46, 29, 57, 13, 56, 16, 59, 21, 5, 47, 23, 39, 18, 44, 13, 22, 28, 53, 19, 0, 58, 32, 41, 7, 26, 13 },
+     { 0, 56, 34, 28, 11, 55, 31, 47, 26, 41, 56, 13, 53, 28, 11, 49, 7, 52, 32, 61, 50, 22, 63, 17, 13, 56, 7, 19, 43, 62, 10, 21, 37, 32, 43, 4, 38, 19, 44, 25, 31, 54, 5, 23, 61, 30, 53, 12, 35, 22, 43, 53, 37, 48, 7, 62, 20, 2, 61, 41, 8, 34, 47, 9, 63, 34, 28, 10, 55, 33, 14, 57, 7, 47, 9, 61, 4, 49, 31, 50, 21, 38, 8, 16, 57, 44, 33, 5, 49, 36, 12, 50, 7, 34, 10, 25, 2, 22, 36, 15, 26, 61, 18, 9, 22, 46, 32, 8, 27, 37, 44, 30, 55, 3, 62, 24, 38, 56, 5, 45, 38, 24, 43, 10, 19, 54, 39, 61 },
+     { 41, 30, 8, 63, 43, 23, 38, 3, 62, 19, 8, 49, 25, 1, 58, 30, 23, 40, 9, 28, 18, 40, 6, 38, 49, 22, 35, 59, 8, 27, 50, 5, 56, 17, 11, 50, 30, 9, 55, 2, 51, 19, 34, 47, 9, 41, 6, 26, 48, 57, 14, 28, 17, 12, 39, 13, 37, 46, 25, 19, 54, 27, 1, 37, 16, 45, 20, 60, 1, 48, 20, 38, 31, 22, 42, 15, 19, 44, 1, 61, 6, 34, 56, 40, 29, 10, 20, 46, 13, 22, 41, 23, 59, 42, 30, 51, 45, 13, 63, 53, 42, 12, 51, 38, 62, 2, 26, 41, 50, 1, 61, 10, 19, 42, 31, 8, 49, 32, 12, 63, 9, 52, 16, 56, 36, 2, 31, 16 },
+     { 52, 5, 47, 20, 1, 53, 12, 50, 16, 35, 43, 21, 33, 43, 16, 44, 3, 59, 14, 46, 1, 30, 60, 33, 2, 45, 12, 42, 31, 47, 14, 33, 46, 25, 55, 27, 60, 36, 16, 42, 14, 46, 26, 1, 55, 15, 63, 32, 2, 38, 5, 47, 33, 61, 30, 52, 4, 57, 6, 38, 11, 43, 61, 24, 52, 3, 31, 22, 42, 10, 62, 3, 59, 11, 35, 57, 33, 54, 24, 14, 29, 48, 18, 2, 60, 41, 53, 24, 32, 62, 3, 53, 15, 1, 55, 17, 32, 40, 6, 31, 1, 40, 28, 5, 35, 52, 19, 63, 13, 33, 17, 41, 52, 26, 15, 57, 1, 20, 42, 17, 35, 27, 48, 5, 25, 50, 44, 11 },
+     { 35, 25, 38, 57, 33, 17, 40, 6, 59, 27, 54, 5, 61, 10, 52, 26, 36, 19, 51, 35, 57, 48, 11, 20, 54, 25, 61, 16, 1, 58, 24, 61, 3, 39, 7, 47, 1, 22, 49, 28, 63, 10, 58, 32, 17, 36, 45, 19, 51, 29, 59, 10, 50, 1, 23, 42, 18, 29, 51, 21, 56, 32, 14, 5, 40, 58, 47, 13, 54, 35, 29, 45, 18, 52, 26, 2, 38, 8, 46, 36, 58, 11, 52, 35, 17, 28, 1, 58, 9, 39, 17, 28, 37, 48, 20, 9, 57, 24, 50, 19, 58, 16, 48, 25, 43, 11, 35, 6, 45, 24, 56, 4, 36, 7, 47, 35, 52, 28, 59, 30, 2, 61, 21, 33, 63, 12, 18, 59 },
+     { 3, 49, 15, 10, 27, 61, 25, 45, 30, 0, 14, 47, 31, 38, 17, 62, 7, 55, 27, 4, 15, 24, 42, 52, 10, 34, 5, 51, 36, 18, 41, 11, 35, 21, 62, 13, 33, 57, 8, 35, 5, 40, 21, 43, 52, 3, 24, 56, 11, 16, 33, 25, 41, 20, 55, 8, 60, 35, 15, 48, 2, 57, 30, 49, 18, 25, 6, 39, 17, 57, 7, 25, 43, 5, 49, 16, 62, 22, 55, 4, 25, 43, 23, 7, 50, 11, 37, 48, 14, 51, 33, 57, 7, 27, 39, 46, 4, 29, 11, 43, 34, 56, 7, 60, 20, 54, 30, 57, 22, 49, 9, 33, 54, 14, 63, 23, 6, 43, 10, 40, 50, 13, 44, 8, 38, 33, 46, 23 },
+     { 55, 39, 22, 50, 44, 4, 36, 9, 52, 23, 37, 59, 21, 2, 46, 13, 31, 41, 11, 45, 62, 29, 6, 37, 19, 48, 30, 23, 44, 7, 53, 28, 54, 16, 41, 29, 44, 18, 52, 24, 60, 15, 48, 7, 27, 59, 9, 34, 42, 54, 7, 63, 4, 46, 31, 27, 45, 0, 40, 26, 34, 17, 37, 10, 53, 29, 36, 50, 2, 27, 51, 11, 61, 37, 23, 41, 30, 7, 18, 50, 39, 14, 63, 32, 45, 61, 19, 30, 25, 44, 2, 47, 23, 63, 11, 34, 59, 37, 60, 3, 22, 14, 44, 30, 15, 0, 47, 15, 3, 38, 61, 20, 27, 45, 11, 39, 51, 16, 55, 3, 22, 54, 29, 58, 1, 57, 6, 29 },
+     { 9, 17, 60, 2, 34, 56, 20, 62, 39, 12, 49, 6, 29, 56, 34, 48, 0, 58, 22, 38, 18, 43, 56, 0, 63, 14, 55, 3, 59, 31, 15, 45, 0, 49, 6, 58, 3, 38, 12, 45, 0, 37, 29, 57, 13, 39, 30, 49, 0, 23, 44, 36, 16, 57, 13, 54, 11, 24, 63, 9, 53, 7, 62, 42, 0, 59, 15, 23, 63, 34, 40, 16, 32, 0, 53, 12, 48, 28, 59, 33, 0, 53, 9, 27, 3, 22, 54, 5, 56, 9, 61, 13, 42, 14, 52, 19, 0, 21, 47, 27, 53, 36, 3, 50, 39, 58, 25, 40, 53, 28, 12, 50, 0, 59, 32, 2, 21, 34, 26, 46, 37, 7, 18, 47, 24, 14, 53, 42 },
+     { 61, 32, 13, 54, 29, 7, 46, 13, 28, 57, 18, 41, 53, 15, 9, 39, 24, 49, 33, 3, 53, 9, 26, 32, 40, 28, 46, 39, 25, 9, 56, 21, 63, 37, 26, 22, 51, 27, 17, 56, 31, 53, 4, 43, 22, 46, 12, 18, 60, 40, 20, 26, 50, 21, 39, 5, 49, 33, 16, 44, 22, 46, 20, 32, 24, 45, 8, 43, 12, 46, 4, 48, 56, 20, 29, 58, 3, 40, 10, 42, 31, 21, 47, 41, 56, 38, 15, 42, 36, 27, 20, 33, 55, 3, 26, 44, 31, 54, 12, 35, 9, 63, 28, 10, 21, 32, 9, 60, 17, 8, 43, 29, 40, 16, 36, 48, 60, 7, 57, 14, 62, 31, 42, 15, 36, 40, 20, 26 },
+     { 0, 37, 47, 23, 41, 18, 32, 48, 1, 35, 8, 25, 4, 26, 63, 20, 54, 8, 16, 61, 35, 23, 51, 15, 58, 7, 12, 20, 50, 34, 42, 4, 38, 10, 32, 47, 8, 60, 41, 20, 9, 25, 50, 19, 62, 1, 37, 56, 28, 8, 53, 11, 3, 58, 34, 43, 19, 60, 38, 4, 58, 31, 3, 51, 11, 55, 38, 30, 21, 58, 19, 26, 9, 44, 36, 13, 46, 20, 62, 24, 13, 60, 5, 28, 12, 34, 7, 59, 0, 53, 45, 6, 38, 30, 50, 7, 62, 16, 41, 5, 46, 18, 55, 42, 51, 5, 45, 23, 34, 48, 19, 58, 5, 25, 54, 19, 13, 41, 28, 21, 0, 49, 10, 60, 4, 51, 9, 45 },
+     { 19, 28, 6, 58, 10, 51, 4, 22, 55, 42, 60, 45, 34, 51, 42, 5, 30, 45, 27, 40, 13, 47, 4, 49, 21, 38, 60, 29, 2, 57, 17, 27, 52, 19, 61, 14, 30, 34, 2, 44, 63, 33, 11, 35, 16, 51, 25, 6, 14, 47, 31, 61, 37, 29, 18, 8, 52, 2, 28, 54, 13, 41, 15, 62, 35, 18, 2, 60, 6, 33, 41, 61, 31, 6, 56, 17, 34, 50, 6, 52, 44, 35, 16, 51, 59, 24, 48, 18, 31, 40, 16, 49, 21, 60, 17, 39, 10, 49, 32, 57, 24, 39, 1, 25, 18, 62, 37, 12, 56, 1, 37, 11, 52, 44, 9, 30, 47, 4, 51, 40, 55, 25, 34, 27, 56, 30, 32, 54 },
+     { 63, 40, 49, 15, 43, 26, 63, 38, 16, 20, 30, 12, 57, 14, 19, 60, 36, 12, 59, 2, 57, 17, 42, 31, 1, 44, 16, 35, 47, 11, 32, 48, 13, 43, 1, 39, 51, 12, 57, 23, 6, 40, 53, 3, 55, 31, 39, 60, 35, 44, 5, 15, 45, 1, 62, 41, 26, 14, 47, 22, 36, 27, 50, 9, 26, 47, 52, 28, 54, 16, 1, 13, 51, 39, 23, 63, 1, 30, 15, 26, 2, 57, 19, 37, 1, 44, 21, 50, 13, 63, 8, 24, 56, 1, 35, 25, 58, 20, 2, 28, 14, 51, 33, 59, 13, 30, 4, 49, 31, 24, 63, 26, 33, 3, 58, 38, 62, 24, 32, 8, 17, 45, 5, 48, 18, 3, 43, 11 },
+     { 21, 4, 24, 34, 59, 1, 37, 11, 53, 5, 47, 2, 22, 40, 32, 1, 24, 50, 21, 29, 38, 25, 63, 8, 55, 24, 53, 6, 62, 23, 59, 3, 54, 20, 58, 24, 5, 46, 15, 38, 48, 14, 27, 42, 23, 7, 46, 10, 17, 58, 25, 52, 23, 32, 49, 12, 55, 30, 40, 7, 59, 1, 56, 21, 39, 4, 23, 15, 37, 46, 55, 42, 21, 4, 48, 8, 45, 54, 37, 55, 32, 8, 46, 10, 30, 54, 4, 41, 25, 29, 36, 48, 11, 43, 14, 47, 5, 43, 53, 36, 61, 10, 45, 6, 41, 54, 27, 43, 16, 55, 6, 46, 18, 42, 23, 15, 1, 45, 12, 60, 37, 22, 62, 12, 39, 59, 16, 52 },
+     { 47, 35, 56, 7, 19, 46, 31, 50, 33, 24, 61, 35, 50, 7, 53, 44, 55, 6, 46, 10, 52, 5, 21, 43, 36, 10, 18, 41, 26, 37, 8, 29, 40, 36, 9, 49, 34, 26, 61, 21, 7, 59, 18, 62, 29, 54, 20, 32, 51, 0, 40, 10, 55, 6, 20, 36, 9, 61, 5, 51, 44, 19, 33, 43, 13, 57, 40, 63, 8, 24, 29, 10, 60, 34, 27, 40, 25, 18, 10, 42, 21, 49, 26, 62, 38, 12, 33, 61, 5, 57, 2, 19, 54, 28, 62, 22, 38, 31, 16, 7, 22, 47, 29, 17, 35, 8, 20, 51, 2, 40, 22, 50, 13, 61, 28, 53, 35, 20, 56, 30, 2, 53, 14, 41, 23, 34, 8, 31 },
+     { 12, 2, 42, 29, 52, 13, 21, 8, 55, 14, 41, 17, 28, 58, 23, 11, 17, 36, 31, 62, 17, 34, 50, 14, 28, 61, 33, 52, 2, 51, 17, 45, 7, 25, 62, 30, 18, 55, 0, 42, 30, 35, 45, 1, 12, 48, 3, 63, 21, 36, 30, 48, 19, 59, 43, 27, 46, 17, 34, 25, 12, 29, 53, 6, 48, 31, 11, 34, 49, 3, 36, 50, 19, 47, 14, 61, 11, 36, 58, 4, 60, 14, 39, 22, 6, 52, 15, 35, 17, 46, 31, 42, 9, 34, 3, 52, 12, 60, 26, 56, 40, 2, 53, 23, 57, 38, 62, 14, 36, 59, 10, 31, 39, 6, 49, 9, 41, 26, 5, 48, 43, 27, 33, 58, 1, 50, 25, 57 },
+     { 61, 37, 15, 61, 3, 39, 58, 43, 26, 0, 44, 10, 47, 3, 37, 63, 28, 43, 13, 39, 3, 57, 30, 59, 0, 48, 5, 43, 13, 22, 60, 33, 55, 15, 42, 4, 52, 10, 45, 13, 54, 4, 24, 49, 37, 26, 41, 14, 42, 9, 61, 13, 38, 23, 3, 53, 0, 58, 21, 42, 63, 10, 17, 61, 25, 0, 58, 28, 17, 44, 57, 12, 27, 0, 55, 5, 52, 28, 23, 47, 29, 0, 43, 17, 58, 28, 47, 23, 55, 10, 58, 23, 51, 40, 18, 33, 45, 0, 49, 8, 32, 61, 19, 48, 0, 26, 7, 47, 29, 18, 44, 0, 56, 34, 20, 59, 15, 51, 37, 18, 10, 52, 7, 20, 46, 9, 38, 17 },
+     { 6, 27, 48, 23, 45, 29, 5, 18, 38, 62, 27, 56, 20, 32, 15, 9, 48, 0, 54, 22, 45, 20, 7, 41, 23, 39, 19, 27, 58, 31, 44, 0, 12, 50, 23, 56, 20, 39, 32, 59, 16, 52, 33, 9, 57, 22, 6, 58, 28, 50, 24, 2, 56, 35, 16, 45, 32, 38, 15, 54, 2, 38, 46, 22, 35, 45, 20, 5, 52, 25, 7, 35, 59, 32, 22, 43, 38, 3, 51, 16, 34, 53, 32, 50, 3, 40, 8, 43, 0, 39, 27, 4, 14, 61, 8, 55, 15, 41, 20, 44, 27, 13, 39, 11, 46, 42, 54, 33, 4, 52, 23, 61, 14, 25, 43, 2, 33, 11, 63, 29, 61, 17, 40, 55, 22, 62, 28, 44 },
+     { 20, 54, 8, 56, 35, 10, 63, 31, 52, 12, 48, 6, 59, 41, 52, 33, 19, 58, 25, 49, 11, 37, 47, 12, 54, 15, 56, 35, 7, 47, 16, 53, 28, 34, 5, 37, 28, 8, 48, 3, 28, 38, 18, 61, 16, 43, 53, 32, 4, 17, 47, 27, 44, 8, 63, 10, 25, 49, 6, 37, 24, 52, 32, 3, 50, 12, 41, 56, 38, 14, 62, 20, 40, 16, 53, 31, 18, 63, 41, 9, 59, 7, 13, 25, 57, 20, 63, 26, 53, 18, 48, 62, 30, 46, 21, 25, 58, 29, 36, 4, 55, 34, 6, 60, 31, 16, 21, 12, 58, 38, 9, 29, 47, 7, 52, 30, 57, 44, 22, 0, 35, 45, 3, 31, 14, 36, 0, 51 },
+     { 42, 14, 33, 24, 16, 49, 40, 2, 22, 33, 16, 36, 25, 1, 21, 61, 38, 8, 33, 4, 62, 26, 29, 60, 6, 46, 30, 11, 63, 4, 36, 40, 19, 57, 46, 11, 41, 63, 22, 25, 58, 10, 46, 2, 34, 27, 11, 38, 56, 34, 12, 53, 18, 33, 41, 51, 13, 28, 60, 20, 47, 14, 29, 59, 16, 62, 8, 22, 32, 47, 9, 49, 2, 44, 7, 12, 45, 6, 20, 27, 45, 24, 62, 42, 36, 11, 33, 15, 37, 7, 32, 10, 37, 1, 35, 50, 6, 11, 63, 24, 52, 15, 50, 24, 3, 37, 56, 27, 34, 22, 49, 16, 36, 62, 17, 39, 4, 15, 54, 24, 50, 8, 58, 26, 49, 54, 11, 30 },
+     { 4, 59, 41, 1, 53, 12, 25, 45, 59, 7, 51, 39, 54, 14, 46, 4, 27, 53, 16, 44, 18, 51, 1, 32, 25, 2, 50, 40, 20, 54, 24, 9, 62, 2, 27, 60, 1, 17, 36, 50, 6, 40, 30, 55, 41, 19, 49, 1, 21, 60, 40, 5, 62, 1, 22, 30, 57, 4, 43, 31, 1, 55, 40, 7, 27, 37, 30, 54, 1, 19, 42, 30, 56, 26, 62, 49, 24, 57, 37, 56, 2, 39, 16, 5, 30, 55, 3, 49, 60, 23, 56, 44, 17, 52, 13, 42, 28, 48, 18, 45, 9, 37, 21, 41, 58, 10, 48, 1, 63, 5, 41, 57, 2, 24, 12, 48, 27, 42, 32, 46, 13, 38, 19, 34, 5, 41, 25, 60 },
+     { 39, 28, 21, 46, 32, 57, 36, 9, 19, 42, 4, 29, 11, 43, 30, 49, 13, 42, 35, 56, 9, 39, 15, 52, 36, 61, 18, 26, 45, 14, 31, 48, 21, 43, 14, 33, 49, 54, 14, 44, 21, 62, 13, 23, 8, 62, 15, 51, 44, 7, 30, 37, 20, 42, 56, 7, 39, 18, 50, 11, 61, 9, 19, 43, 57, 2, 48, 11, 39, 60, 28, 4, 37, 17, 35, 1, 33, 11, 31, 14, 48, 19, 35, 51, 46, 21, 44, 29, 12, 41, 2, 22, 58, 26, 54, 4, 59, 38, 2, 33, 57, 1, 63, 13, 28, 51, 15, 40, 18, 45, 8, 30, 43, 37, 54, 19, 8, 59, 21, 6, 60, 29, 55, 10, 63, 15, 47, 17 },
+     { 3, 50, 10, 62, 18, 5, 27, 49, 60, 23, 55, 18, 62, 24, 56, 10, 59, 28, 2, 23, 34, 59, 43, 20, 10, 42, 8, 49, 1, 37, 57, 6, 51, 29, 53, 7, 23, 31, 5, 32, 51, 0, 35, 54, 45, 31, 5, 26, 36, 24, 55, 15, 48, 29, 14, 48, 26, 60, 21, 41, 36, 26, 50, 33, 14, 44, 17, 24, 52, 15, 46, 23, 54, 6, 47, 21, 60, 50, 4, 53, 29, 61, 8, 23, 1, 60, 19, 6, 53, 16, 47, 34, 6, 39, 16, 31, 12, 20, 53, 22, 30, 43, 25, 46, 35, 6, 44, 32, 53, 26, 55, 19, 11, 59, 5, 33, 51, 1, 35, 53, 25, 3, 42, 23, 44, 32, 7, 53 },
+     { 22, 44, 37, 6, 26, 51, 38, 0, 34, 13, 31, 46, 3, 37, 6, 19, 40, 21, 47, 63, 12, 5, 29, 55, 22, 58, 34, 28, 60, 22, 11, 41, 17, 38, 9, 44, 59, 39, 56, 19, 11, 47, 25, 15, 3, 39, 57, 17, 61, 11, 46, 3, 58, 9, 54, 35, 2, 34, 8, 45, 15, 56, 5, 23, 53, 33, 63, 35, 4, 59, 10, 51, 13, 61, 29, 41, 15, 25, 43, 19, 40, 10, 54, 33, 41, 12, 38, 51, 31, 26, 61, 9, 30, 45, 24, 62, 49, 40, 10, 61, 14, 49, 5, 17, 54, 20, 60, 23, 3, 13, 35, 50, 32, 23, 46, 27, 38, 63, 16, 12, 39, 48, 18, 51, 1, 27, 56, 35 },
+     { 63, 15, 30, 55, 43, 14, 57, 17, 53, 44, 7, 48, 26, 50, 32, 60, 0, 53, 14, 31, 50, 24, 46, 0, 38, 13, 4, 52, 16, 45, 30, 59, 0, 25, 55, 35, 16, 10, 26, 42, 58, 29, 60, 38, 50, 22, 28, 47, 0, 50, 28, 19, 33, 39, 11, 44, 16, 52, 24, 59, 3, 38, 27, 51, 0, 21, 7, 42, 26, 34, 21, 40, 33, 18, 39, 3, 54, 38, 8, 59, 0, 44, 27, 15, 58, 28, 57, 9, 43, 0, 36, 50, 20, 59, 8, 34, 0, 27, 47, 7, 36, 19, 56, 32, 0, 38, 11, 29, 62, 47, 6, 61, 0, 41, 14, 56, 10, 23, 45, 31, 57, 8, 36, 13, 58, 38, 11, 19 },
+     { 0, 34, 12, 47, 21, 2, 40, 30, 11, 25, 61, 20, 40, 15, 35, 22, 45, 36, 7, 41, 17, 57, 9, 48, 32, 62, 44, 24, 35, 3, 54, 13, 33, 63, 19, 4, 48, 22, 62, 2, 37, 8, 33, 6, 20, 52, 9, 32, 43, 13, 39, 63, 25, 4, 49, 23, 62, 32, 9, 30, 48, 18, 63, 12, 46, 29, 58, 13, 48, 8, 57, 31, 0, 51, 9, 58, 12, 22, 47, 29, 35, 22, 49, 5, 46, 4, 34, 20, 63, 24, 56, 11, 41, 3, 51, 19, 56, 35, 17, 58, 28, 42, 9, 45, 59, 26, 51, 42, 17, 36, 25, 15, 53, 21, 44, 3, 30, 55, 5, 50, 21, 28, 61, 32, 6, 49, 28, 46 },
+     { 58, 42, 60, 4, 31, 59, 22, 63, 35, 38, 9, 54, 1, 57, 8, 51, 16, 58, 27, 53, 3, 38, 30, 15, 27, 6, 19, 56, 10, 50, 21, 36, 47, 5, 43, 28, 51, 32, 13, 46, 18, 54, 16, 43, 63, 12, 36, 59, 22, 34, 5, 52, 17, 59, 27, 41, 0, 19, 55, 37, 13, 43, 6, 34, 41, 10, 36, 55, 19, 44, 3, 16, 58, 27, 49, 25, 32, 62, 17, 55, 13, 63, 18, 52, 25, 37, 17, 48, 13, 32, 5, 46, 28, 37, 14, 43, 25, 5, 51, 39, 3, 52, 33, 22, 8, 40, 12, 4, 57, 9, 46, 39, 28, 58, 13, 62, 17, 42, 19, 36, 0, 47, 16, 43, 24, 21, 54, 13 },
+     { 25, 9, 23, 50, 36, 8, 45, 14, 3, 51, 16, 28, 44, 12, 42, 29, 4, 26, 10, 47, 22, 61, 18, 54, 51, 39, 46, 13, 41, 26, 58, 7, 18, 39, 12, 57, 15, 1, 52, 27, 41, 23, 48, 1, 27, 45, 18, 2, 57, 26, 55, 8, 43, 31, 6, 58, 14, 51, 40, 5, 61, 31, 24, 54, 17, 60, 22, 1, 39, 30, 53, 45, 36, 13, 43, 5, 45, 2, 37, 6, 34, 42, 2, 39, 10, 62, 7, 54, 40, 18, 60, 15, 52, 21, 63, 8, 55, 46, 15, 30, 23, 13, 62, 16, 50, 24, 58, 31, 48, 21, 34, 2, 49, 7, 31, 37, 26, 48, 9, 61, 40, 11, 52, 2, 60, 40, 4, 37 },
+     { 52, 28, 39, 16, 54, 19, 29, 55, 42, 20, 58, 33, 24, 63, 18, 55, 39, 62, 43, 34, 12, 40, 6, 35, 2, 25, 8, 62, 34, 1, 31, 42, 61, 27, 53, 24, 40, 61, 34, 8, 59, 4, 30, 56, 40, 6, 53, 42, 10, 48, 16, 37, 12, 46, 21, 36, 47, 11, 28, 45, 22, 10, 57, 2, 49, 31, 14, 44, 61, 11, 25, 6, 23, 63, 18, 36, 28, 56, 20, 51, 11, 48, 27, 56, 32, 22, 45, 30, 2, 42, 27, 39, 1, 44, 23, 31, 38, 22, 11, 61, 43, 54, 4, 47, 35, 2, 44, 16, 28, 54, 12, 62, 18, 43, 10, 52, 1, 58, 33, 15, 29, 56, 20, 34, 9, 30, 48, 17 },
+     { 46, 2, 56, 11, 41, 1, 49, 6, 27, 47, 2, 48, 5, 32, 37, 3, 13, 19, 32, 1, 55, 28, 60, 17, 43, 59, 32, 20, 49, 16, 55, 23, 14, 46, 2, 36, 6, 30, 20, 49, 12, 47, 35, 14, 21, 60, 29, 14, 35, 24, 46, 1, 56, 29, 53, 8, 33, 23, 56, 1, 35, 46, 20, 39, 26, 4, 53, 28, 17, 38, 60, 34, 48, 9, 55, 15, 46, 7, 41, 31, 60, 24, 16, 36, 1, 59, 19, 52, 35, 6, 55, 11, 59, 33, 7, 57, 4, 29, 48, 1, 19, 26, 37, 30, 18, 63, 37, 6, 59, 1, 40, 24, 56, 33, 46, 22, 35, 7, 24, 53, 39, 5, 26, 45, 55, 18, 62, 7 },
+     { 20, 60, 29, 34, 20, 62, 33, 52, 10, 36, 13, 60, 41, 21, 50, 27, 56, 49, 8, 51, 21, 45, 11, 48, 8, 23, 53, 3, 29, 44, 5, 52, 9, 32, 50, 17, 43, 56, 3, 38, 24, 10, 62, 25, 51, 9, 33, 49, 61, 7, 30, 62, 22, 19, 2, 42, 63, 5, 49, 18, 60, 15, 52, 7, 43, 56, 23, 50, 5, 50, 2, 20, 41, 30, 1, 52, 22, 61, 14, 26, 3, 43, 53, 7, 47, 28, 11, 14, 23, 58, 33, 25, 47, 13, 50, 17, 40, 54, 34, 60, 41, 6, 59, 14, 50, 7, 25, 55, 20, 42, 51, 8, 27, 4, 16, 60, 28, 50, 44, 3, 22, 49, 63, 12, 33, 1, 43, 31 },
+     { 36, 5, 46, 8, 44, 24, 13, 39, 25, 57, 31, 18, 8, 52, 10, 45, 6, 30, 36, 24, 63, 4, 33, 26, 57, 40, 15, 56, 37, 12, 40, 25, 37, 58, 11, 63, 21, 45, 16, 60, 31, 53, 18, 33, 3, 45, 23, 0, 20, 54, 40, 15, 50, 38, 60, 16, 25, 42, 29, 38, 7, 41, 25, 62, 18, 33, 8, 35, 42, 16, 32, 56, 12, 39, 59, 19, 34, 9, 49, 38, 57, 12, 21, 50, 14, 40, 61, 44, 50, 9, 49, 19, 3, 29, 35, 62, 12, 24, 7, 18, 52, 32, 10, 46, 21, 41, 32, 11, 36, 29, 14, 34, 60, 38, 54, 11, 41, 14, 19, 57, 32, 16, 7, 41, 51, 25, 14, 57 },
+     { 53, 18, 26, 50, 15, 58, 4, 63, 17, 43, 7, 40, 61, 35, 15, 41, 23, 60, 16, 38, 14, 42, 19, 50, 0, 31, 10, 46, 27, 63, 18, 60, 0, 20, 29, 39, 8, 26, 37, 5, 42, 0, 44, 39, 57, 17, 58, 41, 28, 37, 4, 32, 9, 44, 12, 31, 54, 10, 59, 14, 27, 53, 12, 36, 0, 47, 13, 63, 21, 58, 10, 24, 50, 27, 4, 26, 44, 53, 31, 0, 18, 42, 29, 33, 57, 4, 32, 26, 0, 38, 16, 61, 41, 53, 20, 0, 42, 44, 49, 27, 10, 56, 39, 0, 57, 15, 53, 49, 3, 61, 22, 47, 17, 5, 49, 26, 2, 63, 39, 10, 47, 27, 37, 23, 4, 59, 38, 10 },
+     { 23, 39, 61, 3, 37, 28, 48, 31, 0, 34, 51, 23, 2, 26, 58, 0, 53, 11, 46, 1, 57, 29, 52, 14, 37, 61, 21, 35, 2, 49, 7, 34, 47, 55, 4, 33, 54, 13, 58, 52, 19, 50, 22, 7, 13, 29, 36, 11, 51, 17, 60, 25, 55, 4, 34, 51, 0, 35, 20, 48, 32, 3, 51, 30, 59, 28, 40, 3, 46, 29, 54, 43, 7, 62, 47, 11, 39, 4, 23, 46, 55, 8, 63, 5, 25, 37, 18, 46, 21, 56, 31, 5, 36, 8, 45, 58, 26, 15, 2, 36, 47, 21, 29, 44, 25, 34, 3, 27, 43, 10, 52, 0, 45, 30, 24, 36, 43, 18, 34, 59, 0, 52, 61, 15, 44, 19, 30, 49 },
+     { 0, 27, 12, 43, 54, 9, 22, 53, 21, 46, 15, 55, 29, 47, 20, 33, 39, 28, 59, 35, 9, 44, 5, 24, 47, 7, 52, 17, 56, 22, 30, 42, 14, 26, 45, 18, 49, 1, 24, 34, 11, 27, 55, 32, 61, 47, 2, 56, 6, 44, 13, 47, 36, 27, 58, 22, 16, 47, 40, 4, 57, 38, 21, 45, 16, 9, 56, 26, 11, 38, 0, 22, 36, 17, 33, 57, 16, 30, 62, 15, 35, 40, 20, 45, 59, 10, 54, 8, 63, 13, 52, 27, 22, 57, 28, 12, 32, 51, 55, 22, 63, 4, 16, 54, 12, 62, 45, 19, 58, 13, 32, 40, 20, 56, 7, 57, 9, 54, 6, 29, 42, 21, 8, 55, 35, 47, 6, 41 },
+     { 56, 33, 58, 32, 19, 35, 42, 6, 59, 11, 38, 5, 49, 12, 62, 7, 52, 17, 5, 25, 54, 20, 61, 31, 54, 27, 41, 11, 44, 5, 59, 12, 36, 51, 10, 61, 28, 41, 48, 9, 43, 63, 5, 40, 20, 8, 49, 26, 34, 21, 58, 1, 18, 45, 7, 39, 61, 26, 8, 50, 23, 10, 63, 5, 55, 37, 19, 49, 52, 15, 59, 47, 13, 54, 1, 25, 42, 58, 10, 48, 3, 27, 50, 1, 17, 48, 34, 41, 16, 40, 2, 45, 10, 39, 17, 61, 5, 38, 19, 9, 41, 31, 60, 38, 5, 23, 36, 8, 30, 55, 24, 63, 12, 48, 14, 51, 31, 20, 45, 25, 12, 50, 32, 2, 28, 11, 62, 14 },
+     { 44, 16, 7, 48, 1, 62, 16, 50, 27, 33, 61, 25, 17, 44, 31, 14, 22, 43, 32, 48, 18, 40, 8, 36, 3, 16, 33, 62, 23, 38, 25, 53, 2, 21, 41, 6, 22, 15, 59, 29, 16, 37, 26, 15, 52, 42, 23, 15, 54, 39, 10, 30, 53, 11, 49, 24, 2, 43, 55, 17, 34, 44, 15, 31, 24, 44, 2, 32, 7, 35, 25, 5, 40, 45, 29, 51, 6, 21, 37, 52, 24, 60, 13, 31, 53, 23, 2, 28, 49, 24, 31, 60, 20, 51, 1, 34, 48, 14, 59, 33, 50, 1, 18, 33, 48, 60, 17, 51, 39, 6, 38, 2, 35, 29, 40, 23, 1, 62, 15, 53, 37, 17, 46, 57, 40, 51, 24, 22 },
+     { 5, 37, 52, 24, 45, 13, 40, 3, 45, 9, 19, 42, 56, 4, 37, 46, 56, 2, 63, 11, 51, 1, 49, 13, 59, 45, 39, 1, 48, 15, 58, 9, 46, 31, 54, 35, 57, 38, 3, 46, 56, 4, 47, 57, 1, 30, 38, 63, 3, 46, 28, 63, 41, 14, 33, 62, 19, 32, 13, 28, 61, 1, 53, 42, 11, 60, 22, 62, 27, 42, 61, 31, 19, 8, 61, 12, 32, 55, 2, 18, 33, 12, 43, 36, 9, 62, 30, 55, 6, 58, 35, 7, 43, 29, 54, 23, 43, 30, 3, 25, 11, 45, 52, 28, 7, 14, 42, 1, 22, 50, 16, 53, 19, 59, 4, 46, 33, 41, 4, 35, 58, 5, 26, 13, 20, 2, 34, 54 },
+     { 30, 63, 21, 10, 26, 55, 29, 59, 23, 39, 53, 1, 36, 24, 59, 27, 10, 34, 23, 38, 30, 60, 22, 42, 28, 19, 9, 57, 30, 19, 43, 33, 13, 63, 3, 19, 11, 50, 31, 20, 14, 34, 10, 35, 17, 59, 7, 31, 19, 25, 50, 5, 20, 57, 29, 6, 52, 41, 4, 46, 20, 37, 26, 17, 49, 6, 39, 18, 53, 14, 3, 49, 57, 23, 34, 48, 14, 41, 28, 38, 56, 6, 58, 25, 39, 19, 43, 15, 37, 11, 47, 18, 53, 4, 37, 9, 62, 21, 53, 40, 57, 24, 13, 40, 56, 26, 47, 31, 59, 25, 45, 27, 10, 43, 21, 61, 13, 27, 48, 9, 23, 43, 31, 62, 38, 59, 9, 47 },
+     { 25, 4, 40, 60, 34, 6, 18, 36, 8, 57, 12, 30, 49, 14, 6, 54, 41, 16, 50, 6, 43, 15, 34, 4, 53, 24, 50, 35, 4, 51, 7, 55, 28, 24, 39, 44, 60, 7, 25, 62, 42, 53, 24, 61, 28, 45, 52, 12, 48, 37, 9, 35, 43, 3, 37, 48, 12, 58, 30, 52, 9, 59, 6, 57, 33, 29, 48, 4, 37, 45, 20, 34, 10, 39, 0, 60, 22, 45, 8, 63, 21, 42, 14, 49, 3, 56, 11, 46, 21, 61, 0, 42, 25, 13, 63, 17, 36, 8, 46, 16, 6, 35, 63, 0, 21, 37, 4, 57, 9, 34, 5, 61, 48, 32, 8, 37, 54, 17, 56, 30, 60, 0, 50, 16, 7, 29, 42, 17 },
+     { 32, 50, 15, 48, 2, 43, 52, 25, 47, 16, 32, 63, 21, 52, 40, 19, 0, 61, 29, 58, 20, 56, 26, 46, 12, 55, 6, 22, 62, 32, 17, 40, 0, 49, 34, 8, 27, 32, 48, 0, 21, 39, 5, 44, 12, 6, 22, 40, 0, 57, 16, 60, 23, 17, 54, 22, 36, 15, 24, 39, 19, 34, 47, 23, 0, 54, 13, 51, 24, 9, 55, 16, 52, 27, 44, 20, 4, 54, 26, 49, 0, 30, 46, 16, 29, 51, 34, 4, 52, 28, 33, 15, 57, 39, 26, 49, 0, 56, 27, 31, 48, 20, 43, 29, 53, 11, 46, 19, 41, 13, 55, 18, 0, 57, 26, 51, 2, 44, 6, 38, 14, 40, 22, 45, 36, 53, 3, 57 },
+     { 44, 12, 37, 28, 22, 57, 11, 38, 0, 51, 9, 41, 4, 29, 11, 47, 33, 45, 12, 26, 3, 36, 9, 63, 31, 16, 38, 44, 14, 47, 25, 61, 20, 58, 15, 47, 17, 57, 13, 36, 9, 51, 18, 29, 50, 36, 54, 20, 61, 27, 32, 13, 53, 44, 9, 27, 0, 63, 45, 2, 56, 10, 14, 43, 41, 28, 58, 11, 35, 60, 30, 41, 6, 63, 11, 51, 37, 32, 15, 10, 35, 53, 5, 61, 22, 7, 26, 59, 23, 9, 44, 48, 21, 3, 51, 32, 24, 41, 12, 61, 2, 55, 9, 15, 35, 58, 28, 15, 62, 30, 37, 23, 42, 29, 11, 17, 35, 24, 63, 20, 52, 28, 8, 55, 11, 23, 47, 19 },
+     { 0, 56, 8, 53, 14, 31, 61, 20, 55, 28, 62, 18, 35, 60, 25, 57, 7, 23, 39, 54, 47, 17, 43, 0, 40, 59, 29, 2, 56, 10, 37, 5, 43, 11, 29, 52, 1, 23, 54, 41, 59, 30, 55, 1, 62, 15, 33, 4, 43, 10, 47, 39, 1, 31, 40, 60, 49, 33, 7, 55, 26, 50, 31, 61, 8, 18, 21, 32, 44, 1, 25, 47, 18, 36, 30, 23, 59, 7, 40, 59, 27, 19, 38, 32, 44, 54, 40, 17, 38, 60, 27, 6, 35, 55, 10, 14, 44, 5, 50, 17, 38, 26, 42, 50, 18, 3, 44, 52, 2, 49, 7, 52, 15, 46, 62, 39, 55, 10, 31, 48, 3, 58, 33, 18, 61, 34, 13, 59 },
+     { 39, 27, 63, 20, 35, 41, 4, 45, 26, 5, 38, 13, 44, 2, 50, 17, 37, 52, 2, 13, 28, 58, 24, 51, 21, 8, 34, 48, 27, 42, 18, 51, 31, 56, 5, 36, 38, 44, 4, 17, 26, 11, 38, 23, 42, 8, 56, 39, 24, 51, 5, 56, 21, 59, 14, 6, 18, 42, 22, 35, 16, 37, 3, 25, 39, 46, 63, 5, 50, 17, 58, 8, 55, 3, 50, 12, 43, 17, 47, 2, 51, 9, 62, 12, 1, 35, 13, 50, 1, 37, 12, 51, 19, 29, 46, 59, 22, 58, 33, 45, 22, 60, 10, 32, 61, 39, 8, 33, 25, 36, 20, 60, 38, 4, 21, 5, 28, 45, 12, 18, 42, 11, 49, 1, 27, 40, 6, 30 },
+     { 24, 16, 42, 1, 50, 10, 48, 17, 33, 43, 24, 48, 21, 55, 31, 42, 10, 21, 63, 35, 49, 6, 33, 13, 41, 53, 10, 20, 60, 6, 53, 26, 12, 41, 22, 60, 14, 28, 63, 33, 49, 3, 45, 16, 48, 26, 14, 46, 18, 30, 35, 26, 8, 50, 29, 51, 25, 57, 12, 47, 53, 9, 62, 20, 54, 2, 36, 15, 40, 28, 33, 13, 38, 24, 46, 1, 29, 56, 33, 20, 44, 24, 41, 26, 57, 20, 63, 8, 30, 55, 5, 41, 62, 8, 34, 2, 37, 10, 19, 6, 37, 1, 53, 23, 5, 27, 58, 22, 43, 12, 50, 26, 9, 34, 54, 32, 49, 1, 59, 37, 22, 46, 25, 36, 51, 15, 54, 46 },
+     { 52, 7, 45, 33, 26, 58, 14, 60, 7, 54, 3, 58, 8, 34, 14, 5, 59, 30, 18, 44, 8, 22, 48, 62, 3, 26, 55, 38, 23, 16, 39, 1, 62, 24, 49, 9, 53, 19, 46, 7, 19, 60, 31, 58, 2, 34, 53, 7, 59, 2, 62, 42, 46, 19, 36, 11, 44, 4, 38, 28, 1, 43, 32, 51, 12, 29, 56, 22, 52, 2, 62, 49, 22, 60, 14, 35, 63, 5, 25, 57, 14, 53, 4, 46, 18, 31, 42, 22, 47, 20, 58, 31, 16, 43, 23, 54, 30, 42, 52, 57, 29, 49, 30, 13, 45, 48, 16, 55, 6, 63, 1, 44, 14, 58, 19, 47, 15, 24, 51, 34, 6, 55, 5, 63, 20, 41, 21, 9 },
+     { 30, 62, 18, 55, 5, 23, 39, 29, 49, 30, 15, 36, 28, 46, 60, 25, 39, 46, 4, 32, 61, 40, 15, 30, 36, 45, 14, 2, 49, 33, 57, 45, 18, 32, 3, 45, 30, 2, 35, 52, 40, 27, 13, 21, 38, 63, 20, 28, 37, 23, 16, 10, 13, 55, 2, 62, 21, 32, 60, 17, 58, 23, 5, 40, 16, 48, 7, 45, 10, 26, 43, 19, 6, 31, 52, 21, 39, 16, 48, 9, 37, 28, 36, 55, 7, 48, 3, 59, 15, 45, 25, 1, 53, 13, 47, 7, 62, 15, 4, 25, 12, 41, 18, 60, 38, 11, 34, 19, 39, 31, 29, 56, 23, 42, 3, 27, 60, 41, 8, 16, 61, 29, 43, 9, 32, 2, 60, 34 },
+     { 3, 38, 13, 37, 52, 44, 2, 19, 12, 42, 63, 19, 40, 1, 20, 50, 12, 55, 15, 56, 27, 1, 54, 11, 57, 18, 32, 63, 44, 4, 29, 13, 37, 61, 35, 16, 42, 57, 12, 22, 6, 55, 43, 10, 50, 5, 44, 11, 48, 52, 34, 58, 28, 41, 38, 30, 7, 52, 11, 49, 30, 14, 45, 27, 59, 34, 21, 38, 32, 58, 11, 36, 56, 42, 9, 41, 3, 54, 31, 42, 0, 60, 16, 11, 39, 24, 52, 33, 6, 36, 10, 40, 32, 60, 26, 20, 39, 28, 47, 34, 63, 8, 54, 3, 24, 56, 0, 51, 13, 47, 16, 40, 7, 35, 52, 11, 36, 4, 57, 30, 39, 13, 18, 50, 58, 28, 12, 48 },
+     { 57, 24, 49, 21, 10, 31, 61, 36, 56, 0, 22, 53, 11, 56, 32, 7, 36, 27, 41, 9, 46, 19, 34, 42, 25, 7, 50, 9, 28, 21, 54, 8, 50, 7, 27, 59, 10, 25, 48, 62, 37, 0, 33, 58, 25, 18, 32, 61, 0, 15, 45, 5, 50, 3, 23, 55, 47, 17, 40, 6, 60, 34, 53, 8, 41, 0, 61, 13, 54, 4, 46, 28, 0, 17, 48, 27, 58, 13, 23, 61, 33, 21, 50, 30, 62, 8, 14, 29, 56, 27, 61, 49, 17, 2, 44, 11, 51, 0, 59, 17, 40, 20, 32, 47, 36, 21, 42, 28, 60, 4, 54, 10, 59, 17, 30, 62, 21, 43, 26, 48, 0, 56, 36, 25, 8, 44, 39, 17 },
+     { 10, 42, 4, 59, 27, 47, 8, 23, 51, 32, 45, 6, 37, 26, 48, 43, 62, 0, 21, 53, 38, 12, 51, 5, 60, 47, 24, 37, 59, 15, 35, 47, 22, 55, 0, 50, 21, 40, 6, 29, 15, 52, 24, 8, 41, 55, 13, 29, 40, 56, 24, 31, 19, 33, 61, 15, 0, 35, 24, 42, 21, 2, 19, 57, 24, 15, 30, 50, 20, 25, 40, 16, 57, 34, 61, 8, 29, 45, 6, 49, 11, 47, 2, 44, 19, 57, 38, 50, 12, 42, 21, 4, 35, 52, 28, 56, 23, 36, 13, 45, 4, 52, 27, 14, 6, 62, 9, 45, 21, 37, 25, 46, 33, 49, 0, 44, 7, 53, 13, 19, 53, 31, 3, 47, 15, 56, 22, 51 },
+     { 35, 28, 53, 32, 1, 16, 54, 40, 9, 17, 25, 58, 14, 59, 3, 22, 16, 51, 31, 5, 23, 58, 28, 17, 35, 20, 0, 42, 11, 52, 3, 31, 41, 17, 43, 13, 32, 54, 18, 60, 32, 45, 17, 49, 2, 36, 51, 22, 7, 36, 9, 63, 48, 12, 46, 26, 43, 28, 63, 13, 48, 37, 51, 33, 5, 47, 55, 9, 42, 63, 7, 51, 24, 12, 37, 19, 55, 34, 18, 38, 15, 28, 54, 34, 5, 43, 22, 0, 48, 14, 54, 24, 58, 9, 38, 5, 32, 55, 21, 30, 49, 9, 59, 43, 30, 51, 35, 26, 7, 53, 2, 22, 14, 27, 57, 18, 38, 24, 33, 45, 10, 41, 20, 60, 37, 5, 32, 0 },
+     { 63, 19, 15, 40, 62, 35, 14, 28, 46, 61, 4, 49, 35, 10, 29, 54, 33, 8, 45, 62, 37, 1, 43, 55, 10, 52, 61, 30, 19, 40, 25, 62, 11, 38, 27, 58, 36, 3, 46, 8, 39, 4, 62, 28, 47, 20, 4, 54, 47, 27, 43, 1, 21, 38, 8, 58, 10, 54, 4, 56, 9, 26, 12, 39, 60, 27, 18, 37, 1, 31, 35, 5, 45, 50, 2, 43, 26, 1, 59, 23, 56, 40, 7, 26, 58, 17, 32, 63, 25, 39, 7, 31, 45, 19, 63, 15, 48, 8, 37, 61, 16, 34, 1, 56, 18, 3, 15, 58, 49, 32, 63, 41, 55, 5, 40, 22, 50, 6, 59, 2, 63, 23, 52, 11, 26, 61, 44, 23 },
+     { 11, 56, 46, 6, 22, 43, 58, 3, 34, 21, 38, 30, 18, 44, 52, 13, 41, 57, 17, 28, 14, 49, 25, 7, 33, 39, 26, 6, 56, 48, 1, 20, 56, 5, 46, 9, 19, 51, 30, 25, 56, 21, 35, 14, 57, 42, 16, 33, 10, 57, 17, 59, 41, 25, 53, 37, 20, 40, 30, 18, 31, 62, 44, 22, 3, 44, 11, 48, 23, 53, 18, 60, 29, 22, 62, 15, 53, 47, 10, 41, 3, 19, 52, 36, 13, 46, 10, 35, 3, 61, 41, 16, 1, 50, 26, 42, 18, 46, 2, 25, 54, 20, 39, 23, 47, 31, 41, 12, 38, 17, 8, 19, 31, 48, 12, 61, 9, 54, 29, 35, 15, 38, 6, 43, 34, 14, 7, 47 },
+     { 39, 2, 33, 26, 53, 8, 18, 50, 41, 12, 53, 1, 63, 24, 19, 39, 2, 24, 47, 10, 60, 38, 19, 63, 48, 4, 15, 45, 32, 14, 60, 36, 29, 53, 23, 63, 34, 12, 61, 1, 43, 11, 53, 30, 1, 26, 60, 45, 23, 39, 3, 29, 12, 50, 4, 16, 51, 3, 45, 36, 50, 1, 16, 54, 35, 14, 57, 30, 58, 9, 46, 14, 41, 10, 32, 38, 4, 30, 21, 51, 32, 63, 25, 1, 60, 27, 53, 18, 51, 22, 28, 55, 34, 12, 40, 3, 60, 29, 57, 41, 6, 44, 11, 53, 8, 61, 24, 57, 1, 28, 44, 59, 36, 3, 34, 25, 41, 31, 16, 44, 22, 47, 28, 58, 1, 49, 54, 29 },
+     { 58, 25, 50, 13, 38, 30, 60, 24, 6, 57, 27, 42, 9, 45, 6, 61, 30, 50, 4, 34, 29, 3, 46, 13, 22, 42, 58, 28, 9, 39, 23, 44, 7, 15, 44, 2, 40, 15, 47, 41, 23, 37, 7, 59, 38, 11, 34, 6, 62, 14, 52, 35, 55, 19, 32, 61, 33, 24, 57, 6, 22, 59, 29, 7, 49, 25, 40, 3, 17, 39, 27, 52, 0, 55, 16, 57, 24, 61, 36, 6, 29, 12, 48, 39, 20, 44, 6, 40, 33, 5, 48, 10, 57, 36, 22, 51, 33, 9, 24, 12, 62, 29, 50, 35, 14, 43, 5, 33, 47, 52, 13, 23, 10, 51, 56, 16, 46, 1, 49, 4, 61, 9, 52, 18, 31, 21, 36, 17 },
+     { 19, 42, 9, 48, 2, 44, 11, 37, 48, 20, 33, 16, 55, 35, 49, 15, 37, 20, 59, 16, 53, 22, 56, 31, 50, 11, 34, 54, 16, 51, 4, 49, 33, 53, 21, 28, 56, 24, 31, 9, 52, 16, 48, 24, 44, 13, 51, 20, 31, 49, 18, 6, 34, 2, 44, 14, 47, 8, 15, 43, 13, 41, 33, 52, 20, 61, 7, 51, 34, 62, 4, 20, 36, 33, 43, 8, 46, 13, 53, 17, 45, 42, 9, 31, 52, 11, 30, 56, 13, 59, 17, 44, 27, 6, 62, 11, 43, 17, 49, 38, 26, 2, 16, 27, 58, 21, 54, 18, 26, 5, 35, 61, 43, 27, 7, 39, 14, 58, 37, 55, 20, 33, 13, 40, 62, 10, 55, 5 },
+     { 51, 14, 61, 29, 59, 20, 55, 31, 0, 49, 11, 60, 3, 26, 22, 56, 0, 40, 12, 43, 41, 8, 36, 0, 17, 57, 24, 2, 46, 26, 61, 18, 0, 38, 12, 59, 6, 49, 3, 57, 19, 63, 5, 33, 18, 54, 28, 56, 0, 43, 26, 46, 63, 27, 56, 22, 27, 54, 38, 28, 63, 24, 10, 45, 0, 31, 42, 21, 12, 25, 44, 49, 59, 6, 26, 50, 3, 34, 27, 59, 0, 35, 62, 16, 4, 58, 47, 0, 43, 24, 37, 2, 54, 20, 46, 31, 0, 56, 34, 5, 55, 45, 60, 37, 0, 40, 10, 38, 63, 46, 15, 20, 0, 53, 21, 62, 30, 11, 24, 27, 40, 0, 57, 26, 3, 45, 27, 35 }
+};
+
+static always_inline void
+_soft16_convert_from_rgba_pt(const DATA32 *src, DATA16 *dst, DATA8 *alpha,
+                            const int x, const int y)
+{
+   DATA8 orig_r, orig_g, orig_b, orig_a;
+
+   orig_r = R_VAL(src);
+   orig_g = G_VAL(src);
+   orig_b = B_VAL(src);
+   orig_a = A_VAL(src);
+
+   if (orig_a == 255)
+     {
+       DATA8 dith5, dith6, dith, r, g, b;
+
+       dith = dither_table[x & S16_DM_MSK][y & S16_DM_MSK];
+       dith5 = dith >> S16_DM_SHF(5);
+       dith6 = dith >> S16_DM_SHF(6);
+
+       r = orig_r >> 3;
+       g = orig_g >> 2;
+       b = orig_b >> 3;
+
+       if (((orig_r - (r << 3)) >= dith5) && (r < 0x1f)) r++;
+       if (((orig_g - (g << 2)) >= dith6) && (g < 0x3f)) g++;
+       if (((orig_b - (b << 3)) >= dith5) && (b < 0x1f)) b++;
+
+       *dst = (r << 11) | (g << 5) | b;
+       *alpha = 31;
+     }
+   else if (orig_a == 0)
+     {
+       *dst = 0;
+       *alpha = 0;
+     }
+   else
+     {
+       DATA8 r, g, b, a;
+       r = orig_r >> 3;
+       g = orig_g >> 2;
+       b = orig_b >> 3;
+       a = (orig_a >> 3) + 1;
+
+       *dst = (r << 11) | (g << 5) | b;
+       *alpha = a;
+     }
+}
+
+static inline void
+_soft16_convert_from_rgba_scanline(const DATA32 *src, DATA16 *dst,
+                                  DATA8 *alpha, const int y, const int w)
+{
+   int x, m;
+
+   m = (w & ~7);
+   x = 0;
+   pld(src, 0);
+
+   while (x < m)
+     {
+       pld(src, 32);
+       UNROLL8({
+          _soft16_convert_from_rgba_pt(src, dst, alpha, x, y);
+          src++;
+          dst++;
+          alpha++;
+          x++;
+       });
+     }
+
+   for (; x < w; x++, src++, dst++, alpha++)
+     _soft16_convert_from_rgba_pt(src, dst, alpha, x, y);
+}
+
+void
+soft16_image_convert_from_rgba(Soft16_Image *im, const DATA32 *src)
+{
+   const DATA32 *sp;
+   DATA16 *dp;
+   DATA8 *ap;
+   int y;
+
+   sp = src;
+   dp = im->pixels;
+   ap = im->alpha;
+
+   for (y = 0; y < im->cache_entry.h; y++, sp += im->cache_entry.w, dp += im->stride, ap += im->stride)
+     _soft16_convert_from_rgba_scanline(sp, dp, ap, y, im->cache_entry.w);
+}
+
+static always_inline void
+_soft16_convert_from_rgb_pt(const DATA32 *src, DATA16 *dst,
+                           const int x, const int y)
+{
+   DATA8 orig_r, orig_g, orig_b, r, g, b, dith5, dith6, dith;
+
+   orig_r = R_VAL(src);
+   orig_g = G_VAL(src);
+   orig_b = B_VAL(src);
+
+   r = orig_r >> 3;
+   g = orig_g >> 2;
+   b = orig_b >> 3;
+
+   dith = dither_table[x & S16_DM_MSK][y & S16_DM_MSK];
+   dith5 = dith >> S16_DM_SHF(5);
+   dith6 = dith >> S16_DM_SHF(6);
+
+   if (((orig_r - (r << 3)) >= dith5) && (r < 0x1f)) r++;
+   if (((orig_g - (g << 2)) >= dith6) && (g < 0x3f)) g++;
+   if (((orig_b - (b << 3)) >= dith5) && (b < 0x1f)) b++;
+
+   *dst = (r << 11) | (g << 5) | b;
+}
+
+static inline void
+_soft16_convert_from_rgb_scanline(const DATA32 *src, DATA16 *dst, const int y,
+                                 const int w)
+{
+   int x, m;
+
+   m = (w & ~7);
+   x = 0;
+   pld(src, 0);
+
+   while (x < m)
+     {
+       pld(src, 32);
+       UNROLL8({
+          _soft16_convert_from_rgb_pt(src, dst, x, y);
+          src++;
+          dst++;
+          x++;
+       });
+     }
+
+   for (; x < w; x++, src++, dst++)
+     _soft16_convert_from_rgb_pt(src, dst, x, y);
+}
+
+void
+soft16_image_convert_from_rgb(Soft16_Image *im, const DATA32 *src)
+{
+   const DATA32 *sp;
+   DATA16 *dp;
+   int y;
+
+   sp = src;
+   dp = im->pixels;
+
+   for (y = 0; y < im->cache_entry.h; y++, sp += im->cache_entry.w, dp += im->stride)
+     _soft16_convert_from_rgb_scanline(sp, dp, y, im->cache_entry.w);
+}
diff --git a/src/lib/engines/common_16/evas_soft16_font.c b/src/lib/engines/common_16/evas_soft16_font.c
new file mode 100644 (file)
index 0000000..c39ef31
--- /dev/null
@@ -0,0 +1,295 @@
+#include "evas_common_soft16.h"
+
+static always_inline void
+_glyph_pt_mask_solid_solid(DATA16 *dst,
+                          const DATA16 rgb565,
+                          const DATA32 rgb565_unpack,
+                          const DATA8 *mask)
+{
+   DATA8 alpha = *mask >> 3;
+
+   if (alpha == 31) *dst = rgb565;
+   else if (alpha > 0)
+     {
+       DATA32 d;
+
+       d = RGB_565_UNPACK(*dst);
+       d = RGB_565_UNPACKED_BLEND_UNMUL(rgb565_unpack, d, alpha);
+       *dst = RGB_565_PACK(d);
+     }
+}
+
+static void
+_glyph_scanline_mask_solid_solid(DATA16 *dst,
+                                int size,
+                                const DATA16 rgb565,
+                                const DATA32 rgb565_unpack,
+                                const DATA8 *mask)
+{
+   DATA16 *start, *end;
+
+   start = dst;
+   pld(start, 0);
+   pld(mask, 0);
+   end = start + (size & ~3);
+
+   while (start < end)
+     {
+       pld(start, 16);
+       pld(mask, 4);
+       UNROLL4({
+          _glyph_pt_mask_solid_solid(start, rgb565, rgb565_unpack, mask);
+          start++;
+          mask++;
+       });
+     }
+
+   end = start + (size & 3);
+   for (; start < end; start++, mask++)
+      _glyph_pt_mask_solid_solid(start, rgb565, rgb565_unpack, mask);
+}
+
+static always_inline void
+_glyph_pt_mask_transp_solid(DATA16 *dst,
+                           DATA32 rgb565_unpack,
+                           DATA8 alpha,
+                           const DATA8 *mask)
+{
+   DATA32 a, b;
+   int rel_alpha;
+
+   rel_alpha = *mask >> 3;
+   alpha = (alpha * rel_alpha) >> 5;
+   if (alpha == 0)
+     return;
+
+   alpha++;
+
+   a = ((rgb565_unpack * rel_alpha) >> 5) & RGB_565_UNPACKED_MASK;
+   b = RGB_565_UNPACK(*dst);
+   b = RGB_565_UNPACKED_BLEND(a, b, alpha);
+   *dst = RGB_565_PACK(b);
+}
+
+static void
+_glyph_scanline_mask_transp_solid(DATA16 *dst,
+                                 int size,
+                                 const DATA32 rgb565_unpack,
+                                 const DATA8 rel_alpha,
+                                 const DATA8 *mask)
+{
+   DATA16 *start, *end;
+
+   start = dst;
+   pld(start, 0);
+   pld(mask, 0);
+   end = start + (size & ~3);
+
+   while (start < end)
+     {
+       pld(start, 16);
+       pld(mask, 4);
+       UNROLL4({
+          _glyph_pt_mask_transp_solid(start, rgb565_unpack, rel_alpha, mask);
+          start++;
+          mask++;
+       });
+     }
+
+   end = start + (size & 3);
+   for (; start < end; start++, mask++)
+      _glyph_pt_mask_transp_solid(start, rgb565_unpack, rel_alpha, mask);
+}
+
+static inline void
+_calc_ext(const Soft16_Image *dst, const RGBA_Draw_Context *dc,
+         Eina_Rectangle *ext)
+{
+   EINA_RECTANGLE_SET(ext, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
+
+   if (dc->clip.use)
+     {
+       int v;
+
+       EINA_RECTANGLE_SET(ext, dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h);
+       if (ext->x < 0)
+         {
+            ext->w += ext->x;
+            ext->x = 0;
+         }
+       if (ext->y < 0)
+         {
+            ext->h += ext->y;
+            ext->y = 0;
+         }
+
+       v = dst->cache_entry.w - ext->x;
+       if (ext->w > v) ext->w = v;
+
+       v = dst->cache_entry.h - ext->y;
+       if (ext->h > v) ext->h = v;
+     }
+}
+
+static inline void
+_glyph_scanline(Soft16_Image *dst, const DATA8 *p_mask,
+               const Eina_Rectangle ext, int dx, int dy, int max_x, int max_y,
+               int w, DATA8 alpha, const DATA16 rgb565,
+               const DATA32 rgb565_unpack)
+{
+   int size, in_x, in_w;
+   DATA16 *p_pixels;
+
+   if ((dx >= max_x) || (dy < ext.y) || (dy >= max_y)) return;
+
+   in_x = 0;
+   in_w = 0;
+
+   if (dx + w > max_x) in_w += (dx + w) - max_x;
+
+   if (dx < ext.x)
+     {
+       in_w += ext.x - dx;
+       in_x = ext.x - dx;
+       dx = ext.x;
+     }
+
+   size = w - in_w;
+   p_pixels = dst->pixels + (dy * dst->stride) + dx;
+   p_mask += in_x;
+
+   if (size > 1)
+     {
+       if (alpha == 31)
+          _glyph_scanline_mask_solid_solid
+              (p_pixels, size, rgb565, rgb565_unpack, p_mask);
+       else if (alpha != 0)
+          _glyph_scanline_mask_transp_solid
+              (p_pixels, size, rgb565_unpack, alpha, p_mask);
+     }
+   else if (size == 1)
+     {
+       if (alpha == 31)
+          _glyph_pt_mask_solid_solid(p_pixels, rgb565, rgb565_unpack, p_mask);
+       else if (alpha != 0)
+          _glyph_pt_mask_transp_solid(p_pixels, rgb565_unpack, alpha, p_mask);
+     }
+}
+
+static void
+_soft16_font_glyph_draw_grayscale(Soft16_Image *dst,
+                                 RGBA_Draw_Context *dc __UNUSED__, RGBA_Font_Glyph *fg __UNUSED__,
+                                 int x, int y, DATA8 alpha, DATA16 rgb565,
+                                 const Eina_Rectangle ext, int bw, int bh,
+                                 int bpitch, const DATA8 *bitmap)
+{
+   const DATA32 rgb565_unpack = RGB_565_UNPACK(rgb565);
+   int i, max_x, max_y;
+
+   max_x = ext.x + ext.w;
+   max_y = ext.y + ext.h;
+
+   for (i = 0; i < bh; i++, bitmap += bpitch)
+      _glyph_scanline(dst, bitmap, ext, x, y + i, max_x, max_y, bw,
+                     alpha, rgb565, rgb565_unpack);
+}
+
+static inline void
+_glyph_create_mask_line(DATA8 *mask, const DATA8 *bitmap, int w)
+{
+   const DATA8 bitrepl[2] = {0x0, 0xff};
+   int i;
+
+   for (i = 0; i < w; i += 8, bitmap++)
+     {
+       int j, size;
+       DATA32 bits;
+
+       if (i + 8 < w) size = 8;
+       else           size = w - i;
+
+       bits = *bitmap;
+
+       for (j = size - 1; j >= 0; j--, mask++)
+         *mask = bitrepl[(bits >> j) & 0x1];
+     }
+}
+
+static void
+_soft16_font_glyph_draw_mono(Soft16_Image *dst,
+                            RGBA_Draw_Context *dc __UNUSED__, RGBA_Font_Glyph *fg __UNUSED__,
+                            int x, int y, DATA8 alpha, DATA16 rgb565,
+                            const Eina_Rectangle ext, int bw, int bh,
+                            int bpitch, const DATA8 *bitmap)
+{
+   const DATA32 rgb565_unpack = RGB_565_UNPACK(rgb565);
+   DATA8 *mask;
+   int i, max_x, max_y;
+
+   max_x = ext.x + ext.w;
+   max_y = ext.y + ext.h;
+
+   mask = alloca(bpitch);
+   for (i = 0; i < bh; i++, bitmap += bpitch)
+     {
+       _glyph_create_mask_line(mask, bitmap, bw);
+       _glyph_scanline(dst, mask, ext, x, y + i, max_x, max_y, bw,
+                       alpha, rgb565, rgb565_unpack);
+     }
+}
+
+void
+soft16_font_glyph_draw(void *data, void *dest __UNUSED__, void *context,
+                      RGBA_Font_Glyph *fg, int x, int y)
+{
+   Soft16_Image *dst;
+   RGBA_Draw_Context *dc;
+   const DATA8 *bitmap;
+   DATA8 alpha, r, g, b;
+   DATA16 rgb565;
+   Eina_Rectangle ext;
+   int bpitch, bw, bh;
+
+   dst = data;
+   dc = context;
+
+   alpha = A_VAL(&dc->col.col) >> 3;
+   if (alpha == 0) return; /* precision is 5 bits, 3 bits lost */
+
+   r = R_VAL(&dc->col.col) >> 3;
+   g = G_VAL(&dc->col.col) >> 2;
+   b = B_VAL(&dc->col.col) >> 3;
+
+   if (r > alpha) r = alpha;
+   if (g > (alpha << 1)) g = (alpha << 1);
+   if (b > alpha) b = alpha;
+
+   rgb565 = (r << 11) | (g << 5) | b;
+
+   bitmap = fg->glyph_out->bitmap.buffer;
+   bh = fg->glyph_out->bitmap.rows;
+   bw = fg->glyph_out->bitmap.width;
+   bpitch = fg->glyph_out->bitmap.pitch;
+   if (bpitch < bw) bpitch = bw;
+
+   _calc_ext(dst, dc, &ext);
+
+   if ((fg->glyph_out->bitmap.num_grays == 256) &&
+       (fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays))
+      _soft16_font_glyph_draw_grayscale(dst, dc, fg, x, y, alpha, rgb565,
+                                       ext, bw, bh, bpitch, bitmap);
+   else
+      _soft16_font_glyph_draw_mono(dst, dc, fg, x, y, alpha, rgb565,
+                                  ext, bw, bh, bpitch, bitmap);
+}
+
+void *
+soft16_font_glyph_new(void *data __UNUSED__, RGBA_Font_Glyph *fg __UNUSED__)
+{
+   return (void *)1; /* core requires != NULL to work */
+}
+
+void
+soft16_font_glyph_free(void *ext_dat __UNUSED__)
+{
+}
diff --git a/src/lib/engines/common_16/evas_soft16_image_scaled_sampled.c b/src/lib/engines/common_16/evas_soft16_image_scaled_sampled.c
new file mode 100644 (file)
index 0000000..b5b07d6
--- /dev/null
@@ -0,0 +1,471 @@
+#include "evas_common_soft16.h"
+#include "evas_soft16_point_blend.c"
+
+static void
+_soft16_image_draw_scaled_solid_solid(Soft16_Image *src,
+                                     Soft16_Image *dst,
+                                     RGBA_Draw_Context *dc __UNUSED__,
+                                     int dst_offset, int w, int h,
+                                     int *offset_x, int *offset_y)
+{
+   DATA16 *dst_itr;
+   int y, w_align;
+
+   w_align = w & ~7;
+
+   dst_itr = dst->pixels + dst_offset;
+   for (y = 0; y < h; y++, dst_itr += dst->stride)
+     {
+       DATA16 *d, *s;
+       int x;
+
+       s = src->pixels + offset_y[y];
+       pld(s, 0);
+       pld(offset_x, 0);
+
+       d = dst_itr;
+       x = 0;
+       while (x < w_align)
+         {
+            pld(s, 32);
+            pld(offset_x + x, 32);
+
+            UNROLL8({
+               _soft16_pt_blend_solid_solid(d, s[offset_x[x]]);
+               x++;
+               d++;
+            });
+         }
+
+       for (; x < w; x++, d++)
+         _soft16_pt_blend_solid_solid(d, s[offset_x[x]]);
+     }
+}
+static void
+_soft16_image_draw_scaled_transp_solid(Soft16_Image *src,
+                                      Soft16_Image *dst,
+                                      RGBA_Draw_Context *dc __UNUSED__,
+                                      int dst_offset, int w, int h,
+                                      int *offset_x, int *offset_y)
+{
+   DATA16 *dst_itr;
+   int y, w_align;
+
+   w_align = w & ~7;
+
+   dst_itr = dst->pixels + dst_offset;
+   for (y = 0; y < h; y++, dst_itr += dst->stride)
+     {
+       DATA16 *d, *s;
+       DATA8 *a;
+       int x;
+
+       s = src->pixels + offset_y[y];
+       a = src->alpha + offset_y[y];
+       pld(s, 0);
+       pld(a, 0);
+       pld(offset_x, 0);
+
+       d = dst_itr;
+       x = 0;
+       while (x < w_align)
+         {
+            pld(s, 32);
+            pld(a, 8);
+            pld(offset_x + x, 32);
+
+            UNROLL8({
+               int off_x = offset_x[x];
+               _soft16_pt_blend_transp_solid(d, s[off_x], a[off_x]);
+               x++;
+               d++;
+            });
+         }
+
+       for (; x < w; x++, d++)
+         _soft16_pt_blend_transp_solid(d, s[offset_x[x]], a[offset_x[x]]);
+     }
+}
+
+static inline void
+_soft16_image_draw_scaled_no_mul(Soft16_Image *src, Soft16_Image *dst,
+                                RGBA_Draw_Context *dc,
+                                int dst_offset, int w, int h,
+                                int *offset_x, int *offset_y)
+{
+   if ((src->cache_entry.flags.alpha && src->alpha) && 
+       (!dst->cache_entry.flags.alpha))
+      _soft16_image_draw_scaled_transp_solid
+       (src, dst, dc, dst_offset, w, h, offset_x, offset_y);
+   else if (!dst->cache_entry.flags.alpha)
+      _soft16_image_draw_scaled_solid_solid
+       (src, dst, dc, dst_offset, w, h, offset_x, offset_y);
+   else
+      ERR("Unsupported draw of scaled images src->cache_entry.flags.alpha=%d, "
+              "dst->cache_entry.flags.alpha=%d, WITHOUT COLOR MUL",
+              src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha);
+}
+
+static void
+_soft16_image_draw_scaled_solid_solid_mul_alpha(Soft16_Image *src,
+                                               Soft16_Image *dst,
+                                               RGBA_Draw_Context *dc __UNUSED__,
+                                               int dst_offset, int w, int h,
+                                               int *offset_x, int *offset_y,
+                                               DATA8 alpha)
+{
+   DATA16 *dst_itr;
+   int y, w_align;
+
+   w_align = w & ~7;
+
+   dst_itr = dst->pixels + dst_offset;
+   for (y = 0; y < h; y++, dst_itr += dst->stride)
+     {
+       DATA16 *d, *s;
+       int x;
+
+       s = src->pixels + offset_y[y];
+       pld(s, 0);
+       pld(offset_x, 0);
+
+       d = dst_itr;
+       x = 0;
+       while (x < w_align)
+         {
+            pld(s, 32);
+            pld(offset_x + x, 32);
+
+            UNROLL8({
+               _soft16_pt_blend_solid_solid_mul_alpha
+                 (d, s[offset_x[x]], alpha);
+               x++;
+               d++;
+            });
+         }
+
+       for (; x < w; x++, d++)
+         _soft16_pt_blend_solid_solid_mul_alpha
+           (d, s[offset_x[x]], alpha);
+     }
+}
+
+static void
+_soft16_image_draw_scaled_transp_solid_mul_alpha(Soft16_Image *src,
+                                                Soft16_Image *dst,
+                                                RGBA_Draw_Context *dc __UNUSED__,
+                                                int dst_offset, int w, int h,
+                                                int *offset_x, int *offset_y,
+                                                DATA8 alpha)
+{
+   DATA16 *dst_itr;
+   int y, w_align;
+
+   w_align = w & ~7;
+
+   dst_itr = dst->pixels + dst_offset;
+   for (y = 0; y < h; y++, dst_itr += dst->stride)
+     {
+       DATA16 *d, *s;
+       DATA8 *a;
+       int x;
+
+       s = src->pixels + offset_y[y];
+       a = src->alpha + offset_y[y];
+       pld(s, 0);
+       pld(a, 0);
+       pld(offset_x, 0);
+
+       d = dst_itr;
+       x = 0;
+       while (x < w_align)
+         {
+            pld(s, 32);
+            pld(a, 8);
+            pld(offset_x + x, 32);
+
+            UNROLL8({
+               int off_x = offset_x[x];
+               _soft16_pt_blend_transp_solid_mul_alpha
+                 (d, s[off_x], a[off_x], alpha);
+               x++;
+               d++;
+            });
+         }
+
+       for (; x < w; x++, d++)
+         _soft16_pt_blend_transp_solid_mul_alpha
+           (d, s[offset_x[x]], a[offset_x[x]], alpha);
+     }
+}
+
+static inline void
+_soft16_image_draw_scaled_mul_alpha(Soft16_Image *src, Soft16_Image *dst,
+                                   RGBA_Draw_Context *dc,
+                                   int dst_offset, int w, int h,
+                                   int *offset_x, int *offset_y, DATA8 a)
+{
+   if ((src->cache_entry.flags.alpha && src->alpha) && 
+       (!dst->cache_entry.flags.alpha))
+      _soft16_image_draw_scaled_transp_solid_mul_alpha
+         (src, dst, dc, dst_offset, w, h, offset_x, offset_y, a);
+   else if (!dst->cache_entry.flags.alpha)
+      _soft16_image_draw_scaled_solid_solid_mul_alpha
+         (src, dst, dc, dst_offset, w, h, offset_x, offset_y, a);
+   else
+     ERR("Unsupported draw of scaled images src->cache_entry.flags.alpha=%d, "
+          "dst->cache_entry.flags.alpha=%d, WITH ALPHA MUL %d",
+          src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha, A_VAL(&dc->mul.col));
+}
+
+static void
+_soft16_image_draw_scaled_solid_solid_mul_color(Soft16_Image *src,
+                                               Soft16_Image *dst,
+                                               RGBA_Draw_Context *dc __UNUSED__,
+                                               int dst_offset, int w, int h,
+                                               int *offset_x, int *offset_y,
+                                               DATA8 r, DATA8 g, DATA8 b,
+                                               DATA8 alpha)
+{
+   DATA16 *dst_itr;
+   int y, w_align;
+
+   w_align = w & ~7;
+
+   dst_itr = dst->pixels + dst_offset;
+
+   if (alpha == 31)
+     for (y = 0; y < h; y++, dst_itr += dst->stride)
+       {
+         DATA16 *d, *s;
+         int x;
+
+         s = src->pixels + offset_y[y];
+         pld(s, 0);
+         pld(offset_x, 0);
+
+         d = dst_itr;
+         x = 0;
+         while (x < w_align)
+           {
+              pld(s, 32);
+              pld(offset_x + x, 32);
+
+              UNROLL8({
+                 _soft16_pt_blend_solid_solid_mul_color_solid
+                   (d, s[offset_x[x]], r, g, b);
+                 x++;
+                 d++;
+              });
+           }
+
+         for (; x < w; x++, d++)
+           _soft16_pt_blend_solid_solid_mul_color_solid
+             (d, s[offset_x[x]], r, g, b);
+       }
+   else
+     for (y = 0; y < h; y++, dst_itr += dst->stride)
+       {
+         DATA16 *d, *s;
+         int x;
+
+         s = src->pixels + offset_y[y];
+         pld(s, 0);
+         pld(offset_x, 0);
+
+         d = dst_itr;
+         x = 0;
+         while (x < w_align)
+           {
+              pld(s, 32);
+              pld(offset_x + x, 32);
+
+              UNROLL8({
+                 _soft16_pt_blend_solid_solid_mul_color_transp
+                   (d, s[offset_x[x]], alpha, r, g, b);
+                 x++;
+                 d++;
+              });
+           }
+
+         for (; x < w; x++, d++)
+           _soft16_pt_blend_solid_solid_mul_color_transp
+             (d, s[offset_x[x]], alpha, r, g, b);
+       }
+}
+
+static void
+_soft16_image_draw_scaled_transp_solid_mul_color(Soft16_Image *src,
+                                                Soft16_Image *dst,
+                                                RGBA_Draw_Context *dc __UNUSED__,
+                                                int dst_offset, int w, int h,
+                                                int *offset_x, int *offset_y,
+                                                DATA8 r, DATA8 g, DATA8 b,
+                                                DATA8 alpha)
+{
+   DATA16 *dst_itr;
+   int y, w_align;
+
+   w_align = w & ~7;
+
+   dst_itr = dst->pixels + dst_offset;
+
+   if (alpha == 31)
+     for (y = 0; y < h; y++, dst_itr += dst->stride)
+       {
+         DATA16 *d, *s;
+         DATA8 *a;
+         int x;
+
+         s = src->pixels + offset_y[y];
+         a = src->alpha + offset_y[y];
+         pld(s, 0);
+         pld(a, 0);
+         pld(offset_x, 0);
+
+         d = dst_itr;
+         x = 0;
+         while (x < w_align)
+           {
+              pld(s, 32);
+              pld(a, 8);
+              pld(offset_x + x, 32);
+
+              UNROLL8({
+                 int off_x = offset_x[x];
+                 _soft16_pt_blend_transp_solid_mul_color_solid
+                   (d, s[off_x], a[off_x], r, g, b);
+                 x++;
+                 d++;
+              });
+           }
+
+         for (; x < w; x++, d++)
+           _soft16_pt_blend_transp_solid_mul_color_solid
+             (d, s[offset_x[x]], a[offset_x[x]], r, g, b);
+       }
+   else
+     for (y = 0; y < h; y++, dst_itr += dst->stride)
+       {
+         DATA16 *d, *s;
+         DATA8 *a;
+         int x;
+
+         s = src->pixels + offset_y[y];
+         a = src->alpha + offset_y[y];
+         pld(s, 0);
+         pld(a, 0);
+         pld(offset_x, 0);
+
+         d = dst_itr;
+         x = 0;
+         while (x < w_align)
+           {
+              pld(s, 32);
+              pld(a, 8);
+              pld(offset_x + x, 32);
+
+              UNROLL8({
+                 int off_x = offset_x[x];
+                 _soft16_pt_blend_transp_solid_mul_color_transp
+                   (d, s[off_x], a[off_x], alpha, r, g, b);
+                 x++;
+                 d++;
+              });
+           }
+
+         for (; x < w; x++, d++)
+           _soft16_pt_blend_transp_solid_mul_color_transp
+             (d, s[offset_x[x]], a[offset_x[x]], alpha, r, g, b);
+       }
+}
+
+static inline void
+_soft16_image_draw_scaled_mul_color(Soft16_Image *src, Soft16_Image *dst,
+                                   RGBA_Draw_Context *dc,
+                                   int dst_offset, int w, int h,
+                                   int *offset_x, int *offset_y,
+                                   DATA8 r, DATA8 g, DATA8 b, DATA8 a)
+{
+   if ((src->cache_entry.flags.alpha && src->alpha) && 
+       (!dst->cache_entry.flags.alpha))
+      _soft16_image_draw_scaled_transp_solid_mul_color
+         (src, dst, dc, dst_offset, w, h, offset_x, offset_y, r, g, b, a);
+   else if (!dst->cache_entry.flags.alpha)
+      _soft16_image_draw_scaled_solid_solid_mul_color
+         (src, dst, dc, dst_offset, w, h, offset_x, offset_y, r, g, b, a);
+   else
+      ERR("Unsupported draw of scaled images src->cache_entry.flags.alpha=%d, "
+              "dst->cache_entry.flags.alpha=%d, WITH COLOR MUL 0x%08x",
+              src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha, dc->mul.col);
+}
+
+static inline void
+_soft16_image_draw_scaled_mul(Soft16_Image *src, Soft16_Image *dst,
+                             RGBA_Draw_Context *dc,
+                             int dst_offset, int w, int h,
+                             int *offset_x, int *offset_y, DATA8 r, DATA8 g,
+                             DATA8 b, DATA8 a)
+{
+   if ((a == r) && (a == (g >> 1)) && (a == b))
+      _soft16_image_draw_scaled_mul_alpha
+       (src, dst, dc, dst_offset, w, h, offset_x, offset_y, a);
+   else
+      _soft16_image_draw_scaled_mul_color
+       (src, dst, dc, dst_offset, w, h, offset_x, offset_y, r, g, b, a);
+}
+
+void
+soft16_image_draw_scaled_sampled(Soft16_Image *src, Soft16_Image *dst,
+                                RGBA_Draw_Context *dc,
+                                const Eina_Rectangle sr,
+                                const Eina_Rectangle dr,
+                                const Eina_Rectangle cr)
+{
+   int x, y, dst_offset, *offset_x, *offset_y;
+   DATA16 mul_rgb565;
+   DATA8 r, g, b, a;
+
+   if (!dc->mul.use)
+     {
+       r = b = a = 31;
+       g = 63;
+       mul_rgb565 = 0xffff;
+     }
+   else
+     {
+       a = A_VAL(&dc->mul.col) >> 3;
+       if (a == 0)
+         return;
+
+       r = R_VAL(&dc->mul.col) >> 3;
+       g = G_VAL(&dc->mul.col) >> 2;
+       b = B_VAL(&dc->mul.col) >> 3;
+
+       if (r > a) r = a;
+       if (g > (a << 1)) g = (a << 1);
+       if (b > a) b = a;
+
+       mul_rgb565 = (r << 11) || (g << 5) | b;
+     }
+
+   /* pre-calculated scale tables */
+   offset_x = alloca(cr.w * sizeof(*offset_x));
+   for (x = 0; x < cr.w; x++)
+     offset_x[x] = (((x + cr.x - dr.x) * sr.w) / dr.w) + sr.x;
+
+   offset_y = alloca(cr.h * sizeof(*offset_y));
+   for (y = 0; y < cr.h; y++)
+     offset_y[y] = (((((y + cr.y - dr.y) * sr.h) / dr.h) + sr.y)
+                   * src->stride);
+
+   dst_offset = cr.x + (cr.y * dst->stride);
+
+
+   if (mul_rgb565 == 0xffff)
+     _soft16_image_draw_scaled_no_mul
+       (src, dst, dc, dst_offset, cr.w, cr.h, offset_x, offset_y);
+   else
+     _soft16_image_draw_scaled_mul
+       (src, dst, dc, dst_offset, cr.w, cr.h, offset_x, offset_y, r, g, b, a);
+}
diff --git a/src/lib/engines/common_16/evas_soft16_image_unscaled.c b/src/lib/engines/common_16/evas_soft16_image_unscaled.c
new file mode 100644 (file)
index 0000000..b7a428d
--- /dev/null
@@ -0,0 +1,287 @@
+#include "evas_common_soft16.h"
+#include "evas_soft16_scanline_blend.c"
+
+static void
+_soft16_image_draw_unscaled_solid_solid(Soft16_Image *src, Soft16_Image *dst,
+                                       RGBA_Draw_Context *dc __UNUSED__,
+                                       int src_offset, int dst_offset,
+                                       int w, int h)
+{
+   DATA16 *src_itr, *dst_itr;
+   int y;
+
+   src_itr = src->pixels + src_offset;
+   dst_itr = dst->pixels + dst_offset;
+
+   for (y = 0; y < h; y++)
+     {
+       _soft16_scanline_blend_solid_solid(src_itr, dst_itr, w);
+       src_itr += src->stride;
+       dst_itr += dst->stride;
+     }
+}
+
+static void
+_soft16_image_draw_unscaled_transp_solid(Soft16_Image *src, Soft16_Image *dst,
+                                        RGBA_Draw_Context *dc __UNUSED__,
+                                        int src_offset, int dst_offset,
+                                        int w, int h)
+
+{
+   DATA16 *src_itr, *dst_itr;
+   DATA8 *alpha_itr;
+   int y;
+
+   src_itr = src->pixels + src_offset;
+   alpha_itr = src->alpha + src_offset;
+   dst_itr = dst->pixels + dst_offset;
+
+   for (y = 0; y < h; y++)
+     {
+       _soft16_scanline_blend_transp_solid(src_itr, alpha_itr, dst_itr, w);
+       src_itr += src->stride;
+       alpha_itr += src->stride;
+       dst_itr += dst->stride;
+     }
+}
+
+static inline void
+_soft16_image_draw_unscaled_no_mul(Soft16_Image *src, Soft16_Image *dst,
+                                   RGBA_Draw_Context *dc,
+                                   int src_offset, int dst_offset,
+                                   int width, int height)
+{
+   if (src->cache_entry.flags.alpha && (!dst->cache_entry.flags.alpha))
+      _soft16_image_draw_unscaled_transp_solid(src, dst, dc,
+                                               src_offset, dst_offset,
+                                               width, height);
+   else if ((!src->cache_entry.flags.alpha) && (!dst->cache_entry.flags.alpha))
+      _soft16_image_draw_unscaled_solid_solid(src, dst, dc,
+                                              src_offset, dst_offset,
+                                              width, height);
+   else
+     ERR("Unsupported draw of unscaled images src->cache_entry.flags.alpha=%d, "
+              "dst->cache_entry.flags.alpha=%d, WITHOUT COLOR MUL",
+              src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha);
+}
+
+static void
+_soft16_image_draw_unscaled_solid_solid_mul_alpha(Soft16_Image *src,
+                                                  Soft16_Image *dst,
+                                                  RGBA_Draw_Context *dc __UNUSED__,
+                                                  int src_offset,
+                                                  int dst_offset,
+                                                  int w, int h, DATA8 a)
+{
+   DATA16 *src_itr, *dst_itr;
+   int y;
+
+   src_itr = src->pixels + src_offset;
+   dst_itr = dst->pixels + dst_offset;
+
+   for (y = 0; y < h; y++)
+     {
+       _soft16_scanline_blend_solid_solid_mul_alpha(src_itr, dst_itr, w, a);
+       src_itr += src->stride;
+       dst_itr += dst->stride;
+     }
+}
+
+static void
+_soft16_image_draw_unscaled_transp_solid_mul_alpha(Soft16_Image *src,
+                                                   Soft16_Image *dst,
+                                                   RGBA_Draw_Context *dc __UNUSED__,
+                                                   int src_offset,
+                                                   int dst_offset,
+                                                   int w, int h, DATA8 a)
+
+{
+   DATA16 *src_itr, *dst_itr;
+   DATA8 *alpha_itr;
+   int y;
+
+   src_itr = src->pixels + src_offset;
+   alpha_itr = src->alpha + src_offset;
+   dst_itr = dst->pixels + dst_offset;
+
+   for (y = 0; y < h; y++)
+     {
+       _soft16_scanline_blend_transp_solid_mul_alpha(src_itr, alpha_itr,
+                                                      dst_itr, w, a);
+       src_itr += src->stride;
+       alpha_itr += src->stride;
+       dst_itr += dst->stride;
+     }
+}
+
+static inline void
+_soft16_image_draw_unscaled_mul_alpha(Soft16_Image *src, Soft16_Image *dst,
+                                      RGBA_Draw_Context *dc,
+                                      int src_offset, int dst_offset,
+                                      int width, int height, DATA8 a)
+{
+   if (src->cache_entry.flags.alpha && (!dst->cache_entry.flags.alpha))
+      _soft16_image_draw_unscaled_transp_solid_mul_alpha
+         (src, dst, dc, src_offset, dst_offset, width, height, a);
+   else if ((!src->cache_entry.flags.alpha) && (!dst->cache_entry.flags.alpha))
+      _soft16_image_draw_unscaled_solid_solid_mul_alpha
+         (src, dst, dc, src_offset, dst_offset, width, height, a);
+   else
+     ERR("Unsupported draw of unscaled images src->cache_entry.flags.alpha=%d, "
+              "dst->cache_entry.flags.alpha=%d, WITH ALPHA MUL %d",
+              src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha, A_VAL(&dc->mul.col));
+}
+
+static void
+_soft16_image_draw_unscaled_solid_solid_mul_color(Soft16_Image *src,
+                                                  Soft16_Image *dst,
+                                                  RGBA_Draw_Context *dc __UNUSED__,
+                                                  int src_offset,
+                                                  int dst_offset,
+                                                  int w, int h, DATA8 r,
+                                                 DATA8 g, DATA8 b, DATA8 a)
+{
+   DATA16 *src_itr, *dst_itr;
+   int y;
+
+   src_itr = src->pixels + src_offset;
+   dst_itr = dst->pixels + dst_offset;
+
+   if (a == 31)
+      for (y = 0; y < h; y++)
+         {
+            _soft16_scanline_blend_solid_solid_mul_color_solid
+               (src_itr, dst_itr, w, r, g, b);
+            src_itr += src->stride;
+            dst_itr += dst->stride;
+         }
+   else
+      for (y = 0; y < h; y++)
+         {
+            _soft16_scanline_blend_solid_solid_mul_color_transp
+               (src_itr, dst_itr, w, a, r, g, b);
+            src_itr += src->stride;
+            dst_itr += dst->stride;
+         }
+}
+
+static void
+_soft16_image_draw_unscaled_transp_solid_mul_color(Soft16_Image *src,
+                                                   Soft16_Image *dst,
+                                                   RGBA_Draw_Context *dc __UNUSED__,
+                                                   int src_offset,
+                                                   int dst_offset,
+                                                   int w, int h, DATA8 r,
+                                                  DATA8 g, DATA8 b, DATA8 a)
+
+{
+   DATA16 *src_itr, *dst_itr;
+   DATA8 *alpha_itr;
+   int y;
+
+   src_itr = src->pixels + src_offset;
+   alpha_itr = src->alpha + src_offset;
+   dst_itr = dst->pixels + dst_offset;
+
+   if (a == 31)
+      for (y = 0; y < h; y++)
+         {
+            _soft16_scanline_blend_transp_solid_mul_color_solid
+               (src_itr, alpha_itr, dst_itr, w, r, g, b);
+            src_itr += src->stride;
+            alpha_itr += src->stride;
+            dst_itr += dst->stride;
+         }
+   else
+      for (y = 0; y < h; y++)
+         {
+            _soft16_scanline_blend_transp_solid_mul_color_transp
+               (src_itr, alpha_itr, dst_itr, w, a, r, g, b);
+            src_itr += src->stride;
+            alpha_itr += src->stride;
+            dst_itr += dst->stride;
+         }
+}
+
+static inline void
+_soft16_image_draw_unscaled_mul_color(Soft16_Image *src, Soft16_Image *dst,
+                                      RGBA_Draw_Context *dc,
+                                      int src_offset, int dst_offset,
+                                      int width, int height,
+                                     DATA8 r, DATA8 g, DATA8 b, DATA8 a)
+{
+   if (src->cache_entry.flags.alpha && (!dst->cache_entry.flags.alpha))
+     _soft16_image_draw_unscaled_transp_solid_mul_color
+       (src, dst, dc, src_offset, dst_offset, width, height, r, g, b, a);
+   else if ((!src->cache_entry.flags.alpha) && (!dst->cache_entry.flags.alpha))
+     _soft16_image_draw_unscaled_solid_solid_mul_color
+       (src, dst, dc, src_offset, dst_offset, width, height, r, g, b, a);
+   else
+     ERR("Unsupported draw of unscaled images src->cache_entry.flags.alpha=%d, "
+              "dst->cache_entry.flags.alpha=%d, WITH COLOR MUL 0x%08x",
+              src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha, dc->mul.col);
+}
+
+static inline void
+_soft16_image_draw_unscaled_mul(Soft16_Image *src, Soft16_Image *dst,
+                                RGBA_Draw_Context *dc,
+                                int src_offset, int dst_offset,
+                                int width, int height, DATA8 r, DATA8 g,
+                               DATA8 b, DATA8 a)
+{
+   if ((a == r) && (a == (g >> 1)) && (a == b))
+      _soft16_image_draw_unscaled_mul_alpha(src, dst, dc, src_offset,
+                                            dst_offset, width, height, a);
+   else
+      _soft16_image_draw_unscaled_mul_color(src, dst, dc, src_offset,
+                                            dst_offset, width, height,
+                                           r, g, b, a);
+}
+
+void
+soft16_image_draw_unscaled(Soft16_Image *src, Soft16_Image *dst,
+                          RGBA_Draw_Context *dc,
+                          const Eina_Rectangle sr,
+                          const Eina_Rectangle dr,
+                          const Eina_Rectangle cr)
+{
+   int src_offset_rows, src_offset, dst_offset;
+   DATA16 mul_rgb565;
+   DATA8 r, g, b, a;
+
+   if (!dc->mul.use)
+     {
+       r = b = a = 31;
+       g = 63;
+       mul_rgb565 = 0xffff;
+     }
+   else
+     {
+       a = A_VAL(&dc->mul.col) >> 3;
+       if (a == 0)
+         return;
+
+       r = R_VAL(&dc->mul.col) >> 3;
+       g = G_VAL(&dc->mul.col) >> 2;
+       b = B_VAL(&dc->mul.col) >> 3;
+
+       if (r > a) r = a;
+       if (g > (a << 1)) g = (a << 1);
+       if (b > a) b = a;
+
+       mul_rgb565 = (r << 11) || (g << 5) | b;
+     }
+
+
+   src_offset_rows = (cr.y - dr.y) + sr.y;
+   src_offset = (src_offset_rows * src->stride) + (cr.x - dr.x) + sr.x;
+
+   dst_offset = cr.x + (cr.y * dst->stride);
+
+   if (mul_rgb565 == 0xffff)
+       _soft16_image_draw_unscaled_no_mul(src, dst, dc, src_offset, dst_offset,
+                                          cr.w, cr.h);
+   else
+       _soft16_image_draw_unscaled_mul(src, dst, dc, src_offset, dst_offset,
+                                       cr.w, cr.h, r, g, b, a);
+}
diff --git a/src/lib/engines/common_16/evas_soft16_line.c b/src/lib/engines/common_16/evas_soft16_line.c
new file mode 100644 (file)
index 0000000..dd80afa
--- /dev/null
@@ -0,0 +1,444 @@
+#include "evas_common_soft16.h"
+#include "evas_soft16_scanline_fill.c"
+
+/*
+ * All functions except by soft16_line_draw() expect x0 <= x1.
+ */
+
+static inline int
+_in_range(int value, int min, int max)
+{
+   return min <= value && value <= max;
+}
+
+static inline int
+_is_xy_inside_clip(int x, int y, const struct RGBA_Draw_Context_clip clip)
+{
+   if (!clip.use)
+     return 1;
+
+   if (!_in_range(x, clip.x, clip.x + clip.w - 1))
+     return 0;
+
+   if (!_in_range(y, clip.y, clip.y + clip.h - 1))
+     return 0;
+
+   return 1;
+}
+
+static inline int
+_is_x_inside_clip(int x, const struct RGBA_Draw_Context_clip clip)
+{
+   if (!clip.use)
+     return 1;
+
+   return _in_range(x, clip.x, clip.x + clip.w - 1);
+}
+
+static inline int
+_is_y_inside_clip(int y, const struct RGBA_Draw_Context_clip clip)
+{
+   if (!clip.use)
+     return 1;
+
+   return _in_range(y, clip.y, clip.y + clip.h - 1);
+}
+
+static inline int
+_is_xy_inside_rect(int x, int y, int w, int h)
+{
+   return _in_range(x, 0, w - 1) && _in_range(y, 0, h - 1);
+}
+
+static inline int
+_is_empty_clip(const struct RGBA_Draw_Context_clip clip)
+{
+   return clip.w < 1 || clip.h < 1;
+}
+
+static void
+_soft16_line_point(Soft16_Image *dst, RGBA_Draw_Context *dc, int x, int y)
+{
+   DATA16 rgb565, *dst_itr;
+   DATA8 alpha;
+
+   if (!_is_xy_inside_rect(x, y, dst->cache_entry.w, dst->cache_entry.h))
+     return;
+
+   if (!_is_xy_inside_clip(x, y, dc->clip))
+     return;
+
+   dst_itr = dst->pixels + (dst->stride * y) + x;
+   alpha = A_VAL(&dc->col.col) >> 3;
+   rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col),
+                                   G_VAL(&dc->col.col),
+                                   B_VAL(&dc->col.col));
+
+   if (alpha == 31)
+     _soft16_pt_fill_solid_solid(dst_itr, rgb565);
+   else if (alpha > 0)
+     {
+       DATA32 rgb565_unpack;
+
+       rgb565_unpack = RGB_565_UNPACK(rgb565);
+       alpha++;
+       _soft16_pt_fill_transp_solid(dst_itr, rgb565_unpack, alpha);
+     }
+}
+
+static void
+_soft16_line_horiz(Soft16_Image *dst, RGBA_Draw_Context *dc, int x0, int x1, int y)
+{
+   DATA16 rgb565, *dst_itr;
+   DATA8 alpha;
+   int w;
+
+   if (!_is_y_inside_clip(y, dc->clip))
+     return;
+
+   if (x0 < dc->clip.x)
+     x0 = dc->clip.x;
+
+   if (x1 >= dc->clip.x + dc->clip.w)
+     x1 = dc->clip.x + dc->clip.w - 1;
+
+   w = x1 - x0;
+   if (w < 1)
+     return;
+
+   dst_itr = dst->pixels + (dst->stride * y) + x0;
+   alpha = A_VAL(&dc->col.col) >> 3;
+   rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col),
+                                   G_VAL(&dc->col.col),
+                                   B_VAL(&dc->col.col));
+
+   if (alpha == 31)
+     _soft16_scanline_fill_solid_solid(dst_itr, w, rgb565);
+   else if (alpha > 0)
+     {
+       DATA32 rgb565_unpack;
+
+       rgb565_unpack = RGB_565_UNPACK(rgb565);
+       alpha++;
+       _soft16_scanline_fill_transp_solid(dst_itr, w, rgb565_unpack, alpha);
+     }
+}
+
+static void
+_soft16_line_vert(Soft16_Image *dst, RGBA_Draw_Context *dc, int x, int y0, int y1)
+{
+   DATA16 rgb565, *dst_itr;
+   DATA8 alpha;
+   int h;
+
+   if (!_is_x_inside_clip(x, dc->clip))
+     return;
+
+   if (y1 < y0)
+     {
+       int t;
+       t = y0;
+       y0 = y1;
+       y1 = t;
+     }
+
+   if (y0 < dc->clip.y)
+     y0 = dc->clip.y;
+
+   if (y1 >= dc->clip.y + dc->clip.h)
+     y1 = dc->clip.y + dc->clip.h - 1;
+
+   h = y1 - y0;
+   if (h < 1)
+     return;
+
+   dst_itr = dst->pixels + (dst->stride * y0) + x;
+   alpha = A_VAL(&dc->col.col) >> 3;
+   rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col),
+                                   G_VAL(&dc->col.col),
+                                   B_VAL(&dc->col.col));
+
+   if (alpha == 31)
+     {
+       for (; h > 0; h--, dst_itr += dst->stride)
+         _soft16_pt_fill_solid_solid(dst_itr, rgb565);
+     }
+   else if (alpha > 0)
+     {
+       DATA32 rgb565_unpack;
+
+       rgb565_unpack = RGB_565_UNPACK(rgb565);
+       alpha++;
+
+       for (; h > 0; h--, dst_itr += dst->stride)
+         _soft16_pt_fill_transp_solid(dst_itr, rgb565_unpack, alpha);
+     }
+}
+
+static inline void
+_soft16_line_45deg_adjust_boundaries(const struct RGBA_Draw_Context_clip clip, int *p_x0, int *p_y0, int *p_x1, int *p_y1)
+{
+   int diff, dy, x0, y0, x1, y1;
+
+   x0 = *p_x0;
+   y0 = *p_y0;
+   x1 = *p_x1;
+   y1 = *p_y1;
+
+   dy = y1 - y0;
+
+   diff = clip.x - x0;
+   if (diff > 0)
+     {
+       x0 = clip.x;
+       y0 += (dy > 0) ? diff : -diff;
+     }
+
+   diff = x1 - (clip.x + clip.w);
+   if (diff > 0)
+     {
+       x1 = clip.x + clip.w;
+       y1 += (dy > 0) ? -diff : diff;
+     }
+
+   if (dy > 0)
+     {
+       diff = clip.y - y0;
+       if (diff > 0)
+         {
+            y0 = clip.y;
+            x0 += diff;
+         }
+
+       diff = y1 - (clip.y + clip.h);
+       if (diff > 0)
+         {
+            y1 = clip.y + clip.h;
+            x1 -= diff;
+         }
+     }
+   else
+     {
+       diff = clip.y - y1;
+       if (diff > 0)
+         {
+            y1 = clip.y;
+            x1 -= diff;
+         }
+
+       diff = y0 - (clip.y + clip.h - 1);
+       if (diff > 0)
+         {
+            y0 = clip.y + clip.h - 1;
+            x0 += diff;
+         }
+     }
+
+   *p_x0 = x0;
+   *p_y0 = y0;
+   *p_x1 = x1;
+   *p_y1 = y1;
+}
+
+static void
+_soft16_line_45deg(Soft16_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1)
+{
+   int dy, step_dst_itr, len;
+   DATA8 alpha;
+   DATA16 *dst_itr, rgb565;
+
+   alpha = A_VAL(&dc->col.col) >> 3;
+   if (alpha < 1)
+     return;
+
+   rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col),
+                                   G_VAL(&dc->col.col),
+                                   B_VAL(&dc->col.col));
+
+   dy = y1 - y0;
+   step_dst_itr = 1 + ((dy > 0) ? dst->stride : -dst->stride);
+
+   _soft16_line_45deg_adjust_boundaries(dc->clip, &x0, &y0, &x1, &y1);
+
+   len = (dy > 0) ? (y1 - y0) : (y0 - y1);
+   if (len < 1)
+     return;
+
+   dst_itr = dst->pixels + dst->stride * y0 + x0;
+   if (alpha == 31)
+     {
+       for (; len > 0; len--, dst_itr += step_dst_itr)
+         _soft16_pt_fill_solid_solid(dst_itr, rgb565);
+     }
+   else
+     {
+       DATA32 rgb565_unpack;
+
+       rgb565_unpack = RGB_565_UNPACK(rgb565);
+       alpha++;
+       for (; len > 0; len--, dst_itr += step_dst_itr)
+         _soft16_pt_fill_transp_solid(dst_itr, rgb565_unpack, alpha);
+     }
+}
+
+static always_inline void
+_soft16_line_aliased_pt(DATA16 *dst_itr, DATA16 rgb565, DATA32 rgb565_unpack, DATA8 alpha)
+{
+   if (alpha == 32)
+     _soft16_pt_fill_solid_solid(dst_itr, rgb565);
+   else
+     _soft16_pt_fill_transp_solid(dst_itr, rgb565_unpack, alpha);
+}
+
+static void
+_soft16_line_aliased(Soft16_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1)
+{
+   int dx, dy, step_y, step_dst_itr;
+   DATA32 rgb565_unpack;
+   DATA16 rgb565;
+   DATA8 alpha;
+
+   alpha = A_VAL(&dc->col.col) >> 3;
+   if (alpha == 0)
+     return;
+   alpha++;
+
+   rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col),
+                                   G_VAL(&dc->col.col),
+                                   B_VAL(&dc->col.col));
+   rgb565_unpack = RGB_565_UNPACK(rgb565);
+
+   dx = x1 - x0;
+   dy = y1 - y0;
+
+   if (dy >= 0)
+     {
+       step_y = 1;
+       step_dst_itr = dst->stride;
+     }
+   else
+     {
+       dy = -dy;
+       step_y = -1;
+       step_dst_itr = -dst->stride;
+     }
+
+   if (dx > dy)
+     {
+       DATA16 *dst_itr;
+       int e, x, y;
+
+       e = - (dx / 2);
+       y = y0;
+       dst_itr = dst->pixels + dst->stride * y0 + x0;
+       for (x=x0; x <= x1; x++, dst_itr++)
+         {
+            if (_is_xy_inside_clip(x, y, dc->clip))
+              _soft16_line_aliased_pt(dst_itr, rgb565, rgb565_unpack, alpha);
+
+            e += dy;
+            if (e >= 0)
+              {
+                 dst_itr += step_dst_itr;
+                 y += step_y;
+                 e -= dx;
+              }
+         }
+     }
+   else
+     {
+       DATA16 *dst_itr;
+       int e, x, y;
+
+       e = - (dy / 2);
+       x = x0;
+       dst_itr = dst->pixels + dst->stride * y0 + x0;
+       for (y=y0; y != y1; y += step_y, dst_itr += step_dst_itr)
+         {
+            if (_is_xy_inside_clip(x, y, dc->clip))
+              _soft16_line_aliased_pt(dst_itr, rgb565, rgb565_unpack, alpha);
+
+            e += dx;
+            if (e >= 0)
+              {
+                 dst_itr++;
+                 x++;
+                 e -= dy;
+              }
+         }
+     }
+}
+
+void
+soft16_line_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1)
+{
+   struct RGBA_Draw_Context_clip c_bkp, c_tmp;
+   int dx, dy;
+   int  x, y, w, h;
+
+   c_tmp.use = 1;
+   c_tmp.x = 0;
+   c_tmp.y = 0;
+   c_tmp.w = dst->cache_entry.w;
+   c_tmp.h = dst->cache_entry.h;
+
+   /* save out clip info */
+   c_bkp = dc->clip;
+   if (c_bkp.use)
+     {
+       RECTS_CLIP_TO_RECT(c_tmp.x, c_tmp.y, c_tmp.w, c_tmp.h,
+                          c_bkp.x, c_bkp.y, c_bkp.w, c_bkp.h);
+       if (_is_empty_clip(c_tmp))
+         return;
+     }
+
+   x = MIN(x0, x1);
+   y = MIN(y0, y1);
+   w = MAX(x0, x1) - x + 1;
+   h = MAX(y0, y1) - y + 1;
+
+   RECTS_CLIP_TO_RECT(c_tmp.x, c_tmp.y, c_tmp.w, c_tmp.h, x, y, w, h);
+   if (_is_empty_clip(c_tmp))
+     return;
+
+   /* Check if the line doesn't cross the clip area */
+   if (x0 < c_tmp.x && x1 < c_tmp.x)
+     return;
+   if (x0 >= c_tmp.x + c_tmp.w && x1 >= c_tmp.x + c_tmp.w)
+     return;
+   if (y0 < c_tmp.y && y1 < c_tmp.y)
+     return;
+   if (y0 >= c_tmp.y + c_tmp.h && y1 >= c_tmp.y + c_tmp.h)
+     return;
+
+   dc->clip = c_tmp;
+   dx = x1 - x0;
+   dy = y1 - y0;
+
+   if (dx < 0)
+     {
+       int t;
+
+       t = x0;
+       x0 = x1;
+       x1 = t;
+
+       t = y0;
+       y0 = y1;
+       y1 = t;
+     }
+
+   if (dx == 0 && dy == 0)
+     _soft16_line_point(dst, dc, x0, y0);
+   else if (dx == 0)
+     _soft16_line_vert(dst, dc, x0, y0, y1);
+   else if (dy == 0)
+     _soft16_line_horiz(dst, dc, x0, x1, y0);
+   else if (dy == dx || dy == -dx)
+     _soft16_line_45deg(dst, dc, x0, y0, x1, y1);
+   else
+     _soft16_line_aliased(dst, dc, x0, y0, x1, y1);
+
+   /* restore clip info */
+   dc->clip = c_bkp;
+}
diff --git a/src/lib/engines/common_16/evas_soft16_main.c b/src/lib/engines/common_16/evas_soft16_main.c
new file mode 100644 (file)
index 0000000..415d137
--- /dev/null
@@ -0,0 +1,591 @@
+#include "evas_common_soft16.h"
+
+static Evas_Cache_Image *eci = NULL;
+static int               reference = 0;
+
+static Image_Entry      *_evas_common_soft16_image_new(void);
+static void              _evas_common_soft16_image_delete(Image_Entry *ie);
+
+static int               _evas_common_soft16_image_surface_alloc(Image_Entry *ie, int w, int h);
+static void              _evas_common_soft16_image_surface_delete(Image_Entry *ie);
+static DATA32          *_evas_common_soft16_image_surface_pixels(Image_Entry *ie);
+
+static int               _evas_common_load_soft16_image_from_file(Image_Entry *ie);
+static void              _evas_common_soft16_image_unload(Image_Entry *ie);
+
+static void              _evas_common_soft16_image_dirty_region(Image_Entry *im, int x, int y, int w, int h);
+static int               _evas_common_soft16_image_dirty(Image_Entry *ie_dst, const Image_Entry *ie_src);
+
+static int               _evas_common_soft16_image_ram_usage(Image_Entry *ie);
+
+static int               _evas_common_soft16_image_size_set(Image_Entry *ie_dst, const Image_Entry *ie_im, int w, int h);
+static int               _evas_common_soft16_image_from_copied_data(Image_Entry* ie_dst, int w, int h, DATA32 *image_data, int alpha, int cspace);
+static int               _evas_common_soft16_image_from_data(Image_Entry* ie_dst, int w, int h, DATA32 *image_data, int alpha, int cspace);
+static int               _evas_common_soft16_image_colorspace_set(Image_Entry* ie_dst, int cspace);
+
+static int               _evas_common_load_soft16_image_data_from_file(Image_Entry *ie);
+
+/* static void */
+/* _evas_common_soft16_image_debug(const char* context, Image_Entry *eim) */
+/* { */
+/*    DBG("[16] %p = [%s] {%s,%s} %i [%i|%i]", eim, context, eim->file, eim->key, eim->references, eim->w, eim->h); */
+/* } */
+
+static const Evas_Cache_Image_Func      _evas_common_soft16_image_func =
+{
+   _evas_common_soft16_image_new,
+   _evas_common_soft16_image_delete,
+   _evas_common_soft16_image_surface_alloc,
+   _evas_common_soft16_image_surface_delete,
+   _evas_common_soft16_image_surface_pixels,
+   _evas_common_load_soft16_image_from_file,
+   _evas_common_soft16_image_unload,
+   _evas_common_soft16_image_dirty_region,
+   _evas_common_soft16_image_dirty,
+   _evas_common_soft16_image_size_set,
+   _evas_common_soft16_image_from_copied_data,
+   _evas_common_soft16_image_from_data,
+   _evas_common_soft16_image_colorspace_set,
+   _evas_common_load_soft16_image_data_from_file,
+   _evas_common_soft16_image_ram_usage,
+/*    _evas_common_soft16_image_debug */
+   NULL
+};
+
+EAPI void
+evas_common_soft16_image_init(void)
+{
+   if (!eci)
+     eci = evas_cache_image_init(&_evas_common_soft16_image_func);
+   reference++;
+}
+
+EAPI void
+evas_common_soft16_image_shutdown(void)
+{
+   if (--reference == 0)
+     {
+// DISABLE for now - something wrong with cache shutdown freeing things
+// still in use - rage_thumb segv's now.
+// 
+// actually - i think i see it. cache ref goes to 0 (and thus gets freed)
+// because in eng_setup() when a buffer changes size it is FIRST freed
+// THEN allocated again - thus brignhjing ref to 0 then back to 1 immediately
+// where it should stay at 1. - see evas_engine.c in the buffer enigne for
+// example. eng_output_free() is called BEFORE _output_setup(). although this
+// is only a SIGNE of the problem. we can patch this up with either freeing
+// after the setup (so we just pt a ref of 2 then back to 1), or just 
+// evas_common_image_init() at the start and evas_common_image_shutdown()
+// after it all. really ref 0 should only be reached when no more canvases
+// with no more objects exist anywhere.
+
+// ENABLE IT AGAIN, hope it is fixed. Gustavo @ January 22nd, 2009.
+        evas_cache_image_shutdown(eci);
+        eci = NULL;
+     }
+}
+
+EAPI Evas_Cache_Image *
+evas_common_soft16_image_cache_get(void)
+{
+   return eci;
+}
+
+static Image_Entry *
+_evas_common_soft16_image_new(void)
+{
+   Soft16_Image *im;
+
+   im = calloc(1, sizeof(Soft16_Image));
+   if (!im) return NULL;
+
+   im->stride = -1;
+
+   return (Image_Entry *) im;
+}
+
+static void
+_evas_common_soft16_image_delete(Image_Entry *ie)
+{
+   memset(ie, 0xFF, sizeof (Soft16_Image));
+   free(ie);
+}
+
+static int
+_evas_common_soft16_image_surface_alloc(Image_Entry *ie, int w, int h)
+{
+   Soft16_Image *im = (Soft16_Image *) ie;
+
+   if (im->stride < 0) im->stride = _calc_stride(w);
+
+   im->pixels = realloc(im->pixels, IMG_BYTE_SIZE(im->stride, h, ie->flags.alpha));
+   if (!im->pixels) return -1;
+
+   if (ie->flags.alpha)
+     {
+        im->alpha = (DATA8 *)(im->pixels + (im->stride * h));
+        im->flags.free_alpha = 0;
+     }
+   im->flags.free_pixels = 1;
+
+   return 0;
+}
+
+static void
+_evas_common_soft16_image_surface_delete(Image_Entry *ie)
+{
+   Soft16_Image *im = (Soft16_Image *) ie;
+
+   if (im->flags.free_pixels)
+     free(im->pixels);
+   im->pixels = NULL;
+   im->flags.free_pixels = 0;
+
+   if (im->flags.free_alpha)
+     free(im->alpha);
+   im->alpha = NULL;
+   im->flags.free_alpha = 0;
+}
+
+static DATA32 *
+_evas_common_soft16_image_surface_pixels(Image_Entry *ie __UNUSED__)
+{
+   abort();
+
+   return NULL;
+}
+
+static int
+_evas_common_load_soft16_image_from_file(Image_Entry *ie)
+{
+   Soft16_Image *sim = (Soft16_Image *) ie;
+   RGBA_Image   *im;
+   int           error = 0;
+
+   im = (RGBA_Image *) evas_cache_image_request(evas_common_image_cache_get(), sim->cache_entry.file, sim->cache_entry.key, &sim->cache_entry.load_opts, &error);
+   sim->source = im;
+   if (!sim->source) return -1;
+
+   sim->cache_entry.w = sim->source->cache_entry.w;
+   sim->cache_entry.h = sim->source->cache_entry.h;
+   ie->flags.alpha = im->cache_entry.flags.alpha;
+   if (sim->stride < 0) sim->stride = _calc_stride(sim->cache_entry.w);
+
+   return 0;
+}
+
+static void
+_evas_common_soft16_image_unload(Image_Entry *ie __UNUSED__)
+{
+}
+
+static void
+_evas_common_soft16_image_dirty_region(Image_Entry *im __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+}
+
+static int
+_evas_common_soft16_image_dirty(Image_Entry *ie_dst, const Image_Entry *ie_src)
+{
+   Soft16_Image *dst = (Soft16_Image *) ie_dst;
+   Soft16_Image *src = (Soft16_Image *) ie_src;
+
+   evas_cache_image_load_data(&src->cache_entry);
+   evas_cache_image_surface_alloc(&dst->cache_entry,
+                                  src->cache_entry.w, src->cache_entry.h);
+
+/*    evas_common_blit_rectangle(src, dst, 0, 0, src->cache_entry.w, src->cache_entry.h, 0, 0); */
+
+   return 0;
+}
+
+static int
+_evas_common_soft16_image_ram_usage(Image_Entry *ie)
+{
+   Soft16_Image *im = (Soft16_Image *) ie;
+
+   if (im->pixels && im->flags.free_pixels)
+     return IMG_BYTE_SIZE(im->stride, im->cache_entry.h, ie->flags.alpha);
+   return 0;
+}
+
+static int
+_evas_common_soft16_image_size_set(Image_Entry *ie_dst, const Image_Entry *ie_im, int w __UNUSED__, int h __UNUSED__)
+{
+   Soft16_Image *dst = (Soft16_Image *) ie_dst;
+   Soft16_Image *im = (Soft16_Image *) ie_im;
+
+   dst->flags = im->flags;
+
+   return 0;
+}
+
+static int
+_evas_common_soft16_image_from_data(Image_Entry* ie_dst, int w, int h, DATA32 *image_data, int alpha, int cspace __UNUSED__)
+{
+   Soft16_Image *im = (Soft16_Image *) ie_dst;
+
+   /* FIXME: handle colorspace */
+   ie_dst->w = w;
+   ie_dst->h = h;
+   ie_dst->flags.alpha = alpha;
+
+   im->flags.free_pixels = 0;
+   im->flags.free_alpha = 0;
+   if (im->stride < 0)
+        im->stride = _calc_stride(w);
+
+   /* FIXME: That's bad, the application must be aware of the engine internal. */
+   im->pixels = (DATA16 *) image_data;
+   if (ie_dst->flags.alpha)
+     im->alpha = (DATA8 *)(im->pixels + (im->stride * h));
+
+   return 0;
+}
+
+static int
+_evas_common_soft16_image_from_copied_data(Image_Entry* ie_dst, int w __UNUSED__, int h, DATA32 *image_data, int alpha __UNUSED__, int cspace __UNUSED__)
+{
+   Soft16_Image *im = (Soft16_Image *) ie_dst;
+
+   /* FIXME: handle colorspace */
+   if (image_data)
+     memcpy(im->pixels, image_data, IMG_BYTE_SIZE(im->stride, h, ie_dst->flags.alpha));
+   else
+     memset(im->pixels, 0, IMG_BYTE_SIZE(im->stride, h, ie_dst->flags.alpha));
+
+   return 0;
+}
+
+static int
+_evas_common_soft16_image_colorspace_set(Image_Entry* ie_dst __UNUSED__, int cspace __UNUSED__)
+{
+   /* FIXME: handle colorspace */
+   return 0;
+}
+
+static int
+_evas_common_load_soft16_image_data_from_file(Image_Entry *ie)
+{
+   Soft16_Image *im = (Soft16_Image *) ie;
+
+   if (im->pixels) return 0;
+   if (!im->source) return -1;
+
+   evas_cache_image_load_data(&im->source->cache_entry);
+   if (im->source->image.data)
+     {
+        DATA32 *sp;
+
+        evas_cache_image_surface_alloc(&im->cache_entry,
+                                       im->source->cache_entry.w,
+                                       im->source->cache_entry.h);
+
+        sp = im->source->image.data;
+        if (im->alpha)
+          soft16_image_convert_from_rgba(im, sp);
+        else
+          soft16_image_convert_from_rgb(im, sp);
+     }
+   evas_cache_image_drop(&im->source->cache_entry);
+   im->source = NULL;
+
+   return 0;
+}
+
+/* Soft16_Image * */
+/* soft16_image_new(int w, int h, int stride, int have_alpha, DATA16 *pixels, */
+/*              int copy) */
+/* { */
+/*    Soft16_Image *im; */
+
+/*    if (stride < 0) stride = _calc_stride(w); */
+
+/*    im = soft16_image_alloc(w, h, stride, have_alpha, copy); */
+/*    if (!im) return NULL; */
+
+/*    if (pixels) */
+/*      { */
+/*     if (copy) */
+/*       memcpy(im->pixels, pixels, IMG_BYTE_SIZE(stride, h, have_alpha)); */
+/*     else */
+/*       { */
+/*          im->pixels = pixels; */
+/*          if (have_alpha) im->alpha = (DATA8 *)(im->pixels + (stride * h)); */
+/*       } */
+/*      } */
+/*    return im; */
+/* } */
+
+static inline void
+_get_clip(const RGBA_Draw_Context *dc, const Soft16_Image *im,
+         Eina_Rectangle *clip)
+{
+   if (dc->clip.use)
+     {
+       EINA_RECTANGLE_SET(clip, dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h);
+       if (clip->x < 0)
+         {
+            clip->w += clip->x;
+            clip->x = 0;
+         }
+       if (clip->y < 0)
+         {
+            clip->h += clip->y;
+            clip->y = 0;
+         }
+       if ((clip->x + clip->w) > im->cache_entry.w) clip->w = im->cache_entry.w - clip->x;
+       if ((clip->y + clip->h) > im->cache_entry.h) clip->h = im->cache_entry.h - clip->y;
+     }
+   else
+     {
+       EINA_RECTANGLE_SET(clip, 0, 0, im->cache_entry.w, im->cache_entry.h);
+     }
+}
+
+static inline int
+_is_empty_rectangle(const Eina_Rectangle *r)
+{
+   return (r->w < 1) || (r->h < 1);
+}
+
+static inline void
+_shrink(int *s_pos, int *s_size, int pos, int size)
+{
+   int d;
+
+   d = (*s_pos) - pos;
+   if (d < 0)
+     {
+       (*s_size) += d;
+       (*s_pos) = pos;
+     }
+
+   d = size + pos - (*s_pos);
+   if ((*s_size) > d)
+     (*s_size) = d;
+}
+
+static int
+_soft16_adjust_areas(Eina_Rectangle *src,
+                    int src_max_x, int src_max_y,
+                    Eina_Rectangle *dst,
+                    int dst_max_x, int dst_max_y,
+                    Eina_Rectangle *dst_clip)
+{
+   if (_is_empty_rectangle(src) ||
+       _is_empty_rectangle(dst) ||
+       _is_empty_rectangle(dst_clip))
+     return 0;
+
+   /* shrink clip */
+   _shrink(&dst_clip->x, &dst_clip->w, dst->x, dst->w);
+   _shrink(&dst_clip->y, &dst_clip->h, dst->y, dst->h);
+   if (_is_empty_rectangle(dst_clip)) return 0;
+
+   /* sanitise x */
+   if (src->x < 0)
+     {
+       dst->x -= (src->x * dst->w) / src->w;
+       dst->w += (src->x * dst->w) / src->w;
+       src->w += src->x;
+       src->x = 0;
+     }
+   if (src->x >= src_max_x) return 0;
+   if ((src->x + src->w) > src_max_x)
+     {
+       dst->w = (dst->w * (src_max_x - src->x)) / (src->w);
+       src->w = src_max_x - src->x;
+     }
+   if (dst->w <= 0) return 0;
+   if (src->w <= 0) return 0;
+   if (dst_clip->x < 0)
+     {
+       dst_clip->w += dst_clip->x;
+       dst_clip->x = 0;
+     }
+   if (dst_clip->w <= 0) return 0;
+   if (dst_clip->x >= dst_max_x) return 0;
+
+   _shrink(&dst_clip->x, &dst_clip->w, 0, dst_max_x);
+   if (dst_clip->w <= 0) return 0;
+
+   /* sanitise y */
+   if (src->y < 0)
+     {
+       dst->y -= (src->y * dst->h) / src->h;
+       dst->h += (src->y * dst->h) / src->h;
+       src->h += src->y;
+       src->y = 0;
+     }
+   if (src->y >= src_max_y) return 0;
+   if ((src->y + src->h) > src_max_y)
+     {
+       dst->h = (dst->h * (src_max_y - src->y)) / (src->h);
+       src->h = src_max_y - src->y;
+     }
+   if (dst->h <= 0) return 0;
+   if (src->h <= 0) return 0;
+   if (dst_clip->y < 0)
+     {
+       dst_clip->h += dst_clip->y;
+       dst_clip->y = 0;
+     }
+   if (dst_clip->h <= 0) return 0;
+   if (dst_clip->y >= dst_max_y) return 0;
+
+   _shrink(&dst_clip->y, &dst_clip->h, 0, dst_max_y);
+   if (dst_clip->h <= 0) return 0;
+
+   return 1;
+}
+
+static void
+_soft16_image_draw_sampled_int(Soft16_Image *src, Soft16_Image *dst,
+                              RGBA_Draw_Context *dc,
+                              Eina_Rectangle sr, Eina_Rectangle dr)
+{
+   Eina_Rectangle cr;
+
+   if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
+     return;
+   if (!(RECTS_INTERSECT(sr.x, sr.y, sr.w, sr.h, 0, 0, src->cache_entry.w, src->cache_entry.h)))
+     return;
+
+   _get_clip(dc, dst, &cr);
+   if (!_soft16_adjust_areas(&sr, src->cache_entry.w, src->cache_entry.h, &dr, dst->cache_entry.w, dst->cache_entry.h, &cr))
+     return;
+
+   if ((dr.w == sr.w) && (dr.h == sr.h))
+     soft16_image_draw_unscaled(src, dst, dc, sr, dr, cr);
+   else
+     soft16_image_draw_scaled_sampled(src, dst, dc, sr, dr, cr);
+}
+
+EAPI void
+soft16_image_draw(Soft16_Image *src, Soft16_Image *dst,
+                 RGBA_Draw_Context *dc,
+                 int src_region_x, int src_region_y,
+                 int src_region_w, int src_region_h,
+                 int dst_region_x, int dst_region_y,
+                 int dst_region_w, int dst_region_h,
+                 int smooth __UNUSED__)
+{
+   Eina_Rectangle sr, dr;
+   Cutout_Rects *rects;
+   Cutout_Rect  *r;
+   struct RGBA_Draw_Context_clip clip_bkp;
+   int i;
+
+   /* handle cutouts here! */
+   EINA_RECTANGLE_SET(&dr, dst_region_x, dst_region_y, dst_region_w, dst_region_h);
+
+   if (_is_empty_rectangle(&dr)) return;
+   if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
+     return;
+
+   EINA_RECTANGLE_SET(&sr, src_region_x, src_region_y, src_region_w, src_region_h);
+
+   if (_is_empty_rectangle(&sr)) return;
+   if (!(RECTS_INTERSECT(sr.x, sr.y, sr.w, sr.h, 0, 0, src->cache_entry.w, src->cache_entry.h)))
+     return;
+
+   /* no cutouts - cut right to the chase */
+   if (!dc->cutout.rects)
+     {
+       _soft16_image_draw_sampled_int(src, dst, dc, sr, dr);
+       return;
+     }
+
+   /* save out clip info */
+   clip_bkp = dc->clip;
+   evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
+   evas_common_draw_context_clip_clip(dc, dst_region_x, dst_region_y, dst_region_w, dst_region_h);
+   /* our clip is 0 size.. abort */
+   if ((dc->clip.w <= 0) || (dc->clip.h <= 0))
+     {
+       dc->clip = clip_bkp;
+       return;
+     }
+   rects = evas_common_draw_context_apply_cutouts(dc);
+   for (i = 0; i < rects->active; i++)
+     {
+       r = rects->rects + i;
+       evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h);
+       _soft16_image_draw_sampled_int(src, dst, dc, sr, dr);
+     }
+   evas_common_draw_context_apply_clear_cutouts(rects);
+   dc->clip = clip_bkp;
+}
+
+EAPI Soft16_Image *
+soft16_image_alpha_set(Soft16_Image *im, int have_alpha)
+{
+   Soft16_Image   *new_im;
+
+   if (im->cache_entry.flags.alpha == have_alpha) return im;
+
+   new_im = (Soft16_Image *) evas_cache_image_alone(&im->cache_entry);
+
+   new_im->cache_entry.flags.alpha = have_alpha;
+
+   if (im->cache_entry.w > 0
+       && im->cache_entry.h)
+     new_im = (Soft16_Image *) evas_cache_image_size_set(&new_im->cache_entry, im->cache_entry.w, im->cache_entry.h);
+
+   return new_im;
+}
+
+/* Soft16_Image * */
+/* soft16_image_size_set(Soft16_Image *old_im, int w, int h) */
+/* { */
+/*    Soft16_Image *new_im; */
+/*    DATA16 *dp, *sp; */
+/*    int i, cw, ch, ew; */
+
+/*    if ((old_im->cache_entry.w == w) && (old_im->cache_entry.h == h)) return old_im; */
+
+/*    new_im = soft16_image_new(w, h, -1, old_im->flags.have_alpha, NULL, 1); */
+
+/*    if (old_im->cache_entry.w < new_im->cache_entry.w) */
+/*      cw = old_im->cache_entry.w; */
+/*    else */
+/*      cw = new_im->cache_entry.w; */
+
+/*    ew = new_im->cache_entry.w - cw; */
+
+/*    if (old_im->cache_entry.h < new_im->cache_entry.h) */
+/*      ch = old_im->cache_entry.h; */
+/*    else */
+/*      ch = new_im->cache_entry.h; */
+
+/*    dp = new_im->pixels; */
+/*    sp = old_im->pixels; */
+/*    for (i = 0; i < ch; i++) */
+/*      { */
+/*     memcpy(dp, sp, cw * sizeof(DATA16)); */
+/*     if (ew > 0) memset(dp, 0, ew * sizeof(DATA16)); */
+
+/*     dp += new_im->stride; */
+/*     sp += old_im->stride; */
+/*      } */
+
+/*    if (old_im->flags.have_alpha) */
+/*      { */
+/*     DATA8 *dp, *sp; */
+
+/*     dp = new_im->alpha; */
+/*     sp = old_im->alpha; */
+/*     for (i = 0; i < ch; i++) */
+/*       { */
+/*          memcpy(dp, sp, cw * sizeof(DATA8)); */
+/*          if (ew > 0) memset(dp, 0, ew * sizeof(DATA8)); */
+
+/*          dp += new_im->stride; */
+/*          sp += old_im->stride; */
+/*       } */
+/*      } */
+
+/*    evas_cache_image_drop(&old_im->cache_entry); */
+/*    return new_im; */
+/* } */
diff --git a/src/lib/engines/common_16/evas_soft16_point_blend.c b/src/lib/engines/common_16/evas_soft16_point_blend.c
new file mode 100644 (file)
index 0000000..9f36984
--- /dev/null
@@ -0,0 +1,149 @@
+/** NOTE: This file is meant to be included by users **/
+
+/** NOTE2: r, g, b parameters are 16bits, so you can pass 0 to 256 inclusive.
+ **        this is due our division by 256 when multiplying the color.
+ **/
+
+/*****************************************************************************
+ * Scanline processing
+ *
+ *    _soft16_pt_<description>_<src>_<dst>[_<modifier>]()
+ *
+ ****************************************************************************/
+
+/***********************************************************************
+ * Regular blend operations
+ */
+
+static always_inline void
+_soft16_pt_blend_transp_solid(DATA16 *p_dst, DATA16 src, DATA8 alpha)
+{
+   if (alpha == 31) *p_dst = src;
+   else if (alpha != 0)
+     {
+        DATA32 a, b;
+
+        a = RGB_565_UNPACK(src);
+        b = RGB_565_UNPACK(*p_dst);
+        b = RGB_565_UNPACKED_BLEND(a, b, alpha);
+        *p_dst = RGB_565_PACK(b);
+     }
+}
+
+static always_inline void
+_soft16_pt_blend_solid_solid(DATA16 *p_dst, DATA16 src)
+{
+   *p_dst = src;
+}
+
+/***********************************************************************
+ * Blend operations taking an extra alpha (fade in, out)
+ */
+
+static always_inline void
+_soft16_pt_blend_transp_solid_mul_alpha(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA8 rel_alpha)
+{
+   DATA32 a, b;
+
+   alpha = (alpha * rel_alpha) >> 5;
+   if (alpha == 0)
+     return;
+
+   alpha++;
+
+   a = ((RGB_565_UNPACK(src) * rel_alpha) >> 5) & RGB_565_UNPACKED_MASK;
+   b = RGB_565_UNPACK(*p_dst);
+   b = RGB_565_UNPACKED_BLEND(a, b, alpha);
+   *p_dst = RGB_565_PACK(b);
+}
+
+static always_inline void
+_soft16_pt_blend_solid_solid_mul_alpha(DATA16 *p_dst, DATA16 src, DATA8 rel_alpha)
+{
+   DATA32 a, b;
+   a = RGB_565_UNPACK(src);
+   b = RGB_565_UNPACK(*p_dst);
+   b = RGB_565_UNPACKED_BLEND_UNMUL(a, b, rel_alpha);
+   *p_dst = RGB_565_PACK(b);
+}
+
+/***********************************************************************
+ * Blend operations with extra alpha and multiply color
+ */
+
+static always_inline void
+_soft16_pt_blend_transp_solid_mul_color_transp(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b)
+{
+   DATA32 rgb, d;
+   int r1, g1, b1;
+
+   alpha = (alpha * rel_alpha) >> 5;
+   if (alpha == 0)
+     return;
+
+   alpha++;
+
+   r1 = ((((src) >> 11) & 0x1f) * r) >> 5;
+   g1 = ((((src) >> 5) & 0x3f) * g) >> 6;
+   b1 = (((src) & 0x1f) * b) >> 5;
+   rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK;
+   d = RGB_565_UNPACK(*p_dst);
+   d = RGB_565_UNPACKED_BLEND(rgb, d, alpha);
+
+   *p_dst = RGB_565_PACK(d);
+}
+
+static always_inline void
+_soft16_pt_blend_solid_solid_mul_color_transp(DATA16 *p_dst, DATA16 src, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b)
+{
+   int r1, g1, b1;
+   DATA32 rgb, d;
+
+   r1 = ((((src) >> 11) & 0x1f) * r) >> 5;
+   g1 = ((((src) >> 5) & 0x3f) * g) >> 6;
+   b1 = (((src) & 0x1f) * b) >> 5;
+
+   rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK;
+   d = RGB_565_UNPACK(*p_dst);
+   d = RGB_565_UNPACKED_BLEND(rgb, d, rel_alpha);
+   *p_dst = RGB_565_PACK(d);
+}
+
+/***********************************************************************
+ * Blend operations with extra multiply color
+ */
+
+static always_inline void
+_soft16_pt_blend_transp_solid_mul_color_solid(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA8 r, DATA8 g, DATA8 b)
+{
+   int r1, g1, b1;
+
+   if (alpha == 0) return;
+
+   r1 = ((((src >> 11) & 0x1f) * r) >> 5) & 0x1f;
+   g1 = ((((src >> 5) & 0x3f) * g) >> 6) & 0x3f;
+   b1 = (((src & 0x1f) * b) >> 5) & 0x1f;
+
+   if (alpha == 31) *p_dst = (r1 << 11) | (g1 << 5) | b1;
+   else
+     {
+        DATA32 rgb_unpack, d;
+
+        rgb_unpack = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK;
+        d = RGB_565_UNPACK(*p_dst);
+        d = RGB_565_UNPACKED_BLEND(rgb_unpack, d, alpha);
+        *p_dst = RGB_565_PACK(d);
+     }
+}
+
+static always_inline void
+_soft16_pt_blend_solid_solid_mul_color_solid(DATA16 *p_dst, DATA16 src, DATA16 r, DATA16 g, DATA16 b)
+{
+   int r1, g1, b1;
+
+   r1 = ((((src >> 11) & 0x1f) * r) >> 5) & 0x1f;
+   g1 = ((((src >> 5) & 0x3f) * g) >> 6) & 0x3f;
+   b1 = (((src & 0x1f) * b) >> 5) & 0x1f;
+
+   *p_dst = (r1 << 11) | (g1 << 5) | b1;
+}
diff --git a/src/lib/engines/common_16/evas_soft16_polygon.c b/src/lib/engines/common_16/evas_soft16_polygon.c
new file mode 100644 (file)
index 0000000..dd125d2
--- /dev/null
@@ -0,0 +1,231 @@
+#include <evas_common_soft16.h>
+#include "evas_soft16_scanline_fill.c"
+#include <math.h>
+
+typedef struct _RGBA_Edge RGBA_Edge;
+typedef struct _RGBA_Vertex RGBA_Vertex;
+
+struct _RGBA_Edge
+{
+   float x, dx;
+   int i;
+};
+
+struct _RGBA_Vertex
+{
+   float x, y;
+   int i;
+};
+
+#define POLY_EDGE_DEL(_i)                                               \
+{                                                                       \
+   int _j;                                                              \
+                                                                        \
+   for (_j = 0; (_j < num_active_edges) && (edges[_j].i != _i); _j++);  \
+   if (_j < num_active_edges)                                           \
+     {                                                                  \
+       num_active_edges--;                                             \
+       memmove(&(edges[_j]), &(edges[_j + 1]),                         \
+               (num_active_edges - _j) * sizeof(RGBA_Edge));           \
+     }                                                                  \
+}
+
+#define POLY_EDGE_ADD(_i, _y)                                           \
+{                                                                       \
+   int _j;                                                              \
+   float _dx;                                                           \
+   RGBA_Vertex *_p, *_q;                                                \
+   if (_i < (n - 1)) _j = _i + 1;                                       \
+   else _j = 0;                                                         \
+   if (point[_i].y < point[_j].y)                                       \
+     {                                                                  \
+       _p = &(point[_i]);                                              \
+       _q = &(point[_j]);                                              \
+     }                                                                  \
+   else                                                                 \
+     {                                                                  \
+       _p = &(point[_j]);                                              \
+       _q = &(point[_i]);                                              \
+     }                                                                  \
+   edges[num_active_edges].dx = _dx = (_q->x - _p->x) / (_q->y - _p->y); \
+   edges[num_active_edges].x = (_dx * ((float)_y + 0.5 - _p->y)) + _p->x; \
+   edges[num_active_edges].i = _i;                                      \
+   num_active_edges++;                                                  \
+}
+
+static int
+polygon_point_sorter(const void *a, const void *b)
+{
+   RGBA_Vertex *p, *q;
+
+   p = (RGBA_Vertex *)a;
+   q = (RGBA_Vertex *)b;
+   if (p->y <= q->y) return -1;
+   return 1;
+}
+
+static int
+polygon_edge_sorter(const void *a, const void *b)
+{
+   RGBA_Edge *p, *q;
+
+   p = (RGBA_Edge *)a;
+   q = (RGBA_Edge *)b;
+   if (p->x <= q->x) return -1;
+   return 1;
+}
+
+void
+soft16_polygon_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y)
+{
+   RGBA_Polygon_Point *pt;
+   RGBA_Vertex       *point;
+   RGBA_Edge         *edges;
+   int                num_active_edges;
+   int                n;
+   int                i, j, k;
+   int                y0, y1, yi;
+   int                ext_x, ext_y, ext_w, ext_h;
+   int               *sorted_index;
+   DATA8 alpha;
+   DATA16 rgb565;
+   DATA32 rgb565_unpack;
+
+   alpha = A_VAL(&dc->col.col) >> 3;
+   if (alpha == 0)
+     return;
+   alpha++;
+
+   rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col),
+                                   G_VAL(&dc->col.col),
+                                   B_VAL(&dc->col.col));
+   rgb565_unpack = RGB_565_UNPACK(rgb565);
+
+   ext_x = 0;
+   ext_y = 0;
+   ext_w = dst->cache_entry.w;
+   ext_h = dst->cache_entry.h;
+   if (dc->clip.use)
+     RECTS_CLIP_TO_RECT(ext_x, ext_y, ext_w, ext_h,
+                       dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h);
+
+   if ((ext_w <= 0) || (ext_h <= 0))
+     return;
+
+   n = 0;
+   EINA_INLIST_FOREACH(points, pt) n++;
+
+   if (n < 3)
+     return;
+
+   edges = malloc(sizeof(RGBA_Edge) * n);
+   if (!edges)
+     return;
+
+   point = malloc(sizeof(RGBA_Vertex) * n);
+   if (!point)
+     {
+       free(edges);
+       return;
+     }
+
+   sorted_index = malloc(sizeof(int) * n);
+   if (!sorted_index)
+     {
+       free(edges);
+       free(point);
+       return;
+     }
+
+   k = 0;
+   EINA_INLIST_FOREACH(points, pt)
+     {
+       point[k].x = pt->x + x;
+       point[k].y = pt->y + y;
+       point[k].i = k;
+       k++;
+     }
+   qsort(point, n, sizeof(RGBA_Vertex), polygon_point_sorter);
+
+   for (k = 0; k < n; k++)
+     sorted_index[k] = point[k].i;
+
+   k = 0;
+   EINA_INLIST_FOREACH(points, pt)
+     {
+       point[k].x = pt->x + x;
+       point[k].y = pt->y + y;
+       point[k].i = k;
+       k++;
+     }
+
+   y0 = MAX(ext_y, ceil(point[sorted_index[0]].y - 0.5));
+   y1 = MIN(ext_y + ext_h - 1, floor(point[sorted_index[n - 1]].y - 0.5));
+
+   k = 0;
+   num_active_edges = 0;
+
+   for (yi = y0; yi <= y1; yi++)
+     {
+       for (; (k < n) && (point[sorted_index[k]].y <= ((float)yi + 0.5)); k++)
+         {
+            i = sorted_index[k];
+
+            if (i > 0) j = i - 1;
+            else j = n - 1;
+            if (point[j].y <= ((float)yi - 0.5))
+              {
+                 POLY_EDGE_DEL(j)
+              }
+            else if (point[j].y > ((float)yi + 0.5))
+              {
+                 POLY_EDGE_ADD(j, yi)
+              }
+            if (i < (n - 1)) j = i + 1;
+            else j = 0;
+            if (point[j].y <= ((float)yi - 0.5))
+              {
+                 POLY_EDGE_DEL(i)
+              }
+            else if (point[j].y > ((float)yi + 0.5))
+              {
+                 POLY_EDGE_ADD(i, yi)
+              }
+         }
+
+       qsort(edges, num_active_edges, sizeof(RGBA_Edge), polygon_edge_sorter);
+
+       for (j = 0; j < num_active_edges; j += 2)
+         {
+            int x0, x1;
+
+            x0 = ceil(edges[j].x - 0.5);
+            if (j < (num_active_edges - 1))
+              x1 = floor(edges[j + 1].x - 0.5);
+            else
+              x1 = x0;
+            if ((x1 >= ext_x) && (x0 < (ext_x + ext_w)) && (x0 <= x1))
+              {
+                 DATA16 *dst_itr;
+                 int w;
+
+                 if (x0 < ext_x) x0 = ext_x;
+                 if (x1 >= (ext_x + ext_w)) x1 = ext_x + ext_w - 1;
+
+                 w = (x1 - x0) + 1;
+                 dst_itr = dst->pixels + (yi * dst->stride) + x0;
+
+                 if (alpha == 32)
+                   _soft16_scanline_fill_solid_solid(dst_itr, w, rgb565);
+                 else
+                   _soft16_scanline_fill_transp_solid(dst_itr, w, rgb565_unpack, alpha);
+              }
+            edges[j].x += edges[j].dx;
+            edges[j + 1].x += edges[j + 1].dx;
+         }
+     }
+
+   free(edges);
+   free(point);
+   free(sorted_index);
+}
diff --git a/src/lib/engines/common_16/evas_soft16_rectangle.c b/src/lib/engines/common_16/evas_soft16_rectangle.c
new file mode 100644 (file)
index 0000000..37b1d56
--- /dev/null
@@ -0,0 +1,121 @@
+#include "evas_common_soft16.h"
+#include "evas_soft16_scanline_fill.c"
+
+static inline int
+_is_empty_rectangle(const Eina_Rectangle *r)
+{
+   return (r->w < 1) || (r->h < 1);
+}
+
+static inline void
+_soft16_rectangle_draw_solid_solid(Soft16_Image *dst, int offset, int w, int h,
+                                  DATA16 rgb565)
+{
+   DATA16 *dst_itr;
+   int i;
+
+   dst_itr = dst->pixels + offset;
+
+   for (i = 0; i < h; i++, dst_itr += dst->stride)
+      _soft16_scanline_fill_solid_solid(dst_itr, w, rgb565);
+}
+
+static inline void
+_soft16_rectangle_draw_transp_solid(Soft16_Image *dst, int offset, int w, int h,
+                                   DATA16 rgb565, DATA8 alpha)
+{
+   DATA16 *dst_itr;
+   DATA32 rgb565_unpack;
+   int i;
+
+   dst_itr = dst->pixels + offset;
+   rgb565_unpack = RGB_565_UNPACK(rgb565);
+   alpha++;
+
+   for (i = 0; i < h; i++, dst_itr += dst->stride)
+     _soft16_scanline_fill_transp_solid(dst_itr, w, rgb565_unpack, alpha);
+}
+
+static void
+_soft16_rectangle_draw_int(Soft16_Image *dst, RGBA_Draw_Context *dc,
+                           Eina_Rectangle dr)
+{
+   int dst_offset;
+
+   if (_is_empty_rectangle(&dr)) return;
+   RECTS_CLIP_TO_RECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
+   if (_is_empty_rectangle(&dr)) return;
+
+   if (dc->clip.use)
+      RECTS_CLIP_TO_RECT(dr.x, dr.y, dr.w, dr.h, dc->clip.x,
+                         dc->clip.y, dc->clip.w, dc->clip.h);
+   if (_is_empty_rectangle(&dr)) return;
+   if (A_VAL(&dc->col.col) == 0) return;
+
+   dst_offset = dr.x + (dr.y * dst->cache_entry.w);
+
+   if (!dst->cache_entry.flags.alpha)
+      {
+        DATA16 rgb565;
+        DATA8 alpha;
+
+        alpha = A_VAL(&dc->col.col) >> 3;
+        rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col),
+                                         G_VAL(&dc->col.col),
+                                         B_VAL(&dc->col.col));
+         if (alpha == 31)
+          _soft16_rectangle_draw_solid_solid
+            (dst, dst_offset, dr.w, dr.h, rgb565);
+         else if (alpha > 0)
+          _soft16_rectangle_draw_transp_solid
+            (dst, dst_offset, dr.w, dr.h, rgb565, alpha);
+      }
+   else
+     ERR("Unsupported feature: drawing rectangle to non-opaque destination.");
+}
+
+void
+soft16_rectangle_draw(Soft16_Image *dst, RGBA_Draw_Context *dc,
+                      int x, int y, int w, int h)
+{
+   Eina_Rectangle dr;
+   Cutout_Rects *rects;
+   Cutout_Rect  *r;
+   struct RGBA_Draw_Context_clip c_bkp;
+   int i;
+
+   /* handle cutouts here! */
+   EINA_RECTANGLE_SET(&dr, x, y, w, h);
+
+   if (_is_empty_rectangle(&dr)) return;
+   if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
+     return;
+
+   /* no cutouts - cut right to the chase */
+   if (!dc->cutout.rects)
+     {
+        _soft16_rectangle_draw_int(dst, dc, dr);
+       return;
+     }
+
+   c_bkp = dc->clip;
+
+   evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
+   evas_common_draw_context_clip_clip(dc, x, y, w, h);
+   /* our clip is 0 size.. abort */
+   if ((dc->clip.w <= 0) || (dc->clip.h <= 0))
+     {
+       dc->clip = c_bkp;
+       return;
+     }
+   rects = evas_common_draw_context_apply_cutouts(dc);
+   for (i = 0; i < rects->active; ++i)
+     {
+       r = rects->rects + i;
+       evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h);
+        _soft16_rectangle_draw_int(dst, dc, dr);
+     }
+   evas_common_draw_context_apply_clear_cutouts(rects);
+   dc->clip = c_bkp;
+}
+
diff --git a/src/lib/engines/common_16/evas_soft16_scanline_blend.c b/src/lib/engines/common_16/evas_soft16_scanline_blend.c
new file mode 100644 (file)
index 0000000..c89eeaa
--- /dev/null
@@ -0,0 +1,353 @@
+/** NOTE: This file is meant to be included by users **/
+
+/** NOTE2: r, g, b parameters are 16bits, so you can pass 0 to 256 inclusive.
+ **        this is due our division by 256 when multiplying the color.
+ **/
+
+/*****************************************************************************
+ * Scanline processing
+ *
+ *    _soft16_scanline_<description>_<src>_<dst>[_<modifier>]()
+ *
+ ****************************************************************************/
+
+#include "evas_soft16_point_blend.c"
+
+/***********************************************************************
+ * Regular blend operations
+ */
+static void
+_soft16_scanline_blend_transp_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size)
+{
+   DATA16 *start, *end;
+
+   start = dst;
+   end = start + (size & ~7);
+
+   pld(alpha, 0);
+   pld(src, 0);
+
+   /* work on 8 pixels per time, do data preload */
+   while (start < end)
+     {
+       DATA8 alpha1, alpha2;
+
+       alpha1 = alpha[0];
+       alpha += 8;
+
+       /* empirical tests show these give the best performance */
+       pld(alpha, 8);
+       pld(src, 32);
+
+       src += 8;
+       start += 8;
+
+       alpha2 = alpha[-7];
+        _soft16_pt_blend_transp_solid(start - 8, src[-8], alpha1);
+
+       alpha1 = alpha[-6];
+        _soft16_pt_blend_transp_solid(start - 7, src[-7], alpha2);
+
+       alpha2 = alpha[-5];
+       _soft16_pt_blend_transp_solid(start - 6, src[-6], alpha1);
+
+       alpha1 = alpha[-4];
+       _soft16_pt_blend_transp_solid(start - 5, src[-5], alpha2);
+
+       alpha2 = alpha[-3];
+       _soft16_pt_blend_transp_solid(start - 4, src[-4], alpha1);
+
+       alpha1 = alpha[-2];
+       _soft16_pt_blend_transp_solid(start - 3, src[-3], alpha2);
+
+       alpha2 = alpha[-1];
+       _soft16_pt_blend_transp_solid(start - 2, src[-2], alpha1);
+
+       _soft16_pt_blend_transp_solid(start - 1, src[-1], alpha2);
+     }
+
+   /* remaining pixels (up to 7) */
+   end = start + (size & 7);
+   for (; start < end; start++, src++, alpha++)
+      _soft16_pt_blend_transp_solid(start, *src, *alpha);
+}
+
+static inline void
+_soft16_scanline_blend_solid_solid(DATA16 *src, DATA16 *dst, int size)
+{
+   memcpy(dst, src, size * sizeof(DATA16));
+}
+
+/***********************************************************************
+ * Blend operations taking an extra alpha (fade in, out)
+ */
+
+static void
+_soft16_scanline_blend_transp_solid_mul_alpha(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, const DATA8 rel_alpha)
+{
+   DATA16 *start, *end;
+
+   start = dst;
+   end = start + (size & ~7);
+
+   pld(alpha, 0);
+   pld(src, 0);
+
+   while (start < end)
+     {
+       DATA8 alpha1, alpha2;
+
+       alpha1 = alpha[0];
+       alpha += 8;
+
+       pld(alpha, 8);
+       pld(src, 32);
+
+       src += 8;
+       start += 8;
+
+       alpha2 = alpha[-7];
+       _soft16_pt_blend_transp_solid_mul_alpha
+           (start - 8, src[-8], alpha1, rel_alpha);
+
+       alpha1 = alpha[-6];
+       _soft16_pt_blend_transp_solid_mul_alpha
+           (start - 7, src[-7], alpha2, rel_alpha);
+
+       alpha2 = alpha[-5];
+       _soft16_pt_blend_transp_solid_mul_alpha
+           (start - 6, src[-6], alpha1, rel_alpha);
+
+       alpha1 = alpha[-4];
+       _soft16_pt_blend_transp_solid_mul_alpha
+           (start - 5, src[-5], alpha2, rel_alpha);
+
+       alpha2 = alpha[-3];
+       _soft16_pt_blend_transp_solid_mul_alpha
+           (start - 4, src[-4], alpha1, rel_alpha);
+
+       alpha1 = alpha[-2];
+       _soft16_pt_blend_transp_solid_mul_alpha
+           (start - 3, src[-3], alpha2, rel_alpha);
+
+       alpha2 = alpha[-1];
+       _soft16_pt_blend_transp_solid_mul_alpha
+           (start - 2, src[-2], alpha1, rel_alpha);
+
+       _soft16_pt_blend_transp_solid_mul_alpha
+           (start - 1, src[-1], alpha2, rel_alpha);
+     }
+
+   end = start + (size & 7);
+   for (; start < end; start++, src++, alpha++)
+      _soft16_pt_blend_transp_solid_mul_alpha(start, *src, *alpha, rel_alpha);
+}
+
+static void
+_soft16_scanline_blend_solid_solid_mul_alpha(DATA16 *src, DATA16 *dst, int size, DATA8 rel_alpha)
+{
+   DATA16 *start, *end;
+
+   start = dst;
+   end = start + (size & ~7);
+
+   pld(src, 0);
+
+   while (start < end)
+     {
+       pld(src, 32);
+        UNROLL8({
+           _soft16_pt_blend_solid_solid_mul_alpha(start, *src, rel_alpha);
+           start++;
+           src++;
+        });
+     }
+
+   end = start + (size & 7);
+   for (; start < end; start++, src++)
+     _soft16_pt_blend_solid_solid_mul_alpha(start, *src, rel_alpha);
+}
+
+/***********************************************************************
+ * Blend operations with extra alpha and multiply color
+ */
+
+static void
+_soft16_scanline_blend_transp_solid_mul_color_transp(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b)
+{
+   DATA16 *start, *end;
+
+   start = dst;
+   end = start + (size & ~7);
+
+   pld(alpha, 0);
+   pld(src, 0);
+
+   while (start < end)
+     {
+       DATA8 alpha1, alpha2;
+
+       alpha1 = alpha[0];
+       alpha += 8;
+
+        pld(src, 32);
+        pld(start, 32);
+
+       src += 8;
+       start += 8;
+
+       alpha2 = alpha[-7];
+        _soft16_pt_blend_transp_solid_mul_color_transp
+           (start - 8, src[-8], alpha1, rel_alpha, r, g, b);
+
+       alpha1 = alpha[-6];
+        _soft16_pt_blend_transp_solid_mul_color_transp
+           (start - 7, src[-7], alpha2, rel_alpha, r, g, b);
+
+       alpha2 = alpha[-5];
+        _soft16_pt_blend_transp_solid_mul_color_transp
+           (start - 6, src[-6], alpha1, rel_alpha, r, g, b);
+
+       alpha1 = alpha[-4];
+        _soft16_pt_blend_transp_solid_mul_color_transp
+           (start - 5, src[-5], alpha2, rel_alpha, r, g, b);
+
+       alpha2 = alpha[-3];
+        _soft16_pt_blend_transp_solid_mul_color_transp
+           (start - 4, src[-4], alpha1, rel_alpha, r, g, b);
+
+       alpha1 = alpha[-2];
+        _soft16_pt_blend_transp_solid_mul_color_transp
+           (start - 3, src[-3], alpha2, rel_alpha, r, g, b);
+
+       alpha2 = alpha[-1];
+        _soft16_pt_blend_transp_solid_mul_color_transp
+           (start - 2, src[-2], alpha1, rel_alpha, r, g, b);
+
+        _soft16_pt_blend_transp_solid_mul_color_transp
+           (start - 1, src[-1], alpha2, rel_alpha, r, g, b);
+     }
+
+   end = start + (size & 7);
+   for (; start < end; start++, src++, alpha++)
+      _soft16_pt_blend_transp_solid_mul_color_transp
+         (start, *src, *alpha, rel_alpha, r, g, b);
+}
+
+static void
+_soft16_scanline_blend_solid_solid_mul_color_transp(DATA16 *src, DATA16 *dst, int size, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b)
+{
+   DATA16 *start, *end;
+
+   start = dst;
+   end = start + (size & ~7);
+
+   pld(src, 0);
+
+   while (start < end)
+     {
+       pld(src, 32);
+        UNROLL8({
+           _soft16_pt_blend_solid_solid_mul_color_transp
+              (start, *src, rel_alpha, r, g, b);
+           start++;
+           src++;
+        });
+     }
+
+   end = start + (size & 7);
+   for (; start < end; start++, src++)
+      _soft16_pt_blend_solid_solid_mul_color_transp
+         (start, *src, rel_alpha, r, g, b);
+}
+
+/***********************************************************************
+ * Blend operations with extra multiply color
+ */
+
+static void
+_soft16_scanline_blend_transp_solid_mul_color_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, DATA16 r, DATA16 g, DATA16 b)
+{
+   DATA16 *start, *end;
+
+   start = dst;
+   end = start + (size & ~7);
+
+   pld(alpha, 0);
+   pld(src, 0);
+
+   while (start < end)
+     {
+       DATA8 alpha1, alpha2;
+
+       alpha1 = alpha[0];
+       alpha += 8;
+
+       pld(alpha, 8);
+       pld(src, 32);
+
+       src += 8;
+       start += 8;
+
+       alpha2 = alpha[-7];
+        _soft16_pt_blend_transp_solid_mul_color_solid
+           (start - 8, src[-8], alpha1, r, g, b);
+
+       alpha1 = alpha[-6];
+        _soft16_pt_blend_transp_solid_mul_color_solid
+           (start - 7, src[-7], alpha2, r, g, b);
+
+       alpha2 = alpha[-5];
+        _soft16_pt_blend_transp_solid_mul_color_solid
+           (start - 6, src[-6], alpha1, r, g, b);
+
+       alpha1 = alpha[-4];
+        _soft16_pt_blend_transp_solid_mul_color_solid
+           (start - 5, src[-5], alpha2, r, g, b);
+
+       alpha2 = alpha[-3];
+        _soft16_pt_blend_transp_solid_mul_color_solid
+           (start - 4, src[-4], alpha1, r, g, b);
+
+       alpha1 = alpha[-2];
+        _soft16_pt_blend_transp_solid_mul_color_solid
+           (start - 3, src[-3], alpha2, r, g, b);
+
+       alpha2 = alpha[-1];
+        _soft16_pt_blend_transp_solid_mul_color_solid
+           (start - 2, src[-2], alpha1, r, g, b);
+
+        _soft16_pt_blend_transp_solid_mul_color_solid
+           (start - 1, src[-1], alpha2, r, g, b);
+     }
+
+   end = start + (size & 7);
+   for (; start < end; start++, src++, alpha++)
+     _soft16_pt_blend_transp_solid_mul_color_solid
+        (start, *src, *alpha, r, g, b);
+}
+
+static void
+_soft16_scanline_blend_solid_solid_mul_color_solid(DATA16 *src, DATA16 *dst, int size, DATA8 r, DATA8 g, DATA8 b)
+{
+   DATA16 *start, *end;
+
+   start = dst;
+   end = start + (size & ~7);
+
+   pld(src, 0);
+
+   while (start < end)
+     {
+       pld(src, 32);
+        UNROLL8({
+           _soft16_pt_blend_solid_solid_mul_color_solid(start, *src, r, g, b);
+           start++;
+           src++;
+        });
+     }
+
+   end = start + (size & 7);
+   for (; start < end; start++, src++)
+     _soft16_pt_blend_solid_solid_mul_color_solid(start, *src, r, g, b);
+}
diff --git a/src/lib/engines/common_16/evas_soft16_scanline_fill.c b/src/lib/engines/common_16/evas_soft16_scanline_fill.c
new file mode 100644 (file)
index 0000000..b4ab630
--- /dev/null
@@ -0,0 +1,86 @@
+/** NOTE: This file is meant to be included by users **/
+
+/*****************************************************************************
+ * Point processing
+ *
+ *    _soft16_pt_<description>_<src>_<dst>[_<modifier>]()
+ *
+ * Scanline processing
+ *
+ *    _soft16_scanline_<description>_<src>_<dst>[_<modifier>]()
+ *
+ ****************************************************************************/
+static always_inline void
+_soft16_pt_fill_solid_solid(DATA16 *dst, DATA16 rgb565)
+{
+   *dst = rgb565;
+}
+
+static void
+_soft16_scanline_fill_solid_solid(DATA16 *dst, int size, DATA16 rgb565)
+{
+   DATA16 *start, *end;
+   DATA32 rgb565_double;
+
+   start = dst;
+
+   if ((long)start & 0x2)
+     {
+       *start = rgb565;
+       start++;
+       size--;
+     }
+
+   end = start + (size & ~7);
+
+   rgb565_double = (rgb565 << 16) | rgb565;
+
+   while (start < end)
+     {
+        DATA32 *p = (DATA32 *)start;
+
+        p[0] = rgb565_double;
+        p[1] = rgb565_double;
+        p[2] = rgb565_double;
+        p[3] = rgb565_double;
+
+        start += 8;
+     }
+
+   end = start + (size & 7);
+   for (; start < end; start++)
+      *start = rgb565;
+}
+
+static always_inline void
+_soft16_pt_fill_transp_solid(DATA16 *dst, DATA32 rgb565_unpack, DATA8 alpha)
+{
+   DATA32 d;
+
+   d = RGB_565_UNPACK(*dst);
+   d = RGB_565_UNPACKED_BLEND(rgb565_unpack, d, alpha);
+   *dst = RGB_565_PACK(d);
+}
+
+static void
+_soft16_scanline_fill_transp_solid(DATA16 *dst, int size, DATA32 rgb565_unpack, DATA8 alpha)
+{
+   DATA16 *start, *end;
+
+   start = dst;
+   pld(start, 0);
+   end = start + (size & ~7);
+
+   while (start < end)
+     {
+        pld(start, 32);
+        UNROLL8({
+           _soft16_pt_fill_transp_solid(start, rgb565_unpack, alpha);
+           start++;
+        });
+     }
+
+   end = start + (size & 7);
+   for (; start < end; start++)
+     _soft16_pt_fill_transp_solid(start, rgb565_unpack, alpha);
+}
diff --git a/src/lib/file/.cvsignore b/src/lib/file/.cvsignore
new file mode 100644 (file)
index 0000000..e62a1b3
--- /dev/null
@@ -0,0 +1,7 @@
+Makefile.in
+Makefile
+.deps
+.libs
+libevas_file.la
+evas_path.lo
+evas_module.lo
diff --git a/src/lib/file/Makefile.am b/src/lib/file/Makefile.am
new file mode 100644 (file)
index 0000000..8d0ee97
--- /dev/null
@@ -0,0 +1,24 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-DPACKAGE_BIN_DIR=\"$(bindir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@EVIL_CFLAGS@ \
+@WIN32_CPPFLAGS@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+noinst_LTLIBRARIES      = libevas_file.la
+libevas_file_la_SOURCES  = \
+evas_path.c \
+evas_module.c
+libevas_file_la_LIBADD = @EINA_LIBS@ @EVIL_LIBS@
+
+EXTRA_DIST = evas_module.h evas_path.h
diff --git a/src/lib/file/evas_module.c b/src/lib/file/evas_module.c
new file mode 100644 (file)
index 0000000..e00f4e7
--- /dev/null
@@ -0,0 +1,546 @@
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+#endif
+
+#include <string.h>
+
+#include <evas_common.h>
+#include <evas_private.h>
+#include <evas_module.h>
+
+#ifdef _WIN32
+# ifdef open
+#  undef open
+# endif
+# ifdef close
+#  undef close
+# endif
+#endif
+
+
+static Eina_Hash *evas_modules[4] = {
+  NULL,
+  NULL,
+  NULL,
+  NULL
+};
+
+static Eina_List *eina_evas_modules = NULL;
+static Eina_List *evas_module_paths = NULL;
+static Eina_Array *evas_engines = NULL;
+
+static Eina_List *
+_evas_module_append(Eina_List *list, char *path)
+{
+   if (path)
+     {
+       if (evas_file_path_exists(path))
+         list = eina_list_append(list, path);
+       else
+         free(path);
+     }
+   return list;
+}
+
+/* this will alloc a list of paths to search for the modules */
+/* by now these are:  */
+/* 1. ~/.evas/modules/ */
+/* 2. $(EVAS_MODULE_DIR)/evas/modules/ */
+/* 3. dladdr/evas/modules/ */
+/* 4. PREFIX/evas/modules/ */
+void
+evas_module_paths_init(void)
+{
+   char *path, *path2;
+#ifndef _MSC_VER
+   const char *path3;
+#endif
+
+   /* 1. ~/.evas/modules/ */
+   path = eina_module_environment_path_get("HOME", "/.evas/modules");
+   evas_module_paths = _evas_module_append(evas_module_paths, path);
+
+   /* 2. $(EVAS_MODULE_DIR)/evas/modules/ */
+   path = eina_module_environment_path_get("EVAS_MODULES_DIR", "/evas/modules");
+   evas_module_paths = _evas_module_append(evas_module_paths, path);
+
+   /* 3. libevas.so/../evas/modules/ */
+   path2 = eina_module_symbol_path_get(evas_module_paths_init, "/evas/modules");
+   if (path2 && path && (strcmp(path, path2) == 0))
+     free(path2);
+   else
+     evas_module_paths = _evas_module_append(evas_module_paths, path2);
+
+   /* 4. PREFIX/evas/modules/ */
+#ifndef _MSC_VER
+   path3 = PACKAGE_LIB_DIR "/evas/modules";
+   if ((path && (strcmp(path, path3) != 0)) ||
+       (path2 && (strcmp(path2, path3) != 0)) ||
+       (!path && !path2))
+     {
+       path = strdup(path3);
+       if (path)
+         evas_module_paths = _evas_module_append(evas_module_paths, path);
+     }
+#endif
+}
+
+#define EVAS_EINA_STATIC_MODULE_DEFINE(Tn, Name)       \
+  Eina_Bool evas_##Tn##_##Name##_init(void);           \
+  void evas_##Tn##_##Name##_shutdown(void);
+
+#define EVAS_EINA_STATIC_MODULE_USE(Tn, Name)  \
+  { evas_##Tn##_##Name##_init, evas_##Tn##_##Name##_shutdown }
+
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, buffer);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, cairo_x11);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, direct3d);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, directfb);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, fb);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, gl_glew);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, gl_x11);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, quartz);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_16);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_16_ddraw);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_16_sdl);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_16_wince);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_16_x11);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_ddraw);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_gdi);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_generic);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_qtopia);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_sdl);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_x11);
+EVAS_EINA_STATIC_MODULE_DEFINE(engine, xrender_x11);
+EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, xpm);
+EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, tiff);
+EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, svg);
+EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, png);
+EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, pmaps);
+EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, jpeg);
+EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, gif);
+EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, eet);
+EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, edb);
+EVAS_EINA_STATIC_MODULE_DEFINE(image_saver, edb);
+EVAS_EINA_STATIC_MODULE_DEFINE(image_saver, eet);
+EVAS_EINA_STATIC_MODULE_DEFINE(image_saver, jpeg);
+EVAS_EINA_STATIC_MODULE_DEFINE(image_saver, png);
+EVAS_EINA_STATIC_MODULE_DEFINE(image_saver, tiff);
+
+static const struct {
+   Eina_Bool (*init)(void);
+   void (*shutdown)(void);
+} evas_static_module[] = {
+#ifdef EVAS_STATIC_BUILD_BUFFER
+  EVAS_EINA_STATIC_MODULE_USE(engine, buffer),
+#endif
+#ifdef EVAS_STATIC_BUILD_CAIRO_X11
+  EVAS_EINA_STATIC_MODULE_USE(engine, cairo_x11),
+#endif
+#ifdef EVAS_STATIC_BUILD_DIRECT3D
+  EVAS_EINA_STATIC_MODULE_USE(engine, direct3d),
+#endif
+#ifdef EVAS_STATIC_BUILD_DIRECTFB
+  EVAS_EINA_STATIC_MODULE_USE(engine, directfb),
+#endif
+#ifdef EVAS_STATIC_BUILD_FB
+  EVAS_EINA_STATIC_MODULE_USE(engine, fb),
+#endif
+#ifdef EVAS_STATIC_BUILD_GL_GLEW
+  EVAS_EINA_STATIC_MODULE_USE(engine, gl_glew),
+#endif
+#ifdef EVAS_STATIC_BUILD_GL_X11
+  EVAS_EINA_STATIC_MODULE_USE(engine, gl_x11),
+#endif
+#ifdef EVAS_STATIC_BUILD_QUARTZ
+  EVAS_EINA_STATIC_MODULE_USE(engine, quartz),
+#endif
+#ifdef EVAS_STATIC_BUILD_SOFTWARE_16
+  EVAS_EINA_STATIC_MODULE_USE(engine, software_16),
+#endif
+#ifdef EVAS_STATIC_BUILD_SOFTWARE_16_DDRAW
+  EVAS_EINA_STATIC_MODULE_USE(engine, software_16_ddraw),
+#endif
+#ifdef EVAS_STATIC_BUILD_SOFTWARE_16_SDL
+  EVAS_EINA_STATIC_MODULE_USE(engine, software_16_sdl),
+#endif
+#ifdef EVAS_STATIC_BUILD_SOFTWARE_16_WINCE
+  EVAS_EINA_STATIC_MODULE_USE(engine, software_16_wince),
+#endif
+#ifdef EVAS_STATIC_BUILD_SOFTWARE_16_X11
+  EVAS_EINA_STATIC_MODULE_USE(engine, software_16_x11),
+#endif
+#ifdef EVAS_STATIC_BUILD_SOFTWARE_16_DDRAW
+  EVAS_EINA_STATIC_MODULE_USE(engine, software_ddraw),
+#endif
+#ifdef EVAS_STATIC_BUILD_SOFTWARE_16_GDI
+  EVAS_EINA_STATIC_MODULE_USE(engine, software_gdi),
+#endif
+#ifdef EVAS_STATIC_BUILD_SOFTWARE_GENERIC
+  EVAS_EINA_STATIC_MODULE_USE(engine, software_generic),
+#endif
+#ifdef EVAS_STATIC_BUILD_SOFTWARE_QTOPIA
+  EVAS_EINA_STATIC_MODULE_USE(engine, software_qtopia),
+#endif
+#ifdef EVAS_STATIC_BUILD_SOFTWARE_SDL
+  EVAS_EINA_STATIC_MODULE_USE(engine, software_sdl),
+#endif
+#ifdef EVAS_STATIC_BUILD_SOFTWARE_X11
+  EVAS_EINA_STATIC_MODULE_USE(engine, software_x11),
+#endif
+#ifdef EVAS_STATIC_BUILD_XRENDER_X11
+  EVAS_EINA_STATIC_MODULE_USE(engine, xrender_x11),
+#endif
+#ifdef EVAS_STATIC_BUILD_XPM
+  EVAS_EINA_STATIC_MODULE_USE(image_loader, xpm),
+#endif
+#ifdef EVAS_STATIC_BUILD_TIFF
+  EVAS_EINA_STATIC_MODULE_USE(image_loader, tiff),
+#endif
+#ifdef EVAS_STATIC_BUILD_SVG
+  EVAS_EINA_STATIC_MODULE_USE(image_loader, svg),
+#endif
+#ifdef EVAS_STATIC_BUILD_PNG
+  EVAS_EINA_STATIC_MODULE_USE(image_loader, png),
+#endif
+#ifdef EVAS_STATIC_BUILD_PMAPS
+  EVAS_EINA_STATIC_MODULE_USE(image_loader, pmaps),
+#endif
+#ifdef EVAS_STATIC_BUILD_JPEG
+  EVAS_EINA_STATIC_MODULE_USE(image_loader, jpeg),
+#endif
+#ifdef EVAS_STATIC_BUILD_GIF
+  EVAS_EINA_STATIC_MODULE_USE(image_loader, gif),
+#endif
+#ifdef EVAS_STATIC_BUILD_EET
+  EVAS_EINA_STATIC_MODULE_USE(image_loader, eet),
+#endif
+#ifdef EVAS_STATIC_BUILD_EDB
+  EVAS_EINA_STATIC_MODULE_USE(image_loader, edb),
+#endif
+#ifdef EVAS_STATIC_BUILD_EDB
+  EVAS_EINA_STATIC_MODULE_USE(image_saver, edb),
+#endif
+#ifdef EVAS_STATIC_BUILD_EET
+  EVAS_EINA_STATIC_MODULE_USE(image_saver, eet),
+#endif
+#ifdef EVAS_STATIC_BUILD_JPEG
+  EVAS_EINA_STATIC_MODULE_USE(image_saver, jpeg),
+#endif
+#ifdef EVAS_STATIC_BUILD_PNG
+  EVAS_EINA_STATIC_MODULE_USE(image_saver, png),
+#endif
+#ifdef EVAS_STATIC_BUILD_TIFF
+  EVAS_EINA_STATIC_MODULE_USE(image_saver, tiff),
+#endif
+  { NULL, NULL }
+};
+
+/* this will alloc an Evas_Module struct for each module
+ * it finds on the paths */
+void
+evas_module_init(void)
+{
+   int i;
+
+   evas_module_paths_init();
+
+   evas_modules[EVAS_MODULE_TYPE_ENGINE] = eina_hash_string_small_new(/* FIXME: Add a function to cleanup stuff. */ NULL);
+   evas_modules[EVAS_MODULE_TYPE_IMAGE_LOADER] = eina_hash_string_small_new(/* FIXME: Add a function to cleanup stuff. */ NULL);
+   evas_modules[EVAS_MODULE_TYPE_IMAGE_SAVER] = eina_hash_string_small_new(/* FIXME: Add a function to cleanup stuff. */ NULL);
+   evas_modules[EVAS_MODULE_TYPE_OBJECT] = eina_hash_string_small_new(/* FIXME: Add a function to cleanup stuff. */ NULL);
+
+   evas_engines = eina_array_new(4);
+
+   for (i = 0; evas_static_module[i].init != NULL; ++i)
+     evas_static_module[i].init();
+}
+
+Eina_Bool
+evas_module_register(const Evas_Module_Api *module, Evas_Module_Type type)
+{
+   Evas_Module *em;
+
+   if (type < 0 || type > 3) return EINA_FALSE;
+   if (module->version != EVAS_MODULE_API_VERSION) return EINA_FALSE;
+   if (!module) return EINA_FALSE;
+
+   em = eina_hash_find(evas_modules[type], module->name);
+   if (em) return EINA_FALSE;
+
+   em = calloc(1, sizeof (Evas_Module));
+   if (!em) return EINA_FALSE;
+
+   em->definition = module;
+
+   if (type == EVAS_MODULE_TYPE_ENGINE)
+     {
+       eina_array_push(evas_engines, em);
+       em->id_engine = eina_array_count_get(evas_engines);
+     }
+
+   eina_hash_direct_add(evas_modules[type], module->name, em);
+
+   return EINA_TRUE;
+}
+
+Eina_Bool
+evas_module_unregister(const Evas_Module_Api *module, Evas_Module_Type type)
+{
+   Evas_Module *em;
+
+   if (type < 0 || type > 3) return EINA_FALSE;
+   if (!module) return EINA_FALSE;
+
+   em = eina_hash_find(evas_modules[type], module->name);
+   if (!em || em->definition != module) return EINA_FALSE;
+
+   if (type == EVAS_MODULE_TYPE_ENGINE)
+     eina_array_data_set(evas_engines, em->id_engine, NULL);
+
+   eina_hash_del(evas_modules[type], module->name, em);
+   free(em);
+
+   return EINA_TRUE;
+}
+
+#if defined(__CEGCC__) || defined(__MINGW32CE__)
+# define EVAS_MODULE_NAME_IMAGE_SAVER "saver_%s.dll"
+# define EVAS_MODULE_NAME_IMAGE_LOADER "loader_%s.dll"
+# define EVAS_MODULE_NAME_ENGINE "engine_%s.dll"
+# define EVAS_MODULE_NAME_OBJECT "object_%s.dll"
+#elif _WIN32
+# define EVAS_MODULE_NAME_IMAGE_SAVER "module.dll"
+# define EVAS_MODULE_NAME_IMAGE_LOADER "module.dll"
+# define EVAS_MODULE_NAME_ENGINE "module.dll"
+# define EVAS_MODULE_NAME_OBJECT "module.dll"
+#else
+# define EVAS_MODULE_NAME_IMAGE_SAVER "module.so"
+# define EVAS_MODULE_NAME_IMAGE_LOADER "module.so"
+# define EVAS_MODULE_NAME_ENGINE "module.so"
+# define EVAS_MODULE_NAME_OBJECT "module.so"
+#endif
+
+Evas_Module *
+evas_module_find_type(Evas_Module_Type type, const char *name)
+{
+   const char *path;
+   const char *format = NULL;
+   char buffer[4096];
+   Evas_Module *em;
+   Eina_Module *en;
+   Eina_List *l;
+
+   if (type < 0 || type > 3) return NULL;
+
+   em = eina_hash_find(evas_modules[type], name);
+   if (em) return em;
+
+   EINA_LIST_FOREACH(evas_module_paths, l, path)
+     {
+       switch (type)
+         {
+          case EVAS_MODULE_TYPE_ENGINE: format = "%s/engines/%s/%s/" EVAS_MODULE_NAME_ENGINE; break;
+          case EVAS_MODULE_TYPE_IMAGE_LOADER: format = "%s/loaders/%s/%s/" EVAS_MODULE_NAME_IMAGE_LOADER; break;
+          case EVAS_MODULE_TYPE_IMAGE_SAVER: format = "%s/savers/%s/%s/" EVAS_MODULE_NAME_IMAGE_SAVER; break;
+          case EVAS_MODULE_TYPE_OBJECT: format = "%s/object/%s/%s/" EVAS_MODULE_NAME_OBJECT; break;
+         }
+
+       snprintf(buffer, sizeof (buffer), format, path, name, MODULE_ARCH, name);
+       if (!evas_file_path_is_file(buffer)) continue;
+
+       en = eina_module_new(buffer);
+       if (!en) continue;
+
+       if (!eina_module_load(en))
+         {
+            eina_module_free(en);
+            continue;
+         }
+
+       em = eina_hash_find(evas_modules[type], name);
+       if (em)
+         {
+            eina_evas_modules = eina_list_append(eina_evas_modules, en);
+            return em;
+         }
+
+       eina_module_free(en);
+     }
+
+   return NULL;
+}
+
+Evas_Module *
+evas_module_engine_get(int render_method)
+{
+   if (render_method <= 0 || render_method > eina_array_count_get(evas_engines))
+     return NULL;
+   return eina_array_data_get(evas_engines, render_method - 1);
+}
+
+void
+evas_module_foreach_image_loader(Eina_Hash_Foreach cb, const void *fdata)
+{
+   eina_hash_foreach(evas_modules[EVAS_MODULE_TYPE_IMAGE_LOADER], cb, fdata);
+}
+
+int
+evas_module_load(Evas_Module *em)
+{
+   if (em->loaded) return 1;
+   if (em->definition == NULL) return 0;
+
+   if (!em->definition->func.open(em)) return 0;
+   em->loaded = 1;
+
+#ifdef BUILD_ASYNC_PRELOAD
+   LKI(em->lock);
+#endif
+   return 1;
+}
+
+void
+evas_module_unload(Evas_Module *em)
+{
+   if (!em->loaded)
+     return;
+   if (em->definition == NULL)
+     return ;
+
+   em->definition->func.close(em);
+   em->loaded = 0;
+
+#ifdef BUILD_ASYNC_PRELOAD
+   LKD(em->lock);
+#endif
+}
+
+void
+evas_module_ref(Evas_Module *em)
+{
+#ifdef BUILD_ASYNC_PRELOAD
+   LKL(em->lock);
+#endif
+   em->ref++;
+#ifdef BUILD_ASYNC_PRELOAD
+   LKU(em->lock);
+#endif
+}
+
+void
+evas_module_unref(Evas_Module *em)
+{
+#ifdef BUILD_ASYNC_PRELOAD
+   LKL(em->lock);
+#endif
+   em->ref--;
+#ifdef BUILD_ASYNC_PRELOAD
+   LKU(em->lock);
+#endif
+}
+
+static int use_count = 0;
+
+void
+evas_module_use(Evas_Module *em)
+{
+   em->last_used = use_count;
+}
+
+void
+evas_module_clean(void)
+{
+   static int call_count = 0;
+/*    int ago; */
+   int noclean = -1;
+/*    Eina_List *l; */
+/*    Evas_Module *em; */
+
+   /* only clean modules every 256 calls */
+   call_count++;
+   if (call_count <= 256) return;
+   call_count = 0;
+
+   if (noclean == -1)
+     {
+       if (getenv("EVAS_NOCLEAN"))
+         {
+            noclean = 1;
+         }
+       noclean = 0;
+     }
+   if (noclean == 1) return;
+
+   /* disable module cleaning for now - may cause instability with some modules */
+   return;
+
+   /* FIXME: Don't know what it is supposed to do. */
+/*    /\* incriment use counter = 28bits *\/ */
+/*    use_count++; */
+/*    if (use_count > 0x0fffffff) use_count = 0; */
+
+/*    /\* printf("CLEAN!\n"); *\/ */
+/*    /\* go through all modules *\/ */
+/*    EINA_LIST_FOREACH(evas_modules, l, em) */
+/*      { */
+/*         /\* printf("M %s %i %i\n", em->name, em->ref, em->loaded); *\/ */
+/*     /\* if the module is refernced - skip *\/ */
+/*     if ((em->ref > 0) || (!em->loaded)) continue; */
+/*     /\* how many clean cycles ago was this module last used *\/ */
+/*     ago = use_count - em->last_used; */
+/*     if (em->last_used > use_count) ago += 0x10000000; */
+/*     /\* if it was used last more than N clean cycles ago - unload *\/ */
+/*     if (ago > 5) */
+/*       { */
+/*             /\* printf("  UNLOAD %s\n", em->name); *\/ */
+/*          evas_module_unload(em); */
+/*       } */
+/*      } */
+}
+
+/* will dlclose all the modules loaded and free all the structs */
+void
+evas_module_shutdown(void)
+{
+   Eina_Module *en;
+   char *path;
+   int i;
+
+   for (i = 0; evas_static_module[i].shutdown != NULL; ++i)
+     evas_static_module[i].shutdown();
+
+   EINA_LIST_FREE(eina_evas_modules, en)
+     eina_module_free(en);
+
+   eina_hash_free(evas_modules[EVAS_MODULE_TYPE_ENGINE]);
+   eina_hash_free(evas_modules[EVAS_MODULE_TYPE_IMAGE_LOADER]);
+   eina_hash_free(evas_modules[EVAS_MODULE_TYPE_IMAGE_SAVER]);
+   eina_hash_free(evas_modules[EVAS_MODULE_TYPE_OBJECT]);
+
+   EINA_LIST_FREE(evas_module_paths, path)
+     free(path);
+
+   eina_array_free(evas_engines);
+   evas_engines = NULL;
+}
+
+EAPI int
+_evas_module_engine_inherit(Evas_Func *funcs, char *name)
+{
+   Evas_Module *em;
+
+   em = evas_module_find_type(EVAS_MODULE_TYPE_ENGINE, name);
+   if (em)
+     {
+       if (evas_module_load(em))
+         {
+            /* FIXME: no way to unref */
+            evas_module_ref(em);
+            evas_module_use(em);
+            *funcs = *((Evas_Func *)(em->functions));
+            return 1;
+         }
+     }
+   return 0;
+}
diff --git a/src/lib/file/evas_module.h b/src/lib/file/evas_module.h
new file mode 100644 (file)
index 0000000..8699b6b
--- /dev/null
@@ -0,0 +1,94 @@
+#ifndef _EVAS_MODULE_H
+#define _EVAS_MODULE_H
+
+
+/* the module api version */
+#define EVAS_MODULE_API_VERSION 2
+
+
+/* the module types */
+typedef enum _Evas_Module_Type
+{
+   EVAS_MODULE_TYPE_ENGINE = 0,
+   EVAS_MODULE_TYPE_IMAGE_LOADER = 1,
+   EVAS_MODULE_TYPE_IMAGE_SAVER = 2,
+   EVAS_MODULE_TYPE_OBJECT = 3
+} Evas_Module_Type;
+
+
+typedef struct _Evas_Module_Api    Evas_Module_Api;
+typedef struct _Evas_Module        Evas_Module;
+typedef struct _Evas_Module_Path   Evas_Module_Path;
+typedef struct _Evas_Module_Engine Evas_Module_Engine;
+typedef struct _Evas_Module_Public Evas_Module_Public;
+
+/* the module api structure, all modules should define this struct */
+struct _Evas_Module_Api
+{
+   int                 version;
+   const char          *name;
+   const char          *author;
+
+   struct
+     {
+       int (*open)(Evas_Module *);
+       void (*close)(Evas_Module *);
+     } func;
+};
+
+/* the module structure */
+struct _Evas_Module
+{
+   const Evas_Module_Api *definition;
+
+   void                *functions;     /* this are the functions exported by the module */
+   int           id_engine;    /* some internal data for the module i.e the id for engines */
+
+   int           ref; /* how many refs */
+   int           last_used; /* the cycle count when it was last used */
+
+   LK(lock);
+
+   unsigned char       loaded : 1;
+};
+
+
+/* the internals of the module api use this struct to reference a path with a module type
+ * instead of deduce the type from the path.
+ * */
+struct _Evas_Module_Path
+{
+   Evas_Module_Type    type;
+   char                       *path;
+};
+
+void         evas_module_paths_init (void);
+void         evas_module_init       (void);
+Evas_Module *evas_module_find_type  (Evas_Module_Type type, const char *name);
+Evas_Module *evas_module_engine_get(int render_method);
+void         evas_module_foreach_image_loader(Eina_Hash_Foreach cb, const void *fdata);
+int          evas_module_load       (Evas_Module *em);
+void         evas_module_unload     (Evas_Module *em);
+void         evas_module_ref        (Evas_Module *em);
+void         evas_module_unref      (Evas_Module *em);
+void         evas_module_use        (Evas_Module *em);
+void         evas_module_clean      (void);
+void         evas_module_shutdown   (void);
+EAPI Eina_Bool    evas_module_register   (const Evas_Module_Api *module, Evas_Module_Type type);
+EAPI Eina_Bool    evas_module_unregister (const Evas_Module_Api *module, Evas_Module_Type type);
+
+#define EVAS_MODULE_DEFINE(Type, Tn, Name)             \
+  Eina_Bool evas_##Tn##_##Name##_init(void)            \
+  {                                                    \
+     return evas_module_register(&evas_modapi, Type);  \
+  }                                                    \
+  void evas_##Tn##_##Name##_shutdown(void)             \
+  {                                                    \
+     evas_module_unregister(&evas_modapi, Type);       \
+  }
+
+#define EVAS_EINA_MODULE_DEFINE(Tn, Name)      \
+  EINA_MODULE_INIT(evas_##Tn##_##Name##_init); \
+  EINA_MODULE_SHUTDOWN(evas_##Tn##_##Name##_shutdown);
+
+#endif /* _EVAS_MODULE_H */
diff --git a/src/lib/file/evas_path.c b/src/lib/file/evas_path.c
new file mode 100644 (file)
index 0000000..809e060
--- /dev/null
@@ -0,0 +1,160 @@
+/* os dependant file code. for unix-y like fs's only for now */
+/* if your os doesn't use unix-like fs starting with "/" for the root and */
+/* the file path separator isn't "/" then you may need to help out by */
+/* adding in a new set of functions here */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <limits.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* get the casefold feature! */
+#include <fnmatch.h>
+#include <dirent.h>
+#ifndef _MSC_VER
+# include <unistd.h>
+# include <sys/param.h>
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+#ifdef _WIN32
+# define EVAS_PATH_SEPARATOR "\\"
+#else
+# define EVAS_PATH_SEPARATOR "/"
+#endif
+
+int
+evas_file_path_is_full_path(const char *path)
+{
+   if (!path) return 0;
+#if defined _WIN32_WCE
+   if (path[0] == '\\') return 1;
+#elif defined _WIN32
+   if ((path[0] == '\0') || (path[1] == '\0'))
+     return 0;
+   if (path[1] == ':') return 1;
+#else
+   if (path[0] == '/') return 1;
+#endif
+   return 0;
+}
+
+char *
+evas_file_path_join(const char *path, const char *end)
+{
+   char *res = NULL;
+   size_t len;
+
+   if ((!path) && (!end)) return NULL;
+   if (!path) return strdup(end);
+   if (!end) return strdup(path);
+   len = strlen(path);
+   len += strlen(end);
+   len += strlen(EVAS_PATH_SEPARATOR);
+   res = malloc(len + 1);
+   if (!res) return NULL;
+   strcpy(res, path);
+   strcat(res, EVAS_PATH_SEPARATOR);
+   strcat(res, end);
+   return res;
+}
+
+int
+evas_file_path_exists(const char *path)
+{
+   struct stat st;
+
+   if (!stat(path, &st)) return 1;
+   return 0;
+}
+
+int
+evas_file_path_is_file(const char *path)
+{
+   struct stat st;
+
+   if (stat(path, &st) == -1) return 0;
+   if (S_ISREG(st.st_mode)) return 1;
+   return 0;
+}
+
+int
+evas_file_path_is_dir(const char *path)
+{
+   struct stat st;
+
+   if (stat(path, &st) == -1) return 0;
+   if (S_ISDIR(st.st_mode)) return 1;
+   return 0;
+}
+
+Eina_List *
+evas_file_path_list(char *path, const char *match, int match_case)
+{
+   Eina_List *files = NULL;
+   DIR *dir;
+
+   dir = opendir(path);
+   if (!dir) return NULL;
+     {
+       struct dirent      *dp;
+       int flags;
+
+       flags = FNM_PATHNAME;
+#ifdef FNM_CASEFOLD
+       if (!match_case)
+         flags |= FNM_CASEFOLD;
+#else
+/*#warning "Your libc does not provide case-insensitive matching!"*/
+#endif
+       while ((dp = readdir(dir)))
+         {
+            if ((!strcmp(dp->d_name, ".")) || (!strcmp(dp->d_name, "..")))
+              continue;
+            if (match)
+              {
+                 if (fnmatch(match, dp->d_name, flags) == 0)
+                   files = eina_list_append(files, strdup(dp->d_name));
+              }
+            else
+              files = eina_list_append(files, strdup(dp->d_name));
+         }
+       closedir(dir);
+     }
+   return files;
+}
+
+DATA64
+evas_file_modified_time(const char *file)
+{
+   struct stat st;
+
+   if (stat(file, &st) < 0) return 0;
+   if (st.st_ctime > st.st_mtime) return (DATA64)st.st_ctime;
+   else return (DATA64)st.st_mtime;
+   return 0;
+}
+
+char *
+evas_file_path_resolve(const char *file)
+{
+#if 0
+   char buf[PATH_MAX], *buf2;
+#endif
+
+   return strdup(file);
+#if 0
+   if (!realpath(file, buf)) return NULL;
+   buf2 = strdup(buf);
+   return buf2;
+#endif
+}
diff --git a/src/lib/file/evas_path.h b/src/lib/file/evas_path.h
new file mode 100644 (file)
index 0000000..e0aa6bb
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef _EVAS_PATH_H
+#define _EVAS_PATH_H
+
+
+int        evas_file_path_is_full_path (const char *path);
+char      *evas_file_path_join         (const char *path, const char *end);
+int        evas_file_path_exists       (const char *path);
+int        evas_file_path_is_file      (const char *path);
+int        evas_file_path_is_dir       (const char *path);
+Eina_List *evas_file_path_list         (char *path, const char *match, int match_case);
+DATA64     evas_file_modified_time     (const char *file);
+char      *evas_file_path_resolve      (const char *file);
+
+
+#endif /* _EVAS_PATH_H */
diff --git a/src/lib/imaging/.cvsignore b/src/lib/imaging/.cvsignore
new file mode 100644 (file)
index 0000000..7b51b3c
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+evas_imaging.lo
+libevas_imaging.la
diff --git a/src/lib/imaging/Makefile.am b/src/lib/imaging/Makefile.am
new file mode 100644 (file)
index 0000000..e6efc95
--- /dev/null
@@ -0,0 +1,18 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS         = -I. \
+                      -I$(top_srcdir)/src/lib \
+                      -I$(top_srcdir)/src/lib/include \
+                      -DPACKAGE_BIN_DIR=\"$(bindir)\" \
+                      -DPACKAGE_LIB_DIR=\"$(libdir)\" \
+                      -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+                      @FREETYPE_CFLAGS@ \
+                      @EET_CFLAGS@ \
+                      @EINA_CFLAGS@
+
+noinst_LTLIBRARIES      = libevas_imaging.la
+libevas_imaging_la_SOURCES  = \
+evas_imaging.c
+
+libevas_imaging_la_DEPENDENCIES = $(top_builddir)/config.h
diff --git a/src/lib/imaging/evas_imaging.c b/src/lib/imaging/evas_imaging.c
new file mode 100644 (file)
index 0000000..ee07371
--- /dev/null
@@ -0,0 +1,246 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"  /* so that EAPI in Eet.h is correctly defined */
+#endif
+
+#ifdef BUILD_FONT_LOADER_EET
+#include <Eet.h>
+#endif
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+/**
+ * @addtogroup Evas_Imaging
+ * @{
+ */
+
+EAPI int evas_imaging_image_load_error = EVAS_LOAD_ERROR_NONE;
+
+EAPI Evas_Imaging_Image *
+evas_imaging_image_load(const char *file, const char *key)
+{
+   Evas_Imaging_Image *im;
+   RGBA_Image *image;
+
+   evas_imaging_image_load_error = EVAS_LOAD_ERROR_NONE;
+
+   if (!file) file = "";
+   if (!key) key = "";
+   evas_common_cpu_init();
+   evas_common_image_init();
+   image = evas_common_load_image_from_file
+     (file, key, NULL, &evas_imaging_image_load_error);
+   if (!image) return NULL;
+   im = calloc(1, sizeof(Evas_Imaging_Image));
+   if (!im)
+     {
+       evas_imaging_image_load_error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+        evas_cache_image_drop(&image->cache_entry);
+       return NULL;
+     }
+   im->image = image;
+   return im;
+}
+
+EAPI void
+evas_imaging_image_free(Evas_Imaging_Image *im)
+{
+   if (!im) return;
+   evas_cache_image_drop(&im->image->cache_entry);
+   free(im);
+}
+
+EAPI void
+evas_imaging_image_size_get(const Evas_Imaging_Image *im, int *w, int *h)
+{
+   if (!im) return;
+   if (w) *w = im->image->cache_entry.w;
+   if (h) *h = im->image->cache_entry.h;
+}
+
+EAPI Eina_Bool
+evas_imaging_image_alpha_get(const Evas_Imaging_Image *im)
+{
+   if (!im) return EINA_FALSE;
+   if (im->image->cache_entry.flags.alpha) return EINA_TRUE;
+   return EINA_FALSE;
+}
+
+EAPI void
+evas_imaging_image_cache_set(int bytes)
+{
+   evas_common_image_set_cache(bytes);
+}
+
+EAPI int
+evas_imaging_image_cache_get(void)
+{
+   return evas_common_image_get_cache();
+}
+
+static Evas_Font_Hinting_Flags _evas_hinting = EVAS_FONT_HINTING_BYTECODE;
+
+EAPI void
+evas_imaging_font_hinting_set(Evas_Font_Hinting_Flags hinting)
+{
+   _evas_hinting = hinting;
+}
+
+EAPI Evas_Font_Hinting_Flags
+evas_imaging_font_hinting_get(void)
+{
+   return _evas_hinting;
+}
+
+EAPI Eina_Bool
+evas_imaging_font_hinting_can_hint(Evas_Font_Hinting_Flags hinting)
+{
+   return evas_common_hinting_available(hinting);
+}
+
+EAPI Evas_Imaging_Font *
+evas_imaging_font_load(const char *file, const char *key, int size)
+{
+   Evas_Imaging_Font *fn;
+   RGBA_Font *font = NULL;
+
+   evas_common_cpu_init();
+   evas_common_font_init();
+   if (!file) file = "";
+   if ((key) && (key[0] == 0)) key = NULL;
+#ifdef BUILD_FONT_LOADER_EET
+   if (key)
+     {
+       char *tmp;
+
+       tmp = evas_file_path_join(file, key);
+       if (tmp)
+         {
+            font = evas_common_font_hinting_load(tmp, size, _evas_hinting);
+            if (!font)
+              {
+                 Eet_File *ef;
+
+                 ef = eet_open((char *)file, EET_FILE_MODE_READ);
+                 if (ef)
+                   {
+                      void *fdata;
+                      int fsize = 0;
+
+                      fdata = eet_read(ef, (char *)key, &fsize);
+                      if ((fdata) && (fsize > 0))
+                        {
+                           font = evas_common_font_memory_hinting_load(tmp, size, fdata, fsize, _evas_hinting);
+                           free(fdata);
+                        }
+                      eet_close(ef);
+                   }
+              }
+            free(tmp);
+         }
+     }
+   else
+#endif
+     {
+       font = evas_common_font_hinting_load((char *)file, size, _evas_hinting);
+     }
+   if (!font) return NULL;
+   fn = calloc(1, sizeof(RGBA_Font));
+   if (!fn) return NULL;
+   fn->font = font;
+   return fn;
+}
+
+EAPI void
+evas_imaging_font_free(Evas_Imaging_Font *fn)
+{
+   if (!fn) return;
+   evas_common_font_free(fn->font);
+   free(fn);
+}
+
+EAPI int
+evas_imaging_font_ascent_get(const Evas_Imaging_Font *fn)
+{
+   if (!fn) return 0;
+   return evas_common_font_ascent_get(fn->font);
+}
+
+EAPI int
+evas_imaging_font_descent_get(const Evas_Imaging_Font *fn)
+{
+   if (!fn) return 0;
+   return evas_common_font_descent_get(fn->font);
+}
+
+EAPI int
+evas_imaging_font_max_ascent_get(const Evas_Imaging_Font *fn)
+{
+   if (!fn) return 0;
+   return evas_common_font_max_ascent_get(fn->font);
+}
+
+EAPI int
+evas_imaging_font_max_descent_get(const Evas_Imaging_Font *fn)
+{
+   if (!fn) return 0;
+   return evas_common_font_max_descent_get(fn->font);
+}
+
+EAPI int
+evas_imaging_font_line_advance_get(const Evas_Imaging_Font *fn)
+{
+   if (!fn) return 0;
+   return evas_common_font_get_line_advance(fn->font);
+}
+
+EAPI void
+evas_imaging_font_string_advance_get(const Evas_Imaging_Font *fn, const char *str, int *x, int *y)
+{
+   if (!fn) return;
+   evas_common_font_query_advance(fn->font, str, x, y);
+}
+
+EAPI void
+evas_imaging_font_string_size_query(const Evas_Imaging_Font *fn, const char *str, int *w, int *h)
+{
+   if (!fn) return;
+   evas_common_font_query_size(fn->font, str, w, h);
+}
+
+EAPI int
+evas_imaging_font_string_inset_get(const Evas_Imaging_Font *fn, const char *str)
+{
+   if (!fn) return 0;
+   return evas_common_font_query_inset(fn->font, str);
+}
+
+EAPI int
+evas_imaging_font_string_char_coords_get(const Evas_Imaging_Font *fn, const char *str, int pos, int *cx, int *cy, int *cw, int *ch)
+{
+   if (!fn) return 0;
+   return evas_common_font_query_char_coords(fn->font, str, pos, cx, cy, cw, ch);
+}
+
+EAPI int
+evas_imaging_font_string_char_at_coords_get(const Evas_Imaging_Font *fn, const char *str, int x, int y, int *cx, int *cy, int *cw, int *ch)
+{
+   if (!fn) return -1;
+   return evas_common_font_query_text_at_pos(fn->font, str, x, y, cx, cy, cw, ch);
+}
+
+EAPI void
+evas_imaging_font_cache_set(int bytes)
+{
+   evas_common_font_cache_set(bytes);
+}
+
+EAPI int
+evas_imaging_font_cache_get(void)
+{
+   return evas_common_font_cache_get();
+}
+
+/**
+ * @}
+ */
diff --git a/src/lib/include/.cvsignore b/src/lib/include/.cvsignore
new file mode 100644 (file)
index 0000000..3dda729
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile.in
+Makefile
diff --git a/src/lib/include/Makefile.am b/src/lib/include/Makefile.am
new file mode 100644 (file)
index 0000000..1570bf4
--- /dev/null
@@ -0,0 +1,12 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+EXTRA_DIST = \
+evas_inline.x \
+evas_private.h \
+evas_options.h \
+evas_macros.h \
+evas_mmx.h \
+evas_common.h \
+evas_common_soft16.h \
+evas_blend_ops.h
diff --git a/src/lib/include/evas_blend_ops.h b/src/lib/include/evas_blend_ops.h
new file mode 100644 (file)
index 0000000..9627f87
--- /dev/null
@@ -0,0 +1,179 @@
+#ifndef EVAS_BLEND_OPS_H
+#define EVAS_BLEND_OPS_H
+
+#if defined BUILD_MMX || defined BUILD_SSE
+#include "evas_mmx.h"
+#endif
+
+/* src pixel flags: */
+
+/* pixels none */
+#define SP_N 0
+/* pixels (argb default) */
+#define SP 1
+/* pixels are rgb (ie. alphas == 255) */
+#define SP_AN 2
+/* pixels alpha are sparse */
+#define SP_AS 3
+/* src pixels flags count */
+#define SP_LAST 4
+
+/* src mask flags: */
+
+/* mask none */
+#define SM_N 0
+/* mask (alpha) */
+#define SM 1
+/* mask alphas are 'trivial - ie. only 0 or 255 */
+#define SM_AT 2
+/* mask alphas are sparse */
+#define SM_AS 3
+/* src mask flags count */
+#define SM_LAST 4
+
+/* src color flags: */
+
+/* color is 0xffffffff */
+#define SC_N 0
+/* color (argb default) */
+#define SC 1
+/* color is rgb (ie. 0xffrrggbb) */
+#define SC_AN 2
+/* color is 'alpha' (ie. 0xaaaaaaaa) */
+#define SC_AA 3
+/* src color flags count */
+#define SC_LAST 4
+
+/* dst pixels flags: */
+
+/* pixels (argb default) */
+#define DP  0
+/* pixels are rgb (ie. alphas == 255) */
+#define DP_AN  1
+/* dst pixels flags count */
+#define DP_LAST 2
+
+/* cpu types flags */
+
+/* none, bad news */
+#define CPU_N  0
+/* cpu C */
+#define CPU_C  1
+/* cpu MMX */
+#define CPU_MMX 2
+/* cpu SSE */
+#define CPU_SSE 3
+/* cpu SSE2 */
+#define CPU_SSE2 4
+/* cpu flags count */
+#define CPU_NEON 5
+/* cpu flags count */
+#define CPU_LAST 6
+
+
+/* some useful constants */
+
+extern const DATA32 ALPHA_255;
+extern const DATA32 ALPHA_256;
+
+/* some useful C macros */
+
+#define MUL4_256(a, r, g, b, c) \
+ ( (((((c) >> 8) & 0xff0000) * (a)) & 0xff000000) + \
+   (((((c) & 0xff0000) * (r)) >> 8) & 0xff0000) + \
+   (((((c) & 0xff00) * (g)) >> 8) & 0xff00) + \
+   ((((c) & 0xff) * (b)) >> 8) )
+
+#define MUL3_256(r, g, b, c) \
+ ( (((((c) & 0xff0000) * (r)) >> 8) & 0xff0000) + \
+   (((((c) & 0xff00) * (g)) >> 8) & 0xff00) + \
+   ((((c) & 0xff) * (b)) >> 8) )
+
+#define MUL_256(a, c) \
+ ( (((((c) >> 8) & 0x00ff00ff) * (a)) & 0xff00ff00) + \
+   (((((c) & 0x00ff00ff) * (a)) >> 8) & 0x00ff00ff) )
+
+#define MUL4_SYM(x, y) \
+ ( ((((((x) >> 16) & 0xff00) * (((y) >> 16) & 0xff00)) + 0xff0000) & 0xff000000) + \
+   ((((((x) >> 8) & 0xff00) * (((y) >> 16) & 0xff)) + 0xff00) & 0xff0000) + \
+   ((((((x) & 0xff00) * ((y) & 0xff00)) + 0xff00) >> 16) & 0xff00) + \
+   (((((x) & 0xff) * ((y) & 0xff)) + 0xff) >> 8) )
+
+#define MUL3_SYM(x, y) \
+ ( ((((((x) >> 8) & 0xff00) * (((y) >> 16) & 0xff)) + 0xff00) & 0xff0000) + \
+   ((((((x) & 0xff00) * ((y) & 0xff00)) + 0xff00) >> 16) & 0xff00) + \
+   (((((x) & 0xff) * ((y) & 0xff)) + 0xff) >> 8) )
+
+#define MUL_SYM(a, x) \
+ ( (((((x) >> 8) & 0x00ff00ff) * (a) + 0xff00ff) & 0xff00ff00) + \
+   (((((x) & 0x00ff00ff) * (a) + 0xff00ff) >> 8) & 0x00ff00ff) )
+
+#define MUL_A_256(a, c) \
+ ( ((((c) >> 8) & 0x00ff0000) * (a)) & 0xff000000 )
+
+#define MUL_A_SYM(a, c) \
+ ( (((((c) >> 8) & 0x00ff0000) * (a)) + 0x00ff0000) & 0xff000000 )
+
+#define INTERP_256(a, c0, c1) \
+ ( (((((((c0) >> 8) & 0xff00ff) - (((c1) >> 8) & 0xff00ff)) * (a)) \
+   + ((c1) & 0xff00ff00)) & 0xff00ff00) + \
+   (((((((c0) & 0xff00ff) - ((c1) & 0xff00ff)) * (a)) >> 8) \
+   + ((c1) & 0xff00ff)) & 0xff00ff) )
+
+#define INTERP_RGB_256(a, c0, c1) \
+ ( (((((((c0) >> 8) & 0xff) - (((c1) >> 8) & 0xff)) * (a)) \
+   + ((c1) & 0xff00)) & 0xff00) + \
+   (((((((c0) & 0xff00ff) - ((c1) & 0xff00ff)) * (a)) >> 8) \
+   + ((c1) & 0xff00ff)) & 0xff00ff) )
+
+#define INTERP_A_256(a, c0, c1) \
+ ( (((((((c0) >> 8) & 0xff0000) - (((c1) >> 8) & 0xff0000)) * (a)) \
+   + ((c1) & 0xff000000)) & 0xff000000) )
+
+
+/* some useful MMX macros */
+
+#ifdef BUILD_MMX
+#define MOV_A2R(a, mma) \
+       movd_m2r(a, mma); \
+       punpcklwd_r2r(mma, mma); \
+       punpckldq_r2r(mma, mma);
+
+#define MOV_P2R(c, mmc, mmz) \
+       movd_m2r(c, mmc); \
+       punpcklbw_r2r(mmz, mmc);
+
+#define MOV_R2P(mmc, c, mmz) \
+       packuswb_r2r(mmz, mmc); \
+       movd_r2m(mmc, c);
+
+#define MUL4_256_R2R(mmx, mmy) \
+       pmullw_r2r(mmx, mmy); \
+       psrlw_i2r(8, mmy);
+
+#define MUL4_SYM_R2R(mmx, mmy, mm255) \
+       pmullw_r2r(mmx, mmy); \
+       paddw_r2r(mm255, mmy); \
+       psrlw_i2r(8, mmy);
+
+#define MOV_RA2R(mmx, mma) \
+       movq_r2r(mmx, mma); \
+       punpckhwd_r2r(mma, mma); \
+       punpckhdq_r2r(mma, mma);
+
+#define MOV_PA2R(c, mma) \
+       movd_m2r(c, mma); \
+       punpcklbw_r2r(mma, mma); \
+       punpckhwd_r2r(mma, mma); \
+       punpckhdq_r2r(mma, mma);
+
+#define INTERP_256_R2R(mma, mmx, mmy, mm255) \
+       psubw_r2r(mmy, mmx); \
+       pmullw_r2r(mma, mmx); \
+       psrlw_i2r(8, mmx); \
+       paddw_r2r(mmx, mmy); \
+       pand_r2r(mm255, mmy);
+
+#endif
+
+#endif
diff --git a/src/lib/include/evas_cairo_common.h b/src/lib/include/evas_cairo_common.h
new file mode 100644 (file)
index 0000000..aad5161
--- /dev/null
@@ -0,0 +1,169 @@
+#ifndef EVAS_CAIRO_COMMON_H
+#define EVAS_CAIRO_COMMON_H
+
+#include "evas_common.h"
+#include "config.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>
+
+#include <cairo.h>
+#include <cairo-xlib.h>
+
+typedef struct _Evas_Cairo_Context                   Evas_Cairo_Context;
+typedef struct _Evas_Cairo_Image                     Evas_Cairo_Image;
+typedef struct _Evas_Cairo_Polygon                   Evas_Cairo_Polygon;
+typedef struct _Evas_Cairo_Polygon_Point             Evas_Cairo_Polygon_Point;
+typedef struct _Evas_Cairo_Gradient                  Evas_Cairo_Gradient;
+
+struct _Evas_Cairo_Context
+{
+   cairo_t         *cairo;
+
+   struct {
+      double r, g, b, a;
+   } col;
+   struct {
+      unsigned int set : 1;
+      double r, g, b, a;
+   } mul;
+};
+
+struct _Evas_Cairo_Image
+{
+   RGBA_Image         *im;
+   int                 references;
+   DATA32             *mulpix;
+   cairo_surface_t    *surface;
+   cairo_pattern_t    *pattern;
+#if 0
+   Evas_Cairo_Context *cc;
+   char                dirty : 1;
+   char                cached : 1;
+#endif
+};
+
+struct _Evas_Cairo_Polygon
+{
+   Eina_List *points;
+};
+
+struct _Evas_Cairo_Polygon_Point
+{
+   int x, y;
+};
+
+#if 0
+struct _Evas_Cairo_Context
+{
+   unsigned char   r, g, b, a;
+
+   struct {
+      char         size : 1;
+      char         dither : 1;
+      char         blend : 1;
+      char         color : 1;
+      char         texture : 1;
+      char         clip : 1;
+      char         buf : 1;
+      char         other : 1;
+   } change;
+
+   struct {
+      char         active : 1;
+      int          x, y, w, h;
+   } clip;
+
+   struct {
+      int checked : 1;
+      int sgis_generate_mipmap : 1;
+      int nv_texture_rectangle : 1;
+   } ext;
+
+   int             references;
+
+   Eina_List      *images;
+};
+
+struct _Evas_Cairo_Image
+{
+   Evas_Cairo_Context *cc;
+   RGBA_Image         *im;
+   cairo_surface_t    *surf;
+   DATA32             *mulpix;
+   int                 references;
+   char                dirty : 1;
+   char                cached : 1;
+};
+
+struct _Evas_Cairo_Polygon
+{
+   Eina_List *points;
+};
+
+struct _Evas_Cairo_Polygon_Point
+{
+   int x, y;
+};
+
+struct _Evas_Cairo_Gradient
+{
+   RGBA_Gradient   *grad;
+};
+#endif
+
+/*
+Evas_GL_Context  *evas_gl_common_context_new(void);
+void              evas_gl_common_context_free(Evas_GL_Context *gc);
+void              evas_gl_common_context_use(Evas_GL_Context *gc);
+void              evas_gl_common_context_resize(Evas_GL_Context *gc, int w, int h);
+void              evas_gl_common_context_color_set(Evas_GL_Context *gc, int r, int g, int b, int a);
+void              evas_gl_common_context_blend_set(Evas_GL_Context *gc, int blend);
+void              evas_gl_common_context_dither_set(Evas_GL_Context *gc, int dither);
+void              evas_gl_common_context_texture_set(Evas_GL_Context *gc, Evas_GL_Texture *tex, int smooth, int w, int h);
+void              evas_gl_common_context_font_texture_set(Evas_GL_Context *gc, Evas_GL_Font_Texture *ft);
+void              evas_gl_common_context_clip_set(Evas_GL_Context *gc, int on, int x, int y, int w, int h);
+void              evas_gl_common_context_read_buf_set(Evas_GL_Context *gc, GLenum buf);
+void              evas_gl_common_context_write_buf_set(Evas_GL_Context *gc, GLenum buf);
+
+Evas_GL_Texture  *evas_gl_common_texture_new(Evas_GL_Context *gc, RGBA_Image *im, int smooth);
+void              evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im, int smooth);
+void              evas_gl_common_texture_free(Evas_GL_Texture *tex);
+void              evas_gl_common_texture_mipmaps_build(Evas_GL_Texture *tex, RGBA_Image *im, int smooth);
+
+Evas_GL_Image    *evas_gl_common_image_load(Evas_GL_Context *gc, char *file, char *key);
+Evas_GL_Image    *evas_gl_common_image_new_from_data(Evas_GL_Context *gc, int w, int h, int *data);
+Evas_GL_Image    *evas_gl_common_image_new_from_copied_data(Evas_GL_Context *gc, int w, int h, int *data);
+Evas_GL_Image    *evas_gl_common_image_new(Evas_GL_Context *gc, int w, int h);
+void              evas_gl_common_image_free(Evas_GL_Image *im);
+void              evas_gl_common_image_dirty(Evas_GL_Image *im);
+
+Evas_GL_Polygon  *evas_gl_common_poly_point_add(Evas_GL_Polygon *poly, int x, int y);
+Evas_GL_Polygon  *evas_gl_common_poly_points_clear(Evas_GL_Polygon *poly);
+
+Evas_GL_Gradient *evas_gl_common_gradient_color_add(Evas_GL_Gradient *gr, int r, int g, int b, int a, int distance);
+Evas_GL_Gradient *evas_gl_common_gradient_colors_clear(Evas_GL_Gradient *gr);
+
+void              evas_gl_common_swap_rect(Evas_GL_Context *gc, int x, int y, int w, int h);
+
+void              evas_gl_common_rect_draw(Evas_GL_Context *gc, RGBA_Draw_Context *dc, int x, int y, int w, int h);
+void              evas_gl_common_image_draw(Evas_GL_Context *gc, RGBA_Draw_Context *dc, Evas_GL_Image *im, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int smooth);
+void              evas_gl_common_line_draw(Evas_GL_Context *gc, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2);
+void              evas_gl_common_poly_draw(Evas_GL_Context *gc, RGBA_Draw_Context *dc, Evas_GL_Polygon *poly);
+void              evas_gl_common_gradient_draw(Evas_GL_Context *gc, RGBA_Draw_Context *dc, Evas_GL_Gradient *gr, int x, int y, int w, int h, double angle);
+
+Evas_GL_Font_Texture *evas_gl_font_texture_new(Evas_GL_Context *gc, RGBA_Font_Glyph *fg);
+void                  evas_gl_font_texture_free(Evas_GL_Font_Texture *ft);
+void                  evas_gl_font_texture_draw(Evas_GL_Context *gc, void *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y);
+*/
+
+#endif
diff --git a/src/lib/include/evas_common.h b/src/lib/include/evas_common.h
new file mode 100644 (file)
index 0000000..dff7224
--- /dev/null
@@ -0,0 +1,1277 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef EVAS_COMMON_H
+#define EVAS_COMMON_H
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"  /* so that EAPI in Evas.h is correctly defined */
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#include <Eina.h>
+#include "Evas.h"
+
+/* macros needed to log message through eina_log */
+extern EAPI int _evas_log_dom_global;
+#ifdef  _EVAS_DEFAULT_LOG_DOM
+# undef _EVAS_DEFAULT_LOG_DOM
+#endif
+#define _EVAS_DEFAULT_LOG_DOM _evas_log_dom_global
+
+#ifdef EVAS_DEFAULT_LOG_COLOR
+# undef EVAS_DEFAULT_LOG_COLOR
+#endif
+#define EVAS_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_EVAS_DEFAULT_LOG_DOM, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_EVAS_DEFAULT_LOG_DOM, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_EVAS_DEFAULT_LOG_DOM, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_EVAS_DEFAULT_LOG_DOM, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_EVAS_DEFAULT_LOG_DOM, __VA_ARGS__)
+
+/*****************************************************************************/
+
+#include "evas_options.h"
+
+#if defined(__ARM_ARCH_3M__)
+# define __ARM_ARCH__ 40
+#endif
+#if defined(__ARM_ARCH_4__)
+# define __ARM_ARCH__ 40
+#endif
+#if defined(__ARM_ARCH_4T__)
+# define __ARM_ARCH__ 41
+#endif
+
+#if defined(__ARM_ARCH_5__)
+# define __ARM_ARCH__ 50
+#endif
+#if defined(__ARM_ARCH_5T__)
+# define __ARM_ARCH__ 51
+#endif
+#if defined(__ARM_ARCH_5E__)
+# define __ARM_ARCH__ 52
+#endif
+#if defined(__ARM_ARCH_5TE__)
+# define __ARM_ARCH__ 53
+#endif
+#if defined(__ARM_ARCH_5TEJ__)
+# define __ARM_ARCH__ 54
+#endif
+
+#if defined(__ARM_ARCH_6__)
+# define __ARM_ARCH__ 60
+#endif
+#if defined(__ARM_ARCH_6J__)
+# define __ARM_ARCH__ 61
+#endif
+#if defined(__ARM_ARCH_6K__)
+# define __ARM_ARCH__ 62
+#endif
+#if defined(__ARM_ARCH_6Z__)
+# define __ARM_ARCH__ 63
+#endif
+#if defined(__ARM_ARCH_6ZK__)
+# define __ARM_ARCH__ 64
+#endif
+#if defined(__ARM_ARCH_6T2__)
+# define __ARM_ARCH__ 65
+#endif
+
+#if defined(__ARM_ARCH_7__)
+# define __ARM_ARCH__ 70
+#endif
+#if defined(__ARM_ARCH_7A__)
+# define __ARM_ARCH__ 71
+#endif
+#if defined(__ARM_ARCH_7R__)
+# define __ARM_ARCH__ 72
+#endif
+#if defined(__ARM_ARCH_7M__)
+# define __ARM_ARCH__ 73
+#endif
+
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+#endif
+
+#ifndef BUILD_PTHREAD
+# undef BUILD_PIPE_RENDER
+#endif
+
+#if defined(BUILD_ASYNC_PRELOAD) && !defined(BUILD_PTHREAD)
+# define BUILD_PTHREAD
+#endif
+
+#ifdef BUILD_PTHREAD
+
+#ifndef __USE_GNU
+#define __USE_GNU
+#endif
+
+# include <pthread.h>
+# include <sched.h>
+# define LK(x)  pthread_mutex_t x
+# define LKI(x) pthread_mutex_init(&(x), NULL);
+# define LKD(x) pthread_mutex_destroy(&(x));
+# define LKL(x) pthread_mutex_lock(&(x));
+# define LKT(x) pthread_mutex_trylock(&(x));
+# define LKU(x) pthread_mutex_unlock(&(x));
+# define TH(x)  pthread_t x
+# define THI(x) int x
+# define TH_MAX 8
+
+// even though in theory having every Nth rendered line done by a different
+// thread might even out load across threads - it actually slows things down.
+//#define EVAS_SLI 1
+
+#else
+# define LK(x)
+# define LKI(x)
+# define LKD(x)
+# define LKL(x)
+# define LKT(x) 0
+# define LKU(x)
+# define TH(x)
+# define THI(x)
+# define TH_MAX 0
+#endif
+
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#elif defined __GNUC__
+# define alloca __builtin_alloca
+#elif defined _AIX
+# define alloca __alloca
+#elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+#else
+# include <stddef.h>
+# ifdef  __cplusplus
+extern "C"
+# endif
+void *alloca (size_t);
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <ctype.h>
+#ifndef _MSC_VER
+# include <stdint.h>
+# include <unistd.h>
+#endif
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_GLYPH_H
+#include FT_SIZES_H
+#include FT_MODULE_H
+
+#ifdef __GNUC__
+# if __GNUC__ >= 4
+// BROKEN in gcc 4 on amd64
+//#  pragma GCC visibility push(hidden)
+# endif
+#define LIKELY(x)   __builtin_expect(!!(x), 1)
+#define UNLIKELY(x) __builtin_expect(!!(x), 0)
+#else
+#define LIKELY(x)   (x)
+#define UNLIKELY(x) (x)
+#endif
+
+/*****************************************************************************/
+
+/* use exact rects for updates not tiles */
+/* #define RECTUPDATE */
+#define TILESIZE 8
+#define IMG_MAX_SIZE 65000
+
+#define IMG_TOO_BIG(w, h) \
+   ((((unsigned long long)w) * ((unsigned long long)h)) >= \
+       ((1ULL << (29 * (sizeof(void *) / 4))) - 2048))
+
+#ifdef BUILD_SMALL_DITHER_MASK
+# define DM_TABLE     _evas_dither_44
+# define DM_SIZE      4
+# define DM_BITS      4
+# define DM_DIV       16
+# define USE_DITHER_44 1
+# define DM_MSK       (DM_SIZE - 1)
+# define DM_SHF(_b)   (DM_BITS - (8 - _b))
+#else
+# define DM_TABLE     _evas_dither_128128
+# define DM_SIZE      128
+# define DM_BITS      6
+# define DM_DIV       64
+# define USE_DITHER_128128 1
+# define DM_MSK       (DM_SIZE - 1)
+# define DM_SHF(_b)   (DM_BITS - (8 - _b))
+#endif
+
+/* if more than 1/ALPHA_SPARSE_INV_FRACTION is "alpha" (1-254) then sparse
+ * alpha flag gets set */
+#define ALPHA_SPARSE_INV_FRACTION 3
+
+/*****************************************************************************/
+
+#if defined(__ARM_ARCH_3M__)
+# define __ARM_ARCH__ 40
+#endif
+#if defined(__ARM_ARCH_4__)
+# define __ARM_ARCH__ 40
+#endif
+#if defined(__ARM_ARCH_4T__)
+# define __ARM_ARCH__ 41
+#endif
+
+#if defined(__ARM_ARCH_5__)
+# define __ARM_ARCH__ 50
+#endif
+#if defined(__ARM_ARCH_5T__)
+# define __ARM_ARCH__ 51
+#endif
+#if defined(__ARM_ARCH_5E__)
+# define __ARM_ARCH__ 52
+#endif
+#if defined(__ARM_ARCH_5TE__)
+# define __ARM_ARCH__ 53
+#endif
+#if defined(__ARM_ARCH_5TEJ__)
+# define __ARM_ARCH__ 54
+#endif
+
+#if defined(__ARM_ARCH_6__)
+# define __ARM_ARCH__ 60
+#endif
+#if defined(__ARM_ARCH_6J__)
+# define __ARM_ARCH__ 61
+#endif
+#if defined(__ARM_ARCH_6K__)
+# define __ARM_ARCH__ 62
+#endif
+#if defined(__ARM_ARCH_6Z__)
+# define __ARM_ARCH__ 63
+#endif
+#if defined(__ARM_ARCH_6ZK__)
+# define __ARM_ARCH__ 64
+#endif
+#if defined(__ARM_ARCH_6T2__)
+# define __ARM_ARCH__ 65
+#endif
+
+#if defined(__ARM_ARCH_7__)
+# define __ARM_ARCH__ 70
+#endif
+#if defined(__ARM_ARCH_7A__)
+# define __ARM_ARCH__ 71
+#endif
+#if defined(__ARM_ARCH_7R__)
+# define __ARM_ARCH__ 72
+#endif
+#if defined(__ARM_ARCH_7M__)
+# define __ARM_ARCH__ 73
+#endif
+
+#if defined(__ARM_ARCH__) && (__ARM_ARCH__ >= 52)
+/* tested on ARMv6 (arm1136j-s), Nokia N800 CPU */
+#define pld(addr, off)                                                  \
+   __asm__("pld [%[address], %[offset]]"::                              \
+           [address] "r" (addr), [offset] "i" (off))
+#else
+#define pld(addr, off)
+#endif /* __ARMEL__ */
+
+/*****************************************************************************/
+
+#define UNROLL2(op...) op op
+#define UNROLL4(op...) UNROLL2(op) UNROLL2(op)
+#define UNROLL8(op...) UNROLL4(op) UNROLL4(op)
+#define UNROLL16(op...) UNROLL8(op) UNROLL8(op)
+
+#define UNROLL8_PLD_WHILE(start, size, end, op)         \
+    pld(start, 0);                                      \
+    end = start + (size & ~7);                          \
+    while (start < end)                                 \
+        {                                               \
+            pld(start, 32);                             \
+            UNROLL8(op);                                \
+        }                                               \
+    end += (size & 7);                                  \
+    pld(start, 32);                                     \
+    while (start <  end)                                \
+        {                                               \
+        op;                                             \
+        }
+
+/*****************************************************************************/
+
+typedef unsigned long long             DATA64;
+typedef unsigned int                   DATA32;
+typedef unsigned short                 DATA16;
+typedef unsigned char                   DATA8;
+
+typedef struct _Image_Entry             Image_Entry;
+typedef struct _Image_Entry_Flags      Image_Entry_Flags;
+typedef struct _Engine_Image_Entry      Engine_Image_Entry;
+typedef struct _Evas_Cache_Target       Evas_Cache_Target;
+typedef struct _Evas_Preload_Pthread    Evas_Preload_Pthread;
+
+typedef struct _RGBA_Image_Loadopts   RGBA_Image_Loadopts;
+#ifdef BUILD_PIPE_RENDER
+typedef struct _RGBA_Pipe_Op          RGBA_Pipe_Op;
+typedef struct _RGBA_Pipe             RGBA_Pipe;
+typedef struct _RGBA_Pipe_Thread_Info RGBA_Pipe_Thread_Info;
+#endif
+typedef struct _RGBA_Image            RGBA_Image;
+typedef struct _RGBA_Image_Span       RGBA_Image_Span;
+typedef struct _RGBA_Draw_Context     RGBA_Draw_Context;
+typedef struct _RGBA_Gradient         RGBA_Gradient;
+typedef struct _RGBA_Gradient_Color_Stop   RGBA_Gradient_Color_Stop;
+typedef struct _RGBA_Gradient_Alpha_Stop   RGBA_Gradient_Alpha_Stop;
+typedef struct _RGBA_Gradient_Type    RGBA_Gradient_Type;
+typedef struct _RGBA_Gradient2         RGBA_Gradient2;
+typedef struct _RGBA_Gradient2_Type    RGBA_Gradient2_Type;
+typedef struct _RGBA_Gradient2_Color_Np_Stop   RGBA_Gradient2_Color_Np_Stop;
+typedef struct _RGBA_Polygon_Point    RGBA_Polygon_Point;
+typedef struct _RGBA_Map_Point        RGBA_Map_Point;
+typedef struct _RGBA_Font             RGBA_Font;
+typedef struct _RGBA_Font_Int         RGBA_Font_Int;
+typedef struct _RGBA_Font_Source      RGBA_Font_Source;
+typedef struct _RGBA_Font_Glyph       RGBA_Font_Glyph;
+typedef struct _RGBA_Gfx_Compositor   RGBA_Gfx_Compositor;
+
+typedef struct _Cutout_Rect           Cutout_Rect;
+typedef struct _Cutout_Rects            Cutout_Rects;
+
+typedef struct _Convert_Pal             Convert_Pal;
+
+typedef struct _Tilebuf                 Tilebuf;
+typedef struct _Tilebuf_Tile            Tilebuf_Tile;
+typedef struct _Tilebuf_Rect           Tilebuf_Rect;
+
+typedef struct _Evas_Common_Transform        Evas_Common_Transform;
+
+// RGBA_Map_Point
+// all coords are 20.12
+// fp type - an int for now
+typedef int FPc;
+// fp # of bits of float accuracy
+#define FP 8
+// fp half (half of an fp unit)
+#define FPH (1 << (FP - 1))
+// one fp unit
+#define FP1 (1 << (FP))
+
+/*
+typedef struct _Regionbuf             Regionbuf;
+typedef struct _Regionspan            Regionspan;
+*/
+
+typedef void (*RGBA_Gfx_Func)    (DATA32 *src, DATA8 *mask, DATA32 col, DATA32 *dst, int len);
+typedef void (*RGBA_Gfx_Pt_Func) (DATA32 src, DATA8 mask, DATA32 col, DATA32 *dst);
+typedef void (*Gfx_Func_Copy)    (DATA32 *src, DATA32 *dst, int len);
+
+typedef void (*Gfx_Func_Convert) (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
+
+typedef void (*Gfx_Func_Gradient_Fill)(DATA32 *src, int src_len,
+                                         DATA32 *dst, DATA8 *mask, int len,
+                                         int x, int y, int axx, int axy, int ayx, int ayy,
+                                         void *geom_data);
+
+typedef void (*Gfx_Func_Gradient2_Fill)(DATA32 *src, int src_len,
+                                         DATA32 *dst, DATA8 *mask, int len,
+                                         int x, int y,
+                                         void *geom_data);
+
+#include "../cache/evas_cache.h"
+
+/*****************************************************************************/
+
+typedef enum _RGBA_Image_Flags
+{
+   RGBA_IMAGE_NOTHING       = (0),
+/*    RGBA_IMAGE_HAS_ALPHA     = (1 << 0), */
+   RGBA_IMAGE_IS_DIRTY      = (1 << 1),
+   RGBA_IMAGE_INDEXED       = (1 << 2),
+   RGBA_IMAGE_ALPHA_ONLY    = (1 << 3),
+   RGBA_IMAGE_ALPHA_TILES   = (1 << 4),
+/*    RGBA_IMAGE_ALPHA_SPARSE  = (1 << 5), */
+/*    RGBA_IMAGE_LOADED        = (1 << 6), */
+/*    RGBA_IMAGE_NEED_DATA     = (1 << 7) */
+   RGBA_IMAGE_TODO_LOAD     = (1 << 8),
+} RGBA_Image_Flags;
+
+typedef enum _Convert_Pal_Mode
+{
+   PAL_MODE_NONE,
+   PAL_MODE_MONO,
+   PAL_MODE_GRAY4,
+   PAL_MODE_GRAY16,
+   PAL_MODE_GRAY64,
+   PAL_MODE_GRAY256,
+   PAL_MODE_RGB111,
+   PAL_MODE_RGB121,
+   PAL_MODE_RGB221,
+   PAL_MODE_RGB222,
+   PAL_MODE_RGB232,
+   PAL_MODE_RGB332,
+   PAL_MODE_RGB666,
+   PAL_MODE_LAST
+} Convert_Pal_Mode;
+
+typedef enum _CPU_Features
+{
+   CPU_FEATURE_C       = 0,
+   CPU_FEATURE_MMX     = (1 << 0),
+   CPU_FEATURE_MMX2    = (1 << 1),
+   CPU_FEATURE_SSE     = (1 << 2),
+   CPU_FEATURE_ALTIVEC = (1 << 3),
+   CPU_FEATURE_VIS     = (1 << 4),
+   CPU_FEATURE_VIS2    = (1 << 5),
+   CPU_FEATURE_NEON    = (1 << 6)
+} CPU_Features;
+
+typedef enum _Font_Hint_Flags
+{
+   FONT_NO_HINT,
+   FONT_AUTO_HINT,
+   FONT_BYTECODE_HINT
+} Font_Hint_Flags;
+
+/*****************************************************************************/
+
+struct _RGBA_Image_Loadopts
+{
+   int                  scale_down_by; // if > 1 then use this
+   double               dpi; // if > 0.0 use this
+   int                  w, h; // if > 0 use this
+   struct {
+      int               x, y, w, h;
+   } region;
+};
+
+struct _Image_Entry_Flags
+{
+   Eina_Bool loaded       : 1;
+   Eina_Bool dirty        : 1;
+   Eina_Bool activ        : 1;
+   Eina_Bool need_data    : 1;
+   Eina_Bool lru_nodata   : 1;
+   Eina_Bool cached       : 1;
+   Eina_Bool alpha        : 1;
+   Eina_Bool alpha_sparse : 1;
+#ifdef BUILD_ASYNC_PRELOAD
+   Eina_Bool preload_done : 1;
+   Eina_Bool delete_me    : 1;
+   Eina_Bool pending      : 1;
+#endif
+};
+
+struct _Evas_Cache_Target
+{
+  EINA_INLIST;
+  const void *target;
+  void *data;
+};
+
+struct _Image_Entry
+{
+   EINA_INLIST;
+
+   Evas_Cache_Image      *cache;
+
+   const char            *cache_key;
+
+   const char            *file;
+   const char            *key;
+
+   Evas_Cache_Target     *targets;
+   Evas_Preload_Pthread   *preload;
+
+   time_t                 timestamp;
+   time_t                 laststat;
+
+   int                    references;
+
+   unsigned char          scale;
+
+   RGBA_Image_Loadopts    load_opts;
+   int                    space;
+   int                    w;
+   int                    h;
+
+   struct
+     {
+        int             w;
+        int             h;
+     } allocated;
+
+   struct
+     {
+        void           *module;
+        void           *loader;
+     } info;
+
+#ifdef BUILD_ASYNC_PRELOAD
+   LK(lock);
+#endif
+
+   Image_Entry_Flags      flags;
+   Evas_Image_Scale_Hint  scale_hint;
+   void                  *data1, *data2;
+   int                    server_id;
+   int                    connect_num;
+   int                    channel;
+};
+
+struct _Engine_Image_Entry
+{
+   EINA_INLIST;
+
+   /* Upper Engine data. */
+   Image_Entry                  *src;
+
+   /* Cache stuff. */
+   Evas_Cache_Engine_Image      *cache;
+   const char                   *cache_key;
+
+   struct
+   {
+     Eina_Bool                   cached : 1;
+     Eina_Bool                   activ : 1;
+     Eina_Bool                   dirty : 1;
+     Eina_Bool                   loaded : 1;
+     Eina_Bool                   need_parent : 1;
+   } flags;
+
+   int                           references;
+   int                           w;
+   int                           h;
+};
+
+struct _Cutout_Rect
+{
+   int               x, y, w, h;
+};
+
+struct _Cutout_Rects
+{
+   Cutout_Rect*      rects;
+   int               active;
+   int               max;
+};
+
+struct _Evas_Common_Transform
+{
+   float  mxx, mxy, mxz;
+   float  myx, myy, myz;
+   float  mzx, mzy, mzz;
+};
+
+struct _RGBA_Draw_Context
+{
+   struct {
+      Eina_Bool use : 1;
+      DATA32 col;
+   } mul;
+   struct {
+      DATA32 col;
+   } col;
+   struct RGBA_Draw_Context_clip {
+      int    x, y, w, h;
+      Eina_Bool use : 1;
+   } clip;
+   Cutout_Rects cutout;
+   struct {
+      struct {
+        void *(*gl_new)  (void *data, RGBA_Font_Glyph *fg);
+        void  (*gl_free) (void *ext_dat);
+        void  (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y);
+      } func;
+      void *data;
+   } font_ext;
+   struct {
+      int color_space;
+   } interpolation;
+   struct {
+      int y, h;
+   } sli;
+   int            render_op;
+   Eina_Bool anti_alias : 1;
+};
+
+#ifdef BUILD_PIPE_RENDER
+struct _RGBA_Pipe_Op
+{
+   RGBA_Draw_Context         context;
+   void                    (*op_func) (RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info);
+   void                    (*free_func) (RGBA_Pipe_Op *op);
+
+   union {
+      struct {
+        int                 x, y, w, h;
+      } rect;
+      struct {
+        int                 x0, y0, x1, y1;
+      } line;
+      struct {
+        RGBA_Polygon_Point *points;
+      } poly;
+      struct {
+        RGBA_Gradient      *grad;
+        int                 x, y, w, h;
+      } grad;
+      struct {
+        RGBA_Gradient2      *grad;
+        int                 x, y, w, h;
+      } grad2;
+      struct {
+        RGBA_Font          *font;
+        int                 x, y;
+        char               *text;
+      } text;
+      struct {
+        RGBA_Image         *src;
+        int                 sx, sy, sw, sh, dx, dy, dw, dh;
+        int                 smooth;
+        char               *text;
+      } image;
+      struct {
+        RGBA_Image         *src;
+        RGBA_Map_Point     *p;
+        int                 smooth;
+        int                 level;
+      } map4;
+   } op;
+};
+
+#define PIPE_LEN 256
+
+struct _RGBA_Pipe
+{
+   EINA_INLIST;
+   int               op_num;
+   RGBA_Pipe_Op      op[PIPE_LEN];
+};
+
+struct _RGBA_Pipe_Thread_Info
+{
+   RGBA_Image *im;
+   int         x, y, w, h;
+};
+#endif
+
+struct _RGBA_Image
+{
+   Image_Entry          cache_entry;
+
+   RGBA_Image_Flags     flags;
+   struct
+     {
+/*     void           *module; */
+/*     void           *loader; */
+/*     char           *real_file; */
+       char           *comment;
+//     int             format;
+     } info;
+
+   void                *extended_info;
+#ifdef BUILD_PIPE_RENDER
+   RGBA_Pipe           *pipe;
+#endif
+   int                  ref;
+
+/*    unsigned char        scale; */
+
+   /* Colorspace stuff. */
+   struct {
+      void              *data;
+      Eina_Bool          no_free : 1;
+      Eina_Bool          dirty : 1;
+   } cs;
+
+   /* RGBA stuff */
+   struct {
+      DATA32            *data;
+      Eina_Bool          no_free : 1;
+   } image;
+
+   struct {
+      LK(lock);
+      Eina_List *list;
+      unsigned long long orig_usage;
+      unsigned long long usage_count;
+      int populate_count;
+      unsigned long long newest_usage;
+      unsigned long long newest_usage_count;
+   } cache;
+};
+
+struct _RGBA_Gradient_Color_Stop
+{
+   EINA_INLIST;
+   int               r, g, b, a;
+   int               dist;
+};
+
+struct _RGBA_Gradient_Alpha_Stop
+{
+   EINA_INLIST;
+   int               a;
+   int               dist;
+};
+
+struct _RGBA_Gradient
+{
+   struct
+     {
+       DATA32        *data;
+       int            len;
+       float          angle;
+       int            direction;
+       float          offset;
+       Eina_Bool      has_alpha : 1;
+     } map;
+
+   struct {
+       Eina_Inlist *stops;
+       DATA32           *data;
+       int               nstops;
+       int               len;
+   }  color;
+   struct {
+       Eina_Inlist *stops;
+       DATA8            *data;
+       int               nstops;
+       int               len;
+   }  alpha;
+
+   struct
+     {
+       int            x, y, w, h;
+       int            spread;
+       float          angle;
+     } fill;
+   struct
+     {
+       char          *name;
+       char          *params;
+       RGBA_Gradient_Type *geometer;
+       void          *gdata;
+     } type;
+
+   int references;
+
+   Eina_Bool imported_data : 1;
+   Eina_Bool has_alpha : 1;
+};
+
+struct _RGBA_Gradient_Type
+{
+   const char              *name;
+   void                    (*init)(void);
+   void                    (*shutdown)(void);
+   void                    (*geom_init)(RGBA_Gradient *gr);
+   void                    (*geom_set)(RGBA_Gradient *gr);
+   void                    (*geom_free)(void *gdata);
+   int                     (*has_alpha)(RGBA_Gradient *gr, int render_op);
+   int                     (*has_mask)(RGBA_Gradient *gr, int render_op);
+   int                     (*get_map_len)(RGBA_Gradient *gr);
+   Gfx_Func_Gradient_Fill  (*get_fill_func)(RGBA_Gradient *gr, int render_op, unsigned char aa);
+};
+
+struct _RGBA_Gradient2_Color_Np_Stop
+{
+   EINA_INLIST;
+   int               r, g, b, a;
+   float             pos;
+   int               dist;
+};
+
+struct _RGBA_Gradient2
+{
+   struct
+     {
+       DATA32        *data;
+       int            len;
+       Eina_Bool      has_alpha : 1;
+     } map;
+
+   struct {
+       Eina_Inlist *stops;
+       int               nstops;
+       DATA32           *cdata;
+       DATA8            *adata;
+       int               len;
+   }  stops;
+
+   struct
+     {
+       Evas_Common_Transform  transform;
+       int                    spread;
+     } fill;
+   struct
+     {
+        int                 id;
+       RGBA_Gradient2_Type *geometer;
+       void                *gdata;
+     } type;
+
+   int references;
+
+   Eina_Bool has_alpha : 1;
+};
+
+struct _RGBA_Gradient2_Type
+{
+   const char              *name;
+   void                    (*init)(void);
+   void                    (*shutdown)(void);
+   void                    (*geom_init)(RGBA_Gradient2 *gr);
+   void                    (*geom_update)(RGBA_Gradient2 *gr);
+   void                    (*geom_free)(void *gdata);
+   int                     (*has_alpha)(RGBA_Gradient2 *gr, int render_op);
+   int                     (*has_mask)(RGBA_Gradient2 *gr, int render_op);
+   int                     (*get_map_len)(RGBA_Gradient2 *gr);
+   Gfx_Func_Gradient2_Fill  (*get_fill_func)(RGBA_Gradient2 *gr, int render_op);
+};
+
+
+struct _RGBA_Polygon_Point
+{
+   EINA_INLIST;
+   int               x, y;
+};
+
+struct _RGBA_Map_Point
+{
+   FPc x, y; // x, y screenspace
+   FPc z; // z in world space. optional
+   FPc u, v; // u, v in tex coords
+   DATA32 col; // color at this point
+};
+
+// for fonts...
+/////
+typedef struct _Fash_Item_Index_Map Fash_Item_Index_Map;
+typedef struct _Fash_Int_Map Fash_Int_Map;
+typedef struct _Fash_Int Fash_Int;
+struct _Fash_Item_Index_Map
+{
+   RGBA_Font_Int *fint;
+   int            index;
+};
+struct _Fash_Int_Map
+{
+  Fash_Item_Index_Map item[256];
+};
+struct _Fash_Int
+{
+   Fash_Int_Map *bucket[256];
+   void (*freeme) (Fash_Int *fash);
+};
+
+/////
+typedef struct _Fash_Glyph_Map Fash_Glyph_Map;
+typedef struct _Fash_Glyph Fash_Glyph;
+struct _Fash_Glyph_Map
+{
+   RGBA_Font_Glyph *item[256];
+};
+struct _Fash_Glyph
+{
+   Fash_Glyph_Map *bucket[256];
+   void (*freeme) (Fash_Glyph *fash);
+};
+/////
+
+struct _RGBA_Font
+{
+   Eina_List *fonts;
+   Font_Hint_Flags hinting;
+   int references;
+   Fash_Int *fash;
+   unsigned char sizeok : 1;
+   LK(lock);
+};
+
+struct _RGBA_Font_Int
+{
+   RGBA_Font_Source *src;
+
+   unsigned int      size;
+   int               real_size;
+   int               max_h;
+
+   struct {
+      FT_Size       size;
+   } ft;
+
+//   Eina_Hash       *glyphs;
+
+   LK(ft_mutex);
+
+   Eina_Hash       *kerning;
+//   Eina_Hash       *indexes;
+
+   int              usage;
+   Font_Hint_Flags hinting;
+
+   int              references;
+
+   Fash_Glyph *fash;
+   unsigned char sizeok : 1;
+};
+
+struct _RGBA_Font_Source
+{
+   const char       *name;
+   const char       *file;
+
+   void             *data;
+   int               data_size;
+   int               current_size;
+   
+   struct {
+      int           orig_upem;
+      FT_Face       face;
+   } ft;
+
+   int              references;
+};
+
+struct _RGBA_Font_Glyph
+{
+   FT_UInt         index;
+   FT_Glyph        glyph;
+   FT_BitmapGlyph  glyph_out;
+   /* this is a problem - only 1 engine at a time can extend such a font... grrr */
+   void           *ext_dat;
+   void           (*ext_dat_free) (void *ext_dat);
+   RGBA_Font_Int   *fi;
+};
+
+struct _RGBA_Gfx_Compositor
+{
+   const char *name;
+
+   void              (*init)(void);
+   void              (*shutdown)(void);
+
+   RGBA_Gfx_Func  (*composite_pixel_span_get)(RGBA_Image *src, RGBA_Image *dst, int pixels);
+   RGBA_Gfx_Func  (*composite_color_span_get)(DATA32 col, RGBA_Image *dst, int pixels);
+   RGBA_Gfx_Func  (*composite_pixel_color_span_get)(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels);
+   RGBA_Gfx_Func  (*composite_mask_color_span_get)(DATA32 col, RGBA_Image *dst, int pixels);
+   RGBA_Gfx_Func  (*composite_pixel_mask_span_get)(RGBA_Image *src, RGBA_Image *dst, int pixels);
+
+   RGBA_Gfx_Pt_Func  (*composite_pixel_pt_get)(Image_Entry_Flags src_flags, RGBA_Image *dst);
+   RGBA_Gfx_Pt_Func  (*composite_color_pt_get)(DATA32 col, RGBA_Image *dst);
+   RGBA_Gfx_Pt_Func  (*composite_pixel_color_pt_get)(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst);
+   RGBA_Gfx_Pt_Func  (*composite_mask_color_pt_get)(DATA32 col, RGBA_Image *dst);
+   RGBA_Gfx_Pt_Func  (*composite_pixel_mask_pt_get)(Image_Entry_Flags src_flags, RGBA_Image *dst);
+};
+
+#define EVAS_RECT_SPLIT 1
+#ifdef EVAS_RECT_SPLIT
+typedef struct list_node list_node_t;
+typedef struct list list_t;
+typedef struct rect rect_t;
+typedef struct rect_node rect_node_t;
+
+struct list_node
+{
+    struct list_node *next;
+};
+
+struct list
+{
+    struct list_node *head;
+    struct list_node *tail;
+};
+
+struct rect
+{
+    short left;
+    short top;
+    short right;
+    short bottom;
+    short width;
+    short height;
+    int area;
+};
+
+struct rect_node
+{
+    struct list_node _lst;
+    struct rect rect;
+};
+
+void rect_list_node_pool_set_max(int max);
+void rect_list_node_pool_flush(void);
+list_node_t *rect_list_node_pool_get(void);
+void rect_list_node_pool_put(list_node_t *node);
+
+void rect_init(rect_t *r, int x, int y, int w, int h);
+void rect_list_append_node(list_t *rects, list_node_t *node);
+void rect_list_append(list_t *rects, const rect_t r);
+void rect_list_append_xywh(list_t *rects, int x, int y, int w, int h);
+void rect_list_concat(list_t *rects, list_t *other);
+list_node_t *rect_list_unlink_next(list_t *rects, list_node_t *parent_node);
+void rect_list_del_next(list_t *rects, list_node_t *parent_node);
+void rect_list_clear(list_t *rects);
+void rect_list_del_split_strict(list_t *rects, const rect_t del_r);
+void rect_list_add_split_strict(list_t *rects, list_node_t *node);
+list_node_t *rect_list_add_split_fuzzy(list_t *rects, list_node_t *node, int accepted_error);
+void rect_list_merge_rects(list_t *rects, list_t *to_merge, int accepted_error);void rect_list_add_split_fuzzy_and_merge(list_t *rects, list_node_t *node, int split_accepted_error, int merge_accepted_error);
+
+void rect_print(const rect_t r);
+void rect_list_print(const list_t rects);
+#endif /* EVAS_RECT_SPLIT */
+
+struct _Tilebuf
+{
+   int outbuf_w;
+   int outbuf_h;
+
+   struct {
+      int           w, h;
+   } tile_size;
+
+#ifdef RECTUPDATE
+   Regionbuf *rb;
+#elif defined(EVAS_RECT_SPLIT)
+   int need_merge;
+   list_t rects;
+#else
+   struct {
+      int           w, h;
+      Tilebuf_Tile *tiles;
+   } tiles;
+#endif
+};
+
+struct _Tilebuf_Tile
+{
+   Eina_Bool redraw : 1;
+/* FIXME: need these flags later - but not now */
+/*
+   Eina_Bool done   : 1;
+   Eina_Bool edge   : 1;
+   Eina_Bool from   : 1;
+
+   struct {
+      int dx, dy;
+   } vector;
+ */
+};
+
+struct _Tilebuf_Rect
+{
+   EINA_INLIST;
+   int               x, y, w, h;
+};
+/*
+struct _Regionbuf
+{
+   int w, h;
+   Regionspan **spans;
+};
+
+struct _Regionspan
+{
+  EINA_INLIST;
+   int x1, x2;
+};
+*/
+
+struct _Convert_Pal
+{
+   int               references;
+   int               count;
+   Convert_Pal_Mode  colors;
+   DATA8            *lookup;
+   void             *data;
+};
+
+/****/
+
+/*****************************************************************************/
+#include "evas_macros.h"
+
+#ifndef WORDS_BIGENDIAN
+/* x86 */
+#define A_VAL(p) ((DATA8 *)(p))[3]
+#define R_VAL(p) ((DATA8 *)(p))[2]
+#define G_VAL(p) ((DATA8 *)(p))[1]
+#define B_VAL(p) ((DATA8 *)(p))[0]
+#define AR_VAL(p) ((DATA16 *)(p)[1])
+#define GB_VAL(p) ((DATA16 *)(p)[0])
+#else
+/* ppc */
+#define A_VAL(p) ((DATA8 *)(p))[0]
+#define R_VAL(p) ((DATA8 *)(p))[1]
+#define G_VAL(p) ((DATA8 *)(p))[2]
+#define B_VAL(p) ((DATA8 *)(p))[3]
+#define AR_VAL(p) ((DATA16 *)(p)[0])
+#define GB_VAL(p) ((DATA16 *)(p)[1])
+#endif
+
+#define RGB_JOIN(r,g,b) \
+        (((r) << 16) + ((g) << 8) + (b))
+
+#define ARGB_JOIN(a,r,g,b) \
+        (((a) << 24) + ((r) << 16) + ((g) << 8) + (b))
+
+#include "evas_blend_ops.h"
+
+#define _EVAS_RENDER_FILL        -1
+#define _EVAS_RENDER_BLEND        0
+#define _EVAS_RENDER_BLEND_REL    1
+#define _EVAS_RENDER_COPY         2
+#define _EVAS_RENDER_COPY_REL     3
+#define _EVAS_RENDER_ADD          4
+#define _EVAS_RENDER_ADD_REL      5
+#define _EVAS_RENDER_SUB          6
+#define _EVAS_RENDER_SUB_REL      7
+#define _EVAS_RENDER_TINT         8
+#define _EVAS_RENDER_TINT_REL     9
+#define _EVAS_RENDER_MASK         10
+#define _EVAS_RENDER_MUL          11
+#define _EVAS_RENDER_CLIP         12
+
+#define _EVAS_TEXTURE_REFLECT           0
+#define _EVAS_TEXTURE_REPEAT            1
+#define _EVAS_TEXTURE_RESTRICT          2
+#define _EVAS_TEXTURE_RESTRICT_REFLECT  3
+#define _EVAS_TEXTURE_RESTRICT_REPEAT   4
+#define _EVAS_TEXTURE_PAD               5
+
+#define _EVAS_COLOR_SPACE_ARGB    0
+#define _EVAS_COLOR_SPACE_AHSV    1
+
+/*****************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/****/
+void evas_common_init                                   (void);
+void evas_common_shutdown                               (void);
+
+EAPI void evas_common_cpu_init                          (void);
+
+int  evas_common_cpu_have_cpuid                         (void);
+int  evas_common_cpu_has_feature                        (unsigned int feature);
+EAPI void evas_common_cpu_can_do                        (int *mmx, int *sse, int *sse2);
+EAPI void evas_common_cpu_end_opt                       (void);
+
+/****/
+#include "../engines/common/evas_blend.h"
+
+EAPI Gfx_Func_Copy        evas_common_draw_func_copy_get        (int pixels, int reverse);
+
+/****/
+#include "../engines/common/evas_convert_color.h"
+#include "../engines/common/evas_convert_colorspace.h"
+#include "../engines/common/evas_convert_main.h"
+#include "../engines/common/evas_convert_yuv.h"
+#include "../engines/common/evas_scale_main.h"
+#include "../engines/common/evas_scale_smooth.h"
+#include "../engines/common/evas_scale_span.h"
+
+/****/
+#include "../engines/common/evas_image.h"
+
+/****/
+#include "../engines/common/evas_line.h"
+#include "../engines/common/evas_polygon.h"
+#include "../engines/common/evas_rectangle.h"
+
+/****/
+EAPI void     evas_common_blit_init               (void);
+
+EAPI void     evas_common_blit_rectangle          (const RGBA_Image *src, RGBA_Image *dst, int src_x, int src_y, int w, int h, int dst_x, int dst_y);
+
+/****/
+#include "../engines/common/evas_gradient.h"
+#include "../engines/common/evas_font.h"
+
+/****/
+EAPI void          evas_common_tilebuf_init               (void);
+
+EAPI Tilebuf      *evas_common_tilebuf_new               (int w, int h);
+EAPI void          evas_common_tilebuf_free              (Tilebuf *tb);
+EAPI void          evas_common_tilebuf_set_tile_size     (Tilebuf *tb, int tw, int th);
+EAPI void          evas_common_tilebuf_get_tile_size     (Tilebuf *tb, int *tw, int *th);
+EAPI int           evas_common_tilebuf_add_redraw        (Tilebuf *tb, int x, int y, int w, int h);
+EAPI int           evas_common_tilebuf_del_redraw        (Tilebuf *tb, int x, int y, int w, int h);
+EAPI int           evas_common_tilebuf_add_motion_vector (Tilebuf *tb, int x, int y, int w, int h, int dx, int dy, int alpha);
+EAPI void          evas_common_tilebuf_clear             (Tilebuf *tb);
+EAPI Tilebuf_Rect *evas_common_tilebuf_get_render_rects  (Tilebuf *tb);
+EAPI void          evas_common_tilebuf_free_render_rects (Tilebuf_Rect *rects);
+
+/*
+Regionbuf    *evas_common_regionbuf_new       (int w, int h);
+void          evas_common_regionbuf_free      (Regionbuf *rb);
+void          evas_common_regionbuf_clear     (Regionbuf *rb);
+void          evas_common_regionbuf_span_add  (Regionbuf *rb, int x1, int x2, int y);
+void          evas_common_regionbuf_span_del  (Regionbuf *rb, int x1, int x2, int y);
+Tilebuf_Rect *evas_common_regionbuf_rects_get (Regionbuf *rb);
+*/
+
+/****/
+#include "../engines/common/evas_draw.h"
+
+#include "../engines/common/evas_map_image.h"
+
+/****/
+#ifdef BUILD_PIPE_RENDER
+# include "../engines/common/evas_pipe.h"
+#endif
+
+void              evas_font_dir_cache_free(void);
+
+/****/
+
+/*****************************************************************************/
+
+//#if defined(__ARM_ARCH__) && (__ARM_ARCH__ >= 70)
+#ifdef BUILD_NEON
+# include <arm_neon.h>
+#endif
+//#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/lib/include/evas_common_soft16.h b/src/lib/include/evas_common_soft16.h
new file mode 100644 (file)
index 0000000..14653be
--- /dev/null
@@ -0,0 +1,110 @@
+#ifndef EVAS_COMMON_SOFT16_H
+#define EVAS_COMMON_SOFT16_H
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef always_inline
+#if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
+#    define always_inline __attribute__((always_inline)) inline
+#else
+#    define always_inline inline
+#endif
+#endif
+
+#define RGB_565_UNPACKED_MASK 0x07e0f81f
+#define RGB_565_UNPACK(rgb)                                             \
+   (((rgb) | ((rgb) << 16)) & RGB_565_UNPACKED_MASK)
+#define RGB_565_PACK(rgb)                                               \
+  ((((rgb) & RGB_565_UNPACKED_MASK) |                                   \
+   ((rgb) & RGB_565_UNPACKED_MASK) >> 16) & 0xffff)
+#define RGB_565_UNPACKED_BLEND(a, b, alpha)                             \
+   ((b) + (a) - ((((b) * (alpha)) >> 5) & RGB_565_UNPACKED_MASK))
+#define RGB_565_UNPACKED_BLEND_UNMUL(a, b, alpha)                       \
+   ((b) + ((((a) - (b)) * (alpha)) >> 5))
+
+#define RGB_565_FROM_COMPONENTS(r, g, b)                                \
+  (((((r) >> 3) & 0x1f) << 11) |                                        \
+   ((((g) >> 2) & 0x3f) << 5) |                                         \
+   (((b) >> 3) & 0x1f))
+
+static inline int
+_calc_stride(int w)
+{
+   int pad;
+
+   pad = w % 4;
+   if (!pad)  return w;
+   else return w + 4 - pad;
+}
+
+#define IMG_BYTE_SIZE(stride, height, has_alpha)                       \
+   ((stride) * (height) * (!(has_alpha) ? 2 : 3))
+
+typedef struct _Soft16_Image Soft16_Image;
+struct _Soft16_Image
+{
+   Image_Entry    cache_entry;
+
+   RGBA_Image    *source;
+
+   int            stride;     // pixel stride - likely a multiple of 2
+   DATA16        *pixels;     // 16bpp pixels rgb565
+   DATA8         *alpha;      // 8bit alpha mask - optional. points into pixels
+
+   struct
+   {
+/*      unsigned char  have_alpha  : 1; // 1 if we have halpha */
+     unsigned char  free_pixels : 1; // 1 if pixels should be freed
+     unsigned char  free_alpha  : 1; // 1 if alpha mask should be freed
+   } flags;
+};
+
+/**
+ * Image (evas_soft16_main.c)
+ */
+EAPI void                evas_common_soft16_image_init(void);
+EAPI void                evas_common_soft16_image_shutdown(void);
+EAPI Evas_Cache_Image   *evas_common_soft16_image_cache_get(void);
+
+EAPI void                soft16_image_draw(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h, int smooth);
+EAPI Soft16_Image       *soft16_image_alpha_set(Soft16_Image *im, int have_alpha);
+
+void                     soft16_image_draw_unscaled(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, const Eina_Rectangle sr, const Eina_Rectangle dr, const Eina_Rectangle cr);
+void                     soft16_image_draw_scaled_sampled(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, const Eina_Rectangle sr, const Eina_Rectangle dr, const Eina_Rectangle cr);
+
+/* convert/dither functions */
+void                     soft16_image_convert_from_rgb(Soft16_Image *im, const DATA32 *src);
+void                     soft16_image_convert_from_rgba(Soft16_Image *im, const DATA32 *src);
+
+/**
+ * Rectangle (evas_soft16_rectangle.c)
+ */
+EAPI void                soft16_rectangle_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h);
+
+/**
+ * Polygon (evas_soft16_polygon.c)
+ */
+  EAPI void                soft16_polygon_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y);
+
+/**
+ * Line (evas_soft16_line.c)
+ */
+EAPI void                soft16_line_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1);
+
+/**
+ * Font (evas_soft16_font.c)
+ */
+EAPI void               *soft16_font_glyph_new(void *data, RGBA_Font_Glyph *fg);
+EAPI void                soft16_font_glyph_free(void *ext_dat);
+EAPI void                soft16_font_glyph_draw(void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/lib/include/evas_inline.x b/src/lib/include/evas_inline.x
new file mode 100644 (file)
index 0000000..c08ee9a
--- /dev/null
@@ -0,0 +1,238 @@
+#ifndef EVAS_INLINE_H
+#define EVAS_INLINE_H
+
+static inline void
+_evas_object_event_new(void)
+{
+   _evas_event_counter++;
+}
+
+static inline int
+evas_object_was_visible(Evas_Object *obj)
+{
+   if ((obj->prev.visible) &&
+       ((obj->prev.cache.clip.visible) || (obj->smart.smart)) &&
+       (obj->prev.cache.clip.a > 0))
+     {
+       if (obj->func->was_visible)
+         return obj->func->was_visible(obj);
+       return 1;
+     }
+   return 0;
+}
+
+static inline void
+evas_add_rect(Eina_Array *rects, int x, int y, int w, int h)
+{
+   Eina_Rectangle *r;
+
+   NEW_RECT(r, x, y, w, h);
+   if (r) eina_array_push(rects, r);
+}
+
+static inline Cutout_Rect*
+evas_common_draw_context_cutouts_add(Cutout_Rects* rects,
+                                     int x, int y, int w, int h)
+{
+   Cutout_Rect* rect;
+
+   if (rects->max < (rects->active + 1))
+     {
+       rects->max += 32;
+       rects->rects = (Cutout_Rect *)realloc(rects->rects, sizeof(Cutout_Rect) * rects->max);
+     }
+
+   rect = rects->rects + rects->active;
+   rect->x = x;
+   rect->y = y;
+   rect->w = w;
+   rect->h = h;
+   rects->active++;
+
+   return rect;
+}
+
+static inline int
+evas_object_is_opaque(Evas_Object *obj)
+{
+   if (obj->smart.smart) return 0;
+   if (obj->cur.cache.clip.a == 255)
+     {
+       if (obj->func->is_opaque)
+         return obj->func->is_opaque(obj);
+       return 1;
+     }
+   return 0;
+}
+
+static inline int
+evas_event_passes_through(Evas_Object *obj)
+{
+   if (obj->layer->evas->events_frozen > 0) return 1;
+   if (obj->pass_events) return 1;
+   if (obj->parent_cache_valid) return obj->parent_pass_events;
+   if (obj->smart.parent)
+     {
+       int par_pass;
+
+       par_pass = evas_event_passes_through(obj->smart.parent);
+       obj->parent_cache_valid = 1;
+       obj->parent_pass_events = par_pass;
+       return par_pass;
+     }
+   return 0;
+}
+
+static inline int
+evas_object_is_visible(Evas_Object *obj)
+{
+   if ((obj->cur.visible) &&
+       ((obj->cur.cache.clip.visible) || (obj->smart.smart)) &&
+       (obj->cur.cache.clip.a > 0))
+     {
+       if (obj->func->is_visible)
+         return obj->func->is_visible(obj);
+       return 1;
+     }
+   return 0;
+}
+
+static inline int
+evas_object_clippers_is_visible(Evas_Object *obj)
+{
+   if (obj->cur.visible)
+     {
+       if (obj->cur.clipper)
+         return evas_object_clippers_is_visible(obj->cur.clipper);
+       return 1;
+     }
+   return 0;
+}
+
+static inline int
+evas_object_is_in_output_rect(Evas_Object *obj, int x, int y, int w, int h)
+{
+   /* assumes coords have been recalced */
+   if ((RECTS_INTERSECT(x, y, w, h,
+                       obj->cur.cache.clip.x,
+                       obj->cur.cache.clip.y,
+                       obj->cur.cache.clip.w,
+                       obj->cur.cache.clip.h)))
+     return 1;
+   return 0;
+}
+
+static inline int
+evas_object_is_active(Evas_Object *obj)
+{
+   if (evas_object_is_visible(obj) || evas_object_was_visible(obj))
+     {
+        if (obj->smart.smart)
+          {
+             int mapsmt = 0;
+             if (obj->smart.smart && (obj->cur.map && obj->cur.usemap)) mapsmt = 1;
+             if (!mapsmt) return 1;
+             if (evas_object_is_in_output_rect(obj, 0, 0, obj->layer->evas->output.w,
+                                               obj->layer->evas->output.h) ||
+                 evas_object_was_in_output_rect(obj, 0, 0, obj->layer->evas->output.w,
+                                                obj->layer->evas->output.h))
+               return 1;
+          }
+        else
+          {
+             if (evas_object_is_in_output_rect(obj, 0, 0, obj->layer->evas->output.w,
+                                               obj->layer->evas->output.h) ||
+                 evas_object_was_in_output_rect(obj, 0, 0, obj->layer->evas->output.w,
+                                                obj->layer->evas->output.h))
+               return 1;
+          }
+     }
+   return 0;
+}
+
+static inline void
+evas_object_coords_recalc(Evas_Object *obj)
+{
+////   if (obj->cur.cache.geometry.validity == obj->layer->evas->output_validity)
+////     return;
+////   obj->cur.cache.geometry.x =
+////     evas_coord_world_x_to_screen(obj->layer->evas, obj->cur.geometry.x);
+////   obj->cur.cache.geometry.y =
+////     evas_coord_world_y_to_screen(obj->layer->evas, obj->cur.geometry.y);
+////   obj->cur.cache.geometry.w =
+////     evas_coord_world_x_to_screen(obj->layer->evas, obj->cur.geometry.w) -
+////     evas_coord_world_x_to_screen(obj->layer->evas, 0);
+////   obj->cur.cache.geometry.h =
+////     evas_coord_world_y_to_screen(obj->layer->evas, obj->cur.geometry.h) -
+////     evas_coord_world_y_to_screen(obj->layer->evas, 0);
+   if (obj->func->coords_recalc) obj->func->coords_recalc(obj);
+////   obj->cur.cache.geometry.validity = obj->layer->evas->output_validity;
+}
+
+static inline void
+evas_object_clip_recalc(Evas_Object *obj)
+{
+   int cx, cy, cw, ch, cvis, cr, cg, cb, ca;
+   int nx, ny, nw, nh, nvis, nr, ng, nb, na;
+
+   if (!obj->cur.cache.clip.dirty &&
+       !(obj->cur.clipper == NULL || obj->cur.clipper->cur.cache.clip.dirty))
+     return;
+   if (obj->layer->evas->events_frozen > 0) return;
+   evas_object_coords_recalc(obj);
+   if ((obj->cur.map) && (obj->cur.usemap))
+     {
+        cx = obj->cur.map->normal_geometry.x;
+        cy = obj->cur.map->normal_geometry.y;
+        cw = obj->cur.map->normal_geometry.w;
+        ch = obj->cur.map->normal_geometry.h;
+     }
+   else
+     {
+        cx = obj->cur.geometry.x;
+        cy = obj->cur.geometry.y;
+        cw = obj->cur.geometry.w;
+        ch = obj->cur.geometry.h;
+     }
+////   cx = obj->cur.cache.geometry.x; cy = obj->cur.cache.geometry.y;
+////   cw = obj->cur.cache.geometry.w; ch = obj->cur.cache.geometry.h;
+   if (obj->cur.color.a == 0) cvis = 0;
+   else cvis = obj->cur.visible;
+   cr = obj->cur.color.r; cg = obj->cur.color.g;
+   cb = obj->cur.color.b; ca = obj->cur.color.a;
+   if (obj->cur.clipper)
+     {
+// this causes problems... hmmm
+       if (obj->cur.clipper->cur.cache.clip.dirty)
+         evas_object_clip_recalc(obj->cur.clipper);
+       nx = obj->cur.clipper->cur.cache.clip.x;
+       ny = obj->cur.clipper->cur.cache.clip.y;
+       nw = obj->cur.clipper->cur.cache.clip.w;
+       nh = obj->cur.clipper->cur.cache.clip.h;
+       RECTS_CLIP_TO_RECT(cx, cy, cw, ch, nx, ny, nw, nh);
+
+       nvis = obj->cur.clipper->cur.cache.clip.visible;
+       nr = obj->cur.clipper->cur.cache.clip.r;
+       ng = obj->cur.clipper->cur.cache.clip.g;
+       nb = obj->cur.clipper->cur.cache.clip.b;
+       na = obj->cur.clipper->cur.cache.clip.a;
+       cvis = cvis * nvis;
+       cr = (cr * (nr + 1)) >> 8;
+       cg = (cg * (ng + 1)) >> 8;
+       cb = (cb * (nb + 1)) >> 8;
+       ca = (ca * (na + 1)) >> 8;
+     }
+   if ((ca == 0) || (cw <= 0) || (ch <= 0)) cvis = 0;
+   obj->cur.cache.clip.x = cx;
+   obj->cur.cache.clip.y = cy;
+   obj->cur.cache.clip.w = cw;
+   obj->cur.cache.clip.h = ch;
+   obj->cur.cache.clip.visible = cvis;
+   obj->cur.cache.clip.r = cr;
+   obj->cur.cache.clip.g = cg;
+   obj->cur.cache.clip.b = cb;
+   obj->cur.cache.clip.a = ca;
+   obj->cur.cache.clip.dirty = 0;
+}
+
+#endif
diff --git a/src/lib/include/evas_macros.h b/src/lib/include/evas_macros.h
new file mode 100644 (file)
index 0000000..ba1ab6e
--- /dev/null
@@ -0,0 +1,217 @@
+#ifndef EVAS_MACROS_H
+#define EVAS_MACROS_H
+
+#undef ABS
+#define ABS(x) (((x) < 0) ? -(x) : (x))
+
+#undef SGN
+#define SGN(x) (((x) < 0) ? -1 : 1)
+
+#undef MIN
+#define MIN(x, y) (((x) < (y)) ? (x) : (y))
+
+#undef MAX
+#define MAX(x, y) (((x) > (y)) ? (x) : (y))
+
+#define SWAP32(x) (x) = \
+   ((((x) & 0x000000ff ) << 24) | \
+    (((x) & 0x0000ff00 ) << 8)  | \
+    (((x) & 0x00ff0000 ) >> 8)  | \
+    (((x) & 0xff000000 ) >> 24))
+
+#define SWAP16(x) (x) = \
+   ((((x) & 0x00ff ) << 8) | \
+    (((x) & 0xff00 ) >> 8))
+
+#define SPANS_COMMON(x1, w1, x2, w2) \
+(!((((x2) + (w2)) <= (x1)) || ((x2) >= ((x1) + (w1)))))
+
+#define RECTS_INTERSECT(x, y, w, h, xx, yy, ww, hh) \
+((SPANS_COMMON((x), (w), (xx), (ww))) && (SPANS_COMMON((y), (h), (yy), (hh))))
+
+#define RECTS_CLIP_TO_RECT(_x, _y, _w, _h, _cx, _cy, _cw, _ch) \
+{ \
+   if (RECTS_INTERSECT(_x, _y, _w, _h, _cx, _cy, _cw, _ch)) \
+     { \
+       if (_x < (_cx)) \
+         { \
+            _w += _x - (_cx); \
+            _x = (_cx); \
+            if (_w < 0) _w = 0; \
+         } \
+       if ((_x + _w) > ((_cx) + (_cw))) \
+         _w = (_cx) + (_cw) - _x; \
+       if (_y < (_cy)) \
+         { \
+            _h += _y - (_cy); \
+            _y = (_cy); \
+            if (_h < 0) _h = 0; \
+         } \
+       if ((_y + _h) > ((_cy) + (_ch))) \
+         _h = (_cy) + (_ch) - _y; \
+     } \
+   else \
+     { \
+       _w = 0; _h = 0; \
+     } \
+}
+
+
+#define INTERP_VAL(out, in1, in2, in3, in4, interp_x, interp_y)    \
+   {                                                               \
+      int _v, _vv;                                                 \
+                                                                   \
+      _v = (256 - (interp_x)) * (in1);                             \
+      if ((interp_x) > 0) _v += (interp_x) * (in2);                \
+      _v *= (256 - (interp_y));                                    \
+      if ((interp_y) > 0)                                          \
+       {                                                          \
+          _vv = (256 - (interp_x)) * (in3);                       \
+          if ((interp_x) > 0) _vv += (interp_x) * (in4);          \
+          _vv *= (interp_y);                                      \
+          (out) = ((_v + _vv) >> 16);                             \
+       }                                                          \
+      else (out) = (_v >> 16);                                     \
+   }
+
+#define INTERP_2(in1, in2, interp, interp_inv) \
+   ((in1 * interp_inv) + (in2 * interp)) >> 8
+
+
+#define CONVERT_LOOP_START_ROT_0() \
+   src_ptr = src; \
+   for (y = 0; y < h; y++) \
+     { \
+       for (x = 0; x < w; x++) \
+         {
+
+#define CONVERT_LOOP_END_ROT_0() \
+             dst_ptr++; \
+             src_ptr++; \
+          } \
+        src_ptr += src_jump; \
+        dst_ptr += dst_jump; \
+     }
+
+#define CONVERT_LOOP_START_ROT_180() \
+   src_ptr = src + (w - 1) + ((h - 1) * (w + src_jump)); \
+   for (y = 0; y < h; y++) \
+     { \
+        for (x = 0; x < w; x++) \
+          {
+
+#define CONVERT_LOOP_END_ROT_180() \
+             dst_ptr++; \
+             src_ptr--; \
+          } \
+        src_ptr = src + (w - 1) + ((h - y - 2) * (w + src_jump)); \
+        dst_ptr += dst_jump; \
+     }
+
+#define CONVERT_LOOP_START_ROT_270() \
+   src_ptr = src + ((w - 1) * (h + src_jump)); \
+   for (y = 0; y < h; y++) \
+     { \
+       for (x = 0; x < w; x++) \
+         {
+
+#define CONVERT_LOOP_END_ROT_270() \
+             dst_ptr++; \
+             src_ptr -= (h + src_jump); \
+          } \
+        src_ptr = src + ((w - 1) * (h + src_jump)) + (y + 1); \
+        dst_ptr += dst_jump; \
+     }
+
+#define CONVERT_LOOP_START_ROT_90() \
+   src_ptr = src + (h - 1); \
+   for (y = 0; y < h; y++) \
+     { \
+       for (x = 0; x < w; x++) \
+         {
+
+#define CONVERT_LOOP_END_ROT_90() \
+             dst_ptr++; \
+             src_ptr += (h + src_jump); \
+          } \
+        src_ptr = src + (h - 1) - y - 1; \
+        dst_ptr += dst_jump; \
+     }
+
+#define CONVERT_LOOP2_START_ROT_0() \
+   src_ptr = src; \
+   for (y = 0; y < h; y++) \
+     { \
+       for (x = 0; x < w; x++) \
+         {
+
+#define CONVERT_LOOP2_INC_ROT_0() \
+src_ptr++; \
+x++;
+
+#define CONVERT_LOOP2_END_ROT_0() \
+             dst_ptr+=2; \
+             src_ptr++; \
+          } \
+        src_ptr += src_jump; \
+        dst_ptr += dst_jump; \
+     }
+
+#define CONVERT_LOOP2_START_ROT_180() \
+   src_ptr = src + (w - 1) + ((h - 1) * (w + src_jump)); \
+   for (y = 0; y < h; y++) \
+     { \
+        for (x = 0; x < w; x++) \
+          {
+
+#define CONVERT_LOOP2_INC_ROT_180() \
+src_ptr--; \
+x++;
+
+#define CONVERT_LOOP2_END_ROT_180() \
+             dst_ptr+=2; \
+             src_ptr--; \
+          } \
+        src_ptr = src + (w - 1) + ((h - y - 2) * (w + src_jump)); \
+        dst_ptr += dst_jump; \
+     }
+
+#define CONVERT_LOOP2_START_ROT_270() \
+   src_ptr = src + ((w - 1) * (h + src_jump)); \
+   for (y = 0; y < h; y++) \
+     { \
+       for (x = 0; x < w; x++) \
+         {
+
+#define CONVERT_LOOP2_INC_ROT_270() \
+src_ptr -= (h + src_jump); \
+x++;
+
+#define CONVERT_LOOP2_END_ROT_270() \
+             dst_ptr+=2; \
+             src_ptr -= (h + src_jump); \
+          } \
+        src_ptr = src + ((w - 1) * (h + src_jump)) + (y + 1); \
+        dst_ptr += dst_jump; \
+     }
+
+#define CONVERT_LOOP2_START_ROT_90() \
+   src_ptr = src + (h - 1); \
+   for (y = 0; y < h; y++) \
+     { \
+       for (x = 0; x < w; x++) \
+         {
+
+#define CONVERT_LOOP2_INC_ROT_90() \
+src_ptr += (h + src_jump); \
+x++;
+
+#define CONVERT_LOOP2_END_ROT_90() \
+             dst_ptr+=2; \
+             src_ptr += (h + src_jump); \
+          } \
+        src_ptr = src + (h - 1) - y - 1; \
+        dst_ptr += dst_jump; \
+     }
+
+#endif
diff --git a/src/lib/include/evas_mmx.h b/src/lib/include/evas_mmx.h
new file mode 100644 (file)
index 0000000..e1095e1
--- /dev/null
@@ -0,0 +1,735 @@
+/*     mmx.h
+
+       MultiMedia eXtensions GCC interface library for IA32.
+
+       To use this library, simply include this header file
+       and compile with GCC.  You MUST have inlining enabled
+       in order for mmx_ok() to work; this can be done by
+       simply using -O on the GCC command line.
+
+       Compiling with -DMMX_TRACE will cause detailed trace
+       output to be sent to stderr for each mmx operation.
+       This adds lots of code, and obviously slows execution to
+       a crawl, but can be very useful for debugging.
+
+       THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY
+       EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
+       LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+       AND FITNESS FOR ANY PARTICULAR PURPOSE.
+
+       1997-98 by H. Dietz and R. Fisher
+
+ History:
+       97-98*  R.Fisher        Early versions
+       980501  R.Fisher        Original Release
+       980611* H.Dietz         Rewrite, correctly implementing inlines, and
+               R.Fisher         including direct register accesses.
+       980616  R.Fisher        Release of 980611 as 980616.
+       980714  R.Fisher        Minor corrections to Makefile, etc.
+       980715  R.Fisher        mmx_ok() now prevents optimizer from using
+                                clobbered values.
+                               mmx_ok() now checks if cpuid instruction is
+                                available before trying to use it.
+       980726* R.Fisher        mm_support() searches for AMD 3DNow, Cyrix
+                                Extended MMX, and standard MMX.  It returns a
+                                value which is positive if any of these are
+                                supported, and can be masked with constants to
+                                see which.  mmx_ok() is now a call to this
+       980726* R.Fisher        Added i2r support for shift functions
+       980919  R.Fisher        Fixed AMD extended feature recognition bug.
+       980921  R.Fisher        Added definition/check for _MMX_H.
+                               Added "float s[2]" to mmx_t for use with
+                                 3DNow and EMMX.  So same mmx_t can be used.
+       981013  R.Fisher        Fixed cpuid function 1 bug (looked at wrong reg)
+                               Fixed psllq_i2r error in mmxtest.c
+
+       * Unreleased (internal or interim) versions
+
+ Notes:
+       It appears that the latest gas has the pand problem fixed, therefore
+         I'll undefine BROKEN_PAND by default.
+       String compares may be quicker than the multiple test/jumps in vendor
+         test sequence in mmx_ok(), but I'm not concerned with that right now.
+
+ Acknowledgments:
+       Jussi Laako for pointing out the errors ultimately found to be
+         connected to the failure to notify the optimizer of clobbered values.
+       Roger Hardiman for reminding us that CPUID isn't everywhere, and that
+         someone may actually try to use this on a machine without CPUID.
+         Also for suggesting code for checking this.
+       Robert Dale for pointing out the AMD recognition bug.
+       Jimmy Mayfield and Carl Witty for pointing out the Intel recognition
+         bug.
+       Carl Witty for pointing out the psllq_i2r test bug.
+*/
+
+#ifndef _MMX_H
+#define _MMX_H
+
+/*     Warning:  at this writing, the version of GAS packaged
+       with most Linux distributions does not handle the
+       parallel AND operation mnemonic correctly.  If the
+       symbol BROKEN_PAND is defined, a slower alternative
+       coding will be used.  If execution of mmxtest results
+       in an illegal instruction fault, define this symbol.
+*/
+#undef BROKEN_PAND
+
+
+/*     The type of an value that fits in an MMX register
+       (note that long long constant values MUST be suffixed
+        by LL and unsigned long long values by ULL, lest
+        they be truncated by the compiler)
+*/
+typedef        union {
+       long long               q;      /* Quadword (64-bit) value */
+       unsigned long long      uq;     /* Unsigned Quadword */
+       int                     d[2];   /* 2 Doubleword (32-bit) values */
+       unsigned int            ud[2];  /* 2 Unsigned Doubleword */
+       short                   w[4];   /* 4 Word (16-bit) values */
+       unsigned short          uw[4];  /* 4 Unsigned Word */
+       char                    b[8];   /* 8 Byte (8-bit) values */
+       unsigned char           ub[8];  /* 8 Unsigned Byte */
+       float                   s[2];   /* Single-precision (32-bit) value */
+}  __attribute__ ((aligned (8))) mmx_t;
+
+/*     Helper functions for the instruction macros that follow...
+       (note that memory-to-register, m2r, instructions are nearly
+        as efficient as register-to-register, r2r, instructions;
+        however, memory-to-memory instructions are really simulated
+        as a convenience, and are only 1/3 as efficient)
+*/
+
+/*     These macros are a lot simpler without the tracing...
+*/
+
+#define        mmx_i2r(op, imm, reg) \
+       __asm__ __volatile__ (#op " $" #imm ", %%" #reg \
+                             : /* nothing */ \
+                             : /* nothing */);
+
+#define        mmx_m2r(op, mem, reg) \
+       __asm__ __volatile__ (#op " %0, %%" #reg \
+                             : /* nothing */ \
+                             : "m" (mem))
+
+#define        mmx_r2m(op, reg, mem) \
+       __asm__ __volatile__ (#op " %%" #reg ", %0" \
+                             : "=m" (mem) \
+                             : /* nothing */ )
+
+#define        mmx_a2r(op, mem, reg) \
+       __asm__ __volatile__ (#op " %0, %%" #reg \
+                             : /* nothing */ \
+                             : "m" (mem))
+
+#define        mmx_r2a(op, reg, mem) \
+       __asm__ __volatile__ (#op " %%" #reg ", %0" \
+                             : "=m" (mem) \
+                             : /* nothing */ )
+
+#define        mmx_r2r(op, regs, regd) \
+       __asm__ __volatile__ (#op " %" #regs ", %" #regd)
+
+#define        mmx_m2m(op, mems, memd) \
+       __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
+                             #op " %1, %%mm0\n\t" \
+                             "movq %%mm0, %0" \
+                             : "=X" (memd) \
+                             : "X" (mems))
+
+/*     1x64 MOVE Quadword
+       (this is both a load and a store...
+        in fact, it is the only way to store)
+*/
+#define        movq_m2r(var, reg)      mmx_m2r(movq, var, reg)
+#define        movq_r2m(reg, var)      mmx_r2m(movq, reg, var)
+#define        movq_r2r(regs, regd)    mmx_r2r(movq, regs, regd)
+#define        movq(vars, vard) \
+       __asm__ __volatile__ ("movq %1, %%mm0\n\t" \
+                             "movq %%mm0, %0" \
+                             : "=X" (vard) \
+                             : "X" (vars))
+#define        movntq_r2m(reg, var)   mmx_r2m(movntq, reg, var)
+
+
+/*     1x32 MOVE Doubleword
+       (like movq, this is both load and store...
+        but is most useful for moving things between
+        mmx registers and ordinary registers)
+*/
+#define        movd_m2r(var, reg)      mmx_a2r(movd, var, reg)
+#define        movd_r2m(reg, var)      mmx_r2a(movd, reg, var)
+#define        movd_r2r(regs, regd)    mmx_r2r(movd, regs, regd)
+#define        movd(vars, vard) \
+       __asm__ __volatile__ ("movd %1, %%mm0\n\t" \
+                             "movd %%mm0, %0" \
+                             : "=X" (vard) \
+                             : "X" (vars))
+
+
+/*     2x32, 4x16, and 8x8 Parallel ADDs
+*/
+#define        paddd_m2r(var, reg)     mmx_m2r(paddd, var, reg)
+#define        paddd_r2r(regs, regd)   mmx_r2r(paddd, regs, regd)
+#define        paddd(vars, vard)       mmx_m2m(paddd, vars, vard)
+
+#define        paddw_m2r(var, reg)     mmx_m2r(paddw, var, reg)
+#define        paddw_r2r(regs, regd)   mmx_r2r(paddw, regs, regd)
+#define        paddw(vars, vard)       mmx_m2m(paddw, vars, vard)
+
+#define        paddb_m2r(var, reg)     mmx_m2r(paddb, var, reg)
+#define        paddb_r2r(regs, regd)   mmx_r2r(paddb, regs, regd)
+#define        paddb(vars, vard)       mmx_m2m(paddb, vars, vard)
+
+
+/*     4x16 and 8x8 Parallel ADDs using Saturation arithmetic
+*/
+#define        paddsw_m2r(var, reg)    mmx_m2r(paddsw, var, reg)
+#define        paddsw_r2r(regs, regd)  mmx_r2r(paddsw, regs, regd)
+#define        paddsw(vars, vard)      mmx_m2m(paddsw, vars, vard)
+
+#define        paddsb_m2r(var, reg)    mmx_m2r(paddsb, var, reg)
+#define        paddsb_r2r(regs, regd)  mmx_r2r(paddsb, regs, regd)
+#define        paddsb(vars, vard)      mmx_m2m(paddsb, vars, vard)
+
+
+/*     4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic
+*/
+#define        paddusw_m2r(var, reg)   mmx_m2r(paddusw, var, reg)
+#define        paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd)
+#define        paddusw(vars, vard)     mmx_m2m(paddusw, vars, vard)
+
+#define        paddusb_m2r(var, reg)   mmx_m2r(paddusb, var, reg)
+#define        paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd)
+#define        paddusb(vars, vard)     mmx_m2m(paddusb, vars, vard)
+
+
+/*     2x32, 4x16, and 8x8 Parallel SUBs
+*/
+#define        psubd_m2r(var, reg)     mmx_m2r(psubd, var, reg)
+#define        psubd_r2r(regs, regd)   mmx_r2r(psubd, regs, regd)
+#define        psubd(vars, vard)       mmx_m2m(psubd, vars, vard)
+
+#define        psubw_m2r(var, reg)     mmx_m2r(psubw, var, reg)
+#define        psubw_r2r(regs, regd)   mmx_r2r(psubw, regs, regd)
+#define        psubw(vars, vard)       mmx_m2m(psubw, vars, vard)
+
+#define        psubb_m2r(var, reg)     mmx_m2r(psubb, var, reg)
+#define        psubb_r2r(regs, regd)   mmx_r2r(psubb, regs, regd)
+#define        psubb(vars, vard)       mmx_m2m(psubb, vars, vard)
+
+
+/*     4x16 and 8x8 Parallel SUBs using Saturation arithmetic
+*/
+#define        psubsw_m2r(var, reg)    mmx_m2r(psubsw, var, reg)
+#define        psubsw_r2r(regs, regd)  mmx_r2r(psubsw, regs, regd)
+#define        psubsw(vars, vard)      mmx_m2m(psubsw, vars, vard)
+
+#define        psubsb_m2r(var, reg)    mmx_m2r(psubsb, var, reg)
+#define        psubsb_r2r(regs, regd)  mmx_r2r(psubsb, regs, regd)
+#define        psubsb(vars, vard)      mmx_m2m(psubsb, vars, vard)
+
+
+/*     4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic
+*/
+#define        psubusw_m2r(var, reg)   mmx_m2r(psubusw, var, reg)
+#define        psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd)
+#define        psubusw(vars, vard)     mmx_m2m(psubusw, vars, vard)
+
+#define        psubusb_m2r(var, reg)   mmx_m2r(psubusb, var, reg)
+#define        psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd)
+#define        psubusb(vars, vard)     mmx_m2m(psubusb, vars, vard)
+
+
+/*     4x16 Parallel MULs giving Low 4x16 portions of results
+*/
+#define        pmullw_m2r(var, reg)    mmx_m2r(pmullw, var, reg)
+#define        pmullw_r2r(regs, regd)  mmx_r2r(pmullw, regs, regd)
+#define        pmullw(vars, vard)      mmx_m2m(pmullw, vars, vard)
+
+
+/*     4x16 Parallel MULs giving High 4x16 portions of results
+*/
+#define        pmulhw_m2r(var, reg)    mmx_m2r(pmulhw, var, reg)
+#define        pmulhw_r2r(regs, regd)  mmx_r2r(pmulhw, regs, regd)
+#define        pmulhw(vars, vard)      mmx_m2m(pmulhw, vars, vard)
+
+
+/*     4x16->2x32 Parallel Mul-ADD
+       (muls like pmullw, then adds adjacent 16-bit fields
+        in the multiply result to make the final 2x32 result)
+*/
+#define        pmaddwd_m2r(var, reg)   mmx_m2r(pmaddwd, var, reg)
+#define        pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd)
+#define        pmaddwd(vars, vard)     mmx_m2m(pmaddwd, vars, vard)
+
+
+/*     1x64 bitwise AND
+*/
+#ifdef BROKEN_PAND
+#define        pand_m2r(var, reg) \
+       { \
+               mmx_m2r(pandn, (mmx_t) -1LL, reg); \
+               mmx_m2r(pandn, var, reg); \
+       }
+#define        pand_r2r(regs, regd) \
+       { \
+               mmx_m2r(pandn, (mmx_t) -1LL, regd); \
+               mmx_r2r(pandn, regs, regd) \
+       }
+#define        pand(vars, vard) \
+       { \
+               movq_m2r(vard, mm0); \
+               mmx_m2r(pandn, (mmx_t) -1LL, mm0); \
+               mmx_m2r(pandn, vars, mm0); \
+               movq_r2m(mm0, vard); \
+       }
+#else
+#define        pand_m2r(var, reg)      mmx_m2r(pand, var, reg)
+#define        pand_r2r(regs, regd)    mmx_r2r(pand, regs, regd)
+#define        pand(vars, vard)        mmx_m2m(pand, vars, vard)
+#endif
+
+
+/*     1x64 bitwise AND with Not the destination
+*/
+#define        pandn_m2r(var, reg)     mmx_m2r(pandn, var, reg)
+#define        pandn_r2r(regs, regd)   mmx_r2r(pandn, regs, regd)
+#define        pandn(vars, vard)       mmx_m2m(pandn, vars, vard)
+
+
+/*     1x64 bitwise OR
+*/
+#define        por_m2r(var, reg)       mmx_m2r(por, var, reg)
+#define        por_r2r(regs, regd)     mmx_r2r(por, regs, regd)
+#define        por(vars, vard) mmx_m2m(por, vars, vard)
+
+
+/*     1x64 bitwise eXclusive OR
+*/
+#define        pxor_m2r(var, reg)      mmx_m2r(pxor, var, reg)
+#define        pxor_r2r(regs, regd)    mmx_r2r(pxor, regs, regd)
+#define        pxor(vars, vard)        mmx_m2m(pxor, vars, vard)
+
+
+/*     2x32, 4x16, and 8x8 Parallel CoMPare for EQuality
+       (resulting fields are either 0 or -1)
+*/
+#define        pcmpeqd_m2r(var, reg)   mmx_m2r(pcmpeqd, var, reg)
+#define        pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd)
+#define        pcmpeqd(vars, vard)     mmx_m2m(pcmpeqd, vars, vard)
+
+#define        pcmpeqw_m2r(var, reg)   mmx_m2r(pcmpeqw, var, reg)
+#define        pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd)
+#define        pcmpeqw(vars, vard)     mmx_m2m(pcmpeqw, vars, vard)
+
+#define        pcmpeqb_m2r(var, reg)   mmx_m2r(pcmpeqb, var, reg)
+#define        pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd)
+#define        pcmpeqb(vars, vard)     mmx_m2m(pcmpeqb, vars, vard)
+
+
+/*     2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than
+       (resulting fields are either 0 or -1)
+*/
+#define        pcmpgtd_m2r(var, reg)   mmx_m2r(pcmpgtd, var, reg)
+#define        pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd)
+#define        pcmpgtd(vars, vard)     mmx_m2m(pcmpgtd, vars, vard)
+
+#define        pcmpgtw_m2r(var, reg)   mmx_m2r(pcmpgtw, var, reg)
+#define        pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd)
+#define        pcmpgtw(vars, vard)     mmx_m2m(pcmpgtw, vars, vard)
+
+#define        pcmpgtb_m2r(var, reg)   mmx_m2r(pcmpgtb, var, reg)
+#define        pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd)
+#define        pcmpgtb(vars, vard)     mmx_m2m(pcmpgtb, vars, vard)
+
+
+/*     1x64, 2x32, and 4x16 Parallel Shift Left Logical
+*/
+#define        psllq_i2r(imm, reg)     mmx_i2r(psllq, imm, reg)
+#define        psllq_m2r(var, reg)     mmx_m2r(psllq, var, reg)
+#define        psllq_r2r(regs, regd)   mmx_r2r(psllq, regs, regd)
+#define        psllq(vars, vard)       mmx_m2m(psllq, vars, vard)
+
+#define        pslld_i2r(imm, reg)     mmx_i2r(pslld, imm, reg)
+#define        pslld_m2r(var, reg)     mmx_m2r(pslld, var, reg)
+#define        pslld_r2r(regs, regd)   mmx_r2r(pslld, regs, regd)
+#define        pslld(vars, vard)       mmx_m2m(pslld, vars, vard)
+
+#define        psllw_i2r(imm, reg)     mmx_i2r(psllw, imm, reg)
+#define        psllw_m2r(var, reg)     mmx_m2r(psllw, var, reg)
+#define        psllw_r2r(regs, regd)   mmx_r2r(psllw, regs, regd)
+#define        psllw(vars, vard)       mmx_m2m(psllw, vars, vard)
+
+
+/*     1x64, 2x32, and 4x16 Parallel Shift Right Logical
+*/
+#define        psrlq_i2r(imm, reg)     mmx_i2r(psrlq, imm, reg)
+#define        psrlq_m2r(var, reg)     mmx_m2r(psrlq, var, reg)
+#define        psrlq_r2r(regs, regd)   mmx_r2r(psrlq, regs, regd)
+#define        psrlq(vars, vard)       mmx_m2m(psrlq, vars, vard)
+
+#define        psrld_i2r(imm, reg)     mmx_i2r(psrld, imm, reg)
+#define        psrld_m2r(var, reg)     mmx_m2r(psrld, var, reg)
+#define        psrld_r2r(regs, regd)   mmx_r2r(psrld, regs, regd)
+#define        psrld(vars, vard)       mmx_m2m(psrld, vars, vard)
+
+#define        psrlw_i2r(imm, reg)     mmx_i2r(psrlw, imm, reg)
+#define        psrlw_m2r(var, reg)     mmx_m2r(psrlw, var, reg)
+#define        psrlw_r2r(regs, regd)   mmx_r2r(psrlw, regs, regd)
+#define        psrlw(vars, vard)       mmx_m2m(psrlw, vars, vard)
+
+
+/*     2x32 and 4x16 Parallel Shift Right Arithmetic
+*/
+#define        psrad_i2r(imm, reg)     mmx_i2r(psrad, imm, reg)
+#define        psrad_m2r(var, reg)     mmx_m2r(psrad, var, reg)
+#define        psrad_r2r(regs, regd)   mmx_r2r(psrad, regs, regd)
+#define        psrad(vars, vard)       mmx_m2m(psrad, vars, vard)
+
+#define        psraw_i2r(imm, reg)     mmx_i2r(psraw, imm, reg)
+#define        psraw_m2r(var, reg)     mmx_m2r(psraw, var, reg)
+#define        psraw_r2r(regs, regd)   mmx_r2r(psraw, regs, regd)
+#define        psraw(vars, vard)       mmx_m2m(psraw, vars, vard)
+
+
+/*     2x32->4x16 and 4x16->8x8 PACK and Signed Saturate
+       (packs source and dest fields into dest in that order)
+*/
+#define        packssdw_m2r(var, reg)  mmx_m2r(packssdw, var, reg)
+#define        packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd)
+#define        packssdw(vars, vard)    mmx_m2m(packssdw, vars, vard)
+
+#define        packsswb_m2r(var, reg)  mmx_m2r(packsswb, var, reg)
+#define        packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd)
+#define        packsswb(vars, vard)    mmx_m2m(packsswb, vars, vard)
+
+
+/*     4x16->8x8 PACK and Unsigned Saturate
+       (packs source and dest fields into dest in that order)
+*/
+#define        packuswb_m2r(var, reg)  mmx_m2r(packuswb, var, reg)
+#define        packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd)
+#define        packuswb(vars, vard)    mmx_m2m(packuswb, vars, vard)
+
+
+/*     2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low
+       (interleaves low half of dest with low half of source
+        as padding in each result field)
+*/
+#define        punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg)
+#define        punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd)
+#define        punpckldq(vars, vard)   mmx_m2m(punpckldq, vars, vard)
+
+#define        punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg)
+#define        punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd)
+#define        punpcklwd(vars, vard)   mmx_m2m(punpcklwd, vars, vard)
+
+#define        punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg)
+#define        punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd)
+#define        punpcklbw(vars, vard)   mmx_m2m(punpcklbw, vars, vard)
+
+
+/*     2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High
+       (interleaves high half of dest with high half of source
+        as padding in each result field)
+*/
+#define        punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg)
+#define        punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd)
+#define        punpckhdq(vars, vard)   mmx_m2m(punpckhdq, vars, vard)
+
+#define        punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg)
+#define        punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd)
+#define        punpckhwd(vars, vard)   mmx_m2m(punpckhwd, vars, vard)
+
+#define        punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg)
+#define        punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd)
+#define        punpckhbw(vars, vard)   mmx_m2m(punpckhbw, vars, vard)
+
+#define MOVE_8DWORDS_MMX(src,dst) \
+          __asm__ ( \
+               "movq (%1), %%mm0 \n" \
+               "movq 0x8(%1), %%mm1 \n" \
+               "movq 0x10(%1), %%mm2 \n" \
+               "movq 0x18(%1), %%mm3 \n" \
+               "movq %%mm0, (%0) \n" \
+               "movq %%mm1, 0x8(%0) \n" \
+               "movq %%mm2, 0x10(%0) \n" \
+               "movq %%mm3, 0x18(%0) \n" \
+               : \
+               : "q" (dst), "r" (src) \
+               : "memory",  "st");
+
+#define MOVE_10DWORDS_MMX(src,dst) \
+          __asm__ ( \
+               "movq (%1), %%mm0 \n" \
+               "movq 0x8(%1), %%mm1 \n" \
+               "movq 0x10(%1), %%mm2 \n" \
+               "movq 0x18(%1), %%mm3 \n" \
+               "movq 0x20(%1), %%mm4 \n" \
+               "movq %%mm0, (%0) \n" \
+               "movq %%mm1, 0x8(%0) \n" \
+               "movq %%mm2, 0x10(%0) \n" \
+               "movq %%mm3, 0x18(%0) \n" \
+               "movq %%mm4, 0x20(%0) \n" \
+               : \
+               : "q" (dst), "r" (src) \
+               : "memory",  "st");
+
+#define MOVE_16DWORDS_MMX(src,dst) \
+          __asm__ ( \
+               "movq (%1), %%mm0 \n" \
+               "movq 0x8(%1), %%mm1 \n" \
+               "movq 0x10(%1), %%mm2 \n" \
+               "movq 0x18(%1), %%mm3 \n" \
+               "movq 0x20(%1), %%mm4 \n" \
+               "movq 0x28(%1), %%mm5 \n" \
+               "movq 0x30(%1), %%mm6 \n" \
+               "movq 0x38(%1), %%mm7 \n" \
+               "movq %%mm0, (%0) \n" \
+               "movq %%mm1, 0x8(%0) \n" \
+               "movq %%mm2, 0x10(%0) \n" \
+               "movq %%mm3, 0x18(%0) \n" \
+               "movq %%mm4, 0x20(%0) \n" \
+               "movq %%mm5, 0x28(%0) \n" \
+               "movq %%mm6, 0x30(%0) \n" \
+               "movq %%mm7, 0x38(%0) \n" \
+               : \
+               : "q" (dst), "r" (src) \
+               : "memory",  "st");
+
+#define MOVE_16DWORDS_MMX2(src,dst) \
+          __asm__ ( \
+               "movq (%1), %%mm0 \n" \
+               "movq 0x8(%1), %%mm1 \n" \
+               "movq 0x10(%1), %%mm2 \n" \
+               "movq 0x18(%1), %%mm3 \n" \
+               "movq 0x20(%1), %%mm4 \n" \
+               "movq 0x28(%1), %%mm5 \n" \
+               "movq 0x30(%1), %%mm6 \n" \
+               "movq 0x38(%1), %%mm7 \n" \
+               "movntq %%mm0, (%0) \n" \
+               "movntq %%mm1, 0x8(%0) \n" \
+               "movntq %%mm2, 0x10(%0) \n" \
+               "movntq %%mm3, 0x18(%0) \n" \
+               "movntq %%mm4, 0x20(%0) \n" \
+               "movntq %%mm5, 0x28(%0) \n" \
+               "movntq %%mm6, 0x30(%0) \n" \
+               "movntq %%mm7, 0x38(%0) \n" \
+               : \
+               : "q" (dst), "r" (src) \
+               : "memory",  "st");
+
+#define MOVE_32DWORDS_SSE2(src,dst) \
+          __asm__ ( \
+               "movdqu (%1), %%xmm0 \n" \
+               "movdqu 0x10(%1), %%xmm1 \n" \
+               "movdqu 0x20(%1), %%xmm2 \n" \
+               "movdqu 0x30(%1), %%xmm3 \n" \
+               "movdqu 0x40(%1), %%xmm4 \n" \
+               "movdqu 0x50(%1), %%xmm5 \n" \
+               "movdqu 0x60(%1), %%xmm6 \n" \
+               "movdqu 0x70(%1), %%xmm7 \n" \
+               "movntdq %%xmm0, (%0) \n" \
+               "movntdq %%xmm1, 0x10(%0) \n" \
+               "movntdq %%xmm2, 0x20(%0) \n" \
+               "movntdq %%xmm3, 0x30(%0) \n" \
+               "movntdq %%xmm4, 0x40(%0) \n" \
+               "movntdq %%xmm5, 0x50(%0) \n" \
+               "movntdq %%xmm6, 0x60(%0) \n" \
+               "movntdq %%xmm7, 0x70(%0) \n" \
+               : \
+               : "q" (dst), "r" (src) \
+               : "memory",  "st");
+
+#define MOVE_32DWORDS_ALIGNED_SSE2(src,dst) \
+          __asm__ ( \
+               "movdqa (%1), %%xmm0 \n" \
+               "movdqa 0x10(%1), %%xmm1 \n" \
+               "movdqa 0x20(%1), %%xmm2 \n" \
+               "movdqa 0x30(%1), %%xmm3 \n" \
+               "movdqa 0x40(%1), %%xmm4 \n" \
+               "movdqa 0x50(%1), %%xmm5 \n" \
+               "movdqa 0x60(%1), %%xmm6 \n" \
+               "movdqa 0x70(%1), %%xmm7 \n" \
+               "movntdq %%xmm0, (%0) \n" \
+               "movntdq %%xmm1, 0x10(%0) \n" \
+               "movntdq %%xmm2, 0x20(%0) \n" \
+               "movntdq %%xmm3, 0x30(%0) \n" \
+               "movntdq %%xmm4, 0x40(%0) \n" \
+               "movntdq %%xmm5, 0x50(%0) \n" \
+               "movntdq %%xmm6, 0x60(%0) \n" \
+               "movntdq %%xmm7, 0x70(%0) \n" \
+               : \
+               : "q" (dst), "r" (src) \
+               : "memory",  "st");
+
+/*     Empty MMx State
+       (used to clean-up when going from mmx to float use
+        of the registers that are shared by both; note that
+        there is no float-to-mmx operation needed, because
+        only the float tag word info is corruptible)
+*/
+
+#define        emms()                  __asm__ __volatile__ ("emms":::"memory")
+#define        sfence()                __asm__ __volatile__ ("sfence":::"memory")
+
+/* additions to detect mmx - */
+/* Raster <raster@rasterman.com> */
+
+#define CPUID_MMX  (1 << 23) /* flags: mmx */
+#define CPUID_SSE  (1 << 25) /* flags: xmm */
+#define CPUID_SSE2 (1 << 26) /* flags: ? */
+
+/*
+#ifdef __amd64
+#define have_cpuid(cpuid_ret) \
+         __asm__ __volatile__ ( \
+                                  ".align 32               \n" \
+                                  "  pushq %%rbx           \n" \
+                                  "  pushfq                \n" \
+                                  "  popq %%rax            \n" \
+                                  "  movq %%rax, %%rbx     \n" \
+                                  "  xorq $0x200000, %%rax \n" \
+                                  "  pushq %%rax           \n" \
+                                  "  popfq                 \n" \
+                                  "  pushfq                \n" \
+                                  "  popq %%rax            \n" \
+                                  "  cmpq %%rax, %%rbx     \n" \
+                                  "  je 1f                 \n" \
+                                  "  movl $1, %0           \n" \
+                                  "  jmp 2f                \n" \
+                                  "1:                      \n" \
+                                  "  movl $0, %0           \n" \
+                                  "2:                      \n" \
+                                  "  popq %%rbx            \n" \
+                                  : "=m" (cpuid_ret)           \
+                                  );
+
+#define get_cpuid(cpuid_ret) \
+         __asm__ __volatile__ ( \
+                                  ".align 32               \n" \
+                                  "  pushq %%rax           \n" \
+                                  "  movl $1, %%eax        \n" \
+                                  "  cpuid                 \n" \
+                                  "  test $0x00800000, %%edx\n" \
+                                  "1:                      \n" \
+                                  "  movl %%edx, %0        \n" \
+                                  "  jmp 2f                \n" \
+                                  "2:                      \n" \
+                                  "  movl $0, %0           \n" \
+                                  "  popq %%rax            \n" \
+                                  : "=m" (cpuid_ret)           \
+                                  );
+#else
+#define have_cpuid(cpuid_ret) \
+        __asm__ __volatile__ ( \
+                                 ".align 32               \n" \
+                                 "  pushl %%ebx           \n" \
+                                 "  pushfl                \n" \
+                                 "  popl %%eax            \n" \
+                                 "  movl %%eax, %%ebx     \n" \
+                                 "  xorl $0x200000, %%eax \n" \
+                                 "  pushl %%eax           \n" \
+                                 "  popfl                 \n" \
+                                 "  pushfl                \n" \
+                                 "  popl %%eax            \n" \
+                                 "  cmpl %%eax, %%ebx     \n" \
+                                 "  je 1f                 \n" \
+                                 "  movl $1, %0           \n" \
+                                 "  jmp 2f                \n" \
+                                 "1:                      \n" \
+                                 "  movl $0, %0           \n" \
+                                 "2:                      \n" \
+                                 "  popl %%ebx            \n" \
+                                 : "=m" (cpuid_ret)           \
+                                 );
+
+#define get_cpuid(cpuid_ret) \
+        __asm__ __volatile__ ( \
+                                 ".align 32               \n" \
+                                 "  pushl %%eax           \n" \
+                                 "  movl $1, %%eax        \n" \
+                                 "  cpuid                 \n" \
+                                 "  test $0x00800000, %%edx\n" \
+                                 "1:                      \n" \
+                                 "  movl %%edx, %0        \n" \
+                                 "  jmp 2f                \n" \
+                                 "2:                      \n" \
+                                 "  movl $0, %0           \n" \
+                                 "  popl %%eax            \n" \
+                                 : "=m" (cpuid_ret)           \
+                                 );
+#endif
+ */
+
+#define prefetch(var) \
+       __asm__ __volatile__ ( \
+                                "prefetchnta (%0) \n" \
+                                : \
+                                : "r" (var) \
+                                );
+#define prefetch0(var) \
+       __asm__ __volatile__ ( \
+                                "prefetcht0 (%0) \n" \
+                                : \
+                                : "r" (var) \
+                                );
+#define prefetch1(var) \
+       __asm__ __volatile__ ( \
+                                "prefetcht1 (%0) \n" \
+                                : \
+                                : "r" (var) \
+                                );
+#define prefetch2(var) \
+       __asm__ __volatile__ ( \
+                                "prefetcht2 (%0) \n" \
+                                : \
+                                : "r" (var) \
+                                );
+#define pshufw(r1, r2, imm) \
+       __asm__ __volatile__ ( \
+                                "pshufw $" #imm ", %" #r1 ", %" #r2 " \n" \
+                                );
+
+#define pshufhw(r1, r2, imm) \
+       __asm__ __volatile__ ( \
+                                "pshufhw $" #imm ", %" #r1 ", %" #r2 " \n" \
+                                );
+
+#define pshuflw(r1, r2, imm) \
+       __asm__ __volatile__ ( \
+                                "pshuflw $" #imm ", %" #r1 ", %" #r2 " \n" \
+                                );
+#define pshufd(r1, r2, imm) \
+       __asm__ __volatile__ ( \
+                                "pshufd $" #imm ", %" #r1 ", %" #r2 " \n" \
+                                );
+
+/*     1x238 MOVE Doouble Quadword
+       (this is both a load and a store...
+        in fact, it is the only way to store)
+*/
+#define        movdqu_m2r(var, reg)    mmx_m2r(movdqu, var, reg)
+#define        movdqu_r2m(reg, var)    mmx_r2m(movdqu, reg, var)
+#define        movdqu_r2r(regs, regd)  mmx_r2r(movdqu, regs, regd)
+#define        movdqu(vars, vard) \
+       __asm__ __volatile__ ("movdqu %1, %%xmm0\n\t" \
+                             "movdqu %%xmm0, %0" \
+                             : "=X" (vard) \
+                             : "X" (vars))
+#define        movdqa_m2r(var, reg)    mmx_m2r(movdqa, var, reg)
+#define        movdqa_r2m(reg, var)    mmx_r2m(movdqa, reg, var)
+#define        movdqa_r2r(regs, regd)  mmx_r2r(movdqa, regs, regd)
+#define        movdqa(vars, vard) \
+       __asm__ __volatile__ ("movdqa %1, %%xmm0\n\t" \
+                             "movdqa %%xmm0, %0" \
+                             : "=X" (vard) \
+                             : "X" (vars))
+#define        movntdq_r2m(reg, var)   mmx_r2m(movntdq, reg, var)
+
+
+/* end additions */
+
+#endif
diff --git a/src/lib/include/evas_options.h b/src/lib/include/evas_options.h
new file mode 100644 (file)
index 0000000..4de3833
--- /dev/null
@@ -0,0 +1,70 @@
+#ifndef EVAS_OPTIONS_H
+#define EVAS_OPTIONS_H 1
+
+/* these may vary per OS */
+
+/* what to build *//* small dither table is MUCH faster on ipaq */
+/*#define BUILD_SMALL_DITHER_MASK*/
+
+/*#define HARD_CODED_P3*/
+/*#define HARD_CODED_P2*/
+
+/*#define BUILD_CONVERT_1_GRY_1*/
+/*#define BUILD_CONVERT_4_GRY_1*/
+/*#define BUILD_CONVERT_4_GRY_4*/
+/*#define BUILD_CONVERT_8_GRY_1*/
+/*#define BUILD_CONVERT_8_GRY_4*/
+/*#define BUILD_CONVERT_8_GRY_16*/
+/*#define BUILD_CONVERT_8_GRY_64*/
+/*#define BUILD_CONVERT_8_GRY_256*/
+/*#define BUILD_CONVERT_8_RGB_332*/
+/*#define BUILD_CONVERT_8_RGB_666*/
+/*#define BUILD_CONVERT_8_RGB_232*/
+/*#define BUILD_CONVERT_8_RGB_222*/
+/*#define BUILD_CONVERT_8_RGB_221*/
+/*#define BUILD_CONVERT_8_RGB_121*/
+/*#define BUILD_CONVERT_8_RGB_111*/
+/*#define BUILD_CONVERT_16_RGB_565*/
+/*#define BUILD_CONVERT_16_RGB_555*/
+/*#define BUILD_CONVERT_16_RGB_444*/
+/*#define BUILD_CONVERT_16_RGB_454645*/
+/*#define BUILD_CONVERT_16_RGB_ROT0*/
+/*#define BUILD_CONVERT_16_RGB_ROT270*/
+/*#define BUILD_CONVERT_24_RGB_888*/
+/*#define BUILD_CONVERT_24_BGR_888*/
+/*#define BUILD_CONVERT_32_RGB_8888*/
+/*#define BUILD_CONVERT_32_BGR_8888*/
+/*#define BUILD_CONVERT_32_RGB_ROT0*/
+/*#define BUILD_CONVERT_32_RGB_ROT270*/
+
+/*#define BUILD_SCALE_SAMPLE*/
+/*#define BUILD_SCALE_SMOOTH*/
+/*#define BUILD_SCALE_TRILINEAR*/
+
+/*#define BUILD_MMX*/
+/*#define BUILD_SSE*/
+/*#define BUILD_C*/
+
+/*#define BUILD_LOADER_PNG*/
+/*#define BUILD_LOADER_JPEG*/
+/*#define BUILD_LOADER_EET*/
+/*#define BUILD_LOADER_EDB*/
+
+/*#define BUILD_FMEMOPEN*/
+
+/* check in that the user configured it right */
+#ifndef BUILD_MMX
+# ifndef BUILD_SSE
+#  ifndef BUILD_C
+#   error "Please Read the README"
+#  endif
+# endif
+#endif
+
+#ifdef BUILD_FMEMOPEN
+# define _GNU_SOURCE
+#endif
+
+#define DIRECT_SCALE
+
+#endif
diff --git a/src/lib/include/evas_private.h b/src/lib/include/evas_private.h
new file mode 100644 (file)
index 0000000..2c01857
--- /dev/null
@@ -0,0 +1,891 @@
+#ifndef EVAS_PRIVATE_H
+#define EVAS_PRIVATE_H
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <Eina.h>
+#include <eina_safety_checks.h>
+#include "Evas.h"
+
+#include "../file/evas_module.h"
+#include "../file/evas_path.h"
+
+#ifdef EVAS_MAGIC_DEBUG
+/* complain when peole pass in wrong object types etc. */
+# define MAGIC_DEBUG
+#endif
+
+#define RENDER_METHOD_INVALID            0x00000000
+
+typedef struct _Evas_Layer                  Evas_Layer;
+typedef struct _Evas_Size                   Evas_Size;
+typedef struct _Evas_Aspect                 Evas_Aspect;
+typedef struct _Evas_Border                 Evas_Border;
+typedef struct _Evas_Double_Pair            Evas_Double_Pair;
+typedef struct _Evas_Size_Hints             Evas_Size_Hints;
+typedef struct _Evas_Font_Dir               Evas_Font_Dir;
+typedef struct _Evas_Font                   Evas_Font;
+typedef struct _Evas_Font_Alias             Evas_Font_Alias;
+typedef struct _Evas_Data_Node              Evas_Data_Node;
+typedef struct _Evas_Func_Node              Evas_Func_Node;
+typedef RGBA_Image_Loadopts                 Evas_Image_Load_Opts;
+typedef struct _Evas_Func                   Evas_Func;
+typedef struct _Evas_Image_Load_Func        Evas_Image_Load_Func;
+typedef struct _Evas_Image_Save_Func        Evas_Image_Save_Func;
+typedef struct _Evas_Object_Func            Evas_Object_Func;
+typedef struct _Evas_Intercept_Func         Evas_Intercept_Func;
+typedef struct _Evas_Intercept_Func_Basic   Evas_Intercept_Func_Basic;
+typedef struct _Evas_Intercept_Func_SizePos Evas_Intercept_Func_SizePos;
+typedef struct _Evas_Intercept_Func_Obj     Evas_Intercept_Func_Obj;
+typedef struct _Evas_Intercept_Func_Int     Evas_Intercept_Func_Int;
+typedef struct _Evas_Intercept_Func_Color   Evas_Intercept_Func_Color;
+typedef struct _Evas_Key_Grab               Evas_Key_Grab;
+typedef struct _Evas_Callbacks              Evas_Callbacks;
+typedef struct _Evas_Format                 Evas_Format;
+typedef struct _Evas_Map_Point              Evas_Map_Point;
+typedef struct _Evas_Smart_Cb_Description_Array Evas_Smart_Cb_Description_Array;
+typedef struct _Evas_Post_Callback          Evas_Post_Callback;
+
+#define MAGIC_EVAS                 0x70777770
+#define MAGIC_OBJ                  0x71777770
+#define MAGIC_OBJ_RECTANGLE        0x71777771
+#define MAGIC_OBJ_LINE             0x71777772
+#define MAGIC_OBJ_GRADIENT         0x71777773
+#define MAGIC_OBJ_POLYGON          0x71777774
+#define MAGIC_OBJ_IMAGE            0x71777775
+#define MAGIC_OBJ_TEXT             0x71777776
+#define MAGIC_OBJ_SMART            0x71777777
+#define MAGIC_OBJ_TEXTBLOCK        0x71777778
+#define MAGIC_SMART                0x72777770
+#define MAGIC_OBJ_GRADIENT_LINEAR  0x72777771
+#define MAGIC_OBJ_GRADIENT_RADIAL  0x72777772
+#define MAGIC_OBJ_SHAPE            0x72777773
+#define MAGIC_OBJ_CONTAINER        0x72777774
+#define MAGIC_OBJ_CUSTOM           0x72777775
+
+#ifdef MAGIC_DEBUG
+# define MAGIC_CHECK_FAILED(o, t, m) \
+{evas_debug_error(); \
+ if (!o) evas_debug_input_null(); \
+ else if (((t *)o)->magic == 0) evas_debug_magic_null(); \
+ else evas_debug_magic_wrong((m), ((t *)o)->magic); \
+}
+# define MAGIC_CHECK(o, t, m) \
+{if ((!o) || (!(((t *)o)->magic == (m)))) { \
+MAGIC_CHECK_FAILED(o, t, m)
+# define MAGIC_CHECK_END() }}
+#else
+# define MAGIC_CHECK_FAILED(o, t, m)
+# define MAGIC_CHECK(o, t, m)  { if (!o) {
+# define MAGIC_CHECK_END() }}
+#endif
+
+#define NEW_RECT(_r, _x, _y, _w, _h) (_r) = eina_rectangle_new(_x, _y, _w, _h);
+
+#define MERR_NONE() _evas_alloc_error = EVAS_ALLOC_ERROR_NONE
+#define MERR_FATAL() _evas_alloc_error = EVAS_ALLOC_ERROR_FATAL
+#define MERR_BAD() _evas_alloc_error = EVAS_ALLOC_ERROR_RECOVERED
+
+#define EVAS_OBJECT_IMAGE_FREE_FILE_AND_KEY(o)                              \
+   if ((o)->cur.file)                                                       \
+     {                                                                      \
+         eina_stringshare_del((o)->cur.file);                               \
+        if ((o)->prev.file == (o)->cur.file)                               \
+              (o)->prev.file = NULL;                                       \
+        (o)->cur.file = NULL;                                              \
+     }                                                                      \
+   if ((o)->cur.key)                                                        \
+     {                                                                      \
+         eina_stringshare_del((o)->cur.key);                                \
+        if ((o)->prev.key == (o)->cur.key)                                 \
+              (o)->prev.key = NULL;                                        \
+        (o)->cur.key = NULL;                                               \
+     }                                                                      \
+   if ((o)->prev.file)                                                      \
+     {                                                                      \
+         eina_stringshare_del((o)->prev.file);                              \
+        (o)->prev.file = NULL;                                             \
+     }                                                                      \
+   if ((o)->prev.key)                                                       \
+     {                                                                      \
+         eina_stringshare_del((o)->prev.key);                               \
+        (o)->prev.key = NULL;                                              \
+     }
+
+struct _Evas_Intercept_Func_Basic
+{
+   void (*func) (void *data, Evas_Object *obj);
+   void *data;
+};
+
+struct _Evas_Intercept_Func_SizePos
+{
+   void (*func) (void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y);
+   void *data;
+};
+
+struct _Evas_Intercept_Func_Obj
+{
+   void (*func) (void *data, Evas_Object *obj, Evas_Object *obj2);
+   void *data;
+};
+
+struct _Evas_Intercept_Func_Int
+{
+   void (*func) (void *data, Evas_Object *obj, int n);
+   void *data;
+};
+
+struct _Evas_Intercept_Func_Color
+{
+   void (*func) (void *data, Evas_Object *obj, int r, int g, int b, int a);
+   void *data;
+};
+
+struct _Evas_Key_Grab
+{
+   char               *keyname;
+   Evas_Modifier_Mask  modifiers;
+   Evas_Modifier_Mask  not_modifiers;
+   Evas_Object        *object;
+   unsigned char       exclusive : 1;
+   unsigned char       just_added : 1;
+   unsigned char       delete_me : 1;
+};
+
+struct _Evas_Intercept_Func
+{
+   Evas_Intercept_Func_Basic   show;
+   Evas_Intercept_Func_Basic   hide;
+   Evas_Intercept_Func_SizePos move;
+   Evas_Intercept_Func_SizePos resize;
+   Evas_Intercept_Func_Basic   raise;
+   Evas_Intercept_Func_Basic   lower;
+   Evas_Intercept_Func_Obj     stack_above;
+   Evas_Intercept_Func_Obj     stack_below;
+   Evas_Intercept_Func_Int     layer_set;
+   Evas_Intercept_Func_Color   color_set;
+   Evas_Intercept_Func_Obj     clip_set;
+   Evas_Intercept_Func_Basic   clip_unset;
+};
+
+struct _Evas_Smart_Cb_Description_Array
+{
+   unsigned int                      size;
+   const Evas_Smart_Cb_Description **array;
+};
+
+struct _Evas_Smart
+{
+   DATA32            magic;
+
+   int               usage;
+
+   const Evas_Smart_Class *smart_class;
+
+   Evas_Smart_Cb_Description_Array callbacks;
+
+   unsigned char     delete_me : 1;
+   unsigned char     class_allocated : 1;
+
+};
+
+struct _Evas_Modifier
+{
+   struct {
+      int       count;
+      char    **list;
+   } mod;
+   Evas_Modifier_Mask mask; /* ok we have a max of 64 modifiers */
+};
+
+struct _Evas_Lock
+{
+   struct {
+      int       count;
+      char    **list;
+   } lock;
+   Evas_Modifier_Mask mask; /* we have a max of 64 locks */
+};
+
+struct _Evas_Post_Callback
+{
+   Evas_Object               *obj;
+   Evas_Object_Event_Post_Cb  func;
+   const void                *data;
+   unsigned char              delete_me : 1;
+};
+
+struct _Evas_Callbacks
+{
+   Eina_Inlist *callbacks;
+   int               walking_list;
+   unsigned char     deletions_waiting : 1;
+/*
+   Eina_Inlist *down;
+   Eina_Inlist *up;
+   Eina_Inlist *move;
+   Eina_Inlist *in;
+   Eina_Inlist *out;
+   Eina_Inlist *wheel;
+   Eina_Inlist *key_down;
+   Eina_Inlist *key_up;
+   Eina_Inlist *free;
+   Eina_Inlist *obj_focus_in;
+   Eina_Inlist *obj_focus_out;
+   Eina_Inlist *obj_show;
+   Eina_Inlist *obj_hide;
+   Eina_Inlist *obj_move;
+   Eina_Inlist *obj_resize;
+   Eina_Inlist *obj_restack;
+ */
+};
+
+struct _Evas
+{
+   EINA_INLIST;
+
+   DATA32            magic;
+
+   struct {
+      unsigned char  inside : 1;
+      int            mouse_grabbed;
+      DATA32         button;
+      Evas_Coord     x, y;
+
+////      Evas_Coord         canvas_x, canvas_y;
+
+      struct {
+        Eina_List *in;
+      } object;
+
+   } pointer;
+
+   struct  {
+      Evas_Coord     x, y, w, h;
+      unsigned char  changed : 1;
+   } viewport;
+
+   struct {
+      int            w, h;
+      DATA32         render_method;
+      unsigned char  changed : 1;
+   } output;
+
+   Eina_List        *damages;
+   Eina_List        *obscures;
+
+   Evas_Layer       *layers;
+
+   Eina_Hash        *name_hash;
+
+   int               output_validity;
+
+   int               walking_list;
+   int               events_frozen;
+
+   struct {
+      Evas_Module *module;
+      Evas_Func *func;
+      struct {
+        void *output;
+
+        void *context;
+      } data;
+
+      void *info;
+      int   info_magic;
+   } engine;
+
+   Eina_Array     delete_objects;
+   Eina_Array     active_objects;
+   Eina_Array     restack_objects;
+   Eina_Array     render_objects;
+   Eina_Array     pending_objects;
+   Eina_Array     obscuring_objects;
+   Eina_Array     temporary_objects;
+   Eina_Array     calculate_objects;
+   Eina_Array     clip_changes;
+
+   Eina_List     *post_events; // free me on evas_free
+   
+   Evas_Callbacks *callbacks;
+
+   int            delete_grabs;
+   int            walking_grabs;
+   Eina_List     *grabs;
+
+   Eina_List     *font_path;
+
+   Evas_Object   *focused;
+   void          *attach_data;
+   Evas_Modifier  modifiers;
+   Evas_Lock      locks;
+   unsigned int   last_timestamp;
+   int            last_mouse_down_counter;
+   int            last_mouse_up_counter;
+   Evas_Font_Hinting_Flags hinting;
+   unsigned char  changed : 1;
+   unsigned char  delete_me : 1;
+   unsigned char  invalidate : 1;
+   unsigned char  cleanup : 1;
+   unsigned char  focus : 1;
+};
+
+struct _Evas_Layer
+{
+   EINA_INLIST;
+
+   short             layer;
+   Evas_Object      *objects;
+
+   Evas             *evas;
+
+   void             *engine_data;
+   int               usage;
+   unsigned char     delete_me : 1;
+};
+
+struct _Evas_Size
+{
+   Evas_Coord w, h;
+};
+
+struct _Evas_Aspect
+{
+   Evas_Aspect_Control mode;
+   Evas_Size size;
+};
+
+struct _Evas_Border
+{
+   Evas_Coord l, r, t, b;
+};
+
+struct _Evas_Double_Pair
+{
+   double x, y;
+};
+
+struct _Evas_Size_Hints
+{
+   Evas_Size min, max, request;
+   Evas_Aspect aspect;
+   Evas_Double_Pair align, weight;
+   Evas_Border padding;
+};
+
+struct _Evas_Map_Point
+{
+   Evas_Coord x, y, z;
+   double u, v;
+   unsigned char r, g, b, a;
+};
+
+struct _Evas_Map
+{
+   int count; // num of points
+   Evas_Coord_Rectangle normal_geometry; // bounding box of map geom actually
+   void *surface; // surface holding map if needed
+   int surface_w, surface_h; // current surface w & h alloc
+   Evas_Coord mx, my; // mouse x, y after conversion to map space
+   Eina_Bool alpha : 1;
+   Eina_Bool smooth : 1;
+   Evas_Map_Point points[]; // actual points
+};
+
+struct _Evas_Object
+{
+   EINA_INLIST;
+
+   DATA32            magic;
+
+   const char       *type;
+   Evas_Layer       *layer;
+
+   struct {
+      struct {
+/*
+        struct {
+           int            x, y, w, h;
+           int            validity;
+        } geometry;
+ */
+        struct {
+           int            x, y, w, h;
+           unsigned char  r, g, b, a;
+           Eina_Bool      visible : 1;
+           Eina_Bool      dirty : 1;
+        } clip;
+      } cache;
+      double scale;
+      Evas_Map *map;
+      Evas_Coord_Rectangle geometry;
+      struct {
+        unsigned char  r, g, b, a;
+      } color;
+      Evas_Object      *clipper;
+      short             layer;
+      Eina_Bool         usemap : 1;
+      Eina_Bool         visible : 1;
+      Eina_Bool         have_clipees : 1;
+      Eina_Bool         anti_alias : 1;
+      unsigned char     interpolation_color_space : 1;
+      Evas_Render_Op    render_op : 4;
+   } cur, prev;
+
+   char                       *name;
+
+   Evas_Intercept_Func *interceptors;
+
+   struct {
+      Eina_List *elements;
+   } data;
+
+   Eina_List *grabs;
+
+   Evas_Callbacks *callbacks;
+
+   struct {
+      Eina_List   *clipees;
+      Eina_List   *changes;
+   } clip;
+
+   const Evas_Object_Func *func;
+
+   void             *object_data;
+
+   struct {
+      Evas_Smart       *smart;
+      Evas_Object      *parent;
+   } smart;
+
+   Evas_Size_Hints            *size_hints;
+
+   int                         last_mouse_down_counter;
+   int                         last_mouse_up_counter;
+   int                         mouse_grabbed;
+
+   int                         last_event;
+
+   Evas_Object_Pointer_Mode    pointer_mode : 1;
+
+   Eina_Bool                   store : 1;
+   Eina_Bool                   pass_events : 1;
+   Eina_Bool                   parent_pass_events : 1;
+   Eina_Bool                   parent_cache_valid : 1;
+   Eina_Bool                   repeat_events : 1;
+   Eina_Bool                   restack : 1;
+   Eina_Bool                   changed : 1;
+   Eina_Bool                   is_active : 1;
+   
+   Eina_Bool                   render_pre : 1;
+   Eina_Bool                   rect_del : 1;
+   Eina_Bool                   mouse_in : 1;
+   Eina_Bool                   pre_render_done : 1;
+   Eina_Bool                   intercepted : 1;
+   Eina_Bool                   focused : 1;
+   Eina_Bool                   in_layer : 1;
+   Eina_Bool                   no_propagate : 1;
+   
+   Eina_Bool                   precise_is_inside : 1;
+   Eina_Bool                   havemap_parent : 1;
+
+   unsigned char               delete_me;
+};
+
+struct _Evas_Func_Node
+{
+   EINA_INLIST;
+   void (*func) ();
+   void *data;
+   Evas_Callback_Type type;
+   unsigned char delete_me : 1;
+};
+
+struct _Evas_Data_Node
+{
+   char *key;
+   void *data;
+};
+
+struct _Evas_Font_Dir
+{
+   Eina_Hash *lookup;
+   Eina_List *fonts;
+   Eina_List *aliases;
+   DATA64     dir_mod_time;
+   DATA64     fonts_dir_mod_time;
+   DATA64     fonts_alias_mod_time;
+};
+
+struct _Evas_Font
+{
+   struct {
+      const char *prop[14];
+   } x;
+   struct {
+      const char *name;
+   } simple;
+   const char *path;
+   char     type;
+};
+
+struct _Evas_Font_Alias
+{
+   const char *alias;
+   Evas_Font  *fn;
+};
+
+struct _Evas_Object_Func
+{
+   void (*free) (Evas_Object *obj);
+   void (*render) (Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
+   void (*render_pre) (Evas_Object *obj);
+   void (*render_post) (Evas_Object *obj);
+
+   unsigned int  (*type_id_get) (Evas_Object *obj);
+   unsigned int  (*visual_id_get) (Evas_Object *obj);
+   void *(*engine_data_get) (Evas_Object *obj);
+
+   void (*store) (Evas_Object *obj);
+   void (*unstore) (Evas_Object *obj);
+
+   int  (*is_visible) (Evas_Object *obj);
+   int  (*was_visible) (Evas_Object *obj);
+
+   int  (*is_opaque) (Evas_Object *obj);
+   int  (*was_opaque) (Evas_Object *obj);
+
+   int  (*is_inside) (Evas_Object *obj, Evas_Coord x, Evas_Coord y);
+   int  (*was_inside) (Evas_Object *obj, Evas_Coord x, Evas_Coord y);
+
+   void (*coords_recalc) (Evas_Object *obj);
+   
+   void (*scale_update) (Evas_Object *obj);
+
+   int (*has_opaque_rect) (Evas_Object *obj);
+   int (*get_opaque_rect) (Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
+
+   int (*can_map) (Evas_Object *obj);
+};
+
+struct _Evas_Func
+{
+   void *(*info)                           (Evas *e);
+   void (*info_free)                       (Evas *e, void *info);
+   int  (*setup)                           (Evas *e, void *info);
+
+   void (*output_free)                     (void *data);
+   void (*output_resize)                   (void *data, int w, int h);
+   void (*output_tile_size_set)            (void *data, int w, int h);
+   void (*output_redraws_rect_add)         (void *data, int x, int y, int w, int h);
+   void (*output_redraws_rect_del)         (void *data, int x, int y, int w, int h);
+   void (*output_redraws_clear)            (void *data);
+   void *(*output_redraws_next_update_get) (void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
+   void (*output_redraws_next_update_push) (void *data, void *surface, int x, int y, int w, int h);
+   void (*output_flush)                    (void *data);
+   void (*output_idle_flush)               (void *data);
+   void (*output_dump)                     (void *data);
+
+   void *(*context_new)                    (void *data);
+   Eina_Bool (*canvas_alpha_get)           (void *data, void *context);
+   void (*context_free)                    (void *data, void *context);
+   void (*context_clip_set)                (void *data, void *context, int x, int y, int w, int h);
+   void (*context_clip_clip)               (void *data, void *context, int x, int y, int w, int h);
+   void (*context_clip_unset)              (void *data, void *context);
+   int  (*context_clip_get)                (void *data, void *context, int *x, int *y, int *w, int *h);
+   void (*context_color_set)               (void *data, void *context, int r, int g, int b, int a);
+   int  (*context_color_get)               (void *data, void *context, int *r, int *g, int *b, int *a);
+   void (*context_multiplier_set)          (void *data, void *context, int r, int g, int b, int a);
+   void (*context_multiplier_unset)        (void *data, void *context);
+   int  (*context_multiplier_get)          (void *data, void *context, int *r, int *g, int *b, int *a);
+   void (*context_cutout_add)              (void *data, void *context, int x, int y, int w, int h);
+   void (*context_cutout_clear)            (void *data, void *context);
+   void (*context_anti_alias_set)          (void *data, void *context, unsigned char aa);
+   unsigned char (*context_anti_alias_get) (void *data, void *context);
+   void (*context_color_interpolation_set) (void *data, void *context, int color_space);
+   int  (*context_color_interpolation_get) (void *data, void *context);
+   void (*context_render_op_set)           (void *data, void *context, int render_op);
+   int  (*context_render_op_get)           (void *data, void *context);
+
+   void (*rectangle_draw)                  (void *data, void *context, void *surface, int x, int y, int w, int h);
+
+   void (*line_draw)                       (void *data, void *context, void *surface, int x1, int y1, int x2, int y2);
+
+   void *(*polygon_point_add)              (void *data, void *context, void *polygon, int x, int y);
+   void *(*polygon_points_clear)           (void *data, void *context, void *polygon);
+   void (*polygon_draw)                    (void *data, void *context, void *surface, void *polygon, int x, int y);
+
+   void (*gradient2_color_np_stop_insert)   (void *data, void *gradient, int r, int g, int b, int a, float pos);
+   void (*gradient2_clear)                  (void *data, void *gradient);
+   void (*gradient2_fill_transform_set)     (void *data, void *gradient, void *transform);
+   void (*gradient2_fill_spread_set)        (void *data, void *gradient, int spread);
+
+   void *(*gradient2_linear_new)                   (void *data);
+   void (*gradient2_linear_free)                   (void *data, void *linear_gradient);
+   void (*gradient2_linear_fill_set)               (void *data, void *linear_gradient, float x0, float y0, float x1, float y1);
+   int  (*gradient2_linear_is_opaque)              (void *data, void *context, void *linear_gradient, int x, int y, int w, int h);
+   int  (*gradient2_linear_is_visible)             (void *data, void *context, void *linear_gradient, int x, int y, int w, int h);
+   void (*gradient2_linear_render_pre)             (void *data, void *context, void *linear_gradient);
+   void (*gradient2_linear_render_post)            (void *data, void *linear_gradient);
+   void (*gradient2_linear_draw)                   (void *data, void *context, void *surface, void *linear_gradient, int x, int y, int w, int h);
+
+   void *(*gradient2_radial_new)                   (void *data);
+   void (*gradient2_radial_free)                   (void *data, void *radial_gradient);
+   void (*gradient2_radial_fill_set)               (void *data, void *radial_gradient, float cx, float cy, float rx, float ry);
+   int  (*gradient2_radial_is_opaque)              (void *data, void *context, void *radial_gradient, int x, int y, int w, int h);
+   int  (*gradient2_radial_is_visible)             (void *data, void *context, void *radial_gradient, int x, int y, int w, int h);
+   void (*gradient2_radial_render_pre)             (void *data, void *context, void *radial_gradient);
+   void (*gradient2_radial_render_post)            (void *data, void *radial_gradient);
+   void (*gradient2_radial_draw)                   (void *data, void *context, void *surface, void *radial_gradient, int x, int y, int w, int h);
+
+   void *(*gradient_new)                   (void *data);
+   void (*gradient_free)                   (void *data, void *gradient);
+   void (*gradient_color_stop_add)         (void *data, void *gradient, int r, int g, int b, int a, int delta);
+   void (*gradient_alpha_stop_add)         (void *data, void *gradient, int a, int delta);
+   void (*gradient_color_data_set)         (void *data, void *gradient, void *map, int len, int alpha_flag);
+   void (*gradient_alpha_data_set)         (void *data, void *gradient, void *alpha_map, int len);
+   void (*gradient_clear)                  (void *data, void *gradient);
+   void (*gradient_fill_set)               (void *data, void *gradient, int x, int y, int w, int h);
+   void (*gradient_fill_angle_set)         (void *data, void *gradient, double fill_angle);
+   void (*gradient_fill_spread_set)        (void *data, void *gradient, int spread);
+   void (*gradient_angle_set)              (void *data, void *gradient, double angle);
+   void (*gradient_offset_set)             (void *data, void *gradient, float offset);
+   void (*gradient_direction_set)          (void *data, void *gradient, int direction);
+   void (*gradient_type_set)               (void *data, void *gradient, char *name, char *params);
+   int  (*gradient_is_opaque)              (void *data, void *context, void *gradient, int x, int y, int w, int h);
+   int  (*gradient_is_visible)             (void *data, void *context, void *gradient, int x, int y, int w, int h);
+   void (*gradient_render_pre)             (void *data, void *context, void *gradient);
+   void (*gradient_render_post)            (void *data, void *gradient);
+   void (*gradient_draw)                   (void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h);
+
+   void *(*image_load)                     (void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo);
+   void *(*image_new_from_data)            (void *data, int w, int h, DATA32 *image_data, int alpha, int cspace);
+   void *(*image_new_from_copied_data)     (void *data, int w, int h, DATA32 *image_data, int alpha, int cspace);
+   void (*image_free)                      (void *data, void *image);
+   void (*image_size_get)                  (void *data, void *image, int *w, int *h);
+   void *(*image_size_set)                 (void *data, void *image, int w, int h);
+   void (*image_stride_get)                (void *data, void *image, int *stride);
+   void *(*image_dirty_region)             (void *data, void *image, int x, int y, int w, int h);
+   void *(*image_data_get)                 (void *data, void *image, int to_write, DATA32 **image_data);
+   void *(*image_data_put)                 (void *data, void *image, DATA32 *image_data);
+   void  (*image_data_preload_request)     (void *data, void *image, const void *target);
+   void  (*image_data_preload_cancel)      (void *data, void *image, const void *target);
+   void *(*image_alpha_set)                (void *data, void *image, int has_alpha);
+   int  (*image_alpha_get)                 (void *data, void *image);
+   void *(*image_border_set)               (void *data, void *image, int l, int r, int t, int b);
+   void  (*image_border_get)               (void *data, void *image, int *l, int *r, int *t, int *b);
+   void (*image_draw)                      (void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth);
+   char *(*image_comment_get)              (void *data, void *image, char *key);
+   char *(*image_format_get)               (void *data, void *image);
+   void (*image_colorspace_set)            (void *data, void *image, int cspace);
+   int  (*image_colorspace_get)            (void *data, void *image);
+   void (*image_native_set)                (void *data, void *image, void *native);
+   void *(*image_native_get)               (void *data, void *image);
+
+   void (*image_cache_flush)               (void *data);
+   void (*image_cache_set)                 (void *data, int bytes);
+   int  (*image_cache_get)                 (void *data);
+
+   void *(*font_load)                      (void *data, const char *name, int size);
+   void *(*font_memory_load)               (void *data, char *name, int size, const void *fdata, int fdata_size);
+   void *(*font_add)                       (void *data, void *font, const char *name, int size);
+   void *(*font_memory_add)                (void *data, void *font, char *name, int size, const void *fdata, int fdata_size);
+   void (*font_free)                       (void *data, void *font);
+   int  (*font_ascent_get)                 (void *data, void *font);
+   int  (*font_descent_get)                (void *data, void *font);
+   int  (*font_max_ascent_get)             (void *data, void *font);
+   int  (*font_max_descent_get)            (void *data, void *font);
+   void (*font_string_size_get)            (void *data, void *font, const char *text, int *w, int *h);
+   int  (*font_inset_get)                  (void *data, void *font, const char *text);
+   int  (*font_h_advance_get)              (void *data, void *font, const char *text);
+   int  (*font_v_advance_get)              (void *data, void *font, const char *text);
+   int  (*font_char_coords_get)            (void *data, void *font, const char *text, int pos, int *cx, int *cy, int *cw, int *ch);
+   int  (*font_char_at_coords_get)         (void *data, void *font, const char *text, int x, int y, int *cx, int *cy, int *cw, int *ch);
+   void (*font_draw)                       (void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text);
+
+   void (*font_cache_flush)                (void *data);
+   void (*font_cache_set)                  (void *data, int bytes);
+   int  (*font_cache_get)                  (void *data);
+
+   /* Engine functions will over time expand from here */
+
+   void (*font_hinting_set)                (void *data, void *font, int hinting);
+   int  (*font_hinting_can_hint)           (void *data, int hinting);
+
+/*    void (*image_rotation_set)              (void *data, void *image); */
+
+   void (*image_scale_hint_set)            (void *data, void *image, int hint);
+   int  (*image_scale_hint_get)            (void *data, void *image);
+   int  (*font_last_up_to_pos)             (void *data, void *font, const char *text, int x, int y);
+
+   void (*image_map4_draw)                 (void *data, void *context, void *surface, void *image, RGBA_Map_Point *p, int smooth, int level);
+   void *(*image_map_surface_new)          (void *data, int w, int h, int alpha);
+   void (*image_map_surface_free)          (void *data, void *surface);
+};
+
+struct _Evas_Image_Load_Func
+{
+  Eina_Bool threadable;
+  Eina_Bool (*file_head) (Image_Entry *ie, const char *file, const char *key, int *error);
+  Eina_Bool (*file_data) (Image_Entry *ie, const char *file, const char *key, int *error);
+};
+
+struct _Evas_Image_Save_Func
+{
+  int (*image_save) (RGBA_Image *im, const char *file, const char *key, int quality, int compress);
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+Evas_Object *evas_object_new(Evas *e);
+void evas_object_free(Evas_Object *obj, int clean_layer);
+void evas_object_inject(Evas_Object *obj, Evas *e);
+void evas_object_release(Evas_Object *obj, int clean_layer);
+void evas_object_change(Evas_Object *obj);
+void evas_object_clip_changes_clean(Evas_Object *obj);
+void evas_object_render_pre_visible_change(Eina_Array *rects, Evas_Object *obj, int is_v, int was_v);
+void evas_object_render_pre_clipper_change(Eina_Array *rects, Evas_Object *obj);
+void evas_object_render_pre_prev_cur_add(Eina_Array *rects, Evas_Object *obj);
+void evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *obj, int is_v, int was_v);
+void evas_rects_return_difference_rects(Eina_Array *rects, int x, int y, int w, int h, int xx, int yy, int ww, int hh);
+
+void evas_object_clip_dirty(Evas_Object *obj);
+void evas_object_recalc_clippees(Evas_Object *obj);
+Evas_Layer *evas_layer_new(Evas *e);
+void evas_layer_pre_free(Evas_Layer *lay);
+void evas_layer_free_objects(Evas_Layer *lay);
+void evas_layer_clean(Evas *e);
+Evas_Layer *evas_layer_find(Evas *e, short layer_num);
+void evas_layer_add(Evas_Layer *lay);
+void evas_layer_del(Evas_Layer *lay);
+
+int evas_object_was_in_output_rect(Evas_Object *obj, int x, int y, int w, int h);
+
+int evas_object_was_opaque(Evas_Object *obj);
+int evas_object_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
+int evas_object_was_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
+int evas_object_clippers_was_visible(Evas_Object *obj);
+void evas_event_callback_call(Evas *e, Evas_Callback_Type type, void *event_info);
+void evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void *event_info);
+Eina_List *evas_event_objects_event_list(Evas *e, Evas_Object *stop, int x, int y);
+int evas_mem_free(int mem_required);
+int evas_mem_degrade(int mem_required);
+void evas_debug_error(void);
+void evas_debug_input_null(void);
+void evas_debug_magic_null(void);
+void evas_debug_magic_wrong(DATA32 expected, DATA32 supplied);
+void evas_debug_generic(const char *str);
+const char *evas_debug_magic_string_get(DATA32 magic);
+void evas_object_smart_use(Evas_Smart *s);
+void evas_object_smart_unuse(Evas_Smart *s);
+void evas_smart_cb_descriptions_fix(Evas_Smart_Cb_Description_Array *a) EINA_ARG_NONNULL(1);
+Eina_Bool evas_smart_cb_descriptions_resize(Evas_Smart_Cb_Description_Array *a, unsigned int size) EINA_ARG_NONNULL(1);
+const Evas_Smart_Cb_Description *evas_smart_cb_description_find(const Evas_Smart_Cb_Description_Array *a, const char *name) EINA_ARG_NONNULL(1, 2) EINA_PURE;
+
+void evas_object_smart_del(Evas_Object *obj);
+void evas_object_smart_cleanup(Evas_Object *obj);
+void evas_object_smart_member_raise(Evas_Object *member);
+void evas_object_smart_member_lower(Evas_Object *member);
+void evas_object_smart_member_stack_above(Evas_Object *member, Evas_Object *other);
+void evas_object_smart_member_stack_below(Evas_Object *member, Evas_Object *other);
+const Eina_Inlist *evas_object_smart_members_get_direct(const Evas_Object *obj);
+void evas_call_smarts_calculate(Evas *e);
+void *evas_mem_calloc(int size);
+void _evas_post_event_callback_call(Evas *e);
+void _evas_post_event_callback_free(Evas *e);
+void evas_event_callback_list_post_free(Eina_Inlist **list);
+void evas_object_event_callback_all_del(Evas_Object *obj);
+void evas_object_event_callback_cleanup(Evas_Object *obj);
+void evas_event_callback_all_del(Evas *e);
+void evas_event_callback_cleanup(Evas *e);
+void evas_object_inform_call_show(Evas_Object *obj);
+void evas_object_inform_call_hide(Evas_Object *obj);
+void evas_object_inform_call_move(Evas_Object *obj);
+void evas_object_inform_call_resize(Evas_Object *obj);
+void evas_object_inform_call_restack(Evas_Object *obj);
+void evas_object_inform_call_changed_size_hints(Evas_Object *obj);
+void evas_object_inform_call_image_preloaded(Evas_Object *obj);
+void evas_object_intercept_cleanup(Evas_Object *obj);
+int evas_object_intercept_call_show(Evas_Object *obj);
+int evas_object_intercept_call_hide(Evas_Object *obj);
+int evas_object_intercept_call_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
+int evas_object_intercept_call_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h);
+int evas_object_intercept_call_raise(Evas_Object *obj);
+int evas_object_intercept_call_lower(Evas_Object *obj);
+int evas_object_intercept_call_stack_above(Evas_Object *obj, Evas_Object *above);
+int evas_object_intercept_call_stack_below(Evas_Object *obj, Evas_Object *below);
+int evas_object_intercept_call_layer_set(Evas_Object *obj, int l);
+int evas_object_intercept_call_color_set(Evas_Object *obj, int r, int g, int b, int a);
+int evas_object_intercept_call_clip_set(Evas_Object *obj, Evas_Object *clip);
+int evas_object_intercept_call_clip_unset(Evas_Object *obj);
+void evas_object_grabs_cleanup(Evas_Object *obj);
+void evas_key_grab_free(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers);
+void evas_font_dir_cache_free(void);
+const char *evas_font_dir_cache_find(char *dir, char *font);
+Eina_List *evas_font_dir_available_list(const Evas* evas);
+void evas_font_dir_available_list_free(Eina_List *available);
+void evas_font_free(Evas *evas, void *font);
+void evas_fonts_zero_free(Evas *evas);
+void evas_fonts_zero_presure(Evas *evas);
+void *evas_font_load(Evas *evas, const char *name, const char *source, int size);
+void evas_font_load_hinting_set(Evas *evas, void *font, int hinting);
+void evas_object_smart_member_cache_invalidate(Evas_Object *obj);
+void evas_text_style_pad_get(Evas_Text_Style_Type style, int *l, int *r, int *t, int *b);
+void _evas_object_text_rehint(Evas_Object *obj);
+void _evas_object_textblock_rehint(Evas_Object *obj);
+
+extern int _evas_alloc_error;
+extern int _evas_event_counter;
+
+struct _Evas_Imaging_Image
+{
+   RGBA_Image *image;
+};
+
+struct _Evas_Imaging_Font
+{
+   RGBA_Font *font;
+};
+
+int evas_async_events_init(void);
+int evas_async_events_shutdown(void);
+int evas_async_target_del(const void *target);
+
+void _evas_preload_thread_init(void);
+void _evas_preload_thread_shutdown(void);
+Evas_Preload_Pthread *evas_preload_thread_run(void (*func_heavy)(void *data),
+                                            void (*func_end)(void *data),
+                                            void (*func_cancel)(void *data),
+                                            const void *data);
+Eina_Bool evas_preload_thread_cancel(Evas_Preload_Pthread *thread);
+
+void _evas_walk(Evas *e);
+void _evas_unwalk(Evas *e);
+
+EAPI int _evas_module_engine_inherit(Evas_Func *funcs, char *name);
+
+void evas_render_invalidate(Evas *e);
+void evas_render_object_recalc(Evas_Object *obj);
+
+Eina_Bool evas_map_inside_get(const Evas_Map *m, Evas_Coord x, Evas_Coord y);
+Eina_Bool evas_map_coords_get(const Evas_Map *m, Evas_Coord x, Evas_Coord y, Evas_Coord *mx, Evas_Coord *my, int grab);
+       
+#define EVAS_API_OVERRIDE(func, api, prefix) \
+     (api)->func = prefix##func
+
+#include "evas_inline.x"
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/lib/main.c b/src/lib/main.c
new file mode 100644 (file)
index 0000000..0dfe709
--- /dev/null
@@ -0,0 +1,206 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+int _evas_alloc_error = 0;
+static int _evas_debug_init = 0;
+static int _evas_debug_show = 0;
+static int _evas_debug_abort = 0;
+
+/**
+ * Return if any allocation errors have occured during the prior function
+ * @return The allocation error flag
+ *
+ * This function will return if any memory allocation errors occured during,
+ * and what kind they were. The return value will be one of
+ * EVAS_ALLOC_ERROR_NONE, EVAS_ALLOC_ERROR_FATAL or EVAS_ALLOC_ERROR_RECOVERED
+ * with each meaning something different.
+ *
+ * EVAS_ALLOC_ERROR_NONE means that no errors occured at all and the function
+ * worked as expected.
+ *
+ * EVAS_ALLOC_ERROR_FATAL means the function was completely unable to perform
+ * its job and will  have  exited as cleanly as possible. The programmer
+ * should consider this as a sign of very low memory and should try and safely
+ * recover from the prior functions failure (or try free up memory elsewhere
+ * and try again after more memory is freed).
+ *
+ * EVAS_ALLOC_ERROR_RECOVERED means that an allocation error occured, but was
+ * recovered from by evas finding memory of its own it has allocated and
+ * freeing what it sees as not really usefully allocated memory. What is freed
+ * may vary. Evas may reduce the resolution of images, free cached images or
+ * fonts, trhow out pre-rendered data, reduce the complexity of change lists
+ * etc. Evas and the program will function as per normal after this, but this
+ * is a sign of low memory, and it is suggested that the program try and
+ * identify memory it doesn't need, and free it.
+ *
+ * Example:
+ * @code
+ * extern Evas_Object *object;
+ * void callback (void *data, Evas *e, Evas_Object *obj, void *event_info);
+ *
+ * evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_DOWN, callback, NULL);
+ * if (evas_alloc_error() == EVAS_ALLOC_ERROR_FATAL)
+ *   {
+ *     fprintf(stderr, "ERROR: Completely unable to attach callabck. Must\n");
+ *     fprintf(stderr, "       destroy object now as it cannot be used.\n");
+ *     evas_object_del(object);
+ *     object = NULL;
+ *     fprintf(stderr, "WARNING: Memory is really low. Cleaning out RAM.\n");
+ *     my_memory_cleanup();
+ *   }
+ * if (evas_alloc_error() == EVAS_ALLOC_ERROR_RECOVERED)
+ *   {
+ *     fprintf(stderr, "WARNING: Memory is really low. Cleaning out RAM.\n");
+ *     my_memory_cleanup();
+ *   }
+ * @endcode
+ *
+ * @ingroup Evas_Group
+ */
+EAPI int
+evas_alloc_error(void)
+{
+   return _evas_alloc_error;
+}
+
+/* free cached items only in ram for speed reasons. return 0 if cant free */
+int
+evas_mem_free(int mem_required __UNUSED__)
+{
+   return 0;
+}
+
+/* start reducing quality of images etc. return 0 if cant free anything */
+int
+evas_mem_degrade(int mem_required __UNUSED__)
+{
+   return 0;
+}
+
+void *
+evas_mem_calloc(int size)
+{
+   void *ptr;
+
+   ptr = calloc(1, size);
+   if (ptr) return ptr;
+   MERR_BAD();
+   while ((!ptr) && (evas_mem_free(size))) ptr = calloc(1, size);
+   if (ptr) return ptr;
+   while ((!ptr) && (evas_mem_degrade(size))) ptr = calloc(1, size);
+   if (ptr) return ptr;
+   MERR_FATAL();
+   return NULL;
+}
+
+void
+evas_debug_error(void)
+{
+   if (!_evas_debug_init)
+     {
+       if (getenv("EVAS_DEBUG_SHOW")) _evas_debug_show = 1;
+       if (getenv("EVAS_DEBUG_ABORT")) _evas_debug_abort = 1;
+       _evas_debug_init = 1;
+     }
+   if (_evas_debug_show)
+     DBG("*** EVAS ERROR: Evas Magic Check Failed!!!");
+}
+
+void
+evas_debug_input_null(void)
+{
+   if (!_evas_debug_init)
+     {
+       if (getenv("EVAS_DEBUG_SHOW")) _evas_debug_show = 1;
+       if (getenv("EVAS_DEBUG_ABORT")) _evas_debug_abort = 1;
+       _evas_debug_init = 1;
+     }
+   if (_evas_debug_show)
+     DBG("Input object pointer is NULL!");
+   if (_evas_debug_abort) abort();
+}
+
+void
+evas_debug_magic_null(void)
+{
+   if (!_evas_debug_init)
+     {
+       if (getenv("EVAS_DEBUG_SHOW")) _evas_debug_show = 1;
+       if (getenv("EVAS_DEBUG_ABORT")) _evas_debug_abort = 1;
+       _evas_debug_init = 1;
+     }
+   if (_evas_debug_show)
+     DBG("Input object is zero'ed out (maybe a freed object or zero-filled RAM)!");
+   if (_evas_debug_abort) abort();
+}
+
+void
+evas_debug_magic_wrong(DATA32 expected, DATA32 supplied)
+{
+   if (!_evas_debug_init)
+     {
+       if (getenv("EVAS_DEBUG_SHOW")) _evas_debug_show = 1;
+       if (getenv("EVAS_DEBUG_ABORT")) _evas_debug_abort = 1;
+       _evas_debug_init = 1;
+     }
+   if (_evas_debug_show)
+     DBG("  Input object is wrong type\n"
+          "    Expected: %08x - %s\n"
+          "    Supplied: %08x - %s",
+          expected, evas_debug_magic_string_get(expected),
+          supplied, evas_debug_magic_string_get(supplied));
+   if (_evas_debug_abort) abort();
+}
+
+void
+evas_debug_generic(const char *str)
+{
+   if (!_evas_debug_init)
+     {
+       if (getenv("EVAS_DEBUG_SHOW")) _evas_debug_show = 1;
+       if (getenv("EVAS_DEBUG_ABORT")) _evas_debug_abort = 1;
+       _evas_debug_init = 1;
+     }
+   if (_evas_debug_show)
+     DBG("*** EVAS ERROR:\n"
+          "%s", (char *)str);
+   if (_evas_debug_abort) abort();
+}
+
+const char *
+evas_debug_magic_string_get(DATA32 magic)
+{
+   switch (magic)
+     {
+      case MAGIC_EVAS:
+       return "Evas";
+       break;
+      case MAGIC_OBJ:
+       return "Evas_Object";
+       break;
+      case MAGIC_OBJ_RECTANGLE:
+       return "Evas_Object (Rectangle)";
+       break;
+      case MAGIC_OBJ_LINE:
+       return "Evas_Object (Line)";
+       break;
+      case MAGIC_OBJ_GRADIENT:
+       return "Evas_Object (Gradient)";
+       break;
+      case MAGIC_OBJ_POLYGON:
+       return "Evas_Object (Polygon)";
+       break;
+      case MAGIC_OBJ_IMAGE:
+       return "Evas_Object (Image)";
+       break;
+      case MAGIC_OBJ_TEXT:
+       return "Evas_Object (Text)";
+       break;
+      case MAGIC_OBJ_SMART:
+       return "Evas_Object (Smart)";
+       break;
+      default:
+       return "<UNKNOWN>";
+     };
+   return "<UNKNOWN>";
+}
diff --git a/src/modules/.cvsignore b/src/modules/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/src/modules/Makefile.am b/src/modules/Makefile.am
new file mode 100644 (file)
index 0000000..af10cbc
--- /dev/null
@@ -0,0 +1,3 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS = engines loaders savers
diff --git a/src/modules/engines/.cvsignore b/src/modules/engines/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/src/modules/engines/Makefile.am b/src/modules/engines/Makefile.am
new file mode 100644 (file)
index 0000000..1db0e21
--- /dev/null
@@ -0,0 +1,68 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS =
+
+if !EVAS_STATIC_BUILD_SOFTWARE_GENERIC
+SUBDIRS += software_generic
+endif
+if !EVAS_STATIC_BUILD_BUFFER
+SUBDIRS += buffer
+endif
+if !EVAS_STATIC_BUILD_DIRECT3D
+SUBDIRS += direct3d
+endif
+if !EVAS_STATIC_BUILD_DIRECTFB
+SUBDIRS += directfb
+endif
+if !EVAS_STATIC_BUILD_FB
+SUBDIRS += fb
+endif
+if !EVAS_STATIC_BUILD_GL_GLEW
+SUBDIRS += gl_common gl_glew
+endif
+if !EVAS_STATIC_BUILD_GL_X11
+SUBDIRS += gl_common gl_x11
+endif
+if !EVAS_STATIC_BUILD_GL_SDL
+SUBDIRS += gl_common gl_sdl
+endif
+if !EVAS_STATIC_BUILD_QUARTZ
+SUBDIRS += quartz
+endif
+if !EVAS_STATIC_BUILD_SOFTWARE_16
+SUBDIRS += software_16
+endif
+if !EVAS_STATIC_BUILD_SOFTWARE_16_DDRAW
+SUBDIRS += software_16_ddraw
+endif
+if !EVAS_STATIC_BUILD_SOFTWARE_16_WINCE
+SUBDIRS += software_16_wince
+endif
+if !EVAS_STATIC_BUILD_SOFTWARE_16_X11
+SUBDIRS += software_16_x11
+endif
+if !EVAS_STATIC_BUILD_SOFTWARE_SDL
+SUBDIRS += software_16_sdl software_sdl
+endif
+if !EVAS_STATIC_BUILD_SOFTWARE_DDRAW
+SUBDIRS += software_ddraw
+endif
+if !EVAS_STATIC_BUILD_SOFTWARE_GDI
+SUBDIRS += software_gdi
+endif
+if !EVAS_STATIC_BUILD_SOFTWARE_X11
+SUBDIRS += software_x11
+endif
+if !EVAS_STATIC_BUILD_XRENDER_X11
+SUBDIRS += xrender_x11
+endif
+
+
+#if !EVAS_STATIC_BUILD_CAIRO_X11
+#SUBDIRS +=
+#cairo_common
+#cairo_x11
+#endif
+#if !EVAS_STATIC_BUILD_SOFTWARE_QTOPIA
+#SUBDIRS += software_qtopia
+#endif
diff --git a/src/modules/engines/buffer/.cvsignore b/src/modules/engines/buffer/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/engines/buffer/Evas_Engine_Buffer.h b/src/modules/engines/buffer/Evas_Engine_Buffer.h
new file mode 100644 (file)
index 0000000..02dea14
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef _EVAS_ENGINE_BUFFER_H
+#define _EVAS_ENGINE_BUFFER_H
+
+#define EVAS_ENGINE_BUFFER_DEPTH_ARGB32 0
+#define EVAS_ENGINE_BUFFER_DEPTH_BGRA32 1
+#define EVAS_ENGINE_BUFFER_DEPTH_RGB24  2
+#define EVAS_ENGINE_BUFFER_DEPTH_BGR24  3
+#define EVAS_ENGINE_BUFFER_DEPTH_RGB32  4
+
+typedef struct _Evas_Engine_Info_Buffer Evas_Engine_Info_Buffer;
+
+struct _Evas_Engine_Info_Buffer
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   struct {
+      int   depth_type;
+
+      void *dest_buffer;
+      int   dest_buffer_row_bytes;
+
+      char  use_color_key : 1;
+      int   alpha_threshold;
+      int   color_key_r;
+      int   color_key_g;
+      int   color_key_b;
+      struct {
+        void * (*new_update_region) (int x, int y, int w, int h, int *row_bytes);
+        void   (*free_update_region) (int x, int y, int w, int h, void *data);
+      } func;
+   } info;
+};
+#endif
+
+
diff --git a/src/modules/engines/buffer/Makefile.am b/src/modules/engines/buffer/Makefile.am
new file mode 100644 (file)
index 0000000..371eabd
--- /dev/null
@@ -0,0 +1,42 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines \
+@EINA_CFLAGS@ \
+@FREETYPE_CFLAGS@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+if BUILD_ENGINE_BUFFER
+
+BUFFER_SOURCES = \
+evas_engine.c \
+evas_outbuf.c
+
+pkgdir = $(libdir)/evas/modules/engines/buffer/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_Buffer.h
+
+if !EVAS_STATIC_BUILD_BUFFER
+
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = $(BUFFER_SOURCES)
+module_la_LIBADD = $(top_builddir)/src/lib/libevas.la @EINA_LIBS@
+module_la_LDFLAGS =  -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_buffer.la
+
+libevas_engine_buffer_la_SOURCES = $(BUFFER_SOURCES)
+
+endif
+endif
+
+EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/buffer/evas_engine.c b/src/modules/engines/buffer/evas_engine.c
new file mode 100644 (file)
index 0000000..1c6abc0
--- /dev/null
@@ -0,0 +1,403 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_Buffer.h"
+
+/* domain for eina_log */
+/* the log macros are defined in evas_common.h */
+/* theirs names are EVAS_ERR, EVAS_DBG, EVAS_CRIT, EVAS_WRN and EVAS_INF */
+/* although we can use the EVAS_ERROR, etc... macros it will not work
+   when the -fvisibility=hidden option is passed to gcc */
+
+int _evas_engine_buffer_log_dom = -1;
+
+/* function tables - filled in later (func and parent func) */
+
+static Evas_Func func, pfunc;
+
+
+/* engine struct data */
+typedef struct _Render_Engine Render_Engine;
+
+struct _Render_Engine
+{
+   Tilebuf          *tb;
+   Outbuf           *ob;
+   Tilebuf_Rect     *rects;
+   Eina_Inlist *cur_rect;
+   int               end : 1;
+};
+
+/* prototypes we will use here */
+static void *_output_setup(int w, int h, void *dest_buffer, int dest_buffer_row_bytes, int depth_type, int use_color_key, int alpha_threshold, int color_key_r, int color_key_g, int color_key_b, void *(*new_update_region) (int x, int y, int w, int h, int *row_bytes), void (*free_update_region) (int x, int y, int w, int h, void *data));
+
+static void *eng_info(Evas *e);
+static void eng_info_free(Evas *e, void *info);
+static int eng_setup(Evas *e, void *info);
+static void eng_output_free(void *data);
+static void eng_output_resize(void *data, int w, int h);
+static void eng_output_tile_size_set(void *data, int w, int h);
+static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_clear(void *data);
+static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
+static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
+static void eng_output_flush(void *data);
+static void eng_output_idle_flush(void *data);
+
+/* internal engine routines */
+static void *
+_output_setup(int w,
+             int h,
+             void *dest_buffer,
+             int dest_buffer_row_bytes,
+             int depth_type,
+             int use_color_key,
+             int alpha_threshold,
+             int color_key_r,
+             int color_key_g,
+             int color_key_b,
+             void *(*new_update_region) (int x, int y, int w, int h, int *row_bytes),
+             void (*free_update_region) (int x, int y, int w, int h, void *data)
+             )
+{
+   Render_Engine *re;
+
+   re = calloc(1, sizeof(Render_Engine));
+   if (!re)
+     return NULL;
+   /* if we haven't initialized - init (automatic abort if already done) */
+   evas_common_cpu_init();
+
+   evas_common_blend_init();
+   evas_common_image_init();
+   evas_common_convert_init();
+   evas_common_scale_init();
+   evas_common_rectangle_init();
+   evas_common_gradient_init();
+   evas_common_polygon_init();
+   evas_common_line_init();
+   evas_common_font_init();
+   evas_common_draw_init();
+   evas_common_tilebuf_init();
+
+   evas_buffer_outbuf_buf_init();
+   
+     {
+       Outbuf_Depth dep;
+       DATA32 color_key = 0;
+
+       dep = OUTBUF_DEPTH_BGR_24BPP_888_888;
+       if      (depth_type == EVAS_ENGINE_BUFFER_DEPTH_ARGB32)
+         dep = OUTBUF_DEPTH_ARGB_32BPP_8888_8888;
+       else if (depth_type == EVAS_ENGINE_BUFFER_DEPTH_RGB32)
+         dep = OUTBUF_DEPTH_RGB_32BPP_888_8888;
+       else if (depth_type == EVAS_ENGINE_BUFFER_DEPTH_BGRA32)
+         dep = OUTBUF_DEPTH_BGRA_32BPP_8888_8888;
+       else if (depth_type == EVAS_ENGINE_BUFFER_DEPTH_RGB24)
+         dep = OUTBUF_DEPTH_RGB_24BPP_888_888;
+       else if (depth_type == EVAS_ENGINE_BUFFER_DEPTH_BGR24)
+         dep = OUTBUF_DEPTH_BGR_24BPP_888_888;
+       R_VAL(&color_key) = color_key_r;
+       G_VAL(&color_key) = color_key_g;
+       B_VAL(&color_key) = color_key_b;
+       A_VAL(&color_key) = 0;
+       re->ob = evas_buffer_outbuf_buf_setup_fb(w,
+                                                h,
+                                                dep,
+                                                dest_buffer,
+                                                dest_buffer_row_bytes,
+                                                use_color_key,
+                                                color_key,
+                                                alpha_threshold,
+                                                new_update_region,
+                                                free_update_region);
+     }
+   re->tb = evas_common_tilebuf_new(w, h);
+   evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+   return re;
+}
+
+/* engine api this module provides */
+static void *
+eng_info(Evas *e)
+{
+   Evas_Engine_Info_Buffer *info;
+   info = calloc(1, sizeof(Evas_Engine_Info_Buffer));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   return info;
+   e = NULL;
+}
+
+static void
+eng_info_free(Evas *e __UNUSED__, void *info)
+{
+   Evas_Engine_Info_Buffer *in;
+   in = (Evas_Engine_Info_Buffer *)info;
+   free(in);
+}
+
+static int
+eng_setup(Evas *e, void *in)
+{
+   Render_Engine *re;
+   Evas_Engine_Info_Buffer *info;
+
+   info = (Evas_Engine_Info_Buffer *)in;
+   re = _output_setup(e->output.w,
+                     e->output.h,
+                     info->info.dest_buffer,
+                     info->info.dest_buffer_row_bytes,
+                     info->info.depth_type,
+                     info->info.use_color_key,
+                     info->info.alpha_threshold,
+                     info->info.color_key_r,
+                     info->info.color_key_g,
+                     info->info.color_key_b,
+                     info->info.func.new_update_region,
+                     info->info.func.free_update_region);
+   if (e->engine.data.output)
+     eng_output_free(e->engine.data.output);
+   e->engine.data.output = re;
+   if (!e->engine.data.output) return 0;
+   if (!e->engine.data.context)
+     e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
+   return 1;
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_buffer_outbuf_buf_free(re->ob);
+   evas_common_tilebuf_free(re->tb);
+   if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+}
+
+static void
+eng_output_resize(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+     {
+       int      depth;
+       void    *dest;
+       int      dest_row_bytes;
+       int      alpha_level;
+       DATA32   color_key;
+       char     use_color_key;
+       void * (*new_update_region) (int x, int y, int w, int h, int *row_bytes);
+       void   (*free_update_region) (int x, int y, int w, int h, void *data);
+
+       depth = re->ob->depth;
+       dest = re->ob->dest;
+       dest_row_bytes = re->ob->dest_row_bytes;
+       alpha_level = re->ob->alpha_level;
+       color_key = re->ob->color_key;
+       use_color_key = re->ob->use_color_key;
+       new_update_region = re->ob->func.new_update_region;
+       free_update_region = re->ob->func.free_update_region;
+       evas_buffer_outbuf_buf_free(re->ob);
+       re->ob = evas_buffer_outbuf_buf_setup_fb(w,
+                                                h,
+                                                depth,
+                                                dest,
+                                                dest_row_bytes,
+                                                use_color_key,
+                                                color_key,
+                                                alpha_level,
+                                                new_update_region,
+                                                free_update_region);
+     }
+   evas_common_tilebuf_free(re->tb);
+   re->tb = evas_common_tilebuf_new(w, h);
+   if (re->tb)
+     evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+}
+
+static void
+eng_output_tile_size_set(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_set_tile_size(re->tb, w, h);
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_clear(re->tb);
+}
+
+static void *
+eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re;
+   RGBA_Image *surface;
+   Tilebuf_Rect *rect;
+   int ux, uy, uw, uh;
+
+   re = (Render_Engine *)data;
+   if (re->end)
+     {
+       re->end = 0;
+       return NULL;
+     }
+   if (!re->rects)
+     {
+       re->rects = evas_common_tilebuf_get_render_rects(re->tb);
+       re->cur_rect = EINA_INLIST_GET(re->rects);
+     }
+   if (!re->cur_rect) return NULL;
+   rect = (Tilebuf_Rect *)re->cur_rect;
+   ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h;
+   re->cur_rect = re->cur_rect->next;
+   if (!re->cur_rect)
+     {
+       evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       re->end = 1;
+     }
+
+   if ((ux + uw) > re->ob->w) uw = re->ob->w - ux;
+   if ((uy + uh) > re->ob->h) uh = re->ob->h - uy;
+   if ((uw <= 0) || (uh <= 0)) return NULL;
+   surface = evas_buffer_outbuf_buf_new_region_for_update(re->ob,
+                                                         ux, uy, uw, uh,
+                                                         cx, cy, cw, ch);
+   *x = ux; *y = uy; *w = uw; *h = uh;
+   return surface;
+}
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+#ifdef BUILD_PIPE_RENDER
+   evas_common_pipe_map4_begin(surface);
+#endif   
+   evas_buffer_outbuf_buf_push_updated_region(re->ob, surface, x, y, w, h);
+   evas_buffer_outbuf_buf_free_region_for_update(re->ob, surface);
+   evas_common_cpu_end_opt();
+}
+
+static void
+eng_output_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+}
+
+static void
+eng_output_idle_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data, void *context __UNUSED__)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (re->ob->priv.back_buf)
+     return re->ob->priv.back_buf->cache_entry.flags.alpha;
+   return EINA_TRUE;
+}
+
+/* module advertising code */
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
+   
+   _evas_engine_buffer_log_dom = eina_log_domain_register("EvasBufferEngine", EINA_COLOR_BLUE);
+   if(_evas_engine_buffer_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for Eina.buffer.\n");
+       return 0;
+     }
+   
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(canvas_alpha_get);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+  eina_log_domain_unregister(_evas_engine_buffer_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "buffer",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, buffer);
+
+#ifndef EVAS_STATIC_BUILD_BUFFER
+EVAS_EINA_MODULE_DEFINE(engine, buffer);
+#endif
+
diff --git a/src/modules/engines/buffer/evas_engine.h b/src/modules/engines/buffer/evas_engine.h
new file mode 100644 (file)
index 0000000..32577cf
--- /dev/null
@@ -0,0 +1,85 @@
+#ifndef EVAS_ENGINE_H
+#define EVAS_ENGINE_H
+#include "evas_common.h"
+/*  this thing is for eina_log */
+extern int _evas_engine_buffer_log_dom ;
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_buffer_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_buffer_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_buffer_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_buffer_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_buffer_log_dom, __VA_ARGS__)
+
+typedef struct _Outbuf                Outbuf;
+
+typedef enum   _Outbuf_Depth          Outbuf_Depth;
+
+enum _Outbuf_Depth
+{
+   OUTBUF_DEPTH_NONE,
+     OUTBUF_DEPTH_ARGB_32BPP_8888_8888,
+     OUTBUF_DEPTH_BGRA_32BPP_8888_8888,
+     OUTBUF_DEPTH_RGB_32BPP_888_8888,
+     OUTBUF_DEPTH_BGR_32BPP_888_8888,
+     OUTBUF_DEPTH_RGB_24BPP_888_888,
+     OUTBUF_DEPTH_BGR_24BPP_888_888,
+     OUTBUF_DEPTH_LAST
+};
+
+struct _Outbuf
+{
+   int                           w, h;
+   Outbuf_Depth                  depth;
+
+   void                         *dest;
+   int                           dest_row_bytes;
+
+   int                           alpha_level;
+   DATA32                        color_key;
+   char                          use_color_key : 1;
+
+   struct {
+      void * (*new_update_region) (int x, int y, int w, int h, int *row_bytes);
+      void   (*free_update_region) (int x, int y, int w, int h, void *data);
+   } func;
+
+   struct {
+      RGBA_Image                *back_buf;
+   } priv;
+};
+
+/****/
+
+void         evas_buffer_outbuf_buf_init                   (void);
+void         evas_buffer_outbuf_buf_free                   (Outbuf *buf);
+
+Outbuf      *evas_buffer_outbuf_buf_setup_fb               (int w, int h, Outbuf_Depth depth, void *dest, int dest_row_bytes, int use_color_key, DATA32 color_key, int alpha_level,
+                                                           void * (*new_update_region) (int x, int y, int w, int h, int *row_bytes),
+                                                           void   (*free_update_region) (int x, int y, int w, int h, void *data));
+
+
+RGBA_Image  *evas_buffer_outbuf_buf_new_region_for_update  (Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch);
+void         evas_buffer_outbuf_buf_free_region_for_update (Outbuf *buf, RGBA_Image *update);
+void         evas_buffer_outbuf_buf_push_updated_region    (Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h);
+
+#endif
+
diff --git a/src/modules/engines/buffer/evas_outbuf.c b/src/modules/engines/buffer/evas_outbuf.c
new file mode 100644 (file)
index 0000000..1b72401
--- /dev/null
@@ -0,0 +1,343 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+void
+evas_buffer_outbuf_buf_init(void)
+{
+}
+
+void
+evas_buffer_outbuf_buf_free(Outbuf *buf)
+{
+   if (buf->priv.back_buf)
+     {
+        evas_cache_image_drop(&buf->priv.back_buf->cache_entry);
+     }
+   free(buf);
+}
+
+Outbuf *
+evas_buffer_outbuf_buf_setup_fb(int w, int h, Outbuf_Depth depth, void *dest, int dest_row_bytes, int use_color_key, DATA32 color_key, int alpha_level,
+                               void * (*new_update_region) (int x, int y, int w, int h, int *row_bytes),
+                               void   (*free_update_region) (int x, int y, int w, int h, void *data)
+                               )
+{
+   Outbuf *buf;
+   int y;
+   int bpp;
+   
+   buf = calloc(1, sizeof(Outbuf));
+   if (!buf) return NULL;
+
+   buf->w = w;
+   buf->h = h;
+   buf->depth = depth;
+
+   buf->dest = dest;
+   buf->dest_row_bytes = dest_row_bytes;
+
+   buf->alpha_level = alpha_level;
+   buf->color_key = color_key;
+   buf->use_color_key = use_color_key;
+
+   buf->func.new_update_region = new_update_region;
+   buf->func.free_update_region = free_update_region;
+
+   bpp = sizeof(DATA32);
+   if ((buf->depth == OUTBUF_DEPTH_RGB_24BPP_888_888) ||
+       (buf->depth == OUTBUF_DEPTH_BGR_24BPP_888_888))
+     bpp = 3;
+
+   if ((buf->depth == OUTBUF_DEPTH_ARGB_32BPP_8888_8888) &&
+       (buf->dest) && (buf->dest_row_bytes == (buf->w * sizeof(DATA32))))
+     {
+       for (y = 0; y < h; y++)
+         memset(((unsigned char *)(buf->dest)) + (y * buf->dest_row_bytes), 
+                0, w * bpp);
+       buf->priv.back_buf = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(),
+                                                                  w, h,
+                                                                  buf->dest,
+                                                                  1, EVAS_COLORSPACE_ARGB8888);
+     }
+   else if ((buf->depth == OUTBUF_DEPTH_RGB_32BPP_888_8888) &&
+       (buf->dest) && (buf->dest_row_bytes == (buf->w * sizeof(DATA32))))
+     {
+        buf->priv.back_buf = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(),
+                                                                  w, h,
+                                                                  buf->dest,
+                                                                  0, EVAS_COLORSPACE_ARGB8888);
+     }
+
+   return buf;
+}
+
+RGBA_Image *
+evas_buffer_outbuf_buf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch)
+{
+   RGBA_Image *im;
+
+   if (buf->priv.back_buf)
+     {
+       *cx = x; *cy = y; *cw = w; *ch = h;
+       return buf->priv.back_buf;
+     }
+   else
+     {
+       *cx = 0; *cy = 0; *cw = w; *ch = h;
+       im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get());
+        if (im)
+          {
+            if (((buf->depth == OUTBUF_DEPTH_ARGB_32BPP_8888_8888)) ||
+                ((buf->depth == OUTBUF_DEPTH_BGRA_32BPP_8888_8888)))
+              {
+                 im->cache_entry.flags.alpha = 1;
+                  im = (RGBA_Image *) evas_cache_image_size_set(&im->cache_entry, w, h);
+               }
+          }
+     }
+   return im;
+}
+
+void
+evas_buffer_outbuf_buf_free_region_for_update(Outbuf *buf, RGBA_Image *update)
+{
+   if (update != buf->priv.back_buf) evas_cache_image_drop(&update->cache_entry);
+}
+
+void
+evas_buffer_outbuf_buf_push_updated_region(Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h)
+{
+   /* copy update image to out buf & convert */
+   switch (buf->depth)
+     {
+      case OUTBUF_DEPTH_RGB_24BPP_888_888:
+       /* copy & pack into 24bpp - if colorkey is enabled... etc. */
+         {
+            DATA8 thresh;
+            int xx, yy;
+            int row_bytes;
+            DATA8 *dest;
+            DATA32 colorkey;
+            DATA32 *src;
+            DATA8 *dst;
+
+            colorkey = buf->color_key;
+            thresh = buf->alpha_level;
+            row_bytes = buf->dest_row_bytes;
+            dest = (DATA8 *)(buf->dest) + (y * row_bytes) + (x * 3);
+            if (buf->func.new_update_region)
+              {
+                 dest = buf->func.new_update_region(x, y, w, h, &row_bytes);
+              }
+            if (!dest) break;
+            if (buf->use_color_key)
+              {
+                 for (yy = 0; yy < h; yy++)
+                   {
+                      dst = dest + (yy * row_bytes);
+                      src = update->image.data + (yy * update->cache_entry.w);
+                      for (xx = 0; xx < w; xx++)
+                        {
+                           if (A_VAL(src) > thresh)
+                             {
+                                *dst++ = R_VAL(src);
+                                *dst++ = G_VAL(src);
+                                *dst++ = B_VAL(src);
+                             }
+                           else
+                             {
+                                *dst++ = R_VAL(&colorkey);
+                                *dst++ = G_VAL(&colorkey);
+                                *dst++ = B_VAL(&colorkey);
+                             }
+                           src++;
+                        }
+                   }
+              }
+            else
+              {
+                 for (yy = 0; yy < h; yy++)
+                   {
+                      dst = dest + (yy * row_bytes);
+                      src = update->image.data + (yy * update->cache_entry.w);
+                      for (xx = 0; xx < w; xx++)
+                        {
+                           *dst++ = R_VAL(src);
+                           *dst++ = G_VAL(src);
+                           *dst++ = B_VAL(src);
+                           src++;
+                        }
+                   }
+              }
+            if (buf->func.free_update_region)
+              {
+                 buf->func.free_update_region(x, y, w, h, dest);
+              }
+         }
+       break;
+      case OUTBUF_DEPTH_BGR_24BPP_888_888:
+       /* copy & pack into 24bpp - if colorkey is enabled... etc. */
+         {
+            DATA8 thresh;
+            int xx, yy;
+            int row_bytes;
+            DATA8 *dest;
+            DATA32 colorkey;
+            DATA32 *src;
+            DATA8 *dst;
+
+            colorkey = buf->color_key;
+            thresh = buf->alpha_level;
+            row_bytes = buf->dest_row_bytes;
+            dest = (DATA8 *)(buf->dest) + (y * row_bytes) + (x * 3);
+            if (buf->func.new_update_region)
+              {
+                 dest = buf->func.new_update_region(x, y, w, h, &row_bytes);
+              }
+            if (!dest) break;
+            if (buf->use_color_key)
+              {
+                 for (yy = 0; yy < h; yy++)
+                   {
+                      dst = dest + (yy * row_bytes);
+                      src = update->image.data + (yy * update->cache_entry.w);
+                      for (xx = 0; xx < w; xx++)
+                        {
+                           if (A_VAL(src) > thresh)
+                             {
+                                *dst++ = B_VAL(src);
+                                *dst++ = G_VAL(src);
+                                *dst++ = R_VAL(src);
+                             }
+                           else
+                             {
+                                *dst++ = B_VAL(&colorkey);
+                                *dst++ = G_VAL(&colorkey);
+                                *dst++ = R_VAL(&colorkey);
+                             }
+                           src++;
+                        }
+                   }
+              }
+            else
+              {
+                 for (yy = 0; yy < h; yy++)
+                   {
+                      dst = dest + (yy * row_bytes);
+                      src = update->image.data + (yy * update->cache_entry.w);
+                      for (xx = 0; xx < w; xx++)
+                        {
+                           *dst++ = B_VAL(src);
+                           *dst++ = G_VAL(src);
+                           *dst++ = R_VAL(src);
+                           src++;
+                        }
+                   }
+              }
+            if (buf->func.free_update_region)
+              {
+                 buf->func.free_update_region(x, y, w, h, dest);
+              }
+         }
+       break;
+      case OUTBUF_DEPTH_RGB_32BPP_888_8888:
+      case OUTBUF_DEPTH_ARGB_32BPP_8888_8888:
+         {
+            DATA32 *dest, *src, *dst;
+            int yy, row_bytes;
+
+            row_bytes = buf->dest_row_bytes;
+            dest = (DATA32 *)((DATA8 *)(buf->dest) + (y * row_bytes) + (x * 4));
+            if (buf->func.new_update_region)
+              {
+                 dest = buf->func.new_update_region(x, y, w, h, &row_bytes);
+              }
+            /* no need src == dest */
+            if (!buf->priv.back_buf)
+              {
+                 Gfx_Func_Copy func;
+                 
+                 func = evas_common_draw_func_copy_get(w, 0);
+                 if (func)
+                   {
+                      for (yy = 0; yy < h; yy++)
+                        {
+                           src = update->image.data + (yy * update->cache_entry.w);
+                           dst = (DATA32 *)((DATA8 *)(buf->dest) + ((y + yy) * row_bytes));
+                           func(src, dst, w);
+                        }
+                      
+                   }
+              }
+            if (buf->func.free_update_region)
+              {
+                 buf->func.free_update_region(x, y, w, h, dest);
+              }
+         }
+       break;
+      case OUTBUF_DEPTH_BGR_32BPP_888_8888:
+         {
+            DATA32 *src, *dst;
+            DATA8 *dest;
+            int xx, yy, row_bytes;
+            
+            row_bytes = buf->dest_row_bytes;
+            dest = (DATA8 *)(buf->dest) + (y * row_bytes) + (x * 4);
+            if (buf->func.new_update_region)
+              {
+                 dest = buf->func.new_update_region(x, y, w, h, &row_bytes);
+              }
+            for (yy = 0; yy < h; yy++)
+              {
+                 dst = (DATA32 *)(dest + (yy * row_bytes));
+                 src = update->image.data + (yy * update->cache_entry.w);
+                 for (xx = 0; xx < w; xx++)
+                   {
+                      A_VAL(dst) = B_VAL(src);
+                      R_VAL(dst) = G_VAL(src);
+                      G_VAL(dst) = R_VAL(src);
+                      dst++;
+                      src++;
+                   }
+              }
+            if (buf->func.free_update_region)
+              {
+                 buf->func.free_update_region(x, y, w, h, dest);
+              }
+        }
+       break;
+      case OUTBUF_DEPTH_BGRA_32BPP_8888_8888:
+         {
+            DATA32 *src, *dst;
+            DATA8 *dest;
+            int xx, yy, row_bytes;
+            
+            row_bytes = buf->dest_row_bytes;
+            dest = (DATA8 *)(buf->dest) + (y * row_bytes) + (x * 4);
+            if (buf->func.new_update_region)
+              {
+                 dest = buf->func.new_update_region(x, y, w, h, &row_bytes);
+              }
+            for (yy = 0; yy < h; yy++)
+              {
+                 dst = (DATA32 *)(dest + (yy * row_bytes));
+                 src = update->image.data + (yy * update->cache_entry.w);
+                 for (xx = 0; xx < w; xx++)
+                   {
+                      A_VAL(dst) = B_VAL(src);
+                      R_VAL(dst) = G_VAL(src);
+                      G_VAL(dst) = R_VAL(src);
+                      dst++;
+                      src++;
+                   }
+              }
+            if (buf->func.free_update_region)
+              {
+                 buf->func.free_update_region(x, y, w, h, dest);
+              }
+        }
+       break;
+      default:
+       break;
+     }
+}
diff --git a/src/modules/engines/cairo_common/.cvsignore b/src/modules/engines/cairo_common/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/engines/cairo_common/Makefile.am b/src/modules/engines/cairo_common/Makefile.am
new file mode 100644 (file)
index 0000000..4ff6654
--- /dev/null
@@ -0,0 +1,25 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@CAIRO_CFLAGS@ \
+@EINA_CFLAGS@
+
+if BUILD_ENGINE_CAIRO_COMMON
+
+noinst_LTLIBRARIES = libevas_engine_cairo_common.la
+
+libevas_engine_cairo_common_la_SOURCES = \
+evas_cairo_main.c
+
+libevas_engine_cairo_common_la_LIBADD = @EINA_LIBS@ @CAIRO_LIBS@ $(top_builddir)/src/lib/libevas.la
+
+endif
+
+EXTRA_DIST = \
+evas_cairo_private.h \
+evas_cairo_common.h
diff --git a/src/modules/engines/cairo_common/evas_cairo_common.h b/src/modules/engines/cairo_common/evas_cairo_common.h
new file mode 100644 (file)
index 0000000..c7b119f
--- /dev/null
@@ -0,0 +1,59 @@
+#ifndef EVAS_CAIRO_COMMON_H
+#define EVAS_CAIRO_COMMON_H
+
+#include "evas_common.h"
+#include "config.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>
+
+#include <cairo.h>
+#include <cairo-xlib.h>
+
+typedef struct _Evas_Cairo_Context                   Evas_Cairo_Context;
+typedef struct _Evas_Cairo_Image                     Evas_Cairo_Image;
+typedef struct _Evas_Cairo_Polygon                   Evas_Cairo_Polygon;
+typedef struct _Evas_Cairo_Polygon_Point             Evas_Cairo_Polygon_Point;
+
+struct _Evas_Cairo_Context
+{
+   cairo_t         *cairo;
+
+   struct {
+      double r, g, b, a;
+   } col;
+   struct {
+      unsigned int set : 1;
+      double r, g, b, a;
+   } mul;
+};
+
+struct _Evas_Cairo_Image
+{
+   RGBA_Image         *im;
+   int                 references;
+   DATA32             *mulpix;
+   cairo_surface_t    *surface;
+   cairo_pattern_t    *pattern;
+};
+
+struct _Evas_Cairo_Polygon
+{
+   Eina_List *points;
+};
+
+struct _Evas_Cairo_Polygon_Point
+{
+   int x, y;
+};
+
+#endif
diff --git a/src/modules/engines/cairo_common/evas_cairo_main.c b/src/modules/engines/cairo_common/evas_cairo_main.c
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/modules/engines/cairo_common/evas_cairo_private.h b/src/modules/engines/cairo_common/evas_cairo_private.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/modules/engines/cairo_x11/.cvsignore b/src/modules/engines/cairo_x11/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/engines/cairo_x11/Evas_Engine_Cairo_X11.h b/src/modules/engines/cairo_x11/Evas_Engine_Cairo_X11.h
new file mode 100644 (file)
index 0000000..3a7d64a
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef _EVAS_ENGINE_CAIRO_X11_H
+#define _EVAS_ENGINE_CAIRO_X11_H
+
+#include <X11/Xlib.h>
+
+typedef struct _Evas_Engine_Info_Cairo_X11 Evas_Engine_Info_Cairo_X11;
+
+struct _Evas_Engine_Info_Cairo_X11
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   /* engine specific data & parameters it needs to set up */
+   struct {
+      Display  *display;
+      Drawable  drawable;
+      Visual   *visual;
+      Colormap  colormap;
+      int       depth;
+   } info;
+   /* engine specific function calls to query stuff about the destination */
+   /* engine (what visual & colormap & depth to use, performance info etc. */
+};
+#endif
+
+
diff --git a/src/modules/engines/cairo_x11/Makefile.am b/src/modules/engines/cairo_x11/Makefile.am
new file mode 100644 (file)
index 0000000..e861db2
--- /dev/null
@@ -0,0 +1,45 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines/cairo_common \
+@FREETYPE_CFLAGS@ \
+@evas_engine_cairo_x11_cflags@ \
+@EINA_CFLAGS@
+
+if BUILD_ENGINE_CAIRO_X11
+
+CAIRO_X11_SOURCES = \
+evas_engine.c \
+evas_x_main.c
+
+CAIRO_X11_LIBADD = @evas_engine_cairo_x11_libs@ $(top_builddir)/src/modules/engines/cairo_common/libevas_engine_cairo_common.la
+
+pkgdir = $(libdir)/evas/modules/engines/cairo_x11/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_Cairo_X11.h
+
+if !EVAS_STATIC_BUILD_CAIRO_X11
+
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = $(CAIRO_X11_SOURCES)
+
+module_la_LIBADD = @EINA_LIBS@ $(CAIRO_X11_SOURCES) $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_cairo_x11.la
+
+libevas_engine_cairo_x11_la_SOURCES = $(CAIRO_X11_SOURCES)
+libevas_engine_cairo_x11_la_LIBADD = $(CAIRO_X11_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/cairo_x11/evas_engine.c b/src/modules/engines/cairo_x11/evas_engine.c
new file mode 100644 (file)
index 0000000..df81a2f
--- /dev/null
@@ -0,0 +1,1541 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+#include <X11/Xlib.h>
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_Cairo_X11.h"
+#include "evas_cairo_common.h"
+
+/* domain for eina_log */
+int _evas_engine_cairo_X11_log_dom = -1;
+
+static void *eng_info(Evas *e);
+static void eng_info_free(Evas *e, void *info);
+static int eng_setup(Evas *e, void *info);
+static void *eng_output_setup(int w, int h, Display *disp, Drawable draw, Visual *vis, Colormap cmap, int depth);
+static void eng_output_free(void *data);
+static void eng_output_resize(void *data, int w, int h);
+static void eng_output_tile_size_set(void *data, int w, int h);
+static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_clear(void *data);
+static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
+static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
+static void eng_output_flush(void *data);
+
+static void *eng_context_new(void *data);
+static Eina_Bool eng_canvas_alpha_get(void *data, void *context);
+static void eng_context_free(void *data, void *context);
+static void eng_context_clip_set(void *data, void *context, int x, int y, int w, int h);
+static void eng_context_clip_clip(void *data, void *context, int x, int y, int w, int h);
+static void eng_context_clip_unset(void *data, void *context);
+static int eng_context_clip_get(void *data, void *context, int *x, int *y, int *w, int *h);
+static void eng_context_color_set(void *data, void *context, int r, int g, int b, int a);
+static int eng_context_color_get(void *data, void *context, int *r, int *g, int *b, int *a);
+static void eng_context_multiplier_set(void *data, void *context, int r, int g, int b, int a);
+static void eng_context_multiplier_unset(void *data, void *context);
+static int eng_context_multiplier_get(void *data, void *context, int *r, int *g, int *b, int *a);
+static void eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h);
+static void eng_context_cutout_clear(void *data, void *context);
+static void eng_context_anti_alias_set(void *data, void *context, unsigned char aa);
+static unsigned char eng_context_anti_alias_get(void *data, void *context);
+static void eng_context_color_interpolation_set(void *data, void *context, int color_space);
+static int eng_context_color_interpolation_get(void *data, void *context);
+static void eng_context_render_op_set(void *data, void *context, int op);
+static int eng_context_render_op_get(void *data, void *context);
+
+static void eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h);
+
+static void eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2);
+
+static void *eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y);
+static void *eng_polygon_points_clear(void *data, void *context, void *polygon);
+static void eng_polygon_draw(void *data, void *context, void *surface, void *polygon, int x, int y);
+
+static void *eng_gradient_new(void *data);
+static void eng_gradient_free(void *data, void *gradient);
+static void eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta);
+static void eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta);
+static void eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha);
+static void eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len);
+static void eng_gradient_clear(void *data, void *gradient);
+static void eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h);
+static void eng_gradient_fill_angle_set(void *data, void *gradient, double angle);
+static void eng_gradient_fill_spread_set(void *data, void *gradient, int spread);
+static void eng_gradient_angle_set(void *data, void *gradient, double angle);
+static void eng_gradient_offset_set(void *data, void *gradient, float offset);
+static void eng_gradient_direction_set(void *data, void *gradient, int direction);
+static void eng_gradient_type_set(void *data, void *gradient, char *name, char *params);
+static int eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h);
+static int eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h);
+static void eng_gradient_render_pre(void *data, void *context, void *gradient);
+static void eng_gradient_render_post(void *data, void *gradient);
+static void eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h);
+
+static void *eng_image_load(void *data, char *file, char *key, int *error, Evas_Image_Load_Opts *lo);
+static void *eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace);
+static void *eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace);
+static void eng_image_free(void *data, void *image);
+static void eng_image_size_get(void *data, void *image, int *w, int *h);
+static void *eng_image_size_set(void *data, void *image, int w, int h);
+static void *eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h);
+static void *eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data);
+static void *eng_image_data_put(void *data, void *image, DATA32 *image_data);
+static void eng_image_data_preload_request(void *data, void *image, const void *target);
+static void eng_image_data_preload_cancel(void *data, void *image, const void *target);
+static void *eng_image_alpha_set(void *data, void *image, int has_alpha);
+static int eng_image_alpha_get(void *data, void *image);
+static void *eng_image_border_set(void *data, void *image, int l, int r, int t, int b);
+static void eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b);
+static void eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth);
+static char *eng_image_comment_get(void *data, void *image, char *key);
+static char *eng_image_format_get(void *data, void *image);
+static void eng_image_colorspace_set(void *data, void *image, int cspace);
+static int eng_image_colorspace_get(void *data, void *image);
+static void eng_image_native_set(void *data, void *image, void *native);
+static void *eng_image_native_get(void *data, void *image);
+static void eng_image_cache_flush(void *data);
+static void eng_image_cache_set(void *data, int bytes);
+static int eng_image_cache_get(void *data);
+static void eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint);
+static int eng_image_scale_hint_get(void *data __UNUSED__, void *image);
+    
+static void *eng_font_load(void *data, char *name, int size);
+static void *eng_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size);
+static void *eng_font_add(void *data, void *font, char *name, int size);
+static void *eng_font_memory_add(void *data, void *font, char *name, int size, const void *fdata, int fdata_size);
+static void eng_font_free(void *data, void *font);
+static int eng_font_ascent_get(void *data, void *font);
+static int eng_font_descent_get(void *data, void *font);
+static int eng_font_max_ascent_get(void *data, void *font);
+static int eng_font_max_descent_get(void *data, void *font);
+static void eng_font_string_size_get(void *data, void *font, char *text, int *w, int *h);
+static int eng_font_inset_get(void *data, void *font, char *text);
+static int eng_font_h_advance_get(void *data, void *font, char *text);
+static int eng_font_v_advance_get(void *data, void *font, char *text);
+static int eng_font_char_coords_get(void *data, void *font, char *text, int pos, int *cx, int *cy, int *cw, int *ch);
+static int eng_font_char_at_coords_get(void *data, void *font, char *text, int x, int y, int *cx, int *cy, int *cw, int *ch);
+static void eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, char *text);
+static void eng_font_cache_flush(void *data);
+static void eng_font_cache_set(void *data, int bytes);
+static int eng_font_cache_get(void *data);
+
+static void eng_font_hinting_set(void *data, void *font, int hinting);
+static int eng_font_hinting_can_hint(void *data, int hinting);
+
+static int eng_font_last_up_to_pos(void *data __UNUSED__, void *font, const char *text, int x, int y);
+
+typedef struct _Render_Engine Render_Engine;
+
+struct _Render_Engine
+{
+   Evas_Cairo_X11_Window *win;
+};
+
+static Evas_Func eng_func =
+{
+   eng_info,
+     eng_info_free,
+     eng_setup,
+     eng_output_free,
+     eng_output_resize,
+     eng_output_tile_size_set,
+     eng_output_redraws_rect_add,
+     eng_output_redraws_rect_del,
+     eng_output_redraws_clear,
+     eng_output_redraws_next_update_get,
+     eng_output_redraws_next_update_push,
+     eng_output_flush,
+     /* draw context virtual methods */
+     eng_context_new,
+     eng_canvas_alpha_get,
+     eng_context_free,
+     eng_context_clip_set,
+     eng_context_clip_clip,
+     eng_context_clip_unset,
+     eng_context_clip_get,
+     eng_context_color_set,
+     eng_context_color_get,
+     eng_context_multiplier_set,
+     eng_context_multiplier_unset,
+     eng_context_multiplier_get,
+     eng_context_cutout_add,
+     eng_context_cutout_clear,
+     eng_context_anti_alias_set,
+     eng_context_anti_alias_get,
+     eng_context_color_interpolation_set,
+     eng_context_color_interpolation_get,
+     eng_context_render_op_set,
+     eng_context_render_op_get,
+     /* rectangle draw funcs */
+     eng_rectangle_draw,
+     /* line draw funcs */
+     eng_line_draw,
+     /* polygon draw funcs */
+     eng_polygon_point_add,
+     eng_polygon_points_clear,
+     eng_polygon_draw,
+     /* gradient draw funcs */
+     eng_gradient_new,
+     eng_gradient_free,
+     eng_gradient_color_stop_add,
+     eng_gradient_alpha_stop_add,
+     eng_gradient_color_data_set,
+     eng_gradient_alpha_data_set,
+     eng_gradient_clear,
+     eng_gradient_fill_set,
+     eng_gradient_fill_angle_set,
+     eng_gradient_fill_spread_set,
+     eng_gradient_angle_set,
+     eng_gradient_offset_set,
+     eng_gradient_direction_set,
+     eng_gradient_type_set,
+     eng_gradient_is_opaque,
+     eng_gradient_is_visible,
+     eng_gradient_render_pre,
+     eng_gradient_render_post,
+     eng_gradient_draw,
+     /* image draw funcs */
+     eng_image_load,
+     eng_image_new_from_data,
+     eng_image_new_from_copied_data,
+     eng_image_free,
+     eng_image_size_get,
+     eng_image_size_set,
+     NULL,
+     eng_image_dirty_region,
+     eng_image_data_get,
+     eng_image_data_put,
+     eng_image_data_preload_request,
+     eng_image_data_preload_cancel,
+     eng_image_alpha_set,
+     eng_image_alpha_get,
+     eng_image_border_set,
+     eng_image_border_get,
+     eng_image_draw,
+     eng_image_comment_get,
+     eng_image_format_get,
+     eng_image_colorspace_set,
+     eng_image_colorspace_get,
+     eng_image_native_set,
+     eng_image_native_get,
+     /* image cache funcs */
+     eng_image_cache_flush,
+     eng_image_cache_set,
+     eng_image_cache_get,
+     /* font draw functions */
+     eng_font_load,
+     eng_font_memory_load,
+     eng_font_add,
+     eng_font_memory_add,
+     eng_font_free,
+     eng_font_ascent_get,
+     eng_font_descent_get,
+     eng_font_max_ascent_get,
+     eng_font_max_descent_get,
+     eng_font_string_size_get,
+     eng_font_inset_get,
+     eng_font_h_advance_get,
+     eng_font_v_advance_get,
+     eng_font_char_coords_get,
+     eng_font_char_at_coords_get,
+     eng_font_draw,
+     /* font cache functions */
+     eng_font_cache_flush,
+     eng_font_cache_set,
+     eng_font_cache_get,
+                              
+     eng_font_hinting_set,
+     eng_font_hinting_can_hint,
+     
+     eng_image_scale_hint_set,
+     eng_image_scale_hint_get,
+     /* more font draw functions */
+     eng_font_last_up_to_pos,
+     NULL, // image_map4_draw
+     NULL, // image_map_surface_new
+     NULL // image_map_surface_free
+};
+
+static void *
+eng_info(Evas *e)
+{
+   Evas_Engine_Info_Cairo_X11 *info;
+   INF("CAIRO: create info...");
+   info = calloc(1, sizeof(Evas_Engine_Info_Cairo_X11));
+   if (!info) return NULL;
+   info->magic.magic = rand();   
+   return info;
+   e = NULL;
+}
+
+static void
+eng_info_free(Evas *e, void *info)
+{
+   Evas_Engine_Info_Cairo_X11 *in;
+   in = (Evas_Engine_Info_Cairo_X11 *)info;
+   free(in);
+}
+
+static int
+eng_setup(Evas *e, void *in)
+{
+   Render_Engine *re;
+   Evas_Engine_Info_Cairo_X11 *info;
+
+   info = (Evas_Engine_Info_Cairo_X11 *)in;
+   INF("CAIRO: setup info...");
+   if (!e->engine.data.output)
+     e->engine.data.output =
+     eng_output_setup(e->output.w,
+                                       e->output.h,
+                                       info->info.display,
+                                       info->info.drawable,
+                                       info->info.visual,
+                                       info->info.colormap,
+                                       info->info.depth);
+   if (!e->engine.data.output) return 0;
+
+   if (!e->engine.data.context)
+     e->engine.data.context =
+     e->engine.func->context_new(e->engine.data.output);
+   re = e->engine.data.output;
+
+   return 1;
+}
+
+static void *
+eng_output_setup(int w, int h, Display *disp, Drawable draw, Visual *vis, Colormap cmap, int depth)
+{
+   Render_Engine *re;
+
+   re = calloc(1, sizeof(Render_Engine));
+   if (!re)
+     return NULL;
+   re->win = eng_window_new(disp, draw,
+                                             0 /* FIXME: screen 0 assumption */,
+                                             vis, cmap, depth, w, h);
+   if (!re->win)
+     {
+       free(re);
+       return NULL;
+     }
+   INF("CAIRO: cairo window setup done.");
+   evas_common_cpu_init();
+
+   evas_common_blend_init();
+   evas_common_image_init();
+   evas_common_convert_init();
+   evas_common_scale_init();
+   evas_common_rectangle_init();
+   evas_common_gradient_init();
+   evas_common_polygon_init();
+   evas_common_line_init();
+   evas_common_font_init();
+   evas_common_draw_init();
+   evas_common_tilebuf_init();
+
+   return re;
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+
+   eng_window_free(re->win);
+
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+}
+
+static void
+eng_output_resize(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   re->win->w = w;
+   re->win->h = h;
+
+   eng_window_size_set(re->win, w, h);
+}
+
+static void
+eng_output_tile_size_set(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   /* not used in cairo engine */
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+   /* FIXME? cairo_surface_mark_dirty_rectangle */
+
+   re = (Render_Engine *)data;
+   if (!re->win->draw.redraw)
+     {
+       re->win->draw.x1 = 0;
+       re->win->draw.y1 = 0;
+       re->win->draw.x2 = re->win->w - 1;
+       re->win->draw.y2 = re->win->h - 1;
+     }
+   else
+     {
+       if (x < re->win->draw.x1) re->win->draw.x1 = x;
+       if (y < re->win->draw.y1) re->win->draw.y1 = y;
+       if ((x + w - 1) > re->win->draw.x2) re->win->draw.x2 = x + w - 1;
+       if ((y + h - 1) > re->win->draw.y2) re->win->draw.y2 = y + h - 1;
+     }
+   re->win->draw.redraw = 1;
+}
+
+static void
+eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   /* not used in cairo engine */
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   re->win->draw.redraw = 0;
+}
+
+static void *
+eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (!re->win->draw.redraw) return NULL;
+
+   if (x) *x = re->win->draw.x1;
+   if (y) *y = re->win->draw.y1;
+   if (w) *w = re->win->draw.x2 - re->win->draw.x1 + 1;
+   if (h) *h = re->win->draw.y2 - re->win->draw.y1 + 1;
+   if (cx) *cx = re->win->draw.x1;
+   if (cy) *cy = re->win->draw.y1;
+   if (cw) *cw = re->win->draw.x2 - re->win->draw.x1 + 1;
+   if (ch) *ch = re->win->draw.y2 - re->win->draw.y1 + 1;
+   return re;
+}
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   re->win->draw.redraw = 0;
+}
+
+static void
+eng_output_flush(void *data)
+{
+   Render_Engine *re;
+   Evas_Cairo_Context *ctxt;
+   Eina_List *l;
+
+   re = (Render_Engine *)data;
+}
+
+static void *
+eng_context_new(void *data)
+{
+   Render_Engine *re;
+   Evas_Cairo_Context *ctxt;
+
+   re = (Render_Engine *)data;
+   ctxt = calloc(1, sizeof(Evas_Cairo_Context));
+   if (!ctxt) return NULL;
+
+   ctxt->cairo = cairo_create(re->win->surface);
+
+   return ctxt;
+}
+
+static void
+eng_context_free(void *data, void *context)
+{
+   Render_Engine *re;
+   Evas_Cairo_Context *ctxt;
+
+   re = (Render_Engine *)data;
+   ctxt = context;
+
+   cairo_destroy(ctxt->cairo);
+   free(ctxt);
+}
+
+static void
+eng_context_clip_set(void *data, void *context, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   /* not used in cairo engine */
+}
+
+static void
+eng_context_clip_clip(void *data, void *context, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   /* not used in cairo engine */
+}
+
+static void
+eng_context_clip_unset(void *data, void *context)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   /* not used in cairo engine */
+}
+
+static int
+eng_context_clip_get(void *data, void *context, int *x, int *y, int *w, int *h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   /* not used in cairo engine */
+   return 0;
+}
+
+static void
+eng_context_color_set(void *data, void *context, int r, int g, int b, int a)
+{
+   Render_Engine *re;
+   Evas_Cairo_Context *ctxt;
+
+   re = (Render_Engine *)data;
+   ctxt = (Evas_Cairo_Context *)context;
+
+   ctxt->col.r = (double)r / 255.0;
+   ctxt->col.g = (double)g / 255.0;
+   ctxt->col.b = (double)b / 255.0;
+   ctxt->col.a = (double)a / 255.0;
+}
+
+static int
+eng_context_color_get(void *data, void *context, int *r, int *g, int *b, int *a)
+{
+   Render_Engine *re;
+   Evas_Cairo_Context *ctxt;
+
+   re = (Render_Engine *)data;
+   ctxt = (Evas_Cairo_Context *)context;
+
+   if (r) *r = ctxt->col.r * 255;
+   if (g) *g = ctxt->col.g * 255;
+   if (b) *b = ctxt->col.b * 255;
+   if (a) *a = ctxt->col.a * 255;
+   return 1;
+}
+
+static void
+eng_context_multiplier_set(void *data, void *context, int r, int g, int b, int a)
+{
+   Render_Engine *re;
+   Evas_Cairo_Context *ctxt;
+
+   re = (Render_Engine *)data;
+   ctxt = (Evas_Cairo_Context *)context;
+
+   ctxt->mul.r = (double)r / 255.0;
+   ctxt->mul.g = (double)g / 255.0;
+   ctxt->mul.b = (double)b / 255.0;
+   ctxt->mul.a = (double)a / 255.0;
+   ctxt->mul.set = 1;
+}
+
+static void
+eng_context_multiplier_unset(void *data, void *context)
+{
+   Render_Engine *re;
+   Evas_Cairo_Context *ctxt;
+
+   re = (Render_Engine *)data;
+   ctxt = (Evas_Cairo_Context *)context;
+   ctxt->mul.set = 0;
+}
+
+static int
+eng_context_multiplier_get(void *data, void *context, int *r, int *g, int *b, int *a)
+{
+   Render_Engine *re;
+   Evas_Cairo_Context *ctxt;
+
+   re = (Render_Engine *)data;
+   ctxt = (Evas_Cairo_Context *)context;
+
+   if (r) *r = ctxt->mul.r * 255;
+   if (g) *g = ctxt->mul.g * 255;
+   if (b) *b = ctxt->mul.b * 255;
+   if (a) *a = ctxt->mul.a * 255;
+   return ctxt->mul.set;
+}
+
+static void
+eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   /* not used in cairo engine */
+}
+
+static void
+eng_context_cutout_clear(void *data, void *context)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   /* not used in cairo engine */
+}
+
+static void
+eng_context_anti_alias_set(void *data, void *context, unsigned char aa)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+}
+
+static unsigned char
+eng_context_anti_alias_get(void *data, void *context)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   return 1;
+}
+
+static void
+eng_context_color_interpolation_set(void *data, void *context, int color_space)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+}
+
+static int
+eng_context_color_interpolation_get(void *data, void *context)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   return 0;
+}
+
+static void
+eng_context_render_op_set(void *data, void *context, int op)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+}
+
+static int
+eng_context_render_op_get(void *data, void *context)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   return 0;
+}
+
+
+static void
+eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+   Evas_Cairo_Context *ctxt;
+   double r, g, b, a;
+
+   re = (Render_Engine *)data;
+   ctxt = (Evas_Cairo_Context *)context;
+
+   cairo_rectangle(ctxt->cairo, x, y, w, h);
+   r = ctxt->col.r;
+   g = ctxt->col.g;
+   b = ctxt->col.b;
+   a = ctxt->col.a;
+   if (ctxt->mul.set)
+     {
+       r *= ctxt->mul.r;
+       g *= ctxt->mul.g;
+       b *= ctxt->mul.b;
+       a *= ctxt->mul.a;
+     }
+   cairo_set_source_rgba(ctxt->cairo, r, g, b, a);
+   cairo_fill(ctxt->cairo);
+}
+
+static void
+eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2)
+{
+   Render_Engine *re;
+   Evas_Cairo_Context *ctxt;
+   double r, g, b, a;
+
+   re = (Render_Engine *)data;
+   ctxt = (Evas_Cairo_Context *)context;
+
+   cairo_move_to(ctxt->cairo, x1, y1);
+   cairo_line_to(ctxt->cairo, x2, y2);
+   r = ctxt->col.r;
+   g = ctxt->col.g;
+   b = ctxt->col.b;
+   a = ctxt->col.a;
+   if (ctxt->mul.set)
+     {
+       r *= ctxt->mul.r;
+       g *= ctxt->mul.g;
+       b *= ctxt->mul.b;
+       a *= ctxt->mul.a;
+     }
+   cairo_set_source_rgba(ctxt->cairo, r, g, b, a);
+   cairo_stroke(ctxt->cairo);
+}
+
+static void *
+eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y)
+{
+   Render_Engine *re;
+   Evas_Cairo_Context *ctxt;
+   Evas_Cairo_Polygon *poly;
+   Evas_Cairo_Polygon_Point *pt;
+
+   re = (Render_Engine *)data;
+   ctxt = (Evas_Cairo_Context *)context;
+   poly = (Evas_Cairo_Polygon *)polygon;
+   if (!poly) poly = calloc(1, sizeof(Evas_Cairo_Polygon));
+
+   pt = malloc(sizeof(Evas_Cairo_Polygon_Point));
+   if (pt)
+     {
+       pt->x = x;
+       pt->y = y;
+       poly->points = eina_list_append(poly->points, pt);
+     }
+   return poly;
+}
+
+static void *
+eng_polygon_points_clear(void *data, void *context, void *polygon)
+{
+   Render_Engine *re;
+   Evas_Cairo_Context *ctxt;
+   Evas_Cairo_Polygon *poly;
+
+   re = (Render_Engine *)data;
+   ctxt = (Evas_Cairo_Context *)context;
+   poly = (Evas_Cairo_Polygon *)polygon;
+   if (!poly) return NULL;
+
+   while (poly->points)
+     {
+       free(poly->points->data);
+       poly->points = eina_list_remove_list(poly->points, poly->points);
+     }
+   free(poly);
+
+   return NULL;
+}
+
+static void
+eng_polygon_draw(void *data, void *context, void *surface, void *polygon, int x, int y)
+{
+   Render_Engine *re;
+   Evas_Cairo_Context *ctxt;
+   Evas_Cairo_Polygon *poly;
+   Evas_Cairo_Polygon_Point *pt;
+   double r, g, b, a;
+
+   re = (Render_Engine *)data;
+   ctxt = (Evas_Cairo_Context *)context;
+   poly = (Evas_Cairo_Polygon *)polygon;
+
+   pt = poly->points->data;
+   if (pt)
+     {
+       Eina_List *l;
+       cairo_move_to(ctxt->cairo, pt->x + x, pt->y + y);
+       EINA_LIST_FOREACH(poly->points->next, l, pt)
+         cairo_line_to(ctxt->cairo, pt->x + x, pt->y + y);
+     }
+   r = ctxt->col.r;
+   g = ctxt->col.g;
+   b = ctxt->col.b;
+   a = ctxt->col.a;
+   if (ctxt->mul.set)
+     {
+       r *= ctxt->mul.r;
+       g *= ctxt->mul.g;
+       b *= ctxt->mul.b;
+       a *= ctxt->mul.a;
+     }
+   cairo_set_source_rgba(ctxt->cairo, r, g, b, a);
+   cairo_stroke(ctxt->cairo);
+}
+
+static void *
+eng_gradient_new(void *data)
+{
+   return evas_common_gradient_new();
+}
+
+static void
+eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta)
+{
+   evas_common_gradient_color_stop_add(gradient, r, g, b, a, delta);
+}
+
+static void
+eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta)
+{
+   evas_common_gradient_alpha_stop_add(gradient, a, delta);
+}
+
+static void
+eng_gradient_clear(void *data, void *gradient)
+{
+   evas_common_gradient_clear(gradient);
+}
+
+static void
+eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha)
+{
+   evas_common_gradient_color_data_set(gradient, map, len, has_alpha);
+}
+
+static void
+eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len)
+{
+   evas_common_gradient_alpha_data_set(gradient, alpha_map, len);
+}
+
+static void
+eng_gradient_free(void *data, void *gradient)
+{
+   evas_common_gradient_free(gradient);
+}
+
+static void
+eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h)
+{
+   evas_common_gradient_fill_set(gradient, x, y, w, h);
+}
+
+static void
+eng_gradient_fill_angle_set(void *data, void *gradient, double angle)
+{
+   evas_common_gradient_fill_angle_set(gradient, angle);
+}
+
+static void
+eng_gradient_fill_spread_set(void *data, void *gradient, int spread)
+{
+   evas_common_gradient_fill_spread_set(gradient, spread);
+}
+
+static void
+eng_gradient_angle_set(void *data, void *gradient, double angle)
+{
+   evas_common_gradient_map_angle_set(gradient, angle);
+}
+
+static void
+eng_gradient_offset_set(void *data, void *gradient, float offset)
+{
+   evas_common_gradient_map_offset_set(gradient, offset);
+}
+
+static void
+eng_gradient_direction_set(void *data, void *gradient, int direction)
+{
+   evas_common_gradient_map_direction_set(gradient, direction);
+}
+
+static void
+eng_gradient_type_set(void *data, void *gradient, char *name, char *params)
+{
+   evas_common_gradient_type_set(gradient, name, params);
+}
+
+static int
+eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h)
+{
+   return 0;
+}
+
+static int
+eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h)
+{
+   return 0;
+}
+
+static void
+eng_gradient_render_pre(void *data, void *context, void *gradient)
+{
+}
+
+static void
+eng_gradient_render_post(void *data, void *gradient)
+{
+}
+
+static void
+eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h)
+{
+}
+
+static void *
+eng_image_load(void *data, char *file, char *key, int *error, Evas_Image_Load_Opts *lo)
+{
+   Render_Engine *re;
+   Evas_Cairo_Image *im;
+
+   re = (Render_Engine *)data;
+   im = calloc(1, sizeof(Evas_Cairo_Image));
+   if (!im)
+     {
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       return NULL;
+     }
+
+   *error = EVAS_LOAD_ERROR_NONE;
+   im->im = evas_common_load_image_from_file(file, key, lo, error);
+   if (!im->im)
+     {
+       free(im);
+       return NULL;
+     }
+   im->references = 1;
+   return im;
+}
+
+static void *
+eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Render_Engine *re;
+   Evas_Cairo_Image *im;
+
+   re = (Render_Engine *)data;
+
+   /* FIXME, cache! */
+   im = calloc(1, sizeof(Evas_Cairo_Image));
+   if (!im) return NULL;
+
+   im->im = evas_common_image_new();
+   if (!im->im)
+     {
+       free(im);
+       return NULL;
+     }
+   im->im->image = evas_common_image_surface_new(im->im);
+   if (!im->im->image)
+     {
+       evas_common_image_free(im->im);
+       free(im);
+       return NULL;
+     }
+
+   im->im->image->w = w;
+   im->im->image->h = h;
+   im->im->image->data = image_data;
+   im->im->image->no_free = 1;
+   im->references = 1;
+   return im;
+}
+
+static void *
+eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Render_Engine *re;
+   Evas_Cairo_Image *im;
+
+   re = (Render_Engine *)data;
+
+   /* FIXME, cache! */
+   im = calloc(1, sizeof(Evas_Cairo_Image));
+   if (!im) return NULL;
+   im->references = 1;
+   im->im = evas_common_image_create(w, h);
+   if (!im->im)
+     {
+       free(im);
+       return NULL;
+     }
+   if (image_data)
+     memcpy(im->im->image->data, image_data, w * h * sizeof(DATA32));
+   return im;
+}
+
+static void
+eng_image_free(void *data, void *image)
+{
+   Render_Engine *re;
+   Evas_Cairo_Image *im;
+
+   re = (Render_Engine *)data;
+   im = (Evas_Cairo_Image *)image;
+   evas_common_image_unref(im->im);
+   if (im->surface) cairo_surface_destroy(im->surface);
+   if (im->pattern) cairo_pattern_destroy(im->pattern);
+   free(im);
+}
+
+static void
+eng_image_size_get(void *data, void *image, int *w, int *h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (!image)
+     {
+       if (w) *w = 0;
+       if (h) *h = 0;
+     }
+   else
+     {
+       Evas_Cairo_Image *im;
+
+       im = image;
+       if (w) *w = im->im->image->w;
+       if (h) *h = im->im->image->h;
+     }
+}
+
+static void *
+eng_image_size_set(void *data, void *image, int w, int h)
+{
+   Render_Engine *re;
+
+   /* FIXME */
+   re = (Render_Engine *)data;
+   return image;
+}
+
+static void *
+eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   /* FIXME */
+   re = (Render_Engine *)data;
+   return image;
+}
+
+static void *
+eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data)
+{
+   Render_Engine *re;
+
+   /* FIXME */
+   re = (Render_Engine *)data;
+   *image_data = NULL;
+   return image;
+}
+
+static void *
+eng_image_data_put(void *data, void *image, DATA32 *image_data)
+{
+   Render_Engine *re;
+
+   /* FIXME */
+   re = (Render_Engine *)data;
+   return image;
+}
+
+static void
+eng_image_data_preload_request(void *data, void *image, const void *target)
+{
+   Render_Engine *re;
+
+   /* FIXME */
+   re = (Render_Engine *)data;
+   return image;
+}
+
+static void
+eng_image_data_preload_cancel(void *data, void *image, const void *target)
+{
+   Render_Engine *re;
+
+   /* FIXME */
+   re = (Render_Engine *)data;
+   return image;
+}
+
+static void *
+eng_image_alpha_set(void *data, void *image, int has_alpha)
+{
+   Render_Engine *re;
+
+   /* FIXME */
+   re = (Render_Engine *)data;
+   return image;
+}
+
+static int
+eng_image_alpha_get(void *data, void *image)
+{
+   Render_Engine *re;
+   Evas_Cairo_Image *im;
+
+   re = (Render_Engine *)data;
+   if (!image) return 0;
+
+   im = image;
+   if (im->im->cache_entry.flags.alpha) return 1;
+   return 0;
+}
+
+static void *
+eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   return image;
+}
+
+static void
+eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   return;
+}
+
+static void
+eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
+{
+   Render_Engine *re;
+   Evas_Cairo_Context *ctxt;
+   Evas_Cairo_Image *im;
+   DATA32 *pix;
+
+   re = (Render_Engine *)data;
+   ctxt = (Evas_Cairo_Context *)context;
+   if (!image) return;
+
+   im = image;
+   evas_common_load_image_data_from_file(im->im);
+   pix = im->im->image->data;
+   if (pix)
+     {
+       if (!im->surface)
+         {
+            im->mulpix = malloc(im->im->image->w * im->im->image->h * sizeof(DATA32));
+            if (im->mulpix)
+              {
+                 int i, n;
+                 DATA32 *p;
+
+                 n = im->im->image->w * im->im->image->h;
+                 p = im->mulpix;
+                 for (i = 0; i < n; i++)
+                   {
+                      int a;
+
+                      a = A_VAL(pix);
+                      R_VAL(p) = (R_VAL(pix) * a) / 255;
+                      G_VAL(p) = (G_VAL(pix) * a) / 255;
+                      B_VAL(p) = (B_VAL(pix) * a) / 255;
+                      A_VAL(p) = a;
+                      p++;
+                      pix++;
+                   }
+                 im->surface = cairo_image_surface_create_for_data(im->mulpix,
+                                                                   CAIRO_FORMAT_ARGB32,
+                                                                   im->im->image->w,
+                                                                   im->im->image->h,
+                                                                   0);
+                 im->pattern = cairo_pattern_create_for_surface(im->surface);
+              }
+         }
+
+       if (smooth)
+         cairo_pattern_set_filter(im->pattern, CAIRO_FILTER_BILINEAR);
+       else
+         cairo_pattern_set_filter(im->pattern, CAIRO_FILTER_NEAREST);
+       cairo_save(ctxt->cairo);
+       cairo_translate(ctxt->cairo, dst_x, dst_y);
+       cairo_scale(ctxt->cairo,
+                   (double)src_w / (double)dst_w,
+                   (double)src_h / (double)dst_h);
+       cairo_move_to(ctxt->cairo, 0, 0);
+       //     cairo_set_rgb_color(re->win->cairo,
+       //                        (double)(R_VAL(((RGBA_Draw_Context *)context)->col.col)) / 255.0,
+       //                        (double)(R_VAL(((RGBA_Draw_Context *)context)->col.col)) / 255.0,
+       //                        (double)(R_VAL(((RGBA_Draw_Context *)context)->col.col)) / 255.0);
+       //     cairo_set_alpha(re->win->cairo,
+       //                   (double)(A_VAL(((RGBA_Draw_Context *)context)->col.col)) / 255.0);
+       cairo_set_source_surface(ctxt->cairo,
+                                im->surface,
+                                im->im->image->w,
+                                im->im->image->h);
+       cairo_paint(ctxt->cairo);
+       cairo_restore(ctxt->cairo);
+     }
+}
+
+static char *
+eng_image_comment_get(void *data, void *image, char *key)
+{
+   Render_Engine *re;
+
+   /* FIXME */
+   re = (Render_Engine *)data;
+   return NULL;
+}
+
+static char *
+eng_image_format_get(void *data, void *image)
+{
+   Render_Engine *re;
+
+   /* FIXME */
+   re = (Render_Engine *)data;
+   return NULL;
+}
+
+static void
+eng_image_colorspace_set(void *data, void *image, int cspace)
+{
+}
+
+static int
+eng_image_colorspace_get(void *data, void *image)
+{
+   return EVAS_COLORSPACE_ARGB8888;
+}
+
+static void
+eng_image_native_set(void *data, void *image, void *native)
+{
+}
+
+static void *
+eng_image_native_get(void *data, void *image)
+{
+   return NULL;
+}
+
+static void
+eng_image_cache_flush(void *data)
+{
+   Render_Engine *re;
+   int tmp_size;
+
+   re = (Render_Engine *)data;
+   tmp_size = evas_common_image_get_cache();
+   evas_common_image_set_cache(0);
+   evas_common_image_set_cache(tmp_size);
+}
+
+static void
+eng_image_cache_set(void *data, int bytes)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_image_set_cache(bytes);
+}
+
+static int
+eng_image_cache_get(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   return evas_common_image_get_cache();
+}
+
+static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+static void *
+eng_font_load(void *data, char *name, int size)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+   return NULL;
+}
+
+static void *
+eng_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+   return NULL;
+}
+
+static void *
+eng_font_add(void *data, void *font, char *name, int size)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+   return NULL;
+}
+
+static void *
+eng_font_memory_add(void *data, void *font, char *name, int size, const void *fdata, int fdata_size)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+   return NULL;
+}
+
+static void
+eng_font_free(void *data, void *font)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+}
+
+static int
+eng_font_ascent_get(void *data, void *font)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+   return 0;
+}
+
+static int
+eng_font_descent_get(void *data, void *font)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+   return 0;
+}
+
+static int
+eng_font_max_ascent_get(void *data, void *font)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+   return 0;
+}
+
+static int
+eng_font_max_descent_get(void *data, void *font)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+   return 0;
+}
+
+static void
+eng_font_string_size_get(void *data, void *font, char *text, int *w, int *h)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+}
+
+static int
+eng_font_inset_get(void *data, void *font, char *text)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+   return 0;
+}
+
+static int
+eng_font_h_advance_get(void *data, void *font, char *text)
+{
+   Render_Engine *re;
+   int h, v;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+   return 0;
+}
+
+static int
+eng_font_v_advance_get(void *data, void *font, char *text)
+{
+   Render_Engine *re;
+   int h, v;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+   return 0;
+}
+
+static int
+eng_font_char_coords_get(void *data, void *font, char *text, int pos, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+   return 0;
+}
+
+static int
+eng_font_char_at_coords_get(void *data, void *font, char *text, int x, int y, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+   return 0;
+}
+
+static void
+eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, char *text)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+}
+
+static void
+eng_font_cache_flush(void *data)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+}
+
+static void
+eng_font_cache_set(void *data, int bytes)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+}
+
+static int
+eng_font_cache_get(void *data)
+{
+   Render_Engine *re;
+
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+   return 0;
+}
+
+static void
+eng_font_hinting_set(void *data, void *font, int hinting)
+{
+   Render_Engine *re;
+   
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+}
+
+static int
+eng_font_hinting_can_hint(void *data, int hinting)
+{
+   Render_Engine *re;
+   
+   /* FIXME, use cairo font subsystem */
+   re = (Render_Engine *)data;
+}
+
+static int
+eng_font_last_up_to_pos(void *data __UNUSED__, void *font, const char *text, int x, int y)
+{
+   return evas_common_font_query_last_up_to_pos(font, text, x, y);
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data, void *context)
+{
+   return EINA_FALSE;
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   _evas_engine_cairo_X11_log_dom = eina_log_domain_register("EvasCairoX11Engine", EINA_COLOR_BLUE);
+   if(_evas_engine_cairo_X11_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log doamin for the cairo (X11) engine.\n");
+       return 0;
+     }
+   em->functions = (void *)(&eng_func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+  eina_log_domain_unregister(_evas_engine_cairo_X11_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "cairo_x11",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, cairo_x11);
+
+#ifndef EVAS_STATIC_BUILD_CAIRO_X11
+EVAS_EINA_MODULE_DEFINE(engine, cairo_x11);
+#endif
diff --git a/src/modules/engines/cairo_x11/evas_engine.h b/src/modules/engines/cairo_x11/evas_engine.h
new file mode 100644 (file)
index 0000000..a454af8
--- /dev/null
@@ -0,0 +1,69 @@
+#ifndef EVAS_ENGINE_H
+#define EVAS_ENGINE_H
+#include "evas_common.h"
+#include "evas_cairo_common.h"
+
+extern int _evas_engine_cairo_X11_log_dom ;
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_cairo_X11_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_cairo_X11_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_cairo_X11_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_cairo_X11_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_cairo_X11_log_dom, __VA_ARGS__)
+
+
+typedef struct _Evas_Cairo_X11_Window Evas_Cairo_X11_Window;
+
+struct _Evas_Cairo_X11_Window
+{
+   Display         *disp;
+   Window           win;
+   int              w, h;
+   int              screen;
+   Visual          *visual;
+   Colormap         colormap;
+   int              depth;
+   cairo_surface_t *surface;
+
+   struct {
+      int redraw : 1;
+      int x1, y1, x2, y2;
+   } draw;
+};
+
+Evas_Cairo_X11_Window *
+  evas_engine_cairo_x11_window_new(Display *disp,
+                                  Window   win,
+                                  int      screen,
+                                  Visual  *vis,
+                                  Colormap cmap,
+                                  int      depth,
+                                  int      w,
+                                  int      h);
+void
+  evas_engine_cairo_x11_window_free(Evas_Cairo_X11_Window *cw);
+void
+  evas_engine_cairo_x11_window_use(Evas_Cairo_X11_Window *cw);
+void
+  evas_engine_cairo_x11_window_size_set(Evas_Cairo_X11_Window *cw, int w, int h);
+
+#endif
diff --git a/src/modules/engines/cairo_x11/evas_x_main.c b/src/modules/engines/cairo_x11/evas_x_main.c
new file mode 100644 (file)
index 0000000..ae2cd82
--- /dev/null
@@ -0,0 +1,55 @@
+#include <X11/Xlib.h>
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_Cairo_X11.h"
+#include "evas_cairo_common.h"
+
+static Evas_Cairo_X11_Window *_evas_cairo_x11_window = NULL;
+
+Evas_Cairo_X11_Window *
+evas_engine_cairo_x11_window_new(Display *disp,
+                                Window   win,
+                                int      screen,
+                                Visual  *vis,
+                                Colormap cmap,
+                                int      depth,
+                                int      w,
+                                int      h)
+{
+   Evas_Cairo_X11_Window *cw;
+
+   cw = calloc(1, sizeof(Evas_Cairo_X11_Window));
+   if (!cw) return NULL;
+   cw->disp = disp;
+   cw->win = win;
+   cw->screen = screen;
+   cw->visual = vis;
+   cw->colormap = cmap;
+   cw->depth = depth;
+   cw->surface = cairo_xlib_surface_create(disp, win, vis, w, h);
+   return cw;
+}
+
+void
+evas_engine_cairo_x11_window_free(Evas_Cairo_X11_Window *cw)
+{
+   if (cw == _evas_cairo_x11_window) _evas_cairo_x11_window = NULL;
+   cairo_surface_destroy(cw->surface);
+   free(cw);
+}
+
+void
+evas_engine_cairo_x11_window_use(Evas_Cairo_X11_Window *cw)
+{
+   if (_evas_cairo_x11_window != cw)
+     {
+       _evas_cairo_x11_window = cw;
+     }
+}
+
+void
+evas_engine_cairo_x11_window_size_set(Evas_Cairo_X11_Window *cw, int w, int h)
+{
+   cairo_xlib_surface_set_size(cw->surface, w, h);
+}
diff --git a/src/modules/engines/direct3d/.cvsignore b/src/modules/engines/direct3d/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/engines/direct3d/Evas_Engine_Direct3D.h b/src/modules/engines/direct3d/Evas_Engine_Direct3D.h
new file mode 100644 (file)
index 0000000..05359a3
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef __EVAS_ENGINE_DIRECT3D_H__
+#define __EVAS_ENGINE_DIRECT3D_H__
+
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+
+typedef struct _Evas_Engine_Info_Direct3D Evas_Engine_Info_Direct3D;
+
+struct _Evas_Engine_Info_Direct3D
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   struct {
+      HWND window;
+      int rotation;
+      int depth;
+      int fullscreen : 1;
+      int layered : 1;
+   } info;
+
+   struct {
+      unsigned short width;
+      unsigned short height;
+      unsigned char *mask;
+   } *shape;
+};
+
+
+#endif /* __EVAS_ENGINE_DIRECT3D_H__ */
diff --git a/src/modules/engines/direct3d/Makefile.am b/src/modules/engines/direct3d/Makefile.am
new file mode 100644 (file)
index 0000000..6b1412d
--- /dev/null
@@ -0,0 +1,69 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines \
+@EINA_CFLAGS@ \
+@FREETYPE_CFLAGS@ \
+@evas_engine_direct3d_cflags@
+
+if BUILD_ENGINE_DIRECT3D
+
+DIRECT3D_SOURCES = \
+evas_engine.c \
+evas_direct3d_context.cpp \
+evas_direct3d_device.cpp \
+evas_direct3d_image_cache.cpp \
+evas_direct3d_main.cpp \
+evas_direct3d_object.cpp \
+evas_direct3d_object_font.cpp \
+evas_direct3d_object_image.cpp \
+evas_direct3d_object_line.cpp \
+evas_direct3d_object_rect.cpp \
+evas_direct3d_scene.cpp \
+evas_direct3d_shader_pack.cpp \
+evas_direct3d_vertex_buffer_cache.cpp
+
+DIRECT3D_LIBADD = @evas_engine_direct3d_libs@
+
+pkgdir = $(libdir)/evas/modules/engines/direct3d/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_Direct3D.h
+
+if !EVAS_STATIC_BUILD_DIRECT3D
+
+pkg_LTLIBRARIES = module.la
+module_la_SOURCES = $(DIRECT3D_SOURCES)
+module_la_CXXFLAGS = -fno-exceptions
+module_la_LIBADD = $(top_builddir)/src/lib/libevas.la $(DIRECT3D_LIBADD) @EINA_LIBS@
+module_la_LDFLAGS = @lt_enable_auto_import@ -no-undefined -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_direct3d.la
+
+libevas_engine_direct3d_la_SOURCES = $(DIRECT3D_SOURCES)
+libevas_engine_direct3d_la_LIBADD = $(DIRECT3D_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = \
+array.h \
+evas_direct3d_context.h \
+evas_direct3d_device.h \
+evas_direct3d_image_cache.h \
+evas_direct3d_object.h \
+evas_direct3d_object_font.h \
+evas_direct3d_object_image.h \
+evas_direct3d_object_line.h \
+evas_direct3d_object_rect.h \
+evas_direct3d_scene.h \
+evas_direct3d_shader_pack.h \
+evas_direct3d_vertex_buffer_cache.h \
+evas_engine.h \
+ref.h
diff --git a/src/modules/engines/direct3d/array.h b/src/modules/engines/direct3d/array.h
new file mode 100644 (file)
index 0000000..dfd80b7
--- /dev/null
@@ -0,0 +1,305 @@
+#ifndef __ARRAY_H__
+#define __ARRAY_H__
+
+#include "ref.h"
+#include <assert.h>
+
+template <class T>
+class TArray : virtual public Referenc
+{
+public:
+   TArray();
+   TArray(const TArray<T> &arr)
+   {
+      data = NULL;
+      size = num = 0;
+      block_size = arr.block_size;
+      keep_order = arr.keep_order;
+
+      //assert(0 && "Direct assignment for arrays is NOT allowed");
+      // risky probably, but anyway
+      arr.CopyTo(*this);
+   }
+   ~TArray();
+
+   bool Allocate(int new_num);
+   bool Resize(int new_size = 0);
+   bool Add(T &el);
+   bool Add(const T &el);
+
+   inline T &operator[](int i);
+   inline const T &operator[](int i) const;
+   inline const TArray<T> &operator =(const TArray<T> &arr)
+   {
+      block_size = arr.block_size;
+      keep_order = arr.keep_order;
+
+      //assert(0 && "Direct assignment for arrays is NOT allowed");
+      // risky probably, but anyway
+      arr.CopyTo(*this);
+      return *this;
+   }
+
+   T *Last()
+   {
+      if (num > 0)
+         return &data[num - 1];
+      return NULL;
+   }
+
+   inline int Length() const
+   {
+      return num;
+   }
+
+   inline int Size() const
+   {
+      return size;
+   }
+
+   inline int BlockSize() const
+   {
+      return block_size;
+   }
+
+   inline T *Data()
+   {
+      return data;
+   }
+
+   inline T **DataPtr()
+   {
+      return &data;
+   }
+
+   inline const T *Data() const
+   {
+      return data;
+   }
+
+   inline void SetKeepOrder(bool enable)
+   {
+      keep_order = enable;
+   }
+
+   bool Find(const T &el);
+
+   bool Add(TArray<T> &arr);
+   bool CopyTo(TArray<T> &dest) const;
+   bool Init(const T *arr, int len);
+
+   void Swap(int to, int from);
+   void Replace(int i);
+
+   bool SetBlockSize(int new_size);
+   void Set(T &el);
+   void Set(const T &el);
+
+protected:
+   T     *data;
+   int   size;
+   int   num;
+   int   block_size;
+   // Some operations restricted, order of the elements is fixed
+   bool  keep_order;
+
+};
+
+namespace Array
+{
+   const int default_block_size = 16;
+   const int max_array_size = 0xffffff;
+}
+
+
+template <class T> TArray<T>::TArray()
+: data(NULL), size(0), num(0), block_size(Array::default_block_size), keep_order(false)
+{
+}
+
+template <class T> TArray<T>::~TArray()
+{
+   if (data != NULL)
+      Resize();
+}
+
+template <class T> bool TArray<T>::Allocate(int new_num)
+{
+   assert(new_num >= 0 && new_num <= Array::max_array_size);
+   if (new_num > size)
+   {
+      if (!Resize(new_num))
+         return false;
+   }
+   num = new_num;
+   return true;
+}
+
+template <class T> bool TArray<T>::Resize(int new_size)
+{
+   assert(new_size >= 0 && new_size <= Array::max_array_size);
+   if (new_size == 0)
+   {
+      delete[] data;
+      data = NULL;
+      size = 0;
+      num = 0;
+      return true;
+   }
+   if (new_size == size)
+      return true;
+
+   T *new_data = new T[new_size];
+   if (new_data == NULL)
+      return false;
+
+   if (data != NULL && num > 0)
+   {
+      //CopyMemory(new_data, data, num * sizeof(T));
+      for (int i = 0; i < num && i < new_size; i++)
+         new_data[i] = data[i];
+   }
+   delete[] data;
+
+   data = new_data;
+   size = new_size;
+   return true;
+}
+
+template <class T> bool TArray<T>::Add(T &el)
+{
+   if (data == NULL)
+      Resize(1);
+
+   if (num < size)
+   {
+      data[num++] = el;
+      return true;
+   }
+   // num >= size
+   int new_size = size + block_size;
+   if (!Resize(new_size))
+      return false;
+
+   data[num++] = el;
+   return true;
+}
+
+template <class T> bool TArray<T>::Add(const T &el)
+{
+   if (data == NULL)
+      Resize(1);
+
+   if (num < size)
+   {
+      data[num++] = *(T *)&el;
+      return true;
+   }
+   // num >= size
+   int new_size = size + block_size;
+   if (!Resize(new_size))
+      return false;
+
+   data[num++] = *(T *)&el;
+   return true;
+}
+
+template <class T> bool TArray<T>::Add(TArray<T> &arr)
+{
+   if (arr.Length() == 0)
+      return true;
+   int numf = num;
+   if (!Allocate(Length() + arr.Length()))
+      return false;
+   CopyMemory(&data[numf], arr.Data(), arr.Length() * sizeof(T));
+   return true;
+}
+
+template <class T> T &TArray<T>::operator [](int i)
+{
+   assert(i >= 0 && i < num);
+   return data[i];
+}
+
+template <class T> const T &TArray<T>::operator [](int i) const
+{
+   assert(i >= 0 && i < num);
+   return data[i];
+}
+
+template <class T> bool TArray<T>::SetBlockSize(int new_size)
+{
+   assert(new_size >= 0 && new_size <= Array::max_array_size);
+   block_size = new_size;
+   return true;
+}
+
+template <class T> void TArray<T>::Set(T &el)
+{
+   for (int i = 0; i < num; i++)
+      data[i] = el;
+}
+
+template <class T> void TArray<T>::Set(const T &el)
+{
+   for (int i = 0; i < num; i++)
+      data[i] = el;
+}
+
+template <class T> bool TArray<T>::CopyTo(TArray<T> &dest) const
+{
+   if (!dest.Resize(size))
+      return false;
+   dest.num = 0;
+   for (int i = 0; i < num; i++)
+      dest.Add(data[i]);
+
+   return true;
+}
+
+template <class T> bool TArray<T>::Init(const T *arr, int len)
+{
+   assert(arr != NULL);
+   if (!Resize(len))
+      return false;
+   num = 0;
+   for (int i = 0; i < len; i++)
+      Add((T)arr[i]);
+
+   return true;
+}
+
+template <class T> void TArray<T>::Swap(int to, int from)
+{
+   assert(to >= 0 && to < num && from >= 0 && from < num);
+   if (keep_order)
+      return;
+   T t = data[to];
+   data[to] = data[from];
+   data[from] = t;
+}
+
+template <class T> void TArray<T>::Replace(int i)
+{
+   assert(i >= 0 && i < num);
+   if (keep_order)
+      return;
+   if (num >= 1)
+   {
+      data[i] = data[num - 1];
+      num--;
+   }
+}
+
+// operator == for type T should be defined
+template <class T> bool TArray<T>::Find(const T &el)
+{
+   for (int i = 0; i < num; i++)
+   {
+      if (data[i] == el)
+         return true;
+   }
+   return false;
+}
+
+#endif  // __ARRAY_H__
diff --git a/src/modules/engines/direct3d/evas_direct3d_buffer.c b/src/modules/engines/direct3d/evas_direct3d_buffer.c
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/modules/engines/direct3d/evas_direct3d_context.cpp b/src/modules/engines/direct3d/evas_direct3d_context.cpp
new file mode 100644 (file)
index 0000000..07cfa3d
--- /dev/null
@@ -0,0 +1,8 @@
+
+#include "evas_direct3d_context.h"
+
+D3DContext::D3DContext()
+{
+   color = 0xff000000;
+   color_mul = 0xffffffff;
+}
diff --git a/src/modules/engines/direct3d/evas_direct3d_context.h b/src/modules/engines/direct3d/evas_direct3d_context.h
new file mode 100644 (file)
index 0000000..763d189
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef __EVAS_DIRECT3D_CONTEXT_H__
+#define __EVAS_DIRECT3D_CONTEXT_H__
+
+#include "evas_engine.h"
+
+#include "ref.h"
+#include "evas_direct3d_object.h"
+
+class D3DContext : virtual public Referenc
+{
+public:
+   D3DContext();
+
+public:
+   DWORD color;
+   DWORD color_mul;
+
+   Ref<D3DObject> font;
+
+};
+
+#endif  // __EVAS_DIRECT3D_CONTEXT_H__
diff --git a/src/modules/engines/direct3d/evas_direct3d_device.cpp b/src/modules/engines/direct3d/evas_direct3d_device.cpp
new file mode 100644 (file)
index 0000000..ce0d985
--- /dev/null
@@ -0,0 +1,393 @@
+//#define ENABLE_LOG_PRINTF
+
+#include "evas_direct3d_device.h"
+
+#include "evas_direct3d_vertex_buffer_cache.h"
+
+D3DDevice::D3DDevice()
+{
+   ResetParams();
+}
+
+bool D3DDevice::Init(HWND window, int depth, bool fullscreen)
+{
+   D3DPRESENT_PARAMETERS pp;
+   D3DDISPLAYMODE dm;
+   D3DCAPS9 caps;
+   RECT rect;
+   DWORD flag;
+   HRESULT hr;
+
+   if (window == NULL)
+      return false;
+
+   Destroy();
+
+   _object = Direct3DCreate9(D3D_SDK_VERSION);
+   if (_object == NULL)
+     return false;
+
+   if (FAILED(hr = _object->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dm)))
+     {
+       ERR("GetAdapterDisplayMode failed: %x", hr);
+       Destroy();
+       return false;
+     }
+
+   if (FAILED(hr = _object->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps)))
+     {
+     ERR("GetDeviceCaps failed: %x", hr);
+     Destroy();
+     return false;
+     }
+
+   if (!GetClientRect(window, &rect))
+     {
+     ERR("GetClientRect failed: %x", GetLastError());
+     Destroy();
+     return false;
+     }
+
+   if (SUCCEEDED(_object->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
+     dm.Format, 0, D3DRTYPE_TEXTURE, (depth == 16) ? D3DFMT_R5G6B5 : D3DFMT_A8R8G8B8)))
+     {
+     dm.Format = (depth == 16) ? D3DFMT_R5G6B5 : D3DFMT_A8R8G8B8;
+     }
+
+   flag = (caps.VertexProcessingCaps != 0) ?
+     (D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE) :
+     D3DCREATE_SOFTWARE_VERTEXPROCESSING;
+
+   ZeroMemory(&pp, sizeof(pp));
+   if (!fullscreen)
+   {
+      pp.BackBufferWidth = rect.right - rect.left;
+      pp.BackBufferHeight = rect.bottom - rect.top;
+   }
+   else
+   {
+      pp.BackBufferWidth = ::GetSystemMetrics(SM_CXSCREEN);
+      pp.BackBufferHeight = ::GetSystemMetrics(SM_CYSCREEN);
+   }
+   pp.BackBufferFormat = dm.Format;
+   pp.BackBufferCount = 1;
+   pp.MultiSampleType = D3DMULTISAMPLE_NONE;
+   pp.MultiSampleQuality = 0;
+   pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
+   pp.hDeviceWindow = window;
+   pp.Windowed  = fullscreen ? FALSE : TRUE;
+   //pp.EnableAutoDepthStencil = TRUE;
+   //pp.AutoDepthStencilFormat = D3DFMT_D16;
+   pp.FullScreen_RefreshRateInHz = 0;
+   pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
+
+   if (FAILED(hr = _object->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
+     window, flag, &pp, &_device)))
+     {
+     WRN("CreateDevice failed: %x", hr);
+     Destroy();
+     return false;
+     }
+
+   LPDIRECT3DSURFACE9 backbuffer = NULL;
+   _device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer);
+   backbuffer->GetDesc(&_backbuffer_desc);
+   backbuffer->Release();
+
+   switch (dm.Format) {
+   case D3DFMT_A8R8G8B8:
+   case D3DFMT_X8R8G8B8:
+     _depth = 32;
+     break;
+   case D3DFMT_R5G6B5:
+     _depth = 16;
+     break;
+   default:
+     WRN("No supported format found");
+     Destroy();
+     return false;
+   }
+
+   //_render_to_texture = false;
+
+   _d3dpp = pp;
+   _device_lost = FALSE;
+   _scene_rendering = FALSE;
+   _width = rect.right - rect.left;
+   _height = rect.bottom - rect.top;
+   _window = window;
+
+   if (FAILED(CreateRenderTarget()))
+   {
+      ERR("Failed to create render target");
+      Destroy();
+      return false;
+   }
+
+   Log("initialized");
+   return true;
+}
+
+bool D3DDevice::Reset(int width, int height, int fullscreen)
+{
+   D3DPRESENT_PARAMETERS pp = _d3dpp;
+   _d3dpp.BackBufferWidth = (width > 0) ? width : _d3dpp.BackBufferWidth;
+   _d3dpp.BackBufferHeight = (height > 0) ? height : _d3dpp.BackBufferHeight;
+   _d3dpp.Windowed = (fullscreen == 1) ? FALSE : ((fullscreen == 0) ? TRUE : _d3dpp.Windowed);
+   if (FAILED(ResetDevice()))
+   {
+      WRN("Couldnt restore device");
+      _d3dpp = pp;
+      return SUCCEEDED(ResetDevice());
+   }
+   _width = _d3dpp.BackBufferWidth;
+   _height = _d3dpp.BackBufferHeight;
+   return true;
+}
+
+void D3DDevice::Destroy()
+{
+   //if (_render_target != NULL)
+   //{
+   //   _render_target->Release();
+   //   _render_target = NULL;
+   //}
+   if (_render_target_data != NULL)
+   {
+      _render_target_data->Release();
+      _render_target_data = NULL;
+   }
+   if (_device != NULL)
+   {
+      int num = _device->Release();
+      assert(num == 0);
+   }
+   if (_object != NULL)
+      _object->Release();
+   ResetParams();
+
+   INF("uninitialized");
+}
+
+void D3DDevice::ResetParams()
+{
+   _window = NULL;
+   _object = NULL;
+   _device = NULL;
+   _width = 0;
+   _height = 0;
+   _rot = 0;
+   _depth = 0;
+   _device_lost = false;
+   _scene_rendering = false;
+   ZeroMemory(&_d3dpp, sizeof(_d3dpp));
+   ZeroMemory(&_backbuffer_desc, sizeof(_backbuffer_desc));
+   //_render_target = NULL;
+   _render_target_data = NULL;
+   _render_data_updated = false;
+   _render_data.Resize();
+   //_original_render_target = NULL;
+   //_render_to_texture = false;
+}
+
+HRESULT D3DDevice::RestoreDevice()
+{
+   Log("restore");
+   assert(_device != NULL);
+
+   HRESULT hr = S_OK;
+
+   // Test the cooperative level to see if it's okay to render
+   if (SUCCEEDED(hr = _device->TestCooperativeLevel()))
+   {
+      _device_lost = FALSE;
+      DBG("render test ok");
+      return S_OK;
+   }
+
+   // If the device was lost, do not render until we get it back
+   if (hr == D3DERR_DEVICELOST)
+      return E_FAIL;
+
+   // Check if the device needs to be reset.
+   if (hr == D3DERR_DEVICENOTRESET)
+   {
+      if (FAILED(hr = ResetDevice()))
+         return hr;
+   }
+   return hr;
+}
+
+HRESULT D3DDevice::ResetDevice()
+{
+   DBG("reset");
+   HRESULT hr = S_OK;
+
+   _scene_rendering = FALSE;
+
+   // Release all video memory objects
+   // Bad to call such, make better
+   D3DVertexBufferCache::Current()->Uninitialize();
+
+   //if (_render_target != NULL)
+   //{
+   //   _render_target->Release();
+   //   _render_target = NULL;
+   //}
+   if (_render_target_data != NULL)
+   {
+      _render_target_data->Release();
+      _render_target_data = NULL;
+   }
+
+   // Reset the device
+   if (FAILED(hr = _device->Reset(&_d3dpp)))
+   {
+      ERR("D3DDevice: Reset of the device failed! Error (%X)", (DWORD)hr);
+      return hr;
+   }
+
+   // Store render target surface desc
+   LPDIRECT3DSURFACE9 backbuffer = NULL;
+   _device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer);
+   if (backbuffer != NULL)
+   {
+      backbuffer->GetDesc(&_backbuffer_desc);
+      backbuffer->Release();
+   }
+
+   // Initialize the app's device-dependent objects
+   hr = CreateRenderTarget();
+
+   if (FAILED(hr))
+   {
+      WRN("Restoration of device objects failed");
+      // Invalidate objects
+
+      return E_FAIL;
+   }
+
+   DBG("Device objects were successfuly restored");
+   _textures.Set(NULL);
+
+   //_device_objects_restored = true;
+   return S_OK;
+}
+
+bool D3DDevice::Begin()
+{
+   if (FAILED(RestoreDevice()))
+      return false;
+
+   //if (_render_to_texture && _render_target != NULL)
+   //{
+   //   if (FAILED(_device->GetRenderTarget(0, &_original_render_target)))
+   //      return false;
+   //   if (FAILED(_device->SetRenderTarget(0, _render_target)))
+   //      return false;
+   //}
+
+   HRESULT hr;
+   if (FAILED(hr = _device->BeginScene()))
+   {
+      WRN("Cannot begin scene: %X", (DWORD)hr);
+      return false;
+   }
+
+   //static const D3DVIEWPORT9 vp = {0, 0, _width, _height, 0.f, 1.f};
+   //_device->SetViewport(&vp);
+   //_device->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
+
+   //_device->Clear(0, NULL, D3DCLEAR_TARGET /*| D3DCLEAR_ZBUFFER*/, 0xff8080ff, 1.f, 0);
+   return true;
+}
+
+bool D3DDevice::End()
+{
+   _device->EndScene();
+   _device->Present(NULL, NULL, NULL, NULL);
+
+   _render_data_updated = false;
+
+   //if (_render_to_texture && _render_target != NULL && _original_render_target != NULL)
+   //{
+   //   if (FAILED(_device->SetRenderTarget(0, _original_render_target)))
+   //      return false;
+   //}
+
+   return true;
+}
+
+TArray<DWORD> &D3DDevice::GetRenderData()
+{
+   if (_render_data_updated)
+      return _render_data;
+   _render_data.Allocate(0);
+   if (_render_target_data == NULL)
+      return _render_data;
+
+   LPDIRECT3DSURFACE9 surf = NULL;
+   HRESULT hr;
+   if (FAILED(_device->GetRenderTarget(0, &surf)))
+      return _render_data;
+   if (FAILED(hr = _device->GetRenderTargetData(surf, _render_target_data)))
+   {
+      WRN("Failed to get render target data (%X)", (DWORD)hr);
+      surf->Release();
+      return _render_data;
+   }
+   D3DLOCKED_RECT lr;
+   if (FAILED(_render_target_data->LockRect(&lr, NULL, D3DLOCK_READONLY)))
+   {
+      surf->Release();
+      return _render_data;
+   }
+   _render_data.Allocate(_width * _height);
+
+   for (int i = 0; i < _height; i++)
+   {
+      CopyMemory(&_render_data[i * _width], (BYTE *)lr.pBits + i * lr.Pitch,
+         _width * sizeof(DWORD));
+   }
+
+   _render_target_data->UnlockRect();
+   _render_data_updated = true;
+   surf->Release();
+   return _render_data;
+}
+
+HRESULT D3DDevice::SetTexture(DWORD stage, LPDIRECT3DTEXTURE9 tex)
+{
+   if (stage >= 8)
+      return E_FAIL;
+   if (_textures.Length() <= (int)stage)
+      _textures.Allocate(stage + 1);
+   if (_textures[stage] != tex)
+   {
+      _textures[stage] = tex;
+      return _device->SetTexture(stage, tex);
+   }
+   return S_OK;
+}
+
+HRESULT D3DDevice::CreateRenderTarget()
+{
+   if (_device == NULL)
+      return E_FAIL;
+   //if (_render_target != NULL &&
+   if (_render_target_data != NULL)
+      return S_OK;
+
+   //if (FAILED(_device->CreateRenderTarget(_width, _height, _backbuffer_desc.Format,
+   //   D3DMULTISAMPLE_NONE, 0, FALSE, &_render_target, NULL)))
+   //{
+   //   return E_FAIL;
+   //}
+   if (FAILED(_device->CreateOffscreenPlainSurface(_backbuffer_desc.Width,
+      _backbuffer_desc.Height, _backbuffer_desc.Format, D3DPOOL_SYSTEMMEM,
+      &_render_target_data, NULL)))
+   {
+      return E_FAIL;
+   }
+   return S_OK;
+}
diff --git a/src/modules/engines/direct3d/evas_direct3d_device.h b/src/modules/engines/direct3d/evas_direct3d_device.h
new file mode 100644 (file)
index 0000000..c5a4b49
--- /dev/null
@@ -0,0 +1,87 @@
+#ifndef __EVAS_DIRECT3D_DEVICE_H__
+#define __EVAS_DIRECT3D_DEVICE_H__
+
+#include "evas_engine.h"
+
+#include <assert.h>
+
+#include "ref.h"
+#include "array.h"
+
+
+class D3DDevice : virtual public Referenc
+{
+public:
+   D3DDevice();
+
+   bool Init(HWND window, int depth, bool fullscreen = false);
+   bool Reset(int width, int height, int fullscreen);
+   void Destroy();
+   bool Begin();
+   bool End();
+
+   inline LPDIRECT3DDEVICE9 GetDevice();
+   inline int GetWidth();
+   inline int GetHeight();
+   inline HWND GetWindow();
+   inline bool GetFullscreen();
+
+   TArray<DWORD> &GetRenderData();
+
+   HRESULT SetTexture(DWORD stage, LPDIRECT3DTEXTURE9 tex);
+
+private:
+   HRESULT RestoreDevice();
+   HRESULT ResetDevice();
+   void ResetParams();
+
+   HRESULT CreateRenderTarget();
+
+private:
+   HWND _window;
+   LPDIRECT3D9 _object;
+   LPDIRECT3DDEVICE9 _device;
+   int _width;
+   int _height;
+   int _rot;
+   int _depth;
+   bool _device_lost;
+   bool _scene_rendering;
+   D3DPRESENT_PARAMETERS _d3dpp;
+   D3DSURFACE_DESC _backbuffer_desc;
+   //LPDIRECT3DSURFACE9 _render_target;
+   LPDIRECT3DSURFACE9 _render_target_data;
+   //LPDIRECT3DSURFACE9 _original_render_target;
+   //bool _render_to_texture;
+   TArray<DWORD> _render_data;
+   bool _render_data_updated;
+
+   TArray<LPDIRECT3DTEXTURE9> _textures;
+};
+
+LPDIRECT3DDEVICE9 D3DDevice::GetDevice()
+{
+   return _device;
+}
+
+int D3DDevice::GetWidth()
+{
+   return _width;
+}
+
+int D3DDevice::GetHeight()
+{
+   return _height;
+}
+
+HWND D3DDevice::GetWindow()
+{
+   return _window;
+}
+
+bool D3DDevice::GetFullscreen()
+{
+   return (_d3dpp.Windowed == 0);
+}
+
+#endif  // __EVAS_DIRECT3D_DEVICE_H__
diff --git a/src/modules/engines/direct3d/evas_direct3d_image_cache.cpp b/src/modules/engines/direct3d/evas_direct3d_image_cache.cpp
new file mode 100644 (file)
index 0000000..aa44eb9
--- /dev/null
@@ -0,0 +1,436 @@
+#include "evas_direct3d_image_cache.h"
+
+#include "evas_direct3d_device.h"
+
+#include <assert.h>
+
+Ref<D3DImageCache> D3DImageCache::_this;
+
+D3DImageCache::D3DImageCache()
+{
+   _max_width = 512;
+   _max_height = 512;
+   _margin = 0;
+}
+
+D3DImageCache::~D3DImageCache()
+{
+   Uninitialize();
+}
+
+D3DImageCache *D3DImageCache::Current()
+{
+   if (_this.IsNull())
+      _this = new D3DImageCache();
+   return _this;
+}
+
+void D3DImageCache::SetCurrent(D3DImageCache *obj)
+{
+   _this = obj;
+}
+
+void D3DImageCache::Uninitialize()
+{
+   for (int i = 0; i < _cache.Length(); i++)
+   {
+      // In normal case they all will be NULL
+      if (_cache[i].texture != NULL)
+         _cache[i].texture->Release();
+   }
+   _cache.Resize();
+}
+
+bool D3DImageCache::SelectImageToDevice(D3DDevice *d3d, int id)
+{
+   if (id < 0 || id >= _cache.Length())
+      return false;
+   assert(_cache[id].texture != NULL);
+   return SUCCEEDED(d3d->SetTexture(_cache[id].stage, _cache[id].texture));
+}
+
+void D3DImageCache::RemoveImageUser(int id)
+{
+   if (id < 0 || id >= _cache.Length())
+      return;
+   assert(_cache[id].texture != NULL);
+   _cache[id].users--;
+   if (_cache[id].users == 0)
+   {
+      _cache[id].texture->Release();
+      ZeroMemory(&_cache[id], sizeof(_cache[id]));
+   }
+}
+
+void D3DImageCache::AddImageUser(int id)
+{
+   if (id < 0 || id >= _cache.Length())
+      return;
+   assert(_cache[id].texture != NULL);
+   _cache[id].users++;
+}
+
+bool D3DImageCache::InsertImage(D3DDevice *d3d, DWORD *data, int w, int h, CacheEntryInfo &info)
+{
+   CacheEntry *ce = NULL;
+   int id = -1;
+   for (int i = 0; i < _cache.Length(); i++)
+   {
+      if (!_cache[i].locked && RequestInsert(_cache[i], w, h))
+      {
+         ce = &_cache[i];
+         id = i;
+         break;
+      }
+   }
+   if (ce == NULL)
+   {
+      CacheEntry new_entry;
+      if (!CreateEntry(d3d, new_entry, w, h))
+         return false;
+      for (id = 0; id < _cache.Length(); id++)
+      {
+         if (_cache[id].texture == NULL)
+            break;
+      }
+
+      if (id < _cache.Length())
+      {
+         _cache[id] = new_entry;
+         ce = &_cache[id];
+      }
+      else
+      {
+         _cache.Add(new_entry);
+         ce = _cache.Last();
+         id = _cache.Length() - 1;
+      }
+   }
+
+   assert(ce != NULL && ce->texture != NULL);
+
+   if (!InsertData(*ce, data, w, h))
+      return false;
+
+   info.id = id;
+   info.u = FLOAT(ce->cur_x) / FLOAT(ce->width);
+   info.v = FLOAT(ce->cur_y) / FLOAT(ce->height);
+   info.du = FLOAT(w) / FLOAT(ce->width);
+   info.dv = FLOAT(h) / FLOAT(ce->height);
+   info.width = w;
+   info.height = h;
+
+   UpdateInsert(*ce, w, h);
+   return true;
+}
+
+bool D3DImageCache::InsertImage(D3DDevice *d3d, int id, DWORD *data, int w, int h, CacheEntryInfo &info)
+{
+   if (id < 0 || id >= _cache.Length())
+      return false;
+   assert(_cache[id].texture != NULL);
+   CacheEntry *ce = &_cache[id];
+   if (!RequestInsert(*ce, w, h))
+      return false;
+   if (!InsertData(*ce, data, w, h))
+      return false;
+
+   info.id = id;
+   info.u = FLOAT(ce->cur_x) / FLOAT(ce->width);
+   info.v = FLOAT(ce->cur_y) / FLOAT(ce->height);
+   info.du = FLOAT(w) / FLOAT(ce->width);
+   info.dv = FLOAT(h) / FLOAT(ce->height);
+   info.width = w;
+   info.height = h;
+
+   UpdateInsert(*ce, w, h);
+   return true;
+}
+
+bool D3DImageCache::CreateImage(D3DDevice *d3d, int w, int h, bool locked, CacheEntryInfo &info)
+{
+   int id;
+   CacheEntry new_entry;
+   CacheEntry *ce = NULL;
+
+   if (!CreateEntry(d3d, new_entry, w, h, true))
+      return false;
+   for (id = 0; id < _cache.Length(); id++)
+   {
+      if (_cache[id].texture == NULL)
+         break;
+   }
+
+   if (id < _cache.Length())
+   {
+      _cache[id] = new_entry;
+      ce = &_cache[id];
+   }
+   else
+   {
+      _cache.Add(new_entry);
+      ce = _cache.Last();
+      id = _cache.Length() - 1;
+   }
+
+   assert(ce != NULL && ce->texture != NULL);
+
+   // Fill with zero
+   if (!InsertData(*ce, NULL, w, h))
+      return false;
+
+   info.id = id;
+   info.u = 0;
+   info.v = 0;
+   info.du = 1;
+   info.dv = 1;
+   info.width = w;
+   info.height = h;
+
+   UpdateInsert(*ce, 0, 0);
+   ce->locked = locked;
+   return true;
+}
+
+bool D3DImageCache::ResizeImage(D3DDevice *d3d, int nw, int nh, int id)
+{
+   if (id < 0 || id >= _cache.Length())
+      return false;
+   assert(_cache[id].texture != NULL);
+   CacheEntry *ce = &_cache[id];
+
+   if (ce->width == nw && ce->height == nh)
+      return true;
+
+   LPDIRECT3DTEXTURE9 tex = NULL;
+
+   HRESULT hr;
+   if (FAILED(hr = d3d->GetDevice()->CreateTexture(nw, nh, 0, 0, D3DFMT_A8R8G8B8,
+      D3DPOOL_MANAGED, &tex, NULL)))
+   {
+      WRN("Failed to create texture: %X", hr);
+      return false;
+   }
+   assert(tex != NULL);
+
+   ce->texture->Release();
+   ce->texture = tex;
+   ce->width = nw;
+   ce->height = nh;
+   return true;
+}
+
+bool D3DImageCache::RequestInsert(CacheEntry &entry, int w, int h)
+{
+   // If we already have large image entry
+   if (entry.width > _max_width || entry.height > _max_height)
+      return false;
+   // If requested size does not fit into this entry at all
+   if (entry.height - entry.cur_h < h + _margin * 2 || entry.width < w + _margin * 2)
+      return false;
+
+   // If requested size does not fit into the current line of the entry
+   if (entry.width - entry.cur_x < w + _margin * 2)
+   {
+      entry.cur_y = entry.cur_h + _margin;
+      entry.cur_x = _margin;
+      return true;
+   }
+   entry.cur_x += _margin;
+
+   return true;
+}
+
+bool D3DImageCache::CreateEntry(D3DDevice *d3d, CacheEntry &entry, int w, int h, bool exact_size)
+{
+   int width = exact_size ? w : max(_max_width, w);
+   int height = exact_size ? h : max(_max_height, h);
+   HRESULT hr;
+   if (FAILED(hr = d3d->GetDevice()->CreateTexture(width, height, 0, 0, D3DFMT_A8R8G8B8,
+      D3DPOOL_MANAGED, &entry.texture, NULL)))
+   {
+      WRN("Failed to create texture: %X", hr);
+      return false;
+   }
+
+   entry.cur_x = entry.cur_y = entry.cur_h = 0;
+   entry.width = width;
+   entry.height = height;
+   entry.users = 0;
+   entry.locked = false;
+   entry.stage = 0;
+   return true;
+}
+
+bool D3DImageCache::InsertData(CacheEntry &entry, DWORD *data, int w, int h)
+{
+   if (entry.texture == NULL)
+      return false;
+
+   RECT rc = {entry.cur_x, entry.cur_y, entry.cur_x + w, entry.cur_y + h};
+   D3DLOCKED_RECT lr;
+   if (FAILED(entry.texture->LockRect(0, &lr, &rc, 0)))
+   {
+      WRN("Failed to lock texture");
+      return false;
+   }
+
+   if (data != NULL)
+   {
+      for (int i = 0; i < h; i++)
+         CopyMemory(((BYTE *)lr.pBits) + i * lr.Pitch, data + i * w, sizeof(DWORD) * w);
+   }
+   else
+   {
+      for (int i = 0; i < h; i++)
+         ZeroMemory(((BYTE *)lr.pBits) + i * lr.Pitch, sizeof(DWORD) * w);
+   }
+
+   if (FAILED(entry.texture->UnlockRect(0)))
+   {
+      WRN("Failed to unlock texture");
+      return false;
+   }
+   return true;
+}
+
+
+bool D3DImageCache::RetrieveData(CacheEntry &entry, DWORD *data, int w, int h)
+{
+   if (entry.texture == NULL || data == NULL)
+      return false;
+
+   RECT rc = {entry.cur_x, entry.cur_y, entry.cur_x + w, entry.cur_y + h};
+   D3DLOCKED_RECT lr;
+   if (FAILED(entry.texture->LockRect(0, &lr, &rc, D3DLOCK_READONLY)))
+   {
+      WRN("Failed to lock texture");
+      return false;
+   }
+
+   for (int i = 0; i < h; i++)
+      CopyMemory(data + i * w, ((BYTE *)lr.pBits) + i * lr.Pitch, sizeof(DWORD) * w);
+
+   if (FAILED(entry.texture->UnlockRect(0)))
+   {
+      WRN("Failed to unlock texture");
+      return false;
+   }
+   return true;
+}
+
+void D3DImageCache::UpdateInsert(CacheEntry &entry, int w, int h)
+{
+   entry.cur_h = max(entry.cur_h, entry.cur_y + h + _margin);
+   entry.cur_x += w + _margin;
+   entry.users++;
+}
+
+bool D3DImageCache::UpdateImageData(CacheEntryInfo &info, DWORD *data)
+{
+   assert(data != NULL);
+   if (info.id < 0 || info.id >= _cache.Length())
+      return false;
+   CacheEntry ce_copy = _cache[info.id];
+   ce_copy.cur_x = int(info.u * FLOAT(ce_copy.width));
+   ce_copy.cur_y = int(info.v * FLOAT(ce_copy.height));
+   return InsertData(ce_copy, data, info.width, info.height);
+}
+
+bool D3DImageCache::UpdateImageDataWithDirtyInfo(CacheEntryInfo &info, DWORD *data, POINT *dirty)
+{
+   if (info.id < 0 || info.id >= _cache.Length())
+      return false;
+   CacheEntry &entry = _cache[info.id];
+   if (entry.texture == NULL)
+      return false;
+
+   RECT rc = {0, 0, entry.width, entry.height};
+   D3DLOCKED_RECT lr;
+   if (FAILED(entry.texture->LockRect(0, &lr, &rc, 0)))
+   {
+      WRN("Failed to lock texture");
+      return false;
+   }
+
+   if (data != NULL)
+   {
+      for (int i = 0; i < rc.bottom; i++)
+      {
+         if (dirty[i].x < 0 && dirty[i].y < 0)
+            continue;
+         if (dirty[i].x >= 0 && dirty[i].y >= 0)
+         {
+            CopyMemory(((BYTE *)lr.pBits) + i * lr.Pitch + dirty[i].x * 4,
+               data + i * rc.right + dirty[i].x, sizeof(DWORD) * (dirty[i].y - dirty[i].x + 1));
+            dirty[i].y = -dirty[i].y;
+         }
+         else if (dirty[i].x >= 0 && dirty[i].y < 0)
+         {
+            ZeroMemory(((BYTE *)lr.pBits) + i * lr.Pitch + dirty[i].x * 4,
+               sizeof(DWORD) * (-dirty[i].y - dirty[i].x + 1));
+            dirty[i].x = -dirty[i].x;
+         }
+      }
+   }
+   else
+   {
+      for (int i = 0; i < rc.bottom; i++)
+      {
+         if (dirty[i].x < 0 || dirty[i].y < 0)
+            continue;
+         ZeroMemory(((BYTE *)lr.pBits) + i * lr.Pitch + dirty[i].x * 4,
+            sizeof(DWORD) * (dirty[i].y - dirty[i].x + 1));
+      }
+   }
+
+   if (FAILED(entry.texture->UnlockRect(0)))
+   {
+      WRN("Failed to unlock texture");
+      return false;
+   }
+   return true;
+}
+
+bool D3DImageCache::UpdateImageDataDiscard(CacheEntryInfo &info, DWORD *data)
+{
+   assert(data != NULL);
+   if (info.id < 0 || info.id >= _cache.Length())
+      return false;
+   CacheEntry &entry = _cache[info.id];
+   if (entry.texture == NULL)
+      return false;
+
+   RECT rc = {0, 0, entry.width, entry.height};
+   D3DLOCKED_RECT lr;
+   if (FAILED(entry.texture->LockRect(0, &lr, &rc, 0)))
+   {
+      WRN("Failed to lock texture");
+      return false;
+   }
+
+   for (int i = 0; i < rc.bottom; i++)
+   {
+      CopyMemory(((BYTE *)lr.pBits) + i * lr.Pitch,
+         data + i * rc.right, sizeof(DWORD) * rc.right);
+   }
+
+   if (FAILED(entry.texture->UnlockRect(0)))
+   {
+      WRN("Failed to unlock texture");
+      return false;
+   }
+   return true;
+}
+
+bool D3DImageCache::GetImageData(CacheEntryInfo &info, TArray<DWORD> &data)
+{
+   if (info.id < 0 || info.id >= _cache.Length())
+      return false;
+   CacheEntry ce_copy = _cache[info.id];
+   ce_copy.cur_x = int(info.u * FLOAT(ce_copy.width));
+   ce_copy.cur_y = int(info.v * FLOAT(ce_copy.height));
+   data.Allocate(info.width * info.height);
+
+   return RetrieveData(ce_copy, data.Data(), info.width, info.height);
+}
diff --git a/src/modules/engines/direct3d/evas_direct3d_image_cache.h b/src/modules/engines/direct3d/evas_direct3d_image_cache.h
new file mode 100644 (file)
index 0000000..6fb4c18
--- /dev/null
@@ -0,0 +1,108 @@
+#ifndef __EVAS_DIRECT3D_IMAGE_CACHE_H__
+#define __EVAS_DIRECT3D_IMAGE_CACHE_H__
+
+#include "evas_engine.h"
+
+#include "ref.h"
+#include "array.h"
+
+class D3DDevice;
+
+class D3DImageCache : virtual public Referenc
+{
+public:
+   struct CacheEntryInfo
+   {
+      int id;
+      int width, height;
+      FLOAT u, v;
+      FLOAT du, dv;
+   };
+
+public:
+   ~D3DImageCache();
+
+   static D3DImageCache *Current();
+   static void SetCurrent(D3DImageCache *obj);
+
+   inline void SetMaxSize(int w, int h);
+   inline void SetMargin(int margin);
+
+   bool InsertImage(D3DDevice *d3d, DWORD *data, int w, int h, CacheEntryInfo &info);
+   bool InsertImage(D3DDevice *d3d, int id, DWORD *data, int w, int h, CacheEntryInfo &info);
+   bool CreateImage(D3DDevice *d3d, int w, int h, bool locked, CacheEntryInfo &info);
+   bool ResizeImage(D3DDevice *d3d, int nw, int nh, int id);
+   bool SelectImageToDevice(D3DDevice *d3d, int id);
+   void RemoveImageUser(int id);
+   void AddImageUser(int id);
+   bool UpdateImageData(CacheEntryInfo &info, DWORD *data);
+   bool UpdateImageDataWithDirtyInfo(CacheEntryInfo &info, DWORD *data, POINT *dirty);
+   bool UpdateImageDataDiscard(CacheEntryInfo &info, DWORD *data);
+   bool GetImageData(CacheEntryInfo &info, TArray<DWORD> &data);
+   void Uninitialize();
+
+   inline int GetImageWidth(int image_id);
+   inline int GetImageHeight(int image_id);
+
+   inline void SetImageStage(int image_id, int stage);
+
+private:
+   struct CacheEntry
+   {
+      LPDIRECT3DTEXTURE9 texture;
+      int width;
+      int height;
+      int cur_x;
+      int cur_y;
+      int cur_h;
+      int users;
+      bool locked;
+      int stage;
+   };
+
+private:
+   D3DImageCache();
+
+   bool RequestInsert(CacheEntry &entry, int w, int h);
+   bool CreateEntry(D3DDevice *d3d, CacheEntry &entry, int w, int h, bool exact_size = false);
+   bool InsertData(CacheEntry &entry, DWORD *data, int w, int h);
+   bool RetrieveData(CacheEntry &entry, DWORD *data, int w, int h);
+   void UpdateInsert(CacheEntry &entry, int w, int h);
+
+private:
+   TArray<CacheEntry> _cache;
+   int _max_width;
+   int _max_height;
+
+   int _margin;
+
+   static Ref<D3DImageCache> _this;
+};
+
+void D3DImageCache::SetMaxSize(int w, int h)
+{
+   _max_width = w;
+   _max_height = h;
+}
+
+void D3DImageCache::SetMargin(int margin)
+{
+   _margin = margin;
+}
+
+int D3DImageCache::GetImageWidth(int image_id)
+{
+   return _cache[image_id].width;
+}
+
+int D3DImageCache::GetImageHeight(int image_id)
+{
+   return _cache[image_id].height;
+}
+
+void D3DImageCache::SetImageStage(int image_id, int stage)
+{
+   _cache[image_id].stage = stage;
+}
+
+#endif  // __EVAS_DIRECT3D_IMAGE_CACHE_H__
diff --git a/src/modules/engines/direct3d/evas_direct3d_main.cpp b/src/modules/engines/direct3d/evas_direct3d_main.cpp
new file mode 100644 (file)
index 0000000..566cc9a
--- /dev/null
@@ -0,0 +1,774 @@
+// Force the layered windows APIs to be visible.
+#define _WIN32_WINNT 0x0500
+
+#include "evas_engine.h"
+#include <assert.h>
+
+#include <d3dx9.h>
+
+#include "evas_direct3d_device.h"
+#include "evas_direct3d_context.h"
+#include "evas_direct3d_shader_pack.h"
+#include "evas_direct3d_scene.h"
+#include "evas_direct3d_image_cache.h"
+#include "evas_direct3d_object_line.h"
+#include "evas_direct3d_object_rect.h"
+#include "evas_direct3d_object_image.h"
+#include "evas_direct3d_vertex_buffer_cache.h"
+#include "evas_direct3d_object_font.h"
+
+// Internal structure that joins two types of objects
+struct ImagePtr
+{
+   Ref<D3DObjectImage> ref;
+   RGBA_Image *img;
+};
+
+struct DevicePtr
+{
+   Ref<D3DDevice> device;
+   Ref<D3DScene> scene;
+   Ref<D3DContext> context;
+   Ref<D3DImageCache> image_cache;
+   Ref<D3DShaderPack> shader_pack;
+   Ref<D3DVertexBufferCache> vb_cache;
+
+   int fonts_buffer_image_id;
+
+   // Layered windows cannot render D3D in the normal way
+   bool layered;
+
+   // Window shape mask
+   struct
+   {
+      // Width and height may be different from target size
+      int width;
+      int height;
+      // Pointer to external memory location, dont do anything with it
+      unsigned char *mask;
+   } shape;
+
+   // GDI output target
+   struct
+   {
+      HBITMAP image;
+      HDC hdc;
+      BITMAPINFO info;
+      BYTE *data;
+   } dib;
+
+};
+
+DevicePtr *SelectDevice(Direct3DDeviceHandler d3d)
+{
+   DevicePtr *dev_ptr = (DevicePtr *)d3d;
+   D3DImageCache::SetCurrent(dev_ptr->image_cache);
+   D3DShaderPack::SetCurrent(dev_ptr->shader_pack);
+   D3DVertexBufferCache::SetCurrent(dev_ptr->vb_cache);
+   return dev_ptr;
+}
+
+void DeleteDIBObjects(DevicePtr *dev_ptr)
+{
+   assert(dev_ptr != NULL);
+   if (dev_ptr->dib.image != NULL)
+      DeleteObject(dev_ptr->dib.image);
+   if (dev_ptr->dib.hdc != NULL)
+      DeleteDC(dev_ptr->dib.hdc);
+   ZeroMemory(&dev_ptr->dib, sizeof(dev_ptr->dib));
+}
+
+bool CreateDIBObjects(DevicePtr *dev_ptr)
+{
+   assert(dev_ptr != NULL);
+   if ((dev_ptr->dib.hdc = CreateCompatibleDC(NULL)) == NULL)
+   {
+      WRN("Failed to create compatible DC");
+      return false;
+   }
+   ZeroMemory(&dev_ptr->dib.info, sizeof(dev_ptr->dib.info));
+   dev_ptr->dib.info.bmiHeader.biSize = sizeof(dev_ptr->dib.info.bmiHeader);
+   dev_ptr->dib.info.bmiHeader.biBitCount = 32;
+   dev_ptr->dib.info.bmiHeader.biWidth = dev_ptr->device->GetWidth();
+   dev_ptr->dib.info.bmiHeader.biHeight = -dev_ptr->device->GetHeight();
+   dev_ptr->dib.info.bmiHeader.biCompression = BI_RGB;
+   dev_ptr->dib.info.bmiHeader.biPlanes = 1;
+   if ((dev_ptr->dib.image = CreateDIBSection(dev_ptr->dib.hdc, &dev_ptr->dib.info,
+      DIB_RGB_COLORS, (void **)&dev_ptr->dib.data, NULL, 0)) == NULL)
+   {
+      WRN("Failed to create dib section");
+      DeleteDIBObjects(dev_ptr);
+      return false;
+   }
+   assert(dev_ptr->dib.data != NULL);
+   GdiFlush();
+   return true;
+}
+
+
+
+
+extern "C" {
+
+Direct3DDeviceHandler evas_direct3d_init(HWND window, int depth, int fullscreen)
+{
+   Ref<D3DDevice> device = new D3DDevice();
+   if (!device->Init(window, depth, fullscreen == 1))
+      return NULL;
+
+   D3DImageCache::SetCurrent(NULL);
+   D3DShaderPack::SetCurrent(NULL);
+   D3DVertexBufferCache::SetCurrent(NULL);
+
+   if (!D3DShaderPack::Current()->Initialize(device))
+   {
+      ERR("Failed to build shader pack");
+      device->Destroy();
+      return NULL;
+   }
+
+   DevicePtr *dev_ptr = new DevicePtr;
+   ZeroMemory(dev_ptr, sizeof(DevicePtr));
+   dev_ptr->device = device;
+   dev_ptr->scene = new D3DScene();
+   dev_ptr->context = new D3DContext();
+   dev_ptr->image_cache = D3DImageCache::Current();
+   dev_ptr->shader_pack = D3DShaderPack::Current();
+   dev_ptr->vb_cache = D3DVertexBufferCache::Current();
+   dev_ptr->fonts_buffer_image_id = -1;
+
+   D3DImageCache::CacheEntryInfo info;
+   if (!D3DImageCache::Current()->CreateImage(device, device->GetWidth(), device->GetHeight(),
+      true, info))
+   {
+      WRN("Failed to create fonts image buffer");
+      return NULL;
+   }
+   dev_ptr->fonts_buffer_image_id = info.id;
+   D3DImageCache::Current()->SetImageStage(info.id, 1);
+
+   return (Direct3DDeviceHandler)dev_ptr;
+}
+
+void
+evas_direct3d_free(Direct3DDeviceHandler d3d)
+{
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+
+   DeleteDIBObjects(dev_ptr);
+
+   dev_ptr->context = NULL;
+   dev_ptr->scene = NULL;
+   dev_ptr->image_cache = NULL;
+   dev_ptr->shader_pack = NULL;
+   D3DShaderPack::Current()->Uninitialize();
+   D3DImageCache::Current()->Uninitialize();
+   D3DVertexBufferCache::Current()->Uninitialize();
+   D3DShaderPack::SetCurrent(NULL);
+   D3DImageCache::SetCurrent(NULL);
+   D3DVertexBufferCache::SetCurrent(NULL);
+
+   dev_ptr->device = NULL;
+   delete dev_ptr;
+
+   DBG("uninitialized");
+}
+
+void
+evas_direct3d_resize(Direct3DDeviceHandler d3d, int width, int height)
+{
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   D3DDevice *device = dev_ptr->device;
+   if (!device->Reset(width, height, -1))
+   {
+      ERR("Failed to resize");
+      return;
+   }
+   if (!D3DImageCache::Current()->ResizeImage(device, width, height,
+      dev_ptr->fonts_buffer_image_id))
+   {
+      WRN("Failed to resize fonts image buffer");
+   }
+   if (dev_ptr->layered)
+   {
+      DeleteDIBObjects(dev_ptr);
+      if (!CreateDIBObjects(dev_ptr))
+         WRN("Failed to create dib objects");
+   }
+}
+
+void
+evas_direct3d_set_fullscreen(Direct3DDeviceHandler d3d, int width, int height, int fullscreen)
+{
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   D3DDevice *device = dev_ptr->device;
+
+   if (width < 0)
+      width = ::GetSystemMetrics(SM_CXSCREEN);
+   if (height < 0)
+      height = ::GetSystemMetrics(SM_CYSCREEN);
+
+   if (!device->Reset(width, height, fullscreen))
+   {
+      WRN("Failed to resize");
+      return;
+   }
+   if (!D3DImageCache::Current()->ResizeImage(device, width, height,
+      dev_ptr->fonts_buffer_image_id))
+   {
+      WRN("Failed to resize fonts image buffer");
+   }
+
+   if (fullscreen == 0)
+      InvalidateRect(HWND_DESKTOP, NULL, TRUE);
+}
+
+void
+evas_direct3d_set_layered(Direct3DDeviceHandler d3d, int layered,
+   int mask_width, int mask_height, unsigned char *mask)
+{
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   dev_ptr->layered = (layered != 0);
+   dev_ptr->shape.width = mask_width;
+   dev_ptr->shape.height = mask_height;
+   dev_ptr->shape.mask = mask;
+
+   if (dev_ptr->layered && dev_ptr->dib.data == NULL)
+      CreateDIBObjects(dev_ptr);
+   else if (!dev_ptr->layered)
+      DeleteDIBObjects(dev_ptr);
+}
+
+void
+evas_direct3d_context_color_set(Direct3DDeviceHandler d3d, int r, int g, int b, int a)
+{
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   dev_ptr->context->color = ((a & 0xff) << 24) | ((r & 0xff) << 16) |
+      ((g & 0xff) << 8) | (b & 0xff);
+}
+
+void
+evas_direct3d_context_set_multiplier(Direct3DDeviceHandler d3d, int r, int g, int b, int a)
+{
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   dev_ptr->context->color_mul = ((a & 0xff) << 24) | ((r & 0xff) << 16) |
+      ((g & 0xff) << 8) | (b & 0xff);
+}
+
+void
+evas_direct3d_render_all(Direct3DDeviceHandler d3d)
+{
+   DBG("render");
+   assert(d3d != NULL);
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   D3DDevice *device = dev_ptr->device;
+   D3DScene *scene = dev_ptr->scene;
+
+   if (!device->Begin())
+      return;
+
+   device->GetDevice()->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
+   device->GetDevice()->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
+   device->GetDevice()->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
+
+   //device->GetDevice()->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
+   //device->GetDevice()->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
+
+   D3DObjectLine::BeginCache();
+   D3DObjectRect::BeginCache();
+   D3DObjectImage::BeginCache();
+   scene->DrawAll(device);
+   D3DObjectLine::EndCache(device);
+   D3DObjectRect::EndCache(device);
+   D3DObjectImage::EndCache(device);
+   D3DObjectFont::EndCache(device);
+
+   device->End();
+
+   if (dev_ptr->layered && !device->GetFullscreen() && dev_ptr->dib.data != NULL)
+   {
+      HDC hdc = GetDC(device->GetWindow());
+      if (hdc != NULL)
+      {
+         POINT dest = {0, 0};
+         POINT src = {0, 0};
+         SIZE client = {device->GetWidth(), device->GetHeight()};
+         BLENDFUNCTION blend_func = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA};
+
+         if (device->GetRenderData().Length() == client.cx * client.cy)
+         {
+            CopyMemory(dev_ptr->dib.data, device->GetRenderData().Data(),
+               sizeof(DWORD) * client.cx * client.cy);
+         }
+
+         for (int i = 0; i < client.cy; i++)
+         {
+            for (int j = 0; j < client.cx; j++)
+            {
+               int mask_i = int(dev_ptr->shape.height * float(i) / float(client.cy));
+               int mask_j = int(dev_ptr->shape.width * float(j) / float(client.cx));
+               if (mask_i < 0)
+                  mask_i = 0;
+               else if (mask_i >= dev_ptr->shape.height)
+                  mask_i = dev_ptr->shape.height - 1;
+               if (mask_j < 0)
+                  mask_j = 0;
+               else if (mask_j >= dev_ptr->shape.width)
+                  mask_j = dev_ptr->shape.width - 1;
+               BYTE mask_b = dev_ptr->shape.mask[mask_i * dev_ptr->shape.width + mask_j];
+               float alpha = float(mask_b) / 255.f;
+
+               dev_ptr->dib.data[j * 4 + 0 + i * 4 * client.cx] = BYTE(float(dev_ptr->dib.data[j * 4 + 0 + i * 4 * client.cx]) * alpha);
+               dev_ptr->dib.data[j * 4 + 1 + i * 4 * client.cx] = BYTE(float(dev_ptr->dib.data[j * 4 + 1 + i * 4 * client.cx]) * alpha);
+               dev_ptr->dib.data[j * 4 + 2 + i * 4 * client.cx] = BYTE(float(dev_ptr->dib.data[j * 4 + 2 + i * 4 * client.cx]) * alpha);
+               dev_ptr->dib.data[j * 4 + 3 + i * 4 * client.cx] = mask_b;
+            }
+         }
+         HGDIOBJ prev_obj = SelectObject(dev_ptr->dib.hdc, dev_ptr->dib.image);
+         ClientToScreen(device->GetWindow(), &dest);
+
+         UpdateLayeredWindow(device->GetWindow(), hdc, &dest, &client,
+            dev_ptr->dib.hdc, &src, 0, &blend_func, ULW_ALPHA);
+
+         SelectObject(dev_ptr->dib.hdc, prev_obj);
+         ReleaseDC(device->GetWindow(), hdc);
+      }
+   }
+   scene->FreeObjects();
+}
+
+void evas_direct3d_line_draw(Direct3DDeviceHandler d3d, int x1, int y1, int x2, int y2)
+{
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   D3DDevice *device = dev_ptr->device;
+   D3DScene *scene = dev_ptr->scene;
+   D3DContext *context = dev_ptr->context;
+
+   Ref<D3DObjectLine> line = scene->GetFreeObject<D3DObjectLine>();
+   if (line == NULL)
+   {
+      line = new D3DObjectLine();
+      scene->AddObject(line);
+      DBG("New line object (total objects: %d)", scene->GetObjectCount());
+   }
+   else
+   {
+      line->SetFree(false);
+      DBG("Line reused (object: %p)", line.Addr());
+   }
+
+   line->Setup(
+      2.f * float(x1) / float(device->GetWidth()) - 1.f,
+      2.f * (1.f - float(y1) / float(device->GetHeight())) - 1.f,
+      2.f * float(x2) / float(device->GetWidth()) - 1.f,
+      2.f * (1.f - float(y2) / float(device->GetHeight())) - 1.f,
+      context->color);
+}
+
+void evas_direct3d_rectangle_draw(Direct3DDeviceHandler d3d, int x, int y, int w, int h)
+{
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   D3DDevice *device = dev_ptr->device;
+   D3DScene *scene = dev_ptr->scene;
+   D3DContext *context = dev_ptr->context;
+
+   Ref<D3DObjectRect> rect = scene->GetFreeObject<D3DObjectRect>();
+   if (rect == NULL)
+   {
+      rect = new D3DObjectRect();
+      scene->AddObject(rect);
+      DBG("New rect object (total objects: %d)", scene->GetObjectCount());
+   }
+   else
+   {
+      rect->SetFree(false);
+      DBG("Rect reused (object: %p)", rect.Addr());
+   }
+
+   rect->Setup(
+      2.f * float(x) / float(device->GetWidth()) - 1.f,
+      2.f * (1.f - float(y) / float(device->GetHeight())) - 1.f,
+      2.f * float(w) / float(device->GetWidth()),
+      -2.f * float(h) / float(device->GetHeight()),
+      context->color);
+}
+
+Direct3DImageHandler evas_direct3d_image_load(Direct3DDeviceHandler d3d,
+   const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
+{
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   D3DDevice *device = dev_ptr->device;
+   D3DScene *scene = dev_ptr->scene;
+
+   RGBA_Image *evas_image = evas_common_load_image_from_file(file, key, lo);
+   if (evas_image == NULL)
+   {
+      WRN("Failed to load image from %s", file);
+      return NULL;
+   }
+   int image_width = evas_image->cache_entry.w;
+   int image_height = evas_image->cache_entry.h;
+   assert(image_width > 0 && image_height > 0);
+
+   D3DImageCache::CacheEntryInfo info;
+   ZeroMemory(&info, sizeof(info));
+   info.id = -1;
+
+   Ref<D3DObjectImage> image = new D3DObjectImage();
+   image->Init(info.u, info.v, info.du, info.dv, info.id,
+      info.width, info.height, evas_image->cache_entry.file);
+   image->SetFree(true);
+   scene->AddObject(image);
+
+   DBG("New image object (total objects: %d)", scene->GetObjectCount());
+
+   ImagePtr *ptr = new ImagePtr;
+   ptr->ref = image;
+   ptr->img = evas_image;
+
+   return (Direct3DImageHandler)ptr;
+}
+
+Direct3DImageHandler evas_direct3d_image_new_from_data(Direct3DDeviceHandler d3d,
+   int w, int h, DWORD *image_data, int alpha, int cspace)
+{
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   D3DDevice *device = dev_ptr->device;
+   D3DScene *scene = dev_ptr->scene;
+
+   int image_width = w;
+   int image_height = h;
+   assert(image_width > 0 && image_height > 0);
+
+   Ref<D3DObjectImage> image = new D3DObjectImage();
+
+   D3DImageCache::CacheEntryInfo info;
+   ZeroMemory(&info, sizeof(info));
+   if (!D3DImageCache::Current()->InsertImage(device, image_data,
+      image_width, image_height, info))
+   {
+      WRN("Couldnt add image to the cache");
+      return NULL;
+   }
+   char buf[64];
+   sprintf(buf, "%p", image_data);
+   image->Init(info.u, info.v, info.du, info.dv, info.id,
+      info.width, info.height, buf);
+
+   image->SetFree(true);
+   scene->AddObject(image);
+
+   DBG("New image object (total objects: %d)", scene->GetObjectCount());
+
+   ImagePtr *ptr = new ImagePtr;
+   ptr->ref = image;
+   ptr->img = NULL;
+
+   return (Direct3DImageHandler)ptr;
+}
+
+Direct3DImageHandler evas_direct3d_image_new_from_copied_data(Direct3DDeviceHandler d3d,
+   int w, int h, DWORD *image_data, int alpha, int cspace)
+{
+   return evas_direct3d_image_new_from_data(d3d, w, h, image_data, alpha, cspace);
+}
+
+void evas_direct3d_image_free(Direct3DDeviceHandler d3d, Direct3DImageHandler image)
+{
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   D3DDevice *device = dev_ptr->device;
+   D3DScene *scene = dev_ptr->scene;
+
+   ImagePtr *ptr = (ImagePtr *)image;
+
+   Ref<D3DObjectImage> image_ref = ptr->ref;
+   assert(!image_ref.IsNull());
+   scene->DeleteObject(image_ref);
+
+   delete ptr;
+}
+
+void evas_direct3d_image_data_put(Direct3DDeviceHandler d3d, Direct3DImageHandler image,
+   DWORD *image_data)
+{
+   ImagePtr *ptr = (ImagePtr *)image;
+   Ref<D3DObjectImage> image_ref = ptr->ref;
+   //assert(!image_ref.IsNull());
+   if (image_ref.IsNull())
+      return;
+
+   if (!image_ref->UpdateImageData(image_data))
+      ERR("Failed to update image data");
+}
+
+void evas_direct3d_image_data_get(Direct3DDeviceHandler d3d, Direct3DImageHandler image,
+   int to_write, DATA32 **image_data)
+{
+   ImagePtr *ptr = (ImagePtr *)image;
+   Ref<D3DObjectImage> image_ref = ptr->ref;
+   if (image_ref.IsNull())
+      return;
+   if (image_data == NULL)
+      return;
+   assert(sizeof(DATA32) == sizeof(DWORD));
+   *image_data = (DATA32 *)image_ref->GetImageData();
+}
+
+void evas_direct3d_image_draw(Direct3DDeviceHandler d3d, Direct3DImageHandler image,
+   int src_x, int src_y, int src_w, int src_h,
+   int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
+{
+   ImagePtr *ptr = (ImagePtr *)image;
+   Ref<D3DObjectImage> image_ref = ptr->ref;
+   RGBA_Image *evas_image = ptr->img;
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   D3DDevice *device = dev_ptr->device;
+   D3DScene *scene = dev_ptr->scene;
+   //assert(!image_ref.IsNull());
+   if (image_ref.IsNull())
+      return;
+
+   if (!image_ref->IsValid())
+   {
+      TArray<D3DObjectImage *> images;
+      scene->GetObjectsOfType<D3DObjectImage>(images);
+      bool found = false;
+      for (int i = 0; i < images.Length(); i++)
+      {
+         if (images[i]->IsValid() &&
+            _stricmp(images[i]->GetSource(), image_ref->GetSource()) == 0)
+         {
+            images[i]->CopyTo(image_ref);
+            found = true;
+            WRN("Image object info reused, source: \"%s\"", image_ref->GetSource());
+            break;
+         }
+      }
+      if (!found && evas_image != NULL)
+         evas_cache_image_load_data(&evas_image->cache_entry);
+   }
+
+   // If the image object wasnt initialized yet
+   if (evas_image != NULL && evas_image->image.data != NULL && !image_ref->IsValid())
+   {
+      D3DImageCache::CacheEntryInfo info;
+      ZeroMemory(&info, sizeof(info));
+      if (!D3DImageCache::Current()->InsertImage(device, (DWORD *)evas_image->image.data,
+         evas_image->cache_entry.w, evas_image->cache_entry.h, info))
+      {
+         WRN("Couldnt add image to the cache");
+         return;
+      }
+      image_ref->Init(info.u, info.v, info.du, info.dv, info.id,
+         info.width, info.height, evas_image->cache_entry.file);
+   }
+
+   // Do not draw invalid objects
+   if (!image_ref->IsValid())
+   {
+      image_ref->SetFree(true);
+      return;
+   }
+
+   image_ref->Setup(
+      2.f * float(dst_x) / float(device->GetWidth()) - 1.f,
+      2.f * (1.f - float(dst_y) / float(device->GetHeight())) - 1.f,
+      2.f * float(dst_w) / float(device->GetWidth()),
+      -2.f * float(dst_h) / float(device->GetHeight()),
+      src_x, src_y, src_w, src_h);
+
+   image_ref->SetupColorFilter(dev_ptr->context->color_mul);
+
+   image_ref->SetFree(false);
+}
+
+void evas_direct3d_image_size_get(Direct3DImageHandler image, int *w, int *h)
+{
+   ImagePtr *ptr = (ImagePtr *)image;
+   if (ptr == NULL)
+      return;
+   if (ptr->img != NULL)
+   {
+      if (w != NULL)
+         *w = ptr->img->cache_entry.w;
+      if (h != NULL)
+         *h = ptr->img->cache_entry.h;
+   }
+   else if (!ptr->ref.IsNull())
+   {
+      if (w != NULL)
+         *w = ptr->ref->GetWidth();
+      if (h != NULL)
+         *h = ptr->ref->GetHeight();
+   }
+}
+
+void evas_direct3d_image_border_set(Direct3DDeviceHandler d3d, Direct3DImageHandler image,
+   int l, int r, int t, int b)
+{
+   ImagePtr *ptr = (ImagePtr *)image;
+   Ref<D3DObjectImage> image_ref = ptr->ref;
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   D3DDevice *device = dev_ptr->device;
+   if (image_ref.IsNull())
+      return;
+
+   int im_w, im_h;
+   if (ptr->img != NULL)
+   {
+      im_w = ptr->img->cache_entry.w;
+      im_h = ptr->img->cache_entry.h;
+   }
+   else
+   {
+      im_w = image_ref->GetWidth();
+      im_h = image_ref->GetHeight();
+   }
+
+   image_ref->SetupBorder(
+      D3DXVECTOR4(
+         2.f * float(l) / float(device->GetWidth()),
+         -2.f * float(t) / float(device->GetHeight()),
+         2.f * float(r) / float(device->GetWidth()),
+         -2.f * float(b) / float(device->GetHeight())),
+      D3DXVECTOR4(float(l) / float(im_w),
+         float(t) / float(im_h),
+         float(r) / float(im_w),
+         float(b) / float(im_h)));
+}
+
+void evas_direct3d_image_border_get(Direct3DDeviceHandler d3d, Direct3DImageHandler image,
+   int *l, int *r, int *t, int *b)
+{
+   ImagePtr *ptr = (ImagePtr *)image;
+   Ref<D3DObjectImage> image_ref = ptr->ref;
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   D3DDevice *device = dev_ptr->device;
+   if (image_ref.IsNull())
+      return;
+   assert(l != NULL && r != NULL && b != NULL && t != NULL);
+   *l = (int)(0.5f * image_ref->GetBorderLeft() * device->GetWidth());
+   *r = (int)(0.5f * image_ref->GetBorderRight() * device->GetWidth());
+   *t = (int)(-0.5f * image_ref->GetBorderTop() * device->GetHeight());
+   *b = (int)(-0.5f * image_ref->GetBorderBottom() * device->GetHeight());
+}
+
+
+Direct3DFontGlyphHandler evas_direct3d_font_texture_new(Direct3DDeviceHandler d3d,
+   RGBA_Font_Glyph *fg)
+{
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   D3DContext *context = dev_ptr->context;
+   D3DDevice *device = dev_ptr->device;
+
+   if (context->font.IsNull())
+      return NULL;
+
+   D3DObjectFont *font = (D3DObjectFont *)context->font.Addr();
+   // This is not reliable
+   //D3DObjectFont::Glyph *glyph = (D3DObjectFont::Glyph *)fg->ext_dat;
+   D3DObjectFont::Glyph *glyph = font->GetGlyph(fg);
+   if (glyph != NULL)
+   {
+      assert(glyph->Compare(fg));
+      return glyph;
+   }
+   glyph = font->AddGlyph(device, fg, fg->glyph_out->bitmap.buffer,
+      fg->glyph_out->bitmap.width, fg->glyph_out->bitmap.rows, fg->glyph_out->bitmap.pitch);
+   return (Direct3DFontGlyphHandler)glyph;
+}
+
+void evas_direct3d_font_texture_free(Direct3DFontGlyphHandler ft)
+{
+   if (ft == NULL)
+      return;
+   D3DObjectFont::Glyph *glyph = (D3DObjectFont::Glyph *)ft;
+   RGBA_Font_Glyph *fg = (RGBA_Font_Glyph *)glyph->Source();
+   fg->ext_dat = NULL;
+}
+
+void evas_direct3d_font_texture_draw(Direct3DDeviceHandler d3d, void *, void *,
+   RGBA_Font_Glyph *fg, int x, int y)
+{
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   D3DContext *context = dev_ptr->context;
+   D3DDevice *device = dev_ptr->device;
+
+   if (context->font.IsNull())
+      return;
+
+   D3DObjectFont *font = (D3DObjectFont *)context->font.Addr();
+   D3DObjectFont::Glyph *glyph = (D3DObjectFont::Glyph *)fg->ext_dat;
+   if (glyph == NULL)
+      return;
+   assert(glyph->Compare(fg));
+
+   font->SetColor(context->color);
+   font->PushForDraw(glyph, x, y);
+   font->SetFree(false);
+}
+
+void evas_direct3d_select_or_create_font(Direct3DDeviceHandler d3d, void *font)
+{
+   // The Plan
+   // 1. Create D3DObjectFont with source string = "%p" (font)
+   // 2. Or find this object in the scene
+   // 3. On each texture_new call - fill internal texture with glyph, remember the
+   //    glyph pointer - we'll use it.
+
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   D3DContext *context = dev_ptr->context;
+
+   if (!context->font.IsNull() && ((D3DObjectFont *)context->font.Addr())->Compare(font))
+      return;
+
+   D3DScene *scene = dev_ptr->scene;
+
+   static TArray<D3DObjectFont *> fonts;
+   scene->GetObjectsOfType<D3DObjectFont>(fonts);
+   for (int i = 0; i < fonts.Length(); i++)
+   {
+      if (fonts[i]->Compare(font))
+      {
+         context->font = fonts[i];
+         return;
+      }
+   }
+
+   D3DDevice *device = dev_ptr->device;
+
+   assert(dev_ptr->fonts_buffer_image_id >= 0);
+
+   Ref<D3DObjectFont> new_font = new D3DObjectFont(font, dev_ptr->fonts_buffer_image_id);
+   scene->AddObject(new_font);
+   context->font = new_font;
+}
+
+void evas_direct3d_font_free(Direct3DDeviceHandler d3d, void *font)
+{
+   DevicePtr *dev_ptr = SelectDevice(d3d);
+   D3DContext *context = dev_ptr->context;
+   D3DScene *scene = dev_ptr->scene;
+
+   if (context->font.IsNull() || !((D3DObjectFont *)context->font.Addr())->Compare(font))
+   {
+      D3DScene *scene = dev_ptr->scene;
+
+      static TArray<D3DObjectFont *> fonts;
+      scene->GetObjectsOfType<D3DObjectFont>(fonts);
+      for (int i = 0; i < fonts.Length(); i++)
+      {
+         if (fonts[i]->Compare(font))
+         {
+            context->font = fonts[i];
+            break;
+         }
+      }
+   }
+
+   scene->DeleteObject(context->font);
+   context->font = NULL;
+}
+
+
+}  // extern "C"
diff --git a/src/modules/engines/direct3d/evas_direct3d_object.cpp b/src/modules/engines/direct3d/evas_direct3d_object.cpp
new file mode 100644 (file)
index 0000000..15a801e
--- /dev/null
@@ -0,0 +1,12 @@
+
+#include "evas_direct3d_object.h"
+
+D3DObject::D3DObject()
+{
+   _free = false;
+}
+
+D3DObject::~D3DObject()
+{
+}
+
diff --git a/src/modules/engines/direct3d/evas_direct3d_object.h b/src/modules/engines/direct3d/evas_direct3d_object.h
new file mode 100644 (file)
index 0000000..8c4e6df
--- /dev/null
@@ -0,0 +1,35 @@
+#ifndef __EVAS_DIRECT3D_OBJECT_H__
+#define __EVAS_DIRECT3D_OBJECT_H__
+
+#include "evas_engine.h"
+
+#include "ref.h"
+
+class D3DDevice;
+
+class D3DObject : virtual public Referenc
+{
+public:
+   D3DObject();
+   virtual ~D3DObject();
+
+   virtual void Draw(D3DDevice *d3d) = 0;
+
+   inline bool IsFree();
+   inline void SetFree(bool state);
+
+private:
+   bool _free;
+};
+
+bool D3DObject::IsFree()
+{
+   return _free;
+}
+
+void D3DObject::SetFree(bool state)
+{
+   _free = state;
+}
+
+#endif  // __EVAS_DIRECT3D_OBJECT_H__
diff --git a/src/modules/engines/direct3d/evas_direct3d_object_font.cpp b/src/modules/engines/direct3d/evas_direct3d_object_font.cpp
new file mode 100644 (file)
index 0000000..f072e87
--- /dev/null
@@ -0,0 +1,231 @@
+//#define ENABLE_LOG_PRINTF
+
+#include <string.h>
+
+#include "evas_direct3d_object_font.h"
+#include "evas_direct3d_image_cache.h"
+#include "evas_direct3d_device.h"
+#include "evas_direct3d_shader_pack.h"
+#include "evas_direct3d_vertex_buffer_cache.h"
+
+D3DObjectFont::Cache D3DObjectFont::_cache;
+
+D3DObjectFont::D3DObjectFont(void *source, int image_id)
+{
+   _image_id = image_id;
+   _color = 0xff000000;
+   _source = source;
+   D3DImageCache::Current()->AddImageUser(_image_id);
+}
+
+D3DObjectFont::~D3DObjectFont()
+{
+   D3DImageCache::Current()->RemoveImageUser(_image_id);
+}
+
+void D3DObjectFont::CopyTo(D3DObjectFont *font)
+{
+   assert(font != NULL);
+   font->_image_id = _image_id;
+   font->_source = _source;
+   D3DImageCache::Current()->AddImageUser(font->_image_id);
+   _glyphs.CopyTo(font->_glyphs);
+}
+
+void D3DObjectFont::BeginCache(int image_id)
+{
+   if (_cache.enabled)
+      return;
+   int w = D3DImageCache::Current()->GetImageWidth(image_id);
+   int h = D3DImageCache::Current()->GetImageHeight(image_id);
+   _cache.enabled = true;
+   _cache.image_id = image_id;
+   _cache.data.Allocate(w * h);
+
+   if (_cache.dirty.Length() != h)
+   {
+      _cache.dirty.Allocate(h);
+      memset(_cache.dirty.Data(), 0xff, sizeof(POINT) * _cache.dirty.Length());
+   }
+
+   ZeroMemory(_cache.data.Data(), sizeof(DWORD) * _cache.data.Length());
+   _cache.width = w;
+   _cache.height = h;
+
+   _cache.valid_rect.left = w;
+   _cache.valid_rect.right = 0;
+   _cache.valid_rect.top = h;
+   _cache.valid_rect.bottom = 0;
+}
+
+void D3DObjectFont::Draw(D3DDevice *d3d)
+{
+   assert(_cache.image_id == _image_id);
+}
+
+void D3DObjectFont::EndCache(D3DDevice *d3d)
+{
+   if (!_cache.enabled)
+      return;
+   _cache.enabled = false;
+
+   if (_cache.data.Length() == 0)
+      return;
+
+   D3DImageCache::CacheEntryInfo info;
+   ZeroMemory(&info, sizeof(info));
+   info.id = _cache.image_id;
+   info.width = _cache.width;
+   info.height = _cache.height;
+   if (!D3DImageCache::Current()->UpdateImageDataWithDirtyInfo(info,
+      _cache.data.Data(), _cache.dirty.Data()))
+   //if (!D3DImageCache::Current()->UpdateImageDataDiscard(info, _cache.data.Data()));
+   {
+      return;
+   }
+
+   D3DShaderPack::Current()->SetVDecl(d3d, D3DShaderPack::VDECL_XYUV);
+   D3DShaderPack::Current()->SetVS(d3d, D3DShaderPack::VS_COPY_UV);
+   D3DShaderPack::Current()->SetPS(d3d, D3DShaderPack::PS_TEX_2);  // This image is in s1
+   D3DImageCache::Current()->SelectImageToDevice(d3d, _cache.image_id);
+
+   const FLOAT half_x = 0.5f / FLOAT(_cache.width);
+   const FLOAT half_y = 0.5f / FLOAT(_cache.height);
+   FLOAT left = FLOAT(_cache.valid_rect.left - 5) / FLOAT(_cache.width),
+      top = FLOAT(_cache.valid_rect.top - 5) / FLOAT(_cache.height),
+      right = FLOAT(_cache.valid_rect.right + 5) / FLOAT(_cache.width),
+      bottom = FLOAT(_cache.valid_rect.bottom + 5) / FLOAT(_cache.height);
+
+   const Vertex data[6] = {
+      {left * 2 - 1, 2 * (1 - bottom) - 1,      left + half_x, bottom + half_y},
+      {left * 2 - 1, 2 * (1 - top) - 1,         left + half_x, top + half_y},
+      {right * 2 - 1, 2 * (1 - bottom) - 1,     right + half_x, bottom + half_y},
+      {right * 2 - 1, 2 * (1 - bottom) - 1,     right + half_x, bottom + half_y},
+      {left * 2 - 1, 2 * (1 - top) - 1,         left + half_x, top + half_y},
+      {right * 2 - 1, 2 * (1 - top) - 1,        right + half_x, top + half_y}};
+
+   d3d->GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, data, sizeof(Vertex));
+
+   //D3DImageCache::Current()->UpdateImageDataWithDirtyInfo(info, NULL, _cache.dirty.Data());
+}
+
+D3DObjectFont::Glyph *D3DObjectFont::GetGlyph(void *source)
+{
+   if (_image_id < 0)
+   {
+      WRN("Font is not initialized");
+      return NULL;
+   }
+   for (int i = 0; i < _glyphs.Length(); i++)
+   {
+      if (_glyphs[i]->Compare(source))
+         return _glyphs[i];
+   }
+   return NULL;
+}
+
+D3DObjectFont::Glyph *D3DObjectFont::AddGlyph(D3DDevice *d3d, void *source,
+   BYTE *data8, int width, int height, int pitch)
+{
+   if (_image_id < 0)
+   {
+      WRN("Font is not initialized");
+      return NULL;
+   }
+   for (int i = 0; i < _glyphs.Length(); i++)
+   {
+      if (_glyphs[i]->Compare(source))
+         return _glyphs[i];
+   }
+   Ref<Glyph> glyph = new Glyph(source);
+   glyph->_data.Allocate(width * height);
+   glyph->_width = width;
+   glyph->_height = height;
+
+   for (int i = 0; i < height; i++)
+      CopyMemory(&glyph->_data[i * width], &data8[i * pitch], width);
+
+   Log("Glyph added (%p) (%dx%d)", source, width, height);
+   _glyphs.Add(glyph);
+   return _glyphs.Last()->Addr();
+}
+
+void D3DObjectFont::PushForDraw(Glyph *glyph, int x, int y)
+{
+   BeginCache(_image_id);
+
+   // Uff, I'm not sure about multiple windows...
+
+#define LERP(a, b, t1, t2)  (BYTE)(FLOAT(a) * (t1) + FLOAT(b) * (t2))
+
+   Color dc, sc;
+   FLOAT a;
+   sc.color = _color;
+
+   const FLOAT color_alpha = sc.Alpha();
+
+   DWORD *data = _cache.data.Data();
+   BYTE *gdata = glyph->_data.Data();
+   const int glyph_height = glyph->_height;
+   const int cache_height = _cache.height;
+   const int glyph_width = glyph->_width;
+   const int cache_width = _cache.width;
+
+   for (int i = 0, yi = y; i < glyph_height && yi < cache_height; i++, yi++)
+   {
+      if (yi < 0)
+         continue;
+      DWORD *dst = data + ((yi) * cache_width + x);
+      BYTE *src = gdata + (i * glyph_width);
+      POINT *dirty_yi = &_cache.dirty[yi];
+
+      if (_cache.valid_rect.top > yi)
+         _cache.valid_rect.top = yi;
+      if (_cache.valid_rect.bottom < yi)
+         _cache.valid_rect.bottom = yi;
+
+      for (int j = 0, xj = x; j < glyph_width && xj < cache_width; j++, xj++, dst++, src++)
+      {
+         if (xj < 0)
+            continue;
+         BYTE glyph_pix = *src;
+         if (glyph_pix == 0)
+            continue;
+
+         if (dirty_yi->x >= 0 && dirty_yi->y < 0)
+            dirty_yi->x = 0, dirty_yi->y = cache_width - 1;
+         else
+         {
+            if (dirty_yi->x < 0 || dirty_yi->x > xj)
+               dirty_yi->x = xj;
+            if (dirty_yi->y < 0 || dirty_yi->y < xj)
+               dirty_yi->y = xj;
+         }
+
+         if (_cache.valid_rect.left > xj)
+            _cache.valid_rect.left = xj;
+         if (_cache.valid_rect.right < xj)
+            _cache.valid_rect.right = xj;
+
+         if (glyph_pix == 0xff && sc.a == 0xff)
+         {
+            *dst = sc.color;
+            continue;
+         }
+         a = FLOAT(glyph_pix) * color_alpha / 255.f;
+         if (*dst == 0)
+         {
+            *dst = (BYTE(255.f * a) << 24) | (0x00ffffff & sc.color);
+            continue;
+         }
+
+         dc.color = *dst;
+
+         dc.r = LERP(dc.r, sc.r, 1 - a, a);
+         dc.g = LERP(dc.g, sc.g, 1 - a, a);
+         dc.b = LERP(dc.b, sc.b, 1 - a, a);
+         dc.a = max(dc.a, BYTE(255.f * a));
+         *dst = dc.color;
+      }
+   }
+}
diff --git a/src/modules/engines/direct3d/evas_direct3d_object_font.h b/src/modules/engines/direct3d/evas_direct3d_object_font.h
new file mode 100644 (file)
index 0000000..e8c0196
--- /dev/null
@@ -0,0 +1,113 @@
+#ifndef __EVAS_DIRECT3D_OBJECT_FONT_H__
+#define __EVAS_DIRECT3D_OBJECT_FONT_H__
+
+#include "evas_engine.h"
+
+#include "ref.h"
+#include "array.h"
+
+#include "evas_direct3d_object.h"
+
+class D3DObjectFont : public D3DObject
+{
+public:
+
+   class Glyph : public Referenc
+   {
+   public:
+      Glyph(void *source)
+         : _source(source), _width(0), _height(0) {};
+
+      bool Compare(void *source)
+      {
+         return (_source == source);
+      }
+      void *Source()
+      {
+         return _source;
+      }
+
+   private:
+      friend class D3DObjectFont;
+      void *_source;
+      TArray<BYTE> _data;
+      int _width;
+      int _height;
+   };
+
+public:
+   D3DObjectFont(void *source, int image_id);
+   ~D3DObjectFont();
+
+   inline bool Compare(void *source);
+   void CopyTo(D3DObjectFont *font);
+
+   virtual void Draw(D3DDevice *d3d);
+   static void EndCache(D3DDevice *d3d);
+
+   inline void SetColor(DWORD color);
+
+   Glyph *GetGlyph(void *source);
+   Glyph *AddGlyph(D3DDevice *d3d, void *source, BYTE *data8, int width, int height, int pitch);
+   void PushForDraw(Glyph *glyph, int x, int y);
+
+protected:
+   static void BeginCache(int image_id);
+
+private:
+   struct Vertex
+   {
+      FLOAT x, y;
+      FLOAT u, v;
+   };
+
+   struct Color
+   {
+      union
+      {
+         struct
+         {
+            BYTE b, g, r, a;
+         };
+         DWORD color;
+      };
+
+      FLOAT Alpha() { return FLOAT(a) / 255.f; }
+   };
+
+   class Cache
+   {
+   public:
+      Cache()
+         : enabled(false), image_id(-1), width(0), height(0) {};
+   public:
+      TArray<DWORD> data;
+      TArray<POINT> dirty;  // Start, End
+      bool enabled;
+      int image_id;
+      int width;
+      int height;
+      RECT valid_rect;
+   };
+
+private:
+   DWORD _color;
+   void *_source;
+   int _image_id;
+
+   TArray<Ref<Glyph> > _glyphs;
+
+   static Cache _cache;
+};
+
+bool D3DObjectFont::Compare(void *source)
+{
+   return (_source == source);
+}
+
+void D3DObjectFont::SetColor(DWORD color)
+{
+   _color = color;
+}
+
+#endif  // __EVAS_DIRECT3D_OBJECT_FONT_H__
diff --git a/src/modules/engines/direct3d/evas_direct3d_object_image.cpp b/src/modules/engines/direct3d/evas_direct3d_object_image.cpp
new file mode 100644 (file)
index 0000000..3bfbe1e
--- /dev/null
@@ -0,0 +1,320 @@
+//#define ENABLE_LOG_PRINTF
+
+#include <string.h>
+
+#include <d3dx9.h>
+
+#include "evas_direct3d_object_image.h"
+#include "evas_direct3d_image_cache.h"
+#include "evas_direct3d_device.h"
+#include "evas_direct3d_shader_pack.h"
+#include "evas_direct3d_vertex_buffer_cache.h"
+
+TArray<D3DObjectImage *> D3DObjectImage::_cache;
+bool D3DObjectImage::_cache_enabled = false;
+
+D3DObjectImage::D3DObjectImage()
+{
+   _x = _y = _w = _h = 0;
+   _sx = _sy = _sw = _sh = 0;
+   _u = _v = _du = _dv = 0;
+   _image_id = -1;
+   _width = _height = 0;
+   _source[0] = 0;
+   _color = 0xffffffff;
+   _cache_i = 0;
+   _border = D3DXVECTOR4(0, 0, 0, 0);
+   _uvborder = D3DXVECTOR4(0, 0, 0, 0);
+   _with_border = false;
+   _dirty = false;
+   _image_data_updated = false;
+}
+
+D3DObjectImage::~D3DObjectImage()
+{
+   D3DImageCache::Current()->RemoveImageUser(_image_id);
+}
+
+void D3DObjectImage::CopyTo(D3DObjectImage *image)
+{
+   assert(image != NULL);
+   image->_u = _u;
+   image->_v = _v;
+   image->_du = _du;
+   image->_dv = _dv;
+   image->_image_id = _image_id;
+   image->_width = _width;
+   image->_height = _height;
+   CopyMemory(image->_source, _source, sizeof(_source));
+   D3DImageCache::Current()->AddImageUser(image->_image_id);
+}
+
+void D3DObjectImage::BeginCache()
+{
+   _cache.Allocate(0);
+   _cache_enabled = true;
+}
+
+void D3DObjectImage::EndCache(D3DDevice *d3d)
+{
+   if (!_cache_enabled || _cache.Length() == 0)
+      return;
+   D3DShaderPack::Current()->SetVDecl(d3d, D3DShaderPack::VDECL_XYUVC);
+   D3DShaderPack::Current()->SetVS(d3d, D3DShaderPack::VS_COPY_UV_COLOR);
+   D3DShaderPack::Current()->SetPS(d3d, D3DShaderPack::PS_TEX_COLOR_FILTER);
+
+   static TArray<Vertex> sorted;
+   static TArray<GroupDesc> groups;
+   sorted.Allocate(0);
+   groups.Allocate(0);
+
+   bool found = true;
+   while (found)
+   {
+      found = false;
+      int cur_id = -1;
+      int num = 0;
+      for (int i = 0; i < _cache.Length(); i++)
+      {
+         // We have processed this
+         if (_cache[i]->_image_id < 0)
+            continue;
+         found = true;
+         if (cur_id < 0)
+            cur_id = _cache[i]->_image_id;
+         if (_cache[i]->_image_id == cur_id)
+         {
+            if (!_cache[i]->_with_border)
+            {
+               Vertex *data = _cache[i]->MakeData();
+               sorted.Add(data[0]);
+               sorted.Add(data[1]);
+               sorted.Add(data[2]);
+               sorted.Add(data[3]);
+               sorted.Add(data[4]);
+               sorted.Add(data[5]);
+               _cache[i]->_image_id = -_cache[i]->_image_id - 1;
+               num++;
+            }
+            else
+            {
+               Vertex *data = _cache[i]->MakeDataBorder();
+               int last_len = sorted.Length();
+               sorted.Allocate(last_len + 6 * 9);
+               CopyMemory(&sorted[last_len], data, sizeof(Vertex) * 6 * 9);
+               _cache[i]->_image_id = -_cache[i]->_image_id - 1;
+               num += 9;
+            }
+         }
+      }
+      if (num > 0)
+      {
+         GroupDesc gd = {num, cur_id};
+         groups.Add(gd);
+      }
+   }
+
+   // Restore ids
+   for (int i = 0; i < _cache.Length(); i++)
+      _cache[i]->_image_id = -_cache[i]->_image_id - 1;
+
+   D3DVertexBufferCache::CacheEntryInfo ce_info;
+   if (!D3DVertexBufferCache::Current()->InitBuffer(d3d, (BYTE *)sorted.Data(),
+      sorted.Length() * sizeof(Vertex), ce_info))
+   {
+      return;
+   }
+   D3DVertexBufferCache::Current()->SelectBufferToDevice(d3d, ce_info.id, sizeof(Vertex));
+
+   HRESULT hr;
+   for (int i = 0, cur = 0; i < groups.Length(); i++)
+   {
+      if (FAILED(hr = D3DImageCache::Current()->SelectImageToDevice(d3d, groups[i].id)))
+      {
+         Log("Failed to select texture: %X", (DWORD)hr);
+      }
+//      d3d->GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLELIST, groups[i].num * 2,
+//         &sorted[cur], sizeof(Vertex));
+      d3d->GetDevice()->DrawPrimitive(D3DPT_TRIANGLELIST, cur, groups[i].num * 2);
+      cur += groups[i].num * 6;
+   }
+
+   DBG("Image cache drawn: %d items, %d groups", _cache.Length(), groups.Length());
+   _cache_enabled = false;
+}
+
+void D3DObjectImage::Draw(D3DDevice *d3d)
+{
+   _dirty = false;
+
+   DBG("Image draw: (%.3f, %.3f, %.3f, %.3f)", _x, _y, _w, _h);
+
+   if (_cache_enabled)
+   {
+      _cache.Add(this);
+      _cache_i = _cache.Length() - 1;
+      return;
+   }
+
+   D3DShaderPack::Current()->SetVDecl(d3d, D3DShaderPack::VDECL_XYUVC);
+   D3DShaderPack::Current()->SetVS(d3d, D3DShaderPack::VS_COPY_UV_COLOR);
+   D3DShaderPack::Current()->SetPS(d3d, D3DShaderPack::PS_TEX_COLOR_FILTER);
+   D3DImageCache::Current()->SelectImageToDevice(d3d, _image_id);
+
+   if (!_with_border)
+      d3d->GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, MakeData(), sizeof(Vertex));
+   else
+      d3d->GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 18, MakeDataBorder(), sizeof(Vertex));
+}
+
+void D3DObjectImage::Init(FLOAT u, FLOAT v, FLOAT du, FLOAT dv,
+   int image_id, int width, int height, const char *source)
+{
+   _u = u;
+   _v = v;
+   _du = du;
+   _dv = dv;
+   _image_id = image_id;
+   _width = width;
+   _height = height;
+#ifdef __MINGW32__
+   strncpy(_source, source, sizeof(_source) - 1);
+#else
+   strncpy_s(_source, sizeof(_source), source, sizeof(_source) - 1);
+#endif // ! __MINGW32__
+}
+
+void D3DObjectImage::Setup(FLOAT x, FLOAT y, FLOAT w, FLOAT h,
+   int sx, int sy, int sw, int sh)
+{
+   if (!_dirty)
+   {
+      _x = 1.f;
+      _y = -1.f;
+      _w = _h = 0.f;
+      _sx = _sy = 1.f;
+      _sw = _sh = 0.f;
+   }
+
+   if (!_with_border)
+   {
+      _x = x;
+      _y = y;
+      _w = w;
+      _h = h;
+      _sx = FLOAT(sx) / FLOAT(_width);
+      _sy = FLOAT(sy) / FLOAT(_height);
+      _sw = FLOAT(sw) / FLOAT(_width);
+      _sh = FLOAT(sh) / FLOAT(_height);
+   }
+   else
+   {
+      _x = min(_x, x);
+      _y = max(_y, y);
+      _w += w / 3;
+      _h += h / 3;
+      _sx = min(_sx, FLOAT(sx) / FLOAT(_width));
+      _sy = min(_sy, FLOAT(sy) / FLOAT(_height));
+      _sw += FLOAT(sw) / (3.f * FLOAT(_width));
+      _sh += FLOAT(sh) / (3.f * FLOAT(_height));
+   }
+   _dirty = true;
+
+}
+
+void D3DObjectImage::SetupColorFilter(DWORD color)
+{
+   //_color = ((a & 0xff) << 24) | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff);
+   _color = color;
+}
+
+D3DObjectImage::Vertex *D3DObjectImage::MakeData()
+{
+   //FLOAT z = (FLOAT(_cache_i) + 0.5f) / _cache.Length();
+   Vertex data[6] = {
+      {_x, _y,             _u + _sx * _du, _v + _sy * _dv,                 _color},
+      {_x + _w, _y,        _u + (_sx + _sw) * _du, _v + _sy * _dv,         _color},
+      {_x, _y + _h,        _u + _sx * _du, _v + (_sy + _sh) * _dv,         _color},
+      {_x, _y + _h,        _u + _sx * _du, _v + (_sy + _sh) * _dv,         _color},
+      {_x + _w, _y,        _u + (_sx + _sw) * _du, _v + _sy * _dv,         _color},
+      {_x + _w, _y + _h,   _u + (_sx + _sw) * _du, _v + (_sy + _sh) * _dv, _color}};
+   CopyMemory(_data, data, sizeof(data));
+   return _data;
+}
+
+D3DObjectImage::Vertex *D3DObjectImage::MakeDataBorder()
+{
+   //FLOAT z = (FLOAT(_cache_i) + 0.5f) / _cache.Length();
+   if (_border.x + _border.z > _w)
+      _border.x = _border.z = _w / 2;
+   if (_border.y + _border.w < _h)
+      _border.y = _border.w = _h / 2;
+
+   FLOAT ul, ut, ur, ub;
+   ul = _uvborder.x * _du;
+   ut = _uvborder.y * _dv;
+   ur = _uvborder.z * _du;
+   ub = _uvborder.w * _dv;
+   FLOAT bl, bt, br, bb;
+   bl = _border.x;
+   bt = _border.y;
+   br = _border.z;
+   bb = _border.w;
+
+   const FLOAT half_x = 0.5f * _du / FLOAT(_width);
+   const FLOAT half_y = 0.5f * _dv / FLOAT(_height);
+
+   // Diagonal knots
+   Vertex data[4] = {
+      {_x, _y,                         _u + _sx * _du + half_x,     _v + _sy * _dv + half_y,         _color},
+      {_x + bl, _y + bt,               _u + ul + _sx * _du,         _v + ut + _sy * _dv,             _color},
+      {_x + _w - br, _y + _h - bb,     _u - ur + (_sx + _sw) * _du, _v - ub + (_sy + _sh) * _dv,     _color},
+      {_x + _w, _y + _h,               _u + (_sx + _sw) * _du - half_x, _v + (_sy + _sh) * _dv - half_y, _color}};
+
+   static const int yshift[6] = {0, 0, 1, 1, 0, 1};
+   static const int xshift[6] = {0, 1, 0, 0, 1, 1};
+
+   int vi = 0;
+   for (int i = 0; i < 3; i++)
+   {
+      for (int j = 0; j < 3; j++)
+      {
+         for (int v = 0; v < 6; v++)
+         {
+            _data[vi].x = data[xshift[v] + j].x;
+            _data[vi].y = data[yshift[v] + i].y;
+            _data[vi].u = data[xshift[v] + j].u;
+            _data[vi].v = data[yshift[v] + i].v;
+            _data[vi].col = data[0].col;
+            vi++;
+         }
+      }
+   }
+
+   return _data;
+}
+
+void D3DObjectImage::SetupBorder(const D3DXVECTOR4 &world_border, const D3DXVECTOR4 &pix_border)
+{
+   _border = world_border;
+   _uvborder = pix_border;
+   _with_border = (_border.x > 0.0001f || _border.y > 0.0001f ||
+      _border.z > 0.0001f || _border.w > 0.0001f);
+}
+
+bool D3DObjectImage::UpdateImageData(DWORD *image_data)
+{
+   D3DImageCache::CacheEntryInfo info = {_image_id, _width, _height, _u, _v, _du, _dv};
+   _image_data_updated = false;
+   return D3DImageCache::Current()->UpdateImageData(info, image_data);
+}
+
+DWORD *D3DObjectImage::GetImageData()
+{
+   if (_image_data_updated)
+      return _image_data.Data();
+   _image_data_updated = true;
+   D3DImageCache::CacheEntryInfo info = {_image_id, _width, _height, _u, _v, _du, _dv};
+   D3DImageCache::Current()->GetImageData(info, _image_data);
+   return _image_data.Data();
+}
diff --git a/src/modules/engines/direct3d/evas_direct3d_object_image.h b/src/modules/engines/direct3d/evas_direct3d_object_image.h
new file mode 100644 (file)
index 0000000..379207b
--- /dev/null
@@ -0,0 +1,127 @@
+#ifndef __EVAS_DIRECT3D_OBJECT_IMAGE_H__
+#define __EVAS_DIRECT3D_OBJECT_IMAGE_H__
+
+#include "evas_engine.h"
+
+#include "ref.h"
+#include "array.h"
+
+#include "evas_direct3d_object.h"
+
+class D3DObjectImage : public D3DObject
+{
+public:
+   D3DObjectImage();
+   virtual ~D3DObjectImage();
+
+   void CopyTo(D3DObjectImage *image);
+
+   static void BeginCache();
+   virtual void Draw(D3DDevice *d3d);
+   static void EndCache(D3DDevice *d3d);
+
+   void Init(FLOAT u, FLOAT v, FLOAT du, FLOAT dv, int image_id,
+      int width, int height, const char *source);
+   void Setup(FLOAT x, FLOAT y, FLOAT w, FLOAT h,
+      int sx, int sy, int sw, int sh);
+   void SetupColorFilter(DWORD color);
+   void SetupBorder(const D3DXVECTOR4 &world_border, const D3DXVECTOR4 &pix_border);
+
+   inline bool IsValid();
+   inline const char *GetSource();
+   inline int GetWidth();
+   inline int GetHeight();
+   inline FLOAT GetBorderLeft();
+   inline FLOAT GetBorderRight();
+   inline FLOAT GetBorderTop();
+   inline FLOAT GetBorderBottom();
+
+   bool UpdateImageData(DWORD *image_data);
+   DWORD *GetImageData();
+
+private:
+   struct Vertex
+   {
+      FLOAT x, y;
+      FLOAT u, v;
+      D3DCOLOR col;
+   };
+
+   struct GroupDesc
+   {
+      int num;
+      int id;
+   };
+
+private:
+   Vertex *MakeData();
+   Vertex *MakeDataBorder();
+
+private:
+   FLOAT _x, _y, _w, _h;
+   FLOAT _sx, _sy, _sw, _sh;
+   D3DXVECTOR4 _border;
+   D3DXVECTOR4 _uvborder;
+
+   FLOAT _u, _v, _du, _dv;
+   int _image_id;
+   int _width, _height;
+
+   D3DCOLOR _color;
+   int _cache_i;
+   bool _with_border;
+   bool _dirty;
+
+   TArray<DWORD> _image_data;
+   bool _image_data_updated;
+
+   char _source[256];
+
+   Vertex _data[54];
+
+   static TArray<D3DObjectImage *> _cache;
+   static bool _cache_enabled;
+};
+
+bool D3DObjectImage::IsValid()
+{
+   return _image_id >= 0 && _width > 0 && _height > 0;
+}
+
+const char *D3DObjectImage::GetSource()
+{
+   return _source;
+}
+
+int D3DObjectImage::GetWidth()
+{
+   return _width;
+}
+
+int D3DObjectImage::GetHeight()
+{
+   return _height;
+}
+
+FLOAT D3DObjectImage::GetBorderLeft()
+{
+   return _border.x;
+}
+
+FLOAT D3DObjectImage::GetBorderRight()
+{
+   return _border.z;
+}
+
+FLOAT D3DObjectImage::GetBorderTop()
+{
+   return _border.y;
+}
+
+FLOAT D3DObjectImage::GetBorderBottom()
+{
+   return _border.w;
+}
+
+
+#endif  // __EVAS_DIRECT3D_OBJECT_IMAGE_H__
diff --git a/src/modules/engines/direct3d/evas_direct3d_object_line.cpp b/src/modules/engines/direct3d/evas_direct3d_object_line.cpp
new file mode 100644 (file)
index 0000000..9442243
--- /dev/null
@@ -0,0 +1,60 @@
+
+#include "evas_direct3d_object_line.h"
+#include "evas_direct3d_device.h"
+#include "evas_direct3d_shader_pack.h"
+
+TArray<D3DObjectLine::Vertex> D3DObjectLine::_cache;
+bool D3DObjectLine::_cache_enabled = false;
+
+D3DObjectLine::D3DObjectLine()
+{
+   _x1 = _y1 = 0;
+   _x2 = _y2 = 0;
+}
+
+void D3DObjectLine::BeginCache()
+{
+   _cache.Allocate(0);
+   _cache_enabled = true;
+}
+
+void D3DObjectLine::EndCache(D3DDevice *d3d)
+{
+   if (!_cache_enabled || _cache.Length() == 0)
+      return;
+   D3DShaderPack::Current()->SetVDecl(d3d, D3DShaderPack::VDECL_XYC);
+   D3DShaderPack::Current()->SetVS(d3d, D3DShaderPack::VS_COPY_COLOR);
+   D3DShaderPack::Current()->SetPS(d3d, D3DShaderPack::PS_COLOR);
+   d3d->GetDevice()->DrawPrimitiveUP(D3DPT_LINELIST, _cache.Length() / 2, 
+      _cache.Data(), sizeof(Vertex));
+
+   DBG("Line cache drawn: %d items", _cache.Length() / 2);
+   _cache_enabled = false;
+}
+
+void D3DObjectLine::Draw(D3DDevice *d3d)
+{
+   Vertex data[2] = {{_x1, _y1, _color}, {_x2, _y2, _color}};
+
+   if (!_cache_enabled)
+   {
+      D3DShaderPack::Current()->SetVDecl(d3d, D3DShaderPack::VDECL_XYC);
+      D3DShaderPack::Current()->SetVS(d3d, D3DShaderPack::VS_COPY_COLOR);
+      D3DShaderPack::Current()->SetPS(d3d, D3DShaderPack::PS_COLOR);
+      d3d->GetDevice()->DrawPrimitiveUP(D3DPT_LINELIST, 1, data, sizeof(Vertex));
+   }
+   else
+   {
+      _cache.Add(data[0]);
+      _cache.Add(data[1]);
+   }
+}
+
+void D3DObjectLine::Setup(FLOAT x1, FLOAT y1, FLOAT x2, FLOAT y2, DWORD color)
+{
+   _x1 = x1;
+   _y1 = y1;
+   _x2 = x2;
+   _y2 = y2;
+   _color = color;
+}
diff --git a/src/modules/engines/direct3d/evas_direct3d_object_line.h b/src/modules/engines/direct3d/evas_direct3d_object_line.h
new file mode 100644 (file)
index 0000000..0e5d807
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef __EVAS_DIRECT3D_OBJECT_LINE_H__
+#define __EVAS_DIRECT3D_OBJECT_LINE_H__
+
+#include "evas_engine.h"
+
+#include "ref.h"
+#include "array.h"
+
+#include "evas_direct3d_object.h"
+
+class D3DObjectLine : public D3DObject
+{
+public:
+   D3DObjectLine();
+
+   static void BeginCache();
+   virtual void Draw(D3DDevice *d3d);
+   static void EndCache(D3DDevice *d3d);
+
+   void Setup(FLOAT x1, FLOAT y1, FLOAT x2, FLOAT y2, DWORD color);
+
+private:
+   FLOAT _x1, _y1, _x2, _y2;
+   DWORD _color;
+
+private:
+   struct Vertex
+   {
+      FLOAT x, y;
+      DWORD color;
+   };
+
+   static TArray<Vertex> _cache;
+   static bool _cache_enabled;
+};
+
+#endif  // __EVAS_DIRECT3D_OBJECT_LINE_H__
diff --git a/src/modules/engines/direct3d/evas_direct3d_object_rect.cpp b/src/modules/engines/direct3d/evas_direct3d_object_rect.cpp
new file mode 100644 (file)
index 0000000..ebdd22b
--- /dev/null
@@ -0,0 +1,65 @@
+#include "evas_direct3d_object_rect.h"
+#include "evas_direct3d_device.h"
+#include "evas_direct3d_shader_pack.h"
+
+TArray<D3DObjectRect::Vertex> D3DObjectRect::_cache;
+bool D3DObjectRect::_cache_enabled = false;
+
+D3DObjectRect::D3DObjectRect()
+{
+   _x = _y = 0;
+   _w = _h = 0;
+}
+
+void D3DObjectRect::BeginCache()
+{
+   _cache.Allocate(0);
+   _cache_enabled = true;
+}
+
+void D3DObjectRect::EndCache(D3DDevice *d3d)
+{
+   if (!_cache_enabled || _cache.Length() == 0)
+      return;
+   D3DShaderPack::Current()->SetVDecl(d3d, D3DShaderPack::VDECL_XYC);
+   D3DShaderPack::Current()->SetVS(d3d, D3DShaderPack::VS_COPY_COLOR);
+   D3DShaderPack::Current()->SetPS(d3d, D3DShaderPack::PS_COLOR);
+   d3d->GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLELIST, _cache.Length() / 3,
+      _cache.Data(), sizeof(Vertex));
+
+   DBG("Rect cache drawn: %d items", _cache.Length() / 6);
+   _cache_enabled = false;
+}
+
+void D3DObjectRect::Draw(D3DDevice *d3d)
+{
+   Vertex data[6] = {
+      {_x, _y, _color}, {_x + _w, _y, _color}, {_x, _y + _h, _color},
+      {_x, _y + _h, _color}, {_x + _w, _y, _color}, {_x + _w, _y + _h, _color}};
+
+   if (!_cache_enabled)
+   {
+      D3DShaderPack::Current()->SetVDecl(d3d, D3DShaderPack::VDECL_XYC);
+      D3DShaderPack::Current()->SetVS(d3d, D3DShaderPack::VS_COPY_COLOR);
+      D3DShaderPack::Current()->SetPS(d3d, D3DShaderPack::PS_COLOR);
+      d3d->GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, data, sizeof(Vertex));
+   }
+   else
+   {
+      _cache.Add(data[0]);
+      _cache.Add(data[1]);
+      _cache.Add(data[2]);
+      _cache.Add(data[3]);
+      _cache.Add(data[4]);
+      _cache.Add(data[5]);
+   }
+}
+
+void D3DObjectRect::Setup(FLOAT x, FLOAT y, FLOAT w, FLOAT h, DWORD color)
+{
+   _x = x;
+   _y = y;
+   _w = w;
+   _h = h;
+   _color = color;
+}
diff --git a/src/modules/engines/direct3d/evas_direct3d_object_rect.h b/src/modules/engines/direct3d/evas_direct3d_object_rect.h
new file mode 100644 (file)
index 0000000..f7ef084
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef __EVAS_DIRECT3D_OBJECT_RECT_H__
+#define __EVAS_DIRECT3D_OBJECT_RECT_H__
+
+#include "evas_engine.h"
+
+#include "ref.h"
+#include "array.h"
+
+#include "evas_direct3d_object.h"
+
+class D3DObjectRect : public D3DObject
+{
+public:
+   D3DObjectRect();
+
+   static void BeginCache();
+   virtual void Draw(D3DDevice *d3d);
+   static void EndCache(D3DDevice *d3d);
+
+   void Setup(FLOAT x, FLOAT y, FLOAT w, FLOAT h, DWORD color);
+
+private:
+   FLOAT _x, _y, _w, _h;
+   DWORD _color;
+
+private:
+   struct Vertex
+   {
+      FLOAT x, y;
+      DWORD color;
+   };
+
+   static TArray<Vertex> _cache;
+   static bool _cache_enabled;
+};
+
+#endif  // __EVAS_DIRECT3D_OBJECT_RECT_H__
diff --git a/src/modules/engines/direct3d/evas_direct3d_scene.cpp b/src/modules/engines/direct3d/evas_direct3d_scene.cpp
new file mode 100644 (file)
index 0000000..b171fc0
--- /dev/null
@@ -0,0 +1,33 @@
+
+#include "evas_direct3d_scene.h"
+
+D3DScene::D3DScene()
+{
+}
+
+void D3DScene::FreeObjects()
+{
+   for (int i = 0; i < _objects.Length(); i++)
+      _objects[i]->SetFree(true);
+}
+
+void D3DScene::DrawAll(D3DDevice *d3d)
+{
+   for (int i = 0; i < _objects.Length(); i++)
+   {
+      if (!_objects[i]->IsFree())
+         _objects[i]->Draw(d3d);
+   }
+}
+
+void D3DScene::DeleteObject(D3DObject *object)
+{
+   for (int i = 0; i < _objects.Length(); i++)
+   {
+      if (_objects[i].Addr() == object)
+      {
+         _objects.Replace(i);
+         return;
+      }
+   }
+}
diff --git a/src/modules/engines/direct3d/evas_direct3d_scene.h b/src/modules/engines/direct3d/evas_direct3d_scene.h
new file mode 100644 (file)
index 0000000..e2f5f94
--- /dev/null
@@ -0,0 +1,63 @@
+#ifndef __EVAS_DIRECT3D_SCENE_H__
+#define __EVAS_DIRECT3D_SCENE_H__
+
+#include "evas_engine.h"
+
+#include <assert.h>
+#include <typeinfo>
+
+#include "ref.h"
+#include "array.h"
+
+#include "evas_direct3d_object.h"
+
+class D3DDevice;
+
+class D3DScene : virtual public Referenc
+{
+public:
+   D3DScene();
+
+   void FreeObjects();
+
+   inline void AddObject(D3DObject *object);
+   inline int GetObjectCount();
+   void DeleteObject(D3DObject *object);
+
+   void DrawAll(D3DDevice *d3d);
+
+   template <class T> T *GetFreeObject()
+   {
+      for (int i = 0; i < _objects.Length(); i++)
+      {
+         if (typeid(T) == typeid(*_objects[i].Addr()) && _objects[i]->IsFree())
+            return (T *)_objects[i].Addr();
+      }
+      return NULL;
+   }
+
+   template <class T> void GetObjectsOfType(TArray<T *> &res)
+   {
+      for (int i = 0; i < _objects.Length(); i++)
+      {
+         if (typeid(T) == typeid(*_objects[i].Addr()))
+            res.Add((T *)_objects[i].Addr());
+      }
+   }
+
+private:
+   TArray<Ref<D3DObject> > _objects;
+};
+
+void D3DScene::AddObject(D3DObject *object)
+{
+   assert(object != NULL);
+   _objects.Add(object);
+}
+
+int D3DScene::GetObjectCount()
+{
+   return _objects.Length();
+}
+
+#endif  // __EVAS_DIRECT3D_SCENE_H__
diff --git a/src/modules/engines/direct3d/evas_direct3d_shader_pack.cpp b/src/modules/engines/direct3d/evas_direct3d_shader_pack.cpp
new file mode 100644 (file)
index 0000000..d9c868f
--- /dev/null
@@ -0,0 +1,344 @@
+
+#include <assert.h>
+
+#include <d3dx9.h>
+
+#include "evas_direct3d_shader_pack.h"
+#include "evas_direct3d_device.h"
+
+Ref<D3DShaderPack> D3DShaderPack::_this;
+
+D3DShaderPack::D3DShaderPack()
+{
+}
+
+D3DShaderPack::~D3DShaderPack()
+{
+   Uninitialize();
+}
+
+D3DShaderPack *D3DShaderPack::Current()
+{
+   if (_this.IsNull())
+      _this = new D3DShaderPack();
+   return _this;
+}
+
+void D3DShaderPack::SetCurrent(D3DShaderPack *obj)
+{
+   _this = obj;
+}
+
+
+bool D3DShaderPack::Initialize(D3DDevice *d3d)
+{
+   bool res = true;
+   if (!(res = InitVertexDeclarations(d3d) && res))
+      WRN("Failed to create vdecl set");
+   if (!(res = InitVertexShaders(d3d) && res))
+      WRN("Failed to create vs set");
+   if (!(res = InitPixelShaders(d3d) && res))
+      WRN("Failed to create ps set");
+   return res;
+}
+
+void D3DShaderPack::Uninitialize()
+{
+   for (int i = 0; i < _vdecl.Length(); i++)
+   {
+      if (_vdecl[i] != NULL)
+      {
+         _vdecl[i]->Release();
+         _vdecl[i] = NULL;
+      }
+   }
+
+   for (int i = 0; i < _vs.Length(); i++)
+   {
+      if (_vs[i] != NULL)
+      {
+         _vs[i]->Release();
+         _vs[i] = NULL;
+      }
+   }
+
+   for (int i = 0; i < _ps.Length(); i++)
+   {
+      if (_ps[i] != NULL)
+      {
+         _ps[i]->Release();
+         _ps[i] = NULL;
+      }
+   }
+}
+
+bool D3DShaderPack::InitVertexDeclarations(D3DDevice *d3d)
+{
+   _vdecl.Allocate(VDECL_NUM);
+   _vdecl.Set(NULL);
+
+   LPDIRECT3DVERTEXDECLARATION9 vdecl = NULL;
+   {
+      D3DVERTEXELEMENT9 elements[] = {
+         {0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
+         {0, 8, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
+         D3DDECL_END()
+         };
+      if (FAILED(d3d->GetDevice()->CreateVertexDeclaration(elements, &vdecl)))
+         return false;
+      if (vdecl == NULL)
+         return false;
+   }
+   _vdecl[VDECL_XYC] = vdecl;
+   vdecl = NULL;
+   {
+      D3DVERTEXELEMENT9 elements[] = {
+         {0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
+         {0, 8, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
+         D3DDECL_END()
+         };
+      if (FAILED(d3d->GetDevice()->CreateVertexDeclaration(elements, &vdecl)))
+         return false;
+      if (vdecl == NULL)
+         return false;
+   }
+   _vdecl[VDECL_XYUV] = vdecl;
+   vdecl = NULL;
+   {
+      D3DVERTEXELEMENT9 elements[] = {
+         {0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
+         {0, 8, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
+         {0, 16, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
+         D3DDECL_END()
+         };
+      if (FAILED(d3d->GetDevice()->CreateVertexDeclaration(elements, &vdecl)))
+         return false;
+      if (vdecl == NULL)
+         return false;
+   }
+   _vdecl[VDECL_XYUVC] = vdecl;
+   vdecl = NULL;
+   {
+      D3DVERTEXELEMENT9 elements[] = {
+         {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
+         {0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
+         {0, 20, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
+         D3DDECL_END()
+         };
+      if (FAILED(d3d->GetDevice()->CreateVertexDeclaration(elements, &vdecl)))
+         return false;
+      if (vdecl == NULL)
+         return false;
+   }
+   _vdecl[VDECL_XYZUVC] = vdecl;
+
+   return true;
+}
+
+bool D3DShaderPack::InitVertexShaders(D3DDevice *d3d)
+{
+   _vs.Allocate(VS_NUM);
+   _vs.Set(NULL);
+
+   {
+      char buf[] =
+         "struct VsInput {     float2 pos : POSITION; float4 col : COLOR; };\n"
+         "struct VsOutput { float4 pos : POSITION; float4 col : COLOR0; };\n"
+         "VsOutput main(VsInput vs_in) {\n"
+         "VsOutput vs_out;\n"
+             "vs_out.pos = float4(vs_in.pos, 0, 1);\n"
+         "vs_out.col = vs_in.col;\n"
+             "return vs_out;}";
+
+      _vs[VS_COPY_COLOR] = (LPDIRECT3DVERTEXSHADER9)
+         CompileShader(d3d, true, "CopyColor", buf, sizeof(buf) - 1);
+      if (_vs[VS_COPY_COLOR] == NULL)
+         return false;
+   }
+
+   {
+      char buf[] =
+         "struct VsInput {     float2 pos : POSITION; float2 tex : TEXCOORD0; };\n"
+         "struct VsOutput { float4 pos : POSITION; float2 tex : TEXCOORD0; };\n"
+         "VsOutput main(VsInput vs_in) {\n"
+         "VsOutput vs_out;\n"
+             "vs_out.pos = float4(vs_in.pos, 0, 1);\n"
+         "vs_out.tex = vs_in.tex;\n"
+             "return vs_out;}";
+
+      _vs[VS_COPY_UV] = (LPDIRECT3DVERTEXSHADER9)
+         CompileShader(d3d, true, "CopyUV", buf, sizeof(buf) - 1);
+      if (_vs[VS_COPY_UV] == NULL)
+         return false;
+   }
+
+   {
+      char buf[] =
+         "struct VsInput {     float2 pos : POSITION; float2 tex : TEXCOORD0; float4 col : COLOR; };\n"
+         "struct VsOutput { float4 pos : POSITION; float2 tex : TEXCOORD0; float4 col : COLOR0; };\n"
+         "VsOutput main(VsInput vs_in) {\n"
+         "VsOutput vs_out;\n"
+             "vs_out.pos = float4(vs_in.pos, 0, 1);\n"
+         "vs_out.tex = vs_in.tex;\n"
+         "vs_out.col = vs_in.col;\n"
+             "return vs_out;}";
+
+      _vs[VS_COPY_UV_COLOR] = (LPDIRECT3DVERTEXSHADER9)
+         CompileShader(d3d, true, "CopyUVColor", buf, sizeof(buf) - 1);
+      if (_vs[VS_COPY_UV_COLOR] == NULL)
+         return false;
+   }
+
+   {
+      char buf[] =
+         "struct VsInput {     float3 pos : POSITION; float2 tex : TEXCOORD0; float4 col : COLOR; };\n"
+         "struct VsOutput { float4 pos : POSITION; float2 tex : TEXCOORD0; float4 col : COLOR0; };\n"
+         "VsOutput main(VsInput vs_in) {\n"
+         "VsOutput vs_out;\n"
+             "vs_out.pos = float4(vs_in.pos, 1);\n"
+         "vs_out.tex = vs_in.tex;\n"
+         "vs_out.col = vs_in.col;\n"
+             "return vs_out;}";
+
+      _vs[VS_COPY_UV_COLOR_Z] = (LPDIRECT3DVERTEXSHADER9)
+         CompileShader(d3d, true, "CopyUVColorZ", buf, sizeof(buf) - 1);
+      if (_vs[VS_COPY_UV_COLOR_Z] == NULL)
+         return false;
+   }
+
+   return true;
+}
+
+bool D3DShaderPack::InitPixelShaders(D3DDevice *d3d)
+{
+   _ps.Allocate(PS_NUM);
+   _ps.Set(NULL);
+
+   {
+      char buf[] =
+         "struct VsOutput { float4 pos : POSITION; float4 col : COLOR0; };\n"
+         "float4 main(VsOutput ps_in) : COLOR0 {\n"
+         "return ps_in.col;}";
+
+      _ps[PS_COLOR] = (LPDIRECT3DPIXELSHADER9)
+         CompileShader(d3d, false, "Color", buf, sizeof(buf) - 1);
+      if (_ps[PS_COLOR] == NULL)
+         return false;
+   }
+
+   {
+      char buf[] =
+         "sampler Texture : register(s0);\n"
+         "struct VsOutput { float4 pos : POSITION; float2 tex : TEXCOORD0; };\n"
+         "float4 main(VsOutput ps_in) : COLOR0 {\n"
+         "return tex2D(Texture, ps_in.tex);}";
+
+      _ps[PS_TEX] = (LPDIRECT3DPIXELSHADER9)
+         CompileShader(d3d, false, "Tex", buf, sizeof(buf) - 1);
+      if (_ps[PS_TEX] == NULL)
+         return false;
+   }
+
+   {
+      char buf[] =
+         "sampler Texture : register(s0);\n"
+         "struct VsOutput { float4 pos : POSITION; float2 tex : TEXCOORD0; float4 col : COLOR0; };\n"
+         "float4 main(VsOutput ps_in) : COLOR0 {\n"
+         "return tex2D(Texture, ps_in.tex) * ps_in.col;}";
+
+      _ps[PS_TEX_COLOR_FILTER] = (LPDIRECT3DPIXELSHADER9)
+         CompileShader(d3d, false, "TexColorFilter", buf, sizeof(buf) - 1);
+      if (_ps[PS_TEX_COLOR_FILTER] == NULL)
+         return false;
+   }
+
+   {
+      char buf[] =
+         "sampler Texture : register(s1);\n"
+         "struct VsOutput { float4 pos : POSITION; float2 tex : TEXCOORD0; };\n"
+         "float4 main(VsOutput ps_in) : COLOR0 {\n"
+         "return tex2D(Texture, ps_in.tex);}";
+
+      _ps[PS_TEX_2] = (LPDIRECT3DPIXELSHADER9)
+         CompileShader(d3d, false, "Tex2", buf, sizeof(buf) - 1);
+      if (_ps[PS_TEX_2] == NULL)
+         return false;
+   }
+
+   return true;
+}
+
+void *D3DShaderPack::CompileShader(D3DDevice *d3d, bool make_vs,
+   const char *name, const char *buf, int size)
+{
+   LPD3DXBUFFER compiled_res = NULL;
+   LPD3DXBUFFER error_msgs = NULL;
+
+   HRESULT res = D3DXCompileShader(buf, size, NULL, NULL,
+      "main", make_vs ? "vs_2_0" : "ps_2_0",  // ?
+      0, &compiled_res, &error_msgs, NULL);
+
+   if (FAILED(res))
+   {
+      ERR("Shader %s compilation failed, code = %X", name, res);
+      if (error_msgs == NULL)
+         return NULL;
+      const char *mess = (const char *)error_msgs->GetBufferPointer();
+      ERR("Error output:\n%s", mess);
+      error_msgs->Release();
+      return NULL;
+   }
+
+   if (error_msgs != NULL)
+      error_msgs->Release();
+
+   void *res_ptr = NULL;
+   if (make_vs)
+   {
+      LPDIRECT3DVERTEXSHADER9 vs;
+      res = d3d->GetDevice()->CreateVertexShader((DWORD *)compiled_res->GetBufferPointer(), &vs);
+      res_ptr = (void *)vs;
+   }
+   else
+   {
+      LPDIRECT3DPIXELSHADER9 ps;
+      res = d3d->GetDevice()->CreatePixelShader((DWORD *)compiled_res->GetBufferPointer(), &ps);
+      res_ptr = (void *)ps;
+   }
+
+   compiled_res->Release();
+
+   if (FAILED(res))
+   {
+      WRN("Shader %s creation failed, code = %X", name, res);
+      return NULL;
+   }
+   return res_ptr;
+}
+
+bool D3DShaderPack::SetVDecl(D3DDevice *d3d, int id)
+{
+   if (id < 0 || id >= _vdecl.Length() || _vdecl[id] == NULL)
+      return false;
+   assert(d3d != NULL);
+   d3d->GetDevice()->SetVertexDeclaration(_vdecl[id]);
+   return true;
+}
+
+bool D3DShaderPack::SetVS(D3DDevice *d3d, int id)
+{
+   if (id < 0 || id >= _vs.Length() || _vs[id] == NULL)
+      return false;
+   assert(d3d != NULL);
+   d3d->GetDevice()->SetVertexShader(_vs[id]);
+   return true;
+}
+
+bool D3DShaderPack::SetPS(D3DDevice *d3d, int id)
+{
+   if (id < 0 || id >= _ps.Length() || _ps[id] == NULL)
+      return false;
+   assert(d3d != NULL);
+   d3d->GetDevice()->SetPixelShader(_ps[id]);
+   return true;
+}
diff --git a/src/modules/engines/direct3d/evas_direct3d_shader_pack.h b/src/modules/engines/direct3d/evas_direct3d_shader_pack.h
new file mode 100644 (file)
index 0000000..b865f78
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef __EVAS_DIRECT3D_SHADER_PACK_H__
+#define __EVAS_DIRECT3D_SHADER_PACK_H__
+
+#include "evas_engine.h"
+
+#include "ref.h"
+#include "array.h"
+
+class D3DDevice;
+
+class D3DShaderPack : virtual public Referenc
+{
+public:
+   ~D3DShaderPack();
+
+   static D3DShaderPack *Current();
+   static void SetCurrent(D3DShaderPack *obj);
+
+   bool Initialize(D3DDevice *d3d);
+   void Uninitialize();
+
+   bool SetVDecl(D3DDevice *d3d, int id);
+   bool SetVS(D3DDevice *d3d, int id);
+   bool SetPS(D3DDevice *d3d, int id);
+
+public:
+   enum VDECL
+   {
+      VDECL_XYC = 0,
+      VDECL_XYUV,
+      VDECL_XYUVC,
+      VDECL_XYZUVC,
+
+      VDECL_NUM
+   };
+
+   enum VS
+   {
+      VS_COPY_COLOR = 0,
+      VS_COPY_UV,
+      VS_COPY_UV_COLOR,
+      VS_COPY_UV_COLOR_Z,
+
+      VS_NUM
+   };
+
+   enum PS
+   {
+      PS_COLOR = 0,
+      PS_TEX,
+      PS_TEX_COLOR_FILTER,
+      PS_TEX_2,
+
+      PS_NUM
+   };
+
+private:
+   D3DShaderPack();
+
+   bool InitVertexDeclarations(D3DDevice *d3d);
+   bool InitVertexShaders(D3DDevice *d3d);
+   bool InitPixelShaders(D3DDevice *d3d);
+
+   void *CompileShader(D3DDevice *d3d, bool make_vs, const char *name,
+      const char *buf, int size);
+
+private:
+   TArray<LPDIRECT3DVERTEXDECLARATION9> _vdecl;
+   TArray<LPDIRECT3DVERTEXSHADER9> _vs;
+   TArray<LPDIRECT3DPIXELSHADER9> _ps;
+
+   static Ref<D3DShaderPack> _this;
+};
+
+#endif  // __EVAS_DIRECT3D_SHADER_PACK_H__
diff --git a/src/modules/engines/direct3d/evas_direct3d_vertex_buffer_cache.cpp b/src/modules/engines/direct3d/evas_direct3d_vertex_buffer_cache.cpp
new file mode 100644 (file)
index 0000000..8d3dd45
--- /dev/null
@@ -0,0 +1,154 @@
+
+//#define ENABLE_LOG_PRINTF
+
+#include "evas_direct3d_vertex_buffer_cache.h"
+#include "evas_direct3d_device.h"
+
+#include <assert.h>
+
+
+Ref<D3DVertexBufferCache> D3DVertexBufferCache::_this;
+
+D3DVertexBufferCache::D3DVertexBufferCache()
+{
+   size_border_low = 0.6;  // We can reuse buffer on 60%
+   size_border_high = 0.2;  // We can reallocate the buffer on 20%
+}
+
+D3DVertexBufferCache::~D3DVertexBufferCache()
+{
+   Uninitialize();
+}
+
+D3DVertexBufferCache *D3DVertexBufferCache::Current()
+{
+   if (_this.IsNull())
+      _this = new D3DVertexBufferCache();
+   return _this;
+}
+
+void D3DVertexBufferCache::SetCurrent(D3DVertexBufferCache *obj)
+{
+   _this = obj;
+}
+
+void D3DVertexBufferCache::Uninitialize()
+{
+   for (int i = 0; i < _cache.Length(); i++)
+   {
+      assert(_cache[i].vb != NULL);
+      _cache[i].vb->Release();
+   }
+   _cache.Resize();
+}
+
+bool D3DVertexBufferCache::InitBuffer(D3DDevice *d3d, BYTE *data, int size, CacheEntryInfo &info)
+{
+   assert(d3d != NULL);
+   assert(data != NULL);
+   assert(size > 0);
+
+   int best = FindBestEntry(size);
+   CacheEntry *ce = NULL;
+
+   // Reallocate
+   if (best >= 0 && _cache[best].size < size)
+   {
+      DeleteEntry(best);
+      best = -1;
+   }
+
+   // New
+   if (best < 0)
+   {
+      CacheEntry new_entry;
+      if (!CreateEntry(d3d, new_entry, size))
+      {
+       WRN("Failed to create new vbcache entry");
+         return false;
+      }
+      _cache.Add(new_entry);
+      info.id = _cache.Length() - 1;
+      ce = _cache.Last();
+   }
+   else
+   {
+      info.id = best;
+      ce = &_cache[best];
+   }
+
+   assert(ce != NULL);
+   if (!InsertData(*ce, data, size))
+   {
+      WRN("Failed to insert vbcache data");
+      return false;
+   }
+   return true;
+}
+
+bool D3DVertexBufferCache::SelectBufferToDevice(D3DDevice *device, int id, int vertex_size)
+{
+   if (id < 0 || id >= _cache.Length())
+      return false;
+   return SUCCEEDED(device->GetDevice()->SetStreamSource(0, _cache[id].vb, 0, vertex_size));
+}
+
+int D3DVertexBufferCache::FindBestEntry(int size)
+{
+   // Search for buffer that fits in borders
+   for (int i = 0; i < _cache.Length(); i++)
+   {
+      const int vs = _cache[i].size;
+      if (size >= (vs - FLOAT(vs) * size_border_low) && size <= vs)
+         return i;
+   }
+   bool less_than_all = true;
+   for (int i = 0; i < _cache.Length(); i++)
+   {
+      const int vs = _cache[i].size;
+      if (size >= (vs - FLOAT(vs) * size_border_low))
+         less_than_all = false;
+   }
+   // Requested size is too small to reuse in any buffer
+   if (less_than_all)
+      return -1;
+   // Search for buffer that can be reallocated
+   for (int i = 0; i < _cache.Length(); i++)
+   {
+      const int vs = _cache[i].size;
+      if (size <= (vs + FLOAT(vs) * size_border_high))
+         return i;
+   }
+   // No buffer can be reused or reallocated, create a new one
+   return -1;
+}
+
+bool D3DVertexBufferCache::CreateEntry(D3DDevice *d3d, CacheEntry &entry, int size)
+{
+   assert(d3d != NULL);
+   if (FAILED(d3d->GetDevice()->CreateVertexBuffer(size, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY,
+      0, D3DPOOL_DEFAULT, &entry.vb, NULL)))
+   {
+      return false;
+   }
+   entry.size = size;
+   return true;
+}
+
+void D3DVertexBufferCache::DeleteEntry(int id)
+{
+   if (id < 0 || id >= _cache.Length())
+      return;
+   assert(_cache[id].vb != NULL);
+   _cache[id].vb->Release();
+   _cache.Replace(id);
+}
+
+bool D3DVertexBufferCache::InsertData(CacheEntry &entry, BYTE *data, int size)
+{
+   BYTE *ptr = NULL;
+   if (FAILED(entry.vb->Lock(0, size, (void **)&ptr, D3DLOCK_DISCARD)))
+      return false;
+   CopyMemory(ptr, data, size);
+   return SUCCEEDED(entry.vb->Unlock());
+}
diff --git a/src/modules/engines/direct3d/evas_direct3d_vertex_buffer_cache.h b/src/modules/engines/direct3d/evas_direct3d_vertex_buffer_cache.h
new file mode 100644 (file)
index 0000000..822ac80
--- /dev/null
@@ -0,0 +1,60 @@
+#ifndef __EVAS_DIRECT3D_VERTEX_BUFFER_CACHE_H__
+#define __EVAS_DIRECT3D_VERTEX_BUFFER_CACHE_H__
+
+#include "evas_engine.h"
+
+#include "ref.h"
+#include "array.h"
+
+class D3DDevice;
+
+class D3DVertexBufferCache : virtual public Referenc
+{
+public:
+   struct CacheEntryInfo
+   {
+      int id;
+   };
+
+public:
+   ~D3DVertexBufferCache();
+
+   static D3DVertexBufferCache *Current();
+   static void SetCurrent(D3DVertexBufferCache *obj);
+
+   inline void SetSizeBorders(FLOAT low, FLOAT high);
+
+   bool InitBuffer(D3DDevice *d3d, BYTE *data, int size, CacheEntryInfo &info);
+   bool SelectBufferToDevice(D3DDevice *device, int id, int vertex_size);
+   void Uninitialize();
+
+private:
+   struct CacheEntry
+   {
+      LPDIRECT3DVERTEXBUFFER9 vb;
+      int size;
+   };
+
+private:
+   D3DVertexBufferCache();
+
+   int FindBestEntry(int size);
+   bool CreateEntry(D3DDevice *d3d, CacheEntry &entry, int size);
+   void DeleteEntry(int id);
+   bool InsertData(CacheEntry &entry, BYTE *data, int size);
+
+private:
+   TArray<CacheEntry> _cache;
+   FLOAT size_border_low;
+   FLOAT size_border_high;
+
+   static Ref<D3DVertexBufferCache> _this;
+};
+
+void D3DVertexBufferCache::SetSizeBorders(FLOAT low, FLOAT high)
+{
+   size_border_low = low;
+   size_border_high = high;
+}
+
+#endif  // __EVAS_DIRECT3D_VERTEX_BUFFER_CACHE_H__
diff --git a/src/modules/engines/direct3d/evas_engine.c b/src/modules/engines/direct3d/evas_engine.c
new file mode 100644 (file)
index 0000000..8514f75
--- /dev/null
@@ -0,0 +1,635 @@
+#include "evas_engine.h"
+#include "evas_private.h"
+#include "Evas_Engine_Direct3D.h"
+
+#undef EAPI
+#define EAPI __declspec(dllexport)
+
+/* engine struct data */
+typedef struct _Render_Engine Render_Engine;
+struct _Render_Engine
+{
+   Direct3DDeviceHandler d3d;
+   int width, height;
+   int end : 1;
+   int in_redraw : 1;
+};
+
+int _evas_engine_direct3d_log_dom = -1;
+
+/* function tables - filled in later (func and parent func) */
+static Evas_Func func, pfunc;
+
+//////////////////////////////////////////////////////////////////////////////
+// Prototypes
+
+static void *eng_info(Evas *e);
+static void  eng_info_free(Evas *e, void *info);
+static int   eng_setup(Evas *e, void *info);
+static void  eng_output_free(void *data);
+static void  eng_output_resize(void *data, int width, int height);
+
+//////////////////////////////////////////////////////////////////////////////
+// Init / shutdown methods
+//
+
+static void *
+_output_setup(int width, int height, int rotation, HWND window, int depth, int fullscreen)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)calloc(1, sizeof(Render_Engine));
+   if (!re)
+     return NULL;
+
+   /* if we haven't initialized - init (automatic abort if already done) */
+   evas_common_cpu_init();
+
+   evas_common_blend_init();
+   evas_common_image_init();
+   evas_common_convert_init();
+   evas_common_scale_init();
+   evas_common_rectangle_init();
+   evas_common_gradient_init();
+   evas_common_polygon_init();
+   evas_common_line_init();
+   evas_common_font_init();
+   evas_common_draw_init();
+   evas_common_tilebuf_init();
+   
+   if ((re->d3d = evas_direct3d_init(window, depth, fullscreen)) == 0)
+     {
+     free(re);
+     return NULL;
+     }
+
+   re->width = width;
+   re->height = height;
+
+   return re;
+}
+
+static void *
+eng_info(Evas *e)
+{
+   Evas_Engine_Info_Direct3D *info;
+   info = (Evas_Engine_Info_Direct3D *)calloc(1, sizeof(Evas_Engine_Info_Direct3D));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   memset(&info->info, 0, sizeof(info->info));
+   return info;
+   e = NULL;
+}
+
+static void
+eng_info_free(Evas *e, void *info)
+{
+   Evas_Engine_Info_Direct3D *in;
+   in = (Evas_Engine_Info_Direct3D *)info;
+   free(in);
+}
+
+static int
+eng_setup(Evas *e, void *info)
+{
+   Render_Engine *re;
+   Evas_Engine_Info_Direct3D *in;
+   re = (Render_Engine *)e->engine.data.output;   
+   in = (Evas_Engine_Info_Direct3D *)info;
+   if (e->engine.data.output == NULL)
+     {
+        e->engine.data.output = _output_setup(e->output.w,
+                                              e->output.h,
+                                              in->info.rotation,
+                                              in->info.window,
+                                              in->info.depth,
+                                              in->info.fullscreen);
+     }
+   else if (in->info.fullscreen != 0)
+   {
+      if (re != NULL)
+         evas_direct3d_set_layered(re->d3d, 0, 0, 0, NULL);
+      evas_direct3d_set_fullscreen(re->d3d, -1, -1, 1);
+   }
+   else if (in->info.fullscreen == 0)
+   {
+      evas_direct3d_set_fullscreen(re->d3d, re->width, re->height, 0);
+      if (re != NULL && in->info.layered == 0)
+         evas_direct3d_set_layered(re->d3d, 0, 0, 0, NULL);
+      else if (re != NULL && in->info.layered != 0 && in->shape != NULL)
+         evas_direct3d_set_layered(re->d3d, 1, in->shape->width, in->shape->height, in->shape->mask);
+   }
+
+   if (e->engine.data.output == NULL)
+     return 0;
+   if (e->engine.data.context == NULL)
+     e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
+
+   return 1;
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   evas_direct3d_free(re->d3d);
+
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Context
+//
+
+static void
+eng_context_color_set(void *data, void *context, int r, int g, int b, int a)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   evas_direct3d_context_color_set(re->d3d, r, g, b, a);
+
+   evas_common_draw_context_set_color(context, r, g, b, a);
+}
+
+static void
+eng_context_multiplier_set(void *data, void *context, int r, int g, int b, int a)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   evas_direct3d_context_set_multiplier(re->d3d, 255, 255, 255, a);
+
+   evas_common_draw_context_set_multiplier(context, r, g, b, a);
+}
+
+static void
+eng_context_multiplier_unset(void *data, void *context)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   evas_direct3d_context_set_multiplier(re->d3d, 255, 255, 255, 255);
+
+   evas_common_draw_context_unset_multiplier(context);
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Output manipulating
+//
+
+static void
+eng_output_resize(void *data, int width, int height)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   re->width = width;
+   re->height = height;
+   evas_direct3d_resize(re->d3d, width, height);
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int width, int height)
+{
+   Render_Engine *re = (Render_Engine *)data;
+}
+
+static void
+eng_output_redraws_rect_del(void *data, int x, int y, int width, int height)
+{
+   Render_Engine *re = (Render_Engine *)data;
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re = (Render_Engine *)data;
+}
+
+static void *
+eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h,
+  int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (re->end)
+     {
+     re->end = 0;
+     re->in_redraw = 0;
+     return NULL;
+     }
+
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = 800;  //re->d3d.width;
+   if (h) *h = 600;  //re->d3d.height;
+   if (cx) *cx = 0;
+   if (cy) *cy = 0;
+   if (cw) *cw = 800;  //re->d3d.width;
+   if (ch) *ch = 600;  //re->d3d.height;
+
+   re->in_redraw = 1;
+
+   return re;
+}
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface,
+  int x, int y, int w, int h)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   re->end = 1;
+}
+
+static void
+eng_output_flush(void *data)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   evas_direct3d_render_all(re->d3d);
+}
+
+static void
+eng_output_idle_flush(void *data)
+{
+   Render_Engine *re = (Render_Engine *)data;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Draw objects
+//
+
+static void
+eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   if (re->in_redraw == 0)
+      return;
+   evas_direct3d_line_draw(re->d3d, x1, y1, x2, y2);
+}
+
+static void
+eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   if (re->in_redraw == 0)
+      return;
+   evas_direct3d_rectangle_draw(re->d3d, x, y, w, h);
+}
+
+static void *
+eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   *error = 0;
+   return evas_direct3d_image_load(re->d3d, file, key, NULL, lo);
+}
+
+static void *
+eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   return evas_direct3d_image_new_from_data(re->d3d, w, h, image_data, alpha, cspace);
+}
+
+static void *
+eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   return evas_direct3d_image_new_from_copied_data(re->d3d, w, h, image_data, alpha, cspace);
+}
+
+static void
+eng_image_free(void *data, void *image)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   evas_direct3d_image_free(re->d3d, image);
+}
+
+static void *
+eng_image_data_put(void *data, void *image, DATA32 *image_data)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   evas_direct3d_image_data_put(re->d3d, image, image_data);
+   return image;
+}
+
+static void *
+eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h)
+{
+   return image;
+}
+
+static void *
+eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   evas_direct3d_image_data_get(re->d3d, image, to_write, image_data);
+   return image;
+}
+
+static void
+eng_image_draw(void *data, void *context, void *surface, void *image,
+   int src_x, int src_y, int src_w, int src_h,
+   int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   evas_direct3d_image_draw(re->d3d, image,
+      src_x, src_y, src_w, src_h,
+      dst_x, dst_y, dst_w, dst_h, smooth);
+}
+
+static void
+eng_image_size_get(void *data, void *image, int *w, int *h)
+{
+   evas_direct3d_image_size_get(image, w, h);
+}
+
+static int
+eng_image_alpha_get(void *data, void *image)
+{
+   // Hm:)
+   if (!image)
+      return 1;
+   return 0;
+}
+
+static int
+eng_image_colorspace_get(void *data, void *image)
+{
+   // Well, change that when you think about other colorspace
+   return EVAS_COLORSPACE_ARGB8888;
+}
+
+static void *
+eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   evas_direct3d_image_border_set(re->d3d, image, l, t, r, b);
+   return image;
+}
+
+static void
+eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   evas_direct3d_image_border_get(re->d3d, image, l, t, r, b);
+}
+
+static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+static void
+eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text)
+{
+   Render_Engine *re = (Render_Engine *)data;
+       RGBA_Image im;
+   im.image.data = NULL;
+   im.cache_entry.w = re->width;
+   im.cache_entry.h = re->height;
+
+   evas_direct3d_select_or_create_font(re->d3d, font);
+
+   evas_common_draw_context_font_ext_set(context, re->d3d,
+      evas_direct3d_font_texture_new,
+      evas_direct3d_font_texture_free,
+      evas_direct3d_font_texture_draw);
+   evas_common_font_draw(&im, context, font, x, y, text);
+   evas_common_draw_context_font_ext_set(context, NULL, NULL, NULL, NULL);
+}
+
+static void
+eng_font_free(void *data, void *font)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   evas_common_font_free(font);
+   evas_direct3d_font_free(re->d3d, font);
+}
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Gradients
+//
+
+static void
+eng_gradient2_color_np_stop_insert(void *data, void *gradient, int r, int g, int b, int a, float pos)
+{
+}
+
+static void
+eng_gradient2_clear(void *data, void *gradient)
+{
+}
+
+static void
+eng_gradient2_fill_transform_set(void *data, void *gradient, void *transform)
+{
+}
+
+static void
+eng_gradient2_fill_spread_set(void *data, void *gradient, int spread)
+{
+}
+
+static void *
+eng_gradient2_linear_new(void *data)
+{
+   return NULL;
+}
+
+static void
+eng_gradient2_linear_free(void *data, void *linear_gradient)
+{
+}
+
+static void
+eng_gradient2_linear_fill_set(void *data, void *linear_gradient, int x0, int y0, int x1, int y1)
+{
+}
+
+static int
+eng_gradient2_linear_is_opaque(void *data, void *context, void *linear_gradient, int x, int y, int w, int h)
+{
+   return 1;
+}
+
+static int
+eng_gradient2_linear_is_visible(void *data, void *context, void *linear_gradient, int x, int y, int w, int h)
+{
+   return 1;
+}
+
+static void
+eng_gradient2_linear_render_pre(void *data, void *context, void *linear_gradient)
+{
+}
+
+static void
+eng_gradient2_linear_render_post(void *data, void *linear_gradient)
+{
+}
+
+static void
+eng_gradient2_linear_draw(void *data, void *context, void *surface, void *linear_gradient, int x, int y, int w, int h)
+{
+}
+
+static void *
+eng_gradient2_radial_new(void *data)
+{
+   return NULL;
+}
+
+static void
+eng_gradient2_radial_free(void *data, void *radial_gradient)
+{
+}
+
+static void
+eng_gradient2_radial_fill_set(void *data, void *radial_gradient, float cx, float cy, float rx, float ry)
+{
+}
+
+static int
+eng_gradient2_radial_is_opaque(void *data, void *context, void *radial_gradient, int x, int y, int w, int h)
+{
+   return 1;
+}
+
+static int
+eng_gradient2_radial_is_visible(void *data, void *context, void *radial_gradient, int x, int y, int w, int h)
+{
+   return 1;
+}
+
+static void
+eng_gradient2_radial_render_pre(void *data, void *context, void *radial_gradient)
+{
+}
+
+static void
+eng_gradient2_radial_render_post(void *data, void *radial_gradient)
+{
+}
+
+static void
+eng_gradient2_radial_draw(void *data, void *context, void *surface, void *radial_gradient, int x, int y, int w, int h)
+{
+}
+
+
+/* module advertising code */
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
+    /* Initialize the log domain */
+   _evas_engine_direct3d_log_dom = eina_log_domain_register("EvasDirect3D", EVAS_DEFAULT_LOG_COLOR);
+   if(_evas_engine_direct3d_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the Direct3D engine.\n");
+       return 0;
+     }
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(context_color_set);
+   ORD(context_multiplier_set);
+   ORD(context_multiplier_unset);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   ORD(line_draw);
+   ORD(rectangle_draw);
+   ORD(image_load);
+   ORD(image_new_from_data);
+   ORD(image_new_from_copied_data);
+   ORD(image_free);
+   ORD(image_data_put);
+   ORD(image_dirty_region);
+   ORD(image_data_get);
+   ORD(image_draw);
+   ORD(image_size_get);
+   ORD(image_alpha_get);
+   ORD(image_colorspace_get);
+   ORD(image_border_set);
+   ORD(image_border_get);
+   ORD(font_draw);
+   ORD(font_free);
+
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+
+//   ORD(image_map4_draw);
+//   ORD(image_map_surface_new);
+//   ORD(image_map_surface_free);
+
+/*
+   ORD(gradient2_color_np_stop_insert);
+   ORD(gradient2_clear);
+   ORD(gradient2_fill_transform_set);
+   ORD(gradient2_fill_spread_set);
+   ORD(gradient2_linear_new);
+   ORD(gradient2_linear_free);
+   ORD(gradient2_linear_fill_set);
+   ORD(gradient2_linear_is_opaque);
+   ORD(gradient2_linear_is_visible);
+   ORD(gradient2_linear_render_pre);
+   ORD(gradient2_linear_render_post);
+   ORD(gradient2_linear_draw);
+   ORD(gradient2_radial_new);
+   ORD(gradient2_radial_free);
+   ORD(gradient2_radial_fill_set);
+   ORD(gradient2_radial_is_opaque);
+   ORD(gradient2_radial_is_visible);
+   ORD(gradient2_radial_render_pre);
+   ORD(gradient2_radial_render_post);
+   ORD(gradient2_radial_draw);
+*/
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+  eina_log_domain_unregister(_evas_engine_direct3d_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+  EVAS_MODULE_API_VERSION,
+  "direct3d",
+  "none",
+  {
+    module_open,
+    module_close
+  }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, direct3d);
+
+#ifndef EVAS_STATIC_BUILD_DIRECT3D
+EVAS_EINA_MODULE_DEFINE(engine, direct3d);
+#endif
diff --git a/src/modules/engines/direct3d/evas_engine.h b/src/modules/engines/direct3d/evas_engine.h
new file mode 100644 (file)
index 0000000..da1ebff
--- /dev/null
@@ -0,0 +1,125 @@
+#ifndef __EVAS_ENGINE_H__
+#define __EVAS_ENGINE_H__
+
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#include <d3d9.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define EVAS_INLINE_ARRAY_H  // We dont need that and it is buggy
+
+#include "evas_common.h"
+
+#ifdef __cplusplus
+}
+#endif
+
+
+//#define ENABLE_LOG_PRINTF
+
+extern int _evas_engine_direct3d_log_dom ;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_direct3d_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_direct3d_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_direct3d_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_direct3d_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_direct3d_log_dom, __VA_ARGS__)
+
+#ifdef ENABLE_LOG_PRINTF
+#define Log(str, ...) INF("D3D "str, __VA_ARGS__)
+#else
+#define Log(str, ...)
+#endif
+
+typedef void * Direct3DDeviceHandler;
+typedef void * Direct3DImageHandler;
+typedef void * Direct3DFontGlyphHandler;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Main engine functions
+
+Direct3DDeviceHandler evas_direct3d_init(HWND window, int depth, int fullscreen);
+void         evas_direct3d_free(Direct3DDeviceHandler d3d);
+void         evas_direct3d_render_all(Direct3DDeviceHandler d3d);
+void         evas_direct3d_resize(Direct3DDeviceHandler d3d, int width, int height);
+void         evas_direct3d_set_fullscreen(Direct3DDeviceHandler d3d,
+   int width, int height, int fullscreen);
+void         evas_direct3d_set_layered(Direct3DDeviceHandler d3d, int layered,
+   int mask_width, int mask_height, unsigned char *mask);
+
+
+// Context manipulations
+
+void         evas_direct3d_context_color_set(Direct3DDeviceHandler d3d, int r, int g, int b, int a);
+void         evas_direct3d_context_set_multiplier(Direct3DDeviceHandler d3d, int r, int g, int b, int a);
+
+// Simple objects
+
+void         evas_direct3d_line_draw(Direct3DDeviceHandler d3d, int x1, int y1, int x2, int y2);
+void         evas_direct3d_rectangle_draw(Direct3DDeviceHandler d3d, int x, int y, int w, int h);
+
+// Images
+
+Direct3DImageHandler evas_direct3d_image_load(Direct3DDeviceHandler d3d,
+   const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo);
+Direct3DImageHandler evas_direct3d_image_new_from_data(Direct3DDeviceHandler d3d,
+   int w, int h, DWORD *image_data, int alpha, int cspace);
+Direct3DImageHandler evas_direct3d_image_new_from_copied_data(Direct3DDeviceHandler d3d,
+   int w, int h, DWORD *image_data, int alpha, int cspace);
+void evas_direct3d_image_free(Direct3DDeviceHandler d3d, Direct3DImageHandler image);
+void evas_direct3d_image_data_put(Direct3DDeviceHandler d3d, Direct3DImageHandler image,
+   DWORD *image_data);
+void evas_direct3d_image_data_get(Direct3DDeviceHandler d3d, Direct3DImageHandler image,
+   int to_write, DATA32 **image_data);
+void evas_direct3d_image_draw(Direct3DDeviceHandler d3d, Direct3DImageHandler image,
+   int src_x, int src_y, int src_w, int src_h,
+   int dst_x, int dst_y, int dst_w, int dst_h, int smooth);
+void evas_direct3d_image_size_get(Direct3DImageHandler image, int *w, int *h);
+void evas_direct3d_image_border_set(Direct3DDeviceHandler d3d, Direct3DImageHandler image,
+   int l, int r, int t, int b);
+void evas_direct3d_image_border_get(Direct3DDeviceHandler d3d, Direct3DImageHandler image,
+   int *l, int *r, int *t, int *b);
+
+// Fonts
+
+Direct3DFontGlyphHandler evas_direct3d_font_texture_new(Direct3DDeviceHandler d3d,
+   RGBA_Font_Glyph *fg);
+void evas_direct3d_font_texture_free(Direct3DFontGlyphHandler ft);
+void evas_direct3d_font_texture_draw(Direct3DDeviceHandler d3d, void *dest, void *context,
+   RGBA_Font_Glyph *fg, int x, int y);
+void evas_direct3d_select_or_create_font(Direct3DDeviceHandler d3d, void *font);
+void evas_direct3d_font_free(Direct3DDeviceHandler d3d, void *font);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __EVAS_ENGINE_H__ */
diff --git a/src/modules/engines/direct3d/ref.h b/src/modules/engines/direct3d/ref.h
new file mode 100644 (file)
index 0000000..0853f2e
--- /dev/null
@@ -0,0 +1,210 @@
+#ifndef __REF_H__
+#define __REF_H__
+
+//////////////////////////////////////////////////////////////////////////////
+// class Referenc
+// Desc: Base class enabling reference interface
+// Note: Class should derive as virtual
+//
+class Referenc
+{
+public:
+   Referenc()
+      : refs_count(0) {};
+
+   inline int AddRef()
+   {
+      return ++refs_count;
+   }
+   inline int RemRef()
+   {
+      return --refs_count;
+   }
+   inline int RefCount()
+   {
+      return refs_count;
+   }
+
+private:
+   int refs_count;
+};
+
+
+//////////////////////////////////////////////////////////////////////////////
+// template Ref
+// Desc: Holder in smart-pointers system.
+// Important: Only Referenc subclasses may be used as template param.
+//
+
+template <class T>
+class Ref
+{
+public:
+   // Constructors & destructor
+   Ref();
+   //Ref(Ref<T> &ref);
+   Ref(const Ref<T> &ref);
+   Ref(T *ptr);
+   Ref(const T *ptr);
+   ~Ref();
+
+   Ref<T> &operator =(Ref<T> &ref);
+   Ref<T> &operator =(T *ptr);
+
+   inline T *Addr();
+   inline T *Addr() const;
+   inline int RefCount();
+   inline bool IsNull();
+
+   inline T *operator ->();
+   inline operator const T *() const;
+   inline operator T *();
+
+//private:
+   void RemRef();
+
+private:
+   T *m_ptr;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+// Constructors & destructor
+template <class T> Ref<T>::Ref()
+: m_ptr(NULL)
+{
+}
+
+//template <class T> Ref<T>::Ref(Ref<T> &ref)
+//: m_ptr(NULL)
+//{
+//   if (ref.Addr() != NULL)
+//   {
+//      m_ptr = ref.Addr();
+//      ((Referenc *)m_ptr)->AddRef();
+//   }
+//}
+
+template <class T> Ref<T>::Ref(const Ref<T> &ref)
+: m_ptr(NULL)
+{
+   if (ref.Addr() != NULL)
+   {
+      m_ptr = ref.Addr();
+      ((Referenc *)m_ptr)->AddRef();
+   }
+}
+
+template <class T> Ref<T>::Ref(T *ptr)
+: m_ptr(NULL)
+{
+   if (ptr != NULL)
+   {
+      m_ptr = ptr;
+      ((Referenc *)m_ptr)->AddRef();
+   }
+}
+
+template <class T> Ref<T>::Ref(const T *ptr)
+: m_ptr(NULL)
+{
+   if (ptr != NULL)
+   {
+      m_ptr = ptr;
+      ((Referenc *)m_ptr)->AddRef();
+   }
+}
+
+template <class T> Ref<T>::~Ref()
+{
+   if (m_ptr == NULL)
+      return;
+   RemRef();
+}
+
+// Check pointer on correctness
+template <class T> bool Ref<T>::IsNull()
+{
+   return (m_ptr == NULL);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Operators
+
+template <class T> Ref<T> &Ref<T>::operator =(T *ptr)
+{
+   if (ptr != NULL)
+   {
+      if (m_ptr != ptr)
+      {
+         RemRef();
+         m_ptr = ptr;
+         ((Referenc *)m_ptr)->AddRef();
+      }
+   }
+   else if (m_ptr != NULL)
+      RemRef();
+   return *this;
+}
+
+template <class T> Ref<T> &Ref<T>::operator =(Ref<T> &ref)
+{
+   if (ref.Addr() != NULL)
+   {
+      if (m_ptr != ref.Addr())
+      {
+         RemRef();
+         m_ptr = ref.Addr();
+         ((Referenc *)m_ptr)->AddRef();
+      }
+   }
+   else if (m_ptr != NULL)
+      RemRef();
+   return *this;
+}
+
+// Get pointer
+template <class T> T *Ref<T>::Addr()
+{
+   return m_ptr;
+}
+
+template <class T> T *Ref<T>::Addr() const
+{
+   return m_ptr;
+}
+
+// Get refs count
+template <class T> int Ref<T>::RefCount()
+{
+   if (m_ptr == NULL)
+      return 0;
+   return ((Referenc *)m_ptr)->RefCount();
+}
+
+// Remove ref to the object and delete it if necessary
+// WARNING: arrays cannot be deleted
+template <class T> void Ref<T>::RemRef()
+{
+   if (m_ptr == NULL)
+      return;
+   if (((Referenc *)m_ptr)->RemRef() == 0)
+      delete m_ptr;
+   m_ptr = NULL;
+}
+
+template <class T> T *Ref<T>::operator ->()
+{
+   return m_ptr;
+}
+
+template <class T> Ref<T>::operator const T *() const
+{
+   return m_ptr;
+}
+
+template <class T> Ref<T>::operator T *()
+{
+   return m_ptr;
+}
+
+#endif  // __REF_H__
diff --git a/src/modules/engines/directfb/Evas_Engine_DirectFB.h b/src/modules/engines/directfb/Evas_Engine_DirectFB.h
new file mode 100644 (file)
index 0000000..f4177e1
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef _EVAS_ENGINE_DIRECTFB_H
+#define _EVAS_ENGINE_DIRECTFB_H
+
+#include <Evas.h>
+#include <directfb/directfb.h>
+
+typedef struct _Evas_Engine_Info_DirectFB Evas_Engine_Info_DirectFB;
+
+struct _Evas_Engine_Info_DirectFB
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   struct Evas_Engine_DirectFB_Spec {
+      IDirectFB                 *dfb;
+      IDirectFBSurface          *surface;
+   } info;
+};
+#endif
+
+
diff --git a/src/modules/engines/directfb/Makefile.am b/src/modules/engines/directfb/Makefile.am
new file mode 100644 (file)
index 0000000..c4b7a5e
--- /dev/null
@@ -0,0 +1,44 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_engine_directfb_cflags@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+if BUILD_ENGINE_DIRECTFB
+
+DIRECTFB_SOURCES = evas_engine.c polygon.c
+DIRECTFB_LIBADD = @evas_engine_directfb_libs@
+
+pkgdir = $(libdir)/evas/modules/engines/directfb/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_DirectFB.h
+
+if !EVAS_STATIC_BUILD_DIRECTFB
+
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES  = $(DIRECTFB_SOURCES)
+
+module_la_LIBADD = @EINA_LIBS@ $(DIRECTFB_LIBADD) $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_directfb.la
+
+libevas_engine_directfb_la_SOURCES = $(DIRECTFB_SOURCES)
+libevas_engine_directfb_la_LIBADD = $(DIRECTFB_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/directfb/evas_engine.c b/src/modules/engines/directfb/evas_engine.c
new file mode 100644 (file)
index 0000000..1960c22
--- /dev/null
@@ -0,0 +1,1778 @@
+#include <assert.h>
+#include <math.h>
+#include <string.h>
+#include <sys/time.h>
+#include <time.h>
+#include "evas_engine.h"
+
+/* Uses Evas own image_draw primitive, for comparison purposes only. */
+//#define DFB_USE_EVAS_IMAGE_DRAW 1
+//#define DFB_USE_EVAS_RECT_DRAW 1
+//#define DFB_USE_EVAS_POLYGON_DRAW 1
+//#define DFB_UPDATE_INDIVIDUAL_RECTS 1
+#define DFB_FLIP_FLAGS DSFLIP_NONE
+//#define DFB_FLIP_FLAGS (DSFLIP_ONSYNC | DSFLIP_WAIT)
+
+/* Turn on debug */
+//#define DFB_DEBUG_IMAGE 1
+//#define DFB_DEBUG_FLAGS 1
+//#define DFB_DEBUG_ACCELERATION 1
+int _evas_engine_directfb_log_dom = -1;
+
+static Evas_Func func = {};
+static Evas_Func parent_func = {};
+static IDirectFB *dfb = NULL; /* XXX HACK to work around evas image cache
+                              * lack of extra data. Fix it instead later.
+                              */
+
+
+/***********************************************************************
+ * Evas helpers
+ **********************************************************************/
+static void
+_context_get_color(RGBA_Draw_Context *dc, int *r, int *g, int *b, int *a)
+{
+   DATA32 col;
+
+   if (dc->mul.use)
+     col = dc->mul.col;
+   else
+     col = dc->col.col;
+
+   *r = R_VAL(&col);
+   *g = G_VAL(&col);
+   *b = B_VAL(&col);
+   *a = A_VAL(&col);
+}
+
+
+/***********************************************************************
+ * DirectFB helpers
+ **********************************************************************/
+static void
+_dfb_surface_clear(IDirectFBSurface *surface, int x, int y, int w, int h)
+{
+   DFBRegion cr;
+   DFBResult r;
+
+   cr.x1 = x;
+   cr.y1 = y;
+   cr.x2 = x + w - 1;
+   cr.y2 = y + h - 1;
+   r = surface->SetClip(surface, &cr);
+   if (r != DFB_OK)
+     goto error;
+
+   r = surface->Clear(surface, 0, 0, 0, 0);
+   if (r != DFB_OK)
+     goto error;
+
+   return;
+
+ error:
+   ERR("DirectFB: could not clear surface: %s",
+        DirectFBErrorString(r));
+}
+
+static void
+_image_clear(DirectFB_Engine_Image_Entry *image, int x, int y, int w, int h)
+{
+   if (image->cache_entry.src->flags.alpha)
+     _dfb_surface_clear(image->surface, x, y, w, h);
+}
+
+static void
+_image_autoset_alpha(DirectFB_Engine_Image_Entry *image)
+{
+   DFBResult r;
+   DFBSurfacePixelFormat fmt;
+   IDirectFBSurface *surface;
+   RGBA_Image *im;
+   int has_alpha;
+
+   surface = image->surface;
+   r = surface->GetPixelFormat(surface, &fmt);
+   if (r != DFB_OK)
+     {
+       ERR("Could not get pixel format: %s",
+               DirectFBErrorString(r));
+       return;
+     }
+
+   /* XXX: check this in more depth in future, if other PF are supported */
+   image->cache_entry.src->flags.alpha = (fmt == DSPF_ARGB);
+}
+
+static void
+_dfb_surface_update(IDirectFBSurface *surface, int x, int y, int w, int h)
+{
+   DFBRegion cr;
+   DFBResult r;
+
+   cr.x1 = x;
+   cr.y1 = y;
+   cr.x2 = x + w - 1;
+   cr.y2 = y + h - 1;
+   r = surface->Flip(surface, &cr, DSFLIP_NONE);
+   if (r != DFB_OK)
+     WRN("Could not update surface: %s",
+          DirectFBErrorString(r));
+}
+
+static IDirectFBSurface *
+_dfb_surface_from_data(IDirectFB *dfb, int w, int h, void *data)
+{
+   IDirectFBSurface *s;
+   DFBSurfaceDescription desc;
+   DFBResult r;
+
+   desc.flags = (DSDESC_CAPS | DSDESC_WIDTH | DSDESC_HEIGHT |
+                DSDESC_PIXELFORMAT | DSDESC_PREALLOCATED);
+   desc.caps = DSCAPS_PREMULTIPLIED;
+   desc.width = w;
+   desc.height = h;
+   desc.preallocated[0].data = data;
+   desc.preallocated[0].pitch = w * 4;
+   desc.preallocated[1].data = NULL;
+   desc.preallocated[1].pitch = 0;
+   desc.pixelformat = DSPF_ARGB;
+   r = dfb->CreateSurface(dfb, &desc, &s);
+   if (r != DFB_OK)
+     {
+       ERR("Cannot create DirectFB surface: %s",
+                    DirectFBErrorString(r));
+       return NULL;
+     }
+
+   s->SetPorterDuff(s, DSPD_SRC_OVER);
+
+   return s;
+}
+
+static void
+_dfb_surface_free(IDirectFBSurface *surface)
+{
+   if (surface)
+     surface->Release(surface);
+}
+
+static void
+_dfb_blit_accel_caps_print(IDirectFBSurface *dst, IDirectFBSurface *src)
+{
+#ifdef DFB_DEBUG_ACCELERATION
+   DFBAccelerationMask mask;
+   DFBResult r;
+
+   r = dst->GetAccelerationMask(dst, src, &mask);
+   if (r != DFB_OK)
+     {
+       ERR("Could not retrieve acceleration mask: %s",
+               DirectFBErrorString(r));
+       return;
+     }
+
+   DBG("Acceleration: ");
+
+#define O(m) if (mask & m) DBG(#m " ")
+   O(DFXL_FILLRECTANGLE);
+   O(DFXL_DRAWRECTANGLE);
+   O(DFXL_DRAWLINE);
+   O(DFXL_FILLTRIANGLE);
+   O(DFXL_BLIT);
+   O(DFXL_STRETCHBLIT);
+   O(DFXL_TEXTRIANGLES);
+   O(DFXL_DRAWSTRING);
+#undef O
+
+   if (mask == DFXL_NONE) DBG("<NONE>");
+#endif /* DFB_DEBUG_ACCELERATION */
+}
+
+#ifdef DFB_DEBUG_FLAGS
+static const char *
+_dfb_blit_flags_str(DFBSurfaceBlittingFlags flags)
+{
+   static char buf[1024];
+
+   buf[0] = 0;
+
+#define T(m, n)                                        \
+   do {                                                \
+      if (flags & m) {                         \
+        if (buf[0] != 0) strcat(buf, " | ");   \
+        strcat(buf, n);                        \
+      }                                                \
+   } while (0)
+
+   T(DSBLIT_BLEND_ALPHACHANNEL, "BLEND_ALPHACHANNEL");
+   T(DSBLIT_BLEND_COLORALPHA, "BLEND_COLORALPHA");
+   T(DSBLIT_COLORIZE, "COLORIZE");
+   T(DSBLIT_SRC_COLORKEY, "SRC_COLORKEY");
+   T(DSBLIT_DST_COLORKEY, "DST_COLORKEY");
+   T(DSBLIT_SRC_PREMULTIPLY, "SRC_PREMULTIPLY");
+   T(DSBLIT_DST_PREMULTIPLY, "DST_PREMULTIPLY");
+   T(DSBLIT_DEMULTIPLY, "DEMULTIPLY");
+   T(DSBLIT_DEINTERLACE, "DSBLIT_DEINTERLACE");
+   T(DSBLIT_SRC_PREMULTCOLOR, "SRC_PREMULTCOLOR");
+   T(DSBLIT_XOR, "XOR");
+   T(DSBLIT_INDEX_TRANSLATION, "INDEX_TRANSLATION");
+#undef T
+
+   if (buf[0] == 0)
+     strcpy(buf, "NOFX");
+
+   return buf;
+}
+
+static const char *
+_dfb_draw_flags_str(DFBSurfaceDrawingFlags flags)
+{
+   static char buf[1024];
+
+   buf[0] = 0;
+
+#define T(m, n)                                        \
+   do {                                                \
+      if (flags & m) {                         \
+        if (buf[0] != 0) strcat(buf, " | ");   \
+        strcat(buf, n);                        \
+      }                                                \
+   } while (0)
+   T(DSDRAW_BLEND, "BLEND");
+   T(DSDRAW_DST_COLORKEY, "DST_COLORKEY");
+   T(DSDRAW_SRC_PREMULTIPLY, "SRC_PREMULTIPLY");
+   T(DSDRAW_DST_PREMULTIPLY, "DST_PREMULTIPLY");
+   T(DSDRAW_DEMULTIPLY, "DEMULTIPLY");
+   T(DSDRAW_XOR, "DSDRAW_XOR");
+#undef T
+   if (buf[0] == 0)
+     strcpy(buf, "NOFX");
+
+   return buf;
+}
+
+static const char *
+_dfb_blend_func_str(DFBSurfaceBlendFunction func)
+{
+   static char *names[] = {
+     "ZERO",
+     "ONE",
+     "SRCCOLOR",
+     "INVSRCCOLOR",
+     "SRCALPHA",
+     "INVSRCALPHA",
+     "DESTALPHA",
+     "INVDESTALPHA",
+     "DESTCOLOR",
+     "INVDESTCOLOR",
+     "SRCALPHASAT"
+   };
+   func--;
+   if ((func >= 0) && (func <= sizeof(names)/sizeof(*names)))
+     return names[func];
+   else
+     return NULL;
+}
+#endif /* DFB_DEBUG_FLAGS */
+
+int
+_dfb_surface_set_color_from_context(IDirectFBSurface *surface, RGBA_Draw_Context *dc)
+{
+   DFBSurfaceDrawingFlags flags;
+   int r, g, b, a;
+   DFBResult res;
+
+   _context_get_color(dc, &r, &g, &b, &a);
+   if (a == 0)
+     return 0;
+
+   r = 0xff * r / a;
+   g = 0xff * g / a;
+   b = 0xff * b / a;
+
+   res = surface->SetColor(surface, r, g, b, a);
+   if (res != DFB_OK)
+     goto error;
+
+   flags = (a != 255) ? DSDRAW_BLEND : DSDRAW_NOFX;
+   res = surface->SetDrawingFlags(surface, flags);
+   if (res != DFB_OK)
+     goto error;
+
+#ifdef DFB_DEBUG_FLAGS
+   DBG("Color=%d %d %d %d, flags=%s",
+         r, g, b, a, _dfb_draw_flags_str(flags));
+#endif /* DFB_DEBUG_FLAGS */
+
+   return 1;
+
+ error:
+   ERR("Could not set color from context: %s",
+          DirectFBErrorString(res));
+   return 0;
+}
+
+static int
+_dfb_surface_set_blit_params(DirectFB_Engine_Image_Entry *d, DirectFB_Engine_Image_Entry *s, RGBA_Draw_Context *dc)
+{
+   IDirectFBSurface *surface;
+   DFBSurfaceBlittingFlags blit_flags = DSBLIT_NOFX;
+   DFBResult res;
+   int r, g, b, a;
+
+   _context_get_color(dc, &r, &g, &b, &a);
+   if (a == 0)
+     return 0;
+
+   if (a != 255)
+     blit_flags = DSBLIT_BLEND_COLORALPHA | DSBLIT_SRC_PREMULTCOLOR;
+
+   if ((r != a) || (g != a) || (b != a))
+     {
+       blit_flags |= DSBLIT_COLORIZE;
+
+       r = 0xff * r / a;
+       g = 0xff * g / a;
+       b = 0xff * b / a;
+   }
+
+   if (s->cache_entry.src->flags.alpha)
+     blit_flags |= DSBLIT_BLEND_ALPHACHANNEL;
+
+   surface = d->surface;
+
+   if (blit_flags &
+       (DSBLIT_BLEND_COLORALPHA | DSBLIT_SRC_PREMULTCOLOR | DSBLIT_COLORIZE))
+     {
+       res = surface->SetColor(surface, r, g, b, a);
+       if (res != DFB_OK)
+         goto error;
+     }
+
+   res = surface->SetBlittingFlags(surface, blit_flags);
+   if (res != DFB_OK)
+     goto error;
+
+#ifdef DFB_DEBUG_FLAGS
+   DBG("sfunc=%s, dfunc=%s, color=%d %d %d %d\n\tblit=%s\n\tdraw=%s",
+         _dfb_blend_func_str(src_func), _dfb_blend_func_str(dst_func),
+         r, g, b, a,
+         _dfb_blit_flags_str(blit_flags), _dfb_draw_flags_str(draw_flags));
+#endif /* DFB_DEBUG_FLAGS */
+
+   return 1;
+
+ error:
+   ERR("Could not set blit params: %s",
+        DirectFBErrorString(res));
+   return 0;
+}
+
+static int
+_dfb_lock_and_sync_image(IDirectFBSurface *surface, RGBA_Image *image, DFBSurfaceLockFlags flags)
+{
+   DFBResult r;
+   int pitch, sw, sh;
+   void *pixels;
+
+   r = surface->GetSize(surface, &sw, &sh);
+   if (r != DFB_OK)
+     return 0;
+
+   r = surface->Lock(surface, flags, &pixels, &pitch);
+   if (r != DFB_OK)
+     return 0;
+
+   if (pitch != (sw * 4))
+     {
+       /* XXX TODO: support other pixel formats. */
+       ERR("IDirectFBSurface pitch(%d) is not supported: "
+               "should be %d.",
+               pitch, sw * 4);
+       surface->Unlock(surface);
+       return 0;
+     }
+
+   image->cache_entry.w = sw;
+   image->cache_entry.h = sh;
+   image->image.data = pixels;
+   return 1;
+}
+
+typedef void (*_cb_for_each_cutout_t)(IDirectFBSurface *surface, RGBA_Draw_Context *dc, const DFBRegion *region, void *data);
+static void
+_dfb_surface_for_each_cutout(IDirectFBSurface *surface, RGBA_Draw_Context *dc, _cb_for_each_cutout_t cb, void *data)
+{
+   Cutout_Rects *rects;
+   int i;
+
+   rects = evas_common_draw_context_apply_cutouts(dc);
+   if (!rects)
+     {
+       DFBRegion cr;
+       cr.x1 = 0;
+       cr.y1 = 0;
+       surface->GetSize(surface, &cr.x2, &cr.y2);
+       cr.x2 -= 1;
+       cr.y2 -= 1;
+       surface->SetClip(surface, NULL);
+       cb(surface, dc, &cr, data);
+       return;
+     }
+
+   for (i = 0; i < rects->active; ++i)
+     {
+       Cutout_Rect *r;
+       DFBRegion cr;
+
+       r = rects->rects + i;
+
+       cr.x1 = r->x;
+       cr.y1 = r->y;
+       cr.x2 = r->x + r->w - 1;
+       cr.y2 = r->y + r->h - 1;
+       surface->SetClip(surface, &cr);
+       cb(surface, dc, &cr, data);
+     }
+   evas_common_draw_context_apply_clear_cutouts(rects);
+}
+
+static void
+_dfb_rect_set(DFBRectangle *r, int x, int y, int w, int h)
+{
+   r->x = x;
+   r->y = y;
+   r->w = w;
+   r->h = h;
+}
+
+
+/***********************************************************************
+ * Image Cache
+ **********************************************************************/
+static Engine_Image_Entry *
+evas_cache_image_dfb_alloc(void)
+{
+   DirectFB_Engine_Image_Entry *deie;
+
+   deie = calloc(1, sizeof (DirectFB_Engine_Image_Entry));
+
+   return (Engine_Image_Entry *)deie;
+}
+
+static void
+evas_cache_image_dfb_delete(Engine_Image_Entry *eie)
+{
+   free(eie);
+}
+
+static int
+evas_cache_image_dfb_constructor(Engine_Image_Entry *eie, void *data)
+{
+   DirectFB_Engine_Image_Entry *deie = (DirectFB_Engine_Image_Entry *)eie;
+   Render_Engine *re = data;
+   IDirectFBSurface *s;
+   RGBA_Image *im;
+
+   im = (RGBA_Image *)eie->src;
+   if (!im)
+     return EVAS_LOAD_ERROR_NONE; // XXX TODO: confirm?
+
+   evas_cache_image_load_data(&im->cache_entry);
+   if (!im->image.data)
+     return EVAS_LOAD_ERROR_NONE; // XXX TODO: confirm?
+
+   s = _dfb_surface_from_data(re->spec->dfb, eie->w, eie->h, im->image.data);
+   if (!s)
+     return EVAS_LOAD_ERROR_GENERIC;
+
+   deie->surface = s;
+   deie->flags.engine_surface = 0;
+
+   return EVAS_LOAD_ERROR_NONE;
+}
+
+static void
+evas_cache_image_dfb_destructor(Engine_Image_Entry *eie)
+{
+   DirectFB_Engine_Image_Entry *deie = (DirectFB_Engine_Image_Entry *)eie;
+
+   if (!deie->flags.engine_surface)
+     _dfb_surface_free(deie->surface);
+   deie->surface = NULL;
+}
+
+/* note: dst have some properties set, like desired size (w, h) */
+static int
+_cache_image_copy(Engine_Image_Entry *dst, const Engine_Image_Entry *src)
+{
+   DirectFB_Engine_Image_Entry *dst_deie;
+   const DirectFB_Engine_Image_Entry *src_deie;
+   IDirectFBSurface *s;
+   RGBA_Image *im;
+
+   dst_deie = (DirectFB_Engine_Image_Entry *)dst;
+   src_deie = (const DirectFB_Engine_Image_Entry *)src;
+   im = (RGBA_Image *)dst->src;
+   s = _dfb_surface_from_data(dfb, dst->w, dst->h, im->image.data);
+   if (!s)
+     return -1;
+
+   dst_deie->surface = s;
+   dst_deie->flags.engine_surface = 0;
+
+   return 0;
+}
+
+static int
+evas_cache_image_dfb_dirty(Engine_Image_Entry *dst, const Engine_Image_Entry *src)
+{
+   return _cache_image_copy(dst, src);
+}
+
+static void
+evas_cache_image_dfb_dirty_region(Engine_Image_Entry *eim, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Image *im;
+
+   im = (RGBA_Image *)eim->src;
+   im->flags |= RGBA_IMAGE_IS_DIRTY;
+}
+
+static int
+evas_cache_image_dfb_update_data(Engine_Image_Entry *dst, void *engine_data)
+{
+   DirectFB_Engine_Image_Entry *deie = (DirectFB_Engine_Image_Entry *)dst;
+   IDirectFBSurface *s = engine_data;
+   Image_Entry *ie;
+   RGBA_Image *im;
+
+   ie = dst->src;
+   im = (RGBA_Image *)ie;
+
+   if (s)
+     {
+       deie->surface = s;
+
+       /* XXX why size is required here? */
+       s->GetSize(s, &dst->w, &dst->h);
+
+        if (im)
+          {
+             im->image.data = NULL; /* IDirectFBSurface requires lock */
+             im->image.no_free = 1;
+             ie->w = dst->w;
+            ie->h = dst->h;
+            _image_autoset_alpha(deie);
+          }
+     }
+   else
+     {
+       _dfb_surface_free(deie->surface);
+       s = _dfb_surface_from_data(dfb, dst->w, dst->h, im->image.data);
+       deie->surface = s;
+     }
+
+   return 0;
+}
+
+static int
+evas_cache_image_dfb_size_set(Engine_Image_Entry *dst, const Engine_Image_Entry *src)
+{
+   return _cache_image_copy(dst, src);
+}
+
+static void
+evas_cache_image_dfb_load(Engine_Image_Entry *eim, const Image_Entry *ie)
+{
+   DirectFB_Engine_Image_Entry *deie = (DirectFB_Engine_Image_Entry *)eim;
+   IDirectFBSurface *s;
+   const RGBA_Image *im;
+
+   if (deie->surface)
+     return;
+
+   im = (const RGBA_Image *)ie;
+   s = _dfb_surface_from_data(dfb, eim->w, eim->h, im->image.data);
+   deie->surface = s;
+}
+
+static int
+evas_cache_image_dfb_mem_size_get(Engine_Image_Entry *eie)
+{
+   DirectFB_Engine_Image_Entry *deie = (DirectFB_Engine_Image_Entry *)eie;
+   DFBResult r;
+   int size, w, h;
+
+   if (!deie->surface)
+     return 0;
+
+   size = sizeof(*deie->surface);
+
+   r = deie->surface->GetSize(deie->surface, &w, &h);
+   if (r != DFB_OK)
+     {
+       ERR("Could not get surface size: %s",
+               DirectFBErrorString(r));
+       return size;
+     }
+
+   size += w * h * 4; // XXX get correct surface size using pixelformat
+
+   return size;
+}
+
+#ifdef DFB_DEBUG_IMAGE
+static void
+evas_cache_image_dfb_debug(const char *context, Engine_Image_Entry* eie)
+{
+   DirectFB_Engine_Image_Entry *eim = (DirectFB_Engine_Image_Entry *)eie;
+
+   DBG("*** %s image (%p) ***", context, eim);
+   if (eim)
+     {
+       DBG("* W: %d\n"
+               "* H: %d\n"
+               "* R: %d\n"
+               "* Key: %s\n"
+               "* DFB Surface: %p",
+               eie->w, eie->h, eie->references, eie->cache_key, eim->surface);
+
+        if (eie->src)
+          DBG("* Pixels: %p", ((RGBA_Image*) eie->src)->image.data);
+     }
+   DBG("*** ***");
+}
+#endif
+
+static const Evas_Cache_Engine_Image_Func _dfb_cache_engine_image_cb = {
+  NULL /* key */,
+  evas_cache_image_dfb_alloc /* alloc */,
+  evas_cache_image_dfb_delete /* dealloc */,
+  evas_cache_image_dfb_constructor /* constructor */,
+  evas_cache_image_dfb_destructor /* destructor */,
+  evas_cache_image_dfb_dirty_region /* dirty_region */,
+  evas_cache_image_dfb_dirty /* dirty */,
+  evas_cache_image_dfb_size_set /* size_set */,
+  evas_cache_image_dfb_update_data /* update_data */,
+  evas_cache_image_dfb_load /* load */,
+  evas_cache_image_dfb_mem_size_get /* mem_size_get */,
+#ifdef DFB_DEBUG_IMAGE  /* debug */
+  evas_cache_image_dfb_debug
+#else
+  NULL
+#endif
+};
+
+
+/***********************************************************************
+ * Evas Engine
+ **********************************************************************/
+static void *
+evas_engine_dfb_info(Evas* e __UNUSED__)
+{
+   Evas_Engine_Info_DirectFB *info;
+   info = calloc(1, sizeof(Evas_Engine_Info_DirectFB));
+   if (!info)
+     return NULL;
+   info->magic.magic = rand();
+   return info;
+}
+
+static void
+evas_engine_dfb_info_free(Evas *e __UNUSED__, void *in)
+{
+   Evas_Engine_Info_DirectFB *info = in;
+   free(info);
+}
+
+static Eina_Bool
+_is_dfb_data_ok(IDirectFB *idfb, IDirectFBSurface *surface, int w, int h)
+{
+   DFBResult r;
+   int sw, sh;
+
+   if (!idfb)
+     {
+       ERR("missing IDirectFB");
+       return EINA_FALSE;
+     }
+   dfb = idfb;
+
+   if (!surface)
+     {
+       ERR("missing IDirectFBSurface");
+       return EINA_FALSE;
+     }
+
+   r = surface->GetSize(surface, &sw, &sh);
+   if (r != DFB_OK)
+     {
+       ERR("Could not get surface %p size: %s",
+            surface, DirectFBErrorString(r));
+       return EINA_FALSE;
+     }
+
+   if ((w > sw) || (h > sh))
+     {
+       ERR("Requested size is larger than surface: %dx%d > %dx%d",
+               w, h, sw, sh);
+       return EINA_FALSE;
+     }
+   else if ((w <= 0) || (h <= 0))
+     {
+       w = sw;
+       h = sh;
+     }
+
+   return EINA_TRUE;
+}
+
+static void
+_evas_common_init(void)
+{
+   evas_common_cpu_init();
+   evas_common_blend_init();
+   evas_common_image_init();
+   evas_common_convert_init();
+   evas_common_scale_init();
+   evas_common_rectangle_init();
+   evas_common_gradient_init();
+   evas_common_polygon_init();
+   evas_common_line_init();
+   evas_common_font_init();
+   evas_common_draw_init();
+   evas_common_tilebuf_init();  
+}
+
+static int
+evas_engine_dfb_output_reconfigure(Render_Engine *re, int w, int h)
+{
+   if (re->screen_image)
+     evas_cache_engine_image_drop(&re->screen_image->cache_entry);
+
+   if (re->tb)
+     evas_common_tilebuf_free(re->tb);
+
+   re->tb = evas_common_tilebuf_new(w, h);
+   if (!re->tb)
+     {
+       ERR("Could not allocate tile buffer.");
+       goto failed_tilebuf;
+     }
+   evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+
+   /* We create a "fake" RGBA_Image which points to the IDirectFB surface.
+    * Each access to that surface is wrapped in Lock / Unlock calls whenever
+    * the data is manipulated directly.
+    */
+   re->screen_image = (DirectFB_Engine_Image_Entry *)
+     evas_cache_engine_image_engine(re->cache, re->spec->surface);
+   if (!re->screen_image)
+     {
+       ERR("RGBA_Image allocation from DFB failed");
+       goto failed_image;
+     }
+   re->screen_image->flags.engine_surface = 1;
+
+   _image_autoset_alpha(re->screen_image);
+   _image_clear(re->screen_image, 0, 0, w, h);
+
+   return 1;
+
+ failed_image:
+   evas_common_tilebuf_free(re->tb);
+   re->tb = NULL;
+ failed_tilebuf:
+   re->screen_image = NULL;
+   ERR("Evas DirectFB reconfigure failed");
+   return 0;
+}
+
+static void *
+_dfb_output_setup(int w, int h, const struct Evas_Engine_DirectFB_Spec *spec)
+{
+   Render_Engine *re;
+
+   if (!_is_dfb_data_ok(spec->dfb, spec->surface, w, h))
+     goto fatal;
+
+   _evas_common_init();
+
+   re = calloc(1, sizeof(Render_Engine));
+   if (!re)
+     {
+       perror("calloc");
+       goto fatal;
+     }
+   re->dfb = spec->dfb;
+   re->spec = spec;
+   re->cache = evas_cache_engine_image_init(&_dfb_cache_engine_image_cb,
+                                           evas_common_image_cache_get());
+   if (!re->cache)
+     {
+       ERR("Evas_Cache_Engine_Image allocation failed!");
+       goto fatal_after_engine;
+     }
+
+   if (!evas_engine_dfb_output_reconfigure(re, w, h))
+     {
+       ERR("Could not reconfigure evas engine.");
+       goto fatal_after_reconfigure;
+     }
+
+   _dfb_blit_accel_caps_print(spec->surface, NULL);
+
+   return re;
+
+
+ fatal_after_reconfigure:
+   evas_cache_engine_image_shutdown(re->cache);
+ fatal_after_engine:
+   free(re);
+ fatal:
+   CRIT("DirectFB: unable to continue, abort()!");
+   abort();
+   return NULL;
+}
+
+static int
+evas_engine_dfb_setup(Evas *e, void *in)
+{
+   Evas_Engine_Info_DirectFB *info = in;
+
+   if (!e->engine.data.output)
+     e->engine.data.output = _dfb_output_setup(e->output.w, e->output.h,
+                                              &info->info);
+   // XXX TODO: else reconfigure existing...
+
+   if (!e->engine.data.output)
+     return 0;
+
+   if (!e->engine.data.context)
+     e->engine.data.context =
+       e->engine.func->context_new(e->engine.data.output);
+
+   return 1;
+}
+
+static void
+evas_engine_dfb_output_free(void *data)
+{
+   Render_Engine *re = data;
+
+   if (!re)
+     return;
+
+   if (re->cache)
+     evas_cache_engine_image_shutdown(re->cache);
+
+   evas_common_tilebuf_free(re->tb);
+   if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+}
+
+static void
+evas_engine_dfb_output_resize(void *data, int w, int h)
+{
+   if (!evas_engine_dfb_output_reconfigure(data, w, h))
+     ERR("Failed to resize DirectFB evas");
+}
+
+static void
+evas_engine_dfb_output_tile_size_set(void *data, int w, int h)
+{
+   Render_Engine *re = data;
+
+   evas_common_tilebuf_set_tile_size(re->tb, w, h);
+}
+
+static void
+evas_engine_dfb_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re = data;
+
+   evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
+}
+
+static void
+evas_engine_dfb_output_redraws_rect_del(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re = data;
+
+   evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
+}
+
+static void
+evas_engine_dfb_output_redraws_clear(void *data)
+{
+   Render_Engine *re = data;
+
+   evas_common_tilebuf_clear(re->tb);
+}
+
+static void *
+evas_engine_dfb_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re = data;
+   Tilebuf_Rect *tb_rect;
+
+   if (re->end)
+     {
+       re->end = 0;
+       return NULL;
+     }
+   if (!re->rects)
+     {
+       re->rects = evas_common_tilebuf_get_render_rects(re->tb);
+       re->cur_rect = EINA_INLIST_GET(re->rects);
+     }
+   if (!re->cur_rect)
+      return NULL;
+
+   tb_rect = (Tilebuf_Rect*) re->cur_rect;
+   *cx = *x = tb_rect->x;
+   *cy = *y = tb_rect->y;
+   *cw = *w = tb_rect->w;
+   *ch = *h = tb_rect->h;
+   re->cur_rect = re->cur_rect->next;
+   if (!re->cur_rect)
+     {
+       evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       re->end = 1;
+     }
+
+   return re->screen_image;
+}
+
+static void
+evas_engine_dfb_output_redraws_next_update_push(void *data, void *surface __UNUSED__, int x, int y, int w, int h)
+{
+   Render_Engine *re = data;
+   DFBRegion *r;
+
+   if (re->update_regions_count >= re->update_regions_limit)
+     {
+       void *tmp;
+
+       re->update_regions_limit += 16;
+
+       tmp = realloc(re->update_regions,
+                     sizeof(DFBRegion) * re->update_regions_limit);
+       if (!tmp)
+         {
+            perror("realloc");
+            return;
+         }
+       re->update_regions = tmp;
+     }
+
+   r = re->update_regions + re->update_regions_count;
+   re->update_regions_count++;
+
+   r->x1 = x;
+   r->y1 = y;
+   r->x2 = x + w - 1;
+   r->y2 = y + h - 1;
+}
+
+static void
+evas_engine_dfb_output_flush(void *data)
+{
+   Render_Engine *re = data;
+   IDirectFBSurface *s = re->screen_image->surface;
+   DFBRegion *r, *r_end;
+
+   r = re->update_regions;
+   r_end = re->update_regions + re->update_regions_count;
+
+#ifdef DFB_UPDATE_INDIVIDUAL_RECTS
+   for (; r < r_end; r++)
+     s->Flip(s, r, DFB_FLIP_FLAGS);
+#else
+   DFBRegion bb;
+
+   bb.x1 = bb.y1 = 10000;
+   bb.x2 = bb.y2 = 0;
+   for (; r < r_end; r++)
+     {
+       if (bb.x1 > r->x1)
+         bb.x1 = r->x1;
+       if (bb.y1 > r->y1)
+         bb.y1 = r->y1;
+
+       if (bb.x2 < r->x2)
+         bb.x2 = r->x2;
+       if (bb.y2 < r->y2)
+         bb.y2 = r->y2;
+     }
+
+   s->Flip(s, &bb, DFB_FLIP_FLAGS);
+#endif
+
+   re->update_regions_count = 0;
+}
+
+static void
+evas_engine_dfb_output_idle_flush(void *data)
+{
+   Render_Engine *re = data;
+
+   if (re->update_regions_count != 0)
+     ERR("update_regions_count not 0 as it should be!");
+
+   free(re->update_regions);
+   re->update_regions_count = 0;
+   re->update_regions_limit = 0;
+   re->update_regions = NULL;
+}
+
+/* HACK!!! -- KLUDGE!!!
+ *
+ * This should really use IDirectFBFont and IDirectFBSurface::DrawString(),
+ * but to be edje-compatible IDirectFBFont::CreateFont() should be able to
+ * load fonts from non-files, which it does not.
+ *
+ * Try to find a way to create own IDirectFBFont in future and load from
+ * memory.
+ */
+static void
+evas_engine_dfb_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, const char *text)
+{
+   DirectFB_Engine_Image_Entry *eim = surface;
+   IDirectFBSurface *screen;
+   Render_Engine *re = data;
+   RGBA_Image *im;
+
+   im = (RGBA_Image *)eim->cache_entry.src;
+   screen = eim->surface;
+   if (!_dfb_lock_and_sync_image(screen, im, DSLF_READ | DSLF_WRITE))
+     return;
+
+   evas_common_font_draw(im, context, font, x, y, text);
+   evas_common_cpu_end_opt();
+
+   im->image.data = NULL;
+
+   screen->Unlock(screen);
+}
+
+
+static void
+_cb_draw_line(IDirectFBSurface *surface, RGBA_Draw_Context *dc __UNUSED__, const DFBRegion *region __UNUSED__, void *data)
+{
+   const Eina_Rectangle *r = data;
+
+   surface->DrawLine(surface, r->x, r->y, r->w, r->h); /* x2, y2 really */
+}
+
+static void
+evas_engine_dfb_line_draw(void *data __UNUSED__, void *context, void *surface, int x1, int y1, int x2, int y2)
+{
+   DirectFB_Engine_Image_Entry *eim = surface;
+   Eina_Rectangle r;
+
+   if (!_dfb_surface_set_color_from_context(eim->surface, context))
+     return;
+
+   EINA_RECTANGLE_SET(&r, x1, y1, x2, y2); /* x2, y2 (ab)used as w, h */
+   _dfb_surface_for_each_cutout(eim->surface, context, _cb_draw_line, &r);
+}
+
+#ifndef DFB_USE_EVAS_RECT_DRAW
+static void
+_cb_draw_rectangle(IDirectFBSurface *surface, RGBA_Draw_Context *dc __UNUSED__, const DFBRegion *region __UNUSED__, void *data)
+{
+   const Eina_Rectangle *r = data;
+
+   surface->FillRectangle(surface, r->x, r->y, r->w, r->h);
+}
+
+static void
+evas_engine_dfb_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
+{
+   DirectFB_Engine_Image_Entry *eim = surface;
+   IDirectFBSurface *screen;
+   Render_Engine *re = data;
+   RGBA_Draw_Context *dc = context;
+   Eina_Rectangle r;
+
+   screen = eim->surface;
+   if (!_dfb_surface_set_color_from_context(screen, context))
+     {
+       if (dc->render_op != EVAS_RENDER_COPY)
+         return;
+       if (!eim->cache_entry.src->flags.alpha)
+         return;
+       screen->SetColor(screen, 0, 0, 0, 0);
+       screen->SetDrawingFlags(screen, DSDRAW_NOFX);
+     }
+
+   EINA_RECTANGLE_SET(&r, x, y, w, h);
+   _dfb_surface_for_each_cutout(screen, context, _cb_draw_rectangle, &r);
+}
+#else
+static void
+evas_engine_dfb_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
+{
+   DirectFB_Engine_Image_Entry *eim = surface;
+   IDirectFBSurface *screen;
+   Render_Engine *re = data;
+   RGBA_Image *dst;
+
+   dst = (RGBA_Image *)eim->cache_entry.src;
+   screen = eim->surface;
+   if (!_dfb_lock_and_sync_image(screen, dst, DSLF_READ | DSLF_WRITE))
+     return;
+
+   evas_common_rectangle_draw(dst, context, x, y, w, h);
+   evas_common_cpu_end_opt();
+
+   dst->image.data = NULL;
+
+   screen->Unlock(screen);
+}
+#endif
+
+#ifndef DFB_USE_EVAS_POLYGON_DRAW
+static void
+evas_engine_dfb_polygon_draw(void *data __UNUSED__, void *context, void *surface, void *polygon, int x, int y)
+{
+   _dfb_polygon_draw(surface, context, polygon, x, y);
+}
+#else
+static void
+evas_engine_dfb_polygon_draw(void *data, void *context, void *surface, void *polygon, int x, int y)
+{
+   DirectFB_Engine_Image_Entry *eim = surface;
+   IDirectFBSurface *screen;
+   Render_Engine *re = data;
+   RGBA_Image *dst;
+
+   dst = (RGBA_Image *)eim->cache_entry.src;
+   screen = eim->surface;
+   if (!_dfb_lock_and_sync_image(screen, dst, DSLF_READ | DSLF_WRITE))
+     return;
+
+   evas_common_polygon_draw(dst, context, polygon, x, y);
+   evas_common_cpu_end_opt();
+
+   dst->image.data = NULL;
+
+   screen->Unlock(screen);
+}
+#endif
+
+static void
+evas_engine_dfb_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h)
+{
+   DirectFB_Engine_Image_Entry *eim = surface;
+   IDirectFBSurface *screen;
+   Render_Engine *re = data;
+   RGBA_Image *dst, *src;
+
+   dst = (RGBA_Image *)eim->cache_entry.src;
+   screen = eim->surface;
+   if (!_dfb_lock_and_sync_image(screen, dst, DSLF_READ | DSLF_WRITE))
+     return;
+
+   evas_common_gradient_draw(dst, context, x, y, w, h, gradient);
+   evas_common_cpu_end_opt();
+
+   dst->image.data = NULL;
+
+   screen->Unlock(screen);
+
+   return;
+}
+
+/** Image Object *******************************************************/
+static void *
+evas_engine_dfb_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
+{
+   Render_Engine *re = data;
+
+   *error = 0;
+   return evas_cache_engine_image_request(re->cache, file, key, lo,
+                                         data, error);
+}
+
+static int
+evas_engine_dfb_image_alpha_get(void *data __UNUSED__, void *image)
+{
+   DirectFB_Engine_Image_Entry *eim = image;
+   Image_Entry *ie;
+   RGBA_Image *im;
+
+   if (!eim) return 1;
+   ie = eim->cache_entry.src;
+   im = (RGBA_Image *)ie;
+   switch (ie->space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+        if (ie->flags.alpha) return 1;
+      default:
+        break;
+     }
+   return 0;
+}
+
+static void
+evas_engine_dfb_image_size_get(void *data __UNUSED__, void *image, int *w, int *h)
+{
+   DirectFB_Engine_Image_Entry *eim = image;
+   Image_Entry *ie;
+
+   ie = eim->cache_entry.src;
+   if (w) *w = ie->w;
+   if (h) *h = ie->h;
+}
+
+static int
+evas_engine_dfb_image_colorspace_get(void *data __UNUSED__, void *image)
+{
+   DirectFB_Engine_Image_Entry *eim = image;
+
+   if (!eim) return EVAS_COLORSPACE_ARGB8888;
+   return eim->cache_entry.src->space;
+}
+
+static void
+evas_engine_dfb_image_colorspace_set(void *data, void *image, int cspace)
+{
+   DirectFB_Engine_Image_Entry *eim = image;
+
+   if (!eim) return;
+   if (eim->cache_entry.src->space == cspace) return;
+
+   evas_cache_engine_image_colorspace(&eim->cache_entry, cspace, data);
+}
+
+static void *
+evas_engine_dfb_image_new_from_copied_data(void *data, int w, int h, DATA32* image_data, int alpha, int cspace)
+{
+   Render_Engine *re = data;
+
+   return evas_cache_engine_image_copied_data(re->cache, w, h, image_data,
+                                             alpha, cspace, NULL);
+}
+
+static void *
+evas_engine_dfb_image_new_from_data(void *data, int w, int h, DATA32* image_data, int alpha, int cspace)
+{
+   Render_Engine *re = data;
+
+   return evas_cache_engine_image_data(re->cache, w, h, image_data,
+                                      alpha, cspace, NULL);
+}
+
+static void
+evas_engine_dfb_image_free(void *data __UNUSED__, void *image)
+{
+   DirectFB_Engine_Image_Entry *eim = image;
+
+   evas_cache_engine_image_drop(&eim->cache_entry);
+}
+
+static void *
+evas_engine_dfb_image_size_set(void *data __UNUSED__, void *image, int w, int h)
+{
+   DirectFB_Engine_Image_Entry *eim = image;
+
+   return evas_cache_engine_image_size_set(&eim->cache_entry, w, h);
+}
+
+static void *
+evas_engine_dfb_image_dirty_region(void *data __UNUSED__, void *image, int x, int y, int w, int h)
+{
+   DirectFB_Engine_Image_Entry *eim = image;
+
+   return evas_cache_engine_image_dirty(&eim->cache_entry, x, y, w, h);
+}
+
+static void *
+evas_engine_dfb_image_data_get(void *data __UNUSED__, void *image, int to_write, DATA32** image_data)
+{
+   DirectFB_Engine_Image_Entry *deie = image;
+   Engine_Image_Entry *ce;
+   Image_Entry *ie;
+   RGBA_Image *im;
+
+   if (!deie)
+     {
+        *image_data = NULL;
+        return NULL;
+     }
+
+   ce = (Engine_Image_Entry *)deie;
+   ie = ce->src;
+   im = (RGBA_Image *)ie;
+
+   switch (ie->space)
+     {
+     case EVAS_COLORSPACE_ARGB8888:
+       {
+         DFBResult r;
+         IDirectFBSurface *s;
+         void *pixels;
+         int pitch;
+
+         if (to_write)
+           deie = (DirectFB_Engine_Image_Entry *)
+             evas_cache_engine_image_dirty(ce, 0, 0, ie->w, ie->h);
+
+         evas_cache_engine_image_load_data(ce);
+
+         ce = (Engine_Image_Entry *)deie;
+         ie = ce->src;
+         im = (RGBA_Image *)ie;
+         s = deie->surface;
+
+         if (to_write)
+           {
+              r = s->Lock(s, DSLF_WRITE, &pixels, &pitch);
+              if (r != DFB_OK)
+                goto error;
+              deie->flags.is_locked = 1;
+           }
+         else
+           {
+              r = s->Lock(s, DSLF_READ, &pixels, &pitch);
+              if (r != DFB_OK)
+                goto error;
+              s->Unlock(s);
+           }
+
+         *image_data = pixels;
+         im->image.data = pixels; /* remember for _put() */
+         break;
+
+       error:
+         ERR("Could not lock surface %p: %s",
+                 s, DirectFBErrorString(r));
+         *image_data = NULL;
+         break;
+       }
+     case EVAS_COLORSPACE_YCBCR422P709_PL:
+     case EVAS_COLORSPACE_YCBCR422P601_PL:
+       /* XXX untested */
+        *image_data = im->cs.data;
+        break;
+     default:
+        abort();
+        break;
+     }
+   return deie;
+}
+
+static void *
+evas_engine_dfb_image_data_put(void *data, void *image, DATA32* image_data)
+{
+   DirectFB_Engine_Image_Entry *deie = image;
+   Render_Engine *re = data;
+   Engine_Image_Entry *ce;
+   Image_Entry *ie;
+   RGBA_Image *im;
+
+   if (!deie) return NULL;
+
+   ce = (Engine_Image_Entry *)deie;
+   ie = ce->src;
+   im = (RGBA_Image*)ie;
+
+   switch (ie->space)
+     {
+     case EVAS_COLORSPACE_ARGB8888:
+       if (image_data == im->image.data)
+         {
+            if (deie->flags.is_locked)
+              {
+                 deie->surface->Unlock(deie->surface);
+                 deie->flags.is_locked = 0;
+              }
+         }
+       else
+          {
+            int alpha, cspace;
+
+            alpha = func.image_alpha_get(re, deie);
+            cspace = func.image_colorspace_get(re, deie);
+
+             evas_cache_engine_image_drop(ce);
+             deie = (DirectFB_Engine_Image_Entry *)
+              evas_cache_engine_image_data(re->cache, ce->w, ce->h,
+                                           image_data, alpha, cspace, NULL);
+          }
+        break;
+     case EVAS_COLORSPACE_YCBCR422P601_PL:
+     case EVAS_COLORSPACE_YCBCR422P709_PL:
+       /* XXX untested */
+        if (image_data != im->cs.data)
+          {
+             if (im->cs.data)
+               if (!im->cs.no_free)
+                 free(im->cs.data);
+             im->cs.data = image_data;
+             evas_common_image_colorspace_dirty(im);
+          }
+        break;
+     default:
+        abort();
+        break;
+     }
+   return deie;
+}
+
+static void
+evas_engine_dfb_image_data_preload_request(void *data __UNUSED__, void *image, const void *target)
+{
+   DirectFB_Engine_Image_Entry *deie = image;
+   RGBA_Image *im;
+
+   if (!deie) return ;
+   im = (RGBA_Image*) deie->cache_entry.src;
+   if (!im) return ;
+   evas_cache_image_preload_data(&im->cache_entry, target);
+}
+
+static void
+evas_engine_dfb_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target)
+{
+   DirectFB_Engine_Image_Entry *deie = image;
+   RGBA_Image *im;
+
+   if (!deie) return ;
+   im = (RGBA_Image*) deie->cache_entry.src;
+   if (!im) return ;
+   evas_cache_image_preload_cancel(&im->cache_entry, target);
+}
+
+static void *
+evas_engine_dfb_image_alpha_set(void *data __UNUSED__, void *image, int has_alpha)
+{
+   DirectFB_Engine_Image_Entry *eim = image;
+   Engine_Image_Entry *ce;
+   Image_Entry *ie;
+   RGBA_Image *im;
+
+   if (!eim) return NULL;
+
+   ce = &eim->cache_entry;
+   ie = ce->src;
+   im = (RGBA_Image*)ie;
+
+   if (ie->space != EVAS_COLORSPACE_ARGB8888)
+     {
+        ie->flags.alpha = 0;
+        return eim;
+     }
+
+   eim = (DirectFB_Engine_Image_Entry *)
+     evas_cache_engine_image_dirty(ce, 0, 0, ce->w, ce->h);
+
+   ie->flags.alpha = !!has_alpha;
+   return eim;
+}
+
+struct _for_each_cutout_image
+{
+   IDirectFBSurface *image;
+   DFBRectangle src, dst;
+};
+
+static void
+_cb_draw_image_unscaled(IDirectFBSurface *surface, RGBA_Draw_Context *dc __UNUSED__, const DFBRegion *region __UNUSED__, void *data)
+{
+   const struct _for_each_cutout_image *p = data;
+
+   surface->Blit(surface, p->image, &p->src, p->dst.x, p->dst.y);
+}
+
+static void
+_cb_draw_image_scaled(IDirectFBSurface *surface, RGBA_Draw_Context *dc __UNUSED__, const DFBRegion *region __UNUSED__, void *data)
+{
+   const struct _for_each_cutout_image *p = data;
+
+   surface->StretchBlit(surface, p->image, &p->src, &p->dst);
+}
+
+#ifndef DFB_USE_EVAS_IMAGE_DRAW
+static void
+evas_engine_dfb_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth __UNUSED__)
+{
+   DirectFB_Engine_Image_Entry *eim = surface;
+   Render_Engine *re = data;
+   IDirectFBSurface *screen;
+   DirectFB_Engine_Image_Entry *deie = image;
+   struct _for_each_cutout_image p;
+   _cb_for_each_cutout_t cb;
+
+   screen = eim->surface;
+   if (deie->cache_entry.src->space == EVAS_COLORSPACE_ARGB8888)
+     evas_cache_engine_image_load_data(&deie->cache_entry);
+
+   evas_common_image_colorspace_normalize((RGBA_Image *)deie->cache_entry.src);
+
+   _dfb_surface_set_blit_params(eim, deie, context);
+
+   _dfb_rect_set(&p.src, src_x, src_y, src_w, src_h);
+   _dfb_rect_set(&p.dst, dst_x, dst_y, dst_w, dst_h);
+   p.image = deie->surface;
+
+   if ((src_w == dst_w) && (src_h == dst_h))
+     cb = _cb_draw_image_unscaled;
+   else
+     cb = _cb_draw_image_scaled;
+
+   _dfb_blit_accel_caps_print(screen, deie->surface);
+   _dfb_surface_for_each_cutout(screen, context, cb, &p);
+}
+#else /* DFB_USE_EVAS_IMAGE_DRAW */
+static void
+evas_engine_dfb_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
+{
+   DirectFB_Engine_Image_Entry *deie = image;
+   DirectFB_Engine_Image_Entry *eim = surface;
+   Render_Engine *re = data;
+   RGBA_Image *dst, *src;
+   IDirectFBSurface *screen;
+
+   screen = eim->surface;
+   if (deie->cache_entry.src->space == EVAS_COLORSPACE_ARGB8888)
+     evas_cache_engine_image_load_data(&deie->cache_entry);
+
+   evas_common_image_colorspace_normalize((RGBA_Image *)deie->cache_entry.src);
+
+   dst = (RGBA_Image *)eim->cache_entry.src;
+   if (!_dfb_lock_and_sync_image(screen, dst, DSLF_READ | DSLF_WRITE))
+     return;
+
+   src = (RGBA_Image *)deie->cache_entry.src;
+   if (!_dfb_lock_and_sync_image(deie->surface, src, DSLF_READ))
+     goto error_src;
+
+   if (smooth)
+     evas_common_scale_rgba_in_to_out_clip_smooth(src, dst, context,
+                                                 src_x, src_y, src_w, src_h,
+                                                 dst_x, dst_y, dst_w, dst_h);
+   else
+     evas_common_scale_rgba_in_to_out_clip_sample(src, dst, context,
+                                                 src_x, src_y, src_w, src_h,
+                                                 dst_x, dst_y, dst_w, dst_h);
+   evas_common_cpu_end_opt();
+
+   dst->image.data = NULL;
+
+   screen->Unlock(screen);
+   deie->surface->Unlock(deie->surface);
+
+   return;
+
+ error_src:
+   screen->Unlock(screen);
+}
+#endif
+
+static void
+evas_engine_dfb_image_map4_draw(void *data __UNUSED__, void *context, void *surface, void *image, RGBA_Map_Point *p, int smooth, int level)
+{
+   Render_Engine *re = (Render_Engine*) data;
+   DirectFB_Engine_Image_Entry *deie = image;
+   DirectFB_Engine_Image_Entry *eim = surface;
+   IDirectFBSurface *screen;
+   RGBA_Image *dst, *src;
+
+   if (!deie || !eim) return ;
+
+   screen = eim->surface;
+   dst = (RGBA_Image *) eim->cache_entry.src;
+   if (!_dfb_lock_and_sync_image(screen, dst, DSLF_READ | DSLF_WRITE))
+     return;
+
+   src = (RGBA_Image *)deie->cache_entry.src;
+   if (!_dfb_lock_and_sync_image(deie->surface, src, DSLF_READ))
+     goto error_src;
+
+   evas_common_map4_rgba(src, dst, context, p, smooth, level);
+   evas_common_cpu_end_opt();
+
+   screen->Unlock(screen);
+   deie->surface->Unlock(deie->surface);
+
+   return ;
+
+ error_src:
+   screen->Unlock(screen);
+}
+
+static void *
+evas_engine_dfb_image_map_surface_new(void *data, int w, int h, int alpha)
+{
+   Render_Engine *re = (Render_Engine*) data;
+   void *surface;
+
+   surface = evas_cache_engine_image_copied_data(re->cache,
+                                                w, h, NULL, alpha,
+                                                EVAS_COLORSPACE_ARGB8888,
+                                                NULL);
+   return surface;
+}
+
+static void
+evas_engine_dfb_image_map_surface_free(void *data __UNUSED__, void *surface)
+{
+   evas_cache_engine_image_drop(surface);
+}
+
+
+static void
+evas_engine_dfb_image_cache_flush(void *data)
+{
+   Render_Engine *re = data;
+   int size;
+
+   size = evas_cache_engine_image_get(re->cache);
+   evas_cache_engine_image_set(re->cache, 0);
+   evas_cache_engine_image_set(re->cache, size);
+}
+
+static void
+evas_engine_dfb_image_cache_set(void *data, int bytes)
+{
+   Render_Engine *re = data;
+
+   evas_cache_engine_image_set(re->cache, bytes);
+}
+
+static int
+evas_engine_dfb_image_cache_get(void *data)
+{
+   Render_Engine *re = data;
+
+   return evas_cache_engine_image_get(re->cache);
+}
+
+static char *
+evas_engine_dfb_image_comment_get(void *data __UNUSED__, void *image, char *key __UNUSED__)
+{
+   DirectFB_Engine_Image_Entry *eim = image;
+   RGBA_Image *im;
+
+   if (!eim) return NULL;
+   im = (RGBA_Image *)eim->cache_entry.src;
+
+   return im->info.comment;
+}
+
+static void
+evas_engine_dfb_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static int
+evas_engine_dfb_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+static Eina_Bool
+evas_engine_dfb_canvas_alpha_get(void *data, void *context)
+{
+   Render_Engine *re = data;
+
+   return re->screen_image->cache_entry.src->flags.alpha;
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&parent_func, "software_generic")) return 0;
+   _evas_engine_directfb_log_dom = eina_log_domain_register("EvasEngineDirectFB",EVAS_DEFAULT_LOG_COLOR);
+   if(_evas_engine_directfb_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the DirectFb engine.\n");
+       return 0;
+     }
+   /* store it for later use */
+   func = parent_func;
+   /* now to override methods */
+#define ORD(f) EVAS_API_OVERRIDE(f, &func, evas_engine_dfb_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(canvas_alpha_get);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   ORD(image_load);
+   ORD(image_new_from_data);
+   ORD(image_new_from_copied_data);
+   ORD(image_colorspace_set);
+   ORD(image_colorspace_get);
+   ORD(image_free);
+   ORD(image_size_set);
+   ORD(image_size_get);
+   ORD(image_dirty_region);
+   ORD(image_data_get);
+   ORD(image_data_put);
+   ORD(image_data_preload_request);
+   ORD(image_data_preload_cancel);
+   ORD(image_alpha_set);
+   ORD(image_alpha_get);
+   ORD(image_draw);
+   ORD(image_comment_get);
+   ORD(image_cache_flush);
+   ORD(image_cache_set);
+   ORD(image_cache_get);
+   ORD(font_draw);
+   ORD(line_draw);
+   ORD(rectangle_draw);
+   ORD(polygon_draw);
+   ORD(gradient_draw);
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+
+   ORD(image_map4_draw);
+   ORD(image_map_surface_new);
+   ORD(image_map_surface_free);
+
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+   eina_log_domain_unregister(_evas_engine_directfb_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+  EVAS_MODULE_API_VERSION,
+  "directfb",
+  "ProFUSION embedded systems",
+  {
+    module_open,
+    module_close
+  }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, directfb);
+
+#ifndef EVAS_STATIC_BUILD_DIRECTFB
+EVAS_EINA_MODULE_DEFINE(engine, directfb);
+#endif
diff --git a/src/modules/engines/directfb/evas_engine.h b/src/modules/engines/directfb/evas_engine.h
new file mode 100644 (file)
index 0000000..7ad1e38
--- /dev/null
@@ -0,0 +1,71 @@
+#ifndef EVAS_ENGINE_DIRECTFB_H
+#define EVAS_ENGINE_DIRECTFB_H
+
+#include "evas_common.h"
+#include "evas_private.h"
+#include "Evas_Engine_DirectFB.h"
+
+extern int _evas_engine_directfb_log_dom ;
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_directfb_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_directfb_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_directfb_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_directfb_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_directfb_log_dom, __VA_ARGS__)
+
+typedef struct _DirectFB_Engine_Image_Entry DirectFB_Engine_Image_Entry;
+struct _DirectFB_Engine_Image_Entry
+{
+   Engine_Image_Entry            cache_entry;
+   IDirectFBSurface             *surface;
+
+   struct
+   {
+      Eina_Bool                   engine_surface : 1;
+      Eina_Bool                   is_locked : 1;
+   } flags;
+};
+
+typedef struct _Render_Engine Render_Engine;
+struct _Render_Engine
+{
+   DirectFB_Engine_Image_Entry  *screen_image;
+   const struct Evas_Engine_DirectFB_Spec *spec;
+   IDirectFB                    *dfb;
+
+   Evas_Cache_Engine_Image      *cache;
+
+   Tilebuf                      *tb;
+   Tilebuf_Rect                 *rects;
+   Eina_Inlist                  *cur_rect;
+
+   DFBRegion                    *update_regions;
+   unsigned int                  update_regions_count;
+   unsigned int                  update_regions_limit;
+
+   Eina_Bool                     end : 1;
+};
+
+int _dfb_surface_set_color_from_context(IDirectFBSurface *surface, RGBA_Draw_Context *dc);
+void _dfb_polygon_draw(IDirectFBSurface *surface, RGBA_Draw_Context *dc, Eina_Inlist *points, int x, int y);
+
+#endif
diff --git a/src/modules/engines/directfb/polygon.c b/src/modules/engines/directfb/polygon.c
new file mode 100644 (file)
index 0000000..715fd84
--- /dev/null
@@ -0,0 +1,269 @@
+#include <math.h>
+#include "evas_engine.h"
+
+/* reduce calls to DirectFB (FillSpans), but uses twice as much memory */
+//#define USE_SPAN_RECTS 1
+
+#define MAX_SPANS 512
+typedef struct _RGBA_Edge RGBA_Edge;
+typedef struct _RGBA_Vertex RGBA_Vertex;
+
+struct _RGBA_Edge
+{
+   double x, dx;
+   int i;
+};
+
+struct _RGBA_Vertex
+{
+   double x, y;
+   int i;
+};
+
+#define POLY_EDGE_DEL(_i)                                               \
+{                                                                       \
+   int _j;                                                              \
+                                                                        \
+   for (_j = 0; (_j < num_active_edges) && (edges[_j].i != _i); _j++);  \
+   if (_j < num_active_edges)                                           \
+     {                                                                  \
+       num_active_edges--;                                             \
+       memmove(&(edges[_j]), &(edges[_j + 1]),                         \
+               (num_active_edges - _j) * sizeof(RGBA_Edge));           \
+     }                                                                  \
+}
+
+#define POLY_EDGE_ADD(_i, _y)                                           \
+{                                                                       \
+   int _j;                                                              \
+   float _dx;                                                           \
+   RGBA_Vertex *_p, *_q;                                                \
+   if (_i < (n - 1)) _j = _i + 1;                                       \
+   else _j = 0;                                                         \
+   if (point[_i].y < point[_j].y)                                       \
+     {                                                                  \
+       _p = &(point[_i]);                                              \
+       _q = &(point[_j]);                                              \
+     }                                                                  \
+   else                                                                 \
+     {                                                                  \
+       _p = &(point[_j]);                                              \
+       _q = &(point[_i]);                                              \
+     }                                                                  \
+   edges[num_active_edges].dx = _dx = (_q->x - _p->x) / (_q->y - _p->y); \
+   edges[num_active_edges].x = (_dx * ((float)_y + 0.5 - _p->y)) + _p->x; \
+   edges[num_active_edges].i = _i;                                      \
+   num_active_edges++;                                                  \
+}
+
+static int
+polygon_point_sorter(const void *a, const void *b)
+{
+   RGBA_Vertex *p, *q;
+
+   p = (RGBA_Vertex *)a;
+   q = (RGBA_Vertex *)b;
+   if (p->y <= q->y) return -1;
+   return 1;
+}
+
+static int
+polygon_edge_sorter(const void *a, const void *b)
+{
+   RGBA_Edge *p, *q;
+
+   p = (RGBA_Edge *)a;
+   q = (RGBA_Edge *)b;
+   if (p->x <= q->x) return -1;
+   return 1;
+}
+
+#ifndef USE_SPAN_RECTS
+typedef DFBSpan span_t;
+
+static void
+polygon_span_add(span_t *span, int y __UNUSED__, int x, int w)
+{
+   span->x = x;
+   span->w = w;
+}
+
+static void
+polygon_spans_fill(IDirectFBSurface *surface, int y, const span_t *spans, int n_spans)
+{
+   /* directfb automatically increments y for each span */
+   for (; n_spans > 0; n_spans--, spans++)
+     surface->FillSpans(surface, y, spans, 1);
+}
+#else /* USE_SPAN_RECTS */
+typedef DFBRectangle span_t;
+
+static void
+polygon_span_add(span_t *span, int y, int x, int w)
+{
+   span->x = x;
+   span->y = y;
+   span->w = w;
+   span->h = 1;
+}
+
+static void
+polygon_spans_fill(IDirectFBSurface *surface, int y, const span_t *spans, int n_spans)
+{
+   surface->FillRectangles(surface, spans, n_spans);
+}
+#endif /* USE_SPAN_RECTS */
+
+
+void
+_dfb_polygon_draw(IDirectFBSurface *surface, RGBA_Draw_Context *dc, Eina_Inlist *points, int px, int py)
+{
+   RGBA_Polygon_Point *pt;
+   RGBA_Vertex        *point;
+   RGBA_Edge          *edges;
+   int                 num_active_edges;
+   int                 n;
+   int                 i, j, k;
+   int                 y0, y1, y;
+   int                 ext_x, ext_y, ext_w, ext_h;
+   int                *sorted_index;
+
+   ext_x = 0;
+   ext_y = 0;
+   surface->GetSize(surface, &ext_w, &ext_h);
+   if (dc->clip.use)
+     {
+       if (dc->clip.x > ext_x)
+         {
+            ext_w += ext_x - dc->clip.x;
+            ext_x = dc->clip.x;
+         }
+       if ((ext_x + ext_w) > (dc->clip.x + dc->clip.w))
+         {
+            ext_w = (dc->clip.x + dc->clip.w) - ext_x;
+         }
+       if (dc->clip.y > ext_y)
+         {
+            ext_h += ext_y - dc->clip.y;
+            ext_y = dc->clip.y;
+         }
+       if ((ext_y + ext_h) > (dc->clip.y + dc->clip.h))
+         {
+            ext_h = (dc->clip.y + dc->clip.h) - ext_y;
+         }
+     }
+   if ((ext_w <= 0) || (ext_h <= 0)) return;
+
+   evas_common_cpu_end_opt();
+
+   if (!_dfb_surface_set_color_from_context(surface, dc))
+     return;
+
+   n = 0; EINA_INLIST_FOREACH(points, pt) n++;
+   if (n < 3) return;
+   edges = malloc(sizeof(RGBA_Edge) * n);
+   if (!edges) return;
+   point = malloc(sizeof(RGBA_Vertex) * n);
+   if (!point)
+     {
+       free(edges);
+       return;
+     }
+   sorted_index = malloc(sizeof(int) * n);
+   if (!sorted_index)
+     {
+       free(edges);
+       free(point);
+       return;
+     }
+
+   k = 0;
+   EINA_INLIST_FOREACH(points, pt)
+     {
+       point[k].x = pt->x + px;
+       point[k].y = pt->y + py;
+       point[k].i = k;
+       k++;
+     }
+   qsort(point, n, sizeof(RGBA_Vertex), polygon_point_sorter);
+   for (k = 0; k < n; k++) sorted_index[k] = point[k].i;
+   k = 0;
+   EINA_INLIST_FOREACH(points, pt)
+     {
+       point[k].x = pt->x + px;
+       point[k].y = pt->y + py;
+       point[k].i = k;
+       k++;
+     }
+
+   y0 = MAX(ext_y, ceil(point[sorted_index[0]].y - 0.5));
+   y1 = MIN(ext_y + ext_h - 1, floor(point[sorted_index[n - 1]].y - 0.5));
+
+   k = 0;
+   num_active_edges = 0;
+
+   for (y = y0; y <= y1; y++)
+     {
+       span_t spans[MAX_SPANS];
+       unsigned int n_spans = 0;
+
+       for (; (k < n) && (point[sorted_index[k]].y <= ((double)y + 0.5)); k++)
+         {
+            i = sorted_index[k];
+
+            if (i > 0) j = i - 1;
+            else j = n - 1;
+            if (point[j].y <= ((double)y - 0.5))
+              {
+                 POLY_EDGE_DEL(j)
+              }
+            else if (point[j].y > ((double)y + 0.5))
+              {
+                 POLY_EDGE_ADD(j, y)
+              }
+            if (i < (n - 1)) j = i + 1;
+            else j = 0;
+            if (point[j].y <= ((double)y - 0.5))
+              {
+                 POLY_EDGE_DEL(i)
+              }
+            else if (point[j].y > ((double)y + 0.5))
+              {
+                 POLY_EDGE_ADD(i, y)
+              }
+         }
+
+       qsort(edges, num_active_edges, sizeof(RGBA_Edge), polygon_edge_sorter);
+
+       for (j = 0; j < num_active_edges; j += 2)
+         {
+            int x0, x1;
+
+            x0 = ceil(edges[j].x - 0.5);
+            if (j < (num_active_edges - 1))
+              x1 = floor(edges[j + 1].x - 0.5);
+            else
+              x1 = x0;
+            if ((x1 >= ext_x) && (x0 < (ext_x + ext_w)) && (x0 <= x1))
+              {
+                 if (n_spans == MAX_SPANS)
+                   {
+                      polygon_spans_fill(surface, y, spans, n_spans);
+                      n_spans = 0;
+                   }
+
+                 polygon_span_add(spans + n_spans, y, x0, (x1 - x0) + 1);
+                 n_spans++;
+              }
+            edges[j].x += edges[j].dx;
+            edges[j + 1].x += edges[j + 1].dx;
+         }
+
+       if (n_spans)
+         polygon_spans_fill(surface, y, spans, n_spans);
+     }
+
+   free(edges);
+   free(point);
+   free(sorted_index);
+}
diff --git a/src/modules/engines/fb/.cvsignore b/src/modules/engines/fb/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/engines/fb/Evas_Engine_FB.h b/src/modules/engines/fb/Evas_Engine_FB.h
new file mode 100644 (file)
index 0000000..7166e42
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef _EVAS_ENGINE_FB_H
+#define _EVAS_ENGINE_FB_H
+
+typedef struct _Evas_Engine_Info_FB Evas_Engine_Info_FB;
+
+struct _Evas_Engine_Info_FB
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   struct {
+
+      int virtual_terminal;
+      int device_number;
+      int refresh;
+      int rotation;
+   } info;
+};
+#endif
+
+
diff --git a/src/modules/engines/fb/Makefile.am b/src/modules/engines/fb/Makefile.am
new file mode 100644 (file)
index 0000000..6779773
--- /dev/null
@@ -0,0 +1,46 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_engine_fb_cflags@
+
+if BUILD_ENGINE_FB
+
+FB_SOURCES = \
+evas_engine.c \
+evas_fb_main.c \
+evas_outbuf.c
+
+FB_LIBADD = @evas_engine_fb_libs@
+
+pkgdir = $(libdir)/evas/modules/engines/fb/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_FB.h
+
+if !EVAS_STATIC_BUILD_FB
+
+pkg_LTLIBRARIES = module.la
+module_la_SOURCES = $(FB_SOURCES)
+module_la_LIBADD = @EINA_LIBS@ $(FB_LIBADD) $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_fb.la
+
+libevas_engine_fb_la_SOURCES = $(FB_SOURCES)
+libevas_engine_fb_la_LIBADD = $(FB_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = \
+evas_engine.h \
+evas_fb.h
diff --git a/src/modules/engines/fb/evas_engine.c b/src/modules/engines/fb/evas_engine.c
new file mode 100644 (file)
index 0000000..47386ba
--- /dev/null
@@ -0,0 +1,315 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_FB.h"
+
+int _evas_engine_fb_log_dom = -1;
+
+/* function tables - filled in later (func and parent func) */
+static Evas_Func func, pfunc;
+
+/* engine struct data */
+typedef struct _Render_Engine Render_Engine;
+
+struct _Render_Engine
+{
+   Tilebuf          *tb;
+   Outbuf           *ob;
+   Tilebuf_Rect     *rects;
+   Eina_Inlist      *cur_rect;
+   int               end : 1;
+};
+
+/* prototypes we will use here */
+static void *_output_setup(int w, int h, int rot, int vt, int dev, int refresh);
+
+static void *eng_info(Evas *e);
+static void eng_info_free(Evas *e, void *info);
+static int eng_setup(Evas *e, void *info);
+static void eng_output_free(void *data);
+static void eng_output_resize(void *data, int w, int h);
+static void eng_output_tile_size_set(void *data, int w, int h);
+static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_clear(void *data);
+static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
+static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
+static void eng_output_flush(void *data);
+static void eng_output_idle_flush(void *data);
+
+/* internal engine routines */
+static void *
+_output_setup(int w, int h, int rot, int vt, int dev, int refresh)
+{
+   Render_Engine *re;
+
+   re = calloc(1, sizeof(Render_Engine));
+   if (!re)
+     return NULL;
+   /* if we haven't initialized - init (automatic abort if already done) */
+   evas_common_cpu_init();
+
+   evas_common_blend_init();
+   evas_common_image_init();
+   evas_common_convert_init();
+   evas_common_scale_init();
+   evas_common_rectangle_init();
+   evas_common_gradient_init();
+   evas_common_polygon_init();
+   evas_common_line_init();
+   evas_common_font_init();
+   evas_common_draw_init();
+   evas_common_tilebuf_init();
+
+   evas_fb_outbuf_fb_init();
+
+   /* get any stored performance metrics from device (xserver) */
+   re->ob = evas_fb_outbuf_fb_setup_fb(w, h, rot, OUTBUF_DEPTH_INHERIT, vt, dev, refresh);
+   re->tb = evas_common_tilebuf_new(evas_fb_outbuf_fb_get_width(re->ob), evas_fb_outbuf_fb_get_height(re->ob));
+   /* no backbuf! */
+   evas_fb_outbuf_fb_set_have_backbuf(re->ob, 0);
+   /* in preliminary tests 16x16 gave highest framerates */
+   evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+   return re;
+}
+
+/* engine api this module provides */
+static void *
+eng_info(Evas *e)
+{
+   Evas_Engine_Info_FB *info;
+   info = calloc(1, sizeof(Evas_Engine_Info_FB));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   return info;
+   e = NULL;
+}
+
+static void
+eng_info_free(Evas *e __UNUSED__, void *info)
+{
+   Evas_Engine_Info_FB *in;
+   in = (Evas_Engine_Info_FB *)info;
+   free(in);
+}
+
+static int
+eng_setup(Evas *e, void *in)
+{
+   Render_Engine *re;
+   Evas_Engine_Info_FB *info;
+
+   info = (Evas_Engine_Info_FB *)in;
+   re = _output_setup(e->output.w,
+                     e->output.h,
+                     info->info.rotation,
+                     info->info.virtual_terminal,
+                     info->info.device_number,
+                     info->info.refresh);
+   e->engine.data.output = re;
+   if (!e->engine.data.output) return 0;
+   e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
+
+   return 1;
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_fb_outbuf_fb_free(re->ob);
+   evas_common_tilebuf_free(re->tb);
+   if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+}
+
+static void
+eng_output_resize(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_fb_outbuf_fb_reconfigure(re->ob, w, h,
+                                evas_fb_outbuf_fb_get_rot(re->ob),
+                                OUTBUF_DEPTH_INHERIT);
+   evas_common_tilebuf_free(re->tb);
+   re->tb = evas_common_tilebuf_new(w, h);
+   if (re->tb)
+     evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+}
+
+static void
+eng_output_tile_size_set(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_set_tile_size(re->tb, w, h);
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_clear(re->tb);
+}
+
+static void *
+eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re;
+   RGBA_Image *surface;
+   Tilebuf_Rect *rect;
+   int ux, uy, uw, uh;
+
+   re = (Render_Engine *)data;
+   if (re->end)
+     {
+       re->end = 0;
+       return NULL;
+     }
+   if (!re->rects)
+     {
+       re->rects = evas_common_tilebuf_get_render_rects(re->tb);
+       re->cur_rect = EINA_INLIST_GET(re->rects);
+     }
+   if (!re->cur_rect) return NULL;
+   rect = (Tilebuf_Rect *)re->cur_rect;
+   ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h;
+   re->cur_rect = re->cur_rect->next;
+   if (!re->cur_rect)
+     {
+       evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       re->end = 1;
+     }
+
+   surface = evas_fb_outbuf_fb_new_region_for_update(re->ob,
+                                         ux, uy, uw, uh,
+                                         cx, cy, cw, ch);
+   *x = ux; *y = uy; *w = uw; *h = uh;
+   return surface;
+}
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+#ifdef BUILD_PIPE_RENDER
+   evas_common_pipe_map4_begin(surface);
+#endif   
+   evas_fb_outbuf_fb_push_updated_region(re->ob, surface, x, y, w, h);
+   evas_fb_outbuf_fb_free_region_for_update(re->ob, surface);
+   evas_common_cpu_end_opt();
+}
+
+static void
+eng_output_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+}
+
+static void
+eng_output_idle_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data, void *context)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   return (re->ob->priv.fb.fb->fb_var.transp.length > 0);
+}
+
+/* module advertising code */
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
+   _evas_engine_fb_log_dom = eina_log_domain_register("Evas_fb_engine", EVAS_DEFAULT_LOG_COLOR);
+   if (_evas_engine_fb_log_dom < 0) {
+     EINA_LOG_ERR("Impossible to create a log domain for FB engine.\n");
+     return 0;
+   }
+
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(canvas_alpha_get);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+  eina_log_domain_unregister(_evas_engine_fb_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+  EVAS_MODULE_API_VERSION,
+  "fb",
+  "none",
+  {
+    module_open,
+    module_close
+  }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, fb);
+
+#ifndef EVAS_STATIC_BUILD_FB
+EVAS_EINA_MODULE_DEFINE(engine, fb);
+#endif
diff --git a/src/modules/engines/fb/evas_engine.h b/src/modules/engines/fb/evas_engine.h
new file mode 100644 (file)
index 0000000..295e91e
--- /dev/null
@@ -0,0 +1,85 @@
+#ifndef EVAS_ENGINE_H
+#define EVAS_ENGINE_H
+
+#include "evas_fb.h"
+
+extern int _evas_engine_fb_log_dom;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_fb_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_fb_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_fb_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_fb_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_fb_log_dom, __VA_ARGS__)
+
+typedef struct _Outbuf                Outbuf;
+
+typedef enum   _Outbuf_Depth          Outbuf_Depth;
+
+enum _Outbuf_Depth
+{
+   OUTBUF_DEPTH_NONE,
+     OUTBUF_DEPTH_INHERIT,
+     OUTBUF_DEPTH_RGB_16BPP_565_565_DITHERED,
+     OUTBUF_DEPTH_RGB_16BPP_555_555_DITHERED,
+     OUTBUF_DEPTH_RGB_16BPP_444_444_DITHERED,
+     OUTBUF_DEPTH_RGB_16BPP_565_444_DITHERED,
+     OUTBUF_DEPTH_RGB_32BPP_888_8888,
+     OUTBUF_DEPTH_LAST
+};
+
+struct _Outbuf
+{
+   Outbuf_Depth    depth;
+   int             w, h;
+   int             rot;
+
+   struct {
+      struct {
+        FB_Mode  *fb;
+      } fb;
+      struct {
+        DATA32    r, g, b;
+      } mask;
+      RGBA_Image  *back_buf;
+   } priv;
+};
+
+/****/
+
+void         evas_fb_outbuf_fb_init                   (void);
+void         evas_fb_outbuf_fb_free                   (Outbuf *buf);
+
+Outbuf      *evas_fb_outbuf_fb_setup_fb               (int w, int h, int rot, Outbuf_Depth depth, int vt_no, int dev_no, int refresh);
+
+void         evas_fb_outbuf_fb_blit                   (Outbuf *buf, int src_x, int src_y, int w, int h, int dst_x, int dst_y);
+void         evas_fb_outbuf_fb_update                 (Outbuf *buf, int x, int y, int w, int h);
+RGBA_Image  *evas_fb_outbuf_fb_new_region_for_update  (Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch);
+void         evas_fb_outbuf_fb_free_region_for_update (Outbuf *buf, RGBA_Image *update);
+void         evas_fb_outbuf_fb_push_updated_region    (Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h);
+void         evas_fb_outbuf_fb_reconfigure            (Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth);
+int          evas_fb_outbuf_fb_get_width              (Outbuf *buf);
+int          evas_fb_outbuf_fb_get_height             (Outbuf *buf);
+Outbuf_Depth evas_fb_outbuf_fb_get_depth              (Outbuf *buf);
+int          evas_fb_outbuf_fb_get_rot                (Outbuf *buf);
+int          evas_fb_outbuf_fb_get_have_backbuf       (Outbuf *buf);
+void         evas_fb_outbuf_fb_set_have_backbuf       (Outbuf *buf, int have_backbuf);
+
+#endif
diff --git a/src/modules/engines/fb/evas_fb.h b/src/modules/engines/fb/evas_fb.h
new file mode 100644 (file)
index 0000000..720c4bf
--- /dev/null
@@ -0,0 +1,93 @@
+#ifndef _EVAS_FB_H
+#define _EVAS_FB_H 1
+
+/* -------------------------------------------------------------------- */
+/* LINUX FBCON FRAMEBUFFER UTILITY CODE                                 */
+/* makes setting up the framebuffer easy. Also makes it eays to port to */
+/* some other system if needed.                                         */
+/* Copyright (c) 1999 - Carsten Haitzler (The Rasterman)                */
+/* -------------------------------------------------------------------- */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <termios.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/wait.h>
+#include <sys/stat.h>
+#include <linux/kd.h>
+#include <linux/vt.h>
+#include <linux/fb.h>
+
+typedef struct _fb_mode FB_Mode;
+
+struct _fb_mode
+{
+  int             width;
+  int             height;
+  int             refresh;
+  int             depth;
+  int             bpp;
+  int             fb_fd;
+  void           *mem;
+  int             mem_offset;
+  struct fb_var_screeninfo fb_var;
+};
+
+/* init a framebuffer (and switch to) vt number vt. If vt == 0 use current   */
+/* vt                                                                        */
+void fb_init(int vt, int device);
+/* call this afetr setting or getting the fb mode (whichever) to complete    */
+/* the dsetup                                                                */
+int  fb_postinit(FB_Mode *mode);
+/* console switching - if a switch was requested this with block if block    */
+/* is 1, otherwise it will return 1 if current console is active or 0 if     */
+/* the user has switched away in the meantime                                */
+int  fb_await_switch(int block);
+/* list all current possible video modes listed in /etc/fb.modes             */
+/* returns pointer to an aray of FB_Mode, and sets num_return to the number  */
+/* of elements int he returned array                                         */
+FB_Mode *fb_list_modes(int *num_return);
+/* sets the fb mode to the resolution width x height and the depth to depth. */
+/* and if refresh > 0 attempts to use a mode with a refresh rate (in Hz) of  */
+/* that. If this fails it will return NULL - if it succeeds it will return   */
+/* a pointer to the FB_Mode thatwas set. only modes in /etc/fb.modes will    */
+/* be used. If refresh is 0 it uses the DEFAULT mode (the one with no        */
+/* refresh rate at the end of its name (WIDTHxHEIGHT-REFRESH)                */
+/* NB: in 8bpp you get a 332 palette. This is fixed so all modes are         */
+/* "truecolor" - the onyl difference is how many bits bep red, green and     */
+/* blue channel. This is for speed reasons                                   */
+FB_Mode *fb_setmode(int width, int height, int depth, int refresh);
+/* returns the current fb mode being used in FB_Mode                         */
+FB_Mode *fb_getmode(void);
+/* changes the bit depth of the current fb mode to depth and returns a new   */
+/* handle to a new fb mode with updated parameters. frees cur_mode for you.  */
+FB_Mode *fb_changedepth(FB_Mode *cur_mode, int depth);
+/* changes resolution - retaining current depth of the current mode,         */
+/* returning a handle to the new mode once done. frees cur_mode for you.     */
+FB_Mode *fb_changeres(FB_Mode *cur_mode, int width, int height, int refresh);
+/* chnages both resolution and depth and returns a handle to the new mode    */
+/* when done. frees cur_mode for you                                         */
+FB_Mode *fb_changemode(FB_Mode *cur_mode, int width, int height, int depth, int refresh);
+
+/* ------------------------------------------------------------------------- */
+/* How to init:                                                              */
+/* (Example)                                                                 */
+
+/* FB_Mode *mode;                                                            */
+/* int fb_fd = -1;                                                           */
+/* fb_init(0);                                                               */
+/* mode = fb_setmode(640, 480, 8, 0);                                        */
+/* if (mode)                                                                 */
+/*   fb_fd = fb_postinit(mode);                                              */
+/* if (fb_fd == -1)                                                          */
+/*   {                                                                       */
+/*     fprintf(stderr, "Frambuffer init failed\n");                          */
+/*     exit(1);                                                              */
+/*   }                                                                       */
+/* .... code to play with the FB                                             */
+#endif
diff --git a/src/modules/engines/fb/evas_fb_main.c b/src/modules/engines/fb/evas_fb_main.c
new file mode 100644 (file)
index 0000000..7d2c73a
--- /dev/null
@@ -0,0 +1,600 @@
+/* -------------------------------------------------------------------- */
+/* LINUX FBCON FRAMEBUFFER UTILITY CODE                                 */
+/* makes setting up the framebuffer easy. Also makes it eays to port to */
+/* some other system if needed.                                         */
+/* Copyright (c) 1999 - Carsten Haitzler (The Rasterman)                */
+/* -------------------------------------------------------------------- */
+#include "evas_common.h"
+#include "evas_fb.h"
+
+#include <sys/ioctl.h>
+#include <sys/wait.h>
+#include <linux/kd.h>
+#include <linux/vt.h>
+#include <sys/user.h>
+
+#define FB_ACTIVE    0
+#define FB_REL_REQ   1
+#define FB_INACTIVE  2
+#define FB_ACQ_REQ   3
+
+/* -------------------------------------------------------------------- */
+/* internal variables                                                   */
+
+static struct fb_fix_screeninfo  fb_fix;
+static int                       fb, tty;
+static int                       bpp, depth;
+static int                       orig_vt_no = 0;
+static int                       kd_mode;
+static struct vt_mode            vt_omode;
+static struct fb_var_screeninfo  fb_ovar;
+static unsigned short            ored[256], ogreen[256], oblue[256];
+static unsigned short            red[256],  green[256],  blue[256];
+static struct fb_cmap            ocmap = { 0, 256, ored, ogreen, oblue, NULL };
+static struct fb_cmap            cmap  = { 0, 256, red,  green,  blue, NULL };
+
+/* -------------------------------------------------------------------- */
+/* internal function prototypes                                         */
+
+static void fb_cleanup(void);
+//static void fb_cleanup_fork(void);
+static void fb_setvt(int vtno);
+static void fb_init_palette_332(FB_Mode *mode);
+static void fb_init_palette_linear(FB_Mode *mode);
+
+/* -------------------------------------------------------------------- */
+/* palette setting                                                      */
+
+static void
+fb_init_palette_332(FB_Mode *mode)
+{
+  int r, g, b, i;
+
+  if (mode->fb_var.bits_per_pixel != 8)
+    return;
+  i = 0;
+
+  if (ioctl(fb, FBIOGETCMAP, &cmap) == -1)
+    perror("ioctl FBIOGETCMAP");
+
+  /* generate the palette */
+  for (r = 0; r < 8; r++)
+    {
+      for (g = 0; g < 8; g++)
+       {
+         for (b = 0; b < 4; b++)
+           {
+             int val;
+
+             val = (r << 5) | (r << 2) | (r >> 1);
+             red[i] = (val << 8) | val;
+             val = (g << 5) | (g << 2) | (g >> 1);
+             green[i] = (val << 8) | val;
+             val = (b << 6) | (b << 4) | (b << 2) | (b);
+             blue[i] = (val << 8) | val;
+             i++;
+           }
+       }
+    }
+
+  /* set colormap */
+  if (ioctl(fb, FBIOPUTCMAP, &cmap) == -1)
+    perror("ioctl FBIOPUTCMAP");
+
+}
+
+static void
+fb_init_palette_linear(FB_Mode *mode)
+{
+  int i;
+
+  if (mode->fb_var.bits_per_pixel != 8)
+    return;
+
+  if (ioctl(fb, FBIOGETCMAP, &cmap) == -1)
+    perror("ioctl FBIOGETCMAP");
+
+  /* generate the palette */
+  for (i = 0; i < 256; i++)
+    red[i] = (i << 8) | i;
+  for (i = 0; i < 256; i++)
+    green[i] = (i << 8) | i;
+  for (i = 0; i < 256; i++)
+    blue[i] = (i << 8) | i;
+
+  /* set colormap */
+  if (ioctl(fb, FBIOPUTCMAP, &cmap) == -1)
+    perror("ioctl FBIOPUTCMAP");
+
+}
+
+/* -------------------------------------------------------------------- */
+/* initialisation & cleanup                                             */
+
+FB_Mode *
+fb_list_modes(int *num_return)
+{
+  FILE *f;
+  char line[256], label[256], value[256];
+  FB_Mode *modes = NULL;
+  int num;
+
+  num = 0;
+  f = fopen("/etc/fb.modes","r");
+  if (!f)
+    {
+      *num_return = 0;
+      return NULL;
+    }
+  while (fgets(line, sizeof(line) - 1, f))
+    {
+      if (sscanf(line, "mode \"%250[^\"]\"", label) == 1)
+       {
+         char f1[32], f2[32], f3[32], f4[32];
+
+         f1[0] = 0; f2[0] = 0; f3[0] = 0; f4[0] = 0;
+         sscanf(label, "%30[^x]x%30[^-]-%30[^-]-%30s", f1, f2, f3, f4);
+         if ((f1[0]) && (f2[0]))
+           {
+             int geometry = 0;
+             int timings = 0;
+
+             num++;
+             modes = realloc(modes, num * sizeof(FB_Mode));
+             modes[num - 1].width = atoi(f1);
+             modes[num - 1].height = atoi(f2);
+             if (f3[0])
+               modes[num - 1].refresh = atoi(f3);
+             else
+               modes[num - 1].refresh = 0;
+             modes[num - 1].fb_var.sync = 0;
+             while ((fgets(line, sizeof(line) - 1, f)) &&
+                    (!strstr(line, "endmode")))
+               {
+
+                 if (sscanf(line," geometry %i %i %i %i %i",
+                            &modes[num - 1].fb_var.xres,
+                            &modes[num - 1].fb_var.yres,
+                            &modes[num - 1].fb_var.xres_virtual,
+                            &modes[num - 1].fb_var.yres_virtual,
+                            &modes[num - 1].fb_var.bits_per_pixel) == 5)
+                   geometry = 1;
+                 if (sscanf(line," timings %i %i %i %i %i %i %i",
+                            &modes[num - 1].fb_var.pixclock,
+                            &modes[num - 1].fb_var.left_margin,
+                            &modes[num - 1].fb_var.right_margin,
+                            &modes[num - 1].fb_var.upper_margin,
+                            &modes[num - 1].fb_var.lower_margin,
+                            &modes[num - 1].fb_var.hsync_len,
+                            &modes[num - 1].fb_var.vsync_len) == 7)
+                   timings = 1;
+                 if ((sscanf(line, " hsync %15s", value) == 1) &&
+                     (!strcmp(value,"high")))
+                   modes[num - 1].fb_var.sync |= FB_SYNC_HOR_HIGH_ACT;
+                 if ((sscanf(line, " vsync %15s", value) == 1) &&
+                     (!strcmp(value,"high")))
+                   modes[num - 1].fb_var.sync |= FB_SYNC_VERT_HIGH_ACT;
+                 if ((sscanf(line, " csync %15s", value) == 1) &&
+                     (!strcmp(value,"high")))
+                   modes[num - 1].fb_var.sync |= FB_SYNC_COMP_HIGH_ACT;
+                 if ((sscanf(line, " extsync %15s", value) == 1) &&
+                     (!strcmp(value,"true")))
+                   modes[num - 1].fb_var.sync |= FB_SYNC_EXT;
+                 if ((sscanf(line, " laced %15s", value) == 1) &&
+                     (!strcmp(value,"true")))
+                   modes[num - 1].fb_var.vmode |= FB_VMODE_INTERLACED;
+                 if ((sscanf(line, " double %15s",value) == 1) &&
+                     (!strcmp(value,"true")))
+                   modes[num - 1].fb_var.vmode |= FB_VMODE_DOUBLE;
+               }
+             if ((!geometry) || (!timings))
+               {
+                 num--;
+                 if (num == 0)
+                   {
+                     free(modes);
+                     modes = NULL;
+                   }
+               }
+             else
+               {
+                 modes[num - 1].fb_var.xoffset = 0;
+                 modes[num - 1].fb_var.yoffset = 0;
+               }
+           }
+
+       }
+    }
+  fclose(f);
+  *num_return = num;
+  return modes;
+}
+
+FB_Mode *
+fb_setmode(int width, int height, int depth, int refresh)
+{
+  FB_Mode *modes, *mode = NULL;
+  int      i, num_modes;
+
+  modes = fb_list_modes(&num_modes);
+  if (modes)
+    {
+      for (i = 0; i < num_modes; i++)
+       {
+         if ((modes[i].width == width) &&
+             (modes[i].height == height) &&
+             (!depth || modes[i].fb_var.bits_per_pixel == depth) &&
+             (modes[i].refresh == refresh))
+           {
+             if (depth) modes[i].fb_var.bits_per_pixel = depth;
+
+             if (ioctl(fb, FBIOPUT_VSCREENINFO, &modes[i].fb_var) == -1)
+               perror("ioctl FBIOPUT_VSCREENINFO");
+
+             free(modes);
+             return fb_getmode();
+           }
+       }
+      free(modes);
+    }
+  return mode;
+}
+
+FB_Mode *
+fb_changedepth(FB_Mode *cur_mode, int depth)
+{
+  cur_mode->fb_var.bits_per_pixel = depth;
+
+  if (ioctl(fb, FBIOPUT_VSCREENINFO, &cur_mode->fb_var) == -1)
+    perror("ioctl FBIOPUT_VSCREENINFO");
+
+  free(cur_mode);
+  return fb_getmode();
+}
+
+FB_Mode *
+fb_changeres(FB_Mode *cur_mode, int width, int height, int refresh)
+{
+  FB_Mode *modes;
+  int      i, num_modes;
+
+  modes = fb_list_modes(&num_modes);
+  if (modes)
+    {
+      for (i = 0; i < num_modes; i++)
+       {
+         if ((modes[i].width == width) &&
+             (modes[i].height == height) &&
+             (modes[i].refresh == refresh))
+           {
+             modes[i].fb_var.bits_per_pixel = cur_mode->depth;
+
+             if (ioctl(fb, FBIOPUT_VSCREENINFO, &modes[i].fb_var) == -1)
+               perror("ioctl FBIOPUT_VSCREENINFO");
+
+             free(modes);
+             free(cur_mode);
+             return fb_getmode();
+           }
+       }
+      free(modes);
+    }
+  return cur_mode;
+}
+
+FB_Mode *
+fb_changemode(FB_Mode *cur_mode, int width, int height, int depth, int refresh)
+{
+  FB_Mode *modes;
+  int      i, num_modes;
+
+  modes = fb_list_modes(&num_modes);
+  if (modes)
+    {
+      for (i = 0; i < num_modes; i++)
+       {
+         if ((modes[i].width == width) &&
+             (modes[i].height == height) &&
+             (!depth || modes[i].fb_var.bits_per_pixel == depth) &&
+             (modes[i].refresh == refresh))
+           {
+             if (depth) modes[i].fb_var.bits_per_pixel = depth;
+
+             if (ioctl(fb, FBIOPUT_VSCREENINFO, &modes[i].fb_var) == -1)
+               perror("ioctl FBIOPUT_VSCREENINFO");
+
+             free(modes);
+             free(cur_mode);
+             return fb_getmode();
+           }
+       }
+      free(modes);
+    }
+  return cur_mode;
+}
+
+FB_Mode *
+fb_getmode(void)
+{
+  FB_Mode *mode = NULL;
+  int      hpix, lines, clockrate;
+
+  mode = malloc(sizeof(FB_Mode));
+  /* look what we have now ... */
+
+  if (ioctl(fb, FBIOGET_VSCREENINFO, &mode->fb_var) == -1)
+    {
+      perror("ioctl FBIOGET_VSCREENINFO");
+      exit(1);
+    }
+
+  mode->width = mode->fb_var.xres;
+  mode->height = mode->fb_var.yres;
+  hpix =
+    mode->fb_var.left_margin +
+    mode->fb_var.xres +
+    mode->fb_var.right_margin +
+    mode->fb_var.hsync_len;
+  lines =
+    mode->fb_var.upper_margin +
+    mode->fb_var.yres +
+    mode->fb_var.lower_margin +
+    mode->fb_var.vsync_len;
+   if (mode->fb_var.pixclock > 0)
+     clockrate = 1000000 / mode->fb_var.pixclock;
+   else
+     clockrate = 0;
+   if ((lines > 0) && (hpix > 0))
+     mode->refresh = clockrate * 1000000 / (lines * hpix);
+  switch (mode->fb_var.bits_per_pixel)
+    {
+     case 1:
+      bpp = 1;
+      depth = 1;
+      break;
+     case 4:
+      bpp = 1;
+      depth = 4;
+      break;
+     case 8:
+      bpp = 1;
+      depth = 8;
+      break;
+     case 15:
+     case 16:
+      if (mode->fb_var.green.length == 6)
+       depth = 16;
+      else
+       depth = 15;
+      bpp = 2;
+      break;
+     case 24:
+      depth = 24;
+      bpp = mode->fb_var.bits_per_pixel / 8;
+      break;
+     case 32:
+      depth = 32;
+      bpp = mode->fb_var.bits_per_pixel / 8;
+      break;
+     default:
+      ERR("Cannot handle framebuffer of depth %i",
+            mode->fb_var.bits_per_pixel);
+      fb_cleanup();
+      free(mode);
+      return NULL;
+  }
+  mode->depth = depth;
+  mode->bpp = bpp;
+  if (mode->depth == 8)
+    fb_init_palette_332(mode);
+  else
+    fb_init_palette_linear(mode);
+  return mode;
+}
+
+static void
+fb_setvt(int vtno)
+{
+  struct vt_stat vts;
+  char vtname[32];
+
+  if (vtno < 0)
+    {
+
+      if ((ioctl(tty,VT_OPENQRY, &vtno) == -1))
+       {
+         perror("ioctl VT_OPENQRY");
+         exit(1);
+       }
+      if (vtno <= 0 )
+       {
+         perror("ioctl VT_OPENQRY vtno <= 0");
+         exit(1);
+       }
+
+    }
+  vtno &= 0xff;
+  sprintf(vtname, "/dev/tty%i", vtno);
+  chown(vtname, getuid(), getgid());
+  if (access(vtname,R_OK | W_OK) == -1)
+    {
+      CRIT("Access %s: %s",vtname,strerror(errno));
+      exit(1);
+    }
+  open(vtname,O_RDWR);
+
+  if (ioctl(tty, VT_GETSTATE, &vts) == -1)
+    {
+      perror("ioctl VT_GETSTATE");
+      exit(1);
+    }
+
+  orig_vt_no = vts.v_active;
+/*
+  if (ioctl(tty, VT_ACTIVATE, vtno) == -1)
+    {
+      perror("ioctl VT_ACTIVATE");
+      exit(1);
+    }
+  if (ioctl(tty, VT_WAITACTIVE, vtno) == -1)
+    {
+      perror("ioctl VT_WAITACTIVE");
+      exit(1);
+    }
+*/
+
+}
+
+void
+fb_init(int vt, int device)
+{
+   char dev[32];
+
+   tty = 0;
+#if 0
+   if (vt != 0) fb_setvt(vt);
+#endif
+   sprintf(dev, "/dev/fb/%i", device);
+   fb = open(dev, O_RDWR);
+   if ( fb == -1 )
+     {
+       sprintf(dev, "/dev/fb%i", device);
+       fb = open(dev, O_RDWR);
+     }
+   if (fb == -1)
+     {
+       CRIT("open %s: %s", dev, strerror(errno));
+       fb_cleanup();
+       exit(1);
+     }
+
+   if (ioctl(fb, FBIOGET_VSCREENINFO, &fb_ovar) == -1)
+     {
+       perror("ioctl FBIOGET_VSCREENINFO");
+       exit(1);
+     }
+   if (ioctl(fb, FBIOGET_FSCREENINFO, &fb_fix) == -1)
+     {
+       perror("ioctl FBIOGET_FSCREENINFO");
+       exit(1);
+     }
+
+   if ((fb_ovar.bits_per_pixel == 8) ||
+       (fb_fix.visual == FB_VISUAL_DIRECTCOLOR))
+     {
+
+       if (ioctl(fb,FBIOGETCMAP , &ocmap) == -1)
+         {
+            perror("ioctl FBIOGETCMAP");
+            exit(1);
+         }
+
+     }
+#if 0
+   if (isatty(0))
+      tty = 0;
+   else if ((tty = open("/dev/tty",O_RDWR)) == -1)
+     {
+       CITICAL("open %s: %s", "/dev/tty", strerror(errno));
+       exit(1);
+     }
+   if (tty)
+     {
+       if (ioctl(tty, KDGETMODE, &kd_mode) == -1)
+         {
+            perror("ioctl KDGETMODE");
+            exit(1);
+         }
+       if (ioctl(tty, VT_GETMODE, &vt_omode) == -1)
+         {
+            perror("ioctl VT_GETMODE");
+            exit(1);
+         }
+     }
+#endif
+}
+
+int
+fb_postinit(FB_Mode *mode)
+{
+
+  if (ioctl(fb,FBIOGET_FSCREENINFO, &fb_fix) == -1)
+    {
+      perror("ioctl FBIOGET_FSCREENINFO");
+      fb_cleanup();
+      exit(1);
+    }
+
+  if (fb_fix.type != FB_TYPE_PACKED_PIXELS)
+    {
+      CRIT("can handle only packed pixel frame buffers");
+      fb_cleanup();
+      exit(1);
+    }
+  mode->mem_offset = (unsigned)(fb_fix.smem_start) & (getpagesize()-1);
+  mode->mem = (unsigned char *)mmap(NULL, fb_fix.smem_len + mode->mem_offset,
+                                PROT_WRITE | PROT_READ, MAP_SHARED, fb, 0);
+  if (mode->mem == MAP_FAILED)
+    {
+      perror("mmap");
+      fb_cleanup();
+  }
+  /* move viewport to upper left corner */
+  if ((mode->fb_var.xoffset != 0) || (mode->fb_var.yoffset != 0))
+    {
+      mode->fb_var.xoffset = 0;
+      mode->fb_var.yoffset = 0;
+
+      if (ioctl(fb, FBIOPAN_DISPLAY, &(mode->fb_var)) == -1)
+       {
+         perror("ioctl FBIOPAN_DISPLAY");
+         fb_cleanup();
+       }
+    }
+#if 0
+   if (tty)
+     {
+       if (ioctl(tty,KDSETMODE, KD_GRAPHICS) == -1)
+         {
+            perror("ioctl KDSETMODE");
+            fb_cleanup();
+         }
+     }
+#endif
+  mode->fb_fd = fb;
+  return fb;
+}
+
+static void
+fb_cleanup(void)
+{
+  /* restore console */
+
+  if (ioctl(fb, FBIOPUT_VSCREENINFO, &fb_ovar) == -1)
+    perror("ioctl FBIOPUT_VSCREENINFO");
+  if (ioctl(fb, FBIOGET_FSCREENINFO, &fb_fix) == -1)
+    perror("ioctl FBIOGET_FSCREENINFO");
+
+  if ((fb_ovar.bits_per_pixel == 8) ||
+      (fb_fix.visual == FB_VISUAL_DIRECTCOLOR))
+    {
+
+      if (ioctl(fb, FBIOPUTCMAP, &ocmap) == -1)
+       perror("ioctl FBIOPUTCMAP");
+
+    }
+  close(fb);
+
+
+   if (tty)
+     {
+       if (ioctl(tty, KDSETMODE, kd_mode) == -1)
+         perror("ioctl KDSETMODE");
+       if (ioctl(tty, VT_SETMODE, &vt_omode) == -1)
+         perror("ioctl VT_SETMODE");
+/*     if ((ioctl(tty, VT_ACTIVATE, orig_vt_no) == -1) && (orig_vt_no))
+         perror("ioctl VT_ACTIVATE");
+*/     }
+
+  close(tty);
+}
diff --git a/src/modules/engines/fb/evas_outbuf.c b/src/modules/engines/fb/evas_outbuf.c
new file mode 100644 (file)
index 0000000..ec97910
--- /dev/null
@@ -0,0 +1,397 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+#include <sys/time.h>
+#include <sys/utsname.h>
+
+void
+evas_fb_outbuf_fb_init(void)
+{
+}
+
+void
+evas_fb_outbuf_fb_free(Outbuf *buf)
+{
+   /* FIXME: impliment */
+   WRN("destroying fb info.. not implemented!!!! WARNING. LEAK!");
+   if (buf->priv.back_buf)
+     evas_cache_image_drop(&buf->priv.back_buf->cache_entry);
+   free(buf);
+}
+
+Outbuf *
+evas_fb_outbuf_fb_setup_fb(int w, int h, int rot, Outbuf_Depth depth, int vt_no, int dev_no, int refresh)
+{
+   /* create outbuf struct */
+   /* setup window and/or fb */
+   /* if (dithered) create backbuf */
+   Outbuf *buf;
+   int fb_fd = -1;
+   int fb_depth;
+
+   fb_depth = -1;
+   if (depth == OUTBUF_DEPTH_RGB_16BPP_565_565_DITHERED) fb_depth = 16;
+   else if (depth == OUTBUF_DEPTH_RGB_16BPP_555_555_DITHERED) fb_depth = 15;
+   else if (depth == OUTBUF_DEPTH_RGB_16BPP_565_444_DITHERED) fb_depth = 16;
+   else if (depth == OUTBUF_DEPTH_RGB_16BPP_444_444_DITHERED) fb_depth = 12;
+   else if (depth == OUTBUF_DEPTH_RGB_32BPP_888_8888) fb_depth = 32;
+   else if (depth == OUTBUF_DEPTH_INHERIT) fb_depth = 0;
+   buf = calloc(1, sizeof(Outbuf));
+   if (!buf)
+     return NULL;
+
+   fb_init(vt_no, dev_no);
+   if (rot == 0 || rot == 180)
+     buf->priv.fb.fb = fb_setmode(w, h, fb_depth, refresh);
+   else if (rot == 90 || rot == 270)
+     buf->priv.fb.fb = fb_setmode(h, w, fb_depth, refresh);
+   if (!buf->priv.fb.fb) buf->priv.fb.fb = fb_getmode();
+   if (!buf->priv.fb.fb)
+     {
+       free(buf);
+       return NULL;
+     }
+   fb_fd = fb_postinit(buf->priv.fb.fb);
+
+   if (rot == 0 || rot == 180)
+     {
+       buf->w = buf->priv.fb.fb->width;
+       buf->h = buf->priv.fb.fb->height;
+     }
+   else if (rot == 90 || rot == 270)
+     {
+       buf->w = buf->priv.fb.fb->height;
+       buf->h = buf->priv.fb.fb->width;
+     }
+
+   buf->depth = depth;
+   buf->rot = rot;
+
+     {
+       Gfx_Func_Convert conv_func;
+       int i;
+
+       buf->priv.mask.r = 0;
+       for (i = 0; i < (int)buf->priv.fb.fb->fb_var.red.length; i++)
+         buf->priv.mask.r |= (1 << (buf->priv.fb.fb->fb_var.red.offset + i));
+       buf->priv.mask.g = 0;
+       for (i = 0; i < (int)buf->priv.fb.fb->fb_var.green.length; i++)
+         buf->priv.mask.g |= (1 << (buf->priv.fb.fb->fb_var.green.offset + i));
+       buf->priv.mask.b = 0;
+       for (i = 0; i < (int)buf->priv.fb.fb->fb_var.blue.length; i++)
+         buf->priv.mask.b |= (1 << (buf->priv.fb.fb->fb_var.blue.offset + i));
+
+       conv_func = NULL;
+       if (buf->rot == 0 || buf->rot == 180)
+         conv_func = evas_common_convert_func_get(0, buf->w, buf->h,
+                                      buf->priv.fb.fb->fb_var.bits_per_pixel,
+                                      buf->priv.mask.r,
+                                      buf->priv.mask.g,
+                                      buf->priv.mask.b,
+                                      PAL_MODE_NONE,
+                                      buf->rot);
+       else if (buf->rot == 90 || buf->rot == 270)
+         conv_func = evas_common_convert_func_get(0, buf->h, buf->w,
+                                      buf->priv.fb.fb->fb_var.bits_per_pixel,
+                                      buf->priv.mask.r,
+                                      buf->priv.mask.g,
+                                      buf->priv.mask.b,
+                                      PAL_MODE_NONE,
+                                      buf->rot);
+       if (!conv_func)
+         {
+            free(buf);
+            return NULL;
+         }
+     }
+//   if (buf->priv.fb.fb->fb_var.bits_per_pixel < 24)
+//     buf->priv.back_buf = evas_common_image_create(buf->w, buf->h);
+
+   return buf;
+}
+
+void
+evas_fb_outbuf_fb_blit(Outbuf *buf, int src_x, int src_y, int w, int h, int dst_x, int dst_y)
+{
+   if (buf->priv.back_buf)
+     {
+       evas_common_blit_rectangle(buf->priv.back_buf, buf->priv.back_buf,
+                      src_x, src_y, w, h, dst_x, dst_y);
+       evas_fb_outbuf_fb_update(buf, dst_x, dst_y, w, h);
+     }
+   else
+     {
+       if (buf->priv.fb.fb)
+         {
+            /* FIXME: need to impliment an fb call for "copy area" */
+         }
+     }
+}
+
+void
+evas_fb_outbuf_fb_update(Outbuf *buf, int x, int y, int w, int h)
+{
+   if (!(buf->priv.back_buf)) return;
+   if (buf->priv.fb.fb)
+     {
+       Gfx_Func_Convert conv_func;
+       DATA8 *data;
+
+       data = NULL;
+       conv_func = NULL;
+        if (buf->rot == 0)
+         {
+            data = (DATA8 *)buf->priv.fb.fb->mem + buf->priv.fb.fb->mem_offset +
+              buf->priv.fb.fb->bpp *
+              (x + (y * buf->priv.fb.fb->width));
+            conv_func = evas_common_convert_func_get(data, w, h, buf->priv.fb.fb->fb_var.bits_per_pixel,
+                                         buf->priv.mask.r, buf->priv.mask.g,
+                                         buf->priv.mask.b, PAL_MODE_NONE,
+                                         buf->rot);
+         }
+        else if (buf->rot == 180)
+          {
+             data = (DATA8 *)buf->priv.fb.fb->mem + buf->priv.fb.fb->mem_offset +
+               buf->priv.fb.fb->bpp *
+               (buf->w - x - w + ((buf->h - y - h) * buf->priv.fb.fb->width));
+             conv_func = evas_common_convert_func_get(data, w, h, buf->priv.fb.fb->fb_var.bits_per_pixel,
+                                          buf->priv.mask.r, buf->priv.mask.g,
+                                          buf->priv.mask.b, PAL_MODE_NONE,
+                                          buf->rot);
+          }
+       else if (buf->rot == 270)
+         {
+            data = (DATA8 *)buf->priv.fb.fb->mem + buf->priv.fb.fb->mem_offset +
+              buf->priv.fb.fb->bpp *
+              (buf->h - y - h + (x * buf->priv.fb.fb->width));
+            conv_func = evas_common_convert_func_get(data, h, w, buf->priv.fb.fb->fb_var.bits_per_pixel,
+                                         buf->priv.mask.r, buf->priv.mask.g,
+                                         buf->priv.mask.b, PAL_MODE_NONE,
+                                         buf->rot);
+         }
+       else if (buf->rot == 90)
+         {
+            data = (DATA8 *)buf->priv.fb.fb->mem + buf->priv.fb.fb->mem_offset +
+              buf->priv.fb.fb->bpp *
+              (y + ((buf->w - x - w) * buf->priv.fb.fb->width));
+            conv_func = evas_common_convert_func_get(data, h, w, buf->priv.fb.fb->fb_var.bits_per_pixel,
+                                         buf->priv.mask.r, buf->priv.mask.g,
+                                         buf->priv.mask.b, PAL_MODE_NONE,
+                                         buf->rot);
+         }
+       if (conv_func)
+         {
+            DATA32 *src_data;
+
+            src_data = buf->priv.back_buf->image.data + (y * buf->w) + x;
+            if (buf->rot == 0 || buf->rot == 180)
+              {
+                 conv_func(src_data, data,
+                           buf->w - w,
+                           buf->priv.fb.fb->width - w,
+                           w, h,
+                           x, y, NULL);
+              }
+            else if (buf->rot == 90 || buf->rot == 270)
+              {
+                 conv_func(src_data, data,
+                           buf->w - w,
+                           buf->priv.fb.fb->width - h,
+                           h, w,
+                           x, y, NULL);
+              }
+         }
+     }
+}
+
+RGBA_Image *
+evas_fb_outbuf_fb_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch)
+{
+   if (buf->priv.back_buf)
+     {
+       *cx = x; *cy = y; *cw = w; *ch = h;
+       return buf->priv.back_buf;
+     }
+   else
+     {
+       RGBA_Image *im;
+
+       *cx = 0; *cy = 0; *cw = w; *ch = h;
+       im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get());
+        im->cache_entry.flags.alpha = 1;
+        im = (RGBA_Image *) evas_cache_image_size_set(&im->cache_entry, w, h);
+
+        return im;
+     }
+   return NULL;
+}
+
+void
+evas_fb_outbuf_fb_free_region_for_update(Outbuf *buf, RGBA_Image *update)
+{
+   if (update != buf->priv.back_buf) evas_cache_image_drop(&update->cache_entry);
+}
+
+void
+evas_fb_outbuf_fb_push_updated_region(Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h)
+{
+   if (!buf->priv.fb.fb) return;
+   if (buf->priv.back_buf)
+     {
+       if (update != buf->priv.back_buf)
+         evas_common_blit_rectangle(update, buf->priv.back_buf,
+                        0, 0, w, h, x, y);
+       evas_fb_outbuf_fb_update(buf, x, y, w, h);
+     }
+   else
+     {
+       Gfx_Func_Convert conv_func;
+       DATA8 *data;
+
+       data = NULL;
+       conv_func = NULL;
+       if (buf->rot == 0)
+         {
+            data = (DATA8 *)buf->priv.fb.fb->mem +
+              buf->priv.fb.fb->mem_offset +
+              buf->priv.fb.fb->bpp *
+              (x + (y * buf->priv.fb.fb->width));
+            conv_func = evas_common_convert_func_get(data, w, h,
+                                         buf->priv.fb.fb->fb_var.bits_per_pixel,
+                                         buf->priv.mask.r, buf->priv.mask.g,
+                                         buf->priv.mask.b, PAL_MODE_NONE,
+                                         buf->rot);
+         }
+        else if (buf->rot == 180)  
+          {
+             data = (DATA8 *)buf->priv.fb.fb->mem +
+               buf->priv.fb.fb->mem_offset +
+               buf->priv.fb.fb->bpp *  
+               (buf->w - x - w + ((buf->h - y - h) * buf->priv.fb.fb->width));
+             conv_func = evas_common_convert_func_get(data, w, h,
+                                          buf->priv.fb.fb->fb_var.bits_per_pixel,
+                                          buf->priv.mask.r, buf->priv.mask.g,
+                                          buf->priv.mask.b, PAL_MODE_NONE,
+                                          buf->rot);
+          }
+       else if (buf->rot == 270)
+         {
+            data = (DATA8 *)buf->priv.fb.fb->mem +
+              buf->priv.fb.fb->mem_offset +
+              buf->priv.fb.fb->bpp *
+              (buf->h - y - h + (x * buf->priv.fb.fb->width));
+            conv_func = evas_common_convert_func_get(data, h, w,
+                                         buf->priv.fb.fb->fb_var.bits_per_pixel,
+                                         buf->priv.mask.r, buf->priv.mask.g,
+                                         buf->priv.mask.b, PAL_MODE_NONE,
+                                         buf->rot);
+         }
+       else if (buf->rot == 90)
+         {
+            data = (DATA8 *)buf->priv.fb.fb->mem +
+              buf->priv.fb.fb->mem_offset +
+              buf->priv.fb.fb->bpp *
+              (y + ((buf->w - x - w) * buf->priv.fb.fb->width));
+            conv_func = evas_common_convert_func_get(data, h, w,
+                                         buf->priv.fb.fb->fb_var.bits_per_pixel,
+                                         buf->priv.mask.r, buf->priv.mask.g,
+                                         buf->priv.mask.b, PAL_MODE_NONE,
+                                         buf->rot);
+         }
+       if (conv_func)
+         {
+            DATA32 *src_data;
+
+            src_data = update->image.data;
+            if (buf->rot == 0 || buf->rot == 180)
+              {
+                 conv_func(src_data, data,
+                           0,
+                           buf->priv.fb.fb->width - w,
+                           w, h,
+                           x, y, NULL);
+              }
+            else if (buf->rot == 90 || buf->rot == 270)
+              {
+                 conv_func(src_data, data,
+                           0,
+                           buf->priv.fb.fb->width - h,
+                           h, w,
+                           x, y, NULL);
+              }
+         }
+     }
+}
+
+void
+evas_fb_outbuf_fb_reconfigure(Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth)
+{
+   if ((w == buf->w) && (h == buf->h) &&
+       (rot == buf->rot) && (depth == buf->depth))
+     return;
+   if (buf->priv.back_buf)
+     {
+       evas_cache_image_drop(&buf->priv.back_buf->cache_entry);
+       buf->priv.back_buf = NULL;
+     }
+   if (buf->priv.fb.fb)
+     {
+       /* FIXME: impliment this */
+     }
+   /* if backbuf delet it */
+   /* resize window or reset fb mode */
+   /* if (dithered) create new backbuf */
+}
+
+int
+evas_fb_outbuf_fb_get_width(Outbuf *buf)
+{
+   return buf->w;
+}
+
+int
+evas_fb_outbuf_fb_get_height(Outbuf *buf)
+{
+   return buf->h;
+}
+
+Outbuf_Depth
+evas_fb_outbuf_fb_get_depth(Outbuf *buf)
+{
+   return buf->depth;
+}
+
+int
+evas_fb_outbuf_fb_get_rot(Outbuf *buf)
+{
+   return buf->rot;
+}
+
+int
+evas_fb_outbuf_fb_get_have_backbuf(Outbuf *buf)
+{
+   if (buf->priv.back_buf) return 1;
+   return 0;
+}
+
+void
+evas_fb_outbuf_fb_set_have_backbuf(Outbuf *buf, int have_backbuf)
+{
+   if (buf->priv.back_buf)
+     {
+       if (have_backbuf) return;
+        evas_cache_image_drop(&buf->priv.back_buf->cache_entry);
+       buf->priv.back_buf = NULL;
+     }
+   else
+     {
+       if (!have_backbuf) return;
+       if (buf->priv.fb.fb)
+         {
+            if (buf->priv.fb.fb->fb_var.bits_per_pixel  < 24)
+              {
+                 buf->priv.back_buf = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get());
+                  buf->priv.back_buf = (RGBA_Image *) evas_cache_image_size_set(&buf->priv.back_buf->cache_entry, buf->w, buf->h);
+              }
+         }
+     }
+}
diff --git a/src/modules/engines/gl_common/.cvsignore b/src/modules/engines/gl_common/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/engines/gl_common/Makefile.am b/src/modules/engines/gl_common/Makefile.am
new file mode 100644 (file)
index 0000000..1f95e92
--- /dev/null
@@ -0,0 +1,99 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@
+
+if BUILD_ENGINE_GL_COMMON
+
+noinst_LTLIBRARIES = libevas_engine_gl_common.la
+libevas_engine_gl_common_la_SOURCES  = \
+evas_gl_private.h \
+evas_gl_common.h \
+evas_gl_context.c \
+evas_gl_shader.c \
+evas_gl_rectangle.c \
+evas_gl_texture.c \
+evas_gl_image.c \
+evas_gl_font.c \
+evas_gl_polygon.c \
+evas_gl_line.c \
+shader/rect_frag.h \
+shader/rect_frag_bin_s3c6410.h \
+shader/rect_vert.h \
+shader/rect_vert_bin_s3c6410.h \
+shader/font_frag.h \
+shader/font_frag_bin_s3c6410.h \
+shader/font_vert.h \
+shader/font_vert_bin_s3c6410.h \
+shader/img_frag.h \
+shader/img_frag_bin_s3c6410.h \
+shader/img_vert.h \
+shader/img_vert_bin_s3c6410.h \
+shader/img_nomul_frag.h \
+shader/img_nomul_frag_bin_s3c6410.h \
+shader/img_nomul_vert.h \
+shader/img_nomul_vert_bin_s3c6410.h \
+shader/img_bgra_frag.h \
+shader/img_bgra_frag_bin_s3c6410.h \
+shader/img_bgra_vert.h \
+shader/img_bgra_vert_bin_s3c6410.h \
+shader/img_bgra_nomul_frag.h \
+shader/img_bgra_nomul_frag_bin_s3c6410.h \
+shader/img_bgra_nomul_vert.h \
+shader/img_bgra_nomul_vert_bin_s3c6410.h \
+shader/yuv_frag.h \
+shader/yuv_frag_bin_s3c6410.h \
+shader/yuv_vert.h \
+shader/yuv_vert_bin_s3c6410.h \
+shader/yuv_nomul_frag.h \
+shader/yuv_nomul_frag_bin_s3c6410.h \
+shader/yuv_nomul_vert.h \
+shader/yuv_nomul_vert_bin_s3c6410.h \
+shader/tex_frag.h \
+shader/tex_frag_bin_s3c6410.h \
+shader/tex_vert.h \
+shader/tex_vert_bin_s3c6410.h \
+shader/tex_nomul_frag.h \
+shader/tex_nomul_frag_bin_s3c6410.h \
+shader/tex_nomul_vert.h \
+shader/tex_nomul_vert_bin_s3c6410.h
+
+libevas_engine_gl_common_la_LIBADD = @EINA_LIBS@ @evas_engine_gl_common_libs@ @dlopen_libs@
+endif
+
+EXTRA_DIST = \
+shader/compile-s3c6410.sh \
+shader/compile-sgx.sh \
+shader/make-c-bin.sh \
+shader/make-c-str.sh \
+shader/rect_frag.shd \
+shader/rect_frag_s3c6410.asm \
+shader/rect_vert.shd \
+shader/font_frag.shd \
+shader/font_frag_s3c6410.asm \
+shader/font_vert.shd \
+shader/img_frag.shd \
+shader/img_frag_s3c6410.asm \
+shader/img_vert.shd \
+shader/img_nomul_frag.shd \
+shader/img_nomul_vert.shd \
+shader/img_bgra_vert.shd \
+shader/img_bgra_frag.shd \
+shader/img_bgra_vert.shd \
+shader/img_bgra_nomul_frag.shd \
+shader/img_bgra_nomul_vert.shd \
+shader/yuv_frag.shd \
+shader/yuv_frag_s3c6410.asm \
+shader/yuv_vert.shd \
+shader/yuv_nomul_frag.shd \
+shader/yuv_nomul_vert.shd \
+shader/tex_frag.shd \
+shader/tex_frag_s3c6410.asm \
+shader/tex_vert.shd \
+shader/tex_nomul_frag.shd \
+shader/tex_nomul_vert.shd
diff --git a/src/modules/engines/gl_common/evas_gl_common.h b/src/modules/engines/gl_common/evas_gl_common.h
new file mode 100644 (file)
index 0000000..fb4348c
--- /dev/null
@@ -0,0 +1,385 @@
+#ifndef EVAS_GL_COMMON_H
+#define EVAS_GL_COMMON_H
+
+#include "evas_common.h"
+#include "evas_private.h"
+#include "config.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+#ifdef BUILD_ENGINE_GL_GLEW
+# include <GL/glew.h>
+#else
+# define GL_GLEXT_PROTOTYPES
+#endif
+
+#ifdef BUILD_ENGINE_GL_QUARTZ
+# include <OpenGL/gl.h>
+# include <OpenGL/glext.h>
+#else
+# ifdef _EVAS_ENGINE_SDL_H
+#  if defined(GLES_VARIETY_S3C6410) || defined(GLES_VARIETY_SGX)
+#   include <SDL/SDL_opengles.h>
+#  else
+#   include <SDL/SDL_opengl.h>
+#  endif
+# else
+#  if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+#   if defined(GLES_VARIETY_S3C6410)
+#    include <GLES2/gl2.h>
+#   elif defined(GLES_VARIETY_SGX)
+#    include <GLES2/gl2.h>
+#    include <GLES2/gl2ext.h>
+#   endif
+#  else
+#   include <GL/gl.h>
+#   include <GL/glext.h>
+#  endif
+# endif
+#endif
+
+#ifndef GL_TEXTURE_RECTANGLE_NV
+#define GL_TEXTURE_RECTANGLE_NV 0x84F5
+#endif
+#ifndef GL_BGRA
+#define GL_BGRA 0x80E1
+#endif
+
+#define SHAD_VERTEX 0
+#define SHAD_COLOR  1
+#define SHAD_TEXUV  2
+#define SHAD_TEXUV2 3
+#define SHAD_TEXUV3 4
+
+typedef struct _Evas_GL_Program                      Evas_GL_Program;
+typedef struct _Evas_GL_Program_Source               Evas_GL_Program_Source;
+typedef struct _Evas_GL_Shared                       Evas_GL_Shared;
+typedef struct _Evas_GL_Context                      Evas_GL_Context;
+typedef struct _Evas_GL_Texture_Pool                 Evas_GL_Texture_Pool;
+typedef struct _Evas_GL_Texture                      Evas_GL_Texture;
+typedef struct _Evas_GL_Image                        Evas_GL_Image;
+typedef struct _Evas_GL_Font_Texture                 Evas_GL_Font_Texture;
+typedef struct _Evas_GL_Polygon                      Evas_GL_Polygon;
+typedef struct _Evas_GL_Polygon_Point                Evas_GL_Polygon_Point;
+/*
+typedef struct _Evas_GL_Gradient                     Evas_GL_Gradient;
+*/
+
+struct _Evas_GL_Program
+{
+   GLuint vert, frag, prog;
+};
+
+struct _Evas_GL_Program_Source
+{
+   const char *src;
+   const unsigned int *bin;
+   int bin_size;
+};
+
+struct _Evas_GL_Shared
+{
+   Eina_List          *images;
+   
+   struct {
+      GLint max_texture_units;
+      GLint max_texture_size;
+      GLfloat anisotropic;
+      Eina_Bool rgb : 1;
+      Eina_Bool bgra : 1;
+      Eina_Bool tex_npo2 : 1;
+      Eina_Bool tex_rect : 1;
+   } info;
+   
+   struct {
+      Eina_List       *whole;
+      Eina_List       *atlas[33][3];
+   } tex;
+   
+   struct {
+      Evas_GL_Program  rect;
+      Evas_GL_Program  font;
+      
+      Evas_GL_Program  img,            img_nomul;
+      Evas_GL_Program  img_bgra,       img_bgra_nomul;
+      Evas_GL_Program  yuv,            yuv_nomul;
+      Evas_GL_Program  tex,            tex_nomul;
+   } shader;
+   int references;
+   int w, h;
+   int rot;
+};
+
+struct _Evas_GL_Context
+{
+   int                references;
+   int                w, h;
+   int                rot;
+   RGBA_Draw_Context  *dc;
+   
+   Evas_GL_Shared     *shared;
+   struct {
+      int             x, y, w, h;
+      Eina_Bool       active : 1;
+   } clip;
+   struct {
+      Evas_GL_Image  *surface;
+      GLuint          cur_prog;
+      GLuint          cur_tex, cur_texu, cur_texv;
+      int             render_op;
+      int             cx, cy, cw, ch;
+      Eina_Bool       smooth : 1;
+      Eina_Bool       blend : 1;
+      Eina_Bool       clip : 1;
+      struct {
+         GLuint          cur_prog;
+         GLuint          cur_tex, cur_texum, cur_texv;
+         int             render_op;
+         int             cx, cy, cw, ch;
+         Eina_Bool       smooth : 1;
+         Eina_Bool       blend : 1;
+         Eina_Bool       clip : 1;
+      } current;
+   } shader;
+   struct {
+      int num;
+      int alloc;
+      GLshort *vertex;
+      GLubyte *color;
+      GLfloat *texuv;
+      GLfloat *texuv2;
+      GLfloat *texuv3;
+      Eina_Bool line : 1;
+      Eina_Bool use_vertex : 1;
+      Eina_Bool use_color : 1;
+      Eina_Bool use_texuv : 1;
+      Eina_Bool use_texuv2 : 1;
+      Eina_Bool use_texuv3 : 1;
+      Evas_GL_Image *im;
+   } array;
+   struct {
+      Eina_Bool size : 1;
+   } change;
+   
+   Evas_GL_Image *def_surface;
+};
+
+struct _Evas_GL_Texture_Pool
+{
+   Evas_GL_Context *gc;
+   GLuint           texture, fb;
+   GLuint           intformat, format, dataformat;
+   int              w, h;
+   int              references;
+   int              slot, fslot;
+   Eina_List       *allocations;
+   Eina_Bool        whole : 1;
+   Eina_Bool        render : 1;
+   Eina_Bool        native : 1;
+};
+
+struct _Evas_GL_Texture
+{
+   Evas_GL_Context *gc;
+   Evas_GL_Image   *im;
+   Evas_GL_Texture_Pool *pt, *ptu, *ptv;
+   int              x, y, w, h;
+   double           sx1, sy1, sx2, sy2;
+   int              references;
+   
+   Eina_Bool        alpha : 1;
+};
+
+struct _Evas_GL_Image
+{
+   Evas_GL_Context *gc;
+   RGBA_Image      *im;
+   Evas_GL_Texture *tex;
+   RGBA_Image_Loadopts load_opts;
+   int              references;
+   // if im->im == NULL, it's a render-surface so these here are used
+   int              w, h;
+   struct {
+      int           space;
+      void         *data;
+      unsigned char no_free : 1;
+   } cs;
+   
+   struct {
+      void         *data;
+      struct {
+         void     (*bind)   (void *data, void *image);
+         void     (*unbind) (void *data, void *image);
+         void     (*free)   (void *data, void *image);
+         void      *data;
+      } func;
+      int           yinvert;
+      int           target;
+      int           mipmap;
+      unsigned char loose : 1;
+   } native;
+   
+   unsigned char    dirty : 1;
+   unsigned char    cached : 1;
+   unsigned char    alpha : 1;
+   unsigned char    tex_only : 1;
+};
+
+struct _Evas_GL_Font_Texture
+{
+   Evas_GL_Texture *tex;
+};
+
+struct _Evas_GL_Polygon
+{
+   Eina_List *points;
+   Eina_Bool  changed : 1;
+};
+
+struct _Evas_GL_Polygon_Point
+{
+   int x, y;
+};
+
+/*
+struct _Evas_GL_Gradient
+{
+   RGBA_Gradient   *grad;
+   Evas_GL_Texture *tex;
+   int              tw, th;
+   unsigned char    changed : 1;
+};
+*/
+
+extern Evas_GL_Program_Source shader_rect_frag_src;
+extern Evas_GL_Program_Source shader_rect_vert_src;
+extern Evas_GL_Program_Source shader_font_frag_src;
+extern Evas_GL_Program_Source shader_font_vert_src;
+
+extern Evas_GL_Program_Source shader_img_frag_src;
+extern Evas_GL_Program_Source shader_img_vert_src;
+extern Evas_GL_Program_Source shader_img_nomul_frag_src;
+extern Evas_GL_Program_Source shader_img_nomul_vert_src;
+extern Evas_GL_Program_Source shader_img_bgra_frag_src;
+extern Evas_GL_Program_Source shader_img_bgra_vert_src;
+extern Evas_GL_Program_Source shader_img_bgra_nomul_frag_src;
+extern Evas_GL_Program_Source shader_img_bgra_nomul_vert_src;
+
+extern Evas_GL_Program_Source shader_yuv_frag_src;
+extern Evas_GL_Program_Source shader_yuv_vert_src;
+extern Evas_GL_Program_Source shader_yuv_nomul_frag_src;
+extern Evas_GL_Program_Source shader_yuv_nomul_vert_src;
+
+extern Evas_GL_Program_Source shader_tex_frag_src;
+extern Evas_GL_Program_Source shader_tex_vert_src;
+extern Evas_GL_Program_Source shader_tex_nomul_frag_src;
+extern Evas_GL_Program_Source shader_tex_nomul_vert_src;
+
+void glerr(int err, const char *file, const char *func, int line, const char *op);
+Evas_GL_Context  *evas_gl_common_context_new(void);
+void              evas_gl_common_context_free(Evas_GL_Context *gc);
+void              evas_gl_common_context_use(Evas_GL_Context *gc);
+void              evas_gl_common_context_resize(Evas_GL_Context *gc, int w, int h, int rot);
+void              evas_gl_common_context_target_surface_set(Evas_GL_Context *gc, Evas_GL_Image *surface);
+
+void              evas_gl_common_context_line_push(Evas_GL_Context *gc,
+                                                   int x1, int y1, int x2, int y2,
+                                                   int clip, int cx, int cy, int cw, int ch,
+                                                   int r, int g, int b, int a);
+void              evas_gl_common_context_rectangle_push(Evas_GL_Context *gc,
+                                                        int x, int y, int w, int h,
+                                                        int r, int g, int b, int a);
+void              evas_gl_common_context_image_push(Evas_GL_Context *gc,
+                                                    Evas_GL_Texture *tex,
+                                                    double sx, double sy, double sw, double sh,
+                                                    int x, int y, int w, int h,
+                                                    int r, int g, int b, int a,
+                                                    Eina_Bool smooth, Eina_Bool tex_only);
+void              evas_gl_common_context_font_push(Evas_GL_Context *gc,
+                                                   Evas_GL_Texture *tex,
+                                                   double sx, double sy, double sw, double sh,
+                                                   int x, int y, int w, int h,
+                                                   int r, int g, int b, int a);
+void             evas_gl_common_context_yuv_push(Evas_GL_Context *gc,
+                                                 Evas_GL_Texture *tex,
+                                                 double sx, double sy, double sw, double sh,
+                                                 int x, int y, int w, int h,
+                                                 int r, int g, int b, int a,
+                                                 Eina_Bool smooth);
+void             evas_gl_common_context_image_map4_push(Evas_GL_Context *gc,
+                                                        Evas_GL_Texture *tex,
+                                                        RGBA_Map_Point *p,
+                                                        int clip, int cx, int cy, int cw, int ch,
+                                                        int r, int g, int b, int a,
+                                                        Eina_Bool smooth, 
+                                                        Eina_Bool tex_only);
+void              evas_gl_common_context_flush(Evas_GL_Context *gc);
+
+int               evas_gl_common_shader_program_init(Evas_GL_Program *p,
+                                                     Evas_GL_Program_Source *vert,
+                                                     Evas_GL_Program_Source *frag,
+                                                     const char *name);
+void              evas_gl_common_shader_program_shutdown(Evas_GL_Program *p);
+    
+void              evas_gl_common_rect_draw(Evas_GL_Context *gc, int x, int y, int w, int h);
+
+Evas_GL_Texture  *evas_gl_common_texture_new(Evas_GL_Context *gc, RGBA_Image *im);
+Evas_GL_Texture  *evas_gl_common_texture_native_new(Evas_GL_Context *gc, int w, int h, int alpha, Evas_GL_Image *im);
+Evas_GL_Texture  *evas_gl_common_texture_render_new(Evas_GL_Context *gc, int w, int h, int alpha);
+void              evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im);
+void              evas_gl_common_texture_free(Evas_GL_Texture *tex);
+Evas_GL_Texture  *evas_gl_common_texture_alpha_new(Evas_GL_Context *gc, DATA8 *pixels, int w, int h, int fh);
+void              evas_gl_common_texture_alpha_update(Evas_GL_Texture *tex, DATA8 *pixels, int w, int h, int fh);
+Evas_GL_Texture  *evas_gl_common_texture_yuv_new(Evas_GL_Context *gc, DATA8 **rows, int w, int h);
+void              evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, int w, int h);
+
+void              evas_gl_common_image_all_unload(Evas_GL_Context *gc);
+
+Evas_GL_Image    *evas_gl_common_image_load(Evas_GL_Context *gc, const char *file, const char *key, Evas_Image_Load_Opts *lo, int *error);
+Evas_GL_Image    *evas_gl_common_image_new_from_data(Evas_GL_Context *gc, int w, int h, DATA32 *data, int alpha, int cspace);
+Evas_GL_Image    *evas_gl_common_image_new_from_copied_data(Evas_GL_Context *gc, int w, int h, DATA32 *data, int alpha, int cspace);
+Evas_GL_Image    *evas_gl_common_image_new(Evas_GL_Context *gc, int w, int h, int alpha, int cspace);
+Evas_GL_Image    *evas_gl_common_image_alpha_set(Evas_GL_Image *im, int alpha);
+void              evas_gl_common_image_native_enable(Evas_GL_Image *im);
+void              evas_gl_common_image_native_disable(Evas_GL_Image *im);
+void              evas_gl_common_image_free(Evas_GL_Image *im);
+Evas_GL_Image    *evas_gl_common_image_surface_new(Evas_GL_Context *gc, int w, int h, int alpha);
+void              evas_gl_common_image_dirty(Evas_GL_Image *im, int x, int y, int w, int h);
+void              evas_gl_common_image_map4_draw(Evas_GL_Context *gc, Evas_GL_Image *im, RGBA_Map_Point *p, int smooth, int level);
+void              evas_gl_common_image_draw(Evas_GL_Context *gc, Evas_GL_Image *im, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int smooth);
+
+void             *evas_gl_font_texture_new(void *gc, RGBA_Font_Glyph *fg);
+void              evas_gl_font_texture_free(void *);
+void              evas_gl_font_texture_draw(void *gc, void *surface, void *dc, RGBA_Font_Glyph *fg, int x, int y);
+
+Evas_GL_Polygon  *evas_gl_common_poly_point_add(Evas_GL_Polygon *poly, int x, int y);
+Evas_GL_Polygon  *evas_gl_common_poly_points_clear(Evas_GL_Polygon *poly);
+void              evas_gl_common_poly_draw(Evas_GL_Context *gc, Evas_GL_Polygon *poly, int x, int y);
+
+void              evas_gl_common_line_draw(Evas_GL_Context *gc, int x1, int y1, int x2, int y2);
+
+void (*glsym_glGenFramebuffers)      (GLsizei a, GLuint *b);
+void (*glsym_glBindFramebuffer)      (GLenum a, GLuint b);
+void (*glsym_glFramebufferTexture2D) (GLenum a, GLenum b, GLenum c, GLuint d, GLint e);
+void (*glsym_glDeleteFramebuffers)   (GLsizei a, const GLuint *b);
+
+#define GL_ERRORS 1
+
+#ifdef GL_ERRORS
+# define GLERR(fn, fl, ln, op) \
+   { \
+      int __gl_err = glGetError(); \
+      if (__gl_err != GL_NO_ERROR) glerr(__gl_err, fl, fn, ln, op); \
+   }
+#else
+# define GLERR(fn, fl, ln, op)
+#endif
+
+#endif
diff --git a/src/modules/engines/gl_common/evas_gl_context.c b/src/modules/engines/gl_common/evas_gl_context.c
new file mode 100644 (file)
index 0000000..e5a0d1b
--- /dev/null
@@ -0,0 +1,1491 @@
+#include "evas_gl_private.h"
+
+static int sym_done = 0;
+
+void (*glsym_glGenFramebuffers)      (GLsizei a, GLuint *b) = NULL;
+void (*glsym_glBindFramebuffer)      (GLenum a, GLuint b) = NULL;
+void (*glsym_glFramebufferTexture2D) (GLenum a, GLenum b, GLenum c, GLuint d, GLint e) = NULL;
+void (*glsym_glDeleteFramebuffers)   (GLsizei a, const GLuint *b) = NULL;
+
+static void
+sym_missing(void)
+{
+   printf("EVAS ERROR - GL symbols missing!\n");
+}
+
+static void
+gl_symbols(void)
+{
+   if (sym_done) return;
+   sym_done = 1;
+
+#ifdef _EVAS_ENGINE_SDL_H
+# define FINDSYM(dst, sym) if (!dst) dst = SDL_GL_GetProcAddress(sym)
+#else
+# define FINDSYM(dst, sym) if (!dst) dst = dlsym(RTLD_DEFAULT, sym)
+#endif
+#define FALLBAK(dst) if (!dst) dst = (void *)sym_missing;
+   
+   FINDSYM(glsym_glGenFramebuffers, "glGenFramebuffers");
+   FINDSYM(glsym_glGenFramebuffers, "glGenFramebuffersEXT");
+   FINDSYM(glsym_glGenFramebuffers, "glGenFramebuffersARB");
+   FALLBAK(glsym_glGenFramebuffers);
+   
+   FINDSYM(glsym_glBindFramebuffer, "glBindFramebuffer");
+   FINDSYM(glsym_glBindFramebuffer, "glBindFramebufferEXT");
+   FINDSYM(glsym_glBindFramebuffer, "glBindFramebufferARB");
+   FALLBAK(glsym_glBindFramebuffer);
+   
+   FINDSYM(glsym_glFramebufferTexture2D, "glFramebufferTexture2D");
+   FINDSYM(glsym_glFramebufferTexture2D, "glFramebufferTexture2DEXT");
+   FINDSYM(glsym_glFramebufferTexture2D, "glFramebufferTexture2DARB");
+   FALLBAK(glsym_glFramebufferTexture2D);
+
+   FINDSYM(glsym_glDeleteFramebuffers, "glDeleteFramebuffers");
+   FINDSYM(glsym_glDeleteFramebuffers, "glDeleteFramebuffersEXT");
+   FINDSYM(glsym_glDeleteFramebuffers, "glDeleteFramebuffersARB");
+   FALLBAK(glsym_glDeleteFramebuffers);
+}
+
+static void shader_array_flush(Evas_GL_Context *gc);
+
+static Evas_GL_Context *_evas_gl_common_context = NULL;
+static Evas_GL_Shared *shared = NULL;
+
+void
+glerr(int err, const char *file, const char *func, int line, const char *op)
+{
+   fprintf(stderr, "GLERR: %s:%i %s(), %s: ", file, line, func, op);
+   switch (err)
+     {
+     case GL_INVALID_ENUM:
+        fprintf(stderr, "GL_INVALID_ENUM\n");
+        break;
+     case GL_INVALID_VALUE:
+        fprintf(stderr, "GL_INVALID_VALUE\n");
+        break;
+     case GL_INVALID_OPERATION:
+        fprintf(stderr, "GL_INVALID_OPERATION\n");
+        break;
+     case GL_OUT_OF_MEMORY:
+        fprintf(stderr, "GL_OUT_OF_MEMORY\n");
+        break;
+     default:
+        fprintf(stderr, "0x%x\n", err);
+     }
+}
+
+static void
+matrix_ident(GLfloat *m)
+{
+   memset(m, 0, 16 * sizeof(GLfloat));
+   m[0] = m[5] = m[10] = m[15] = 1.0;
+   //------------------------
+   // 1 0 0 0
+   // 0 1 0 0
+   // 0 0 1 0
+   // 0 0 0 1
+}
+
+static void
+matrix_ortho(GLfloat *m, 
+             GLfloat l, GLfloat r, 
+             GLfloat t, GLfloat b, 
+             GLfloat near, GLfloat far,
+             int rot, int w, int h)
+{
+   GLfloat rotf;
+   GLfloat cosv, sinv;
+   GLfloat tx, ty;
+   
+//   rot = 180;
+   //------------------------
+   m[0] = 2.0 / (r - l);
+   m[1] = 0.0;
+   m[2] = 0.0;
+   m[3] = 0.0;
+
+   //------------------------
+   m[4] = 0.0;
+   m[5] = 2.0 / (t - b);
+   m[6] = 0.0;
+   m[7] = 0.0;
+   
+   //------------------------
+   m[8] = 0.0;
+   m[9] = 0.0;
+   m[10] = -(2.0 / (far - near));
+   m[11] = 0.0;
+   
+   //------------------------
+   m[12] = -((r + l) / (r - l));
+   m[13] = -((t + b) / (t - b));
+   m[14] = -((near + far) / (far - near));
+   m[15] = 1.0;
+
+   // rot
+   rotf = (((rot / 90) & 0x3) * M_PI) / 2.0;
+
+   tx = 0.0;
+   ty = 0.0;
+   if (rot == 90)
+     {
+        tx = -(w * 1.0);
+        ty = -(h * 0.0);
+     }
+   if (rot == 180)
+     {
+        tx = -(w * 1.0);
+        ty = -(h * 1.0);
+     }
+   if (rot == 270)
+     {
+        tx = -(w * 0.0);
+        ty = -(h * 1.0);
+     }
+   
+   cosv = cos(rotf);
+   sinv = sin(rotf);
+   
+   m[0] = (2.0 / (r - l)) * ( cosv);
+   m[1] = (2.0 / (r - l)) * ( sinv);
+   
+   m[4] = (2.0 / (t - b)) * (-sinv);
+   m[5] = (2.0 / (t - b)) * ( cosv);
+   
+   m[12] += (m[0] * tx) + (m[4] * ty);
+   m[13] += (m[1] * tx) + (m[5] * ty);
+   m[14] += (m[2] * tx) + (m[6] * ty);
+   m[15] += (m[3] * tx) + (m[7] * ty);
+}
+
+static int
+_evas_gl_common_version_check()
+{
+   char *version;
+   char *tmp;
+   char *tmp2;
+   int major;
+   int minor;
+
+  /*
+   * glGetString returns a string describing the current GL connection.
+   * GL_VERSION is used to get the version of the connection
+   */
+
+   version = (char *)glGetString(GL_VERSION);
+
+  /*
+   * OpengL ES
+   *
+   * 1.* : The form is:
+   *
+   * OpenGL ES-<profile> <major>.<minor>
+   *
+   * where <profile> is either "CM" or "CL". The minor can be followed by the vendor
+   * specific information
+   *
+   * 2.0 : The form is:
+   *
+   * OpenGL<space>ES<space><version number><space><vendor-specific information>
+   */
+
+   /* OpenGL ES 1.* ? */
+
+   if ((tmp = strstr(version, "OpenGL ES-CM ")) || (tmp = strstr(version, "OpenGL ES-CL ")))
+     {
+        /* Not supported */
+        return 0;
+     }
+
+   /* OpenGL ES 2.* ? */
+
+   if ((tmp = strstr(version, "OpenGL ES ")))
+     {
+        /* Supported */
+        return 1;
+     }
+
+  /*
+   * OpenGL
+   *
+   * The GL_VERSION and GL_SHADING_LANGUAGE_VERSION strings begin with a
+   * version number. The version number uses one of these forms:
+   *
+   * major_number.minor_number
+   * major_number.minor_number.release_number
+   *
+   * Vendor-specific information may follow the version number. Its format
+   * depends on the implementation, but a space always separates the
+   * version number and the vendor-specific information.
+   */
+
+   /* glGetString() returns a static string, and we are going to */
+   /* modify it, so we get a copy first */
+   version = strdup(version);
+   if (!version)
+     return 0;
+
+   tmp = strchr(version, '.');
+   /* the first '.' always exists */
+   *tmp = '\0';
+   major = atoi(version);
+   /* FIXME: maybe we can assume that minor in only a cipher */
+   tmp2 = ++tmp;
+   while ((*tmp != '.') && (*tmp != ' ') && (*tmp != '\0'))
+     tmp++;
+   /* *tmp is '\0' : version is major_number.minor_number */
+   /* *tmp is '.'  : version is major_number.minor_number.release_number */
+   /* *tmp is ' '  : version is major_number.minor_number followed by vendor */
+   *tmp = '\0';
+   minor = atoi(tmp2);
+   free(version);
+
+   if (((major == 1) && (minor >= 4)) || (major >= 2))
+     return 1;
+
+   return 0;
+}
+
+static void
+_evas_gl_common_viewport_set(Evas_GL_Context *gc)
+{
+   GLfloat proj[16];
+   int w = 1, h = 1, m = 1, rot = 1;
+
+   if ((gc->shader.surface == gc->def_surface) ||
+       (!gc->shader.surface))
+     {
+        w = gc->w;
+        h = gc->h;
+        rot = gc->rot;
+     }
+   else
+     {
+        w = gc->shader.surface->w;
+        h = gc->shader.surface->h;
+        rot = 0;
+        m = -1;
+     }
+
+   if ((!gc->change.size) || 
+       ((gc->shared->w == w) && (gc->shared->h == h) && (gc->shared->rot == rot)))
+     return;
+   
+   gc->shared->w = w;
+   gc->shared->h = h;
+   gc->shared->rot = rot;
+   gc->change.size = 0;
+
+   if ((rot == 0) || (rot == 180))
+     glViewport(0, 0, w, h);
+   else
+     glViewport(0, 0, h, w);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   
+   matrix_ident(proj);
+   if (m == 1) matrix_ortho(proj, 0, w, 0, h, -1.0, 1.0, rot, w, h);
+   else matrix_ortho(proj, 0, w, h, 0, -1.0, 1.0, rot, w, h);
+   
+   glUseProgram(gc->shared->shader.rect.prog);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.rect.prog, "mvp"), 1,
+                      GL_FALSE, proj);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glUseProgram(gc->shared->shader.font.prog);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.font.prog, "mvp"), 1,
+                      GL_FALSE, proj);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   
+   glUseProgram(gc->shared->shader.yuv.prog);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.yuv.prog, "mvp"), 1,
+                      GL_FALSE, proj);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glUseProgram(gc->shared->shader.yuv_nomul.prog);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.yuv_nomul.prog, "mvp"), 1,
+                      GL_FALSE, proj);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   
+   glUseProgram(gc->shared->shader.tex.prog);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.tex.prog, "mvp"), 1,
+                      GL_FALSE, proj);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glUseProgram(gc->shared->shader.tex_nomul.prog);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.tex_nomul.prog, "mvp"), 1,
+                      GL_FALSE, proj);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   
+   glUseProgram(gc->shared->shader.img.prog);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.img.prog, "mvp"), 1,
+                      GL_FALSE, proj);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glUseProgram(gc->shared->shader.img_nomul.prog);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.img_nomul.prog, "mvp"), 1,
+                      GL_FALSE, proj);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+   glUseProgram(gc->shared->shader.img_bgra.prog);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.img_bgra.prog, "mvp"), 1,
+                      GL_FALSE, proj);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glUseProgram(gc->shared->shader.img_bgra_nomul.prog);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.img_bgra_nomul.prog, "mvp"), 1,
+                      GL_FALSE, proj);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+   glUseProgram(gc->shader.cur_prog);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+}
+
+Evas_GL_Context *
+evas_gl_common_context_new(void)
+{
+   Evas_GL_Context *gc;
+
+#if 1
+   if (_evas_gl_common_context)
+     {
+       _evas_gl_common_context->references++;
+       return _evas_gl_common_context;
+     }
+#endif
+   if (!_evas_gl_common_version_check())
+     return NULL;
+   gc = calloc(1, sizeof(Evas_GL_Context));
+   if (!gc) return NULL;
+
+   gl_symbols();
+   
+   gc->references = 1;
+   
+   _evas_gl_common_context = gc;
+
+   if (!shared)
+     {
+        GLint linked;
+        unsigned int pixel = 0xffffffff;
+        const GLubyte *ext;
+
+        shared = calloc(1, sizeof(Evas_GL_Shared));
+        ext = glGetString(GL_EXTENSIONS);
+        if (ext)
+          {
+             fprintf(stderr, "EXT:\n%s\n", ext);
+             if ((strstr((char*) ext, "GL_ARB_texture_non_power_of_two")) ||
+                 (strstr((char*) ext, "OES_texture_npot")) ||
+                 (strstr((char*) ext, "GL_IMG_texture_npot")))
+               shared->info.tex_npo2 = 1;
+             if ((strstr((char*) ext, "GL_NV_texture_rectangle")) ||
+                 (strstr((char*) ext, "GL_EXT_texture_rectangle")) ||
+                 (strstr((char*) ext, "GL_ARB_texture_rectangle")))
+               shared->info.tex_rect = 1;
+#ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
+             if ((strstr((char*) ext, "GL_EXT_texture_filter_anisotropic")))
+               glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, 
+                           &(shared->info.anisotropic));
+#endif
+#ifdef GL_BGRA
+             if ((strstr((char*) ext, "GL_EXT_bgra")) ||
+                 (strstr((char*) ext, "GL_EXT_texture_format_BGRA8888")))
+               shared->info.bgra = 1;
+#endif             
+          }
+        glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS,
+                      &(shared->info.max_texture_units));
+        glGetIntegerv(GL_MAX_TEXTURE_SIZE,
+                      &(shared->info.max_texture_size));
+        
+        fprintf(stderr, "max tex size %ix%i\n"
+                "max units %i\n"
+                "non-power-2 tex %i\n"
+                "rect tex %i\n"
+                "bgra : %i\n"
+                "max ansiotropic filtering: %3.3f\n"
+                , 
+                shared->info.max_texture_size, shared->info.max_texture_size,
+                shared->info.max_texture_units,
+                (int)shared->info.tex_npo2,
+                (int)shared->info.tex_rect,
+                (int)shared->info.bgra,
+                (double)shared->info.anisotropic
+                );
+        
+        glDisable(GL_DEPTH_TEST);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glEnable(GL_DITHER);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glDisable(GL_BLEND);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        // no dest alpha
+//        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // dest alpha
+//        glBlendFunc(GL_SRC_ALPHA, GL_ONE); // ???
+        glDepthMask(GL_FALSE);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+#ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
+        if (shared->info.anisotropic > 0.0)
+          {
+             glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+          }
+#endif
+        
+        glEnableVertexAttribArray(SHAD_VERTEX);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glEnableVertexAttribArray(SHAD_COLOR);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+        if (!evas_gl_common_shader_program_init(&(shared->shader.rect), 
+                                                &(shader_rect_vert_src), 
+                                                &(shader_rect_frag_src),
+                                                "rect")) goto error;
+        if (!evas_gl_common_shader_program_init(&(shared->shader.font),
+                                                &(shader_font_vert_src), 
+                                                &(shader_font_frag_src),
+                                                "font")) goto error;
+        if (!evas_gl_common_shader_program_init(&(shared->shader.img),
+                                                &(shader_img_vert_src),
+                                                &(shader_img_frag_src),
+                                                "img")) goto error;
+        if (!evas_gl_common_shader_program_init(&(shared->shader.img_nomul),
+                                                &(shader_img_nomul_vert_src),
+                                                &(shader_img_nomul_frag_src),
+                                                "img_nomul")) goto error;
+        if (!evas_gl_common_shader_program_init(&(shared->shader.img_bgra),
+                                                &(shader_img_bgra_vert_src),
+                                                &(shader_img_bgra_frag_src),
+                                                "img_bgra")) goto error;
+        if (!evas_gl_common_shader_program_init(&(shared->shader.img_bgra_nomul),
+                                                &(shader_img_bgra_nomul_vert_src),
+                                                &(shader_img_bgra_nomul_frag_src),
+                                                "img_bgra_nomul")) goto error;
+        if (!evas_gl_common_shader_program_init(&(shared->shader.tex),
+                                                &(shader_tex_vert_src), 
+                                                &(shader_tex_frag_src),
+                                                "tex")) goto error;
+        if (!evas_gl_common_shader_program_init(&(shared->shader.tex_nomul),
+                                                &(shader_tex_nomul_vert_src), 
+                                                &(shader_tex_nomul_frag_src),
+                                                "tex_nomul")) goto error;
+        if (!evas_gl_common_shader_program_init(&(shared->shader.yuv),
+                                                &(shader_yuv_vert_src), 
+                                                &(shader_yuv_frag_src),
+                                                "yuv")) goto error;
+        if (!evas_gl_common_shader_program_init(&(shared->shader.yuv_nomul),
+                                                &(shader_yuv_nomul_vert_src), 
+                                                &(shader_yuv_nomul_frag_src),
+                                                "yuv_nomul")) goto error;
+        
+        glUseProgram(shared->shader.yuv.prog);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glUniform1i(glGetUniformLocation(shared->shader.yuv.prog, "tex"), 0);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glUniform1i(glGetUniformLocation(shared->shader.yuv.prog, "texu"), 1);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glUniform1i(glGetUniformLocation(shared->shader.yuv.prog, "texv"), 2);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        
+        glUseProgram(shared->shader.yuv_nomul.prog);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glUniform1i(glGetUniformLocation(shared->shader.yuv_nomul.prog, "tex"), 0);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glUniform1i(glGetUniformLocation(shared->shader.yuv_nomul.prog, "texu"), 1);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glUniform1i(glGetUniformLocation(shared->shader.yuv_nomul.prog, "texv"), 2);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        
+        glUseProgram(gc->shader.cur_prog);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        // in shader:
+        // uniform sampler2D tex[8];
+        // 
+        // in code:
+        // GLuint texes[8];
+        // GLint loc = glGetUniformLocation(prog, "tex");
+        // glUniform1iv(loc, 8, texes);
+     }
+   gc->shared = shared;
+   gc->shared->references++;
+   _evas_gl_common_viewport_set(gc);
+   
+   gc->def_surface = evas_gl_common_image_surface_new(gc, 1, 1, 1);
+   
+   return gc;
+   error:
+   evas_gl_common_context_free(gc);
+   return NULL;
+}
+
+void
+evas_gl_common_context_free(Evas_GL_Context *gc)
+{
+   int i, j;
+   
+   gc->references--;
+   if (gc->references > 0) return;
+   if (gc->shared) gc->shared->references--;
+   
+   if (gc->def_surface) evas_gl_common_image_free(gc->def_surface);
+   
+   if ((gc->shared) && (gc->shared->references == 0))
+     {
+        evas_gl_common_shader_program_shutdown(&(gc->shared->shader.rect));
+        evas_gl_common_shader_program_shutdown(&(gc->shared->shader.font));
+        evas_gl_common_shader_program_shutdown(&(gc->shared->shader.img));
+        evas_gl_common_shader_program_shutdown(&(gc->shared->shader.img_nomul));
+        evas_gl_common_shader_program_shutdown(&(gc->shared->shader.img_bgra));
+        evas_gl_common_shader_program_shutdown(&(gc->shared->shader.img_bgra_nomul));
+        evas_gl_common_shader_program_shutdown(&(gc->shared->shader.yuv));
+        evas_gl_common_shader_program_shutdown(&(gc->shared->shader.yuv_nomul));
+        evas_gl_common_shader_program_shutdown(&(gc->shared->shader.tex));
+        evas_gl_common_shader_program_shutdown(&(gc->shared->shader.tex_nomul));
+        
+        while (gc->shared->images)
+          {
+             evas_gl_common_image_free(gc->shared->images->data);
+          }
+        while (gc->shared->tex.whole)
+          {
+             evas_gl_common_texture_free(gc->shared->tex.whole->data);
+          }
+        for (i = 0; i < 33; i++)
+          {
+             for (j = 0; j < 3; j++)
+               {
+                  while (gc->shared->tex.atlas[i][j])
+                    {
+                       evas_gl_common_texture_free
+                         ((Evas_GL_Texture *)gc->shared->tex.atlas[i][j]);
+                       gc->shared->tex.atlas[i][j] = NULL;
+                    }
+               }
+          }
+        free(gc->shared);
+        shared = NULL;
+     }
+   
+
+   if (gc->array.vertex) free(gc->array.vertex);
+   if (gc->array.color) free(gc->array.color);
+   if (gc->array.texuv) free(gc->array.texuv);
+   if (gc->array.texuv2) free(gc->array.texuv2);
+   if (gc->array.texuv3) free(gc->array.texuv3);
+   
+   if (gc == _evas_gl_common_context) _evas_gl_common_context = NULL;
+   free(gc);
+}
+
+void
+evas_gl_common_context_use(Evas_GL_Context *gc)
+{
+//   if (_evas_gl_common_context == gc) return;
+   _evas_gl_common_context = gc;
+   _evas_gl_common_viewport_set(gc);
+}
+
+void
+evas_gl_common_context_resize(Evas_GL_Context *gc, int w, int h, int rot)
+{
+   if ((gc->w == w) && (gc->h == h) && (gc->rot == rot)) return;
+   gc->change.size = 1;
+   gc->rot = rot;
+   gc->w = w;
+   gc->h = h;
+   if (_evas_gl_common_context == gc) _evas_gl_common_viewport_set(gc);
+}
+
+void
+evas_gl_common_context_target_surface_set(Evas_GL_Context *gc,
+                                          Evas_GL_Image *surface)
+{
+   if (surface == gc->shader.surface) return;
+   
+   evas_gl_common_context_flush(gc);
+
+   gc->shader.surface = surface;
+   gc->change.size = 1;
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+# ifndef GL_FRAMEBUFFER
+#  define GL_FRAMEBUFFER GL_FRAMEBUFFER_OES
+# endif   
+#else
+# ifndef GL_FRAMEBUFFER
+#  define GL_FRAMEBUFFER GL_FRAMEBUFFER_EXT
+# endif   
+#endif   
+   if (gc->shader.surface == gc->def_surface)
+     {
+        glsym_glBindFramebuffer(GL_FRAMEBUFFER, 0);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+     }
+   else
+     {
+        glsym_glBindFramebuffer(GL_FRAMEBUFFER, surface->tex->pt->fb);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+     }
+   _evas_gl_common_viewport_set(gc);
+}
+
+#define PUSH_VERTEX(x, y, z) \
+   gc->array.vertex[nv++] = x; \
+   gc->array.vertex[nv++] = y; \
+   gc->array.vertex[nv++] = z
+#define PUSH_COLOR(r, g, b, a) \
+   gc->array.color[nc++] = r; \
+   gc->array.color[nc++] = g; \
+   gc->array.color[nc++] = b; \
+   gc->array.color[nc++] = a
+#define PUSH_TEXUV(u, v) \
+   gc->array.texuv[nu++] = u; \
+   gc->array.texuv[nu++] = v
+#define PUSH_TEXUV2(u, v) \
+   gc->array.texuv2[nu2++] = u; \
+   gc->array.texuv2[nu2++] = v
+#define PUSH_TEXUV3(u, v) \
+   gc->array.texuv3[nu3++] = u; \
+   gc->array.texuv3[nu3++] = v
+
+static inline void
+_evas_gl_common_context_array_alloc(Evas_GL_Context *gc)
+{
+   if (gc->array.num <= gc->array.alloc) return;
+   gc->array.alloc += 6 * 1024;
+   if (gc->array.use_vertex)
+     gc->array.vertex = realloc(gc->array.vertex,
+                                gc->array.alloc * sizeof(GLshort) * 3);
+   if (gc->array.use_color)
+     gc->array.color  = realloc(gc->array.color,
+                                gc->array.alloc * sizeof(GLubyte) * 4);
+   if (gc->array.use_texuv)
+     gc->array.texuv  = realloc(gc->array.texuv,
+                                gc->array.alloc * sizeof(GLfloat) * 2);
+   if (gc->array.use_texuv2)
+     gc->array.texuv2  = realloc(gc->array.texuv2,
+                               gc->array.alloc * sizeof(GLfloat) * 2);
+   if (gc->array.use_texuv3)
+     gc->array.texuv3  = realloc(gc->array.texuv3,
+                                 gc->array.alloc * sizeof(GLfloat) * 2);
+}
+
+void
+evas_gl_common_context_line_push(Evas_GL_Context *gc, 
+                                 int x1, int y1, int x2, int y2,
+                                 int clip, int cx, int cy, int cw, int ch,
+                                 int r, int g, int b, int a)
+{
+   int pnum, nv, nc, nu, nt, i;
+   Eina_Bool blend = 0;
+   GLuint prog = gc->shared->shader.rect.prog;
+   
+   shader_array_flush(gc);
+   
+   if (a < 255) blend = 1;
+   if (gc->dc->render_op == EVAS_RENDER_COPY) blend = 0;
+   gc->shader.cur_tex = 0;
+   gc->shader.cur_prog = prog;
+   gc->shader.blend = blend;
+   gc->shader.render_op = gc->dc->render_op;
+   gc->shader.clip = clip;
+   gc->shader.cx = cx;
+   gc->shader.cy = cy;
+   gc->shader.cw = cw;
+   gc->shader.ch = ch;
+   
+   gc->array.line = 1;
+   gc->array.use_vertex = 1;
+   gc->array.use_color = 1;
+   gc->array.use_texuv = 0;
+   gc->array.use_texuv2 = 0;
+   gc->array.use_texuv3 = 0;
+   
+   pnum = gc->array.num;
+   nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nt = pnum * 4;
+   gc->array.num += 1;
+   _evas_gl_common_context_array_alloc(gc);
+  
+   PUSH_VERTEX(x1, y1, 0);
+   PUSH_VERTEX(x2, y2, 0);
+   
+   for (i = 0; i < 2; i++)
+     {
+        PUSH_COLOR(r, g, b, a);
+     }
+   
+   shader_array_flush(gc);
+   gc->array.line = 0;
+   gc->array.use_vertex = 0;
+   gc->array.use_color = 0;
+   gc->array.use_texuv = 0;
+   gc->array.use_texuv2 = 0;
+   gc->array.use_texuv3 = 0;
+}
+
+void
+evas_gl_common_context_rectangle_push(Evas_GL_Context *gc, 
+                                      int x, int y, int w, int h,
+                                      int r, int g, int b, int a)
+{
+   int pnum, nv, nc, nu, nt, i;
+   Eina_Bool blend = 0;
+   GLuint prog = gc->shared->shader.rect.prog;
+   
+   if (a < 255) blend = 1;
+   if (gc->dc->render_op == EVAS_RENDER_COPY) blend = 0;
+   
+   if ((gc->shader.cur_tex != 0)
+       || (gc->shader.cur_prog != prog)
+       || (gc->shader.blend != blend)
+       || (gc->shader.render_op != gc->dc->render_op)
+       || (gc->shader.clip != 0)
+       )
+     {
+        shader_array_flush(gc);
+        gc->shader.cur_tex = 0;
+        gc->shader.cur_prog = prog;
+        gc->shader.blend = blend;
+        gc->shader.render_op = gc->dc->render_op;
+        gc->shader.clip = 0;
+
+     }
+   gc->array.line = 0;
+   gc->array.use_vertex = 1;
+   gc->array.use_color = 1;
+   gc->array.use_texuv = 0;
+   gc->array.use_texuv2 = 0;
+   gc->array.use_texuv3 = 0;
+   
+   pnum = gc->array.num;
+   nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nt = pnum * 4;
+   gc->array.num += 6;
+   _evas_gl_common_context_array_alloc(gc);
+  
+   PUSH_VERTEX(x    , y    , 0);
+   PUSH_VERTEX(x + w, y    , 0);
+   PUSH_VERTEX(x    , y + h, 0);
+   
+   PUSH_VERTEX(x + w, y    , 0);
+   PUSH_VERTEX(x + w, y + h, 0);
+   PUSH_VERTEX(x    , y + h, 0);
+   
+   for (i = 0; i < 6; i++)
+     {
+        PUSH_COLOR(r, g, b, a);
+     }
+}
+
+void
+evas_gl_common_context_image_push(Evas_GL_Context *gc,
+                                  Evas_GL_Texture *tex,
+                                  double sx, double sy, double sw, double sh,
+                                  int x, int y, int w, int h,
+                                  int r, int g, int b, int a,
+                                  Eina_Bool smooth, Eina_Bool tex_only)
+{
+   int pnum, nv, nc, nu, nu2, nt, i;
+   GLfloat tx1, tx2, ty1, ty2;
+   Eina_Bool blend = 1;
+   GLuint prog = gc->shared->shader.img.prog;
+
+   if (!tex->alpha) blend = 0;
+   if (a < 255) blend = 1;
+   
+   if (tex_only)
+     {
+        if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
+          prog = gc->shared->shader.tex_nomul.prog;
+        else
+          prog = gc->shared->shader.tex.prog;
+     }
+   else
+     {
+        if (tex->gc->shared->info.bgra)
+          {
+             if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
+               prog = gc->shared->shader.img_bgra_nomul.prog;
+             else
+               prog = gc->shared->shader.img_bgra.prog;
+          }
+        else
+          {
+             if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
+               prog = gc->shared->shader.img_nomul.prog;
+             else
+               prog = gc->shared->shader.img.prog;
+          }
+     }
+
+   if ((gc->shader.cur_tex != tex->pt->texture)
+       || (gc->shader.cur_prog != prog)
+       || (gc->shader.smooth != smooth)
+       || (gc->shader.blend != blend)
+       || (gc->shader.render_op != gc->dc->render_op)
+       || (gc->shader.clip != 0)
+       )
+     {
+        shader_array_flush(gc);
+        gc->shader.cur_tex = tex->pt->texture;
+        gc->shader.cur_prog = prog;
+        gc->shader.smooth = smooth;
+        gc->shader.blend = blend;
+        gc->shader.render_op = gc->dc->render_op;
+        gc->shader.clip = 0;
+     } 
+   if ((tex->im) && (tex->im->native.data))
+     {
+        if (gc->array.im != tex->im)
+          {
+             shader_array_flush(gc);
+             gc->array.im = tex->im;
+          }
+     }
+   
+   gc->array.line = 0;
+   gc->array.use_vertex = 1;
+   // if nomul... dont need this
+   gc->array.use_color = 1;
+   gc->array.use_texuv = 1;
+   gc->array.use_texuv2 = 0;
+   gc->array.use_texuv3 = 0;
+  
+   pnum = gc->array.num;
+   nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nu2 = pnum * 2;
+   nt = pnum * 4;
+   gc->array.num += 6;
+   _evas_gl_common_context_array_alloc(gc);
+
+   if ((tex->im) && (tex->im->native.data) && (!tex->im->native.yinvert))
+     {
+        tx1 = ((double)(tex->x) + sx) / (double)tex->pt->w;
+        ty1 = ((double)(tex->y) + sy + sh) / (double)tex->pt->h;
+        tx2 = ((double)(tex->x) + sx + sw) / (double)tex->pt->w;
+        ty2 = ((double)(tex->y) + sy) / (double)tex->pt->h;
+     }
+   else
+     {
+        tx1 = ((double)(tex->x) + sx) / (double)tex->pt->w;
+        ty1 = ((double)(tex->y) + sy) / (double)tex->pt->h;
+        tx2 = ((double)(tex->x) + sx + sw) / (double)tex->pt->w;
+        ty2 = ((double)(tex->y) + sy + sh) / (double)tex->pt->h;
+     }
+
+   PUSH_VERTEX(x    , y    , 0);
+   PUSH_VERTEX(x + w, y    , 0);
+   PUSH_VERTEX(x    , y + h, 0);
+   
+   PUSH_TEXUV(tx1, ty1);
+   PUSH_TEXUV(tx2, ty1);
+   PUSH_TEXUV(tx1, ty2);
+   
+   PUSH_VERTEX(x + w, y    , 0);
+   PUSH_VERTEX(x + w, y + h, 0);
+   PUSH_VERTEX(x    , y + h, 0);
+   
+   PUSH_TEXUV(tx2, ty1);
+   PUSH_TEXUV(tx2, ty2);
+   PUSH_TEXUV(tx1, ty2);
+
+   // if nomul... dont need this
+   for (i = 0; i < 6; i++)
+     {
+        PUSH_COLOR(r, g, b, a);
+     }
+}
+
+void
+evas_gl_common_context_font_push(Evas_GL_Context *gc,
+                                 Evas_GL_Texture *tex,
+                                 double sx, double sy, double sw, double sh,
+                                 int x, int y, int w, int h,
+                                 int r, int g, int b, int a)
+{
+   int pnum, nv, nc, nu, nt, i;
+   GLfloat tx1, tx2, ty1, ty2;
+
+   if ((gc->shader.cur_tex != tex->pt->texture)
+       || (gc->shader.cur_prog != gc->shared->shader.font.prog)
+       || (gc->shader.smooth != 0)
+       || (gc->shader.blend != 1)
+       || (gc->shader.render_op != gc->dc->render_op)
+       || (gc->shader.clip != 0)
+       )
+     {
+        shader_array_flush(gc);
+        gc->shader.cur_tex = tex->pt->texture;
+        gc->shader.cur_prog = gc->shared->shader.font.prog;
+        gc->shader.smooth = 0;
+        gc->shader.blend = 1;
+        gc->shader.render_op = gc->dc->render_op;
+        gc->shader.clip = 0;
+     }
+   gc->array.line = 0;
+   gc->array.use_vertex = 1;
+   gc->array.use_color = 1;
+   gc->array.use_texuv = 1;
+   gc->array.use_texuv2 = 0;
+   gc->array.use_texuv3 = 0;
+   
+   pnum = gc->array.num;
+   nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nt = pnum * 4;
+   gc->array.num += 6;
+   _evas_gl_common_context_array_alloc(gc);
+
+   if (sw == 0.0)
+     {
+        tx1 = tex->sx1;
+        ty1 = tex->sy1;
+        tx2 = tex->sx2;
+        ty2 = tex->sy2;
+     }
+   else
+     {
+        tx1 = ((double)(tex->x) + sx) / (double)tex->pt->w;
+        ty1 = ((double)(tex->y) + sy) / (double)tex->pt->h;
+        tx2 = ((double)(tex->x) + sx + sw) / (double)tex->pt->w;
+        ty2 = ((double)(tex->y) + sy + sh) / (double)tex->pt->h;
+     }
+   
+   PUSH_VERTEX(x    , y    , 0);
+   PUSH_VERTEX(x + w, y    , 0);
+   PUSH_VERTEX(x    , y + h, 0);
+   
+   PUSH_TEXUV(tx1, ty1);
+   PUSH_TEXUV(tx2, ty1);
+   PUSH_TEXUV(tx1, ty2);
+   
+   PUSH_VERTEX(x + w, y    , 0);
+   PUSH_VERTEX(x + w, y + h, 0);
+   PUSH_VERTEX(x    , y + h, 0);
+   
+   PUSH_TEXUV(tx2, ty1);
+   PUSH_TEXUV(tx2, ty2);
+   PUSH_TEXUV(tx1, ty2);
+
+   for (i = 0; i < 6; i++)
+     {
+        PUSH_COLOR(r, g, b, a);
+     }
+}
+
+void
+evas_gl_common_context_yuv_push(Evas_GL_Context *gc,
+                                Evas_GL_Texture *tex, 
+                                double sx, double sy, double sw, double sh,
+                                int x, int y, int w, int h,
+                                int r, int g, int b, int a,
+                                Eina_Bool smooth)
+{
+   int pnum, nv, nc, nu, nu2, nu3, nt, i;
+   GLfloat tx1, tx2, ty1, ty2, t2x1, t2x2, t2y1, t2y2;
+   Eina_Bool blend = 0;
+   GLuint prog = gc->shared->shader.yuv.prog;
+
+   if (a < 255) blend = 1;
+   
+   if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
+     prog = gc->shared->shader.yuv_nomul.prog;
+   else
+     prog = gc->shared->shader.yuv.prog;
+   
+   if ((gc->shader.cur_tex != tex->pt->texture)
+       || (gc->shader.cur_prog != prog)
+       || (gc->shader.smooth != smooth)
+       || (gc->shader.blend != blend)
+       || (gc->shader.render_op != gc->dc->render_op)
+       || (gc->shader.clip != 0)
+       )
+     {
+        shader_array_flush(gc);
+        gc->shader.cur_tex = tex->pt->texture;
+        gc->shader.cur_texu = tex->ptu->texture;
+        gc->shader.cur_texv = tex->ptv->texture;
+        gc->shader.cur_prog = prog;
+        gc->shader.smooth = smooth;
+        gc->shader.blend = blend;
+        gc->shader.render_op = gc->dc->render_op;
+        gc->shader.clip = 0;
+     }
+   gc->array.line = 0;
+   gc->array.use_vertex = 1;
+   gc->array.use_color = 1;
+   gc->array.use_texuv = 1;
+   gc->array.use_texuv2 = 1;
+   gc->array.use_texuv3 = 1;
+   
+   pnum = gc->array.num;
+   nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; 
+   nu2 = pnum * 2; nu3 = pnum * 2; nt = pnum * 4;
+   gc->array.num += 6;
+   _evas_gl_common_context_array_alloc(gc);
+
+   tx1 = (sx) / (double)tex->pt->w;
+   ty1 = (sy) / (double)tex->pt->h;
+   tx2 = (sx + sw) / (double)tex->pt->w;
+   ty2 = (sy + sh) / (double)tex->pt->h;
+   
+   t2x1 = ((sx) / 2) / (double)tex->ptu->w;
+   t2y1 = ((sy) / 2) / (double)tex->ptu->h;
+   t2x2 = ((sx + sw) / 2) / (double)tex->ptu->w;
+   t2y2 = ((sy + sh) / 2) / (double)tex->ptu->h;
+   
+   PUSH_VERTEX(x    , y    , 0);
+   PUSH_VERTEX(x + w, y    , 0);
+   PUSH_VERTEX(x    , y + h, 0);
+   
+   PUSH_TEXUV(tx1, ty1);
+   PUSH_TEXUV(tx2, ty1);
+   PUSH_TEXUV(tx1, ty2);
+   
+   PUSH_TEXUV2(t2x1, t2y1);
+   PUSH_TEXUV2(t2x2, t2y1);
+   PUSH_TEXUV2(t2x1, t2y2);
+   
+   PUSH_TEXUV3(t2x1, t2y1);
+   PUSH_TEXUV3(t2x2, t2y1);
+   PUSH_TEXUV3(t2x1, t2y2);
+   
+   PUSH_VERTEX(x + w, y    , 0);
+   PUSH_VERTEX(x + w, y + h, 0);
+   PUSH_VERTEX(x    , y + h, 0);
+   
+   PUSH_TEXUV(tx2, ty1);
+   PUSH_TEXUV(tx2, ty2);
+   PUSH_TEXUV(tx1, ty2);
+
+   PUSH_TEXUV2(t2x2, t2y1);
+   PUSH_TEXUV2(t2x2, t2y2);
+   PUSH_TEXUV2(t2x1, t2y2);
+
+   PUSH_TEXUV3(t2x2, t2y1);
+   PUSH_TEXUV3(t2x2, t2y2);
+   PUSH_TEXUV3(t2x1, t2y2);
+
+   for (i = 0; i < 6; i++)
+     {
+        PUSH_COLOR(r, g, b, a);
+     }
+}
+
+void
+evas_gl_common_context_image_map4_push(Evas_GL_Context *gc,
+                                       Evas_GL_Texture *tex,
+                                       RGBA_Map_Point *p,
+                                       int clip, int cx, int cy, int cw, int ch,
+                                       int r, int g, int b, int a,
+                                       Eina_Bool smooth, Eina_Bool tex_only)
+{
+   int pnum, nv, nc, nu, nu2, nt, i;
+   const int points[6] = { 0, 1, 2, 0, 2, 3 };
+   GLfloat tx[4], ty[4];
+   Eina_Bool blend = 1;
+   RGBA_Map_Point *pt;
+   DATA32 cmul;
+   GLuint prog = gc->shared->shader.img.prog;
+
+   if (!tex->alpha) blend = 0;
+   if (a < 255) blend = 1;
+   if ((A_VAL(&(p[0].col)) < 0xff) || (A_VAL(&(p[1].col)) < 0xff) ||
+       (A_VAL(&(p[2].col)) < 0xff) || (A_VAL(&(p[3].col)) < 0xff))
+     blend = 1;
+   
+   if (tex_only)
+     {
+        if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
+          {
+             if ((p[0].col == 0xffffffff) && (p[1].col == 0xffffffff) &&
+                 (p[2].col == 0xffffffff) && (p[3].col == 0xffffffff))
+               prog = gc->shared->shader.tex_nomul.prog;
+             else
+               prog = gc->shared->shader.tex.prog;
+          }
+        else
+          prog = gc->shared->shader.tex.prog;
+     }
+   else
+     {
+        if (tex->gc->shared->info.bgra)
+          {
+             if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
+               {
+                  if ((p[0].col == 0xffffffff) && (p[1].col == 0xffffffff) &&
+                      (p[2].col == 0xffffffff) && (p[3].col == 0xffffffff))
+                    prog = gc->shared->shader.img_bgra_nomul.prog;
+                  else
+                    prog = gc->shared->shader.img_bgra.prog;
+               }
+             else
+               prog = gc->shared->shader.img_bgra.prog;
+          }
+        else
+          {
+             if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
+               {
+                  if ((p[0].col == 0xffffffff) && (p[1].col == 0xffffffff) &&
+                      (p[2].col == 0xffffffff) && (p[3].col == 0xffffffff))
+                    prog = gc->shared->shader.img_nomul.prog;
+                  else
+                    prog = gc->shared->shader.img.prog;
+               }
+             else
+               prog = gc->shared->shader.img.prog;
+          }
+     }
+   
+   if ((gc->shader.cur_tex != tex->pt->texture)
+       || (gc->shader.cur_prog != prog)
+       || (gc->shader.smooth != smooth)
+       || (gc->shader.blend != blend)
+       || (gc->shader.render_op != gc->dc->render_op)
+       || (gc->shader.clip != clip)
+       || (gc->shader.cx != cx)
+       || (gc->shader.cy != cy)
+       || (gc->shader.cw != cw)
+       || (gc->shader.ch != ch)
+       )
+     {
+        shader_array_flush(gc);
+        gc->shader.cur_tex = tex->pt->texture;
+        gc->shader.cur_prog = prog;
+        gc->shader.smooth = smooth;
+        gc->shader.blend = blend;
+        gc->shader.render_op = gc->dc->render_op;
+        gc->shader.clip = clip;
+        gc->shader.cx = cx;
+        gc->shader.cy = cy;
+        gc->shader.cw = cw;
+        gc->shader.ch = ch;
+     }
+   if ((tex->im) && (tex->im->native.data))
+     {
+        if (gc->array.im != tex->im)
+          {
+             shader_array_flush(gc);
+             gc->array.im = tex->im;
+          }
+     }
+   gc->array.line = 0;
+   gc->array.use_vertex = 1;
+   gc->array.use_color = 1;
+   gc->array.use_texuv = 1;
+   gc->array.use_texuv2 = 1;
+   gc->array.use_texuv3 = 0;
+   
+   pnum = gc->array.num;
+   nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nu2 = pnum * 2;
+   nt = pnum * 4;
+   gc->array.num += 6;
+   _evas_gl_common_context_array_alloc(gc);
+
+   for (i = 0; i < 4; i++)
+     {
+        tx[i] = ((double)(tex->x) + (((double)p[i].u) / FP1)) /
+          (double)tex->pt->w;
+        ty[i] = ((double)(tex->y) + (((double)p[i].v) / FP1)) / 
+          (double)tex->pt->h;
+     }
+   if ((tex->im) && (tex->im->native.data) && (!tex->im->native.yinvert))
+     {
+        // FIXME: handle yinvert
+     }
+   
+   cmul = ARGB_JOIN(a, r, g, b);
+   for (i = 0; i < 6; i++)
+     {
+        DATA32 cl = MUL4_SYM(cmul, p[points[i]].col);
+        PUSH_VERTEX((p[points[i]].x >> FP), 
+                    (p[points[i]].y >> FP),
+                    0);
+        PUSH_TEXUV(tx[points[i]],
+                   ty[points[i]]);
+        
+        PUSH_COLOR(R_VAL(&cl),
+                   G_VAL(&cl),
+                   B_VAL(&cl),
+                   A_VAL(&cl));
+     }
+}
+
+void
+evas_gl_common_context_flush(Evas_GL_Context *gc)
+{
+   shader_array_flush(gc);
+//   fprintf(stderr, "------------FRAME: done\n");
+}
+
+static void
+shader_array_flush(Evas_GL_Context *gc)
+{
+   if (gc->array.num <= 0) return;
+
+//   fprintf(stderr, "  flush array %i\n", gc->array.num);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "<flush err>");
+   if (gc->shader.cur_prog != gc->shader.current.cur_prog)
+     {
+        glUseProgram(gc->shader.cur_prog);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+     }
+
+   if (gc->shader.cur_tex != gc->shader.current.cur_tex)
+     {
+#if 0
+        if (gc->shader.cur_tex)
+          {
+             glEnable(GL_TEXTURE_2D);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+          }
+        else
+          {
+             glDisable(GL_TEXTURE_2D);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+          }
+#endif
+        glActiveTexture(GL_TEXTURE0);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glBindTexture(GL_TEXTURE_2D, gc->shader.cur_tex);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+     }
+   if (gc->array.im)
+     {
+        if (!gc->array.im->native.loose)
+          {
+             if (gc->array.im->native.func.bind)
+               gc->array.im->native.func.bind(gc->array.im->native.func.data, 
+                                              gc->array.im);
+          }
+     }
+   if (gc->shader.render_op != gc->shader.current.render_op)
+     {
+        switch (gc->shader.render_op)
+          {
+          case EVAS_RENDER_BLEND: /**< default op: d = d*(1-sa) + s */
+             glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             break;
+          case EVAS_RENDER_COPY: /**< d = s */
+             gc->shader.blend = 0;
+             glBlendFunc(GL_ONE, GL_ONE);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             break;
+             // FIXME: fix blend funcs below!
+          case EVAS_RENDER_BLEND_REL: /**< d = d*(1 - sa) + s*da */
+          case EVAS_RENDER_COPY_REL: /**< d = s*da */
+          case EVAS_RENDER_ADD: /**< d = d + s */
+          case EVAS_RENDER_ADD_REL: /**< d = d + s*da */
+          case EVAS_RENDER_SUB: /**< d = d - s */
+          case EVAS_RENDER_SUB_REL: /**< d = d - s*da */
+          case EVAS_RENDER_TINT: /**< d = d*s + d*(1 - sa) + s*(1 - da) */
+          case EVAS_RENDER_TINT_REL: /**< d = d*(1 - sa + s) */
+          case EVAS_RENDER_MASK: /**< d = d*sa */
+          case EVAS_RENDER_MUL: /**< d = d*s */
+          default:
+             glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             break;
+          }
+     }
+   if (gc->shader.blend != gc->shader.current.blend)
+     {
+        if (gc->shader.blend)
+          {
+             glEnable(GL_BLEND);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+          }
+        else
+          {
+             glDisable(GL_BLEND);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+          }
+     }
+   if (gc->shader.smooth != gc->shader.current.smooth)
+     {
+        if (gc->shader.smooth)
+          {
+#ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
+             if (shared->info.anisotropic > 0.0)
+               {
+                  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, shared->info.anisotropic);
+                  GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+               }
+#endif
+             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+          }
+        else
+          {
+#ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
+             if (shared->info.anisotropic > 0.0)
+               {
+                  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0);
+                  GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+               }
+#endif
+             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+          }
+     }
+/* hmmm this breaks things. must find out why!   
+   if (gc->shader.clip != gc->shader.current.clip)
+     {
+        if (gc->shader.clip)
+          glEnable(GL_SCISSOR_TEST);
+        else
+          {
+             glDisable(GL_SCISSOR_TEST);
+//             glScissor(0, 0, 0, 0);
+          }
+     }
+   if (gc->shader.clip)
+     {
+        if ((gc->shader.cx != gc->shader.current.cx) ||
+            (gc->shader.cx != gc->shader.current.cx) ||
+            (gc->shader.cx != gc->shader.current.cx) ||
+            (gc->shader.cx != gc->shader.current.cx))
+          {
+             glScissor(gc->shader.cx, 
+                       gc->h - gc->shader.cy - gc->shader.ch,
+                       gc->shader.cw,
+                       gc->shader.ch);
+          }
+//                    gc->clip.x,
+//                    gc->h - gc->clip.y - gc->clip.h,
+//                    gc->clip.w,
+//                    gc->clip.h);
+        
+     }
+ */
+   glVertexAttribPointer(SHAD_VERTEX, 3, GL_SHORT, GL_FALSE, 0, gc->array.vertex);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glVertexAttribPointer(SHAD_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, gc->array.color);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   if (gc->array.use_texuv)
+     {
+        glEnableVertexAttribArray(SHAD_TEXUV);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glVertexAttribPointer(SHAD_TEXUV, 2, GL_FLOAT, GL_FALSE, 0, gc->array.texuv);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+     }
+   else
+     {
+        glDisableVertexAttribArray(SHAD_TEXUV);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+     }
+
+   if (gc->array.line)
+     {
+        glDisableVertexAttribArray(SHAD_TEXUV);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glDisableVertexAttribArray(SHAD_TEXUV2); 
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glDisableVertexAttribArray(SHAD_TEXUV3);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+        glDrawArrays(GL_LINES, 0, gc->array.num);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+     }
+   else
+     {
+        if ((gc->array.use_texuv2) && (gc->array.use_texuv3))
+          {
+             glEnableVertexAttribArray(SHAD_TEXUV2);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glEnableVertexAttribArray(SHAD_TEXUV3);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glVertexAttribPointer(SHAD_TEXUV2, 2, GL_FLOAT, GL_FALSE, 0, gc->array.texuv2);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glVertexAttribPointer(SHAD_TEXUV3, 2, GL_FLOAT, GL_FALSE, 0, gc->array.texuv3);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glActiveTexture(GL_TEXTURE1);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glBindTexture(GL_TEXTURE_2D, gc->shader.cur_texu);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glActiveTexture(GL_TEXTURE2);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glBindTexture(GL_TEXTURE_2D, gc->shader.cur_texv);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glActiveTexture(GL_TEXTURE0);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+          }
+        else if (gc->array.use_texuv2)
+          {
+             glEnableVertexAttribArray(SHAD_TEXUV2);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glVertexAttribPointer(SHAD_TEXUV2, 2, GL_FLOAT, GL_FALSE, 0, gc->array.texuv2);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+          }
+        else
+          {
+             glDisableVertexAttribArray(SHAD_TEXUV2);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+             glDisableVertexAttribArray(SHAD_TEXUV3);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+          }
+   
+        glDrawArrays(GL_TRIANGLES, 0, gc->array.num);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+     }
+   if (gc->array.im)
+     {
+        if (!gc->array.im->native.loose)
+          {
+             if (gc->array.im->native.func.unbind)
+               gc->array.im->native.func.unbind(gc->array.im->native.func.data, 
+                                                gc->array.im);
+          }
+        gc->array.im = NULL;
+     }
+
+   gc->shader.current.cur_prog = gc->shader.cur_prog;
+   gc->shader.current.cur_tex = gc->shader.cur_tex;
+   gc->shader.current.blend = gc->shader.blend;
+   gc->shader.current.smooth = gc->shader.smooth;
+   gc->shader.current.render_op = gc->shader.render_op;
+   gc->shader.current.clip = gc->shader.clip;
+   gc->shader.current.cx = gc->shader.cx;
+   gc->shader.current.cy = gc->shader.cy;
+   gc->shader.current.cw = gc->shader.cw;
+   gc->shader.current.ch = gc->shader.ch;
+   
+   if (gc->array.vertex) free(gc->array.vertex);
+   if (gc->array.color) free(gc->array.color);
+   if (gc->array.texuv) free(gc->array.texuv);
+   if (gc->array.texuv2) free(gc->array.texuv2);
+   if (gc->array.texuv3) free(gc->array.texuv3);
+   
+   gc->array.vertex = NULL;
+   gc->array.color = NULL;
+   gc->array.texuv = NULL;
+   gc->array.texuv2 = NULL;
+   gc->array.texuv3 = NULL;
+   
+   gc->array.num = 0;
+   gc->array.alloc = 0;
+}
diff --git a/src/modules/engines/gl_common/evas_gl_font.c b/src/modules/engines/gl_common/evas_gl_font.c
new file mode 100644 (file)
index 0000000..ac0edf8
--- /dev/null
@@ -0,0 +1,203 @@
+#include "evas_gl_private.h"
+
+void *
+evas_gl_font_texture_new(void *context, RGBA_Font_Glyph *fg)
+{
+   Evas_GL_Context *gc = context;
+   Evas_GL_Texture *tex;
+   DATA8 *data;
+   int w, h, j, nw;
+   DATA8 *ndata;
+   int fh;
+
+   if (fg->ext_dat) return fg->ext_dat; // FIXME: one engine at a time can do this :(
+   
+   w = fg->glyph_out->bitmap.width;
+   h = fg->glyph_out->bitmap.rows;
+   if ((w == 0) || (h == 0)) return NULL;
+
+   data = fg->glyph_out->bitmap.buffer;
+   j = fg->glyph_out->bitmap.pitch;
+   if (j < w) j = w;
+
+   nw = ((w + 3) / 4) * 4;
+   ndata = alloca(nw *h);
+   if (!ndata) return NULL;
+   if (fg->glyph_out->bitmap.num_grays == 256)
+     {
+       int x, y;
+       DATA8 *p1, *p2;
+
+       for (y = 0; y < h; y++)
+         {
+            p1 = data + (j * y);
+            p2 = ndata + (nw * y);
+            for (x = 0; x < w; x++)
+              {
+                 *p2 = *p1;
+                 p1++;
+                 p2++;
+              }
+         }
+     }
+   else if (fg->glyph_out->bitmap.num_grays == 0)
+     {
+       DATA8 *tmpbuf = NULL, *dp, *tp, bits;
+       int bi, bj, end;
+       const DATA8 bitrepl[2] = {0x0, 0xff};
+       
+       tmpbuf = alloca(w);
+       if (tmpbuf)
+         {
+            int x, y;
+            DATA8 *p1, *p2;
+            
+            for (y = 0; y < h; y++)
+              {
+                 p1 = tmpbuf;
+                 p2 = ndata + (nw * y);
+                 tp = tmpbuf;
+                 dp = data + (y * fg->glyph_out->bitmap.pitch);
+                 for (bi = 0; bi < w; bi += 8)
+                   {
+                      bits = *dp;
+                      if ((w - bi) < 8) end = w - bi;
+                      else end = 8;
+                      for (bj = 0; bj < end; bj++)
+                        {
+                           *tp = bitrepl[(bits >> (7 - bj)) & 0x1];
+                           tp++;
+                        }
+                      dp++;
+                   }
+                 for (x = 0; x < w; x++)
+                   {
+                      *p2 = *p1;
+                      p1++;
+                      p2++;
+                   }
+              }
+         }
+     }
+//   fh = h;
+   fh = fg->fi->max_h;
+   tex = evas_gl_common_texture_alpha_new(gc, ndata, w, h, fh);
+   tex->sx1 = ((double)(tex->x)) / (double)tex->pt->w;
+   tex->sy1 = ((double)(tex->y)) / (double)tex->pt->h;
+   tex->sx2 = ((double)(tex->x + tex->w)) / (double)tex->pt->w;
+   tex->sy2 = ((double)(tex->y + tex->h)) / (double)tex->pt->h;
+   return tex;
+}
+
+void
+evas_gl_font_texture_free(void *tex)
+{
+   if (!tex) return;
+   evas_gl_common_texture_free(tex);
+}
+
+void
+evas_gl_font_texture_draw(void *context, void *surface __UNUSED__, void *draw_context, RGBA_Font_Glyph *fg, int x, int y)
+{
+   Evas_GL_Context *gc = context;
+   RGBA_Draw_Context *dc = draw_context;
+   Evas_GL_Texture *tex;
+   Cutout_Rects *rects;
+   Cutout_Rect  *rct;
+   int r, g, b, a;
+   double ssx, ssy, ssw, ssh;
+   int c, cx, cy, cw, ch;
+   int i;
+   int sx, sy, sw, sh;
+   
+   if (dc != gc->dc) return;
+   tex = fg->ext_dat;
+   if (!tex) return;
+   a = (dc->col.col >> 24) & 0xff;
+   if (a == 0) return;
+   r = (dc->col.col >> 16) & 0xff;
+   g = (dc->col.col >> 8 ) & 0xff;
+   b = (dc->col.col      ) & 0xff;
+   sx = 0; sy = 0; sw = tex->w, sh = tex->h;
+   if ((!gc->dc->cutout.rects) 
+//       || (gc->dc->cutout.active > 32)
+       )
+     {
+        if (gc->dc->clip.use)
+          {
+             int nx, ny, nw, nh;
+             
+             nx = x; ny = y; nw = tex->w; nh = tex->h;
+             RECTS_CLIP_TO_RECT(nx, ny, nw, nh,
+                                gc->dc->clip.x, gc->dc->clip.y,
+                                gc->dc->clip.w, gc->dc->clip.h);
+             if ((nw < 1) || (nh < 1)) return;
+             if ((nx == x) && (ny == y) && (nw == tex->w) && (nh == tex->h))
+               {
+                  evas_gl_common_context_font_push(gc, tex,
+                                                   0.0, 0.0, 0.0, 0.0,
+//                                                   sx, sy, sw, sh,
+                                                   x, y, tex->w, tex->h,
+                                                   r, g, b, a);
+                  return;
+               }
+             ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(tex->w));
+             ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(tex->h));
+             ssw = ((double)sw * (double)(nw)) / (double)(tex->w);
+             ssh = ((double)sh * (double)(nh)) / (double)(tex->h);
+             evas_gl_common_context_font_push(gc, tex, 
+                                              ssx, ssy, ssw, ssh,
+                                              nx, ny, nw, nh,
+                                              r, g, b, a);
+          }
+        else
+          {
+             evas_gl_common_context_font_push(gc, tex, 
+                                              0.0, 0.0, 0.0, 0.0,
+//                                              sx, sy, sw, sh,
+                                              x, y, tex->w, tex->h,
+                                              r, g, b, a);
+          }
+        return;
+     }
+   /* save out clip info */
+   c = gc->dc->clip.use; cx = gc->dc->clip.x; cy = gc->dc->clip.y; cw = gc->dc->clip.w; ch = gc->dc->clip.h;
+   evas_common_draw_context_clip_clip(gc->dc, 0, 0, gc->w, gc->h);
+   evas_common_draw_context_clip_clip(gc->dc, x, y, tex->w, tex->h);
+   /* our clip is 0 size.. abort */
+   if ((gc->dc->clip.w <= 0) || (gc->dc->clip.h <= 0))
+     {
+        gc->dc->clip.use = c; gc->dc->clip.x = cx; gc->dc->clip.y = cy; gc->dc->clip.w = cw; gc->dc->clip.h = ch;
+        return;
+     }
+   rects = evas_common_draw_context_apply_cutouts(dc);
+   for (i = 0; i < rects->active; ++i)
+     {
+        int nx, ny, nw, nh;
+        
+        rct = rects->rects + i;
+        nx = x; ny = y; nw = tex->w; nh = tex->h;
+        RECTS_CLIP_TO_RECT(nx, ny, nw, nh, rct->x, rct->y, rct->w, rct->h);
+        if ((nw < 1) || (nh < 1)) continue;
+        if ((nx == x) && (ny == y) && (nw == tex->w) && (nh == tex->h))
+          {
+             evas_gl_common_context_font_push(gc, tex,
+                                              0.0, 0.0, 0.0, 0.0,
+//                                              sx, sy, sw, sh,
+                                              x, y, tex->w, tex->h,
+                                              r, g, b, a);
+             continue;
+          }
+        ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(tex->w));
+        ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(tex->h));
+        ssw = ((double)sw * (double)(nw)) / (double)(tex->w);
+        ssh = ((double)sh * (double)(nh)) / (double)(tex->h);
+        evas_gl_common_context_font_push(gc, tex, 
+                                         ssx, ssy, ssw, ssh,
+                                         nx, ny, nw, nh,
+                                         r, g, b, a);
+     }
+   evas_common_draw_context_apply_clear_cutouts(rects);
+   /* restore clip info */
+   gc->dc->clip.use = c; gc->dc->clip.x = cx; gc->dc->clip.y = cy; gc->dc->clip.w = cw; gc->dc->clip.h = ch;
+}
diff --git a/src/modules/engines/gl_common/evas_gl_image.c b/src/modules/engines/gl_common/evas_gl_image.c
new file mode 100644 (file)
index 0000000..b1ec6f1
--- /dev/null
@@ -0,0 +1,580 @@
+#include "evas_gl_private.h"
+
+void
+evas_gl_common_image_all_unload(Evas_GL_Context *gc)
+{
+   Eina_List *l;
+   Evas_GL_Image *im;
+   
+   EINA_LIST_FOREACH(gc->shared->images, l, im)
+     {
+        if (im->im) evas_cache_image_unload_data(&im->im->cache_entry);
+        if (im->tex) evas_gl_common_texture_free(im->tex);
+        im->tex = NULL;
+     }
+}
+
+Evas_GL_Image *
+evas_gl_common_image_load(Evas_GL_Context *gc, const char *file, const char *key, Evas_Image_Load_Opts *lo, int *error)
+{
+   Evas_GL_Image        *im;
+   RGBA_Image           *im_im;
+   Eina_List            *l;
+
+   im_im = evas_common_load_image_from_file(file, key, lo, error);
+   if (!im_im) return NULL;
+
+   EINA_LIST_FOREACH(gc->shared->images, l, im)
+     {
+       if (im->im == im_im)
+         {
+             evas_cache_image_drop(&im_im->cache_entry);
+            gc->shared->images = eina_list_remove_list(gc->shared->images, l);
+            gc->shared->images = eina_list_prepend(gc->shared->images, im);
+            im->references++;
+            *error = EVAS_LOAD_ERROR_NONE;
+            return im;
+         }
+     }
+
+   im = calloc(1, sizeof(Evas_GL_Image));
+   if (!im)
+     {
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       return NULL;
+     }
+   im->references = 1;
+   im->im = im_im;
+   im->gc = gc;
+   im->references = 1;
+   im->cached = 1;
+   im->cs.space = EVAS_COLORSPACE_ARGB8888;
+   im->alpha = im->im->cache_entry.flags.alpha;
+   im->w = im->im->cache_entry.w;
+   im->h = im->im->cache_entry.h;
+   if (lo) im->load_opts = *lo;
+   gc->shared->images = eina_list_prepend(gc->shared->images, im);
+   return im;
+}
+
+Evas_GL_Image *
+evas_gl_common_image_new_from_data(Evas_GL_Context *gc, int w, int h, DATA32 *data, int alpha, int cspace)
+{
+   Evas_GL_Image *im;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(gc->shared->images, l, im)
+     {
+       if (((void *)(im->im->image.data) == (void *)data) &&
+           (im->im->cache_entry.w == w) &&
+           (im->im->cache_entry.h == h))
+         {
+            gc->shared->images = eina_list_remove_list(gc->shared->images, l);
+            gc->shared->images = eina_list_prepend(gc->shared->images, im);
+            im->references++;
+            return im;
+         }
+     }
+   im = calloc(1, sizeof(Evas_GL_Image));
+   if (!im) return NULL;
+   im->references = 1;
+   im->im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(),
+                                                 w, h, data, alpha, cspace);
+   if (!im->im)
+     {
+       free(im);
+       return NULL;
+     }
+   im->gc = gc;
+   im->cs.space = cspace;
+   im->alpha = im->im->cache_entry.flags.alpha;
+   im->w = im->im->cache_entry.w;
+   im->h = im->im->cache_entry.h;
+   switch (cspace)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+        break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+        if (im->tex) evas_gl_common_texture_free(im->tex);
+       im->tex = NULL;
+       im->cs.data = data;
+       im->cs.no_free = 1;
+       break;
+      default:
+       abort();
+       break;
+     }
+   return im;
+}
+
+Evas_GL_Image *
+evas_gl_common_image_new_from_copied_data(Evas_GL_Context *gc, int w, int h, DATA32 *data, int alpha, int cspace)
+{
+   Evas_GL_Image *im;
+
+   im = calloc(1, sizeof(Evas_GL_Image));
+   if (!im) return NULL;
+   im->references = 1;
+   im->im = (RGBA_Image *) evas_cache_image_copied_data(evas_common_image_cache_get(),
+                                                        w, h, data, alpha, cspace);
+   if (!im->im)
+     {
+       free(im);
+       return NULL;
+     }
+   im->gc = gc;
+   im->cs.space = cspace;
+   im->alpha = im->im->cache_entry.flags.alpha;
+   im->w = im->im->cache_entry.w;
+   im->h = im->im->cache_entry.h;
+   switch (cspace)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+        if (im->tex) evas_gl_common_texture_free(im->tex);
+        im->tex = NULL;
+       im->cs.no_free = 0;
+        if (im->im->cache_entry.h > 0)
+          im->cs.data = calloc(1, im->im->cache_entry.h * sizeof(unsigned char *) * 2);
+        if ((data) && (im->cs.data))
+         memcpy(im->cs.data, data, im->im->cache_entry.h * sizeof(unsigned char *) * 2);
+       break;
+      default:
+       abort();
+       break;
+     }
+   return im;
+}
+
+Evas_GL_Image *
+evas_gl_common_image_new(Evas_GL_Context *gc, int w, int h, int alpha, int cspace)
+{
+   Evas_GL_Image *im;
+
+   im = calloc(1, sizeof(Evas_GL_Image));
+   if (!im) return NULL;
+   im->references = 1;
+   im->im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
+   if (!im->im)
+     {
+       free(im);
+       return NULL;
+     }
+   im->gc = gc;
+   im->im->cache_entry.flags.alpha = alpha ? 1 : 0;
+   im->cs.space = cspace;
+   im->alpha = im->im->cache_entry.flags.alpha;
+   im->im->cache_entry.w = w;
+   im->im->cache_entry.h = h;
+   im->w = im->im->cache_entry.w;
+   im->h = im->im->cache_entry.h;
+   evas_cache_image_colorspace(&im->im->cache_entry, cspace);
+   im->im = (RGBA_Image *)evas_cache_image_size_set(&im->im->cache_entry, w, h);
+   switch (cspace)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+//        if (im->tex) evas_gl_common_texture_free(im->tex);
+       im->tex = NULL;
+       im->cs.no_free = 0;
+        if (im->im->cache_entry.h > 0)
+          im->cs.data = calloc(1, im->im->cache_entry.h * sizeof(unsigned char *) * 2);
+       break;
+      default:
+       abort();
+       break;
+     }
+   return im;
+}
+
+Evas_GL_Image *
+evas_gl_common_image_alpha_set(Evas_GL_Image *im, int alpha)
+{
+   if (!im) return NULL;
+   if (im->alpha == alpha) return im;
+   im->alpha = alpha;
+   if (!im->im) return im;
+   im->im->cache_entry.flags.alpha = alpha ? 1 : 0;
+   if (im->tex)
+     {
+        evas_gl_common_texture_free(im->tex);
+        im->tex = NULL;
+     }
+   if (!im->tex)
+     im->tex = evas_gl_common_texture_new(im->gc, im->im);
+   return im;
+}
+
+void
+evas_gl_common_image_native_enable(Evas_GL_Image *im)
+{
+   if (im->cs.data)
+     {
+       if (!im->cs.no_free) free(im->cs.data);
+        im->cs.data = NULL;
+     }
+   im->cs.no_free = 0;
+   if (im->cached)
+     {
+        im->gc->shared->images = eina_list_remove(im->gc->shared->images, im);
+        im->cached = 0;
+     }
+   if (im->im)
+     {
+        evas_cache_image_drop(&im->im->cache_entry);
+        im->im = NULL;
+     }
+   if (im->tex)
+     {
+        evas_gl_common_texture_free(im->tex);
+        im->tex = NULL;
+     }
+   
+   im->cs.space = EVAS_COLORSPACE_ARGB8888;
+   im->tex = evas_gl_common_texture_native_new(im->gc, im->w, im->h, im->alpha, im);
+   im->tex_only = 1;
+}
+
+void
+evas_gl_common_image_native_disable(Evas_GL_Image *im)
+{
+   if (im->im)
+     {
+        evas_cache_image_drop(&im->im->cache_entry);
+        im->im = NULL;
+     }
+   if (im->tex)
+     {
+        evas_gl_common_texture_free(im->tex);
+        im->tex = NULL;
+     }
+   im->tex_only = 0;
+   
+   im->im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
+   im->im->cache_entry.flags.alpha = im->alpha;
+   im->cs.space = EVAS_COLORSPACE_ARGB8888;
+   evas_cache_image_colorspace(&im->im->cache_entry, im->cs.space);
+   im->im = (RGBA_Image *)evas_cache_image_size_set(&im->im->cache_entry, im->w, im->h);
+   if (!im->tex)
+     im->tex = evas_gl_common_texture_new(im->gc, im->im);
+}
+
+void
+evas_gl_common_image_free(Evas_GL_Image *im)
+{
+   im->references--;
+   if (im->references > 0) return;
+   
+   if (im->native.func.free)
+     im->native.func.free(im->native.func.data, im);
+   
+   if (im->cs.data)
+     {
+       if (!im->cs.no_free) free(im->cs.data);
+     }
+   if (im->cached) im->gc->shared->images = eina_list_remove(im->gc->shared->images, im);
+   if (im->im) evas_cache_image_drop(&im->im->cache_entry);
+   if (im->tex) evas_gl_common_texture_free(im->tex);
+   free(im);
+}
+
+Evas_GL_Image *
+evas_gl_common_image_surface_new(Evas_GL_Context *gc, int w, int h, int alpha)
+{
+   Evas_GL_Image *im;
+
+   im = calloc(1, sizeof(Evas_GL_Image));
+   if (!im) return NULL;
+   im->references = 1;
+   im->gc = gc;
+   im->cs.space = EVAS_COLORSPACE_ARGB8888;
+   im->alpha = alpha;
+   im->w = w;
+   im->h = h;
+   im->tex = evas_gl_common_texture_render_new(gc, w, h, alpha);
+   im->tex_only = 1;
+   return im;
+}
+
+void
+evas_gl_common_image_dirty(Evas_GL_Image *im, int x, int y, int w, int h)
+{
+   if ((w == 0) && (h == 0) && (x == 0) && (y == 0))
+     {
+        w = im->w;
+        h = im->h;
+     }
+   if (im->im)
+     {
+        im->im = (RGBA_Image *)evas_cache_image_dirty(&im->im->cache_entry, x, y, w, h);
+     }
+   im->dirty = 1;
+}
+
+static void
+_evas_gl_common_image_update(Evas_GL_Context *gc, Evas_GL_Image *im)
+{
+   if (!im->im) return;
+/*   
+   if ((im->cs.space == EVAS_COLORSPACE_YCBCR422P601_PL) ||
+       (im->cs.space == EVAS_COLORSPACE_YCBCR422P709_PL))
+     {
+        // SOFTWARE convert. do multi texture later
+        if ((im->cs.data) && (*((unsigned char **)im->cs.data)))
+          {
+             if (im->dirty || !im->im->image.data)
+               {
+                  free(im->im->image.data);
+                  im->im->image.data = malloc(im->im->cache_entry.w * im->im->cache_entry.h * sizeof(DATA32));
+                  if (im->im->image.data)
+                    evas_common_convert_yuv_420p_601_rgba(im->cs.data, 
+                                                          (void *)im->im->image.data,
+                                                          im->im->cache_entry.w, im->im->cache_entry.h);
+               }
+          }
+        space = EVAS_COLORSPACE_ARGB8888;
+     }
+   else
+ */
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if ((im->tex) && (im->dirty))
+          {
+             evas_cache_image_load_data(&im->im->cache_entry);
+             evas_gl_common_texture_update(im->tex, im->im);
+             evas_cache_image_unload_data(&im->im->cache_entry);
+          }
+       if (!im->tex)
+          {
+             evas_cache_image_load_data(&im->im->cache_entry);
+             im->tex = evas_gl_common_texture_new(gc, im->im);
+             evas_cache_image_unload_data(&im->im->cache_entry);
+          }
+        im->dirty = 0;
+        if (!im->tex) return;
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+        if ((im->tex) && (im->dirty))
+          {
+             evas_gl_common_texture_yuv_update(im->tex, im->cs.data,
+                                               im->im->cache_entry.w, 
+                                               im->im->cache_entry.h);
+             im->dirty = 0;
+          }
+        if ((!im->tex) && (im->cs.data) && (*((unsigned char **)im->cs.data)))
+          {
+             im->tex = evas_gl_common_texture_yuv_new(gc, im->cs.data,
+                                                      im->im->cache_entry.w, 
+                                                      im->im->cache_entry.h);
+             im->dirty = 0;
+          }
+        if (!im->tex) return;
+        break;
+      default:
+        printf("unhandled img format\n");
+       break;
+    }
+}
+
+void
+evas_gl_common_image_map4_draw(Evas_GL_Context *gc, Evas_GL_Image *im, 
+                               RGBA_Map_Point *p, int smooth, int level)
+{
+   RGBA_Draw_Context *dc;
+   int r, g, b, a;
+   int c, cx, cy, cw, ch;
+   
+   dc = gc->dc;
+   if (dc->mul.use)
+     {
+        a = (dc->mul.col >> 24) & 0xff;
+        r = (dc->mul.col >> 16) & 0xff;
+        g = (dc->mul.col >> 8 ) & 0xff;
+        b = (dc->mul.col      ) & 0xff;
+     }
+   else
+     {
+        r = g = b = a = 255;
+     }
+   
+   _evas_gl_common_image_update(gc, im);
+
+   c = gc->dc->clip.use; 
+   cx = gc->dc->clip.x; cy = gc->dc->clip.y; 
+   cw = gc->dc->clip.w; ch = gc->dc->clip.h;
+   im->tex->im = im;
+   evas_gl_common_context_image_map4_push(gc, im->tex, p, 
+                                          c, cx, cy, cw, ch, 
+                                          r, g, b, a, smooth, im->tex_only);
+}
+
+void
+evas_gl_common_image_draw(Evas_GL_Context *gc, Evas_GL_Image *im, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int smooth)
+{
+   RGBA_Draw_Context *dc;
+   int r, g, b, a;
+   double ssx, ssy, ssw, ssh;
+   Cutout_Rects *rects;
+   Cutout_Rect  *rct;
+   int c, cx, cy, cw, ch;
+   int i;
+   int yuv = 0;
+   
+   if (sw < 1) sw = 1;
+   if (sh < 1) sh = 1;
+   dc = gc->dc;
+   if (dc->mul.use)
+     {
+       a = (dc->mul.col >> 24) & 0xff;
+       r = (dc->mul.col >> 16) & 0xff;
+       g = (dc->mul.col >> 8 ) & 0xff;
+       b = (dc->mul.col      ) & 0xff;
+     }
+   else
+     {
+       r = g = b = a = 255;
+     }
+   
+   _evas_gl_common_image_update(gc, im);
+
+   if ((im->cs.space == EVAS_COLORSPACE_YCBCR422P601_PL) ||
+       (im->cs.space == EVAS_COLORSPACE_YCBCR422P709_PL))
+     yuv = 1;
+   
+   im->tex->im = im;
+   if ((!gc->dc->cutout.rects) || (gc->dc->cutout.active > 16))
+     {
+        if (gc->dc->clip.use)
+          {
+             int nx, ny, nw, nh;
+             
+             nx = dx; ny = dy; nw = dw; nh = dh;
+             RECTS_CLIP_TO_RECT(nx, ny, nw, nh, 
+                                gc->dc->clip.x, gc->dc->clip.y,
+                                gc->dc->clip.w, gc->dc->clip.h);
+             if ((nw < 1) || (nh < 1)) return;
+             if ((nx == dx) && (ny == dy) && (nw == dw) && (nh == dh))
+               {
+                  if (yuv)
+                    evas_gl_common_context_yuv_push(gc,
+                                                    im->tex,
+                                                    sx, sy, sw, sh,
+                                                    dx, dy, dw, dh,
+                                                    r, g, b, a,
+                                                    smooth);
+                  else
+                    evas_gl_common_context_image_push(gc,
+                                                      im->tex,
+                                                      sx, sy, sw, sh,
+                                                      dx, dy, dw, dh,
+                                                      r, g, b, a,
+                                                      smooth, im->tex_only);
+                  return;
+               }
+             
+             ssx = (double)sx + ((double)(sw * (nx - dx)) / (double)(dw));
+             ssy = (double)sy + ((double)(sh * (ny - dy)) / (double)(dh));
+             ssw = ((double)sw * (double)(nw)) / (double)(dw);
+             ssh = ((double)sh * (double)(nh)) / (double)(dh);
+             if (yuv)
+               evas_gl_common_context_yuv_push(gc,
+                                               im->tex,
+                                               ssx, ssy, ssw, ssh,
+                                               nx, ny, nw, nh,
+                                               r, g, b, a,
+                                               smooth);
+             else
+               evas_gl_common_context_image_push(gc,
+                                                 im->tex,
+                                                 ssx, ssy, ssw, ssh,
+                                                 nx, ny, nw, nh,
+                                                 r, g, b, a,
+                                                 smooth, im->tex_only);
+          }
+        else
+          {
+             if (yuv)
+               evas_gl_common_context_yuv_push(gc,
+                                               im->tex,
+                                               sx, sy, sw, sh,
+                                               dx, dy, dw, dh,
+                                               r, g, b, a,
+                                               smooth);
+             else
+               evas_gl_common_context_image_push(gc,
+                                                 im->tex,
+                                                 sx, sy, sw, sh,
+                                                 dx, dy, dw, dh,
+                                                 r, g, b, a,
+                                                 smooth, im->tex_only);
+          }
+        return;
+     }
+   
+   /* save out clip info */
+   c = gc->dc->clip.use; cx = gc->dc->clip.x; cy = gc->dc->clip.y; cw = gc->dc->clip.w; ch = gc->dc->clip.h;
+   evas_common_draw_context_clip_clip(gc->dc, 0, 0, gc->w, gc->h);
+   evas_common_draw_context_clip_clip(gc->dc, dx, dy, dw, dh);
+   /* our clip is 0 size.. abort */
+   if ((gc->dc->clip.w <= 0) || (gc->dc->clip.h <= 0))
+     {
+        gc->dc->clip.use = c; gc->dc->clip.x = cx; gc->dc->clip.y = cy; gc->dc->clip.w = cw; gc->dc->clip.h = ch;
+        return;
+     }
+   rects = evas_common_draw_context_apply_cutouts(dc);
+   for (i = 0; i < rects->active; ++i)
+     {
+        int nx, ny, nw, nh;
+
+        rct = rects->rects + i;
+        nx = dx; ny = dy; nw = dw; nh = dh;
+        RECTS_CLIP_TO_RECT(nx, ny, nw, nh, rct->x, rct->y, rct->w, rct->h);
+        if ((nw < 1) || (nh < 1)) continue;
+        if ((nx == dx) && (ny == dy) && (nw == dw) && (nh == dh))
+          {
+             if (yuv)
+               evas_gl_common_context_yuv_push(gc,
+                                               im->tex,
+                                               sx, sy, sw, sh,
+                                               dx, dy, dw, dh,
+                                               r, g, b, a,
+                                               smooth);
+             else
+               evas_gl_common_context_image_push(gc,
+                                                 im->tex,
+                                                 sx, sy, sw, sh,
+                                                 dx, dy, dw, dh,
+                                                 r, g, b, a,
+                                                 smooth, im->tex_only);
+             continue;
+          }
+        ssx = (double)sx + ((double)(sw * (nx - dx)) / (double)(dw));
+        ssy = (double)sy + ((double)(sh * (ny - dy)) / (double)(dh));
+        ssw = ((double)sw * (double)(nw)) / (double)(dw);
+        ssh = ((double)sh * (double)(nh)) / (double)(dh);
+        if (yuv)
+          evas_gl_common_context_yuv_push(gc,
+                                          im->tex,
+                                          ssx, ssy, ssw, ssh,
+                                          nx, ny, nw, nh,
+                                          r, g, b, a,
+                                          smooth);
+        else
+          evas_gl_common_context_image_push(gc,
+                                            im->tex,
+                                            ssx, ssy, ssw, ssh,
+                                            nx, ny, nw, nh,
+                                            r, g, b, a,
+                                            smooth, im->tex_only);
+     }
+   evas_common_draw_context_apply_clear_cutouts(rects);
+   /* restore clip info */
+   gc->dc->clip.use = c; gc->dc->clip.x = cx; gc->dc->clip.y = cy; gc->dc->clip.w = cw; gc->dc->clip.h = ch;
+}
diff --git a/src/modules/engines/gl_common/evas_gl_line.c b/src/modules/engines/gl_common/evas_gl_line.c
new file mode 100644 (file)
index 0000000..33a3187
--- /dev/null
@@ -0,0 +1,32 @@
+#include "evas_gl_private.h"
+
+void
+evas_gl_common_line_draw(Evas_GL_Context *gc, int x1, int y1, int x2, int y2)
+{
+   RGBA_Draw_Context *dc;
+   int r, g, b, a;
+   int c, cx, cy, cw, ch;
+   
+   dc = gc->dc;
+   if (dc->mul.use)
+     {
+        a = (dc->mul.col >> 24) & 0xff;
+        r = (dc->mul.col >> 16) & 0xff;
+        g = (dc->mul.col >> 8 ) & 0xff;
+        b = (dc->mul.col      ) & 0xff;
+     }
+   else
+     {
+        r = g = b = a = 255;
+     }
+
+   glFlush();
+   
+   c = gc->dc->clip.use;
+   cx = gc->dc->clip.x; cy = gc->dc->clip.y;
+   cw = gc->dc->clip.w; ch = gc->dc->clip.h;
+   
+   evas_gl_common_context_line_push(gc, x1, y1, x2, y2, 
+                                    c, cx, cy, cw, ch, 
+                                    r, g, b, a);
+}
diff --git a/src/modules/engines/gl_common/evas_gl_polygon.c b/src/modules/engines/gl_common/evas_gl_polygon.c
new file mode 100644 (file)
index 0000000..49dd902
--- /dev/null
@@ -0,0 +1,307 @@
+#include "evas_gl_private.h"
+
+// FIXME: this is a verbatim copy of the software poly renderer. it just
+// use gl to draw 1 pixel high spans like software does. this is to make
+// sure rendering correctness matches the software engine but also to save
+// time in coming up with a good triangulation algorithm. if you want to
+// feel free to turn this into a real triangulation system and use gl to its
+// fullest, but as such polygons are used so little, it's not worth it.
+
+typedef struct _RGBA_Span RGBA_Span;
+typedef struct _RGBA_Edge RGBA_Edge;
+typedef struct _RGBA_Vertex RGBA_Vertex;
+
+struct _RGBA_Span
+{
+   EINA_INLIST;
+   int x, y, w;
+};
+
+struct _RGBA_Edge
+{
+   double x, dx;
+   int i;
+};
+
+struct _RGBA_Vertex
+{
+   double x, y;
+   int i;
+};
+
+#define POLY_EDGE_DEL(_i)                                               \
+   {                                                                       \
+      int _j;                                                              \
+      \
+      for (_j = 0; (_j < num_active_edges) && (edges[_j].i != _i); _j++);  \
+      if (_j < num_active_edges)                                           \
+        {                                                                  \
+           num_active_edges--;                                             \
+           memmove(&(edges[_j]), &(edges[_j + 1]),                         \
+                      (num_active_edges - _j) * sizeof(RGBA_Edge));           \
+        }                                                                  \
+   }
+
+#define POLY_EDGE_ADD(_i, _y)                                           \
+   {                                                                       \
+      int _j;                                                              \
+      float _dx;                                                           \
+      RGBA_Vertex *_p, *_q;                                                \
+      if (_i < (n - 1)) _j = _i + 1;                                       \
+      else _j = 0;                                                         \
+      if (point[_i].y < point[_j].y)                                       \
+        {                                                                  \
+           _p = &(point[_i]);                                              \
+           _q = &(point[_j]);                                              \
+        }                                                                  \
+      else                                                                 \
+        {                                                                  \
+           _p = &(point[_j]);                                              \
+           _q = &(point[_i]);                                              \
+        }                                                                  \
+      edges[num_active_edges].dx = _dx = (_q->x - _p->x) / (_q->y - _p->y); \
+      edges[num_active_edges].x = (_dx * ((float)_y + 0.5 - _p->y)) + _p->x; \
+      edges[num_active_edges].i = _i;                                      \
+      num_active_edges++;                                                  \
+   }
+
+Evas_GL_Polygon *
+evas_gl_common_poly_point_add(Evas_GL_Polygon *poly, int x, int y)
+{
+   Evas_GL_Polygon_Point *pt;
+
+   if (!poly) poly = calloc(1, sizeof(Evas_GL_Polygon));
+   if (!poly) return NULL;
+   pt = calloc(1, sizeof(Evas_GL_Polygon_Point));
+   if (!pt) return NULL;
+   pt->x = x;
+   pt->y = y;
+   poly->points = eina_list_append(poly->points, pt);
+   poly->changed = 1;
+   return poly;
+}
+
+Evas_GL_Polygon *
+evas_gl_common_poly_points_clear(Evas_GL_Polygon *poly)
+{
+   if (!poly) return NULL;
+   while (poly->points)
+     {
+       Evas_GL_Polygon_Point *pt;
+
+       pt = poly->points->data;
+       poly->points = eina_list_remove(poly->points, pt);
+       free(pt);
+     }
+   free(poly);
+   return NULL;
+}
+
+static int
+polygon_point_sorter(const void *a, const void *b)
+{
+   RGBA_Vertex *p, *q;
+   
+   p = (RGBA_Vertex *)a;
+   q = (RGBA_Vertex *)b;
+   if (p->y <= q->y) return -1;
+   return 1;
+}
+
+static int
+polygon_edge_sorter(const void *a, const void *b)
+{
+   RGBA_Edge *p, *q;
+   
+   p = (RGBA_Edge *)a;
+   q = (RGBA_Edge *)b;
+   if (p->x <= q->x) return -1;
+   return 1;
+}
+
+void
+evas_gl_common_poly_draw(Evas_GL_Context *gc, Evas_GL_Polygon *poly, int dx, int dy)
+{
+   Cutout_Rects *rects;
+   Cutout_Rect  *r;
+   int c, cx, cy, cw, ch, cr, cg, cb, ca, i;
+   int x, y, w, h;
+
+   Eina_List *l;
+   int n, k, num_active_edges, y0, y1, *sorted_index, j;
+   RGBA_Edge *edges;
+   RGBA_Vertex *point;
+   Evas_GL_Polygon_Point *pt;
+   Eina_Inlist *spans;
+   
+   /* save out clip info */
+   c = gc->dc->clip.use; cx = gc->dc->clip.x; cy = gc->dc->clip.y; cw = gc->dc->clip.w; ch = gc->dc->clip.h;
+
+   ca = (gc->dc->col.col >> 24) & 0xff;
+   if (ca <= 0) return;
+   cr = (gc->dc->col.col >> 16) & 0xff;
+   cg = (gc->dc->col.col >> 8 ) & 0xff;
+   cb = (gc->dc->col.col      ) & 0xff;
+   
+   n = eina_list_count(poly->points);
+   if (n < 3) return;
+   edges = malloc(sizeof(RGBA_Edge) * n);
+   if (!edges) return;
+   point = malloc(sizeof(RGBA_Vertex) * n);
+   if (!point)
+     {
+        free(edges);
+        return;
+     }
+   sorted_index = malloc(sizeof(int) * n);
+   if (!sorted_index)
+     {
+        free(edges);
+        free(point);
+        return;
+     }
+   
+   k = 0;
+   EINA_LIST_FOREACH(poly->points, l, pt)
+     {
+        point[k].x = pt->x + dx;
+        point[k].y = pt->y + dy;
+        point[k].i = k;
+        k++;
+     }
+   qsort(point, n, sizeof(RGBA_Vertex), polygon_point_sorter);
+   for (k = 0; k < n; k++) sorted_index[k] = point[k].i;
+   k = 0;
+
+   EINA_LIST_FOREACH(poly->points, l, pt)
+     {
+        point[k].x = pt->x + dx;
+        point[k].y = pt->y + dy;
+        point[k].i = k;
+        k++;
+     }
+   
+   y0 = MAX(cy, ceil(point[sorted_index[0]].y - 0.5));
+   y1 = MIN(cy + ch - 1, floor(point[sorted_index[n - 1]].y - 0.5));
+   
+   k = 0;
+   num_active_edges = 0;
+   spans = NULL;
+   
+   for (y = y0; y <= y1; y++)
+     {
+        for (; (k < n) && (point[sorted_index[k]].y <= ((double)y + 0.5)); k++)
+          {
+             i = sorted_index[k];
+             
+             if (i > 0) j = i - 1;
+             else j = n - 1;
+             if (point[j].y <= ((double)y - 0.5))
+               {
+                  POLY_EDGE_DEL(j)
+               }
+             else if (point[j].y > ((double)y + 0.5))
+               {
+                  POLY_EDGE_ADD(j, y)
+               }
+             if (i < (n - 1)) j = i + 1;
+             else j = 0;
+             if (point[j].y <= ((double)y - 0.5))
+               {
+                  POLY_EDGE_DEL(i)
+               }
+             else if (point[j].y > ((double)y + 0.5))
+               {
+                  POLY_EDGE_ADD(i, y)
+               }
+          }
+        
+        qsort(edges, num_active_edges, sizeof(RGBA_Edge), polygon_edge_sorter);
+        
+        for (j = 0; j < num_active_edges; j += 2)
+          {
+             int x0, x1;
+             
+             x0 = ceil(edges[j].x - 0.5);
+             if (j < (num_active_edges - 1))
+               x1 = floor(edges[j + 1].x - 0.5);
+             else
+               x1 = x0;
+             if ((x1 >= cx) && (x0 < (cx + cw)) && (x0 <= x1))
+               {
+                  RGBA_Span *span;
+                  
+                  if (x0 < cx) x0 = cx;
+                  if (x1 >= (cx + cw)) x1 = cx + cw - 1;
+                  span = malloc(sizeof(RGBA_Span));
+                  spans = eina_inlist_append(spans, EINA_INLIST_GET(span));
+                  span->y = y;
+                  span->x = x0;
+                  span->w = (x1 - x0) + 1;
+               }
+             edges[j].x += edges[j].dx;
+             edges[j + 1].x += edges[j + 1].dx;
+          }
+     }
+   
+   free(edges);
+   free(point);
+   free(sorted_index);
+   
+   evas_common_draw_context_clip_clip(gc->dc, 0, 0, gc->w, gc->h);
+   
+   if (spans)
+     {
+        RGBA_Span *span;
+
+        /* no cutouts - cut right to the chase */
+        if (!gc->dc->cutout.rects)
+          {
+             EINA_INLIST_FOREACH(spans, span)
+               {
+                  x = span->x;
+                  y = span->y;
+                  w = span->w;
+                  h = 1;
+                  evas_gl_common_context_rectangle_push(gc, x, y, w, h, cr, cg, cb, ca);
+               }
+          }
+        else
+          {
+             evas_common_draw_context_clip_clip(gc->dc, x, y, w, h);
+             /* our clip is 0 size.. abort */
+             if ((gc->dc->clip.w > 0) && (gc->dc->clip.h > 0))
+               {
+                  rects = evas_common_draw_context_apply_cutouts(gc->dc);
+                  for (i = 0; i < rects->active; ++i)
+                    {
+                       r = rects->rects + i;
+                       if ((r->w > 0) && (r->h > 0))
+                         {
+                            EINA_INLIST_FOREACH(spans, span)
+                              {
+                                 x = span->x;
+                                 y = span->y;
+                                 w = span->w;
+                                 h = 1;
+                                 RECTS_CLIP_TO_RECT(x, y, w, h, r->x, r->y, r->w, r->h);
+                                 if ((w > 0) && (h > 0))
+                                   evas_gl_common_context_rectangle_push(gc, x, y, w, h, cr, cg, cb, ca);
+                              }
+                         }
+                    }
+                  evas_common_draw_context_apply_clear_cutouts(rects);
+               }
+          }
+        while (spans)
+          {
+             span = (RGBA_Span *)spans;
+             spans = eina_inlist_remove(spans, spans);
+             free(span);
+          }    
+     }       
+   
+   /* restore clip info */
+   gc->dc->clip.use = c; gc->dc->clip.x = cx; gc->dc->clip.y = cy; gc->dc->clip.w = cw; gc->dc->clip.h = ch;
+
+}
diff --git a/src/modules/engines/gl_common/evas_gl_private.h b/src/modules/engines/gl_common/evas_gl_private.h
new file mode 100644 (file)
index 0000000..a7d6378
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef _EVAS_GL_PRIVATE_H
+#define _EVAS_GL_PRIVATE_H
+#include "evas_gl_common.h"
+
+#include <dlfcn.h>      /* dlopen,dlclose,etc */
+
+#endif
diff --git a/src/modules/engines/gl_common/evas_gl_rectangle.c b/src/modules/engines/gl_common/evas_gl_rectangle.c
new file mode 100644 (file)
index 0000000..a5cbece
--- /dev/null
@@ -0,0 +1,53 @@
+#include "evas_gl_private.h"
+
+void
+evas_gl_common_rect_draw(Evas_GL_Context *gc, int x, int y, int w, int h)
+{
+   Cutout_Rects *rects;
+   Cutout_Rect  *r;
+   int          c, cx, cy, cw, ch, cr, cg, cb, ca, i;
+   
+   if ((w <= 0) || (h <= 0)) return;
+   if (!(RECTS_INTERSECT(x, y, w, h, 0, 0, gc->w, gc->h))) return;
+   /* save out clip info */
+   c = gc->dc->clip.use; cx = gc->dc->clip.x; cy = gc->dc->clip.y; cw = gc->dc->clip.w; ch = gc->dc->clip.h;
+   
+   ca = (gc->dc->col.col >> 24) & 0xff;
+   if ((gc->dc->render_op != EVAS_RENDER_COPY) && (ca <= 0)) return;
+   cr = (gc->dc->col.col >> 16) & 0xff;
+   cg = (gc->dc->col.col >> 8 ) & 0xff;
+   cb = (gc->dc->col.col      ) & 0xff;
+   evas_common_draw_context_clip_clip(gc->dc, 0, 0, gc->w, gc->h);
+   /* no cutouts - cut right to the chase */
+   if ((gc->dc) && (gc->dc->clip.use))
+     {
+        RECTS_CLIP_TO_RECT(x, y, w, h,
+                           gc->dc->clip.x, gc->dc->clip.y,
+                           gc->dc->clip.w, gc->dc->clip.h);
+     }
+   
+   if (!gc->dc->cutout.rects)
+     {
+        evas_gl_common_context_rectangle_push(gc, x, y, w, h, cr, cg, cb, ca);
+     }
+   else
+     {
+        evas_common_draw_context_clip_clip(gc->dc, x, y, w, h);
+        /* our clip is 0 size.. abort */
+        if ((gc->dc->clip.w > 0) && (gc->dc->clip.h > 0))
+          {
+             rects = evas_common_draw_context_apply_cutouts(gc->dc);
+             for (i = 0; i < rects->active; ++i)
+               {
+                  r = rects->rects + i;
+                  if ((r->w > 0) && (r->h > 0))
+                    {
+                       evas_gl_common_context_rectangle_push(gc, r->x, r->y, r->w, r->h, cr, cg, cb, ca);
+                    }
+               }
+             evas_common_draw_context_apply_clear_cutouts(rects);
+          }
+     }
+   /* restore clip info */
+   gc->dc->clip.use = c; gc->dc->clip.x = cx; gc->dc->clip.y = cy; gc->dc->clip.w = cw; gc->dc->clip.h = ch;
+}
diff --git a/src/modules/engines/gl_common/evas_gl_shader.c b/src/modules/engines/gl_common/evas_gl_shader.c
new file mode 100644 (file)
index 0000000..a2043bf
--- /dev/null
@@ -0,0 +1,503 @@
+#include "evas_gl_private.h"
+
+/////////////////////////////////////////////
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int rect_frag_bin[] =
+{
+# include "shader/rect_frag_bin_s3c6410.h"
+};
+#endif
+
+const char rect_frag_glsl[] =
+#include "shader/rect_frag.h"
+  ;
+Evas_GL_Program_Source shader_rect_frag_src =
+{
+   rect_frag_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     rect_frag_bin, sizeof(rect_frag_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int rect_vert_bin[] =
+{
+# include "shader/rect_vert_bin_s3c6410.h"
+};
+#endif
+const char rect_vert_glsl[] =
+#include "shader/rect_vert.h"
+  ;
+Evas_GL_Program_Source shader_rect_vert_src =
+{
+   rect_vert_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     rect_vert_bin, sizeof(rect_vert_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+/////////////////////////////////////////////
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int font_frag_bin[] =
+{
+# include "shader/font_frag_bin_s3c6410.h"
+};
+#endif
+
+const char font_frag_glsl[] =
+#include "shader/font_frag.h"
+  ;
+Evas_GL_Program_Source shader_font_frag_src =
+{
+   font_frag_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     font_frag_bin, sizeof(font_frag_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int font_vert_bin[] =
+{
+# include "shader/font_vert_bin_s3c6410.h"
+};
+#endif
+const char font_vert_glsl[] =
+#include "shader/font_vert.h"
+  ;
+Evas_GL_Program_Source shader_font_vert_src =
+{
+   font_vert_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     font_vert_bin, sizeof(font_vert_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+/////////////////////////////////////////////
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int yuv_frag_bin[] =
+{
+# include "shader/yuv_frag_bin_s3c6410.h"
+};
+#endif
+
+const char yuv_frag_glsl[] =
+#include "shader/yuv_frag.h"
+  ;
+Evas_GL_Program_Source shader_yuv_frag_src =
+{
+   yuv_frag_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     yuv_frag_bin, sizeof(yuv_frag_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int yuv_vert_bin[] =
+{
+# include "shader/yuv_vert_bin_s3c6410.h"
+};
+#endif
+const char yuv_vert_glsl[] =
+#include "shader/yuv_vert.h"
+  ;
+Evas_GL_Program_Source shader_yuv_vert_src =
+{
+   yuv_vert_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     yuv_vert_bin, sizeof(yuv_vert_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+/////////////////////////////////////////////
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int yuv_nomul_frag_bin[] =
+{
+# include "shader/yuv_nomul_frag_bin_s3c6410.h"
+};
+#endif
+
+const char yuv_nomul_frag_glsl[] =
+#include "shader/yuv_nomul_frag.h"
+  ;
+Evas_GL_Program_Source shader_yuv_nomul_frag_src =
+{
+   yuv_nomul_frag_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     yuv_nomul_frag_bin, sizeof(yuv_nomul_frag_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int yuv_nomul_vert_bin[] =
+{
+# include "shader/yuv_nomul_vert_bin_s3c6410.h"
+};
+#endif
+const char yuv_nomul_vert_glsl[] =
+#include "shader/yuv_nomul_vert.h"
+  ;
+Evas_GL_Program_Source shader_yuv_nomul_vert_src =
+{
+   yuv_nomul_vert_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     yuv_nomul_vert_bin, sizeof(yuv_nomul_vert_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+/////////////////////////////////////////////
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int tex_frag_bin[] =
+{
+# include "shader/tex_frag_bin_s3c6410.h"
+};
+#endif
+
+const char tex_frag_glsl[] =
+#include "shader/tex_frag.h"
+  ;
+Evas_GL_Program_Source shader_tex_frag_src =
+{
+   tex_frag_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     tex_frag_bin, sizeof(tex_frag_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int tex_vert_bin[] =
+{
+# include "shader/tex_vert_bin_s3c6410.h"
+};
+#endif
+const char tex_vert_glsl[] =
+#include "shader/tex_vert.h"
+  ;
+Evas_GL_Program_Source shader_tex_vert_src =
+{
+   tex_vert_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     tex_vert_bin, sizeof(tex_vert_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+/////////////////////////////////////////////
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int tex_nomul_frag_bin[] =
+{
+# include "shader/tex_nomul_frag_bin_s3c6410.h"
+};
+#endif
+
+const char tex_nomul_frag_glsl[] =
+#include "shader/tex_nomul_frag.h"
+  ;
+Evas_GL_Program_Source shader_tex_nomul_frag_src =
+{
+   tex_nomul_frag_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     tex_nomul_frag_bin, sizeof(tex_nomul_frag_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int tex_nomul_vert_bin[] =
+{
+# include "shader/tex_nomul_vert_bin_s3c6410.h"
+};
+#endif
+const char tex_nomul_vert_glsl[] =
+#include "shader/tex_nomul_vert.h"
+  ;
+Evas_GL_Program_Source shader_tex_nomul_vert_src =
+{
+   tex_nomul_vert_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     tex_nomul_vert_bin, sizeof(tex_nomul_vert_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+/////////////////////////////////////////////
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int img_frag_bin[] =
+{
+# include "shader/img_frag_bin_s3c6410.h"
+};
+#endif
+
+const char img_frag_glsl[] =
+#include "shader/img_frag.h"
+  ;
+Evas_GL_Program_Source shader_img_frag_src =
+{
+   img_frag_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     img_frag_bin, sizeof(img_frag_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int img_vert_bin[] =
+{
+# include "shader/img_vert_bin_s3c6410.h"
+};
+#endif
+const char img_vert_glsl[] =
+#include "shader/img_vert.h"
+  ;
+Evas_GL_Program_Source shader_img_vert_src =
+{
+   img_vert_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     img_vert_bin, sizeof(img_vert_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+/////////////////////////////////////////////
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int img_nomul_frag_bin[] =
+{
+# include "shader/img_nomul_frag_bin_s3c6410.h"
+};
+#endif
+
+const char img_nomul_frag_glsl[] =
+#include "shader/img_nomul_frag.h"
+  ;
+Evas_GL_Program_Source shader_img_nomul_frag_src =
+{
+   img_nomul_frag_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     img_nomul_frag_bin, sizeof(img_nomul_frag_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int img_nomul_vert_bin[] =
+{
+# include "shader/img_nomul_vert_bin_s3c6410.h"
+};
+#endif
+const char img_nomul_vert_glsl[] =
+#include "shader/img_nomul_vert.h"
+  ;
+Evas_GL_Program_Source shader_img_nomul_vert_src =
+{
+   img_nomul_vert_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     img_nomul_vert_bin, sizeof(img_nomul_vert_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+/////////////////////////////////////////////
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int img_bgra_frag_bin[] =
+{
+# include "shader/img_bgra_frag_bin_s3c6410.h"
+};
+#endif
+
+const char img_bgra_frag_glsl[] =
+#include "shader/img_bgra_frag.h"
+  ;
+Evas_GL_Program_Source shader_img_bgra_frag_src =
+{
+   img_bgra_frag_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     img_bgra_frag_bin, sizeof(img_bgra_frag_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int img_bgra_vert_bin[] =
+{
+# include "shader/img_bgra_vert_bin_s3c6410.h"
+};
+#endif
+const char img_bgra_vert_glsl[] =
+#include "shader/img_bgra_vert.h"
+  ;
+Evas_GL_Program_Source shader_img_bgra_vert_src =
+{
+   img_bgra_vert_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     img_bgra_vert_bin, sizeof(img_bgra_vert_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+/////////////////////////////////////////////
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int img_bgra_nomul_frag_bin[] =
+{
+# include "shader/img_bgra_nomul_frag_bin_s3c6410.h"
+};
+#endif
+
+const char img_bgra_nomul_frag_glsl[] =
+#include "shader/img_bgra_nomul_frag.h"
+  ;
+Evas_GL_Program_Source shader_img_bgra_nomul_frag_src =
+{
+   img_bgra_nomul_frag_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     img_bgra_nomul_frag_bin, sizeof(img_bgra_nomul_frag_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+#if defined (GLES_VARIETY_S3C6410)
+const unsigned int img_bgra_nomul_vert_bin[] =
+{
+# include "shader/img_bgra_nomul_vert_bin_s3c6410.h"
+};
+#endif
+const char img_bgra_nomul_vert_glsl[] =
+#include "shader/img_bgra_nomul_vert.h"
+  ;
+Evas_GL_Program_Source shader_img_bgra_nomul_vert_src =
+{
+   img_bgra_nomul_vert_glsl,
+#if defined (GLES_VARIETY_S3C6410)
+     img_bgra_nomul_vert_bin, sizeof(img_bgra_nomul_vert_bin)
+#else     
+     NULL, 0
+#endif     
+};
+
+/////////////////////////////////////////////
+static void
+gl_compile_link_error(GLuint target, const char *action)
+{
+   int loglen = 0, chars = 0;
+   char *logtxt;
+   
+   glGetProgramiv(target, GL_INFO_LOG_LENGTH, &loglen);
+   if (loglen > 0)
+     {
+        logtxt = calloc(loglen, sizeof(char));
+        if (logtxt)
+          {
+             glGetProgramInfoLog(target, loglen, &chars, logtxt);
+             printf("Failed to %s: %s\n", action, logtxt);
+             free(logtxt);
+          }
+     }
+}
+
+int
+evas_gl_common_shader_program_init(Evas_GL_Program *p, 
+                                   Evas_GL_Program_Source *vert,
+                                   Evas_GL_Program_Source *frag,
+                                   const char *name)
+{
+   GLint ok;
+
+   p->vert = glCreateShader(GL_VERTEX_SHADER);
+   p->frag = glCreateShader(GL_FRAGMENT_SHADER);
+#if defined (GLES_VARIETY_S3C6410)
+   glShaderBinary(1, &(p->vert), 0, vert->bin, vert->bin_size);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glShaderBinary(1, &(p->frag), 0, frag->bin, frag->bin_size);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+#else 
+   glShaderSource(p->vert, 1,
+                  (const char **)&(vert->src), NULL);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glCompileShader(p->vert);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glGetShaderiv(p->vert, GL_COMPILE_STATUS, &ok);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   if (!ok)
+     {
+        gl_compile_link_error(p->vert, "compile vertex shader");
+        printf("Abort compile of shader vert (%s):\n%s\n", name, vert->src);
+        return 0;
+     }
+   glShaderSource(p->frag, 1,
+                  (const char **)&(frag->src), NULL);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glCompileShader(p->frag);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glGetShaderiv(p->frag, GL_COMPILE_STATUS, &ok);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   if (!ok)
+     {
+        gl_compile_link_error(p->frag, "compile fragment shader");
+        printf("Abort compile of shader frag (%s):\n%s\n", name, frag->src);
+        return 0;
+     }
+#endif
+   p->prog = glCreateProgram();
+   glAttachShader(p->prog, p->vert);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glAttachShader(p->prog, p->frag);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   
+   glBindAttribLocation(p->prog, SHAD_VERTEX, "vertex");
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glBindAttribLocation(p->prog, SHAD_COLOR,  "color");
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glBindAttribLocation(p->prog, SHAD_TEXUV,  "tex_coord");
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glBindAttribLocation(p->prog, SHAD_TEXUV2, "tex_coord2");
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glBindAttribLocation(p->prog, SHAD_TEXUV3, "tex_coord3");
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   
+   glLinkProgram(p->prog);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glGetProgramiv(p->prog, GL_LINK_STATUS, &ok);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   if (!ok)
+     {
+        gl_compile_link_error(p->prog, "link fragment and vertex shaders");
+        printf("Abort compile of shader frag (%s):\n%s\n", name, frag->src);
+        printf("Abort compile of shader vert (%s):\n%s\n", name, vert->src);
+        return 0;
+     }
+   return 1;
+}
+
+void
+evas_gl_common_shader_program_shutdown(Evas_GL_Program *p)
+{
+   glDeleteShader(p->vert);
+   glDeleteShader(p->frag);
+   glDeleteProgram(p->prog);
+}
diff --git a/src/modules/engines/gl_common/evas_gl_texture.c b/src/modules/engines/gl_common/evas_gl_texture.c
new file mode 100644 (file)
index 0000000..c26ab24
--- /dev/null
@@ -0,0 +1,788 @@
+#include "evas_gl_private.h"
+
+static const GLenum rgba_fmt   = GL_RGBA;
+static const GLenum rgba_ifmt  = GL_RGBA;
+//#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+//static const GLenum rgb_fmt    = GL_RGBA;
+//static const GLenum rgb_ifmt   = GL_RGBA;
+//#else
+static const GLenum rgb_fmt    = GL_RGBA;
+static const GLenum rgb_ifmt   = GL_RGB;
+//#endif
+#ifdef GL_BGRA
+static const GLenum bgra_fmt   = GL_BGRA;
+static const GLenum bgra_ifmt  = GL_RGBA;
+static const GLenum bgr_fmt    = GL_BGRA;
+static const GLenum bgr_ifmt   = GL_RGB;
+#endif
+static const GLenum alpha_fmt  = GL_ALPHA;
+static const GLenum alpha_ifmt = GL_ALPHA;
+static const GLenum lum_fmt    = GL_LUMINANCE;
+static const GLenum lum_ifmt   = GL_LUMINANCE;
+
+static int
+_nearest_pow2(int num)
+{
+   unsigned int n = num - 1;
+   n |= n >> 1;
+   n |= n >> 2;
+   n |= n >> 4;
+   n |= n >> 8;
+   n |= n >> 16;
+   return n + 1;
+}
+
+static void
+_tex_adjust(Evas_GL_Context *gc, int *w, int *h)
+{
+   unsigned int n;
+   
+   if (gc->shared->info.tex_npo2) return;
+   /*if (gc->shared->info.tex_rect) return;*/
+   *w = _nearest_pow2(*w);
+   *h = _nearest_pow2(*h);
+}
+
+static int
+_tex_round_slot(Evas_GL_Context *gc, int h)
+{
+   if (!gc->shared->info.tex_npo2)
+     h = _nearest_pow2(h);
+   return (h + 15) >> 4;
+}
+
+static int
+_tex_format_index(GLuint format)
+{
+   switch (format)
+     {
+     case GL_RGBA:
+#ifdef GL_BGRA
+     case GL_BGRA:
+#endif        
+        return 0;
+     case GL_RGB:
+        return 1;
+     case GL_ALPHA:
+        return 2;
+     case GL_LUMINANCE:
+        return 3;
+     default:
+        return 0;
+     }
+   return 0;
+}
+
+static void
+_tex_2d(int intfmt, int w, int h, int fmt, int type)
+{
+   glTexImage2D(GL_TEXTURE_2D, 0, intfmt, w, h, 0, fmt, type, NULL);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+}
+
+static void
+_tex_sub_2d(int x, int y, int w, int h, int fmt, int type, const void *pix)
+{
+   glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, fmt, type, pix);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+}
+
+static Evas_GL_Texture_Pool *
+_pool_tex_new(Evas_GL_Context *gc, int w, int h, int intformat, int format)
+{
+   Evas_GL_Texture_Pool *pt;
+   
+   pt = calloc(1, sizeof(Evas_GL_Texture_Pool));
+   if (!pt) return NULL;
+   h = _tex_round_slot(gc, h) << 4;
+   _tex_adjust(gc, &w, &h);
+   pt->gc = gc;
+   pt->w = w;
+   pt->h = h;
+   pt->intformat = intformat;
+   pt->format = format;
+   pt->dataformat = GL_UNSIGNED_BYTE;
+   pt->references = 0;
+   glGenTextures(1, &(pt->texture));
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glBindTexture(GL_TEXTURE_2D, pt->texture);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   _tex_2d(pt->intformat, w, h, pt->format, pt->dataformat);
+   glBindTexture(GL_TEXTURE_2D, gc->shader.cur_tex);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   return pt;
+}
+
+static int
+_pool_tex_alloc(Evas_GL_Texture_Pool *pt, int w, int h, int *u, int *v, Eina_List **l_after)
+{
+   Eina_List *l;
+   Evas_GL_Texture *tex, *tex2;
+   int nx, d, b;
+
+   if (pt->allocations)
+     {
+        tex = pt->allocations->data;
+        // if firest tex is not at left edge...
+        if (tex->x > (0 + 1))
+          {
+             if ((tex->x - 1) >= w)
+               {
+                  *u = 0;
+                  *v = 0;
+                  *l_after = NULL;
+                  return 1;
+               }
+          }
+     }
+   EINA_LIST_FOREACH(pt->allocations, l, tex)
+     {
+        b = tex->x + tex->w + 2;
+        if (l->next)
+          {
+             tex2 = l->next->data;
+             nx = tex2->x - 1;
+          }
+        else
+          nx = pt->w - 1;
+        d = nx - b;
+        if (d >= w)
+          {
+             *u = b;
+             *v = 0;
+             *l_after = l;
+             return 1;
+          }
+     }
+   *l_after = NULL;
+   return 0;
+}
+
+static Evas_GL_Texture_Pool *
+_pool_tex_find(Evas_GL_Context *gc, int w, int h, 
+               int intformat, int format, int *u, int *v, 
+               Eina_List **l_after, int atlas_w)
+{
+   Evas_GL_Texture_Pool *pt = NULL;
+   Eina_List *l;
+   int th, th2;
+   
+   if ((w > 512) || (h > 512))
+     {
+        pt = _pool_tex_new(gc, w, h, intformat, format);
+        gc->shared->tex.whole = eina_list_prepend(gc->shared->tex.whole, pt);
+        pt->slot = -1;
+        pt->fslot = -1;
+        pt->whole = 1;
+        *u = 0;
+        *v = 0;
+        *l_after = NULL;
+        return pt;
+     }
+   
+   th = _tex_round_slot(gc, h);
+   th2 = _tex_format_index(intformat);
+   EINA_LIST_FOREACH(gc->shared->tex.atlas[th][th2], l, pt)
+     {
+        if (_pool_tex_alloc(pt, w, h, u, v, l_after))
+          {
+             gc->shared->tex.atlas[th][th2] = 
+               eina_list_remove_list(gc->shared->tex.atlas[th][th2], l);
+             gc->shared->tex.atlas[th][th2] = 
+               eina_list_prepend(gc->shared->tex.atlas[th][th2], pt);
+             return pt;
+          }
+     }
+   pt = _pool_tex_new(gc, atlas_w, h, intformat, format);
+   gc->shared->tex.atlas[th][th2] = 
+     eina_list_prepend(gc->shared->tex.atlas[th][th2], pt);
+   pt->slot = th;
+   pt->fslot = th2;
+   *u = 0;
+   *v = 0;
+   *l_after = NULL;
+   return pt;
+}
+
+Evas_GL_Texture *
+evas_gl_common_texture_new(Evas_GL_Context *gc, RGBA_Image *im)
+{
+   Evas_GL_Texture *tex;
+   Eina_List *l_after = NULL;
+   int u = 0, v = 0;
+
+   tex = calloc(1, sizeof(Evas_GL_Texture));
+   if (!tex) return NULL;
+   
+   tex->gc = gc;
+   tex->references = 1;
+
+   if (im->cache_entry.flags.alpha)
+     {
+        if (gc->shared->info.bgra)
+          tex->pt = _pool_tex_find(gc, im->cache_entry.w + 2,
+                                   im->cache_entry.h + 1, bgra_ifmt, bgra_fmt, 
+                                   &u, &v, &l_after, 1024);
+        else
+          tex->pt = _pool_tex_find(gc, im->cache_entry.w + 2,
+                                   im->cache_entry.h + 1, rgba_ifmt, rgba_fmt, 
+                                   &u, &v, &l_after, 1024);
+        tex->alpha = 1;
+     }
+   else
+     {
+        if (gc->shared->info.bgra)
+          tex->pt = _pool_tex_find(gc, im->cache_entry.w + 3, 
+                                 im->cache_entry.h + 1, bgr_ifmt, bgr_fmt,
+                                 &u, &v, &l_after, 1024);
+        else
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+          tex->pt = _pool_tex_find(gc, im->cache_entry.w + 3, 
+                                 im->cache_entry.h + 1, rgba_ifmt, rgba_fmt,
+                                 &u, &v, &l_after, 1024);
+#else
+          tex->pt = _pool_tex_find(gc, im->cache_entry.w + 3, 
+                                 im->cache_entry.h + 1, rgb_ifmt, rgb_fmt,
+                                 &u, &v, &l_after, 1024);
+#endif
+     }
+   if (!tex->pt)
+     {
+        memset(tex, 0x11, sizeof(Evas_GL_Texture)); // mark as freed
+        free(tex);
+        return NULL;
+     }
+   tex->x = u + 1;
+   tex->y = v;
+   tex->w = im->cache_entry.w;
+   tex->h = im->cache_entry.h;
+   if (l_after)
+     tex->pt->allocations = 
+     eina_list_append_relative_list(tex->pt->allocations, tex, l_after);
+   else
+     tex->pt->allocations = 
+     eina_list_prepend(tex->pt->allocations, tex);
+   tex->pt->references++;
+   evas_gl_common_texture_update(tex, im);
+   return tex;
+}
+
+static Evas_GL_Texture_Pool *
+_pool_tex_render_new(Evas_GL_Context *gc, int w, int h, int intformat, int format)
+{
+   Evas_GL_Texture_Pool *pt;
+   
+   pt = calloc(1, sizeof(Evas_GL_Texture_Pool));
+   if (!pt) return NULL;
+   h = _tex_round_slot(gc, h) << 4;
+   _tex_adjust(gc, &w, &h);
+   pt->gc = gc;
+   pt->w = w;
+   pt->h = h;
+   pt->intformat = intformat;
+   pt->format = format;
+   pt->dataformat = GL_UNSIGNED_BYTE;
+   pt->render = 1;
+   pt->references = 0;
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+# ifndef GL_FRAMEBUFFER
+#  define GL_FRAMEBUFFER GL_FRAMEBUFFER_OES
+# endif
+# ifndef GL_COLOR_ATTACHMENT0
+#  define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_OES
+# endif
+#else
+# ifndef GL_FRAMEBUFFER
+#  define GL_FRAMEBUFFER GL_FRAMEBUFFER_EXT
+# endif
+# ifndef GL_COLOR_ATTACHMENT0
+#  define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT
+# endif
+#endif  
+   glGenTextures(1, &(pt->texture));
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glBindTexture(GL_TEXTURE_2D, pt->texture);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   _tex_2d(pt->intformat, w, h, pt->format, pt->dataformat);
+   
+   glsym_glGenFramebuffers(1, &(pt->fb));
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glsym_glBindFramebuffer(GL_FRAMEBUFFER, pt->fb);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glsym_glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, pt->texture, 0);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glsym_glBindFramebuffer(GL_FRAMEBUFFER, 0);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   
+   glBindTexture(GL_TEXTURE_2D, gc->shader.cur_tex);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   return pt;
+}
+
+static Evas_GL_Texture_Pool *
+_pool_tex_native_new(Evas_GL_Context *gc, int w, int h, int intformat, int format, Evas_GL_Image *im)
+{
+   Evas_GL_Texture_Pool *pt;
+   
+   pt = calloc(1, sizeof(Evas_GL_Texture_Pool));
+   if (!pt) return NULL;
+   pt->gc = gc;
+#ifdef GL_TEXTURE_RECTANGLE_ARB   
+   if (im->native.target == GL_TEXTURE_RECTANGLE_ARB)
+     {
+        printf("REEEEEEEEECT\n");
+     }
+   else
+#endif     
+     {
+        // FIXME: handle po2 only textures
+        pt->w = w;
+        pt->h = h;
+     }
+   pt->intformat = intformat;
+   pt->format = format;
+   pt->dataformat = GL_UNSIGNED_BYTE;
+   pt->references = 0;
+   pt->native = 1;
+   glGenTextures(1, &(pt->texture));
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glBindTexture(im->native.target, pt->texture);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+#else
+   if (im->native.loose)
+     {
+        if (im->native.func.bind)
+          im->native.func.bind(im->native.func.data, im);
+     }
+#endif
+   
+   glTexParameteri(im->native.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glTexParameteri(im->native.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glTexParameteri(im->native.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glTexParameteri(im->native.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glBindTexture(im->native.target, 0);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glBindTexture(im->native.target, gc->shader.cur_tex);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   return pt;
+}
+
+static void
+pt_unref(Evas_GL_Texture_Pool *pt)
+{
+   pt->references--;
+   if (pt->references != 0) return;
+   if (!((pt->render) || (pt->native)))
+     {
+        if (pt->whole)
+          pt->gc->shared->tex.whole = eina_list_remove(pt->gc->shared->tex.whole, pt);
+        else
+          pt->gc->shared->tex.atlas [pt->slot][pt->fslot] =
+          eina_list_remove(pt->gc->shared->tex.atlas[pt->slot][pt->fslot], pt);
+     }
+   
+   glDeleteTextures(1, &(pt->texture));
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   if (pt->fb)
+     {
+        glsym_glDeleteFramebuffers(1, &(pt->fb));
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+     }
+   memset(pt, 0x22, sizeof(Evas_GL_Texture_Pool)); // mark as freed
+   free(pt);
+}
+
+Evas_GL_Texture *
+evas_gl_common_texture_native_new(Evas_GL_Context *gc, int w, int h, int alpha, Evas_GL_Image *im)
+{
+   Evas_GL_Texture *tex;
+   Eina_List *l_after = NULL;
+   int u = 0, v = 0;
+
+   tex = calloc(1, sizeof(Evas_GL_Texture));
+   if (!tex) return NULL;
+   
+   tex->gc = gc;
+   tex->references = 1;
+   tex->alpha = alpha;
+   if (alpha)
+     {
+        if (gc->shared->info.bgra)
+          tex->pt = _pool_tex_native_new(gc, w, h, rgba_ifmt, rgba_fmt, im);
+        else
+          tex->pt = _pool_tex_native_new(gc, w, h, rgba_ifmt, rgba_fmt, im);
+     }
+   else
+     {
+        if (gc->shared->info.bgra)
+          tex->pt = _pool_tex_native_new(gc, w, h, rgb_ifmt, rgb_fmt, im);
+        else
+          tex->pt = _pool_tex_native_new(gc, w, h, rgb_ifmt, rgb_fmt, im);
+     }
+   if (!tex->pt)
+     {
+        memset(tex, 0x33, sizeof(Evas_GL_Texture)); // mark as freed
+        free(tex);
+        return NULL;
+     }
+   tex->x = 0;
+   tex->y = 0;
+   tex->w = w;
+   tex->h = h;
+   tex->pt->references++;
+   return tex;
+}
+
+Evas_GL_Texture *
+evas_gl_common_texture_render_new(Evas_GL_Context *gc, int w, int h, int alpha)
+{
+   Evas_GL_Texture *tex;
+   Eina_List *l_after = NULL;
+   int u = 0, v = 0;
+
+   tex = calloc(1, sizeof(Evas_GL_Texture));
+   if (!tex) return NULL;
+   
+   tex->gc = gc;
+   tex->references = 1;
+   tex->alpha = alpha;
+   if (alpha)
+     {
+        if (gc->shared->info.bgra)
+          tex->pt = _pool_tex_render_new(gc, w, h, rgba_ifmt, rgba_fmt);
+        else
+          tex->pt = _pool_tex_render_new(gc, w, h, rgba_ifmt, rgba_fmt);
+     }
+   else
+     {
+        if (gc->shared->info.bgra)
+          tex->pt = _pool_tex_render_new(gc, w, h, rgb_ifmt, rgb_fmt);
+        else
+          tex->pt = _pool_tex_render_new(gc, w, h, rgb_ifmt, rgb_fmt);
+     }
+   if (!tex->pt)
+     {
+        memset(tex, 0x44, sizeof(Evas_GL_Texture)); // mark as freed
+        free(tex);
+        return NULL;
+     }
+   tex->x = 0;
+   tex->y = 0;
+   tex->w = w;
+   tex->h = h;
+   tex->pt->references++;
+   return tex;
+}
+
+void
+evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
+{
+   GLuint fmt;
+   
+   if (tex->alpha != im->cache_entry.flags.alpha)
+     {
+        tex->pt->allocations = eina_list_remove(tex->pt->allocations, tex);
+        pt_unref(tex->pt);
+        tex->alpha = im->cache_entry.flags.alpha;
+        if (tex->alpha)
+          {
+             if (tex->gc->shared->info.bgra)
+               tex->pt = _pool_tex_render_new(tex->gc, tex->w, tex->h, bgra_ifmt, bgra_fmt);
+             else
+               tex->pt = _pool_tex_render_new(tex->gc, tex->w, tex->h, rgba_ifmt, rgba_fmt);
+          }
+        else
+          {
+             if (tex->gc->shared->info.bgra)
+               tex->pt = _pool_tex_render_new(tex->gc, tex->w, tex->h, bgr_ifmt, bgr_fmt);
+             else
+               tex->pt = _pool_tex_render_new(tex->gc, tex->w, tex->h, rgb_ifmt, rgb_fmt);
+          }
+     }
+   if (!tex->pt) return;
+   fmt = tex->pt->format;
+   glBindTexture(GL_TEXTURE_2D, tex->pt->texture);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+#ifdef GL_UNPACK_ROW_LENGTH   
+   glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+#endif   
+   glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+   //  +-+
+   //  +-+
+   // 
+   _tex_sub_2d(tex->x, tex->y, 
+               im->cache_entry.w, im->cache_entry.h,
+               fmt, tex->pt->dataformat,
+               im->image.data);
+   // |xxx
+   // |xxx
+   // 
+   _tex_sub_2d(tex->x - 1, tex->y, 
+               1, im->cache_entry.h,
+               fmt, tex->pt->dataformat,
+               im->image.data);
+   //  xxx|
+   //  xxx|
+   // 
+   _tex_sub_2d(tex->x + im->cache_entry.w, tex->y, 
+               1, im->cache_entry.h,
+               fmt, tex->pt->dataformat,
+               im->image.data + (im->cache_entry.w - 1));
+   //  xxx
+   //  xxx
+   //  ---
+   _tex_sub_2d(tex->x, tex->y + im->cache_entry.h,
+               im->cache_entry.w, 1,
+               fmt, tex->pt->dataformat,
+               im->image.data + ((im->cache_entry.h - 1) * im->cache_entry.w));
+   //  xxx
+   //  xxx
+   // o
+   _tex_sub_2d(tex->x - 1, tex->y + im->cache_entry.h,
+               1, 1,
+               fmt, tex->pt->dataformat,
+               im->image.data + ((im->cache_entry.h - 1) * im->cache_entry.w));
+   //  xxx
+   //  xxx
+   //     o
+   _tex_sub_2d(tex->x + im->cache_entry.w, tex->y + im->cache_entry.h,
+               1, 1,
+               fmt, tex->pt->dataformat,
+               im->image.data + ((im->cache_entry.h - 1) * im->cache_entry.w) + (im->cache_entry.w - 1));
+   if (tex->pt->texture != tex->gc->shader.cur_tex)
+     {
+        glBindTexture(GL_TEXTURE_2D, tex->gc->shader.cur_tex);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+     }
+}
+
+void
+evas_gl_common_texture_free(Evas_GL_Texture *tex)
+{
+   if (!tex) return;
+   tex->references--;
+   if (tex->references != 0) return;
+   if (tex->pt)
+     {
+//        printf("tex->pt = %p\n", tex->pt);
+//        printf("tex->pt->references = %i\n", tex->pt->references);
+        tex->pt->allocations = eina_list_remove(tex->pt->allocations, tex);
+        pt_unref(tex->pt);
+     }
+   if (tex->ptu) pt_unref(tex->ptu);
+   if (tex->ptv) pt_unref(tex->ptv);
+   memset(tex, 0x55, sizeof(Evas_GL_Texture)); // mark as freed
+   free(tex);
+}
+
+Evas_GL_Texture *
+evas_gl_common_texture_alpha_new(Evas_GL_Context *gc, DATA8 *pixels, 
+                                 int w, int h, int fh)
+{
+   Evas_GL_Texture *tex;
+   Eina_List *l_after = NULL;
+   int u = 0, v = 0;
+   int tw = 4096;
+
+   tex = calloc(1, sizeof(Evas_GL_Texture));
+   if (!tex) return NULL;
+   
+   tex->gc = gc;
+   tex->references = 1;
+   if (tw > gc->shared->info.max_texture_size)
+     tw = gc->shared->info.max_texture_size;
+   tex->pt = _pool_tex_find(gc, w + 3, fh, alpha_ifmt, alpha_fmt, &u, &v, 
+                            &l_after, tw);
+   if (!tex->pt)
+     {
+        memset(tex, 0x66, sizeof(Evas_GL_Texture)); // mark as freed
+        free(tex);
+        return NULL;
+     }
+   tex->x = u + 1;
+   tex->y = v;
+   tex->w = w;
+   tex->h = h;
+   if (l_after)
+     tex->pt->allocations = 
+     eina_list_append_relative_list(tex->pt->allocations, tex, l_after);
+   else
+     tex->pt->allocations = eina_list_prepend(tex->pt->allocations, tex);
+   tex->pt->references++;
+   evas_gl_common_texture_alpha_update(tex, pixels, w, h, fh);
+   return tex;
+}
+
+void
+evas_gl_common_texture_alpha_update(Evas_GL_Texture *tex, DATA8 *pixels, 
+                                    int w, int h, int fh)
+{
+   if (!tex->pt) return;
+   glBindTexture(GL_TEXTURE_2D, tex->pt->texture);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+#ifdef GL_UNPACK_ROW_LENGTH   
+   glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+#endif   
+   glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   _tex_sub_2d(tex->x, tex->y, w, h, tex->pt->format, tex->pt->dataformat, 
+               pixels);
+   if (tex->pt->texture != tex->gc->shader.cur_tex)
+     {
+        glBindTexture(GL_TEXTURE_2D, tex->gc->shader.cur_tex);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+     }
+}
+
+Evas_GL_Texture *
+evas_gl_common_texture_yuv_new(Evas_GL_Context *gc, DATA8 **rows, int w, int h)
+{
+   Evas_GL_Texture *tex;
+   Eina_List *l_after = NULL;
+   int u = 0, v = 0;
+
+   tex = calloc(1, sizeof(Evas_GL_Texture));
+   if (!tex) return NULL;
+   
+   tex->gc = gc;
+   tex->references = 1;
+   tex->pt = _pool_tex_new(gc, w + 1, h  + 1, lum_ifmt, lum_fmt);
+   if (!tex->pt)
+     {
+        memset(tex, 0x77, sizeof(Evas_GL_Texture)); // mark as freed
+        free(tex);
+        return NULL;
+     }
+   gc->shared->tex.whole = eina_list_prepend(gc->shared->tex.whole, tex->pt);
+   tex->pt->slot = -1;
+   tex->pt->fslot = -1;
+   tex->pt->whole = 1;
+   tex->ptu = _pool_tex_new(gc, (w / 2) + 1, (h / 2)  + 1, lum_ifmt, lum_fmt);
+   if (!tex->ptu)
+     {
+        pt_unref(tex->pt);
+        memset(tex, 0x88, sizeof(Evas_GL_Texture)); // mark as freed
+        free(tex);
+        return NULL;
+     }
+   gc->shared->tex.whole = eina_list_prepend(gc->shared->tex.whole, tex->ptu);
+   tex->ptu->slot = -1;
+   tex->ptu->fslot = -1;
+   tex->ptu->whole = 1;
+   tex->ptv = _pool_tex_new(gc, (w / 2) + 1, (h / 2)  + 1, lum_ifmt, lum_fmt);
+   if (!tex->ptv)
+     {
+        pt_unref(tex->pt);
+        pt_unref(tex->ptu);
+        memset(tex, 0x99, sizeof(Evas_GL_Texture)); // mark as freed
+        free(tex);
+        return NULL;
+     }
+   gc->shared->tex.whole = eina_list_prepend(gc->shared->tex.whole, tex->ptv);
+   tex->ptv->slot = -1;
+   tex->ptv->fslot = -1;
+   tex->ptv->whole = 1;
+   tex->x = 0;
+   tex->y = 0;
+   tex->w = w;
+   tex->h = h;
+   tex->pt->allocations = eina_list_prepend(tex->pt->allocations, tex);
+   tex->ptu->allocations = eina_list_prepend(tex->ptu->allocations, tex);
+   tex->ptv->allocations = eina_list_prepend(tex->ptv->allocations, tex);
+   tex->pt->references++;
+   tex->ptu->references++;
+   tex->ptv->references++;
+   evas_gl_common_texture_yuv_update(tex, rows, w, h);
+   return tex;
+}
+
+void
+evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, int w, int h)
+{
+   int y;
+
+   if (!tex->pt) return;
+   // FIXME: works on lowest size 4 pixel high buffers. must also be multiple of 2
+#ifdef GL_UNPACK_ROW_LENGTH
+   glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[1] - rows[0]);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glBindTexture(GL_TEXTURE_2D, tex->pt->texture);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   _tex_sub_2d(0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]);
+   glBindTexture(GL_TEXTURE_2D, tex->ptu->texture);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[h + 1] - rows[h]);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   _tex_sub_2d(0, 0, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat, rows[h]);
+   glBindTexture(GL_TEXTURE_2D, tex->ptv->texture);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[h + (h / 2) + 1] - rows[h + (h / 2)]);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   _tex_sub_2d(0, 0, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat, rows[h + (h / 2)]);
+#else
+   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   glBindTexture(GL_TEXTURE_2D, tex->pt->texture);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   if ((rows[1] - rows[0]) == w)
+     _tex_sub_2d(0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]);
+   else
+     {
+        for (y = 0; y < h; y++)
+          _tex_sub_2d(0, y, w, 1, tex->pt->format, tex->pt->dataformat, rows[y]);
+     }
+
+   glBindTexture(GL_TEXTURE_2D, tex->ptu->texture);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   if ((rows[h + 1] - rows[h]) == (w / 2))
+     _tex_sub_2d(0, 0, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat, rows[h]);
+   else
+     {
+        for (y = 0; y < (h / 2); y++)
+          _tex_sub_2d(0, y, w / 2, 1, tex->ptu->format, tex->ptu->dataformat, rows[h + y]);
+     }
+   
+   glBindTexture(GL_TEXTURE_2D, tex->ptv->texture);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   if ((rows[h + (h / 2) + 1] - rows[h + (h / 2)]) == (w / 2))
+     _tex_sub_2d(0, 0, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat, rows[h + (h / 2)]);
+   else
+     {
+        for (y = 0; y < (h / 2); y++)
+          _tex_sub_2d(0, y, w / 2, 1, tex->ptv->format, tex->ptv->dataformat, rows[h + (h / 2) + y]);
+     }
+#endif   
+   if (tex->pt->texture != tex->gc->shader.cur_tex)
+     {
+        glBindTexture(GL_TEXTURE_2D, tex->gc->shader.cur_tex);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+     }
+}
diff --git a/src/modules/engines/gl_common/shader/compile-s3c6410.sh b/src/modules/engines/gl_common/shader/compile-s3c6410.sh
new file mode 100755 (executable)
index 0000000..924096b
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/sh
+ORIONEXE=/home/raster/Data/orion/orion.exe
+OPTS="-O --nolodcalc -lp"
+
+function compile()
+{
+  F=$1
+
+  make-c-str.sh $F"_frag.shd" > $F"_frag.h"
+  if test -f $F"_frag_s3c6410.asm"; then
+    wine $ORIONEXE -a $OPTS -f $F"_frag_s3c6410.asm"
+    make-c-bin.sh $F"_frag_s3c6410.bin" > $F"_frag_bin_s3c6410.h"
+    rm -f   $F"_frag_s3c6410.bin"   $F"_frag_s3c6410.h"
+  else
+    wine $ORIONEXE $OPTS -f $F"_frag.shd"
+    make-c-bin.sh $F"_frag.shd.bin" > $F"_frag_bin_s3c6410.h"
+    rm -f   $F"_frag.shd.bin"   $F"_frag.shd.asm"   $F"_frag.shd.h"
+  fi
+
+  make-c-str.sh $F"_vert.shd" > $F"_vert.h"
+  if test -f $F"_vert_s3c6410.asm"; then
+    wine $ORIONEXE -a $OPTS -v $F"_vert_s3c6410.asm"
+    make-c-bin.sh $F"_vert_s3c6410.bin" > $F"_vert_bin_s3c6410.h"
+    rm -f   $F"_vert_s3c6410.bin"   $F"_vert_s3c6410.h"
+  else
+    wine $ORIONEXE $OPTS -v $F"_vert.shd"
+    make-c-bin.sh $F"_vert.shd.bin" > $F"_vert_bin_s3c6410.h"
+    rm -f   $F"_vert.shd.bin"   $F"_vert.shd.asm"   $F"_vert.shd.h"
+  fi
+}
+
+compile rect
+compile font
+compile img
+compile img_nomul
+compile img_bgra
+compile img_bgra_nomul
+compile yuv
+compile yuv_nomul
+compile tex
+compile tex_nomul
diff --git a/src/modules/engines/gl_common/shader/compile-sgx.sh b/src/modules/engines/gl_common/shader/compile-sgx.sh
new file mode 100755 (executable)
index 0000000..ff7f28d
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/bash
+function compile()
+{
+  F=$1
+
+  make-c-str.sh $F"_frag.shd" > $F"_frag.h"
+  make-c-str.sh $F"_vert.shd" > $F"_vert.h"
+}
+
+compile rect
+compile font
+compile img
+compile img_nomul
+compile img_bgra
+compile img_bgra_nomul
+compile yuv
+compile yuv_nomul
+compile tex
+compile tex_nomul
diff --git a/src/modules/engines/gl_common/shader/font_frag.h b/src/modules/engines/gl_common/shader/font_frag.h
new file mode 100644 (file)
index 0000000..afe2222
--- /dev/null
@@ -0,0 +1,10 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"uniform sampler2D tex;\n"
+"varying vec4 col;\n"
+"varying vec2 tex_c;\n"
+"void main()\n"
+"{\n"
+"   gl_FragColor = texture2D(tex, tex_c.xy).aaaa * col;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/font_frag.shd b/src/modules/engines/gl_common/shader/font_frag.shd
new file mode 100644 (file)
index 0000000..cae4293
--- /dev/null
@@ -0,0 +1,10 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+uniform sampler2D tex;
+varying vec4 col;
+varying vec2 tex_c;
+void main()
+{
+   gl_FragColor = texture2D(tex, tex_c.xy).aaaa * col;
+}
diff --git a/src/modules/engines/gl_common/shader/font_frag_bin_s3c6410.h b/src/modules/engines/gl_common/shader/font_frag_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..daca692
--- /dev/null
@@ -0,0 +1,9 @@
+0x20205350, 0xffff0008, 0x00000048, 0x01020000, 0x00000003, 0x00000000, 
+0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000001, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000e, 0x00000000, 
+0x00000000, 0x0000e407, 0x307820e4, 0x00000000, 0x01000000, 0x0100e400, 
+0x237a10ff, 0x00000000, 0x00000000, 0x00000000, 0x1e000000, 0x00000000, 
+0x00000004, 0x00000003, 0x00000009, 0x00000000, 0x00000004, 0x00000008, 
+0x00000005, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 
+0x0000000f, 0x00030005, 0x00000000, 0x00786574, 0x006c6f63, 0x5f786574, 
+0x00000063, 
\ No newline at end of file
diff --git a/src/modules/engines/gl_common/shader/font_frag_s3c6410.asm b/src/modules/engines/gl_common/shader/font_frag_s3c6410.asm
new file mode 100644 (file)
index 0000000..4ed116f
--- /dev/null
@@ -0,0 +1,26 @@
+#-------------------------------------------------
+# ORION - OpenGL ES 2.0 Shading Language Compiler
+# SAMSUNG INDIA SOFTWARE OPERATIONS PVT. LTD.
+# Compiler Version      : v04.00.09
+# Release Date          : 19.01.2009
+# FIMG VERSION      : FIMGv1.5
+# Optimizer Options :  -O --nolodcalc
+#-------------------------------------------------
+
+# hand optimised - removed useless ops
+
+ps_3_0
+
+fimg_version    0x01020000
+
+dcl_s2_tex      s0
+dcl_f4_col      v1.x
+dcl_f2_tex_c    v0.x
+
+label start
+label main_
+texld r0.xyzw, v0.xyzw, s0      # tex=s0
+mul_sat oColor.xyzw, r0.wwww, v1.xyzw   # gl_FragColor=oColor.xyzw, col=v1.xyzw
+label main_end
+ret
+# 4 instructions, 4 C regs, 1 R regs
diff --git a/src/modules/engines/gl_common/shader/font_vert.h b/src/modules/engines/gl_common/shader/font_vert.h
new file mode 100644 (file)
index 0000000..ef035c8
--- /dev/null
@@ -0,0 +1,15 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"attribute vec4 vertex;\n"
+"attribute vec4 color;\n"
+"attribute vec2 tex_coord;\n"
+"uniform mat4 mvp;\n"
+"varying vec4 col;\n"
+"varying vec2 tex_c;\n"
+"void main()\n"
+"{\n"
+"   gl_Position = mvp * vertex;\n"
+"   col = color;\n"
+"   tex_c = tex_coord;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/font_vert.shd b/src/modules/engines/gl_common/shader/font_vert.shd
new file mode 100644 (file)
index 0000000..cf98501
--- /dev/null
@@ -0,0 +1,15 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+attribute vec4 vertex;
+attribute vec4 color;
+attribute vec2 tex_coord;
+uniform mat4 mvp;
+varying vec4 col;
+varying vec2 tex_c;
+void main()
+{
+   gl_Position = mvp * vertex;
+   col = color;
+   tex_c = tex_coord;
+}
diff --git a/src/modules/engines/gl_common/shader/font_vert_bin_s3c6410.h b/src/modules/engines/gl_common/shader/font_vert_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..1402448
--- /dev/null
@@ -0,0 +1,20 @@
+0x20205356, 0xffff0008, 0x00000048, 0x01020000, 0x00000007, 0x00000006, 
+0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000001, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000031, 0x00000000, 
+0x00000000, 0x02020000, 0x237820e4, 0x00000000, 0x00e40100, 0x02035500, 
+0x2ef820e4, 0x00000000, 0x00e40100, 0x0204aa00, 0x2ef820e4, 0x00000000, 
+0x00e40100, 0x0205ff00, 0x2ef800e4, 0x00000000, 0x00000000, 0x00010000, 
+0x20f801e4, 0x00000000, 0x00000000, 0x00020000, 0x20980254, 0x00000000, 
+0x00000000, 0x00000000, 0x1e000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000006, 
+0x00000009, 0x00000000, 0x00000000, 0x00000013, 0x00000005, 0x00000009, 
+0x00000000, 0x00000004, 0x00000019, 0x00000009, 0x00000003, 0x00000000, 
+0x00000008, 0x00000000, 0x0000000b, 0x00000009, 0x00010004, 0x00000000, 
+0x00000027, 0x00000003, 0x00000009, 0x00010004, 0x00000004, 0x0000002b, 
+0x00000005, 0x00000003, 0x00010004, 0x00000008, 0x00000023, 0x00000003, 
+0x0000000e, 0x00020001, 0x00000008, 0x505f6c67, 0x7469736f, 0x006e6f69, 
+0x74726576, 0x63007865, 0x726f6c6f, 0x78657400, 0x6f6f635f, 0x6d006472, 
+0x63007076, 0x74006c6f, 0x635f7865, 0x00000000, 
\ No newline at end of file
diff --git a/src/modules/engines/gl_common/shader/img_bgra_frag.h b/src/modules/engines/gl_common/shader/img_bgra_frag.h
new file mode 100644 (file)
index 0000000..29449f2
--- /dev/null
@@ -0,0 +1,10 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"uniform sampler2D tex;\n"
+"varying vec4 col;\n"
+"varying vec2 tex_c;\n"
+"void main()\n"
+"{\n"
+"   gl_FragColor = texture2D(tex, tex_c.xy) * col;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/img_bgra_frag.shd b/src/modules/engines/gl_common/shader/img_bgra_frag.shd
new file mode 100644 (file)
index 0000000..eb65760
--- /dev/null
@@ -0,0 +1,10 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+uniform sampler2D tex;
+varying vec4 col;
+varying vec2 tex_c;
+void main()
+{
+   gl_FragColor = texture2D(tex, tex_c.xy) * col;
+}
diff --git a/src/modules/engines/gl_common/shader/img_bgra_frag_bin_s3c6410.h b/src/modules/engines/gl_common/shader/img_bgra_frag_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..feb5bf5
--- /dev/null
@@ -0,0 +1,11 @@
+0x20205350, 0xffff0008, 0x00000048, 0x01020000, 0x00000004, 0x00000003, 
+0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000001, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000e, 0x00000000, 
+0x00000000, 0x02025400, 0x23782050, 0x00000000, 0x00000000, 0x0100e407, 
+0x307820e4, 0x00000000, 0x01000000, 0x0100e400, 0x237a10e4, 0x00000000, 
+0x00000000, 0x00000000, 0x1e000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 
+0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000003, 
+0x00000009, 0x00000000, 0x00000004, 0x00000008, 0x00000005, 0x00000003, 
+0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x0000000f, 0x00030005, 
+0x00000000, 0x00786574, 0x006c6f63, 0x5f786574, 0x00000063, 
diff --git a/src/modules/engines/gl_common/shader/img_bgra_nomul_frag.h b/src/modules/engines/gl_common/shader/img_bgra_nomul_frag.h
new file mode 100644 (file)
index 0000000..d8a6338
--- /dev/null
@@ -0,0 +1,9 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"uniform sampler2D tex;\n"
+"varying vec2 tex_c;\n"
+"void main()\n"
+"{\n"
+"   gl_FragColor = texture2D(tex, tex_c.xy);\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/img_bgra_nomul_frag.shd b/src/modules/engines/gl_common/shader/img_bgra_nomul_frag.shd
new file mode 100644 (file)
index 0000000..3f2ec6f
--- /dev/null
@@ -0,0 +1,9 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+uniform sampler2D tex;
+varying vec2 tex_c;
+void main()
+{
+   gl_FragColor = texture2D(tex, tex_c.xy);
+}
diff --git a/src/modules/engines/gl_common/shader/img_bgra_nomul_frag_bin_s3c6410.h b/src/modules/engines/gl_common/shader/img_bgra_nomul_frag_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..b89eeb1
--- /dev/null
@@ -0,0 +1,10 @@
+0x20205350, 0xffff0008, 0x00000048, 0x01020000, 0x00000003, 0x00000003, 
+0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000a, 0x00000000, 
+0x00000000, 0x02025400, 0x23782050, 0x00000000, 0x00000000, 0x0100e407, 
+0x307a10e4, 0x00000000, 0x00000000, 0x00000000, 0x1e000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x3f800000, 
+0x3f800000, 0x3f800000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000004, 0x00000005, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 
+0x00000003, 0x0000000f, 0x00030005, 0x00000000, 0x00786574, 0x5f786574, 
+0x00000063, 
\ No newline at end of file
diff --git a/src/modules/engines/gl_common/shader/img_bgra_nomul_vert.h b/src/modules/engines/gl_common/shader/img_bgra_nomul_vert.h
new file mode 100644 (file)
index 0000000..3a44f1a
--- /dev/null
@@ -0,0 +1,12 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"attribute vec4 vertex;\n"
+"attribute vec2 tex_coord;\n"
+"uniform mat4 mvp;\n"
+"varying vec2 tex_c;\n"
+"void main()\n"
+"{\n"
+"   gl_Position = mvp * vertex;\n"
+"   tex_c = tex_coord;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/img_bgra_nomul_vert.shd b/src/modules/engines/gl_common/shader/img_bgra_nomul_vert.shd
new file mode 100644 (file)
index 0000000..f4489b3
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+attribute vec4 vertex;
+attribute vec2 tex_coord;
+uniform mat4 mvp;
+varying vec2 tex_c;
+void main()
+{
+   gl_Position = mvp * vertex;
+   tex_c = tex_coord;
+}
diff --git a/src/modules/engines/gl_common/shader/img_bgra_nomul_vert_bin_s3c6410.h b/src/modules/engines/gl_common/shader/img_bgra_nomul_vert_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..314b5f3
--- /dev/null
@@ -0,0 +1,17 @@
+0x20205356, 0xffff0008, 0x00000048, 0x01020000, 0x00000006, 0x00000006, 
+0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x00000001, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000027, 0x00000000, 
+0x00000000, 0x02020000, 0x237820e4, 0x00000000, 0x00e40100, 0x02035500, 
+0x2ef820e4, 0x00000000, 0x00e40100, 0x0204aa00, 0x2ef820e4, 0x00000000, 
+0x00e40100, 0x0205ff00, 0x2ef800e4, 0x00000000, 0x00000000, 0x00010000, 
+0x20980154, 0x00000000, 0x00000000, 0x00000000, 0x1e000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x3f800000, 
+0x3f800000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x0000000c, 0x00000006, 0x00000009, 0x00000000, 0x00000000, 0x00000013, 
+0x00000009, 0x00000003, 0x00000000, 0x00000004, 0x00000000, 0x0000000b, 
+0x00000009, 0x00010004, 0x00000000, 0x00000021, 0x00000005, 0x00000003, 
+0x00010004, 0x00000004, 0x0000001d, 0x00000003, 0x0000000e, 0x00020001, 
+0x00000008, 0x505f6c67, 0x7469736f, 0x006e6f69, 0x74726576, 0x74007865, 
+0x635f7865, 0x64726f6f, 0x70766d00, 0x78657400, 0x0000635f, 
diff --git a/src/modules/engines/gl_common/shader/img_bgra_vert.h b/src/modules/engines/gl_common/shader/img_bgra_vert.h
new file mode 100644 (file)
index 0000000..ef035c8
--- /dev/null
@@ -0,0 +1,15 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"attribute vec4 vertex;\n"
+"attribute vec4 color;\n"
+"attribute vec2 tex_coord;\n"
+"uniform mat4 mvp;\n"
+"varying vec4 col;\n"
+"varying vec2 tex_c;\n"
+"void main()\n"
+"{\n"
+"   gl_Position = mvp * vertex;\n"
+"   col = color;\n"
+"   tex_c = tex_coord;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/img_bgra_vert.shd b/src/modules/engines/gl_common/shader/img_bgra_vert.shd
new file mode 100644 (file)
index 0000000..cf98501
--- /dev/null
@@ -0,0 +1,15 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+attribute vec4 vertex;
+attribute vec4 color;
+attribute vec2 tex_coord;
+uniform mat4 mvp;
+varying vec4 col;
+varying vec2 tex_c;
+void main()
+{
+   gl_Position = mvp * vertex;
+   col = color;
+   tex_c = tex_coord;
+}
diff --git a/src/modules/engines/gl_common/shader/img_bgra_vert_bin_s3c6410.h b/src/modules/engines/gl_common/shader/img_bgra_vert_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..1402448
--- /dev/null
@@ -0,0 +1,20 @@
+0x20205356, 0xffff0008, 0x00000048, 0x01020000, 0x00000007, 0x00000006, 
+0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000001, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000031, 0x00000000, 
+0x00000000, 0x02020000, 0x237820e4, 0x00000000, 0x00e40100, 0x02035500, 
+0x2ef820e4, 0x00000000, 0x00e40100, 0x0204aa00, 0x2ef820e4, 0x00000000, 
+0x00e40100, 0x0205ff00, 0x2ef800e4, 0x00000000, 0x00000000, 0x00010000, 
+0x20f801e4, 0x00000000, 0x00000000, 0x00020000, 0x20980254, 0x00000000, 
+0x00000000, 0x00000000, 0x1e000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000006, 
+0x00000009, 0x00000000, 0x00000000, 0x00000013, 0x00000005, 0x00000009, 
+0x00000000, 0x00000004, 0x00000019, 0x00000009, 0x00000003, 0x00000000, 
+0x00000008, 0x00000000, 0x0000000b, 0x00000009, 0x00010004, 0x00000000, 
+0x00000027, 0x00000003, 0x00000009, 0x00010004, 0x00000004, 0x0000002b, 
+0x00000005, 0x00000003, 0x00010004, 0x00000008, 0x00000023, 0x00000003, 
+0x0000000e, 0x00020001, 0x00000008, 0x505f6c67, 0x7469736f, 0x006e6f69, 
+0x74726576, 0x63007865, 0x726f6c6f, 0x78657400, 0x6f6f635f, 0x6d006472, 
+0x63007076, 0x74006c6f, 0x635f7865, 0x00000000, 
\ No newline at end of file
diff --git a/src/modules/engines/gl_common/shader/img_frag.h b/src/modules/engines/gl_common/shader/img_frag.h
new file mode 100644 (file)
index 0000000..e665c30
--- /dev/null
@@ -0,0 +1,10 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"uniform sampler2D tex;\n"
+"varying vec4 col;\n"
+"varying vec2 tex_c;\n"
+"void main()\n"
+"{\n"
+"   gl_FragColor = texture2D(tex, tex_c.xy).bgra * col;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/img_frag.shd b/src/modules/engines/gl_common/shader/img_frag.shd
new file mode 100644 (file)
index 0000000..ce3b517
--- /dev/null
@@ -0,0 +1,10 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+uniform sampler2D tex;
+varying vec4 col;
+varying vec2 tex_c;
+void main()
+{
+   gl_FragColor = texture2D(tex, tex_c.xy).bgra * col;
+}
diff --git a/src/modules/engines/gl_common/shader/img_frag_bin_s3c6410.h b/src/modules/engines/gl_common/shader/img_frag_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..3518e8d
--- /dev/null
@@ -0,0 +1,9 @@
+0x20205350, 0xffff0008, 0x00000048, 0x01020000, 0x00000003, 0x00000000, 
+0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000001, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000e, 0x00000000, 
+0x00000000, 0x0000e407, 0x307820e4, 0x00000000, 0x01000000, 0x0100e400, 
+0x237a10c6, 0x00000000, 0x00000000, 0x00000000, 0x1e000000, 0x00000000, 
+0x00000004, 0x00000003, 0x00000009, 0x00000000, 0x00000004, 0x00000008, 
+0x00000005, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 
+0x0000000f, 0x00030005, 0x00000000, 0x00786574, 0x006c6f63, 0x5f786574, 
+0x00000063, 
\ No newline at end of file
diff --git a/src/modules/engines/gl_common/shader/img_frag_s3c6410.asm b/src/modules/engines/gl_common/shader/img_frag_s3c6410.asm
new file mode 100644 (file)
index 0000000..3716bce
--- /dev/null
@@ -0,0 +1,26 @@
+
+#-------------------------------------------------
+# ORION - OpenGL ES 2.0 Shading Language Compiler
+# SAMSUNG INDIA SOFTWARE OPERATIONS PVT. LTD.
+# Compiler Version     : v04.00.09
+# Release Date         : 19.01.2009
+# FIMG VERSION      : FIMGv1.5
+# Optimizer Options :  -O --nolodcalc
+#-------------------------------------------------
+
+# hand optimised - removed useless ops
+
+ps_3_0
+
+fimg_version   0x01020000
+
+dcl_s2_tex     s0
+dcl_f4_col     v1.x
+dcl_f2_tex_c   v0.x
+
+label start
+label main_
+texld r0.xyzw, v0.xyzw, s0     # tex=s0
+mul_sat oColor.xyzw, r0.zyxw, v1.xyzw  # gl_FragColor=oColor.xyzw, col=v1.xyzw
+label main_end
+ret
diff --git a/src/modules/engines/gl_common/shader/img_nomul_frag.h b/src/modules/engines/gl_common/shader/img_nomul_frag.h
new file mode 100644 (file)
index 0000000..44cd1f7
--- /dev/null
@@ -0,0 +1,9 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"uniform sampler2D tex;\n"
+"varying vec2 tex_c;\n"
+"void main()\n"
+"{\n"
+"   gl_FragColor = texture2D(tex, tex_c.xy).bgra;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/img_nomul_frag.shd b/src/modules/engines/gl_common/shader/img_nomul_frag.shd
new file mode 100644 (file)
index 0000000..1513cd3
--- /dev/null
@@ -0,0 +1,9 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+uniform sampler2D tex;
+varying vec2 tex_c;
+void main()
+{
+   gl_FragColor = texture2D(tex, tex_c.xy).bgra;
+}
diff --git a/src/modules/engines/gl_common/shader/img_nomul_frag_bin_s3c6410.h b/src/modules/engines/gl_common/shader/img_nomul_frag_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..61662c8
--- /dev/null
@@ -0,0 +1,10 @@
+0x20205350, 0xffff0008, 0x00000048, 0x01020000, 0x00000003, 0x00000003, 
+0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000a, 0x00000000, 
+0x00000000, 0x02025400, 0x23782050, 0x00000000, 0x00000000, 0x0100e407, 
+0x307a10c6, 0x00000000, 0x00000000, 0x00000000, 0x1e000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x3f800000, 
+0x3f800000, 0x3f800000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000004, 0x00000005, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 
+0x00000003, 0x0000000f, 0x00030005, 0x00000000, 0x00786574, 0x5f786574, 
+0x00000063, 
\ No newline at end of file
diff --git a/src/modules/engines/gl_common/shader/img_nomul_vert.h b/src/modules/engines/gl_common/shader/img_nomul_vert.h
new file mode 100644 (file)
index 0000000..3a44f1a
--- /dev/null
@@ -0,0 +1,12 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"attribute vec4 vertex;\n"
+"attribute vec2 tex_coord;\n"
+"uniform mat4 mvp;\n"
+"varying vec2 tex_c;\n"
+"void main()\n"
+"{\n"
+"   gl_Position = mvp * vertex;\n"
+"   tex_c = tex_coord;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/img_nomul_vert.shd b/src/modules/engines/gl_common/shader/img_nomul_vert.shd
new file mode 100644 (file)
index 0000000..f4489b3
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+attribute vec4 vertex;
+attribute vec2 tex_coord;
+uniform mat4 mvp;
+varying vec2 tex_c;
+void main()
+{
+   gl_Position = mvp * vertex;
+   tex_c = tex_coord;
+}
diff --git a/src/modules/engines/gl_common/shader/img_nomul_vert_bin_s3c6410.h b/src/modules/engines/gl_common/shader/img_nomul_vert_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..314b5f3
--- /dev/null
@@ -0,0 +1,17 @@
+0x20205356, 0xffff0008, 0x00000048, 0x01020000, 0x00000006, 0x00000006, 
+0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x00000001, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000027, 0x00000000, 
+0x00000000, 0x02020000, 0x237820e4, 0x00000000, 0x00e40100, 0x02035500, 
+0x2ef820e4, 0x00000000, 0x00e40100, 0x0204aa00, 0x2ef820e4, 0x00000000, 
+0x00e40100, 0x0205ff00, 0x2ef800e4, 0x00000000, 0x00000000, 0x00010000, 
+0x20980154, 0x00000000, 0x00000000, 0x00000000, 0x1e000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x3f800000, 
+0x3f800000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x0000000c, 0x00000006, 0x00000009, 0x00000000, 0x00000000, 0x00000013, 
+0x00000009, 0x00000003, 0x00000000, 0x00000004, 0x00000000, 0x0000000b, 
+0x00000009, 0x00010004, 0x00000000, 0x00000021, 0x00000005, 0x00000003, 
+0x00010004, 0x00000004, 0x0000001d, 0x00000003, 0x0000000e, 0x00020001, 
+0x00000008, 0x505f6c67, 0x7469736f, 0x006e6f69, 0x74726576, 0x74007865, 
+0x635f7865, 0x64726f6f, 0x70766d00, 0x78657400, 0x0000635f, 
diff --git a/src/modules/engines/gl_common/shader/img_vert.h b/src/modules/engines/gl_common/shader/img_vert.h
new file mode 100644 (file)
index 0000000..ef035c8
--- /dev/null
@@ -0,0 +1,15 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"attribute vec4 vertex;\n"
+"attribute vec4 color;\n"
+"attribute vec2 tex_coord;\n"
+"uniform mat4 mvp;\n"
+"varying vec4 col;\n"
+"varying vec2 tex_c;\n"
+"void main()\n"
+"{\n"
+"   gl_Position = mvp * vertex;\n"
+"   col = color;\n"
+"   tex_c = tex_coord;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/img_vert.shd b/src/modules/engines/gl_common/shader/img_vert.shd
new file mode 100644 (file)
index 0000000..cf98501
--- /dev/null
@@ -0,0 +1,15 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+attribute vec4 vertex;
+attribute vec4 color;
+attribute vec2 tex_coord;
+uniform mat4 mvp;
+varying vec4 col;
+varying vec2 tex_c;
+void main()
+{
+   gl_Position = mvp * vertex;
+   col = color;
+   tex_c = tex_coord;
+}
diff --git a/src/modules/engines/gl_common/shader/img_vert_bin_s3c6410.h b/src/modules/engines/gl_common/shader/img_vert_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..1402448
--- /dev/null
@@ -0,0 +1,20 @@
+0x20205356, 0xffff0008, 0x00000048, 0x01020000, 0x00000007, 0x00000006, 
+0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000001, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000031, 0x00000000, 
+0x00000000, 0x02020000, 0x237820e4, 0x00000000, 0x00e40100, 0x02035500, 
+0x2ef820e4, 0x00000000, 0x00e40100, 0x0204aa00, 0x2ef820e4, 0x00000000, 
+0x00e40100, 0x0205ff00, 0x2ef800e4, 0x00000000, 0x00000000, 0x00010000, 
+0x20f801e4, 0x00000000, 0x00000000, 0x00020000, 0x20980254, 0x00000000, 
+0x00000000, 0x00000000, 0x1e000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000006, 
+0x00000009, 0x00000000, 0x00000000, 0x00000013, 0x00000005, 0x00000009, 
+0x00000000, 0x00000004, 0x00000019, 0x00000009, 0x00000003, 0x00000000, 
+0x00000008, 0x00000000, 0x0000000b, 0x00000009, 0x00010004, 0x00000000, 
+0x00000027, 0x00000003, 0x00000009, 0x00010004, 0x00000004, 0x0000002b, 
+0x00000005, 0x00000003, 0x00010004, 0x00000008, 0x00000023, 0x00000003, 
+0x0000000e, 0x00020001, 0x00000008, 0x505f6c67, 0x7469736f, 0x006e6f69, 
+0x74726576, 0x63007865, 0x726f6c6f, 0x78657400, 0x6f6f635f, 0x6d006472, 
+0x63007076, 0x74006c6f, 0x635f7865, 0x00000000, 
\ No newline at end of file
diff --git a/src/modules/engines/gl_common/shader/make-c-bin.sh b/src/modules/engines/gl_common/shader/make-c-bin.sh
new file mode 100755 (executable)
index 0000000..2902df6
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+od --width=4 -t x4 -v $1 | \
+awk '{ if (NF > 1) printf("0x%s, ", $2); L = L + 1; if (L > 5) { L = 0; printf("\n");}}'
diff --git a/src/modules/engines/gl_common/shader/make-c-str.sh b/src/modules/engines/gl_common/shader/make-c-str.sh
new file mode 100755 (executable)
index 0000000..fe7e80a
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+awk '{printf("\"%s\\n\"\n", $0);}' $1
diff --git a/src/modules/engines/gl_common/shader/rect_frag.h b/src/modules/engines/gl_common/shader/rect_frag.h
new file mode 100644 (file)
index 0000000..a879550
--- /dev/null
@@ -0,0 +1,9 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"uniform sampler2D tex;\n"
+"varying vec4 col;\n"
+"void main()\n"
+"{\n"
+"   gl_FragColor = col;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/rect_frag.shd b/src/modules/engines/gl_common/shader/rect_frag.shd
new file mode 100644 (file)
index 0000000..bb9221b
--- /dev/null
@@ -0,0 +1,9 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+uniform sampler2D tex;
+varying vec4 col;
+void main()
+{
+   gl_FragColor = col;
+}
diff --git a/src/modules/engines/gl_common/shader/rect_frag_bin_s3c6410.h b/src/modules/engines/gl_common/shader/rect_frag_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..ee94467
--- /dev/null
@@ -0,0 +1,6 @@
+0x20205350, 0xffff0008, 0x00000048, 0x01020000, 0x00000002, 0x00000000, 
+0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 
+0x00000000, 0x00000000, 0x20fa10e4, 0x00000000, 0x00000000, 0x00000000, 
+0x1e000000, 0x00000000, 0x00000000, 0x00000003, 0x00000009, 0x00000000, 
+0x00000000, 0x006c6f63, 
\ No newline at end of file
diff --git a/src/modules/engines/gl_common/shader/rect_frag_s3c6410.asm b/src/modules/engines/gl_common/shader/rect_frag_s3c6410.asm
new file mode 100644 (file)
index 0000000..24c47ac
--- /dev/null
@@ -0,0 +1,24 @@
+
+#-------------------------------------------------
+# ORION - OpenGL ES 2.0 Shading Language Compiler
+# SAMSUNG INDIA SOFTWARE OPERATIONS PVT. LTD.
+# Compiler Version     : v04.00.09
+# Release Date         : 19.01.2009
+# FIMG VERSION      : FIMGv1.5
+# Optimizer Options :  -O --nolodcalc
+#-------------------------------------------------
+
+# hand optimised - removed useless ops
+
+ps_3_0
+
+fimg_version   0x01020000
+
+dcl_f4_col     v0.x
+
+label start
+label main_
+label main_end
+mov_sat oColor.xyzw, v0.xyzw
+ret
+
diff --git a/src/modules/engines/gl_common/shader/rect_vert.h b/src/modules/engines/gl_common/shader/rect_vert.h
new file mode 100644 (file)
index 0000000..19e1b30
--- /dev/null
@@ -0,0 +1,12 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"attribute vec4 vertex;\n"
+"attribute vec4 color;\n"
+"uniform mat4 mvp;\n"
+"varying vec4 col;\n"
+"void main()\n"
+"{\n"
+"   gl_Position = mvp * vertex;\n"
+"   col = color;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/rect_vert.shd b/src/modules/engines/gl_common/shader/rect_vert.shd
new file mode 100644 (file)
index 0000000..ea2ed93
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+attribute vec4 vertex;
+attribute vec4 color;
+uniform mat4 mvp;
+varying vec4 col;
+void main()
+{
+   gl_Position = mvp * vertex;
+   col = color;
+}
diff --git a/src/modules/engines/gl_common/shader/rect_vert_bin_s3c6410.h b/src/modules/engines/gl_common/shader/rect_vert_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..3130684
--- /dev/null
@@ -0,0 +1,17 @@
+0x20205356, 0xffff0008, 0x00000048, 0x01020000, 0x00000006, 0x00000006, 
+0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x00000001, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000021, 0x00000000, 
+0x00000000, 0x02020000, 0x237820e4, 0x00000000, 0x00e40100, 0x02035500, 
+0x2ef820e4, 0x00000000, 0x00e40100, 0x0204aa00, 0x2ef820e4, 0x00000000, 
+0x00e40100, 0x0205ff00, 0x2ef800e4, 0x00000000, 0x00000000, 0x00010000, 
+0x20f801e4, 0x00000000, 0x00000000, 0x00000000, 0x1e000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x3f800000, 
+0x3f800000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x0000000c, 0x00000006, 0x00000009, 0x00000000, 0x00000000, 0x00000013, 
+0x00000005, 0x00000009, 0x00000000, 0x00000004, 0x00000000, 0x0000000b, 
+0x00000009, 0x00010004, 0x00000000, 0x0000001d, 0x00000003, 0x00000009, 
+0x00010004, 0x00000004, 0x00000019, 0x00000003, 0x0000000e, 0x00020001, 
+0x00000008, 0x505f6c67, 0x7469736f, 0x006e6f69, 0x74726576, 0x63007865, 
+0x726f6c6f, 0x70766d00, 0x6c6f6300, 0x00000000, 
\ No newline at end of file
diff --git a/src/modules/engines/gl_common/shader/tex_frag.h b/src/modules/engines/gl_common/shader/tex_frag.h
new file mode 100644 (file)
index 0000000..29449f2
--- /dev/null
@@ -0,0 +1,10 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"uniform sampler2D tex;\n"
+"varying vec4 col;\n"
+"varying vec2 tex_c;\n"
+"void main()\n"
+"{\n"
+"   gl_FragColor = texture2D(tex, tex_c.xy) * col;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/tex_frag.shd b/src/modules/engines/gl_common/shader/tex_frag.shd
new file mode 100644 (file)
index 0000000..eb65760
--- /dev/null
@@ -0,0 +1,10 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+uniform sampler2D tex;
+varying vec4 col;
+varying vec2 tex_c;
+void main()
+{
+   gl_FragColor = texture2D(tex, tex_c.xy) * col;
+}
diff --git a/src/modules/engines/gl_common/shader/tex_frag_bin_s3c6410.h b/src/modules/engines/gl_common/shader/tex_frag_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..24af537
--- /dev/null
@@ -0,0 +1,9 @@
+0x20205350, 0xffff0008, 0x00000048, 0x01020000, 0x00000003, 0x00000000, 
+0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000001, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000e, 0x00000000, 
+0x00000000, 0x0000e407, 0x307820e4, 0x00000000, 0x01000000, 0x0100e400, 
+0x237a10e4, 0x00000000, 0x00000000, 0x00000000, 0x1e000000, 0x00000000, 
+0x00000004, 0x00000003, 0x00000009, 0x00000000, 0x00000004, 0x00000008, 
+0x00000005, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 
+0x0000000f, 0x00030005, 0x00000000, 0x00786574, 0x006c6f63, 0x5f786574, 
+0x00000063, 
\ No newline at end of file
diff --git a/src/modules/engines/gl_common/shader/tex_frag_s3c6410.asm b/src/modules/engines/gl_common/shader/tex_frag_s3c6410.asm
new file mode 100644 (file)
index 0000000..14bbfa1
--- /dev/null
@@ -0,0 +1,26 @@
+
+#-------------------------------------------------
+# ORION - OpenGL ES 2.0 Shading Language Compiler
+# SAMSUNG INDIA SOFTWARE OPERATIONS PVT. LTD.
+# Compiler Version     : v04.00.09
+# Release Date         : 19.01.2009
+# FIMG VERSION      : FIMGv1.5
+# Optimizer Options :  -O --nolodcalc
+#-------------------------------------------------
+
+# hand optimised - removed useless ops
+
+ps_3_0
+
+fimg_version   0x01020000
+
+dcl_s2_tex     s0
+dcl_f4_col     v1.x
+dcl_f2_tex_c   v0.x
+
+label start
+label main_
+texld r0.xyzw, v0.xyzw, s0     # tex=s0
+mul_sat oColor.xyzw, r0.xyzw, v1.xyzw  # gl_FragColor=oColor.xyzw, col=v1.xyzw
+label main_end
+ret
diff --git a/src/modules/engines/gl_common/shader/tex_nomul_frag.h b/src/modules/engines/gl_common/shader/tex_nomul_frag.h
new file mode 100644 (file)
index 0000000..d8a6338
--- /dev/null
@@ -0,0 +1,9 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"uniform sampler2D tex;\n"
+"varying vec2 tex_c;\n"
+"void main()\n"
+"{\n"
+"   gl_FragColor = texture2D(tex, tex_c.xy);\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/tex_nomul_frag.shd b/src/modules/engines/gl_common/shader/tex_nomul_frag.shd
new file mode 100644 (file)
index 0000000..3f2ec6f
--- /dev/null
@@ -0,0 +1,9 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+uniform sampler2D tex;
+varying vec2 tex_c;
+void main()
+{
+   gl_FragColor = texture2D(tex, tex_c.xy);
+}
diff --git a/src/modules/engines/gl_common/shader/tex_nomul_frag_bin_s3c6410.h b/src/modules/engines/gl_common/shader/tex_nomul_frag_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..b89eeb1
--- /dev/null
@@ -0,0 +1,10 @@
+0x20205350, 0xffff0008, 0x00000048, 0x01020000, 0x00000003, 0x00000003, 
+0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000a, 0x00000000, 
+0x00000000, 0x02025400, 0x23782050, 0x00000000, 0x00000000, 0x0100e407, 
+0x307a10e4, 0x00000000, 0x00000000, 0x00000000, 0x1e000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x3f800000, 
+0x3f800000, 0x3f800000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000004, 0x00000005, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 
+0x00000003, 0x0000000f, 0x00030005, 0x00000000, 0x00786574, 0x5f786574, 
+0x00000063, 
\ No newline at end of file
diff --git a/src/modules/engines/gl_common/shader/tex_nomul_vert.h b/src/modules/engines/gl_common/shader/tex_nomul_vert.h
new file mode 100644 (file)
index 0000000..3a44f1a
--- /dev/null
@@ -0,0 +1,12 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"attribute vec4 vertex;\n"
+"attribute vec2 tex_coord;\n"
+"uniform mat4 mvp;\n"
+"varying vec2 tex_c;\n"
+"void main()\n"
+"{\n"
+"   gl_Position = mvp * vertex;\n"
+"   tex_c = tex_coord;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/tex_nomul_vert.shd b/src/modules/engines/gl_common/shader/tex_nomul_vert.shd
new file mode 100644 (file)
index 0000000..f4489b3
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+attribute vec4 vertex;
+attribute vec2 tex_coord;
+uniform mat4 mvp;
+varying vec2 tex_c;
+void main()
+{
+   gl_Position = mvp * vertex;
+   tex_c = tex_coord;
+}
diff --git a/src/modules/engines/gl_common/shader/tex_nomul_vert_bin_s3c6410.h b/src/modules/engines/gl_common/shader/tex_nomul_vert_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..314b5f3
--- /dev/null
@@ -0,0 +1,17 @@
+0x20205356, 0xffff0008, 0x00000048, 0x01020000, 0x00000006, 0x00000006, 
+0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x00000001, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000027, 0x00000000, 
+0x00000000, 0x02020000, 0x237820e4, 0x00000000, 0x00e40100, 0x02035500, 
+0x2ef820e4, 0x00000000, 0x00e40100, 0x0204aa00, 0x2ef820e4, 0x00000000, 
+0x00e40100, 0x0205ff00, 0x2ef800e4, 0x00000000, 0x00000000, 0x00010000, 
+0x20980154, 0x00000000, 0x00000000, 0x00000000, 0x1e000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x3f800000, 
+0x3f800000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x0000000c, 0x00000006, 0x00000009, 0x00000000, 0x00000000, 0x00000013, 
+0x00000009, 0x00000003, 0x00000000, 0x00000004, 0x00000000, 0x0000000b, 
+0x00000009, 0x00010004, 0x00000000, 0x00000021, 0x00000005, 0x00000003, 
+0x00010004, 0x00000004, 0x0000001d, 0x00000003, 0x0000000e, 0x00020001, 
+0x00000008, 0x505f6c67, 0x7469736f, 0x006e6f69, 0x74726576, 0x74007865, 
+0x635f7865, 0x64726f6f, 0x70766d00, 0x78657400, 0x0000635f, 
diff --git a/src/modules/engines/gl_common/shader/tex_vert.h b/src/modules/engines/gl_common/shader/tex_vert.h
new file mode 100644 (file)
index 0000000..ef035c8
--- /dev/null
@@ -0,0 +1,15 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"attribute vec4 vertex;\n"
+"attribute vec4 color;\n"
+"attribute vec2 tex_coord;\n"
+"uniform mat4 mvp;\n"
+"varying vec4 col;\n"
+"varying vec2 tex_c;\n"
+"void main()\n"
+"{\n"
+"   gl_Position = mvp * vertex;\n"
+"   col = color;\n"
+"   tex_c = tex_coord;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/tex_vert.shd b/src/modules/engines/gl_common/shader/tex_vert.shd
new file mode 100644 (file)
index 0000000..cf98501
--- /dev/null
@@ -0,0 +1,15 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+attribute vec4 vertex;
+attribute vec4 color;
+attribute vec2 tex_coord;
+uniform mat4 mvp;
+varying vec4 col;
+varying vec2 tex_c;
+void main()
+{
+   gl_Position = mvp * vertex;
+   col = color;
+   tex_c = tex_coord;
+}
diff --git a/src/modules/engines/gl_common/shader/tex_vert_bin_s3c6410.h b/src/modules/engines/gl_common/shader/tex_vert_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..1402448
--- /dev/null
@@ -0,0 +1,20 @@
+0x20205356, 0xffff0008, 0x00000048, 0x01020000, 0x00000007, 0x00000006, 
+0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000001, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000031, 0x00000000, 
+0x00000000, 0x02020000, 0x237820e4, 0x00000000, 0x00e40100, 0x02035500, 
+0x2ef820e4, 0x00000000, 0x00e40100, 0x0204aa00, 0x2ef820e4, 0x00000000, 
+0x00e40100, 0x0205ff00, 0x2ef800e4, 0x00000000, 0x00000000, 0x00010000, 
+0x20f801e4, 0x00000000, 0x00000000, 0x00020000, 0x20980254, 0x00000000, 
+0x00000000, 0x00000000, 0x1e000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000006, 
+0x00000009, 0x00000000, 0x00000000, 0x00000013, 0x00000005, 0x00000009, 
+0x00000000, 0x00000004, 0x00000019, 0x00000009, 0x00000003, 0x00000000, 
+0x00000008, 0x00000000, 0x0000000b, 0x00000009, 0x00010004, 0x00000000, 
+0x00000027, 0x00000003, 0x00000009, 0x00010004, 0x00000004, 0x0000002b, 
+0x00000005, 0x00000003, 0x00010004, 0x00000008, 0x00000023, 0x00000003, 
+0x0000000e, 0x00020001, 0x00000008, 0x505f6c67, 0x7469736f, 0x006e6f69, 
+0x74726576, 0x63007865, 0x726f6c6f, 0x78657400, 0x6f6f635f, 0x6d006472, 
+0x63007076, 0x74006c6f, 0x635f7865, 0x00000000, 
\ No newline at end of file
diff --git a/src/modules/engines/gl_common/shader/yuv_frag.h b/src/modules/engines/gl_common/shader/yuv_frag.h
new file mode 100644 (file)
index 0000000..f02d0be
--- /dev/null
@@ -0,0 +1,16 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"uniform sampler2D tex, texu, texv;\n"
+"varying vec4 col;\n"
+"varying vec2 tex_c, tex_c2, tex_c3;\n"
+"void main()\n"
+"{\n"
+"   const mat4 yuv2rgb = mat4( 1.16400,  1.16400,  1.16400, 0.00000,\n"
+"                              0.00000, -0.34410,  1.77200, 0.00000,\n"
+"                              1.40200, -0.71410,  0.00000, 0.00000,\n"
+"                             -0.77380,  0.45630, -0.95880, 1.00000);\n"
+"   gl_FragColor = (yuv2rgb * vec4(texture2D(tex, tex_c.xy).r,\n"
+"                                  texture2D(texu, tex_c2.xy).r,\n"
+"                                  texture2D(texv, tex_c3.xy).r, 1.0)) * col;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/yuv_frag.shd b/src/modules/engines/gl_common/shader/yuv_frag.shd
new file mode 100644 (file)
index 0000000..a00cd6f
--- /dev/null
@@ -0,0 +1,16 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+uniform sampler2D tex, texu, texv;
+varying vec4 col;
+varying vec2 tex_c, tex_c2, tex_c3;
+void main()
+{
+   const mat4 yuv2rgb = mat4( 1.16400,  1.16400,  1.16400, 0.00000,
+                              0.00000, -0.34410,  1.77200, 0.00000,
+                              1.40200, -0.71410,  0.00000, 0.00000,
+                             -0.77380,  0.45630, -0.95880, 1.00000);
+   gl_FragColor = (yuv2rgb * vec4(texture2D(tex, tex_c.xy).r,
+                                  texture2D(texu, tex_c2.xy).r,
+                                  texture2D(texv, tex_c3.xy).r, 1.0)) * col;
+}
diff --git a/src/modules/engines/gl_common/shader/yuv_frag_bin_s3c6410.h b/src/modules/engines/gl_common/shader/yuv_frag_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..cd301dc
--- /dev/null
@@ -0,0 +1,24 @@
+0x20205350, 0xffff0008, 0x00000048, 0x01020000, 0x0000000d, 0x00000007, 
+0x00000000, 0x00000000, 0x00000004, 0x00000000, 0x00000000, 0x00000003, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000026, 0x00000000, 
+0x00000000, 0x02065400, 0x23782050, 0x00000000, 0x00000000, 0x0100e407, 
+0x307820e4, 0x00000000, 0x01000000, 0x02065400, 0x23782150, 0x00000000, 
+0x01000000, 0x0101e407, 0x307821e4, 0x00000000, 0x02000000, 0x02065400, 
+0x23782250, 0x00000000, 0x02000000, 0x0102e407, 0x307822e4, 0x00000000, 
+0x00000000, 0x02020001, 0x237823e4, 0x00000000, 0x01e40103, 0x02030001, 
+0x2ef823e4, 0x00000000, 0x02e40103, 0x02040001, 0x2ef823e4, 0x00000000, 
+0x00000000, 0x02050000, 0x20f824e4, 0x00000000, 0x06e40103, 0x01040002, 
+0x2ef823e4, 0x00000000, 0x03000000, 0x0103e400, 0x237a10e4, 0x00000000, 
+0x00000000, 0x00000000, 0x1e000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x3f94fdf4, 0x3f94fdf4, 0x3f94fdf4, 0x00000000, 0x00000000, 0xbeb02de0, 
+0x3fe2d0e5, 0x00000000, 0x3fb374bc, 0xbf36cf42, 0x00000000, 0x00000000, 
+0xbf4617c2, 0x3ee9a027, 0xbf7573eb, 0x3f800000, 0x3f800000, 0x00000000, 
+0x00000000, 0x00000000, 0x0000000e, 0x00000003, 0x00000009, 0x00000000, 
+0x0000000c, 0x00000012, 0x00000005, 0x00000003, 0x00000000, 0x00000000, 
+0x00000018, 0x00000006, 0x00000003, 0x00000000, 0x00000004, 0x0000001f, 
+0x00000006, 0x00000003, 0x00000000, 0x00000008, 0x00000000, 0x00000003, 
+0x0000000f, 0x00030005, 0x00000000, 0x00000004, 0x00000004, 0x0000000f, 
+0x00030005, 0x00000004, 0x00000009, 0x00000004, 0x0000000f, 0x00030005, 
+0x00000008, 0x00786574, 0x75786574, 0x78657400, 0x6f630076, 0x6574006c, 
+0x00635f78, 0x5f786574, 0x74003263, 0x635f7865, 0x00000033, 
diff --git a/src/modules/engines/gl_common/shader/yuv_frag_s3c6410.asm b/src/modules/engines/gl_common/shader/yuv_frag_s3c6410.asm
new file mode 100644 (file)
index 0000000..9a10bf0
--- /dev/null
@@ -0,0 +1,46 @@
+
+#-------------------------------------------------
+# ORION - OpenGL ES 2.0 Shading Language Compiler
+# SAMSUNG INDIA SOFTWARE OPERATIONS PVT. LTD.
+# Compiler Version     : v04.00.09
+# Release Date         : 19.01.2009
+# FIMG VERSION      : FIMGv1.5
+# Optimizer Options :  -O --nolodcalc
+#-------------------------------------------------
+
+# hand optimised - removed useless ops
+
+ps_3_0
+
+fimg_version   0x01020000
+
+dcl_s2_tex     s0
+dcl_s2_texu    s1
+dcl_s2_texv    s2
+dcl_f4_col     v3.x
+dcl_f2_tex_c   v0.x
+dcl_f2_tex_c2  v1.x
+dcl_f2_tex_c3  v2.x
+
+def c2, 1.164000, 1.164000, 1.164000, 0.000000
+def c3, 0.000000, -0.344100, 1.772000, 0.000000
+def c4, 1.402000, -0.714100, 0.000000, 0.000000
+def c5, -0.773800, 0.456300, -0.958800, 1.000000
+def c6, 1.000000, 0.000000, 0.000000, 0.000000
+
+label start
+label main_
+mul r0.xyzw, c6.xxyy, v0.xyyy  # tex_c=v0.xyyy
+texld r0.xyzw, r0.xyzw, s0     # tex=s0
+mul r1.xyzw, c6.xxyy, v1.xyyy  # tex_c2=v1.xyyy
+texld r1.xyzw, r1.xyzw, s1     # texu=s1
+mul r2.xyzw, c6.xxyy, v2.xyyy  # tex_c3=v2.xyyy
+texld r2.xyzw, r2.xyzw, s2     # texv=s2
+mul r3.xyzw, c2.xyzw, r0.xxxx  # yuv=r0.xxxx
+mad r3.xyzw, c3.xyzw, r1.xxxx, r3.xyzw # yuv=r1.xxxx
+mad r3.xyzw, c4.xyzw, r2.xxxx, r3.xyzw # yuv=r2.xxxx
+mov r4.xyzw, c5.xyzw
+mad r3.xyzw, r4.xyzw, c6.xxxx, r3.xyzw # yuv=c6.xxxx
+mul_sat oColor.xyzw, r3.xyzw, v3.xyzw  # gl_FragColor=oColor.xyzw, col=v3.xyzw
+label main_end
+ret
diff --git a/src/modules/engines/gl_common/shader/yuv_nomul_frag.h b/src/modules/engines/gl_common/shader/yuv_nomul_frag.h
new file mode 100644 (file)
index 0000000..9eeda68
--- /dev/null
@@ -0,0 +1,15 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"uniform sampler2D tex, texu, texv;\n"
+"varying vec2 tex_c, tex_c2, tex_c3;\n"
+"void main()\n"
+"{\n"
+"   const mat4 yuv2rgb = mat4( 1.16400,  1.16400,  1.16400, 0.00000,\n"
+"                              0.00000, -0.34410,  1.77200, 0.00000,\n"
+"                              1.40200, -0.71410,  0.00000, 0.00000,\n"
+"                             -0.77380,  0.45630, -0.95880, 1.00000);\n"
+"   gl_FragColor = yuv2rgb * vec4(texture2D(tex, tex_c.xy).r,\n"
+"                                 texture2D(texu, tex_c2.xy).r,\n"
+"                                 texture2D(texv, tex_c3.xy).r, 1.0);\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/yuv_nomul_frag.shd b/src/modules/engines/gl_common/shader/yuv_nomul_frag.shd
new file mode 100644 (file)
index 0000000..3c2592d
--- /dev/null
@@ -0,0 +1,15 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+uniform sampler2D tex, texu, texv;
+varying vec2 tex_c, tex_c2, tex_c3;
+void main()
+{
+   const mat4 yuv2rgb = mat4( 1.16400,  1.16400,  1.16400, 0.00000,
+                              0.00000, -0.34410,  1.77200, 0.00000,
+                              1.40200, -0.71410,  0.00000, 0.00000,
+                             -0.77380,  0.45630, -0.95880, 1.00000);
+   gl_FragColor = yuv2rgb * vec4(texture2D(tex, tex_c.xy).r,
+                                 texture2D(texu, tex_c2.xy).r,
+                                 texture2D(texv, tex_c3.xy).r, 1.0);
+}
diff --git a/src/modules/engines/gl_common/shader/yuv_nomul_frag_bin_s3c6410.h b/src/modules/engines/gl_common/shader/yuv_nomul_frag_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..45aa66d
--- /dev/null
@@ -0,0 +1,23 @@
+0x20205350, 0xffff0008, 0x00000048, 0x01020000, 0x0000000c, 0x00000007, 
+0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000022, 0x00000000, 
+0x00000000, 0x02065400, 0x23782050, 0x00000000, 0x00000000, 0x0100e407, 
+0x307820e4, 0x00000000, 0x01000000, 0x02065400, 0x23782150, 0x00000000, 
+0x01000000, 0x0101e407, 0x307821e4, 0x00000000, 0x02000000, 0x02065400, 
+0x23782250, 0x00000000, 0x02000000, 0x0102e407, 0x307822e4, 0x00000000, 
+0x00000000, 0x02020001, 0x237823e4, 0x00000000, 0x01e40103, 0x02030001, 
+0x2ef823e4, 0x00000000, 0x02e40103, 0x02040001, 0x2ef823e4, 0x00000000, 
+0x00000000, 0x02050000, 0x20f824e4, 0x00000000, 0x06e40103, 0x01040002, 
+0x2efa10e4, 0x00000000, 0x00000000, 0x00000000, 0x1e000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x3f800000, 
+0x3f800000, 0x3f800000, 0x3f94fdf4, 0x3f94fdf4, 0x3f94fdf4, 0x00000000, 
+0x00000000, 0xbeb02de0, 0x3fe2d0e5, 0x00000000, 0x3fb374bc, 0xbf36cf42, 
+0x00000000, 0x00000000, 0xbf4617c2, 0x3ee9a027, 0xbf7573eb, 0x3f800000, 
+0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0000000e, 0x00000005, 
+0x00000003, 0x00000000, 0x00000000, 0x00000014, 0x00000006, 0x00000003, 
+0x00000000, 0x00000004, 0x0000001b, 0x00000006, 0x00000003, 0x00000000, 
+0x00000008, 0x00000000, 0x00000003, 0x0000000f, 0x00030005, 0x00000000, 
+0x00000004, 0x00000004, 0x0000000f, 0x00030005, 0x00000004, 0x00000009, 
+0x00000004, 0x0000000f, 0x00030005, 0x00000008, 0x00786574, 0x75786574, 
+0x78657400, 0x65740076, 0x00635f78, 0x5f786574, 0x74003263, 0x635f7865, 
+0x00000033, 
\ No newline at end of file
diff --git a/src/modules/engines/gl_common/shader/yuv_nomul_vert.h b/src/modules/engines/gl_common/shader/yuv_nomul_vert.h
new file mode 100644 (file)
index 0000000..8907f30
--- /dev/null
@@ -0,0 +1,14 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"attribute vec4 vertex;\n"
+"attribute vec2 tex_coord, tex_coord2, tex_coord3;\n"
+"uniform mat4 mvp;\n"
+"varying vec2 tex_c, tex_c2, tex_c3;\n"
+"void main()\n"
+"{\n"
+"   gl_Position = mvp * vertex;\n"
+"   tex_c = tex_coord;\n"
+"   tex_c2 = tex_coord2;\n"
+"   tex_c3 = tex_coord3;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/yuv_nomul_vert.shd b/src/modules/engines/gl_common/shader/yuv_nomul_vert.shd
new file mode 100644 (file)
index 0000000..24b04e4
--- /dev/null
@@ -0,0 +1,14 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+attribute vec4 vertex;
+attribute vec2 tex_coord, tex_coord2, tex_coord3;
+uniform mat4 mvp;
+varying vec2 tex_c, tex_c2, tex_c3;
+void main()
+{
+   gl_Position = mvp * vertex;
+   tex_c = tex_coord;
+   tex_c2 = tex_coord2;
+   tex_c3 = tex_coord3;
+}
diff --git a/src/modules/engines/gl_common/shader/yuv_nomul_vert_bin_s3c6410.h b/src/modules/engines/gl_common/shader/yuv_nomul_vert_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..5942b4b
--- /dev/null
@@ -0,0 +1,23 @@
+0x20205356, 0xffff0008, 0x00000048, 0x01020000, 0x00000008, 0x00000006, 
+0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x00000001, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000004b, 0x00000000, 
+0x00000000, 0x02020000, 0x237820e4, 0x00000000, 0x00e40100, 0x02035500, 
+0x2ef820e4, 0x00000000, 0x00e40100, 0x0204aa00, 0x2ef820e4, 0x00000000, 
+0x00e40100, 0x0205ff00, 0x2ef800e4, 0x00000000, 0x00000000, 0x00010000, 
+0x20980154, 0x00000000, 0x00000000, 0x00020000, 0x20980254, 0x00000000, 
+0x00000000, 0x00030000, 0x20980354, 0x00000000, 0x00000000, 0x00000000, 
+0x1e000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x0000000c, 0x00000006, 0x00000009, 0x00000000, 
+0x00000000, 0x00000013, 0x00000009, 0x00000003, 0x00000000, 0x00000004, 
+0x0000001d, 0x0000000a, 0x00000003, 0x00000000, 0x00000008, 0x00000028, 
+0x0000000a, 0x00000003, 0x00000000, 0x0000000c, 0x00000000, 0x0000000b, 
+0x00000009, 0x00010004, 0x00000000, 0x00000037, 0x00000005, 0x00000003, 
+0x00010004, 0x00000004, 0x0000003d, 0x00000006, 0x00000003, 0x00010004, 
+0x00000008, 0x00000044, 0x00000006, 0x00000003, 0x00010004, 0x0000000c, 
+0x00000033, 0x00000003, 0x0000000e, 0x00020001, 0x00000008, 0x505f6c67, 
+0x7469736f, 0x006e6f69, 0x74726576, 0x74007865, 0x635f7865, 0x64726f6f, 
+0x78657400, 0x6f6f635f, 0x00326472, 0x5f786574, 0x726f6f63, 0x6d003364, 
+0x74007076, 0x635f7865, 0x78657400, 0x0032635f, 0x5f786574, 0x00003363, 
diff --git a/src/modules/engines/gl_common/shader/yuv_vert.h b/src/modules/engines/gl_common/shader/yuv_vert.h
new file mode 100644 (file)
index 0000000..53b08bf
--- /dev/null
@@ -0,0 +1,17 @@
+"#ifdef GL_ES\n"
+"precision mediump float;\n"
+"#endif\n"
+"attribute vec4 vertex;\n"
+"attribute vec4 color;\n"
+"attribute vec2 tex_coord, tex_coord2, tex_coord3;\n"
+"uniform mat4 mvp;\n"
+"varying vec4 col;\n"
+"varying vec2 tex_c, tex_c2, tex_c3;\n"
+"void main()\n"
+"{\n"
+"   gl_Position = mvp * vertex;\n"
+"   col = color;\n"
+"   tex_c = tex_coord;\n"
+"   tex_c2 = tex_coord2;\n"
+"   tex_c3 = tex_coord3;\n"
+"}\n"
diff --git a/src/modules/engines/gl_common/shader/yuv_vert.shd b/src/modules/engines/gl_common/shader/yuv_vert.shd
new file mode 100644 (file)
index 0000000..d69bf74
--- /dev/null
@@ -0,0 +1,17 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+attribute vec4 vertex;
+attribute vec4 color;
+attribute vec2 tex_coord, tex_coord2, tex_coord3;
+uniform mat4 mvp;
+varying vec4 col;
+varying vec2 tex_c, tex_c2, tex_c3;
+void main()
+{
+   gl_Position = mvp * vertex;
+   col = color;
+   tex_c = tex_coord;
+   tex_c2 = tex_coord2;
+   tex_c3 = tex_coord3;
+}
diff --git a/src/modules/engines/gl_common/shader/yuv_vert_bin_s3c6410.h b/src/modules/engines/gl_common/shader/yuv_vert_bin_s3c6410.h
new file mode 100644 (file)
index 0000000..e757b6d
--- /dev/null
@@ -0,0 +1,26 @@
+0x20205356, 0xffff0008, 0x00000048, 0x01020000, 0x00000009, 0x00000006, 
+0x00000000, 0x00000000, 0x00000005, 0x00000005, 0x00000001, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000055, 0x00000000, 
+0x00000000, 0x02020000, 0x237820e4, 0x00000000, 0x00e40100, 0x02035500, 
+0x2ef820e4, 0x00000000, 0x00e40100, 0x0204aa00, 0x2ef820e4, 0x00000000, 
+0x00e40100, 0x0205ff00, 0x2ef800e4, 0x00000000, 0x00000000, 0x00010000, 
+0x20f801e4, 0x00000000, 0x00000000, 0x00020000, 0x20980254, 0x00000000, 
+0x00000000, 0x00030000, 0x20980354, 0x00000000, 0x00000000, 0x00040000, 
+0x20980454, 0x00000000, 0x00000000, 0x00000000, 0x1e000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x3f800000, 
+0x3f800000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
+0x0000000c, 0x00000006, 0x00000009, 0x00000000, 0x00000000, 0x00000013, 
+0x00000005, 0x00000009, 0x00000000, 0x00000004, 0x00000019, 0x00000009, 
+0x00000003, 0x00000000, 0x00000008, 0x00000023, 0x0000000a, 0x00000003, 
+0x00000000, 0x0000000c, 0x0000002e, 0x0000000a, 0x00000003, 0x00000000, 
+0x00000010, 0x00000000, 0x0000000b, 0x00000009, 0x00010004, 0x00000000, 
+0x0000003d, 0x00000003, 0x00000009, 0x00010004, 0x00000004, 0x00000041, 
+0x00000005, 0x00000003, 0x00010004, 0x00000008, 0x00000047, 0x00000006, 
+0x00000003, 0x00010004, 0x0000000c, 0x0000004e, 0x00000006, 0x00000003, 
+0x00010004, 0x00000010, 0x00000039, 0x00000003, 0x0000000e, 0x00020001, 
+0x00000008, 0x505f6c67, 0x7469736f, 0x006e6f69, 0x74726576, 0x63007865, 
+0x726f6c6f, 0x78657400, 0x6f6f635f, 0x74006472, 0x635f7865, 0x64726f6f, 
+0x65740032, 0x6f635f78, 0x3364726f, 0x70766d00, 0x6c6f6300, 0x78657400, 
+0x7400635f, 0x635f7865, 0x65740032, 0x33635f78, 0x00000000, 
diff --git a/src/modules/engines/gl_glew/.cvsignore b/src/modules/engines/gl_glew/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/engines/gl_glew/Evas_Engine_GL_Glew.h b/src/modules/engines/gl_glew/Evas_Engine_GL_Glew.h
new file mode 100644 (file)
index 0000000..c254fd0
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef __EVAS_ENGINE_GL_GLEW_H__
+#define __EVAS_ENGINE_GL_GLEW_H__
+
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+
+
+typedef struct _Evas_Engine_Info_GL_Glew              Evas_Engine_Info_GL_Glew;
+
+struct _Evas_Engine_Info_GL_Glew
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   /* engine specific data & parameters it needs to set up */
+   struct {
+      HWND  window;
+      int   depth;
+   } info;
+};
+
+
+#endif /* __EVAS_ENGINE_GL_GLEW_H__ */
diff --git a/src/modules/engines/gl_glew/Makefile.am b/src/modules/engines/gl_glew/Makefile.am
new file mode 100644 (file)
index 0000000..938429a
--- /dev/null
@@ -0,0 +1,44 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines/gl_common \
+@EINA_CFLAGS@ \
+@FREETYPE_CFLAGS@ \
+@evas_engine_gl_glew_cflags@
+
+if BUILD_ENGINE_GL_GLEW
+
+GL_GLEW_SOURCES = \
+evas_engine.c \
+evas_glew_win32_main.c
+
+GL_GLEW_LIBADD = @evas_engine_gl_glew_libs@ $(top_builddir)/src/modules/engines/gl_common/libevas_engine_gl_common.la
+
+pkgdir = $(libdir)/evas/modules/engines/gl_glew/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_GL_Glew.h
+
+if !EVAS_STATIC_BUILD_GL_GLEW
+
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES  = $(GL_GLEW_SOURCES)
+module_la_LIBADD = $(GL_GLEW_LIBADD) $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = @lt_enable_auto_import@ -no-undefined -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_gl_glew.la
+
+libevas_engine_gl_glew_la_SOURCES = $(GL_GLEW_SOURCES)
+libevas_engine_gl_glew_la_LIBADD = $(GL_GLEW_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/gl_glew/evas_engine.c b/src/modules/engines/gl_glew/evas_engine.c
new file mode 100644 (file)
index 0000000..1fabf66
--- /dev/null
@@ -0,0 +1,1162 @@
+#include "evas_engine.h"
+
+int _evas_engine_GL_glew_log_dom = -1;
+
+/* function tables - filled in later (func and parent func) */
+static Evas_Func func, pfunc;
+
+typedef struct _Render_Engine Render_Engine;
+
+struct _Render_Engine
+{
+   Evas_GL_Glew_Window *window;
+   int                  end;
+};
+
+static void *
+eng_info(Evas *e __UNUSED__)
+{
+   Evas_Engine_Info_GL_Glew *info;
+   info = calloc(1, sizeof(Evas_Engine_Info_GL_Glew));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   return info;
+}
+
+static void
+eng_info_free(Evas *e __UNUSED__, void *info)
+{
+   Evas_Engine_Info_GL_Glew *in;
+
+   eina_log_domain_unregister(_evas_engine_GL_glew_log_dom);
+   in = (Evas_Engine_Info_GL_Glew *)info;
+   free(in);
+}
+
+static int
+eng_setup(Evas *e, void *in)
+{
+   Render_Engine            *re;
+   Evas_Engine_Info_GL_Glew *info;
+
+   info = (Evas_Engine_Info_GL_Glew *)in;
+   if (!e->engine.data.output)
+     {
+       re = calloc(1, sizeof(Render_Engine));
+       if (!re) return 0;
+
+       e->engine.data.output = re;
+       re->window = eng_window_new(info->info.window,
+                                    info->info.depth,
+                                    e->output.w,
+                                    e->output.h);
+       if (!re->window)
+         {
+            free(re);
+            e->engine.data.output = NULL;
+            return 0;
+         }
+
+       evas_common_cpu_init();
+
+       evas_common_blend_init();
+       evas_common_image_init();
+       evas_common_convert_init();
+       evas_common_scale_init();
+       evas_common_rectangle_init();
+       evas_common_gradient_init();
+       evas_common_polygon_init();
+       evas_common_line_init();
+       evas_common_font_init();
+       evas_common_draw_init();
+       evas_common_tilebuf_init();
+     }
+   else
+     {
+       re = e->engine.data.output;
+       eng_window_free(re->window);
+       re->window = eng_window_new(info->info.window,
+                                    info->info.depth,
+                                    e->output.w,
+                                    e->output.h);
+     }
+   if (!e->engine.data.output) return 0;
+
+   if (!e->engine.data.context)
+     e->engine.data.context =
+       e->engine.func->context_new(e->engine.data.output);
+   eng_window_use(re->window);
+
+   return 1;
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_free(re->window);
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+}
+
+static void
+eng_output_resize(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   re->window->width = w;
+   re->window->height = h;
+   evas_gl_common_context_resize(re->window->gl_context, w, h);
+}
+
+static void
+eng_output_tile_size_set(void *data __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_gl_common_context_resize(re->window->gl_context, re->window->width, re->window->height);
+   /* simple bounding box */
+   if (!re->window->draw.redraw)
+     {
+#if 0
+       re->window->draw.x1 = x;
+       re->window->draw.y1 = y;
+       re->window->draw.x2 = x + w - 1;
+       re->window->draw.y2 = y + h - 1;
+#else
+       re->window->draw.x1 = 0;
+       re->window->draw.y1 = 0;
+       re->window->draw.x2 = re->window->width - 1;
+       re->window->draw.y2 = re->window->height - 1;
+#endif
+     }
+   else
+     {
+       if (x < re->window->draw.x1) re->window->draw.x1 = x;
+       if (y < re->window->draw.y1) re->window->draw.y1 = y;
+       if ((x + w - 1) > re->window->draw.x2) re->window->draw.x2 = x + w - 1;
+       if ((y + h - 1) > re->window->draw.y2) re->window->draw.y2 = y + h - 1;
+     }
+   re->window->draw.redraw = 1;
+}
+
+static void
+eng_output_redraws_rect_del(void *data __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   re->window->draw.redraw = 0;
+}
+
+#define SLOW_GL_COPY_RECT 1
+/* vsync games - not for now though */
+//#define VSYNC_TO_SCREEN 1
+
+static void *
+eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_gl_common_context_flush(re->window->gl_context);
+   /* get the upate rect surface - return engine data as dummy */
+   if (!re->window->draw.redraw)
+     {
+//     printf("GL: NO updates!\n");
+       return NULL;
+     }
+//   printf("GL: update....!\n");
+#ifdef SLOW_GL_COPY_RECT
+   /* if any update - just return the whole canvas - works with swap
+    * buffers then */
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = re->window->width;
+   if (h) *h = re->window->height;
+   if (cx) *cx = 0;
+   if (cy) *cy = 0;
+   if (cw) *cw = re->window->width;
+   if (ch) *ch = re->window->height;
+#else
+   /* 1 update - INCREDIBLY SLOW if combined with swap_rect in flush. a gl
+    * problem where there just is no hardware path for somethnig that
+    * obviously SHOULD be there */
+   /* only 1 update to minimise gl context games and rendering multiple update
+    * regions as evas does with other engines
+    */
+   if (x) *x = re->window->draw.x1;
+   if (y) *y = re->window->draw.y1;
+   if (w) *w = re->window->draw.x2 - re->window->draw.x1 + 1;
+   if (h) *h = re->window->draw.y2 - re->window->draw.y1 + 1;
+   if (cx) *cx = re->window->draw.x1;
+   if (cy) *cy = re->window->draw.y1;
+   if (cw) *cw = re->window->draw.x2 - re->window->draw.x1 + 1;
+   if (ch) *ch = re->window->draw.y2 - re->window->draw.y1 + 1;
+#endif
+// clear buffer. only needed for dest alpha
+//   glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+//   glClear(GL_COLOR_BUFFER_BIT);
+   return re;
+}
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   /* put back update surface.. in this case just unflag redraw */
+   re->window->draw.redraw = 0;
+   re->window->draw.drew = 1;
+   evas_gl_common_context_flush(re->window->gl_context);
+}
+
+static void
+eng_output_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (!re->window->draw.drew) return;
+
+   re->window->draw.drew = 0;
+   eng_window_use(re->window);
+
+#ifdef VSYNC_TO_SCREEN
+   eng_window_vsync_set(1);
+#endif
+#ifdef SLOW_GL_COPY_RECT
+   eng_window_swap_buffers(re->window);
+#else
+   /* SLOW AS ALL HELL */
+   evas_gl_common_swap_rect(re->window->gl_context,
+                           re->window->draw.x1, re->window->draw.y1,
+                           re->window->draw.x2 - re->window->draw.x1 + 1,
+                           re->window->draw.y2 - re->window->draw.y1 + 1);
+#endif
+}
+
+static void
+eng_output_idle_flush(void *data __UNUSED__)
+{
+}
+
+static void
+eng_output_dump(void *data __UNUSED__)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_image_image_all_unload();
+   evas_common_font_font_all_unload();
+   evas_gl_common_image_all_unload(re->window->gl_context);
+}
+
+static void
+eng_context_cutout_add(void *data __UNUSED__, void *context, int x, int y, int w, int h)
+{
+   evas_common_draw_context_add_cutout(context, x, y, w, h);
+}
+
+static void
+eng_context_cutout_clear(void *data __UNUSED__, void *context)
+{
+   evas_common_draw_context_clear_cutouts(context);
+}
+
+static void
+eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_use(re->window);
+   re->window->gl_context->dc = context;
+   evas_gl_common_rect_draw(re->window->gl_context, x, y, w, h);
+}
+
+static void
+eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_use(re->window);
+   re->window->gl_context->dc = context;
+//-//   evas_gl_common_line_draw(re->win->gl_context, x1, y1, x2, y2);
+}
+
+static void *
+eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+//--//      return evas_gl_common_poly_point_add(polygon, x, y);
+   return NULL;
+
+}
+
+static void *
+eng_polygon_points_clear(void *data, void *context, void *polygon)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+//--//      return evas_gl_common_poly_points_clear(polygon);
+   return NULL;
+}
+
+static void
+eng_polygon_draw(void *data, void *context, void *surface, void *polygon, int x, int y)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   re->window->gl_context->dc = context;
+//--//   evas_gl_common_poly_draw(re->window->gl_context, polygon, x, y);
+}
+
+static void
+eng_gradient2_color_np_stop_insert(void *data __UNUSED__, void *gradient __UNUSED__, int r __UNUSED__, int g __UNUSED__, int b __UNUSED__, int a __UNUSED__, float pos __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_clear(void *data __UNUSED__, void *gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_fill_transform_set(void *data __UNUSED__, void *gradient __UNUSED__, void *transform __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_fill_spread_set
+(void *data __UNUSED__, void *gradient __UNUSED__, int spread __UNUSED__)
+{
+}
+
+static void *
+eng_gradient2_linear_new(void *data __UNUSED__)
+{
+   return NULL;
+}
+
+static void
+eng_gradient2_linear_free(void *data __UNUSED__, void *linear_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_linear_fill_set(void *data __UNUSED__, void *linear_gradient __UNUSED__, int x0 __UNUSED__, int y0 __UNUSED__, int x1 __UNUSED__, int y1 __UNUSED__)
+{
+}
+
+static int
+eng_gradient2_linear_is_opaque(void *data __UNUSED__, void *context __UNUSED__, void *linear_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   return 1;
+}
+
+static int
+eng_gradient2_linear_is_visible(void *data __UNUSED__, void *context __UNUSED__, void *linear_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   return 1;
+}
+
+static void
+eng_gradient2_linear_render_pre(void *data __UNUSED__, void *context __UNUSED__, void *linear_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_linear_render_post(void *data __UNUSED__, void *linear_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_linear_draw(void *data __UNUSED__, void *context __UNUSED__, void *surface __UNUSED__, void *linear_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+}
+
+static void *
+eng_gradient2_radial_new(void *data __UNUSED__)
+{
+   return NULL;
+}
+
+static void
+eng_gradient2_radial_free(void *data __UNUSED__, void *radial_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_radial_fill_set(void *data __UNUSED__, void *radial_gradient __UNUSED__, float cx __UNUSED__, float cy __UNUSED__, float rx __UNUSED__, float ry __UNUSED__)
+{
+}
+
+static int
+eng_gradient2_radial_is_opaque(void *data __UNUSED__, void *context __UNUSED__, void *radial_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   return 1;
+}
+
+static int
+eng_gradient2_radial_is_visible(void *data __UNUSED__, void *context __UNUSED__, void *radial_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   return 1;
+}
+
+static void
+eng_gradient2_radial_render_pre(void *data __UNUSED__, void *context __UNUSED__, void *radial_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_radial_render_post(void *data __UNUSED__, void *radial_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_radial_draw(void *data __UNUSED__, void *context __UNUSED__, void *surface __UNUSED__, void *radial_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+}
+
+static void *
+eng_gradient_new(void *data __UNUSED__)
+{
+//--//      return evas_gl_common_gradient_new();
+   return NULL;
+}
+
+static void
+eng_gradient_color_stop_add(void *data __UNUSED__, void *gradient, int r, int g, int b, int a, int delta)
+{
+//--//      evas_gl_common_gradient_color_stop_add(gradient, r, g, b, a, delta);
+}
+
+static void
+eng_gradient_alpha_stop_add(void *data __UNUSED__, void *gradient, int a, int delta)
+{
+//--//      evas_gl_common_gradient_alpha_stop_add(gradient, a, delta);
+}
+
+static void
+eng_gradient_clear(void *data __UNUSED__, void *gradient)
+{
+//--//      evas_gl_common_gradient_clear(gradient);
+}
+
+static void
+eng_gradient_color_data_set(void *data __UNUSED__, void *gradient, void *map, int len, int has_alpha)
+{
+//--//      evas_gl_common_gradient_color_data_set(gradient, map, len, has_alpha);
+}
+
+static void
+eng_gradient_alpha_data_set(void *data __UNUSED__, void *gradient, void *alpha_map, int len)
+{
+//--//      evas_gl_common_gradient_alpha_data_set(gradient, alpha_map, len);
+}
+
+static void
+eng_gradient_free(void *data __UNUSED__, void *gradient)
+{
+//--//      evas_gl_common_gradient_free(gradient);
+}
+
+static void
+eng_gradient_fill_set(void *data __UNUSED__, void *gradient, int x, int y, int w, int h)
+{
+//--//      evas_gl_common_gradient_fill_set(gradient, x, y, w, h);
+}
+
+static void
+eng_gradient_fill_angle_set(void *data __UNUSED__, void *gradient, double angle)
+{
+//--//      evas_gl_common_gradient_fill_angle_set(gradient, angle);
+}
+
+static void
+eng_gradient_fill_spread_set(void *data __UNUSED__, void *gradient, int spread)
+{
+//--//      evas_gl_common_gradient_fill_spread_set(gradient, spread);
+}
+
+static void
+eng_gradient_angle_set(void *data __UNUSED__, void *gradient, double angle)
+{
+//--//      evas_gl_common_gradient_map_angle_set(gradient, angle);
+}
+
+static void
+eng_gradient_offset_set(void *data __UNUSED__, void *gradient, float offset)
+{
+//--//      evas_gl_common_gradient_map_offset_set(gradient, offset);
+}
+
+static void
+eng_gradient_direction_set(void *data __UNUSED__, void *gradient, int direction)
+{
+//--//      evas_gl_common_gradient_map_direction_set(gradient, direction);
+}
+
+static void
+eng_gradient_type_set(void *data __UNUSED__, void *gradient, char *name, char *params)
+{
+//--//      evas_gl_common_gradient_type_set(gradient, name, params);
+}
+
+static int
+eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->window->gl_context->dc = context;
+//--//      return evas_gl_common_gradient_is_opaque(re->window->gl_context, gradient, x, y, w, h);
+   return 0;
+}
+
+static int
+eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->window->gl_context->dc = context;
+//--//      return evas_gl_common_gradient_is_visible(re->window->gl_context, gradient, x, y, w, h);
+   return 0;
+}
+
+static void
+eng_gradient_render_pre(void *data, void *context, void *gradient)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->window->gl_context->dc = context;
+//--//      evas_gl_common_gradient_render_pre(re->window->gl_context, gradient);
+}
+
+static void
+eng_gradient_render_post(void *data __UNUSED__, void *gradient)
+{
+//--//      evas_gl_common_gradient_render_post(gradient);
+}
+
+static void
+eng_gradient_draw(void *data, void *context, void *surface __UNUSED__, void *gradient, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_use(re->window);
+   re->window->gl_context->dc = context;
+//--//      evas_gl_common_gradient_draw(re->window->gl_context, gradient, x, y, w, h);
+}
+
+static int
+eng_image_alpha_get(void *data, void *image)
+{
+   Evas_GL_Image *im;
+
+   if (!image) return 1;
+   im = image;
+   /* FIXME: can move to gl_common */
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (im->im->cache_entry.flags.alpha) return 1;
+      default:
+       break;
+     }
+   return 0;
+}
+
+static int
+eng_image_colorspace_get(void *data, void *image)
+{
+   Evas_GL_Image *im;
+
+   if (!image) return EVAS_COLORSPACE_ARGB8888;
+   im = image;
+   return im->cs.space;
+}
+
+static void *
+eng_image_alpha_set(void *data, void *image, int has_alpha)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im;
+
+   re = (Render_Engine *)data;
+   if (!image) return NULL;
+   eng_window_use(re->window);
+   im = image;
+   /* FIXME: can move to gl_common */
+   if (im->cs.space != EVAS_COLORSPACE_ARGB8888) return im;
+   if ((has_alpha) && (im->im->cache_entry.flags.alpha)) return image;
+   else if ((!has_alpha) && (!im->im->cache_entry.flags.alpha)) return image;
+   if (im->references > 1)
+    {
+       Evas_GL_Image *im_new;
+
+        im_new = evas_gl_common_image_new_from_copied_data(im->gc, im->im->cache_entry.w, im->im->cache_entry.h, im->im->image.data,
+                                                          eng_image_alpha_get(data, image),
+                                                          eng_image_colorspace_get(data, image));
+       if (!im_new) return im;
+       evas_gl_common_image_free(im);
+       im = im_new;
+     }
+   else
+     evas_gl_common_image_dirty(im);
+   im->im->cache_entry.flags.alpha = has_alpha ? 1 : 0;
+   return image;
+}
+
+static void *
+eng_image_border_set(void *data __UNUSED__, void *image, int l __UNUSED__, int r __UNUSED__, int t __UNUSED__, int b __UNUSED__)
+{
+   return image;
+}
+
+static void
+eng_image_border_get(void *data __UNUSED__, void *image __UNUSED__, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__)
+{
+}
+
+static char *
+eng_image_comment_get(void *data __UNUSED__, void *image, char *key __UNUSED__)
+{
+   Evas_GL_Image *im;
+
+   if (!image) return NULL;
+   im = (Evas_GL_Image *)image;
+   return im->im->info.comment;
+}
+
+static char *
+eng_image_format_get(void *data __UNUSED__, void *image)
+{
+   Evas_GL_Image *im;
+
+   im = image;
+   return NULL;
+}
+
+static void
+eng_image_colorspace_set(void *data, void *image, int cspace)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im;
+
+   re = (Render_Engine *)data;
+   if (!image) return;
+   im = image;
+   /* FIXME: can move to gl_common */
+   if (im->cs.space == cspace) return;
+   eng_window_use(re->window);
+   evas_cache_image_colorspace(&im->im->cache_entry, cspace);
+   switch (cspace)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (im->cs.data)
+         {
+            if (!im->cs.no_free) free(im->cs.data);
+            im->cs.data = NULL;
+            im->cs.no_free = 0;
+         }
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       if (im->tex) evas_gl_common_texture_free(im->tex);
+       im->tex = NULL;
+       if (im->cs.data)
+         {
+            if (!im->cs.no_free) free(im->cs.data);
+         }
+       im->cs.data = calloc(1, im->im->cache_entry.h * sizeof(unsigned char *) * 2);
+       im->cs.no_free = 0;
+       break;
+      default:
+       abort();
+       break;
+     }
+   im->cs.space = cspace;
+}
+
+static void
+eng_image_native_set(void *data __UNUSED__, void *image __UNUSED__, void *native __UNUSED__)
+{
+}
+
+static void *
+eng_image_native_get(void *data __UNUSED__, void *image __UNUSED__)
+{
+   return NULL;
+}
+
+static void *
+eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   *error = EVAS_LOAD_ERROR_NONE;
+   eng_window_use(re->window);
+   return evas_gl_common_image_load(re->window->gl_context, file, key, lo, error);
+}
+
+static void *
+eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_use(re->window);
+   return evas_gl_common_image_new_from_data(re->window->gl_context, w, h, image_data, alpha, cspace);
+}
+
+static void *
+eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_use(re->window);
+   return evas_gl_common_image_new_from_copied_data(re->window->gl_context, w, h, image_data, alpha, cspace);
+}
+
+static void
+eng_image_free(void *data, void *image)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (!image) return;
+   eng_window_use(re->window);
+   evas_gl_common_image_free(image);
+}
+
+static void
+eng_image_size_get(void *data __UNUSED__, void *image, int *w, int *h)
+{
+   if (!image)
+     {
+       *w = 0;
+       *h = 0;
+       return;
+     }
+   if (w) *w = ((Evas_GL_Image *)image)->im->cache_entry.w;
+   if (h) *h = ((Evas_GL_Image *)image)->im->cache_entry.h;
+
+}
+
+static void *
+eng_image_size_set(void *data, void *image, int w, int h)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im, *im_old;
+
+   re = (Render_Engine *)data;
+   if (!image) return NULL;
+   eng_window_use(re->window);
+   im_old = image;
+   if ((eng_image_colorspace_get(data, image) == EVAS_COLORSPACE_YCBCR422P601_PL) ||
+       (eng_image_colorspace_get(data, image) == EVAS_COLORSPACE_YCBCR422P709_PL))
+     w &= ~0x1;
+   if ((im_old) && (im_old->im->cache_entry.w == w) && (im_old->im->cache_entry.h == h))
+
+     return image;
+   if (im_old)
+     {
+       im = evas_gl_common_image_new(re->window->gl_context, w, h,
+                                     eng_image_alpha_get(data, image),
+                                     eng_image_colorspace_get(data, image));
+/*
+       evas_common_load_image_data_from_file(im_old->im);
+       if (im_old->im->image->data)
+         {
+            evas_common_blit_rectangle(im_old->im, im->im, 0, 0, w, h, 0, 0);
+            evas_common_cpu_end_opt();
+         }
+ */
+       evas_gl_common_image_free(im_old);
+     }
+   else
+     im = evas_gl_common_image_new(re->window->gl_context, w, h, 1, EVAS_COLORSPACE_ARGB8888);
+   return im;
+}
+
+static void *
+eng_image_dirty_region(void *data, void *image, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (!image) return NULL;
+   eng_window_use(re->window);
+   evas_gl_common_image_dirty(image);
+   return image;
+}
+
+static void *
+eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im;
+
+   re = (Render_Engine *)data;
+   if (!image)
+     {
+       *image_data = NULL;
+       return NULL;
+     }
+   im = image;
+   eng_window_use(re->window);
+   evas_cache_image_load_data(&im->im->cache_entry);
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (to_write)
+         {
+            if (im->references > 1)
+              {
+                 Evas_GL_Image *im_new;
+
+                 im_new = evas_gl_common_image_new_from_copied_data(im->gc, im->im->cache_entry.w, im->im->cache_entry.h, im->im->image.data,
+                                                                    eng_image_alpha_get(data, image),
+                                                                    eng_image_colorspace_get(data, image));
+                 if (!im_new)
+                   {
+                      *image_data = NULL;
+                      return im;
+                   }
+                 evas_gl_common_image_free(im);
+                 im = im_new;
+              }
+            else
+              evas_gl_common_image_dirty(im);
+         }
+       *image_data = im->im->image.data;
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       *image_data = im->cs.data;
+       break;
+      default:
+       abort();
+       break;
+     }
+   return im;
+}
+
+static void *
+eng_image_data_put(void *data, void *image, DATA32 *image_data)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im, *im2;
+
+   re = (Render_Engine *)data;
+   if (!image) return NULL;
+   im = image;
+   eng_window_use(re->window);
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (image_data != im->im->image.data)
+         {
+            int w, h;
+
+            w = im->im->cache_entry.w;
+            h = im->im->cache_entry.h;
+            im2 = eng_image_new_from_data(data, w, h, image_data,
+                                          eng_image_alpha_get(data, image),
+                                          eng_image_colorspace_get(data, image));
+            if (!im2) return im;
+            evas_gl_common_image_free(im);
+            im = im2;
+         }
+        break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+        if (image_data != im->cs.data)
+         {
+            if (im->cs.data)
+              {
+                 if (!im->cs.no_free) free(im->cs.data);
+              }
+            im->cs.data = image_data;
+         }
+       break;
+      default:
+       abort();
+       break;
+     }
+   /* hmmm - but if we wrote... why bother? */
+   evas_gl_common_image_dirty(im);
+   return im;
+}
+
+static void
+eng_image_data_preload_request(void *data __UNUSED__, void *image, const void *target)
+{
+   Evas_GL_Image *gim = image;
+   RGBA_Image *im;
+
+   if (!gim) return ;
+   im = (RGBA_Image*) gim->im;
+   if (!im) return ;
+   evas_cache_image_preload_data(&im->cache_entry, target);
+}
+
+static void
+eng_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target)
+{
+   Evas_GL_Image *gim = image;
+   RGBA_Image *im;
+
+   if (!gim) return ;
+   im = (RGBA_Image*) gim->im;
+   if (!im) return ;
+   evas_cache_image_preload_cancel(&im->cache_entry, target);
+}
+
+static void
+eng_image_draw(void *data, void *context, void *surface __UNUSED__, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (!image) return;
+   eng_window_use(re->window);
+   re->window->gl_context->dc = context;
+   evas_gl_common_image_draw(re->window->gl_context, image,
+                            src_x, src_y, src_w, src_h,
+                            dst_x, dst_y, dst_w, dst_h,
+                            smooth);
+}
+
+static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image __UNUSED__, int hint __UNUSED__)
+{
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image __UNUSED__)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+static void
+eng_image_map4_draw(void *data __UNUSED__, void *context, void *surface, void *image, RGBA_Map_Point *p, int smooth, int level)
+{
+   // XXX
+}
+
+static void *
+eng_image_map_surface_new(void *data __UNUSED__, int w, int h, int alpha)
+{
+   // XXX
+   return NULL;
+}
+
+static void
+eng_image_map_surface_free(void *data __UNUSED__, void *surface)
+{
+   // XXX
+}
+
+static void
+eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_use(re->window);
+     {
+        // FIXME: put im into context so we can free it
+       static RGBA_Image *im = NULL;
+
+       if (!im)
+          im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get());
+        if (!im) return;
+        im->cache_entry.w = re->window->width;
+        im->cache_entry.h = re->window->height;
+       evas_common_draw_context_font_ext_set(context,
+                                             re->window->gl_context,
+                                             evas_gl_font_texture_new,
+                                             evas_gl_font_texture_free,
+                                             evas_gl_font_texture_draw);
+       evas_common_font_draw(im, context, font, x, y, text);
+       evas_common_draw_context_font_ext_set(context,
+                                             NULL,
+                                             NULL,
+                                             NULL,
+                                             NULL);
+     }
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data __UNUSED__, void *info __UNUSED__)
+{
+   // FIXME: support ARGB gl targets!!!
+   return EINA_FALSE;
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
+   _evas_engine_GL_glew_log_dom = eina_log_domain_register("EvasGLGlew", EVAS_DEFAULT_LOG_COLOR);
+   if(_evas_engine_GL_glew_log_dom < 0) 
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for GL (Glew) engine.\n");
+       return 0;
+     }
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+   #define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(canvas_alpha_get);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(context_cutout_add);
+   ORD(context_cutout_clear);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   ORD(output_dump);
+   ORD(rectangle_draw);
+   ORD(line_draw);
+   ORD(polygon_point_add);
+   ORD(polygon_points_clear);
+   ORD(polygon_draw);
+
+   ORD(gradient2_color_np_stop_insert);
+   ORD(gradient2_clear);
+   ORD(gradient2_fill_transform_set);
+   ORD(gradient2_fill_spread_set);
+   ORD(gradient2_linear_new);
+   ORD(gradient2_linear_free);
+   ORD(gradient2_linear_fill_set);
+   ORD(gradient2_linear_is_opaque);
+   ORD(gradient2_linear_is_visible);
+   ORD(gradient2_linear_render_pre);
+   ORD(gradient2_linear_render_post);
+   ORD(gradient2_linear_draw);
+   ORD(gradient2_radial_new);
+   ORD(gradient2_radial_free);
+   ORD(gradient2_radial_fill_set);
+   ORD(gradient2_radial_is_opaque);
+   ORD(gradient2_radial_is_visible);
+   ORD(gradient2_radial_render_pre);
+   ORD(gradient2_radial_render_post);
+   ORD(gradient2_radial_draw);
+
+   ORD(gradient_new);
+   ORD(gradient_free);
+   ORD(gradient_color_stop_add);
+   ORD(gradient_alpha_stop_add);
+   ORD(gradient_color_data_set);
+   ORD(gradient_alpha_data_set);
+   ORD(gradient_clear);
+   ORD(gradient_fill_set);
+   ORD(gradient_fill_angle_set);
+   ORD(gradient_fill_spread_set);
+   ORD(gradient_angle_set);
+   ORD(gradient_offset_set);
+   ORD(gradient_direction_set);
+   ORD(gradient_type_set);
+   ORD(gradient_is_opaque);
+   ORD(gradient_is_visible);
+   ORD(gradient_render_pre);
+   ORD(gradient_render_post);
+   ORD(gradient_draw);
+
+   ORD(image_load);
+   ORD(image_new_from_data);
+   ORD(image_new_from_copied_data);
+   ORD(image_free);
+   ORD(image_size_get);
+   ORD(image_size_set);
+   ORD(image_dirty_region);
+   ORD(image_data_get);
+   ORD(image_data_put);
+   ORD(image_data_preload_request);
+   ORD(image_data_preload_cancel);
+   ORD(image_alpha_set);
+   ORD(image_alpha_get);
+   ORD(image_border_set);
+   ORD(image_border_get);
+   ORD(image_draw);
+   ORD(image_comment_get);
+   ORD(image_format_get);
+   ORD(image_colorspace_set);
+   ORD(image_colorspace_get);
+   ORD(image_native_set);
+   ORD(image_native_get);
+
+   ORD(font_draw);
+   
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+   
+   ORD(image_map4_draw);
+   ORD(image_map_surface_new);
+   ORD(image_map_surface_free);
+   
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+  eina_log_domain_unregister(_evas_engine_GL_glew_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "gl_glew",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, gl_glew);
+
+#ifndef EVAS_STATIC_BUILD_GL_GLEW
+EVAS_EINA_MODULE_DEFINE(engine, gl_glew);
+#endif
diff --git a/src/modules/engines/gl_glew/evas_engine.h b/src/modules/engines/gl_glew/evas_engine.h
new file mode 100644 (file)
index 0000000..d38c4fa
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef __EVAS_ENGINE_H__
+#define __EVAS_ENGINE_H__
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <windows.h>
+
+#include "evas_gl_common.h"
+#include "Evas_Engine_GL_Glew.h"
+
+extern int _evas_engine_GL_glew_log_dom ;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_GL_glew_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_GL_glew_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_GL_glew_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_GL_glew_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_GL_glew_log_dom, __VA_ARGS__)
+
+typedef struct _Evas_GL_Glew_Window Evas_GL_Glew_Window;
+
+struct _Evas_GL_Glew_Window
+{
+#ifdef _WIN32
+   HWND             window;
+   HDC              dc;
+   HGLRC            context;
+#endif
+   int              width;
+   int              height;
+   int              depth;
+   Evas_GL_Context *gl_context;
+   struct {
+      int           x1;
+      int           y1;
+      int           x2;
+      int           y2;
+      int           redraw : 1;
+      int           drew : 1;
+   } draw;
+};
+
+#ifdef _WIN32
+Evas_GL_Glew_Window *eng_window_new(HWND window,
+                                    int  depth,
+                                    int  width,
+                                    int  height);
+#endif
+
+void eng_window_free(Evas_GL_Glew_Window *gw);
+void eng_window_use(Evas_GL_Glew_Window *gw);
+void eng_window_swap_buffers(Evas_GL_Glew_Window *gw);
+void eng_window_vsync_set(int on);
+
+
+#endif /* __EVAS_ENGINE_H__ */
diff --git a/src/modules/engines/gl_glew/evas_glew_win32_main.c b/src/modules/engines/gl_glew/evas_glew_win32_main.c
new file mode 100644 (file)
index 0000000..aea7ce5
--- /dev/null
@@ -0,0 +1,133 @@
+#include "evas_engine.h"
+
+#ifdef HAVE_GL_GLEW_H
+# include <GL/wglew.h>
+#endif
+
+static Evas_GL_Glew_Window *_evas_gl_glew_window = NULL;
+
+Evas_GL_Glew_Window *
+eng_window_new(HWND  window,
+               int   depth,
+               int   width,
+               int   height)
+{
+   PIXELFORMATDESCRIPTOR pfd;
+   Evas_GL_Glew_Window  *gw;
+   int                   format;
+
+   gw = calloc(1, sizeof(Evas_GL_Glew_Window));
+   if (!gw) return NULL;
+
+   gw->window = window;
+   gw->depth = depth;
+
+   gw->dc = GetDC(window);
+   if (!gw->dc)
+    goto free_window;
+
+   ZeroMemory(&pfd, sizeof (pfd));
+   pfd.nSize = sizeof (pfd);
+   pfd.nVersion = 1;
+   pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
+   pfd.iPixelType = PFD_TYPE_RGBA;
+   pfd.cColorBits = 24;
+   pfd.cDepthBits = 32;
+   pfd.iLayerType = PFD_MAIN_PLANE;
+
+   format = ChoosePixelFormat(gw->dc, &pfd);
+   if (!format)
+     goto release_dc;
+
+   SetPixelFormat(gw->dc, format, &pfd);
+
+   if (pfd.iPixelType != PFD_TYPE_RGBA)
+     goto release_dc;
+
+   gw->context = wglCreateContext(gw->dc);
+   if (!gw->context)
+     goto release_dc;
+
+   wglMakeCurrent(gw->dc, gw->context);
+
+   if (glewInit() != GLEW_OK)
+     goto delete_context;
+
+   if (!GLEW_VERSION_2_0)
+     {
+        fprintf(stderr, "\nERROR: OpenGL 2.0 not supported. Exiting...\n\n");
+        goto delete_context;
+     }
+
+   _evas_gl_glew_window = gw;
+
+   gw->gl_context = evas_gl_common_context_new();
+   if (!gw->gl_context)
+     goto delete_context;
+   evas_gl_common_context_resize(gw->gl_context, width, height);
+
+   return gw;
+
+ delete_context:
+   wglMakeCurrent(NULL, NULL);
+   wglDeleteContext(gw->context);
+ release_dc:
+   ReleaseDC(window, gw->dc);
+ free_window:
+   free(gw);
+
+   return NULL;
+}
+
+void
+eng_window_free(Evas_GL_Glew_Window *gw)
+{
+   if (!gw)
+     return;
+   if (gw == _evas_gl_glew_window) _evas_gl_glew_window = NULL;
+   evas_gl_common_context_free(gw->gl_context);
+   wglMakeCurrent(NULL, NULL);
+   wglDeleteContext(gw->context);
+   ReleaseDC(gw->window, gw->dc);
+   free(gw);
+}
+
+void
+eng_window_use(Evas_GL_Glew_Window *gw)
+{
+   if (_evas_gl_glew_window != gw)
+     {
+        if (_evas_gl_glew_window)
+          evas_gl_common_context_flush(_evas_gl_glew_window->gl_context);
+        _evas_gl_glew_window = gw;
+        wglMakeCurrent(gw->dc, gw->context);
+     }
+   evas_gl_common_context_use(gw->gl_context);
+}
+
+void
+eng_window_swap_buffers(Evas_GL_Glew_Window *gw)
+{
+   SwapBuffers(gw->dc);
+}
+
+void
+eng_window_vsync_set(int on)
+{
+#if 1 /* Using Glew */
+   wglSwapIntervalEXT(on);
+#else /* Using plain OpenGL */
+   const char *extensions = glGetString(GL_EXTENSIONS);
+
+   /* check if WGL_EXT_swap_control extension is supported */
+   if (strstr(extensions, "WGL_EXT_swap_control") == 0)
+     return;
+   else
+     {
+        wglSwapIntervalEXT = (PFNWGLSWAPINTERVALFARPROC)wglGetProcAddress("wglSwapIntervalEXT");
+
+        if (wglSwapIntervalEXT)
+          wglSwapIntervalEXT(on);
+     }
+#endif
+}
diff --git a/src/modules/engines/gl_sdl/Evas_Engine_GL_SDL.h b/src/modules/engines/gl_sdl/Evas_Engine_GL_SDL.h
new file mode 100644 (file)
index 0000000..3804aa0
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef _EVAS_ENGINE_GL_SDL_H
+#define _EVAS_ENGINE_GL_SDL_H
+
+#include <SDL/SDL.h>
+
+typedef struct _Evas_Engine_Info_GL_SDL              Evas_Engine_Info_GL_SDL;
+
+struct _Evas_Engine_Info_GL_SDL
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   /* engine specific data & parameters it needs to set up */
+   struct {
+     int rotation;
+     int fullscreen : 1;
+     int noframe : 1;
+   } flags;
+   
+};
+#endif
+
+
diff --git a/src/modules/engines/gl_sdl/Makefile.am b/src/modules/engines/gl_sdl/Makefile.am
new file mode 100644 (file)
index 0000000..b275538
--- /dev/null
@@ -0,0 +1,43 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines/gl_common \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_engine_gl_sdl_cflags@
+
+if BUILD_ENGINE_GL_SDL
+
+GL_SDL_SOURCES = \
+evas_engine.c
+
+GL_SDL_LIBADD = @evas_engine_gl_sdl_libs@ $(top_builddir)/src/modules/engines/gl_common/libevas_engine_gl_common.la 
+
+pkgdir = $(libdir)/evas/modules/engines/gl_sdl/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_GL_SDL.h
+
+if !EVAS_STATIC_BUILD_GL_SDL
+
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = $(GL_SDL_SOURCES)
+module_la_LIBADD = @EINA_LIBS@ $(GL_SDL_LIBADD) $(top_builddir)/src/lib/libevas.la @dlopen_libs@
+module_la_LDFLAGS = -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_gl_sdl.la
+
+libevas_engine_gl_sdl_la_SOURCES = $(GL_SDL_SOURCES)
+libevas_engine_gl_sdl_la_LIBADD = $(GL_SDL_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/gl_sdl/evas_engine.c b/src/modules/engines/gl_sdl/evas_engine.c
new file mode 100644 (file)
index 0000000..bfbb120
--- /dev/null
@@ -0,0 +1,1420 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+#include <dlfcn.h>      /* dlopen,dlclose,etc */
+
+static void*                     _sdl_output_setup     (int w, int h, int fullscreen, int noframe);
+                
+int _evas_engine_GL_SDL_log_dom = -1;
+/* function tables - filled in later (func and parent func) */
+static Evas_Func func, pfunc;
+
+static void *
+eng_info(Evas *e)
+{
+   Evas_Engine_Info_GL_SDL *info;
+
+   info = calloc(1, sizeof(Evas_Engine_Info_GL_SDL));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   return info;
+}
+
+static void
+eng_info_free(Evas *e __UNUSED__, void *info)
+{
+   Evas_Engine_Info_GL_SDL *in;
+   in = (Evas_Engine_Info_GL_SDL *)info;
+   free(in);
+}
+
+static int
+eng_setup(Evas *e, void *in)
+{
+   Render_Engine *re;
+   Evas_Engine_Info_GL_SDL *info;
+
+   info = (Evas_Engine_Info_GL_SDL *)in;
+
+   SDL_Init(SDL_INIT_NOPARACHUTE);
+
+   if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
+     {
+       ERR("SDL_Init failed with %s", SDL_GetError());
+        SDL_Quit();
+        return 0;
+     }
+
+   re = _sdl_output_setup(e->output.w, e->output.h,
+                            info->flags.fullscreen,
+                            info->flags.noframe);
+   re->info = info;
+   e->engine.data.output = re;
+   if (!e->engine.data.output)
+     return 0;
+
+   e->engine.func = &func;
+   e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
+   
+   return 1;
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_gl_common_context_free(re->gl_context);
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+
+   SDL_QuitSubSystem(SDL_INIT_VIDEO);
+}
+
+static void
+eng_output_resize(void *data, int w, int h)
+{
+   Render_Engine       *re;
+   SDL_Surface         *surface;
+
+   re = (Render_Engine *)data;
+   re->w = w;
+   re->h = h;
+
+   if(SDL_GetVideoSurface()->flags & SDL_RESIZABLE)
+     {
+       surface = SDL_SetVideoMode(w, h, 32, EVAS_SDL_GL_FLAG
+                     | (re->info->flags.fullscreen ? SDL_FULLSCREEN : 0)
+                     | (re->info->flags.noframe ? SDL_NOFRAME : 0));
+       if (!surface)
+         {
+            ERR("Unable to change the resolution to : %ix%i", w, h);
+            SDL_Quit();
+            exit(-1);
+         }
+     }
+
+   evas_gl_common_context_resize(re->gl_context, w, h);
+}
+
+static void
+eng_output_tile_size_set(void *data, int w __UNUSED__, int h __UNUSED__)
+{
+//   Render_Engine *re;
+//
+//   re = (Render_Engine *)data;
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_gl_common_context_resize(re->gl_context, re->w, re->h);
+   /* smple bounding box */
+   if (!re->draw.redraw)
+     {
+#if 0
+       re->draw.x1 = x;
+       re->draw.y1 = y;
+       re->draw.x2 = x + w - 1;
+       re->draw.y2 = y + h - 1;
+#else
+       re->draw.x1 = 0;
+       re->draw.y1 = 0;
+       re->draw.x2 = re->w - 1;
+       re->draw.y2 = re->h - 1;
+#endif
+     }
+   else
+     {
+       if (x < re->draw.x1) re->draw.x1 = x;
+       if (y < re->draw.y1) re->draw.y1 = y;
+       if ((x + w - 1) > re->draw.x2) re->draw.x2 = x + w - 1;
+       if ((y + h - 1) > re->draw.y2) re->draw.y2 = y + h - 1;
+     }
+   re->draw.redraw = 1;
+}
+
+static void
+eng_output_redraws_rect_del(void *data, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+//   Render_Engine *re;
+//
+//   re = (Render_Engine *)data;
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   re->draw.redraw = 0;
+//   INF("GL: finish update cycle!");
+}
+
+/* at least the nvidia drivers are so abysmal that copying from the backbuffer
+ * to the front using glCopyPixels() that you literally can WATCH it draw the
+ * pixels slowly across the screen with a window update taking multiple
+ * seconds - so workaround by doing a full buffer render as frankly GL isn't
+ * up to doing anything that isn't done by quake (etc.)
+ */
+#define SLOW_GL_COPY_RECT 1
+/* vsync games - not for now though */
+//#define VSYNC_TO_SCREEN 1
+
+static void *
+eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_gl_common_context_flush(re->gl_context);
+   /* get the upate rect surface - return engine data as dummy */
+   if (!re->draw.redraw)
+     {
+//     printf("GL: NO updates!\n");
+       return NULL;
+     }
+//   printf("GL: update....!\n");
+#ifdef SLOW_GL_COPY_RECT
+   /* if any update - just return the whole canvas - works with swap
+    * buffers then */
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = re->w;
+   if (h) *h = re->h;
+   if (cx) *cx = 0;
+   if (cy) *cy = 0;
+   if (cw) *cw = re->w;
+   if (ch) *ch = re->h;
+#else
+   /* 1 update - INCREDIBLY SLOW if combined with swap_rect in flush. a gl
+    * problem where there just is no hardware path for somethnig that
+    * obviously SHOULD be there */
+   /* only 1 update to minimise gl context games and rendering multiple update
+    * regions as evas does with other engines
+    */
+   if (x) *x = re->draw.x1;
+   if (y) *y = re->draw.y1;
+   if (w) *w = re->draw.x2 - re->draw.x1 + 1;
+   if (h) *h = re->draw.y2 - re->draw.y1 + 1;
+   if (cx) *cx = re->draw.x1;
+   if (cy) *cy = re->draw.y1;
+   if (cw) *cw = re->draw.x2 - re->draw.x1 + 1;
+   if (ch) *ch = re->draw.y2 - re->draw.y1 + 1;
+#endif
+// clear buffer. only needed for dest alpha
+//   glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+//   glClear(GL_COLOR_BUFFER_BIT);
+//x//   printf("frame -> new\n");
+   return re->gl_context->def_surface;
+}
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   /* put back update surface.. in this case just unflag redraw */
+   re->draw.redraw = 0;
+   re->draw.drew = 1;
+   evas_gl_common_context_flush(re->gl_context);
+//x//   printf("frame -> push\n");
+}
+
+static void
+eng_output_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (!re->draw.drew) return;
+//x//   printf("frame -> flush\n");
+   re->draw.drew = 0;
+
+#if 0
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+//   glFlush();
+   eglSwapBuffers(re->egl_disp, re->egl_surface[0]);
+#else
+   glXSwapBuffers(re->win->disp, re->win);
+#endif   
+#else
+   SDL_GL_SwapBuffers();
+#endif
+}
+
+static void
+eng_output_idle_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+}
+
+static void
+eng_output_dump(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_image_image_all_unload();
+   evas_common_font_font_all_unload();
+   evas_gl_common_image_all_unload(re->gl_context);
+}
+
+static void
+eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h)
+{
+//   Render_Engine *re;
+//
+//   re = (Render_Engine *)data;
+//   re->gl_context->dc = context;
+   evas_common_draw_context_add_cutout(context, x, y, w, h);
+}
+
+static void
+eng_context_cutout_clear(void *data, void *context)
+{
+//   Render_Engine *re;
+//
+//   re = (Render_Engine *)data;
+//   re->gl_context->dc = context;
+   evas_common_draw_context_clear_cutouts(context);
+}
+
+static void
+eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_gl_common_context_target_surface_set(re->gl_context, surface);
+   re->gl_context->dc = context;
+   evas_gl_common_rect_draw(re->gl_context, x, y, w, h);
+}
+
+static void
+eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_gl_common_context_target_surface_set(re->gl_context, surface);
+   re->gl_context->dc = context;
+   evas_gl_common_line_draw(re->gl_context, x1, y1, x2, y2);
+}
+
+static void *
+eng_polygon_point_add(void *data, void *context __UNUSED__, void *polygon, int x, int y)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   return evas_gl_common_poly_point_add(polygon, x, y);
+}
+
+static void *
+eng_polygon_points_clear(void *data, void *context __UNUSED__, void *polygon)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   return evas_gl_common_poly_points_clear(polygon);
+}
+
+static void
+eng_polygon_draw(void *data, void *context, void *surface, void *polygon, int x, int y)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_gl_common_context_target_surface_set(re->gl_context, surface);
+   re->gl_context->dc = context;
+   evas_gl_common_poly_draw(re->gl_context, polygon, x, y);
+}
+
+static void
+eng_gradient2_color_np_stop_insert(void *data __UNUSED__, void *gradient __UNUSED__, int r __UNUSED__, int g __UNUSED__, int b __UNUSED__, int a __UNUSED__, float pos __UNUSED__)
+{
+   evas_common_gradient2_color_np_stop_insert(gradient, r, g, b, a, pos);
+}
+
+static void
+eng_gradient2_clear(void *data __UNUSED__, void *gradient __UNUSED__)
+{
+   evas_common_gradient2_clear(gradient);
+}
+
+static void
+eng_gradient2_fill_transform_set(void *data __UNUSED__, void *gradient __UNUSED__, void *transform __UNUSED__)
+{
+   evas_common_gradient2_fill_transform_set(gradient, transform);
+}
+
+static void
+eng_gradient2_fill_spread_set(void *data __UNUSED__, void *gradient __UNUSED__, int spread __UNUSED__)
+{
+   evas_common_gradient2_fill_spread_set(gradient, spread);
+}
+
+static void *
+eng_gradient2_linear_new(void *data __UNUSED__)
+{
+   return evas_common_gradient2_linear_new();
+}
+
+static void
+eng_gradient2_linear_free(void *data __UNUSED__, void *linear_gradient __UNUSED__)
+{
+   evas_common_gradient2_free(linear_gradient);
+}
+
+static void
+eng_gradient2_linear_fill_set(void *data __UNUSED__, void *linear_gradient __UNUSED__, float x0 __UNUSED__, float y0 __UNUSED__, float x1 __UNUSED__, float y1 __UNUSED__)
+{
+   evas_common_gradient2_linear_fill_set(linear_gradient, x0, y0, x1, y1);
+}
+
+static int
+eng_gradient2_linear_is_opaque(void *data __UNUSED__, void *context __UNUSED__, void *linear_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient2 *gr = (RGBA_Gradient2 *)linear_gradient;
+
+   if (!dc || !gr || !gr->type.geometer)  return 0;
+   return !(gr->type.geometer->has_alpha(gr, dc->render_op) |
+            gr->type.geometer->has_mask(gr, dc->render_op));
+}
+
+static int
+eng_gradient2_linear_is_visible(void *data __UNUSED__, void *context __UNUSED__, void *linear_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+
+   if (!dc || !linear_gradient)  return 0;
+   return 1;
+}
+
+static void
+eng_gradient2_linear_render_pre(void *data __UNUSED__, void *context __UNUSED__, void *linear_gradient __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient2 *gr = (RGBA_Gradient2 *)linear_gradient;
+   int  len;
+   
+   if (!dc || !gr || !gr->type.geometer)  return;
+   gr->type.geometer->geom_update(gr);
+   len = gr->type.geometer->get_map_len(gr);
+   evas_common_gradient2_map(dc, gr, len);
+}
+
+static void
+eng_gradient2_linear_render_post(void *data __UNUSED__, void *linear_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_linear_draw(void *data __UNUSED__, void *context __UNUSED__, void *surface __UNUSED__, void *linear_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   re->gl_context->dc = context;
+     {
+        Evas_GL_Image *gim;
+        RGBA_Image *im;
+        RGBA_Draw_Context *dc = context;
+        int op = dc->render_op, cuse = dc->clip.use;
+        
+        im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
+        im = (RGBA_Image *)evas_cache_image_size_set(&im->cache_entry, w, h);
+        
+        dc->render_op = _EVAS_RENDER_FILL;
+        dc->clip.use = 0;
+        
+        // draw to buf, copy to tex, draw tex
+        evas_common_gradient2_draw(im, dc, 0, 0, w, h, linear_gradient);
+
+        gim = evas_gl_common_image_new_from_data(re->gl_context, w, h,
+                                                 im->image.data, 1,
+                                                 EVAS_COLORSPACE_ARGB8888);
+        dc->render_op = op;
+        dc->clip.use = cuse;
+        evas_gl_common_image_draw(re->gl_context, gim, 0, 0, w, h, x, y, w, h, 0);
+        evas_cache_image_drop(&im->cache_entry);
+        evas_gl_common_image_free(gim);
+     }
+}
+
+static void *
+eng_gradient2_radial_new(void *data __UNUSED__)
+{
+   return evas_common_gradient2_radial_new();
+}
+
+static void
+eng_gradient2_radial_free(void *data __UNUSED__, void *radial_gradient __UNUSED__)
+{
+   evas_common_gradient2_free(radial_gradient);
+}
+
+static void
+eng_gradient2_radial_fill_set(void *data __UNUSED__, void *radial_gradient __UNUSED__, float cx __UNUSED__, float cy __UNUSED__, float rx __UNUSED__, float ry __UNUSED__)
+{
+   evas_common_gradient2_radial_fill_set(radial_gradient, cx, cy, rx, ry);
+}
+
+static int
+eng_gradient2_radial_is_opaque(void *data __UNUSED__, void *context __UNUSED__, void *radial_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient2 *gr = (RGBA_Gradient2 *)radial_gradient;
+   
+   if (!dc || !gr || !gr->type.geometer)  return 0;
+   return !(gr->type.geometer->has_alpha(gr, dc->render_op) |
+            gr->type.geometer->has_mask(gr, dc->render_op));
+}
+
+static int
+eng_gradient2_radial_is_visible(void *data __UNUSED__, void *context __UNUSED__, void *radial_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   
+   if (!dc || !radial_gradient)  return 0;
+   return 1;
+}
+
+static void
+eng_gradient2_radial_render_pre(void *data __UNUSED__, void *context __UNUSED__, void *radial_gradient __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient2 *gr = (RGBA_Gradient2 *)radial_gradient;
+   int  len;
+   
+   if (!dc || !gr || !gr->type.geometer)  return;
+   gr->type.geometer->geom_update(gr);
+   len = gr->type.geometer->get_map_len(gr);
+   evas_common_gradient2_map(dc, gr, len);
+}
+
+static void
+eng_gradient2_radial_render_post(void *data __UNUSED__, void *radial_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_radial_draw(void *data __UNUSED__, void *context __UNUSED__, void *surface __UNUSED__, void *radial_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   re->gl_context->dc = context;
+     {
+        Evas_GL_Image *gim;
+        RGBA_Image *im;
+        RGBA_Draw_Context *dc = context;
+        int op = dc->render_op, cuse = dc->clip.use;
+        
+        im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
+        im = (RGBA_Image *)evas_cache_image_size_set(&im->cache_entry, w, h);
+        
+        dc->render_op = _EVAS_RENDER_FILL;
+        dc->clip.use = 0;
+        
+        // draw to buf, copy to tex, draw tex
+        evas_common_gradient2_draw(im, dc, 0, 0, w, h, radial_gradient);
+
+        gim = evas_gl_common_image_new_from_data(re->gl_context, w, h,
+                                                 im->image.data, 1,
+                                                 EVAS_COLORSPACE_ARGB8888);
+        dc->render_op = op;
+        dc->clip.use = cuse;
+        evas_gl_common_image_draw(re->gl_context, gim, 0, 0, w, h, x, y, w, h, 0);
+        evas_cache_image_drop(&im->cache_entry);
+        evas_gl_common_image_free(gim);
+     }
+}
+
+static void *
+eng_gradient_new(void *data __UNUSED__)
+{
+   return evas_common_gradient_new();
+}
+
+static void
+eng_gradient_free(void *data __UNUSED__, void *gradient)
+{
+   evas_common_gradient_free(gradient);
+}
+
+static void
+eng_gradient_color_stop_add(void *data __UNUSED__, void *gradient, int r, int g, int b, int a, int delta)
+{
+   evas_common_gradient_color_stop_add(gradient, r, g, b, a, delta);
+}
+
+static void
+eng_gradient_alpha_stop_add(void *data __UNUSED__, void *gradient, int a, int delta)
+{
+   evas_common_gradient_alpha_stop_add(gradient, a, delta);
+}
+
+static void
+eng_gradient_color_data_set(void *data __UNUSED__, void *gradient, void *map, int len, int has_alpha)
+{
+   evas_common_gradient_color_data_set(gradient, map, len, has_alpha);
+}
+
+static void
+eng_gradient_alpha_data_set(void *data __UNUSED__, void *gradient, void *alpha_map, int len)
+{
+   evas_common_gradient_alpha_data_set(gradient, alpha_map, len);
+}
+
+static void
+eng_gradient_clear(void *data __UNUSED__, void *gradient)
+{
+   evas_common_gradient_clear(gradient);
+}
+
+static void
+eng_gradient_fill_set(void *data __UNUSED__, void *gradient, int x, int y, int w, int h)
+{
+   evas_common_gradient_fill_set(gradient, x, y, w, h);
+}
+
+static void
+eng_gradient_fill_angle_set(void *data __UNUSED__, void *gradient, double angle)
+{
+   evas_common_gradient_fill_angle_set(gradient, angle);
+}
+
+static void
+eng_gradient_fill_spread_set(void *data __UNUSED__, void *gradient, int spread)
+{
+   evas_common_gradient_fill_spread_set(gradient, spread);
+}
+
+static void
+eng_gradient_angle_set(void *data __UNUSED__, void *gradient, double angle)
+{
+   evas_common_gradient_map_angle_set(gradient, angle);
+}
+
+static void
+eng_gradient_offset_set(void *data __UNUSED__, void *gradient, float offset)
+{
+   evas_common_gradient_map_offset_set(gradient, offset);
+}
+
+static void
+eng_gradient_direction_set(void *data __UNUSED__, void *gradient, int direction)
+{
+   evas_common_gradient_map_direction_set(gradient, direction);
+}
+
+static void
+eng_gradient_type_set(void *data __UNUSED__, void *gradient, char *name, char *params)
+{
+   evas_common_gradient_type_set(gradient, name, params);
+}
+
+static int
+eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient *gr = (RGBA_Gradient *)gradient;
+   
+   if (!dc || !gr || !gr->type.geometer)  return 0;
+   return !(gr->type.geometer->has_alpha(gr, dc->render_op) |
+            gr->type.geometer->has_mask(gr, dc->render_op));
+}
+
+static int
+eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   
+   if (!dc || !gradient)  return 0;
+   return 1;
+}
+
+static void
+eng_gradient_render_pre(void *data, void *context, void *gradient)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient *gr = (RGBA_Gradient *)gradient;
+   int  len;
+   
+   if (!dc || !gr || !gr->type.geometer)  return;
+   gr->type.geometer->geom_set(gr);
+   len = gr->type.geometer->get_map_len(gr);
+   evas_common_gradient_map(dc, gr, len);
+}
+
+static void
+eng_gradient_render_post(void *data __UNUSED__, void *gradient)
+{
+}
+
+static void
+eng_gradient_draw(void *data, void *context, void *surface __UNUSED__, void *gradient, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   re->gl_context->dc = context;
+     {
+        Evas_GL_Image *gim;
+        RGBA_Image *im;
+        RGBA_Draw_Context *dc = context;
+        int op = dc->render_op, cuse = dc->clip.use;
+        
+        im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
+        im = (RGBA_Image *)evas_cache_image_size_set(&im->cache_entry, w, h);
+        
+        dc->render_op = _EVAS_RENDER_FILL;
+        dc->clip.use = 0;
+        
+        // draw to buf, copy to tex, draw tex
+        evas_common_gradient_draw(im, dc, 0, 0, w, h, gradient);
+
+        gim = evas_gl_common_image_new_from_data(re->gl_context, w, h,
+                                                 im->image.data, 1,
+                                                 EVAS_COLORSPACE_ARGB8888);
+        dc->render_op = op;
+        dc->clip.use = cuse;
+        evas_gl_common_image_draw(re->gl_context, gim, 0, 0, w, h, x, y, w, h, 0);
+        evas_cache_image_drop(&im->cache_entry);
+        evas_gl_common_image_free(gim);
+     }
+}
+
+static int
+eng_image_alpha_get(void *data, void *image)
+{
+//   Render_Engine *re;
+   Evas_GL_Image *im;
+
+//   re = (Render_Engine *)data;
+   if (!image) return 1;
+   im = image;
+   return im->alpha;
+}
+
+static int
+eng_image_colorspace_get(void *data, void *image)
+{
+//   Render_Engine *re;
+   Evas_GL_Image *im;
+
+//   re = (Render_Engine *)data;
+   if (!image) return EVAS_COLORSPACE_ARGB8888;
+   im = image;
+   return im->cs.space;
+}
+
+static void *
+eng_image_alpha_set(void *data, void *image, int has_alpha)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im;
+
+   re = (Render_Engine *)data;
+   if (!image) return NULL;
+   im = image;
+   if (im->native.data)
+     {
+        im->alpha = has_alpha;
+        return image;
+     }
+   /* FIXME: can move to gl_common */
+   if (im->cs.space != EVAS_COLORSPACE_ARGB8888) return im;
+   if ((has_alpha) && (im->im->cache_entry.flags.alpha)) return image;
+   else if ((!has_alpha) && (!im->im->cache_entry.flags.alpha)) return image;
+   if (im->references > 1)
+     {
+        Evas_GL_Image *im_new;
+        
+        im_new = evas_gl_common_image_new_from_copied_data(im->gc, im->im->cache_entry.w, im->im->cache_entry.h, im->im->image.data,
+                                                           eng_image_alpha_get(data, image),
+                                                           eng_image_colorspace_get(data, image));
+        if (!im_new) return im;
+        evas_gl_common_image_free(im);
+        im = im_new;
+     }
+   else
+     evas_gl_common_image_dirty(im, 0, 0, 0, 0);
+   im->im->cache_entry.flags.alpha = has_alpha ? 1 : 0;
+   return image;
+}
+
+static void *
+eng_image_border_set(void *data, void *image, int l __UNUSED__, int r __UNUSED__, int t __UNUSED__, int b __UNUSED__)
+{
+//   Render_Engine *re;
+//
+//   re = (Render_Engine *)data;
+   return image;
+}
+
+static void
+eng_image_border_get(void *data, void *image __UNUSED__, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__)
+{
+//   Render_Engine *re;
+//
+//   re = (Render_Engine *)data;
+}
+
+static char *
+eng_image_comment_get(void *data, void *image, char *key __UNUSED__)
+{
+//   Render_Engine *re;
+   Evas_GL_Image *im;
+
+//   re = (Render_Engine *)data;
+   if (!image) return NULL;
+   im = image;
+   if (!im->im) return NULL;
+   return im->im->info.comment;
+}
+
+static char *
+eng_image_format_get(void *data, void *image)
+{
+//   Render_Engine *re;
+   Evas_GL_Image *im;
+
+//   re = (Render_Engine *)data;
+   im = image;
+   return NULL;
+}
+
+static void
+eng_image_colorspace_set(void *data, void *image, int cspace)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im;
+
+   re = (Render_Engine *)data;
+   if (!image) return;
+   im = image;
+   if (im->native.data) return;
+   /* FIXME: can move to gl_common */
+   if (im->cs.space == cspace) return;
+   evas_cache_image_colorspace(&im->im->cache_entry, cspace);
+   switch (cspace)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (im->cs.data)
+         {
+            if (!im->cs.no_free) free(im->cs.data);
+            im->cs.data = NULL;
+            im->cs.no_free = 0;
+         }
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+        if (im->tex) evas_gl_common_texture_free(im->tex);
+        im->tex = NULL;
+       if (im->cs.data)
+         {
+            if (!im->cs.no_free) free(im->cs.data);
+         }
+       im->cs.data = calloc(1, im->im->cache_entry.h * sizeof(unsigned char *) * 2);
+       im->cs.no_free = 0;
+       break;
+      default:
+       abort();
+       break;
+     }
+   im->cs.space = cspace;
+}
+
+/////////////////////////////////////////////////////////////////////////
+//
+//
+typedef struct _Native Native;
+
+struct _Native
+{
+   Evas_Native_Surface ns;
+   
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+   EGLSurface  egl_surface;
+#endif
+};
+
+static void
+_native_bind_cb(void *data, void *image)
+{
+}
+
+static void
+_native_unbind_cb(void *data, void *image)
+{
+}
+
+static void
+_native_free_cb(void *data, void *image)
+{
+}
+
+static void
+eng_image_native_set(void *data, void *image, void *native)
+{
+}
+
+static void *
+eng_image_native_get(void *data, void *image)
+{
+   return NULL;
+}
+
+//
+//
+/////////////////////////////////////////////////////////////////////////
+
+static void *
+eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   *error = EVAS_LOAD_ERROR_NONE;
+   return evas_gl_common_image_load(re->gl_context, file, key, lo, error);
+}
+
+static void *
+eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   return evas_gl_common_image_new_from_data(re->gl_context, w, h, image_data, alpha, cspace);
+}
+
+static void *
+eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   return evas_gl_common_image_new_from_copied_data(re->gl_context, w, h, image_data, alpha, cspace);
+}
+
+static void
+eng_image_free(void *data, void *image)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (!image) return;
+   evas_gl_common_image_free(image);
+}
+
+static void
+eng_image_size_get(void *data, void *image, int *w, int *h)
+{
+//   Render_Engine *re;
+//
+//   re = (Render_Engine *)data;
+   if (!image)
+     {
+       *w = 0;
+       *h = 0;
+       return;
+     }
+   if (w) *w = ((Evas_GL_Image *)image)->w;
+   if (h) *h = ((Evas_GL_Image *)image)->h;
+}
+
+static void *
+eng_image_size_set(void *data, void *image, int w, int h)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im = image;
+   Evas_GL_Image *im_old;
+   
+   re = (Render_Engine *)data;
+   if (!im) return NULL;
+   if (im->native.data)
+     {
+        im->w = w;
+        im->h = h;
+        return image;
+     }
+   im_old = image;
+   if ((eng_image_colorspace_get(data, image) == EVAS_COLORSPACE_YCBCR422P601_PL) ||
+       (eng_image_colorspace_get(data, image) == EVAS_COLORSPACE_YCBCR422P709_PL))
+     w &= ~0x1;
+   if ((im_old) && (im_old->im->cache_entry.w == w) && (im_old->im->cache_entry.h == h))
+     return image;
+   if (im_old)
+     {
+       im = evas_gl_common_image_new(re->gl_context, w, h,
+                                     eng_image_alpha_get(data, image),
+                                     eng_image_colorspace_get(data, image));
+/*
+       evas_common_load_image_data_from_file(im_old->im);
+       if (im_old->im->image->data)
+         {
+            evas_common_blit_rectangle(im_old->im, im->im, 0, 0, w, h, 0, 0);
+            evas_common_cpu_end_opt();
+         }
+ */
+        evas_gl_common_image_free(im_old);
+     }
+   else
+     im = evas_gl_common_image_new(re->gl_context, w, h, 1, EVAS_COLORSPACE_ARGB8888);
+   return im;
+}
+
+static void *
+eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im = image;
+
+   re = (Render_Engine *)data;
+   if (!image) return NULL;
+   if (im->native.data) return image;
+   evas_gl_common_image_dirty(image, x, y, w, h);
+   return image;
+}
+
+static void *
+eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im;
+
+   re = (Render_Engine *)data;
+   if (!image)
+     {
+       *image_data = NULL;
+       return NULL;
+     }
+   im = image;
+   if (im->native.data)
+     {
+        *image_data = NULL;
+        return im;
+     }
+   evas_cache_image_load_data(&im->im->cache_entry);
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (to_write)
+         {
+            if (im->references > 1)
+              {
+                 Evas_GL_Image *im_new;
+
+                 im_new = evas_gl_common_image_new_from_copied_data(im->gc, im->im->cache_entry.w, im->im->cache_entry.h, im->im->image.data,
+                                                                    eng_image_alpha_get(data, image),
+                                                                    eng_image_colorspace_get(data, image));
+                 if (!im_new)
+                   {
+                      *image_data = NULL;
+                      return im;
+                   }
+                 evas_gl_common_image_free(im);
+                 im = im_new;
+              }
+            else
+              evas_gl_common_image_dirty(im, 0, 0, 0, 0);
+         }
+       *image_data = im->im->image.data;
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       *image_data = im->cs.data;
+       break;
+      default:
+       abort();
+       break;
+     }
+   return im;
+}
+
+static void *
+eng_image_data_put(void *data, void *image, DATA32 *image_data)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im, *im2;
+
+   re = (Render_Engine *)data;
+   if (!image) return NULL;
+   im = image;
+   if (im->native.data) return image;
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (image_data != im->im->image.data)
+         {
+            int w, h;
+
+            w = im->im->cache_entry.w;
+            h = im->im->cache_entry.h;
+            im2 = eng_image_new_from_data(data, w, h, image_data,
+                                          eng_image_alpha_get(data, image),
+                                          eng_image_colorspace_get(data, image));
+            if (!im2) return im;
+            evas_gl_common_image_free(im);
+            im = im2;
+         }
+        break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+        if (image_data != im->cs.data)
+         {
+            if (im->cs.data)
+              {
+                 if (!im->cs.no_free) free(im->cs.data);
+              }
+            im->cs.data = image_data;
+         }
+       break;
+      default:
+       abort();
+       break;
+     }
+   /* hmmm - but if we wrote... why bother? */
+   evas_gl_common_image_dirty(im, 0, 0, 0, 0);
+   return im;
+}
+
+static void
+eng_image_data_preload_request(void *data __UNUSED__, void *image, const void *target)
+{
+   Evas_GL_Image *gim = image;
+   RGBA_Image *im;
+
+   if (!gim) return;
+   if (gim->native.data) return;
+   im = (RGBA_Image *)gim->im;
+   if (!im) return;
+   evas_cache_image_preload_data(&im->cache_entry, target);
+}
+
+static void
+eng_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target)
+{
+   Evas_GL_Image *gim = image;
+   RGBA_Image *im;
+
+   if (!gim) return;
+   if (gim->native.data) return;
+   im = (RGBA_Image *)gim->im;
+   if (!im) return;
+   evas_cache_image_preload_cancel(&im->cache_entry, target);
+}
+
+static void
+eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (!image) return;
+   evas_gl_common_context_target_surface_set(re->gl_context, surface);
+   re->gl_context->dc = context;
+   evas_gl_common_image_draw(re->gl_context, image,
+                             src_x, src_y, src_w, src_h,
+                             dst_x, dst_y, dst_w, dst_h,
+                             smooth);
+}
+
+static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static void
+eng_image_map4_draw(void *data __UNUSED__, void *context, void *surface, void *image, RGBA_Map_Point *p, int smooth, int level)
+{
+   Render_Engine *re;
+   
+   re = (Render_Engine *)data;
+   evas_gl_common_context_target_surface_set(re->gl_context, surface);
+   re->gl_context->dc = context;
+   evas_gl_common_image_map4_draw(re->gl_context, image, p, smooth, level);
+}
+
+static void *
+eng_image_map_surface_new(void *data __UNUSED__, int w, int h, int alpha)
+{
+   Render_Engine *re;
+   
+   re = (Render_Engine *)data;
+   return evas_gl_common_image_surface_new(re->gl_context, w, h, alpha);
+}
+
+static void
+eng_image_map_surface_free(void *data __UNUSED__, void *surface)
+{
+   evas_gl_common_image_free(surface);
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+static void
+eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, const char *text)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_gl_common_context_target_surface_set(re->gl_context, surface);
+   re->gl_context->dc = context;
+     {
+        // FIXME: put im into context so we can free it
+       static RGBA_Image *im = NULL;
+        
+        if (!im)
+          im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
+        im->cache_entry.w = re->w;
+        im->cache_entry.h = re->h;
+        evas_common_draw_context_font_ext_set(context,
+                                             re->gl_context,
+                                             evas_gl_font_texture_new,
+                                             evas_gl_font_texture_free,
+                                             evas_gl_font_texture_draw);
+       evas_common_font_draw(im, context, font, x, y, text);
+       evas_common_draw_context_font_ext_set(context,
+                                             NULL,
+                                             NULL,
+                                             NULL,
+                                             NULL);
+     }
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data __UNUSED__, void *info __UNUSED__)
+{
+   // FIXME: support ARGB gl targets!!!
+   return EINA_FALSE;
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
+   if (_evas_engine_GL_SDL_log_dom < 0)
+     _evas_engine_GL_SDL_log_dom = eina_log_domain_register("EvasEngineGLSDL", EVAS_DEFAULT_LOG_COLOR);
+   if (_evas_engine_GL_SDL_log_dom < 0)
+     {
+        EINA_LOG_ERR("Impossible to create a log domain for GL SDL engine.\n");
+        return 0;
+     }
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+   #define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(canvas_alpha_get);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(context_cutout_add);
+   ORD(context_cutout_clear);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   ORD(output_dump);
+   ORD(rectangle_draw);
+   ORD(line_draw);
+   ORD(polygon_point_add);
+   ORD(polygon_points_clear);
+   ORD(polygon_draw);
+
+   ORD(gradient2_color_np_stop_insert);
+   ORD(gradient2_clear);
+   ORD(gradient2_fill_transform_set);
+   ORD(gradient2_fill_spread_set);
+   ORD(gradient2_linear_new);
+   ORD(gradient2_linear_free);
+   ORD(gradient2_linear_fill_set);
+   ORD(gradient2_linear_is_opaque);
+   ORD(gradient2_linear_is_visible);
+   ORD(gradient2_linear_render_pre);
+   ORD(gradient2_linear_render_post);
+   ORD(gradient2_linear_draw);
+   ORD(gradient2_radial_new);
+   ORD(gradient2_radial_free);
+   ORD(gradient2_radial_fill_set);
+   ORD(gradient2_radial_is_opaque);
+   ORD(gradient2_radial_is_visible);
+   ORD(gradient2_radial_render_pre);
+   ORD(gradient2_radial_render_post);
+   ORD(gradient2_radial_draw);
+
+   ORD(gradient_new);
+   ORD(gradient_free);
+   ORD(gradient_color_stop_add);
+   ORD(gradient_alpha_stop_add);
+   ORD(gradient_color_data_set);
+   ORD(gradient_alpha_data_set);
+   ORD(gradient_clear);
+   ORD(gradient_fill_set);
+   ORD(gradient_fill_angle_set);
+   ORD(gradient_fill_spread_set);
+   ORD(gradient_angle_set);
+   ORD(gradient_offset_set);
+   ORD(gradient_direction_set);
+   ORD(gradient_type_set);
+   ORD(gradient_is_opaque);
+   ORD(gradient_is_visible);
+   ORD(gradient_render_pre);
+   ORD(gradient_render_post);
+   ORD(gradient_draw);
+   ORD(image_load);
+   ORD(image_new_from_data);
+   ORD(image_new_from_copied_data);
+   ORD(image_free);
+   ORD(image_size_get);
+   ORD(image_size_set);
+   ORD(image_dirty_region);
+   ORD(image_data_get);
+   ORD(image_data_put);
+   ORD(image_data_preload_request);
+   ORD(image_data_preload_cancel);
+   ORD(image_alpha_set);
+   ORD(image_alpha_get);
+   ORD(image_border_set);
+   ORD(image_border_get);
+   ORD(image_draw);
+   ORD(image_comment_get);
+   ORD(image_format_get);
+   ORD(image_colorspace_set);
+   ORD(image_colorspace_get);
+   ORD(image_native_set);
+   ORD(image_native_get);
+   ORD(font_draw);
+   
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+   
+   ORD(image_map4_draw);
+   ORD(image_map_surface_new);
+   ORD(image_map_surface_free);
+   
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+    eina_log_domain_unregister(_evas_engine_GL_SDL_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "gl_sdl",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, gl_sdl);
+
+#ifndef EVAS_STATIC_BUILD_GL_SDL
+EVAS_EINA_MODULE_DEFINE(engine, gl_sdl);
+#endif
+
+static void*
+_sdl_output_setup              (int w, int h, int fullscreen, int noframe)
+{
+   Render_Engine               *re = calloc(1, sizeof(Render_Engine));
+   SDL_Surface                  *surface;
+   int                         context_attrs[3];
+   int                         config_attrs[20];
+   int                         major_version, minor_version;
+   int                         num_config;
+
+   /* if we haven't initialized - init (automatic abort if already done) */
+   evas_common_cpu_init();
+   evas_common_blend_init();
+   evas_common_image_init();
+   evas_common_convert_init();
+   evas_common_scale_init();
+   evas_common_rectangle_init();
+   evas_common_gradient_init();
+   evas_common_polygon_init();
+   evas_common_line_init();
+   evas_common_font_init();
+   evas_common_draw_init();
+   evas_common_tilebuf_init();
+
+   if (w <= 0) w = 640;
+   if (h <= 0) h = 480;
+   
+   /* GL Initialization */
+#ifdef HAVE_SDL_GL_CONTEXT_VERSION
+   SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
+   SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
+#endif
+   SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
+   SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
+   SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
+   SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
+   SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+   SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0);
+
+   surface = SDL_SetVideoMode(w, h, 32, EVAS_SDL_GL_FLAG
+                          | (fullscreen ? SDL_FULLSCREEN : 0)
+                          | (noframe ? SDL_NOFRAME : 0));
+
+   if (!surface)
+     {
+        CRIT("SDL_SetVideoMode [ %i x %i x 32 ] failed.", w, h);
+       CRIT("SDL: %s\n", SDL_GetError());
+       SDL_Quit();
+        exit(-1);
+     }
+
+   fprintf(stderr, "Screen Depth : %d\n", SDL_GetVideoSurface()->format->BitsPerPixel);
+   fprintf(stderr, "Vendor       : %s\n", glGetString(GL_VENDOR));
+   fprintf(stderr, "Renderer     : %s\n", glGetString(GL_RENDERER));
+   fprintf(stderr, "Version      : %s\n", glGetString(GL_VERSION));
+
+   re->gl_context = evas_gl_common_context_new();
+   if (!re->gl_context)
+     {
+       free(re);
+       return NULL;
+     }
+   evas_gl_common_context_use(re->gl_context);
+   evas_gl_common_context_resize(re->gl_context, w, h);
+
+   /* End GL Initialization */
+   re->w = w;
+   re->h = h;
+   return re;
+}
+
diff --git a/src/modules/engines/gl_sdl/evas_engine.h b/src/modules/engines/gl_sdl/evas_engine.h
new file mode 100644 (file)
index 0000000..36d91b4
--- /dev/null
@@ -0,0 +1,73 @@
+#ifndef EVAS_ENGINE_H
+#define EVAS_ENGINE_H
+
+#define _EVAS_ENGINE_SDL_H
+
+#include "config.h"
+#include <SDL/SDL.h>
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+# include <EGL/egl.h>
+# include <SDL/SDL_opengles.h>
+# ifdef HAVE_SDL_FLAG_OPENGLES
+#  define EVAS_SDL_GL_FLAG SDL_OPENGLES
+# else
+#  define EVAS_SDL_GL_FLAG SDL_OPENGL /* This probably won't work? */
+# endif
+#else
+# include <SDL/SDL_opengl.h>
+# define EVAS_SDL_GL_FLAG SDL_OPENGL
+#endif
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_gl_common.h"
+#include "Evas.h"
+#include "Evas_Engine_GL_SDL.h"
+
+extern int _evas_engine_GL_SDL_log_dom ;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_GL_SDL_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_GL_SDL_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_GL_SDL_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_GL_SDL_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_GL_SDL_log_dom, __VA_ARGS__)
+
+typedef struct _Render_Engine Render_Engine;
+struct _Render_Engine
+{
+   Evas_Engine_Info_GL_SDL     *info;
+   int                 w, h;
+
+   Evas_GL_Context *gl_context;
+   struct {
+      int              redraw : 1;
+      int              drew : 1;
+      int              x1, y1, x2, y2;
+   } draw;
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+   EGLContext       egl_context[1];
+   EGLSurface       egl_surface[1];
+   EGLConfig        egl_config;
+   EGLDisplay       egl_disp;
+#endif
+
+};
+
+#endif
diff --git a/src/modules/engines/gl_x11/.cvsignore b/src/modules/engines/gl_x11/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/engines/gl_x11/Evas_Engine_GL_X11.h b/src/modules/engines/gl_x11/Evas_Engine_GL_X11.h
new file mode 100644 (file)
index 0000000..2e0461c
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef _EVAS_ENGINE_GL_X11_H
+#define _EVAS_ENGINE_GL_X11_H
+
+#include <X11/Xlib.h>
+
+typedef struct _Evas_Engine_Info_GL_X11              Evas_Engine_Info_GL_X11;
+
+struct _Evas_Engine_Info_GL_X11
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   /* engine specific data & parameters it needs to set up */
+   struct {
+      Display     *display;
+      Drawable     drawable;
+      Visual      *visual;
+      Colormap     colormap;
+      int          depth;
+      int          screen;
+      int          rotation;
+      unsigned int destination_alpha  : 1;
+   } info;
+   /* engine specific function calls to query stuff about the destination */
+   /* engine (what visual & colormap & depth to use, performance info etc. */
+   struct {
+      Visual *  (*best_visual_get)   (Evas_Engine_Info_GL_X11 *einfo);
+      Colormap  (*best_colormap_get) (Evas_Engine_Info_GL_X11 *einfo);
+      int       (*best_depth_get)    (Evas_Engine_Info_GL_X11 *einfo);
+   } func;
+   
+   struct {
+      void      (*pre_swap)          (void *data, Evas *e);
+      void      (*post_swap)         (void *data, Evas *e);
+      
+      void       *data; // data for callback calls
+   } callback;
+   
+   unsigned char vsync : 1; // does nothing right now
+   unsigned char indirect : 1; // use indirect rendering
+};
+#endif
+
+
diff --git a/src/modules/engines/gl_x11/Makefile.am b/src/modules/engines/gl_x11/Makefile.am
new file mode 100644 (file)
index 0000000..7421af2
--- /dev/null
@@ -0,0 +1,44 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines/gl_common \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_engine_gl_x11_cflags@
+
+if BUILD_ENGINE_GL_X11
+
+GL_X11_SOURCES = \
+evas_engine.c \
+evas_x_main.c
+
+GL_X11_LIBADD = @evas_engine_gl_x11_libs@ $(top_builddir)/src/modules/engines/gl_common/libevas_engine_gl_common.la 
+
+pkgdir = $(libdir)/evas/modules/engines/gl_x11/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_GL_X11.h
+
+if !EVAS_STATIC_BUILD_GL_X11
+
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = $(GL_X11_SOURCES)
+module_la_LIBADD = @EINA_LIBS@ $(GL_X11_LIBADD) $(top_builddir)/src/lib/libevas.la @dlopen_libs@
+module_la_LDFLAGS = -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_gl_x11.la
+
+libevas_engine_gl_x11_la_SOURCES = $(GL_X11_SOURCES)
+libevas_engine_gl_x11_la_LIBADD = $(GL_X11_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/gl_x11/evas_engine.c b/src/modules/engines/gl_x11/evas_engine.c
new file mode 100644 (file)
index 0000000..72b39c3
--- /dev/null
@@ -0,0 +1,2142 @@
+#include "evas_engine.h"
+
+#include <dlfcn.h>      /* dlopen,dlclose,etc */
+
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+// EGL / GLES
+# if defined(GLES_VARIETY_S3C6410)
+# elif defined(GLES_VARIETY_SGX)
+# endif
+#else
+// GLX
+#endif
+
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+
+#ifndef EGL_NATIVE_PIXMAP_KHR
+# define EGL_NATIVE_PIXMAP_KHR 0x30b0
+#endif
+typedef void (*_eng_fn) (void);
+
+_eng_fn  (*glsym_eglGetProcAddress)            (const char *a) = NULL;
+void     (*glsym_eglBindTexImage)              (EGLDisplay a, EGLSurface b, int c) = NULL;
+void     (*glsym_eglReleaseTexImage)           (EGLDisplay a, EGLSurface b, int c) = NULL;
+void    *(*glsym_eglCreateImage)               (EGLDisplay a, EGLContext b, EGLenum c, EGLClientBuffer d, const int *e) = NULL;
+void     (*glsym_eglDestroyImage)              (EGLDisplay a, void *b) = NULL;
+void     (*glsym_glEGLImageTargetTexture2DOES) (int a, void *b)  = NULL;
+#else
+typedef void (*_eng_fn) (void);
+
+_eng_fn  (*glsym_glXGetProcAddress)  (const char *a) = NULL;
+void     (*glsym_glXBindTexImage)    (Display *a, GLXDrawable b, int c, int *d) = NULL;
+void     (*glsym_glXReleaseTexImage) (Display *a, GLXDrawable b, int c) = NULL;
+int      (*glsym_glXGetVideoSync)    (unsigned int *a) = NULL;
+int      (*glsym_glXWaitVideoSync)   (int a, int b, unsigned int *c) = NULL;
+XID      (*glsym_glXCreatePixmap)    (Display *a, void *b, Pixmap c, const int *d) = NULL;
+void     (*glsym_glXDestroyPixmap)   (Display *a, XID b) = NULL;
+void     (*glsym_glXQueryDrawable)   (Display *a, XID b, int c, unsigned int *d) = NULL;
+#endif
+
+static void
+_sym_init(void)
+{
+   static int done = 0;
+   
+   if (done) return;
+   
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+#define FINDSYM(dst, sym) \
+   if ((!dst) && (glsym_eglGetProcAddress)) dst = glsym_eglGetProcAddress(sym); \
+   if (!dst) dst = dlsym(RTLD_DEFAULT, sym)
+   
+   FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddress");
+   FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddressEXT");
+   FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddressARB");
+   FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddressKHR");
+   
+   FINDSYM(glsym_eglBindTexImage, "eglBindTexImage");
+   FINDSYM(glsym_eglBindTexImage, "eglBindTexImageEXT");
+   FINDSYM(glsym_eglBindTexImage, "eglBindTexImageARB");
+   FINDSYM(glsym_eglBindTexImage, "eglBindTexImageKHR");
+   
+   FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImage");
+   FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImageEXT");
+   FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImageARB");
+   FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImageKHR");
+   
+   FINDSYM(glsym_eglCreateImage, "eglCreateImage");
+   FINDSYM(glsym_eglCreateImage, "eglCreateImageEXT");
+   FINDSYM(glsym_eglCreateImage, "eglCreateImageARB");
+   FINDSYM(glsym_eglCreateImage, "eglCreateImageKHR");
+
+   FINDSYM(glsym_eglDestroyImage, "eglDestroyImage");
+   FINDSYM(glsym_eglDestroyImage, "eglDestroyImageEXT");
+   FINDSYM(glsym_eglDestroyImage, "eglDestroyImageARB");
+   FINDSYM(glsym_eglDestroyImage, "eglDestroyImageKHR");
+
+   FINDSYM(glsym_glEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES");
+#else
+#define FINDSYM(dst, sym) \
+   if ((!dst) && (glsym_glXGetProcAddress)) dst = glsym_glXGetProcAddress(sym); \
+   if (!dst) dst = dlsym(RTLD_DEFAULT, sym)
+
+   FINDSYM(glsym_glXGetProcAddress, "glXGetProcAddress");
+   FINDSYM(glsym_glXGetProcAddress, "glXGetProcAddressEXT");
+   FINDSYM(glsym_glXGetProcAddress, "glXGetProcAddressARB");
+   
+   FINDSYM(glsym_glXBindTexImage, "glXBindTexImage");
+   FINDSYM(glsym_glXBindTexImage, "glXBindTexImageEXT");
+   FINDSYM(glsym_glXBindTexImage, "glXBindTexImageARB");
+
+   FINDSYM(glsym_glXReleaseTexImage, "glXReleaseTexImage");
+   FINDSYM(glsym_glXReleaseTexImage, "glXReleaseTexImageEXT");
+   FINDSYM(glsym_glXReleaseTexImage, "glXReleaseTexImageARB");
+
+   FINDSYM(glsym_glXGetVideoSync, "glXGetVideoSyncSGI");
+   
+   FINDSYM(glsym_glXWaitVideoSync, "glXWaitVideoSyncSGI");
+
+   FINDSYM(glsym_glXCreatePixmap, "glXCreatePixmap");
+   FINDSYM(glsym_glXCreatePixmap, "glXCreatePixmapEXT");
+   FINDSYM(glsym_glXCreatePixmap, "glXCreatePixmapARB");
+   
+   FINDSYM(glsym_glXDestroyPixmap, "glXDestroyPixmap");
+   FINDSYM(glsym_glXDestroyPixmap, "glXDestroyPixmapEXT");
+   FINDSYM(glsym_glXDestroyPixmap, "glXDestroyPixmapARB");
+   
+   FINDSYM(glsym_glXQueryDrawable, "glXQueryDrawable");
+   FINDSYM(glsym_glXQueryDrawable, "glXQueryDrawableEXT");
+   FINDSYM(glsym_glXQueryDrawable, "glXQueryDrawableARB");
+#endif
+}
+
+int _evas_engine_GL_X11_log_dom = -1;
+/* function tables - filled in later (func and parent func) */
+static Evas_Func func, pfunc;
+
+struct xrdb_user
+{
+   time_t last_stat;
+   time_t last_mtime;
+   XrmDatabase db;
+};
+static struct xrdb_user xrdb_user = {0, 0, NULL};
+
+static Eina_Bool
+xrdb_user_query(const char *name, const char *cls, char **type, XrmValue *val)
+{
+   time_t last = xrdb_user.last_stat, now = time(NULL);
+
+   xrdb_user.last_stat = now;
+   if (last != now) /* don't stat() more than once every second */
+     {
+       struct stat st;
+       const char *home = getenv("HOME");
+       char tmp[PATH_MAX];
+
+       if (!home) goto failed;
+       snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home);
+       if (stat(tmp, &st) != 0) goto failed;
+       if (xrdb_user.last_mtime != st.st_mtime)
+         {
+            if (xrdb_user.db) XrmDestroyDatabase(xrdb_user.db);
+            xrdb_user.db = XrmGetFileDatabase(tmp);
+            if (!xrdb_user.db) goto failed;
+            xrdb_user.last_mtime = st.st_mtime;
+         }
+     }
+
+   if (!xrdb_user.db) return EINA_FALSE;
+   return XrmGetResource(xrdb_user.db, name, cls, type, val);
+
+ failed:
+   if (xrdb_user.db)
+     {
+       XrmDestroyDatabase(xrdb_user.db);
+       xrdb_user.db = NULL;
+     }
+   xrdb_user.last_mtime = 0;
+   return EINA_FALSE;
+}
+
+typedef struct _Render_Engine Render_Engine;
+
+struct _Render_Engine
+{
+   Evas_GL_X11_Window      *win;
+   Evas_Engine_Info_GL_X11 *info;
+   Evas                    *evas;
+   int                      end;
+   
+   XrmDatabase   xrdb; // xres - dpi
+   struct { // xres - dpi
+      int        dpi; // xres - dpi
+   } xr; // xres - dpi
+};
+
+static void *
+eng_info(Evas *e)
+{
+   Evas_Engine_Info_GL_X11 *info;
+
+   info = calloc(1, sizeof(Evas_Engine_Info_GL_X11));
+   info->magic.magic = rand();
+   info->func.best_visual_get = eng_best_visual_get;
+   info->func.best_colormap_get = eng_best_colormap_get;
+   info->func.best_depth_get = eng_best_depth_get;
+   return info;
+   e = NULL;
+}
+
+static void
+eng_info_free(Evas *e __UNUSED__, void *info)
+{
+   Evas_Engine_Info_GL_X11 *in;
+// dont free! why bother? its not worth it   
+//   eina_log_domain_unregister(_evas_engine_GL_X11_log_dom);
+   in = (Evas_Engine_Info_GL_X11 *)info;
+   free(in);
+}
+
+static int initted = 0;
+static int gl_wins = 0;
+
+static int
+eng_setup(Evas *e, void *in)
+{
+   Render_Engine *re;
+   Evas_Engine_Info_GL_X11 *info;
+
+   info = (Evas_Engine_Info_GL_X11 *)in;
+   if (!e->engine.data.output)
+     {
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+#else        
+        int eb, evb;
+        
+       if (!glXQueryExtension(info->info.display, &eb, &evb)) return 0;
+#endif
+       re = calloc(1, sizeof(Render_Engine));
+       if (!re) return 0;
+        re->info = info;
+        re->evas = e;
+       e->engine.data.output = re;
+       re->win = eng_window_new(info->info.display,
+                                info->info.drawable,
+                                 info->info.screen,
+                                info->info.visual,
+                                info->info.colormap,
+                                info->info.depth,
+                                e->output.w,
+                                e->output.h,
+                                 info->indirect,
+                                 info->info.destination_alpha,
+                                 info->info.rotation);
+       if (!re->win)
+         {
+            free(re);
+            e->engine.data.output = NULL;
+            return 0;
+         }
+        gl_wins++;
+        
+          {
+             int status;
+             char *type = NULL;
+             XrmValue val;
+             
+             re->xr.dpi = 75000; // dpy * 1000
+
+            status = xrdb_user_query("Xft.dpi", "Xft.Dpi", &type, &val);
+            if ((!status) || (!type))
+              {
+                 if (!re->xrdb) re->xrdb = XrmGetDatabase(info->info.display);
+                 if (re->xrdb)
+                   status = XrmGetResource(re->xrdb,
+                                           "Xft.dpi", "Xft.Dpi", &type, &val);
+              }
+
+             if ((status) && (type))
+               {
+                  if (!strcmp(type, "String"))
+                    {
+                       const char *str, *dp;
+                       
+                       str = val.addr;
+                       dp = strchr(str, '.');
+                       if (!dp) dp = strchr(str, ',');
+                       
+                       if (dp)
+                         {
+                            int subdpi, len, i;
+                            char *buf;
+                            
+                            buf = alloca(dp - str + 1);
+                            strncpy(buf, str, dp - str);
+                            buf[dp - str] = 0;
+                            len = strlen(dp + 1);
+                            subdpi = atoi(dp + 1);
+                            
+                            if (len < 3)
+                              {
+                                 for (i = len; i < 3; i++) subdpi *= 10;
+                              }
+                            else if (len > 3)
+                              {
+                                 for (i = len; i > 3; i--) subdpi /= 10;
+                              }
+                            re->xr.dpi = atoi(buf) * 1000;
+                         }
+                       else
+                         re->xr.dpi = atoi(str) * 1000;
+                       evas_common_font_dpi_set(re->xr.dpi / 1000);
+                    }
+               }
+          }
+
+        if (!initted)
+          {
+             evas_common_cpu_init();
+             
+             evas_common_blend_init();
+             evas_common_image_init();
+             evas_common_convert_init();
+             evas_common_scale_init();
+             evas_common_rectangle_init();
+             evas_common_gradient_init();
+             evas_common_polygon_init();
+             evas_common_line_init();
+             evas_common_font_init();
+             evas_common_draw_init();
+             evas_common_tilebuf_init();
+             initted = 1;
+          }
+     }
+   else
+     {
+       re = e->engine.data.output;
+        if ((info->info.display != re->win->disp) ||
+            (info->info.drawable != re->win->win) ||
+            (info->info.screen != re->win->screen) ||
+            (info->info.visual != re->win->visual) ||
+            (info->info.colormap != re->win->colormap) ||
+            (info->info.depth != re->win->depth) ||
+            (info->info.destination_alpha != re->win->alpha) ||
+            (info->info.rotation != re->win->rot))
+          {
+             if (re->win)
+               {
+                  eng_window_free(re->win);
+                  gl_wins--;
+               }
+             re->win = eng_window_new(info->info.display,
+                                      info->info.drawable,
+                                      info->info.screen,
+                                      info->info.visual,
+                                      info->info.colormap,
+                                      info->info.depth,
+                                      e->output.w,
+                                      e->output.h,
+                                      info->indirect,
+                                      info->info.destination_alpha,
+                                      info->info.rotation);
+             if (re->win) gl_wins++;
+          }
+        else if ((re->win->w != e->output.w) ||
+                 (re->win->h != e->output.h))
+          {
+             re->win->w = e->output.w;
+             re->win->h = e->output.h;
+             eng_window_use(re->win);
+             evas_gl_common_context_resize(re->win->gl_context, re->win->w, re->win->h, re->win->rot);
+          }
+        
+     }
+   if (!re->win)
+     {
+        free(re);
+        return 0;
+     }
+   
+   if (!e->engine.data.output)
+     {
+        if (re->win)
+          {
+             eng_window_free(re->win);
+             gl_wins--;
+          }
+        free(re);
+        return 0;
+     }
+   if (!e->engine.data.context)
+     e->engine.data.context =
+     e->engine.func->context_new(e->engine.data.output);
+   eng_window_use(re->win);
+   
+   if (re->win->alpha)
+     {
+        glClearColor(0.0, 0.0, 0.0, 0.0);
+        glClear(GL_COLOR_BUFFER_BIT);
+     }
+   
+   _sym_init();
+   
+   return 1;
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   
+   if (re)
+     {
+// NOTE: XrmGetDatabase() result is shared per connection, do not free it.
+//   if (re->xrdb) XrmDestroyDatabase(re->xrdb);
+
+        if (re->win)
+          {
+             eng_window_free(re->win);
+             gl_wins--;
+          }
+        free(re);
+     }
+   if ((initted == 1) && (gl_wins == 0))
+     {
+        evas_common_cpu_shutdown();
+        
+        evas_common_blend_shutdown();
+        evas_common_image_shutdown();
+        evas_common_convert_shutdown();
+        evas_common_scale_shutdown();
+        evas_common_rectangle_shutdown();
+        evas_common_gradient_shutdown();
+        evas_common_polygon_shutdown();
+        evas_common_line_shutdown();
+        evas_common_font_shutdown();
+        evas_common_draw_shutdown();
+        evas_common_tilebuf_shutdown();
+        initted = 0;
+     }
+}
+
+static void
+eng_output_resize(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   re->win->w = w;
+   re->win->h = h;
+   eng_window_use(re->win);
+   evas_gl_common_context_resize(re->win->gl_context, w, h, re->win->rot);
+}
+
+static void
+eng_output_tile_size_set(void *data, int w __UNUSED__, int h __UNUSED__)
+{
+//   Render_Engine *re;
+//
+//   re = (Render_Engine *)data;
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_gl_common_context_resize(re->win->gl_context, re->win->w, re->win->h, re->win->rot);
+   /* smple bounding box */
+   RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, re->win->w, re->win->h);
+   if ((w <= 0) || (h <= 0)) return;
+   if (!re->win->draw.redraw)
+     {
+#if 0
+       re->win->draw.x1 = x;
+       re->win->draw.y1 = y;
+       re->win->draw.x2 = x + w - 1;
+       re->win->draw.y2 = y + h - 1;
+#else
+       re->win->draw.x1 = 0;
+       re->win->draw.y1 = 0;
+       re->win->draw.x2 = re->win->w - 1;
+       re->win->draw.y2 = re->win->h - 1;
+#endif
+     }
+   else
+     {
+       if (x < re->win->draw.x1) re->win->draw.x1 = x;
+       if (y < re->win->draw.y1) re->win->draw.y1 = y;
+       if ((x + w - 1) > re->win->draw.x2) re->win->draw.x2 = x + w - 1;
+       if ((y + h - 1) > re->win->draw.y2) re->win->draw.y2 = y + h - 1;
+     }
+   re->win->draw.redraw = 1;
+}
+
+static void
+eng_output_redraws_rect_del(void *data, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+//   Render_Engine *re;
+//
+//   re = (Render_Engine *)data;
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   re->win->draw.redraw = 0;
+//   INF("GL: finish update cycle!");
+}
+
+/* vsync games - not for now though */
+#define VSYNC_TO_SCREEN 1
+
+static void *
+eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_gl_common_context_flush(re->win->gl_context);
+   /* get the upate rect surface - return engine data as dummy */
+   if (!re->win->draw.redraw) return NULL;
+   if (x) *x = re->win->draw.x1;
+   if (y) *y = re->win->draw.y1;
+   if (w) *w = re->win->draw.x2 - re->win->draw.x1 + 1;
+   if (h) *h = re->win->draw.y2 - re->win->draw.y1 + 1;
+   if (cx) *cx = re->win->draw.x1;
+   if (cy) *cy = re->win->draw.y1;
+   if (cw) *cw = re->win->draw.x2 - re->win->draw.x1 + 1;
+   if (ch) *ch = re->win->draw.y2 - re->win->draw.y1 + 1;
+   return re->win->gl_context->def_surface;
+}
+
+//#define FRAMECOUNT 1
+
+#ifdef FRAMECOUNT
+double
+get_time(void)
+{
+   struct timeval      timev;
+   
+   gettimeofday(&timev, NULL);
+   return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000);
+}
+#endif
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   Render_Engine *re;
+#ifdef FRAMECOUNT
+   static double pt = 0.0;
+   double ta, tb;
+#endif
+   
+   re = (Render_Engine *)data;
+   /* put back update surface.. in this case just unflag redraw */
+   re->win->draw.redraw = 0;
+   re->win->draw.drew = 1;
+   evas_gl_common_context_flush(re->win->gl_context);
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+   // this is needed to make sure all previous rendering is flushed to
+   // buffers/surfaces
+#ifdef FRAMECOUNT
+   double t0 = get_time();
+   ta = t0 - pt;
+   pt = t0;
+#endif
+   eglWaitNative(EGL_CORE_NATIVE_ENGINE); // previous rendering should be done and swapped
+#ifdef FRAMECOUNT
+   double t1 = get_time();
+   tb = t1 - t0;
+   printf("... %1.5f -> %1.5f | ", ta, tb);
+#endif   
+//   if (eglGetError() != EGL_SUCCESS)
+//     {
+//        printf("Error:  eglWaitNative(EGL_CORE_NATIVE_ENGINE) fail.\n");
+//     }
+#else
+   glXWaitGL();
+#endif
+//x//   printf("frame -> push\n");
+}
+
+static void
+eng_output_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (!re->win->draw.drew) return;
+//x//   printf("frame -> flush\n");
+   re->win->draw.drew = 0;
+   eng_window_use(re->win);
+
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+#ifdef FRAMECOUNT
+   double t0 = get_time();
+#endif   
+   eglSwapBuffers(re->win->egl_disp, re->win->egl_surface[0]);
+#ifdef FRAMECOUNT
+   double t1 = get_time();
+   printf("%1.5f\n", t1 - t0);
+#endif   
+//   if (eglGetError() != EGL_SUCCESS)
+//     {
+//        printf("Error:  eglSwapBuffers() fail.\n");
+//     }
+#else
+#ifdef VSYNC_TO_SCREEN   
+   if ((re->info->vsync)/* || (1)*/)
+     {
+        if ((glsym_glXGetVideoSync) && (glsym_glXWaitVideoSync))
+          {
+             unsigned int rc;
+             
+             glsym_glXGetVideoSync(&rc);
+             glsym_glXWaitVideoSync(1, 0, &rc);
+          }
+     }
+# endif
+   if (re->info->callback.pre_swap)
+     {
+        re->info->callback.pre_swap(re->info->callback.data, re->evas);
+     }
+   if ((1)
+//       (re->win->draw.x1 == 0) && 
+//       (re->win->draw.y1 == 0) &&
+//       (re->win->draw.x2 == (re->win->w - 1)) &&
+//       (re->win->draw.y2 == (re->win->h - 1))
+       )
+     {
+        glXSwapBuffers(re->win->disp, re->win->win);
+     }
+   else
+     {
+// FIXME: this doesnt work.. why oh why?        
+        int sx, sy, sw, sh;
+        
+        // fimxe - reset when done
+//        glEnable(GL_SCISSOR_TEST);
+        glDrawBuffer(GL_FRONT);
+        
+        sx = re->win->draw.x1;
+        sy = re->win->draw.y1;
+        sw = (re->win->draw.x2 - re->win->draw.x1) + 1;
+        sh = (re->win->draw.y2 - re->win->draw.y1) + 1;
+        sy = re->win->h - sy - sh;
+
+//        glScissor(sx, sy, sw, sh);
+        glRasterPos2i(sx, re->win->h - sy);
+        glCopyPixels(sx, sy, sw, sh, GL_COLOR);
+        glRasterPos2i(0, 0);
+        
+//        glDisable(GL_SCISSOR_TEST);
+        glDrawBuffer(GL_BACK);
+        glFlush();
+     }
+   if (re->info->callback.post_swap)
+     {
+        re->info->callback.post_swap(re->info->callback.data, re->evas);
+     }
+#endif
+   
+   if (re->win->alpha)
+     {
+        glClearColor(0.0, 0.0, 0.0, 0.0);
+        glClear(GL_COLOR_BUFFER_BIT);
+     }
+}
+
+static void
+eng_output_idle_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+}
+
+static void
+eng_output_dump(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_image_image_all_unload();
+   evas_common_font_font_all_unload();
+   evas_gl_common_image_all_unload(re->win->gl_context);
+}
+
+static void
+eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h)
+{
+//   Render_Engine *re;
+//
+//   re = (Render_Engine *)data;
+//   re->win->gl_context->dc = context;
+   evas_common_draw_context_add_cutout(context, x, y, w, h);
+}
+
+static void
+eng_context_cutout_clear(void *data, void *context)
+{
+//   Render_Engine *re;
+//
+//   re = (Render_Engine *)data;
+//   re->win->gl_context->dc = context;
+   evas_common_draw_context_clear_cutouts(context);
+}
+
+static void
+eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_use(re->win);
+   evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
+   re->win->gl_context->dc = context;
+   evas_gl_common_rect_draw(re->win->gl_context, x, y, w, h);
+}
+
+static void
+eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_use(re->win);
+   evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
+   re->win->gl_context->dc = context;
+   evas_gl_common_line_draw(re->win->gl_context, x1, y1, x2, y2);
+}
+
+static void *
+eng_polygon_point_add(void *data, void *context __UNUSED__, void *polygon, int x, int y)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   return evas_gl_common_poly_point_add(polygon, x, y);
+}
+
+static void *
+eng_polygon_points_clear(void *data, void *context __UNUSED__, void *polygon)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   return evas_gl_common_poly_points_clear(polygon);
+}
+
+static void
+eng_polygon_draw(void *data, void *context, void *surface __UNUSED__, void *polygon, int x, int y)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_use(re->win);
+   evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
+   re->win->gl_context->dc = context;
+   evas_gl_common_poly_draw(re->win->gl_context, polygon, x, y);
+}
+
+static void
+eng_gradient2_color_np_stop_insert(void *data __UNUSED__, void *gradient __UNUSED__, int r __UNUSED__, int g __UNUSED__, int b __UNUSED__, int a __UNUSED__, float pos __UNUSED__)
+{
+   evas_common_gradient2_color_np_stop_insert(gradient, r, g, b, a, pos);
+}
+
+static void
+eng_gradient2_clear(void *data __UNUSED__, void *gradient __UNUSED__)
+{
+   evas_common_gradient2_clear(gradient);
+}
+
+static void
+eng_gradient2_fill_transform_set(void *data __UNUSED__, void *gradient __UNUSED__, void *transform __UNUSED__)
+{
+   evas_common_gradient2_fill_transform_set(gradient, transform);
+}
+
+static void
+eng_gradient2_fill_spread_set(void *data __UNUSED__, void *gradient __UNUSED__, int spread __UNUSED__)
+{
+   evas_common_gradient2_fill_spread_set(gradient, spread);
+}
+
+static void *
+eng_gradient2_linear_new(void *data __UNUSED__)
+{
+   return evas_common_gradient2_linear_new();
+}
+
+static void
+eng_gradient2_linear_free(void *data __UNUSED__, void *linear_gradient __UNUSED__)
+{
+   evas_common_gradient2_free(linear_gradient);
+}
+
+static void
+eng_gradient2_linear_fill_set(void *data __UNUSED__, void *linear_gradient __UNUSED__, float x0 __UNUSED__, float y0 __UNUSED__, float x1 __UNUSED__, float y1 __UNUSED__)
+{
+   evas_common_gradient2_linear_fill_set(linear_gradient, x0, y0, x1, y1);
+}
+
+static int
+eng_gradient2_linear_is_opaque(void *data __UNUSED__, void *context __UNUSED__, void *linear_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient2 *gr = (RGBA_Gradient2 *)linear_gradient;
+
+   if (!dc || !gr || !gr->type.geometer)  return 0;
+   return !(gr->type.geometer->has_alpha(gr, dc->render_op) |
+            gr->type.geometer->has_mask(gr, dc->render_op));
+}
+
+static int
+eng_gradient2_linear_is_visible(void *data __UNUSED__, void *context __UNUSED__, void *linear_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+
+   if (!dc || !linear_gradient)  return 0;
+   return 1;
+}
+
+static void
+eng_gradient2_linear_render_pre(void *data __UNUSED__, void *context __UNUSED__, void *linear_gradient __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient2 *gr = (RGBA_Gradient2 *)linear_gradient;
+   int  len;
+   
+   if (!dc || !gr || !gr->type.geometer)  return;
+   gr->type.geometer->geom_update(gr);
+   len = gr->type.geometer->get_map_len(gr);
+   evas_common_gradient2_map(dc, gr, len);
+}
+
+static void
+eng_gradient2_linear_render_post(void *data __UNUSED__, void *linear_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_linear_draw(void *data __UNUSED__, void *context __UNUSED__, void *surface __UNUSED__, void *linear_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_use(re->win);
+   re->win->gl_context->dc = context;
+     {
+        Evas_GL_Image *gim;
+        RGBA_Image *im;
+        RGBA_Draw_Context *dc = context;
+        int op = dc->render_op, cuse = dc->clip.use;
+        
+        im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
+        im = (RGBA_Image *)evas_cache_image_size_set(&im->cache_entry, w, h);
+        
+        dc->render_op = _EVAS_RENDER_FILL;
+        dc->clip.use = 0;
+        
+        // draw to buf, copy to tex, draw tex
+        evas_common_gradient2_draw(im, dc, 0, 0, w, h, linear_gradient);
+
+        gim = evas_gl_common_image_new_from_data(re->win->gl_context, w, h,
+                                                 im->image.data, 1,
+                                                 EVAS_COLORSPACE_ARGB8888);
+        dc->render_op = op;
+        dc->clip.use = cuse;
+        evas_gl_common_image_draw(re->win->gl_context, gim, 0, 0, w, h, x, y, w, h, 0);
+        evas_cache_image_drop(&im->cache_entry);
+        evas_gl_common_image_free(gim);
+     }
+}
+
+static void *
+eng_gradient2_radial_new(void *data __UNUSED__)
+{
+   return evas_common_gradient2_radial_new();
+}
+
+static void
+eng_gradient2_radial_free(void *data __UNUSED__, void *radial_gradient __UNUSED__)
+{
+   evas_common_gradient2_free(radial_gradient);
+}
+
+static void
+eng_gradient2_radial_fill_set(void *data __UNUSED__, void *radial_gradient __UNUSED__, float cx __UNUSED__, float cy __UNUSED__, float rx __UNUSED__, float ry __UNUSED__)
+{
+   evas_common_gradient2_radial_fill_set(radial_gradient, cx, cy, rx, ry);
+}
+
+static int
+eng_gradient2_radial_is_opaque(void *data __UNUSED__, void *context __UNUSED__, void *radial_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient2 *gr = (RGBA_Gradient2 *)radial_gradient;
+   
+   if (!dc || !gr || !gr->type.geometer)  return 0;
+   return !(gr->type.geometer->has_alpha(gr, dc->render_op) |
+            gr->type.geometer->has_mask(gr, dc->render_op));
+}
+
+static int
+eng_gradient2_radial_is_visible(void *data __UNUSED__, void *context __UNUSED__, void *radial_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   
+   if (!dc || !radial_gradient)  return 0;
+   return 1;
+}
+
+static void
+eng_gradient2_radial_render_pre(void *data __UNUSED__, void *context __UNUSED__, void *radial_gradient __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient2 *gr = (RGBA_Gradient2 *)radial_gradient;
+   int  len;
+   
+   if (!dc || !gr || !gr->type.geometer)  return;
+   gr->type.geometer->geom_update(gr);
+   len = gr->type.geometer->get_map_len(gr);
+   evas_common_gradient2_map(dc, gr, len);
+}
+
+static void
+eng_gradient2_radial_render_post(void *data __UNUSED__, void *radial_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_radial_draw(void *data __UNUSED__, void *context __UNUSED__, void *surface __UNUSED__, void *radial_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_use(re->win);
+   re->win->gl_context->dc = context;
+     {
+        Evas_GL_Image *gim;
+        RGBA_Image *im;
+        RGBA_Draw_Context *dc = context;
+        int op = dc->render_op, cuse = dc->clip.use;
+        
+        im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
+        im = (RGBA_Image *)evas_cache_image_size_set(&im->cache_entry, w, h);
+        
+        dc->render_op = _EVAS_RENDER_FILL;
+        dc->clip.use = 0;
+        
+        // draw to buf, copy to tex, draw tex
+        evas_common_gradient2_draw(im, dc, 0, 0, w, h, radial_gradient);
+
+        gim = evas_gl_common_image_new_from_data(re->win->gl_context, w, h,
+                                                 im->image.data, 1,
+                                                 EVAS_COLORSPACE_ARGB8888);
+        dc->render_op = op;
+        dc->clip.use = cuse;
+        evas_gl_common_image_draw(re->win->gl_context, gim, 0, 0, w, h, x, y, w, h, 0);
+        evas_cache_image_drop(&im->cache_entry);
+        evas_gl_common_image_free(gim);
+     }
+}
+
+static void *
+eng_gradient_new(void *data __UNUSED__)
+{
+   return evas_common_gradient_new();
+}
+
+static void
+eng_gradient_free(void *data __UNUSED__, void *gradient)
+{
+   evas_common_gradient_free(gradient);
+}
+
+static void
+eng_gradient_color_stop_add(void *data __UNUSED__, void *gradient, int r, int g, int b, int a, int delta)
+{
+   evas_common_gradient_color_stop_add(gradient, r, g, b, a, delta);
+}
+
+static void
+eng_gradient_alpha_stop_add(void *data __UNUSED__, void *gradient, int a, int delta)
+{
+   evas_common_gradient_alpha_stop_add(gradient, a, delta);
+}
+
+static void
+eng_gradient_color_data_set(void *data __UNUSED__, void *gradient, void *map, int len, int has_alpha)
+{
+   evas_common_gradient_color_data_set(gradient, map, len, has_alpha);
+}
+
+static void
+eng_gradient_alpha_data_set(void *data __UNUSED__, void *gradient, void *alpha_map, int len)
+{
+   evas_common_gradient_alpha_data_set(gradient, alpha_map, len);
+}
+
+static void
+eng_gradient_clear(void *data __UNUSED__, void *gradient)
+{
+   evas_common_gradient_clear(gradient);
+}
+
+static void
+eng_gradient_fill_set(void *data __UNUSED__, void *gradient, int x, int y, int w, int h)
+{
+   evas_common_gradient_fill_set(gradient, x, y, w, h);
+}
+
+static void
+eng_gradient_fill_angle_set(void *data __UNUSED__, void *gradient, double angle)
+{
+   evas_common_gradient_fill_angle_set(gradient, angle);
+}
+
+static void
+eng_gradient_fill_spread_set(void *data __UNUSED__, void *gradient, int spread)
+{
+   evas_common_gradient_fill_spread_set(gradient, spread);
+}
+
+static void
+eng_gradient_angle_set(void *data __UNUSED__, void *gradient, double angle)
+{
+   evas_common_gradient_map_angle_set(gradient, angle);
+}
+
+static void
+eng_gradient_offset_set(void *data __UNUSED__, void *gradient, float offset)
+{
+   evas_common_gradient_map_offset_set(gradient, offset);
+}
+
+static void
+eng_gradient_direction_set(void *data __UNUSED__, void *gradient, int direction)
+{
+   evas_common_gradient_map_direction_set(gradient, direction);
+}
+
+static void
+eng_gradient_type_set(void *data __UNUSED__, void *gradient, char *name, char *params)
+{
+   evas_common_gradient_type_set(gradient, name, params);
+}
+
+static int
+eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient *gr = (RGBA_Gradient *)gradient;
+   
+   if (!dc || !gr || !gr->type.geometer)  return 0;
+   return !(gr->type.geometer->has_alpha(gr, dc->render_op) |
+            gr->type.geometer->has_mask(gr, dc->render_op));
+}
+
+static int
+eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   
+   if (!dc || !gradient)  return 0;
+   return 1;
+}
+
+static void
+eng_gradient_render_pre(void *data, void *context, void *gradient)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient *gr = (RGBA_Gradient *)gradient;
+   int  len;
+   
+   if (!dc || !gr || !gr->type.geometer)  return;
+   gr->type.geometer->geom_set(gr);
+   len = gr->type.geometer->get_map_len(gr);
+   evas_common_gradient_map(dc, gr, len);
+}
+
+static void
+eng_gradient_render_post(void *data __UNUSED__, void *gradient)
+{
+}
+
+static void
+eng_gradient_draw(void *data, void *context, void *surface __UNUSED__, void *gradient, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_use(re->win);
+   re->win->gl_context->dc = context;
+     {
+        Evas_GL_Image *gim;
+        RGBA_Image *im;
+        RGBA_Draw_Context *dc = context;
+        int op = dc->render_op, cuse = dc->clip.use;
+        
+        im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
+        im = (RGBA_Image *)evas_cache_image_size_set(&im->cache_entry, w, h);
+        
+        dc->render_op = _EVAS_RENDER_FILL;
+        dc->clip.use = 0;
+        
+        // draw to buf, copy to tex, draw tex
+        evas_common_gradient_draw(im, dc, 0, 0, w, h, gradient);
+
+        gim = evas_gl_common_image_new_from_data(re->win->gl_context, w, h,
+                                                 im->image.data, 1,
+                                                 EVAS_COLORSPACE_ARGB8888);
+        dc->render_op = op;
+        dc->clip.use = cuse;
+        evas_gl_common_image_draw(re->win->gl_context, gim, 0, 0, w, h, x, y, w, h, 0);
+        evas_cache_image_drop(&im->cache_entry);
+        evas_gl_common_image_free(gim);
+     }
+}
+
+static int
+eng_image_alpha_get(void *data, void *image)
+{
+//   Render_Engine *re;
+   Evas_GL_Image *im;
+
+//   re = (Render_Engine *)data;
+   if (!image) return 1;
+   im = image;
+   return im->alpha;
+}
+
+static int
+eng_image_colorspace_get(void *data, void *image)
+{
+//   Render_Engine *re;
+   Evas_GL_Image *im;
+
+//   re = (Render_Engine *)data;
+   if (!image) return EVAS_COLORSPACE_ARGB8888;
+   im = image;
+   return im->cs.space;
+}
+
+static void *
+eng_image_alpha_set(void *data, void *image, int has_alpha)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im;
+
+   re = (Render_Engine *)data;
+   if (!image) return NULL;
+   im = image;
+   if (im->native.data)
+     {
+        im->alpha = has_alpha;
+        return image;
+     }
+   eng_window_use(re->win);
+   /* FIXME: can move to gl_common */
+   if (im->cs.space != EVAS_COLORSPACE_ARGB8888) return im;
+   if ((has_alpha) && (im->im->cache_entry.flags.alpha)) return image;
+   else if ((!has_alpha) && (!im->im->cache_entry.flags.alpha)) return image;
+   if (im->references > 1)
+     {
+        Evas_GL_Image *im_new;
+        
+        im_new = evas_gl_common_image_new_from_copied_data(im->gc, im->im->cache_entry.w, im->im->cache_entry.h, im->im->image.data,
+                                                           eng_image_alpha_get(data, image),
+                                                           eng_image_colorspace_get(data, image));
+        if (!im_new) return im;
+        evas_gl_common_image_free(im);
+        im = im_new;
+     }
+   else
+     evas_gl_common_image_dirty(im, 0, 0, 0, 0);
+   return evas_gl_common_image_alpha_set(im, has_alpha ? 1 : 0);
+//   im->im->cache_entry.flags.alpha = has_alpha ? 1 : 0;
+//   return image;
+}
+
+static void *
+eng_image_border_set(void *data, void *image, int l __UNUSED__, int r __UNUSED__, int t __UNUSED__, int b __UNUSED__)
+{
+//   Render_Engine *re;
+//
+//   re = (Render_Engine *)data;
+   return image;
+}
+
+static void
+eng_image_border_get(void *data, void *image __UNUSED__, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__)
+{
+//   Render_Engine *re;
+//
+//   re = (Render_Engine *)data;
+}
+
+static char *
+eng_image_comment_get(void *data, void *image, char *key __UNUSED__)
+{
+//   Render_Engine *re;
+   Evas_GL_Image *im;
+
+//   re = (Render_Engine *)data;
+   if (!image) return NULL;
+   im = image;
+   if (!im->im) return NULL;
+   return im->im->info.comment;
+}
+
+static char *
+eng_image_format_get(void *data, void *image)
+{
+//   Render_Engine *re;
+   Evas_GL_Image *im;
+
+//   re = (Render_Engine *)data;
+   im = image;
+   return NULL;
+}
+
+static void
+eng_image_colorspace_set(void *data, void *image, int cspace)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im;
+
+   re = (Render_Engine *)data;
+   if (!image) return;
+   im = image;
+   if (im->native.data) return;
+   /* FIXME: can move to gl_common */
+   if (im->cs.space == cspace) return;
+   eng_window_use(re->win);
+   evas_cache_image_colorspace(&im->im->cache_entry, cspace);
+   switch (cspace)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (im->cs.data)
+         {
+            if (!im->cs.no_free) free(im->cs.data);
+            im->cs.data = NULL;
+            im->cs.no_free = 0;
+         }
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+        if (im->tex) evas_gl_common_texture_free(im->tex);
+        im->tex = NULL;
+       if (im->cs.data)
+         {
+            if (!im->cs.no_free) free(im->cs.data);
+         }
+        if (im->im->cache_entry.h > 0)
+          im->cs.data = 
+          calloc(1, im->im->cache_entry.h * sizeof(unsigned char *) * 2);
+        else
+          im->cs.data = NULL;
+       im->cs.no_free = 0;
+       break;
+      default:
+       abort();
+       break;
+     }
+   im->cs.space = cspace;
+}
+
+/////////////////////////////////////////////////////////////////////////
+//
+//
+typedef struct _Native Native;
+
+struct _Native
+{
+   Evas_Native_Surface ns;
+   Pixmap     pixmap;
+   Visual    *visual;
+   
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+   void      *egl_surface;
+#else
+   void  *fbc;
+   XID    glx_pixmap;
+#endif
+};
+
+// FIXME: this is enabled so updates happen - but its SLOOOOOOOOOOOOOOOW
+// (i am sure this is the reason)  not to mention seemingly superfluous. but
+// i need to enable it for it to work on fglrx at least. havent tried nvidia.
+// 
+// why is this the case? does anyone know? has anyone tried it on other gfx
+// drivers?
+// 
+//#define GLX_TEX_PIXMAP_RECREATE 1
+
+static void
+_native_bind_cb(void *data, void *image)
+{
+   Render_Engine *re = data;
+   Evas_GL_Image *im = image;
+   Native *n = im->native.data;
+   
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+   if (n->egl_surface)
+     {
+        if (glsym_glEGLImageTargetTexture2DOES)
+          {
+             glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, n->egl_surface);
+             if (eglGetError() != EGL_SUCCESS)
+               {
+                  printf("Error:  glEGLImageTargetTexture2DOES() fail.\n");
+               }
+          }
+        else
+          {
+             printf("Try glEGLImageTargetTexture2DOES on EGL with no support\n");
+          }
+     }
+#else
+# ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
+   if (glsym_glXBindTexImage)
+     {
+        glsym_glXBindTexImage(re->win->disp, n->glx_pixmap, 
+                              GLX_FRONT_LEFT_EXT, NULL);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+     }
+   else
+     {
+        printf("Try glXBindTexImage on GLX with no support\n");
+     }
+# endif
+#endif
+}
+
+static void
+_native_unbind_cb(void *data, void *image)
+{
+   Render_Engine *re = data;
+   Evas_GL_Image *im = image;
+   Native *n = im->native.data;
+
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+   // nothing
+#else
+# ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
+   if (glsym_glXReleaseTexImage)
+     {
+        glsym_glXReleaseTexImage(re->win->disp, n->glx_pixmap, 
+                                 GLX_FRONT_LEFT_EXT);
+        GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+     }
+   else
+     {
+        printf("Try glXReleaseTexImage on GLX with no support\n");
+     }
+# endif
+#endif
+}
+
+static void
+_native_free_cb(void *data, void *image)
+{
+   Render_Engine *re = data;
+   Evas_GL_Image *im = image;
+   Native *n = im->native.data;
+
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+   if (n->egl_surface)
+     {
+        if (glsym_eglDestroyImage)
+          {
+             glsym_eglDestroyImage(re->win->egl_disp,
+                                   n->egl_surface);
+             if (eglGetError() != EGL_SUCCESS)
+               {
+                  printf("Error:  eglDestroyImage() fail.\n");
+               }
+          }
+        else
+          {
+             printf("Try eglDestroyImage on EGL with no support\n");
+          }
+     }
+#else
+# ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
+   if (n->glx_pixmap)
+     {
+        if (im->native.loose)
+          {
+             if (glsym_glXReleaseTexImage)
+               {
+                  glsym_glXReleaseTexImage(re->win->disp, n->glx_pixmap,
+                                           GLX_FRONT_LEFT_EXT);
+                  GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+               }
+             else
+               {
+                  printf("Try glXReleaseTexImage on GLX with no support\n");
+               }
+          }
+        if (glsym_glXDestroyPixmap)
+          {
+             glsym_glXDestroyPixmap(re->win->disp, n->glx_pixmap);
+             GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+          }
+        else
+          {
+             printf("Try glXDestroyPixmap on GLX with no support\n");
+          }
+        n->glx_pixmap = 0;
+     }
+# endif
+#endif
+   im->native.data        = NULL;
+   im->native.func.data   = NULL;
+   im->native.func.bind   = NULL;
+   im->native.func.unbind = NULL;
+   im->native.func.free   = NULL;
+   free(n);
+}
+
+static void
+eng_image_native_set(void *data, void *image, void *native)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_Native_Surface *ns = native;
+   Evas_GL_Image *im = image;
+   Visual *vis = NULL;
+   Pixmap pm = 0;
+
+   if (!im) return;
+   if (ns)
+     {
+        vis = ns->data.x11.visual;
+        pm = ns->data.x11.pixmap;
+        if (im->native.data)
+          {
+             Evas_Native_Surface *n = im->native.data;
+             if ((n->data.x11.visual == vis) && (n->data.x11.pixmap == pm))
+               {
+                  return;
+               }
+          }
+     }
+   if ((!ns) && (!im->native.data)) return;
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+   if (im->native.data)
+     {
+        if (im->native.func.free)
+          im->native.func.free(im->native.func.data, im);
+        evas_gl_common_image_native_disable(im);
+        im->native.data = NULL;
+     }
+   if (native)
+     {
+        Native *n;
+        
+        n = calloc(1, sizeof(Native));
+        if (n)
+          {
+             EGLConfig egl_config;
+             int config_attrs[20];
+             int num_config, i;
+             
+             i = 0;
+             config_attrs[i++] = EGL_RED_SIZE;
+             config_attrs[i++] = 8;
+             config_attrs[i++] = EGL_GREEN_SIZE;
+             config_attrs[i++] = 8;
+             config_attrs[i++] = EGL_BLUE_SIZE;
+             config_attrs[i++] = 8;
+             config_attrs[i++] = EGL_ALPHA_SIZE;
+             config_attrs[i++] = 8;
+             config_attrs[i++] = EGL_DEPTH_SIZE;
+             config_attrs[i++] = 0;
+             config_attrs[i++] = EGL_STENCIL_SIZE;
+             config_attrs[i++] = 0;
+             config_attrs[i++] = EGL_RENDERABLE_TYPE;
+             config_attrs[i++] = EGL_OPENGL_ES2_BIT;
+             config_attrs[i++] = EGL_SURFACE_TYPE;
+             config_attrs[i++] = EGL_PIXMAP_BIT;
+             config_attrs[i++] = EGL_NONE;
+             
+             if (!eglChooseConfig(re->win->egl_disp, config_attrs, 
+                                  &egl_config, 1, &num_config))
+               {
+                  printf("ERROR: eglChooseConfig() failed for pixmap 0x%x, num_config = %i\n", (unsigned int)pm, num_config);
+               }
+             n->pixmap = pm;
+             n->visual = vis;
+             im->native.yinvert     = 1;
+             im->native.loose       = 0;
+             im->native.data        = n;
+             im->native.func.data   = re;
+             im->native.func.bind   = _native_bind_cb;
+             im->native.func.unbind = _native_unbind_cb;
+             im->native.func.free   = _native_free_cb;
+             im->native.target      = GL_TEXTURE_2D;
+             im->native.mipmap      = 0;
+             if (glsym_eglCreateImage)
+               {
+                  n->egl_surface = glsym_eglCreateImage(re->win->egl_disp,
+                                                        EGL_NO_CONTEXT,
+                                                        EGL_NATIVE_PIXMAP_KHR,
+                                                        (void *)pm,
+                                                        NULL);
+               }
+             else
+               {
+                  printf("Try eglCreateImage on EGL with no support\n");
+               }
+             if (!n->egl_surface)
+               {
+                  printf("ERROR: eglCreatePixmapSurface() for 0x%x failed\n", (unsigned int)pm);
+               }
+             evas_gl_common_image_native_enable(im);
+          }
+     }
+#else
+# ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
+   if (im->native.data)
+     {
+        if (im->native.func.free)
+          im->native.func.free(im->native.func.data, im);
+        evas_gl_common_image_native_disable(im);
+     }
+   if (native)
+     {
+        int dummy;
+        unsigned int w, h, depth = 32, border;
+        Window wdummy;
+        Native *n;
+
+        // fixme: round trip :(
+        XGetGeometry(re->win->disp, pm, &wdummy, &dummy, &dummy, 
+                     &w, &h, &border, &depth);
+        n = calloc(1, sizeof(Native));
+        if (n)
+          {
+             int pixmap_att[20];
+             int target = 0;
+             int i = 0;
+
+             if ((re->win->depth_cfg[depth].tex_target &
+                  GLX_TEXTURE_2D_BIT_EXT) 
+//                 && (1) // we assume npo2 for now
+                 // size is pow2 || mnpo2 supported
+                 )
+               {
+                  target = GLX_TEXTURE_2D_EXT;
+               }
+             else if ((re->win->depth_cfg[depth].tex_target &
+                      GLX_TEXTURE_RECTANGLE_BIT_EXT))
+               {
+                  printf("rect!!! (not handled)\n");
+                  target = GLX_TEXTURE_RECTANGLE_EXT;
+               }
+             if (!target)
+               {
+                  printf("broken text-from-pixmap\n");
+                  if (!(re->win->depth_cfg[depth].tex_target &
+                        GLX_TEXTURE_2D_BIT_EXT))
+                    {
+                       target = GLX_TEXTURE_RECTANGLE_EXT;
+                    }
+                  else if (!(re->win->depth_cfg[depth].tex_target &
+                             GLX_TEXTURE_RECTANGLE_BIT_EXT))
+                    {
+                       target = GLX_TEXTURE_2D_EXT;
+                    }
+               }
+             
+             
+             pixmap_att[i++] = GLX_TEXTURE_FORMAT_EXT;
+             pixmap_att[i++] = re->win->depth_cfg[depth].tex_format;
+             pixmap_att[i++] = GLX_MIPMAP_TEXTURE_EXT;
+             pixmap_att[i++] = re->win->depth_cfg[depth].mipmap;
+             
+             if (target)
+               {
+                  pixmap_att[i++] = GLX_TEXTURE_TARGET_EXT;
+                  pixmap_att[i++] = target;
+               }
+             
+             pixmap_att[i++] = 0;
+
+             memcpy(&(n->ns), ns, sizeof(Evas_Native_Surface));
+             n->pixmap = pm;
+             n->visual = vis;
+             n->fbc = re->win->depth_cfg[depth].fbc;
+             im->native.yinvert     = re->win->depth_cfg[depth].yinvert;
+             im->native.loose       = re->win->detected.loose_binding;
+             im->native.data        = n;
+             im->native.func.data   = re;
+             im->native.func.bind   = _native_bind_cb;
+             im->native.func.unbind = _native_unbind_cb;
+             im->native.func.free   = _native_free_cb;
+             if (glsym_glXCreatePixmap)
+               {
+                  n->glx_pixmap = glsym_glXCreatePixmap(re->win->disp, n->fbc, 
+                                                        n->pixmap, pixmap_att);
+               }
+             else
+               {
+                  printf("Try glXCreatePixmap on GLX with no support\n");
+               }
+             if (n->glx_pixmap)
+               {
+//             printf("new native texture for %x | %4i x %4i @ %2i = %p\n",
+//                    pm, w, h, depth, n->glx_pixmap);
+                  if (!target)
+                    {
+                       printf("no target :(\n");
+                       if (glsym_glXQueryDrawable)
+                         glsym_glXQueryDrawable(re->win->disp, n->pixmap, GLX_TEXTURE_TARGET_EXT, &target);
+                    }
+                  if (target == GLX_TEXTURE_2D_EXT)
+                    {
+                       im->native.target = GL_TEXTURE_2D;
+                       im->native.mipmap = re->win->depth_cfg[depth].mipmap;
+                    }
+#ifdef GL_TEXTURE_RECTANGLE_ARB             
+                  else if (target == GLX_TEXTURE_RECTANGLE_EXT)
+                    {
+                       im->native.target = GL_TEXTURE_RECTANGLE_ARB;
+                       im->native.mipmap = 0;
+                    }
+#endif             
+                  else
+                    {
+                       im->native.target = GL_TEXTURE_2D;
+                       im->native.mipmap = 0;
+                       printf("still unknown target\n");
+                    }
+               }
+             else
+               {
+                  printf("ERROR: GLX Pixmap create fail\n");
+               }
+
+             evas_gl_common_image_native_enable(im);
+          }
+     }
+# endif   
+#endif
+}
+
+static void *
+eng_image_native_get(void *data, void *image)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_GL_Image *im = image;
+   Native *n;
+   if (!im) return NULL;
+   n = im->native.data;
+   if (!n) return NULL;
+   return &(n->ns);
+}
+
+//
+//
+/////////////////////////////////////////////////////////////////////////
+
+static void *
+eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   *error = EVAS_LOAD_ERROR_NONE;
+   eng_window_use(re->win);
+   return evas_gl_common_image_load(re->win->gl_context, file, key, lo, error);
+}
+
+static void *
+eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_use(re->win);
+   return evas_gl_common_image_new_from_data(re->win->gl_context, w, h, image_data, alpha, cspace);
+}
+
+static void *
+eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_use(re->win);
+   return evas_gl_common_image_new_from_copied_data(re->win->gl_context, w, h, image_data, alpha, cspace);
+}
+
+static void
+eng_image_free(void *data, void *image)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (!image) return;
+   eng_window_use(re->win);
+   evas_gl_common_image_free(image);
+}
+
+static void
+eng_image_size_get(void *data, void *image, int *w, int *h)
+{
+//   Render_Engine *re;
+//
+//   re = (Render_Engine *)data;
+   if (!image)
+     {
+       *w = 0;
+       *h = 0;
+       return;
+     }
+   if (w) *w = ((Evas_GL_Image *)image)->w;
+   if (h) *h = ((Evas_GL_Image *)image)->h;
+}
+
+static void *
+eng_image_size_set(void *data, void *image, int w, int h)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im = image;
+   Evas_GL_Image *im_old;
+   
+   re = (Render_Engine *)data;
+   if (!im) return NULL;
+   if (im->native.data)
+     {
+        im->w = w;
+        im->h = h;
+        return image;
+     }
+   eng_window_use(re->win);
+   im_old = image;
+   if ((eng_image_colorspace_get(data, image) == EVAS_COLORSPACE_YCBCR422P601_PL) ||
+       (eng_image_colorspace_get(data, image) == EVAS_COLORSPACE_YCBCR422P709_PL))
+     w &= ~0x1;
+   if ((im_old) && (im_old->im->cache_entry.w == w) && (im_old->im->cache_entry.h == h))
+     return image;
+   if (im_old)
+     {
+       im = evas_gl_common_image_new(re->win->gl_context, w, h,
+                                     eng_image_alpha_get(data, image),
+                                     eng_image_colorspace_get(data, image));
+/*
+       evas_common_load_image_data_from_file(im_old->im);
+       if (im_old->im->image->data)
+         {
+            evas_common_blit_rectangle(im_old->im, im->im, 0, 0, w, h, 0, 0);
+            evas_common_cpu_end_opt();
+         }
+ */
+        evas_gl_common_image_free(im_old);
+     }
+   else
+     im = evas_gl_common_image_new(re->win->gl_context, w, h, 1, EVAS_COLORSPACE_ARGB8888);
+   return im;
+}
+
+static void *
+eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im = image;
+
+   re = (Render_Engine *)data;
+   if (!image) return NULL;
+   if (im->native.data) return image;
+   eng_window_use(re->win);
+   evas_gl_common_image_dirty(image, x, y, w, h);
+   return image;
+}
+
+static void *
+eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im;
+
+   re = (Render_Engine *)data;
+   if (!image)
+     {
+       *image_data = NULL;
+       return NULL;
+     }
+   im = image;
+   if (im->native.data)
+     {
+        *image_data = NULL;
+        return im;
+     }
+   eng_window_use(re->win);
+   evas_cache_image_load_data(&im->im->cache_entry);
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (to_write)
+         {
+            if (im->references > 1)
+              {
+                 Evas_GL_Image *im_new;
+
+                 im_new = evas_gl_common_image_new_from_copied_data(im->gc, im->im->cache_entry.w, im->im->cache_entry.h, im->im->image.data,
+                                                                    eng_image_alpha_get(data, image),
+                                                                    eng_image_colorspace_get(data, image));
+                 if (!im_new)
+                   {
+                      *image_data = NULL;
+                      return im;
+                   }
+                 evas_gl_common_image_free(im);
+                 im = im_new;
+              }
+            else
+              evas_gl_common_image_dirty(im, 0, 0, 0, 0);
+         }
+       *image_data = im->im->image.data;
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       *image_data = im->cs.data;
+       break;
+      default:
+       abort();
+       break;
+     }
+   return im;
+}
+
+static void *
+eng_image_data_put(void *data, void *image, DATA32 *image_data)
+{
+   Render_Engine *re;
+   Evas_GL_Image *im, *im2;
+
+   re = (Render_Engine *)data;
+   if (!image) return NULL;
+   im = image;
+   if (im->native.data) return image;
+   eng_window_use(re->win);
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (image_data != im->im->image.data)
+         {
+            int w, h;
+
+            w = im->im->cache_entry.w;
+            h = im->im->cache_entry.h;
+            im2 = eng_image_new_from_data(data, w, h, image_data,
+                                          eng_image_alpha_get(data, image),
+                                          eng_image_colorspace_get(data, image));
+            if (!im2) return im;
+            evas_gl_common_image_free(im);
+            im = im2;
+         }
+        break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+        if (image_data != im->cs.data)
+         {
+            if (im->cs.data)
+              {
+                 if (!im->cs.no_free) free(im->cs.data);
+              }
+            im->cs.data = image_data;
+         }
+       break;
+      default:
+       abort();
+       break;
+     }
+   /* hmmm - but if we wrote... why bother? */
+   evas_gl_common_image_dirty(im, 0, 0, 0, 0);
+   return im;
+}
+
+static void
+eng_image_data_preload_request(void *data __UNUSED__, void *image, const void *target)
+{
+   Evas_GL_Image *gim = image;
+   RGBA_Image *im;
+
+   if (!gim) return;
+   if (gim->native.data) return;
+   im = (RGBA_Image *)gim->im;
+   if (!im) return;
+   evas_cache_image_preload_data(&im->cache_entry, target);
+}
+
+static void
+eng_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target)
+{
+   Evas_GL_Image *gim = image;
+   RGBA_Image *im;
+
+   if (!gim) return;
+   if (gim->native.data) return;
+   im = (RGBA_Image *)gim->im;
+   if (!im) return;
+   evas_cache_image_preload_cancel(&im->cache_entry, target);
+}
+
+static void
+eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (!image) return;
+   eng_window_use(re->win);
+   evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
+   re->win->gl_context->dc = context;
+   evas_gl_common_image_draw(re->win->gl_context, image,
+                             src_x, src_y, src_w, src_h,
+                             dst_x, dst_y, dst_w, dst_h,
+                             smooth);
+}
+
+static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static void
+eng_image_map4_draw(void *data __UNUSED__, void *context, void *surface, void *image, RGBA_Map_Point *p, int smooth, int level)
+{
+   Render_Engine *re;
+   
+   re = (Render_Engine *)data;
+   eng_window_use(re->win);
+   evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
+   re->win->gl_context->dc = context;
+   evas_gl_common_image_map4_draw(re->win->gl_context, image, p, smooth, level);
+}
+
+static void *
+eng_image_map_surface_new(void *data __UNUSED__, int w, int h, int alpha)
+{
+   Render_Engine *re;
+   
+   re = (Render_Engine *)data;
+   return evas_gl_common_image_surface_new(re->win->gl_context, w, h, alpha);
+}
+
+static void
+eng_image_map_surface_free(void *data __UNUSED__, void *surface)
+{
+   evas_gl_common_image_free(surface);
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+static void
+eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, const char *text)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   eng_window_use(re->win);
+   evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
+   re->win->gl_context->dc = context;
+     {
+        // FIXME: put im into context so we can free it
+       static RGBA_Image *im = NULL;
+        
+        if (!im)
+          im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
+        im->cache_entry.w = re->win->w;
+        im->cache_entry.h = re->win->h;
+        evas_common_draw_context_font_ext_set(context,
+                                             re->win->gl_context,
+                                             evas_gl_font_texture_new,
+                                             evas_gl_font_texture_free,
+                                             evas_gl_font_texture_draw);
+       evas_common_font_draw(im, context, font, x, y, text);
+       evas_common_draw_context_font_ext_set(context,
+                                             NULL,
+                                             NULL,
+                                             NULL,
+                                             NULL);
+     }
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data __UNUSED__, void *info __UNUSED__)
+{
+   // FIXME: support ARGB gl targets!!!
+   return EINA_FALSE;
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   static Eina_Bool xrm_inited = EINA_FALSE;
+   if (!xrm_inited)
+     {
+       xrm_inited = EINA_TRUE;
+       XrmInitialize();
+     }
+
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
+   if (_evas_engine_GL_X11_log_dom < 0)
+     _evas_engine_GL_X11_log_dom = eina_log_domain_register("EvasEngineGLX11", EVAS_DEFAULT_LOG_COLOR);
+   if (_evas_engine_GL_X11_log_dom < 0)
+     {
+        EINA_LOG_ERR("Impossible to create a log domain for GL X11 engine.\n");
+        return 0;
+     }
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+   #define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(canvas_alpha_get);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(context_cutout_add);
+   ORD(context_cutout_clear);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   ORD(output_dump);
+   ORD(rectangle_draw);
+   ORD(line_draw);
+   ORD(polygon_point_add);
+   ORD(polygon_points_clear);
+   ORD(polygon_draw);
+
+   ORD(gradient2_color_np_stop_insert);
+   ORD(gradient2_clear);
+   ORD(gradient2_fill_transform_set);
+   ORD(gradient2_fill_spread_set);
+   ORD(gradient2_linear_new);
+   ORD(gradient2_linear_free);
+   ORD(gradient2_linear_fill_set);
+   ORD(gradient2_linear_is_opaque);
+   ORD(gradient2_linear_is_visible);
+   ORD(gradient2_linear_render_pre);
+   ORD(gradient2_linear_render_post);
+   ORD(gradient2_linear_draw);
+   ORD(gradient2_radial_new);
+   ORD(gradient2_radial_free);
+   ORD(gradient2_radial_fill_set);
+   ORD(gradient2_radial_is_opaque);
+   ORD(gradient2_radial_is_visible);
+   ORD(gradient2_radial_render_pre);
+   ORD(gradient2_radial_render_post);
+   ORD(gradient2_radial_draw);
+
+   ORD(gradient_new);
+   ORD(gradient_free);
+   ORD(gradient_color_stop_add);
+   ORD(gradient_alpha_stop_add);
+   ORD(gradient_color_data_set);
+   ORD(gradient_alpha_data_set);
+   ORD(gradient_clear);
+   ORD(gradient_fill_set);
+   ORD(gradient_fill_angle_set);
+   ORD(gradient_fill_spread_set);
+   ORD(gradient_angle_set);
+   ORD(gradient_offset_set);
+   ORD(gradient_direction_set);
+   ORD(gradient_type_set);
+   ORD(gradient_is_opaque);
+   ORD(gradient_is_visible);
+   ORD(gradient_render_pre);
+   ORD(gradient_render_post);
+   ORD(gradient_draw);
+   ORD(image_load);
+   ORD(image_new_from_data);
+   ORD(image_new_from_copied_data);
+   ORD(image_free);
+   ORD(image_size_get);
+   ORD(image_size_set);
+   ORD(image_dirty_region);
+   ORD(image_data_get);
+   ORD(image_data_put);
+   ORD(image_data_preload_request);
+   ORD(image_data_preload_cancel);
+   ORD(image_alpha_set);
+   ORD(image_alpha_get);
+   ORD(image_border_set);
+   ORD(image_border_get);
+   ORD(image_draw);
+   ORD(image_comment_get);
+   ORD(image_format_get);
+   ORD(image_colorspace_set);
+   ORD(image_colorspace_get);
+   ORD(image_native_set);
+   ORD(image_native_get);
+   ORD(font_draw);
+   
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+   
+   ORD(image_map4_draw);
+   ORD(image_map_surface_new);
+   ORD(image_map_surface_free);
+   
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+    eina_log_domain_unregister(_evas_engine_GL_X11_log_dom);
+    if (xrdb_user.db)
+      {
+        XrmDestroyDatabase(xrdb_user.db);
+        xrdb_user.last_stat = 0;
+        xrdb_user.last_mtime = 0;
+        xrdb_user.db = NULL;
+      }
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "gl_x11",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, gl_x11);
+
+#ifndef EVAS_STATIC_BUILD_GL_X11
+EVAS_EINA_MODULE_DEFINE(engine, gl_x11);
+#endif
diff --git a/src/modules/engines/gl_x11/evas_engine.h b/src/modules/engines/gl_x11/evas_engine.h
new file mode 100644 (file)
index 0000000..2d0a3f6
--- /dev/null
@@ -0,0 +1,125 @@
+#ifndef EVAS_ENGINE_H
+#define EVAS_ENGINE_H
+
+#include "config.h"
+#ifdef HAVE_GL_GLEW_H
+# include <GL/glxew.h>
+#else
+# if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+#  if defined(GLES_VARIETY_S3C6410)
+#   include <EGL/egl.h>
+#   include <GLES2/gl2.h>
+#   include <X11/Xlib.h>
+#   include <X11/Xatom.h>
+#   include <X11/Xutil.h>
+#   include <X11/extensions/Xrender.h>
+# include <X11/Xresource.h> // xres - dpi
+#  elif defined(GLES_VARIETY_SGX)
+#   define SUPPORT_X11 1
+#   include <EGL/egl.h>
+#   include <GLES2/gl2.h>
+#   include <GLES2/gl2ext.h>
+#   include <X11/Xlib.h>
+#   include <X11/Xatom.h>
+#   include <X11/Xutil.h>
+#   include <X11/extensions/Xrender.h>
+#   include <X11/Xresource.h> // xres - dpi
+#endif
+# else
+#  include <GL/glx.h>
+#  include <X11/Xlib.h>
+#  include <X11/Xatom.h>
+#  include <X11/Xutil.h>
+#  include <X11/extensions/Xrender.h>
+#  include <X11/Xresource.h> // xres - dpi
+#  include <GL/gl.h>
+#  include <GL/glext.h>
+#  include <GL/glx.h>
+# endif
+#endif
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_gl_common.h"
+#include "Evas.h"
+#include "Evas_Engine_GL_X11.h"
+
+extern int _evas_engine_GL_X11_log_dom ;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_GL_X11_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_GL_X11_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_GL_X11_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_GL_X11_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_GL_X11_log_dom, __VA_ARGS__)
+
+typedef struct _Evas_GL_X11_Window Evas_GL_X11_Window;
+
+struct _Evas_GL_X11_Window
+{
+   Display         *disp;
+   Window           win;
+   int              w, h;
+   int              screen;
+   XVisualInfo     *visualinfo;
+   Visual          *visual;
+   Colormap         colormap;
+   int              depth;
+   int              alpha;
+   int              rot;
+   Evas_GL_Context *gl_context;
+   struct {
+      int              redraw : 1;
+      int              drew : 1;
+      int              x1, y1, x2, y2;
+   } draw;
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+   EGLContext       egl_context[1];
+   EGLSurface       egl_surface[1];
+   EGLConfig        egl_config;
+   EGLDisplay       egl_disp;
+#else   
+   GLXContext       context;
+   GLXWindow        glxwin;
+   struct {
+      GLXFBConfig   fbc;
+      int           tex_format;
+      int           tex_target;
+      int           mipmap;
+      unsigned char yinvert : 1;
+   } depth_cfg[33]; // config for all 32 possible depths!
+   
+   struct {
+      unsigned int loose_binding : 1;
+   } detected;
+#endif
+
+};
+
+Evas_GL_X11_Window *eng_window_new(Display *disp, Window win, int screen,
+                                   Visual *vis, Colormap cmap,
+                                   int depth, int w, int h, int indirect,
+                                   int alpha, int rot);
+void      eng_window_free(Evas_GL_X11_Window *gw);
+void      eng_window_use(Evas_GL_X11_Window *gw);
+Visual   *eng_best_visual_get(Evas_Engine_Info_GL_X11 *einfo);
+Colormap  eng_best_colormap_get(Evas_Engine_Info_GL_X11 *einfo);
+int       eng_best_depth_get(Evas_Engine_Info_GL_X11 *einfo);
+
+#endif
diff --git a/src/modules/engines/gl_x11/evas_x_main.c b/src/modules/engines/gl_x11/evas_x_main.c
new file mode 100644 (file)
index 0000000..83595a1
--- /dev/null
@@ -0,0 +1,666 @@
+#include "evas_engine.h"
+
+static Evas_GL_X11_Window *_evas_gl_x11_window = NULL;
+
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+static EGLContext context = EGL_NO_CONTEXT;
+#else
+// FIXME: this will only work for 1 display connection (glx land can have > 1)
+static GLXContext context = 0;
+static GLXContext rgba_context = 0;
+static GLXFBConfig fbconf = 0;
+static GLXFBConfig rgba_fbconf = 0;
+#endif
+
+// fixme: something is up/wrong here - dont know what tho...
+//#define NEWGL 1
+
+static XVisualInfo *_evas_gl_x11_vi = NULL;
+static XVisualInfo *_evas_gl_x11_rgba_vi = NULL;
+static Colormap     _evas_gl_x11_cmap = 0;
+static Colormap     _evas_gl_x11_rgba_cmap = 0;
+
+static int win_count = 0;
+
+Evas_GL_X11_Window *
+eng_window_new(Display *disp,
+              Window   win,
+              int      screen,
+              Visual  *vis,
+              Colormap cmap,
+              int      depth,
+              int      w,
+              int      h,
+               int      indirect,
+               int      alpha,
+               int      rot)
+{
+   Evas_GL_X11_Window *gw;
+   int context_attrs[3];
+   int config_attrs[40];
+   int major_version, minor_version;
+   int num_config, n = 0;
+   XVisualInfo *vi_use;
+   const GLubyte *vendor, *renderer, *version;
+   
+   if (!_evas_gl_x11_vi) return NULL;
+   
+   gw = calloc(1, sizeof(Evas_GL_X11_Window));
+   if (!gw) return NULL;
+   gw->disp = disp;
+   gw->win = win;
+   gw->screen = screen;
+   gw->visual = vis;
+   gw->colormap = cmap;
+   gw->depth = depth;
+   gw->alpha = alpha;
+   gw->w = w;
+   gw->h = h;
+   gw->rot = rot;
+
+   vi_use = _evas_gl_x11_vi;
+   if (alpha)
+     {
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+        if (_evas_gl_x11_rgba_vi)
+          {
+             vi_use = _evas_gl_x11_rgba_vi;
+          }
+#else
+#ifdef NEWGL
+        if (_evas_gl_x11_rgba_vi)
+          {
+             vi_use = _evas_gl_x11_rgba_vi;
+          }
+#endif        
+#endif        
+     }
+   gw->visualinfo = vi_use;
+   
+// EGL / GLES
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+   context_attrs[0] = EGL_CONTEXT_CLIENT_VERSION;
+   context_attrs[1] = 2;
+   context_attrs[2] = EGL_NONE;
+
+# if defined(GLES_VARIETY_S3C6410)
+   if (gw->visualinfo->depth == 16) // 16bpp
+     {
+        config_attrs[n++] = EGL_SURFACE_TYPE;
+        config_attrs[n++] = EGL_WINDOW_BIT;
+        config_attrs[n++] = EGL_RENDERABLE_TYPE;
+        config_attrs[n++] = EGL_OPENGL_ES2_BIT;
+        config_attrs[n++] = EGL_RED_SIZE;
+        config_attrs[n++] = 5;
+        config_attrs[n++] = EGL_GREEN_SIZE;
+        config_attrs[n++] = 6;
+        config_attrs[n++] = EGL_BLUE_SIZE;
+        config_attrs[n++] = 5;
+        config_attrs[n++] = EGL_DEPTH_SIZE;
+        config_attrs[n++] = 0;
+        config_attrs[n++] = EGL_STENCIL_SIZE;
+        config_attrs[n++] = 0;
+        config_attrs[n++] = EGL_NONE;
+     }
+   else // 24/32bit. no one does 8bpp anymore. and 15bpp... dead
+     {
+        config_attrs[n++] = EGL_SURFACE_TYPE;
+        config_attrs[n++] = EGL_WINDOW_BIT;
+        config_attrs[n++] = EGL_RENDERABLE_TYPE;
+        config_attrs[n++] = EGL_OPENGL_ES2_BIT;
+        config_attrs[n++] = EGL_RED_SIZE;
+        config_attrs[n++] = 8;
+        config_attrs[n++] = EGL_GREEN_SIZE;
+        config_attrs[n++] = 8;
+        config_attrs[n++] = EGL_BLUE_SIZE;
+        config_attrs[n++] = 8;
+        config_attrs[n++] = EGL_DEPTH_SIZE;
+        config_attrs[n++] = 0;
+        config_attrs[n++] = EGL_STENCIL_SIZE;
+        config_attrs[n++] = 0;
+        config_attrs[n++] = EGL_NONE;
+     }
+# elif defined(GLES_VARIETY_SGX)
+   config_attrs[n++] = EGL_SURFACE_TYPE;
+   config_attrs[n++] = EGL_WINDOW_BIT;
+   config_attrs[n++] = EGL_RENDERABLE_TYPE;
+   config_attrs[n++] = EGL_OPENGL_ES2_BIT;
+#if 0
+// FIXME: n900 - omap3 sgx libs break here
+   config_attrs[n++] = EGL_RED_SIZE;
+   config_attrs[n++] = 1;
+   config_attrs[n++] = EGL_GREEN_SIZE;
+   config_attrs[n++] = 1;
+   config_attrs[n++] = EGL_BLUE_SIZE;
+   config_attrs[n++] = 1;
+// FIXME: end n900 breakage   
+#endif
+   if (alpha)
+     {
+        config_attrs[n++] = EGL_ALPHA_SIZE;
+        config_attrs[n++] = 1;
+     }
+   else
+     {
+        config_attrs[n++] = EGL_ALPHA_SIZE;
+        config_attrs[n++] = 0;
+     }
+   config_attrs[n++] = EGL_DEPTH_SIZE;
+   config_attrs[n++] = 0;
+   config_attrs[n++] = EGL_STENCIL_SIZE;
+   config_attrs[n++] = 0;
+   config_attrs[n++] = EGL_NONE;
+# endif
+   
+   gw->egl_disp= eglGetDisplay((EGLNativeDisplayType)(gw->disp));
+   if (!gw->egl_disp)
+     {
+        printf("Error: eglGetDisplay() fail.\n");
+        printf("Error: error # was: 0x%x\n", eglGetError());
+     }
+   if (!eglInitialize(gw->egl_disp, &major_version, &minor_version))
+     {
+        printf("Error: eglInitialize() fail.\n");
+        printf("Error: error # was: 0x%x\n", eglGetError());
+     }
+   eglBindAPI(EGL_OPENGL_ES_API);
+   if (eglGetError() != EGL_SUCCESS)
+     {
+        printf("Error: eglBindAPI() fail.\n");
+        printf("Error: error # was: 0x%x\n", eglGetError());
+     }
+   
+   num_config = 0;
+   if (!eglChooseConfig(gw->egl_disp, config_attrs, &gw->egl_config,
+                        1, &num_config) || (num_config != 1))
+     {
+        printf("Error: eglChooseConfig() fail.\n");
+        printf("Error: error # was: 0x%x\n", eglGetError());
+     }
+   gw->egl_surface[0] = eglCreateWindowSurface(gw->egl_disp, gw->egl_config,
+                                               (EGLNativeWindowType)gw->win,
+                                               NULL);
+   if (gw->egl_surface[0] == EGL_NO_SURFACE)
+     {
+        printf("Error: eglCreateWindowSurface() fail for 0x%x.\n", (unsigned int)gw->win);
+        printf("Error: error # was: 0x%x\n", eglGetError());
+     }
+   if (context == EGL_NO_CONTEXT)
+     context = eglCreateContext(gw->egl_disp, gw->egl_config, NULL, 
+                                context_attrs);
+   gw->egl_context[0] = context;
+   if (gw->egl_context[0] == EGL_NO_CONTEXT)
+     {
+        printf("Error: eglCreateContext() fail.\n");
+        printf("Error: error # was: 0x%x\n", eglGetError());
+     }
+   if (eglMakeCurrent(gw->egl_disp, 
+                      gw->egl_surface[0], 
+                      gw->egl_surface[0],
+                      gw->egl_context[0]) == EGL_FALSE)
+     {
+        printf("Error: eglMakeCurrent() fail.\n");
+        printf("Error: error # was: 0x%x\n", eglGetError());
+     }
+
+   vendor = glGetString(GL_VENDOR);
+   renderer = glGetString(GL_RENDERER);
+   version = glGetString(GL_VERSION);
+   if (!vendor) vendor = "-UNKNOWN-";
+   if (!renderer) renderer = "-UNKNOWN-";
+   if (!version) version = "-UNKNOWN-";
+   fprintf(stderr, "vendor: %s\n", vendor);
+   fprintf(stderr, "renderer: %s\n", renderer);
+   fprintf(stderr, "version: %s\n", version);
+   
+// GLX   
+#else
+   if (!context)
+     {
+#ifdef NEWGL        
+        if (indirect)
+          context = glXCreateNewContext(disp, fbconf, 
+                                        GLX_RGBA_TYPE, NULL, 
+                                        GL_TRUE);
+        else
+          context = glXCreateNewContext(disp, fbconf, 
+                                        GLX_RGBA_TYPE, NULL, 
+                                        GL_FALSE);
+#else
+        if (indirect)
+          context = glXCreateContext(disp, gw->visualinfo, NULL, GL_FALSE);
+        else
+          context = glXCreateContext(disp, gw->visualinfo, NULL, GL_TRUE);
+#endif
+     }
+#ifdef NEWGL
+   if ((alpha) && (!rgba_context))
+     {
+        if (indirect)
+          rgba_context = glXCreateNewContext(disp, rgba_fbconf, 
+                                             GLX_RGBA_TYPE, context, 
+                                             GL_TRUE);
+        else
+          rgba_context = glXCreateNewContext(disp, rgba_fbconf, 
+                                             GLX_RGBA_TYPE, context, 
+                                             GL_FALSE);
+     }
+   if (alpha)
+     gw->glxwin = glXCreateWindow(disp, rgba_fbconf, gw->win, NULL);
+   else
+     gw->glxwin = glXCreateWindow(disp, fbconf, gw->win, NULL);
+   
+   if (alpha) gw->context = rgba_context;
+   else gw->context = context;
+#else   
+   gw->context = context;
+#endif
+
+   if (gw->context)
+     {
+        int i, j,  num;
+        GLXFBConfig *fbc;
+
+        if (gw->glxwin)
+          {
+             if (!glXMakeContextCurrent(gw->disp, gw->glxwin, gw->glxwin, 
+                                        gw->context))
+               {
+                  printf("Error: glXMakeContextCurrent(%p, %p, %p, %p)\n", (void *)gw->disp, (void *)gw->win, (void *)gw->win, (void *)gw->context);
+               }
+          }
+        else
+          {
+             if (!glXMakeCurrent(gw->disp, gw->win, gw->context))
+               {
+                  printf("Error: glXMakeCurrent(%p, 0x%x, %p) failed\n", (void *)gw->disp, (unsigned int)gw->win, (void *)gw->context);
+               }
+          }
+        
+        // FIXME: move this up to context creation
+
+        vendor = glGetString(GL_VENDOR);
+        renderer = glGetString(GL_RENDERER);
+        version = glGetString(GL_VERSION);
+        
+        fprintf(stderr, "vendor: %s\n", vendor);
+        fprintf(stderr, "renderer: %s\n", renderer);
+        fprintf(stderr, "version: %s\n", version);
+        
+        if (strstr(vendor, "NVIDIA"))
+          {
+             gw->detected.loose_binding = 1;
+          }
+        else
+          {
+             // noothing yet. add more cases and options over time
+          }
+        
+        fbc = glXGetFBConfigs(disp, screen, &num);
+        if (!fbc)
+          {
+             printf("Error: glXGetFBConfigs() returned no fb configs\n");
+          }
+        for (i = 0; i <= 32; i++)
+          {
+             for (j = 0; j < num; j++)
+               {
+                  XVisualInfo *vi;
+                  int vd;
+                  int alpha, val, dbuf, stencil, depth;
+                  int rgba;
+                  
+                  vi = glXGetVisualFromFBConfig(disp, fbc[j]);
+                  if (!vi) continue;
+                  vd = vi->depth;
+                  XFree(vi);
+                  
+                  if (vd != i) continue;
+                  
+                  glXGetFBConfigAttrib(disp, fbc[j], GLX_ALPHA_SIZE, &alpha);
+                  glXGetFBConfigAttrib(disp, fbc[j], GLX_BUFFER_SIZE, &val);
+                  
+                  if ((val != i) && ((val - alpha) != i)) continue;
+                  
+                  val = 0;
+                  rgba = 0;
+                  
+                  if (i == 32)
+                    {
+                       glXGetFBConfigAttrib(disp, fbc[j], GLX_BIND_TO_TEXTURE_RGBA_EXT, &val);
+                       if (val)
+                         {
+                            rgba = 1;
+                            gw->depth_cfg[i].tex_format = GLX_TEXTURE_FORMAT_RGBA_EXT;
+                         }
+                    }
+                  if (!val)
+                    {
+                       if (rgba) continue;
+                       glXGetFBConfigAttrib(disp, fbc[j], GLX_BIND_TO_TEXTURE_RGB_EXT, &val);
+                       if (!val) continue;
+                       gw->depth_cfg[i].tex_format = GLX_TEXTURE_FORMAT_RGB_EXT;
+                    }
+                  
+                  dbuf = 0x7fff;
+                  glXGetFBConfigAttrib(disp, fbc[j], GLX_DOUBLEBUFFER, &val);
+                  if (val > dbuf) continue;
+                  dbuf = val;
+                  
+                  stencil = 0x7fff;
+                  glXGetFBConfigAttrib(disp, fbc[j], GLX_STENCIL_SIZE, &val);
+                  if (val > stencil) continue;
+                  stencil = val;
+                  
+                  depth = 0x7fff;
+                  glXGetFBConfigAttrib(disp, fbc[j], GLX_DEPTH_SIZE, &val);
+                  if (val > depth) continue;
+                  depth = val;
+                  
+                  glXGetFBConfigAttrib(disp, fbc[j], GLX_BIND_TO_MIPMAP_TEXTURE_EXT, &val);
+                  if (val < 0) continue;
+                  gw->depth_cfg[i].mipmap = val;
+                  
+                  glXGetFBConfigAttrib(disp, fbc[j], GLX_Y_INVERTED_EXT, &val);
+                  gw->depth_cfg[i].yinvert = val;
+                  
+                  glXGetFBConfigAttrib(disp, fbc[j], GLX_BIND_TO_TEXTURE_TARGETS_EXT, &val);
+                  gw->depth_cfg[i].tex_target = val;
+                  
+                  gw->depth_cfg[i].fbc = fbc[j];
+               }
+          }
+        XFree(fbc);
+        if (!gw->depth_cfg[DefaultDepth(disp, screen)].fbc)
+          {
+             printf("texture from pixmap not going to work\n");
+          }
+     }
+#endif
+   _evas_gl_x11_window = gw;
+   
+   gw->gl_context = evas_gl_common_context_new();
+   if (!gw->gl_context)
+     {
+       eng_window_free(gw);
+       return NULL;
+     }
+   evas_gl_common_context_use(gw->gl_context);
+   evas_gl_common_context_resize(gw->gl_context, w, h, rot);
+   win_count++;
+   return gw;
+}
+
+void
+eng_window_free(Evas_GL_X11_Window *gw)
+{
+   win_count--;
+   if (gw == _evas_gl_x11_window) _evas_gl_x11_window = NULL;
+   if (gw->gl_context) evas_gl_common_context_free(gw->gl_context);
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+   if (gw->egl_surface[0] != EGL_NO_SURFACE)
+     eglDestroySurface(gw->egl_disp, gw->egl_surface[0]);
+   if (win_count == 0)
+     {
+        if (context) eglDestroyContext(gw->egl_disp, context);
+        eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+        eglTerminate(gw->egl_disp);
+        context = EGL_NO_CONTEXT;
+     }
+#else
+   if (gw->glxwin) glXDestroyWindow(gw->disp, gw->glxwin);
+   if (win_count == 0)
+     {
+        if (context) glXDestroyContext(gw->disp, context);
+        if (rgba_context) glXDestroyContext(gw->disp, rgba_context);
+        context = 0;
+        rgba_context = 0;
+        fbconf = 0;
+        rgba_fbconf = 0;
+     }
+#endif
+   free(gw);
+}
+
+void
+eng_window_use(Evas_GL_X11_Window *gw)
+{
+   if (_evas_gl_x11_window != gw)
+     {
+        if (_evas_gl_x11_window)
+          evas_gl_common_context_flush(_evas_gl_x11_window->gl_context);
+       _evas_gl_x11_window = gw;
+// EGL / GLES
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+        if (eglMakeCurrent(gw->egl_disp, 
+                           gw->egl_surface[0], 
+                           gw->egl_surface[0],
+                           gw->egl_context[0]) == EGL_FALSE)
+          {
+             printf("Error: eglMakeCurrent() failed!\n");
+          }
+// GLX        
+#else
+        if (gw->glxwin)
+          {
+             if (!glXMakeContextCurrent(gw->disp, gw->glxwin, gw->glxwin, 
+                                        gw->context))
+               {
+                  printf("Error: glXMakeContextCurrent(%p, %p, %p, %p)\n", (void *)gw->disp, (void *)gw->win, (void *)gw->win, (void *)gw->context);
+               }
+          }
+        else
+          {
+             if (!glXMakeCurrent(gw->disp, gw->win, gw->context))
+               {
+                  printf("Error: glXMakeCurrent(%p, 0x%x, %p) failed\n", gw->disp, (unsigned int)gw->win, (void *)gw->context);
+               }
+          }
+#endif
+     }
+   evas_gl_common_context_use(gw->gl_context);
+}
+
+Visual *
+eng_best_visual_get(Evas_Engine_Info_GL_X11 *einfo)
+{
+   if (!einfo) return NULL;
+   if (!einfo->info.display) return NULL;
+   if (!_evas_gl_x11_vi)
+     {
+        int alpha;
+        
+// EGL / GLES
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+        for (alpha = 0; alpha < 2; alpha++)
+          {
+             int depth = DefaultDepth(einfo->info.display,
+                                      einfo->info.screen);
+             if (alpha)
+               {
+                  XVisualInfo *xvi, vi_in;
+                  int nvi, i;
+                  XRenderPictFormat *fmt;
+                  
+                  vi_in.screen = einfo->info.screen;
+                  vi_in.depth = 32;
+                  vi_in.class = TrueColor;
+                  xvi = XGetVisualInfo(einfo->info.display,
+                                       VisualScreenMask | VisualDepthMask |
+                                       VisualClassMask,
+                                       &vi_in, &nvi);
+                  if (xvi)
+                    {
+                       for (i = 0; i < nvi; i++)
+                         {  
+                            fmt = XRenderFindVisualFormat(einfo->info.display, 
+                                                          xvi[i].visual);
+                            if ((fmt->type == PictTypeDirect) && 
+                                (fmt->direct.alphaMask))
+                              {
+                                 _evas_gl_x11_rgba_vi = 
+                                   calloc(1, sizeof(XVisualInfo));
+                                 if (_evas_gl_x11_rgba_vi)
+                                   memcpy(_evas_gl_x11_rgba_vi, 
+                                          &(xvi[i]), sizeof(XVisualInfo));
+                                 break;
+                              }
+                         }
+                       XFree (xvi);
+                    }
+               }
+             else
+               {
+                  _evas_gl_x11_vi = calloc(1, sizeof(XVisualInfo));
+                  XMatchVisualInfo(einfo->info.display,
+                                   einfo->info.screen, depth, TrueColor,
+                                   _evas_gl_x11_vi);
+               }
+          }
+// GLX
+#else
+        for (alpha = 0; alpha < 2; alpha++)
+          {
+             int config_attrs[40];
+             GLXFBConfig *configs = NULL, config = 0;
+             int i, num;
+             
+             i = 0;
+             config_attrs[i++] = GLX_DRAWABLE_TYPE;
+             config_attrs[i++] = GLX_WINDOW_BIT;
+             config_attrs[i++] = GLX_DOUBLEBUFFER;
+             config_attrs[i++] = 1;
+             config_attrs[i++] = GLX_RED_SIZE;
+             config_attrs[i++] = 1;
+             config_attrs[i++] = GLX_GREEN_SIZE;
+             config_attrs[i++] =1;
+             config_attrs[i++] = GLX_BLUE_SIZE;
+             config_attrs[i++] = 1;
+             if (alpha)
+               {
+                  config_attrs[i++] = GLX_RENDER_TYPE;
+                  config_attrs[i++] = GLX_RGBA_BIT;
+                  config_attrs[i++] = GLX_ALPHA_SIZE;
+                  config_attrs[i++] = 1;
+               }
+             else
+               {
+                  config_attrs[i++] = GLX_ALPHA_SIZE;
+                  config_attrs[i++] = 0;
+               }
+             config_attrs[i++] = GLX_DEPTH_SIZE;
+             config_attrs[i++] = 0;
+             config_attrs[i++] = GLX_STENCIL_SIZE;
+             config_attrs[i++] = 0;
+             config_attrs[i++] = GLX_AUX_BUFFERS;
+             config_attrs[i++] = 0;
+             config_attrs[i++] = GLX_STEREO;
+             config_attrs[i++] = 0;
+             config_attrs[i++] = GLX_TRANSPARENT_TYPE;
+             config_attrs[i++] = GLX_NONE;//GLX_NONE;//GLX_TRANSPARENT_INDEX//GLX_TRANSPARENT_RGB;
+             config_attrs[i++] = 0;
+        
+             configs = glXChooseFBConfig(einfo->info.display, 
+                                         einfo->info.screen,
+                                         config_attrs, &num);
+             if ((!configs) || (num < 1))
+               {
+                  printf("Error: glXChooseFBConfig returned no configs\n");
+               }
+             for (i = 0; i < num; i++)
+               {
+                  XVisualInfo *visinfo;
+                  XRenderPictFormat *format = NULL;
+  
+                  visinfo = glXGetVisualFromFBConfig(einfo->info.display, 
+                                                     configs[i]);
+                  if (!visinfo) continue;
+                  if (!alpha)
+                    {
+                       config = configs[i];
+                       _evas_gl_x11_vi = malloc(sizeof(XVisualInfo));
+                       memcpy(_evas_gl_x11_vi, visinfo, sizeof(XVisualInfo));
+                       fbconf = config;
+                       XFree(visinfo);
+                       break;
+                    }
+                  else
+                    {
+                       format = XRenderFindVisualFormat
+                         (einfo->info.display, visinfo->visual);
+                       if (!format)
+                         {
+                            XFree(visinfo);
+                            continue;
+                         }
+                       if (format->direct.alphaMask > 0)
+                         {
+                            config = configs[i];
+                            _evas_gl_x11_rgba_vi = malloc(sizeof(XVisualInfo));
+                            memcpy(_evas_gl_x11_rgba_vi, visinfo, sizeof(XVisualInfo));
+                            rgba_fbconf = config;
+                            XFree(visinfo);
+                            break;
+                         }
+                    }
+                  XFree(visinfo);
+               }
+          }
+#endif
+     }
+   if (!_evas_gl_x11_vi) return NULL;
+   if (einfo->info.destination_alpha)
+     {
+// EGL / GLES
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+        if (_evas_gl_x11_rgba_vi) return _evas_gl_x11_rgba_vi->visual;
+#else        
+# ifdef NEWGL
+        if (_evas_gl_x11_rgba_vi) return _evas_gl_x11_rgba_vi->visual;
+# endif
+#endif        
+     }
+   return _evas_gl_x11_vi->visual;
+}
+
+Colormap
+eng_best_colormap_get(Evas_Engine_Info_GL_X11 *einfo)
+{
+   if (!einfo) return 0;
+   if (!einfo->info.display) return 0;
+   if (!_evas_gl_x11_vi) eng_best_visual_get(einfo);
+   if (!_evas_gl_x11_vi) return 0;
+   if (einfo->info.destination_alpha)
+     {
+        if (!_evas_gl_x11_rgba_cmap)
+          _evas_gl_x11_rgba_cmap = 
+          XCreateColormap(einfo->info.display,
+                          RootWindow(einfo->info.display,
+                                     einfo->info.screen),
+                          _evas_gl_x11_rgba_vi->visual, 
+                          0);
+        return _evas_gl_x11_rgba_cmap;
+     }
+   if (!_evas_gl_x11_cmap)
+     _evas_gl_x11_cmap = 
+     XCreateColormap(einfo->info.display,
+                     RootWindow(einfo->info.display,
+                                einfo->info.screen),
+                     _evas_gl_x11_vi->visual, 
+                     0);
+   return _evas_gl_x11_cmap;
+}
+                                 
+int
+eng_best_depth_get(Evas_Engine_Info_GL_X11 *einfo)
+{
+   if (!einfo) return 0;
+   if (!einfo->info.display) return 0;
+   if (!_evas_gl_x11_vi) eng_best_visual_get(einfo);
+   if (!_evas_gl_x11_vi) return 0;
+   if (einfo->info.destination_alpha)
+     {
+        if (_evas_gl_x11_rgba_vi) return _evas_gl_x11_rgba_vi->depth;
+     }
+   return _evas_gl_x11_vi->depth;
+}
diff --git a/src/modules/engines/quartz/Evas_Engine_Quartz.h b/src/modules/engines/quartz/Evas_Engine_Quartz.h
new file mode 100644 (file)
index 0000000..abca922
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef _EVAS_ENGINE_QUARTZ_H
+#define _EVAS_ENGINE_QUARTZ_H
+
+#include <ApplicationServices/ApplicationServices.h>
+
+typedef struct _Evas_Engine_Info_Quartz Evas_Engine_Info_Quartz;
+
+struct _Evas_Engine_Info_Quartz
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   /* engine specific data & parameters it needs to set up */
+   struct {
+      CGContextRef context;
+   } info;
+};
+
+#endif
+
+
diff --git a/src/modules/engines/quartz/Makefile.am b/src/modules/engines/quartz/Makefile.am
new file mode 100644 (file)
index 0000000..597e454
--- /dev/null
@@ -0,0 +1,42 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@evas_engine_quartz_cflags@ \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@
+
+if BUILD_ENGINE_QUARTZ
+
+QUARTZ_SOURCES = evas_engine.c
+QUARTZ_LIBADD = @evas_engine_quartz_libs@
+
+pkgdir = $(libdir)/evas/modules/engines/quartz/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_Quartz.h
+
+if !EVAS_STATIC_BUILD_QUARTZ
+
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = $(QUARTZ_SOURCES)
+module_la_LIBADD = @EINA_LIBS@ $(QUARTZ_LIBADD) $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_quartz.la
+
+libevas_engine_quartz_la_SOURCES = $(QUARTZ_SOURCES)
+libevas_engine_quartz_la_LIBADD = $(QUARTZ_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = \
+evas_engine.h \
+evas_quartz_private.h
diff --git a/src/modules/engines/quartz/README b/src/modules/engines/quartz/README
new file mode 100644 (file)
index 0000000..eb12dc6
--- /dev/null
@@ -0,0 +1,32 @@
+================
+==INSTALLATION==
+================
+
+Here's what I had to do to get Evas_Quartz working on a fresh install of Mac OS X Leopard (Evas_Quartz is currently not versions prior to 10.5):
+
+1) Install all system software updates.
+
+2) Install the XCode developer tools (this includes GCC).
+
+3) Install macports.
+
+4) Put /opt/local/bin in your path, permanently. (I put it in front of everything else, because the newer versions of autotools provided by ports are required to build evas)
+
+5) With macports, install the following: m4, autoconf, automake, libtool, pkgconfig, zlib, libpng, jpeg, freetype, tiff.
+
+6) Check out a version of Evas that includes Evas_Quartz (from CVS).
+
+7) Set up your environment. You need to, at the very least, set:
+       CFLAGS=-I/opt/local/include
+       LDFLAGS=-L/opt/local/lib
+       
+8) Build and install eet.
+
+9) Build and install evas. Make sure to use --enable-quartz when configuring!
+
+==============
+==KNOWN BUGS==
+==============
+
+****  A few different types of gradients don't currently draw.
+**    Textbox drawing is a little bit off (because of hardcoded constants that shouldn't exist).
\ No newline at end of file
diff --git a/src/modules/engines/quartz/evas_engine.c b/src/modules/engines/quartz/evas_engine.c
new file mode 100644 (file)
index 0000000..6843702
--- /dev/null
@@ -0,0 +1,1569 @@
+/*
+ * vim:ts=3:sw=3:sts=3:expandtab
+ */
+#include <ApplicationServices/ApplicationServices.h>
+
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_Quartz.h"
+#include "evas_quartz_private.h"
+int _evas_engine_quartz_log_dom = -1;
+static Evas_Func func;
+
+typedef struct _Render_Engine Render_Engine;
+
+struct _Render_Engine
+{
+   CGContextRef ctx;
+   int w, h;
+
+   struct
+   {
+      int redraw : 1;
+      int x1, y1, x2, y2;
+   } draw;
+};
+
+static inline void
+flip_pixels(int *y, int *h, void *re)
+{
+   // We need to flip the Y axis, because Quartz uses a coordinate system
+   // with the origin in the bottom left, while Evas uses a top left origin.
+
+   (*y) = ((Evas_Quartz_Context *)re)->h - (*y);
+
+   if (h && y) (*y) -= *h;
+}
+
+static void *
+eng_info(Evas *e)
+{
+   Evas_Engine_Info_Quartz *info;
+   
+   info = calloc(1, sizeof(Evas_Engine_Info_Quartz));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   return info;
+}
+
+static void
+eng_info_free(Evas *e, void *info)
+{
+   free((Evas_Engine_Info_Quartz *)info);
+}
+
+static int
+eng_setup(Evas *e, void *in)
+{
+   Render_Engine *re;
+   Evas_Engine_Info_Quartz *info = (Evas_Engine_Info_Quartz *)in;
+
+   if (!e->engine.data.output)
+     e->engine.data.output = eng_output_setup(info->info.context, e->output.w, e->output.h);
+   if (!e->engine.data.output) return 0;
+
+   if (!e->engine.data.context)
+      e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
+
+   ((Evas_Quartz_Context *)e->engine.data.context)->w = e->output.w;
+   ((Evas_Quartz_Context *)e->engine.data.context)->h = e->output.h;
+
+   return 1;
+}
+
+#pragma mark Output Setup
+
+static void *
+eng_output_setup(CGContextRef context, int w, int h)
+{
+   Render_Engine *re = calloc(1, sizeof(Render_Engine));
+   if (!re) return NULL;
+
+   re->ctx = context;
+   re->w = w;
+   re->h = h;
+
+   evas_common_cpu_init();
+
+   evas_common_blend_init();
+   evas_common_image_init();
+   evas_common_convert_init();
+   evas_common_scale_init();
+   evas_common_rectangle_init();
+   evas_common_gradient_init();
+   evas_common_polygon_init();
+   evas_common_line_init();
+   evas_common_font_init();
+   evas_common_draw_init();
+   evas_common_tilebuf_init();
+
+   return re;
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+}
+
+static void
+eng_output_resize(void *data, int w, int h)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->w = w;
+   re->h = h;
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   if (!re->draw.redraw)
+   {
+      re->draw.x1 = x;
+      re->draw.y1 = y;
+      re->draw.x2 = x + w;
+      re->draw.y2 = y + h;
+   }
+   else
+   {
+      if (x < re->draw.x1) re->draw.x1 = x;
+      if (y < re->draw.y1) re->draw.y1 = y;
+      if ((x + w - 1) > re->draw.x2) re->draw.x2 = x + w - 1;
+      if ((y + h - 1) > re->draw.y2) re->draw.y2 = y + h - 1;
+   }
+
+   re->draw.redraw = 1;
+}
+
+static void
+eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
+{
+   // FIXME: Implement this?
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->draw.redraw = 0;
+}
+
+static void *
+eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   if (!re->draw.redraw) return NULL;
+
+   if (x) *x = re->draw.x1;
+   if (y) *y = re->draw.y1;
+   if (w) *w = re->draw.x2 - re->draw.x1 + 1;
+   if (h) *h = re->draw.y2 - re->draw.y1 + 1;
+   if (cx) *cx = re->draw.x1;
+   if (cy) *cy = re->draw.y1;
+   if (cw) *cw = re->draw.x2 - re->draw.x1 + 1;
+   if (ch) *ch = re->draw.y2 - re->draw.y1 + 1;
+
+   return re;
+}
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_Quartz_Context *ctx = (Evas_Quartz_Context *)(re->ctx);
+   re->draw.redraw = 0;
+
+   flip_pixels(&y, &h, ctx);
+
+   CGContextClearRect(re->ctx, CGRectMake(x, y, w, h));
+}
+
+static void
+eng_output_flush(void *data)
+{
+   // By default, Apple coalesces calls to CGContextFlush, but this actually
+   // blocks if called more than 60 times per second, which is a waste of time.
+   //
+   // http://developer.apple.com/technotes/tn2005/tn2133.html
+
+   CGContextFlush(((Render_Engine *)data)->ctx);
+}
+
+#pragma mark Context Manipulation
+
+static void *
+eng_context_new(void *data)
+{
+   Evas_Quartz_Context *ctxt = calloc(1, sizeof(Evas_Quartz_Context));
+   if (!ctxt) return NULL;
+
+   return ctxt;
+}
+
+static void
+eng_context_free(void *data, void *context)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+
+   if (re->ctx) CGContextRelease(re->ctx);
+   free(ctxt);
+}
+
+static void
+eng_context_clip_set(void *data, void *context, int x, int y, int w, int h)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+
+   flip_pixels(&y, &h, ctxt);
+
+   CGContextResetClip(re->ctx);
+   CGContextClipToRect(re->ctx, CGRectMake(0, 0, re->w, re->h)); // don't draw over the title bar
+   CGContextClipToRect(re->ctx, CGRectMake(x, y, w, h));
+
+   ctxt->clipped = 1;
+}
+
+static void
+eng_context_clip_unset(void *data, void *context)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+
+   CGContextResetClip(re->ctx);
+
+   ctxt->clipped = 0;
+}
+
+static int
+eng_context_clip_get(void *data, void *context, int *x, int *y, int *w, int *h)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+
+   CGRect clip = CGContextGetClipBoundingBox(re->ctx);
+   if (x) *x = clip.origin.x;
+   if (y) *y = clip.origin.y;
+   if (w) *w = clip.size.width;
+   if (h) *h = clip.size.height;
+
+   return ctxt->clipped;
+}
+
+static void
+eng_context_color_set(void *data, void *context, int r, int g, int b, int a)
+{
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+
+   ctxt->col.r = (double)r / 255.0;
+   ctxt->col.g = (double)g / 255.0;
+   ctxt->col.b = (double)b / 255.0;
+   ctxt->col.a = (double)a / 255.0;
+}
+
+static int
+eng_context_color_get(void *data, void *context, int *r, int *g, int *b, int *a)
+{
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+
+   if (r) *r = ctxt->col.r * 255;
+   if (g) *g = ctxt->col.g * 255;
+   if (b) *b = ctxt->col.b * 255;
+   if (a) *a = ctxt->col.a * 255;
+   return 1;
+}
+
+static void
+eng_context_multiplier_set(void *data, void *context, int r, int g, int b, int a)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+
+   ctxt->mul.r = (double)r / 255.0;
+   ctxt->mul.g = (double)g / 255.0;
+   ctxt->mul.b = (double)b / 255.0;
+   ctxt->mul.a = (double)a / 255.0;
+   ctxt->mul.set = 1;
+
+   CGContextSetAlpha(re->ctx, ctxt->mul.a);
+}
+
+static void
+eng_context_multiplier_unset(void *data, void *context)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+
+   ctxt->mul.set = 0;
+   CGContextSetAlpha(re->ctx, 1.0);
+}
+
+static int
+eng_context_multiplier_get(void *data, void *context, int *r, int *g, int *b, int *a)
+{
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+
+   if (r) *r = ctxt->mul.r * 255;
+   if (g) *g = ctxt->mul.g * 255;
+   if (b) *b = ctxt->mul.b * 255;
+   if (a) *a = ctxt->mul.a * 255;
+   return ctxt->mul.set;
+}
+
+static void
+eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h)
+{
+   // FIXME: This doesn't seem to be implemented anywhere. What does it do?
+}
+
+static void
+eng_context_cutout_clear(void *data, void *context)
+{
+   // FIXME: This doesn't seem to be implemented anywhere. What does it do?
+}
+
+static void
+eng_context_anti_alias_set(void *data, void *context, unsigned char aa)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+
+   ctxt->aa = aa;
+
+   CGContextSetAllowsAntialiasing(re->ctx, (bool)aa);
+   CGContextSetShouldAntialias(re->ctx, (bool)aa);
+   CGContextSetInterpolationQuality(re->ctx, kCGInterpolationLow); // is it OK to assume low quality?
+}
+
+static unsigned char
+eng_context_anti_alias_get(void *data, void *context)
+{
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+
+   return ctxt->aa;
+}
+
+#pragma mark Rectangle Drawing
+
+static void
+eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+   double r, g, b, a;
+
+   flip_pixels(&y, &h, ctxt);
+
+   r = ctxt->col.r;
+   g = ctxt->col.g;
+   b = ctxt->col.b;
+   a = ctxt->col.a;
+
+   if (ctxt->mul.set)
+   {
+      r *= ctxt->mul.r;
+      g *= ctxt->mul.g;
+      b *= ctxt->mul.b;
+      a *= ctxt->mul.a;
+   }
+
+   CGContextSetRGBFillColor(re->ctx, r, g, b, a);
+   CGContextFillRect(re->ctx, CGRectMake(x, y, w, h));
+}
+
+#pragma mark Line Drawing
+
+static void
+eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+   double r, g, b, a;
+
+   flip_pixels(&y1, NULL, ctxt);
+   flip_pixels(&y2, NULL, ctxt);
+
+   r = ctxt->col.r;
+   g = ctxt->col.g;
+   b = ctxt->col.b;
+   a = ctxt->col.a;
+
+   if (ctxt->mul.set)
+   {
+      r *= ctxt->mul.r;
+      g *= ctxt->mul.g;
+      b *= ctxt->mul.b;
+      a *= ctxt->mul.a;
+   }
+
+   CGContextSetRGBStrokeColor(re->ctx, r, g, b, a);
+   CGContextBeginPath(re->ctx);
+   CGContextMoveToPoint(re->ctx, x1, y1);
+   CGContextAddLineToPoint(re->ctx, x2, y2);
+   CGContextStrokePath(re->ctx);
+}
+
+#pragma mark Polygon Manipulation & Drawing
+
+static void *
+eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y)
+{
+   Evas_Quartz_Polygon *poly;
+   Evas_Quartz_Polygon_Point *pt;
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+
+   flip_pixels(&y, NULL, ctxt);
+
+   poly = (Evas_Quartz_Polygon *)polygon;
+   if (!poly) poly = calloc(1, sizeof(Evas_Quartz_Polygon));
+   if (!poly) return NULL;
+
+   pt = calloc(1, sizeof(Evas_Quartz_Polygon_Point));
+   if (pt)
+   {
+      pt->x = x;
+      pt->y = y;
+      poly->points = eina_list_append(poly->points, pt);
+   }
+   return poly;
+}
+
+static void *
+eng_polygon_points_clear(void *data, void *context, void *polygon)
+{
+   Evas_Quartz_Polygon *poly;
+
+   poly = (Evas_Quartz_Polygon *)polygon;
+   if (!poly) return NULL;
+
+   while (poly->points)
+   {
+      free(poly->points->data);
+      poly->points = eina_list_remove_list(poly->points, poly->points);
+   }
+   free(poly);
+
+   return NULL;
+}
+
+static void
+eng_polygon_draw(void *data, void *context, void *surface, void *polygon)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+   Evas_Quartz_Polygon *poly = (Evas_Quartz_Polygon *)polygon;
+   Evas_Quartz_Polygon_Point *pt;
+
+   double r, g, b, a;
+
+   CGContextBeginPath(re->ctx);
+
+   pt = poly->points->data;
+   if (pt)
+   {
+      Eina_List *l;
+      CGContextMoveToPoint(re->ctx, pt->x, pt->y);
+      EINA_LIST_FOREACH(poly->points->next, l, pt)
+       CGContextAddLineToPoint(re->ctx, pt->x, pt->y);
+   }
+
+   r = ctxt->col.r;
+   g = ctxt->col.g;
+   b = ctxt->col.b;
+   a = ctxt->col.a;
+
+   if (ctxt->mul.set)
+   {
+      r *= ctxt->mul.r;
+      g *= ctxt->mul.g;
+      b *= ctxt->mul.b;
+      a *= ctxt->mul.a;
+   }
+
+   CGContextSetRGBFillColor(re->ctx, r, g, b, a);
+   CGContextFillPath(re->ctx);
+}
+
+#pragma mark Gradient Manipulation & Drawing
+
+static void *
+eng_gradient_new(void *data)
+{
+   Evas_Quartz_Gradient *gradient = calloc(1, sizeof(Evas_Quartz_Gradient));
+   if (!gradient) return NULL;
+
+   gradient->grad = evas_common_gradient_new();
+   if (!(gradient->grad))
+   {
+      free(gradient);
+      return NULL;
+   }
+
+   gradient->changed = 1;
+   gradient->buf = NULL;
+
+   return gradient;
+}
+
+static void
+eng_gradient_free(void *data, void *gradient)
+{
+   Evas_Quartz_Gradient *gr = (Evas_Quartz_Gradient *)gradient;
+   if (!gr) return;
+   if (gr->grad) evas_common_gradient_free(gr->grad);
+   if (gr->im) eng_image_free(data, gr->im);
+   if (gr->buf) free(gr->buf);
+   free(gr);
+}
+
+static void
+eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta)
+{
+   Evas_Quartz_Gradient *gr = (Evas_Quartz_Gradient *)gradient;
+   if (!gr) return;
+   evas_common_gradient_color_stop_add(gr->grad, r, g, b, a, delta);
+   gr->changed = 1;
+}
+
+static void
+eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta)
+{
+   Evas_Quartz_Gradient *gr = (Evas_Quartz_Gradient *)gradient;
+   if (!gr) return;
+   evas_common_gradient_alpha_stop_add(gr->grad, a, delta);
+   gr->changed = 1;
+}
+
+static void
+eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha)
+{
+   Evas_Quartz_Gradient *gr = (Evas_Quartz_Gradient *)gradient;
+   if (!gr) return;
+   evas_common_gradient_color_data_set(gr->grad, map, len, has_alpha);
+   gr->changed = 1;
+}
+
+static void
+eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len)
+{
+   Evas_Quartz_Gradient *gr = (Evas_Quartz_Gradient *)gradient;
+   if (!gr) return;
+   evas_common_gradient_alpha_data_set(gr->grad, alpha_map, len);
+   gr->changed = 1;
+}
+
+static void
+eng_gradient_clear(void *data, void *gradient)
+{
+   Evas_Quartz_Gradient *gr = (Evas_Quartz_Gradient *)gradient;
+   if (!gr) return;
+   evas_common_gradient_clear(gr->grad);
+   gr->changed = 1;
+}
+
+static void
+eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h)
+{
+   Evas_Quartz_Gradient *gr = (Evas_Quartz_Gradient *)gradient;
+   if (!gr) return;
+   evas_common_gradient_fill_set(gr->grad, x, y, w, h);
+   gr->changed = 1;
+}
+
+static void
+eng_gradient_fill_angle_set(void *data, void *gradient, double angle)
+{
+   Evas_Quartz_Gradient *gr = (Evas_Quartz_Gradient *)gradient;
+   if (!gr) return;
+   evas_common_gradient_fill_angle_set(gr->grad, angle);
+   gr->changed = 1;
+}
+
+static void
+eng_gradient_fill_spread_set(void *data, void *gradient, int spread)
+{
+   Evas_Quartz_Gradient *gr = (Evas_Quartz_Gradient *)gradient;
+   if (!gr) return;
+   evas_common_gradient_fill_spread_set(gr->grad, spread);
+   gr->changed = 1;
+}
+
+static void
+eng_gradient_angle_set(void *data, void *gradient, double angle)
+{
+   Evas_Quartz_Gradient *gr = (Evas_Quartz_Gradient *)gradient;
+   if (!gr) return;
+   evas_common_gradient_map_angle_set(gr->grad, angle);
+   gr->changed = 1;
+}
+
+static void
+eng_gradient_offset_set(void *data, void *gradient, float offset)
+{
+   Evas_Quartz_Gradient *gr = (Evas_Quartz_Gradient *)gradient;
+   if (!gr) return;
+   evas_common_gradient_map_offset_set(gr->grad, offset);
+   gr->changed = 1;
+}
+
+static void
+eng_gradient_direction_set(void *data, void *gradient, int direction)
+{
+   Evas_Quartz_Gradient *gr = (Evas_Quartz_Gradient *)gradient;
+   if (!gr) return;
+   evas_common_gradient_map_direction_set(gr->grad, direction);
+   gr->changed = 1;
+}
+
+static void
+eng_gradient_type_set(void *data, void *gradient, char *name, char *params)
+{
+   Evas_Quartz_Gradient *gr = (Evas_Quartz_Gradient *)gradient;
+   if (!gr) return;
+   evas_common_gradient_type_set(gr->grad, name, params);
+   gr->changed = 1;
+}
+
+static int
+eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient *grad;
+   if (!gradient) return 0;
+
+   grad = ((Evas_Quartz_Gradient *)gradient)->grad;
+
+   if (!grad || !grad->type.geometer) return 0;
+
+   return !(grad->type.geometer->has_alpha(grad, dc->render_op) |
+              grad->type.geometer->has_mask(grad, dc->render_op));
+}
+
+static int
+eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h)
+{
+   if (!gradient) return 0;
+   return 1;
+}
+
+static void
+eng_gradient_render_pre(void *data, void *context, void *gradient)
+{
+   int  len;
+   RGBA_Gradient *grad;
+
+   if (!context || !gradient) return;
+   grad = ((Evas_Quartz_Gradient *)gradient)->grad;
+   if (!grad || !grad->type.geometer) return;
+   grad->type.geometer->geom_set(grad);
+   len = grad->type.geometer->get_map_len(grad);
+   evas_common_gradient_map(context, grad, len);
+   ((Evas_Quartz_Gradient *)gradient)->changed = 1;
+}
+
+static void
+eng_gradient_render_post(void *data, void *gradient)
+{
+}
+
+static void
+eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   Evas_Quartz_Gradient *gr = (Evas_Quartz_Gradient *)gradient;
+
+   INF("#Gradient#");
+   INF("Fill: %i %i %i %i", gr->grad->fill.x, gr->grad->fill.y, gr->grad->fill.w, gr->grad->fill.h);
+   INF("Type: %s %s", gr->grad->type.name, gr->grad->type.params);
+   INF("XYWH: %i %i %i %i", x, y, w, h);
+   INF("Geom: %p %p", gr->grad->type.geometer, gr->grad->type.geometer->get_fill_func);
+   INF("Map: len: %d angle: %f direction: %d offset: %f", gr->grad->map.len, gr->grad->map.angle, gr->grad->map.direction, gr->grad->map.offset);
+   INF("Color: nstops: %d len: %d", gr->grad->color.nstops, gr->grad->color.len);
+   INF("Alpha: nstops: %d len: %d", gr->grad->alpha.nstops, gr->grad->alpha.len);
+   INF("");
+
+   if ((gr->sw != w) || (gr->sh != h))
+      gr->changed = 1;
+
+   if ((gr->changed) || (!gr->im))
+   {
+      if (gr->buf && ((gr->sw != w) || (gr->sh != h)))
+      {
+         free(gr->buf);
+         gr->buf = NULL;
+      }
+
+      if (!gr->buf)
+         gr->buf = calloc(w * h, 4);
+
+      eng_image_free(data, gr->im);
+      gr->im = eng_image_new_from_data(data, w, h, gr->buf, 1, EVAS_COLORSPACE_ARGB8888);
+      dc->render_op = _EVAS_RENDER_FILL;
+      evas_common_gradient_draw((RGBA_Image *) &gr->im->im->cache_entry, dc, 0, 0, w, h, gr->grad);
+      evas_common_cpu_end_opt();
+      gr->sw = w;
+      gr->sh = h;
+      gr->changed = 0;
+   }
+
+   eng_image_draw(data, context, NULL, gr->im, 0, 0, 0, 0, x, y, w, h, 0);
+}
+
+#pragma mark Image Manipulation & Drawing
+
+static void *
+eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
+{
+   Evas_Quartz_Image *im = calloc(1, sizeof(Evas_Quartz_Image));
+
+   // FIXME: set error before returning without a new image...
+   // I can't figure out what to set it to, even trying to follow through the core code.
+   // Also, none of the other engines set it.
+
+   if (!im)
+     {
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       return NULL;
+     }
+
+   *error = EVAS_LOAD_ERROR_NONE;
+   im->im = (RGBA_Image *)evas_common_load_image_from_file(file, key, lo, error);
+   if (!im->im)
+   {
+      free(im);
+      return NULL;
+   }
+   im->references = 1;
+   return im;
+}
+
+static void *
+eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Evas_Quartz_Image *im = calloc(1, sizeof(Evas_Quartz_Image));
+
+   if (!im) return NULL;
+
+   im->im = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
+   im->references = 1;
+
+   if (!im->im)
+   {
+      free(im);
+      return NULL;
+   }
+
+   return im;
+}
+
+static void *
+eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Evas_Quartz_Image *im = calloc(1, sizeof(Evas_Quartz_Image));
+
+   if (!im) return NULL;
+
+   im->im = (RGBA_Image *)evas_cache_image_copied_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
+   im->references = 1;
+
+   if (!im->im)
+   {
+      free(im);
+      return NULL;
+   }
+
+   return im;
+}
+
+static void
+eng_image_free(void *data, void *image)
+{
+   Evas_Quartz_Image *im = (Evas_Quartz_Image *)image;
+
+   if (!im) return;
+
+   if (--im->references > 0) return;
+
+   if (im->cgim) CGImageRelease(im->cgim);
+   if (im->im) evas_cache_image_drop(&im->im->cache_entry);
+   free(im);
+}
+
+static void
+eng_image_data_preload_request(void *data __UNUSED__, void *image, const void *target)
+{
+   Evas_Quartz_Image *im = (Evas_Quartz_Image *)image;
+
+   if (!im && !im->im) return ;
+   evas_cache_image_preload_data(&im->im->cache_entry, target);
+}
+
+static void
+eng_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target)
+{
+   Evas_Quartz_Image *im = (Evas_Quartz_Image *)image;
+
+   if (!im && !im->im) return ;
+   evas_cache_image_preload_cancel(&im->im->cache_entry, target);
+}
+
+static void *
+eng_image_size_set(void *data, void *image, int w, int h)
+{
+   Evas_Quartz_Image *im = (Evas_Quartz_Image *)image;
+   Evas_Quartz_Image *im_old;
+
+   if (!im) return NULL;
+   im_old = image;
+   if ((eng_image_colorspace_get(data, image) == EVAS_COLORSPACE_YCBCR422P601_PL) ||
+       (eng_image_colorspace_get(data, image) == EVAS_COLORSPACE_YCBCR422P709_PL))
+      w &= ~0x1;
+
+   if ((im_old) && (im_old->im->cache_entry.w == w) && (im_old->im->cache_entry.h == h))
+      return image;
+
+   if ((w <= 0) || (h <= 0))
+   {
+      eng_image_free(data, im_old);
+      return NULL;
+   }
+
+   if (im_old)
+   {
+      im = eng_image_new_from_data(data, w, h, im_old->im->image.data, eng_image_alpha_get(data, im_old), eng_image_colorspace_get(data, im_old));
+      eng_image_free(data, im_old);
+   }
+   else
+      im = eng_image_new_from_data(data, w, h, NULL, true, EVAS_COLORSPACE_ARGB8888);
+   return im;
+}
+
+static void
+eng_image_size_get(void *data, void *image, int *w, int *h)
+{
+   Evas_Quartz_Image *im = (Evas_Quartz_Image *)image;
+
+   if (!image)
+   {
+      if (w) *w = 0;
+      if (h) *h = 0;
+   }
+   else
+   {
+      if (w) *w = im->im->cache_entry.w;
+      if (h) *h = im->im->cache_entry.h;
+   }
+}
+
+static void *
+eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h)
+{
+   Evas_Quartz_Image *im = (Evas_Quartz_Image *)image;
+
+   if ((im) && (im->im))
+      return evas_cache_image_dirty(&im->im->cache_entry, x, y, w, h);
+}
+
+static void *
+eng_image_alpha_set(void *data, void *image, int has_alpha)
+{
+   Evas_Quartz_Image *im = (Evas_Quartz_Image *)image;
+
+   if ((!im) || (!im->im)) return NULL;
+
+   if (im->im->cache_entry.space != EVAS_COLORSPACE_ARGB8888)
+   {
+      im->im->cache_entry.flags.alpha = 0;
+   }
+   else
+   {
+      im->im = (RGBA_Image *)evas_cache_image_alone(&im->im->cache_entry);
+      evas_common_image_colorspace_dirty(im->im);
+      im->im->cache_entry.flags.alpha = has_alpha ? 1 : 0;
+   }
+
+   return im;
+}
+
+static int
+eng_image_alpha_get(void *data, void *image)
+{
+   Evas_Quartz_Image *im = (Evas_Quartz_Image *) image;
+
+   if (!im->im) return 0;
+
+   return (int)(im->im->cache_entry.flags.alpha);
+}
+
+static char *
+eng_image_comment_get(void *data, void *image, char *key)
+{
+   Evas_Quartz_Image *im = (Evas_Quartz_Image *)image;
+
+   if ((!im) || (!im->im))
+      return NULL;
+   else
+      return im->im->info.comment;
+}
+
+static char *
+eng_image_format_get(void *data, void *image)
+{
+   // these are unimplemented for now, until core features are finished
+
+   return NULL;
+}
+
+static void
+eng_image_colorspace_set(void *data, void *image, int cspace)
+{
+   Evas_Quartz_Image *im = (Evas_Quartz_Image *)image;
+
+   if (!im)
+      return;
+   else
+      evas_cache_image_colorspace(&im->im->cache_entry, cspace);
+}
+
+static int
+eng_image_colorspace_get(void *data, void *image)
+{
+   Evas_Quartz_Image *im = (Evas_Quartz_Image *)image;
+
+   if (!im)
+      return EVAS_COLORSPACE_ARGB8888;
+   else
+      return im->im->cache_entry.space;
+}
+
+static void
+eng_image_native_set(void *data, void *image, void *native)
+{
+   // these are unimplemented for now, until core features are finished
+}
+
+static void *
+eng_image_native_get(void *data, void *image)
+{
+   // these are unimplemented for now, until core features are finished
+   return NULL;
+}
+
+static void *
+eng_image_data_put(void *data, void *image, DATA32 *image_data)
+{
+   // FIXME: one last leak somewhere in this function
+
+   Evas_Quartz_Image *im_old = (Evas_Quartz_Image *)image;
+
+   if (!im_old) return NULL;
+
+   if (im_old->cgim)
+   {
+      CGImageRelease(im_old->cgim);
+      im_old->cgim = NULL;
+   }
+
+   switch (im_old->im->cache_entry.space)
+   {
+      case EVAS_COLORSPACE_ARGB8888:
+         image = eng_image_new_from_data(data, im_old->im->cache_entry.w, im_old->im->cache_entry.h, image_data, 1, EVAS_COLORSPACE_ARGB8888);
+         eng_image_free(data, im_old);
+         break;
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+         if (image_data != im_old->im->cs.data)
+         {
+            if (im_old->im->cs.data)
+               if (!im_old->im->cs.no_free)
+                  free(im_old->im->cs.data);
+
+            im_old->im->cs.data = image_data;
+            evas_common_image_colorspace_dirty(im_old->im);
+         }
+         break;
+   }
+
+   if (!image) return NULL;
+
+   return image;
+}
+
+static void *
+eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data)
+{
+   Evas_Quartz_Image *im = (Evas_Quartz_Image *)image;
+
+   if ((!im) || (!im->im))
+   {
+      *image_data = NULL;
+      return NULL;
+   }
+
+   switch (im->im->cache_entry.space)
+   {
+      case EVAS_COLORSPACE_ARGB8888:
+         if (to_write)
+         {
+            CGImageRelease(im->cgim);
+            im->cgim = NULL;
+
+            if (im->references > 1)
+            {
+               Evas_Quartz_Image *im_new;
+               im_new = eng_image_new_from_copied_data(data,
+                                                       im->im->cache_entry.w,
+                                                       im->im->cache_entry.h,
+                                                       im->im->image.data,
+                                                       eng_image_alpha_get(data, image),
+                                                       eng_image_colorspace_get(data, image));
+
+               if (!im_new)
+               {
+                  if (image_data) *image_data = NULL;
+                  return im;
+               }
+
+               eng_image_free(data, im);
+               im = im_new;
+            }
+            else
+            {
+               im->im = (RGBA_Image *)evas_cache_image_dirty(&im->im->cache_entry,
+                                                            0, 0,
+                                                            im->im->cache_entry.w, im->im->cache_entry.h);
+               im->references++;
+            }
+         }
+
+         evas_cache_image_load_data(&im->im->cache_entry);
+
+         if (image_data) *image_data = im->im->image.data;
+         break;
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+         if (image_data) *image_data = im->im->cs.data;
+         im->references++;
+         break;
+      default:
+         abort(); // this seems ... incredibly unreasonable, but GL does it...
+         break;
+   }
+
+   return im;
+}
+
+static void
+eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+   Evas_Quartz_Image *im = (Evas_Quartz_Image *)image;
+   flip_pixels(&dst_y, &dst_h, ctxt);
+
+   if ((!im) || (!im->im)) return;
+
+   if (!im->cgim)
+   {
+      CGColorSpaceRef colorspace;
+      CGDataProviderRef provider;
+      evas_cache_image_load_data(&im->im->cache_entry);
+      evas_common_image_colorspace_normalize((RGBA_Image *)(&im->im->cache_entry));
+
+      if (!im->im->image.data) return;
+
+      colorspace = CGColorSpaceCreateDeviceRGB();
+      provider = CGDataProviderCreateWithData(NULL,
+                                              im->im->image.data,
+                                              im->im->cache_entry.w * im->im->cache_entry.h * sizeof(DATA32),
+                                              NULL);
+      im->cgim = CGImageCreate(im->im->cache_entry.w,
+                               im->im->cache_entry.h,
+                               8,
+                               8 * 4,
+                               4 * im->im->cache_entry.w,
+                               colorspace,
+                               kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host,
+                               provider,
+                               NULL,
+                               smooth,
+                               kCGRenderingIntentDefault);
+
+      CGDataProviderRelease(provider);
+      CGColorSpaceRelease(colorspace);
+
+      if (!im->cgim) return;
+   }
+
+   CGImageRef subImage = NULL;
+
+   if (src_x != 0 || src_y != 0 || src_w != 0 || src_h != 0)
+   {
+      subImage = CGImageCreateWithImageInRect(im->cgim, CGRectMake(src_x,src_y,src_w,src_h));
+      if (!subImage) return;
+
+      CGContextDrawImage(re->ctx, CGRectMake(dst_x, dst_y, dst_w, dst_h), subImage);
+      CGImageRelease(subImage);
+   }
+   else
+      CGContextDrawImage(re->ctx, CGRectMake(dst_x, dst_y, dst_w, dst_h), im->cgim);
+}
+
+static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+
+#pragma mark Text Manipulation & Drawing
+
+static Evas_Quartz_Font *
+quartz_font_from_ats(ATSFontContainerRef container, int size)
+{
+   ItemCount count;
+   ATSFontRef *fonts;
+   CTFontRef font;
+   CFStringRef keys[1];
+   CFTypeRef values[1];
+   CFDictionaryRef attr;
+   Evas_Quartz_Font *loaded_font;
+
+   ATSFontFindFromContainer(container, kATSOptionFlagsDefault, 0, NULL, &count);
+   fonts = calloc(count, sizeof(ATSFontRef));
+   if (!fonts) return NULL;
+   ATSFontFindFromContainer(container, kATSOptionFlagsDefault, count, fonts, NULL);
+
+   font = CTFontCreateWithPlatformFont(fonts[0], size, NULL, NULL);
+
+   loaded_font = calloc(1, sizeof(Evas_Quartz_Font));
+   if (!font || !loaded_font) return NULL;
+
+   keys[0] = kCTFontAttributeName;
+   values[0] = font;
+   attr = CFDictionaryCreate(NULL,
+                            (const void **)&keys,
+                            (const void **)&values,
+                            sizeof(keys) / sizeof(keys[0]),
+                            &kCFTypeDictionaryKeyCallBacks,
+                            &kCFTypeDictionaryValueCallBacks);
+
+   loaded_font->font = font;
+   loaded_font->attr = attr;
+   loaded_font->size = size;
+
+   free(fonts);
+
+   return loaded_font;
+}
+
+static void *
+eng_font_add(void *data, void *font, const char *name, int size)
+{
+   // FIXME: what is this function supposed to do?
+   // if I delete it, we eventually crash when it gets run
+
+   return (char *)name;
+}
+
+static void *
+eng_font_load(void *data, const char *name, int size)
+{
+   FSRef fontFile;
+   ATSFontContainerRef container;
+
+   FSPathMakeRef((unsigned char *)name, &fontFile, NULL);
+   ATSFontActivateFromFileReference(&fontFile, kATSFontContextLocal, kATSFontFormatUnspecified, NULL, kATSOptionFlagsDefault, &container);
+
+   return quartz_font_from_ats(container, size);;
+}
+
+static void *
+eng_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size)
+{
+   ATSFontContainerRef container;
+
+   ATSFontActivateFromMemory((void *)fdata, fdata_size, kATSFontContextLocal, kATSFontFormatUnspecified, NULL, kATSOptionFlagsDefault, &container);
+
+   return quartz_font_from_ats(container, size);
+}
+
+static void
+eng_font_free(void *data, void *font)
+{
+   Evas_Quartz_Font *loaded_font = (Evas_Quartz_Font *)font;
+
+   CFRelease(loaded_font->font);
+   CFRelease(loaded_font->attr);
+   free(loaded_font);
+}
+
+static int
+eng_font_ascent_get(void *data, void *font)
+{
+   Evas_Quartz_Font *loaded_font = (Evas_Quartz_Font *)font;
+
+   return CTFontGetAscent(loaded_font->font);
+}
+
+static int
+eng_font_descent_get(void *data, void *font)
+{
+   Evas_Quartz_Font *loaded_font = (Evas_Quartz_Font *)font;
+
+   return CTFontGetDescent(loaded_font->font);
+}
+
+static int
+eng_font_max_ascent_get(void *data, void *font)
+{
+   Evas_Quartz_Font *loaded_font = (Evas_Quartz_Font *)font;
+
+   return CTFontGetAscent(loaded_font->font);
+}
+
+static int
+eng_font_max_descent_get(void *data, void *font)
+{
+   Evas_Quartz_Font *loaded_font = (Evas_Quartz_Font *)font;
+
+   return CTFontGetDescent(loaded_font->font);
+}
+
+static void
+eng_font_string_size_get(void *data, void *font, const char *text, int *w, int *h)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_Quartz_Font *loaded_font = (Evas_Quartz_Font *)font;
+
+   CFStringRef string = CFStringCreateWithCString(NULL, text, kCFStringEncodingUTF8);
+   CFAttributedStringRef attrString = CFAttributedStringCreate(NULL, string, loaded_font->attr);
+   CTLineRef line = CTLineCreateWithAttributedString(attrString);
+   CGContextSetTextMatrix(re->ctx, CGAffineTransformIdentity);
+   CGContextSetTextPosition(re->ctx, 0, CTFontGetDescent(loaded_font->font));
+   CGRect bounds = CTLineGetImageBounds(line, re->ctx);
+
+   // Descenders on characters seem to leave origin at typographic origin, instead of image origin.
+   // Evas expects text to be treated like an image, so we have to offset by the typographic origin.
+
+   if (w) (*w) = ceil(bounds.size.width + bounds.origin.x);
+   if (h) (*h) = ceil(bounds.size.height + bounds.origin.y);
+
+   CFRelease(attrString);
+   CFRelease(string);
+   CFRelease(line);
+}
+
+static int
+eng_font_inset_get(void *data, void *font, const char *text)
+{
+   return 0;
+}
+
+static int
+eng_font_h_advance_get(void *data, void *font, const char *text)
+{
+   int w;
+
+   eng_font_string_size_get(data, font, text, &w, NULL);
+
+   return w + 2; // FIXME: shouldn't need a constant here. from where do we get word spacing?
+   // it seems we lose the space between differently-styled text in a text block. Why?
+}
+
+static int
+eng_font_v_advance_get(void *data, void *font, const char *text)
+{
+   int h;
+
+   eng_font_string_size_get(data, font, text, NULL, &h);
+
+   return h;
+}
+
+static int
+eng_font_char_coords_get(void *data, void *font, const char *text, int pos, int *cx, int *cy, int *cw, int *ch)
+{
+   Evas_Quartz_Font *loaded_font = (Evas_Quartz_Font *)font;
+
+   CFStringRef string = CFStringCreateWithCString(NULL, text, kCFStringEncodingUTF8);
+   CFAttributedStringRef attrString = CFAttributedStringCreate(NULL, string, loaded_font->attr);
+   CTLineRef line = CTLineCreateWithAttributedString(attrString);
+
+   float offset = CTLineGetOffsetForStringIndex(line, pos, NULL);
+   if (cx) *cx = offset;
+   if (cy) *cy = loaded_font->size;
+
+   CFRelease(attrString);
+   CFRelease(string);
+   CFRelease(line);
+
+   return 1;
+}
+
+static int
+eng_font_char_at_coords_get(void *data, void *font, const char *text, int x, int y, int *cx, int *cy, int *cw, int *ch)
+{
+   // Return the index of the character at the given point, also lookup it's origin x, y, w, and h.
+   Evas_Quartz_Font *loaded_font = (Evas_Quartz_Font *)font;
+
+   CFStringRef string = CFStringCreateWithCString(NULL, text, kCFStringEncodingUTF8);
+   CFAttributedStringRef attrString = CFAttributedStringCreate(NULL, string, loaded_font->attr);
+   CTLineRef line = CTLineCreateWithAttributedString(attrString);
+
+   int stringIndex = (int) CTLineGetStringIndexForPosition(line, CGPointMake(x, y));
+
+   // In order to get the character's size and position, look up the position of this character and the next one
+   eng_font_char_coords_get(data, font, text, stringIndex, cx, cy, NULL, NULL);
+   eng_font_char_coords_get(data, font, text, stringIndex + 1, cw, NULL, NULL, NULL);
+
+   if (cw && cx) *cw -= *cx;
+   if (ch) *ch = loaded_font->size;
+
+   CFRelease(attrString);
+   CFRelease(string);
+   CFRelease(line);
+
+   return stringIndex;
+}
+
+static void
+eng_font_hinting_set(void *data, void *font, int hinting)
+{
+   Evas_Quartz_Font *loaded_font = (Evas_Quartz_Font *)font;
+   loaded_font->hint = hinting;
+}
+
+static int
+eng_font_hinting_can_hint(void *data, int hinting)
+{
+   return 1;
+}
+
+static void
+eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text)
+{
+   Render_Engine *re = (Render_Engine *)data;
+   Evas_Quartz_Context *ctxt = (Evas_Quartz_Context *)context;
+   Evas_Quartz_Font *loaded_font = (Evas_Quartz_Font *)font;
+   double r, g, b, a;
+   CGFloat colors[4];
+   CGColorSpaceRef colorspace;
+   CGColorRef color;
+   CFStringRef keys[2];
+   CFTypeRef values[2];
+   CFDictionaryRef attr;
+   CFStringRef string;
+   CFAttributedStringRef attrString;
+   CTLineRef line;
+
+   flip_pixels(&y, &h, ctxt);
+
+   // FIXME: I know this should never happen, but the next line is magic.
+   // It's also... broken. It /works/, but ... for example, subtracting 1 shouldn't need to happen.
+   // The text drawing is a mess, but this is the closest I've gotten yet...
+
+   y += floor(CTFontGetAscent(loaded_font->font) - (CTFontGetXHeight(loaded_font->font) + CTFontGetDescent(loaded_font->font))) - 1;
+
+   CGContextSetShouldSmoothFonts(re->ctx, (bool)(loaded_font->hint));
+
+   r = ctxt->col.r;
+   g = ctxt->col.g;
+   b = ctxt->col.b;
+   a = ctxt->col.a;
+
+   if (ctxt->mul.set)
+   {
+      r *= ctxt->mul.r;
+      g *= ctxt->mul.g;
+      b *= ctxt->mul.b;
+      a *= ctxt->mul.a;
+   }
+
+   colors[0] = r;
+   colors[1] = g;
+   colors[2] = b;
+   colors[3] = a;
+
+   // Create an attributed string
+   colorspace = CGColorSpaceCreateDeviceRGB();
+   color = CGColorCreate(colorspace, colors);
+
+   keys[0] =   kCTFontAttributeName;
+   values[0] = loaded_font->font;
+   keys[1] =   kCTForegroundColorAttributeName;
+   values[1] = color;
+
+   attr = CFDictionaryCreate(NULL, (const void **)&keys, (const void **)&values, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+   string = CFStringCreateWithCString(NULL, text, kCFStringEncodingUTF8);
+   attrString = CFAttributedStringCreate(NULL, string, attr);
+
+   // Draw the string
+   line = CTLineCreateWithAttributedString(attrString);
+   CGContextSetTextMatrix(re->ctx, CGAffineTransformIdentity);
+   CGContextSetTextPosition(re->ctx, x, y + h);
+   CTLineDraw(line, re->ctx);
+
+   // Clean up
+   CGColorSpaceRelease(colorspace);
+   CFRelease(attr);
+   CFRelease(string);
+   CFRelease(attrString);
+   CFRelease(line);
+   CGColorRelease(color);
+}
+
+#pragma mark Module Function Export
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+
+   if (!_evas_module_engine_inherit(&func, "software_generic")) return 0;
+
+   _evas_engine_quartz_log_dom = eina_log_domain_register("EvasQuartz", EVAS_DEFAULT_LOG_COLOR);
+   if(_evas_engine_quartz_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the Quartz engine.\n");
+       return 0;
+     }
+
+   #define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
+   ORD(context_anti_alias_get);
+   ORD(context_anti_alias_set);
+   ORD(context_clip_get);
+   ORD(context_clip_set);
+   ORD(context_clip_unset);
+   ORD(context_color_get);
+   ORD(context_color_set);
+   ORD(context_cutout_add);
+   ORD(context_cutout_clear);
+   ORD(context_free);
+   ORD(context_multiplier_get);
+   ORD(context_multiplier_set);
+   ORD(context_multiplier_unset);
+   ORD(context_new);
+   ORD(font_add);
+   ORD(font_ascent_get);
+   ORD(font_char_at_coords_get);
+   ORD(font_char_coords_get);
+   ORD(font_descent_get);
+   ORD(font_draw);
+   ORD(font_free);
+   ORD(font_hinting_can_hint);
+   ORD(font_hinting_set);
+   ORD(font_h_advance_get);
+   ORD(font_inset_get);
+   ORD(font_load);
+   ORD(font_max_ascent_get);
+   ORD(font_max_descent_get);
+   ORD(font_memory_load);
+   ORD(font_string_size_get);
+   ORD(font_v_advance_get);
+   ORD(gradient_new);
+   ORD(gradient_free);
+   ORD(gradient_color_stop_add);
+   ORD(gradient_alpha_stop_add);
+   ORD(gradient_color_data_set);
+   ORD(gradient_alpha_data_set);
+   ORD(gradient_clear);
+   ORD(gradient_fill_set);
+   ORD(gradient_fill_angle_set);
+   ORD(gradient_fill_spread_set);
+   ORD(gradient_angle_set);
+   ORD(gradient_offset_set);
+   ORD(gradient_direction_set);
+   ORD(gradient_type_set);
+   ORD(gradient_is_opaque);
+   ORD(gradient_is_visible);
+   ORD(gradient_render_pre);
+   ORD(gradient_render_post);
+   ORD(gradient_draw);
+   ORD(image_alpha_get);
+   ORD(image_alpha_set);
+   ORD(image_colorspace_get);
+   ORD(image_colorspace_set);
+   ORD(image_comment_get);
+   ORD(image_data_get);
+   ORD(image_data_put);
+   ORD(image_data_preload_request);
+   ORD(image_data_preload_cancel);
+   ORD(image_dirty_region);
+   ORD(image_draw);
+   ORD(image_format_get);
+   ORD(image_free);
+   ORD(image_load);
+   ORD(image_native_get);
+   ORD(image_native_set);
+   ORD(image_new_from_copied_data);
+   ORD(image_new_from_data);
+   ORD(image_size_get);
+   ORD(image_size_set);
+   ORD(info);
+   ORD(info_free);
+   ORD(line_draw);
+   ORD(output_flush);
+   ORD(output_free);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_resize);
+   ORD(polygon_draw);
+   ORD(polygon_points_clear);
+   ORD(polygon_point_add);
+   ORD(rectangle_draw);
+   ORD(setup);
+
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+
+//   ORD(image_map4_draw);
+//   ORD(image_map_surface_new);
+//   ORD(image_map_surface_free);
+   /* now advertise out our api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+   eina_log_domain_unregister(_evas_engine_quartz_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "quartz",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, quartz);
+
+#ifndef EVAS_STATIC_BUILD_QUARTZ
+EVAS_EINA_MODULE_DEFINE(engine, quartz);
+#endif
diff --git a/src/modules/engines/quartz/evas_engine.h b/src/modules/engines/quartz/evas_engine.h
new file mode 100644 (file)
index 0000000..a32e232
--- /dev/null
@@ -0,0 +1,98 @@
+#ifndef EVAS_ENGINE_H
+#define EVAS_ENGINE_H
+
+#include <ApplicationServices/ApplicationServices.h>
+
+/* log domain variable declared in evas_engine.c */
+extern int _evas_engine_quartz_log_dom ;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_quartz_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_quartz_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_quartz_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_quartz_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_quartz_log_dom, __VA_ARGS__)
+
+typedef struct _Evas_Quartz_Context Evas_Quartz_Context;
+
+struct _Evas_Quartz_Context
+{
+   int         w, h;
+
+   struct
+   {
+      double   r, g, b, a;
+   } col;
+
+   struct
+   {
+      double   r, g, b, a;
+      int      set : 1;
+   } mul;
+
+   unsigned char aa, clipped;
+};
+
+typedef struct _Evas_Quartz_Polygon Evas_Quartz_Polygon;
+
+struct _Evas_Quartz_Polygon
+{
+   Eina_List *points;
+};
+
+typedef struct _Evas_Quartz_Polygon_Point Evas_Quartz_Polygon_Point;
+
+struct _Evas_Quartz_Polygon_Point
+{
+   int x, y;
+};
+
+typedef struct _Evas_Quartz_Image Evas_Quartz_Image;
+
+struct _Evas_Quartz_Image
+{
+   RGBA_Image  *im;
+   CGImageRef  cgim;
+
+   int         references;
+};
+
+typedef struct _Evas_Quartz_Font Evas_Quartz_Font;
+
+struct _Evas_Quartz_Font
+{
+   CTFontRef         font;
+   CFDictionaryRef   attr;
+   int               hint;
+   int               size;
+};
+
+typedef struct _Evas_Quartz_Gradient Evas_Quartz_Gradient;
+
+struct _Evas_Quartz_Gradient
+{
+   DATA32            *buf;
+   RGBA_Gradient     *grad;
+   Evas_Quartz_Image *im;
+   unsigned char     changed : 1;
+   int               sw, sh;
+};
+
+#endif
diff --git a/src/modules/engines/quartz/evas_quartz_private.h b/src/modules/engines/quartz/evas_quartz_private.h
new file mode 100644 (file)
index 0000000..67e26fc
--- /dev/null
@@ -0,0 +1,106 @@
+#ifndef _EVAS_QUARTZ_PRIVATE_H_
+#define _EVAS_QUARTZ_PRIVATE_H_
+
+#include "evas_engine.h"
+
+CG_EXTERN void CGContextResetClip (CGContextRef); // undocumented CoreGraphics function to clear clip rect/*
+
+static inline void flip_pixels(int *y, int *h, void *re);
+
+static void *eng_info(Evas *e);
+static void eng_info_free(Evas *e, void *info);
+
+static void *eng_output_setup(CGContextRef context, int w, int h);
+static int eng_setup(Evas *e, void *in);
+
+static void eng_output_free(void *data);
+static void eng_output_resize(void *data, int w, int h);
+static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_clear(void *data);
+static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
+static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
+static void eng_output_flush(void *data);
+
+static void *eng_context_new(void *data);
+static void eng_context_free(void *data, void *context);
+static void eng_context_clip_set(void *data, void *context, int x, int y, int w, int h);
+static void eng_context_clip_unset(void *data, void *context);
+static int eng_context_clip_get(void *data, void *context, int *x, int *y, int *w, int *h);
+static void eng_context_color_set(void *data, void *context, int r, int g, int b, int a);
+static int eng_context_color_get(void *data, void *context, int *r, int *g, int *b, int *a);
+static void eng_context_multiplier_set(void *data, void *context, int r, int g, int b, int a);
+static void eng_context_multiplier_unset(void *data, void *context);
+static int eng_context_multiplier_get(void *data, void *context, int *r, int *g, int *b, int *a);
+static void eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h);
+static void eng_context_cutout_clear(void *data, void *context);
+static void eng_context_anti_alias_set(void *data, void *context, unsigned char aa);
+static unsigned char eng_context_anti_alias_get(void *data, void *context);
+
+static void eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h);
+
+static void eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2);
+
+static void *eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y);
+static void *eng_polygon_points_clear(void *data, void *context, void *polygon);
+static void eng_polygon_draw(void *data, void *context, void *surface, void *polygon);
+
+static void *eng_gradient_new(void *data);
+static void eng_gradient_free(void *data, void *gradient);
+static void eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta);
+static void eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta);
+static void eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha);
+static void eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len);
+static void eng_gradient_clear(void *data, void *gradient);
+static void eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h);
+static void eng_gradient_fill_angle_set(void *data, void *gradient, double angle);
+static void eng_gradient_fill_spread_set(void *data, void *gradient, int spread);
+static void eng_gradient_angle_set(void *data, void *gradient, double angle);
+static void eng_gradient_offset_set(void *data, void *gradient, float offset);
+static void eng_gradient_direction_set(void *data, void *gradient, int direction);
+static void eng_gradient_type_set(void *data, void *gradient, char *name, char *params);
+static int eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h);
+static int eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h);
+static void eng_gradient_render_pre(void *data, void *context, void *gradient);
+static void eng_gradient_render_post(void *data, void *gradient);
+static void eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h);
+static void *eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo);
+
+static void *eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace);
+static void *eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace);
+static void eng_image_free(void *data, void *image);
+static void eng_image_size_get(void *data, void *image, int *w, int *h);
+static void *eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h);
+static void *eng_image_alpha_set(void *data, void *image, int has_alpha);
+static int eng_image_alpha_get(void *data, void *image);
+static char *eng_image_comment_get(void *data, void *image, char *key);
+static char *eng_image_format_get(void *data, void *image);
+static void eng_image_colorspace_set(void *data, void *image, int cspace);
+static int eng_image_colorspace_get(void *data, void *image);
+static void eng_image_native_set(void *data, void *image, void *native);
+static void *eng_image_native_get(void *data, void *image);
+static void *eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data);
+static void *eng_image_data_put(void *data, void *image, DATA32 *image_data);
+static void *eng_image_size_set(void *data, void *image, int w, int h);
+static void eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth);
+
+static void *eng_font_add(void *data, void *font, const char *name, int size);
+static Evas_Quartz_Font *quartz_font_from_ats(ATSFontContainerRef container, int size);
+static void *eng_font_load(void *data, const char *name, int size);
+static void *eng_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size);
+static void eng_font_free(void *data, void *font);
+static int eng_font_ascent_get(void *data, void *font);
+static int eng_font_descent_get(void *data, void *font);
+static int eng_font_max_ascent_get(void *data, void *font);
+static int eng_font_max_descent_get(void *data, void *font);
+static void eng_font_string_size_get(void *data, void *font, const char *text, int *w, int *h);
+static int eng_font_inset_get(void *data, void *font, const char *text);
+static int eng_font_h_advance_get(void *data, void *font, const char *text);
+static int eng_font_v_advance_get(void *data, void *font, const char *text);
+static int eng_font_char_coords_get(void *data, void *font, const char *text, int pos, int *cx, int *cy, int *cw, int *ch);
+static int eng_font_char_at_coords_get(void *data, void *font, const char *text, int x, int y, int *cx, int *cy, int *cw, int *ch);
+static void eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text);
+static void eng_font_hinting_set(void *data, void *font, int hinting);
+static int eng_font_hinting_can_hint(void *data, int hinting);
+
+#endif /* _EVAS_QUARTZ_PRIVATE_H_ */
diff --git a/src/modules/engines/software_16/.cvsignore b/src/modules/engines/software_16/.cvsignore
new file mode 100644 (file)
index 0000000..09980ae
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
diff --git a/src/modules/engines/software_16/Makefile.am b/src/modules/engines/software_16/Makefile.am
new file mode 100644 (file)
index 0000000..47eaf10
--- /dev/null
@@ -0,0 +1,38 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+if BUILD_ENGINE_SOFTWARE_16
+
+SOFTWARE_16_SOURCES = evas_engine.c
+
+pkgdir = $(libdir)/evas/modules/engines/software_16/$(MODULE_ARCH)
+
+if !EVAS_STATIC_BUILD_SOFTWARE_16
+
+pkg_LTLIBRARIES = module.la
+module_la_SOURCES = $(SOFTWARE_16_SOURCES)
+module_la_LIBADD = @EINA_LIBS@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_software_16.la
+
+libevas_engine_software_16_la_SOURCES = $(SOFTWARE_16_SOURCES)
+
+endif
+endif
+
+EXTRA_DIST = \
+evas_engine.c
diff --git a/src/modules/engines/software_16/evas_engine.c b/src/modules/engines/software_16/evas_engine.c
new file mode 100644 (file)
index 0000000..64c354a
--- /dev/null
@@ -0,0 +1,1073 @@
+#include "evas_common.h"
+#include "evas_common_soft16.h"
+
+/*
+ *****
+ **
+ ** ENGINE ROUTINES
+ **
+ *****
+ */
+int _evas_soft16_log_dom = -1;
+#ifdef ERR
+#undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR( _evas_soft16_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+#undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_soft16_log_dom, __VA_ARGS__)
+
+#ifdef INF
+#undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_soft16_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+#undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_soft16_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+#undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_soft16_log_dom, __VA_ARGS__)
+
+#define NOT_IMPLEMENTED()                                               \
+  WRN("NOT_IMPLEMENTED: %s() at %s:%d",                                \
+           __FUNCTION__, __FILE__, __LINE__)
+
+static void
+eng_output_dump(void *data __UNUSED__)
+{
+   evas_common_image_image_all_unload();
+   evas_common_font_font_all_unload();
+}
+
+static void *
+eng_context_new(void *data __UNUSED__)
+{
+   return evas_common_draw_context_new();
+}
+
+static void
+eng_context_free(void *data __UNUSED__, void *context)
+{
+   evas_common_draw_context_free(context);
+}
+
+static void
+eng_context_clip_set(void *data __UNUSED__, void *context, int x, int y, int w, int h)
+{
+   evas_common_draw_context_set_clip(context, x, y, w, h);
+}
+
+static void
+eng_context_clip_clip(void *data __UNUSED__, void *context, int x, int y, int w, int h)
+{
+   evas_common_draw_context_clip_clip(context, x, y, w, h);
+}
+
+static void
+eng_context_clip_unset(void *data __UNUSED__, void *context)
+{
+   evas_common_draw_context_unset_clip(context);
+}
+
+static int
+eng_context_clip_get(void *data __UNUSED__, void *context, int *x, int *y, int *w, int *h)
+{
+   *x = ((RGBA_Draw_Context *)context)->clip.x;
+   *y = ((RGBA_Draw_Context *)context)->clip.y;
+   *w = ((RGBA_Draw_Context *)context)->clip.w;
+   *h = ((RGBA_Draw_Context *)context)->clip.h;
+   return ((RGBA_Draw_Context *)context)->clip.use;
+}
+
+static void
+eng_context_color_set(void *data __UNUSED__, void *context, int r, int g, int b, int a)
+{
+   evas_common_draw_context_set_color(context, r, g, b, a);
+}
+
+static int
+eng_context_color_get(void *data __UNUSED__, void *context, int *r, int *g, int *b, int *a)
+{
+   *r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->col.col));
+   *g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->col.col));
+   *b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->col.col));
+   *a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->col.col));
+   return 1;
+}
+
+static void
+eng_context_multiplier_set(void *data __UNUSED__, void *context, int r, int g, int b, int a)
+{
+   evas_common_draw_context_set_multiplier(context, r, g, b, a);
+}
+
+static void
+eng_context_multiplier_unset(void *data __UNUSED__, void *context)
+{
+   evas_common_draw_context_unset_multiplier(context);
+}
+
+static int
+eng_context_multiplier_get(void *data __UNUSED__, void *context, int *r, int *g, int *b, int *a)
+{
+   *r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->mul.col));
+   *g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->mul.col));
+   *b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->mul.col));
+   *a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->mul.col));
+   return ((RGBA_Draw_Context *)context)->mul.use;
+}
+
+static void
+eng_context_cutout_add(void *data __UNUSED__, void *context, int x, int y, int w, int h)
+{
+   evas_common_draw_context_add_cutout(context, x, y, w, h);
+}
+
+static void
+eng_context_cutout_clear(void *data __UNUSED__, void *context)
+{
+   evas_common_draw_context_clear_cutouts(context);
+}
+
+static void
+eng_context_anti_alias_set(void *data __UNUSED__, void *context, unsigned char aa)
+{
+   evas_common_draw_context_set_anti_alias(context, aa);
+}
+
+static unsigned char
+eng_context_anti_alias_get(void *data __UNUSED__, void *context)
+{
+   return ((RGBA_Draw_Context *)context)->anti_alias;
+}
+
+static void
+eng_context_color_interpolation_set(void *data __UNUSED__, void *context, int color_space)
+{
+   evas_common_draw_context_set_color_interpolation(context, color_space);
+}
+
+static int
+eng_context_color_interpolation_get(void *data __UNUSED__, void *context)
+{
+   return ((RGBA_Draw_Context *)context)->interpolation.color_space;
+}
+
+static void
+eng_context_render_op_set(void *data __UNUSED__, void *context, int op)
+{
+   evas_common_draw_context_set_render_op(context, op);
+}
+
+static int
+eng_context_render_op_get(void *data __UNUSED__, void *context)
+{
+   return ((RGBA_Draw_Context *)context)->render_op;
+}
+
+
+
+static void
+eng_rectangle_draw(void *data __UNUSED__, void *context, void *surface, int x, int y, int w, int h)
+{
+   soft16_rectangle_draw(surface, context, x, y, w, h);
+}
+
+static void
+eng_line_draw(void *data __UNUSED__, void *context, void *surface, int x1, int y1, int x2, int y2)
+{
+   soft16_line_draw(surface, context, x1, y1, x2, y2);
+}
+
+static void *
+eng_polygon_point_add(void *data __UNUSED__, void *context __UNUSED__, void *polygon, int x, int y)
+{
+   return evas_common_polygon_point_add(polygon, x, y);
+}
+
+static void *
+eng_polygon_points_clear(void *data __UNUSED__, void *context __UNUSED__, void *polygon)
+{
+   return evas_common_polygon_points_clear(polygon);
+}
+
+static void
+eng_polygon_draw(void *data __UNUSED__, void *context, void *surface, void *polygon, int x, int y)
+{
+   soft16_polygon_draw(surface, context, polygon, x, y);
+}
+
+
+static void
+eng_gradient2_color_np_stop_insert(void *data __UNUSED__, void *gradient __UNUSED__, int r __UNUSED__, int g __UNUSED__, int b __UNUSED__, int a __UNUSED__, float pos __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_clear(void *data __UNUSED__, void *gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_fill_transform_set(void *data __UNUSED__, void *gradient __UNUSED__, void *transform __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_fill_spread_set(void *data __UNUSED__, void *gradient __UNUSED__, int spread __UNUSED__)
+{
+}
+
+static void *
+eng_gradient2_linear_new(void *data __UNUSED__)
+{
+   return NULL;
+}
+
+static void
+eng_gradient2_linear_free(void *data __UNUSED__, void *linear_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_linear_fill_set(void *data __UNUSED__, void *linear_gradient __UNUSED__, float x0 __UNUSED__, float y0 __UNUSED__, float x1 __UNUSED__, float y1 __UNUSED__)
+{
+}
+
+static int
+eng_gradient2_linear_is_opaque(void *data __UNUSED__, void *context __UNUSED__, void *linear_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   return 1;
+}
+
+static int
+eng_gradient2_linear_is_visible(void *data __UNUSED__, void *context __UNUSED__, void *linear_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   return 1;
+}
+
+static void
+eng_gradient2_linear_render_pre(void *data __UNUSED__, void *context __UNUSED__, void *linear_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_linear_render_post(void *data __UNUSED__, void *linear_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_linear_draw(void *data __UNUSED__, void *context __UNUSED__, void *surface __UNUSED__, void *linear_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+}
+
+static void *
+eng_gradient2_radial_new(void *data __UNUSED__)
+{
+   return NULL;
+}
+
+static void
+eng_gradient2_radial_free(void *data __UNUSED__, void *radial_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_radial_fill_set(void *data __UNUSED__, void *radial_gradient __UNUSED__, float cx __UNUSED__, float cy __UNUSED__, float rx __UNUSED__, float ry __UNUSED__)
+{
+}
+
+static int
+eng_gradient2_radial_is_opaque(void *data __UNUSED__, void *context __UNUSED__, void *radial_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   return 1;
+}
+
+static int
+eng_gradient2_radial_is_visible(void *data __UNUSED__, void *context __UNUSED__, void *radial_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   return 1;
+}
+
+static void
+eng_gradient2_radial_render_pre(void *data __UNUSED__, void *context __UNUSED__, void *radial_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_radial_render_post(void *data __UNUSED__, void *radial_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_radial_draw(void *data __UNUSED__, void *context __UNUSED__, void *surface __UNUSED__, void *radial_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+}
+
+static void *
+eng_gradient_new(void *data __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+   return NULL;
+//   return evas_common_gradient_new();
+}
+
+static void
+eng_gradient_free(void *data __UNUSED__, void *gradient __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+//   evas_common_gradient_free(gradient);
+}
+
+static void
+eng_gradient_color_stop_add(void *data __UNUSED__, void *gradient __UNUSED__, int r __UNUSED__, int g __UNUSED__, int b __UNUSED__, int a __UNUSED__, int delta __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+//   evas_common_gradient_color_stop_add(gradient, r, g, b, a, delta);
+}
+
+static void
+eng_gradient_alpha_stop_add(void *data __UNUSED__, void *gradient __UNUSED__, int a __UNUSED__, int delta __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+//   evas_common_gradient_alpha_stop_add(gradient, a, delta);
+}
+
+static void
+eng_gradient_color_data_set(void *data __UNUSED__, void *gradient __UNUSED__, void *map __UNUSED__, int len __UNUSED__, int has_alpha __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+//   evas_common_gradient_color_data_set(gradient, map, len, has_alpha);
+}
+
+static void
+eng_gradient_alpha_data_set(void *data __UNUSED__, void *gradient __UNUSED__, void *alpha_map __UNUSED__, int len __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+//   evas_common_gradient_alpha_data_set(gradient, alpha_map, len);
+}
+
+static void
+eng_gradient_clear(void *data __UNUSED__, void *gradient __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+//   evas_common_gradient_clear(gradient);
+}
+
+static void
+eng_gradient_fill_set(void *data __UNUSED__, void *gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+//   evas_common_gradient_fill_set(gradient, x, y, w, h);
+}
+
+static void
+eng_gradient_fill_angle_set(void *data __UNUSED__, void *gradient __UNUSED__, double angle __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+//   evas_common_gradient_fill_angle_set(gradient, angle);
+}
+
+static void
+eng_gradient_fill_spread_set(void *data __UNUSED__, void *gradient __UNUSED__, int spread __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+//   evas_common_gradient_fill_spread_set(gradient, spread);
+}
+
+static void
+eng_gradient_angle_set(void *data __UNUSED__, void *gradient __UNUSED__, double angle __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+//   evas_common_gradient_map_angle_set(gradient, angle);
+}
+
+static void
+eng_gradient_offset_set(void *data __UNUSED__, void *gradient __UNUSED__, float offset __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+//   evas_common_gradient_map_offset_set(gradient, offset);
+}
+
+static void
+eng_gradient_direction_set(void *data __UNUSED__, void *gradient __UNUSED__, int direction __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+//   evas_common_gradient_map_direction_set(gradient, direction);
+}
+
+static void
+eng_gradient_type_set(void *data __UNUSED__, void *gradient __UNUSED__, char *name __UNUSED__, char *params __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+//   evas_common_gradient_type_set(gradient, name, params);
+}
+
+static int
+eng_gradient_is_opaque(void *data __UNUSED__, void *context __UNUSED__, void *gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+   return 0;
+//   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+//   RGBA_Gradient *gr = (RGBA_Gradient *)gradient;
+//
+//   if (!dc || !gr || !gr->type.geometer)  return 0;
+//   return !(gr->type.geometer->has_alpha(gr, dc->render_op) |
+//              gr->type.geometer->has_mask(gr, dc->render_op));
+}
+
+static int
+eng_gradient_is_visible(void *data __UNUSED__, void *context __UNUSED__, void *gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+   return 0;
+//   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+//
+//   if (!dc || !gradient)  return 0;
+//   return 1;
+}
+
+static void
+eng_gradient_render_pre(void *data __UNUSED__, void *context __UNUSED__, void *gradient __UNUSED__)
+{
+//   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+//   RGBA_Gradient *gr = (RGBA_Gradient *)gradient;
+//   int  len;
+//
+//   if (!dc || !gr || !gr->type.geometer)  return;
+//   gr->type.geometer->geom_set(gr);
+//   len = gr->type.geometer->get_map_len(gr);
+//   evas_common_gradient_map(dc, gr, len);
+   NOT_IMPLEMENTED();
+}
+
+static void
+eng_gradient_render_post(void *data __UNUSED__, void *gradient __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+}
+
+static void
+eng_gradient_draw(void *data __UNUSED__, void *context __UNUSED__, void *surface __UNUSED__, void *gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+//   evas_common_gradient_draw(surface, context, x, y, w, h, gradient);
+//   evas_common_cpu_end_opt();
+   NOT_IMPLEMENTED();
+}
+
+static int
+eng_image_alpha_get(void *data __UNUSED__, void *image)
+{
+   Soft16_Image *im;
+
+   if (!image) return 0;
+   im = image;
+   return im->cache_entry.flags.alpha;
+}
+
+static int
+eng_image_colorspace_get(void *data __UNUSED__, void *image __UNUSED__)
+{
+   return EVAS_COLORSPACE_RGB565_A5P;
+}
+
+static void *
+eng_image_alpha_set(void *data __UNUSED__, void *image, int have_alpha)
+{
+   if (!image) return NULL;
+   have_alpha = !!have_alpha;
+   image = soft16_image_alpha_set(image, have_alpha);
+   return image;
+}
+
+static void *
+eng_image_border_set(void *data __UNUSED__, void *image, int l __UNUSED__, int r __UNUSED__, int t __UNUSED__, int b __UNUSED__)
+{
+   return image;
+}
+
+static void
+eng_image_border_get(void *data __UNUSED__, void *image __UNUSED__, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__)
+{
+}
+
+static char *
+eng_image_comment_get(void *data __UNUSED__, void *image __UNUSED__, char *key __UNUSED__)
+{
+   return NULL;
+}
+
+static char *
+eng_image_format_get(void *data __UNUSED__, void *image __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+   return NULL;
+}
+
+static void
+eng_image_colorspace_set(void *data __UNUSED__, void *image __UNUSED__, int cspace __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+}
+
+static void
+eng_image_native_set(void *data __UNUSED__, void *image __UNUSED__, void *native __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+}
+
+static void *
+eng_image_native_get(void *data __UNUSED__, void *image __UNUSED__)
+{
+   NOT_IMPLEMENTED();
+   return NULL;
+}
+
+static void *
+eng_image_load(void *data __UNUSED__, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
+{
+   return evas_cache_image_request(evas_common_soft16_image_cache_get(), file, key, lo, error);
+}
+
+static void *
+eng_image_new_from_data(void *data __UNUSED__, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   if ((image_data) && (cspace != EVAS_COLORSPACE_RGB565_A5P))
+     {
+       WRN("Unsupported colorspace %d in %s() (%s:%d)",
+               cspace, __FUNCTION__, __FILE__, __LINE__);
+       return NULL;
+     }
+   return evas_cache_image_data(evas_common_soft16_image_cache_get(), w, h, image_data, alpha, EVAS_COLORSPACE_RGB565_A5P);
+}
+
+static void *
+eng_image_new_from_copied_data(void *data __UNUSED__, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   if ((image_data) && (cspace != EVAS_COLORSPACE_RGB565_A5P))
+     {
+       WRN("Unsupported colorspace %d in %s() (%s:%d)",
+               cspace, __FUNCTION__, __FILE__, __LINE__);
+       return NULL;
+     }
+   return evas_cache_image_copied_data(evas_common_soft16_image_cache_get(), w, h, image_data, alpha, EVAS_COLORSPACE_RGB565_A5P);
+}
+
+static void
+eng_image_free(void *data __UNUSED__, void *image)
+{
+   evas_cache_image_drop((Image_Entry *) image);
+}
+
+static void
+eng_image_size_get(void *data __UNUSED__, void *image, int *w, int *h)
+{
+   Soft16_Image *im;
+
+   if (w) *w = 0;
+   if (h) *h = 0;
+   if (!image) return;
+   im = image;
+   if (w) *w = im->cache_entry.w;
+   if (h) *h = im->cache_entry.h;
+}
+
+static void *
+eng_image_size_set(void *data __UNUSED__, void *image, int w, int h)
+{
+   if (!image) return NULL;
+   if ((w <= 0) || (h <= 0))
+     {
+        evas_cache_image_drop((Image_Entry *) image);
+       return NULL;
+     }
+   return evas_cache_image_size_set((Image_Entry *) image, w, h);
+}
+
+static void
+eng_image_stride_get(void *data __UNUSED__, void *image, int *stride)
+{
+   Soft16_Image *im;
+
+   if (stride) *stride = 0;
+   if (!image) return;
+   im = image;
+   if (stride) *stride = im->stride;
+}
+
+static void *
+eng_image_dirty_region(void *data __UNUSED__, void *image, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   /* FIXME: is this required? */
+   //NOT_IMPLEMENTED();
+   return image;
+}
+
+static void *
+eng_image_data_get(void *data __UNUSED__, void *image, int to_write, DATA32 **image_data)
+{
+   Soft16_Image *im;
+
+   if (!image)
+     {
+       *image_data = NULL;
+       return NULL;
+     }
+
+   im = image;
+   evas_cache_image_load_data(&im->cache_entry);
+
+   if (to_write)
+     im = (Soft16_Image *) evas_cache_image_alone(&im->cache_entry);
+
+   if (image_data) *image_data = (DATA32 *) im->pixels;
+
+   return im;
+}
+
+static void *
+eng_image_data_put(void *data __UNUSED__, void *image, DATA32 *image_data)
+{
+   Soft16_Image *old_im, *new_im;
+
+   if (!image) return NULL;
+
+   old_im = image;
+   if ((DATA16 *)image_data == old_im->pixels) return old_im;
+
+   new_im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), old_im->cache_entry.w, old_im->cache_entry.h, image_data, old_im->cache_entry.flags.alpha, EVAS_COLORSPACE_RGB565_A5P);
+   evas_cache_image_drop(&old_im->cache_entry);
+   return new_im;
+}
+
+static void
+eng_image_data_preload_request(void *data __UNUSED__, void *image, const void *target)
+{
+   Soft16_Image *im = image;
+
+   if (!im) return ;
+   evas_cache_image_preload_data(&im->cache_entry, target);
+}
+
+static void
+eng_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target)
+{
+   Soft16_Image *im = image;
+
+   if (!im) return ;
+   evas_cache_image_preload_cancel(&im->cache_entry, target);
+}
+
+static void
+eng_image_draw(void *data __UNUSED__, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
+{
+   Soft16_Image *im;
+
+   im = (Soft16_Image *) image;
+
+   evas_cache_image_load_data(&im->cache_entry);
+   soft16_image_draw(im, surface, context,
+                    src_x, src_y, src_w, src_h,
+                    dst_x, dst_y, dst_w, dst_h,
+                    smooth);
+}
+
+static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image __UNUSED__, int hint __UNUSED__)
+{
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image __UNUSED__)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+static void
+eng_image_cache_flush(void *data __UNUSED__)
+{
+   evas_cache_image_flush(evas_common_soft16_image_cache_get());
+}
+
+static void
+eng_image_cache_set(void *data __UNUSED__, int bytes)
+{
+   evas_cache_image_set(evas_common_soft16_image_cache_get(), bytes);
+}
+
+static int
+eng_image_cache_get(void *data __UNUSED__)
+{
+   return evas_cache_image_get(evas_common_soft16_image_cache_get());
+}
+
+static void *
+eng_font_load(void *data __UNUSED__, const char *name, int size)
+{
+   return evas_common_font_load(name, size);
+}
+
+static void *
+eng_font_memory_load(void *data __UNUSED__, char *name, int size, const void *fdata, int fdata_size)
+{
+   return evas_common_font_memory_load(name, size, fdata, fdata_size);
+}
+
+static void *
+eng_font_add(void *data __UNUSED__, void *font, const char *name, int size)
+{
+   return evas_common_font_add(font, name, size);
+}
+
+static void *
+eng_font_memory_add(void *data __UNUSED__, void *font, char *name, int size, const void *fdata, int fdata_size)
+{
+   return evas_common_font_memory_add(font, name, size, fdata, fdata_size);
+}
+
+static void
+eng_font_free(void *data __UNUSED__, void *font)
+{
+   evas_common_font_free(font);
+}
+
+static int
+eng_font_ascent_get(void *data __UNUSED__, void *font)
+{
+   return evas_common_font_ascent_get(font);
+}
+
+static int
+eng_font_descent_get(void *data __UNUSED__, void *font)
+{
+   return evas_common_font_descent_get(font);
+}
+
+static int
+eng_font_max_ascent_get(void *data __UNUSED__, void *font)
+{
+   return evas_common_font_max_ascent_get(font);
+}
+
+static int
+eng_font_max_descent_get(void *data __UNUSED__, void *font)
+{
+   return evas_common_font_max_descent_get(font);
+}
+
+static void
+eng_font_string_size_get(void *data __UNUSED__, void *font, const char *text, int *w, int *h)
+{
+   evas_common_font_query_size(font, text, w, h);
+}
+
+static int
+eng_font_inset_get(void *data __UNUSED__, void *font, const char *text)
+{
+   return evas_common_font_query_inset(font, text);
+}
+
+static int
+eng_font_h_advance_get(void *data __UNUSED__, void *font, const char *text)
+{
+   int h, v;
+
+   evas_common_font_query_advance(font, text, &h, &v);
+   return h;
+}
+
+static int
+eng_font_v_advance_get(void *data __UNUSED__, void *font, const char *text)
+{
+   int h, v;
+
+   evas_common_font_query_advance(font, text, &h, &v);
+   return v;
+}
+
+static int
+eng_font_char_coords_get(void *data __UNUSED__, void *font, const char *text, int pos, int *cx, int *cy, int *cw, int *ch)
+{
+   return evas_common_font_query_char_coords(font, text, pos, cx, cy, cw, ch);
+}
+
+static int
+eng_font_char_at_coords_get(void *data __UNUSED__, void *font, const char *text, int x, int y, int *cx, int *cy, int *cw, int *ch)
+{
+   return evas_common_font_query_text_at_pos(font, text, x, y, cx, cy, cw, ch);
+}
+
+static int
+eng_font_last_up_to_pos(void *data __UNUSED__, void *font, const char *text, int x, int y)
+{
+   return evas_common_font_query_last_up_to_pos(font, text, x, y);
+}
+
+static void
+eng_font_draw(void *data __UNUSED__, void *context, void *surface, void *font, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, const char *text)
+{
+   static RGBA_Image    *im = NULL;
+   Soft16_Image         *dst = surface;
+
+   if (!im)
+     im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get());
+   evas_cache_image_surface_alloc(&im->cache_entry, dst->cache_entry.w, dst->cache_entry.h);
+   evas_common_draw_context_font_ext_set(context,
+                                        surface,
+                                        soft16_font_glyph_new,
+                                        soft16_font_glyph_free,
+                                        soft16_font_glyph_draw);
+   evas_common_font_draw(im, context, font, x, y, text);
+   evas_common_draw_context_font_ext_set(context,
+                                        NULL,
+                                        NULL,
+                                        NULL,
+                                        NULL);
+}
+
+static void
+eng_font_cache_flush(void *data __UNUSED__)
+{
+   evas_common_font_flush();
+}
+
+static void
+eng_font_cache_set(void *data __UNUSED__, int bytes)
+{
+   evas_common_font_cache_set(bytes);
+}
+
+static int
+eng_font_cache_get(void *data __UNUSED__)
+{
+   return evas_common_font_cache_get();
+}
+
+static void
+eng_font_hinting_set(void *data __UNUSED__, void *font, int hinting)
+{
+   evas_common_font_hinting_set(font, hinting);
+}
+
+static int
+eng_font_hinting_can_hint(void *data __UNUSED__, int hinting)
+{
+   return evas_common_hinting_available(hinting);
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data __UNUSED__, void *context __UNUSED__)
+{
+   return EINA_TRUE;
+}
+
+/*
+ *****
+ **
+ ** ENGINE API
+ **
+ *****
+ */
+
+static Evas_Func func =
+{
+   NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     eng_output_dump,
+     /* draw context virtual methods */
+     eng_context_new,
+     eng_canvas_alpha_get,
+     eng_context_free,
+     eng_context_clip_set,
+     eng_context_clip_clip,
+     eng_context_clip_unset,
+     eng_context_clip_get,
+     eng_context_color_set,
+     eng_context_color_get,
+     eng_context_multiplier_set,
+     eng_context_multiplier_unset,
+     eng_context_multiplier_get,
+     eng_context_cutout_add,
+     eng_context_cutout_clear,
+     eng_context_anti_alias_set,
+     eng_context_anti_alias_get,
+     eng_context_color_interpolation_set,
+     eng_context_color_interpolation_get,
+     eng_context_render_op_set,
+     eng_context_render_op_get,
+     /* rect draw funcs */
+     eng_rectangle_draw,
+     /* line draw funcs */
+     eng_line_draw,
+     /* polygon draw funcs */
+     eng_polygon_point_add,
+     eng_polygon_points_clear,
+     eng_polygon_draw,
+     /* gradient draw funcs */
+     eng_gradient2_color_np_stop_insert,
+     eng_gradient2_clear,
+     eng_gradient2_fill_transform_set,
+     eng_gradient2_fill_spread_set,
+     
+     eng_gradient2_linear_new,
+     eng_gradient2_linear_free,
+     eng_gradient2_linear_fill_set,
+     eng_gradient2_linear_is_opaque,
+     eng_gradient2_linear_is_visible,
+     eng_gradient2_linear_render_pre,
+     eng_gradient2_linear_render_post,
+     eng_gradient2_linear_draw,
+     
+     eng_gradient2_radial_new,
+     eng_gradient2_radial_free,
+     eng_gradient2_radial_fill_set,
+     eng_gradient2_radial_is_opaque,
+     eng_gradient2_radial_is_visible,
+     eng_gradient2_radial_render_pre,
+     eng_gradient2_radial_render_post,
+     eng_gradient2_radial_draw,
+     
+     eng_gradient_new,
+     eng_gradient_free,
+     eng_gradient_color_stop_add,
+     eng_gradient_alpha_stop_add,
+     eng_gradient_color_data_set,
+     eng_gradient_alpha_data_set,
+     eng_gradient_clear,
+     eng_gradient_fill_set,
+     eng_gradient_fill_angle_set,
+     eng_gradient_fill_spread_set,
+     eng_gradient_angle_set,
+     eng_gradient_offset_set,
+     eng_gradient_direction_set,
+     eng_gradient_type_set,
+     eng_gradient_is_opaque,
+     eng_gradient_is_visible,
+     eng_gradient_render_pre,
+     eng_gradient_render_post,
+     eng_gradient_draw,
+     /* image draw funcs */
+     eng_image_load,
+     eng_image_new_from_data,
+     eng_image_new_from_copied_data,
+     eng_image_free,
+     eng_image_size_get,
+     eng_image_size_set,
+     eng_image_stride_get,
+     eng_image_dirty_region,
+     eng_image_data_get,
+     eng_image_data_put,
+     eng_image_data_preload_request,
+     eng_image_data_preload_cancel,
+     eng_image_alpha_set,
+     eng_image_alpha_get,
+     eng_image_border_set,
+     eng_image_border_get,
+     eng_image_draw,
+     eng_image_comment_get,
+     eng_image_format_get,
+     eng_image_colorspace_set,
+     eng_image_colorspace_get,
+     eng_image_native_set,
+     eng_image_native_get,
+     /* image cache funcs */
+     eng_image_cache_flush,
+     eng_image_cache_set,
+     eng_image_cache_get,
+     /* font draw functions */
+     eng_font_load,
+     eng_font_memory_load,
+     eng_font_add,
+     eng_font_memory_add,
+     eng_font_free,
+     eng_font_ascent_get,
+     eng_font_descent_get,
+     eng_font_max_ascent_get,
+     eng_font_max_descent_get,
+     eng_font_string_size_get,
+     eng_font_inset_get,
+     eng_font_h_advance_get,
+     eng_font_v_advance_get,
+     eng_font_char_coords_get,
+     eng_font_char_at_coords_get,
+     eng_font_draw,
+     /* font cache functions */
+     eng_font_cache_flush,
+     eng_font_cache_set,
+     eng_font_cache_get,
+     /* font hinting functions */
+     eng_font_hinting_set,
+     eng_font_hinting_can_hint,
+     eng_image_scale_hint_set,
+     eng_image_scale_hint_get,
+     /* more font draw functions */
+     eng_font_last_up_to_pos
+     /* FUTURE software generic calls go here */
+//   ORD(image_map4_draw);
+//   ORD(image_map_surface_new);
+//   ORD(image_map_surface_free);
+     /* FUTURE software generic calls go here */
+};
+
+/*
+ *****
+ **
+ ** MODULE ACCESSIBLE API API
+ **
+ *****
+ */
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   _evas_soft16_log_dom = eina_log_domain_register("Soft16Engine", EVAS_DEFAULT_LOG_COLOR);
+   if(_evas_soft16_log_dom < 0) 
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the soft16 Engine.\n");
+       return 0;
+     }
+   em->functions = (void *)(&func);
+   
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+   eina_log_domain_unregister(_evas_soft16_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+  EVAS_MODULE_API_VERSION,
+  "software_16",
+  "none",
+  {
+    module_open,
+    module_close
+  }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_16);
+
+#ifndef EVAS_STATIC_BUILD_SOFTWARE_16
+EVAS_EINA_MODULE_DEFINE(engine, software_16);
+#endif
diff --git a/src/modules/engines/software_16_ddraw/.cvsignore b/src/modules/engines/software_16_ddraw/.cvsignore
new file mode 100644 (file)
index 0000000..8cb5c05
--- /dev/null
@@ -0,0 +1,4 @@
+Makefile.in
+Makefile
+.deps
+.libs
diff --git a/src/modules/engines/software_16_ddraw/Evas_Engine_Software_16_DDraw.h b/src/modules/engines/software_16_ddraw/Evas_Engine_Software_16_DDraw.h
new file mode 100644 (file)
index 0000000..7c3d888
--- /dev/null
@@ -0,0 +1,29 @@
+#ifndef __EVAS_ENGINE_SOFTWARE_16_DDRAW_H__
+#define __EVAS_ENGINE_SOFTWARE_16_DDRAW_H__
+
+
+#include <windows.h>
+#include <ddraw.h>
+
+typedef struct _Evas_Engine_Info_Software_16_DDraw Evas_Engine_Info_Software_16_DDraw;
+
+struct _Evas_Engine_Info_Software_16_DDraw
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   struct {
+      HWND                window;
+      LPDIRECTDRAW        object;          /* DirectDraw object */
+      LPDIRECTDRAWSURFACE surface_primary; /* DirectDraw primary surface */
+      LPDIRECTDRAWSURFACE surface_back;    /* DirectDraw back surface */
+      LPDIRECTDRAWSURFACE surface_source;  /* DirectDraw source surface */
+      int                 depth;
+
+      int                 rotation;
+   } info;
+};
+
+
+#endif /* __EVAS_ENGINE_SOFTWARE_16_DDRAW_H__ */
diff --git a/src/modules/engines/software_16_ddraw/Makefile.am b/src/modules/engines/software_16_ddraw/Makefile.am
new file mode 100644 (file)
index 0000000..321227c
--- /dev/null
@@ -0,0 +1,47 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines \
+-I$(top_srcdir)/src/modules/engines/software_16 \
+@EINA_CFLAGS@ \
+@FREETYPE_CFLAGS@ \
+@evas_engine_software_16_ddraw_cflags@
+
+if BUILD_ENGINE_SOFTWARE_16_DDRAW
+
+SOFTWARE_16_DDRAW_SOURCES = \
+evas_engine.c \
+evas_ddraw_buffer.cpp \
+evas_ddraw_main.cpp
+
+SOFTWARE_16_DDRAW_LIBADD = @evas_engine_software_16_ddraw_libs@
+
+pkgdir = $(libdir)/evas/modules/engines/software_16_ddraw/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_Software_16_DDraw.h
+
+if !EVAS_STATIC_BUILD_SOFTWARE_16_DDRAW
+
+pkg_LTLIBRARIES        = module.la
+
+module_la_SOURCES = $(SOFTWARE_16_DDRAW_SOURCES)
+module_la_CXXFLAGS = -fno-rtti -fno-exceptions
+module_la_LIBADD = $(top_builddir)/src/lib/libevas.la @EINA_LIBS@ $(SOFTWARE_16_DDRAW_LIBADD)
+module_la_LDFLAGS = @lt_enable_auto_import@ -no-undefined -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_software_16_ddraw.la
+
+libevas_engine_software_16_ddraw_la_SOURCES = $(SOFTWARE_16_DDRAW_SOURCES)
+libevas_engine_software_16_ddraw_la_LIBADD = $(SOFTWARE_16_DDRAW_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/software_16_ddraw/evas_ddraw_buffer.cpp b/src/modules/engines/software_16_ddraw/evas_ddraw_buffer.cpp
new file mode 100644 (file)
index 0000000..7a0a8b7
--- /dev/null
@@ -0,0 +1,87 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+
+DDraw_Output_Buffer *
+evas_software_ddraw_output_buffer_new(HWND                window,
+                                      LPDIRECTDRAW        object,
+                                      LPDIRECTDRAWSURFACE surface_primary,
+                                      LPDIRECTDRAWSURFACE surface_back,
+                                      LPDIRECTDRAWSURFACE surface_source,
+                                      int                 width,
+                                      int                 height)
+{
+   DDSURFACEDESC        surface_desc;
+   DDraw_Output_Buffer *ddob;
+
+   ddob = (DDraw_Output_Buffer *)calloc(1, sizeof(DDraw_Output_Buffer));
+   if (!ddob) return NULL;
+
+   ddob->dd.window = window;
+   ddob->dd.object = object;
+   ddob->dd.surface_primary = surface_primary;
+   ddob->dd.surface_back = surface_back;
+   ddob->dd.surface_source = surface_source;
+   ddob->width = width;
+   ddob->height = height;
+   ddob->pitch = width * 2;
+
+   ZeroMemory(&surface_desc, sizeof(surface_desc));
+   surface_desc.dwSize = sizeof(surface_desc);
+
+   if (FAILED(ddob->dd.surface_source->Lock(NULL,
+                                            &surface_desc,
+                                            DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,
+                                            NULL)))
+     {
+        free(ddob);
+        return NULL;
+     }
+
+   ddob->data = (DATA16 *)surface_desc.lpSurface;
+
+   if (FAILED(ddob->dd.surface_source->Unlock(NULL)))
+     {
+        free(ddob);
+        return NULL;
+     }
+   if (ddob->im)
+     evas_cache_image_drop(&ddob->im->cache_entry);
+
+   ddob->im =  (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), width, height, (DATA32 *) ddob->data, 0, EVAS_COLORSPACE_RGB565_A5P);
+   if (ddob->im)
+     ddob->im->stride = ddob->pitch;
+
+   return ddob;
+}
+
+void
+evas_software_ddraw_output_buffer_free(DDraw_Output_Buffer *ddob, int sync)
+{
+   free(ddob);
+}
+
+void
+evas_software_ddraw_output_buffer_paste(DDraw_Output_Buffer *ddob)
+{
+   RECT  dst_rect;
+   RECT  src_rect;
+   POINT p;
+
+   SetRect(&src_rect, 0, 0, ddob->width, ddob->height);
+
+   if (FAILED(ddob->dd.surface_back->BltFast(0, 0,
+                                             ddob->dd.surface_source,
+                                             &src_rect,
+                                             DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT)))
+     return;
+
+   p.x = 0;
+   p.y = 0;
+   ClientToScreen(ddob->dd.window, &p);
+   GetClientRect(ddob->dd.window, &dst_rect);
+   OffsetRect(&dst_rect, p.x, p.y);
+   ddob->dd.surface_primary->Blt(&dst_rect,
+                                 ddob->dd.surface_back, &src_rect,
+                                 DDBLT_WAIT, NULL);
+}
diff --git a/src/modules/engines/software_16_ddraw/evas_ddraw_main.cpp b/src/modules/engines/software_16_ddraw/evas_ddraw_main.cpp
new file mode 100644 (file)
index 0000000..7a2eb7f
--- /dev/null
@@ -0,0 +1,71 @@
+#include "evas_engine.h"
+
+
+void *
+evas_software_ddraw_lock(DDraw_Output_Buffer *ddob, int *ddraw_width, int *ddraw_height, int *ddraw_pitch, int *ddraw_depth)
+{
+   DDSURFACEDESC surface_desc;
+
+   ZeroMemory(&surface_desc, sizeof(surface_desc));
+   surface_desc.dwSize = sizeof(surface_desc);
+
+   if (FAILED(ddob->dd.surface_back->Lock(NULL,
+                                          &surface_desc,
+                                          DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_WRITEONLY,
+                                          NULL)))
+     return NULL;
+
+   *ddraw_width = surface_desc.dwWidth;
+   *ddraw_height = surface_desc.dwHeight;
+   *ddraw_pitch = surface_desc.lPitch;
+   *ddraw_depth = surface_desc.ddpfPixelFormat.dwRGBBitCount >> 3;
+
+   return surface_desc.lpSurface;
+}
+
+void
+evas_software_ddraw_unlock_and_flip(DDraw_Output_Buffer *ddob)
+{
+   RECT    dst_rect;
+   RECT    src_rect;
+   POINT   p;
+
+   if (FAILED(ddob->dd.surface_back->Unlock(NULL)))
+     return;
+
+   /* we figure out where on the primary surface our window lives */
+   p.x = 0;
+   p.y = 0;
+   ClientToScreen(ddob->dd.window, &p);
+   GetClientRect(ddob->dd.window, &dst_rect);
+   OffsetRect(&dst_rect, p.x, p.y);
+   SetRect(&src_rect, 0, 0, ddob->width, ddob->height);
+
+   /* nothing to do if the function fails, so we don't check the result */
+   ddob->dd.surface_primary->BltFast(0, 0,
+                                     ddob->dd.surface_back, &dst_rect,
+                                     DDBLTFAST_WAIT || DDBLTFAST_NOCOLORKEY);
+}
+
+void
+evas_software_ddraw_surface_resize(DDraw_Output_Buffer *ddob)
+{
+   DDSURFACEDESC surface_desc;
+
+   ddob->dd.surface_back->Release();
+   memset (&surface_desc, 0, sizeof (surface_desc));
+   surface_desc.dwSize = sizeof (surface_desc);
+   /* FIXME: that code does not compile. Must know why */
+#if 0
+   surface_desc.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
+   surface_desc.dwWidth = width;
+   surface_desc.dwHeight = height;
+   IDirectDrawSurface7_SetSurfaceDesc(ddob->dd.surface_back, &surface_desc, NULL);
+#else
+   surface_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
+   surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
+   surface_desc.dwWidth = ddob->width;
+   surface_desc.dwHeight = ddob->height;
+   ddob->dd.object->CreateSurface(&surface_desc, &ddob->dd.surface_back, NULL);
+#endif
+}
diff --git a/src/modules/engines/software_16_ddraw/evas_engine.c b/src/modules/engines/software_16_ddraw/evas_engine.c
new file mode 100644 (file)
index 0000000..6e2abb0
--- /dev/null
@@ -0,0 +1,627 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_Software_16_DDraw.h"
+#include "evas_common_soft16.h"
+
+int _evas_engine_soft16_ddraw_log_dom = -1;
+/* function tables - filled in later (func and parent func) */
+static Evas_Func func, pfunc;
+
+/* engine struct data */
+typedef struct _Render_Engine Render_Engine;
+
+struct _Render_Engine
+{
+   HWND                 window;
+   LPDIRECTDRAW         object;
+   LPDIRECTDRAWSURFACE  surface_primary;
+   LPDIRECTDRAWSURFACE  surface_back;
+   LPDIRECTDRAWSURFACE  surface_source;
+   int                  width;
+   int                  height;
+   int                  rotation;
+   Tilebuf             *tb;
+   Tilebuf_Rect        *rects;
+   Tilebuf_Rect        *cur_rect;
+   DDraw_Output_Buffer *ddob;
+   Soft16_Image        *tmp_out; /* used by indirect render, like rotation */
+   HRGN                 clip_rects;
+   unsigned char        end : 1;
+};
+
+/* prototypes we will use here */
+
+static void *eng_info(Evas *e);
+static void eng_info_free(Evas *e, void *info);
+static int eng_setup(Evas *e, void *info);
+static void eng_output_free(void *data);
+static void eng_output_resize(void *data, int w, int h);
+static void eng_output_tile_size_set(void *data, int w, int h);
+static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_clear(void *data);
+static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
+static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
+static void eng_output_flush(void *data);
+static void eng_output_idle_flush(void *data);
+
+/* engine api this module provides */
+static void *
+eng_info(Evas *e)
+{
+   Evas_Engine_Info_Software_16_DDraw *info;
+   info = calloc(1, sizeof(Evas_Engine_Info_Software_16_DDraw));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   return info;
+   e = NULL;
+}
+
+static void
+eng_info_free(Evas *e, void *info)
+{
+   Evas_Engine_Info_Software_16_DDraw *in;
+   in = (Evas_Engine_Info_Software_16_DDraw *)info;
+   free(in);
+}
+
+static void
+_tmp_out_alloc(Render_Engine *re)
+{
+   Tilebuf_Rect *r;
+   int w = 0, h = 0;
+
+   EINA_INLIST_FOREACH(re->rects, r)
+     {
+       if (r->w > w) w = r->w;
+       if (r->h > h) h = r->h;
+     }
+
+   if (re->tmp_out)
+     {
+       if ((re->tmp_out->cache_entry.w < w) || (re->tmp_out->cache_entry.h < h))
+         {
+            evas_cache_image_drop(&re->tmp_out->cache_entry);
+            re->tmp_out = NULL;
+         }
+     }
+
+   if (!re->tmp_out)
+     {
+       Soft16_Image *im;
+
+       im = (Soft16_Image *) evas_cache_image_empty(evas_common_soft16_image_cache_get());
+        im->cache_entry.flags.alpha = 0;
+        evas_cache_image_surface_alloc(&im->cache_entry, w, h);
+
+       re->tmp_out = im;
+     }
+}
+
+
+static int
+eng_setup(Evas *e, void *in)
+{
+   Render_Engine                      *re;
+   Evas_Engine_Info_Software_16_DDraw *info;
+
+   info = (Evas_Engine_Info_Software_16_DDraw *)in;
+   if (!e->engine.data.output)
+     {
+       /* the only check - simplistic, i know, but enough for this
+        * "special purpose" engine. Remember it is meant to be used
+        * for limited power devices that have a 16bit display mode
+        * and no real other acceleration, and high resolution so we
+        * can pre-dither into 16bpp. */
+        if (info->info.depth != 16)
+         return 0;
+       /* do common routine init - we wil at least use it for core
+        * image loading and font loading/glyph rendering & placement */
+       evas_common_cpu_init();
+
+       evas_common_blend_init();
+       evas_common_image_init();
+       evas_common_convert_init();
+       evas_common_scale_init();
+       evas_common_rectangle_init();
+       evas_common_gradient_init();
+       evas_common_polygon_init();
+       evas_common_line_init();
+       evas_common_font_init();
+       evas_common_draw_init();
+       evas_common_tilebuf_init();
+        evas_common_soft16_image_init();
+
+       /* render engine specific data */
+       re = calloc(1, sizeof(Render_Engine));
+        if (!re)
+          return 0;
+       e->engine.data.output = re;
+       re->window = info->info.window;
+       re->object = info->info.object;
+       re->surface_primary = info->info.surface_primary;
+       re->surface_back = info->info.surface_back;
+       re->surface_source = info->info.surface_source;
+       re->width = e->output.w;
+       re->height = e->output.h;
+       re->rotation = info->info.rotation;
+       re->tb = evas_common_tilebuf_new(e->output.w, e->output.h);
+       if (re->tb)
+         evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+     }
+   else
+     {
+       /* we changed the info after first init - do a re-eval where
+        * appropriate */
+       if (info->info.depth != 16)
+         return 0;
+       re = e->engine.data.output;
+       if (re->tb) evas_common_tilebuf_free(re->tb);
+       re->window = info->info.window;
+       re->object = info->info.object;
+       re->surface_primary = info->info.surface_primary;
+       re->surface_back = info->info.surface_back;
+       re->surface_source = info->info.surface_source;
+       re->width = e->output.w;
+       re->height = e->output.h;
+       re->rotation = info->info.rotation;
+       re->tb = evas_common_tilebuf_new(e->output.w, e->output.h);
+       if (re->tb)
+         evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+       if (re->tmp_out)
+         {
+            evas_cache_image_drop(&re->tmp_out->cache_entry);
+            re->tmp_out = NULL;
+         }
+     }
+   if (!e->engine.data.output) return 0;
+   /* add a draw context if we dont have one */
+   if (!e->engine.data.context)
+     e->engine.data.context =
+     e->engine.func->context_new(e->engine.data.output);
+
+   return 1;
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (re->ddob) evas_software_ddraw_output_buffer_free(re->ddob, 0);
+   if (re->clip_rects) DeleteObject(re->clip_rects);
+   if (re->tb) evas_common_tilebuf_free(re->tb);
+   if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+   if (re->tmp_out) evas_cache_image_drop(&re->tmp_out->cache_entry);
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+   evas_common_soft16_image_shutdown();
+}
+
+static void
+eng_output_resize(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+
+   if ((re->width == w) && (re->height == h)) return;
+
+   if (re->ddob)
+     evas_software_ddraw_surface_resize(re->ddob);
+
+   evas_common_tilebuf_free(re->tb);
+   re->width = w;
+   re->height = h;
+   re->tb = evas_common_tilebuf_new(w, h);
+   if (re->tb)
+     evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+   if (re->ddob)
+     {
+        evas_software_ddraw_output_buffer_free(re->ddob, 0);
+       re->ddob = NULL;
+     }
+   if (re->clip_rects)
+     {
+       DeleteObject(re->clip_rects);
+       re->clip_rects = NULL;
+     }
+   if (re->tmp_out)
+     {
+       evas_cache_image_drop(&re->tmp_out->cache_entry);
+       re->tmp_out = NULL;
+     }
+}
+
+static void
+eng_output_tile_size_set(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_set_tile_size(re->tb, w, h);
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_clear(re->tb);
+}
+
+static inline void
+_output_buffer_alloc(Render_Engine *re)
+{
+   int width;
+   int height;
+
+   if (re->ddob) return;
+
+   if ((re->rotation == 0) || (re->rotation == 180))
+     {
+       width = re->width;
+       height = re->height;
+     }
+   else
+     {
+       width = re->height;
+       height = re->width;
+     }
+
+   re->ddob = evas_software_ddraw_output_buffer_new(re->window,
+                                                    re->object,
+                                                    re->surface_primary,
+                                                    re->surface_back,
+                                                    re->surface_source,
+                                                    width,
+                                                    height);
+}
+
+static void *
+eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re;
+   Tilebuf_Rect *rect;
+   int ux, uy, uw, uh;
+
+   re = (Render_Engine *)data;
+   if (re->end)
+     {
+       re->end = 0;
+       return NULL;
+     }
+   if (!re->rects)
+     {
+       re->rects = evas_common_tilebuf_get_render_rects(re->tb);
+       if (!re->rects) return NULL;
+
+       re->cur_rect = re->rects;
+       _output_buffer_alloc(re);
+       if (re->rotation != 0) _tmp_out_alloc(re); /* grows if required */
+     }
+   if (!re->cur_rect)
+     {
+       if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       return NULL;
+     }
+   rect = re->cur_rect;
+   ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h;
+   re->cur_rect = (Tilebuf_Rect *)((EINA_INLIST_GET(re->cur_rect))->next);
+   if (!re->cur_rect)
+     {
+       evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       re->end = 1;
+     }
+
+   *x = ux; *y = uy; *w = uw; *h = uh;
+   if (re->rotation == 0)
+     {
+       *cx = ux; *cy = uy; *cw = uw; *ch = uh;
+       return &re->ddob->im;
+     }
+   else
+     {
+       *cx = 0; *cy = 0; *cw = uw; *ch = uh;
+       return re->tmp_out;
+     }
+}
+
+static void
+_blit_rot_90(Soft16_Image *dst, const Soft16_Image *src,
+            int out_x, int out_y, int w, int h)
+{
+   DATA16 *dp, *sp;
+   int x, y;
+
+   sp = src->pixels;
+   dp = dst->pixels + (out_x +
+                      (w + out_y - 1) * dst->stride);
+
+   for (y = 0; y < h; y++)
+     {
+       DATA16 *dp_itr, *sp_itr;
+
+       sp_itr = sp;
+       dp_itr = dp;
+
+       for (x = 0; x < w; x++)
+         {
+            *dp_itr = *sp_itr;
+
+            sp_itr++;
+            dp_itr -= dst->stride;
+         }
+       sp += src->stride;
+       dp++;
+     }
+}
+
+static void
+_blit_rot_180(Soft16_Image *dst, const Soft16_Image *src,
+             int out_x, int out_y, int w, int h)
+{
+   DATA16 *dp, *sp;
+   int x, y;
+
+   sp = src->pixels;
+   dp = dst->pixels + ((w + out_x - 1) +
+                      (h + out_y - 1) * dst->stride);
+
+   for (y = 0; y < h; y++)
+     {
+       DATA16 *dp_itr, *sp_itr;
+
+       sp_itr = sp;
+       dp_itr = dp;
+
+       for (x = 0; x < w; x++)
+         {
+            *dp_itr = *sp_itr;
+
+            sp_itr++;
+            dp_itr--;
+         }
+       sp += src->stride;
+       dp -= dst->stride;
+     }
+}
+
+static void
+_blit_rot_270(Soft16_Image *dst, const Soft16_Image *src,
+             int out_x, int out_y, int w, int h)
+{
+   DATA16 *dp, *sp;
+   int x, y;
+
+   sp = src->pixels;
+   dp = dst->pixels + ((h + out_x - 1) +
+                      out_y * dst->stride);
+
+   for (y = 0; y < h; y++)
+     {
+       DATA16 *dp_itr, *sp_itr;
+
+       sp_itr = sp;
+       dp_itr = dp;
+
+       for (x = 0; x < w; x++)
+         {
+            *dp_itr = *sp_itr;
+
+            sp_itr++;
+            dp_itr += dst->stride;
+         }
+       sp += src->stride;
+       dp--;
+     }
+}
+
+static void
+_tmp_out_process(Render_Engine *re, int out_x, int out_y, int w, int h)
+{
+   Soft16_Image *d, *s;
+
+   d = &re->ddob->im;
+   s = re->tmp_out;
+
+   if ((w < 1) || (h < 1) || (out_x >= d->cache_entry.w) || (out_y >= d->cache_entry.h))
+     return;
+
+   if (re->rotation == 90)
+     _blit_rot_90(d, s, out_x, out_y, w, h);
+   else if (re->rotation == 180)
+     _blit_rot_180(d, s, out_x, out_y, w, h);
+   else if (re->rotation == 270)
+     _blit_rot_270(d, s, out_x, out_y, w, h);
+}
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+   HRGN           region;
+   int            xx;
+   int            yy;
+   int            width;
+   int            height;
+
+   re = (Render_Engine *)data;
+
+   if (!re->clip_rects)
+      re->clip_rects = CreateRectRgn(0, 0, 0, 0);
+
+   if (re->rotation == 0)
+     {
+       xx = x;
+       yy = y;
+       width = w;
+       height = h;
+     }
+   else if (re->rotation == 90)
+     {
+       xx = y;
+       yy = re->width - w - x;
+       width = h;
+       height = w;
+     }
+   else if (re->rotation == 180)
+     {
+       xx = re->width - w - x;
+       yy = re->height - h - y;
+       width = w;
+       height = h;
+     }
+   else if (re->rotation == 270)
+     {
+       xx = re->height - h - y;
+       yy = x;
+       width = h;
+       height = w;
+     }
+
+   region = CreateRectRgn(xx, yy, xx + width, yy + height);
+
+   if (re->rotation != 0)
+     _tmp_out_process(re, xx, yy, w, h);
+   CombineRgn(re->clip_rects, re->clip_rects, region, RGN_OR);
+}
+
+static void
+eng_output_flush(void *data)
+{
+   Render_Engine *re;
+   void          *ddraw_data;
+   int            ddraw_width;
+   int            ddraw_height;
+   int            ddraw_pitch;
+   int            ddraw_depth;
+
+   re = (Render_Engine *)data;
+   if (re->clip_rects)
+     {
+        /* FIXME : i have to manage that */
+/*     XSetRegion(re->disp, re->gc, re->clip_rects); */
+       DeleteObject(re->clip_rects);
+       re->clip_rects = NULL;
+     }
+   else return;
+
+   evas_software_ddraw_output_buffer_paste(re->ddob);
+
+   /* FIXME : i have to manage that */
+/*    XSetClipMask(re->disp, re->gc, None); */
+}
+
+static void
+eng_output_idle_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (re->ddob)
+     {
+       evas_software_ddraw_output_buffer_free(re->ddob, 0);
+       re->ddob = NULL;
+     }
+   if (re->clip_rects)
+     {
+       DeleteObject(re->clip_rects);
+       re->clip_rects = NULL;
+     }
+   if (re->tmp_out)
+     {
+       evas_cache_image_drop(&re->tmp_out->cache_entry);
+       re->tmp_out = NULL;
+     }
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data, void *context)
+{
+   return EINA_FALSE;
+}
+
+/* module advertising code */
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_16")) return 0;
+   _evas_engine_soft16_ddraw_log_dom = eina_log_domain_register("EvasSoft16DDraw",EINA_COLOR_BLUE);
+   if(_evas_engine_soft16_ddraw_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for Soft16_DDraw engine.\n");
+       return 0;
+     }
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(canvas_alpha_get);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+  eina_log_domain_unregister(_evas_engine_soft16_ddraw_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "software_16_ddraw",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_16_ddraw);
+
+#ifndef EVAS_STATIC_BUILD_SOFTWARE_16_DDRAW
+EVAS_EINA_MODULE_DEFINE(engine, software_16_ddraw);
+#endif
diff --git a/src/modules/engines/software_16_ddraw/evas_engine.h b/src/modules/engines/software_16_ddraw/evas_engine.h
new file mode 100644 (file)
index 0000000..fe85e97
--- /dev/null
@@ -0,0 +1,85 @@
+#ifndef __EVAS_ENGINE_H__
+#define __EVAS_ENGINE_H__
+
+#include <windows.h>
+#include <ddraw.h>
+
+#include "evas_common_soft16.h"
+
+extern int _evas_engine_soft16_ddraw_log_dom ;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_soft16_ddraw_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_soft16_ddraw_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_soft16_ddraw_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_soft16_ddraw_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_soft16_ddraw_log_dom, __VA_ARGS__)
+
+typedef struct _DDraw_Output_Buffer       DDraw_Output_Buffer;
+
+struct _DDraw_Output_Buffer
+{
+   Soft16_Image *im;
+  struct {
+     HWND                window;
+     LPDIRECTDRAW        object;
+     LPDIRECTDRAWSURFACE surface_primary;
+     LPDIRECTDRAWSURFACE surface_back;
+     LPDIRECTDRAWSURFACE surface_source;
+  } dd;
+   void        *data;
+   int          x;
+   int          y;
+   int          width;
+   int          height;
+   int          depth;
+   int          pitch;
+};
+
+/****/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+DDraw_Output_Buffer *evas_software_ddraw_output_buffer_new        (HWND                window,
+                                                                   LPDIRECTDRAW        object,
+                                                                   LPDIRECTDRAWSURFACE surface_primary,
+                                                                   LPDIRECTDRAWSURFACE surface_back,
+                                                                   LPDIRECTDRAWSURFACE surface_source,
+                                                                   int width,
+                                                                   int height);
+void                 evas_software_ddraw_output_buffer_free       (DDraw_Output_Buffer *ddob, int sync);
+void                 evas_software_ddraw_output_buffer_paste      (DDraw_Output_Buffer *ddob);
+
+
+void *evas_software_ddraw_lock(DDraw_Output_Buffer *ddob, int *ddraw_width, int *ddraw_height, int *ddraw_pitch, int *ddraw_depth);
+
+void  evas_software_ddraw_unlock_and_flip(DDraw_Output_Buffer *ddob);
+
+void  evas_software_ddraw_surface_resize(DDraw_Output_Buffer *ddob);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EVAS_ENGINE_H__ */
diff --git a/src/modules/engines/software_16_sdl/.cvsignore b/src/modules/engines/software_16_sdl/.cvsignore
new file mode 100644 (file)
index 0000000..09980ae
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
diff --git a/src/modules/engines/software_16_sdl/Evas_Engine_SDL_16.h b/src/modules/engines/software_16_sdl/Evas_Engine_SDL_16.h
new file mode 100644 (file)
index 0000000..20adccf
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef         _EVAS_ENGINE_SDL_16_H
+# define        _EVAS_ENGINE_SDL_16_H
+
+#include <SDL/SDL.h>
+
+typedef struct _Evas_Engine_Info_SDL_16 Evas_Engine_Info_SDL_16;
+struct _Evas_Engine_Info_SDL_16
+{
+  /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+  /* at you and make nasty noises */
+  Evas_Engine_Info magic;
+
+  struct {
+    int                         rotation;
+    int                         fullscreen : 1;
+    int                         hwsurface : 1;
+    int                         noframe : 1;
+    int                         alpha : 1;
+  } info;
+};
+
+#endif
diff --git a/src/modules/engines/software_16_sdl/Makefile.am b/src/modules/engines/software_16_sdl/Makefile.am
new file mode 100644 (file)
index 0000000..75ee709
--- /dev/null
@@ -0,0 +1,39 @@
+AUTOMAKE_OPTIONS     = 1.4 foreign
+
+MAINTAINERCLEANFILES = Makefile.in
+
+INCLUDES = -I. -I$(top_srcdir)/src/lib -I$(top_srcdir)/src/lib/include @FREETYPE_CFLAGS@ @SDL_CFLAGS@ @EINA_CFLAGS@
+
+if BUILD_ENGINE_SOFTWARE_SDL
+
+SOFTWARE_SDL_SOURCES = \
+evas_engine.c \
+evas_engine.h
+
+pkgdir = $(libdir)/evas/modules/engines/software_16_sdl/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_SDL_16.h
+
+if !EVAS_STATIC_BUILD_SOFTWARE_SDL
+
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = $(SOFTWARE_SDL_SOURCES)
+
+module_la_LIBADD = @EINA_LIBS@ @SDL_LIBS@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined -module -avoid-version -L$(top_builddir)/src/lib -L$(top_builddir)/src/lib/.libs
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_software_16_sdl.la
+
+libevas_engine_software_16_sdl_la_SOURCES = $(SOFTWARE_SDL_SOURCES)
+libevas_engine_software_16_sdl_la_LIBADD = @SDL_LIBS@
+
+endif
+endif
+
+EXTRA_DIST = \
+evas_engine.c \
+evas_engine.h \
+Evas_Engine_SDL_16.h
diff --git a/src/modules/engines/software_16_sdl/evas_engine.c b/src/modules/engines/software_16_sdl/evas_engine.c
new file mode 100644 (file)
index 0000000..049da61
--- /dev/null
@@ -0,0 +1,1310 @@
+#include <assert.h>
+#include <math.h>
+#include <string.h>
+#include <sys/time.h>
+#include <time.h>
+#include <SDL/SDL.h>
+
+#include "evas_common.h"
+#include "evas_engine.h"
+int _evas_engine_soft16_sdl_log_dom = -1;
+
+/* function tables - filled in later (func and parent func) */
+static Evas_Func        func = {};
+static Evas_Func        pfunc = {};
+
+static Engine_Image_Entry       *_sdl16_image_alloc       (void);
+static void                      _sdl16_image_delete      (Engine_Image_Entry *eim);
+
+static int                       _sdl16_image_constructor (Engine_Image_Entry *ie, void* data);
+static void                      _sdl16_image_destructor  (Engine_Image_Entry *eim);
+
+static void                      _sdl16_image_dirty_region(Engine_Image_Entry *eim, int x, int y, int w, int h);
+
+static int                       _sdl16_image_dirty       (Engine_Image_Entry *dst, const Engine_Image_Entry *src);
+
+static int                       _sdl16_image_size_set    (Engine_Image_Entry *dst, const Engine_Image_Entry *src);
+
+static int                       _sdl16_image_update_data (Engine_Image_Entry* dst, void* engine_data);
+
+static void                      _sdl16_image_load        (Engine_Image_Entry *eim, const Image_Entry* im);
+static int                       _sdl16_image_mem_size_get(Engine_Image_Entry *eim);
+
+#ifdef DEBUG_SDL
+static void                      _sdl16_image_debug       (const char* context, Engine_Image_Entry* im);
+#endif
+
+static const Evas_Cache_Engine_Image_Func       _sdl16_cache_engine_image_cb = {
+  NULL /* key */,
+  _sdl16_image_alloc /* alloc */,
+  _sdl16_image_delete /* dealloc */,
+  _sdl16_image_constructor /* constructor */,
+  _sdl16_image_destructor /* destructor */,
+  _sdl16_image_dirty_region /* dirty_region */,
+  _sdl16_image_dirty /* dirty */,
+  _sdl16_image_size_set /* size_set */,
+  _sdl16_image_update_data /* update_data */,
+  _sdl16_image_load /* load */,
+  _sdl16_image_mem_size_get /* mem_size_get */,
+#ifdef DEBUG_SDL  /* debug */
+  _sdl16_image_debug
+#else
+  NULL
+#endif
+};
+
+#define _SDL_UPDATE_PIXELS(EIM)                                 \
+  ((Soft16_Image *) EIM->cache_entry.src)->pixels = EIM->surface->pixels;
+
+#define RMASK565 0xf800
+#define GMASK565 0x07e0
+#define BMASK565 0x001f
+#define AMASK565 0x0000
+
+/* engine api this module provides */
+static void *
+evas_engine_sdl16_info(Evas *e __UNUSED__)
+{
+   Evas_Engine_Info_SDL_16      *info;
+   info = calloc(1, sizeof(Evas_Engine_Info_SDL_16));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   return info;
+}
+
+static void
+evas_engine_sdl16_info_free(Evas *e __UNUSED__, void *info)
+{
+   Evas_Engine_Info_SDL_16 *in;
+   in = (Evas_Engine_Info_SDL_16 *)info;
+   free(in);
+}
+
+static void
+_tmp_out_alloc(Render_Engine *re)
+{
+   Tilebuf_Rect *r;
+   int w = 0, h = 0;
+
+   EINA_INLIST_FOREACH(re->rects, r)
+     {
+       if (r->w > w) w = r->w;
+       if (r->h > h) h = r->h;
+     }
+
+   if (re->tmp_out)
+     {
+       if ((re->tmp_out->cache_entry.w < w) || (re->tmp_out->cache_entry.h < h))
+         {
+             evas_cache_image_drop(&re->tmp_out->cache_entry);
+            re->tmp_out = NULL;
+         }
+     }
+
+   if (!re->tmp_out)
+     {
+       Soft16_Image *im;
+
+        im = (Soft16_Image *) evas_cache_image_empty(evas_common_soft16_image_cache_get());
+        im->cache_entry.flags.alpha = 0;
+        evas_cache_image_surface_alloc(&im->cache_entry, w, h);
+
+       re->tmp_out = im;
+     }
+}
+
+static void*
+_sdl16_output_setup(int w, int h, int rotation, int fullscreen, int noframe, int hwsurface)
+{
+   Render_Engine       *re;
+   SDL_Surface          *surface;
+
+   re = calloc(1, sizeof(Render_Engine));
+   if (!re)
+     return NULL;
+   /* if we haven't initialized - init (automatic abort if already done) */
+   evas_common_cpu_init();
+   evas_common_blend_init();
+   evas_common_image_init();
+   evas_common_convert_init();
+   evas_common_scale_init();
+   evas_common_rectangle_init();
+   evas_common_gradient_init();
+   evas_common_polygon_init();
+   evas_common_line_init();
+   evas_common_font_init();
+   evas_common_draw_init();
+   evas_common_tilebuf_init();
+   evas_common_soft16_image_init();
+
+   if (w <= 0) w = 640;
+   if (h <= 0) h = 480;
+
+   re->cache = evas_cache_engine_image_init(&_sdl16_cache_engine_image_cb, evas_common_soft16_image_cache_get());
+   if (!re->cache)
+     {
+        ERR("Evas_Cache_Engine_Image allocation failed!");
+        free(re);
+        return NULL;
+     }
+
+   re->tb = evas_common_tilebuf_new(w, h);
+   /* in preliminary tests 16x16 gave highest framerates */
+   evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+   re->w = w;
+   re->h = h;
+   re->rot = rotation;
+   re->flags.hwsurface = hwsurface;
+   re->flags.fullscreen = fullscreen;
+   re->flags.noframe = noframe;
+   re->flags.end = 0;
+
+   re->update_rects_count = 0;
+   re->update_rects_limit = 0;
+   re->update_rects = NULL;
+
+   surface = SDL_SetVideoMode(w, h, 16,
+                              (hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE)
+                              | (fullscreen ? SDL_FULLSCREEN : 0)
+                              | (noframe ? SDL_NOFRAME : 0));
+   if (!surface)
+     {
+        ERR("SDL_SetVideoMode [ %i x %i x 16 ] failed", w, h);
+        evas_cache_engine_image_shutdown(re->cache);
+        free(re);
+        return NULL;
+     }
+
+   SDL_SetAlpha(surface, SDL_RLEACCEL, 0);
+   SDL_FillRect(surface, NULL, 0);
+
+   re->soft16_engine_image = (SDL_Engine_Image_Entry *) evas_cache_engine_image_engine(re->cache, surface);
+   if (!re->soft16_engine_image)
+     {
+        ERR("Soft16_Image allocation from SDL failed");
+        evas_cache_engine_image_shutdown(re->cache);
+        free(re);
+        return NULL;
+     }
+
+   return re;
+}
+
+
+static int
+evas_engine_sdl16_setup(Evas *e, void *in)
+{
+   Evas_Engine_Info_SDL_16      *info = (Evas_Engine_Info_SDL_16 *) in;
+
+   if (evas_output_method_get(e) != evas_render_method_lookup("software_16_sdl"))
+     return 0;
+
+   SDL_Init(SDL_INIT_NOPARACHUTE);
+
+   if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
+     {
+        ERR("SDL_Init failed with %s", SDL_GetError());
+        SDL_Quit();
+        return 0;
+     }
+
+   e->engine.data.output = _sdl16_output_setup(e->output.w, e->output.h,
+                                               info->info.rotation,
+                                               info->info.fullscreen,
+                                               info->info.noframe,
+                                               info->info.hwsurface);
+   if (!e->engine.data.output)
+     return 0;
+
+   e->engine.func = &func;
+   e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
+
+   return 1;
+}
+
+static void
+evas_engine_sdl16_output_free(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (re->tb) evas_common_tilebuf_free(re->tb);
+   if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+   if (re->tmp_out) evas_cache_image_drop(&re->tmp_out->cache_entry);
+   if (re->soft16_engine_image) evas_cache_engine_image_drop(&re->soft16_engine_image->cache_entry);
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+   evas_common_soft16_image_shutdown();
+}
+
+static void
+evas_engine_sdl16_output_resize(void *data, int w, int h)
+{
+   Render_Engine        *re = data;
+   SDL_Surface          *surface;
+
+   if ((re->w == w) && (re->h == h)) return;
+
+   evas_cache_engine_image_drop(&re->soft16_engine_image->cache_entry);
+
+   evas_common_tilebuf_free(re->tb);
+   re->w = w;
+   re->h = h;
+   re->tb = evas_common_tilebuf_new(w, h);
+   if (re->tb)
+     evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+
+   surface = SDL_SetVideoMode(w, h, 16,
+                              (re->flags.hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE)
+                              | (re->flags.fullscreen ? SDL_FULLSCREEN : 0)
+                              | (re->flags.noframe ? SDL_NOFRAME : 0));
+   if (!surface)
+     {
+        ERR("Unable to change the resolution to : %ix%i", w, h);
+        exit(-1);
+     }
+   re->soft16_engine_image = (SDL_Engine_Image_Entry *) evas_cache_engine_image_engine(re->cache, surface);
+   if (!re->soft16_engine_image)
+     {
+       ERR("RGBA_Image allocation from SDL failed");
+       exit(-1);
+     }
+
+   SDL_FillRect(surface, NULL, 0);
+
+   if (re->tmp_out)
+     {
+        evas_cache_image_drop(&re->tmp_out->cache_entry);
+       re->tmp_out = NULL;
+     }
+}
+
+static void
+evas_engine_sdl16_output_tile_size_set(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_set_tile_size(re->tb, w, h);
+}
+
+static void
+evas_engine_sdl16_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
+}
+
+static void
+evas_engine_sdl16_output_redraws_rect_del(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
+}
+
+static void
+evas_engine_sdl16_output_redraws_clear(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_clear(re->tb);
+}
+
+static void *
+evas_engine_sdl16_output_redraws_next_update_get(void *data,
+                                                 int *x, int *y, int *w, int *h,
+                                                 int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine        *re = data;
+   Tilebuf_Rect         *tb_rect;
+   SDL_Rect              rect;
+
+   if (re->flags.end)
+     {
+       re->flags.end = 0;
+       return NULL;
+     }
+   if (!re->rects)
+     {
+       re->rects = evas_common_tilebuf_get_render_rects(re->tb);
+       re->cur_rect = re->rects;
+       if (re->rot != 0) _tmp_out_alloc(re); /* grows if required */
+     }
+   if (!re->cur_rect)
+     {
+       if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       return NULL;
+     }
+
+   tb_rect = re->cur_rect;
+   *cx = *x = tb_rect->x;
+   *cy = *y = tb_rect->y;
+   *cw = *w = tb_rect->w;
+   *ch = *h = tb_rect->h;
+   re->cur_rect = (Tilebuf_Rect *)((EINA_INLIST_GET(re->cur_rect))->next);
+   if (!re->cur_rect)
+     {
+        evas_common_tilebuf_free_render_rects(re->rects);
+        re->rects = NULL;
+        re->flags.end = 1;
+     }
+
+   if (re->rot != 0)
+     {
+        *cx = 0;
+        *cy = 0;
+     }
+
+   rect.x = *x;
+   rect.y = *y;
+   rect.w = *w;
+   rect.h = *h;
+
+   /* Return the "fake" surface so it is passed to the drawing routines. */
+   return re->soft16_engine_image;
+}
+
+static void
+_blit_rot_90(Soft16_Image *dst, const Soft16_Image *src,
+            int out_x, int out_y, int w, int h)
+{
+   DATA16 *dp, *sp;
+   int x, y;
+
+   sp = src->pixels;
+   dp = dst->pixels + (out_x +
+                      (w + out_y - 1) * dst->stride);
+
+   for (y = 0; y < h; y++)
+     {
+       DATA16 *dp_itr, *sp_itr;
+
+       sp_itr = sp;
+       dp_itr = dp;
+
+       for (x = 0; x < w; x++)
+         {
+            *dp_itr = *sp_itr;
+
+            sp_itr++;
+            dp_itr -= dst->stride;
+         }
+       sp += src->stride;
+       dp++;
+     }
+}
+
+static void
+_blit_rot_180(Soft16_Image *dst, const Soft16_Image *src,
+             int out_x, int out_y, int w, int h)
+{
+   DATA16 *dp, *sp;
+   int x, y;
+
+   sp = src->pixels;
+   dp = dst->pixels + ((w + out_x - 1) +
+                      (h + out_y - 1) * dst->stride);
+
+   for (y = 0; y < h; y++)
+     {
+       DATA16 *dp_itr, *sp_itr;
+
+       sp_itr = sp;
+       dp_itr = dp;
+
+       for (x = 0; x < w; x++)
+         {
+            *dp_itr = *sp_itr;
+
+            sp_itr++;
+            dp_itr--;
+         }
+       sp += src->stride;
+       dp -= dst->stride;
+     }
+}
+
+static void
+_blit_rot_270(Soft16_Image *dst, const Soft16_Image *src,
+             int out_x, int out_y, int w, int h)
+{
+   DATA16 *dp, *sp;
+   int x, y;
+
+   sp = src->pixels;
+   dp = dst->pixels + ((h + out_x - 1) +
+                      out_y * dst->stride);
+
+   for (y = 0; y < h; y++)
+     {
+       DATA16 *dp_itr, *sp_itr;
+
+       sp_itr = sp;
+       dp_itr = dp;
+
+       for (x = 0; x < w; x++)
+         {
+            *dp_itr = *sp_itr;
+
+            sp_itr++;
+            dp_itr += dst->stride;
+         }
+       sp += src->stride;
+       dp--;
+     }
+}
+
+static void
+_tmp_out_process(Render_Engine *re, int out_x, int out_y, int w, int h)
+{
+   Soft16_Image *d, *s;
+   DATA16 *dp, *sp;
+   int y, x, d_dir;
+
+   d = (Soft16_Image *) re->soft16_engine_image->cache_entry.src;
+   s = re->tmp_out;
+
+   if ((w < 1) || (h < 1)
+       || (out_x >= d->cache_entry.w) || (out_y >= d->cache_entry.h))
+     return;
+
+   if (re->rot == 90)
+     _blit_rot_90(d, s, out_x, out_y, w, h);
+   else if (re->rot == 180)
+     _blit_rot_180(d, s, out_x, out_y, w, h);
+   else if (re->rot == 270)
+     _blit_rot_270(d, s, out_x, out_y, w, h);
+}
+
+static void
+evas_engine_sdl16_output_redraws_next_update_push(void *data, void *surface __UNUSED__,
+                                                  int x, int y, int w, int h)
+{
+   Render_Engine        *re = data;
+   SDL_Rect              rect;
+
+   if (re->update_rects_count + 1 > re->update_rects_limit)
+     {
+        re->update_rects_limit += 8;
+        re->update_rects = realloc(re->update_rects, sizeof (SDL_Rect) * re->update_rects_limit);
+     }
+
+   rect.x = x;
+   rect.y = y;
+   rect.w = w;
+   rect.h = h;
+
+   switch (re->rot)
+     {
+      case 0:
+         break;
+      case 90:
+         rect.x = y;
+         rect.y = re->w - w - x;
+         rect.w = h;
+         rect.h = w;
+         break;
+      case 180:
+         rect.x = re->w - w - x;
+         rect.y = re->h - h - y;
+         break;
+      case 270:
+         rect.x = re->h - h - y;
+         rect.y = x;
+         rect.w = h;
+         rect.h = w;
+         break;
+      default:
+         abort();
+     }
+
+   re->update_rects[re->update_rects_count] = rect;
+
+   if (re->rot != 0)
+     _tmp_out_process(re, rect.x, rect.y, w, h);
+
+   ++re->update_rects_count;
+}
+
+static void
+evas_engine_sdl16_output_flush(void *data)
+{
+   Render_Engine        *re = data;
+
+   if (re->update_rects_count > 0)
+     SDL_UpdateRects(re->soft16_engine_image->surface, re->update_rects_count, re->update_rects);
+
+   re->update_rects_count = 0;
+}
+
+static void
+evas_engine_sdl16_output_idle_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (re->tmp_out)
+     {
+       evas_cache_image_drop(&re->tmp_out->cache_entry);
+       re->tmp_out = NULL;
+     }
+}
+
+static void*
+evas_engine_sdl16_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
+{
+   Render_Engine*      re = (Render_Engine*) data;;
+
+   *error = 0;
+   return evas_cache_engine_image_request(re->cache, file, key, lo, NULL, error);
+}
+
+static int
+evas_engine_sdl16_image_alpha_get(void *data __UNUSED__, void *image)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+   Soft16_Image                 *im;
+
+   if (!eim) return 1;
+   im = (Soft16_Image *) eim->cache_entry.src;
+   if (im->cache_entry.flags.alpha) return 1;
+   return 0;
+}
+
+static void
+evas_engine_sdl16_image_size_get(void *data __UNUSED__, void *image, int *w, int *h)
+{
+   SDL_Engine_Image_Entry       *eim;
+
+   eim = image;
+   if (w) *w = eim->cache_entry.w;
+   if (h) *h = eim->cache_entry.h;
+}
+
+static int
+evas_engine_sdl16_image_colorspace_get(void *data __UNUSED__, void *image __UNUSED__)
+{
+   return EVAS_COLORSPACE_RGB565_A5P;
+}
+
+static void
+evas_engine_sdl16_image_colorspace_set(void *data __UNUSED__, void *image __UNUSED__, int cspace __UNUSED__)
+{
+   /* FIXME: Not implemented. */
+}
+
+static void*
+evas_engine_sdl16_image_new_from_copied_data(void *data,
+                                             int w, int h,
+                                             DATA32* image_data,
+                                             int alpha, int cspace)
+{
+   Render_Engine       *re = data;
+
+   if (cspace != EVAS_COLORSPACE_RGB565_A5P)
+     {
+        WRN("Unsupported colorspace %d in %s() (%s:%d)",
+                cspace, __FUNCTION__, __FILE__, __LINE__);
+        return NULL;
+     }
+
+   WRN("s image_data: %p", image_data);
+
+   return evas_cache_engine_image_copied_data(re->cache,
+                                              w, h,
+                                              image_data,
+                                              alpha, cspace, NULL);
+}
+
+static void*
+evas_engine_sdl16_image_new_from_data(void *data, int w, int h, DATA32* image_data, int alpha, int cspace)
+{
+   Render_Engine       *re = data;
+
+   if (cspace != EVAS_COLORSPACE_RGB565_A5P)
+     {
+        WRN("Unsupported colorspace %d in %s() (%s:%d)",
+                cspace, __FUNCTION__, __FILE__, __LINE__);
+        return NULL;
+     }
+
+   return evas_cache_engine_image_data(re->cache,
+                                       w, h,
+                                       image_data,
+                                       alpha, cspace, NULL);
+}
+
+static void
+evas_engine_sdl16_image_free(void *data __UNUSED__, void *image)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+
+   evas_cache_engine_image_drop(&eim->cache_entry);
+}
+
+static void*
+evas_engine_sdl16_image_size_set(void *data __UNUSED__, void *image, int w, int h)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+
+   return evas_cache_engine_image_size_set(&eim->cache_entry, w, h);
+}
+
+static void*
+evas_engine_sdl16_image_dirty_region(void *data __UNUSED__,
+                                     void *image,
+                                     int x, int y, int w, int h)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+
+   return evas_cache_engine_image_dirty(&eim->cache_entry, x, y, w, h);
+}
+
+static void*
+evas_engine_sdl16_image_data_get(void *data __UNUSED__, void *image,
+                                 int to_write, DATA32** image_data)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+   Soft16_Image                 *im;
+
+   if (!eim)
+     {
+        *image_data = NULL;
+        return NULL;
+     }
+   im = (Soft16_Image *) eim->cache_entry.src;
+   evas_cache_image_load_data(&im->cache_entry);
+
+   if (to_write)
+     eim = (SDL_Engine_Image_Entry *) evas_cache_engine_image_alone(&eim->cache_entry,
+                                                                    NULL);
+
+   /* FIXME: Handle colorspace convertion correctly. */
+   if (image_data) *image_data = (DATA32 *) im->pixels;
+
+   return eim;
+}
+
+static void*
+evas_engine_sdl16_image_data_put(void *data, void *image, DATA32* image_data)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+   SDL_Engine_Image_Entry       *eim_new;
+   Render_Engine                *re = data;
+   Soft16_Image                 *im;
+
+   if (!eim) return NULL;
+   im = (Soft16_Image *) eim->cache_entry.src;
+
+   /* FIXME: Handle colorspace convertion correctly. */
+   if ((DATA16 *) image_data == im->pixels) return eim;
+
+   eim_new = (SDL_Engine_Image_Entry *) evas_cache_engine_image_data(re->cache,
+                                                                     eim->cache_entry.w, eim->cache_entry.h,
+                                                                     image_data,
+                                                                     func.image_alpha_get(data, eim),
+                                                                     func.image_colorspace_get(data, eim),
+                                                                     NULL);
+   evas_cache_engine_image_drop(&eim->cache_entry);
+
+   return eim_new;
+}
+
+static void
+evas_engine_sdl16_image_data_preload_request(void *data __UNUSED__, void *image, const void *target)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+   Soft16_Image                 *im;
+
+   if (!eim) return ;
+   im = (Soft16_Image *) eim->cache_entry.src;
+   if (!im) return ;
+   evas_cache_image_preload_data(&im->cache_entry, target);
+}
+
+static void
+evas_engine_sdl16_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+   Soft16_Image                 *im;
+
+   if (!eim) return ;
+   im = (Soft16_Image *) eim->cache_entry.src;
+   if (!im) return ;
+   evas_cache_image_preload_cancel(&im->cache_entry, target);
+}
+
+static void*
+evas_engine_sdl16_image_alpha_set(void *data __UNUSED__, void *image, int has_alpha)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+   Soft16_Image                 *im;
+
+   if (!eim) return NULL;
+
+   im = (Soft16_Image *) eim->cache_entry.src;
+
+   if (im->cache_entry.flags.alpha == has_alpha) return eim;
+
+   eim = (SDL_Engine_Image_Entry *) evas_cache_engine_image_alone(&eim->cache_entry,
+                                                                  NULL);
+
+   im = (Soft16_Image *) eim->cache_entry.src;
+
+   im->cache_entry.flags.alpha = has_alpha;
+   eim = (SDL_Engine_Image_Entry *) evas_cache_engine_image_dirty(&eim->cache_entry, 0, 0, eim->cache_entry.w, eim->cache_entry.h);
+
+   return eim;
+}
+
+static void*
+evas_engine_sdl16_image_border_set(void *data __UNUSED__, void *image, int l __UNUSED__, int r __UNUSED__, int t __UNUSED__, int b __UNUSED__)
+{
+   return image;
+}
+
+static void
+evas_engine_sdl16_image_border_get(void *data __UNUSED__, void *image __UNUSED__, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__)
+{
+   /* FIXME: need to know what evas expect from this call */
+}
+
+static void
+evas_engine_sdl16_image_draw(void *data __UNUSED__, void *context, void *surface, void *image,
+                             int src_region_x, int src_region_y, int src_region_w, int src_region_h,
+                             int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h,
+                             int smooth)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+   SDL_Engine_Image_Entry       *dst = surface;
+   int                           mustlock_im = 0;
+   int                           mustlock_dst = 0;
+
+   evas_cache_engine_image_load_data(&eim->cache_entry);
+
+   /* Fallback to software method */
+   if (SDL_MUSTLOCK(dst->surface))
+     {
+        mustlock_dst = 1;
+       SDL_LockSurface(dst->surface);
+       _SDL_UPDATE_PIXELS(dst);
+     }
+
+   if (eim->surface && SDL_MUSTLOCK(eim->surface))
+     {
+        mustlock_im = 1;
+       SDL_LockSurface(eim->surface);
+       _SDL_UPDATE_PIXELS(eim);
+     }
+
+   soft16_image_draw((Soft16_Image *) eim->cache_entry.src,
+                     (Soft16_Image *) dst->cache_entry.src,
+                     context,
+                     src_region_x, src_region_y, src_region_w, src_region_h,
+                     dst_region_x, dst_region_y, dst_region_w, dst_region_h,
+                     smooth);
+
+   if (mustlock_im)
+     SDL_UnlockSurface(eim->surface);
+
+   if (mustlock_dst)
+     SDL_UnlockSurface(dst->surface);
+}
+
+static void
+evas_engine_sdl16_image_map4_draw(void *data __UNUSED__, void *context, void *surface, void *image, RGBA_Map_Point *p, int smooth, int level)
+{
+}
+
+static void
+evas_engine_sdl16_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static int
+evas_engine_sdl16_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+
+static void
+evas_engine_sdl16_image_cache_flush(void *data)
+{
+   Render_Engine        *re = (Render_Engine*) data;
+   int                   size;
+
+   size = evas_cache_engine_image_get(re->cache);
+   evas_cache_engine_image_set(re->cache, 0);
+   evas_cache_engine_image_set(re->cache, size);
+}
+
+static void
+evas_engine_sdl16_image_cache_set(void *data, int bytes)
+{
+   Render_Engine        *re = (Render_Engine*) data;
+
+   evas_cache_engine_image_set(re->cache, bytes);
+}
+
+static int
+evas_engine_sdl16_image_cache_get(void *data)
+{
+   Render_Engine        *re = (Render_Engine*) data;
+
+   return evas_cache_engine_image_get(re->cache);
+}
+
+static char*
+evas_engine_sdl16_image_comment_get(void *data __UNUSED__, void *image __UNUSED__, char *key __UNUSED__)
+{
+   return NULL;
+}
+
+static char*
+evas_engine_sdl16_image_format_get(void *data __UNUSED__, void *image __UNUSED__)
+{
+   /* FIXME: need to know what evas expect from this call */
+   return NULL;
+}
+
+static void
+evas_engine_sdl16_font_draw(void *data __UNUSED__, void *context, void *surface, void *font, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, const char *text)
+{
+   static RGBA_Image            *im = NULL;
+   SDL_Engine_Image_Entry       *eim = surface;
+   Soft16_Image                 *dst = (Soft16_Image *) eim->cache_entry.src;
+   int                           mustlock_im = 0;
+
+   if (!im)
+     im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get());
+   evas_cache_image_surface_alloc(&im->cache_entry, dst->cache_entry.w, dst->cache_entry.h);
+
+   if (eim->surface && SDL_MUSTLOCK(eim->surface))
+     {
+        mustlock_im = 1;
+       SDL_LockSurface(eim->surface);
+       _SDL_UPDATE_PIXELS(eim);
+     }
+   evas_common_draw_context_font_ext_set(context,
+                                         dst,
+                                         soft16_font_glyph_new,
+                                         soft16_font_glyph_free,
+                                         soft16_font_glyph_draw);
+   evas_common_font_draw(im, context, font, x, y, text);
+   evas_common_draw_context_font_ext_set(context,
+                                         NULL,
+                                         NULL,
+                                         NULL,
+                                         NULL);
+
+   if (mustlock_im)
+     SDL_UnlockSurface(eim->surface);
+}
+
+static void
+evas_engine_sdl16_line_draw(void *data __UNUSED__, void *context, void *surface, int x1, int y1, int x2, int y2)
+{
+   SDL_Engine_Image_Entry       *eim = surface;
+   int                           mustlock_im = 0;
+
+   if (eim->surface && SDL_MUSTLOCK(eim->surface))
+     {
+        mustlock_im = 1;
+       SDL_LockSurface(eim->surface);
+       _SDL_UPDATE_PIXELS(eim);
+     }
+
+   soft16_line_draw((Soft16_Image *) eim->cache_entry.src,
+                    context,
+                    x1, y1, x2, y2);
+
+   if (mustlock_im)
+     SDL_UnlockSurface(eim->surface);
+}
+
+static void
+evas_engine_sdl16_rectangle_draw(void *data __UNUSED__, void *context, void *surface, int x, int y, int w, int h)
+{
+   SDL_Engine_Image_Entry       *eim = surface;
+#if ENGINE_SDL_PRIMITIVE
+   RGBA_Draw_Context            *dc = context;
+#endif
+   Soft16_Image                 *im;
+   int                           mustlock_im = 0;
+
+#if ENGINE_SDL_PRIMITIVE
+   if (A_VAL(&dc->col.col) != 0x00)
+     {
+        if (A_VAL(&dc->col.col) != 0xFF)
+          {
+#endif
+             if (eim->surface && SDL_MUSTLOCK(eim->surface))
+               {
+                  mustlock_im = 1;
+                  SDL_LockSurface(eim->surface);
+                  _SDL_UPDATE_PIXELS(eim);
+               }
+
+             im = (Soft16_Image *) eim->cache_entry.src;
+
+             soft16_rectangle_draw(im, context, x, y, w, h);
+
+             if (mustlock_im)
+               SDL_UnlockSurface(eim->surface);
+#if ENGINE_SDL_PRIMITIVE
+          }
+        else
+          {
+             SDL_Rect        dstrect;
+
+             if (dc->clip.use)
+               {
+                  SDL_Rect   cliprect;
+
+                  cliprect.x = dc->clip.x;
+                  cliprect.y = dc->clip.y;
+                  cliprect.w = dc->clip.w;
+                  cliprect.h = dc->clip.h;
+
+                  SDL_SetClipRect(eim->surface, &cliprect);
+               }
+
+             dstrect.x = x;
+             dstrect.y = y;
+             dstrect.w = w;
+             dstrect.h = h;
+
+             SDL_FillRect(eim->surface, &dstrect, SDL_MapRGBA(eim->surface->format, R_VAL(&dc->col.col), G_VAL(&dc->col.col), B_VAL(&dc->col.col), 0xFF));
+
+             if (dc->clip.use)
+               SDL_SetClipRect(eim->surface, NULL);
+          }
+     }
+#endif
+}
+
+static void
+evas_engine_sdl16_polygon_draw(void *data __UNUSED__, void *context, void *surface, void *polygon, int x, int y)
+{
+   SDL_Engine_Image_Entry       *eim = surface;
+   int                           mustlock_im = 0;
+
+   if (eim->surface && SDL_MUSTLOCK(eim->surface))
+     {
+        mustlock_im = 1;
+       SDL_LockSurface(eim->surface);
+       _SDL_UPDATE_PIXELS(eim);
+     }
+
+   soft16_polygon_draw((Soft16_Image *) eim->cache_entry.src, context, polygon, x, y);
+
+   if (mustlock_im)
+     SDL_UnlockSurface(eim->surface);
+}
+
+static void
+evas_engine_sdl16_image_stride_get(void *data __UNUSED__, void *image, int *stride)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+
+   if (stride) *stride = 0;
+   if (!image) return;
+   if (stride) *stride = ((Soft16_Image*) eim->cache_entry.src)->stride;
+}
+
+static Eina_Bool
+evas_engine_sdl16_canvas_alpha_get(void *data, void *context)
+{
+   return EINA_FALSE;
+}
+
+/* module advertising code */
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_16")) return 0;
+   _evas_engine_soft16_sdl_log_dom = eina_log_domain_register("EvasSoft16SDL",EVAS_DEFAULT_LOG_COLOR);
+   if(_evas_engine_soft16_sdl_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the Soft16_SDL engine.\n");
+       return 0;
+     }
+
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+#define ORD(f) EVAS_API_OVERRIDE(f, &func, evas_engine_sdl16_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(canvas_alpha_get);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   ORD(image_load);
+   ORD(image_alpha_get);
+   ORD(image_size_get);
+   ORD(image_colorspace_get);
+   ORD(image_colorspace_set);
+   ORD(image_new_from_copied_data);
+   ORD(image_new_from_data);
+   ORD(image_free);
+   ORD(image_size_set);
+   ORD(image_dirty_region);
+   ORD(image_data_get);
+   ORD(image_data_put);
+   ORD(image_data_preload_request);
+   ORD(image_data_preload_cancel);
+   ORD(image_alpha_set);
+   ORD(image_border_set);
+   ORD(image_border_get);
+   ORD(image_draw);
+   ORD(image_map4_draw);
+   ORD(image_cache_flush);
+   ORD(image_cache_set);
+   ORD(image_cache_get);
+   ORD(image_comment_get);
+   ORD(image_format_get);
+   ORD(image_stride_get);
+   ORD(font_draw);
+   ORD(line_draw);
+   ORD(rectangle_draw);
+   ORD(polygon_draw);
+   
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+   
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+  eina_log_domain_unregister(_evas_engine_soft16_sdl_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "software_16_sdl",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_16_sdl);
+
+#ifndef EVAS_STATIC_BUILD_SOFTWARE_SDL
+EVAS_EINA_MODULE_DEFINE(engine, software_16_sdl);
+#endif
+
+static Engine_Image_Entry*
+_sdl16_image_alloc(void)
+{
+   SDL_Engine_Image_Entry       *new;
+
+   new = calloc(1, sizeof (SDL_Engine_Image_Entry));
+
+   return (Engine_Image_Entry *) new;
+}
+
+static void
+_sdl16_image_delete(Engine_Image_Entry *eim)
+{
+   free(eim);
+}
+
+static int
+_sdl16_image_constructor(Engine_Image_Entry *ie, void* data __UNUSED__)
+{
+   SDL_Surface                  *sdl = NULL;
+   SDL_Engine_Image_Entry       *eim = (SDL_Engine_Image_Entry *) ie;
+   Soft16_Image                 *im;
+
+   im = (Soft16_Image *) ie->src;
+
+   if (im->pixels)
+     {
+        /* FIXME: Take care of CSPACE */
+        sdl = SDL_CreateRGBSurfaceFrom(im->pixels,
+                                       ie->w, ie->h,
+                                       16, ie->w * 2,
+                                       RMASK565, GMASK565, BMASK565, AMASK565);
+        eim->surface = sdl;
+        eim->flags.engine_surface = 0;
+     }
+
+   return EVAS_LOAD_ERROR_NONE;
+}
+
+static void
+_sdl16_image_destructor(Engine_Image_Entry *eim)
+{
+   SDL_Engine_Image_Entry       *seie = (SDL_Engine_Image_Entry *) eim;
+
+   if (seie->surface && !seie->flags.engine_surface)
+     SDL_FreeSurface(seie->surface);
+   seie->surface = NULL;
+}
+
+static void
+_sdl16_image_dirty_region(Engine_Image_Entry *eim, int x, int y, int w, int h)
+{
+   SDL_Engine_Image_Entry       *dst;
+   RGBA_Image *im;
+
+   dst = (SDL_Engine_Image_Entry *) eim;
+
+   SDL_UpdateRect(dst->surface, x, y, w, h);
+
+   im = (RGBA_Image *)eim->src;
+   im->flags |= RGBA_IMAGE_IS_DIRTY;
+}
+
+static int
+_sdl16_image_dirty(Engine_Image_Entry *dst, const Engine_Image_Entry *src __UNUSED__)
+{
+   SDL_Engine_Image_Entry       *eim = (SDL_Engine_Image_Entry *) dst;
+   SDL_Surface                  *sdl = NULL;
+   Soft16_Image                 *im;
+
+   im = (Soft16_Image *) dst->src;
+
+   /* FIXME: Take care of CSPACE */
+   sdl = SDL_CreateRGBSurfaceFrom(im->pixels,
+                                  dst->w, dst->h,
+                                  16, dst->w * 2,
+                                  RMASK565, GMASK565, BMASK565, AMASK565);
+   eim->surface = sdl;
+   eim->flags.engine_surface = 0;
+
+   return 0;
+}
+
+static int
+_sdl16_image_size_set(Engine_Image_Entry *dst, const Engine_Image_Entry *src __UNUSED__)
+{
+   SDL_Engine_Image_Entry       *eim = (SDL_Engine_Image_Entry *) dst;
+   SDL_Surface                  *sdl;
+   Soft16_Image                 *im;
+
+   im = (Soft16_Image *) dst->src;
+
+   /* FIXME: handle im == NULL */
+   sdl = SDL_CreateRGBSurfaceFrom(im->pixels,
+                                  dst->w, dst->h,
+                                  16, dst->w * 2,
+                                  RMASK565, GMASK565, BMASK565, AMASK565);
+
+   eim->surface = sdl;
+
+   return 0;
+}
+
+static int
+_sdl16_image_update_data(Engine_Image_Entry* dst, void* engine_data)
+{
+   SDL_Engine_Image_Entry       *eim = (SDL_Engine_Image_Entry *) dst;
+   SDL_Surface                  *sdl = NULL;
+   Soft16_Image                 *im;
+
+   im = (Soft16_Image *) dst->src;
+
+   if (engine_data)
+     {
+        sdl = engine_data;
+
+        if (im)
+          {
+             im->pixels = sdl->pixels;
+             im->stride = sdl->pitch / 2;
+             im->flags.free_pixels = 0;
+/*              im->alpha = calloc(1, sizeof (DATA8) * _calc_stride(sdl->w) * sdl->h); */
+/*              im->flags.free_alpha = 0; */
+/*              im->flags.have_alpha = 1; */
+             im->alpha = NULL;
+             im->flags.free_alpha = 0;
+             im->cache_entry.flags.alpha = 0;
+
+             dst->src->w = sdl->w;
+             dst->src->h = sdl->h;
+          }
+        dst->w = sdl->w;
+        dst->h = sdl->h;
+     }
+   else
+     {
+        SDL_FreeSurface(eim->surface);
+        /* FIXME: Take care of CSPACE */
+        sdl = SDL_CreateRGBSurfaceFrom(im->pixels,
+                                       dst->w, dst->h,
+                                       16, dst->w * 2,
+                                       RMASK565, GMASK565, BMASK565, AMASK565);
+     }
+
+   eim->surface = sdl;
+
+   return 0;
+}
+
+static void
+_sdl16_image_load(Engine_Image_Entry *eim, const Image_Entry* ie_im)
+{
+   SDL_Engine_Image_Entry       *load = (SDL_Engine_Image_Entry *) eim;
+   SDL_Surface                  *sdl;
+
+   if (!load->surface)
+     {
+        Soft16_Image            *im;
+
+        im = (Soft16_Image *) ie_im;
+
+        sdl = SDL_CreateRGBSurfaceFrom(im->pixels,
+                                       eim->w, eim->h,
+                                       16, eim->w * 2,
+                                       RMASK565, GMASK565, BMASK565, AMASK565);
+        load->surface = sdl;
+     }
+}
+
+static int
+_sdl16_image_mem_size_get(Engine_Image_Entry *eim)
+{
+   SDL_Engine_Image_Entry       *seie = (SDL_Engine_Image_Entry *) eim;
+   int                           size = 0;
+
+   /* FIXME: Count surface size. */
+   if (seie->surface)
+     size = sizeof (SDL_Surface) + sizeof (SDL_PixelFormat);
+
+   return size;
+}
+
+#ifdef DEBUG_SDL
+static void
+_sdl16_image_debug(const char* context, Engine_Image_Entry* im)
+{
+}
+#endif
diff --git a/src/modules/engines/software_16_sdl/evas_engine.h b/src/modules/engines/software_16_sdl/evas_engine.h
new file mode 100644 (file)
index 0000000..a1b0ee0
--- /dev/null
@@ -0,0 +1,79 @@
+#ifndef EVAS_ENGINE_SDL_16_H
+#define EVAS_ENGINE_SDL_16_H
+
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_common_soft16.h"
+#include "Evas_Engine_SDL_16.h"
+extern int _evas_engine_soft16_sdl_log_dom ;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_soft16_sdl_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_soft16_sdl_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_soft16_sdl_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_soft16_sdl_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_soft16_sdl_log_dom, __VA_ARGS__)
+
+typedef struct _SDL_Engine_Image_Entry SDL_Engine_Image_Entry;
+struct _SDL_Engine_Image_Entry
+{
+  Engine_Image_Entry     cache_entry;
+
+  SDL_Surface           *surface;
+
+  struct
+  {
+    unsigned int         engine_surface : 1;
+  } flags;
+};
+
+
+typedef struct _Render_Engine Render_Engine;
+struct _Render_Engine
+{
+  SDL_Engine_Image_Entry        *soft16_engine_image;
+
+  Evas_Cache_Engine_Image       *cache;
+
+  Soft16_Image                  *tmp_out;
+
+  int                            w;
+  int                            h;
+  int                            rot;
+
+  Tilebuf                       *tb;
+  Tilebuf_Rect                  *rects;
+  Tilebuf_Rect                  *cur_rect;
+
+  SDL_Rect                      *update_rects;
+  int                            update_rects_count;
+  int                            update_rects_limit;
+
+  struct
+  {
+    unsigned int                 fullscreen : 1;
+    unsigned int                 noframe : 1;
+    unsigned int                 alpha : 1;
+    unsigned int                 hwsurface : 1;
+    unsigned int                 end : 1;
+  } flags;
+};
+
+#endif
diff --git a/src/modules/engines/software_16_wince/.cvsignore b/src/modules/engines/software_16_wince/.cvsignore
new file mode 100644 (file)
index 0000000..9730646
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.la
+*.lo
diff --git a/src/modules/engines/software_16_wince/Evas_Engine_Software_16_WinCE.h b/src/modules/engines/software_16_wince/Evas_Engine_Software_16_WinCE.h
new file mode 100644 (file)
index 0000000..d9d45a5
--- /dev/null
@@ -0,0 +1,32 @@
+#ifndef __EVAS_ENGINE_SOFTWARE_16_WINCE_H__
+#define __EVAS_ENGINE_SOFTWARE_16_WINCE_H__
+
+
+#include <windows.h>
+
+
+typedef struct _Evas_Engine_Info_Software_16_WinCE Evas_Engine_Info_Software_16_WinCE;
+
+struct _Evas_Engine_Info_Software_16_WinCE
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   struct {
+      HWND         window;
+      int          width;
+      int          height;
+      int          backend; /* 0: auto, 1: raw, 2: gapi, 3: ddraw, 4: gdi */
+      int          rotation;
+      unsigned int fullscreen : 1;
+   } info;
+   /* engine specific function calls to query stuff about messages */
+   struct {
+      int   (*suspend) (int backend);
+      int   (*resume)  (int backend);
+   } func;
+};
+
+
+#endif /* __EVAS_ENGINE_SOFTWARE_16_WINCE_H__ */
diff --git a/src/modules/engines/software_16_wince/Makefile.am b/src/modules/engines/software_16_wince/Makefile.am
new file mode 100644 (file)
index 0000000..8c7d780
--- /dev/null
@@ -0,0 +1,50 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines \
+-I$(top_srcdir)/src/modules/engines/software_16 \
+@EINA_CFLAGS@ \
+@FREETYPE_CFLAGS@ \
+@evas_engine_software_16_wince_cflags@
+
+if BUILD_ENGINE_SOFTWARE_16_WINCE
+
+SOFTWARE_16_WINCE_SOURCE = \
+evas_engine.c \
+evas_wince_ddraw_buffer.cpp \
+evas_wince_fb_buffer.c \
+evas_wince_gapi_buffer.c \
+evas_wince_gdi_buffer.c
+
+SOFTWARE_16_WINCE_LIBADD = @evas_engine_software_16_wince_libs@
+
+pkgdir = $(libdir)/evas/modules/engines/software_16_wince/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_Software_16_WinCE.h
+
+if !EVAS_STATIC_BUILD_SOFTWARE_16_WINCE
+
+pkg_LTLIBRARIES        = module.la
+
+module_la_SOURCES = $(SOFTWARE_16_WINCE_SOURCE)
+module_la_CFLAGS = @WIN32_CFLAGS@
+module_la_CXXFLAGS = -fno-rtti -fno-exceptions
+module_la_LIBADD = @EINA_LIBS@ $(top_builddir)/src/lib/libevas.la $(SOFTWARE_16_WINCE_LIBADD)
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_software_16_wince.la
+
+libevas_engine_software_16_wince_la_SOURCES = $(SOFTWARE_16_WINCE_SOURCE)
+libevas_engine_software_16_wince_la_LIBADD = $(SOFTWARE_16_WINCE_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/software_16_wince/evas_engine.c b/src/modules/engines/software_16_wince/evas_engine.c
new file mode 100644 (file)
index 0000000..886fa0f
--- /dev/null
@@ -0,0 +1,770 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_Software_16_WinCE.h"
+#include "evas_common_soft16.h"
+
+int _evas_engine_soft16_wince_log_dom = -1;
+
+typedef enum
+{
+  EVAS_ENGINE_WINCE_FB,
+  EVAS_ENGINE_WINCE_GAPI,
+  EVAS_ENGINE_WINCE_DDRAW,
+  EVAS_ENGINE_WINCE_GDI
+} Evas_Engine_WinCE_Backend;
+
+
+/* function tables - filled in later (func and parent func) */
+static Evas_Func func, pfunc;
+
+/* engine struct data */
+typedef struct _Render_Engine Render_Engine;
+
+struct _Render_Engine
+{
+   Evas_Engine_WinCE_Backend backend; /* 1: raw, 2: gapi, 3: ddraw, 4: GDI */
+   void               *backend_priv;
+   void              (*backend_shutdown)(void *priv);
+   FB_Output_Buffer *(*backend_output_buffer_new)(void *priv,
+                                                  int width,
+                                                  int height);
+   void              (*backend_output_buffer_free)(FB_Output_Buffer *fbob);
+   void              (*backend_output_buffer_paste)(FB_Output_Buffer *fbob);
+   void              (*backend_surface_resize)(FB_Output_Buffer *fbob);
+
+   int               width;
+   int               height;
+   int               rotation;
+   Tilebuf          *tb;
+   Tilebuf_Rect     *rects;
+   Tilebuf_Rect     *cur_rect;
+   FB_Output_Buffer *fbob;
+   Soft16_Image     *tmp_out; /* used by indirect render, like rotation */
+   HRGN              clip_rects;
+   unsigned char     end : 1;
+};
+
+/* prototypes we will use here */
+
+static void *eng_info(Evas *e);
+static void eng_info_free(Evas *e, void *info);
+static int eng_setup(Evas *e, void *info);
+static void eng_output_free(void *data);
+static void eng_output_resize(void *data, int w, int h);
+static void eng_output_tile_size_set(void *data, int w, int h);
+static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_clear(void *data);
+static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
+static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
+static void eng_output_flush(void *data);
+static void eng_output_idle_flush(void *data);
+
+static int
+_suspend(int backend)
+{
+   switch (backend)
+     {
+      case 2: /* gapi */
+         return evas_software_wince_gapi_suspend();
+      default: /* other engines do not need it */
+         return 0;
+     }
+}
+
+static int
+_resume(int backend)
+{
+   switch (backend)
+     {
+      case 2: /* gapi */
+         return evas_software_wince_gapi_resume();
+      default: /* other engines do not need it */
+         return 0;
+     }
+}
+
+/* engine api this module provides */
+static void *
+eng_info(Evas *e)
+{
+   Evas_Engine_Info_Software_16_WinCE *info;
+   info = calloc(1, sizeof(Evas_Engine_Info_Software_16_WinCE));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   info->func.suspend = _suspend;
+   info->func.resume = _resume;
+   return info;
+   e = NULL;
+}
+
+static void
+eng_info_free(Evas *e, void *info)
+{
+   Evas_Engine_Info_Software_16_WinCE *in;
+   in = (Evas_Engine_Info_Software_16_WinCE *)info;
+   free(in);
+}
+
+static void
+_tmp_out_alloc(Render_Engine *re)
+{
+   Tilebuf_Rect *r;
+   int w = 0, h = 0;
+
+   EINA_INLIST_FOREACH(re->rects, r)
+     {
+       if (r->w > w) w = r->w;
+       if (r->h > h) h = r->h;
+     }
+
+   if (re->tmp_out)
+     {
+       if ((re->tmp_out->cache_entry.w < w) || (re->tmp_out->cache_entry.h < h))
+         {
+             evas_cache_image_drop(&re->tmp_out->cache_entry);
+            re->tmp_out = NULL;
+         }
+     }
+
+   if (!re->tmp_out)
+     {
+       Soft16_Image *im;
+
+        im = (Soft16_Image *) evas_cache_image_empty(evas_common_soft16_image_cache_get());
+        im->cache_entry.flags.alpha = 0;
+        evas_cache_image_surface_alloc(&im->cache_entry, w, h);
+
+       re->tmp_out = im;
+     }
+}
+
+
+static int
+eng_setup(Evas *e, void *in)
+{
+   Render_Engine                      *re;
+   Evas_Engine_Info_Software_16_WinCE *info;
+
+   info = (Evas_Engine_Info_Software_16_WinCE *)in;
+   if (!e->engine.data.output)
+     {
+       /* do common routine init - we wil at least use it for core
+        * image loading and font loading/glyph rendering & placement */
+       evas_common_cpu_init();
+
+       evas_common_blend_init();
+       evas_common_image_init();
+       evas_common_convert_init();
+       evas_common_scale_init();
+       evas_common_rectangle_init();
+       evas_common_gradient_init();
+       evas_common_polygon_init();
+       evas_common_line_init();
+       evas_common_font_init();
+       evas_common_draw_init();
+       evas_common_tilebuf_init();
+       evas_common_soft16_image_init();
+
+       /* render engine specific data */
+       re = calloc(1, sizeof(Render_Engine));
+        if (!re)
+          return 0;
+       e->engine.data.output = re;
+
+        switch(info->info.backend)
+          {
+           case 1: /* FB */
+              re->backend = EVAS_ENGINE_WINCE_FB;
+              re->backend_priv = evas_software_wince_fb_init(info->info.window, info->info.width, info->info.height);
+              if (!re->backend_priv)
+                {
+                   free(re);
+                   return 0;
+                }
+              re->backend_shutdown = evas_software_wince_fb_shutdown;
+              re->backend_output_buffer_new = evas_software_wince_fb_output_buffer_new;
+              re->backend_output_buffer_free = evas_software_wince_fb_output_buffer_free;
+              re->backend_output_buffer_paste = evas_software_wince_fb_output_buffer_paste;
+              re->backend_surface_resize = evas_software_wince_fb_surface_resize;
+              break;
+           case 2: /* GAPI */
+              re->backend = EVAS_ENGINE_WINCE_GAPI;
+              re->backend_priv = evas_software_wince_gapi_init(info->info.window, info->info.width, info->info.height);
+              if (!re->backend_priv)
+                {
+                   free(re);
+                   return 0;
+                }
+              re->backend_shutdown = evas_software_wince_gapi_shutdown;
+              re->backend_output_buffer_new = evas_software_wince_gapi_output_buffer_new;
+              re->backend_output_buffer_free = evas_software_wince_gapi_output_buffer_free;
+              re->backend_output_buffer_paste = evas_software_wince_gapi_output_buffer_paste;
+              re->backend_surface_resize = evas_software_wince_gapi_surface_resize;
+              break;
+           case 3: /* DirectDraw */
+              re->backend = EVAS_ENGINE_WINCE_DDRAW;
+              re->backend_priv = evas_software_wince_ddraw_init(info->info.window, info->info.width, info->info.height);
+              if (!re->backend_priv)
+                {
+                   free(re);
+                   return 0;
+                }
+              re->backend_shutdown = evas_software_wince_ddraw_shutdown;
+              re->backend_output_buffer_new = evas_software_wince_ddraw_output_buffer_new;
+              re->backend_output_buffer_free = evas_software_wince_ddraw_output_buffer_free;
+              re->backend_output_buffer_paste = evas_software_wince_ddraw_output_buffer_paste;
+              re->backend_surface_resize = evas_software_wince_ddraw_surface_resize;
+              break;
+           case 4: /* GDI */
+              re->backend = EVAS_ENGINE_WINCE_GDI;
+              re->backend_priv = evas_software_wince_gdi_init(info->info.window, info->info.width, info->info.height, info->info.fullscreen);
+              if (!re->backend_priv)
+                {
+                   free(re);
+                   return 0;
+                }
+              re->backend_shutdown = evas_software_wince_gdi_shutdown;
+              re->backend_output_buffer_new = evas_software_wince_gdi_output_buffer_new;
+              re->backend_output_buffer_free = evas_software_wince_gdi_output_buffer_free;
+              re->backend_output_buffer_paste = evas_software_wince_gdi_output_buffer_paste;
+              re->backend_surface_resize = evas_software_wince_gdi_surface_resize;
+              break;
+           default:
+              free(re);
+              return 0;
+          }
+
+       re->width = e->output.w;
+       re->height = e->output.h;
+       re->rotation = info->info.rotation;
+       re->tb = evas_common_tilebuf_new(e->output.w, e->output.h);
+       if (re->tb)
+         evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+     }
+   else
+     {
+       re = e->engine.data.output;
+       if (re->tb) evas_common_tilebuf_free(re->tb);
+
+        switch(info->info.backend)
+          {
+           case 1: /* FB */
+              re->backend = EVAS_ENGINE_WINCE_FB;
+              re->backend_priv = evas_software_wince_fb_init(info->info.window, info->info.width, info->info.height);
+              if (!re->backend_priv)
+                {
+                   free(re);
+                   return 0;
+                }
+              re->backend_shutdown = evas_software_wince_fb_shutdown;
+              re->backend_output_buffer_new = evas_software_wince_fb_output_buffer_new;
+              re->backend_output_buffer_free = evas_software_wince_fb_output_buffer_free;
+              re->backend_output_buffer_paste = evas_software_wince_fb_output_buffer_paste;
+              re->backend_surface_resize = evas_software_wince_fb_surface_resize;
+              break;
+           case 2: /* GAPI */
+              re->backend = EVAS_ENGINE_WINCE_GAPI;
+              re->backend_priv = evas_software_wince_gapi_init(info->info.window, info->info.width, info->info.height);
+              if (!re->backend_priv)
+                {
+                   free(re);
+                   return 0;
+                }
+              re->backend_shutdown = evas_software_wince_gapi_shutdown;
+              re->backend_output_buffer_new = evas_software_wince_gapi_output_buffer_new;
+              re->backend_output_buffer_free = evas_software_wince_gapi_output_buffer_free;
+              re->backend_output_buffer_paste = evas_software_wince_gapi_output_buffer_paste;
+              re->backend_surface_resize = evas_software_wince_gapi_surface_resize;
+              break;
+           case 3: /* DirectDraw */
+              re->backend = EVAS_ENGINE_WINCE_DDRAW;
+              re->backend_priv = evas_software_wince_ddraw_init(info->info.window, info->info.width, info->info.height);
+              if (!re->backend_priv)
+                {
+                   free(re);
+                   return 0;
+                }
+              re->backend_shutdown = evas_software_wince_ddraw_shutdown;
+              re->backend_output_buffer_new = evas_software_wince_ddraw_output_buffer_new;
+              re->backend_output_buffer_free = evas_software_wince_ddraw_output_buffer_free;
+              re->backend_output_buffer_paste = evas_software_wince_ddraw_output_buffer_paste;
+              re->backend_surface_resize = evas_software_wince_ddraw_surface_resize;
+              break;
+           case 4: /* GDI */
+              re->backend = EVAS_ENGINE_WINCE_GDI;
+              re->backend_priv = evas_software_wince_gdi_init(info->info.window, info->info.width, info->info.height, info->info.fullscreen);
+              if (!re->backend_priv)
+                {
+                   free(re);
+                   return 0;
+                }
+              re->backend_shutdown = evas_software_wince_gdi_shutdown;
+              re->backend_output_buffer_new = evas_software_wince_gdi_output_buffer_new;
+              re->backend_output_buffer_free = evas_software_wince_gdi_output_buffer_free;
+              re->backend_output_buffer_paste = evas_software_wince_gdi_output_buffer_paste;
+              re->backend_surface_resize = evas_software_wince_gdi_surface_resize;
+              break;
+           default:
+              free(re);
+              return 0;
+          }
+
+       re->width = e->output.w;
+       re->height = e->output.h;
+       re->rotation = info->info.rotation;
+       re->tb = evas_common_tilebuf_new(e->output.w, e->output.h);
+       if (re->tb)
+         evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+       if (re->tmp_out)
+         {
+             evas_cache_image_drop(&re->tmp_out->cache_entry);
+            re->tmp_out = NULL;
+         }
+     }
+   if (!e->engine.data.output) return 0;
+   /* add a draw context if we dont have one */
+   if (!e->engine.data.context)
+     e->engine.data.context =
+     e->engine.func->context_new(e->engine.data.output);
+
+   return 1;
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (re->fbob) re->backend_output_buffer_free(re->backend_priv);
+   re->backend_shutdown(re->backend_priv);
+   if (re->clip_rects) DeleteObject(re->clip_rects);
+   if (re->tb) evas_common_tilebuf_free(re->tb);
+   if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+   if (re->tmp_out) evas_cache_image_drop(&re->tmp_out->cache_entry);
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+   evas_common_soft16_image_shutdown();
+}
+
+static void
+eng_output_resize(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+
+   if ((re->width == w) && (re->height == h)) return;
+
+   /* FIXME: is it needed ?? */
+   if (re->fbob)
+     re->backend_surface_resize(re->fbob);
+
+   evas_common_tilebuf_free(re->tb);
+   re->width = w;
+   re->height = h;
+   re->tb = evas_common_tilebuf_new(w, h);
+   if (re->tb)
+     evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+   if (re->fbob)
+     {
+        re->backend_output_buffer_free(re->fbob);
+       re->fbob = NULL;
+     }
+   if (re->clip_rects)
+     {
+       DeleteObject(re->clip_rects);
+       re->clip_rects = NULL;
+     }
+   if (re->tmp_out)
+     {
+       evas_cache_image_drop(&re->tmp_out->cache_entry);
+       re->tmp_out = NULL;
+     }
+}
+
+static void
+eng_output_tile_size_set(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_set_tile_size(re->tb, w, h);
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_clear(re->tb);
+}
+
+static inline void
+_output_buffer_alloc(Render_Engine *re)
+{
+   int width;
+   int height;
+
+   if (re->fbob) return;
+
+   if ((re->rotation == 0) || (re->rotation == 180))
+     {
+       width = re->width;
+       height = re->height;
+     }
+   else
+     {
+       width = re->height;
+       height = re->width;
+     }
+
+   re->fbob = re->backend_output_buffer_new(re->backend_priv,
+                                            width,
+                                            height);
+}
+
+static void *
+eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re;
+   Tilebuf_Rect *rect;
+   int ux, uy, uw, uh;
+
+   re = (Render_Engine *)data;
+   if (re->end)
+     {
+       re->end = 0;
+       return NULL;
+     }
+   if (!re->rects)
+     {
+       re->rects = evas_common_tilebuf_get_render_rects(re->tb);
+       if (!re->rects) return NULL;
+
+       re->cur_rect = re->rects;
+       _output_buffer_alloc(re);
+       if (re->rotation != 0) _tmp_out_alloc(re); /* grows if required */
+     }
+   if (!re->cur_rect)
+     {
+       if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       return NULL;
+     }
+   rect = re->cur_rect;
+   ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h;
+   re->cur_rect = (Tilebuf_Rect *)((EINA_INLIST_GET(re->cur_rect))->next);
+   if (!re->cur_rect)
+     {
+       evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       re->end = 1;
+     }
+
+   *x = ux; *y = uy; *w = uw; *h = uh;
+   if (re->rotation == 0)
+     {
+       *cx = ux; *cy = uy; *cw = uw; *ch = uh;
+       return re->fbob->im;
+     }
+   else
+     {
+       *cx = 0; *cy = 0; *cw = uw; *ch = uh;
+       return re->tmp_out;
+     }
+}
+
+static void
+_blit_rot_90(Soft16_Image *dst, const Soft16_Image *src,
+            int out_x, int out_y, int w, int h)
+{
+   DATA16 *dp, *sp;
+   int x, y;
+
+   sp = src->pixels;
+   dp = dst->pixels + (out_x +
+                      (w + out_y - 1) * dst->stride);
+
+   for (y = 0; y < h; y++)
+     {
+       DATA16 *dp_itr, *sp_itr;
+
+       sp_itr = sp;
+       dp_itr = dp;
+
+       for (x = 0; x < w; x++)
+         {
+            *dp_itr = *sp_itr;
+
+            sp_itr++;
+            dp_itr -= dst->stride;
+         }
+       sp += src->stride;
+       dp++;
+     }
+}
+
+static void
+_blit_rot_180(Soft16_Image *dst, const Soft16_Image *src,
+             int out_x, int out_y, int w, int h)
+{
+   DATA16 *dp, *sp;
+   int x, y;
+
+   sp = src->pixels;
+   dp = dst->pixels + ((w + out_x - 1) +
+                      (h + out_y - 1) * dst->stride);
+
+   for (y = 0; y < h; y++)
+     {
+       DATA16 *dp_itr, *sp_itr;
+
+       sp_itr = sp;
+       dp_itr = dp;
+
+       for (x = 0; x < w; x++)
+         {
+            *dp_itr = *sp_itr;
+
+            sp_itr++;
+            dp_itr--;
+         }
+       sp += src->stride;
+       dp -= dst->stride;
+     }
+}
+
+static void
+_blit_rot_270(Soft16_Image *dst, const Soft16_Image *src,
+             int out_x, int out_y, int w, int h)
+{
+   DATA16 *dp, *sp;
+   int x, y;
+
+   sp = src->pixels;
+   dp = dst->pixels + ((h + out_x - 1) +
+                      out_y * dst->stride);
+
+   for (y = 0; y < h; y++)
+     {
+       DATA16 *dp_itr, *sp_itr;
+
+       sp_itr = sp;
+       dp_itr = dp;
+
+       for (x = 0; x < w; x++)
+         {
+            *dp_itr = *sp_itr;
+
+            sp_itr++;
+            dp_itr += dst->stride;
+         }
+       sp += src->stride;
+       dp--;
+     }
+}
+
+static void
+_tmp_out_process(Render_Engine *re, int out_x, int out_y, int w, int h)
+{
+   Soft16_Image *d, *s;
+
+   d = re->fbob->im;
+   s = re->tmp_out;
+
+   if ((w < 1) || (h < 1) || (out_x >= d->cache_entry.w) || (out_y >= d->cache_entry.h))
+     return;
+
+   if (re->rotation == 90)
+     _blit_rot_90(d, s, out_x, out_y, w, h);
+   else if (re->rotation == 180)
+     _blit_rot_180(d, s, out_x, out_y, w, h);
+   else if (re->rotation == 270)
+     _blit_rot_270(d, s, out_x, out_y, w, h);
+}
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+   HRGN           region;
+   int            xx;
+   int            yy;
+   int            width;
+   int            height;
+
+   re = (Render_Engine *)data;
+
+   if (!re->clip_rects)
+      re->clip_rects = CreateRectRgn(0, 0, 0, 0);
+
+   if (re->rotation == 0)
+     {
+       xx = x;
+       yy = y;
+       width = w;
+       height = h;
+     }
+   else if (re->rotation == 90)
+     {
+       xx = y;
+       yy = re->width - w - x;
+       width = h;
+       height = w;
+     }
+   else if (re->rotation == 180)
+     {
+       xx = re->width - w - x;
+       yy = re->height - h - y;
+       width = w;
+       height = h;
+     }
+   else if (re->rotation == 270)
+     {
+       xx = re->height - h - y;
+       yy = x;
+       width = h;
+       height = w;
+     }
+
+   region = CreateRectRgn(xx, yy, xx + width, yy + height);
+
+   if (re->rotation != 0)
+     _tmp_out_process(re, xx, yy, w, h);
+   CombineRgn(re->clip_rects, re->clip_rects, region, RGN_OR);
+}
+
+static void
+eng_output_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (re->clip_rects)
+     {
+        /* FIXME : i have to manage that */
+/*     XSetRegion(re->disp, re->gc, re->clip_rects); */
+       DeleteObject(re->clip_rects);
+       re->clip_rects = NULL;
+     }
+   else return;
+
+   re->backend_output_buffer_paste(re->fbob);
+
+   /* FIXME : i have to manage that */
+/*    XSetClipMask(re->disp, re->gc, None); */
+}
+
+static void
+eng_output_idle_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (re->fbob)
+     {
+       re->backend_output_buffer_free(re->fbob);
+       re->fbob = NULL;
+     }
+   if (re->clip_rects)
+     {
+       DeleteObject(re->clip_rects);
+       re->clip_rects = NULL;
+     }
+   if (re->tmp_out)
+     {
+       evas_cache_image_drop(&re->tmp_out->cache_entry);
+       re->tmp_out = NULL;
+     }
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data, void *context)
+{
+   return EINA_FALSE;
+}
+
+/* module advertising code */
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_16")) return 0;
+   _evas_engine_soft16_wince_log_dom = eina_log_domain_register("EvasSoft16Wince", EVAS_DEFAULT_LOG_COLOR);
+   
+   if(_evas_engine_soft16_wince_log_dom < 0)
+     {
+        EINA_LOG_ERR("Impossible to create a log domain for the Soft16 Wince engine.");
+        return 0;
+     }
+
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(canvas_alpha_get);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+  eina_log_domain_unregister(_evas_engine_soft16_wince_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "software_16_wince",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_16_wince);
+
+#ifndef EVAS_STATIC_BUILD_SOFTWARE_16_WINCE
+EVAS_EINA_MODULE_DEFINE(engine, software_16_wince);
+#endif
diff --git a/src/modules/engines/software_16_wince/evas_engine.h b/src/modules/engines/software_16_wince/evas_engine.h
new file mode 100644 (file)
index 0000000..344e7b9
--- /dev/null
@@ -0,0 +1,120 @@
+#ifndef __EVAS_ENGINE_H__
+#define __EVAS_ENGINE_H__
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#include "evas_common.h"
+#include "evas_common_soft16.h"
+
+extern int _evas_engine_soft16_wince_log_dom;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_soft16_wince_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_soft16_wince_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_soft16_wince_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_soft16_wince_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_soft16_wince_log_dom, __VA_ARGS__)
+
+typedef struct _FB_Output_Buffer FB_Output_Buffer;
+
+struct _FB_Output_Buffer
+{
+   Soft16_Image *im;
+   void         *priv;
+};
+
+
+/* Raw FrameBuffer */
+
+void             *evas_software_wince_fb_init (HWND window,
+                                               int  width,
+                                               int  height);
+FB_Output_Buffer *evas_software_wince_fb_output_buffer_new (void *priv,
+                                                            int   width,
+                                                            int   height);
+void              evas_software_wince_fb_shutdown(void *priv);
+void              evas_software_wince_fb_output_buffer_free (FB_Output_Buffer *fbob);
+void              evas_software_wince_fb_output_buffer_paste (FB_Output_Buffer *fbob);
+
+void              evas_software_wince_fb_surface_resize(FB_Output_Buffer *fbob);
+
+
+/* GAPI */
+
+void             *evas_software_wince_gapi_init (HWND window,
+                                                 int  width,
+                                                 int  height);
+FB_Output_Buffer *evas_software_wince_gapi_output_buffer_new (void *priv,
+                                                              int   width,
+                                                              int   height);
+void              evas_software_wince_gapi_shutdown(void *priv);
+void              evas_software_wince_gapi_output_buffer_free (FB_Output_Buffer *fbob);
+void              evas_software_wince_gapi_output_buffer_paste (FB_Output_Buffer *fbob);
+
+void              evas_software_wince_gapi_surface_resize(FB_Output_Buffer *fbob);
+
+void             *evas_software_wince_gapi_default_keys(void);
+int               evas_software_wince_gapi_suspend(void);
+int               evas_software_wince_gapi_resume(void);
+
+
+/* DirectDraw */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+void             *evas_software_wince_ddraw_init (HWND window,
+                                                  int  width,
+                                                  int  height);
+FB_Output_Buffer *evas_software_wince_ddraw_output_buffer_new (void *priv,
+                                                               int   width,
+                                                               int   height);
+void              evas_software_wince_ddraw_shutdown(void *priv);
+void              evas_software_wince_ddraw_output_buffer_free (FB_Output_Buffer *fbob);
+void              evas_software_wince_ddraw_output_buffer_paste (FB_Output_Buffer *fbob);
+
+void              evas_software_wince_ddraw_surface_resize(FB_Output_Buffer *fbob);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* GDI */
+
+void             *evas_software_wince_gdi_init (HWND window,
+                                                int  width,
+                                                int  height,
+                                                int  fullscreen);
+FB_Output_Buffer *evas_software_wince_gdi_output_buffer_new (void *priv,
+                                                             int   width,
+                                                             int   height);
+void              evas_software_wince_gdi_shutdown(void *priv);
+void              evas_software_wince_gdi_output_buffer_free (FB_Output_Buffer *fbob);
+void              evas_software_wince_gdi_output_buffer_paste (FB_Output_Buffer *fbob);
+
+void              evas_software_wince_gdi_surface_resize(FB_Output_Buffer *fbob);
+
+
+#endif /* __EVAS_ENGINE_H__ */
diff --git a/src/modules/engines/software_16_wince/evas_wince_ddraw_buffer.cpp b/src/modules/engines/software_16_wince/evas_wince_ddraw_buffer.cpp
new file mode 100644 (file)
index 0000000..944ed53
--- /dev/null
@@ -0,0 +1,195 @@
+
+#include <cstdio>
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#include <ddraw.h>
+
+#include "evas_common.h"
+#include "evas_engine.h"
+
+
+typedef LONG (*fct_DirectDrawCreate)(LPGUID, LPUNKNOWN *, LPUNKNOWN *);
+
+fct_DirectDrawCreate lib_DirectDrawCreate;
+
+typedef struct Evas_Engine_WinCE_DDraw_Priv Evas_Engine_WinCE_DDraw_Priv;
+
+struct Evas_Engine_WinCE_DDraw_Priv
+{
+   HMODULE             module;
+   LPDIRECTDRAW        object;
+   LPDIRECTDRAWSURFACE surface;
+   int                 width;
+   int                 height;
+   int                 stride;
+};
+
+void *
+evas_software_wince_ddraw_init(HWND window,
+                               int  width,
+                               int  height)
+{
+   DDSURFACEDESC                 surface_desc;
+   Evas_Engine_WinCE_DDraw_Priv *priv;
+   HRESULT                       res;
+
+   priv = (Evas_Engine_WinCE_DDraw_Priv *)malloc(sizeof(Evas_Engine_WinCE_DDraw_Priv));
+   if (!priv)
+     return NULL;
+   
+   priv->module = LoadLibrary(L"ddraw.dll");
+   if (!priv->module)
+     {
+        fprintf(stderr, "[Engine] [WinCE DDraw] Can not load ddraw.dll\n");
+        goto free_priv;
+     }
+
+   lib_DirectDrawCreate = (fct_DirectDrawCreate)GetProcAddress(priv->module, L"DirectDrawCreate");
+   if (!lib_DirectDrawCreate)
+     {
+        fprintf(stderr, "[Engine] [WinCE DDraw] Can not initialize DirectDraw\n");
+        goto free_lib;
+     }
+
+   res = lib_DirectDrawCreate(NULL, (IUnknown**)&priv->object, NULL);
+   if (FAILED(res))
+     {
+        fprintf(stderr, "[Engine] [WinCE DDraw] Can not create DirectDraw object\n");
+        goto free_lib;
+     }
+
+   res = priv->object->SetCooperativeLevel(window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+   if (FAILED(res))
+     {
+        fprintf(stderr, "[Engine] [WinCE DDraw] Can not set window to fullscreen\n");
+        goto release_object;
+     }
+
+   memset(&surface_desc, 0, sizeof(surface_desc));
+   surface_desc.dwSize = sizeof(surface_desc);
+   surface_desc.dwFlags = DDSD_CAPS;
+   surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
+
+   res = priv->object->CreateSurface(&surface_desc, &priv->surface, NULL);
+   if (FAILED(res))
+     {
+        fprintf(stderr, "[Engine] [WinCE DDraw] Can not create surface\n");
+        goto release_object;
+     }
+
+   memset(&surface_desc, 0, sizeof(surface_desc));
+   surface_desc.dwSize = sizeof(surface_desc);
+   res = priv->surface->Lock(NULL, &surface_desc, DDLOCK_READONLY, NULL);
+   if (FAILED(res))
+     {
+        fprintf(stderr, "[Evas] [Engine] [WinCE DDraw] Can not lock surface\n");
+        goto release_surface;
+     }
+
+   priv->width = surface_desc.dwWidth;
+   priv->height = surface_desc.dwHeight;
+   priv->stride = surface_desc.lPitch / 2;
+
+   if ((priv->width != width) ||
+       (priv->height != height))
+     {
+        fprintf(stderr, "[Engine] [WinCE DDraw] Size mismatch\n");
+        fprintf(stderr, "[Engine] [WinCE DDraw] asked : %dx%d\n", width, height);
+        fprintf(stderr, "[Engine] [WinCE DDraw] got   : %dx%d\n", priv->width, priv->height);
+        goto release_surface;
+     }
+
+   res = priv->surface->Unlock(NULL);
+   if (FAILED(res))
+     {
+        fprintf(stderr, "[Engine] [WinCE DDraw] Can not unlock surface\n");
+        goto release_surface;
+     }
+
+   return priv;
+
+ release_surface:
+   priv->surface->Release();
+ release_object:
+   priv->object->Release();
+ free_lib:
+   FreeLibrary(priv->module);
+ free_priv:
+   free(priv);
+
+  return 0;
+}
+
+void
+evas_software_wince_ddraw_shutdown(void *priv)
+{
+   ((Evas_Engine_WinCE_DDraw_Priv *)priv)->surface->Release();
+   ((Evas_Engine_WinCE_DDraw_Priv *)priv)->object->Release();
+   FreeLibrary(((Evas_Engine_WinCE_DDraw_Priv *)priv)->module);
+   free(priv);
+}
+
+
+FB_Output_Buffer *
+evas_software_wince_ddraw_output_buffer_new(void *priv,
+                                            int   width,
+                                            int   height)
+{
+   FB_Output_Buffer *fbob;
+   void             *buffer;
+
+   fbob = (FB_Output_Buffer *)calloc(1, sizeof(FB_Output_Buffer));
+   if (!fbob) return NULL;
+
+   buffer = malloc (width * height * 2); /* we are sure to have 16bpp */
+   if (!buffer)
+     {
+        free(fbob);
+        return NULL;
+     }
+
+   fbob->priv = priv;
+
+   fbob->im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), width, height, (DATA32 *)buffer, 0, EVAS_COLORSPACE_RGB565_A5P);
+   if (fbob->im)
+     fbob->im->stride = ((Evas_Engine_WinCE_DDraw_Priv *)priv)->stride;
+
+   return fbob;
+}
+
+void
+evas_software_wince_ddraw_output_buffer_free(FB_Output_Buffer *fbob)
+{
+   free(fbob->im->pixels);
+   free(fbob);
+}
+
+void
+evas_software_wince_ddraw_output_buffer_paste(FB_Output_Buffer *fbob)
+{
+   DDSURFACEDESC                 surface_desc;
+   Evas_Engine_WinCE_DDraw_Priv *priv;
+   HRESULT                       res;
+
+   priv = (Evas_Engine_WinCE_DDraw_Priv *)fbob->priv;
+
+   memset(&surface_desc, 0, sizeof(surface_desc));
+   surface_desc.dwSize = sizeof(surface_desc);
+   res = priv->surface->Lock(NULL, &surface_desc, DDLOCK_WRITEONLY, NULL);
+   if (FAILED(res))
+     return;
+
+   if ((fbob->im->cache_entry.w == surface_desc.dwWidth) &&
+       (fbob->im->cache_entry.h == surface_desc.dwHeight))
+     memcpy(surface_desc.lpSurface, fbob->im->pixels,
+            surface_desc.dwWidth * surface_desc.dwHeight * 2);
+
+   priv->surface->Unlock(NULL);
+}
+
+void
+evas_software_wince_ddraw_surface_resize(FB_Output_Buffer *fbob)
+{
+}
diff --git a/src/modules/engines/software_16_wince/evas_wince_fb_buffer.c b/src/modules/engines/software_16_wince/evas_wince_fb_buffer.c
new file mode 100644 (file)
index 0000000..d97231b
--- /dev/null
@@ -0,0 +1,212 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+
+#define GETGXINFO 0x00020000
+
+typedef struct GXDeviceInfo
+{
+    long Version;               //00 (should filled with 100 before calling ExtEscape)
+    void *pvFrameBuffer;        //04
+    unsigned long cbStride;     //08
+    unsigned long cxWidth;      //0c
+    unsigned long cyHeight;     //10
+    unsigned long cBPP;         //14
+    unsigned long ffFormat;     //18
+    char Unused[0x84 - 7 * 4];
+} GXDeviceInfo;
+
+
+#define GETRAWFRAMEBUFFER 0x00020001
+
+typedef struct _RawFrameBufferInfo
+{
+   WORD  wFormat;
+   WORD  wBPP;
+   VOID *pFramePointer;
+   int   cxStride;
+   int   cyStride;
+   int   cxPixels;
+   int   cyPixels;
+} RawFrameBufferInfo;
+
+
+typedef struct Evas_Engine_WinCE_FB_Priv Evas_Engine_WinCE_FB_Priv;
+
+struct Evas_Engine_WinCE_FB_Priv
+{
+   int   width;
+   int   height;
+   void *buffer;
+};
+
+static int
+_evas_software_wince_gxinfo_init(HDC dc, int *width, int *height, void **buffer)
+{
+   GXDeviceInfo gxInfo = { 0 };
+   int          result;
+
+   gxInfo.Version = 100;
+   result = ExtEscape(dc, GETGXINFO, 0, NULL, sizeof(gxInfo),
+                      (char *) &gxInfo);
+   if (result <= 0)
+     {
+        ERR("[Engine] [WinCE FB] ExtEscape() with GETGXINFO failed\n");
+        return 0;
+     }
+
+   *width = gxInfo.cyHeight;
+   *height = gxInfo.cxWidth;
+   *buffer = gxInfo.pvFrameBuffer;
+
+   return 1;
+}
+
+void *
+evas_software_wince_fb_init(HWND window,
+                            int  width,
+                            int  height)
+{
+   WCHAR                      oemstr[100];
+   RawFrameBufferInfo         rfbi;
+   HDC                        dc;
+   Evas_Engine_WinCE_FB_Priv *priv;
+
+   priv = (Evas_Engine_WinCE_FB_Priv *)malloc(sizeof(Evas_Engine_WinCE_FB_Priv));
+   if (!priv)
+     return NULL;
+
+   dc = GetDC (window);
+   if (!dc)
+     {
+        ERR("[Engine] [WinCE FB] Can not get DC\n");
+        free(priv);
+        return NULL;
+     }
+
+   SystemParametersInfo (SPI_GETOEMINFO, sizeof (oemstr), oemstr, 0);
+   if (((oemstr[12] == 'H') &&
+        (oemstr[13] == '3') &&
+        (oemstr[14] == '8')) ||
+       ((oemstr[12] == 'H') &&
+        (oemstr[13] == '3') &&
+        (oemstr[14] == '9')))
+     {
+       if (!_evas_software_wince_gxinfo_init(dc, &priv->width, &priv->height, &priv->buffer))
+          {
+             ReleaseDC(window, dc);
+             free(priv);
+             return NULL;
+          }
+
+       if ((priv->width != width) ||
+           (priv->height != height))
+         {
+            ERR("[Engine] [WinCE FB] Size mismatch\n");
+            ERR("[Engine] [WinCE FB] asked: %dx%d\n", width, height);
+            ERR("[Engine] [WinCE FB] got  : %dx%d\n", priv->width, priv->height);
+            ReleaseDC(window, dc);
+            free(priv);
+            return NULL;
+         }
+
+        ReleaseDC(window, dc);
+
+        return priv;
+     }
+
+   if (!ExtEscape(dc, GETRAWFRAMEBUFFER, 0, 0, sizeof(rfbi), (char *) &rfbi)||
+       (rfbi.wBPP != 16) ||
+       (rfbi.wFormat != 1))
+     {
+        ERR("[Engine] [WinCE FB] ExtEscape() with GETRAWFRAMEBUFFER failed\n");
+        ERR("[Engine] [WinCE FB] trying ExtEscape() with GETGXINFO\n");
+        if (!_evas_software_wince_gxinfo_init(dc, &priv->width, &priv->height, &priv->buffer))
+          {
+             ReleaseDC(window, dc);
+             free(priv);
+             return NULL;
+          }
+
+        ReleaseDC(window, dc);
+        return priv;
+     }
+
+  priv->width = rfbi.cxPixels;
+  priv->height = rfbi.cyPixels;
+  priv->buffer = rfbi.pFramePointer;
+
+  if ((priv->width != width) ||
+      (priv->height != height))
+    {
+       ERR("[Engine] [WinCE FB] Size mismatch\n");
+       ERR("[Engine] [WinCE FB] asked: %dx%d\n", width, height);
+       ERR("[Engine] [WinCE FB] got  : %dx%d\n", priv->width, priv->height);
+       ReleaseDC(window, dc);
+       free(priv);
+       return NULL;
+    }
+
+  ReleaseDC(window, dc);
+
+  return priv;
+}
+
+void
+evas_software_wince_fb_shutdown(void *priv)
+{
+   free(priv);
+}
+
+
+FB_Output_Buffer *
+evas_software_wince_fb_output_buffer_new(void *priv,
+                                         int   width,
+                                         int   height)
+{
+   FB_Output_Buffer *fbob;
+   void             *buffer;
+
+   fbob = calloc(1, sizeof(FB_Output_Buffer));
+   if (!fbob) return NULL;
+
+   buffer = malloc (width * height * 2); /* we are sure to have 16bpp */
+   if (!buffer)
+     {
+        free(fbob);
+        return NULL;
+     }
+
+   fbob->priv = priv;
+
+   fbob->im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), width, height, (DATA32 *)buffer, 0, EVAS_COLORSPACE_RGB565_A5P);
+   if (fbob->im)
+     fbob->im->stride = width;
+
+   return fbob;
+}
+
+void
+evas_software_wince_fb_output_buffer_free(FB_Output_Buffer *fbob)
+{
+   free(fbob->im->pixels);
+   free(fbob);
+}
+
+void
+evas_software_wince_fb_output_buffer_paste(FB_Output_Buffer *fbob)
+{
+   Evas_Engine_WinCE_FB_Priv *priv;
+
+   priv = (Evas_Engine_WinCE_FB_Priv *)fbob->priv;
+
+   if ((fbob->im->cache_entry.w == priv->width) &&
+       (fbob->im->cache_entry.h == priv->height))
+     memcpy(priv->buffer, fbob->im->pixels,
+            priv->width * priv->height * 2);
+}
+
+void
+evas_software_wince_fb_surface_resize(FB_Output_Buffer *fbob)
+{
+}
diff --git a/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c b/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c
new file mode 100644 (file)
index 0000000..5e46ab1
--- /dev/null
@@ -0,0 +1,342 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+
+typedef int (*evas_engine_wince_close_display)();
+
+typedef struct Evas_Engine_WinCE_GAPI_Priv Evas_Engine_WinCE_GAPI_Priv;
+
+
+#define GETGXINFO 0x00020000
+
+typedef struct
+{
+    long Version;               //00 (should filled with 100 before calling ExtEscape)
+    void *pvFrameBuffer;        //04
+    unsigned long cbStride;     //08
+    unsigned long cxWidth;      //0c
+    unsigned long cyHeight;     //10
+    unsigned long cBPP;         //14
+    unsigned long ffFormat;     //18
+    char Unused[0x84 - 7 * 4];
+} _GXDeviceInfo;
+
+
+#define LINK(type,name,import) \
+  name = (gapi_##type)GetProcAddress (gapi_lib, import)
+
+#define GX_FULLSCREEN 0x01
+#define GX_NORMALKEYS 0x02
+
+#define kfDirect555   0x40
+#define kfDirect565   0x80
+
+
+typedef struct
+{
+   DWORD cxWidth;
+   DWORD cyHeight;
+   LONG  cbxPitch;
+   LONG  cbyPitch;
+   LONG  cBPP;
+   DWORD ffFormat;
+} _GAPI_Display_Properties;
+
+typedef int                      (*gapi_display_open)(HWND hWnd, DWORD dwFlags);
+typedef int                      (*gapi_display_close)();
+typedef _GAPI_Display_Properties (*gapi_display_properties_get)(void);
+typedef void*                    (*gapi_draw_begin)(void);
+typedef int                      (*gapi_draw_end)(void);
+typedef int                      (*gapi_suspend)(void);
+typedef int                      (*gapi_resume)(void);
+
+gapi_suspend          suspend = NULL;
+gapi_resume           resume = NULL;
+
+int
+evas_software_wince_gapi_suspend(void)
+{
+   if (suspend)
+     return suspend();
+   else
+     return 0;
+}
+
+int
+evas_software_wince_gapi_resume(void)
+{
+   if (resume)
+     return resume();
+   else
+     return 0;
+}
+
+
+struct Evas_Engine_WinCE_GAPI_Priv
+{
+   HMODULE            lib;
+   gapi_display_close close_display;
+   gapi_draw_begin    draw_begin;
+   gapi_draw_end      draw_end;
+   void              *buffer;
+   int                width;
+   int                height;
+   int                stride;
+};
+
+void *
+evas_software_wince_gapi_init(HWND window,
+                              int  width,
+                              int  height)
+{
+   WCHAR                        oemstr[100];
+   _GAPI_Display_Properties     prop;
+   HMODULE                      gapi_lib;
+   Evas_Engine_WinCE_GAPI_Priv *priv;
+
+   gapi_display_open            display_open = NULL;
+   gapi_display_close           display_close = NULL;
+   gapi_display_properties_get  display_properties_get = NULL;
+   gapi_draw_begin              draw_begin = NULL;
+   gapi_draw_end                draw_end = NULL;
+
+   priv = (Evas_Engine_WinCE_GAPI_Priv *)malloc(sizeof(Evas_Engine_WinCE_GAPI_Priv));
+   if (!priv)
+     return NULL;
+
+   gapi_lib = LoadLibrary(L"\\Windows\\gx.dll");
+   if (!gapi_lib)
+     {
+        gapi_lib = LoadLibrary(L"gx.dll");
+        if (!gapi_lib)
+          {
+             ERR("[Engine] [WinCE GAPI] Can not load gx.dll");
+             goto free_priv;
+          }
+     }
+
+   LINK(display_open, display_open, L"?GXOpenDisplay@@YAHPAUHWND__@@K@Z");
+   LINK(display_close, display_close, L"?GXCloseDisplay@@YAHXZ");
+   LINK(display_properties_get, display_properties_get, L"?GXGetDisplayProperties@@YA?AUGXDisplayProperties@@XZ");
+   LINK(draw_begin, draw_begin, L"?GXBeginDraw@@YAPAXXZ");
+   LINK(draw_end, draw_end, L"?GXEndDraw@@YAHXZ");
+   LINK(suspend, suspend, L"?GXSuspend@@YAHXZ" );
+   LINK(resume, resume, L"?GXResume@@YAHXZ" );
+
+   if (!display_open ||
+       !display_close ||
+       !display_properties_get ||
+       !draw_begin ||
+       !draw_end ||
+       !suspend ||
+       !resume)
+     {
+       ERR("[Engine] [WinCE GAPI] Can not find valid symbols");
+        goto free_lib;
+     }
+
+   if (!display_open(window, GX_FULLSCREEN))
+     {
+       ERR("[Engine] [WinCE GAPI] Can not open display");
+        goto free_lib;
+     }
+
+   prop = display_properties_get();
+
+   // verify pixel format
+   if(!(prop.ffFormat & kfDirect565) || (prop.cBPP != 16))
+     {
+        ERR("[Engine] [WinCE GAPI] display format mismatch\n");
+        goto close_display;
+     }
+
+   // verify we have a vga device
+   if ((GetSystemMetrics(SM_CXSCREEN) != (int)prop.cxWidth) ||
+       (GetSystemMetrics(SM_CYSCREEN) != (int)prop.cyHeight))
+     {
+        ERR("[Engine] [WinCE GAPI] display size mismatch\n");
+        goto close_display;
+     }
+
+   priv->lib = gapi_lib;
+   priv->close_display = display_close;
+   priv->draw_begin = draw_begin;
+   priv->draw_end = draw_end;
+
+   /* GAPI on Ipaq H38** and H39** is completely buggy */
+   /* They are detected as portrait device (width = 240 and height = 320) */
+   /* but the framebuffer is managed like a landscape device : */
+   /*
+     240
+ +---------+
+ |         |
+ |         |
+ |         |
+ |         |
+ |         | 320
+ | ^^^     |
+ | |||     |
+ | |||     |
+ | |||     |
+ +---------+
+  ---->
+
+   */
+   /* So these devices are considered as landscape devices */
+   /* and width and height are switched. */
+   /* Other devices are managed normally : */
+   /*
+     240
+  +---------+
+| |--->     |
+| |--->     |
+| |--->     |
+v |         |
+  |         | 320
+  |         |
+  |         |
+  |         |
+  |         |
+  +---------+
+
+    */
+
+   SystemParametersInfo (SPI_GETOEMINFO, sizeof (oemstr), oemstr, 0);
+
+   if (((oemstr[12] == 'H') &&
+        (oemstr[13] == '3') &&
+        (oemstr[14] == '8')) ||
+       ((oemstr[12] == 'H') &&
+        (oemstr[13] == '3') &&
+        (oemstr[14] == '9')))
+     {
+        _GXDeviceInfo gxInfo = { 0 };
+        HDC           dc;
+        int           result;
+
+        priv->width = prop.cyHeight;
+        priv->height = prop.cxWidth;
+        priv->stride = prop.cbxPitch;
+
+        dc = GetDC (window);
+        if (!dc)
+          {
+             ERR("[Engine] [WinCE GAPI] Can not get device\n");
+             goto close_display;
+          }
+
+        gxInfo.Version = 100;
+        result = ExtEscape(dc, GETGXINFO, 0, NULL, sizeof(gxInfo),
+                           (char *) &gxInfo);
+        if (result <= 0)
+          {
+             ERR("[Engine] [WinCE GAPI] ExtEscape failed\n");
+             ReleaseDC(window, dc);
+             goto close_display;
+          }
+
+        priv->buffer = gxInfo.pvFrameBuffer;
+        ReleaseDC(window, dc);
+     }
+   else
+     {
+        priv->width = prop.cxWidth;
+        priv->height = prop.cyHeight;
+        priv->stride = prop.cbyPitch;
+        priv->buffer = NULL;
+     }
+
+   if ((priv->width != width) ||
+       (priv->height != height))
+     {
+        ERR("[Engine] [WinCE GAPI] Size mismatch\n");
+        ERR("[Engine] [WinCE GAPI] asked: %dx%d\n", width, height);
+        ERR("[Engine] [WinCE GAPI] got  : %dx%d\n", priv->width, priv->height);
+        goto close_display;
+     }
+
+   return priv;
+
+ close_display:
+   display_close();
+ free_lib:
+   FreeLibrary(gapi_lib);
+ free_priv:
+   free(priv);
+   return NULL;
+}
+
+void
+evas_software_wince_gapi_shutdown(void *priv)
+{
+   Evas_Engine_WinCE_GAPI_Priv *p;
+
+   p = (Evas_Engine_WinCE_GAPI_Priv *)priv;
+   p->close_display();
+   suspend = NULL;
+   resume = NULL;
+   FreeLibrary(p->lib);
+   free(p);
+}
+
+
+FB_Output_Buffer *
+evas_software_wince_gapi_output_buffer_new(void *priv,
+                                           int   width,
+                                           int   height)
+{
+   FB_Output_Buffer *fbob;
+   void             *buffer;
+
+   fbob = calloc(1, sizeof(FB_Output_Buffer));
+   if (!fbob) return NULL;
+
+   buffer = malloc (width * height * 2); /* we are sure to have 16bpp */
+   if (!buffer)
+     {
+        free(fbob);
+        return NULL;
+     }
+
+   fbob->priv = priv;
+
+   fbob->im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), width, height, (DATA32 *)buffer, 0, EVAS_COLORSPACE_RGB565_A5P);
+   if (fbob->im)
+     fbob->im->stride = ((Evas_Engine_WinCE_GAPI_Priv *)priv)->stride >> 1;
+
+   return fbob;
+}
+
+void
+evas_software_wince_gapi_output_buffer_free(FB_Output_Buffer *fbob)
+{
+   free(fbob->im->pixels);
+   free(fbob);
+}
+
+void
+evas_software_wince_gapi_output_buffer_paste(FB_Output_Buffer *fbob)
+{
+   Evas_Engine_WinCE_GAPI_Priv *priv;
+   void                        *buffer;
+
+   priv = (Evas_Engine_WinCE_GAPI_Priv *)fbob->priv;
+
+   buffer = priv->draw_begin();
+   if (!buffer)
+     return;
+
+   if (priv->buffer) buffer = priv->buffer;
+
+   if ((fbob->im->cache_entry.w == priv->width) &&
+       (fbob->im->cache_entry.h == priv->height))
+     memcpy(buffer, fbob->im->pixels,
+            priv->width * priv->height * 2);
+
+   priv->draw_end();
+}
+
+void
+evas_software_wince_gapi_surface_resize(FB_Output_Buffer *fbob)
+{
+}
diff --git a/src/modules/engines/software_16_wince/evas_wince_gdi_buffer.c b/src/modules/engines/software_16_wince/evas_wince_gdi_buffer.c
new file mode 100644 (file)
index 0000000..4d609f2
--- /dev/null
@@ -0,0 +1,165 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+
+typedef struct BITMAPINFO_16bpp BITMAPINFO_16bpp;
+typedef struct Evas_Engine_WinCE_GDI_Priv Evas_Engine_WinCE_GDI_Priv;
+
+struct BITMAPINFO_16bpp
+{
+   BITMAPINFOHEADER bih;
+   DWORD            masks[3];
+};
+
+struct Evas_Engine_WinCE_GDI_Priv
+{
+   HWND              window;
+   HDC               dc;
+   BITMAPINFO_16bpp *bitmap_info;
+   HBITMAP           bitmap;
+   int               width;
+   int               height;
+};
+
+void *
+evas_software_wince_gdi_init(HWND window,
+                             int  width,
+                             int  height,
+                             int  fullscreen)
+{
+   Evas_Engine_WinCE_GDI_Priv *priv;
+
+   priv = (Evas_Engine_WinCE_GDI_Priv *)malloc(sizeof(Evas_Engine_WinCE_GDI_Priv));
+   if (!priv)
+     return NULL;
+
+   priv->window = window;
+   priv->dc = GetDC(window);
+   if (!priv->dc)
+     {
+        ERR("[Engine] [WinCE GDI] Can not get DC\n");
+        free(priv);
+        return NULL;
+     }
+
+   if (fullscreen)
+     {
+        priv->width = GetSystemMetrics(SM_CXSCREEN);
+        priv->height = GetSystemMetrics(SM_CYSCREEN);
+     }
+   else
+     {
+        priv->width = width;
+        priv->height = height;
+     }
+
+   priv->bitmap_info = (BITMAPINFO_16bpp *)malloc(sizeof(BITMAPINFO_16bpp));
+   if (!priv->bitmap_info)
+     {
+        ERR("[Engine] [WinCE GDI] Can not allocate bitmap info\n");
+        ReleaseDC(window, priv->dc);
+        free(priv);
+        return NULL;
+     }
+
+   priv->bitmap_info->bih.biSize = sizeof(BITMAPINFOHEADER);
+   priv->bitmap_info->bih.biWidth = priv->width;
+   priv->bitmap_info->bih.biHeight = -priv->height;
+   priv->bitmap_info->bih.biPlanes = 1;
+   priv->bitmap_info->bih.biSizeImage = 2 * priv->width * priv->height;
+   priv->bitmap_info->bih.biXPelsPerMeter = 0;
+   priv->bitmap_info->bih.biYPelsPerMeter = 0;
+   priv->bitmap_info->bih.biClrUsed = 0;
+   priv->bitmap_info->bih.biClrImportant = 0;
+   priv->bitmap_info->bih.biBitCount = 16;
+   priv->bitmap_info->bih.biCompression = BI_BITFIELDS;
+   priv->bitmap_info->masks[0] = 0x0000f800;
+   priv->bitmap_info->masks[1] = 0x000007e0;
+   priv->bitmap_info->masks[2] = 0x0000001f;
+
+   return priv;
+}
+
+void
+evas_software_wince_gdi_shutdown(void *priv)
+{
+   free(((Evas_Engine_WinCE_GDI_Priv *)priv)->bitmap_info);
+   ReleaseDC(((Evas_Engine_WinCE_GDI_Priv *)priv)->window, ((Evas_Engine_WinCE_GDI_Priv *)priv)->dc);
+   free(priv);
+}
+
+
+FB_Output_Buffer *
+evas_software_wince_gdi_output_buffer_new(void *priv,
+                                          int   width,
+                                          int   height)
+{
+   Evas_Engine_WinCE_GDI_Priv *priv2;
+   FB_Output_Buffer           *fbob;
+   void                       *buffer;
+
+   fbob = calloc(1, sizeof(FB_Output_Buffer));
+   if (!fbob) return NULL;
+
+   fbob->priv = priv;
+
+   priv2 = (Evas_Engine_WinCE_GDI_Priv *)fbob->priv;
+
+   priv2->bitmap = CreateDIBSection(priv2->dc,
+                                    (const BITMAPINFO *)priv2->bitmap_info,
+                                    DIB_RGB_COLORS,
+                                    (void **)(&buffer),
+                                    NULL,
+                                    0);
+   if (!priv2->bitmap)
+     {
+        free(fbob);
+        return NULL;
+     }
+
+   fbob->im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), width, height, (DATA32 *)buffer, 0, EVAS_COLORSPACE_RGB565_A5P);
+   if (fbob->im)
+     fbob->im->stride = width;
+
+   return fbob;
+}
+
+void
+evas_software_wince_gdi_output_buffer_free(FB_Output_Buffer *fbob)
+{
+   Evas_Engine_WinCE_GDI_Priv *priv;
+
+   priv = (Evas_Engine_WinCE_GDI_Priv *)fbob->priv;
+   DeleteObject(priv->bitmap);
+   free(fbob);
+}
+
+void
+evas_software_wince_gdi_output_buffer_paste(FB_Output_Buffer *fbob)
+{
+   Evas_Engine_WinCE_GDI_Priv *priv;
+
+   priv = (Evas_Engine_WinCE_GDI_Priv *)fbob->priv;
+
+   if ((fbob->im->cache_entry.w == priv->width) &&
+       (fbob->im->cache_entry.h == priv->height))
+     {
+        HDC dc;
+
+        dc = CreateCompatibleDC(priv->dc);
+        SelectObject(dc, priv->bitmap);
+        BitBlt(priv->dc,
+               0, 0,
+               priv->width, priv->height,
+               dc,
+               0, 0,
+               SRCCOPY);
+        DeleteDC(dc);
+
+     }
+}
+
+void
+evas_software_wince_gdi_surface_resize(FB_Output_Buffer *fbob)
+{
+}
diff --git a/src/modules/engines/software_16_x11/.cvsignore b/src/modules/engines/software_16_x11/.cvsignore
new file mode 100644 (file)
index 0000000..09980ae
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
diff --git a/src/modules/engines/software_16_x11/Evas_Engine_Software_16_X11.h b/src/modules/engines/software_16_x11/Evas_Engine_Software_16_X11.h
new file mode 100644 (file)
index 0000000..47885fa
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef _EVAS_ENGINE_SOFTWARE_16_X11_H
+#define _EVAS_ENGINE_SOFTWARE_16_X11_H
+
+#include <X11/Xlib.h>
+
+typedef struct _Evas_Engine_Info_Software_16_X11              Evas_Engine_Info_Software_16_X11;
+
+struct _Evas_Engine_Info_Software_16_X11
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   /* engine specific data & parameters it needs to set up */
+   struct {
+      Display  *display;
+      Drawable  drawable;
+      int rotation;
+   } info;
+};
+#endif
+
+
diff --git a/src/modules/engines/software_16_x11/Makefile.am b/src/modules/engines/software_16_x11/Makefile.am
new file mode 100644 (file)
index 0000000..45106ed
--- /dev/null
@@ -0,0 +1,45 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines \
+-I$(top_srcdir)/src/modules/engines/software_16 \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_engine_software_16_x11_cflags@
+
+if BUILD_ENGINE_SOFTWARE_16_X11
+
+SOFTWARE_16_X11_SOURCES =  \
+evas_engine.c \
+evas_x_buffer.c
+
+SOFTWARE_16_X11_LIBADD = @evas_engine_software_16_x11_libs@
+
+pkgdir = $(libdir)/evas/modules/engines/software_16_x11/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_Software_16_X11.h
+
+if !EVAS_STATIC_BUILD_SOFTWARE_16_X11
+
+pkg_LTLIBRARIES        = module.la
+
+module_la_SOURCES = $(SOFTWARE_16_X11_SOURCES)
+module_la_LIBADD = @EINA_LIBS@ $(SOFTWARE_16_X11_LIBADD) $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_software_16_x11.la
+
+libevas_engine_software_16_x11_la_SOURCES = $(SOFTWARE_16_X11_SOURCES)
+libevas_engine_software_16_x11_la_LIBADD = $(SOFTWARE_16_X11_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/software_16_x11/evas_engine.c b/src/modules/engines/software_16_x11/evas_engine.c
new file mode 100644 (file)
index 0000000..32a88ba
--- /dev/null
@@ -0,0 +1,735 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_Software_16_X11.h"
+#include "evas_common_soft16.h"
+
+int _evas_engine_soft16_x11_log_dom = -1;
+/* function tables - filled in later (func and parent func) */
+static Evas_Func func, pfunc;
+
+struct xrdb_user
+{
+   time_t last_stat;
+   time_t last_mtime;
+   XrmDatabase db;
+};
+static struct xrdb_user xrdb_user = {0, 0, NULL};
+
+static Eina_Bool
+xrdb_user_query(const char *name, const char *cls, char **type, XrmValue *val)
+{
+   time_t last = xrdb_user.last_stat, now = time(NULL);
+
+   xrdb_user.last_stat = now;
+   if (last != now) /* don't stat() more than once every second */
+     {
+       struct stat st;
+       const char *home = getenv("HOME");
+       char tmp[PATH_MAX];
+
+       if (!home) goto failed;
+       snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home);
+       if (stat(tmp, &st) != 0) goto failed;
+       if (xrdb_user.last_mtime != st.st_mtime)
+         {
+            if (xrdb_user.db) XrmDestroyDatabase(xrdb_user.db);
+            xrdb_user.db = XrmGetFileDatabase(tmp);
+            if (!xrdb_user.db) goto failed;
+            xrdb_user.last_mtime = st.st_mtime;
+         }
+     }
+
+   if (!xrdb_user.db) return EINA_FALSE;
+   return XrmGetResource(xrdb_user.db, name, cls, type, val);
+
+ failed:
+   if (xrdb_user.db)
+     {
+       XrmDestroyDatabase(xrdb_user.db);
+       xrdb_user.db = NULL;
+     }
+   xrdb_user.last_mtime = 0;
+   return EINA_FALSE;
+}
+
+/* engine struct data */
+typedef struct _Render_Engine Render_Engine;
+
+struct _Render_Engine
+{
+   Display          *disp;
+   Drawable          draw;
+   GC                gc;
+   int               w, h, rot;
+   Tilebuf          *tb;
+   Tilebuf_Rect     *rects;
+   Tilebuf_Rect     *cur_rect;
+   
+   XrmDatabase   xrdb; // xres - dpi
+   struct { // xres - dpi
+      int        dpi; // xres - dpi
+   } xr; // xres - dpi
+   
+   X_Output_Buffer  *shbuf;
+   Soft16_Image     *tmp_out; /* used by indirect render, like rotation */
+   Region            clip_rects;
+   unsigned char     end : 1;
+   unsigned char     shm : 1;
+};
+
+/* prototypes we will use here */
+
+static void *eng_info(Evas *e);
+static void eng_info_free(Evas *e, void *info);
+static int eng_setup(Evas *e, void *info);
+static void eng_output_free(void *data);
+static void eng_output_resize(void *data, int w, int h);
+static void eng_output_tile_size_set(void *data, int w, int h);
+static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_clear(void *data);
+static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
+static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
+static void eng_output_flush(void *data);
+static void eng_output_idle_flush(void *data);
+
+/* engine api this module provides */
+static void *
+eng_info(Evas *e)
+{
+   Evas_Engine_Info_Software_16_X11 *info;
+   
+   info = calloc(1, sizeof(Evas_Engine_Info_Software_16_X11));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   return info;
+   e = NULL;
+}
+
+static void
+eng_info_free(Evas *e __UNUSED__, void *info)
+{
+   Evas_Engine_Info_Software_16_X11 *in;
+   in = (Evas_Engine_Info_Software_16_X11 *)info;
+   free(in);
+}
+
+static void
+_tmp_out_alloc(Render_Engine *re)
+{
+   Tilebuf_Rect *r;
+   int w = 0, h = 0;
+
+   EINA_INLIST_FOREACH(re->rects, r)
+     {
+       if (r->w > w) w = r->w;
+       if (r->h > h) h = r->h;
+     }
+
+   if (re->tmp_out)
+     {
+       if ((re->tmp_out->cache_entry.w < w) || (re->tmp_out->cache_entry.h < h))
+         {
+             evas_cache_image_drop(&re->tmp_out->cache_entry);
+            re->tmp_out = NULL;
+         }
+     }
+
+   if (!re->tmp_out)
+     {
+       Soft16_Image *im;
+
+        im = (Soft16_Image *) evas_cache_image_empty(evas_common_soft16_image_cache_get());
+        im->cache_entry.flags.alpha = 0;
+        evas_cache_image_surface_alloc(&im->cache_entry, w, h);
+
+       re->tmp_out = im;
+     }
+}
+
+
+static int
+eng_setup(Evas *e, void *in)
+{
+   Render_Engine *re;
+   Evas_Engine_Info_Software_16_X11 *info;
+/*    X_Output_Buffer *xob; */
+   XGCValues gcv;
+   
+   info = (Evas_Engine_Info_Software_16_X11 *)in;
+   if (!e->engine.data.output)
+     {
+       /* the only check - simplistic, i know, but enough for this 
+        * "special purpose" engine. Remember it is meant to be used
+        * for limited power devices that have a 16bit display mode
+        * and no real other acceleration, and high resolution so we
+        * can pre-dither into 16bpp. */
+//     if (DefaultDepth(info->info.display, 
+//                      DefaultScreen(info->info.display)) != 16)
+//       return;
+       /* do common routine init - we wil at least use it for core
+        * image loading and font loading/glyph rendering & placement */
+       evas_common_cpu_init();
+       
+       evas_common_blend_init();
+       evas_common_image_init();
+       evas_common_convert_init();
+       evas_common_scale_init();
+       evas_common_rectangle_init();
+       evas_common_gradient_init();
+       evas_common_polygon_init();
+       evas_common_line_init();
+       evas_common_font_init();
+       evas_common_draw_init();
+       evas_common_tilebuf_init();
+       evas_common_soft16_image_init();
+
+       /* render engine specific data */
+       re = calloc(1, sizeof(Render_Engine));
+        if (!re)
+          return 0;
+       e->engine.data.output = re;
+       re->disp = info->info.display;
+       re->draw = info->info.drawable;
+       re->gc = XCreateGC(re->disp, re->draw, 0, &gcv);
+       re->w = e->output.w;
+       re->h = e->output.h;
+       re->rot = info->info.rotation;
+       re->tb = evas_common_tilebuf_new(e->output.w, e->output.h);
+       if (re->tb)
+         evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+     }
+   else
+     {
+       /* we changed the info after first init - do a re-eval where
+        * appropriate */
+//     if (DefaultDepth(info->info.display, 
+//                      DefaultScreen(info->info.display)) != 16)
+//       return;
+       re = e->engine.data.output;
+       if (re->tb) evas_common_tilebuf_free(re->tb);
+       re->disp = info->info.display;
+       re->draw = info->info.drawable;
+       XFreeGC(re->disp, re->gc);
+       re->gc = XCreateGC(re->disp, re->draw, 0, &gcv);
+       re->w = e->output.w;
+       re->h = e->output.h;
+       re->rot = info->info.rotation;
+       re->tb = evas_common_tilebuf_new(e->output.w, e->output.h);
+       if (re->tb)
+         evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+       if (re->tmp_out)
+         {
+             evas_cache_image_drop(&re->tmp_out->cache_entry);
+            re->tmp_out = NULL;
+         }
+     }
+   if (!e->engine.data.output) return 0;
+   
+   
+     {   
+        int status;
+        char *type = NULL;
+        XrmValue val;
+        
+        re->xr.dpi = 75000; // dpy * 1000
+
+       status = xrdb_user_query("Xft.dpi", "Xft.Dpi", &type, &val);
+       if ((!status) || (!type))
+         {
+            if (!re->xrdb) re->xrdb = XrmGetDatabase(re->disp);
+            if (re->xrdb)
+              status = XrmGetResource(re->xrdb,
+                                      "Xft.dpi", "Xft.Dpi", &type, &val);
+         }
+
+        if ((status) && (type))
+          {
+             if (!strcmp(type, "String"))
+               {
+                  const char *str, *dp;
+                  
+                  str = val.addr;
+                  dp = strchr(str, '.');
+                  if (!dp) dp = strchr(str, ',');
+                  
+                  if (dp)
+                    {
+                       int subdpi, len, i;
+                       char *buf;
+                       
+                       buf = alloca(dp - str + 1);
+                       strncpy(buf, str, dp - str);
+                       buf[dp - str] = 0;
+                       len = strlen(dp + 1);
+                       subdpi = atoi(dp + 1);
+                       
+                       if (len < 3)
+                         {
+                            for (i = len; i < 3; i++) subdpi *= 10;
+                         }
+                       else if (len > 3)
+                         {
+                            for (i = len; i > 3; i--) subdpi /= 10;
+                         }
+                       re->xr.dpi = atoi(buf) * 1000;
+                    }
+                  else
+                    re->xr.dpi = atoi(str) * 1000;
+               }
+          }
+        evas_common_font_dpi_set(re->xr.dpi / 1000);
+     }
+   
+   /* add a draw context if we dont have one */
+   if (!e->engine.data.context)
+     e->engine.data.context =
+     e->engine.func->context_new(e->engine.data.output);
+   /* check if the display can do shm */
+   re->shm = evas_software_x11_x_can_do_shm(re->disp);
+
+   return 1;
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   
+// NOTE: XrmGetDatabase() result is shared per connection, do not free it.
+//   if (re->xrdb) XrmDestroyDatabase(re->xrdb);
+   
+   if (re->shbuf) evas_software_x11_x_output_buffer_free(re->shbuf, 0);
+   if (re->clip_rects) XDestroyRegion(re->clip_rects);
+   if (re->gc) XFreeGC(re->disp, re->gc);
+   if (re->tb) evas_common_tilebuf_free(re->tb);
+   if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+   if (re->tmp_out) evas_cache_image_drop(&re->tmp_out->cache_entry);
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+   evas_common_soft16_image_shutdown();
+}
+
+static void
+eng_output_resize(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+
+   if ((re->w == w) && (re->h == h)) return;
+
+   evas_common_tilebuf_free(re->tb);
+   re->w = w;
+   re->h = h;
+   re->tb = evas_common_tilebuf_new(w, h);
+   if (re->tb)
+     evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+   if (re->shbuf)
+     {
+        evas_software_x11_x_output_buffer_free(re->shbuf, 0);
+       re->shbuf = NULL;
+     }
+   if (re->clip_rects)
+     {
+       XDestroyRegion(re->clip_rects);
+       re->clip_rects = NULL;
+     }
+   if (re->tmp_out)
+     {
+        evas_cache_image_drop(&re->tmp_out->cache_entry);
+       re->tmp_out = NULL;
+     }
+}
+
+static void
+eng_output_tile_size_set(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_set_tile_size(re->tb, w, h);
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_clear(re->tb);
+}
+
+static inline void
+_output_buffer_alloc(Render_Engine *re)
+{
+   int w, h;
+   if (re->shbuf) return;
+
+   if ((re->rot == 0) || (re->rot == 180))
+     {
+       w = re->w;
+       h = re->h;
+     }
+   else
+     {
+       w = re->h;
+       h = re->w;
+     }
+
+   re->shbuf = evas_software_x11_x_output_buffer_new
+     (re->disp, DefaultVisual(re->disp, DefaultScreen(re->disp)),
+      DefaultDepth(re->disp, DefaultScreen(re->disp)),
+      w, h, 1, NULL);
+}
+
+static void *
+eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re;
+   Tilebuf_Rect *rect;
+   int ux, uy, uw, uh;
+
+   re = (Render_Engine *)data;
+   if (re->end)
+     {
+       re->end = 0;
+       return NULL;
+     }
+   if (!re->rects)
+     {
+       re->rects = evas_common_tilebuf_get_render_rects(re->tb);
+       if (!re->rects) return NULL;
+
+       re->cur_rect = re->rects;
+       _output_buffer_alloc(re);
+       if (re->rot != 0) _tmp_out_alloc(re); /* grows if required */
+     }
+   if (!re->cur_rect)
+     {
+       if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       return NULL;
+     }
+   rect = re->cur_rect;
+   ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h;
+   re->cur_rect = (Tilebuf_Rect *)((EINA_INLIST_GET(re->cur_rect))->next);
+   if (!re->cur_rect)
+     {
+       evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       re->end = 1;
+     }
+
+   *x = ux; *y = uy; *w = uw; *h = uh;
+   if (re->rot == 0)
+     {
+       *cx = ux; *cy = uy; *cw = uw; *ch = uh;
+       return re->shbuf->im;
+     }
+   else
+     {
+       *cx = 0; *cy = 0; *cw = uw; *ch = uh;
+       return re->tmp_out;
+     }
+}
+
+static void
+_blit_rot_90(Soft16_Image *dst, const Soft16_Image *src,
+            int out_x, int out_y, int w, int h)
+{
+   DATA16 *dp, *sp;
+   int x, y;
+
+   sp = src->pixels;
+   dp = dst->pixels + (out_x +
+                      (w + out_y - 1) * dst->stride);
+
+   for (y = 0; y < h; y++)
+     {
+       DATA16 *dp_itr, *sp_itr;
+
+       sp_itr = sp;
+       dp_itr = dp;
+
+       for (x = 0; x < w; x++)
+         {
+            *dp_itr = *sp_itr;
+
+            sp_itr++;
+            dp_itr -= dst->stride;
+         }
+       sp += src->stride;
+       dp++;
+     }
+}
+
+static void
+_blit_rot_180(Soft16_Image *dst, const Soft16_Image *src,
+             int out_x, int out_y, int w, int h)
+{
+   DATA16 *dp, *sp;
+   int x, y;
+
+   sp = src->pixels;
+   dp = dst->pixels + ((w + out_x - 1) +
+                      (h + out_y - 1) * dst->stride);
+
+   for (y = 0; y < h; y++)
+     {
+       DATA16 *dp_itr, *sp_itr;
+
+       sp_itr = sp;
+       dp_itr = dp;
+
+       for (x = 0; x < w; x++)
+         {
+            *dp_itr = *sp_itr;
+
+            sp_itr++;
+            dp_itr--;
+         }
+       sp += src->stride;
+       dp -= dst->stride;
+     }
+}
+
+static void
+_blit_rot_270(Soft16_Image *dst, const Soft16_Image *src,
+             int out_x, int out_y, int w, int h)
+{
+   DATA16 *dp, *sp;
+   int x, y;
+
+   sp = src->pixels;
+   dp = dst->pixels + ((h + out_x - 1) +
+                      out_y * dst->stride);
+
+   for (y = 0; y < h; y++)
+     {
+       DATA16 *dp_itr, *sp_itr;
+
+       sp_itr = sp;
+       dp_itr = dp;
+
+       for (x = 0; x < w; x++)
+         {
+            *dp_itr = *sp_itr;
+
+            sp_itr++;
+            dp_itr += dst->stride;
+         }
+       sp += src->stride;
+       dp--;
+     }
+}
+
+static void
+_tmp_out_process(Render_Engine *re, int out_x, int out_y, int w, int h)
+{
+   Soft16_Image *d, *s;
+
+   d = re->shbuf->im;
+   s = re->tmp_out;
+
+   if ((w < 1) || (h < 1) || (out_x >= d->cache_entry.w) || (out_y >= d->cache_entry.h))
+     return;
+
+   if (re->rot == 90)
+     _blit_rot_90(d, s, out_x, out_y, w, h);
+   else if (re->rot == 180)
+     _blit_rot_180(d, s, out_x, out_y, w, h);
+   else if (re->rot == 270)
+     _blit_rot_270(d, s, out_x, out_y, w, h);
+}
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface __UNUSED__, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+   XRectangle r = { 0, 0, 0, 0 };
+
+   re = (Render_Engine *)data;
+
+   if (!re->clip_rects)
+      re->clip_rects = XCreateRegion();
+
+   if (re->rot == 0)
+     {
+       r.x = x;
+       r.y = y;
+       r.width = w;
+       r.height = h;
+     }
+   else if (re->rot == 90)
+     {
+       r.x = y;
+       r.y = re->w - w - x;
+       r.width = h;
+       r.height = w;
+     }
+   else if (re->rot == 180)
+     {
+       r.x = re->w - w - x;
+       r.y = re->h - h - y;
+       r.width = w;
+       r.height = h;
+     }
+   else if (re->rot == 270)
+     {
+       r.x = re->h - h - y;
+       r.y = x;
+       r.width = h;
+       r.height = w;
+     }
+
+   if (re->rot != 0)
+     _tmp_out_process(re, r.x, r.y, w, h);
+   XUnionRectWithRegion(&r, re->clip_rects, re->clip_rects);
+}
+
+static void
+eng_output_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (re->clip_rects)
+     {
+       XSetRegion(re->disp, re->gc, re->clip_rects);
+       XDestroyRegion(re->clip_rects);
+       re->clip_rects = NULL;
+     }
+   else return;
+
+   evas_software_x11_x_output_buffer_paste
+     (re->shbuf, re->draw, re->gc, 0, 0, re->shbuf->im->cache_entry.w, re->shbuf->im->cache_entry.h, 1);
+   XSetClipMask(re->disp, re->gc, None);
+}
+
+static void
+eng_output_idle_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (re->shbuf)
+     {
+       evas_software_x11_x_output_buffer_free(re->shbuf, 0);
+       re->shbuf = NULL;
+     }
+   if (re->clip_rects)
+     {
+       XDestroyRegion(re->clip_rects);
+       re->clip_rects = NULL;
+     }
+   if (re->tmp_out)
+     {
+        evas_cache_image_drop(&re->tmp_out->cache_entry);
+       re->tmp_out = NULL;
+     }
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data __UNUSED__, void *context __UNUSED__)
+{
+   return EINA_FALSE;
+}
+
+/* module advertising code */
+static int
+module_open(Evas_Module *em)
+{
+   static Eina_Bool xrm_inited = EINA_FALSE;
+   if (!xrm_inited)
+     {
+       xrm_inited = EINA_TRUE;
+       XrmInitialize();
+     }
+
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_16")) return 0;
+   _evas_engine_soft16_x11_log_dom = eina_log_domain_register("EvasSoft16X11", EVAS_DEFAULT_LOG_COLOR);
+   if(_evas_engine_soft16_x11_log_dom < 0) 
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the Soft16_X11 engine.\n");
+       return 0;
+     }
+
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(canvas_alpha_get);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+  eina_log_domain_unregister(_evas_engine_soft16_x11_log_dom);
+  if (xrdb_user.db)
+    {
+       XrmDestroyDatabase(xrdb_user.db);
+       xrdb_user.last_stat = 0;
+       xrdb_user.last_mtime = 0;
+       xrdb_user.db = NULL;
+    }
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "software_16_x11",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_16_x11);
+
+#ifndef EVAS_STATIC_BUILD_SOFTWARE_16_X11
+EVAS_EINA_MODULE_DEFINE(engine, software_16_x11);
+#endif
+
diff --git a/src/modules/engines/software_16_x11/evas_engine.h b/src/modules/engines/software_16_x11/evas_engine.h
new file mode 100644 (file)
index 0000000..5ca8c17
--- /dev/null
@@ -0,0 +1,63 @@
+#ifndef EVAS_ENGINE_H
+#define EVAS_ENGINE_H
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <X11/extensions/XShm.h>
+#include <X11/Xresource.h> // xres - dpi
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include "evas_common.h"
+#include "evas_common_soft16.h"
+
+extern int _evas_engine_soft16_x11_log_dom;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_soft16_x11_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_soft16_x11_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_soft16_x11_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_soft16_x11_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_soft16_x11_log_dom, __VA_ARGS__)
+
+typedef struct _X_Output_Buffer       X_Output_Buffer;
+
+struct _X_Output_Buffer
+{
+   Soft16_Image    *im;
+   Display         *display;
+   XImage          *xim;
+   XShmSegmentInfo *shm_info;
+   void            *data;
+};
+
+/****/
+void             evas_software_x11_x_init                        (void);
+
+int              evas_software_x11_x_can_do_shm                  (Display *d);
+X_Output_Buffer *evas_software_x11_x_output_buffer_new           (Display *d, Visual *v, int depth, int w, int h, int try_shm, void *data);
+void             evas_software_x11_x_output_buffer_free          (X_Output_Buffer *xob, int sync);
+void             evas_software_x11_x_output_buffer_paste         (X_Output_Buffer *xob, Drawable d, GC gc, int x, int y, int w, int h, int sync);
+DATA8           *evas_software_x11_x_output_buffer_data          (X_Output_Buffer *xob, int *bytes_per_line_ret);
+int              evas_software_x11_x_output_buffer_depth         (X_Output_Buffer *xob);
+int              evas_software_x11_x_output_buffer_byte_order    (X_Output_Buffer *xob);
+int              evas_software_x11_x_output_buffer_bit_order     (X_Output_Buffer *xob);
+
+#endif
diff --git a/src/modules/engines/software_16_x11/evas_x_buffer.c b/src/modules/engines/software_16_x11/evas_x_buffer.c
new file mode 100644 (file)
index 0000000..8e569f7
--- /dev/null
@@ -0,0 +1,186 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+static int _x_err = 0;
+
+int
+evas_software_x11_x_can_do_shm(Display *d)
+{
+   static Display *cached_d = NULL;
+   static int cached_result = 0;
+   
+   if (d == cached_d) return cached_result;
+   cached_d = d;
+   if (XShmQueryExtension(d))
+     {
+       X_Output_Buffer *xob;
+
+       xob = evas_software_x11_x_output_buffer_new
+         (d, DefaultVisual(d, DefaultScreen(d)),
+          DefaultDepth(d, DefaultScreen(d)), 16, 16, 2, NULL);
+       if (!xob)
+         {
+            cached_result = 0;
+            return 0;
+         }
+       evas_software_x11_x_output_buffer_free(xob, 1);
+       cached_result = 1;
+       return 1;
+     }
+   cached_result = 0;
+   return 0;
+}
+
+static void
+x_output_tmp_x_err(Display * d __UNUSED__, XErrorEvent * ev __UNUSED__)
+{
+   _x_err = 1;
+   return;
+}
+
+X_Output_Buffer *
+evas_software_x11_x_output_buffer_new(Display *d, Visual *v, int depth, int w, int h, int try_shm, void *data)
+{
+   X_Output_Buffer *xob;
+
+   xob = calloc(1, sizeof(X_Output_Buffer));
+   if (!xob) return NULL;
+
+   xob->display = d;
+   xob->xim = NULL;
+   xob->shm_info = NULL;
+
+   if (try_shm > 0)
+     {
+       xob->shm_info = malloc(sizeof(XShmSegmentInfo));
+       if (xob->shm_info)
+         {
+            xob->xim = XShmCreateImage(d, v, depth, ZPixmap, NULL,
+                                       xob->shm_info, w, h);
+            if (xob->xim)
+              {
+                 xob->shm_info->shmid = shmget(IPC_PRIVATE,
+                                               xob->xim->bytes_per_line *
+                                               xob->xim->height,
+                                               IPC_CREAT | 0777);
+                 if (xob->shm_info->shmid >= 0)
+                   {
+                      xob->shm_info->readOnly = False;
+                      xob->shm_info->shmaddr = xob->xim->data =
+                        shmat(xob->shm_info->shmid, 0, 0);
+                      if (xob->shm_info->shmaddr != NULL)
+                        {
+                           XErrorHandler ph;
+
+                           XSync(d, False);
+                           _x_err = 0;
+                           ph = XSetErrorHandler((XErrorHandler)
+                                                 x_output_tmp_x_err);
+                           XShmAttach(d, xob->shm_info);
+                           XSync(d, False);
+                           XSetErrorHandler((XErrorHandler)ph);
+                           if (!_x_err)
+                             {
+                                 xob->im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), w, h, (DATA32 *) xob->xim->data, 0, EVAS_COLORSPACE_RGB565_A5P);
+                                 if (xob->im)
+                                   xob->im->stride = xob->xim->bytes_per_line / sizeof(DATA16);
+                                return xob;
+                             }
+                        }
+                      shmdt(xob->shm_info->shmaddr);
+                      shmctl(xob->shm_info->shmid, IPC_RMID, 0);
+                   }
+                 if (xob->xim) XDestroyImage(xob->xim);
+                 xob->xim = NULL;
+              }
+            if (xob->shm_info) free(xob->shm_info);
+            xob->shm_info = NULL;
+         }
+     }
+
+   if (try_shm > 1) return NULL;
+
+   xob->xim = XCreateImage(d, v, depth, ZPixmap, 0, data, w, h, 32, 0);
+   if (!xob->xim)
+     {
+       free(xob);
+       return NULL;
+     }
+
+   xob->data = data;
+
+   if (!xob->xim->data)
+     {
+       xob->xim->data = malloc(xob->xim->bytes_per_line * xob->xim->height);
+       if (!xob->xim->data)
+         {
+            XDestroyImage(xob->xim);
+            free(xob);
+            return NULL;
+         }
+     }
+   if (xob->im)
+     evas_cache_image_drop(&xob->im->cache_entry);
+
+   xob->im =  (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), w, h, (DATA32 *) xob->xim->data, 0, EVAS_COLORSPACE_RGB565_A5P);
+   if (xob->im)
+     xob->im->stride = xob->xim->bytes_per_line / sizeof(DATA16);
+   return xob;
+}
+
+void
+evas_software_x11_x_output_buffer_free(X_Output_Buffer *xob, int sync)
+{
+   if (xob->shm_info)
+     {
+       if (sync) XSync(xob->display, False);
+       XShmDetach(xob->display, xob->shm_info);
+       XDestroyImage(xob->xim);
+       shmdt(xob->shm_info->shmaddr);
+       shmctl(xob->shm_info->shmid, IPC_RMID, 0);
+       free(xob->shm_info);
+     }
+   else
+     {
+       if (xob->data) xob->xim->data = NULL;
+       XDestroyImage(xob->xim);
+     }
+   free(xob);
+}
+
+void
+evas_software_x11_x_output_buffer_paste(X_Output_Buffer *xob, Drawable d, GC gc, int x, int y, int w, int h, int sync)
+{
+   if (xob->shm_info)
+     {
+       XShmPutImage(xob->display, d, gc, xob->xim, 0, 0, x, y, w, h, False);
+       if (sync) XSync(xob->display, False);
+     }
+   else
+     XPutImage(xob->display, d, gc, xob->xim, 0, 0, x, y, w, h);
+}
+
+DATA8 *
+evas_software_x11_x_output_buffer_data(X_Output_Buffer *xob, int *bytes_per_line_ret)
+{
+   if (bytes_per_line_ret) *bytes_per_line_ret = xob->xim->bytes_per_line;
+   return (DATA8*) xob->xim->data;
+}
+
+int
+evas_software_x11_x_output_buffer_depth(X_Output_Buffer *xob)
+{
+   return xob->xim->bits_per_pixel;
+}
+
+int
+evas_software_x11_x_output_buffer_byte_order(X_Output_Buffer *xob)
+{
+   return xob->xim->byte_order;
+}
+
+int
+evas_software_x11_x_output_buffer_bit_order(X_Output_Buffer *xob)
+{
+   return xob->xim->bitmap_bit_order;
+}
diff --git a/src/modules/engines/software_ddraw/.cvsignore b/src/modules/engines/software_ddraw/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/engines/software_ddraw/Evas_Engine_Software_DDraw.h b/src/modules/engines/software_ddraw/Evas_Engine_Software_DDraw.h
new file mode 100644 (file)
index 0000000..e06ef4e
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef __EVAS_ENGINE_SOFTWARE_DDRAW_H__
+#define __EVAS_ENGINE_SOFTWARE_DDRAW_H__
+
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+
+
+typedef struct _Evas_Engine_Info_Software_DDraw Evas_Engine_Info_Software_DDraw;
+
+struct _Evas_Engine_Info_Software_DDraw
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   struct {
+      HWND         window;
+      int          depth;
+      int          rotation;
+      unsigned int fullscreen : 1;
+   } info;
+};
+
+
+#endif /* __EVAS_ENGINE_SOFTWARE_DDRAW_H__ */
diff --git a/src/modules/engines/software_ddraw/Makefile.am b/src/modules/engines/software_ddraw/Makefile.am
new file mode 100644 (file)
index 0000000..5a3a266
--- /dev/null
@@ -0,0 +1,46 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines \
+@EINA_CFLAGS@ \
+@FREETYPE_CFLAGS@ \
+@evas_engine_software_ddraw_cflags@
+
+if BUILD_ENGINE_SOFTWARE_DDRAW
+
+SOFTWARE_DDRAW_SOURCES = \
+evas_engine.c \
+evas_outbuf.c \
+evas_ddraw_buffer.c \
+evas_ddraw_main.cpp
+
+SOFTWARE_DDRAW_LIBADD = @evas_engine_software_ddraw_libs@
+
+pkgdir = $(libdir)/evas/modules/engines/software_ddraw/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_Software_DDraw.h
+
+if !EVAS_STATIC_BUILD_SOFTWARE_DDRAW
+
+pkg_LTLIBRARIES = module.la
+module_la_SOURCES = $(SOFTWARE_DDRAW_SOURCES)
+module_la_CXXFLAGS = -fno-rtti -fno-exceptions
+module_la_LIBADD = @EINA_LIBS@ $(SOFTWARE_DDRAW_LIBADD) $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = @lt_enable_auto_import@ -no-undefined -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_software_ddraw.la
+
+libevas_engine_software_ddraw_la_SOURCES = $(SOFTWARE_DDRAW_SOURCES)
+libevas_engine_software_ddraw_la_LIBADD = $(SOFTWARE_DDRAW_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/software_ddraw/evas_ddraw_buffer.c b/src/modules/engines/software_ddraw/evas_ddraw_buffer.c
new file mode 100644 (file)
index 0000000..7ef9211
--- /dev/null
@@ -0,0 +1,92 @@
+#include <string.h>
+
+#include "evas_common.h"
+#include "evas_engine.h"
+
+
+DD_Output_Buffer *
+evas_software_ddraw_output_buffer_new(int   depth,
+                                      int   width,
+                                      int   height,
+                                      void *data)
+{
+   DD_Output_Buffer *ddob;
+
+   ddob = calloc(1, sizeof(DD_Output_Buffer));
+   if (!ddob) return NULL;
+
+   ddob->data = data;
+   ddob->depth = depth;
+   ddob->width = width;
+   ddob->height = height;
+   ddob->pitch = width * depth / 8;
+   ddob->psize = ddob->pitch * height;
+
+   if (!ddob->data)
+     {
+        ddob->data = malloc(ddob->pitch * height);
+        if (!ddob->data)
+          {
+            free(ddob);
+            return NULL;
+          }
+     }
+
+   return ddob;
+}
+
+void
+evas_software_ddraw_output_buffer_free(DD_Output_Buffer *ddob)
+{
+   if (ddob->data) free(ddob->data);
+   free(ddob);
+}
+
+void
+evas_software_ddraw_output_buffer_paste(DD_Output_Buffer *ddob,
+                                        void             *ddraw_data,
+                                        int               ddraw_width,
+                                        int               ddraw_height,
+                                        int               ddraw_pitch,
+                                        int               ddraw_depth,
+                                        int               x,
+                                        int               y)
+{
+   DATA8 *dd_data;
+   DATA8 *evas_data;
+   int    width;
+   int    height;
+   int    pitch;
+   int    j;
+
+   if ((x >= ddraw_width) || (y >= ddraw_height))
+     return;
+
+   /* compute the size of the data to copy on the back surface */
+   width = ((x + ddob->width) > ddraw_width)
+     ? ddraw_width - x
+     : ddob->width;
+   height = ((y + ddob->height) > ddraw_height)
+     ? ddraw_height - y
+     : ddob->height;
+   pitch = width * ddob->depth / 8;
+
+   dd_data = (DATA8 *)ddraw_data + y * ddraw_pitch + x * ddraw_depth;
+   evas_data = (unsigned char *)ddob->data;
+   for (j = 0; j < height; j++, evas_data += ddob->pitch, dd_data += ddraw_pitch)
+     memcpy(dd_data, evas_data, pitch);
+}
+
+DATA8 *
+evas_software_ddraw_output_buffer_data(DD_Output_Buffer *ddob,
+                                       int              *bytes_per_line_ret)
+{
+   if (bytes_per_line_ret) *bytes_per_line_ret = ddob->pitch;
+   return ddob->data;
+}
+
+int
+evas_software_ddraw_output_buffer_depth(DD_Output_Buffer *ddob)
+{
+   return ddob->depth;
+}
diff --git a/src/modules/engines/software_ddraw/evas_ddraw_main.cpp b/src/modules/engines/software_ddraw/evas_ddraw_main.cpp
new file mode 100644 (file)
index 0000000..bf99b9c
--- /dev/null
@@ -0,0 +1,248 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+int
+evas_software_ddraw_init (HWND    window,
+                          int     depth,
+                          int     fullscreen,
+                          Outbuf *buf)
+{
+   DDSURFACEDESC  surface_desc;
+   DDPIXELFORMAT  pixel_format;
+   HRESULT        res;
+   int            width;
+   int            height;
+
+   if (!buf)
+     return 0;
+
+   buf->priv.dd.window = window;
+
+   res = DirectDrawCreate(NULL, &buf->priv.dd.object, NULL);
+   if (FAILED(res))
+     return 0;
+
+   if (buf->priv.dd.fullscreen)
+     {
+        DDSCAPS caps;
+
+        res = buf->priv.dd.object->SetCooperativeLevel(window,
+                                                       DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+        if (FAILED(res))
+          goto release_object;
+
+        width = GetSystemMetrics(SM_CXSCREEN);
+        height = GetSystemMetrics(SM_CYSCREEN);
+
+        ZeroMemory(&pixel_format, sizeof(pixel_format));
+        pixel_format.dwSize = sizeof(pixel_format);
+        buf->priv.dd.surface_primary->GetPixelFormat(&pixel_format);
+
+        if (pixel_format.dwRGBBitCount != depth)
+          goto release_object;
+
+        buf->priv.dd.depth = depth;
+
+        res = buf->priv.dd.object->SetDisplayMode(width, height, depth);
+        if (FAILED(res))
+          goto release_object;
+
+        memset(&surface_desc, 0, sizeof(surface_desc));
+        surface_desc.dwSize = sizeof(surface_desc);
+        surface_desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
+        surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
+        surface_desc.dwBackBufferCount = 1;
+
+        res = buf->priv.dd.object->CreateSurface(&surface_desc,
+                                                 &buf->priv.dd.surface_primary, NULL);
+        if (FAILED(res))
+          goto release_object;
+
+        caps.dwCaps = DDSCAPS_BACKBUFFER;
+        res = buf->priv.dd.surface_primary->GetAttachedSurface(&caps,
+                                                               &buf->priv.dd.surface_back);
+        if (FAILED(res))
+          goto release_surface_primary;
+     }
+   else
+     {
+        RECT           rect;
+
+        if (!GetClientRect(window, &rect))
+          goto release_object;
+
+        width = rect.right - rect.left;
+        height = rect.bottom - rect.top;
+
+        res = buf->priv.dd.object->SetCooperativeLevel(window, DDSCL_NORMAL);
+        if (FAILED(res))
+          goto release_object;
+
+        res = buf->priv.dd.object->CreateClipper(0, &buf->priv.dd.clipper, NULL);
+        if (FAILED(res))
+          goto release_object;
+
+        res = buf->priv.dd.clipper->SetHWnd(0, window);
+        if (FAILED(res))
+          goto release_clipper;
+
+        memset(&surface_desc, 0, sizeof(surface_desc));
+        surface_desc.dwSize = sizeof(surface_desc);
+        surface_desc.dwFlags = DDSD_CAPS;
+        surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
+
+        res = buf->priv.dd.object->CreateSurface(&surface_desc, &buf->priv.dd.surface_primary, NULL);
+        if (FAILED(res))
+          goto release_clipper;
+
+        res = buf->priv.dd.surface_primary->SetClipper(buf->priv.dd.clipper);
+        if (FAILED(res))
+          goto release_surface_primary;
+
+        memset (&surface_desc, 0, sizeof(surface_desc));
+        surface_desc.dwSize = sizeof(surface_desc);
+        surface_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
+        surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
+        surface_desc.dwWidth = width;
+        surface_desc.dwHeight = height;
+
+        res = buf->priv.dd.object->CreateSurface(&surface_desc, &buf->priv.dd.surface_back, NULL);
+        if (FAILED(res))
+          goto release_surface_primary;
+
+        ZeroMemory(&pixel_format, sizeof(pixel_format));
+        pixel_format.dwSize = sizeof(pixel_format);
+        buf->priv.dd.surface_primary->GetPixelFormat(&pixel_format);
+
+        if (pixel_format.dwRGBBitCount != depth)
+          goto release_surface_back;
+
+        buf->priv.dd.depth = depth;
+     }
+
+   return 1;
+
+ release_surface_back:
+   buf->priv.dd.surface_back->Release();
+ release_surface_primary:
+   buf->priv.dd.surface_primary->Release();
+ release_clipper:
+   if (!buf->priv.dd.fullscreen)
+     buf->priv.dd.clipper->Release();
+ release_object:
+   buf->priv.dd.object->Release();
+
+   return 0;
+}
+
+void
+evas_software_ddraw_shutdown(Outbuf *buf)
+{
+   if (!buf)
+     return;
+
+   if (buf->priv.dd.fullscreen)
+     if (buf->priv.dd.surface_back)
+       buf->priv.dd.surface_back->Release();
+   if (buf->priv.dd.surface_primary)
+     buf->priv.dd.surface_primary->Release();
+   if (!buf->priv.dd.fullscreen)
+     if (buf->priv.dd.clipper)
+       buf->priv.dd.clipper->Release();
+   if (buf->priv.dd.object)
+     buf->priv.dd.object->Release();
+}
+
+int
+evas_software_ddraw_masks_get(Outbuf *buf)
+{
+   DDPIXELFORMAT pixel_format;
+
+   ZeroMemory(&pixel_format, sizeof(pixel_format));
+   pixel_format.dwSize = sizeof(pixel_format);
+
+   if (FAILED(buf->priv.dd.surface_primary->GetPixelFormat(&pixel_format)))
+     return 0;
+
+   buf->priv.mask.r = pixel_format.dwRBitMask;
+   buf->priv.mask.g = pixel_format.dwGBitMask;
+   buf->priv.mask.b = pixel_format.dwBBitMask;
+
+   return 1;
+}
+
+void *
+evas_software_ddraw_lock(Outbuf *buf,
+                         int    *ddraw_width,
+                         int    *ddraw_height,
+                         int    *ddraw_pitch,
+                         int    *ddraw_depth)
+{
+   DDSURFACEDESC surface_desc;
+
+   ZeroMemory(&surface_desc, sizeof(surface_desc));
+   surface_desc.dwSize = sizeof(surface_desc);
+
+   if (FAILED(buf->priv.dd.surface_back->Lock(NULL,
+                                              &surface_desc,
+                                              DDLOCK_WAIT | DDLOCK_WRITEONLY | DDLOCK_SURFACEMEMORYPTR | DDLOCK_NOSYSLOCK,
+                                              NULL)))
+     return NULL;
+
+   *ddraw_width = surface_desc.dwWidth;
+   *ddraw_height = surface_desc.dwHeight;
+   *ddraw_pitch = surface_desc.lPitch;
+   *ddraw_depth = surface_desc.ddpfPixelFormat.dwRGBBitCount >> 3;
+
+   return surface_desc.lpSurface;
+}
+
+void
+evas_software_ddraw_unlock_and_flip(Outbuf *buf)
+{
+   RECT    dst_rect;
+   RECT    src_rect;
+   POINT   p;
+
+   if (FAILED(buf->priv.dd.surface_back->Unlock(NULL)))
+     return;
+
+   /* we figure out where on the primary surface our window lives */
+   p.x = 0;
+   p.y = 0;
+   ClientToScreen(buf->priv.dd.window, &p);
+   GetClientRect(buf->priv.dd.window, &dst_rect);
+   OffsetRect(&dst_rect, p.x, p.y);
+   SetRect(&src_rect, 0, 0, buf->width, buf->height);
+
+   /* nothing to do if the function fails, so we don't check the result */
+   buf->priv.dd.surface_primary->Blt(&dst_rect,
+                                     buf->priv.dd.surface_back,
+                                     &src_rect,
+                                     DDBLT_WAIT, NULL);
+}
+
+void
+evas_software_ddraw_surface_resize(Outbuf *buf)
+{
+   DDSURFACEDESC surface_desc;
+
+   buf->priv.dd.surface_back->Release();
+   memset (&surface_desc, 0, sizeof (surface_desc));
+   surface_desc.dwSize = sizeof (surface_desc);
+   /* FIXME: that code does not compile. Must know why */
+#if 0
+   surface_desc.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
+   surface_desc.dwWidth = width;
+   surface_desc.dwHeight = height;
+   buf->priv.dd.surface_back->SetSurfaceDesc(&surface_desc, NULL);
+#else
+   surface_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
+   surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
+   surface_desc.dwWidth = buf->width;
+   surface_desc.dwHeight = buf->height;
+   buf->priv.dd.object->CreateSurface(&surface_desc,
+                                      &buf->priv.dd.surface_back,
+                                      NULL);
+#endif
+}
diff --git a/src/modules/engines/software_ddraw/evas_engine.c b/src/modules/engines/software_ddraw/evas_engine.c
new file mode 100644 (file)
index 0000000..426f949
--- /dev/null
@@ -0,0 +1,378 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_Software_DDraw.h"
+
+int _evas_engine_soft_ddraw_log_dom = -1;
+/* function tables - filled in later (func and parent func) */
+static Evas_Func func, pfunc;
+
+/* engine struct data */
+typedef struct _Render_Engine Render_Engine;
+
+struct _Render_Engine
+{
+   Tilebuf          *tb;
+   Outbuf           *ob;
+   Tilebuf_Rect     *rects;
+   Eina_Inlist      *cur_rect;
+   int               end : 1;
+};
+
+
+/* log domain variable */
+int _evas_log_dom_module = -1;
+
+
+static void *
+_output_setup(int  width,
+              int  height,
+              int  rot,
+              HWND window,
+              int  depth,
+              int  fullscreen)
+{
+   Render_Engine *re;
+
+   re = calloc(1, sizeof(Render_Engine));
+   if (!re)
+     return NULL;
+
+   /* if we haven't initialized - init (automatic abort if already done) */
+   evas_common_cpu_init();
+
+   evas_common_blend_init();
+   evas_common_image_init();
+   evas_common_convert_init();
+   evas_common_scale_init();
+   evas_common_rectangle_init();
+   evas_common_gradient_init();
+   evas_common_polygon_init();
+   evas_common_line_init();
+   evas_common_font_init();
+   evas_common_draw_init();
+   evas_common_tilebuf_init();
+
+   evas_software_ddraw_outbuf_init();
+
+   re->ob = evas_software_ddraw_outbuf_setup(width, height, rot,
+                                             OUTBUF_DEPTH_INHERIT,
+                                             window, depth, fullscreen);
+   if (!re->ob)
+     {
+       free(re);
+       return NULL;
+     }
+
+   /* for updates return 1 big buffer, but only use portions of it, also cache
+    it and keep it around until an idle_flush */
+   /* disable for now - i am hunting down why some expedite tests are slower,
+    * as well as shaped stuff is broken and probable non-32bpp is broken as
+    * convert funcs dont do the right thing
+    *
+   re->ob->onebuf = 1;
+    */
+
+   re->tb = evas_common_tilebuf_new(width, height);
+   if (!re->tb)
+     {
+       evas_software_ddraw_outbuf_free(re->ob);
+       free(re);
+       return NULL;
+     }
+   /* in preliminary tests 16x16 gave highest framerates */
+   evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+
+   return re;
+}
+
+
+/* engine api this module provides */
+
+static void *
+eng_info(Evas *e)
+{
+   Evas_Engine_Info_Software_DDraw *info;
+
+   info = calloc(1, sizeof(Evas_Engine_Info_Software_DDraw));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   return info;
+   e = NULL;
+}
+
+static void
+eng_info_free(Evas *e, void *info)
+{
+   Evas_Engine_Info_Software_DDraw *in;
+   in = (Evas_Engine_Info_Software_DDraw *)info;
+   free(in);
+}
+
+static int
+eng_setup(Evas *e, void *in)
+{
+   Render_Engine                   *re;
+   Evas_Engine_Info_Software_DDraw *info;
+
+   info = (Evas_Engine_Info_Software_DDraw *)in;
+   if (!e->engine.data.output)
+     e->engine.data.output = _output_setup(e->output.w,
+                                           e->output.h,
+                                           info->info.rotation,
+                                           info->info.window,
+                                           info->info.depth,
+                                           info->info.fullscreen);
+   else
+     {
+       int ponebuf = 0;
+
+       re = e->engine.data.output;
+       ponebuf = re->ob->onebuf;
+       evas_software_ddraw_outbuf_free(re->ob);
+       re->ob = evas_software_ddraw_outbuf_setup(e->output.w,
+                                                  e->output.h,
+                                                  info->info.rotation,
+                                                  OUTBUF_DEPTH_INHERIT,
+                                                  info->info.window,
+                                                  info->info.depth,
+                                                  info->info.fullscreen);
+       re->ob->onebuf = ponebuf;
+     }
+   if (!e->engine.data.output) return 0;
+   if (!e->engine.data.context)
+     e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
+
+   re = e->engine.data.output;
+
+   return 1;
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re;
+
+   if (!data) return;
+
+   re = (Render_Engine *)data;
+   evas_software_ddraw_outbuf_free(re->ob);
+   evas_common_tilebuf_free(re->tb);
+   if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+}
+
+static void
+eng_output_resize(void *data, int width, int height)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_software_ddraw_outbuf_reconfigure(re->ob,
+                                         width,
+                                         height,
+                                          evas_software_ddraw_outbuf_rot_get(re->ob),
+                                          OUTBUF_DEPTH_INHERIT);
+   evas_common_tilebuf_free(re->tb);
+   re->tb = evas_common_tilebuf_new(width, height);
+   if (re->tb)
+     evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+}
+
+static void
+eng_output_tile_size_set(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_set_tile_size(re->tb, w, h);
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_clear(re->tb);
+}
+
+static void *
+eng_output_redraws_next_update_get(void *data,
+                                   int  *x,
+                                   int  *y,
+                                   int  *w,
+                                   int  *h,
+                                   int  *cx,
+                                   int  *cy,
+                                   int  *cw,
+                                   int  *ch)
+{
+   Render_Engine *re;
+   RGBA_Image    *surface;
+   Tilebuf_Rect  *rect;
+   int            ux;
+   int            uy;
+   int            uw;
+   int            uh;
+
+   re = (Render_Engine *)data;
+   if (re->end)
+     {
+       re->end = 0;
+       return NULL;
+     }
+   if (!re->rects)
+     {
+       re->rects = evas_common_tilebuf_get_render_rects(re->tb);
+       re->cur_rect = EINA_INLIST_GET(re->rects);
+     }
+   if (!re->cur_rect) return NULL;
+   rect = (Tilebuf_Rect *)re->cur_rect;
+   ux = rect->x;
+   uy = rect->y;
+   uw = rect->w;
+   uh = rect->h;
+   re->cur_rect = re->cur_rect->next;
+   if (!re->cur_rect)
+     {
+       evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       re->end = 1;
+     }
+
+   surface = evas_software_ddraw_outbuf_new_region_for_update(re->ob,
+                                                              ux,
+                                                              uy,
+                                                              uw,
+                                                              uh,
+                                                              cx,
+                                                              cy,
+                                                              cw,
+                                                              ch);
+
+   *x = ux;
+   *y = uy;
+   *w = uw;
+   *h = uh;
+
+   return surface;
+}
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+#ifdef BUILD_PIPE_RENDER
+   evas_common_pipe_map4_begin(surface);
+#endif   
+   evas_software_ddraw_outbuf_push_updated_region(re->ob, surface, x, y, w, h);
+   evas_software_ddraw_outbuf_free_region_for_update(re->ob, surface);
+   evas_common_cpu_end_opt();
+}
+
+static void
+eng_output_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_software_ddraw_outbuf_flush(re->ob);
+}
+
+static void
+eng_output_idle_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_software_ddraw_outbuf_idle_flush(re->ob);
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data, void *context)
+{
+   return EINA_FALSE;
+}
+
+/* module advertising code */
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
+   _evas_log_dom_module = eina_log_domain_register("Software_DDraw", EVAS_DEFAULT_LOG_COLOR);
+   if(_evas_log_dom_module < 0)
+     {
+       EINA_LOG_ERR("Can not create a module log domain.");
+       return 0;
+     }
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(canvas_alpha_get);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+  eina_log_domain_unregister(_evas_log_dom_module);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "software_ddraw",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_ddraw);
+
+#ifndef EVAS_STATIC_BUILD_SOFTWARE_DDRAW
+EVAS_EINA_MODULE_DEFINE(engine, software_ddraw);
+#endif
diff --git a/src/modules/engines/software_ddraw/evas_engine.h b/src/modules/engines/software_ddraw/evas_engine.h
new file mode 100644 (file)
index 0000000..2f59170
--- /dev/null
@@ -0,0 +1,220 @@
+#ifndef __EVAS_ENGINE_H__
+#define __EVAS_ENGINE_H__
+
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#include <ddraw.h>
+
+typedef struct _Outbuf                Outbuf;
+typedef struct _Outbuf_Region         Outbuf_Region;
+typedef struct _DD_Output_Buffer      DD_Output_Buffer;
+
+enum _Outbuf_Depth
+{
+   OUTBUF_DEPTH_NONE,
+   OUTBUF_DEPTH_INHERIT,
+   OUTBUF_DEPTH_RGB_16BPP_565_565_DITHERED,
+   OUTBUF_DEPTH_RGB_16BPP_555_555_DITHERED,
+   OUTBUF_DEPTH_RGB_16BPP_444_444_DITHERED,
+   OUTBUF_DEPTH_RGB_16BPP_565_444_DITHERED,
+   OUTBUF_DEPTH_RGB_32BPP_888_8888,
+   OUTBUF_DEPTH_LAST
+};
+
+typedef enum   _Outbuf_Depth          Outbuf_Depth;
+
+struct _Outbuf
+{
+   Outbuf_Depth              depth;
+   int                       width;
+   int                       height;
+   int                       rot;
+   int                       onebuf;
+
+   struct {
+      Convert_Pal           *pal;
+      struct {
+         HWND                window;
+         LPDIRECTDRAW        object;
+         LPDIRECTDRAWSURFACE surface_primary;
+         LPDIRECTDRAWSURFACE surface_back;
+         LPDIRECTDRAWCLIPPER clipper;
+         int                 depth;
+         unsigned char       fullscreen : 1;
+         unsigned char       swap       : 1;
+         unsigned char       bit_swap   : 1;
+      } dd;
+      struct {
+         DATA32              r, g, b;
+      } mask;
+
+      /* 1 big buffer for updates - flush on idle_flush */
+      RGBA_Image            *onebuf;
+      Eina_List             *onebuf_regions;
+
+      /* a list of pending regions to write to the target */
+      Eina_List             *pending_writes;
+      /* a list of previous frame pending regions to write to the target */
+      Eina_List             *prev_pending_writes;
+
+      unsigned char          mask_dither       : 1;
+      unsigned char          destination_alpha : 1;
+      unsigned char          debug             : 1;
+      unsigned char          synced            : 1;
+   } priv;
+};
+
+struct _Outbuf_Region
+{
+   DD_Output_Buffer *ddob;
+   int               x;
+   int               y;
+   int               width;
+   int               height;
+};
+
+struct _DD_Output_Buffer
+{
+   void *data;
+   int   width;
+   int   height;
+   int   depth;
+   int   pitch;
+   int   psize;
+};
+
+extern int _evas_log_dom_module;
+
+#ifdef EVAS_DEFAULT_LOG_COLOR
+# undef EVAS_DEFAULT_LOG_COLOR
+#endif
+#define EVAS_DEFAULT_LOG_COLOR EINA_COLOR_CYAN
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_log_dom_module, __VA_ARGS__)
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_log_dom_module, __VA_ARGS__)
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_log_dom_module, __VA_ARGS__)
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_log_dom_module, __VA_ARGS__)
+#ifdef CRT
+# undef CRT
+#endif
+#define CRT(...) EINA_LOG_DOM_CRIT(_evas_log_dom_module, __VA_ARGS__)
+
+/* evas_outbuf.c */
+
+void evas_software_ddraw_outbuf_init(void);
+
+void evas_software_ddraw_outbuf_free(Outbuf *buf);
+
+Outbuf *evas_software_ddraw_outbuf_setup(int          width,
+                                         int          height,
+                                         int          rotation,
+                                         Outbuf_Depth depth,
+                                         HWND         window,
+                                         int          w_depth,
+                                         int          fullscreen);
+
+void evas_software_ddraw_outbuf_reconfigure(Outbuf      *buf,
+                                            int          width,
+                                            int          height,
+                                            int          rotation,
+                                            Outbuf_Depth depth);
+
+RGBA_Image *evas_software_ddraw_outbuf_new_region_for_update(Outbuf *buf,
+                                                             int     x,
+                                                             int     y,
+                                                             int     w,
+                                                             int     h,
+                                                             int    *cx,
+                                                             int    *cy,
+                                                             int    *cw,
+                                                             int    *ch);
+
+void evas_software_ddraw_outbuf_push_updated_region(Outbuf     *buf,
+                                                    RGBA_Image *update,
+                                                    int        x,
+                                                    int        y,
+                                                    int        w,
+                                                    int        h);
+
+void evas_software_ddraw_outbuf_free_region_for_update(Outbuf     *buf,
+                                                       RGBA_Image *update);
+
+void evas_software_ddraw_outbuf_flush(Outbuf *buf);
+
+void evas_software_ddraw_outbuf_idle_flush(Outbuf *buf);
+
+int evas_software_ddraw_outbuf_width_get(Outbuf *buf);
+
+int evas_software_ddraw_outbuf_height_get(Outbuf *buf);
+
+Outbuf_Depth evas_software_ddraw_outbuf_depth_get(Outbuf *buf);
+
+int evas_software_ddraw_outbuf_rot_get(Outbuf *buf);
+
+/* evas_ddraw_buffer.c */
+
+DD_Output_Buffer *evas_software_ddraw_output_buffer_new(int   depth,
+                                                        int   width,
+                                                        int   height,
+                                                        void *data);
+
+void evas_software_ddraw_output_buffer_free(DD_Output_Buffer *ddob);
+
+void evas_software_ddraw_output_buffer_paste(DD_Output_Buffer *ddob,
+                                             void             *ddraw_data,
+                                             int               ddraw_width,
+                                             int               ddraw_height,
+                                             int               ddraw_pitch,
+                                             int               ddraw_depth,
+                                             int               x,
+                                             int               y);
+
+DATA8 *evas_software_ddraw_output_buffer_data(DD_Output_Buffer *ddob,
+                                              int              *bytes_per_line_ret);
+
+int evas_software_ddraw_output_buffer_depth(DD_Output_Buffer *ddob);
+
+/* evas_ddraw_main.cpp */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int evas_software_ddraw_init (HWND    window,
+                              int     depth,
+                              int     fullscreen,
+                              Outbuf *buf);
+
+void evas_software_ddraw_shutdown(Outbuf *buf);
+
+int evas_software_ddraw_masks_get(Outbuf *buf);
+
+void *evas_software_ddraw_lock(Outbuf *buf,
+                               int    *ddraw_width,
+                               int    *ddraw_height,
+                               int    *ddraw_pitch,
+                               int    *ddraw_depth);
+
+void evas_software_ddraw_unlock_and_flip(Outbuf *buf);
+
+void evas_software_ddraw_surface_resize(Outbuf *buf);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __EVAS_ENGINE_H__ */
diff --git a/src/modules/engines/software_ddraw/evas_outbuf.c b/src/modules/engines/software_ddraw/evas_outbuf.c
new file mode 100644 (file)
index 0000000..ce45907
--- /dev/null
@@ -0,0 +1,460 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+
+static Eina_List *ddpool = NULL;
+static int ddsize = 0;
+static int ddmemlimit = 10 * 1024 * 1024;
+static int ddcountlimit = 32;
+
+static DD_Output_Buffer *
+_find_ddob(int depth, int w, int h, void *data)
+{
+   Eina_List        *l;
+   Eina_List        *ddl;
+   DD_Output_Buffer *ddob = NULL;
+   DD_Output_Buffer *ddob2;
+   int               sz;
+   int               lbytes;
+   int               bpp;
+
+   bpp = depth / 8;
+   if (bpp == 3) bpp = 4;
+   lbytes = (((w * bpp) + 3) / 4) * 4;
+   sz = lbytes * h;
+   EINA_LIST_FOREACH(ddpool, l, ddob2)
+     {
+       if (ddob2->depth != depth)
+         continue;
+       if (ddob2->psize == sz)
+         {
+            ddob = ddob2;
+            ddl = l;
+            goto have_ddob;
+         }
+     }
+   if (!ddob)
+     return evas_software_ddraw_output_buffer_new(depth, w, h, data);
+
+   have_ddob:
+   ddpool = eina_list_remove_list(ddpool, ddl);
+   ddob->width = w;
+   ddob->height = h;
+   ddob->pitch = lbytes;
+   ddsize -= ddob->psize * (ddob->depth / 8);
+
+   return ddob;
+}
+
+static void
+_unfind_ddob(DD_Output_Buffer *ddob)
+{
+   ddpool = eina_list_prepend(ddpool, ddob);
+   ddsize += ddob->psize * ddob->depth / 8;
+   while ((ddsize > (ddmemlimit)) ||
+          (eina_list_count(ddpool) > ddcountlimit))
+     {
+        Eina_List *xl;
+
+        xl = eina_list_last(ddpool);
+        if (!xl)
+          {
+             ddsize = 0;
+             break;
+          }
+        ddob = xl->data;
+        ddpool = eina_list_remove_list(ddpool, xl);
+        evas_software_ddraw_output_buffer_free(ddob);
+     }
+}
+
+static void
+_clear_ddob(int sync)
+{
+   while (ddpool)
+     {
+       DD_Output_Buffer *ddob;
+
+       ddob = ddpool->data;
+       ddpool = eina_list_remove_list(ddpool, ddpool);
+       evas_software_ddraw_output_buffer_free(ddob);
+     }
+   ddsize = 0;
+}
+
+void
+evas_software_ddraw_outbuf_init(void)
+{
+}
+
+void
+evas_software_ddraw_outbuf_free(Outbuf *buf)
+{
+   if (!buf)
+     return;
+
+   evas_software_ddraw_shutdown(buf);
+   free(buf);
+}
+
+Outbuf *
+evas_software_ddraw_outbuf_setup(int          width,
+                                 int          height,
+                                 int          rotation,
+                                 Outbuf_Depth depth,
+                                 HWND         window,
+                                 int          w_depth,
+                                 int          fullscreen)
+{
+   Outbuf *buf;
+
+   buf = (Outbuf *)calloc(1, sizeof(Outbuf));
+   if (!buf)
+      return NULL;
+
+   buf->width = width;
+   buf->height = height;
+   buf->depth = depth;
+   buf->rot = rotation;
+
+   if (!evas_software_ddraw_init(window, w_depth, fullscreen, buf))
+     {
+        free(buf);
+        return NULL;
+     }
+
+   {
+      Gfx_Func_Convert  conv_func;
+      DD_Output_Buffer *ddob;
+
+      ddob = evas_software_ddraw_output_buffer_new(w_depth, 1, 1, NULL);
+
+      conv_func = NULL;
+      if (ddob)
+        {
+           if (evas_software_ddraw_masks_get(buf))
+             {
+                if ((rotation == 0) || (rotation == 180))
+                  conv_func = evas_common_convert_func_get(0,
+                                                           width,
+                                                           height,
+                                                           evas_software_ddraw_output_buffer_depth (ddob),
+                                                           buf->priv.mask.r,
+                                                           buf->priv.mask.g,
+                                                           buf->priv.mask.b,
+                                                           PAL_MODE_NONE,
+                                                           rotation);
+                else if ((rotation == 90) || (rotation == 270))
+                  conv_func = evas_common_convert_func_get(0,
+                                                           height,
+                                                           width,
+                                                           evas_software_ddraw_output_buffer_depth (ddob),
+                                                           buf->priv.mask.r,
+                                                           buf->priv.mask.g,
+                                                           buf->priv.mask.b,
+                                                           PAL_MODE_NONE,
+                                                           rotation);
+             }
+
+           evas_software_ddraw_output_buffer_free(ddob);
+
+           if (!conv_func)
+             {
+                ERR("DDraw engine Error"
+                    " {"
+                    "  At depth         %i:"
+                    "  RGB format mask: %08x, %08x, %08x"
+                    "  Not supported by and compiled in converters!"
+                    " }",
+                    buf->priv.dd.depth,
+                    buf->priv.mask.r,
+                    buf->priv.mask.g,
+                    buf->priv.mask.b);
+             }
+        }
+   }
+
+   return buf;
+}
+
+void
+evas_software_ddraw_outbuf_reconfigure(Outbuf      *buf,
+                                       int          width,
+                                       int          height,
+                                       int          rotation,
+                                       Outbuf_Depth depth)
+{
+   if ((width == buf->width) && (height == buf->height) &&
+       (rotation == buf->rot) && (depth == buf->depth))
+     return;
+   buf->width = width;
+   buf->height = height;
+   buf->rot = rotation;
+   evas_software_ddraw_surface_resize(buf);
+}
+
+RGBA_Image *
+evas_software_ddraw_outbuf_new_region_for_update(Outbuf *buf,
+                                                 int     x,
+                                                 int     y,
+                                                 int     w,
+                                                 int     h,
+                                                 int    *cx,
+                                                 int    *cy,
+                                                 int    *cw,
+                                                 int    *ch)
+{
+   RGBA_Image    *im;
+   Outbuf_Region *obr;
+   int            bpl = 0;
+   int            alpha = 0;
+
+   obr = calloc(1, sizeof(Outbuf_Region));
+   obr->x = x;
+   obr->y = y;
+   obr->width = w;
+   obr->height = h;
+   *cx = 0;
+   *cy = 0;
+   *cw = w;
+   *ch = h;
+
+   if ((buf->rot == 0) &&
+       (buf->priv.mask.r == 0xff0000) &&
+       (buf->priv.mask.g == 0x00ff00) &&
+       (buf->priv.mask.b == 0x0000ff))
+     {
+        obr->ddob = _find_ddob(buf->priv.dd.depth, w, h, NULL);
+/*      obr->ddob = evas_software_x11_x_output_buffer_new(buf->priv.dd.disp, */
+/*                                                         buf->priv.dd.vis, */
+/*                                                         buf->priv.dd.depth, */
+/*                                                         w, h, */
+/*                                                         use_shm, */
+/*                                                         NULL); */
+        im = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(),
+                                                 w, h,
+                                                 (DATA32 *) evas_software_ddraw_output_buffer_data(obr->ddob, &bpl),
+                                                 alpha, EVAS_COLORSPACE_ARGB8888);
+        im->extended_info = obr;
+     }
+   else
+     {
+        im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get());
+        im->cache_entry.flags.alpha |= alpha ? 1 : 0;
+        evas_cache_image_surface_alloc(&im->cache_entry, w, h);
+        im->extended_info = obr;
+        if ((buf->rot == 0) || (buf->rot == 180))
+          obr->ddob = _find_ddob(buf->priv.dd.depth, w, h, NULL);
+/*
+          obr->ddob = evas_software_x11_x_output_buffer_new(buf->priv.dd.disp,
+                                                           buf->priv.dd.vis,
+                                                           buf->priv.dd.depth,
+                                                           w, h,
+                                                           use_shm,
+                                                           NULL);
+ */
+        else if ((buf->rot == 90) || (buf->rot == 270))
+          obr->ddob = _find_ddob(buf->priv.dd.depth, h, w, NULL);
+/*
+          obr->ddob = evas_software_x11_x_output_buffer_new(buf->priv.dd.disp,
+                                                           buf->priv.dd.vis,
+                                                           buf->priv.dd.depth,
+                                                           h, w,
+                                                           use_shm,
+                                                           NULL);
+ */
+     }
+
+   buf->priv.pending_writes = eina_list_append(buf->priv.pending_writes, im);
+   return im;
+}
+
+void
+evas_software_ddraw_outbuf_push_updated_region(Outbuf     *buf,
+                                               RGBA_Image *update,
+                                               int        x,
+                                               int        y,
+                                               int        w,
+                                               int        h)
+{
+   Gfx_Func_Convert    conv_func;
+   Outbuf_Region      *obr;
+   DATA32             *src_data;
+   void               *data;
+   int                 bpl = 0, yy;
+
+   conv_func = NULL;
+   obr = update->extended_info;
+
+   if ((buf->rot == 0) || (buf->rot == 180))
+     conv_func = evas_common_convert_func_get(0, w, h,
+                                              evas_software_ddraw_output_buffer_depth(obr->ddob),
+                                              buf->priv.mask.r,
+                                              buf->priv.mask.g,
+                                              buf->priv.mask.b,
+                                              PAL_MODE_NONE,
+                                              buf->rot);
+   else if ((buf->rot == 90) || (buf->rot == 270))
+     conv_func = evas_common_convert_func_get(0, h, w,
+                                              evas_software_ddraw_output_buffer_depth(obr->ddob),
+                                              buf->priv.mask.r,
+                                              buf->priv.mask.g,
+                                              buf->priv.mask.b,
+                                              PAL_MODE_NONE, buf->rot);
+   if (!conv_func) return;
+
+   data = evas_software_ddraw_output_buffer_data(obr->ddob, &bpl);
+   src_data = update->image.data;
+   if (buf->rot == 0)
+     {
+       obr->x = x;
+       obr->y = y;
+     }
+   else if (buf->rot == 90)
+     {
+       obr->x = y;
+       obr->y = buf->width - x - w;
+     }
+   else if (buf->rot == 180)
+     {
+       obr->x = buf->width - x - w;
+       obr->y = buf->height - y - h;
+     }
+   else if (buf->rot == 270)
+     {
+       obr->x = buf->height - y - h;
+       obr->y = x;
+     }
+   if ((buf->rot == 0) || (buf->rot == 180))
+     {
+       obr->width = w;
+       obr->height = h;
+     }
+   else if ((buf->rot == 90) || (buf->rot == 270))
+     {
+       obr->width = h;
+       obr->height = w;
+     }
+
+   if (data != src_data)
+     conv_func(src_data, data,
+               0,
+               bpl / ((evas_software_ddraw_output_buffer_depth(obr->ddob) / 8)) - obr->width,
+               obr->width,
+               obr->height,
+               x,
+               y,
+               NULL);
+}
+
+void
+evas_software_ddraw_outbuf_free_region_for_update(Outbuf     *buf,
+                                                  RGBA_Image *update)
+{
+   /* no need to do anything - they are cleaned up on flush */
+}
+
+void
+evas_software_ddraw_outbuf_flush(Outbuf *buf)
+{
+   Eina_List *l;
+   RGBA_Image       *im;
+   Outbuf_Region    *obr;
+   void      *ddraw_data;
+   int        ddraw_width;
+   int        ddraw_height;
+   int        ddraw_pitch;
+   int        ddraw_depth;
+
+   /* lock the back surface */
+   if (!(ddraw_data = evas_software_ddraw_lock(buf,
+                                               &ddraw_width,
+                                               &ddraw_height,
+                                               &ddraw_pitch,
+                                               &ddraw_depth)))
+     goto free_images;
+
+   /* copy safely the images that need to be drawn onto the back surface */
+   EINA_LIST_FOREACH(buf->priv.pending_writes, l, im)
+     {
+       DD_Output_Buffer *ddob;
+
+        obr = im->extended_info;
+        ddob = obr->ddob;
+        evas_software_ddraw_output_buffer_paste(ddob,
+                                                ddraw_data,
+                                                ddraw_width,
+                                                ddraw_height,
+                                                ddraw_pitch,
+                                                ddraw_depth,
+                                               obr->x,
+                                               obr->y);
+     }
+
+   /* unlock the back surface and flip the surface */
+   evas_software_ddraw_unlock_and_flip(buf);
+
+ free_images:
+   while (buf->priv.prev_pending_writes)
+     {
+        im = buf->priv.prev_pending_writes->data;
+        buf->priv.prev_pending_writes =
+          eina_list_remove_list(buf->priv.prev_pending_writes,
+                                buf->priv.prev_pending_writes);
+        obr = im->extended_info;
+        evas_cache_image_drop(&im->cache_entry);
+        if (obr->ddob) _unfind_ddob(obr->ddob);
+/*
+            if (obr->ddob) evas_software_x11_x_output_buffer_free(obr->ddob);
+ */
+        free(obr);
+     }
+   buf->priv.prev_pending_writes = buf->priv.pending_writes;
+   buf->priv.pending_writes = NULL;
+
+   evas_common_cpu_end_opt();
+}
+
+void
+evas_software_ddraw_outbuf_idle_flush(Outbuf *buf)
+{
+   while (buf->priv.prev_pending_writes)
+     {
+        RGBA_Image *im;
+        Outbuf_Region *obr;
+
+        im = buf->priv.prev_pending_writes->data;
+        buf->priv.prev_pending_writes =
+          eina_list_remove_list(buf->priv.prev_pending_writes,
+                                buf->priv.prev_pending_writes);
+        obr = im->extended_info;
+        evas_cache_image_drop((Image_Entry *)im);
+        if (obr->ddob) _unfind_ddob(obr->ddob);
+        free(obr);
+     }
+   _clear_ddob(0);
+}
+
+int
+evas_software_ddraw_outbuf_width_get(Outbuf *buf)
+{
+   return buf->width;
+}
+
+int
+evas_software_ddraw_outbuf_height_get(Outbuf *buf)
+{
+   return buf->height;
+}
+
+Outbuf_Depth
+evas_software_ddraw_outbuf_depth_get(Outbuf *buf)
+{
+   return buf->depth;
+}
+
+int
+evas_software_ddraw_outbuf_rot_get(Outbuf *buf)
+{
+   return buf->rot;
+}
diff --git a/src/modules/engines/software_gdi/Evas_Engine_Software_Gdi.h b/src/modules/engines/software_gdi/Evas_Engine_Software_Gdi.h
new file mode 100644 (file)
index 0000000..a95b07e
--- /dev/null
@@ -0,0 +1,29 @@
+#ifndef __EVAS_ENGINE_SOFTWARE_GDI_H__
+#define __EVAS_ENGINE_SOFTWARE_GDI_H__
+
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+
+
+typedef struct _Evas_Engine_Info_Software_Gdi Evas_Engine_Info_Software_Gdi;
+
+struct _Evas_Engine_Info_Software_Gdi
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   struct {
+      HWND         window;
+      HBITMAP      mask;
+      int          depth;
+      int          rotation;
+      unsigned int layered    : 1;
+      unsigned int fullscreen : 1;
+   } info;
+};
+
+
+#endif /* __EVAS_ENGINE_SOFTWARE_GDI_H__ */
diff --git a/src/modules/engines/software_gdi/Makefile.am b/src/modules/engines/software_gdi/Makefile.am
new file mode 100644 (file)
index 0000000..35c4bc8
--- /dev/null
@@ -0,0 +1,45 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines \
+@EINA_CFLAGS@ \
+@FREETYPE_CFLAGS@ \
+@evas_engine_software_gdi_cflags@
+
+if BUILD_ENGINE_SOFTWARE_GDI
+
+SOFTWARE_GDI_SOURCES = \
+evas_engine.c \
+evas_outbuf.c \
+evas_gdi_buffer.c \
+evas_gdi_main.c
+
+SOFTWARE_GDI_LIBADD = @evas_engine_software_gdi_libs@
+
+pkgdir = $(libdir)/evas/modules/engines/software_gdi/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_Software_Gdi.h
+
+if !EVAS_STATIC_BUILD_SOFTWARE_GDI
+
+pkg_LTLIBRARIES = module.la
+module_la_SOURCES = $(SOFTWARE_GDI_SOURCES)
+module_la_LIBADD = $(top_builddir)/src/lib/libevas.la @EINA_LIBS@ $(SOFTWARE_GDI_LIBADD)
+module_la_LDFLAGS = @lt_enable_auto_import@ -no-undefined -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_software_gdi.la
+
+libevas_engine_software_gdi_la_SOURCES = $(SOFTWARE_GDI_SOURCES)
+libevas_engine_software_gdi_la_LIBADD = $(SOFTWARE_GDI_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/software_gdi/evas_engine.c b/src/modules/engines/software_gdi/evas_engine.c
new file mode 100644 (file)
index 0000000..d635147
--- /dev/null
@@ -0,0 +1,386 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_Software_Gdi.h"
+
+int _evas_engine_soft_gdi_log_dom = -1;
+/* function tables - filled in later (func and parent func) */
+static Evas_Func func, pfunc;
+
+/* engine struct data */
+typedef struct _Render_Engine Render_Engine;
+
+struct _Render_Engine
+{
+   Tilebuf          *tb;
+   Outbuf           *ob;
+   Tilebuf_Rect     *rects;
+   Eina_Inlist      *cur_rect;
+   int               end : 1;
+};
+
+
+static void *
+_output_setup(int          width,
+              int          height,
+              int          rot,
+              HWND         window,
+              HBITMAP      mask,
+              int          depth,
+              unsigned int layered,
+              unsigned int fullscreen)
+{
+   Render_Engine *re;
+
+   re = calloc(1, sizeof(Render_Engine));
+   if (!re)
+     return NULL;
+
+   /* if we haven't initialized - init (automatic abort if already done) */
+   evas_common_cpu_init();
+
+   evas_common_blend_init();
+   evas_common_image_init();
+   evas_common_convert_init();
+   evas_common_scale_init();
+   evas_common_rectangle_init();
+   evas_common_gradient_init();
+   evas_common_polygon_init();
+   evas_common_line_init();
+   evas_common_font_init();
+   evas_common_draw_init();
+   evas_common_tilebuf_init();
+
+   evas_software_gdi_outbuf_init();
+
+   if (width <= 0)
+     width = 1;
+   if (height <= 0)
+     height = 1;
+
+   re->ob = evas_software_gdi_outbuf_setup(width, height, rot,
+                                           OUTBUF_DEPTH_INHERIT,
+                                           window, mask, depth, layered, fullscreen,
+                                           0, 0);
+   if (!re->ob)
+     {
+       free(re);
+       return NULL;
+     }
+
+   /* for updates return 1 big buffer, but only use portions of it, also cache
+    it and keep it around until an idle_flush */
+   /* disable for now - i am hunting down why some expedite tests are slower,
+    * as well as shaped stuff is broken and probable non-32bpp is broken as
+    * convert funcs dont do the right thing
+    *
+   re->ob->onebuf = 1;
+    */
+
+   re->tb = evas_common_tilebuf_new(width, height);
+   if (!re->tb)
+     {
+       evas_software_gdi_outbuf_free(re->ob);
+       free(re);
+       return NULL;
+     }
+   /* in preliminary tests 16x16 gave highest framerates */
+   evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+
+   return re;
+}
+
+
+/* engine api this module provides */
+
+static void *
+eng_info(Evas *e __UNUSED__)
+{
+   Evas_Engine_Info_Software_Gdi *info;
+   info = calloc(1, sizeof(Evas_Engine_Info_Software_Gdi));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   return info;
+}
+
+static void
+eng_info_free(Evas *e __UNUSED__, void *info)
+{
+   Evas_Engine_Info_Software_Gdi *in;
+   in = (Evas_Engine_Info_Software_Gdi *)info;
+   free(in);
+}
+
+static int
+eng_setup(Evas *e, void *in)
+{
+   Render_Engine                 *re;
+   Evas_Engine_Info_Software_Gdi *info;
+
+   info = (Evas_Engine_Info_Software_Gdi *)in;
+   if (!e->engine.data.output)
+     e->engine.data.output = _output_setup(e->output.w,
+                                           e->output.h,
+                                           info->info.rotation,
+                                           info->info.window,
+                                           info->info.mask,
+                                           info->info.depth,
+                                           info->info.layered,
+                                           info->info.fullscreen);
+   else
+     {
+       int ponebuf = 0;
+
+       re = e->engine.data.output;
+       ponebuf = re->ob->onebuf;
+       evas_software_gdi_outbuf_free(re->ob);
+       re->ob = evas_software_gdi_outbuf_setup(e->output.w,
+                                                e->output.h,
+                                                info->info.rotation,
+                                                OUTBUF_DEPTH_INHERIT,
+                                                info->info.window,
+                                                info->info.mask,
+                                                info->info.depth,
+                                                info->info.layered,
+                                                info->info.fullscreen,
+                                                0, 0);
+       re->ob->onebuf = ponebuf;
+     }
+   if (!e->engine.data.output) return 0;
+   if (!e->engine.data.context)
+     e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
+
+   re = e->engine.data.output;
+
+   return 1;
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re;
+
+   if (!data) return;
+
+   re = (Render_Engine *)data;
+   evas_software_gdi_outbuf_free(re->ob);
+   evas_common_tilebuf_free(re->tb);
+   if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+}
+
+static void
+eng_output_resize(void *data, int width, int height)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_software_gdi_outbuf_reconfigure(re->ob,
+                                        width,
+                                        height,
+                                        evas_software_gdi_outbuf_rot_get(re->ob),
+                                        OUTBUF_DEPTH_INHERIT);
+   evas_common_tilebuf_free(re->tb);
+   re->tb = evas_common_tilebuf_new(width, height);
+   if (re->tb)
+     evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+}
+
+static void
+eng_output_tile_size_set(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_set_tile_size(re->tb, w, h);
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_clear(re->tb);
+}
+
+static void *
+eng_output_redraws_next_update_get(void *data,
+                                   int  *x,
+                                   int  *y,
+                                   int  *w,
+                                   int  *h,
+                                   int  *cx,
+                                   int  *cy,
+                                   int  *cw,
+                                   int  *ch)
+{
+   Render_Engine *re;
+   RGBA_Image    *surface;
+   Tilebuf_Rect  *rect;
+   int            ux;
+   int            uy;
+   int            uw;
+   int            uh;
+
+   re = (Render_Engine *)data;
+   if (re->end)
+     {
+       re->end = 0;
+       return NULL;
+     }
+   if (!re->rects)
+     {
+       re->rects = evas_common_tilebuf_get_render_rects(re->tb);
+       re->cur_rect = EINA_INLIST_GET(re->rects);
+     }
+   if (!re->cur_rect) return NULL;
+   rect = (Tilebuf_Rect *)re->cur_rect;
+   ux = rect->x;
+   uy = rect->y;
+   uw = rect->w;
+   uh = rect->h;
+   re->cur_rect = re->cur_rect->next;
+   if (!re->cur_rect)
+     {
+       evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       re->end = 1;
+     }
+
+   surface = evas_software_gdi_outbuf_new_region_for_update(re->ob,
+                                                            ux,
+                                                            uy,
+                                                            uw,
+                                                            uh,
+                                                            cx,
+                                                            cy,
+                                                            cw,
+                                                            ch);
+
+   *x = ux;
+   *y = uy;
+   *w = uw;
+   *h = uh;
+
+   return surface;
+}
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+#ifdef BUILD_PIPE_RENDER
+   evas_common_pipe_map4_begin(surface);
+#endif
+   evas_software_gdi_outbuf_push_updated_region(re->ob, surface, x, y, w, h);
+   evas_software_gdi_outbuf_free_region_for_update(re->ob, surface);
+   evas_common_cpu_end_opt();
+}
+
+static void
+eng_output_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_software_gdi_outbuf_flush(re->ob);
+}
+
+static void
+eng_output_idle_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_software_gdi_outbuf_idle_flush(re->ob);
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data, void *context)
+{
+   return EINA_FALSE;
+}
+
+/* module advertising code */
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
+
+   _evas_engine_soft_gdi_log_dom = eina_log_domain_register("EvasSoftGDI",EVAS_DEFAULT_LOG_COLOR);
+   if(_evas_engine_soft_gdi_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the Soft_GDI engine.\n");
+       return 0;
+     }
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(canvas_alpha_get);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+  eina_log_domain_unregister(_evas_engine_soft_gdi_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "software_gdi",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_gdi);
+
+#ifndef EVAS_STATIC_BUILD_SOFTWARE_GDI
+EVAS_EINA_MODULE_DEFINE(engine, software_gdi);
+#endif
diff --git a/src/modules/engines/software_gdi/evas_engine.h b/src/modules/engines/software_gdi/evas_engine.h
new file mode 100644 (file)
index 0000000..7816597
--- /dev/null
@@ -0,0 +1,206 @@
+#ifndef EVAS_ENGINE_H
+#define EVAS_ENGINE_H
+
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+
+extern int _evas_engine_soft_gdi_log_dom;
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_soft_gdi_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_soft_gdi_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_soft_gdi_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_soft_gdi_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_soft_gdi_log_dom, __VA_ARGS__)
+
+typedef enum _Outbuf_Depth Outbuf_Depth;
+
+enum _Outbuf_Depth
+{
+   OUTBUF_DEPTH_NONE,
+   OUTBUF_DEPTH_INHERIT,
+   OUTBUF_DEPTH_RGB_16BPP_565_565_DITHERED,
+   OUTBUF_DEPTH_RGB_32BPP_888_8888,
+   OUTBUF_DEPTH_LAST
+};
+
+typedef struct BITMAPINFO_GDI     BITMAPINFO_GDI;
+typedef struct _Outbuf            Outbuf;
+typedef struct _Outbuf_Region     Outbuf_Region;
+typedef struct _Gdi_Output_Buffer Gdi_Output_Buffer;
+
+struct BITMAPINFO_GDI
+{
+   BITMAPINFOHEADER bih;
+   DWORD            masks[3];
+};
+
+struct _Outbuf
+{
+   Outbuf_Depth          depth;
+   int                   width;
+   int                   height;
+   int                   rot;
+   int                   onebuf;
+
+   struct {
+      Convert_Pal       *pal;
+      struct {
+         BITMAPINFO_GDI *bitmap_info;
+         HWND            window;
+         HBITMAP         mask;
+         HDC             dc;
+         int             depth;
+         unsigned char   layered    : 1;
+         unsigned char   fullscreen : 1;
+      } gdi;
+
+      /* 1 big buffer for updates - flush on idle_flush */
+      RGBA_Image        *onebuf;
+      Eina_List         *onebuf_regions;
+
+      /* a list of pending regions to write to the target */
+      Eina_List         *pending_writes;
+      /* a list of previous frame pending regions to write to the target */
+      Eina_List         *prev_pending_writes;
+
+      unsigned char      mask_dither       : 1;
+      unsigned char      destination_alpha : 1;
+      unsigned char      debug             : 1;
+      unsigned char      synced            : 1;
+   } priv;
+};
+
+struct _Outbuf_Region
+{
+   Gdi_Output_Buffer *gdiob;
+   int                x;
+   int                y;
+   int                width;
+   int                height;
+};
+
+struct _Gdi_Output_Buffer
+{
+   BITMAPINFO_GDI *bitmap_info;
+   HBITMAP         bitmap;
+   HDC             dc;
+   int             width;
+   int             height;
+   void           *data;
+   int             depth;
+   int             pitch;
+   int             psize;
+};
+
+/* evas_gdi_main.c */
+
+int evas_software_gdi_init (HWND         window,
+                            HBITMAP      mask,
+                            int          depth,
+                            unsigned int layered,
+                            unsigned int fullscreen,
+                            Outbuf      *buf);
+
+void evas_software_gdi_shutdown(Outbuf *buf);
+
+void evas_software_gdi_bitmap_resize(Outbuf *buf);
+
+/* evas_gdi_buffer.c */
+
+Gdi_Output_Buffer *evas_software_gdi_output_buffer_new(HDC             dc,
+                                                       BITMAPINFO_GDI *bitmap_info,
+                                                       int             depth,
+                                                       int             width,
+                                                       int             height,
+                                                       void           *data);
+
+void evas_software_gdi_output_buffer_free(Gdi_Output_Buffer *gdiob);
+
+void evas_software_gdi_output_buffer_paste(Gdi_Output_Buffer *gdiob,
+                                           int                x,
+                                           int                y);
+
+DATA8 *evas_software_gdi_output_buffer_data(Gdi_Output_Buffer *gdiob,
+                                            int               *pitch);
+
+int evas_software_gdi_output_buffer_depth(Gdi_Output_Buffer *gdiob);
+
+/* evas_outbuf.c */
+
+void evas_software_gdi_outbuf_init(void);
+
+void evas_software_gdi_outbuf_free(Outbuf *buf);
+
+Outbuf *evas_software_gdi_outbuf_setup(int          width,
+                                       int          height,
+                                       int          rotation,
+                                       Outbuf_Depth depth,
+                                       HWND         window,
+                                       HBITMAP      mask,
+                                       int          w_depth,
+                                       unsigned int layered,
+                                       unsigned int fullscreen,
+                                       int          mask_dither,
+                                       int          destination_alpha);
+
+void evas_software_gdi_outbuf_reconfigure(Outbuf      *buf,
+                                          int          width,
+                                          int          height,
+                                          int          rotation,
+                                          Outbuf_Depth depth);
+
+RGBA_Image *evas_software_gdi_outbuf_new_region_for_update(Outbuf *buf,
+                                                           int     x,
+                                                           int     y,
+                                                           int     w,
+                                                           int     h,
+                                                           int    *cx,
+                                                           int    *cy,
+                                                           int    *cw,
+                                                           int    *ch);
+
+void evas_software_gdi_outbuf_push_updated_region(Outbuf     *buf,
+                                                  RGBA_Image *update,
+                                                  int         x,
+                                                  int         y,
+                                                  int         w,
+                                                  int         h);
+
+void evas_software_gdi_outbuf_free_region_for_update(Outbuf     *buf,
+                                                     RGBA_Image *update);
+
+void evas_software_gdi_outbuf_flush(Outbuf *buf);
+
+void evas_software_gdi_outbuf_idle_flush(Outbuf *buf);
+
+int evas_software_gdi_outbuf_width_get(Outbuf *buf);
+
+int evas_software_gdi_outbuf_height_get(Outbuf *buf);
+
+Outbuf_Depth evas_software_gdi_outbuf_depth_get(Outbuf *buf);
+
+int evas_software_gdi_outbuf_rot_get(Outbuf *buf);
+
+
+#endif /* EVAS_ENGINE_H */
diff --git a/src/modules/engines/software_gdi/evas_gdi_buffer.c b/src/modules/engines/software_gdi/evas_gdi_buffer.c
new file mode 100644 (file)
index 0000000..66a5abf
--- /dev/null
@@ -0,0 +1,88 @@
+#include <string.h>
+
+#include "evas_common.h"
+#include "evas_engine.h"
+
+Gdi_Output_Buffer *
+evas_software_gdi_output_buffer_new(HDC             dc,
+                                    BITMAPINFO_GDI *bitmap_info,
+                                    int             depth,
+                                    int             width,
+                                    int             height,
+                                    void           *data)
+{
+   Gdi_Output_Buffer *gdiob;
+
+   gdiob = calloc(1, sizeof(Gdi_Output_Buffer));
+   if (!gdiob) return NULL;
+
+   if (!data)
+     {
+        bitmap_info->bih.biWidth = width;
+        bitmap_info->bih.biHeight = -height;
+        bitmap_info->bih.biSizeImage = (depth >> 3) * width * height;
+        gdiob->bitmap = CreateDIBSection(dc,
+                                         (const BITMAPINFO *)bitmap_info,
+                                         DIB_RGB_COLORS,
+                                         (void **)(&data),
+                                         NULL,
+                                         0);
+        if (!gdiob->bitmap)
+          {
+             free(gdiob);
+             return NULL;
+          }
+     }
+
+   gdiob->bitmap_info = bitmap_info;
+   gdiob->dc = dc;
+   gdiob->data = data;
+   gdiob->width = width;
+   gdiob->height = height;
+   gdiob->depth = depth;
+   gdiob->pitch = width * (depth >> 3);
+/*    gdiob->psize = gdiob->pitch * height; */
+
+   return gdiob;
+}
+
+void
+evas_software_gdi_output_buffer_free(Gdi_Output_Buffer *gdiob)
+{
+   DeleteObject(gdiob->bitmap);
+   free(gdiob);
+}
+
+void
+evas_software_gdi_output_buffer_paste(Gdi_Output_Buffer *gdiob,
+                                      int                x,
+                                      int                y)
+{
+   HDC     dc;
+
+   dc = CreateCompatibleDC(gdiob->dc);
+   if (!dc)
+     return;
+   SelectObject(dc, gdiob->bitmap);
+   BitBlt(gdiob->dc,
+          x, y,
+          gdiob->width, gdiob->height,
+          dc,
+          0, 0,
+          SRCCOPY);
+   DeleteDC(dc);
+}
+
+DATA8 *
+evas_software_gdi_output_buffer_data(Gdi_Output_Buffer *gdiob,
+                                     int               *pitch)
+{
+   if (pitch) *pitch = gdiob->pitch;
+   return gdiob->data;
+}
+
+int
+evas_software_gdi_output_buffer_depth(Gdi_Output_Buffer *gdiob)
+{
+   return gdiob->depth;
+}
diff --git a/src/modules/engines/software_gdi/evas_gdi_main.c b/src/modules/engines/software_gdi/evas_gdi_main.c
new file mode 100644 (file)
index 0000000..edd7201
--- /dev/null
@@ -0,0 +1,116 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+
+int
+evas_software_gdi_init (HWND         window,
+                        HBITMAP      mask,
+                        int          depth,
+                        unsigned int layered,
+                        unsigned int fullscreen __UNUSED__,
+                        Outbuf *buf)
+{
+   RECT window_rect;
+   SIZE mask_size;
+
+   if (!window)
+     {
+        ERR("[Engine] [GDI] Window is NULL");
+        return 0;
+     }
+
+   buf->priv.gdi.window = window;
+   buf->priv.gdi.mask = mask;
+   buf->priv.gdi.dc = GetDC(window);
+   if (!buf->priv.gdi.dc)
+     {
+        ERR("[Engine] [GDI] Can not get DC");
+        return 0;
+     }
+
+   /* FIXME: check depth */
+   if (depth != GetDeviceCaps(buf->priv.gdi.dc, BITSPIXEL))
+     {
+        ERR("[Engine] [GDI] no compatible depth");
+        ReleaseDC(window, buf->priv.gdi.dc);
+        return 0;
+     }
+   buf->priv.gdi.depth = depth;
+
+   /* mask */
+   if (layered && mask)
+     {
+        if (GetBitmapDimensionEx(mask, &mask_size) &&
+            GetClientRect(window, &window_rect))
+          {
+             if ((mask_size.cx == window_rect.right) &&
+                 (mask_size.cy == window_rect.bottom))
+               {
+/*                  if (SetLayeredWindowAttributes(window, RGB(0, 0, 0), 255, LWA_COLORKEY)) */
+/*                    { */
+/*                    } */
+               }
+          }
+     }
+
+   /* FIXME: support fullscreen */
+
+   buf->priv.gdi.bitmap_info = (BITMAPINFO_GDI *)malloc(sizeof(BITMAPINFO_GDI));
+   if (!buf->priv.gdi.bitmap_info)
+     {
+        ERR("[Engine] [GDI] Can not allocate bitmap info");
+        ReleaseDC(window, buf->priv.gdi.dc);
+        return 0;
+     }
+
+   buf->priv.gdi.bitmap_info->bih.biSize = sizeof(BITMAPINFOHEADER);
+   buf->priv.gdi.bitmap_info->bih.biWidth = buf->width;
+   buf->priv.gdi.bitmap_info->bih.biHeight = -buf->height;
+   buf->priv.gdi.bitmap_info->bih.biPlanes = 1;
+   buf->priv.gdi.bitmap_info->bih.biSizeImage = (buf->priv.gdi.depth >> 3) * buf->width * buf->height;
+   buf->priv.gdi.bitmap_info->bih.biXPelsPerMeter = 0;
+   buf->priv.gdi.bitmap_info->bih.biYPelsPerMeter = 0;
+   buf->priv.gdi.bitmap_info->bih.biClrUsed = 0;
+   buf->priv.gdi.bitmap_info->bih.biClrImportant = 0;
+   buf->priv.gdi.bitmap_info->bih.biBitCount = buf->priv.gdi.depth;
+   buf->priv.gdi.bitmap_info->bih.biCompression = BI_BITFIELDS;
+
+   switch (depth)
+     {
+      case 16:
+         buf->priv.gdi.bitmap_info->masks[0] = 0x0000f800;
+         buf->priv.gdi.bitmap_info->masks[1] = 0x000007e0;
+         buf->priv.gdi.bitmap_info->masks[2] = 0x0000001f;
+         break;
+      case 32:
+         buf->priv.gdi.bitmap_info->masks[0] = 0x00ff0000;
+         buf->priv.gdi.bitmap_info->masks[1] = 0x0000ff00;
+         buf->priv.gdi.bitmap_info->masks[2] = 0x000000ff;
+         break;
+      default:
+        ERR("[Engine] [GDI] wrong depth");
+        free(buf->priv.gdi.bitmap_info);
+        ReleaseDC(window, buf->priv.gdi.dc);
+        return 0;
+     }
+
+   return 1;
+}
+
+void
+evas_software_gdi_shutdown(Outbuf *buf)
+{
+   if (!buf)
+     return;
+
+   free(buf->priv.gdi.bitmap_info);
+   ReleaseDC(buf->priv.gdi.window, buf->priv.gdi.dc);
+}
+
+void
+evas_software_gdi_bitmap_resize(Outbuf *buf)
+{
+   buf->priv.gdi.bitmap_info->bih.biWidth = buf->width;
+   buf->priv.gdi.bitmap_info->bih.biHeight = -buf->height;
+   buf->priv.gdi.bitmap_info->bih.biSizeImage = (buf->priv.gdi.depth >> 3) * buf->width * buf->height;
+}
diff --git a/src/modules/engines/software_gdi/evas_outbuf.c b/src/modules/engines/software_gdi/evas_outbuf.c
new file mode 100644 (file)
index 0000000..09a2546
--- /dev/null
@@ -0,0 +1,509 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+
+static Eina_List *gdipool = NULL;
+static int gdisize = 0;
+static int gdimemlimit = 10 * 1024 * 1024;
+static int gdicountlimit = 32;
+
+static Gdi_Output_Buffer *
+_find_gdiob(HDC dc, BITMAPINFO_GDI *bitmap_info, int depth, int w, int h, void *data)
+{
+   Eina_List         *l;
+   Eina_List         *gdil;
+   Gdi_Output_Buffer *gdiob = NULL;
+   Gdi_Output_Buffer *gdiob2;
+   int                sz;
+   int                lbytes;
+   int                bpp;
+   int                fitness = 0x7fffffff;
+
+   bpp = depth >> 3;
+   if (bpp == 3) bpp = 4;
+   lbytes = (((w * bpp) + 3) / 4) * 4;
+   sz = lbytes * h;
+   EINA_LIST_FOREACH(gdipool, l, gdiob2)
+     {
+       int szdif;
+
+        if ((gdiob2->dc != dc) ||
+            (gdiob2->bitmap_info != bitmap_info) ||
+            (gdiob2->depth != depth))
+         continue;
+       szdif = gdiob2->psize - sz;
+       if (szdif < 0) continue;
+       if (szdif == 0)
+         {
+            gdiob = gdiob2;
+            gdil = l;
+            goto have_gdiob;
+         }
+       if (szdif < fitness)
+         {
+            fitness = szdif;
+            gdiob = gdiob2;
+            gdil = l;
+         }
+     }
+   if ((fitness > (100 * 100)) || (!gdiob))
+     return evas_software_gdi_output_buffer_new(dc, bitmap_info, depth, w, h, data);
+
+   have_gdiob:
+   gdipool = eina_list_remove_list(gdipool, gdil);
+   gdiob->width = w;
+   gdiob->height = h;
+   gdiob->pitch = lbytes;
+   gdisize -= gdiob->psize * (gdiob->depth >> 3);
+
+   return gdiob;
+}
+
+static void
+_unfind_gdiob(Gdi_Output_Buffer *gdiob)
+{
+   gdipool = eina_list_prepend(gdipool, gdiob);
+   gdisize += gdiob->psize * (gdiob->depth >> 3);
+   while ((gdisize > (gdimemlimit)) ||
+          (eina_list_count(gdipool) > gdicountlimit))
+     {
+        Eina_List *xl;
+
+        xl = eina_list_last(gdipool);
+        if (!xl)
+          {
+             gdisize = 0;
+             break;
+          }
+        gdiob = xl->data;
+        gdipool = eina_list_remove_list(gdipool, xl);
+        evas_software_gdi_output_buffer_free(gdiob);
+     }
+}
+
+static void
+_clear_gdiob()
+{
+   while (gdipool)
+     {
+       Gdi_Output_Buffer *gdiob;
+
+       gdiob = gdipool->data;
+       gdipool = eina_list_remove_list(gdipool, gdipool);
+       evas_software_gdi_output_buffer_free(gdiob);
+     }
+   gdisize = 0;
+}
+
+void
+evas_software_gdi_outbuf_init(void)
+{
+}
+
+void
+evas_software_gdi_outbuf_free(Outbuf *buf)
+{
+   if (!buf)
+     return;
+
+   while (buf->priv.pending_writes)
+     {
+       RGBA_Image *im;
+       Outbuf_Region *obr;
+
+       im = buf->priv.pending_writes->data;
+       buf->priv.pending_writes = eina_list_remove_list(buf->priv.pending_writes, buf->priv.pending_writes);
+       obr = im->extended_info;
+       evas_cache_image_drop(&im->cache_entry);
+       if (obr->gdiob) _unfind_gdiob(obr->gdiob);
+/*     if (obr->mxob) _unfind_xob(obr->mxob, 0); */
+       free(obr);
+     }
+   evas_software_gdi_outbuf_idle_flush(buf);
+   evas_software_gdi_outbuf_flush(buf);
+
+   evas_software_gdi_shutdown(buf);
+   free(buf);
+}
+
+Outbuf *
+evas_software_gdi_outbuf_setup(int          width,
+                               int          height,
+                               int          rotation,
+                               Outbuf_Depth depth,
+                               HWND         window,
+                               HBITMAP      mask,
+                               int          w_depth,
+                               unsigned int layered,
+                               unsigned int fullscreen,
+                               int          mask_dither,
+                               int          destination_alpha)
+{
+   Outbuf *buf;
+
+   buf = (Outbuf *)calloc(1, sizeof(Outbuf));
+   if (!buf)
+      return NULL;
+
+   buf->width = width;
+   buf->height = height;
+   buf->depth = depth;
+   buf->rot = rotation;
+
+   buf->priv.mask_dither = mask_dither;
+   buf->priv.destination_alpha = destination_alpha;
+
+   if (!evas_software_gdi_init(window, mask, w_depth, layered, fullscreen, buf))
+     {
+        free(buf);
+        return NULL;
+     }
+
+   {
+      Gfx_Func_Convert  conv_func;
+      Gdi_Output_Buffer *gdiob;
+
+      gdiob = evas_software_gdi_output_buffer_new(buf->priv.gdi.dc, buf->priv.gdi.bitmap_info, w_depth, 1, 1, NULL);
+
+      conv_func = NULL;
+      if (gdiob)
+        {
+           if ((rotation == 0) || (rotation == 180))
+             conv_func = evas_common_convert_func_get(0,
+                                                      width,
+                                                      height,
+                                                      evas_software_gdi_output_buffer_depth (gdiob),
+                                                      buf->priv.gdi.bitmap_info->masks[0],
+                                                      buf->priv.gdi.bitmap_info->masks[1],
+                                                      buf->priv.gdi.bitmap_info->masks[2],
+                                                      PAL_MODE_NONE,
+                                                      rotation);
+           else if ((rotation == 90) || (rotation == 270))
+             conv_func = evas_common_convert_func_get(0,
+                                                      height,
+                                                      width,
+                                                      evas_software_gdi_output_buffer_depth (gdiob),
+                                                      buf->priv.gdi.bitmap_info->masks[0],
+                                                      buf->priv.gdi.bitmap_info->masks[1],
+                                                      buf->priv.gdi.bitmap_info->masks[2],
+                                                      PAL_MODE_NONE,
+                                                      rotation);
+
+           evas_software_gdi_output_buffer_free(gdiob);
+
+           if (!conv_func)
+             {
+                ERR(".[ soft_gdi engine Error ]."
+                      " {"
+                      "  At depth         %i:"
+                      "  RGB format mask: %08lx, %08lx, %08lx"
+                      "  Not supported by and compiled in converters!"
+                      " }",
+                        buf->priv.gdi.depth,
+                        buf->priv.gdi.bitmap_info->masks[0],
+                        buf->priv.gdi.bitmap_info->masks[1],
+                        buf->priv.gdi.bitmap_info->masks[2]);
+             }
+        }
+      if (buf->priv.gdi.mask != mask)
+        buf->priv.gdi.mask = mask;
+   }
+
+   return buf;
+}
+
+void
+evas_software_gdi_outbuf_reconfigure(Outbuf      *buf,
+                                     int          width,
+                                     int          height,
+                                     int          rotation,
+                                     Outbuf_Depth depth)
+{
+   if ((width == buf->width) && (height == buf->height) &&
+       (rotation == buf->rot) && (depth == buf->depth))
+     return;
+   buf->width = width;
+   buf->height = height;
+   buf->rot = rotation;
+   evas_software_gdi_bitmap_resize(buf);
+}
+
+RGBA_Image *
+evas_software_gdi_outbuf_new_region_for_update(Outbuf *buf,
+                                               int     x,
+                                               int     y,
+                                               int     w,
+                                               int     h,
+                                               int    *cx,
+                                               int    *cy,
+                                               int    *cw,
+                                               int    *ch)
+{
+   RGBA_Image    *im;
+   Outbuf_Region *obr;
+   int            bpl = 0;
+   int            alpha = 0;
+
+   obr = calloc(1, sizeof(Outbuf_Region));
+   obr->x = x;
+   obr->y = y;
+   obr->width = w;
+   obr->height = h;
+   *cx = 0;
+   *cy = 0;
+   *cw = w;
+   *ch = h;
+
+   alpha = ((buf->priv.gdi.mask) || (buf->priv.destination_alpha));
+
+   if ((buf->rot == 0) &&
+       (buf->priv.gdi.bitmap_info->masks[0] == 0xff0000) &&
+       (buf->priv.gdi.bitmap_info->masks[1] == 0x00ff00) &&
+       (buf->priv.gdi.bitmap_info->masks[2] == 0x0000ff))
+     {
+        obr->gdiob = _find_gdiob(buf->priv.gdi.dc,
+                                 buf->priv.gdi.bitmap_info,
+                                 buf->priv.gdi.depth,
+                                 w, h, NULL);
+/*      obr->gdiob = evas_software_gdi_output_buffer_new(buf->priv.gdi.dc, */
+/*                                                         buf->priv.gdi.bitmap_info, */
+/*                                                         buf->priv.gdi.depth, */
+/*                                                         w, h, */
+/*                                                         NULL); */
+        im = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(),
+                                                 w, h,
+                                                 (DATA32 *)evas_software_gdi_output_buffer_data(obr->gdiob, &bpl),
+                                                 alpha, EVAS_COLORSPACE_ARGB8888);
+        im->extended_info = obr;
+/*     if (buf->priv.gdi.mask) */
+/*       obr->mgdiob = _find_gdiob(buf->priv.gdi.dc, */
+/*                                     buf->priv.gdi.bitmap_info, */
+/*                                     1, */
+/*                                     w, h, NULL); */
+     }
+   else
+     {
+        im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get());
+        im->cache_entry.flags.alpha |= alpha ? 1 : 0;
+        evas_cache_image_surface_alloc(&im->cache_entry, w, h);
+        im->extended_info = obr;
+        if ((buf->rot == 0) || (buf->rot == 180))
+          obr->gdiob = _find_gdiob(buf->priv.gdi.dc,
+                                   buf->priv.gdi.bitmap_info,
+                                   buf->priv.gdi.depth,
+                                   w, h, NULL);
+/*
+          obr->gdiob = evas_software_x11_x_output_buffer_new(buf->priv.dd.disp,
+                                                           buf->priv.dd.vis,
+                                                           buf->priv.dd.depth,
+                                                           w, h,
+                                                           use_shm,
+                                                           NULL);
+ */
+        else if ((buf->rot == 90) || (buf->rot == 270))
+          obr->gdiob = _find_gdiob(buf->priv.gdi.dc,
+                                   buf->priv.gdi.bitmap_info,
+                                   buf->priv.gdi.depth,
+                                   h, w, NULL);
+/*
+          obr->gdiob = evas_software_x11_x_output_buffer_new(buf->priv.dd.disp,
+                                                           buf->priv.dd.vis,
+                                                           buf->priv.dd.depth,
+                                                           h, w,
+                                                           use_shm,
+                                                           NULL);
+ */
+/*     if (buf->priv.gdi.mask) */
+/*       obr->mgdiob = _find_gdiob(buf->priv.gdi.dc, */
+/*                                     buf->priv.gdi.bitmap_info, */
+/*                                     1, */
+/*                                     w, h, NULL); */
+     }
+   if ((buf->priv.gdi.mask) || (buf->priv.destination_alpha))
+     /* FIXME: faster memset! */
+     memset(im->image.data, 0, w * h * sizeof(DATA32));
+
+   buf->priv.pending_writes = eina_list_append(buf->priv.pending_writes, im);
+   return im;
+}
+
+void
+evas_software_gdi_outbuf_push_updated_region(Outbuf     *buf,
+                                             RGBA_Image *update,
+                                             int         x,
+                                             int         y,
+                                             int         w,
+                                             int         h)
+{
+   Gfx_Func_Convert conv_func;
+   Outbuf_Region   *obr;
+   DATA32          *src_data;
+   void            *data;
+   int              bpl = 0;
+
+   conv_func = NULL;
+   obr = update->extended_info;
+
+   if ((buf->rot == 0) || (buf->rot == 180))
+     conv_func = evas_common_convert_func_get(0, w, h,
+                                              evas_software_gdi_output_buffer_depth(obr->gdiob),
+                                              buf->priv.gdi.bitmap_info->masks[0],
+                                              buf->priv.gdi.bitmap_info->masks[1],
+                                              buf->priv.gdi.bitmap_info->masks[2],
+                                              PAL_MODE_NONE,
+                                              buf->rot);
+   else if ((buf->rot == 90) || (buf->rot == 270))
+     conv_func = evas_common_convert_func_get(0, h, w,
+                                              evas_software_gdi_output_buffer_depth(obr->gdiob),
+                                              buf->priv.gdi.bitmap_info->masks[0],
+                                              buf->priv.gdi.bitmap_info->masks[1],
+                                              buf->priv.gdi.bitmap_info->masks[2],
+                                              PAL_MODE_NONE,
+                                              buf->rot);
+   if (!conv_func) return;
+
+   data = evas_software_gdi_output_buffer_data(obr->gdiob, &bpl);
+   src_data = update->image.data;
+   if (buf->rot == 0)
+     {
+       obr->x = x;
+       obr->y = y;
+     }
+   else if (buf->rot == 90)
+     {
+       obr->x = y;
+       obr->y = buf->width - x - w;
+     }
+   else if (buf->rot == 180)
+     {
+       obr->x = buf->width - x - w;
+       obr->y = buf->height - y - h;
+     }
+   else if (buf->rot == 270)
+     {
+       obr->x = buf->height - y - h;
+       obr->y = x;
+     }
+   if ((buf->rot == 0) || (buf->rot == 180))
+     {
+       obr->width = w;
+       obr->height = h;
+     }
+   else if ((buf->rot == 90) || (buf->rot == 270))
+     {
+       obr->width = h;
+       obr->height = w;
+     }
+
+   if (data != src_data)
+     conv_func(src_data, data,
+               0,
+               bpl / (evas_software_gdi_output_buffer_depth(obr->gdiob) >> 3) - obr->width,
+               obr->width,
+               obr->height,
+               x,
+               y,
+               NULL);
+/*    if (obr->mxob) */
+/*      { */
+/*    int              yy; */
+/*     for (yy = 0; yy < obr->h; yy++) */
+/*       evas_software_xlib_x_write_mask_line(buf, obr->mxob, */
+/*                                           src_data + */
+/*                                           (yy * obr->w), obr->w, yy); */
+}
+
+void
+evas_software_gdi_outbuf_free_region_for_update(Outbuf     *buf __UNUSED__,
+                                                RGBA_Image *update __UNUSED__)
+{
+   /* no need to do anything - they are cleaned up on flush */
+}
+
+void
+evas_software_gdi_outbuf_flush(Outbuf *buf)
+{
+   Eina_List     *l;
+   RGBA_Image    *im;
+   Outbuf_Region *obr;
+
+   /* copy safely the images that need to be drawn onto the back surface */
+   EINA_LIST_FOREACH(buf->priv.pending_writes, l, im)
+     {
+       Gdi_Output_Buffer *gdiob;
+
+        obr = im->extended_info;
+        gdiob = obr->gdiob;
+        evas_software_gdi_output_buffer_paste(gdiob,
+                                              obr->x,
+                                              obr->y);
+/*         if (obr->mgdiob) */
+/*           evas_software_gdi_output_buffer_paste(obr->mgdiob, */
+/*                                                 buf->priv.x11.xlib.mask, */
+/*                                                 buf->priv.x11.xlib.gcm, */
+/*                                                 obr->x, obr->y, 0); */
+     }
+
+   while (buf->priv.prev_pending_writes)
+     {
+        im = buf->priv.prev_pending_writes->data;
+        buf->priv.prev_pending_writes =
+          eina_list_remove_list(buf->priv.prev_pending_writes,
+                                buf->priv.prev_pending_writes);
+        obr = im->extended_info;
+        evas_cache_image_drop(&im->cache_entry);
+        if (obr->gdiob) _unfind_gdiob(obr->gdiob);
+/*         if (obr->mgdiob) _unfind_gdiob(obr->mgdiob); */
+/*         if (obr->gdiob) evas_software_x11_x_output_buffer_free(obr->gdiob); */
+        free(obr);
+     }
+   buf->priv.prev_pending_writes = buf->priv.pending_writes;
+   buf->priv.pending_writes = NULL;
+
+   evas_common_cpu_end_opt();
+}
+
+void
+evas_software_gdi_outbuf_idle_flush(Outbuf *buf)
+{
+   while (buf->priv.prev_pending_writes)
+     {
+        RGBA_Image *im;
+        Outbuf_Region *obr;
+
+        im = buf->priv.prev_pending_writes->data;
+        buf->priv.prev_pending_writes =
+          eina_list_remove_list(buf->priv.prev_pending_writes,
+                                buf->priv.prev_pending_writes);
+        obr = im->extended_info;
+        evas_cache_image_drop((Image_Entry *)im);
+        if (obr->gdiob) _unfind_gdiob(obr->gdiob);
+/*         if (obr->mxob) _unfind_xob(obr->mxob, 0); */
+        free(obr);
+     }
+   _clear_gdiob();
+}
+
+int
+evas_software_gdi_outbuf_width_get(Outbuf *buf)
+{
+   return buf->width;
+}
+
+int
+evas_software_gdi_outbuf_height_get(Outbuf *buf)
+{
+   return buf->height;
+}
+
+Outbuf_Depth
+evas_software_gdi_outbuf_depth_get(Outbuf *buf)
+{
+   return buf->depth;
+}
+
+int
+evas_software_gdi_outbuf_rot_get(Outbuf *buf)
+{
+   return buf->rot;
+}
diff --git a/src/modules/engines/software_generic/.cvsignore b/src/modules/engines/software_generic/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/engines/software_generic/Makefile.am b/src/modules/engines/software_generic/Makefile.am
new file mode 100644 (file)
index 0000000..de7f982
--- /dev/null
@@ -0,0 +1,34 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines \
+@EINA_CFLAGS@ \
+@FREETYPE_CFLAGS@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+SOFTWARE_GENERIC_SOURCES = evas_engine.c
+
+pkgdir = $(libdir)/evas/modules/engines/software_generic/$(MODULE_ARCH)
+
+if !EVAS_STATIC_BUILD_SOFTWARE_GENERIC
+
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES  = $(SOFTWARE_GENERIC_SOURCES)
+
+module_la_LIBADD = @EINA_LIBS@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_software_generic.la
+
+libevas_engine_software_generic_la_SOURCES = $(SOFTWARE_GENERIC_SOURCES)
+
+endif
diff --git a/src/modules/engines/software_generic/evas_engine.c b/src/modules/engines/software_generic/evas_engine.c
new file mode 100644 (file)
index 0000000..77671be
--- /dev/null
@@ -0,0 +1,1252 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+/*
+ *****
+ **
+ ** ENGINE ROUTINES
+ **
+ *****
+ */
+static int cpunum = 0;
+static int _evas_soft_gen_log_dom = -1;
+
+static void
+eng_output_dump(void *data __UNUSED__)
+{
+   evas_common_image_image_all_unload();
+   evas_common_font_font_all_unload();
+}
+
+static void *
+eng_context_new(void *data __UNUSED__)
+{
+   return evas_common_draw_context_new();
+}
+
+static void
+eng_context_free(void *data __UNUSED__, void *context)
+{
+   evas_common_draw_context_free(context);
+}
+
+static void
+eng_context_clip_set(void *data __UNUSED__, void *context, int x, int y, int w, int h)
+{
+   evas_common_draw_context_set_clip(context, x, y, w, h);
+}
+
+static void
+eng_context_clip_clip(void *data __UNUSED__, void *context, int x, int y, int w, int h)
+{
+   evas_common_draw_context_clip_clip(context, x, y, w, h);
+}
+
+static void
+eng_context_clip_unset(void *data __UNUSED__, void *context)
+{
+   evas_common_draw_context_unset_clip(context);
+}
+
+static int
+eng_context_clip_get(void *data __UNUSED__, void *context, int *x, int *y, int *w, int *h)
+{
+   *x = ((RGBA_Draw_Context *)context)->clip.x;
+   *y = ((RGBA_Draw_Context *)context)->clip.y;
+   *w = ((RGBA_Draw_Context *)context)->clip.w;
+   *h = ((RGBA_Draw_Context *)context)->clip.h;
+   return ((RGBA_Draw_Context *)context)->clip.use;
+}
+
+static void
+eng_context_color_set(void *data __UNUSED__, void *context, int r, int g, int b, int a)
+{
+   evas_common_draw_context_set_color(context, r, g, b, a);
+}
+
+static int
+eng_context_color_get(void *data __UNUSED__, void *context, int *r, int *g, int *b, int *a)
+{
+   *r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->col.col));
+   *g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->col.col));
+   *b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->col.col));
+   *a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->col.col));
+   return 1;
+}
+
+static void
+eng_context_multiplier_set(void *data __UNUSED__, void *context, int r, int g, int b, int a)
+{
+   evas_common_draw_context_set_multiplier(context, r, g, b, a);
+}
+
+static void
+eng_context_multiplier_unset(void *data __UNUSED__, void *context)
+{
+   evas_common_draw_context_unset_multiplier(context);
+}
+
+static int
+eng_context_multiplier_get(void *data __UNUSED__, void *context, int *r, int *g, int *b, int *a)
+{
+   *r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->mul.col));
+   *g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->mul.col));
+   *b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->mul.col));
+   *a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->mul.col));
+   return ((RGBA_Draw_Context *)context)->mul.use;
+}
+
+static void
+eng_context_cutout_add(void *data __UNUSED__, void *context, int x, int y, int w, int h)
+{
+   evas_common_draw_context_add_cutout(context, x, y, w, h);
+}
+
+static void
+eng_context_cutout_clear(void *data __UNUSED__, void *context)
+{
+   evas_common_draw_context_clear_cutouts(context);
+}
+
+static void
+eng_context_anti_alias_set(void *data __UNUSED__, void *context, unsigned char aa)
+{
+   evas_common_draw_context_set_anti_alias(context, aa);
+}
+
+static unsigned char
+eng_context_anti_alias_get(void *data __UNUSED__, void *context)
+{
+   return ((RGBA_Draw_Context *)context)->anti_alias;
+}
+
+static void
+eng_context_color_interpolation_set(void *data __UNUSED__, void *context, int color_space)
+{
+   evas_common_draw_context_set_color_interpolation(context, color_space);
+}
+
+static int
+eng_context_color_interpolation_get(void *data __UNUSED__, void *context)
+{
+   return ((RGBA_Draw_Context *)context)->interpolation.color_space;
+}
+
+static void
+eng_context_render_op_set(void *data __UNUSED__, void *context, int op)
+{
+   evas_common_draw_context_set_render_op(context, op);
+}
+
+static int
+eng_context_render_op_get(void *data __UNUSED__, void *context)
+{
+   return ((RGBA_Draw_Context *)context)->render_op;
+}
+
+
+
+static void
+eng_rectangle_draw(void *data __UNUSED__, void *context, void *surface, int x, int y, int w, int h)
+{
+#ifdef BUILD_PIPE_RENDER
+   if (cpunum > 1)
+     evas_common_pipe_rectangle_draw(surface, context, x, y, w, h);
+   else
+#endif
+     {
+       evas_common_rectangle_draw(surface, context, x, y, w, h);
+       evas_common_cpu_end_opt();
+     }
+}
+
+static void
+eng_line_draw(void *data __UNUSED__, void *context, void *surface, int x1, int y1, int x2, int y2)
+{
+#ifdef BUILD_PIPE_RENDER
+   if (cpunum > 1)
+     evas_common_pipe_line_draw(surface, context, x1, y1, x2, y2);
+   else
+#endif   
+     {
+       evas_common_line_draw(surface, context, x1, y1, x2, y2);
+       evas_common_cpu_end_opt();
+     }
+}
+
+static void *
+eng_polygon_point_add(void *data __UNUSED__, void *context __UNUSED__, void *polygon, int x, int y)
+{
+   return evas_common_polygon_point_add(polygon, x, y);
+}
+
+static void *
+eng_polygon_points_clear(void *data __UNUSED__, void *context __UNUSED__, void *polygon)
+{
+   return evas_common_polygon_points_clear(polygon);
+}
+
+static void
+eng_polygon_draw(void *data __UNUSED__, void *context, void *surface, void *polygon, int x, int y)
+{
+#ifdef BUILD_PIPE_RENDER
+   if (cpunum > 1)
+     evas_common_pipe_poly_draw(surface, context, polygon, x, y);
+   else
+#endif
+     {
+       evas_common_polygon_draw(surface, context, polygon, x, y);
+       evas_common_cpu_end_opt();
+     }
+}
+
+static void
+eng_gradient2_color_np_stop_insert(void *data __UNUSED__, void *gradient, int r, int g, int b, int a, float pos)
+{
+   evas_common_gradient2_color_np_stop_insert(gradient, r, g, b, a, pos);
+}
+
+static void
+eng_gradient2_clear(void *data __UNUSED__, void *gradient)
+{
+   evas_common_gradient2_clear(gradient);
+}
+
+static void
+eng_gradient2_fill_transform_set(void *data __UNUSED__, void *gradient, void *transform)
+{
+   evas_common_gradient2_fill_transform_set(gradient, transform);
+}
+
+static void
+eng_gradient2_fill_spread_set(void *data __UNUSED__, void *gradient, int spread)
+{
+   evas_common_gradient2_fill_spread_set(gradient, spread);
+}
+
+static void *
+eng_gradient2_linear_new(void *data __UNUSED__)
+{
+   return evas_common_gradient2_linear_new();
+}
+
+static void
+eng_gradient2_linear_free(void *data __UNUSED__, void *linear_gradient)
+{
+   evas_common_gradient2_free(linear_gradient);
+}
+
+static void
+eng_gradient2_linear_fill_set(void *data __UNUSED__, void *linear_gradient, float x0, float y0, float x1, float y1)
+{
+   evas_common_gradient2_linear_fill_set(linear_gradient, x0, y0, x1, y1);
+}
+
+static int
+eng_gradient2_linear_is_opaque(void *data __UNUSED__, void *context, void *linear_gradient, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient2 *gr = (RGBA_Gradient2 *)linear_gradient;
+
+   if (!dc || !gr || !gr->type.geometer)  return 0;
+   return !(gr->type.geometer->has_alpha(gr, dc->render_op) |
+              gr->type.geometer->has_mask(gr, dc->render_op));
+}
+
+static int
+eng_gradient2_linear_is_visible(void *data __UNUSED__, void *context, void *linear_gradient, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+
+   if (!dc || !linear_gradient)  return 0;
+   return 1;
+}
+
+static void
+eng_gradient2_linear_render_pre(void *data __UNUSED__, void *context, void *linear_gradient)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient2 *gr = (RGBA_Gradient2 *)linear_gradient;
+   int  len;
+
+   if (!dc || !gr || !gr->type.geometer)  return;
+   gr->type.geometer->geom_update(gr);
+   len = gr->type.geometer->get_map_len(gr);
+   evas_common_gradient2_map(dc, gr, len);
+}
+
+static void
+eng_gradient2_linear_render_post(void *data __UNUSED__, void *linear_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_linear_draw(void *data __UNUSED__, void *context, void *surface, void *linear_gradient, int x, int y, int w, int h)
+{
+#ifdef BUILD_PIPE_RENDER
+   if (cpunum > 1)
+     evas_common_pipe_grad2_draw(surface, context, x, y, w, h, linear_gradient);
+   else
+#endif
+     evas_common_gradient2_draw(surface, context, x, y, w, h, linear_gradient);
+}
+
+static void *
+eng_gradient2_radial_new(void *data __UNUSED__)
+{
+   return evas_common_gradient2_radial_new();
+}
+
+static void
+eng_gradient2_radial_free(void *data __UNUSED__, void *radial_gradient)
+{
+   evas_common_gradient2_free(radial_gradient);
+}
+
+static void
+eng_gradient2_radial_fill_set(void *data __UNUSED__, void *radial_gradient, float cx, float cy, float rx, float ry)
+{
+   evas_common_gradient2_radial_fill_set(radial_gradient, cx, cy, rx, ry);
+}
+
+static int
+eng_gradient2_radial_is_opaque(void *data __UNUSED__, void *context, void *radial_gradient, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient2 *gr = (RGBA_Gradient2 *)radial_gradient;
+
+   if (!dc || !gr || !gr->type.geometer)  return 0;
+   return !(gr->type.geometer->has_alpha(gr, dc->render_op) |
+              gr->type.geometer->has_mask(gr, dc->render_op));
+}
+
+static int
+eng_gradient2_radial_is_visible(void *data __UNUSED__, void *context, void *radial_gradient, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+
+   if (!dc || !radial_gradient)  return 0;
+   return 1;
+}
+
+static void
+eng_gradient2_radial_render_pre(void *data __UNUSED__, void *context, void *radial_gradient)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient2 *gr = (RGBA_Gradient2 *)radial_gradient;
+   int  len;
+
+   if (!dc || !gr || !gr->type.geometer)  return;
+   gr->type.geometer->geom_update(gr);
+   len = gr->type.geometer->get_map_len(gr);
+   evas_common_gradient2_map(dc, gr, len);
+}
+
+static void
+eng_gradient2_radial_render_post(void *data __UNUSED__, void *radial_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_radial_draw(void *data __UNUSED__, void *context, void *surface, void *radial_gradient, int x, int y, int w, int h)
+{
+#ifdef BUILD_PIPE_RENDER
+   if (cpunum > 1)
+     evas_common_pipe_grad2_draw(surface, context, x, y, w, h, radial_gradient);
+   else
+#endif
+     evas_common_gradient2_draw(surface, context, x, y, w, h, radial_gradient);
+}
+
+static void *
+eng_gradient_new(void *data __UNUSED__)
+{
+   return evas_common_gradient_new();
+}
+
+static void
+eng_gradient_free(void *data __UNUSED__, void *gradient)
+{
+   evas_common_gradient_free(gradient);
+}
+
+static void
+eng_gradient_color_stop_add(void *data __UNUSED__, void *gradient, int r, int g, int b, int a, int delta)
+{
+   evas_common_gradient_color_stop_add(gradient, r, g, b, a, delta);
+}
+
+static void
+eng_gradient_alpha_stop_add(void *data __UNUSED__, void *gradient, int a, int delta)
+{
+   evas_common_gradient_alpha_stop_add(gradient, a, delta);
+}
+
+static void
+eng_gradient_color_data_set(void *data __UNUSED__, void *gradient, void *map, int len, int has_alpha)
+{
+   evas_common_gradient_color_data_set(gradient, map, len, has_alpha);
+}
+
+static void
+eng_gradient_alpha_data_set(void *data __UNUSED__, void *gradient, void *alpha_map, int len)
+{
+   evas_common_gradient_alpha_data_set(gradient, alpha_map, len);
+}
+
+static void
+eng_gradient_clear(void *data __UNUSED__, void *gradient)
+{
+   evas_common_gradient_clear(gradient);
+}
+
+static void
+eng_gradient_fill_set(void *data __UNUSED__, void *gradient, int x, int y, int w, int h)
+{
+   evas_common_gradient_fill_set(gradient, x, y, w, h);
+}
+
+static void
+eng_gradient_fill_angle_set(void *data __UNUSED__, void *gradient, double angle)
+{
+   evas_common_gradient_fill_angle_set(gradient, angle);
+}
+
+static void
+eng_gradient_fill_spread_set(void *data __UNUSED__, void *gradient, int spread)
+{
+   evas_common_gradient_fill_spread_set(gradient, spread);
+}
+
+static void
+eng_gradient_angle_set(void *data __UNUSED__, void *gradient, double angle)
+{
+   evas_common_gradient_map_angle_set(gradient, angle);
+}
+
+static void
+eng_gradient_offset_set(void *data __UNUSED__, void *gradient, float offset)
+{
+   evas_common_gradient_map_offset_set(gradient, offset);
+}
+
+static void
+eng_gradient_direction_set(void *data __UNUSED__, void *gradient, int direction)
+{
+   evas_common_gradient_map_direction_set(gradient, direction);
+}
+
+static void
+eng_gradient_type_set(void *data __UNUSED__, void *gradient, char *name, char *params)
+{
+   evas_common_gradient_type_set(gradient, name, params);
+}
+
+static int
+eng_gradient_is_opaque(void *data __UNUSED__, void *context, void *gradient, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient *gr = (RGBA_Gradient *)gradient;
+
+   if (!dc || !gr || !gr->type.geometer)  return 0;
+   return !(gr->type.geometer->has_alpha(gr, dc->render_op) |
+              gr->type.geometer->has_mask(gr, dc->render_op));
+}
+
+static int
+eng_gradient_is_visible(void *data __UNUSED__, void *context, void *gradient, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+
+   if (!dc || !gradient)  return 0;
+   return 1;
+}
+
+static void
+eng_gradient_render_pre(void *data __UNUSED__, void *context, void *gradient)
+{
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+   RGBA_Gradient *gr = (RGBA_Gradient *)gradient;
+   int  len;
+
+   if (!dc || !gr || !gr->type.geometer)  return;
+   gr->type.geometer->geom_set(gr);
+   len = gr->type.geometer->get_map_len(gr);
+   evas_common_gradient_map(dc, gr, len);
+}
+
+static void
+eng_gradient_render_post(void *data __UNUSED__, void *gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient_draw(void *data __UNUSED__, void *context, void *surface, void *gradient, int x, int y, int w, int h)
+{
+#ifdef BUILD_PIPE_RENDER
+   if (cpunum > 1)
+     evas_common_pipe_grad_draw(surface, context, x, y, w, h, gradient);
+   else
+#endif   
+     {
+       evas_common_gradient_draw(surface, context, x, y, w, h, gradient);
+       evas_common_cpu_end_opt();
+     }
+}
+
+static int
+eng_image_alpha_get(void *data __UNUSED__, void *image)
+{
+   Image_Entry *im;
+
+   if (!image) return 1;
+   im = image;
+   switch (im->space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (im->flags.alpha) return 1;
+      default:
+       break;
+     }
+   return 0;
+}
+
+static int
+eng_image_colorspace_get(void *data __UNUSED__, void *image)
+{
+   Image_Entry *im;
+
+   if (!image) return EVAS_COLORSPACE_ARGB8888;
+   im = image;
+   return im->space;
+}
+
+static void *
+eng_image_alpha_set(void *data __UNUSED__, void *image, int has_alpha)
+{
+   RGBA_Image *im;
+
+   if (!image) return NULL;
+   im = image;
+   if (im->cache_entry.space != EVAS_COLORSPACE_ARGB8888)
+     {
+       im->cache_entry.flags.alpha = 0;
+       return im;
+     }
+   im = (RGBA_Image *) evas_cache_image_alone(&im->cache_entry);
+   evas_common_image_colorspace_dirty(im);
+
+   im->cache_entry.flags.alpha = has_alpha ? 1 : 0;
+   return im;
+}
+
+static void *
+eng_image_border_set(void *data __UNUSED__, void *image, int l __UNUSED__, int r __UNUSED__, int t __UNUSED__, int b __UNUSED__)
+{
+   RGBA_Image *im;
+
+   im = image;
+   return im;
+}
+
+static void
+eng_image_border_get(void *data __UNUSED__, void *image, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__)
+{
+   RGBA_Image *im;
+
+   im = image;
+}
+
+static char *
+eng_image_comment_get(void *data __UNUSED__, void *image, char *key __UNUSED__)
+{
+   RGBA_Image *im;
+
+   if (!image) return NULL;
+   im = image;
+   return im->info.comment;
+}
+
+static char *
+eng_image_format_get(void *data __UNUSED__, void *image __UNUSED__)
+{
+   return NULL;
+}
+
+static void
+eng_image_colorspace_set(void *data __UNUSED__, void *image, int cspace)
+{
+   Image_Entry *im;
+
+   if (!image) return;
+   im = image;
+   evas_cache_image_colorspace(im, cspace);
+}
+
+static void
+eng_image_native_set(void *data __UNUSED__, void *image __UNUSED__, void *native __UNUSED__)
+{
+}
+
+static void *
+eng_image_native_get(void *data __UNUSED__, void *image __UNUSED__)
+{
+   return NULL;
+}
+
+static void *
+eng_image_load(void *data __UNUSED__, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
+{
+   *error = EVAS_LOAD_ERROR_NONE;
+   return evas_common_load_image_from_file(file, key, lo, error);
+}
+
+static void *
+eng_image_new_from_data(void *data __UNUSED__, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   return evas_cache_image_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
+}
+
+static void *
+eng_image_new_from_copied_data(void *data __UNUSED__, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   return evas_cache_image_copied_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
+}
+
+static void
+eng_image_free(void *data __UNUSED__, void *image)
+{
+   evas_cache_image_drop(image);
+}
+
+static void
+eng_image_size_get(void *data __UNUSED__, void *image, int *w, int *h)
+{
+   Image_Entry *im;
+
+   im = image;
+   if (w) *w = im->w;
+   if (h) *h = im->h;
+}
+
+static void *
+eng_image_size_set(void *data __UNUSED__, void *image, int w, int h)
+{
+   Image_Entry *im;
+
+   im = image;
+   return evas_cache_image_size_set(image, w, h);
+}
+
+static void *
+eng_image_dirty_region(void *data __UNUSED__, void *image, int x, int y, int w, int h)
+{
+   Image_Entry *im = image;
+
+   if (!image) return NULL;
+   return evas_cache_image_dirty(im, x, y, w, h);
+}
+
+static void *
+eng_image_data_get(void *data __UNUSED__, void *image, int to_write, DATA32 **image_data)
+{
+   RGBA_Image *im;
+
+   if (!image)
+     {
+       *image_data = NULL;
+       return NULL;
+     }
+   im = image;
+   evas_cache_image_load_data(&im->cache_entry);
+   switch (im->cache_entry.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (to_write)
+          im = (RGBA_Image *) evas_cache_image_alone(&im->cache_entry);
+       *image_data = im->image.data;
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       *image_data = im->cs.data;
+        break;
+      default:
+       abort();
+       break;
+     }
+   return im;
+}
+
+static void *
+eng_image_data_put(void *data, void *image, DATA32 *image_data)
+{
+   RGBA_Image *im, *im2;
+
+   if (!image) return NULL;
+   im = image;
+   switch (im->cache_entry.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (image_data != im->image.data)
+         {
+            int w, h;
+
+            w = im->cache_entry.w;
+            h = im->cache_entry.h;
+            im2 = eng_image_new_from_data(data, w, h, image_data,
+                                          eng_image_alpha_get(data, image),
+                                          eng_image_colorspace_get(data, image));
+             evas_cache_image_drop(&im->cache_entry);
+            im = im2;
+         }
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       if (image_data != im->cs.data)
+         {
+            if (im->cs.data)
+              {
+                 if (!im->cs.no_free) free(im->cs.data);
+              }
+            im->cs.data = image_data;
+            evas_common_image_colorspace_dirty(im);
+         }
+        break;
+      default:
+       abort();
+       break;
+     }
+   return im;
+}
+
+static void
+eng_image_data_preload_request(void *data __UNUSED__, void *image, const void *target)
+{
+   RGBA_Image *im = image;
+
+   if (!im) return ;
+   evas_cache_image_preload_data(&im->cache_entry, target);
+}
+
+static void
+eng_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target)
+{
+   RGBA_Image *im = image;
+
+   if (!im) return ;
+   evas_cache_image_preload_cancel(&im->cache_entry, target);
+}
+
+static void
+eng_image_draw(void *data __UNUSED__, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
+{
+   RGBA_Image *im;
+
+   if (!image) return;
+   im = image;
+#ifdef BUILD_PIPE_RENDER
+   if (cpunum > 1)
+     {
+        evas_common_rgba_image_scalecache_prepare(im, surface, context, smooth,
+                                                  src_x, src_y, src_w, src_h,
+                                                  dst_x, dst_y, dst_w, dst_h);
+        
+        evas_common_pipe_image_draw(im, surface, context, smooth,
+                                    src_x, src_y, src_w, src_h,
+                                    dst_x, dst_y, dst_w, dst_h);
+     }
+   else
+#endif
+     {
+//        if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
+//          evas_cache_image_load_data(&im->cache_entry);
+//        evas_common_image_colorspace_normalize(im);
+        evas_common_rgba_image_scalecache_prepare(&im->cache_entry, surface, context, smooth,
+                                                  src_x, src_y, src_w, src_h,
+                                                  dst_x, dst_y, dst_w, dst_h);
+        evas_common_rgba_image_scalecache_do(&im->cache_entry, surface, context, smooth,
+                                             src_x, src_y, src_w, src_h,
+                                             dst_x, dst_y, dst_w, dst_h);
+/*        
+       if (smooth)
+         evas_common_scale_rgba_in_to_out_clip_smooth(im, surface, context,
+                                                      src_x, src_y, src_w, src_h,
+                                                      dst_x, dst_y, dst_w, dst_h);
+       else
+         evas_common_scale_rgba_in_to_out_clip_sample(im, surface, context,
+                                                      src_x, src_y, src_w, src_h,
+                                                      dst_x, dst_y, dst_w, dst_h);
+ */
+       evas_common_cpu_end_opt();
+     }
+}
+
+static void
+eng_image_map4_draw(void *data __UNUSED__, void *context, void *surface, void *image, RGBA_Map_Point *p, int smooth, int level)
+{
+   RGBA_Image *im, *srf;
+   RGBA_Map_Point *pt = p;
+
+   if (!image) return;
+   im = image;
+   srf = surface;
+   if ((p[0].x == p[3].x) &&
+       (p[1].x == p[2].x) &&
+       (p[0].y == p[1].y) &&
+       (p[3].y == p[2].y) &&
+       (p[0].x <= p[1].x) &&
+       (p[0].y <= p[2].y) &&
+       (p[0].u == 0) &&
+       (p[0].v == 0) &&
+       (p[1].u == (im->cache_entry.w << FP)) &&
+       (p[1].v == 0) &&
+       (p[2].u == (im->cache_entry.w << FP)) &&
+       (p[2].v == (im->cache_entry.h << FP)) &&
+       (p[3].u == 0) &&
+       (p[3].v == (im->cache_entry.h << FP)) &&
+       (p[0].col == 0xffffffff) &&
+       (p[1].col == 0xffffffff) &&
+       (p[2].col == 0xffffffff) &&
+       (p[3].col == 0xffffffff))
+     {
+        int dx, dy, dw, dh;
+        
+        dx = p[0].x >> FP;
+        dy = p[0].y >> FP;
+        dw = (p[2].x >> FP) - dx;
+        dh = (p[2].y >> FP) - dy;
+        eng_image_draw
+          (data, context, surface, image,
+           0, 0, im->cache_entry.w, im->cache_entry.h,
+           dx, dy, dw, dh, smooth);
+     }
+   else
+     {
+#ifdef BUILD_PIPE_RENDER
+        if (cpunum > 1)
+          evas_common_pipe_map4_draw(im, surface, context, p, smooth, level);
+        else
+#endif
+          evas_common_map4_rgba(im, surface, context, p, smooth, level);
+     }
+   evas_common_cpu_end_opt();
+}
+
+static void *
+eng_image_map_surface_new(void *data __UNUSED__, int w, int h, int alpha)
+{
+   void *surface;
+   DATA32 *pixels;
+   surface = evas_cache_image_copied_data(evas_common_image_cache_get(), 
+                                          w, h, NULL, alpha, 
+                                          EVAS_COLORSPACE_ARGB8888);
+   pixels = evas_cache_image_pixels(surface);
+   return surface;
+}
+
+static void
+eng_image_map_surface_free(void *data __UNUSED__, void *surface)
+{
+   evas_cache_image_drop(surface);
+}
+
+static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+   Image_Entry *im;
+
+   if (!image) return;
+   im = image;
+   im->scale_hint = hint;
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   Image_Entry *im;
+
+   if (!image) return EVAS_IMAGE_SCALE_HINT_NONE;
+   im = image;
+   return im->scale_hint;
+}
+
+static void
+eng_image_cache_flush(void *data __UNUSED__)
+{
+   int tmp_size;
+
+   tmp_size = evas_common_image_get_cache();
+   evas_common_image_set_cache(0);
+   evas_common_rgba_image_scalecache_flush();
+   evas_common_image_set_cache(tmp_size);
+}
+
+static void
+eng_image_cache_set(void *data __UNUSED__, int bytes)
+{
+   evas_common_image_set_cache(bytes);
+   evas_common_rgba_image_scalecache_size_set(bytes);
+}
+
+static int
+eng_image_cache_get(void *data __UNUSED__)
+{
+   return evas_common_image_get_cache();
+}
+
+static void *
+eng_font_load(void *data __UNUSED__, const char *name, int size)
+{
+   return evas_common_font_load(name, size);
+}
+
+static void *
+eng_font_memory_load(void *data __UNUSED__, char *name, int size, const void *fdata, int fdata_size)
+{
+   return evas_common_font_memory_load(name, size, fdata, fdata_size);
+}
+
+static void *
+eng_font_add(void *data __UNUSED__, void *font, const char *name, int size)
+{
+   return evas_common_font_add(font, name, size);
+}
+
+static void *
+eng_font_memory_add(void *data __UNUSED__, void *font, char *name, int size, const void *fdata, int fdata_size)
+{
+   return evas_common_font_memory_add(font, name, size, fdata, fdata_size);
+}
+
+static void
+eng_font_free(void *data __UNUSED__, void *font)
+{
+   evas_common_font_free(font);
+}
+
+static int
+eng_font_ascent_get(void *data __UNUSED__, void *font)
+{
+   return evas_common_font_ascent_get(font);
+}
+
+static int
+eng_font_descent_get(void *data __UNUSED__, void *font)
+{
+   return evas_common_font_descent_get(font);
+}
+
+static int
+eng_font_max_ascent_get(void *data __UNUSED__, void *font)
+{
+   return evas_common_font_max_ascent_get(font);
+}
+
+static int
+eng_font_max_descent_get(void *data __UNUSED__, void *font)
+{
+   return evas_common_font_max_descent_get(font);
+}
+
+static void
+eng_font_string_size_get(void *data __UNUSED__, void *font, const char *text, int *w, int *h)
+{
+   evas_common_font_query_size(font, text, w, h);
+}
+
+static int
+eng_font_inset_get(void *data __UNUSED__, void *font, const char *text)
+{
+   return evas_common_font_query_inset(font, text);
+}
+
+static int
+eng_font_h_advance_get(void *data __UNUSED__, void *font, const char *text)
+{
+   int h, v;
+
+   evas_common_font_query_advance(font, text, &h, &v);
+   return h;
+}
+
+static int
+eng_font_v_advance_get(void *data __UNUSED__, void *font, const char *text)
+{
+   int h, v;
+
+   evas_common_font_query_advance(font, text, &h, &v);
+   return v;
+}
+
+static int
+eng_font_char_coords_get(void *data __UNUSED__, void *font, const char *text, int pos, int *cx, int *cy, int *cw, int *ch)
+{
+   return evas_common_font_query_char_coords(font, text, pos, cx, cy, cw, ch);
+}
+
+static int
+eng_font_char_at_coords_get(void *data __UNUSED__, void *font, const char *text, int x, int y, int *cx, int *cy, int *cw, int *ch)
+{
+   return evas_common_font_query_text_at_pos(font, text, x, y, cx, cy, cw, ch);
+}
+
+static int
+eng_font_last_up_to_pos(void *data __UNUSED__, void *font, const char *text, int x, int y)
+{
+   return evas_common_font_query_last_up_to_pos(font, text, x, y);
+}
+
+static void
+eng_font_draw(void *data __UNUSED__, void *context, void *surface, void *font, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, const char *text)
+{
+#ifdef BUILD_PIPE_RENDER
+   if (cpunum > 1)
+     evas_common_pipe_text_draw(surface, context, font, x, y, text);
+   else
+#endif   
+     {
+       evas_common_font_draw(surface, context, font, x, y, text);
+       evas_common_cpu_end_opt();
+     }
+}
+
+static void
+eng_font_cache_flush(void *data __UNUSED__)
+{
+   evas_common_font_flush();
+}
+
+static void
+eng_font_cache_set(void *data __UNUSED__, int bytes)
+{
+   evas_common_font_cache_set(bytes);
+}
+
+static int
+eng_font_cache_get(void *data __UNUSED__)
+{
+   return evas_common_font_cache_get();
+}
+
+static void
+eng_font_hinting_set(void *data __UNUSED__, void *font, int hinting)
+{
+   evas_common_font_hinting_set(font, hinting);
+}
+
+static int
+eng_font_hinting_can_hint(void *data __UNUSED__, int hinting)
+{
+   return evas_common_hinting_available(hinting);
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data __UNUSED__, void *info __UNUSED__)
+{
+   return EINA_TRUE;
+}
+
+/*
+ *****
+ **
+ ** ENGINE API
+ **
+ *****
+ */
+
+static Evas_Func func =
+{
+   NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     eng_output_dump,
+     /* draw context virtual methods */
+     eng_context_new,
+     eng_canvas_alpha_get,
+     eng_context_free,
+     eng_context_clip_set,
+     eng_context_clip_clip,
+     eng_context_clip_unset,
+     eng_context_clip_get,
+     eng_context_color_set,
+     eng_context_color_get,
+     eng_context_multiplier_set,
+     eng_context_multiplier_unset,
+     eng_context_multiplier_get,
+     eng_context_cutout_add,
+     eng_context_cutout_clear,
+     eng_context_anti_alias_set,
+     eng_context_anti_alias_get,
+     eng_context_color_interpolation_set,
+     eng_context_color_interpolation_get,
+     eng_context_render_op_set,
+     eng_context_render_op_get,
+     /* rect draw funcs */
+     eng_rectangle_draw,
+     /* line draw funcs */
+     eng_line_draw,
+     /* polygon draw funcs */
+     eng_polygon_point_add,
+     eng_polygon_points_clear,
+     eng_polygon_draw,
+     /* gradient draw funcs */
+     eng_gradient2_color_np_stop_insert,
+     eng_gradient2_clear,
+     eng_gradient2_fill_transform_set,
+     eng_gradient2_fill_spread_set,
+
+     eng_gradient2_linear_new,
+     eng_gradient2_linear_free,
+     eng_gradient2_linear_fill_set,
+     eng_gradient2_linear_is_opaque,
+     eng_gradient2_linear_is_visible,
+     eng_gradient2_linear_render_pre,
+     eng_gradient2_linear_render_post,
+     eng_gradient2_linear_draw,
+
+     eng_gradient2_radial_new,
+     eng_gradient2_radial_free,
+     eng_gradient2_radial_fill_set,
+     eng_gradient2_radial_is_opaque,
+     eng_gradient2_radial_is_visible,
+     eng_gradient2_radial_render_pre,
+     eng_gradient2_radial_render_post,
+     eng_gradient2_radial_draw,
+
+     eng_gradient_new,
+     eng_gradient_free,
+     eng_gradient_color_stop_add,
+     eng_gradient_alpha_stop_add,
+     eng_gradient_color_data_set,
+     eng_gradient_alpha_data_set,
+     eng_gradient_clear,
+     eng_gradient_fill_set,
+     eng_gradient_fill_angle_set,
+     eng_gradient_fill_spread_set,
+     eng_gradient_angle_set,
+     eng_gradient_offset_set,
+     eng_gradient_direction_set,
+     eng_gradient_type_set,
+     eng_gradient_is_opaque,
+     eng_gradient_is_visible,
+     eng_gradient_render_pre,
+     eng_gradient_render_post,
+     eng_gradient_draw,
+     /* image draw funcs */
+     eng_image_load,
+     eng_image_new_from_data,
+     eng_image_new_from_copied_data,
+     eng_image_free,
+     eng_image_size_get,
+     eng_image_size_set,
+     NULL,
+     eng_image_dirty_region,
+     eng_image_data_get,
+     eng_image_data_put,
+     eng_image_data_preload_request,
+     eng_image_data_preload_cancel,
+     eng_image_alpha_set,
+     eng_image_alpha_get,
+     eng_image_border_set,
+     eng_image_border_get,
+     eng_image_draw,
+     eng_image_comment_get,
+     eng_image_format_get,
+     eng_image_colorspace_set,
+     eng_image_colorspace_get,
+     eng_image_native_set,
+     eng_image_native_get,
+     /* image cache funcs */
+     eng_image_cache_flush,
+     eng_image_cache_set,
+     eng_image_cache_get,
+     /* font draw functions */
+     eng_font_load,
+     eng_font_memory_load,
+     eng_font_add,
+     eng_font_memory_add,
+     eng_font_free,
+     eng_font_ascent_get,
+     eng_font_descent_get,
+     eng_font_max_ascent_get,
+     eng_font_max_descent_get,
+     eng_font_string_size_get,
+     eng_font_inset_get,
+     eng_font_h_advance_get,
+     eng_font_v_advance_get,
+     eng_font_char_coords_get,
+     eng_font_char_at_coords_get,
+     eng_font_draw,
+     /* font cache functions */
+     eng_font_cache_flush,
+     eng_font_cache_set,
+     eng_font_cache_get,
+     /* font hinting functions */
+     eng_font_hinting_set,
+     eng_font_hinting_can_hint,
+     eng_image_scale_hint_set,
+     eng_image_scale_hint_get,
+     /* more font draw functions */
+     eng_font_last_up_to_pos,
+     /* FUTURE software generic calls go here (done) */
+     eng_image_map4_draw,
+     eng_image_map_surface_new,
+     eng_image_map_surface_free
+     /* FUTURE software generic calls go here */
+};
+
+/*
+ *****
+ **
+ ** MODULE ACCESSIBLE API API
+ **
+ *****
+ */
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   _evas_soft_gen_log_dom = eina_log_domain_register("EvasSoftGeneric", EVAS_DEFAULT_LOG_COLOR);
+   if(_evas_soft_gen_log_dom<0)
+     {
+       EINA_LOG_ERR("Evas SoftGen : Impossible to create a log domain for the software generic engine.\n");
+       return 0;
+     }
+   em->functions = (void *)(&func);
+   cpunum = eina_cpu_count();
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+  eina_log_domain_unregister(_evas_soft_gen_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "software_generic",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_generic);
+
+#ifndef EVAS_STATIC_BUILD_SOFTWARE_GENERIC
+EVAS_EINA_MODULE_DEFINE(engine, software_generic);
+#endif
diff --git a/src/modules/engines/software_qtopia/.cvsignore b/src/modules/engines/software_qtopia/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/engines/software_qtopia/Evas_Engine_Software_Qtopia.h b/src/modules/engines/software_qtopia/Evas_Engine_Software_Qtopia.h
new file mode 100644 (file)
index 0000000..5b863b0
--- /dev/null
@@ -0,0 +1,31 @@
+#ifndef _EVAS_ENGINE_SOFTWARE_QTOPIA_H
+#define _EVAS_ENGINE_SOFTWARE_QTOPIA_H
+
+#ifdef EVAS_COMMON_H
+#ifdef EVAS_PRIVATE_H
+typedef void QWidget;
+#endif
+#endif
+
+#ifndef EVAS_COMMON_H
+#ifndef EVAS_PRIVATE_H
+#include <qwidget.h>
+#endif
+#endif
+
+typedef struct _Evas_Engine_Info_Software_Qtopia Evas_Engine_Info_Software_Qtopia;
+
+struct _Evas_Engine_Info_Software_Qtopia
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   struct {
+      QWidget *target;
+      int      rotation;
+   } info;
+};
+#endif
+
+
diff --git a/src/modules/engines/software_qtopia/Makefile.am b/src/modules/engines/software_qtopia/Makefile.am
new file mode 100644 (file)
index 0000000..a8ac900
--- /dev/null
@@ -0,0 +1,46 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_engine_software_qtopia_cflags@
+
+AM_CXXFLAGS = $(CFLAGS) -DQT_QWS_EBX -DQT_QWS_CUSTOM -DQWS -DNO_DEBUG
+
+if BUILD_ENGINE_SOFTWARE_QTOPIA
+
+SOFTWARE_QTOPIA_SOURCES = \
+evas_engine.c \
+evas_outbuf.c \
+evas_qt_main.cpp
+
+SOFTWARE_QTOPIA_LIBADD = @evas_engine_software_qtopia_libs@
+
+pkgdir = $(libdir)/evas/modules/engines/software_qtopia/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_Software_Qtopia.h
+
+if !EVAS_STATIC_BUILD_SOFTWARE_QTOPIA
+
+pkg_LTLIBRARIES = module.la
+module_la_SOURCES = $(SOFTWARE_QTOPIA_SOURCES)
+module_la_LIBADD = @EINA_LIBS@ $(SOFTWARE_QTOPIA_LIBADD) $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_software_qtopia.la
+
+libevas_engine_software_qtopia_la_SOURCES = $(SOFTWARE_QTOPIA_SOURCES)
+libevas_engine_software_qtopia_la_LIBADD = $(SOFTWARE_QTOPIA_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/software_qtopia/evas_engine.c b/src/modules/engines/software_qtopia/evas_engine.c
new file mode 100644 (file)
index 0000000..89b139a
--- /dev/null
@@ -0,0 +1,326 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_Software_Qtopia.h"
+
+int _evas_engine_soft_qtopia_log_dom = -1;
+/* function tables - filled in later (func and parent func) */
+static Evas_Func func, pfunc;
+
+/* engine struct data */
+typedef struct _Render_Engine Render_Engine;
+
+struct _Render_Engine
+{
+   Tilebuf          *tb;
+   Outbuf           *ob;
+   Tilebuf_Rect     *rects;
+   Eina_Inlist      *cur_rect;
+   int               end : 1;
+};
+
+/* prototypes we will use here */
+static void *_output_setup(int w, int h, int rot, QWidget *target);
+
+static void *eng_info(Evas *e);
+static void eng_info_free(Evas *e, void *info);
+static int eng_setup(Evas *e, void *info);
+static void eng_output_free(void *data);
+static void eng_output_resize(void *data, int w, int h);
+static void eng_output_tile_size_set(void *data, int w, int h);
+static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_clear(void *data);
+static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
+static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
+static void eng_output_flush(void *data);
+static void eng_output_idle_flush(void *data);
+
+/* internal engine routines */
+static void *
+_output_setup(int w, int h, int rot, QWidget *target)
+{
+   Render_Engine *re;
+
+   re = calloc(1, sizeof(Render_Engine));
+   if (!re)
+     return NULL;
+   /* if we haven't initialized - init (automatic abort if already done) */
+   evas_common_cpu_init();
+
+   evas_common_blend_init();
+   evas_common_image_init();
+   evas_common_convert_init();
+   evas_common_scale_init();
+   evas_common_rectangle_init();
+   evas_common_gradient_init();
+   evas_common_polygon_init();
+   evas_common_line_init();
+   evas_common_font_init();
+   evas_common_draw_init();
+   evas_common_tilebuf_init();
+
+   evas_qtopia_outbuf_software_qtopia_init();
+
+   /* get any stored performance metrics from device (xserver) */
+   re->ob = evas_qtopia_outbuf_software_qtopia_setup_q(w, h, rot, OUTBUF_DEPTH_INHERIT, target);
+   if (!re->ob)
+     {
+       free(re);
+       return NULL;
+     }
+   evas_qtopia_outbuf_software_qtopia_set_have_backbuf(re->ob, 0);
+   re->tb = evas_common_tilebuf_new(w, h);
+   if (!re->tb)
+     {
+       evas_qtopia_outbuf_software_qtopia_free(re->ob);
+       free(re);
+       return NULL;
+     }
+   /* in preliminary tests 16x16 gave highest framerates */
+   evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+   return re;
+}
+
+/* engine api this module provides */
+static void *
+eng_info(Evas *e)
+{
+   Evas_Engine_Info_Software_Qtopia *info;
+   info = calloc(1, sizeof(Evas_Engine_Info_Software_Qtopia));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   return info;
+   e = NULL;
+}
+
+static void
+eng_info_free(Evas *e, void *info)
+{
+   Evas_Engine_Info_Software_Qtopia *in;
+   in = (Evas_Engine_Info_Software_Qtopia *)info;
+   free(in);
+}
+
+static int
+eng_setup(Evas *e, void *in)
+{
+   Render_Engine *re;
+   Evas_Engine_Info_Software_Qtopia *info;
+
+   info = (Evas_Engine_Info_Software_Qtopia *)in;
+   if (!e->engine.data.output)
+     e->engine.data.output =
+     _output_setup(e->output.w,
+                  e->output.h,
+                  info->info.rotation,
+                  info->info.target);
+  if (!e->engine.data.output) return 0;
+   if (!e->engine.data.context)
+     e->engine.data.context =
+     e->engine.func->context_new(e->engine.data.output);
+
+   re = e->engine.data.output;
+
+   return 1;
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_qtopia_outbuf_software_qtopia_free(re->ob);
+   evas_common_tilebuf_free(re->tb);
+   if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+}
+
+static void
+eng_output_resize(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_qtopia_outbuf_software_qtopia_reconfigure(re->ob, w, h,
+                                                 evas_qtopia_outbuf_software_qtopia_get_rot(re->ob),
+                                                 OUTBUF_DEPTH_INHERIT);
+   evas_qtopia_outbuf_software_qtopia_set_have_backbuf(re->ob, 0);
+   evas_common_tilebuf_free(re->tb);
+   re->tb = evas_common_tilebuf_new(w, h);
+   if (re->tb)
+     evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+}
+
+static void
+eng_output_tile_size_set(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_set_tile_size(re->tb, w, h);
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_clear(re->tb);
+}
+
+static void *
+eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re;
+   RGBA_Image *surface;
+   Tilebuf_Rect *rect;
+   int ux, uy, uw, uh;
+
+   re = (Render_Engine *)data;
+   if (re->end)
+     {
+       re->end = 0;
+       return NULL;
+     }
+   if (!re->rects)
+     {
+       re->rects = evas_common_tilebuf_get_render_rects(re->tb);
+       re->cur_rect = EINA_INLIST_GET(re->rects);
+     }
+   if (!re->cur_rect) return NULL;
+   rect = (Tilebuf_Rect *)re->cur_rect;
+   ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h;
+   re->cur_rect = re->cur_rect->next;
+   if (!re->cur_rect)
+     {
+       evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       re->end = 1;
+     }
+
+   surface = evas_qtopia_outbuf_software_qtopia_new_region_for_update(re->ob,
+                                                         ux, uy, uw, uh,
+                                                         cx, cy, cw, ch);
+   *x = ux; *y = uy; *w = uw; *h = uh;
+   return surface;
+}
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+   Evas_Engine_Info_Software_Qtopia *info;
+
+   re = (Render_Engine *)data;
+#ifdef BUILD_PIPE_RENDER
+   evas_common_pipe_map4_begin(surface);
+#endif   
+   evas_qtopia_outbuf_software_qtopia_push_updated_region(re->ob, surface, x, y, w, h);
+   evas_qtopia_outbuf_software_qtopia_free_region_for_update(re->ob, surface);
+   evas_common_cpu_end_opt();
+}
+
+static void
+eng_output_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+}
+
+static void
+eng_output_idle_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data, void *context)
+{
+   return EINA_FALSE;
+}
+
+/* module advertising code */
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
+   _evas_engine_soft_qtopia_log_dom = eina_log_domain_register("EvasSoftQtopia",EVAS_DEFAULT_LOG_COLOR);
+   if(_evas_engine_soft_qtopia_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the qtopia engine.\n");
+       return NULL;
+     }
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(canvas_alpha_get);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+  eina_log_domain_unregister(_evas_engine_soft_qtopia_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "software_qtopia",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_qtopia);
+
+#ifndef EVAS_STATIC_BUILD_SOFTWARE_QTOPIA
+EVAS_EINA_MODULE_DEFINE(engine, software_qtopia);
+#endif
diff --git a/src/modules/engines/software_qtopia/evas_engine.h b/src/modules/engines/software_qtopia/evas_engine.h
new file mode 100644 (file)
index 0000000..9e65fbe
--- /dev/null
@@ -0,0 +1,129 @@
+#ifndef EVAS_ENGINE_H
+#define EVAS_ENGINE_H
+
+extern int _evas_engine_soft_qtopia_log_dom ;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_qtopia_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_qtopia_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_qtopia_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_qtopia_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_qtopia_log_dom, __VA_ARGS__)
+
+typedef struct _Outbuf                Outbuf;
+typedef struct _QT_Direct             QT_Direct;
+typedef struct _QT_Direct_Rect        QT_Direct_Rect;
+
+enum _Outbuf_Depth
+{
+   OUTBUF_DEPTH_NONE,
+     OUTBUF_DEPTH_INHERIT,
+     OUTBUF_DEPTH_RGB_16BPP_565_565_DITHERED,
+     OUTBUF_DEPTH_RGB_16BPP_555_555_DITHERED,
+     OUTBUF_DEPTH_RGB_16BPP_444_444_DITHERED,
+     OUTBUF_DEPTH_RGB_16BPP_565_444_DITHERED,
+     OUTBUF_DEPTH_RGB_32BPP_888_8888,
+     OUTBUF_DEPTH_LAST
+};
+
+typedef enum   _Outbuf_Depth          Outbuf_Depth;
+
+
+struct _Outbuf
+{
+   Outbuf_Depth    depth;
+   int             w, h;
+   int             rot;
+
+   struct {
+      void *target;
+
+      struct {
+        DATA32    r, g, b;
+      } mask;
+      RGBA_Image  *back_buf;
+   } priv;
+};
+
+struct _QT_Direct_Rect
+{
+   int x, y, w, h;
+};
+
+struct _QT_Direct
+{
+   /* our target widget */
+   void *target;
+   /* our direct painter object */
+   void *direct;
+   /* The fb */
+   struct
+     {
+       DATA8             *data;
+       int                bpp;
+       int                rotation;
+       int                width;
+       struct {
+          DATA32          r, g, b;
+       } mask;
+     } fb;
+   /* Relative to fb coords */
+   struct {
+      int                 count;
+      QT_Direct_Rect     *r;
+   } rects;
+   /* Relative to fb coords */
+   QT_Direct_Rect         location;
+   QT_Direct_Rect         updated;
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/****/
+void             x_software_qtopia_init                    (void);
+
+void         evas_qtopia_outbuf_software_qtopia_init                   (void);
+void         evas_qtopia_outbuf_software_qtopia_free                   (Outbuf *buf);
+
+Outbuf      *evas_qtopia_outbuf_software_qtopia_setup_q                (int w, int h, int rot, Outbuf_Depth depth, void *target);
+
+void         evas_qtopia_outbuf_software_qtopia_blit                   (Outbuf *buf, int src_x, int src_y, int w, int h, int dst_x, int dst_y);
+void         evas_qtopia_outbuf_software_qtopia_update                 (Outbuf *buf, int x, int y, int w, int h);
+RGBA_Image  *evas_qtopia_outbuf_software_qtopia_new_region_for_update  (Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch);
+void         evas_qtopia_outbuf_software_qtopia_free_region_for_update (Outbuf *buf, RGBA_Image *update);
+void         evas_qtopia_outbuf_software_qtopia_push_updated_region    (Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h);
+void         evas_qtopia_outbuf_software_qtopia_reconfigure            (Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth);
+int          evas_qtopia_outbuf_software_qtopia_get_width              (Outbuf *buf);
+int          evas_qtopia_outbuf_software_qtopia_get_height             (Outbuf *buf);
+Outbuf_Depth evas_qtopia_outbuf_software_qtopia_get_depth              (Outbuf *buf);
+int          evas_qtopia_outbuf_software_qtopia_get_rot                (Outbuf *buf);
+int          evas_qtopia_outbuf_software_qtopia_get_have_backbuf       (Outbuf *buf);
+void         evas_qtopia_outbuf_software_qtopia_set_have_backbuf       (Outbuf *buf, int have_backbuf);
+
+QT_Direct   *evas_qt_main_direct_start                     (void *target);
+void         evas_qt_main_direct_stop                      (QT_Direct *d);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/modules/engines/software_qtopia/evas_outbuf.c b/src/modules/engines/software_qtopia/evas_outbuf.c
new file mode 100644 (file)
index 0000000..3e6790e
--- /dev/null
@@ -0,0 +1,245 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+#include "evas_private.h"
+#include "Evas_Engine_Software_Qtopia.h"
+#include <sys/time.h>
+#include <sys/utsname.h>
+
+void
+evas_qtopia_outbuf_software_qtopia_init(void)
+{
+}
+
+void
+evas_qtopia_outbuf_software_qtopia_free(Outbuf *buf)
+{
+   free(buf);
+}
+
+Outbuf *
+evas_qtopia_outbuf_software_qtopia_setup_q(int w, int h, int rot, Outbuf_Depth depth, QWidget *target)
+{
+   Outbuf *buf;
+
+   buf = calloc(1, sizeof(Outbuf));
+   if (!buf)
+     {
+       free(buf);
+       return NULL;
+     }
+
+   buf->w = w;
+   buf->h = h;
+   buf->rot = rot;
+   buf->priv.target = target;
+     {
+       QT_Direct *direct;
+
+       direct = evas_qt_main_direct_start(buf->priv.target);
+       if (direct)
+         {
+            buf->w = direct->location.w;
+            buf->h = direct->location.h;
+            buf->rot = direct->fb.rotation;
+            evas_qt_main_direct_stop(direct);
+         }
+     }
+   return buf;
+}
+
+void
+evas_qtopia_outbuf_software_qtopia_blit(Outbuf *buf, int src_x, int src_y, int w, int h, int dst_x, int dst_y)
+{
+}
+
+void
+evas_qtopia_outbuf_software_qtopia_update(Outbuf *buf, int x, int y, int w, int h)
+{
+}
+
+RGBA_Image *
+evas_qtopia_outbuf_software_qtopia_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch)
+{
+   RGBA_Image *im;
+
+   *cx = 0; *cy = 0; *cw = w; *ch = h;
+   im = evas_common_image_create(w, h);
+   return im;
+}
+
+void
+evas_qtopia_outbuf_software_qtopia_free_region_for_update(Outbuf *buf, RGBA_Image *update)
+{
+   evas_common_image_free(update);
+}
+
+void
+evas_qtopia_outbuf_software_qtopia_push_updated_region(Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h)
+{
+   Gfx_Func_Convert conv_func;
+   DATA8 *data;
+   QT_Direct *d;
+
+   data = NULL;
+   conv_func = NULL;
+
+   d = evas_qt_main_direct_start(buf->priv.target);
+   if (d)
+     {
+       int i;
+
+       for (i = 0; i < d->rects.count; i++)
+         {
+            int fb_bytes;
+            DATA8 *fb_mem;
+            int ox, oy, ow, oh;
+            int rx, ry, rw, rh;
+
+            ox = x; oy = y; ow = w; oh = h;
+            rx = d->rects.r[i].x - d->location.x;
+            ry = d->rects.r[i].y - d->location.y;
+            rw = d->rects.r[i].w;
+            rh = d->rects.r[i].h;
+            if (x < rx)
+              {
+                 w += (x - rx);
+                 x = rx;
+              }
+            if (y < ry)
+              {
+                 h += (y - ry);
+                 y = ry;
+              }
+            if ((w <= 0) || (h <= 0)) goto nope;
+            if ((x + w) > (rx + rw)) w = (rx + rw - x);
+            if ((y + h) > (ry + rh)) h = (ry + rh - y);
+            if ((w <= 0) || (h <= 0)) goto nope;
+            fb_bytes = d->fb.bpp / 8;
+            if (buf->rot == 0)
+              {
+                 fb_mem = d->fb.data +
+                   ((d->location.y * d->fb.width * fb_bytes) +
+                    (d->location.x * fb_bytes));
+                 data = fb_mem + (fb_bytes * (x + (y * d->fb.width)));
+                 conv_func = evas_common_convert_func_get(data, w, h, d->fb.bpp,
+                                              d->fb.mask.r, d->fb.mask.g, d->fb.mask.b,
+                                              PAL_MODE_NONE, buf->rot);
+              }
+            else if (buf->rot == 180)
+              {
+                // FIXME
+              }
+            else if (buf->rot == 270)
+              {
+                  fb_mem = d->fb.data +
+                   (fb_bytes *
+                    ((d->location.x * d->fb.width) +
+                     (d->fb.width - d->location.y - d->location.h)));
+                 data = fb_mem + (fb_bytes * (buf->h - y - h + (x * d->fb.width)));
+                 conv_func = evas_common_convert_func_get(data, h, w, d->fb.bpp,
+                                              d->fb.mask.r, d->fb.mask.g, d->fb.mask.b,
+                                              PAL_MODE_NONE, buf->rot);
+              }
+            else if (buf->rot == 90)
+              {
+                 // FIXME: wrong fb_mem
+                 fb_mem = d->fb.data +
+                   ((d->location.y * d->fb.width * fb_bytes) +
+                    (d->location.x * fb_bytes));
+                 data = fb_mem + (fb_bytes * (y + ((buf->w - x - w) * d->fb.width)));
+                 conv_func = evas_common_convert_func_get(data, h, w, d->fb.bpp,
+                                              d->fb.mask.r, d->fb.mask.g, d->fb.mask.b,
+                                              PAL_MODE_NONE, buf->rot);
+              }
+            if (conv_func)
+              {
+                 DATA32 *src_data;
+
+                 if (buf->rot == 0)
+                   {
+                      src_data = update->image->data +
+                        (ow * (y - oy)) + (x - ox);
+                      conv_func(src_data, data,
+                                ow - w,
+                                d->fb.width - w,
+                                w, h,
+                                x, y, NULL);
+                   }
+                 else if (buf->rot == 180)
+                   {
+                     // FIXME
+                   }
+                 else if (buf->rot == 270)
+                   {
+                      src_data = update->image->data +
+                        (ow * (y - oy)) + (x - ox);
+                      conv_func(src_data, data,
+                                ow - w,
+                                d->fb.width - h,
+                                h, w,
+                                x, y, NULL);
+                   }
+                 else if (buf->rot == 90)
+                   {
+                      src_data = update->image->data +
+                        (ow * (y - oy)) + (x - ox);
+                      conv_func(src_data, data,
+                                ow - w,
+                                d->fb.width - h,
+                                h, w,
+                                x, y, NULL);
+                   }
+              }
+            nope:;
+            x = ox; y = oy; w = ow; h = oh;
+         }
+       d->updated.x = x; d->updated.y = y; d->updated.w = w; d->updated.h = h;
+       evas_qt_main_direct_stop(d);
+     }
+}
+
+void
+evas_qtopia_outbuf_software_qtopia_reconfigure(Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth)
+{
+   if ((w == buf->w) && (h == buf->h) &&
+       (rot == buf->rot) && (depth == buf->depth))
+     return;
+   buf->w = w;
+   buf->h = h;
+   buf->rot = rot;
+}
+
+int
+evas_qtopia_outbuf_software_qtopia_get_width(Outbuf *buf)
+{
+   return buf->w;
+}
+
+int
+evas_qtopia_outbuf_software_qtopia_get_height(Outbuf *buf)
+{
+   return buf->h;
+}
+
+Outbuf_Depth
+evas_qtopia_outbuf_software_qtopia_get_depth(Outbuf *buf)
+{
+   return buf->depth;
+}
+
+int
+evas_qtopia_outbuf_software_qtopia_get_rot(Outbuf *buf)
+{
+   return buf->rot;
+}
+
+int
+evas_qtopia_outbuf_software_qtopia_get_have_backbuf(Outbuf *buf)
+{
+   return 0;
+}
+
+void
+evas_qtopia_outbuf_software_qtopia_set_have_backbuf(Outbuf *buf, int have_backbuf)
+{
+}
diff --git a/src/modules/engines/software_qtopia/evas_qt_main.cpp b/src/modules/engines/software_qtopia/evas_qt_main.cpp
new file mode 100644 (file)
index 0000000..bca95ba
--- /dev/null
@@ -0,0 +1,109 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+#include <qwidget.h>
+#include <qnamespace.h>
+#include <qbrush.h>
+#include <qpainter.h>
+#include <qdirectpainter_qws.h>
+
+//#define QVFB_BUG
+
+extern "C" {
+   QT_Direct *
+     evas_qt_main_direct_start(void *target)
+       {
+         QT_Direct *d;
+         QDirectPainter *dp;
+         QWidget *widget;
+         int i;
+
+         widget = (QWidget *)target;
+         dp = new QDirectPainter(widget);
+         if (!dp) return NULL;
+         d = (QT_Direct *)calloc(1, sizeof(QT_Direct));
+         if (!d) return NULL;
+         d->target = target;
+         d->direct = (void *)dp;
+         d->fb.data = dp->frameBuffer();
+         d->fb.bpp = dp->depth();
+         d->fb.width = dp->lineStep() / (d->fb.bpp / 8);
+         if (dp->depth() == 16)
+           {
+              d->fb.mask.r = 0xf800;
+              d->fb.mask.g = 0x07e0;
+              d->fb.mask.b = 0x001f;
+           }
+         else if (dp->depth() == 32)
+           {
+              d->fb.mask.r = 0x00ff0000;
+              d->fb.mask.g = 0x0000ff00;
+              d->fb.mask.b = 0x000000ff;
+           }
+         else
+           {
+              delete dp;
+              free(d);
+              return NULL;
+           }
+         d->fb.rotation = dp->transformOrientation() * 90;
+         d->rects.count = dp->numRects();
+         if (d->rects.count > 0)
+           {
+              d->rects.r = (QT_Direct_Rect *)calloc(d->rects.count, sizeof(QT_Direct_Rect));
+              if (d->rects.r)
+                {
+                   for (i = 0; i < d->rects.count; i++)
+                     {
+                        QRect r;
+
+                        r = dp->rect(i);
+                        if (d->fb.rotation == 0)
+                          {
+                             d->rects.r[i].x = r.x();
+                             d->rects.r[i].y = r.y();
+                             d->rects.r[i].w = r.width();
+                             d->rects.r[i].h = r.height();
+                          }
+                        else if (d->fb.rotation == 270)
+                          {
+                             d->rects.r[i].x = r.y();
+                             d->rects.r[i].y = d->fb.width - r.x() - r.width();
+                             d->rects.r[i].w = r.height();
+                             d->rects.r[i].h = r.width();
+                          }
+                        else if (d->fb.rotation == 90)
+                          {
+                             // FIXME: do
+                          }
+                     }
+                }
+              else
+                d->rects.count = 0;
+           }
+         d->location.x = dp->xOffset();
+         d->location.y = dp->yOffset();
+         d->location.w = dp->width();
+         d->location.h = dp->height();
+         return d;
+       }
+   void
+     evas_qt_main_direct_stop(QT_Direct *d)
+       {
+         QDirectPainter *dp;
+
+#ifdef QVFB_BUG
+           {
+              QWidget *target = (QWidget *)d->target;
+              QRect rect(d->updated.x, d->updated.y,
+                         d->updated.w, d->updated.h);
+              QPainter p(target);
+
+              p.fillRect(rect, QBrush::NoBrush);
+           }
+#endif
+         dp = (QDirectPainter *)d->direct;
+         delete dp;
+         if (d->rects.r) free(d->rects.r);
+         free(d);
+       }
+}
diff --git a/src/modules/engines/software_sdl/.cvsignore b/src/modules/engines/software_sdl/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/engines/software_sdl/Evas_Engine_SDL.h b/src/modules/engines/software_sdl/Evas_Engine_SDL.h
new file mode 100644 (file)
index 0000000..71efa8a
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef _EVAS_ENGINE_SDL_H
+#define _EVAS_ENGINE_SDL_H
+
+#include <SDL/SDL.h>
+
+typedef struct _Evas_Engine_Info_SDL Evas_Engine_Info_SDL;
+
+struct _Evas_Engine_Info_SDL
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   struct {
+     int                        rotation;
+     int                       fullscreen : 1;
+     int                        hwsurface : 1;
+     int                       noframe : 1;
+     int                        alpha : 1;
+   } info;
+};
+#endif
+
+
diff --git a/src/modules/engines/software_sdl/Makefile.am b/src/modules/engines/software_sdl/Makefile.am
new file mode 100644 (file)
index 0000000..8f075c3
--- /dev/null
@@ -0,0 +1,43 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_engine_software_sdl_cflags@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+if BUILD_ENGINE_SOFTWARE_SDL
+
+SOFTWARE_SDL_SOURCES = evas_engine.c
+SOFTWARE_SDL_LIBADD = @evas_engine_software_sdl_libs@
+
+pkgdir = $(libdir)/evas/modules/engines/software_sdl/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_SDL.h
+
+if !EVAS_STATIC_BUILD_SOFTWARE_SDL
+
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES  = $(SOFTWARE_SDL_SOURCES)
+module_la_LIBADD = $(top_builddir)/src/lib/libevas.la @EINA_LIBS@ $(SOFTWARE_SDL_LIBADD)
+module_la_LDFLAGS = @lt_enable_auto_import@ -no-undefined -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_software_sdl.la
+
+libevas_engine_software_sdl_la_SOURCES = $(SOFTWARE_SDL_SOURCES)
+libevas_engine_software_sdl_la_LIBADD = $(SOFTWARE_SDL_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/software_sdl/evas_engine.c b/src/modules/engines/software_sdl/evas_engine.c
new file mode 100644 (file)
index 0000000..db1e590
--- /dev/null
@@ -0,0 +1,1223 @@
+#include <assert.h>
+#include <math.h>
+#include <string.h>
+#include <sys/time.h>
+#include <time.h>
+#include <SDL/SDL.h>
+
+#include "evas_common.h"
+#include "evas_engine.h"
+
+int _evas_engine_soft_sdl_log_dom = -1;
+/* #define DEBUG_SDL */
+
+static Evas_Func       func = {};
+static Evas_Func       pfunc = {};
+
+static void*                     _sdl_output_setup     (int w, int h, int fullscreen, int noframe, int alpha, int hwsurface);
+
+static Engine_Image_Entry       *_sdl_image_alloc       (void);
+static void                      _sdl_image_delete      (Engine_Image_Entry *eim);
+
+static int                       _sdl_image_constructor (Engine_Image_Entry*, void* data);
+static void                      _sdl_image_destructor  (Engine_Image_Entry *eim);
+
+static void                      _sdl_image_dirty_region(Engine_Image_Entry *eim, int x, int y, int w, int h);
+
+static int                       _sdl_image_dirty       (Engine_Image_Entry *dst, const Engine_Image_Entry *src);
+
+static int                       _sdl_image_size_set    (Engine_Image_Entry *dst, const Engine_Image_Entry *src);
+
+static int                       _sdl_image_update_data (Engine_Image_Entry* dst, void* engine_data);
+
+static void                      _sdl_image_load        (Engine_Image_Entry *eim, const Image_Entry* im);
+static int                       _sdl_image_mem_size_get(Engine_Image_Entry *eim);
+
+#ifdef DEBUG_SDL
+static void                      _sdl_image_debug       (const char* context, Engine_Image_Entry* im);
+#endif
+
+static const Evas_Cache_Engine_Image_Func       _sdl_cache_engine_image_cb = {
+  NULL /* key */,
+  _sdl_image_alloc /* alloc */,
+  _sdl_image_delete /* dealloc */,
+  _sdl_image_constructor /* constructor */,
+  _sdl_image_destructor /* destructor */,
+  _sdl_image_dirty_region /* dirty_region */,
+  _sdl_image_dirty /* dirty */,
+  _sdl_image_size_set /* size_set */,
+  _sdl_image_update_data /* update_data */,
+  _sdl_image_load /* load */,
+  _sdl_image_mem_size_get /* mem_size_get */,
+#ifdef DEBUG_SDL  /* debug */
+  _sdl_image_debug
+#else
+  NULL
+#endif
+};
+
+#define _SDL_UPDATE_PIXELS(EIM)                                 \
+  ((RGBA_Image *) EIM->cache_entry.src)->image.data = EIM->surface->pixels;
+
+#define RMASK 0x00ff0000
+#define GMASK 0x0000ff00
+#define BMASK 0x000000ff
+#define AMASK 0xff000000
+
+/* SDL engine info function */
+static void*
+evas_engine_sdl_info           (Evas* e __UNUSED__)
+{
+   Evas_Engine_Info_SDL*       info;
+   info = calloc(1, sizeof (Evas_Engine_Info_SDL));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   return info;
+}
+
+static void
+evas_engine_sdl_info_free      (Evas* e __UNUSED__, void* info)
+{
+   Evas_Engine_Info_SDL*       in;
+   in = (Evas_Engine_Info_SDL*) info;
+   free(in);
+   in = NULL;
+}
+
+/* SDL engine output manipulation function */
+static int
+evas_engine_sdl_setup          (Evas* e, void* in)
+{
+   Evas_Engine_Info_SDL*       info = (Evas_Engine_Info_SDL*) in;
+
+   /* if we arent set to sdl, why the hell do we get called?! */
+   if (evas_output_method_get(e) != evas_render_method_lookup("software_sdl"))
+      return 0;
+
+   SDL_Init(SDL_INIT_NOPARACHUTE);
+
+   if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
+     {
+       ERR("SDL_Init failed with %s", SDL_GetError());
+        SDL_Quit();
+        return 0;
+     }
+
+   /* lets just set up */
+   e->engine.data.output = _sdl_output_setup(e->output.w, e->output.h,
+                                            info->info.fullscreen,
+                                            info->info.noframe,
+                                             info->info.alpha,
+                                             info->info.hwsurface);
+
+   if (!e->engine.data.output)
+      return 0;
+
+   e->engine.func = &func;
+   e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
+
+   return 1;
+}
+
+static void
+evas_engine_sdl_output_free    (void *data)
+{
+   Render_Engine*              re = data;
+
+   if (re->cache)
+     evas_cache_engine_image_shutdown(re->cache);
+
+   evas_common_tilebuf_free(re->tb);
+   if (re->rects)
+      evas_common_tilebuf_free_render_rects(re->rects);
+
+   if (re->update_rects)
+     free(re->update_rects);
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+
+   SDL_QuitSubSystem(SDL_INIT_VIDEO);
+}
+
+static void
+evas_engine_sdl_output_resize  (void *data, int w, int h)
+{
+   /* FIXME */
+   Render_Engine        *re = data;
+   SDL_Surface          *surface;
+
+   if (w == re->tb->outbuf_w && h == re->tb->outbuf_h)
+     return;
+
+   /* Destroy the current screen */
+   evas_cache_engine_image_drop(&re->rgba_engine_image->cache_entry);
+
+   /* Rebuil tilebuf */
+   evas_common_tilebuf_free(re->tb);
+   re->tb = evas_common_tilebuf_new(w, h);
+   if (re->tb)
+      evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+
+   /* Build the new screen */
+   surface = SDL_SetVideoMode(w, h, 32,
+                              (re->flags.hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE)
+                              | (re->flags.fullscreen ? SDL_FULLSCREEN : 0)
+                              | (re->flags.noframe ? SDL_NOFRAME : 0)
+                              | (re->flags.alpha ? SDL_SRCALPHA : 0));
+
+   if (!surface)
+     {
+       ERR("Unable to change the resolution to : %ix%i", w, h);
+       exit(-1);
+     }
+   re->rgba_engine_image = (SDL_Engine_Image_Entry *) evas_cache_engine_image_engine(re->cache, surface);
+   if (!re->rgba_engine_image)
+     {
+       ERR("RGBA_Image allocation from SDL failed");
+       exit(-1);
+     }
+
+   SDL_FillRect(surface, NULL, 0);
+}
+
+static void
+evas_engine_sdl_output_tile_size_set   (void *data, int w, int h)
+{
+   Render_Engine*                      re = (Render_Engine*) data;
+
+   evas_common_tilebuf_set_tile_size(re->tb, w, h);
+}
+
+static void
+evas_engine_sdl_output_redraws_rect_add        (void *data, int x, int y, int w, int h)
+{
+   Render_Engine*                      re = (Render_Engine*) data;
+
+   evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
+}
+
+static void
+evas_engine_sdl_output_redraws_rect_del        (void *data, int x, int y, int w, int h)
+{
+   Render_Engine*                      re = (Render_Engine*) data;
+
+   evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
+}
+
+static void
+evas_engine_sdl_output_redraws_clear   (void *data)
+{
+   Render_Engine*                      re = (Render_Engine*) data;
+
+   evas_common_tilebuf_clear(re->tb);
+}
+
+static void*
+evas_engine_sdl_output_redraws_next_update_get (void *data,
+                                                int *x, int *y, int *w, int *h,
+                                                int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine        *re = data;
+   Tilebuf_Rect         *tb_rect;
+   SDL_Rect              rect;
+
+   if (re->flags.end)
+     {
+       re->flags.end = 0;
+       return NULL;
+     }
+   if (!re->rects)
+     {
+       re->rects = evas_common_tilebuf_get_render_rects(re->tb);
+       re->cur_rect = EINA_INLIST_GET(re->rects);
+     }
+   if (!re->cur_rect)
+      return NULL;
+
+   tb_rect = (Tilebuf_Rect*) re->cur_rect;
+   *cx = *x = tb_rect->x;
+   *cy = *y = tb_rect->y;
+   *cw = *w = tb_rect->w;
+   *ch = *h = tb_rect->h;
+   re->cur_rect = re->cur_rect->next;
+   if (!re->cur_rect)
+     {
+       evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       re->flags.end = 1;
+     }
+
+   rect.x = *x;
+   rect.y = *y;
+   rect.w = *w;
+   rect.h = *h;
+
+   /* Return the "fake" surface so it is passed to the drawing routines. */
+   return re->rgba_engine_image;
+}
+
+static void
+evas_engine_sdl_output_redraws_next_update_push        (void *data, void *surface __UNUSED__,
+                                                int x, int y, int w, int h)
+{
+   Render_Engine                               *re = (Render_Engine *) data;
+
+   if (re->update_rects_count + 1 > re->update_rects_limit)
+     {
+       re->update_rects_limit += 8;
+       re->update_rects = realloc(re->update_rects, sizeof (SDL_Rect) * re->update_rects_limit);
+     }
+
+   re->update_rects[re->update_rects_count].x = x;
+   re->update_rects[re->update_rects_count].y = y;
+   re->update_rects[re->update_rects_count].w = w;
+   re->update_rects[re->update_rects_count].h = h;
+
+   ++re->update_rects_count;
+
+   evas_common_cpu_end_opt();
+}
+
+static void
+_sdl_image_dirty_region(Engine_Image_Entry *eim, int x, int y, int w, int h)
+{
+   SDL_Engine_Image_Entry       *dst;
+   RGBA_Image *im;
+
+   dst = (SDL_Engine_Image_Entry *) eim;
+
+   SDL_UpdateRect(dst->surface, x, y, w, h);
+
+   im = (RGBA_Image *)eim->src;
+   im->flags |= RGBA_IMAGE_IS_DIRTY;
+}
+
+static void
+evas_engine_sdl_output_flush(void *data)
+{
+   Render_Engine        *re = (Render_Engine *) data;
+
+   if (re->update_rects_count > 0)
+     SDL_UpdateRects(re->rgba_engine_image->surface, re->update_rects_count, re->update_rects);
+
+   re->update_rects_count = 0;
+}
+
+
+static void
+evas_engine_sdl_output_idle_flush(void *data)
+{
+   (void) data;
+}
+
+/*
+ * Image objects
+ */
+
+static void*
+evas_engine_sdl_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
+{
+   Render_Engine*      re = (Render_Engine*) data;;
+
+   *error = 0;
+   return evas_cache_engine_image_request(re->cache, file, key, lo, NULL, error);
+}
+
+static int
+evas_engine_sdl_image_alpha_get(void *data __UNUSED__, void *image)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+   RGBA_Image                   *im;
+
+   if (!eim) return 1;
+   im = (RGBA_Image *) eim->cache_entry.src;
+   switch (eim->cache_entry.src->space)
+     {
+     case EVAS_COLORSPACE_ARGB8888:
+        if (im->cache_entry.flags.alpha) return 1;
+     default:
+        break;
+     }
+   return 0;
+}
+
+static void
+evas_engine_sdl_image_size_get(void *data __UNUSED__, void *image, int *w, int *h)
+{
+   SDL_Engine_Image_Entry       *eim;
+
+   eim = image;
+   if (w) *w = eim->cache_entry.src->w;
+   if (h) *h = eim->cache_entry.src->h;
+}
+
+static int
+evas_engine_sdl_image_colorspace_get(void *data __UNUSED__, void *image)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+
+   if (!eim) return EVAS_COLORSPACE_ARGB8888;
+   return eim->cache_entry.src->space;
+}
+
+static void
+evas_engine_sdl_image_colorspace_set(void *data __UNUSED__, void *image, int cspace)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+
+   if (!eim) return;
+   if (eim->cache_entry.src->space == cspace) return;
+
+   evas_cache_engine_image_colorspace(&eim->cache_entry, cspace, NULL);
+}
+
+static void*
+evas_engine_sdl_image_new_from_copied_data(void *data,
+                                          int w, int h,
+                                          DATA32* image_data,
+                                           int alpha, int cspace)
+{
+   Render_Engine       *re = (Render_Engine*) data;
+
+   return evas_cache_engine_image_copied_data(re->cache, w, h, image_data, alpha, cspace, NULL);
+}
+
+static void*
+evas_engine_sdl_image_new_from_data(void *data, int w, int h, DATA32* image_data, int alpha, int cspace)
+{
+   Render_Engine       *re = (Render_Engine*) data;
+
+   return evas_cache_engine_image_data(re->cache, w, h, image_data, alpha, cspace, NULL);
+}
+
+static void
+evas_engine_sdl_image_free(void *data, void *image)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+
+   (void) data;
+
+   evas_cache_engine_image_drop(&eim->cache_entry);
+}
+
+static void*
+evas_engine_sdl_image_size_set(void *data, void *image, int w, int h)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+
+   (void) data;
+
+   return evas_cache_engine_image_size_set(&eim->cache_entry, w, h);
+}
+
+static void*
+evas_engine_sdl_image_dirty_region(void *data,
+                                  void *image,
+                                  int x, int y, int w, int h)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+
+   (void) data;
+
+   return evas_cache_engine_image_dirty(&eim->cache_entry, x, y, w, h);
+}
+
+static void*
+evas_engine_sdl_image_data_get(void *data, void *image,
+                              int to_write, DATA32** image_data)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+   RGBA_Image                   *im;
+
+   (void) data;
+
+   if (!eim)
+     {
+        *image_data = NULL;
+        return NULL;
+     }
+   im = (RGBA_Image *) eim->cache_entry.src;
+
+   switch (eim->cache_entry.src->space)
+     {
+     case EVAS_COLORSPACE_ARGB8888:
+        if (to_write)
+          eim = (SDL_Engine_Image_Entry *) evas_cache_engine_image_dirty(&eim->cache_entry, 0, 0, eim->cache_entry.src->w, eim->cache_entry.src->h);
+
+        evas_cache_engine_image_load_data(&eim->cache_entry);
+        *image_data = im->image.data;
+        break;
+     case EVAS_COLORSPACE_YCBCR422P709_PL:
+     case EVAS_COLORSPACE_YCBCR422P601_PL:
+        *image_data = im->cs.data;
+        break;
+     default:
+        abort();
+        break;
+     }
+   return eim;
+}
+
+static void*
+evas_engine_sdl_image_data_put(void *data, void *image, DATA32* image_data)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+   Render_Engine                *re = data;
+   RGBA_Image                   *im;
+
+   if (!eim) return NULL;
+   im = (RGBA_Image*) eim->cache_entry.src;
+
+   switch (eim->cache_entry.src->space)
+     {
+     case EVAS_COLORSPACE_ARGB8888:
+        if (image_data != im->image.data)
+          {
+             evas_cache_engine_image_drop(&eim->cache_entry);
+             eim = (SDL_Engine_Image_Entry *) evas_cache_engine_image_data(re->cache,
+                                                                           eim->cache_entry.w, eim->cache_entry.h,
+                                                                           image_data,
+                                                                           func.image_alpha_get(data, eim),
+                                                                           func.image_colorspace_get(data, eim),
+                                                                           NULL);
+          }
+        break;
+     case EVAS_COLORSPACE_YCBCR422P601_PL:
+     case EVAS_COLORSPACE_YCBCR422P709_PL:
+        if (image_data != im->cs.data)
+          {
+             if (im->cs.data)
+               if (!im->cs.no_free)
+                 free(im->cs.data);
+             im->cs.data = image_data;
+             evas_common_image_colorspace_dirty(im);
+          }
+        break;
+     default:
+        abort();
+        break;
+     }
+   return eim;
+}
+
+static void
+evas_engine_sdl_image_data_preload_request(void *data __UNUSED__, void *image, const void *target)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+   RGBA_Image                   *im;
+
+   if (!eim) return ;
+   im = (RGBA_Image*) eim->cache_entry.src;
+   if (!im) return ;
+   evas_cache_image_preload_data(&im->cache_entry, target);
+}
+
+static void
+evas_engine_sdl_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+   RGBA_Image                   *im;
+
+   if (!eim) return ;
+   im = (RGBA_Image*) eim->cache_entry.src;
+   if (!im) return ;
+   evas_cache_image_preload_cancel(&im->cache_entry, target);
+}
+
+static void*
+evas_engine_sdl_image_alpha_set(void *data, void *image, int has_alpha)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+   RGBA_Image                   *im;
+
+   (void) data;
+
+   if (!eim) return NULL;
+
+   im = (RGBA_Image *) eim->cache_entry.src;
+
+   if (eim->cache_entry.src->space != EVAS_COLORSPACE_ARGB8888)
+     {
+        im->cache_entry.flags.alpha = 0;
+        return eim;
+     }
+
+   eim = (SDL_Engine_Image_Entry *) evas_cache_engine_image_dirty(&eim->cache_entry, 0, 0, eim->cache_entry.w, eim->cache_entry.h);
+
+   /* FIXME: update SDL_Surface flags */
+   im->cache_entry.flags.alpha = has_alpha ? 1 : 0;
+   return eim;
+}
+
+static void*
+evas_engine_sdl_image_border_set(void *data __UNUSED__, void *image, int l __UNUSED__, int r __UNUSED__, int t __UNUSED__, int b __UNUSED__)
+{
+   return image;
+}
+
+static void
+evas_engine_sdl_image_border_get(void *data __UNUSED__, void *image __UNUSED__, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__)
+{
+   /* FIXME: need to know what evas expect from this call */
+}
+
+static void
+evas_engine_sdl_image_draw(void *data, void *context, void *surface, void *image,
+                          int src_region_x, int src_region_y, int src_region_w, int src_region_h,
+                          int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h,
+                          int smooth)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+   SDL_Engine_Image_Entry       *dst = surface;
+   RGBA_Draw_Context            *dc = (RGBA_Draw_Context*) context;
+   int                           mustlock_im = 0;
+   int                           mustlock_dst = 0;
+
+   (void) data;
+
+   if (eim->cache_entry.src->space == EVAS_COLORSPACE_ARGB8888)
+     evas_cache_engine_image_load_data(&eim->cache_entry);
+
+   /* Fallback to software method */
+   if (SDL_MUSTLOCK(dst->surface))
+     {
+        mustlock_dst = 1;
+       SDL_LockSurface(dst->surface);
+       _SDL_UPDATE_PIXELS(dst);
+     }
+
+   if (eim->surface && SDL_MUSTLOCK(eim->surface))
+     {
+        mustlock_im = 1;
+       SDL_LockSurface(eim->surface);
+       _SDL_UPDATE_PIXELS(eim);
+     }
+
+   evas_common_image_colorspace_normalize((RGBA_Image *) eim->cache_entry.src);
+
+   if (smooth)
+     evas_common_scale_rgba_in_to_out_clip_smooth((RGBA_Image *) eim->cache_entry.src,
+                                                  (RGBA_Image *) dst->cache_entry.src,
+                                                  dc,
+                                                  src_region_x, src_region_y, src_region_w, src_region_h,
+                                                  dst_region_x, dst_region_y, dst_region_w, dst_region_h);
+   else
+     evas_common_scale_rgba_in_to_out_clip_sample((RGBA_Image *) eim->cache_entry.src,
+                                                  (RGBA_Image *) dst->cache_entry.src,
+                                                  dc,
+                                                  src_region_x, src_region_y, src_region_w, src_region_h,
+                                                  dst_region_x, dst_region_y, dst_region_w, dst_region_h);
+   evas_common_cpu_end_opt ();
+
+   if (mustlock_im)
+     SDL_UnlockSurface(eim->surface);
+
+   if (mustlock_dst)
+     SDL_UnlockSurface(dst->surface);
+}
+
+static void
+evas_engine_sdl_image_map4_draw(void *data __UNUSED__, void *context, void *surface, void *image, RGBA_Map_Point *p, int smooth, int level)
+{
+   SDL_Engine_Image_Entry *eim = image;
+   SDL_Engine_Image_Entry *dst = surface;
+   int mustlock_im = 0;
+   int mustlock_dst = 0;
+
+   if (!eim || !dst) return;
+
+   if (SDL_MUSTLOCK(dst->surface))
+     {
+        mustlock_dst = 1;
+       SDL_LockSurface(dst->surface);
+       _SDL_UPDATE_PIXELS(dst);
+     }
+
+   if (eim->surface && SDL_MUSTLOCK(eim->surface))
+     {
+        mustlock_im = 1;
+       SDL_LockSurface(eim->surface);
+       _SDL_UPDATE_PIXELS(eim);
+     }
+
+   evas_common_map4_rgba((RGBA_Image*) eim->cache_entry.src,
+                        (RGBA_Image*) dst->cache_entry.src, context, p, smooth, level);
+   evas_common_cpu_end_opt();
+
+   if (mustlock_im)
+     SDL_UnlockSurface(eim->surface);
+
+   if (mustlock_dst)
+     SDL_UnlockSurface(dst->surface);
+}
+
+static void *
+evas_engine_sdl_image_map_surface_new(void *data, int w, int h, int alpha)
+{
+   Render_Engine *re = (Render_Engine*) data;
+   void *surface;
+
+   surface = evas_cache_engine_image_copied_data(re->cache,
+                                                w, h, NULL, alpha,
+                                                EVAS_COLORSPACE_ARGB8888,
+                                                NULL);
+   return surface;
+}
+
+static void
+evas_engine_sdl_image_map_surface_free(void *data __UNUSED__, void *surface)
+{
+   evas_cache_engine_image_drop(surface);
+}
+
+static void
+evas_engine_sdl_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+   SDL_Engine_Image_Entry *eim;
+
+   if (!image) return ;
+   eim = image;
+   eim->cache_entry.src->scale_hint = hint;
+}
+
+static int
+evas_engine_sdl_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   SDL_Engine_Image_Entry *eim;
+
+   if (!image) return EVAS_IMAGE_SCALE_HINT_NONE;
+   eim = image;
+   return eim->cache_entry.src->scale_hint;
+}
+
+static void
+evas_engine_sdl_image_cache_flush(void *data)
+{
+   Render_Engine        *re = (Render_Engine*) data;
+   int                   size;
+
+   size = evas_cache_engine_image_get(re->cache);
+   evas_cache_engine_image_set(re->cache, 0);
+   evas_cache_engine_image_set(re->cache, size);
+}
+
+static void
+evas_engine_sdl_image_cache_set(void *data, int bytes)
+{
+   Render_Engine        *re = (Render_Engine*) data;
+
+   evas_cache_engine_image_set(re->cache, bytes);
+}
+
+static int
+evas_engine_sdl_image_cache_get(void *data)
+{
+   Render_Engine        *re = (Render_Engine*) data;
+
+   return evas_cache_engine_image_get(re->cache);
+}
+
+static char*
+evas_engine_sdl_image_comment_get(void *data __UNUSED__, void *image, char *key __UNUSED__)
+{
+   SDL_Engine_Image_Entry       *eim = image;
+   RGBA_Image                   *im;
+
+   if (!eim) return NULL;
+   im = (RGBA_Image *) eim->cache_entry.src;
+
+   return im->info.comment;
+}
+
+static char*
+evas_engine_sdl_image_format_get(void *data __UNUSED__, void *image __UNUSED__)
+{
+   /* FIXME: need to know what evas expect from this call */
+   return NULL;
+}
+
+static void
+evas_engine_sdl_font_draw(void *data __UNUSED__, void *context, void *surface, void *font, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, const char *text)
+{
+   SDL_Engine_Image_Entry       *eim = surface;
+   int                           mustlock_im = 0;
+
+   if (eim->surface && SDL_MUSTLOCK(eim->surface))
+     {
+        mustlock_im = 1;
+       SDL_LockSurface(eim->surface);
+       _SDL_UPDATE_PIXELS(eim);
+     }
+
+   evas_common_font_draw((RGBA_Image *) eim->cache_entry.src, context, font, x, y, text);
+   evas_common_cpu_end_opt();
+
+   if (mustlock_im)
+     SDL_UnlockSurface(eim->surface);
+}
+
+static void
+evas_engine_sdl_line_draw(void *data __UNUSED__, void *context, void *surface, int x1, int y1, int x2, int y2)
+{
+   SDL_Engine_Image_Entry       *eim = surface;
+   int                           mustlock_im = 0;
+
+   if (eim->surface && SDL_MUSTLOCK(eim->surface))
+     {
+        mustlock_im = 1;
+       SDL_LockSurface(eim->surface);
+       _SDL_UPDATE_PIXELS(eim);
+     }
+
+   evas_common_line_draw((RGBA_Image *) eim->cache_entry.src, context, x1, y1, x2, y2);
+   evas_common_cpu_end_opt();
+
+   if (mustlock_im)
+     SDL_UnlockSurface(eim->surface);
+}
+
+static void
+evas_engine_sdl_rectangle_draw(void *data __UNUSED__, void *context, void *surface, int x, int y, int w, int h)
+{
+   SDL_Engine_Image_Entry       *eim = surface;
+#if ENGINE_SDL_PRIMITIVE
+   RGBA_Draw_Context            *dc = context;
+#endif
+   int                           mustlock_im = 0;
+
+#if ENGINE_SDL_PRIMITIVE
+   if (A_VAL(&dc->col.col) != 0x00)
+     {
+        if (A_VAL(&dc->col.col) != 0xFF)
+          {
+#endif
+             if (eim->surface && SDL_MUSTLOCK(eim->surface))
+               {
+                  mustlock_im = 1;
+                  SDL_LockSurface(eim->surface);
+                  _SDL_UPDATE_PIXELS(eim);
+               }
+
+             evas_common_rectangle_draw((RGBA_Image *) eim->cache_entry.src, context, x, y, w, h);
+             evas_common_cpu_end_opt();
+
+             if (mustlock_im)
+               SDL_UnlockSurface(eim->surface);
+#if ENGINE_SDL_PRIMITIVE
+          }
+        else
+          {
+             SDL_Rect        dstrect;
+
+             if (dc->clip.use)
+               {
+                  SDL_Rect   cliprect;
+
+                  cliprect.x = dc->clip.x;
+                  cliprect.y = dc->clip.y;
+                  cliprect.w = dc->clip.w;
+                  cliprect.h = dc->clip.h;
+
+                  SDL_SetClipRect(eim->surface, &cliprect);
+               }
+
+             dstrect.x = x;
+             dstrect.y = y;
+             dstrect.w = w;
+             dstrect.h = h;
+
+             SDL_FillRect(eim->surface, &dstrect, SDL_MapRGBA(eim->surface->format, R_VAL(&dc->col.col), G_VAL(&dc->col.col), B_VAL(&dc->col.col), 0xFF));
+
+             if (dc->clip.use)
+               SDL_SetClipRect(eim->surface, NULL);
+          }
+     }
+#endif
+}
+
+static void
+evas_engine_sdl_polygon_draw(void *data __UNUSED__, void *context, void *surface, void *polygon, int x, int y)
+{
+   SDL_Engine_Image_Entry       *eim = surface;
+   int                           mustlock_im = 0;
+
+   if (eim->surface && SDL_MUSTLOCK(eim->surface))
+     {
+        mustlock_im = 1;
+       SDL_LockSurface(eim->surface);
+       _SDL_UPDATE_PIXELS(eim);
+     }
+
+   evas_common_polygon_draw((RGBA_Image *) eim->cache_entry.src, context, polygon, x, y);
+   evas_common_cpu_end_opt();
+
+   if (mustlock_im)
+     SDL_UnlockSurface(eim->surface);
+}
+
+static void
+evas_engine_sdl_gradient_draw(void *data __UNUSED__, void *context, void *surface, void *gradient, int x, int y, int w, int h)
+{
+   SDL_Engine_Image_Entry       *eim = surface;
+   int                           mustlock_im = 0;
+
+   if (eim->surface && SDL_MUSTLOCK(eim->surface))
+     {
+        mustlock_im = 1;
+       SDL_LockSurface(eim->surface);
+       _SDL_UPDATE_PIXELS(eim);
+     }
+
+   evas_common_gradient_draw((RGBA_Image *) eim->cache_entry.src, context, x, y, w, h, gradient);
+   evas_common_cpu_end_opt();
+
+   if (mustlock_im)
+     SDL_UnlockSurface(eim->surface);
+}
+
+static int module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
+   _evas_engine_soft_sdl_log_dom = eina_log_domain_register("EvasSoftSdl",EVAS_DEFAULT_LOG_COLOR);
+   if(_evas_engine_soft_sdl_log_dom < 0) 
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the SoftSdl engine.\n");
+       return 0;
+     }
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+#define ORD(f) EVAS_API_OVERRIDE(f, &func, evas_engine_sdl_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   ORD(image_load);
+   ORD(image_new_from_data);
+   ORD(image_new_from_copied_data);
+   ORD(image_colorspace_set);
+   ORD(image_colorspace_get);
+   ORD(image_free);
+   ORD(image_size_set);
+   ORD(image_size_get);
+   ORD(image_dirty_region);
+   ORD(image_data_get);
+   ORD(image_data_put);
+   ORD(image_data_preload_request);
+   ORD(image_data_preload_cancel);
+   ORD(image_alpha_set);
+   ORD(image_alpha_get);
+   ORD(image_border_set);
+   ORD(image_border_get);
+   ORD(image_draw);
+   ORD(image_map4_draw);
+   ORD(image_map_surface_new);
+   ORD(image_map_surface_free);
+   ORD(image_comment_get);
+   ORD(image_format_get);
+   ORD(image_cache_flush);
+   ORD(image_cache_set);
+   ORD(image_cache_get);
+   ORD(font_draw);
+   ORD(line_draw);
+   ORD(rectangle_draw);
+   ORD(polygon_draw);
+   ORD(gradient_draw);
+   
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+   
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void module_close(Evas_Module *em)
+{
+  eina_log_domain_unregister(_evas_engine_soft_sdl_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+  EVAS_MODULE_API_VERSION,
+  "software_sdl",
+  "none",
+  {
+    module_open,
+    module_close
+  }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_sdl);
+
+#ifndef EVAS_STATIC_BUILD_SOFTWARE_SDL
+EVAS_EINA_MODULE_DEFINE(engine, software_sdl);
+#endif
+
+/* Private routines. */
+
+static void*
+_sdl_output_setup              (int w, int h, int fullscreen, int noframe, int alpha, int hwsurface)
+{
+   Render_Engine               *re = calloc(1, sizeof(Render_Engine));
+   SDL_Surface                  *surface;
+
+   /* if we haven't initialized - init (automatic abort if already done) */
+   evas_common_cpu_init();
+   evas_common_blend_init();
+   evas_common_image_init();
+   evas_common_convert_init();
+   evas_common_scale_init();
+   evas_common_rectangle_init();
+   evas_common_gradient_init();
+   evas_common_polygon_init();
+   evas_common_line_init();
+   evas_common_font_init();
+   evas_common_draw_init();
+   evas_common_tilebuf_init();
+
+   if (w <= 0) w = 640;
+   if (h <= 0) h = 480;
+
+   re->cache = evas_cache_engine_image_init(&_sdl_cache_engine_image_cb, evas_common_image_cache_get());
+   if (!re->cache)
+     {
+        CRIT("Evas_Cache_Engine_Image allocation failed!");
+        exit(-1);
+     }
+
+   re->tb = evas_common_tilebuf_new(w, h);
+   /* in preliminary tests 16x16 gave highest framerates */
+   evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+   surface = SDL_SetVideoMode(w, h, 32,
+                              (hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE)
+                              | (fullscreen ? SDL_FULLSCREEN : 0)
+                              | (noframe ? SDL_NOFRAME : 0)
+                              | (alpha ? SDL_SRCALPHA : 0));
+
+   if (!surface)
+     {
+        CRIT("SDL_SetVideoMode [ %i x %i x 32 ] failed.", w, h);
+        exit(-1);
+     }
+
+   SDL_SetAlpha(surface, SDL_SRCALPHA | SDL_RLEACCEL, 0);
+
+   /* We create a "fake" RGBA_Image which points to the SDL surface. Each access
+    * to that surface is wrapped in Lock / Unlock calls whenever the data is
+    * manipulated directly. */
+   re->rgba_engine_image = (SDL_Engine_Image_Entry *) evas_cache_engine_image_engine(re->cache, surface);
+   if (!re->rgba_engine_image)
+     {
+       CRIT("RGBA_Image allocation from SDL failed");
+        exit(-1);
+     }
+
+   SDL_FillRect(surface, NULL, 0);
+
+   re->flags.alpha = alpha;
+   re->flags.hwsurface = hwsurface;
+   re->flags.fullscreen = fullscreen;
+   re->flags.noframe = noframe;
+   return re;
+}
+
+static Engine_Image_Entry*
+_sdl_image_alloc(void)
+{
+   SDL_Engine_Image_Entry       *new;
+
+   new = calloc(1, sizeof (SDL_Engine_Image_Entry));
+
+   return (Engine_Image_Entry *) new;
+}
+
+static void
+_sdl_image_delete(Engine_Image_Entry *eim)
+{
+   free(eim);
+}
+
+static int
+_sdl_image_constructor(Engine_Image_Entry *ie, void *data __UNUSED__)
+{
+   SDL_Surface                  *sdl = NULL;
+   SDL_Engine_Image_Entry       *eim = (SDL_Engine_Image_Entry *) ie;
+   RGBA_Image                   *im;
+
+   im = (RGBA_Image *) ie->src;
+
+   if (im)
+     {
+        evas_cache_image_load_data(&im->cache_entry);
+
+        if (im->image.data)
+          {
+             /* FIXME: Take care of CSPACE */
+             sdl = SDL_CreateRGBSurfaceFrom(im->image.data,
+                                            ie->w, ie->h,
+                                            32, ie->w * 4,
+                                            RMASK, GMASK, BMASK, AMASK);
+             eim->surface = sdl;
+             eim->flags.engine_surface = 0;
+          }
+     }
+
+   return EVAS_LOAD_ERROR_NONE;
+}
+
+static void
+_sdl_image_destructor(Engine_Image_Entry *eie)
+{
+   SDL_Engine_Image_Entry       *seie = (SDL_Engine_Image_Entry *) eie;
+
+   if (seie->surface && !seie->flags.engine_surface)
+     SDL_FreeSurface(seie->surface);
+   seie->surface = NULL;
+}
+
+static int
+_sdl_image_dirty(Engine_Image_Entry *dst, const Engine_Image_Entry *src __UNUSED__)
+{
+   SDL_Engine_Image_Entry       *eim = (SDL_Engine_Image_Entry *) dst;
+   SDL_Surface                  *sdl = NULL;
+   RGBA_Image                   *im;
+
+   im = (RGBA_Image *) dst->src;
+
+   /* FIXME: Take care of CSPACE */
+   sdl = SDL_CreateRGBSurfaceFrom(im->image.data,
+                                  dst->w, dst->h,
+                                  32, dst->w * 4,
+                                  0xff0000, 0xff00, 0xff, 0xff000000);
+   eim->surface = sdl;
+   eim->flags.engine_surface = 0;
+
+   return 0;
+}
+
+static int
+_sdl_image_update_data(Engine_Image_Entry *dst, void* engine_data)
+{
+   SDL_Engine_Image_Entry       *eim = (SDL_Engine_Image_Entry *) dst;
+   SDL_Surface                  *sdl = NULL;
+   RGBA_Image                   *im;
+
+   im = (RGBA_Image *) dst->src;
+
+   if (engine_data)
+     {
+        sdl = engine_data;
+
+        if (im)
+          {
+             im->image.data = sdl->pixels;
+             im->image.no_free = 1;
+             im->cache_entry.flags.alpha = 0;
+             dst->src->w = sdl->w;
+             dst->src->h = sdl->h;
+          }
+        dst->w = sdl->w;
+        dst->h = sdl->h;
+     }
+   else
+     {
+        /* FIXME: Take care of CSPACE */
+        SDL_FreeSurface(eim->surface);
+        sdl = SDL_CreateRGBSurfaceFrom(im->image.data,
+                                       dst->w, dst->h,
+                                       32, dst->w * 4,
+                                       RMASK, GMASK, BMASK, AMASK);
+     }
+
+   eim->surface = sdl;
+
+   return 0;
+}
+
+static int
+_sdl_image_size_set(Engine_Image_Entry *dst, const Engine_Image_Entry *src __UNUSED__)
+{
+   SDL_Engine_Image_Entry       *eim = (SDL_Engine_Image_Entry *) dst;
+   SDL_Surface                  *sdl;
+   RGBA_Image                   *im;
+
+   im = (RGBA_Image *) dst->src;
+
+   /* FIXME: handle im == NULL */
+   sdl = SDL_CreateRGBSurfaceFrom(im->image.data,
+                                  dst->w, dst->h,
+                                  32, dst->w * 4,
+                                  RMASK, GMASK, BMASK, AMASK);
+
+   eim->surface = sdl;
+
+   return 0;
+}
+
+static void
+_sdl_image_load(Engine_Image_Entry *eim, const Image_Entry *ie_im)
+{
+   SDL_Engine_Image_Entry       *load = (SDL_Engine_Image_Entry *) eim;
+   SDL_Surface                  *sdl;
+
+   if (!load->surface)
+     {
+        RGBA_Image      *im;
+
+        im = (RGBA_Image *) ie_im;
+
+        sdl = SDL_CreateRGBSurfaceFrom(im->image.data,
+                                       eim->w, eim->h,
+                                       32, eim->w * 4,
+                                       RMASK, GMASK, BMASK, AMASK);
+        load->surface = sdl;
+     }
+}
+
+static int
+_sdl_image_mem_size_get(Engine_Image_Entry *eim)
+{
+   SDL_Engine_Image_Entry       *seie = (SDL_Engine_Image_Entry *) eim;
+   int                           size = 0;
+
+   /* FIXME: Count surface size. */
+   if (seie->surface)
+     size = sizeof (SDL_Surface) + sizeof (SDL_PixelFormat);
+
+   return size;
+}
+
+#ifdef DEBUG_SDL
+static void
+_sdl_image_debug(const char* context, Engine_Image_Entry* eie)
+{
+   SDL_Engine_Image_Entry       *eim = (SDL_Engine_Image_Entry *) eie;
+
+   DBG("*** %s image (%p) ***", context, eim);
+   if (eim)
+     {
+        DBG ("* W: %i\n* H: %i\n* R: %i", eim->cache_entry.w, eim->cache_entry.h, eim->cache_entry.references);
+        if (eim->cache_entry.src)
+          DBG ("* Pixels: %p\n* SDL Surface: %p",((RGBA_Image*) eim->cache_entry.src)->image.data, eim->surface);
+        if (eim->surface)
+          DBG ("* Surface->pixels: %p", eim->surface->pixels);
+       DBG ("* Key: %s", eim->cache_entry.cache_key);
+        DBG ("* Reference: %i", eim->cache_entry.references);
+     }
+   DBG ("*** ***");
+}
+#endif
diff --git a/src/modules/engines/software_sdl/evas_engine.h b/src/modules/engines/software_sdl/evas_engine.h
new file mode 100644 (file)
index 0000000..5133fec
--- /dev/null
@@ -0,0 +1,72 @@
+#ifndef EVAS_ENGINE_SDL_H
+#define EVAS_ENGINE_SDL_H
+
+#include "evas_common.h"
+#include "evas_private.h"
+#include "Evas_Engine_SDL.h"
+
+extern int _evas_engine_soft_sdl_log_dom ;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_soft_sdl_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_soft_sdl_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_soft_sdl_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_soft_sdl_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_soft_sdl_log_dom, __VA_ARGS__)
+
+typedef struct _SDL_Engine_Image_Entry SDL_Engine_Image_Entry;
+struct _SDL_Engine_Image_Entry
+{
+   Engine_Image_Entry            cache_entry;
+
+   SDL_Surface                  *surface;
+
+   struct
+   {
+     unsigned int                engine_surface : 1;
+   } flags;
+};
+
+typedef struct _Render_Engine Render_Engine;
+struct _Render_Engine
+{
+   SDL_Engine_Image_Entry       *rgba_engine_image;
+
+   Tilebuf                      *tb;
+   Tilebuf_Rect                 *rects;
+   Eina_Inlist                  *cur_rect;
+
+   Evas_Cache_Engine_Image      *cache;
+
+   SDL_Rect                     *update_rects;
+   int                           update_rects_count;
+   int                           update_rects_limit;
+
+   struct
+   {
+     unsigned int               fullscreen : 1;
+     unsigned int               noframe : 1;
+     unsigned int               alpha : 1;
+     unsigned int               hwsurface : 1;
+     unsigned int               end : 1;
+   } flags;
+};
+
+#endif
diff --git a/src/modules/engines/software_x11/.cvsignore b/src/modules/engines/software_x11/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/engines/software_x11/Evas_Engine_Software_X11.h b/src/modules/engines/software_x11/Evas_Engine_Software_X11.h
new file mode 100644 (file)
index 0000000..6b0f692
--- /dev/null
@@ -0,0 +1,60 @@
+#ifndef _EVAS_ENGINE_SOFTWARE_X11_H
+#define _EVAS_ENGINE_SOFTWARE_X11_H
+
+typedef enum
+{
+  EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB,
+  EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB
+} Evas_Engine_Info_Software_X11_Backend;
+
+typedef struct _Evas_Engine_Info_Software_X11 Evas_Engine_Info_Software_X11;
+
+/*
+ *               Xlib       |      XCB
+ * connection | Display *   |  xcb_connection_t *
+ * screen     | NULL        |  xcb_screen_t *
+ * drawable   | Drawable    |  xcb_drawable_t
+ * mask       | Pixmap      |  xcb_pixmap_t
+ * visual     | Visual *    |  xcb_visualtype_t *
+ * colormap   | Colormap    |  xcb_colormap_t
+ */
+
+struct _Evas_Engine_Info_Software_X11
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   /* engine specific data & parameters it needs to set up */
+   struct {
+      Evas_Engine_Info_Software_X11_Backend backend;
+      void                                 *connection;
+      void                                 *screen;
+      unsigned int                          drawable;
+      unsigned int                          mask;
+      void                                 *visual;
+      unsigned int                          colormap;
+      int                                   depth;
+      int                                   rotation;
+
+      unsigned int                          alloc_grayscale    : 1;
+      unsigned int                          debug              : 1;
+      unsigned int                          shape_dither       : 1;
+      unsigned int                          destination_alpha  : 1;
+      unsigned int                          track_mask_changes : 1;
+
+      int                                   alloc_colors_max;
+   } info;
+   /* engine specific function calls to query stuff about the destination */
+   struct {
+      void        *(*best_visual_get)   (int backend, void *connection, int screen);
+      unsigned int (*best_colormap_get) (int backend, void *connection, int screen);
+      int          (*best_depth_get)    (int backend, void *connection, int screen);
+   } func;
+
+   int mask_changed;
+};
+
+#endif
+
+
diff --git a/src/modules/engines/software_x11/Makefile.am b/src/modules/engines/software_x11/Makefile.am
new file mode 100644 (file)
index 0000000..8d7ae13
--- /dev/null
@@ -0,0 +1,70 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_engine_software_xlib_cflags@ \
+@evas_engine_software_xcb_cflags@
+
+if BUILD_ENGINE_SOFTWARE_X11
+
+SOFTWARE_X11_SOURCES = evas_engine.c
+
+if BUILD_ENGINE_SOFTWARE_XLIB
+
+SOFTWARE_X11_SOURCES += \
+evas_xlib_outbuf.c \
+evas_xlib_buffer.c \
+evas_xlib_color.c \
+evas_xlib_main.c
+
+SOFTWARE_X11_LIBADD = @evas_engine_software_xlib_libs@ @evas_engine_software_xcb_libs@
+
+endif
+
+if BUILD_ENGINE_SOFTWARE_XCB
+
+SOFTWARE_X11_SOURCES += \
+evas_xcb_outbuf.c \
+evas_xcb_buffer.c \
+evas_xcb_color.c \
+evas_xcb_main.c
+
+endif
+
+pkgdir = $(libdir)/evas/modules/engines/software_x11/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_Software_X11.h
+
+if !EVAS_STATIC_BUILD_SOFTWARE_X11
+
+pkg_LTLIBRARIES        = module.la
+
+module_la_SOURCES = $(SOFTWARE_X11_SOURCES)
+module_la_LIBADD = $(top_builddir)/src/lib/libevas.la @EINA_LIBS@ $(SOFTWARE_X11_LIBADD)
+module_la_LDFLAGS = -no-undefined -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_software_x11.la
+
+libevas_engine_software_x11_la_SOURCES = $(SOFTWARE_X11_SOURCES)
+libevas_engine_software_x11_la_LIBADD = $(SOFTWARE_X11_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = \
+evas_engine.h \
+evas_xlib_outbuf.h \
+evas_xlib_buffer.h \
+evas_xlib_color.h \
+evas_xcb_outbuf.h \
+evas_xcb_buffer.h \
+evas_xcb_color.h
diff --git a/src/modules/engines/software_x11/evas_engine.c b/src/modules/engines/software_x11/evas_engine.c
new file mode 100644 (file)
index 0000000..2788fc6
--- /dev/null
@@ -0,0 +1,831 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+#include "Evas_Engine_Software_X11.h"
+
+#include "evas_engine.h"
+
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+# include "evas_xlib_outbuf.h"
+# include "evas_xlib_color.h"
+#endif
+
+#ifdef BUILD_ENGINE_SOFTWARE_XCB
+# include "evas_xcb_outbuf.h"
+# include "evas_xcb_color.h"
+#endif
+
+int _evas_engine_soft_x11_log_dom = -1;
+int test ;
+/* function tables - filled in later (func and parent func) */
+static Evas_Func func, pfunc;
+
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+struct xrdb_user
+{
+   time_t last_stat;
+   time_t last_mtime;
+   XrmDatabase db;
+};
+static struct xrdb_user xrdb_user = {0, 0, NULL};
+
+static Eina_Bool
+xrdb_user_query(const char *name, const char *cls, char **type, XrmValue *val)
+{
+   time_t last = xrdb_user.last_stat, now = time(NULL);
+
+   xrdb_user.last_stat = now;
+   if (last != now) /* don't stat() more than once every second */
+     {
+       struct stat st;
+       const char *home = getenv("HOME");
+       char tmp[PATH_MAX];
+
+       if (!home) goto failed;
+       snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home);
+       if (stat(tmp, &st) != 0) goto failed;
+       if (xrdb_user.last_mtime != st.st_mtime)
+         {
+            if (xrdb_user.db) XrmDestroyDatabase(xrdb_user.db);
+            xrdb_user.db = XrmGetFileDatabase(tmp);
+            if (!xrdb_user.db) goto failed;
+            xrdb_user.last_mtime = st.st_mtime;
+         }
+     }
+
+   if (!xrdb_user.db) return EINA_FALSE;
+   return XrmGetResource(xrdb_user.db, name, cls, type, val);
+
+ failed:
+   if (xrdb_user.db)
+     {
+       XrmDestroyDatabase(xrdb_user.db);
+       xrdb_user.db = NULL;
+     }
+   xrdb_user.last_mtime = 0;
+   return EINA_FALSE;
+}
+#endif
+
+/* engine struct data */
+typedef struct _Render_Engine Render_Engine;
+
+struct _Render_Engine
+{
+   Tilebuf      *tb;
+   Outbuf       *ob;
+   Tilebuf_Rect *rects;
+   Eina_Inlist  *cur_rect;
+   int           end : 1;
+   
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+   XrmDatabase   xrdb; // xres - dpi
+   struct { // xres - dpi
+      int        dpi; // xres - dpi
+   } xr; // xres - dpi
+#endif
+   
+   void        (*outbuf_free)(Outbuf *ob);
+   void        (*outbuf_reconfigure)(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth);
+   int         (*outbuf_get_rot)(Outbuf *ob);
+   RGBA_Image *(*outbuf_new_region_for_update)(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch);
+   void        (*outbuf_push_updated_region)(Outbuf *ob, RGBA_Image *update, int x, int y, int w, int h);
+   void        (*outbuf_free_region_for_update)(Outbuf *ob, RGBA_Image *update);
+   void        (*outbuf_flush)(Outbuf *ob);
+   void        (*outbuf_idle_flush)(Outbuf *ob);
+   Eina_Bool   (*outbuf_alpha_get)(Outbuf *ob);
+};
+
+/* prototypes we will use here */
+static void        *_best_visual_get   (int backend, void *connection, int screen);
+static unsigned int _best_colormap_get (int backend, void *connection, int screen);
+static int          _best_depth_get    (int backend, void *connection, int screen);
+
+static void *eng_info(Evas *e);
+static void eng_info_free(Evas *e, void *info);
+static int eng_setup(Evas *e, void *info);
+static void eng_output_free(void *data);
+static void eng_output_resize(void *data, int w, int h);
+static void eng_output_tile_size_set(void *data, int w, int h);
+static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
+static void eng_output_redraws_clear(void *data);
+static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
+static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
+static void eng_output_flush(void *data);
+static void eng_output_idle_flush(void *data);
+
+
+/* internal engine routines */
+
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+static void *
+_output_xlib_setup(int      w,
+                   int      h,
+                   int      rot,
+                   Display *disp,
+                   Drawable draw,
+                   Visual  *vis,
+                   Colormap cmap,
+                   int      depth,
+                   int      debug,
+                   int      grayscale,
+                   int      max_colors,
+                   Pixmap   mask,
+                   int      shape_dither,
+                   int      destination_alpha)
+{
+   Render_Engine *re;
+
+   re = calloc(1, sizeof(Render_Engine));
+   if (!re)
+     return NULL;
+
+   evas_software_xlib_x_init();
+   evas_software_xlib_x_color_init();
+   evas_software_xlib_outbuf_init();
+
+     {
+        int status;
+        char *type = NULL;
+        XrmValue val;
+        
+        re->xr.dpi = 75000; // dpy * 1000
+
+       status = xrdb_user_query("Xft.dpi", "Xft.Dpi", &type, &val);
+       if ((!status) || (!type))
+         {
+            if (!re->xrdb) re->xrdb = XrmGetDatabase(disp);
+            if (re->xrdb)
+              status = XrmGetResource(re->xrdb,
+                                      "Xft.dpi", "Xft.Dpi", &type, &val);
+         }
+
+        if ((status) && (type))
+          {
+             if (!strcmp(type, "String"))
+               {
+                  const char *str, *dp;
+                  
+                  str = val.addr;
+                  dp = strchr(str, '.');
+                  if (!dp) dp = strchr(str, ',');
+                  
+                  if (dp)
+                    {
+                       int subdpi, len, i;
+                       char *buf;
+                       
+                       buf = alloca(dp - str + 1);
+                       strncpy(buf, str, dp - str);
+                       buf[dp - str] = 0;
+                       len = strlen(dp + 1);
+                       subdpi = atoi(dp + 1);
+                       
+                       if (len < 3)
+                         {
+                            for (i = len; i < 3; i++) subdpi *= 10;
+                         }
+                       else if (len > 3)
+                         {
+                            for (i = len; i > 3; i--) subdpi /= 10;
+                         }
+                       re->xr.dpi = atoi(buf) * 1000;
+                    }
+                  else
+                    re->xr.dpi = atoi(str) * 1000;
+                  evas_common_font_dpi_set(re->xr.dpi / 1000);
+               }
+          }
+     }
+   
+   re->ob = evas_software_xlib_outbuf_setup_x(w,
+                                              h,
+                                              rot,
+                                              OUTBUF_DEPTH_INHERIT,
+                                              disp,
+                                              draw,
+                                              vis,
+                                              cmap,
+                                              depth,
+                                              grayscale,
+                                              max_colors,
+                                              mask,
+                                              shape_dither,
+                                              destination_alpha);
+   if (!re->ob)
+     {
+       free(re);
+       return NULL;
+     }
+
+   /* for updates return 1 big buffer, but only use portions of it, also cache
+    it and keepit around until an idle_flush */
+   /* disable for now - i am hunting down why some expedite tests are slower,
+    * as well as shaped stuff is broken and probable non-32bpp is broken as
+    * convert funcs dont do the right thing
+    *
+   re->ob->onebuf = 1;
+    */
+
+   evas_software_xlib_outbuf_debug_set(re->ob, debug);
+   re->tb = evas_common_tilebuf_new(w, h);
+   if (!re->tb)
+     {
+       evas_software_xlib_outbuf_free(re->ob);
+       free(re);
+       return NULL;
+     }
+   /* in preliminary tests 16x16 gave highest framerates */
+   evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+   return re;
+}
+#endif
+
+#ifdef BUILD_ENGINE_SOFTWARE_XCB
+static void *
+_output_xcb_setup(int               w,
+                  int               h,
+                  int               rot,
+                  xcb_connection_t *conn,
+                  xcb_screen_t     *screen,
+                  xcb_drawable_t    draw,
+                  xcb_visualtype_t *vis,
+                  xcb_colormap_t    cmap,
+                  int               depth,
+                  int               debug,
+                  int               grayscale,
+                  int               max_colors,
+                  xcb_drawable_t    mask,
+                  int               shape_dither,
+                  int               destination_alpha)
+{
+   Render_Engine *re;
+
+   re = calloc(1, sizeof(Render_Engine));
+   if (!re)
+     return NULL;
+
+   evas_software_xcb_x_init();
+   evas_software_xcb_x_color_init();
+   evas_software_xcb_outbuf_init();
+
+   // FIXME: re->xrdb
+   
+   re->ob = evas_software_xcb_outbuf_setup_x(w,
+                                             h,
+                                             rot,
+                                            OUTBUF_DEPTH_INHERIT,
+                                            conn,
+                                             screen,
+                                            draw,
+                                            vis,
+                                            cmap,
+                                            depth,
+                                            grayscale,
+                                            max_colors,
+                                            mask,
+                                             shape_dither,
+                                             destination_alpha);
+   if (!re->ob)
+     {
+       free(re);
+       return NULL;
+     }
+
+   /* for updates return 1 big buffer, but only use portions of it, also cache
+    it and keepit around until an idle_flush */
+   /* disable for now - i am hunting down why some expedite tests are slower,
+    * as well as shaped stuff is broken and probable non-32bpp is broken as
+    * convert funcs dont do the right thing
+    *
+   re->ob->onebuf = 1;
+    */
+
+   evas_software_xcb_outbuf_debug_set(re->ob, debug);
+   re->tb = evas_common_tilebuf_new(w, h);
+   if (!re->tb)
+     {
+       evas_software_xcb_outbuf_free(re->ob);
+       free(re);
+       return NULL;
+     }
+   /* in preliminary tests 16x16 gave highest framerates */
+   evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+   return re;
+}
+#endif
+
+static void *
+_best_visual_get(int backend, void *connection, int screen)
+{
+   if (!connection) return NULL;
+
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+   if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
+     {
+        return DefaultVisual((Display *)connection, screen);
+     }
+#endif
+
+#ifdef BUILD_ENGINE_SOFTWARE_XCB
+   if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB)
+     {
+        xcb_screen_iterator_t iter_screen;
+        xcb_depth_iterator_t  iter_depth;
+        xcb_screen_t          *s;
+
+        iter_screen = xcb_setup_roots_iterator(xcb_get_setup((xcb_connection_t *)connection));
+        for (; iter_screen.rem; --screen, xcb_screen_next (&iter_screen))
+          if (screen == 0)
+            {
+               s = iter_screen.data;
+               break;
+            }
+
+        iter_depth = xcb_screen_allowed_depths_iterator(s);
+        for (; iter_depth.rem; xcb_depth_next (&iter_depth))
+          {
+             xcb_visualtype_iterator_t iter_vis;
+
+             iter_vis = xcb_depth_visuals_iterator(iter_depth.data);
+             for (; iter_vis.rem; xcb_visualtype_next (&iter_vis))
+               {
+                  if (s->root_visual == iter_vis.data->visual_id)
+                    return iter_vis.data;
+               }
+          }
+     }
+#endif
+
+   return NULL;
+}
+
+static unsigned int
+_best_colormap_get(int backend, void *connection, int screen)
+{
+   if (!connection) return 0;
+
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+   if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
+     {
+        return DefaultColormap((Display *)connection, screen);
+     }
+#endif
+
+#ifdef BUILD_ENGINE_SOFTWARE_XCB
+   if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB)
+     {
+        xcb_screen_iterator_t iter_screen;
+        xcb_screen_t          *s;
+
+        iter_screen = xcb_setup_roots_iterator(xcb_get_setup((xcb_connection_t *)connection));
+        for (; iter_screen.rem; --screen, xcb_screen_next (&iter_screen))
+          if (screen == 0)
+            {
+               s = iter_screen.data;
+               break;
+            }
+
+        return s->default_colormap;
+     }
+#endif
+
+   return 0;
+}
+
+static int
+_best_depth_get(int backend, void *connection, int screen)
+{
+   if (!connection) return 0;
+
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+   if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
+     {
+        return DefaultDepth((Display *)connection, screen);
+     }
+#endif
+
+#ifdef BUILD_ENGINE_SOFTWARE_XCB
+   if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB)
+     {
+        xcb_screen_iterator_t iter_screen;
+        xcb_screen_t          *s;
+
+        iter_screen = xcb_setup_roots_iterator(xcb_get_setup((xcb_connection_t *)connection));
+        for (; iter_screen.rem; --screen, xcb_screen_next (&iter_screen))
+          if (screen == 0)
+            {
+               s = iter_screen.data;
+               break;
+            }
+
+        return s->root_depth;
+     }
+#endif
+
+   return 0;
+}
+
+/* engine api this module provides */
+static void *
+eng_info(Evas *e __UNUSED__)
+{
+   Evas_Engine_Info_Software_X11 *info;
+   info = calloc(1, sizeof(Evas_Engine_Info_Software_X11));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   info->info.debug = 0;
+   info->info.alloc_grayscale = 0;
+   info->info.alloc_colors_max = 216;
+   info->func.best_visual_get = _best_visual_get;
+   info->func.best_colormap_get = _best_colormap_get;
+   info->func.best_depth_get = _best_depth_get;
+   return info;
+}
+
+static void
+eng_info_free(Evas *e __UNUSED__, void *info)
+{
+   Evas_Engine_Info_Software_X11 *in;
+   in = (Evas_Engine_Info_Software_X11 *)info;
+   free(in);
+}
+
+static int
+eng_setup(Evas *e, void *in)
+{
+   Evas_Engine_Info_Software_X11 *info;
+   Render_Engine *re = NULL;
+
+   info = (Evas_Engine_Info_Software_X11 *)in;
+   if (!e->engine.data.output)
+     {
+        /* if we haven't initialized - init (automatic abort if already done) */
+        evas_common_cpu_init();
+        evas_common_blend_init();
+        evas_common_image_init();
+        evas_common_convert_init();
+        evas_common_scale_init();
+        evas_common_rectangle_init();
+        evas_common_gradient_init();
+        evas_common_polygon_init();
+        evas_common_line_init();
+        evas_common_font_init();
+        evas_common_draw_init();
+        evas_common_tilebuf_init();
+
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+        if (info->info.backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
+          {
+             re = _output_xlib_setup(e->output.w,
+                                     e->output.h,
+                                     info->info.rotation,
+                                     info->info.connection,
+                                     info->info.drawable,
+                                     info->info.visual,
+                                     info->info.colormap,
+                                     info->info.depth,
+                                     info->info.debug,
+                                     info->info.alloc_grayscale,
+                                     info->info.alloc_colors_max,
+                                     info->info.mask,
+                                     info->info.shape_dither,
+                                     info->info.destination_alpha);
+
+             re->outbuf_free = evas_software_xlib_outbuf_free;
+             re->outbuf_reconfigure = evas_software_xlib_outbuf_reconfigure;
+             re->outbuf_get_rot = evas_software_xlib_outbuf_get_rot;
+             re->outbuf_new_region_for_update = evas_software_xlib_outbuf_new_region_for_update;
+             re->outbuf_push_updated_region = evas_software_xlib_outbuf_push_updated_region;
+             re->outbuf_free_region_for_update = evas_software_xlib_outbuf_free_region_for_update;
+             re->outbuf_flush = evas_software_xlib_outbuf_flush;
+             re->outbuf_idle_flush = evas_software_xlib_outbuf_idle_flush;
+            re->outbuf_alpha_get = evas_software_xlib_outbuf_alpha_get;
+          }
+#endif
+
+#ifdef BUILD_ENGINE_SOFTWARE_XCB
+        if (info->info.backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB)
+          {
+             re = _output_xcb_setup(e->output.w,
+                                    e->output.h,
+                                    info->info.rotation,
+                                    info->info.connection,
+                                    info->info.screen,
+                                    info->info.drawable,
+                                    info->info.visual,
+                                    info->info.colormap,
+                                    info->info.depth,
+                                    info->info.debug,
+                                    info->info.alloc_grayscale,
+                                    info->info.alloc_colors_max,
+                                    info->info.mask,
+                                    info->info.shape_dither,
+                                    info->info.destination_alpha);
+
+             re->outbuf_free = evas_software_xcb_outbuf_free;
+             re->outbuf_reconfigure = evas_software_xcb_outbuf_reconfigure;
+             re->outbuf_get_rot = evas_software_xcb_outbuf_get_rot;
+             re->outbuf_new_region_for_update = evas_software_xcb_outbuf_new_region_for_update;
+             re->outbuf_push_updated_region = evas_software_xcb_outbuf_push_updated_region;
+             re->outbuf_free_region_for_update = evas_software_xcb_outbuf_free_region_for_update;
+             re->outbuf_flush = evas_software_xcb_outbuf_flush;
+             re->outbuf_idle_flush = evas_software_xcb_outbuf_idle_flush;
+            re->outbuf_alpha_get = evas_software_xcb_outbuf_alpha_get;
+          }
+#endif
+
+        e->engine.data.output = re;
+     }
+   else
+     {
+       int            ponebuf = 0;
+
+       re = e->engine.data.output;
+       ponebuf = re->ob->onebuf;
+
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+        if (info->info.backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
+          {
+             evas_software_xlib_outbuf_free(re->ob);
+             re->ob = evas_software_xlib_outbuf_setup_x(e->output.w,
+                                                        e->output.h,
+                                                        info->info.rotation,
+                                                        OUTBUF_DEPTH_INHERIT,
+                                                        info->info.connection,
+                                                        info->info.drawable,
+                                                        info->info.visual,
+                                                        info->info.colormap,
+                                                        info->info.depth,
+                                                        info->info.alloc_grayscale,
+                                                        info->info.alloc_colors_max,
+                                                        info->info.mask,
+                                                        info->info.shape_dither,
+                                                        info->info.destination_alpha);
+             evas_software_xlib_outbuf_debug_set(re->ob, info->info.debug);
+          }
+#endif
+
+#ifdef BUILD_ENGINE_SOFTWARE_XCB
+        if (info->info.backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB)
+          {
+             evas_software_xcb_outbuf_free(re->ob);
+             re->ob = evas_software_xcb_outbuf_setup_x(e->output.w,
+                                                       e->output.h,
+                                                       info->info.rotation,
+                                                       OUTBUF_DEPTH_INHERIT,
+                                                       info->info.connection,
+                                                       info->info.screen,
+                                                       info->info.drawable,
+                                                       info->info.visual,
+                                                       info->info.colormap,
+                                                       info->info.depth,
+                                                       info->info.alloc_grayscale,
+                                                       info->info.alloc_colors_max,
+                                                       info->info.mask,
+                                                       info->info.shape_dither,
+                                                       info->info.destination_alpha);
+             evas_software_xcb_outbuf_debug_set(re->ob, info->info.debug);
+          }
+#endif
+       re->ob->onebuf = ponebuf;
+     }
+   if (!e->engine.data.output) return 0;
+   if (!e->engine.data.context)
+     e->engine.data.context =
+     e->engine.func->context_new(e->engine.data.output);
+
+   re = e->engine.data.output;
+
+   return 1;
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re;
+
+   if (!data) return;
+
+   re = (Render_Engine *)data;
+
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+// NOTE: XrmGetDatabase() result is shared per connection, do not free it.
+//   if (re->xrdb) XrmDestroyDatabase(re->xrdb);
+#endif
+
+   re->outbuf_free(re->ob);
+   evas_common_tilebuf_free(re->tb);
+   if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+   free(re);
+
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+}
+
+static void
+eng_output_resize(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   re->outbuf_reconfigure(re->ob, w, h,
+                          re->outbuf_get_rot(re->ob),
+                          OUTBUF_DEPTH_INHERIT);
+   evas_common_tilebuf_free(re->tb);
+   re->tb = evas_common_tilebuf_new(w, h);
+   if (re->tb)
+     evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+}
+
+static void
+eng_output_tile_size_set(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_set_tile_size(re->tb, w, h);
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_clear(re->tb);
+}
+
+static void *
+eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re;
+   RGBA_Image *surface;
+   Tilebuf_Rect *rect;
+   int ux, uy, uw, uh;
+
+   re = (Render_Engine *)data;
+   if (re->end)
+     {
+       re->end = 0;
+       return NULL;
+     }
+   if (!re->rects)
+     {
+       re->rects = evas_common_tilebuf_get_render_rects(re->tb);
+       re->cur_rect = EINA_INLIST_GET(re->rects);
+     }
+   if (!re->cur_rect) return NULL;
+   rect = (Tilebuf_Rect *)re->cur_rect;
+   ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h;
+   re->cur_rect = re->cur_rect->next;
+   if (!re->cur_rect)
+     {
+       evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       re->end = 1;
+     }
+
+   surface = re->outbuf_new_region_for_update (re->ob, ux, uy, uw, uh, cx, cy, cw, ch);
+   *x = ux; *y = uy; *w = uw; *h = uh;
+   return surface;
+}
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+#ifdef BUILD_PIPE_RENDER
+   evas_common_pipe_map4_begin(surface);
+#endif   
+   re->outbuf_push_updated_region(re->ob, surface, x, y, w, h);
+   re->outbuf_free_region_for_update(re->ob, surface);
+   evas_common_cpu_end_opt();
+}
+
+static void
+eng_output_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   re->outbuf_flush(re->ob);
+}
+
+static void
+eng_output_idle_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   re->outbuf_idle_flush(re->ob);
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data, void *context __UNUSED__)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   return (re->ob->priv.destination_alpha) || (re->outbuf_alpha_get(re->ob));
+}
+
+/* module advertising code */
+static int
+module_open(Evas_Module *em)
+{
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+   static Eina_Bool xrm_inited = EINA_FALSE;
+   if (!xrm_inited)
+     {
+       xrm_inited = EINA_TRUE;
+       XrmInitialize();
+     }
+#endif
+
+   if (!em) return 0;
+
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
+   _evas_engine_soft_x11_log_dom = eina_log_domain_register("EvasSoftX11", EVAS_DEFAULT_LOG_COLOR);
+   if(_evas_engine_soft_x11_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the SoftX11 engine.\n");
+       return 0;
+     }
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(canvas_alpha_get);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em __UNUSED__)
+{
+  eina_log_domain_unregister(_evas_engine_soft_x11_log_dom);
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+  if (xrdb_user.db)
+    {
+       XrmDestroyDatabase(xrdb_user.db);
+       xrdb_user.last_stat = 0;
+       xrdb_user.last_mtime = 0;
+       xrdb_user.db = NULL;
+    }
+#endif
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "software_x11",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_x11);
+
+#ifndef EVAS_STATIC_BUILD_SOFTWARE_X11
+EVAS_EINA_MODULE_DEFINE(engine, software_x11);
+#endif
+
diff --git a/src/modules/engines/software_x11/evas_engine.h b/src/modules/engines/software_x11/evas_engine.h
new file mode 100644 (file)
index 0000000..e3eb184
--- /dev/null
@@ -0,0 +1,129 @@
+#ifndef EVAS_ENGINE_H
+#define EVAS_ENGINE_H
+
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+# include <X11/Xlib.h>
+# include <X11/Xutil.h>
+# include <X11/Xatom.h>
+# include <X11/extensions/XShm.h>
+# include <X11/Xresource.h> // xres - dpi
+#endif
+
+#ifdef BUILD_ENGINE_SOFTWARE_XCB
+# include <xcb/xcb.h>
+# include <xcb/xcb_image.h>
+#endif
+
+extern int _evas_engine_soft_x11_log_dom;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_soft_x11_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_soft_x11_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_soft_x11_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_soft_x11_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_soft_x11_log_dom, __VA_ARGS__)
+
+typedef enum   _Outbuf_Depth    Outbuf_Depth;
+
+enum _Outbuf_Depth
+{
+   OUTBUF_DEPTH_NONE,
+   OUTBUF_DEPTH_INHERIT,
+   OUTBUF_DEPTH_RGB_16BPP_565_565_DITHERED,
+   OUTBUF_DEPTH_RGB_16BPP_555_555_DITHERED,
+   OUTBUF_DEPTH_RGB_16BPP_444_444_DITHERED,
+   OUTBUF_DEPTH_RGB_16BPP_565_444_DITHERED,
+   OUTBUF_DEPTH_RGB_32BPP_888_8888,
+   OUTBUF_DEPTH_LAST
+};
+
+typedef struct _Outbuf          Outbuf;
+
+struct _Outbuf
+{
+   Outbuf_Depth    depth;
+   int             w, h;
+   int             rot;
+   int             onebuf;
+
+   struct {
+      Convert_Pal *pal;
+      union {
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+         struct {
+            Display          *disp;
+            Window            win;
+            Pixmap            mask;
+            Visual           *vis;
+            Colormap          cmap;
+            int               depth;
+            int               shm;
+            GC                gc;
+            GC                gcm;
+            unsigned char     swap     : 1;
+            unsigned char     bit_swap : 1;
+         } xlib;
+#endif
+#ifdef BUILD_ENGINE_SOFTWARE_XCB
+         struct {
+            xcb_connection_t *conn;
+            xcb_screen_t     *screen;
+            xcb_drawable_t    win;
+            xcb_pixmap_t      mask;
+            xcb_visualtype_t *vis;
+            xcb_colormap_t    cmap;
+            int               depth;
+            int               shm;
+            xcb_gcontext_t    gc;
+            xcb_gcontext_t    gcm;
+            unsigned char     swap     : 1;
+            unsigned char     bit_swap : 1;
+         } xcb;
+#endif
+      } x11;
+      struct {
+        DATA32    r, g, b;
+      } mask;
+
+      /* 1 big buffer for updates - flush on idle_flush */
+      RGBA_Image  *onebuf;
+      Eina_List   *onebuf_regions;
+
+      /* a list of pending regions to write to the target */
+      Eina_List   *pending_writes;
+      /* a list of previous frame pending regions to write to the target */
+      Eina_List   *prev_pending_writes;
+
+      unsigned char mask_dither : 1;
+      unsigned char destination_alpha : 1;
+      unsigned char debug : 1;
+      unsigned char synced : 1;
+   } priv;
+};
+
+
+void evas_software_xlib_x_init (void);
+void evas_software_xcb_x_init  (void);
+
+
+#endif
diff --git a/src/modules/engines/software_x11/evas_xcb_buffer.c b/src/modules/engines/software_x11/evas_xcb_buffer.c
new file mode 100644 (file)
index 0000000..c7e9c74
--- /dev/null
@@ -0,0 +1,468 @@
+#include "evas_common.h"
+
+#include "evas_xcb_buffer.h"
+
+static int _xcb_err = 0;
+
+void
+evas_software_xcb_x_write_mask_line(Outbuf            *buf,
+                                    Xcb_Output_Buffer *xcbob,
+                                   DATA32            *src,
+                                   int                w,
+                                   int                y)
+{
+   int     x;
+   DATA32 *src_ptr;
+   DATA8  *dst_ptr;
+   int     bpl = 0;
+
+   src_ptr = src;
+   dst_ptr = evas_software_xcb_x_output_buffer_data(xcbob, &bpl);
+   dst_ptr = dst_ptr + (bpl * y);
+   w -= 7;
+   if (buf->priv.x11.xcb.bit_swap)
+     {
+       for (x = 0; x < w; x += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[0])) >> 7) << 7) |
+              ((A_VAL(&(src_ptr[1])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[2])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[3])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[4])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[5])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[6])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[7])) >> 7) << 0);
+            src_ptr += 8;
+            dst_ptr++;
+         }
+     }
+   else
+     {
+       for (x = 0; x < w; x += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[0])) >> 7) << 0) |
+              ((A_VAL(&(src_ptr[1])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[2])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[3])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[4])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[5])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[6])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[7])) >> 7) << 7);
+            src_ptr += 8;
+            dst_ptr++;
+         }
+     }
+   w += 7;
+   for (; x < w; x ++)
+      {
+        xcb_image_put_pixel(xcbob->image, x, y, A_VAL(src_ptr) >> 7);
+        src_ptr++;
+      }
+}
+
+void
+evas_software_xcb_x_write_mask_line_rev(Outbuf            *buf,
+                                        Xcb_Output_Buffer *xcbob,
+                                        DATA32            *src,
+                                        int                w,
+                                        int                y)
+{
+   int     x;
+   DATA32 *src_ptr;
+   DATA8  *dst_ptr;
+   int     bpl = 0;
+
+   src_ptr = src + w - 1;
+   dst_ptr = evas_software_xcb_x_output_buffer_data(xcbob, &bpl);
+   dst_ptr = dst_ptr + (bpl * y);
+   w -= 7;
+   if (buf->priv.x11.xcb.bit_swap)
+     {
+       for (x = 0; x < w; x += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[ 0])) >> 7) << 7) |
+              ((A_VAL(&(src_ptr[-1])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[-2])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[-3])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[-4])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[-5])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[-6])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[-7])) >> 7) << 0);
+            src_ptr -= 8;
+            dst_ptr++;
+         }
+     }
+   else
+     {
+       for (x = 0; x < w; x += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[ 0])) >> 7) << 0) |
+              ((A_VAL(&(src_ptr[-1])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[-2])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[-3])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[-4])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[-5])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[-6])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[-7])) >> 7) << 7);
+            src_ptr -= 8;
+            dst_ptr++;
+         }
+     }
+   w += 7;
+   for (; x < w; x ++)
+     {
+       xcb_image_put_pixel(xcbob->image, x, y, A_VAL(src_ptr) >> 7);
+       src_ptr--;
+     }
+}
+
+void
+evas_software_xcb_x_write_mask_line_vert(Outbuf            *buf,
+                                         Xcb_Output_Buffer *xcbob,
+                                         DATA32            *src,
+                                         int                h,
+                                         int                ym,
+                                         int                w)
+{
+   int     y;
+   DATA32 *src_ptr;
+   DATA8  *dst_ptr;
+   int     bpl = 0;
+
+   src_ptr = src;
+   dst_ptr = evas_software_xcb_x_output_buffer_data(xcbob, &bpl);
+   dst_ptr = dst_ptr + (bpl * ym);
+   h -= 7;
+   if (buf->priv.x11.xcb.bit_swap)
+     {
+       for (y = 0; y < h; y += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[0 * w])) >> 7) << 7) |
+              ((A_VAL(&(src_ptr[1 * w])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[2 * w])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[3 * w])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[4 * w])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[5 * w])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[6 * w])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[7 * w])) >> 7) << 0);
+            src_ptr += 8 * w;
+            dst_ptr++;
+         }
+     }
+   else
+     {
+       for (y = 0; y < h; y += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[0 * w])) >> 7) << 0) |
+              ((A_VAL(&(src_ptr[1 * w])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[2 * w])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[3 * w])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[4 * w])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[5 * w])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[6 * w])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[7 * w])) >> 7) << 7);
+            src_ptr += 8 * w;
+            dst_ptr++;
+         }
+     }
+   h += 7;
+   for (; y < h; y ++)
+     {
+       xcb_image_put_pixel(xcbob->image, y, ym, A_VAL(src_ptr) >> 7);
+       src_ptr += w;
+     }
+}
+
+void
+evas_software_xcb_x_write_mask_line_vert_rev(Outbuf            *buf,
+                                             Xcb_Output_Buffer *xcbob,
+                                             DATA32            *src,
+                                             int                h,
+                                             int                ym,
+                                             int                w)
+{
+   int     y;
+   DATA32 *src_ptr;
+   DATA8  *dst_ptr;
+   int     bpl = 0;
+
+   src_ptr = src + ((h - 1) * w);
+   dst_ptr = evas_software_xcb_x_output_buffer_data(xcbob, &bpl);
+   dst_ptr = dst_ptr + (bpl * ym);
+   h -= 7;
+   if (buf->priv.x11.xcb.bit_swap)
+     {
+       for (y = 0; y < h; y += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[ 0 * w])) >> 7) << 7) |
+              ((A_VAL(&(src_ptr[-1 * w])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[-2 * w])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[-3 * w])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[-4 * w])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[-5 * w])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[-6 * w])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[-7 * w])) >> 7) << 0);
+            src_ptr -= 8 * w;
+            dst_ptr++;
+         }
+     }
+   else
+     {
+       for (y = 0; y < h; y += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[ 0 * w])) >> 7) << 0) |
+              ((A_VAL(&(src_ptr[-1 * w])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[-2 * w])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[-3 * w])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[-4 * w])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[-5 * w])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[-6 * w])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[-7 * w])) >> 7) << 7);
+            src_ptr -= 8 * w;
+            dst_ptr++;
+         }
+     }
+   h += 7;
+   for (; y < h; y ++)
+     {
+       xcb_image_put_pixel(xcbob->image, y, ym, A_VAL(src_ptr) >> 7);
+       src_ptr -= w;
+     }
+}
+
+int
+evas_software_xcb_x_can_do_shm(xcb_connection_t *c,
+                               xcb_screen_t     *screen)
+{
+   static xcb_connection_t  *cached_c = NULL;
+   static int                cached_result = 0;
+
+   if (c == cached_c) return cached_result;
+   cached_c = c;
+
+   if (xcb_get_extension_data(c, &xcb_shm_id))
+     {
+       Xcb_Output_Buffer *xcbob;
+
+       xcbob = evas_software_xcb_x_output_buffer_new(c,
+                                                     screen->root_depth,
+                                                     16,
+                                                     16,
+                                                     2,
+                                                     NULL);
+       if (!xcbob)
+         {
+            cached_result = 0;
+            return 0;
+         }
+       evas_software_xcb_x_output_buffer_free(xcbob, 1);
+       cached_result = 1;
+       return 1;
+     }
+   cached_result = 0;
+   return 0;
+}
+
+/*
+ * FIXME: no error mechanism
+ */
+
+/* static void */
+/* x_output_tmp_xcb_err(xcb_connection_t *c, XErrorEvent * ev) */
+/* { */
+/*    _xcb_err = 1; */
+/*    return; */
+/* } */
+
+Xcb_Output_Buffer *
+evas_software_xcb_x_output_buffer_new(xcb_connection_t *c,
+                                     int               depth,
+                                     int               w,
+                                     int               h,
+                                     int               try_shm,
+                                     void             *data)
+{
+   Xcb_Output_Buffer *xcbob;
+
+   xcbob = calloc(1, sizeof(Xcb_Output_Buffer));
+   if (!xcbob) return NULL;
+
+   xcbob->connection = c;
+   xcbob->image      = NULL;
+   xcbob->shm_info   = NULL;
+   xcbob->w = w;
+   xcbob->h = h;
+
+   if (try_shm > 0)
+     {
+        xcbob->shm_info = malloc(sizeof(xcb_shm_segment_info_t));
+        if (xcbob->shm_info)
+          {
+             xcbob->shm_info->shmseg = xcb_generate_id(c);
+             xcbob->image = xcb_image_create_native(c, w, h,
+                                                    XCB_IMAGE_FORMAT_Z_PIXMAP,
+                                                    depth, NULL, ~0, NULL);
+             if (xcbob->image)
+               {
+                  xcbob->shm_info->shmid = shmget(IPC_PRIVATE,
+                                                  xcbob->image->size,
+                                                  IPC_CREAT | 0777);
+                  if (xcbob->shm_info->shmid >= 0)
+                    {
+                       xcbob->shm_info->shmaddr = xcbob->image->data =
+                         shmat(xcbob->shm_info->shmid, 0, 0);
+                       if (xcbob->shm_info->shmaddr != NULL)
+                         {
+                            /*
+                             * FIXME: no error mechanism
+                             */
+
+                           /* XErrorHandler ph; */
+                           /* EventHandlers eh; */
+                            
+                           if (try_shm == 2) // only needed during testing
+                             {
+                               free(xcb_get_input_focus_reply(c, xcb_get_input_focus_unchecked(c), NULL));
+                               _xcb_err = 0;
+                               /* ph = XSetErrorHandler((XErrorHandler) */
+                             }
+                           xcb_shm_attach(c,
+                                          xcbob->shm_info->shmseg,
+                                          xcbob->shm_info->shmid, 0);
+                           if (try_shm == 2) // only needed during testing
+                             {
+                               free(xcb_get_input_focus_reply(c, xcb_get_input_focus_unchecked(c), NULL));
+                               /* XSetErrorHandler((XErrorHandler)ph); */
+                             }
+                           if (!_xcb_err)
+                             {
+                                xcbob->bpl = xcbob->image->stride;
+                                xcbob->psize = xcbob->bpl * xcbob->h;
+                                 return xcbob;
+                             }
+                         }
+                       shmdt(xcbob->shm_info->shmaddr);
+                       shmctl(xcbob->shm_info->shmid, IPC_RMID, 0);
+                    }
+                  if (xcbob->image) xcb_image_destroy(xcbob->image);
+                  xcbob->image = NULL;
+               }
+             if (xcbob->shm_info) free(xcbob->shm_info);
+             xcbob->shm_info = NULL;
+          }
+     }
+
+   if (try_shm > 1) return NULL;
+
+   xcbob->image = xcb_image_create_native(c, w, h, XCB_IMAGE_FORMAT_Z_PIXMAP,
+                                          depth, NULL, ~0, NULL);
+   if (!xcbob->image)
+     {
+       free(xcbob);
+       return NULL;
+     }
+
+   xcbob->data = data;
+
+   if (!xcbob->image->data)
+     {
+       xcbob->image->data = malloc(xcbob->image->size);
+       if (!xcbob->image->data)
+         {
+            xcb_image_destroy(xcbob->image);
+            free(xcbob);
+            return NULL;
+         }
+     }
+
+   xcbob->bpl = xcbob->image->stride;
+   xcbob->psize = xcbob->image->size;
+
+   return xcbob;
+}
+
+void
+evas_software_xcb_x_output_buffer_free(Xcb_Output_Buffer *xcbob,
+                                      int                sync)
+{
+   if (xcbob->shm_info)
+     {
+       if (sync)
+          free(xcb_get_input_focus_reply(xcbob->connection,
+                                         xcb_get_input_focus_unchecked(xcbob->connection),
+                                         NULL));
+       xcb_shm_detach(xcbob->connection, xcbob->shm_info->shmseg);
+       xcb_image_destroy(xcbob->image);
+       shmdt(xcbob->shm_info->shmaddr);
+       shmctl(xcbob->shm_info->shmid, IPC_RMID, 0);
+       free(xcbob->shm_info);
+     }
+   else
+     {
+       if (xcbob->data) xcbob->image->data = NULL;
+       free(xcbob->image->data);
+       xcb_image_destroy(xcbob->image);
+     }
+   free(xcbob);
+}
+
+void
+evas_software_xcb_x_output_buffer_paste(Xcb_Output_Buffer    *xcbob,
+                                       xcb_drawable_t        d,
+                                       xcb_gcontext_t        gc,
+                                       int                   x,
+                                       int                   y,
+                                       int                   sync)
+{
+   if (xcbob->shm_info)
+     {
+       xcb_image_shm_put(xcbob->connection, d, gc,
+                          xcbob->image, *xcbob->shm_info,
+                          0, 0,
+                          x, y,
+                          xcbob->w, xcbob->h,
+                          0);
+       if (sync)
+          free(xcb_get_input_focus_reply(xcbob->connection,
+                                         xcb_get_input_focus_unchecked(xcbob->connection),
+                                         NULL));
+     }
+   else
+      xcb_image_put(xcbob->connection, d, gc,
+                    xcbob->image,
+                    x, y, 0);
+}
+
+DATA8 *
+evas_software_xcb_x_output_buffer_data(Xcb_Output_Buffer *xcbob,
+                                      int               *bytes_per_line_ret)
+{
+   if (bytes_per_line_ret) *bytes_per_line_ret = xcbob->image->stride;
+   return xcbob->image->data;
+}
+
+int
+evas_software_xcb_x_output_buffer_depth(Xcb_Output_Buffer *xcbob)
+{
+   return xcbob->image->bpp;
+}
+
+int
+evas_software_xcb_x_output_buffer_byte_order(Xcb_Output_Buffer *xcbob)
+{
+   return xcbob->image->byte_order;
+}
+
+int
+evas_software_xcb_x_output_buffer_bit_order(Xcb_Output_Buffer *xcbob)
+{
+   return xcbob->image->bit_order;
+}
diff --git a/src/modules/engines/software_x11/evas_xcb_buffer.h b/src/modules/engines/software_x11/evas_xcb_buffer.h
new file mode 100644 (file)
index 0000000..f9582c8
--- /dev/null
@@ -0,0 +1,67 @@
+#ifndef EVAS_XCB_BUFFER_H
+#define EVAS_XCB_BUFFER_H
+
+
+#include "evas_engine.h"
+
+
+typedef struct _Xcb_Output_Buffer     Xcb_Output_Buffer;
+
+struct _Xcb_Output_Buffer
+{
+   xcb_connection_t       *connection;
+   xcb_image_t            *image;
+   xcb_shm_segment_info_t *shm_info;
+   void                   *data;
+   int                     w;
+   int                     h;
+   int                     bpl;
+   int                     psize;
+};
+
+void               evas_software_xcb_x_write_mask_line         (Outbuf            *buf,
+                                                                Xcb_Output_Buffer *xcbob,
+                                                               DATA32            *src,
+                                                               int                w,
+                                                               int                y);
+void               evas_software_xcb_x_write_mask_line_rev     (Outbuf            *buf,
+                                                                Xcb_Output_Buffer *xcbob,
+                                                                DATA32            *src,
+                                                                int                w,
+                                                                int                y);
+void               evas_software_xcb_x_write_mask_line_vert    (Outbuf            *buf,
+                                                                Xcb_Output_Buffer *xcbob,
+                                                                DATA32            *src,
+                                                                int                h,
+                                                                int                ym,
+                                                                int                w);
+void               evas_software_xcb_x_write_mask_line_vert_rev(Outbuf            *buf,
+                                                                Xcb_Output_Buffer *xcbob,
+                                                                DATA32            *src,
+                                                                int                h,
+                                                                int                ym,
+                                                                int                w);
+int                evas_software_xcb_x_can_do_shm              (xcb_connection_t *c,
+                                                                xcb_screen_t     *screen);
+Xcb_Output_Buffer *evas_software_xcb_x_output_buffer_new       (xcb_connection_t *c,
+                                                               int            depth,
+                                                               int            w,
+                                                               int            h,
+                                                               int            try_shm,
+                                                               void          *data);
+void               evas_software_xcb_x_output_buffer_free      (Xcb_Output_Buffer *xcbob,
+                                                               int                sync);
+void               evas_software_xcb_x_output_buffer_paste     (Xcb_Output_Buffer *xcbob,
+                                                               xcb_drawable_t        d,
+                                                               xcb_gcontext_t        gc,
+                                                               int                x,
+                                                               int                y,
+                                                               int                sync);
+DATA8             *evas_software_xcb_x_output_buffer_data      (Xcb_Output_Buffer *xcbob,
+                                                               int               *bytes_per_line_ret);
+int                evas_software_xcb_x_output_buffer_depth     (Xcb_Output_Buffer *xcbob);
+int                evas_software_xcb_x_output_buffer_byte_order(Xcb_Output_Buffer *xcbob);
+int                evas_software_xcb_x_output_buffer_bit_order (Xcb_Output_Buffer *xcbob);
+
+
+#endif
diff --git a/src/modules/engines/software_x11/evas_xcb_color.c b/src/modules/engines/software_x11/evas_xcb_color.c
new file mode 100644 (file)
index 0000000..4b5aa30
--- /dev/null
@@ -0,0 +1,424 @@
+#include "evas_common.h"
+
+#include "evas_engine.h"
+
+typedef struct _Convert_Pal_Priv Convert_Pal_Priv;
+
+struct _Convert_Pal_Priv
+{
+   xcb_connection_t *conn;
+   xcb_colormap_t    cmap;
+   xcb_visualtype_t *vis;
+};
+
+typedef DATA8 * (*Xcb_Func_Alloc_Colors) (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
+
+static Xcb_Func_Alloc_Colors x_color_alloc[PAL_MODE_LAST + 1];
+static int                   x_color_count[PAL_MODE_LAST + 1];
+static Eina_List            *palettes = NULL;
+
+static DATA8 * x_color_alloc_rgb(int nr, int ng, int nb, xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
+static DATA8 * x_color_alloc_gray(int ng, xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
+
+static DATA8 * x_color_alloc_rgb_332  (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
+static DATA8 * x_color_alloc_rgb_666  (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
+static DATA8 * x_color_alloc_rgb_232  (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
+static DATA8 * x_color_alloc_rgb_222  (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
+static DATA8 * x_color_alloc_rgb_221  (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
+static DATA8 * x_color_alloc_rgb_121  (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
+static DATA8 * x_color_alloc_rgb_111  (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
+static DATA8 * x_color_alloc_gray_256 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
+static DATA8 * x_color_alloc_gray_64  (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
+static DATA8 * x_color_alloc_gray_16  (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
+static DATA8 * x_color_alloc_gray_4   (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
+static DATA8 * x_color_alloc_mono     (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
+
+static DATA8 *
+x_color_alloc_rgb(int               nr,
+                 int               ng,
+                 int               nb,
+                 xcb_connection_t *conn,
+                 xcb_colormap_t    cmap,
+                 xcb_visualtype_t *v)
+{
+   int    r, g, b, i;
+   DATA8 *color_lut;
+   int    sig_mask = 0;
+   int    delt = 0;
+
+   for (i = 0; i < v->bits_per_rgb_value; i++) sig_mask |= (0x1 << i);
+   sig_mask <<= (16 - v->bits_per_rgb_value);
+   i = 0;
+   color_lut = malloc((nr) * (ng) * (nb));
+   if (!color_lut) return NULL;
+   delt = 0x0101 * 3;
+   /* FIXME: remove the round-trip ? */
+   for (r = 0; r < (nr); r++)
+     {
+       for (g = 0; g < (ng); g++)
+         {
+            for (b = 0; b < (nb); b++)
+              {
+                 xcb_coloritem_t          xcl;
+                 xcb_coloritem_t          xcl_in;
+                 xcb_alloc_color_reply_t *rep;
+                 int                      val;
+                  int                      dr, dg, db;
+
+                  val = (int)((((double)r) / ((nr) - 1)) * 255);
+                  val = (val << 8) | val;
+                 xcl.red = (uint16_t)(val);
+                 val = (int)((((double)g) / ((ng) - 1)) * 255);
+                  val = (val << 8) | val;
+                 xcl.green = (uint16_t)(val);
+                 val = (int)((((double)b) / ((nb) - 1)) * 255);
+                  val = (val << 8) | val;
+                 xcl.blue = (uint16_t)(val);
+                 xcl_in = xcl;
+                 rep = xcb_alloc_color_reply(conn,
+                                              xcb_alloc_color_unchecked(conn,
+                                                                        cmap,
+                                                                        xcl.red,
+                                                                        xcl.green,
+                                                                        xcl.blue),
+                                              0);
+                  dr = (int)xcl_in.red - (int)xcl.red;
+                  if (dr < 0) dr = -dr;
+                  dg = (int)xcl_in.green - (int)xcl.green;
+                  if (dg < 0) dg = -dg;
+                  db = (int)xcl_in.blue - (int)xcl.blue;
+                  if (db < 0) db = -db;
+/*
+                 printf("ASK [%i]: %04x %04x %04x = %04x %04x %04x | dif = %04x / %04x\n",
+                        ret,
+                        xcl_in.red, xcl_in.green, xcl_in.blue,
+                        xcl.red, xcl.green, xcl.blue,
+                        (dr + dg +db), delt);
+ */
+
+                 /* TODO: XAllocColor tries to approach the color */
+                 /* in case the allocation fails */
+                 /* XCB does not that (i think). It should be done */
+                 /* So if rep == NULL, the other following tests */
+                 /* should be always satisfied */
+                 if ((!rep) ||
+                      ((dr + dg + db) > delt)
+                      /*
+                     ((xcl_in.red   & sig_mask) != (xcl.red   & sig_mask)) ||
+                     ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
+                     ((xcl_in.blue  & sig_mask) != (xcl.blue  & sig_mask))
+                      */
+                      )
+                   {
+                      uint32_t pixels[256];
+                      int      j;
+
+                      if (i > 0)
+                        {
+                           for (j = 0; j < i; j++)
+                             pixels[j] = (uint32_t)color_lut[j];
+                           xcb_free_colors(conn, cmap, 0, i, pixels);
+                        }
+                      free(color_lut);
+                      return NULL;
+                   }
+                 color_lut[i] = rep->pixel;
+                 i++;
+                 free(rep);
+              }
+         }
+     }
+   return color_lut;
+}
+
+static DATA8 *
+x_color_alloc_gray(int               ng,
+                  xcb_connection_t *conn,
+                  xcb_colormap_t    cmap,
+                  xcb_visualtype_t *v)
+{
+   int g, i;
+   DATA8 *color_lut;
+   int sig_mask = 0;
+
+   for (i = 0; i < v->bits_per_rgb_value; i++) sig_mask |= (0x1 << i);
+   sig_mask <<= (16 - v->bits_per_rgb_value);
+   i = 0;
+   color_lut = malloc(ng);
+   if (!color_lut) return NULL;
+   /* FIXME: remove the round-trip ? */
+   for (g = 0; g < (ng); g++)
+     {
+       xcb_coloritem_t          xcl;
+       xcb_coloritem_t          xcl_in;
+       int                      val;
+       xcb_alloc_color_reply_t *rep;
+
+       val = (int)((((double)g) / ((ng) - 1)) * 255);
+        val = (val << 8) | val;
+       xcl.red = (uint16_t)(val);
+       xcl.green = (uint16_t)(val);
+       xcl.blue = (uint16_t)(val);
+       xcl_in = xcl;
+       rep = xcb_alloc_color_reply(conn,
+                                    xcb_alloc_color_unchecked(conn,
+                                                              cmap,
+                                                              xcl.red,
+                                                              xcl.green,
+                                                              xcl.blue),
+                                    0);
+       /* FIXME: XAllocColor tries to approach the color */
+       /* in case the allocation fails */
+       /* XCB does not that (i think). It should be done */
+       /* So if rep == NULL, the other following tests */
+       /* should be always satisfied */
+       if ((!rep) ||
+           ((xcl_in.red   & sig_mask) != (xcl.red   & sig_mask)) ||
+           ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
+           ((xcl_in.blue  & sig_mask) != (xcl.blue  & sig_mask)))
+         {
+            uint32_t pixels[256];
+            int      j;
+
+            if (i > 0)
+              {
+                 for (j = 0; j < i; j++)
+                   pixels[j] = (uint32_t) color_lut[j];
+                 xcb_free_colors(conn, cmap, 0, i, pixels);
+              }
+            free(color_lut);
+            return NULL;
+         }
+       color_lut[i] = rep->pixel;
+       i++;
+       free(rep);
+     }
+   return color_lut;
+}
+
+static DATA8 *
+x_color_alloc_rgb_332(xcb_connection_t *conn,
+                     xcb_colormap_t    cmap,
+                     xcb_visualtype_t *v)
+{
+   return x_color_alloc_rgb(8, 8, 4, conn, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_rgb_666(xcb_connection_t *conn,
+                     xcb_colormap_t    cmap,
+                     xcb_visualtype_t *v)
+{
+   return x_color_alloc_rgb(6, 6, 6, conn, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_rgb_232(xcb_connection_t *conn,
+                     xcb_colormap_t    cmap,
+                     xcb_visualtype_t *v)
+{
+   return x_color_alloc_rgb(4, 8, 4, conn, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_rgb_222(xcb_connection_t *conn,
+                     xcb_colormap_t    cmap,
+                     xcb_visualtype_t *v)
+{
+   return x_color_alloc_rgb(4, 4, 4, conn, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_rgb_221(xcb_connection_t *conn,
+                      xcb_colormap_t    cmap,
+                      xcb_visualtype_t *v)
+{
+   return x_color_alloc_rgb(4, 4, 2, conn, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_rgb_121(xcb_connection_t *conn,
+                     xcb_colormap_t    cmap,
+                     xcb_visualtype_t *v)
+{
+   return x_color_alloc_rgb(2, 4, 2, conn, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_rgb_111(xcb_connection_t *conn,
+                     xcb_colormap_t    cmap,
+                     xcb_visualtype_t *v)
+{
+   return x_color_alloc_rgb(2, 2, 2, conn, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_gray_256(xcb_connection_t *conn,
+                      xcb_colormap_t    cmap,
+                      xcb_visualtype_t *v)
+{
+   return x_color_alloc_gray(256, conn, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_gray_64(xcb_connection_t *conn,
+                     xcb_colormap_t    cmap,
+                     xcb_visualtype_t *v)
+{
+   return x_color_alloc_gray(64, conn, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_gray_16(xcb_connection_t *conn,
+                     xcb_colormap_t    cmap,
+                     xcb_visualtype_t *v)
+{
+   return x_color_alloc_gray(32, conn, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_gray_4(xcb_connection_t *conn,
+                    xcb_colormap_t    cmap,
+                    xcb_visualtype_t *v)
+{
+   return x_color_alloc_gray(16, conn, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_mono(xcb_connection_t *conn,
+                  xcb_colormap_t    cmap,
+                  xcb_visualtype_t *v)
+{
+   return x_color_alloc_gray(2, conn, cmap, v);
+}
+
+void
+evas_software_xcb_x_color_init(void)
+{
+   static int initialised = 0;
+
+   if (initialised) return;
+   x_color_alloc[PAL_MODE_NONE]    = NULL;
+   x_color_count[PAL_MODE_NONE]    = 0;
+
+   x_color_alloc[PAL_MODE_MONO]    = x_color_alloc_mono;
+   x_color_count[PAL_MODE_MONO]    = 2;
+
+   x_color_alloc[PAL_MODE_GRAY4]   = x_color_alloc_gray_4;
+   x_color_count[PAL_MODE_GRAY4]   = 4;
+
+   x_color_alloc[PAL_MODE_GRAY16]  = x_color_alloc_gray_16;
+   x_color_count[PAL_MODE_GRAY16]  = 16;
+
+   x_color_alloc[PAL_MODE_GRAY64]  = x_color_alloc_gray_64;
+   x_color_count[PAL_MODE_GRAY64]  = 64;
+
+   x_color_alloc[PAL_MODE_GRAY256] = x_color_alloc_gray_256;
+   x_color_count[PAL_MODE_GRAY256] = 256;
+
+   x_color_alloc[PAL_MODE_RGB111]  = x_color_alloc_rgb_111;
+   x_color_count[PAL_MODE_RGB111]  = 2 * 2 * 2;
+
+   x_color_alloc[PAL_MODE_RGB121]  = x_color_alloc_rgb_121;
+   x_color_count[PAL_MODE_RGB121]  = 2 * 4 * 2;
+
+   x_color_alloc[PAL_MODE_RGB221]  = x_color_alloc_rgb_221;
+   x_color_count[PAL_MODE_RGB221]  = 4 * 4 * 2;
+
+   x_color_alloc[PAL_MODE_RGB222]  = x_color_alloc_rgb_222;
+   x_color_count[PAL_MODE_RGB222]  = 4 * 4 * 4;
+
+   x_color_alloc[PAL_MODE_RGB232]  = x_color_alloc_rgb_232;
+   x_color_count[PAL_MODE_RGB232]  = 4 * 8 * 4;
+
+   x_color_alloc[PAL_MODE_RGB666]  = x_color_alloc_rgb_666;
+   x_color_count[PAL_MODE_RGB666]  = 6 * 6 * 6;
+
+   x_color_alloc[PAL_MODE_RGB332]  = x_color_alloc_rgb_332;
+   x_color_count[PAL_MODE_RGB332]  = 8 * 8 * 4;
+
+   x_color_alloc[PAL_MODE_LAST]    = NULL;
+   x_color_count[PAL_MODE_LAST]    = 0;
+   initialised = 1;
+}
+
+Convert_Pal *
+evas_software_xcb_x_color_allocate(xcb_connection_t   *conn,
+                                  xcb_colormap_t      cmap,
+                                  xcb_visualtype_t   *vis,
+                                  Convert_Pal_Mode    colors)
+{
+   Convert_Pal_Priv *palpriv;
+   Convert_Pal      *pal;
+   Convert_Pal_Mode  c;
+   Eina_List        *l;
+
+/*   printf("ALLOC cmap=%i vis=%p\n", cmap, vis);*/
+   EINA_LIST_FOREACH(palettes, l, pal)
+     {
+       palpriv = pal->data;
+       if ((conn == palpriv->conn) &&
+           (vis  == palpriv->vis)  &&
+           (cmap == palpriv->cmap))
+         {
+            pal->references++;
+            return pal;
+         }
+     }
+   pal = calloc(1, sizeof(struct _Convert_Pal));
+   if (!pal) return NULL;
+   for (c = colors; c > PAL_MODE_NONE; c--)
+     {
+       if (x_color_alloc[c])
+         {
+/*          printf("TRY PAL %i\n", c);*/
+            pal->lookup = (x_color_alloc[c])(conn, cmap, vis);
+            if (pal->lookup) break;
+         }
+     }
+   pal->references = 1;
+   pal->colors = c;
+   pal->count = x_color_count[c];
+   palpriv = calloc(1, sizeof(Convert_Pal_Priv));
+   pal->data = palpriv;
+   if (!palpriv)
+     {
+       if (pal->lookup) free(pal->lookup);
+       free(pal);
+       return NULL;
+     }
+   palpriv->conn = conn;
+   palpriv->vis = vis;
+   palpriv->cmap = cmap;
+   if (pal->colors == PAL_MODE_NONE)
+     {
+       if (pal->lookup) free(pal->lookup);
+       free(pal);
+       return NULL;
+     }
+   palettes = eina_list_append(palettes, pal);
+   return pal;
+}
+
+void
+evas_software_xcb_x_color_deallocate(xcb_connection_t *conn,
+                                    xcb_colormap_t    cmap,
+                                    xcb_visualtype_t *vis __UNUSED__,
+                                    Convert_Pal      *pal)
+{
+   uint32_t pixels[256];
+   int      j;
+
+   pal->references--;
+   if (pal->references > 0) return;
+   if (pal->lookup)
+     {
+       for(j = 0; j < pal->count; j++)
+         pixels[j] = (uint32_t) pal->lookup[j];
+       xcb_free_colors(conn, cmap, 0, pal->count, pixels);
+       free(pal->lookup);
+     }
+   free(pal->data);
+   palettes = eina_list_remove(palettes, pal);
+   free(pal);
+}
diff --git a/src/modules/engines/software_x11/evas_xcb_color.h b/src/modules/engines/software_x11/evas_xcb_color.h
new file mode 100644 (file)
index 0000000..0d04000
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef EVAS_XCB_COLOR_H
+#define EVAS_XCB_COLOR_H
+
+
+void         evas_software_xcb_x_color_init       (void);
+Convert_Pal *evas_software_xcb_x_color_allocate   (xcb_connection_t   *conn,
+                                                  xcb_colormap_t      cmap,
+                                                  xcb_visualtype_t   *vis,
+                                                  Convert_Pal_Mode    colors);
+void         evas_software_xcb_x_color_deallocate (xcb_connection_t *conn,
+                                                  xcb_colormap_t    cmap,
+                                                  xcb_visualtype_t *vis,
+                                                  Convert_Pal      *pal);
+
+#endif
diff --git a/src/modules/engines/software_x11/evas_xcb_main.c b/src/modules/engines/software_x11/evas_xcb_main.c
new file mode 100644 (file)
index 0000000..e395b02
--- /dev/null
@@ -0,0 +1,7 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+void
+evas_software_xcb_x_init(void)
+{
+}
diff --git a/src/modules/engines/software_x11/evas_xcb_outbuf.c b/src/modules/engines/software_x11/evas_xcb_outbuf.c
new file mode 100644 (file)
index 0000000..b4932ce
--- /dev/null
@@ -0,0 +1,1111 @@
+#include <xcb/shm.h>
+#include <xcb/xcb_image.h>
+#include <pixman.h>
+#include <sys/time.h>
+#include <sys/utsname.h>
+
+#include "evas_common.h"
+#include "evas_macros.h"
+#include "evas_xcb_outbuf.h"
+#include "evas_xcb_buffer.h"
+#include "evas_xcb_color.h"
+
+
+typedef struct _Outbuf_Region         Outbuf_Region;
+
+struct _Outbuf_Region
+{
+   Xcb_Output_Buffer *xcbob;
+   Xcb_Output_Buffer *mxcbob;
+   int                x;
+   int                y;
+   int                w;
+   int                h;
+};
+
+static Eina_List *shmpool = NULL;
+static int shmsize = 0;
+static int shmmemlimit = 10 * 1024 * 1024;
+static int shmcountlimit = 32;
+
+static Xcb_Output_Buffer *
+_find_xcbob(xcb_connection_t *conn, int depth, int w, int h, int shm, void *data)
+{
+   Eina_List         *l;
+   Eina_List         *xl = NULL;
+   Xcb_Output_Buffer *xcbob = NULL;
+   Xcb_Output_Buffer *xcbob2;
+   int                fitness = 0x7fffffff;
+   int                sz;
+   int                lbytes;
+   int                bpp;
+
+//   return evas_software_xcb_x_output_buffer_new(d, v, depth, w, h, shm, data);
+   if (!shm)
+     return evas_software_xcb_x_output_buffer_new(conn, depth, w, h, shm, data);
+   if (depth > 1)
+     {
+       bpp = depth / 8;
+       if (bpp == 3) bpp = 4;
+       lbytes = (((w * bpp) + 3) / 4) * 4;
+     }
+   else
+     lbytes = ((w + 31) / 32) * 4;
+   sz = lbytes * h;
+   EINA_LIST_FOREACH(shmpool, l, xcbob2)
+     {
+       int szdif;
+
+       if ((xcbob2->image->depth != depth) ||
+           (xcbob2->connection != conn))
+         continue;
+       szdif = xcbob2->psize - sz;
+       if (szdif < 0) continue;
+       if (szdif == 0)
+         {
+            xcbob = xcbob2;
+            xl = l;
+            goto have_xcbob;
+         }
+       if (szdif < fitness)
+         {
+            fitness = szdif;
+            xcbob = xcbob2;
+            xl = l;
+         }
+     }
+   if ((fitness > (100 * 100)) || (!xcbob))
+     return evas_software_xcb_x_output_buffer_new(conn, depth, w, h, shm, data);
+
+   have_xcbob:
+   shmpool = eina_list_remove_list(shmpool, xl);
+   xcbob->w = w;
+   xcbob->h = h;
+   xcbob->bpl = lbytes;
+   xcbob->image->width = xcbob->w;
+   xcbob->image->height = xcbob->h;
+   xcbob->image->stride = xcbob->bpl;
+   shmsize -= xcbob->psize * (xcbob->image->depth / 8);
+   return xcbob;
+}
+
+static void
+_unfind_xcbob(Xcb_Output_Buffer *xcbob, int sync)
+{
+//   evas_software_xcb_x_output_buffer_free(xcbob, sync); return;
+   if (xcbob->shm_info)
+     {
+       shmpool = eina_list_prepend(shmpool, xcbob);
+       shmsize += xcbob->psize * xcbob->image->depth / 8;
+       while ((shmsize > (shmmemlimit)) ||
+              (eina_list_count(shmpool) > shmcountlimit))
+         {
+            Eina_List *xl;
+
+            xl = eina_list_last(shmpool);
+            if (!xl)
+              {
+                 shmsize = 0;
+                 break;
+              }
+            xcbob = xl->data;
+            shmpool = eina_list_remove_list(shmpool, xl);
+            evas_software_xcb_x_output_buffer_free(xcbob, sync);
+         }
+     }
+   else
+     evas_software_xcb_x_output_buffer_free(xcbob, sync);
+}
+
+static void
+_clear_xcbob(int sync)
+{
+   while (shmpool)
+     {
+       Xcb_Output_Buffer *xcbob;
+
+       xcbob = shmpool->data;
+       shmpool = eina_list_remove_list(shmpool, shmpool);
+       evas_software_xcb_x_output_buffer_free(xcbob, sync);
+     }
+   shmsize = 0;
+}
+
+void
+evas_software_xcb_outbuf_init(void)
+{
+}
+
+void
+evas_software_xcb_outbuf_free(Outbuf * buf)
+{
+   while (buf->priv.pending_writes)
+     {
+       RGBA_Image *im;
+       Outbuf_Region *obr;
+
+       im = buf->priv.pending_writes->data;
+       buf->priv.pending_writes = eina_list_remove_list(buf->priv.pending_writes, buf->priv.pending_writes);
+       obr = im->extended_info;
+       evas_cache_image_drop(&im->cache_entry);
+       if (obr->xcbob) _unfind_xcbob(obr->xcbob, 0);
+       if (obr->mxcbob) _unfind_xcbob(obr->mxcbob, 0);
+       free(obr);
+     }
+   evas_software_xcb_outbuf_idle_flush(buf);
+   evas_software_xcb_outbuf_flush(buf);
+   if (buf->priv.x11.xcb.gc)
+      xcb_free_gc(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.gc);
+   if (buf->priv.x11.xcb.gcm)
+      xcb_free_gc(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.gcm);
+   if (buf->priv.pal)
+     evas_software_xcb_x_color_deallocate(buf->priv.x11.xcb.conn,
+                                         buf->priv.x11.xcb.cmap,
+                                         buf->priv.x11.xcb.vis,
+                                         buf->priv.pal);
+   free(buf);
+   _clear_xcbob(0);
+}
+
+void
+evas_software_xcb_outbuf_rotation_set(Outbuf *buf, int rot)
+{
+   buf->rot = rot;
+}
+
+Outbuf *
+evas_software_xcb_outbuf_setup_x(int               w,
+                                int               h,
+                                int               rot,
+                                Outbuf_Depth      depth,
+                                xcb_connection_t *conn,
+                                 xcb_screen_t     *screen,
+                                xcb_drawable_t    draw,
+                                xcb_visualtype_t *vis,
+                                xcb_colormap_t    cmap,
+                                int               x_depth,
+                                int               grayscale,
+                                int               max_colors,
+                                xcb_drawable_t    mask,
+                                int               shape_dither,
+                                int               destination_alpha)
+{
+   Outbuf *buf;
+
+   buf = calloc(1, sizeof(Outbuf));
+   if (!buf)
+      return NULL;
+
+   buf->w = w;
+   buf->h = h;
+   buf->depth = depth;
+   buf->rot = rot;
+
+   buf->priv.x11.xcb.conn = conn;
+   buf->priv.x11.xcb.screen = screen;
+   buf->priv.x11.xcb.vis = vis;
+   buf->priv.x11.xcb.cmap = cmap;
+   buf->priv.x11.xcb.depth = x_depth;
+
+   buf->priv.mask_dither = shape_dither;
+   buf->priv.destination_alpha = destination_alpha;
+
+   {
+      Gfx_Func_Convert    conv_func;
+      Xcb_Output_Buffer  *xcbob;
+
+      buf->priv.x11.xcb.shm = evas_software_xcb_x_can_do_shm(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.screen);
+      xcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x11.xcb.conn,
+                                                   buf->priv.x11.xcb.depth,
+                                                   1, 1,
+                                                   buf->priv.x11.xcb.shm, NULL);
+
+      conv_func = NULL;
+      if (xcbob)
+       {
+#ifdef WORDS_BIGENDIAN
+          if (evas_software_xcb_x_output_buffer_byte_order(xcbob) == XCB_IMAGE_ORDER_LSB_FIRST)
+            buf->priv.x11.xcb.swap = 1;
+          if (evas_software_xcb_x_output_buffer_bit_order(xcbob) == XCB_IMAGE_ORDER_MSB_FIRST)
+            buf->priv.x11.xcb.bit_swap = 1;
+#else
+          if (evas_software_xcb_x_output_buffer_byte_order(xcbob) == XCB_IMAGE_ORDER_MSB_FIRST)
+            buf->priv.x11.xcb.swap = 1;
+          if (evas_software_xcb_x_output_buffer_bit_order(xcbob) == XCB_IMAGE_ORDER_MSB_FIRST)
+            buf->priv.x11.xcb.bit_swap = 1;
+#endif
+          if (((vis->_class == XCB_VISUAL_CLASS_TRUE_COLOR) ||
+                (vis->_class == XCB_VISUAL_CLASS_DIRECT_COLOR)) &&
+               (x_depth > 8))
+
+            {
+               buf->priv.mask.r = (DATA32) vis->red_mask;
+               buf->priv.mask.g = (DATA32) vis->green_mask;
+               buf->priv.mask.b = (DATA32) vis->blue_mask;
+               if (buf->priv.x11.xcb.swap)
+                 {
+                    SWAP32(buf->priv.mask.r);
+                    SWAP32(buf->priv.mask.g);
+                    SWAP32(buf->priv.mask.b);
+                 }
+            }
+          else if ((vis->_class == XCB_VISUAL_CLASS_STATIC_GRAY)  ||
+                   (vis->_class == XCB_VISUAL_CLASS_GRAY_SCALE)   ||
+                   (vis->_class == XCB_VISUAL_CLASS_STATIC_COLOR) ||
+                   (vis->_class == XCB_VISUAL_CLASS_PSEUDO_COLOR) ||
+                    (x_depth <= 8))
+            {
+               Convert_Pal_Mode pm = PAL_MODE_RGB332;
+
+               if ((vis->_class == XCB_VISUAL_CLASS_GRAY_SCALE) ||
+                    (vis->_class == XCB_VISUAL_CLASS_STATIC_GRAY))
+                  grayscale = 1;
+               if (grayscale)
+                 {
+                    if (max_colors >= 256)
+                       pm = PAL_MODE_GRAY256;
+                    else if (max_colors >= 64)
+                       pm = PAL_MODE_GRAY64;
+                    else if (max_colors >= 16)
+                       pm = PAL_MODE_GRAY16;
+                    else if (max_colors >= 4)
+                       pm = PAL_MODE_GRAY4;
+                    else
+                       pm = PAL_MODE_MONO;
+                 }
+               else
+                 {
+                    if (max_colors >= 256)
+                       pm = PAL_MODE_RGB332;
+                    else if (max_colors >= 216)
+                       pm = PAL_MODE_RGB666;
+                    else if (max_colors >= 128)
+                       pm = PAL_MODE_RGB232;
+                    else if (max_colors >= 64)
+                       pm = PAL_MODE_RGB222;
+                    else if (max_colors >= 32)
+                       pm = PAL_MODE_RGB221;
+                    else if (max_colors >= 16)
+                       pm = PAL_MODE_RGB121;
+                    else if (max_colors >= 8)
+                       pm = PAL_MODE_RGB111;
+                    else if (max_colors >= 4)
+                       pm = PAL_MODE_GRAY4;
+                    else
+                       pm = PAL_MODE_MONO;
+                 }
+                /* FIXME: only alloc once per display+cmap */
+               buf->priv.pal =
+                  evas_software_xcb_x_color_allocate(conn,
+                                                     cmap,
+                                                     vis,
+                                                     pm);
+               if (!buf->priv.pal)
+                 {
+                    free(buf);
+                    return NULL;
+                 }
+            }
+          if (buf->priv.pal)
+            {
+               if (buf->rot == 0 || buf->rot == 180)
+                  conv_func = evas_common_convert_func_get(0,
+                                                           buf->w,
+                                                           buf->h,
+                                                           evas_software_xcb_x_output_buffer_depth (xcbob),
+                                                           buf->priv.mask.r,
+                                                           buf->priv.mask.g,
+                                                           buf->priv.mask.b,
+                                                           buf->priv.pal->colors,
+                                                           buf->rot);
+               else if (buf->rot == 90 || buf->rot == 270)
+                  conv_func = evas_common_convert_func_get(0,
+                                                           buf->h,
+                                                           buf->w,
+                                                           evas_software_xcb_x_output_buffer_depth (xcbob),
+                                                           buf->priv.mask.r,
+                                                           buf->priv.mask.g,
+                                                           buf->priv.mask.b,
+                                                           buf->priv.pal->colors,
+                                                           buf->rot);
+            }
+          else
+            {
+               if (buf->rot == 0 || buf->rot == 180)
+                  conv_func = evas_common_convert_func_get(0,
+                                                           buf->w,
+                                                           buf->h,
+                                                           evas_software_xcb_x_output_buffer_depth(xcbob),
+                                                           buf->priv.mask.r,
+                                                           buf->priv.mask.g,
+                                                           buf->priv.mask.b,
+                                                           PAL_MODE_NONE,
+                                                           buf->rot);
+               else if (buf->rot == 90 || buf->rot == 270)
+                  conv_func = evas_common_convert_func_get(0,
+                                                           buf->h,
+                                                           buf->w,
+                                                           evas_software_xcb_x_output_buffer_depth(xcbob),
+                                                           buf->priv.mask.r,
+                                                           buf->priv.mask.g,
+                                                           buf->priv.mask.b,
+                                                           PAL_MODE_NONE,
+                                                           buf->rot);
+            }
+          evas_software_xcb_x_output_buffer_free(xcbob, 1);
+          if (!conv_func)
+            {
+               ERR("XCB Engine"
+                      " {"
+                      "  At depth         %i:"
+                      "  RGB format mask: %08x, %08x, %08x"
+                      "  Palette mode:    %i"
+                      "  Not supported by and compiled in converters!"
+                      " }",
+                      buf->priv.x11.xcb.depth,
+                      buf->priv.mask.r,
+                      buf->priv.mask.g,
+                      buf->priv.mask.b,
+                      buf->priv.pal ? buf->priv.pal->colors : -1);
+            }
+       }
+      evas_software_xcb_outbuf_drawable_set(buf, draw);
+      evas_software_xcb_outbuf_mask_set(buf, mask);
+   }
+
+   return buf;
+}
+
+RGBA_Image *
+evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf,
+                                              int     x,
+                                              int     y,
+                                              int     w,
+                                              int     h,
+                                              int    *cx,
+                                              int    *cy,
+                                              int    *cw,
+                                              int    *ch)
+{
+   RGBA_Image    *im;
+   Outbuf_Region *obr;
+   int            bpl = 0;
+   int            use_shm = 1;
+   int            alpha;
+
+   if ((buf->onebuf) && (buf->priv.x11.xcb.shm))
+     {
+       Eina_Rectangle *rect;
+
+       RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, buf->w, buf->h);
+       rect = eina_rectangle_new(x, y, w, h);
+       if (!rect) return NULL;
+
+       buf->priv.onebuf_regions = eina_list_append(buf->priv.onebuf_regions, rect);
+       if (buf->priv.onebuf)
+         {
+            *cx = x;
+            *cy = y;
+            *cw = w;
+            *ch = h;
+            if (!buf->priv.synced)
+              {
+                  /* we sync */
+                  free(xcb_get_input_focus_reply(buf->priv.x11.xcb.conn, xcb_get_input_focus_unchecked(buf->priv.x11.xcb.conn), NULL));
+                 buf->priv.synced = 1;
+              }
+            return buf->priv.onebuf;
+         }
+       obr = calloc(1, sizeof(Outbuf_Region));
+       obr->x = 0;
+       obr->y = 0;
+       obr->w = buf->w;
+       obr->h = buf->h;
+       *cx = x;
+       *cy = y;
+       *cw = w;
+       *ch = h;
+
+        alpha = ((buf->priv.x11.xcb.mask) || (buf->priv.destination_alpha));
+
+       use_shm = buf->priv.x11.xcb.shm;
+       if ((buf->rot == 0) &&
+           (buf->priv.mask.r == 0xff0000) &&
+           (buf->priv.mask.g == 0x00ff00) &&
+           (buf->priv.mask.b == 0x0000ff))
+         {
+            obr->xcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x11.xcb.conn,
+                                                                buf->priv.x11.xcb.depth,
+                                                                buf->w, buf->h,
+                                                                use_shm,
+                                                                NULL);
+             im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(),
+                                                       buf->w, buf->h,
+                                                       (DATA32 *)evas_software_xcb_x_output_buffer_data(obr->xcbob, &bpl),
+                                                       alpha, EVAS_COLORSPACE_ARGB8888);
+            im->extended_info = obr;
+            if (buf->priv.x11.xcb.mask)
+              obr->mxcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x11.xcb.conn,
+                                                                   1,
+                                                                   buf->w, buf->h,
+                                                                   use_shm,
+                                                                   NULL);
+         }
+       else
+         {
+            im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get());
+             im->cache_entry.flags.alpha |= alpha ? 1 : 0;
+             evas_cache_image_surface_alloc(&im->cache_entry, buf->w, buf->h);
+            im->extended_info = obr;
+            if ((buf->rot == 0) || (buf->rot == 180))
+               {
+                  obr->xcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x11.xcb.conn,
+                                                                     buf->priv.x11.xcb.depth,
+                                                                     buf->w, buf->h,
+                                                                     use_shm,
+                                                                     NULL);
+                  if (buf->priv.x11.xcb.mask)
+                    obr->mxcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x11.xcb.conn,
+                                                                        1,
+                                                                        buf->w, buf->h,
+                                                                        use_shm,
+                                                                        NULL);
+               }
+            else if ((buf->rot == 90) || (buf->rot == 270))
+               {
+                  obr->xcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x11.xcb.conn,
+                                                                     buf->priv.x11.xcb.depth,
+                                                                     buf->h, buf->w,
+                                                                     use_shm,
+                                                                     NULL);
+                  if (buf->priv.x11.xcb.mask)
+                    obr->mxcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x11.xcb.conn,
+                                                                        1,
+                                                                        buf->h, buf->w,
+                                                                        use_shm,
+                                                                        NULL);
+               }
+         }
+       /* FIXME: We should be able to remove this memset, but somewhere in the process
+          we copy too much to the destination surface and some area are not cleaned before copy. */
+       if (alpha)
+          /* FIXME: faster memset! */
+          memset(im->image.data, 0, w * h * sizeof(DATA32));
+
+       buf->priv.onebuf = im;
+       return im;
+     }
+
+
+   obr = calloc(1, sizeof(Outbuf_Region));
+   obr->x = x;
+   obr->y = y;
+   obr->w = w;
+   obr->h = h;
+   *cx = 0;
+   *cy = 0;
+   *cw = w;
+   *ch = h;
+
+   use_shm = buf->priv.x11.xcb.shm;
+   /* FIXME: magic - i found if shm regions are smaller than 200x200 its
+    * faster to use ximages over unix sockets - trial and error
+    */
+//   use_shm = 0; /* 630 -> 1006 fps */
+//   if ((w * h) < (200 * 200)) use_shm = 0; /* 630 -> 962 fps */
+
+   alpha = ((buf->priv.x11.xcb.mask) || (buf->priv.destination_alpha));
+
+   if ((buf->rot == 0) &&
+       (buf->priv.mask.r == 0xff0000) &&
+       (buf->priv.mask.g == 0x00ff00) &&
+       (buf->priv.mask.b == 0x0000ff))
+     {
+       obr->xcbob = _find_xcbob(buf->priv.x11.xcb.conn,
+                                 buf->priv.x11.xcb.depth,
+                                 w, h,
+                                 use_shm,
+                                 NULL);
+        im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(),
+                                                  w, h,
+                                                  (DATA32 *) evas_software_xcb_x_output_buffer_data(obr->xcbob, &bpl),
+                                                  alpha, EVAS_COLORSPACE_ARGB8888);
+       im->extended_info = obr;
+       if (buf->priv.x11.xcb.mask)
+         obr->mxcbob = _find_xcbob(buf->priv.x11.xcb.conn,
+                                    1,
+                                    w, h,
+                                    use_shm,
+                                    NULL);
+/*       obr->mxcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x11.xcb.conn, */
+/*                                                           1, */
+/*                                                           w, */
+/*                                                           h, */
+/*                                                           use_shm, */
+/*                                                           NULL); */
+     }
+   else
+     {
+        im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get());
+        im->cache_entry.flags.alpha |= alpha ? 1 : 0;
+        evas_cache_image_surface_alloc(&im->cache_entry, w, h);
+       im->extended_info = obr;
+       if ((buf->rot == 0) || (buf->rot == 180))
+          {
+             obr->xcbob = _find_xcbob(buf->priv.x11.xcb.conn,
+                                      buf->priv.x11.xcb.depth,
+                                      w, h,
+                                      use_shm,
+                                      NULL);
+             if (buf->priv.x11.xcb.mask)
+               obr->mxcbob = _find_xcbob(buf->priv.x11.xcb.conn,
+                                         1,
+                                         w, h,
+                                         use_shm,
+                                         NULL);
+          }
+/*        obr->xcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x11.xcb.conn, */
+/*                                                           buf->priv.x11.xcb.depth, */
+/*                                                           w, */
+/*                                                           h, */
+/*                                                           use_shm, */
+/*                                                           NULL); */
+       else if ((buf->rot == 90) || (buf->rot == 270))
+          {
+             obr->xcbob = _find_xcbob(buf->priv.x11.xcb.conn,
+                                      buf->priv.x11.xcb.depth,
+                                      h, w,
+                                      use_shm,
+                                      NULL);
+             if (buf->priv.x11.xcb.mask)
+               obr->mxcbob = _find_xcbob(buf->priv.x11.xcb.conn,
+                                         1,
+                                         h, w,
+                                         use_shm,
+                                         NULL);
+          }
+/*       obr->xcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x11.xcb.conn, */
+/*                                                          buf->priv.x11.xcb.depth, */
+/*                                                          h, */
+/*                                                          w, */
+/*                                                          use_shm, */
+/*                                                          NULL); */
+/*
+       if (buf->priv.x11.xcb.mask)
+         obr->mxcbob = _find_xcbob(buf->priv.x11.xcb.conn,
+                                    1, w, h,
+                                    use_shm,
+                                    NULL);
+*/
+/*       obr->mxcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x11.xcb.conn, */
+/*                                                           1, */
+/*                                                           w, */
+/*                                                           h, */
+/*                                                           use_shm, */
+/*                                                           NULL); */
+     }
+   /* FIXME: We should be able to remove this memset, but somewhere in the process
+      we copy too much to the destination surface and some area are not cleaned before copy. */
+   if ((buf->priv.x11.xcb.mask) || (buf->priv.destination_alpha))
+       /* FIXME: faster memset! */
+     memset(im->image.data, 0, w * h * sizeof(DATA32));
+
+   buf->priv.pending_writes = eina_list_append(buf->priv.pending_writes, im);
+   return im;
+}
+
+void
+evas_software_xcb_outbuf_free_region_for_update(Outbuf     *buf __UNUSED__,
+                                               RGBA_Image *update __UNUSED__)
+{
+   /* no need to do anything - they are cleaned up on flush */
+}
+
+void
+evas_software_xcb_outbuf_flush(Outbuf *buf)
+{
+   Eina_List           *l;
+   RGBA_Image *im;
+   Outbuf_Region      *obr;
+
+
+   if ((buf->priv.onebuf) && (buf->priv.onebuf_regions))
+     {
+       pixman_region16_t tmpr;
+
+       im = buf->priv.onebuf;
+       obr = im->extended_info;
+        pixman_region_init(&tmpr);
+       while (buf->priv.onebuf_regions)
+         {
+            Eina_Rectangle *rect;
+
+            rect = buf->priv.onebuf_regions->data;
+            buf->priv.onebuf_regions = eina_list_remove_list(buf->priv.onebuf_regions, buf->priv.onebuf_regions);
+             pixman_region_union_rect(&tmpr, &tmpr,
+                                      rect->x, rect->y,
+                                      rect->w, rect->h);
+            if (buf->priv.debug)
+              evas_software_xcb_outbuf_debug_show(buf, buf->priv.x11.xcb.win,
+                                                  rect->x, rect->y, rect->w, rect->h);
+            eina_rectangle_free(rect);
+         }
+        xcb_set_clip_rectangles(buf->priv.x11.xcb.conn, XCB_CLIP_ORDERING_YX_BANDED,
+                                buf->priv.x11.xcb.gc,
+                                0, 0, pixman_region_n_rects(&tmpr),
+                                (const xcb_rectangle_t *)pixman_region_rectangles(&tmpr, NULL));
+       evas_software_xcb_x_output_buffer_paste(obr->xcbob, buf->priv.x11.xcb.win,
+                                               buf->priv.x11.xcb.gc,
+                                               0, 0, 0);
+       if (obr->mxcbob)
+         {
+             xcb_set_clip_rectangles(buf->priv.x11.xcb.conn, XCB_CLIP_ORDERING_YX_BANDED,
+                                     buf->priv.x11.xcb.gcm,
+                                     0, 0, pixman_region_n_rects(&tmpr),
+                                     (const xcb_rectangle_t *)pixman_region_rectangles(&tmpr, NULL));
+            evas_software_xcb_x_output_buffer_paste(obr->mxcbob,
+                                                    buf->priv.x11.xcb.mask,
+                                                    buf->priv.x11.xcb.gcm,
+                                                    0, 0, 0);
+         }
+       buf->priv.synced = 0;
+     }
+   else
+     {
+#if 1
+       /* we sync */
+        free(xcb_get_input_focus_reply(buf->priv.x11.xcb.conn, xcb_get_input_focus_unchecked(buf->priv.x11.xcb.conn), NULL));
+       EINA_LIST_FOREACH(buf->priv.pending_writes, l, im)
+          {
+             obr = im->extended_info;
+             if (buf->priv.debug)
+               evas_software_xcb_outbuf_debug_show(buf,
+                                                   buf->priv.x11.xcb.win,
+                                                   obr->x,
+                                                   obr->y,
+                                                   obr->w,
+                                                   obr->h);
+             evas_software_xcb_x_output_buffer_paste(obr->xcbob,
+                                                     buf->priv.x11.xcb.win,
+                                                     buf->priv.x11.xcb.gc,
+                                                     obr->x,
+                                                     obr->y, 0);
+             if (obr->mxcbob)
+               evas_software_xcb_x_output_buffer_paste(obr->mxcbob,
+                                                       buf->priv.x11.xcb.mask,
+                                                       buf->priv.x11.xcb.gcm,
+                                                       obr->x,
+                                                       obr->y, 0);
+          }
+        while (buf->priv.pending_writes)
+          {
+             im = buf->priv.pending_writes->data;
+             buf->priv.pending_writes = eina_list_remove_list(buf->priv.pending_writes,
+                                                              buf->priv.pending_writes);
+             obr = im->extended_info;
+            evas_cache_image_drop(&im->cache_entry);
+            if (obr->xcbob) _unfind_xcbob(obr->xcbob, 0);
+            if (obr->mxcbob) _unfind_xcbob(obr->mxcbob, 0);
+/*              if (obr->xcbob) evas_software_xcb_x_output_buffer_free(obr->xcbob, 0); */
+/*              if (obr->mxcbob) evas_software_xcb_x_output_buffer_free(obr->mxcbob, 0); */
+             free(obr);
+          }
+       buf->priv.prev_pending_writes = buf->priv.pending_writes;
+       buf->priv.pending_writes = NULL;
+       xcb_flush(buf->priv.x11.xcb.conn);
+#else
+       /* XX async push - disable */
+       /*
+       EINA_LIST_FOREACH(buf->priv.pending_writes, l, im)
+         {
+            obr = im->extended_info;
+            if (buf->priv.debug)
+              evas_software_x11_outbuf_debug_show(buf, buf->priv.x11.xcb.win,
+                                                  obr->x, obr->y, obr->w, obr->h);
+            evas_software_x11_x_output_buffer_paste(obr->xcbob, buf->priv.x11.xcb.win,
+                                                    buf->priv.x11.xcb.gc,
+                                                    obr->x, obr->y, 0);
+            if (obr->mxcbob)
+              evas_software_x11_x_output_buffer_paste(obr->mxcbob,
+                                                      buf->priv.x11.xcb.mask,
+                                                      buf->priv.x11.xcb.gcm,
+                                                      obr->x, obr->y, 0);
+         }
+        */
+       /* we sync */
+        free(xcb_get_input_focus_reply(buf->priv.x11.xcb.conn, xcb_get_input_focus_unchecked(buf->priv.x11.xcb.conn), NULL));
+
+       while (buf->priv.pending_writes)
+         {
+            im = eina_list_data_get(buf->priv.pending_writes);
+            buf->priv.pending_writes = eina_list_remove_list(buf->priv.pending_writes, buf->priv.pending_writes);
+            obr = im->extended_info;
+            evas_cache_image_drop(&im->cache_entry);
+            if (obr->xcbob) _unfind_xcbob(obr->xcbob, 0);
+            if (obr->mxcbob) _unfind_xcbob(obr->mxcbob, 0);
+/*
+            if (obr->xcbob) evas_software_x11_x_output_buffer_free(obr->xcbob, 0);
+            if (obr->mxcbob) evas_software_x11_x_output_buffer_free(obr->mxcbob, 0);
+ */
+            free(obr);
+            evas_cache_image_drop(&im->cache_entry);
+         }
+#endif
+     }
+   evas_common_cpu_end_opt();
+}
+
+void
+evas_software_xcb_outbuf_idle_flush(Outbuf *buf)
+{
+   if (buf->priv.onebuf)
+     {
+        RGBA_Image *im;
+       Outbuf_Region *obr;
+
+       im = buf->priv.onebuf;
+       buf->priv.onebuf = NULL;
+       obr = im->extended_info;
+       if (obr->xcbob) evas_software_xcb_x_output_buffer_free(obr->xcbob, 0);
+       if (obr->mxcbob) evas_software_xcb_x_output_buffer_free(obr->mxcbob, 0);
+       free(obr);
+       evas_cache_image_drop(&im->cache_entry);
+     }
+   else
+     {
+       if (buf->priv.prev_pending_writes)
+          free(xcb_get_input_focus_reply(buf->priv.x11.xcb.conn, xcb_get_input_focus_unchecked(buf->priv.x11.xcb.conn), NULL));
+       while (buf->priv.prev_pending_writes)
+         {
+            RGBA_Image *im;
+            Outbuf_Region *obr;
+
+            im = buf->priv.prev_pending_writes->data;
+            buf->priv.prev_pending_writes =
+              eina_list_remove_list(buf->priv.prev_pending_writes,
+                                    buf->priv.prev_pending_writes);
+            obr = im->extended_info;
+            evas_cache_image_drop(&im->cache_entry);
+            if (obr->xcbob) _unfind_xcbob(obr->xcbob, 0);
+            if (obr->mxcbob) _unfind_xcbob(obr->mxcbob, 0);
+            free(obr);
+         }
+       _clear_xcbob(0);
+     }
+}
+
+void
+evas_software_xcb_outbuf_push_updated_region(Outbuf     *buf,
+                                            RGBA_Image *update,
+                                            int         x,
+                                            int         y,
+                                            int         w,
+                                            int         h)
+{
+   Gfx_Func_Convert conv_func = NULL;
+   Outbuf_Region   *obr;
+   DATA32          *src_data;
+   void            *data;
+   int              bpl = 0;
+   int              yy;
+
+   obr = update->extended_info;
+   if (buf->priv.pal)
+     {
+       if ((buf->rot == 0) || (buf->rot == 180))
+         conv_func = evas_common_convert_func_get(0, w, h,
+                                                  evas_software_xcb_x_output_buffer_depth
+                                                  (obr->xcbob), buf->priv.mask.r,
+                                                  buf->priv.mask.g, buf->priv.mask.b,
+                                                  buf->priv.pal->colors, buf->rot);
+       else if ((buf->rot == 90) || (buf->rot == 270))
+         conv_func = evas_common_convert_func_get(0, h, w,
+                                                  evas_software_xcb_x_output_buffer_depth
+                                                  (obr->xcbob), buf->priv.mask.r,
+                                                  buf->priv.mask.g, buf->priv.mask.b,
+                                                  buf->priv.pal->colors, buf->rot);
+     }
+   else
+     {
+       if ((buf->rot == 0) || (buf->rot == 180))
+         conv_func = evas_common_convert_func_get(0, w, h,
+                                                  evas_software_xcb_x_output_buffer_depth
+                                                  (obr->xcbob), buf->priv.mask.r,
+                                                  buf->priv.mask.g, buf->priv.mask.b,
+                                                  PAL_MODE_NONE, buf->rot);
+       else if ((buf->rot == 90) || (buf->rot == 270))
+         conv_func = evas_common_convert_func_get(0, h, w,
+                                                  evas_software_xcb_x_output_buffer_depth
+                                                  (obr->xcbob), buf->priv.mask.r,
+                                                  buf->priv.mask.g, buf->priv.mask.b,
+                                                  PAL_MODE_NONE, buf->rot);
+     }
+   if (!conv_func) return;
+
+   data = evas_software_xcb_x_output_buffer_data(obr->xcbob, &bpl);
+   src_data = update->image.data;
+   if (buf->rot == 0)
+     {
+       obr->x = x;
+       obr->y = y;
+     }
+   else if (buf->rot == 90)
+     {
+       obr->x = y;
+       obr->y = buf->w - x - w;
+     }
+   else if (buf->rot == 180)
+     {
+       obr->x = buf->w - x - w;
+       obr->y = buf->h - y - h;
+     }
+   else if (buf->rot == 270)
+     {
+       obr->x = buf->h - y - h;
+       obr->y = x;
+     }
+   if ((buf->rot == 0) || (buf->rot == 180))
+     {
+       obr->w = w;
+       obr->h = h;
+     }
+   else if ((buf->rot == 90) || (buf->rot == 270))
+     {
+       obr->w = h;
+       obr->h = w;
+     }
+   if (buf->priv.pal)
+     {
+       if (data != src_data)
+         conv_func(src_data, data,
+                   0,
+                   bpl /
+                   ((evas_software_xcb_x_output_buffer_depth(obr->xcbob) / 8)) - obr->w,
+                    obr->w, obr->h, x, y,
+                   buf->priv.pal->lookup);
+     }
+   else
+     {
+       if (data != src_data)
+         conv_func(src_data, data,
+                   0,
+                   bpl /
+                   ((evas_software_xcb_x_output_buffer_depth(obr->xcbob) / 8)) - obr->w,
+                    obr->w, obr->h, x, y, NULL);
+     }
+#if 1
+#else
+   /* XX async push */
+   if (!((buf->priv.onebuf) && (buf->priv.onebuf_regions)))
+     {
+       if (buf->priv.debug)
+         evas_software_xcb_outbuf_debug_show(buf, buf->priv.x11.xcb.win,
+                                             obr->x, obr->y, obr->w, obr->h);
+       evas_software_xcb_x_output_buffer_paste(obr->xcbob, buf->priv.x11.xcb.win,
+                                               buf->priv.x11.xcb.gc,
+                                               obr->x, obr->y, 0);
+     }
+#endif
+   if (obr->mxcbob)
+     {
+        if (buf->rot == 0)
+          {
+             for (yy = 0; yy < obr->h; yy++)
+               evas_software_xcb_x_write_mask_line(buf, obr->mxcbob,
+                                                   src_data + (yy * obr->w),
+                                                   obr->w,
+                                                   yy);
+          }
+        else if (buf->rot == 90)
+          {
+             for (yy = 0; yy < obr->h; yy++)
+               evas_software_xcb_x_write_mask_line_vert(buf, obr->mxcbob,
+                                                        src_data + yy, 
+                                                        h,  // h
+                                                        obr->h - yy - 1, // ym
+                                                        w); // w
+          }
+        else if (buf->rot == 180)
+          {
+             for (yy = 0; yy < obr->h; yy++)
+               {
+                  evas_software_xcb_x_write_mask_line_rev(buf, obr->mxcbob,
+                                                          src_data + (yy * obr->w), 
+                                                          obr->w,
+                                                          obr->h - yy - 1);
+               }
+          }
+        else if (buf->rot == 270)
+          {
+             for (yy = 0; yy < obr->h; yy++)
+               evas_software_xcb_x_write_mask_line_vert_rev(buf, obr->mxcbob,
+                                                            src_data + yy,
+                                                            h,  // h
+                                                            yy, // ym
+                                                            w); // w
+          }
+#if 1
+#else
+       /* XX async push */
+       if (!((buf->priv.onebuf) && (buf->priv.onebuf_regions)))
+         evas_software_xcb_x_output_buffer_paste(obr->mxcbob,
+                                                 buf->priv.x11.xcb.mask,
+                                                 buf->priv.x11.xcb.gcm,
+                                                 obr->x, obr->y, 0);
+#endif
+     }
+#if 1
+#else
+   xcb_flush(buf->priv.x11.xcb.conn);
+#endif
+}
+
+void
+evas_software_xcb_outbuf_reconfigure(Outbuf      *buf,
+                                    int          w,
+                                    int          h,
+                                    int          rot,
+                                    Outbuf_Depth depth)
+{
+   if ((w == buf->w) &&
+       (h == buf->h) &&
+       (rot == buf->rot) &&
+       (depth == buf->depth)) return;
+   buf->w = w;
+   buf->h = h;
+   buf->rot = rot;
+   evas_software_xcb_outbuf_idle_flush(buf);
+}
+
+int
+evas_software_xcb_outbuf_get_width(Outbuf * buf)
+{
+   return buf->w;
+}
+
+int
+evas_software_xcb_outbuf_get_height(Outbuf * buf)
+{
+   return buf->h;
+}
+
+Outbuf_Depth
+evas_software_xcb_outbuf_get_depth(Outbuf * buf)
+{
+   return buf->depth;
+}
+
+int
+evas_software_xcb_outbuf_get_rot(Outbuf * buf)
+{
+   return buf->rot;
+}
+
+void
+evas_software_xcb_outbuf_drawable_set(Outbuf        *buf,
+                                     xcb_drawable_t draw)
+{
+   if (buf->priv.x11.xcb.win == draw) return;
+   if (buf->priv.x11.xcb.gc)
+     {
+       xcb_free_gc(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.gc);
+       buf->priv.x11.xcb.gc = 0;
+     }
+   buf->priv.x11.xcb.win = draw;
+   buf->priv.x11.xcb.gc = xcb_generate_id(buf->priv.x11.xcb.conn);
+   xcb_create_gc(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.gc, buf->priv.x11.xcb.win, 0, NULL);
+}
+
+void
+evas_software_xcb_outbuf_mask_set(Outbuf        *buf,
+                                 xcb_drawable_t mask)
+{
+   if (buf->priv.x11.xcb.mask == mask) return;
+   if (buf->priv.x11.xcb.gcm)
+     {
+       xcb_free_gc(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.gcm);
+       buf->priv.x11.xcb.gcm = 0;
+     }
+   buf->priv.x11.xcb.mask = mask;
+   if (buf->priv.x11.xcb.mask)
+      {
+        buf->priv.x11.xcb.gcm = xcb_generate_id(buf->priv.x11.xcb.conn);
+        xcb_create_gc(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.gcm, buf->priv.x11.xcb.win, 0, NULL);
+      }
+}
+
+void
+evas_software_xcb_outbuf_debug_set(Outbuf *buf,
+                                  int     debug)
+{
+   buf->priv.debug = debug;
+}
+void
+evas_software_xcb_outbuf_debug_show(Outbuf        *buf,
+                                   xcb_drawable_t draw,
+                                   int            x,
+                                   int            y,
+                                   int            w,
+                                   int            h)
+{
+   int                          i;
+   xcb_screen_t                *screen = NULL;
+
+   {
+      xcb_get_geometry_reply_t *geom;
+      xcb_drawable_t            root;
+      xcb_screen_iterator_t     i;
+
+      geom = xcb_get_geometry_reply (buf->priv.x11.xcb.conn, xcb_get_geometry_unchecked(buf->priv.x11.xcb.conn, draw), 0);
+      root = geom->root;
+      free (geom);
+      geom = xcb_get_geometry_reply (buf->priv.x11.xcb.conn, xcb_get_geometry_unchecked(buf->priv.x11.xcb.conn, root), 0);
+
+      i = xcb_setup_roots_iterator((xcb_setup_t *)xcb_get_setup(buf->priv.x11.xcb.conn));
+      for (; i.rem; xcb_screen_next(&i))
+        if (i.data->root == geom->root)
+           {
+              screen = i.data;
+              break;
+           }
+      free (geom);
+   }
+   for (i = 0; i < 20; i++)
+     {
+/*     xcb_image_t    *image; */
+       xcb_rectangle_t rect = { x, y, w, h};
+       uint32_t        mask;
+       uint32_t        value[2];
+
+       mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
+       value[0] = screen->black_pixel;
+       value[1] = XCB_EXPOSURES_NOT_ALLOWED; /* no graphics exposures allowed */
+       xcb_change_gc(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.gc, mask, value);
+       xcb_poly_fill_rectangle (buf->priv.x11.xcb.conn, draw, buf->priv.x11.xcb.gc, 1, &rect);
+        /* we sync */
+        free(xcb_get_input_focus_reply(buf->priv.x11.xcb.conn, xcb_get_input_focus_unchecked(buf->priv.x11.xcb.conn), NULL));
+//     image = xcb_image_get(buf->priv.x11.xcb.conn, draw, x, y, w, h, XCB_ALL_PLANES, XCB_IMAGE_FORMAT_Z_PIXMAP);
+//     if (image)
+//        xcb_image_destroy(image);
+        /* we sync */
+        free(xcb_get_input_focus_reply(buf->priv.x11.xcb.conn, xcb_get_input_focus_unchecked(buf->priv.x11.xcb.conn), NULL));
+       mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
+       value[0] = screen->white_pixel;
+       value[1] = XCB_EXPOSURES_NOT_ALLOWED; /* no graphics exposures allowed */
+       xcb_change_gc(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.gc, mask, value);
+       xcb_poly_fill_rectangle (buf->priv.x11.xcb.conn, draw, buf->priv.x11.xcb.gc, 1, &rect);
+        /* we sync */
+        free(xcb_get_input_focus_reply(buf->priv.x11.xcb.conn, xcb_get_input_focus_unchecked(buf->priv.x11.xcb.conn), NULL));
+//     image = xcb_image_get(buf->priv.x11.xcb.conn, draw, x, y, w, h, XCB_ALL_PLANES, XCB_IMAGE_FORMAT_Z_PIXMAP);
+//     if (image)
+//        xcb_image_destroy(image);
+        /* we sync */
+        free(xcb_get_input_focus_reply(buf->priv.x11.xcb.conn, xcb_get_input_focus_unchecked(buf->priv.x11.xcb.conn), NULL));
+     }
+}
+
+Eina_Bool
+evas_software_xcb_outbuf_alpha_get (Outbuf *buf)
+{
+   return buf->priv.x11.xcb.mask;
+}
diff --git a/src/modules/engines/software_x11/evas_xcb_outbuf.h b/src/modules/engines/software_x11/evas_xcb_outbuf.h
new file mode 100644 (file)
index 0000000..7a4f087
--- /dev/null
@@ -0,0 +1,89 @@
+#ifndef EVAS_XCB_OUTBUF_H
+#define EVAS_XCB_OUTBUF_H
+
+
+#include "evas_engine.h"
+
+
+void         evas_software_xcb_outbuf_init (void);
+
+void         evas_software_xcb_outbuf_free (Outbuf *buf);
+
+Outbuf      *evas_software_xcb_outbuf_setup_x (int               w,
+                                               int               h,
+                                               int               rot,
+                                               Outbuf_Depth      depth,
+                                               xcb_connection_t *conn,
+                                               xcb_screen_t     *screen,
+                                               xcb_drawable_t    draw,
+                                               xcb_visualtype_t *vis,
+                                               xcb_colormap_t    cmap,
+                                               int               x_depth,
+                                               int               grayscale,
+                                               int               max_colors,
+                                               xcb_drawable_t    mask,
+                                               int               shape_dither,
+                                               int               destination_alpha);
+
+
+RGBA_Image  *evas_software_xcb_outbuf_new_region_for_update (Outbuf *buf,
+                                                             int     x,
+                                                             int     y,
+                                                             int     w,
+                                                             int     h,
+                                                             int    *cx,
+                                                             int    *cy,
+                                                             int    *cw,
+                                                             int    *ch);
+
+void         evas_software_xcb_outbuf_free_region_for_update (Outbuf     *buf,
+                                                              RGBA_Image *update);
+
+void         evas_software_xcb_outbuf_flush (Outbuf *buf);
+
+void         evas_software_xcb_outbuf_idle_flush (Outbuf *buf);
+
+void         evas_software_xcb_outbuf_push_updated_region (Outbuf     *buf,
+                                                           RGBA_Image *update,
+                                                           int         x,
+                                                           int         y,
+                                                           int         w,
+                                                           int         h);
+
+void         evas_software_xcb_outbuf_reconfigure (Outbuf      *buf,
+                                                   int          w,
+                                                   int          h,
+                                                   int          rot,
+                                                   Outbuf_Depth depth);
+
+int          evas_software_xcb_outbuf_get_width (Outbuf *buf);
+
+int          evas_software_xcb_outbuf_get_height (Outbuf *buf);
+
+Outbuf_Depth evas_software_xcb_outbuf_get_depth (Outbuf *buf);
+
+int          evas_software_xcb_outbuf_get_rot (Outbuf *buf);
+
+void         evas_software_xcb_outbuf_drawable_set (Outbuf  *buf,
+                                                    xcb_drawable_t draw);
+
+void         evas_software_xcb_outbuf_mask_set (Outbuf *buf,
+                                                xcb_drawable_t mask);
+
+void         evas_software_xcb_outbuf_rotation_set (Outbuf *buf,
+                                                    int     rot);
+
+void         evas_software_xcb_outbuf_debug_set (Outbuf *buf,
+                                                 int     debug);
+
+void         evas_software_xcb_outbuf_debug_show (Outbuf  *buf,
+                                                  xcb_drawable_t draw,
+                                                  int      x,
+                                                  int      y,
+                                                  int      w,
+                                                  int      h);
+
+Eina_Bool   evas_software_xcb_outbuf_alpha_get (Outbuf *buf);
+
+
+#endif
diff --git a/src/modules/engines/software_x11/evas_xlib_buffer.c b/src/modules/engines/software_x11/evas_xlib_buffer.c
new file mode 100644 (file)
index 0000000..a077963
--- /dev/null
@@ -0,0 +1,428 @@
+#include "evas_common.h"
+
+#include "evas_xlib_buffer.h"
+
+static int _x_err = 0;
+
+void
+evas_software_xlib_x_write_mask_line(Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int w, int y)
+{
+   int x;
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int bpl = 0;
+
+   src_ptr = src;
+   dst_ptr = evas_software_xlib_x_output_buffer_data(xob, &bpl);
+   dst_ptr = dst_ptr + (bpl * y);
+   w -= 7;
+   if (buf->priv.x11.xlib.bit_swap)
+     {
+       for (x = 0; x < w; x += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[0])) >> 7) << 7) |
+              ((A_VAL(&(src_ptr[1])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[2])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[3])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[4])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[5])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[6])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[7])) >> 7) << 0);
+            src_ptr += 8;
+            dst_ptr++;
+         }
+     }
+   else
+     {
+       for (x = 0; x < w; x += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[0])) >> 7) << 0) |
+              ((A_VAL(&(src_ptr[1])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[2])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[3])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[4])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[5])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[6])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[7])) >> 7) << 7);
+            src_ptr += 8;
+            dst_ptr++;
+         }
+     }
+   w += 7;
+   for (; x < w; x ++)
+     {
+       XPutPixel(xob->xim, x, y, A_VAL(src_ptr) >> 7);
+       src_ptr++;
+     }
+}
+
+void
+evas_software_xlib_x_write_mask_line_rev(Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int w, int y)
+{
+   int x;
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int bpl = 0;
+
+   src_ptr = src + w - 1;
+   dst_ptr = evas_software_xlib_x_output_buffer_data(xob, &bpl);
+   dst_ptr = dst_ptr + (bpl * y);
+   w -= 7;
+   if (buf->priv.x11.xlib.bit_swap)
+     {
+       for (x = 0; x < w; x += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[ 0])) >> 7) << 7) |
+              ((A_VAL(&(src_ptr[-1])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[-2])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[-3])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[-4])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[-5])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[-6])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[-7])) >> 7) << 0);
+            src_ptr -= 8;
+            dst_ptr++;
+         }
+     }
+   else
+     {
+       for (x = 0; x < w; x += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[ 0])) >> 7) << 0) |
+              ((A_VAL(&(src_ptr[-1])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[-2])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[-3])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[-4])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[-5])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[-6])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[-7])) >> 7) << 7);
+            src_ptr -= 8;
+            dst_ptr++;
+         }
+     }
+   w += 7;
+   for (; x < w; x ++)
+     {
+       XPutPixel(xob->xim, x, y, A_VAL(src_ptr) >> 7);
+       src_ptr--;
+     }
+}
+
+void
+evas_software_xlib_x_write_mask_line_vert(Outbuf *buf, X_Output_Buffer *xob, 
+                                          DATA32 *src, 
+                                          int h, int ym, int w)
+{
+   int y;
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int bpl = 0;
+
+   src_ptr = src;
+   dst_ptr = evas_software_xlib_x_output_buffer_data(xob, &bpl);
+   dst_ptr = dst_ptr + (bpl * ym);
+   h -= 7;
+   if (buf->priv.x11.xlib.bit_swap)
+     {
+       for (y = 0; y < h; y += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[0 * w])) >> 7) << 7) |
+              ((A_VAL(&(src_ptr[1 * w])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[2 * w])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[3 * w])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[4 * w])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[5 * w])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[6 * w])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[7 * w])) >> 7) << 0);
+            src_ptr += 8 * w;
+            dst_ptr++;
+         }
+     }
+   else
+     {
+       for (y = 0; y < h; y += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[0 * w])) >> 7) << 0) |
+              ((A_VAL(&(src_ptr[1 * w])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[2 * w])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[3 * w])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[4 * w])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[5 * w])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[6 * w])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[7 * w])) >> 7) << 7);
+            src_ptr += 8 * w;
+            dst_ptr++;
+         }
+     }
+   h += 7;
+   for (; y < h; y ++)
+     {
+       XPutPixel(xob->xim, y, ym, A_VAL(src_ptr) >> 7);
+       src_ptr += w;
+     }
+}
+
+void
+evas_software_xlib_x_write_mask_line_vert_rev(Outbuf *buf, X_Output_Buffer *xob, 
+                                              DATA32 *src, 
+                                              int h, int ym, int w)
+{
+   int y;
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int bpl = 0;
+
+   src_ptr = src + ((h - 1) * w);
+   dst_ptr = evas_software_xlib_x_output_buffer_data(xob, &bpl);
+   dst_ptr = dst_ptr + (bpl * ym);
+   h -= 7;
+   if (buf->priv.x11.xlib.bit_swap)
+     {
+       for (y = 0; y < h; y += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[ 0 * w])) >> 7) << 7) |
+              ((A_VAL(&(src_ptr[-1 * w])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[-2 * w])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[-3 * w])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[-4 * w])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[-5 * w])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[-6 * w])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[-7 * w])) >> 7) << 0);
+            src_ptr -= 8 * w;
+            dst_ptr++;
+         }
+     }
+   else
+     {
+       for (y = 0; y < h; y += 8)
+         {
+            *dst_ptr =
+              ((A_VAL(&(src_ptr[ 0 * w])) >> 7) << 0) |
+              ((A_VAL(&(src_ptr[-1 * w])) >> 7) << 1) |
+              ((A_VAL(&(src_ptr[-2 * w])) >> 7) << 2) |
+              ((A_VAL(&(src_ptr[-3 * w])) >> 7) << 3) |
+              ((A_VAL(&(src_ptr[-4 * w])) >> 7) << 4) |
+              ((A_VAL(&(src_ptr[-5 * w])) >> 7) << 5) |
+              ((A_VAL(&(src_ptr[-6 * w])) >> 7) << 6) |
+              ((A_VAL(&(src_ptr[-7 * w])) >> 7) << 7);
+            src_ptr -= 8 * w;
+            dst_ptr++;
+         }
+     }
+   h += 7;
+   for (; y < h; y ++)
+     {
+       XPutPixel(xob->xim, y, ym, A_VAL(src_ptr) >> 7);
+       src_ptr -= w;
+     }
+}
+
+int
+evas_software_xlib_x_can_do_shm(Display *d)
+{
+   static Display *cached_d = NULL;
+   static int cached_result = 0;
+   
+   if (d == cached_d) return cached_result;
+   cached_d = d;
+   if (XShmQueryExtension(d))
+     {
+       X_Output_Buffer *xob;
+
+       xob = evas_software_xlib_x_output_buffer_new
+         (d, DefaultVisual(d, DefaultScreen(d)),
+          DefaultDepth(d, DefaultScreen(d)), 16, 16, 2, NULL);
+       if (!xob)
+         {
+            cached_result = 0;
+            return 0;
+         }
+       evas_software_xlib_x_output_buffer_free(xob, 1);
+       cached_result = 1;
+       return 1;
+     }
+   cached_result = 0;
+   return 0;
+}
+
+static void
+x_output_tmp_x_err(Display *d __UNUSED__, XErrorEvent *ev __UNUSED__)
+{
+   _x_err = 1;
+   return;
+}
+
+//static int creates = 0;
+
+X_Output_Buffer *
+evas_software_xlib_x_output_buffer_new(Display *d, Visual *v, int depth, int w, int h, int try_shm, void *data)
+{
+   X_Output_Buffer *xob;
+
+   xob = calloc(1, sizeof(X_Output_Buffer));
+   if (!xob) return NULL;
+
+   xob->display = d;
+   xob->visual = v;
+   xob->xim = NULL;
+   xob->shm_info = NULL;
+   xob->w = w;
+   xob->h = h;
+
+   if (try_shm > 0)
+     {
+       xob->shm_info = malloc(sizeof(XShmSegmentInfo));
+       if (xob->shm_info)
+         {
+            xob->xim = XShmCreateImage(d, v, depth, ZPixmap, NULL,
+                                       xob->shm_info, w, h);
+            if (xob->xim)
+              {
+                 xob->shm_info->shmid = shmget(IPC_PRIVATE,
+                                               xob->xim->bytes_per_line *
+                                               xob->xim->height,
+                                               IPC_CREAT | 0777);
+                 if (xob->shm_info->shmid >= 0)
+                   {
+                      xob->shm_info->readOnly = False;
+                      xob->shm_info->shmaddr = xob->xim->data =
+                        shmat(xob->shm_info->shmid, 0, 0);
+                      if (xob->shm_info->shmaddr != NULL)
+                        {
+                           XErrorHandler ph;
+                            
+                            if (try_shm == 2) // only needed during testing
+                              {
+                                 XSync(d, False);
+                                 _x_err = 0;
+                                 ph = XSetErrorHandler((XErrorHandler)
+                                                       x_output_tmp_x_err);
+                              }
+                           XShmAttach(d, xob->shm_info);
+                            if (try_shm == 2) // only needed during testing
+                              {
+                                 XSync(d, False); 
+                                 XSetErrorHandler((XErrorHandler)ph);
+                              }
+                            if (!_x_err)
+                              {
+//                              printf("SHM++ ID=%i -> %i bytes [%i creates]\n",
+//                                     xob->shm_info->shmid,
+//                                     xob->xim->bytes_per_line * xob->xim->height,
+//                                     creates);
+//                              creates++;
+                                xob->bpl = xob->xim->bytes_per_line;
+                                xob->psize = xob->bpl * xob->h;
+                                return xob;
+                             }
+                        }
+                      shmdt(xob->shm_info->shmaddr);
+                      shmctl(xob->shm_info->shmid, IPC_RMID, 0);
+                   }
+                 if (xob->xim) XDestroyImage(xob->xim);
+                 xob->xim = NULL;
+              }
+            if (xob->shm_info) free(xob->shm_info);
+            xob->shm_info = NULL;
+         }
+     }
+
+   if (try_shm > 1) return NULL;
+
+   xob->xim = XCreateImage(d, v, depth, ZPixmap, 0, data, w, h, 32, 0);
+   if (!xob->xim)
+     {
+       free(xob);
+       return NULL;
+     }
+
+   xob->data = data;
+
+   if (!xob->xim->data)
+     {
+       xob->xim->data = malloc(xob->xim->bytes_per_line * xob->xim->height);
+       if (!xob->xim->data)
+         {
+            XDestroyImage(xob->xim);
+            free(xob);
+            return NULL;
+         }
+     }
+   xob->bpl = xob->xim->bytes_per_line;
+   xob->psize = xob->bpl * xob->h;
+   return xob;
+}
+
+void
+evas_software_xlib_x_output_buffer_free(X_Output_Buffer *xob, int sync)
+{
+   if (xob->shm_info)
+     {
+//     printf("SHM-- ID=%i -> %i bytes, [sync=%i]\n",
+//            xob->shm_info->shmid,
+//            xob->xim->bytes_per_line * xob->xim->height,
+//            sync);
+       if (sync) XSync(xob->display, False);
+       XShmDetach(xob->display, xob->shm_info);
+       XDestroyImage(xob->xim);
+       shmdt(xob->shm_info->shmaddr);
+       shmctl(xob->shm_info->shmid, IPC_RMID, 0);
+       free(xob->shm_info);
+     }
+   else
+     {
+       if (xob->data) xob->xim->data = NULL;
+       XDestroyImage(xob->xim);
+     }
+   free(xob);
+}
+
+void
+evas_software_xlib_x_output_buffer_paste(X_Output_Buffer *xob, Drawable d, GC gc, int x, int y, int sync)
+{
+   if (xob->shm_info)
+     {
+//     printf("shm\n");
+       XShmPutImage(xob->display, d, gc, xob->xim, 0, 0, x, y,
+                    xob->w, xob->h, False);
+       if (sync) XSync(xob->display, False);
+     }
+   else
+     {
+//     printf("NO! shm\n");
+       XPutImage(xob->display, d, gc, xob->xim, 0, 0, x, y,
+                 xob->w, xob->h);
+     }
+}
+
+DATA8 *
+evas_software_xlib_x_output_buffer_data(X_Output_Buffer *xob, int *bytes_per_line_ret)
+{
+   if (bytes_per_line_ret) *bytes_per_line_ret = xob->xim->bytes_per_line;
+   return (DATA8 *)xob->xim->data;
+}
+
+int
+evas_software_xlib_x_output_buffer_depth(X_Output_Buffer *xob)
+{
+   return xob->xim->bits_per_pixel;
+}
+
+int
+evas_software_xlib_x_output_buffer_byte_order(X_Output_Buffer *xob)
+{
+   return xob->xim->byte_order;
+}
+
+int
+evas_software_xlib_x_output_buffer_bit_order(X_Output_Buffer *xob)
+{
+   return xob->xim->bitmap_bit_order;
+}
diff --git a/src/modules/engines/software_x11/evas_xlib_buffer.h b/src/modules/engines/software_x11/evas_xlib_buffer.h
new file mode 100644 (file)
index 0000000..01c4db0
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef EVAS_XLIB_BUFFER_H
+#define EVAS_XLIB_BUFFER_H
+
+
+#include "evas_engine.h"
+
+
+typedef struct _X_Output_Buffer X_Output_Buffer;
+
+struct _X_Output_Buffer
+{
+   Display         *display;
+   XImage          *xim;
+   XShmSegmentInfo *shm_info;
+   Visual          *visual;
+   void            *data;
+   int              w;
+   int              h;
+   int              bpl;
+   int              psize;
+};
+
+void evas_software_xlib_x_write_mask_line               (Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int w, int y);
+void evas_software_xlib_x_write_mask_line_rev           (Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int w, int y);
+void evas_software_xlib_x_write_mask_line_vert          (Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int h, int ym, int w);
+void evas_software_xlib_x_write_mask_line_vert_rev      (Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int h, int ym, int w);
+
+int evas_software_xlib_x_can_do_shm                     (Display *d);
+
+X_Output_Buffer *evas_software_xlib_x_output_buffer_new (Display *d, Visual *v, int depth, int w, int h, int try_shm, void *data);
+
+void evas_software_xlib_x_output_buffer_free            (X_Output_Buffer *xob, int sync);
+
+void evas_software_xlib_x_output_buffer_paste           (X_Output_Buffer *xob, Drawable d, GC gc, int x, int y, int sync);
+
+DATA8 *evas_software_xlib_x_output_buffer_data          (X_Output_Buffer *xob, int *bytes_per_line_ret);
+
+int evas_software_xlib_x_output_buffer_depth            (X_Output_Buffer *xob);
+
+int evas_software_xlib_x_output_buffer_byte_order       (X_Output_Buffer *xob);
+
+int evas_software_xlib_x_output_buffer_bit_order        (X_Output_Buffer *xob);
+
+
+#endif
diff --git a/src/modules/engines/software_x11/evas_xlib_color.c b/src/modules/engines/software_x11/evas_xlib_color.c
new file mode 100644 (file)
index 0000000..1df0406
--- /dev/null
@@ -0,0 +1,368 @@
+#include "evas_common.h"
+
+#include "evas_engine.h"
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+typedef struct _Convert_Pal_Priv Convert_Pal_Priv;
+
+struct _Convert_Pal_Priv
+{
+   Display *disp;
+   Colormap cmap;
+   Visual  *vis;
+};
+
+typedef DATA8 * (*X_Func_Alloc_Colors) (Display *d, Colormap cmap, Visual *v);
+
+static X_Func_Alloc_Colors x_color_alloc[PAL_MODE_LAST + 1];
+static int                 x_color_count[PAL_MODE_LAST + 1];
+static Eina_List          *palettes = NULL;
+
+static DATA8 * x_color_alloc_rgb(int nr, int ng, int nb, Display *d, Colormap cmap, Visual *v);
+static DATA8 * x_color_alloc_gray(int ng, Display *d, Colormap cmap, Visual *v);
+
+static DATA8 * x_color_alloc_rgb_332(Display *d, Colormap cmap, Visual *v);
+static DATA8 * x_color_alloc_rgb_666(Display *d, Colormap cmap, Visual *v);
+static DATA8 * x_color_alloc_rgb_232(Display *d, Colormap cmap, Visual *v);
+static DATA8 * x_color_alloc_rgb_222(Display *d, Colormap cmap, Visual *v);
+static DATA8 * x_color_alloc_rgb_221(Display *d, Colormap cmap, Visual *v);
+static DATA8 * x_color_alloc_rgb_121(Display *d, Colormap cmap, Visual *v);
+static DATA8 * x_color_alloc_rgb_111(Display *d, Colormap cmap, Visual *v);
+static DATA8 * x_color_alloc_gray_256(Display *d, Colormap cmap, Visual *v);
+static DATA8 * x_color_alloc_gray_64(Display *d, Colormap cmap, Visual *v);
+static DATA8 * x_color_alloc_gray_16(Display *d, Colormap cmap, Visual *v);
+static DATA8 * x_color_alloc_gray_4(Display *d, Colormap cmap, Visual *v);
+static DATA8 * x_color_alloc_mono(Display *d, Colormap cmap, Visual *v);
+
+static DATA8 *
+x_color_alloc_rgb(int nr, int ng, int nb, Display *d, Colormap cmap, Visual *v)
+{
+   int r, g, b, i;
+   DATA8 *color_lut;
+   int sig_mask = 0, delt = 0;
+
+   for (i = 0; i < v->bits_per_rgb; i++) sig_mask |= (0x1 << i);
+   sig_mask <<= (16 - v->bits_per_rgb);
+   i = 0;
+   color_lut = malloc((nr) * (ng) * (nb));
+   if (!color_lut) return NULL;
+   delt = 0x0101 * 3;
+   for (r = 0; r < (nr); r++)
+     {
+       for (g = 0; g < (ng); g++)
+         {
+            for (b = 0; b < (nb); b++)
+              {
+                 XColor xcl;
+                 XColor xcl_in;
+                 int val;
+                 Status ret;
+                 int dr, dg, db;
+
+                  val = (int)((((double)r) / ((nr) - 1)) * 255);
+                 val = (val << 8) | val;
+                 xcl.red = (unsigned short)(val);
+                 val = (int)((((double)g) / ((ng) - 1)) * 255);
+                 val = (val << 8) | val;
+                 xcl.green = (unsigned short)(val);
+                 val = (int)((((double)b) / ((nb) - 1)) * 255);
+                 val = (val << 8) | val;
+                 xcl.blue = (unsigned short)(val);
+                 xcl_in = xcl;
+                 ret = XAllocColor(d, cmap, &xcl);
+                 dr = (int)xcl_in.red - (int)xcl.red;
+                 if (dr < 0) dr = -dr;
+                 dg = (int)xcl_in.green - (int)xcl.green;
+                 if (dg < 0) dg = -dg;
+                 db = (int)xcl_in.blue - (int)xcl.blue;
+                 if (db < 0) db = -db;
+/*
+                 printf("ASK [%i]: %04x %04x %04x = %04x %04x %04x | dif = %04x / %04x\n",
+                        ret,
+                        xcl_in.red, xcl_in.green, xcl_in.blue,
+                        xcl.red, xcl.green, xcl.blue,
+                        (dr + dg +db), delt);
+ */
+                 if ((ret == 0) ||
+                     ((dr + dg + db) > delt)
+/*
+                     ||
+                     ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
+                     ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
+                     ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask))
+ */
+                     )
+                   {
+                      unsigned long pixels[256];
+                      int j;
+
+                      if (i > 0)
+                        {
+                           for (j = 0; j < i; j++)
+                             pixels[j] = (unsigned long) color_lut[j];
+                           XFreeColors(d, cmap, pixels, i, 0);
+                        }
+                      free(color_lut);
+                      return NULL;
+                   }
+                 color_lut[i] = xcl.pixel;
+                 i++;
+              }
+         }
+     }
+   return color_lut;
+}
+
+static DATA8 *
+x_color_alloc_gray(int ng, Display *d, Colormap cmap, Visual *v)
+{
+   int g, i;
+   DATA8 *color_lut;
+   int sig_mask = 0;
+
+   for (i = 0; i < v->bits_per_rgb; i++) sig_mask |= (0x1 << i);
+   sig_mask <<= (16 - v->bits_per_rgb);
+   i = 0;
+   color_lut = malloc(ng);
+   if (!color_lut) return NULL;
+   for (g = 0; g < (ng); g++)
+     {
+       XColor xcl;
+       XColor xcl_in;
+       int val;
+       Status ret;
+
+       val = (int)((((double)g) / ((ng) - 1)) * 255);
+       val = (val << 8) | val;
+       xcl.red = (unsigned short)(val);
+       xcl.green = (unsigned short)(val);
+       xcl.blue = (unsigned short)(val);
+       xcl_in = xcl;
+       ret = XAllocColor(d, cmap, &xcl);
+       if ((ret == 0) ||
+           ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
+           ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
+           ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
+         {
+            unsigned long pixels[256];
+            int j;
+
+            if (i > 0)
+              {
+                 for (j = 0; j < i; j++)
+                   pixels[j] = (unsigned long) color_lut[j];
+                 XFreeColors(d, cmap, pixels, i, 0);
+              }
+            free(color_lut);
+            return NULL;
+         }
+       color_lut[i] = xcl.pixel;
+       i++;
+     }
+   return color_lut;
+}
+
+static DATA8 *
+x_color_alloc_rgb_332(Display *d, Colormap cmap, Visual *v)
+{
+   return x_color_alloc_rgb(8, 8, 4, d, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_rgb_666(Display *d, Colormap cmap, Visual *v)
+{
+   return x_color_alloc_rgb(6, 6, 6, d, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_rgb_232(Display *d, Colormap cmap, Visual *v)
+{
+   return x_color_alloc_rgb(4, 8, 4, d, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_rgb_222(Display *d, Colormap cmap, Visual *v)
+{
+   return x_color_alloc_rgb(4, 4, 4, d, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_rgb_221(Display *d, Colormap cmap, Visual *v)
+{
+   return x_color_alloc_rgb(4, 4, 2, d, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_rgb_121(Display *d, Colormap cmap, Visual *v)
+{
+   return x_color_alloc_rgb(2, 4, 2, d, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_rgb_111(Display *d, Colormap cmap, Visual *v)
+{
+   return x_color_alloc_rgb(2, 2, 2, d, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_gray_256(Display *d, Colormap cmap, Visual *v)
+{
+   return x_color_alloc_gray(256, d, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_gray_64(Display *d, Colormap cmap, Visual *v)
+{
+   return x_color_alloc_gray(64, d, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_gray_16(Display *d, Colormap cmap, Visual *v)
+{
+   return x_color_alloc_gray(32, d, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_gray_4(Display *d, Colormap cmap, Visual *v)
+{
+   return x_color_alloc_gray(16, d, cmap, v);
+}
+
+static DATA8 *
+x_color_alloc_mono(Display *d, Colormap cmap, Visual *v)
+{
+   return x_color_alloc_gray(2, d, cmap, v);
+}
+
+void
+evas_software_xlib_x_color_init(void)
+{
+   static int initialised = 0;
+
+   if (initialised) return;
+   x_color_alloc[PAL_MODE_NONE]    = NULL;
+   x_color_count[PAL_MODE_NONE]    = 0;
+
+   x_color_alloc[PAL_MODE_MONO]    = x_color_alloc_mono;
+   x_color_count[PAL_MODE_MONO]    = 2;
+
+   x_color_alloc[PAL_MODE_GRAY4]   = x_color_alloc_gray_4;
+   x_color_count[PAL_MODE_GRAY4]   = 4;
+
+   x_color_alloc[PAL_MODE_GRAY16]  = x_color_alloc_gray_16;
+   x_color_count[PAL_MODE_GRAY16]  = 16;
+
+   x_color_alloc[PAL_MODE_GRAY64]  = x_color_alloc_gray_64;
+   x_color_count[PAL_MODE_GRAY64]  = 64;
+
+   x_color_alloc[PAL_MODE_GRAY256] = x_color_alloc_gray_256;
+   x_color_count[PAL_MODE_GRAY256] = 256;
+
+   x_color_alloc[PAL_MODE_RGB111]  = x_color_alloc_rgb_111;
+   x_color_count[PAL_MODE_RGB111]  = 2 * 2 * 2;
+
+   x_color_alloc[PAL_MODE_RGB121]  = x_color_alloc_rgb_121;
+   x_color_count[PAL_MODE_RGB121]  = 2 * 4 * 2;
+
+   x_color_alloc[PAL_MODE_RGB221]  = x_color_alloc_rgb_221;
+   x_color_count[PAL_MODE_RGB221]  = 4 * 4 * 2;
+
+   x_color_alloc[PAL_MODE_RGB222]  = x_color_alloc_rgb_222;
+   x_color_count[PAL_MODE_RGB222]  = 4 * 4 * 4;
+
+   x_color_alloc[PAL_MODE_RGB232]  = x_color_alloc_rgb_232;
+   x_color_count[PAL_MODE_RGB232]  = 4 * 8 * 4;
+
+   x_color_alloc[PAL_MODE_RGB666]  = x_color_alloc_rgb_666;
+   x_color_count[PAL_MODE_RGB666]  = 6 * 6 * 6;
+
+   x_color_alloc[PAL_MODE_RGB332]  = x_color_alloc_rgb_332;
+   x_color_count[PAL_MODE_RGB332]  = 8 * 8 * 4;
+
+   x_color_alloc[PAL_MODE_LAST]    = NULL;
+   x_color_count[PAL_MODE_LAST]    = 0;
+   initialised = 1;
+}
+
+Convert_Pal *
+evas_software_xlib_x_color_allocate(Display         *disp,
+                                    Colormap         cmap,
+                                    Visual          *vis,
+                                    Convert_Pal_Mode colors)
+{
+   Convert_Pal_Priv *palpriv;
+   Convert_Pal      *pal;
+   Convert_Pal_Mode  c;
+   Eina_List        *l;
+
+/*   printf("ALLOC cmap=%i vis=%p\n", cmap, vis);*/
+   EINA_LIST_FOREACH(palettes, l, pal)
+     {
+       palpriv = pal->data;
+       if ((disp == palpriv->disp) &&
+           (vis == palpriv->vis) &&
+           (cmap == palpriv->cmap))
+         {
+            pal->references++;
+            return pal;
+         }
+     }
+   pal = calloc(1, sizeof(struct _Convert_Pal));
+   if (!pal) return NULL;
+   for (c = colors; c > PAL_MODE_NONE; c--)
+     {
+       if (x_color_alloc[c])
+         {
+/*          printf("TRY PAL %i\n", c);*/
+            pal->lookup = (x_color_alloc[c])(disp, cmap, vis);
+            if (pal->lookup) break;
+         }
+     }
+   pal->references = 1;
+   pal->colors = c;
+   pal->count = x_color_count[c];
+   palpriv = calloc(1, sizeof(Convert_Pal_Priv));
+   pal->data = palpriv;
+   if (!palpriv)
+     {
+       if (pal->lookup) free(pal->lookup);
+       free(pal);
+       return NULL;
+     }
+   palpriv->disp = disp;
+   palpriv->vis = vis;
+   palpriv->cmap = cmap;
+   if (pal->colors == PAL_MODE_NONE)
+     {
+       if (pal->lookup) free(pal->lookup);
+       free(pal);
+       return NULL;
+     }
+   palettes = eina_list_append(palettes, pal);
+   return pal;
+}
+
+void
+evas_software_xlib_x_color_deallocate(Display     *disp,
+                                      Colormap     cmap,
+                                      Visual      *vis __UNUSED__,
+                                      Convert_Pal *pal)
+{
+   unsigned long pixels[256];
+   int j;
+
+   pal->references--;
+   if (pal->references > 0) return;
+   if (pal->lookup)
+     {
+       for(j = 0; j < pal->count; j++)
+         pixels[j] = (unsigned long) pal->lookup[j];
+       XFreeColors(disp, cmap, pixels, pal->count, 0);
+       free(pal->lookup);
+     }
+   free(pal->data);
+   palettes = eina_list_remove(palettes, pal);
+   free(pal);
+}
diff --git a/src/modules/engines/software_x11/evas_xlib_color.h b/src/modules/engines/software_x11/evas_xlib_color.h
new file mode 100644 (file)
index 0000000..e9f8afb
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef EVAS_XLIB_COLOR_H
+#define EVAS_XLIB_COLOR_H
+
+void evas_software_xlib_x_color_init (void);
+
+Convert_Pal *evas_software_xlib_x_color_allocate (Display         *disp,
+                                                  Colormap         cmap,
+                                                  Visual          *vis,
+                                                  Convert_Pal_Mode colors);
+
+void evas_software_xlib_x_color_deallocate (Display     *disp,
+                                            Colormap     cmap,
+                                            Visual      *vis,
+                                            Convert_Pal *pal);
+
+#endif
diff --git a/src/modules/engines/software_x11/evas_xlib_main.c b/src/modules/engines/software_x11/evas_xlib_main.c
new file mode 100644 (file)
index 0000000..3c153e1
--- /dev/null
@@ -0,0 +1,7 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+void
+evas_software_xlib_x_init(void)
+{
+}
diff --git a/src/modules/engines/software_x11/evas_xlib_outbuf.c b/src/modules/engines/software_x11/evas_xlib_outbuf.c
new file mode 100644 (file)
index 0000000..6e1ac92
--- /dev/null
@@ -0,0 +1,1038 @@
+#include <sys/time.h>
+#include <sys/utsname.h>
+
+#include "evas_common.h"
+#include "evas_macros.h"
+#include "evas_xlib_outbuf.h"
+#include "evas_xlib_buffer.h"
+#include "evas_xlib_color.h"
+
+
+typedef struct _Outbuf_Region   Outbuf_Region;
+
+struct _Outbuf_Region
+{
+   X_Output_Buffer *xob;
+   X_Output_Buffer *mxob;
+   int              x;
+   int              y;
+   int              w;
+   int              h;
+};
+
+static Eina_List *shmpool = NULL;
+static int shmsize = 0;
+static int shmmemlimit = 10 * 1024 * 1024;
+static int shmcountlimit = 32;
+
+static X_Output_Buffer *
+_find_xob(Display *d, Visual *v, int depth, int w, int h, int shm, void *data)
+{
+   Eina_List *l, *xl = NULL;
+   X_Output_Buffer *xob = NULL;
+   X_Output_Buffer *xob2;
+   int fitness = 0x7fffffff;
+   int sz, lbytes, bpp;
+
+//   return evas_software_xlib_x_output_buffer_new(d, v, depth, w, h, shm, data);
+   if (!shm)
+     return evas_software_xlib_x_output_buffer_new(d, v, depth, w, h, shm, data);
+   if (depth > 1)
+     {
+       bpp = depth / 8;
+       if (bpp == 3) bpp = 4;
+       lbytes = (((w * bpp) + 3) / 4) * 4;
+     }
+   else
+     lbytes = ((w + 31) / 32) * 4;
+   sz = lbytes * h;
+   EINA_LIST_FOREACH(shmpool, l, xob2)
+     {
+       int szdif;
+
+       if ((xob2->xim->depth != depth) || (xob2->visual != v) ||
+           (xob2->display != d))
+         continue;
+       szdif = xob2->psize - sz;
+       if (szdif < 0) continue;
+       if (szdif == 0)
+         {
+            xob = xob2;
+            xl = l;
+            goto have_xob;
+         }
+       if (szdif < fitness)
+         {
+            fitness = szdif;
+            xob = xob2;
+            xl = l;
+         }
+     }
+   if ((fitness > (100 * 100)) || (!xob))
+     return evas_software_xlib_x_output_buffer_new(d, v, depth, w, h, shm, data);
+
+   have_xob:
+   shmpool = eina_list_remove_list(shmpool, xl);
+   xob->w = w;
+   xob->h = h;
+   xob->bpl = lbytes;
+   xob->xim->width = xob->w;
+   xob->xim->height = xob->h;
+   xob->xim->bytes_per_line = xob->bpl;
+   shmsize -= xob->psize * (xob->xim->depth / 8);
+   return xob;
+}
+
+static void
+_unfind_xob(X_Output_Buffer *xob, int sync)
+{
+//   evas_software_xlib_x_output_buffer_free(xob, sync); return;
+   if (xob->shm_info)
+     {
+       shmpool = eina_list_prepend(shmpool, xob);
+       shmsize += xob->psize * xob->xim->depth / 8;
+       while ((shmsize > (shmmemlimit)) ||
+              (eina_list_count(shmpool) > shmcountlimit))
+         {
+            Eina_List *xl;
+
+            xl = eina_list_last(shmpool);
+            if (!xl)
+              {
+                 shmsize = 0;
+                 break;
+              }
+            xob = xl->data;
+            shmpool = eina_list_remove_list(shmpool, xl);
+            evas_software_xlib_x_output_buffer_free(xob, sync);
+         }
+     }
+   else
+     evas_software_xlib_x_output_buffer_free(xob, sync);
+}
+
+static void
+_clear_xob(int sync)
+{
+   while (shmpool)
+     {
+       X_Output_Buffer *xob;
+
+       xob = shmpool->data;
+       shmpool = eina_list_remove_list(shmpool, shmpool);
+       evas_software_xlib_x_output_buffer_free(xob, sync);
+     }
+   shmsize = 0;
+}
+
+void
+evas_software_xlib_outbuf_init(void)
+{
+}
+
+void
+evas_software_xlib_outbuf_free(Outbuf *buf)
+{
+   while (buf->priv.pending_writes)
+     {
+       RGBA_Image *im;
+       Outbuf_Region *obr;
+
+       im = buf->priv.pending_writes->data;
+       buf->priv.pending_writes = eina_list_remove_list(buf->priv.pending_writes, buf->priv.pending_writes);
+       obr = im->extended_info;
+       evas_cache_image_drop(&im->cache_entry);
+       if (obr->xob) _unfind_xob(obr->xob, 0);
+       if (obr->mxob) _unfind_xob(obr->mxob, 0);
+       free(obr);
+     }
+   evas_software_xlib_outbuf_idle_flush(buf);
+   evas_software_xlib_outbuf_flush(buf);
+   if (buf->priv.x11.xlib.gc)
+      XFreeGC(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gc);
+   if (buf->priv.x11.xlib.gcm)
+      XFreeGC(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gcm);
+   if (buf->priv.pal)
+      evas_software_xlib_x_color_deallocate(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.cmap,
+                                          buf->priv.x11.xlib.vis, buf->priv.pal);
+   free(buf);
+   _clear_xob(0);
+}
+
+Outbuf *
+evas_software_xlib_outbuf_setup_x(int w, int h, int rot, Outbuf_Depth depth,
+                                Display *disp, Drawable draw, Visual *vis,
+                                Colormap cmap, int x_depth,
+                                int grayscale, int max_colors, Pixmap mask,
+                                int shape_dither, int destination_alpha)
+{
+   Outbuf             *buf;
+
+   buf = calloc(1, sizeof(Outbuf));
+   if (!buf)
+      return NULL;
+
+   buf->w = w;
+   buf->h = h;
+   buf->depth = depth;
+   buf->rot = rot;
+
+   buf->priv.x11.xlib.disp = disp;
+   buf->priv.x11.xlib.vis = vis;
+   buf->priv.x11.xlib.cmap = cmap;
+   buf->priv.x11.xlib.depth = x_depth;
+
+   buf->priv.mask_dither = shape_dither;
+   buf->priv.destination_alpha = destination_alpha;
+
+   {
+      Gfx_Func_Convert    conv_func;
+      X_Output_Buffer    *xob;
+
+      buf->priv.x11.xlib.shm = evas_software_xlib_x_can_do_shm(buf->priv.x11.xlib.disp);
+      xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
+                                                 buf->priv.x11.xlib.vis,
+                                                 buf->priv.x11.xlib.depth,
+                                                 1, 1, buf->priv.x11.xlib.shm, NULL);
+
+      conv_func = NULL;
+      if (xob)
+       {
+#ifdef WORDS_BIGENDIAN
+          if (evas_software_xlib_x_output_buffer_byte_order(xob) == LSBFirst)
+            buf->priv.x11.xlib.swap = 1;
+          if (evas_software_xlib_x_output_buffer_bit_order(xob) == MSBFirst)
+            buf->priv.x11.xlib.bit_swap = 1;
+#else
+          if (evas_software_xlib_x_output_buffer_byte_order(xob) == MSBFirst)
+            buf->priv.x11.xlib.swap = 1;
+          if (evas_software_xlib_x_output_buffer_bit_order(xob) == MSBFirst)
+            buf->priv.x11.xlib.bit_swap = 1;
+#endif
+          if (((vis->class == TrueColor) || (vis->class == DirectColor)) &&
+              (x_depth > 8))
+            {
+               buf->priv.mask.r = (DATA32) vis->red_mask;
+               buf->priv.mask.g = (DATA32) vis->green_mask;
+               buf->priv.mask.b = (DATA32) vis->blue_mask;
+               if (buf->priv.x11.xlib.swap)
+                 {
+                    SWAP32(buf->priv.mask.r);
+                    SWAP32(buf->priv.mask.g);
+                    SWAP32(buf->priv.mask.b);
+                 }
+            }
+          else if ((vis->class == PseudoColor) ||
+                   (vis->class == StaticColor) ||
+                   (vis->class == GrayScale) ||
+                   (vis->class == StaticGray) ||
+                   (x_depth <= 8))
+            {
+               Convert_Pal_Mode    pm = PAL_MODE_RGB332;
+
+               if ((vis->class == GrayScale) || (vis->class == StaticGray))
+                  grayscale = 1;
+               if (grayscale)
+                 {
+                    if (max_colors >= 256)
+                       pm = PAL_MODE_GRAY256;
+                    else if (max_colors >= 64)
+                       pm = PAL_MODE_GRAY64;
+                    else if (max_colors >= 16)
+                       pm = PAL_MODE_GRAY16;
+                    else if (max_colors >= 4)
+                       pm = PAL_MODE_GRAY4;
+                    else
+                       pm = PAL_MODE_MONO;
+                 }
+               else
+                 {
+                    if (max_colors >= 256)
+                       pm = PAL_MODE_RGB332;
+                    else if (max_colors >= 216)
+                       pm = PAL_MODE_RGB666;
+                    else if (max_colors >= 128)
+                       pm = PAL_MODE_RGB232;
+                    else if (max_colors >= 64)
+                       pm = PAL_MODE_RGB222;
+                    else if (max_colors >= 32)
+                       pm = PAL_MODE_RGB221;
+                    else if (max_colors >= 16)
+                       pm = PAL_MODE_RGB121;
+                    else if (max_colors >= 8)
+                       pm = PAL_MODE_RGB111;
+                    else if (max_colors >= 4)
+                       pm = PAL_MODE_GRAY4;
+                    else
+                       pm = PAL_MODE_MONO;
+                 }
+               /* FIXME: only alloc once per display+cmap */
+               buf->priv.pal = evas_software_xlib_x_color_allocate(disp, cmap, vis,
+                                                                   pm);
+               if (!buf->priv.pal)
+                 {
+                    free(buf);
+                    return NULL;
+                 }
+            }
+          if (buf->priv.pal)
+            {
+               if (buf->rot == 0 || buf->rot == 180)
+                 conv_func = evas_common_convert_func_get(0, buf->w, buf->h,
+                                                          evas_software_xlib_x_output_buffer_depth
+                                                          (xob), buf->priv.mask.r,
+                                                          buf->priv.mask.g,
+                                                          buf->priv.mask.b,
+                                                          buf->priv.pal->colors,
+                                                          buf->rot);
+               else if (buf->rot == 90 || buf->rot == 270)
+                 conv_func = evas_common_convert_func_get(0, buf->h, buf->w,
+                                                          evas_software_xlib_x_output_buffer_depth
+                                                          (xob), buf->priv.mask.r,
+                                                          buf->priv.mask.g,
+                                                          buf->priv.mask.b,
+                                                          buf->priv.pal->colors,
+                                                          buf->rot);
+            }
+          else
+            {
+               if (buf->rot == 0 || buf->rot == 180)
+                 conv_func = evas_common_convert_func_get(0, buf->w, buf->h,
+                                                          evas_software_xlib_x_output_buffer_depth
+                                                          (xob), buf->priv.mask.r,
+                                                          buf->priv.mask.g,
+                                               buf->priv.mask.b, PAL_MODE_NONE,
+                                                          buf->rot);
+               else if (buf->rot == 90 || buf->rot == 270)
+                 conv_func = evas_common_convert_func_get(0, buf->h, buf->w,
+                                                          evas_software_xlib_x_output_buffer_depth
+                                                          (xob), buf->priv.mask.r,
+                                                          buf->priv.mask.g,
+                                                          buf->priv.mask.b, PAL_MODE_NONE,
+                                                          buf->rot);
+            }
+          evas_software_xlib_x_output_buffer_free(xob, 1);
+          if (!conv_func)
+            {
+               printf(".[ Evas Error ].\n"
+                      " {\n"
+                      "  At depth         %i:\n"
+                      "  RGB format mask: %08x, %08x, %08x\n"
+                      "  Palette mode:    %i\n"
+                      "  Not supported by compiled in converters!\n"
+                      " }\n",
+                      buf->priv.x11.xlib.depth,
+                      buf->priv.mask.r,
+                      buf->priv.mask.g,
+                      buf->priv.mask.b,
+                      buf->priv.pal ? buf->priv.pal->colors : -1);
+            }
+       }
+      evas_software_xlib_outbuf_drawable_set(buf, draw);
+      evas_software_xlib_outbuf_mask_set(buf, mask);
+   }
+   return buf;
+}
+
+RGBA_Image *
+evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch)
+{
+   RGBA_Image         *im;
+   Outbuf_Region      *obr;
+   int                 bpl = 0;
+   int                 use_shm = 1;
+   int                 alpha;
+
+   if ((buf->onebuf) && (buf->priv.x11.xlib.shm))
+     {
+       Eina_Rectangle *rect;
+
+       RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, buf->w, buf->h);
+       rect = eina_rectangle_new(x, y, w, h);
+       if (!rect) return NULL;
+
+       buf->priv.onebuf_regions = eina_list_append(buf->priv.onebuf_regions, rect);
+       if (buf->priv.onebuf)
+         {
+            *cx = x;
+            *cy = y;
+            *cw = w;
+            *ch = h;
+            if (!buf->priv.synced)
+              {
+                 XSync(buf->priv.x11.xlib.disp, False);
+                 buf->priv.synced = 1;
+              }
+            return buf->priv.onebuf;
+         }
+       obr = calloc(1, sizeof(Outbuf_Region));
+       obr->x = 0;
+       obr->y = 0;
+       obr->w = buf->w;
+       obr->h = buf->h;
+       *cx = x;
+       *cy = y;
+       *cw = w;
+       *ch = h;
+
+        alpha = ((buf->priv.x11.xlib.mask) || (buf->priv.destination_alpha));
+
+       use_shm = buf->priv.x11.xlib.shm;
+       if ((buf->rot == 0) &&
+           (buf->priv.mask.r == 0xff0000) &&
+           (buf->priv.mask.g == 0x00ff00) &&
+           (buf->priv.mask.b == 0x0000ff))
+         {
+            obr->xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
+                                                             buf->priv.x11.xlib.vis,
+                                                             buf->priv.x11.xlib.depth,
+                                                             buf->w, buf->h,
+                                                             use_shm,
+                                                             NULL);
+             im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(),
+                                                       buf->w, buf->h,
+                                                       (DATA32 *) evas_software_xlib_x_output_buffer_data(obr->xob, &bpl),
+                                                       alpha, EVAS_COLORSPACE_ARGB8888);
+            im->extended_info = obr;
+            if (buf->priv.x11.xlib.mask)
+              obr->mxob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
+                                                                buf->priv.x11.xlib.vis,
+                                                                1,
+                                                                buf->w, buf->h,
+                                                                use_shm,
+                                                                NULL);
+         }
+       else
+         {
+            im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get());
+             im->cache_entry.flags.alpha |= alpha ? 1 : 0;
+             evas_cache_image_surface_alloc(&im->cache_entry, buf->w, buf->h);
+            im->extended_info = obr;
+            if ((buf->rot == 0) || (buf->rot == 180))
+               {
+                  obr->xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
+                                                                    buf->priv.x11.xlib.vis,
+                                                                    buf->priv.x11.xlib.depth,
+                                                                    buf->w, buf->h,
+                                                                    use_shm,
+                                                                    NULL);
+                  if (buf->priv.x11.xlib.mask)
+                    obr->mxob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
+                                                                       buf->priv.x11.xlib.vis,
+                                                                       1, buf->w, buf->h,
+                                                                       use_shm,
+                                                                       NULL);
+               }
+            else if ((buf->rot == 90) || (buf->rot == 270))
+               {
+                  obr->xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
+                                                                    buf->priv.x11.xlib.vis,
+                                                                    buf->priv.x11.xlib.depth,
+                                                                    buf->h, buf->w,
+                                                                    use_shm,
+                                                                    NULL);
+                  if (buf->priv.x11.xlib.mask)
+                    obr->mxob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
+                                                                       buf->priv.x11.xlib.vis,
+                                                                       1, buf->h, buf->w,
+                                                                       use_shm,
+                                                                       NULL);
+               }
+         }
+       /* FIXME: We should be able to remove this memset, but somewhere in the process
+          we copy too much to the destination surface and some area are not cleaned before copy. */
+       if (alpha)
+          /* FIXME: faster memset! */
+          memset(im->image.data, 0, w * h * sizeof(DATA32));
+
+        buf->priv.onebuf = im;
+       return im;
+     }
+
+   obr = calloc(1, sizeof(Outbuf_Region));
+   obr->x = x;
+   obr->y = y;
+   obr->w = w;
+   obr->h = h;
+   *cx = 0;
+   *cy = 0;
+   *cw = w;
+   *ch = h;
+
+   use_shm = buf->priv.x11.xlib.shm;
+   /* FIXME: magic - i found if shm regions are smaller than 200x200 its
+    * faster to use ximages over unix sockets - trial and error
+    */
+//   use_shm = 0; /* 630 -> 1006 fps */
+//   if ((w * h) < (200 * 200)) use_shm = 0; /* 630 -> 962 fps */
+
+   alpha = ((buf->priv.x11.xlib.mask) || (buf->priv.destination_alpha));
+
+   if ((buf->rot == 0) &&
+       (buf->priv.mask.r == 0xff0000) &&
+       (buf->priv.mask.g == 0x00ff00) &&
+       (buf->priv.mask.b == 0x0000ff))
+     {
+       obr->xob = _find_xob(buf->priv.x11.xlib.disp,
+                            buf->priv.x11.xlib.vis,
+                            buf->priv.x11.xlib.depth,
+                            w, h,
+                            use_shm,
+                            NULL);
+/*      obr->xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp, */
+/*                                                      buf->priv.x11.xlib.vis, */
+/*                                                      buf->priv.x11.xlib.depth, */
+/*                                                      w, h, */
+/*                                                      use_shm, */
+/*                                                      NULL); */
+        im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(),
+                                                  w, h,
+                                                  (DATA32 *) evas_software_xlib_x_output_buffer_data(obr->xob, &bpl),
+                                                  alpha, EVAS_COLORSPACE_ARGB8888);
+       im->extended_info = obr;
+       if (buf->priv.x11.xlib.mask)
+         obr->mxob = _find_xob(buf->priv.x11.xlib.disp,
+                               buf->priv.x11.xlib.vis,
+                               1, w, h,
+                               use_shm,
+                               NULL);
+/*
+         obr->mxob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
+                                                           buf->priv.x11.xlib.vis,
+                                                           1, w, h,
+                                                           use_shm,
+                                                           NULL);
+ */
+     }
+   else
+     {
+        im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get());
+        im->cache_entry.flags.alpha |= alpha ? 1 : 0;
+        evas_cache_image_surface_alloc(&im->cache_entry, w, h);
+       im->extended_info = obr;
+       if ((buf->rot == 0) || (buf->rot == 180))
+          {
+             obr->xob = _find_xob(buf->priv.x11.xlib.disp,
+                                  buf->priv.x11.xlib.vis,
+                                  buf->priv.x11.xlib.depth,
+                                  w, h,
+                                  use_shm,
+                                  NULL);
+             if (buf->priv.x11.xlib.mask)
+               obr->mxob = _find_xob(buf->priv.x11.xlib.disp,
+                                     buf->priv.x11.xlib.vis,
+                                     1, w, h,
+                                     use_shm,
+                                     NULL);
+          }
+/*
+         obr->xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
+                                                          buf->priv.x11.xlib.vis,
+                                                          buf->priv.x11.xlib.depth,
+                                                          w, h,
+                                                          use_shm,
+                                                          NULL);
+ */
+       else if ((buf->rot == 90) || (buf->rot == 270))
+          {
+             obr->xob = _find_xob(buf->priv.x11.xlib.disp,
+                                  buf->priv.x11.xlib.vis,
+                                  buf->priv.x11.xlib.depth,
+                                  h, w,
+                                  use_shm,
+                                  NULL);
+             if (buf->priv.x11.xlib.mask)
+               obr->mxob = _find_xob(buf->priv.x11.xlib.disp,
+                                     buf->priv.x11.xlib.vis,
+                                     1, h, w,
+                                     use_shm,
+                                     NULL);
+          }
+/*
+         obr->xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
+                                                          buf->priv.x11.xlib.vis,
+                                                          buf->priv.x11.xlib.depth,
+                                                          h, w,
+                                                          use_shm,
+                                                          NULL);
+ */
+/*        
+       if (buf->priv.x11.xlib.mask)
+         obr->mxob = _find_xob(buf->priv.x11.xlib.disp,
+                               buf->priv.x11.xlib.vis,
+                               1, w, h,
+                               use_shm,
+                               NULL);
+ */
+/*
+         obr->mxob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
+                                                           buf->priv.x11.xlib.vis,
+                                                           1, w, h,
+                                                           use_shm,
+                                                           NULL);
+ */
+     }
+   /* FIXME: We should be able to remove this memset, but somewhere in the process
+      we copy too much to the destination surface and some area are not cleaned before copy. */
+   if ((buf->priv.x11.xlib.mask) || (buf->priv.destination_alpha))
+     /* FIXME: faster memset! */
+     memset(im->image.data, 0, w * h * sizeof(DATA32));
+
+   buf->priv.pending_writes = eina_list_append(buf->priv.pending_writes, im);
+   return im;
+}
+
+void
+evas_software_xlib_outbuf_free_region_for_update(Outbuf *buf __UNUSED__, RGBA_Image *update __UNUSED__)
+{
+   /* no need to do anything - they are cleaned up on flush */
+}
+
+void
+evas_software_xlib_outbuf_flush(Outbuf *buf)
+{
+   Eina_List *l;
+   RGBA_Image *im;
+   Outbuf_Region *obr;
+
+   if ((buf->priv.onebuf) && (buf->priv.onebuf_regions))
+     {
+       Region tmpr;
+
+       im = buf->priv.onebuf;
+       obr = im->extended_info;
+       tmpr = XCreateRegion();
+       while (buf->priv.onebuf_regions)
+         {
+            Eina_Rectangle *rect;
+            XRectangle xr;
+
+            rect = buf->priv.onebuf_regions->data;
+            buf->priv.onebuf_regions = eina_list_remove_list(buf->priv.onebuf_regions, buf->priv.onebuf_regions);
+            xr.x = rect->x;
+            xr.y = rect->y;
+            xr.width = rect->w;
+            xr.height = rect->h;
+            XUnionRectWithRegion(&xr, tmpr, tmpr);
+            if (buf->priv.debug)
+              evas_software_xlib_outbuf_debug_show(buf, buf->priv.x11.xlib.win,
+                                                  rect->x, rect->y, rect->w, rect->h);
+            eina_rectangle_free(rect);
+         }
+       XSetRegion(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gc, tmpr);
+       evas_software_xlib_x_output_buffer_paste(obr->xob, buf->priv.x11.xlib.win,
+                                               buf->priv.x11.xlib.gc,
+                                               0, 0, 0);
+       if (obr->mxob)
+         {
+            XSetRegion(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gcm, tmpr);
+            evas_software_xlib_x_output_buffer_paste(obr->mxob,
+                                                    buf->priv.x11.xlib.mask,
+                                                    buf->priv.x11.xlib.gcm,
+                                                    0, 0, 0);
+         }
+       XDestroyRegion(tmpr);
+       buf->priv.synced = 0;
+     }
+   else
+     {
+#if 1
+        XSync(buf->priv.x11.xlib.disp, False);
+       EINA_LIST_FOREACH(buf->priv.pending_writes, l, im)
+         {
+            obr = im->extended_info;
+            if (buf->priv.debug)
+              evas_software_xlib_outbuf_debug_show(buf, buf->priv.x11.xlib.win,
+                                                  obr->x, obr->y, obr->w, obr->h);
+            evas_software_xlib_x_output_buffer_paste(obr->xob, buf->priv.x11.xlib.win,
+                                                    buf->priv.x11.xlib.gc,
+                                                    obr->x, obr->y, 0);
+            if (obr->mxob)
+              evas_software_xlib_x_output_buffer_paste(obr->mxob,
+                                                      buf->priv.x11.xlib.mask,
+                                                      buf->priv.x11.xlib.gcm,
+                                                      obr->x, obr->y, 0);
+         }
+       while (buf->priv.prev_pending_writes)
+         {
+            im = buf->priv.prev_pending_writes->data;
+            buf->priv.prev_pending_writes =
+              eina_list_remove_list(buf->priv.prev_pending_writes,
+                                    buf->priv.prev_pending_writes);
+            obr = im->extended_info;
+            evas_cache_image_drop(&im->cache_entry);
+            if (obr->xob) _unfind_xob(obr->xob, 0);
+            if (obr->mxob) _unfind_xob(obr->mxob, 0);
+/*
+            if (obr->xob) evas_software_xlib_x_output_buffer_free(obr->xob, 0);
+            if (obr->mxob) evas_software_xlib_x_output_buffer_free(obr->mxob, 0);
+ */
+            free(obr);
+         }
+       buf->priv.prev_pending_writes = buf->priv.pending_writes;
+       buf->priv.pending_writes = NULL;
+       XFlush(buf->priv.x11.xlib.disp);
+#else
+       /* XX async push - disable */
+       /*
+        EINA_LIST_FOREACH(buf->priv.pending_writes, l, im)
+         {
+            obr = im->extended_info;
+            if (buf->priv.debug)
+              evas_software_xlib_outbuf_debug_show(buf, buf->priv.x11.xlib.win,
+                                                  obr->x, obr->y, obr->w, obr->h);
+            evas_software_xlib_x_output_buffer_paste(obr->xob, buf->priv.x11.xlib.win,
+                                                    buf->priv.x11.xlib.gc,
+                                                    obr->x, obr->y, 0);
+            if (obr->mxob)
+              evas_software_xlib_x_output_buffer_paste(obr->mxob,
+                                                      buf->priv.x11.xlib.mask,
+                                                      buf->priv.x11.xlib.gcm,
+                                                      obr->x, obr->y, 0);
+         }
+        */
+       XSync(buf->priv.x11.xlib.disp, False);
+
+       while (buf->priv.pending_writes)
+         {
+            RGBA_Image *im;
+            Outbuf_Region *obr;
+
+            im = eina_list_data_get(buf->priv.pending_writes);
+            buf->priv.pending_writes = eina_list_remove_list(buf->priv.pending_writes, buf->priv.pending_writes);
+            obr = im->extended_info;
+            evas_cache_image_drop(&im->cache_entry);
+            if (obr->xob) _unfind_xob(obr->xob, 0);
+            if (obr->mxob) _unfind_xob(obr->mxob, 0);
+/*
+            if (obr->xob) evas_software_xlib_x_output_buffer_free(obr->xob, 0);
+            if (obr->mxob) evas_software_xlib_x_output_buffer_free(obr->mxob, 0);
+ */
+            free(obr);
+            evas_cache_image_drop(&im->cache_entry);
+         }
+#endif
+     }
+   evas_common_cpu_end_opt();
+}
+
+void
+evas_software_xlib_outbuf_idle_flush(Outbuf *buf)
+{
+   if (buf->priv.onebuf)
+     {
+        RGBA_Image *im;
+       Outbuf_Region *obr;
+
+       im = buf->priv.onebuf;
+       buf->priv.onebuf = NULL;
+       obr = im->extended_info;
+       if (obr->xob) evas_software_xlib_x_output_buffer_free(obr->xob, 0);
+       if (obr->mxob) evas_software_xlib_x_output_buffer_free(obr->mxob, 0);
+       free(obr);
+       evas_cache_image_drop(&im->cache_entry);
+     }
+   else
+     {
+       if (buf->priv.prev_pending_writes) XSync(buf->priv.x11.xlib.disp, False);
+       while (buf->priv.prev_pending_writes)
+         {
+            RGBA_Image *im;
+            Outbuf_Region *obr;
+
+            im = buf->priv.prev_pending_writes->data;
+            buf->priv.prev_pending_writes =
+              eina_list_remove_list(buf->priv.prev_pending_writes,
+                                    buf->priv.prev_pending_writes);
+            obr = im->extended_info;
+            evas_cache_image_drop(&im->cache_entry);
+            if (obr->xob) _unfind_xob(obr->xob, 0);
+            if (obr->mxob) _unfind_xob(obr->mxob, 0);
+            free(obr);
+         }
+       _clear_xob(0);
+     }
+}
+
+void
+evas_software_xlib_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h)
+{
+   Gfx_Func_Convert    conv_func = NULL;
+   Outbuf_Region      *obr;
+   DATA32             *src_data;
+   void               *data;
+   int                 bpl = 0, yy;
+
+   obr = update->extended_info;
+   if (buf->priv.pal)
+     {
+       if ((buf->rot == 0) || (buf->rot == 180))
+         conv_func = evas_common_convert_func_get(0, w, h,
+                                                  evas_software_xlib_x_output_buffer_depth
+                                                  (obr->xob), buf->priv.mask.r,
+                                                  buf->priv.mask.g, buf->priv.mask.b,
+                                                  buf->priv.pal->colors, buf->rot);
+       else if ((buf->rot == 90) || (buf->rot == 270))
+         conv_func = evas_common_convert_func_get(0, h, w,
+                                                  evas_software_xlib_x_output_buffer_depth
+                                                  (obr->xob), buf->priv.mask.r,
+                                                  buf->priv.mask.g, buf->priv.mask.b,
+                                                  buf->priv.pal->colors, buf->rot);
+     }
+   else
+     {
+       if ((buf->rot == 0) || (buf->rot == 180))
+         conv_func = evas_common_convert_func_get(0, w, h,
+                                                  evas_software_xlib_x_output_buffer_depth
+                                                  (obr->xob), buf->priv.mask.r,
+                                                  buf->priv.mask.g, buf->priv.mask.b,
+                                                  PAL_MODE_NONE, buf->rot);
+       else if ((buf->rot == 90) || (buf->rot == 270))
+         conv_func = evas_common_convert_func_get(0, h, w,
+                                                  evas_software_xlib_x_output_buffer_depth
+                                                  (obr->xob), buf->priv.mask.r,
+                                                  buf->priv.mask.g, buf->priv.mask.b,
+                                                  PAL_MODE_NONE, buf->rot);
+     }
+   if (!conv_func) return;
+
+   data = evas_software_xlib_x_output_buffer_data(obr->xob, &bpl);
+   src_data = update->image.data;
+   if (buf->rot == 0)
+     {
+       obr->x = x;
+       obr->y = y;
+     }
+   else if (buf->rot == 90)
+     {
+       obr->x = y;
+       obr->y = buf->w - x - w;
+     }
+   else if (buf->rot == 180)
+     {
+       obr->x = buf->w - x - w;
+       obr->y = buf->h - y - h;
+     }
+   else if (buf->rot == 270)
+     {
+       obr->x = buf->h - y - h;
+       obr->y = x;
+     }
+   if ((buf->rot == 0) || (buf->rot == 180))
+     {
+       obr->w = w;
+       obr->h = h;
+     }
+   else if ((buf->rot == 90) || (buf->rot == 270))
+     {
+       obr->w = h;
+       obr->h = w;
+     }
+   if (buf->priv.pal)
+     {
+       if (data != src_data)
+         conv_func(src_data, data,
+                   0,
+                   bpl /
+                   ((evas_software_xlib_x_output_buffer_depth(obr->xob) /
+                     8)) - obr->w, obr->w, obr->h, x, y,
+                   buf->priv.pal->lookup);
+     }
+   else
+     {
+       if (data != src_data)
+         conv_func(src_data, data,
+                   0,
+                   bpl /
+                   ((evas_software_xlib_x_output_buffer_depth(obr->xob) /
+                     8)) - obr->w, obr->w, obr->h, x, y, NULL);
+     }
+#if 1
+#else
+   /* XX async push */
+   if (!((buf->priv.onebuf) && (buf->priv.onebuf_regions)))
+     {
+       if (buf->priv.debug)
+         evas_software_xlib_outbuf_debug_show(buf, buf->priv.x11.xlib.win,
+                                             obr->x, obr->y, obr->w, obr->h);
+       evas_software_xlib_x_output_buffer_paste(obr->xob, buf->priv.x11.xlib.win,
+                                               buf->priv.x11.xlib.gc,
+                                               obr->x, obr->y, 0);
+     }
+#endif
+   if (obr->mxob)
+     {
+        if (buf->rot == 0)
+          {
+             for (yy = 0; yy < obr->h; yy++)
+               evas_software_xlib_x_write_mask_line(buf, obr->mxob,
+                                                    src_data +
+                                                    (yy * obr->w), obr->w, yy);
+          }
+        else if (buf->rot == 90)
+          {
+             for (yy = 0; yy < obr->h; yy++)
+               evas_software_xlib_x_write_mask_line_vert(buf, obr->mxob,
+                                                         src_data + yy, 
+                                                         h,  // h
+                                                         obr->h - yy - 1, // ym
+                                                         w); // w
+          }
+        else if (buf->rot == 180)
+          {
+             for (yy = 0; yy < obr->h; yy++)
+               {
+                  evas_software_xlib_x_write_mask_line_rev(buf, obr->mxob,
+                                                           src_data +
+                                                           (yy * obr->w), 
+                                                           obr->w, obr->h - yy - 1);
+               }
+          }
+        else if (buf->rot == 270)
+          {
+             for (yy = 0; yy < obr->h; yy++)
+               evas_software_xlib_x_write_mask_line_vert_rev(buf, obr->mxob,
+                                                             src_data + yy,
+                                                             h,  // h
+                                                             yy, // ym
+                                                             w); // w
+          }
+#if 1
+#else
+       /* XX async push */
+       if (!((buf->priv.onebuf) && (buf->priv.onebuf_regions)))
+         evas_software_xlib_x_output_buffer_paste(obr->mxob,
+                                                 buf->priv.x11.xlib.mask,
+                                                 buf->priv.x11.xlib.gcm,
+                                                 obr->x, obr->y, 0);
+#endif
+     }
+#if 1
+#else
+   XFlush(buf->priv.x11.xlib.disp);
+#endif
+}
+
+void
+evas_software_xlib_outbuf_reconfigure(Outbuf * buf, int w, int h, int rot,
+                                    Outbuf_Depth depth)
+{
+   if ((w == buf->w) &&
+       (h == buf->h) &&
+       (rot == buf->rot) &&
+       (depth == buf->depth)) return;
+   buf->w = w;
+   buf->h = h;
+   buf->rot = rot;
+   evas_software_xlib_outbuf_idle_flush(buf);
+}
+
+int
+evas_software_xlib_outbuf_get_width(Outbuf * buf)
+{
+   return buf->w;
+}
+
+int
+evas_software_xlib_outbuf_get_height(Outbuf * buf)
+{
+   return buf->h;
+}
+
+Outbuf_Depth
+evas_software_xlib_outbuf_get_depth(Outbuf * buf)
+{
+   return buf->depth;
+}
+
+int
+evas_software_xlib_outbuf_get_rot(Outbuf * buf)
+{
+   return buf->rot;
+}
+
+void
+evas_software_xlib_outbuf_drawable_set(Outbuf * buf, Drawable draw)
+{
+   XGCValues           gcv;
+
+   if (buf->priv.x11.xlib.win == draw) return;
+   if (buf->priv.x11.xlib.gc)
+     {
+       XFreeGC(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gc);
+       buf->priv.x11.xlib.gc = NULL;
+     }
+   buf->priv.x11.xlib.win = draw;
+   buf->priv.x11.xlib.gc = XCreateGC(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.win, 0, &gcv);
+}
+
+void
+evas_software_xlib_outbuf_mask_set(Outbuf * buf, Pixmap mask)
+{
+   XGCValues           gcv;
+
+   if (buf->priv.x11.xlib.mask == mask) return;
+   if (buf->priv.x11.xlib.gcm)
+     {
+       XFreeGC(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gcm);
+       buf->priv.x11.xlib.gcm = NULL;
+     }
+   buf->priv.x11.xlib.mask = mask;
+   if (buf->priv.x11.xlib.mask)
+     buf->priv.x11.xlib.gcm = XCreateGC(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.mask, 0, &gcv);
+}
+
+void
+evas_software_xlib_outbuf_debug_set(Outbuf * buf, int debug)
+{
+   buf->priv.debug = debug;
+}
+
+void
+evas_software_xlib_outbuf_debug_show(Outbuf * buf, Drawable draw, int x, int y, int w,
+                              int h)
+{
+   int                 i;
+   int                 screen_num = 0;
+
+     {
+       int                 wx, wy;
+       unsigned int        ww, wh, bd, dp;
+       Window              wdum, root;
+       XWindowAttributes   wattr;
+
+       XGetGeometry(buf->priv.x11.xlib.disp, draw, &root, &wx, &wy, &ww, &wh, &bd, &dp);
+       XGetGeometry(buf->priv.x11.xlib.disp, root, &wdum, &wx, &wy, &ww, &wh, &bd, &dp);
+       XGetWindowAttributes(buf->priv.x11.xlib.disp, root, &wattr);
+       screen_num = XScreenNumberOfScreen(wattr.screen);
+     }
+   for (i = 0; i < 20; i++)
+     {
+//     XImage             *xim;
+
+       XSetForeground(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gc,
+                      BlackPixel(buf->priv.x11.xlib.disp, screen_num));
+       XFillRectangle(buf->priv.x11.xlib.disp, draw, buf->priv.x11.xlib.gc, x, y, w, h);
+       XSync(buf->priv.x11.xlib.disp, False);
+//     xim =
+//       XGetImage(buf->priv.x11.xlib.disp, draw, x, y, w, h, 0xffffffff, ZPixmap);
+//     if (xim)
+//       XDestroyImage(xim);
+       XSync(buf->priv.x11.xlib.disp, False);
+       XSetForeground(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gc,
+                      WhitePixel(buf->priv.x11.xlib.disp, screen_num));
+       XFillRectangle(buf->priv.x11.xlib.disp, draw, buf->priv.x11.xlib.gc, x, y, w, h);
+       XSync(buf->priv.x11.xlib.disp, False);
+//     xim =
+//       XGetImage(buf->priv.x11.xlib.disp, draw, x, y, w, h, 0xffffffff, ZPixmap);
+//     if (xim)
+//       XDestroyImage(xim);
+       XSync(buf->priv.x11.xlib.disp, False);
+     }
+}
+
+Eina_Bool
+evas_software_xlib_outbuf_alpha_get(Outbuf *buf)
+{
+   return buf->priv.x11.xlib.mask;
+}
diff --git a/src/modules/engines/software_x11/evas_xlib_outbuf.h b/src/modules/engines/software_x11/evas_xlib_outbuf.h
new file mode 100644 (file)
index 0000000..8745a1a
--- /dev/null
@@ -0,0 +1,87 @@
+#ifndef EVAS_XLIB_OUTBUF_H
+#define EVAS_XLIB_OUTBUF_H
+
+
+#include "evas_engine.h"
+
+
+void         evas_software_xlib_outbuf_init (void);
+
+void         evas_software_xlib_outbuf_free (Outbuf *buf);
+
+Outbuf      *evas_software_xlib_outbuf_setup_x (int          w,
+                                                int          h,
+                                                int          rot,
+                                                Outbuf_Depth depth,
+                                                Display     *disp,
+                                                Drawable     draw,
+                                                Visual      *vis,
+                                                Colormap     cmap,
+                                                int          x_depth,
+                                                int          grayscale,
+                                                int          max_colors,
+                                                Pixmap       mask,
+                                                int          shape_dither,
+                                                int          destination_alpha);
+
+
+RGBA_Image  *evas_software_xlib_outbuf_new_region_for_update (Outbuf *buf,
+                                                              int     x,
+                                                              int     y,
+                                                              int     w,
+                                                              int     h,
+                                                              int    *cx,
+                                                              int    *cy,
+                                                              int    *cw,
+                                                              int    *ch);
+
+void         evas_software_xlib_outbuf_free_region_for_update (Outbuf     *buf,
+                                                               RGBA_Image *update);
+
+void         evas_software_xlib_outbuf_flush (Outbuf *buf);
+
+void         evas_software_xlib_outbuf_idle_flush (Outbuf *buf);
+
+void         evas_software_xlib_outbuf_push_updated_region (Outbuf     *buf,
+                                                            RGBA_Image *update,
+                                                            int         x,
+                                                            int         y,
+                                                            int         w,
+                                                            int         h);
+
+void         evas_software_xlib_outbuf_reconfigure (Outbuf      *buf,
+                                                    int          w,
+                                                    int          h,
+                                                    int          rot,
+                                                    Outbuf_Depth depth);
+
+int          evas_software_xlib_outbuf_get_width (Outbuf *buf);
+
+int          evas_software_xlib_outbuf_get_height (Outbuf *buf);
+
+Outbuf_Depth evas_software_xlib_outbuf_get_depth (Outbuf *buf);
+
+int          evas_software_xlib_outbuf_get_rot (Outbuf *buf);
+
+void         evas_software_xlib_outbuf_drawable_set (Outbuf  *buf,
+                                                     Drawable draw);
+
+void         evas_software_xlib_outbuf_mask_set (Outbuf *buf,
+                                                 Pixmap mask);
+
+void         evas_software_xlib_outbuf_rotation_set (Outbuf *buf,
+                                                     int     rot);
+
+void         evas_software_xlib_outbuf_debug_set (Outbuf *buf,
+                                                  int     debug);
+
+void         evas_software_xlib_outbuf_debug_show (Outbuf  *buf,
+                                                   Drawable draw,
+                                                   int      x,
+                                                   int      y,
+                                                   int      w,
+                                                   int      h);
+
+Eina_Bool    evas_software_xlib_outbuf_alpha_get (Outbuf *buf);
+
+#endif
diff --git a/src/modules/engines/xrender_x11/.cvsignore b/src/modules/engines/xrender_x11/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/engines/xrender_x11/Evas_Engine_XRender_X11.h b/src/modules/engines/xrender_x11/Evas_Engine_XRender_X11.h
new file mode 100644 (file)
index 0000000..0b5b81a
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef _EVAS_ENGINE_XRENDER_X11_H
+#define _EVAS_ENGINE_XRENDER_X11_H
+
+#include <X11/Xlib.h>
+
+typedef enum
+{
+  EVAS_ENGINE_INFO_XRENDER_BACKEND_XLIB,
+  EVAS_ENGINE_INFO_XRENDER_BACKEND_XCB
+} Evas_Engine_Info_XRender_Backend;
+
+typedef struct _Evas_Engine_Info_XRender_X11 Evas_Engine_Info_XRender_X11;
+
+/*
+ *               Xlib       |      XCB
+ * connection | Display *   |  xcb_connection_t *
+ * screen     | NULL        |  xcb_screen_t *
+ * drawable   | Drawable    |  xcb_drawable_t
+ * mask       | Pixmap      |  xcb_pixmap_t
+ * visual     | Visual *    |  xcb_visualtype_t *
+ * colormap   | Colormap    |  xcb_colormap_t
+ */
+
+struct _Evas_Engine_Info_XRender_X11
+{
+   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
+   /* at you and make nasty noises */
+   Evas_Engine_Info magic;
+
+   /* engine specific data & parameters it needs to set up */
+   struct {
+      Evas_Engine_Info_XRender_Backend backend;
+      void                            *connection;
+      void                            *screen;
+      unsigned int                     drawable;
+      unsigned int                     mask;
+      void                            *visual;
+      unsigned char                    destination_alpha : 1;
+   } info;
+};
+#endif
diff --git a/src/modules/engines/xrender_x11/Makefile.am b/src/modules/engines/xrender_x11/Makefile.am
new file mode 100644 (file)
index 0000000..83d1a77
--- /dev/null
@@ -0,0 +1,60 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/modules/engines \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_engine_xrender_x11_cflags@ \
+@evas_engine_xrender_xcb_cflags@
+
+if BUILD_ENGINE_XRENDER_X11
+
+XRENDER_X11_SOURCES = \
+evas_engine_xlib_font.c \
+evas_engine_xlib_gradient.c \
+evas_engine_xlib_image.c \
+evas_engine_xlib_render.c \
+evas_engine_xlib_ximage.c \
+evas_engine.c
+
+if BUILD_ENGINE_XRENDER_XCB
+
+XRENDER_X11_SOURCES += \
+evas_engine_xcb_font.c \
+evas_engine_xcb_gradient.c \
+evas_engine_xcb_image.c \
+evas_engine_xcb_render.c \
+evas_engine_xcb_ximage.c
+
+endif
+
+XRENDER_X11_LIBADD = @evas_engine_xrender_xcb_libs@ @evas_engine_xrender_x11_libs@
+
+pkgdir = $(libdir)/evas/modules/engines/xrender_x11/$(MODULE_ARCH)
+
+include_HEADERS = Evas_Engine_XRender_X11.h
+
+if !EVAS_STATIC_BUILD_XRENDER_X11
+
+pkg_LTLIBRARIES        = module.la
+
+module_la_SOURCES = $(XRENDER_X11_SOURCES)
+module_la_LIBADD = $(top_builddir)/src/lib/libevas.la @EINA_LIBS@ $(XRENDER_X11_LIBADD)
+module_la_LDFLAGS = -no-undefined -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_engine_xrender_x11.la
+
+libevas_engine_xrender_x11_la_SOURCES = $(XRENDER_X11_SOURCES)
+libevas_engine_xrender_x11_la_LIBADD = $(XRENDER_X11_LIBADD)
+
+endif
+endif
+
+EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/xrender_x11/evas_engine.c b/src/modules/engines/xrender_x11/evas_engine.c
new file mode 100644 (file)
index 0000000..174287d
--- /dev/null
@@ -0,0 +1,1679 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+#include "Evas_Engine_XRender_X11.h"
+
+#include "evas_engine.h"
+int _evas_xrender_xcb_log_dom = -1;
+/* function tables - filled in later (func and parent func) */
+static Evas_Func func, pfunc;
+
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+struct xrdb_user
+{
+   time_t last_stat;
+   time_t last_mtime;
+   XrmDatabase db;
+};
+static struct xrdb_user xrdb_user = {0, 0, NULL};
+
+static Eina_Bool
+xrdb_user_query(const char *name, const char *cls, char **type, XrmValue *val)
+{
+   time_t last = xrdb_user.last_stat, now = time(NULL);
+
+   xrdb_user.last_stat = now;
+   if (last != now) /* don't stat() more than once every second */
+     {
+       struct stat st;
+       const char *home = getenv("HOME");
+       char tmp[PATH_MAX];
+
+       if (!home) goto failed;
+       snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home);
+       if (stat(tmp, &st) != 0) goto failed;
+       if (xrdb_user.last_mtime != st.st_mtime)
+         {
+            if (xrdb_user.db) XrmDestroyDatabase(xrdb_user.db);
+            xrdb_user.db = XrmGetFileDatabase(tmp);
+            if (!xrdb_user.db) goto failed;
+            xrdb_user.last_mtime = st.st_mtime;
+         }
+     }
+
+   if (!xrdb_user.db) return EINA_FALSE;
+   return XrmGetResource(xrdb_user.db, name, cls, type, val);
+
+ failed:
+   if (xrdb_user.db)
+     {
+       XrmDestroyDatabase(xrdb_user.db);
+       xrdb_user.db = NULL;
+     }
+   xrdb_user.last_mtime = 0;
+   return EINA_FALSE;
+}
+#endif
+
+/* engine struct data */
+typedef struct _Render_Engine        Render_Engine;
+typedef struct _Render_Engine_Update Render_Engine_Update;
+
+struct _Render_Engine_Update
+{
+   int x, y, w, h;
+   Xrender_Surface *surface;
+};
+
+struct _Render_Engine
+{
+   struct {
+      void         *connection;
+      void         *screen;
+      unsigned int  window;
+      unsigned int  mask;
+      void         *visual;
+      void        (*sync) (Render_Engine *re);
+   } x11;
+   unsigned char    destination_alpha : 1;
+
+#ifdef BUILD_ENGINE_XRENDER_X11
+   XrmDatabase   xrdb; // xres - dpi
+   struct { // xres - dpi
+      int        dpi; // xres - dpi
+   } xr; // xres - dpi
+#endif
+   
+   Ximage_Info     *xinf;
+   Xrender_Surface *output;
+   Xrender_Surface *mask_output;
+
+   Tilebuf         *tb;
+   Tilebuf_Rect    *rects;
+   Eina_Inlist     *cur_rect;
+   int              end : 1;
+
+   Eina_List       *updates;
+
+   void *(*font_surface_new)(void *xinf, RGBA_Font_Glyph *fg);
+   void (*font_surface_free)(void *fs);
+   void (*font_surface_draw)(void *xinf, void *surface, void *dc, RGBA_Font_Glyph *fg, int x, int y);
+
+   XR_Gradient *(*gradient_new)(Ximage_Info *xinf);
+   void (*gradient_free)(XR_Gradient *gr);
+   void (*gradient_color_stop_add)(XR_Gradient *gr, int r, int g, int b, int a, int delta);
+   void (*gradient_alpha_stop_add)(XR_Gradient *gr, int a, int delta);
+   void (*gradient_color_data_set)(XR_Gradient *gr, void *map, int len, int has_alpha);
+   void (*gradient_alpha_data_set)(XR_Gradient *gr, void *alpha_map, int len);
+   void (*gradient_clear)(XR_Gradient *gr);
+   void (*gradient_fill_set)(XR_Gradient *gr, int x, int y, int w, int h);
+   void (*gradient_fill_angle_set)(XR_Gradient *gr, double angle);
+   void (*gradient_fill_spread_set)(XR_Gradient *gr, int spread);
+   void (*gradient_angle_set)(XR_Gradient *gr, double angle);
+   void (*gradient_offset_set)(XR_Gradient *gr, float offset);
+   void (*gradient_direction_set)(XR_Gradient *gr, int direction);
+   void (*gradient_type_set)(XR_Gradient *gr, char *name, char *params);
+   void (*gradient_draw)(Xrender_Surface *rs, RGBA_Draw_Context *dc, XR_Gradient *gr, int x, int y, int w, int h);
+
+   XR_Image *(*image_load)(Ximage_Info *xinf, const char *file, const char *key, Evas_Image_Load_Opts *lo);
+   XR_Image *(*image_new_from_data)(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace);
+   XR_Image *(*image_new_from_copied_data)(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace);
+   XR_Image *(*image_new)(Ximage_Info *xinf, int w, int h);
+   void (*image_resize)(XR_Image *im, int w, int h);
+   void (*image_free)(XR_Image *im);
+   void (*image_region_dirty)(XR_Image *im, int x, int y, int w, int h);
+   void (*image_dirty)(XR_Image *im);
+   XR_Image *(*image_copy)(XR_Image *im);
+   void *(*image_data_get)(XR_Image *im);
+   XR_Image *(*image_data_find)(void *data);
+   void (*image_data_put)(XR_Image *im, void *data);
+   void (*image_alpha_set)(XR_Image *im, int alpha);
+   int  (*image_alpha_get)(XR_Image *im);
+   void (*image_border_set)(XR_Image *im, int l, int r, int t, int b);
+   void (*image_border_get)(XR_Image *im, int *l, int *r, int *t, int *b);
+   void (*image_surface_gen)(XR_Image *im);
+   void (*image_cache_set)(int size);
+   int  (*image_cache_get)(void);
+
+   Ximage_Info *(*ximage_info_get)(void *connection, unsigned int draw, void *vis);
+   void (*ximage_info_free)(Ximage_Info *xinf);
+   void (*ximage_info_pool_flush)(Ximage_Info *xinf, int max_num, int max_mem);
+   Ximage_Image *(*ximage_new)(Ximage_Info *xinf, int w, int h, int depth);
+   void (*ximage_free)(Ximage_Image *xim);
+   void (*ximage_put)(Ximage_Image *xim, Drawable draw, int x, int y, int w, int h);
+
+   Xrender_Surface *(*render_surface_new)(Ximage_Info *xinf, int w, int h, XRenderPictFormat *fmt, int alpha);
+   Xrender_Surface *(*render_surface_adopt)(Ximage_Info *xinf, unsigned int draw, int w, int h, int alpha);
+   Xrender_Surface *(*render_surface_format_adopt)(Ximage_Info *xinf, unsigned int draw, int w, int h, void *fmt, int alpha);
+   void (*render_surface_free)(Xrender_Surface *rs);
+   void (*render_surface_repeat_set)(Xrender_Surface *rs, int repeat);
+   void (*render_surface_solid_rectangle_set)(Xrender_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h);
+   void (*render_surface_argb_pixels_fill)(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy);
+   void (*render_surface_rgb_pixels_fill)(Xrender_Surface *rs, int sw, int sh __UNUSED__, void *pixels, int x, int y, int w, int h, int ox, int oy);
+   void (*render_surface_clips_set)(Xrender_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh);
+   void (*render_surface_composite)(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth);
+   void (*render_surface_copy)(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int sy, int x, int y, int w, int h);
+   void (*render_surface_rectangle_draw)(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h);
+   void (*render_surface_line_draw)(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2);
+   void (*render_surface_polygon_draw)(Xrender_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y);
+};
+
+/* internal engine routines */
+
+#ifdef BUILD_ENGINE_XRENDER_X11
+
+static void
+_xlib_sync(Render_Engine *re)
+{
+   XSync((Display *)re->x11.connection, False);
+}
+
+static Render_Engine *
+_output_xlib_setup(int           width,
+                   int           height,
+                   unsigned char destination_alpha,
+                   void         *connection,
+                   unsigned int  draw,
+                   unsigned int  mask,
+                   void         *visual)
+{
+   Render_Engine *re;
+
+   re = calloc(1, sizeof(Render_Engine));
+   if (!re)
+     return NULL;
+
+   re->x11.connection = connection;
+   re->x11.screen = NULL;
+   re->x11.window = draw;
+   re->x11.mask = mask;
+   re->x11.visual = visual;
+
+   if (re->xinf) _xr_xlib_image_info_free(re->xinf);
+   re->xinf = _xr_xlib_image_info_get((Display *)re->x11.connection, (Drawable)re->x11.window, (Visual *)re->x11.visual);
+
+   if (!re->x11.mask)
+     re->output = _xr_xlib_render_surface_adopt(re->xinf, (Drawable)re->x11.window, width, height, destination_alpha);
+   else
+     re->output = _xr_xlib_render_surface_adopt(re->xinf, (Drawable)re->x11.window, width, height, 0);
+   if (re->x11.mask)
+     re->mask_output = _xr_xlib_render_surface_format_adopt(re->xinf,
+                                                            (Drawable)re->x11.mask,
+                                                            width, height,
+                                                            re->xinf->x11.fmt1, 1);
+   else
+     re->mask_output = NULL;
+
+//   if (re->output) _xr_xlib_render_surface_free(re->output);
+//   if (re->mask_output) _xr_xlib_render_surface_free(re->mask_output);
+
+   re->x11.sync = _xlib_sync;
+
+   re->font_surface_new = _xre_xlib_font_surface_new;
+   re->font_surface_free = _xre_xlib_font_surface_free;
+   re->font_surface_draw = _xre_xlib_font_surface_draw;
+
+   re->gradient_new = _xre_xlib_gradient_new;
+   re->gradient_free = _xre_xlib_gradient_free;
+   re->gradient_color_stop_add = _xre_xlib_gradient_color_stop_add;
+   re->gradient_alpha_stop_add = _xre_xlib_gradient_alpha_stop_add;
+   re->gradient_color_data_set = _xre_xlib_gradient_color_data_set;
+   re->gradient_alpha_data_set = _xre_xlib_gradient_alpha_data_set;
+   re->gradient_clear = _xre_xlib_gradient_clear;
+   re->gradient_fill_set = _xre_xlib_gradient_fill_set;
+   re->gradient_fill_angle_set = _xre_xlib_gradient_fill_angle_set;
+   re->gradient_fill_spread_set = _xre_xlib_gradient_fill_spread_set;
+   re->gradient_angle_set = _xre_xlib_gradient_angle_set;
+   re->gradient_offset_set = _xre_xlib_gradient_offset_set;
+   re->gradient_direction_set = _xre_xlib_gradient_direction_set;
+   re->gradient_type_set = _xre_xlib_gradient_type_set;
+   re->gradient_draw = _xre_xlib_gradient_draw;
+
+   re->image_load = _xre_xlib_image_load;
+   re->image_new_from_data = _xre_xlib_image_new_from_data;
+   re->image_new_from_copied_data = _xre_xlib_image_new_from_copied_data;
+   re->image_new = _xre_xlib_image_new;
+   re->image_resize = _xre_xlib_image_resize;
+   re->image_free = _xre_xlib_image_free;
+   re->image_region_dirty = _xre_xlib_image_region_dirty;
+   re->image_dirty = _xre_xlib_image_dirty;
+   re->image_copy = _xre_xlib_image_copy;
+   re->image_data_get = _xre_xlib_image_data_get;
+   re->image_data_find = _xre_xlib_image_data_find;
+   re->image_data_put = _xre_xlib_image_data_put;
+   re->image_alpha_set = _xre_xlib_image_alpha_set;
+   re->image_alpha_get = _xre_xlib_image_alpha_get;
+   re->image_border_set = _xre_xlib_image_border_set;
+   re->image_border_get = _xre_xlib_image_border_get;
+   re->image_surface_gen = _xre_xlib_image_surface_gen;
+   re->image_cache_set = _xre_xlib_image_cache_set;
+   re->image_cache_get = _xre_xlib_image_cache_get;
+
+   re->ximage_info_get = _xr_xlib_image_info_get;
+   re->ximage_info_free = _xr_xlib_image_info_free;
+   re->ximage_info_pool_flush = _xr_xlib_image_info_pool_flush;
+   re->ximage_new = _xr_xlib_image_new;
+   re->ximage_free = _xr_xlib_image_free;
+   re->ximage_put = _xr_xlib_image_put;
+
+   re->render_surface_new = _xr_xlib_render_surface_new;
+   re->render_surface_adopt = _xr_xlib_render_surface_adopt;
+   re->render_surface_format_adopt = _xr_xlib_render_surface_format_adopt;
+   re->render_surface_free = _xr_xlib_render_surface_free;
+   re->render_surface_repeat_set = _xr_xlib_render_surface_repeat_set;
+   re->render_surface_solid_rectangle_set = _xr_xlib_render_surface_solid_rectangle_set;
+   re->render_surface_argb_pixels_fill = _xr_xlib_render_surface_argb_pixels_fill;
+   re->render_surface_rgb_pixels_fill = _xr_xlib_render_surface_rgb_pixels_fill;
+   re->render_surface_clips_set = _xr_xlib_render_surface_clips_set;
+   re->render_surface_composite = _xr_xlib_render_surface_composite;
+   re->render_surface_copy = _xr_xlib_render_surface_copy;
+   re->render_surface_rectangle_draw = _xr_xlib_render_surface_rectangle_draw;
+   re->render_surface_line_draw = _xr_xlib_render_surface_line_draw;
+   re->render_surface_polygon_draw = _xr_xlib_render_surface_polygon_draw;
+
+     {   
+        int status;
+        char *type = NULL;
+        XrmValue val;
+        
+        re->xr.dpi = 75000; // dpy * 1000
+
+       status = xrdb_user_query("Xft.dpi", "Xft.Dpi", &type, &val);
+       if ((!status) || (!type))
+         {
+            if (!re->xrdb)
+              re->xrdb = XrmGetDatabase((Display *)re->x11.connection);
+            if (re->xrdb)
+              status = XrmGetResource(re->xrdb,
+                                      "Xft.dpi", "Xft.Dpi", &type, &val);
+         }
+
+        if ((status) && (type))
+          {
+             if (!strcmp(type, "String"))
+               {
+                  const char *str, *dp;
+                  
+                  str = val.addr;
+                  dp = strchr(str, '.');
+                  if (!dp) dp = strchr(str, ',');
+                  
+                  if (dp)
+                    {
+                       int subdpi, len, i;
+                       char *buf;
+                       
+                       buf = alloca(dp - str + 1);
+                       strncpy(buf, str, dp - str);
+                       buf[dp - str] = 0;
+                       len = strlen(dp + 1);
+                       subdpi = atoi(dp + 1);
+                       
+                       if (len < 3)
+                         {
+                            for (i = len; i < 3; i++) subdpi *= 10;
+                         }
+                       else if (len > 3)
+                         {
+                            for (i = len; i > 3; i--) subdpi /= 10;
+                         }
+                       re->xr.dpi = atoi(buf) * 1000;
+                    }
+                  else
+                    re->xr.dpi = atoi(str) * 1000;
+                  evas_common_font_dpi_set(re->xr.dpi / 1000);
+               }
+          }
+     }
+   
+   return re;
+}
+
+#endif /* BUILD_ENGINE_XRENDER_X11 */
+
+#ifdef BUILD_ENGINE_XRENDER_XCB
+
+static void
+_xcb_sync(Render_Engine *re)
+{
+   xcb_get_input_focus_reply_t *reply;
+
+   reply = xcb_get_input_focus_reply(re->x11.connection,
+                                     xcb_get_input_focus_unchecked(re->x11.connection),
+                                     NULL);
+   if (reply)
+     free(reply);
+}
+
+static Render_Engine *
+_output_xcb_setup(int           width,
+                  int           height,
+                  unsigned char destination_alpha,
+                  void         *connection,
+                  void         *screen,
+                  unsigned int  draw,
+                  unsigned int  mask,
+                  void         *visual)
+{
+   Render_Engine *re;
+
+   re = calloc(1, sizeof(Render_Engine));
+   if (!re)
+     return NULL;
+
+   re->x11.connection = connection;
+   re->x11.screen = screen;
+   re->x11.window = draw;
+   re->x11.mask = mask;
+   re->x11.visual = visual;
+
+   if (re->xinf) _xr_xcb_image_info_free(re->xinf);
+   re->xinf = _xr_xcb_image_info_get((xcb_connection_t *)re->x11.connection, (xcb_screen_t *)re->x11.screen, (xcb_drawable_t)re->x11.window, (xcb_visualtype_t *)re->x11.visual);
+
+   if (!re->x11.mask)
+     re->output = _xr_xcb_render_surface_adopt(re->xinf, (Drawable)re->x11.window, width, height, destination_alpha);
+   else
+     re->output = _xr_xcb_render_surface_adopt(re->xinf, (Drawable)re->x11.window, width, height, 0);
+   if (re->x11.mask)
+     re->mask_output = _xr_xcb_render_surface_format_adopt(re->xinf,
+                                                            (Drawable)re->x11.mask,
+                                                            width, height,
+                                                            re->xinf->x11.fmt1, 1);
+   else
+     re->mask_output = NULL;
+
+   if (re->output) _xr_xcb_render_surface_free(re->output);
+   if (re->mask_output) _xr_xcb_render_surface_free(re->mask_output);
+
+   re->x11.sync = _xcb_sync;
+
+   re->font_surface_new = _xre_xcb_font_surface_new;
+   re->font_surface_free = _xre_xcb_font_surface_free;
+   re->font_surface_draw = _xre_xcb_font_surface_draw;
+
+   re->gradient_new = _xre_xcb_gradient_new;
+   re->gradient_free = _xre_xcb_gradient_free;
+   re->gradient_color_stop_add = _xre_xcb_gradient_color_stop_add;
+   re->gradient_alpha_stop_add = _xre_xcb_gradient_alpha_stop_add;
+   re->gradient_color_data_set = _xre_xcb_gradient_color_data_set;
+   re->gradient_alpha_data_set = _xre_xcb_gradient_alpha_data_set;
+   re->gradient_clear = _xre_xcb_gradient_clear;
+   re->gradient_fill_set = _xre_xcb_gradient_fill_set;
+   re->gradient_fill_angle_set = _xre_xcb_gradient_fill_angle_set;
+   re->gradient_fill_spread_set = _xre_xcb_gradient_fill_spread_set;
+   re->gradient_angle_set = _xre_xcb_gradient_angle_set;
+   re->gradient_offset_set = _xre_xcb_gradient_offset_set;
+   re->gradient_direction_set = _xre_xcb_gradient_direction_set;
+   re->gradient_type_set = _xre_xcb_gradient_type_set;
+   re->gradient_draw = _xre_xcb_gradient_draw;
+
+   re->image_load = _xre_xcb_image_load;
+   re->image_new_from_data = _xre_xcb_image_new_from_data;
+   re->image_new_from_copied_data = _xre_xcb_image_new_from_copied_data;
+   re->image_new = _xre_xcb_image_new;
+   re->image_resize = _xre_xcb_image_resize;
+   re->image_free = _xre_xcb_image_free;
+   re->image_region_dirty = _xre_xcb_image_region_dirty;
+   re->image_dirty = _xre_xcb_image_dirty;
+   re->image_copy = _xre_xcb_image_copy;
+   re->image_data_get = _xre_xcb_image_data_get;
+   re->image_data_find = _xre_xcb_image_data_find;
+   re->image_data_put = _xre_xcb_image_data_put;
+   re->image_alpha_set = _xre_xcb_image_alpha_set;
+   re->image_alpha_get = _xre_xcb_image_alpha_get;
+   re->image_border_set = _xre_xcb_image_border_set;
+   re->image_border_get = _xre_xcb_image_border_get;
+   re->image_surface_gen = _xre_xcb_image_surface_gen;
+   re->image_cache_set = _xre_xcb_image_cache_set;
+   re->image_cache_get = _xre_xcb_image_cache_get;
+
+   re->ximage_info_get = _xr_xcb_image_info_get;
+   re->ximage_info_free = _xr_xcb_image_info_free;
+   re->ximage_info_pool_flush = _xr_xcb_image_info_pool_flush;
+   re->ximage_new = _xr_xcb_image_new;
+   re->ximage_free = _xr_xcb_image_free;
+   re->ximage_put = _xr_xcb_image_put;
+
+   re->render_surface_new = _xr_xcb_render_surface_new;
+   re->render_surface_adopt = _xr_xcb_render_surface_adopt;
+   re->render_surface_format_adopt = _xr_xcb_render_surface_format_adopt;
+   re->render_surface_free = _xr_xcb_render_surface_free;
+   re->render_surface_repeat_set = _xr_xcb_render_surface_repeat_set;
+   re->render_surface_solid_rectangle_set = _xr_xcb_render_surface_solid_rectangle_set;
+   re->render_surface_argb_pixels_fill = _xr_xcb_render_surface_argb_pixels_fill;
+   re->render_surface_rgb_pixels_fill = _xr_xcb_render_surface_rgb_pixels_fill;
+   re->render_surface_clips_set = _xr_xcb_render_surface_clips_set;
+   re->render_surface_composite = _xr_xcb_render_surface_composite;
+   re->render_surface_copy = _xr_xcb_render_surface_copy;
+   re->render_surface_rectangle_draw = _xr_xcb_render_surface_rectangle_draw;
+   re->render_surface_line_draw = _xr_xcb_render_surface_line_draw;
+   re->render_surface_polygon_draw = _xr_xcb_render_surface_polygon_draw;
+
+   return re;
+}
+
+#endif /* BUILD_ENGINE_XRENDER_XCB */
+
+/* engine api this module provides */
+static void *
+eng_info(Evas *e __UNUSED__)
+{
+   Evas_Engine_Info_XRender_X11 *info;
+   info = calloc(1, sizeof(Evas_Engine_Info_XRender_X11));
+   if (!info) return NULL;
+   info->magic.magic = rand();
+   return info;
+}
+
+static void
+eng_info_free(Evas *e __UNUSED__, void *info)
+{
+   Evas_Engine_Info_XRender_X11 *in;
+   in = (Evas_Engine_Info_XRender_X11 *)info;
+   free(in);
+}
+
+static void
+eng_setup(Evas *e, void *in)
+{
+   Render_Engine *re = NULL;
+   Evas_Engine_Info_XRender_X11 *info;
+   int resize = 1;
+
+   info = (Evas_Engine_Info_XRender_X11 *)in;
+   if (!e->engine.data.output)
+     {
+       evas_common_cpu_init();
+       evas_common_blend_init();
+       evas_common_image_init();
+       evas_common_convert_init();
+       evas_common_scale_init();
+       evas_common_rectangle_init();
+       evas_common_gradient_init();
+       evas_common_polygon_init();
+       evas_common_line_init();
+       evas_common_font_init();
+       evas_common_draw_init();
+       evas_common_tilebuf_init();
+
+#ifdef BUILD_ENGINE_XRENDER_X11
+        if (info->info.backend == 0)
+          {
+             re = _output_xlib_setup(e->output.w,
+                                     e->output.h,
+                                     info->info.destination_alpha,
+                                     info->info.connection,
+                                     info->info.drawable,
+                                     info->info.mask,
+                                     info->info.visual);
+          }
+#endif /* BUILD_ENGINE_XRENDER_X11 */
+
+#ifdef BUILD_ENGINE_XRENDER_XCB
+        if (info->info.backend == 1)
+          {
+             re = _output_xcb_setup(e->output.w,
+                                    e->output.h,
+                                    info->info.destination_alpha,
+                                    info->info.connection,
+                                    info->info.screen,
+                                    info->info.drawable,
+                                    info->info.mask,
+                                    info->info.visual);
+          }
+#endif /* BUILD_ENGINE_XRENDER_XCB */
+
+        if (!re)
+          return;
+
+       re->tb = evas_common_tilebuf_new(e->output.w, e->output.h);
+       if (re->tb)
+         evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+       e->engine.data.output = re;
+       resize = 0;
+     }
+   re = e->engine.data.output;
+   if (!re) return;
+
+   if (!e->engine.data.context) e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
+
+   if (resize)
+     {
+       if (re->tb) evas_common_tilebuf_free(re->tb);
+       if ((e->output.w > 0) && (e->output.h > 0))
+         re->tb = evas_common_tilebuf_new(e->output.w, e->output.h);
+       else
+         re->tb = evas_common_tilebuf_new(1, 1);
+        if (re->tb)
+         evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+     }
+}
+
+static void
+eng_output_free(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   
+#ifdef BUILD_ENGINE_XRENDER_X11
+// NOTE: XrmGetDatabase() result is shared per connection, do not free it.
+//   if (re->xrdb) XrmDestroyDatabase(re->xrdb);
+#endif
+   
+   evas_common_font_shutdown();
+   evas_common_image_shutdown();
+   while (re->updates)
+     {
+       Render_Engine_Update *reu;
+
+       reu = re->updates->data;
+       re->updates = eina_list_remove_list(re->updates, re->updates);
+       re->render_surface_free(reu->surface);
+       free(reu);
+     }
+   if (re->tb) evas_common_tilebuf_free(re->tb);
+   if (re->output) re->render_surface_free(re->output);
+   if (re->mask_output) re->render_surface_free(re->mask_output);
+   if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
+   if (re->xinf) re->ximage_info_free(re->xinf);
+   free(re);
+}
+
+static void
+eng_output_resize(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   if (re->output)
+     {
+       if ((re->output->width == w) && (re->output->height == h)) return;
+       if (re->output) re->render_surface_free(re->output);
+     }
+   re->output = re->render_surface_adopt(re->xinf, re->x11.window, w, h, 0);
+   if (re->mask_output)
+     {
+       if (re->mask_output) re->render_surface_free(re->mask_output);
+       re->mask_output = re->render_surface_format_adopt(re->xinf,
+                                                          re->x11.mask,
+                                                          w, h,
+                                                          re->xinf->x11.fmt1, 1);
+     }
+   evas_common_tilebuf_free(re->tb);
+   re->tb = evas_common_tilebuf_new(w, h);
+   if (re->tb) evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+}
+
+static void
+eng_output_tile_size_set(void *data, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_set_tile_size(re->tb, w, h);
+}
+
+static void
+eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
+}
+
+static void
+eng_output_redraws_clear(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_tilebuf_clear(re->tb);
+}
+
+static void *
+eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
+{
+   Render_Engine *re;
+   Tilebuf_Rect *rect;
+   int ux, uy, uw, uh;
+
+   re = (Render_Engine *)data;
+   if (re->end)
+     {
+       re->end = 0;
+       return NULL;
+     }
+   if (!re->rects)
+     {
+       re->rects = evas_common_tilebuf_get_render_rects(re->tb);
+       re->cur_rect = EINA_INLIST_GET(re->rects);
+     }
+   if (!re->cur_rect) return NULL;
+   rect = (Tilebuf_Rect *)re->cur_rect;
+   ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h;
+   re->cur_rect = re->cur_rect->next;
+   if (!re->cur_rect)
+     {
+       evas_common_tilebuf_free_render_rects(re->rects);
+       re->rects = NULL;
+       re->end = 1;
+     }
+
+   *x = ux; *y = uy; *w = uw; *h = uh;
+   *cx = 0; *cy = 0; *cw = uw; *ch = uh;
+// use target format to avoid conversion to depth when copying to screen
+//   return _xr_render_surface_new(re->xinf, uw, uh, re->xinf->fmtdef, 0);
+// use 24/32bpp for tmp buf for better quality. rendering in 24/32bpp
+   return re->render_surface_new(re->xinf, uw, uh, re->xinf->x11.fmt24, 0);
+}
+
+static void
+eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+   Render_Engine_Update *reu;
+
+   re = (Render_Engine *)data;
+   reu = malloc(sizeof(Render_Engine_Update));
+   if (!reu) return;
+   reu->x = x;
+   reu->y = y;
+   reu->w = w;
+   reu->h = h;
+   reu->surface = (Xrender_Surface *)surface;
+   re->updates = eina_list_append(re->updates, reu);
+}
+
+static void
+eng_output_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   while (re->updates)
+     {
+       Render_Engine_Update *reu;
+
+       reu = re->updates->data;
+       re->updates = eina_list_remove_list(re->updates, re->updates);
+       if (re->mask_output)
+         {
+            Xrender_Surface *tsurf;
+
+            re->render_surface_copy(reu->surface, re->output, 0, 0,
+                                    reu->x, reu->y, reu->w, reu->h);
+            tsurf = re->render_surface_new(re->xinf, reu->w, reu->h, re->xinf->x11.fmt1, 1);
+            if (tsurf)
+              {
+                 re->render_surface_copy(reu->surface, tsurf, 0, 0,
+                                         0, 0, reu->w, reu->h);
+                 re->render_surface_copy(tsurf, re->mask_output, 0, 0,
+                                         reu->x, reu->y, reu->w, reu->h);
+                 re->render_surface_free(tsurf);
+              }
+         }
+       else
+         {
+            re->render_surface_copy(reu->surface, re->output, 0, 0,
+                                    reu->x, reu->y, reu->w, reu->h);
+         }
+       re->render_surface_free(reu->surface);
+       free(reu);
+     }
+   re->x11.sync(re);
+   re->ximage_info_pool_flush(re->xinf, 0, 0);
+}
+
+static void
+eng_output_idle_flush(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+}
+
+static void
+eng_output_dump(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_image_image_all_unload();
+   evas_common_font_font_all_unload();
+   // FIXME: kill pixmaps too - but... xrender engine is dead... no? :):)
+}
+
+static void
+eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+
+   re->render_surface_rectangle_draw((Xrender_Surface *)surface,
+                                     (RGBA_Draw_Context *)context,
+                                     x, y, w, h);
+}
+
+static void
+eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+
+   re->render_surface_line_draw((Xrender_Surface *)surface, (RGBA_Draw_Context *)context, x1, y1, x2, y2);
+}
+
+static void
+eng_polygon_draw(void *data, void *context, void *surface, void *polygon, int x, int y)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+
+   re->render_surface_polygon_draw((Xrender_Surface *)surface, (RGBA_Draw_Context *)context, (RGBA_Polygon_Point *)polygon, x, y);
+}
+
+
+static void
+eng_gradient2_color_np_stop_insert(void *data __UNUSED__, void *gradient __UNUSED__, int r __UNUSED__, int g __UNUSED__, int b __UNUSED__, int a __UNUSED__, float pos __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_clear(void *data __UNUSED__, void *gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_fill_transform_set(void *data __UNUSED__, void *gradient __UNUSED__, void *transform __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_fill_spread_set(void *data __UNUSED__, void *gradient __UNUSED__, int spread __UNUSED__)
+{
+}
+
+static void *
+eng_gradient2_linear_new(void *data __UNUSED__)
+{
+   return NULL;
+}
+
+static void
+eng_gradient2_linear_free(void *data __UNUSED__, void *linear_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_linear_fill_set(void *data __UNUSED__, void *linear_gradient __UNUSED__, int x0 __UNUSED__, int y0 __UNUSED__, int x1 __UNUSED__, int y1 __UNUSED__)
+{
+}
+
+static int
+eng_gradient2_linear_is_opaque(void *data __UNUSED__, void *context __UNUSED__, void *linear_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   return 1;
+}
+
+static int
+eng_gradient2_linear_is_visible(void *data __UNUSED__, void *context __UNUSED__, void *linear_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   return 1;
+}
+
+static void
+eng_gradient2_linear_render_pre(void *data __UNUSED__, void *context __UNUSED__, void *linear_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_linear_render_post(void *data __UNUSED__, void *linear_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_linear_draw(void *data __UNUSED__, void *context __UNUSED__, void *surface __UNUSED__, void *linear_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+}
+
+static void *
+eng_gradient2_radial_new(void *data __UNUSED__)
+{
+   return NULL;
+}
+
+static void
+eng_gradient2_radial_free(void *data __UNUSED__, void *radial_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_radial_fill_set(void *data __UNUSED__, void *radial_gradient __UNUSED__, float cx __UNUSED__, float cy __UNUSED__, float rx __UNUSED__, float ry __UNUSED__)
+{
+}
+
+static int
+eng_gradient2_radial_is_opaque(void *data __UNUSED__, void *context __UNUSED__, void *radial_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   return 1;
+}
+
+static int
+eng_gradient2_radial_is_visible(void *data __UNUSED__, void *context __UNUSED__, void *radial_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   return 1;
+}
+
+static void
+eng_gradient2_radial_render_pre(void *data __UNUSED__, void *context __UNUSED__, void *radial_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_radial_render_post(void *data __UNUSED__, void *radial_gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient2_radial_draw(void *data __UNUSED__, void *context __UNUSED__, void *surface __UNUSED__, void *radial_gradient __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+}
+
+static void *
+eng_gradient_new(void *data)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   return re->gradient_new(re->xinf);
+}
+
+static void
+eng_gradient_free(void *data, void *gradient)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->gradient_free(gradient);
+}
+
+static void
+eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->gradient_color_stop_add(gradient, r, g, b, a, delta);
+}
+
+static void
+eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->gradient_alpha_stop_add(gradient, a, delta);
+}
+
+static void
+eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->gradient_color_data_set(gradient, map, len, has_alpha);
+}
+
+static void
+eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->gradient_alpha_data_set(gradient, alpha_map, len);
+}
+
+static void
+eng_gradient_clear(void *data, void *gradient)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->gradient_clear(gradient);
+}
+
+static void
+eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->gradient_fill_set(gradient, x, y, w, h);
+}
+
+static void
+eng_gradient_fill_angle_set(void *data, void *gradient, double angle)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->gradient_fill_angle_set(gradient, angle);
+}
+
+static void
+eng_gradient_fill_spread_set(void *data, void *gradient, int spread)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->gradient_fill_spread_set(gradient, spread);
+}
+
+static void
+eng_gradient_angle_set(void *data, void *gradient, double angle)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->gradient_angle_set(gradient, angle);
+}
+
+static void
+eng_gradient_offset_set(void *data, void *gradient, float offset)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->gradient_offset_set(gradient, offset);
+}
+
+static void
+eng_gradient_direction_set(void *data, void *gradient, int direction)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->gradient_direction_set(gradient, direction);
+}
+
+static void
+eng_gradient_type_set(void *data, void *gradient, char *name, char *params)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->gradient_type_set(gradient, name, params);
+}
+
+static int
+eng_gradient_is_opaque(void *data __UNUSED__, void *context, void *gradient, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   RGBA_Gradient  *grad;
+   RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
+
+   if (!dc || !gradient) return 0;
+   grad = ((XR_Gradient *)gradient)->grad;
+   if(!grad || !grad->type.geometer)  return 0;
+   return !(grad->type.geometer->has_alpha(grad, dc->render_op) |
+              grad->type.geometer->has_mask(grad, dc->render_op));
+}
+
+static int
+eng_gradient_is_visible(void *data __UNUSED__, void *context, void *gradient, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   if (!context || !gradient)  return 0;
+   return 1;
+}
+
+static void
+eng_gradient_render_pre(void *data __UNUSED__, void *context, void *gradient)
+{
+   int  len;
+   RGBA_Gradient  *grad;
+
+   if (!context || !gradient) return;
+   grad = ((XR_Gradient *)gradient)->grad;
+   if(!grad || !grad->type.geometer)  return;
+   grad->type.geometer->geom_set(grad);
+   len = grad->type.geometer->get_map_len(grad);
+   evas_common_gradient_map(context, grad, len);
+}
+
+static void
+eng_gradient_render_post(void *data __UNUSED__, void *gradient __UNUSED__)
+{
+}
+
+static void
+eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h)
+{
+   Render_Engine *re = (Render_Engine *)data;
+
+   re->gradient_draw(surface, context, gradient, x, y, w, h);
+}
+
+static int
+eng_image_alpha_get(void *data, void *image)
+{
+   Render_Engine *re;
+
+   if (!image) return 0;
+
+   re = (Render_Engine *)data;
+   return re->image_alpha_get((XR_Image *)image);
+}
+
+static int
+eng_image_colorspace_get(void *data __UNUSED__, void *image)
+{
+   if (!image) return EVAS_COLORSPACE_ARGB8888;
+   return ((XR_Image *)image)->cs.space;
+}
+
+static void *
+eng_image_alpha_set(void *data, void *image, int has_alpha)
+{
+   Render_Engine *re;
+   XR_Image *im;
+
+   im = (XR_Image *)image;
+   if (!im) return im;
+   if (im->cs.space != EVAS_COLORSPACE_ARGB8888) return im;
+   if (((im->alpha) && (has_alpha)) || ((!im->alpha) && (!has_alpha)))
+     return im;
+   re = (Render_Engine *)data;
+   if (im->references > 1)
+     {
+       XR_Image *old_im;
+
+       old_im = im;
+       im = re->image_copy(old_im);
+       if (im)
+         {
+            im->alpha = old_im->alpha;
+            re->image_free(old_im);
+         }
+       else
+         im = old_im;
+     }
+   else
+     re->image_dirty(im);
+   re->image_alpha_set(im, has_alpha);
+   return im;
+}
+
+static void *
+eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
+{
+   Render_Engine *re;
+
+   if (!image) return image;
+   re = (Render_Engine *)data;
+   re->image_border_set((XR_Image *)image, l, r, t, b);
+   return image;
+}
+
+static void
+eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
+{
+   Render_Engine *re;
+
+   if (!image) return;
+   re = (Render_Engine *)data;
+   re->image_border_get((XR_Image *)image, l, r, t, b);
+}
+
+static char *
+eng_image_comment_get(void *data __UNUSED__, void *image, char *key __UNUSED__)
+{
+   if (!image) return NULL;
+   return strdup(((XR_Image *)image)->comment);
+}
+
+static char *
+eng_image_format_get(void *data __UNUSED__, void *image)
+{
+   if (!image) return NULL;
+   return ((XR_Image *)image)->format;
+}
+
+static void
+eng_image_colorspace_set(void *data, void *image, int cspace)
+{
+   Render_Engine *re;
+   XR_Image *im;
+
+   if (!image) return;
+   im = (XR_Image *)image;
+   if (im->cs.space == cspace) return;
+
+   if (im->im) evas_cache_image_drop(&im->im->cache_entry);
+   im->im = NULL;
+
+   re = (Render_Engine *)data;
+   switch (cspace)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (im->cs.data)
+         {
+            if (!im->cs.no_free) free(im->cs.data);
+            im->cs.data = NULL;
+            im->cs.no_free = 0;
+         }
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       if ((im->free_data) && (im->data)) free(im->data);
+       im->data = NULL;
+       if (im->cs.data)
+         {
+            if (!im->cs.no_free) free(im->cs.data);
+         }
+       if (im->h > 0)
+         im->cs.data = calloc(1, im->h * sizeof(unsigned char *) * 2);
+       im->cs.no_free = 0;
+       break;
+      default:
+       abort();
+       break;
+     }
+   im->cs.space = cspace;
+   re->image_dirty(im);
+   re->image_region_dirty(im, 0, 0, im->w, im->h);
+}
+
+static void
+eng_image_native_set(void *data __UNUSED__, void *image __UNUSED__, void *native __UNUSED__)
+{
+}
+
+static void *
+eng_image_native_get(void *data __UNUSED__, void *image __UNUSED__)
+{
+   return NULL;
+}
+
+static void *
+eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
+{
+   Render_Engine *re;
+   XR_Image *im;
+
+   re = (Render_Engine *)data;
+   *error = 0;
+   im = re->image_load(re->xinf, file, key, lo);
+   return im;
+}
+
+static void *
+eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Render_Engine *re;
+   XR_Image *im;
+
+   re = (Render_Engine *)data;
+   im = re->image_new_from_data(re->xinf, w, h, image_data, alpha, cspace);
+   return im;
+}
+
+static void *
+eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   Render_Engine *re;
+   XR_Image *im;
+
+   re = (Render_Engine *)data;
+   im = re->image_new_from_copied_data(re->xinf, w, h, image_data, alpha, cspace);
+   return im;
+}
+
+static void
+eng_image_free(void *data, void *image)
+{
+   Render_Engine *re;
+
+   if (!image) return;
+   re = (Render_Engine *)data;
+   re->image_free((XR_Image *)image);
+}
+
+static void
+eng_image_size_get(void *data __UNUSED__, void *image, int *w, int *h)
+{
+   if (!image) return;
+   if (w) *w = ((XR_Image *)image)->w;
+   if (h) *h = ((XR_Image *)image)->h;
+}
+
+static void *
+eng_image_size_set(void *data, void *image, int w, int h)
+{
+   Render_Engine *re;
+   XR_Image *im, *im_old;
+
+   if (!image) return NULL;
+   re = (Render_Engine *)data;
+   im_old = image;
+   if ((im_old->cs.space == EVAS_COLORSPACE_YCBCR422P601_PL) ||
+       (im_old->cs.space == EVAS_COLORSPACE_YCBCR422P709_PL))
+     w &= ~0x1;
+   if ((im_old) && (im_old->w == w) && (im_old->h == h))
+     return image;
+   if ((w <= 0) || (h <= 0))
+     {
+       re->image_free(im_old);
+       return NULL;
+     }
+   if (im_old)
+     {
+       im = re->image_new_from_copied_data(im_old->xinf, w, h, NULL, im_old->alpha, im_old->cs.space);
+       re->image_free(im_old);
+       return im;
+     }
+   return image;
+}
+
+static void *
+eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h)
+{
+   Render_Engine *re;
+
+   if (!image) return image;
+   re = (Render_Engine *)data;
+   re->image_dirty((XR_Image *)image);
+   re->image_region_dirty((XR_Image *)image, x, y, w, h);
+   return image;
+}
+
+static void *
+eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data)
+{
+   Render_Engine *re;
+   XR_Image *im;
+
+   if (!image)
+     {
+       *image_data = NULL;
+       return NULL;
+     }
+   re = (Render_Engine *)data;
+   im = (XR_Image *)image;
+   if (im->im)
+     evas_cache_image_load_data(&im->im->cache_entry);
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (to_write)
+         {
+            if (im->references > 1)
+              {
+                 XR_Image *im_old;
+
+                 im_old = im;
+                 im = re->image_copy(im_old);
+                 if (im)
+                   re->image_free(im_old);
+                 else
+                   im = im_old;
+              }
+            else
+              re->image_dirty(im);
+         }
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       break;
+      default:
+       abort();
+       break;
+     }
+   if (image_data) *image_data = re->image_data_get(im);
+   return im;
+}
+
+static void *
+eng_image_data_put(void *data, void *image, DATA32 *image_data)
+{
+   Render_Engine *re;
+   XR_Image *im;
+
+   if (!image) return image;
+   re = (Render_Engine *)data;
+   im = (XR_Image *)image;
+
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (re->image_data_get(im) != image_data)
+         {
+            XR_Image *im_old;
+
+            im_old = im;
+            image = re->image_data_find(image_data);
+            if (image != im_old)
+              {
+                 if (!image)
+                   {
+                      image = re->image_new_from_data(im_old->xinf, im_old->w, im_old->h, image_data, im_old->alpha, EVAS_COLORSPACE_ARGB8888);
+                      if (image)
+                        {
+                           ((XR_Image *)image)->alpha = im_old->alpha;
+                           re->image_free(im_old);
+                        }
+                      else
+                        image = im_old;
+                   }
+                 else
+                   {
+                      re->image_free(im_old);
+                   }
+              }
+            else
+              {
+                 re->image_free(image);
+                 image = im_old;
+              }
+         }
+        break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       if (re->image_data_get(im) != image_data)
+         {
+            if (im->data)
+              {
+                 if (im->free_data) free(im->data);
+                 im->data = NULL;
+              }
+             if (im->cs.data)
+              {
+                 if (!im->cs.no_free) free(im->cs.data);
+              }
+            im->cs.data = image_data;
+            re->image_dirty(im);
+         }
+        break;
+      default:
+       abort();
+       break;
+     }
+   return image;
+}
+
+static void
+eng_image_data_preload_request(void *data __UNUSED__, void *image, const void *target)
+{
+   XR_Image *xim = image;
+   RGBA_Image *im;
+
+   if (!xim) return ;
+   im = (RGBA_Image*) xim->im;
+   if (!im) return ;
+   evas_cache_image_preload_data(&im->cache_entry, target);
+}
+
+static void
+eng_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target)
+{
+   XR_Image *xim = image;
+   RGBA_Image *im;
+
+   if (!xim) return ;
+   im = (RGBA_Image*) xim->im;
+   if (!im) return ;
+   evas_cache_image_preload_cancel(&im->cache_entry, target);
+}
+
+static void
+eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
+{
+   Render_Engine *re;
+
+   if ((!image) || (!surface)) return;
+
+   re = (Render_Engine *)data;
+   re->image_surface_gen((XR_Image *)image);
+   if (((XR_Image *)image)->surface)
+     re->render_surface_composite(((XR_Image *)image)->surface,
+                                  (Xrender_Surface *)surface,
+                                  (RGBA_Draw_Context *)context,
+                                  src_x, src_y, src_w, src_h,
+                                  dst_x, dst_y, dst_w, dst_h,
+                                  smooth);
+}
+
+static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+
+static void
+eng_image_cache_flush(void *data)
+{
+   Render_Engine *re;
+   int tmp_size;
+
+   re = (Render_Engine *)data;
+   tmp_size = re->image_cache_get();
+   pfunc.image_cache_flush(data);
+   re->image_cache_set(0);
+   re->image_cache_set(tmp_size);
+}
+
+static void
+eng_image_cache_set(void *data, int bytes)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   pfunc.image_cache_set(data, bytes);
+   re->image_cache_set(bytes);
+}
+
+static int
+eng_image_cache_get(void *data)
+{
+   return pfunc.image_cache_get(data);
+}
+
+static void
+eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow __UNUSED__, int oh __UNUSED__, const char *text)
+{
+   Render_Engine        *re;
+   RGBA_Image           *im;
+
+   re = (Render_Engine *)data;
+
+   re->render_surface_clips_set((Xrender_Surface *)surface, (RGBA_Draw_Context *)context, x, y, w, h);
+
+   im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(),
+                                             ((Xrender_Surface *)surface)->width,
+                                             ((Xrender_Surface *)surface)->height,
+                                             surface,
+                                             0, EVAS_COLORSPACE_ARGB8888);
+   evas_common_draw_context_font_ext_set((RGBA_Draw_Context *)context,
+                                         re->xinf,
+                                         re->font_surface_new,
+                                         re->font_surface_free,
+                                         re->font_surface_draw);
+   evas_common_font_draw(im, context, font, x, y, text);
+   evas_common_draw_context_font_ext_set(context,
+                                         NULL,
+                                         NULL,
+                                         NULL,
+                                         NULL);
+   evas_common_cpu_end_opt();
+
+   evas_cache_image_drop(&im->cache_entry);
+}
+
+static Eina_Bool
+eng_canvas_alpha_get(void *data, void *context)
+{
+   Render_Engine        *re;
+
+   re = (Render_Engine *)data;
+   return (re->destination_alpha) || (re->x11.mask);
+}
+
+/* module advertising code */
+static int
+module_open(Evas_Module *em)
+{
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+   static Eina_Bool xrm_inited = EINA_FALSE;
+   if (!xrm_inited)
+     {
+       xrm_inited = EINA_TRUE;
+       XrmInitialize();
+     }
+#endif
+
+   if (!em) return 0;
+   /* get whatever engine module we inherit from */
+   if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
+   _evas_xrender_xcb_log_dom = eina_log_domain_register("EvasSoftXrender", EVAS_DEFAULT_LOG_COLOR);
+   if(_evas_xrender_xcb_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the Software Xrender engine.\n");
+       return 0;
+     }
+   /* store it for later use */
+   func = pfunc;
+   /* now to override methods */
+#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
+   ORD(info);
+   ORD(info_free);
+   ORD(setup);
+   ORD(canvas_alpha_get);
+   ORD(output_free);
+   ORD(output_resize);
+   ORD(output_tile_size_set);
+   ORD(output_redraws_rect_add);
+   ORD(output_redraws_rect_del);
+   ORD(output_redraws_clear);
+   ORD(output_redraws_next_update_get);
+   ORD(output_redraws_next_update_push);
+   ORD(output_flush);
+   ORD(output_idle_flush);
+   ORD(output_dump);
+   ORD(rectangle_draw);
+   ORD(line_draw);
+   ORD(polygon_draw);
+
+   ORD(gradient2_color_np_stop_insert);
+   ORD(gradient2_clear);
+   ORD(gradient2_fill_transform_set);
+   ORD(gradient2_fill_spread_set);
+   ORD(gradient2_linear_new);
+   ORD(gradient2_linear_free);
+   ORD(gradient2_linear_fill_set);
+   ORD(gradient2_linear_is_opaque);
+   ORD(gradient2_linear_is_visible);
+   ORD(gradient2_linear_render_pre);
+   ORD(gradient2_linear_render_post);
+   ORD(gradient2_linear_draw);
+   ORD(gradient2_radial_new);
+   ORD(gradient2_radial_free);
+   ORD(gradient2_radial_fill_set);
+   ORD(gradient2_radial_is_opaque);
+   ORD(gradient2_radial_is_visible);
+   ORD(gradient2_radial_render_pre);
+   ORD(gradient2_radial_render_post);
+   ORD(gradient2_radial_draw);
+
+   ORD(gradient_new);
+   ORD(gradient_free);
+   ORD(gradient_color_stop_add);
+   ORD(gradient_alpha_stop_add);
+   ORD(gradient_color_data_set);
+   ORD(gradient_alpha_data_set);
+   ORD(gradient_clear);
+   ORD(gradient_fill_set);
+   ORD(gradient_fill_angle_set);
+   ORD(gradient_fill_spread_set);
+   ORD(gradient_angle_set);
+   ORD(gradient_offset_set);
+   ORD(gradient_direction_set);
+   ORD(gradient_type_set);
+   ORD(gradient_is_opaque);
+   ORD(gradient_is_visible);
+   ORD(gradient_render_pre);
+   ORD(gradient_render_post);
+   ORD(gradient_draw);
+   ORD(image_load);
+   ORD(image_new_from_data);
+   ORD(image_new_from_copied_data);
+   ORD(image_free);
+   ORD(image_size_get);
+   ORD(image_size_set);
+   ORD(image_dirty_region);
+   ORD(image_data_get);
+   ORD(image_data_put);
+   ORD(image_data_preload_request);
+   ORD(image_data_preload_cancel);
+   ORD(image_alpha_set);
+   ORD(image_alpha_get);
+   ORD(image_border_set);
+   ORD(image_border_get);
+   ORD(image_draw);
+   ORD(image_comment_get);
+   ORD(image_format_get);
+   ORD(image_colorspace_set);
+   ORD(image_colorspace_get);
+   ORD(image_native_set);
+   ORD(image_native_get);
+   ORD(image_cache_flush);
+   ORD(image_cache_set);
+   ORD(image_cache_get);
+   ORD(font_draw);
+   
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+
+//   ORD(image_map4_draw);
+//   ORD(image_map_surface_new);
+//   ORD(image_map_surface_free);
+   
+   /* now advertise out own api */
+   em->functions = (void *)(&func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+  eina_log_domain_unregister(_evas_xrender_xcb_log_dom);
+#ifdef BUILD_ENGINE_SOFTWARE_XLIB
+  if (xrdb_user.db)
+    {
+       XrmDestroyDatabase(xrdb_user.db);
+       xrdb_user.last_stat = 0;
+       xrdb_user.last_mtime = 0;
+       xrdb_user.db = NULL;
+    }
+#endif
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "xrender_x11",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, xrender_x11);
+
+#ifndef EVAS_STATIC_BUILD_XRENDER_X11
+EVAS_EINA_MODULE_DEFINE(engine, xrender_x11);
+#endif
diff --git a/src/modules/engines/xrender_x11/evas_engine.h b/src/modules/engines/xrender_x11/evas_engine.h
new file mode 100644 (file)
index 0000000..d5bea6e
--- /dev/null
@@ -0,0 +1,309 @@
+#ifndef EVAS_ENGINE_H
+#define EVAS_ENGINE_H
+
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <X11/extensions/XShm.h>
+#include <X11/extensions/Xrender.h>
+#include <X11/Xresource.h> // xres - dpi
+
+#ifdef BUILD_ENGINE_XRENDER_XCB
+# include <xcb/xcb.h>
+# include <xcb/render.h>
+# include <xcb/xcb_image.h>
+#endif
+
+extern int _evas_xrender_xcb_log_dom ;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_xrender_xcb_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_evas_xrender_xcb_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_xrender_xcb_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_evas_xrender_xcb_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_xrender_xcb_log_dom, __VA_ARGS__)
+
+typedef struct _Ximage_Info      Ximage_Info;
+typedef struct _Ximage_Image     Ximage_Image;
+typedef struct _Xrender_Surface  Xrender_Surface;
+
+struct _Ximage_Info
+{
+   struct {
+      void        *connection;
+      void        *screen;
+      unsigned int root;
+      unsigned int draw;
+      void        *visual;
+      void        *fmt32;
+      void        *fmt24;
+      void        *fmt8;
+      void        *fmt4;
+      void        *fmt1;
+      void        *fmtdef;
+   } x11;
+   int                              depth;
+   int                              pool_mem;
+   Eina_List                       *pool;
+   unsigned char                    can_do_shm;
+   Xrender_Surface                 *mul;
+   unsigned char                    mul_r, mul_g, mul_b, mul_a;
+   int                              references;
+};
+
+struct _Ximage_Image
+{
+   union {
+      struct {
+         XImage                 *xim;
+         XShmSegmentInfo        *shm_info;
+      } xlib;
+#ifdef BUILD_ENGINE_XRENDER_XCB
+      struct {
+         xcb_image_t            *xim;
+         xcb_shm_segment_info_t *shm_info;
+      } xcb;
+#endif
+   } x11;
+   Ximage_Info                  *xinf;
+   int                           width;
+   int                           height;
+   int                           depth;
+   int                           line_bytes;
+   unsigned char                *data;
+   unsigned char                 available : 1;
+};
+
+struct _Xrender_Surface
+{
+   union {
+      struct {
+         XRenderPictFormat         *fmt;
+         Drawable                   draw;
+         Picture                    pic;
+      } xlib;
+#ifdef BUILD_ENGINE_XRENDER_XCB
+      struct {
+         xcb_render_pictforminfo_t *fmt;
+         xcb_drawable_t             draw;
+         xcb_render_picture_t       pic;
+      } xcb;
+#endif
+   } x11;
+   Ximage_Info                     *xinf;
+   int                              width;
+   int                              height;
+   int                              depth;
+   unsigned char                    alpha : 1;
+   unsigned char                    allocated : 1;
+   unsigned char                    bordered : 1;
+};
+
+/* ximage support calls (ximage vs xshmimage, cache etc.) */
+Ximage_Info  *_xr_xlib_image_info_get(Display *disp, Drawable draw, Visual *vis);
+void          _xr_xlib_image_info_free(Ximage_Info *xinf);
+void          _xr_xlib_image_info_pool_flush(Ximage_Info *xinf, int max_num, int max_mem);
+Ximage_Image *_xr_xlib_image_new(Ximage_Info *xinf, int w, int h, int depth);
+void          _xr_xlib_image_free(Ximage_Image *xim);
+void          _xr_xlib_image_put(Ximage_Image *xim, Drawable draw, int x, int y, int w, int h);
+
+#ifdef BUILD_ENGINE_XRENDER_XCB
+Ximage_Info  *_xr_xcb_image_info_get(xcb_connection_t *conn, xcb_screen_t *screen, xcb_drawable_t draw, xcb_visualtype_t *visual);
+void          _xr_xcb_image_info_free(Ximage_Info *xinf);
+void          _xr_xcb_image_info_pool_flush(Ximage_Info *xinf, int max_num, int max_mem);
+Ximage_Image *_xr_xcb_image_new(Ximage_Info *xinf, int w, int h, int depth);
+void          _xr_xcb_image_free(Ximage_Image *xim);
+void          _xr_xcb_image_put(Ximage_Image *xim, xcb_drawable_t draw, int x, int y, int w, int h);
+#endif
+
+/* xrender support calls */
+Xrender_Surface *_xr_xlib_render_surface_new(Ximage_Info *xinf, int w, int h, XRenderPictFormat *fmt, int alpha);
+Xrender_Surface *_xr_xlib_render_surface_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, int alpha);
+Xrender_Surface *_xr_xlib_render_surface_format_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, XRenderPictFormat *fmt, int alpha);
+void             _xr_xlib_render_surface_free(Xrender_Surface *rs);
+void             _xr_xlib_render_surface_repeat_set(Xrender_Surface *rs, int repeat);
+void             _xr_xlib_render_surface_solid_rectangle_set(Xrender_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h);
+void             _xr_xlib_render_surface_argb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy);
+void             _xr_xlib_render_surface_rgb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy);
+void             _xr_xlib_render_surface_clips_set(Xrender_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh);
+void             _xr_xlib_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth);
+void             _xr_xlib_render_surface_copy(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int sy, int x, int y, int w, int h);
+void             _xr_xlib_render_surface_rectangle_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h);
+void             _xr_xlib_render_surface_line_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2);
+void             _xr_xlib_render_surface_polygon_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y);
+
+#ifdef BUILD_ENGINE_XRENDER_XCB
+Xrender_Surface *_xr_xcb_render_surface_new(Ximage_Info *xinf, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha);
+Xrender_Surface *_xr_xcb_render_surface_adopt(Ximage_Info *xinf, xcb_drawable_t draw, int w, int h, int alpha);
+Xrender_Surface *_xr_xcb_render_surface_format_adopt(Ximage_Info *xinf, xcb_drawable_t draw, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha);
+void             _xr_xcb_render_surface_free(Xrender_Surface *rs);
+void             _xr_xcb_render_surface_repeat_set(Xrender_Surface *rs, int repeat);
+void             _xr_xcb_render_surface_solid_rectangle_set(Xrender_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h);
+void             _xr_xcb_render_surface_argb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy);
+void             _xr_xcb_render_surface_rgb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy);
+void             _xr_xcb_render_surface_clips_set(Xrender_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh);
+void             _xr_xcb_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth);
+void             _xr_xcb_render_surface_copy(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int sy, int x, int y, int w, int h);
+void             _xr_xcb_render_surface_rectangle_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h);
+void             _xr_xcb_render_surface_line_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2);
+void             _xr_xcb_render_surface_polygon_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y);
+#endif
+
+
+typedef struct _XR_Image XR_Image;
+
+struct _XR_Image
+{
+   Ximage_Info     *xinf;
+   const char      *file;
+   const char      *key;
+   char            *fkey;
+   RGBA_Image      *im;
+   void            *data;
+   int              w, h;
+   Xrender_Surface *surface;
+   int              references;
+   char            *format;
+   const char      *comment;
+   Tilebuf         *updates;
+   RGBA_Image_Loadopts load_opts;
+   int              *load_error; /* points to Evas_Object's load_error field */
+   struct {
+      int           space;
+      void         *data;
+      unsigned char no_free : 1;
+   } cs;
+   unsigned char    alpha : 1;
+   unsigned char    dirty : 1;
+   unsigned char    free_data : 1;
+};
+
+XR_Image *_xre_xlib_image_load(Ximage_Info *xinf, const char *file, const char *key, Evas_Image_Load_Opts *lo, int *error);
+XR_Image *_xre_xlib_image_new_from_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace);
+XR_Image *_xre_xlib_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace);
+XR_Image *_xre_xlib_image_new(Ximage_Info *xinf, int w, int h);
+void      _xre_xlib_image_resize(XR_Image *im, int w, int h);
+void      _xre_xlib_image_free(XR_Image *im);
+void      _xre_xlib_image_region_dirty(XR_Image *im, int x, int y, int w, int h);
+void      _xre_xlib_image_dirty(XR_Image *im);
+XR_Image *_xre_xlib_image_copy(XR_Image *im);
+void     *_xre_xlib_image_data_get(XR_Image *im);
+XR_Image *_xre_xlib_image_data_find(void *data);
+void      _xre_xlib_image_data_put(XR_Image *im, void *data);
+void      _xre_xlib_image_alpha_set(XR_Image *im, int alpha);
+int       _xre_xlib_image_alpha_get(XR_Image *im);
+void      _xre_xlib_image_border_set(XR_Image *im, int l, int r, int t, int b);
+void      _xre_xlib_image_border_get(XR_Image *im, int *l, int *r, int *t, int *b);
+void      _xre_xlib_image_surface_gen(XR_Image *im);
+void      _xre_xlib_image_cache_set(int size);
+int       _xre_xlib_image_cache_get(void);
+
+#ifdef BUILD_ENGINE_XRENDER_XCB
+XR_Image *_xre_xcb_image_load(Ximage_Info *xinf, const char *file, const char *key, Evas_Image_Load_Opts *lo, int *error);
+XR_Image *_xre_xcb_image_new_from_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace);
+XR_Image *_xre_xcb_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace);
+XR_Image *_xre_xcb_image_new(Ximage_Info *xinf, int w, int h);
+void      _xre_xcb_image_resize(XR_Image *im, int w, int h);
+void      _xre_xcb_image_free(XR_Image *im);
+void      _xre_xcb_image_region_dirty(XR_Image *im, int x, int y, int w, int h);
+void      _xre_xcb_image_dirty(XR_Image *im);
+XR_Image *_xre_xcb_image_copy(XR_Image *im);
+void     *_xre_xcb_image_data_get(XR_Image *im);
+XR_Image *_xre_xcb_image_data_find(void *data);
+void      _xre_xcb_image_data_put(XR_Image *im, void *data);
+void      _xre_xcb_image_alpha_set(XR_Image *im, int alpha);
+int       _xre_xcb_image_alpha_get(XR_Image *im);
+void      _xre_xcb_image_border_set(XR_Image *im, int l, int r, int t, int b);
+void      _xre_xcb_image_border_get(XR_Image *im, int *l, int *r, int *t, int *b);
+void      _xre_xcb_image_surface_gen(XR_Image *im);
+void      _xre_xcb_image_cache_set(int size);
+int       _xre_xcb_image_cache_get(void);
+#endif
+
+typedef struct _XR_Font_Surface XR_Font_Surface;
+
+struct _XR_Font_Surface
+{
+   Ximage_Info     *xinf;
+   RGBA_Font_Glyph *fg;
+   int              w, h;
+   Drawable         draw;
+   Picture          pic;
+};
+
+XR_Font_Surface *_xre_xlib_font_surface_new(Ximage_Info *xinf, RGBA_Font_Glyph *fg);
+void             _xre_xlib_font_surface_free(XR_Font_Surface *fs);
+void             _xre_xlib_font_surface_draw(Ximage_Info *xinf, RGBA_Image *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y);
+
+#ifdef BUILD_ENGINE_XRENDER_XCB
+XR_Font_Surface *_xre_xcb_font_surface_new(Ximage_Info *xinf, RGBA_Font_Glyph *fg);
+void             _xre_xcb_font_surface_free(XR_Font_Surface *fs);
+void             _xre_xcb_font_surface_draw(Ximage_Info *xinf, RGBA_Image *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y);
+#endif
+
+typedef struct _XR_Gradient XR_Gradient;
+
+struct _XR_Gradient
+{
+   Ximage_Info     *xinf;
+   Xrender_Surface *surface;
+   RGBA_Gradient   *grad;
+   unsigned char    changed : 1;
+   int              sw, sh;
+};
+
+XR_Gradient *_xre_xlib_gradient_new(Ximage_Info *xinf);
+void         _xre_xlib_gradient_free(XR_Gradient *gr);
+void         _xre_xlib_gradient_color_stop_add(XR_Gradient *gr, int r, int g, int b, int a, int delta);
+void         _xre_xlib_gradient_alpha_stop_add(XR_Gradient *gr, int a, int delta);
+void         _xre_xlib_gradient_color_data_set(XR_Gradient *gr, void *map, int len, int has_alpha);
+void         _xre_xlib_gradient_alpha_data_set(XR_Gradient *gr, void *alpha_map, int len);
+void         _xre_xlib_gradient_clear(XR_Gradient *gr);
+void         _xre_xlib_gradient_fill_set(XR_Gradient *gr, int x, int y, int w, int h);
+void         _xre_xlib_gradient_fill_angle_set(XR_Gradient *gr, double angle);
+void         _xre_xlib_gradient_fill_spread_set(XR_Gradient *gr, int spread);
+void         _xre_xlib_gradient_angle_set(XR_Gradient *gr, double angle);
+void         _xre_xlib_gradient_offset_set(XR_Gradient *gr, float offset);
+void         _xre_xlib_gradient_direction_set(XR_Gradient *gr, int direction);
+void         _xre_xlib_gradient_type_set(XR_Gradient *gr, char *name, char *params);
+void         _xre_xlib_gradient_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, XR_Gradient *gr, int x, int y, int w, int h);
+
+#ifdef BUILD_ENGINE_XRENDER_XCB
+XR_Gradient *_xre_xcb_gradient_new(Ximage_Info *xinf);
+void         _xre_xcb_gradient_free(XR_Gradient *gr);
+void         _xre_xcb_gradient_color_stop_add(XR_Gradient *gr, int r, int g, int b, int a, int delta);
+void         _xre_xcb_gradient_alpha_stop_add(XR_Gradient *gr, int a, int delta);
+void         _xre_xcb_gradient_color_data_set(XR_Gradient *gr, void *map, int len, int has_alpha);
+void         _xre_xcb_gradient_alpha_data_set(XR_Gradient *gr, void *alpha_map, int len);
+void         _xre_xcb_gradient_clear(XR_Gradient *gr);
+void         _xre_xcb_gradient_fill_set(XR_Gradient *gr, int x, int y, int w, int h);
+void         _xre_xcb_gradient_fill_angle_set(XR_Gradient *gr, double angle);
+void         _xre_xcb_gradient_fill_spread_set(XR_Gradient *gr, int spread);
+void         _xre_xcb_gradient_angle_set(XR_Gradient *gr, double angle);
+void         _xre_xcb_gradient_offset_set(XR_Gradient *gr, float offset);
+void         _xre_xcb_gradient_direction_set(XR_Gradient *gr, int direction);
+void         _xre_xcb_gradient_type_set(XR_Gradient *gr, char *name, char *params);
+void         _xre_xcb_gradient_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, XR_Gradient *gr, int x, int y, int w, int h);
+#endif
+
+#endif
diff --git a/src/modules/engines/xrender_x11/evas_engine_xcb_font.c b/src/modules/engines/xrender_x11/evas_engine_xcb_font.c
new file mode 100644 (file)
index 0000000..ad3a121
--- /dev/null
@@ -0,0 +1,208 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_XRender_X11.h"
+
+static Eina_Hash *_xr_fg_pool = NULL;
+
+XR_Font_Surface *
+_xre_xcb_font_surface_new(Ximage_Info *xinf, RGBA_Font_Glyph *fg)
+{
+   char             buf[256];
+   char             buf2[256];
+   uint32_t         values[3];
+   XR_Font_Surface *fs;
+   DATA8           *data;
+   Ximage_Image    *xim;
+   Eina_Hash       *pool;
+   uint32_t         mask;
+   int              w;
+   int              h;
+   int              pitch;
+
+   data = fg->glyph_out->bitmap.buffer;
+   w = fg->glyph_out->bitmap.width;
+   h = fg->glyph_out->bitmap.rows;
+   pitch = fg->glyph_out->bitmap.pitch;
+   if (pitch < w) pitch = w;
+   if ((w <= 0) || (h <= 0)) return NULL;
+
+   if (fg->ext_dat)
+     {
+       fs = fg->ext_dat;
+       if ((fs->xinf->x11.connection == xinf->x11.connection) &&
+            (fs->xinf->x11.root == xinf->x11.root))
+         return fs;
+       snprintf(buf, sizeof(buf), "@%p@/@%x@", fs->xinf->x11.connection, fs->xinf->x11.root);
+       pool = eina_hash_find(_xr_fg_pool, buf);
+       if (pool)
+         {
+            snprintf(buf, sizeof(buf), "%p", fg);
+            fs = eina_hash_find(pool, buf);
+            if (fs) return fs;
+         }
+     }
+
+   fs = calloc(1, sizeof(XR_Font_Surface));
+   if (!fs) return NULL;
+
+   fs->xinf = xinf;
+   fs->fg = fg;
+   fs->xinf->references++;
+   fs->w = w;
+   fs->h = h;
+
+   snprintf(buf, sizeof(buf), "@%p@/@%x@", fs->xinf->x11.connection, fs->xinf->x11.root);
+   pool = eina_hash_find(_xr_fg_pool, buf);
+   if (!pool) pool = eina_hash_string_superfast_new(NULL);
+   snprintf(buf2, sizeof(buf2), "%p", fg);
+   eina_hash_add(pool, buf2, fs);
+   if (!_xr_fg_pool) _xr_fg_pool = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(_xr_fg_pool, buf, pool);
+
+   fs->draw = xcb_generate_id(xinf->x11.connection);
+   xcb_create_pixmap(xinf->x11.connection, ((xcb_render_pictforminfo_t *)xinf->x11.fmt8)->depth, fs->draw, xinf->x11.root, w, h);
+
+   mask = XCB_RENDER_CP_REPEAT | XCB_RENDER_CP_DITHER | XCB_RENDER_CP_COMPONENT_ALPHA;
+   values[0] = 0;
+   values[1] = 0;
+   values[2] = 0;
+   fs->pic = xcb_generate_id(xinf->x11.connection);
+   xcb_render_create_picture(xinf->x11.connection, fs->pic, fs->draw, ((xcb_render_pictforminfo_t *)xinf->x11.fmt8)->id, mask, values);
+
+   xim = _xr_xcb_image_new(fs->xinf, w, h, ((xcb_render_pictforminfo_t *)xinf->x11.fmt8)->depth);
+   if ((fg->glyph_out->bitmap.num_grays == 256) &&
+       (fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays))
+     {
+       int x, y;
+       DATA8 *p1, *p2;
+
+       for (y = 0; y < h; y++)
+         {
+            p1 = data + (pitch * y);
+            p2 = ((DATA8 *)xim->data) + (xim->line_bytes * y);
+            for (x = 0; x < w; x++)
+              {
+                 *p2 = *p1;
+                 p1++;
+                 p2++;
+              }
+         }
+
+     }
+   else
+     {
+        DATA8      *tmpbuf = NULL, *dp, *tp, bits;
+       int         bi, bj, end;
+       const DATA8 bitrepl[2] = {0x0, 0xff};
+
+       tmpbuf = alloca(w);
+         {
+            int    x, y;
+            DATA8 *p1, *p2;
+
+            for (y = 0; y < h; y++)
+              {
+                 p1 = tmpbuf;
+                 p2 = ((DATA8 *)xim->data) + (xim->line_bytes * y);
+                 tp = tmpbuf;
+                 dp = data + (y * fg->glyph_out->bitmap.pitch);
+                 for (bi = 0; bi < w; bi += 8)
+                   {
+                      bits = *dp;
+                      if ((w - bi) < 8) end = w - bi;
+                      else end = 8;
+                      for (bj = 0; bj < end; bj++)
+                        {
+                           *tp = bitrepl[(bits >> (7 - bj)) & 0x1];
+                           tp++;
+                        }
+                      dp++;
+                   }
+                 for (x = 0; x < w; x++)
+                   {
+                      *p2 = *p1;
+                      p1++;
+                      p2++;
+                   }
+              }
+         }
+     }
+   _xr_xcb_image_put(xim, fs->draw, 0, 0, w, h);
+   return fs;
+}
+
+static Eina_Bool
+_xre_xcb_font_pool_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+{
+   char             buf[256];
+   Eina_Hash       *pool;
+   XR_Font_Surface *fs;
+
+   fs = fdata;
+   pool = data;
+   snprintf(buf, sizeof(buf), "@%p@/@%x@", fs->xinf->x11.connection, fs->xinf->x11.root);
+   eina_hash_del(pool, buf, fs);
+   if (!hash) hash = eina_hash_string_superfast_new(NULL);
+   eina_hash_modify(hash, key, pool);
+   return 1;
+}
+
+void
+_xre_xcb_font_surface_free(XR_Font_Surface *fs)
+{
+   if (!fs) return;
+   eina_hash_foreach(_xr_fg_pool, _xre_xcb_font_pool_cb, fs);
+   xcb_free_pixmap(fs->xinf->x11.connection, fs->draw);
+   xcb_render_free_picture(fs->xinf->x11.connection, fs->pic);
+   _xr_xcb_image_info_free(fs->xinf);
+   free(fs);
+}
+
+void
+_xre_xcb_font_surface_draw(Ximage_Info *xinf __UNUSED__, RGBA_Image *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y)
+{
+   XR_Font_Surface *fs;
+   Xrender_Surface *target_surface;
+   xcb_rectangle_t  rect;
+   int              r;
+   int              g;
+   int              b;
+   int              a;
+
+   fs = fg->ext_dat;
+   if (!fs || !fs->xinf || !dc || !dc->col.col) return;
+   target_surface = (Xrender_Surface *)(surface->image.data);
+   a = (dc->col.col >> 24) & 0xff;
+   r = (dc->col.col >> 16) & 0xff;
+   g = (dc->col.col >> 8 ) & 0xff;
+   b = (dc->col.col      ) & 0xff;
+   if ((fs->xinf->mul_r != r) || (fs->xinf->mul_g != g) ||
+       (fs->xinf->mul_b != b) || (fs->xinf->mul_a != a))
+     {
+       fs->xinf->mul_r = r;
+       fs->xinf->mul_g = g;
+       fs->xinf->mul_b = b;
+       fs->xinf->mul_a = a;
+       _xr_xcb_render_surface_solid_rectangle_set(fs->xinf->mul, r, g, b, a, 0, 0, 1, 1);
+     }
+   rect.x = x;
+   rect.y = y;
+   rect.width = fs->w;
+   rect.height = fs->h;
+   if (dc->clip.use)
+     {
+       RECTS_CLIP_TO_RECT(rect.x, rect.y, rect.width, rect.height,
+                          dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h);
+     }
+   xcb_render_set_picture_clip_rectangles(target_surface->xinf->x11.connection,
+                                          target_surface->x11.xcb.pic, 0, 0, 1, &rect);
+   xcb_render_composite(fs->xinf->x11.connection, XCB_RENDER_PICT_OP_OVER,
+                        fs->xinf->mul->x11.xcb.pic,
+                        fs->pic,
+                        target_surface->x11.xcb.pic,
+                        0, 0,
+                        0, 0,
+                        x, y,
+                        fs->w, fs->h);
+}
diff --git a/src/modules/engines/xrender_x11/evas_engine_xcb_gradient.c b/src/modules/engines/xrender_x11/evas_engine_xcb_gradient.c
new file mode 100644 (file)
index 0000000..f9abe77
--- /dev/null
@@ -0,0 +1,208 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_XRender_X11.h"
+#include <math.h>
+
+XR_Gradient *
+_xre_xcb_gradient_new(Ximage_Info *xinf)
+{
+   XR_Gradient  *gr;
+
+   if (!xinf) return NULL;
+   gr = calloc(1, sizeof(XR_Gradient));
+   if (!gr) return NULL;
+   gr->grad = evas_common_gradient_new();
+   if (!gr->grad)
+     {
+       free(gr);
+       return NULL;
+     }
+   gr->xinf = xinf;
+   gr->xinf->references++;
+   gr->changed = 1;
+   return gr;
+}
+
+void
+_xre_xcb_gradient_free(XR_Gradient *gr)
+{
+   if (!gr) return;
+   if (gr->grad)
+       evas_common_gradient_free(gr->grad);
+   if (gr->surface)
+       _xr_xcb_render_surface_free(gr->surface);
+   _xr_xcb_image_info_free(gr->xinf);
+   free(gr);
+}
+
+void
+_xre_xcb_gradient_color_stop_add(XR_Gradient *gr, int r, int g, int b, int a, int delta)
+{
+   if (!gr) return;
+   evas_common_gradient_color_stop_add(gr->grad, r, g, b, a, delta);
+   gr->changed = 1;
+}
+
+void
+_xre_xcb_gradient_alpha_stop_add(XR_Gradient *gr, int a, int delta)
+{
+   if (!gr) return;
+   evas_common_gradient_alpha_stop_add(gr->grad, a, delta);
+   gr->changed = 1;
+}
+
+void
+_xre_xcb_gradient_clear(XR_Gradient *gr)
+{
+   if (!gr) return;
+   evas_common_gradient_clear(gr->grad);
+   gr->changed = 1;
+}
+
+void
+_xre_xcb_gradient_color_data_set(XR_Gradient *gr, void *map, int len, int has_alpha)
+{
+   evas_common_gradient_color_data_set(gr->grad, map, len, has_alpha);
+   gr->changed = 1;
+}
+
+void
+_xre_xcb_gradient_alpha_data_set(XR_Gradient *gr, void *amap, int len)
+{
+   evas_common_gradient_alpha_data_set(gr->grad, amap, len);
+   gr->changed = 1;
+}
+
+void
+_xre_xcb_gradient_fill_set(XR_Gradient *gr, int x, int y, int w, int h)
+{
+   if (!gr) return;
+   evas_common_gradient_fill_set(gr->grad, x, y, w, h);
+   gr->changed = 1;
+}
+
+void
+_xre_xcb_gradient_fill_angle_set(XR_Gradient *gr, double angle)
+{
+   if (!gr) return;
+   evas_common_gradient_fill_angle_set(gr->grad, angle);
+   gr->changed = 1;
+}
+
+void
+_xre_xcb_gradient_fill_spread_set(XR_Gradient *gr, int spread)
+{
+   if (!gr) return;
+   evas_common_gradient_fill_spread_set(gr->grad, spread);
+   gr->changed = 1;
+}
+
+void
+_xre_xcb_gradient_angle_set(XR_Gradient *gr, double angle)
+{
+   if (!gr) return;
+   evas_common_gradient_map_angle_set(gr->grad, angle);
+   gr->changed = 1;
+}
+
+void
+_xre_xcb_gradient_offset_set(XR_Gradient *gr, float offset)
+{
+   if (!gr) return;
+   evas_common_gradient_map_offset_set(gr->grad, offset);
+   gr->changed = 1;
+}
+
+void
+_xre_xcb_gradient_direction_set(XR_Gradient *gr, int direction)
+{
+   if (!gr) return;
+   evas_common_gradient_map_direction_set(gr->grad, direction);
+   gr->changed = 1;
+}
+
+void
+_xre_xcb_gradient_type_set(XR_Gradient *gr, char *name, char *params)
+{
+   if (!gr) return;
+   evas_common_gradient_type_set(gr->grad, name, params);
+   gr->changed = 1;
+}
+
+void
+_xre_xcb_gradient_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, XR_Gradient *gr, int x, int y, int w, int h)
+{
+   int alpha = 0;
+
+   if ((w < 1) || (h < 1)) return;
+   if (!rs || !dc || !gr) return;
+   if (!gr->xinf || !gr->grad || !gr->grad->type.geometer) return;
+
+   if (gr->grad->type.geometer->has_alpha(gr->grad, dc->render_op) ||
+       gr->grad->type.geometer->has_mask(gr->grad, dc->render_op))
+       alpha = 1;
+   if (((gr->sw != w) || (gr->sh != h)) && gr->surface)
+     {
+       _xr_xcb_render_surface_free(gr->surface);
+       gr->surface = NULL;
+       gr->changed = 1;
+     }
+   if (!gr->surface)
+     {
+       gr->surface = _xr_xcb_render_surface_new(gr->xinf, w, h, gr->xinf->x11.fmt32, 1);
+       if (!gr->surface) return;
+       gr->changed = 1;
+     }
+   if (gr->changed)
+     {
+       int op = dc->render_op, cuse = dc->clip.use;
+       RGBA_Image  *im;
+       Ximage_Image  *xim;
+
+       xim = _xr_xcb_image_new(gr->xinf, w, h, gr->surface->depth);
+       if (!xim)
+         {
+           _xr_xcb_render_surface_free(gr->surface);
+           gr->surface = NULL;
+           return;
+         }
+
+        im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(),
+                                                  w, h,
+                                                  (DATA32 *)xim->data,
+                                                  1, EVAS_COLORSPACE_ARGB8888);
+       if (!im)
+         {
+           _xr_xcb_render_surface_free(gr->surface);
+           gr->surface = NULL;
+           return;
+         }
+
+       dc->render_op = _EVAS_RENDER_FILL;
+       dc->clip.use = 0;
+       evas_common_gradient_draw(im, dc, 0, 0, w, h, gr->grad);
+       if
+#ifdef WORDS_BIGENDIAN
+          (xim->x11.xcb.xim->byte_order == XCB_IMAGE_ORDER_LSB_FIRST)
+#else
+          (xim->x11.xcb.xim->byte_order == XCB_IMAGE_ORDER_MSB_FIRST)
+#endif
+         {
+            DATA32  *p = im->image.data, *pe = p + (w * h);
+            while (p < pe)
+              {
+                 *p = (*p << 24) + ((*p << 8) & 0xff0000) + ((*p >> 8) & 0xff00) + (*p >> 24);
+                 p++;
+              }
+         }
+       _xr_xcb_image_put(xim, gr->surface->x11.xcb.draw, 0, 0, w, h);
+        evas_cache_image_drop(&im->cache_entry);
+       dc->render_op = op;
+       dc->clip.use = cuse;
+     }
+   gr->surface->alpha = alpha;
+   _xr_xcb_render_surface_composite(gr->surface, rs, dc, 0, 0, gr->surface->width, gr->surface->height, x, y, w, h, 0);
+   gr->changed = 0;
+   gr->sw = w;  gr->sh = h;
+}
diff --git a/src/modules/engines/xrender_x11/evas_engine_xcb_image.c b/src/modules/engines/xrender_x11/evas_engine_xcb_image.c
new file mode 100644 (file)
index 0000000..f1be566
--- /dev/null
@@ -0,0 +1,704 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_XRender_X11.h"
+
+static Eina_Hash *_xr_image_hash        = NULL;
+static int        _xr_image_cache_size  = 0;
+static int        _xr_image_cache_usage = 0;
+static Eina_List *_xr_image_cache       = NULL;
+static Eina_Hash *_xr_image_dirty_hash  = NULL;
+
+static void
+__xre_xcb_image_dirty_hash_add(XR_Image *im)
+{
+   char buf[64];
+
+   if (!im->data) return;
+   snprintf(buf, sizeof(buf), "%p", im->data);
+   if (!_xr_image_dirty_hash) _xr_image_dirty_hash = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(_xr_image_dirty_hash, buf, im);
+}
+
+static void
+__xre_xcb_image_dirty_hash_del(XR_Image *im)
+{
+   char buf[64];
+
+   if (!im->data) return;
+   snprintf(buf, sizeof(buf), "%p", im->data);
+   eina_hash_del(_xr_image_dirty_hash, buf, im);
+}
+
+static XR_Image *
+__xre_xcb_image_dirty_hash_find(void *data)
+{
+   char buf[64];
+
+   snprintf(buf, sizeof(buf), "%p", data);
+   return eina_hash_find(_xr_image_dirty_hash, buf);
+}
+
+static XR_Image *
+__xre_xcb_image_find(char *fkey)
+{
+   XR_Image *im;
+
+   im = eina_hash_find(_xr_image_hash, fkey);
+   if (!im)
+     {
+       Eina_List *l;
+
+       EINA_LIST_FOREACH(_xr_image_cache, l, im)
+         {
+            if (!strcmp(im->fkey, fkey))
+              {
+                 _xr_image_cache = eina_list_remove_list(_xr_image_cache, l);
+                 if (!_xr_image_hash) _xr_image_hash = eina_hash_string_superfast_new(NULL);
+                 eina_hash_add(_xr_image_hash, im->fkey, im);
+                 _xr_image_cache_usage -= (im->w * im->h * 4);
+                 break;
+              }
+            im = NULL;
+         }
+     }
+   if (im) im->references++;
+   return im;
+}
+
+XR_Image *
+_xre_xcb_image_load(Ximage_Info *xinf, const char *file, const char *key, Evas_Image_Load_Opts *lo, int *error)
+{
+   char      buf[4096];
+   XR_Image *im;
+
+   if (!file)
+     {
+       *error = EVAS_LOAD_ERROR_GENERIC;
+       return NULL;
+     }
+   if (!lo)
+     {
+       if (key)
+         snprintf(buf, sizeof(buf), "/@%p@%x@/%s//://%s", xinf->x11.connection, xinf->x11.root, file, key);
+       else
+         snprintf(buf, sizeof(buf), "/@%p@%x@/%s", xinf->x11.connection, xinf->x11.root, file);
+     }
+   else
+     {
+       if (key)
+         snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//@%p@%x@/%s//://%s", lo->scale_down_by, lo->dpi, lo->w, lo->h, xinf->x11.connection, xinf->x11.root, file, key);
+       else
+         snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//@%p@%x@/%s", lo->scale_down_by, lo->dpi, lo->w, lo->h, xinf->x11.connection, xinf->x11.root, file);
+     }
+   im = __xre_xcb_image_find(buf);
+   if (im)
+     {
+       *error = EVAS_LOAD_ERROR_NONE;
+       return im;
+     }
+
+   im = calloc(1, sizeof(XR_Image));
+   if (!im)
+     {
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       return NULL;
+     }
+   im->im = evas_common_load_image_from_file(file, key, lo, error);
+   if (!im->im)
+     {
+       free(im);
+       return NULL;
+     }
+   im->xinf = xinf;
+   im->xinf->references++;
+   im->cs.space = EVAS_COLORSPACE_ARGB8888;
+   im->fkey = strdup(buf);
+   im->file = (char *)eina_stringshare_add(file);
+   if (key) im->key = (char *)eina_stringshare_add(key);
+   im->w = im->im->cache_entry.w;
+   im->h = im->im->cache_entry.h;
+   im->references = 1;
+   if (lo) im->load_opts = *lo;
+   im->load_error = error; /* points to object's load_error */
+   if (im->im->info.comment) im->comment = (char *)eina_stringshare_add(im->im->info.comment);
+/*    if (im->im->info.format == 1) im->format = eina_stringshare_add("png"); */
+   if (im->im->cache_entry.flags.alpha) im->alpha = 1;
+   if (!_xr_image_hash) _xr_image_hash = eina_hash_string_superfast_new(NULL);
+   eina_hash_direct_add(_xr_image_hash, im->fkey, im);
+   return im;
+}
+
+XR_Image *
+_xre_xcb_image_new_from_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace)
+{
+   XR_Image *im;
+
+   im = calloc(1, sizeof(XR_Image));
+   if (!im) return NULL;
+   im->xinf = xinf;
+   im->xinf->references++;
+   im->cs.space = cspace;
+   im->w = w;
+   im->h = h;
+   im->references = 1;
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       im->data = data;
+       im->alpha = alpha;
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       im->cs.data = data;
+       im->cs.no_free = 1;
+       break;
+      default:
+       abort();
+       break;
+     }
+   im->dirty = 1;
+   __xre_xcb_image_dirty_hash_add(im);
+   return im;
+}
+
+XR_Image *
+_xre_xcb_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace)
+{
+   XR_Image *im;
+
+   im = calloc(1, sizeof(XR_Image));
+   if (!im) return NULL;
+   im->cs.space = cspace;
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       im->data = malloc(w * h * 4);
+       if (!im->data)
+         {
+            free(im);
+            return NULL;
+         }
+       if (data)
+         {
+            Gfx_Func_Copy func;
+
+            func = evas_common_draw_func_copy_get(w * h, 0);
+            if (func) func(data, im->data, w * h);
+            evas_common_cpu_end_opt();
+         }
+       im->alpha = alpha;
+       im->free_data = 1;
+        break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+        im->cs.no_free = 0;
+        im->cs.data = calloc(1, h * sizeof(unsigned char *) * 2);
+       if ((data) && (im->cs.data))
+         memcpy(im->cs.data, data, h * sizeof(unsigned char *) * 2);
+       break;
+      default:
+       abort();
+       break;
+     }
+   im->w = w;
+   im->h = h;
+   im->references = 1;
+   im->xinf = xinf;
+   im->xinf->references++;
+   im->dirty = 1;
+   __xre_xcb_image_dirty_hash_add(im);
+   return im;
+}
+
+XR_Image *
+_xre_xcb_image_new(Ximage_Info *xinf, int w, int h)
+{
+   XR_Image *im;
+
+   im = calloc(1, sizeof(XR_Image));
+   if (!im) return NULL;
+   im->data = malloc(w * h * 4);
+   if (!im->data)
+     {
+       free(im);
+       return NULL;
+     }
+   im->w = w;
+   im->h = h;
+   im->references = 1;
+   im->cs.space = EVAS_COLORSPACE_ARGB8888;
+   im->xinf = xinf;
+   im->xinf->references++;
+   im->free_data = 1;
+   im->alpha = 1;
+   im->dirty = 1;
+   __xre_xcb_image_dirty_hash_add(im);
+   return im;
+}
+
+static void
+__xre_xcb_image_real_free(XR_Image *im)
+{
+   if (im->cs.data)
+     {
+       if (!im->cs.no_free) free(im->cs.data);
+     }
+   if (im->file) eina_stringshare_del(im->file);
+   if (im->key) eina_stringshare_del(im->key);
+   if (im->fkey) free(im->fkey);
+   if (im->im) evas_cache_image_drop(&im->im->cache_entry);
+   if ((im->data) && (im->dirty)) __xre_xcb_image_dirty_hash_del(im);
+   if ((im->free_data) && (im->data)) free(im->data);
+   if (im->surface) _xr_xcb_render_surface_free(im->surface);
+   if (im->format) eina_stringshare_del(im->format);
+   if (im->comment) eina_stringshare_del(im->comment);
+   if (im->updates) evas_common_tilebuf_free(im->updates);
+   _xr_xcb_image_info_free(im->xinf);
+   free(im);
+}
+
+void
+_xre_xcb_image_free(XR_Image *im)
+{
+   im->references--;
+   if (im->references != 0) return;
+   if (!im->dirty)
+     {
+       if (im->fkey)
+         eina_hash_del(_xr_image_hash, im->fkey, im);
+       _xr_image_cache = eina_list_prepend(_xr_image_cache, im);
+       _xr_image_cache_usage += (im->w * im->h * 4);
+       _xre_xcb_image_cache_set(_xr_image_cache_size);
+     }
+   else
+     {
+       __xre_xcb_image_real_free(im);
+     }
+}
+
+void
+_xre_xcb_image_region_dirty(XR_Image *im, int x, int y, int w, int h)
+{
+   if (!im->updates)
+     {
+       im->updates = evas_common_tilebuf_new(im->w, im->h);
+       if (im->updates) evas_common_tilebuf_set_tile_size(im->updates, 8, 8);
+     }
+   if (im->updates)
+     evas_common_tilebuf_add_redraw(im->updates, x, y, w, h);
+}
+
+void
+_xre_xcb_image_dirty(XR_Image *im)
+{
+   if (im->dirty) return;
+   if (im->fkey)
+     eina_hash_del(_xr_image_hash, im->fkey, im);
+   im->dirty = 1;
+   __xre_xcb_image_dirty_hash_add(im);
+}
+
+XR_Image *
+_xre_xcb_image_copy(XR_Image *im)
+{
+   XR_Image *im2;
+   void     *data = NULL;
+
+   if (im->data) data = im->data;
+   else if (im->cs.data) data = im->cs.data;
+   else
+     {
+       if (!im->im)
+          im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts), im->load_error);
+       if (im->im)
+         {
+             evas_cache_image_load_data(&im->im->cache_entry);
+            data = im->im->image.data;
+         }
+     }
+   if (!data) return NULL;
+   im2 = _xre_xcb_image_new_from_copied_data(im->xinf, im->w, im->h, data, im->alpha, im->cs.space);
+   return im2;
+}
+
+void
+_xre_xcb_image_resize(XR_Image *im, int w, int h)
+{
+   if ((w == im->w) && (h == im->h)) return;
+   if (im->surface)
+     {
+       Xrender_Surface *old_surface;
+
+       old_surface = im->surface;
+       im->surface = _xr_xcb_render_surface_new(old_surface->xinf, w + 2, h + 2, old_surface->x11.xcb.fmt, old_surface->alpha);
+       _xr_xcb_render_surface_free(old_surface);
+     }
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (im->data)
+         {
+            if (im->free_data)
+              {
+                 if (im->data) free(im->data);
+                 im->data = malloc(w * h * 4);
+              }
+         }
+       else if (im->im)
+         {
+            evas_cache_image_drop(&im->im->cache_entry);
+            im->im = NULL;
+            if (im->free_data)
+              {
+                 if (im->data) free(im->data);
+                 im->data = malloc(w * h * 4);
+              }
+         }
+       else
+         {
+            im->data = malloc(w * h * 4);
+            im->free_data = 1;
+         }
+        break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       if (im->data)
+         {
+            if (im->free_data)
+              {
+                 if (im->data) free(im->data);
+              }
+            im->data = NULL;
+         }
+       if (im->im)
+         {
+            evas_cache_image_drop(&im->im->cache_entry);
+            im->im = NULL;
+         }
+       if (!im->cs.no_free)
+         {
+            if (im->cs.data) free(im->cs.data);
+            im->cs.data = calloc(1, h * sizeof(unsigned char *) * 2);
+         }
+       break;
+      default:
+       abort();
+       break;
+     }
+   __xre_xcb_image_dirty_hash_del(im);
+   __xre_xcb_image_dirty_hash_add(im);
+   im->w = w;
+   im->h = h;
+}
+
+void *
+_xre_xcb_image_data_get(XR_Image *im)
+{
+   void *data = NULL;
+
+   if (im->data) data = im->data;
+   else if (im->cs.data) data = im->cs.data;
+   else
+     {
+       if (!im->im) im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts), im->load_error);
+       if (im->im)
+         {
+             evas_cache_image_load_data(&im->im->cache_entry);
+            data = im->im->image.data;
+         }
+     }
+   return data;
+}
+
+XR_Image *
+_xre_xcb_image_data_find(void *data)
+{
+   XR_Image *im;
+
+   im = __xre_xcb_image_dirty_hash_find(data);
+   if (im)
+     {
+       im->references++;
+     }
+   return im;
+}
+
+void
+_xre_xcb_image_data_put(XR_Image *im, void *data)
+{
+   if (!data) return;
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (im->im)
+         {
+            if (data == im->im->image.data) return;
+            evas_cache_image_drop(&im->im->cache_entry);
+            im->im = NULL;
+         }
+       if (im->cs.data == data) return;
+       if (im->data)
+         {
+            if (im->data == data) return;
+            if (im->free_data) free(im->data);
+            im->free_data = 0;
+         }
+       im->data = data;
+       im->free_data = 0;
+        break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       if (im->data)
+         {
+            if (im->free_data) free(im->data);
+            im->data = NULL;
+         }
+       im->free_data = 0;
+       if (data == im->cs.data) return;
+       if (!im->cs.no_free)
+         {
+            if (im->cs.data) free(im->cs.data);
+         }
+       im->cs.data = data;
+       break;
+      default:
+       abort();
+       break;
+     }
+   __xre_xcb_image_dirty_hash_del(im);
+   __xre_xcb_image_dirty_hash_add(im);
+   if (im->surface)
+     {
+       _xr_xcb_render_surface_free(im->surface);
+       im->surface = NULL;
+     }
+   if (!im->dirty)
+     {
+       if (im->fkey)
+         eina_hash_del(_xr_image_hash, im->fkey, im);
+       im->dirty = 1;
+     }
+   if (im->updates)
+     {
+       evas_common_tilebuf_free(im->updates);
+       im->updates = NULL;
+     }
+}
+
+void
+_xre_xcb_image_alpha_set(XR_Image *im, int alpha)
+{
+   if (im->alpha == alpha) return;
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       im->alpha = alpha;
+       if (im->surface)
+         {
+             Xrender_Surface *old_surface;
+
+            old_surface = im->surface;
+            im->surface = NULL;
+            if (im->alpha)
+              im->surface = _xr_xcb_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt32, 1);
+            else
+              {
+                 /* FIXME: if im->depth == 16, use xinf->fmtdef */
+                 if ((im->xinf->depth == 16) &&
+                     (((xcb_visualtype_t *)im->xinf->x11.visual)->red_mask == 0xf800) &&
+                     (((xcb_visualtype_t *)im->xinf->x11.visual)->green_mask == 0x07e0) &&
+                     (((xcb_visualtype_t *)im->xinf->x11.visual)->blue_mask == 0x001f))
+                   im->surface = _xr_xcb_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmtdef, 0);
+                 else
+                   im->surface = _xr_xcb_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt24, 0);
+              }
+            if (im->surface)
+              _xr_xcb_render_surface_copy(old_surface, im->surface, 0, 0, 0, 0, im->w + 2, im->h + 2);
+            _xr_xcb_render_surface_free(old_surface);
+         }
+       if (im->updates)
+         {
+            evas_common_tilebuf_free(im->updates);
+            im->updates = NULL;
+         }
+      default:
+       break;
+     }
+}
+
+int
+_xre_xcb_image_alpha_get(XR_Image *im)
+{
+   if (im->im)
+     {
+       if (im->im->cache_entry.space != EVAS_COLORSPACE_ARGB8888) return 0;
+     }
+   return im->alpha;
+}
+
+void
+_xre_xcb_image_border_set(XR_Image *im, int l, int r, int t, int b)
+{
+   if (!im) return;
+   _xre_xcb_image_surface_gen(im);
+   if (l < 1) l = 0;
+   if (r < 1) r = 0;
+   if (t < 1) t = 0;
+   if (b < 1) b = 0;
+   if (im->surface)
+     {
+       if (l | r | t | b)
+         im->surface->bordered = 1;
+       else
+         im->surface->bordered = 0;
+    }
+}
+
+void
+_xre_xcb_image_border_get(XR_Image *im __UNUSED__, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__)
+{
+}
+
+void
+_xre_xcb_image_surface_gen(XR_Image *im)
+{
+   void *data = NULL;
+   void *tdata = NULL;
+
+   if ((im->surface) && (!im->updates)) return;
+   if (im->data) data = im->data;
+   else
+     {
+       if (!im->im) im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts), im->load_error);
+       if (im->im)
+         {
+             evas_cache_image_load_data(&im->im->cache_entry);
+            data = im->im->image.data;
+         }
+     }
+   if (!data)
+     {
+       switch (im->cs.space)
+         {
+          case EVAS_COLORSPACE_ARGB8888:
+            return;
+            break;
+          case EVAS_COLORSPACE_YCBCR422P601_PL:
+          case EVAS_COLORSPACE_YCBCR422P709_PL:
+            if ((im->cs.data) && (*((unsigned char **)im->cs.data)))
+              {
+                 tdata = malloc(im->w * im->h * sizeof(DATA32));
+                 if (tdata)
+                   evas_common_convert_yuv_420p_601_rgba(im->cs.data,
+                                                         tdata,
+                                                         im->w, im->h);
+                 data = tdata;
+              }
+            break;
+          default:
+            abort();
+            break;
+         }
+       if (!data) return;
+     }
+   if (im->surface)
+     {
+       if (im->updates)
+         {
+            Tilebuf_Rect *rects, *r;
+
+            rects = evas_common_tilebuf_get_render_rects(im->updates);
+            if (rects)
+              {
+                 EINA_INLIST_FOREACH(rects, r)
+                   {
+                      int rx, ry, rw, rh;
+
+                      rx = r->x; ry = r->y; rw = r->w, rh = r->h;
+                      RECTS_CLIP_TO_RECT(rx, ry, rw, rh, 0, 0, im->w, im->h);
+                      if (im->alpha)
+                        _xr_xcb_render_surface_argb_pixels_fill(im->surface, im->w, im->h, data, rx, ry, rw, rh, 1, 1);
+                      else
+                      /* FIXME: if im->depth == 16 - convert to 16bpp then
+                       * upload */
+                        _xr_xcb_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, rx, ry, rw, rh, 1, 1);
+                   }
+                 evas_common_tilebuf_free_render_rects(rects);
+              }
+            evas_common_tilebuf_free(im->updates);
+            im->updates = NULL;
+         }
+       if (tdata) free(tdata);
+       return;
+     }
+   if (im->alpha)
+     {
+       im->surface = _xr_xcb_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt32, 1);
+       _xr_xcb_render_surface_argb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h, 1, 1);
+     }
+   else
+     {
+       /* FIXME: if im->xinf->depth == 16, use xinf->fmtdef */
+       if ((im->xinf->depth == 16) &&
+           (((xcb_visualtype_t *)im->xinf->x11.visual)->red_mask == 0xf800) &&
+           (((xcb_visualtype_t *)im->xinf->x11.visual)->green_mask == 0x07e0) &&
+           (((xcb_visualtype_t *)im->xinf->x11.visual)->blue_mask == 0x001f))
+         im->surface = _xr_xcb_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmtdef, 0);
+       else
+         im->surface = _xr_xcb_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt24, 0);
+       /* FIXME: if im->depth == 16 - convert to 16bpp then
+        * upload */
+       _xr_xcb_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h, 1, 1);
+     }
+   /* fill borders */
+   _xr_xcb_render_surface_copy(im->surface, im->surface,
+                          1, 1,
+                          0, 1,
+                          1, im->h);
+   _xr_xcb_render_surface_copy(im->surface, im->surface,
+                          0, 1,
+                          0, 0,
+                          im->w + 2, 1);
+   _xr_xcb_render_surface_copy(im->surface, im->surface,
+                          im->w, 1,
+                          im->w + 1, 1,
+                          1, im->h);
+   _xr_xcb_render_surface_copy(im->surface, im->surface,
+                          0, im->h,
+                          0, im->h + 1,
+                          im->w + 2, 1);
+   if ((im->im) && (!im->dirty))
+     {
+       evas_cache_image_drop(&im->im->cache_entry);
+       im->im = NULL;
+     }
+   if (tdata) free(tdata);
+}
+
+void
+_xre_xcb_image_cache_set(int size)
+{
+   _xr_image_cache_size = size;
+   while (_xr_image_cache_usage > _xr_image_cache_size)
+     {
+       Eina_List *l;
+
+       l = eina_list_last(_xr_image_cache);
+       if (l)
+         {
+            XR_Image *im;
+
+            im = l->data;
+            _xr_image_cache = eina_list_remove_list(_xr_image_cache, l);
+            _xr_image_cache_usage -= (im->w * im->h * 4);
+            __xre_xcb_image_real_free(im);
+         }
+     }
+}
+
+int
+_xre_xcb_image_cache_get(void)
+{
+   return _xr_image_cache_size;
+}
diff --git a/src/modules/engines/xrender_x11/evas_engine_xcb_render.c b/src/modules/engines/xrender_x11/evas_engine_xcb_render.c
new file mode 100644 (file)
index 0000000..9b4825b
--- /dev/null
@@ -0,0 +1,844 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+#include "evas_common.h"
+/* #include "evas_macros.h" */
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_XRender_X11.h"
+#include <math.h>
+
+/* As opposed to libXRender, we don't have
+ * XDoubleToFixed in XCB :/
+ */
+#define DOUBLE_TO_FIXED(d) ((xcb_render_fixed_t) ((d) * 65536))
+
+/* this is a work around broken xrender - when/if this ever gets fixed in xorg
+ * we can comment this out and one day remove it - for now keep it until such
+ * a fix is spotted in the wild
+ */
+#define BROKEN_XORG_XRENDER 1
+
+static inline void
+set_filter(Xrender_Surface *s, int smooth)
+{
+   const char *f = smooth ? "best": "nearest";
+
+   xcb_render_set_picture_filter (s->xinf->x11.connection, s->x11.xcb.pic, strlen (f), f, 0, NULL);
+}
+
+xcb_render_pictforminfo_t *
+xcb_render_find_visual_format (xcb_connection_t *c, xcb_visualtype_t *visual)
+{
+  xcb_render_query_pict_formats_cookie_t cookie;
+  xcb_render_query_pict_formats_reply_t *rep;
+  xcb_render_pictscreen_iterator_t       screen_iter;
+  xcb_render_pictformat_t                format = { 0 };
+
+  cookie = xcb_render_query_pict_formats (c);
+  rep = xcb_render_query_pict_formats_reply (c, cookie, NULL);
+  if (!rep)
+    return NULL;
+
+  screen_iter = xcb_render_query_pict_formats_screens_iterator (rep);
+  for (; screen_iter.rem; xcb_render_pictscreen_next (&screen_iter)) {
+    xcb_render_pictdepth_iterator_t depth_iter;
+
+    depth_iter = xcb_render_pictscreen_depths_iterator (screen_iter.data);
+    for (; depth_iter.rem; xcb_render_pictdepth_next (&depth_iter)) {
+      xcb_render_pictvisual_iterator_t visual_iter;
+
+      visual_iter = xcb_render_pictdepth_visuals_iterator (depth_iter.data);
+      for (; visual_iter.rem; xcb_render_pictvisual_next (&visual_iter)) {
+        if (visual->visual_id == visual_iter.data->visual) {
+          format = visual_iter.data->format;
+        }
+      }
+    }
+  }
+
+  if (format != 0)
+    {
+       xcb_render_pictforminfo_iterator_t forminfo_iter;
+
+       forminfo_iter = xcb_render_query_pict_formats_formats_iterator (rep);
+       for (; forminfo_iter.rem; xcb_render_pictforminfo_next (&forminfo_iter)) {
+          if (forminfo_iter.data->id == format) {
+             xcb_render_pictforminfo_t *forminfo;
+
+             forminfo = (xcb_render_pictforminfo_t *)malloc (sizeof (xcb_render_pictforminfo_t));
+             memcpy (forminfo, forminfo_iter.data, sizeof (xcb_render_pictforminfo_t));
+             free (rep);
+
+             return forminfo;
+          }
+       }
+    }
+
+  return NULL;
+}
+
+Xrender_Surface *
+_xr_xcb_render_surface_new(Ximage_Info *xinf, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha)
+{
+   Xrender_Surface *rs;
+   uint32_t            mask;
+   uint32_t            values[3];
+
+   if ((!xinf) || (!fmt) || (w < 1) || (h < 1)) return NULL;
+
+   rs = calloc(1, sizeof(Xrender_Surface));
+   if (!rs) return NULL;
+   rs->xinf = xinf;
+   rs->width = w;
+   rs->height = h;
+   rs->x11.xcb.fmt = (xcb_render_pictforminfo_t *)malloc (sizeof (xcb_render_pictforminfo_t));
+   if (!rs->x11.xcb.fmt)
+     {
+        free(rs);
+        return NULL;
+     }
+   memcpy (rs->x11.xcb.fmt, fmt, sizeof (xcb_render_pictforminfo_t));
+   rs->alpha = alpha;
+   rs->depth = fmt->depth;
+   rs->allocated = 1;
+   rs->x11.xcb.draw = xcb_generate_id(xinf->x11.connection);
+   xcb_create_pixmap(xinf->x11.connection, fmt->depth, rs->x11.xcb.draw, xinf->x11.root, w, h);
+   if (rs->x11.xcb.draw == XCB_NONE)
+     {
+       free(rs->x11.xcb.fmt);
+       free(rs);
+       return NULL;
+     }
+   rs->xinf->references++;
+   mask = XCB_RENDER_CP_REPEAT | XCB_RENDER_CP_DITHER | XCB_RENDER_CP_COMPONENT_ALPHA;
+   values[0] = 0;
+   values[1] = 1;
+   values[2] = 0;
+   rs->x11.xcb.pic = xcb_generate_id(xinf->x11.connection);
+   xcb_render_create_picture(xinf->x11.connection, rs->x11.xcb.pic, rs->x11.xcb.draw, fmt->id, mask, values);
+   if (rs->x11.xcb.pic == XCB_NONE)
+     {
+       xcb_free_pixmap(rs->xinf->x11.connection, rs->x11.xcb.draw);
+       rs->xinf->references--;
+       free(rs->x11.xcb.fmt);
+       free(rs);
+       return NULL;
+     }
+
+   return rs;
+}
+
+Xrender_Surface *
+_xr_xcb_render_surface_adopt(Ximage_Info *xinf, xcb_drawable_t draw, int w, int h, int alpha)
+{
+   Xrender_Surface        *rs;
+   uint32_t                   mask;
+   uint32_t                   values[3];
+
+   if ((!xinf) || (draw == 0) || (w < 1) || (h < 1)) return NULL;
+   rs = calloc(1, sizeof(Xrender_Surface));
+   if (!rs) return NULL;
+   rs->xinf = xinf;
+   rs->width = w;
+   rs->height = h;
+/*    if (fmt->depth == xinf->fmt32->depth) */
+/*      rs->x11.xcb.fmt = xinf->fmt32; */
+/*    else if (fmt->depth == xinf->fmt24->depth) */
+/*      rs->x11.xcb.fmt = xinf->fmt24; */
+/*    else if (fmt->depth == xinf->fmt8->depth) */
+/*      rs->x11.xcb.fmt = xinf->fmt8; */
+/*    else if (fmt->depth == xinf->fmt4->depth) */
+/*      rs->x11.xcb.fmt = xinf->fmt4; */
+/*    else */
+/*      rs->x11.xcb.fmt = xinf->fmt1; */
+/*    free(fmt); */
+
+   rs->x11.xcb.fmt = xcb_render_find_visual_format(xinf->x11.connection, xinf->x11.visual);
+   if (!rs->x11.xcb.fmt)
+     {
+        free(rs);
+        return NULL;
+     }
+   rs->alpha = alpha;
+   rs->depth = rs->x11.xcb.fmt->depth;
+   if (rs->x11.xcb.fmt->depth == 32) rs->alpha = 1;
+   rs->allocated = 0;
+   rs->x11.xcb.draw = draw;
+   rs->xinf->references++;
+   mask = XCB_RENDER_CP_REPEAT | XCB_RENDER_CP_DITHER | XCB_RENDER_CP_COMPONENT_ALPHA;
+   values[0] = 0;
+   values[1] = 1;
+   values[2] = 0;
+   rs->x11.xcb.pic = xcb_generate_id(xinf->x11.connection);
+   xcb_render_create_picture(xinf->x11.connection, rs->x11.xcb.pic, rs->x11.xcb.draw, rs->x11.xcb.fmt->id, mask, values);
+   if (rs->x11.xcb.pic == XCB_NONE)
+     {
+       rs->xinf->references--;
+       free(rs->x11.xcb.fmt);
+       free(rs);
+       return NULL;
+     }
+
+   return rs;
+}
+
+Xrender_Surface *
+_xr_xcb_render_surface_format_adopt(Ximage_Info *xinf, xcb_drawable_t draw, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha)
+{
+   Xrender_Surface *rs;
+   uint32_t            mask;
+   uint32_t            values[3];
+
+   if ((!xinf) || (!fmt) || (draw == XCB_NONE) || (w < 1) || (h < 1)) return NULL;
+   rs = calloc(1, sizeof(Xrender_Surface));
+   if (!rs) return NULL;
+   rs->xinf = xinf;
+   rs->width = w;
+   rs->height = h;
+   rs->x11.xcb.fmt = (xcb_render_pictforminfo_t *)malloc (sizeof (xcb_render_pictforminfo_t));
+   memcpy (rs->x11.xcb.fmt, fmt, sizeof (xcb_render_pictforminfo_t));
+   rs->alpha = alpha;
+   rs->depth = fmt->depth;
+   if (fmt->depth == 32) rs->alpha = 1;
+   rs->xinf->references++;
+   rs->allocated = 0;
+   rs->x11.xcb.draw = draw;
+   mask = XCB_RENDER_CP_REPEAT | XCB_RENDER_CP_DITHER | XCB_RENDER_CP_COMPONENT_ALPHA;
+   values[0] = 0;
+   values[1] = 1;
+   values[2] = 0;
+   rs->x11.xcb.pic = xcb_generate_id(xinf->x11.connection);
+   xcb_render_create_picture(xinf->x11.connection, rs->x11.xcb.pic, rs->x11.xcb.draw, fmt->id, mask, values);
+   if (rs->x11.xcb.pic == XCB_NONE)
+     {
+       rs->xinf->references--;
+       free(rs->x11.xcb.fmt);
+       free(rs);
+       return NULL;
+     }
+
+   return rs;
+}
+
+void
+_xr_xcb_render_surface_free(Xrender_Surface *rs)
+{
+   if (!rs) return;
+   if (rs->xinf)
+     {
+       if ((rs->allocated) && (rs->x11.xcb.draw != XCB_NONE))
+          xcb_free_pixmap(rs->xinf->x11.connection, rs->x11.xcb.draw);
+       if (rs->x11.xcb.pic != XCB_NONE)
+          xcb_render_free_picture(rs->xinf->x11.connection, rs->x11.xcb.pic);
+       _xr_xcb_image_info_free(rs->xinf);
+       rs->xinf = NULL;
+     }
+   free(rs->x11.xcb.fmt);
+   free(rs);
+}
+
+void
+_xr_xcb_render_surface_repeat_set(Xrender_Surface *rs, int repeat)
+{
+   uint32_t mask;
+   uint32_t value[1];
+
+   mask = XCB_RENDER_CP_REPEAT;
+   value[0] = repeat;
+   xcb_render_change_picture(rs->xinf->x11.connection, rs->x11.xcb.pic, mask, value);
+}
+
+void
+_xr_xcb_render_surface_solid_rectangle_set(Xrender_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h)
+{
+   xcb_render_color_t col;
+   xcb_rectangle_t    rect;
+
+   col.red   = (r << 8) | r;
+   col.green = (g << 8) | g;
+   col.blue  = (b << 8) | b;
+   col.alpha = (a << 8) | a;
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   xcb_render_fill_rectangles(rs->xinf->x11.connection, XCB_RENDER_PICT_OP_SRC, rs->x11.xcb.pic, col, 1, &rect);
+}
+
+void
+_xr_xcb_render_surface_argb_pixels_fill(Xrender_Surface *rs, int sw, int sh __UNUSED__, void *pixels, int x, int y, int w, int h, int ox, int oy)
+{
+   Ximage_Image  *xim;
+   unsigned int  *p, *sp, *sple, *spe;
+   unsigned int   jump, sjump;
+
+   xim = _xr_xcb_image_new(rs->xinf, w, h, rs->depth);
+   if (!xim) return;
+   p = (unsigned int *)xim->data;
+   sp = ((unsigned int *)pixels) + (y * sw) + x;
+   jump = ((xim->line_bytes / 4) - w);
+   sjump = sw - w;
+   spe = sp + ((h - 1) * sw) + w;
+   if
+#ifdef WORDS_BIGENDIAN
+     (xim->x11.xcb.xim->byte_order == XCB_IMAGE_ORDER_LSB_FIRST)
+#else
+     (xim->x11.xcb.xim->byte_order == XCB_IMAGE_ORDER_MSB_FIRST)
+#endif
+     {
+       while (sp < spe)
+         {
+            sple = sp + w;
+            while (sp < sple)
+              {
+                 *p++ = (*sp << 24) + ((*sp << 8) & 0xff0000) + ((*sp >> 8) & 0xff00) + (*sp >> 24);
+//               *p++ = (B_VAL(sp) << 24) | (G_VAL(sp) << 16) | (R_VAL(sp) << 8) | A_VAL(sp);
+                 sp++;
+              }
+            p += jump;
+            sp += sjump;
+         }
+     }
+   else
+     {
+       while (sp < spe)
+         {
+            sple = sp + w;
+            while (sp < sple)
+               *p++ = *sp++;
+            p += jump;
+            sp += sjump;
+         }
+     }
+   _xr_xcb_image_put(xim, rs->x11.xcb.draw, x + ox, y + oy, w, h);
+}
+
+void
+_xr_xcb_render_surface_rgb_pixels_fill(Xrender_Surface *rs, int sw, int sh __UNUSED__, void *pixels, int x, int y, int w, int h, int ox, int oy)
+{
+   Ximage_Image *xim;
+   unsigned int *p, *sp, *sple, *spe;
+   unsigned int  jump, sjump;
+
+   xim = _xr_xcb_image_new(rs->xinf, w, h, rs->depth);
+   if (!xim) return;
+   p = (unsigned int *)xim->data;
+   sp = ((unsigned int *)pixels) + (y * sw) + x;
+   sjump = sw - w;
+   spe = sp + ((h - 1) * sw) + w;
+   if (rs->depth == 16)
+     {
+       /* FIXME: if rs->depth == 16 - convert */
+       Gfx_Func_Convert conv_func;
+       int swap;
+
+       jump = ((xim->line_bytes / 2) - w);
+
+#ifdef WORDS_BIGENDIAN
+       swap = (int)(xim->x11.xcb.xim->byte_order == XCB_IMAGE_ORDER_LSB_FIRST);
+#else
+       swap = (int)(xim->x11.xcb.xim->byte_order == XCB_IMAGE_ORDER_MSB_FIRST);
+#endif
+       /* FIXME: swap not handled */
+       conv_func = evas_common_convert_func_get((DATA8 *)sp, w, h, rs->depth,
+                                                ((xcb_visualtype_t *)rs->xinf->x11.visual)->red_mask,
+                                                ((xcb_visualtype_t *)rs->xinf->x11.visual)->green_mask,
+                                                ((xcb_visualtype_t *)rs->xinf->x11.visual)->blue_mask,
+                                                PAL_MODE_NONE, 0);
+       if (conv_func)
+         conv_func(sp, (DATA8 *)p, sjump, jump, w, h, x, y, NULL);
+     }
+   else
+     {
+       jump = ((xim->line_bytes / 4) - w);
+       if
+#ifdef WORDS_BIGENDIAN
+         (xim->x11.xcb.xim->byte_order == XCB_IMAGE_ORDER_LSB_FIRST)
+#else
+         (xim->x11.xcb.xim->byte_order == XCB_IMAGE_ORDER_MSB_FIRST)
+#endif
+           {
+              while (sp < spe)
+                {
+                   sple = sp + w;
+                   while (sp < sple)
+                     {
+                        *p++ = (*sp << 24) + ((*sp << 8) & 0xff0000) + ((*sp >> 8) & 0xff00) + 0xff;
+//               *p++ = ((B_VAL(sp)) << 24) | ((G_VAL(sp)) << 16) | ((R_VAL(sp)) << 8) | 0x000000ff;
+                        sp++;
+                     }
+                   p += jump;
+                   sp += sjump;
+                }
+           }
+       else
+         {
+            while (sp < spe)
+              {
+                 sple = sp + w;
+                 while (sp < sple)
+                   *p++ = 0xff000000 | *sp++;
+                 p += jump;
+                 sp += sjump;
+              }
+         }
+     }
+   _xr_xcb_image_put(xim, rs->x11.xcb.draw, x + ox, y + oy, w, h);
+}
+
+void
+_xr_xcb_render_surface_clips_set(Xrender_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh)
+{
+   int              num = 0;
+   xcb_rectangle_t *rect = NULL;
+
+   if ((dc) && (dc->clip.use))
+     {
+       RECTS_CLIP_TO_RECT(rx, ry, rw, rh,
+                          dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h);
+     }
+   if ((!dc) || (!dc->cutout.rects))
+     {
+       rect = malloc(sizeof(xcb_rectangle_t));
+       if (!rect) return;
+       rect->x = rx;
+       rect->y = ry;
+       rect->width = rw;
+       rect->height = rh;
+       num = 1;
+     }
+   else
+     {
+        Cutout_Rects    *rects;
+       Cutout_Rect     *r;
+       int             i;
+
+       rects = evas_common_draw_context_apply_cutouts(dc);
+       num = rects->active;
+       rect = malloc(num * sizeof(xcb_rectangle_t));
+       if (!rect) return;
+       for (i = 0; i < num; i++)
+         {
+            r = rects->rects + i;
+            rect[i].x = r->x;
+            rect[i].y = r->y;
+            rect[i].width = r->w;
+            rect[i].height = r->h;
+         }
+       evas_common_draw_context_apply_clear_cutouts(rects);
+     }
+   if (!rect) return;
+   xcb_render_set_picture_clip_rectangles(rs->xinf->x11.connection, rs->x11.xcb.pic, 0, 0, num, rect);
+   free(rect);
+}
+
+/* initialized the transform to the identity */
+static void
+init_transform (xcb_render_transform_t *t)
+{
+   t->matrix11 = t->matrix22 = t->matrix33 = DOUBLE_TO_FIXED(1);
+
+   t->matrix12 = t->matrix13 = t->matrix21 = t->matrix23 =
+   t->matrix31 = t->matrix32 = 0;
+}
+
+static void
+set_transform_scale(xcb_render_transform_t *t,
+                    int                     sw,
+                    int                     sh,
+                    int                     w,
+                    int                     h,
+                    int                     tx,
+                    int                     ty)
+{
+/*    if ((sw > 1) && (w > 1)) */
+/*      { sw--;  w--; } */
+/*    if ((sh > 1) && (h > 1)) */
+/*      { sh--;  h--; } */
+   t->matrix11 = DOUBLE_TO_FIXED((double)sw / (double)w);
+   t->matrix22 = DOUBLE_TO_FIXED((double)sh / (double)h);
+   t->matrix31 = (tx * sw) / w;
+   t->matrix32 = (ty * sh) / h;
+}
+
+// when color multiplier is used want: instead
+// CA src IN mask SRC temp; non-CA temp OVER dst. - i think. need to check.
+void
+_xr_xcb_render_surface_composite(Xrender_Surface *srs,
+                             Xrender_Surface *drs,
+                             RGBA_Draw_Context  *dc,
+                             int                 sx,
+                             int                 sy,
+                             int                 sw,
+                             int                 sh,
+                             int                 x,
+                             int                 y,
+                             int                 w,
+                             int                 h,
+                             int                 smooth)
+{
+   Xrender_Surface    *trs = NULL;
+   xcb_render_transform_t xf;
+   xcb_render_picture_t   mask = XCB_NONE;
+   uint32_t               value_mask;
+   uint32_t               value_list[1];
+   int                    e, is_scaling;
+   xcb_render_pict_op_t   op;
+
+   if ((sw <= 0) || (sh <= 0) || (w <= 0) || (h <= 0)) return;
+
+   is_scaling = e = (sw != w) || (sh != h);
+
+   value_mask = XCB_RENDER_CP_CLIP_MASK;
+   value_list[0] = 0;
+   xcb_render_change_picture(srs->xinf->x11.connection, srs->x11.xcb.pic, value_mask, value_list);
+   xcb_render_change_picture(drs->xinf->x11.connection, drs->x11.xcb.pic, value_mask, value_list);
+
+   init_transform(&xf);
+
+   op = XCB_RENDER_PICT_OP_OVER;
+   if (dc->render_op == _EVAS_RENDER_BLEND)
+     {
+       if (!srs->alpha) op = XCB_RENDER_PICT_OP_SRC;
+     }
+   else if (dc->render_op == _EVAS_RENDER_BLEND_REL)
+       op = XCB_RENDER_PICT_OP_ATOP;
+   else if (dc->render_op == _EVAS_RENDER_MUL)
+       op = XCB_RENDER_PICT_OP_IN;
+   else if (dc->render_op == _EVAS_RENDER_COPY)
+       op = XCB_RENDER_PICT_OP_SRC;
+   else if (dc->render_op == _EVAS_RENDER_COPY_REL)
+       op = XCB_RENDER_PICT_OP_IN;
+   else if (dc->render_op == _EVAS_RENDER_MASK)
+       op = XCB_RENDER_PICT_OP_IN_REVERSE;
+
+   if ((dc) && (dc->mul.use))
+     {
+       int r, g, b, a;
+
+       if ((op == XCB_RENDER_PICT_OP_OVER) && (!dc->mul.col)) return;
+       a = dc->mul.col >> 24;
+       r = (dc->mul.col >> 16) & 0xff;
+       g = (dc->mul.col >> 8) & 0xff;
+       b = dc->mul.col & 0xff;
+       if (dc->mul.col != 0xffffffff)
+         {
+            if ((srs->xinf->mul_r != r) || (srs->xinf->mul_g != g) ||
+                (srs->xinf->mul_b != b) || (srs->xinf->mul_a != a))
+              {
+                 srs->xinf->mul_r = r;
+                 srs->xinf->mul_g = g;
+                 srs->xinf->mul_b = b;
+                 srs->xinf->mul_a = a;
+                 _xr_xcb_render_surface_solid_rectangle_set(srs->xinf->mul,
+                                                        r,
+                                                        g,
+                                                        b,
+                                                        a,
+                                                        0, 0, 1, 1);
+              }
+            mask = srs->xinf->mul->x11.xcb.pic;
+            if (dc->mul.col == (a * 0x01010101))
+              {
+                 value_mask = XCB_RENDER_CP_COMPONENT_ALPHA;
+                 value_list[0] = 0;
+                 xcb_render_change_picture(srs->xinf->x11.connection, mask, value_mask, value_list);
+              }
+            else
+              {
+                 if ((srs->alpha) || (a != 0xff))
+                   trs = _xr_xcb_render_surface_new(srs->xinf, sw + 2, sh + 2,
+                                                srs->xinf->x11.fmt32, 1);
+                 else
+                   trs = _xr_xcb_render_surface_new(srs->xinf, sw + 2, sh + 2,
+                                                srs->x11.xcb.fmt, srs->alpha);
+                 if (!trs) return;
+
+                 value_mask = XCB_RENDER_CP_COMPONENT_ALPHA;
+                 value_list[0] = 1;
+                 xcb_render_change_picture(srs->xinf->x11.connection, mask, value_mask, value_list);
+                 xcb_render_set_picture_transform(trs->xinf->x11.connection, srs->x11.xcb.pic, xf);
+                 xcb_render_composite(srs->xinf->x11.connection, XCB_RENDER_PICT_OP_SRC, srs->x11.xcb.pic, mask, trs->x11.xcb.pic,
+                                      sx, sy, sx, sy, 0, 0, sw + 2, sh + 2);
+                  mask = XCB_NONE;
+              }
+         }
+     }
+
+//#define HFW + (sw / 2)
+//#define HFH + (sh / 2)
+#define HFW
+#define HFH
+
+   _xr_xcb_render_surface_clips_set(drs, dc, x, y, w, h);
+   if (trs)
+     {
+        set_filter(trs, smooth);
+
+        set_transform_scale(&xf, sw, sh, w, h, -1, -1);
+        xcb_render_set_picture_transform(trs->xinf->x11.connection, trs->x11.xcb.pic, xf);
+
+        value_mask = XCB_RENDER_CP_COMPONENT_ALPHA;
+        value_list[0] = 0;
+       if (dc->render_op == _EVAS_RENDER_MUL)
+           value_list[0] = 1;
+        xcb_render_change_picture(trs->xinf->x11.connection, trs->x11.xcb.pic, value_mask, value_list);
+
+        xcb_render_composite(trs->xinf->x11.connection, op, trs->x11.xcb.pic, mask, drs->x11.xcb.pic,
+                             (w HFW) / sw, (h HFH) / sh,
+                             (w HFW) / sw, (h HFH) / sh,
+                             x, y, w, h);
+        _xr_xcb_render_surface_free(trs);
+     }
+   else
+     {
+        if (srs->bordered && is_scaling)
+         {
+           trs = _xr_xcb_render_surface_new(srs->xinf, sw + 2, sh + 2,
+                                        srs->x11.xcb.fmt, srs->alpha);
+           if (!trs) return;
+
+            value_mask = XCB_RENDER_CP_COMPONENT_ALPHA;
+            value_list[0] = 0;
+            xcb_render_change_picture(srs->xinf->x11.connection, srs->x11.xcb.pic, value_mask, value_list);
+            xcb_render_set_picture_transform(srs->xinf->x11.connection, srs->x11.xcb.pic, xf);
+            xcb_render_composite(srs->xinf->x11.connection, XCB_RENDER_PICT_OP_SRC, srs->x11.xcb.pic, XCB_NONE, trs->x11.xcb.pic,
+                                 sx, sy, sx, sx, 0, 0, sw + 2, sh + 2);
+
+            set_filter(trs, smooth);
+
+           set_transform_scale(&xf, sw, sh, w, h, -1, -1);
+            xcb_render_set_picture_transform(trs->xinf->x11.connection, trs->x11.xcb.pic, xf);
+
+           if (dc->render_op == _EVAS_RENDER_MUL)
+             {
+                 value_mask = XCB_RENDER_CP_COMPONENT_ALPHA;
+                 value_list[0] = 1;
+                 xcb_render_change_picture(trs->xinf->x11.connection, trs->x11.xcb.pic, value_mask, value_list);
+             }
+
+            xcb_render_composite(trs->xinf->x11.connection, op, trs->x11.xcb.pic, mask, drs->x11.xcb.pic,
+                                 (w HFW) / sw, (h HFH) / sh,
+                                 (w HFW) / sw, (h HFH) / sh,
+                                 x, y, w, h);
+           _xr_xcb_render_surface_free(trs);
+         }
+       else
+         {
+            set_filter(srs, smooth);
+
+           set_transform_scale(&xf, sw, sh, w, h, 0, 0);
+            xcb_render_set_picture_transform(srs->xinf->x11.connection, srs->x11.xcb.pic, xf);
+
+            value_mask = XCB_RENDER_CP_COMPONENT_ALPHA;
+            value_list[0] = 0;
+           if (dc->render_op == _EVAS_RENDER_MUL)
+               value_list[0] = 1;
+            xcb_render_change_picture(srs->xinf->x11.connection, srs->x11.xcb.pic, value_mask, value_list);
+
+            xcb_render_composite(srs->xinf->x11.connection, op, srs->x11.xcb.pic, mask, drs->x11.xcb.pic,
+                                 ((((sx + 1) * w) HFW) / sw),
+                                 ((((sy + 1) * h) HFH) / sh),
+                                 ((((sx + 1) * w) HFW) / sw),
+                                 ((((sy + 1) * h) HFH) / sh),
+                                 x, y, w, h);
+         }
+      }
+}
+
+void
+_xr_xcb_render_surface_copy(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int sy, int x, int y, int w, int h)
+{
+   xcb_render_transform_t xf;
+   uint32_t               value_mask;
+   uint32_t               value_list[1];
+
+   if ((w <= 0) || (h <= 0) || (!srs) || (!drs)) return;
+
+   init_transform(&xf);
+#ifdef BROKEN_XORG_XRENDER
+   /* FIXME: why do we need to change the identity matrix if the src surface
+    *        is 1 bit deep?
+    */
+   if (srs->depth == 1)
+     {
+       xf.matrix11 = xf.matrix22 = xf.matrix33 = 1;
+     }
+#endif
+   xcb_render_set_picture_transform(srs->xinf->x11.connection, srs->x11.xcb.pic, xf);
+/*    set_filter(srs, 0); */
+
+   value_mask = XCB_RENDER_CP_CLIP_MASK;
+   value_list[0] = 0;
+   xcb_render_change_picture(srs->xinf->x11.connection, srs->x11.xcb.pic, value_mask, value_list);
+   xcb_render_change_picture(drs->xinf->x11.connection, drs->x11.xcb.pic, value_mask, value_list);
+
+   xcb_render_composite(srs->xinf->x11.connection, XCB_RENDER_PICT_OP_SRC, srs->x11.xcb.pic, XCB_NONE, drs->x11.xcb.pic,
+                        sx, sy, 0, 0, x, y, w, h);
+}
+
+void
+_xr_xcb_render_surface_rectangle_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h)
+{
+   xcb_render_color_t   col;
+   xcb_rectangle_t      rect;
+   uint32_t             value_mask;
+   uint32_t             value_list;
+   int                  r, g, b, a;
+   xcb_render_pict_op_t op;
+
+   if ((!rs) || (!dc)) return;
+   if ((w <= 0) || (h <= 0)) return;
+   a = dc->col.col >> 24;
+   r = (dc->col.col >> 16) & 0xff;
+   g = (dc->col.col >> 8 ) & 0xff;
+   b = (dc->col.col      ) & 0xff;
+   col.red   = (r << 8) | r;
+   col.green = (g << 8) | g;
+   col.blue  = (b << 8) | b;
+   col.alpha = (a << 8) | a;
+
+   op = XCB_RENDER_PICT_OP_SRC;
+   if (dc->render_op == _EVAS_RENDER_BLEND)
+     {
+       if (!dc->col.col) return;
+       if (a == 0xff) op = XCB_RENDER_PICT_OP_SRC;
+     }
+   else if (dc->render_op == _EVAS_RENDER_BLEND_REL)
+     {
+       if (!dc->col.col) return;
+       op = XCB_RENDER_PICT_OP_ATOP;
+     }
+   else if (dc->render_op == _EVAS_RENDER_MUL)
+     {
+       if (dc->col.col == 0xffffffff) return;
+       op = XCB_RENDER_PICT_OP_IN;
+     }
+   else if (dc->render_op == _EVAS_RENDER_COPY)
+       op = XCB_RENDER_PICT_OP_SRC;
+   else if (dc->render_op == _EVAS_RENDER_COPY_REL)
+       op = XCB_RENDER_PICT_OP_IN;
+   else if (dc->render_op == _EVAS_RENDER_MASK)
+       op = XCB_RENDER_PICT_OP_IN_REVERSE;
+
+   value_mask = XCB_RENDER_CP_CLIP_MASK;
+   value_list = 0;
+   xcb_render_change_picture(rs->xinf->x11.connection, rs->x11.xcb.pic, value_mask, &value_list);
+
+   _xr_xcb_render_surface_clips_set(rs, dc, x, y, w, h);
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   xcb_render_fill_rectangles(rs->xinf->x11.connection, op, rs->x11.xcb.pic, col, 1, &rect);
+}
+
+void
+_xr_xcb_render_surface_line_draw(Xrender_Surface *rs __UNUSED__, RGBA_Draw_Context *dc __UNUSED__, int x1 __UNUSED__, int y1 __UNUSED__, int x2 __UNUSED__, int y2 __UNUSED__)
+{
+/*    uint32_t         value_mask; */
+/*    uint32_t         value_list[1]; */
+/*    int            op; */
+
+/*    if ((!rs) || (!dc)) return; */
+/*    op = XCB_RENDER_PICT_OP_SRC; */
+/*    value_mask = XCB_RENDER_CP_CLIP_MASK; */
+/*    value_list[0] = 0; */
+/*    xcb_render_change_picture(rs->xinf->x11.connection, rs->x11.xcb.pic, value_mask, value_list); */
+/*    _xr_xcb_render_surface_clips_set(rs, dc, 0, 0, rs->width, rs->height); */
+
+/*      { */
+/*     int r, g, b, a; */
+/*     XPointDouble poly[4]; */
+/*     int dx, dy; */
+/*     double len, ddx, ddy; */
+
+/*     dx = x2 - x1; */
+/*     dy = y2 - y1; */
+/*     len = sqrt((double)(dx * dx) + (double)(dy * dy)); */
+/*     ddx = (0.5 * dx) / len; */
+/*     ddy = (0.5 * dy) / len; */
+/*     poly[0].x =  (x1 + ddx); */
+/*     poly[0].y =  (y1 - ddy); */
+/*     poly[1].x =  (x2 + ddx); */
+/*     poly[1].y =  (y2 - ddy); */
+/*     poly[2].x =  (x2 - ddx); */
+/*     poly[2].y =  (y2 + ddy); */
+/*     poly[3].x =  (x1 - ddx); */
+/*     poly[3].y =  (y1 + ddy); */
+
+/*     a = (dc->col.col >> 24) & 0xff; */
+/*     if (a == 0) return; */
+/*     if (a < 0xff) op = XCB_RENDER_PICT_OP_OVER; */
+/*     r = (dc->col.col >> 16) & 0xff; */
+/*     g = (dc->col.col >> 8 ) & 0xff; */
+/*     b = (dc->col.col      ) & 0xff; */
+/*     if ((rs->xinf->mul_r != r) || (rs->xinf->mul_g != g) || */
+/*         (rs->xinf->mul_b != b) || (rs->xinf->mul_a != a)) */
+/*       { */
+/*          rs->xinf->mul_r = r; */
+/*          rs->xinf->mul_g = g; */
+/*          rs->xinf->mul_b = b; */
+/*          rs->xinf->mul_a = a; */
+/*          _xr_xcb_render_surface_solid_rectangle_set(rs->xinf->mul, r, g, b, a, 0, 0, 1, 1); */
+/*       } */
+/*     XRenderCompositeDoublePoly(rs->xinf->x11.connection, op, */
+/*                                rs->xinf->mul->pic, rs->x11.xcb.pic,  */
+/*                                rs->xinf->fmt8, 0, 0, 0, 0, */
+/*                                poly, 4, EvenOddRule); */
+/*      } */
+}
+
+void
+_xr_xcb_render_surface_polygon_draw(Xrender_Surface *rs __UNUSED__, RGBA_Draw_Context *dc __UNUSED__, RGBA_Polygon_Point *points __UNUSED__, int x, int y)
+{
+/*    RGBA_Polygon_Point *pt; */
+/*    int i, num; */
+/*    XPointDouble *pts; */
+/*    int r, g, b, a; */
+/*    uint32_t         value_mask; */
+/*    uint32_t         value_list[1]; */
+/*    int op; */
+
+/*    if ((!rs) || (!dc)) return; */
+/*    num = 0; EINA_INLIST_FOREACH(points, pt) num++; */
+/*    if (num < 3) return; */
+/*    a = (dc->col.col >> 24) & 0xff; */
+/*    if (a == 0) return; */
+/*    op = XCB_RENDER_PICT_OP_OVER; */
+/*    r = (dc->col.col >> 16) & 0xff; */
+/*    g = (dc->col.col >> 8 ) & 0xff; */
+/*    b = (dc->col.col      ) & 0xff; */
+/*    if ((rs->xinf->mul_r != r) || (rs->xinf->mul_g != g) || */
+/*        (rs->xinf->mul_b != b) || (rs->xinf->mul_a != a)) */
+/*      { */
+/*     rs->xinf->mul_r = r; */
+/*     rs->xinf->mul_g = g; */
+/*     rs->xinf->mul_b = b; */
+/*     rs->xinf->mul_a = a; */
+/*     _xr_xcb_render_surface_solid_rectangle_set(rs->xinf->mul, r, g, b, a, 0, 0, 1, 1); */
+/*      } */
+/*    pts = malloc(num * sizeof(XPointDouble)); */
+/*    if (!pts) return; */
+/*    i = 0; */
+/*    EINA_INLIST_FOREACH(points, pt) */
+/*      { */
+/*     if (i < num) */
+/*       { */
+/*          pts[i].x = pt->x; */
+/*          pts[i].y = pt->y; */
+/*          i++; */
+/*       } */
+/*      } */
+/*    value_mask = XCB_RENDER_CP_CLIP_MASK; */
+/*    value_list[0] = 0; */
+/*    xcb_render_change_picture(rs->xinf->x11.connection, rs->x11.xcb.pic, value_mask, value_list); */
+
+/*    _xr_xcb_render_surface_clips_set(rs, dc, 0, 0, rs->width, rs->height); */
+/*    XRenderCompositeDoublePoly(rs->xinf->x11.connection, op, */
+/*                           rs->xinf->mul->pic, rs->x11.xcb.pic,  */
+/*                           rs->xinf->fmt8, 0, 0, 0, 0, */
+/*                           pts, num, Complex); */
+/*    free(pts); */
+}
diff --git a/src/modules/engines/xrender_x11/evas_engine_xcb_ximage.c b/src/modules/engines/xrender_x11/evas_engine_xcb_ximage.c
new file mode 100644 (file)
index 0000000..a0c60ca
--- /dev/null
@@ -0,0 +1,574 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_XRender_X11.h"
+
+static Eina_List *_image_info_list = NULL;
+
+static int _xcb_err = 0;
+
+enum
+{
+  xcb_render_pictforminfo_id            = 1 << 0,
+  xcb_render_pictforminfo_type_t        = 1 << 1,
+  xcb_render_pictforminfo_depth_t       = 1 << 2,
+  xcb_render_pictforminfo_red_shift_t   = 1 << 3,
+  xcb_render_pictforminfo_red_mask_t    = 1 << 4,
+  xcb_render_pictforminfo_green_shift_t = 1 << 5,
+  xcb_render_pictforminfo_green_mask_t  = 1 << 6,
+  xcb_render_pictforminfo_blue_shift_t  = 1 << 7,
+  xcb_render_pictforminfo_blue_mask_t   = 1 << 8,
+  xcb_render_pictforminfo_alpha_shift_t = 1 << 9,
+  xcb_render_pictforminfo_alpha_mask_t  = 1 << 10,
+  xcb_render_pictforminfo_colormap_t    = 1 << 11,
+};
+
+enum
+{
+  xcb_render_standard_pictforminfoargb_32_t,
+  xcb_render_standard_pictforminforgb_24_t,
+  xcb_render_standard_pictforminfoa_8_t,
+  xcb_render_standard_pictforminfoa_4_t,
+  xcb_render_standard_pictforminfoa_1_t,
+  xcb_render_standard_pictforminfo_count_t
+};
+
+static xcb_render_pictforminfo_t *
+xcb_render_find_pictforminfo (xcb_connection_t *conn, uint32_t mask, const xcb_render_pictforminfo_t *template, int count)
+{
+  xcb_render_query_pict_formats_cookie_t cookie;
+  xcb_render_query_pict_formats_reply_t *rep;
+  xcb_render_pictforminfo_iterator_t     iter_forminfo;
+
+  cookie = xcb_render_query_pict_formats_unchecked (conn);
+  rep = xcb_render_query_pict_formats_reply (conn, cookie, NULL);
+  iter_forminfo = xcb_render_query_pict_formats_formats_iterator (rep);
+  for (; iter_forminfo.rem; xcb_render_pictforminfo_next (&iter_forminfo)) {
+    if (mask & xcb_render_pictforminfo_id)
+      if (template->id != iter_forminfo.data->id)
+        continue;
+    if (mask & xcb_render_pictforminfo_type_t)
+      if (template->type != iter_forminfo.data->type)
+        continue;
+    if (mask & xcb_render_pictforminfo_depth_t)
+      if (template->depth != iter_forminfo.data->depth)
+        continue;
+    if (mask & xcb_render_pictforminfo_red_shift_t)
+      if (template->direct.red_shift != iter_forminfo.data->direct.red_shift)
+        continue;
+    if (mask & xcb_render_pictforminfo_red_mask_t)
+      if (template->direct.red_mask != iter_forminfo.data->direct.red_mask)
+        continue;
+    if (mask & xcb_render_pictforminfo_green_shift_t)
+      if (template->direct.green_shift != iter_forminfo.data->direct.green_shift)
+        continue;
+    if (mask & xcb_render_pictforminfo_green_mask_t)
+      if (template->direct.green_mask != iter_forminfo.data->direct.green_mask)
+        continue;
+    if (mask & xcb_render_pictforminfo_blue_shift_t)
+      if (template->direct.blue_shift != iter_forminfo.data->direct.blue_shift)
+        continue;
+    if (mask & xcb_render_pictforminfo_blue_mask_t)
+      if (template->direct.blue_mask != iter_forminfo.data->direct.blue_mask)
+        continue;
+    if (mask & xcb_render_pictforminfo_alpha_shift_t)
+      if (template->direct.alpha_shift != iter_forminfo.data->direct.alpha_shift)
+        continue;
+    if (mask & xcb_render_pictforminfo_alpha_mask_t)
+      if (template->direct.alpha_mask != iter_forminfo.data->direct.alpha_mask)
+        continue;
+    if (mask & xcb_render_pictforminfo_colormap_t)
+      if (template->colormap != iter_forminfo.data->colormap)
+        continue;
+    if (count-- == 0) {
+      xcb_render_pictforminfo_t *forminfo;
+
+      forminfo = (xcb_render_pictforminfo_t *)malloc (sizeof (xcb_render_pictforminfo_t));
+      memcpy (forminfo, iter_forminfo.data, sizeof (xcb_render_pictforminfo_t));
+
+      free (rep);
+      return forminfo;
+    }
+  }
+  free (rep);
+  return NULL;
+}
+
+static xcb_render_pictforminfo_t *
+xcb_render_find_standard_pictforminfo (xcb_connection_t *conn, int format)
+{
+  xcb_render_pictforminfo_t *forminfo = NULL;
+  struct {
+    xcb_render_pictforminfo_t template;
+    uint32_t                mask;
+  } standardFormats[xcb_render_standard_pictforminfo_count_t] = {
+    /* StandardPICTFORMINFOARGB32 */
+    {
+      {
+        0,                                /* id */
+        XCB_RENDER_PICT_TYPE_DIRECT,          /* type */
+        32,                               /* depth */
+        { 0, 0 },                         /* pad */
+        {                                 /* direct */
+          16,                             /* direct.red_shift */
+          0xff,                           /* direct.red_mask */
+          8,                              /* direct.green_shift */
+          0xff,                           /* direct.green_mask */
+          0,                              /* direct.blue_shift */
+          0xff,                           /* direct.blue_mask */
+          24,                             /* direct.alpha_shift */
+          0xff                            /* direct.alpha_mask */
+        },
+        0                                 /* colormap */
+      },
+      xcb_render_pictforminfo_type_t        |
+      xcb_render_pictforminfo_depth_t       |
+      xcb_render_pictforminfo_red_shift_t   |
+      xcb_render_pictforminfo_red_mask_t    |
+      xcb_render_pictforminfo_green_shift_t |
+      xcb_render_pictforminfo_green_mask_t  |
+      xcb_render_pictforminfo_blue_shift_t  |
+      xcb_render_pictforminfo_blue_mask_t   |
+      xcb_render_pictforminfo_alpha_shift_t |
+      xcb_render_pictforminfo_alpha_mask_t
+    },
+    /* StandardPICTFORMINFORGB24 */
+    {
+      {
+        0,                                /* id */
+        XCB_RENDER_PICT_TYPE_DIRECT,          /* type */
+        24,                               /* depth */
+        { 0, 0 },                         /* pad */
+        {                                 /* direct */
+          16,                             /* direct.red_shift */
+          0xff,                           /* direct.red_mask */
+          8,                              /* direct.green_shift */
+          0xff,                           /* direct.green_mask */
+          0,                              /* direct.blue_shift */
+          0xff,                           /* direct.blue_mask */
+          0,                              /* direct.alpha_shift */
+          0x00                            /* direct.alpha_mask */
+        },
+        0                                 /* colormap */
+      },
+      xcb_render_pictforminfo_type_t        |
+      xcb_render_pictforminfo_depth_t       |
+      xcb_render_pictforminfo_red_shift_t   |
+      xcb_render_pictforminfo_red_mask_t    |
+      xcb_render_pictforminfo_green_shift_t |
+      xcb_render_pictforminfo_green_mask_t  |
+      xcb_render_pictforminfo_blue_shift_t  |
+      xcb_render_pictforminfo_blue_mask_t   |
+      xcb_render_pictforminfo_alpha_mask_t
+    },
+    /* StandardPICTFORMINFOA8 */
+    {
+      {
+        0,                                /* id */
+        XCB_RENDER_PICT_TYPE_DIRECT,          /* type */
+        8,                                /* depth */
+        { 0, 0 },                         /* pad */
+        {                                 /* direct */
+          0,                              /* direct.red_shift */
+          0x00,                           /* direct.red_mask */
+          0,                              /* direct.green_shift */
+          0x00,                           /* direct.green_mask */
+          0,                              /* direct.blue_shift */
+          0x00,                           /* direct.blue_mask */
+          0,                              /* direct.alpha_shift */
+          0xff                            /* direct.alpha_mask */
+        },
+        0                                 /* colormap */
+      },
+      xcb_render_pictforminfo_type_t        |
+      xcb_render_pictforminfo_depth_t       |
+      xcb_render_pictforminfo_red_mask_t    |
+      xcb_render_pictforminfo_green_mask_t  |
+      xcb_render_pictforminfo_blue_mask_t   |
+      xcb_render_pictforminfo_alpha_shift_t |
+      xcb_render_pictforminfo_alpha_mask_t
+    },
+    /* StandardPICTFORMINFOA4 */
+    {
+      {
+        0,                                /* id */
+        XCB_RENDER_PICT_TYPE_DIRECT,          /* type */
+        4,                                /* depth */
+        { 0, 0 },                         /* pad */
+        {                                 /* direct */
+          0,                              /* direct.red_shift */
+          0x00,                           /* direct.red_mask */
+          0,                              /* direct.green_shift */
+          0x00,                           /* direct.green_mask */
+          0,                              /* direct.blue_shift */
+          0x00,                           /* direct.blue_mask */
+          0,                              /* direct.alpha_shift */
+          0x0f                            /* direct.alpha_mask */
+        },
+        0                                 /* colormap */
+      },
+      xcb_render_pictforminfo_type_t        |
+      xcb_render_pictforminfo_depth_t       |
+      xcb_render_pictforminfo_red_mask_t    |
+      xcb_render_pictforminfo_green_mask_t  |
+      xcb_render_pictforminfo_blue_mask_t   |
+      xcb_render_pictforminfo_alpha_shift_t |
+      xcb_render_pictforminfo_alpha_mask_t
+    },
+    /* StandardPICTFORMINFOA1 */
+    {
+      {
+        0,                                /* id */
+        XCB_RENDER_PICT_TYPE_DIRECT,          /* type */
+        1,                                /* depth */
+        { 0, 0 },                         /* pad */
+        {                                 /* direct */
+          0,                              /* direct.red_shift */
+          0x00,                           /* direct.red_mask */
+          0,                              /* direct.green_shift */
+          0x00,                           /* direct.green_mask */
+          0,                              /* direct.blue_shift */
+          0x00,                           /* direct.blue_mask */
+          0,                              /* direct.alpha_shift */
+          0x01                            /* direct.alpha_mask */
+        },
+        0                                 /* colormap */
+      },
+      xcb_render_pictforminfo_type_t        |
+      xcb_render_pictforminfo_depth_t       |
+      xcb_render_pictforminfo_red_mask_t    |
+      xcb_render_pictforminfo_green_mask_t  |
+      xcb_render_pictforminfo_blue_mask_t   |
+      xcb_render_pictforminfo_alpha_shift_t |
+      xcb_render_pictforminfo_alpha_mask_t
+    },
+  };
+  if ((format >= 0) && (format < xcb_render_standard_pictforminfo_count_t))
+    forminfo = xcb_render_find_pictforminfo (conn,
+                                             standardFormats[format].mask,
+                                             &standardFormats[format].template,
+                                             0);
+  return forminfo;
+}
+
+static void
+_tmp_xcb_err(xcb_connection_t *conn __UNUSED__/* , XErrorEvent *ev */)
+{
+   _xcb_err = 1;
+   return;
+}
+
+Ximage_Info *
+_xr_xcb_image_info_get(xcb_connection_t *conn, xcb_screen_t *screen, xcb_drawable_t draw, xcb_visualtype_t *visual)
+{
+   xcb_get_geometry_cookie_t cookie;
+   xcb_get_geometry_reply_t *rep;
+   Ximage_Info              *xinf;
+   Ximage_Info              *xinf2;
+   Eina_List                *l;
+
+   xinf2 = NULL;
+   EINA_LIST_FOREACH(_image_info_list, l, xinf)
+     {
+       if (xinf->x11.connection == conn)
+         {
+            xinf2 = xinf;
+            break;
+         }
+     }
+   xinf = calloc(1, sizeof(Ximage_Info));
+   if (!xinf) return NULL;
+
+   xinf->references = 1;
+   xinf->x11.connection = conn;
+   xinf->x11.screen = screen;
+   xinf->x11.draw = draw;
+   cookie = xcb_get_geometry_unchecked(xinf->x11.connection, xinf->x11.draw);
+   rep = xcb_get_geometry_reply(xinf->x11.connection, cookie, NULL);
+   xinf->x11.root = rep->root;
+   free(rep);
+   xinf->x11.visual = visual;
+   xinf->x11.fmt32 = xcb_render_find_standard_pictforminfo(xinf->x11.connection, xcb_render_standard_pictforminfoargb_32_t);
+   xinf->x11.fmt24 = xcb_render_find_standard_pictforminfo(xinf->x11.connection, xcb_render_standard_pictforminforgb_24_t);
+   xinf->x11.fmt8 = xcb_render_find_standard_pictforminfo(xinf->x11.connection, xcb_render_standard_pictforminfoa_8_t);
+   xinf->x11.fmt4 = xcb_render_find_standard_pictforminfo(xinf->x11.connection, xcb_render_standard_pictforminfoa_4_t);
+   xinf->x11.fmt1 = xcb_render_find_standard_pictforminfo(xinf->x11.connection, xcb_render_standard_pictforminfoa_1_t);
+
+   xinf->mul = _xr_xcb_render_surface_new(xinf, 1, 1, xinf->x11.fmt32, 1);
+   _xr_xcb_render_surface_repeat_set(xinf->mul, 1);
+   xinf->mul_r = xinf->mul_g = xinf->mul_b = xinf->mul_a = 0xff;
+   _xr_xcb_render_surface_solid_rectangle_set(xinf->mul, xinf->mul_r, xinf->mul_g, xinf->mul_b, xinf->mul_a, 0, 0, 1, 1);
+   if (xinf2)
+     {
+       xinf->can_do_shm = xinf2->can_do_shm;
+       xinf->depth = xinf2->depth;
+     }
+   else
+     {
+        xcb_depth_iterator_t iter_depth;
+        xcb_shm_segment_info_t shm_info;
+        xcb_image_t           *xim;
+
+        iter_depth = xcb_screen_allowed_depths_iterator (xinf->x11.screen);
+        for (; iter_depth.rem ; xcb_depth_next (&iter_depth))
+          {
+             xcb_visualtype_iterator_t iter_visual;
+
+             iter_visual = xcb_depth_visuals_iterator (iter_depth.data);
+             for (; iter_visual.rem ; xcb_visualtype_next (&iter_visual))
+               {
+                  if (iter_visual.data->visual_id == visual->visual_id)
+                    xinf->depth = iter_depth.data->depth;
+               }
+          }
+
+       xinf->can_do_shm = 0;
+
+
+        shm_info.shmseg = xcb_generate_id(xinf->x11.connection);
+        xim = xcb_image_create_native(xinf->x11.connection, 1, 1,
+                                        XCB_IMAGE_FORMAT_Z_PIXMAP,
+                                        xinf->depth, NULL, ~0, NULL);
+        if (xim) {
+           shm_info.shmid = shmget(IPC_PRIVATE, xim->size, IPC_CREAT | 0777);
+           if (shm_info.shmid >= 0) {
+              shm_info.shmaddr = xim->data = shmat(shm_info.shmid, 0, 0);
+              if ((shm_info.shmaddr != NULL) && (shm_info.shmaddr != (void *) -1)) {
+                 xcb_get_input_focus_reply_t *reply;
+                 /*
+                  * FIXME: no error mechanism
+                  */
+                 /* XErrorHandler ph; */
+
+                 /* we sync */
+                 reply = xcb_get_input_focus_reply(xinf->x11.connection,
+                                               xcb_get_input_focus_unchecked(xinf->x11.connection),
+                                               NULL);
+                 free(reply);
+                 _xcb_err = 0;
+                 /* ph = XSetErrorHandler((XErrorHandler)_tmp_xcb_err); */
+                 xcb_shm_attach(xinf->x11.connection, shm_info.shmseg, shm_info.shmid, 0);
+                 /* we sync */
+                 reply = xcb_get_input_focus_reply(xinf->x11.connection,
+                                               xcb_get_input_focus_unchecked(xinf->x11.connection),
+                                               NULL);
+                 free(reply);
+                 /* XSetErrorHandler((XErrorHandler)ph); */
+                 if (!_xcb_err) xinf->can_do_shm = 1;
+                 shmdt(shm_info.shmaddr);
+              }
+              shmctl(shm_info.shmid, IPC_RMID, 0);
+           }
+           xcb_image_destroy(xim);
+        }
+     }
+   _image_info_list = eina_list_prepend(_image_info_list, xinf);
+   return xinf;
+}
+
+void
+_xr_xcb_image_info_free(Ximage_Info *xinf)
+{
+  if (!xinf) return;
+   if (xinf->pool)
+     {
+        xcb_get_input_focus_reply_t *reply;
+
+        reply = xcb_get_input_focus_reply(xinf->x11.connection,
+                                          xcb_get_input_focus_unchecked(xinf->x11.connection),
+                                          NULL);
+        free(reply);
+     }
+   _xr_xcb_image_info_pool_flush(xinf, 0, 0);
+   xinf->references--;
+   if (xinf->references != 0) return;
+   _xr_xcb_render_surface_free(xinf->mul);
+   if (xinf->x11.fmt1)
+     free(xinf->x11.fmt1);
+   if (xinf->x11.fmt4)
+     free(xinf->x11.fmt4);
+   if (xinf->x11.fmt8)
+     free(xinf->x11.fmt8);
+   if (xinf->x11.fmt24)
+     free(xinf->x11.fmt24);
+   if (xinf->x11.fmt32)
+     free(xinf->x11.fmt32);
+   free(xinf);
+   _image_info_list = eina_list_remove(_image_info_list, xinf);
+}
+
+void
+_xr_xcb_image_info_pool_flush(Ximage_Info *xinf, int max_num, int max_mem)
+{
+   if ((xinf->pool_mem <= max_mem) && (eina_list_count(xinf->pool) <= max_num)) return;
+   while ((xinf->pool_mem > max_mem) || (eina_list_count(xinf->pool) > max_num))
+     {
+       Ximage_Image *xim;
+
+       if (!xinf->pool) break;
+       xim = xinf->pool->data;
+       _xr_xcb_image_free(xim);
+     }
+}
+
+Ximage_Image *
+_xr_xcb_image_new(Ximage_Info *xinf, int w, int h, int depth)
+{
+   Ximage_Image *xim;
+   Ximage_Image *xim2;
+   Eina_List    *l;
+
+   xim2 = NULL;
+   EINA_LIST_FOREACH(xinf->pool, l, xim)
+     {
+       if ((xim->width >= w) && (xim->height >= h) && (xim->depth == depth) && (xim->available))
+         {
+            if (!xim2) xim2 = xim;
+            else if ((xim->width * xim->height) < (xim2->width * xim2->height)) xim2 = xim;
+         }
+     }
+   if (xim2)
+     {
+       xim2->available = 0;
+       return xim2;
+     }
+   xim = calloc(1, sizeof(Ximage_Image));
+   if (xim)
+     {
+       xim->xinf = xinf;
+       xim->width = w;
+       xim->height = h;
+       xim->depth = depth;
+       xim->available = 0;
+       if (xim->xinf->can_do_shm)
+         {
+            xim->x11.xcb.shm_info = calloc(1, sizeof(xcb_shm_segment_info_t));
+            if (xim->x11.xcb.shm_info)
+              {
+                  xim->x11.xcb.shm_info->shmseg = xcb_generate_id(xinf->x11.connection);
+                 xim->x11.xcb.xim = xcb_image_create_native(xim->xinf->x11.connection, xim->width, xim->height, XCB_IMAGE_FORMAT_Z_PIXMAP, xim->depth, NULL, ~0, NULL);
+                 if (xim->x11.xcb.xim)
+                   {
+                      xim->x11.xcb.shm_info->shmid = shmget(IPC_PRIVATE, xim->x11.xcb.xim->size, IPC_CREAT | 0777);
+                      if (xim->x11.xcb.shm_info->shmid >= 0)
+                        {
+                           xim->x11.xcb.shm_info->shmaddr = xim->x11.xcb.xim->data = shmat(xim->x11.xcb.shm_info->shmid, 0, 0);
+                           if ((xim->x11.xcb.shm_info->shmaddr) && (xim->x11.xcb.shm_info->shmaddr != (void *) -1))
+                             {
+                                 xcb_get_input_focus_reply_t *reply;
+                                 /*
+                                  * FIXME: no error mechanism
+                                  */
+                                 /*                             XErrorHandler ph; */
+
+                                 /* we sync */
+                                 reply = xcb_get_input_focus_reply(xim->xinf->x11.connection,
+                                                               xcb_get_input_focus_unchecked(xim->xinf->x11.connection),
+                                                               NULL);
+                                 free(reply);
+                                _xcb_err = 0;
+/*                              ph = XSetErrorHandler((XErrorHandler)_tmp_xcb_err); */
+                                xcb_shm_attach(xim->xinf->x11.connection, xim->x11.xcb.shm_info->shmseg, xim->x11.xcb.shm_info->shmid, 0);
+                                 /* we sync */
+                                 reply = xcb_get_input_focus_reply(xim->xinf->x11.connection,
+                                                               xcb_get_input_focus_unchecked(xim->xinf->x11.connection),
+                                                               NULL);
+                                 free(reply);
+/*                              XSetErrorHandler((XErrorHandler)ph); */
+                                if (!_xcb_err) goto xim_ok;
+                                shmdt(xim->x11.xcb.shm_info->shmaddr);
+                             }
+                           shmctl(xim->x11.xcb.shm_info->shmid, IPC_RMID, 0);
+                        }
+                      xcb_image_destroy(xim->x11.xcb.xim);
+                   }
+                 free(xim->x11.xcb.shm_info);
+                 xim->x11.xcb.shm_info = NULL;
+              }
+         }
+       xim->x11.xcb.xim = xcb_image_create_native(xim->xinf->x11.connection, xim->width, xim->height, XCB_IMAGE_FORMAT_Z_PIXMAP, xim->depth, NULL, ~0, NULL);
+       if (!xim->x11.xcb.xim)
+         {
+            free(xim);
+            return NULL;
+         }
+       xim->x11.xcb.xim->data = malloc(xim->x11.xcb.xim->size);
+       if (!xim->x11.xcb.xim->data)
+         {
+            xcb_image_destroy(xim->x11.xcb.xim);
+            free(xim);
+            return NULL;
+         }
+     }
+
+   xim_ok:
+   _xr_xcb_image_info_pool_flush(xinf, 32, (1600 * 1200 * 32 * 2));
+
+   xim->line_bytes = xim->x11.xcb.xim->stride;
+   xim->data = (void *)(xim->x11.xcb.xim->data);
+   xinf->pool_mem += (xim->width * xim->height * xim->depth);
+   xinf->pool = eina_list_append(xinf->pool, xim);
+   return xim;
+}
+
+void
+_xr_xcb_image_free(Ximage_Image *xim)
+{
+   if (xim->x11.xcb.shm_info)
+     {
+       if (!xim->available)
+          {
+            xcb_get_input_focus_reply_t *reply;
+
+            reply = xcb_get_input_focus_reply(xim->xinf->x11.connection,
+                                              xcb_get_input_focus_unchecked(xim->xinf->x11.connection),
+                                              NULL);
+            free(reply);
+          }
+       xcb_shm_detach(xim->xinf->x11.connection, xim->x11.xcb.shm_info->shmseg);
+       xcb_image_destroy(xim->x11.xcb.xim);
+       shmdt(xim->x11.xcb.shm_info->shmaddr);
+       shmctl(xim->x11.xcb.shm_info->shmid, IPC_RMID, 0);
+       free(xim->x11.xcb.shm_info);
+     }
+   else
+     {
+       free(xim->x11.xcb.xim->data);
+       xim->x11.xcb.xim->data = NULL;
+       xcb_image_destroy(xim->x11.xcb.xim);
+     }
+   xim->xinf->pool_mem -= (xim->width * xim->height * xim->depth);
+   xim->xinf->pool = eina_list_remove(xim->xinf->pool, xim);
+   free(xim);
+}
+
+void
+_xr_xcb_image_put(Ximage_Image *xim, xcb_drawable_t draw, int x, int y, int w, int h)
+{
+   xcb_get_input_focus_reply_t *reply;
+   xcb_gcontext_t               gc;
+
+   gc = xcb_generate_id(xim->xinf->x11.connection);
+   xcb_create_gc(xim->xinf->x11.connection, gc, draw, 0, NULL);
+   if (xim->x11.xcb.shm_info)
+     {
+       xcb_shm_put_image(xim->xinf->x11.connection, draw, gc,
+                       xim->x11.xcb.xim->width, xim->x11.xcb.xim->height,
+                       0, 0,
+                       w, h,
+                       x, y,
+                       xim->x11.xcb.xim->depth, xim->x11.xcb.xim->format,
+                       0,
+                       xim->x11.xcb.shm_info->shmseg,
+                       xim->x11.xcb.xim->data - xim->x11.xcb.shm_info->shmaddr);
+        /* we sync */
+        reply = xcb_get_input_focus_reply(xim->xinf->x11.connection,
+                                      xcb_get_input_focus_unchecked(xim->xinf->x11.connection),
+                                      NULL);
+        free(reply);
+     }
+   else
+     xcb_image_put(xim->xinf->x11.connection, draw, gc, xim->x11.xcb.xim, x, y, 0);
+   xim->available = 1;
+   xcb_free_gc(xim->xinf->x11.connection, gc);
+}
diff --git a/src/modules/engines/xrender_x11/evas_engine_xlib_font.c b/src/modules/engines/xrender_x11/evas_engine_xlib_font.c
new file mode 100644 (file)
index 0000000..9f07bce
--- /dev/null
@@ -0,0 +1,192 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_XRender_X11.h"
+
+static Eina_Hash *_xr_fg_pool = NULL;
+
+XR_Font_Surface *
+_xre_xlib_font_surface_new(Ximage_Info *xinf, RGBA_Font_Glyph *fg)
+{
+   XR_Font_Surface *fs;
+   DATA8 *data;
+   int w, h, j;
+   XRenderPictureAttributes att;
+   XRenderPictFormat *fmt;
+   Ximage_Image  *xim;
+   Eina_Hash *pool;
+   char buf[256], buf2[256];
+
+   data = fg->glyph_out->bitmap.buffer;
+   w = fg->glyph_out->bitmap.width;
+   h = fg->glyph_out->bitmap.rows;
+   j = fg->glyph_out->bitmap.pitch;
+   if (j < w) j = w;
+   if ((w <= 0) || (h <= 0)) return NULL;
+
+   if (fg->ext_dat)
+     {
+       fs = fg->ext_dat;
+       if ((fs->xinf->x11.connection == xinf->x11.connection) && (fs->xinf->x11.root == xinf->x11.root))
+         return fs;
+       snprintf(buf, sizeof(buf), "@%p@/@%lx@", fs->xinf->x11.connection, (unsigned long int)fs->xinf->x11.root);
+       pool = eina_hash_find(_xr_fg_pool, buf);
+       if (pool)
+         {
+            snprintf(buf, sizeof(buf), "%p", fg);
+            fs = eina_hash_find(pool, buf);
+            if (fs) return fs;
+         }
+     }
+
+   fs = calloc(1, sizeof(XR_Font_Surface));
+   if (!fs) return NULL;
+
+   fs->xinf = xinf;
+   fs->fg = fg;
+   fs->xinf->references++;
+   fs->w = w;
+   fs->h = h;
+
+   snprintf(buf, sizeof(buf), "@%p@/@%lx@", fs->xinf->x11.connection, (unsigned long int)fs->xinf->x11.root);
+   pool = eina_hash_find(_xr_fg_pool, buf);
+   if (!pool) pool = eina_hash_string_superfast_new(NULL);
+   snprintf(buf2, sizeof(buf2), "%p", fg);
+   eina_hash_add(pool, buf2, fs);
+   if (!_xr_fg_pool) _xr_fg_pool = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(_xr_fg_pool, buf, pool);
+
+   /* FIXME: maybe use fmt4? */
+   fmt = xinf->x11.fmt8;
+   fs->draw = XCreatePixmap(xinf->x11.connection, xinf->x11.root, w, h,fmt->depth);
+   att.dither = 0;
+   att.component_alpha = 0;
+   att.repeat = 0;
+   fs->pic = XRenderCreatePicture(xinf->x11.connection, fs->draw,fmt,
+                                 CPRepeat | CPDither | CPComponentAlpha, &att);
+
+   /* FIXME: handle if fmt->depth != 8 */
+   xim = _xr_xlib_image_new(fs->xinf, w, h,fmt->depth);
+   if ((fg->glyph_out->bitmap.num_grays == 256) &&
+       (fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays))
+     {
+       int x, y;
+       DATA8 *p1, *p2;
+
+       for (y = 0; y < h; y++)
+         {
+            p1 = data + (j * y);
+            p2 = ((DATA8 *)xim->data) + (xim->line_bytes * y);
+            for (x = 0; x < w; x++)
+              {
+                 *p2 = *p1;
+                 p1++;
+                 p2++;
+              }
+         }
+
+     }
+   else
+     {
+        DATA8 *tmpbuf = NULL, *dp, *tp, bits;
+       int bi, bj, end;
+       const DATA8 bitrepl[2] = {0x0, 0xff};
+
+       tmpbuf = alloca(w);
+         {
+            int x, y;
+            DATA8 *p1, *p2;
+
+            for (y = 0; y < h; y++)
+              {
+                 p1 = tmpbuf;
+                 p2 = ((DATA8 *)xim->data) + (xim->line_bytes * y);
+                 tp = tmpbuf;
+                 dp = data + (y * fg->glyph_out->bitmap.pitch);
+                 for (bi = 0; bi < w; bi += 8)
+                   {
+                      bits = *dp;
+                      if ((w - bi) < 8) end = w - bi;
+                      else end = 8;
+                      for (bj = 0; bj < end; bj++)
+                        {
+                           *tp = bitrepl[(bits >> (7 - bj)) & 0x1];
+                           tp++;
+                        }
+                      dp++;
+                   }
+                 for (x = 0; x < w; x++)
+                   {
+                      *p2 = *p1;
+                      p1++;
+                      p2++;
+                   }
+              }
+         }
+     }
+   _xr_xlib_image_put(xim, fs->draw, 0, 0, w, h);
+   return fs;
+}
+
+static Eina_Bool
+_xre_xlib_font_pool_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+{
+   char buf[256];
+   Eina_Hash *pool;
+   XR_Font_Surface *fs;
+
+   fs = fdata;
+   pool = data;
+   snprintf(buf, sizeof(buf), "@%p@/@%lx@", fs->xinf->x11.connection, (unsigned long int)fs->xinf->x11.root);
+   eina_hash_del(pool, buf, fs);
+   return 1;
+}
+
+void
+_xre_xlib_font_surface_free(XR_Font_Surface *fs)
+{
+   if (!fs) return;
+   eina_hash_foreach(_xr_fg_pool, _xre_xlib_font_pool_cb, fs);
+   XFreePixmap(fs->xinf->x11.connection, fs->draw);
+   XRenderFreePicture(fs->xinf->x11.connection, fs->pic);
+   _xr_xlib_image_info_free(fs->xinf);
+   free(fs);
+}
+
+void
+_xre_xlib_font_surface_draw(Ximage_Info *xinf __UNUSED__, RGBA_Image *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y)
+{
+   XR_Font_Surface *fs;
+   Xrender_Surface *target_surface;
+   XRectangle rect;
+   int r, g, b, a;
+
+   fs = fg->ext_dat;
+   if (!fs || !fs->xinf || !dc || !dc->col.col) return;
+   if (!surface || !surface->image.data) return;
+   target_surface = (Xrender_Surface *)(surface->image.data);
+   a = (dc->col.col >> 24) & 0xff;
+   r = (dc->col.col >> 16) & 0xff;
+   g = (dc->col.col >> 8 ) & 0xff;
+   b = (dc->col.col      ) & 0xff;
+   if ((fs->xinf->mul_r != r) || (fs->xinf->mul_g != g) ||
+       (fs->xinf->mul_b != b) || (fs->xinf->mul_a != a))
+     {
+       fs->xinf->mul_r = r;
+       fs->xinf->mul_g = g;
+       fs->xinf->mul_b = b;
+       fs->xinf->mul_a = a;
+       _xr_xlib_render_surface_solid_rectangle_set(fs->xinf->mul, r, g, b, a, 0, 0, 1, 1);
+     }
+   rect.x = x; rect.y = y; rect.width = fs->w; rect.height = fs->h;
+   if (dc->clip.use)
+     {
+       RECTS_CLIP_TO_RECT(rect.x, rect.y, rect.width, rect.height,
+                          dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h);
+     }
+   XRenderSetPictureClipRectangles(target_surface->xinf->x11.connection,
+                                  target_surface->x11.xlib.pic, 0, 0, &rect, 1);
+   XRenderComposite(fs->xinf->x11.connection, PictOpOver, fs->xinf->mul->x11.xlib.pic,
+                   fs->pic, target_surface->x11.xlib.pic,
+                   0, 0, 0, 0, x, y, fs->w, fs->h);
+}
diff --git a/src/modules/engines/xrender_x11/evas_engine_xlib_gradient.c b/src/modules/engines/xrender_x11/evas_engine_xlib_gradient.c
new file mode 100644 (file)
index 0000000..5c7094c
--- /dev/null
@@ -0,0 +1,209 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_XRender_X11.h"
+#include <math.h>
+
+XR_Gradient *
+_xre_xlib_gradient_new(Ximage_Info *xinf)
+{
+   XR_Gradient  *gr;
+
+   if (!xinf) return NULL;
+   gr = calloc(1, sizeof(XR_Gradient));
+   if (!gr) return NULL;
+   gr->grad = evas_common_gradient_new();
+   if (!gr->grad)
+     {
+       free(gr);
+       return NULL;
+     }
+   gr->xinf = xinf;
+   gr->xinf->references++;
+   gr->changed = 1;
+   return gr;
+}
+
+void
+_xre_xlib_gradient_free(XR_Gradient *gr)
+{
+   if (!gr) return;
+   if (gr->grad)
+       evas_common_gradient_free(gr->grad);
+   if (gr->surface)
+       _xr_xlib_render_surface_free(gr->surface);
+   _xr_xlib_image_info_free(gr->xinf);
+   free(gr);
+}
+
+void
+_xre_xlib_gradient_color_stop_add(XR_Gradient *gr, int r, int g, int b, int a, int delta)
+{
+   if (!gr) return;
+   evas_common_gradient_color_stop_add(gr->grad, r, g, b, a, delta);
+   gr->changed = 1;
+}
+
+void
+_xre_xlib_gradient_alpha_stop_add(XR_Gradient *gr, int a, int delta)
+{
+   if (!gr) return;
+   evas_common_gradient_alpha_stop_add(gr->grad, a, delta);
+   gr->changed = 1;
+}
+
+void
+_xre_xlib_gradient_clear(XR_Gradient *gr)
+{
+   if (!gr) return;
+   evas_common_gradient_clear(gr->grad);
+   gr->changed = 1;
+}
+
+void
+_xre_xlib_gradient_color_data_set(XR_Gradient *gr, void *map, int len, int has_alpha)
+{
+   evas_common_gradient_color_data_set(gr->grad, map, len, has_alpha);
+   gr->changed = 1;
+}
+
+void
+_xre_xlib_gradient_alpha_data_set(XR_Gradient *gr, void *amap, int len)
+{
+   evas_common_gradient_alpha_data_set(gr->grad, amap, len);
+   gr->changed = 1;
+}
+
+void
+_xre_xlib_gradient_fill_set(XR_Gradient *gr, int x, int y, int w, int h)
+{
+   if (!gr) return;
+   evas_common_gradient_fill_set(gr->grad, x, y, w, h);
+   gr->changed = 1;
+}
+
+void
+_xre_xlib_gradient_fill_angle_set(XR_Gradient *gr, double angle)
+{
+   if (!gr) return;
+   evas_common_gradient_fill_angle_set(gr->grad, angle);
+   gr->changed = 1;
+}
+
+void
+_xre_xlib_gradient_fill_spread_set(XR_Gradient *gr, int spread)
+{
+   if (!gr) return;
+   evas_common_gradient_fill_spread_set(gr->grad, spread);
+   gr->changed = 1;
+}
+
+void
+_xre_xlib_gradient_angle_set(XR_Gradient *gr, double angle)
+{
+   if (!gr) return;
+   evas_common_gradient_map_angle_set(gr->grad, angle);
+   gr->changed = 1;
+}
+
+void
+_xre_xlib_gradient_offset_set(XR_Gradient *gr, float offset)
+{
+   if (!gr) return;
+   evas_common_gradient_map_offset_set(gr->grad, offset);
+   gr->changed = 1;
+}
+
+void
+_xre_xlib_gradient_direction_set(XR_Gradient *gr, int direction)
+{
+   if (!gr) return;
+   evas_common_gradient_map_direction_set(gr->grad, direction);
+   gr->changed = 1;
+}
+
+void
+_xre_xlib_gradient_type_set(XR_Gradient *gr, char *name, char *params)
+{
+   if (!gr) return;
+   evas_common_gradient_type_set(gr->grad, name, params);
+   gr->changed = 1;
+}
+
+void
+_xre_xlib_gradient_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, XR_Gradient *gr, int x, int y, int w, int h)
+{
+   int alpha = 0;
+
+   if ((w < 1) || (h < 1)) return;
+   if (!rs || !dc || !gr) return;
+   if (!gr->xinf || !gr->grad || !gr->grad->type.geometer) return;
+
+   if (gr->grad->type.geometer->has_alpha(gr->grad, dc->render_op) ||
+       gr->grad->type.geometer->has_mask(gr->grad, dc->render_op))
+       alpha = 1;
+   if (((gr->sw != w) || (gr->sh != h)) && gr->surface)
+     {
+       _xr_xlib_render_surface_free(gr->surface);
+       gr->surface = NULL;
+       gr->changed = 1;
+     }
+   if (!gr->surface)
+     {
+       gr->surface = _xr_xlib_render_surface_new(gr->xinf, w, h, gr->xinf->x11.fmt32, 1);
+       if (!gr->surface) return;
+       gr->changed = 1;
+     }
+   if (gr->changed)
+     {
+       int op = dc->render_op, cuse = dc->clip.use;
+       RGBA_Image    *im;
+       Ximage_Image  *xim;
+
+       xim = _xr_xlib_image_new(gr->xinf, w, h, gr->surface->depth);
+       if (!xim)
+         {
+           _xr_xlib_render_surface_free(gr->surface);
+           gr->surface = NULL;
+           return;
+         }
+
+        im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(),
+                                                  w, h,
+                                                  (DATA32 *)xim->data,
+                                                  1, EVAS_COLORSPACE_ARGB8888);
+       if (!im)
+         {
+             /* FIXME: xim is leaking. */
+           _xr_xlib_render_surface_free(gr->surface);
+           gr->surface = NULL;
+           return;
+         }
+
+       dc->render_op = _EVAS_RENDER_FILL;
+       dc->clip.use = 0;
+       evas_common_gradient_draw(im, dc, 0, 0, w, h, gr->grad);
+       if
+#ifdef WORDS_BIGENDIAN
+          (xim->x11.xlib.xim->byte_order == LSBFirst)
+#else
+          (xim->x11.xlib.xim->byte_order == MSBFirst)
+#endif
+         {
+            DATA32  *p = im->image.data, *pe = p + (w * h);
+            while (p < pe)
+              {
+                 *p = (*p << 24) + ((*p << 8) & 0xff0000) + ((*p >> 8) & 0xff00) + (*p >> 24);
+                 p++;
+              }
+         }
+       _xr_xlib_image_put(xim, gr->surface->x11.xlib.draw, 0, 0, w, h);
+       evas_cache_image_drop(&im->cache_entry);
+       dc->render_op = op;
+       dc->clip.use = cuse;
+     }
+   gr->surface->alpha = alpha;
+   _xr_xlib_render_surface_composite(gr->surface, rs, dc, 0, 0, gr->surface->width, gr->surface->height, x, y, w, h, 0);
+   gr->changed = 0;
+   gr->sw = w;  gr->sh = h;
+}
diff --git a/src/modules/engines/xrender_x11/evas_engine_xlib_image.c b/src/modules/engines/xrender_x11/evas_engine_xlib_image.c
new file mode 100644 (file)
index 0000000..2e4078e
--- /dev/null
@@ -0,0 +1,705 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_XRender_X11.h"
+
+static Eina_Hash *_xr_image_hash        = NULL;
+static int        _xr_image_cache_size  = 0;
+static int        _xr_image_cache_usage = 0;
+static Eina_List *_xr_image_cache       = NULL;
+static Eina_Hash *_xr_image_dirty_hash  = NULL;
+
+static void
+__xre_xlib_image_dirty_hash_add(XR_Image *im)
+{
+   char buf[64];
+
+   if (!im->data) return;
+   snprintf(buf, sizeof(buf), "%p", im->data);
+   if (!_xr_image_dirty_hash) _xr_image_dirty_hash = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(_xr_image_dirty_hash, buf, im);
+}
+
+static void
+__xre_xlib_image_dirty_hash_del(XR_Image *im)
+{
+   char buf[64];
+
+   if (!im->data) return;
+   snprintf(buf, sizeof(buf), "%p", im->data);
+   eina_hash_del(_xr_image_dirty_hash, buf, im);
+}
+
+static XR_Image *
+__xre_xlib_image_dirty_hash_find(void *data)
+{
+   char buf[64];
+
+   snprintf(buf, sizeof(buf), "%p", data);
+   return eina_hash_find(_xr_image_dirty_hash, buf);
+}
+
+static XR_Image *
+__xre_xlib_image_find(char *fkey)
+{
+   XR_Image *im;
+
+   im = eina_hash_find(_xr_image_hash, fkey);
+   if (!im)
+     {
+       Eina_List *l;
+
+       for (l = _xr_image_cache; l; l = l->next)
+         {
+            im = l->data;
+            if (!strcmp(im->fkey, fkey))
+              {
+                 _xr_image_cache = eina_list_remove_list(_xr_image_cache, l);
+                 if (!_xr_image_hash) _xr_image_hash = eina_hash_string_superfast_new(NULL);
+                 eina_hash_add(_xr_image_hash, im->fkey, im);
+                 _xr_image_cache_usage -= (im->w * im->h * 4);
+                 break;
+              }
+            im = NULL;
+         }
+     }
+   if (im) im->references++;
+   return im;
+}
+
+XR_Image *
+_xre_xlib_image_load(Ximage_Info *xinf, const char *file, const char *key, Evas_Image_Load_Opts *lo, int *error)
+{
+   XR_Image *im;
+   char buf[4096];
+
+   if (!file)
+     {
+       *error = EVAS_LOAD_ERROR_GENERIC;
+       return NULL;
+     }
+   if (!lo)
+     {
+       if (key)
+         snprintf(buf, sizeof(buf), "/@%p@%lx@/%s//://%s", xinf->x11.connection, (unsigned long int)xinf->x11.root, file, key);
+       else
+         snprintf(buf, sizeof(buf), "/@%p@%lx@/%s", xinf->x11.connection, (unsigned long int)xinf->x11.root, file);
+     }
+   else
+     {
+       if (key)
+         snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//@%p@%lx@/%s//://%s", lo->scale_down_by, lo->dpi, lo->w, lo->h, xinf->x11.connection, (unsigned long int)xinf->x11.root, file, key);
+       else
+         snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//@%p@%lx@/%s", lo->scale_down_by, lo->dpi, lo->w, lo->h, xinf->x11.connection, (unsigned long int)xinf->x11.root, file);
+     }
+   im = __xre_xlib_image_find(buf);
+   if (im)
+     {
+       *error = EVAS_LOAD_ERROR_NONE;
+       return im;
+     }
+
+   im = calloc(1, sizeof(XR_Image));
+   if (!im)
+     {
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       return NULL;
+     }
+   im->im = evas_common_load_image_from_file(file, key, lo, error);
+   if (!im->im)
+     {
+       free(im);
+       return NULL;
+     }
+   im->xinf = xinf;
+   im->xinf->references++;
+   im->cs.space = EVAS_COLORSPACE_ARGB8888;
+   im->fkey = strdup(buf);
+   im->file = eina_stringshare_add(file);
+   if (key) im->key = eina_stringshare_add(key);
+   im->w = im->im->cache_entry.w;
+   im->h = im->im->cache_entry.h;
+   im->references = 1;
+   if (lo) im->load_opts = *lo;
+   im->load_error = error; /* points to object's load_error */
+   if (im->im->info.comment) im->comment = eina_stringshare_add(im->im->info.comment);
+//   if (im->im->info.format == 1) im->format = eina_stringshare_add("png");
+   if (im->im->cache_entry.flags.alpha) im->alpha = 1;
+   if (!_xr_image_hash) _xr_image_hash = eina_hash_string_superfast_new(NULL);
+   eina_hash_direct_add(_xr_image_hash, im->fkey, im);
+   return im;
+}
+
+XR_Image *
+_xre_xlib_image_new_from_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace)
+{
+   XR_Image *im;
+
+   im = calloc(1, sizeof(XR_Image));
+   if (!im) return NULL;
+   im->xinf = xinf;
+   im->xinf->references++;
+   im->cs.space = cspace;
+   im->w = w;
+   im->h = h;
+   im->references = 1;
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       im->data = data;
+       im->alpha = alpha;
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       im->cs.data = data;
+       im->cs.no_free = 1;
+       break;
+      default:
+       abort();
+       break;
+     }
+   im->dirty = 1;
+   __xre_xlib_image_dirty_hash_add(im);
+   return im;
+}
+
+XR_Image *
+_xre_xlib_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace)
+{
+   XR_Image *im;
+
+   im = calloc(1, sizeof(XR_Image));
+   if (!im) return NULL;
+   im->cs.space = cspace;
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       im->data = malloc(w * h * 4);
+       if (!im->data)
+         {
+            free(im);
+            return NULL;
+         }
+       if (data)
+         {
+            Gfx_Func_Copy func;
+
+            func = evas_common_draw_func_copy_get(w * h, 0);
+            if (func) func(data, im->data, w * h);
+            evas_common_cpu_end_opt();
+         }
+       im->alpha = alpha;
+       im->free_data = 1;
+        break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+        im->cs.no_free = 0;
+        im->cs.data = calloc(1, h * sizeof(unsigned char *) * 2);
+       if ((data) && (im->cs.data))
+         memcpy(im->cs.data, data, h * sizeof(unsigned char *) * 2);
+       break;
+      default:
+       abort();
+       break;
+     }
+   im->w = w;
+   im->h = h;
+   im->references = 1;
+   im->xinf = xinf;
+   im->xinf->references++;
+   im->dirty = 1;
+   __xre_xlib_image_dirty_hash_add(im);
+   return im;
+}
+
+XR_Image *
+_xre_xlib_image_new(Ximage_Info *xinf, int w, int h)
+{
+   XR_Image *im;
+
+   im = calloc(1, sizeof(XR_Image));
+   if (!im) return NULL;
+   im->data = malloc(w * h * 4);
+   if (!im->data)
+     {
+       free(im);
+       return NULL;
+     }
+   im->w = w;
+   im->h = h;
+   im->references = 1;
+   im->cs.space = EVAS_COLORSPACE_ARGB8888;
+   im->xinf = xinf;
+   im->xinf->references++;
+   im->free_data = 1;
+   im->alpha = 1;
+   im->dirty = 1;
+   __xre_xlib_image_dirty_hash_add(im);
+   return im;
+}
+
+static void
+__xre_xlib_image_real_free(XR_Image *im)
+{
+   if (im->cs.data)
+     {
+       if (!im->cs.no_free) free(im->cs.data);
+     }
+   if (im->file) eina_stringshare_del(im->file);
+   if (im->key) eina_stringshare_del(im->key);
+   if (im->fkey) free(im->fkey);
+   if (im->im) evas_cache_image_drop(&im->im->cache_entry);
+   if ((im->data) && (im->dirty)) __xre_xlib_image_dirty_hash_del(im);
+   if ((im->free_data) && (im->data)) free(im->data);
+   if (im->surface) _xr_xlib_render_surface_free(im->surface);
+   if (im->format) eina_stringshare_del(im->format);
+   if (im->comment) eina_stringshare_del(im->comment);
+   if (im->updates) evas_common_tilebuf_free(im->updates);
+   _xr_xlib_image_info_free(im->xinf);
+   free(im);
+}
+
+void
+_xre_xlib_image_free(XR_Image *im)
+{
+   im->references--;
+   if (im->references != 0) return;
+   if (!im->dirty)
+     {
+       if (im->fkey)
+         eina_hash_del(_xr_image_hash, im->fkey, im);
+       _xr_image_cache = eina_list_prepend(_xr_image_cache, im);
+       _xr_image_cache_usage += (im->w * im->h * 4);
+       _xre_xlib_image_cache_set(_xr_image_cache_size);
+     }
+   else
+     {
+       __xre_xlib_image_real_free(im);
+     }
+}
+
+void
+_xre_xlib_image_region_dirty(XR_Image *im, int x, int y, int w, int h)
+{
+   if (!im->updates)
+     {
+       im->updates = evas_common_tilebuf_new(im->w, im->h);
+       if (im->updates) evas_common_tilebuf_set_tile_size(im->updates, 8, 8);
+     }
+   if (im->updates)
+     evas_common_tilebuf_add_redraw(im->updates, x, y, w, h);
+}
+
+void
+_xre_xlib_image_dirty(XR_Image *im)
+{
+   if (im->dirty) return;
+   if (im->fkey)
+     eina_hash_del(_xr_image_hash, im->fkey, im);
+   im->dirty = 1;
+   __xre_xlib_image_dirty_hash_add(im);
+}
+
+XR_Image *
+_xre_xlib_image_copy(XR_Image *im)
+{
+   XR_Image *im2;
+   void *data = NULL;
+
+   if (im->data) data = im->data;
+   else if (im->cs.data) data = im->cs.data;
+   else
+     {
+       if (!im->im)
+         im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts), im->load_error);
+       if (im->im)
+         {
+            evas_cache_image_load_data(&im->im->cache_entry);
+            data = im->im->image.data;
+         }
+     }
+   if (!data) return NULL;
+   im2 = _xre_xlib_image_new_from_copied_data(im->xinf, im->w, im->h, data, im->alpha, im->cs.space);
+   return im2;
+}
+
+void
+_xre_xlib_image_resize(XR_Image *im, int w, int h)
+{
+   if ((w == im->w) && (h == im->h)) return;
+   if (im->surface)
+     {
+       Xrender_Surface *old_surface;
+       old_surface = im->surface;
+       im->surface = _xr_xlib_render_surface_new(old_surface->xinf, w + 2, h + 2, old_surface->x11.xlib.fmt, old_surface->alpha);
+       _xr_xlib_render_surface_free(old_surface);
+     }
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (im->data)
+         {
+            if (im->free_data)
+              {
+                 if (im->data) free(im->data);
+                 im->data = malloc(w * h * 4);
+              }
+         }
+       else if (im->im)
+         {
+            evas_cache_image_drop(&im->im->cache_entry);
+            im->im = NULL;
+            if (im->free_data)
+              {
+                 if (im->data) free(im->data);
+                 im->data = malloc(w * h * 4);
+              }
+         }
+       else
+         {
+            im->data = malloc(w * h * 4);
+            im->free_data = 1;
+         }
+        break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       if (im->data)
+         {
+            if (im->free_data)
+              {
+                 if (im->data) free(im->data);
+              }
+            im->data = NULL;
+         }
+       if (im->im)
+         {
+            evas_cache_image_drop(&im->im->cache_entry);
+            im->im = NULL;
+         }
+       if (!im->cs.no_free)
+         {
+            if (im->cs.data) free(im->cs.data);
+            im->cs.data = calloc(1, h * sizeof(unsigned char *) * 2);
+         }
+       break;
+      default:
+       abort();
+       break;
+     }
+   __xre_xlib_image_dirty_hash_del(im);
+   __xre_xlib_image_dirty_hash_add(im);
+   im->w = w;
+   im->h = h;
+}
+
+void *
+_xre_xlib_image_data_get(XR_Image *im)
+{
+   void *data = NULL;
+
+   if (im->data) data = im->data;
+   else if (im->cs.data) data = im->cs.data;
+   else
+     {
+       if (!im->im)
+         im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts), im->load_error);
+       if (im->im)
+         {
+            evas_cache_image_load_data(&im->im->cache_entry);
+            data = im->im->image.data;
+         }
+     }
+   return data;
+}
+
+XR_Image *
+_xre_xlib_image_data_find(void *data)
+{
+   XR_Image *im;
+
+   im = __xre_xlib_image_dirty_hash_find(data);
+   if (im)
+     {
+       im->references++;
+     }
+   return im;
+}
+
+void
+_xre_xlib_image_data_put(XR_Image *im, void *data)
+{
+   if (!data) return;
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (im->im)
+         {
+            if (data == im->im->image.data) return;
+            evas_cache_image_drop(&im->im->cache_entry);
+            im->im = NULL;
+         }
+       if (im->cs.data == data) return;
+       if (im->data)
+         {
+            if (im->data == data) return;
+            if (im->free_data) free(im->data);
+            im->free_data = 0;
+         }
+       im->data = data;
+       im->free_data = 0;
+        break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       if (im->data)
+         {
+            if (im->free_data) free(im->data);
+            im->data = NULL;
+         }
+       im->free_data = 0;
+       if (data == im->cs.data) return;
+       if (!im->cs.no_free)
+         {
+            if (im->cs.data) free(im->cs.data);
+         }
+       im->cs.data = data;
+       break;
+      default:
+       abort();
+       break;
+     }
+   __xre_xlib_image_dirty_hash_del(im);
+   __xre_xlib_image_dirty_hash_add(im);
+   if (im->surface)
+     {
+       _xr_xlib_render_surface_free(im->surface);
+       im->surface = NULL;
+     }
+   if (!im->dirty)
+     {
+       if (im->fkey)
+         eina_hash_del(_xr_image_hash, im->fkey, im);
+       im->dirty = 1;
+     }
+   if (im->updates)
+     {
+       evas_common_tilebuf_free(im->updates);
+       im->updates = NULL;
+     }
+}
+
+void
+_xre_xlib_image_alpha_set(XR_Image *im, int alpha)
+{
+   if (im->alpha == alpha) return;
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       im->alpha = alpha;
+       if (im->surface)
+         {
+            Xrender_Surface *old_surface;
+
+            old_surface = im->surface;
+            im->surface = NULL;
+            if (im->alpha)
+              im->surface = _xr_xlib_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt32, 1);
+            else
+              {
+                 /* FIXME: if im->depth == 16, use xinf->x11.fmtdef */
+                 if ((im->xinf->depth == 16) &&
+                     (((Visual *)im->xinf->x11.visual)->red_mask == 0xf800) &&
+                     (((Visual *)im->xinf->x11.visual)->green_mask == 0x07e0) &&
+                     (((Visual *)im->xinf->x11.visual)->blue_mask == 0x001f))
+                   im->surface = _xr_xlib_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmtdef, 0);
+                 else
+                   im->surface = _xr_xlib_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt24, 0);
+              }
+            if (im->surface)
+              _xr_xlib_render_surface_copy(old_surface, im->surface, 0, 0, 0, 0, im->w + 2, im->h + 2);
+            _xr_xlib_render_surface_free(old_surface);
+         }
+       if (im->updates)
+         {
+            evas_common_tilebuf_free(im->updates);
+            im->updates = NULL;
+         }
+      default:
+       break;
+     }
+}
+
+int
+_xre_xlib_image_alpha_get(XR_Image *im)
+{
+   if (im->im)
+     {
+       if (im->im->cache_entry.space != EVAS_COLORSPACE_ARGB8888) return 0;
+     }
+   return im->alpha;
+}
+
+void
+_xre_xlib_image_border_set(XR_Image *im, int l, int r, int t, int b)
+{
+   if (!im) return;
+   _xre_xlib_image_surface_gen(im);
+   if (l < 1) l = 0;
+   if (r < 1) r = 0;
+   if (t < 1) t = 0;
+   if (b < 1) b = 0;
+   if (im->surface)
+     {
+       if (l | r | t | b)
+         im->surface->bordered = 1;
+       else
+         im->surface->bordered = 0;
+    }
+}
+
+void
+_xre_xlib_image_border_get(XR_Image *im __UNUSED__, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__)
+{
+}
+
+void
+_xre_xlib_image_surface_gen(XR_Image *im)
+{
+   void *data = NULL, *tdata = NULL;
+
+   if ((im->surface) && (!im->updates)) return;
+   if (im->data) data = im->data;
+   else
+     {
+       if (!im->im)
+         im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts), im->load_error);
+       if (im->im)
+         {
+             evas_cache_image_load_data(&im->im->cache_entry);
+            data = im->im->image.data;
+         }
+     }
+   if (!data)
+     {
+       switch (im->cs.space)
+         {
+          case EVAS_COLORSPACE_ARGB8888:
+            return;
+            break;
+          case EVAS_COLORSPACE_YCBCR422P601_PL:
+          case EVAS_COLORSPACE_YCBCR422P709_PL:
+            if ((im->cs.data) && (*((unsigned char **)im->cs.data)))
+              {
+                 tdata = malloc(im->w * im->h * sizeof(DATA32));
+                 if (tdata)
+                   evas_common_convert_yuv_420p_601_rgba(im->cs.data,
+                                                         tdata,
+                                                         im->w, im->h);
+                 data = tdata;
+              }
+            break;
+          default:
+            abort();
+            break;
+         }
+       if (!data) return;
+     }
+   if (im->surface)
+     {
+       if (im->updates)
+         {
+            Tilebuf_Rect *rects, *r;
+
+            rects = evas_common_tilebuf_get_render_rects(im->updates);
+            if (rects)
+              {
+                 EINA_INLIST_FOREACH(rects, r)
+                   {
+                      int rx, ry, rw, rh;
+
+                      rx = r->x; ry = r->y; rw = r->w, rh = r->h;
+                      RECTS_CLIP_TO_RECT(rx, ry, rw, rh, 0, 0, im->w, im->h);
+                      if (im->alpha)
+                        _xr_xlib_render_surface_argb_pixels_fill(im->surface, im->w, im->h, data, rx, ry, rw, rh, 1, 1);
+                      else
+                      /* FIXME: if im->depth == 16 - convert to 16bpp then
+                       * upload */
+                        _xr_xlib_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, rx, ry, rw, rh, 1, 1);
+                   }
+                 evas_common_tilebuf_free_render_rects(rects);
+              }
+            evas_common_tilebuf_free(im->updates);
+            im->updates = NULL;
+         }
+       if (tdata) free(tdata);
+       return;
+     }
+   if (im->alpha)
+     {
+       im->surface = _xr_xlib_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt32, 1);
+       _xr_xlib_render_surface_argb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h, 1, 1);
+     }
+   else
+     {
+       /* FIXME: if im->xinf->depth == 16, use xinf->x11.fmtdef */
+       if ((im->xinf->depth == 16) &&
+           (((Visual *)im->xinf->x11.visual)->red_mask == 0xf800) &&
+           (((Visual *)im->xinf->x11.visual)->green_mask == 0x07e0) &&
+           (((Visual *)im->xinf->x11.visual)->blue_mask == 0x001f))
+         im->surface = _xr_xlib_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmtdef, 0);
+       else
+         im->surface = _xr_xlib_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt24, 0);
+       /* FIXME: if im->depth == 16 - convert to 16bpp then
+        * upload */
+       _xr_xlib_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h, 1, 1);
+     }
+   /* fill borders */
+   _xr_xlib_render_surface_copy(im->surface, im->surface,
+                          1, 1,
+                          0, 1,
+                          1, im->h);
+   _xr_xlib_render_surface_copy(im->surface, im->surface,
+                          0, 1,
+                          0, 0,
+                          im->w + 2, 1);
+   _xr_xlib_render_surface_copy(im->surface, im->surface,
+                          im->w, 1,
+                          im->w + 1, 1,
+                          1, im->h);
+   _xr_xlib_render_surface_copy(im->surface, im->surface,
+                          0, im->h,
+                          0, im->h + 1,
+                          im->w + 2, 1);
+   if ((im->im) && (!im->dirty))
+     {
+       evas_cache_image_drop(&im->im->cache_entry);
+       im->im = NULL;
+     }
+   if (tdata) free(tdata);
+}
+
+void
+_xre_xlib_image_cache_set(int size)
+{
+   _xr_image_cache_size = size;
+   while (_xr_image_cache_usage > _xr_image_cache_size)
+     {
+       Eina_List *l;
+
+       l = eina_list_last(_xr_image_cache);
+       if (l)
+         {
+            XR_Image *im;
+
+            im = l->data;
+            _xr_image_cache = eina_list_remove_list(_xr_image_cache, l);
+            _xr_image_cache_usage -= (im->w * im->h * 4);
+            __xre_xlib_image_real_free(im);
+         }
+     }
+}
+
+int
+_xre_xlib_image_cache_get(void)
+{
+   return _xr_image_cache_size;
+}
diff --git a/src/modules/engines/xrender_x11/evas_engine_xlib_render.c b/src/modules/engines/xrender_x11/evas_engine_xlib_render.c
new file mode 100644 (file)
index 0000000..2a597ef
--- /dev/null
@@ -0,0 +1,747 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+#include "evas_common.h"
+//#include "evas_macros.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_XRender_X11.h"
+#include <math.h>
+
+/* this is a work around broken xrender - when/if this ever gets fixed in xorg
+ * we can comment this out and one day remove it - for now keep it until such
+ * a fix is spotted in the wild
+ */
+#define BROKEN_XORG_XRENDER 1
+
+/* should be const char*, but the prototype for XRenderSetPictureFilter
+ * is silly
+ */
+static inline char *
+get_filter(int smooth)
+{
+   return smooth ? FilterBest : FilterNearest;
+}
+
+Xrender_Surface *
+_xr_xlib_render_surface_new(Ximage_Info *xinf, int w, int h, XRenderPictFormat *fmt, int alpha)
+{
+   Xrender_Surface *rs;
+   XRenderPictureAttributes att;
+
+   if ((!xinf) || (!fmt) || (w < 1) || (h < 1)) return NULL;
+   rs = calloc(1, sizeof(Xrender_Surface));
+   if (!rs) return NULL;
+   rs->xinf = xinf;
+   rs->width = w;
+   rs->height = h;
+   rs->x11.xlib.fmt = fmt;
+   rs->alpha = alpha;
+   rs->depth = fmt->depth;
+   rs->allocated = 1;
+   rs->x11.xlib.draw = XCreatePixmap(xinf->x11.connection, xinf->x11.root, w, h, fmt->depth);
+   if (rs->x11.xlib.draw == None)
+     {
+       free(rs);
+       return NULL;
+     }
+   rs->xinf->references++;
+   att.dither = 1;
+   att.component_alpha = 0;
+   att.repeat = 0;
+   rs->x11.xlib.pic = XRenderCreatePicture(xinf->x11.connection, rs->x11.xlib.draw, fmt,
+                                 CPRepeat | CPDither | CPComponentAlpha, &att);
+   if (rs->x11.xlib.pic == None)
+     {
+       XFreePixmap(rs->xinf->x11.connection, rs->x11.xlib.draw);
+       rs->xinf->references--;
+        free(rs);
+       return NULL;
+     }
+   return rs;
+}
+
+Xrender_Surface *
+_xr_xlib_render_surface_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, int alpha)
+{
+   Xrender_Surface *rs;
+   XRenderPictFormat *fmt;
+   XRenderPictureAttributes att;
+
+   if ((!xinf) || (draw == None) || (w < 1) || (h < 1)) return NULL;
+   fmt = XRenderFindVisualFormat(xinf->x11.connection, xinf->x11.visual);
+   if (!fmt) return NULL;
+   rs = calloc(1, sizeof(Xrender_Surface));
+   if (!rs) return NULL;
+   rs->xinf = xinf;
+   rs->width = w;
+   rs->height = h;
+   rs->x11.xlib.fmt = fmt;
+   rs->alpha = alpha;
+   rs->depth = fmt->depth;
+   if (fmt->depth == 32) rs->alpha = 1;
+   rs->allocated = 0;
+   rs->x11.xlib.draw = draw;
+   rs->xinf->references++;
+   att.dither = 1;
+   att.component_alpha = 0;
+   att.repeat = 0;
+   rs->x11.xlib.pic = XRenderCreatePicture(xinf->x11.connection, rs->x11.xlib.draw, fmt,
+                                 CPRepeat | CPDither | CPComponentAlpha, &att);
+   if (rs->x11.xlib.pic == None)
+     {
+       rs->xinf->references--;
+        free(rs);
+       return NULL;
+     }
+   return rs;
+}
+
+Xrender_Surface *
+_xr_xlib_render_surface_format_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, XRenderPictFormat *fmt, int alpha)
+{
+   Xrender_Surface *rs;
+   XRenderPictureAttributes att;
+
+   if ((!xinf) || (!fmt) || (draw == None) || (w < 1) || (h < 1)) return NULL;
+   rs = calloc(1, sizeof(Xrender_Surface));
+   if (!rs) return NULL;
+   rs->xinf = xinf;
+   rs->width = w;
+   rs->height = h;
+   rs->x11.xlib.fmt = fmt;
+   rs->alpha = alpha;
+   rs->depth = fmt->depth;
+   if (fmt->depth == 32) rs->alpha = 1;
+   rs->xinf->references++;
+   rs->allocated = 0;
+   rs->x11.xlib.draw = draw;
+   att.dither = 1;
+   att.component_alpha = 0;
+   att.repeat = 0;
+   rs->x11.xlib.pic = XRenderCreatePicture(xinf->x11.connection, rs->x11.xlib.draw, fmt,
+                                  CPRepeat | CPDither | CPComponentAlpha, &att);
+   if (rs->x11.xlib.pic == None)
+     {
+       rs->xinf->references--;
+        free(rs);
+       return NULL;
+     }
+   return rs;
+}
+
+void
+_xr_xlib_render_surface_free(Xrender_Surface *rs)
+{
+   if (!rs) return;
+   if (rs->xinf)
+     {
+       if ((rs->allocated) && (rs->x11.xlib.draw != None))
+          XFreePixmap(rs->xinf->x11.connection, rs->x11.xlib.draw);
+       if (rs->x11.xlib.pic != None)
+          XRenderFreePicture(rs->xinf->x11.connection, rs->x11.xlib.pic);
+       _xr_xlib_image_info_free(rs->xinf);
+       rs->xinf = NULL;
+     }
+   free(rs);
+}
+
+void
+_xr_xlib_render_surface_repeat_set(Xrender_Surface *rs, int repeat)
+{
+   XRenderPictureAttributes att;
+
+   att.repeat = repeat;
+   XRenderChangePicture(rs->xinf->x11.connection, rs->x11.xlib.pic, CPRepeat, &att);
+}
+
+void
+_xr_xlib_render_surface_solid_rectangle_set(Xrender_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h)
+{
+   XRenderColor col;
+
+   col.red   = (r << 8) | r;
+   col.green = (g << 8) | g;
+   col.blue  = (b << 8) | b;
+   col.alpha = (a << 8) | a;
+   XRenderFillRectangle(rs->xinf->x11.connection, PictOpSrc, rs->x11.xlib.pic, &col, x, y, w, h);
+}
+
+void
+_xr_xlib_render_surface_argb_pixels_fill(Xrender_Surface *rs, int sw, int sh __UNUSED__, void *pixels, int x, int y, int w, int h, int ox, int oy)
+{
+   Ximage_Image  *xim;
+   unsigned int  *p, *sp, *sple, *spe;
+   unsigned int   jump, sjump;
+
+   xim = _xr_xlib_image_new(rs->xinf, w, h, rs->depth);
+   if (!xim) return;
+   p = (unsigned int *)xim->data;
+   sp = ((unsigned int *)pixels) + (y * sw) + x;
+   jump = ((xim->line_bytes / 4) - w);
+   sjump = sw - w;
+   spe = sp + ((h - 1) * sw) + w;
+   if
+#ifdef WORDS_BIGENDIAN
+     (xim->x11.xlib.xim->byte_order == LSBFirst)
+#else
+     (xim->x11.xlib.xim->byte_order == MSBFirst)
+#endif
+     {
+       while (sp < spe)
+         {
+            sple = sp + w;
+            while (sp < sple)
+              {
+                 *p++ = (*sp << 24) + ((*sp << 8) & 0xff0000) + ((*sp >> 8) & 0xff00) + (*sp >> 24);
+//               *p++ = (B_VAL(sp) << 24) | (G_VAL(sp) << 16) | (R_VAL(sp) << 8) | A_VAL(sp);
+                 sp++;
+              }
+            p += jump;
+            sp += sjump;
+         }
+     }
+   else
+     {
+       while (sp < spe)
+         {
+            sple = sp + w;
+            while (sp < sple)
+               *p++ = *sp++;
+            p += jump;
+            sp += sjump;
+         }
+     }
+   _xr_xlib_image_put(xim, rs->x11.xlib.draw, x + ox, y + oy, w, h);
+}
+
+void
+_xr_xlib_render_surface_rgb_pixels_fill(Xrender_Surface *rs, int sw, int sh __UNUSED__, void *pixels, int x, int y, int w, int h, int ox, int oy)
+{
+   Ximage_Image  *xim;
+   unsigned int  *p, *sp, *sple, *spe;
+   unsigned int   jump, sjump;
+
+   xim = _xr_xlib_image_new(rs->xinf, w, h, rs->depth);
+   if (!xim) return;
+   p = (unsigned int *)xim->data;
+   sp = ((unsigned int *)pixels) + (y * sw) + x;
+   sjump = sw - w;
+   spe = sp + ((h - 1) * sw) + w;
+   if (rs->depth == 16)
+     {
+       jump = ((xim->line_bytes / 2) - w);
+       /* FIXME: if rs->depth == 16 - convert */
+       Gfx_Func_Convert conv_func;
+       int swap;
+
+#ifdef WORDS_BIGENDIAN
+       swap = (int)(xim->x11.xlib.xim->byte_order == LSBFirst);
+#else
+       swap = (int)(xim->x11.xlib.xim->byte_order == MSBFirst);
+#endif
+       /* FIXME: swap not handled */
+       conv_func = evas_common_convert_func_get((DATA8 *)sp, w, h, rs->depth,
+                                                ((Visual *)rs->xinf->x11.visual)->red_mask,
+                                                ((Visual *)rs->xinf->x11.visual)->green_mask,
+                                                ((Visual *)rs->xinf->x11.visual)->blue_mask,
+                                                PAL_MODE_NONE, 0);
+       if (conv_func)
+         conv_func(sp, (DATA8 *)p, sjump, jump, w, h, x, y, NULL);
+     }
+   else
+     {
+       jump = ((xim->line_bytes / 4) - w);
+       if
+#ifdef WORDS_BIGENDIAN
+         (xim->x11.xlib.xim->byte_order == LSBFirst)
+#else
+         (xim->x11.xlib.xim->byte_order == MSBFirst)
+#endif
+           {
+              while (sp < spe)
+                {
+                   sple = sp + w;
+                   while (sp < sple)
+                     {
+                        *p++ = (*sp << 24) + ((*sp << 8) & 0xff0000) + ((*sp >> 8) & 0xff00) + 0xff;
+//               *p++ = ((B_VAL(sp)) << 24) | ((G_VAL(sp)) << 16) | ((R_VAL(sp)) << 8) | 0x000000ff;
+                        sp++;
+                     }
+                   p += jump;
+                   sp += sjump;
+                }
+           }
+       else
+         {
+            while (sp < spe)
+              {
+                 sple = sp + w;
+                 while (sp < sple)
+                   *p++ = 0xff000000 | *sp++;
+                 p += jump;
+                 sp += sjump;
+              }
+         }
+     }
+   _xr_xlib_image_put(xim, rs->x11.xlib.draw, x + ox, y + oy, w, h);
+}
+
+void
+_xr_xlib_render_surface_clips_set(Xrender_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh)
+{
+   int num = 0;
+   XRectangle *rect = NULL;
+
+   if ((dc) && (dc->clip.use))
+     {
+       RECTS_CLIP_TO_RECT(rx, ry, rw, rh,
+                          dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h);
+     }
+   if ((!dc) || (!dc->cutout.rects))
+     {
+       rect = malloc(sizeof(XRectangle));
+       if (!rect) return;
+       rect->x = rx;
+       rect->y = ry;
+       rect->width = rw;
+       rect->height = rh;
+       num = 1;
+     }
+   else
+     {
+        Cutout_Rects    *rects;
+       Cutout_Rect     *r;
+        int i;
+
+        rects = evas_common_draw_context_apply_cutouts(dc);
+        num = rects->active;
+       rect = malloc(num * sizeof(XRectangle));
+       if (!rect) return;
+       for (i = 0; i < num; i++)
+         {
+            r = rects->rects + i;
+            rect[i].x = r->x;
+            rect[i].y = r->y;
+            rect[i].width = r->w;
+            rect[i].height = r->h;
+         }
+       evas_common_draw_context_apply_clear_cutouts(rects);
+     }
+   if (!rect) return;
+   XRenderSetPictureClipRectangles(rs->xinf->x11.connection, rs->x11.xlib.pic, 0, 0, rect, num);
+   free(rect);
+}
+
+/* initialized the transform to the identity */
+static void
+init_xtransform(XTransform *t)
+{
+   int i, j;
+
+   for (i = 0; i < 3; i++)
+     for (j = 0; j < 3; j++)
+       t->matrix[i][j] = XDoubleToFixed((i == j) ? 1 : 0);
+}
+
+static void
+set_xtransform_scale(XTransform *t, int sw, int sh, int w, int h, int tx, int ty)
+{
+//   if ((sw > 1) && (w > 1))
+//     { sw--;  w--; }
+//   if ((sh > 1) && (h > 1))
+//     { sh--;  h--; }
+   t->matrix[0][0] = XDoubleToFixed((double)(sw) / (double)(w));
+   t->matrix[1][1] = XDoubleToFixed((double)(sh) / (double)(h));
+   t->matrix[2][0] = (tx * sw) / w;
+   t->matrix[2][1] = (ty * sh) / h;
+}
+
+// when color multiplier is used want: instead
+// CA src IN mask SRC temp; non-CA temp OVER dst. - i think. need to check.
+void
+_xr_xlib_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth)
+{
+   Xrender_Surface *trs = NULL;
+   XTransform xf;
+   XRenderPictureAttributes att;
+   Picture mask = None;
+   int e, is_scaling, op;
+
+   if ((sw <= 0) || (sh <= 0) || (w <= 0) || (h <= 0)) return;
+
+   is_scaling = e = ((sw != w) || (sh != h));
+
+   att.clip_mask = None;
+   XRenderChangePicture(srs->xinf->x11.connection, srs->x11.xlib.pic, CPClipMask, &att);
+   XRenderChangePicture(drs->xinf->x11.connection, drs->x11.xlib.pic, CPClipMask, &att);
+
+   init_xtransform(&xf);
+
+   op = PictOpOver;
+   if (dc->render_op == _EVAS_RENDER_BLEND)
+     {
+       if (!srs->alpha) op = PictOpSrc;
+     }
+   else if (dc->render_op == _EVAS_RENDER_BLEND_REL)
+     op = PictOpAtop;
+   else if (dc->render_op == _EVAS_RENDER_MUL)
+     op = PictOpIn;
+   else if (dc->render_op == _EVAS_RENDER_COPY)
+     op = PictOpSrc;
+   else if (dc->render_op == _EVAS_RENDER_COPY_REL)
+     op = PictOpIn;
+   else if (dc->render_op == _EVAS_RENDER_MASK)
+     op = PictOpInReverse;
+
+   if ((dc) && (dc->mul.use))
+     {
+       int r, g, b, a;
+
+       if ((op == PictOpOver) && (!dc->mul.col)) return;
+       a = dc->mul.col >> 24;
+       r = (dc->mul.col >> 16) & 0xff;
+       g = (dc->mul.col >> 8) & 0xff;
+       b = dc->mul.col & 0xff;
+       if (a < 255) op = PictOpOver;
+       if (dc->mul.col != 0xffffffff)
+         {
+            if ((srs->xinf->mul_r != r) || (srs->xinf->mul_g != g) ||
+                (srs->xinf->mul_b != b) || (srs->xinf->mul_a != a))
+              {
+                 srs->xinf->mul_r = r;
+                 srs->xinf->mul_g = g;
+                 srs->xinf->mul_b = b;
+                 srs->xinf->mul_a = a;
+                 _xr_xlib_render_surface_solid_rectangle_set(srs->xinf->mul,
+                                                              r, g, b, a,
+                                                              0, 0, 1, 1);
+              }
+            mask = srs->xinf->mul->x11.xlib.pic;
+            if (dc->mul.col == (a * 0x01010101))
+              {
+                att.component_alpha = 0;
+                XRenderChangePicture(srs->xinf->x11.connection, mask, CPComponentAlpha, &att);
+              }
+            else
+              {
+                 if ((srs->alpha) || (a != 0xff))
+                   trs = _xr_xlib_render_surface_new(srs->xinf, sw + 2, sh + 2,
+                                                      srs->xinf->x11.fmt32, 1);
+                 else
+                   trs = _xr_xlib_render_surface_new(srs->xinf, sw + 2, sh + 2,
+                                                      srs->x11.xlib.fmt, srs->alpha);
+                 if (!trs) return;
+
+                 att.component_alpha = 1;
+                 XRenderChangePicture(srs->xinf->x11.connection, mask, CPComponentAlpha, &att);
+                 XRenderSetPictureTransform(srs->xinf->x11.connection, srs->x11.xlib.pic, &xf);
+                 XRenderComposite(srs->xinf->x11.connection, PictOpSrc, srs->x11.xlib.pic, mask,
+                                  trs->x11.xlib.pic,
+                                  sx, sy,
+                                  sx, sy,
+                                  0, 0, sw + 2, sh + 2);
+                 mask = None;
+              }
+         }
+     }
+
+//#define HFW + (sw / 2)
+//#define HFH + (sh / 2)
+#define HFW
+#define HFH
+
+   _xr_xlib_render_surface_clips_set(drs, dc, x, y, w, h);
+   if (trs)
+     {
+       XRenderSetPictureFilter(trs->xinf->x11.connection, trs->x11.xlib.pic, get_filter(smooth), NULL, 0);
+
+       set_xtransform_scale(&xf, sw, sh, w, h, -1, -1);
+       XRenderSetPictureTransform(trs->xinf->x11.connection, trs->x11.xlib.pic, &xf);
+
+       att.component_alpha = 0;
+       if (dc->render_op == _EVAS_RENDER_MUL) att.component_alpha = 1;
+       XRenderChangePicture(trs->xinf->x11.connection, trs->x11.xlib.pic, CPComponentAlpha, &att);
+
+       XRenderComposite(trs->xinf->x11.connection, op, trs->x11.xlib.pic, mask, drs->x11.xlib.pic,
+                        (w HFW) / sw, (h HFH) / sh,
+                        (w HFW) / sw, (h HFH) / sh,
+                        x, y, w, h);
+       _xr_xlib_render_surface_free(trs);
+     }
+   else
+     {
+       if (srs->bordered && is_scaling)
+         {
+            trs = _xr_xlib_render_surface_new(srs->xinf, sw + 2, sh + 2,
+                                         srs->x11.xlib.fmt, srs->alpha);
+            if (!trs) return;
+
+            att.component_alpha = 0;
+            XRenderChangePicture(srs->xinf->x11.connection, srs->x11.xlib.pic, CPComponentAlpha, &att);
+            XRenderSetPictureTransform(srs->xinf->x11.connection, srs->x11.xlib.pic, &xf);
+
+            XRenderComposite(srs->xinf->x11.connection, PictOpSrc, srs->x11.xlib.pic, None,
+                             trs->x11.xlib.pic, sx, sy, sx, sy, 0, 0, sw + 2, sh + 2);
+
+            XRenderSetPictureFilter(trs->xinf->x11.connection, trs->x11.xlib.pic, get_filter(smooth), NULL, 0);
+
+            set_xtransform_scale(&xf, sw, sh, w, h, -1, -1);
+            XRenderSetPictureTransform(trs->xinf->x11.connection, trs->x11.xlib.pic, &xf);
+
+            if (dc->render_op == _EVAS_RENDER_MUL)
+              {
+                 att.component_alpha = 1;
+                 XRenderChangePicture(trs->xinf->x11.connection, trs->x11.xlib.pic, CPComponentAlpha, &att);
+              }
+
+            XRenderComposite(trs->xinf->x11.connection, op, trs->x11.xlib.pic, mask, drs->x11.xlib.pic,
+                             (w HFW) / sw, (h HFH) / sh,
+                             (w HFW) / sw, (h HFH) / sh,
+//                           1, 1, 1, 1,
+                             x, y, w, h);
+            _xr_xlib_render_surface_free(trs);
+         }
+       else
+         {
+            XRenderSetPictureFilter(srs->xinf->x11.connection, srs->x11.xlib.pic, get_filter(smooth), NULL, 0);
+
+            set_xtransform_scale(&xf, sw, sh, w, h, 0, 0);
+            XRenderSetPictureTransform(srs->xinf->x11.connection, srs->x11.xlib.pic, &xf);
+
+            att.component_alpha = 0;
+            if (dc->render_op == _EVAS_RENDER_MUL)
+              att.component_alpha = 1;
+            XRenderChangePicture(srs->xinf->x11.connection, srs->x11.xlib.pic, CPComponentAlpha, &att);
+
+            XRenderComposite(srs->xinf->x11.connection, op, srs->x11.xlib.pic, mask, drs->x11.xlib.pic,
+                             ((((sx + 1) * w) HFW) / sw),
+                             ((((sy + 1) * h) HFH) / sh),
+                             ((((sx + 1) * w) HFW) / sw),
+                             ((((sy + 1) * h) HFH) / sh),
+                             x, y, w, h);
+         }
+     }
+}
+
+void
+_xr_xlib_render_surface_copy(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int sy, int x, int y, int w, int h)
+{
+   XTransform xf;
+   XRenderPictureAttributes att;
+
+   if ((w <= 0) || (h <= 0) || (!srs) || (!drs)) return;
+
+   init_xtransform(&xf);
+#ifdef BROKEN_XORG_XRENDER
+   /* FIXME: why do we need to change the identity matrix ifthe src surface
+    * is 1 bit deep?
+    */
+   if (srs->depth == 1)
+     {
+       xf.matrix[0][0] = xf.matrix[1][1] = xf.matrix[2][2] = 1;
+     }
+#endif
+   XRenderSetPictureTransform(srs->xinf->x11.connection, srs->x11.xlib.pic, &xf);
+//   XRenderSetPictureFilter(srs->xinf->x11.connection, srs->x11.xlib.pic, FilterNearest, NULL, 0);
+
+   att.clip_mask = None;
+   XRenderChangePicture(srs->xinf->x11.connection, srs->x11.xlib.pic, CPClipMask, &att);
+   XRenderChangePicture(drs->xinf->x11.connection, drs->x11.xlib.pic, CPClipMask, &att);
+
+   XRenderComposite(srs->xinf->x11.connection, PictOpSrc, srs->x11.xlib.pic, None, drs->x11.xlib.pic,
+                   sx, sy, 0, 0, x, y, w, h);
+}
+
+void
+_xr_xlib_render_surface_rectangle_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h)
+{
+   XRenderColor col;
+   XRenderPictureAttributes att;
+   int r, g, b, a, op;
+
+   if ((!rs) || (!dc)) return;
+   if ((w <= 0) || (h <= 0)) return;
+   a = dc->col.col >> 24;
+   r = (dc->col.col >> 16) & 0xff;
+   g = (dc->col.col >> 8 ) & 0xff;
+   b = (dc->col.col      ) & 0xff;
+   col.red   = (r << 8) | r;
+   col.green = (g << 8) | g;
+   col.blue  = (b << 8) | b;
+   col.alpha = (a << 8) | a;
+   op = PictOpOver;
+   if (dc->render_op == _EVAS_RENDER_BLEND)
+     {
+       if (!dc->col.col) return;
+       if (a == 0xff) op = PictOpSrc;
+     }
+   else if (dc->render_op == _EVAS_RENDER_BLEND_REL)
+     {
+       if (!dc->col.col) return;
+       op = PictOpAtop;
+     }
+   else if (dc->render_op == _EVAS_RENDER_MUL)
+     {
+       if (dc->col.col == 0xffffffff) return;
+       op = PictOpIn;
+     }
+   else if (dc->render_op == _EVAS_RENDER_COPY)
+       op = PictOpSrc;
+   else if (dc->render_op == _EVAS_RENDER_COPY_REL)
+       op = PictOpIn;
+   else if (dc->render_op == _EVAS_RENDER_MASK)
+       op = PictOpInReverse;
+
+   att.clip_mask = None;
+   XRenderChangePicture(rs->xinf->x11.connection, rs->x11.xlib.pic, CPClipMask, &att);
+
+   _xr_xlib_render_surface_clips_set(rs, dc, x, y, w, h);
+   XRenderFillRectangle(rs->xinf->x11.connection, op, rs->x11.xlib.pic, &col, x, y, w, h);
+}
+
+void
+_xr_xlib_render_surface_line_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2)
+{
+   XRenderPictureAttributes att;
+   int op;
+
+   if ((!rs) || (!dc) || (!dc->col.col)) return;
+   op = PictOpOver;
+   if (dc->render_op == _EVAS_RENDER_BLEND)
+     {
+       if (!dc->col.col) return;
+     }
+   else if (dc->render_op == _EVAS_RENDER_BLEND_REL)
+     {
+       if (!dc->col.col) return;
+       op = PictOpAtop;
+     }
+   else if (dc->render_op == _EVAS_RENDER_MUL)
+     {
+       if (dc->col.col == 0xffffffff) return;
+       op = PictOpIn;
+     }
+   else if (dc->render_op == _EVAS_RENDER_COPY)
+       op = PictOpSrc;
+   else if (dc->render_op == _EVAS_RENDER_COPY_REL)
+       op = PictOpIn;
+   else if (dc->render_op == _EVAS_RENDER_MASK)
+       op = PictOpInReverse;
+   att.clip_mask = None;
+   XRenderChangePicture(rs->xinf->x11.connection, rs->x11.xlib.pic, CPClipMask, &att);
+   _xr_xlib_render_surface_clips_set(rs, dc, 0, 0, rs->width, rs->height);
+
+     {
+       int r, g, b, a;
+       XPointDouble poly[4];
+       int dx, dy;
+       double len, ddx, ddy;
+
+       dx = x2 - x1;
+       dy = y2 - y1;
+       len = sqrt((double)(dx * dx) + (double)(dy * dy));
+       ddx = (0.5 * dx) / len;
+       ddy = (0.5 * dy) / len;
+       if (ddx < 0) ddx = -0.5 - ddx;
+       else ddx = 0.5 - ddx;
+       if (ddy < 0) ddy = -0.5 - ddy;
+       else ddy = 0.5 - ddy;
+       poly[0].x =  (x1 + ddx);
+       poly[0].y =  (y1 - ddy);
+       poly[1].x =  (x2 + ddx);
+       poly[1].y =  (y2 - ddy);
+       poly[2].x =  (x2 - ddx);
+       poly[2].y =  (y2 + ddy);
+       poly[3].x =  (x1 - ddx);
+       poly[3].y =  (y1 + ddy);
+
+       a = (dc->col.col >> 24) & 0xff;
+       r = (dc->col.col >> 16) & 0xff;
+       g = (dc->col.col >> 8 ) & 0xff;
+       b = (dc->col.col      ) & 0xff;
+       if ((rs->xinf->mul_r != r) || (rs->xinf->mul_g != g) ||
+           (rs->xinf->mul_b != b) || (rs->xinf->mul_a != a))
+         {
+            rs->xinf->mul_r = r;
+            rs->xinf->mul_g = g;
+            rs->xinf->mul_b = b;
+            rs->xinf->mul_a = a;
+            _xr_xlib_render_surface_solid_rectangle_set(rs->xinf->mul, r, g, b, a, 0, 0, 1, 1);
+         }
+       XRenderCompositeDoublePoly(rs->xinf->x11.connection, op,
+                                  rs->xinf->mul->x11.xlib.pic, rs->x11.xlib.pic,
+                                  rs->xinf->x11.fmt8, 0, 0, 0, 0,
+                                  poly, 4, EvenOddRule);
+     }
+}
+
+void
+_xr_xlib_render_surface_polygon_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y)
+{
+   RGBA_Polygon_Point *pt;
+   int i, num;
+   XPointDouble *pts;
+   int r, g, b, a;
+   XRenderPictureAttributes att;
+   int op;
+
+   if ((!rs) || (!dc)) return;
+   num = 0; EINA_INLIST_FOREACH(points, pt) num++;
+   if (num < 3) return;
+   op = PictOpOver;
+   if (dc->render_op == _EVAS_RENDER_BLEND)
+     {
+       if (!dc->col.col) return;
+     }
+   else if (dc->render_op == _EVAS_RENDER_BLEND_REL)
+     {
+       if (!dc->col.col) return;
+       op = PictOpAtop;
+     }
+   else if (dc->render_op == _EVAS_RENDER_MUL)
+     {
+       if (dc->col.col == 0xffffffff) return;
+       op = PictOpIn;
+     }
+   else if (dc->render_op == _EVAS_RENDER_COPY)
+       op = PictOpSrc;
+   else if (dc->render_op == _EVAS_RENDER_COPY_REL)
+       op = PictOpIn;
+   else if (dc->render_op == _EVAS_RENDER_MASK)
+       op = PictOpInReverse;
+   a = (dc->col.col >> 24) & 0xff;
+   r = (dc->col.col >> 16) & 0xff;
+   g = (dc->col.col >> 8 ) & 0xff;
+   b = (dc->col.col      ) & 0xff;
+   if ((rs->xinf->mul_r != r) || (rs->xinf->mul_g != g) ||
+       (rs->xinf->mul_b != b) || (rs->xinf->mul_a != a))
+     {
+       rs->xinf->mul_r = r;
+       rs->xinf->mul_g = g;
+       rs->xinf->mul_b = b;
+       rs->xinf->mul_a = a;
+       _xr_xlib_render_surface_solid_rectangle_set(rs->xinf->mul, r, g, b, a, 0, 0, 1, 1);
+     }
+   pts = malloc(num * sizeof(XPointDouble));
+   if (!pts) return;
+   i = 0;
+   EINA_INLIST_FOREACH(points, pt)
+     {
+       if (i < num)
+         {
+            pts[i].x = pt->x + x;
+            pts[i].y = pt->y + y;
+            i++;
+         }
+    }
+   att.clip_mask = None;
+   XRenderChangePicture(rs->xinf->x11.connection, rs->x11.xlib.pic, CPClipMask, &att);
+
+   _xr_xlib_render_surface_clips_set(rs, dc, 0, 0, rs->width, rs->height);
+   XRenderCompositeDoublePoly(rs->xinf->x11.connection, op,
+                             rs->xinf->mul->x11.xlib.pic, rs->x11.xlib.pic,
+                             rs->xinf->x11.fmt8, 0, 0, 0, 0,
+                             pts, num, Complex);
+   free(pts);
+}
diff --git a/src/modules/engines/xrender_x11/evas_engine_xlib_ximage.c b/src/modules/engines/xrender_x11/evas_engine_xlib_ximage.c
new file mode 100644 (file)
index 0000000..a17bab7
--- /dev/null
@@ -0,0 +1,262 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_engine.h"
+#include "Evas_Engine_XRender_X11.h"
+
+static Eina_List *_image_info_list = NULL;
+
+static int _x_err = 0;
+static void
+_tmp_x_err(Display *d __UNUSED__, XErrorEvent *ev __UNUSED__)
+{
+   _x_err = 1;
+   return;
+}
+
+Ximage_Info *
+_xr_xlib_image_info_get(Display *display, Drawable draw, Visual *visual)
+{
+   Ximage_Info *xinf;
+   Ximage_Info *xinf2;
+   Eina_List   *l;
+   int          di;
+   unsigned int dui;
+   Window       root;
+
+   xinf2 = NULL;
+   EINA_LIST_FOREACH(_image_info_list, l, xinf)
+     if (xinf->x11.connection == display)
+       {
+        xinf2 = xinf;
+        break;
+       }
+   xinf = calloc(1, sizeof(Ximage_Info));
+   if (!xinf) return NULL;
+
+   xinf->references = 1;
+   xinf->x11.connection = display;
+   xinf->x11.draw = draw;
+   XGetGeometry(xinf->x11.connection, xinf->x11.draw,
+                &root,
+               &di, &di, &dui, &dui, &dui, &dui);
+   xinf->x11.root = root;
+   xinf->x11.visual = visual;
+   xinf->x11.fmt32 = XRenderFindStandardFormat(xinf->x11.connection, PictStandardARGB32);
+   xinf->x11.fmt24 = XRenderFindStandardFormat(xinf->x11.connection, PictStandardRGB24);
+   xinf->x11.fmt8 = XRenderFindStandardFormat(xinf->x11.connection, PictStandardA8);
+   xinf->x11.fmt4 = XRenderFindStandardFormat(xinf->x11.connection, PictStandardA4);
+   xinf->x11.fmt1 = XRenderFindStandardFormat(xinf->x11.connection, PictStandardA1);
+
+   /* find fmt for default visual */
+   xinf->x11.fmtdef = XRenderFindVisualFormat(xinf->x11.connection, xinf->x11.visual);
+
+   xinf->mul = _xr_xlib_render_surface_new(xinf, 1, 1, xinf->x11.fmt32, 1);
+   _xr_xlib_render_surface_repeat_set(xinf->mul, 1);
+   xinf->mul_r = xinf->mul_g = xinf->mul_b = xinf->mul_a = 0xff;
+   _xr_xlib_render_surface_solid_rectangle_set(xinf->mul, xinf->mul_r, xinf->mul_g, xinf->mul_b, xinf->mul_a, 0, 0, 1, 1);
+   if (xinf2)
+     {
+       xinf->can_do_shm = xinf2->can_do_shm;
+       xinf->depth = xinf2->depth;
+     }
+   else
+     {
+       XVisualInfo *vi, vit;
+       XShmSegmentInfo shm_info;
+       XImage *xim;
+       int num = 0;
+
+       vit.visualid = XVisualIDFromVisual(xinf->x11.visual);
+       vi = XGetVisualInfo(xinf->x11.connection, VisualIDMask, &vit, &num);
+       if (!vi) xinf->depth = 32;
+       else
+         {
+            xinf->depth = vi->depth;
+            XFree(vi);
+         }
+       xinf->can_do_shm = 0;
+       xim = XShmCreateImage(xinf->x11.connection, xinf->x11.visual, xinf->depth, ZPixmap, NULL, &shm_info, 1, 1);
+       if (xim)
+         {
+            shm_info.shmid = shmget(IPC_PRIVATE, xim->bytes_per_line * xim->height, IPC_CREAT | 0777);
+            if (shm_info.shmid >= 0)
+              {
+                 shm_info.shmaddr = xim->data = shmat(shm_info.shmid, 0, 0);
+                 if ((shm_info.shmaddr) && (shm_info.shmaddr != (void *) -1))
+                   {
+                      XErrorHandler ph;
+
+                      XSync(xinf->x11.connection, False);
+                      _x_err = 0;
+                      ph = XSetErrorHandler((XErrorHandler)_tmp_x_err);
+                      XShmAttach(xinf->x11.connection, &shm_info);
+                      XSync(xinf->x11.connection, False);
+                      XSetErrorHandler((XErrorHandler)ph);
+                      if (!_x_err) xinf->can_do_shm = 1;
+                      shmdt(shm_info.shmaddr);
+                   }
+                 shmctl(shm_info.shmid, IPC_RMID, 0);
+              }
+            XDestroyImage(xim);
+         }
+     }
+   _image_info_list = eina_list_prepend(_image_info_list, xinf);
+   return xinf;
+}
+
+void
+_xr_xlib_image_info_free(Ximage_Info *xinf)
+{
+   if (xinf->pool) XSync(xinf->x11.connection, False);
+   _xr_xlib_image_info_pool_flush(xinf, 0, 0);
+   xinf->references--;
+   if (xinf->references != 0) return;
+   _xr_xlib_render_surface_free(xinf->mul);
+   free(xinf);
+   _image_info_list = eina_list_remove(_image_info_list, xinf);
+}
+
+void
+_xr_xlib_image_info_pool_flush(Ximage_Info *xinf, int max_num, int max_mem)
+{
+   if ((xinf->pool_mem <= max_mem) && (eina_list_count(xinf->pool) <= max_num)) return;
+   while ((xinf->pool_mem > max_mem) || (eina_list_count(xinf->pool) > max_num))
+     {
+       Ximage_Image *xim;
+
+       if (!xinf->pool) break;
+       xim = xinf->pool->data;
+       _xr_xlib_image_free(xim);
+     }
+}
+
+Ximage_Image *
+_xr_xlib_image_new(Ximage_Info *xinf, int w, int h, int depth)
+{
+   Ximage_Image *xim, *xim2;
+   Eina_List *l;
+
+   xim2 = NULL;
+   EINA_LIST_FOREACH(xinf->pool, l, xim)
+     {
+       if ((xim->width >= w) && (xim->height >= h) && (xim->depth == depth) && (xim->available))
+         {
+            if (!xim2) xim2 = xim;
+            else if ((xim->width * xim->height) < (xim2->width * xim2->height)) xim2 = xim;
+         }
+     }
+   if (xim2)
+     {
+       xim2->available = 0;
+       return xim2;
+     }
+   xim = calloc(1, sizeof(Ximage_Image));
+   if (xim)
+     {
+       xim->xinf = xinf;
+       xim->width = w;
+       xim->height = h;
+       xim->depth = depth;
+       xim->available = 0;
+       if (xim->xinf->can_do_shm)
+         {
+            xim->x11.xlib.shm_info = calloc(1, sizeof(XShmSegmentInfo));
+            if (xim->x11.xlib.shm_info)
+              {
+                 xim->x11.xlib.xim = XShmCreateImage(xim->xinf->x11.connection, xim->xinf->x11.visual, xim->depth, ZPixmap, NULL, xim->x11.xlib.shm_info, xim->width, xim->height);
+                 if (xim->x11.xlib.xim)
+                   {
+                      xim->x11.xlib.shm_info->shmid = shmget(IPC_PRIVATE, xim->x11.xlib.xim->bytes_per_line * xim->x11.xlib.xim->height, IPC_CREAT | 0777);
+                      if (xim->x11.xlib.shm_info->shmid >= 0)
+                        {
+                           xim->x11.xlib.shm_info->shmaddr = xim->x11.xlib.xim->data = shmat(xim->x11.xlib.shm_info->shmid, 0, 0);
+                           if ((xim->x11.xlib.shm_info->shmaddr) && (xim->x11.xlib.shm_info->shmaddr != (void *) -1))
+                             {
+                                XErrorHandler ph;
+
+                                XSync(xim->xinf->x11.connection, False);
+                                _x_err = 0;
+                                ph = XSetErrorHandler((XErrorHandler)_tmp_x_err);
+                                XShmAttach(xim->xinf->x11.connection, xim->x11.xlib.shm_info);
+                                XSync(xim->xinf->x11.connection, False);
+                                XSetErrorHandler((XErrorHandler)ph);
+                                if (!_x_err) goto xim_ok;
+                                shmdt(xim->x11.xlib.shm_info->shmaddr);
+                             }
+                           shmctl(xim->x11.xlib.shm_info->shmid, IPC_RMID, 0);
+                        }
+                      XDestroyImage(xim->x11.xlib.xim);
+                   }
+                 free(xim->x11.xlib.shm_info);
+                 xim->x11.xlib.shm_info = NULL;
+              }
+         }
+       xim->x11.xlib.xim = XCreateImage(xim->xinf->x11.connection, xim->xinf->x11.visual, xim->depth, ZPixmap, 0, NULL, xim->width, xim->height, 32, 0);
+       if (!xim->x11.xlib.xim)
+         {
+            free(xim);
+            return NULL;
+         }
+       xim->x11.xlib.xim->data = malloc(xim->x11.xlib.xim->bytes_per_line * xim->x11.xlib.xim->height);
+       if (!xim->x11.xlib.xim->data)
+         {
+            XDestroyImage(xim->x11.xlib.xim);
+            free(xim);
+            return NULL;
+         }
+     }
+   else
+     {
+       return NULL;
+     }
+
+   xim_ok:
+   _xr_xlib_image_info_pool_flush(xinf, 32, (1600 * 1200 * 32 * 2));
+
+   xim->line_bytes = xim->x11.xlib.xim->bytes_per_line;
+   xim->data = (void *)(xim->x11.xlib.xim->data);
+   xinf->pool_mem += (xim->width * xim->height * xim->depth);
+   xinf->pool = eina_list_append(xinf->pool, xim);
+   return xim;
+}
+
+void
+_xr_xlib_image_free(Ximage_Image *xim)
+{
+   if (xim->x11.xlib.shm_info)
+     {
+       if (!xim->available) XSync(xim->xinf->x11.connection, False);
+       XShmDetach(xim->xinf->x11.connection, xim->x11.xlib.shm_info);
+       XDestroyImage(xim->x11.xlib.xim);
+       shmdt(xim->x11.xlib.shm_info->shmaddr);
+       shmctl(xim->x11.xlib.shm_info->shmid, IPC_RMID, 0);
+       free(xim->x11.xlib.shm_info);
+     }
+   else
+     {
+       free(xim->x11.xlib.xim->data);
+       xim->x11.xlib.xim->data = NULL;
+       XDestroyImage(xim->x11.xlib.xim);
+     }
+   xim->xinf->pool_mem -= (xim->width * xim->height * xim->depth);
+   xim->xinf->pool = eina_list_remove(xim->xinf->pool, xim);
+   free(xim);
+}
+
+void
+_xr_xlib_image_put(Ximage_Image *xim, Drawable draw, int x, int y, int w, int h)
+{
+   XGCValues gcv;
+   GC gc;
+
+   gc = XCreateGC(xim->xinf->x11.connection, draw, 0, &gcv);
+   if (xim->x11.xlib.shm_info)
+     {
+       XShmPutImage(xim->xinf->x11.connection, draw, gc, xim->x11.xlib.xim, 0, 0, x, y, w, h, False);
+       XSync(xim->xinf->x11.connection, False);
+     }
+   else
+     XPutImage(xim->xinf->x11.connection, draw, gc, xim->x11.xlib.xim, 0, 0, x, y, w, h);
+   xim->available = 1;
+   XFreeGC(xim->xinf->x11.connection, gc);
+}
diff --git a/src/modules/loaders/.cvsignore b/src/modules/loaders/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/src/modules/loaders/Makefile.am b/src/modules/loaders/Makefile.am
new file mode 100644 (file)
index 0000000..569887c
--- /dev/null
@@ -0,0 +1,58 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS =
+
+if BUILD_LOADER_EDB
+if !EVAS_STATIC_BUILD_EDB
+SUBDIRS += edb
+endif
+endif
+
+if BUILD_LOADER_EET
+if !EVAS_STATIC_BUILD_EET
+SUBDIRS += eet
+endif
+endif
+
+if BUILD_LOADER_GIF
+if !EVAS_STATIC_BUILD_GIF
+SUBDIRS += gif
+endif
+endif
+
+if BUILD_LOADER_JPEG
+if !EVAS_STATIC_BUILD_JPEG
+SUBDIRS += jpeg
+endif
+endif
+
+if BUILD_LOADER_PMAPS
+if !EVAS_STATIC_BUILD_PMAPS
+SUBDIRS += pmaps
+endif
+endif
+
+if BUILD_LOADER_PNG
+if !EVAS_STATIC_BUILD_PNG
+SUBDIRS += png
+endif
+endif
+
+if BUILD_LOADER_SVG
+if !EVAS_STATIC_BUILD_SVG
+SUBDIRS += svg
+endif
+endif
+
+if BUILD_LOADER_TIFF
+if !EVAS_STATIC_BUILD_TIFF
+SUBDIRS += tiff
+endif
+endif
+
+if BUILD_LOADER_XPM
+if !EVAS_STATIC_BUILD_XPM
+SUBDIRS += xpm
+endif
+endif
+
diff --git a/src/modules/loaders/edb/.cvsignore b/src/modules/loaders/edb/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/loaders/edb/Makefile.am b/src/modules/loaders/edb/Makefile.am
new file mode 100644 (file)
index 0000000..bdb2127
--- /dev/null
@@ -0,0 +1,33 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@evas_image_loader_edb_cflags@ \
+@EINA_CFLAGS@
+
+
+if BUILD_LOADER_EDB
+if !EVAS_STATIC_BUILD_EDB
+
+pkgdir = $(libdir)/evas/modules/loaders/edb/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = evas_image_load_edb.c
+
+module_la_LIBADD = @evas_image_loader_edb_libs@ @EINA_LIBS@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_loader_edb.la
+
+libevas_loader_edb_la_SOURCES = evas_image_load_edb.c
+libevas_loader_edb_la_LIBADD = @evas_image_loader_edb_libs@
+
+endif
+endif
diff --git a/src/modules/loaders/edb/evas_image_load_edb.c b/src/modules/loaders/edb/evas_image_load_edb.c
new file mode 100644 (file)
index 0000000..239a072
--- /dev/null
@@ -0,0 +1,249 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+#include <Edb.h>
+#include <zlib.h>
+
+
+#define SWAP32(x) (x) = ((((x) & 0x000000ff ) << 24) | (((x) & 0x0000ff00 ) << 8) | (((x) & 0x00ff0000 ) >> 8) | (((x) & 0xff000000 ) >> 24))
+
+
+static Eina_Bool evas_image_load_file_head_edb(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+static Eina_Bool evas_image_load_file_data_edb(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+
+static Evas_Image_Load_Func evas_image_load_edb_func =
+{
+  EINA_TRUE,
+  evas_image_load_file_head_edb,
+  evas_image_load_file_data_edb
+};
+
+static Eina_Bool
+evas_image_load_file_head_edb(Image_Entry *ie, const char *file, const char *key, int *error)
+{
+   int                  w, h, alpha, compression, size;
+   E_DB_File           *db;
+   DATA32              *ret;
+   DATA32               header[8];
+
+   if (!key)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+   db = e_db_open_read((char *)file);
+   if (!db)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+   ret = e_db_data_get(db, (char *)key, &size);
+   if (!ret)
+     {
+       e_db_close(db);
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+   if (size < 32)
+     {
+       free(ret);
+       e_db_close(db);
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+   memcpy(header, ret, 32);
+#ifdef WORDS_BIGENDIAN
+     {
+       int i;
+
+       for (i = 0; i < 8; i++) SWAP32(header[i]);
+     }
+#endif
+   if (header[0] != 0xac1dfeed)
+     {
+       free(ret);
+       e_db_close(db);
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+   w = header[1];
+   h = header[2];
+   if ((w < 1) || (h < 1) || (w > IMG_MAX_SIZE) || (h > IMG_MAX_SIZE) || 
+       IMG_TOO_BIG(w, h))
+     {
+       free(ret);
+       e_db_close(db);
+       if (IMG_TOO_BIG(w, h))
+         *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       else
+         *error = EVAS_LOAD_ERROR_GENERIC;
+       return EINA_FALSE;
+     }
+   alpha = header[3];
+   compression = header[4];
+   
+   if ((compression == 0) && (size < ((w * h * 4) + 32)))
+     {
+       free(ret);
+       e_db_close(db);
+       *error = EVAS_LOAD_ERROR_GENERIC;
+       return EINA_FALSE;
+     }
+   if (alpha) ie->flags.alpha = 1;
+   ie->w = w;
+   ie->h = h;
+   free(ret);
+   e_db_close(db);
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+evas_image_load_file_data_edb(Image_Entry *ie, const char *file, const char *key, int *error)
+{
+   int                  w, h, alpha, compression, size;
+   E_DB_File           *db;
+   DATA32              *ret;
+   DATA32              *body;
+   DATA32              *surface;
+   DATA32               header[8];
+
+   if (!key)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+   db = e_db_open_read((char *)file);
+   if (!db)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+   ret = e_db_data_get(db, (char *)key, &size);
+   if (!ret)
+     {
+       e_db_close(db);
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+   if (size < 32)
+     {
+       free(ret);
+       e_db_close(db);
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+   memcpy(header, ret, 32);
+#ifdef WORDS_BIGENDIAN
+     {
+       int i;
+
+       for (i = 0; i < 8; i++) SWAP32(header[i]);
+     }
+#endif
+   if (header[0] != 0xac1dfeed)
+     {
+       free(ret);
+       e_db_close(db);
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+   w = header[1];
+   h = header[2];
+   if ((w < 1) || (h < 1) || (w > IMG_MAX_SIZE) || (h > IMG_MAX_SIZE) ||
+       IMG_TOO_BIG(w, h))
+     {
+       free(ret);
+       e_db_close(db);
+       if (IMG_TOO_BIG(w, h))
+         *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       else
+         *error = EVAS_LOAD_ERROR_GENERIC;
+       return EINA_FALSE;
+     }
+   
+   alpha = header[3];
+   compression = header[4];
+   
+   if ((compression == 0) && (size < ((w * h * 4) + 32)))
+     {
+       free(ret);
+       e_db_close(db);
+       *error = EVAS_LOAD_ERROR_GENERIC;
+       return EINA_FALSE;
+     }
+   if (alpha) ie->flags.alpha = 1;
+   body = &(ret[8]);
+   evas_cache_image_surface_alloc(ie, w, h);
+   surface = evas_cache_image_pixels(ie);
+   if (!surface)
+     {
+       free(ret);
+       e_db_close(db);
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       return EINA_FALSE;
+     }
+   if (!compression)
+     {
+#ifdef WORDS_BIGENDIAN
+         {
+            int x;
+
+            memcpy(surface, body, w * h * sizeof(DATA32));
+            for (x = 0; x < (w * h); x++) SWAP32(surface[x]);
+         }
+#else
+       memcpy(surface, body, w * h * sizeof(DATA32));
+#endif
+     }
+   else
+     {
+       uLongf dlen;
+
+       dlen = w * h * sizeof(DATA32);
+       uncompress((Bytef *)surface, &dlen, (Bytef *)body,
+                  (uLongf)(size - 32));
+#ifdef WORDS_BIGENDIAN
+         {
+            int x;
+
+            for (x = 0; x < (w * h); x++) SWAP32(surface[x]);
+         }
+#endif
+     }
+   evas_common_image_premul(ie);
+   free(ret);
+   e_db_close(db);
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   em->functions = (void *)(&evas_image_load_edb_func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "edb",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_LOADER, image_loader, edb);
+
+#ifndef EVAS_STATIC_BUILD_EDB
+EVAS_EINA_MODULE_DEFINE(image_loader, edb);
+#endif
diff --git a/src/modules/loaders/eet/.cvsignore b/src/modules/loaders/eet/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/loaders/eet/Makefile.am b/src/modules/loaders/eet/Makefile.am
new file mode 100644 (file)
index 0000000..39b2f0b
--- /dev/null
@@ -0,0 +1,35 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@evas_image_loader_eet_cflags@ \
+@EINA_CFLAGS@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+
+if BUILD_LOADER_EET
+if !EVAS_STATIC_BUILD_EET
+
+pkgdir = $(libdir)/evas/modules/loaders/eet/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = evas_image_load_eet.c
+
+module_la_LIBADD = @EINA_LIBS@ @evas_image_loader_eet_libs@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_loader_eet.la
+
+libevas_loader_eet_la_SOURCES = evas_image_load_eet.c
+libevas_loader_eet_la_LIBADD = @evas_image_loader_eet_libs@
+
+endif
+endif
diff --git a/src/modules/loaders/eet/evas_image_load_eet.c b/src/modules/loaders/eet/evas_image_load_eet.c
new file mode 100644 (file)
index 0000000..1d0d000
--- /dev/null
@@ -0,0 +1,175 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"  /* so that EAPI in Eet.h is correctly defined */
+#endif
+
+#include <Eet.h>
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+
+static Eina_Bool evas_image_load_file_head_eet(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+static Eina_Bool evas_image_load_file_data_eet(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+
+Evas_Image_Load_Func evas_image_load_eet_func =
+{
+  EINA_TRUE,
+  evas_image_load_file_head_eet,
+  evas_image_load_file_data_eet
+};
+
+
+static Eina_Bool
+evas_image_load_file_head_eet(Image_Entry *ie, const char *file, const char *key, int *error)
+{
+   int                  alpha, compression, quality, lossy;
+   unsigned int         w, h;
+   Eet_File            *ef;
+   int                  ok;
+   Eina_Bool           res = EINA_FALSE;
+
+   if (!key)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+
+   ef = eet_open((char *)file, EET_FILE_MODE_READ);
+   if (!ef)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+   ok = eet_data_image_header_read(ef, key,
+                                  &w, &h, &alpha, &compression, &quality, &lossy);
+   if (!ok)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       goto on_error;
+     }
+   if (IMG_TOO_BIG(w, h))
+     {
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       goto on_error;
+     }
+   if (alpha) ie->flags.alpha = 1;
+   ie->w = w;
+   ie->h = h;
+   res = EINA_TRUE;
+   *error = EVAS_LOAD_ERROR_NONE;
+
+ on_error:
+   eet_close(ef);
+   return res;
+}
+
+Eina_Bool
+evas_image_load_file_data_eet(Image_Entry *ie, const char *file, const char *key, int *error)
+{
+   unsigned int         w, h;
+   int                  alpha, compression, quality, lossy, ok;
+   Eet_File            *ef;
+   DATA32              *body, *p, *end;
+   DATA32               nas = 0;
+   Eina_Bool           res = EINA_FALSE;
+
+   if (!key)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+   if (ie->flags.loaded)
+     {
+       *error = EVAS_LOAD_ERROR_NONE;
+       return EINA_TRUE;
+     }
+   ef = eet_open(file, EET_FILE_MODE_READ);
+   if (!ef)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+   ok = eet_data_image_header_read(ef, key,
+                                  &w, &h, &alpha, &compression, &quality, &lossy);
+   if (IMG_TOO_BIG(w, h))
+     {
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       goto on_error;
+     }
+   if (!ok)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       goto on_error;
+     }
+   evas_cache_image_surface_alloc(ie, w, h);
+   ok = eet_data_image_read_to_surface(ef, key, 0, 0,
+                                      evas_cache_image_pixels(ie), w, h, w * 4,
+                                      &alpha, &compression, &quality, &lossy);
+   if (!ok)
+     {
+       *error = EVAS_LOAD_ERROR_GENERIC;
+       goto on_error;
+     }
+   if (alpha)
+     {
+       ie->flags.alpha = 1;
+
+       body = evas_cache_image_pixels(ie);
+
+       end = body +(w * h);
+       for (p = body; p < end; p++)
+         {
+            DATA32 r, g, b, a;
+
+            a = A_VAL(p);
+            r = R_VAL(p);
+            g = G_VAL(p);
+            b = B_VAL(p);
+            if ((a == 0) || (a == 255)) nas++;
+            if (r > a) r = a;
+            if (g > a) g = a;
+            if (b > a) b = a;
+            *p = ARGB_JOIN(a, r, g, b);
+         }
+       if ((ALPHA_SPARSE_INV_FRACTION * nas) >= (ie->w * ie->h))
+         ie->flags.alpha_sparse = 1;
+     }
+// result is already premultiplied now if u compile with edje
+//   evas_common_image_premul(im);
+   *error = EVAS_LOAD_ERROR_NONE;
+   res = EINA_TRUE;
+
+ on_error:
+   eet_close(ef);
+   return res;
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   em->functions = (void *)(&evas_image_load_eet_func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "eet",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_LOADER, image_loader, eet);
+
+#ifndef EVAS_STATIC_BUILD_EET
+EVAS_EINA_MODULE_DEFINE(image_loader, eet);
+#endif
diff --git a/src/modules/loaders/gif/.cvsignore b/src/modules/loaders/gif/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/loaders/gif/Makefile.am b/src/modules/loaders/gif/Makefile.am
new file mode 100644 (file)
index 0000000..6e3a442
--- /dev/null
@@ -0,0 +1,34 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@evas_image_loader_gif_cflags@ \
+@EINA_CFLAGS@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+if BUILD_LOADER_GIF
+if !EVAS_STATIC_BUILD_GIF
+
+pkgdir = $(libdir)/evas/modules/loaders/gif/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = evas_image_load_gif.c
+
+module_la_LIBADD = @EINA_LIBS@ @evas_image_loader_gif_libs@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_loader_gif.la
+
+libevas_loader_gif_la_SOURCES = evas_image_load_gif.c
+libevas_loader_gif_la_LIBADD = @evas_image_loader_gif_libs@
+
+endif
+endif
diff --git a/src/modules/loaders/gif/evas_image_load_gif.c b/src/modules/loaders/gif/evas_image_load_gif.c
new file mode 100644 (file)
index 0000000..1bf75b9
--- /dev/null
@@ -0,0 +1,327 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <gif_lib.h>
+
+static Eina_Bool evas_image_load_file_head_gif(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+static Eina_Bool evas_image_load_file_data_gif(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+
+static Evas_Image_Load_Func evas_image_load_gif_func =
+{
+  EINA_TRUE,
+  evas_image_load_file_head_gif,
+  evas_image_load_file_data_gif
+};
+
+static Eina_Bool
+evas_image_load_file_head_gif(Image_Entry *ie, const char *file, const char *key __UNUSED__, int *error)
+{
+   int                 fd;
+   GifFileType        *gif;
+   GifRecordType       rec;
+   int                 done;
+   int                 w;
+   int                 h;
+   int                 alpha;
+
+   done = 0;
+   w = 0;
+   h = 0;
+   alpha = -1;
+
+#ifndef __EMX__
+   fd = open(file, O_RDONLY);
+#else
+   fd = open(file, O_RDONLY | O_BINARY);
+#endif
+   if (fd < 0)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+
+   gif = DGifOpenFileHandle(fd);
+   if (!gif)
+     {
+        close(fd);
+       *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+       return EINA_FALSE;
+     }
+
+   do
+     {
+        if (DGifGetRecordType(gif, &rec) == GIF_ERROR)
+          {
+             /* PrintGifError(); */
+             rec = TERMINATE_RECORD_TYPE;
+          }
+        if ((rec == IMAGE_DESC_RECORD_TYPE) && (!done))
+          {
+             if (DGifGetImageDesc(gif) == GIF_ERROR)
+               {
+                  /* PrintGifError(); */
+                  rec = TERMINATE_RECORD_TYPE;
+               }
+             w = gif->Image.Width;
+             h = gif->Image.Height;
+            if ((w < 1) || (h < 1) || (w > IMG_MAX_SIZE) || (h > IMG_MAX_SIZE) ||
+                 IMG_TOO_BIG(w, h))
+              {
+                 DGifCloseFile(gif);
+                 if (IMG_TOO_BIG(w, h))
+                   *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+                 else
+                   *error = EVAS_LOAD_ERROR_GENERIC;
+                 return EINA_FALSE;
+              }
+            done = 1;
+          }
+        else if (rec == EXTENSION_RECORD_TYPE)
+          {
+             int                 ext_code;
+             GifByteType        *ext;
+
+             ext = NULL;
+             DGifGetExtension(gif, &ext_code, &ext);
+             while (ext)
+               {
+                  if ((ext_code == 0xf9) && (ext[1] & 1) && (alpha < 0))
+                    {
+                       alpha = (int)ext[4];
+                    }
+                  ext = NULL;
+                  DGifGetExtensionNext(gif, &ext);
+               }
+          }
+   } while (rec != TERMINATE_RECORD_TYPE);
+
+   if (alpha >= 0) ie->flags.alpha = 1;
+   ie->w = w;
+   ie->h = h;
+
+   DGifCloseFile(gif);
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+evas_image_load_file_data_gif(Image_Entry *ie, const char *file, const char *key __UNUSED__, int *error)
+{
+   int                 intoffset[] = { 0, 4, 2, 1 };
+   int                 intjump[] = { 8, 8, 4, 2 };
+   double              per;
+   double              per_inc;
+   int                 fd;
+   GifFileType        *gif;
+   GifRecordType       rec;
+   GifRowType         *rows;
+   ColorMapObject     *cmap;
+   DATA32             *ptr;
+   int                 done;
+   int                 last_y;
+   int                 last_per;
+   int                 w;
+   int                 h;
+   int                 alpha;
+   int                 i;
+   int                 j;
+   int                 bg;
+   int                 r;
+   int                 g;
+   int                 b;
+
+   rows = NULL;
+   per = 0.0;
+   done = 0;
+   last_y = 0;
+   last_per = 0;
+   w = 0;
+   h = 0;
+   alpha = -1;
+
+#ifndef __EMX__
+   fd = open(file, O_RDONLY);
+#else
+   fd = open(file, O_RDONLY | O_BINARY);
+#endif
+   if (fd < 0)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+
+   gif = DGifOpenFileHandle(fd);
+   if (!gif)
+     {
+        close(fd);
+       *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+       return EINA_FALSE;
+     }
+   do
+     {
+        if (DGifGetRecordType(gif, &rec) == GIF_ERROR)
+          {
+             /* PrintGifError(); */
+             rec = TERMINATE_RECORD_TYPE;
+          }
+        if ((rec == IMAGE_DESC_RECORD_TYPE) && (!done))
+          {
+             if (DGifGetImageDesc(gif) == GIF_ERROR)
+               {
+                  /* PrintGifError(); */
+                  rec = TERMINATE_RECORD_TYPE;
+               }
+             w = gif->Image.Width;
+             h = gif->Image.Height;
+             rows = malloc(h * sizeof(GifRowType *));
+             if (!rows)
+               {
+                  DGifCloseFile(gif);
+                  return 0;
+               }
+             for (i = 0; i < h; i++)
+               {
+                  rows[i] = NULL;
+               }
+             for (i = 0; i < h; i++)
+               {
+                  rows[i] = malloc(w * sizeof(GifPixelType));
+                  if (!rows[i])
+                    {
+                       DGifCloseFile(gif);
+                       for (i = 0; i < h; i++)
+                         {
+                            if (rows[i])
+                              {
+                                 free(rows[i]);
+                              }
+                         }
+                       free(rows);
+                      *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+                      return EINA_FALSE;
+                    }
+               }
+             if (gif->Image.Interlace)
+               {
+                  for (i = 0; i < 4; i++)
+                    {
+                       for (j = intoffset[i]; j < h; j += intjump[i])
+                         {
+                            DGifGetLine(gif, rows[j], w);
+                         }
+                    }
+               }
+             else
+               {
+                  for (i = 0; i < h; i++)
+                    {
+                       DGifGetLine(gif, rows[i], w);
+                    }
+               }
+             done = 1;
+          }
+        else if (rec == EXTENSION_RECORD_TYPE)
+          {
+             int                 ext_code;
+             GifByteType        *ext;
+
+             ext = NULL;
+             DGifGetExtension(gif, &ext_code, &ext);
+             while (ext)
+               {
+                  if ((ext_code == 0xf9) && (ext[1] & 1) && (alpha < 0))
+                    {
+                       alpha = (int)ext[4];
+                    }
+                  ext = NULL;
+                  DGifGetExtensionNext(gif, &ext);
+               }
+          }
+   } while (rec != TERMINATE_RECORD_TYPE);
+
+   if (alpha >= 0) ie->flags.alpha = 1;
+   evas_cache_image_surface_alloc(ie, w, h);
+   if (!evas_cache_image_pixels(ie))
+     {
+        DGifCloseFile(gif);
+        for (i = 0; i < h; i++)
+          {
+            free(rows[i]);
+          }
+        free(rows);
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       return EINA_FALSE;
+     }
+
+   bg = gif->SBackGroundColor;
+   cmap = (gif->Image.ColorMap ? gif->Image.ColorMap : gif->SColorMap);
+
+   ptr = evas_cache_image_pixels(ie);
+   per_inc = 100.0 / (((double)w) * h);
+
+   for (i = 0; i < h; i++)
+     {
+       for (j = 0; j < w; j++)
+         {
+           if (rows[i][j] == alpha)
+             {
+               r = cmap->Colors[bg].Red;
+               g = cmap->Colors[bg].Green;
+               b = cmap->Colors[bg].Blue;
+               *ptr++ = 0x00ffffff & ((r << 16) | (g << 8) | b);
+             }
+           else
+             {
+               r = cmap->Colors[rows[i][j]].Red;
+               g = cmap->Colors[rows[i][j]].Green;
+               b = cmap->Colors[rows[i][j]].Blue;
+               *ptr++ = (0xff << 24) | (r << 16) | (g << 8) | b;
+             }
+           per += per_inc;
+         }
+     }
+   evas_common_image_premul(ie);
+   DGifCloseFile(gif);
+   for (i = 0; i < h; i++)
+     {
+        free(rows[i]);
+     }
+   free(rows);
+
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   em->functions = (void *)(&evas_image_load_gif_func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+}
+
+static Evas_Module_Api evas_modapi =
+{
+  EVAS_MODULE_API_VERSION,
+  "gif",
+  "none",
+  {
+    module_open,
+    module_close
+  }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_LOADER, image_loader, gif);
+
+#ifndef EVAS_STATIC_BUILD_GIF
+EVAS_EINA_MODULE_DEFINE(image_loader, gif);
+#endif
diff --git a/src/modules/loaders/jpeg/.cvsignore b/src/modules/loaders/jpeg/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/loaders/jpeg/Makefile.am b/src/modules/loaders/jpeg/Makefile.am
new file mode 100644 (file)
index 0000000..ffeb2ac
--- /dev/null
@@ -0,0 +1,35 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_image_loader_jpeg_cflags@ \
+@EVIL_CFLAGS@ \
+@WIN32_CPPFLAGS@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+if BUILD_LOADER_JPEG
+if !EVAS_STATIC_BUILD_JPEG
+
+pkgdir = $(libdir)/evas/modules/loaders/jpeg/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = evas_image_load_jpeg.c
+
+module_la_LIBADD = @EINA_LIBS@ @EVIL_LIBS@ @evas_image_loader_jpeg_libs@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_loader_jpeg.la
+libevas_loader_jpeg_la_SOURCES = evas_image_load_jpeg.c
+libevas_loader_jpeg_la_LIBADD = @evas_image_loader_jpeg_libs@
+
+endif
+endif
diff --git a/src/modules/loaders/jpeg/evas_image_load_jpeg.c b/src/modules/loaders/jpeg/evas_image_load_jpeg.c
new file mode 100644 (file)
index 0000000..59fb79c
--- /dev/null
@@ -0,0 +1,785 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <jpeglib.h>
+#include <setjmp.h>
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+
+typedef struct _JPEG_error_mgr *emptr;
+struct _JPEG_error_mgr
+{
+   struct     jpeg_error_mgr pub;
+   jmp_buf    setjmp_buffer;
+};
+
+static void _JPEGFatalErrorHandler(j_common_ptr cinfo);
+static void _JPEGErrorHandler(j_common_ptr cinfo);
+static void _JPEGErrorHandler2(j_common_ptr cinfo, int msg_level);
+
+static Eina_Bool evas_image_load_file_head_jpeg_internal(Image_Entry *ie, FILE *f, int *error) EINA_ARG_NONNULL(1, 2, 3);
+static Eina_Bool evas_image_load_file_data_jpeg_internal(Image_Entry *ie, FILE *f, int *error) EINA_ARG_NONNULL(1, 2, 3);
+#if 0 /* not used at the moment */
+static int evas_image_load_file_data_jpeg_alpha_internal(Image_Entry *ie, FILE *f) EINA_ARG_NONNULL(1, 2);
+#endif
+
+static Eina_Bool evas_image_load_file_head_jpeg(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+static Eina_Bool evas_image_load_file_data_jpeg(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+
+static Evas_Image_Load_Func evas_image_load_jpeg_func =
+{
+  EINA_TRUE,
+  evas_image_load_file_head_jpeg,
+  evas_image_load_file_data_jpeg
+};
+
+
+static void
+_JPEGFatalErrorHandler(j_common_ptr cinfo)
+{
+   emptr errmgr;
+
+   errmgr = (emptr) cinfo->err;
+   /*   cinfo->err->output_message(cinfo);*/
+   longjmp(errmgr->setjmp_buffer, 1);
+   return;
+}
+
+static void
+_JPEGErrorHandler(j_common_ptr cinfo __UNUSED__)
+{
+/*    emptr errmgr; */
+
+/*    errmgr = (emptr) cinfo->err; */
+   /*   cinfo->err->output_message(cinfo);*/
+   /*   longjmp(errmgr->setjmp_buffer, 1);*/
+   return;
+}
+
+static void
+_JPEGErrorHandler2(j_common_ptr cinfo __UNUSED__, int msg_level __UNUSED__)
+{
+/*    emptr errmgr; */
+
+/*    errmgr = (emptr) cinfo->err; */
+   /*   cinfo->err->output_message(cinfo);*/
+   /*   longjmp(errmgr->setjmp_buffer, 1);*/
+   return;
+}
+
+static Eina_Bool
+evas_image_load_file_head_jpeg_internal(Image_Entry *ie, FILE *f, int *error)
+{
+   int w, h, scalew, scaleh;
+   struct jpeg_decompress_struct cinfo;
+   struct _JPEG_error_mgr jerr;
+
+   cinfo.err = jpeg_std_error(&(jerr.pub));
+   jerr.pub.error_exit = _JPEGFatalErrorHandler;
+   jerr.pub.emit_message = _JPEGErrorHandler2;
+   jerr.pub.output_message = _JPEGErrorHandler;
+   if (setjmp(jerr.setjmp_buffer))
+     {
+       jpeg_destroy_decompress(&cinfo);
+       if (cinfo.saw_JFIF_marker)
+         *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       else
+         *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+       return EINA_FALSE;
+     }
+   jpeg_create_decompress(&cinfo);
+   jpeg_stdio_src(&cinfo, f);
+   jpeg_read_header(&cinfo, TRUE);
+   cinfo.do_fancy_upsampling = FALSE;
+   cinfo.do_block_smoothing = FALSE;
+   cinfo.dct_method = JDCT_IFAST;
+   cinfo.dither_mode = JDITHER_ORDERED;
+   jpeg_start_decompress(&cinfo);
+
+/* head decoding */
+   w = cinfo.output_width;
+   h = cinfo.output_height;
+   if ((w < 1) || (h < 1) || (w > IMG_MAX_SIZE) || (h > IMG_MAX_SIZE) ||
+       (IMG_TOO_BIG(w, h)))
+     {
+        jpeg_destroy_decompress(&cinfo);
+       if (IMG_TOO_BIG(w, h))
+         *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       else
+         *error = EVAS_LOAD_ERROR_GENERIC;
+       return EINA_FALSE;
+     }
+   if (ie->load_opts.scale_down_by > 1)
+     {
+       w /= ie->load_opts.scale_down_by;
+       h /= ie->load_opts.scale_down_by;
+     }
+   else if (ie->load_opts.dpi > 0.0)
+     {
+       w = (w * ie->load_opts.dpi) / 90.0;
+       h = (h * ie->load_opts.dpi) / 90.0;
+     }
+   else if ((ie->load_opts.w > 0) && (ie->load_opts.h > 0))
+     {
+       int w2 = w, h2 = h;
+       if (ie->load_opts.w > 0)
+         {
+            w2 = ie->load_opts.w;
+            h2 = (ie->load_opts.w * h) / w;
+            if ((ie->load_opts.h > 0) && (h2 > ie->load_opts.h))
+              {
+                 h2 = ie->load_opts.h;
+                 w2 = (ie->load_opts.h * w) / h;
+              }
+         }
+       else if (ie->load_opts.h > 0)
+         {
+            h2 = ie->load_opts.h;
+            w2 = (ie->load_opts.h * w) / h;
+         }
+       w = w2;
+       h = h2;
+     }
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+
+   if ((w != cinfo.output_width) || (h != cinfo.output_height))
+     {
+       scalew = cinfo.output_width / w;
+       scaleh = cinfo.output_height / h;
+
+       ie->scale = scalew;
+       if (scaleh < scalew) ie->scale = scaleh;
+
+       if      (ie->scale > 8) ie->scale = 8;
+       else if (ie->scale < 1) ie->scale = 1;
+
+       if      (ie->scale == 3) ie->scale = 2;
+       else if (ie->scale == 5) ie->scale = 4;
+       else if (ie->scale == 6) ie->scale = 4;
+       else if (ie->scale == 7) ie->scale = 4;
+     }
+
+   if (ie->scale > 1)
+     {
+       jpeg_destroy_decompress(&cinfo);
+
+       rewind(f);
+       jpeg_create_decompress(&cinfo);
+       jpeg_stdio_src(&cinfo, f);
+       jpeg_read_header(&cinfo, TRUE);
+       cinfo.do_fancy_upsampling = FALSE;
+       cinfo.do_block_smoothing = FALSE;
+       cinfo.scale_num = 1;
+       cinfo.scale_denom = ie->scale;
+       jpeg_calc_output_dimensions(&(cinfo));
+       jpeg_start_decompress(&cinfo);
+     }
+
+   ie->w = cinfo.output_width;
+   ie->h = cinfo.output_height;
+   
+   // be nice and clip region to image. if its totally outside, fail load
+   if ((ie->load_opts.region.w > 0) && (ie->load_opts.region.h > 0))
+     {
+        RECTS_CLIP_TO_RECT(ie->load_opts.region.x, ie->load_opts.region.y,
+                           ie->load_opts.region.w, ie->load_opts.region.h,
+                           0, 0, ie->w, ie->h);
+        if ((ie->load_opts.region.w <= 0) || (ie->load_opts.region.h <= 0))
+          {
+             jpeg_destroy_decompress(&cinfo);
+            *error = EVAS_LOAD_ERROR_GENERIC;
+            return EINA_FALSE;
+          }
+        ie->w = ie->load_opts.region.w;
+        ie->h = ie->load_opts.region.h;
+     }
+/* end head decoding */
+
+   jpeg_destroy_decompress(&cinfo);
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+}
+
+/*
+static double
+get_time(void)
+{
+   struct timeval      timev;
+   
+   gettimeofday(&timev, NULL);
+   return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000);
+}
+*/
+
+static Eina_Bool
+evas_image_load_file_data_jpeg_internal(Image_Entry *ie, FILE *f, int *error)
+{
+   int w, h;
+   struct jpeg_decompress_struct cinfo;
+   struct _JPEG_error_mgr jerr;
+   DATA8 *ptr, *line[16], *data;
+   DATA32 *ptr2;
+   int x, y, l, i, scans, count;
+   int region = 0;
+
+   cinfo.err = jpeg_std_error(&(jerr.pub));
+   jerr.pub.error_exit = _JPEGFatalErrorHandler;
+   jerr.pub.emit_message = _JPEGErrorHandler2;
+   jerr.pub.output_message = _JPEGErrorHandler;
+   if (setjmp(jerr.setjmp_buffer))
+     {
+       jpeg_destroy_decompress(&cinfo);
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+   jpeg_create_decompress(&cinfo);
+   jpeg_stdio_src(&cinfo, f);
+   jpeg_read_header(&cinfo, TRUE);
+   cinfo.do_fancy_upsampling = FALSE;
+   cinfo.do_block_smoothing = FALSE;
+   cinfo.dct_method = JDCT_IFAST;
+   cinfo.dither_mode = JDITHER_ORDERED;
+
+   if (ie->scale > 1)
+     {
+       cinfo.scale_num = 1;
+       cinfo.scale_denom = ie->scale;
+     }
+
+   /* Colorspace conversion options */
+   /* libjpeg can do the following conversions: */
+   /* GRAYSCLAE => RGB YCbCr => RGB and YCCK => CMYK */
+   switch (cinfo.jpeg_color_space)
+     {
+     case JCS_UNKNOWN:
+       break;
+     case JCS_GRAYSCALE:
+     case JCS_RGB:
+     case JCS_YCbCr:
+       cinfo.out_color_space = JCS_RGB;
+       break;
+     case JCS_CMYK:
+     case JCS_YCCK:
+       cinfo.out_color_space = JCS_CMYK;
+       break;
+     }
+
+/* head decoding */
+   jpeg_calc_output_dimensions(&(cinfo));
+   jpeg_start_decompress(&cinfo);
+
+   w = cinfo.output_width;
+   h = cinfo.output_height;
+
+   if ((ie->load_opts.region.w > 0) && (ie->load_opts.region.h > 0))
+     {
+        region = 1;
+#ifdef BUILD_LOADER_JPEG_REGION
+        cinfo.region_x = ie->load_opts.region.x;
+        cinfo.region_y = ie->load_opts.region.y;
+        cinfo.region_w = ie->load_opts.region.w;
+        cinfo.region_h = ie->load_opts.region.h;
+#endif
+     }
+   if ((!region) && ((w != ie->w) || (h != ie->h)))
+     {
+       // race condition, the file could have change from when we call header
+       // this test will not solve the problem with region code.
+       jpeg_destroy_decompress(&cinfo);
+       *error = EVAS_LOAD_ERROR_GENERIC;
+       return EINA_FALSE;
+     }
+   if ((region) &&
+       ((ie->w != ie->load_opts.region.w) || (ie->h != ie->load_opts.region.h)))
+     {
+        ie->w = ie->load_opts.region.w;
+        ie->h = ie->load_opts.region.h;
+     }
+
+   if (!(((cinfo.out_color_space == JCS_RGB) &&
+          ((cinfo.output_components == 3) || (cinfo.output_components == 1))) ||
+         ((cinfo.out_color_space == JCS_CMYK) && (cinfo.output_components == 4))))
+     {
+       jpeg_destroy_decompress(&cinfo);
+       *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+       return EINA_FALSE;
+     }
+
+/* end head decoding */
+/* data decoding */
+   if (cinfo.rec_outbuf_height > 16)
+     {
+       jpeg_destroy_decompress(&cinfo);
+       *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+       return EINA_FALSE;
+     }
+   data = alloca(w * 16 * cinfo.output_components);
+   evas_cache_image_surface_alloc(ie, ie->w, ie->h);
+   if (ie->flags.loaded)
+     {
+       jpeg_destroy_decompress(&cinfo);
+       *error = EVAS_LOAD_ERROR_NONE;
+       return EINA_TRUE;
+     }
+   ptr2 = evas_cache_image_pixels(ie);
+   count = 0;
+   /* We handle first CMYK (4 components) */
+   if (cinfo.output_components == 4)
+     {
+        // FIXME: handle region
+       for (i = 0; i < cinfo.rec_outbuf_height; i++)
+         line[i] = data + (i * w * 4);
+       for (l = 0; l < h; l += cinfo.rec_outbuf_height)
+         {
+            jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height);
+            scans = cinfo.rec_outbuf_height;
+            if ((h - l) < scans) scans = h - l;
+            ptr = data;
+             if (!region)
+               {
+                  for (y = 0; y < scans; y++)
+                    {
+                       if (cinfo.saw_Adobe_marker)
+                         {
+                            for (x = 0; x < w; x++)
+                              {
+                                 /* According to libjpeg doc, Photoshop inverse the values of C, M, Y and K, */
+                                 /* that is C is replaces by 255 - C, etc...*/
+                                 /* See the comment below for the computation of RGB values from CMYK ones. */
+                                 *ptr2 =
+                                   (0xff000000) |
+                                   ((ptr[0] * ptr[3] / 255) << 16) |
+                                   ((ptr[1] * ptr[3] / 255) << 8) |
+                                   ((ptr[2] * ptr[3] / 255));
+                                 ptr += 4;
+                                 ptr2++;
+                              }
+                         }
+                       else
+                         {
+                            for (x = 0; x < w; x++)
+                              {
+                                 /* Conversion from CMYK to RGB is done in 2 steps: */
+                                 /* CMYK => CMY => RGB (see http://www.easyrgb.com/index.php?X=MATH) */
+                                 /* after computation, if C, M, Y and K are between 0 and 1, we have: */
+                                 /* R = (1 - C) * (1 - K) * 255 */
+                                 /* G = (1 - M) * (1 - K) * 255 */
+                                 /* B = (1 - Y) * (1 - K) * 255 */
+                                 /* libjpeg stores CMYK values between 0 and 255, */
+                                 /* so we replace C by C * 255 / 255, etc... and we obtain: */
+                                 /* R = (255 - C) * (255 - K) / 255 */
+                                 /* G = (255 - M) * (255 - K) / 255 */
+                                 /* B = (255 - Y) * (255 - K) / 255 */
+                                 /* with C, M, Y and K between 0 and 255. */
+                                 *ptr2 =
+                                   (0xff000000) |
+                                   (((255 - ptr[0]) * (255 - ptr[3]) / 255) << 16) |
+                                   (((255 - ptr[1]) * (255 - ptr[3]) / 255) << 8) |
+                                   (((255 - ptr[2]) * (255 - ptr[3]) / 255));
+                                 ptr += 4;
+                                 ptr2++;
+                              }
+                         }
+                   }
+              }
+             else
+               {
+                  // if line # > region last line, break
+                  if (l >= (ie->load_opts.region.y + ie->load_opts.region.h))
+                    {
+                       jpeg_destroy_decompress(&cinfo);
+                      *error = EVAS_LOAD_ERROR_NONE;
+                       return EINA_FALSE;
+                    }
+                  // els if scan block intersects region start or later
+                  else if ((l + scans) > 
+                           (ie->load_opts.region.y))
+                    {
+                       for (y = 0; y < scans; y++)
+                         {
+                            if (((y + l) >= ie->load_opts.region.y) &&
+                                ((y + l) < (ie->load_opts.region.y + ie->load_opts.region.h)))
+                              {
+                                 ptr += ie->load_opts.region.x;
+                                 if (cinfo.saw_Adobe_marker)
+                                   {
+                                      for (x = 0; x < ie->load_opts.region.w; x++)
+                                        {
+                                           /* According to libjpeg doc, Photoshop inverse the values of C, M, Y and K, */
+                                           /* that is C is replaces by 255 - C, etc...*/
+                                           /* See the comment below for the computation of RGB values from CMYK ones. */
+                                           *ptr2 =
+                                             (0xff000000) |
+                                             ((ptr[0] * ptr[3] / 255) << 16) |
+                                             ((ptr[1] * ptr[3] / 255) << 8) |
+                                             ((ptr[2] * ptr[3] / 255));
+                                           ptr += 4;
+                                           ptr2++;
+                                        }
+                                   }
+                                 else
+                                   {
+                                      for (x = 0; x < ie->load_opts.region.w; x++)
+                                        {
+                                           /* Conversion from CMYK to RGB is done in 2 steps: */
+                                           /* CMYK => CMY => RGB (see http://www.easyrgb.com/index.php?X=MATH) */
+                                           /* after computation, if C, M, Y and K are between 0 and 1, we have: */
+                                           /* R = (1 - C) * (1 - K) * 255 */
+                                           /* G = (1 - M) * (1 - K) * 255 */
+                                           /* B = (1 - Y) * (1 - K) * 255 */
+                                           /* libjpeg stores CMYK values between 0 and 255, */
+                                           /* so we replace C by C * 255 / 255, etc... and we obtain: */
+                                           /* R = (255 - C) * (255 - K) / 255 */
+                                           /* G = (255 - M) * (255 - K) / 255 */
+                                           /* B = (255 - Y) * (255 - K) / 255 */
+                                           /* with C, M, Y and K between 0 and 255. */
+                                           *ptr2 =
+                                             (0xff000000) |
+                                             (((255 - ptr[0]) * (255 - ptr[3]) / 255) << 16) |
+                                             (((255 - ptr[1]) * (255 - ptr[3]) / 255) << 8) |
+                                             (((255 - ptr[2]) * (255 - ptr[3]) / 255));
+                                           ptr += 4;
+                                           ptr2++;
+                                        }
+                                   }
+                                 ptr += (4 * (w - (ie->load_opts.region.x + ie->load_opts.region.w)));
+                              }
+                            else
+                              ptr += (4 * w);
+                         }
+                    }
+               }
+         }
+     }
+   /* We handle then RGB with 3 components */
+   else if (cinfo.output_components == 3)
+     {
+/*        
+        double t;
+        if (region)
+          {
+             // debug for now
+             printf("R| %p %5ix%5i %s: %5i %5i %5ix%5i - ",
+                    ie,
+                    ie->w, ie->h,
+                    ie->file,
+                    ie->load_opts.region.x,
+                    ie->load_opts.region.y,
+                    ie->load_opts.region.w,
+                    ie->load_opts.region.h);
+          }
+        t = get_time();
+ */
+        for (i = 0; i < cinfo.rec_outbuf_height; i++)
+         line[i] = data + (i * w * 3);
+       for (l = 0; l < h; l += cinfo.rec_outbuf_height)
+         {
+            jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height);
+            scans = cinfo.rec_outbuf_height;
+            if ((h - l) < scans) scans = h - l;
+            ptr = data;
+             if (!region)
+               {
+                  for (y = 0; y < scans; y++)
+                    {
+                       for (x = 0; x < w; x++)
+                         {
+                            *ptr2 =
+                              (0xff000000) | ((ptr[0]) << 16) | ((ptr[1]) << 8) | (ptr[2]);
+                            ptr += 3;
+                            ptr2++;
+                         }
+                    }
+              }
+             else
+               {
+                  // if line # > region last line, break
+                  if (l >= (ie->load_opts.region.y + ie->load_opts.region.h))
+                    {
+                       jpeg_destroy_decompress(&cinfo);
+/*                       
+                       t = get_time() - t;
+                       printf("%3.3f\n", t);
+ */ 
+                      *error = EVAS_LOAD_ERROR_NONE;
+                       return EINA_TRUE;
+                    }
+                  // else if scan block intersects region start or later
+                  else if ((l + scans) > 
+                           (ie->load_opts.region.y))
+                    {
+                       for (y = 0; y < scans; y++)
+                         {
+                            if (((y + l) >= ie->load_opts.region.y) &&
+                                ((y + l) < (ie->load_opts.region.y + ie->load_opts.region.h)))
+                              {
+                                 ptr += (3 * ie->load_opts.region.x);
+                                 for (x = 0; x < ie->load_opts.region.w; x++)
+                                   {
+                                      *ptr2 =
+                                        (0xff000000) | ((ptr[0]) << 16) | ((ptr[1]) << 8) | (ptr[2]);
+                                      ptr += 3;
+                                      ptr2++;
+                                   }
+                                 ptr += (3 * (w - (ie->load_opts.region.x + ie->load_opts.region.w)));
+                              }
+                            else
+                              ptr += (3 * w);
+                         }
+                    }
+               }
+         }
+/*        
+        t = get_time() - t;
+        printf("%3.3f\n", t);
+ */
+     }
+   /* We finally handle RGB with 1 component */
+   else if (cinfo.output_components == 1)
+     {
+       for (i = 0; i < cinfo.rec_outbuf_height; i++)
+         line[i] = data + (i * w);
+       for (l = 0; l < h; l += cinfo.rec_outbuf_height)
+         {
+            jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height);
+            scans = cinfo.rec_outbuf_height;
+            if ((h - l) < scans) scans = h - l;
+            ptr = data;
+             if (!region)
+               {
+                  for (y = 0; y < scans; y++)
+                    {
+                       for (x = 0; x < w; x++)
+                         {
+                            *ptr2 =
+                              (0xff000000) | ((ptr[0]) << 16) | ((ptr[0]) << 8) | (ptr[0]);
+                            ptr++;
+                            ptr2++;
+                         }
+                    }
+              }
+             else
+               {
+                  // if line # > region last line, break
+                  if (l >= (ie->load_opts.region.y + ie->load_opts.region.h))
+                    {
+                       jpeg_destroy_decompress(&cinfo);
+                      *error = EVAS_LOAD_ERROR_NONE;
+                       return EINA_TRUE;
+                    }
+                  // els if scan block intersects region start or later
+                  else if ((l + scans) > 
+                           (ie->load_opts.region.y))
+                    {
+                       for (y = 0; y < scans; y++)
+                         {
+                            if (((y + l) >= ie->load_opts.region.y) &&
+                                ((y + l) < (ie->load_opts.region.y + ie->load_opts.region.h)))
+                              {
+                                 ptr += ie->load_opts.region.x;
+                                 for (x = 0; x < ie->load_opts.region.w; x++)
+                                   {
+                                      *ptr2 =
+                                        (0xff000000) | ((ptr[0]) << 16) | ((ptr[0]) << 8) | (ptr[0]);
+                                      ptr++;
+                                      ptr2++;
+                                   }
+                                 ptr += w - (ie->load_opts.region.x + ie->load_opts.region.w);
+                              }
+                            else
+                              ptr += w;
+                         }
+                    }
+               }
+         }
+     }
+/* end data decoding */
+   jpeg_finish_decompress(&cinfo);
+   jpeg_destroy_decompress(&cinfo);
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+}
+
+#if 0 /* not used at the moment */
+static Eina_Bool
+evas_image_load_file_data_jpeg_alpha_internal(Image_Entry *ie, FILE *f, int *error)
+{
+   int w, h;
+   struct jpeg_decompress_struct cinfo;
+   struct _JPEG_error_mgr jerr;
+   DATA8 *ptr, *line[16], *data;
+   DATA32 *ptr2;
+   int x, y, l, i, scans, count, prevy;
+
+   if (!f)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+   cinfo.err = jpeg_std_error(&(jerr.pub));
+   jerr.pub.error_exit = _JPEGFatalErrorHandler;
+   jerr.pub.emit_message = _JPEGErrorHandler2;
+   jerr.pub.output_message = _JPEGErrorHandler;
+   if (setjmp(jerr.setjmp_buffer))
+     {
+       jpeg_destroy_decompress(&cinfo);
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+   jpeg_create_decompress(&cinfo);
+   jpeg_stdio_src(&cinfo, f);
+   jpeg_read_header(&cinfo, TRUE);
+   cinfo.do_fancy_upsampling = FALSE;
+   cinfo.do_block_smoothing = FALSE;
+   jpeg_start_decompress(&cinfo);
+
+/* head decoding */
+   ie->w = w = cinfo.output_width;
+   ie->h = h = cinfo.output_height;
+/* end head decoding */
+/* data decoding */
+   if (cinfo.rec_outbuf_height > 16)
+     {
+       jpeg_destroy_decompress(&cinfo);
+       *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+       return EINA_FALSE;;
+     }
+   data = alloca(w * 16 * 3);
+   if (!ie->flags.loaded)
+     {
+       jpeg_destroy_decompress(&cinfo);
+       *error = EVAS_LOAD_ERROR_NONE;
+       return EINA_TRUE;
+     }
+   ptr2 = evas_cache_image_pixels(ie);
+   count = 0;
+   prevy = 0;
+   if (cinfo.output_components == 3)
+     {
+       for (i = 0; i < cinfo.rec_outbuf_height; i++)
+         line[i] = data + (i * w * 3);
+       for (l = 0; l < h; l += cinfo.rec_outbuf_height)
+         {
+            jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height);
+            scans = cinfo.rec_outbuf_height;
+            if ((h - l) < scans) scans = h - l;
+            ptr = data;
+            for (y = 0; y < scans; y++)
+              {
+                 for (x = 0; x < w; x++)
+                   {
+                      *ptr2 =
+                        ((*ptr2) & 0x00ffffff) |
+                        (((ptr[0] + ptr[1] + ptr[2]) / 3) << 24);
+                      ptr += 3;
+                      ptr2++;
+                   }
+              }
+         }
+     }
+   else if (cinfo.output_components == 1)
+     {
+       for (i = 0; i < cinfo.rec_outbuf_height; i++)
+         line[i] = data + (i * w);
+       for (l = 0; l < h; l += cinfo.rec_outbuf_height)
+         {
+            jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height);
+            scans = cinfo.rec_outbuf_height;
+            if ((h - l) < scans) scans = h - l;
+            ptr = data;
+            for (y = 0; y < scans; y++)
+              {
+                 for (x = 0; x < w; x++)
+                   {
+                      *ptr2 =
+                        ((*ptr2) & 0x00ffffff) |
+                        ((ptr[0]) << 24);
+                      ptr++;
+                      ptr2++;
+                   }
+              }
+         }
+     }
+/* end data decoding */
+   jpeg_finish_decompress(&cinfo);
+   jpeg_destroy_decompress(&cinfo);
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+}
+#endif
+
+static Eina_Bool
+evas_image_load_file_head_jpeg(Image_Entry *ie, const char *file, const char *key, int *error)
+{
+   int val;
+   FILE *f;
+
+   f = fopen(file, "rb");
+   if (!f)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+   val = evas_image_load_file_head_jpeg_internal(ie, f, error);
+   fclose(f);
+   return val;
+   key = 0;
+}
+
+static Eina_Bool
+evas_image_load_file_data_jpeg(Image_Entry *ie, const char *file, const char *key, int *error)
+{
+   int val;
+   FILE *f;
+
+   f = fopen(file, "rb");
+   if (!f)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+   val = evas_image_load_file_data_jpeg_internal(ie, f, error);
+   fclose(f);
+   return val;
+   key = 0;
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   em->functions = (void *)(&evas_image_load_jpeg_func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "jpeg",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_LOADER, image_loader, jpeg);
+
+#ifndef EVAS_STATIC_BUILD_JPEG
+EVAS_EINA_MODULE_DEFINE(image_loader, jpeg);
+#endif
+
diff --git a/src/modules/loaders/pmaps/.cvsignore b/src/modules/loaders/pmaps/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/loaders/pmaps/Makefile.am b/src/modules/loaders/pmaps/Makefile.am
new file mode 100644 (file)
index 0000000..6354990
--- /dev/null
@@ -0,0 +1,35 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_image_loader_pmaps_cflags@ \
+@EVIL_CFLAGS@ \
+@WIN32_CPPFLAGS@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+if BUILD_LOADER_PMAPS
+if !EVAS_STATIC_BUILD_PMAPS
+
+pkgdir = $(libdir)/evas/modules/loaders/pmaps/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = evas_image_load_pmaps.c
+
+module_la_LIBADD = @evas_image_loader_pmaps_libs@ @EINA_LIBS@ @EVIL_LIBS@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_loader_pmaps.la
+libevas_loader_pmaps_la_SOURCES = evas_image_load_pmaps.c
+libevas_loader_pmaps_la_LIBADD = @evas_image_loader_pmaps_libs@
+
+endif
+endif
diff --git a/src/modules/loaders/pmaps/evas_image_load_pmaps.c b/src/modules/loaders/pmaps/evas_image_load_pmaps.c
new file mode 100644 (file)
index 0000000..4c7e709
--- /dev/null
@@ -0,0 +1,578 @@
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+#define FILE_BUFFER_SIZE 1024
+#define FILE_BUFFER_UNREAD_SIZE 16
+
+static Eina_Bool evas_image_load_file_head_pmaps(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+static Eina_Bool evas_image_load_file_data_pmaps(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+
+Evas_Image_Load_Func evas_image_load_pmaps_func = {
+   EINA_TRUE,
+   evas_image_load_file_head_pmaps,
+   evas_image_load_file_data_pmaps
+};
+
+/* The buffer to load pmaps images */
+typedef struct Pmaps_Buffer Pmaps_Buffer;
+
+struct Pmaps_Buffer
+{
+   FILE *file;
+
+   /* the buffer */
+   DATA8 buffer[FILE_BUFFER_SIZE];
+   DATA8 unread[FILE_BUFFER_UNREAD_SIZE];
+   DATA8 *current;
+   DATA8 *end;
+   char type[3];
+   unsigned char unread_len:7;
+   unsigned char last_buffer:1;
+
+   /* image properties */
+   int w;
+   int h;
+   int max;
+
+   /* interface */
+   int (*int_get) (Pmaps_Buffer *b, int *val);
+   int (*color_get) (Pmaps_Buffer *b, DATA32 *color);
+};
+
+/* internal used functions */
+static Eina_Bool pmaps_buffer_open(Pmaps_Buffer *b, const char *filename, int *error);
+static void pmaps_buffer_close(Pmaps_Buffer *b);
+static Eina_Bool pmaps_buffer_header_parse(Pmaps_Buffer *b, int *error);
+static int pmaps_buffer_plain_int_get(Pmaps_Buffer *b, int *val);
+static int pmaps_buffer_1byte_int_get(Pmaps_Buffer *b, int *val);
+static int pmaps_buffer_2byte_int_get(Pmaps_Buffer *b, int *val);
+static int pmaps_buffer_gray_get(Pmaps_Buffer *b, DATA32 *color);
+static int pmaps_buffer_rgb_get(Pmaps_Buffer *b, DATA32 *color);
+static int pmaps_buffer_plain_bw_get(Pmaps_Buffer *b, DATA32 *color);
+
+static size_t pmaps_buffer_plain_update(Pmaps_Buffer *b);
+static size_t pmaps_buffer_raw_update(Pmaps_Buffer *b);
+static int pmaps_buffer_comment_skip(Pmaps_Buffer *b);
+
+static Eina_Bool
+evas_image_load_file_head_pmaps(Image_Entry *ie, const char *file, const char *key __UNUSED__, int *error)
+{
+   Pmaps_Buffer b;
+
+   if (!pmaps_buffer_open(&b, file, error))
+     {
+       pmaps_buffer_close(&b);
+       return EINA_FALSE;
+     }
+
+   if (!pmaps_buffer_header_parse(&b, error))
+     {
+       pmaps_buffer_close(&b);
+       return EINA_FALSE;
+     }
+
+   ie->w = b.w;
+   ie->h = b.h;
+
+   pmaps_buffer_close(&b);
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+evas_image_load_file_data_pmaps(Image_Entry *ie, const char *file, const char *key __UNUSED__, int *error)
+{
+   Pmaps_Buffer b;
+   int pixels;
+   DATA32 *ptr;
+
+   if (!pmaps_buffer_open(&b, file, error))
+     {
+       pmaps_buffer_close(&b);
+       return EINA_FALSE;
+     }
+
+   if (!pmaps_buffer_header_parse(&b, error))
+     {
+       pmaps_buffer_close(&b);
+       return EINA_FALSE;
+     }
+
+   pixels = b.w * b.h;
+
+   evas_cache_image_surface_alloc(ie, b.w, b.h);
+   ptr = evas_cache_image_pixels(ie);
+   if (!ptr)
+     {
+       pmaps_buffer_close(&b);
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       return EINA_FALSE;
+     }
+
+   if (b.type[1] != '4')
+     {
+       while (pixels > 0 && b.color_get(&b, ptr))
+         {
+            pixels--;
+            ptr++;
+         }
+     }
+   else
+     {
+       while (pixels > 0
+              && (b.current != b.end || pmaps_buffer_raw_update(&b)))
+         {
+            int i;
+
+            for (i = 7; i >= 0 && pixels > 0; i--)
+              {
+                 if (*b.current & (1 << i))
+                    *ptr = 0xff000000;
+                 else
+                    *ptr = 0xffffffff;
+                 ptr++;
+                 pixels--;
+              }
+            b.current++;
+         }
+     }
+
+   /* if there are some pix missing, give them a proper default */
+   memset(ptr, 0xff, 4 * pixels);
+   pmaps_buffer_close(&b);
+
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+}
+
+/* internal used functions */
+static Eina_Bool
+pmaps_buffer_open(Pmaps_Buffer *b, const char *filename, int *error)
+{
+   size_t len;
+
+   b->file = fopen(filename, "rb");
+   if (!b->file)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+
+   *b->buffer = 0;
+   *b->unread = 0;
+   b->last_buffer = 0;
+   b->unread_len = 0;
+
+   len = pmaps_buffer_plain_update(b);
+
+   if (len < 3)
+     {
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+
+   /* copy the type */
+   b->type[0] = b->buffer[0];
+   b->type[1] = b->buffer[1];
+   b->type[2] = 0;
+   /* skip the PX */
+   b->current = b->buffer + 2;
+
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+}
+
+static void
+pmaps_buffer_close(Pmaps_Buffer *b)
+{
+   if (b->file)
+      fclose(b->file);
+}
+
+static Eina_Bool
+pmaps_buffer_header_parse(Pmaps_Buffer *b, int *error)
+{
+   /* if there is no P at the beginning it is not a file we can parse */
+   if (b->type[0] != 'P')
+     {
+       *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+       return EINA_FALSE;
+     }
+
+   /* get the width */
+   if (!pmaps_buffer_plain_int_get(b, &(b->w)) || b->w < 1)
+     {
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+
+   /* get the height */
+   if (!pmaps_buffer_plain_int_get(b, &(b->h)) || b->h < 1)
+     {
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+
+   /* get the maximum value. P1 and P4 don't have a maximum value. */
+   if (!(b->type[1] == '1' || b->type[1] == '4')
+       && (!pmaps_buffer_plain_int_get(b, &(b->max)) || b->max < 1))
+     {
+       *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+       return EINA_FALSE;
+     }
+
+   /* set up the color get callback */
+   switch (b->type[1])
+     {
+       /* Black and White */
+     case '1':
+       b->color_get = pmaps_buffer_plain_bw_get;
+       break;
+     case '4':
+       /* Binary black and white use another format */
+       b->color_get = NULL;
+       break;
+     case '2':
+     case '5':
+       b->color_get = pmaps_buffer_gray_get;
+       break;
+     case '3':
+     case '6':
+       b->color_get = pmaps_buffer_rgb_get;
+       break;
+     case '7':
+       /* XXX write me */
+       return 0;
+       break;
+     default:
+       return 0;
+     }
+   /* set up the int get callback */
+   switch (b->type[1])
+     {
+       /* RAW */
+     case '5':
+     case '6':
+       if (b->max < 256)
+          b->int_get = pmaps_buffer_1byte_int_get;
+       else
+          b->int_get = pmaps_buffer_2byte_int_get;
+
+       if (b->current == b->end && !pmaps_buffer_raw_update(b))
+          return 0;
+
+       b->current++;
+       break;
+       /* Plain */
+     case '2':
+     case '3':
+       b->int_get = pmaps_buffer_plain_int_get;
+       break;
+       /* Black and White Bitmaps don't use that callback */
+     case '1':
+     case '4':
+       b->int_get = NULL;
+       /* we need to skip the next character fpr P4 it
+        * doesn't hurt if we do it for the P1 as well */
+       b->current++;
+       break;
+     }
+   return 1;
+}
+
+static size_t
+pmaps_buffer_plain_update(Pmaps_Buffer *b)
+{
+   size_t r;
+   size_t steps = 0;
+
+   /* if we already are in the last buffer we can not update it */
+   if (b->last_buffer)
+      return 0;
+
+   /* if we have unread bytes we need to put them before the new read
+    * stuff */
+   if (b->unread_len)
+      memcpy(b->buffer, b->unread, b->unread_len);
+
+   r = fread(&b->buffer[b->unread_len], 1,
+            FILE_BUFFER_SIZE - b->unread_len - 1, b->file) + b->unread_len;
+
+   /* we haven't read anything nor have we bytes in the unread buffer */
+   if (r == 0)
+     {
+       b->buffer[0] = '\0';
+       b->end = b->buffer;
+       b->last_buffer = 1;
+       return 0;
+     }
+
+   if (r < FILE_BUFFER_SIZE - 1)
+     {
+       /*we reached eof */ ;
+       b->last_buffer = 1;
+     }
+
+   b->buffer[r] = 0;
+   r--;
+
+   while (steps < (FILE_BUFFER_UNREAD_SIZE - 2)
+         && r > 1 && !isspace(b->buffer[r]))
+     {
+       steps++;
+       r--;
+     }
+
+   if (steps != 0)
+     {
+       memcpy(b->unread, &b->buffer[r], steps + 1);
+       b->unread_len = steps + 1;
+     }
+   else
+     {
+       b->unread[0] = '\0';
+       b->unread_len = 0;
+     }
+
+   b->buffer[r] = '\0';
+   b->current = b->buffer;
+   b->end = b->buffer + r;
+
+   return r;
+}
+
+static size_t
+pmaps_buffer_raw_update(Pmaps_Buffer *b)
+{
+   size_t r;
+
+   if (b->last_buffer)
+      return 0;
+
+   if (b->unread_len)
+      memcpy(b->buffer, b->unread, b->unread_len);
+
+   r = fread(&b->buffer[b->unread_len], 1,
+            FILE_BUFFER_SIZE - b->unread_len - 1, b->file) + b->unread_len;
+
+   if (r < FILE_BUFFER_SIZE - 1)
+     {
+       /*we reached eof */ ;
+       b->last_buffer = 1;
+     }
+
+   b->buffer[r] = 0;
+   b->end = b->buffer + r;
+   b->current = b->buffer;
+
+   if (b->unread_len)
+     {
+       /* the buffer is now read */
+       *b->unread = '\0';
+       b->unread_len = 0;
+     }
+
+   return r;
+}
+
+static int
+pmaps_buffer_plain_int_get(Pmaps_Buffer *b, int *val)
+{
+   char *start;
+   DATA8 lastc;
+
+   /* first skip all white space
+    * Note: we are skipping here actually every character than is not 
+    * a digit */
+   while (!isdigit(*b->current))
+     {
+       if (*b->current == '\0')
+         {
+            if (!pmaps_buffer_plain_update(b))
+               return 0;
+
+            continue;
+         }
+       if (*b->current == '#' && !pmaps_buffer_comment_skip(b))
+          return 0;
+       b->current++;
+     }
+
+   start = (char *)b->current;
+   /* now find the end of the number */
+   while (isdigit(*b->current))
+      b->current++;
+
+   lastc = *b->current;
+   *b->current = '\0';
+   *val = atoi(start);
+   *b->current = lastc;
+
+   return 1;
+}
+
+static int
+pmaps_buffer_1byte_int_get(Pmaps_Buffer *b, int *val)
+{
+   /* are we at the end of the buffer? */
+   if (b->current == b->end && !pmaps_buffer_raw_update(b))
+      return 0;
+
+   *val = *b->current;
+   b->current++;
+
+   return 1;
+}
+static int
+pmaps_buffer_2byte_int_get(Pmaps_Buffer *b, int *val)
+{
+   /* are we at the end of the buffer? */
+   if (b->current == b->end && !pmaps_buffer_raw_update(b))
+      return 0;
+
+   *val = (int)(*b->current << 8);
+   b->current++;
+
+   /* are we at the end of the buffer? */
+   if (b->current == b->end && !pmaps_buffer_raw_update(b))
+      return 0;
+
+   *val |= *b->current;
+   b->current++;
+
+   return 1;
+}
+
+static int
+pmaps_buffer_comment_skip(Pmaps_Buffer *b)
+{
+   while (*b->current != '\n')
+     {
+       if (*b->current == '\0')
+         {
+            if (!pmaps_buffer_plain_update(b))
+               return 0;
+
+            continue;
+         }
+       b->current++;
+     }
+   return 1;
+}
+
+static int
+pmaps_buffer_rgb_get(Pmaps_Buffer *b, DATA32 *color)
+{
+   int vr, vg, vb;
+
+   if (!b->int_get(b, &vr) || !b->int_get(b, &vg) || !b->int_get(b, &vb))
+      return 0;
+
+   if (b->max != 255)
+     {
+       vr = (vr * 255) / b->max;
+       vg = (vg * 255) / b->max;
+       vb = (vb * 255) / b->max;
+     }
+   if (vr > 255)
+      vr = 255;
+   if (vg > 255)
+      vg = 255;
+   if (vb > 255)
+      vb = 255;
+
+   *color = 0xff000000 | (vr << 16) | (vg << 8) | vb;
+
+   return 1;
+}
+
+static int
+pmaps_buffer_gray_get(Pmaps_Buffer *b, DATA32 *color)
+{
+   int val;
+
+   if (!b->int_get(b, &val))
+      return 0;
+
+   if (b->max != 255)
+      val = (val * 255) / b->max;
+   if (val > 255)
+      val = 255;
+   *color = 0xff000000 | (val << 16) | (val << 8) | val;
+
+   return 1;
+}
+
+static int
+pmaps_buffer_plain_bw_get(Pmaps_Buffer *b, DATA32 *val)
+{
+   /* first skip all white space
+    * Note: we are skipping here actually every character than is not 
+    * a digit */
+   while (!isdigit(*b->current))
+     {
+       if (*b->current == '\0')
+         {
+            if (!pmaps_buffer_raw_update(b))
+               return 0;
+
+            continue;
+         }
+       if (*b->current == '#' && !pmaps_buffer_comment_skip(b))
+          return 0;
+       b->current++;
+     }
+
+   if (*b->current == '0')
+      *val = 0xffffffff;
+   else
+      *val = 0xff000000;
+
+   b->current++;
+
+   return 1;
+}
+
+/* external functions */
+static int
+module_open(Evas_Module *em)
+{
+   if (!em)
+      return 0;
+   em->functions = (void *)(&evas_image_load_pmaps_func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+}
+
+static Evas_Module_Api evas_modapi = {
+   EVAS_MODULE_API_VERSION,
+   "pmaps",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_LOADER, image_loader, pmaps);
+
+#ifndef EVAS_STATIC_BUILD_PMAPS
+EVAS_EINA_MODULE_DEFINE(image_loader, pmaps);
+#endif
diff --git a/src/modules/loaders/png/.cvsignore b/src/modules/loaders/png/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/loaders/png/Makefile.am b/src/modules/loaders/png/Makefile.am
new file mode 100644 (file)
index 0000000..ff14bb8
--- /dev/null
@@ -0,0 +1,33 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_image_loader_png_cflags@ \
+@EVIL_CFLAGS@ \
+@WIN32_CPPFLAGS@
+
+if BUILD_LOADER_PNG
+if !EVAS_STATIC_BUILD_PNG
+
+pkgdir = $(libdir)/evas/modules/loaders/png/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = evas_image_load_png.c
+
+module_la_LIBADD = @EINA_LIBS@ @evas_image_loader_png_libs@ @EVIL_LIBS@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_loader_png.la
+libevas_loader_png_la_SOURCES = evas_image_load_png.c
+libevas_loader_png_la_LIBADD = @evas_image_loader_png_libs@
+
+endif
+endif
diff --git a/src/modules/loaders/png/evas_image_load_png.c b/src/modules/loaders/png/evas_image_load_png.c
new file mode 100644 (file)
index 0000000..989fcfe
--- /dev/null
@@ -0,0 +1,279 @@
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <stdio.h>
+#include <png.h>
+#include <setjmp.h>
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#ifdef _WIN32_WCE
+# define E_FOPEN(file, mode) evil_fopen_native((file), (mode))
+# define E_FREAD(buffer, size, count, stream) evil_fread_native(buffer, size, count, stream)
+# define E_FCLOSE(stream) evil_fclose_native(stream)
+#else
+# define E_FOPEN(file, mode) fopen((file), (mode))
+# define E_FREAD(buffer, size, count, stream) fread(buffer, size, count, stream)
+# define E_FCLOSE(stream) fclose(stream)
+#endif
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+
+#define PNG_BYTES_TO_CHECK 4
+
+
+static Eina_Bool evas_image_load_file_head_png(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+static Eina_Bool evas_image_load_file_data_png(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+
+static Evas_Image_Load_Func evas_image_load_png_func =
+{
+  EINA_TRUE,
+  evas_image_load_file_head_png,
+  evas_image_load_file_data_png
+};
+
+static Eina_Bool
+evas_image_load_file_head_png(Image_Entry *ie, const char *file, const char *key __UNUSED__, int *error)
+{
+   png_uint_32 w32, h32;
+   FILE *f;
+   png_structp png_ptr = NULL;
+   png_infop info_ptr = NULL;
+   int bit_depth, color_type, interlace_type;
+   unsigned char buf[PNG_BYTES_TO_CHECK];
+   char hasa;
+
+   hasa = 0;
+   f = E_FOPEN(file, "rb");
+   if (!f)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+
+   /* if we havent read the header before, set the header data */
+   if (E_FREAD(buf, PNG_BYTES_TO_CHECK, 1, f) != 1)
+     {
+       *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+       goto close_file;
+     }
+
+   if (png_sig_cmp(buf, 0, PNG_BYTES_TO_CHECK))
+     {
+       *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+       goto close_file;
+     }
+
+   png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+   if (!png_ptr)
+     {
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       goto close_file;
+     }
+
+   info_ptr = png_create_info_struct(png_ptr);
+   if (!info_ptr)
+     {
+       png_destroy_read_struct(&png_ptr, NULL, NULL);
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       goto close_file;
+     }
+   if (setjmp(png_jmpbuf(png_ptr)))
+     {
+       png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       goto close_file;
+     }
+   png_init_io(png_ptr, f);
+   png_set_sig_bytes(png_ptr, PNG_BYTES_TO_CHECK);
+   png_read_info(png_ptr, info_ptr);
+   png_get_IHDR(png_ptr, info_ptr, (png_uint_32 *) (&w32),
+               (png_uint_32 *) (&h32), &bit_depth, &color_type,
+               &interlace_type, NULL, NULL);
+   if ((w32 < 1) || (h32 < 1) || (w32 > IMG_MAX_SIZE) || (h32 > IMG_MAX_SIZE) ||
+       IMG_TOO_BIG(w32, h32))
+     {
+       png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
+       if (IMG_TOO_BIG(w32, h32))
+         *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       else
+         *error = EVAS_LOAD_ERROR_GENERIC;
+       goto close_file;
+     }
+   ie->w = (int) w32;
+   ie->h = (int) h32;
+   if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) hasa = 1;
+   if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) hasa = 1;
+   if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) hasa = 1;
+   if (hasa) ie->flags.alpha = 1;
+   png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
+   E_FCLOSE(f);
+
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+
+ close_file:
+   E_FCLOSE(f);
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+evas_image_load_file_data_png(Image_Entry *ie, const char *file, const char *key __UNUSED__, int *error)
+{
+   unsigned char *surface;
+   png_uint_32 w32, h32;
+   int w, h;
+   FILE *f;
+   png_structp png_ptr = NULL;
+   png_infop info_ptr = NULL;
+   int bit_depth, color_type, interlace_type;
+   unsigned char buf[PNG_BYTES_TO_CHECK];
+   unsigned char **lines;
+   char hasa;
+   int i;
+
+   hasa = 0;
+   f = E_FOPEN(file, "rb");
+   if (!f)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+
+   /* if we havent read the header before, set the header data */
+   E_FREAD(buf, 1, PNG_BYTES_TO_CHECK, f);
+   if (png_sig_cmp(buf, 0, PNG_BYTES_TO_CHECK))
+     {
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       goto close_file;
+     }
+   png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+   if (!png_ptr)
+     {
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       goto close_file;
+     }
+
+   info_ptr = png_create_info_struct(png_ptr);
+   if (!info_ptr)
+     {
+       png_destroy_read_struct(&png_ptr, NULL, NULL);
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       goto close_file;
+     }
+   if (setjmp(png_jmpbuf(png_ptr)))
+     {
+       png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       goto close_file;
+     }
+   png_init_io(png_ptr, f);
+   png_set_sig_bytes(png_ptr, PNG_BYTES_TO_CHECK);
+   png_read_info(png_ptr, info_ptr);
+   png_get_IHDR(png_ptr, info_ptr, (png_uint_32 *) (&w32),
+               (png_uint_32 *) (&h32), &bit_depth, &color_type,
+               &interlace_type, NULL, NULL);
+   evas_cache_image_surface_alloc(ie, w32, h32);
+   surface = (unsigned char *) evas_cache_image_pixels(ie);
+   if (!surface)
+     {
+       png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       goto close_file;
+     }
+   if ((w32 != ie->w) || (h32 != ie->h))
+     {
+       png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
+       *error = EVAS_LOAD_ERROR_GENERIC;
+       goto close_file;
+     }
+   if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) hasa = 1;
+   if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) hasa = 1;
+   if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) hasa = 1;
+   if (hasa) ie->flags.alpha = 1;
+
+   /* Prep for transformations...  ultimately we want ARGB */
+   /* expand palette -> RGB if necessary */
+   if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr);
+   /* expand gray (w/reduced bits) -> 8-bit RGB if necessary */
+   if ((color_type == PNG_COLOR_TYPE_GRAY) ||
+       (color_type == PNG_COLOR_TYPE_GRAY_ALPHA))
+     {
+       png_set_gray_to_rgb(png_ptr);
+       if (bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr);
+     }
+   /* expand transparency entry -> alpha channel if present */
+   if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
+     png_set_tRNS_to_alpha(png_ptr);
+   /* reduce 16bit color -> 8bit color if necessary */
+   if (bit_depth > 8) png_set_strip_16(png_ptr);
+   /* pack all pixels to byte boundaries */
+   png_set_packing(png_ptr);
+
+   w = ie->w;
+   h = ie->h;
+   /* we want ARGB */
+#ifdef WORDS_BIGENDIAN
+   png_set_swap_alpha(png_ptr);
+   if (!hasa) png_set_filler(png_ptr, 0xff, PNG_FILLER_BEFORE);
+#else
+   png_set_bgr(png_ptr);
+   if (!hasa) png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
+#endif
+   lines = (unsigned char **) alloca(h * sizeof(unsigned char *));
+
+   for (i = 0; i < h; i++)
+     lines[i] = surface + (i * w * sizeof(DATA32));
+   png_read_image(png_ptr, lines);
+   png_read_end(png_ptr, info_ptr);
+   png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
+   E_FCLOSE(f);
+   evas_common_image_premul(ie);
+
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+
+ close_file:
+   E_FCLOSE(f);
+   return EINA_FALSE;
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   em->functions = (void *)(&evas_image_load_png_func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "png",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_LOADER, image_loader, png);
+
+#ifndef EVAS_STATIC_BUILD_PNG
+EVAS_EINA_MODULE_DEFINE(image_loader, png);
+#endif
diff --git a/src/modules/loaders/svg/.cvsignore b/src/modules/loaders/svg/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/loaders/svg/Makefile.am b/src/modules/loaders/svg/Makefile.am
new file mode 100644 (file)
index 0000000..d8e60da
--- /dev/null
@@ -0,0 +1,33 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_image_loader_svg_cflags@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+if BUILD_LOADER_SVG
+if !EVAS_STATIC_BUILD_SVG
+
+pkgdir = $(libdir)/evas/modules/loaders/svg/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = evas_image_load_svg.c
+
+module_la_LIBADD = @EINA_LIBS@ @evas_image_loader_svg_libs@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_loader_svg.la
+libevas_loader_svg_la_SOURCES = evas_image_load_svg.c
+libevas_loader_svg_la_LIBADD = @evas_image_loader_svg_libs@
+
+endif
+endif
diff --git a/src/modules/loaders/svg/evas_image_load_svg.c b/src/modules/loaders/svg/evas_image_load_svg.c
new file mode 100644 (file)
index 0000000..29e433c
--- /dev/null
@@ -0,0 +1,274 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+#include <librsvg/rsvg.h>
+#include <librsvg/rsvg-cairo.h>
+
+static inline Eina_Bool evas_image_load_file_is_svg(const char *file) EINA_ARG_NONNULL(1) EINA_PURE;
+static Eina_Bool evas_image_load_file_head_svg(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+static Eina_Bool evas_image_load_file_data_svg(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+
+Evas_Image_Load_Func evas_image_load_svg_func =
+{
+  EINA_FALSE,
+  evas_image_load_file_head_svg,
+  evas_image_load_file_data_svg
+};
+
+static int  rsvg_initialized = 0;
+
+
+static inline Eina_Bool evas_image_load_file_is_svg(const char *file)
+{
+   int i, len = strlen(file);
+   Eina_Bool is_gz = EINA_FALSE;
+
+   for (i = len - 1; i > 0; i--)
+     {
+       if (file[i] == '.')
+         {
+            if (is_gz)
+              break;
+            else if (strcasecmp(file + i + 1, "gz") == 0)
+              is_gz = EINA_TRUE;
+            else
+              break;
+         }
+     }
+
+   if (i < 1) return EINA_FALSE;
+   i++;
+   if (i >= len) return EINA_FALSE;
+   if (strncasecmp(file + i, "svg", 3) != 0) return EINA_FALSE;
+   i += 3;
+   if (is_gz)
+     {
+       if (file[i] == '.') return EINA_TRUE;
+       else return EINA_FALSE;
+     }
+   else
+     {
+       if (file[i] == '\0') return EINA_TRUE;
+       else if (((file[i] == 'z') || (file[i] == 'Z')) && (!file[i + 1])) return EINA_TRUE;
+       else return EINA_FALSE;
+     }
+}
+
+static Eina_Bool
+evas_image_load_file_head_svg(Image_Entry *ie, const char *file, const char *key __UNUSED__, int *error)
+{
+   RsvgHandle         *rsvg;
+   RsvgDimensionData   dim;
+   int                 w, h;
+
+   /* ignore all files not called .svg or .svg.gz - because rsvg has a leak
+    * where closing the handle doesn't free mem */
+   if (!evas_image_load_file_is_svg(file))
+     {
+       *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+       return EINA_FALSE;
+     }
+
+   rsvg = rsvg_handle_new_from_file(file, NULL);
+   if (!rsvg)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+
+   rsvg_handle_set_dpi(rsvg, 75.0);
+   rsvg_handle_get_dimensions(rsvg, &dim);
+   w = dim.width;
+   h = dim.height;
+   if ((w < 1) || (h < 1) || (w > IMG_MAX_SIZE) || (h > IMG_MAX_SIZE) ||
+       IMG_TOO_BIG(w, h))
+     {
+       rsvg_handle_close(rsvg, NULL);
+       g_object_unref(rsvg);
+       if (IMG_TOO_BIG(w, h))
+         *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       else
+         *error = EVAS_LOAD_ERROR_GENERIC;
+       return EINA_FALSE;
+     }
+   if (ie->load_opts.scale_down_by > 1)
+     {
+       w /= ie->load_opts.scale_down_by;
+       h /= ie->load_opts.scale_down_by;
+     }
+   else if (ie->load_opts.dpi > 0.0)
+     {
+       w = (w * ie->load_opts.dpi) / 75.0;
+       h = (h * ie->load_opts.dpi) / 75.0;
+     }
+   else if ((ie->load_opts.w > 0) &&
+           (ie->load_opts.h > 0))
+     {
+       int w2, h2;
+       
+       w2 = ie->load_opts.w;
+       h2 = (ie->load_opts.w * h) / w;
+       if (h2 > ie->load_opts.h)
+         {
+            h2 = ie->load_opts.h;
+            w2 = (ie->load_opts.h * w) / h;
+         }
+       w = w2;
+       h = h2;
+     }
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+   ie->w = w;
+   ie->h = h;
+   ie->flags.alpha = 1;
+   rsvg_handle_close(rsvg, NULL);
+   g_object_unref(rsvg);
+
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+}
+
+/** FIXME: All evas loaders need to be tightened up **/
+static Eina_Bool
+evas_image_load_file_data_svg(Image_Entry *ie, const char *file, const char *key __UNUSED__, int *error)
+{
+   DATA32             *pixels;
+   RsvgHandle         *rsvg;
+   RsvgDimensionData   dim;
+   int                 w, h;
+   cairo_surface_t    *surface;
+   cairo_t            *cr;
+
+   /* ignore all files not called .svg or .svg.gz - because rsvg has a leak
+    * where closing the handle doesn't free mem */
+   if (!evas_image_load_file_is_svg(file))
+     {
+       *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+       return EINA_FALSE;
+     }
+
+   rsvg = rsvg_handle_new_from_file(file, NULL);
+   if (!rsvg)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+
+   rsvg_handle_set_dpi(rsvg, 75.0);
+   rsvg_handle_get_dimensions(rsvg, &dim);
+   w = dim.width;
+   h = dim.height;
+   if ((w < 1) || (h < 1) || (w > IMG_MAX_SIZE) || (h > IMG_MAX_SIZE))
+     {
+       rsvg_handle_close(rsvg, NULL);
+       g_object_unref(rsvg);
+       if (IMG_TOO_BIG(w, h))
+         *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       else
+         *error = EVAS_LOAD_ERROR_GENERIC;
+       return EINA_FALSE;
+     }
+   if (ie->load_opts.scale_down_by > 1)
+     {
+       w /= ie->load_opts.scale_down_by;
+       h /= ie->load_opts.scale_down_by;
+     }
+   else if (ie->load_opts.dpi > 0.0)
+     {
+       w = (w * ie->load_opts.dpi) / 75.0;
+       h = (h * ie->load_opts.dpi) / 75.0;
+     }
+   else if ((ie->load_opts.w > 0) &&
+           (ie->load_opts.h > 0))
+     {
+       int w2, h2;
+       
+       w2 = ie->load_opts.w;
+       h2 = (ie->load_opts.w * h) / w;
+       if (h2 > ie->load_opts.h)
+         {
+            h2 = ie->load_opts.h;
+            w2 = (ie->load_opts.h * w) / h;
+         }
+       w = w2;
+       h = h2;
+     }
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+   ie->flags.alpha = 1;
+   evas_cache_image_surface_alloc(ie, w, h);
+   pixels = evas_cache_image_pixels(ie);
+   if (!pixels)
+     {
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       goto error;
+     }
+
+   memset(pixels, 0, w * h * sizeof(DATA32));
+   surface = cairo_image_surface_create_for_data((unsigned char *)pixels, CAIRO_FORMAT_ARGB32,
+                                                w, h, w * sizeof(DATA32));
+   if (!surface)
+     {
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       goto error;
+     }
+   cr = cairo_create(surface);
+   if (!cr)
+     {
+       cairo_surface_destroy(surface);
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       goto error;
+     }
+
+   cairo_scale(cr,
+              (double)ie->w / dim.em,
+              (double)ie->h / dim.ex);
+   rsvg_handle_render_cairo(rsvg, cr);
+   cairo_surface_destroy(surface);
+   /* need to check if this is required... */
+   cairo_destroy(cr);
+   rsvg_handle_close(rsvg, NULL);
+   g_object_unref(rsvg);
+   evas_common_image_set_alpha_sparse(ie);
+   return EINA_TRUE;
+
+ error:
+   rsvg_handle_close(rsvg, NULL);
+   g_object_unref(rsvg);
+   return EINA_FALSE;
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   em->functions = (void *)(&evas_image_load_svg_func);
+   if (!rsvg_initialized) rsvg_init();
+   rsvg_initialized = 1;
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+   if (!rsvg_initialized) return;
+   //rsvg_term();
+   //rsvg_initialized = 0;
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "svg",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_LOADER, image_loader, svg);
+
+#ifndef EVAS_STATIC_BUILD_SVG
+EVAS_EINA_MODULE_DEFINE(image_loader, svg);
+#endif
diff --git a/src/modules/loaders/tiff/.cvsignore b/src/modules/loaders/tiff/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/loaders/tiff/Makefile.am b/src/modules/loaders/tiff/Makefile.am
new file mode 100644 (file)
index 0000000..b1aa818
--- /dev/null
@@ -0,0 +1,36 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_image_loader_tiff_cflags@ \
+@EVIL_CFLAGS@ \
+@WIN32_CPPFLAGS@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+if BUILD_LOADER_TIFF
+if !EVAS_STATIC_BUILD_TIFF
+
+pkgdir = $(libdir)/evas/modules/loaders/tiff/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = evas_image_load_tiff.c
+
+module_la_LIBADD = @EINA_LIBS@ @EVIL_LIBS@ @evas_image_loader_tiff_libs@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_loader_tiff.la
+
+libevas_loader_tiff_la_SOURCES = evas_image_load_tiff.c
+libevas_loader_tiff_la_LIBADD = @evas_image_loader_tiff_libs@
+
+endif
+endif
diff --git a/src/modules/loaders/tiff/evas_image_load_tiff.c b/src/modules/loaders/tiff/evas_image_load_tiff.c
new file mode 100644 (file)
index 0000000..20ce7ee
--- /dev/null
@@ -0,0 +1,398 @@
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <tiffio.h>
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+static int _evas_loader_tiff_log_dom = -1;
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_loader_tiff_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_evas_loader_tiff_log_dom, __VA_ARGS__)
+
+static Eina_Bool evas_image_load_file_head_tiff(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+static Eina_Bool evas_image_load_file_data_tiff(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+
+static Evas_Image_Load_Func evas_image_load_tiff_func =
+{
+  EINA_TRUE,
+  evas_image_load_file_head_tiff,
+  evas_image_load_file_data_tiff
+};
+
+typedef struct TIFFRGBAImage_Extra TIFFRGBAImage_Extra;
+
+struct TIFFRGBAImage_Extra {
+   TIFFRGBAImage       rgba;
+   tileContigRoutine   put_contig;
+   tileSeparateRoutine put_separate;
+   Image_Entry        *image;
+   char                pper;
+   uint32              num_pixels;
+   uint32              py;
+};
+
+static void put_contig_and_raster(TIFFRGBAImage *, uint32 *,
+                                  uint32, uint32, uint32, uint32, int32,
+                                  int32, unsigned char *);
+static void put_separate_and_raster(TIFFRGBAImage *, uint32 *, uint32,
+                                    uint32, uint32, uint32, int32,
+                                    int32, unsigned char *,
+                                    unsigned char *, unsigned char *,
+                                    unsigned char *);
+static void raster(TIFFRGBAImage_Extra * img, uint32 * raster, uint32 x,
+                   uint32 y, uint32 w, uint32 h);
+
+
+static void
+put_contig_and_raster(TIFFRGBAImage * img, uint32 * rast,
+                      uint32 x, uint32 y, uint32 w, uint32 h,
+                      int32 fromskew, int32 toskew, unsigned char *cp)
+{
+   (*(((TIFFRGBAImage_Extra *) img)->put_contig)) (img, rast, x, y, w, h,
+                                                   fromskew, toskew, cp);
+   raster((TIFFRGBAImage_Extra *) img, rast, x, y, w, h);
+}
+
+static void
+put_separate_and_raster(TIFFRGBAImage * img, uint32 * rast,
+                        uint32 x, uint32 y, uint32 w, uint32 h,
+                        int32 fromskew, int32 toskew,
+                        unsigned char *r, unsigned char *g, unsigned char *b,
+                        unsigned char *a)
+{
+   (*(((TIFFRGBAImage_Extra *) img)->put_separate))
+       (img, rast, x, y, w, h, fromskew, toskew, r, g, b, a);
+   raster((TIFFRGBAImage_Extra *) img, rast, x, y, w, h);
+}
+
+/* needs orientation code */
+
+static void
+raster(TIFFRGBAImage_Extra * img, uint32 * rast,
+       uint32 x, uint32 y, uint32 w, uint32 h)
+{
+   int                 image_width, image_height;
+   uint32             *pixel, pixel_value;
+   int                 i, j, dy, rast_offset;
+   DATA32             *buffer_pixel, *buffer = evas_cache_image_pixels(img->image);
+   int                 alpha_premult = 0;
+
+   image_width = img->image->w;
+   image_height = img->image->h;
+
+   dy = h > y ? -1 : y - h;
+
+   /* rast seems to point to the beginning of the last strip processed */
+   /* so you need use negative offsets. Bizzare. Someone please check this */
+   /* I don't understand why, but that seems to be what's going on. */
+   /* libtiff needs better docs! */
+
+   if (img->rgba.alpha == EXTRASAMPLE_UNASSALPHA)
+     alpha_premult = 1;
+   for (i = y, rast_offset = 0; i > dy; i--, rast_offset--)
+     {
+        pixel = rast + (rast_offset * image_width);
+        buffer_pixel = buffer + ((((image_height - 1) - i) * image_width) + x);
+
+        for (j = 0; j < w; j++)
+          {
+            int a, r, g, b;
+
+             pixel_value = (*(pixel++));
+            a = TIFFGetA(pixel_value);
+            r = TIFFGetR(pixel_value);
+            g = TIFFGetG(pixel_value);
+            b = TIFFGetB(pixel_value);
+            if (!alpha_premult && (a < 255))
+              {
+                 r = (r * (a + 1)) >> 8;
+                 g = (g * (a + 1)) >> 8;
+                 b = (b * (a + 1)) >> 8;
+              }
+             (*(buffer_pixel++)) = (a << 24) | (r << 16) | (g << 8) | b;
+          }
+     }
+}
+
+static Eina_Bool
+evas_image_load_file_head_tiff(Image_Entry *ie, const char *file, const char *key __UNUSED__, int *error)
+{
+   char                txt[1024];
+   TIFFRGBAImage       tiff_image;
+   TIFF               *tif = NULL;
+   FILE               *ffile;
+   int                 fd;
+   uint16              magic_number;
+
+   ffile = fopen(file, "rb");
+   if (!ffile)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+
+   if (fread(&magic_number, sizeof(uint16), 1, ffile) != 1)
+     {
+        fclose(ffile);
+       *error = EVAS_LOAD_ERROR_GENERIC;
+       return EINA_FALSE;
+     }
+   /* Apparently rewind(f) isn't sufficient */
+   fseek(ffile, (long)0, SEEK_SET);
+
+   if ((magic_number != TIFF_BIGENDIAN) /* Checks if actually tiff file */
+       && (magic_number != TIFF_LITTLEENDIAN))
+     {
+        fclose(ffile);
+       *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+       return EINA_FALSE;
+     }
+
+   fd = fileno(ffile);
+   fd = dup(fd);
+   lseek(fd, (long)0, SEEK_SET);
+   fclose(ffile);
+
+   tif = TIFFFdOpen(fd, file, "r");
+   if (!tif)
+     {
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+
+   strcpy(txt, "Evas Tiff loader: cannot be processed by libtiff");
+   if (!TIFFRGBAImageOK(tif, txt))
+     {
+        TIFFClose(tif);
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+   strcpy(txt, "Evas Tiff loader: cannot begin reading tiff");
+   if (!TIFFRGBAImageBegin(& tiff_image, tif, 1, txt))
+     {
+        TIFFClose(tif);
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+
+   if (tiff_image.alpha != EXTRASAMPLE_UNSPECIFIED)
+     ie->flags.alpha = 1;
+   if ((tiff_image.width < 1) || (tiff_image.height < 1) ||
+       (tiff_image.width > IMG_MAX_SIZE) || (tiff_image.height > IMG_MAX_SIZE) ||
+       IMG_TOO_BIG(tiff_image.width, tiff_image.height))
+     {
+       TIFFClose(tif);
+       if (IMG_TOO_BIG(tiff_image.width, tiff_image.height))
+         *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       else
+         *error = EVAS_LOAD_ERROR_GENERIC;
+       return EINA_FALSE;
+     }
+   ie->w = tiff_image.width;
+   ie->h = tiff_image.height;
+
+   TIFFRGBAImageEnd(&tiff_image);
+   TIFFClose(tif);
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+evas_image_load_file_data_tiff(Image_Entry *ie, const char *file, const char *key __UNUSED__, int *error)
+{
+   char                txt[1024];
+   TIFFRGBAImage_Extra rgba_image;
+   TIFF               *tif = NULL;
+   FILE               *ffile;
+   uint32             *rast = NULL;
+   uint32              num_pixels;
+   int                 fd;
+   uint16              magic_number;
+
+   ffile = fopen(file, "rb");
+   if (!ffile)
+     {
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+
+   fread(&magic_number, sizeof(uint16), 1, ffile);
+   /* Apparently rewind(f) isn't sufficient */
+   fseek(ffile, (long)0, SEEK_SET);
+
+   if ((magic_number != TIFF_BIGENDIAN) /* Checks if actually tiff file */
+       && (magic_number != TIFF_LITTLEENDIAN))
+     {
+        fclose(ffile);
+       *error = EVAS_LOAD_ERROR_GENERIC;
+       return EINA_FALSE;
+     }
+
+   fd = fileno(ffile);
+   fd = dup(fd);
+   lseek(fd, (long)0, SEEK_SET);
+   fclose(ffile);
+
+   tif = TIFFFdOpen(fd, file, "r");
+   if (!tif)
+     {
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+
+   strcpy(txt, "Evas Tiff loader: cannot be processed by libtiff");
+   if (!TIFFRGBAImageOK(tif, txt))
+     {
+        TIFFClose(tif);
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+   strcpy(txt, "Evas Tiff loader: cannot begin reading tiff");
+   if (!TIFFRGBAImageBegin((TIFFRGBAImage *) & rgba_image, tif, 0, txt))
+     {
+        TIFFClose(tif);
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+   rgba_image.image = ie;
+
+   if (rgba_image.rgba.alpha != EXTRASAMPLE_UNSPECIFIED)
+     ie->flags.alpha = 1;
+   if ((rgba_image.rgba.width != ie->w) ||
+       (rgba_image.rgba.height != ie->h))
+     {
+        TIFFClose(tif);
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       return EINA_FALSE;
+     }
+
+   evas_cache_image_surface_alloc(ie, rgba_image.rgba.width, rgba_image.rgba.height);
+   if (!evas_cache_image_pixels(ie))
+     {
+        TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image);
+        TIFFClose(tif);
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       return EINA_FALSE;
+     }
+
+   rgba_image.num_pixels = num_pixels = ie->w * ie->h;
+
+   rgba_image.pper = rgba_image.py = 0;
+   rast = (uint32 *) _TIFFmalloc(sizeof(uint32) * num_pixels);
+
+   if (!rast)
+     {
+       ERR("Evas Tiff loader: out of memory");
+
+       TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image);
+       TIFFClose(tif);
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       return EINA_FALSE;
+     }
+
+   if (rgba_image.rgba.put.any == NULL)
+     {
+       ERR("Evas Tiff loader: no put function");
+
+        _TIFFfree(rast);
+        TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image);
+        TIFFClose(tif);
+
+       *error = EVAS_LOAD_ERROR_GENERIC;
+       return EINA_FALSE;
+     }
+   else
+     {
+       if (rgba_image.rgba.isContig)
+         {
+            rgba_image.put_contig = rgba_image.rgba.put.contig;
+            rgba_image.rgba.put.contig = put_contig_and_raster;
+         }
+       else
+         {
+            rgba_image.put_separate = rgba_image.rgba.put.separate;
+            rgba_image.rgba.put.separate = put_separate_and_raster;
+         }
+     }
+
+   /*  if (rgba_image.rgba.samplesperpixel == 8)*/
+   if (rgba_image.rgba.bitspersample == 8)
+     {
+        if (!TIFFRGBAImageGet((TIFFRGBAImage *) &rgba_image, rast,
+                              rgba_image.rgba.width, rgba_image.rgba.height))
+          {
+             _TIFFfree(rast);
+             TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image);
+             TIFFClose(tif);
+            *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+            return EINA_FALSE;
+          }
+     }
+   else
+     {
+        INF("channel bits == %i", (int)rgba_image.rgba.samplesperpixel);
+     }
+
+   _TIFFfree(rast);
+
+   TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image);
+
+   TIFFClose(tif);
+
+   evas_common_image_set_alpha_sparse(ie);
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   _evas_loader_tiff_log_dom = eina_log_domain_register("EvasLoaderTiff", EVAS_DEFAULT_LOG_COLOR);
+   if (_evas_loader_tiff_log_dom < 0)
+     {
+        EINA_LOG_ERR("Impossible to create a log domain for the LoaderTiff loader.\n");
+        return 0;
+     }
+   em->functions = (void *)(&evas_image_load_tiff_func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+   eina_log_domain_unregister(_evas_loader_tiff_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "tiff",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_LOADER, image_loader, tiff);
+
+#ifndef EVAS_STATIC_BUILD_TIFF
+EVAS_EINA_MODULE_DEFINE(image_loader, tiff);
+#endif
diff --git a/src/modules/loaders/xpm/.cvsignore b/src/modules/loaders/xpm/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/loaders/xpm/Makefile.am b/src/modules/loaders/xpm/Makefile.am
new file mode 100644 (file)
index 0000000..de81294
--- /dev/null
@@ -0,0 +1,36 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_image_loader_xpm_cflags@ \
+@EVIL_CFLAGS@ \
+@WIN32_CPPFLAGS@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+if BUILD_LOADER_XPM
+if !EVAS_STATIC_BUILD_XPM
+pkgdir = $(libdir)/evas/modules/loaders/xpm/$(MODULE_ARCH)
+
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = evas_image_load_xpm.c
+
+module_la_LIBADD = @EINA_LIBS@ @EVIL_LIBS@ @evas_image_loader_xpm_libs@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_loader_xpm.la
+
+libevas_loader_xpm_la_SOURCES = evas_image_load_xpm.c
+libevas_loader_xpm_la_LIBADD = @evas_image_loader_xpm_libs@
+
+endif
+endif
diff --git a/src/modules/loaders/xpm/evas_image_load_xpm.c b/src/modules/loaders/xpm/evas_image_load_xpm.c
new file mode 100644 (file)
index 0000000..e7778de
--- /dev/null
@@ -0,0 +1,690 @@
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+static int _evas_loader_xpm_log_dom = -1;
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_evas_loader_xpm_log_dom, __VA_ARGS__)
+
+static Eina_Bool evas_image_load_file_head_xpm(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+static Eina_Bool evas_image_load_file_data_xpm(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
+
+static Evas_Image_Load_Func evas_image_load_xpm_func =
+{
+  EINA_FALSE,
+  evas_image_load_file_head_xpm,
+  evas_image_load_file_data_xpm
+};
+
+// TODO: REWRITE THIS WITH THREAD SAFE VERSION NOT USING THIS HANDLE!!!!
+static FILE *rgb_txt = NULL;
+
+static void
+xpm_parse_color(char *color, int *r, int *g, int *b)
+{
+   char                buf[4096];
+
+   /* is a #ff00ff like color */
+   if (color[0] == '#')
+     {
+        int                 len;
+        char                val[32];
+
+        len = strlen(color) - 1;
+        if (len < 96)
+          {
+             int                 i;
+
+             len /= 3;
+             for (i = 0; i < len; i++)
+                val[i] = color[1 + i + (0 * len)];
+             val[i] = 0;
+             sscanf(val, "%x", r);
+             for (i = 0; i < len; i++)
+                val[i] = color[1 + i + (1 * len)];
+             val[i] = 0;
+             sscanf(val, "%x", g);
+             for (i = 0; i < len; i++)
+                val[i] = color[1 + i + (2 * len)];
+             val[i] = 0;
+             sscanf(val, "%x", b);
+             if (len == 1)
+               {
+                  *r = (*r << 4) | *r;
+                  *g = (*g << 4) | *g;
+                  *b = (*b << 4) | *b;
+               }
+             else if (len > 2)
+               {
+                  *r >>= (len - 2) * 4;
+                  *g >>= (len - 2) * 4;
+                  *b >>= (len - 2) * 4;
+               }
+          }
+        return;
+     }
+   /* look in rgb txt database */
+   if (!rgb_txt) rgb_txt = fopen("/usr/lib/X11/rgb.txt", "r");
+   if (!rgb_txt) rgb_txt = fopen("/usr/X11/lib/X11/rgb.txt", "r");
+   if (!rgb_txt) rgb_txt = fopen("/usr/X11R6/lib/X11/rgb.txt", "r");
+   if (!rgb_txt) rgb_txt = fopen("/usr/openwin/lib/X11/rgb.txt", "r");
+   if (!rgb_txt) return;
+   fseek(rgb_txt, 0, SEEK_SET);
+   while (fgets(buf, sizeof(buf), rgb_txt))
+     {
+       buf[sizeof(buf) - 1] = 0;
+        if (buf[0] != '!')
+          {
+             int rr, gg, bb;
+             char name[4096];
+
+             if (sscanf(buf, "%i %i %i %[^\n]", &rr, &gg, &bb, name) == 4)
+              {
+                 if (!strcasecmp(name, color))
+                   {
+                      *r = rr;
+                      *g = gg;
+                      *b = bb;
+                      return;
+                   }
+              }
+          }
+     }
+}
+
+static void
+xpm_parse_done(void)
+{
+   if (rgb_txt) fclose(rgb_txt);
+   rgb_txt = NULL;
+}
+
+
+/** FIXME: clean this up and make more efficient  **/
+static Eina_Bool
+evas_image_load_file_xpm(Image_Entry *ie, const char *file, const char *key __UNUSED__, int load_data, int *error)
+{
+   DATA32             *ptr, *end;
+   FILE               *f;
+
+   int                 pc, c, i, j, k, w, h, ncolors, cpp, comment, transp,
+                       quote, context, len, done, r, g, b, backslash, lu1, lu2;
+   char               *line, s[256], tok[128], col[256], *tl;
+   int                 lsz = 256;
+   struct _cmap {
+      char             str[6];
+      unsigned char    transp;
+      short            r, g, b;
+   }                  *cmap;
+
+   short               lookup[128 - 32][128 - 32];
+   int                 count, pixels;
+
+   done = 0;
+//   transp = -1;
+   transp = 1;
+
+   /* if immediate_load is 1, then dont delay image laoding as below, or */
+   /* already data in this image - dont load it again */
+
+   f = fopen(file, "rb");
+   if (!f)
+     {
+        xpm_parse_done();
+       *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+       return EINA_FALSE;
+     }
+   if (fread(s, 9, 1, f) != 1)
+     {
+        fclose(f);
+       xpm_parse_done();
+       *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+       return EINA_FALSE;
+     }
+   rewind(f);
+   s[9] = 0;
+   if (strcmp("/* XPM */", s))
+     {
+        fclose(f);
+        xpm_parse_done();
+       *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+       return EINA_FALSE;
+     }
+
+   i = 0;
+   j = 0;
+   cmap = NULL;
+   w = 10;
+   h = 10;
+   ptr = NULL;
+   end = NULL;
+   c = ' ';
+   comment = 0;
+   quote = 0;
+   context = 0;
+   pixels = 0;
+   count = 0;
+   line = malloc(lsz);
+   if (!line)
+     {
+        fclose(f);
+        xpm_parse_done();
+       *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+       return EINA_FALSE;
+     }
+
+   backslash = 0;
+   memset(lookup, 0, sizeof(lookup));
+   while (!done)
+     {
+        pc = c;
+        c = fgetc(f);
+        if (c == EOF) break;
+        if (!quote)
+          {
+             if ((pc == '/') && (c == '*'))
+              comment = 1;
+             else if ((pc == '*') && (c == '/') && (comment))
+              comment = 0;
+          }
+        if (!comment)
+          {
+             if ((!quote) && (c == '"'))
+               {
+                  quote = 1;
+                  i = 0;
+               }
+             else if ((quote) && (c == '"'))
+               {
+                  line[i] = 0;
+                  quote = 0;
+                  if (context == 0)
+                    {
+                       /* Header */
+                       if (sscanf(line, "%i %i %i %i", &w, &h, &ncolors, &cpp) != 4)
+                        {
+                           ERR("XPM ERROR: XPM file malformed header");
+                            free(line);
+                            fclose(f);
+                            xpm_parse_done();
+                           *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
+                           return EINA_FALSE;
+                        }
+                       if ((ncolors > 32766) || (ncolors < 1))
+                         {
+                            ERR("XPM ERROR: XPM files with colors > 32766 or < 1 not supported");
+                            free(line);
+                            fclose(f);
+                            xpm_parse_done();
+                           *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+                           return EINA_FALSE;
+                         }
+                       if ((cpp > 5) || (cpp < 1))
+                         {
+                           ERR("XPM ERROR: XPM files with characters per pixel > 5 or < 1not supported");
+                            free(line);
+                            fclose(f);
+                            xpm_parse_done();
+                           *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+                           return EINA_FALSE;
+                         }
+                       if ((w > IMG_MAX_SIZE) || (w < 1))
+                         {
+                           ERR("XPM ERROR: Image width > IMG_MAX_SIZE or < 1 pixels for file");
+                            free(line);
+                            fclose(f);
+                            xpm_parse_done();
+                           *error = EVAS_LOAD_ERROR_GENERIC;
+                           return EINA_FALSE;
+                         }
+                       if ((h > IMG_MAX_SIZE) || (h < 1))
+                         {
+                           ERR("XPM ERROR: Image height > IMG_MAX_SIZE or < 1 pixels for file");
+                            free(line);
+                            fclose(f);
+                            xpm_parse_done();
+                           *error = EVAS_LOAD_ERROR_GENERIC;
+                           return EINA_FALSE;
+                         }
+                       if (IMG_TOO_BIG(w, h))
+                         {
+                            ERR("XPM ERROR: Image just too big to ever allocate");
+                            free(line);
+                            fclose(f);
+                            xpm_parse_done();
+                           *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+                           return EINA_FALSE;
+                         }
+
+                       if (!cmap)
+                         {
+                            cmap = malloc(sizeof(struct _cmap) * ncolors);
+                            if (!cmap)
+                              {
+                                free(line);
+                                fclose(f);
+                                xpm_parse_done();
+                               *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+                               return EINA_FALSE;
+                              }
+                         }
+                       ie->w = w;
+                       ie->h = h;
+
+                       j = 0;
+                       context++;
+                    }
+                  else if (context == 1)
+                    {
+                       /* Color Table */
+                       if (j < ncolors)
+                         {
+                            int                 slen;
+                            int                 hascolor, iscolor;
+
+                            iscolor = 0;
+                            hascolor = 0;
+                            tok[0] = 0;
+                            col[0] = 0;
+                            s[0] = 0;
+                            len = strlen(line);
+                            strncpy(cmap[j].str, line, cpp);
+                            cmap[j].str[cpp] = 0;
+                           for (slen = 0; slen < cpp; slen++)
+                             {
+                                /* fix the ascii of the  color string - if its < 32 - just limit to 32 */
+                                if (cmap[j].str[slen] < 32) cmap[j].str[slen] = 0;
+                             }
+                            cmap[j].r = -1;
+                            cmap[j].transp = 0;
+                            for (k = cpp; k < len; k++)
+                              {
+                                 if (line[k] != ' ')
+                                   {
+                                      s[0] = 0;
+                                      sscanf(&line[k], "%255s", s);
+                                      slen = strlen(s);
+                                      k += slen;
+                                      if (!strcmp(s, "c")) iscolor = 1;
+                                      if ((!strcmp(s, "m")) || (!strcmp(s, "s"))
+                                          || (!strcmp(s, "g4")) || (!strcmp(s, "g"))
+                                          || (!strcmp(s, "c")) || (k >= len))
+                                        {
+                                           if (k >= len)
+                                             {
+                                                if (col[0])
+                                                 {
+                                                    if (strlen(col) < (sizeof(col) - 2))
+                                                      strcat(col, " ");
+                                                    else
+                                                      done = 1;
+                                                 }
+                                                if ((strlen(col) + strlen(s)) < (sizeof(col) - 1))
+                                                 strcat(col, s);
+                                             }
+                                           if (col[0])
+                                             {
+                                                if (!strcasecmp(col, "none"))
+                                                  {
+                                                     transp = 1;
+                                                     cmap[j].transp = 1;
+                                                    cmap[j].r = 0;
+                                                    cmap[j].g = 0;
+                                                    cmap[j].b = 0;
+                                                  }
+                                                else
+                                                  {
+                                                     if ((((cmap[j].r < 0) || (!strcmp(tok, "c"))) && (!hascolor)))
+                                                       {
+                                                          r = g = b = 0;
+                                                          xpm_parse_color(col, &r, &g, &b);
+                                                          cmap[j].r = r;
+                                                          cmap[j].g = g;
+                                                          cmap[j].b = b;
+                                                          if (iscolor) hascolor = 1;
+                                                       }
+                                                  }
+                                             }
+                                           strcpy(tok, s);
+                                           col[0] = 0;
+                                        }
+                                      else
+                                        {
+                                          if (col[0])
+                                            {
+                                               if (strlen(col) < ( sizeof(col) - 2))
+                                                 strcat(col, " ");
+                                               else
+                                                 done = 1;
+                                            }
+                                          if ((strlen(col) + strlen(s)) < (sizeof(col) - 1))
+                                            strcat(col, s);
+                                        }
+                                   }
+                              }
+                         }
+                       j++;
+                       if (j >= ncolors)
+                         {
+                            if (cpp == 1)
+                             {
+                                for (i = 0; i < ncolors; i++)
+                                  lookup[(int)cmap[i].str[0] - 32][0] = i;
+                             }
+                            if (cpp == 2)
+                             {
+                                for (i = 0; i < ncolors; i++)
+                                  lookup[(int)cmap[i].str[0] - 32][(int)cmap[i].str[1] - 32] = i;
+                             }
+                            context++;
+                         }
+
+                       if (transp) ie->flags.alpha = 1;
+
+                       if (load_data)
+                         {
+                            evas_cache_image_surface_alloc(ie, w, h);
+                            ptr = evas_cache_image_pixels(ie);
+                            if (!ptr)
+                              {
+                                 free(cmap);
+                                 free(line);
+                                 fclose(f);
+                                 xpm_parse_done();
+                                *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+                                return EINA_FALSE;
+                              }
+                            pixels = w * h;
+                            end = ptr + pixels;
+                         }
+                       else
+                         {
+                            free(cmap);
+                            free(line);
+                            fclose(f);
+                            xpm_parse_done();
+                           *error = EVAS_LOAD_ERROR_NONE;
+                           return EINA_TRUE;
+                         }
+                    }
+                  else
+                    {
+                       /* Image Data */
+                       i = 0;
+                       if (cpp == 0)
+                         {
+                            /* Chars per pixel = 0? well u never know */
+                         }
+                      /* it's xpm - don't care about speed too much. still faster
+                       * that most xpm loaders anyway */
+                       else if (cpp == 1)
+                         {
+                            if (transp)
+                              {
+                                 for (i = 0;
+                                      ((i < 65536) && (ptr < end) && (line[i]));
+                                      i++)
+                                   {
+                                     lu1 = (int)line[i] - 32;
+                                     if (lu1 < 0) continue;
+                                      if (cmap[lookup[lu1][0]].transp)
+                                        {
+                                          r = (unsigned char)cmap[lookup[lu1][0]].r;
+                                           g = (unsigned char)cmap[lookup[lu1][0]].g;
+                                           b = (unsigned char)cmap[lookup[lu1][0]].b;
+                                           *ptr = (r << 16) | (g << 8) | b;
+                                          ptr++;
+                                           count++;
+                                        }
+                                      else
+                                        {
+                                           r = (unsigned char)cmap[lookup[lu1][0]].r;
+                                           g = (unsigned char)cmap[lookup[lu1][0]].g;
+                                           b = (unsigned char)cmap[lookup[lu1][0]].b;
+                                           *ptr = (0xff << 24) | (r << 16) | (g << 8) | b;
+                                          ptr++;
+                                           count++;
+                                        }
+                                   }
+                              }
+                            else
+                              {
+                                 for (i = 0;
+                                      ((i < 65536) && (ptr < end) && (line[i]));
+                                      i++)
+                                   {
+                                     lu1 = (int)line[i] - 32;
+                                     if (lu1 < 0) continue;
+                                     r = (unsigned char)cmap[lookup[lu1][0]].r;
+                                     g = (unsigned char)cmap[lookup[lu1][0]].g;
+                                     b = (unsigned char)cmap[lookup[lu1][0]].b;
+                                     *ptr = (0xff << 24) | (r << 16) | (g << 8) | b;
+                                     ptr++;
+                                     count++;
+                                   }
+                              }
+                         }
+                       else if (cpp == 2)
+                         {
+                            if (transp)
+                              {
+                                 for (i = 0;
+                                      ((i < 65536) && (ptr < end) && (line[i]));
+                                      i++)
+                                   {
+                                     lu1 = (int)line[i] - 32;
+                                     i++;
+                                     lu2 = (int)line[i] - 32;
+                                     if (lu1 < 0) continue;
+                                     if (lu2 < 0) continue;
+                                      if (cmap[lookup[lu1][lu2]].transp)
+                                        {
+                                          r = (unsigned char)cmap[lookup[lu1][lu2]].r;
+                                           g = (unsigned char)cmap[lookup[lu1][lu2]].g;
+                                           b = (unsigned char)cmap[lookup[lu1][lu2]].b;
+                                           *ptr = (r << 16) | (g << 8) | b;
+                                          ptr++;
+                                           count++;
+                                        }
+                                      else
+                                        {
+                                           r = (unsigned char)cmap[lookup[lu1][lu2]].r;
+                                           g = (unsigned char)cmap[lookup[lu1][lu2]].g;
+                                           b = (unsigned char)cmap[lookup[lu1][lu2]].b;
+                                           *ptr = (0xff << 24) | (r << 16) | (g << 8) | b;
+                                          ptr++;
+                                           count++;
+                                        }
+                                   }
+                              }
+                            else
+                              {
+                                 for (i = 0;
+                                      ((i < 65536) && (ptr < end) && (line[i]));
+                                      i++)
+                                   {
+                                     lu1 = (int)line[i] - 32;
+                                     i++;
+                                     lu2 = (int)line[i] - 32;
+                                     if (lu1 < 0) continue;
+                                     if (lu2 < 0) continue;
+                                     r = (unsigned char)cmap[lookup[lu1][lu2]].r;
+                                     g = (unsigned char)cmap[lookup[lu1][lu2]].g;
+                                     b = (unsigned char)cmap[lookup[lu1][lu2]].b;
+                                     *ptr = (0xff << 24) | (r << 16) | (g << 8) | b;
+                                     ptr++;
+                                     count++;
+                                   }
+                              }
+                         }
+                       else
+                         {
+                            if (transp)
+                              {
+                                 for (i = 0;
+                                      ((i < 65536) && (ptr < end) && (line[i]));
+                                      i++)
+                                   {
+                                      for (j = 0; j < cpp; j++, i++)
+                                       {
+                                          col[j] = line[i];
+                                          if (col[j] < 32) col[j] = 32;
+                                       }
+                                      col[j] = 0;
+                                      i--;
+                                      for (j = 0; j < ncolors; j++)
+                                        {
+                                           if (!strcmp(col, cmap[j].str))
+                                             {
+                                                if (cmap[j].transp)
+                                                  {
+                                                     r = (unsigned char)cmap[j].r;
+                                                     g = (unsigned char)cmap[j].g;
+                                                     b = (unsigned char)cmap[j].b;
+                                                    *ptr = (r << 16) | (g << 8) | b;
+                                                    ptr++;
+                                                     count++;
+                                                  }
+                                                else
+                                                  {
+                                                    r = (unsigned char)cmap[j].r;
+                                                     g = (unsigned char)cmap[j].g;
+                                                     b = (unsigned char)cmap[j].b;
+                                                    *ptr = (0xff << 24) | (r << 16) | (g << 8) | b;
+                                                    ptr++;
+                                                     count++;
+                                                  }
+                                               break;
+                                             }
+                                        }
+                                   }
+                              }
+                            else
+                              {
+                                 for (i = 0;
+                                      ((i < 65536) && (ptr < end) && (line[i]));
+                                      i++)
+                                   {
+                                      for (j = 0; j < cpp; j++, i++)
+                                        {
+                                           col[j] = line[i];
+                                        }
+                                      col[j] = 0;
+                                      i--;
+                                      for (j = 0; j < ncolors; j++)
+                                        {
+                                           if (!strcmp(col, cmap[j].str))
+                                             {
+                                                r = (unsigned char)cmap[j].r;
+                                                g = (unsigned char)cmap[j].g;
+                                                b = (unsigned char)cmap[j].b;
+                                               *ptr = (0xff << 24) | (r << 16) | (g << 8) | b;
+                                               ptr++;
+                                               count++;
+                                                break;
+                                             }
+                                        }
+                                   }
+                              }
+                         }
+                    }
+               }
+          }
+        /* Scan in line from XPM file */
+        if ((!comment) && (quote) && (c != '"'))
+          {
+             if (c < 32) c = 32;
+             else if (c > 127) c = 127;
+            if (c =='\\')
+              {
+                 if (++backslash < 2)
+                   line[i++] = c;
+                 else
+                   backslash = 0;
+              }
+            else
+              {
+                 backslash = 0;
+                 line[i++] = c;
+              }
+          }
+        if (i >= lsz)
+          {
+             lsz += 256;
+             tl = realloc(line, lsz);
+             if (!tl) break;
+            line = tl;
+          }
+        if (((ptr) && ((ptr - evas_cache_image_pixels(ie)) >= (w * h * sizeof(DATA32)))) ||
+            ((context > 1) && (count >= pixels)))
+         break;
+     }
+
+   if (cmap) free(cmap);
+   if (line) free(line);
+   if (f) fclose(f);
+
+   xpm_parse_done();
+   *error = EVAS_LOAD_ERROR_NONE;
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+evas_image_load_file_head_xpm(Image_Entry *ie, const char *file, const char *key, int *error)
+{
+   return evas_image_load_file_xpm(ie, file, key, 0, error);
+}
+
+static Eina_Bool
+evas_image_load_file_data_xpm(Image_Entry *ie, const char *file, const char *key, int *error)
+{
+   return evas_image_load_file_xpm(ie, file, key, 1, error);
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   _evas_loader_xpm_log_dom = eina_log_domain_register("EvasLoaderXpm", EVAS_DEFAULT_LOG_COLOR);
+   if (_evas_loader_xpm_log_dom < 0)
+     {
+        EINA_LOG_ERR("Impossible to create a log domain for the LoaderXpm loader.\n");
+        return 0;
+     }
+   em->functions = (void *)(&evas_image_load_xpm_func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+   eina_log_domain_unregister(_evas_loader_xpm_log_dom);
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "xpm",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_LOADER, image_loader, xpm);
+
+#ifndef EVAS_STATIC_BUILD_XPM
+EVAS_EINA_MODULE_DEFINE(image_loader, xpm);
+#endif
diff --git a/src/modules/savers/.cvsignore b/src/modules/savers/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/src/modules/savers/Makefile.am b/src/modules/savers/Makefile.am
new file mode 100644 (file)
index 0000000..0854052
--- /dev/null
@@ -0,0 +1,33 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS =
+
+if BUILD_LOADER_EDB
+if !EVAS_STATIC_BUILD_EDB
+SUBDIRS += edb
+endif
+endif
+
+if BUILD_LOADER_EET
+if !EVAS_STATIC_BUILD_EET
+SUBDIRS += eet
+endif
+endif
+
+if BUILD_SAVER_JPEG
+if !EVAS_STATIC_BUILD_JPEG
+SUBDIRS += jpeg
+endif
+endif
+
+if BUILD_LOADER_PNG
+if !EVAS_STATIC_BUILD_PNG
+SUBDIRS += png
+endif
+endif
+
+if BUILD_LOADER_TIFF
+if !EVAS_STATIC_BUILD_TIFF
+SUBDIRS += tiff
+endif
+endif
diff --git a/src/modules/savers/edb/.cvsignore b/src/modules/savers/edb/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/savers/edb/Makefile.am b/src/modules/savers/edb/Makefile.am
new file mode 100644 (file)
index 0000000..e273d9b
--- /dev/null
@@ -0,0 +1,32 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS           = -I. \
+                        -I$(top_srcdir)/src/lib \
+                        -I$(top_srcdir)/src/lib/include \
+                        @FREETYPE_CFLAGS@ @evas_image_loader_edb_cflags@ \
+                        @EINA_CFLAGS@
+
+if BUILD_LOADER_EDB
+if !EVAS_STATIC_BUILD_EDB
+
+pkgdir                 = $(libdir)/evas/modules/savers/edb/$(MODULE_ARCH)
+pkg_LTLIBRARIES        = module.la
+
+module_la_SOURCES      = evas_image_save_edb.c
+
+module_la_LIBADD       = @EINA_LIBS@ @evas_image_loader_edb_libs@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS      = -no-undefined -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_saver_edb.la
+
+libevas_saver_edb_la_SOURCES = evas_image_save_edb.c
+libevas_saver_edb_la_LIBADD = @evas_image_loader_edb_libs@
+
+endif
+endif
+
+EXTRA_DIST             = evas_image_save_edb.c
diff --git a/src/modules/savers/edb/evas_image_save_edb.c b/src/modules/savers/edb/evas_image_save_edb.c
new file mode 100644 (file)
index 0000000..8279226
--- /dev/null
@@ -0,0 +1,48 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+#include <Edb.h>
+#include <zlib.h>
+
+static int evas_image_save_file_edb(RGBA_Image *im, const char *file, const char *key, int quality, int compress);
+
+static Evas_Image_Save_Func evas_image_save_edb_func =
+{
+   evas_image_save_file_edb
+};
+
+static int
+evas_image_save_file_edb(RGBA_Image *im, const char *file, const char *key, int quality, int compress)
+{
+   return 0;
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   em->functions = (void *)(&evas_image_save_edb_func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "edb",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_SAVER, image_saver, edb);
+
+#ifndef EVAS_STATIC_BUILD_EDB
+EVAS_EINA_MODULE_DEFINE(image_saver, edb);
+#endif
diff --git a/src/modules/savers/eet/.cvsignore b/src/modules/savers/eet/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/savers/eet/Makefile.am b/src/modules/savers/eet/Makefile.am
new file mode 100644 (file)
index 0000000..94f3a55
--- /dev/null
@@ -0,0 +1,34 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_image_loader_eet_cflags@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+if BUILD_LOADER_EET
+if !EVAS_STATIC_BUILD_EET
+
+pkgdir = $(libdir)/evas/modules/savers/eet/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = evas_image_save_eet.c
+
+module_la_LIBADD = @EINA_LIBS@ @evas_image_loader_eet_libs@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_saver_eet.la
+
+libevas_saver_eet_la_SOURCES = evas_image_save_eet.c
+libevas_saver_eet_la_LIBADD = @evas_image_loader_eet_libs@
+
+endif
+endif
diff --git a/src/modules/savers/eet/evas_image_save_eet.c b/src/modules/savers/eet/evas_image_save_eet.c
new file mode 100644 (file)
index 0000000..cbb346e
--- /dev/null
@@ -0,0 +1,83 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"  /* so that EAPI in Eet.h is correctly defined */
+#endif
+
+#include <Eet.h>
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+static int evas_image_save_file_eet(RGBA_Image *im, const char *file, const char *key, int quality, int compress);
+
+static Evas_Image_Save_Func evas_image_save_eet_func =
+{
+   evas_image_save_file_eet
+};
+
+static int
+evas_image_save_file_eet(RGBA_Image *im, const char *file, const char *key, int quality, int compress)
+{
+   Eet_File            *ef;
+   int alpha = 0, lossy = 0, ok = 0;
+   DATA32   *data;
+
+   if (!im || !im->image.data || !file)
+      return 0;
+
+   ef = eet_open((char *)file, EET_FILE_MODE_READ_WRITE);
+   if (!ef) ef = eet_open((char *)file, EET_FILE_MODE_WRITE);
+   if (!ef) return 0;
+   if ((quality <= 100) || (compress < 0)) lossy = 1;
+   if (im->cache_entry.flags.alpha) alpha = 1;
+//   if (alpha)
+//     {
+//       data = malloc(im->image->w * im->image->h * sizeof(DATA32));
+//       if (!data)
+//      {
+//        eet_close(ef);
+//        return 0;
+//      }
+//       memcpy(data, im->image->data, im->image->w * im->image->h * sizeof(DATA32));
+//       evas_common_convert_argb_unpremul(data, im->image->w * im->image->h);
+//     }
+//   else
+       data = im->image.data;
+   ok = eet_data_image_write(ef, (char *)key, data,
+                            im->cache_entry.w, im->cache_entry.h, alpha, compress,
+                            quality, lossy);
+//   if (alpha)
+//     free(data);
+   eet_close(ef);
+   return ok;
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   em->functions = (void *)(&evas_image_save_eet_func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "eet",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_SAVER, image_saver, eet);
+
+#ifndef EVAS_STATIC_BUILD_EET
+EVAS_EINA_MODULE_DEFINE(image_saver, eet);
+#endif
+
diff --git a/src/modules/savers/jpeg/.cvsignore b/src/modules/savers/jpeg/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/savers/jpeg/Makefile.am b/src/modules/savers/jpeg/Makefile.am
new file mode 100644 (file)
index 0000000..63c8fd9
--- /dev/null
@@ -0,0 +1,33 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS= \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_image_loader_jpeg_cflags@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+if BUILD_LOADER_JPEG
+if !EVAS_STATIC_BUILD_JPEG
+
+pkgdir = $(libdir)/evas/modules/savers/jpeg/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = evas_image_save_jpeg.c
+
+module_la_LIBADD = @EINA_LIBS@ @evas_image_loader_jpeg_libs@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_saver_jpeg.la
+libevas_saver_jpeg_la_SOURCES = evas_image_save_jpeg.c
+libevas_saver_jpeg_la_LIBADD = @evas_image_loader_jpeg_libs@
+
+endif
+endif
diff --git a/src/modules/savers/jpeg/evas_image_save_jpeg.c b/src/modules/savers/jpeg/evas_image_save_jpeg.c
new file mode 100644 (file)
index 0000000..1e80965
--- /dev/null
@@ -0,0 +1,145 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+#include <stdio.h>
+#include <jpeglib.h>
+#include <setjmp.h>
+
+static int evas_image_save_file_jpeg(RGBA_Image *im, const char *file, const char *key, int quality, int compress);
+
+static Evas_Image_Save_Func evas_image_save_jpeg_func =
+{
+   evas_image_save_file_jpeg
+};
+
+struct _JPEG_error_mgr
+{
+   struct     jpeg_error_mgr pub;
+   jmp_buf    setjmp_buffer;
+};
+typedef struct _JPEG_error_mgr *emptr;
+
+static void _JPEGFatalErrorHandler(j_common_ptr cinfo);
+static void
+_JPEGFatalErrorHandler(j_common_ptr cinfo)
+{
+   emptr errmgr;
+   
+   errmgr = (emptr) cinfo->err;
+   longjmp(errmgr->setjmp_buffer, 1);
+   return;
+}
+
+static void
+_JPEGErrorHandler(j_common_ptr cinfo __UNUSED__)
+{
+/*    emptr errmgr; */
+   
+/*    errmgr = (emptr) cinfo->err; */
+   return;
+}
+
+static void
+_JPEGErrorHandler2(j_common_ptr cinfo __UNUSED__, int msg_level __UNUSED__)
+{
+/*    emptr errmgr; */
+   
+/*    errmgr = (emptr) cinfo->err; */
+   return;
+}
+
+static int
+save_image_jpeg(RGBA_Image *im, const char *file, int quality)
+{
+   struct _JPEG_error_mgr jerr;
+   struct jpeg_compress_struct cinfo;
+   FILE               *f;
+   DATA8              *buf;
+   DATA32             *ptr;
+   JSAMPROW           *jbuf;
+   int                 y = 0;
+   int                 i, j;
+
+   if (!im || !im->image.data || !file)
+      return 0;
+   
+   buf = alloca(im->cache_entry.w * 3 * sizeof(DATA8));
+   f = fopen(file, "wb");
+   if (!f)
+     {
+       return 0;
+     }
+   jerr.pub.error_exit = _JPEGFatalErrorHandler;
+   jerr.pub.emit_message = _JPEGErrorHandler2;
+   jerr.pub.output_message = _JPEGErrorHandler;
+   cinfo.err = jpeg_std_error(&(jerr.pub));
+   if (sigsetjmp(jerr.setjmp_buffer, 1))
+     {
+       jpeg_destroy_compress(&cinfo);
+       fclose(f);
+       return 0;
+     }
+   jpeg_create_compress(&cinfo);
+   jpeg_stdio_dest(&cinfo, f);
+   cinfo.image_width = im->cache_entry.w;
+   cinfo.image_height = im->cache_entry.h;
+   cinfo.input_components = 3;
+   cinfo.in_color_space = JCS_RGB;
+   jpeg_set_defaults(&cinfo);
+   jpeg_set_quality(&cinfo, quality, TRUE);
+   jpeg_start_compress(&cinfo, TRUE);
+   ptr = im->image.data;
+   while (cinfo.next_scanline < cinfo.image_height)
+     {
+       for (j = 0, i = 0; i < im->cache_entry.w; i++)
+         {
+            buf[j++] = ((*ptr) >> 16) & 0xff;
+            buf[j++] = ((*ptr) >> 8) & 0xff;
+            buf[j++] = ((*ptr)) & 0xff;
+            ptr++;
+         }
+       jbuf = (JSAMPROW *) (&buf);
+       jpeg_write_scanlines(&cinfo, jbuf, 1);
+       y++;
+     }
+   jpeg_finish_compress(&cinfo);
+   jpeg_destroy_compress(&cinfo);
+   fclose(f);
+   return 1;
+}
+
+static int evas_image_save_file_jpeg(RGBA_Image *im, const char *file, const char *key __UNUSED__, int quality, int compress __UNUSED__)
+{
+   return save_image_jpeg(im, file, quality);
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   em->functions = (void *)(&evas_image_save_jpeg_func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "jpeg",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_SAVER, image_saver, jpeg);
+
+#ifndef EVAS_STATIC_BUILD_JPEG
+EVAS_EINA_MODULE_DEFINE(image_saver, jpeg);
+#endif
+
diff --git a/src/modules/savers/png/.cvsignore b/src/modules/savers/png/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/savers/png/Makefile.am b/src/modules/savers/png/Makefile.am
new file mode 100644 (file)
index 0000000..b9d9cd5
--- /dev/null
@@ -0,0 +1,36 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_image_loader_png_cflags@ \
+@EVIL_CFLAGS@ \
+@WIN32_CPPFLAGS@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+if BUILD_LOADER_PNG
+if !EVAS_STATIC_BUILD_PNG
+
+pkgdir = $(libdir)/evas/modules/savers/png/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = evas_image_save_png.c
+
+module_la_LIBADD = @EINA_LIBS@ @evas_image_loader_png_libs@ @EVIL_LIBS@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_saver_png.la
+
+libevas_saver_png_la_SOURCES = evas_image_save_png.c
+libevas_saver_png_la_LIBADD = @evas_image_loader_png_libs@
+
+endif
+endif
diff --git a/src/modules/savers/png/evas_image_save_png.c b/src/modules/savers/png/evas_image_save_png.c
new file mode 100644 (file)
index 0000000..40b6cd6
--- /dev/null
@@ -0,0 +1,190 @@
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <stdio.h>
+#include <png.h>
+#include <setjmp.h>
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#ifdef _WIN32_WCE
+# define E_FOPEN(file, mode) evil_fopen_native((file), (mode))
+# define E_FCLOSE(stream) evil_fclose_native(stream)
+#else
+# define E_FOPEN(file, mode) fopen((file), (mode))
+# define E_FCLOSE(stream) fclose(stream)
+#endif
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+static int evas_image_save_file_png(RGBA_Image *im, const char *file, const char *key, int quality, int compress);
+
+static Evas_Image_Save_Func evas_image_save_png_func =
+{
+   evas_image_save_file_png
+};
+
+static int
+save_image_png(RGBA_Image *im, const char *file, int compress, int interlace)
+{
+   FILE               *f;
+   png_structp         png_ptr;
+   png_infop           info_ptr;
+   DATA32             *ptr, *data = NULL;
+   int                 x, y, j;
+   png_bytep           row_ptr, png_data = NULL;
+   png_color_8         sig_bit;
+   int                 num_passes = 1, pass;
+
+   if (!im || !im->image.data || !file)
+      return 0;
+
+   f = E_FOPEN(file, "wb");
+   if (!f) return 0;
+
+   png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+   if (!png_ptr)
+     goto close_file;
+
+   info_ptr = png_create_info_struct(png_ptr);
+   if (info_ptr == NULL)
+     {
+       png_destroy_write_struct(&png_ptr, NULL);
+       goto close_file;
+     }
+   if (setjmp(png_jmpbuf(png_ptr)))
+     {
+       png_destroy_write_struct(&png_ptr, (png_infopp) & info_ptr);
+       png_destroy_info_struct(png_ptr, (png_infopp) & info_ptr);
+       goto close_file;
+     }
+
+   if (interlace)
+     {
+#ifdef PNG_WRITE_INTERLACING_SUPPORTED
+       png_ptr->interlaced = PNG_INTERLACE_ADAM7;
+       num_passes = png_set_interlace_handling(png_ptr);
+#endif
+     }
+
+   if (im->cache_entry.flags.alpha)
+     {
+       data = malloc(im->cache_entry.w * im->cache_entry.h * sizeof(DATA32));
+       if (!data)
+         {
+           png_destroy_write_struct(&png_ptr, (png_infopp) & info_ptr);
+           png_destroy_info_struct(png_ptr, (png_infopp) & info_ptr);
+           goto close_file;
+         }
+       memcpy(data, im->image.data, im->cache_entry.w * im->cache_entry.h * sizeof(DATA32));
+       evas_common_convert_argb_unpremul(data, im->cache_entry.w * im->cache_entry.h);
+       png_init_io(png_ptr, f);
+        png_set_IHDR(png_ptr, info_ptr, im->cache_entry.w, im->cache_entry.h, 8,
+                    PNG_COLOR_TYPE_RGB_ALPHA, png_ptr->interlaced,
+                    PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
+#ifdef WORDS_BIGENDIAN
+       png_set_swap_alpha(png_ptr);
+#else
+       png_set_bgr(png_ptr);
+#endif
+     }
+   else
+     {
+       data = im->image.data;
+       png_init_io(png_ptr, f);
+       png_set_IHDR(png_ptr, info_ptr, im->cache_entry.w, im->cache_entry.h, 8,
+                    PNG_COLOR_TYPE_RGB, png_ptr->interlaced,
+                    PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
+       png_data = alloca(im->cache_entry.w * 3 * sizeof(char));
+     }
+   sig_bit.red = 8;
+   sig_bit.green = 8;
+   sig_bit.blue = 8;
+   sig_bit.alpha = 8;
+   png_set_sBIT(png_ptr, info_ptr, &sig_bit);
+
+   png_set_compression_level(png_ptr, compress);
+   png_write_info(png_ptr, info_ptr);
+   png_set_shift(png_ptr, &sig_bit);
+   png_set_packing(png_ptr);
+
+   for (pass = 0; pass < num_passes; pass++)
+     {
+       ptr = data;
+
+       for (y = 0; y < im->cache_entry.h; y++)
+         {
+            if (im->cache_entry.flags.alpha)
+              row_ptr = (png_bytep) ptr;
+            else
+              {
+                 for (j = 0, x = 0; x < im->cache_entry.w; x++)
+                   {
+                      png_data[j++] = (ptr[x] >> 16) & 0xff;
+                      png_data[j++] = (ptr[x] >> 8) & 0xff;
+                      png_data[j++] = (ptr[x]) & 0xff;
+                   }
+                 row_ptr = (png_bytep) png_data;
+              }
+            png_write_rows(png_ptr, &row_ptr, 1);
+            ptr += im->cache_entry.w;
+         }
+     }
+   png_write_end(png_ptr, info_ptr);
+   png_destroy_write_struct(&png_ptr, (png_infopp) & info_ptr);
+   png_destroy_info_struct(png_ptr, (png_infopp) & info_ptr);
+
+   if (im->cache_entry.flags.alpha)
+     free(data);
+   E_FCLOSE(f);
+   return 1;
+
+ close_file:
+   E_FCLOSE(f);
+   return 0;
+}
+
+static int evas_image_save_file_png(RGBA_Image *im, const char *file, const char *key __UNUSED__, int quality __UNUSED__, int compress)
+{
+   return save_image_png(im, file, compress, 0);
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   em->functions = (void *)(&evas_image_save_png_func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "png",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_SAVER, image_saver, png);
+
+#ifndef EVAS_STATIC_BUILD_PNG
+EVAS_EINA_MODULE_DEFINE(image_saver, png);
+#endif
+
diff --git a/src/modules/savers/tiff/.cvsignore b/src/modules/savers/tiff/.cvsignore
new file mode 100644 (file)
index 0000000..a51c966
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+*.la
\ No newline at end of file
diff --git a/src/modules/savers/tiff/Makefile.am b/src/modules/savers/tiff/Makefile.am
new file mode 100644 (file)
index 0000000..c754c0b
--- /dev/null
@@ -0,0 +1,34 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+@FREETYPE_CFLAGS@ \
+@EINA_CFLAGS@ \
+@evas_image_loader_tiff_cflags@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+if BUILD_LOADER_TIFF
+if !EVAS_STATIC_BUILD_TIFF
+
+pkgdir = $(libdir)/evas/modules/savers/tiff/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = evas_image_save_tiff.c
+
+module_la_LIBADD = @EINA_LIBS@ @evas_image_loader_tiff_libs@ $(top_builddir)/src/lib/libevas.la
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+else
+
+noinst_LTLIBRARIES = libevas_saver_tiff.la
+
+libevas_saver_tiff_la_SOURCES = evas_image_save_tiff.c
+libevas_saver_tiff_la_LIBADD = @evas_image_loader_tiff_libs@
+
+endif
+endif
diff --git a/src/modules/savers/tiff/evas_image_save_tiff.c b/src/modules/savers/tiff/evas_image_save_tiff.c
new file mode 100644 (file)
index 0000000..8e6f4b3
--- /dev/null
@@ -0,0 +1,139 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+#include <tiffio.h>
+
+static int evas_image_save_file_tiff(RGBA_Image *im, const char *file, const char *key, int quality, int compress);
+
+static Evas_Image_Save_Func evas_image_save_tiff_func =
+{
+   evas_image_save_file_tiff
+};
+
+static int
+save_image_tiff(RGBA_Image *im, const char *file, int compress __UNUSED__, int interlace __UNUSED__)
+{
+   TIFF               *tif = NULL;
+   uint8              *buf = NULL;
+   DATA32              pixel;
+   DATA32             *data;
+   uint32              x, y;
+   uint8               r, g, b, a = 0;
+   int                 i = 0;
+   int                 has_alpha;
+
+   if (!im || !im->image.data || !file)
+      return 0;
+
+   has_alpha = im->cache_entry.flags.alpha;
+   data = im->image.data;
+
+   tif = TIFFOpen(file, "w");
+   if (!tif)
+      return 0;
+
+   /* None of the TIFFSetFields are checked for errors, but since they */
+   /* shouldn't fail, this shouldn't be a problem */
+
+   TIFFSetField(tif, TIFFTAG_IMAGELENGTH, im->cache_entry.h);
+   TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, im->cache_entry.w);
+   TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
+   TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
+   TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
+   TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_NONE);
+
+   /* By default uses patent-free use COMPRESSION_DEFLATE,
+    * another lossless compression technique */
+   TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE);
+   
+   if (has_alpha)
+     {
+        uint16 extras[] = { EXTRASAMPLE_ASSOCALPHA };
+        TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 4);
+        TIFFSetField(tif, TIFFTAG_EXTRASAMPLES, 1, extras);
+     }
+   else
+     {
+        TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3);
+     }
+
+   TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
+   TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, 0));
+
+   buf = (uint8 *) _TIFFmalloc(TIFFScanlineSize(tif));
+   if (!buf)
+     {
+        TIFFClose(tif);
+        return 0;
+     }
+
+   for (y = 0; y < im->cache_entry.h; y++)
+     {
+        i = 0;
+        for (x = 0; x < im->cache_entry.w; x++)
+          {
+             pixel = data[(y * im->cache_entry.w) + x];
+
+             r = (pixel >> 16) & 0xff;
+             g = (pixel >> 8) & 0xff;
+             b = pixel & 0xff;
+             if (has_alpha)
+                a = (pixel >> 24) & 0xff;
+
+             /* This might be endian dependent */
+             buf[i++] = r;
+             buf[i++] = g;
+             buf[i++] = b;
+             if (has_alpha)
+                buf[i++] = a;
+          }
+
+        if (!TIFFWriteScanline(tif, buf, y, 0))
+          {
+             _TIFFfree(buf);
+             TIFFClose(tif);
+             return 0;
+          }
+     }
+
+   _TIFFfree(buf);
+   TIFFClose(tif);
+
+   return 1;
+}
+
+static int evas_image_save_file_tiff(RGBA_Image *im, const char *file, const char *key __UNUSED__, int quality __UNUSED__, int compress)
+{
+   return save_image_tiff(im, file, compress, 0);
+}
+
+static int
+module_open(Evas_Module *em)
+{
+   if (!em) return 0;
+   em->functions = (void *)(&evas_image_save_tiff_func);
+   return 1;
+}
+
+static void
+module_close(Evas_Module *em)
+{
+}
+
+static Evas_Module_Api evas_modapi =
+{
+   EVAS_MODULE_API_VERSION,
+   "tiff",
+   "none",
+   {
+     module_open,
+     module_close
+   }
+};
+
+EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_SAVER, image_saver, tiff);
+
+#ifndef EVAS_STATIC_BUILD_TIFF
+EVAS_EINA_MODULE_DEFINE(image_saver, tiff);
+#endif
+
diff --git a/win32/common/config.h b/win32/common/config.h
new file mode 100644 (file)
index 0000000..3339c25
--- /dev/null
@@ -0,0 +1,326 @@
+/* config.h.  Generated from config.h.in by configure.  */\r
+/* config.h.in.  Generated from configure.in by autoheader.  */\r
+\r
+/* Build Altivec Code */\r
+/* #undef BUILD_ALTIVEC */\r
+\r
+/* Build plain C code */\r
+#define BUILD_C 1\r
+\r
+/* 16bpp BGR 565 Converter Support */\r
+#define BUILD_CONVERT_16_BGR_565 1\r
+\r
+/* 16bpp RGB 444 Converter Support */\r
+#define BUILD_CONVERT_16_RGB_444 1\r
+\r
+/* 16bpp 565 (444 ipaq) Converter Support */\r
+#define BUILD_CONVERT_16_RGB_454645 1\r
+\r
+/* 16bpp RGB 555 Converter Support */\r
+#define BUILD_CONVERT_16_RGB_555 1\r
+\r
+/* 16bpp RGB 565 Converter Support */\r
+#define BUILD_CONVERT_16_RGB_565 1\r
+\r
+/* 16bpp RGB Rotation 0 Converter Support */\r
+#define BUILD_CONVERT_16_RGB_ROT0 1\r
+\r
+/* 16bpp RGB Rotation 180 Converter Support */\r
+#define BUILD_CONVERT_16_RGB_ROT180 1\r
+\r
+/* 16bpp RGB Rotation 270 Converter Support */\r
+#define BUILD_CONVERT_16_RGB_ROT270 1\r
+\r
+/* 16bpp RGB Rotation 90 Converter Support */\r
+#define BUILD_CONVERT_16_RGB_ROT90 1\r
+\r
+/* 24bpp BGR 888 Converter Support */\r
+#define BUILD_CONVERT_24_BGR_888 1\r
+\r
+/* 24bpp RGB 888 Converter Support */\r
+#define BUILD_CONVERT_24_RGB_888 1\r
+\r
+/* 32bpp BGRX 8888 Converter Support */\r
+#define BUILD_CONVERT_32_BGRX_8888 1\r
+\r
+/* 32bpp BGR 8888 Converter Support */\r
+#define BUILD_CONVERT_32_BGR_8888 1\r
+\r
+/* 32bpp RGBX 8888 Converter Support */\r
+#define BUILD_CONVERT_32_RGBX_8888 1\r
+\r
+/* 32bpp RGB 8888 Converter Support */\r
+#define BUILD_CONVERT_32_RGB_8888 1\r
+\r
+/* 32bpp RGB Rotation 0 Converter Support */\r
+#define BUILD_CONVERT_32_RGB_ROT0 1\r
+\r
+/* 32bpp RGB Rotation 180 Converter Support */\r
+#define BUILD_CONVERT_32_RGB_ROT180 1\r
+\r
+/* 32bpp RGB Rotation 270 Converter Support */\r
+#define BUILD_CONVERT_32_RGB_ROT270 1\r
+\r
+/* 32bpp RGB Rotation 90 Converter Support */\r
+#define BUILD_CONVERT_32_RGB_ROT90 1\r
+\r
+/* 8bpp RGB 111 Converter Support */\r
+#define BUILD_CONVERT_8_RGB_111 1\r
+\r
+/* 8bpp RGB 121 Converter Support */\r
+#define BUILD_CONVERT_8_RGB_121 1\r
+\r
+/* 8bpp RGB 221 Converter Support */\r
+#define BUILD_CONVERT_8_RGB_221 1\r
+\r
+/* 8bpp RGB 222 Converter Support */\r
+#define BUILD_CONVERT_8_RGB_222 1\r
+\r
+/* 8bpp RGB 232 Converter Support */\r
+#define BUILD_CONVERT_8_RGB_232 1\r
+\r
+/* 8bpp RGB 332 Converter Support */\r
+#define BUILD_CONVERT_8_RGB_332 1\r
+\r
+/* 8bpp RGB 666 Converter Support */\r
+#define BUILD_CONVERT_8_RGB_666 1\r
+\r
+/* YUV Converter Support */\r
+#define BUILD_CONVERT_YUV 1\r
+\r
+/* Buffer Rendering Backend */\r
+#define BUILD_ENGINE_BUFFER 1\r
+\r
+/* Generic Cairo Rendering Support */\r
+/* #undef BUILD_ENGINE_CAIRO_COMMON */\r
+\r
+/* Cairo X11 Rendering Backend */\r
+/* #undef BUILD_ENGINE_CAIRO_X11 */\r
+\r
+/* Direct3D Rendering Backend */\r
+#define BUILD_ENGINE_DIRECT3D 1\r
+\r
+/* DirectFB Rendering Backend */\r
+/* #undef BUILD_ENGINE_DIRECTFB */\r
+\r
+/* Linux FB Rendering Backend */\r
+/* #undef BUILD_ENGINE_FB */\r
+\r
+/* Glitz X11 Rendering Backend */\r
+/* #undef BUILD_ENGINE_GLITZ_X11 */\r
+\r
+/* Generic OpenGL Rendering Support */\r
+#define BUILD_ENGINE_GL_COMMON 1\r
+\r
+/* OpenGL Glew Rendering Backend */\r
+#define BUILD_ENGINE_GL_GLEW 1\r
+\r
+/* OpenGL X11 Rendering Backend */\r
+/* #undef BUILD_ENGINE_GL_X11 */\r
+\r
+/* SDL Rendering Backend */\r
+#define BUILD_ENGINE_SDL 1\r
+\r
+/* 16bit Software DirectDraw Rendering Backend */\r
+/* #undef BUILD_ENGINE_SOFTWARE_16_DDRAW */\r
+\r
+/* Software 16bit X11 Rendering Backend */\r
+/* #undef BUILD_ENGINE_SOFTWARE_16_X11 */\r
+\r
+/* Software DirectDraw Rendering Backend */\r
+/* #undef BUILD_ENGINE_SOFTWARE_DDRAW */\r
+\r
+/* Qtopia Rendering Backend */\r
+/* #undef BUILD_ENGINE_SOFTWARE_QTOPIA */\r
+\r
+/* Software X11 Rendering Backend */\r
+/* #undef BUILD_ENGINE_SOFTWARE_X11 */\r
+\r
+/* Software XCB Rendering Backend */\r
+/* #undef BUILD_ENGINE_SOFTWARE_XCB */\r
+\r
+/* XRender X11 Rendering Backend */\r
+/* #undef BUILD_ENGINE_XRENDER_X11 */\r
+\r
+/* Xrender XCB Rendering Backend */\r
+/* #undef BUILD_ENGINE_XRENDER_XCB */\r
+\r
+/* EET Font Loader Support */\r
+#define BUILD_FONT_LOADER_EET 1\r
+\r
+/* EDB Image Loader Support */\r
+/* #undef BUILD_LOADER_EDB */\r
+\r
+/* EET Image Loader Support */\r
+#define BUILD_LOADER_EET 1\r
+\r
+/* GIF Image Loader Support */\r
+#define BUILD_LOADER_GIF 1\r
+\r
+/* JPEG Image Loader Support */\r
+#define BUILD_LOADER_JPEG 1\r
+\r
+/* TIFF Image Loader Support */\r
+#define BUILD_LOADER_TIFF 1\r
+\r
+/* Build MMX Code */\r
+/* #define BUILD_MMX 1 */\r
+\r
+/* No Dither Mask Support */\r
+/* #undef BUILD_NO_DITHER_MASK */\r
+\r
+/* Build Threaded Rendering */\r
+/* #undef BUILD_PTHREAD */\r
+\r
+/* Sampling Scaler Support */\r
+#define BUILD_SCALE_SAMPLE 1\r
+\r
+/* Smooth Scaler Support */\r
+#define BUILD_SCALE_SMOOTH 1\r
+\r
+/* Small Dither Mask Support */\r
+/* #undef BUILD_SMALL_DITHER_MASK */\r
+\r
+/* Build SSE Code */\r
+/* #define BUILD_SSE 1 */\r
+\r
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP\r
+   systems. This function is required for `alloca.c' support on those systems.\r
+   */\r
+/* #undef CRAY_STACKSEG_END */\r
+\r
+/* Define to 1 if using `alloca.c'. */\r
+/* #undef C_ALLOCA */\r
+\r
+/* Define to mention that evas is built */\r
+#define EFL_EVAS_BUILD 1\r
+\r
+/* Define to 1 if you have `alloca', as a function or macro. */\r
+#define HAVE_ALLOCA 1\r
+\r
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).\r
+   */\r
+/* #undef HAVE_ALLOCA_H */\r
+\r
+/* Have altivec.h header file */\r
+/* #undef HAVE_ALTIVEC_H */\r
+\r
+/* Define to 1 if you have the <d3d9.h> header file. */\r
+#define HAVE_D3D9_H 1\r
+\r
+/* Define to 1 if you have the <d3dx9.h> header file. */\r
+/* #undef HAVE_D3DX9_H */\r
+\r
+/* Define to 1 if you have the `dladdr' function. */\r
+#define HAVE_DLADDR 1\r
+\r
+/* Define to 1 if you have the <dlfcn.h> header file. */\r
+#define HAVE_DLFCN_H 1\r
+\r
+/* Define to 1 if you have the `dlopen' function. */\r
+/* #undef HAVE_DLOPEN */\r
+\r
+/* Set to 1 if evil package is installed */\r
+#define HAVE_EVIL 1\r
+\r
+/* Define to 1 if you have the `fnmatch' function. */\r
+/* #undef HAVE_FNMATCH */\r
+\r
+/* have fontconfig searching capabilities */\r
+/* #define HAVE_FONTCONFIG 1 */\r
+\r
+/* Define to 1 if you have the <GL/glew.h> header file. */\r
+#define HAVE_GL_GLEW_H 1\r
+\r
+/* Define to 1 if you have the <GL/glu.h> header file. */\r
+#define HAVE_GL_GLU_H 1\r
+\r
+/* Define to 1 if you have the <GL/gl.h> header file. */\r
+#define HAVE_GL_GL_H 1\r
+\r
+/* Define to 1 if you have the <inttypes.h> header file. */\r
+#define HAVE_INTTYPES_H 1\r
+\r
+/* Define to 1 if you have the <memory.h> header file. */\r
+#define HAVE_MEMORY_H 1\r
+\r
+/* Define to 1 if you have the <pthread.h> header file. */\r
+/* #undef HAVE_PTHREAD_H */\r
+\r
+/* Define to 1 if you have the <sched.h> header file. */\r
+/* #undef HAVE_SCHED_H */\r
+\r
+/* Define to 1 if you have the <stdint.h> header file. */\r
+#define HAVE_STDINT_H 1\r
+\r
+/* Define to 1 if you have the <stdlib.h> header file. */\r
+#define HAVE_STDLIB_H 1\r
+\r
+/* Define to 1 if you have the <strings.h> header file. */\r
+#define HAVE_STRINGS_H 1\r
+\r
+/* Define to 1 if you have the <string.h> header file. */\r
+#define HAVE_STRING_H 1\r
+\r
+/* Define to 1 if you have the <sys/stat.h> header file. */\r
+#define HAVE_SYS_STAT_H 1\r
+\r
+/* Define to 1 if you have the <sys/types.h> header file. */\r
+#define HAVE_SYS_TYPES_H 1\r
+\r
+/* Define to 1 if you have the <unistd.h> header file. */\r
+#define HAVE_UNISTD_H 1\r
+\r
+/* Valgrind support */\r
+/* #undef HAVE_VALGRIND */\r
+\r
+/* Define to 1 if you have the <X11/extensions/Xrender.h> header file. */\r
+/* #undef HAVE_X11_EXTENSIONS_XRENDER_H */\r
+\r
+/* Define to 1 if you have the <X11/X.h> header file. */\r
+/* #undef HAVE_X11_X_H */\r
+\r
+/* "Module architecture" */\r
+#define MODULE_ARCH "mingw32-i686"\r
+\r
+/* Name of package */\r
+#define PACKAGE "evas"\r
+\r
+/* Define to the address where bug reports for this package should be sent. */\r
+#define PACKAGE_BUGREPORT "enlightenment-devel@lists.sourceforge.net"\r
+\r
+/* Define to the full name of this package. */\r
+#define PACKAGE_NAME "evas"\r
+\r
+/* Define to the full name and version of this package. */\r
+#define PACKAGE_STRING "evas 0.9.9.042"\r
+\r
+/* Define to the one symbol short name of this package. */\r
+#define PACKAGE_TARNAME "evas"\r
+\r
+/* Define to the version of this package. */\r
+#define PACKAGE_VERSION "0.9.9.042"\r
+\r
+/* If using the C implementation of alloca, define if you know the\r
+   direction of stack growth for your system; otherwise it will be\r
+   automatically deduced at runtime.\r
+       STACK_DIRECTION > 0 => grows toward higher addresses\r
+       STACK_DIRECTION < 0 => grows toward lower addresses\r
+       STACK_DIRECTION = 0 => direction of growth unknown */\r
+/* #undef STACK_DIRECTION */\r
+\r
+/* Define to 1 if you have the ANSI C header files. */\r
+#define STDC_HEADERS 1\r
+\r
+/* Version number of package */\r
+#define VERSION "0.9.9.042"\r
+\r
+/* Define to 1 if your processor stores words with the most significant byte\r
+   first (like Motorola and SPARC, unlike Intel and VAX). */\r
+/* #undef WORDS_BIGENDIAN */\r
+\r
+/* Define to 1 if the X Window System is missing or not being used. */\r
+#define X_DISPLAY_MISSING 1\r
+\r
+/* Define to empty if `const' does not conform to ANSI C. */\r
+/* #undef const */\r
diff --git a/win32/patch/evas.diff b/win32/patch/evas.diff
new file mode 100644 (file)
index 0000000..e827ce3
--- /dev/null
@@ -0,0 +1,70 @@
+--- ../../src/lib/include/evas_common.h        2010-04-15 17:50:07 +0000
++++ ../../src/lib/include/evas_common_new.h    2010-04-15 17:49:51 +0000
+@@ -312,10 +312,10 @@
\r
+ /*****************************************************************************/\r
\r
+-#define UNROLL2(op...) op op\r
+-#define UNROLL4(op...) UNROLL2(op) UNROLL2(op)\r
+-#define UNROLL8(op...) UNROLL4(op) UNROLL4(op)\r
+-#define UNROLL16(op...) UNROLL8(op) UNROLL8(op)\r
++#define UNROLL2(op) op op\r
++#define UNROLL4(op) UNROLL2(op) UNROLL2(op)\r
++#define UNROLL8(op) UNROLL4(op) UNROLL4(op)\r
++#define UNROLL16(op) UNROLL8(op) UNROLL8(op)\r
\r
+ #define UNROLL8_PLD_WHILE(start, size, end, op)         \\r
+     pld(start, 0);                                      \\r
+@@ -726,7 +726,9 @@
+    } image;\r
\r
+    struct {\r
++#ifdef BUILD_PTHREAD\r
+       LK(lock);\r
++#endif\r
+       Eina_List *list;\r
+       unsigned long long orig_usage;\r
+       unsigned long long usage_count;\r
+@@ -921,7 +923,9 @@
+    int references;\r
+    Fash_Int *fash;\r
+    unsigned char sizeok : 1;\r
++#ifdef BUILD_PTHREAD\r
+    LK(lock);\r
++#endif\r
+ };\r
\r
+ struct _RGBA_Font_Int\r
+@@ -938,7 +942,9 @@
\r
+ //   Eina_Hash       *glyphs;\r
\r
++#ifdef BUILD_PTHREAD\r
+    LK(ft_mutex);\r
++#endif\r
\r
+    Eina_Hash       *kerning;\r
+ //   Eina_Hash       *indexes;\r
+--- ../../src/lib/file/evas_module.h   2010-04-15 17:40:42 +0000
++++ ../../src/lib/file/evas_module_new.h       2010-04-15 17:40:21 +0000
+@@ -47,7 +47,9 @@
+    int           ref; /* how many refs */\r
+    int           last_used; /* the cycle count when it was last used */\r
\r
++#ifdef BUILD_PTHREAD\r
+    LK(lock);\r
++#endif\r
\r
+    unsigned char      loaded : 1;\r
+ };\r
+--- ../../src/lib/canvas/evas_render.c 2010-04-15 17:42:18 +0000
++++ ../../src/lib/canvas/evas_render_new.c     2010-04-15 17:41:46 +0000
+@@ -34,7 +34,7 @@
+       rend_dbg(__tmpbuf); \\r
+    }\r
+ #else\r
+-#define RD(args...)\r
++#define RD(args,...)\r
+ #define RDI(x)\r
+ #endif\r
\r
diff --git a/win32/set_env.bat b/win32/set_env.bat
new file mode 100644 (file)
index 0000000..48d1e19
--- /dev/null
@@ -0,0 +1,51 @@
+@echo off\r
+\r
+rem Set external libraries directory.\r
+set EXT_DIR=%cd%\..\..\..\extern\r
+\r
+if not exist %EXT_DIR% (\r
+       set EXT_DIR=\r
+       echo ERROR: External libs dir is not set.\r
+       pause\r
+       goto END\r
+)\r
+\r
+rem Add installation directory pathes.\r
+set INCLUDE=%EXT_DIR%\include;%EXT_DIR%\include\freetype2;%INCLUDE%\r
+set LIB=%EXT_DIR%\lib;%LIB%\r
+\r
+rem Add Evas lib path\r
+set EvasPath=%cd%\..\src\lib\r
+set INCLUDE=%EvasPath%\..\modules\engines\gl_common;%EvasPath%;%EvasPath%\include;%EvasPath%\cserve;%EvasPath%\file;%INCLUDE%\r
+\r
+if "%DXSDK_DIR%" == "" (\r
+       echo WARNING: Microsoft DirectX SDK is not installed.\r
+       pause\r
+       goto END\r
+)\r
+\r
+rem Add DirectX includes and libraries dirs.\r
+set INCLUDE="%DXSDK_DIR%Include";%INCLUDE%\r
+set LIB="%DXSDK_DIR%Lib\x86";%LIB%\r
+\r
+rem Add Evil lib path\r
+set EvilInclude=%cd%\..\..\evil\src\lib\r
+set EvilCommon=%cd%\..\..\evil\win32\common\r
+set EvilOut=%cd%\..\..\evil\win32\%PROJECT_TYPE%\out\r
+\r
+rem Add Eet lib path\r
+set EetInclude=%cd%\..\..\eet\src\lib\r
+set EetOut=%cd%\..\..\eet\win32\%PROJECT_TYPE%\out\r
+\r
+rem Add Eina lib path\r
+set EinaInclude=%cd%\..\..\eina\src\include\r
+set EinaCommon=%cd%\..\..\eina\win32\common\r
+set EinaOut=%cd%\..\..\eina\win32\%PROJECT_TYPE%\out\r
+\r
+\r
+set INCLUDE=%EvilCommon%;%cd%\common;%EetInclude%;%EvilInclude%;%EvilInclude%\dlfcn;%EvilInclude%\mman;%INCLUDE%\r
+set INCLUDE=%EinaCommon%;%EinaInclude%;%INCLUDE%\r
+set LIB=%EinaOut%;%EetOut%;%EvilOut%;%LIB%\r
+\r
+\r
+:END\r
diff --git a/win32/vs8/engine_buffer.vcproj b/win32/vs8/engine_buffer.vcproj
new file mode 100644 (file)
index 0000000..b0acbaf
--- /dev/null
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8,00"\r
+       Name="engine_buffer"\r
+       ProjectGUID="{FF8981EF-618E-45B9-9F03-738D7E2914AF}"\r
+       RootNamespace="engine_buffer"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\engines\buffer\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\engines\buffer\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\buffer\evas_engine.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\buffer\Evas_Engine_Buffer.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\buffer\evas_engine.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\buffer\evas_outbuf.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/engine_direct3d.vcproj b/win32/vs8/engine_direct3d.vcproj
new file mode 100644 (file)
index 0000000..48556bb
--- /dev/null
@@ -0,0 +1,323 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8,00"\r
+       Name="engine_direct3d"\r
+       ProjectGUID="{689B4F2B-666D-439F-9BF3-1203D813DE3F}"\r
+       RootNamespace="engine_direct3d"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;BUILD_C;__CRT_INLINE=__inline;inline=__inline;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib d3d9.lib d3dx9.lib"\r
+                               OutputFile="$(OutDir)\engines\direct3d\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILD_C;__CRT_INLINE=__inline;inline=__inline;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib d3d9.lib d3dx9.lib"\r
+                               OutputFile="$(OutDir)\engines\direct3d\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\array.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_context.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_device.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_image_cache.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_object.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_object_font.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_object_image.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_object_line.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_object_rect.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_scene.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_shader_pack.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_vertex_buffer_cache.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_engine.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\Evas_Engine_Direct3D.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\ref.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_context.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_device.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_image_cache.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_main.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_object.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_object_font.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_object_image.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_object_line.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_object_rect.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_scene.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_shader_pack.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_direct3d_vertex_buffer_cache.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\direct3d\evas_engine.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/engine_gl_glew.vcproj b/win32/vs8/engine_gl_glew.vcproj
new file mode 100644 (file)
index 0000000..690393b
--- /dev/null
@@ -0,0 +1,275 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8,00"\r
+       Name="engine_gl_glew"\r
+       ProjectGUID="{38C9AD78-8461-4A33-A31B-7DA62AB3BBE9}"\r
+       RootNamespace="engine_gl_glew"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib glew32.lib opengl32.lib"\r
+                               OutputFile="$(OutDir)\engines\gl_glew\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib glew32.lib opengl32.lib"\r
+                               OutputFile="$(OutDir)\engines\gl_glew\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\gl_glew\evas_engine.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\gl_glew\Evas_Engine_GL_Glew.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\gl_glew\evas_engine.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\gl_glew\evas_glew_main.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Common"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\gl_common\evas_gl_common.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\gl_common\evas_gl_context.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\gl_common\evas_gl_font.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\gl_common\evas_gl_gradient.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\gl_common\evas_gl_image.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\gl_common\evas_gl_line.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\gl_common\evas_gl_misc.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\gl_common\evas_gl_polygon.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\gl_common\evas_gl_private.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\gl_common\evas_gl_rectangle.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\gl_common\evas_gl_texture.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/engine_software_ddraw.vcproj b/win32/vs8/engine_software_ddraw.vcproj
new file mode 100644 (file)
index 0000000..29e43a0
--- /dev/null
@@ -0,0 +1,235 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8,00"\r
+       Name="engine_software_ddraw"\r
+       ProjectGUID="{C71D20DF-3BAB-4BFF-80D4-508E7548358B}"\r
+       RootNamespace="engine_software_ddraw"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib ddraw.lib"\r
+                               OutputFile="$(OutDir)\engines\software_ddraw\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib ddraw.lib"\r
+                               OutputFile="$(OutDir)\engines\software_ddraw\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_ddraw\evas_engine.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_ddraw\Evas_Engine_Software_DDraw.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_ddraw\evas_ddraw_buffer.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_ddraw\evas_ddraw_main.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_ddraw\evas_engine.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_ddraw\evas_outbuf.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/engine_software_gdi.vcproj b/win32/vs8/engine_software_gdi.vcproj
new file mode 100644 (file)
index 0000000..1fae64f
--- /dev/null
@@ -0,0 +1,235 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8,00"\r
+       Name="engine_software_gdi"\r
+       ProjectGUID="{3367A64F-A08E-4F27-8303-54A3BBB01D5A}"\r
+       RootNamespace="engine_software_gdi"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib gdi32.lib user32.lib"\r
+                               OutputFile="$(OutDir)\engines\software_gdi\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib gdi32.lib user32.lib"\r
+                               OutputFile="$(OutDir)\engines\software_gdi\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_gdi\evas_engine.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_gdi\Evas_Engine_Software_GDI.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_gdi\evas_engine.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_gdi\evas_outbuf.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_gdi\evas_gdi_buffer.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_gdi\evas_gdi_main.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/engine_software_generic.vcproj b/win32/vs8/engine_software_generic.vcproj
new file mode 100644 (file)
index 0000000..f6bd243
--- /dev/null
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8,00"\r
+       Name="engine_software_generic"\r
+       ProjectGUID="{1E24C1AF-62F2-4EC0-AD94-7363C0534E36}"\r
+       RootNamespace="engine_software_generic"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\engines\software_generic\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\engines\software_generic\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_generic\evas_engine.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/evas.sln b/win32/vs8/evas.sln
new file mode 100644 (file)
index 0000000..90a1801
--- /dev/null
@@ -0,0 +1,47 @@
+\r
+Microsoft Visual Studio Solution File, Format Version 9.00\r
+# Visual Studio 2005\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libevas", "libevas.vcproj", "{689B4F2B-666D-439F-9BF3-1203D813DE3F}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine_buffer", "engine_buffer.vcproj", "{FF8981EF-618E-45B9-9F03-738D7E2914AF}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F} = {689B4F2B-666D-439F-9BF3-1203D813DE3F}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine_software_gdi", "engine_software_gdi.vcproj", "{3367A64F-A08E-4F27-8303-54A3BBB01D5A}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {1E24C1AF-62F2-4EC0-AD94-7363C0534E36} = {1E24C1AF-62F2-4EC0-AD94-7363C0534E36}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine_software_generic", "engine_software_generic.vcproj", "{1E24C1AF-62F2-4EC0-AD94-7363C0534E36}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F} = {689B4F2B-666D-439F-9BF3-1203D813DE3F}\r
+       EndProjectSection\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|Win32 = Debug|Win32\r
+               Release|Win32 = Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F}.Debug|Win32.Build.0 = Debug|Win32\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F}.Release|Win32.ActiveCfg = Release|Win32\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F}.Release|Win32.Build.0 = Release|Win32\r
+               {FF8981EF-618E-45B9-9F03-738D7E2914AF}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {FF8981EF-618E-45B9-9F03-738D7E2914AF}.Debug|Win32.Build.0 = Debug|Win32\r
+               {FF8981EF-618E-45B9-9F03-738D7E2914AF}.Release|Win32.ActiveCfg = Release|Win32\r
+               {FF8981EF-618E-45B9-9F03-738D7E2914AF}.Release|Win32.Build.0 = Release|Win32\r
+               {3367A64F-A08E-4F27-8303-54A3BBB01D5A}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {3367A64F-A08E-4F27-8303-54A3BBB01D5A}.Debug|Win32.Build.0 = Debug|Win32\r
+               {3367A64F-A08E-4F27-8303-54A3BBB01D5A}.Release|Win32.ActiveCfg = Release|Win32\r
+               {3367A64F-A08E-4F27-8303-54A3BBB01D5A}.Release|Win32.Build.0 = Release|Win32\r
+               {1E24C1AF-62F2-4EC0-AD94-7363C0534E36}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {1E24C1AF-62F2-4EC0-AD94-7363C0534E36}.Debug|Win32.Build.0 = Debug|Win32\r
+               {1E24C1AF-62F2-4EC0-AD94-7363C0534E36}.Release|Win32.ActiveCfg = Release|Win32\r
+               {1E24C1AF-62F2-4EC0-AD94-7363C0534E36}.Release|Win32.Build.0 = Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/win32/vs8/libevas.vcproj b/win32/vs8/libevas.vcproj
new file mode 100644 (file)
index 0000000..d3b0f75
--- /dev/null
@@ -0,0 +1,969 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8,00"\r
+       Name="libevas"\r
+       ProjectGUID="{689B4F2B-666D-439F-9BF3-1203D813DE3F}"\r
+       RootNamespace="libevas"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;_USE_MATH_DEFINES;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libeet.lib libevil.lib libdl.lib freetype.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\libevas.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;_USE_MATH_DEFINES;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libeet.lib libevil.lib libdl.lib freetype.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\libevas.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="cache"\r
+                       >\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                               >\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\cache\evas_cache_engine_image.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\cache\evas_cache_image.c"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="libevas"\r
+                       >\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                               UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\Evas.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_blend_ops.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_cairo_common.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_common.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_common_soft16.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_macros.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_mmx.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_options.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_private.h"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Resource Files"\r
+                               Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                               UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                               >\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                               UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\main.c"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="canvas"\r
+                       >\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               >\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_async_events.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_callbacks.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_clip.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_data.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_events.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_focus.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_font_dir.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_key.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_key_grab.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_layer.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_map.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_name.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_gradient.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_image.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_inform.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_intercept.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_line.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_polygon.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_rectangle.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_smart.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_text.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_textblock.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_rectangle.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_render.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_smart.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_stack.c"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="file"\r
+                       >\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               >\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\file\evas_module.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\file\evas_path.c"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="imaging"\r
+                       >\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               >\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\imaging\evas_imaging.c"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="engines"\r
+                       >\r
+                       <Filter\r
+                               Name="common"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_blend_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_blit_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_color.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_colorspace.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_gry_1.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_gry_4.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_gry_8.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_rgb_16.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_rgb_24.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_rgb_32.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_rgb_8.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_yuv.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_cpu.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_draw_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_font_draw.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_font_load.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_font_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_font_query.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient2_linear.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient2_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient2_radial.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient_angular.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient_linear.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient_radial.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient_rectangular.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient_sinusoidal.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_image_data.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_image_fill_main.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_image_load.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_image_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_image_save.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_image_scalecache.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_line_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_map_image.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_op_add_main_.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_op_blend_main_.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_op_copy_main_.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_op_mask_main_.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_op_mul_main_.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_op_sub_main_.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_pipe.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_polygon_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_rectangle_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_regionbuf.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_sample.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth_scaler.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth_scaler_down.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth_scaler_downx.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth_scaler_downx_downy.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth_scaler_downy.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth_scaler_noscale.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth_scaler_up.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_span.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_tiler.c"\r
+                                       >\r
+                               </File>\r
+                               <Filter\r
+                                       Name="evas_op_add"\r
+                                       >\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="evas_op_blend"\r
+                                       >\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="evas_op_copy"\r
+                                       >\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="evas_op_mask"\r
+                                       >\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="evas_op_mul"\r
+                                       >\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="evas_op_sub"\r
+                                       >\r
+                               </Filter>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="common_16"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_dither_mask.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_font.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_image_scaled_sampled.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_image_unscaled.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_line.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_main.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_polygon.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_rectangle.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_scanline_blend.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_scanline_fill.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/loader_eet.vcproj b/win32/vs8/loader_eet.vcproj
new file mode 100644 (file)
index 0000000..686bcca
--- /dev/null
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8,00"\r
+       Name="loader_eet"\r
+       ProjectGUID="{EB7D2089-3FDB-40F4-B90C-716752FFF786}"\r
+       RootNamespace="loader_eet"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeet.lib"\r
+                               OutputFile="$(OutDir)\loaders\eet\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeet.lib"\r
+                               OutputFile="$(OutDir)\loaders\eet\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\loaders\eet\evas_image_load_eet.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/loader_gif.vcproj b/win32/vs8/loader_gif.vcproj
new file mode 100644 (file)
index 0000000..7be2861
--- /dev/null
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8,00"\r
+       Name="loader_gif"\r
+       ProjectGUID="{C3534833-592F-4450-911E-9C35E205D488}"\r
+       RootNamespace="loader_gif"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libungif.lib"\r
+                               OutputFile="$(OutDir)\loaders\gif\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libungif.lib"\r
+                               OutputFile="$(OutDir)\loaders\gif\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\loaders\gif\evas_image_load_gif.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/loader_jpeg.vcproj b/win32/vs8/loader_jpeg.vcproj
new file mode 100644 (file)
index 0000000..581e2ce
--- /dev/null
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8,00"\r
+       Name="loader_jpeg"\r
+       ProjectGUID="{EAC1F90F-87EC-4E3F-8924-0F67FA2302CC}"\r
+       RootNamespace="loader_jpeg"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib jpeg.lib"\r
+                               OutputFile="$(OutDir)\loaders\jpeg\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib jpeg.lib"\r
+                               OutputFile="$(OutDir)\loaders\jpeg\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\loaders\jpeg\evas_image_load_jpeg.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/loader_pmaps.vcproj b/win32/vs8/loader_pmaps.vcproj
new file mode 100644 (file)
index 0000000..c18f46d
--- /dev/null
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8.00"\r
+       Name="loader_pmaps"\r
+       ProjectGUID="{73EB3790-3A72-436C-87CD-FE8747198F06}"\r
+       RootNamespace="loader_pmaps"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib"\r
+                               OutputFile="$(OutDir)\loaders\pmaps\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib"\r
+                               OutputFile="$(OutDir)\loaders\pmaps\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\loaders\pmaps\evas_image_load_pmaps.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/loader_png.vcproj b/win32/vs8/loader_png.vcproj
new file mode 100644 (file)
index 0000000..389a005
--- /dev/null
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8,00"\r
+       Name="loader_png"\r
+       ProjectGUID="{866F2513-EEE6-4BD7-9C3E-1FF83682424A}"\r
+       RootNamespace="loader_png"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libpng.lib"\r
+                               OutputFile="$(OutDir)\loaders\png\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libpng.lib"\r
+                               OutputFile="$(OutDir)\loaders\png\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\loaders\png\evas_image_load_png.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/loader_tiff.vcproj b/win32/vs8/loader_tiff.vcproj
new file mode 100644 (file)
index 0000000..0dd15a2
--- /dev/null
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8.00"\r
+       Name="loader_tiff"\r
+       ProjectGUID="{94C11E2D-6DA2-4CB9-AC08-4068A660C8C9}"\r
+       RootNamespace="loader_tiff"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib libtiff.dll.a"\r
+                               OutputFile="$(OutDir)\loaders\tiff\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib libtiff.dll.a"\r
+                               OutputFile="$(OutDir)\loaders\tiff\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\loaders\tiff\evas_image_load_tiff.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/loader_xpm.vcproj b/win32/vs8/loader_xpm.vcproj
new file mode 100644 (file)
index 0000000..26b881f
--- /dev/null
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8.00"\r
+       Name="loader_xpm"\r
+       ProjectGUID="{9063A709-C228-4CA1-822B-75A51F38817F}"\r
+       RootNamespace="loader_xpm"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__=;_CRT_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\loaders\xpm\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__=;_CRT_SECURE_NO_WARNINGS"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\loaders\xpm\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\loaders\xpm\evas_image_load_xpm.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/modules.sln b/win32/vs8/modules.sln
new file mode 100644 (file)
index 0000000..e4fabf2
--- /dev/null
@@ -0,0 +1,110 @@
+\r
+Microsoft Visual Studio Solution File, Format Version 9.00\r
+# Visual Studio 2005\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine_direct3d", "engine_direct3d.vcproj", "{689B4F2B-666D-439F-9BF3-1203D813DE3F}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine_buffer", "engine_buffer.vcproj", "{FF8981EF-618E-45B9-9F03-738D7E2914AF}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine_software_win32_gdi", "engine_software_win32_gdi.vcproj", "{3367A64F-A08E-4F27-8303-54A3BBB01D5A}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine_software_generic", "engine_software_generic.vcproj", "{1E24C1AF-62F2-4EC0-AD94-7363C0534E36}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine_gl_glew", "engine_gl_glew.vcproj", "{38C9AD78-8461-4A33-A31B-7DA62AB3BBE9}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine_software_ddraw", "engine_software_ddraw.vcproj", "{C71D20DF-3BAB-4BFF-80D4-508E7548358B}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader_eet", "loader_eet.vcproj", "{EB7D2089-3FDB-40F4-B90C-716752FFF786}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader_gif", "loader_gif.vcproj", "{C3534833-592F-4450-911E-9C35E205D488}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader_jpeg", "loader_jpeg.vcproj", "{EAC1F90F-87EC-4E3F-8924-0F67FA2302CC}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader_pmaps", "loader_pmaps.vcproj", "{73EB3790-3A72-436C-87CD-FE8747198F06}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader_png", "loader_png.vcproj", "{866F2513-EEE6-4BD7-9C3E-1FF83682424A}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader_tiff", "loader_tiff.vcproj", "{94C11E2D-6DA2-4CB9-AC08-4068A660C8C9}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader_xpm", "loader_xpm.vcproj", "{9063A709-C228-4CA1-822B-75A51F38817F}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "saver_eet", "saver_eet.vcproj", "{9BF0AB1E-3B95-45BC-BDFB-5C2879577A1E}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "saver_png", "saver_png.vcproj", "{455EB58B-C65C-4793-841A-22C62D58ADD5}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "saver_tiff", "saver_tiff.vcproj", "{9BC8E8CC-955C-4D41-91D4-BADBB87830AF}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|Win32 = Debug|Win32\r
+               Release|Win32 = Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F}.Debug|Win32.Build.0 = Debug|Win32\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F}.Release|Win32.ActiveCfg = Release|Win32\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F}.Release|Win32.Build.0 = Release|Win32\r
+               {FF8981EF-618E-45B9-9F03-738D7E2914AF}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {FF8981EF-618E-45B9-9F03-738D7E2914AF}.Debug|Win32.Build.0 = Debug|Win32\r
+               {FF8981EF-618E-45B9-9F03-738D7E2914AF}.Release|Win32.ActiveCfg = Release|Win32\r
+               {FF8981EF-618E-45B9-9F03-738D7E2914AF}.Release|Win32.Build.0 = Release|Win32\r
+               {3367A64F-A08E-4F27-8303-54A3BBB01D5A}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {3367A64F-A08E-4F27-8303-54A3BBB01D5A}.Debug|Win32.Build.0 = Debug|Win32\r
+               {3367A64F-A08E-4F27-8303-54A3BBB01D5A}.Release|Win32.ActiveCfg = Release|Win32\r
+               {3367A64F-A08E-4F27-8303-54A3BBB01D5A}.Release|Win32.Build.0 = Release|Win32\r
+               {1E24C1AF-62F2-4EC0-AD94-7363C0534E36}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {1E24C1AF-62F2-4EC0-AD94-7363C0534E36}.Debug|Win32.Build.0 = Debug|Win32\r
+               {1E24C1AF-62F2-4EC0-AD94-7363C0534E36}.Release|Win32.ActiveCfg = Release|Win32\r
+               {1E24C1AF-62F2-4EC0-AD94-7363C0534E36}.Release|Win32.Build.0 = Release|Win32\r
+               {38C9AD78-8461-4A33-A31B-7DA62AB3BBE9}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {38C9AD78-8461-4A33-A31B-7DA62AB3BBE9}.Debug|Win32.Build.0 = Debug|Win32\r
+               {38C9AD78-8461-4A33-A31B-7DA62AB3BBE9}.Release|Win32.ActiveCfg = Release|Win32\r
+               {38C9AD78-8461-4A33-A31B-7DA62AB3BBE9}.Release|Win32.Build.0 = Release|Win32\r
+               {C71D20DF-3BAB-4BFF-80D4-508E7548358B}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {C71D20DF-3BAB-4BFF-80D4-508E7548358B}.Debug|Win32.Build.0 = Debug|Win32\r
+               {C71D20DF-3BAB-4BFF-80D4-508E7548358B}.Release|Win32.ActiveCfg = Release|Win32\r
+               {C71D20DF-3BAB-4BFF-80D4-508E7548358B}.Release|Win32.Build.0 = Release|Win32\r
+               {EB7D2089-3FDB-40F4-B90C-716752FFF786}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {EB7D2089-3FDB-40F4-B90C-716752FFF786}.Debug|Win32.Build.0 = Debug|Win32\r
+               {EB7D2089-3FDB-40F4-B90C-716752FFF786}.Release|Win32.ActiveCfg = Release|Win32\r
+               {EB7D2089-3FDB-40F4-B90C-716752FFF786}.Release|Win32.Build.0 = Release|Win32\r
+               {C3534833-592F-4450-911E-9C35E205D488}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {C3534833-592F-4450-911E-9C35E205D488}.Debug|Win32.Build.0 = Debug|Win32\r
+               {C3534833-592F-4450-911E-9C35E205D488}.Release|Win32.ActiveCfg = Release|Win32\r
+               {C3534833-592F-4450-911E-9C35E205D488}.Release|Win32.Build.0 = Release|Win32\r
+               {EAC1F90F-87EC-4E3F-8924-0F67FA2302CC}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {EAC1F90F-87EC-4E3F-8924-0F67FA2302CC}.Debug|Win32.Build.0 = Debug|Win32\r
+               {EAC1F90F-87EC-4E3F-8924-0F67FA2302CC}.Release|Win32.ActiveCfg = Release|Win32\r
+               {EAC1F90F-87EC-4E3F-8924-0F67FA2302CC}.Release|Win32.Build.0 = Release|Win32\r
+               {73EB3790-3A72-436C-87CD-FE8747198F06}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {73EB3790-3A72-436C-87CD-FE8747198F06}.Debug|Win32.Build.0 = Debug|Win32\r
+               {73EB3790-3A72-436C-87CD-FE8747198F06}.Release|Win32.ActiveCfg = Release|Win32\r
+               {73EB3790-3A72-436C-87CD-FE8747198F06}.Release|Win32.Build.0 = Release|Win32\r
+               {866F2513-EEE6-4BD7-9C3E-1FF83682424A}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {866F2513-EEE6-4BD7-9C3E-1FF83682424A}.Debug|Win32.Build.0 = Debug|Win32\r
+               {866F2513-EEE6-4BD7-9C3E-1FF83682424A}.Release|Win32.ActiveCfg = Release|Win32\r
+               {866F2513-EEE6-4BD7-9C3E-1FF83682424A}.Release|Win32.Build.0 = Release|Win32\r
+               {94C11E2D-6DA2-4CB9-AC08-4068A660C8C9}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {94C11E2D-6DA2-4CB9-AC08-4068A660C8C9}.Debug|Win32.Build.0 = Debug|Win32\r
+               {94C11E2D-6DA2-4CB9-AC08-4068A660C8C9}.Release|Win32.ActiveCfg = Release|Win32\r
+               {94C11E2D-6DA2-4CB9-AC08-4068A660C8C9}.Release|Win32.Build.0 = Release|Win32\r
+               {9063A709-C228-4CA1-822B-75A51F38817F}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {9063A709-C228-4CA1-822B-75A51F38817F}.Debug|Win32.Build.0 = Debug|Win32\r
+               {9063A709-C228-4CA1-822B-75A51F38817F}.Release|Win32.ActiveCfg = Release|Win32\r
+               {9063A709-C228-4CA1-822B-75A51F38817F}.Release|Win32.Build.0 = Release|Win32\r
+               {9BF0AB1E-3B95-45BC-BDFB-5C2879577A1E}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {9BF0AB1E-3B95-45BC-BDFB-5C2879577A1E}.Debug|Win32.Build.0 = Debug|Win32\r
+               {9BF0AB1E-3B95-45BC-BDFB-5C2879577A1E}.Release|Win32.ActiveCfg = Release|Win32\r
+               {9BF0AB1E-3B95-45BC-BDFB-5C2879577A1E}.Release|Win32.Build.0 = Release|Win32\r
+               {455EB58B-C65C-4793-841A-22C62D58ADD5}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {455EB58B-C65C-4793-841A-22C62D58ADD5}.Debug|Win32.Build.0 = Debug|Win32\r
+               {455EB58B-C65C-4793-841A-22C62D58ADD5}.Release|Win32.ActiveCfg = Release|Win32\r
+               {455EB58B-C65C-4793-841A-22C62D58ADD5}.Release|Win32.Build.0 = Release|Win32\r
+               {9BC8E8CC-955C-4D41-91D4-BADBB87830AF}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {9BC8E8CC-955C-4D41-91D4-BADBB87830AF}.Debug|Win32.Build.0 = Debug|Win32\r
+               {9BC8E8CC-955C-4D41-91D4-BADBB87830AF}.Release|Win32.ActiveCfg = Release|Win32\r
+               {9BC8E8CC-955C-4D41-91D4-BADBB87830AF}.Release|Win32.Build.0 = Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/win32/vs8/saver_eet.vcproj b/win32/vs8/saver_eet.vcproj
new file mode 100644 (file)
index 0000000..aaa46b8
--- /dev/null
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8,00"\r
+       Name="saver_eet"\r
+       ProjectGUID="{9BF0AB1E-3B95-45BC-BDFB-5C2879577A1E}"\r
+       RootNamespace="saver_eet"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeet.lib"\r
+                               OutputFile="$(OutDir)\savers\eet\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeet.lib"\r
+                               OutputFile="$(OutDir)\savers\eet\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\savers\eet\evas_image_save_eet.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/saver_png.vcproj b/win32/vs8/saver_png.vcproj
new file mode 100644 (file)
index 0000000..a2e866a
--- /dev/null
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8,00"\r
+       Name="saver_png"\r
+       ProjectGUID="{455EB58B-C65C-4793-841A-22C62D58ADD5}"\r
+       RootNamespace="saver_png"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libpng.lib"\r
+                               OutputFile="$(OutDir)\savers\png\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libpng.lib"\r
+                               OutputFile="$(OutDir)\savers\png\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\savers\png\evas_image_save_png.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/saver_tiff.vcproj b/win32/vs8/saver_tiff.vcproj
new file mode 100644 (file)
index 0000000..531ec2c
--- /dev/null
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8,00"\r
+       Name="saver_tiff"\r
+       ProjectGUID="{9BC8E8CC-955C-4D41-91D4-BADBB87830AF}"\r
+       RootNamespace="saver_tiff"\r
+       Keyword="Win32Proj"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libtiff.dll.a"\r
+                               OutputFile="$(OutDir)\savers\tiff\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libtiff.dll.a"\r
+                               OutputFile="$(OutDir)\savers\tiff\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\savers\tiff\evas_image_save_tiff.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs8/start.bat b/win32/vs8/start.bat
new file mode 100644 (file)
index 0000000..5f6b049
--- /dev/null
@@ -0,0 +1,35 @@
+@echo off\r
+rem Warning: environment is set for Win32 platform.\r
+\r
+set PROJECT_TYPE=vs8\r
+\r
+pushd ..\r
+call set_env.bat\r
+popd\r
+\r
+if "%EXT_DIR%" == "" goto END\r
+\r
+rem Setup common Win32 environment variables\r
+\r
+set SolutionDirectory=%cd%\r
+set DebugOutputDirectory=%SolutionDirectory%\out\r
+set ReleaseOutputDirectory=%SolutionDirectory%\out\r
+set DebugLibraryDirectory=%SolutionDirectory%\out\r
+set ReleaseLibraryDirectory=%SolutionDirectory%\out\r
+set TemporaryDirectory=%SolutionDirectory%\temp\r
+\r
+set LIB=%DebugLibraryDirectory%;%ReleaseLibraryDirectory%;%LIB%\r
+\r
+rem Check for basic requirements\r
+if "%VS80COMNTOOLS%" == "" (\r
+       echo ERROR: Microsoft Visual Studio 2005 is not installed.\r
+       pause\r
+       goto END\r
+)\r
+\r
+rem Setting environment for using Microsoft Visual Studio 2005 x86 tools.\r
+call "%VS80COMNTOOLS%vsvars32.bat"\r
+\r
+evas.sln\r
+\r
+:END
\ No newline at end of file
diff --git a/win32/vs8/start_modules.bat b/win32/vs8/start_modules.bat
new file mode 100644 (file)
index 0000000..067d810
--- /dev/null
@@ -0,0 +1,35 @@
+@echo off\r
+rem Warning: environment is set for Win32 platform.\r
+\r
+set PROJECT_TYPE=vs8\r
+\r
+pushd ..\r
+call set_env.bat\r
+popd\r
+\r
+if "%EXT_DIR%" == "" goto END\r
+\r
+rem Setup common Win32 environment variables\r
+\r
+set SolutionDirectory=%cd%\r
+set DebugOutputDirectory=%SolutionDirectory%\out\modules\r
+set ReleaseOutputDirectory=%SolutionDirectory%\out\modules\r
+set DebugLibraryDirectory=%SolutionDirectory%\out\modules\r
+set ReleaseLibraryDirectory=%SolutionDirectory%\out\modules\r
+set TemporaryDirectory=%SolutionDirectory%\temp\r
+\r
+set LIB=%DebugLibraryDirectory%\..;%DebugLibraryDirectory%;%ReleaseLibraryDirectory%;%LIB%\r
+\r
+rem Check for basic requirements\r
+if "%VS80COMNTOOLS%" == "" (\r
+       echo ERROR: Microsoft Visual Studio 2005 is not installed.\r
+       pause\r
+       goto END\r
+)\r
+\r
+rem Setting environment for using Microsoft Visual Studio 2005 x86 tools.\r
+call "%VS80COMNTOOLS%vsvars32.bat"\r
+\r
+modules.sln\r
+\r
+:END
\ No newline at end of file
diff --git a/win32/vs9/engine_buffer.vcproj b/win32/vs9/engine_buffer.vcproj
new file mode 100644 (file)
index 0000000..1d3c770
--- /dev/null
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="engine_buffer"\r
+       ProjectGUID="{FF8981EF-618E-45B9-9F03-738D7E2914AF}"\r
+       RootNamespace="engine_buffer"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\engines\buffer\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=stricmp"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\engines\buffer\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\buffer\evas_engine.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\buffer\Evas_Engine_Buffer.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\buffer\evas_engine.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\buffer\evas_outbuf.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs9/engine_software_gdi.vcproj b/win32/vs9/engine_software_gdi.vcproj
new file mode 100644 (file)
index 0000000..1c50fa0
--- /dev/null
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="engine_software_gdi"\r
+       ProjectGUID="{3367A64F-A08E-4F27-8303-54A3BBB01D5A}"\r
+       RootNamespace="engine_software_gdi"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib gdi32.lib user32.lib"\r
+                               OutputFile="$(OutDir)\engines\software_gdi\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=stricmp"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib gdi32.lib user32.lib"\r
+                               OutputFile="$(OutDir)\engines\software_gdi\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_gdi\evas_engine.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_gdi\Evas_Engine_Software_GDI.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_gdi\evas_engine.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_gdi\evas_gdi_buffer.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_gdi\evas_gdi_main.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_gdi\evas_outbuf.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs9/engine_software_generic.vcproj b/win32/vs9/engine_software_generic.vcproj
new file mode 100644 (file)
index 0000000..bc03326
--- /dev/null
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="engine_software_generic"\r
+       ProjectGUID="{1E24C1AF-62F2-4EC0-AD94-7363C0534E36}"\r
+       RootNamespace="engine_software_generic"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\engines\software_generic\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=stricmp"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\engines\software_generic\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\engines\software_generic\evas_engine.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs9/evas.sln b/win32/vs9/evas.sln
new file mode 100644 (file)
index 0000000..d8b373e
--- /dev/null
@@ -0,0 +1,124 @@
+\r
+Microsoft Visual Studio Solution File, Format Version 10.00\r
+# Visual C++ Express 2008\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libevas", "libevas.vcproj", "{689B4F2B-666D-439F-9BF3-1203D813DE3F}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine_buffer", "engine_buffer.vcproj", "{FF8981EF-618E-45B9-9F03-738D7E2914AF}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F} = {689B4F2B-666D-439F-9BF3-1203D813DE3F}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine_software_gdi", "engine_software_gdi.vcproj", "{3367A64F-A08E-4F27-8303-54A3BBB01D5A}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {1E24C1AF-62F2-4EC0-AD94-7363C0534E36} = {1E24C1AF-62F2-4EC0-AD94-7363C0534E36}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine_software_generic", "engine_software_generic.vcproj", "{1E24C1AF-62F2-4EC0-AD94-7363C0534E36}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F} = {689B4F2B-666D-439F-9BF3-1203D813DE3F}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader_eet", "loader_eet.vcproj", "{EB7D2089-3FDB-40F4-B90C-716752FFF786}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F} = {689B4F2B-666D-439F-9BF3-1203D813DE3F}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader_gif", "loader_gif.vcproj", "{C3534833-592F-4450-911E-9C35E205D488}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F} = {689B4F2B-666D-439F-9BF3-1203D813DE3F}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader_jpeg", "loader_jpeg.vcproj", "{EAC1F90F-87EC-4E3F-8924-0F67FA2302CC}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F} = {689B4F2B-666D-439F-9BF3-1203D813DE3F}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader_pmaps", "loader_pmaps.vcproj", "{73EB3790-3A72-436C-87CD-FE8747198F06}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F} = {689B4F2B-666D-439F-9BF3-1203D813DE3F}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader_png", "loader_png.vcproj", "{866F2513-EEE6-4BD7-9C3E-1FF83682424A}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F} = {689B4F2B-666D-439F-9BF3-1203D813DE3F}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader_tiff", "loader_tiff.vcproj", "{94C11E2D-6DA2-4CB9-AC08-4068A660C8C9}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F} = {689B4F2B-666D-439F-9BF3-1203D813DE3F}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader_xpm", "loader_xpm.vcproj", "{9063A709-C228-4CA1-822B-75A51F38817F}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F} = {689B4F2B-666D-439F-9BF3-1203D813DE3F}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "saver_eet", "saver_eet.vcproj", "{9BF0AB1E-3B95-45BC-BDFB-5C2879577A1E}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F} = {689B4F2B-666D-439F-9BF3-1203D813DE3F}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "saver_png", "saver_png.vcproj", "{455EB58B-C65C-4793-841A-22C62D58ADD5}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F} = {689B4F2B-666D-439F-9BF3-1203D813DE3F}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "saver_tiff", "saver_tiff.vcproj", "{9BC8E8CC-955C-4D41-91D4-BADBB87830AF}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F} = {689B4F2B-666D-439F-9BF3-1203D813DE3F}\r
+       EndProjectSection\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|Win32 = Debug|Win32\r
+               Release|Win32 = Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F}.Debug|Win32.Build.0 = Debug|Win32\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F}.Release|Win32.ActiveCfg = Release|Win32\r
+               {689B4F2B-666D-439F-9BF3-1203D813DE3F}.Release|Win32.Build.0 = Release|Win32\r
+               {FF8981EF-618E-45B9-9F03-738D7E2914AF}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {FF8981EF-618E-45B9-9F03-738D7E2914AF}.Debug|Win32.Build.0 = Debug|Win32\r
+               {FF8981EF-618E-45B9-9F03-738D7E2914AF}.Release|Win32.ActiveCfg = Release|Win32\r
+               {3367A64F-A08E-4F27-8303-54A3BBB01D5A}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {3367A64F-A08E-4F27-8303-54A3BBB01D5A}.Debug|Win32.Build.0 = Debug|Win32\r
+               {3367A64F-A08E-4F27-8303-54A3BBB01D5A}.Release|Win32.ActiveCfg = Release|Win32\r
+               {1E24C1AF-62F2-4EC0-AD94-7363C0534E36}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {1E24C1AF-62F2-4EC0-AD94-7363C0534E36}.Debug|Win32.Build.0 = Debug|Win32\r
+               {1E24C1AF-62F2-4EC0-AD94-7363C0534E36}.Release|Win32.ActiveCfg = Release|Win32\r
+               {EB7D2089-3FDB-40F4-B90C-716752FFF786}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {EB7D2089-3FDB-40F4-B90C-716752FFF786}.Debug|Win32.Build.0 = Debug|Win32\r
+               {EB7D2089-3FDB-40F4-B90C-716752FFF786}.Release|Win32.ActiveCfg = Release|Win32\r
+               {C3534833-592F-4450-911E-9C35E205D488}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {C3534833-592F-4450-911E-9C35E205D488}.Debug|Win32.Build.0 = Debug|Win32\r
+               {C3534833-592F-4450-911E-9C35E205D488}.Release|Win32.ActiveCfg = Release|Win32\r
+               {EAC1F90F-87EC-4E3F-8924-0F67FA2302CC}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {EAC1F90F-87EC-4E3F-8924-0F67FA2302CC}.Debug|Win32.Build.0 = Debug|Win32\r
+               {EAC1F90F-87EC-4E3F-8924-0F67FA2302CC}.Release|Win32.ActiveCfg = Release|Win32\r
+               {73EB3790-3A72-436C-87CD-FE8747198F06}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {73EB3790-3A72-436C-87CD-FE8747198F06}.Debug|Win32.Build.0 = Debug|Win32\r
+               {73EB3790-3A72-436C-87CD-FE8747198F06}.Release|Win32.ActiveCfg = Release|Win32\r
+               {866F2513-EEE6-4BD7-9C3E-1FF83682424A}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {866F2513-EEE6-4BD7-9C3E-1FF83682424A}.Debug|Win32.Build.0 = Debug|Win32\r
+               {866F2513-EEE6-4BD7-9C3E-1FF83682424A}.Release|Win32.ActiveCfg = Release|Win32\r
+               {94C11E2D-6DA2-4CB9-AC08-4068A660C8C9}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {94C11E2D-6DA2-4CB9-AC08-4068A660C8C9}.Debug|Win32.Build.0 = Debug|Win32\r
+               {94C11E2D-6DA2-4CB9-AC08-4068A660C8C9}.Release|Win32.ActiveCfg = Release|Win32\r
+               {9063A709-C228-4CA1-822B-75A51F38817F}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {9063A709-C228-4CA1-822B-75A51F38817F}.Debug|Win32.Build.0 = Debug|Win32\r
+               {9063A709-C228-4CA1-822B-75A51F38817F}.Release|Win32.ActiveCfg = Release|Win32\r
+               {9BF0AB1E-3B95-45BC-BDFB-5C2879577A1E}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {9BF0AB1E-3B95-45BC-BDFB-5C2879577A1E}.Debug|Win32.Build.0 = Debug|Win32\r
+               {9BF0AB1E-3B95-45BC-BDFB-5C2879577A1E}.Release|Win32.ActiveCfg = Release|Win32\r
+               {455EB58B-C65C-4793-841A-22C62D58ADD5}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {455EB58B-C65C-4793-841A-22C62D58ADD5}.Debug|Win32.Build.0 = Debug|Win32\r
+               {455EB58B-C65C-4793-841A-22C62D58ADD5}.Release|Win32.ActiveCfg = Release|Win32\r
+               {9BC8E8CC-955C-4D41-91D4-BADBB87830AF}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {9BC8E8CC-955C-4D41-91D4-BADBB87830AF}.Debug|Win32.Build.0 = Debug|Win32\r
+               {9BC8E8CC-955C-4D41-91D4-BADBB87830AF}.Release|Win32.ActiveCfg = Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/win32/vs9/libevas.vcproj b/win32/vs9/libevas.vcproj
new file mode 100644 (file)
index 0000000..1e307a7
--- /dev/null
@@ -0,0 +1,968 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="libevas"\r
+       ProjectGUID="{689B4F2B-666D-439F-9BF3-1203D813DE3F}"\r
+       RootNamespace="libevas"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;_USE_MATH_DEFINES;__UNUSED__=;_CRT_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libeet.lib libevil.lib libdl.lib freetype.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\libevas.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=stricmp;_USE_MATH_DEFINES;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libeet.lib libevil.lib libdl.lib freetype.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\libevas.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="cache"\r
+                       >\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                               >\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\cache\evas_cache_engine_image.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\cache\evas_cache_image.c"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="libevas"\r
+                       >\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                               UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\Evas.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_blend_ops.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_cairo_common.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_common.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_common_soft16.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_macros.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_mmx.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_options.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\include\evas_private.h"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Resource Files"\r
+                               Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                               UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                               >\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                               UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\main.c"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="canvas"\r
+                       >\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               >\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_async_events.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_callbacks.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_clip.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_data.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_events.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_focus.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_font_dir.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_key.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_key_grab.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_layer.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_map.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_name.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_gradient.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_image.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_inform.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_intercept.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_line.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_polygon.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_rectangle.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_smart.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_text.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_object_textblock.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_rectangle.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_render.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_smart.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\canvas\evas_stack.c"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="file"\r
+                       >\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               >\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\file\evas_module.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\file\evas_path.c"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="imaging"\r
+                       >\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               >\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\imaging\evas_imaging.c"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="engines"\r
+                       >\r
+                       <Filter\r
+                               Name="common"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_blend_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_blit_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_color.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_colorspace.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_gry_1.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_gry_4.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_gry_8.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_rgb_16.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_rgb_24.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_rgb_32.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_rgb_8.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_convert_yuv.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_cpu.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_draw_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_font_draw.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_font_load.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_font_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_font_query.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient2_linear.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient2_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient2_radial.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient_angular.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient_linear.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient_radial.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient_rectangular.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_gradient_sinusoidal.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_image_data.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_image_fill_main.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_image_load.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_image_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_image_save.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_image_scalecache.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_line_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_map_image.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_op_add_main_.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_op_blend_main_.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_op_copy_main_.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_op_mask_main_.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_op_mul_main_.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_op_sub_main_.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_pipe.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_polygon_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_rectangle_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_regionbuf.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_main.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_sample.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth_scaler.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth_scaler_down.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth_scaler_downx.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth_scaler_downx_downy.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth_scaler_downy.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth_scaler_noscale.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_smooth_scaler_up.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_scale_span.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common\evas_tiler.c"\r
+                                       >\r
+                               </File>\r
+                               <Filter\r
+                                       Name="evas_op_add"\r
+                                       >\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="evas_op_blend"\r
+                                       >\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="evas_op_copy"\r
+                                       >\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="evas_op_mask"\r
+                                       >\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="evas_op_mul"\r
+                                       >\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="evas_op_sub"\r
+                                       >\r
+                               </Filter>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="common_16"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_dither_mask.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_font.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_image_scaled_sampled.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_image_unscaled.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_line.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_main.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_polygon.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_rectangle.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_scanline_blend.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\src\lib\engines\common_16\evas_soft16_scanline_fill.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               ExcludedFromBuild="true"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs9/loader_eet.vcproj b/win32/vs9/loader_eet.vcproj
new file mode 100644 (file)
index 0000000..10cea8c
--- /dev/null
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="loader_eet"\r
+       ProjectGUID="{EB7D2089-3FDB-40F4-B90C-716752FFF786}"\r
+       RootNamespace="loader_eet"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=stricmp"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeet.lib"\r
+                               OutputFile="$(OutDir)\loaders\eet\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=stricmp"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeet.lib"\r
+                               OutputFile="$(OutDir)\loaders\eet\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\loaders\eet\evas_image_load_eet.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs9/loader_gif.vcproj b/win32/vs9/loader_gif.vcproj
new file mode 100644 (file)
index 0000000..d801163
--- /dev/null
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="loader_gif"\r
+       ProjectGUID="{C3534833-592F-4450-911E-9C35E205D488}"\r
+       RootNamespace="loader_gif"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libungif.lib"\r
+                               OutputFile="$(OutDir)\loaders\gif\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libungif.lib"\r
+                               OutputFile="$(OutDir)\loaders\gif\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\loaders\gif\evas_image_load_gif.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs9/loader_jpeg.vcproj b/win32/vs9/loader_jpeg.vcproj
new file mode 100644 (file)
index 0000000..a2d2fa8
--- /dev/null
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="loader_jpeg"\r
+       ProjectGUID="{EAC1F90F-87EC-4E3F-8924-0F67FA2302CC}"\r
+       RootNamespace="loader_jpeg"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib jpeg.lib"\r
+                               OutputFile="$(OutDir)\loaders\jpeg\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib jpeg.lib"\r
+                               OutputFile="$(OutDir)\loaders\jpeg\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\loaders\jpeg\evas_image_load_jpeg.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs9/loader_pmaps.vcproj b/win32/vs9/loader_pmaps.vcproj
new file mode 100644 (file)
index 0000000..075bd38
--- /dev/null
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="loader_pmaps"\r
+       ProjectGUID="{73EB3790-3A72-436C-87CD-FE8747198F06}"\r
+       RootNamespace="loader_pmaps"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib"\r
+                               OutputFile="$(OutDir)\loaders\pmaps\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib"\r
+                               OutputFile="$(OutDir)\loaders\pmaps\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\loaders\pmaps\evas_image_load_pmaps.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs9/loader_png.vcproj b/win32/vs9/loader_png.vcproj
new file mode 100644 (file)
index 0000000..9a02b8c
--- /dev/null
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="loader_png"\r
+       ProjectGUID="{866F2513-EEE6-4BD7-9C3E-1FF83682424A}"\r
+       RootNamespace="loader_png"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libpng.lib"\r
+                               OutputFile="$(OutDir)\loaders\png\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libpng.lib"\r
+                               OutputFile="$(OutDir)\loaders\png\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\loaders\png\evas_image_load_png.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs9/loader_tiff.vcproj b/win32/vs9/loader_tiff.vcproj
new file mode 100644 (file)
index 0000000..9a998e7
--- /dev/null
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="loader_tiff"\r
+       ProjectGUID="{94C11E2D-6DA2-4CB9-AC08-4068A660C8C9}"\r
+       RootNamespace="loader_tiff"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib libtiff.dll.a"\r
+                               OutputFile="$(OutDir)\loaders\tiff\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib libtiff.dll.a"\r
+                               OutputFile="$(OutDir)\loaders\tiff\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\loaders\tiff\evas_image_load_tiff.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs9/loader_xpm.vcproj b/win32/vs9/loader_xpm.vcproj
new file mode 100644 (file)
index 0000000..797be84
--- /dev/null
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="loader_xpm"\r
+       ProjectGUID="{9063A709-C228-4CA1-822B-75A51F38817F}"\r
+       RootNamespace="loader_xpm"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__=;_CRT_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\loaders\xpm\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__=;_CRT_SECURE_NO_WARNINGS"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeina.lib"\r
+                               OutputFile="$(OutDir)\loaders\xpm\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\loaders\xpm\evas_image_load_xpm.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs9/saver_eet.vcproj b/win32/vs9/saver_eet.vcproj
new file mode 100644 (file)
index 0000000..5d8fce1
--- /dev/null
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="saver_eet"\r
+       ProjectGUID="{9BF0AB1E-3B95-45BC-BDFB-5C2879577A1E}"\r
+       RootNamespace="saver_eet"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=stricmp"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeet.lib"\r
+                               OutputFile="$(OutDir)\savers\eet\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=stricmp"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libeet.lib"\r
+                               OutputFile="$(OutDir)\savers\eet\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\savers\eet\evas_image_save_eet.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs9/saver_png.vcproj b/win32/vs9/saver_png.vcproj
new file mode 100644 (file)
index 0000000..283d687
--- /dev/null
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="saver_png"\r
+       ProjectGUID="{455EB58B-C65C-4793-841A-22C62D58ADD5}"\r
+       RootNamespace="saver_png"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libpng.lib"\r
+                               OutputFile="$(OutDir)\savers\png\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libpng.lib"\r
+                               OutputFile="$(OutDir)\savers\png\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\savers\png\evas_image_save_png.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs9/saver_tiff.vcproj b/win32/vs9/saver_tiff.vcproj
new file mode 100644 (file)
index 0000000..b7d2e31
--- /dev/null
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="saver_tiff"\r
+       ProjectGUID="{9BC8E8CC-955C-4D41-91D4-BADBB87830AF}"\r
+       RootNamespace="saver_tiff"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(DebugOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libtiff.dll.a"\r
+                               OutputFile="$(OutDir)\savers\tiff\module.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="$(LIB); $(DebugLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(ReleaseOutputDirectory)"\r
+                       IntermediateDirectory="$(TemporaryDirectory)\$(ProjectName)\$(TargetName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="$(INCLUDE)"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EFL_EVAS_BUILD;DLL_EXPORT;__CRT_INLINE=__inline;inline=__inline;HAVE_CONFIG_H;snprintf=_snprintf_c;strcasecmp=_stricmp;__UNUSED__="\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="true"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               IgnoreImportLibrary="false"\r
+                               LinkLibraryDependencies="true"\r
+                               UseLibraryDependencyInputs="false"\r
+                               AdditionalDependencies="libevas.lib libtiff.dll.a"\r
+                               OutputFile="$(OutDir)\savers\tiff\module.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="$(LIB); $(ReleaseLibraryDirectory)"\r
+                               AddModuleNamesToAssembly=""\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\src\modules\savers\tiff\evas_image_save_tiff.c"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/win32/vs9/start.bat b/win32/vs9/start.bat
new file mode 100755 (executable)
index 0000000..5f6b049
--- /dev/null
@@ -0,0 +1,35 @@
+@echo off\r
+rem Warning: environment is set for Win32 platform.\r
+\r
+set PROJECT_TYPE=vs8\r
+\r
+pushd ..\r
+call set_env.bat\r
+popd\r
+\r
+if "%EXT_DIR%" == "" goto END\r
+\r
+rem Setup common Win32 environment variables\r
+\r
+set SolutionDirectory=%cd%\r
+set DebugOutputDirectory=%SolutionDirectory%\out\r
+set ReleaseOutputDirectory=%SolutionDirectory%\out\r
+set DebugLibraryDirectory=%SolutionDirectory%\out\r
+set ReleaseLibraryDirectory=%SolutionDirectory%\out\r
+set TemporaryDirectory=%SolutionDirectory%\temp\r
+\r
+set LIB=%DebugLibraryDirectory%;%ReleaseLibraryDirectory%;%LIB%\r
+\r
+rem Check for basic requirements\r
+if "%VS80COMNTOOLS%" == "" (\r
+       echo ERROR: Microsoft Visual Studio 2005 is not installed.\r
+       pause\r
+       goto END\r
+)\r
+\r
+rem Setting environment for using Microsoft Visual Studio 2005 x86 tools.\r
+call "%VS80COMNTOOLS%vsvars32.bat"\r
+\r
+evas.sln\r
+\r
+:END
\ No newline at end of file